From 5392f7a3b05e515b403e314aa8f0a40d91135d5d Mon Sep 17 00:00:00 2001 From: LiteSpeed Tech Date: Wed, 11 Sep 2019 11:27:58 -0400 Subject: [PATCH] Release 2.2.0: server included, ID-22 supported (#76) --- .cirrus.yml | 3 + .gitmodules | 4 + .travis.yml | 3 + APIs.txt | 3 + CHANGELOG | 5 + CMakeLists.txt | 21 +- EXAMPLES.txt | 123 +- README.md | 60 +- include/lsquic.h | 600 +- include/lsquic_types.h | 22 +- patches/boringssl-meds.patch | 73 + src/liblsquic/CMakeLists.txt | 128 +- src/liblsquic/gen-verstrs | 122 + src/liblsquic/ls-qpack | 1 + src/liblsquic/lsquic_alarmset.c | 29 +- src/liblsquic/lsquic_alarmset.h | 38 +- src/liblsquic/lsquic_attq.c | 4 +- src/liblsquic/lsquic_bbr.c | 1050 + src/liblsquic/lsquic_bbr.h | 210 + src/liblsquic/lsquic_bw_sampler.c | 273 + src/liblsquic/lsquic_bw_sampler.h | 111 + src/liblsquic/lsquic_byteswap.h | 21 +- src/liblsquic/lsquic_cfcw.c | 5 +- src/liblsquic/lsquic_chsk_stream.c | 32 +- src/liblsquic/lsquic_cong_ctl.h | 68 + src/liblsquic/lsquic_conn.c | 285 +- src/liblsquic/lsquic_conn.h | 256 +- src/liblsquic/lsquic_conn_public.h | 20 +- src/liblsquic/lsquic_crt_compress.c | 233 +- src/liblsquic/lsquic_crt_compress.h | 14 + src/liblsquic/lsquic_crypto.c | 106 +- src/liblsquic/lsquic_crypto.h | 34 +- src/liblsquic/lsquic_cubic.c | 121 +- src/liblsquic/lsquic_cubic.h | 30 +- src/liblsquic/lsquic_data_in_if.h | 15 +- src/liblsquic/lsquic_di_error.c | 16 + src/liblsquic/lsquic_di_hash.c | 47 +- src/liblsquic/lsquic_di_nocopy.c | 56 +- src/liblsquic/lsquic_enc_sess.h | 348 + src/liblsquic/lsquic_enc_sess_common.c | 34 + src/liblsquic/lsquic_enc_sess_ietf.c | 2670 + src/liblsquic/lsquic_eng_hist.c | 1 + src/liblsquic/lsquic_engine.c | 1664 +- src/liblsquic/lsquic_engine_public.h | 42 + src/liblsquic/lsquic_ev_log.c | 283 +- src/liblsquic/lsquic_ev_log.h | 143 +- src/liblsquic/lsquic_frab_list.c | 148 + src/liblsquic/lsquic_frab_list.h | 59 + src/liblsquic/lsquic_frame_reader.c | 17 +- src/liblsquic/lsquic_frame_reader.h | 7 +- src/liblsquic/lsquic_frame_writer.c | 197 +- src/liblsquic/lsquic_frame_writer.h | 18 +- src/liblsquic/lsquic_full_conn.c | 1384 +- src/liblsquic/lsquic_full_conn.h | 50 +- src/liblsquic/lsquic_full_conn_ietf.c | 6976 ++ src/liblsquic/lsquic_global.c | 11 +- src/liblsquic/lsquic_h3_prio.c | 854 + src/liblsquic/lsquic_h3_prio.h | 72 + src/liblsquic/lsquic_handshake.c | 2063 +- src/liblsquic/lsquic_handshake.h | 276 +- src/liblsquic/lsquic_hash.c | 51 +- src/liblsquic/lsquic_hash.h | 20 +- src/liblsquic/lsquic_hcsi_reader.c | 221 + src/liblsquic/lsquic_hcsi_reader.h | 61 + src/liblsquic/lsquic_hcso_writer.c | 367 + src/liblsquic/lsquic_hcso_writer.h | 39 + src/liblsquic/lsquic_headers.h | 6 +- src/liblsquic/lsquic_headers_stream.c | 36 +- src/liblsquic/lsquic_headers_stream.h | 13 +- src/liblsquic/lsquic_hkdf.c | 40 + src/liblsquic/lsquic_hkdf.h | 21 + src/liblsquic/lsquic_hq.c | 94 + src/liblsquic/lsquic_hq.h | 152 + src/liblsquic/lsquic_hspack_valid.c | 163 + src/liblsquic/lsquic_http1x_if.c | 6 +- src/liblsquic/lsquic_http1x_if.h | 5 +- src/liblsquic/lsquic_ietf.h | 28 + src/liblsquic/lsquic_int_types.h | 9 + src/liblsquic/lsquic_logger.c | 238 +- src/liblsquic/lsquic_logger.h | 73 +- src/liblsquic/lsquic_malo.c | 171 +- src/liblsquic/lsquic_malo.h | 8 + src/liblsquic/lsquic_min_heap.c | 1 + src/liblsquic/lsquic_mini_conn.c | 2010 + src/liblsquic/lsquic_mini_conn.h | 158 + src/liblsquic/lsquic_mini_conn_ietf.c | 1462 + src/liblsquic/lsquic_mini_conn_ietf.h | 88 + src/liblsquic/lsquic_minmax.c | 155 + src/liblsquic/lsquic_minmax.h | 44 + src/liblsquic/lsquic_mm.c | 337 +- src/liblsquic/lsquic_mm.h | 26 +- src/liblsquic/lsquic_pacer.c | 30 +- src/liblsquic/lsquic_pacer.h | 15 +- src/liblsquic/lsquic_packet_common.c | 80 +- src/liblsquic/lsquic_packet_common.h | 266 +- src/liblsquic/lsquic_packet_gquic.c | 33 + src/liblsquic/lsquic_packet_gquic.h | 99 + src/liblsquic/lsquic_packet_ietf.h | 23 + src/liblsquic/lsquic_packet_in.c | 9 + src/liblsquic/lsquic_packet_in.h | 68 +- src/liblsquic/lsquic_packet_out.c | 53 +- src/liblsquic/lsquic_packet_out.h | 118 +- src/liblsquic/lsquic_parse.h | 228 +- src/liblsquic/lsquic_parse_Q046.c | 62 +- src/liblsquic/lsquic_parse_common.c | 198 +- src/liblsquic/lsquic_parse_common.h | 69 +- src/liblsquic/lsquic_parse_gquic_be.c | 159 +- src/liblsquic/lsquic_parse_gquic_be.h | 61 +- src/liblsquic/lsquic_parse_gquic_common.c | 143 +- src/liblsquic/lsquic_parse_ietf_v1.c | 1945 + src/liblsquic/lsquic_parse_iquic_common.c | 529 +- src/liblsquic/lsquic_pr_queue.c | 528 + src/liblsquic/lsquic_pr_queue.h | 78 + src/liblsquic/lsquic_purga.c | 277 + src/liblsquic/lsquic_purga.h | 68 + src/liblsquic/lsquic_push_promise.h | 90 + src/liblsquic/lsquic_qdec_hdl.c | 570 + src/liblsquic/lsquic_qdec_hdl.h | 72 + src/liblsquic/lsquic_qenc_hdl.c | 495 + src/liblsquic/lsquic_qenc_hdl.h | 75 + src/liblsquic/lsquic_qlog.c | 14 +- src/liblsquic/lsquic_qlog.h | 14 +- src/liblsquic/lsquic_qpack_dec_logger.h | 19 + src/liblsquic/lsquic_qpack_enc_logger.h | 16 + src/liblsquic/lsquic_rechist.c | 9 +- src/liblsquic/lsquic_rechist.h | 6 +- src/liblsquic/lsquic_rtt.c | 3 + src/liblsquic/lsquic_rtt.h | 3 + src/liblsquic/lsquic_send_ctl.c | 1231 +- src/liblsquic/lsquic_send_ctl.h | 123 +- src/liblsquic/lsquic_senhist.h | 27 +- src/liblsquic/lsquic_sfcw.c | 8 +- src/liblsquic/lsquic_sfcw.h | 4 +- src/liblsquic/lsquic_shsk_stream.c | 99 + src/liblsquic/lsquic_shsk_stream.h | 23 + src/liblsquic/lsquic_sizes.h | 13 + src/liblsquic/lsquic_spi.c | 38 +- src/liblsquic/lsquic_spi.h | 9 +- src/liblsquic/lsquic_stock_shi.c | 208 + src/liblsquic/lsquic_stock_shi.h | 30 + src/liblsquic/lsquic_str.c | 1 + src/liblsquic/lsquic_stream.c | 3226 +- src/liblsquic/lsquic_stream.h | 474 +- src/liblsquic/lsquic_tokgen.c | 250 + src/liblsquic/lsquic_tokgen.h | 25 + src/liblsquic/lsquic_trans_params.c | 528 + src/liblsquic/lsquic_trans_params.h | 149 + src/liblsquic/lsquic_util.c | 51 +- src/liblsquic/lsquic_util.h | 8 +- src/liblsquic/lsquic_varint.c | 192 + src/liblsquic/lsquic_varint.h | 83 + src/liblsquic/lsquic_version.c | 61 +- src/liblsquic/lsquic_version.h | 3 + src/lshpack/lshpack.c | 65768 +++++++++++++++++- src/lshpack/lshpack.h | 2 + test/CMakeLists.txt | 8 +- test/http_client.c | 578 +- test/http_server.c | 1528 + test/prog.c | 266 +- test/prog.h | 36 +- test/test_cert.c | 170 + test/test_cert.h | 28 + test/test_common.c | 921 +- test/test_common.h | 14 +- test/test_config.h.in | 12 + test/unittests/CMakeLists.txt | 57 +- test/unittests/graph_cubic.c | 19 +- test/unittests/mini_parse.c | 111 + test/unittests/test_ack.c | 220 + test/unittests/test_ackgen_gquic_be.c | 26 +- test/unittests/test_ackparse_gquic_be.c | 69 +- test/unittests/test_ackparse_gquic_ietf.c | 455 + test/unittests/test_alarmset.c | 4 +- test/unittests/test_alt_svc_ver.c | 17 + test/unittests/test_attq.c | 2 + test/unittests/test_blocked_gquic_be.c | 11 +- test/unittests/test_bw_sampler.c | 641 + test/unittests/test_chlo_gen.c | 72 + test/unittests/test_clear_aead.c | 120 + test/unittests/test_conn_close_gquic_be.c | 7 +- test/unittests/test_conn_hash.c | 10 +- test/unittests/test_crypto_gen.c | 146 + test/unittests/test_cubic.c | 60 +- test/unittests/test_di_nocopy.c | 19 + test/unittests/test_elision.c | 16 +- test/unittests/test_frame_chop.c | 8 +- test/unittests/test_frame_reader.c | 15 +- test/unittests/test_frame_rw.c | 23 +- test/unittests/test_frame_writer.c | 30 +- test/unittests/test_goaway_gquic_be.c | 7 +- test/unittests/test_h3_framing.c | 752 + test/unittests/test_h3_prio.c | 977 + test/unittests/test_hcsi_reader.c | 318 + test/unittests/test_lsquic_hash.c | 3 +- test/unittests/test_minmax.c | 453 + test/unittests/test_packet_out.c | 6 +- test/unittests/test_packno_len.c | 4 +- test/unittests/test_parse.c | 6 + test/unittests/test_parse_packet_in.c | 352 +- test/unittests/test_parse_prio.c | 56 + test/unittests/test_purga.c | 174 + test/unittests/test_qlog.c | 29 +- test/unittests/test_quic_be_floats.c | 1 - test/unittests/test_rechist.c | 11 +- test/unittests/test_reg_pkt_headergen.c | 84 +- test/unittests/test_rst_stream_gquic_be.c | 16 +- test/unittests/test_rst_stream_ietf.c | 81 + test/unittests/test_send_headers.c | 621 + test/unittests/test_senhist.c | 3 +- test/unittests/test_sfcw.c | 4 + test/unittests/test_shi.c | 138 + test/unittests/test_some_packets.c | 4 +- test/unittests/test_spi.c | 38 +- test/unittests/test_stop_waiting_gquic_be.c | 1 - test/unittests/test_stream.c | 542 +- test/unittests/test_streamgen.c | 300 +- test/unittests/test_streamparse.c | 325 +- test/unittests/test_trapa.c | 264 + test/unittests/test_varint.c | 120 + test/unittests/test_ver_nego.c | 87 +- test/unittests/test_wuf_gquic_be.c | 11 +- 221 files changed, 113763 insertions(+), 4565 deletions(-) create mode 100644 .gitmodules create mode 100644 patches/boringssl-meds.patch create mode 100755 src/liblsquic/gen-verstrs create mode 160000 src/liblsquic/ls-qpack create mode 100644 src/liblsquic/lsquic_bbr.c create mode 100644 src/liblsquic/lsquic_bbr.h create mode 100644 src/liblsquic/lsquic_bw_sampler.c create mode 100644 src/liblsquic/lsquic_bw_sampler.h create mode 100644 src/liblsquic/lsquic_cong_ctl.h create mode 100644 src/liblsquic/lsquic_enc_sess.h create mode 100644 src/liblsquic/lsquic_enc_sess_common.c create mode 100644 src/liblsquic/lsquic_enc_sess_ietf.c create mode 100644 src/liblsquic/lsquic_frab_list.c create mode 100644 src/liblsquic/lsquic_frab_list.h create mode 100644 src/liblsquic/lsquic_full_conn_ietf.c create mode 100644 src/liblsquic/lsquic_h3_prio.c create mode 100644 src/liblsquic/lsquic_h3_prio.h create mode 100644 src/liblsquic/lsquic_hcsi_reader.c create mode 100644 src/liblsquic/lsquic_hcsi_reader.h create mode 100644 src/liblsquic/lsquic_hcso_writer.c create mode 100644 src/liblsquic/lsquic_hcso_writer.h create mode 100644 src/liblsquic/lsquic_hkdf.c create mode 100644 src/liblsquic/lsquic_hkdf.h create mode 100644 src/liblsquic/lsquic_hq.c create mode 100644 src/liblsquic/lsquic_hq.h create mode 100644 src/liblsquic/lsquic_hspack_valid.c create mode 100644 src/liblsquic/lsquic_ietf.h create mode 100644 src/liblsquic/lsquic_mini_conn.c create mode 100644 src/liblsquic/lsquic_mini_conn.h create mode 100644 src/liblsquic/lsquic_mini_conn_ietf.c create mode 100644 src/liblsquic/lsquic_mini_conn_ietf.h create mode 100644 src/liblsquic/lsquic_minmax.c create mode 100644 src/liblsquic/lsquic_minmax.h create mode 100644 src/liblsquic/lsquic_packet_gquic.c create mode 100644 src/liblsquic/lsquic_packet_gquic.h create mode 100644 src/liblsquic/lsquic_packet_ietf.h create mode 100644 src/liblsquic/lsquic_parse_ietf_v1.c create mode 100644 src/liblsquic/lsquic_pr_queue.c create mode 100644 src/liblsquic/lsquic_pr_queue.h create mode 100644 src/liblsquic/lsquic_purga.c create mode 100644 src/liblsquic/lsquic_purga.h create mode 100644 src/liblsquic/lsquic_push_promise.h create mode 100644 src/liblsquic/lsquic_qdec_hdl.c create mode 100644 src/liblsquic/lsquic_qdec_hdl.h create mode 100644 src/liblsquic/lsquic_qenc_hdl.c create mode 100644 src/liblsquic/lsquic_qenc_hdl.h create mode 100644 src/liblsquic/lsquic_qpack_dec_logger.h create mode 100644 src/liblsquic/lsquic_qpack_enc_logger.h create mode 100644 src/liblsquic/lsquic_shsk_stream.c create mode 100644 src/liblsquic/lsquic_shsk_stream.h create mode 100644 src/liblsquic/lsquic_sizes.h create mode 100644 src/liblsquic/lsquic_stock_shi.c create mode 100644 src/liblsquic/lsquic_stock_shi.h create mode 100644 src/liblsquic/lsquic_tokgen.c create mode 100644 src/liblsquic/lsquic_tokgen.h create mode 100644 src/liblsquic/lsquic_trans_params.c create mode 100644 src/liblsquic/lsquic_trans_params.h create mode 100644 src/liblsquic/lsquic_varint.c create mode 100644 src/liblsquic/lsquic_varint.h create mode 100644 test/http_server.c create mode 100644 test/test_cert.c create mode 100644 test/test_cert.h create mode 100644 test/unittests/mini_parse.c create mode 100644 test/unittests/test_ack.c create mode 100644 test/unittests/test_ackparse_gquic_ietf.c create mode 100644 test/unittests/test_alt_svc_ver.c create mode 100644 test/unittests/test_bw_sampler.c create mode 100644 test/unittests/test_chlo_gen.c create mode 100644 test/unittests/test_clear_aead.c create mode 100644 test/unittests/test_crypto_gen.c create mode 100644 test/unittests/test_h3_framing.c create mode 100644 test/unittests/test_h3_prio.c create mode 100644 test/unittests/test_hcsi_reader.c create mode 100644 test/unittests/test_minmax.c create mode 100644 test/unittests/test_parse.c create mode 100644 test/unittests/test_parse_prio.c create mode 100644 test/unittests/test_purga.c create mode 100644 test/unittests/test_rst_stream_ietf.c create mode 100644 test/unittests/test_send_headers.c create mode 100644 test/unittests/test_shi.c create mode 100644 test/unittests/test_trapa.c create mode 100644 test/unittests/test_varint.c diff --git a/.cirrus.yml b/.cirrus.yml index dfc4f6915..ace967e2c 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -9,10 +9,13 @@ task: # This is so that both GQUIC and IETF branches build. Just picking # a known good revision: - git checkout 32e59d2d3264e4e104b355ef73663b8b79ac4093 + - patch -p1 -i ../patches/boringssl-meds.patch - cmake . - make - cd - script: + - git submodule init + - git submodule update - cmake -DBORINGSSL_DIR=$PWD/boringssl . - make - make test diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..d266711c4 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "src/liblsquic/ls-qpack"] + path = src/liblsquic/ls-qpack + url = https://github.com/litespeedtech/ls-qpack + branch = v0.9.13 diff --git a/.travis.yml b/.travis.yml index da7b00b26..ab8e37ef9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,9 +24,12 @@ before_script: # This is so that both GQUIC and IETF branches build. Just picking # a known good revision: - git checkout 32e59d2d3264e4e104b355ef73663b8b79ac4093 + - patch -p1 -i ../patches/boringssl-meds.patch - cmake . - make - cd - + - git submodule init + - git submodule update - cmake -DBORINGSSL_DIR=$PWD/boringssl . script: # Now build lsquic-client diff --git a/APIs.txt b/APIs.txt index 0e08f7ab1..c5b88782c 100644 --- a/APIs.txt +++ b/APIs.txt @@ -99,6 +99,9 @@ struct lsquic_engine_settings and struct lsquic_stream_if, as well as: - Interface for sending outgoing packets, ea_packets_out - Interface for allocating memory for outgoing packet buffers (optional). + - Interface for share memory hash, ea_shi + - Optional interface for reporting connections whose handshake + did not complete (ea_bad_handshake) ea_packets_out is a pointer to a function of type lsquic_packets_out_f. The engine calls this function when it is appropriate to send out packets diff --git a/CHANGELOG b/CHANGELOG index e59f928a3..f0cfe11ae 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,8 @@ +2019-09-11 + - 2.2.0 + - [FEATURE] Server code is included in the library + - [FEATURE] IETF QUIC and HTTP/3 Support (ID-22) + 2019-05-13 - 1.21.2 - [OPTIMIZATION] HPACK: use history to improve compression performance diff --git a/CMakeLists.txt b/CMakeLists.txt index c07a7ac05..0fc9b12eb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,7 +18,6 @@ IF("${CMAKE_BUILD_TYPE}" STREQUAL "") SET(CMAKE_BUILD_TYPE Debug) ENDIF() - MESSAGE(STATUS "Build type: ${CMAKE_BUILD_TYPE}") @@ -26,22 +25,30 @@ IF (NOT MSVC) SET(MY_CMAKE_FLAGS "${MY_CMAKE_FLAGS} -Wall -Wextra -Wno-unused-parameter") SET(MY_CMAKE_FLAGS "${MY_CMAKE_FLAGS} -fno-omit-frame-pointer") +INCLUDE(CheckCCompilerFlag) +CHECK_C_COMPILER_FLAG(-Wno-implicit-fallthrough HAS_NO_IMPLICIT_FALLTHROUGH) +IF (HAS_NO_IMPLICIT_FALLTHROUGH) + SET(MY_CMAKE_FLAGS "${MY_CMAKE_FLAGS} -Wno-implicit-fallthrough") +ENDIF() IF(CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9.3) SET(MY_CMAKE_FLAGS "${MY_CMAKE_FLAGS} -Wno-missing-field-initializers") ENDIF() + IF(CMAKE_BUILD_TYPE STREQUAL "Debug") SET(MY_CMAKE_FLAGS "${MY_CMAKE_FLAGS} -O0 -g3") + SET(MY_CMAKE_FLAGS "${MY_CMAKE_FLAGS} -Werror") IF(CMAKE_C_COMPILER MATCHES "clang" AND NOT "$ENV{TRAVIS}" MATCHES "^true$") SET(MY_CMAKE_FLAGS "${MY_CMAKE_FLAGS} -fsanitize=address") ENDIF() # Uncomment to enable fault injection testing via libfiu: #SET (MY_CMAKE_FLAGS "${MY_CMAKE_FLAGS} -DFIU_ENABLE=1") + # Uncomment to enable cleartext protocol mode (no crypto): + #SET (MY_CMAKE_FLAGS "${MY_CMAKE_FLAGS} -DLSQUIC_ENABLE_HANDSHAKE_DISABLE=1") #SET(LIBS ${LIBS} fiu) ELSE() SET(MY_CMAKE_FLAGS "${MY_CMAKE_FLAGS} -O3 -g0") - SET(MY_CMAKE_FLAGS "${MY_CMAKE_FLAGS} -DNDEBUG") # Comment out the following line to compile out debug messages: #SET(MY_CMAKE_FLAGS "${MY_CMAKE_FLAGS} -DLSQUIC_LOWEST_LOG_LEVEL=LSQ_LOG_INFO") ENDIF() @@ -70,7 +77,6 @@ IF(CMAKE_BUILD_TYPE STREQUAL "Debug") #SET(LIBS ${LIBS} fiu) ELSE() SET(MY_CMAKE_FLAGS "${MY_CMAKE_FLAGS} -Ox") - SET(MY_CMAKE_FLAGS "${MY_CMAKE_FLAGS} -DNDEBUG") # Comment out the following line to compile out debug messages: #SET(MY_CMAKE_FLAGS "${MY_CMAKE_FLAGS} -DLSQUIC_LOWEST_LOG_LEVEL=LSQ_LOG_INFO") ENDIF() @@ -189,19 +195,24 @@ ELSE() MESSAGE(STATUS "libevent not found") ENDIF() +add_executable(http_server test/http_server.c test/prog.c test/test_common.c test/test_cert.c) + SET(LIBS lsquic ${EVENT_LIB} ${BORINGSSL_LIB_ssl} ${BORINGSSL_LIB_crypto} ${ZLIB_LIB} ${LIBS}) IF (NOT MSVC) + add_executable(http_client test/http_client.c test/prog.c test/test_common.c + test/test_cert.c ) LIST(APPEND LIBS pthread m) #MSVC ELSE() + add_executable(http_client test/http_client.c test/prog.c @@ -214,13 +225,13 @@ LIST(APPEND LIBS ws2_32) ENDIF() TARGET_LINK_LIBRARIES(http_client ${LIBS}) - +TARGET_LINK_LIBRARIES(http_server ${LIBS}) add_subdirectory(src) add_subdirectory(test) -IF(NOT (CMAKE_C_FLAGS MATCHES "-DNDEBUG")) +IF(CMAKE_BUILD_TYPE STREQUAL "Debug") # Our test framework relies on assertions, only compile if assertions are # enabled. # diff --git a/EXAMPLES.txt b/EXAMPLES.txt index e75146119..3d4432e69 100644 --- a/EXAMPLES.txt +++ b/EXAMPLES.txt @@ -2,7 +2,18 @@ LSQUIC Examples =============== -test/http_client.c demonstrates how to use HTTP features of QUIC. +LSQUIC comes with several examples of how the library is used. + +The client and server programs described below are built on a common +framework and share many options. + +HTTP client and server +---------------------- + +See test/http_{client,server}.c + +This pair of programs is to demonstrate how to use HTTP features of QUIC. +HTTP server is interoperable with proto-quic's quic_client. Usage Examples -------------- @@ -65,10 +76,41 @@ To perform load testing, it is good to mix sending and receiving data: If you don't want to create a hundred 256-megabyte out-get.* files, use -K flag to discard output. +Testing Large Packet Sizes +--------------------------------- + +IETF QUIC supports all valid UDP packet sizes. This section outlines the +environment setup and testing parameters necessary to test this feature. + +Compilation + - Make sure to compile the library in DEBUG mode so that the NDEBUG + define is off. + - Build both the http_client and http_server test programs. + +Running Instructions + - On the server side, define the environment variable + LSQUIC_CN_PACK_SIZE and set it to the intended packet size. + Valid sizes are up to 65507 (IPv4). + - Use the -W flag for http_client and http_server for the ability + to send packets of large size. + - On the client side, use the -z flag to specify the maximum size + of packet that the client will accept. + +Example Usage + ./http_client -p /file-1M -H www.litespeedtech.com -s 192.168.0.85:5443 + -o version=FF000014 -z 65507 -W + ./http_server -c www.litespeedtech.com,certschain,privkey + -s 0.0.0.0:5443 -W + +Additional Notes + Since this feature does not have MTU discovery enabled at the time of + writing, make sure to use client and server machines that share a path + with the intended MTU. + Control QUIC Settings via -o Flag --------------------------------- -Most of the settings in struct lsquic_engine_settings can be controlled +Most of the settings in struct squic_engine_settings can be controlled via -o flag. With exception of es_versions, which is a bit mask, other es_* options can be mapped to corresponding -o value via s/^es_//: @@ -77,6 +119,16 @@ es_* options can be mapped to corresponding -o value via s/^es_//: And so on. +For example, to test version negotiation: + + ./http_server -c www.litespeedtech.com,certschain,privkey \ + -o version=Q035 -L debug 2>server.out & + ./http_client -H www.litespeedtech.com -p Makefile -L debug 2>client.out + +Above, the client will start with the default, which is the highest supported +QUIC version, which the server should negotiate down. You should see it from +the log files. + The code to set options via -o flag lives in set_engine_option(). It is good to update this function at the same time as member fields are added to struct lsquic_engine_settings. @@ -84,6 +136,46 @@ lsquic_engine_settings. Control LSQUIC Behavior via Environment Variables ------------------------------------------------- +LSQUIC_PACKET_OUT_LIMIT + + If set, the value of this environment variable is the maximum number + of packets that can be sent out in one shot. The limit is in the test + program framework's ea_packets_out() callback. + + It is not applicable when sendmmsg(2) is used. + + Note 1: sendmmsg can be enabled using -g option, if available for your + platform. + + Note 2: see -m option for a related packet-out limitation. + +LSQUIC_DISABLE_HANDSHAKE + + If set (to anything, not any particular value), the QUIC handshake is + disabled and packets are not encrypted. This can be useful to: + a) profile functions in LSQUIC without accounting for crypto stuff, + which tends to dwarf everything else; + b) see bytes in the clear on the wire; and + c) compare throughput performance to TCP without crypto. + + This functionality is compiled in if the somewhat-awkwardly named + LSQUIC_ENABLE_HANDSHAKE_DISABLE is set to 1. By default, it is enabled + in debug builds and disabled in optimized builds. + +LSQUIC_LOSE_PACKETS_RE + + If set, this regular expression specifies the numbers of packets which + the sender will lose on purpose. For example: + + export LSQUIC_LOSE_PACKETS_RE='^(3|5|10)$' + + The act of losing a packet is performed by changing its payload to + zero-filled buffer of the same size, which is almost as good as + not sending anything. The latter is difficult to implement without + negatively affecting the regular code flow. + + Only available in debug builds. + LSQUIC_PACER_INTERTICK Number of microsecods to use as constant intertick time in lieu of the @@ -104,6 +196,21 @@ LSQUIC_RANDOM_SEND_FAILURE Only available when compiled with -DLSQUIC_RANDOM_SEND_FAILURE=1 +LSQUIC_LOG_SECRETS + + If set to true value, crypto secrets will be logged. Applies to + IETF QUIC only. + +LSQUIC_COALESCE + + If set to false, packets are not coalesced. Defaults to true. + +LSQUIC_USE_POOLS + + If set to false, all memory pooling code is replaced with calls to + malloc() and free(). This facilitates debugging memory issues. + The default is true. + Control Network-Related Stuff ----------------------------- @@ -116,9 +223,16 @@ Control Network-Related Stuff sndbuf=12345 # Sets SO_SNDBUF rcvbuf=12345 # Sets SO_RCVBUF + -g Use sendmmsg() to send packets. This is only compiled in + if available. + More Compilation Options ------------------------ +-DLSQUIC_ENABLE_HANDSHAKE_DISABLE=1 + + Support disabling of handshake. See above. + -DLSQUIC_CONN_STATS=1 Track some statistics about connections -- packets in, sent, delayed, @@ -140,6 +254,11 @@ More Compilation Options Turn off statistics collection performed by the send controller: number of packets sent, resent, and delayed. +-DLOG_PACKET_CHECKSUM=1 + + When turned on, CRC32 checksum of each sent and received packet is + logged as an event. + -DLSQUIC_LOWEST_LOG_LEVEL=LSQ_LOG_WARN If you want to go even faster: compile out some log levels entirely. diff --git a/README.md b/README.md index c7cceabda..fe44ed414 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,22 @@ -[![Build Status](https://travis-ci.org/litespeedtech/lsquic-client.svg?branch=master)](https://travis-ci.org/litespeedtech/lsquic-client) -[![Build Status](https://api.cirrus-ci.com/github/litespeedtech/lsquic-client.svg)](https://cirrus-ci.com/github/litespeedtech/lsquic-client) -[![Build status](https://ci.appveyor.com/api/projects/status/kei9649t9leoqicr?svg=true)](https://ci.appveyor.com/project/litespeedtech/lsquic-client) +[![Build Status](https://travis-ci.org/litespeedtech/lsquic.svg?branch=master)](https://travis-ci.org/litespeedtech/lsquic) +[![Build Status](https://api.cirrus-ci.com/github/litespeedtech/lsquic.svg)](https://cirrus-ci.com/github/litespeedtech/lsquic) +[![Build status](https://ci.appveyor.com/api/projects/status/kei9649t9leoqicr?svg=true)](https://ci.appveyor.com/project/litespeedtech/lsquic) -LiteSpeed QUIC (LSQUIC) Client Library README +LiteSpeed QUIC (LSQUIC) Library README ============================================= Description ----------- -LiteSpeed QUIC (LSQUIC) Client Library is an open-source implementation -of QUIC functionality for clients. It is released in the hope to speed +LiteSpeed QUIC (LSQUIC) Library is an open-source implementation of QUIC +functionality for servers and clients. It is released in the hope to speed the adoption of QUIC. Most of the code in this distribution is used in -our own products: LiteSpeed Web Server and ADC. We think it is free of -major problems. Nevertheless, do not hesitate to report bugs back to us. -Even better, send us fixes and improvements! +our own products: LiteSpeed Web Server, LiteSpeed ADC, and OpenLiteSpeed. +We think it is free of major problems. Nevertheless, do not hesitate to +report bugs back to us. Even better, send us fixes and improvements! -Currently supported QUIC versions are Q035, Q039, Q043, and Q044. Support -for newer versions will be added soon after they are released. The -version(s) specified by IETF QUIC WG are being developed on -[one or more branches](https://github.com/litespeedtech/lsquic-client/branches). -When deemed stable, the IETF QUIC support will be added to the master branch. +Currently supported QUIC versions are Q039, Q043, Q046, and ID-22. Support +for newer versions will be added soon after they are released. Documentation ------------- @@ -49,13 +46,9 @@ git clone https://boringssl.googlesource.com/boringssl cd boringssl ``` -2. Check out stable branch: +You may need to install pre-requisites like zlib and libevent. -``` -git checkout chromium-stable -``` - -3. Compile the library +2. Compile the library ``` cmake . && make @@ -72,17 +65,20 @@ If you want to turn on optimizations, do cmake -DCMAKE_BUILD_TYPE=Release . && make ``` -Building LSQUIC Client Library ------------------------------- +Building LSQUIC Library +----------------------- -LSQUIC's `http_client` and the tests link BoringSSL libraries statically. -Following previous section, you can build LSQUIC as follows: +LSQUIC's `http_client`, `http_server`, and the tests link BoringSSL +libraries statically. Following previous section, you can build LSQUIC +as follows: 1. Get the source code ``` -git clone https://github.com/litespeedtech/lsquic-client.git -cd lsquic-client +git clone https://github.com/litespeedtech/lsquic.git +cd lsquic +git submodule init +git submodule update ``` 2. Compile the library @@ -104,31 +100,31 @@ Building with Docker --------- The library and http_client example can be built with Docker. ``` -docker build -t lsquic-client . +docker build -t lsquic . ``` Then you can use the http_client example from the command line. ``` -docker run -it --rm lsquic-client http_client -H www.google.com -s 74.125.22.106:443 -p / +docker run -it --rm lsquic http_client -H www.google.com -s 74.125.22.106:443 -p / ``` Platforms --------- -The client library has been tested on the following platforms: +The library has been tested on the following platforms: - Linux - i386 - x86_64 - ARM (Raspberry Pi 3) - FreeBSD - i386 -- Windows - - x86_64 - MacOS - x86_64 +- Windows (this needs updating for the server part, now broken) + - x86_64 Have fun, LiteSpeed QUIC Team. -Copyright (c) 2017 - 2018 LiteSpeed Technologies Inc +Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc diff --git a/include/lsquic.h b/include/lsquic.h index ff0463c1b..23f48c2e5 100644 --- a/include/lsquic.h +++ b/include/lsquic.h @@ -23,9 +23,9 @@ struct sockaddr; extern "C" { #endif -#define LSQUIC_MAJOR_VERSION 1 -#define LSQUIC_MINOR_VERSION 21 -#define LSQUIC_PATCH_VERSION 2 +#define LSQUIC_MAJOR_VERSION 2 +#define LSQUIC_MINOR_VERSION 2 +#define LSQUIC_PATCH_VERSION 0 /** * Engine flags: @@ -49,7 +49,9 @@ enum lsquic_version { /** Q035. This is the first version to be supported by LSQUIC. */ - LSQVER_035, + /* Support for this version has been removed. The comment remains to + * document the changes. + */ /* * Q037. This version is like Q035, except the way packet hashes are @@ -101,7 +103,9 @@ enum lsquic_version * Q044. IETF-like packet headers are used. Frames are the same as * in Q043. Server never includes CIDs in short packets. */ - LSQVER_044, + /* Support for this version has been removed. The comment remains to + * document the changes. + */ /** * Q046. Use IETF Draft-17 compatible packet headers. @@ -120,27 +124,41 @@ enum lsquic_version #define LSQUIC_EXPERIMENTAL_Q098 0 #endif + /** + * IETF QUIC Draft-22 + */ + LSQVER_ID22, + + /** + * Special version to trigger version negotiation. + * [draft-ietf-quic-transport-11], Section 3. + */ + LSQVER_VERNEG, + N_LSQVER }; /** - * We currently support versions 35, 39, 43, 44, and 46. + * We currently support versions 39, 43, 46, and IETF Draft-22 * @see lsquic_version */ #define LSQUIC_SUPPORTED_VERSIONS ((1 << N_LSQVER) - 1) -#define LSQUIC_EXPERIMENTAL_VERSIONS (0 \ - | LSQUIC_EXPERIMENTAL_Q098) +/** + * List of versions in which the server never includes CID in short packets. + */ +#define LSQUIC_FORCED_TCID0_VERSIONS (1 << LSQVER_046) + +#define LSQUIC_EXPERIMENTAL_VERSIONS ( \ + (1 << LSQVER_VERNEG) | LSQUIC_EXPERIMENTAL_Q098) #define LSQUIC_DEPRECATED_VERSIONS 0 -#define LSQUIC_GQUIC_HEADER_VERSIONS ( \ - (1 << LSQVER_035) | (1 << LSQVER_039) | (1 << LSQVER_043)) +#define LSQUIC_GQUIC_HEADER_VERSIONS ((1 << LSQVER_039) | (1 << LSQVER_043)) -/** - * List of versions in which the server never includes CID in short packets. - */ -#define LSQUIC_FORCED_TCID0_VERSIONS ((1 << LSQVER_044) | (1 << LSQVER_046)) +#define LSQUIC_IETF_VERSIONS ((1 << LSQVER_ID22) | (1 << LSQVER_VERNEG)) + +#define LSQUIC_IETF_DRAFT_VERSIONS ((1 << LSQVER_ID22) | (1 << LSQVER_VERNEG)) enum lsquic_hsk_status { @@ -156,6 +174,11 @@ enum lsquic_hsk_status * The handshake succeeded with 0-RTT. */ LSQ_HSK_0RTT_OK, + /** + * The handshake failed because of 0-RTT (early data rejected). Retry + * the connection without 0-RTT. + */ + LSQ_HSK_0RTT_FAIL, }; /** @@ -192,6 +215,7 @@ struct lsquic_stream_if { void (*on_read) (lsquic_stream_t *s, lsquic_stream_ctx_t *h); void (*on_write) (lsquic_stream_t *s, lsquic_stream_ctx_t *h); void (*on_close) (lsquic_stream_t *s, lsquic_stream_ctx_t *h); + /* This callback in only called in client mode */ /** * When handshake is completed, this callback is called. `ok' is set * to true if handshake was successful; otherwise, `ok' is set to @@ -200,8 +224,31 @@ struct lsquic_stream_if { * This callback is optional. */ void (*on_hsk_done)(lsquic_conn_t *c, enum lsquic_hsk_status s); + /** + * When server sends a token in NEW_TOKEN frame, this callback is called. + * The callback is optional. + */ + void (*on_new_token)(lsquic_conn_t *c, const unsigned char *token, + size_t token_size); + /** + * This optional callback lets client record information needed to + * perform a zero-RTT handshake next time around. + */ + void (*on_zero_rtt_info)(lsquic_conn_t *c, const unsigned char *, size_t); }; +struct ssl_ctx_st; +struct ssl_st; + +/** + * QUIC engine in server role needs access to certificates. This is + * accomplished by providing a callback and a context to the engine + * constructor. + */ + +typedef struct ssl_ctx_st * (*lsquic_lookup_cert_f)( + void *lsquic_cert_lookup_ctx, const struct sockaddr *local, const char *sni); + /** * Minimum flow control window is set to 16 KB for both client and server. * This means we can send up to this amount of data before handshake gets @@ -226,12 +273,36 @@ struct lsquic_stream_if { #define LSQUIC_DF_SFCW_CLIENT (6 * 1024 * 1024) #define LSQUIC_DF_MAX_STREAMS_IN 100 +/* IQUIC uses different names for these: */ +#define LSQUIC_DF_INIT_MAX_DATA_SERVER LSQUIC_DF_CFCW_SERVER +#define LSQUIC_DF_INIT_MAX_DATA_CLIENT LSQUIC_DF_CFCW_CLIENT +#define LSQUIC_DF_INIT_MAX_STREAM_DATA_BIDI_REMOTE_SERVER LSQUIC_DF_SFCW_SERVER +#define LSQUIC_DF_INIT_MAX_STREAM_DATA_BIDI_LOCAL_SERVER 0 +#define LSQUIC_DF_INIT_MAX_STREAM_DATA_BIDI_REMOTE_CLIENT 0 +#define LSQUIC_DF_INIT_MAX_STREAM_DATA_BIDI_LOCAL_CLIENT LSQUIC_DF_SFCW_CLIENT +#define LSQUIC_DF_INIT_MAX_STREAMS_BIDI LSQUIC_DF_MAX_STREAMS_IN +#define LSQUIC_DF_INIT_MAX_STREAMS_UNI_CLIENT 100 +#define LSQUIC_DF_INIT_MAX_STREAMS_UNI_SERVER 3 +/* XXX What's a good value here? */ +#define LSQUIC_DF_INIT_MAX_STREAM_DATA_UNI_CLIENT (32 * 1024) +#define LSQUIC_DF_INIT_MAX_STREAM_DATA_UNI_SERVER (12 * 1024) + +/** + * Default idle connection time in seconds. + */ +#define LSQUIC_DF_IDLE_TIMEOUT 30 + +/** + * Default ping period in seconds. + */ +#define LSQUIC_DF_PING_PERIOD 15 + /** * Default handshake timeout in microseconds. */ #define LSQUIC_DF_HANDSHAKE_TO (10 * 1000 * 1000) -#define LSQUIC_DF_IDLE_CONN_TO (30 * 1000 * 1000) +#define LSQUIC_DF_IDLE_CONN_TO (LSQUIC_DF_IDLE_TIMEOUT * 1000 * 1000) #define LSQUIC_DF_SILENT_CLOSE 1 /** Default value of maximum header list size. If set to non-zero value, @@ -249,11 +320,18 @@ struct lsquic_stream_if { #define LSQUIC_DF_SUPPORT_SREJ_CLIENT 0 /* TODO: client support */ /** Do not use NSTP by default */ #define LSQUIC_DF_SUPPORT_NSTP 0 +/** TODO: IETF QUIC clients do not support push */ #define LSQUIC_DF_SUPPORT_PUSH 1 -#define LSQUIC_DF_SUPPORT_TCID0 0 +#define LSQUIC_DF_SUPPORT_TCID0 1 /** By default, LSQUIC ignores Public Reset packets. */ #define LSQUIC_DF_HONOR_PRST 0 +/** + * By default, LSQUIC will not send Public Reset packets in response to + * packets that specify unknown connections. + */ +#define LSQUIC_DF_SEND_PRST 0 + /** By default, infinite loop checks are turned on */ #define LSQUIC_DF_PROGRESS_CHECK 1000 @@ -269,6 +347,32 @@ struct lsquic_stream_if { /** Default clock granularity is 1000 microseconds */ #define LSQUIC_DF_CLOCK_GRANULARITY 1000 +/** The default value is 8 for simplicity */ +#define LSQUIC_DF_SCID_LEN 8 + +/** The default value is 60 CIDs per minute */ +#define LSQUIC_DF_SCID_ISS_RATE 60 + +#define LSQUIC_DF_QPACK_DEC_MAX_BLOCKED 100 +#define LSQUIC_DF_QPACK_DEC_MAX_SIZE 4096 +#define LSQUIC_DF_QPACK_ENC_MAX_BLOCKED 100 +#define LSQUIC_DF_QPACK_ENC_MAX_SIZE 4096 + +/** ECN is enabled by default */ +#define LSQUIC_DF_ECN 1 + +/** + * The default number of the priority placeholders is higher than the + * recommended value of 16 to give the clients even more freedom. + */ +#define LSQUIC_DF_H3_PLACEHOLDERS 50 + +/** Allow migration by default */ +#define LSQUIC_DF_ALLOW_MIGRATION 1 + +/* 1: Cubic; 2: BBR */ +#define LSQUIC_DF_CC_ALGO 1 + struct lsquic_engine_settings { /** * This is a bit mask wherein each bit corresponds to a value in @@ -276,6 +380,8 @@ struct lsquic_engine_settings { * version and goes down. Server supports either of the versions * specified here. * + * This setting applies to both Google and IETF QUIC. + * * @see lsquic_version */ unsigned es_versions; @@ -325,10 +431,12 @@ struct lsquic_engine_settings { * For client, this can be set to an arbitrary value (zero turns the * timeout off). * + * For server, this value is limited to about 16 seconds. Do not set + * it to zero. */ unsigned long es_handshake_to; - /** ICSL in microseconds */ + /** ICSL in microseconds; GQUIC only */ unsigned long es_idle_conn_to; /** SCLS (silent close) */ @@ -344,10 +452,20 @@ struct lsquic_engine_settings { /** UAID -- User-Agent ID. Defaults to @ref LSQUIC_DF_UA. */ const char *es_ua; + /** + * More parameters for server + */ + uint64_t es_sttl; /* SCFG TTL in seconds */ + uint32_t es_pdmd; /* One fixed value X509 */ uint32_t es_aead; /* One fixed value AESG */ uint32_t es_kexs; /* One fixed value C255 */ + /* Maximum number of incoming connections in inchoate state. This is + * only applicable in server mode. + */ + unsigned es_max_inchoate; + /** * Support SREJ: for client side, this means supporting server's SREJ * responses (this does not work yet) and for server side, this means @@ -364,6 +482,8 @@ struct lsquic_engine_settings { * b) All incoming pushed streams get reset immediately. * (For maximum effect, set es_max_streams_in to 0.) * + * For server: + * lsquic_conn_push_stream() will return -1. */ int es_support_push; @@ -376,7 +496,7 @@ struct lsquic_engine_settings { * (source-addr, dest-addr) tuple, thereby making it necessary to create * a socket for each connection. * - * This option has no effect in Q044 or Q046, as the server never includes + * This option has no effect in Q046, as the server never includes * CIDs in the short packets. * * The default is @ref LSQUIC_DF_SUPPORT_TCID0. @@ -402,6 +522,13 @@ struct lsquic_engine_settings { */ int es_honor_prst; + /** + * If set to true value, the library will send Public Reset packets + * in response to incoming packets with unknown Connection IDs. + * The default is @ref LSQUIC_DF_SEND_PRST. + */ + int es_send_prst; + /** * A non-zero value enables internal checks that identify suspected * infinite loops in user @ref on_read and @ref on_write callbacks @@ -461,6 +588,169 @@ struct lsquic_engine_settings { * is in microseconds; default is @ref LSQUIC_DF_CLOCK_GRANULARITY. */ unsigned es_clock_granularity; + + /* The following settings are specific to IETF QUIC. */ + /* vvvvvvvvvvv */ + + /** + * Initial max data. + * + * This is a transport parameter. + * + * Depending on the engine mode, the default value is either + * @ref LSQUIC_DF_INIT_MAX_DATA_CLIENT or + * @ref LSQUIC_DF_INIT_MAX_DATA_SERVER. + */ + unsigned es_init_max_data; + + /** + * Initial max stream data. + * + * This is a transport parameter. + * + * Depending on the engine mode, the default value is either + * @ref LSQUIC_DF_INIT_MAX_STREAM_DATA_CLIENT or + * @ref LSQUIC_DF_INIT_MAX_STREAM_DATA_BIDI_REMOTE_SERVER. + */ + unsigned es_init_max_stream_data_bidi_remote; + unsigned es_init_max_stream_data_bidi_local; + + /** + * Initial max stream data for unidirectional streams initiated + * by remote endpoint. + * + * This is a transport parameter. + * + * Depending on the engine mode, the default value is either + * @ref LSQUIC_DF_INIT_MAX_STREAM_DATA_UNI_CLIENT or + * @ref LSQUIC_DF_INIT_MAX_STREAM_DATA_UNI_SERVER. + */ + unsigned es_init_max_stream_data_uni; + + /** + * Maximum initial number of bidirectional stream. + * + * This is a transport parameter. + * + * Default value is @ref LSQUIC_DF_INIT_MAX_STREAMS_BIDI. + */ + unsigned es_init_max_streams_bidi; + + /** + * Maximum initial number of unidirectional stream. + * + * This is a transport parameter. + * + * Default value is @ref LSQUIC_DF_INIT_MAX_STREAMS_UNI_CLIENT or + * @ref LSQUIC_DF_INIT_MAX_STREAM_DATA_UNI_SERVER. + */ + unsigned es_init_max_streams_uni; + + /** + * Idle connection timeout. + * + * This is a transport parameter. + * + * (Note: es_idle_conn_to is not reused because it is in microseconds, + * which, I now realize, was not a good choice. Since it will be + * obsoleted some time after the switchover to IETF QUIC, we do not + * have to keep on using strange units.) + * + * Default value is @ref LSQUIC_DF_IDLE_TIMEOUT. + * + * Maximum value is 600 seconds. + */ + unsigned es_idle_timeout; + + /** + * Ping period. If set to non-zero value, the connection will generate and + * send PING frames in the absence of other activity. + * + * By default, the server does not send PINGs and the period is set to zero. + * The client's defaut value is @ref LSQUIC_DF_PING_PERIOD. + */ + unsigned es_ping_period; + + /** + * Source Connection ID length. Only applicable to the IETF QUIC + * versions. Valid values are 4 through 18, inclusive. + * + * Default value is @ref LSQUIC_DF_SCID_LEN. + */ + unsigned es_scid_len; + + /** + * Source Connection ID issuance rate. Only applicable to the IETF QUIC + * versions. This field is measured in CIDs per minute. Using value 0 + * indicates that there is no rate limit for CID issuance. + * + * Default value is @ref LSQUIC_DF_SCID_ISS_RATE. + */ + unsigned es_scid_iss_rate; + + /** + * Maximum size of the QPACK dynamic table that the QPACK decoder will + * use. + * + * The default is @ref LSQUIC_DF_QPACK_DEC_MAX_SIZE. + */ + unsigned es_qpack_dec_max_size; + + /** + * Maximum number of blocked streams that the QPACK decoder is willing + * to tolerate. + * + * The default is @ref LSQUIC_DF_QPACK_DEC_MAX_BLOCKED. + */ + unsigned es_qpack_dec_max_blocked; + + /** + * Maximum size of the dynamic table that the encoder is willing to use. + * The actual size of the dynamic table will not exceed the minimum of + * this value and the value advertized by peer. + * + * The default is @ref LSQUIC_DF_QPACK_ENC_MAX_SIZE. + */ + unsigned es_qpack_enc_max_size; + + /** + * Maximum number of blocked streams that the QPACK encoder is willing + * to risk. The actual number of blocked streams will not exceed the + * minimum of this value and the value advertized by peer. + * + * The default is @ref LSQUIC_DF_QPACK_ENC_MAX_BLOCKED. + */ + unsigned es_qpack_enc_max_blocked; + + /** + * Enable ECN support. + * + * The default is @ref LSQUIC_DF_ECN + */ + int es_ecn; + + /** + * Number of HTTP/3 priorify placeholders. + * + * The default is @ref LSQUIC_DF_H3_PLACEHOLDERS + */ + unsigned es_h3_placeholders; + + /** + * Allow peer to migrate connection. + * + * The default is @ref LSQUIC_DF_ALLOW_MIGRATION + */ + int es_allow_migration; + + /** + * Congestion control algorithm to use. + * + * 0: Use default (@ref LSQUIC_DF_CC_ALGO) + * 1: Cubic + * 2: BBR + */ + unsigned es_cc_algo; }; /* Initialize `settings' to default values */ @@ -491,11 +781,12 @@ lsquic_engine_check_settings (const struct lsquic_engine_settings *settings, struct lsquic_out_spec { - const unsigned char *buf; - size_t sz; + struct iovec *iov; + size_t iovlen; const struct sockaddr *local_sa; const struct sockaddr *dest_sa; void *peer_ctx; + int ecn; /* Valid values are 0 - 3. See RFC 3168 */ }; /** @@ -511,6 +802,41 @@ typedef int (*lsquic_packets_out_f)( unsigned n_packets_out ); +/** + * The shared hash interface is used to share data between multiple LSQUIC + * instances. + */ +struct lsquic_shared_hash_if +{ + /** + * If you want your item to never expire, set `expiry' to zero. + * Returns 0 on success, -1 on failure. + * + * If inserted successfully, `free()' will be called on `data' and 'key' + * pointer when the element is deleted, whether due to expiration + * or explicit deletion. + */ + int (*shi_insert)(void *shi_ctx, void *key, unsigned key_sz, + void *data, unsigned data_sz, time_t expiry); + /** + * Returns 0 on success, -1 on failure. + */ + int (*shi_delete)(void *shi_ctx, const void *key, unsigned key_sz); + + /** + * `data' is pointed to the result and `data_sz' is set to the + * object size. The implementation may choose to copy the object + * into buffer pointed to by `data', so you should have it ready. + * + * @retval 1 found. + * @retval 0 not found. + * @retval -1 error (perhaps not enough room in `data' if copy was + * attempted). + */ + int (*shi_lookup)(void *shi_ctx, const void *key, unsigned key_sz, + void **data, unsigned *data_sz); +}; + /** * The packet out memory interface is used by LSQUIC to get buffers to * which outgoing packets will be written before they are passed to @@ -539,6 +865,9 @@ struct lsquic_packout_mem_if char is_ipv6); }; +typedef void (*lsquic_cids_update_f)(void *ctx, void **peer_ctx, + const lsquic_cid_t *cids, unsigned n_cids); + struct stack_st_X509; /** @@ -554,7 +883,8 @@ enum lsquic_header_status LSQUIC_HDR_ERR_INCOMPL_REQ_PSDO_HDR, /** Unnecessary request pseudo-header present in the response */ LSQUIC_HDR_ERR_UNNEC_REQ_PSDO_HDR, - LSQUIC_HDR_ERR_BAD_REQ_HEADER = LSQUIC_HDR_ERR_UNNEC_REQ_PSDO_HDR, + /** Prohibited header in request */ + LSQUIC_HDR_ERR_BAD_REQ_HEADER, /** Not all response pseudo-headers are present */ LSQUIC_HDR_ERR_INCOMPL_RESP_PSDO_HDR, /** Unnecessary response pseudo-header present in the response. */ @@ -590,9 +920,12 @@ struct lsquic_hset_if * `hdr_set' is the header set object returned by * @ref hsi_create_header_set(). * - * `name_idx' is set to the index in the HPACK static table whose entry's - * name element matches `name'. If there is no such match, `name_idx' is - * set to zero. + * `name_idx' is set to the index in either the HPACK or QPACK static table + * whose entry's name element matches `name'. The values are as follows: + * - if there is no such match, `name_idx' is set to zero; + * - if HPACK is used, the value is between 1 and 61; and + * - if QPACK is used, the value is 62+ (subtract 62 to get the QPACK + * static table index). * * If `name' is NULL, this means that no more header are going to be * added to the set. @@ -608,6 +941,26 @@ struct lsquic_hset_if void (*hsi_discard_header_set)(void *hdr_set); }; +/** + * SSL keylog interface. + */ +struct lsquic_keylog_if +{ + /** Return keylog handle or NULL if no key logging is desired */ + void * (*kli_open) (void *keylog_ctx, lsquic_conn_t *); + + /** + * Log line. The first argument is the pointer returned by + * @ref kli_open. + */ + void (*kli_log_line) (void *handle, const char *line); + + /** + * Close handle. + */ + void (*kli_close) (void *handle); +}; + /* TODO: describe this important data structure */ typedef struct lsquic_engine_api { @@ -616,11 +969,27 @@ typedef struct lsquic_engine_api void *ea_stream_if_ctx; lsquic_packets_out_f ea_packets_out; void *ea_packets_out_ctx; + lsquic_lookup_cert_f ea_lookup_cert; + void *ea_cert_lu_ctx; + struct ssl_ctx_st * (*ea_get_ssl_ctx)(void *peer_ctx); + /** + * Shared hash interface is optional. If set to zero, performance of + * multiple LSQUIC instances will be degraded. + */ + const struct lsquic_shared_hash_if *ea_shi; + void *ea_shi_ctx; /** * Memory interface is optional. */ const struct lsquic_packout_mem_if *ea_pmi; void *ea_pmi_ctx; + /** + * Optional interface to report new and old source connection IDs. + */ + lsquic_cids_update_f ea_new_scids; + lsquic_cids_update_f ea_live_scids; + lsquic_cids_update_f ea_old_scids; + void *ea_cids_update_ctx; /** * Function to verify server certificate. The chain contains at least * one element. The first element in the chain is the server @@ -650,6 +1019,12 @@ typedef struct lsquic_engine_api */ void /* FILE, really */ *ea_stats_fh; #endif + + /** + * Optional SSL key logging interface. + */ + const struct lsquic_keylog_if *ea_keylog_if; + void *ea_keylog_ctx; } lsquic_engine_api_t; /** @@ -672,7 +1047,9 @@ lsquic_engine_connect (lsquic_engine_t *, const struct sockaddr *local_sa, const struct sockaddr *peer_sa, void *peer_ctx, lsquic_conn_ctx_t *conn_ctx, const char *hostname, unsigned short max_packet_size, - const unsigned char *zero_rtt, size_t zero_rtt_len); + const unsigned char *zero_rtt, size_t zero_rtt_len, + /** Resumption token: optional */ + const unsigned char *token, size_t token_sz); /** * Pass incoming packet to the QUIC engine. This function can be called @@ -681,6 +1058,10 @@ lsquic_engine_connect (lsquic_engine_t *, const struct sockaddr *local_sa, * * @retval 0 Packet was processed by a real connection. * + * @retval 1 Packet was handled successfully, but not by a connection. + * This may happen with version negotiation and public reset + * packets as well as some packets that may be ignored. + * * @retval -1 Some error occurred. Possible reasons are invalid packet * size or failure to allocate memory. */ @@ -688,7 +1069,7 @@ int lsquic_engine_packet_in (lsquic_engine_t *, const unsigned char *packet_in_data, size_t packet_in_size, const struct sockaddr *sa_local, const struct sockaddr *sa_peer, - void *peer_ctx); + void *peer_ctx, int ecn); /** * Process tickable connections. This function must be called often enough so @@ -722,7 +1103,8 @@ lsquic_engine_destroy (lsquic_engine_t *); unsigned lsquic_conn_n_avail_streams (const lsquic_conn_t *); -void lsquic_conn_make_stream(lsquic_conn_t *); +void +lsquic_conn_make_stream (lsquic_conn_t *); /** Return number of delayed streams currently pending */ unsigned @@ -735,21 +1117,48 @@ lsquic_conn_cancel_pending_streams (lsquic_conn_t *, unsigned n); /** * Mark connection as going away: send GOAWAY frame and do not accept * any more incoming streams, nor generate streams of our own. + * + * In the server mode, of course, we can call this function just fine in both + * Google and IETF QUIC. + * + * In client mode, calling this function in for an IETF QUIC connection does + * not do anything, as the client MUST NOT send GOAWAY frames. + * See [draft-ietf-quic-http-17] Section 4.2.7. */ void -lsquic_conn_going_away(lsquic_conn_t *conn); +lsquic_conn_going_away (lsquic_conn_t *); /** * This forces connection close. on_conn_closed and on_close callbacks * will be called. */ -void lsquic_conn_close(lsquic_conn_t *conn); +void +lsquic_conn_close (lsquic_conn_t *); int lsquic_stream_wantread(lsquic_stream_t *s, int is_want); ssize_t lsquic_stream_read(lsquic_stream_t *s, void *buf, size_t len); ssize_t lsquic_stream_readv(lsquic_stream_t *s, const struct iovec *, int iovcnt); +/** + * This function allows user-supplied callback to read the stream contents. + * It is meant to be used for zero-copy stream processing. + */ +ssize_t +lsquic_stream_readf (lsquic_stream_t *s, + /** + * The callback takes four parameters: + * - Pointer to user-supplied context; + * - Pointer to the data; + * - Data size (can be zero); and + * - Indicator whether the FIN follows the data. + * + * The callback returns number of bytes processed. If this number is zero + * or is smaller than `len', reading from stream stops. + */ + size_t (*readf)(void *ctx, const unsigned char *buf, size_t len, int fin), + void *ctx); + int lsquic_stream_wantwrite(lsquic_stream_t *s, int is_want); /** @@ -838,7 +1247,33 @@ int lsquic_stream_send_headers(lsquic_stream_t *s, void * lsquic_stream_get_hset (lsquic_stream_t *); -int lsquic_conn_is_push_enabled(lsquic_conn_t *c); +/** + * A server may push a stream. This call creates a new stream in reference + * to stream `s'. It will behave as if the client made a request: it will + * trigger on_new_stream() event and it can be used as a regular client- + * initiated stream. + * + * If `hdr_set' is not set, it is generated by using `ea_hsi_if' callbacks. + * In either case, the header set object belongs to the connection. The + * user is not to free this object until (@ref hsi_discard_header_set) is + * called. + * + * @retval 0 Stream pushed successfully. + * @retval 1 Stream push failed because it is disabled or because we hit + * stream limit or connection is going away. + * @retval -1 Stream push failed because of an internal error. + */ +int +lsquic_conn_push_stream (lsquic_conn_t *c, void *hdr_set, lsquic_stream_t *s, + const struct iovec* url, const struct iovec* authority, + const lsquic_http_headers_t *headers); + +/** + * Only makes sense in server mode: the client cannot push a stream and this + * function always returns false in client mode. + */ +int +lsquic_conn_is_push_enabled (lsquic_conn_t *); /** Possible values for how are 0, 1, and 2. See shutdown(2). */ int lsquic_stream_shutdown(lsquic_stream_t *s, int how); @@ -857,16 +1292,8 @@ int lsquic_stream_close(lsquic_stream_t *s); struct stack_st_X509 * lsquic_conn_get_server_cert_chain (lsquic_conn_t *); -/** - * Get server config zero_rtt from the encryption session. - * Returns the number of bytes written to the zero_rtt. - */ -ssize_t -lsquic_conn_get_zero_rtt(const lsquic_conn_t *, - unsigned char *zero_rtt, size_t zero_rtt_len); - /** Returns ID of the stream */ -uint32_t +lsquic_stream_id_t lsquic_stream_id (const lsquic_stream_t *s); /** @@ -880,6 +1307,13 @@ lsquic_stream_get_ctx (const lsquic_stream_t *s); int lsquic_stream_is_pushed (const lsquic_stream_t *s); +/** + * Returns true if this stream was rejected, false otherwise. Use this as + * an aid to distinguish between errors. + */ +int +lsquic_stream_is_rejected (const lsquic_stream_t *s); + /** * Refuse pushed stream. Call it from @ref on_new_stream. * @@ -902,8 +1336,8 @@ lsquic_stream_refuse_push (lsquic_stream_t *s); * @retval -1 This is not a pushed stream. */ int -lsquic_stream_push_info (const lsquic_stream_t *, uint32_t *ref_stream_id, - void **hdr_set); +lsquic_stream_push_info (const lsquic_stream_t *, + lsquic_stream_id_t *ref_stream_id, void **hdr_set); /** Return current priority of the stream */ unsigned lsquic_stream_priority (const lsquic_stream_t *s); @@ -923,21 +1357,22 @@ int lsquic_stream_set_priority (lsquic_stream_t *s, unsigned priority); lsquic_conn_t * lsquic_stream_conn(const lsquic_stream_t *s); lsquic_stream_t * -lsquic_conn_get_stream_by_id (lsquic_conn_t *c, uint32_t stream_id); +lsquic_conn_get_stream_by_id (lsquic_conn_t *c, lsquic_stream_id_t stream_id); /** Get connection ID */ -lsquic_cid_t +const lsquic_cid_t * lsquic_conn_id (const lsquic_conn_t *c); /** Get pointer to the engine */ lsquic_engine_t * lsquic_conn_get_engine (lsquic_conn_t *c); -int lsquic_conn_get_sockaddr(const lsquic_conn_t *c, +int +lsquic_conn_get_sockaddr(lsquic_conn_t *c, const struct sockaddr **local, const struct sockaddr **peer); struct lsquic_logger_if { - int (*vprintf)(void *logger_ctx, const char *fmt, va_list args); + int (*log_buf)(void *logger_ctx, const char *buf, size_t len); }; /** @@ -1058,31 +1493,98 @@ lsquic_global_cleanup (void); enum lsquic_version lsquic_conn_quic_version (const lsquic_conn_t *c); +/* Return keysize or -1 on error */ +int +lsquic_conn_crypto_keysize (const lsquic_conn_t *c); + +/* Return algorithm keysize or -1 on error */ +int +lsquic_conn_crypto_alg_keysize (const lsquic_conn_t *c); + +enum lsquic_crypto_ver +{ + LSQ_CRY_QUIC, + LSQ_CRY_TLSv13, +}; + +enum lsquic_crypto_ver +lsquic_conn_crypto_ver (const lsquic_conn_t *c); + +/* Return cipher or NULL on error */ +const char * +lsquic_conn_crypto_cipher (const lsquic_conn_t *c); + /** Translate string QUIC version to LSQUIC QUIC version representation */ enum lsquic_version lsquic_str2ver (const char *str, size_t len); +/** + * This function closes all mini connections and marks all full connection + * as going away. In server mode, this also causes the engine to stop + * creating new connections. + */ +void +lsquic_engine_cooldown (lsquic_engine_t *); + +struct ssl_st * +lsquic_hsk_getssl(lsquic_conn_t *conn); + /** * Get user-supplied context associated with the connection. */ lsquic_conn_ctx_t * -lsquic_conn_get_ctx (const lsquic_conn_t *c); +lsquic_conn_get_ctx (const lsquic_conn_t *); /** * Set user-supplied context associated with the connection. */ -void lsquic_conn_set_ctx (lsquic_conn_t *c, lsquic_conn_ctx_t *h); +void +lsquic_conn_set_ctx (lsquic_conn_t *, lsquic_conn_ctx_t *); /** * Get peer context associated with the connection. */ -void *lsquic_conn_get_peer_ctx( const lsquic_conn_t *lconn); +void * +lsquic_conn_get_peer_ctx (lsquic_conn_t *, const struct sockaddr *local_sa); /** * Abort connection. */ void -lsquic_conn_abort (lsquic_conn_t *c); +lsquic_conn_abort (lsquic_conn_t *); + +/** + * Helper function: convert list of versions as specified in the argument + * bitmask to string that can be included as argument to "v=" part of the + * Alt-Svc header. + * + * For example (1< "37,38" + * + * This is only applicable to Google QUIC versions. + */ +const char * +lsquic_get_alt_svc_versions (unsigned versions); + +/** + * Return a NULL-terminated list of HTTP/3 ALPNs, e.g "h3-17", "h3-18", "h3". + */ +const char *const * +lsquic_get_h3_alpns (unsigned versions); + +/** + * Returns true if provided buffer could be a valid handshake-stage packet, + * false otherwise. Do not call this function if a connection has already + * been established: it will return incorrect result. + */ +int +lsquic_is_valid_hs_packet (lsquic_engine_t *, const unsigned char *, size_t); + +/** + * Parse cid from packet stored in `buf' and store it to `cid'. Returns 0 + * on success and -1 on failure. + */ +int +lsquic_cid_from_packet (const unsigned char *, size_t bufsz, lsquic_cid_t *cid); /** * Returns true if there are connections to be processed, false otherwise. diff --git a/include/lsquic_types.h b/include/lsquic_types.h index 744d4eed9..ff7e4b1d1 100644 --- a/include/lsquic_types.h +++ b/include/lsquic_types.h @@ -9,10 +9,30 @@ #include +#define MAX_CID_LEN 20 +#define GQUIC_CID_LEN 8 + /** * Connection ID */ -typedef uint64_t lsquic_cid_t; +typedef struct lsquic_cid +{ + uint_fast8_t len; + union { + uint8_t buf[MAX_CID_LEN]; + uint64_t id; + } u_cid; +#define idbuf u_cid.buf +} +lsquic_cid_t; + + +#define LSQUIC_CIDS_EQ(a, b) ((a)->len == 8 ? \ + (b)->len == 8 && (a)->u_cid.id == (b)->u_cid.id : \ + (a)->len == (b)->len && 0 == memcmp((a)->idbuf, (b)->idbuf, (a)->len)) + +/** Stream ID */ +typedef uint64_t lsquic_stream_id_t; /** LSQUIC engine */ typedef struct lsquic_engine lsquic_engine_t; diff --git a/patches/boringssl-meds.patch b/patches/boringssl-meds.patch new file mode 100644 index 000000000..cd651df4b --- /dev/null +++ b/patches/boringssl-meds.patch @@ -0,0 +1,73 @@ +commit 46f967bfe44a80bb4bc0e7e9d4b03de3f91d03fb +Author: Dmitri Tikhonov +Date: Fri Feb 22 11:51:21 2019 -0500 + + Add support for QUIC's use of max_early_data_size + + The server MUST set this value to 0xFFFFFFFF in NewSessionTicket, + while the client should be able to examine it in order to verify + this requirement. + +diff --git a/include/openssl/ssl.h b/include/openssl/ssl.h +index 59b9eac..2e6cefb 100644 +--- a/include/openssl/ssl.h ++++ b/include/openssl/ssl.h +@@ -1744,6 +1744,11 @@ OPENSSL_EXPORT int SSL_SESSION_set_ticket(SSL_SESSION *session, + OPENSSL_EXPORT uint32_t + SSL_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *session); + ++// SSL_SESSION_get_max_early_data_size returns ticket max early data size of ++// |session| in bytes or zero if none was set. ++OPENSSL_EXPORT uint32_t ++SSL_SESSION_get_max_early_data_size(const SSL_SESSION *session); ++ + // SSL_SESSION_get0_cipher returns the cipher negotiated by the connection which + // established |session|. + // +diff --git a/ssl/internal.h b/ssl/internal.h +index 1116bad..98dcfa3 100644 +--- a/ssl/internal.h ++++ b/ssl/internal.h +@@ -2506,6 +2506,10 @@ struct SSL_CONFIG { + // kMaxEarlyDataSkipped in tls_record.c, which is measured in ciphertext. + static const size_t kMaxEarlyDataAccepted = 14336; + ++// kQUICMaxEarlyData is the value to which the max_early_data_size field ++// in a NewSessionTicket must be set when sent by a QUIC server. ++static const uint32_t kQUICMaxEarlyData = 0xffffffffu; ++ + UniquePtr ssl_cert_dup(CERT *cert); + void ssl_cert_clear_certs(CERT *cert); + bool ssl_set_cert(CERT *cert, UniquePtr buffer); +diff --git a/ssl/ssl_session.cc b/ssl/ssl_session.cc +index 927dd1b..cd5b5bb 100644 +--- a/ssl/ssl_session.cc ++++ b/ssl/ssl_session.cc +@@ -1025,6 +1025,10 @@ uint32_t SSL_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *session) { + return session->ticket_lifetime_hint; + } + ++uint32_t SSL_SESSION_get_max_early_data_size(const SSL_SESSION *session) { ++ return session->ticket_max_early_data; ++} ++ + const SSL_CIPHER *SSL_SESSION_get0_cipher(const SSL_SESSION *session) { + return session->cipher; + } +diff --git a/ssl/tls13_server.cc b/ssl/tls13_server.cc +index 562fecb..4edd0ef 100644 +--- a/ssl/tls13_server.cc ++++ b/ssl/tls13_server.cc +@@ -179,7 +179,11 @@ static bool add_new_session_tickets(SSL_HANDSHAKE *hs, bool *out_sent_tickets) { + } + session->ticket_age_add_valid = true; + if (ssl->enable_early_data) { +- session->ticket_max_early_data = kMaxEarlyDataAccepted; ++ if (ssl->quic_method == nullptr) { ++ session->ticket_max_early_data = kMaxEarlyDataAccepted; ++ } else { ++ session->ticket_max_early_data = kQUICMaxEarlyData; ++ } + } + + static_assert(kNumTickets < 256, "Too many tickets"); diff --git a/src/liblsquic/CMakeLists.txt b/src/liblsquic/CMakeLists.txt index a817e7dc3..0302edda3 100644 --- a/src/liblsquic/CMakeLists.txt +++ b/src/liblsquic/CMakeLists.txt @@ -1,67 +1,109 @@ # Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. SET(lsquic_STAT_SRCS + ls-qpack/lsqpack.c lsquic_alarmset.c - lsquic_conn.c - lsquic_full_conn.c + lsquic_arr.c + lsquic_attq.c + lsquic_bbr.c + lsquic_buf.c + lsquic_bw_sampler.c + lsquic_cfcw.c lsquic_chsk_stream.c - lsquic_engine.c - lsquic_parse_gquic_common.c - lsquic_parse_iquic_common.c - lsquic_parse_common.c - lsquic_parse_gquic_le.c - lsquic_parse_gquic_be.c - lsquic_packet_in.c - lsquic_packet_out.c + lsquic_conn.c + lsquic_crt_compress.c lsquic_crypto.c + lsquic_cubic.c + lsquic_di_error.c + lsquic_di_hash.c + lsquic_di_nocopy.c + lsquic_enc_sess_common.c + lsquic_enc_sess_ietf.c + lsquic_eng_hist.c + lsquic_engine.c + lsquic_ev_log.c + lsquic_frab_list.c + lsquic_frame_common.c + lsquic_frame_reader.c + lsquic_frame_writer.c + lsquic_full_conn.c + lsquic_full_conn_ietf.c + lsquic_global.c + lsquic_h3_prio.c lsquic_handshake.c + lsquic_hash.c + lsquic_hcsi_reader.c + lsquic_hcso_writer.c + lsquic_headers_stream.c + lsquic_hkdf.c + lsquic_hq.c + lsquic_hspack_valid.c + lsquic_http1x_if.c lsquic_logger.c lsquic_malo.c + lsquic_min_heap.c + lsquic_mini_conn.c + lsquic_mini_conn_ietf.c + lsquic_minmax.c lsquic_mm.c + lsquic_pacer.c + lsquic_packet_common.c + lsquic_packet_gquic.c + lsquic_packet_in.c + lsquic_packet_out.c + lsquic_packints.c + lsquic_parse_Q046.c + lsquic_parse_common.c + lsquic_parse_gquic_be.c + lsquic_parse_gquic_common.c + lsquic_parse_ietf_v1.c + lsquic_parse_iquic_common.c + lsquic_pr_queue.c + lsquic_purga.c + lsquic_qdec_hdl.c + lsquic_qenc_hdl.c + lsquic_qlog.c lsquic_rechist.c lsquic_rtt.c lsquic_send_ctl.c lsquic_senhist.c - lsquic_cfcw.c + lsquic_set.c lsquic_sfcw.c + lsquic_shsk_stream.c + lsquic_spi.c + lsquic_stock_shi.c + lsquic_str.c lsquic_stream.c + lsquic_tokgen.c + lsquic_trans_params.c lsquic_util.c - lsquic_cubic.c - lsquic_set.c - lsquic_headers_stream.c - lsquic_frame_reader.c - lsquic_frame_writer.c - lsquic_crt_compress.c - lsquic_conn_hash.c - lsquic_eng_hist.c - lsquic_spi.c - lsquic_di_nocopy.c - lsquic_di_hash.c - lsquic_di_error.c - lsquic_global.c - lsquic_packet_common.c - lsquic_qlog.c - lsquic_ev_log.c - lsquic_frame_common.c - lsquic_packints.c + lsquic_varint.c lsquic_version.c - lsquic_pacer.c - lsquic_attq.c - lsquic_str.c - lsquic_arr.c - lsquic_hash.c - lsquic_xxhash.c - lsquic_buf.c - lsquic_min_heap.c - ../lshpack/lshpack.c - lsquic_parse_Q044.c - lsquic_parse_Q046.c - lsquic_http1x_if.c - ) +) + +set_source_files_properties(ls-qpack/lsqpack.c PROPERTIES COMPILE_FLAGS -Wno-uninitialized) +include_directories(ls-qpack) + +IF(PROJECT_NAME STREQUAL "openlitespeed") + INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src/spdy) +ELSE() + SET(lsquic_STAT_SRCS ${lsquic_STAT_SRCS} + lsquic_xxhash.c + ../lshpack/lshpack.c + ) +ENDIF() +ADD_CUSTOM_COMMAND( + OUTPUT ${PROJECT_SOURCE_DIR}/src/liblsquic/lsquic_versions_to_string.c + COMMAND ${PROJECT_SOURCE_DIR}/src/liblsquic/gen-verstrs + ARGS ${PROJECT_SOURCE_DIR}/include/lsquic.h ${PROJECT_SOURCE_DIR}/src/liblsquic/lsquic_versions_to_string.c + DEPENDS ./gen-verstrs ${PROJECT_SOURCE_DIR}/include/lsquic.h +) +SET(lsquic_STAT_SRCS ${lsquic_STAT_SRCS} lsquic_versions_to_string.c) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DXXH_HEADER_NAME=\\\"lsquic_xxhash.h\\\"") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DLSQPACK_ENC_LOGGER_HEADER=\\\"lsquic_qpack_enc_logger.h\\\"") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DLSQPACK_DEC_LOGGER_HEADER=\\\"lsquic_qpack_dec_logger.h\\\"") add_library(lsquic STATIC ${lsquic_STAT_SRCS} ) -link_directories(${PROJECT_SOURCE_DIR}/ssl/ /usr/local/lib) diff --git a/src/liblsquic/gen-verstrs b/src/liblsquic/gen-verstrs new file mode 100755 index 000000000..3e0894acb --- /dev/null +++ b/src/liblsquic/gen-verstrs @@ -0,0 +1,122 @@ +#!/usr/bin/env perl +# +# Generate C file that contains version strings + +($header # This is lsquic.h that contains version enum which we parse + , $outfile # This is destination C file + ) = @ARGV; + +open HEADER, $header + or die "cannot open $header for reading: $!"; +open OUT, ">$outfile" + or die "cannot open $outfile for writing: $!"; + +while (
) { + if (/^enum lsquic_version$/ .. /^}/) { + if (/^\s*(LSQVER_0*(\d+)),\s*$/ && $1 ne 'LSQVER_098') { + push @enums, $1; + push @versions, $2; + } + if (/^\s*LSQVER_ID(\d+)\b/) { + push @draft_versions, $1; + } + } +} + +close HEADER; + +$timestamp = localtime; + +print OUT < + +#include "lsquic.h" + +struct lsquic_engine; + +static const char *const versions_to_string[ 1 << N_LSQVER ] = { +C_CODE + +$max_mask = (1 << @versions) - 1; + +for ($mask = 0; $mask <= $max_mask; ++$mask) { + my @indexes; + for ($i = 0; $i < @versions; ++$i) { + if ($mask & (1 << $i)) { + push @indexes, $i; + } + } + print OUT " [", + join('|', map "(1<<$_)", @enums[@indexes]) || 0, + "] = \"", + join(',', @versions[@indexes]), + "\",\n"; +} + +$enums = join '|', map "(1<<$_)", sort @enums; + +print OUT <<"C_CODE"; +}; + + +const char * +lsquic_get_alt_svc_versions (unsigned versions) +{ + /* Limit to versions in versions_to_string: */ + versions &= ($enums); + return versions_to_string[ versions ]; +} + +C_CODE + + +$draft_version_count = @draft_versions; +$draft_version_count_and_null = $draft_version_count + 1; + +print OUT <<"C_CODE"; +static const struct { + unsigned versions; + const char *h3_alpns[$draft_version_count_and_null]; +} vers_2_h3_alnps[] = { +C_CODE + +for ($i = 0; $i < (1 << @draft_versions); ++$i) +{ + my @vers; + for ($j = 0; $j < @draft_versions; ++$j) + { + if ($i & (1 << $j)) + { + push @vers, $draft_versions[$j]; + } + } + print OUT " {", join("|", 0, map "(1< #include "lsquic_types.h" +#include "lsquic_packet_common.h" #include "lsquic_alarmset.h" #define LSQUIC_LOGGER_MODULE LSQLM_ALARMSET -#define LSQUIC_LOG_CONN_ID alset->as_cid +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(alset->as_conn) #include "lsquic_logger.h" void -lsquic_alarmset_init (lsquic_alarmset_t *alset, lsquic_cid_t cid) +lsquic_alarmset_init (lsquic_alarmset_t *alset, const struct lsquic_conn *conn) { - alset->as_cid = cid; + alset->as_conn = conn; alset->as_armed_set = 0; } @@ -31,6 +32,24 @@ lsquic_alarmset_init_alarm (lsquic_alarmset_t *alset, enum alarm_id al_id, } +static const char *const lsquic_alid2str[] = +{ + [AL_HANDSHAKE] = "HANDSHAKE", + [AL_RETX_INIT] = "RETX_INIT", + [AL_RETX_HSK] = "RETX_HSK", + [AL_RETX_APP] = "RETX_APP", + [AL_PING] = "PING", + [AL_IDLE] = "IDLE", + [AL_ACK_INIT] = "ACK_INIT", + [AL_ACK_HSK] = "ACK_HSK", + [AL_ACK_APP] = "ACK_APP", + [AL_RET_CIDS] = "RET_CIDS", + [AL_CID_THROT] = "CID_THROT", + [AL_PATH_CHAL_0] = "PATH_CHAL_0", + [AL_PATH_CHAL_1] = "PATH_CHAL_1", +}; + + void lsquic_alarmset_ring_expired (lsquic_alarmset_t *alset, lsquic_time_t now) { @@ -45,8 +64,8 @@ lsquic_alarmset_ring_expired (lsquic_alarmset_t *alset, lsquic_time_t now) if (alset->as_expiry[al_id] < now) { alset->as_armed_set &= ~(1 << al_id); - LSQ_INFO("ring expired alarm %d", al_id); - alset->as_alarms[al_id].callback( + LSQ_INFO("ring expired %s alarm", lsquic_alid2str[al_id]); + alset->as_alarms[al_id].callback(al_id, alset->as_alarms[al_id].cb_ctx, alset->as_expiry[al_id], now); } diff --git a/src/liblsquic/lsquic_alarmset.h b/src/liblsquic/lsquic_alarmset.h index c85da8045..9ca46a293 100644 --- a/src/liblsquic/lsquic_alarmset.h +++ b/src/liblsquic/lsquic_alarmset.h @@ -8,7 +8,10 @@ #include "lsquic_int_types.h" -typedef void (*lsquic_alarm_cb_f)(void *cb_ctx, +enum alarm_id; +struct lsquic_conn; + +typedef void (*lsquic_alarm_cb_f)(enum alarm_id, void *cb_ctx, lsquic_time_t expiry, lsquic_time_t now); typedef struct lsquic_alarm { @@ -19,33 +22,51 @@ typedef struct lsquic_alarm { enum alarm_id { AL_HANDSHAKE, - AL_RETX, - AL_ACK, + AL_RETX_INIT, + AL_RETX_HSK = AL_RETX_INIT + PNS_HSK, + AL_RETX_APP = AL_RETX_INIT + PNS_APP, AL_PING, AL_IDLE, + AL_ACK_INIT, + AL_ACK_HSK = AL_ACK_INIT + PNS_HSK, + AL_ACK_APP = AL_ACK_INIT + PNS_APP, + AL_RET_CIDS, + AL_CID_THROT, + AL_PATH_CHAL, + AL_PATH_CHAL_0 = AL_PATH_CHAL, + AL_PATH_CHAL_1, MAX_LSQUIC_ALARMS }; enum alarm_id_bit { ALBIT_HANDSHAKE = 1 << AL_HANDSHAKE, - ALBIT_RETX = 1 << AL_RETX, - ALBIT_ACK = 1 << AL_ACK, + ALBIT_RETX_INIT = 1 << AL_RETX_INIT, + ALBIT_RETX_HSK = 1 << AL_RETX_HSK, + ALBIT_RETX_APP = 1 << AL_RETX_APP, + ALBIT_ACK_APP = 1 << AL_ACK_APP, + ALBIT_ACK_INIT = 1 << AL_ACK_INIT, + ALBIT_ACK_HSK = 1 << AL_ACK_HSK, ALBIT_PING = 1 << AL_PING, ALBIT_IDLE = 1 << AL_IDLE, + ALBIT_RET_CIDS = 1 << AL_RET_CIDS, + ALBIT_CID_THROT = 1 << AL_CID_THROT, + ALBIT_PATH_CHAL = 1 << AL_PATH_CHAL, + ALBIT_PATH_CHAL_0 = 1 << AL_PATH_CHAL_0, + ALBIT_PATH_CHAL_1 = 1 << AL_PATH_CHAL_1, }; typedef struct lsquic_alarmset { enum alarm_id_bit as_armed_set; lsquic_time_t as_expiry[MAX_LSQUIC_ALARMS]; - lsquic_cid_t as_cid; /* Used for logging */ + const struct lsquic_conn *as_conn; /* Used for logging */ struct lsquic_alarm as_alarms[MAX_LSQUIC_ALARMS]; } lsquic_alarmset_t; void -lsquic_alarmset_init (lsquic_alarmset_t *, lsquic_cid_t); +lsquic_alarmset_init (lsquic_alarmset_t *, const struct lsquic_conn *); void lsquic_alarmset_init_alarm (lsquic_alarmset_t *, enum alarm_id, @@ -63,6 +84,9 @@ lsquic_alarmset_init_alarm (lsquic_alarmset_t *, enum alarm_id, #define lsquic_alarmset_is_set(alarmset, al_id) \ ((alarmset)->as_armed_set & (1 << (al_id))) +#define lsquic_alarmset_are_set(alarmset, flags) \ + ((alarmset)->as_armed_set & (flags)) + /* Timers "fire," alarms "ring." */ void lsquic_alarmset_ring_expired (lsquic_alarmset_t *, lsquic_time_t now); diff --git a/src/liblsquic/lsquic_attq.c b/src/liblsquic/lsquic_attq.c index a537b1eb5..ee5bb8524 100644 --- a/src/liblsquic/lsquic_attq.c +++ b/src/liblsquic/lsquic_attq.c @@ -13,12 +13,14 @@ #ifdef WIN32 #include #endif +#include #include "lsquic.h" #include "lsquic_types.h" #include "lsquic_int_types.h" #include "lsquic_attq.h" #include "lsquic_malo.h" +#include "lsquic_hash.h" #include "lsquic_conn.h" @@ -212,7 +214,6 @@ attq_remove (struct attq *q, struct lsquic_conn *conn) assert(conn->cn_attq_elem == el); conn->cn_attq_elem = NULL; - lsquic_malo_put(el); q->aq_heap[ idx ] = q->aq_heap[ --q->aq_nelem ]; q->aq_heap[ idx ]->ae_heap_idx = idx; @@ -229,6 +230,7 @@ attq_remove (struct attq *q, struct lsquic_conn *conn) } else if (q->aq_nelem > 1 && idx < q->aq_nelem) attq_heapify(q, idx); + lsquic_malo_put(el); attq_verify(q); } diff --git a/src/liblsquic/lsquic_bbr.c b/src/liblsquic/lsquic_bbr.c new file mode 100644 index 000000000..0a8781d34 --- /dev/null +++ b/src/liblsquic/lsquic_bbr.c @@ -0,0 +1,1050 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE.chrome file. + +#include +#include +#include +#include +#include +#include + +#include "lsquic.h" +#include "lsquic_int_types.h" +#include "lsquic_cong_ctl.h" +#include "lsquic_minmax.h" +#include "lsquic_packet_common.h" +#include "lsquic_packet_out.h" +#include "lsquic_bw_sampler.h" +#include "lsquic_bbr.h" +#include "lsquic_hash.h" +#include "lsquic_conn.h" +#include "lsquic_sfcw.h" +#include "lsquic_conn_flow.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_stream.h" +#include "lsquic_rtt.h" +#include "lsquic_conn_public.h" +#include "lsquic_util.h" +#include "lsquic_malo.h" + +#define LSQUIC_LOGGER_MODULE LSQLM_BBR +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(bbr->bbr_conn) +#include "lsquic_logger.h" + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + +#define ms(val_) ((val_) * 1000) +#define sec(val_) ((val_) * 1000 * 1000) + +// Default maximum packet size used in the Linux TCP implementation. +// Used in QUIC for congestion window computations in bytes. +#define kDefaultTCPMSS 1460 +#define kMaxSegmentSize kDefaultTCPMSS + +// Constants based on TCP defaults. +// The minimum CWND to ensure delayed acks don't reduce bandwidth measurements. +// Does not inflate the pacing rate. +#define kDefaultMinimumCongestionWindow (4 * kDefaultTCPMSS) + +// The gain used for the STARTUP, equal to 2/ln(2). +#define kDefaultHighGain 2.885f + +// The newly derived gain for STARTUP, equal to 4 * ln(2) +#define kDerivedHighGain 2.773f + +// The newly derived CWND gain for STARTUP, 2. +#define kDerivedHighCWNDGain 2.0f + +// The gain used in STARTUP after loss has been detected. +// 1.5 is enough to allow for 25% exogenous loss and still observe a 25% growth +// in measured bandwidth. +#define kStartupAfterLossGain 1.5f + +// We match SPDY's use of 32 (since we'd compete with SPDY). +#define kInitialCongestionWindow 32 + +/* Taken from send_algorithm_interface.h */ +#define kDefaultMaxCongestionWindowPackets 2000 + +// The time after which the current min_rtt value expires. +#define kMinRttExpiry sec(10) + +// Coefficient to determine if a new RTT is sufficiently similar to min_rtt that +// we don't need to enter PROBE_RTT. +#define kSimilarMinRttThreshold 1.125f + +// If the bandwidth does not increase by the factor of |kStartupGrowthTarget| +// within |kRoundTripsWithoutGrowthBeforeExitingStartup| rounds, the connection +// will exit the STARTUP mode. +#define kStartupGrowthTarget 1.25 + +#define kRoundTripsWithoutGrowthBeforeExitingStartup 3 + +#define startup_rate_reduction_multiplier_ 0 + +// The cycle of gains used during the PROBE_BW stage. +static const float kPacingGain[] = {1.25, 0.75, 1, 1, 1, 1, 1, 1}; + +// The length of the gain cycle. +static const size_t kGainCycleLength = sizeof(kPacingGain) + / sizeof(kPacingGain[0]); + +// Coefficient of target congestion window to use when basing PROBE_RTT on BDP. +#define kModerateProbeRttMultiplier 0.75 + +// The maximum packet size of any QUIC packet over IPv6, based on ethernet's max +// size, minus the IP and UDP headers. IPv6 has a 40 byte header, UDP adds an +// additional 8 bytes. This is a total overhead of 48 bytes. Ethernet's +// max packet size is 1500 bytes, 1500 - 48 = 1452. +#define kMaxV6PacketSize 1452 +// The maximum packet size of any QUIC packet over IPv4. +// 1500(Ethernet) - 20(IPv4 header) - 8(UDP header) = 1472. +#define kMaxV4PacketSize 1472 +// The maximum incoming packet size allowed. +#define kMaxIncomingPacketSize kMaxV4PacketSize +// The maximum outgoing packet size allowed. +#define kMaxOutgoingPacketSize kMaxV6PacketSize + +// The minimum time the connection can spend in PROBE_RTT mode. +#define kProbeRttTime ms(200) + +/* FLAG* are from net/quic/quic_flags_list.h */ + +// When in STARTUP and recovery, do not add bytes_acked to QUIC BBR's CWND in +// CalculateCongestionWindow() +#define FLAGS_quic_bbr_no_bytes_acked_in_startup_recovery 0 + +// When true, ensure BBR allows at least one MSS to be sent in response to an +// ACK in packet conservation. +#define FLAG_quic_bbr_one_mss_conservation 0 + +/* From net/quic/quic_flags_list.h */ +#define kCwndGain 2.0 + + +static uint64_t lsquic_bbr_get_cwnd (void *); + + +static const char *const mode2str[] = +{ + [BBR_MODE_STARTUP] = "STARTUP", + [BBR_MODE_DRAIN] = "DRAIN", + [BBR_MODE_PROBE_BW] = "PROBE_BW", + [BBR_MODE_PROBE_RTT] = "PROBE_RTT", +}; + + +static void +set_mode (struct lsquic_bbr *bbr, enum bbr_mode mode) +{ + if (bbr->bbr_mode != mode) + { + LSQ_DEBUG("mode change %s -> %s", mode2str[bbr->bbr_mode], + mode2str[mode]); + bbr->bbr_mode = mode; + } + else + LSQ_DEBUG("mode remains %s", mode2str[mode]); +} + + +static void +set_startup_values (struct lsquic_bbr *bbr) +{ + bbr->bbr_pacing_gain = bbr->bbr_high_gain; + bbr->bbr_cwnd_gain = bbr->bbr_high_cwnd_gain; +} + + +static void +lsquic_bbr_init (void *cong_ctl, const struct lsquic_conn_public *conn_pub, + enum quic_ft_bit retx_frames) +{ + struct lsquic_bbr *const bbr = cong_ctl; + bbr->bbr_conn = conn_pub->lconn; + lsquic_bw_sampler_init(&bbr->bbr_bw_sampler, bbr->bbr_conn, retx_frames); + + bbr->bbr_rtt_stats = &conn_pub->rtt_stats; + bbr->bbr_mode = BBR_MODE_STARTUP; + bbr->bbr_round_count = 0; + minmax_init(&bbr->bbr_max_bandwidth, 10); + minmax_init(&bbr->bbr_max_ack_height, 10); + bbr->bbr_aggregation_epoch_bytes = 0; + bbr->bbr_aggregation_epoch_start_time = 0; + bbr->bbr_min_rtt = 0; + bbr->bbr_min_rtt_timestamp = 0; + bbr->bbr_init_cwnd = kInitialCongestionWindow * kDefaultTCPMSS; + bbr->bbr_cwnd = kInitialCongestionWindow * kDefaultTCPMSS; + bbr->bbr_max_cwnd = kDefaultMaxCongestionWindowPackets * kDefaultTCPMSS; + bbr->bbr_min_cwnd = kDefaultMinimumCongestionWindow; + bbr->bbr_high_gain = kDefaultHighGain; + bbr->bbr_high_cwnd_gain = kDefaultHighGain; + bbr->bbr_drain_gain = 1.0 / kDefaultHighGain; + bbr->bbr_pacing_rate = BW_ZERO(); + bbr->bbr_pacing_gain = 1.0; + bbr->bbr_cwnd_gain = 1.0; + bbr->bbr_num_startup_rtts = kRoundTripsWithoutGrowthBeforeExitingStartup; + bbr->bbr_flags &= ~BBR_FLAG_EXIT_STARTUP_ON_LOSS; + bbr->bbr_cycle_current_offset = 0; + bbr->bbr_last_cycle_start = 0; + bbr->bbr_flags &= ~BBR_FLAG_IS_AT_FULL_BANDWIDTH; + bbr->bbr_round_wo_bw_gain = 0; + bbr->bbr_bw_at_last_round = BW_ZERO(); + bbr->bbr_flags &= ~BBR_FLAG_EXITING_QUIESCENCE; + bbr->bbr_exit_probe_rtt_at = 0; + bbr->bbr_flags &= ~BBR_FLAG_PROBE_RTT_ROUND_PASSED; + bbr->bbr_flags &= ~BBR_FLAG_LAST_SAMPLE_APP_LIMITED; + bbr->bbr_flags &= ~BBR_FLAG_HAS_NON_APP_LIMITED; + bbr->bbr_flags &= ~BBR_FLAG_FLEXIBLE_APP_LIMITED; + + set_startup_values(bbr); + + LSQ_DEBUG("initialized"); +} + + +static lsquic_time_t +get_min_rtt (const struct lsquic_bbr *bbr) +{ + lsquic_time_t min_rtt; + + if (bbr->bbr_min_rtt) + return bbr->bbr_min_rtt; + else + { + min_rtt = lsquic_rtt_stats_get_min_rtt(bbr->bbr_rtt_stats); + if (min_rtt == 0) + min_rtt = 25000; + return min_rtt; + } +} + + +static uint64_t +lsquic_bbr_pacing_rate (void *cong_ctl, int in_recovery) +{ + struct lsquic_bbr *const bbr = cong_ctl; + lsquic_time_t min_rtt; + struct bandwidth bw; + + if (!BW_IS_ZERO(&bbr->bbr_pacing_rate)) + bw = bbr->bbr_pacing_rate; + else + { + min_rtt = get_min_rtt(bbr); + bw = BW_FROM_BYTES_AND_DELTA(bbr->bbr_init_cwnd, min_rtt); + bw = BW_TIMES(&bw, bbr->bbr_high_cwnd_gain); + } + + return BW_TO_BYTES_PER_SEC(&bw); +} + + +/* BbrSender::GetTargetCongestionWindow */ +static uint64_t +get_target_cwnd (const struct lsquic_bbr *bbr, float gain) +{ + struct bandwidth bw; + uint64_t bdp, cwnd; + + bw = BW(minmax_get(&bbr->bbr_max_bandwidth)); + bdp = get_min_rtt(bbr) * BW_TO_BYTES_PER_SEC(&bw) / 1000000; + cwnd = gain * bdp; + + // BDP estimate will be zero if no bandwidth samples are available yet. + if (cwnd == 0) + cwnd = gain * bbr->bbr_init_cwnd; + + return MAX(cwnd, bbr->bbr_min_cwnd); +} + + +/* See BbrSender::IsPipeSufficientlyFull */ +static int +is_pipe_sufficiently_full (struct lsquic_bbr *bbr, uint64_t bytes_in_flight) +{ + // See if we need more bytes in flight to see more bandwidth. + if (bbr->bbr_mode == BBR_MODE_STARTUP) + // STARTUP exits if it doesn't observe a 25% bandwidth increase, so + // the CWND must be more than 25% above the target. + return bytes_in_flight >= get_target_cwnd(bbr, 1.5); + else if (bbr->bbr_pacing_gain > 1) + // Super-unity PROBE_BW doesn't exit until 1.25 * BDP is achieved. + return bytes_in_flight >= get_target_cwnd(bbr, bbr->bbr_pacing_gain); + else + // If bytes_in_flight are above the target congestion window, it should + // be possible to observe the same or more bandwidth if it's available. + return bytes_in_flight >= get_target_cwnd(bbr, 1.1); +} + + +/* See BbrSender::OnApplicationLimited */ +static void +lsquic_bbr_was_quiet (void *cong_ctl, lsquic_time_t now, + uint64_t bytes_in_flight) +{ + struct lsquic_bbr *const bbr = cong_ctl; + uint64_t cwnd; + + cwnd = lsquic_bbr_get_cwnd(cong_ctl); + if (bytes_in_flight >= cwnd) + return; + if ((bbr->bbr_flags & BBR_FLAG_FLEXIBLE_APP_LIMITED) + && is_pipe_sufficiently_full(bbr, bytes_in_flight)) + return; + + bbr->bbr_flags |= BBR_FLAG_APP_LIMITED_SINCE_LAST_PROBE_RTT; + lsquic_bw_sampler_app_limited(&bbr->bbr_bw_sampler); + LSQ_DEBUG("becoming application-limited. Last sent packet: %"PRIu64"; " + "CWND: %"PRIu64, bbr->bbr_last_sent_packno, cwnd); +} + + +static void +lsquic_bbr_ack (void *cong_ctl, struct lsquic_packet_out *packet_out, + unsigned packet_sz, lsquic_time_t now_time, int app_limited) +{ + struct lsquic_bbr *const bbr = cong_ctl; + struct bw_sample *sample; + + assert(bbr->bbr_flags & BBR_FLAG_IN_ACK); + + sample = lsquic_bw_sampler_packet_acked(&bbr->bbr_bw_sampler, packet_out, + bbr->bbr_ack_state.ack_time); + if (sample) + TAILQ_INSERT_TAIL(&bbr->bbr_ack_state.samples, sample, next); + + if (is_valid_packno(bbr->bbr_ack_state.max_packno)) + /* We assume packet numbers are ordered */ + assert(packet_out->po_packno > bbr->bbr_ack_state.max_packno); + bbr->bbr_ack_state.max_packno = packet_out->po_packno; + bbr->bbr_ack_state.acked_bytes += packet_sz; +} + + +static void +lsquic_bbr_sent (void *cong_ctl, struct lsquic_packet_out *packet_out, + uint64_t in_flight) +{ + struct lsquic_bbr *const bbr = cong_ctl; + + if (!(packet_out->po_flags & PO_MINI)) + lsquic_bw_sampler_packet_sent(&bbr->bbr_bw_sampler, packet_out, + in_flight); + + /* Obviously we make an assumption that sent packet number are always + * increasing. + */ + bbr->bbr_last_sent_packno = packet_out->po_packno; +} + + +static void +lsquic_bbr_lost (void *cong_ctl, struct lsquic_packet_out *packet_out, + unsigned packet_sz) +{ + struct lsquic_bbr *const bbr = cong_ctl; + + lsquic_bw_sampler_packet_lost(&bbr->bbr_bw_sampler, packet_out); + bbr->bbr_ack_state.has_losses = 1; + bbr->bbr_ack_state.lost_bytes += packet_sz; +} + + +static void +lsquic_bbr_begin_ack (void *cong_ctl, lsquic_time_t ack_time, uint64_t in_flight) +{ + struct lsquic_bbr *const bbr = cong_ctl; + + assert(!(bbr->bbr_flags & BBR_FLAG_IN_ACK)); + bbr->bbr_flags |= BBR_FLAG_IN_ACK; + memset(&bbr->bbr_ack_state, 0, sizeof(bbr->bbr_ack_state)); + TAILQ_INIT(&bbr->bbr_ack_state.samples); + bbr->bbr_ack_state.ack_time = ack_time; + bbr->bbr_ack_state.max_packno = UINT64_MAX; + bbr->bbr_ack_state.in_flight = in_flight; + bbr->bbr_ack_state.total_bytes_acked_before + = lsquic_bw_sampler_total_acked(&bbr->bbr_bw_sampler); +} + + +/* Based on BbrSender::ShouldExtendMinRttExpiry() */ +static int +should_extend_min_rtt_expiry (const struct lsquic_bbr *bbr) +{ + int increased_since_last_probe; + + if ((bbr->bbr_flags & (BBR_FLAG_APP_LIMITED_SINCE_LAST_PROBE_RTT + |BBR_FLAG_PROBE_RTT_DISABLED_IF_APP_LIMITED)) + == (BBR_FLAG_APP_LIMITED_SINCE_LAST_PROBE_RTT + |BBR_FLAG_PROBE_RTT_DISABLED_IF_APP_LIMITED)) + // Extend the current min_rtt if we've been app limited recently. + return 1; + + increased_since_last_probe = bbr->bbr_min_rtt_since_last_probe + > bbr->bbr_min_rtt * kSimilarMinRttThreshold; + if ((bbr->bbr_flags & (BBR_FLAG_APP_LIMITED_SINCE_LAST_PROBE_RTT + |BBR_FLAG_PROBE_RTT_SKIPPED_IF_SIMILAR_RTT)) + == (BBR_FLAG_APP_LIMITED_SINCE_LAST_PROBE_RTT + |BBR_FLAG_PROBE_RTT_SKIPPED_IF_SIMILAR_RTT) + && !increased_since_last_probe) + // Extend the current min_rtt if we've been app limited recently and an + // rtt has been measured in that time that's less than 12.5% more than + // the current min_rtt. + return 1; + + return 0; +} + + +/* Based on BbrSender::UpdateBandwidthAndMinRtt */ +/* Returns true if min RTT expired, false otherwise */ +static int +update_bandwidth_and_min_rtt (struct lsquic_bbr *bbr) +{ + struct bw_sample *sample, *next_sample; + uint64_t sample_min_rtt; + int min_rtt_expired; + + sample_min_rtt = UINT64_MAX; + for (sample = TAILQ_FIRST(&bbr->bbr_ack_state.samples); sample; + sample = next_sample) + { + next_sample = TAILQ_NEXT(sample, next); + + if (sample->is_app_limited) + bbr->bbr_flags |= BBR_FLAG_LAST_SAMPLE_APP_LIMITED; + else + { + bbr->bbr_flags &= ~BBR_FLAG_LAST_SAMPLE_APP_LIMITED; + bbr->bbr_flags |= BBR_FLAG_HAS_NON_APP_LIMITED; + } + + if (sample_min_rtt == UINT64_MAX || sample->rtt < sample_min_rtt) + sample_min_rtt = sample->rtt; + + if (!sample->is_app_limited + || BW_VALUE(&sample->bandwidth) + > minmax_get(&bbr->bbr_max_bandwidth)) + minmax_upmax(&bbr->bbr_max_bandwidth, bbr->bbr_round_count, + BW_VALUE(&sample->bandwidth)); + + lsquic_malo_put(sample); + } + + if (sample_min_rtt == UINT64_MAX) + return 0; + + bbr->bbr_min_rtt_since_last_probe + = MIN(bbr->bbr_min_rtt_since_last_probe, sample_min_rtt); + + min_rtt_expired = bbr->bbr_min_rtt != 0 && (bbr->bbr_ack_state.ack_time + > bbr->bbr_min_rtt_timestamp + kMinRttExpiry); + if (min_rtt_expired || sample_min_rtt < bbr->bbr_min_rtt + || 0 == bbr->bbr_min_rtt) + { + if (min_rtt_expired && should_extend_min_rtt_expiry(bbr)) + { + LSQ_DEBUG("min rtt expiration extended, stay at: %"PRIu64, + bbr->bbr_min_rtt); + min_rtt_expired = 0; + } + else + { + LSQ_DEBUG("min rtt updated: %"PRIu64" -> %"PRIu64, + bbr->bbr_min_rtt, sample_min_rtt); + bbr->bbr_min_rtt = sample_min_rtt; + } + bbr->bbr_min_rtt_timestamp = bbr->bbr_ack_state.ack_time; + bbr->bbr_min_rtt_since_last_probe = UINT64_MAX; + bbr->bbr_flags &= ~BBR_FLAG_APP_LIMITED_SINCE_LAST_PROBE_RTT; + } + + return min_rtt_expired; +} + + +/* Based on BbrSender::UpdateRecoveryState() */ +static void +update_recovery_state (struct lsquic_bbr *bbr, int is_round_start) +{ + // Exit recovery when there are no losses for a round. + if (bbr->bbr_ack_state.has_losses) + bbr->bbr_end_recovery_at = bbr->bbr_last_sent_packno; + + switch (bbr->bbr_recovery_state) + { + case BBR_RS_NOT_IN_RECOVERY: + // Enter conservation on the first loss. + if (bbr->bbr_ack_state.has_losses) + { + bbr->bbr_recovery_state = BBR_RS_CONSERVATION; + // This will cause the |bbr_recovery_window| to be set to the + // correct value in CalculateRecoveryWindow(). + bbr->bbr_recovery_window = 0; + // Since the conservation phase is meant to be lasting for a whole + // round, extend the current round as if it were started right now. + bbr->bbr_current_round_trip_end = bbr->bbr_last_sent_packno; + } + break; + case BBR_RS_CONSERVATION: + if (is_round_start) + bbr->bbr_recovery_state = BBR_RS_GROWTH; + /* Fall-through */ + case BBR_RS_GROWTH: + // Exit recovery if appropriate. + if (!bbr->bbr_ack_state.has_losses + && bbr->bbr_ack_state.max_packno > bbr->bbr_end_recovery_at) + bbr->bbr_recovery_state = BBR_RS_NOT_IN_RECOVERY; + break; + } +} + + +static uint64_t +update_ack_aggregation_bytes (struct lsquic_bbr *bbr, + uint64_t newly_acked_bytes) +{ + const lsquic_time_t ack_time = bbr->bbr_ack_state.ack_time; + uint64_t expected_bytes_acked, diff; + + // Compute how many bytes are expected to be delivered, assuming max + // bandwidth is correct. + expected_bytes_acked = minmax_get(&bbr->bbr_max_bandwidth) + * (ack_time - bbr->bbr_aggregation_epoch_start_time); + + // Reset the current aggregation epoch as soon as the ack arrival rate is + // less than or equal to the max bandwidth. + if (bbr->bbr_aggregation_epoch_bytes <= expected_bytes_acked) + { + // Reset to start measuring a new aggregation epoch. + bbr->bbr_aggregation_epoch_bytes = newly_acked_bytes; + bbr->bbr_aggregation_epoch_start_time = ack_time; + return 0; + } + + // Compute how many extra bytes were delivered vs max bandwidth. + // Include the bytes most recently acknowledged to account for stretch acks. + bbr->bbr_aggregation_epoch_bytes += newly_acked_bytes; + diff = bbr->bbr_aggregation_epoch_bytes - expected_bytes_acked; + minmax_upmax(&bbr->bbr_max_ack_height, bbr->bbr_round_count, diff); + return diff; +} + + +/* See BbrSender::UpdateGainCyclePhase() */ +static void +update_gain_cycle_phase (struct lsquic_bbr *bbr, uint64_t bytes_in_flight) +{ + const uint64_t prior_in_flight = bbr->bbr_ack_state.in_flight; + const lsquic_time_t now = bbr->bbr_ack_state.ack_time; + // In most cases, the cycle is advanced after an RTT passes. + int should_advance_gain_cycling + = now - bbr->bbr_last_cycle_start > get_min_rtt(bbr); + + // If the pacing gain is above 1.0, the connection is trying to probe the + // bandwidth by increasing the number of bytes in flight to at least + // pacing_gain * BDP. Make sure that it actually reaches the target, as + // long as there are no losses suggesting that the buffers are not able to + // hold that much. + if (bbr->bbr_pacing_gain > 1.0 + && !bbr->bbr_ack_state.has_losses + && prior_in_flight < get_target_cwnd(bbr, bbr->bbr_pacing_gain)) + should_advance_gain_cycling = 0; + + /* Several optimizations are possible here: "else if" instead of "if", as + * well as not calling get_target_cwnd() if `should_advance_gain_cycling' + * is already set to the target value. + */ + + // If pacing gain is below 1.0, the connection is trying to drain the extra + // queue which could have been incurred by probing prior to it. If the + // number of bytes in flight falls down to the estimated BDP value earlier, + // conclude that the queue has been successfully drained and exit this cycle + // early. + if (bbr->bbr_pacing_gain < 1.0 + && bytes_in_flight <= get_target_cwnd(bbr, 1)) + should_advance_gain_cycling = 1; + + if (should_advance_gain_cycling) + { + bbr->bbr_cycle_current_offset = + (bbr->bbr_cycle_current_offset + 1) % kGainCycleLength; + bbr->bbr_last_cycle_start = now; + // Stay in low gain mode until the target BDP is hit. Low gain mode + // will be exited immediately when the target BDP is achieved. + if ((bbr->bbr_flags & BBR_FLAG_DRAIN_TO_TARGET) + && bbr->bbr_pacing_gain < 1 + && kPacingGain[bbr->bbr_cycle_current_offset] == 1 + && bytes_in_flight > get_target_cwnd(bbr, 1)) + return; + bbr->bbr_pacing_gain = kPacingGain[bbr->bbr_cycle_current_offset]; + LSQ_DEBUG("advanced gain cycle, pacing gain set to %.2f", + bbr->bbr_pacing_gain); + } +} + + +/* BbrSender::InRecovery() */ +static int +in_recovery (const struct lsquic_bbr *bbr) +{ + return bbr->bbr_recovery_state != BBR_RS_NOT_IN_RECOVERY; +} + + +/* See BbrSender::CheckIfFullBandwidthReached() */ +static void +check_if_full_bw_reached (struct lsquic_bbr *bbr) +{ + struct bandwidth target, bw; + + if (bbr->bbr_flags & BBR_FLAG_LAST_SAMPLE_APP_LIMITED) + { + LSQ_DEBUG("last sample app limited: full BW not reached"); + return; + } + + target = BW_TIMES(&bbr->bbr_bw_at_last_round, kStartupGrowthTarget); + bw = BW(minmax_get(&bbr->bbr_max_bandwidth)); + if (BW_VALUE(&bw) >= BW_VALUE(&target)) + { + bbr->bbr_bw_at_last_round = bw; + bbr->bbr_round_wo_bw_gain = 0; + if (bbr->bbr_flags & BBR_FLAG_EXPIRE_ACK_AGG_IN_STARTUP) + // Expire old excess delivery measurements now that bandwidth + // increased. + minmax_reset(&bbr->bbr_max_ack_height, + ((struct minmax_sample) { bbr->bbr_round_count, 0, })); + LSQ_DEBUG("BW estimate %"PRIu64"bps greater than or equal to target " + "%"PRIu64"bps: full BW not reached", + BW_VALUE(&bw), BW_VALUE(&target)); + return; + } + + ++bbr->bbr_round_wo_bw_gain; + if ((bbr->bbr_round_wo_bw_gain >= bbr->bbr_num_startup_rtts) + || ((bbr->bbr_flags & BBR_FLAG_EXIT_STARTUP_ON_LOSS) + && in_recovery(bbr))) + { + assert(bbr->bbr_flags & BBR_FLAG_HAS_NON_APP_LIMITED); /* DCHECK */ + bbr->bbr_flags |= BBR_FLAG_IS_AT_FULL_BANDWIDTH; + LSQ_DEBUG("reached full BW"); + } + else + LSQ_DEBUG("rounds w/o gain: %u, full BW not reached", + bbr->bbr_round_wo_bw_gain); +} + + +/* See BbrSender::OnExitStartup */ +static void +on_exit_startup (struct lsquic_bbr *bbr, lsquic_time_t now) +{ + assert(bbr->bbr_mode == BBR_MODE_STARTUP); + /* Apparently this method is just to update stats, something that we + * don't do yet. + */ +} + + +/* See BbrSender::EnterProbeBandwidthMode */ +static void +enter_probe_bw_mode (struct lsquic_bbr *bbr, lsquic_time_t now) +{ + set_mode(bbr, BBR_MODE_PROBE_BW); + bbr->bbr_cwnd_gain = kCwndGain; + + // Pick a random offset for the gain cycle out of {0, 2..7} range. 1 is + // excluded because in that case increased gain and decreased gain would not + // follow each other. + bbr->bbr_cycle_current_offset = rand() % (kGainCycleLength - 1); + if (bbr->bbr_cycle_current_offset >= 1) + ++bbr->bbr_cycle_current_offset; + + bbr->bbr_last_cycle_start = now; + bbr->bbr_pacing_gain = kPacingGain[bbr->bbr_cycle_current_offset]; +} + + +/* See BbrSender::EnterStartupMode */ +static void +enter_startup_mode (struct lsquic_bbr *bbr, lsquic_time_t now) +{ + set_mode(bbr, BBR_MODE_STARTUP); + set_startup_values(bbr); +} + + +/* See BbrSender::MaybeExitStartupOrDrain() */ +static void +maybe_exit_startup_or_drain (struct lsquic_bbr *bbr, lsquic_time_t now, + uint64_t bytes_in_flight) +{ + uint64_t target_cwnd; + + if (bbr->bbr_mode == BBR_MODE_STARTUP + && (bbr->bbr_flags & BBR_FLAG_IS_AT_FULL_BANDWIDTH)) + { + on_exit_startup(bbr, now); + set_mode(bbr, BBR_MODE_DRAIN); + bbr->bbr_pacing_gain = bbr->bbr_drain_gain; + bbr->bbr_cwnd_gain = bbr->bbr_high_cwnd_gain; + } + + if (bbr->bbr_mode == BBR_MODE_DRAIN) + { + target_cwnd = get_target_cwnd(bbr, 1); + LSQ_DEBUG("%s: bytes in flight: %"PRIu64"; target cwnd: %"PRIu64, + __func__, bytes_in_flight, target_cwnd); + if (bytes_in_flight <= target_cwnd) + enter_probe_bw_mode(bbr, now); + } +} + + +static int +in_slow_start (const struct lsquic_bbr *bbr) +{ + return bbr->bbr_mode == BBR_MODE_STARTUP; +} + + +/* See QuicByteCount BbrSender::ProbeRttCongestionWindow() */ +static uint64_t +get_probe_rtt_cwnd (const struct lsquic_bbr *bbr) +{ + if (bbr->bbr_flags & BBR_FLAG_PROBE_RTT_BASED_ON_BDP) + return get_target_cwnd(bbr, kModerateProbeRttMultiplier); + else + return bbr->bbr_min_cwnd; +} + + +static uint64_t +lsquic_bbr_get_cwnd (void *cong_ctl) +{ + struct lsquic_bbr *const bbr = cong_ctl; + uint64_t cwnd; + + if (bbr->bbr_mode == BBR_MODE_PROBE_RTT) + cwnd = get_probe_rtt_cwnd(bbr); + else if (in_recovery(bbr) && + !((bbr->bbr_flags & BBR_FLAG_RATE_BASED_STARTUP) + && bbr->bbr_mode == BBR_MODE_STARTUP)) + cwnd = MIN(bbr->bbr_cwnd, bbr->bbr_recovery_window); + else + cwnd = bbr->bbr_cwnd; + + return cwnd; +} + + +/* See BbrSender::MaybeEnterOrExitProbeRtt */ +static void +maybe_enter_or_exit_probe_rtt (struct lsquic_bbr *bbr, lsquic_time_t now, + int is_round_start, int min_rtt_expired, uint64_t bytes_in_flight) +{ + if (min_rtt_expired + && !(bbr->bbr_flags & BBR_FLAG_EXITING_QUIESCENCE) + && bbr->bbr_mode != BBR_MODE_PROBE_RTT) + { + if (in_slow_start(bbr)) + on_exit_startup(bbr, now); + set_mode(bbr, BBR_MODE_PROBE_RTT); + bbr->bbr_pacing_gain = 1; + // Do not decide on the time to exit PROBE_RTT until the + // |bytes_in_flight| is at the target small value. + bbr->bbr_exit_probe_rtt_at = 0; + } + + if (bbr->bbr_mode == BBR_MODE_PROBE_RTT) + { + lsquic_bw_sampler_app_limited(&bbr->bbr_bw_sampler); + LSQ_DEBUG("%s: exit probe at: %"PRIu64"; now: %"PRIu64 + "; round start: %d; round passed: %d; rtt: %"PRIu64" usec", + __func__, bbr->bbr_exit_probe_rtt_at, now, is_round_start, + !!(bbr->bbr_flags & BBR_FLAG_PROBE_RTT_ROUND_PASSED), + lsquic_rtt_stats_get_min_rtt(bbr->bbr_rtt_stats)); + if (bbr->bbr_exit_probe_rtt_at == 0) + { + // If the window has reached the appropriate size, schedule exiting + // PROBE_RTT. The CWND during PROBE_RTT is + // kMinimumCongestionWindow, but we allow an extra packet since QUIC + // checks CWND before sending a packet. + if (bytes_in_flight + < get_probe_rtt_cwnd(bbr) + kMaxOutgoingPacketSize) + { + bbr->bbr_exit_probe_rtt_at = now + kProbeRttTime; + bbr->bbr_flags &= ~BBR_FLAG_PROBE_RTT_ROUND_PASSED; + } + } + else + { + if (is_round_start) + bbr->bbr_flags |= BBR_FLAG_PROBE_RTT_ROUND_PASSED; + if (now >= bbr->bbr_exit_probe_rtt_at + && (bbr->bbr_flags & BBR_FLAG_PROBE_RTT_ROUND_PASSED)) + { + bbr->bbr_min_rtt_timestamp = now; + if (!(bbr->bbr_flags & BBR_FLAG_IS_AT_FULL_BANDWIDTH)) + enter_startup_mode(bbr, now); + else + enter_probe_bw_mode(bbr, now); + } + } + } + + bbr->bbr_flags &= ~BBR_FLAG_EXITING_QUIESCENCE; +} + + +/* See BbrSender::CalculatePacingRate */ +static void +calculate_pacing_rate (struct lsquic_bbr *bbr) +{ + struct bandwidth bw, target_rate; + + bw = BW(minmax_get(&bbr->bbr_max_bandwidth)); + if (BW_IS_ZERO(&bw)) + return; + + LSQ_DEBUG("BW estimate: %"PRIu64, BW_VALUE(&bw)); + + target_rate = BW_TIMES(&bw, bbr->bbr_pacing_gain); + if (bbr->bbr_flags & BBR_FLAG_IS_AT_FULL_BANDWIDTH) + { + bbr->bbr_pacing_rate = target_rate; + return; + } + + // Pace at the rate of initial_window / RTT as soon as RTT measurements are + // available. + if (BW_IS_ZERO(&bbr->bbr_pacing_rate) + && 0 != lsquic_rtt_stats_get_min_rtt(bbr->bbr_rtt_stats)) + { + bbr->bbr_pacing_rate = BW_FROM_BYTES_AND_DELTA( + bbr->bbr_init_cwnd, + lsquic_rtt_stats_get_min_rtt(bbr->bbr_rtt_stats)); + return; + } + + // Slow the pacing rate in STARTUP once loss has ever been detected. + const int has_ever_detected_loss = bbr->bbr_end_recovery_at != 0; + if (has_ever_detected_loss + && (bbr->bbr_flags & (BBR_FLAG_SLOWER_STARTUP + |BBR_FLAG_HAS_NON_APP_LIMITED)) + == (BBR_FLAG_SLOWER_STARTUP|BBR_FLAG_HAS_NON_APP_LIMITED)) + { + bbr->bbr_pacing_rate = BW_TIMES(&bw, kStartupAfterLossGain); + return; + } + + // Slow the pacing rate in STARTUP by the bytes_lost / CWND. + if (startup_rate_reduction_multiplier_ != 0 + && has_ever_detected_loss + && (bbr->bbr_flags & BBR_FLAG_HAS_NON_APP_LIMITED)) + { + bbr->bbr_pacing_rate = BW_TIMES(&target_rate, + (1 - (bbr->bbr_startup_bytes_lost + * startup_rate_reduction_multiplier_ * 1.0f + / bbr->bbr_cwnd_gain))); + // Ensure the pacing rate doesn't drop below the startup growth target + // times the bandwidth estimate. + if (BW_VALUE(&bbr->bbr_pacing_rate) + < BW_VALUE(&bw) * kStartupGrowthTarget) + bbr->bbr_pacing_rate = BW_TIMES(&bw, kStartupGrowthTarget); + return; + } + + // Do not decrease the pacing rate during startup. + if (BW_VALUE(&bbr->bbr_pacing_rate) < BW_VALUE(&target_rate)) + bbr->bbr_pacing_rate = target_rate; +} + + +/* See BbrSender::CalculateCongestionWindow */ +static void +calculate_cwnd (struct lsquic_bbr *bbr, uint64_t bytes_acked, + uint64_t excess_acked) +{ + if (bbr->bbr_mode == BBR_MODE_PROBE_RTT) + return; + + uint64_t target_window = get_target_cwnd(bbr, bbr->bbr_cwnd_gain); + if (bbr->bbr_flags & BBR_FLAG_IS_AT_FULL_BANDWIDTH) + // Add the max recently measured ack aggregation to CWND. + target_window += minmax_get(&bbr->bbr_max_ack_height); + else if (bbr->bbr_flags & BBR_FLAG_ENABLE_ACK_AGG_IN_STARTUP) + // Add the most recent excess acked. Because CWND never decreases in + // STARTUP, this will automatically create a very localized max filter. + target_window += excess_acked; + + // Instead of immediately setting the target CWND as the new one, BBR grows + // the CWND towards |target_window| by only increasing it |bytes_acked| at a + // time. + const int add_bytes_acked = + !FLAGS_quic_bbr_no_bytes_acked_in_startup_recovery || !in_recovery(bbr); + if (bbr->bbr_flags & BBR_FLAG_IS_AT_FULL_BANDWIDTH) + bbr->bbr_cwnd = MIN(target_window, bbr->bbr_cwnd + bytes_acked); + else if (add_bytes_acked && + (bbr->bbr_cwnd_gain < target_window || + lsquic_bw_sampler_total_acked(&bbr->bbr_bw_sampler) + < bbr->bbr_init_cwnd)) + // If the connection is not yet out of startup phase, do not decrease + // the window. + bbr->bbr_cwnd += bytes_acked; + + // Enforce the limits on the congestion window. + if (bbr->bbr_cwnd < bbr->bbr_min_cwnd) + bbr->bbr_cwnd = bbr->bbr_min_cwnd; + else if (bbr->bbr_cwnd > bbr->bbr_max_cwnd) + { + LSQ_DEBUG("exceed max cwnd"); + bbr->bbr_cwnd = bbr->bbr_max_cwnd; + } +} + + +/* See BbrSender::CalculateRecoveryWindow */ +static void +calculate_recovery_window (struct lsquic_bbr *bbr, uint64_t bytes_acked, + uint64_t bytes_lost, uint64_t bytes_in_flight) +{ + if ((bbr->bbr_flags & BBR_FLAG_RATE_BASED_STARTUP) + && bbr->bbr_mode == BBR_MODE_STARTUP) + return; + + if (bbr->bbr_recovery_state == BBR_RS_NOT_IN_RECOVERY) + return; + + // Set up the initial recovery window. + if (bbr->bbr_recovery_window == 0) + { + bbr->bbr_recovery_window = bytes_in_flight + bytes_acked; + bbr->bbr_recovery_window = MAX(bbr->bbr_min_cwnd, + bbr->bbr_recovery_window); + return; + } + + // Remove losses from the recovery window, while accounting for a potential + // integer underflow. + if (bbr->bbr_recovery_window >= bytes_lost) + bbr->bbr_recovery_window -= bytes_lost; + else + bbr->bbr_recovery_window = kMaxSegmentSize; + + // In CONSERVATION mode, just subtracting losses is sufficient. In GROWTH, + // release additional |bytes_acked| to achieve a slow-start-like behavior. + if (bbr->bbr_recovery_state == BBR_RS_GROWTH) + bbr->bbr_recovery_window += bytes_acked; + + // Sanity checks. Ensure that we always allow to send at least an MSS or + // |bytes_acked| in response, whichever is larger. + bbr->bbr_recovery_window = MAX(bbr->bbr_recovery_window, + bytes_in_flight + bytes_acked); + if (FLAG_quic_bbr_one_mss_conservation) + bbr->bbr_recovery_window = MAX(bbr->bbr_recovery_window, + bytes_in_flight + kMaxSegmentSize); + bbr->bbr_recovery_window = MAX(bbr->bbr_recovery_window, bbr->bbr_min_cwnd); +} + + +static void +lsquic_bbr_end_ack (void *cong_ctl, uint64_t in_flight) +{ + struct lsquic_bbr *const bbr = cong_ctl; + int is_round_start, min_rtt_expired; + uint64_t bytes_acked, excess_acked, bytes_lost; + + assert(bbr->bbr_flags & BBR_FLAG_IN_ACK); + bbr->bbr_flags &= ~BBR_FLAG_IN_ACK; + + LSQ_DEBUG("end_ack; mode: %s; in_flight: %"PRIu64, mode2str[bbr->bbr_mode], + in_flight); + + bytes_acked = lsquic_bw_sampler_total_acked(&bbr->bbr_bw_sampler) + - bbr->bbr_ack_state.total_bytes_acked_before; + if (bbr->bbr_ack_state.acked_bytes) + { + is_round_start = bbr->bbr_ack_state.max_packno + > bbr->bbr_current_round_trip_end + || !is_valid_packno(bbr->bbr_current_round_trip_end); + if (is_round_start) + { + ++bbr->bbr_round_count; + bbr->bbr_current_round_trip_end = bbr->bbr_last_sent_packno; + LSQ_DEBUG("up round count to %"PRIu64"; new rt end: %"PRIu64, + bbr->bbr_round_count, bbr->bbr_current_round_trip_end); + } + min_rtt_expired = update_bandwidth_and_min_rtt(bbr); + update_recovery_state(bbr, is_round_start); + excess_acked = update_ack_aggregation_bytes(bbr, bytes_acked); + } + else + { + is_round_start = 0; + min_rtt_expired = 0; + excess_acked = 0; + } + + if (bbr->bbr_mode == BBR_MODE_PROBE_BW) + update_gain_cycle_phase(bbr, in_flight); + + if (is_round_start && !(bbr->bbr_flags & BBR_FLAG_IS_AT_FULL_BANDWIDTH)) + check_if_full_bw_reached(bbr); + + maybe_exit_startup_or_drain(bbr, bbr->bbr_ack_state.ack_time, in_flight); + + maybe_enter_or_exit_probe_rtt(bbr, bbr->bbr_ack_state.ack_time, + is_round_start, min_rtt_expired, in_flight); + + // Calculate number of packets acked and lost. + bytes_lost = bbr->bbr_ack_state.lost_bytes; + + // After the model is updated, recalculate the pacing rate and congestion + // window. + calculate_pacing_rate(bbr); + calculate_cwnd(bbr, bytes_acked, excess_acked); + calculate_recovery_window(bbr, bytes_acked, bytes_lost, in_flight); + + /* We don't need to clean up BW sampler */ +} + + +static void +lsquic_bbr_cleanup (void *cong_ctl) +{ + struct lsquic_bbr *const bbr = cong_ctl; + + LSQ_DEBUG("cleanup"); +} + + +static void +lsquic_bbr_loss (void *cong_ctl) { /* Noop */ } + + +static void +lsquic_bbr_timeout (void *cong_ctl) { /* Noop */ } + + +const struct cong_ctl_if lsquic_cong_bbr_if = +{ + .cci_ack = lsquic_bbr_ack, + .cci_begin_ack = lsquic_bbr_begin_ack, + .cci_end_ack = lsquic_bbr_end_ack, + .cci_cleanup = lsquic_bbr_cleanup, + .cci_get_cwnd = lsquic_bbr_get_cwnd, + .cci_init = lsquic_bbr_init, + .cci_pacing_rate = lsquic_bbr_pacing_rate, + .cci_loss = lsquic_bbr_loss, + .cci_lost = lsquic_bbr_lost, + .cci_timeout = lsquic_bbr_timeout, + .cci_sent = lsquic_bbr_sent, + .cci_was_quiet = lsquic_bbr_was_quiet, +}; diff --git a/src/liblsquic/lsquic_bbr.h b/src/liblsquic/lsquic_bbr.h new file mode 100644 index 000000000..7e5e15cbe --- /dev/null +++ b/src/liblsquic/lsquic_bbr.h @@ -0,0 +1,210 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#ifndef LSQUIC_BBR_H +#define LSQUIC_BBR_H + +/* Our BBR implementation is copied from Chromium with some modifications. + * Besides the obvious translation from C++ to C, differences are: + * + * 1. Instead of OnCongestionEvent(), the ACK information is processed at the + * same time as the ACK itself using cci_begin_ack(), cci_ack(), and + * cci_end_ack() methods. This is done to fit with the flow in + * lsquic_send_ctl_got_ack(). + * + * 2. The bandwidth sampler does not use a hash. Instead, the sample + * information is attached directly to the packet via po_bwp_state. + * + * In this file and in lsquic_bbr.c, C++-style comments are those copied + * verbatim from Chromium. C-style comments are ours. + * + * Code is based on bbr_sender.cc 1a578a76c16abc942205a1a80584a288c262d03a in + * the "quiche" repository. (Not to be confused with Cloudflare's "quiche".) + * + * The BBR I-D is here: + * https://tools.ietf.org/html/draft-cardwell-iccrg-bbr-congestion-control-00 + * + * As for quiche, see + * http://www.bernstein-plus-sons.com/RPDEQ.html + * + * Chromium copyright notice follows. + */ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE.chrome file. + +struct lsquic_bbr +{ + struct lsquic_conn *bbr_conn; + + enum bbr_mode + { + BBR_MODE_STARTUP, + BBR_MODE_DRAIN, + BBR_MODE_PROBE_BW, + BBR_MODE_PROBE_RTT, + } bbr_mode; + + enum + { + BBR_RS_NOT_IN_RECOVERY, + BBR_RS_CONSERVATION, + BBR_RS_GROWTH, + } bbr_recovery_state; + + enum + { + BBR_FLAG_IN_ACK = 1 << 0, /* cci_begin_ack() has been called */ + BBR_FLAG_LAST_SAMPLE_APP_LIMITED = 1 << 1, + BBR_FLAG_HAS_NON_APP_LIMITED = 1 << 2, + BBR_FLAG_APP_LIMITED_SINCE_LAST_PROBE_RTT + = 1 << 3, + BBR_FLAG_PROBE_RTT_DISABLED_IF_APP_LIMITED + = 1 << 4, + BBR_FLAG_PROBE_RTT_SKIPPED_IF_SIMILAR_RTT + = 1 << 5, + BBR_FLAG_EXIT_STARTUP_ON_LOSS = 1 << 6, + BBR_FLAG_IS_AT_FULL_BANDWIDTH = 1 << 7, + BBR_FLAG_EXITING_QUIESCENCE = 1 << 8, + BBR_FLAG_PROBE_RTT_ROUND_PASSED = 1 << 9, + BBR_FLAG_FLEXIBLE_APP_LIMITED = 1 << 10, + // If true, will not exit low gain mode until bytes_in_flight drops + // below BDP or it's time for high gain mode. + BBR_FLAG_DRAIN_TO_TARGET = 1 << 11, + // When true, expire the windowed ack aggregation values in STARTUP + // when bandwidth increases more than 25%. + BBR_FLAG_EXPIRE_ACK_AGG_IN_STARTUP + = 1 << 12, + // If true, use a CWND of 0.75*BDP during probe_rtt instead of 4 + // packets. + BBR_FLAG_PROBE_RTT_BASED_ON_BDP = 1 << 13, + // When true, pace at 1.5x and disable packet conservation in STARTUP. + BBR_FLAG_SLOWER_STARTUP = 1 << 14, + // When true, add the most recent ack aggregation measurement during STARTUP. + BBR_FLAG_ENABLE_ACK_AGG_IN_STARTUP + = 1 << 15, + // When true, disables packet conservation in STARTUP. + BBR_FLAG_RATE_BASED_STARTUP = 1 << 16, + } bbr_flags; + + // Number of round-trips in PROBE_BW mode, used for determining the current + // pacing gain cycle. + unsigned bbr_cycle_current_offset; + + const struct lsquic_rtt_stats + *bbr_rtt_stats; + + struct bw_sampler bbr_bw_sampler; + + /* + " BBR.BtlBwFilter: The max filter used to estimate BBR.BtlBw. + */ + struct minmax bbr_max_bandwidth; + + // Tracks the maximum number of bytes acked faster than the sending rate. + struct minmax bbr_max_ack_height; + + // The initial value of the bbr_cwnd. + uint64_t bbr_init_cwnd; + // The smallest value the bbr_cwnd can achieve. + uint64_t bbr_min_cwnd; + // The largest value the bbr_cwnd can achieve. + uint64_t bbr_max_cwnd; + // The maximum allowed number of bytes in flight. + uint64_t bbr_cwnd; + + // The time this aggregation started and the number of bytes acked during it. + lsquic_time_t bbr_aggregation_epoch_start_time; + uint64_t bbr_aggregation_epoch_bytes; + + lsquic_packno_t bbr_last_sent_packno; + lsquic_packno_t bbr_current_round_trip_end; + + // Receiving acknowledgement of a packet after |bbr_end_recovery_at| will + // cause BBR to exit the recovery mode. A value above zero indicates at + // least one loss has been detected, so it must not be set back to zero. + lsquic_packno_t bbr_end_recovery_at; + + /* + " BBR.round_count: Count of packet-timed round trips. + */ + uint64_t bbr_round_count; + + /* Not documented in the draft: */ + uint64_t bbr_full_bw; + + /* Not documented in the draft: */ + uint64_t bbr_full_bw_count; + + /* + " BBR.pacing_rate: The current pacing rate for a BBR flow, which + " controls inter-packet spacing. + */ + struct bandwidth bbr_pacing_rate; + + // Sum of bytes lost in STARTUP. + uint64_t bbr_startup_bytes_lost; + + /* + " BBR.pacing_gain: The dynamic gain factor used to scale BBR.BtlBw to + " produce BBR.pacing_rate. + */ + float bbr_pacing_gain; + + // The pacing gain applied during the STARTUP phase. + float bbr_high_gain; + + // The CWND gain applied during the STARTUP phase. + float bbr_high_cwnd_gain; + + // The pacing gain applied during the DRAIN phase. + float bbr_drain_gain; + + // The number of RTTs to stay in STARTUP mode. Defaults to 3. + unsigned bbr_num_startup_rtts; + + // Number of rounds during which there was no significant bandwidth + // increase. + unsigned bbr_round_wo_bw_gain; + + /* + " BBR.cwnd_gain: The dynamic gain factor used to scale the estimated + " BDP to produce a congestion window (cwnd). + */ + float bbr_cwnd_gain; + + // The bandwidth compared to which the increase is measured. + struct bandwidth bbr_bw_at_last_round; + + // The time at which the last pacing gain cycle was started. + lsquic_time_t bbr_last_cycle_start; + + // Time at which PROBE_RTT has to be exited. Setting it to zero indicates + // that the time is yet unknown as the number of packets in flight has not + // reached the required value. + lsquic_time_t bbr_exit_probe_rtt_at; + + lsquic_time_t bbr_min_rtt_since_last_probe; + lsquic_time_t bbr_min_rtt; + lsquic_time_t bbr_min_rtt_timestamp; + + // A window used to limit the number of bytes in flight during loss recovery + uint64_t bbr_recovery_window; + + /* Accumulate information from a single ACK. Gets processed when + * cci_end_ack() is called. + */ + struct + { + TAILQ_HEAD(, bw_sample) samples; + lsquic_time_t ack_time; + lsquic_packno_t max_packno; + uint64_t acked_bytes; + uint64_t lost_bytes; + uint64_t total_bytes_acked_before; + uint64_t in_flight; + int has_losses; + } bbr_ack_state; +}; + +extern const struct cong_ctl_if lsquic_cong_bbr_if; + +#endif diff --git a/src/liblsquic/lsquic_bw_sampler.c b/src/liblsquic/lsquic_bw_sampler.c new file mode 100644 index 000000000..b451bd648 --- /dev/null +++ b/src/liblsquic/lsquic_bw_sampler.c @@ -0,0 +1,273 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#include +#include +#include +#include +#include + +#include "lsquic_int_types.h" +#include "lsquic_types.h" +#include "lsquic_hash.h" +#include "lsquic.h" +#include "lsquic_conn.h" +#include "lsquic_malo.h" +#include "lsquic_util.h" +#include "lsquic_packet_common.h" +#include "lsquic_packet_out.h" +#include "lsquic_parse.h" +#include "lsquic_bw_sampler.h" + +#define LSQUIC_LOGGER_MODULE LSQLM_BW_SAMPLER +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(sampler->bws_conn) +#include "lsquic_logger.h" + + +int +lsquic_bw_sampler_init (struct bw_sampler *sampler, struct lsquic_conn *conn, + enum quic_ft_bit retx_frames) +{ + struct malo *malo; + + assert(lsquic_is_zero(sampler, sizeof(*sampler))); + + malo = lsquic_malo_create(sizeof(struct bwp_state)); + if (!malo) + return -1; + + sampler->bws_malo = malo; + sampler->bws_conn = conn; + sampler->bws_retx_frames = retx_frames; + LSQ_DEBUG("init"); + return 0; +} + + +void +lsquic_bw_sampler_app_limited (struct bw_sampler *sampler) +{ + sampler->bws_flags |= BWS_APP_LIMITED; + sampler->bws_end_of_app_limited_phase = sampler->bws_last_sent_packno; + LSQ_DEBUG("app limited, end of limited phase is %"PRIu64, + sampler->bws_end_of_app_limited_phase); +} + + +void +lsquic_bw_sampler_cleanup (struct bw_sampler *sampler) +{ + if (sampler->bws_conn) + LSQ_DEBUG("cleanup"); + if (sampler->bws_malo) + lsquic_malo_destroy(sampler->bws_malo); +} + + +/* This module only fails when it is unable to allocate memory. This rarely + * happens, so we avoid having to check return values and abort the connection + * instead. + */ +static void +bw_sampler_abort_conn (struct bw_sampler *sampler) +{ + if (!(sampler->bws_flags & BWS_CONN_ABORTED)) + { + sampler->bws_flags |= BWS_CONN_ABORTED; + LSQ_WARN("aborting connection"); + sampler->bws_conn->cn_if->ci_internal_error(sampler->bws_conn, + "resources exhausted"); + } +} + + +#define BW_WARN_ONCE(msg...) do { \ + if (!(sampler->bws_flags & BWS_WARNED)) \ + { \ + sampler->bws_flags |= BWS_WARNED; \ + LSQ_WARN(msg); \ + } \ +} while (0) + +void +lsquic_bw_sampler_packet_sent (struct bw_sampler *sampler, + struct lsquic_packet_out *packet_out, uint64_t in_flight) +{ + struct bwp_state *state; + unsigned short sent_sz; + + if (packet_out->po_bwp_state) + { + BW_WARN_ONCE("sent: packet %"PRIu64" already has state", + packet_out->po_packno); + return; + } + + sampler->bws_last_sent_packno = packet_out->po_packno; + + if (!(packet_out->po_frame_types & sampler->bws_retx_frames)) + return; + + sent_sz = lsquic_packet_out_sent_sz(sampler->bws_conn, packet_out); + sampler->bws_total_sent += sent_sz; + + // If there are no packets in flight, the time at which the new transmission + // opens can be treated as the A_0 point for the purpose of bandwidth + // sampling. This underestimates bandwidth to some extent, and produces some + // artificially low samples for most packets in flight, but it provides with + // samples at important points where we would not have them otherwise, most + // importantly at the beginning of the connection. + if (in_flight == 0) + { + sampler->bws_last_acked_packet_time = packet_out->po_sent; + sampler->bws_last_acked_total_sent = sampler->bws_total_sent; + // In this situation ack compression is not a concern, set send rate to + // effectively infinite. + sampler->bws_last_acked_sent_time = packet_out->po_sent; + } + + state = lsquic_malo_get(sampler->bws_malo); + if (!state) + { + bw_sampler_abort_conn(sampler); + return; + } + + state->bwps_send_state = (struct bwps_send_state) { + .total_bytes_sent = sampler->bws_total_sent, + .total_bytes_acked = sampler->bws_total_acked, + .total_bytes_lost = sampler->bws_total_lost, + .is_app_limited = !!(sampler->bws_flags & BWS_APP_LIMITED), + }; + state->bwps_sent_at_last_ack = sampler->bws_last_acked_total_sent; + state->bwps_last_ack_sent_time = sampler->bws_last_acked_sent_time; + state->bwps_last_ack_ack_time = sampler->bws_last_acked_packet_time; + state->bwps_packet_size = sent_sz; + + packet_out->po_bwp_state = state; + + LSQ_DEBUG("add info for packet %"PRIu64, packet_out->po_packno); +} + + +void +lsquic_bw_sampler_packet_lost (struct bw_sampler *sampler, + struct lsquic_packet_out *packet_out) +{ + if (!packet_out->po_bwp_state) + return; + + sampler->bws_total_lost += packet_out->po_bwp_state->bwps_packet_size; + lsquic_malo_put(packet_out->po_bwp_state); + packet_out->po_bwp_state = NULL; + LSQ_DEBUG("packet %"PRIu64" lost, total_lost goes to %"PRIu64, + packet_out->po_packno, sampler->bws_total_lost); +} + + +struct bw_sample * +lsquic_bw_sampler_packet_acked (struct bw_sampler *sampler, + struct lsquic_packet_out *packet_out, lsquic_time_t ack_time) +{ + const struct bwp_state *state; + struct bw_sample *sample; + struct bandwidth send_rate, ack_rate; + lsquic_time_t rtt; + unsigned short sent_sz; + int is_app_limited; + + if (!packet_out->po_bwp_state) + return 0; + + state = packet_out->po_bwp_state; + sent_sz = lsquic_packet_out_sent_sz(sampler->bws_conn, packet_out); + + sampler->bws_total_acked += sent_sz; + sampler->bws_last_acked_total_sent = state->bwps_send_state.total_bytes_sent; + sampler->bws_last_acked_sent_time = packet_out->po_sent; + sampler->bws_last_acked_packet_time = ack_time; + + // Exit app-limited phase once a packet that was sent while the connection + // is not app-limited is acknowledged. + if ((sampler->bws_flags & BWS_APP_LIMITED) + && packet_out->po_packno > sampler->bws_end_of_app_limited_phase) + { + sampler->bws_flags &= ~BWS_APP_LIMITED; + LSQ_DEBUG("exit app-limited phase due to packet %"PRIu64" being acked", + packet_out->po_packno); + } + + // There might have been no packets acknowledged at the moment when the + // current packet was sent. In that case, there is no bandwidth sample to + // make. + if (state->bwps_last_ack_sent_time == 0) + goto no_sample; + + // Infinite rate indicates that the sampler is supposed to discard the + // current send rate sample and use only the ack rate. + if (packet_out->po_sent > state->bwps_last_ack_sent_time) + send_rate = BW_FROM_BYTES_AND_DELTA( + state->bwps_send_state.total_bytes_sent + - state->bwps_sent_at_last_ack, + packet_out->po_sent - state->bwps_last_ack_sent_time); + else + send_rate = BW_INFINITE(); + + // During the slope calculation, ensure that ack time of the current packet is + // always larger than the time of the previous packet, otherwise division by + // zero or integer underflow can occur. + if (ack_time <= state->bwps_last_ack_ack_time) + { + BW_WARN_ONCE("Time of the previously acked packet (%"PRIu64") is " + "is larger than the ack time of the current packet (%"PRIu64")", + state->bwps_last_ack_ack_time, ack_time); + goto no_sample; + } + + ack_rate = BW_FROM_BYTES_AND_DELTA( + sampler->bws_total_acked - state->bwps_send_state.total_bytes_acked, + ack_time - state->bwps_last_ack_ack_time); + LSQ_DEBUG("send rate: %"PRIu64"; ack rate: %"PRIu64, send_rate.value, + ack_rate.value); + + // Note: this sample does not account for delayed acknowledgement time. + // This means that the RTT measurements here can be artificially high, + // especially on low bandwidth connections. + rtt = ack_time - packet_out->po_sent; + is_app_limited = state->bwps_send_state.is_app_limited; + + /* After this point, we switch `sample' to point to `state' and don't + * reference `state' anymore. + */ + sample = (void *) packet_out->po_bwp_state; + packet_out->po_bwp_state = NULL; + if (BW_VALUE(&send_rate) < BW_VALUE(&ack_rate)) + sample->bandwidth = send_rate; + else + sample->bandwidth = ack_rate; + sample->rtt = rtt; + sample->is_app_limited = is_app_limited; + + LSQ_DEBUG("packet %"PRIu64" acked, bandwidth: %"PRIu64" bps", + packet_out->po_packno, BW_VALUE(&sample->bandwidth)); + + return sample; + + no_sample: + lsquic_malo_put(packet_out->po_bwp_state); + packet_out->po_bwp_state = NULL; + return NULL;; +} + + +unsigned +lsquic_bw_sampler_entry_count (const struct bw_sampler *sampler) +{ + void *el; + unsigned count; + + count = 0; + for (el = lsquic_malo_first(sampler->bws_malo); el; + el = lsquic_malo_next(sampler->bws_malo)) + ++count; + + return count; +} diff --git a/src/liblsquic/lsquic_bw_sampler.h b/src/liblsquic/lsquic_bw_sampler.h new file mode 100644 index 000000000..852e2a306 --- /dev/null +++ b/src/liblsquic/lsquic_bw_sampler.h @@ -0,0 +1,111 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#ifndef LSQUIC_BW_SAMPLER_H +#define LSQUIC_BW_SAMPLER_H 1 + +/* Translated from Chromium. */ +// Copyright 2016 The Chromium Authors. All rights reserved. + +struct lsquic_packet_out; + +/* This struct provides a type for bits per second units. It's made into + * a struct so that it is a little harder to make a mistake. The Chromium + * equivalent of this is QuicBandwidth. Use macros to operate. + */ +struct bandwidth +{ + uint64_t value; /* Bits per second */ +}; + +#define BW_INFINITE() ((struct bandwidth) { .value = UINT64_MAX, }) +#define BW_ZERO() ((struct bandwidth) { .value = 0, }) +#define BW_FROM_BYTES_AND_DELTA(bytes_, usecs_) \ + ((struct bandwidth) { .value = (bytes_) * 8 * 1000000 / (usecs_), }) +#define BW_IS_ZERO(bw_) ((bw_)->value == 0) +#define BW_TO_BYTES_PER_SEC(bw_) ((bw_)->value / 8) +#define BW_VALUE(bw_) (+(bw_)->value) +#define BW_TIMES(bw_, factor_) \ + ((struct bandwidth) { .value = BW_VALUE(bw_) * (factor_), }) +#define BW(initial_value_) ((struct bandwidth) { .value = (initial_value_) }) + +struct bw_sampler +{ + struct lsquic_conn *bws_conn; + uint64_t bws_total_sent, + bws_total_acked, + bws_total_lost; + /* Value of bws_total_sent at the time last ACKed packet was sent. Only + * valid if bws_last_acked_sent_time is valid. + */ + uint64_t bws_last_acked_total_sent; + /* Time when last acked packet was sent. Zero if no valid timestamp is + * available. + */ + lsquic_time_t bws_last_acked_sent_time; + lsquic_time_t bws_last_acked_packet_time; + lsquic_packno_t bws_last_sent_packno; + lsquic_packno_t bws_end_of_app_limited_phase; + struct malo *bws_malo; /* For struct osp_state objects */ + enum quic_ft_bit bws_retx_frames; + enum { + BWS_CONN_ABORTED = 1 << 0, + BWS_WARNED = 1 << 1, + BWS_APP_LIMITED = 1 << 2, + } bws_flags; +}; + +struct bw_sample +{ + TAILQ_ENTRY(bw_sample) next; + struct bandwidth bandwidth; + lsquic_time_t rtt; + int is_app_limited; +}; + +int +lsquic_bw_sampler_init (struct bw_sampler *, struct lsquic_conn *, + enum quic_ft_bit); + +void +lsquic_bw_sampler_packet_sent (struct bw_sampler *, struct lsquic_packet_out *, + uint64_t in_flight); + +/* Free returned sample via lsquic_malo_put() after you're done */ +struct bw_sample * +lsquic_bw_sampler_packet_acked (struct bw_sampler *, struct lsquic_packet_out *, + lsquic_time_t ack_time); + +void +lsquic_bw_sampler_packet_lost (struct bw_sampler *, struct lsquic_packet_out *); + +void +lsquic_bw_sampler_app_limited (struct bw_sampler *); + +void +lsquic_bw_sampler_cleanup (struct bw_sampler *); + +unsigned +lsquic_bw_sampler_entry_count (const struct bw_sampler *); + +#define lsquic_bw_sampler_total_acked(sampler_) (+(sampler_)->bws_total_acked) + +/* The following types are exposed in the header file because of unit tests. + * Do not use outside of lsquic_bw_sampler.c. + */ +struct bwps_send_state +{ + uint64_t total_bytes_sent, + total_bytes_acked, + total_bytes_lost; + int is_app_limited; +}; + +struct bwp_state /* BWP State stands for Bandwidth Packet State */ +{ + struct bwps_send_state bwps_send_state; + uint64_t bwps_sent_at_last_ack; + lsquic_time_t bwps_last_ack_sent_time; + lsquic_time_t bwps_last_ack_ack_time; + unsigned short bwps_packet_size; +}; + +#endif diff --git a/src/liblsquic/lsquic_byteswap.h b/src/liblsquic/lsquic_byteswap.h index eb638e296..1b453736d 100644 --- a/src/liblsquic/lsquic_byteswap.h +++ b/src/liblsquic/lsquic_byteswap.h @@ -4,9 +4,9 @@ #if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__) #include -#define bswap_16 bswap16 -#define bswap_32 bswap32 -#define bswap_64 bswap64 +#define bswap_16 bswap16 +#define bswap_32 bswap32 +#define bswap_64 bswap64 #elif defined(__APPLE__) #include #define bswap_16 OSSwapInt16 @@ -21,4 +21,19 @@ #include #endif +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define READ_UINT(varname, varwidth, src, nbytes) do { \ + varname = 0; \ + memcpy((unsigned char *) &(varname) + varwidth / 8 - (nbytes), (src), \ + (nbytes)); \ + varname = bswap_##varwidth(varname); \ +} while (0) +#else +#define READ_UINT(varname, varwidth, src, nbytes) do { \ + varname = 0; \ + memcpy((unsigned char *) &(varname) + varwidth / 8 - (nbytes), (src), \ + (nbytes)); \ +} while (0) +#endif + #endif diff --git a/src/liblsquic/lsquic_cfcw.c b/src/liblsquic/lsquic_cfcw.c index a1788c257..128d0c08e 100644 --- a/src/liblsquic/lsquic_cfcw.c +++ b/src/liblsquic/lsquic_cfcw.c @@ -11,6 +11,9 @@ #include "lsquic_rtt.h" #include "lsquic_conn_flow.h" #include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" #include "lsquic_stream.h" #include "lsquic_conn_public.h" #include "lsquic_mm.h" @@ -20,7 +23,7 @@ #include "lsquic_ev_log.h" #define LSQUIC_LOGGER_MODULE LSQLM_CFCW -#define LSQUIC_LOG_CONN_ID fc->cf_conn_pub->lconn->cn_cid +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(fc->cf_conn_pub->lconn) #include "lsquic_logger.h" diff --git a/src/liblsquic/lsquic_chsk_stream.c b/src/liblsquic/lsquic_chsk_stream.c index 9013e9296..843522a8d 100644 --- a/src/liblsquic/lsquic_chsk_stream.c +++ b/src/liblsquic/lsquic_chsk_stream.c @@ -11,19 +11,23 @@ #include #include #include +#include #include "lsquic_int_types.h" #include "lsquic.h" #include "lsquic_str.h" -#include "lsquic_handshake.h" +#include "lsquic_enc_sess.h" #include "lsquic_chsk_stream.h" #include "lsquic_ver_neg.h" +#include "lsquic_hash.h" #include "lsquic_conn.h" #include "lsquic_mm.h" +#include "lsquic_sizes.h" +#include "lsquic_full_conn.h" #define LSQUIC_LOGGER_MODULE LSQLM_HSK_ADAPTER -#define LSQUIC_LOG_CONN_ID lsquic_conn_id(c_hsk->lconn) +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(c_hsk->lconn) #include "lsquic_logger.h" @@ -34,6 +38,15 @@ hsk_client_on_new_stream (void *stream_if_ctx, lsquic_stream_t *stream) LSQ_DEBUG("stream created"); +#if LSQUIC_ENABLE_HANDSHAKE_DISABLE + if (getenv("LSQUIC_DISABLE_HANDSHAKE")) + { + LSQ_WARN("Handshake disabled: faking it"); + c_hsk->lconn->cn_flags |= LSCONN_NO_CRYPTO; + c_hsk->lconn->cn_if->ci_handshake_ok(c_hsk->lconn); + return (void *) c_hsk; + } +#endif lsquic_stream_wantwrite(stream, 1); @@ -80,7 +93,7 @@ hsk_client_on_read (lsquic_stream_t *stream, struct lsquic_stream_ctx *sh) } c_hsk->buf_off += nread; - s = c_hsk->lconn->cn_esf->esf_handle_chlo_reply(c_hsk->lconn->cn_enc_session, + s = c_hsk->lconn->cn_esf.g->esf_handle_chlo_reply(c_hsk->lconn->cn_enc_session, c_hsk->buf_in, c_hsk->buf_off); LSQ_DEBUG("lsquic_enc_session_handle_chlo_reply returned %d", s); switch (s) @@ -104,10 +117,10 @@ hsk_client_on_read (lsquic_stream_t *stream, struct lsquic_stream_ctx *sh) lsquic_mm_put_16k(c_hsk->mm, c_hsk->buf_in); c_hsk->buf_in = NULL; lsquic_stream_wantread(stream, 0); - if (c_hsk->lconn->cn_esf->esf_is_hsk_done(c_hsk->lconn->cn_enc_session)) + if (c_hsk->lconn->cn_esf.g->esf_is_hsk_done(c_hsk->lconn->cn_enc_session)) { LSQ_DEBUG("handshake is successful, inform connection"); - status = (c_hsk->lconn->cn_esf->esf_did_zero_rtt_succeed( + status = (c_hsk->lconn->cn_esf_c->esf_did_zero_rtt_succeed( c_hsk->lconn->cn_enc_session)) ? LSQ_HSK_0RTT_OK : LSQ_HSK_OK; c_hsk->lconn->cn_if->ci_hsk_done(c_hsk->lconn, status); } @@ -118,6 +131,13 @@ hsk_client_on_read (lsquic_stream_t *stream, struct lsquic_stream_ctx *sh) lsquic_stream_wantwrite(stream, 1); } break; + case HS_SREJ: + LSQ_DEBUG("got HS_SREJ"); + c_hsk->buf_off = 0; + lsquic_stream_wantread(stream, 0); + if (0 == lsquic_gquic_full_conn_srej(c_hsk->lconn)) + lsquic_stream_wantwrite(stream, 1); + break; default: LSQ_WARN("lsquic_enc_session_handle_chlo_reply returned unknown value %d", s); /* fallthru */ @@ -154,7 +174,7 @@ hsk_client_on_write (lsquic_stream_t *stream, struct lsquic_stream_ctx *sh) } len = 4 * 1024; - if (0 != c_hsk->lconn->cn_esf->esf_gen_chlo(c_hsk->lconn->cn_enc_session, + if (0 != c_hsk->lconn->cn_esf.g->esf_gen_chlo(c_hsk->lconn->cn_enc_session, c_hsk->ver_neg->vn_ver, buf, &len)) { LSQ_WARN("cannot create CHLO message"); diff --git a/src/liblsquic/lsquic_cong_ctl.h b/src/liblsquic/lsquic_cong_ctl.h new file mode 100644 index 000000000..828f4fdd5 --- /dev/null +++ b/src/liblsquic/lsquic_cong_ctl.h @@ -0,0 +1,68 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_cong_ctl.h -- congestion control interface + */ + +#ifndef LSQUIC_CONG_CTL_H +#define LSQUIC_CONG_CTL_H + + +struct lsquic_conn_public; +struct lsquic_packet_out; +enum quic_ft_bit; + + +/* All the methods don't quite match up between Cubic and BBR. Thus, some of + * the methods are optional; they are marked as such in the comments below. + * Reconciling Cubic and BBR to have similar interface is left as an exercise + * for the future. + */ +struct cong_ctl_if +{ + void + (*cci_init) (void *cong_ctl, const struct lsquic_conn_public *, + enum quic_ft_bit); + + void + (*cci_ack) (void *cong_ctl, struct lsquic_packet_out *, unsigned packet_sz, + lsquic_time_t now, int app_limited); + + void + (*cci_loss) (void *cong_ctl); + + /* Optional method */ + void + (*cci_begin_ack) (void *cong_ctl, lsquic_time_t ack_time, + uint64_t in_flight); + + /* Optional method */ + void + (*cci_end_ack) (void *cong_ctl, uint64_t in_flight); + + /* Optional method */ + void + (*cci_sent) (void *cong_ctl, struct lsquic_packet_out *, + uint64_t in_flight); + + /* Optional method */ + void + (*cci_lost) (void *cong_ctl, struct lsquic_packet_out *, + unsigned packet_sz); + + void + (*cci_timeout) (void *cong_ctl); + + void + (*cci_was_quiet) (void *cong_ctl, lsquic_time_t now, uint64_t in_flight); + + uint64_t + (*cci_get_cwnd) (void *cong_ctl); + + uint64_t + (*cci_pacing_rate) (void *cong_ctl, int in_recovery); + + void + (*cci_cleanup) (void *cong_ctl); +}; + +#endif diff --git a/src/liblsquic/lsquic_conn.c b/src/liblsquic/lsquic_conn.c index 6a2e91d6d..9731f7229 100644 --- a/src/liblsquic/lsquic_conn.c +++ b/src/liblsquic/lsquic_conn.c @@ -2,68 +2,63 @@ #include #include #include +#include +#include + +#include #include "lsquic.h" #include "lsquic_int_types.h" +#include "lsquic_hash.h" #include "lsquic_conn.h" #include "lsquic_packet_common.h" +#include "lsquic_packet_gquic.h" #include "lsquic_packet_in.h" #include "lsquic_str.h" -#include "lsquic_handshake.h" +#include "lsquic_enc_sess.h" #include "lsquic_mm.h" #include "lsquic_engine_public.h" #include "lsquic_ev_log.h" #include "lsquic_logger.h" -lsquic_cid_t +const lsquic_cid_t * lsquic_conn_id (const lsquic_conn_t *lconn) { - return lconn->cn_cid; + /* TODO */ + return lsquic_conn_log_cid(lconn); } void * -lsquic_conn_get_peer_ctx( const lsquic_conn_t *lconn) +lsquic_conn_get_peer_ctx (struct lsquic_conn *lconn, + const struct sockaddr *local_sa) { - return lconn->cn_peer_ctx; + const struct network_path *path; + + path = lconn->cn_if->ci_get_path(lconn, local_sa); + return path->np_peer_ctx; } -void -lsquic_conn_record_sockaddr (lsquic_conn_t *lconn, - const struct sockaddr *local, const struct sockaddr *peer) +unsigned char +lsquic_conn_record_sockaddr (lsquic_conn_t *lconn, void *peer_ctx, + const struct sockaddr *local_sa, const struct sockaddr *peer_sa) { - assert(local->sa_family == peer->sa_family); - switch (local->sa_family) - { - case AF_INET: - lconn->cn_flags |= LSCONN_HAS_PEER_SA|LSCONN_HAS_LOCAL_SA; - memcpy(lconn->cn_local_addr, local, sizeof(struct sockaddr_in)); - memcpy(lconn->cn_peer_addr, peer, sizeof(struct sockaddr_in)); - break; - case AF_INET6: - lconn->cn_flags |= LSCONN_HAS_PEER_SA|LSCONN_HAS_LOCAL_SA; - memcpy(lconn->cn_local_addr, local, sizeof(struct sockaddr_in6)); - memcpy(lconn->cn_peer_addr, peer, sizeof(struct sockaddr_in6)); - break; - } + return lconn->cn_if->ci_record_addrs(lconn, peer_ctx, local_sa, peer_sa); } int -lsquic_conn_get_sockaddr (const lsquic_conn_t *lconn, +lsquic_conn_get_sockaddr (struct lsquic_conn *lconn, const struct sockaddr **local, const struct sockaddr **peer) { - if ((lconn->cn_flags & (LSCONN_HAS_PEER_SA|LSCONN_HAS_LOCAL_SA)) == - (LSCONN_HAS_PEER_SA|LSCONN_HAS_LOCAL_SA)) - { - *local = (struct sockaddr *) lconn->cn_local_addr; - *peer = (struct sockaddr *) lconn->cn_peer_addr; - return 0; - } - else - return -1; + const struct network_path *path; + + path = lconn->cn_if->ci_get_path(lconn, NULL); + *local = NP_LOCAL_SA(path); + *peer = NP_PEER_SA(path); + return 0; } @@ -73,8 +68,8 @@ lsquic_conn_copy_and_release_pi_data (const lsquic_conn_t *conn, { assert(!(packet_in->pi_flags & PI_OWN_DATA)); /* The size should be guarded in lsquic_engine_packet_in(): */ - assert(packet_in->pi_data_sz <= QUIC_MAX_PACKET_SZ); - unsigned char *const copy = lsquic_mm_get_1370(&enpub->enp_mm); + assert(packet_in->pi_data_sz <= GQUIC_MAX_PACKET_SZ); + unsigned char *const copy = lsquic_mm_get_packet_in_buf(&enpub->enp_mm, 1370); if (!copy) { LSQ_WARN("cannot allocate memory to copy incoming packet data"); @@ -87,56 +82,48 @@ lsquic_conn_copy_and_release_pi_data (const lsquic_conn_t *conn, } -int -lsquic_conn_decrypt_packet (lsquic_conn_t *lconn, - struct lsquic_engine_public *enpub, - lsquic_packet_in_t *packet_in) -{ - size_t header_len, data_len; - enum enc_level enc_level; - size_t out_len = 0; - unsigned char *copy = lsquic_mm_get_1370(&enpub->enp_mm); - if (!copy) - { - LSQ_WARN("cannot allocate memory to copy incoming packet data"); +enum lsquic_version +lsquic_conn_quic_version (const lsquic_conn_t *lconn) +{ + if (lconn->cn_flags & LSCONN_VER_SET) + return lconn->cn_version; + else return -1; - } +} - header_len = packet_in->pi_header_sz; - data_len = packet_in->pi_data_sz - packet_in->pi_header_sz; - enc_level = lconn->cn_esf->esf_decrypt(lconn->cn_enc_session, - lconn->cn_version, 0, - packet_in->pi_packno, packet_in->pi_data, - &header_len, data_len, - lsquic_packet_in_nonce(packet_in), - copy, 1370, &out_len); - if ((enum enc_level) -1 == enc_level) - { - lsquic_mm_put_1370(&enpub->enp_mm, copy); - EV_LOG_CONN_EVENT(lconn->cn_cid, "could not decrypt packet %"PRIu64, - packet_in->pi_packno); - return -1; - } - assert(header_len + out_len <= 1370); - if (packet_in->pi_flags & PI_OWN_DATA) - lsquic_mm_put_1370(&enpub->enp_mm, packet_in->pi_data); - packet_in->pi_data = copy; - packet_in->pi_flags |= PI_OWN_DATA | PI_DECRYPTED - | (enc_level << PIBIT_ENC_LEV_SHIFT); - packet_in->pi_header_sz = header_len; - packet_in->pi_data_sz = out_len + header_len; - EV_LOG_CONN_EVENT(lconn->cn_cid, "decrypted packet %"PRIu64" crypto: %s", - packet_in->pi_packno, lsquic_enclev2str[ enc_level ]); - return 0; +enum lsquic_crypto_ver +lsquic_conn_crypto_ver (const lsquic_conn_t *lconn) +{ + return LSQ_CRY_QUIC; } -enum lsquic_version -lsquic_conn_quic_version (const lsquic_conn_t *lconn) +const char * +lsquic_conn_crypto_cipher (const lsquic_conn_t *lconn) { - if (lconn->cn_flags & LSCONN_VER_SET) - return lconn->cn_version; + if (lconn->cn_enc_session) + return lconn->cn_esf_c->esf_cipher(lconn->cn_enc_session); + else + return NULL; +} + + +int +lsquic_conn_crypto_keysize (const lsquic_conn_t *lconn) +{ + if (lconn->cn_enc_session) + return lconn->cn_esf_c->esf_keysize(lconn->cn_enc_session); + else + return -1; +} + + +int +lsquic_conn_crypto_alg_keysize (const lsquic_conn_t *lconn) +{ + if (lconn->cn_enc_session) + return lconn->cn_esf_c->esf_alg_keysize(lconn->cn_enc_session); else return -1; } @@ -146,20 +133,144 @@ struct stack_st_X509 * lsquic_conn_get_server_cert_chain (struct lsquic_conn *lconn) { if (lconn->cn_enc_session) - return lconn->cn_esf->esf_get_server_cert_chain(lconn->cn_enc_session); + return lconn->cn_esf_c->esf_get_server_cert_chain(lconn->cn_enc_session); else return NULL; } -ssize_t -lsquic_conn_get_zero_rtt(const lsquic_conn_t *lconn, - unsigned char *zero_rtt, size_t zero_rtt_len) +void +lsquic_conn_make_stream (struct lsquic_conn *lconn) +{ + lconn->cn_if->ci_make_stream(lconn); +} + + +unsigned +lsquic_conn_n_pending_streams (const struct lsquic_conn *lconn) +{ + return lconn->cn_if->ci_n_pending_streams(lconn); +} + + +unsigned +lsquic_conn_n_avail_streams (const struct lsquic_conn *lconn) +{ + return lconn->cn_if->ci_n_avail_streams(lconn); +} + + +unsigned +lsquic_conn_cancel_pending_streams (struct lsquic_conn *lconn, unsigned count) +{ + return lconn->cn_if->ci_cancel_pending_streams(lconn, count); +} + + +void +lsquic_conn_going_away (struct lsquic_conn *lconn) +{ + lconn->cn_if->ci_going_away(lconn); +} + + +void +lsquic_conn_close (struct lsquic_conn *lconn) +{ + lconn->cn_if->ci_close(lconn); +} + + +int +lsquic_conn_is_push_enabled (lsquic_conn_t *lconn) +{ + return lconn->cn_if->ci_is_push_enabled(lconn); +} + + +struct lsquic_stream * +lsquic_conn_get_stream_by_id (struct lsquic_conn *lconn, + lsquic_stream_id_t stream_id) +{ + return lconn->cn_if->ci_get_stream_by_id(lconn, stream_id); +} + + +struct lsquic_engine * +lsquic_conn_get_engine (struct lsquic_conn *lconn) +{ + return lconn->cn_if->ci_get_engine(lconn); +} + + +int +lsquic_conn_push_stream (struct lsquic_conn *lconn, void *hset, + struct lsquic_stream *stream, const struct iovec* url, + const struct iovec *authority, const struct lsquic_http_headers *headers) +{ + return lconn->cn_if->ci_push_stream(lconn, hset, stream, url, authority, + headers); +} + + +lsquic_conn_ctx_t * +lsquic_conn_get_ctx (const struct lsquic_conn *lconn) +{ + return lconn->cn_if->ci_get_ctx(lconn); +} + + +void +lsquic_conn_set_ctx (struct lsquic_conn *lconn, lsquic_conn_ctx_t *ctx) +{ + lconn->cn_if->ci_set_ctx(lconn, ctx); +} + + +void +lsquic_conn_abort (struct lsquic_conn *lconn) +{ + lconn->cn_if->ci_abort(lconn); +} + + +void +lsquic_generate_cid (lsquic_cid_t *cid, size_t len) +{ + if (!len) + /* If not set, generate ID between 8 and MAX_CID_LEN bytes in length */ + len = 8 + rand() % (MAX_CID_LEN - 7); + RAND_bytes(cid->idbuf, len); + cid->len = len; +} + + +void +lsquic_generate_cid_gquic (lsquic_cid_t *cid) +{ + lsquic_generate_cid(cid, GQUIC_CID_LEN); +} + + +void +lsquic_conn_retire_cid (struct lsquic_conn *lconn) +{ + if (lconn->cn_if->ci_retire_cid) + lconn->cn_if->ci_retire_cid(lconn); +} + + +enum LSQUIC_CONN_STATUS +lsquic_conn_status (struct lsquic_conn *lconn, char *errbuf, size_t bufsz) +{ + return lconn->cn_if->ci_status(lconn, errbuf, bufsz); +} + + +const lsquic_cid_t * +lsquic_conn_log_cid (const struct lsquic_conn *lconn) { - ssize_t ret = -1; - if (lconn->cn_enc_session && (lconn->cn_flags & LSCONN_VER_SET)) - ret = lconn->cn_esf->esf_get_zero_rtt(lconn->cn_enc_session, - lconn->cn_version, - zero_rtt, zero_rtt_len); - return ret; + if (lconn->cn_if && lconn->cn_if->ci_get_log_cid) + return lconn->cn_if->ci_get_log_cid(lconn); + return CN_SCID(lconn); } diff --git a/src/liblsquic/lsquic_conn.h b/src/liblsquic/lsquic_conn.h index ea04dc79e..cbef08b0b 100644 --- a/src/liblsquic/lsquic_conn.h +++ b/src/liblsquic/lsquic_conn.h @@ -2,6 +2,11 @@ /* * lsquic_conn.h -- Connection interface * + * There are two types of connections: full (lsquic_full_conn.h) and mini + * (lsquic_mini_conn.h). The function pointers and struct in this header + * file provide a unified interface engine.c can use to interact with + * either of the connection types. For this to work, struct lsquic_conn + * must be the first element of struct full_conn and struct mini_conn. */ #ifndef LSQUIC_CONN_H #define LSQUIC_CONN_H @@ -15,7 +20,6 @@ #endif struct lsquic_conn; -struct lsquic_enc_session; struct lsquic_engine_public; struct lsquic_packet_out; struct lsquic_packet_in; @@ -30,8 +34,9 @@ enum lsquic_conn_flags { LSCONN_TICKED = (1 << 0), LSCONN_HAS_OUTGOING = (1 << 1), LSCONN_HASHED = (1 << 2), - LSCONN_HAS_PEER_SA = (1 << 4), - LSCONN_HAS_LOCAL_SA = (1 << 5), + LSCONN_MINI = (1 << 3), /* This is a mini connection */ + LSCONN_UNUSED_4 = (1 << 4), + LSCONN_UNUSED_5 = (1 << 5), LSCONN_HANDSHAKE_DONE = (1 << 6), LSCONN_CLOSING = (1 << 7), LSCONN_PEER_GOING_AWAY= (1 << 8), @@ -42,8 +47,17 @@ enum lsquic_conn_flags { LSCONN_COI_ACTIVE = (1 <<13), LSCONN_COI_INACTIVE = (1 <<14), LSCONN_SEND_BLOCKED = (1 <<15), /* Send connection blocked frame */ + LSCONN_PROMOTED = (1 <<16), /* Promoted. Only set if LSCONN_MINI is set */ LSCONN_NEVER_TICKABLE = (1 <<17), /* Do not put onto the Tickable Queue */ + LSCONN_UNUSED_18 = (1 <<18), LSCONN_ATTQ = (1 <<19), + LSCONN_SKIP_ON_PROC = (1 <<20), +#if LSQUIC_ENABLE_HANDSHAKE_DISABLE + LSCONN_NO_CRYPTO = (1 <<21), +#endif + LSCONN_SERVER = (1 <<22), + LSCONN_IETF = (1 <<23), + LSCONN_RETRY_CONN = (1 <<24), /* This is a retry connection */ }; /* A connection may have things to send and be closed at the same time. @@ -51,10 +65,29 @@ enum lsquic_conn_flags { enum tick_st { TICK_SEND = (1 << 0), TICK_CLOSE = (1 << 1), + TICK_PROMOTE = (1 << 2), /* Promote mini connection to full connection */ }; #define TICK_QUIET 0 +struct network_path +{ + union { + unsigned char buf[sizeof(struct sockaddr_in6)]; + struct sockaddr sockaddr; + } np_local_addr_u; +#define np_local_addr np_local_addr_u.buf + unsigned char np_peer_addr[sizeof(struct sockaddr_in6)]; + void *np_peer_ctx; + lsquic_cid_t np_dcid; + unsigned short np_pack_size; + unsigned char np_path_id; /* Used for logging */ +}; + +#define NP_LOCAL_SA(path_) (&(path_)->np_local_addr_u.sockaddr) +#define NP_PEER_SA(path_) ((struct sockaddr *) (path_)->np_peer_addr) +#define NP_IS_IPv6(path_) (AF_INET6 == NP_LOCAL_SA(path_)->sa_family) + struct conn_iface { enum tick_st @@ -63,8 +96,16 @@ struct conn_iface void (*ci_packet_in) (struct lsquic_conn *, struct lsquic_packet_in *); + /* Note: all packets "checked out" by calling this method should be + * returned back to the connection via ci_packet_sent() or + * ci_packet_not_sent() calls before the connection is ticked next. + * The connection, in turn, should not perform any extra processing + * (especially schedule more packets) during any of these method + * calls. This is because the checked out packets are not accounted + * for by the congestion controller. + */ struct lsquic_packet_out * - (*ci_next_packet_to_send) (struct lsquic_conn *); + (*ci_next_packet_to_send) (struct lsquic_conn *, size_t); void (*ci_packet_sent) (struct lsquic_conn *, struct lsquic_packet_out *); @@ -95,39 +136,198 @@ struct conn_iface const struct conn_stats * (*ci_get_stats) (struct lsquic_conn *); #endif + + void + (*ci_client_call_on_new) (struct lsquic_conn *); + + enum LSQUIC_CONN_STATUS + (*ci_status) (struct lsquic_conn *, char *errbuf, size_t bufsz); + + unsigned + (*ci_n_avail_streams) (const struct lsquic_conn *); + + unsigned + (*ci_n_pending_streams) (const struct lsquic_conn *); + + unsigned + (*ci_cancel_pending_streams) (struct lsquic_conn *, unsigned n); + + void + (*ci_going_away) (struct lsquic_conn *); + + int + (*ci_is_push_enabled) (struct lsquic_conn *); + + struct lsquic_stream * + (*ci_get_stream_by_id) (struct lsquic_conn *, lsquic_stream_id_t stream_id); + + struct lsquic_engine * + (*ci_get_engine) (struct lsquic_conn *); + + struct lsquic_conn_ctx * + (*ci_get_ctx) (const struct lsquic_conn *); + + void + (*ci_set_ctx) (struct lsquic_conn *, struct lsquic_conn_ctx *); + + void + (*ci_make_stream) (struct lsquic_conn *); + + void + (*ci_abort) (struct lsquic_conn *); + + void + (*ci_retire_cid) (struct lsquic_conn *); + + void + (*ci_close) (struct lsquic_conn *); + + void + (*ci_stateless_reset) (struct lsquic_conn *); + + int + (*ci_crypto_keysize) (const struct lsquic_conn *); + + int + (*ci_crypto_alg_keysize) (const struct lsquic_conn *); + + enum lsquic_crypto_ver + (*ci_crypto_ver) (const struct lsquic_conn *); + + const char * + (*ci_crypto_cipher) (const struct lsquic_conn *); + + int + (*ci_push_stream) (struct lsquic_conn *, void *hset, struct lsquic_stream *, + const struct iovec* url, const struct iovec* authority, + const struct lsquic_http_headers *headers); + + /* Use this to abort the connection when unlikely errors occur */ + void + (*ci_internal_error) (struct lsquic_conn *, const char *format, ...) +#if __GNUC__ + __attribute__((format(printf, 2, 3))) +#endif + ; + + /* Abort connection with error */ + void + (*ci_abort_error) (struct lsquic_conn *, int is_app, unsigned error_code, + const char *format, ...) +#if __GNUC__ + __attribute__((format(printf, 4, 5))) +#endif + ; + + void + (*ci_tls_alert) (struct lsquic_conn *, uint8_t); + + /* Returns 0 if connection is to be deleted immediately */ + lsquic_time_t + (*ci_drain_time) (const struct lsquic_conn *); + + /* Returns true if it's time to report the connection's CIDs' liveness */ + int + (*ci_report_live) (struct lsquic_conn *, lsquic_time_t now); + + /* If `local_sa' is NULL, return default path */ + struct network_path * + (*ci_get_path) (struct lsquic_conn *, const struct sockaddr *local_sa); + + unsigned char + (*ci_record_addrs) (struct lsquic_conn *, void *peer_ctx, + const struct sockaddr *local_sa, const struct sockaddr *peer_sa); + + const lsquic_cid_t * + (*ci_get_log_cid) (const struct lsquic_conn *); +}; + +struct cert_susp_head; + +#define LSCONN_CCE_BITS 3 +#define LSCONN_MAX_CCES (1 << LSCONN_CCE_BITS) + +struct conn_cid_elem +{ + struct lsquic_hash_elem cce_hash_el; /* Must be first element */ + lsquic_cid_t cce_cid; + union { + unsigned seqno; + unsigned short port; + } cce_u; +#define cce_seqno cce_u.seqno +#define cce_port cce_u.port + enum conn_cce_flags { + CCE_USED = 1 << 0, /* Connection ID has been used */ + CCE_SEQNO = 1 << 1, /* cce_seqno is set (CIDs in Initial + * packets have no sequence number). + */ + CCE_REG = 1 << 2, /* CID has been registered */ + CCE_PORT = 1 << 3, /* It's not a CID element at all: + * cce_port is the hash value. + */ + } cce_flags; }; struct lsquic_conn { - void *cn_peer_ctx; - struct lsquic_enc_session *cn_enc_session; - const struct enc_session_funcs - *cn_esf; - lsquic_cid_t cn_cid; + void *cn_enc_session; + const struct enc_session_funcs_common + *cn_esf_c; + union { + const struct enc_session_funcs_gquic *g; + const struct enc_session_funcs_iquic *i; + } cn_esf; +#define cn_cid cn_cces[0].cce_cid STAILQ_ENTRY(lsquic_conn) cn_next_closed_conn; + /* This and cn_next_closed_conn could be made into a union, as new full + * connections are never closed. + */ + STAILQ_ENTRY(lsquic_conn) cn_next_new_full; TAILQ_ENTRY(lsquic_conn) cn_next_ticked; - TAILQ_ENTRY(lsquic_conn) cn_next_out, - cn_next_hash; + TAILQ_ENTRY(lsquic_conn) cn_next_out; + TAILQ_ENTRY(lsquic_conn) cn_next_susp_cert; + /* Reuse this entry, as evanecsent connections are never suspended: */ +#define cn_next_pr cn_next_susp_cert const struct conn_iface *cn_if; const struct parse_funcs *cn_pf; struct attq_elem *cn_attq_elem; + struct cert_susp_head *cn_cert_susp_head; lsquic_time_t cn_last_sent; lsquic_time_t cn_last_ticked; + struct conn_cid_elem *cn_cces; /* At least one is available */ enum lsquic_conn_flags cn_flags; - enum lsquic_version cn_version; - unsigned cn_hash; - unsigned short cn_pack_size; - unsigned char cn_local_addr[sizeof(struct sockaddr_in6)]; - union { - unsigned char buf[sizeof(struct sockaddr_in6)]; - struct sockaddr sa; - } cn_peer_addr_u; -#define cn_peer_addr cn_peer_addr_u.buf + enum lsquic_version cn_version:8; + unsigned char cn_cces_mask; /* Those that are set */ + unsigned char cn_n_cces; /* Number of CCEs in cn_cces */ + unsigned char cn_cur_cce_idx; +#if LSQUIC_TEST + struct conn_cid_elem cn_cces_buf[8]; +#define LSCONN_INITIALIZER_CID(lsconn_, cid_) { \ + .cn_cces = (lsconn_).cn_cces_buf, \ + .cn_cces_buf[0].cce_seqno = 0, \ + .cn_cces_buf[0].cce_flags = CCE_SEQNO, \ + .cn_cces_buf[0].cce_cid = (cid_), \ + .cn_n_cces = 8, .cn_cces_mask = 1, } +#define LSCONN_INITIALIZER_CIDLEN(lsconn_, len_) { \ + .cn_cces = (lsconn_).cn_cces_buf, \ + .cn_cces_buf[0].cce_seqno = 0, \ + .cn_cces_buf[0].cce_flags = CCE_SEQNO, \ + .cn_cces_buf[0].cce_cid = { .len = len_ }, \ + .cn_n_cces = 8, .cn_cces_mask = 1, } +#define LSCONN_INITIALIZE(lsconn_) do { \ + (lsconn_)->cn_cces = (lsconn_)->cn_cces_buf; \ + (lsconn_)->cn_n_cces = 8; (lsconn_)->cn_cces_mask = 1; } while (0) +#endif }; -void -lsquic_conn_record_sockaddr (lsquic_conn_t *lconn, const struct sockaddr *local, - const struct sockaddr *peer); +#define END_OF_CCES(conn) ((conn)->cn_cces + (conn)->cn_n_cces) + +#define CN_SCID(conn) (&(conn)->cn_cces[(conn)->cn_cur_cce_idx].cce_cid) + +unsigned char +lsquic_conn_record_sockaddr (lsquic_conn_t *lconn, void *peer_ctx, + const struct sockaddr *local_sa, const struct sockaddr *peer_sa); int lsquic_conn_decrypt_packet (lsquic_conn_t *lconn, @@ -137,6 +337,15 @@ int lsquic_conn_copy_and_release_pi_data (const lsquic_conn_t *conn, struct lsquic_engine_public *, struct lsquic_packet_in *); +void +lsquic_generate_cid (lsquic_cid_t *cid, size_t len); + +void +lsquic_generate_cid_gquic (lsquic_cid_t *cid); + +void +lsquic_conn_retire_cid (lsquic_conn_t *lconn); + #define lsquic_conn_adv_time(c) ((c)->cn_attq_elem->ae_adv_time) #if LSQUIC_CONN_STATS @@ -164,6 +373,7 @@ struct conn_stats { unsigned long stream_frames; unsigned long acks; unsigned long packets; /* Number of sent packets */ + unsigned long acked_via_loss; /* Number of packets acked via loss record */ unsigned long retx_packets; /* Number of retransmitted packets */ unsigned long bytes; /* Overall bytes out */ unsigned long headers_uncomp; /* Sum of uncompressed header bytes */ diff --git a/src/liblsquic/lsquic_conn_public.h b/src/liblsquic/lsquic_conn_public.h index b6c6be090..e94b5825c 100644 --- a/src/liblsquic/lsquic_conn_public.h +++ b/src/liblsquic/lsquic_conn_public.h @@ -19,6 +19,10 @@ struct lsquic_send_ctl; #if LSQUIC_CONN_STATS struct conn_stats; #endif +struct qpack_enc_hdl; +struct qpack_dec_hdl; +struct h3_prio_tree; +struct network_path; struct lsquic_conn_public { struct lsquic_streams_tailq sending_streams, /* Send RST_STREAM, BLOCKED, and WUF frames */ @@ -33,11 +37,25 @@ struct lsquic_conn_public { struct malo *packet_out_malo; struct lsquic_conn *lconn; struct lsquic_mm *mm; - struct headers_stream *hs; + union { + struct { + struct headers_stream *hs; + } gquic; + struct { + struct qpack_enc_hdl *qeh; + struct qpack_dec_hdl *qdh; + struct h3_prio_tree *prio_tree; + struct lsquic_hash *promises; + } ietf; + } u; + enum { + CP_STREAM_UNBLOCKED = 1 << 0, /* Set when a stream becomes unblocked */ + } cp_flags; struct lsquic_send_ctl *send_ctl; #if LSQUIC_CONN_STATS struct conn_stats *conn_stats; #endif + const struct network_path *path; }; #endif diff --git a/src/liblsquic/lsquic_crt_compress.c b/src/liblsquic/lsquic_crt_compress.c index 9e7eea284..93fbd00ec 100644 --- a/src/liblsquic/lsquic_crt_compress.c +++ b/src/liblsquic/lsquic_crt_compress.c @@ -198,6 +198,75 @@ int get_common_cert(uint64_t hash, uint32_t index, lsquic_str_t *buf) } +static int +comp_ls_str (lsquic_str_t * a, const void * b, size_t b_len) +{ + size_t a_len; + int r; + + a_len = lsquic_str_len(a); + r = memcmp(lsquic_str_buf(a), b, a_len < b_len ? a_len : b_len); + if (r) + return r; + else + return (a_len > b_len) - (b_len > a_len); +} + + +/* 0, matched -1, error */ +int match_common_cert(lsquic_str_t * cert, lsquic_str_t * common_set_hashes, + uint64_t* out_hash, uint32_t* out_index) +{ + size_t i, j; + int n; + uint64_t hash; + size_t min, max, mid; + + if (lsquic_str_len(common_set_hashes) % sizeof(uint64_t) != 0) + return -1; + + for (i = 0; i < lsquic_str_len(common_set_hashes) / sizeof(uint64_t); i++) + { + memcpy(&hash, lsquic_str_buf(common_set_hashes) + i * sizeof(uint64_t), + sizeof(uint64_t)); + + for (j = 0; j < common_certs_num; j++) + { + if (common_cert_set[j].hash != hash) + continue; + + if (common_cert_set[j].num_certs == 0) + continue; + + min = 0; + max = common_cert_set[j].num_certs - 1; + while (max >= min) + { + mid = min + ((max - min) / 2); + n = comp_ls_str(cert, common_cert_set[j].certs[mid], + common_cert_set[j].lens[mid]); + if (n < 0) + { + if (mid == 0) + break; + max = mid - 1; + } + else if (n > 0) + min = mid + 1; + else + { + *out_hash = hash; + *out_index = mid; + return 0; + } + } + } + } + + return -1; +} + + /* result is written to dict */ static void make_zlib_dict_for_entries(cert_entry_t *entries, @@ -240,6 +309,59 @@ void get_certs_hash(lsquic_str_t *certs, size_t certs_count, uint64_t *hashs) } +static void get_certs_entries(lsquic_str_t **certs, size_t certs_count, + lsquic_str_t *client_common_set_hashes, + lsquic_str_t *client_cached_cert_hashes, + cert_entry_t *entries) +{ + size_t i; + int j; + cert_entry_t *entry; + uint64_t hash, cached_hash; + bool cached; + + const bool cached_valid = (lsquic_str_len(client_cached_cert_hashes) % sizeof(uint64_t) == 0) + && (lsquic_str_len(client_cached_cert_hashes) > 0); + + assert(&entries[certs_count - 1]); + + for (i = 0; itype = ENTRY_CACHED; + entry->hash = hash; + cached = true; + break; + } + + if (cached) + continue; + } + + if (0 == match_common_cert(certs[i], client_common_set_hashes, + &entry->set_hash, &entry->index)) + { + entry->type = ENTRY_COMMON; + continue; + } + + entry->type = ENTRY_COMPRESSED; + } +} + size_t get_entries_size(cert_entry_t *entries, size_t entries_count) { size_t i; @@ -265,7 +387,6 @@ size_t get_entries_size(cert_entry_t *entries, size_t entries_count) return entries_size; } - void serialize_cert_entries(uint8_t* out, int *out_len, cert_entry_t *entries, size_t entries_count) { @@ -438,6 +559,116 @@ static int parse_entries(const unsigned char **in_out, const unsigned char *cons } +/* return 0 for OK */ +int compress_certs(lsquic_str_t **certs, size_t certs_count, + lsquic_str_t *client_common_set_hashes, + lsquic_str_t *client_cached_cert_hashes, + lsquic_str_t *result) +{ + int rv; + size_t i; + size_t uncompressed_size = 0, compressed_size = 0 ; + z_stream z; + lsquic_str_t *dict; + size_t entries_size, result_length; + int out_len; + uint8_t* out; + uint32_t tmp_size_32; + cert_entry_t *entries; + + entries = malloc(sizeof(cert_entry_t) * certs_count); + if (!entries) + return -1; + + dict = lsquic_str_new(NULL, 0); + if (!dict) + goto err; + + get_certs_entries(certs, certs_count, client_common_set_hashes, + client_cached_cert_hashes, entries); + + for (i = 0; i < certs_count; i++) + { + if (entries[i].type == ENTRY_COMPRESSED) + { + /*uint32_t length + cert content*/ + uncompressed_size += 4 + lsquic_str_len(certs[i]); + } + } + + if (uncompressed_size > 0) + { + memset(&z, 0, sizeof(z)); + if (Z_OK != deflateInit(&z, Z_DEFAULT_COMPRESSION)) + goto err; + + make_zlib_dict_for_entries(entries, certs, certs_count, dict); + if(Z_OK != deflateSetDictionary(&z, (const unsigned char *)lsquic_str_buf(dict), lsquic_str_len(dict))) + goto err; + compressed_size = deflateBound(&z, uncompressed_size); + } + + entries_size = get_entries_size(entries, certs_count); + result_length = entries_size + (uncompressed_size > 0 ? 4 : 0) + + compressed_size; + lsquic_str_prealloc(result, result_length); + + out = (unsigned char *)lsquic_str_buf(result); + serialize_cert_entries(out, &out_len, entries, certs_count); + out += entries_size; + + if (uncompressed_size == 0) + { + lsquic_str_setlen(result, entries_size); + rv = 0; + goto cleanup; + } + + tmp_size_32 = uncompressed_size; + memcpy(out, &tmp_size_32, sizeof(uint32_t)); + out += sizeof(uint32_t); + + z.next_out = out; + z.avail_out = compressed_size; + + for (i = 0; i < certs_count; ++i) + { + if (entries[i].type != ENTRY_COMPRESSED) + continue; + + tmp_size_32 = lsquic_str_len(certs[i]); + z.next_in = (uint8_t*)(&tmp_size_32); + z.avail_in = sizeof(tmp_size_32); + if (Z_OK != deflate(&z, Z_NO_FLUSH) || z.avail_in) + goto err; + z.next_in = (unsigned char *)lsquic_str_buf(certs[i]); + z.avail_in = lsquic_str_len(certs[i]); + if (Z_OK != deflate(&z, Z_NO_FLUSH) || z.avail_in) + goto err; + } + + z.avail_in = 0; + if (Z_STREAM_END != deflate(&z, Z_FINISH)) + goto err; + + rv = 0; + result_length -= z.avail_out; + lsquic_str_setlen(result, result_length); + + cleanup: + free(entries); + if (dict) + lsquic_str_delete(dict); + if (uncompressed_size) + deflateEnd(&z); + return rv; + + err: + rv = -1; + goto cleanup; +} + + /* 0: ok */ int decompress_certs(const unsigned char *in, const unsigned char *in_end, lsquic_str_t *cached_certs, size_t cached_certs_count, diff --git a/src/liblsquic/lsquic_crt_compress.h b/src/liblsquic/lsquic_crt_compress.h index 9a6ce21bd..13acd7c61 100644 --- a/src/liblsquic/lsquic_crt_compress.h +++ b/src/liblsquic/lsquic_crt_compress.h @@ -10,6 +10,7 @@ struct lsquic_str; extern "C" { #endif + enum entry_type { END_OF_LIST = 0, ENTRY_COMPRESSED = 1, @@ -24,6 +25,7 @@ typedef struct cert_entry_st { uint64_t set_hash; } cert_entry_t; + typedef struct common_cert_st { size_t num_certs; @@ -34,6 +36,16 @@ typedef struct common_cert_st struct lsquic_str * get_common_certs_hash(); + +int get_common_cert(uint64_t hash, uint32_t index, struct lsquic_str *buf); +int match_common_cert(struct lsquic_str * cert, struct lsquic_str * common_set_hashes, + uint64_t* out_hash, uint32_t* out_index); + +int compress_certs(struct lsquic_str **certs, size_t certs_count, + struct lsquic_str *client_common_set_hashes, + struct lsquic_str *client_cached_cert_hashes, + struct lsquic_str *result); + int get_certs_count(struct lsquic_str *compressed_crt_buf); int decompress_certs(const unsigned char *in, const unsigned char *in_end, struct lsquic_str *cached_certs, size_t cached_certs_count, @@ -43,8 +55,10 @@ int decompress_certs(const unsigned char *in, const unsigned char *in_end, void lsquic_crt_cleanup (void); + #ifdef __cplusplus } #endif + #endif //__LSQUIC_CRT_COMPRESS_H__ diff --git a/src/liblsquic/lsquic_crypto.c b/src/liblsquic/lsquic_crypto.c index 8d8524ed6..9141711f6 100644 --- a/src/liblsquic/lsquic_crypto.c +++ b/src/liblsquic/lsquic_crypto.c @@ -17,7 +17,6 @@ #include "lsquic_types.h" #include "lsquic_crypto.h" -#include "lsquic_alarmset.h" #include "lsquic_parse.h" #include "lsquic_util.h" #include "lsquic_str.h" @@ -81,17 +80,6 @@ void fnv1a_inc(uint128 *hash, const uint8_t *data, int len) } } -uint128 fnv1a_128_2(const uint8_t * data1, int len1, const uint8_t *data2, int len2) -{ - uint128 hash; - memcpy(&hash, &s_init_hash, 16); - - fnv1a_inc(&hash, data1, len1); - if (data2) - fnv1a_inc(&hash, data2, len2); - return hash; -} - uint128 fnv1a_128_3(const uint8_t *data1, int len1, const uint8_t *data2, int len2, const uint8_t *data3, int len3) @@ -105,12 +93,6 @@ uint128 fnv1a_128_3(const uint8_t *data1, int len1, return hash; } -void fnv1a_128_2_s(const uint8_t * data1, int len1, const uint8_t * data2, int len2, uint8_t *md) -{ - uint128 hash = fnv1a_128_2(data1, len1, data2, len2); - memcpy(md, (void *)&hash, 16); -} - /* HS_PKT_HASH_LENGTH bytes of md */ void serialize_fnv128_short(uint128 v, uint8_t *md) { @@ -167,16 +149,6 @@ void fnv1a_inc(uint128 *hash, const uint8_t * data, int len) } -uint128 fnv1a_128_2(const uint8_t * data1, int len1, const uint8_t * data2, int len2) -{ - uint128 hash = {UINT64_C(7809847782465536322), UINT64_C(7113472399480571277)}; - fnv1a_inc(&hash, data1, len1); - if (data2) - fnv1a_inc(&hash, data2, len2); - return hash; -} - - uint128 fnv1a_128_3(const uint8_t * data1, int len1, const uint8_t * data2, int len2, const uint8_t * data3, int len3) @@ -189,13 +161,6 @@ uint128 fnv1a_128_3(const uint8_t * data1, int len1, } -void fnv1a_128_2_s(const uint8_t * data1, int len1, const uint8_t * data2, int len2, uint8_t *md) -{ - uint128 hash = fnv1a_128_2(data1, len1, data2, len2); - memcpy(md, (void *)&hash.lo_, 8); - memcpy(md + 8, (void *)&hash.hi_, 8); -} - /* HS_PKT_HASH_LENGTH bytes of md */ void serialize_fnv128_short(uint128 v, uint8_t *md) { @@ -206,55 +171,8 @@ void serialize_fnv128_short(uint128 v, uint8_t *md) #endif -uint128 fnv1a_128(const uint8_t * data, int len) -{ - return fnv1a_128_2(data, len , NULL, 0); -} - -void fnv1a_128_s(const uint8_t * data, int len, uint8_t *md) -{ - fnv1a_128_2_s(data, len, NULL, 0, md); -} - - -/* packet data = header + MD + payload */ -/* return 0 if OK */ -int verify_hs_pkt(const uint8_t *pkg_data, size_t header_len, size_t pkg_len) -{ - uint8_t md[HS_PKT_HASH_LENGTH]; - uint128 hash; - if (pkg_len < header_len + HS_PKT_HASH_LENGTH) - return -1; - - hash = fnv1a_128_2(pkg_data, header_len, pkg_data + header_len + HS_PKT_HASH_LENGTH, - pkg_len - header_len - HS_PKT_HASH_LENGTH); - serialize_fnv128_short(hash, md); - return memcmp(md, pkg_data + header_len, HS_PKT_HASH_LENGTH); -} - -/* packet data = header + MD + payload, update the MD part */ -int update_hs_pkt_hash(uint8_t *pkg_data, int header_len, int pkg_len) -{ - uint8_t md[HS_PKT_HASH_LENGTH]; - uint128 hash; - if (pkg_len < header_len + HS_PKT_HASH_LENGTH) - return -1; - - hash = fnv1a_128_2(pkg_data, header_len, pkg_data + header_len + HS_PKT_HASH_LENGTH, - pkg_len - header_len - HS_PKT_HASH_LENGTH); - serialize_fnv128_short(hash, md); - memcpy(pkg_data + header_len, md, HS_PKT_HASH_LENGTH); - return 0; -} - -int get_hs_pkt_hash_len() -{ - return HS_PKT_HASH_LENGTH; -} - - -void sha256(const uint8_t *buf, int len, uint8_t *h) +static void sha256(const uint8_t *buf, int len, uint8_t *h) { SHA256_CTX ctx; SHA256_Init(&ctx); @@ -499,17 +417,6 @@ int aes_aead_dec(EVP_AEAD_CTX *key, } } -/* aes 128, 16 bytes */ -int aes_get_key_length() -{ - return 16; -} - -void gen_nonce_s(char *buf, int length) -{ - rand_bytes(buf, length); -} - /* 32 bytes client nonce with 4 bytes tm, 8 bytes orbit */ void gen_nonce_c(unsigned char *buf, uint64_t orbit) { @@ -558,17 +465,6 @@ X509 *bio_to_crt(const void *buf, int len, int type) } -int read_rsa_priv_key(const uint8_t *buf, int len, EVP_PKEY *pkey) -{ - - RSA *rsa = RSA_private_key_from_bytes(buf, len); - if (!rsa) - return -1; - - return EVP_PKEY_assign_RSA(pkey, rsa); -} - - int gen_prof(const uint8_t *chlo_data, size_t chlo_data_len, const uint8_t *scfg_data, uint32_t scfg_data_len, const EVP_PKEY *priv_key, uint8_t *buf, size_t *buf_len) diff --git a/src/liblsquic/lsquic_crypto.h b/src/liblsquic/lsquic_crypto.h index 5f0357bfe..f9d5a4ffd 100644 --- a/src/liblsquic/lsquic_crypto.h +++ b/src/liblsquic/lsquic_crypto.h @@ -13,6 +13,9 @@ extern "C" { #endif struct lsquic_str; +struct evp_aead_ctx_st; +struct evp_pkey_st; +struct x509_st; #if defined( __x86_64 )||defined( __x86_64__ ) typedef __uint128_t uint128; @@ -53,49 +56,32 @@ int c255_gen_share_key(unsigned char *priv_key, unsigned char *peer_pub_key, uns uint64_t fnv1a_64(const uint8_t * data, int len); void fnv1a_64_s(const uint8_t * data, int len, char *md); -uint128 fnv1a_128(const uint8_t * data, int len); void fnv1a_128_s(const uint8_t * data , int len, uint8_t *md); -uint128 fnv1a_128_2(const uint8_t * data1, int len1, const uint8_t * data2, int len2); uint128 fnv1a_128_3(const uint8_t * data1, int len1, const uint8_t * data2, int len2, const uint8_t * data3, int len3); -void fnv1a_128_2_s(const uint8_t * data1, int len1, const uint8_t * data2, int len2, uint8_t *md); void serialize_fnv128_short(uint128 v, uint8_t *md); -/* before session handshake complete */ -int verify_hs_pkt(const uint8_t *pkg_data, size_t header_len, size_t pkg_len); -int update_hs_pkt_hash(uint8_t *pkg_data, int header_len, int pkg_len); -int get_hs_pkt_hash_len(); - - -/*16 bytes of h outputted */ -void sha256(const uint8_t *buf, int len, uint8_t *h); - - /* Encrypt plaint text to cipher test */ -int aes_aead_enc(EVP_AEAD_CTX *key, +int aes_aead_enc(struct evp_aead_ctx_st *key, const uint8_t *ad, size_t ad_len, const uint8_t *nonce, size_t nonce_len, const uint8_t *plain, size_t plain_len, uint8_t *cypher, size_t *cypher_len); -int aes_aead_dec(EVP_AEAD_CTX *key, +int aes_aead_dec(struct evp_aead_ctx_st *key, const uint8_t *ad, size_t ad_len, const uint8_t *nonce, size_t nonce_len, const uint8_t *cypher, size_t cypher_len, uint8_t *plain, size_t *plain_len); -int aes_get_key_length(); - -void gen_nonce_s(char *buf, int length); - /* 32 bytes client nonce with 4 bytes tm, 8 bytes orbit */ void gen_nonce_c(unsigned char *buf, uint64_t orbit); -EVP_PKEY *PEM_to_key(const char *buf, int len); +struct evp_pkey_st *PEM_to_key(const char *buf, int len); -X509 *bio_to_crt(const void *buf, int len, int type); +struct x509_st *bio_to_crt(const void *buf, int len, int type); int lshkdf_expand(const unsigned char *prk, const unsigned char *info, int info_len, uint16_t c_key_len, uint8_t *c_key, @@ -108,13 +94,13 @@ void lshkdf_extract(const unsigned char *ikm, int ikm_len, const unsigned char * int gen_prof(const uint8_t *chlo_data, size_t chlo_data_len, const uint8_t *scfg_data, uint32_t scfg_data_len, - const EVP_PKEY *priv_key, uint8_t *buf, size_t *len); + const struct evp_pkey_st *priv_key, uint8_t *buf, size_t *len); int verify_prof0(const uint8_t *chlo_data, size_t chlo_data_len, const uint8_t *scfg_data, uint32_t scfg_data_len, - const EVP_PKEY *pub_key, const uint8_t *buf, size_t len); + const struct evp_pkey_st *pub_key, const uint8_t *buf, size_t len); int verify_prof(const uint8_t *chlo_data, size_t chlo_data_len, struct lsquic_str * scfg, - const EVP_PKEY *pub_key, const uint8_t *buf, size_t len); + const struct evp_pkey_st *pub_key, const uint8_t *buf, size_t len); #ifdef __cplusplus diff --git a/src/liblsquic/lsquic_cubic.c b/src/liblsquic/lsquic_cubic.c index d88300230..a00201ace 100644 --- a/src/liblsquic/lsquic_cubic.c +++ b/src/liblsquic/lsquic_cubic.c @@ -8,17 +8,29 @@ #include #include #include +#include #ifdef WIN32 #include #endif #include "lsquic_int_types.h" #include "lsquic_types.h" -#include "lsquic_cubic.h" +#include "lsquic_hash.h" #include "lsquic_util.h" +#include "lsquic_cong_ctl.h" +#include "lsquic_sfcw.h" +#include "lsquic_conn_flow.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_stream.h" +#include "lsquic_rtt.h" +#include "lsquic_conn_public.h" +#include "lsquic_packet_common.h" +#include "lsquic_packet_out.h" +#include "lsquic_cubic.h" #define LSQUIC_LOGGER_MODULE LSQLM_CUBIC -#define LSQUIC_LOG_CONN_ID cubic->cu_cid +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(cubic->cu_conn) #include "lsquic_logger.h" #define FAST_CONVERGENCE 1 @@ -31,7 +43,7 @@ static void cubic_reset (struct lsquic_cubic *cubic) { - memset(cubic, 0, offsetof(struct lsquic_cubic, cu_cid)); + memset(cubic, 0, offsetof(struct lsquic_cubic, cu_conn)); cubic->cu_cwnd = 32 * TCP_MSS; cubic->cu_last_max_cwnd = 32 * TCP_MSS; cubic->cu_tcp_cwnd = 32 * TCP_MSS; @@ -95,13 +107,23 @@ cubic_update (struct lsquic_cubic *cubic, lsquic_time_t now, unsigned n_bytes) void -lsquic_cubic_init_ext (struct lsquic_cubic *cubic, lsquic_cid_t cid, - enum cubic_flags flags) +lsquic_cubic_set_flags (struct lsquic_cubic *cubic, enum cubic_flags flags) { + LSQ_DEBUG("%s(cubic, 0x%X)", __func__, flags); + cubic->cu_flags = flags; +} + + +static void +lsquic_cubic_init (void *cong_ctl, const struct lsquic_conn_public *conn_pub, + enum quic_ft_bit UNUSED_retx_frames) +{ + struct lsquic_cubic *const cubic = cong_ctl; cubic_reset(cubic); cubic->cu_ssthresh = 10000 * TCP_MSS; /* Emulate "unbounded" slow start */ - cubic->cu_cid = cid; - cubic->cu_flags = flags; + cubic->cu_conn = conn_pub->lconn; + cubic->cu_rtt_stats = &conn_pub->rtt_stats; + cubic->cu_flags = DEFAULT_CUBIC_FLAGS; #ifndef NDEBUG const char *s; s = getenv("LSQUIC_CUBIC_SAMPLING_RATE"); @@ -110,7 +132,7 @@ lsquic_cubic_init_ext (struct lsquic_cubic *cubic, lsquic_cid_t cid, else #endif cubic->cu_sampling_rate = 100000; - LSQ_DEBUG("%s(cubic, %"PRIu64", 0x%X)", __func__, cid, flags); + LSQ_DEBUG("%s(cubic, $conn)", __func__); LSQ_INFO("initialized"); } @@ -127,18 +149,23 @@ lsquic_cubic_init_ext (struct lsquic_cubic *cubic, lsquic_cid_t cid, } while (0) -void -lsquic_cubic_was_quiet (struct lsquic_cubic *cubic, lsquic_time_t now) +static void +lsquic_cubic_was_quiet (void *cong_ctl, lsquic_time_t now, uint64_t in_flight) { + struct lsquic_cubic *const cubic = cong_ctl; LSQ_DEBUG("%s(cubic, %"PRIu64")", __func__, now); cubic->cu_epoch_start = 0; } -void -lsquic_cubic_ack (struct lsquic_cubic *cubic, lsquic_time_t now_time, - lsquic_time_t rtt, int app_limited, unsigned n_bytes) +static void +lsquic_cubic_ack (void *cong_ctl, struct lsquic_packet_out *packet_out, + unsigned n_bytes, lsquic_time_t now_time, int app_limited) { + struct lsquic_cubic *const cubic = cong_ctl; + lsquic_time_t rtt; + + rtt = now_time - packet_out->po_sent; LSQ_DEBUG("%s(cubic, %"PRIu64", %"PRIu64", %d, %u)", __func__, now_time, rtt, app_limited, n_bytes); if (0 == cubic->cu_min_delay || rtt < cubic->cu_min_delay) @@ -162,9 +189,10 @@ lsquic_cubic_ack (struct lsquic_cubic *cubic, lsquic_time_t now_time, } -void -lsquic_cubic_loss (struct lsquic_cubic *cubic) +static void +lsquic_cubic_loss (void *cong_ctl) { + struct lsquic_cubic *const cubic = cong_ctl; LSQ_DEBUG("%s(cubic)", __func__); cubic->cu_epoch_start = 0; if (FAST_CONVERGENCE && cubic->cu_cwnd < cubic->cu_last_max_cwnd) @@ -180,9 +208,10 @@ lsquic_cubic_loss (struct lsquic_cubic *cubic) } -void -lsquic_cubic_timeout (struct lsquic_cubic *cubic) +static void +lsquic_cubic_timeout (void *cong_ctl) { + struct lsquic_cubic *const cubic = cong_ctl; unsigned long cwnd; cwnd = cubic->cu_cwnd; @@ -194,3 +223,61 @@ lsquic_cubic_timeout (struct lsquic_cubic *cubic) LSQ_INFO("timeout, cwnd: %lu", cubic->cu_cwnd); LOG_CWND(cubic); } + + +static void +lsquic_cubic_cleanup (void *cong_ctl) +{ +} + + +static uint64_t +lsquic_cubic_get_cwnd (void *cong_ctl) +{ + struct lsquic_cubic *const cubic = cong_ctl; + return cubic->cu_cwnd; +} + + +static int +in_slow_start (void *cong_ctl) +{ + struct lsquic_cubic *const cubic = cong_ctl; + return cubic->cu_cwnd < cubic->cu_ssthresh; +} + + +static uint64_t +lsquic_cubic_pacing_rate (void *cong_ctl, int in_recovery) +{ + struct lsquic_cubic *const cubic = cong_ctl; + uint64_t bandwidth, pacing_rate; + lsquic_time_t srtt; + + srtt = lsquic_rtt_stats_get_srtt(cubic->cu_rtt_stats); + if (srtt == 0) + srtt = 50000; + bandwidth = cubic->cu_cwnd * 1000000 / srtt; + if (in_slow_start(cubic)) + pacing_rate = bandwidth * 2; + else if (in_recovery) + pacing_rate = bandwidth; + else + pacing_rate = bandwidth + bandwidth / 4; + + return pacing_rate; +} + + + +const struct cong_ctl_if lsquic_cong_cubic_if = +{ + .cci_ack = lsquic_cubic_ack, + .cci_cleanup = lsquic_cubic_cleanup, + .cci_get_cwnd = lsquic_cubic_get_cwnd, + .cci_init = lsquic_cubic_init, + .cci_pacing_rate = lsquic_cubic_pacing_rate, + .cci_loss = lsquic_cubic_loss, + .cci_timeout = lsquic_cubic_timeout, + .cci_was_quiet = lsquic_cubic_was_quiet, +}; diff --git a/src/liblsquic/lsquic_cubic.h b/src/liblsquic/lsquic_cubic.h index c573498f5..18db13b9b 100644 --- a/src/liblsquic/lsquic_cubic.h +++ b/src/liblsquic/lsquic_cubic.h @@ -6,6 +6,8 @@ #ifndef LSQUIC_CUBIC_H #define LSQUIC_CUBIC_H 1 +struct lsquic_conn; + struct lsquic_cubic { lsquic_time_t cu_min_delay; lsquic_time_t cu_epoch_start; @@ -15,7 +17,10 @@ struct lsquic_cubic { unsigned long cu_cwnd; unsigned long cu_tcp_cwnd; unsigned long cu_ssthresh; - lsquic_cid_t cu_cid; /* Used for logging */ + const struct lsquic_conn + *cu_conn; /* Used for logging */ + const struct lsquic_rtt_stats + *cu_rtt_stats; enum cubic_flags { CU_TCP_FRIENDLY = (1 << 0), } cu_flags; @@ -27,28 +32,9 @@ struct lsquic_cubic { #define TCP_MSS 1460 -void -lsquic_cubic_init_ext (struct lsquic_cubic *, lsquic_cid_t, enum cubic_flags); - -#define lsquic_cubic_init(cubic, cid) \ - lsquic_cubic_init_ext(cubic, cid, DEFAULT_CUBIC_FLAGS) +extern const struct cong_ctl_if lsquic_cong_cubic_if; void -lsquic_cubic_ack (struct lsquic_cubic *cubic, lsquic_time_t now, - lsquic_time_t rtt, int app_limited, unsigned n_bytes); - -void -lsquic_cubic_loss (struct lsquic_cubic *cubic); - -void -lsquic_cubic_timeout (struct lsquic_cubic *cubic); - -void -lsquic_cubic_was_quiet (struct lsquic_cubic *, lsquic_time_t now); - -#define lsquic_cubic_get_cwnd(c) (+(c)->cu_cwnd) - -#define lsquic_cubic_in_slow_start(cubic) \ - ((cubic)->cu_cwnd < (cubic)->cu_ssthresh) +lsquic_cubic_set_flags (struct lsquic_cubic *cubic, enum cubic_flags flags); #endif diff --git a/src/liblsquic/lsquic_data_in_if.h b/src/liblsquic/lsquic_data_in_if.h index 92408b701..1c924f8f0 100644 --- a/src/liblsquic/lsquic_data_in_if.h +++ b/src/liblsquic/lsquic_data_in_if.h @@ -6,11 +6,13 @@ #ifndef LSQUIC_DATA_IN_IF_H #define LSQUIC_DATA_IN_IF_H 1 + struct data_frame; struct data_in; struct lsquic_conn_public; struct stream_frame; + enum ins_frame { INS_FRAME_OK, @@ -19,6 +21,7 @@ enum ins_frame INS_FRAME_OVERLAP, }; + struct data_in_iface { void @@ -55,8 +58,15 @@ struct data_in_iface size_t (*di_mem_used) (struct data_in *); + void + (*di_dump_state) (struct data_in *); + + /* Return number of bytes readable starting at offset `read_offset' */ + uint64_t + (*di_readable_bytes) (struct data_in *, uint64_t read_offset); }; + struct data_in { const struct data_in_iface *di_if; @@ -70,17 +80,18 @@ struct data_in } di_flags; }; + /* This implementation does not support overlapping frame and may return * INS_FRAME_OVERLAP. */ struct data_in * -data_in_nocopy_new (struct lsquic_conn_public *, uint32_t stream_id); +data_in_nocopy_new (struct lsquic_conn_public *, lsquic_stream_id_t); /* This implementation supports overlapping frames and will never return * INS_FRAME_OVERLAP. */ struct data_in * -data_in_hash_new (struct lsquic_conn_public *, uint32_t stream_id, +data_in_hash_new (struct lsquic_conn_public *, lsquic_stream_id_t, uint64_t byteage); enum ins_frame diff --git a/src/liblsquic/lsquic_di_error.c b/src/liblsquic/lsquic_di_error.c index e5ad7dc9e..9ad8280b3 100644 --- a/src/liblsquic/lsquic_di_error.c +++ b/src/liblsquic/lsquic_di_error.c @@ -13,6 +13,7 @@ #include #endif +#include "lsquic_types.h" #include "lsquic_data_in_if.h" @@ -75,13 +76,28 @@ error_di_mem_used (struct data_in *data_in) } +static void +error_di_dump_state (struct data_in *data_in) +{ +} + +static uint64_t +error_di_readable_bytes (struct data_in *data_in, uint64_t read_offset) +{ + return 0; +} + + static const struct data_in_iface di_if_error = { .di_destroy = error_di_destroy, + .di_dump_state = error_di_dump_state, .di_empty = error_di_empty, .di_frame_done = error_di_frame_done, .di_get_frame = error_di_get_frame, .di_insert_frame = error_di_insert_frame, .di_mem_used = error_di_mem_used, + .di_readable_bytes + = error_di_readable_bytes, .di_switch_impl = error_di_switch_impl, }; diff --git a/src/liblsquic/lsquic_di_hash.c b/src/liblsquic/lsquic_di_hash.c index 90448c596..f9f209624 100644 --- a/src/liblsquic/lsquic_di_hash.c +++ b/src/liblsquic/lsquic_di_hash.c @@ -27,6 +27,10 @@ #include "lsquic_packet_in.h" #include "lsquic_rtt.h" #include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_varint.h" +#include "lsquic_hash.h" #include "lsquic_stream.h" #include "lsquic_mm.h" #include "lsquic_malo.h" @@ -36,7 +40,7 @@ #define LSQUIC_LOGGER_MODULE LSQLM_DI -#define LSQUIC_LOG_CONN_ID hdi->hdi_conn_pub->lconn->cn_cid +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(hdi->hdi_conn_pub->lconn) #define LSQUIC_LOG_STREAM_ID hdi->hdi_stream_id #include "lsquic_logger.h" @@ -73,7 +77,7 @@ struct hash_data_in struct dblock_head *hdi_buckets; struct data_block *hdi_last_block; struct data_frame hdi_data_frame; - uint32_t hdi_stream_id; + lsquic_stream_id_t hdi_stream_id; unsigned hdi_count; unsigned hdi_nbits; enum { @@ -111,8 +115,8 @@ my_log2 /* silly name to suppress compiler warning */ (unsigned sz) struct data_in * -data_in_hash_new (struct lsquic_conn_public *conn_pub, uint32_t stream_id, - uint64_t byteage) +data_in_hash_new (struct lsquic_conn_public *conn_pub, + lsquic_stream_id_t stream_id, uint64_t byteage) { struct hash_data_in *hdi; unsigned n; @@ -456,8 +460,6 @@ ctz (unsigned long long x) if (0 == (x & ((1ULL << 1) - 1))) { n += 1; x >>= 1; } return n; } - - #endif @@ -638,13 +640,46 @@ hash_di_mem_used (struct data_in *data_in) } +static void +hash_di_dump_state (struct data_in *data_in) +{ + const struct hash_data_in *const hdi = HDI_PTR(data_in); + const struct data_block *block; + unsigned n; + + LSQ_DEBUG("hash state: flags: %X; fin off: %"PRIu64"; count: %u", + hdi->hdi_flags, hdi->hdi_fin_off, hdi->hdi_count); + for (n = 0; n < N_BUCKETS(hdi->hdi_nbits); ++n) + TAILQ_FOREACH(block, &hdi->hdi_buckets[n], db_next) + LSQ_DEBUG("block: off: %"PRIu64, block->db_off); +} + + +static uint64_t +hash_di_readable_bytes (struct data_in *data_in, uint64_t read_offset) +{ + const struct data_frame *data_frame; + uint64_t starting_offset; + + starting_offset = read_offset; + while (data_frame = hash_di_get_frame(data_in, read_offset), + data_frame && data_frame->df_size - data_frame->df_read_off) + read_offset += data_frame->df_size - data_frame->df_read_off; + + return read_offset - starting_offset; +} + + static const struct data_in_iface di_if_hash = { .di_destroy = hash_di_destroy, + .di_dump_state = hash_di_dump_state, .di_empty = hash_di_empty, .di_frame_done = hash_di_frame_done, .di_get_frame = hash_di_get_frame, .di_insert_frame = hash_di_insert_frame, .di_mem_used = hash_di_mem_used, + .di_readable_bytes + = hash_di_readable_bytes, .di_switch_impl = hash_di_switch_impl, }; diff --git a/src/liblsquic/lsquic_di_nocopy.c b/src/liblsquic/lsquic_di_nocopy.c index 7306fe841..7f7b0a1e0 100644 --- a/src/liblsquic/lsquic_di_nocopy.c +++ b/src/liblsquic/lsquic_di_nocopy.c @@ -57,6 +57,9 @@ #include "lsquic_packet_in.h" #include "lsquic_rtt.h" #include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" #include "lsquic_stream.h" #include "lsquic_mm.h" #include "lsquic_malo.h" @@ -66,7 +69,7 @@ #define LSQUIC_LOGGER_MODULE LSQLM_DI -#define LSQUIC_LOG_CONN_ID ncdi->ncdi_conn_pub->lconn->cn_cid +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(ncdi->ncdi_conn_pub->lconn) #define LSQUIC_LOG_STREAM_ID ncdi->ncdi_stream_id #include "lsquic_logger.h" @@ -103,7 +106,7 @@ struct nocopy_data_in struct lsquic_conn_public *ncdi_conn_pub; uint64_t ncdi_byteage; uint64_t ncdi_fin_off; - uint32_t ncdi_stream_id; + lsquic_stream_id_t ncdi_stream_id; unsigned ncdi_n_frames; unsigned ncdi_n_holes; unsigned ncdi_cons_far; @@ -125,7 +128,8 @@ static const struct data_in_iface *di_if_nocopy_ptr; struct data_in * -data_in_nocopy_new (struct lsquic_conn_public *conn_pub, uint32_t stream_id) +data_in_nocopy_new (struct lsquic_conn_public *conn_pub, + lsquic_stream_id_t stream_id) { struct nocopy_data_in *ncdi; @@ -164,12 +168,6 @@ nocopy_di_destroy (struct data_in *data_in) } -#define DF_OFF(frame) (frame)->data_frame.df_offset -#define DF_FIN(frame) (frame)->data_frame.df_fin -#define DF_SIZE(frame) (frame)->data_frame.df_size -#define DF_END(frame) (DF_OFF(frame) + DF_SIZE(frame)) - - #if LSQUIC_EXTRA_CHECKS static int frame_list_is_sane (const struct nocopy_data_in *ncdi) @@ -186,8 +184,6 @@ frame_list_is_sane (const struct nocopy_data_in *ncdi) } return ordered && !overlaps; } - - #define CHECK_ORDER(ncdi) assert(frame_list_is_sane(ncdi)) #else #define CHECK_ORDER(ncdi) @@ -280,6 +276,8 @@ insert_frame (struct nocopy_data_in *ncdi, struct stream_frame *new_frame, && read_offset == ncdi->ncdi_fin_off)) return INS_FRAME_DUP | CASE('G'); } + else if (read_offset > DF_OFF(new_frame)) + return INS_FRAME_OVERLAP | CASE('N'); goto list_was_empty; case 3: /* Both left and right neighbors */ case 2: /* Only left neighbor (prev_frame) */ @@ -299,6 +297,8 @@ insert_frame (struct nocopy_data_in *ncdi, struct stream_frame *new_frame, case 1: /* Only right neighbor (next_frame) */ if (DF_END(new_frame) > DF_OFF(next_frame)) return INS_FRAME_OVERLAP | CASE('K'); + else if (read_offset > DF_OFF(new_frame)) + return INS_FRAME_OVERLAP | CASE('O'); break; } @@ -512,13 +512,47 @@ nocopy_di_mem_used (struct data_in *data_in) } +static void +nocopy_di_dump_state (struct data_in *data_in) +{ + struct nocopy_data_in *const ncdi = NCDI_PTR(data_in); + const struct stream_frame *frame; + + LSQ_DEBUG("nocopy state: frames: %u; holes: %u; cons_far: %u", + ncdi->ncdi_n_frames, ncdi->ncdi_n_holes, ncdi->ncdi_cons_far); + TAILQ_FOREACH(frame, &ncdi->ncdi_frames_in, next_frame) + LSQ_DEBUG("frame: off: %"PRIu64"; read_off: %"PRIu16"; size: %"PRIu16 + "; fin: %d", DF_OFF(frame), frame->data_frame.df_read_off, + DF_SIZE(frame), DF_FIN(frame)); +} + + +static uint64_t +nocopy_di_readable_bytes (struct data_in *data_in, uint64_t read_offset) +{ + const struct nocopy_data_in *const ncdi = NCDI_PTR(data_in); + const struct stream_frame *frame; + uint64_t starting_offset; + + starting_offset = read_offset; + TAILQ_FOREACH(frame, &ncdi->ncdi_frames_in, next_frame) + if (DF_ROFF(frame) == read_offset) + read_offset += DF_END(frame) - DF_ROFF(frame); + + return read_offset - starting_offset; +} + + static const struct data_in_iface di_if_nocopy = { .di_destroy = nocopy_di_destroy, + .di_dump_state = nocopy_di_dump_state, .di_empty = nocopy_di_empty, .di_frame_done = nocopy_di_frame_done, .di_get_frame = nocopy_di_get_frame, .di_insert_frame = nocopy_di_insert_frame, .di_mem_used = nocopy_di_mem_used, + .di_readable_bytes + = nocopy_di_readable_bytes, .di_switch_impl = nocopy_di_switch_impl, }; diff --git a/src/liblsquic/lsquic_enc_sess.h b/src/liblsquic/lsquic_enc_sess.h new file mode 100644 index 000000000..652d18172 --- /dev/null +++ b/src/liblsquic/lsquic_enc_sess.h @@ -0,0 +1,348 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#ifndef LSQUIC_ENC_SESS_H +#define LSQUIC_ENC_SESS_H 1 + +struct lsquic_engine_public; +struct lsquic_packet_out; +struct lsquic_packet_in; +struct stream_wrapper; +struct ver_neg; +struct lsquic_conn; +struct transport_params; +struct lsquic_cid; +struct ssl_stream_method_st; +struct ssl_st; +struct sockaddr; +struct conn_cid_elem; + +#define DNONC_LENGTH 32 +#define SRST_LENGTH 16 + +/* From [draft-ietf-quic-tls-14]: + * + * Data is protected using a number of encryption levels: + * + * o Plaintext + * + * o Early Data (0-RTT) Keys + * + * o Handshake Keys + * + * o Application Data (1-RTT) Keys + */ + +/* This enum maps to the list above */ +enum enc_level +{ + ENC_LEV_CLEAR, + ENC_LEV_EARLY, + ENC_LEV_INIT, + ENC_LEV_FORW, + N_ENC_LEVS +}; + +enum handshake_error /* TODO: rename this enum */ +{ + DATA_NOT_ENOUGH = -2, + DATA_FORMAT_ERROR = -1, + HS_ERROR = -1, + DATA_NO_ERROR = 0, + HS_SHLO = 0, + HS_1RTT = 1, + HS_SREJ = 2, + HS_DELAYED = 3, + HS_PK_OFFLOAD = 4, +}; + +#ifndef LSQUIC_KEEP_ENC_SESS_HISTORY +# ifndef NDEBUG +# define LSQUIC_KEEP_ENC_SESS_HISTORY 1 +# else +# define LSQUIC_KEEP_ENC_SESS_HISTORY 0 +# endif +#endif + +#if LSQUIC_KEEP_ENC_SESS_HISTORY +#define ESHIST_BITS 7 +#define ESHIST_MASK ((1 << ESHIST_BITS) - 1) +#define ESHIST_STR_SIZE ((1 << ESHIST_BITS) + 1) +#endif + +enum enc_packout { ENCPA_OK, ENCPA_NOMEM, ENCPA_BADCRYPT, }; + +enum dec_packin { + DECPI_OK, + DECPI_NOMEM, + DECPI_TOO_SHORT, + DECPI_NOT_YET, + DECPI_BADCRYPT, + DECPI_VIOLATION, +}; + +typedef void enc_session_t; + +struct enc_session_funcs_common +{ + /* Global initialization: call once per implementation */ + int (*esf_global_init)(int flags); + + /* Global cleanup: call once per implementation */ + void (*esf_global_cleanup) (void); + + const char * + (*esf_cipher) (enc_session_t *); + + int + (*esf_keysize) (enc_session_t *); + + int + (*esf_alg_keysize) (enc_session_t *); + + const char * + (*esf_get_sni) (enc_session_t *); + + enum enc_packout + (*esf_encrypt_packet) (enc_session_t *, const struct lsquic_engine_public *, + struct lsquic_conn *, struct lsquic_packet_out *); + + enum dec_packin + (*esf_decrypt_packet)(enc_session_t *, struct lsquic_engine_public *, + const struct lsquic_conn *, struct lsquic_packet_in *); + + struct stack_st_X509 * + (*esf_get_server_cert_chain) (enc_session_t *); + + int + (*esf_verify_reset_token) (enc_session_t *, const unsigned char *, size_t); + + int + (*esf_did_zero_rtt_succeed) (enc_session_t *); + + int + (*esf_is_zero_rtt_enabled) (enc_session_t *); + + unsigned + esf_tag_len; +}; + +struct enc_session_funcs_gquic +{ +#if LSQUIC_KEEP_ENC_SESS_HISTORY + /* Grab encryption session history */ + void (*esf_get_hist) (enc_session_t *, + char buf[ESHIST_STR_SIZE]); +#endif + + /* Destroy enc session */ + void (*esf_destroy)(enc_session_t *enc_session); + + /* Return true if handshake has been completed */ + int (*esf_is_hsk_done)(enc_session_t *enc_session); + + /* Get value of setting specified by `tag' */ + int (*esf_get_peer_setting) (enc_session_t *, uint32_t tag, + uint32_t *val); + + /* Get value of peer option (that from COPT array) */ + int (*esf_get_peer_option) (enc_session_t *enc_session, + uint32_t tag); + + /* Create server session */ + enc_session_t * + (*esf_create_server) (lsquic_cid_t cid, const struct lsquic_engine_public *); + + /* out_len should have init value as the max length of out */ + enum handshake_error + (*esf_handle_chlo) (enc_session_t *enc_session, enum lsquic_version, + const uint8_t *in, int in_len, time_t t, + const struct sockaddr *ip_addr, const struct sockaddr *local, + uint8_t *out, size_t *out_len, + uint8_t nonce[DNONC_LENGTH], int *nonce_set); + + void (*esf_hsk_destroy)(void *hsk_ctx); + +#ifndef NDEBUG + /* Need to expose this function for testing */ + int (*esf_determine_diversification_key) (enc_session_t *, + uint8_t *diversification_nonce, int is_client); +#endif + + const char * + (*esf_get_ua) (enc_session_t *); + + int + (*esf_have_key_gt_one) (enc_session_t *enc_session); + +#ifndef NDEBUG + /* Functions that are only relevant in maintest. We may want to get rid + * of them somehow and only use the public API to test. + */ + + uint8_t + (*esf_have_key) (enc_session_t *); + + void + (*esf_set_have_key) (enc_session_t *, uint8_t); + + const unsigned char * + (*esf_get_enc_key_i) (enc_session_t *); + + const unsigned char * + (*esf_get_dec_key_i) (enc_session_t *); + + const unsigned char * + (*esf_get_enc_key_nonce_i) (enc_session_t *); + + const unsigned char * + (*esf_get_dec_key_nonce_i) (enc_session_t *); + + const unsigned char * + (*esf_get_enc_key_nonce_f) (enc_session_t *); + + const unsigned char * + (*esf_get_dec_key_nonce_f) (enc_session_t *); +#endif /* !defined(NDEBUG) */ + +#if LSQUIC_ENABLE_HANDSHAKE_DISABLE + void + (*esf_set_handshake_completed) (enc_session_t *); +#endif + + /* Create client session */ + enc_session_t * + (*esf_create_client) (const char *domain, lsquic_cid_t cid, + const struct lsquic_engine_public *, + const unsigned char *, size_t); + + /* -1 error, 0, OK, response in `buf' */ + int + (*esf_gen_chlo) (enc_session_t *, enum lsquic_version, + uint8_t *buf, size_t *len); + + int + (*esf_handle_chlo_reply) (enc_session_t *, + const uint8_t *data, int len); + + size_t + (*esf_mem_used)(enc_session_t *); + + /* Zero-rtt serialization needs the knowledge of the QUIC version, that's + * why there is a separate method for thus. Plus, we want to be able to + * call it after the "handshake is done" callback is called. + */ + void (*esf_maybe_dispatch_zero_rtt) (enc_session_t *, + struct lsquic_conn *conn, + void (*cb)(struct lsquic_conn *, const unsigned char *, size_t)); + + void (*esf_reset_cid) (enc_session_t *, const lsquic_cid_t *); +}; + +enum iquic_handshake_status { + IHS_WANT_READ, + IHS_WANT_WRITE, + IHS_STOP, +}; + +struct crypto_stream_if +{ + ssize_t (*csi_write) (void *stream, const void *buf, size_t len); + int (*csi_flush) (void *stream); + ssize_t (*csi_readf) (void *stream, + size_t (*readf)(void *, const unsigned char *, size_t, int), void *ctx); + int (*csi_wantwrite) (void *stream, int is_want); + int (*csi_wantread) (void *stream, int is_want); + enum enc_level + (*csi_enc_level) (void *stream); +}; + +struct enc_session_funcs_iquic +{ + enc_session_t * + (*esfi_create_client) (const char *domain, struct lsquic_engine_public *, + struct lsquic_conn *, const struct lsquic_cid *, + const struct ver_neg *, void *(crypto_streams)[4], + const struct crypto_stream_if *, + const unsigned char *, size_t); + + void + (*esfi_destroy) (enc_session_t *); + + struct ssl_st * + (*esfi_get_ssl) (enc_session_t *); + + struct transport_params * + (*esfi_get_peer_transport_params) (enc_session_t *); + + int + (*esfi_reset_dcid) (enc_session_t *, const struct lsquic_cid *, + const struct lsquic_cid *); + + int + (*esfi_init_server) (enc_session_t *); + + void + (*esfi_set_conn) (enc_session_t *, struct lsquic_conn *); + + void + (*esfi_set_streams) (enc_session_t *, void *(crypto_streams)[4], + const struct crypto_stream_if *); + + enc_session_t * + (*esfi_create_server) (struct lsquic_engine_public *, struct lsquic_conn *, + const struct lsquic_cid *, + void *(crypto_streams)[4], + const struct crypto_stream_if *, + const struct lsquic_cid *odcid); + + void + (*esfi_shake_stream)(enc_session_t *, struct lsquic_stream *, + const char *); + + void + (*esfi_1rtt_acked)(enc_session_t *); +}; + +extern +#ifdef NDEBUG +const +#endif +struct enc_session_funcs_common lsquic_enc_session_common_gquic_1; +extern const struct enc_session_funcs_common lsquic_enc_session_common_ietf_v1; + +extern +#ifdef NDEBUG +const +#endif +struct enc_session_funcs_gquic lsquic_enc_session_gquic_gquic_1; + +extern const struct enc_session_funcs_iquic lsquic_enc_session_iquic_ietf_v1; + +#define select_esf_common_by_ver(ver) ( \ + ver == LSQVER_ID22 ? &lsquic_enc_session_common_ietf_v1 : \ + ver == LSQVER_VERNEG ? &lsquic_enc_session_common_ietf_v1 : \ + &lsquic_enc_session_common_gquic_1 ) + +#define select_esf_gquic_by_ver(ver) ( \ + ver ? &lsquic_enc_session_gquic_gquic_1 : &lsquic_enc_session_gquic_gquic_1) + +#define select_esf_iquic_by_ver(ver) ( \ + ver ? &lsquic_enc_session_iquic_ietf_v1 : &lsquic_enc_session_iquic_ietf_v1) + +extern const char *const lsquic_enclev2str[]; + +extern const struct lsquic_stream_if lsquic_cry_sm_if; + +extern const struct lsquic_stream_if lsquic_mini_cry_sm_if; + +/* RFC 7301, Section 3.2 */ +#define ALERT_NO_APPLICATION_PROTOCOL 120 + +enum lsquic_version +lsquic_zero_rtt_version (const unsigned char *, size_t); + +/* This is seems to be true for all of the ciphers used by IETF QUIC. + * XXX: Perhaps add a check? + */ +#define IQUIC_TAG_LEN 16 + +#endif diff --git a/src/liblsquic/lsquic_enc_sess_common.c b/src/liblsquic/lsquic_enc_sess_common.c new file mode 100644 index 000000000..5208a31e7 --- /dev/null +++ b/src/liblsquic/lsquic_enc_sess_common.c @@ -0,0 +1,34 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#include +#include +#include + +#include "lsquic.h" +#include "lsquic_types.h" +#include "lsquic_int_types.h" +#include "lsquic_enc_sess.h" +#include "lsquic_version.h" + + +const char *const lsquic_enclev2str[] = +{ + [ENC_LEV_EARLY] = "early", + [ENC_LEV_CLEAR] = "clear", + [ENC_LEV_INIT] = "initial", + [ENC_LEV_FORW] = "forw-secure", +}; + + +enum lsquic_version +lsquic_zero_rtt_version (const unsigned char *buf, size_t bufsz) +{ + lsquic_ver_tag_t tag; + + if (bufsz >= sizeof(tag)) + { + memcpy(&tag, buf, sizeof(tag)); + return lsquic_tag2ver(tag); + } + else + return -1; +} diff --git a/src/liblsquic/lsquic_enc_sess_ietf.c b/src/liblsquic/lsquic_enc_sess_ietf.c new file mode 100644 index 000000000..2d7a631ab --- /dev/null +++ b/src/liblsquic/lsquic_enc_sess_ietf.c @@ -0,0 +1,2670 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_enc_sess_ietf.c -- Crypto session for IETF QUIC + */ + +#include +#include +#include +#include +#include +#include +#if LSQUIC_PREFERRED_ADDR +#include +#endif + +#include +#include +#include +#include + +#include "lsquic_types.h" +#include "lsquic_hkdf.h" +#include "lsquic.h" +#include "lsquic_int_types.h" +#include "lsquic_sizes.h" +#include "lsquic_hash.h" +#include "lsquic_conn.h" +#include "lsquic_enc_sess.h" +#include "lsquic_parse.h" +#include "lsquic_mm.h" +#include "lsquic_engine_public.h" +#include "lsquic_packet_common.h" +#include "lsquic_packet_out.h" +#include "lsquic_packet_ietf.h" +#include "lsquic_packet_in.h" +#include "lsquic_util.h" +#include "lsquic_byteswap.h" +#include "lsquic_ev_log.h" +#include "lsquic_trans_params.h" +#include "lsquic_engine_public.h" +#include "lsquic_version.h" +#include "lsquic_ver_neg.h" +#include "lsquic_byteswap.h" +#include "lsquic_frab_list.h" +#include "lsquic_tokgen.h" +#include "lsquic_ietf.h" + +#if __GNUC__ +# define UNLIKELY(cond) __builtin_expect(cond, 0) +#else +# define UNLIKELY(cond) cond +#endif + +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + +#define LSQUIC_LOGGER_MODULE LSQLM_HANDSHAKE +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(enc_sess->esi_conn) +#include "lsquic_logger.h" + +/* [draft-ietf-quic-tls-11] Section 5.3.2 */ +#define HSK_SECRET_SZ SHA256_DIGEST_LENGTH + +/* TODO: Specify ciphers */ +#define HSK_CIPHERS "TLS13-AES-128-GCM-SHA256" \ + ":TLS13-AES-256-GCM-SHA384" \ + ":TLS13-CHACHA20-POLY1305-SHA256" + +#define KEY_LABEL "quic key" +#define KEY_LABEL_SZ (sizeof(KEY_LABEL) - 1) +#define IV_LABEL "quic iv" +#define IV_LABEL_SZ (sizeof(IV_LABEL) - 1) +#define PN_LABEL "quic hp" +#define PN_LABEL_SZ (sizeof(PN_LABEL) - 1) + +#define N_HSK_PAIRS (N_ENC_LEVS - 1) + +static const struct alpn_map { + enum lsquic_version version; + const unsigned char *alpn; +} s_alpns[] = { + { LSQVER_ID22, (unsigned char *) "\x05h3-22", }, + { LSQVER_VERNEG, (unsigned char *) "\x05h3-22", }, +}; + +struct enc_sess_iquic; +struct crypto_ctx; +struct crypto_ctx_pair; +struct header_prot; + +static const int s_log_seal_and_open; +static char s_str[0x1000]; + +static const SSL_QUIC_METHOD cry_quic_method; + +static int s_idx = -1; + +static int +setup_handshake_keys (struct enc_sess_iquic *, const lsquic_cid_t *); + +static void +free_handshake_keys (struct enc_sess_iquic *); + +static struct stack_st_X509 * +iquic_esf_get_server_cert_chain (enc_session_t *); + +static void +maybe_drop_SSL (struct enc_sess_iquic *); + + +typedef void (*gen_hp_mask_f)(struct enc_sess_iquic *, + const struct header_prot *, unsigned cliser, + const unsigned char *sample, unsigned char mask[16]); + + +struct header_prot +{ + const EVP_CIPHER *hp_cipher; + gen_hp_mask_f hp_gen_mask; + enum enc_level hp_enc_level; + unsigned hp_sz; + unsigned char hp_buf[2][EVP_MAX_KEY_LENGTH]; +}; + +#define header_prot_inited(hp_) ((hp_)->hp_sz > 0) + + +struct crypto_ctx +{ + enum { + YK_INITED = 1 << 0, + } yk_flags; + EVP_AEAD_CTX yk_aead_ctx; + unsigned yk_key_sz; + unsigned yk_iv_sz; + unsigned char yk_key_buf[EVP_MAX_KEY_LENGTH]; + unsigned char yk_iv_buf[EVP_MAX_IV_LENGTH]; +}; + + +struct crypto_ctx_pair +{ + lsquic_packno_t ykp_thresh; + struct crypto_ctx ykp_ctx[2]; /* client, server */ +}; + + +/* [draft-ietf-quic-tls-12] Section 5.3.6 */ +static int +init_crypto_ctx (struct crypto_ctx *crypto_ctx, const EVP_MD *md, + const EVP_AEAD *aead, const unsigned char *secret, + size_t secret_sz, enum evp_aead_direction_t dir) +{ + crypto_ctx->yk_key_sz = EVP_AEAD_key_length(aead); + crypto_ctx->yk_iv_sz = EVP_AEAD_nonce_length(aead); + + if (crypto_ctx->yk_key_sz > sizeof(crypto_ctx->yk_key_buf) + || crypto_ctx->yk_iv_sz > sizeof(crypto_ctx->yk_iv_buf)) + { + return -1; + } + + lsquic_qhkdf_expand(md, secret, secret_sz, KEY_LABEL, KEY_LABEL_SZ, + crypto_ctx->yk_key_buf, crypto_ctx->yk_key_sz); + lsquic_qhkdf_expand(md, secret, secret_sz, IV_LABEL, IV_LABEL_SZ, + crypto_ctx->yk_iv_buf, crypto_ctx->yk_iv_sz); + if (!EVP_AEAD_CTX_init_with_direction(&crypto_ctx->yk_aead_ctx, aead, + crypto_ctx->yk_key_buf, crypto_ctx->yk_key_sz, IQUIC_TAG_LEN, dir)) + return -1; + + crypto_ctx->yk_flags |= YK_INITED; + + return 0; +} + + +static void +derive_hp_secrets (struct header_prot *hp, const EVP_MD *md, + const EVP_AEAD *aead, size_t secret_sz, + const unsigned char *client_secret, const unsigned char *server_secret) +{ + hp->hp_sz = EVP_AEAD_key_length(aead); + if (client_secret) + lsquic_qhkdf_expand(md, client_secret, secret_sz, PN_LABEL, PN_LABEL_SZ, + hp->hp_buf[0], hp->hp_sz); + if (server_secret) + lsquic_qhkdf_expand(md, server_secret, secret_sz, PN_LABEL, PN_LABEL_SZ, + hp->hp_buf[1], hp->hp_sz); +} + + +static void +cleanup_crypto_ctx (struct crypto_ctx *crypto_ctx) +{ + if (crypto_ctx->yk_flags & YK_INITED) + { + EVP_AEAD_CTX_cleanup(&crypto_ctx->yk_aead_ctx); + crypto_ctx->yk_flags &= ~YK_INITED; + } +} + + +struct enc_sess_iquic +{ + struct lsquic_engine_public + *esi_enpub; + struct lsquic_conn *esi_conn; + void **esi_streams; + const struct crypto_stream_if *esi_cryst_if; + const struct ver_neg + *esi_ver_neg; + SSL *esi_ssl; + + /* These are used for forward encryption key phase 0 and 1 */ + struct header_prot esi_hp; + struct crypto_ctx_pair + esi_pairs[2]; + /* These are used during handshake. There are three of them. + * esi_hsk_pairs and esi_hsk_hps are allocated and freed + * together. + */ + struct crypto_ctx_pair * + esi_hsk_pairs; + struct header_prot *esi_hsk_hps; + lsquic_packno_t esi_max_packno[N_PNS]; + lsquic_cid_t esi_odcid; + unsigned esi_key_phase; + enum { + ESI_INITIALIZED = 1 << 0, + ESI_LOG_SECRETS = 1 << 1, + ESI_HANDSHAKE_OK = 1 << 2, + ESI_ODCID = 1 << 3, + ESI_ON_WRITE = 1 << 4, + ESI_SERVER = 1 << 5, + ESI_USE_SSL_TICKET = 1 << 6, + ESI_HAVE_PEER_TP = 1 << 7, + ESI_ALPN_CHECKED = 1 << 8, + ESI_CACHED_INFO = 1 << 9, + ESI_1RTT_ACKED = 1 << 10, + } esi_flags; + enum evp_aead_direction_t + esi_dir[2]; /* client, server */ + enum enc_level esi_last_w; + unsigned esi_trasec_sz; + char *esi_hostname; + void *esi_keylog_handle; +#ifndef NDEBUG + char *esi_sni_bypass; +#endif + const unsigned char *esi_alpn; + unsigned char *esi_zero_rtt_buf; + size_t esi_zero_rtt_sz; + /* Need MD and AEAD for key rotation */ + const EVP_MD *esi_md; + const EVP_AEAD *esi_aead; + struct { + const char *cipher_name; + int alg_bits; + } esi_cached_info; + /* Secrets are kept for key rotation */ + unsigned char esi_traffic_secrets[2][EVP_MAX_KEY_LENGTH]; + /* We never use the first two levels, so it seems we could reduce the + * memory requirement here at the cost of adding some code. + */ + struct frab_list esi_frals[N_ENC_LEVS]; + struct transport_params + esi_peer_tp; +}; + + +static void +gen_hp_mask_aes (struct enc_sess_iquic *enc_sess, + const struct header_prot *hp, unsigned cliser, + const unsigned char *sample, unsigned char mask[EVP_MAX_BLOCK_LENGTH]) +{ + EVP_CIPHER_CTX hp_ctx; + int out_len; + + EVP_CIPHER_CTX_init(&hp_ctx); + if (EVP_EncryptInit_ex(&hp_ctx, hp->hp_cipher, NULL, hp->hp_buf[cliser], 0) + && EVP_EncryptUpdate(&hp_ctx, mask, &out_len, sample, 16)) + { + assert(out_len >= 5); + } + else + { + LSQ_WARN("cannot generate hp mask, error code: %"PRIu32, + ERR_get_error()); + enc_sess->esi_conn->cn_if->ci_internal_error(enc_sess->esi_conn, + "cannot generate hp mask, error code: %"PRIu32, ERR_get_error()); + } + + (void) EVP_CIPHER_CTX_cleanup(&hp_ctx); +} + + +static void +gen_hp_mask_chacha20 (struct enc_sess_iquic *enc_sess, + const struct header_prot *hp, unsigned cliser, + const unsigned char *sample, unsigned char mask[EVP_MAX_BLOCK_LENGTH]) +{ + const uint8_t *nonce; + uint32_t counter; + +#if __BYTE_ORDER == __LITTLE_ENDIAN + memcpy(&counter, sample, sizeof(counter)); +#else +#error TODO: support non-little-endian machines +#endif + nonce = sample + sizeof(counter); + CRYPTO_chacha_20(mask, (unsigned char [5]) { 0, 0, 0, 0, 0, }, 5, + hp->hp_buf[cliser], nonce, counter); +} + + +static void +apply_hp (struct enc_sess_iquic *enc_sess, + const struct header_prot *hp, unsigned cliser, + unsigned char *dst, unsigned packno_off, unsigned packno_len) +{ + unsigned char mask[EVP_MAX_BLOCK_LENGTH]; + char mask_str[5 * 2 + 1]; + + hp->hp_gen_mask(enc_sess, hp, cliser, dst + packno_off + 4, mask); + LSQ_DEBUG("apply header protection using mask %s", + HEXSTR(mask, 5, mask_str)); + dst[0] ^= (0xF | (((dst[0] & 0x80) == 0) << 4)) & mask[0]; + switch (packno_len) + { + case 4: + dst[packno_off + 3] ^= mask[4]; + /* fall-through */ + case 3: + dst[packno_off + 2] ^= mask[3]; + /* fall-through */ + case 2: + dst[packno_off + 1] ^= mask[2]; + /* fall-through */ + default: + dst[packno_off + 0] ^= mask[1]; + } +} + + +static lsquic_packno_t +decode_packno (lsquic_packno_t max_packno, lsquic_packno_t packno, + unsigned shift) +{ + lsquic_packno_t candidates[3], epoch_delta; + int64_t diffs[3]; + unsigned min;; + + epoch_delta = 1ULL << shift; + candidates[1] = (max_packno & ~(epoch_delta - 1)) + packno; + candidates[0] = candidates[1] - epoch_delta; + candidates[2] = candidates[1] + epoch_delta; + + diffs[0] = llabs((int64_t) candidates[0] - (int64_t) max_packno); + diffs[1] = llabs((int64_t) candidates[1] - (int64_t) max_packno); + diffs[2] = llabs((int64_t) candidates[2] - (int64_t) max_packno); + + min = diffs[1] < diffs[0]; + if (diffs[2] < diffs[min]) + min = 2; + + return candidates[min]; +} + + +static lsquic_packno_t +strip_hp (struct enc_sess_iquic *enc_sess, + const struct header_prot *hp, unsigned cliser, + const unsigned char *iv, unsigned char *dst, unsigned packno_off, + unsigned *packno_len) +{ + enum packnum_space pns; + lsquic_packno_t packno; + unsigned shift; + unsigned char mask[EVP_MAX_BLOCK_LENGTH]; + char mask_str[5 * 2 + 1]; + + hp->hp_gen_mask(enc_sess, hp, cliser, iv, mask); + LSQ_DEBUG("strip header protection using mask %s", + HEXSTR(mask, 5, mask_str)); + dst[0] ^= (0xF | (((dst[0] & 0x80) == 0) << 4)) & mask[0]; + packno = 0; + shift = 0; + *packno_len = 1 + (dst[0] & 3); + switch (*packno_len) + { + case 4: + dst[packno_off + 3] ^= mask[4]; + packno |= dst[packno_off + 3]; + shift += 8; + /* fall-through */ + case 3: + dst[packno_off + 2] ^= mask[3]; + packno |= dst[packno_off + 2] << shift; + shift += 8; + /* fall-through */ + case 2: + dst[packno_off + 1] ^= mask[2]; + packno |= dst[packno_off + 1] << shift; + shift += 8; + /* fall-through */ + default: + dst[packno_off + 0] ^= mask[1]; + packno |= dst[packno_off + 0] << shift; + shift += 8; + } + pns = lsquic_enclev2pns[hp->hp_enc_level]; + return decode_packno(enc_sess->esi_max_packno[pns], packno, shift); +} + + +static int +gen_trans_params (struct enc_sess_iquic *enc_sess, unsigned char *buf, + size_t bufsz) +{ + const struct lsquic_engine_settings *const settings = + &enc_sess->esi_enpub->enp_settings; + struct transport_params params; + int len; + + memset(¶ms, 0, sizeof(params)); + if (enc_sess->esi_flags & ESI_SERVER) + { + const struct lsquic_conn *const lconn = enc_sess->esi_conn; + + params.tp_flags |= TRAPA_SERVER|TRAPA_RESET_TOKEN; + + lsquic_tg_generate_sreset(enc_sess->esi_enpub->enp_tokgen, + CN_SCID(lconn), params.tp_stateless_reset_token); + + if (enc_sess->esi_flags & ESI_ODCID) + { + params.tp_original_cid = enc_sess->esi_odcid; + params.tp_flags |= TRAPA_ORIGINAL_CID; + } +#if LSQUIC_PREFERRED_ADDR + char addr_buf[INET6_ADDRSTRLEN + 6 /* port */ + 1]; + const char *s, *colon; + struct lsquic_conn *conn; + struct conn_cid_elem *cce; + unsigned seqno; + s = getenv("LSQUIC_PREFERRED_ADDR4"); + if (s && strlen(s) < sizeof(addr_buf) && (colon = strchr(s, ':'))) + { + strncpy(addr_buf, s, colon - s); + addr_buf[colon - s] = '\0'; + inet_pton(AF_INET, addr_buf, params.tp_preferred_address.ipv4_addr); + params.tp_preferred_address.ipv4_port = atoi(colon + 1); + params.tp_flags |= TRAPA_PREFADDR_IPv4; + } + s = getenv("LSQUIC_PREFERRED_ADDR6"); + if (s && strlen(s) < sizeof(addr_buf) && (colon = strrchr(s, ':'))) + { + strncpy(addr_buf, s, colon - s); + addr_buf[colon - s] = '\0'; + inet_pton(AF_INET6, addr_buf, + params.tp_preferred_address.ipv6_addr); + params.tp_preferred_address.ipv6_port = atoi(colon + 1); + params.tp_flags |= TRAPA_PREFADDR_IPv6; + } + conn = enc_sess->esi_conn; + if ((params.tp_flags & (TRAPA_PREFADDR_IPv4|TRAPA_PREFADDR_IPv6)) + && (1 << conn->cn_n_cces) - 1 != conn->cn_cces_mask) + { + seqno = 0; + for (cce = lconn->cn_cces; cce < END_OF_CCES(lconn); ++cce) + { + if (lconn->cn_cces_mask & (1 << (cce - lconn->cn_cces))) + { + if ((cce->cce_flags & CCE_SEQNO) && cce->cce_seqno > seqno) + seqno = cce->cce_seqno; + } + else + break; + } + if (cce == END_OF_CCES(lconn)) + { + goto cant_use_prefaddr; + } + cce->cce_seqno = seqno + 1; + cce->cce_flags = CCE_SEQNO; + lsquic_generate_cid(&cce->cce_cid, + enc_sess->esi_enpub->enp_settings.es_scid_len); + /* Don't add to hash: migration must not start until *after* + * handshake is complete. + */ + conn->cn_cces_mask |= 1 << (cce - conn->cn_cces); + params.tp_preferred_address.cid = cce->cce_cid; + lsquic_tg_generate_sreset(enc_sess->esi_enpub->enp_tokgen, + ¶ms.tp_preferred_address.cid, + params.tp_preferred_address.srst); + } + else + { + cant_use_prefaddr: + params.tp_flags &= ~(TRAPA_PREFADDR_IPv4|TRAPA_PREFADDR_IPv6); + } +#endif + } + params.tp_init_max_data = settings->es_init_max_data; + params.tp_init_max_stream_data_bidi_local + = settings->es_init_max_stream_data_bidi_local; + params.tp_init_max_stream_data_bidi_remote + = settings->es_init_max_stream_data_bidi_remote; + params.tp_init_max_stream_data_uni + = settings->es_init_max_stream_data_uni; + params.tp_init_max_streams_uni + = settings->es_init_max_streams_uni; + params.tp_init_max_streams_bidi + = settings->es_init_max_streams_bidi; + params.tp_ack_delay_exponent + = TP_DEF_ACK_DELAY_EXP; + params.tp_idle_timeout = settings->es_idle_timeout * 1000; + params.tp_max_ack_delay = TP_DEF_MAX_ACK_DELAY; + params.tp_max_packet_size = 1370 /* XXX: based on socket */; + params.tp_active_connection_id_limit = MAX_IETF_CONN_DCIDS + - 1 /* One slot is used by peer's SCID */ + - !!(params.tp_flags & (TRAPA_PREFADDR_IPv4|TRAPA_PREFADDR_IPv6)); + if (!settings->es_allow_migration) + params.tp_disable_migration = 1; + + len = lsquic_tp_encode(¶ms, buf, bufsz); + if (len >= 0) + LSQ_DEBUG("generated transport parameters buffer of %d bytes", len); + else + LSQ_WARN("cannot generate transport parameters: %d", errno); + return len; +} + + +/* + * Format: + * uint32_t lsquic_ver_tag_t + * uint32_t encoder version + * uint32_t ticket_size + * uint8_t ticket_buf[ ticket_size ] + * uint32_t trapa_size + * uint8_t trapa_buf[ trapa_size ] + */ + +#define ZERO_RTT_VERSION 1 + +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define READ_NUM(var_, ptr_) do { \ + memcpy(&var_, ptr_, sizeof(var_)); \ + var_ = bswap_32(var_); \ + ptr_ += sizeof(var_); \ +} while (0) +#else +#define READ_NUM(var_, ptr_) do { \ + memcpy(&var_, ptr_, sizeof(var_)); \ + ptr_ += sizeof(var_); \ +} while (0) +#endif + +static SSL_SESSION * +maybe_create_SSL_SESSION (struct enc_sess_iquic *enc_sess, + const SSL_CTX *ssl_ctx) +{ + SSL_SESSION *ssl_session; + lsquic_ver_tag_t ver_tag; + enum lsquic_version quic_ver; + uint32_t rtt_ver, ticket_sz, trapa_sz; + const unsigned char *ticket_buf, *trapa_buf, *p; + const unsigned char *const end + = enc_sess->esi_zero_rtt_buf + enc_sess->esi_zero_rtt_sz; + + if (enc_sess->esi_zero_rtt_sz + < sizeof(ver_tag) + sizeof(rtt_ver) + sizeof(ticket_sz)) + { + LSQ_DEBUG("rtt buf too short"); + return NULL; + } + + p = enc_sess->esi_zero_rtt_buf; + memcpy(&ver_tag, p, sizeof(ver_tag)); + p += sizeof(ver_tag); + quic_ver = lsquic_tag2ver(ver_tag); + if (quic_ver != enc_sess->esi_ver_neg->vn_ver) + { + LSQ_DEBUG("negotiated version %s does not match that in the zero-rtt " + "info buffer", lsquic_ver2str[enc_sess->esi_ver_neg->vn_ver]); + return NULL; + } + + READ_NUM(rtt_ver, p); + if (rtt_ver != ZERO_RTT_VERSION) + { + LSQ_DEBUG("cannot use zero-rtt buffer: encoded using %"PRIu32", " + "while current version is %u", rtt_ver, ZERO_RTT_VERSION); + return NULL; + } + + READ_NUM(ticket_sz, p); + if (p + ticket_sz > end) + { + LSQ_WARN("truncated ticket buffer"); + return NULL; + } + + ticket_buf = p; + p += ticket_sz; + + if (p + sizeof(trapa_sz) > end) + { + LSQ_WARN("too short to read trapa size"); + return NULL; + } + + READ_NUM(trapa_sz, p); + if (p + trapa_sz > end) + { + LSQ_WARN("truncated trapa buffer"); + return NULL; + } + trapa_buf = p; + p += trapa_sz; + assert(p == end); + + (void) /* TODO */ trapa_buf; + + ssl_session = SSL_SESSION_from_bytes(ticket_buf, ticket_sz, ssl_ctx); + if (!ssl_session) + { + LSQ_WARN("SSL_SESSION could not be parsed out"); + return NULL; + } + + LSQ_INFO("instantiated SSL_SESSION from serialized buffer"); + return ssl_session; +} + + +static void +init_frals (struct enc_sess_iquic *enc_sess) +{ + struct frab_list *fral; + + for (fral = enc_sess->esi_frals; fral < enc_sess->esi_frals + + sizeof(enc_sess->esi_frals) / sizeof(enc_sess->esi_frals[0]); + ++fral) + lsquic_frab_list_init(fral, 0x100, NULL, NULL, NULL); +} + + +static enc_session_t * +iquic_esfi_create_client (const char *hostname, + struct lsquic_engine_public *enpub, struct lsquic_conn *lconn, + const lsquic_cid_t *dcid, const struct ver_neg *ver_neg, + void *crypto_streams[4], const struct crypto_stream_if *cryst_if, + const unsigned char *zero_rtt, size_t zero_rtt_sz) +{ + struct enc_sess_iquic *enc_sess; + + enc_sess = calloc(1, sizeof(*enc_sess)); + if (!enc_sess) + return NULL; + + if (hostname) + { + enc_sess->esi_hostname = strdup(hostname); + if (!enc_sess->esi_hostname) + { + free(enc_sess); + return NULL; + } + } + else + enc_sess->esi_hostname = NULL; + + enc_sess->esi_enpub = enpub; + enc_sess->esi_streams = crypto_streams; + enc_sess->esi_cryst_if = cryst_if; + enc_sess->esi_conn = lconn; + enc_sess->esi_ver_neg = ver_neg; + + enc_sess->esi_dir[0] = evp_aead_seal; + enc_sess->esi_dir[1] = evp_aead_open; + + LSQ_DEBUGC("created client, DCID: %"CID_FMT, CID_BITS(dcid)); + { + const char *log; + log = getenv("LSQUIC_LOG_SECRETS"); + if (log) + { + if (atoi(log)) + enc_sess->esi_flags |= ESI_LOG_SECRETS; + LSQ_DEBUG("will %slog secrets", atoi(log) ? "" : "not "); + } + } + + init_frals(enc_sess); + + if (0 != setup_handshake_keys(enc_sess, dcid)) + { + free(enc_sess); + return NULL; + } + + /* Have to wait until the call to init_client() -- this is when the + * result of version negotiation is known. + */ + if (zero_rtt && zero_rtt_sz) + { + enc_sess->esi_zero_rtt_buf = malloc(zero_rtt_sz); + if (enc_sess->esi_zero_rtt_buf) + { + memcpy(enc_sess->esi_zero_rtt_buf, zero_rtt, zero_rtt_sz); + enc_sess->esi_zero_rtt_sz = zero_rtt_sz; + } + else + enc_sess->esi_zero_rtt_sz = 0; + } + else + { + enc_sess->esi_zero_rtt_buf = NULL; + enc_sess->esi_zero_rtt_sz = 0; + } + + return enc_sess; +} + + +static void +iquic_esfi_set_streams (enc_session_t *enc_session_p, + void *(crypto_streams)[4], const struct crypto_stream_if *cryst_if) +{ + struct enc_sess_iquic *const enc_sess = enc_session_p; + enc_sess->esi_streams = crypto_streams; + enc_sess->esi_cryst_if = cryst_if; +} + + +static enc_session_t * +iquic_esfi_create_server (struct lsquic_engine_public *enpub, + struct lsquic_conn *lconn, const lsquic_cid_t *first_dcid, + void *(crypto_streams)[4], + const struct crypto_stream_if *cryst_if, + const struct lsquic_cid *odcid) +{ + struct enc_sess_iquic *enc_sess; + + enc_sess = calloc(1, sizeof(*enc_sess)); + if (!enc_sess) + return NULL; + +#ifndef NDEBUG + enc_sess->esi_sni_bypass = getenv("LSQUIC_SNI_BYPASS"); +#endif + + enc_sess->esi_flags = ESI_SERVER; + enc_sess->esi_streams = crypto_streams; + enc_sess->esi_cryst_if = cryst_if; + enc_sess->esi_enpub = enpub; + enc_sess->esi_conn = lconn; + + enc_sess->esi_dir[0] = evp_aead_open; + enc_sess->esi_dir[1] = evp_aead_seal; + + if (odcid) + { + enc_sess->esi_odcid = *odcid; + enc_sess->esi_flags |= ESI_ODCID; + } + + init_frals(enc_sess); + + { + const char *log; + log = getenv("LSQUIC_LOG_SECRETS"); + if (log) + { + if (atoi(log)) + enc_sess->esi_flags |= ESI_LOG_SECRETS; + LSQ_DEBUG("will %slog secrets", atoi(log) ? "" : "not "); + } + } + + if (0 != setup_handshake_keys(enc_sess, first_dcid)) + { + free(enc_sess); + return NULL; + } + + return enc_sess; +} + + +static void +log_crypto_pair (const struct enc_sess_iquic *enc_sess, + const struct crypto_ctx_pair *pair, const char *name) +{ + char hexbuf[EVP_MAX_MD_SIZE * 2 + 1]; + LSQ_DEBUG("client %s key: %s", name, + HEXSTR(pair->ykp_ctx[0].yk_key_buf, pair->ykp_ctx[0].yk_key_sz, + hexbuf)); + LSQ_DEBUG("client %s iv: %s", name, + HEXSTR(pair->ykp_ctx[0].yk_iv_buf, pair->ykp_ctx[0].yk_iv_sz, + hexbuf)); + LSQ_DEBUG("server %s key: %s", name, + HEXSTR(pair->ykp_ctx[1].yk_key_buf, pair->ykp_ctx[1].yk_key_sz, + hexbuf)); + LSQ_DEBUG("server %s iv: %s", name, + HEXSTR(pair->ykp_ctx[1].yk_iv_buf, pair->ykp_ctx[1].yk_iv_sz, + hexbuf)); +} + + +static void +log_hp (const struct enc_sess_iquic *enc_sess, + const struct header_prot *hp, const char *name) +{ + char hexbuf[EVP_MAX_MD_SIZE * 2 + 1]; + LSQ_DEBUG("client %s hp: %s", name, + HEXSTR(hp->hp_buf[0], hp->hp_sz, hexbuf)); + LSQ_DEBUG("server %s hp: %s", name, + HEXSTR(hp->hp_buf[1], hp->hp_sz, hexbuf)); +} + + +/* [draft-ietf-quic-tls-12] Section 5.3.2 */ +static int +setup_handshake_keys (struct enc_sess_iquic *enc_sess, const lsquic_cid_t *cid) +{ + const EVP_MD *const md = EVP_sha256(); + const EVP_AEAD *const aead = EVP_aead_aes_128_gcm(); + struct crypto_ctx_pair *pair; + struct header_prot *hp; + size_t hsk_secret_sz; + unsigned char hsk_secret[EVP_MAX_MD_SIZE]; + unsigned char secret[2][SHA256_DIGEST_LENGTH]; /* client, server */ + char hexbuf[EVP_MAX_MD_SIZE * 2 + 1]; + + if (!enc_sess->esi_hsk_pairs) + { + enc_sess->esi_hsk_pairs = calloc(N_HSK_PAIRS, + sizeof(enc_sess->esi_hsk_pairs[0])); + enc_sess->esi_hsk_hps = calloc(N_HSK_PAIRS, + sizeof(enc_sess->esi_hsk_hps[0])); + if (!(enc_sess->esi_hsk_pairs && enc_sess->esi_hsk_hps)) + { + free(enc_sess->esi_hsk_pairs); + free(enc_sess->esi_hsk_hps); + return -1; + } + } + pair = &enc_sess->esi_hsk_pairs[ENC_LEV_CLEAR]; + pair->ykp_thresh = IQUIC_INVALID_PACKNO; + hp = &enc_sess->esi_hsk_hps[ENC_LEV_CLEAR]; + + HKDF_extract(hsk_secret, &hsk_secret_sz, md, cid->idbuf, cid->len, + HSK_SALT, HSK_SALT_SZ); + if (enc_sess->esi_flags & ESI_LOG_SECRETS) + { + LSQ_DEBUG("handshake salt: %s", HEXSTR(HSK_SALT, HSK_SALT_SZ, hexbuf)); + LSQ_DEBUG("handshake secret: %s", HEXSTR(hsk_secret, hsk_secret_sz, + hexbuf)); + } + + lsquic_qhkdf_expand(md, hsk_secret, hsk_secret_sz, CLIENT_LABEL, + CLIENT_LABEL_SZ, secret[0], sizeof(secret[0])); + LSQ_DEBUG("client handshake secret: %s", + HEXSTR(secret[0], sizeof(secret[0]), hexbuf)); + if (0 != init_crypto_ctx(&pair->ykp_ctx[0], md, aead, secret[0], + sizeof(secret[0]), enc_sess->esi_dir[0])) + goto err; + lsquic_qhkdf_expand(md, hsk_secret, hsk_secret_sz, SERVER_LABEL, + SERVER_LABEL_SZ, secret[1], sizeof(secret[1])); + LSQ_DEBUG("server handshake secret: %s", + HEXSTR(secret[1], sizeof(secret[1]), hexbuf)); + if (0 != init_crypto_ctx(&pair->ykp_ctx[1], md, aead, secret[1], + sizeof(secret[1]), enc_sess->esi_dir[1])) + goto err; + + /* [draft-ietf-quic-tls-12] Section 5.6.1: AEAD_AES_128_GCM implies + * 128-bit AES-CTR. + */ + hp->hp_cipher = EVP_aes_128_ecb(); + hp->hp_gen_mask = gen_hp_mask_aes; + hp->hp_enc_level = ENC_LEV_CLEAR; + derive_hp_secrets(hp, md, aead, sizeof(secret[0]), secret[0], secret[1]); + + if (enc_sess->esi_flags & ESI_LOG_SECRETS) + { + log_crypto_pair(enc_sess, pair, "handshake"); + log_hp(enc_sess, hp, "handshake"); + } + + return 0; + + err: + cleanup_crypto_ctx(&pair->ykp_ctx[0]); + cleanup_crypto_ctx(&pair->ykp_ctx[1]); + return -1; +} + + +static void +free_handshake_keys (struct enc_sess_iquic *enc_sess) +{ + struct crypto_ctx_pair *pair; + + if (enc_sess->esi_hsk_pairs) + { + assert(enc_sess->esi_hsk_hps); + for (pair = enc_sess->esi_hsk_pairs; pair < + enc_sess->esi_hsk_pairs + N_HSK_PAIRS; ++pair) + { + cleanup_crypto_ctx(&pair->ykp_ctx[0]); + cleanup_crypto_ctx(&pair->ykp_ctx[1]); + } + free(enc_sess->esi_hsk_pairs); + enc_sess->esi_hsk_pairs = NULL; + free(enc_sess->esi_hsk_hps); + enc_sess->esi_hsk_hps = NULL; + } + else + assert(!enc_sess->esi_hsk_hps); +} + + +static void +keylog_callback (const SSL *ssl, const char *line) +{ + struct enc_sess_iquic *enc_sess; + + enc_sess = SSL_get_ex_data(ssl, s_idx); + if (enc_sess->esi_keylog_handle) + enc_sess->esi_enpub->enp_kli->kli_log_line( + enc_sess->esi_keylog_handle, line); +} + + +static void +maybe_setup_key_logging (struct enc_sess_iquic *enc_sess) +{ + if (enc_sess->esi_enpub->enp_kli) + { + enc_sess->esi_keylog_handle = enc_sess->esi_enpub->enp_kli->kli_open( + enc_sess->esi_enpub->enp_kli_ctx, enc_sess->esi_conn); + LSQ_DEBUG("SSL keys %s be logged", + enc_sess->esi_keylog_handle ? "will" : "will not"); + } +} + + +static enum ssl_verify_result_t +verify_server_cert_callback (SSL *ssl, uint8_t *out_alert) +{ + struct enc_sess_iquic *enc_sess; + struct stack_st_X509 *chain; + int s; + + enc_sess = SSL_get_ex_data(ssl, s_idx); + chain = SSL_get_peer_cert_chain(ssl); + if (!chain) + { + LSQ_ERROR("cannot get peer chain"); + return ssl_verify_invalid; + } + + s = enc_sess->esi_enpub->enp_verify_cert( + enc_sess->esi_enpub->enp_verify_ctx, chain); + return s == 0 ? ssl_verify_ok : ssl_verify_invalid; +} + + +static int +iquic_lookup_cert (SSL *ssl, void *arg) +{ + struct enc_sess_iquic *const enc_sess = arg; + const struct network_path *path; + const char *server_name; + SSL_CTX *ssl_ctx; + + server_name = SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name); +#ifndef NDEBUG + if (!server_name) + server_name = enc_sess->esi_sni_bypass; +#endif + if (!server_name) + { + LSQ_DEBUG("cert lookup: server name is not set, error"); + return 0; + } + + path = enc_sess->esi_conn->cn_if->ci_get_path(enc_sess->esi_conn, NULL); + ssl_ctx = enc_sess->esi_enpub->enp_lookup_cert( + enc_sess->esi_enpub->enp_cert_lu_ctx, NP_LOCAL_SA(path), + server_name); + + + if (ssl_ctx) + { + if (SSL_set_SSL_CTX(enc_sess->esi_ssl, ssl_ctx)) + { + LSQ_DEBUG("looked up cert for %s", server_name); + if (enc_sess->esi_enpub->enp_kli) + SSL_CTX_set_keylog_callback(ssl_ctx, keylog_callback); + SSL_set_verify(enc_sess->esi_ssl, + SSL_CTX_get_verify_mode(ssl_ctx), NULL); + SSL_set_verify_depth(enc_sess->esi_ssl, + SSL_CTX_get_verify_depth(ssl_ctx)); + SSL_clear_options(enc_sess->esi_ssl, + SSL_get_options(enc_sess->esi_ssl)); + SSL_set_options(enc_sess->esi_ssl, + SSL_CTX_get_options(ssl_ctx)); + return 1; + } + else + { + LSQ_WARN("cannot set SSL_CTX"); + return 0; + } + } + else + { + LSQ_DEBUG("could not look up cert for %s", server_name); + return 0; + } +} + + +static void +iquic_esfi_set_conn (enc_session_t *enc_session_p, struct lsquic_conn *lconn) +{ + struct enc_sess_iquic *const enc_sess = enc_session_p; + enc_sess->esi_conn = lconn; + LSQ_DEBUG("updated conn reference"); +} + + +static int +iquic_esfi_init_server (enc_session_t *enc_session_p) +{ + struct enc_sess_iquic *const enc_sess = enc_session_p; + const struct alpn_map *am; + int transpa_len; + SSL_CTX *ssl_ctx = NULL; + union { + char errbuf[ERR_ERROR_STRING_BUF_LEN]; + unsigned char trans_params[sizeof(struct transport_params)]; + } u; + + for (am = s_alpns; am < s_alpns + sizeof(s_alpns) + / sizeof(s_alpns[0]); ++am) + if (am->version == enc_sess->esi_conn->cn_version) + goto ok; + + LSQ_ERROR("version %s has no matching ALPN", + lsquic_ver2str[enc_sess->esi_conn->cn_version]); + return -1; + + ok: + enc_sess->esi_alpn = am->alpn; + + ssl_ctx = enc_sess->esi_enpub->enp_get_ssl_ctx( + lsquic_conn_get_peer_ctx(enc_sess->esi_conn, NULL)); + if (!ssl_ctx) + { + LSQ_ERROR("fetching SSL context associated with peer context failed"); + return -1; + } + + enc_sess->esi_ssl = SSL_new(ssl_ctx); + if (!enc_sess->esi_ssl) + { + LSQ_ERROR("cannot create SSL object: %s", + ERR_error_string(ERR_get_error(), u.errbuf)); + return -1; + } + if (!(SSL_set_quic_method(enc_sess->esi_ssl, &cry_quic_method))) + { + LSQ_INFO("could not set stream method"); + return -1; + } + maybe_setup_key_logging(enc_sess); + + transpa_len = gen_trans_params(enc_sess, u.trans_params, + sizeof(u.trans_params)); + if (transpa_len < 0) + return -1; + + if (1 != SSL_set_quic_transport_params(enc_sess->esi_ssl, u.trans_params, + transpa_len)) + { + LSQ_ERROR("cannot set QUIC transport params: %s", + ERR_error_string(ERR_get_error(), u.errbuf)); + return -1; + } + + SSL_set_cert_cb(enc_sess->esi_ssl, iquic_lookup_cert, enc_sess); + SSL_set_ex_data(enc_sess->esi_ssl, s_idx, enc_sess); + SSL_set_accept_state(enc_sess->esi_ssl); + LSQ_DEBUG("initialized server enc session"); + enc_sess->esi_flags |= ESI_INITIALIZED; + return 0; +} + + +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define WRITE_NUM(var_, val_, ptr_) do { \ + var_ = (val_); \ + var_ = bswap_32(var_); \ + memcpy((ptr_), &var_, sizeof(var_)); \ + ptr_ += sizeof(var_); \ +} while (0) +#else +#define WRITE_NUM(var_, val_, ptr_) do { \ + var_ = (val_); \ + memcpy((ptr_), &var_, sizeof(var_)); \ + ptr_ += sizeof(var_); \ +} while (0) +#endif + +static int +iquic_new_session_cb (SSL *ssl, SSL_SESSION *session) +{ + struct enc_sess_iquic *enc_sess; + uint32_t max_early_data_size, num; + unsigned char *p, *buf; + uint8_t *ticket_buf; + size_t ticket_sz; + lsquic_ver_tag_t tag; + const uint8_t *trapa_buf; + size_t trapa_sz, buf_sz; + + enc_sess = SSL_get_ex_data(ssl, s_idx); + assert(enc_sess->esi_enpub->enp_stream_if->on_zero_rtt_info); + + max_early_data_size = SSL_SESSION_get_max_early_data_size(session); + if (0xFFFFFFFFu != max_early_data_size) + LSQ_WARN("max_early_data_size=0x%X, protocol violation", + max_early_data_size); + + SSL_get_peer_quic_transport_params(enc_sess->esi_ssl, &trapa_buf, + &trapa_sz); + if (!(trapa_buf + trapa_sz)) + { + LSQ_WARN("no transport parameters: cannot generate zero-rtt info"); + return 0; + } + if (trapa_sz > UINT32_MAX) + { + LSQ_WARN("trapa size too large: %zu", trapa_sz); + return 0; + } + + if (!SSL_SESSION_to_bytes(session, &ticket_buf, &ticket_sz)) + { + LSQ_INFO("could not serialize new session"); + return 0; + } + if (ticket_sz > UINT32_MAX) + { + LSQ_WARN("ticket size too large: %zu", ticket_sz); + OPENSSL_free(ticket_buf); + return 0; + } + + buf_sz = sizeof(tag) + sizeof(uint32_t) + sizeof(uint32_t) + + ticket_sz + sizeof(uint32_t) + trapa_sz; + buf = malloc(buf_sz); + if (!buf) + { + OPENSSL_free(ticket_buf); + LSQ_WARN("%s: malloc failed", __func__); + return 0; + } + + p = buf; + tag = lsquic_ver2tag(enc_sess->esi_conn->cn_version); + memcpy(p, &tag, sizeof(tag)); + p += sizeof(tag); + + WRITE_NUM(num, ZERO_RTT_VERSION, p); + WRITE_NUM(num, ticket_sz, p); + memcpy(p, ticket_buf, ticket_sz); + p += ticket_sz; + WRITE_NUM(num, trapa_sz, p); + memcpy(p, trapa_buf, trapa_sz); + p += trapa_sz; + + assert(buf + buf_sz == p); + OPENSSL_free(ticket_buf); + + LSQ_DEBUG("generated %zu bytes of zero-rtt buffer", buf_sz); + + enc_sess->esi_enpub->enp_stream_if->on_zero_rtt_info(enc_sess->esi_conn, + buf, buf_sz); + free(buf); + return 0; +} + + +static int +init_client (struct enc_sess_iquic *const enc_sess) +{ + SSL_CTX *ssl_ctx; + SSL_SESSION *ssl_session; + const struct alpn_map *am; + int transpa_len; + char errbuf[ERR_ERROR_STRING_BUF_LEN]; +#define hexbuf errbuf /* This is a dual-purpose buffer */ + unsigned char trans_params[0x80]; + + for (am = s_alpns; am < s_alpns + sizeof(s_alpns) + / sizeof(s_alpns[0]); ++am) + if (am->version == enc_sess->esi_ver_neg->vn_ver) + goto ok; + + LSQ_ERROR("version %s has no matching ALPN", + lsquic_ver2str[enc_sess->esi_ver_neg->vn_ver]); + return -1; + + ok: + enc_sess->esi_alpn = am->alpn; + LSQ_DEBUG("Create new SSL_CTX"); + ssl_ctx = SSL_CTX_new(TLS_method()); + if (!ssl_ctx) + { + LSQ_ERROR("cannot create SSL context: %s", + ERR_error_string(ERR_get_error(), errbuf)); + goto err; + } + SSL_CTX_set_min_proto_version(ssl_ctx, TLS1_3_VERSION); + SSL_CTX_set_max_proto_version(ssl_ctx, TLS1_3_VERSION); + SSL_CTX_set_default_verify_paths(ssl_ctx); + SSL_CTX_set_session_cache_mode(ssl_ctx, SSL_SESS_CACHE_CLIENT); + if (enc_sess->esi_enpub->enp_stream_if->on_zero_rtt_info) + SSL_CTX_sess_set_new_cb(ssl_ctx, iquic_new_session_cb); + if (enc_sess->esi_enpub->enp_kli) + SSL_CTX_set_keylog_callback(ssl_ctx, keylog_callback); + if (enc_sess->esi_enpub->enp_verify_cert) + SSL_CTX_set_custom_verify(ssl_ctx, SSL_VERIFY_PEER, + verify_server_cert_callback); + SSL_CTX_set_early_data_enabled(ssl_ctx, 1); + + transpa_len = gen_trans_params(enc_sess, trans_params, + sizeof(trans_params)); + if (transpa_len < 0) + { + goto err; + } + + enc_sess->esi_ssl = SSL_new(ssl_ctx); + if (!enc_sess->esi_ssl) + { + LSQ_ERROR("cannot create SSL object: %s", + ERR_error_string(ERR_get_error(), errbuf)); + goto err; + } + if (!(SSL_set_quic_method(enc_sess->esi_ssl, &cry_quic_method))) + { + LSQ_INFO("could not set stream method"); + goto err; + } + maybe_setup_key_logging(enc_sess); + if (1 != SSL_set_quic_transport_params(enc_sess->esi_ssl, trans_params, + transpa_len)) + { + LSQ_ERROR("cannot set QUIC transport params: %s", + ERR_error_string(ERR_get_error(), errbuf)); + goto err; + } + if (0 != SSL_set_alpn_protos(enc_sess->esi_ssl, am->alpn, am->alpn[0] + 1)) + { + LSQ_ERROR("cannot set ALPN: %s", + ERR_error_string(ERR_get_error(), errbuf)); + goto err; + } + if (1 != SSL_set_tlsext_host_name(enc_sess->esi_ssl, + enc_sess->esi_hostname)) + { + LSQ_ERROR("cannot set hostname: %s", + ERR_error_string(ERR_get_error(), errbuf)); + goto err; + } + free(enc_sess->esi_hostname); + enc_sess->esi_hostname = NULL; + if (enc_sess->esi_zero_rtt_buf) + { + ssl_session = maybe_create_SSL_SESSION(enc_sess, ssl_ctx); + if (ssl_session) + { + if (SSL_set_session(enc_sess->esi_ssl, ssl_session)) + enc_sess->esi_flags |= ESI_USE_SSL_TICKET; + else + LSQ_WARN("cannot set session"); + } + } + + SSL_set_ex_data(enc_sess->esi_ssl, s_idx, enc_sess); + SSL_set_connect_state(enc_sess->esi_ssl); + SSL_CTX_free(ssl_ctx); + LSQ_DEBUG("initialized client enc session"); + enc_sess->esi_flags |= ESI_INITIALIZED; + return 0; + + err: + if (ssl_ctx) + SSL_CTX_free(ssl_ctx); + return -1; +#undef hexbuf +} + + +struct crypto_params +{ + const EVP_AEAD *aead; + const EVP_MD *md; + const EVP_CIPHER *hp; + gen_hp_mask_f gen_hp_mask; +}; + + +static int +get_crypto_params (const struct enc_sess_iquic *enc_sess, + struct crypto_params *params) +{ + const SSL_CIPHER *cipher; + unsigned key_sz, iv_sz; + uint32_t id; + + cipher = SSL_get_current_cipher(enc_sess->esi_ssl); + id = SSL_CIPHER_get_id(cipher); + + LSQ_DEBUG("Negotiated cipher ID is 0x%"PRIX32, id); + + /* RFC 8446, Appendix B.4 */ + switch (id) + { + case 0x03000000 | 0x1301: /* TLS_AES_128_GCM_SHA256 */ + params->md = EVP_sha256(); + params->aead = EVP_aead_aes_128_gcm(); + params->hp = EVP_aes_128_ecb(); + params->gen_hp_mask = gen_hp_mask_aes; + break; + case 0x03000000 | 0x1302: /* TLS_AES_256_GCM_SHA384 */ + params->md = EVP_sha384(); + params->aead = EVP_aead_aes_256_gcm(); + params->hp = EVP_aes_256_ecb(); + params->gen_hp_mask = gen_hp_mask_aes; + break; + case 0x03000000 | 0x1303: /* TLS_CHACHA20_POLY1305_SHA256 */ + params->md = EVP_sha256(); + params->aead = EVP_aead_chacha20_poly1305(); + params->hp = NULL; + params->gen_hp_mask = gen_hp_mask_chacha20; + break; + default: + /* TLS_AES_128_CCM_SHA256 and TLS_AES_128_CCM_8_SHA256 are not + * supported by BoringSSL (grep for \b0x130[45]\b). + */ + LSQ_DEBUG("unsupported cipher 0x%"PRIX32, id); + return -1; + } + + key_sz = EVP_AEAD_key_length(params->aead); + if (key_sz > EVP_MAX_KEY_LENGTH) + { + LSQ_DEBUG("key size %u is too large", key_sz); + return -1; + } + + iv_sz = EVP_AEAD_nonce_length(params->aead); + if (iv_sz < 8) + iv_sz = 8; /* [draft-ietf-quic-tls-11], Section 5.3 */ + if (iv_sz > EVP_MAX_IV_LENGTH) + { + LSQ_DEBUG("iv size %u is too large", iv_sz); + return -1; + } + + if (key_sz > EVP_MAX_KEY_LENGTH) + { + LSQ_DEBUG("PN size %u is too large", key_sz); + return -1; + } + + return 0; +} + + +static int +get_peer_transport_params (struct enc_sess_iquic *enc_sess) +{ + struct transport_params *const trans_params = &enc_sess->esi_peer_tp; + const uint8_t *params_buf; + size_t bufsz; + char params_str[0x200]; + + SSL_get_peer_quic_transport_params(enc_sess->esi_ssl, ¶ms_buf, &bufsz); + if (!params_buf) + { + LSQ_DEBUG("no peer transport parameters"); + return -1; + } + + LSQ_DEBUG("have peer transport parameters (%zu bytes)", bufsz); + if (0 > lsquic_tp_decode(params_buf, bufsz, + !(enc_sess->esi_flags & ESI_SERVER), + trans_params)) + { + lsquic_hexdump(params_buf, bufsz, params_str, sizeof(params_str)); + LSQ_DEBUG("could not parse peer transport parameters (%zd bytes):\n%s", + bufsz, params_str); + return -1; + } + + if ((enc_sess->esi_flags & (ESI_ODCID|ESI_SERVER)) == ESI_ODCID) + { + if (!(trans_params->tp_flags & TRAPA_ORIGINAL_CID)) + { + LSQ_DEBUG("server did not produce original DCID (ODCID)"); + return -1; + } + if (LSQUIC_CIDS_EQ(&enc_sess->esi_odcid, + &trans_params->tp_original_cid)) + LSQ_DEBUG("ODCID values match"); + else + { + if (LSQ_LOG_ENABLED(LSQ_LOG_DEBUG)) + { + char cidbuf[2][MAX_CID_LEN * 2 + 1]; + lsquic_cid2str(&enc_sess->esi_odcid, cidbuf[0]); + lsquic_cid2str(&trans_params->tp_original_cid, cidbuf[1]); + LSQ_DEBUG("server provided ODCID %s that does not match " + "our ODCID %s", cidbuf[1], cidbuf[0]); + } + return -1; + } + } + + return 0; +} + + +static int +maybe_get_peer_transport_params (struct enc_sess_iquic *enc_sess) +{ + int s; + + if (enc_sess->esi_flags & ESI_HAVE_PEER_TP) + return 0; + + s = get_peer_transport_params(enc_sess); + if (s == 0) + enc_sess->esi_flags |= ESI_HAVE_PEER_TP; + + return s; +} + + +static enum iquic_handshake_status +iquic_esfi_handshake (struct enc_sess_iquic *enc_sess) +{ + int s, err; + enum lsquic_hsk_status hsk_status; + char errbuf[ERR_ERROR_STRING_BUF_LEN]; + + s = SSL_do_handshake(enc_sess->esi_ssl); + if (s <= 0) + { + err = SSL_get_error(enc_sess->esi_ssl, s); + switch (err) + { + case SSL_ERROR_WANT_READ: + LSQ_DEBUG("retry read"); + return IHS_WANT_READ; + case SSL_ERROR_WANT_WRITE: + LSQ_DEBUG("retry write"); + return IHS_WANT_WRITE; + case SSL_EARLY_DATA_REJECTED: /* XXX should this be included here? */ + case SSL_ERROR_EARLY_DATA_REJECTED: + LSQ_DEBUG("early data rejected"); + hsk_status = LSQ_HSK_0RTT_FAIL; + goto err; + default: + LSQ_DEBUG("handshake: %s", ERR_error_string(err, errbuf)); + hsk_status = LSQ_HSK_FAIL; + goto err; + } + } + + + if (SSL_in_early_data(enc_sess->esi_ssl)) + { + LSQ_DEBUG("in early data"); + if (enc_sess->esi_flags & ESI_SERVER) + LSQ_DEBUG("TODO"); + else + return IHS_WANT_READ; + } + + hsk_status = LSQ_HSK_OK; + LSQ_DEBUG("handshake reported complete"); + EV_LOG_HSK_COMPLETED(LSQUIC_LOG_CONN_ID); + /* The ESI_USE_SSL_TICKET flag indicates if the client attempted 0-RTT. + * If the handshake is complete, and the client attempted 0-RTT, it + * must have succeeded. + */ + if (enc_sess->esi_flags & ESI_USE_SSL_TICKET) + { + hsk_status = LSQ_HSK_0RTT_OK; + EV_LOG_ZERO_RTT(LSQUIC_LOG_CONN_ID); + } + + if (0 != maybe_get_peer_transport_params(enc_sess)) + { + hsk_status = LSQ_HSK_FAIL; + goto err; + } + + enc_sess->esi_flags |= ESI_HANDSHAKE_OK; + enc_sess->esi_conn->cn_if->ci_hsk_done(enc_sess->esi_conn, hsk_status); + + return IHS_STOP; /* XXX: what else can come on the crypto stream? */ + + err: + LSQ_DEBUG("handshake failed"); + enc_sess->esi_conn->cn_if->ci_hsk_done(enc_sess->esi_conn, hsk_status); + return IHS_STOP; +} + + +static enum iquic_handshake_status +iquic_esfi_post_handshake (struct enc_sess_iquic *enc_sess) +{ + int s; + + s = SSL_process_quic_post_handshake(enc_sess->esi_ssl); + LSQ_DEBUG("SSL_process_quic_post_handshake() returned %d", s); + if (s == 1) + return IHS_WANT_READ; + else + { + LSQ_DEBUG("TODO: abort connection?"); + return IHS_STOP; + } +} + + +static struct transport_params * +iquic_esfi_get_peer_transport_params (enc_session_t *enc_session_p) +{ + struct enc_sess_iquic *const enc_sess = enc_session_p; + + if (0 == maybe_get_peer_transport_params(enc_sess)) + return &enc_sess->esi_peer_tp; + else + return NULL; +} + + +void +iquic_esfi_destroy (enc_session_t *enc_session_p) +{ + struct enc_sess_iquic *const enc_sess = enc_session_p; + struct frab_list *fral; + LSQ_DEBUG("iquic_esfi_destroy"); + + for (fral = enc_sess->esi_frals; fral < enc_sess->esi_frals + + sizeof(enc_sess->esi_frals) / sizeof(enc_sess->esi_frals[0]); + ++fral) + lsquic_frab_list_cleanup(fral); + if (enc_sess->esi_keylog_handle) + enc_sess->esi_enpub->enp_kli->kli_close(enc_sess->esi_keylog_handle); + if (enc_sess->esi_ssl) + SSL_free(enc_sess->esi_ssl); + + free_handshake_keys(enc_sess); + + free(enc_sess->esi_zero_rtt_buf); + free(enc_sess->esi_hostname); + free(enc_sess); +} + + +/* See [draft-ietf-quic-tls-14], Section 4 */ +static const enum enc_level hety2el[] = +{ + [HETY_NOT_SET] = ENC_LEV_FORW, + [HETY_VERNEG] = 0, + [HETY_INITIAL] = ENC_LEV_CLEAR, + [HETY_RETRY] = 0, + [HETY_HANDSHAKE] = ENC_LEV_INIT, + [HETY_0RTT] = ENC_LEV_EARLY, +}; + + +static const enum header_type pns2hety[] = +{ + [PNS_INIT] = HETY_INITIAL, + [PNS_HSK] = HETY_HANDSHAKE, + [PNS_APP] = HETY_NOT_SET, +}; + + +static const enum enc_level pns2enc_level[] = +{ + [PNS_INIT] = ENC_LEV_CLEAR, + [PNS_HSK] = ENC_LEV_INIT, + [PNS_APP] = ENC_LEV_FORW, +}; + + +static enum enc_packout +iquic_esf_encrypt_packet (enc_session_t *enc_session_p, + const struct lsquic_engine_public *enpub, struct lsquic_conn *lconn, + struct lsquic_packet_out *packet_out) +{ + struct enc_sess_iquic *const enc_sess = enc_session_p; + unsigned char *dst; + const struct crypto_ctx_pair *pair; + const struct crypto_ctx *crypto_ctx; + const struct header_prot *hp; + enum enc_level enc_level; + unsigned char nonce_buf[ sizeof(crypto_ctx->yk_iv_buf) + 8 ]; + unsigned char *nonce, *begin_xor; + lsquic_packno_t packno; + size_t out_sz, dst_sz; + int header_sz; + int ipv6; + unsigned packno_off, packno_len, sample_off, cliser; + enum packnum_space pns; + char errbuf[ERR_ERROR_STRING_BUF_LEN]; + + assert(lconn == enc_sess->esi_conn); + + if (packet_out->po_flags & PO_MINI) + { + /* XXX TODO Don't rely on PO_MINI, generalize this logic */ + assert(enc_sess->esi_flags & ESI_SERVER); + enc_level = hety2el[ packet_out->po_header_type ]; + } + else + { + pns = lsquic_packet_out_pns(packet_out); + /* TODO Obviously, will need more logic for 0-RTT */ + enc_level = pns2enc_level[ pns ]; + packet_out->po_header_type = pns2hety[ pns ]; + } + + cliser = !!(enc_sess->esi_flags & ESI_SERVER); + if (enc_level == ENC_LEV_FORW) + { + pair = &enc_sess->esi_pairs[ enc_sess->esi_key_phase ]; + crypto_ctx = &pair->ykp_ctx[ cliser ]; + hp = &enc_sess->esi_hp; + } + else if (enc_sess->esi_hsk_pairs) + { + pair = &enc_sess->esi_hsk_pairs[ enc_level ]; + crypto_ctx = &pair->ykp_ctx[ cliser ]; + hp = &enc_sess->esi_hsk_hps[ enc_level ]; + } + else + { + assert(0); + return ENCPA_BADCRYPT; + } + + if (UNLIKELY(0 == (crypto_ctx->yk_flags & YK_INITED))) + { + LSQ_WARN("encrypt crypto context at level %s not initialized", + lsquic_enclev2str[enc_level]); + return ENCPA_BADCRYPT; + } + + if (packet_out->po_data_sz < 3) + { + /* [draft-ietf-quic-tls-20] Section 5.4.2 */ + enum packno_bits bits = lsquic_packet_out_packno_bits(packet_out); + unsigned len = iquic_packno_bits2len(bits); + if (packet_out->po_data_sz + len < 4) + { + len = 4 - packet_out->po_data_sz - len; + memset(packet_out->po_data + packet_out->po_data_sz, 0, len); + packet_out->po_data_sz += len; + packet_out->po_frame_types |= QUIC_FTBIT_PADDING; + LSQ_DEBUG("padded packet %"PRIu64" with %u bytes of PADDING", + packet_out->po_packno, len); + } + } + + dst_sz = lconn->cn_pf->pf_packout_size(lconn, packet_out); + ipv6 = NP_IS_IPv6(packet_out->po_path); + dst = enpub->enp_pmi->pmi_allocate(enpub->enp_pmi_ctx, + packet_out->po_path->np_peer_ctx, dst_sz, ipv6); + if (!dst) + { + LSQ_DEBUG("could not allocate memory for outgoing packet of size %zd", + dst_sz); + return ENCPA_NOMEM; + } + + /* Align nonce so we can perform XOR safely in one shot: */ + begin_xor = nonce_buf + sizeof(nonce_buf) - 8; + begin_xor = (unsigned char *) ((uintptr_t) begin_xor & ~0x7); + nonce = begin_xor - crypto_ctx->yk_iv_sz + 8; + memcpy(nonce, crypto_ctx->yk_iv_buf, crypto_ctx->yk_iv_sz); + packno = packet_out->po_packno; + if (s_log_seal_and_open) + LSQ_DEBUG("seal: iv: %s; packno: 0x%"PRIX64, + HEXSTR(crypto_ctx->yk_iv_buf, crypto_ctx->yk_iv_sz, s_str), packno); +#if __BYTE_ORDER == __LITTLE_ENDIAN + packno = bswap_64(packno); +#endif + *((uint64_t *) begin_xor) ^= packno; + + header_sz = lconn->cn_pf->pf_gen_reg_pkt_header(lconn, packet_out, dst, + dst_sz); + if (header_sz < 0) + goto err; + if (enc_level == ENC_LEV_FORW) + dst[0] |= enc_sess->esi_key_phase << 2; + + if (s_log_seal_and_open) + { + LSQ_DEBUG("seal: nonce (%u bytes): %s", crypto_ctx->yk_iv_sz, + HEXSTR(nonce, crypto_ctx->yk_iv_sz, s_str)); + LSQ_DEBUG("seal: ad (%u bytes): %s", header_sz, + HEXSTR(dst, header_sz, s_str)); + LSQ_DEBUG("seal: in (%u bytes): %s", packet_out->po_data_sz, + HEXSTR(packet_out->po_data, packet_out->po_data_sz, s_str)); + } + if (!EVP_AEAD_CTX_seal(&crypto_ctx->yk_aead_ctx, dst + header_sz, &out_sz, + dst_sz - header_sz, nonce, crypto_ctx->yk_iv_sz, packet_out->po_data, + packet_out->po_data_sz, dst, header_sz)) + { + LSQ_WARN("cannot seal packet #%"PRIu64": %s", packet_out->po_packno, + ERR_error_string(ERR_get_error(), errbuf)); + goto err; + } + assert(out_sz == dst_sz - header_sz); + + lconn->cn_pf->pf_packno_info(lconn, packet_out, &packno_off, &packno_len); + sample_off = packno_off + 4; + assert(sample_off + IQUIC_TAG_LEN <= dst_sz); + apply_hp(enc_sess, hp, cliser, dst, packno_off, packno_len); + + packet_out->po_enc_data = dst; + packet_out->po_enc_data_sz = dst_sz; + packet_out->po_sent_sz = dst_sz; + packet_out->po_flags &= ~PO_IPv6; + packet_out->po_flags |= PO_ENCRYPTED|PO_SENT_SZ|(ipv6 << POIPv6_SHIFT); + lsquic_packet_out_set_enc_level(packet_out, enc_level); + lsquic_packet_out_set_kp(packet_out, enc_sess->esi_key_phase); + return ENCPA_OK; + + err: + enpub->enp_pmi->pmi_return(enpub->enp_pmi_ctx, + packet_out->po_path->np_peer_ctx, dst, ipv6); + return ENCPA_BADCRYPT; +} + + +static enum dec_packin +iquic_esf_decrypt_packet (enc_session_t *enc_session_p, + struct lsquic_engine_public *enpub, const struct lsquic_conn *lconn, + struct lsquic_packet_in *packet_in) +{ + struct enc_sess_iquic *const enc_sess = enc_session_p; + unsigned char *dst; + struct crypto_ctx_pair *pair; + const struct header_prot *hp; + struct crypto_ctx *crypto_ctx = NULL; + unsigned char nonce_buf[ sizeof(crypto_ctx->yk_iv_buf) + 8 ]; + unsigned char *nonce, *begin_xor; + unsigned sample_off, packno_len, cliser, key_phase; + enum enc_level enc_level; + enum packnum_space pns; + lsquic_packno_t packno; + size_t out_sz; + enum dec_packin dec_packin; + int s; + const size_t dst_sz = packet_in->pi_data_sz; + unsigned char new_secret[EVP_MAX_KEY_LENGTH]; + struct crypto_ctx crypto_ctx_buf; + char secret_str[EVP_MAX_KEY_LENGTH * 2 + 1]; + char errbuf[ERR_ERROR_STRING_BUF_LEN]; + + dst = lsquic_mm_get_packet_in_buf(&enpub->enp_mm, dst_sz); + if (!dst) + { + LSQ_WARN("cannot allocate memory to copy incoming packet data"); + dec_packin = DECPI_NOMEM; + goto err; + } + + enc_level = hety2el[packet_in->pi_header_type]; + if (enc_level == ENC_LEV_FORW) + hp = &enc_sess->esi_hp; + else if (enc_sess->esi_hsk_pairs) + hp = &enc_sess->esi_hsk_hps[ enc_level ]; + else + hp = NULL; + + if (UNLIKELY(!(hp && header_prot_inited(hp)))) + { + LSQ_DEBUG("header protection for level %u not initialized yet", + enc_level); + dec_packin = DECPI_NOT_YET; + goto err; + } + + /* Decrypt packet number. After this operation, packet_in is adjusted: + * the packet number becomes part of the header. + */ + sample_off = packet_in->pi_header_sz + 4; + if (sample_off + IQUIC_TAG_LEN > packet_in->pi_data_sz) + { + LSQ_INFO("packet data is too short: %hu bytes", + packet_in->pi_data_sz); + dec_packin = DECPI_TOO_SHORT; + goto err; + } + cliser = !(enc_sess->esi_flags & ESI_SERVER); + memcpy(dst, packet_in->pi_data, sample_off); + packet_in->pi_packno = + packno = strip_hp(enc_sess, hp, cliser, + packet_in->pi_data + sample_off, + dst, packet_in->pi_header_sz, &packno_len); + + if (enc_level == ENC_LEV_FORW) + { + key_phase = (dst[0] & 0x04) > 0; + if (key_phase == enc_sess->esi_key_phase) + { + pair = &enc_sess->esi_pairs[ key_phase ]; + crypto_ctx = &pair->ykp_ctx[ cliser ]; + } + else if (!is_valid_packno( + enc_sess->esi_pairs[enc_sess->esi_key_phase].ykp_thresh) + || packet_in->pi_packno + > enc_sess->esi_pairs[enc_sess->esi_key_phase].ykp_thresh) + { + lsquic_qhkdf_expand(enc_sess->esi_md, + enc_sess->esi_traffic_secrets[cliser], enc_sess->esi_trasec_sz, + "traffic upd", 11, new_secret, enc_sess->esi_trasec_sz); + if (enc_sess->esi_flags & ESI_LOG_SECRETS) + LSQ_DEBUG("key phase changed to %u, will try decrypting using " + "new secret %s", key_phase, HEXSTR(new_secret, + enc_sess->esi_trasec_sz, secret_str)); + else + LSQ_DEBUG("key phase changed to %u, will try decrypting using " + "new secret", key_phase); + crypto_ctx = &crypto_ctx_buf; + crypto_ctx->yk_flags = 0; + s = init_crypto_ctx(crypto_ctx, enc_sess->esi_md, + enc_sess->esi_aead, new_secret, enc_sess->esi_trasec_sz, + evp_aead_open); + if (s != 0) + { + LSQ_ERROR("could not init open crypto ctx (key phase)"); + dec_packin = DECPI_BADCRYPT; + goto err; + } + } + else + { + pair = &enc_sess->esi_pairs[ key_phase ]; + crypto_ctx = &pair->ykp_ctx[ cliser ]; + if (UNLIKELY(0 == (crypto_ctx->yk_flags & YK_INITED))) + { + LSQ_DEBUG("supposedly older context is not initialized (key " + "phase: %u)", key_phase); + dec_packin = DECPI_BADCRYPT; + goto err; + } + } + } + else + { + assert(enc_sess->esi_hsk_pairs); + pair = &enc_sess->esi_hsk_pairs[ enc_level ]; + crypto_ctx = &pair->ykp_ctx[ cliser ]; + if (UNLIKELY(0 == (crypto_ctx->yk_flags & YK_INITED))) + { + LSQ_WARN("decrypt crypto context at level %s not initialized", + lsquic_enclev2str[enc_level]); + dec_packin = DECPI_BADCRYPT; + goto err; + } + } + + if (s_log_seal_and_open) + LSQ_DEBUG("open: iv: %s; packno: 0x%"PRIX64, + HEXSTR(crypto_ctx->yk_iv_buf, crypto_ctx->yk_iv_sz, s_str), packno); + /* Align nonce so we can perform XOR safely in one shot: */ + begin_xor = nonce_buf + sizeof(nonce_buf) - 8; + begin_xor = (unsigned char *) ((uintptr_t) begin_xor & ~0x7); + nonce = begin_xor - crypto_ctx->yk_iv_sz + 8; + memcpy(nonce, crypto_ctx->yk_iv_buf, crypto_ctx->yk_iv_sz); +#if __BYTE_ORDER == __LITTLE_ENDIAN + packno = bswap_64(packno); +#endif + *((uint64_t *) begin_xor) ^= packno; + + packet_in->pi_header_sz += packno_len; + + if (s_log_seal_and_open) + { + LSQ_DEBUG("open: nonce (%u bytes): %s", crypto_ctx->yk_iv_sz, + HEXSTR(nonce, crypto_ctx->yk_iv_sz, s_str)); + LSQ_DEBUG("open: ad (%u bytes): %s", packet_in->pi_header_sz, + HEXSTR(dst, packet_in->pi_header_sz, s_str)); + LSQ_DEBUG("open: in (%u bytes): %s", packet_in->pi_data_sz + - packet_in->pi_header_sz, HEXSTR(packet_in->pi_data + + packet_in->pi_header_sz, packet_in->pi_data_sz + - packet_in->pi_header_sz, s_str)); + } + if (!EVP_AEAD_CTX_open(&crypto_ctx->yk_aead_ctx, + dst + packet_in->pi_header_sz, &out_sz, + dst_sz - packet_in->pi_header_sz, nonce, crypto_ctx->yk_iv_sz, + packet_in->pi_data + packet_in->pi_header_sz, + packet_in->pi_data_sz - packet_in->pi_header_sz, + dst, packet_in->pi_header_sz)) + { + LSQ_INFO("cannot open packet #%"PRIu64": %s", packet_in->pi_packno, + ERR_error_string(ERR_get_error(), errbuf)); + dec_packin = DECPI_BADCRYPT; + goto err; + } + + if (dst[0] & (0x0C << (packet_in->pi_header_type == HETY_NOT_SET))) + { + LSQ_DEBUG("reserved bits are not set to zero"); + dec_packin = DECPI_VIOLATION; + goto err; + } + + if (crypto_ctx == &crypto_ctx_buf) + { + LSQ_DEBUG("decryption in the new key phase %u successful, rotate " + "keys", key_phase); + pair = &enc_sess->esi_pairs[ key_phase ]; + pair->ykp_thresh = packet_in->pi_packno; + pair->ykp_ctx[ cliser ] = crypto_ctx_buf; + memcpy(enc_sess->esi_traffic_secrets[ cliser ], new_secret, + enc_sess->esi_trasec_sz); + lsquic_qhkdf_expand(enc_sess->esi_md, + enc_sess->esi_traffic_secrets[!cliser], enc_sess->esi_trasec_sz, + "traffic upd", 11, new_secret, enc_sess->esi_trasec_sz); + memcpy(enc_sess->esi_traffic_secrets[ !cliser ], new_secret, + enc_sess->esi_trasec_sz); + s = init_crypto_ctx(&pair->ykp_ctx[ !cliser ], enc_sess->esi_md, + enc_sess->esi_aead, new_secret, enc_sess->esi_trasec_sz, + evp_aead_seal); + if (s != 0) + { + LSQ_ERROR("could not init seal crypto ctx (key phase)"); + cleanup_crypto_ctx(&pair->ykp_ctx[ !cliser ]); + /* XXX Is this the proper thing to do? Packet decrypted fine... */ + dec_packin = DECPI_BADCRYPT; + goto err; + } + if (enc_sess->esi_flags & ESI_LOG_SECRETS) + log_crypto_pair(enc_sess, pair, "updated"); + enc_sess->esi_key_phase = key_phase; + } + + packet_in->pi_data_sz = packet_in->pi_header_sz + out_sz; + if (packet_in->pi_flags & PI_OWN_DATA) + lsquic_mm_put_packet_in_buf(&enpub->enp_mm, packet_in->pi_data, + packet_in->pi_data_sz); + packet_in->pi_data = dst; + packet_in->pi_flags |= PI_OWN_DATA | PI_DECRYPTED + | (enc_level << PIBIT_ENC_LEV_SHIFT); + EV_LOG_CONN_EVENT(LSQUIC_LOG_CONN_ID, "decrypted packet %"PRIu64, + packet_in->pi_packno); + pns = lsquic_enclev2pns[enc_level]; + if (packet_in->pi_packno > enc_sess->esi_max_packno[pns]) + enc_sess->esi_max_packno[pns] = packet_in->pi_packno; + if (is_valid_packno(pair->ykp_thresh) + && packet_in->pi_packno > pair->ykp_thresh) + pair->ykp_thresh = packet_in->pi_packno; + return DECPI_OK; + + err: + if (crypto_ctx == &crypto_ctx_buf) + cleanup_crypto_ctx(crypto_ctx); + if (dst) + lsquic_mm_put_packet_in_buf(&enpub->enp_mm, dst, dst_sz); + EV_LOG_CONN_EVENT(LSQUIC_LOG_CONN_ID, "could not decrypt packet (type %s, " + "number %"PRIu64")", lsquic_hety2str[packet_in->pi_header_type], + packet_in->pi_packno); + return dec_packin; +} + + +static const char * +iquic_esf_get_sni (enc_session_t *enc_session_p) +{ + struct enc_sess_iquic *const enc_sess = enc_session_p; + + return SSL_get_servername(enc_sess->esi_ssl, TLSEXT_NAMETYPE_host_name); +} + + +static int +iquic_esf_global_init (int flags) +{ + s_idx = SSL_get_ex_new_index(0, NULL, NULL, NULL, NULL); + if (s_idx >= 0) + { + LSQ_LOG1(LSQ_LOG_DEBUG, "SSL extra data index: %d", s_idx); + return 0; + } + else + { + LSQ_LOG1(LSQ_LOG_ERROR, "%s: could not select index", __func__); + return -1; + } +} + + +static void +iquic_esf_global_cleanup (void) +{ +} + + +static void * +copy_X509 (void *cert) +{ + X509_up_ref(cert); + return cert; +} + + +static struct stack_st_X509 * +iquic_esf_get_server_cert_chain (enc_session_t *enc_session_p) +{ + struct enc_sess_iquic *const enc_sess = enc_session_p; + STACK_OF(X509) *chain; + + if (enc_sess->esi_ssl) + { + chain = SSL_get_peer_cert_chain(enc_sess->esi_ssl); + return (struct stack_st_X509 *) + sk_deep_copy((const _STACK *) chain, sk_X509_call_copy_func, + copy_X509, sk_X509_call_free_func, (void(*)(void*))X509_free); + } + else + return NULL; +} + + +static const char * +iquic_esf_cipher (enc_session_t *enc_session_p) +{ + struct enc_sess_iquic *const enc_sess = enc_session_p; + const SSL_CIPHER *cipher; + + if (enc_sess->esi_flags & ESI_CACHED_INFO) + return enc_sess->esi_cached_info.cipher_name; + else if (enc_sess->esi_ssl) + { + cipher = SSL_get_current_cipher(enc_sess->esi_ssl); + return SSL_CIPHER_get_name(cipher); + } + else + { + LSQ_WARN("SSL session is not set"); + return "null"; + } +} + + +static int +iquic_esf_keysize (enc_session_t *enc_session_p) +{ + struct enc_sess_iquic *const enc_sess = enc_session_p; + const SSL_CIPHER *cipher; + uint32_t id; + + if (enc_sess->esi_flags & ESI_CACHED_INFO) + return enc_sess->esi_cached_info.alg_bits / 8; + else if (enc_sess->esi_ssl) + { + cipher = SSL_get_current_cipher(enc_sess->esi_ssl); + id = SSL_CIPHER_get_id(cipher); + + /* RFC 8446, Appendix B.4 */ + switch (id) + { + case 0x03000000 | 0x1301: /* TLS_AES_128_GCM_SHA256 */ + return 128 / 8; + case 0x03000000 | 0x1302: /* TLS_AES_256_GCM_SHA384 */ + return 256 / 8; + case 0x03000000 | 0x1303: /* TLS_CHACHA20_POLY1305_SHA256 */ + return 256 / 8; + default: + return -1; + } + } + else + { + LSQ_WARN("SSL session is not set"); + return -1; + } +} + + +static int +iquic_esf_alg_keysize (enc_session_t *enc_session_p) +{ + /* Modeled on SslConnection::getEnv() */ + return iquic_esf_keysize(enc_session_p); +} + + +int +iquic_esfi_reset_dcid (enc_session_t *enc_session_p, + const lsquic_cid_t *old_dcid, const lsquic_cid_t *new_dcid) +{ + struct enc_sess_iquic *const enc_sess = enc_session_p; + + enc_sess->esi_odcid = *old_dcid; + enc_sess->esi_flags |= ESI_ODCID; + /* TODO: free previous handshake keys */ + if (0 == setup_handshake_keys(enc_sess, new_dcid)) + { + LSQ_INFOC("reset DCID to %"CID_FMT, CID_BITS(new_dcid)); + return 0; + } + else + return -1; +} + + +static void +iquic_esfi_1rtt_acked (enc_session_t *sess) +{ + struct enc_sess_iquic *enc_sess = (struct enc_sess_iquic *) sess; + + if (!(enc_sess->esi_flags & ESI_1RTT_ACKED)) + { + LSQ_DEBUG("1RTT packet has been acked"); + enc_sess->esi_flags |= ESI_1RTT_ACKED; + maybe_drop_SSL(enc_sess); + } +} + + +static void iquic_esfi_shake_stream (enc_session_t *sess, + struct lsquic_stream *stream, const char *what); + + +const struct enc_session_funcs_iquic lsquic_enc_session_iquic_ietf_v1 = +{ + .esfi_create_client = iquic_esfi_create_client, + .esfi_destroy = iquic_esfi_destroy, + .esfi_get_peer_transport_params + = iquic_esfi_get_peer_transport_params, + .esfi_reset_dcid = iquic_esfi_reset_dcid, + .esfi_init_server = iquic_esfi_init_server, + .esfi_set_conn = iquic_esfi_set_conn, + .esfi_set_streams = iquic_esfi_set_streams, + .esfi_create_server = iquic_esfi_create_server, + .esfi_shake_stream = iquic_esfi_shake_stream, + .esfi_1rtt_acked = iquic_esfi_1rtt_acked, +}; + + +const struct enc_session_funcs_common lsquic_enc_session_common_ietf_v1 = +{ + .esf_encrypt_packet = iquic_esf_encrypt_packet, + .esf_decrypt_packet = iquic_esf_decrypt_packet, + .esf_global_cleanup = iquic_esf_global_cleanup, + .esf_global_init = iquic_esf_global_init, + .esf_tag_len = IQUIC_TAG_LEN, + .esf_get_server_cert_chain + = iquic_esf_get_server_cert_chain, + .esf_get_sni = iquic_esf_get_sni, + .esf_cipher = iquic_esf_cipher, + .esf_keysize = iquic_esf_keysize, + .esf_alg_keysize = iquic_esf_alg_keysize, +}; + + +static void +cache_info (struct enc_sess_iquic *enc_sess) +{ + const SSL_CIPHER *cipher; + + cipher = SSL_get_current_cipher(enc_sess->esi_ssl); + enc_sess->esi_cached_info.cipher_name = SSL_CIPHER_get_name(cipher); + SSL_CIPHER_get_bits(cipher, &enc_sess->esi_cached_info.alg_bits); + enc_sess->esi_flags |= ESI_CACHED_INFO; +} + + +static void +maybe_drop_SSL (struct enc_sess_iquic *enc_sess) +{ + /* We rely on the following BoringSSL property: it writes new session + * tickets before marking handshake as complete. In this case, the new + * session tickets have either been successfully written to crypto stream, + * in which case we can close it, or (unlikely) they are buffered in the + * frab list. + */ + if ((enc_sess->esi_flags & (ESI_1RTT_ACKED|ESI_HANDSHAKE_OK)) + == (ESI_1RTT_ACKED|ESI_HANDSHAKE_OK) + && enc_sess->esi_ssl + && lsquic_frab_list_empty(&enc_sess->esi_frals[ENC_LEV_FORW])) + { + LSQ_DEBUG("drop SSL object"); + cache_info(enc_sess); + SSL_free(enc_sess->esi_ssl); + enc_sess->esi_ssl = NULL; + free_handshake_keys(enc_sess); + } +} + + +typedef char enums_have_the_same_value[ + (int) ssl_encryption_initial == (int) ENC_LEV_CLEAR && + (int) ssl_encryption_early_data == (int) ENC_LEV_EARLY && + (int) ssl_encryption_handshake == (int) ENC_LEV_INIT && + (int) ssl_encryption_application == (int) ENC_LEV_FORW ? 1 : -1]; + +static int +cry_sm_set_encryption_secret (SSL *ssl, enum ssl_encryption_level_t level, + const uint8_t *read_secret, const uint8_t *write_secret, + size_t secret_len) +{ + struct enc_sess_iquic *enc_sess; + struct crypto_ctx_pair *pair; + struct header_prot *hp; + struct crypto_params crypa; + int i; + int have_alpn; + const unsigned char *alpn; + unsigned alpn_len; + const enum enc_level enc_level = (enum enc_level) level; + const uint8_t *secrets[2]; + char errbuf[ERR_ERROR_STRING_BUF_LEN]; +#define hexbuf errbuf + + enc_sess = SSL_get_ex_data(ssl, s_idx); + if (!enc_sess) + return 0; + + if ((enc_sess->esi_flags & (ESI_ALPN_CHECKED|ESI_SERVER)) == ESI_SERVER) + { + enc_sess->esi_flags |= ESI_ALPN_CHECKED; + SSL_get0_alpn_selected(enc_sess->esi_ssl, &alpn, &alpn_len); + have_alpn = alpn && alpn_len == enc_sess->esi_alpn[0] + && 0 == memcmp(alpn, enc_sess->esi_alpn + 1, alpn_len); + if (have_alpn) + LSQ_DEBUG("Selected ALPN %.*s", (int) alpn_len, (char *) alpn); + else + { + LSQ_INFO("No ALPN is selected: send fatal alert"); + SSL_send_fatal_alert(ssl, ALERT_NO_APPLICATION_PROTOCOL); + return 0; + } + } + + if (0 != get_crypto_params(enc_sess, &crypa)) + return 0; + + if (enc_sess->esi_flags & ESI_SERVER) + { + if (enc_level != ENC_LEV_EARLY) + secrets[0] = read_secret, secrets[1] = write_secret; + else + secrets[1] = read_secret, secrets[0] = write_secret; + } + else + { + if (enc_level != ENC_LEV_EARLY) + secrets[0] = write_secret, secrets[1] = read_secret; + else + secrets[1] = write_secret, secrets[0] = read_secret; + } + + if (enc_level < ENC_LEV_FORW) + { + assert(enc_sess->esi_hsk_pairs); + pair = &enc_sess->esi_hsk_pairs[enc_level]; + hp = &enc_sess->esi_hsk_hps[enc_level]; + } + else + { + pair = &enc_sess->esi_pairs[0]; + hp = &enc_sess->esi_hp; + enc_sess->esi_trasec_sz = secret_len; + memcpy(enc_sess->esi_traffic_secrets[0], secrets[0], secret_len); + memcpy(enc_sess->esi_traffic_secrets[1], secrets[1], secret_len); + enc_sess->esi_md = crypa.md; + enc_sess->esi_aead = crypa.aead; + } + pair->ykp_thresh = IQUIC_INVALID_PACKNO; + + LSQ_DEBUG("set encryption for level %u", enc_level); + for (i = 1; i >= 0; --i) + { + if (secrets[i]) + { + if (enc_sess->esi_flags & ESI_LOG_SECRETS) + LSQ_DEBUG("new %s secret: %s", i ? "server" : "client", + HEXSTR(secrets[i], secret_len, hexbuf)); + if (0 != init_crypto_ctx(&pair->ykp_ctx[i], crypa.md, + crypa.aead, secrets[i], secret_len, enc_sess->esi_dir[i])) + goto err; + } + else + assert(level == ssl_encryption_early_data); + } + + hp->hp_enc_level = enc_level; + hp->hp_cipher = crypa.hp; + hp->hp_gen_mask = crypa.gen_hp_mask; + derive_hp_secrets(hp, crypa.md, crypa.aead, secret_len, secrets[0], + secrets[1]); + + if (enc_sess->esi_flags & ESI_LOG_SECRETS) + { + log_crypto_pair(enc_sess, pair, "new"); + log_hp(enc_sess, hp, "new"); + } + + return 1; + + err: + cleanup_crypto_ctx(&pair->ykp_ctx[0]); + cleanup_crypto_ctx(&pair->ykp_ctx[1]); + return 0; +#undef hexbuf +} + + +static int +cry_sm_write_message (SSL *ssl, enum ssl_encryption_level_t level, + const uint8_t *data, size_t len) +{ + struct enc_sess_iquic *enc_sess; + void *stream; + ssize_t nw; + + enc_sess = SSL_get_ex_data(ssl, s_idx); + if (!enc_sess) + return 0; + + stream = enc_sess->esi_streams[level]; + if (!stream) + return 0; + + /* The frab list logic is only applicable on the client. XXX This is + * likely to change when support for key updates is added. + */ + if (enc_sess->esi_flags & (ESI_ON_WRITE|ESI_SERVER)) + nw = enc_sess->esi_cryst_if->csi_write(stream, data, len); + else + { + LSQ_DEBUG("not in on_write event: buffer in a frab list"); + if (0 == lsquic_frab_list_write(&enc_sess->esi_frals[level], data, len)) + { + if (!lsquic_frab_list_empty(&enc_sess->esi_frals[level])) + enc_sess->esi_cryst_if->csi_wantwrite(stream, 1); + nw = len; + } + else + nw = -1; + } + + if (nw >= 0 && (size_t) nw == len) + { + enc_sess->esi_last_w = (enum enc_level) level; + LSQ_DEBUG("wrote %zu bytes to stream at encryption level %u", + len, level); + maybe_drop_SSL(enc_sess); + return 1; + } + else + { + LSQ_INFO("could not write %zu bytes: returned %zd", len, nw); + return 0; + } +} + + +static int +cry_sm_flush_flight (SSL *ssl) +{ + struct enc_sess_iquic *enc_sess; + void *stream; + unsigned level; + int s; + + enc_sess = SSL_get_ex_data(ssl, s_idx); + if (!enc_sess) + return 0; + + level = enc_sess->esi_last_w; + stream = enc_sess->esi_streams[level]; + if (!stream) + return 0; + + if (lsquic_frab_list_empty(&enc_sess->esi_frals[level])) + { + s = enc_sess->esi_cryst_if->csi_flush(stream); + return s == 0; + } + else + /* Frab list will get flushed */ /* TODO: add support for + recording flush points in frab list. */ + return 1; +} + + +static int +cry_sm_send_alert (SSL *ssl, enum ssl_encryption_level_t level, uint8_t alert) +{ + struct enc_sess_iquic *enc_sess; + + enc_sess = SSL_get_ex_data(ssl, s_idx); + if (!enc_sess) + return 0; + + LSQ_INFO("got alert %"PRIu8, alert); + enc_sess->esi_conn->cn_if->ci_tls_alert(enc_sess->esi_conn, alert); + + return 1; +} + + +static const SSL_QUIC_METHOD cry_quic_method = +{ + .set_encryption_secrets = cry_sm_set_encryption_secret, + .add_handshake_data = cry_sm_write_message, + .flush_flight = cry_sm_flush_flight, + .send_alert = cry_sm_send_alert, +}; + + +static lsquic_stream_ctx_t * +chsk_ietf_on_new_stream (void *stream_if_ctx, struct lsquic_stream *stream) +{ + struct enc_sess_iquic *const enc_sess = stream_if_ctx; + enum enc_level enc_level; + + enc_level = enc_sess->esi_cryst_if->csi_enc_level(stream); + if (enc_level != ENC_LEV_CLEAR) + { + LSQ_DEBUG("skip initialization of stream at level %u", enc_level); + goto end; + } + + if ( + (enc_sess->esi_flags & ESI_SERVER) == 0 && + 0 != init_client(enc_sess)) + { + LSQ_WARN("enc session could not be initialized"); + return NULL; + } + + enc_sess->esi_cryst_if->csi_wantwrite(stream, 1); + + LSQ_DEBUG("handshake stream created successfully"); + + end: + return stream_if_ctx; +} + + +static lsquic_stream_ctx_t * +shsk_ietf_on_new_stream (void *stream_if_ctx, struct lsquic_stream *stream) +{ + struct enc_sess_iquic *const enc_sess = stream_if_ctx; + enum enc_level enc_level; + + enc_level = enc_sess->esi_cryst_if->csi_enc_level(stream); + LSQ_DEBUG("on_new_stream called on level %u", enc_level); + + enc_sess->esi_cryst_if->csi_wantread(stream, 1); + + return stream_if_ctx; +} + + +static void +chsk_ietf_on_close (struct lsquic_stream *stream, lsquic_stream_ctx_t *ctx) +{ + struct enc_sess_iquic *const enc_sess = (struct enc_sess_iquic *) ctx; + LSQ_DEBUG("crypto stream level %u is closed", + (unsigned) enc_sess->esi_cryst_if->csi_enc_level(stream)); +} + + +static const char *const ihs2str[] = { + [IHS_WANT_READ] = "want read", + [IHS_WANT_WRITE] = "want write", + [IHS_STOP] = "stop", +}; + + +static void +iquic_esfi_shake_stream (enc_session_t *sess, + struct lsquic_stream *stream, const char *what) +{ + struct enc_sess_iquic *enc_sess = (struct enc_sess_iquic *)sess; + enum iquic_handshake_status st; + enum enc_level enc_level; + int write; + if (0 == (enc_sess->esi_flags & ESI_HANDSHAKE_OK)) + st = iquic_esfi_handshake(enc_sess); + else + st = iquic_esfi_post_handshake(enc_sess); + enc_level = enc_sess->esi_cryst_if->csi_enc_level(stream); + LSQ_DEBUG("enc level %s after %s: %s", lsquic_enclev2str[enc_level], what, + ihs2str[st]); + switch (st) + { + case IHS_WANT_READ: + write = !lsquic_frab_list_empty(&enc_sess->esi_frals[enc_level]); + enc_sess->esi_cryst_if->csi_wantwrite(stream, write); + enc_sess->esi_cryst_if->csi_wantread(stream, 1); + break; + case IHS_WANT_WRITE: + enc_sess->esi_cryst_if->csi_wantwrite(stream, 1); + enc_sess->esi_cryst_if->csi_wantread(stream, 0); + break; + default: + assert(st == IHS_STOP); + write = !lsquic_frab_list_empty(&enc_sess->esi_frals[enc_level]); + enc_sess->esi_cryst_if->csi_wantwrite(stream, write); + enc_sess->esi_cryst_if->csi_wantread(stream, 0); + break; + } + LSQ_DEBUG("Exit shake_stream"); + maybe_drop_SSL(enc_sess); +} + + +struct readf_ctx +{ + struct enc_sess_iquic *enc_sess; + enum enc_level enc_level; + int err; +}; + + +static size_t +readf_cb (void *ctx, const unsigned char *buf, size_t len, int fin) +{ + struct readf_ctx *const readf_ctx = (void *) ctx; + struct enc_sess_iquic *const enc_sess = readf_ctx->enc_sess; + int s; + size_t str_sz; + char str[MAX(1500 * 5, ERR_ERROR_STRING_BUF_LEN)]; + + s = SSL_provide_quic_data(enc_sess->esi_ssl, + (enum ssl_encryption_level_t) readf_ctx->enc_level, buf, len); + if (s) + { + LSQ_DEBUG("provided %zu bytes of %u-level data to SSL", len, + readf_ctx->enc_level); + str_sz = lsquic_hexdump(buf, len, str, sizeof(str)); + LSQ_DEBUG("\n%.*s", (int) str_sz, str); + return len; + } + else + { + LSQ_WARN("SSL_provide_quic_data returned false: %s", + ERR_error_string(ERR_get_error(), str)); + readf_ctx->err++; + return 0; + } +} + + +static void +chsk_ietf_on_read (struct lsquic_stream *stream, lsquic_stream_ctx_t *ctx) +{ + struct enc_sess_iquic *const enc_sess = (void *) ctx; + enum enc_level enc_level = enc_sess->esi_cryst_if->csi_enc_level(stream); + struct readf_ctx readf_ctx = { enc_sess, enc_level, 0, }; + + + ssize_t nread = enc_sess->esi_cryst_if->csi_readf(stream, + readf_cb, &readf_ctx); + + if (!(nread < 0 || readf_ctx.err)) + iquic_esfi_shake_stream((enc_session_t *)enc_sess, stream, "on_read"); + else + enc_sess->esi_conn->cn_if->ci_internal_error(enc_sess->esi_conn, + "shaking stream failed: nread: %zd, err: %d, SSL err: %"PRIu32, + nread, readf_ctx.err, ERR_get_error()); +} + + +static void +maybe_write_from_fral (struct enc_sess_iquic *enc_sess, + struct lsquic_stream *stream) +{ + enum enc_level enc_level = enc_sess->esi_cryst_if->csi_enc_level(stream); + struct frab_list *const fral = &enc_sess->esi_frals[enc_level]; + struct lsquic_reader reader = { + .lsqr_read = lsquic_frab_list_read, + .lsqr_size = lsquic_frab_list_size, + .lsqr_ctx = fral, + }; + ssize_t nw; + + if (lsquic_frab_list_empty(fral)) + return; + + nw = lsquic_stream_writef(stream, &reader); + if (nw >= 0) + { + LSQ_DEBUG("wrote %zd bytes to stream from frab list", nw); + (void) lsquic_stream_flush(stream); + if (lsquic_frab_list_empty(fral)) + lsquic_stream_wantwrite(stream, 0); + } + else + { + /* TODO: abort connection */ + LSQ_WARN("cannot write to stream: %s", strerror(errno)); + lsquic_stream_wantwrite(stream, 0); + } +} + + +static void +chsk_ietf_on_write (struct lsquic_stream *stream, lsquic_stream_ctx_t *ctx) +{ + struct enc_sess_iquic *const enc_sess = (void *) ctx; + + maybe_write_from_fral(enc_sess, stream); + + enc_sess->esi_flags |= ESI_ON_WRITE; + iquic_esfi_shake_stream(enc_sess, stream, "on_write"); + enc_sess->esi_flags &= ~ESI_ON_WRITE; +} + + +const struct lsquic_stream_if lsquic_cry_sm_if = +{ + .on_new_stream = chsk_ietf_on_new_stream, + .on_read = chsk_ietf_on_read, + .on_write = chsk_ietf_on_write, + .on_close = chsk_ietf_on_close, +}; + + +const struct lsquic_stream_if lsquic_mini_cry_sm_if = +{ + .on_new_stream = shsk_ietf_on_new_stream, + .on_read = chsk_ietf_on_read, + .on_write = chsk_ietf_on_write, + .on_close = chsk_ietf_on_close, +}; + + +struct ssl_st * +lsquic_hsk_getssl (lsquic_conn_t *conn) +{ + if (!conn || !(conn->cn_flags & LSCONN_IETF)) + return NULL; + return ((struct enc_sess_iquic *)conn->cn_enc_session)->esi_ssl; +} diff --git a/src/liblsquic/lsquic_eng_hist.c b/src/liblsquic/lsquic_eng_hist.c index 6cf686d23..80e8789fb 100644 --- a/src/liblsquic/lsquic_eng_hist.c +++ b/src/liblsquic/lsquic_eng_hist.c @@ -10,6 +10,7 @@ #if ENG_HIST_ENABLED #define LSQUIC_LOGGER_MODULE LSQLM_ENG_HIST +#include "lsquic_types.h" #include "lsquic_logger.h" diff --git a/src/liblsquic/lsquic_engine.c b/src/liblsquic/lsquic_engine.c index 921ffe0be..a71b5e6f6 100644 --- a/src/liblsquic/lsquic_engine.c +++ b/src/liblsquic/lsquic_engine.c @@ -23,11 +23,21 @@ #include #endif +#ifndef NDEBUG +#include +#include /* For code that loses packets */ +#endif + +#if LOG_PACKET_CHECKSUM +#include +#endif +#include #include "lsquic.h" #include "lsquic_types.h" -#include "lsquic_alarmset.h" +#include "lsquic_int_types.h" +#include "lsquic_sizes.h" #include "lsquic_parse_common.h" #include "lsquic_parse.h" #include "lsquic_packet_in.h" @@ -36,34 +46,42 @@ #include "lsquic_rtt.h" #include "lsquic_cubic.h" #include "lsquic_pacer.h" +#include "lsquic_bw_sampler.h" +#include "lsquic_minmax.h" +#include "lsquic_bbr.h" #include "lsquic_send_ctl.h" #include "lsquic_set.h" #include "lsquic_conn_flow.h" #include "lsquic_sfcw.h" -#include "lsquic_stream.h" +#include "lsquic_hash.h" #include "lsquic_conn.h" #include "lsquic_full_conn.h" #include "lsquic_util.h" #include "lsquic_qtags.h" -#include "lsquic_str.h" -#include "lsquic_handshake.h" +#include "lsquic_enc_sess.h" #include "lsquic_mm.h" -#include "lsquic_conn_hash.h" #include "lsquic_engine_public.h" #include "lsquic_eng_hist.h" #include "lsquic_ev_log.h" #include "lsquic_version.h" -#include "lsquic_hash.h" +#include "lsquic_pr_queue.h" +#include "lsquic_mini_conn.h" +#include "lsquic_mini_conn_ietf.h" +#include "lsquic_stock_shi.h" +#include "lsquic_purga.h" +#include "lsquic_tokgen.h" #include "lsquic_attq.h" #include "lsquic_min_heap.h" #include "lsquic_http1x_if.h" +#include "lsquic_parse_common.h" +#include "lsquic_h3_prio.h" +#include "lsquic_handshake.h" #define LSQUIC_LOGGER_MODULE LSQLM_ENGINE #include "lsquic_logger.h" #define MIN(a, b) ((a) < (b) ? (a) : (b)) - /* The batch of outgoing packets grows and shrinks dynamically */ #define MAX_OUT_BATCH_SIZE 1024 #define MIN_OUT_BATCH_SIZE 4 @@ -72,8 +90,10 @@ struct out_batch { lsquic_conn_t *conns [MAX_OUT_BATCH_SIZE]; - lsquic_packet_out_t *packets[MAX_OUT_BATCH_SIZE]; struct lsquic_out_spec outs [MAX_OUT_BATCH_SIZE]; + unsigned pack_off[MAX_OUT_BATCH_SIZE]; + lsquic_packet_out_t *packets[MAX_OUT_BATCH_SIZE * 2]; + struct iovec iov [MAX_OUT_BATCH_SIZE * 2]; }; typedef struct lsquic_conn * (*conn_iter_f)(struct lsquic_engine *); @@ -92,10 +112,17 @@ engine_decref_conn (lsquic_engine_t *engine, lsquic_conn_t *conn, static void force_close_conn (lsquic_engine_t *engine, lsquic_conn_t *conn); +#if LSQUIC_COUNT_ENGINE_CALLS +#define ENGINE_CALLS_INCR(e) do { ++(e)->n_engine_calls; } while (0) +#else +#define ENGINE_CALLS_INCR(e) +#endif + /* Nested calls to LSQUIC are not supported */ #define ENGINE_IN(e) do { \ assert(!((e)->pub.enp_flags & ENPUB_PROC)); \ (e)->pub.enp_flags |= ENPUB_PROC; \ + ENGINE_CALLS_INCR(e); \ } while (0) #define ENGINE_OUT(e) do { \ @@ -105,7 +132,9 @@ force_close_conn (lsquic_engine_t *engine, lsquic_conn_t *conn); /* A connection can be referenced from one of six places: * - * 1. Connection hash: a connection starts its life in one of those. + * 1. A hash. The engine maintains two hash tables -- one for full, and + * one for mini connections. A connection starts its life in one of + * those. * * 2. Outgoing queue. * @@ -136,6 +165,25 @@ force_close_conn (lsquic_engine_t *engine, lsquic_conn_t *conn); |LSCONN_ATTQ) +struct cert_susp_head +{ + TAILQ_HEAD(, lsquic_conn) csh_conns; + struct lsquic_hash_elem csh_hash_el; + char csh_sni[0]; +}; + + +struct cid_update_batch +{ + lsquic_cids_update_f cub_update_cids; + void *cub_update_ctx; + unsigned cub_count; + lsquic_cid_t cub_cids[20]; + void *cub_peer_ctxs[20]; +}; + +static void +cub_init (struct cid_update_batch *, lsquic_cids_update_f, void *); struct lsquic_engine @@ -149,28 +197,48 @@ struct lsquic_engine = (1 << 8), /* Previous call to a processing * function went past time threshold. */ + ENG_CONNS_BY_ADDR + = (1 << 9), /* Connections are hashed by address */ #ifndef NDEBUG + ENG_COALESCE = (1 << 24), /* Packet coalescing is enabled */ + ENG_LOSE_PACKETS= (1 << 25), /* Lose *some* outgoing packets */ ENG_DTOR = (1 << 26), /* Engine destructor */ #endif } flags; - const struct lsquic_stream_if *stream_if; - void *stream_if_ctx; lsquic_packets_out_f packets_out; void *packets_out_ctx; - void *bad_handshake_ctx; - struct conn_hash conns_hash; + lsquic_cids_update_f report_new_scids; + lsquic_cids_update_f report_live_scids; + lsquic_cids_update_f report_old_scids; + void *scids_ctx; + struct lsquic_hash *conns_hash; struct min_heap conns_tickable; struct min_heap conns_out; + /* Use a union because only one iterator is being used at any one time */ + union { + struct { + struct cert_susp_head *head; + } resumed; + struct lsquic_conn *one_conn; + } iter_state; struct eng_hist history; unsigned batch_size; + struct pr_queue *pr_queue; struct attq *attq; /* Track time last time a packet was sent to give new connections * priority lower than that of existing connections. */ lsquic_time_t last_sent; +#ifndef NDEBUG + regex_t lose_packets_re; + const char *lose_packets_str; +#endif unsigned n_conns; lsquic_time_t deadline; lsquic_time_t resume_sending_at; + unsigned mini_conns_count; + struct lsquic_hash *suspended_sni_heads; + struct lsquic_purga *purga; #if LSQUIC_CONN_STATS struct { unsigned conns; @@ -178,7 +246,11 @@ struct lsquic_engine struct conn_stats conn_stats_sum; FILE *stats_fh; #endif + struct cid_update_batch new_scids; struct out_batch out_batch; +#if LSQUIC_COUNT_ENGINE_CALLS + unsigned long n_engine_calls; +#endif }; @@ -193,20 +265,44 @@ lsquic_engine_init_settings (struct lsquic_engine_settings *settings, settings->es_cfcw = LSQUIC_DF_CFCW_SERVER; settings->es_sfcw = LSQUIC_DF_SFCW_SERVER; settings->es_support_srej= LSQUIC_DF_SUPPORT_SREJ_SERVER; + settings->es_init_max_data + = LSQUIC_DF_INIT_MAX_DATA_SERVER; + settings->es_init_max_stream_data_bidi_remote + = LSQUIC_DF_INIT_MAX_STREAM_DATA_BIDI_REMOTE_SERVER; + settings->es_init_max_stream_data_bidi_local + = LSQUIC_DF_INIT_MAX_STREAM_DATA_BIDI_LOCAL_SERVER; + settings->es_init_max_stream_data_uni + = LSQUIC_DF_INIT_MAX_STREAM_DATA_UNI_SERVER; + settings->es_init_max_streams_uni + = LSQUIC_DF_INIT_MAX_STREAMS_UNI_SERVER; + settings->es_ping_period = 0; } else { settings->es_cfcw = LSQUIC_DF_CFCW_CLIENT; settings->es_sfcw = LSQUIC_DF_SFCW_CLIENT; settings->es_support_srej= LSQUIC_DF_SUPPORT_SREJ_CLIENT; + settings->es_init_max_data + = LSQUIC_DF_INIT_MAX_DATA_CLIENT; + settings->es_init_max_stream_data_bidi_remote + = LSQUIC_DF_INIT_MAX_STREAM_DATA_BIDI_REMOTE_CLIENT; + settings->es_init_max_stream_data_bidi_local + = LSQUIC_DF_INIT_MAX_STREAM_DATA_BIDI_LOCAL_CLIENT; + settings->es_init_max_stream_data_uni + = LSQUIC_DF_INIT_MAX_STREAM_DATA_UNI_CLIENT; + settings->es_init_max_streams_uni + = LSQUIC_DF_INIT_MAX_STREAMS_UNI_CLIENT; + settings->es_ping_period = LSQUIC_DF_PING_PERIOD; } settings->es_max_streams_in = LSQUIC_DF_MAX_STREAMS_IN; settings->es_idle_conn_to = LSQUIC_DF_IDLE_CONN_TO; + settings->es_idle_timeout = LSQUIC_DF_IDLE_TIMEOUT; settings->es_handshake_to = LSQUIC_DF_HANDSHAKE_TO; settings->es_silent_close = LSQUIC_DF_SILENT_CLOSE; settings->es_max_header_list_size = LSQUIC_DF_MAX_HEADER_LIST_SIZE; settings->es_ua = LSQUIC_DF_UA; + settings->es_ecn = LSQUIC_DF_ECN; settings->es_pdmd = QTAG_X509; settings->es_aead = QTAG_AESG; @@ -220,6 +316,19 @@ lsquic_engine_init_settings (struct lsquic_engine_settings *settings, settings->es_proc_time_thresh= LSQUIC_DF_PROC_TIME_THRESH; settings->es_pace_packets = LSQUIC_DF_PACE_PACKETS; settings->es_clock_granularity = LSQUIC_DF_CLOCK_GRANULARITY; + settings->es_max_inchoate = LSQUIC_DF_MAX_INCHOATE; + settings->es_send_prst = LSQUIC_DF_SEND_PRST; + settings->es_sttl = LSQUIC_DF_STTL; + settings->es_init_max_streams_bidi + = LSQUIC_DF_INIT_MAX_STREAMS_BIDI; + settings->es_scid_len = LSQUIC_DF_SCID_LEN; + settings->es_scid_iss_rate = LSQUIC_DF_SCID_ISS_RATE; + settings->es_qpack_dec_max_size = LSQUIC_DF_QPACK_DEC_MAX_SIZE; + settings->es_qpack_dec_max_blocked = LSQUIC_DF_QPACK_DEC_MAX_BLOCKED; + settings->es_qpack_enc_max_size = LSQUIC_DF_QPACK_ENC_MAX_SIZE; + settings->es_qpack_enc_max_blocked = LSQUIC_DF_QPACK_ENC_MAX_BLOCKED; + settings->es_h3_placeholders = LSQUIC_DF_H3_PLACEHOLDERS; + settings->es_allow_migration = LSQUIC_DF_ALLOW_MIGRATION; } @@ -229,6 +338,8 @@ lsquic_engine_check_settings (const struct lsquic_engine_settings *settings, unsigned flags, char *err_buf, size_t err_buf_sz) { + unsigned sum; + if (settings->es_cfcw < LSQUIC_MIN_FCW || settings->es_sfcw < LSQUIC_MIN_FCW) { @@ -251,6 +362,55 @@ lsquic_engine_check_settings (const struct lsquic_engine_settings *settings, "one or more unsupported QUIC version is specified"); return -1; } + if (flags & ENG_SERVER) + { + if (settings->es_handshake_to > + MAX_MINI_CONN_LIFESPAN_IN_USEC) + { + if (err_buf) + snprintf(err_buf, err_buf_sz, "handshake timeout %lu" + " usec is too large. The maximum for server is %u usec", + settings->es_handshake_to, MAX_MINI_CONN_LIFESPAN_IN_USEC); + return -1; + } + } + if (settings->es_idle_timeout > 600) + { + if (err_buf) + snprintf(err_buf, err_buf_sz, "%s", + "The maximum value of idle timeout is 600 seconds"); + return -1; + } + if (!(!(flags & ENG_SERVER) && settings->es_scid_len == 0) + && (settings->es_scid_len < 4 || settings->es_scid_len > 18)) + { + if (err_buf) + snprintf(err_buf, err_buf_sz, "Source connection ID cannot be %u " + "bytes long; it must be between 4 and 18.", + settings->es_scid_len); + return -1; + } + + sum = settings->es_init_max_streams_bidi + + settings->es_init_max_streams_uni + + settings->es_h3_placeholders; + if (sum > H3_PRIO_MAX_ELEMS) + { + if (err_buf) + snprintf(err_buf, err_buf_sz, "Combined number of streams and " + "placeholders (%u) is greater than the maximum supported " + "number of elements in the HTTP/3 priority tree (%u)", + sum, H3_PRIO_MAX_ELEMS); + return -1; + } + + if (settings->es_cc_algo > 2) + { + if (err_buf) + snprintf(err_buf, err_buf_sz, "Invalid congestion control " + "algorithm value %u", settings->es_cc_algo); + return -1; + } return 0; } @@ -278,11 +438,15 @@ static const struct lsquic_packout_mem_if stock_pmi = static int hash_conns_by_addr (const struct lsquic_engine *engine) { + if (engine->flags & ENG_SERVER) + return 0; if (engine->pub.enp_settings.es_versions & LSQUIC_FORCED_TCID0_VERSIONS) return 1; if ((engine->pub.enp_settings.es_versions & LSQUIC_GQUIC_HEADER_VERSIONS) && engine->pub.enp_settings.es_support_tcid0) return 1; + if (engine->pub.enp_settings.es_scid_len == 0) + return 1; return 0; } @@ -320,13 +484,50 @@ lsquic_engine_new (unsigned flags, engine->pub.enp_settings = *api->ea_settings; else lsquic_engine_init_settings(&engine->pub.enp_settings, flags); + int tag_buf_len; + tag_buf_len = lsquic_gen_ver_tags(engine->pub.enp_ver_tags_buf, + sizeof(engine->pub.enp_ver_tags_buf), + engine->pub.enp_settings.es_versions); + if (tag_buf_len <= 0) + { + LSQ_ERROR("cannot generate version tags buffer"); + free(engine); + return NULL; + } + engine->pub.enp_ver_tags_len = tag_buf_len; engine->pub.enp_flags = ENPUB_CAN_SEND; + engine->pub.enp_stream_if = api->ea_stream_if; + engine->pub.enp_stream_if_ctx = api->ea_stream_if_ctx; engine->flags = flags; - engine->stream_if = api->ea_stream_if; - engine->stream_if_ctx = api->ea_stream_if_ctx; +#ifndef NDEBUG + engine->flags |= ENG_COALESCE; +#endif engine->packets_out = api->ea_packets_out; engine->packets_out_ctx = api->ea_packets_out_ctx; + engine->report_new_scids = api->ea_new_scids; + engine->report_live_scids = api->ea_live_scids; + engine->report_old_scids = api->ea_old_scids; + engine->scids_ctx = api->ea_cids_update_ctx; + cub_init(&engine->new_scids, engine->report_new_scids, engine->scids_ctx); + engine->pub.enp_lookup_cert = api->ea_lookup_cert; + engine->pub.enp_cert_lu_ctx = api->ea_cert_lu_ctx; + engine->pub.enp_get_ssl_ctx = api->ea_get_ssl_ctx; + if (api->ea_shi) + { + engine->pub.enp_shi = api->ea_shi; + engine->pub.enp_shi_ctx = api->ea_shi_ctx; + } + else + { + engine->pub.enp_shi = &stock_shi; + engine->pub.enp_shi_ctx = stock_shared_hash_new(); + if (!engine->pub.enp_shi_ctx) + { + free(engine); + return NULL; + } + } if (api->ea_hsi_if) { engine->pub.enp_hsi_if = api->ea_hsi_if; @@ -349,13 +550,79 @@ lsquic_engine_new (unsigned flags, } engine->pub.enp_verify_cert = api->ea_verify_cert; engine->pub.enp_verify_ctx = api->ea_verify_ctx; + engine->pub.enp_kli = api->ea_keylog_if; + engine->pub.enp_kli_ctx = api->ea_keylog_ctx; engine->pub.enp_engine = engine; - conn_hash_init(&engine->conns_hash, - hash_conns_by_addr(engine) ? CHF_USE_ADDR : 0); + if (hash_conns_by_addr(engine)) + engine->flags |= ENG_CONNS_BY_ADDR; + engine->conns_hash = lsquic_hash_create(); + if (flags & ENG_SERVER) + { + engine->pub.enp_tokgen = lsquic_tg_new(&engine->pub); + if (!engine->pub.enp_tokgen) + return NULL; + engine->pr_queue = prq_create( + 10000 /* TODO: make configurable */, MAX_OUT_BATCH_SIZE, + &engine->pub); + if (!engine->pr_queue) + { + lsquic_tg_destroy(engine->pub.enp_tokgen); + return NULL; + } + engine->purga = lsquic_purga_new(30 * 1000 * 1000, + engine->report_old_scids, engine->scids_ctx); + if (!engine->purga) + { + lsquic_tg_destroy(engine->pub.enp_tokgen); + prq_destroy(engine->pr_queue); + return NULL; + } + } engine->attq = attq_create(); eng_hist_init(&engine->history); engine->batch_size = INITIAL_OUT_BATCH_SIZE; + engine->suspended_sni_heads = lsquic_hash_create(); + if (engine->pub.enp_settings.es_honor_prst) + { + engine->pub.enp_srst_hash = lsquic_hash_create(); + if (!engine->pub.enp_srst_hash) + { + lsquic_engine_destroy(engine); + return NULL; + } + } +#ifndef NDEBUG + { + const char *env; + env = getenv("LSQUIC_LOSE_PACKETS_RE"); + if (env) + { + if (0 != regcomp(&engine->lose_packets_re, env, + REG_EXTENDED|REG_NOSUB)) + { + LSQ_ERROR("could not compile lost packet regex `%s'", env); + return NULL; + } + engine->flags |= ENG_LOSE_PACKETS; + engine->lose_packets_str = env; + LSQ_WARN("will lose packets that match the following regex: %s", + env); + } + env = getenv("LSQUIC_COALESCE"); + if (env) + { + engine->flags &= ~ENG_COALESCE; + if (atoi(env)) + { + engine->flags |= ENG_COALESCE; + LSQ_NOTICE("will coalesce packets"); + } + else + LSQ_NOTICE("will not coalesce packets"); + } + } +#endif #if LSQUIC_CONN_STATS engine->stats_fh = api->ea_stats_fh; #endif @@ -365,6 +632,19 @@ lsquic_engine_new (unsigned flags, } +#if LOG_PACKET_CHECKSUM +static void +log_packet_checksum (const lsquic_cid_t *cid, const char *direction, + const unsigned char *buf, size_t bufsz) +{ + EV_LOG_CONN_EVENT(cid, "packet %s checksum: %08X", direction, + (uint32_t) crc32(0, buf, bufsz)); +} + + +#endif + + static void grow_batch_size (struct lsquic_engine *engine) { @@ -379,6 +659,57 @@ shrink_batch_size (struct lsquic_engine *engine) } +static void +delete_susp_head (struct lsquic_engine *engine, struct cert_susp_head *head) +{ + struct lsquic_hash_elem *el; + + el = lsquic_hash_find(engine->suspended_sni_heads, head->csh_sni, + strlen(head->csh_sni)); + assert(el); + assert(head == lsquic_hashelem_getdata(el)); + lsquic_hash_erase(engine->suspended_sni_heads, el); + free(head); +} + + +struct cce_cid_iter +{ + const struct lsquic_conn *conn; + unsigned todo, n; +}; + + +static struct conn_cid_elem * +cce_iter_next (struct cce_cid_iter *citer) +{ + struct conn_cid_elem *cce; + + while (citer->todo) + if (citer->todo & (1 << citer->n)) + { + citer->todo &= ~(1 << citer->n); + cce = &citer->conn->cn_cces[ citer->n++ ]; + if (!(cce->cce_flags & CCE_PORT)) + return cce; + } + else + ++citer->n; + + return NULL; +} + + +static struct conn_cid_elem * +cce_iter_first (struct cce_cid_iter *citer, const struct lsquic_conn *conn) +{ + citer->conn = conn; + citer->todo = conn->cn_cces_mask; + citer->n = 0; + return cce_iter_next(citer); +} + + #if LSQUIC_CONN_STATS void update_stats_sum (struct lsquic_engine *engine, struct lsquic_conn *conn) @@ -405,8 +736,57 @@ update_stats_sum (struct lsquic_engine *engine, struct lsquic_conn *conn) * really destroyed. */ static void -destroy_conn (struct lsquic_engine *engine, lsquic_conn_t *conn) +destroy_conn (struct lsquic_engine *engine, struct lsquic_conn *conn, + lsquic_time_t now) { + struct cce_cid_iter citer; + const struct conn_cid_elem *cce; + lsquic_time_t drain_time; + struct purga_el *puel; + + if (conn->cn_cert_susp_head) + { + TAILQ_REMOVE(&conn->cn_cert_susp_head->csh_conns, conn, + cn_next_susp_cert); + if (TAILQ_EMPTY(&conn->cn_cert_susp_head->csh_conns)) + delete_susp_head(engine, conn->cn_cert_susp_head); + conn->cn_cert_susp_head = NULL; + } + engine->mini_conns_count -= !!(conn->cn_flags & LSCONN_MINI); + if (engine->purga + /* Blacklist all CIDs except for promoted mini connections */ + && (conn->cn_flags & (LSCONN_MINI|LSCONN_PROMOTED)) + != (LSCONN_MINI|LSCONN_PROMOTED)) + { + if (conn->cn_if->ci_drain_time && + (drain_time = conn->cn_if->ci_drain_time(conn), drain_time)) + { + for (cce = cce_iter_first(&citer, conn); cce; + cce = cce_iter_next(&citer)) + { + puel = lsquic_purga_add(engine->purga, &cce->cce_cid, + lsquic_conn_get_peer_ctx(conn, NULL), + PUTY_CONN_DRAIN, now); + if (puel) + puel->puel_time = now + drain_time; + } + } + else + { + for (cce = cce_iter_first(&citer, conn); cce; + cce = cce_iter_next(&citer)) + { + puel = lsquic_purga_add(engine->purga, &cce->cce_cid, + lsquic_conn_get_peer_ctx(conn, NULL), + PUTY_CONN_DELETED, now); + if (puel) + { + puel->puel_time = now; + puel->puel_count = 0; + } + } + } + } #if LSQUIC_CONN_STATS update_stats_sum(engine, conn); #endif @@ -451,49 +831,218 @@ maybe_grow_conn_heaps (struct lsquic_engine *engine) } +static void +remove_cces_from_hash (struct lsquic_hash *hash, struct lsquic_conn *conn, + unsigned todo) +{ + unsigned n; + + for (n = 0; todo; todo &= ~(1 << n++)) + if ((todo & (1 << n)) && + (conn->cn_cces[n].cce_hash_el.qhe_flags & QHE_HASHED)) + lsquic_hash_erase(hash, &conn->cn_cces[n].cce_hash_el); +} + + +static void +remove_all_cces_from_hash (struct lsquic_hash *hash, struct lsquic_conn *conn) +{ + remove_cces_from_hash(hash, conn, conn->cn_cces_mask); +} + + +static void +cub_add (struct cid_update_batch *cub, const lsquic_cid_t *cid, void *peer_ctx); + + +static int +insert_conn_into_hash (struct lsquic_engine *engine, struct lsquic_conn *conn, + void *peer_ctx) +{ + struct conn_cid_elem *cce; + unsigned todo, done, n; + + for (todo = conn->cn_cces_mask, done = 0, n = 0; todo; todo &= ~(1 << n++)) + if (todo & (1 << n)) + { + cce = &conn->cn_cces[n]; + assert(!(cce->cce_hash_el.qhe_flags & QHE_HASHED)); + if (lsquic_hash_insert(engine->conns_hash, cce->cce_cid.idbuf, + cce->cce_cid.len, conn, &cce->cce_hash_el)) + done |= 1 << n; + else + goto err; + if ((engine->flags & ENG_SERVER) && 0 == (cce->cce_flags & CCE_REG)) + { + cce->cce_flags |= CCE_REG; + cub_add(&engine->new_scids, &cce->cce_cid, peer_ctx); + } + } + + return 0; + + err: + remove_cces_from_hash(engine->conns_hash, conn, done); + return -1; +} + + static lsquic_conn_t * -new_full_conn_client (lsquic_engine_t *engine, const char *hostname, - unsigned short max_packet_size, const unsigned char *zero_rtt, - size_t zero_rtt_len) +new_full_conn_server (lsquic_engine_t *engine, lsquic_conn_t *mini_conn, + lsquic_time_t now) { + const lsquic_cid_t *cid; + server_conn_ctor_f ctor; lsquic_conn_t *conn; unsigned flags; if (0 != maybe_grow_conn_heaps(engine)) return NULL; flags = engine->flags & (ENG_SERVER|ENG_HTTP); - conn = full_conn_client_new(&engine->pub, engine->stream_if, - engine->stream_if_ctx, flags, hostname, - max_packet_size, zero_rtt, zero_rtt_len); + + if (mini_conn->cn_flags & LSCONN_IETF) + ctor = lsquic_ietf_full_conn_server_new; + else + ctor = lsquic_gquic_full_conn_server_new; + + conn = ctor(&engine->pub, flags, mini_conn); if (!conn) + { + /* Otherwise, full_conn_server_new prints its own warnings */ + if (ENOMEM == errno) + { + cid = lsquic_conn_log_cid(mini_conn); + LSQ_WARNC("could not allocate full connection for %"CID_FMT": %s", + CID_BITS(cid), strerror(errno)); + } return NULL; + } ++engine->n_conns; + if (0 != insert_conn_into_hash(engine, conn, lsquic_conn_get_peer_ctx(conn, NULL))) + { + cid = lsquic_conn_log_cid(conn); + LSQ_WARNC("cannot add connection %"CID_FMT" to hash - destroy", + CID_BITS(cid)); + destroy_conn(engine, conn, now); + return NULL; + } + assert(!(conn->cn_flags & CONN_REF_FLAGS)); + conn->cn_flags |= LSCONN_HASHED; return conn; } +static enum +{ + VER_NOT_SPECIFIED, + VER_SUPPORTED, + VER_UNSUPPORTED, +} + + +version_matches (lsquic_engine_t *engine, const lsquic_packet_in_t *packet_in, + enum lsquic_version *pversion) +{ + lsquic_ver_tag_t ver_tag; + enum lsquic_version version; + + if (!packet_in->pi_quic_ver) + { + LSQ_DEBUG("packet does not specify version"); + return VER_NOT_SPECIFIED; + } + + memcpy(&ver_tag, packet_in->pi_data + packet_in->pi_quic_ver, sizeof(ver_tag)); + version = lsquic_tag2ver(ver_tag); + if (version < N_LSQVER) + { + if (engine->pub.enp_settings.es_versions & (1 << version)) + { + LSQ_DEBUG("client-supplied version %s is supported", + lsquic_ver2str[version]); + *pversion = version; + return VER_SUPPORTED; + } + else + LSQ_DEBUG("client-supplied version %s is not supported", + lsquic_ver2str[version]); + } + else + LSQ_DEBUG("client-supplied version tag 0x%08X is not recognized", + ver_tag); + + return VER_UNSUPPORTED; +} + + +static void +schedule_req_packet (struct lsquic_engine *engine, enum packet_req_type type, + const struct lsquic_packet_in *packet_in, const struct sockaddr *sa_local, + const struct sockaddr *sa_peer, void *peer_ctx) +{ + assert(engine->pr_queue); + if (0 == prq_new_req(engine->pr_queue, type, packet_in, peer_ctx, + sa_local, sa_peer)) + LSQ_DEBUGC("scheduled %s packet for cid %"CID_FMT, + lsquic_preqt2str[type], CID_BITS(&packet_in->pi_conn_id)); + else + LSQ_DEBUG("cannot schedule %s packet: out of packet request objects", + lsquic_preqt2str[type]); +} + + +static unsigned short +sa2port (const struct sockaddr *sa) +{ + if (sa->sa_family == AF_INET) + { + struct sockaddr_in *const sa4 = (void *) sa; + return sa4->sin_port; + } + else + { + struct sockaddr_in6 *const sa6 = (void *) sa; + return sa6->sin6_port; + } +} + + +static struct lsquic_hash_elem * +find_conn_by_addr (struct lsquic_hash *hash, const struct sockaddr *sa) +{ + unsigned short port; + + port = sa2port(sa); + return lsquic_hash_find(hash, &port, sizeof(port)); +} + + static lsquic_conn_t * find_conn (lsquic_engine_t *engine, lsquic_packet_in_t *packet_in, struct packin_parse_state *ppstate, const struct sockaddr *sa_local) { + struct lsquic_hash_elem *el; lsquic_conn_t *conn; - if (conn_hash_using_addr(&engine->conns_hash)) - conn = conn_hash_find_by_addr(&engine->conns_hash, sa_local); + if (engine->flags & ENG_CONNS_BY_ADDR) + el = find_conn_by_addr(engine->conns_hash, sa_local); else if (packet_in->pi_flags & PI_CONN_ID) - conn = conn_hash_find_by_cid(&engine->conns_hash, - packet_in->pi_conn_id); + el = lsquic_hash_find(engine->conns_hash, + packet_in->pi_conn_id.idbuf, packet_in->pi_conn_id.len); else { LSQ_DEBUG("packet header does not have connection ID: discarding"); return NULL; } - if (!conn) + if (!el) return NULL; + conn = lsquic_hashelem_getdata(el); conn->cn_pf->pf_parse_packet_in_finish(packet_in, ppstate); - if ((packet_in->pi_flags & PI_CONN_ID) - && conn->cn_cid != packet_in->pi_conn_id) + if ((engine->flags & ENG_CONNS_BY_ADDR) + && !(conn->cn_flags & LSCONN_IETF) + && (packet_in->pi_flags & PI_CONN_ID) + && !LSQUIC_CIDS_EQ(CN_SCID(conn), &packet_in->pi_conn_id)) { LSQ_DEBUG("connection IDs do not match"); return NULL; @@ -503,6 +1052,162 @@ find_conn (lsquic_engine_t *engine, lsquic_packet_in_t *packet_in, } +static lsquic_conn_t * +find_or_create_conn (lsquic_engine_t *engine, lsquic_packet_in_t *packet_in, + struct packin_parse_state *ppstate, const struct sockaddr *sa_local, + const struct sockaddr *sa_peer, void *peer_ctx) +{ + struct lsquic_hash_elem *el; + lsquic_cid_t odcid; + struct purga_el *puel; + lsquic_conn_t *conn; + + if (!(packet_in->pi_flags & PI_CONN_ID)) + { + LSQ_DEBUG("packet header does not have connection ID: discarding"); + return NULL; + } + el = lsquic_hash_find(engine->conns_hash, + packet_in->pi_conn_id.idbuf, packet_in->pi_conn_id.len); + + if (el) + { + conn = lsquic_hashelem_getdata(el); + conn->cn_pf->pf_parse_packet_in_finish(packet_in, ppstate); + return conn; + } + + if (engine->flags & ENG_COOLDOWN) + { /* Do not create incoming connections during cooldown */ + LSQ_DEBUG("dropping inbound packet for unknown connection (cooldown)"); + return NULL; + } + + if (engine->mini_conns_count >= engine->pub.enp_settings.es_max_inchoate) + { + LSQ_DEBUG("reached limit of %u inchoate connections", + engine->pub.enp_settings.es_max_inchoate); + return NULL; + } + + + if (engine->purga + && (puel = lsquic_purga_contains(engine->purga, + &packet_in->pi_conn_id), puel)) + { + switch (puel->puel_type) + { + case PUTY_CID_RETIRED: + LSQ_DEBUGC("CID %"CID_FMT" was retired, ignore packet", + CID_BITS(&packet_in->pi_conn_id)); + return NULL; + case PUTY_CONN_DRAIN: + LSQ_DEBUG("drain till: %"PRIu64"; now: %"PRIu64, + puel->puel_time, packet_in->pi_received); + if (puel->puel_time > packet_in->pi_received) + { + LSQ_DEBUGC("CID %"CID_FMT" is in drain state, ignore packet", + CID_BITS(&packet_in->pi_conn_id)); + return NULL; + } + LSQ_DEBUGC("CID %"CID_FMT" goes from drain state to deleted", + CID_BITS(&packet_in->pi_conn_id)); + puel->puel_type = PUTY_CONN_DELETED; + puel->puel_count = 0; + puel->puel_time = 0; + /* fall-through */ + case PUTY_CONN_DELETED: + LSQ_DEBUGC("Connection with CID %"CID_FMT" was deleted", + CID_BITS(&packet_in->pi_conn_id)); + if (puel->puel_time < packet_in->pi_received) + { + puel->puel_time = packet_in->pi_received + /* Exponential back-off */ + + 1000000ull * (1 << MIN(puel->puel_count, 4)); + ++puel->puel_count; + goto maybe_send_prst; + } + return NULL; + default: + assert(0); + return NULL; + } + } + + if (engine->pub.enp_settings.es_send_prst + && !(packet_in->pi_flags & PI_GQUIC) + && HETY_NOT_SET == packet_in->pi_header_type) + goto maybe_send_prst; + + if (0 != maybe_grow_conn_heaps(engine)) + return NULL; + + const struct parse_funcs *pf; + enum lsquic_version version; + switch (version_matches(engine, packet_in, &version)) + { + case VER_UNSUPPORTED: + if (engine->flags & ENG_SERVER) + schedule_req_packet(engine, PACKET_REQ_VERNEG, packet_in, + sa_local, sa_peer, peer_ctx); + return NULL; + case VER_NOT_SPECIFIED: + maybe_send_prst: + if ((engine->flags & ENG_SERVER) && + engine->pub.enp_settings.es_send_prst) + schedule_req_packet(engine, PACKET_REQ_PUBRES, packet_in, + sa_local, sa_peer, peer_ctx); + return NULL; + case VER_SUPPORTED: + pf = select_pf_by_ver(version); + pf->pf_parse_packet_in_finish(packet_in, ppstate); + break; + } + + + if ((1 << version) & LSQUIC_IETF_VERSIONS) + { + conn = lsquic_mini_conn_ietf_new(&engine->pub, packet_in, version, + sa_peer->sa_family == AF_INET, odcid.len ? &odcid : NULL); + } + else + { + conn = mini_conn_new(&engine->pub, packet_in, version); + } + if (!conn) + return NULL; + ++engine->mini_conns_count; + ++engine->n_conns; + if (0 != insert_conn_into_hash(engine, conn, peer_ctx)) + { + const lsquic_cid_t *cid = lsquic_conn_log_cid(conn); + LSQ_WARNC("cannot add connection %"CID_FMT" to hash - destroy", + CID_BITS(cid)); + destroy_conn(engine, conn, packet_in->pi_received); + return NULL; + } + assert(!(conn->cn_flags & CONN_REF_FLAGS)); + conn->cn_flags |= LSCONN_HASHED; + eng_hist_inc(&engine->history, packet_in->pi_received, sl_new_mini_conns); + conn->cn_last_sent = engine->last_sent; + return conn; +} + + +lsquic_conn_t * +lsquic_engine_find_conn (const struct lsquic_engine_public *engine, + const lsquic_cid_t *cid) +{ + struct lsquic_hash_elem *el; + lsquic_conn_t *conn = NULL; + el = lsquic_hash_find(engine->enp_engine->conns_hash, cid->idbuf, cid->len); + + if (el) + conn = lsquic_hashelem_getdata(el); + return conn; +} + + #if !defined(NDEBUG) && __GNUC__ __attribute__((weak)) #endif @@ -546,7 +1251,31 @@ lsquic_engine_add_conn_to_attq (struct lsquic_engine_public *enpub, } -/* Return 0 if packet is being processed by a connections, otherwise return 1 */ +static struct lsquic_conn * +find_conn_by_srst (struct lsquic_engine *engine, + const struct lsquic_packet_in *packet_in) +{ + struct lsquic_hash_elem *el; + struct lsquic_conn *conn; + + if (packet_in->pi_data_sz < IQUIC_MIN_SRST_SIZE + || (packet_in->pi_data[0] & 0xC0) != 0x40) + return NULL; + + el = lsquic_hash_find(engine->pub.enp_srst_hash, + packet_in->pi_data + packet_in->pi_data_sz - IQUIC_SRESET_TOKEN_SZ, + IQUIC_SRESET_TOKEN_SZ); + if (!el) + return NULL; + + conn = lsquic_hashelem_getdata(el); + return conn; +} + + +/* Return 0 if packet is being processed by a real connection (mini or full), + * otherwise return 1. + */ static int process_packet_in (lsquic_engine_t *engine, lsquic_packet_in_t *packet_in, struct packin_parse_state *ppstate, const struct sockaddr *sa_local, @@ -564,10 +1293,34 @@ process_packet_in (lsquic_engine_t *engine, lsquic_packet_in_t *packet_in, return 1; } - conn = find_conn(engine, packet_in, ppstate, sa_local); + if (engine->flags & ENG_SERVER) + conn = find_or_create_conn(engine, packet_in, ppstate, sa_local, + sa_peer, peer_ctx); + else + conn = find_conn(engine, packet_in, ppstate, sa_local); if (!conn) { + if (engine->pub.enp_settings.es_honor_prst + && !(packet_in->pi_flags & PI_GQUIC) + && engine->pub.enp_srst_hash + && (conn = find_conn_by_srst(engine, packet_in))) + { + LSQ_DEBUGC("got stateless reset for connection %"CID_FMT, + CID_BITS(lsquic_conn_log_cid(conn))); + conn->cn_if->ci_stateless_reset(conn); + if (!(conn->cn_flags & LSCONN_TICKABLE) + && conn->cn_if->ci_is_tickable(conn)) + { + lsquic_mh_insert(&engine->conns_tickable, conn, + conn->cn_last_ticked); + engine_incref_conn(conn, LSCONN_TICKABLE); + } + /* Even though the connection processes this packet, we return + * 1 so that the caller does not add reset packet's random + * bytes to the list of valid CIDs. + */ + } lsquic_mm_put_packet_in(&engine->pub.enp_mm, packet_in); return 1; } @@ -577,8 +1330,13 @@ process_packet_in (lsquic_engine_t *engine, lsquic_packet_in_t *packet_in, lsquic_mh_insert(&engine->conns_tickable, conn, conn->cn_last_ticked); engine_incref_conn(conn, LSCONN_TICKABLE); } - lsquic_conn_record_sockaddr(conn, sa_local, sa_peer); + packet_in->pi_path_id = lsquic_conn_record_sockaddr(conn, peer_ctx, + sa_local, sa_peer); lsquic_packet_in_upref(packet_in); +#if LOG_PACKET_CHECKSUM + log_packet_checksum(lsquic_conn_log_cid(conn), "in", packet_in->pi_data, + packet_in->pi_data_sz); +#endif /* Note on QLog: * For the PACKET_RX QLog event, we are interested in logging these things: * - raw packet (however it comes in, encrypted or not) @@ -595,11 +1353,10 @@ process_packet_in (lsquic_engine_t *engine, lsquic_packet_in_t *packet_in, * ordering of QLog events, be sure to process the QLogs downstream. * (Hint: Use the qlog_parser.py tool in tools/ for full QLog processing.) */ - conn->cn_peer_ctx = peer_ctx; packet_in_data = packet_in->pi_data; packet_in_size = packet_in->pi_data_sz; conn->cn_if->ci_packet_in(conn, packet_in); - QLOG_PACKET_RX(conn->cn_cid, packet_in, packet_in_data, packet_in_size); + QLOG_PACKET_RX(lsquic_conn_log_cid(conn), packet_in, packet_in_data, packet_in_size); lsquic_packet_in_put(&engine->pub.enp_mm, packet_in); return 0; } @@ -608,6 +1365,7 @@ process_packet_in (lsquic_engine_t *engine, lsquic_packet_in_t *packet_in, void lsquic_engine_destroy (lsquic_engine_t *engine) { + struct lsquic_hash_elem *el; lsquic_conn_t *conn; LSQ_DEBUG("destroying engine"); @@ -627,18 +1385,35 @@ lsquic_engine_destroy (lsquic_engine_t *engine) (void) engine_decref_conn(engine, conn, LSCONN_TICKABLE); } - for (conn = conn_hash_first(&engine->conns_hash); conn; - conn = conn_hash_next(&engine->conns_hash)) + for (el = lsquic_hash_first(engine->conns_hash); el; + el = lsquic_hash_next(engine->conns_hash)) + { + conn = lsquic_hashelem_getdata(el); force_close_conn(engine, conn); - conn_hash_cleanup(&engine->conns_hash); + } + lsquic_hash_destroy(engine->conns_hash); assert(0 == engine->n_conns); + assert(0 == engine->mini_conns_count); + if (engine->pr_queue) + prq_destroy(engine->pr_queue); + if (engine->purga) + lsquic_purga_destroy(engine->purga); attq_destroy(engine->attq); assert(0 == lsquic_mh_count(&engine->conns_out)); assert(0 == lsquic_mh_count(&engine->conns_tickable)); + if (engine->pub.enp_shi == &stock_shi) + stock_shared_hash_destroy(engine->pub.enp_shi_ctx); lsquic_mm_cleanup(&engine->pub.enp_mm); free(engine->conns_tickable.mh_elems); +#ifndef NDEBUG + if (engine->flags & ENG_LOSE_PACKETS) + regfree(&engine->lose_packets_re); +#endif + lsquic_hash_destroy(engine->suspended_sni_heads); + if (engine->pub.enp_tokgen) + lsquic_tg_destroy(engine->pub.enp_tokgen); #if LSQUIC_CONN_STATS if (engine->stats_fh) { @@ -666,6 +1441,8 @@ lsquic_engine_destroy (lsquic_engine_t *engine) fprintf(engine->stats_fh, "Out:\n"); fprintf(engine->stats_fh, " Total bytes: %lu\n", stats->out.bytes); fprintf(engine->stats_fh, " packets: %lu\n", stats->out.packets); + fprintf(engine->stats_fh, " acked via loss record: %lu\n", stats->out.acked_via_loss); + fprintf(engine->stats_fh, " acks: %lu\n", stats->out.acks); fprintf(engine->stats_fh, " retx packets: %lu\n", stats->out.retx_packets); fprintf(engine->stats_fh, " STREAM frame count: %lu\n", stats->out.stream_frames); fprintf(engine->stats_fh, " STREAM payload size: %lu\n", stats->out.stream_data_sz); @@ -676,8 +1453,57 @@ lsquic_engine_destroy (lsquic_engine_t *engine) : 0); fprintf(engine->stats_fh, " ACKs: %lu\n", stats->out.acks); } -#endif - free(engine); +#endif + if (engine->pub.enp_srst_hash) + lsquic_hash_destroy(engine->pub.enp_srst_hash); +#if LSQUIC_COUNT_ENGINE_CALLS + LSQ_NOTICE("number of calls into the engine: %lu", engine->n_engine_calls); +#endif + free(engine); +} + + +static struct conn_cid_elem * +find_free_cce (struct lsquic_conn *conn) +{ + struct conn_cid_elem *cce; + + for (cce = conn->cn_cces; cce < END_OF_CCES(conn); ++cce) + if (!(conn->cn_cces_mask & (1 << (cce - conn->cn_cces)))) + return cce; + + return NULL; +} + + +static int +add_conn_to_hash (struct lsquic_engine *engine, struct lsquic_conn *conn, + const struct sockaddr *local_sa, void *peer_ctx) +{ + struct conn_cid_elem *cce; + + if (engine->flags & ENG_CONNS_BY_ADDR) + { + cce = find_free_cce(conn); + if (!cce) + { + LSQ_ERROR("cannot find free CCE"); + return -1; + } + cce->cce_port = sa2port(local_sa); + cce->cce_flags = CCE_PORT; + if (lsquic_hash_insert(engine->conns_hash, &cce->cce_port, + sizeof(cce->cce_port), conn, &cce->cce_hash_el)) + { + conn->cn_cces_mask |= 1 << (cce - conn->cn_cces); + return 0; + } + else + return -1; + + } + else + return insert_conn_into_hash(engine, conn, peer_ctx); } @@ -686,9 +1512,13 @@ lsquic_engine_connect (lsquic_engine_t *engine, const struct sockaddr *local_sa, const struct sockaddr *peer_sa, void *peer_ctx, lsquic_conn_ctx_t *conn_ctx, const char *hostname, unsigned short max_packet_size, - const unsigned char *zero_rtt, size_t zero_rtt_len) + const unsigned char *zero_rtt, size_t zero_rtt_len, + const unsigned char *token, size_t token_sz) { lsquic_conn_t *conn; + unsigned flags; + int is_ipv4; + ENGINE_IN(engine); if (engine->flags & ENG_SERVER) @@ -697,38 +1527,38 @@ lsquic_engine_connect (lsquic_engine_t *engine, const struct sockaddr *local_sa, goto err; } - if (conn_hash_using_addr(&engine->conns_hash) - && conn_hash_find_by_addr(&engine->conns_hash, local_sa)) + if (engine->flags & ENG_CONNS_BY_ADDR + && find_conn_by_addr(engine->conns_hash, local_sa)) { LSQ_ERROR("cannot have more than one connection on the same port"); goto err; } - if (0 == max_packet_size) - { - switch (peer_sa->sa_family) - { - case AF_INET: - max_packet_size = QUIC_MAX_IPv4_PACKET_SZ; - break; - default: - max_packet_size = QUIC_MAX_IPv6_PACKET_SZ; - break; - } - } - - conn = new_full_conn_client(engine, hostname, max_packet_size, - zero_rtt, zero_rtt_len); + if (0 != maybe_grow_conn_heaps(engine)) + return NULL; + flags = engine->flags & (ENG_SERVER|ENG_HTTP); + is_ipv4 = peer_sa->sa_family == AF_INET; + if (engine->pub.enp_settings.es_versions & LSQUIC_IETF_VERSIONS) + conn = lsquic_ietf_full_conn_client_new(&engine->pub, + flags, hostname, max_packet_size, + is_ipv4, zero_rtt, zero_rtt_len, token, token_sz); + else + conn = lsquic_gquic_full_conn_client_new(&engine->pub, flags, + hostname, max_packet_size, is_ipv4, + zero_rtt, zero_rtt_len); if (!conn) goto err; - EV_LOG_CREATE_CONN(conn->cn_cid, local_sa, peer_sa); - EV_LOG_VER_NEG(conn->cn_cid, "proposed", lsquic_ver2str[conn->cn_version]); - lsquic_conn_record_sockaddr(conn, local_sa, peer_sa); - if (0 != conn_hash_add(&engine->conns_hash, conn)) - { - LSQ_WARN("cannot add connection %"PRIu64" to hash - destroy", - conn->cn_cid); - destroy_conn(engine, conn); + EV_LOG_CREATE_CONN(lsquic_conn_log_cid(conn), local_sa, peer_sa); + EV_LOG_VER_NEG(lsquic_conn_log_cid(conn), "proposed", + lsquic_ver2str[conn->cn_version]); + ++engine->n_conns; + lsquic_conn_record_sockaddr(conn, peer_ctx, local_sa, peer_sa); + if (0 != add_conn_to_hash(engine, conn, local_sa, peer_ctx)) + { + const lsquic_cid_t *cid = lsquic_conn_log_cid(conn); + LSQ_WARNC("cannot add connection %"CID_FMT" to hash - destroy", + CID_BITS(cid)); + destroy_conn(engine, conn, lsquic_time_now()); goto err; } assert(!(conn->cn_flags & @@ -739,9 +1569,8 @@ lsquic_engine_connect (lsquic_engine_t *engine, const struct sockaddr *local_sa, conn->cn_flags |= LSCONN_HASHED; lsquic_mh_insert(&engine->conns_tickable, conn, conn->cn_last_ticked); engine_incref_conn(conn, LSCONN_TICKABLE); - conn->cn_peer_ctx = peer_ctx; lsquic_conn_set_ctx(conn, conn_ctx); - full_conn_client_call_on_new(conn); + conn->cn_if->ci_client_call_on_new(conn); end: ENGINE_OUT(engine); return conn; @@ -754,7 +1583,7 @@ lsquic_engine_connect (lsquic_engine_t *engine, const struct sockaddr *local_sa, static void remove_conn_from_hash (lsquic_engine_t *engine, lsquic_conn_t *conn) { - conn_hash_remove(&engine->conns_hash, conn); + remove_all_cces_from_hash(engine->conns_hash, conn); (void) engine_decref_conn(engine, conn, LSCONN_HASHED); } @@ -775,11 +1604,13 @@ refflags2str (enum lsquic_conn_flags flags, char s[6]) static void engine_incref_conn (lsquic_conn_t *conn, enum lsquic_conn_flags flag) { + const lsquic_cid_t *cid; char str[2][7]; assert(flag & CONN_REF_FLAGS); assert(!(conn->cn_flags & flag)); conn->cn_flags |= flag; - LSQ_DEBUG("incref conn %"PRIu64", '%s' -> '%s'", conn->cn_cid, + cid = lsquic_conn_log_cid(conn); + LSQ_DEBUGC("incref conn %"CID_FMT", '%s' -> '%s'", CID_BITS(cid), (refflags2str(conn->cn_flags & ~flag, str[0]), str[0]), (refflags2str(conn->cn_flags, str[1]), str[1])); } @@ -789,7 +1620,9 @@ static lsquic_conn_t * engine_decref_conn (lsquic_engine_t *engine, lsquic_conn_t *conn, enum lsquic_conn_flags flags) { + const lsquic_cid_t *cid; char str[2][7]; + lsquic_time_t now; assert(flags & CONN_REF_FLAGS); assert(conn->cn_flags & flags); #ifndef NDEBUG @@ -797,13 +1630,18 @@ engine_decref_conn (lsquic_engine_t *engine, lsquic_conn_t *conn, assert(0 == (conn->cn_flags & LSCONN_HASHED)); #endif conn->cn_flags &= ~flags; - LSQ_DEBUG("decref conn %"PRIu64", '%s' -> '%s'", conn->cn_cid, + cid = lsquic_conn_log_cid(conn); + LSQ_DEBUGC("decref conn %"CID_FMT", '%s' -> '%s'", CID_BITS(cid), (refflags2str(conn->cn_flags | flags, str[0]), str[0]), (refflags2str(conn->cn_flags, str[1]), str[1])); if (0 == (conn->cn_flags & CONN_REF_FLAGS)) { - eng_hist_inc(&engine->history, 0, sl_del_full_conns); - destroy_conn(engine, conn); + now = lsquic_time_now(); + if (conn->cn_flags & LSCONN_MINI) + eng_hist_inc(&engine->history, now, sl_del_mini_conns); + else + eng_hist_inc(&engine->history, now, sl_del_full_conns); + destroy_conn(engine, conn, now); return NULL; } else @@ -840,7 +1678,17 @@ conn_iter_next_tickable (struct lsquic_engine *engine) { lsquic_conn_t *conn; - conn = lsquic_mh_pop(&engine->conns_tickable); + if (engine->flags & ENG_SERVER) + while (1) + { + conn = lsquic_mh_pop(&engine->conns_tickable); + if (conn && (conn->cn_flags & LSCONN_SKIP_ON_PROC)) + (void) engine_decref_conn(engine, conn, LSCONN_TICKABLE); + else + break; + } + else + conn = lsquic_mh_pop(&engine->conns_tickable); if (conn) conn = engine_decref_conn(engine, conn, LSCONN_TICKABLE); @@ -854,117 +1702,100 @@ conn_iter_next_tickable (struct lsquic_engine *engine) } -void -lsquic_engine_process_conns (lsquic_engine_t *engine) +static void +cub_init (struct cid_update_batch *cub, lsquic_cids_update_f update, + void *update_ctx) { - lsquic_conn_t *conn; - lsquic_time_t now; - - ENGINE_IN(engine); - - now = lsquic_time_now(); - while ((conn = attq_pop(engine->attq, now))) - { - conn = engine_decref_conn(engine, conn, LSCONN_ATTQ); - if (conn && !(conn->cn_flags & LSCONN_TICKABLE)) - { - lsquic_mh_insert(&engine->conns_tickable, conn, conn->cn_last_ticked); - engine_incref_conn(conn, LSCONN_TICKABLE); - } - } - - process_connections(engine, conn_iter_next_tickable, now); - ENGINE_OUT(engine); + cub->cub_update_cids = update; + cub->cub_update_ctx = update_ctx; + cub->cub_count = 0; } -static ssize_t -really_encrypt_packet (const lsquic_conn_t *conn, - struct lsquic_packet_out *packet_out, - unsigned char *buf, size_t bufsz) +static void +cub_flush (struct cid_update_batch *cub) { - int header_sz, is_hello_packet; - enum enc_level enc_level; - size_t packet_sz; - unsigned char header_buf[QUIC_MAX_PUBHDR_SZ]; + if (cub->cub_count > 0 && cub->cub_update_cids) + cub->cub_update_cids(cub->cub_update_ctx, cub->cub_peer_ctxs, + cub->cub_cids, cub->cub_count); + cub->cub_count = 0; +} - header_sz = conn->cn_pf->pf_gen_reg_pkt_header(conn, packet_out, - header_buf, sizeof(header_buf)); - if (header_sz < 0) - return -1; - is_hello_packet = !!(packet_out->po_flags & PO_HELLO); - enc_level = conn->cn_esf->esf_encrypt(conn->cn_enc_session, - conn->cn_version, 0, - packet_out->po_packno, header_buf, header_sz, - packet_out->po_data, packet_out->po_data_sz, - buf, bufsz, &packet_sz, is_hello_packet); - if ((int) enc_level >= 0) - { - lsquic_packet_out_set_enc_level(packet_out, enc_level); - LSQ_DEBUG("encrypted packet %"PRIu64"; plaintext is %zu bytes, " - "ciphertext is %zd bytes", - packet_out->po_packno, - conn->cn_pf->pf_packout_header_size(conn, packet_out->po_flags) + - packet_out->po_data_sz, - packet_sz); - return packet_sz; - } - else - return -1; +static void +cub_add (struct cid_update_batch *cub, const lsquic_cid_t *cid, void *peer_ctx) +{ + cub->cub_cids [ cub->cub_count ] = *cid; + cub->cub_peer_ctxs[ cub->cub_count ] = peer_ctx; + ++cub->cub_count; + if (cub->cub_count == sizeof(cub->cub_cids) / sizeof(cub->cub_cids[0])) + cub_flush(cub); } -static int -conn_peer_ipv6 (const struct lsquic_conn *conn) +/* Process registered CIDs */ +static void +cub_add_cids_from_cces (struct cid_update_batch *cub, struct lsquic_conn *conn) { - return AF_INET6 == conn->cn_peer_addr_u.sa.sa_family; + struct cce_cid_iter citer; + struct conn_cid_elem *cce; + void *peer_ctx; + + peer_ctx = lsquic_conn_get_peer_ctx(conn, NULL); + for (cce = cce_iter_first(&citer, conn); cce; cce = cce_iter_next(&citer)) + if (cce->cce_flags & CCE_REG) + cub_add(cub, &cce->cce_cid, peer_ctx); } -static enum { ENCPA_OK, ENCPA_NOMEM, ENCPA_BADCRYPT, } -encrypt_packet (lsquic_engine_t *engine, const lsquic_conn_t *conn, - lsquic_packet_out_t *packet_out) +static void +drop_all_mini_conns (lsquic_engine_t *engine) { - ssize_t enc_sz; - size_t bufsz; - unsigned sent_sz; - unsigned char *buf; - int ipv6; + struct lsquic_hash_elem *el; + lsquic_conn_t *conn; + struct cid_update_batch cub; - bufsz = conn->cn_pf->pf_packout_header_size(conn, packet_out->po_flags) + - packet_out->po_data_sz + QUIC_PACKET_HASH_SZ; - if (bufsz > USHRT_MAX) - return ENCPA_BADCRYPT; /* To cause connection to close */ - ipv6 = conn_peer_ipv6(conn); - buf = engine->pub.enp_pmi->pmi_allocate(engine->pub.enp_pmi_ctx, - conn->cn_peer_ctx, bufsz, ipv6); - if (!buf) - { - LSQ_DEBUG("could not allocate memory for outgoing packet of size %zd", - bufsz); - return ENCPA_NOMEM; - } + cub_init(&cub, engine->report_old_scids, engine->scids_ctx); + for (el = lsquic_hash_first(engine->conns_hash); el; + el = lsquic_hash_next(engine->conns_hash)) { - enc_sz = really_encrypt_packet(conn, packet_out, buf, bufsz); - sent_sz = enc_sz; + conn = lsquic_hashelem_getdata(el); + if (conn->cn_flags & LSCONN_MINI) + { + /* If promoted, why is it still in this hash? */ + assert(!(conn->cn_flags & LSCONN_PROMOTED)); + if (!(conn->cn_flags & LSCONN_PROMOTED)) + cub_add_cids_from_cces(&cub, conn); + remove_conn_from_hash(engine, conn); + } } - if (enc_sz < 0) + cub_flush(&cub); +} + + +void +lsquic_engine_process_conns (lsquic_engine_t *engine) +{ + lsquic_conn_t *conn; + lsquic_time_t now; + + ENGINE_IN(engine); + + now = lsquic_time_now(); + while ((conn = attq_pop(engine->attq, now))) { - engine->pub.enp_pmi->pmi_return(engine->pub.enp_pmi_ctx, - conn->cn_peer_ctx, buf, ipv6); - return ENCPA_BADCRYPT; + conn = engine_decref_conn(engine, conn, LSCONN_ATTQ); + if (conn && !(conn->cn_flags & LSCONN_TICKABLE)) + { + lsquic_mh_insert(&engine->conns_tickable, conn, conn->cn_last_ticked); + engine_incref_conn(conn, LSCONN_TICKABLE); + } } - packet_out->po_enc_data = buf; - packet_out->po_enc_data_sz = enc_sz; - packet_out->po_sent_sz = sent_sz; - packet_out->po_flags &= ~PO_IPv6; - packet_out->po_flags |= PO_ENCRYPTED|PO_SENT_SZ|(ipv6 << POIPv6_SHIFT); - - return ENCPA_OK; + process_connections(engine, conn_iter_next_tickable, now); + ENGINE_OUT(engine); } @@ -973,7 +1804,7 @@ release_or_return_enc_data (struct lsquic_engine *engine, void (*pmi_rel_or_ret) (void *, void *, void *, char), struct lsquic_conn *conn, struct lsquic_packet_out *packet_out) { - pmi_rel_or_ret(engine->pub.enp_pmi_ctx, conn->cn_peer_ctx, + pmi_rel_or_ret(engine->pub.enp_pmi_ctx, packet_out->po_path->np_peer_ctx, packet_out->po_enc_data, lsquic_packet_out_ipv6(packet_out)); packet_out->po_flags &= ~PO_ENCRYPTED; packet_out->po_enc_data = NULL; @@ -998,6 +1829,48 @@ return_enc_data (struct lsquic_engine *engine, struct lsquic_conn *conn, } +static int +copy_packet (struct lsquic_engine *engine, struct lsquic_conn *conn, + struct lsquic_packet_out *packet_out) +{ + int ipv6; + + ipv6 = NP_IS_IPv6(packet_out->po_path); + if (packet_out->po_flags & PO_ENCRYPTED) + { + if (ipv6 == lsquic_packet_out_ipv6(packet_out) + && packet_out->po_data_sz == packet_out->po_enc_data_sz + && 0 == memcmp(packet_out->po_data, packet_out->po_enc_data, + packet_out->po_data_sz)) + return 0; + if (ipv6 == lsquic_packet_out_ipv6(packet_out) + && packet_out->po_data_sz <= packet_out->po_enc_data_sz) + goto copy; + return_enc_data(engine, conn, packet_out); + } + + packet_out->po_enc_data = engine->pub.enp_pmi->pmi_allocate( + engine->pub.enp_pmi_ctx, packet_out->po_path->np_peer_ctx, + packet_out->po_data_sz, ipv6); + if (!packet_out->po_enc_data) + { + LSQ_DEBUG("could not allocate memory for outgoing unencrypted packet " + "of size %hu", packet_out->po_data_sz); + return -1; + } + + copy: + memcpy(packet_out->po_enc_data, packet_out->po_data, + packet_out->po_data_sz); + packet_out->po_enc_data_sz = packet_out->po_data_sz; + packet_out->po_sent_sz = packet_out->po_data_sz; + packet_out->po_flags &= ~PO_IPv6; + packet_out->po_flags |= PO_ENCRYPTED|PO_SENT_SZ|(ipv6 << POIPv6_SHIFT); + + return 0; +} + + STAILQ_HEAD(conns_stailq, lsquic_conn); TAILQ_HEAD(conns_tailq, lsquic_conn); @@ -1005,6 +1878,7 @@ TAILQ_HEAD(conns_tailq, lsquic_conn); struct conns_out_iter { struct min_heap *coi_heap; + struct pr_queue *coi_prq; TAILQ_HEAD(, lsquic_conn) coi_active_list, coi_inactive_list; lsquic_conn_t *coi_next; @@ -1018,6 +1892,7 @@ static void coi_init (struct conns_out_iter *iter, struct lsquic_engine *engine) { iter->coi_heap = &engine->conns_out; + iter->coi_prq = engine->pr_queue; iter->coi_next = NULL; TAILQ_INIT(&iter->coi_active_list); TAILQ_INIT(&iter->coi_inactive_list); @@ -1044,8 +1919,13 @@ coi_next (struct conns_out_iter *iter) #endif return conn; } + else if (iter->coi_prq && (conn = prq_next_conn(iter->coi_prq))) + { + return conn; + } else if (!TAILQ_EMPTY(&iter->coi_active_list)) { + iter->coi_prq = NULL; /* Save function call in previous conditional */ conn = iter->coi_next; if (!conn) conn = TAILQ_FIRST(&iter->coi_active_list); @@ -1102,17 +1982,69 @@ coi_reheap (struct conns_out_iter *iter, lsquic_engine_t *engine) } +#ifndef NDEBUG +static void +lose_matching_packets (const lsquic_engine_t *engine, struct out_batch *batch, + unsigned n) +{ + const lsquic_cid_t *cid; + struct iovec *iov; + unsigned i; + char packno_str[22]; + + for (i = 0; i < n; ++i) + { + snprintf(packno_str, sizeof(packno_str), "%"PRIu64, + batch->packets[i]->po_packno); + if (0 == regexec(&engine->lose_packets_re, packno_str, 0, NULL, 0)) + { + for (iov = batch->outs[i].iov; iov < + batch->outs[i].iov + batch->outs[i].iovlen; ++iov) + batch->outs[i].iov->iov_len -= 1; + cid = lsquic_conn_log_cid(batch->conns[i]); + LSQ_WARNC("losing packet %s for connection %"CID_FMT, packno_str, + CID_BITS(cid)); + } + } +} + + +#endif + + +#ifdef NDEBUG +#define CONST_BATCH const +#else +#define CONST_BATCH +#endif + static unsigned send_batch (lsquic_engine_t *engine, struct conns_out_iter *conns_iter, - struct out_batch *batch, unsigned n_to_send) + CONST_BATCH struct out_batch *batch, unsigned n_to_send) { int n_sent, i; lsquic_time_t now; + unsigned off; + size_t count; + struct lsquic_packet_out *CONST_BATCH *packet_out, *CONST_BATCH *end; +#ifndef NDEBUG + if (engine->flags & ENG_LOSE_PACKETS) + lose_matching_packets(engine, batch, n_to_send); +#endif /* Set sent time before the write to avoid underestimating RTT */ now = lsquic_time_now(); for (i = 0; i < (int) n_to_send; ++i) - batch->packets[i]->po_sent = now; + { + off = batch->pack_off[i]; + count = batch->outs[i].iovlen; + assert(count > 0); + packet_out = &batch->packets[off]; + end = packet_out + count; + do + (*packet_out)->po_sent = now; + while (++packet_out < end); + } n_sent = engine->packets_out(engine->packets_out_ctx, batch->outs, n_to_send); if (n_sent < (int) n_to_send) @@ -1134,29 +2066,62 @@ send_batch (lsquic_engine_t *engine, struct conns_out_iter *conns_iter, for (i = 0; i < n_sent; ++i) { eng_hist_inc(&engine->history, now, sl_packets_out); - EV_LOG_PACKET_SENT(batch->conns[i]->cn_cid, batch->packets[i]); - batch->conns[i]->cn_if->ci_packet_sent(batch->conns[i], - batch->packets[i]); /* `i' is added to maintain relative order */ batch->conns[i]->cn_last_sent = now + i; - /* Release packet out buffer as soon as the packet is sent - * successfully. If not successfully sent, we hold on to - * this buffer until the packet sending is attempted again - * or until it times out and regenerated. - */ - if (batch->packets[i]->po_flags & PO_ENCRYPTED) - release_enc_data(engine, batch->conns[i], batch->packets[i]); + + off = batch->pack_off[i]; + count = batch->outs[i].iovlen; + assert(count > 0); + packet_out = &batch->packets[off]; + end = packet_out + count; + do + { +#if LOG_PACKET_CHECKSUM + log_packet_checksum(lsquic_conn_log_cid(batch->conns[i]), "out", + batch->outs[i].iov[packet_out - &batch->packets[off]].iov_base, + batch->outs[i].iov[packet_out - &batch->packets[off]].iov_len); +#endif + EV_LOG_PACKET_SENT(lsquic_conn_log_cid(batch->conns[i]), + *packet_out); + /* Release packet out buffer as soon as the packet is sent + * successfully. If not successfully sent, we hold on to + * this buffer until the packet sending is attempted again + * or until it times out and regenerated. + */ + if ((*packet_out)->po_flags & PO_ENCRYPTED) + release_enc_data(engine, batch->conns[i], *packet_out); + batch->conns[i]->cn_if->ci_packet_sent(batch->conns[i], + *packet_out); + } + while (++packet_out < end); } if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) for ( ; i < (int) n_to_send; ++i) - EV_LOG_PACKET_NOT_SENT(batch->conns[i]->cn_cid, batch->packets[i]); + { + off = batch->pack_off[i]; + count = batch->outs[i].iovlen; + assert(count > 0); + packet_out = &batch->packets[off]; + end = packet_out + count; + do + EV_LOG_PACKET_NOT_SENT(lsquic_conn_log_cid(batch->conns[i]), + *packet_out); + while (++packet_out < end); + } /* Return packets to the connection in reverse order so that the packet * ordering is maintained. */ for (i = (int) n_to_send - 1; i >= n_sent; --i) { - batch->conns[i]->cn_if->ci_packet_not_sent(batch->conns[i], - batch->packets[i]); + off = batch->pack_off[i]; + count = batch->outs[i].iovlen; + assert(count > 0); + packet_out = &batch->packets[off + count - 1]; + end = &batch->packets[off - 1]; + do + batch->conns[i]->cn_if->ci_packet_not_sent(batch->conns[i], + *packet_out); + while (--packet_out > end); if (!(batch->conns[i]->cn_flags & (LSCONN_COI_ACTIVE|LSCONN_EVANESCENT))) coi_reactivate(conns_iter, batch->conns[i]); } @@ -1181,15 +2146,38 @@ check_deadline (lsquic_engine_t *engine) } +static size_t +iov_size (const struct iovec *iov, const struct iovec *const end) +{ + size_t size; + + assert(iov < end); + + size = 0; + do + size += iov->iov_len; + while (++iov < end); + + return size; +} + + +/* XXX A lot of extra setup -- two extra arguments to this function, two extra + * connection ref flags and queues -- is just to handle the ENCPA_BADCRYPT case, + * which never really happens. + */ static void send_packets_out (struct lsquic_engine *engine, struct conns_tailq *ticked_conns, struct conns_stailq *closed_conns) { + const lsquic_cid_t *cid; unsigned n, w, n_sent, n_batches_sent; lsquic_packet_out_t *packet_out; + struct lsquic_packet_out **packet; lsquic_conn_t *conn; struct out_batch *const batch = &engine->out_batch; + struct iovec *iov, *packet_iov; struct conns_out_iter conns_iter; int shrink, deadline_exceeded; @@ -1198,27 +2186,28 @@ send_packets_out (struct lsquic_engine *engine, n_sent = 0, n = 0; shrink = 0; deadline_exceeded = 0; + iov = batch->iov; + packet = batch->packets; while ((conn = coi_next(&conns_iter))) { - packet_out = conn->cn_if->ci_next_packet_to_send(conn); + cid = lsquic_conn_log_cid(conn); + packet_out = conn->cn_if->ci_next_packet_to_send(conn, 0); if (!packet_out) { - LSQ_DEBUG("batched all outgoing packets for conn %"PRIu64, - conn->cn_cid); + /* Evanescent connection always has a packet to send: */ + assert(!(conn->cn_flags & LSCONN_EVANESCENT)); + LSQ_DEBUGC("batched all outgoing packets for %s conn %"CID_FMT, + (conn->cn_flags & LSCONN_MINI ? "mini" : + "full"), CID_BITS(cid)); coi_deactivate(&conns_iter, conn); continue; } - if ((packet_out->po_flags & PO_ENCRYPTED) - && lsquic_packet_out_ipv6(packet_out) != conn_peer_ipv6(conn)) - { - /* Peer address changed since the packet was encrypted. Need to - * reallocate. - */ - return_enc_data(engine, conn, packet_out); - } + batch->outs[n].iov = packet_iov = iov; + next_coa: if (!(packet_out->po_flags & (PO_ENCRYPTED|PO_NOENCRYPT))) { - switch (encrypt_packet(engine, conn, packet_out)) + switch (conn->cn_esf_c->esf_encrypt_packet(conn->cn_enc_session, + &engine->pub, conn, packet_out)) { case ENCPA_NOMEM: /* Send what we have and wait for a more opportune moment */ @@ -1227,7 +2216,8 @@ send_packets_out (struct lsquic_engine *engine, case ENCPA_BADCRYPT: /* This is pretty bad: close connection immediately */ conn->cn_if->ci_packet_not_sent(conn, packet_out); - LSQ_INFO("conn %"PRIu64" has unsendable packets", conn->cn_cid); + LSQ_INFOC("conn %"CID_FMT" has unsendable packets", + CID_BITS(cid)); if (!(conn->cn_flags & LSCONN_EVANESCENT)) { if (!(conn->cn_flags & LSCONN_CLOSING)) @@ -1249,29 +2239,62 @@ send_packets_out (struct lsquic_engine *engine, break; } } - LSQ_DEBUG("batched packet %"PRIu64" for connection %"PRIu64, - packet_out->po_packno, conn->cn_cid); - assert(conn->cn_flags & LSCONN_HAS_PEER_SA); + else if ((packet_out->po_flags & PO_NOENCRYPT) + && engine->pub.enp_pmi != &stock_pmi) + { + if (0 != copy_packet(engine, conn, packet_out)) + { + /* Copy can only fail if packet could not be allocated */ + conn->cn_if->ci_packet_not_sent(conn, packet_out); + goto end_for; + } + } + LSQ_DEBUGC("batched packet %"PRIu64" for connection %"CID_FMT, + packet_out->po_packno, CID_BITS(cid)); if (packet_out->po_flags & PO_ENCRYPTED) { - batch->outs[n].buf = packet_out->po_enc_data; - batch->outs[n].sz = packet_out->po_enc_data_sz; + iov->iov_base = packet_out->po_enc_data; + iov->iov_len = packet_out->po_enc_data_sz; } else { - batch->outs[n].buf = packet_out->po_data; - batch->outs[n].sz = packet_out->po_data_sz; + iov->iov_base = packet_out->po_data; + iov->iov_len = packet_out->po_data_sz; + } + if (packet_iov == iov) + { + batch->pack_off[n] = packet - batch->packets; + batch->outs [n].ecn = lsquic_packet_out_ecn(packet_out); + batch->outs [n].peer_ctx = packet_out->po_path->np_peer_ctx; + batch->outs [n].local_sa = NP_LOCAL_SA(packet_out->po_path); + batch->outs [n].dest_sa = NP_PEER_SA(packet_out->po_path); + batch->conns [n] = conn; + } + *packet = packet_out; + ++packet; + ++iov; + if ((conn->cn_flags & LSCONN_IETF) + && ((1 << packet_out->po_header_type) + & ((1 << HETY_INITIAL)|(1 << HETY_HANDSHAKE)|(1 << HETY_0RTT))) +#ifndef NDEBUG + && (engine->flags & ENG_COALESCE) +#endif + && iov < batch->iov + sizeof(batch->iov) / sizeof(batch->iov[0])) + { + const size_t size = iov_size(packet_iov, iov); + packet_out = conn->cn_if->ci_next_packet_to_send(conn, size); + if (packet_out) + goto next_coa; } - batch->outs [n].peer_ctx = conn->cn_peer_ctx; - batch->outs [n].local_sa = (struct sockaddr *) conn->cn_local_addr; - batch->outs [n].dest_sa = (struct sockaddr *) conn->cn_peer_addr; - batch->conns [n] = conn; - batch->packets[n] = packet_out; + batch->outs [n].iovlen = iov - packet_iov; ++n; - if (n == engine->batch_size) + if (n == engine->batch_size + || iov >= batch->iov + sizeof(batch->iov) / sizeof(batch->iov[0])) { + w = send_batch(engine, &conns_iter, batch, n); n = 0; - w = send_batch(engine, &conns_iter, batch, engine->batch_size); + iov = batch->iov; + packet = batch->packets; ++n_batches_sent; n_sent += w; if (w < engine->batch_size) @@ -1292,13 +2315,16 @@ send_packets_out (struct lsquic_engine *engine, n_sent += w; shrink = w < n; ++n_batches_sent; - deadline_exceeded = check_deadline(engine); } if (shrink) shrink_batch_size(engine); - else if (n_batches_sent > 1 && !deadline_exceeded) - grow_batch_size(engine); + else if (n_batches_sent > 1) + { + deadline_exceeded = check_deadline(engine); + if (!deadline_exceeded) + grow_batch_size(engine); + } coi_reheap(&conns_iter, engine); @@ -1310,6 +2336,7 @@ int lsquic_engine_has_unsent_packets (lsquic_engine_t *engine) { return lsquic_mh_count(&engine->conns_out) > 0 + || (engine->pr_queue && prq_have_pending(engine->pr_queue)) ; } @@ -1329,7 +2356,10 @@ lsquic_engine_send_unsent_packets (lsquic_engine_t *engine) lsquic_conn_t *conn; struct conns_stailq closed_conns; struct conns_tailq ticked_conns = TAILQ_HEAD_INITIALIZER(ticked_conns); + struct cid_update_batch cub; + ENGINE_IN(engine); + cub_init(&cub, engine->report_old_scids, engine->scids_ctx); STAILQ_INIT(&closed_conns); reset_deadline(engine, lsquic_time_now()); if (!(engine->pub.enp_flags & ENPUB_CAN_SEND)) @@ -1343,9 +2373,25 @@ lsquic_engine_send_unsent_packets (lsquic_engine_t *engine) while ((conn = STAILQ_FIRST(&closed_conns))) { STAILQ_REMOVE_HEAD(&closed_conns, cn_next_closed_conn); + if ((conn->cn_flags & (LSCONN_MINI|LSCONN_PROMOTED)) == LSCONN_MINI) + cub_add_cids_from_cces(&cub, conn); (void) engine_decref_conn(engine, conn, LSCONN_CLOSING); } + cub_flush(&cub); + ENGINE_OUT(engine); +} + + +static lsquic_conn_t * +next_new_full_conn (struct conns_stailq *new_full_conns) +{ + lsquic_conn_t *conn; + + conn = STAILQ_FIRST(new_full_conns); + if (conn) + STAILQ_REMOVE_HEAD(new_full_conns, cn_next_new_full); + return conn; } @@ -1359,12 +2405,17 @@ process_connections (lsquic_engine_t *engine, conn_iter_f next_conn, lsquic_time_t next_tick_time; struct conns_stailq closed_conns; struct conns_tailq ticked_conns; + struct conns_stailq new_full_conns; + struct cid_update_batch cub_old, cub_live; + cub_init(&cub_old, engine->report_old_scids, engine->scids_ctx); + cub_init(&cub_live, engine->report_live_scids, engine->scids_ctx); eng_hist_tick(&engine->history, now); STAILQ_INIT(&closed_conns); TAILQ_INIT(&ticked_conns); reset_deadline(engine, now); + STAILQ_INIT(&new_full_conns); if (!(engine->pub.enp_flags & ENPUB_CAN_SEND) && now > engine->resume_sending_at) @@ -1377,10 +2428,26 @@ process_connections (lsquic_engine_t *engine, conn_iter_f next_conn, i = 0; while ((conn = next_conn(engine)) - ) + || (conn = next_new_full_conn(&new_full_conns))) { tick_st = conn->cn_if->ci_tick(conn, now); conn->cn_last_ticked = now + i /* Maintain relative order */ ++; + if (tick_st & TICK_PROMOTE) + { + lsquic_conn_t *new_conn; + EV_LOG_CONN_EVENT(lsquic_conn_log_cid(conn), + "scheduled for promotion"); + assert(conn->cn_flags & LSCONN_MINI); + new_conn = new_full_conn_server(engine, conn, now); + if (new_conn) + { + STAILQ_INSERT_TAIL(&new_full_conns, new_conn, cn_next_new_full); + new_conn->cn_last_sent = engine->last_sent; + eng_hist_inc(&engine->history, now, sl_new_full_conns); + } + tick_st |= TICK_CLOSE; /* Destroy mini connection */ + conn->cn_flags |= LSCONN_PROMOTED; + } if (tick_st & TICK_SEND) { if (!(conn->cn_flags & LSCONN_HAS_OUTGOING)) @@ -1400,6 +2467,9 @@ process_connections (lsquic_engine_t *engine, conn_iter_f next_conn, { TAILQ_INSERT_TAIL(&ticked_conns, conn, cn_next_ticked); engine_incref_conn(conn, LSCONN_TICKED); + if ((engine->flags & ENG_SERVER) && conn->cn_if->ci_report_live + && conn->cn_if->ci_report_live(conn, now)) + cub_add_cids_from_cces(&cub_live, conn); } } @@ -1409,6 +2479,8 @@ process_connections (lsquic_engine_t *engine, conn_iter_f next_conn, while ((conn = STAILQ_FIRST(&closed_conns))) { STAILQ_REMOVE_HEAD(&closed_conns, cn_next_closed_conn); + if ((conn->cn_flags & (LSCONN_MINI|LSCONN_PROMOTED)) == LSCONN_MINI) + cub_add_cids_from_cces(&cub_old, conn); (void) engine_decref_conn(engine, conn, LSCONN_CLOSING); } @@ -1438,6 +2510,9 @@ process_connections (lsquic_engine_t *engine, conn_iter_f next_conn, } } + cub_flush(&engine->new_scids); + cub_flush(&cub_live); + cub_flush(&cub_old); } @@ -1448,57 +2523,79 @@ int lsquic_engine_packet_in (lsquic_engine_t *engine, const unsigned char *packet_in_data, size_t packet_in_size, const struct sockaddr *sa_local, const struct sockaddr *sa_peer, - void *peer_ctx) + void *peer_ctx, int ecn) { + const unsigned char *const packet_end = packet_in_data + packet_in_size; struct packin_parse_state ppstate; lsquic_packet_in_t *packet_in; int (*parse_packet_in_begin) (struct lsquic_packet_in *, size_t length, - int is_server, struct packin_parse_state *); + int is_server, unsigned cid_len, struct packin_parse_state *); + unsigned n_zeroes; + int s; - if (packet_in_size > QUIC_MAX_PACKET_SZ) - { - LSQ_DEBUG("Cannot handle packet_in_size(%zd) > %d packet incoming " - "packet's header", packet_in_size, QUIC_MAX_PACKET_SZ); - errno = E2BIG; - return -1; - } + ENGINE_CALLS_INCR(engine); - if (conn_hash_using_addr(&engine->conns_hash)) + if (engine->flags & ENG_SERVER) + parse_packet_in_begin = lsquic_parse_packet_in_server_begin; + else + if (engine->flags & ENG_CONNS_BY_ADDR) { + struct lsquic_hash_elem *el; const struct lsquic_conn *conn; - conn = conn_hash_find_by_addr(&engine->conns_hash, sa_local); - if (!conn) + el = find_conn_by_addr(engine->conns_hash, sa_local); + if (!el) return -1; + conn = lsquic_hashelem_getdata(el); if ((1 << conn->cn_version) & LSQUIC_GQUIC_HEADER_VERSIONS) parse_packet_in_begin = lsquic_gquic_parse_packet_in_begin; + else if ((1 << conn->cn_version) & LSQUIC_IETF_VERSIONS) + parse_packet_in_begin = lsquic_ietf_v1_parse_packet_in_begin; else - parse_packet_in_begin = lsquic_iquic_parse_packet_in_begin; + { + assert(conn->cn_version == LSQVER_046 +#if LSQUIC_USE_Q098 + || conn->cn_version == LSQVER_098 +#endif + + ); + parse_packet_in_begin = lsquic_Q046_parse_packet_in_begin; + } } else parse_packet_in_begin = lsquic_parse_packet_in_begin; - packet_in = lsquic_mm_get_packet_in(&engine->pub.enp_mm); - if (!packet_in) - return -1; - - /* Library does not modify packet_in_data, it is not referenced after - * this function returns and subsequent release of pi_data is guarded - * by PI_OWN_DATA flag. - */ - packet_in->pi_data = (unsigned char *) packet_in_data; - if (0 != parse_packet_in_begin(packet_in, packet_in_size, - engine->flags & ENG_SERVER, &ppstate)) + n_zeroes = 0; + do { - LSQ_DEBUG("Cannot parse incoming packet's header"); - lsquic_mm_put_packet_in(&engine->pub.enp_mm, packet_in); - errno = EINVAL; - return -1; - } + packet_in = lsquic_mm_get_packet_in(&engine->pub.enp_mm); + if (!packet_in) + return -1; + /* Library does not modify packet_in_data, it is not referenced after + * this function returns and subsequent release of pi_data is guarded + * by PI_OWN_DATA flag. + */ + packet_in->pi_data = (unsigned char *) packet_in_data; + if (0 != parse_packet_in_begin(packet_in, packet_end - packet_in_data, + engine->flags & ENG_SERVER, + engine->pub.enp_settings.es_scid_len, &ppstate)) + { + LSQ_DEBUG("Cannot parse incoming packet's header"); + lsquic_mm_put_packet_in(&engine->pub.enp_mm, packet_in); + errno = EINVAL; + return -1; + } - packet_in->pi_received = lsquic_time_now(); - eng_hist_inc(&engine->history, packet_in->pi_received, sl_packets_in); - return process_packet_in(engine, packet_in, &ppstate, sa_local, sa_peer, + packet_in_data += packet_in->pi_data_sz; + packet_in->pi_received = lsquic_time_now(); + packet_in->pi_flags |= (3 & ecn) << PIBIT_ECN_SHIFT; + eng_hist_inc(&engine->history, packet_in->pi_received, sl_packets_in); + s = process_packet_in(engine, packet_in, &ppstate, sa_local, sa_peer, peer_ctx); + n_zeroes += s == 0; + } + while (0 == s && packet_in_data < packet_end); + + return n_zeroes > 0 ? 0 : s; } @@ -1512,14 +2609,41 @@ lsquic_engine_quic_versions (const lsquic_engine_t *engine) } +void +lsquic_engine_cooldown (lsquic_engine_t *engine) +{ + struct lsquic_hash_elem *el; + lsquic_conn_t *conn; + + if (engine->flags & ENG_COOLDOWN) + /* AFAICT, there is no harm in calling this function more than once, + * but log it just in case, as it may indicate an error in the caller. + */ + LSQ_INFO("cooldown called again"); + engine->flags |= ENG_COOLDOWN; + LSQ_INFO("entering cooldown mode"); + if (engine->flags & ENG_SERVER) + drop_all_mini_conns(engine); + for (el = lsquic_hash_first(engine->conns_hash); el; + el = lsquic_hash_next(engine->conns_hash)) + { + conn = lsquic_hashelem_getdata(el); + lsquic_conn_going_away(conn); + } +} + + int lsquic_engine_earliest_adv_tick (lsquic_engine_t *engine, int *diff) { const lsquic_time_t *next_attq_time; lsquic_time_t now, next_time; + ENGINE_CALLS_INCR(engine); + if (((engine->flags & ENG_PAST_DEADLINE) && lsquic_mh_count(&engine->conns_out)) + || (engine->pr_queue && prq_have_pending(engine->pr_queue)) || lsquic_mh_count(&engine->conns_tickable)) { *diff = 0; @@ -1552,6 +2676,7 @@ unsigned lsquic_engine_count_attq (lsquic_engine_t *engine, int from_now) { lsquic_time_t now; + ENGINE_CALLS_INCR(engine); now = lsquic_time_now(); if (from_now < 0) now -= from_now; @@ -1561,3 +2686,58 @@ lsquic_engine_count_attq (lsquic_engine_t *engine, int from_now) } +int +lsquic_engine_add_cid (struct lsquic_engine_public *enpub, + struct lsquic_conn *conn, unsigned cce_idx) +{ + struct lsquic_engine *const engine = (struct lsquic_engine *) enpub; + struct conn_cid_elem *const cce = &conn->cn_cces[cce_idx]; + void *peer_ctx; + + assert(cce_idx < conn->cn_n_cces); + assert(conn->cn_cces_mask & (1 << cce_idx)); + assert(!(cce->cce_hash_el.qhe_flags & QHE_HASHED)); + + if (lsquic_hash_insert(engine->conns_hash, cce->cce_cid.idbuf, + cce->cce_cid.len, conn, &cce->cce_hash_el)) + { + LSQ_DEBUGC("add %"CID_FMT" to the list of SCIDs", + CID_BITS(&cce->cce_cid)); + peer_ctx = lsquic_conn_get_peer_ctx(conn, NULL); + cce->cce_flags |= CCE_REG; + cub_add(&engine->new_scids, &cce->cce_cid, peer_ctx); + return 0; + } + else + { + LSQ_WARNC("could not add new cid %"CID_FMT" to the SCID hash", + CID_BITS(&cce->cce_cid)); + return -1; + } +} + + +void +lsquic_engine_retire_cid (struct lsquic_engine_public *enpub, + struct lsquic_conn *conn, unsigned cce_idx, lsquic_time_t now) +{ + struct lsquic_engine *const engine = (struct lsquic_engine *) enpub; + struct conn_cid_elem *const cce = &conn->cn_cces[cce_idx]; + void *peer_ctx; + + assert(cce_idx < conn->cn_n_cces); + + if (cce->cce_hash_el.qhe_flags & QHE_HASHED) + lsquic_hash_erase(engine->conns_hash, &cce->cce_hash_el); + + if (engine->purga) + { + peer_ctx = lsquic_conn_get_peer_ctx(conn, NULL); + lsquic_purga_add(engine->purga, &cce->cce_cid, peer_ctx, + PUTY_CID_RETIRED, now); + } + conn->cn_cces_mask &= ~(1u << cce_idx); + LSQ_DEBUGC("retire CID %"CID_FMT, CID_BITS(&cce->cce_cid)); +} + + diff --git a/src/liblsquic/lsquic_engine_public.h b/src/liblsquic/lsquic_engine_public.h index ea091482e..101c11ac8 100644 --- a/src/liblsquic/lsquic_engine_public.h +++ b/src/liblsquic/lsquic_engine_public.h @@ -2,6 +2,9 @@ /* * lsquic_engine_public.h -- Engine's "public interface" * + * This structure is used to bundle things in engine that connections + * need. This way, the space per mini connection is one pointer instead + * of several. */ #ifndef LSQUIC_ENGINE_PUBLIC_H @@ -10,10 +13,32 @@ struct lsquic_conn; struct lsquic_engine; struct stack_st_X509; +struct lsquic_hash; +struct lsquic_stream_if; +struct ssl_ctx_st; + +enum warning_type +{ + WT_ACKPARSE_MINI, + WT_ACKPARSE_FULL, + N_WARNING_TYPES, +}; + +#define WARNING_INTERVAL (24ULL * 3600ULL * 1000000ULL) struct lsquic_engine_public { struct lsquic_mm enp_mm; struct lsquic_engine_settings enp_settings; + struct token_generator *enp_tokgen; + lsquic_lookup_cert_f enp_lookup_cert; + void *enp_cert_lu_ctx; + struct ssl_ctx_st * (*enp_get_ssl_ctx)(void *peer_ctx); + const struct lsquic_shared_hash_if + *enp_shi; + void *enp_shi_ctx; + lsquic_time_t enp_last_warning[N_WARNING_TYPES]; + const struct lsquic_stream_if *enp_stream_if; + void *enp_stream_if_ctx; const struct lsquic_hset_if *enp_hsi_if; void *enp_hsi_ctx; int (*enp_verify_cert)(void *verify_ctx, @@ -22,13 +47,18 @@ struct lsquic_engine_public { const struct lsquic_packout_mem_if *enp_pmi; void *enp_pmi_ctx; + const struct lsquic_keylog_if *enp_kli; + void *enp_kli_ctx; struct lsquic_engine *enp_engine; + struct lsquic_hash *enp_srst_hash; enum { ENPUB_PROC = (1 << 0), /* Being processed by one of the user-facing * functions. */ ENPUB_CAN_SEND = (1 << 1), } enp_flags; + unsigned char enp_ver_tags_buf[ sizeof(lsquic_ver_tag_t) * N_LSQVER ]; + unsigned enp_ver_tags_len; }; /* Put connection onto the Tickable Queue if it is not already on it. If @@ -44,4 +74,16 @@ void lsquic_engine_add_conn_to_attq (struct lsquic_engine_public *enpub, lsquic_conn_t *, lsquic_time_t); +void +lsquic_engine_retire_cid (struct lsquic_engine_public *, + struct lsquic_conn *, unsigned cce_idx, lsquic_time_t now); + +int +lsquic_engine_add_cid (struct lsquic_engine_public *, + struct lsquic_conn *, unsigned cce_idx); + +struct lsquic_conn * +lsquic_engine_find_conn (const struct lsquic_engine_public *pub, + const lsquic_cid_t *cid); + #endif diff --git a/src/liblsquic/lsquic_ev_log.c b/src/liblsquic/lsquic_ev_log.c index edc071f20..9ff8868e4 100644 --- a/src/liblsquic/lsquic_ev_log.c +++ b/src/liblsquic/lsquic_ev_log.c @@ -14,14 +14,21 @@ #include "lsquic_types.h" #include "lsquic_int_types.h" #include "lsquic_packet_common.h" +#include "lsquic_packet_gquic.h" #include "lsquic_packet_in.h" #include "lsquic_packet_out.h" #include "lsquic_parse.h" #include "lsquic_frame_common.h" #include "lsquic_headers.h" #include "lsquic_str.h" -#include "lsquic_handshake.h" +#include "lsquic_frame_reader.h" +#include "lsquic_enc_sess.h" #include "lsquic_ev_log.h" +#include "lsquic_sizes.h" +#include "lsquic_trans_params.h" +#include "lsquic_util.h" +#include "lsquic_hash.h" +#include "lsquic_conn.h" #define LSQUIC_LOGGER_MODULE LSQLM_EVENT #include "lsquic_logger.h" @@ -39,24 +46,41 @@ /* VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV */ void -lsquic_ev_log_packet_in (lsquic_cid_t cid, const lsquic_packet_in_t *packet_in) +lsquic_ev_log_packet_in (const lsquic_cid_t *cid, + const lsquic_packet_in_t *packet_in) { switch (packet_in->pi_flags & ( + PI_FROM_MINI| PI_GQUIC)) { + case PI_FROM_MINI|PI_GQUIC: + LCID("packet in: %"PRIu64" (from mini)", packet_in->pi_packno); + break; + case PI_FROM_MINI: + LCID("packet in: %"PRIu64" (from mini), type: %s, ecn: %u", + packet_in->pi_packno, lsquic_hety2str[packet_in->pi_header_type], + lsquic_packet_in_ecn(packet_in)); + break; case PI_GQUIC: - LCID("packet in: %"PRIu64, packet_in->pi_packno); + LCID("packet in: %"PRIu64", size: %u", packet_in->pi_packno, + (unsigned) (packet_in->pi_data_sz + GQUIC_PACKET_HASH_SZ)); break; default: - LCID("packet in: %"PRIu64", type: %s", - packet_in->pi_packno, lsquic_hety2str[packet_in->pi_header_type]); + LCID("packet in: %"PRIu64", type: %s, size: %u; ecn: %u, spin: %d; " + "path: %hhu", + packet_in->pi_packno, lsquic_hety2str[packet_in->pi_header_type], + (unsigned) (packet_in->pi_data_sz + IQUIC_TAG_LEN), + lsquic_packet_in_ecn(packet_in), + /* spin bit value is only valid for short packet headers */ + lsquic_packet_in_spin_bit(packet_in), packet_in->pi_path_id); break; } } void -lsquic_ev_log_ack_frame_in (lsquic_cid_t cid, const struct ack_info *acki) +lsquic_ev_log_ack_frame_in (const lsquic_cid_t *cid, + const struct ack_info *acki) { size_t sz; char *buf; @@ -70,81 +94,101 @@ lsquic_ev_log_ack_frame_in (lsquic_cid_t cid, const struct ack_info *acki) void -lsquic_ev_log_stream_frame_in (lsquic_cid_t cid, +lsquic_ev_log_stream_frame_in (const lsquic_cid_t *cid, const struct stream_frame *frame) { - LCID("STREAM frame in: stream %u; offset %"PRIu64"; size %"PRIu16 + LCID("STREAM frame in: stream %"PRIu64"; offset %"PRIu64"; size %"PRIu16 "; fin: %d", frame->stream_id, frame->data_frame.df_offset, frame->data_frame.df_size, (int) frame->data_frame.df_fin); } void -lsquic_ev_log_stop_waiting_frame_in (lsquic_cid_t cid, lsquic_packno_t least) +lsquic_ev_log_crypto_frame_in (const lsquic_cid_t *cid, + const struct stream_frame *frame, unsigned enc_level) +{ + LCID("CRYPTO frame in: level %u; offset %"PRIu64"; size %"PRIu16, + enc_level, frame->data_frame.df_offset, frame->data_frame.df_size); +} + + +void +lsquic_ev_log_stop_waiting_frame_in (const lsquic_cid_t *cid, + lsquic_packno_t least) { LCID("STOP_WAITING frame in: least unacked packno %"PRIu64, least); } void -lsquic_ev_log_window_update_frame_in (lsquic_cid_t cid, uint32_t stream_id, - uint64_t offset) +lsquic_ev_log_window_update_frame_in (const lsquic_cid_t *cid, + lsquic_stream_id_t stream_id, uint64_t offset) { - LCID("WINDOW_UPDATE frame in: stream %"PRIu32"; offset %"PRIu64, + LCID("WINDOW_UPDATE frame in: stream %"PRIu64"; offset %"PRIu64, stream_id, offset); } void -lsquic_ev_log_blocked_frame_in (lsquic_cid_t cid, uint32_t stream_id) +lsquic_ev_log_blocked_frame_in (const lsquic_cid_t *cid, + lsquic_stream_id_t stream_id) { - LCID("BLOCKED frame in: stream %"PRIu32, stream_id); + LCID("BLOCKED frame in: stream %"PRIu64, stream_id); } void -lsquic_ev_log_connection_close_frame_in (lsquic_cid_t cid, - uint32_t error_code, int reason_len, const char *reason) +lsquic_ev_log_connection_close_frame_in (const lsquic_cid_t *cid, + uint64_t error_code, int reason_len, const char *reason) { - LCID("CONNECTION_CLOSE frame in: error code %"PRIu32", reason: %.*s", + LCID("CONNECTION_CLOSE frame in: error code %"PRIu64", reason: %.*s", error_code, reason_len, reason); } void -lsquic_ev_log_goaway_frame_in (lsquic_cid_t cid, uint32_t error_code, - uint32_t stream_id, int reason_len, const char *reason) +lsquic_ev_log_goaway_frame_in (const lsquic_cid_t *cid, uint32_t error_code, + lsquic_stream_id_t stream_id, int reason_len, const char *reason) { - LCID("GOAWAY frame in: error code %"PRIu32", stream %"PRIu32 + LCID("GOAWAY frame in: error code %"PRIu32", stream %"PRIu64 ", reason: %.*s", error_code, stream_id, reason_len, reason); } void -lsquic_ev_log_rst_stream_frame_in (lsquic_cid_t cid, uint32_t stream_id, - uint64_t offset, uint32_t error_code) +lsquic_ev_log_rst_stream_frame_in (const lsquic_cid_t *cid, + lsquic_stream_id_t stream_id, uint64_t offset, uint64_t error_code) { - LCID("RST_STREAM frame in: error code %"PRIu32", stream %"PRIu32 + LCID("RST_STREAM frame in: error code %"PRIu64", stream %"PRIu64 ", offset: %"PRIu64, error_code, stream_id, offset); } void -lsquic_ev_log_padding_frame_in (lsquic_cid_t cid, size_t len) +lsquic_ev_log_stop_sending_frame_in (const lsquic_cid_t *cid, + lsquic_stream_id_t stream_id, uint64_t error_code) +{ + LCID("STOP_SENDING frame in: error code %"PRIu64", stream %"PRIu64, + error_code, stream_id); +} + + +void +lsquic_ev_log_padding_frame_in (const lsquic_cid_t *cid, size_t len) { LCID("PADDING frame in of %zd bytes", len); } void -lsquic_ev_log_ping_frame_in (lsquic_cid_t cid) +lsquic_ev_log_ping_frame_in (const lsquic_cid_t *cid) { LCID("PING frame in"); } void -lsquic_ev_log_packet_created (lsquic_cid_t cid, +lsquic_ev_log_packet_created (const lsquic_cid_t *cid, const struct lsquic_packet_out *packet_out) { LCID("created packet %"PRIu64"; flags: version=%d, nonce=%d, conn_id=%d", @@ -156,16 +200,18 @@ lsquic_ev_log_packet_created (lsquic_cid_t cid, void -lsquic_ev_log_packet_sent (lsquic_cid_t cid, +lsquic_ev_log_packet_sent (const lsquic_cid_t *cid, const struct lsquic_packet_out *packet_out) { char frames[lsquic_frame_types_str_sz]; if (lsquic_packet_out_verneg(packet_out)) LCID("sent version negotiation packet, size %hu", packet_out->po_data_sz); + else if (lsquic_packet_out_retry(packet_out)) + LCID("sent stateless retry packet, size %hu", packet_out->po_data_sz); else if (lsquic_packet_out_pubres(packet_out)) LCID("sent public reset packet, size %hu", packet_out->po_data_sz); - else if (packet_out->po_flags & PO_GQUIC) + else if (packet_out->po_lflags & POL_GQUIC) LCID("sent packet %"PRIu64", size %hu, frame types: %s", packet_out->po_packno, packet_out->po_enc_data_sz, /* Frame types is a list of different frames types contained @@ -176,7 +222,7 @@ lsquic_ev_log_packet_sent (lsquic_cid_t cid, packet_out->po_frame_types)); else LCID("sent packet %"PRIu64", type %s, crypto: %s, size %hu, frame " - "types: %s", + "types: %s, ecn: %u, spin: %d; kp: %u, path: %hhu", packet_out->po_packno, lsquic_hety2str[packet_out->po_header_type], lsquic_enclev2str[ lsquic_packet_out_enc_level(packet_out) ], packet_out->po_enc_data_sz, @@ -185,12 +231,17 @@ lsquic_ev_log_packet_sent (lsquic_cid_t cid, * printed. */ lsquic_frame_types_to_str(frames, sizeof(frames), - packet_out->po_frame_types)); + packet_out->po_frame_types), + lsquic_packet_out_ecn(packet_out), + /* spin bit value is only valid for short packet headers */ + lsquic_packet_out_spin_bit(packet_out), + lsquic_packet_out_kp(packet_out), + packet_out->po_path->np_path_id); } void -lsquic_ev_log_packet_not_sent (lsquic_cid_t cid, +lsquic_ev_log_packet_not_sent (const lsquic_cid_t *cid, const struct lsquic_packet_out *packet_out) { char frames[lsquic_frame_types_str_sz]; @@ -205,17 +256,17 @@ lsquic_ev_log_packet_not_sent (lsquic_cid_t cid, void -lsquic_ev_log_http_headers_in (lsquic_cid_t cid, int is_server, +lsquic_ev_log_http_headers_in (const lsquic_cid_t *cid, int is_server, const struct uncompressed_headers *uh) { const struct http1x_headers *h1h; const char *cr, *p; if (uh->uh_flags & UH_PP) - LCID("read push promise; stream %"PRIu32", promised stream %"PRIu32, + LCID("read push promise; stream %"PRIu64", promised stream %"PRIu64, uh->uh_stream_id, uh->uh_oth_stream_id); else - LCID("read %s headers; stream: %"PRIu32", depends on stream: %"PRIu32 + LCID("read %s headers; stream: %"PRIu64", depends on stream: %"PRIu64 ", weight: %hu, exclusive: %d, fin: %d", is_server ? "request" : "response", uh->uh_stream_id, uh->uh_oth_stream_id, uh->uh_weight, @@ -237,7 +288,7 @@ lsquic_ev_log_http_headers_in (lsquic_cid_t cid, int is_server, void -lsquic_ev_log_action_stream_frame (lsquic_cid_t cid, +lsquic_ev_log_action_stream_frame (const lsquic_cid_t *cid, const struct parse_funcs *pf, const unsigned char *buf, size_t bufsz, const char *what) { @@ -246,7 +297,7 @@ lsquic_ev_log_action_stream_frame (lsquic_cid_t cid, len = pf->pf_parse_stream_frame(buf, bufsz, &frame); if (len > 0) - LCID("%s STREAM frame: stream %"PRIu32", offset: %"PRIu64 + LCID("%s STREAM frame: stream %"PRIu64", offset: %"PRIu64 ", size: %"PRIu16", fin: %d", what, frame.stream_id, frame.data_frame.df_offset, frame.data_frame.df_size, frame.data_frame.df_fin); @@ -256,15 +307,33 @@ lsquic_ev_log_action_stream_frame (lsquic_cid_t cid, void -lsquic_ev_log_generated_ack_frame (lsquic_cid_t cid, const struct parse_funcs *pf, - const unsigned char *ack_buf, size_t ack_buf_sz) +lsquic_ev_log_generated_crypto_frame (const lsquic_cid_t *cid, + const struct parse_funcs *pf, const unsigned char *buf, size_t bufsz) +{ + struct stream_frame frame; + int len; + + len = pf->pf_parse_crypto_frame(buf, bufsz, &frame); + if (len > 0) + LCID("generated CRYPTO frame: offset: %"PRIu64", size: %"PRIu16, + frame.data_frame.df_offset, frame.data_frame.df_size); + else + LSQ_LOG2(LSQ_LOG_WARN, "cannot parse CRYPTO frame"); +} + + +void +lsquic_ev_log_generated_ack_frame (const lsquic_cid_t *cid, + const struct parse_funcs *pf, const unsigned char *ack_buf, + size_t ack_buf_sz) { struct ack_info acki; size_t sz; char *buf; int len; - len = pf->pf_parse_ack_frame(ack_buf, ack_buf_sz, &acki); + len = pf->pf_parse_ack_frame(ack_buf, ack_buf_sz, &acki, + TP_DEF_ACK_DELAY_EXP); if (len < 0) { LSQ_LOG2(LSQ_LOG_WARN, "cannot parse ACK frame"); @@ -280,7 +349,98 @@ lsquic_ev_log_generated_ack_frame (lsquic_cid_t cid, const struct parse_funcs *p void -lsquic_ev_log_generated_stop_waiting_frame (lsquic_cid_t cid, +lsquic_ev_log_generated_new_token_frame (const lsquic_cid_t *cid, + const struct parse_funcs *pf, const unsigned char *frame_buf, + size_t frame_buf_sz) +{ + const unsigned char *token; + size_t sz; + char *buf; + int len; + + len = pf->pf_parse_new_token_frame(frame_buf, frame_buf_sz, &token, &sz); + if (len < 0) + { + LSQ_LOG2(LSQ_LOG_WARN, "cannot parse NEW_TOKEN frame"); + return; + } + + buf = malloc(sz * 2 + 1); + if (buf) + { + lsquic_hexstr(token, sz, buf, sz * 2 + 1); + LCID("generated NEW_TOKEN frame: %s", buf); + free(buf); + } +} + + +void +lsquic_ev_log_generated_path_chal_frame (const lsquic_cid_t *cid, + const struct parse_funcs *pf, const unsigned char *frame_buf, + size_t frame_buf_sz) +{ + uint64_t chal; + int len; + char hexbuf[sizeof(chal) * 2 + 1]; + + len = pf->pf_parse_path_chal_frame(frame_buf, frame_buf_sz, &chal); + if (len > 0) + LCID("generated PATH_CHALLENGE(%s) frame", + HEXSTR((unsigned char *) &chal, sizeof(chal), hexbuf)); + else + LSQ_LOG2(LSQ_LOG_WARN, "cannot parse PATH_CHALLENGE frame"); +} + + +void +lsquic_ev_log_generated_path_resp_frame (const lsquic_cid_t *cid, + const struct parse_funcs *pf, const unsigned char *frame_buf, + size_t frame_buf_sz) +{ + uint64_t resp; + int len; + char hexbuf[sizeof(resp) * 2 + 1]; + + len = pf->pf_parse_path_resp_frame(frame_buf, frame_buf_sz, &resp); + if (len > 0) + LCID("generated PATH_RESPONSE(%s) frame", + HEXSTR((unsigned char *) &resp, sizeof(resp), hexbuf)); + else + LSQ_LOG2(LSQ_LOG_WARN, "cannot parse PATH_RESPONSE frame"); +} + + +void +lsquic_ev_log_generated_new_connection_id_frame (const lsquic_cid_t *cid, + const struct parse_funcs *pf, const unsigned char *frame_buf, + size_t frame_buf_sz) +{ + const unsigned char *token; + lsquic_cid_t new_cid; + uint64_t seqno, retire_prior_to; + int len; + char token_buf[IQUIC_SRESET_TOKEN_SZ * 2 + 1]; + char cid_buf[MAX_CID_LEN * 2 + 1]; + + len = pf->pf_parse_new_conn_id(frame_buf, frame_buf_sz, &seqno, + &retire_prior_to, &new_cid, &token); + if (len < 0) + { + LSQ_LOG2(LSQ_LOG_WARN, "cannot parse NEW_CONNECTION_ID frame"); + return; + } + + lsquic_hexstr(new_cid.idbuf, new_cid.len, cid_buf, sizeof(cid_buf)); + lsquic_hexstr(token, IQUIC_SRESET_TOKEN_SZ, token_buf, sizeof(token_buf)); + LCID("generated NEW_CONNECTION_ID frame: seqno: %"PRIu64"; retire prior " + "to: %"PRIu64"; cid: %s; token: %s", seqno, retire_prior_to, + cid_buf, token_buf); +} + + +void +lsquic_ev_log_generated_stop_waiting_frame (const lsquic_cid_t *cid, lsquic_packno_t lunack) { LCID("generated STOP_WAITING frame; least unacked: %"PRIu64, lunack); @@ -288,16 +448,26 @@ lsquic_ev_log_generated_stop_waiting_frame (lsquic_cid_t cid, void -lsquic_ev_log_generated_http_headers (lsquic_cid_t cid, uint32_t stream_id, +lsquic_ev_log_generated_stop_sending_frame (const lsquic_cid_t *cid, + lsquic_stream_id_t stream_id, uint16_t error_code) +{ + LCID("generated STOP_SENDING frame; stream ID: %"PRIu64"; error code: " + "%"PRIu16, stream_id, error_code); +} + + +void +lsquic_ev_log_generated_http_headers (const lsquic_cid_t *cid, + lsquic_stream_id_t stream_id, int is_server, const struct http_prio_frame *prio_frame, const struct lsquic_http_headers *headers) { - uint32_t dep_stream_id; + lsquic_stream_id_t dep_stream_id; int exclusive, i; unsigned short weight; if (is_server) - LCID("generated HTTP response HEADERS for stream %"PRIu32, stream_id); + LCID("generated HTTP response HEADERS for stream %"PRIu64, stream_id); else { memcpy(&dep_stream_id, prio_frame->hpf_stream_id, 4); @@ -305,8 +475,8 @@ lsquic_ev_log_generated_http_headers (lsquic_cid_t cid, uint32_t stream_id, exclusive = dep_stream_id >> 31; dep_stream_id &= ~(1 << 31); weight = prio_frame->hpf_weight + 1; - LCID("generated HTTP request HEADERS for stream %"PRIu32 - ", dep stream: %"PRIu32", weight: %hu, exclusive: %d", stream_id, + LCID("generated HTTP request HEADERS for stream %"PRIu64 + ", dep stream: %"PRIu64", weight: %hu, exclusive: %d", stream_id, dep_stream_id, weight, exclusive); } @@ -320,15 +490,15 @@ lsquic_ev_log_generated_http_headers (lsquic_cid_t cid, uint32_t stream_id, void -lsquic_ev_log_generated_http_push_promise (lsquic_cid_t cid, - uint32_t stream_id, uint32_t promised_stream_id, - const struct lsquic_http_headers *headers, - const struct lsquic_http_headers *extra_headers) +lsquic_ev_log_generated_http_push_promise (const lsquic_cid_t *cid, + lsquic_stream_id_t stream_id, lsquic_stream_id_t promised_stream_id, + const struct lsquic_http_headers *headers, + const struct lsquic_http_headers *extra_headers) { int i; - LCID("generated HTTP PUSH_PROMISE for stream %"PRIu32"; promised stream %" - PRIu32, stream_id, promised_stream_id); + LCID("generated HTTP PUSH_PROMISE for stream %"PRIu64"; promised stream %" + PRIu64, stream_id, promised_stream_id); for (i = 0; i < headers->count; ++i) LCID(" %.*s: %.*s", @@ -346,9 +516,8 @@ lsquic_ev_log_generated_http_push_promise (lsquic_cid_t cid, (char *) extra_headers->headers[i].value.iov_base); } - void -lsquic_ev_log_create_connection (lsquic_cid_t cid, +lsquic_ev_log_create_connection (const lsquic_cid_t *cid, const struct sockaddr *local_sa, const struct sockaddr *peer_sa) { @@ -357,21 +526,21 @@ lsquic_ev_log_create_connection (lsquic_cid_t cid, void -lsquic_ev_log_hsk_completed (lsquic_cid_t cid) +lsquic_ev_log_hsk_completed (const lsquic_cid_t *cid) { LCID("handshake completed"); } void -lsquic_ev_log_zero_rtt (lsquic_cid_t cid) +lsquic_ev_log_zero_rtt (const lsquic_cid_t *cid) { LCID("zero_rtt successful"); } void -lsquic_ev_log_check_certs (lsquic_cid_t cid, const lsquic_str_t **certs, +lsquic_ev_log_check_certs (const lsquic_cid_t *cid, const lsquic_str_t **certs, size_t count) { LCID("check certs"); @@ -379,7 +548,7 @@ lsquic_ev_log_check_certs (lsquic_cid_t cid, const lsquic_str_t **certs, void -lsquic_ev_log_version_negotiation (lsquic_cid_t cid, +lsquic_ev_log_version_negotiation (const lsquic_cid_t *cid, const char *action, const char *ver) { LCID("version negotiation: %s version %s", action, ver); diff --git a/src/liblsquic/lsquic_ev_log.h b/src/liblsquic/lsquic_ev_log.h index e173a2bd9..3135904fc 100644 --- a/src/liblsquic/lsquic_ev_log.h +++ b/src/liblsquic/lsquic_ev_log.h @@ -32,7 +32,7 @@ struct uncompressed_headers; } while (0) void -lsquic_ev_log_packet_in (lsquic_cid_t, const struct lsquic_packet_in *); +lsquic_ev_log_packet_in (const lsquic_cid_t *, const struct lsquic_packet_in *); #define EV_LOG_PACKET_IN(...) do { \ if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ @@ -40,7 +40,7 @@ lsquic_ev_log_packet_in (lsquic_cid_t, const struct lsquic_packet_in *); } while (0) void -lsquic_ev_log_ack_frame_in (lsquic_cid_t, const struct ack_info *); +lsquic_ev_log_ack_frame_in (const lsquic_cid_t *, const struct ack_info *); #define EV_LOG_ACK_FRAME_IN(...) do { \ if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ @@ -48,7 +48,8 @@ lsquic_ev_log_ack_frame_in (lsquic_cid_t, const struct ack_info *); } while (0) void -lsquic_ev_log_stream_frame_in (lsquic_cid_t, const struct stream_frame *); +lsquic_ev_log_stream_frame_in (const lsquic_cid_t *, + const struct stream_frame *); #define EV_LOG_STREAM_FRAME_IN(...) do { \ if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ @@ -56,7 +57,16 @@ lsquic_ev_log_stream_frame_in (lsquic_cid_t, const struct stream_frame *); } while (0) void -lsquic_ev_log_window_update_frame_in (lsquic_cid_t, uint32_t stream_id, +lsquic_ev_log_crypto_frame_in (const lsquic_cid_t *, + const struct stream_frame *, unsigned enc_level); + +#define EV_LOG_CRYPTO_FRAME_IN(...) do { \ + if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ + lsquic_ev_log_crypto_frame_in(__VA_ARGS__); \ +} while (0) + +void +lsquic_ev_log_window_update_frame_in (const lsquic_cid_t *, lsquic_stream_id_t, uint64_t offset); #define EV_LOG_WINDOW_UPDATE_FRAME_IN(...) do { \ @@ -65,7 +75,7 @@ lsquic_ev_log_window_update_frame_in (lsquic_cid_t, uint32_t stream_id, } while (0) void -lsquic_ev_log_blocked_frame_in (lsquic_cid_t, uint32_t stream_id); +lsquic_ev_log_blocked_frame_in (const lsquic_cid_t *, lsquic_stream_id_t); #define EV_LOG_BLOCKED_FRAME_IN(...) do { \ if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ @@ -73,7 +83,7 @@ lsquic_ev_log_blocked_frame_in (lsquic_cid_t, uint32_t stream_id); } while (0) void -lsquic_ev_log_stop_waiting_frame_in (lsquic_cid_t, lsquic_packno_t); +lsquic_ev_log_stop_waiting_frame_in (const lsquic_cid_t *, lsquic_packno_t); #define EV_LOG_STOP_WAITING_FRAME_IN(...) do { \ if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ @@ -81,8 +91,8 @@ lsquic_ev_log_stop_waiting_frame_in (lsquic_cid_t, lsquic_packno_t); } while (0) void -lsquic_ev_log_connection_close_frame_in (lsquic_cid_t, uint32_t error_code, - int reason_len, const char *reason); +lsquic_ev_log_connection_close_frame_in (const lsquic_cid_t *, + uint64_t error_code, int reason_len, const char *reason); #define EV_LOG_CONNECTION_CLOSE_FRAME_IN(...) do { \ if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ @@ -90,8 +100,8 @@ lsquic_ev_log_connection_close_frame_in (lsquic_cid_t, uint32_t error_code, } while (0) void -lsquic_ev_log_goaway_frame_in (lsquic_cid_t, uint32_t error_code, - uint32_t stream_id, int reason_len, const char *reason); +lsquic_ev_log_goaway_frame_in (const lsquic_cid_t *, uint32_t error_code, + lsquic_stream_id_t, int reason_len, const char *reason); #define EV_LOG_GOAWAY_FRAME_IN(...) do { \ if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ @@ -99,8 +109,8 @@ lsquic_ev_log_goaway_frame_in (lsquic_cid_t, uint32_t error_code, } while (0) void -lsquic_ev_log_rst_stream_frame_in (lsquic_cid_t, uint32_t stream_id, - uint64_t offset, uint32_t error_code); +lsquic_ev_log_rst_stream_frame_in (const lsquic_cid_t *, lsquic_stream_id_t, + uint64_t offset, uint64_t error_code); #define EV_LOG_RST_STREAM_FRAME_IN(...) do { \ if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ @@ -108,7 +118,16 @@ lsquic_ev_log_rst_stream_frame_in (lsquic_cid_t, uint32_t stream_id, } while (0) void -lsquic_ev_log_padding_frame_in (lsquic_cid_t, size_t len); +lsquic_ev_log_stop_sending_frame_in (const lsquic_cid_t *,lsquic_stream_id_t, + uint64_t error_code); + +#define EV_LOG_STOP_SENDING_FRAME_IN(...) do { \ + if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ + lsquic_ev_log_stop_sending_frame_in(__VA_ARGS__); \ +} while (0) + +void +lsquic_ev_log_padding_frame_in (const lsquic_cid_t *, size_t len); #define EV_LOG_PADDING_FRAME_IN(...) do { \ if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ @@ -116,7 +135,7 @@ lsquic_ev_log_padding_frame_in (lsquic_cid_t, size_t len); } while (0) void -lsquic_ev_log_ping_frame_in (lsquic_cid_t); +lsquic_ev_log_ping_frame_in (const lsquic_cid_t *); #define EV_LOG_PING_FRAME_IN(...) do { \ if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ @@ -124,7 +143,8 @@ lsquic_ev_log_ping_frame_in (lsquic_cid_t); } while (0) void -lsquic_ev_log_packet_created (lsquic_cid_t, const struct lsquic_packet_out *); +lsquic_ev_log_packet_created (const lsquic_cid_t *, + const struct lsquic_packet_out *); #define EV_LOG_PACKET_CREATED(...) do { \ if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ @@ -132,7 +152,8 @@ lsquic_ev_log_packet_created (lsquic_cid_t, const struct lsquic_packet_out *); } while (0) void -lsquic_ev_log_packet_sent (lsquic_cid_t, const struct lsquic_packet_out *); +lsquic_ev_log_packet_sent (const lsquic_cid_t *, + const struct lsquic_packet_out *); #define EV_LOG_PACKET_SENT(...) do { \ if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ @@ -140,7 +161,8 @@ lsquic_ev_log_packet_sent (lsquic_cid_t, const struct lsquic_packet_out *); } while (0) void -lsquic_ev_log_packet_not_sent (lsquic_cid_t, const struct lsquic_packet_out *); +lsquic_ev_log_packet_not_sent (const lsquic_cid_t *, + const struct lsquic_packet_out *); #define EV_LOG_PACKET_NOT_SENT(...) do { \ if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ @@ -148,7 +170,7 @@ lsquic_ev_log_packet_not_sent (lsquic_cid_t, const struct lsquic_packet_out *); } while (0) void -lsquic_ev_log_http_headers_in (lsquic_cid_t, int is_server, +lsquic_ev_log_http_headers_in (const lsquic_cid_t *, int is_server, const struct uncompressed_headers *); #define EV_LOG_HTTP_HEADERS_IN(...) do { \ @@ -157,7 +179,8 @@ lsquic_ev_log_http_headers_in (lsquic_cid_t, int is_server, } while (0) void -lsquic_ev_log_action_stream_frame (lsquic_cid_t, const struct parse_funcs *pf, +lsquic_ev_log_action_stream_frame (const lsquic_cid_t *, + const struct parse_funcs *pf, const unsigned char *, size_t len, const char *action); #define EV_LOG_GENERATED_STREAM_FRAME(...) do { \ @@ -171,8 +194,18 @@ lsquic_ev_log_action_stream_frame (lsquic_cid_t, const struct parse_funcs *pf, } while (0) void -lsquic_ev_log_generated_ack_frame (lsquic_cid_t, const struct parse_funcs *, - const unsigned char *, size_t len); +lsquic_ev_log_generated_crypto_frame (const lsquic_cid_t *, + const struct parse_funcs *pf, + const unsigned char *, size_t len); + +#define EV_LOG_GENERATED_CRYPTO_FRAME(...) do { \ + if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ + lsquic_ev_log_generated_crypto_frame(__VA_ARGS__); \ +} while (0) + +void +lsquic_ev_log_generated_ack_frame (const lsquic_cid_t *, + const struct parse_funcs *, const unsigned char *, size_t len); #define EV_LOG_GENERATED_ACK_FRAME(...) do { \ if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ @@ -180,7 +213,44 @@ lsquic_ev_log_generated_ack_frame (lsquic_cid_t, const struct parse_funcs *, } while (0) void -lsquic_ev_log_generated_stop_waiting_frame (lsquic_cid_t, lsquic_packno_t); +lsquic_ev_log_generated_new_token_frame (const lsquic_cid_t *, + const struct parse_funcs *, const unsigned char *, size_t len); + +#define EV_LOG_GENERATED_NEW_TOKEN_FRAME(...) do { \ + if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ + lsquic_ev_log_generated_new_token_frame(__VA_ARGS__); \ +} while (0) + +void +lsquic_ev_log_generated_path_chal_frame (const lsquic_cid_t *, + const struct parse_funcs *, const unsigned char *, size_t len); + +#define EV_LOG_GENERATED_PATH_CHAL_FRAME(...) do { \ + if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ + lsquic_ev_log_generated_path_chal_frame(__VA_ARGS__); \ +} while (0) + +void +lsquic_ev_log_generated_path_resp_frame (const lsquic_cid_t *, + const struct parse_funcs *, const unsigned char *, size_t len); + +#define EV_LOG_GENERATED_PATH_RESP_FRAME(...) do { \ + if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ + lsquic_ev_log_generated_path_resp_frame(__VA_ARGS__); \ +} while (0) + +void +lsquic_ev_log_generated_new_connection_id_frame (const lsquic_cid_t *, + const struct parse_funcs *, const unsigned char *, size_t len); + +#define EV_LOG_GENERATED_NEW_CONNECTION_ID_FRAME(...) do { \ + if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ + lsquic_ev_log_generated_new_connection_id_frame(__VA_ARGS__); \ +} while (0) + +void +lsquic_ev_log_generated_stop_waiting_frame (const lsquic_cid_t *, + lsquic_packno_t); #define EV_LOG_GENERATED_STOP_WAITING_FRAME(...) do { \ if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ @@ -188,7 +258,16 @@ lsquic_ev_log_generated_stop_waiting_frame (lsquic_cid_t, lsquic_packno_t); } while (0) void -lsquic_ev_log_generated_http_headers (lsquic_cid_t, uint32_t stream_id, +lsquic_ev_log_generated_stop_sending_frame (const lsquic_cid_t *, + lsquic_stream_id_t, uint16_t); + +#define EV_LOG_GENERATED_STOP_SENDING_FRAME(...) do { \ + if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ + lsquic_ev_log_generated_stop_sending_frame(__VA_ARGS__); \ +} while (0) + +void +lsquic_ev_log_generated_http_headers (const lsquic_cid_t *, lsquic_stream_id_t, int is_server, const struct http_prio_frame *, const struct lsquic_http_headers *); @@ -199,10 +278,10 @@ lsquic_ev_log_generated_http_headers (lsquic_cid_t, uint32_t stream_id, } while (0) void -lsquic_ev_log_generated_http_push_promise (lsquic_cid_t, uint32_t stream_id, - uint32_t promised_stream_id, - const struct lsquic_http_headers *headers, - const struct lsquic_http_headers *extra_headers); +lsquic_ev_log_generated_http_push_promise (const lsquic_cid_t *, + lsquic_stream_id_t stream_id, lsquic_stream_id_t promised_stream_id, + const struct lsquic_http_headers *headers, + const struct lsquic_http_headers *extra_headers); #define EV_LOG_GENERATED_HTTP_PUSH_PROMISE(...) do { \ if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ @@ -210,7 +289,7 @@ lsquic_ev_log_generated_http_push_promise (lsquic_cid_t, uint32_t stream_id, } while (0) void -lsquic_ev_log_create_connection (lsquic_cid_t, const struct sockaddr *, +lsquic_ev_log_create_connection (const lsquic_cid_t *, const struct sockaddr *, const struct sockaddr *); #define EV_LOG_CREATE_CONN(...) do { \ @@ -221,7 +300,7 @@ lsquic_ev_log_create_connection (lsquic_cid_t, const struct sockaddr *, } while (0) void -lsquic_ev_log_hsk_completed (lsquic_cid_t); +lsquic_ev_log_hsk_completed (const lsquic_cid_t *); #define EV_LOG_HSK_COMPLETED(...) do { \ if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ @@ -232,7 +311,7 @@ lsquic_ev_log_hsk_completed (lsquic_cid_t); void -lsquic_ev_log_zero_rtt (lsquic_cid_t); +lsquic_ev_log_zero_rtt (const lsquic_cid_t *); #define EV_LOG_ZERO_RTT(...) do { \ if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ @@ -242,7 +321,7 @@ lsquic_ev_log_zero_rtt (lsquic_cid_t); } while (0) void -lsquic_ev_log_check_certs (lsquic_cid_t, const lsquic_str_t **, size_t); +lsquic_ev_log_check_certs (const lsquic_cid_t *, const lsquic_str_t **, size_t); #define EV_LOG_CHECK_CERTS(...) do { \ if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ @@ -252,7 +331,7 @@ lsquic_ev_log_check_certs (lsquic_cid_t, const lsquic_str_t **, size_t); } while (0) void -lsquic_ev_log_version_negotiation (lsquic_cid_t, const char *, const char *); +lsquic_ev_log_version_negotiation (const lsquic_cid_t *, const char *, const char *); #define EV_LOG_VER_NEG(...) do { \ if (LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) \ diff --git a/src/liblsquic/lsquic_frab_list.c b/src/liblsquic/lsquic_frab_list.c new file mode 100644 index 000000000..5f9db2363 --- /dev/null +++ b/src/liblsquic/lsquic_frab_list.c @@ -0,0 +1,148 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_frab_list.c -- List of buffer for simple reading and writing + */ + +#include +#include +#include +#include + +#include "lsquic_frab_list.h" + + +static void * +fral_alloc (void *ctx, size_t size) +{ + return malloc(size); +} + + +static void +fral_free (void *ctx, void *obj) +{ + free(obj); +} + + +void +lsquic_frab_list_init (struct frab_list *fral, unsigned short buf_size, + void * (*alloc)(void *alloc_ctx, size_t size), + void (*free)(void *alloc_ctx, void *obj), void *alloc_ctx) +{ + TAILQ_INIT(&fral->fl_frabs); + fral->fl_alloc_ctx = alloc_ctx; + fral->fl_alloc = alloc ? alloc : fral_alloc; + fral->fl_free = free ? free : fral_free; + fral->fl_buf_size = buf_size; + fral->fl_size = 0; +} + + +void +lsquic_frab_list_cleanup (struct frab_list *fral) +{ + struct frame_buf *frab, *next; + + for (frab = TAILQ_FIRST(&fral->fl_frabs); frab; frab = next) + { + next = TAILQ_NEXT(frab, frab_next); + fral->fl_free(fral->fl_alloc_ctx, frab); + } +} + + +static struct frame_buf * +fral_get_frab (struct frab_list *fral) +{ + struct frame_buf *frab; + frab = fral->fl_alloc(fral->fl_alloc_ctx, fral->fl_buf_size); + if (frab) + { + memset(frab, 0, sizeof(*frab)); + frab->frab_buf_size = fral->fl_buf_size; + } + return frab; +} + + +int +lsquic_frab_list_write (struct frab_list *fral, const void *buf, size_t bufsz) +{ + const unsigned char *p = buf; + const unsigned char *const end = p + bufsz; + struct frame_buf *frab; + unsigned ntowrite; + + while (p < end) + { + frab = TAILQ_LAST(&fral->fl_frabs, frame_buf_head); + if (!(frab && (ntowrite = frab_left_to_write(frab)) > 0)) + { + frab = fral_get_frab(fral); + if (!frab) + return -1; + TAILQ_INSERT_TAIL(&fral->fl_frabs, frab, frab_next); + ntowrite = frab_left_to_write(frab); + } + if ((ptrdiff_t) ntowrite > end - p) + ntowrite = end - p; + memcpy(frab_write_to(frab), p, ntowrite); + p += ntowrite; + frab->frab_size += ntowrite; + } + + fral->fl_size += bufsz; + return 0; +} + + +size_t +lsquic_frab_list_size (void *ctx) +{ + struct frab_list *fral = ctx; + return fral->fl_size; +} + + +size_t +lsquic_frab_list_read (void *ctx, void *buf, size_t bufsz) +{ + struct frab_list *const fral = ctx; + unsigned char *p = buf; + unsigned char *const end = p + bufsz; + struct frame_buf *frab; + size_t ntocopy; + + while (p < end && (frab = TAILQ_FIRST(&fral->fl_frabs))) + { + ntocopy = end - p; + if (ntocopy > (size_t) frab_left_to_read(frab)) + ntocopy = frab_left_to_read(frab); + memcpy(p, frab->frab_buf + frab->frab_off, ntocopy); + fral->fl_size -= ntocopy; + frab->frab_off += ntocopy; + p += ntocopy; + if (frab->frab_off == frab->frab_size) + { + TAILQ_REMOVE(&fral->fl_frabs, frab, frab_next); + fral->fl_free(fral->fl_alloc_ctx, frab); + } + } + + return p - (unsigned char *) buf; +} + + +size_t +lsquic_frab_list_mem_used (const struct frab_list *fral) +{ + struct frame_buf *frab; + size_t size; + + size = sizeof(*fral); + TAILQ_FOREACH(frab, &fral->fl_frabs, frab_next) + size += fral->fl_buf_size; + + return size; +} diff --git a/src/liblsquic/lsquic_frab_list.h b/src/liblsquic/lsquic_frab_list.h new file mode 100644 index 000000000..bcb9f1ec9 --- /dev/null +++ b/src/liblsquic/lsquic_frab_list.h @@ -0,0 +1,59 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_frab_list.h -- List of buffer for simple reading and writing + * + * Useful for buffering data that cannot be packetized immediately. + */ + +#ifndef LSQUIC_FRAB_LIST_H +#define LSQUIC_FRAB_LIST_H 1 + +struct frame_buf +{ + TAILQ_ENTRY(frame_buf) frab_next; + unsigned short frab_size, + frab_off, + frab_buf_size; /* Total bytes in frab_buf */ + unsigned char frab_buf[0]; +}; + +#define frab_left_to_read(f) ((f)->frab_size - (f)->frab_off) +#define frab_left_to_write(f) ((f)->frab_buf_size - \ + (unsigned short) sizeof(*(f)) - (f)->frab_size) +#define frab_write_to(f) ((f)->frab_buf + (f)->frab_size) + +TAILQ_HEAD(frame_buf_head, frame_buf); + +struct frab_list +{ + struct frame_buf_head fl_frabs; + void * (*fl_alloc)(void *alloc_ctx, size_t size); + void (*fl_free)(void *alloc_ctx, void *obj); + void *fl_alloc_ctx; + size_t fl_size; /* Size of payload in frab_list */ + unsigned short fl_buf_size; /* Size of frame_buf */ +}; + +void +lsquic_frab_list_init (struct frab_list *, unsigned short buf_size, + void * (*fl_alloc)(void *alloc_ctx, size_t size), + void (*fl_free)(void *alloc_ctx, void *obj), void *fl_alloc_ctx); + +void +lsquic_frab_list_cleanup (struct frab_list *); + +int +lsquic_frab_list_write (struct frab_list *, const void *, size_t); + +size_t +lsquic_frab_list_size (void *); + +size_t +lsquic_frab_list_read (void *, void *, size_t); + +#define lsquic_frab_list_empty(fral) TAILQ_EMPTY(&(fral)->fl_frabs) + +size_t +lsquic_frab_list_mem_used (const struct frab_list *); + +#endif diff --git a/src/liblsquic/lsquic_frame_reader.c b/src/liblsquic/lsquic_frame_reader.c index 55d43079a..7942ad712 100644 --- a/src/liblsquic/lsquic_frame_reader.c +++ b/src/liblsquic/lsquic_frame_reader.c @@ -22,10 +22,12 @@ #include "lsquic_http1x_if.h" #include "lsquic_headers.h" #include "lsquic_ev_log.h" +#include "lsquic_hash.h" #include "lsquic_conn.h" #define LSQUIC_LOGGER_MODULE LSQLM_FRAME_READER -#define LSQUIC_LOG_CONN_ID lsquic_conn_id(lsquic_stream_conn(fr->fr_stream)) +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(lsquic_stream_conn(\ + fr->fr_stream)) #include "lsquic_logger.h" @@ -200,7 +202,7 @@ lsquic_frame_reader_new (enum frame_reader_flags flags, if (hsi_if == lsquic_http1x_if) { fr->fr_h1x_ctor_ctx = (struct http1x_ctor_ctx) { - .cid = LSQUIC_LOG_CONN_ID, + .conn = lsquic_stream_conn(stream), .max_headers_sz = fr->fr_max_headers_sz, .is_server = fr->fr_flags & FRF_SERVER, }; @@ -515,8 +517,9 @@ decode_and_pass_payload (struct lsquic_frame_reader *fr) enum frame_reader_error err; int s; uint32_t name_idx; - unsigned name_len, val_len; + lshpack_strlen_t name_len, val_len; char *buf; + uint32_t stream_id32; struct uncompressed_headers *uh = NULL; void *hset = NULL; @@ -544,6 +547,8 @@ decode_and_pass_payload (struct lsquic_frame_reader *fr) buf, buf + 16 * 1024, &name_len, &val_len, &name_idx); if (s == 0) { + if (name_idx > 61 /* XXX 61 */) + name_idx = 0; /* Work around bug in ls-hpack */ err = (enum frame_reader_error) fr->fr_hsi_if->hsi_process_header(hset, name_idx, buf, name_len, buf + name_len, val_len); @@ -575,9 +580,9 @@ decode_and_pass_payload (struct lsquic_frame_reader *fr) goto stream_error; } - memcpy(&uh->uh_stream_id, fr->fr_state.header.hfh_stream_id, - sizeof(uh->uh_stream_id)); - uh->uh_stream_id = ntohl(uh->uh_stream_id); + memcpy(&stream_id32, fr->fr_state.header.hfh_stream_id, + sizeof(stream_id32)); + uh->uh_stream_id = ntohl(stream_id32); uh->uh_oth_stream_id = hs->oth_stream_id; if (HTTP_FRAME_HEADERS == fr->fr_state.by_type.headers_state.frame_type) { diff --git a/src/liblsquic/lsquic_frame_reader.h b/src/liblsquic/lsquic_frame_reader.h index 66bc959f8..f75a5ad2f 100644 --- a/src/liblsquic/lsquic_frame_reader.h +++ b/src/liblsquic/lsquic_frame_reader.h @@ -39,6 +39,7 @@ enum frame_reader_error FR_ERR_DUPLICATE_PSEH = LSQUIC_HDR_ERR_DUPLICATE_PSDO_HDR, FR_ERR_INCOMPL_REQ_PSEH = LSQUIC_HDR_ERR_INCOMPL_REQ_PSDO_HDR, FR_ERR_UNNEC_REQ_PSEH = LSQUIC_HDR_ERR_UNNEC_REQ_PSDO_HDR, + FR_ERR_BAD_REQ_HEADER = LSQUIC_HDR_ERR_BAD_REQ_HEADER, FR_ERR_INCOMPL_RESP_PSEH = LSQUIC_HDR_ERR_INCOMPL_RESP_PSDO_HDR, FR_ERR_UNNEC_RESP_PSEH = LSQUIC_HDR_ERR_UNNEC_RESP_PSDO_HDR, FR_ERR_UNKNOWN_PSEH = LSQUIC_HDR_ERR_UNKNOWN_PSDO_HDR, @@ -68,10 +69,10 @@ struct frame_reader_callbacks void (*frc_on_push_promise) (void *frame_cb_ctx, struct uncompressed_headers *); void (*frc_on_settings) (void *frame_cb_ctx, uint16_t setting_id, uint32_t setting_value); - void (*frc_on_priority) (void *frame_cb_ctx, uint32_t stream_id, - int exclusive, uint32_t dep_stream_id, + void (*frc_on_priority) (void *frame_cb_ctx, lsquic_stream_id_t stream_id, + int exclusive, lsquic_stream_id_t dep_stream_id, unsigned weight); - void (*frc_on_error) (void *frame_cb_ctx, uint32_t stream_id, + void (*frc_on_error) (void *frame_cb_ctx, lsquic_stream_id_t stream_id, enum frame_reader_error); }; diff --git a/src/liblsquic/lsquic_frame_writer.c b/src/liblsquic/lsquic_frame_writer.c index 437744229..adf11d6e2 100644 --- a/src/liblsquic/lsquic_frame_writer.c +++ b/src/liblsquic/lsquic_frame_writer.c @@ -22,55 +22,30 @@ #include "lsquic_mm.h" #include "lsquic.h" #include "lsquic_int_types.h" +#include "lsquic_hash.h" #include "lsquic_conn.h" #include "lsquic_frame_writer.h" #include "lsquic_frame_common.h" +#include "lsquic_frab_list.h" #include "lsquic_ev_log.h" #define LSQUIC_LOGGER_MODULE LSQLM_FRAME_WRITER -#define LSQUIC_LOG_CONN_ID lsquic_conn_id(lsquic_stream_conn(fw->fw_stream)) +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(\ + lsquic_stream_conn(fw->fw_stream)) #include "lsquic_logger.h" -#ifndef LSQUIC_FRAB_SZ -# define LSQUIC_FRAB_SZ 0x1000 -#endif - -struct frame_buf -{ - TAILQ_ENTRY(frame_buf) frab_next; - unsigned short frab_size, - frab_off; - unsigned char frab_buf[ - LSQUIC_FRAB_SZ - - sizeof(TAILQ_ENTRY(frame_buf)) - - sizeof(unsigned short) * 2 - ]; -}; - -#define frab_left_to_read(f) ((f)->frab_size - (f)->frab_off) -#define frab_left_to_write(f) ((unsigned short) sizeof((f)->frab_buf) - (f)->frab_size) -#define frab_write_to(f) ((f)->frab_buf + (f)->frab_size) - -/* Make sure that frab_buf is at least five bytes long, otherwise a frame - * won't fit into two adjacent frabs. - */ -typedef char three_byte_frab_buf[(sizeof(((struct frame_buf *)0)->frab_buf) >= 5) ?1 : - 1]; - - -TAILQ_HEAD(frame_buf_head, frame_buf); - struct lsquic_frame_writer { struct lsquic_stream *fw_stream; - fw_write_f fw_write; + fw_writef_f fw_writef; struct lsquic_mm *fw_mm; struct lshpack_enc *fw_henc; #if LSQUIC_CONN_STATS struct conn_stats *fw_conn_stats; #endif - struct frame_buf_head fw_frabs; + struct frab_list fw_fral; unsigned fw_max_frame_sz; uint32_t fw_max_header_list_sz; /* 0 means unlimited */ enum { @@ -88,9 +63,16 @@ struct lsquic_frame_writer #define ABS_MIN_FRAME_SIZE MAX(SETTINGS_FRAME_SZ, \ sizeof(struct http_prio_frame)) +static void * +fw_alloc (void *ctx, size_t size) +{ + return lsquic_mm_get_4k(ctx); +} + + struct lsquic_frame_writer * lsquic_frame_writer_new (struct lsquic_mm *mm, struct lsquic_stream *stream, - unsigned max_frame_sz, struct lshpack_enc *henc, fw_write_f write, + unsigned max_frame_sz, struct lshpack_enc *henc, fw_writef_f writef, #if LSQUIC_CONN_STATS struct conn_stats *conn_stats, #endif @@ -124,17 +106,18 @@ lsquic_frame_writer_new (struct lsquic_mm *mm, struct lsquic_stream *stream, fw->fw_mm = mm; fw->fw_henc = henc; fw->fw_stream = stream; - fw->fw_write = write; + fw->fw_writef = writef; fw->fw_max_frame_sz = max_frame_sz; fw->fw_max_header_list_sz = 0; if (is_server) fw->fw_flags = FW_SERVER; else fw->fw_flags = 0; - TAILQ_INIT(&fw->fw_frabs); #if LSQUIC_CONN_STATS fw->fw_conn_stats = conn_stats; #endif + lsquic_frab_list_init(&fw->fw_fral, 0x1000, fw_alloc, + (void (*)(void *, void *)) lsquic_mm_put_4k, mm); return fw; } @@ -142,99 +125,34 @@ lsquic_frame_writer_new (struct lsquic_mm *mm, struct lsquic_stream *stream, void lsquic_frame_writer_destroy (struct lsquic_frame_writer *fw) { - struct frame_buf *frab; - while ((frab = TAILQ_FIRST(&fw->fw_frabs))) - { - TAILQ_REMOVE(&fw->fw_frabs, frab, frab_next); - lsquic_mm_put_4k(fw->fw_mm, frab); - } + lsquic_frab_list_cleanup(&fw->fw_fral); free(fw); } -static struct frame_buf * -fw_get_frab (struct lsquic_frame_writer *fw) -{ - struct frame_buf *frab; - frab = lsquic_mm_get_4k(fw->fw_mm); - if (frab) - memset(frab, 0, offsetof(struct frame_buf, frab_buf)); - return frab; -} - - -static void -fw_put_frab (struct lsquic_frame_writer *fw, struct frame_buf *frab) -{ - TAILQ_REMOVE(&fw->fw_frabs, frab, frab_next); - lsquic_mm_put_4k(fw->fw_mm, frab); -} - - -static int -fw_write_to_frab (struct lsquic_frame_writer *fw, const void *buf, size_t bufsz) -{ - const unsigned char *p = buf; - const unsigned char *const end = p + bufsz; - struct frame_buf *frab; - unsigned ntowrite; - - while (p < end) - { - frab = TAILQ_LAST(&fw->fw_frabs, frame_buf_head); - if (!(frab && (ntowrite = frab_left_to_write(frab)) > 0)) - { - frab = fw_get_frab(fw); - if (!frab) - return -1; - TAILQ_INSERT_TAIL(&fw->fw_frabs, frab, frab_next); - ntowrite = frab_left_to_write(frab); - } - if (ntowrite > bufsz) - ntowrite = bufsz; - memcpy(frab_write_to(frab), p, ntowrite); - p += ntowrite; - bufsz -= ntowrite; - frab->frab_size += ntowrite; - } - - return 0; -} - - int lsquic_frame_writer_have_leftovers (const struct lsquic_frame_writer *fw) { - return !TAILQ_EMPTY(&fw->fw_frabs); + return !lsquic_frab_list_empty(&fw->fw_fral); } int lsquic_frame_writer_flush (struct lsquic_frame_writer *fw) { - struct frame_buf *frab; + struct lsquic_reader reader = { + .lsqr_read = lsquic_frab_list_read, + .lsqr_size = lsquic_frab_list_size, + .lsqr_ctx = &fw->fw_fral, + }; + ssize_t nw; - while ((frab = TAILQ_FIRST(&fw->fw_frabs))) - { - size_t ntowrite = frab_left_to_read(frab); - ssize_t nw = fw->fw_write(fw->fw_stream, - frab->frab_buf + frab->frab_off, ntowrite); - if (nw > 0) - { - frab->frab_off += nw; - if (frab->frab_off == frab->frab_size) - { - TAILQ_REMOVE(&fw->fw_frabs, frab, frab_next); - fw_put_frab(fw, frab); - } - } - else if (nw == 0) - break; - else - return -1; - } + nw = fw->fw_writef(fw->fw_stream, &reader); - return 0; + if (nw >= 0) + return 0; + else + return -1; } @@ -249,7 +167,8 @@ struct header_framer_ctx unsigned hfc_max_frame_sz; /* Maximum frame size. We always fill it. */ unsigned hfc_cur_sz; /* Number of bytes in the current frame. */ unsigned hfc_n_frames; /* Number of frames written. */ - uint32_t hfc_stream_id; /* Stream ID */ + lsquic_stream_id_t + hfc_stream_id; /* Stream ID */ enum http_frame_header_flags hfc_first_flags; enum http_frame_type @@ -259,8 +178,8 @@ struct header_framer_ctx static void hfc_init (struct header_framer_ctx *hfc, struct lsquic_frame_writer *fw, - unsigned max_frame_sz, enum http_frame_type frame_type, - uint32_t stream_id, enum http_frame_header_flags first_flags) + unsigned max_frame_sz, enum http_frame_type frame_type, + lsquic_stream_id_t stream_id, enum http_frame_header_flags first_flags) { memset(hfc, 0, sizeof(*hfc)); hfc->hfc_fw = fw; @@ -275,7 +194,7 @@ hfc_init (struct header_framer_ctx *hfc, struct lsquic_frame_writer *fw, static void hfc_save_ptr (struct header_framer_ctx *hfc) { - hfc->hfc_header_ptr.frab = TAILQ_LAST(&hfc->hfc_fw->fw_frabs, frame_buf_head); + hfc->hfc_header_ptr.frab = TAILQ_LAST(&hfc->hfc_fw->fw_fral.fl_frabs, frame_buf_head); hfc->hfc_header_ptr.off = hfc->hfc_header_ptr.frab->frab_size; } @@ -339,7 +258,7 @@ hfc_write (struct header_framer_ctx *hfc, const void *buf, size_t sz) { if (hfc->hfc_n_frames > 0) hfc_terminate_frame(hfc, 0); - s = fw_write_to_frab(hfc->hfc_fw, "123456789", + s = lsquic_frab_list_write(&hfc->hfc_fw->fw_fral, "123456789", sizeof(struct http_frame_header)); if (s < 0) return s; @@ -353,7 +272,7 @@ hfc_write (struct header_framer_ctx *hfc, const void *buf, size_t sz) avail = sz; if (avail) { - s = fw_write_to_frab(hfc->hfc_fw, p, avail); + s = lsquic_frab_list_write(&hfc->hfc_fw->fw_fral, p, avail); if (s < 0) return s; hfc->hfc_cur_sz += avail; @@ -421,6 +340,12 @@ check_headers_size (const struct lsquic_frame_writer *fw, if (headers_sz <= fw->fw_max_header_list_sz) return 0; + else if (fw->fw_flags & FW_SERVER) + { + LSQ_INFO("Sending headers larger (%u bytes) than max allowed (%u)", + headers_sz, fw->fw_max_header_list_sz); + return 0; + } else { LSQ_INFO("Headers size %u is larger than max allowed (%u)", @@ -480,9 +405,7 @@ write_headers (struct lsquic_frame_writer *fw, } else { - LSQ_WARN("error encoding header"); - errno = EBADMSG; - return -1; + /* Ignore errors, matching HTTP2 behavior in our server code */ } } @@ -492,7 +415,7 @@ write_headers (struct lsquic_frame_writer *fw, int lsquic_frame_writer_write_headers (struct lsquic_frame_writer *fw, - uint32_t stream_id, + lsquic_stream_id_t stream_id, const struct lsquic_http_headers *headers, int eos, unsigned weight) { @@ -553,10 +476,12 @@ lsquic_frame_writer_write_headers (struct lsquic_frame_writer *fw, int lsquic_frame_writer_write_promise (struct lsquic_frame_writer *fw, - uint32_t stream_id, uint32_t promised_stream_id, - const struct iovec *path, const struct iovec *host, - const struct lsquic_http_headers *extra_headers) + lsquic_stream_id_t stream_id64, lsquic_stream_id_t promised_stream_id64, + const struct iovec *path, const struct iovec *host, + const struct lsquic_http_headers *extra_headers) { + uint32_t stream_id = stream_id64; + uint32_t promised_stream_id = promised_stream_id64; struct header_framer_ctx hfc; struct http_push_promise_frame push_frame; lsquic_http_header_t mpas_headers[4]; @@ -659,7 +584,7 @@ write_settings (struct lsquic_frame_writer *fw, fh.hfh_length[1] = payload_length >> 8; fh.hfh_length[2] = payload_length; - s = fw_write_to_frab(fw, &fh, sizeof(fh)); + s = lsquic_frab_list_write(&fw->fw_fral, &fh, sizeof(fh)); if (s != 0) return s; @@ -667,8 +592,8 @@ write_settings (struct lsquic_frame_writer *fw, { id = htons(settings->id); val = htonl(settings->value); - if (0 != (s = fw_write_to_frab(fw, &id, sizeof(id))) || - 0 != (s = fw_write_to_frab(fw, &val, sizeof(val)))) + if (0 != (s = lsquic_frab_list_write(&fw->fw_fral, &id, sizeof(id))) || + 0 != (s = lsquic_frab_list_write(&fw->fw_fral, &val, sizeof(val)))) return s; EV_LOG_CONN_EVENT(LSQUIC_LOG_CONN_ID, "wrote HTTP SETTINGS frame: " "%s=%"PRIu32, lsquic_http_setting_id2str(settings->id), @@ -680,7 +605,6 @@ write_settings (struct lsquic_frame_writer *fw, return 0; } - int lsquic_frame_writer_write_settings (struct lsquic_frame_writer *fw, const struct lsquic_http2_setting *settings, unsigned n_settings) @@ -711,9 +635,11 @@ lsquic_frame_writer_write_settings (struct lsquic_frame_writer *fw, int lsquic_frame_writer_write_priority (struct lsquic_frame_writer *fw, - uint32_t stream_id, int exclusive, uint32_t stream_dep_id, - unsigned weight) + lsquic_stream_id_t stream_id64, int exclusive, + lsquic_stream_id_t stream_dep_id64, unsigned weight) { + uint32_t stream_id = stream_id64; + uint32_t stream_dep_id = stream_dep_id64; unsigned char buf[ sizeof(struct http_frame_header) + sizeof(struct http_prio_frame) ]; struct http_frame_header *fh = (void *) &buf[0]; @@ -741,7 +667,7 @@ lsquic_frame_writer_write_priority (struct lsquic_frame_writer *fw, memcpy(prio_frame->hpf_stream_id, &stream_id, 4); prio_frame->hpf_weight = weight - 1; - s = fw_write_to_frab(fw, buf, sizeof(buf)); + s = lsquic_frab_list_write(&fw->fw_fral, buf, sizeof(buf)); if (s != 0) return s; @@ -756,12 +682,11 @@ lsquic_frame_writer_write_priority (struct lsquic_frame_writer *fw, size_t lsquic_frame_writer_mem_used (const struct lsquic_frame_writer *fw) { - const struct frame_buf *frab; size_t size; - size = sizeof(*fw); - TAILQ_FOREACH(frab, &fw->fw_frabs, frab_next) - size += sizeof(*frab); + size = sizeof(*fw) + + lsquic_frab_list_mem_used(&fw->fw_fral) + - sizeof(fw->fw_fral); return size; } diff --git a/src/liblsquic/lsquic_frame_writer.h b/src/liblsquic/lsquic_frame_writer.h index f3554a62d..31ec8b7f0 100644 --- a/src/liblsquic/lsquic_frame_writer.h +++ b/src/liblsquic/lsquic_frame_writer.h @@ -9,6 +9,7 @@ #include #include +/* Same as H2_TMP_HDR_BUFF_SIZE */ #define MAX_HEADERS_SIZE (64 * 1024) struct iovec; @@ -16,18 +17,19 @@ struct lshpack_enc; struct lsquic_mm; struct lsquic_frame_writer; struct lsquic_stream; +struct lsquic_reader; struct lsquic_http_headers; struct lsquic_http2_setting; #if LSQUIC_CONN_STATS struct conn_stats; #endif -typedef ssize_t (*fw_write_f)(struct lsquic_stream *, const void *, size_t); +typedef ssize_t (*fw_writef_f)(struct lsquic_stream *, struct lsquic_reader *); struct lsquic_frame_writer * lsquic_frame_writer_new (struct lsquic_mm *, struct lsquic_stream *, unsigned max_frame_sz, struct lshpack_enc *, - fw_write_f, + fw_writef_f, #if LSQUIC_CONN_STATS struct conn_stats *, #endif @@ -44,7 +46,7 @@ lsquic_frame_writer_flush (struct lsquic_frame_writer *); int lsquic_frame_writer_write_headers (struct lsquic_frame_writer *, - uint32_t stream_id, + lsquic_stream_id_t stream_id, const struct lsquic_http_headers *, int eos, unsigned weight); @@ -54,14 +56,14 @@ lsquic_frame_writer_write_settings (struct lsquic_frame_writer *, int lsquic_frame_writer_write_priority (struct lsquic_frame_writer *, - uint32_t stream_id, int exclusive, uint32_t stream_dep_id, - unsigned priority); + lsquic_stream_id_t stream_id, int exclusive, + lsquic_stream_id_t stream_dep_id, unsigned priority); int lsquic_frame_writer_write_promise (struct lsquic_frame_writer *, - uint32_t stream_id, uint32_t promised_stream_id, - const struct iovec *path, const struct iovec *host, - const struct lsquic_http_headers *headers); + lsquic_stream_id_t stream_id, lsquic_stream_id_t promised_stream_id, + const struct iovec *path, const struct iovec *host, + const struct lsquic_http_headers *headers); void lsquic_frame_writer_max_header_list_size (struct lsquic_frame_writer *, diff --git a/src/liblsquic/lsquic_full_conn.c b/src/liblsquic/lsquic_full_conn.c index 48e686662..38c4fb4ee 100644 --- a/src/liblsquic/lsquic_full_conn.c +++ b/src/liblsquic/lsquic_full_conn.c @@ -19,9 +19,11 @@ #include #include "lsquic_types.h" +#include "lsquic_sizes.h" #include "lsquic.h" -#include "lsquic_alarmset.h" #include "lsquic_packet_common.h" +#include "lsquic_alarmset.h" +#include "lsquic_packet_gquic.h" #include "lsquic_parse.h" #include "lsquic_packet_in.h" #include "lsquic_packet_out.h" @@ -29,18 +31,26 @@ #include "lsquic_util.h" #include "lsquic_conn_flow.h" #include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" #include "lsquic_stream.h" #include "lsquic_senhist.h" #include "lsquic_rtt.h" #include "lsquic_cubic.h" #include "lsquic_pacer.h" +#include "lsquic_bw_sampler.h" +#include "lsquic_minmax.h" +#include "lsquic_bbr.h" #include "lsquic_send_ctl.h" #include "lsquic_set.h" #include "lsquic_malo.h" #include "lsquic_chsk_stream.h" +#include "lsquic_shsk_stream.h" +#include "lshpack.h" #include "lsquic_str.h" #include "lsquic_qtags.h" -#include "lsquic_handshake.h" +#include "lsquic_enc_sess.h" #include "lsquic_headers_stream.h" #include "lsquic_frame_common.h" #include "lsquic_frame_reader.h" @@ -51,26 +61,23 @@ #include "lsquic_spi.h" #include "lsquic_ev_log.h" #include "lsquic_version.h" -#include "lsquic_hash.h" #include "lsquic_headers.h" #include "lsquic_handshake.h" #include "lsquic_conn.h" #include "lsquic_conn_public.h" #include "lsquic_ver_neg.h" +#include "lsquic_mini_conn.h" #include "lsquic_full_conn.h" #define LSQUIC_LOGGER_MODULE LSQLM_CONN -#define LSQUIC_LOG_CONN_ID conn->fc_conn.cn_cid +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(&conn->fc_conn) #include "lsquic_logger.h" enum { STREAM_IF_STD, STREAM_IF_HSK, STREAM_IF_HDR, N_STREAM_IFS }; -#define MAX_ANY_PACKETS_SINCE_LAST_ACK 20 #define MAX_RETR_PACKETS_SINCE_LAST_ACK 2 #define ACK_TIMEOUT 25000 -#define TIME_BETWEEN_PINGS 15000000 -#define IDLE_TIMEOUT 30000000 /* IMPORTANT: Keep values of FC_SERVER and FC_HTTP same as LSENG_SERVER * and LSENG_HTTP. @@ -103,6 +110,7 @@ enum full_conn_flags { FC_HAVE_SAVED_ACK = (1 <<22), FC_ABORT_COMPLAINED = (1 <<23), + FC_GOT_SREJ = (1 <<24), /* Don't schedule ACK alarm */ }; #define FC_IMMEDIATE_CLOSE_FLAGS \ @@ -115,7 +123,7 @@ enum full_conn_flags { #if KEEP_CLOSED_STREAM_HISTORY struct stream_history { - uint32_t shist_stream_id; + lsquic_stream_id_t shist_stream_id; enum stream_flags shist_stream_flags; unsigned char shist_hist_buf[1 << SM_HIST_BITS]; }; @@ -148,13 +156,14 @@ struct recent_packets struct stream_id_to_reset { STAILQ_ENTRY(stream_id_to_reset) sitr_next; - uint32_t sitr_stream_id; + lsquic_stream_id_t sitr_stream_id; }; struct full_conn { struct lsquic_conn fc_conn; + struct conn_cid_elem fc_cces[2]; struct lsquic_rechist fc_rechist; struct { const struct lsquic_stream_if *stream_if; @@ -164,7 +173,7 @@ struct full_conn struct lsquic_send_ctl fc_send_ctl; struct lsquic_conn_public fc_pub; lsquic_alarmset_t fc_alset; - lsquic_set32_t fc_closed_stream_ids[2]; + lsquic_set64_t fc_closed_stream_ids[2]; const struct lsquic_engine_settings *fc_settings; struct lsquic_engine_public *fc_enpub; @@ -178,18 +187,17 @@ struct full_conn unsigned max_stream_send; } fc_cfg; enum full_conn_flags fc_flags; - /* Number of packets received since last ACK sent: */ - unsigned fc_n_slack_all; /* Number ackable packets received since last ACK was sent: */ unsigned fc_n_slack_akbl; unsigned fc_n_delayed_streams; unsigned fc_n_cons_unretx; - uint32_t fc_last_stream_id; - uint32_t fc_max_peer_stream_id; - uint32_t fc_goaway_stream_id; + lsquic_stream_id_t fc_last_stream_id; + lsquic_stream_id_t fc_max_peer_stream_id; + lsquic_stream_id_t fc_goaway_stream_id; struct ver_neg fc_ver_neg; union { struct client_hsk_ctx client; + struct server_hsk_ctx server; } fc_hsk_ctx; #if LSQUIC_CONN_STATS struct conn_stats fc_stats; @@ -209,8 +217,11 @@ struct full_conn fc_stream_ids_to_reset; struct short_ack_info fc_saved_ack_info; lsquic_time_t fc_saved_ack_received; + struct network_path fc_path; }; +static const struct ver_neg server_ver_neg; + #define MAX_ERRMSG 256 @@ -234,19 +245,20 @@ struct full_conn ABORT_WITH_FLAG(conn, LSQ_LOG_WARN, FC_ERROR, __VA_ARGS__) static void -idle_alarm_expired (void *ctx, lsquic_time_t expiry, lsquic_time_t now); +idle_alarm_expired (enum alarm_id, void *ctx, lsquic_time_t expiry, lsquic_time_t now); static void -ping_alarm_expired (void *ctx, lsquic_time_t expiry, lsquic_time_t now); +ping_alarm_expired (enum alarm_id, void *ctx, lsquic_time_t expiry, lsquic_time_t now); static void -handshake_alarm_expired (void *ctx, lsquic_time_t expiry, lsquic_time_t now); +handshake_alarm_expired (enum alarm_id, void *ctx, lsquic_time_t expiry, lsquic_time_t now); static void -ack_alarm_expired (void *ctx, lsquic_time_t expiry, lsquic_time_t now); +ack_alarm_expired (enum alarm_id, void *ctx, lsquic_time_t expiry, lsquic_time_t now); static lsquic_stream_t * -new_stream (struct full_conn *conn, uint32_t stream_id, enum stream_ctor_flags); +new_stream (struct full_conn *conn, lsquic_stream_id_t stream_id, + enum stream_ctor_flags); static void reset_ack_state (struct full_conn *conn); @@ -282,7 +294,7 @@ save_stream_history (struct full_conn *conn, const lsquic_stream_t *stream) static const struct stream_history * -find_stream_history (const struct full_conn *conn, uint32_t stream_id) +find_stream_history (const struct full_conn *conn, lsquic_stream_id_t stream_id) { const struct stream_history *shist; const struct stream_history *const shist_end = @@ -309,7 +321,6 @@ recent_packet_hist_new (struct full_conn *conn, unsigned out, conn->fc_recent_packets[out].els[idx].time = time; } - static void recent_packet_hist_frames (struct full_conn *conn, unsigned out, enum quic_ft_bit frame_types) @@ -318,8 +329,6 @@ recent_packet_hist_frames (struct full_conn *conn, unsigned out, idx = (conn->fc_recent_packets[out].idx - 1) % KEEP_PACKET_HISTORY; conn->fc_recent_packets[out].els[idx].frame_types |= frame_types; } - - #else #define recent_packet_hist_new(conn, out, time) #define recent_packet_hist_frames(conn, out, frames) @@ -356,8 +365,8 @@ calc_mem_used (const struct full_conn *conn) size += lsquic_send_ctl_mem_used(&conn->fc_send_ctl); size += lsquic_hash_mem_used(conn->fc_pub.all_streams); size += lsquic_malo_mem_used(conn->fc_pub.packet_out_malo); - if (conn->fc_pub.hs) - size += lsquic_headers_stream_mem_used(conn->fc_pub.hs); + if (conn->fc_pub.u.gquic.hs) + size += lsquic_headers_stream_mem_used(conn->fc_pub.u.gquic.hs); for (el = lsquic_hash_first(conn->fc_pub.all_streams); el; el = lsquic_hash_next(conn->fc_pub.all_streams)) @@ -365,7 +374,7 @@ calc_mem_used (const struct full_conn *conn) stream = lsquic_hashelem_getdata(el); size += lsquic_stream_mem_used(stream); } - size += conn->fc_conn.cn_esf->esf_mem_used(conn->fc_conn.cn_enc_session); + size += conn->fc_conn.cn_esf.g->esf_mem_used(conn->fc_conn.cn_enc_session); return size; } @@ -398,8 +407,11 @@ init_ver_neg (struct full_conn *conn, unsigned versions, /* If peer supplies odd values, we abort the connection immediately rather * that wait for it to finish "naturally" due to inability to send things. */ -static void -conn_on_peer_config (struct full_conn *conn, unsigned peer_cfcw, +#ifdef NDEBUG +static +#endif +void +lsquic_full_conn_on_peer_config (struct full_conn *conn, unsigned peer_cfcw, unsigned peer_sfcw, unsigned max_streams_out) { lsquic_stream_t *stream; @@ -425,7 +437,7 @@ conn_on_peer_config (struct full_conn *conn, unsigned peer_cfcw, stream = lsquic_hashelem_getdata(el); if (0 != lsquic_stream_set_max_send_off(stream, peer_sfcw)) { - ABORT_ERROR("cannot set peer-supplied SFCW=%u on stream %u", + ABORT_ERROR("cannot set peer-supplied SFCW=%u on stream %"PRIu64, peer_sfcw, stream->id); return; } @@ -440,7 +452,7 @@ send_smhl (const struct full_conn *conn) { uint32_t smhl; return conn->fc_conn.cn_enc_session - && 0 == conn->fc_conn.cn_esf->esf_get_peer_setting( + && 0 == conn->fc_conn.cn_esf.g->esf_get_peer_setting( conn->fc_conn.cn_enc_session, QTAG_SMHL, &smhl) && 1 == smhl; } @@ -473,7 +485,7 @@ maybe_send_settings (struct full_conn *conn) if (n_settings) { - if (0 != lsquic_headers_stream_send_settings(conn->fc_pub.hs, + if (0 != lsquic_headers_stream_send_settings(conn->fc_pub.u.gquic.hs, settings, n_settings)) ABORT_ERROR("could not send settings"); } @@ -502,28 +514,43 @@ apply_peer_settings (struct full_conn *conn) return 0; #endif - for (n = 0; n < sizeof(tags) / sizeof(tags[0]); ++n) - if (0 != conn->fc_conn.cn_esf->esf_get_peer_setting( - conn->fc_conn.cn_enc_session, tags[n].tag, tags[n].val)) +#if LSQUIC_ENABLE_HANDSHAKE_DISABLE + if (conn->fc_conn.cn_flags & LSCONN_NO_CRYPTO) + { /* Magically figure out peer's settings */ + if (conn->fc_flags & FC_SERVER) { - LSQ_INFO("peer did not supply value for %s", tags[n].tag_str); - return -1; + cfcw = LSQUIC_DF_CFCW_CLIENT; + sfcw = LSQUIC_DF_SFCW_CLIENT; + mids = 100; } + else + { + cfcw = LSQUIC_DF_CFCW_SERVER; + sfcw = LSQUIC_DF_SFCW_SERVER; + mids = 100; + } + } + else +#endif + for (n = 0; n < sizeof(tags) / sizeof(tags[0]); ++n) + if (0 != conn->fc_conn.cn_esf.g->esf_get_peer_setting( + conn->fc_conn.cn_enc_session, tags[n].tag, tags[n].val)) + { + LSQ_INFO("peer did not supply value for %s", tags[n].tag_str); + return -1; + } LSQ_DEBUG("peer settings: CFCW: %u; SFCW: %u; MIDS: %u", cfcw, sfcw, mids); - conn_on_peer_config(conn, cfcw, sfcw, mids); + lsquic_full_conn_on_peer_config(conn, cfcw, sfcw, mids); return 0; } - static const struct conn_iface *full_conn_iface_ptr; static struct full_conn * new_conn_common (lsquic_cid_t cid, struct lsquic_engine_public *enpub, - const struct lsquic_stream_if *stream_if, - void *stream_if_ctx, unsigned flags, - unsigned short max_packet_size) + unsigned flags) { struct full_conn *conn; lsquic_stream_t *headers_stream; @@ -535,8 +562,10 @@ new_conn_common (lsquic_cid_t cid, struct lsquic_engine_public *enpub, if (!conn) return NULL; headers_stream = NULL; + conn->fc_conn.cn_if = full_conn_iface_ptr; + conn->fc_conn.cn_cces = conn->fc_cces; + conn->fc_conn.cn_cces_mask = 1; conn->fc_conn.cn_cid = cid; - conn->fc_conn.cn_pack_size = max_packet_size; conn->fc_flags = flags; conn->fc_enpub = enpub; conn->fc_pub.enpub = enpub; @@ -548,8 +577,9 @@ new_conn_common (lsquic_cid_t cid, struct lsquic_engine_public *enpub, #endif conn->fc_pub.packet_out_malo = lsquic_malo_create(sizeof(struct lsquic_packet_out)); - conn->fc_stream_ifs[STREAM_IF_STD].stream_if = stream_if; - conn->fc_stream_ifs[STREAM_IF_STD].stream_if_ctx = stream_if_ctx; + conn->fc_pub.path = &conn->fc_path; + conn->fc_stream_ifs[STREAM_IF_STD].stream_if = enpub->enp_stream_if; + conn->fc_stream_ifs[STREAM_IF_STD].stream_if_ctx = enpub->enp_stream_if_ctx; conn->fc_settings = &enpub->enp_settings; /* Calculate maximum number of incoming streams using the same mechanism * and parameters as found in Chrome: @@ -574,47 +604,48 @@ new_conn_common (lsquic_cid_t cid, struct lsquic_engine_public *enpub, TAILQ_INIT(&conn->fc_pub.service_streams); STAILQ_INIT(&conn->fc_stream_ids_to_reset); lsquic_conn_cap_init(&conn->fc_pub.conn_cap, LSQUIC_MIN_FCW); - lsquic_alarmset_init(&conn->fc_alset, cid); + lsquic_alarmset_init(&conn->fc_alset, &conn->fc_conn); lsquic_alarmset_init_alarm(&conn->fc_alset, AL_IDLE, idle_alarm_expired, conn); - lsquic_alarmset_init_alarm(&conn->fc_alset, AL_ACK, ack_alarm_expired, conn); + lsquic_alarmset_init_alarm(&conn->fc_alset, AL_ACK_APP, ack_alarm_expired, conn); lsquic_alarmset_init_alarm(&conn->fc_alset, AL_PING, ping_alarm_expired, conn); lsquic_alarmset_init_alarm(&conn->fc_alset, AL_HANDSHAKE, handshake_alarm_expired, conn); - lsquic_set32_init(&conn->fc_closed_stream_ids[0]); - lsquic_set32_init(&conn->fc_closed_stream_ids[1]); + lsquic_set64_init(&conn->fc_closed_stream_ids[0]); + lsquic_set64_init(&conn->fc_closed_stream_ids[1]); lsquic_cfcw_init(&conn->fc_pub.cfcw, &conn->fc_pub, conn->fc_settings->es_cfcw); lsquic_send_ctl_init(&conn->fc_send_ctl, &conn->fc_alset, conn->fc_enpub, - &conn->fc_ver_neg, &conn->fc_pub, conn->fc_conn.cn_pack_size); + flags & FC_SERVER ? &server_ver_neg : &conn->fc_ver_neg, + &conn->fc_pub, 0); conn->fc_pub.all_streams = lsquic_hash_create(); if (!conn->fc_pub.all_streams) goto cleanup_on_error; - lsquic_rechist_init(&conn->fc_rechist, cid); + lsquic_rechist_init(&conn->fc_rechist, &conn->fc_conn, 0); if (conn->fc_flags & FC_HTTP) { - conn->fc_pub.hs = lsquic_headers_stream_new( + conn->fc_pub.u.gquic.hs = lsquic_headers_stream_new( !!(conn->fc_flags & FC_SERVER), conn->fc_enpub, headers_callbacks_ptr, #if LSQUIC_CONN_STATS &conn->fc_stats, #endif conn); - if (!conn->fc_pub.hs) + if (!conn->fc_pub.u.gquic.hs) goto cleanup_on_error; conn->fc_stream_ifs[STREAM_IF_HDR].stream_if = lsquic_headers_stream_if; - conn->fc_stream_ifs[STREAM_IF_HDR].stream_if_ctx = conn->fc_pub.hs; - headers_stream = new_stream(conn, LSQUIC_STREAM_HEADERS, + conn->fc_stream_ifs[STREAM_IF_HDR].stream_if_ctx = conn->fc_pub.u.gquic.hs; + headers_stream = new_stream(conn, LSQUIC_GQUIC_STREAM_HEADERS, SCF_CALL_ON_NEW); if (!headers_stream) goto cleanup_on_error; } else { - conn->fc_stream_ifs[STREAM_IF_HDR].stream_if = stream_if; - conn->fc_stream_ifs[STREAM_IF_HDR].stream_if_ctx = stream_if_ctx; + conn->fc_stream_ifs[STREAM_IF_HDR].stream_if = enpub->enp_stream_if; + conn->fc_stream_ifs[STREAM_IF_HDR].stream_if_ctx = enpub->enp_stream_if_ctx; } if (conn->fc_settings->es_support_push) conn->fc_flags |= FC_SUPPORT_PUSH; - conn->fc_conn.cn_if = full_conn_iface_ptr; + conn->fc_conn.cn_n_cces = sizeof(conn->fc_cces) / sizeof(conn->fc_cces[0]); return conn; cleanup_on_error: @@ -625,8 +656,8 @@ new_conn_common (lsquic_cid_t cid, struct lsquic_engine_public *enpub, lsquic_rechist_cleanup(&conn->fc_rechist); if (conn->fc_flags & FC_HTTP) { - if (conn->fc_pub.hs) - lsquic_headers_stream_destroy(conn->fc_pub.hs); + if (conn->fc_pub.u.gquic.hs) + lsquic_headers_stream_destroy(conn->fc_pub.u.gquic.hs); if (headers_stream) lsquic_stream_destroy(headers_stream); } @@ -639,16 +670,16 @@ new_conn_common (lsquic_cid_t cid, struct lsquic_engine_public *enpub, struct lsquic_conn * -full_conn_client_new (struct lsquic_engine_public *enpub, - const struct lsquic_stream_if *stream_if, - void *stream_if_ctx, unsigned flags, +lsquic_gquic_full_conn_client_new (struct lsquic_engine_public *enpub, + unsigned flags, const char *hostname, unsigned short max_packet_size, + int is_ipv4, const unsigned char *zero_rtt, size_t zero_rtt_len) { struct full_conn *conn; enum lsquic_version version, zero_rtt_version; lsquic_cid_t cid; - const struct enc_session_funcs *esf; + const struct enc_session_funcs_gquic *esf_g; version = highest_bit_set(enpub->enp_settings.es_versions); if (zero_rtt) @@ -658,15 +689,23 @@ full_conn_client_new (struct lsquic_engine_public *enpub, ((1 << zero_rtt_version) & enpub->enp_settings.es_versions)) version = zero_rtt_version; } - esf = select_esf_by_ver(version); - cid = esf->esf_generate_cid(); - conn = new_conn_common(cid, enpub, stream_if, stream_if_ctx, flags, - max_packet_size); + esf_g = select_esf_gquic_by_ver(version); + lsquic_generate_cid_gquic(&cid); + if (!max_packet_size) + { + if (is_ipv4) + max_packet_size = GQUIC_MAX_IPv4_PACKET_SZ; + else + max_packet_size = GQUIC_MAX_IPv6_PACKET_SZ; + } + conn = new_conn_common(cid, enpub, flags); if (!conn) return NULL; - conn->fc_conn.cn_esf = esf; + conn->fc_path.np_pack_size = max_packet_size; + conn->fc_conn.cn_esf_c = select_esf_common_by_ver(version); + conn->fc_conn.cn_esf.g = esf_g; conn->fc_conn.cn_enc_session = - conn->fc_conn.cn_esf->esf_create_client(hostname, cid, conn->fc_enpub, + conn->fc_conn.cn_esf.g->esf_create_client(hostname, cid, conn->fc_enpub, zero_rtt, zero_rtt_len); if (!conn->fc_conn.cn_enc_session) { @@ -676,9 +715,9 @@ full_conn_client_new (struct lsquic_engine_public *enpub, } if (conn->fc_flags & FC_HTTP) - conn->fc_last_stream_id = LSQUIC_STREAM_HEADERS; /* Client goes 5, 7, 9.... */ + conn->fc_last_stream_id = LSQUIC_GQUIC_STREAM_HEADERS; /* Client goes 5, 7, 9.... */ else - conn->fc_last_stream_id = LSQUIC_STREAM_HANDSHAKE; + conn->fc_last_stream_id = LSQUIC_GQUIC_STREAM_HANDSHAKE; conn->fc_hsk_ctx.client.lconn = &conn->fc_conn; conn->fc_hsk_ctx.client.mm = &enpub->enp_mm; conn->fc_hsk_ctx.client.ver_neg = &conn->fc_ver_neg; @@ -689,7 +728,7 @@ full_conn_client_new (struct lsquic_engine_public *enpub, if (conn->fc_settings->es_handshake_to) lsquic_alarmset_set(&conn->fc_alset, AL_HANDSHAKE, lsquic_time_now() + conn->fc_settings->es_handshake_to); - if (!new_stream(conn, LSQUIC_STREAM_HANDSHAKE, SCF_CALL_ON_NEW)) + if (!new_stream(conn, LSQUIC_GQUIC_STREAM_HANDSHAKE, SCF_CALL_ON_NEW)) { LSQ_WARN("could not create handshake stream: %s", strerror(errno)); conn->fc_conn.cn_if->ci_destroy(&conn->fc_conn); @@ -697,13 +736,13 @@ full_conn_client_new (struct lsquic_engine_public *enpub, } conn->fc_flags |= FC_CREATED_OK; LSQ_INFO("Created new client connection"); - EV_LOG_CONN_EVENT(cid, "created full connection"); + EV_LOG_CONN_EVENT(LSQUIC_LOG_CONN_ID, "created full connection"); return &conn->fc_conn; } -void -full_conn_client_call_on_new (struct lsquic_conn *lconn) +static void +full_conn_ci_client_call_on_new (struct lsquic_conn *lconn) { struct full_conn *const conn = (struct full_conn *) lconn; assert(conn->fc_flags & FC_CREATED_OK); @@ -712,6 +751,198 @@ full_conn_client_call_on_new (struct lsquic_conn *lconn) } +/* This function is special in that it peeks into fc_send_ctl. Other functions + * should not do that. + */ +struct lsquic_conn * +lsquic_gquic_full_conn_server_new (struct lsquic_engine_public *enpub, + unsigned flags, lsquic_conn_t *lconn_mini) +{ + struct full_conn *conn; + struct mini_conn *mc; + lsquic_conn_t *lconn_full; + lsquic_packet_in_t *packet_in; + lsquic_packet_out_t *packet_out; + lsquic_stream_t *hsk_stream; + lsquic_packno_t next_packno; + mconn_packno_set_t received; + unsigned n; + uint32_t tcid0_val; + int have_errors = 0, tcid0; + int have_outgoing_ack = 0; + + mc = (struct mini_conn *) lconn_mini; + conn = new_conn_common(lconn_mini->cn_cid, enpub, flags); + if (!conn) + return NULL; + lconn_full = &conn->fc_conn; + conn->fc_last_stream_id = 0; /* Server goes 2, 4, 6.... */ + if (conn->fc_flags & FC_HTTP) + conn->fc_max_peer_stream_id = LSQUIC_GQUIC_STREAM_HEADERS; + else + conn->fc_max_peer_stream_id = LSQUIC_GQUIC_STREAM_HANDSHAKE; + conn->fc_stream_ifs[STREAM_IF_HSK] + .stream_if = &lsquic_server_hsk_stream_if; + conn->fc_stream_ifs[STREAM_IF_HSK].stream_if_ctx = &conn->fc_hsk_ctx.server; + conn->fc_ver_neg.vn_ver = lconn_mini->cn_version; + conn->fc_conn.cn_version = lconn_mini->cn_version; + conn->fc_conn.cn_pf = lconn_mini->cn_pf; + conn->fc_conn.cn_esf_c = lconn_mini->cn_esf_c; + conn->fc_conn.cn_esf.g = lconn_mini->cn_esf.g; + conn->fc_conn.cn_flags |= LSCONN_VER_SET | LSCONN_SERVER; + conn->fc_pub.rtt_stats = mc->mc_rtt_stats; + + conn->fc_hsk_ctx.server.lconn = lconn_full; + conn->fc_hsk_ctx.server.enpub = enpub; + + /* Adjust offsets in the HANDSHAKE stream: */ + hsk_stream = new_stream(conn, LSQUIC_GQUIC_STREAM_HANDSHAKE, SCF_CALL_ON_NEW); + if (!hsk_stream) + { + LSQ_DEBUG("could not create handshake stream: %s", strerror(errno)); + conn->fc_conn.cn_if->ci_destroy(&conn->fc_conn); + return NULL; + } + hsk_stream->tosend_off = mc->mc_write_off; + hsk_stream->read_offset = mc->mc_read_off; + if (0 != lsquic_stream_update_sfcw(hsk_stream, mc->mc_write_off)) + { + LSQ_WARN("Invalid write offset %u", mc->mc_write_off); + ++have_errors; + } + + assert(lconn_full->cn_enc_session == NULL); + lconn_full->cn_enc_session = lconn_mini->cn_enc_session; + lconn_mini->cn_enc_session = NULL; + + lsquic_send_ctl_verneg_done(&conn->fc_send_ctl); + conn->fc_send_ctl.sc_cur_packno = mc->mc_cur_packno; + + /* Remove those that still exist from the set: they will be marked as + * received during regular processing in ci_packet_in() later on. + */ + received = mc->mc_received_packnos; + TAILQ_FOREACH(packet_in, &mc->mc_packets_in, pi_next) + received &= ~MCONN_PACKET_MASK(packet_in->pi_packno); + + for (n = 0; received; ++n) + { + if (received & (1U << n)) + /* Setting `now' to zero is OK here, as we should have had at + * least one other packet above. + */ + lsquic_rechist_received(&conn->fc_rechist, n + 1, 0); + received &= ~(1U << n); + } + + /* Mini connection sends out packets 1, 2, 3... and so on. It deletes + * packets that have been successfully sent and acked or those that have + * been lost. We take ownership of all packets in mc_packets_out; those + * that are not on the list are recorded in fc_send_ctl.sc_senhist. + */ + next_packno = 0; + while ((packet_out = TAILQ_FIRST(&mc->mc_packets_out))) + { + TAILQ_REMOVE(&mc->mc_packets_out, packet_out, po_next); + + /* Holes in the sequence signify ACKed or lost packets */ + ++next_packno; + for ( ; next_packno < packet_out->po_packno; ++next_packno) + lsquic_senhist_add(&conn->fc_send_ctl.sc_senhist, next_packno); + + packet_out->po_path = &conn->fc_path; + if (mc->mc_sent_packnos & MCONN_PACKET_MASK(packet_out->po_packno)) + { + LSQ_DEBUG("got sent packet_out %"PRIu64" from mini", + packet_out->po_packno); + if (0 != lsquic_send_ctl_sent_packet(&conn->fc_send_ctl, + packet_out) + && !have_errors /* Warn once */) + { + ++have_errors; + LSQ_WARN("could not add packet %"PRIu64" to sent set: %s", + packet_out->po_packno, strerror(errno)); + } + } + else + { + LSQ_DEBUG("got unsent packet_out %"PRIu64" from mini (will send)", + packet_out->po_packno); + lsquic_send_ctl_scheduled_one(&conn->fc_send_ctl, packet_out); + have_outgoing_ack |= packet_out->po_frame_types & + (1 << QUIC_FRAME_ACK); + } + } + + assert(lconn_mini->cn_flags & LSCONN_HANDSHAKE_DONE); + lconn_full->cn_flags |= LSCONN_HANDSHAKE_DONE; +#if LSQUIC_ENABLE_HANDSHAKE_DISABLE + if (getenv("LSQUIC_DISABLE_HANDSHAKE")) + lconn_full->cn_flags |= LSCONN_NO_CRYPTO; +#endif + + lconn_full->cn_flags |= lconn_mini->cn_flags & + LSCONN_PEER_GOING_AWAY /* We are OK with fc_goaway_stream_id = 0 */; + conn->fc_path = mc->mc_path; + + if (0 == apply_peer_settings(conn)) + { + if (conn->fc_flags & FC_HTTP) + maybe_send_settings(conn); + } + else + ++have_errors; + + if (0 == have_errors) + { + tcid0 = conn->fc_settings->es_support_tcid0 + && 0 == conn->fc_conn.cn_esf.g->esf_get_peer_setting( + conn->fc_conn.cn_enc_session, QTAG_TCID, &tcid0_val) + && 0 == tcid0_val; + lsquic_send_ctl_set_tcid0(&conn->fc_send_ctl, tcid0); + if (tcid0) + conn->fc_conn.cn_flags |= LSCONN_TCID0; + conn->fc_flags |= FC_CREATED_OK|FC_FIRST_TICK; + if (conn->fc_conn.cn_version >= LSQVER_046 + || conn->fc_conn.cn_esf.g->esf_get_peer_option( + conn->fc_conn.cn_enc_session, QTAG_NSTP)) + { + conn->fc_flags |= FC_NSTP; + lsquic_send_ctl_turn_nstp_on(&conn->fc_send_ctl); + } + LSQ_DEBUG("Calling on_new_conn callback"); + conn->fc_conn_ctx = enpub->enp_stream_if->on_new_conn( + enpub->enp_stream_if_ctx, &conn->fc_conn); + /* Now that user code knows about this connection, process incoming + * packets, if any. + */ + while ((packet_in = TAILQ_FIRST(&mc->mc_packets_in))) + { + TAILQ_REMOVE(&mc->mc_packets_in, packet_in, pi_next); + packet_in->pi_flags |= PI_FROM_MINI; + conn->fc_conn.cn_if->ci_packet_in(&conn->fc_conn, packet_in); + lsquic_packet_in_put(conn->fc_pub.mm, packet_in); + } + /* At this point we may have errors, but we promote it anyway: this is + * so that CONNECTION_CLOSE frame can be generated and sent out. + */ + if (have_outgoing_ack) + reset_ack_state(conn); + lsquic_alarmset_set(&conn->fc_alset, AL_IDLE, + lsquic_time_now() + conn->fc_settings->es_idle_conn_to); + EV_LOG_CONN_EVENT(LSQUIC_LOG_CONN_ID, "created full connection"); + LSQ_INFO("Created new server connection"); + return &conn->fc_conn; + } + else + { + LSQ_DEBUG("hit errors creating connection, return NULL"); + conn->fc_conn.cn_if->ci_destroy(&conn->fc_conn); + return NULL; + } +} + + static int is_our_stream (const struct full_conn *conn, const lsquic_stream_t *stream) { @@ -776,7 +1007,7 @@ collect_stream_counts (const struct full_conn *conn, int peer, { ++counts[SCNT_PEER]; counts[SCNT_CLOSED] += lsquic_stream_is_closed(stream); - counts[SCNT_RESET] += lsquic_stream_is_reset(stream); + counts[SCNT_RESET] += !!lsquic_stream_is_reset(stream); counts[SCNT_RES_UNCLO] += lsquic_stream_is_reset(stream) && !lsquic_stream_is_closed(stream); } @@ -794,8 +1025,8 @@ full_conn_ci_destroy (lsquic_conn_t *lconn) LSQ_DEBUG("destroy connection"); conn->fc_flags |= FC_CLOSING; - lsquic_set32_cleanup(&conn->fc_closed_stream_ids[0]); - lsquic_set32_cleanup(&conn->fc_closed_stream_ids[1]); + lsquic_set64_cleanup(&conn->fc_closed_stream_ids[0]); + lsquic_set64_cleanup(&conn->fc_closed_stream_ids[1]); while ((el = lsquic_hash_first(conn->fc_pub.all_streams))) { stream = lsquic_hashelem_getdata(el); @@ -806,13 +1037,13 @@ full_conn_ci_destroy (lsquic_conn_t *lconn) if (conn->fc_flags & FC_CREATED_OK) conn->fc_stream_ifs[STREAM_IF_STD].stream_if ->on_conn_closed(&conn->fc_conn); - if (conn->fc_pub.hs) - lsquic_headers_stream_destroy(conn->fc_pub.hs); + if (conn->fc_pub.u.gquic.hs) + lsquic_headers_stream_destroy(conn->fc_pub.u.gquic.hs); lsquic_send_ctl_cleanup(&conn->fc_send_ctl); lsquic_rechist_cleanup(&conn->fc_rechist); if (conn->fc_conn.cn_enc_session) - conn->fc_conn.cn_esf->esf_destroy(conn->fc_conn.cn_enc_session); + conn->fc_conn.cn_esf.g->esf_destroy(conn->fc_conn.cn_enc_session); lsquic_malo_destroy(conn->fc_pub.packet_out_malo); #if LSQUIC_CONN_STATS LSQ_NOTICE("# ticks: %lu", conn->fc_stats.n_ticks); @@ -839,37 +1070,38 @@ full_conn_ci_destroy (lsquic_conn_t *lconn) static void -conn_mark_stream_closed (struct full_conn *conn, uint32_t stream_id) +conn_mark_stream_closed (struct full_conn *conn, lsquic_stream_id_t stream_id) { /* Because stream IDs are distributed unevenly -- there is a set of odd * stream IDs and a set of even stream IDs -- it is more efficient to * maintain two sets of closed stream IDs. */ int idx = stream_id & 1; stream_id >>= 1; - if (0 != lsquic_set32_add(&conn->fc_closed_stream_ids[idx], stream_id)) + if (0 != lsquic_set64_add(&conn->fc_closed_stream_ids[idx], stream_id)) ABORT_ERROR("could not add element to set: %s", strerror(errno)); } static int -conn_is_stream_closed (struct full_conn *conn, uint32_t stream_id) +conn_is_stream_closed (struct full_conn *conn, lsquic_stream_id_t stream_id) { int idx = stream_id & 1; stream_id >>= 1; - return lsquic_set32_has(&conn->fc_closed_stream_ids[idx], stream_id); + return lsquic_set64_has(&conn->fc_closed_stream_ids[idx], stream_id); } static void set_ack_timer (struct full_conn *conn, lsquic_time_t now) { - lsquic_alarmset_set(&conn->fc_alset, AL_ACK, now + ACK_TIMEOUT); + lsquic_alarmset_set(&conn->fc_alset, AL_ACK_APP, now + ACK_TIMEOUT); LSQ_DEBUG("ACK alarm set to %"PRIu64, now + ACK_TIMEOUT); } static void -ack_alarm_expired (void *ctx, lsquic_time_t expiry, lsquic_time_t now) +ack_alarm_expired (enum alarm_id al_id, void *ctx, lsquic_time_t expiry, + lsquic_time_t now) { struct full_conn *conn = ctx; LSQ_DEBUG("ACK timer expired (%"PRIu64" < %"PRIu64"): ACK queued", @@ -882,17 +1114,15 @@ static void try_queueing_ack (struct full_conn *conn, int was_missing, lsquic_time_t now) { if (conn->fc_n_slack_akbl >= MAX_RETR_PACKETS_SINCE_LAST_ACK || - (conn->fc_conn.cn_version < LSQVER_039 /* Since Q039 do not ack ACKs */ - && conn->fc_n_slack_all >= MAX_ANY_PACKETS_SINCE_LAST_ACK) || ((conn->fc_flags & FC_ACK_HAD_MISS) && was_missing) || lsquic_send_ctl_n_stop_waiting(&conn->fc_send_ctl) > 1) { - lsquic_alarmset_unset(&conn->fc_alset, AL_ACK); + lsquic_alarmset_unset(&conn->fc_alset, AL_ACK_APP); lsquic_send_ctl_sanity_check(&conn->fc_send_ctl); conn->fc_flags |= FC_ACK_QUEUED; - LSQ_DEBUG("ACK queued: ackable: %u; all: %u; had_miss: %d; " + LSQ_DEBUG("ACK queued: ackable: %u; had_miss: %d; " "was_missing: %d; n_stop_waiting: %u", - conn->fc_n_slack_akbl, conn->fc_n_slack_all, + conn->fc_n_slack_akbl, !!(conn->fc_flags & FC_ACK_HAD_MISS), was_missing, lsquic_send_ctl_n_stop_waiting(&conn->fc_send_ctl)); } @@ -904,11 +1134,10 @@ try_queueing_ack (struct full_conn *conn, int was_missing, lsquic_time_t now) static void reset_ack_state (struct full_conn *conn) { - conn->fc_n_slack_all = 0; conn->fc_n_slack_akbl = 0; lsquic_send_ctl_n_stop_waiting_reset(&conn->fc_send_ctl); conn->fc_flags &= ~FC_ACK_QUEUED; - lsquic_alarmset_unset(&conn->fc_alset, AL_ACK); + lsquic_alarmset_unset(&conn->fc_alset, AL_ACK_APP); lsquic_send_ctl_sanity_check(&conn->fc_send_ctl); LSQ_DEBUG("ACK state reset"); } @@ -949,8 +1178,6 @@ verify_ack_frame (struct full_conn *conn, const unsigned char *buf, int bufsz) assert(i == ack_info->n_ranges); LSQ_DEBUG("Sent ACK frame %s", ack_buf); } - - #endif @@ -969,7 +1196,8 @@ full_conn_ci_write_ack (struct lsquic_conn *lconn, (gaf_rechist_first_f) lsquic_rechist_first, (gaf_rechist_next_f) lsquic_rechist_next, (gaf_rechist_largest_recv_f) lsquic_rechist_largest_recv, - &conn->fc_rechist, now, &has_missing, &packet_out->po_ack2ed); + &conn->fc_rechist, now, &has_missing, &packet_out->po_ack2ed, + NULL); if (w < 0) { ABORT_ERROR("generating ACK frame failed: %d", errno); return; @@ -980,7 +1208,8 @@ full_conn_ci_write_ack (struct lsquic_conn *lconn, EV_LOG_GENERATED_ACK_FRAME(LSQUIC_LOG_CONN_ID, conn->fc_conn.cn_pf, packet_out->po_data + packet_out->po_data_sz, w); verify_ack_frame(conn, packet_out->po_data + packet_out->po_data_sz, w); - lsquic_send_ctl_scheduled_ack(&conn->fc_send_ctl, packet_out->po_ack2ed); + lsquic_send_ctl_scheduled_ack(&conn->fc_send_ctl, PNS_APP, + packet_out->po_ack2ed); packet_out->po_frame_types |= 1 << QUIC_FRAME_ACK; lsquic_send_ctl_incr_pack_sz(&conn->fc_send_ctl, packet_out, w); packet_out->po_regen_sz += w; @@ -989,8 +1218,7 @@ full_conn_ci_write_ack (struct lsquic_conn *lconn, else conn->fc_flags &= ~FC_ACK_HAD_MISS; LSQ_DEBUG("Put %d bytes of ACK frame into packet on outgoing queue", w); - if (conn->fc_conn.cn_version >= LSQVER_039 && - conn->fc_n_cons_unretx >= 20 && + if (conn->fc_n_cons_unretx >= 20 && !lsquic_send_ctl_have_outgoing_retx_frames(&conn->fc_send_ctl)) { LSQ_DEBUG("schedule WINDOW_UPDATE frame after %u non-retx " @@ -1002,34 +1230,36 @@ full_conn_ci_write_ack (struct lsquic_conn *lconn, static lsquic_stream_t * -new_stream_ext (struct full_conn *conn, uint32_t stream_id, int if_idx, +new_stream_ext (struct full_conn *conn, lsquic_stream_id_t stream_id, int if_idx, enum stream_ctor_flags stream_ctor_flags) { struct lsquic_stream *stream; - stream = lsquic_stream_new_ext(stream_id, &conn->fc_pub, + stream = lsquic_stream_new(stream_id, &conn->fc_pub, conn->fc_stream_ifs[if_idx].stream_if, conn->fc_stream_ifs[if_idx].stream_if_ctx, conn->fc_settings->es_sfcw, - conn->fc_cfg.max_stream_send, stream_ctor_flags); + stream_id == LSQUIC_GQUIC_STREAM_HANDSHAKE + ? 16 * 1024 : conn->fc_cfg.max_stream_send, + stream_ctor_flags); if (stream) - lsquic_hash_insert(conn->fc_pub.all_streams, &stream->id, sizeof(stream->id), - stream); + lsquic_hash_insert(conn->fc_pub.all_streams, &stream->id, + sizeof(stream->id), stream, &stream->sm_hash_el); return stream; } static lsquic_stream_t * -new_stream (struct full_conn *conn, uint32_t stream_id, +new_stream (struct full_conn *conn, lsquic_stream_id_t stream_id, enum stream_ctor_flags flags) { int idx; switch (stream_id) { - case LSQUIC_STREAM_HANDSHAKE: + case LSQUIC_GQUIC_STREAM_HANDSHAKE: idx = STREAM_IF_HSK; flags |= SCF_DI_AUTOSWITCH|SCF_CRITICAL; break; - case LSQUIC_STREAM_HEADERS: + case LSQUIC_GQUIC_STREAM_HEADERS: idx = STREAM_IF_HDR; flags |= SCF_DI_AUTOSWITCH|SCF_CRITICAL; if (!(conn->fc_flags & FC_HTTP) && @@ -1039,6 +1269,8 @@ new_stream (struct full_conn *conn, uint32_t stream_id, default: idx = STREAM_IF_STD; flags |= SCF_DI_AUTOSWITCH; + if (conn->fc_pub.u.gquic.hs) + flags |= SCF_HTTP; if (conn->fc_enpub->enp_settings.es_rw_once) flags |= SCF_DISP_RW_ONCE; break; @@ -1047,7 +1279,7 @@ new_stream (struct full_conn *conn, uint32_t stream_id, } -static uint32_t +static lsquic_stream_id_t generate_stream_id (struct full_conn *conn) { conn->fc_last_stream_id += 2; @@ -1055,16 +1287,16 @@ generate_stream_id (struct full_conn *conn) } -unsigned -lsquic_conn_n_pending_streams (const lsquic_conn_t *lconn) +static unsigned +full_conn_ci_n_pending_streams (const struct lsquic_conn *lconn) { - struct full_conn *conn = (struct full_conn *) lconn; + const struct full_conn *conn = (const struct full_conn *) lconn; return conn->fc_n_delayed_streams; } -unsigned -lsquic_conn_cancel_pending_streams (lsquic_conn_t *lconn, unsigned n) +static unsigned +full_conn_ci_cancel_pending_streams (struct lsquic_conn *lconn, unsigned n) { struct full_conn *conn = (struct full_conn *) lconn; if (n > conn->fc_n_delayed_streams) @@ -1083,8 +1315,8 @@ either_side_going_away (const struct full_conn *conn) } -unsigned -lsquic_conn_n_avail_streams (const lsquic_conn_t *lconn) +static unsigned +full_conn_ci_n_avail_streams (const lsquic_conn_t *lconn) { struct full_conn *conn = (struct full_conn *) lconn; unsigned stream_count = count_streams(conn, 0); @@ -1094,11 +1326,11 @@ lsquic_conn_n_avail_streams (const lsquic_conn_t *lconn) } -void -lsquic_conn_make_stream (lsquic_conn_t *lconn) +static void +full_conn_ci_make_stream (struct lsquic_conn *lconn) { struct full_conn *conn = (struct full_conn *) lconn; - if (lsquic_conn_n_avail_streams(lconn) > 0) + if (full_conn_ci_n_avail_streams(lconn) > 0) { if (!new_stream(conn, generate_stream_id(conn), SCF_CALL_ON_NEW)) ABORT_ERROR("could not create new stream: %s", strerror(errno)); @@ -1116,7 +1348,7 @@ lsquic_conn_make_stream (lsquic_conn_t *lconn) static lsquic_stream_t * -find_stream_by_id (struct full_conn *conn, uint32_t stream_id) +find_stream_by_id (struct full_conn *conn, lsquic_stream_id_t stream_id) { struct lsquic_hash_elem *el; el = lsquic_hash_find(conn->fc_pub.all_streams, &stream_id, sizeof(stream_id)); @@ -1127,22 +1359,54 @@ find_stream_by_id (struct full_conn *conn, uint32_t stream_id) } -lsquic_stream_t * -lsquic_conn_get_stream_by_id (lsquic_conn_t *lconn, uint32_t stream_id) +static struct lsquic_stream * +full_conn_ci_get_stream_by_id (struct lsquic_conn *lconn, + lsquic_stream_id_t stream_id) { struct full_conn *conn = (struct full_conn *) lconn; return find_stream_by_id(conn, stream_id); } -lsquic_engine_t * -lsquic_conn_get_engine (lsquic_conn_t *lconn) +static struct lsquic_engine * +full_conn_ci_get_engine (struct lsquic_conn *lconn) { struct full_conn *conn = (struct full_conn *) lconn; return conn->fc_enpub->enp_engine; } +static struct network_path * +full_conn_ci_get_path (struct lsquic_conn *lconn, const struct sockaddr *sa) +{ + struct full_conn *conn = (struct full_conn *) lconn; + + return &conn->fc_path; +} + + +static unsigned char +full_conn_ci_record_addrs (struct lsquic_conn *lconn, void *peer_ctx, + const struct sockaddr *local_sa, const struct sockaddr *peer_sa) +{ + struct full_conn *conn = (struct full_conn *) lconn; + + if (NP_IS_IPv6(&conn->fc_path) != (AF_INET6 == peer_sa->sa_family)) + lsquic_send_ctl_return_enc_data(&conn->fc_send_ctl); + + size_t len = peer_sa->sa_family == AF_INET ? sizeof(struct sockaddr_in) + : sizeof(struct sockaddr_in6); + + memcpy(conn->fc_path.np_peer_addr, peer_sa, len); + + len = local_sa->sa_family == AF_INET ? sizeof(struct sockaddr_in) + : sizeof(struct sockaddr_in6); + memcpy(conn->fc_path.np_local_addr, local_sa, len); + conn->fc_path.np_peer_ctx = peer_ctx; + return 0; +} + + static ptrdiff_t count_zero_bytes (const unsigned char *p, size_t len) { @@ -1157,15 +1421,9 @@ static unsigned process_padding_frame (struct full_conn *conn, lsquic_packet_in_t *packet_in, const unsigned char *p, size_t len) { - if (conn->fc_conn.cn_version >= LSQVER_039) - return (unsigned) count_zero_bytes(p, len); - if (lsquic_is_zero(p, len)) - { - EV_LOG_PADDING_FRAME_IN(LSQUIC_LOG_CONN_ID, len); - return (unsigned) len; - } - else - return 0; + len = (size_t) count_zero_bytes(p, len); + EV_LOG_PADDING_FRAME_IN(LSQUIC_LOG_CONN_ID, len); + return len; } @@ -1182,7 +1440,7 @@ process_ping_frame (struct full_conn *conn, lsquic_packet_in_t *packet_in, static int -is_peer_initiated (const struct full_conn *conn, uint32_t stream_id) +is_peer_initiated (const struct full_conn *conn, lsquic_stream_id_t stream_id) { unsigned is_server = !!(conn->fc_flags & FC_SERVER); int peer_initiated = (stream_id & 1) == is_server; @@ -1191,7 +1449,7 @@ is_peer_initiated (const struct full_conn *conn, uint32_t stream_id) static void -maybe_schedule_reset_for_stream (struct full_conn *conn, uint32_t stream_id) +maybe_schedule_reset_for_stream (struct full_conn *conn, lsquic_stream_id_t stream_id) { struct stream_id_to_reset *sitr; @@ -1217,6 +1475,20 @@ process_stream_frame (struct full_conn *conn, lsquic_packet_in_t *packet_in, enum enc_level enc_level; int parsed_len; +#ifndef LSQUIC_REDO_FAILED_INSERTION +#define LSQUIC_REDO_FAILED_INSERTION 1 +#endif +#if LSQUIC_REDO_FAILED_INSERTION + enum lsq_log_level saved_levels[3]; +#if defined(__GNUC__) && !defined(__clang__) + /* gcc complains about this -- incorrectly -- in optimized mode */ + saved_levels[0] = 0; + saved_levels[1] = 0; + saved_levels[2] = 0; +#endif + int again = 0; + redo: +#endif stream_frame = lsquic_malo_get(conn->fc_pub.mm->malo.stream_frame); if (!stream_frame) { @@ -1231,19 +1503,22 @@ process_stream_frame (struct full_conn *conn, lsquic_packet_in_t *packet_in, return 0; } EV_LOG_STREAM_FRAME_IN(LSQUIC_LOG_CONN_ID, stream_frame); - LSQ_DEBUG("Got stream frame for stream #%u", stream_frame->stream_id); + LSQ_DEBUG("Got stream frame for stream #%"PRIu64, stream_frame->stream_id); #if LSQUIC_CONN_STATS ++conn->fc_stats.in.stream_frames; conn->fc_stats.in.stream_data_sz += stream_frame->data_frame.df_size; #endif enc_level = lsquic_packet_in_enc_level(packet_in); - if (stream_frame->stream_id != LSQUIC_STREAM_HANDSHAKE + if (stream_frame->stream_id != LSQUIC_GQUIC_STREAM_HANDSHAKE +#if LSQUIC_ENABLE_HANDSHAKE_DISABLE + && !(conn->fc_conn.cn_flags & LSCONN_NO_CRYPTO) +#endif && enc_level != ENC_LEV_FORW && enc_level != ENC_LEV_INIT) { lsquic_malo_put(stream_frame); - ABORT_ERROR("received unencrypted data for stream %u", + ABORT_ERROR("received unencrypted data for stream %"PRIu64, stream_frame->stream_id); return 0; } @@ -1260,7 +1535,7 @@ process_stream_frame (struct full_conn *conn, lsquic_packet_in_t *packet_in, { if (lsquic_stream_is_reset(stream)) { - LSQ_DEBUG("stream %u is reset, ignore frame", stream->id); + LSQ_DEBUG("stream %"PRIu64" is reset, ignore frame", stream->id); lsquic_malo_put(stream_frame); return parsed_len; } @@ -1269,7 +1544,8 @@ process_stream_frame (struct full_conn *conn, lsquic_packet_in_t *packet_in, { if (conn_is_stream_closed(conn, stream_frame->stream_id)) { - LSQ_DEBUG("drop frame for closed stream %u", stream_frame->stream_id); + LSQ_DEBUG("drop frame for closed stream %"PRIu64, + stream_frame->stream_id); lsquic_malo_put(stream_frame); return parsed_len; } @@ -1296,7 +1572,7 @@ process_stream_frame (struct full_conn *conn, lsquic_packet_in_t *packet_in, if ((conn->fc_flags & FC_GOING_AWAY) && stream_frame->stream_id > conn->fc_max_peer_stream_id) { - LSQ_DEBUG("going away: reset new incoming stream %"PRIu32, + LSQ_DEBUG("going away: reset new incoming stream %"PRIu64, stream_frame->stream_id); maybe_schedule_reset_for_stream(conn, stream_frame->stream_id); lsquic_malo_put(stream_frame); @@ -1324,11 +1600,33 @@ process_stream_frame (struct full_conn *conn, lsquic_packet_in_t *packet_in, if (0 != lsquic_stream_frame_in(stream, stream_frame)) { ABORT_ERROR("cannot insert stream frame"); +#if LSQUIC_REDO_FAILED_INSERTION + if (again++) + { + lsq_log_levels[LSQLM_STREAM] = saved_levels[0]; + lsq_log_levels[LSQLM_DI] = saved_levels[1]; + lsq_log_levels[LSQLM_CONN] = saved_levels[2]; + } + else if (!(LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_STREAM) + && LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_DI) + && LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_CONN))) + { + saved_levels[0] = lsq_log_levels[LSQLM_STREAM]; + saved_levels[1] = lsq_log_levels[LSQLM_DI]; + saved_levels[2] = lsq_log_levels[LSQLM_CONN]; + lsq_log_levels[LSQLM_STREAM] = LSQ_LOG_DEBUG; + lsq_log_levels[LSQLM_DI] = LSQ_LOG_DEBUG; + lsq_log_levels[LSQLM_CONN] = LSQ_LOG_DEBUG; + lsquic_stream_dump_state(stream); + LSQ_DEBUG("inserting frame again, this time with debug logging"); + goto redo; + } +#endif return 0; } - if (stream->id == LSQUIC_STREAM_HANDSHAKE - && (stream->stream_flags & STREAM_WANT_READ) + if (stream->id == LSQUIC_GQUIC_STREAM_HANDSHAKE + && (stream->sm_qflags & SMQF_WANT_READ) && !(conn->fc_flags & FC_SERVER) && !(conn->fc_conn.cn_flags & LSCONN_HANDSHAKE_DONE)) { /* To enable decryption, process handshake stream as soon as its @@ -1382,7 +1680,8 @@ static unsigned process_goaway_frame (struct full_conn *conn, lsquic_packet_in_t *packet_in, const unsigned char *p, size_t len) { - uint32_t error_code, stream_id; + lsquic_stream_id_t stream_id; + uint32_t error_code; uint16_t reason_length; const char *reason; const int parsed_len = conn->fc_conn.cn_pf->pf_parse_goaway_frame(p, len, @@ -1391,8 +1690,9 @@ process_goaway_frame (struct full_conn *conn, lsquic_packet_in_t *packet_in, return 0; EV_LOG_GOAWAY_FRAME_IN(LSQUIC_LOG_CONN_ID, error_code, stream_id, reason_length, reason); - LSQ_DEBUG("received GOAWAY frame, last good stream ID: %u, error code: 0x%X," - " reason: `%.*s'", stream_id, error_code, reason_length, reason); + LSQ_DEBUG("received GOAWAY frame, last good stream ID: %"PRIu64 + ", error code: 0x%X, reason: `%.*s'", stream_id, error_code, + reason_length, reason); if (0 == (conn->fc_conn.cn_flags & LSCONN_PEER_GOING_AWAY)) { conn->fc_conn.cn_flags |= LSCONN_PEER_GOING_AWAY; @@ -1425,7 +1725,7 @@ log_invalid_ack_frame (struct full_conn *conn, const unsigned char *p, { lsquic_senhist_tostr(&conn->fc_send_ctl.sc_senhist, buf, 0x1000); LSQ_WARN("send history: %s", buf); - hexdump(p, parsed_len, buf, 0x1000); + lsquic_hexdump(p, parsed_len, buf, 0x1000); LSQ_WARN("raw ACK frame:\n%s", buf); free(buf); } @@ -1445,17 +1745,18 @@ log_invalid_ack_frame (struct full_conn *conn, const unsigned char *p, static int process_ack (struct full_conn *conn, struct ack_info *acki, - lsquic_time_t received) + lsquic_time_t received, lsquic_time_t now) { #if LSQUIC_CONN_STATS ++conn->fc_stats.in.n_acks_proc; #endif LSQ_DEBUG("Processing ACK"); - if (0 == lsquic_send_ctl_got_ack(&conn->fc_send_ctl, acki, received)) + if (0 == lsquic_send_ctl_got_ack(&conn->fc_send_ctl, acki, received, now)) { - if (lsquic_send_ctl_largest_ack2ed(&conn->fc_send_ctl)) + if (lsquic_send_ctl_largest_ack2ed(&conn->fc_send_ctl, PNS_APP)) lsquic_rechist_stop_wait(&conn->fc_rechist, - lsquic_send_ctl_largest_ack2ed(&conn->fc_send_ctl) + 1); + lsquic_send_ctl_largest_ack2ed(&conn->fc_send_ctl, PNS_APP) + + 1); return 0; } else @@ -1467,7 +1768,8 @@ process_ack (struct full_conn *conn, struct ack_info *acki, static int -process_saved_ack (struct full_conn *conn, int restore_parsed_ack) +process_saved_ack (struct full_conn *conn, int restore_parsed_ack, + lsquic_time_t now) { struct ack_info *const acki = conn->fc_pub.mm->acki; struct lsquic_packno_range range; @@ -1491,12 +1793,13 @@ process_saved_ack (struct full_conn *conn, int restore_parsed_ack) range = acki->ranges[0]; } + acki->pns = PNS_APP; acki->n_ranges = 1; acki->n_timestamps = conn->fc_saved_ack_info.sai_n_timestamps; acki->lack_delta = conn->fc_saved_ack_info.sai_lack_delta; acki->ranges[0] = conn->fc_saved_ack_info.sai_range; - retval = process_ack(conn, acki, conn->fc_saved_ack_received); + retval = process_ack(conn, acki, conn->fc_saved_ack_received, now); if (restore_parsed_ack) { @@ -1567,21 +1870,28 @@ process_ack_frame (struct full_conn *conn, lsquic_packet_in_t *packet_in, { struct ack_info *const new_acki = conn->fc_pub.mm->acki; int parsed_len; + lsquic_time_t warn_time; #if LSQUIC_CONN_STATS ++conn->fc_stats.in.n_acks; #endif - parsed_len = conn->fc_conn.cn_pf->pf_parse_ack_frame(p, len, new_acki); + parsed_len = conn->fc_conn.cn_pf->pf_parse_ack_frame(p, len, new_acki, 0); if (parsed_len < 0) goto err; + if (empty_ack_frame(new_acki)) + { + LSQ_DEBUG("Ignore empty ACK frame"); + return parsed_len; + } if (packet_in->pi_packno <= conn->fc_max_ack_packno) { LSQ_DEBUG("Ignore old ack (max %"PRIu64")", conn->fc_max_ack_packno); return parsed_len; } + new_acki->pns = PNS_APP; EV_LOG_ACK_FRAME_IN(LSQUIC_LOG_CONN_ID, new_acki); conn->fc_max_ack_packno = packet_in->pi_packno; @@ -1608,9 +1918,10 @@ process_ack_frame (struct full_conn *conn, lsquic_packet_in_t *packet_in, ; } else - process_saved_ack(conn, 1); + process_saved_ack(conn, 1, packet_in->pi_received); conn->fc_flags &= ~FC_HAVE_SAVED_ACK; - if (0 != process_ack(conn, new_acki, packet_in->pi_received)) + if (0 != process_ack(conn, new_acki, packet_in->pi_received, + packet_in->pi_received)) goto err; break; case (0 << 1) | (1 << 0): @@ -1623,7 +1934,7 @@ process_ack_frame (struct full_conn *conn, lsquic_packet_in_t *packet_in, } else { - process_saved_ack(conn, 1); + process_saved_ack(conn, 1, packet_in->pi_received); conn->fc_saved_ack_info.sai_n_timestamps = new_acki->n_timestamps; conn->fc_saved_ack_info.sai_range = new_acki->ranges[0]; } @@ -1632,7 +1943,8 @@ process_ack_frame (struct full_conn *conn, lsquic_packet_in_t *packet_in, break; case (1 << 1) | (0 << 0): conn->fc_flags &= ~FC_HAVE_SAVED_ACK; - if (0 != process_ack(conn, new_acki, packet_in->pi_received)) + if (0 != process_ack(conn, new_acki, packet_in->pi_received, + packet_in->pi_received)) goto err; break; case (1 << 1) | (1 << 0): @@ -1651,13 +1963,21 @@ process_ack_frame (struct full_conn *conn, lsquic_packet_in_t *packet_in, conn->fc_saved_ack_received = packet_in->pi_received; conn->fc_flags |= FC_HAVE_SAVED_ACK; } - else if (0 != process_ack(conn, new_acki, packet_in->pi_received)) + else if (0 != process_ack(conn, new_acki, packet_in->pi_received, + packet_in->pi_received)) goto err; return parsed_len; err: - log_invalid_ack_frame(conn, p, parsed_len, new_acki); + warn_time = lsquic_time_now(); + if (0 == conn->fc_enpub->enp_last_warning[WT_ACKPARSE_FULL] + || conn->fc_enpub->enp_last_warning[WT_ACKPARSE_FULL] + + WARNING_INTERVAL < warn_time) + { + conn->fc_enpub->enp_last_warning[WT_ACKPARSE_FULL] = warn_time; + log_invalid_ack_frame(conn, p, parsed_len, new_acki); + } return 0; } @@ -1721,13 +2041,22 @@ static unsigned process_blocked_frame (struct full_conn *conn, lsquic_packet_in_t *packet_in, const unsigned char *p, size_t len) { - uint32_t stream_id; + lsquic_stream_id_t stream_id; + struct lsquic_stream *stream; const int parsed_len = conn->fc_conn.cn_pf->pf_parse_blocked_frame(p, len, &stream_id); if (parsed_len < 0) return 0; EV_LOG_BLOCKED_FRAME_IN(LSQUIC_LOG_CONN_ID, stream_id); - LSQ_DEBUG("Peer reports stream %u as blocked", stream_id); + LSQ_DEBUG("Peer reports stream %"PRIu64" as blocked", stream_id); + if (stream_id) + { + stream = find_stream_by_id(conn, stream_id); + if (stream) + lsquic_stream_peer_blocked_gquic(stream); + } + else + conn->fc_flags |= FC_SEND_WUF; return parsed_len; } @@ -1738,18 +2067,18 @@ process_connection_close_frame (struct full_conn *conn, lsquic_packet_in_t *pack { lsquic_stream_t *stream; struct lsquic_hash_elem *el; - uint32_t error_code; + uint64_t error_code; uint16_t reason_len; uint8_t reason_off; int parsed_len; parsed_len = conn->fc_conn.cn_pf->pf_parse_connect_close_frame(p, len, - &error_code, &reason_len, &reason_off); + NULL, &error_code, &reason_len, &reason_off); if (parsed_len < 0) return 0; EV_LOG_CONNECTION_CLOSE_FRAME_IN(LSQUIC_LOG_CONN_ID, error_code, (int) reason_len, (const char *) p + reason_off); - LSQ_INFO("Received CONNECTION_CLOSE frame (code: %u; reason: %.*s)", + LSQ_INFO("Received CONNECTION_CLOSE frame (code: %"PRIu64"; reason: %.*s)", error_code, (int) reason_len, (const char *) p + reason_off); conn->fc_flags |= FC_RECV_CLOSE; if (!(conn->fc_flags & FC_CLOSING)) @@ -1770,8 +2099,8 @@ static unsigned process_rst_stream_frame (struct full_conn *conn, lsquic_packet_in_t *packet_in, const unsigned char *p, size_t len) { - uint32_t stream_id, error_code; - uint64_t offset; + lsquic_stream_id_t stream_id; + uint64_t offset, error_code; lsquic_stream_t *stream; const int parsed_len = conn->fc_conn.cn_pf->pf_parse_rst_frame(p, len, &stream_id, &offset, &error_code); @@ -1780,7 +2109,7 @@ process_rst_stream_frame (struct full_conn *conn, lsquic_packet_in_t *packet_in, EV_LOG_RST_STREAM_FRAME_IN(LSQUIC_LOG_CONN_ID, stream_id, offset, error_code); - LSQ_DEBUG("Got RST_STREAM; stream: %u; offset: 0x%"PRIX64, stream_id, + LSQ_DEBUG("Got RST_STREAM; stream: %"PRIu64"; offset: 0x%"PRIX64, stream_id, offset); if (0 == stream_id) { /* Follow reference implementation and ignore this apparently @@ -1789,10 +2118,9 @@ process_rst_stream_frame (struct full_conn *conn, lsquic_packet_in_t *packet_in, return parsed_len; } - if (LSQUIC_STREAM_HANDSHAKE == stream_id || - ((conn->fc_flags & FC_HTTP) && LSQUIC_STREAM_HEADERS == stream_id)) + if (lsquic_stream_id_is_critical(conn->fc_flags & FC_HTTP, stream_id)) { - ABORT_ERROR("received reset on static stream %u", stream_id); + ABORT_ERROR("received reset on static stream %"PRIu64, stream_id); return 0; } @@ -1801,12 +2129,12 @@ process_rst_stream_frame (struct full_conn *conn, lsquic_packet_in_t *packet_in, { if (conn_is_stream_closed(conn, stream_id)) { - LSQ_DEBUG("got reset frame for closed stream %u", stream_id); + LSQ_DEBUG("got reset frame for closed stream %"PRIu64, stream_id); return parsed_len; } if (!is_peer_initiated(conn, stream_id)) { - ABORT_ERROR("received reset for never-initiated stream %u", + ABORT_ERROR("received reset for never-initiated stream %"PRIu64, stream_id); return 0; } @@ -1833,7 +2161,7 @@ static unsigned process_window_update_frame (struct full_conn *conn, lsquic_packet_in_t *packet_in, const unsigned char *p, size_t len) { - uint32_t stream_id; + lsquic_stream_id_t stream_id; uint64_t offset; const int parsed_len = conn->fc_conn.cn_pf->pf_parse_window_update_frame(p, len, @@ -1846,13 +2174,13 @@ process_window_update_frame (struct full_conn *conn, lsquic_packet_in_t *packet_ lsquic_stream_t *stream = find_stream_by_id(conn, stream_id); if (stream) { - LSQ_DEBUG("Got window update frame, stream: %u; offset: 0x%"PRIX64, - stream_id, offset); + LSQ_DEBUG("Got window update frame, stream: %"PRIu64 + "; offset: 0x%"PRIX64, stream_id, offset); lsquic_stream_window_update(stream, offset); } else /* Perhaps a result of lost packets? */ - LSQ_DEBUG("Got window update frame for non-existing stream %u " - "(offset: 0x%"PRIX64")", stream_id, offset); + LSQ_DEBUG("Got window update frame for non-existing stream %"PRIu64 + " (offset: 0x%"PRIX64")", stream_id, offset); } else if (offset > conn->fc_pub.conn_cap.cc_max) { @@ -1920,7 +2248,7 @@ process_ver_neg_packet (struct full_conn *conn, lsquic_packet_in_t *packet_in) { versions |= 1 << version; LSQ_DEBUG("server supports version %s", lsquic_ver2str[version]); - EV_LOG_VER_NEG(conn->fc_conn.cn_cid, + EV_LOG_VER_NEG(LSQUIC_LOG_CONN_ID, "supports", lsquic_ver2str[version]); } } @@ -1963,11 +2291,22 @@ reconstruct_packet_number (struct full_conn *conn, lsquic_packet_in_t *packet_in } -static int +static enum dec_packin conn_decrypt_packet (struct full_conn *conn, lsquic_packet_in_t *packet_in) { - return lsquic_conn_decrypt_packet(&conn->fc_conn, conn->fc_enpub, - packet_in); +#if LSQUIC_ENABLE_HANDSHAKE_DISABLE + if (conn->fc_conn.cn_flags & LSCONN_NO_CRYPTO) + { + (void) lsquic_conn_copy_and_release_pi_data(&conn->fc_conn, + conn->fc_enpub, packet_in); + packet_in->pi_flags |= PI_DECRYPTED; + return DECPI_OK; + } + else +#endif + return conn->fc_conn.cn_esf_c->esf_decrypt_packet( + conn->fc_conn.cn_enc_session, conn->fc_enpub, + &conn->fc_conn, packet_in); } @@ -1999,7 +2338,7 @@ conn_is_stateless_reset (const struct full_conn *conn, const struct lsquic_packet_in *packet_in) { return packet_in->pi_data_sz > SRST_LENGTH - && 0 == conn->fc_conn.cn_esf->esf_verify_reset_token( + && 0 == conn->fc_conn.cn_esf_c->esf_verify_reset_token( conn->fc_conn.cn_enc_session, packet_in->pi_data + packet_in->pi_data_sz - SRST_LENGTH, SRST_LENGTH); @@ -2025,7 +2364,7 @@ process_regular_packet (struct full_conn *conn, lsquic_packet_in_t *packet_in) * history and subsequent good packet won't be marked as a duplicate. */ if (0 == (packet_in->pi_flags & PI_DECRYPTED) && - 0 != conn_decrypt_packet(conn, packet_in)) + DECPI_OK != conn_decrypt_packet(conn, packet_in)) { if (conn_is_stateless_reset(conn, packet_in)) { @@ -2048,15 +2387,25 @@ process_regular_packet (struct full_conn *conn, lsquic_packet_in_t *packet_in) switch (st) { case REC_ST_OK: parse_regular_packet(conn, packet_in); - if (0 == (conn->fc_flags & FC_ACK_QUEUED)) + if (0 == (conn->fc_flags & (FC_ACK_QUEUED|FC_GOT_SREJ))) { frame_types = packet_in->pi_frame_types; + if ((conn->fc_flags & FC_GOING_AWAY) + && lsquic_hash_count(conn->fc_pub.all_streams) < 3) + { + /* Ignore PING frames if we are going away and there are no + * active streams. (HANDSHAKE and HEADERS streams are the + * two streams that are always in the all_streams hash). + */ + frame_types &= ~(1 << QUIC_FRAME_PING); + } was_missing = packet_in->pi_packno != lsquic_rechist_largest_packno(&conn->fc_rechist); - conn->fc_n_slack_all += 1; - conn->fc_n_slack_akbl += !!(frame_types & QFRAME_ACKABLE_MASK); + conn->fc_n_slack_akbl += !!(frame_types & GQUIC_FRAME_ACKABLE_MASK); try_queueing_ack(conn, was_missing, packet_in->pi_received); } + else if (conn->fc_flags & FC_GOT_SREJ) + conn->fc_flags &= ~FC_GOT_SREJ; return 0; case REC_ST_DUP: #if LSQUIC_CONN_STATS @@ -2077,6 +2426,11 @@ process_regular_packet (struct full_conn *conn, lsquic_packet_in_t *packet_in) } +/* TODO: Possible optimization: in server mode, we do not perform version + * negotiation. We can use different functions in client mode (this + * function) and server mode (a different, faster function that ignores + * version flags). + */ static int process_incoming_packet (struct full_conn *conn, lsquic_packet_in_t *packet_in) { @@ -2100,20 +2454,17 @@ process_incoming_packet (struct full_conn *conn, lsquic_packet_in_t *packet_in) conn->fc_ver_neg.vn_tag = NULL; conn->fc_conn.cn_version = conn->fc_ver_neg.vn_ver; conn->fc_conn.cn_flags |= LSCONN_VER_SET; - if (conn->fc_conn.cn_version >= LSQVER_039) + assert(!(conn->fc_flags & FC_NSTP)); /* This bit off at start */ + if (conn->fc_conn.cn_version >= LSQVER_046 + || conn->fc_settings->es_support_nstp) { - assert(!(conn->fc_flags & FC_NSTP)); /* This bit off at start */ - if (conn->fc_conn.cn_version >= LSQVER_044 - || conn->fc_settings->es_support_nstp) - { - conn->fc_flags |= FC_NSTP; - lsquic_send_ctl_turn_nstp_on(&conn->fc_send_ctl); - } + conn->fc_flags |= FC_NSTP; + lsquic_send_ctl_turn_nstp_on(&conn->fc_send_ctl); } LSQ_DEBUG("end of version negotiation: agreed upon %s", lsquic_ver2str[conn->fc_ver_neg.vn_ver]); lsquic_send_ctl_verneg_done(&conn->fc_send_ctl); - EV_LOG_VER_NEG(conn->fc_conn.cn_cid, + EV_LOG_VER_NEG(LSQUIC_LOG_CONN_ID, "agreed", lsquic_ver2str[conn->fc_ver_neg.vn_ver]); } return process_regular_packet(conn, packet_in); @@ -2143,7 +2494,8 @@ process_incoming_packet (struct full_conn *conn, lsquic_packet_in_t *packet_in) static void -idle_alarm_expired (void *ctx, lsquic_time_t expiry, lsquic_time_t now) +idle_alarm_expired (enum alarm_id al_id, void *ctx, lsquic_time_t expiry, + lsquic_time_t now) { struct full_conn *conn = ctx; LSQ_DEBUG("connection timed out"); @@ -2152,7 +2504,8 @@ idle_alarm_expired (void *ctx, lsquic_time_t expiry, lsquic_time_t now) static void -handshake_alarm_expired (void *ctx, lsquic_time_t expiry, lsquic_time_t now) +handshake_alarm_expired (enum alarm_id al_id, void *ctx, + lsquic_time_t expiry, lsquic_time_t now) { struct full_conn *conn = ctx; LSQ_DEBUG("connection timed out: handshake timed out"); @@ -2161,7 +2514,8 @@ handshake_alarm_expired (void *ctx, lsquic_time_t expiry, lsquic_time_t now) static void -ping_alarm_expired (void *ctx, lsquic_time_t expiry, lsquic_time_t now) +ping_alarm_expired (enum alarm_id al_id, void *ctx, lsquic_time_t expiry, + lsquic_time_t now) { struct full_conn *conn = ctx; LSQ_DEBUG("Ping alarm rang: schedule PING frame to be generated"); @@ -2175,9 +2529,9 @@ get_writeable_packet (struct full_conn *conn, unsigned need_at_least) lsquic_packet_out_t *packet_out; int is_err; - assert(need_at_least <= QUIC_MAX_PAYLOAD_SZ); + assert(need_at_least <= GQUIC_MAX_PAYLOAD_SZ); packet_out = lsquic_send_ctl_get_writeable_packet(&conn->fc_send_ctl, - need_at_least, &is_err); + PNS_APP, need_at_least, &conn->fc_path, 0, &is_err); if (!packet_out && is_err) ABORT_ERROR("cannot allocate packet: %s", strerror(errno)); return packet_out; @@ -2187,7 +2541,7 @@ get_writeable_packet (struct full_conn *conn, unsigned need_at_least) static int generate_wuf_stream (struct full_conn *conn, lsquic_stream_t *stream) { - lsquic_packet_out_t *packet_out = get_writeable_packet(conn, QUIC_WUF_SZ); + lsquic_packet_out_t *packet_out = get_writeable_packet(conn, GQUIC_WUF_SZ); if (!packet_out) return 0; const uint64_t recv_off = lsquic_stream_fc_recv_off(stream); @@ -2200,7 +2554,10 @@ generate_wuf_stream (struct full_conn *conn, lsquic_stream_t *stream) } lsquic_send_ctl_incr_pack_sz(&conn->fc_send_ctl, packet_out, sz); packet_out->po_frame_types |= 1 << QUIC_FRAME_WINDOW_UPDATE; - LSQ_DEBUG("wrote WUF: stream %u; offset 0x%"PRIX64, stream->id, recv_off); + LSQ_DEBUG("wrote WUF: stream %"PRIu64"; offset 0x%"PRIX64, stream->id, + recv_off); + EV_LOG_CONN_EVENT(LSQUIC_LOG_CONN_ID, + "wrote WUF: stream %"PRIu64"; offset 0x%"PRIX64, stream->id, recv_off); return 1; } @@ -2209,7 +2566,7 @@ static void generate_wuf_conn (struct full_conn *conn) { assert(conn->fc_flags & FC_SEND_WUF); - lsquic_packet_out_t *packet_out = get_writeable_packet(conn, QUIC_WUF_SZ); + lsquic_packet_out_t *packet_out = get_writeable_packet(conn, GQUIC_WUF_SZ); if (!packet_out) return; const uint64_t recv_off = lsquic_cfcw_get_fc_recv_off(&conn->fc_pub.cfcw); @@ -2227,12 +2584,40 @@ generate_wuf_conn (struct full_conn *conn) } +static void +maybe_close_conn (struct full_conn *conn) +{ +#ifndef NDEBUG + struct lsquic_stream *stream; + struct lsquic_hash_elem *el; +#endif + + if ((conn->fc_flags & (FC_CLOSING|FC_GOAWAY_SENT|FC_SERVER)) + == (FC_GOAWAY_SENT|FC_SERVER) + && lsquic_hash_count(conn->fc_pub.all_streams) == 2) + { +#ifndef NDEBUG + for (el = lsquic_hash_first(conn->fc_pub.all_streams); el; + el = lsquic_hash_next(conn->fc_pub.all_streams)) + { + stream = lsquic_hashelem_getdata(el); + assert(LSQUIC_GQUIC_STREAM_HANDSHAKE == stream->id + || LSQUIC_GQUIC_STREAM_HEADERS == stream->id); + } +#endif + conn->fc_flags |= FC_RECV_CLOSE; /* Fake -- trigger "ok to close" */ + conn->fc_flags |= FC_CLOSING; + LSQ_DEBUG("closing connection: GOAWAY sent and no responses remain"); + } +} + + static void generate_goaway_frame (struct full_conn *conn) { int reason_len = 0; lsquic_packet_out_t *packet_out = - get_writeable_packet(conn, QUIC_GOAWAY_FRAME_SZ + reason_len); + get_writeable_packet(conn, GQUIC_GOAWAY_FRAME_SZ + reason_len); if (!packet_out) return; int sz = conn->fc_conn.cn_pf->pf_gen_goaway_frame( @@ -2247,7 +2632,9 @@ generate_goaway_frame (struct full_conn *conn) packet_out->po_frame_types |= 1 << QUIC_FRAME_GOAWAY; conn->fc_flags &= ~FC_SEND_GOAWAY; conn->fc_flags |= FC_GOAWAY_SENT; - LSQ_DEBUG("wrote GOAWAY frame: stream id: %u", conn->fc_max_peer_stream_id); + LSQ_DEBUG("wrote GOAWAY frame: stream id: %"PRIu64, + conn->fc_max_peer_stream_id); + maybe_close_conn(conn); } @@ -2256,7 +2643,8 @@ generate_connection_close_packet (struct full_conn *conn) { lsquic_packet_out_t *packet_out; - packet_out = lsquic_send_ctl_new_packet_out(&conn->fc_send_ctl, 0); + packet_out = lsquic_send_ctl_new_packet_out(&conn->fc_send_ctl, 0, PNS_APP, + &conn->fc_path); if (!packet_out) { ABORT_ERROR("cannot allocate packet: %s", strerror(errno)); @@ -2265,7 +2653,7 @@ generate_connection_close_packet (struct full_conn *conn) lsquic_send_ctl_scheduled_one(&conn->fc_send_ctl, packet_out); int sz = conn->fc_conn.cn_pf->pf_gen_connect_close_frame(packet_out->po_data + packet_out->po_data_sz, - lsquic_packet_out_avail(packet_out), 16 /* PEER_GOING_AWAY */, + lsquic_packet_out_avail(packet_out), 0, 16 /* PEER_GOING_AWAY */, NULL, 0); if (sz < 0) { ABORT_ERROR("generate_connection_close_packet failed"); @@ -2278,10 +2666,10 @@ generate_connection_close_packet (struct full_conn *conn) static int -generate_blocked_frame (struct full_conn *conn, uint32_t stream_id) +generate_blocked_frame (struct full_conn *conn, lsquic_stream_id_t stream_id) { lsquic_packet_out_t *packet_out = - get_writeable_packet(conn, QUIC_BLOCKED_FRAME_SZ); + get_writeable_packet(conn, GQUIC_BLOCKED_FRAME_SZ); if (!packet_out) return 0; int sz = conn->fc_conn.cn_pf->pf_gen_blocked_frame( @@ -2293,7 +2681,7 @@ generate_blocked_frame (struct full_conn *conn, uint32_t stream_id) } lsquic_send_ctl_incr_pack_sz(&conn->fc_send_ctl, packet_out, sz); packet_out->po_frame_types |= 1 << QUIC_FRAME_BLOCKED; - LSQ_DEBUG("wrote blocked frame: stream %u", stream_id); + LSQ_DEBUG("wrote blocked frame: stream %"PRIu64, stream_id); return 1; } @@ -2317,7 +2705,7 @@ generate_rst_stream_frame (struct full_conn *conn, lsquic_stream_t *stream) lsquic_packet_out_t *packet_out; int sz, s; - packet_out = get_writeable_packet(conn, QUIC_RST_STREAM_SZ); + packet_out = get_writeable_packet(conn, GQUIC_RST_STREAM_SZ); if (!packet_out) return 0; /* TODO Possible optimization: instead of using stream->tosend_off as the @@ -2344,8 +2732,8 @@ generate_rst_stream_frame (struct full_conn *conn, lsquic_stream_t *stream) return 0; } lsquic_stream_rst_frame_sent(stream); - LSQ_DEBUG("wrote RST: stream %u; offset 0x%"PRIX64"; error code 0x%X", - stream->id, stream->tosend_off, stream->error_code); + LSQ_DEBUG("wrote RST: stream %"PRIu64"; offset 0x%"PRIX64"; error code " + "%"PRIu64, stream->id, stream->tosend_off, stream->error_code); return 1; } @@ -2429,11 +2817,11 @@ static int process_stream_ready_to_send (struct full_conn *conn, lsquic_stream_t *stream) { int r = 1; - if (stream->stream_flags & STREAM_SEND_WUF) + if (stream->sm_qflags & SMQF_SEND_WUF) r &= generate_wuf_stream(conn, stream); - if (stream->stream_flags & STREAM_SEND_BLOCKED) + if (stream->sm_qflags & SMQF_SEND_BLOCKED) r &= generate_stream_blocked_frame(conn, stream); - if (stream->stream_flags & STREAM_SEND_RST) + if (stream->sm_qflags & SMQF_SEND_RST) r &= generate_rst_stream_frame(conn, stream); return r; } @@ -2450,7 +2838,7 @@ process_streams_ready_to_send (struct full_conn *conn) lsquic_spi_init(&spi, TAILQ_FIRST(&conn->fc_pub.sending_streams), TAILQ_LAST(&conn->fc_pub.sending_streams, lsquic_streams_tailq), (uintptr_t) &TAILQ_NEXT((lsquic_stream_t *) NULL, next_send_stream), - STREAM_SENDING_FLAGS, conn->fc_conn.cn_cid, "send", NULL, NULL); + SMQF_SENDING_FLAGS, &conn->fc_conn, "send", NULL, NULL); for (stream = lsquic_spi_first(&spi); stream; stream = lsquic_spi_next(&spi)) @@ -2461,12 +2849,12 @@ process_streams_ready_to_send (struct full_conn *conn) /* Return true if packetized, false otherwise */ static int -packetize_standalone_stream_reset (struct full_conn *conn, uint32_t stream_id) +packetize_standalone_stream_reset (struct full_conn *conn, lsquic_stream_id_t stream_id) { lsquic_packet_out_t *packet_out; int sz; - packet_out = get_writeable_packet(conn, QUIC_RST_STREAM_SZ); + packet_out = get_writeable_packet(conn, GQUIC_RST_STREAM_SZ); if (!packet_out) return 0; @@ -2480,7 +2868,7 @@ packetize_standalone_stream_reset (struct full_conn *conn, uint32_t stream_id) } lsquic_send_ctl_incr_pack_sz(&conn->fc_send_ctl, packet_out, sz); packet_out->po_frame_types |= 1 << QUIC_FRAME_RST_STREAM; - LSQ_DEBUG("generated standalone RST_STREAM frame for stream %"PRIu32, + LSQ_DEBUG("generated standalone RST_STREAM frame for stream %"PRIu64, stream_id); return 1; } @@ -2562,18 +2950,18 @@ service_streams (struct full_conn *conn) for (stream = TAILQ_FIRST(&conn->fc_pub.service_streams); stream; stream = next) { next = TAILQ_NEXT(stream, next_service_stream); - if (stream->stream_flags & STREAM_ABORT_CONN) + if (stream->sm_qflags & SMQF_ABORT_CONN) /* No need to unset this flag or remove this stream: the connection * is about to be aborted. */ - ABORT_ERROR("aborted due to error in stream %"PRIu32, stream->id); - if (stream->stream_flags & STREAM_CALL_ONCLOSE) + ABORT_ERROR("aborted due to error in stream %"PRIu64, stream->id); + if (stream->sm_qflags & SMQF_CALL_ONCLOSE) { lsquic_stream_call_on_close(stream); closed_some |= is_our_stream(conn, stream); conn_mark_stream_closed(conn, stream->id); } - if (stream->stream_flags & STREAM_FREE_STREAM) + if (stream->sm_qflags & SMQF_FREE_STREAM) { TAILQ_REMOVE(&conn->fc_pub.service_streams, stream, next_service_stream); el = lsquic_hash_find(conn->fc_pub.all_streams, &stream->id, sizeof(stream->id)); @@ -2585,6 +2973,7 @@ service_streams (struct full_conn *conn) } if (either_side_going_away(conn)) + { while (conn->fc_n_delayed_streams) { --conn->fc_n_delayed_streams; @@ -2592,41 +2981,84 @@ service_streams (struct full_conn *conn) (void) conn->fc_stream_ifs[STREAM_IF_STD].stream_if->on_new_stream( conn->fc_stream_ifs[STREAM_IF_STD].stream_if_ctx, NULL); } + maybe_close_conn(conn); + } else if (closed_some && conn->fc_n_delayed_streams) create_delayed_streams(conn); } +struct filter_stream_ctx +{ + struct full_conn *conn; + uint32_t last_stream_id, + max_peer_stream_id; +}; + + +static int +filter_out_old_streams (void *ctx, lsquic_stream_t *stream) +{ + struct filter_stream_ctx *const fctx = ctx; + return ((!((stream->id ^ fctx->last_stream_id) & 1) && + stream->id > fctx->last_stream_id) + || + (!((stream->id ^ fctx->max_peer_stream_id) & 1) && + stream->id > fctx->max_peer_stream_id)); +} + + static void process_streams_read_events (struct full_conn *conn) { lsquic_stream_t *stream; - enum stream_flags service_flags; + struct filter_stream_ctx fctx; + enum stream_q_flags q_flags; int needs_service; struct stream_prio_iter spi; if (TAILQ_EMPTY(&conn->fc_pub.read_streams)) return; + fctx.last_stream_id = conn->fc_last_stream_id; + fctx.max_peer_stream_id = conn->fc_max_peer_stream_id; lsquic_spi_init(&spi, TAILQ_FIRST(&conn->fc_pub.read_streams), TAILQ_LAST(&conn->fc_pub.read_streams, lsquic_streams_tailq), (uintptr_t) &TAILQ_NEXT((lsquic_stream_t *) NULL, next_read_stream), - STREAM_WANT_READ, conn->fc_conn.cn_cid, "read", NULL, NULL); + SMQF_WANT_READ, &conn->fc_conn, "read", NULL, NULL); needs_service = 0; for (stream = lsquic_spi_first(&spi); stream; stream = lsquic_spi_next(&spi)) { - service_flags = stream->stream_flags & STREAM_SERVICE_FLAGS; + q_flags = stream->sm_qflags & SMQF_SERVICE_FLAGS; lsquic_stream_dispatch_read_events(stream); - needs_service |= service_flags - ^ (stream->stream_flags & STREAM_SERVICE_FLAGS); + needs_service |= q_flags ^ (stream->sm_qflags & SMQF_SERVICE_FLAGS); } if (needs_service) service_streams(conn); + /* If new streams were created as result of the read dispatching above, + * process these new streams. This logic is only applicable to in the + * server mode, as a client that creates a stream from an on_read() event + * is not likely to want to *read* from it immediately. + */ + if ((conn->fc_flags & FC_SERVER) && + (fctx.last_stream_id < conn->fc_last_stream_id || + fctx.max_peer_stream_id < conn->fc_max_peer_stream_id)) + { + fctx.conn = conn; + lsquic_spi_init(&spi, TAILQ_FIRST(&conn->fc_pub.read_streams), + TAILQ_LAST(&conn->fc_pub.read_streams, lsquic_streams_tailq), + (uintptr_t) &TAILQ_NEXT((lsquic_stream_t *) NULL, next_read_stream), + SMQF_WANT_READ, &conn->fc_conn, "read-new", + filter_out_old_streams, &fctx); + for (stream = lsquic_spi_first(&spi); stream; + stream = lsquic_spi_next(&spi)) + lsquic_stream_dispatch_read_events(stream); + } } @@ -2637,7 +3069,7 @@ maybe_conn_flush_headers_stream (struct full_conn *conn) if (conn->fc_flags & FC_HTTP) { - stream = lsquic_headers_stream_get_stream(conn->fc_pub.hs); + stream = lsquic_headers_stream_get_stream(conn->fc_pub.u.gquic.hs); if (lsquic_stream_has_data_to_flush(stream)) (void) lsquic_stream_flush(stream); } @@ -2653,7 +3085,7 @@ process_streams_write_events (struct full_conn *conn, int high_prio) lsquic_spi_init(&spi, TAILQ_FIRST(&conn->fc_pub.write_streams), TAILQ_LAST(&conn->fc_pub.write_streams, lsquic_streams_tailq), (uintptr_t) &TAILQ_NEXT((lsquic_stream_t *) NULL, next_write_stream), - STREAM_WANT_WRITE|STREAM_WANT_FLUSH, conn->fc_conn.cn_cid, + SMQF_WANT_WRITE|SMQF_WANT_FLUSH, &conn->fc_conn, high_prio ? "write-high" : "write-low", NULL, NULL); if (high_prio) @@ -2663,7 +3095,7 @@ process_streams_write_events (struct full_conn *conn, int high_prio) for (stream = lsquic_spi_first(&spi); stream && write_is_possible(conn); stream = lsquic_spi_next(&spi)) - if (stream->stream_flags & STREAM_WRITE_Q_FLAGS) + if (stream->sm_qflags & SMQF_WRITE_Q_FLAGS) lsquic_stream_dispatch_write_events(stream); maybe_conn_flush_headers_stream(conn); @@ -2675,7 +3107,7 @@ process_hsk_stream_read_events (struct full_conn *conn) { lsquic_stream_t *stream; TAILQ_FOREACH(stream, &conn->fc_pub.read_streams, next_read_stream) - if (LSQUIC_STREAM_HANDSHAKE == stream->id) + if (LSQUIC_GQUIC_STREAM_HANDSHAKE == stream->id) { lsquic_stream_dispatch_read_events(stream); break; @@ -2688,7 +3120,7 @@ process_hsk_stream_write_events (struct full_conn *conn) { lsquic_stream_t *stream; TAILQ_FOREACH(stream, &conn->fc_pub.write_streams, next_write_stream) - if (LSQUIC_STREAM_HANDSHAKE == stream->id) + if (LSQUIC_GQUIC_STREAM_HANDSHAKE == stream->id) { lsquic_stream_dispatch_write_events(stream); break; @@ -2701,7 +3133,8 @@ generate_ack_frame (struct full_conn *conn) { lsquic_packet_out_t *packet_out; - packet_out = lsquic_send_ctl_new_packet_out(&conn->fc_send_ctl, 0); + packet_out = lsquic_send_ctl_new_packet_out(&conn->fc_send_ctl, 0, PNS_APP, + &conn->fc_path); if (packet_out) { lsquic_send_ctl_scheduled_one(&conn->fc_send_ctl, packet_out); @@ -2747,7 +3180,8 @@ immediate_close (struct full_conn *conn) if ((conn->fc_flags & FC_TIMED_OUT) && conn->fc_settings->es_silent_close) return TICK_CLOSE; - packet_out = lsquic_send_ctl_new_packet_out(&conn->fc_send_ctl, 0); + packet_out = lsquic_send_ctl_new_packet_out(&conn->fc_send_ctl, 0, PNS_APP, + &conn->fc_path); if (!packet_out) { LSQ_WARN("cannot allocate packet: %s", strerror(errno)); @@ -2784,7 +3218,7 @@ immediate_close (struct full_conn *conn) lsquic_send_ctl_scheduled_one(&conn->fc_send_ctl, packet_out); sz = conn->fc_conn.cn_pf->pf_gen_connect_close_frame( packet_out->po_data + packet_out->po_data_sz, - lsquic_packet_out_avail(packet_out), error_code, + lsquic_packet_out_avail(packet_out), 0, error_code, error_reason, error_reason ? strlen(error_reason) : 0); if (sz < 0) { LSQ_WARN("%s failed", __func__); @@ -2802,7 +3236,8 @@ write_is_possible (struct full_conn *conn) { const lsquic_packet_out_t *packet_out; - packet_out = lsquic_send_ctl_last_scheduled(&conn->fc_send_ctl); + packet_out = lsquic_send_ctl_last_scheduled(&conn->fc_send_ctl, PNS_APP, + &conn->fc_path, 0); return (packet_out && lsquic_packet_out_avail(packet_out) > 10) || lsquic_send_ctl_can_send(&conn->fc_send_ctl); } @@ -2874,11 +3309,11 @@ full_conn_ci_tick (lsquic_conn_t *lconn, lsquic_time_t now) if (conn->fc_flags & FC_HAVE_SAVED_ACK) { (void) /* If there is an error, we'll fail shortly */ - process_saved_ack(conn, 0); + process_saved_ack(conn, 0, now); conn->fc_flags &= ~FC_HAVE_SAVED_ACK; } - lsquic_send_ctl_tick(&conn->fc_send_ctl, now); + lsquic_send_ctl_tick_in(&conn->fc_send_ctl, now); lsquic_send_ctl_set_buffer_stream_packets(&conn->fc_send_ctl, 1); CLOSE_IF_NECESSARY(); @@ -2940,7 +3375,7 @@ full_conn_ci_tick (lsquic_conn_t *lconn, lsquic_time_t now) generate_stop_waiting_frame(conn); CLOSE_IF_NECESSARY(); } - lsquic_send_ctl_ack_to_front(&conn->fc_send_ctl); + lsquic_send_ctl_ack_to_front(&conn->fc_send_ctl, 1); } } @@ -2987,10 +3422,9 @@ full_conn_ci_tick (lsquic_conn_t *lconn, lsquic_time_t now) if (conn->fc_conn.cn_flags & LSCONN_SEND_BLOCKED) { + RETURN_IF_OUT_OF_PACKETS(); if (generate_blocked_frame(conn, 0)) conn->fc_conn.cn_flags &= ~LSCONN_SEND_BLOCKED; - else - RETURN_IF_OUT_OF_PACKETS(); } if (!STAILQ_EMPTY(&conn->fc_stream_ids_to_reset)) @@ -3007,7 +3441,7 @@ full_conn_ci_tick (lsquic_conn_t *lconn, lsquic_time_t now) lsquic_send_ctl_set_buffer_stream_packets(&conn->fc_send_ctl, 0); if (!(conn->fc_conn.cn_flags & LSCONN_HANDSHAKE_DONE) && - !conn->fc_conn.cn_esf->esf_is_zero_rtt_enabled( + !conn->fc_conn.cn_esf_c->esf_is_zero_rtt_enabled( conn->fc_conn.cn_enc_session)) { process_hsk_stream_write_events(conn); @@ -3039,10 +3473,9 @@ full_conn_ci_tick (lsquic_conn_t *lconn, lsquic_time_t now) end_write: skip_write: - RETURN_IF_OUT_OF_PACKETS(); - if ((conn->fc_flags & FC_CLOSING) && conn_ok_to_close(conn)) { + RETURN_IF_OUT_OF_PACKETS(); LSQ_DEBUG("connection is OK to close"); /* This is normal termination sequence. * @@ -3066,6 +3499,7 @@ full_conn_ci_tick (lsquic_conn_t *lconn, lsquic_time_t now) { if (conn->fc_flags & FC_SEND_PING) { + RETURN_IF_OUT_OF_PACKETS(); conn->fc_flags &= ~FC_SEND_PING; generate_ping_frame(conn); CLOSE_IF_NECESSARY(); @@ -3077,24 +3511,21 @@ full_conn_ci_tick (lsquic_conn_t *lconn, lsquic_time_t now) goto end; } } - else if (!(conn->fc_flags & FC_SERVER)) + else if (conn->fc_settings->es_ping_period) { lsquic_alarmset_unset(&conn->fc_alset, AL_PING); lsquic_send_ctl_sanity_check(&conn->fc_send_ctl); conn->fc_flags &= ~FC_SEND_PING; /* It may have rung */ } - now = lsquic_time_now(); - lsquic_alarmset_set(&conn->fc_alset, AL_IDLE, - now + conn->fc_settings->es_idle_conn_to); - /* From the spec: * " The PING frame should be used to keep a connection alive when * " a stream is open. */ - if (0 == (conn->fc_flags & FC_SERVER) && - lsquic_hash_count(conn->fc_pub.all_streams) > 0) - lsquic_alarmset_set(&conn->fc_alset, AL_PING, now + TIME_BETWEEN_PINGS); + if (conn->fc_settings->es_ping_period + && lsquic_hash_count(conn->fc_pub.all_streams) > 0) + lsquic_alarmset_set(&conn->fc_alset, AL_PING, + now + conn->fc_settings->es_ping_period * 1000 * 1000); tick |= TICK_SEND; @@ -3104,6 +3535,7 @@ full_conn_ci_tick (lsquic_conn_t *lconn, lsquic_time_t now) close_end: lsquic_send_ctl_set_buffer_stream_packets(&conn->fc_send_ctl, 1); + lsquic_send_ctl_tick_out(&conn->fc_send_ctl); return tick; } @@ -3125,10 +3557,10 @@ full_conn_ci_packet_in (lsquic_conn_t *lconn, lsquic_packet_in_t *packet_in) static lsquic_packet_out_t * -full_conn_ci_next_packet_to_send (lsquic_conn_t *lconn) +full_conn_ci_next_packet_to_send (struct lsquic_conn *lconn, size_t size) { struct full_conn *conn = (struct full_conn *) lconn; - return lsquic_send_ctl_next_packet_to_send(&conn->fc_send_ctl); + return lsquic_send_ctl_next_packet_to_send(&conn->fc_send_ctl, 0); } @@ -3141,15 +3573,11 @@ full_conn_ci_packet_sent (lsquic_conn_t *lconn, lsquic_packet_out_t *packet_out) recent_packet_hist_new(conn, 1, packet_out->po_sent); recent_packet_hist_frames(conn, 1, packet_out->po_frame_types); - if (packet_out->po_frame_types & QFRAME_RETRANSMITTABLE_MASK) - { + if (packet_out->po_frame_types & GQUIC_FRAME_RETRANSMITTABLE_MASK) conn->fc_n_cons_unretx = 0; - lsquic_alarmset_set(&conn->fc_alset, AL_IDLE, - packet_out->po_sent + conn->fc_settings->es_idle_conn_to); - } else ++conn->fc_n_cons_unretx; - s = lsquic_send_ctl_sent_packet(&conn->fc_send_ctl, packet_out, 1); + s = lsquic_send_ctl_sent_packet(&conn->fc_send_ctl, packet_out); if (s != 0) ABORT_ERROR("sent packet failed: %s", strerror(errno)); #if LSQUIC_CONN_STATS @@ -3174,6 +3602,7 @@ full_conn_ci_hsk_done (lsquic_conn_t *lconn, enum lsquic_hsk_status status) lsquic_alarmset_unset(&conn->fc_alset, AL_HANDSHAKE); switch (status) { + case LSQ_HSK_0RTT_FAIL: case LSQ_HSK_FAIL: conn->fc_flags |= FC_HSK_FAILED; break; @@ -3192,11 +3621,18 @@ full_conn_ci_hsk_done (lsquic_conn_t *lconn, enum lsquic_hsk_status status) if (conn->fc_stream_ifs[STREAM_IF_STD].stream_if->on_hsk_done) conn->fc_stream_ifs[STREAM_IF_STD].stream_if->on_hsk_done(lconn, status); + if ((status == LSQ_HSK_OK || status == LSQ_HSK_0RTT_OK) + && conn->fc_stream_ifs[STREAM_IF_STD].stream_if->on_zero_rtt_info) + { + conn->fc_conn.cn_esf.g->esf_maybe_dispatch_zero_rtt( + conn->fc_conn.cn_enc_session, &conn->fc_conn, + conn->fc_stream_ifs[STREAM_IF_STD].stream_if->on_zero_rtt_info); + } } -void -lsquic_conn_abort (lsquic_conn_t *lconn) +static void +full_conn_ci_abort (struct lsquic_conn *lconn) { struct full_conn *conn = (struct full_conn *) lconn; LSQ_INFO("User aborted connection"); @@ -3204,8 +3640,30 @@ lsquic_conn_abort (lsquic_conn_t *lconn) } -void -lsquic_conn_close (lsquic_conn_t *lconn) +static void +full_conn_ci_internal_error (struct lsquic_conn *lconn, + const char *format, ...) +{ + struct full_conn *const conn = (struct full_conn *) lconn; + LSQ_INFO("Internal error reported"); + conn->fc_flags |= FC_ERROR; +} + + +/* This function should not be called, as this is specific to IETF QUIC */ +static void +full_conn_ci_abort_error (struct lsquic_conn *lconn, int is_app, + unsigned error_code, const char *fmt, ...) +{ + struct full_conn *const conn = (struct full_conn *) lconn; + assert(0); + LSQ_WARN("(GQUIC) abort error is called unexpectedly"); + conn->fc_flags |= FC_ERROR; +} + + +static void +full_conn_ci_close (struct lsquic_conn *lconn) { struct full_conn *conn = (struct full_conn *) lconn; lsquic_stream_t *stream; @@ -3226,8 +3684,8 @@ lsquic_conn_close (lsquic_conn_t *lconn) } -void -lsquic_conn_going_away (lsquic_conn_t *lconn) +static void +full_conn_ci_going_away (struct lsquic_conn *lconn) { struct full_conn *conn = (struct full_conn *) lconn; if (!(conn->fc_flags & (FC_CLOSING|FC_GOING_AWAY))) @@ -3236,7 +3694,10 @@ lsquic_conn_going_away (lsquic_conn_t *lconn) assert(!(conn->fc_flags & FC_SEND_GOAWAY)); conn->fc_flags |= FC_GOING_AWAY; if (!(conn->fc_flags & FC_GOAWAY_SENT)) + { conn->fc_flags |= FC_SEND_GOAWAY; + lsquic_engine_add_conn_to_tickable(conn->fc_enpub, lconn); + } } } @@ -3249,9 +3710,9 @@ lsquic_conn_going_away (lsquic_conn_t *lconn) __attribute__((nonnull(4))) #endif static lsquic_stream_t * -find_stream_on_non_stream_frame (struct full_conn *conn, uint32_t stream_id, - enum stream_ctor_flags stream_ctor_flags, - const char *what) +find_stream_on_non_stream_frame (struct full_conn *conn, + lsquic_stream_id_t stream_id, enum stream_ctor_flags stream_ctor_flags, + const char *what) { lsquic_stream_t *stream; unsigned in_count; @@ -3262,7 +3723,7 @@ find_stream_on_non_stream_frame (struct full_conn *conn, uint32_t stream_id, if (conn_is_stream_closed(conn, stream_id)) { - LSQ_DEBUG("drop incoming %s for closed stream %u", what, stream_id); + LSQ_DEBUG("drop incoming %s for closed stream %"PRIu64, what, stream_id); return NULL; } @@ -3285,7 +3746,7 @@ find_stream_on_non_stream_frame (struct full_conn *conn, uint32_t stream_id, { unsigned counts[N_SCNTS]; collect_stream_counts(conn, 1, counts); - ABORT_WARN("incoming %s for stream %u would exceed " + ABORT_WARN("incoming %s for stream %"PRIu64" would exceed " "limit: %u. all: %u; peer: %u; closed: %u; reset: %u; reset " "and not closed: %u", what, stream_id, conn->fc_cfg.max_streams_in, counts[SCNT_ALL], @@ -3298,7 +3759,7 @@ find_stream_on_non_stream_frame (struct full_conn *conn, uint32_t stream_id, stream_id > conn->fc_max_peer_stream_id) { maybe_schedule_reset_for_stream(conn, stream_id); - LSQ_DEBUG("going away: reset new incoming stream %u", stream_id); + LSQ_DEBUG("going away: reset new incoming stream %"PRIu64, stream_id); return NULL; } @@ -3324,7 +3785,7 @@ headers_stream_on_conn_error (void *ctx) static void -headers_stream_on_stream_error (void *ctx, uint32_t stream_id) +headers_stream_on_stream_error (void *ctx, lsquic_stream_id_t stream_id) { struct full_conn *conn = ctx; lsquic_stream_t *stream; @@ -3333,7 +3794,7 @@ headers_stream_on_stream_error (void *ctx, uint32_t stream_id) "error"); if (stream) { - LSQ_DEBUG("resetting stream %u due to error", stream_id); + LSQ_DEBUG("resetting stream %"PRIu64" due to error", stream_id); /* We use code 1, which is QUIC_INTERNAL_ERROR (see * [draft-hamilton-quic-transport-protocol-01], Section 10), for all * errors. There does not seem to be a good reason to figure out @@ -3369,7 +3830,7 @@ headers_stream_on_incoming_headers (void *ctx, struct uncompressed_headers *uh) struct full_conn *conn = ctx; lsquic_stream_t *stream; - LSQ_DEBUG("incoming headers for stream %u", uh->uh_stream_id); + LSQ_DEBUG("incoming headers for stream %"PRIu64, uh->uh_stream_id); stream = find_stream_on_non_stream_frame(conn, uh->uh_stream_id, 0, "headers"); @@ -3384,7 +3845,8 @@ headers_stream_on_incoming_headers (void *ctx, struct uncompressed_headers *uh) if (0 != lsquic_stream_uh_in(stream, uh)) { - ABORT_ERROR("stream %u refused incoming headers", uh->uh_stream_id); + ABORT_ERROR("stream %"PRIu64" refused incoming headers", + uh->uh_stream_id); goto free_uh; } @@ -3408,13 +3870,13 @@ headers_stream_on_push_promise (void *ctx, struct uncompressed_headers *uh) assert(!(conn->fc_flags & FC_SERVER)); - LSQ_DEBUG("push promise for stream %u in response to %u", + LSQ_DEBUG("push promise for stream %"PRIu64" in response to %"PRIu64, uh->uh_oth_stream_id, uh->uh_stream_id); if (0 == (uh->uh_stream_id & 1) || 0 != (uh->uh_oth_stream_id & 1)) { - ABORT_ERROR("invalid push promise stream IDs: %u, %u", + ABORT_ERROR("invalid push promise stream IDs: %"PRIu64", %"PRIu64, uh->uh_oth_stream_id, uh->uh_stream_id); goto free_uh; } @@ -3422,7 +3884,7 @@ headers_stream_on_push_promise (void *ctx, struct uncompressed_headers *uh) if (!(conn_is_stream_closed(conn, uh->uh_stream_id) || find_stream_by_id(conn, uh->uh_stream_id))) { - ABORT_ERROR("invalid push promise original stream ID %u never " + ABORT_ERROR("invalid push promise original stream ID %"PRIu64" never " "initiated", uh->uh_stream_id); goto free_uh; } @@ -3430,7 +3892,7 @@ headers_stream_on_push_promise (void *ctx, struct uncompressed_headers *uh) if (conn_is_stream_closed(conn, uh->uh_oth_stream_id) || find_stream_by_id(conn, uh->uh_oth_stream_id)) { - ABORT_ERROR("invalid promised stream ID %u already used", + ABORT_ERROR("invalid promised stream ID %"PRIu64" already used", uh->uh_oth_stream_id); goto free_uh; } @@ -3455,13 +3917,13 @@ headers_stream_on_push_promise (void *ctx, struct uncompressed_headers *uh) static void -headers_stream_on_priority (void *ctx, uint32_t stream_id, int exclusive, - uint32_t dep_stream_id, unsigned weight) +headers_stream_on_priority (void *ctx, lsquic_stream_id_t stream_id, + int exclusive, lsquic_stream_id_t dep_stream_id, unsigned weight) { struct full_conn *conn = ctx; lsquic_stream_t *stream; - LSQ_DEBUG("got priority frame for stream %u: (ex: %d; dep stream: %u; " - "weight: %u)", stream_id, exclusive, dep_stream_id, weight); + LSQ_DEBUG("got priority frame for stream %"PRIu64": (ex: %d; dep stream: " + "%"PRIu64"; weight: %u)", stream_id, exclusive, dep_stream_id, weight); stream = find_stream_on_non_stream_frame(conn, stream_id, SCF_CALL_ON_NEW, "priority"); if (stream) @@ -3469,29 +3931,227 @@ headers_stream_on_priority (void *ctx, uint32_t stream_id, int exclusive, } -int lsquic_conn_is_push_enabled(lsquic_conn_t *c) + +#define STRLEN(s) (sizeof(s) - 1) + +static struct uncompressed_headers * +synthesize_push_request (struct full_conn *conn, void *hset, + const struct iovec* path, const struct iovec* host, + const lsquic_http_headers_t *headers, + lsquic_stream_id_t pushed_stream_id, const lsquic_stream_t *dep_stream) +{ + struct uncompressed_headers *uh; + struct http1x_ctor_ctx ctor_ctx; + void *hsi_ctx; + unsigned idx, i, n_headers; + const lsquic_http_header_t *header; + enum lsquic_header_status st; + lsquic_http_header_t pseudo_headers[4]; + lsquic_http_headers_t all_headers[2]; + + if (!hset) + { + if (conn->fc_enpub->enp_hsi_if == lsquic_http1x_if) + { + ctor_ctx = (struct http1x_ctor_ctx) + { + .conn = &conn->fc_conn, + .is_server = 1, + .max_headers_sz = MAX_HTTP1X_HEADERS_SIZE, + }; + hsi_ctx = &ctor_ctx; + } + else + hsi_ctx = conn->fc_enpub->enp_hsi_ctx; + + hset = conn->fc_enpub->enp_hsi_if->hsi_create_header_set(hsi_ctx, 1); + if (!hset) + { + LSQ_INFO("header set ctor failure"); + return NULL; + } + + pseudo_headers[0].name. iov_base = ":method"; + pseudo_headers[0].name. iov_len = 7; + pseudo_headers[0].value.iov_base = "GET"; + pseudo_headers[0].value.iov_len = 3; + pseudo_headers[1].name .iov_base = ":path"; + pseudo_headers[1].name .iov_len = 5; + pseudo_headers[1].value = *path; + pseudo_headers[2].name .iov_base = ":authority"; + pseudo_headers[2].name .iov_len = 10; + pseudo_headers[2].value = *host; + pseudo_headers[3].name. iov_base = ":scheme"; + pseudo_headers[3].name. iov_len = 7; + pseudo_headers[3].value.iov_base = "https"; + pseudo_headers[3].value.iov_len = 5; + + all_headers[0].headers = pseudo_headers; + all_headers[0].count = sizeof(pseudo_headers) + / sizeof(pseudo_headers[0]); + if (headers) + { + all_headers[1] = *headers; + n_headers = 2; + } + else + n_headers = 1; + + for (i = 0; i < n_headers; ++i) + for (header = all_headers[i].headers; + header < all_headers[i].headers + all_headers[i].count; + ++header) + { + idx = lshpack_enc_get_stx_tab_id(header->name.iov_base, + header->name.iov_len, header->value.iov_base, + header->value.iov_len); + st = conn->fc_enpub->enp_hsi_if->hsi_process_header(hset, idx, + header->name.iov_base, header->name.iov_len, + header->value.iov_base, header->value.iov_len); + if (st) + goto err; + } + + st = conn->fc_enpub->enp_hsi_if->hsi_process_header(hset, 0, 0, 0, + 0, 0); + if (st) + goto err; + } + + uh = malloc(sizeof(*uh)); + if (!uh) + { + st = LSQUIC_HDR_ERR_NOMEM; + goto err; + } + + uh->uh_stream_id = pushed_stream_id; + uh->uh_oth_stream_id = 0; /* We don't do dependencies */ + uh->uh_weight = lsquic_stream_priority(dep_stream) / 2 + 1; + uh->uh_exclusive = 0; + uh->uh_flags = UH_FIN; + if (lsquic_http1x_if == conn->fc_enpub->enp_hsi_if) + uh->uh_flags |= UH_H1H; + uh->uh_hset = hset; + + return uh; + + err: + LSQ_INFO("%s: error %u", __func__, st); + return NULL; +} + + +static int +full_conn_ci_is_push_enabled (struct lsquic_conn *lconn) { - return ((struct full_conn *)c)->fc_flags & FC_SUPPORT_PUSH; + struct full_conn *const conn = (struct full_conn *) lconn; + return conn->fc_flags & FC_SUPPORT_PUSH; } -lsquic_conn_ctx_t * -lsquic_conn_get_ctx (const lsquic_conn_t *lconn) +static int +full_conn_ci_push_stream (struct lsquic_conn *lconn, void *hset, + struct lsquic_stream *dep_stream, const struct iovec *path, + const struct iovec *host, const struct lsquic_http_headers *headers) +{ + struct full_conn *const conn = (struct full_conn *) lconn; + lsquic_stream_t *pushed_stream; + struct uncompressed_headers *uh; /* We synthesize the request */ + lsquic_stream_id_t stream_id; + int hit_limit; + + if ((conn->fc_flags & (FC_SERVER|FC_HTTP)) != (FC_SERVER|FC_HTTP)) + { + LSQ_ERROR("must be server in HTTP mode to push streams"); + return -1; + } + + if (lsquic_stream_is_pushed(dep_stream)) + { + LSQ_WARN("cannot push stream dependent on another pushed stream " + "(%"PRIu64")", dep_stream->id); + return -1; + } + + if (!(conn->fc_flags & FC_SUPPORT_PUSH)) + { + LSQ_INFO("server push support is disabled"); + return 1; + } + + hit_limit = 0; + if (either_side_going_away(conn) || + (hit_limit = 1, count_streams(conn, 0) >= conn->fc_cfg.max_streams_out)) + { + LSQ_DEBUG("cannot create pushed stream: %s", hit_limit ? + "hit connection limit" : "connection is going away"); + return 1; + } + + stream_id = generate_stream_id(conn); + uh = synthesize_push_request(conn, hset, path, host, headers, stream_id, + dep_stream); + if (!uh) + { + ABORT_ERROR("memory allocation failure"); + return -1; + } + + pushed_stream = new_stream(conn, stream_id, SCF_CALL_ON_NEW); + if (!pushed_stream) + { + LSQ_WARN("cannot create stream: %s", strerror(errno)); + free(uh); + return -1; + } + + if (0 != lsquic_stream_uh_in(pushed_stream, uh)) + { + LSQ_WARN("stream barfed when fed synthetic request"); + free(uh); + return -1; + } + + if (0 != lsquic_headers_stream_push_promise(conn->fc_pub.u.gquic.hs, dep_stream->id, + pushed_stream->id, path, host, headers)) + { + /* Since the failure to write to HEADERS stream results in aborting + * the connection, we do not bother rolling back. + */ + LSQ_ERROR("could not send push promise"); + return -1; + } + + return 0; +} + + +static void +full_conn_ci_tls_alert (struct lsquic_conn *lconn, uint8_t alert) +{ + assert(0); +} + + +static struct lsquic_conn_ctx * +full_conn_ci_get_ctx (const struct lsquic_conn *lconn) { struct full_conn *const conn = (struct full_conn *) lconn; return conn->fc_conn_ctx; } -void lsquic_conn_set_ctx (lsquic_conn_t *lconn, lsquic_conn_ctx_t *ctx) +static void +full_conn_ci_set_ctx (struct lsquic_conn *lconn, lsquic_conn_ctx_t *ctx) { struct full_conn *const conn = (struct full_conn *) lconn; conn->fc_conn_ctx = ctx; } -enum LSQUIC_CONN_STATUS -lsquic_conn_status (lsquic_conn_t *lconn, char *errbuf, size_t bufsz) +static enum LSQUIC_CONN_STATUS +full_conn_ci_status (struct lsquic_conn *lconn, char *errbuf, size_t bufsz) { struct full_conn *const conn = (struct full_conn *) lconn; size_t n; @@ -3546,42 +4206,46 @@ static int full_conn_ci_is_tickable (lsquic_conn_t *lconn) { struct full_conn *conn = (struct full_conn *) lconn; - const struct lsquic_stream *stream; + struct lsquic_stream *stream; if (!TAILQ_EMPTY(&conn->fc_pub.service_streams)) return 1; if ((conn->fc_enpub->enp_flags & ENPUB_CAN_SEND) - && lsquic_send_ctl_can_send(&conn->fc_send_ctl) && (should_generate_ack(conn) || !lsquic_send_ctl_sched_is_blocked(&conn->fc_send_ctl))) { if (conn->fc_flags & (FC_SEND_GOAWAY|FC_SEND_STOP_WAITING - |FC_SEND_PING|FC_SEND_WUF)) - return 1; + |FC_SEND_PING|FC_SEND_WUF|FC_CLOSING)) + goto check_can_send; if (lsquic_send_ctl_has_buffered(&conn->fc_send_ctl)) - return 1; + goto check_can_send; if (!TAILQ_EMPTY(&conn->fc_pub.sending_streams)) - return 1; + goto check_can_send; if ((conn->fc_conn.cn_flags & LSCONN_HANDSHAKE_DONE) || - conn->fc_conn.cn_esf->esf_is_zero_rtt_enabled( + conn->fc_conn.cn_esf_c->esf_is_zero_rtt_enabled( conn->fc_conn.cn_enc_session)) { TAILQ_FOREACH(stream, &conn->fc_pub.write_streams, next_write_stream) if (lsquic_stream_write_avail(stream)) - return 1; + goto check_can_send; } else { TAILQ_FOREACH(stream, &conn->fc_pub.write_streams, next_write_stream) - if (LSQUIC_STREAM_HANDSHAKE == stream->id + if (LSQUIC_GQUIC_STREAM_HANDSHAKE == stream->id && lsquic_stream_write_avail(stream)) - return 1; + goto check_can_send; } + goto check_readable_streams; + check_can_send: + if (lsquic_send_ctl_can_send(&conn->fc_send_ctl)) + return 1; } + check_readable_streams: TAILQ_FOREACH(stream, &conn->fc_pub.read_streams, next_read_stream) if (lsquic_stream_readable(stream)) return 1; @@ -3594,11 +4258,19 @@ static lsquic_time_t full_conn_ci_next_tick_time (lsquic_conn_t *lconn) { struct full_conn *conn = (struct full_conn *) lconn; - lsquic_time_t alarm_time, pacer_time; + lsquic_time_t alarm_time, pacer_time, now; alarm_time = lsquic_alarmset_mintime(&conn->fc_alset); pacer_time = lsquic_send_ctl_next_pacer_time(&conn->fc_send_ctl); + if (pacer_time && LSQ_LOG_ENABLED(LSQ_LOG_DEBUG)) + { + now = lsquic_time_now(); + if (pacer_time < now) + LSQ_DEBUG("%s: pacer is %"PRIu64" usec in the past", __func__, + now - pacer_time); + } + if (alarm_time && pacer_time) { if (alarm_time < pacer_time) @@ -3613,6 +4285,78 @@ full_conn_ci_next_tick_time (lsquic_conn_t *lconn) } +int +lsquic_gquic_full_conn_srej (struct lsquic_conn *lconn) +{ + struct full_conn *const conn = (struct full_conn *) lconn; + const unsigned cce_idx = lconn->cn_cur_cce_idx; + struct conn_cid_elem *const cce = &lconn->cn_cces[ cce_idx ]; + struct lsquic_stream *stream; + enum lsquic_version version; + + if (lconn->cn_esf_c->esf_is_zero_rtt_enabled(conn->fc_conn.cn_enc_session)) + { + /* We need to do this because we do not clean up any data that may + * have been already sent. This is left an optimization for the + * future. + */ + LSQ_DEBUG("received SREJ when 0RTT was on: fail handshake and let " + "caller retry"); + full_conn_ci_hsk_done(lconn, LSQ_HSK_0RTT_FAIL); + return -1; + } + + LSQ_DEBUG("reinitialize CID and other state due to SREJ"); + + /* Generate new CID and update connections hash */ + if (cce->cce_hash_el.qhe_flags & QHE_HASHED) + { + lsquic_engine_retire_cid(conn->fc_enpub, lconn, cce_idx, + 0 /* OK to omit the `now' value */); + lconn->cn_cces_mask |= 1 << cce_idx; + lsquic_generate_cid_gquic(&cce->cce_cid); + if (0 != lsquic_engine_add_cid(conn->fc_enpub, lconn, cce_idx)) + return -1; + } + else + { + LSQ_DEBUG("not hashed by CID, no need to reinsert"); + lsquic_generate_cid_gquic(&cce->cce_cid); + } + lconn->cn_esf.g->esf_reset_cid(lconn->cn_enc_session, &cce->cce_cid); + + /* Reset version negotiation */ + version = highest_bit_set(conn->fc_settings->es_versions); + init_ver_neg(conn, conn->fc_settings->es_versions, &version); + + /* Reset receive history */ + lsquic_rechist_cleanup(&conn->fc_rechist); + lsquic_rechist_init(&conn->fc_rechist, &conn->fc_conn, 0); + + /* Reset send controller state */ + lsquic_send_ctl_cleanup(&conn->fc_send_ctl); + lsquic_send_ctl_init(&conn->fc_send_ctl, &conn->fc_alset, conn->fc_enpub, + &conn->fc_ver_neg, &conn->fc_pub, 0); + + /* Reset handshake stream state */ + stream = find_stream_by_id(conn, LSQUIC_GQUIC_STREAM_HANDSHAKE); + if (!stream) + return -1; + stream->n_unacked = 0; + stream->tosend_off = 0; + stream->read_offset = 0; + stream->fc.sf_read_off = 0; + stream->fc.sf_max_recv_off = 0; + + lsquic_alarmset_unset(&conn->fc_alset, AL_RETX_APP); + lsquic_alarmset_unset(&conn->fc_alset, AL_ACK_APP); + conn->fc_flags &= ~(FC_ACK_QUEUED|FC_ACK_HAD_MISS|FC_NSTP); + conn->fc_flags |= FC_GOT_SREJ; + + return 0; +} + + #if LSQUIC_CONN_STATS static const struct conn_stats * full_conn_ci_get_stats (struct lsquic_conn *lconn) @@ -3620,8 +4364,6 @@ full_conn_ci_get_stats (struct lsquic_conn *lconn) struct full_conn *conn = (struct full_conn *) lconn; return &conn->fc_stats; } - - #endif @@ -3638,20 +4380,46 @@ static const struct headers_stream_callbacks headers_callbacks = static const struct headers_stream_callbacks *headers_callbacks_ptr = &headers_callbacks; static const struct conn_iface full_conn_iface = { + .ci_abort = full_conn_ci_abort, + .ci_abort_error = full_conn_ci_abort_error, .ci_can_write_ack = full_conn_ci_can_write_ack, + .ci_cancel_pending_streams + = full_conn_ci_cancel_pending_streams, + .ci_client_call_on_new = full_conn_ci_client_call_on_new, + .ci_close = full_conn_ci_close, .ci_destroy = full_conn_ci_destroy, + .ci_get_ctx = full_conn_ci_get_ctx, + .ci_get_engine = full_conn_ci_get_engine, + .ci_get_path = full_conn_ci_get_path, + .ci_get_stream_by_id = full_conn_ci_get_stream_by_id, #if LSQUIC_CONN_STATS .ci_get_stats = full_conn_ci_get_stats, #endif + .ci_going_away = full_conn_ci_going_away, .ci_hsk_done = full_conn_ci_hsk_done, + .ci_internal_error = full_conn_ci_internal_error, + .ci_is_push_enabled = full_conn_ci_is_push_enabled, .ci_is_tickable = full_conn_ci_is_tickable, + .ci_make_stream = full_conn_ci_make_stream, + .ci_n_avail_streams = full_conn_ci_n_avail_streams, + .ci_n_pending_streams = full_conn_ci_n_pending_streams, .ci_next_packet_to_send = full_conn_ci_next_packet_to_send, .ci_next_tick_time = full_conn_ci_next_tick_time, .ci_packet_in = full_conn_ci_packet_in, .ci_packet_not_sent = full_conn_ci_packet_not_sent, .ci_packet_sent = full_conn_ci_packet_sent, + .ci_record_addrs = full_conn_ci_record_addrs, + /* gQUIC connection does not need this functionality because it only + * uses one CID and it's liveness is updated automatically by the + * caller when packets come in. + */ + .ci_report_live = NULL, + .ci_set_ctx = full_conn_ci_set_ctx, + .ci_status = full_conn_ci_status, .ci_tick = full_conn_ci_tick, .ci_write_ack = full_conn_ci_write_ack, + .ci_push_stream = full_conn_ci_push_stream, + .ci_tls_alert = full_conn_ci_tls_alert, }; static const struct conn_iface *full_conn_iface_ptr = &full_conn_iface; diff --git a/src/liblsquic/lsquic_full_conn.h b/src/liblsquic/lsquic_full_conn.h index c50781d4f..96c5b7187 100644 --- a/src/liblsquic/lsquic_full_conn.h +++ b/src/liblsquic/lsquic_full_conn.h @@ -3,18 +3,56 @@ #define LSQUIC_FULL_CONN_H struct lsquic_conn; -struct lsquic_stream_if; struct lsquic_engine_public; struct lsquic_conn * -full_conn_client_new (struct lsquic_engine_public *, - const struct lsquic_stream_if *, - void *stream_if_ctx, +lsquic_gquic_full_conn_client_new (struct lsquic_engine_public *, unsigned flags /* Only FC_SERVER and FC_HTTP */, const char *hostname, unsigned short max_packet_size, + int is_ipv4, const unsigned char *zero_rtt, size_t zero_rtt_len); -void -full_conn_client_call_on_new (struct lsquic_conn *); +struct lsquic_conn * +lsquic_ietf_full_conn_client_new (struct lsquic_engine_public *, + unsigned flags /* Only FC_SERVER and FC_HTTP */, + const char *hostname, unsigned short max_packet_size, int is_ipv4, + const unsigned char *zero_rtt, size_t, + const unsigned char *token, size_t); + +typedef struct lsquic_conn * +(*server_conn_ctor_f) (struct lsquic_engine_public *, + unsigned flags /* Only FC_SERVER and FC_HTTP */, + struct lsquic_conn *mini_conn); + +struct lsquic_conn * +lsquic_gquic_full_conn_server_new (struct lsquic_engine_public *, + unsigned flags /* Only FC_SERVER and FC_HTTP */, + struct lsquic_conn *mini_conn); + +struct lsquic_conn * +lsquic_ietf_full_conn_server_new (struct lsquic_engine_public *, + unsigned flags /* Only FC_SERVER and FC_HTTP */, + struct lsquic_conn *mini_conn); + +struct dcid_elem +{ + /* This is never both in the hash and on the retirement list */ + union { + struct lsquic_hash_elem hash_el; + TAILQ_ENTRY(dcid_elem) next_to_ret; + } de_u; +#define de_hash_el de_u.hash_el +#define de_next_to_ret de_u.next_to_ret + lsquic_cid_t de_cid; + unsigned de_seqno; + enum { + DE_SRST = 1 << 0, /* de_srst is set */ + DE_ASSIGNED = 1 << 1, /* de_cid has been assigned to a path */ + } de_flags; + unsigned char de_srst[IQUIC_SRESET_TOKEN_SZ]; +}; + +int +lsquic_gquic_full_conn_srej (struct lsquic_conn *); #endif diff --git a/src/liblsquic/lsquic_full_conn_ietf.c b/src/liblsquic/lsquic_full_conn_ietf.c new file mode 100644 index 000000000..a1eb44274 --- /dev/null +++ b/src/liblsquic/lsquic_full_conn_ietf.c @@ -0,0 +1,6976 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_full_conn_ietf.c -- IETF QUIC connection. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "lsquic.h" +#include "lsquic_types.h" +#include "lsquic_int_types.h" +#include "lsquic_packet_common.h" +#include "lsquic_packet_ietf.h" +#include "lsquic_packet_in.h" +#include "lsquic_packet_out.h" +#include "lsquic_hash.h" +#include "lsquic_conn.h" +#include "lsquic_rechist.h" +#include "lsquic_senhist.h" +#include "lsquic_cubic.h" +#include "lsquic_pacer.h" +#include "lsquic_sfcw.h" +#include "lsquic_conn_flow.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_stream.h" +#include "lsquic_rtt.h" +#include "lsquic_conn_public.h" +#include "lsquic_bw_sampler.h" +#include "lsquic_minmax.h" +#include "lsquic_bbr.h" +#include "lsquic_send_ctl.h" +#include "lsquic_alarmset.h" +#include "lsquic_ver_neg.h" +#include "lsquic_mm.h" +#include "lsquic_engine_public.h" +#include "lsquic_set.h" +#include "lsquic_sizes.h" +#include "lsquic_trans_params.h" +#include "lsquic_version.h" +#include "lsquic_parse.h" +#include "lsquic_util.h" +#include "lsquic_enc_sess.h" +#include "lsquic_ev_log.h" +#include "lsquic_malo.h" +#include "lsquic_frab_list.h" +#include "lsquic_hcso_writer.h" +#include "lsquic_hcsi_reader.h" +#include "lsqpack.h" +#include "lsquic_http1x_if.h" +#include "lsquic_qenc_hdl.h" +#include "lsquic_qdec_hdl.h" +#include "lsquic_mini_conn_ietf.h" +#include "lsquic_tokgen.h" +#include "lsquic_full_conn.h" +#include "lsquic_h3_prio.h" +#include "lsquic_ietf.h" +#include "lsquic_push_promise.h" +#include "lsquic_headers.h" + +#define LSQUIC_LOGGER_MODULE LSQLM_CONN +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(&conn->ifc_conn) +#include "lsquic_logger.h" + +#define MAX_ANY_PACKETS_SINCE_LAST_ACK 20 +#define MAX_RETR_PACKETS_SINCE_LAST_ACK 2 +#define ACK_TIMEOUT (TP_DEF_MAX_ACK_DELAY * 1000) +#define INITIAL_CHAL_TIMEOUT 25000 + +/* Retire original CID after this much time has elapsed: */ +#define RET_CID_TIMEOUT 2000000 + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + +/* IETF QUIC push promise does not contain stream ID. This means that, unlike + * in GQUIC, one cannot create a stream immediately and pass it to the client. + * We may have to add a special API for IETF push promises. That's in the + * future: right now, we punt it. + */ +#define CLIENT_PUSH_SUPPORT 0 + + +/* IMPORTANT: Keep values of IFC_SERVER and IFC_HTTP same as LSENG_SERVER + * and LSENG_HTTP. + */ +enum ifull_conn_flags +{ + IFC_SERVER = LSENG_SERVER, /* Server mode */ + IFC_HTTP = LSENG_HTTP, /* HTTP mode */ + IFC_ACK_HAD_MISS = 1 << 2, +#define IFC_BIT_ERROR 3 + IFC_ERROR = 1 << IFC_BIT_ERROR, + IFC_TIMED_OUT = 1 << 4, + IFC_ABORTED = 1 << 5, + IFC_HSK_FAILED = 1 << 6, + IFC_GOING_AWAY = 1 << 7, + IFC_CLOSING = 1 << 8, /* Closing */ + IFC_RECV_CLOSE = 1 << 9, /* Received CONNECTION_CLOSE frame */ + IFC_TICK_CLOSE = 1 << 10, /* We returned TICK_CLOSE */ + IFC_CREATED_OK = 1 << 11, + IFC_HAVE_SAVED_ACK= 1 << 12, + IFC_ABORT_COMPLAINED + = 1 << 13, + IFC_DCID_SET = 1 << 14, +#define IFCBIT_ACK_QUED_SHIFT 15 + IFC_ACK_QUED_INIT = 1 << 15, + IFC_ACK_QUED_HSK = IFC_ACK_QUED_INIT << PNS_HSK, + IFC_ACK_QUED_APP = IFC_ACK_QUED_INIT << PNS_APP, +#define IFC_ACK_QUEUED (IFC_ACK_QUED_INIT|IFC_ACK_QUED_HSK|IFC_ACK_QUED_APP) + IFC_HAVE_PEER_SET = 1 << 18, + IFC_GOT_PRST = 1 << 19, + IFC_IGNORE_INIT = 1 << 20, + IFC_RETRIED = 1 << 21, + IFC_SWITCH_DCID = 1 << 22, /* Perform DCID switch when a new CID becomes available */ + IFC_GOAWAY_CLOSE = 1 << 23, + IFC_FIRST_TICK = 1 << 24, + IFC_IGNORE_HSK = 1 << 25, +}; + + +#define N_PATHS 2 + +enum send +{ + /* PATH_CHALLENGE and PATH_RESPONSE frames are not retransmittable. They + * are positioned first in the enum to optimize packetization. + */ + SEND_PATH_CHAL, + SEND_PATH_CHAL_PATH_0 = SEND_PATH_CHAL + 0, + SEND_PATH_CHAL_PATH_1 = SEND_PATH_CHAL + 1, + SEND_PATH_RESP, + SEND_PATH_RESP_PATH_0 = SEND_PATH_RESP + 0, + SEND_PATH_RESP_PATH_1 = SEND_PATH_RESP + 1, + SEND_MAX_DATA, + SEND_PING, + SEND_NEW_CID, + SEND_RETIRE_CID, + SEND_CONN_CLOSE, + SEND_STREAMS_BLOCKED, + SEND_STREAMS_BLOCKED_BIDI = SEND_STREAMS_BLOCKED + SD_BIDI, + SEND_STREAMS_BLOCKED_UNI = SEND_STREAMS_BLOCKED + SD_UNI, + SEND_MAX_STREAMS, + SEND_MAX_STREAMS_BIDI = SEND_MAX_STREAMS + SD_BIDI, + SEND_MAX_STREAMS_UNI = SEND_MAX_STREAMS + SD_UNI, + SEND_STOP_SENDING, + N_SEND +}; + +enum send_flags +{ + SF_SEND_MAX_DATA = 1 << SEND_MAX_DATA, + SF_SEND_PING = 1 << SEND_PING, + SF_SEND_PATH_CHAL = 1 << SEND_PATH_CHAL, + SF_SEND_PATH_CHAL_PATH_0 = 1 << SEND_PATH_CHAL_PATH_0, + SF_SEND_PATH_CHAL_PATH_1 = 1 << SEND_PATH_CHAL_PATH_1, + SF_SEND_PATH_RESP = 1 << SEND_PATH_RESP, + SF_SEND_PATH_RESP_PATH_0 = 1 << SEND_PATH_RESP_PATH_0, + SF_SEND_PATH_RESP_PATH_1 = 1 << SEND_PATH_RESP_PATH_1, + SF_SEND_NEW_CID = 1 << SEND_NEW_CID, + SF_SEND_RETIRE_CID = 1 << SEND_RETIRE_CID, + SF_SEND_CONN_CLOSE = 1 << SEND_CONN_CLOSE, + SF_SEND_STREAMS_BLOCKED = 1 << SEND_STREAMS_BLOCKED, + SF_SEND_STREAMS_BLOCKED_BIDI = 1 << SEND_STREAMS_BLOCKED_BIDI, + SF_SEND_STREAMS_BLOCKED_UNI = 1 << SEND_STREAMS_BLOCKED_UNI, + SF_SEND_MAX_STREAMS = 1 << SEND_MAX_STREAMS, + SF_SEND_MAX_STREAMS_BIDI = 1 << SEND_MAX_STREAMS_BIDI, + SF_SEND_MAX_STREAMS_UNI = 1 << SEND_MAX_STREAMS_UNI, + SF_SEND_STOP_SENDING = 1 << SEND_STOP_SENDING, +}; + +#define SF_SEND_PATH_CHAL_ALL \ + (((SF_SEND_PATH_CHAL << N_PATHS) - 1) & ~(SF_SEND_PATH_CHAL - 1)) + +#define IFC_IMMEDIATE_CLOSE_FLAGS \ + (IFC_TIMED_OUT|IFC_ERROR|IFC_ABORTED|IFC_HSK_FAILED|IFC_GOT_PRST) + +#define MAX_ERRMSG 256 + +#define MAX_SCID 8 + +#define SET_ERRMSG(conn, ...) do { \ + if (!(conn)->ifc_errmsg) \ + { \ + (conn)->ifc_errmsg = malloc(MAX_ERRMSG); \ + if ((conn)->ifc_errmsg) \ + snprintf((conn)->ifc_errmsg, MAX_ERRMSG, __VA_ARGS__); \ + } \ +} while (0) + +#define ABORT_WITH_FLAG(conn, log_level, flag, ...) do { \ + SET_ERRMSG(conn, __VA_ARGS__); \ + if (!((conn)->ifc_flags & IFC_ABORT_COMPLAINED)) \ + LSQ_LOG(log_level, "Abort connection: " __VA_ARGS__); \ + (conn)->ifc_flags |= flag|IFC_ABORT_COMPLAINED; \ +} while (0) + +#define ABORT_ERROR(...) \ + ABORT_WITH_FLAG(conn, LSQ_LOG_ERROR, IFC_ERROR, __VA_ARGS__) +#define ABORT_WARN(...) \ + ABORT_WITH_FLAG(conn, LSQ_LOG_WARN, IFC_ERROR, __VA_ARGS__) + +#define CONN_ERR(app_error_, code_) (struct conn_err) { \ + .app_error = (app_error_), .u.err = (code_), } + +/* Use this for protocol errors; they do not need to be as loud as our own + * internal errors. + */ +#define ABORT_QUIETLY(app_error, code, ...) do { \ + conn->ifc_error = CONN_ERR(app_error, code); \ + ABORT_WITH_FLAG(conn, LSQ_LOG_INFO, IFC_ERROR, __VA_ARGS__); \ +} while (0) + + +static enum stream_id_type +gen_sit (unsigned server, enum stream_dir sd) +{ + return (server > 0) | ((sd > 0) << SD_SHIFT); +} + + +struct stream_id_to_ss +{ + STAILQ_ENTRY(stream_id_to_ss) sits_next; + lsquic_stream_id_t sits_stream_id; + enum http_error_code sits_error_code; +}; + +struct http_ctl_stream_in +{ + struct hcsi_reader reader; +}; + +struct conn_err +{ + int app_error; + union + { + enum trans_error_code tec; + enum http_error_code hec; + unsigned err; + } u; +}; + + +struct conn_path +{ + struct network_path cop_path; + uint64_t cop_path_chals[8]; /* Arbitrary number */ + uint64_t cop_inc_chal; /* Incoming challenge */ + enum { + /* Initialized covers cop_path.np_pack_size and cop_path.np_dcid */ + COP_INITIALIZED = 1 << 0, + /* This flag is set when we received a response to one of path + * challenges we sent on this path. + */ + COP_VALIDATED = 1 << 1, + /* Received non-probing frames. This flag is not set for the + * original path. + */ + COP_GOT_NONPROB = 1 << 2, + } cop_flags; + unsigned char cop_n_chals; + unsigned char cop_cce_idx; +}; + + +struct ietf_full_conn +{ + struct lsquic_conn ifc_conn; + struct conn_cid_elem ifc_cces[MAX_SCID]; + struct lsquic_rechist ifc_rechist[N_PNS]; + struct lsquic_send_ctl ifc_send_ctl; + struct lsquic_stream *ifc_stream_hcsi; /* HTTP Control Stream Incoming */ + struct lsquic_stream *ifc_stream_hcso; /* HTTP Control Stream Outgoing */ + struct lsquic_conn_public ifc_pub; + lsquic_alarmset_t ifc_alset; + struct lsquic_set64 ifc_closed_stream_ids[N_SITS]; + lsquic_stream_id_t ifc_n_created_streams[N_SDS]; + /* Not including the value stored in ifc_max_allowed_stream_id: */ + lsquic_stream_id_t ifc_max_allowed_stream_id[N_SITS]; + uint64_t ifc_closed_peer_streams[N_SDS]; + /* Maximum number of open stream initiated by peer: */ + unsigned ifc_max_streams_in[N_SDS]; + uint64_t ifc_max_stream_data_uni; + enum ifull_conn_flags ifc_flags; + enum send_flags ifc_send_flags; + struct { + uint64_t streams_blocked[N_SDS]; + } ifc_send; + struct conn_err ifc_error; + unsigned ifc_n_delayed_streams; + unsigned ifc_n_cons_unretx; + int ifc_spin_bit; + const struct lsquic_stream_if + *ifc_stream_if; + void *ifc_stream_ctx; + char *ifc_errmsg; + struct lsquic_engine_public + *ifc_enpub; + const struct lsquic_engine_settings + *ifc_settings; + lsquic_conn_ctx_t *ifc_conn_ctx; + struct transport_params ifc_peer_param; + STAILQ_HEAD(, stream_id_to_ss) + ifc_stream_ids_to_ss; + struct short_ack_info ifc_saved_ack_info; + lsquic_time_t ifc_saved_ack_received; + lsquic_packno_t ifc_max_ack_packno[N_PNS]; + lsquic_packno_t ifc_max_non_probing; + struct { + uint64_t max_stream_send; + uint8_t ack_exp; + } ifc_cfg; + int (*ifc_process_incoming_packet)( + struct ietf_full_conn *, + struct lsquic_packet_in *); + /* Number ackable packets received since last ACK was sent: */ + unsigned ifc_n_slack_akbl[N_PNS]; + uint64_t ifc_ecn_counts_in[N_PNS][4]; + uint64_t ifc_ecn_counts_out[N_PNS][4]; + lsquic_stream_id_t ifc_max_req_id; + struct hcso_writer ifc_hcso; + struct http_ctl_stream_in ifc_hcsi; + struct qpack_enc_hdl ifc_qeh; + struct qpack_dec_hdl ifc_qdh; + struct { + uint64_t header_table_size, + num_placeholders, + max_header_list_size, + qpack_blocked_streams; + } ifc_peer_hq_settings; + struct dcid_elem *ifc_dces[MAX_IETF_CONN_DCIDS]; + TAILQ_HEAD(, dcid_elem) ifc_to_retire; + unsigned ifc_scid_seqno; + lsquic_time_t ifc_scid_timestamp[MAX_SCID]; + /* Last 8 packets had ECN markings? */ + uint8_t ifc_incoming_ecn; + unsigned char ifc_cur_path_id; /* Indexes ifc_paths */ + unsigned char ifc_used_paths; /* Bitmask */ + unsigned char ifc_mig_path_id; + unsigned char ifc_original_cids; + /* ifc_active_cids_limit is the maximum number of CIDs at any one time this + * endpoint is allowed to issue to peer. If the TP value exceeds cn_n_cces, + * it is reduced to it. ifc_active_cids_count tracks how many CIDs have + * been issued. It is decremented each time a CID is retired. Both are + * only applicable to CIDs issued via NEW_CONNECTION_ID frame. + */ + unsigned char ifc_active_cids_limit; + unsigned char ifc_active_cids_count; + unsigned char ifc_first_active_cid_seqno; + unsigned ifc_last_retire_prior_to; + lsquic_time_t ifc_last_live_update; + struct conn_path ifc_paths[N_PATHS]; + struct lsquic_stream *ifc_crypto_streams[N_ENC_LEVS]; + union { + struct { + struct ver_neg + ifcli_ver_neg; + uint64_t ifcli_max_push_id; + enum { + IFCLI_PUSH_ENABLED = 1 << 0, + } ifcli_flags; + } cli; + struct { + uint64_t ifser_max_push_id; + uint64_t ifser_next_push_id; + enum { + IFSER_PUSH_ENABLED = 1 << 0, + IFSER_MAX_PUSH_ID = 1 << 1, /* ifser_max_push_id is set */ + } ifser_flags; + } ser; + } ifc_u; + /* XXX This is 16 bytes per connection, which is expensive. Perhaps move + * these to enpub (add a new IETF-specific section)? + */ + lsquic_time_t ifc_idle_to; + lsquic_time_t ifc_ping_period; +}; + +#define CUR_CPATH(conn_) (&(conn_)->ifc_paths[(conn_)->ifc_cur_path_id]) +#define CUR_NPATH(conn_) (&(CUR_CPATH(conn_)->cop_path)) +#define CUR_DCID(conn_) (&(CUR_NPATH(conn_)->np_dcid)) + +#define DCES_END(conn_) ((conn_)->ifc_dces + (sizeof((conn_)->ifc_dces) \ + / sizeof((conn_)->ifc_dces[0]))) + +static const struct ver_neg server_ver_neg; + +static const struct conn_iface *ietf_full_conn_iface_ptr; + +static int +process_incoming_packet_verneg (struct ietf_full_conn *, + struct lsquic_packet_in *); + +static int +process_incoming_packet_fast (struct ietf_full_conn *, + struct lsquic_packet_in *); + +static void +ietf_full_conn_ci_packet_in (struct lsquic_conn *, struct lsquic_packet_in *); + +static int +handshake_ok (struct lsquic_conn *); + +static void +ignore_init (struct ietf_full_conn *); + +static void +ignore_hsk (struct ietf_full_conn *); + +static unsigned +ietf_full_conn_ci_n_avail_streams (const struct lsquic_conn *); + + +static unsigned +highest_bit_set (unsigned sz) +{ +#if __GNUC__ + unsigned clz = __builtin_clz(sz); + return 31 - clz; +#else + unsigned n, y; + n = 32; + y = sz >> 16; if (y) { n -= 16; sz = y; } + y = sz >> 8; if (y) { n -= 8; sz = y; } + y = sz >> 4; if (y) { n -= 4; sz = y; } + y = sz >> 2; if (y) { n -= 2; sz = y; } + y = sz >> 1; if (y) return 31 - n + 2; + return 31 - n + sz; +#endif +} + + +static void +set_versions (struct ietf_full_conn *conn, unsigned versions, + enum lsquic_version *ver) +{ + conn->ifc_u.cli.ifcli_ver_neg.vn_supp = versions; + conn->ifc_u.cli.ifcli_ver_neg.vn_ver = (ver) ? *ver : highest_bit_set(versions); + conn->ifc_u.cli.ifcli_ver_neg.vn_buf = lsquic_ver2tag(conn->ifc_u.cli.ifcli_ver_neg.vn_ver); + conn->ifc_conn.cn_version = conn->ifc_u.cli.ifcli_ver_neg.vn_ver; +} + + +static void +init_ver_neg (struct ietf_full_conn *conn, unsigned versions, + enum lsquic_version *ver) +{ + set_versions(conn, versions, ver); + conn->ifc_u.cli.ifcli_ver_neg.vn_tag = &conn->ifc_u.cli.ifcli_ver_neg.vn_buf; + conn->ifc_u.cli.ifcli_ver_neg.vn_state = VN_START; +} + + +static void +ack_alarm_expired (enum alarm_id al_id, void *ctx, lsquic_time_t expiry, + lsquic_time_t now) +{ + struct ietf_full_conn *conn = ctx; + enum packnum_space pns = al_id - AL_ACK_INIT; + LSQ_DEBUG("%s ACK timer expired (%"PRIu64" < %"PRIu64"): ACK queued", + lsquic_pns2str[pns], expiry, now); + conn->ifc_flags |= IFC_ACK_QUED_INIT << pns; +} + + +static void +idle_alarm_expired (enum alarm_id al_id, void *ctx, lsquic_time_t expiry, + lsquic_time_t now) +{ + struct ietf_full_conn *const conn = (struct ietf_full_conn *) ctx; + LSQ_DEBUG("connection timed out"); + conn->ifc_flags |= IFC_TIMED_OUT; +} + + +static void +handshake_alarm_expired (enum alarm_id al_id, void *ctx, + lsquic_time_t expiry, lsquic_time_t now) +{ + struct ietf_full_conn *const conn = (struct ietf_full_conn *) ctx; + LSQ_DEBUG("connection timed out: handshake timed out"); + conn->ifc_flags |= IFC_TIMED_OUT; +} + + +/* + * When this alarm expires, at least one SCID slot shoud be available + * for generation. + */ +static void +cid_throt_alarm_expired (enum alarm_id al_id, void *ctx, + lsquic_time_t expiry, lsquic_time_t now) +{ + struct ietf_full_conn *const conn = (struct ietf_full_conn *) ctx; + LSQ_DEBUG("%s", __func__); + conn->ifc_send_flags |= SF_SEND_NEW_CID; + return; +} + + +static void +path_chal_alarm_expired (enum alarm_id al_id, void *ctx, + lsquic_time_t expiry, lsquic_time_t now, unsigned path_id) +{ + struct ietf_full_conn *const conn = (struct ietf_full_conn *) ctx; + struct conn_path *const copath = &conn->ifc_paths[path_id]; + + if (copath->cop_n_chals < sizeof(copath->cop_path_chals) + / sizeof(copath->cop_path_chals[0])) + { + LSQ_DEBUG("path #%u challenge expired, schedule another one", path_id); + conn->ifc_send_flags |= SF_SEND_PATH_CHAL << path_id; + } + else + { + LSQ_INFO("migration to path #%u failed after none of %u path " + "challenges received responses", path_id, copath->cop_n_chals); + memset(copath, 0, sizeof(*copath)); + } +} + + +static void +path_chal_0_alarm_expired (enum alarm_id al_id, void *ctx, + lsquic_time_t expiry, lsquic_time_t now) +{ + path_chal_alarm_expired(al_id, ctx, expiry, now, 0); +} + + +static void +path_chal_1_alarm_expired (enum alarm_id al_id, void *ctx, + lsquic_time_t expiry, lsquic_time_t now) +{ + path_chal_alarm_expired(al_id, ctx, expiry, now, 1); +} + + +static int +migra_is_on (const struct ietf_full_conn *conn) +{ + return (conn->ifc_send_flags & SF_SEND_PATH_CHAL_ALL) + || lsquic_alarmset_are_set(&conn->ifc_alset, ALBIT_PATH_CHAL_0|ALBIT_PATH_CHAL_1); +} + + +static void +migra_begin (struct ietf_full_conn *conn, struct conn_path *copath, + struct dcid_elem *dce, const struct sockaddr *dest_sa) +{ + assert(!(migra_is_on(conn))); + + dce->de_flags |= DE_ASSIGNED; + copath->cop_flags |= COP_INITIALIZED; + copath->cop_path.np_dcid = dce->de_cid; + copath->cop_path.np_peer_ctx = CUR_NPATH(conn)->np_peer_ctx; + if (NP_IS_IPv6(CUR_NPATH(conn))) + copath->cop_path.np_pack_size = IQUIC_MAX_IPv6_PACKET_SZ; + else + copath->cop_path.np_pack_size = IQUIC_MAX_IPv4_PACKET_SZ; + memcpy(&copath->cop_path.np_local_addr, NP_LOCAL_SA(CUR_NPATH(conn)), + sizeof(copath->cop_path.np_local_addr)); + memcpy(&copath->cop_path.np_peer_addr, dest_sa, + sizeof(copath->cop_path.np_peer_addr)); + + conn->ifc_mig_path_id = copath - conn->ifc_paths; + conn->ifc_used_paths |= 1 << conn->ifc_mig_path_id; + conn->ifc_send_flags |= SF_SEND_PATH_CHAL << conn->ifc_mig_path_id; + LSQ_DEBUG("Schedule migration to path %hhu: will send PATH_CHALLENGE", + conn->ifc_mig_path_id); +} + + +static void +ping_alarm_expired (enum alarm_id al_id, void *ctx, lsquic_time_t expiry, + lsquic_time_t now) +{ + struct ietf_full_conn *const conn = (struct ietf_full_conn *) ctx; + LSQ_DEBUG("Ping alarm rang: schedule PING frame to be generated"); + conn->ifc_send_flags |= SF_SEND_PING; +} + + +static void +retire_cid (struct ietf_full_conn *, struct conn_cid_elem *, lsquic_time_t); + +static void +ret_cids_alarm_expired (enum alarm_id al_id, void *ctx, lsquic_time_t expiry, + lsquic_time_t now) +{ + struct ietf_full_conn *const conn = (struct ietf_full_conn *) ctx; + struct lsquic_conn *const lconn = &conn->ifc_conn; + struct conn_cid_elem *cce; + unsigned idx; + + LSQ_DEBUG("The 'retire original CIDs' alarm rang"); + + for (cce = lconn->cn_cces; cce < END_OF_CCES(lconn); ++cce) + { + idx = cce - lconn->cn_cces; + if (conn->ifc_original_cids & (1 << idx)) + { + assert(lconn->cn_cces_mask & (1 << idx)); + conn->ifc_original_cids &= ~(1 << idx); + LSQ_DEBUG("retiring original CID at index %u", idx); + retire_cid(conn, cce, now); + } + } +} + + +static ssize_t +crypto_stream_write (void *stream, const void *buf, size_t len) +{ + return lsquic_stream_write(stream, buf, len); +} + + +static int +crypto_stream_flush (void *stream) +{ + return lsquic_stream_flush(stream); +} + + +static ssize_t +crypto_stream_readf (void *stream, + size_t (*readf)(void *, const unsigned char *, size_t, int), void *ctx) +{ + return lsquic_stream_readf(stream, readf, ctx); +} + + +static int +crypto_stream_wantwrite (void *stream, int is_want) +{ + return lsquic_stream_wantwrite(stream, is_want); +} + + +static int +crypto_stream_wantread (void *stream, int is_want) +{ + return lsquic_stream_wantread(stream, is_want); +} + + +static enum enc_level +crypto_stream_enc_level (void *streamp) +{ + const struct lsquic_stream *stream = streamp; + return crypto_level(stream); +} + + +static const struct crypto_stream_if crypto_stream_if = +{ + .csi_write = crypto_stream_write, + .csi_flush = crypto_stream_flush, + .csi_readf = crypto_stream_readf, + .csi_wantwrite = crypto_stream_wantwrite, + .csi_wantread = crypto_stream_wantread, + .csi_enc_level = crypto_stream_enc_level, +}; + + +static const struct lsquic_stream_if *unicla_if_ptr; + + +static lsquic_stream_id_t +generate_stream_id (struct ietf_full_conn *conn, enum stream_dir sd) +{ + lsquic_stream_id_t id; + + id = conn->ifc_n_created_streams[sd]++; + return id << SIT_SHIFT + | sd << SD_SHIFT + | !!(conn->ifc_flags & IFC_SERVER) + ; +} + + +static lsquic_stream_id_t +avail_streams_count (const struct ietf_full_conn *conn, int server, + enum stream_dir sd) +{ + enum stream_id_type sit; + lsquic_stream_id_t max_count; + + sit = gen_sit(server, sd); + max_count = conn->ifc_max_allowed_stream_id[sit] >> SIT_SHIFT; + LSQ_DEBUG("sit-%u streams: max count: %"PRIu64"; created streams: %"PRIu64, + sit, max_count, conn->ifc_n_created_streams[sd]); + if (max_count >= conn->ifc_n_created_streams[sd]) + return max_count - conn->ifc_n_created_streams[sd]; + else + { + assert(0); + return 0; + } +} + + +/* If `priority' is negative, this means that the stream is critical */ +static int +create_uni_stream_out (struct ietf_full_conn *conn, int priority, + const struct lsquic_stream_if *stream_if, void *stream_if_ctx) +{ + struct lsquic_stream *stream; + lsquic_stream_id_t stream_id; + + stream_id = generate_stream_id(conn, SD_UNI); + stream = lsquic_stream_new(stream_id, &conn->ifc_pub, stream_if, + stream_if_ctx, 0, conn->ifc_max_stream_data_uni, + SCF_IETF | (priority < 0 ? SCF_CRITICAL : 0)); + if (!stream) + return -1; + if (!lsquic_hash_insert(conn->ifc_pub.all_streams, &stream->id, + sizeof(stream->id), stream, &stream->sm_hash_el)) + { + lsquic_stream_destroy(stream); + return -1; + } + if (priority >= 0) + lsquic_stream_set_priority_internal(stream, priority); + lsquic_stream_call_on_new(stream); + return 0; +} + + +static int +create_ctl_stream_out (struct ietf_full_conn *conn) +{ + return create_uni_stream_out(conn, -1, + lsquic_hcso_writer_if, &conn->ifc_hcso); +} + + +static int +create_qenc_stream_out (struct ietf_full_conn *conn) +{ + return create_uni_stream_out(conn, -1, + lsquic_qeh_enc_sm_out_if, &conn->ifc_qeh); +} + + +static int +create_qdec_stream_out (struct ietf_full_conn *conn) +{ + return create_uni_stream_out(conn, -1, + lsquic_qdh_dec_sm_out_if, &conn->ifc_qdh); +} + + +static int +create_bidi_stream_out (struct ietf_full_conn *conn) +{ + struct lsquic_stream *stream; + lsquic_stream_id_t stream_id; + + stream_id = generate_stream_id(conn, SD_BIDI); + stream = lsquic_stream_new(stream_id, &conn->ifc_pub, + conn->ifc_enpub->enp_stream_if, + conn->ifc_enpub->enp_stream_if_ctx, + conn->ifc_settings->es_init_max_stream_data_bidi_local, + conn->ifc_cfg.max_stream_send, SCF_IETF + | (conn->ifc_flags & IFC_HTTP ? SCF_HTTP : 0)); + if (!stream) + return -1; + if (!lsquic_hash_insert(conn->ifc_pub.all_streams, &stream->id, + sizeof(stream->id), stream, &stream->sm_hash_el)) + { + lsquic_stream_destroy(stream); + return -1; + } + lsquic_stream_call_on_new(stream); + return 0; +} + + +static struct lsquic_stream * +create_push_stream (struct ietf_full_conn *conn) +{ + struct lsquic_stream *stream; + lsquic_stream_id_t stream_id; + + assert((conn->ifc_flags & (IFC_SERVER|IFC_HTTP)) == (IFC_SERVER|IFC_HTTP)); + + stream_id = generate_stream_id(conn, SD_UNI); + stream = lsquic_stream_new(stream_id, &conn->ifc_pub, + conn->ifc_enpub->enp_stream_if, + conn->ifc_enpub->enp_stream_if_ctx, + conn->ifc_settings->es_init_max_stream_data_bidi_local, + conn->ifc_cfg.max_stream_send, SCF_IETF|SCF_HTTP); + if (!stream) + return NULL; + if (!lsquic_hash_insert(conn->ifc_pub.all_streams, &stream->id, + sizeof(stream->id), stream, &stream->sm_hash_el)) + { + lsquic_stream_destroy(stream); + return NULL; + } + return stream; +} + + +/* This function looks through the SCID array searching for an available + * slot. If it finds an available slot it will + * 1. generate an SCID, + * 2. mark with latest seqno, + * 3. increment seqno, + * 4. turn on CCE_SEQNO flag, + * 5. turn on flag given through flag paramter, + * 6. add cce to mask, and + * 7. add timestamp for when slot is new available for CID generation. + */ +static struct conn_cid_elem * +ietf_full_conn_add_scid (struct ietf_full_conn *conn, + struct lsquic_engine_public *enpub, + enum conn_cce_flags flags, + lsquic_time_t now) +{ + struct conn_cid_elem *cce; + struct lsquic_conn *lconn = &conn->ifc_conn; + lsquic_time_t *min_timestamp; + int i; + + if (enpub->enp_settings.es_scid_len) + { + for (cce = lconn->cn_cces; cce < END_OF_CCES(lconn); ++cce) + if (!(lconn->cn_cces_mask & (1 << (cce - lconn->cn_cces)))) + break; + } + else if (0 == lconn->cn_cces_mask) + cce = lconn->cn_cces; + else + cce = END_OF_CCES(lconn); + + if (cce >= END_OF_CCES(lconn)) + { + LSQ_LOG1(LSQ_LOG_DEBUG, "cannot find slot for new SCID"); + return NULL; + } + + if (enpub->enp_settings.es_scid_len) + lsquic_generate_cid(&cce->cce_cid, enpub->enp_settings.es_scid_len); + cce->cce_seqno = conn->ifc_scid_seqno++; + cce->cce_flags |= CCE_SEQNO | flags; + lconn->cn_cces_mask |= 1 << (cce - lconn->cn_cces); + if (enpub->enp_settings.es_scid_iss_rate) + { + min_timestamp = &conn->ifc_scid_timestamp[0]; + for (i = 1; i < lconn->cn_n_cces; i++) + if (conn->ifc_scid_timestamp[i] < *min_timestamp) + min_timestamp = &conn->ifc_scid_timestamp[i]; + *min_timestamp = now; + } + LSQ_LOG1C(LSQ_LOG_DEBUG, "generated and assigned SCID %"CID_FMT, + CID_BITS(&cce->cce_cid)); + return cce; +} + + +static int +ietf_full_conn_init (struct ietf_full_conn *conn, + struct lsquic_engine_public *enpub, unsigned flags) +{ + conn->ifc_conn.cn_if = ietf_full_conn_iface_ptr; + if (enpub->enp_settings.es_scid_len) + assert(CN_SCID(&conn->ifc_conn)->len); + conn->ifc_enpub = enpub; + conn->ifc_settings = &enpub->enp_settings; + conn->ifc_pub.lconn = &conn->ifc_conn; + conn->ifc_pub.send_ctl = &conn->ifc_send_ctl; + conn->ifc_pub.enpub = enpub; + conn->ifc_pub.mm = &enpub->enp_mm; + conn->ifc_pub.path = CUR_NPATH(conn); + TAILQ_INIT(&conn->ifc_pub.sending_streams); + TAILQ_INIT(&conn->ifc_pub.read_streams); + TAILQ_INIT(&conn->ifc_pub.write_streams); + TAILQ_INIT(&conn->ifc_pub.service_streams); + STAILQ_INIT(&conn->ifc_stream_ids_to_ss); + TAILQ_INIT(&conn->ifc_to_retire); + + lsquic_alarmset_init(&conn->ifc_alset, &conn->ifc_conn); + lsquic_alarmset_init_alarm(&conn->ifc_alset, AL_IDLE, idle_alarm_expired, conn); + lsquic_alarmset_init_alarm(&conn->ifc_alset, AL_ACK_APP, ack_alarm_expired, conn); + lsquic_alarmset_init_alarm(&conn->ifc_alset, AL_ACK_INIT, ack_alarm_expired, conn); + lsquic_alarmset_init_alarm(&conn->ifc_alset, AL_ACK_HSK, ack_alarm_expired, conn); + lsquic_alarmset_init_alarm(&conn->ifc_alset, AL_PING, ping_alarm_expired, conn); + lsquic_alarmset_init_alarm(&conn->ifc_alset, AL_HANDSHAKE, handshake_alarm_expired, conn); + lsquic_alarmset_init_alarm(&conn->ifc_alset, AL_CID_THROT, cid_throt_alarm_expired, conn); + lsquic_alarmset_init_alarm(&conn->ifc_alset, AL_PATH_CHAL_0, path_chal_0_alarm_expired, conn); + lsquic_alarmset_init_alarm(&conn->ifc_alset, AL_PATH_CHAL_1, path_chal_1_alarm_expired, conn); + lsquic_rechist_init(&conn->ifc_rechist[PNS_INIT], &conn->ifc_conn, 1); + lsquic_rechist_init(&conn->ifc_rechist[PNS_HSK], &conn->ifc_conn, 1); + lsquic_rechist_init(&conn->ifc_rechist[PNS_APP], &conn->ifc_conn, 1); + lsquic_send_ctl_init(&conn->ifc_send_ctl, &conn->ifc_alset, enpub, + flags & IFC_SERVER ? &server_ver_neg : &conn->ifc_u.cli.ifcli_ver_neg, + &conn->ifc_pub, SC_IETF|SC_NSTP); + lsquic_cfcw_init(&conn->ifc_pub.cfcw, &conn->ifc_pub, + conn->ifc_settings->es_cfcw); + conn->ifc_pub.all_streams = lsquic_hash_create(); + if (!conn->ifc_pub.all_streams) + goto err0; + conn->ifc_pub.u.ietf.prio_tree = lsquic_prio_tree_new(&conn->ifc_conn, + flags & IFC_SERVER ? conn->ifc_settings->es_h3_placeholders : 0); + if (!conn->ifc_pub.u.ietf.prio_tree) + goto err1; + conn->ifc_pub.u.ietf.qeh = &conn->ifc_qeh; + conn->ifc_pub.u.ietf.qdh = &conn->ifc_qdh; + + conn->ifc_peer_hq_settings.header_table_size = HQ_DF_QPACK_MAX_TABLE_CAPACITY; + conn->ifc_peer_hq_settings.num_placeholders = conn->ifc_settings->es_h3_placeholders; + conn->ifc_peer_hq_settings.max_header_list_size = HQ_DF_MAX_HEADER_LIST_SIZE; + conn->ifc_peer_hq_settings.qpack_blocked_streams = HQ_DF_QPACK_BLOCKED_STREAMS; + + conn->ifc_flags = flags | IFC_CREATED_OK | IFC_FIRST_TICK; + conn->ifc_max_ack_packno[PNS_INIT] = IQUIC_INVALID_PACKNO; + conn->ifc_max_ack_packno[PNS_HSK] = IQUIC_INVALID_PACKNO; + conn->ifc_max_ack_packno[PNS_APP] = IQUIC_INVALID_PACKNO; + conn->ifc_paths[0].cop_path.np_path_id = 0; + conn->ifc_paths[1].cop_path.np_path_id = 1; +#define valid_stream_id(v) ((v) <= VINT_MAX_VALUE) + conn->ifc_max_req_id = VINT_MAX_VALUE + 1; + conn->ifc_idle_to = enpub->enp_settings.es_idle_timeout * 1000 * 1000; + conn->ifc_ping_period = enpub->enp_settings.es_ping_period * 1000 * 1000; + return 0; + + err1: + lsquic_hash_destroy(conn->ifc_pub.all_streams); + err0: + return -1; +} + + +struct lsquic_conn * +lsquic_ietf_full_conn_client_new (struct lsquic_engine_public *enpub, + unsigned flags, + const char *hostname, unsigned short max_packet_size, int is_ipv4, + const unsigned char *zero_rtt, size_t zero_rtt_sz, + const unsigned char *token, size_t token_sz) +{ + const struct enc_session_funcs_iquic *esfi; + struct ietf_full_conn *conn; + enum lsquic_version ver, zero_rtt_version; + unsigned versions; + + conn = calloc(1, sizeof(*conn)); + if (!conn) + return NULL; + /* Set the flags early so that correct CID is used for logging */ + conn->ifc_conn.cn_flags |= LSCONN_IETF; + conn->ifc_conn.cn_cces = conn->ifc_cces; + conn->ifc_conn.cn_n_cces = sizeof(conn->ifc_cces) + / sizeof(conn->ifc_cces[0]); + if (!ietf_full_conn_add_scid(conn, enpub, CCE_USED, lsquic_time_now())) + { + free(conn); + return NULL; + } + + versions = enpub->enp_settings.es_versions & LSQUIC_IETF_VERSIONS; + assert(versions); + ver = highest_bit_set(versions); + if (zero_rtt) + { + zero_rtt_version = lsquic_zero_rtt_version(zero_rtt, zero_rtt_sz); + if (zero_rtt_version < N_LSQVER && ((1 << zero_rtt_version) & versions)) + ver = zero_rtt_version; + } + esfi = select_esf_iquic_by_ver(ver); + + if (!max_packet_size) + { + if (is_ipv4) + max_packet_size = IQUIC_MAX_IPv4_PACKET_SZ; + else + max_packet_size = IQUIC_MAX_IPv6_PACKET_SZ; + } + conn->ifc_paths[0].cop_path.np_pack_size = max_packet_size; + + if (0 != ietf_full_conn_init(conn, enpub, flags)) + { + free(conn); + return NULL; + } + if (token) + { + if (0 != lsquic_send_ctl_set_token(&conn->ifc_send_ctl, token, + token_sz)) + { + free(conn); + return NULL; + } + } + + /* Do not infer anything about server limits before processing its + * transport parameters. + */ + conn->ifc_max_streams_in[SD_BIDI] = enpub->enp_settings.es_max_streams_in; + conn->ifc_max_allowed_stream_id[SIT_BIDI_SERVER] = + enpub->enp_settings.es_max_streams_in << SIT_SHIFT; + + if (flags & IFC_HTTP) + { + if (enpub->enp_settings.es_support_push && CLIENT_PUSH_SUPPORT) + conn->ifc_max_streams_in[SD_UNI] + = MAX(3, enpub->enp_settings.es_max_streams_in); + else + conn->ifc_max_streams_in[SD_UNI] = 3; + } + else + conn->ifc_max_streams_in[SD_UNI] = enpub->enp_settings.es_max_streams_in; + conn->ifc_max_allowed_stream_id[SIT_UNI_SERVER] + = conn->ifc_max_streams_in[SD_UNI] << SIT_SHIFT; + + init_ver_neg(conn, versions, &ver); + assert(ver == conn->ifc_u.cli.ifcli_ver_neg.vn_ver); + if (conn->ifc_settings->es_handshake_to) + lsquic_alarmset_set(&conn->ifc_alset, AL_HANDSHAKE, + lsquic_time_now() + conn->ifc_settings->es_handshake_to); + if (enpub->enp_settings.es_support_push && CLIENT_PUSH_SUPPORT) + { + conn->ifc_u.cli.ifcli_flags |= IFCLI_PUSH_ENABLED; + conn->ifc_u.cli.ifcli_max_push_id = 100; + LSQ_DEBUG("push enabled: set MAX_PUSH_ID to %"PRIu64, + conn->ifc_u.cli.ifcli_max_push_id); + } + conn->ifc_conn.cn_pf = select_pf_by_ver(ver); + conn->ifc_conn.cn_esf_c = select_esf_common_by_ver(ver); + conn->ifc_conn.cn_esf.i = esfi; + lsquic_generate_cid(CUR_DCID(conn), 0); + conn->ifc_conn.cn_enc_session = + conn->ifc_conn.cn_esf.i->esfi_create_client(hostname, + conn->ifc_enpub, &conn->ifc_conn, CUR_DCID(conn), + &conn->ifc_u.cli.ifcli_ver_neg, + (void **) conn->ifc_crypto_streams, &crypto_stream_if, + zero_rtt, zero_rtt_sz); + if (!conn->ifc_conn.cn_enc_session) + { + /* TODO: free other stuff */ + free(conn); + return NULL; + } + + conn->ifc_crypto_streams[ENC_LEV_CLEAR] = lsquic_stream_new_crypto( + ENC_LEV_CLEAR, &conn->ifc_pub, &lsquic_cry_sm_if, + conn->ifc_conn.cn_enc_session, + SCF_IETF|SCF_DI_AUTOSWITCH|SCF_CALL_ON_NEW|SCF_CRITICAL); + if (!conn->ifc_crypto_streams[ENC_LEV_CLEAR]) + { + /* TODO: free other stuff */ + free(conn); + return NULL; + } + if (!lsquic_stream_get_ctx(conn->ifc_crypto_streams[ENC_LEV_CLEAR])) + { + /* TODO: free other stuff */ + free(conn); + return NULL; + } + conn->ifc_pub.packet_out_malo = + lsquic_malo_create(sizeof(struct lsquic_packet_out)); + if (!conn->ifc_pub.packet_out_malo) + { + free(conn); + lsquic_stream_destroy(conn->ifc_crypto_streams[ENC_LEV_CLEAR]); + return NULL; + } + + LSQ_DEBUG("negotiating version %s", + lsquic_ver2str[conn->ifc_u.cli.ifcli_ver_neg.vn_ver]); + conn->ifc_process_incoming_packet = process_incoming_packet_verneg; + LSQ_DEBUG("logging using %s SCID", + LSQUIC_LOG_CONN_ID == CN_SCID(&conn->ifc_conn) ? "client" : "server"); + return &conn->ifc_conn; +} + + +typedef char mini_conn_does_not_have_more_cces[ + sizeof(((struct ietf_mini_conn *)0)->imc_cces) + <= sizeof(((struct ietf_full_conn *)0)->ifc_cces) ? 1 : -1]; + +struct lsquic_conn * +lsquic_ietf_full_conn_server_new (struct lsquic_engine_public *enpub, + unsigned flags, struct lsquic_conn *mini_conn) +{ + struct ietf_mini_conn *const imc = (void *) mini_conn; + struct ietf_full_conn *conn; + struct lsquic_packet_out *packet_out; + struct lsquic_packet_in *packet_in; + struct conn_cid_elem *cce; + int have_errors, have_outgoing_ack; + lsquic_packno_t next_packno; + lsquic_time_t now; + packno_set_t set; + enum packnum_space pns; + unsigned i; + + conn = calloc(1, sizeof(*conn)); + if (!conn) + return NULL; + now = lsquic_time_now(); + conn->ifc_conn.cn_cces = conn->ifc_cces; + conn->ifc_conn.cn_n_cces = sizeof(conn->ifc_cces) + / sizeof(conn->ifc_cces[0]); + assert(conn->ifc_conn.cn_n_cces >= mini_conn->cn_n_cces); + conn->ifc_conn.cn_cur_cce_idx = mini_conn->cn_cur_cce_idx; + conn->ifc_conn.cn_cces_mask = mini_conn->cn_cces_mask; + for (cce = mini_conn->cn_cces, i = 0; cce < END_OF_CCES(mini_conn); + ++cce, ++i) + if ((1 << (cce - mini_conn->cn_cces)) & mini_conn->cn_cces_mask) + { + conn->ifc_conn.cn_cces[i].cce_cid = cce->cce_cid; + conn->ifc_conn.cn_cces[i].cce_flags = cce->cce_flags; + if (cce->cce_flags & CCE_SEQNO) + { + if (cce->cce_seqno > conn->ifc_scid_seqno) + conn->ifc_scid_seqno = cce->cce_seqno; + conn->ifc_conn.cn_cces[i].cce_seqno = cce->cce_seqno; + conn->ifc_scid_timestamp[i] = now; + } + else + conn->ifc_original_cids |= 1 << i; + } + ++conn->ifc_scid_seqno; + + /* Set the flags early so that correct CID is used for logging */ + conn->ifc_conn.cn_flags |= LSCONN_IETF | LSCONN_SERVER; + + if (0 != ietf_full_conn_init(conn, enpub, flags)) + { + free(conn); + return NULL; + } + conn->ifc_pub.packet_out_malo = + lsquic_malo_create(sizeof(struct lsquic_packet_out)); + if (!conn->ifc_pub.packet_out_malo) + { + /* XXX: deinit conn? */ + free(conn); + return NULL; + } + if (imc->imc_flags & IMC_IGNORE_INIT) + conn->ifc_flags |= IFC_IGNORE_INIT; + + conn->ifc_conn.cn_flags |= mini_conn->cn_flags & + LSCONN_PEER_GOING_AWAY /* XXX what is this for, again? Was copied */; + conn->ifc_paths[0].cop_path = imc->imc_path; + conn->ifc_paths[0].cop_flags = COP_VALIDATED; + conn->ifc_used_paths = 1 << 0; +#ifndef NDEBUG + if (getenv("LSQUIC_CN_PACK_SIZE")) + { + conn->ifc_paths[0].cop_path.np_pack_size + = atoi(getenv("LSQUIC_CN_PACK_SIZE")); + LSQ_INFO("set packet size to %hu (env)", + conn->ifc_paths[0].cop_path.np_pack_size); + } +#endif + + conn->ifc_max_streams_in[SD_BIDI] + = enpub->enp_settings.es_init_max_streams_bidi; + conn->ifc_max_allowed_stream_id[SIT_BIDI_CLIENT] + = conn->ifc_max_streams_in[SD_BIDI] << SIT_SHIFT; + conn->ifc_max_streams_in[SD_UNI] + = enpub->enp_settings.es_init_max_streams_uni; + conn->ifc_max_allowed_stream_id[SIT_UNI_CLIENT] + = conn->ifc_max_streams_in[SD_UNI] << SIT_SHIFT; + conn->ifc_conn.cn_version = mini_conn->cn_version; + conn->ifc_conn.cn_flags |= LSCONN_VER_SET; + conn->ifc_conn.cn_pf = mini_conn->cn_pf; + conn->ifc_conn.cn_esf_c = mini_conn->cn_esf_c; + conn->ifc_conn.cn_esf = mini_conn->cn_esf; + + if (enpub->enp_settings.es_support_push) + conn->ifc_u.ser.ifser_flags |= IFSER_PUSH_ENABLED; + if (flags & IFC_HTTP) + { + conn->ifc_pub.u.ietf.promises = lsquic_hash_create(); + if (!conn->ifc_pub.u.ietf.promises) + { + /* XXX: deinit conn? */ + free(conn); + return NULL; + } + } + + assert(mini_conn->cn_flags & LSCONN_HANDSHAKE_DONE); + conn->ifc_conn.cn_flags |= LSCONN_HANDSHAKE_DONE; + + conn->ifc_conn.cn_enc_session = mini_conn->cn_enc_session; + mini_conn->cn_enc_session = NULL; + conn->ifc_conn.cn_esf.i->esfi_set_conn(conn->ifc_conn.cn_enc_session, + &conn->ifc_conn); + conn->ifc_process_incoming_packet = process_incoming_packet_fast; + + conn->ifc_send_ctl.sc_cur_packno = imc->imc_next_packno - 1; + + for (pns = 0; pns < N_PNS; ++pns) + { + for (set = imc->imc_recvd_packnos[pns], i = 0; + set && i < MAX_PACKETS; set &= ~(1ULL << i), ++i) + if (set & (1ULL << i)) + (void) lsquic_rechist_received(&conn->ifc_rechist[pns], i, 0); + if (i) + conn->ifc_rechist[pns].rh_largest_acked_received + = imc->imc_largest_recvd[pns]; + } + + /* TODO: Transfer incoming packets. */ + + /* Mini connection sends out packets 0, 1, 2... and so on. It deletes + * packets that have been successfully sent and acked or those that have + * been lost. We take ownership of all packets in mc_packets_out; those + * that are not on the list are recorded in fc_send_ctl.sc_senhist. + */ + have_errors = 0; + have_outgoing_ack = 0; + next_packno = ~0ULL; + while ((packet_out = TAILQ_FIRST(&imc->imc_packets_out))) + { + TAILQ_REMOVE(&imc->imc_packets_out, packet_out, po_next); + + /* Holes in the sequence signify ACKed or lost packets */ + ++next_packno; + for ( ; next_packno < packet_out->po_packno; ++next_packno) + lsquic_senhist_add(&conn->ifc_send_ctl.sc_senhist, next_packno); + + packet_out->po_path = CUR_NPATH(conn); + if (imc->imc_sent_packnos & (1ULL << packet_out->po_packno)) + { + LSQ_DEBUG("got sent packet_out %"PRIu64" from mini", + packet_out->po_packno); + if (0 != lsquic_send_ctl_sent_packet(&conn->ifc_send_ctl, + packet_out) + && !have_errors /* Warn once */) + { + ++have_errors; + LSQ_WARN("could not add packet %"PRIu64" to sent set: %s", + packet_out->po_packno, strerror(errno)); + } + } + else + { + LSQ_DEBUG("got unsent packet_out %"PRIu64" from mini (will send)", + packet_out->po_packno); + lsquic_send_ctl_scheduled_one(&conn->ifc_send_ctl, packet_out); + have_outgoing_ack |= packet_out->po_frame_types & + (1 << QUIC_FRAME_ACK); + } + } + + for (pns = 0; pns < N_PNS; ++pns) + for (i = 0; i < 4; ++i) + { + conn->ifc_ecn_counts_in[pns][i] = imc->imc_ecn_counts_in[pns][i]; + conn->ifc_ecn_counts_out[pns][i] = imc->imc_ecn_counts_out[pns][i]; + } + conn->ifc_incoming_ecn = imc->imc_incoming_ecn; + conn->ifc_pub.rtt_stats = imc->imc_rtt_stats; + + if (conn->ifc_original_cids) + { + lsquic_time_t now = lsquic_time_now(); + lsquic_alarmset_init_alarm(&conn->ifc_alset, AL_RET_CIDS, + ret_cids_alarm_expired, conn); + lsquic_alarmset_set(&conn->ifc_alset, AL_RET_CIDS, + now + RET_CID_TIMEOUT); + } + + conn->ifc_last_live_update = now; + + /* TODO: do something if there are errors */ + + LSQ_DEBUG("Calling on_new_conn callback"); + conn->ifc_conn_ctx = conn->ifc_enpub->enp_stream_if->on_new_conn( + conn->ifc_enpub->enp_stream_if_ctx, &conn->ifc_conn); + + /* TODO: do something if there is outgoing ACK */ + + /* TODO: check return valuee */ (void) + handshake_ok(&conn->ifc_conn); + + while ((packet_in = TAILQ_FIRST(&imc->imc_app_packets))) + { + TAILQ_REMOVE(&imc->imc_app_packets, packet_in, pi_next); + LSQ_DEBUG("inherit packet %"PRIu64" from mini conn", + packet_in->pi_packno); + ietf_full_conn_ci_packet_in(&conn->ifc_conn, packet_in); + lsquic_packet_in_put(conn->ifc_pub.mm, packet_in); + } + + LSQ_DEBUG("logging using %s SCID", + LSQUIC_LOG_CONN_ID == CN_SCID(&conn->ifc_conn) ? "server" : "client"); + return &conn->ifc_conn; +} + + +static int +should_generate_ack (struct ietf_full_conn *conn) +{ + unsigned lost_acks; + + /* Need to set which ACKs are queued because generate_ack_frame() does not + * generate ACKs unconditionally. + */ + lost_acks = lsquic_send_ctl_lost_ack(&conn->ifc_send_ctl); + if (lost_acks) + conn->ifc_flags |= lost_acks << IFCBIT_ACK_QUED_SHIFT; + + return (conn->ifc_flags & IFC_ACK_QUEUED) != 0; +} + + +static int +ietf_full_conn_ci_can_write_ack (struct lsquic_conn *lconn) +{ + struct ietf_full_conn *conn = (struct ietf_full_conn *) lconn; + return should_generate_ack(conn); +} + + +static unsigned +ietf_full_conn_ci_cancel_pending_streams (struct lsquic_conn *lconn, unsigned n) +{ + struct ietf_full_conn *conn = (struct ietf_full_conn *) lconn; + if (n > conn->ifc_n_delayed_streams) + conn->ifc_n_delayed_streams = 0; + else + conn->ifc_n_delayed_streams -= n; + return conn->ifc_n_delayed_streams; +} + + +static int +generate_ack_frame_for_pns (struct ietf_full_conn *conn, + struct lsquic_packet_out *packet_out, enum packnum_space pns, + lsquic_time_t now) +{ + int has_missing, w; + + w = conn->ifc_conn.cn_pf->pf_gen_ack_frame( + packet_out->po_data + packet_out->po_data_sz, + lsquic_packet_out_avail(packet_out), + (gaf_rechist_first_f) lsquic_rechist_first, + (gaf_rechist_next_f) lsquic_rechist_next, + (gaf_rechist_largest_recv_f) lsquic_rechist_largest_recv, + &conn->ifc_rechist[pns], now, &has_missing, &packet_out->po_ack2ed, + conn->ifc_incoming_ecn ? conn->ifc_ecn_counts_in[pns] : NULL); + if (w < 0) { + ABORT_ERROR("generating ACK frame failed: %d", errno); + return -1; + } + char buf[0x100]; + lsquic_hexstr(packet_out->po_data + packet_out->po_data_sz, w, buf, sizeof(buf)); + LSQ_DEBUG("ACK bytes: %s", buf); + EV_LOG_GENERATED_ACK_FRAME(LSQUIC_LOG_CONN_ID, conn->ifc_conn.cn_pf, + packet_out->po_data + packet_out->po_data_sz, w); + lsquic_send_ctl_scheduled_ack(&conn->ifc_send_ctl, pns, + packet_out->po_ack2ed); + packet_out->po_frame_types |= 1 << QUIC_FRAME_ACK; + lsquic_send_ctl_incr_pack_sz(&conn->ifc_send_ctl, packet_out, w); + packet_out->po_regen_sz += w; + if (has_missing) + conn->ifc_flags |= IFC_ACK_HAD_MISS; + else + conn->ifc_flags &= ~IFC_ACK_HAD_MISS; + LSQ_DEBUG("Put %d bytes of ACK frame into packet on outgoing queue", w); + if (conn->ifc_n_cons_unretx >= 20 && + !lsquic_send_ctl_have_outgoing_retx_frames(&conn->ifc_send_ctl)) + { + LSQ_DEBUG("schedule MAX_DATA frame after %u non-retx " + "packets sent", conn->ifc_n_cons_unretx); + conn->ifc_send_flags |= SF_SEND_MAX_DATA; + } + + conn->ifc_n_slack_akbl[pns] = 0; + conn->ifc_flags &= ~(IFC_ACK_QUED_INIT << pns); + lsquic_alarmset_unset(&conn->ifc_alset, AL_ACK_INIT + pns); + lsquic_send_ctl_sanity_check(&conn->ifc_send_ctl); + LSQ_DEBUG("%s ACK state reset", lsquic_pns2str[pns]); + + return 0; +} + + +/* Return number of packets scheduled or 0 on error */ +static unsigned +generate_ack_frame (struct ietf_full_conn *conn, lsquic_time_t now) +{ + struct lsquic_packet_out *packet_out; + enum packnum_space pns; + unsigned count; + int s; + + count = 0; + for (pns = 0; pns < N_PNS; ++pns) + if (conn->ifc_flags & (IFC_ACK_QUED_INIT << pns)) + { + packet_out = lsquic_send_ctl_new_packet_out(&conn->ifc_send_ctl, + 0, pns, CUR_NPATH(conn)); + if (!packet_out) + { + ABORT_ERROR("cannot allocate packet: %s", strerror(errno)); + return 0; + } + s = generate_ack_frame_for_pns(conn, packet_out, pns, now); + lsquic_send_ctl_scheduled_one(&conn->ifc_send_ctl, packet_out); + if (s != 0) + return 0; + ++count; + } + + return count; +} + + +static struct lsquic_packet_out * +get_writeable_packet_on_path (struct ietf_full_conn *conn, + unsigned need_at_least, const struct network_path *path, + int regen_match) +{ + struct lsquic_packet_out *packet_out; + int is_err; + + packet_out = lsquic_send_ctl_get_writeable_packet(&conn->ifc_send_ctl, + PNS_APP, need_at_least, path, regen_match, &is_err); + if (!packet_out && is_err) + ABORT_ERROR("cannot allocate packet: %s", strerror(errno)); + return packet_out; +} + + +static struct lsquic_packet_out * +get_writeable_packet (struct ietf_full_conn *conn, unsigned need_at_least) +{ + return get_writeable_packet_on_path(conn, need_at_least, + CUR_NPATH(conn), 0); +} + + +static void +generate_max_data_frame (struct ietf_full_conn *conn) +{ + const uint64_t offset = lsquic_cfcw_get_fc_recv_off(&conn->ifc_pub.cfcw); + struct lsquic_packet_out *packet_out; + unsigned need; + int w; + + need = conn->ifc_conn.cn_pf->pf_max_data_frame_size(offset); + packet_out = get_writeable_packet(conn, need); + if (!packet_out) + return; + w = conn->ifc_conn.cn_pf->pf_gen_max_data_frame( + packet_out->po_data + packet_out->po_data_sz, + lsquic_packet_out_avail(packet_out), offset); + if (w < 0) + { + ABORT_ERROR("Generating MAX_DATA frame failed"); + return; + } + LSQ_DEBUG("generated %d-byte MAX_DATA frame (offset: %"PRIu64")", w, offset); + EV_LOG_CONN_EVENT(LSQUIC_LOG_CONN_ID, "generated MAX_DATA frame, offset=%" + PRIu64, offset); + lsquic_send_ctl_incr_pack_sz(&conn->ifc_send_ctl, packet_out, w); + packet_out->po_frame_types |= QUIC_FTBIT_MAX_DATA; + conn->ifc_send_flags &= ~SF_SEND_MAX_DATA; +} + + +static int +can_issue_cids (const struct ietf_full_conn *conn) +{ + return conn->ifc_active_cids_count < conn->ifc_active_cids_limit; +} + + +static int +generate_new_cid_frame (struct ietf_full_conn *conn, lsquic_time_t now) +{ + struct lsquic_packet_out *packet_out; + struct conn_cid_elem *cce; + size_t need; + int w; + unsigned char token_buf[IQUIC_SRESET_TOKEN_SZ]; + + assert(conn->ifc_enpub->enp_settings.es_scid_len); + + need = conn->ifc_conn.cn_pf->pf_new_connection_id_frame_size( + conn->ifc_scid_seqno, conn->ifc_enpub->enp_settings.es_scid_len); + packet_out = get_writeable_packet(conn, need); + if (!packet_out) + return -1; + + if (!(cce = ietf_full_conn_add_scid(conn, conn->ifc_enpub, 0, now))) + { + ABORT_WARN("cannot add a new SCID"); + return -1; + } + + if (conn->ifc_flags & IFC_SERVER) + lsquic_tg_generate_sreset(conn->ifc_enpub->enp_tokgen, &cce->cce_cid, + token_buf); + else + memset(token_buf, 0, sizeof(token_buf)); + + if (0 != lsquic_engine_add_cid(conn->ifc_enpub, &conn->ifc_conn, + cce - conn->ifc_cces)) + { + ABORT_WARN("cannot track new SCID"); + return -1; + } + + w = conn->ifc_conn.cn_pf->pf_gen_new_connection_id_frame( + packet_out->po_data + packet_out->po_data_sz, + lsquic_packet_out_avail(packet_out), cce->cce_seqno, + &cce->cce_cid, token_buf, sizeof(token_buf)); + if (w < 0) + { + ABORT_ERROR("generating NEW_CONNECTION_ID frame failed: %d", errno); + return -1; + } + LSQ_DEBUGC("generated %d-byte NEW_CONNECTION_ID frame (CID: %"CID_FMT")", + w, CID_BITS(&cce->cce_cid)); + EV_LOG_GENERATED_NEW_CONNECTION_ID_FRAME(LSQUIC_LOG_CONN_ID, + conn->ifc_conn.cn_pf, packet_out->po_data + packet_out->po_data_sz, w); + packet_out->po_frame_types |= QUIC_FTBIT_NEW_CONNECTION_ID; + lsquic_send_ctl_incr_pack_sz(&conn->ifc_send_ctl, packet_out, w); + ++conn->ifc_active_cids_count; + + if ((1 << conn->ifc_conn.cn_n_cces) - 1 == conn->ifc_conn.cn_cces_mask + || !can_issue_cids(conn)) + { + conn->ifc_send_flags &= ~SF_SEND_NEW_CID; + LSQ_DEBUG("All %u SCID slots have been assigned", + conn->ifc_conn.cn_n_cces); + } + + return 0; +} + + +static void +maybe_get_rate_available_scid_slot (struct ietf_full_conn *conn, + lsquic_time_t now) +{ + unsigned i, active_cid; + lsquic_time_t total_elapsed, elapsed_thresh, period, wait_time; + + if (!conn->ifc_enpub->enp_settings.es_scid_iss_rate) + { + conn->ifc_send_flags |= SF_SEND_NEW_CID; + return; + } + + /* period: ns per cid */ + period = (60 * 1000000) / conn->ifc_enpub->enp_settings.es_scid_iss_rate; + active_cid = 0; + total_elapsed = 0; + for (i = 0; i < MAX_SCID; i++) + { + if (conn->ifc_original_cids & (1 << i)) + continue; + active_cid += 1; + total_elapsed += (now - conn->ifc_scid_timestamp[i]); + } + elapsed_thresh = ((active_cid * (active_cid + 1)) / 2) * period; + /* compare total elapsed ns to elapsed ns threshold */ + if (total_elapsed < elapsed_thresh) + { + wait_time = (elapsed_thresh - total_elapsed) / active_cid; + LSQ_DEBUG("cid_throt no SCID slots available (rate-limited), " + "must wait %"PRIu64" ns", wait_time); + lsquic_alarmset_set(&conn->ifc_alset, AL_CID_THROT, now + wait_time); + conn->ifc_send_flags &= ~SF_SEND_NEW_CID; + } + else + conn->ifc_send_flags |= SF_SEND_NEW_CID; +} + + +static void +generate_new_cid_frames (struct ietf_full_conn *conn, lsquic_time_t now) +{ + int s; + + do + { + s = generate_new_cid_frame(conn, now); + if (s < 0) + break; + if (conn->ifc_send_flags & SF_SEND_NEW_CID) + maybe_get_rate_available_scid_slot(conn, now); + } + while (conn->ifc_send_flags & SF_SEND_NEW_CID); +} + + +static int +generate_retire_cid_frame (struct ietf_full_conn *conn) +{ + struct lsquic_packet_out *packet_out; + struct dcid_elem *dce; + size_t need; + int w; + + dce = TAILQ_FIRST(&conn->ifc_to_retire); + assert(dce); + + need = conn->ifc_conn.cn_pf->pf_retire_cid_frame_size(dce->de_seqno); + packet_out = get_writeable_packet(conn, need); + if (!packet_out) + return -1; + + w = conn->ifc_conn.cn_pf->pf_gen_retire_cid_frame( + packet_out->po_data + packet_out->po_data_sz, + lsquic_packet_out_avail(packet_out), dce->de_seqno); + if (w < 0) + { + ABORT_ERROR("generating RETIRE_CONNECTION_ID frame failed: %d", errno); + return -1; + } + LSQ_DEBUG("generated %d-byte RETIRE_CONNECTION_ID frame (seqno: %u)", + w, dce->de_seqno); + EV_LOG_CONN_EVENT(LSQUIC_LOG_CONN_ID, "generated RETIRE_CONNECTION_ID " + "frame, seqno=%u", dce->de_seqno); + packet_out->po_frame_types |= QUIC_FTBIT_RETIRE_CONNECTION_ID; + lsquic_send_ctl_incr_pack_sz(&conn->ifc_send_ctl, packet_out, w); + + TAILQ_REMOVE(&conn->ifc_to_retire, dce, de_next_to_ret); + lsquic_malo_put(dce); + + if (TAILQ_EMPTY(&conn->ifc_to_retire)) + conn->ifc_send_flags &= ~SF_SEND_RETIRE_CID; + + return 0; +} + + +static void +generate_retire_cid_frames (struct ietf_full_conn *conn, lsquic_time_t now) +{ + int s; + + do + s = generate_retire_cid_frame(conn); + while (0 == s && (conn->ifc_send_flags & SF_SEND_RETIRE_CID)); +} + + +static void +generate_streams_blocked_frame (struct ietf_full_conn *conn, enum stream_dir sd) +{ + struct lsquic_packet_out *packet_out; + uint64_t limit; + size_t need; + int w; + + limit = conn->ifc_send.streams_blocked[sd]; + need = conn->ifc_conn.cn_pf->pf_streams_blocked_frame_size(limit); + packet_out = get_writeable_packet(conn, need); + if (!packet_out) + return; + + w = conn->ifc_conn.cn_pf->pf_gen_streams_blocked_frame( + packet_out->po_data + packet_out->po_data_sz, + lsquic_packet_out_avail(packet_out), sd == SD_UNI, limit); + if (w < 0) + { + ABORT_ERROR("generating STREAMS_BLOCKED frame failed: %d", errno); + return; + } + LSQ_DEBUG("generated %d-byte STREAMS_BLOCKED frame (uni: %d, " + "limit: %"PRIu64")", w, sd == SD_UNI, limit); + EV_LOG_CONN_EVENT(LSQUIC_LOG_CONN_ID, "generated %d-byte STREAMS_BLOCKED " + "frame (uni: %d, limit: %"PRIu64")", w, sd == SD_UNI, limit); + packet_out->po_frame_types |= QUIC_FTBIT_STREAM_BLOCKED; + lsquic_send_ctl_incr_pack_sz(&conn->ifc_send_ctl, packet_out, w); + conn->ifc_send_flags &= ~(SF_SEND_STREAMS_BLOCKED << sd); +} + + +static void +generate_streams_blocked_uni_frame (struct ietf_full_conn *conn, + lsquic_time_t now) +{ + generate_streams_blocked_frame(conn, SD_UNI); +} + + +static void +generate_streams_blocked_bidi_frame (struct ietf_full_conn *conn, + lsquic_time_t now) +{ + generate_streams_blocked_frame(conn, SD_BIDI); +} + + +static void +generate_max_streams_frame (struct ietf_full_conn *conn, enum stream_dir sd) +{ + struct lsquic_packet_out *packet_out; + enum stream_id_type sit; + uint64_t limit; + size_t need; + int w; + + limit = conn->ifc_closed_peer_streams[sd] + conn->ifc_max_streams_in[sd]; + need = conn->ifc_conn.cn_pf->pf_max_streams_frame_size(limit); + packet_out = get_writeable_packet(conn, need); + if (!packet_out) + return; + + w = conn->ifc_conn.cn_pf->pf_gen_max_streams_frame( + packet_out->po_data + packet_out->po_data_sz, + lsquic_packet_out_avail(packet_out), sd, limit); + if (w < 0) + { + ABORT_ERROR("generating MAX_STREAMS frame failed: %d", errno); + return; + } + LSQ_DEBUG("generated %d-byte MAX_STREAMS frame (uni: %d, " + "limit: %"PRIu64")", w, sd == SD_UNI, limit); + EV_LOG_CONN_EVENT(LSQUIC_LOG_CONN_ID, "generated %d-byte MAX_STREAMS " + "frame (uni: %d, limit: %"PRIu64")", w, sd == SD_UNI, limit); + packet_out->po_frame_types |= QUIC_FTBIT_MAX_STREAMS; + lsquic_send_ctl_incr_pack_sz(&conn->ifc_send_ctl, packet_out, w); + conn->ifc_send_flags &= ~(SF_SEND_MAX_STREAMS << sd); + + sit = gen_sit(!(conn->ifc_flags & IFC_SERVER), sd); + LSQ_DEBUG("max_allowed_stream_id[ %u ] goes from %"PRIu64" to %"PRIu64, + sit, conn->ifc_max_allowed_stream_id[ sit ], limit << SIT_SHIFT); + conn->ifc_max_allowed_stream_id[ sit ] = limit << SIT_SHIFT; +} + + +static void +generate_max_streams_uni_frame (struct ietf_full_conn *conn, lsquic_time_t now) +{ + generate_max_streams_frame(conn, SD_UNI); +} + + +static void +generate_max_streams_bidi_frame (struct ietf_full_conn *conn, lsquic_time_t now) +{ + generate_max_streams_frame(conn, SD_BIDI); +} + + +/* Return true if generated, false otherwise */ +static int +generate_blocked_frame (struct ietf_full_conn *conn) +{ + const uint64_t offset = conn->ifc_pub.conn_cap.cc_blocked; + struct lsquic_packet_out *packet_out; + size_t need; + int w; + + need = conn->ifc_conn.cn_pf->pf_blocked_frame_size(offset); + packet_out = get_writeable_packet(conn, need); + if (!packet_out) + return 0; + + w = conn->ifc_conn.cn_pf->pf_gen_blocked_frame( + packet_out->po_data + packet_out->po_data_sz, + lsquic_packet_out_avail(packet_out), offset); + if (w < 0) + { + ABORT_ERROR("generating BLOCKED frame failed: %d", errno); + return 0; + } + LSQ_DEBUG("generated %d-byte BLOCKED frame (offset: %"PRIu64")", w, offset); + EV_LOG_CONN_EVENT(LSQUIC_LOG_CONN_ID, "generated BLOCKED frame, offset=%" + PRIu64, offset); + packet_out->po_frame_types |= QUIC_FTBIT_BLOCKED; + lsquic_send_ctl_incr_pack_sz(&conn->ifc_send_ctl, packet_out, w); + + return 1; +} + + +/* Return true if generated, false otherwise */ +static int +generate_max_stream_data_frame (struct ietf_full_conn *conn, + struct lsquic_stream *stream) +{ + struct lsquic_packet_out *packet_out; + unsigned need; + uint64_t off; + int sz; + + off = lsquic_stream_fc_recv_off_const(stream); + need = conn->ifc_conn.cn_pf->pf_max_stream_data_frame_size(stream->id, off); + packet_out = get_writeable_packet(conn, need); + if (!packet_out) + return 0; + sz = conn->ifc_conn.cn_pf->pf_gen_max_stream_data_frame( + packet_out->po_data + packet_out->po_data_sz, + lsquic_packet_out_avail(packet_out), stream->id, off); + if (sz < 0) + { + ABORT_ERROR("Generating MAX_STREAM_DATA frame failed"); + return 0; + } + lsquic_send_ctl_incr_pack_sz(&conn->ifc_send_ctl, packet_out, sz); + packet_out->po_frame_types |= 1 << QUIC_FRAME_MAX_STREAM_DATA; + lsquic_stream_max_stream_data_sent(stream); + return 0; +} + + +/* Return true if generated, false otherwise */ +static int +generate_stream_blocked_frame (struct ietf_full_conn *conn, + struct lsquic_stream *stream) +{ + struct lsquic_packet_out *packet_out; + unsigned need; + uint64_t off; + int sz; + + off = lsquic_stream_combined_send_off(stream); + need = conn->ifc_conn.cn_pf->pf_stream_blocked_frame_size(stream->id, off); + packet_out = get_writeable_packet(conn, need); + if (!packet_out) + return 0; + sz = conn->ifc_conn.cn_pf->pf_gen_stream_blocked_frame( + packet_out->po_data + packet_out->po_data_sz, + lsquic_packet_out_avail(packet_out), stream->id, off); + if (sz < 0) + { + ABORT_ERROR("Generating STREAM_BLOCKED frame failed"); + return 0; + } + lsquic_send_ctl_incr_pack_sz(&conn->ifc_send_ctl, packet_out, sz); + packet_out->po_frame_types |= 1 << QUIC_FRAME_STREAM_BLOCKED; + lsquic_stream_blocked_frame_sent(stream); + return 0; +} + + +static int +generate_stop_sending_frame (struct ietf_full_conn *conn, + lsquic_stream_id_t stream_id, enum http_error_code error_code) +{ + struct lsquic_packet_out *packet_out; + size_t need; + int w; + + need = conn->ifc_conn.cn_pf->pf_stop_sending_frame_size(stream_id, + error_code); + packet_out = get_writeable_packet(conn, need); + if (!packet_out) + return -1; + + w = conn->ifc_conn.cn_pf->pf_gen_stop_sending_frame( + packet_out->po_data + packet_out->po_data_sz, + lsquic_packet_out_avail(packet_out), + stream_id, error_code); + if (w < 0) + { + ABORT_ERROR("generating STOP_SENDING frame failed: %d", errno); + return -1; + } + LSQ_DEBUG("generated %d-byte STOP_SENDING frame (stream id: %"PRIu64", " + "error code: %u)", w, stream_id, error_code); + EV_LOG_GENERATED_STOP_SENDING_FRAME(LSQUIC_LOG_CONN_ID, stream_id, + error_code); + packet_out->po_frame_types |= QUIC_FTBIT_STOP_SENDING; + lsquic_send_ctl_incr_pack_sz(&conn->ifc_send_ctl, packet_out, w); + + return 0; +} + + +static void +generate_stop_sending_frames (struct ietf_full_conn *conn, lsquic_time_t now) +{ + struct stream_id_to_ss *sits; + + assert(conn->ifc_send_flags & SF_SEND_STOP_SENDING); + + while (!STAILQ_EMPTY(&conn->ifc_stream_ids_to_ss)) + { + sits = STAILQ_FIRST(&conn->ifc_stream_ids_to_ss); + if (0 == generate_stop_sending_frame(conn, sits->sits_stream_id, + sits->sits_error_code)) + { + STAILQ_REMOVE_HEAD(&conn->ifc_stream_ids_to_ss, sits_next); + free(sits); + } + else + break; + } + + if (STAILQ_EMPTY(&conn->ifc_stream_ids_to_ss)) + conn->ifc_send_flags &= ~SF_SEND_STOP_SENDING; +} + + +/* Return true if generated, false otherwise */ +static int +generate_rst_stream_frame (struct ietf_full_conn *conn, + struct lsquic_stream *stream) +{ + lsquic_packet_out_t *packet_out; + unsigned need; + int sz, s; + + need = conn->ifc_conn.cn_pf->pf_rst_frame_size(stream->id, + stream->tosend_off, stream->error_code); + packet_out = get_writeable_packet(conn, need); + if (!packet_out) + { + LSQ_DEBUG("cannot get writeable packet for RESET_STREAM frame"); + return 0; + } + sz = conn->ifc_conn.cn_pf->pf_gen_rst_frame( + packet_out->po_data + packet_out->po_data_sz, + lsquic_packet_out_avail(packet_out), stream->id, + stream->tosend_off, stream->error_code); + if (sz < 0) + { + ABORT_ERROR("gen_rst_frame failed"); + return 0; + } + lsquic_send_ctl_incr_pack_sz(&conn->ifc_send_ctl, packet_out, sz); + packet_out->po_frame_types |= 1 << QUIC_FRAME_RST_STREAM; + s = lsquic_packet_out_add_stream(packet_out, conn->ifc_pub.mm, stream, + QUIC_FRAME_RST_STREAM, packet_out->po_data_sz, sz); + if (s != 0) + { + ABORT_ERROR("adding stream to packet failed: %s", strerror(errno)); + return 0; + } + lsquic_stream_rst_frame_sent(stream); + LSQ_DEBUG("wrote RST: stream %"PRIu64"; offset 0x%"PRIX64"; error code " + "%"PRIu64, stream->id, stream->tosend_off, stream->error_code); + + return 1; +} + + +static int +is_our_stream (const struct ietf_full_conn *conn, + const struct lsquic_stream *stream) +{ + const unsigned is_server = !!(conn->ifc_flags & IFC_SERVER); + return (1 & stream->id) == is_server; +} + + +static int +is_peer_initiated (const struct ietf_full_conn *conn, + lsquic_stream_id_t stream_id) +{ + const unsigned is_server = !!(conn->ifc_flags & IFC_SERVER); + return (1 & stream_id) != is_server; +} + + +#if 0 +/* XXX seems we don't need this? */ +static unsigned +count_streams (const struct ietf_full_conn *conn, enum stream_id_type sit) +{ + const struct lsquic_stream *stream; + struct lsquic_hash_elem *el; + unsigned count; + int peer; + + peer = is_peer_initiated(conn, sit); + for (el = lsquic_hash_first(conn->ifc_pub.all_streams); el; + el = lsquic_hash_next(conn->ifc_pub.all_streams)) + { + stream = lsquic_hashelem_getdata(el); + count += (stream->id & SIT_MASK) == sit + && !lsquic_stream_is_closed(stream) + /* When counting peer-initiated streams, do not include those + * that have been reset: + */ + && !(peer && lsquic_stream_is_reset(stream)); + } + + return count; +} + + +#endif + + +/* Because stream IDs are distributed unevenly, it is more efficient to + * maintain four sets of closed stream IDs. + */ +static void +conn_mark_stream_closed (struct ietf_full_conn *conn, + lsquic_stream_id_t stream_id) +{ + lsquic_stream_id_t shifted_id; + uint64_t max_allowed, thresh; + enum stream_id_type idx; + enum stream_dir sd; + + idx = stream_id & SIT_MASK; + shifted_id = stream_id >> SIT_SHIFT; + + if (is_peer_initiated(conn, stream_id) + && !lsquic_set64_has(&conn->ifc_closed_stream_ids[idx], shifted_id)) + { + sd = (stream_id >> SD_SHIFT) & 1; + ++conn->ifc_closed_peer_streams[sd]; + if (0 == (conn->ifc_send_flags & (SF_SEND_MAX_STREAMS << sd))) + { + max_allowed = conn->ifc_max_allowed_stream_id[idx] >> SIT_SHIFT; + thresh = conn->ifc_closed_peer_streams[sd] + + conn->ifc_max_streams_in[sd] / 2; + if (thresh >= max_allowed) + { + LSQ_DEBUG("closed incoming %sdirectional streams reached " + "%"PRIu64", scheduled MAX_STREAMS frame", + sd == SD_UNI ? "uni" : "bi", + conn->ifc_closed_peer_streams[sd]); + conn->ifc_send_flags |= SF_SEND_MAX_STREAMS << sd; + } + } + } + + if (0 == lsquic_set64_add(&conn->ifc_closed_stream_ids[idx], shifted_id)) + LSQ_DEBUG("marked stream %"PRIu64" as closed", stream_id); + else + ABORT_ERROR("could not add element to set: %s", strerror(errno)); +} + + +static int +conn_is_stream_closed (struct ietf_full_conn *conn, + lsquic_stream_id_t stream_id) +{ + enum stream_id_type idx = stream_id & SIT_MASK; + stream_id >>= SIT_SHIFT; + return lsquic_set64_has(&conn->ifc_closed_stream_ids[idx], stream_id); +} + + +static int +either_side_going_away (const struct ietf_full_conn *conn) +{ + return (conn->ifc_flags & IFC_GOING_AWAY) + || (conn->ifc_conn.cn_flags & LSCONN_PEER_GOING_AWAY); +} + + +static void +maybe_create_delayed_streams (struct ietf_full_conn *conn) +{ + unsigned avail, delayed; + + delayed = conn->ifc_n_delayed_streams; + if (0 == delayed) + return; + + avail = ietf_full_conn_ci_n_avail_streams(&conn->ifc_conn); + while (avail > 0) + { + if (0 == create_bidi_stream_out(conn)) + { + --avail; + --conn->ifc_n_delayed_streams; + if (0 == conn->ifc_n_delayed_streams) + break; + } + else + { + LSQ_INFO("cannot create BIDI stream"); + break; + } + } + + LSQ_DEBUG("created %u delayed stream%.*s", + delayed - conn->ifc_n_delayed_streams, + delayed - conn->ifc_n_delayed_streams != 1, "s"); +} + + +static int +have_bidi_streams (const struct ietf_full_conn *conn) +{ + const struct lsquic_stream *stream; + struct lsquic_hash_elem *el; + + for (el = lsquic_hash_first(conn->ifc_pub.all_streams); el; + el = lsquic_hash_next(conn->ifc_pub.all_streams)) + { + stream = lsquic_hashelem_getdata(el); + if (SIT_BIDI_CLIENT == (stream->id & SIT_MASK)) + return 1; + } + + return 0; +} + + +static void +maybe_close_conn (struct ietf_full_conn *conn) +{ + if ((conn->ifc_flags & (IFC_CLOSING|IFC_GOING_AWAY|IFC_SERVER)) + == (IFC_GOING_AWAY|IFC_SERVER) + && !have_bidi_streams(conn)) + { + conn->ifc_flags |= IFC_CLOSING|IFC_GOAWAY_CLOSE; + conn->ifc_send_flags |= SF_SEND_CONN_CLOSE; + LSQ_DEBUG("closing connection: GOAWAY sent and no responses remain"); + } +} + + +static void +service_streams (struct ietf_full_conn *conn) +{ + struct lsquic_hash_elem *el; + lsquic_stream_t *stream, *next; + + for (stream = TAILQ_FIRST(&conn->ifc_pub.service_streams); stream; + stream = next) + { + next = TAILQ_NEXT(stream, next_service_stream); + if (stream->sm_qflags & SMQF_ABORT_CONN) + /* No need to unset this flag or remove this stream: the connection + * is about to be aborted. + */ + ABORT_ERROR("aborted due to error in stream %"PRIu64, stream->id); + if (stream->sm_qflags & SMQF_CALL_ONCLOSE) + lsquic_stream_call_on_close(stream); + if (stream->sm_qflags & SMQF_FREE_STREAM) + { + TAILQ_REMOVE(&conn->ifc_pub.service_streams, stream, + next_service_stream); + if (!(stream->sm_bflags & SMBF_CRYPTO)) + { + el = lsquic_hash_find(conn->ifc_pub.all_streams, + &stream->id, sizeof(stream->id)); + if (el) + lsquic_hash_erase(conn->ifc_pub.all_streams, el); + conn_mark_stream_closed(conn, stream->id); + } + else + assert(!(stream->sm_hash_el.qhe_flags & QHE_HASHED)); + lsquic_stream_destroy(stream); + } + } + + /* TODO: this chunk of code, too, should probably live elsewhere */ + if (either_side_going_away(conn)) + { + while (conn->ifc_n_delayed_streams) + { + --conn->ifc_n_delayed_streams; + LSQ_DEBUG("goaway mode: delayed stream results in null ctor"); + (void) conn->ifc_enpub->enp_stream_if->on_new_stream( + conn->ifc_enpub->enp_stream_if_ctx, NULL); + } + maybe_close_conn(conn); + } + else + maybe_create_delayed_streams(conn); +} + + +static int +process_stream_ready_to_send (struct ietf_full_conn *conn, + struct lsquic_stream *stream) +{ + int r = 1; + if (stream->sm_qflags & SMQF_SEND_MAX_STREAM_DATA) + r &= generate_max_stream_data_frame(conn, stream); + if (stream->sm_qflags & SMQF_SEND_BLOCKED) + r &= generate_stream_blocked_frame(conn, stream); + if (stream->sm_qflags & SMQF_SEND_RST) + r &= generate_rst_stream_frame(conn, stream); + return r; +} + + +static void +process_streams_ready_to_send (struct ietf_full_conn *conn) +{ + lsquic_stream_t *stream; + + assert(!TAILQ_EMPTY(&conn->ifc_pub.sending_streams)); + + lsquic_prio_tree_iter_reset(conn->ifc_pub.u.ietf.prio_tree, "send"); + TAILQ_FOREACH(stream, &conn->ifc_pub.sending_streams, next_send_stream) + lsquic_prio_tree_iter_add(conn->ifc_pub.u.ietf.prio_tree, stream); + + while ((stream = lsquic_prio_tree_iter_next( + conn->ifc_pub.u.ietf.prio_tree))) + if (!process_stream_ready_to_send(conn, stream)) + break; +} + + +static void +ietf_full_conn_ci_write_ack (struct lsquic_conn *lconn, + struct lsquic_packet_out *packet_out) +{ + struct ietf_full_conn *conn = (struct ietf_full_conn *) lconn; + generate_ack_frame_for_pns(conn, packet_out, PNS_APP, lsquic_time_now()); +} + + +static void +ietf_full_conn_ci_client_call_on_new (struct lsquic_conn *lconn) +{ + struct ietf_full_conn *conn = (struct ietf_full_conn *) lconn; + assert(conn->ifc_flags & IFC_CREATED_OK); + conn->ifc_conn_ctx = conn->ifc_enpub->enp_stream_if->on_new_conn( + conn->ifc_enpub->enp_stream_if_ctx, lconn); +} + + +static void +ietf_full_conn_ci_close (struct lsquic_conn *lconn) +{ + struct ietf_full_conn *conn = (struct ietf_full_conn *) lconn; + struct lsquic_stream *stream; + struct lsquic_hash_elem *el; + enum stream_dir sd; + + if (!(conn->ifc_flags & IFC_CLOSING)) + { + for (el = lsquic_hash_first(conn->ifc_pub.all_streams); el; + el = lsquic_hash_next(conn->ifc_pub.all_streams)) + { + stream = lsquic_hashelem_getdata(el); + sd = (stream->id >> SD_SHIFT) & 1; + if (SD_BIDI == sd) + lsquic_stream_shutdown_internal(stream); + } + conn->ifc_flags |= IFC_CLOSING; + conn->ifc_send_flags |= SF_SEND_CONN_CLOSE; + } +} + + +static void +ietf_full_conn_ci_abort (struct lsquic_conn *lconn) +{ + struct ietf_full_conn *conn = (struct ietf_full_conn *) lconn; + LSQ_INFO("User aborted connection"); + conn->ifc_flags |= IFC_ABORTED; +} + + +static void +retire_dcid (struct ietf_full_conn *conn, struct dcid_elem **dce) +{ + if ((*dce)->de_hash_el.qhe_flags & QHE_HASHED) + lsquic_hash_erase(conn->ifc_enpub->enp_srst_hash, &(*dce)->de_hash_el); + TAILQ_INSERT_TAIL(&conn->ifc_to_retire, *dce, de_next_to_ret); + LSQ_DEBUG("prepare to retire DCID seqno %"PRIu32"", (*dce)->de_seqno); + *dce = NULL; + conn->ifc_send_flags |= SF_SEND_RETIRE_CID; +} + + +/* This function exists for testing purposes. + * + * The user can switch DCIDs and request that the old DCID is retired. + * + * If the user calls this function frequently in a short amount of time, + * this should trigger the CID issuance throttling. + */ +static void +ietf_full_conn_ci_retire_cid (struct lsquic_conn *lconn) +{ + struct ietf_full_conn *conn = (struct ietf_full_conn *) lconn; + struct dcid_elem **el, **dces[2]; + int eq; + /* + * Find two DCIDs: + * 1. the current DCID that will be retire_cid + * 2. an available DCID that will be switched + * Continue searching until there are no more DCIDs + * or when both DCIDs are found. + */ + dces[0] = NULL; // future DCID (does not match current DCID) + dces[1] = NULL; // current DCID (does match current DCID) + for (el = conn->ifc_dces; el < DCES_END(conn) && !(dces[0] && dces[1]); ++el) + if (*el) + { + eq = LSQUIC_CIDS_EQ(&(*el)->de_cid, CUR_DCID(conn)); + if (!dces[eq]) + dces[eq] = el; + } + if (!dces[1]) + { + ABORT_WARN("%s: cannot find own DCID", __func__); + return; + } + if (!dces[0]) + { + LSQ_INFO("No DCID available: cannot switch"); + /* TODO: implemened delayed switch */ + // conn->ifc_flags |= IFC_SWITCH_DCID; + return; + } + /* + * Switch DCID. + */ + *CUR_DCID(conn) = (*dces[0])->de_cid; + LSQ_INFOC("switched DCID to %"CID_FMT, CID_BITS(CUR_DCID(conn))); + /* + * Mark old DCID for retirement. + */ + retire_dcid(conn, dces[1]); +} + + +static void +ietf_full_conn_ci_destroy (struct lsquic_conn *lconn) +{ + struct ietf_full_conn *conn = (struct ietf_full_conn *) lconn; + struct lsquic_stream **streamp, *stream; + struct stream_id_to_ss *sits; + struct dcid_elem **dcep, *dce; + struct lsquic_hash_elem *el; + unsigned i; + + for (streamp = conn->ifc_crypto_streams; streamp < + conn->ifc_crypto_streams + sizeof(conn->ifc_crypto_streams) + / sizeof(conn->ifc_crypto_streams[0]); ++streamp) + if (*streamp) + lsquic_stream_destroy(*streamp); + while ((el = lsquic_hash_first(conn->ifc_pub.all_streams))) + { + stream = lsquic_hashelem_getdata(el); + lsquic_hash_erase(conn->ifc_pub.all_streams, el); + lsquic_stream_destroy(stream); + } + if (conn->ifc_flags & IFC_HTTP) + { + lsquic_qdh_cleanup(&conn->ifc_qdh); + lsquic_qeh_cleanup(&conn->ifc_qeh); + } + for (dcep = conn->ifc_dces; dcep < conn->ifc_dces + sizeof(conn->ifc_dces) + / sizeof(conn->ifc_dces[0]); ++dcep) + if (*dcep) + { + if ((*dcep)->de_hash_el.qhe_flags & QHE_HASHED) + lsquic_hash_erase(conn->ifc_enpub->enp_srst_hash, + &(*dcep)->de_hash_el); + lsquic_malo_put(*dcep); + } + while ((dce = TAILQ_FIRST(&conn->ifc_to_retire))) + { + TAILQ_REMOVE(&conn->ifc_to_retire, dce, de_next_to_ret); + lsquic_malo_put(dce); + } + lsquic_send_ctl_cleanup(&conn->ifc_send_ctl); + for (i = 0; i < N_PNS; ++i) + lsquic_rechist_cleanup(&conn->ifc_rechist[i]); + lsquic_malo_destroy(conn->ifc_pub.packet_out_malo); + if (conn->ifc_flags & IFC_CREATED_OK) + conn->ifc_enpub->enp_stream_if->on_conn_closed(&conn->ifc_conn); + if (conn->ifc_pub.u.ietf.prio_tree) + lsquic_prio_tree_destroy(conn->ifc_pub.u.ietf.prio_tree); + if (conn->ifc_conn.cn_enc_session) + conn->ifc_conn.cn_esf.i->esfi_destroy(conn->ifc_conn.cn_enc_session); + while (!STAILQ_EMPTY(&conn->ifc_stream_ids_to_ss)) + { + sits = STAILQ_FIRST(&conn->ifc_stream_ids_to_ss); + STAILQ_REMOVE_HEAD(&conn->ifc_stream_ids_to_ss, sits_next); + free(sits); + } + if (conn->ifc_flags & IFC_SERVER) + { + if (conn->ifc_pub.u.ietf.promises) + lsquic_hash_destroy(conn->ifc_pub.u.ietf.promises); + } + lsquic_hash_destroy(conn->ifc_pub.all_streams); + free(conn->ifc_errmsg); + free(conn); +} + + +static lsquic_time_t +ietf_full_conn_ci_drain_time (const struct lsquic_conn *lconn) +{ + struct ietf_full_conn *conn = (struct ietf_full_conn *) lconn; + lsquic_time_t drain_time, pto, srtt, var; + + /* Only applicable to a server whose connection was not timed out */ + if ((conn->ifc_flags & (IFC_SERVER|IFC_TIMED_OUT)) != IFC_SERVER) + { + LSQ_DEBUG("drain time is zero (don't drain)"); + return 0; + } + + /* PTO Calculation: [draft-ietf-quic-recovery-18], Section 6.2.2.1; + * Drain time: [draft-ietf-quic-transport-19], Section 10.1. + */ + srtt = lsquic_rtt_stats_get_srtt(&conn->ifc_pub.rtt_stats); + var = lsquic_rtt_stats_get_rttvar(&conn->ifc_pub.rtt_stats); + pto = srtt + 4 * var + TP_DEF_MAX_ACK_DELAY; + drain_time = 3 * pto; + + LSQ_DEBUG("drain time is %"PRIu64" usec", drain_time); + return drain_time; +} + + +static void +ietf_full_conn_ci_going_away (struct lsquic_conn *lconn) +{ + struct ietf_full_conn *conn = (struct ietf_full_conn *) lconn; + + if ((conn->ifc_flags & (IFC_SERVER|IFC_HTTP)) == (IFC_SERVER|IFC_HTTP)) + { + if (!(conn->ifc_flags & (IFC_CLOSING|IFC_GOING_AWAY))) + { + LSQ_INFO("connection marked as going away"); + conn->ifc_flags |= IFC_GOING_AWAY; + const lsquic_stream_id_t stream_id = conn->ifc_max_req_id + N_SITS; + if (valid_stream_id(stream_id)) + { + if (0 == lsquic_hcso_write_goaway(&conn->ifc_hcso, + conn->ifc_max_req_id)) + lsquic_engine_add_conn_to_tickable(conn->ifc_enpub, lconn); + else + /* We're already going away, don't abort because of this */ + LSQ_WARN("could not write GOAWAY frame"); + } + maybe_close_conn(conn); + } + } + else + LSQ_NOTICE("going away has no effect in IETF QUIC"); +} + + +static void +handshake_failed (struct lsquic_conn *lconn) +{ + struct ietf_full_conn *conn = (struct ietf_full_conn *) lconn; + LSQ_DEBUG("handshake failed"); + lsquic_alarmset_unset(&conn->ifc_alset, AL_HANDSHAKE); + conn->ifc_flags |= IFC_HSK_FAILED; +} + + +static struct dcid_elem * +get_new_dce (struct ietf_full_conn *conn) +{ + struct dcid_elem **el; + + for (el = conn->ifc_dces; el < conn->ifc_dces + sizeof(conn->ifc_dces) + / sizeof(conn->ifc_dces[0]); ++el) + if (!*el) + return *el = lsquic_malo_get(conn->ifc_pub.mm->malo.dcid_elem); + + return NULL; +} + + +static void +queue_streams_blocked_frame (struct ietf_full_conn *conn, enum stream_dir sd) +{ + enum stream_id_type sit; + uint64_t limit; + + if (0 == (conn->ifc_send_flags & (SF_SEND_STREAMS_BLOCKED << sd))) + { + conn->ifc_send_flags |= SF_SEND_STREAMS_BLOCKED << sd; + sit = gen_sit(conn->ifc_flags & IFC_SERVER, sd); + limit = conn->ifc_max_allowed_stream_id[sit] >> SIT_SHIFT; + conn->ifc_send.streams_blocked[sd] = limit; + LSQ_DEBUG("scheduled %sdirectional STREAMS_BLOCKED (limit=%"PRIu64 + ") frame", sd == SD_BIDI ? "bi" : "uni", limit); + } + else + LSQ_DEBUG("%sdirectional STREAMS_BLOCKED frame already queued", + sd == SD_BIDI ? "bi" : "uni"); +} + + +static void +retire_cid_from_tp (struct ietf_full_conn *conn, + const struct transport_params *params) +{ + struct dcid_elem *dce; + + dce = get_new_dce(conn); + if (!dce) + { + ABORT_ERROR("cannot allocate DCE"); + return; + } + + memset(dce, 0, sizeof(*dce)); + dce->de_cid = params->tp_preferred_address.cid; + dce->de_seqno = 1; + memcpy(dce->de_srst, params->tp_preferred_address.srst, + sizeof(dce->de_srst)); + dce->de_flags = DE_SRST; + TAILQ_INSERT_TAIL(&conn->ifc_to_retire, dce, de_next_to_ret); + LSQ_DEBUG("prepare to retire DCID seqno %"PRIu32, dce->de_seqno); + conn->ifc_send_flags |= SF_SEND_RETIRE_CID; +} + + +static int +begin_migra_or_retire_cid (struct ietf_full_conn *conn, + const struct transport_params *params) +{ + struct conn_path *copath; + struct dcid_elem *dce; + int is_ipv6; + union { + struct sockaddr_in v4; + struct sockaddr_in6 v6; + } sockaddr; + + if (params->tp_disable_migration) + { + LSQ_DEBUG("TP disables migration: retire PreferredAddress CID"); + retire_cid_from_tp(conn, params); + return 0; + } + + is_ipv6 = NP_IS_IPv6(CUR_NPATH(conn)); + if ((is_ipv6 && !(params->tp_flags & TRAPA_PREFADDR_IPv6)) + || (!is_ipv6 && !(params->tp_flags & TRAPA_PREFADDR_IPv4))) + { + /* XXX This is a limitation in the client code outside of the library. + * To support cross-IP-version migration, we need to add some callbacks + * to open a different socket. + */ + LSQ_DEBUG("Cannot migrate from IPv%u to IPv%u", is_ipv6 ? 6 : 4, + is_ipv6 ? 4 : 6); + retire_cid_from_tp(conn, params); + return 0; + } + + if (0 == params->tp_preferred_address.cid.len) + { + /* TODO: mark with a new flag and begin migration when a non-zero length + * DCID becomes available. + */ + LSQ_DEBUG("Cannot migrate using zero-length DCID"); + retire_cid_from_tp(conn, params); + return 0; + } + + dce = get_new_dce(conn); + if (!dce) + { + ABORT_WARN("cannot allocate DCE"); + return -1; + } + + memset(dce, 0, sizeof(*dce)); + dce->de_cid = params->tp_preferred_address.cid; + dce->de_seqno = 1; + dce->de_flags = DE_SRST; + memcpy(dce->de_srst, params->tp_preferred_address.srst, + sizeof(dce->de_srst)); + if (conn->ifc_enpub->enp_srst_hash) + { + if (!lsquic_hash_insert(conn->ifc_enpub->enp_srst_hash, + dce->de_srst, sizeof(dce->de_srst), &conn->ifc_conn, + &dce->de_hash_el)) + { + lsquic_malo_put(dce); + ABORT_WARN("cannot insert DCE"); + return -1; + } + } + + if (is_ipv6) + { + sockaddr.v6.sin6_family = AF_INET6; + sockaddr.v6.sin6_port = htons(params->tp_preferred_address.ipv6_port); + memcpy(&sockaddr.v6.sin6_addr, params->tp_preferred_address.ipv6_addr, + sizeof(sockaddr.v6.sin6_addr)); + } + else + { + sockaddr.v4.sin_family = AF_INET; + sockaddr.v4.sin_port = htons(params->tp_preferred_address.ipv4_port); + memcpy(&sockaddr.v4.sin_addr, params->tp_preferred_address.ipv4_addr, + sizeof(sockaddr.v4.sin_addr)); + } + + copath = &conn->ifc_paths[1]; + assert(!(conn->ifc_used_paths & (1 << (copath - conn->ifc_paths)))); + + migra_begin(conn, copath, dce, (struct sockaddr *) &sockaddr); + return 0; +} + + +static void +maybe_start_migration (struct ietf_full_conn *conn) +{ + struct lsquic_conn *const lconn = &conn->ifc_conn; + const struct transport_params *params; + + params = lconn->cn_esf.i->esfi_get_peer_transport_params( + lconn->cn_enc_session); + if (params->tp_flags & (TRAPA_PREFADDR_IPv4|TRAPA_PREFADDR_IPv6)) + { + if (0 != begin_migra_or_retire_cid(conn, params)) + ABORT_QUIETLY(0, TEC_INTERNAL_ERROR, "error initiating migration"); + } +} + + +static int +handshake_ok (struct lsquic_conn *lconn) +{ + struct ietf_full_conn *const conn = (struct ietf_full_conn *) lconn; + struct lsquic_stream *stream; + struct lsquic_hash_elem *el; + struct dcid_elem *dce; + const struct transport_params *params; + enum stream_id_type sit; + uint64_t limit; + char buf[0x200]; + + /* Need to set this flag even we hit an error in the rest of this funciton. + * This is because this flag is used to calculate packet out header size + */ + lconn->cn_flags |= LSCONN_HANDSHAKE_DONE; + + params = lconn->cn_esf.i->esfi_get_peer_transport_params( + lconn->cn_enc_session); + if (!params) + { + ABORT_WARN("could not get transport parameters"); + return -1; + } + + LSQ_DEBUG("peer transport parameters: %s", + (lsquic_tp_to_str(params, buf, sizeof(buf)), buf)); + + if (params->tp_init_max_streams_bidi > (1ull << 60) + || params->tp_init_max_streams_uni > (1ull << 60)) + { + if (params->tp_init_max_streams_bidi > (1ull << 60)) + ABORT_QUIETLY(0, TEC_STREAM_LIMIT_ERROR, "init_max_streams_bidi is " + "too large: %"PRIu64, params->tp_init_max_streams_bidi); + else + ABORT_QUIETLY(0, TEC_STREAM_LIMIT_ERROR, "init_max_streams_uni is " + "too large: %"PRIu64, params->tp_init_max_streams_uni); + return -1; + } + + sit = gen_sit(conn->ifc_flags & IFC_SERVER, SD_BIDI); + conn->ifc_max_allowed_stream_id[sit] = + params->tp_init_max_streams_bidi << SIT_SHIFT; + sit = gen_sit(conn->ifc_flags & IFC_SERVER, SD_UNI); + conn->ifc_max_allowed_stream_id[sit] = + params->tp_init_max_streams_uni << SIT_SHIFT; + + conn->ifc_max_stream_data_uni = params->tp_init_max_stream_data_uni; + + if (params->tp_init_max_data < conn->ifc_pub.conn_cap.cc_sent) + { + ABORT_WARN("peer specified init_max_data=%"PRIu64" bytes, which is " + "smaller than the amount of data already sent on this connection " + "(%"PRIu64" bytes)", params->tp_init_max_data, + conn->ifc_pub.conn_cap.cc_sent); + return -1; + } + + conn->ifc_pub.conn_cap.cc_max = params->tp_init_max_data; + + for (el = lsquic_hash_first(conn->ifc_pub.all_streams); el; + el = lsquic_hash_next(conn->ifc_pub.all_streams)) + { + stream = lsquic_hashelem_getdata(el); + if (is_our_stream(conn, stream)) + limit = params->tp_init_max_stream_data_bidi_remote; + else + limit = params->tp_init_max_stream_data_bidi_local; + if (0 != lsquic_stream_set_max_send_off(stream, limit)) + { + ABORT_WARN("cannot set peer-supplied max_stream_data=%"PRIu64 + "on stream %"PRIu64, limit, stream->id); + return -1; + } + } + + if (conn->ifc_flags & IFC_SERVER) + conn->ifc_cfg.max_stream_send + = params->tp_init_max_stream_data_bidi_local; + else + conn->ifc_cfg.max_stream_send + = params->tp_init_max_stream_data_bidi_remote; + conn->ifc_cfg.ack_exp = params->tp_ack_delay_exponent; + + /* TODO: idle timeout, packet size */ + + dce = get_new_dce(conn); + if (!dce) + { + ABORT_WARN("cannot allocate DCE"); + return -1; + } + + memset(dce, 0, sizeof(*dce)); + dce->de_cid = *CUR_DCID(conn); + dce->de_seqno = 0; + if (params->tp_flags & TRAPA_RESET_TOKEN) + { + memcpy(dce->de_srst, params->tp_stateless_reset_token, + sizeof(dce->de_srst)); + dce->de_flags = DE_SRST | DE_ASSIGNED; + if (conn->ifc_enpub->enp_srst_hash) + { + if (!lsquic_hash_insert(conn->ifc_enpub->enp_srst_hash, + dce->de_srst, sizeof(dce->de_srst), &conn->ifc_conn, + &dce->de_hash_el)) + { + ABORT_WARN("cannot insert DCE"); + return -1; + } + } + } + else + dce->de_flags = DE_ASSIGNED; + + LSQ_INFO("applied peer transport parameters"); + + if (conn->ifc_flags & IFC_HTTP) + { + lsquic_qeh_init(&conn->ifc_qeh, &conn->ifc_conn); + if (0 == avail_streams_count(conn, conn->ifc_flags & IFC_SERVER, + SD_UNI)) + { + ABORT_QUIETLY(1, HEC_GENERAL_PROTOCOL_ERROR, "cannot create " + "control stream due to peer-imposed limit"); + conn->ifc_error = CONN_ERR(1, HEC_GENERAL_PROTOCOL_ERROR); + return -1; + } + if (0 != create_ctl_stream_out(conn)) + { + ABORT_WARN("cannot create outgoing control stream"); + return -1; + } + if (0 != lsquic_hcso_write_settings(&conn->ifc_hcso, + &conn->ifc_enpub->enp_settings, conn->ifc_flags & IFC_SERVER)) + { + ABORT_WARN("cannot write SETTINGS"); + return -1; + } + if (!(conn->ifc_flags & IFC_SERVER) + && (conn->ifc_u.cli.ifcli_flags & IFCLI_PUSH_ENABLED) + && 0 != lsquic_hcso_write_max_push_id(&conn->ifc_hcso, + conn->ifc_u.cli.ifcli_max_push_id)) + { + ABORT_WARN("cannot write MAX_PUSH_ID"); + return -1; + } + if (0 != lsquic_qdh_init(&conn->ifc_qdh, &conn->ifc_conn, + conn->ifc_flags & IFC_SERVER, conn->ifc_enpub, + conn->ifc_settings->es_qpack_dec_max_size, + conn->ifc_settings->es_qpack_dec_max_blocked)) + { + ABORT_WARN("cannot initialize QPACK decoder"); + return -1; + } + if (avail_streams_count(conn, conn->ifc_flags & IFC_SERVER, SD_UNI) > 0) + { + if (0 != create_qdec_stream_out(conn)) + { + ABORT_WARN("cannot create outgoing QPACK decoder stream"); + return -1; + } + } + else + { + queue_streams_blocked_frame(conn, SD_UNI); + LSQ_DEBUG("cannot create outgoing QPACK decoder stream due to " + "unidir limits"); + } + } + + if (params->tp_active_connection_id_limit > conn->ifc_conn.cn_n_cces) + conn->ifc_active_cids_limit = conn->ifc_conn.cn_n_cces; + else + conn->ifc_active_cids_limit = params->tp_active_connection_id_limit; + conn->ifc_first_active_cid_seqno = conn->ifc_scid_seqno; + + if ((1 << conn->ifc_conn.cn_n_cces) - 1 != conn->ifc_conn.cn_cces_mask + && can_issue_cids(conn) + && CN_SCID(&conn->ifc_conn)->len != 0) + conn->ifc_send_flags |= SF_SEND_NEW_CID; + maybe_create_delayed_streams(conn); + + return 0; +} + + +static void +ietf_full_conn_ci_hsk_done (struct lsquic_conn *lconn, + enum lsquic_hsk_status status) +{ + struct ietf_full_conn *const conn = (struct ietf_full_conn *) lconn; + + lsquic_alarmset_unset(&conn->ifc_alset, AL_HANDSHAKE); + + switch (status) + { + case LSQ_HSK_OK: + case LSQ_HSK_0RTT_OK: + if (0 != handshake_ok(lconn)) + { + LSQ_INFO("handshake was reported successful, but later processing " + "produced an error"); + status = LSQ_HSK_FAIL; + handshake_failed(lconn); + } + break; + default: + assert(0); + /* fall-through */ + case LSQ_HSK_FAIL: + case LSQ_HSK_0RTT_FAIL: + handshake_failed(lconn); + break; + } + if (conn->ifc_enpub->enp_stream_if->on_hsk_done) + conn->ifc_enpub->enp_stream_if->on_hsk_done(lconn, status); +} + + +static void +ietf_full_conn_ci_tls_alert (struct lsquic_conn *lconn, uint8_t alert) +{ + struct ietf_full_conn *const conn = (struct ietf_full_conn *) lconn; + ABORT_QUIETLY(0, 0x100 + alert, "TLS alert %"PRIu8, alert); +} + + +static int +ietf_full_conn_ci_report_live (struct lsquic_conn *lconn, lsquic_time_t now) +{ + struct ietf_full_conn *conn = (struct ietf_full_conn *) lconn; + + if (conn->ifc_last_live_update + 30000000 < now) + { + conn->ifc_last_live_update = now; + return 1; + } + else + return 0; +} + + +static int +ietf_full_conn_ci_is_push_enabled (struct lsquic_conn *lconn) +{ + struct ietf_full_conn *const conn = (struct ietf_full_conn *) lconn; + + return (conn->ifc_flags & IFC_SERVER) + && (conn->ifc_u.ser.ifser_flags + & (IFSER_PUSH_ENABLED|IFSER_MAX_PUSH_ID)) + == (IFSER_PUSH_ENABLED|IFSER_MAX_PUSH_ID) + && conn->ifc_u.ser.ifser_next_push_id + <= conn->ifc_u.ser.ifser_max_push_id + && !either_side_going_away(conn) + && avail_streams_count(conn, 1, SD_UNI) > 0 + ; +} + + +static void +undo_stream_creation (struct ietf_full_conn *conn, + struct lsquic_stream *stream) +{ + enum stream_dir sd; + + assert(stream->sm_hash_el.qhe_flags & QHE_HASHED); + assert(!(stream->stream_flags & STREAM_ONCLOSE_DONE)); + + LSQ_DEBUG("undo creation of stream %"PRIu64, stream->id); + lsquic_hash_erase(conn->ifc_pub.all_streams, &stream->sm_hash_el); + sd = (stream->id >> SD_SHIFT) & 1; + --conn->ifc_n_created_streams[sd]; + lsquic_stream_destroy(stream); +} + + +/* This function is long because there are a lot of steps to perform, several + * things can go wrong, which we want to roll back, yet at the same time we + * want to do everything efficiently. + */ +static int +ietf_full_conn_ci_push_stream (struct lsquic_conn *lconn, void *hset, + struct lsquic_stream *dep_stream, const struct iovec *path, + const struct iovec *host, const struct lsquic_http_headers *headers) +{ + struct ietf_full_conn *const conn = (struct ietf_full_conn *) lconn; + unsigned char *header_block_buf, *end, *p; + size_t hea_sz, enc_sz; + ssize_t prefix_sz; + lsquic_http_header_t pseudo_headers[4], *header; + lsquic_http_headers_t all_headers[2]; + struct lsquic_hash_elem *el; + struct push_promise *promise; + struct lsquic_stream *pushed_stream; + struct http1x_ctor_ctx ctor_ctx; + void *hsi_ctx; + struct uncompressed_headers *uh; + enum lsqpack_enc_status enc_st; + enum lsquic_header_status header_st; + unsigned i, name_idx, n_header_sets; + int own_hset; + unsigned char discard[2]; + + if (!ietf_full_conn_ci_is_push_enabled(lconn) + || !lsquic_stream_can_push(dep_stream)) + { + LSQ_DEBUG("cannot push using stream %"PRIu64, dep_stream->id); + return -1; + } + + if (0 != lsqpack_enc_start_header(&conn->ifc_qeh.qeh_encoder, 0, 0)) + { + LSQ_WARN("cannot start header for push stream"); + return -1; + } + + header_block_buf = lsquic_mm_get_4k(conn->ifc_pub.mm); + if (!header_block_buf) + { + LSQ_WARN("cannot allocate 4k"); + (void) lsqpack_enc_cancel_header(&conn->ifc_qeh.qeh_encoder); + return -1; + } + + /* Generate header block. Using it, we will search for a duplicate push + * promise. If not found, it will be copied to a new push_promise object. + */ + p = header_block_buf; + end = header_block_buf + 0x1000 - 1; /* Save one byte for key type */ + pseudo_headers[0].name. iov_base = ":method"; + pseudo_headers[0].name. iov_len = 7; + pseudo_headers[0].value.iov_base = "GET"; + pseudo_headers[0].value.iov_len = 3; + pseudo_headers[1].name .iov_base = ":path"; + pseudo_headers[1].name .iov_len = 5; + pseudo_headers[1].value = *path; + pseudo_headers[2].name .iov_base = ":authority"; + pseudo_headers[2].name .iov_len = 10; + pseudo_headers[2].value = *host; + pseudo_headers[3].name. iov_base = ":scheme"; + pseudo_headers[3].name. iov_len = 7; + pseudo_headers[3].value.iov_base = "https"; + pseudo_headers[3].value.iov_len = 5; + all_headers[0].headers = pseudo_headers; + all_headers[0].count = sizeof(pseudo_headers) + / sizeof(pseudo_headers[0]); + if (headers) + { + all_headers[1] = *headers; + n_header_sets = 2; + } + else + n_header_sets = 1; + enc_sz = 0; /* Should not change */ + for (i = 0; i < n_header_sets; ++i) + for (header = all_headers[i].headers; + header < all_headers[i].headers + all_headers[i].count; + ++header) + { + hea_sz = end - p; + enc_st = lsqpack_enc_encode(&conn->ifc_qeh.qeh_encoder, NULL, + &enc_sz, p, &hea_sz, header->name.iov_base, + header->name.iov_len, header->value.iov_base, + header->value.iov_len, LQEF_NO_HIST_UPD|LQEF_NO_DYN); + if (enc_st == LQES_OK) + p += hea_sz; + else + { + (void) lsqpack_enc_cancel_header(&conn->ifc_qeh.qeh_encoder); + lsquic_mm_put_4k(conn->ifc_pub.mm, header_block_buf); + LSQ_DEBUG("cannot encode header field for push %u", enc_st); + return -1; + } + } + prefix_sz = lsqpack_enc_end_header(&conn->ifc_qeh.qeh_encoder, + discard, sizeof(discard)); + if (!(prefix_sz == 2 && discard[0] == 0 && discard[1] == 0)) + { + LSQ_WARN("stream push: unexpected prefix values %zd, %hhu, %hhu", + prefix_sz, discard[0], discard[1]); + lsquic_mm_put_4k(conn->ifc_pub.mm, header_block_buf); + return -1; + } + LSQ_DEBUG("generated push promise header block of %ld bytes", + (long) (p - header_block_buf)); + *p++ = PPKT_CONTENT; + + el = lsquic_hash_find(conn->ifc_pub.u.ietf.promises, + header_block_buf, p - header_block_buf); + if (el) + { + lsquic_mm_put_4k(conn->ifc_pub.mm, header_block_buf); + promise = lsquic_hashelem_getdata(el); + LSQ_DEBUG("found push promise %"PRIu64", will issue a duplicate", + promise->pp_id); + return lsquic_stream_duplicate_push(dep_stream, promise->pp_id); + } + + own_hset = !hset; + if (!hset) + { + if (conn->ifc_enpub->enp_hsi_if == lsquic_http1x_if) + { + ctor_ctx = (struct http1x_ctor_ctx) + { + .conn = &conn->ifc_conn, + .is_server = 1, + .max_headers_sz = MAX_HTTP1X_HEADERS_SIZE, + }; + hsi_ctx = &ctor_ctx; + } + else + hsi_ctx = conn->ifc_enpub->enp_hsi_ctx; + hset = conn->ifc_enpub->enp_hsi_if->hsi_create_header_set(hsi_ctx, 1); + if (!hset) + { + LSQ_INFO("header set ctor failure"); + return -1; + } + for (i = 0; i < n_header_sets; ++i) + for (header = all_headers[i].headers; + header < all_headers[i].headers + all_headers[i].count; + ++header) + { + name_idx = 0; /* TODO: lsqpack_enc_get_stx_tab_id(header->name.iov_base, + header->name.iov_len, header->value.iov_base, + header->value.iov_len); */ + header_st = conn->ifc_enpub->enp_hsi_if->hsi_process_header(hset, + name_idx, + header->name.iov_base, header->name.iov_len, + header->value.iov_base, header->value.iov_len); + if (header_st != LSQUIC_HDR_OK) + { + lsquic_mm_put_4k(conn->ifc_pub.mm, header_block_buf); + conn->ifc_enpub->enp_hsi_if->hsi_discard_header_set(hset); + LSQ_DEBUG("header process error: %u", header_st); + return -1; + } + } + header_st = conn->ifc_enpub->enp_hsi_if->hsi_process_header(hset, 0, 0, + 0, 0, 0); + if (header_st != LSQUIC_HDR_OK) + { + lsquic_mm_put_4k(conn->ifc_pub.mm, header_block_buf); + conn->ifc_enpub->enp_hsi_if->hsi_discard_header_set(hset); + LSQ_DEBUG("header process error: %u", header_st); + return -1; + } + } + + pushed_stream = create_push_stream(conn); + if (!pushed_stream) + { + LSQ_WARN("could not create push stream"); + lsquic_mm_put_4k(conn->ifc_pub.mm, header_block_buf); + if (own_hset) + conn->ifc_enpub->enp_hsi_if->hsi_discard_header_set(hset); + return -1; + } + + promise = malloc(sizeof(*promise) + (p - header_block_buf)); + if (!promise) + { + LSQ_WARN("stream push: cannot allocate promise"); + lsquic_mm_put_4k(conn->ifc_pub.mm, header_block_buf); + if (own_hset) + conn->ifc_enpub->enp_hsi_if->hsi_discard_header_set(hset); + undo_stream_creation(conn, pushed_stream); + return -1; + } + + uh = malloc(sizeof(*uh)); + if (!uh) + { + LSQ_WARN("stream push: cannot allocate uh"); + lsquic_mm_put_4k(conn->ifc_pub.mm, header_block_buf); + if (own_hset) + conn->ifc_enpub->enp_hsi_if->hsi_discard_header_set(hset); + undo_stream_creation(conn, pushed_stream); + return -1; + } + uh->uh_stream_id = pushed_stream->id; + uh->uh_oth_stream_id = 0; + uh->uh_weight = lsquic_stream_priority(dep_stream) / 2 + 1; + uh->uh_exclusive = 0; + uh->uh_flags = UH_FIN; + if (lsquic_http1x_if == conn->ifc_enpub->enp_hsi_if) + uh->uh_flags |= UH_H1H; + uh->uh_hset = hset; + + memset(promise, 0, sizeof(*promise)); + promise->pp_refcnt = 1; /* This function itself keeps a reference */ + memcpy(promise->pp_content_buf, header_block_buf, p - header_block_buf); + promise->pp_content_len = p - header_block_buf - 1; + promise->pp_id = conn->ifc_u.ser.ifser_next_push_id++; + lsquic_mm_put_4k(conn->ifc_pub.mm, header_block_buf); + + promise->pp_u_id.buf[8] = PPKT_ID; + el = lsquic_hash_insert(conn->ifc_pub.u.ietf.promises, + promise->pp_u_id.buf, sizeof(promise->pp_u_id.buf), promise, + &promise->pp_hash_id); + if (!el) + { + LSQ_WARN("cannot insert push promise (ID)"); + undo_stream_creation(conn, pushed_stream); + if (own_hset) + conn->ifc_enpub->enp_hsi_if->hsi_discard_header_set(hset); + lsquic_pp_put(promise, conn->ifc_pub.u.ietf.promises); + free(uh); + return -1; + } + el = lsquic_hash_insert(conn->ifc_pub.u.ietf.promises, + promise->pp_content_buf, promise->pp_content_len + 1, promise, + &promise->pp_hash_content); + if (!el) + { + LSQ_WARN("cannot insert push promise (content)"); + undo_stream_creation(conn, pushed_stream); + if (own_hset) + conn->ifc_enpub->enp_hsi_if->hsi_discard_header_set(hset); + lsquic_pp_put(promise, conn->ifc_pub.u.ietf.promises); + free(uh); + return -1; + } + + if (0 != lsquic_stream_push_promise(dep_stream, promise)) + { + LSQ_DEBUG("push promise failed"); + undo_stream_creation(conn, pushed_stream); + if (own_hset) + conn->ifc_enpub->enp_hsi_if->hsi_discard_header_set(hset); + lsquic_pp_put(promise, conn->ifc_pub.u.ietf.promises); + free(uh); + return -1; + } + + if (0 != lsquic_stream_uh_in(pushed_stream, uh)) + { + LSQ_WARN("stream barfed when fed synthetic request"); + undo_stream_creation(conn, pushed_stream); + if (own_hset) + conn->ifc_enpub->enp_hsi_if->hsi_discard_header_set(hset); + free(uh); + if (0 != lsquic_hcso_write_cancel_push(&conn->ifc_hcso, + promise->pp_id)) + ABORT_WARN("cannot write CANCEL_PUSH"); + lsquic_pp_put(promise, conn->ifc_pub.u.ietf.promises); + return -1; + } + + /* Linking push promise with pushed stream is necessary for cancellation */ + ++promise->pp_refcnt; + promise->pp_pushed_stream = pushed_stream; + pushed_stream->sm_promise = promise; + + lsquic_stream_call_on_new(pushed_stream); + + lsquic_pp_put(promise, conn->ifc_pub.u.ietf.promises); + return 0; +} + + +static int +ietf_full_conn_ci_is_tickable (struct lsquic_conn *lconn) +{ + struct ietf_full_conn *const conn = (struct ietf_full_conn *) lconn; + struct lsquic_stream *stream; + + if (!TAILQ_EMPTY(&conn->ifc_pub.service_streams)) + { + LSQ_DEBUG("tickable: there are streams to be serviced"); + return 1; + } + + if ((conn->ifc_enpub->enp_flags & ENPUB_CAN_SEND) + && (should_generate_ack(conn) || + !lsquic_send_ctl_sched_is_blocked(&conn->ifc_send_ctl))) + { + /* XXX What about queued ACKs: why check but not make tickable? */ + if (conn->ifc_send_flags) + { + LSQ_DEBUG("tickable: send flags: 0x%X", conn->ifc_send_flags); + goto check_can_send; + } + if (lsquic_send_ctl_has_buffered(&conn->ifc_send_ctl)) + { + LSQ_DEBUG("tickable: has buffered packets"); + goto check_can_send; + } + if (!TAILQ_EMPTY(&conn->ifc_pub.sending_streams)) + { + LSQ_DEBUG("tickable: there are sending streams"); + goto check_can_send; + } + TAILQ_FOREACH(stream, &conn->ifc_pub.write_streams, next_write_stream) + if (lsquic_stream_write_avail(stream)) + { + LSQ_DEBUG("tickable: stream %"PRIu64" can be written to", + stream->id); + goto check_can_send; + } + goto check_readable_streams; + check_can_send: + if (lsquic_send_ctl_can_send(&conn->ifc_send_ctl)) + return 1; + } + + check_readable_streams: + TAILQ_FOREACH(stream, &conn->ifc_pub.read_streams, next_read_stream) + if (lsquic_stream_readable(stream)) + { + LSQ_DEBUG("tickable: stream %"PRIu64" can be read from", + stream->id); + return 1; + } + + LSQ_DEBUG("not tickable"); + return 0; +} + + +static enum tick_st +immediate_close (struct ietf_full_conn *conn) +{ + struct lsquic_packet_out *packet_out; + const char *error_reason; + struct conn_err conn_err; + int sz; + + if (conn->ifc_flags & (IFC_TICK_CLOSE|IFC_GOT_PRST)) + return TICK_CLOSE; + + if (!(conn->ifc_flags & IFC_SERVER) + && conn->ifc_u.cli.ifcli_ver_neg.vn_state != VN_END) + return TICK_CLOSE; + + conn->ifc_flags |= IFC_TICK_CLOSE; + + /* No reason to send anything that's been scheduled if connection is + * being closed immedately. This also ensures that packet numbers + * sequence is always increasing. + */ + lsquic_send_ctl_drop_scheduled(&conn->ifc_send_ctl); + + if (conn->ifc_flags & (IFC_TIMED_OUT|IFC_HSK_FAILED)) + return TICK_CLOSE; + + packet_out = lsquic_send_ctl_new_packet_out(&conn->ifc_send_ctl, 0, + PNS_APP, CUR_NPATH(conn)); + if (!packet_out) + { + LSQ_WARN("cannot allocate packet: %s", strerror(errno)); + return TICK_CLOSE; + } + + assert(conn->ifc_flags & (IFC_ERROR|IFC_ABORTED|IFC_TIMED_OUT|IFC_HSK_FAILED)); + if (conn->ifc_error.u.err != 0) + { + conn_err = conn->ifc_error; + error_reason = conn->ifc_errmsg; + } + else if (conn->ifc_flags & IFC_ERROR) + { + conn_err = CONN_ERR(0, TEC_INTERNAL_ERROR); + error_reason = "connection error"; + } + else if (conn->ifc_flags & IFC_ABORTED) + { + conn_err = CONN_ERR(0, TEC_NO_ERROR); + error_reason = "user aborted connection"; + } + else if (conn->ifc_flags & IFC_TIMED_OUT) + { + conn_err = CONN_ERR(0, TEC_NO_ERROR); + error_reason = "connection timed out"; + } + else if (conn->ifc_flags & IFC_HSK_FAILED) + { + conn_err = CONN_ERR(0, TEC_NO_ERROR); + error_reason = "handshake failed"; + } + else + { + conn_err = CONN_ERR(0, TEC_NO_ERROR); + error_reason = NULL; + } + + lsquic_send_ctl_scheduled_one(&conn->ifc_send_ctl, packet_out); + sz = conn->ifc_conn.cn_pf->pf_gen_connect_close_frame( + packet_out->po_data + packet_out->po_data_sz, + lsquic_packet_out_avail(packet_out), conn_err.app_error, + conn_err.u.err, error_reason, + error_reason ? strlen(error_reason) : 0); + if (sz < 0) { + LSQ_WARN("%s failed", __func__); + return TICK_CLOSE; + } + lsquic_send_ctl_incr_pack_sz(&conn->ifc_send_ctl, packet_out, sz); + packet_out->po_frame_types |= 1 << QUIC_FRAME_CONNECTION_CLOSE; + LSQ_DEBUG("generated CONNECTION_CLOSE frame in its own packet"); + return TICK_SEND|TICK_CLOSE; +} + + +static void +process_streams_read_events (struct ietf_full_conn *conn) +{ + struct lsquic_stream *stream; + int have_streams, iters; + enum stream_q_flags q_flags, needs_service; + static const char *const labels[2] = { "read-0", "read-1", }; + + conn->ifc_pub.cp_flags &= ~CP_STREAM_UNBLOCKED; + iters = 0; + do + { + have_streams = 0; + TAILQ_FOREACH(stream, &conn->ifc_pub.read_streams, next_read_stream) + if (lsquic_stream_readable(stream)) + { + if (!have_streams) + { + ++have_streams; + lsquic_prio_tree_iter_reset(conn->ifc_pub.u.ietf.prio_tree, + labels[iters]); + } + lsquic_prio_tree_iter_add(conn->ifc_pub.u.ietf.prio_tree, + stream); + } + + if (!have_streams) + break; + + needs_service = 0; + while ((stream = lsquic_prio_tree_iter_next( + conn->ifc_pub.u.ietf.prio_tree))) + { + q_flags = stream->sm_qflags & SMQF_SERVICE_FLAGS; + lsquic_stream_dispatch_read_events(stream); + needs_service |= q_flags ^ (stream->sm_qflags & SMQF_SERVICE_FLAGS); + } + if (needs_service) + service_streams(conn); + } + while (iters++ == 0 && (conn->ifc_pub.cp_flags & CP_STREAM_UNBLOCKED)); +} + + +static void +process_crypto_stream_read_events (struct ietf_full_conn *conn) +{ + struct lsquic_stream **stream; + + for (stream = conn->ifc_crypto_streams; stream < + conn->ifc_crypto_streams + sizeof(conn->ifc_crypto_streams) + / sizeof(conn->ifc_crypto_streams[0]); ++stream) + if (*stream && (*stream)->sm_qflags & SMQF_WANT_READ) + lsquic_stream_dispatch_read_events(*stream); +} + + +static void +process_crypto_stream_write_events (struct ietf_full_conn *conn) +{ + struct lsquic_stream **stream; + + for (stream = conn->ifc_crypto_streams; stream < + conn->ifc_crypto_streams + sizeof(conn->ifc_crypto_streams) + / sizeof(conn->ifc_crypto_streams[0]); ++stream) + if (*stream && (*stream)->sm_qflags & SMQF_WRITE_Q_FLAGS) + lsquic_stream_dispatch_write_events(*stream); +} + + +static void +maybe_conn_flush_special_streams (struct ietf_full_conn *conn) +{ + if (!(conn->ifc_flags & IFC_HTTP)) + return; + + struct lsquic_stream *const streams[] = { + conn->ifc_hcso.how_stream, + conn->ifc_qeh.qeh_enc_sm_out, + conn->ifc_qdh.qdh_dec_sm_out, + }; + struct lsquic_stream *const *stream; + + for (stream = streams; stream < streams + sizeof(streams) + / sizeof(streams[0]); ++stream) + if (*stream && lsquic_stream_has_data_to_flush(*stream)) + (void) lsquic_stream_flush(*stream); +} + + +static int +write_is_possible (struct ietf_full_conn *conn) +{ + const lsquic_packet_out_t *packet_out; + + packet_out = lsquic_send_ctl_last_scheduled(&conn->ifc_send_ctl, PNS_APP, + CUR_NPATH(conn), 0); + return (packet_out && lsquic_packet_out_avail(packet_out) > 10) + || lsquic_send_ctl_can_send(&conn->ifc_send_ctl); +} + + +/* Write events are dispatched in two steps. First, only the high-priority + * streams are processed. High-priority streams are critical streams plus + * one non-critical streams with the highest priority. In the second step, + * all other streams are processed. + */ +static void +process_streams_write_events (struct ietf_full_conn *conn, int high_prio, + const struct lsquic_stream **highest_non_crit) +{ + struct lsquic_stream *stream; + struct h3_prio_tree *const prio_tree = conn->ifc_pub.u.ietf.prio_tree; + + if (high_prio) + *highest_non_crit = lsquic_prio_tree_highest_non_crit(prio_tree); + lsquic_prio_tree_iter_reset(prio_tree, high_prio ? "write-high" : + "write-low"); + TAILQ_FOREACH(stream, &conn->ifc_pub.write_streams, next_write_stream) + if (high_prio == + (stream == *highest_non_crit || + lsquic_stream_is_critical(stream))) + lsquic_prio_tree_iter_add(prio_tree, stream); + + + while ((stream = lsquic_prio_tree_iter_next( + conn->ifc_pub.u.ietf.prio_tree))) + if (stream->sm_qflags & SMQF_WRITE_Q_FLAGS) + lsquic_stream_dispatch_write_events(stream); + + maybe_conn_flush_special_streams(conn); +} + + +static int +conn_ok_to_close (const struct ietf_full_conn *conn) +{ + assert(conn->ifc_flags & IFC_CLOSING); + return !(conn->ifc_flags & IFC_SERVER) + || (conn->ifc_flags & IFC_RECV_CLOSE) + || ( + !lsquic_send_ctl_have_outgoing_stream_frames(&conn->ifc_send_ctl) + && !have_bidi_streams(conn) + && lsquic_send_ctl_have_unacked_stream_frames( + &conn->ifc_send_ctl) == 0); +} + + +static void +generate_connection_close_packet (struct ietf_full_conn *conn) +{ + struct lsquic_packet_out *packet_out; + int sz; + + packet_out = lsquic_send_ctl_new_packet_out(&conn->ifc_send_ctl, 0, PNS_APP, + CUR_NPATH(conn)); + if (!packet_out) + { + ABORT_ERROR("cannot allocate packet: %s", strerror(errno)); + return; + } + + lsquic_send_ctl_scheduled_one(&conn->ifc_send_ctl, packet_out); + sz = conn->ifc_conn.cn_pf->pf_gen_connect_close_frame( + packet_out->po_data + packet_out->po_data_sz, + lsquic_packet_out_avail(packet_out), 0, TEC_NO_ERROR, NULL, 0); + if (sz < 0) { + ABORT_ERROR("generate_connection_close_packet failed"); + return; + } + lsquic_send_ctl_incr_pack_sz(&conn->ifc_send_ctl, packet_out, sz); + packet_out->po_frame_types |= 1 << QUIC_FRAME_CONNECTION_CLOSE; + LSQ_DEBUG("generated CONNECTION_CLOSE frame in its own packet"); + conn->ifc_send_flags &= ~SF_SEND_CONN_CLOSE; +} + + +static int +generate_ping_frame (struct ietf_full_conn *conn) +{ + struct lsquic_packet_out *packet_out; + int sz; + + packet_out = get_writeable_packet(conn, 1); + if (!packet_out) + { + LSQ_DEBUG("cannot get writeable packet for PING frame"); + return 1; + } + sz = conn->ifc_conn.cn_pf->pf_gen_ping_frame( + packet_out->po_data + packet_out->po_data_sz, + lsquic_packet_out_avail(packet_out)); + if (sz < 0) { + ABORT_ERROR("gen_ping_frame failed"); + return 1; + } + lsquic_send_ctl_incr_pack_sz(&conn->ifc_send_ctl, packet_out, sz); + packet_out->po_frame_types |= 1 << QUIC_FRAME_PING; + LSQ_DEBUG("wrote PING frame"); + return 0; +} + + +static void +generate_path_chal_frame (struct ietf_full_conn *conn, lsquic_time_t now, + unsigned path_id) +{ + struct lsquic_packet_out *packet_out; + struct conn_path *copath; + unsigned need; + int w; + char hexbuf[ sizeof(copath->cop_path_chals[0]) * 2 + 1 ]; + + /* For now, we only support sending path challenges on a single path. + * This restriction may need to be lifted if the client is probing + * several paths at the same time. + */ + if (!(conn->ifc_flags & IFC_SERVER)) + assert(path_id == conn->ifc_mig_path_id); + + copath = &conn->ifc_paths[path_id]; + if (copath->cop_n_chals >= sizeof(copath->cop_path_chals) + / sizeof(copath->cop_path_chals[0])) + { + /* TODO: path failure? */ + assert(0); + return; + } + + need = conn->ifc_conn.cn_pf->pf_path_chal_frame_size(); + packet_out = get_writeable_packet_on_path(conn, need, &copath->cop_path, 1); + if (!packet_out) + return; + + RAND_bytes((void *) &copath->cop_path_chals[copath->cop_n_chals], + sizeof(copath->cop_path_chals[0])); + w = conn->ifc_conn.cn_pf->pf_gen_path_chal_frame( + packet_out->po_data + packet_out->po_data_sz, + lsquic_packet_out_avail(packet_out), + copath->cop_path_chals[copath->cop_n_chals]); + if (w < 0) + { + ABORT_ERROR("generating PATH_CHALLENGE frame failed: %d", errno); + return; + } + LSQ_DEBUG("generated %d-byte PATH_CHALLENGE frame; challenge: %s" + ", seq: %u", w, + HEXSTR((unsigned char *) &copath->cop_path_chals[copath->cop_n_chals], + sizeof(copath->cop_path_chals[copath->cop_n_chals]), hexbuf), + copath->cop_n_chals); + ++copath->cop_n_chals; + EV_LOG_GENERATED_PATH_CHAL_FRAME(LSQUIC_LOG_CONN_ID, conn->ifc_conn.cn_pf, + packet_out->po_data + packet_out->po_data_sz, w); + packet_out->po_frame_types |= QUIC_FTBIT_PATH_CHALLENGE; + lsquic_send_ctl_incr_pack_sz(&conn->ifc_send_ctl, packet_out, w); + packet_out->po_regen_sz += w; + conn->ifc_send_flags &= ~(SF_SEND_PATH_CHAL << path_id); + lsquic_alarmset_set(&conn->ifc_alset, AL_PATH_CHAL + path_id, + now + (INITIAL_CHAL_TIMEOUT << (copath->cop_n_chals - 1))); +} + + +static void +generate_path_chal_0 (struct ietf_full_conn *conn, lsquic_time_t now) +{ + generate_path_chal_frame(conn, now, 0); +} + + +static void +generate_path_chal_1 (struct ietf_full_conn *conn, lsquic_time_t now) +{ + generate_path_chal_frame(conn, now, 1); +} + + +static void +generate_path_resp_frame (struct ietf_full_conn *conn, lsquic_time_t now, + unsigned path_id) +{ + struct lsquic_packet_out *packet_out; + struct conn_path *copath; + unsigned need; + int w; + + copath = &conn->ifc_paths[path_id]; + need = conn->ifc_conn.cn_pf->pf_path_resp_frame_size(); + packet_out = get_writeable_packet_on_path(conn, need, &copath->cop_path, 1); + if (!packet_out) + return; + + w = conn->ifc_conn.cn_pf->pf_gen_path_resp_frame( + packet_out->po_data + packet_out->po_data_sz, + lsquic_packet_out_avail(packet_out), + copath->cop_inc_chal); + if (w < 0) + { + ABORT_ERROR("generating PATH_RESPONSE frame failed: %d", errno); + return; + } + LSQ_DEBUG("generated %d-byte PATH_RESPONSE frame; response: %016"PRIX64, + w, copath->cop_inc_chal); + EV_LOG_GENERATED_PATH_RESP_FRAME(LSQUIC_LOG_CONN_ID, conn->ifc_conn.cn_pf, + packet_out->po_data + packet_out->po_data_sz, w); + packet_out->po_frame_types |= QUIC_FTBIT_PATH_RESPONSE; + lsquic_send_ctl_incr_pack_sz(&conn->ifc_send_ctl, packet_out, w); + packet_out->po_regen_sz += w; + conn->ifc_send_flags &= ~(SF_SEND_PATH_RESP << path_id); +} + + +static void +generate_path_resp_0 (struct ietf_full_conn *conn, lsquic_time_t now) +{ + generate_path_resp_frame(conn, now, 0); +} + + +static void +generate_path_resp_1 (struct ietf_full_conn *conn, lsquic_time_t now) +{ + generate_path_resp_frame(conn, now, 1); +} + + +static struct lsquic_packet_out * +ietf_full_conn_ci_next_packet_to_send (struct lsquic_conn *lconn, size_t size) +{ + struct ietf_full_conn *conn = (struct ietf_full_conn *) lconn; + struct lsquic_packet_out *packet_out; + + packet_out = lsquic_send_ctl_next_packet_to_send(&conn->ifc_send_ctl, size); + if (packet_out) + lsquic_packet_out_set_spin_bit(packet_out, conn->ifc_spin_bit); + return packet_out; +} + + +static lsquic_time_t +ietf_full_conn_ci_next_tick_time (struct lsquic_conn *lconn) +{ + struct ietf_full_conn *conn = (struct ietf_full_conn *) lconn; + lsquic_time_t alarm_time, pacer_time, now; + + alarm_time = lsquic_alarmset_mintime(&conn->ifc_alset); + pacer_time = lsquic_send_ctl_next_pacer_time(&conn->ifc_send_ctl); + + if (pacer_time && LSQ_LOG_ENABLED(LSQ_LOG_DEBUG)) + { + now = lsquic_time_now(); + if (pacer_time < now) + LSQ_DEBUG("%s: pacer is %"PRIu64" usec in the past", __func__, + now - pacer_time); + } + + if (alarm_time && pacer_time) + { + if (alarm_time < pacer_time) + return alarm_time; + else + return pacer_time; + } + else if (alarm_time) + return alarm_time; + else + return pacer_time; +} + + +static ptrdiff_t +count_zero_bytes (const unsigned char *p, size_t len) +{ + const unsigned char *const end = p + len; + while (p < end && 0 == *p) + ++p; + return len - (end - p); +} + + +static unsigned +process_padding_frame (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in, const unsigned char *p, size_t len) +{ + return (unsigned) count_zero_bytes(p, len); +} + + +static int +process_ack (struct ietf_full_conn *conn, struct ack_info *acki, + lsquic_time_t received, lsquic_time_t now) +{ + enum packnum_space pns; + lsquic_packno_t packno; + int one_rtt_acked; + + LSQ_DEBUG("Processing ACK"); + one_rtt_acked = lsquic_send_ctl_1rtt_acked(&conn->ifc_send_ctl); + if (0 == lsquic_send_ctl_got_ack(&conn->ifc_send_ctl, acki, received, now)) + { + pns = acki->pns; + packno = lsquic_send_ctl_largest_ack2ed(&conn->ifc_send_ctl, pns); + /* FIXME TODO zero is a valid packet number */ + if (packno) + lsquic_rechist_stop_wait(&conn->ifc_rechist[ pns ], packno + 1); + /* ACK of 1-RTT packet indicates that handshake has been confirmed: */ + if (!one_rtt_acked && lsquic_send_ctl_1rtt_acked(&conn->ifc_send_ctl)) + { + if (!(conn->ifc_flags & IFC_IGNORE_INIT)) + ignore_init(conn); + ignore_hsk(conn); + conn->ifc_conn.cn_esf.i->esfi_1rtt_acked( + conn->ifc_conn.cn_enc_session); + if (!(conn->ifc_flags & IFC_SERVER)) + maybe_start_migration(conn); + } + return 0; + } + else + { + ABORT_ERROR("Received invalid ACK"); + return -1; + } +} + + +static int +process_saved_ack (struct ietf_full_conn *conn, int restore_parsed_ack, + lsquic_time_t now) +{ + struct ack_info *const acki = conn->ifc_pub.mm->acki; + struct lsquic_packno_range range; + unsigned n_ranges, n_timestamps; + lsquic_time_t lack_delta; + int retval; + +#ifdef WIN32 + /* Useless initialization to mollify MSVC: */ + memset(&range, 0, sizeof(range)); + n_ranges = 0; + n_timestamps = 0; + lack_delta = 0; +#endif + + if (restore_parsed_ack) + { + n_ranges = acki->n_ranges; + n_timestamps = acki->n_timestamps; + lack_delta = acki->lack_delta; + range = acki->ranges[0]; + } + + acki->pns = PNS_APP; + acki->n_ranges = 1; + acki->n_timestamps = conn->ifc_saved_ack_info.sai_n_timestamps; + acki->lack_delta = conn->ifc_saved_ack_info.sai_lack_delta; + acki->ranges[0] = conn->ifc_saved_ack_info.sai_range; + + retval = process_ack(conn, acki, conn->ifc_saved_ack_received, now); + + if (restore_parsed_ack) + { + acki->n_ranges = n_ranges; + acki->n_timestamps = n_timestamps; + acki->lack_delta = lack_delta; + acki->ranges[0] = range; + } + + return retval; +} + + +static int +new_ack_is_superset (const struct short_ack_info *old, const struct ack_info *new) +{ + const struct lsquic_packno_range *new_range; + + new_range = &new->ranges[ new->n_ranges - 1 ]; + return new_range->low <= old->sai_range.low + && new_range->high >= old->sai_range.high; +} + + +static int +merge_saved_to_new (const struct short_ack_info *old, struct ack_info *new) +{ + struct lsquic_packno_range *smallest_range; + + assert(new->n_ranges > 1); + smallest_range = &new->ranges[ new->n_ranges - 1 ]; + if (old->sai_range.high <= smallest_range->high + && old->sai_range.high >= smallest_range->low + && old->sai_range.low < smallest_range->low) + { + smallest_range->low = old->sai_range.low; + return 1; + } + else + return 0; +} + + +static int +merge_new_to_saved (struct short_ack_info *old, const struct ack_info *new) +{ + const struct lsquic_packno_range *new_range; + + assert(new->n_ranges == 1); + new_range = &new->ranges[0]; + /* Only merge if new is higher, for simplicity. This is also the + * expected case. + */ + if (new_range->high > old->sai_range.high + && new_range->low > old->sai_range.low) + { + old->sai_range.high = new_range->high; + return 1; + } + else + return 0; +} + + +static unsigned +process_path_challenge_frame (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in, const unsigned char *p, size_t len) +{ + struct conn_path *const path = &conn->ifc_paths[packet_in->pi_path_id]; + int parsed_len; + char hexbuf[sizeof(path->cop_inc_chal) * 2 + 1]; + + parsed_len = conn->ifc_conn.cn_pf->pf_parse_path_chal_frame(p, len, + /* It's OK to overwrite incoming challenge, only reply to latest */ + &path->cop_inc_chal); + if (parsed_len > 0) + { + LSQ_DEBUG("received path challenge %s for path #%hhu", + HEXSTR((unsigned char *) &path->cop_inc_chal, + sizeof(path->cop_inc_chal), hexbuf), packet_in->pi_path_id); + conn->ifc_send_flags |= SF_SEND_PATH_RESP << packet_in->pi_path_id; + return parsed_len; + } + else + return 0; +} + + +/* Why "maybe?" Because it is possible that the peer did not provide us + * enough CIDs and we had to reuse one. See init_new_path(). + */ +static void +maybe_retire_dcid (struct ietf_full_conn *conn, const lsquic_cid_t *dcid) +{ + struct conn_path *copath; + struct dcid_elem **dce; + unsigned eqs; + + eqs = 0; + for (copath = conn->ifc_paths; copath < conn->ifc_paths + + sizeof(conn->ifc_paths) / sizeof(conn->ifc_paths[0]); ++copath) + eqs += LSQUIC_CIDS_EQ(&copath->cop_path.np_dcid, dcid); + + if (eqs > 1) + { + LSQ_INFOC("cannot retire %"CID_FMT", as it is used on more than one" + "path ", CID_BITS(dcid)); + return; + } + + for (dce = conn->ifc_dces; dce < DCES_END(conn); ++dce) + if (*dce && ((*dce)->de_flags & DE_ASSIGNED) + && LSQUIC_CIDS_EQ(&(*dce)->de_cid, dcid)) + break; + + assert(dce < DCES_END(conn)); + if (dce < DCES_END(conn)) + retire_dcid(conn, dce); +} + + +static void +switch_path_to (struct ietf_full_conn *conn, unsigned char path_id) +{ + const unsigned char old_path_id = conn->ifc_cur_path_id; + + assert(conn->ifc_cur_path_id != path_id); + + EV_LOG_CONN_EVENT(LSQUIC_LOG_CONN_ID, "switched paths"); + lsquic_send_ctl_repath(&conn->ifc_send_ctl, + CUR_NPATH(conn), &conn->ifc_paths[path_id].cop_path); + maybe_retire_dcid(conn, &CUR_NPATH(conn)->np_dcid); + conn->ifc_cur_path_id = path_id; + conn->ifc_pub.path = CUR_NPATH(conn); + conn->ifc_conn.cn_cur_cce_idx = CUR_CPATH(conn)->cop_cce_idx; + if (conn->ifc_flags & IFC_SERVER) + { + memset(&conn->ifc_paths[old_path_id], 0, sizeof(conn->ifc_paths[0])); + conn->ifc_paths[old_path_id].cop_path.np_path_id = old_path_id; + } +} + + +static unsigned +process_path_response_frame (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in, const unsigned char *p, size_t len) +{ + struct conn_path *path; + int parsed_len; + unsigned i; + unsigned char path_id; + uint64_t path_resp; + char hexbuf[ sizeof(path_resp) * 2 + 1 ]; + + parsed_len = conn->ifc_conn.cn_pf->pf_parse_path_resp_frame(p, len, + &path_resp); + if (parsed_len <= 0) + return 0; + + LSQ_DEBUG("received path response: %s", + HEXSTR((unsigned char *) &path_resp, sizeof(path_resp), hexbuf)); + + for (path = conn->ifc_paths; path < conn->ifc_paths + + sizeof(conn->ifc_paths) / sizeof(conn->ifc_paths[0]); ++path) + { + path_id = path - conn->ifc_paths; + if ((1 << path_id) & conn->ifc_used_paths) + for (i = 0; i < path->cop_n_chals; ++i) + if (path_resp == path->cop_path_chals[i]) + goto found; + } + + ABORT_QUIETLY(0, TEC_PROTOCOL_VIOLATION, + "received path response %s that does not correspond to any " + "challenge sent on this path", + HEXSTR((unsigned char *) &path_resp, sizeof(path_resp), hexbuf)); + return 0; + + found: + path->cop_flags |= COP_VALIDATED; + conn->ifc_send_flags &= ~(SF_SEND_PATH_CHAL << path_id); + lsquic_alarmset_unset(&conn->ifc_alset, AL_PATH_CHAL + path_id); + switch ((path_id != conn->ifc_cur_path_id) | + (!!(path->cop_flags & COP_GOT_NONPROB) << 1)) + { + case 3: + LSQ_INFO("path validated: switching from path #%hhu to path #%hhu", + conn->ifc_cur_path_id, path_id); + switch_path_to(conn, path_id); + break; + case 1: + if (conn->ifc_flags & IFC_SERVER) + /* If you see this message in the log file, remember that + * COP_GOT_NONPROB is set after all frames in a packet have + * been processed. + */ + LSQ_DEBUG("path #%hhu validated, but since no non-probing frames " + "have been received, delay switching to it", + path_id); + else + { + LSQ_INFO("path validated: switching from path #%hhu to path #%hhu", + conn->ifc_cur_path_id, path_id); + switch_path_to(conn, path_id); + } + break; + default: + LSQ_DEBUG("current path validated"); + break; + } + + return parsed_len; +} + + +static lsquic_stream_t * +find_stream_by_id (struct ietf_full_conn *conn, lsquic_stream_id_t stream_id) +{ + struct lsquic_hash_elem *el; + el = lsquic_hash_find(conn->ifc_pub.all_streams, &stream_id, + sizeof(stream_id)); + if (el) + return lsquic_hashelem_getdata(el); + else + return NULL; +} + + +static struct lsquic_stream * +ieft_full_conn_ci_get_stream_by_id (struct lsquic_conn *lconn, + lsquic_stream_id_t stream_id) +{ + struct ietf_full_conn *conn = (struct ietf_full_conn *) lconn; + return find_stream_by_id(conn, stream_id); +} + + +static void +maybe_schedule_ss_for_stream (struct ietf_full_conn *conn, + lsquic_stream_id_t stream_id, enum http_error_code error_code) +{ + struct stream_id_to_ss *sits; + + if (conn_is_stream_closed(conn, stream_id)) + return; + + sits = malloc(sizeof(*sits)); + if (!sits) + return; + + sits->sits_stream_id = stream_id; + sits->sits_error_code = error_code; + STAILQ_INSERT_TAIL(&conn->ifc_stream_ids_to_ss, sits, sits_next); + conn->ifc_send_flags |= SF_SEND_STOP_SENDING; + conn_mark_stream_closed(conn, stream_id); +} + + +/* This function is called to create incoming streams */ +static struct lsquic_stream * +new_stream (struct ietf_full_conn *conn, lsquic_stream_id_t stream_id, + enum stream_ctor_flags flags) +{ + const struct lsquic_stream_if *iface; + void *stream_ctx; + struct lsquic_stream *stream; + unsigned initial_window; + const int call_on_new = flags & SCF_CALL_ON_NEW; + + flags &= ~SCF_CALL_ON_NEW; + flags |= SCF_DI_AUTOSWITCH|SCF_IETF; + + if ((conn->ifc_flags & IFC_HTTP) && ((stream_id >> SD_SHIFT) & 1) == SD_UNI) + { + iface = unicla_if_ptr; + stream_ctx = conn; + /* FIXME: This logic does not work for push streams. Perhaps one way + * to address this is to reclassify them later? + */ + flags |= SCF_CRITICAL; + } + else + { + iface = conn->ifc_enpub->enp_stream_if; + stream_ctx = conn->ifc_enpub->enp_stream_if_ctx; + if (conn->ifc_enpub->enp_settings.es_rw_once) + flags |= SCF_DISP_RW_ONCE; + if (conn->ifc_flags & IFC_HTTP) + flags |= SCF_HTTP; + } + + if (((stream_id >> SD_SHIFT) & 1) == SD_UNI) + initial_window = conn->ifc_enpub->enp_settings + .es_init_max_stream_data_uni; + else + initial_window = conn->ifc_enpub->enp_settings + .es_init_max_stream_data_bidi_remote; + + stream = lsquic_stream_new(stream_id, &conn->ifc_pub, + iface, stream_ctx, initial_window, + conn->ifc_cfg.max_stream_send, flags); + if (stream) + { + if (lsquic_hash_insert(conn->ifc_pub.all_streams, &stream->id, + sizeof(stream->id), stream, &stream->sm_hash_el)) + { + if (call_on_new) + lsquic_stream_call_on_new(stream); + } + else + { + lsquic_stream_destroy(stream); + stream = NULL; + } + } + return stream; +} + + +static int +conn_is_send_only_stream (const struct ietf_full_conn *conn, + lsquic_stream_id_t stream_id) +{ + enum stream_id_type sit; + + sit = stream_id & SIT_MASK; + if (conn->ifc_flags & IFC_SERVER) + return sit == SIT_UNI_SERVER; + else + return sit == SIT_UNI_CLIENT; +} + + +static int +conn_is_receive_only_stream (const struct ietf_full_conn *conn, + lsquic_stream_id_t stream_id) +{ + enum stream_id_type sit; + + sit = stream_id & SIT_MASK; + if (conn->ifc_flags & IFC_SERVER) + return sit == SIT_UNI_CLIENT; + else + return sit == SIT_UNI_SERVER; +} + + +static unsigned +process_rst_stream_frame (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in, const unsigned char *p, size_t len) +{ + lsquic_stream_id_t stream_id; + uint64_t offset, error_code; + lsquic_stream_t *stream; + int call_on_new; + const int parsed_len = conn->ifc_conn.cn_pf->pf_parse_rst_frame(p, len, + &stream_id, &offset, &error_code); + if (parsed_len < 0) + return 0; + + EV_LOG_RST_STREAM_FRAME_IN(LSQUIC_LOG_CONN_ID, stream_id, offset, + error_code); + LSQ_DEBUG("Got RST_STREAM; stream: %"PRIu64"; offset: 0x%"PRIX64, stream_id, + offset); + + if (conn_is_send_only_stream(conn, stream_id)) + { + ABORT_QUIETLY(0, TEC_STREAM_STATE_ERROR, + "received RESET_STREAM on send-only stream %"PRIu64, stream_id); + return 0; + } + + call_on_new = 0; + stream = find_stream_by_id(conn, stream_id); + if (!stream) + { + if (conn_is_stream_closed(conn, stream_id)) + { + LSQ_DEBUG("got reset frame for closed stream %"PRIu64, stream_id); + return parsed_len; + } + if (!is_peer_initiated(conn, stream_id)) + { + ABORT_ERROR("received reset for never-initiated stream %"PRIu64, + stream_id); + return 0; + } + + stream = new_stream(conn, stream_id, 0); + if (!stream) + { + ABORT_ERROR("cannot create new stream: %s", strerror(errno)); + return 0; + } + ++call_on_new; + } + + if (0 != lsquic_stream_rst_in(stream, offset, error_code)) + { + ABORT_ERROR("received invalid RST_STREAM"); + return 0; + } + if (call_on_new) + lsquic_stream_call_on_new(stream); + return parsed_len; +} + + +static unsigned +process_stop_sending_frame (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in, const unsigned char *p, size_t len) +{ + struct lsquic_stream *stream; + lsquic_stream_id_t stream_id, max_allowed; + uint64_t error_code; + int parsed_len, our_stream; + enum stream_state_sending sss; + + parsed_len = conn->ifc_conn.cn_pf->pf_parse_stop_sending_frame(p, len, + &stream_id, &error_code); + if (parsed_len < 0) + return 0; + + EV_LOG_STOP_SENDING_FRAME_IN(LSQUIC_LOG_CONN_ID, stream_id, error_code); + LSQ_DEBUG("Got STOP_SENDING; stream: %"PRIu64"; error code: %"PRIu64, + stream_id, error_code); + + if (conn_is_receive_only_stream(conn, stream_id)) + { + ABORT_QUIETLY(0, TEC_STREAM_STATE_ERROR, + "received STOP_SENDING on receive-only stream %"PRIu64, stream_id); + return 0; + } + + our_stream = !is_peer_initiated(conn, stream_id); + stream = find_stream_by_id(conn, stream_id); + if (stream) + { + if (our_stream && + SSS_READY == (sss = lsquic_stream_sending_state(stream))) + { + ABORT_QUIETLY(0, TEC_PROTOCOL_VIOLATION, "stream %"PRIu64" is in " + "%s state: receipt of STOP_SENDING frame is a violation", + stream_id, lsquic_sss2str[sss]); + return 0; + } + lsquic_stream_stop_sending_in(stream, error_code); + } + else if (conn_is_stream_closed(conn, stream_id)) + LSQ_DEBUG("stream %"PRIu64" is closed: ignore STOP_SENDING frame", + stream_id); + else if (our_stream) + { + ABORT_QUIETLY(0, TEC_STREAM_STATE_ERROR, "received STOP_SENDING frame " + "on locally initiated stream that has not yet been opened"); + return 0; + } + else + { + max_allowed = conn->ifc_max_allowed_stream_id[stream_id & SIT_MASK]; + if (stream_id >= max_allowed) + { + ABORT_QUIETLY(0, TEC_STREAM_LIMIT_ERROR, "incoming STOP_SENDING " + "for stream %"PRIu64" would exceed allowed max of %"PRIu64, + stream_id, max_allowed); + return 0; + } + if (conn->ifc_flags & IFC_GOING_AWAY) + { + LSQ_DEBUG("going away: reject new incoming stream %"PRIu64, + stream_id); + maybe_schedule_ss_for_stream(conn, stream_id, HEC_REQUEST_REJECTED); + return parsed_len; + } + stream = new_stream(conn, stream_id, 0); + if (!stream) + { + ABORT_ERROR("cannot create new stream: %s", strerror(errno)); + return 0; + } + lsquic_stream_stop_sending_in(stream, error_code); + lsquic_stream_call_on_new(stream); + } + + return parsed_len; +} + + +/* Ignore CRYPTO frames in server mode */ +static unsigned +process_crypto_frame_server (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in, const unsigned char *p, size_t len) +{ + struct stream_frame stream_frame; + int parsed_len; + + parsed_len = conn->ifc_conn.cn_pf->pf_parse_crypto_frame(p, len, + &stream_frame); + if (parsed_len > 0) + return (unsigned) parsed_len; + else + return 0; +} + + +static unsigned +process_crypto_frame_client (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in, const unsigned char *p, size_t len) +{ + struct stream_frame *stream_frame; + struct lsquic_stream *stream; + enum enc_level enc_level; + int parsed_len; + + stream_frame = lsquic_malo_get(conn->ifc_pub.mm->malo.stream_frame); + if (!stream_frame) + { + LSQ_WARN("could not allocate stream frame: %s", strerror(errno)); + return 0; + } + + parsed_len = conn->ifc_conn.cn_pf->pf_parse_crypto_frame(p, len, + stream_frame); + if (parsed_len < 0) { + lsquic_malo_put(stream_frame); + return 0; + } + enc_level = lsquic_packet_in_enc_level(packet_in); + EV_LOG_CRYPTO_FRAME_IN(LSQUIC_LOG_CONN_ID, stream_frame, enc_level); + LSQ_DEBUG("Got CRYPTO frame for enc level #%u", enc_level); + if ((conn->ifc_conn.cn_flags & LSCONN_HANDSHAKE_DONE) + && enc_level != ENC_LEV_FORW) + { + LSQ_DEBUG("handshake complete: ignore CRYPTO frames in " + "non-forward-secure packets"); + return parsed_len; + } + + if (conn->ifc_flags & IFC_CLOSING) + { + LSQ_DEBUG("Connection closing: ignore frame"); + lsquic_malo_put(stream_frame); + return parsed_len; + } + + if (conn->ifc_crypto_streams[enc_level]) + stream = conn->ifc_crypto_streams[enc_level]; + else + { + stream = lsquic_stream_new_crypto(enc_level, &conn->ifc_pub, + &lsquic_cry_sm_if, conn->ifc_conn.cn_enc_session, + SCF_IETF|SCF_DI_AUTOSWITCH|SCF_CALL_ON_NEW|SCF_CRITICAL); + if (!stream) + { + lsquic_malo_put(stream_frame); + ABORT_WARN("cannot create crypto stream for level %u", enc_level); + return 0; + } + conn->ifc_crypto_streams[enc_level] = stream; + (void) lsquic_stream_wantread(stream, 1); + } + + stream_frame->packet_in = lsquic_packet_in_get(packet_in); + if (0 != lsquic_stream_frame_in(stream, stream_frame)) + { + ABORT_ERROR("cannot insert stream frame"); + return 0; + } + + if (!(conn->ifc_conn.cn_flags & LSCONN_HANDSHAKE_DONE)) + { /* To enable decryption, process handshake stream as soon as its + * data frames are received. + * + * TODO: this does not work when packets are reordered. A more + * flexible solution would defer packet decryption if handshake + * has not been completed yet. Nevertheless, this is good enough + * for now. + */ + lsquic_stream_dispatch_read_events(stream); + } + + return parsed_len; +} + + +static unsigned +process_crypto_frame (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in, const unsigned char *p, size_t len) +{ + if (conn->ifc_flags & IFC_SERVER) + return process_crypto_frame_server(conn, packet_in, p, len); + else + return process_crypto_frame_client(conn, packet_in, p, len); +} + + +static unsigned +process_stream_frame (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in, const unsigned char *p, size_t len) +{ + struct stream_frame *stream_frame; + struct lsquic_stream *stream; + int parsed_len; + + stream_frame = lsquic_malo_get(conn->ifc_pub.mm->malo.stream_frame); + if (!stream_frame) + { + LSQ_WARN("could not allocate stream frame: %s", strerror(errno)); + return 0; + } + + parsed_len = conn->ifc_conn.cn_pf->pf_parse_stream_frame(p, len, + stream_frame); + if (parsed_len < 0) { + lsquic_malo_put(stream_frame); + return 0; + } + EV_LOG_STREAM_FRAME_IN(LSQUIC_LOG_CONN_ID, stream_frame); + LSQ_DEBUG("Got stream frame for stream #%"PRIu64, stream_frame->stream_id); + + if (conn_is_send_only_stream(conn, stream_frame->stream_id)) + { + ABORT_QUIETLY(0, TEC_STREAM_STATE_ERROR, "received STREAM frame " + "on send-only stream %"PRIu64, stream_frame->stream_id); + return 0; + } + + if ((conn->ifc_flags & (IFC_SERVER|IFC_HTTP)) == IFC_HTTP + && SIT_BIDI_SERVER == (stream_frame->stream_id & SIT_MASK)) + { + ABORT_QUIETLY(1, HEC_STREAM_CREATION_ERROR, "HTTP/3 server " + "is not allowed to initiate bidirectional streams (got " + "STREAM frame for stream %"PRIu64, stream_frame->stream_id); + return 0; + } + + if (conn->ifc_flags & IFC_CLOSING) + { + LSQ_DEBUG("Connection closing: ignore frame"); + lsquic_malo_put(stream_frame); + return parsed_len; + } + + stream = find_stream_by_id(conn, stream_frame->stream_id); + if (!stream) + { + if (conn_is_stream_closed(conn, stream_frame->stream_id)) + { + LSQ_DEBUG("drop frame for closed stream %"PRIu64, + stream_frame->stream_id); + lsquic_malo_put(stream_frame); + return parsed_len; + } + if (is_peer_initiated(conn, stream_frame->stream_id)) + { + const lsquic_stream_id_t max_allowed = + conn->ifc_max_allowed_stream_id[stream_frame->stream_id & SIT_MASK]; + if (stream_frame->stream_id >= max_allowed) + { + ABORT_QUIETLY(0, TEC_STREAM_LIMIT_ERROR, "incoming stream " + "%"PRIu64" exceeds allowed max of %"PRIu64, + stream_frame->stream_id, max_allowed); + lsquic_malo_put(stream_frame); + return 0; + } + if (conn->ifc_flags & IFC_GOING_AWAY) + { + LSQ_DEBUG("going away: reject new incoming stream %"PRIu64, + stream_frame->stream_id); + maybe_schedule_ss_for_stream(conn, stream_frame->stream_id, + HEC_REQUEST_REJECTED); + lsquic_malo_put(stream_frame); + return parsed_len; + } + } + else + { + ABORT_QUIETLY(0, TEC_STREAM_STATE_ERROR, "received STREAM frame " + "for never-initiated stream"); + lsquic_malo_put(stream_frame); + return 0; + } + stream = new_stream(conn, stream_frame->stream_id, SCF_CALL_ON_NEW); + if (!stream) + { + ABORT_ERROR("cannot create new stream: %s", strerror(errno)); + lsquic_malo_put(stream_frame); + return 0; + } + if (SD_BIDI == ((stream_frame->stream_id >> SD_SHIFT) & 1) + && (!valid_stream_id(conn->ifc_max_req_id) + || conn->ifc_max_req_id < stream_frame->stream_id)) + conn->ifc_max_req_id = stream_frame->stream_id; + } + + stream_frame->packet_in = lsquic_packet_in_get(packet_in); + if (0 != lsquic_stream_frame_in(stream, stream_frame)) + { + ABORT_ERROR("cannot insert stream frame"); + return 0; + } + + return parsed_len; +} + + +static unsigned +process_ack_frame (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in, const unsigned char *p, size_t len) +{ + struct ack_info *const new_acki = conn->ifc_pub.mm->acki; + enum packnum_space pns; + int parsed_len; + lsquic_time_t warn_time; + + parsed_len = conn->ifc_conn.cn_pf->pf_parse_ack_frame(p, len, new_acki, + conn->ifc_cfg.ack_exp); + if (parsed_len < 0) + goto err; + + /* This code to throw out old ACKs is what keeps us compliant with this + * requirement: + * + * [draft-ietf-quic-transport-18] Section 13.3.2. + * + > Processing counts out of order can result in verification failure. + > An endpoint SHOULD NOT perform this verification if the ACK frame is + > received in a packet with packet number lower than a previously + > received ACK frame. Verifying based on ACK frames that arrive out of + > order can result in disabling ECN unnecessarily. + */ + pns = lsquic_hety2pns[ packet_in->pi_header_type ]; + if (is_valid_packno(conn->ifc_max_ack_packno[pns]) && + packet_in->pi_packno <= conn->ifc_max_ack_packno[pns]) + { + LSQ_DEBUG("Ignore old ack (max %"PRIu64")", + conn->ifc_max_ack_packno[pns]); + return parsed_len; + } + + EV_LOG_ACK_FRAME_IN(LSQUIC_LOG_CONN_ID, new_acki); + conn->ifc_max_ack_packno[pns] = packet_in->pi_packno; + new_acki->pns = pns; + if (pns != PNS_APP) /* Don't bother optimizing non-APP */ + goto process_ack; + + if (conn->ifc_flags & IFC_HAVE_SAVED_ACK) + { + LSQ_DEBUG("old ack [%"PRIu64"-%"PRIu64"]", + conn->ifc_saved_ack_info.sai_range.high, + conn->ifc_saved_ack_info.sai_range.low); + const int is_superset = new_ack_is_superset(&conn->ifc_saved_ack_info, + new_acki); + const int is_1range = new_acki->n_ranges == 1; + switch ( + (is_superset << 1) + | (is_1range << 0)) + /* | | + | | + V V */ { + case (0 << 1) | (0 << 0): + if (!merge_saved_to_new(&conn->ifc_saved_ack_info, new_acki)) + process_saved_ack(conn, 1, packet_in->pi_received); + conn->ifc_flags &= ~IFC_HAVE_SAVED_ACK; + if (0 != process_ack(conn, new_acki, packet_in->pi_received, + packet_in->pi_received)) + goto err; + break; + case (0 << 1) | (1 << 0): + if (!merge_new_to_saved(&conn->ifc_saved_ack_info, new_acki)) + { + process_saved_ack(conn, 1, packet_in->pi_received); + conn->ifc_saved_ack_info.sai_n_timestamps = new_acki->n_timestamps; + conn->ifc_saved_ack_info.sai_range = new_acki->ranges[0]; + } + conn->ifc_saved_ack_info.sai_lack_delta = new_acki->lack_delta; + conn->ifc_saved_ack_received = packet_in->pi_received; + break; + case (1 << 1) | (0 << 0): + conn->ifc_flags &= ~IFC_HAVE_SAVED_ACK; + if (0 != process_ack(conn, new_acki, packet_in->pi_received, + packet_in->pi_received)) + goto err; + break; + case (1 << 1) | (1 << 0): + conn->ifc_saved_ack_info.sai_n_timestamps = new_acki->n_timestamps; + conn->ifc_saved_ack_info.sai_lack_delta = new_acki->lack_delta; + conn->ifc_saved_ack_info.sai_range = new_acki->ranges[0]; + conn->ifc_saved_ack_received = packet_in->pi_received; + break; + } + } + else if (new_acki->n_ranges == 1) + { + conn->ifc_saved_ack_info.sai_n_timestamps = new_acki->n_timestamps; + conn->ifc_saved_ack_info.sai_n_timestamps = new_acki->n_timestamps; + conn->ifc_saved_ack_info.sai_lack_delta = new_acki->lack_delta; + conn->ifc_saved_ack_info.sai_range = new_acki->ranges[0]; + conn->ifc_saved_ack_received = packet_in->pi_received; + conn->ifc_flags |= IFC_HAVE_SAVED_ACK; + } + else + { + process_ack: + if (0 != process_ack(conn, new_acki, packet_in->pi_received, + packet_in->pi_received)) + goto err; + } + + return parsed_len; + + err: + warn_time = lsquic_time_now(); + if (0 == conn->ifc_enpub->enp_last_warning[WT_ACKPARSE_FULL] + || conn->ifc_enpub->enp_last_warning[WT_ACKPARSE_FULL] + + WARNING_INTERVAL < warn_time) + { + conn->ifc_enpub->enp_last_warning[WT_ACKPARSE_FULL] = warn_time; + LSQ_WARN("Invalid ACK frame"); + } + return 0; +} + + +static unsigned +process_ping_frame (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in, const unsigned char *p, size_t len) +{ /* This frame causes ACK frame to be queued, but nothing to do here; + * return the length of this frame. + */ + EV_LOG_PING_FRAME_IN(LSQUIC_LOG_CONN_ID); + LSQ_DEBUG("received PING"); + return 1; +} + + +static unsigned +process_connection_close_frame (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in, const unsigned char *p, size_t len) +{ + lsquic_stream_t *stream; + struct lsquic_hash_elem *el; + uint64_t error_code; + uint16_t reason_len; + uint8_t reason_off; + int parsed_len, app_error; + + parsed_len = conn->ifc_conn.cn_pf->pf_parse_connect_close_frame(p, len, + &app_error, &error_code, &reason_len, &reason_off); + if (parsed_len < 0) + return 0; + EV_LOG_CONNECTION_CLOSE_FRAME_IN(LSQUIC_LOG_CONN_ID, error_code, + (int) reason_len, (const char *) p + reason_off); + LSQ_INFO("Received CONNECTION_CLOSE frame (%s-level code: %"PRIu64"; " + "reason: %.*s)", app_error ? "application" : "transport", + error_code, (int) reason_len, (const char *) p + reason_off); + conn->ifc_flags |= IFC_RECV_CLOSE; + if (!(conn->ifc_flags & IFC_CLOSING)) + { + for (el = lsquic_hash_first(conn->ifc_pub.all_streams); el; + el = lsquic_hash_next(conn->ifc_pub.all_streams)) + { + stream = lsquic_hashelem_getdata(el); + lsquic_stream_shutdown_internal(stream); + } + conn->ifc_flags |= IFC_CLOSING; + } + return parsed_len; +} + + +static unsigned +process_max_data_frame (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in, const unsigned char *p, size_t len) +{ + uint64_t max_data; + int parsed_len; + + parsed_len = conn->ifc_conn.cn_pf->pf_parse_max_data(p, len, &max_data); + if (parsed_len < 0) + return 0; + + if (max_data > conn->ifc_pub.conn_cap.cc_max) + { + LSQ_DEBUG("max data goes from %"PRIu64" to %"PRIu64, + conn->ifc_pub.conn_cap.cc_max, max_data); + conn->ifc_pub.conn_cap.cc_max = max_data; + } + else + LSQ_DEBUG("newly supplied max data=%"PRIu64" is not larger than the " + "current value=%"PRIu64", ignoring", max_data, + conn->ifc_pub.conn_cap.cc_max); + return parsed_len; +} + + +static unsigned +process_max_stream_data_frame (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in, const unsigned char *p, size_t len) +{ + struct lsquic_stream *stream; + lsquic_stream_id_t stream_id; + uint64_t max_data; + int parsed_len; + + parsed_len = conn->ifc_conn.cn_pf->pf_parse_max_stream_data_frame(p, len, + &stream_id, &max_data); + if (parsed_len < 0) + return 0; + + if (conn_is_receive_only_stream(conn, stream_id)) + { + ABORT_QUIETLY(0, TEC_STREAM_STATE_ERROR, + "received MAX_STREAM_DATA on receive-only stream %"PRIu64, stream_id); + return 0; + } + + stream = find_stream_by_id(conn, stream_id); + if (stream) + lsquic_stream_window_update(stream, max_data); + else if (conn_is_stream_closed(conn, stream_id)) + LSQ_DEBUG("stream %"PRIu64" is closed: ignore MAX_STREAM_DATA frame", + stream_id); + else + { + ABORT_QUIETLY(0, TEC_STREAM_STATE_ERROR, "received MAX_STREAM_DATA " + "frame on never-opened stream %"PRIu64, stream_id); + return 0; + } + + return parsed_len; +} + + +static unsigned +process_max_streams_frame (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in, const unsigned char *p, size_t len) +{ + lsquic_stream_id_t max_stream_id; + enum stream_id_type sit; + enum stream_dir sd; + uint64_t max_streams; + int parsed_len; + + parsed_len = conn->ifc_conn.cn_pf->pf_parse_max_streams_frame(p, len, + &sd, &max_streams); + if (parsed_len < 0) + return 0; + + sit = gen_sit(conn->ifc_flags & IFC_SERVER, sd); + max_stream_id = max_streams << SIT_SHIFT; + + if (max_stream_id > VINT_MAX_VALUE) + { + ABORT_QUIETLY(0, TEC_STREAM_LIMIT_ERROR, + "MAX_STREAMS: max %s stream ID of %"PRIu64" exceeds maximum " + "stream ID", sd == SD_BIDI ? "bidi" : "uni", max_stream_id); + return 0; + } + + if (max_stream_id > conn->ifc_max_allowed_stream_id[sit]) + { + LSQ_DEBUG("max %s stream ID updated from %"PRIu64" to %"PRIu64, + sd == SD_BIDI ? "bidi" : "uni", + conn->ifc_max_allowed_stream_id[sit], max_stream_id); + conn->ifc_max_allowed_stream_id[sit] = max_stream_id; + } + else + LSQ_DEBUG("ignore old max %s streams value of %"PRIu64, + sd == SD_BIDI ? "bidi" : "uni", max_streams); + + return parsed_len; +} + + +/* Returns true if current DCID was retired. In this case, it must be + * replaced. + */ +static int +retire_dcids_prior_to (struct ietf_full_conn *conn, unsigned retire_prior_to) +{ + struct dcid_elem **el; + int update_cur_dcid = 0; +#if LSQUIC_LOWEST_LOG_LEVEL >= LSQ_LOG_DEBUG + unsigned count = 0; +#endif + + for (el = conn->ifc_dces; el < conn->ifc_dces + sizeof(conn->ifc_dces) + / sizeof(conn->ifc_dces[0]); ++el) + if (*el && (*el)->de_seqno < retire_prior_to) + { + update_cur_dcid |= LSQUIC_CIDS_EQ(&(*el)->de_cid, CUR_DCID(conn)); + retire_dcid(conn, el); +#if LSQUIC_LOWEST_LOG_LEVEL >= LSQ_LOG_DEBUG + ++count; +#endif + } + + LSQ_DEBUG("retired %u DCID%s due to Retire Prior To=%u", count, + count != 1 ? "s" : "", retire_prior_to); + return update_cur_dcid; +} + + +static unsigned +process_new_connection_id_frame (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in, const unsigned char *p, size_t len) +{ + struct dcid_elem **dce, **el; + const unsigned char *token; + const char *action_str; + lsquic_cid_t cid; + uint64_t seqno, retire_prior_to; + int parsed_len, update_cur_dcid; + + parsed_len = conn->ifc_conn.cn_pf->pf_parse_new_conn_id(p, len, + &seqno, &retire_prior_to, &cid, &token); + if (parsed_len < 0) + return 0; + + if (seqno > UINT32_MAX || retire_prior_to > UINT32_MAX) + { /* It is wasteful to use 8-byte integers for these counters, so this + * is the guard here. This will "Never Happen." + */ + LSQ_INFO("ignoring unreasonably high seqno=%"PRIu64" or Retire Prior " + "To=%"PRIu64, seqno, retire_prior_to); + return parsed_len; + } + + if (retire_prior_to > seqno) + { + ABORT_QUIETLY(0, TEC_PROTOCOL_VIOLATION, + "NEW_CONNECTION_ID: Retire Prior To=%"PRIu64" is larger then the " + "Sequence Number=%"PRIu64, retire_prior_to, seqno); + return 0; + } + + if (retire_prior_to > conn->ifc_last_retire_prior_to) + { + conn->ifc_last_retire_prior_to = retire_prior_to; + update_cur_dcid = retire_dcids_prior_to(conn, retire_prior_to); + } + else + update_cur_dcid = 0; + + dce = NULL; + for (el = conn->ifc_dces; el < conn->ifc_dces + sizeof(conn->ifc_dces) + / sizeof(conn->ifc_dces[0]); ++el) + if (*el) + { + if ((*el)->de_seqno == seqno) + { + if (!LSQUIC_CIDS_EQ(&(*el)->de_cid, &cid)) + { + ABORT_QUIETLY(0, TEC_PROTOCOL_VIOLATION, + "NEW_CONNECTION_ID: already have CID seqno %"PRIu64 + " but with a different CID", seqno); + return 0; + } + else + { + LSQ_DEBUG("Ignore duplicate CID seqno %"PRIu64, seqno); + return parsed_len; + } + } + else if (LSQUIC_CIDS_EQ(&(*el)->de_cid, &cid)) + { + ABORT_QUIETLY(0, TEC_PROTOCOL_VIOLATION, + "NEW_CONNECTION_ID: received the same CID with sequence " + "numbers %u and %"PRIu64, (*el)->de_seqno, seqno); + return 0; + } + } + else if (!dce) + dce = el; + + if (dce) + { + *dce = lsquic_malo_get(conn->ifc_pub.mm->malo.dcid_elem); + if (*dce) + { + memset(*dce, 0, sizeof(**dce)); + (*dce)->de_seqno = seqno; + (*dce)->de_cid = cid; + memcpy((*dce)->de_srst, token, sizeof((*dce)->de_srst)); + (*dce)->de_flags |= DE_SRST; + action_str = "Saved"; + if (update_cur_dcid) + *CUR_DCID(conn) = cid; + } + else + action_str = "Ignored (alloc failure)"; + } + else + action_str = "Ignored (no slots available)"; + + LSQ_DEBUGC("Got new connection ID from peer: seq=%"PRIu64"; " + "cid: %"CID_FMT". %s.", seqno, CID_BITS(&cid), action_str); + return parsed_len; +} + + +static void +retire_cid (struct ietf_full_conn *conn, struct conn_cid_elem *cce, + lsquic_time_t now) +{ + struct lsquic_conn *const lconn = &conn->ifc_conn; + + LSQ_DEBUGC("retiring CID %"CID_FMT"; seqno: %u; %s", + CID_BITS(&cce->cce_cid), cce->cce_seqno, + (cce->cce_flags & CCE_SEQNO) ? "" : "original"); + + lsquic_engine_retire_cid(conn->ifc_enpub, lconn, cce - lconn->cn_cces, now); + memset(cce, 0, sizeof(*cce)); + + if (((1 << conn->ifc_conn.cn_n_cces) - 1 != conn->ifc_conn.cn_cces_mask) + && can_issue_cids(conn) + && !(lsquic_alarmset_is_set(&conn->ifc_alset, AL_CID_THROT))) + maybe_get_rate_available_scid_slot(conn, now); +} + + +static unsigned +process_retire_connection_id_frame (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in, const unsigned char *p, size_t len) +{ + struct lsquic_conn *const lconn = &conn->ifc_conn; + struct conn_cid_elem *cce; + uint64_t seqno; + int parsed_len; + + /* [draft-ietf-quic-transport-20] Section 19.16 + * + * - Peer cannot retire zero-lenth CID. (MUST treat as PROTOCOL_VIOLATION) + * - Peer cannot retire CID with sequence number that has not been + * allocated yet. (MAY treat as PROTOCOL_VIOLATION) + * - Peer cannot retire CID that matches the DCID in packet. + * (MAY treat as PROTOCOL_VIOLATION) + */ + if (conn->ifc_settings->es_scid_len == 0) + { + ABORT_QUIETLY(0, TEC_PROTOCOL_VIOLATION, "cannot retire zero-length CID"); + return 0; + } + + parsed_len = conn->ifc_conn.cn_pf->pf_parse_retire_cid_frame(p, len, + &seqno); + if (parsed_len < 0) + return 0; + + EV_LOG_CONN_EVENT(LSQUIC_LOG_CONN_ID, "got RETIRE_CONNECTION_ID frame: " + "seqno=%"PRIu64, seqno); + if (seqno >= conn->ifc_scid_seqno) + { + ABORT_QUIETLY(0, TEC_PROTOCOL_VIOLATION, "cannot retire CID seqno=" + "%"PRIu64" as it has not been allocated yet", seqno); + return 0; + } + + for (cce = lconn->cn_cces; cce < END_OF_CCES(lconn); ++cce) + if ((lconn->cn_cces_mask & (1 << (cce - lconn->cn_cces)) + && (cce->cce_flags & CCE_SEQNO) + && cce->cce_seqno == seqno)) + break; + + conn->ifc_active_cids_count -= seqno >= conn->ifc_first_active_cid_seqno; + + if (cce < END_OF_CCES(lconn)) + { + if (LSQUIC_CIDS_EQ(&cce->cce_cid, &packet_in->pi_dcid)) + { + ABORT_QUIETLY(0, TEC_PROTOCOL_VIOLATION, "cannot retire CID " + "seqno=%"PRIu64", for it is used as DCID in the packet", seqno); + return 0; + } + retire_cid(conn, cce, packet_in->pi_received); + } + else + LSQ_DEBUG("cannot retire CID seqno=%"PRIu64": not found", seqno); + + return parsed_len; +} + + +static unsigned +process_new_token_frame (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in, const unsigned char *p, size_t len) +{ + const unsigned char *token; + size_t token_sz; + char *token_str; + int parsed_len; + + parsed_len = conn->ifc_conn.cn_pf->pf_parse_new_token_frame(p, len, &token, + &token_sz); + if (parsed_len < 0) + return 0; + + if (LSQ_LOG_ENABLED(LSQ_LOG_DEBUG) + || LSQ_LOG_ENABLED_EXT(LSQ_LOG_DEBUG, LSQLM_EVENT)) + { + token_str = malloc(token_sz * 2 + 1); + if (token_str) + { + lsquic_hexstr(token, token_sz, token_str, token_sz * 2 + 1); + LSQ_DEBUG("Got %zu-byte NEW_TOKEN %s", token_sz, token_str); + EV_LOG_CONN_EVENT(LSQUIC_LOG_CONN_ID, "got NEW_TOKEN %s", + token_str); + free(token_str); + } + } + if (conn->ifc_enpub->enp_stream_if->on_new_token) + conn->ifc_enpub->enp_stream_if->on_new_token( + conn->ifc_enpub->enp_stream_if_ctx, token, token_sz); + return parsed_len; +} + + +static unsigned +process_stream_blocked_frame (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in, const unsigned char *p, size_t len) +{ + struct lsquic_stream *stream; + lsquic_stream_id_t stream_id; + uint64_t peer_off; + int parsed_len; + + parsed_len = conn->ifc_conn.cn_pf->pf_parse_stream_blocked_frame(p, + len, &stream_id, &peer_off); + if (parsed_len < 0) + return 0; + + LSQ_DEBUG("received STREAM_BLOCKED frame: stream %"PRIu64 + "; offset %"PRIu64, stream_id, peer_off); + + if (conn_is_send_only_stream(conn, stream_id)) + { + ABORT_QUIETLY(0, TEC_STREAM_STATE_ERROR, "received BLOCKED frame " + "on send-only stream %"PRIu64, stream_id); + return 0; + } + + stream = find_stream_by_id(conn, stream_id); + if (stream) + lsquic_stream_peer_blocked(stream, peer_off); + else + LSQ_DEBUG("stream %"PRIu64" not found - ignore STREAM_BLOCKED frame", + stream_id); + return parsed_len; +} + + +static unsigned +process_streams_blocked_frame (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in, const unsigned char *p, size_t len) +{ + uint64_t stream_limit; + enum stream_dir sd; + int parsed_len; + + parsed_len = conn->ifc_conn.cn_pf->pf_parse_streams_blocked_frame(p, + len, &sd, &stream_limit); + if (parsed_len < 0) + return 0; + + LSQ_DEBUG("received STREAMS_BLOCKED frame: limited to %"PRIu64 + " %sdirectional stream%.*s", stream_limit, sd == SD_UNI ? "uni" : "bi", + stream_limit != 1, "s"); + /* We don't do anything with this information -- at least for now */ + return parsed_len; +} + + +static unsigned +process_blocked_frame (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in, const unsigned char *p, size_t len) +{ + uint64_t off; + int parsed_len; + + parsed_len = conn->ifc_conn.cn_pf->pf_parse_blocked_frame(p, len, &off); + if (parsed_len < 0) + return 0; + + LSQ_DEBUG("received BLOCKED frame: offset %"PRIu64, off); + /* XXX Try to do something? */ + return parsed_len; +} + + +typedef unsigned (*process_frame_f)( + struct ietf_full_conn *, struct lsquic_packet_in *, + const unsigned char *p, size_t); + + +static process_frame_f const process_frames[N_QUIC_FRAMES] = +{ + [QUIC_FRAME_PADDING] = process_padding_frame, + [QUIC_FRAME_RST_STREAM] = process_rst_stream_frame, + [QUIC_FRAME_CONNECTION_CLOSE] = process_connection_close_frame, + [QUIC_FRAME_MAX_DATA] = process_max_data_frame, + [QUIC_FRAME_MAX_STREAM_DATA] = process_max_stream_data_frame, + [QUIC_FRAME_MAX_STREAMS] = process_max_streams_frame, + [QUIC_FRAME_PING] = process_ping_frame, + [QUIC_FRAME_BLOCKED] = process_blocked_frame, + [QUIC_FRAME_STREAM_BLOCKED] = process_stream_blocked_frame, + [QUIC_FRAME_STREAMS_BLOCKED] = process_streams_blocked_frame, + [QUIC_FRAME_NEW_CONNECTION_ID] = process_new_connection_id_frame, + [QUIC_FRAME_NEW_TOKEN] = process_new_token_frame, + [QUIC_FRAME_STOP_SENDING] = process_stop_sending_frame, + [QUIC_FRAME_ACK] = process_ack_frame, + [QUIC_FRAME_PATH_CHALLENGE] = process_path_challenge_frame, + [QUIC_FRAME_PATH_RESPONSE] = process_path_response_frame, + [QUIC_FRAME_RETIRE_CONNECTION_ID] = process_retire_connection_id_frame, + [QUIC_FRAME_STREAM] = process_stream_frame, + [QUIC_FRAME_CRYPTO] = process_crypto_frame, +}; + + +static unsigned +process_packet_frame (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in, const unsigned char *p, size_t len) +{ + enum enc_level enc_level = lsquic_packet_in_enc_level(packet_in); + enum quic_frame_type type = conn->ifc_conn.cn_pf->pf_parse_frame_type(p[0]); + if (lsquic_legal_frames_by_level[enc_level] & (1 << type)) + { + LSQ_DEBUG("about to process %s frame", frame_type_2_str[type]); + packet_in->pi_frame_types |= 1 << type; + return process_frames[type](conn, packet_in, p, len); + } + else + { + LSQ_DEBUG("invalid frame %u (byte=0x%02X) at encryption level %s", + type, p[0], lsquic_enclev2str[enc_level]); + return 0; + } +} + + +static struct dcid_elem * +find_unassigned_dcid (struct ietf_full_conn *conn) +{ + struct dcid_elem **dce; + + for (dce = conn->ifc_dces; dce < DCES_END(conn); ++dce) + if (*dce && !((*dce)->de_flags & DE_ASSIGNED)) + return *dce; + + return NULL; +} + + +static struct conn_cid_elem * +find_cce_by_cid (struct ietf_full_conn *conn, const lsquic_cid_t *cid) +{ + struct lsquic_conn *const lconn = &conn->ifc_conn; + struct conn_cid_elem *cce; + + for (cce = lconn->cn_cces; cce < END_OF_CCES(lconn); ++cce) + if ((lconn->cn_cces_mask & (1 << (cce - lconn->cn_cces))) + && LSQUIC_CIDS_EQ(&cce->cce_cid, cid)) + return cce; + + return NULL; +} + + +static int +init_new_path (struct ietf_full_conn *conn, struct conn_path *path, + int dcid_changed) +{ + struct dcid_elem *dce; + + dce = find_unassigned_dcid(conn); + if (dce) + { + LSQ_DEBUGC("assigned new DCID %"CID_FMT" to new path %u", + CID_BITS(&dce->de_cid), (unsigned) (path - conn->ifc_paths)); + path->cop_path.np_dcid = dce->de_cid; + dce->de_flags |= DE_ASSIGNED; + } + else if (!dcid_changed) + { + path->cop_path.np_dcid = CUR_NPATH(conn)->np_dcid; + LSQ_DEBUGC("assigned already-used DCID %"CID_FMT" to new path %u, " + "as incoming DCID did not change", + CID_BITS(&path->cop_path.np_dcid), + (unsigned) (path - conn->ifc_paths)); + } + else + { + LSQ_DEBUG("Don't have an unassigned DCID: cannot initialize path"); + return -1; + } + + if (NP_IS_IPv6(&path->cop_path)) + path->cop_path.np_pack_size = IQUIC_MAX_IPv6_PACKET_SZ; + else + path->cop_path.np_pack_size = IQUIC_MAX_IPv4_PACKET_SZ; + + LSQ_DEBUG("initialized path %u", (unsigned) (path - conn->ifc_paths)); + + return 0; +} + + +static void +on_new_or_unconfirmed_path (struct ietf_full_conn *conn, + const struct lsquic_packet_in *packet_in) +{ + struct lsquic_conn *const lconn = &conn->ifc_conn; + struct conn_path *const path = &conn->ifc_paths[packet_in->pi_path_id]; + struct conn_cid_elem *cce; + int dcid_changed; + char cidbuf_[MAX_CID_LEN * 2 + 1]; + + /* An endpoint only changes the address that it sends packets to in + * response to the highest-numbered non-probing packet. This ensures + * that an endpoint does not send packets to an old peer address in the + * case that it receives reordered packets. + * + * [draft-ietf-quic-transport-20], Section 9.3. + */ + if (lsquic_packet_in_non_probing(packet_in) + && packet_in->pi_packno > conn->ifc_max_non_probing) + path->cop_flags |= COP_GOT_NONPROB; + + /* If we cannot find a SCID at this point, something is wrong. */ + cce = find_cce_by_cid(conn, &packet_in->pi_dcid); + if (!cce) + { + ABORT_ERROR("DCID %"CID_FMT" not found on new path", + CID_BITS(&packet_in->pi_dcid)); + return; + } + + dcid_changed = !(cce->cce_flags & CCE_USED); + if (!(path->cop_flags & COP_INITIALIZED)) + { + LSQ_DEBUGC("current SCID: %"CID_FMT, CID_BITS(CN_SCID(&conn->ifc_conn))); + LSQ_DEBUGC("packet in DCID: %"CID_FMT"; changed: %d", + CID_BITS(&packet_in->pi_dcid), dcid_changed); + if (0 == init_new_path(conn, path, dcid_changed)) + path->cop_flags |= COP_INITIALIZED; + else + return; + + conn->ifc_send_flags |= SF_SEND_PATH_CHAL << packet_in->pi_path_id; + LSQ_DEBUG("scheduled return path challenge on path %hhu", + packet_in->pi_path_id); + } + else if ((path->cop_flags & (COP_VALIDATED|COP_GOT_NONPROB)) + == (COP_VALIDATED|COP_GOT_NONPROB)) + { + assert(path->cop_flags & COP_INITIALIZED); + LSQ_DEBUG("received non-probing frame on validated path %hhu, " + "switch to it", packet_in->pi_path_id); + switch_path_to(conn, packet_in->pi_path_id); + } + + path->cop_cce_idx = cce - lconn->cn_cces; + cce->cce_flags |= CCE_USED; +} + + +static void +parse_regular_packet (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in) +{ + const unsigned char *p, *pend; + unsigned len; + + p = packet_in->pi_data + packet_in->pi_header_sz; + pend = packet_in->pi_data + packet_in->pi_data_sz; + + while (p < pend) + { + len = process_packet_frame(conn, packet_in, p, pend - p); + if (len > 0) + p += len; + else + { + ABORT_ERROR("Error parsing frame"); + break; + } + } +} + + +static void +try_queueing_ack (struct ietf_full_conn *conn, enum packnum_space pns, + int was_missing, lsquic_time_t now) +{ + if (conn->ifc_n_slack_akbl[pns] >= MAX_RETR_PACKETS_SINCE_LAST_ACK || + ((conn->ifc_flags & IFC_ACK_HAD_MISS) && was_missing)) + { + lsquic_alarmset_unset(&conn->ifc_alset, AL_ACK_INIT + pns); + lsquic_send_ctl_sanity_check(&conn->ifc_send_ctl); + conn->ifc_flags |= IFC_ACK_QUED_INIT << pns; + LSQ_DEBUG("%s ACK queued: ackable: %u; had_miss: %d; " + "was_missing: %d", + lsquic_pns2str[pns], conn->ifc_n_slack_akbl[pns], + !!(conn->ifc_flags & IFC_ACK_HAD_MISS), was_missing); + } + else if (conn->ifc_n_slack_akbl[pns] > 0) + { +/* [draft-ietf-quic-transport-15] Section-7.16.3: + * + * The receiver's delayed acknowledgment timer SHOULD NOT exceed the + * current RTT estimate or the value it indicates in the "max_ack_delay" + * transport parameter + * + * TODO: Need to do MIN(ACK_TIMEOUT, RTT Estimate) + */ + lsquic_alarmset_set(&conn->ifc_alset, AL_ACK_INIT + pns, + now + ACK_TIMEOUT); + LSQ_DEBUG("%s ACK alarm set to %"PRIu64, lsquic_pns2str[pns], + now + ACK_TIMEOUT); + } +} + + +static int +process_retry_packet (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in) +{ + lsquic_cid_t scid; + int cidlen_diff; + + if (conn->ifc_flags & (IFC_SERVER|IFC_RETRIED)) + { + LSQ_DEBUG("ignore Retry packet"); + return 0; + } + + if (!(CUR_DCID(conn)->len == packet_in->pi_odcid_len + && 0 == memcmp(CUR_DCID(conn)->idbuf, + packet_in->pi_data + packet_in->pi_odcid, + packet_in->pi_odcid_len))) + { + LSQ_DEBUG("retry packet's ODCID does not match the original: ignore"); + return 0; + } + + cidlen_diff = (int) CUR_DCID(conn)->len - (int) packet_in->pi_scid_len; + if (0 != lsquic_send_ctl_retry(&conn->ifc_send_ctl, + packet_in->pi_data + packet_in->pi_token, + packet_in->pi_token_size, cidlen_diff)) + return -1; + + lsquic_scid_from_packet_in(packet_in, &scid); + if (0 != conn->ifc_conn.cn_esf.i->esfi_reset_dcid( + conn->ifc_conn.cn_enc_session, CUR_DCID(conn), &scid)) + return -1; + + *CUR_DCID(conn) = scid; + lsquic_alarmset_unset(&conn->ifc_alset, AL_RETX_INIT); + lsquic_alarmset_unset(&conn->ifc_alset, AL_RETX_HSK); + lsquic_alarmset_unset(&conn->ifc_alset, AL_RETX_APP); + lsquic_alarmset_unset(&conn->ifc_alset, AL_ACK_INIT); + lsquic_alarmset_unset(&conn->ifc_alset, AL_ACK_HSK); + lsquic_alarmset_unset(&conn->ifc_alset, AL_ACK_APP); + + LSQ_INFO("Received a retry packet. Will retry."); + conn->ifc_flags |= IFC_RETRIED; + return 0; +} + + +static int +is_stateless_reset (struct ietf_full_conn *conn, + const struct lsquic_packet_in *packet_in) +{ + struct lsquic_hash_elem *el; + + if (packet_in->pi_data_sz < IQUIC_MIN_SRST_SIZE) + return 0; + + el = lsquic_hash_find(conn->ifc_enpub->enp_srst_hash, + packet_in->pi_data + packet_in->pi_data_sz - IQUIC_SRESET_TOKEN_SZ, + IQUIC_SRESET_TOKEN_SZ); + if (!el) + return 0; + +#ifndef NDEBUG + const struct lsquic_conn *reset_lconn; + reset_lconn = lsquic_hashelem_getdata(el); + assert(reset_lconn == &conn->ifc_conn); +#endif + return 1; +} + + +/* + * Sets the new current SCID if the DCID in the incoming packet: + * (1) was issued by this endpoint and + * (2) has not been used before. + */ +static int +on_dcid_change (struct ietf_full_conn *conn, const lsquic_cid_t *dcid_in) +{ + struct lsquic_conn *const lconn = &conn->ifc_conn; /* Shorthand */ + struct conn_cid_elem *cce; + + LSQ_DEBUG("peer switched its DCID, attempt to switch own SCID"); + + for (cce = lconn->cn_cces; cce < END_OF_CCES(lconn); ++cce) + if (cce - lconn->cn_cces != lconn->cn_cur_cce_idx + && (lconn->cn_cces_mask & (1 << (cce - lconn->cn_cces))) + && LSQUIC_CIDS_EQ(&cce->cce_cid, dcid_in)) + break; + + if (cce >= END_OF_CCES(lconn)) + { + ABORT_WARN("DCID not found"); + return -1; + } + + if (cce->cce_flags & CCE_USED) + { + LSQ_DEBUGC("Current CID: %"CID_FMT, CID_BITS(CN_SCID(lconn))); + LSQ_DEBUGC("DCID %"CID_FMT" has been used, not switching", + CID_BITS(dcid_in)); + return 0; + } + + cce->cce_flags |= CCE_USED; + lconn->cn_cur_cce_idx = cce - lconn->cn_cces; + LSQ_DEBUGC("%s: set SCID to %"CID_FMT, __func__, CID_BITS(CN_SCID(lconn))); + + /* Reset spin bit, see [draft-ietf-quic-transport-20] Section 17.3.1 */ + conn->ifc_spin_bit = 0; + + return 0; +} + + +static void +ignore_init (struct ietf_full_conn *conn) +{ + LSQ_DEBUG("henceforth, no Initial packets shall be sent or received"); + conn->ifc_flags |= IFC_IGNORE_INIT; + conn->ifc_flags &= ~(IFC_ACK_QUED_INIT << PNS_INIT); + lsquic_alarmset_unset(&conn->ifc_alset, AL_ACK_INIT + PNS_INIT); + lsquic_send_ctl_empty_pns(&conn->ifc_send_ctl, PNS_INIT); + lsquic_rechist_cleanup(&conn->ifc_rechist[PNS_INIT]); + if (conn->ifc_crypto_streams[ENC_LEV_CLEAR]) + { + lsquic_stream_destroy(conn->ifc_crypto_streams[ENC_LEV_CLEAR]); + conn->ifc_crypto_streams[ENC_LEV_CLEAR] = NULL; + } +} + + +static void +ignore_hsk (struct ietf_full_conn *conn) +{ + LSQ_DEBUG("henceforth, no Handshake packets shall be sent or received"); + conn->ifc_flags |= IFC_IGNORE_HSK; + conn->ifc_flags &= ~(IFC_ACK_QUED_INIT << PNS_HSK); + lsquic_alarmset_unset(&conn->ifc_alset, AL_ACK_HSK); + lsquic_send_ctl_empty_pns(&conn->ifc_send_ctl, PNS_HSK); + lsquic_rechist_cleanup(&conn->ifc_rechist[PNS_HSK]); + if (conn->ifc_crypto_streams[ENC_LEV_INIT]) + { + lsquic_stream_destroy(conn->ifc_crypto_streams[ENC_LEV_INIT]); + conn->ifc_crypto_streams[ENC_LEV_INIT] = NULL; + } +} + + +/* Returns true if socket addresses are equal, false otherwise. Only + * families, IP addresses, and ports are compared. + */ +static int +sockaddr_eq (const struct sockaddr *a, const struct sockaddr *b) +{ + if (a->sa_family == AF_INET) + return a->sa_family == b->sa_family + && ((struct sockaddr_in *) a)->sin_addr.s_addr + == ((struct sockaddr_in *) b)->sin_addr.s_addr + && ((struct sockaddr_in *) a)->sin_port + == ((struct sockaddr_in *) b)->sin_port; + else + return a->sa_family == b->sa_family + && ((struct sockaddr_in6 *) a)->sin6_port == + ((struct sockaddr_in6 *) b)->sin6_port + && 0 == memcmp(&((struct sockaddr_in6 *) a)->sin6_addr, + &((struct sockaddr_in6 *) b)->sin6_addr, + sizeof(((struct sockaddr_in6 *) b)->sin6_addr)); +} + + +static int +process_regular_packet (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in) +{ + enum packnum_space pns; + enum received_st st; + enum dec_packin dec_packin; + enum quic_ft_bit frame_types; + int was_missing, packno_increased; + unsigned char saved_path_id; + + if (HETY_RETRY == packet_in->pi_header_type) + return process_retry_packet(conn, packet_in); + + pns = lsquic_hety2pns[ packet_in->pi_header_type ]; + if ((pns == PNS_INIT && (conn->ifc_flags & IFC_IGNORE_INIT)) + || (pns == PNS_HSK && (conn->ifc_flags & IFC_IGNORE_HSK))) + { + /* Don't bother decrypting */ + LSQ_DEBUG("ignore %s packet", + pns == PNS_INIT ? "Initial" : "Handshake"); + return 0; + } + + /* If a client receives packets from an unknown server address, the client + * MUST discard these packets. + * [draft-ietf-quic-transport-20], Section 9 + */ + if (packet_in->pi_path_id != conn->ifc_cur_path_id + && 0 == (conn->ifc_flags & IFC_SERVER) + && !(packet_in->pi_path_id == conn->ifc_mig_path_id + && migra_is_on(conn))) + { + /* The "known server address" is recorded in the current path. */ + switch ((NP_IS_IPv6(CUR_NPATH(conn)) << 1) | + NP_IS_IPv6(&conn->ifc_paths[packet_in->pi_path_id].cop_path)) + { + case (1 << 1) | 1: /* IPv6 */ + if (sockaddr_eq(NP_PEER_SA(CUR_NPATH(conn)), NP_PEER_SA( + &conn->ifc_paths[packet_in->pi_path_id].cop_path))) + goto known_peer_addr; + break; + case (0 << 1) | 0: /* IPv4 */ + if (sockaddr_eq(NP_PEER_SA(CUR_NPATH(conn)), NP_PEER_SA( + &conn->ifc_paths[packet_in->pi_path_id].cop_path))) + goto known_peer_addr; + break; + } + LSQ_DEBUG("ignore packet from unknown server address"); + return 0; + } + known_peer_addr: + + /* The packet is decrypted before receive history is updated. This is + * done to make sure that a bad packet won't occupy a slot in receive + * history and subsequent good packet won't be marked as a duplicate. + */ + if (0 == (packet_in->pi_flags & PI_DECRYPTED)) + { + dec_packin = conn->ifc_conn.cn_esf_c->esf_decrypt_packet( + conn->ifc_conn.cn_enc_session, conn->ifc_enpub, + &conn->ifc_conn, packet_in); + switch (dec_packin) + { + case DECPI_BADCRYPT: + if (conn->ifc_enpub->enp_settings.es_honor_prst + /* In server mode, even if we do support stateless reset packets, + * they are handled in lsquic_engine.c. No need to have this + * logic here. + */ + && !(conn->ifc_flags & IFC_SERVER) + && is_stateless_reset(conn, packet_in)) + { + LSQ_INFO("received stateless reset packet: aborting connection"); + conn->ifc_flags |= IFC_GOT_PRST; + return -1; + } + else + { + LSQ_INFO("could not decrypt packet (type %s)", + lsquic_hety2str[packet_in->pi_header_type]); + return 0; + } + case DECPI_NOT_YET: + return 0; + case DECPI_NOMEM: + return 0; + case DECPI_TOO_SHORT: + /* We should not hit this path: packets that are too short should + * not be parsed correctly. + */ + LSQ_INFO("packet is too short to be decrypted"); + return 0; + case DECPI_VIOLATION: + ABORT_QUIETLY(0, TEC_PROTOCOL_VIOLATION, + "decrypter reports protocol violation"); + return -1; + case DECPI_OK: + break; + } + } + + EV_LOG_PACKET_IN(LSQUIC_LOG_CONN_ID, packet_in); + + packno_increased = packet_in->pi_packno + > lsquic_rechist_largest_packno(&conn->ifc_rechist[pns]); + st = lsquic_rechist_received(&conn->ifc_rechist[pns], packet_in->pi_packno, + packet_in->pi_received); + switch (st) { + case REC_ST_OK: + if (!(conn->ifc_flags & ( + IFC_SERVER| + IFC_DCID_SET)) + && (packet_in->pi_scid_len)) + { + conn->ifc_flags |= IFC_DCID_SET; + lsquic_scid_from_packet_in(packet_in, CUR_DCID(conn)); + LSQ_DEBUGC("set DCID to %"CID_FMT, + CID_BITS(CUR_DCID(conn))); + } + saved_path_id = conn->ifc_cur_path_id; + parse_regular_packet(conn, packet_in); + if (saved_path_id == conn->ifc_cur_path_id) + { + if (conn->ifc_cur_path_id != packet_in->pi_path_id) + on_new_or_unconfirmed_path(conn, packet_in); + else if (!LSQUIC_CIDS_EQ(CN_SCID(&conn->ifc_conn), + &packet_in->pi_dcid)) + { + if (0 != on_dcid_change(conn, &packet_in->pi_dcid)) + return -1; + } + } + if (lsquic_packet_in_non_probing(packet_in) + && packet_in->pi_packno > conn->ifc_max_non_probing) + conn->ifc_max_non_probing = packet_in->pi_packno; + if (0 == (conn->ifc_flags & (IFC_ACK_QUED_INIT << pns))) + { + frame_types = packet_in->pi_frame_types; +#if 0 /* TODO */ + if ((conn->fc_flags & FC_GOING_AWAY) + && lsquic_hash_count(conn->fc_pub.all_streams) < 3) + { + /* Ignore PING frames if we are going away and there are no + * active streams. (HANDSHAKE and HEADERS streams are the + * two streams that are always in the all_streams hash). + */ + frame_types &= ~(1 << QUIC_FRAME_PING); + } +#endif + was_missing = packet_in->pi_packno != + lsquic_rechist_largest_packno(&conn->ifc_rechist[pns]); + conn->ifc_n_slack_akbl[pns] + += !!(frame_types & IQUIC_FRAME_ACKABLE_MASK); + try_queueing_ack(conn, pns, was_missing, packet_in->pi_received); + } + conn->ifc_incoming_ecn <<= 1; + conn->ifc_incoming_ecn |= + lsquic_packet_in_ecn(packet_in) != ECN_NOT_ECT; + ++conn->ifc_ecn_counts_in[pns][ lsquic_packet_in_ecn(packet_in) ]; + if (packno_increased && PNS_APP == pns) + { + if (conn->ifc_flags & IFC_SERVER) + conn->ifc_spin_bit = lsquic_packet_in_spin_bit(packet_in); + else + conn->ifc_spin_bit = !lsquic_packet_in_spin_bit(packet_in); + } + return 0; + case REC_ST_DUP: + LSQ_INFO("packet %"PRIu64" is a duplicate", packet_in->pi_packno); + return 0; + default: + assert(0); + /* Fall through */ + case REC_ST_ERR: + LSQ_INFO("error processing packet %"PRIu64, packet_in->pi_packno); + return -1; + } +} + + +static int +verneg_ok (const struct ietf_full_conn *conn) +{ + enum lsquic_version ver; + + ver = highest_bit_set(conn->ifc_enpub->enp_settings.es_versions + & LSQUIC_IETF_VERSIONS); + return (1 << ver) & LSQUIC_IETF_DRAFT_VERSIONS; +} + + +/* This function is used by the client when version negotiation is not yet + * complete. + */ +static int +process_incoming_packet_verneg (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in) +{ + int s; + struct ver_iter vi; + lsquic_ver_tag_t ver_tag; + enum lsquic_version version; + unsigned versions; + + if (lsquic_packet_in_is_verneg(packet_in)) + { + if (!verneg_ok(conn)) + { + ABORT_ERROR("version negotiation not permitted in this version " + "of QUIC"); + return -1; + } + + LSQ_DEBUG("Processing version-negotiation packet"); + + if (conn->ifc_u.cli.ifcli_ver_neg.vn_state != VN_START) + { + LSQ_DEBUG("ignore a likely duplicate version negotiation packet"); + return 0; + } + + if (!(LSQUIC_CIDS_EQ(&conn->ifc_conn.cn_cid, &packet_in->pi_dcid) + && CUR_DCID(conn)->len == packet_in->pi_scid_len + && 0 == memcmp(CUR_DCID(conn)->idbuf, packet_in->pi_data + + packet_in->pi_scid_off, packet_in->pi_scid_len))) + { + LSQ_DEBUG("SCID and DCID in verneg packet don't match what we " + "sent: ignore"); + return 0; + } + + versions = 0; + for (s = packet_in_ver_first(packet_in, &vi, &ver_tag); s; + s = packet_in_ver_next(&vi, &ver_tag)) + { + version = lsquic_tag2ver(ver_tag); + if (version < N_LSQVER) + { + versions |= 1 << version; + LSQ_DEBUG("server supports version %s", lsquic_ver2str[version]); + EV_LOG_VER_NEG(LSQUIC_LOG_CONN_ID, + "supports", lsquic_ver2str[version]); + } + } + + if (versions & (1 << conn->ifc_u.cli.ifcli_ver_neg.vn_ver)) + { + ABORT_ERROR("server replied with version we support: %s", + lsquic_ver2str[conn->ifc_u.cli.ifcli_ver_neg.vn_ver]); + return -1; + } + + versions &= conn->ifc_u.cli.ifcli_ver_neg.vn_supp; + if (0 == versions) + { + ABORT_ERROR("client does not support any of the server-specified " + "versions"); + return -1; + } + + set_versions(conn, versions, NULL); + conn->ifc_u.cli.ifcli_ver_neg.vn_state = VN_IN_PROGRESS; + lsquic_send_ctl_expire_all(&conn->ifc_send_ctl); + return 0; + } + + assert(conn->ifc_u.cli.ifcli_ver_neg.vn_tag); + assert(conn->ifc_u.cli.ifcli_ver_neg.vn_state != VN_END); + conn->ifc_u.cli.ifcli_ver_neg.vn_state = VN_END; + conn->ifc_u.cli.ifcli_ver_neg.vn_tag = NULL; + conn->ifc_conn.cn_version = conn->ifc_u.cli.ifcli_ver_neg.vn_ver; + conn->ifc_conn.cn_flags |= LSCONN_VER_SET; + LSQ_DEBUG("end of version negotiation: agreed upon %s", + lsquic_ver2str[conn->ifc_u.cli.ifcli_ver_neg.vn_ver]); + EV_LOG_VER_NEG(LSQUIC_LOG_CONN_ID, + "agreed", lsquic_ver2str[conn->ifc_u.cli.ifcli_ver_neg.vn_ver]); + conn->ifc_process_incoming_packet = process_incoming_packet_fast; + + return process_regular_packet(conn, packet_in); +} + + +/* This function is used after version negotiation is completed */ +static int +process_incoming_packet_fast (struct ietf_full_conn *conn, + struct lsquic_packet_in *packet_in) +{ + return process_regular_packet(conn, packet_in); +} + + +static void +ietf_full_conn_ci_packet_in (struct lsquic_conn *lconn, + struct lsquic_packet_in *packet_in) +{ + struct ietf_full_conn *conn = (struct ietf_full_conn *) lconn; + + lsquic_alarmset_set(&conn->ifc_alset, AL_IDLE, + packet_in->pi_received + conn->ifc_idle_to); + if (0 == (conn->ifc_flags & IFC_IMMEDIATE_CLOSE_FLAGS)) + if (0 != conn->ifc_process_incoming_packet(conn, packet_in)) + conn->ifc_flags |= IFC_ERROR; +} + + +static void +ietf_full_conn_ci_packet_not_sent (struct lsquic_conn *lconn, + struct lsquic_packet_out *packet_out) +{ + struct ietf_full_conn *conn = (struct ietf_full_conn *) lconn; + lsquic_send_ctl_delayed_one(&conn->ifc_send_ctl, packet_out); +} + + +static void +ietf_full_conn_ci_packet_sent (struct lsquic_conn *lconn, + struct lsquic_packet_out *packet_out) +{ + struct ietf_full_conn *const conn = (struct ietf_full_conn *) lconn; + int s; + + if (packet_out->po_frame_types & IQUIC_FRAME_RETX_MASK) + conn->ifc_n_cons_unretx = 0; + else + ++conn->ifc_n_cons_unretx; + s = lsquic_send_ctl_sent_packet(&conn->ifc_send_ctl, packet_out); + if (s != 0) + ABORT_ERROR("sent packet failed: %s", strerror(errno)); + ++conn->ifc_ecn_counts_out[ lsquic_packet_out_pns(packet_out) ] + [ lsquic_packet_out_ecn(packet_out) ]; + if (0 == (conn->ifc_flags & (IFC_SERVER|IFC_IGNORE_INIT))) + { + if (PNS_HSK == lsquic_packet_out_pns(packet_out)) + ignore_init(conn); + } +} + + +static void (*const send_funcs[N_SEND])( + struct ietf_full_conn *, lsquic_time_t) = +{ + [SEND_NEW_CID] = generate_new_cid_frames, + [SEND_RETIRE_CID] = generate_retire_cid_frames, + [SEND_STREAMS_BLOCKED_UNI] = generate_streams_blocked_uni_frame, + [SEND_STREAMS_BLOCKED_BIDI] = generate_streams_blocked_bidi_frame, + [SEND_MAX_STREAMS_UNI] = generate_max_streams_uni_frame, + [SEND_MAX_STREAMS_BIDI] = generate_max_streams_bidi_frame, + [SEND_STOP_SENDING] = generate_stop_sending_frames, + [SEND_PATH_CHAL_PATH_0] = generate_path_chal_0, + [SEND_PATH_CHAL_PATH_1] = generate_path_chal_1, + [SEND_PATH_RESP_PATH_0] = generate_path_resp_0, + [SEND_PATH_RESP_PATH_1] = generate_path_resp_1, +}; + + +/* List bits that have corresponding entries in send_funcs */ +#define SEND_WITH_FUNCS (SF_SEND_NEW_CID|SF_SEND_RETIRE_CID\ + |SF_SEND_STREAMS_BLOCKED_UNI|SF_SEND_STREAMS_BLOCKED_BIDI\ + |SF_SEND_MAX_STREAMS_UNI|SF_SEND_MAX_STREAMS_BIDI\ + |SF_SEND_PATH_CHAL_PATH_0|SF_SEND_PATH_CHAL_PATH_1\ + |SF_SEND_PATH_RESP_PATH_0|SF_SEND_PATH_RESP_PATH_1\ + |SF_SEND_STOP_SENDING) + +static enum tick_st +ietf_full_conn_ci_tick (struct lsquic_conn *lconn, lsquic_time_t now) +{ + struct ietf_full_conn *conn = (struct ietf_full_conn *) lconn; + const struct lsquic_stream *highest_non_crit; + int have_delayed_packets, s; + enum tick_st tick = 0; + unsigned n; + +#define CLOSE_IF_NECESSARY() do { \ + if (conn->ifc_flags & IFC_IMMEDIATE_CLOSE_FLAGS) \ + { \ + tick |= immediate_close(conn); \ + goto close_end; \ + } \ +} while (0) + +#define RETURN_IF_OUT_OF_PACKETS() do { \ + if (!lsquic_send_ctl_can_send(&conn->ifc_send_ctl)) \ + { \ + if (0 == lsquic_send_ctl_n_scheduled(&conn->ifc_send_ctl)) \ + { \ + LSQ_DEBUG("used up packet allowance, quiet now (line %d)", \ + __LINE__); \ + tick |= TICK_QUIET; \ + } \ + else \ + { \ + LSQ_DEBUG("used up packet allowance, sending now (line %d)",\ + __LINE__); \ + tick |= TICK_SEND; \ + } \ + goto end; \ + } \ +} while (0) + + if (conn->ifc_flags & IFC_HAVE_SAVED_ACK) + { + (void) /* If there is an error, we'll fail shortly */ + process_saved_ack(conn, 0, now); + conn->ifc_flags &= ~IFC_HAVE_SAVED_ACK; + } + + lsquic_send_ctl_tick_in(&conn->ifc_send_ctl, now); + lsquic_send_ctl_set_buffer_stream_packets(&conn->ifc_send_ctl, 1); + CLOSE_IF_NECESSARY(); + + lsquic_alarmset_ring_expired(&conn->ifc_alset, now); + CLOSE_IF_NECESSARY(); + + /* To make things simple, only stream 1 is active until the handshake + * has been completed. This will be adjusted in the future: the client + * does not want to wait if it has the server information. + */ + if (conn->ifc_conn.cn_flags & LSCONN_HANDSHAKE_DONE) + process_streams_read_events(conn); + else + process_crypto_stream_read_events(conn); + CLOSE_IF_NECESSARY(); + + if (lsquic_send_ctl_pacer_blocked(&conn->ifc_send_ctl)) + goto end_write; + + if (conn->ifc_flags & IFC_FIRST_TICK) + { + conn->ifc_flags &= ~IFC_FIRST_TICK; + have_delayed_packets = 0; + } + else + /* If there are any scheduled packets at this point, it means that + * they were not sent during previous tick; in other words, they + * are delayed. When there are delayed packets, the only packet + * we sometimes add is a packet with an ACK frame, and we add it + * to the *front* of the queue. + */ + have_delayed_packets = + lsquic_send_ctl_maybe_squeeze_sched(&conn->ifc_send_ctl); + + if (should_generate_ack(conn)) + { + if (have_delayed_packets) + lsquic_send_ctl_reset_packnos(&conn->ifc_send_ctl); + + /* ACK frame generation fails with an error if it does not fit into + * a single packet (it always should fit). + * XXX Is this still true? + */ + n = generate_ack_frame(conn, now); + CLOSE_IF_NECESSARY(); + + if (have_delayed_packets && n) + lsquic_send_ctl_ack_to_front(&conn->ifc_send_ctl, n); + } + + if (have_delayed_packets) + { + /* The reason for not adding the other frames below to the packet + * carrying ACK frame generated when there are delayed packets is + * so that if the ACK packet itself is delayed, it can be dropped + * and replaced by new ACK packet. This way, we are never more + * than 1 packet over CWND. + */ + tick |= TICK_SEND; + goto end; + } + + /* Try to fit MAX_DATA before checking if we have run out of room. + * If it does not fit, it will be tried next time around. + */ + if (lsquic_cfcw_fc_offsets_changed(&conn->ifc_pub.cfcw) || + (conn->ifc_send_flags & SF_SEND_MAX_DATA)) + { + conn->ifc_send_flags |= SF_SEND_MAX_DATA; + generate_max_data_frame(conn); + CLOSE_IF_NECESSARY(); + } + + if (conn->ifc_send_flags & SEND_WITH_FUNCS) + { + enum send send; + for (send = 0; send < N_SEND; ++send) + if (conn->ifc_send_flags & (1 << send) & SEND_WITH_FUNCS) + { + send_funcs[send](conn, now); + CLOSE_IF_NECESSARY(); + } + } + + n = lsquic_send_ctl_reschedule_packets(&conn->ifc_send_ctl); + if (n > 0) + CLOSE_IF_NECESSARY(); + + if (conn->ifc_conn.cn_flags & LSCONN_SEND_BLOCKED) + { + RETURN_IF_OUT_OF_PACKETS(); + if (generate_blocked_frame(conn)) + conn->ifc_conn.cn_flags &= ~LSCONN_SEND_BLOCKED; + } + + if (!TAILQ_EMPTY(&conn->ifc_pub.sending_streams)) + { + process_streams_ready_to_send(conn); + CLOSE_IF_NECESSARY(); + } + + lsquic_send_ctl_set_buffer_stream_packets(&conn->ifc_send_ctl, 0); + if (!(conn->ifc_conn.cn_flags & LSCONN_HANDSHAKE_DONE)) + { + s = lsquic_send_ctl_schedule_buffered(&conn->ifc_send_ctl, + BPT_HIGHEST_PRIO); + conn->ifc_flags |= (s < 0) << IFC_BIT_ERROR; + if (0 == s) + process_crypto_stream_write_events(conn); + goto end_write; + } + + maybe_conn_flush_special_streams(conn); + + s = lsquic_send_ctl_schedule_buffered(&conn->ifc_send_ctl, BPT_HIGHEST_PRIO); + conn->ifc_flags |= (s < 0) << IFC_BIT_ERROR; + if (!write_is_possible(conn)) + goto end_write; + + if (!TAILQ_EMPTY(&conn->ifc_pub.write_streams)) + { + process_streams_write_events(conn, 1, &highest_non_crit); + if (!write_is_possible(conn)) + goto end_write; + } + + s = lsquic_send_ctl_schedule_buffered(&conn->ifc_send_ctl, BPT_OTHER_PRIO); + conn->ifc_flags |= (s < 0) << IFC_BIT_ERROR; + if (!write_is_possible(conn)) + goto end_write; + + if (!TAILQ_EMPTY(&conn->ifc_pub.write_streams)) + process_streams_write_events(conn, 0, &highest_non_crit); + + end_write: + if ((conn->ifc_flags & IFC_CLOSING) && conn_ok_to_close(conn)) + { + LSQ_DEBUG("connection is OK to close"); + conn->ifc_flags |= IFC_TICK_CLOSE; + if ((conn->ifc_send_flags & SF_SEND_CONN_CLOSE) + /* This is normal termination sequence for the server: + * + * Generate CONNECTION_CLOSE frame if we are responding to one + * or have packets scheduled to send + */ + && (!(conn->ifc_flags & (IFC_SERVER|IFC_HSK_FAILED)) + || (conn->ifc_flags & (IFC_RECV_CLOSE|IFC_GOAWAY_CLOSE)) + || 0 != lsquic_send_ctl_n_scheduled(&conn->ifc_send_ctl)) + ) + { + RETURN_IF_OUT_OF_PACKETS(); + generate_connection_close_packet(conn); + tick |= TICK_SEND|TICK_CLOSE; + } + else + tick |= TICK_CLOSE; + goto end; + } + + if (0 == lsquic_send_ctl_n_scheduled(&conn->ifc_send_ctl)) + { + if (conn->ifc_send_flags & SF_SEND_PING) + { + RETURN_IF_OUT_OF_PACKETS(); + if (0 == generate_ping_frame(conn)) + { + conn->ifc_send_flags &= ~SF_SEND_PING; + CLOSE_IF_NECESSARY(); + assert(lsquic_send_ctl_n_scheduled(&conn->ifc_send_ctl) != 0); + } + } + else + { + tick |= TICK_QUIET; + goto end; + } + } + else if (conn->ifc_ping_period) + { + lsquic_alarmset_unset(&conn->ifc_alset, AL_PING); + lsquic_send_ctl_sanity_check(&conn->ifc_send_ctl); + conn->ifc_send_flags &= ~SF_SEND_PING; /* It may have rung */ + } + + /* [draft-ietf-quic-transport-11] Section 7.9: + * + * The PING frame can be used to keep a connection alive when an + * application or application protocol wishes to prevent the connection + * from timing out. An application protocol SHOULD provide guidance + * about the conditions under which generating a PING is recommended. + * This guidance SHOULD indicate whether it is the client or the server + * that is expected to send the PING. Having both endpoints send PING + * frames without coordination can produce an excessive number of + * packets and poor performance. + */ + if (conn->ifc_ping_period + && lsquic_hash_count(conn->ifc_pub.all_streams) > 0) + lsquic_alarmset_set(&conn->ifc_alset, AL_PING, + now + conn->ifc_ping_period); + + tick |= TICK_SEND; + + end: + service_streams(conn); + CLOSE_IF_NECESSARY(); + + close_end: + lsquic_send_ctl_set_buffer_stream_packets(&conn->ifc_send_ctl, 1); + lsquic_send_ctl_tick_out(&conn->ifc_send_ctl); + return tick; +} + + +static enum LSQUIC_CONN_STATUS +ietf_full_conn_ci_status (struct lsquic_conn *lconn, char *errbuf, size_t bufsz) +{ + struct ietf_full_conn *const conn = (struct ietf_full_conn *) lconn; + size_t n; + + /* Test the common case first: */ + if (!(conn->ifc_flags & (IFC_ERROR + |IFC_TIMED_OUT + |IFC_ABORTED + |IFC_GOT_PRST + |IFC_HSK_FAILED + |IFC_CLOSING + |IFC_GOING_AWAY))) + { + if (lconn->cn_flags & LSCONN_PEER_GOING_AWAY) + return LSCONN_ST_PEER_GOING_AWAY; + else if (lconn->cn_flags & LSCONN_HANDSHAKE_DONE) + return LSCONN_ST_CONNECTED; + else + return LSCONN_ST_HSK_IN_PROGRESS; + } + + if (errbuf && bufsz) + { + if (conn->ifc_errmsg) + { + n = bufsz < MAX_ERRMSG ? bufsz : MAX_ERRMSG; + strncpy(errbuf, conn->ifc_errmsg, n); + errbuf[n - 1] = '\0'; + } + else + errbuf[0] = '\0'; + } + + if (conn->ifc_flags & IFC_ERROR) + return LSCONN_ST_ERROR; + if (conn->ifc_flags & IFC_TIMED_OUT) + return LSCONN_ST_TIMED_OUT; + if (conn->ifc_flags & IFC_ABORTED) + return LSCONN_ST_USER_ABORTED; + if (conn->ifc_flags & IFC_GOT_PRST) + return LSCONN_ST_RESET; + if (conn->ifc_flags & IFC_HSK_FAILED) + return LSCONN_ST_HSK_FAILURE; + if (conn->ifc_flags & IFC_CLOSING) + return LSCONN_ST_CLOSED; + assert(conn->ifc_flags & IFC_GOING_AWAY); + return LSCONN_ST_GOING_AWAY; +} + + +static void +ietf_full_conn_ci_stateless_reset (struct lsquic_conn *lconn) +{ + struct ietf_full_conn *const conn = (struct ietf_full_conn *) lconn; + conn->ifc_flags |= IFC_GOT_PRST; + LSQ_INFO("stateless reset reported"); +} + + +static struct lsquic_conn_ctx * +ietf_full_conn_ci_get_ctx (const struct lsquic_conn *lconn) +{ + struct ietf_full_conn *const conn = (struct ietf_full_conn *) lconn; + return conn->ifc_conn_ctx; +} + + +static struct lsquic_engine * +ietf_full_conn_ci_get_engine (struct lsquic_conn *lconn) +{ + struct ietf_full_conn *conn = (struct ietf_full_conn *) lconn; + return conn->ifc_enpub->enp_engine; +} + + +static void +ietf_full_conn_ci_set_ctx (struct lsquic_conn *lconn, lsquic_conn_ctx_t *ctx) +{ + struct ietf_full_conn *const conn = (struct ietf_full_conn *) lconn; + conn->ifc_conn_ctx = ctx; +} + + +static unsigned +ietf_full_conn_ci_n_pending_streams (const struct lsquic_conn *lconn) +{ + struct ietf_full_conn *const conn = (struct ietf_full_conn *) lconn; + return conn->ifc_n_delayed_streams; +} + + +static unsigned +ietf_full_conn_ci_n_avail_streams (const struct lsquic_conn *lconn) +{ + struct ietf_full_conn *const conn = (struct ietf_full_conn *) lconn; + return avail_streams_count(conn, conn->ifc_flags & IFC_SERVER, SD_BIDI); +} + + +static void +ietf_full_conn_ci_make_stream (struct lsquic_conn *lconn) +{ + struct ietf_full_conn *const conn = (struct ietf_full_conn *) lconn; + + if ((lconn->cn_flags & LSCONN_HANDSHAKE_DONE) + && ietf_full_conn_ci_n_avail_streams(lconn) > 0) + { + if (0 != create_bidi_stream_out(conn)) + ABORT_ERROR("could not create new stream: %s", strerror(errno)); + } + else if (either_side_going_away(conn)) + { + (void) conn->ifc_enpub->enp_stream_if->on_new_stream( + conn->ifc_enpub->enp_stream_if_ctx, NULL); + LSQ_DEBUG("going away: no streams will be initiated"); + } + else + { + ++conn->ifc_n_delayed_streams; + LSQ_DEBUG("delayed stream creation. Backlog size: %u", + conn->ifc_n_delayed_streams); + } +} + + +static void +ietf_full_conn_ci_internal_error (struct lsquic_conn *lconn, + const char *format, ...) +{ + struct ietf_full_conn *const conn = (struct ietf_full_conn *) lconn; + LSQ_INFO("internal error reported"); + ABORT_QUIETLY(0, TEC_INTERNAL_ERROR, "Internal error"); +} + + +static void +ietf_full_conn_ci_abort_error (struct lsquic_conn *lconn, int is_app, + unsigned error_code, const char *fmt, ...) +{ + struct ietf_full_conn *const conn = (struct ietf_full_conn *) lconn; + va_list ap; + const char *err_str, *percent; + char err_buf[0x100]; + + percent = strchr(fmt, '%'); + if (percent) + { + va_start(ap, fmt); + vsnprintf(err_buf, sizeof(err_buf), fmt, ap); + va_end(ap); + err_str = err_buf; + } + else + err_str = fmt; + LSQ_INFO("abort error: is_app: %d; error code: %u; error str: %s", + is_app, error_code, err_str); + ABORT_QUIETLY(is_app, error_code, "%s", err_str); +} + + +static int +path_matches_local_sa (const struct network_path *path, + const struct sockaddr *local_sa) +{ + return sockaddr_eq(NP_LOCAL_SA(path), local_sa); +} + + +static const lsquic_cid_t * +ietf_full_conn_ci_get_log_cid (const struct lsquic_conn *lconn) +{ + struct ietf_full_conn *const conn = (struct ietf_full_conn *) lconn; + + if (lconn->cn_flags & LSCONN_SERVER) + { + if (CUR_DCID(conn)->len) + return CUR_DCID(conn); + else + return CN_SCID(lconn); + } + if (CUR_DCID(conn)->len) + return CN_SCID(lconn); + else + return CUR_DCID(conn); +} + + +static struct network_path * +ietf_full_conn_ci_get_path (struct lsquic_conn *lconn, + const struct sockaddr *sa) +{ + struct ietf_full_conn *const conn = (struct ietf_full_conn *) lconn; + struct conn_path *copath; + + if (NULL == sa || path_matches_local_sa(CUR_NPATH(conn), sa)) + return CUR_NPATH(conn); + + for (copath = conn->ifc_paths; copath < conn->ifc_paths + + sizeof(conn->ifc_paths) / sizeof(conn->ifc_paths[0]); ++copath) + if ((conn->ifc_used_paths & (1 << (copath - conn->ifc_paths))) + && path_matches_local_sa(&copath->cop_path, sa)) + return &copath->cop_path; + + return CUR_NPATH(conn); +} + + +static int +path_matches (const struct network_path *path, + const struct sockaddr *local_sa, const struct sockaddr *peer_sa) +{ + return local_sa->sa_family == NP_LOCAL_SA(path)->sa_family + && sockaddr_eq(local_sa, NP_LOCAL_SA(path)) + && sockaddr_eq(peer_sa, NP_PEER_SA(path)); +} + + +static void +record_to_path (struct network_path *path, void *peer_ctx, + const struct sockaddr *local_sa, const struct sockaddr *peer_sa) +{ + size_t len = local_sa->sa_family == AF_INET ? sizeof(struct sockaddr_in) + : sizeof(struct sockaddr_in6); + memcpy(NP_LOCAL_SA(path), local_sa, len); + len = peer_sa->sa_family == AF_INET ? sizeof(struct sockaddr_in) + : sizeof(struct sockaddr_in6); + memcpy(NP_PEER_SA(path), peer_sa, len); + path->np_peer_ctx = peer_ctx; +} + + +static unsigned char +ietf_full_conn_ci_record_addrs (struct lsquic_conn *lconn, void *peer_ctx, + const struct sockaddr *local_sa, const struct sockaddr *peer_sa) +{ + struct ietf_full_conn *conn = (struct ietf_full_conn *) lconn; + struct network_path *path; + struct conn_path *copath, *first_unused, *first_unvalidated, *first_other, + *victim; + + path = &conn->ifc_paths[conn->ifc_cur_path_id].cop_path; + if (path_matches(path, local_sa, peer_sa)) + { + path->np_peer_ctx = peer_ctx; + return conn->ifc_cur_path_id; + } + + first_unvalidated = NULL; + first_unused = NULL; + first_other = NULL; + for (copath = conn->ifc_paths; copath < conn->ifc_paths + + sizeof(conn->ifc_paths) / sizeof(conn->ifc_paths[0]); ++copath) + { + if (conn->ifc_used_paths & (1 << (copath - conn->ifc_paths))) + { + if (path_matches(&copath->cop_path, local_sa, peer_sa)) + { + copath->cop_path.np_peer_ctx = peer_ctx; + return copath - conn->ifc_paths; + } + if (!first_unvalidated + && (0 == (copath->cop_flags & COP_VALIDATED))) + first_unvalidated = copath; + else if (!first_other) + first_other = copath; + } + else if (!first_unused) + first_unused = copath; + } + + if (first_unused) + { + record_to_path(&first_unused->cop_path, peer_ctx, local_sa, peer_sa); + if (0 == conn->ifc_used_paths && !(conn->ifc_flags & IFC_SERVER)) + /* First path is considered valid immediately */ + first_unused->cop_flags |= COP_VALIDATED; + LSQ_DEBUG("record new path ID %d", + (int) (first_unused - conn->ifc_paths)); + conn->ifc_used_paths |= 1 << (first_unused - conn->ifc_paths); + return first_unused - conn->ifc_paths; + } + + /* XXX TODO Revisit this logic! */ + if (first_unvalidated || first_other) + { + victim = first_unvalidated ? first_unvalidated : first_other; + record_to_path(&first_unvalidated->cop_path, peer_ctx, local_sa, + peer_sa); + return victim - conn->ifc_paths; + } + + return conn->ifc_cur_path_id; +} + + +static const struct conn_iface ietf_full_conn_iface = { + .ci_abort = ietf_full_conn_ci_abort, + .ci_abort_error = ietf_full_conn_ci_abort_error, + .ci_retire_cid = ietf_full_conn_ci_retire_cid, + .ci_can_write_ack = ietf_full_conn_ci_can_write_ack, + .ci_cancel_pending_streams = ietf_full_conn_ci_cancel_pending_streams, + .ci_client_call_on_new = ietf_full_conn_ci_client_call_on_new, + .ci_close = ietf_full_conn_ci_close, + .ci_destroy = ietf_full_conn_ci_destroy, + .ci_drain_time = ietf_full_conn_ci_drain_time, + .ci_get_ctx = ietf_full_conn_ci_get_ctx, + .ci_get_engine = ietf_full_conn_ci_get_engine, + .ci_get_log_cid = ietf_full_conn_ci_get_log_cid, + .ci_get_path = ietf_full_conn_ci_get_path, + .ci_get_stream_by_id = ieft_full_conn_ci_get_stream_by_id, + .ci_going_away = ietf_full_conn_ci_going_away, + .ci_hsk_done = ietf_full_conn_ci_hsk_done, + .ci_internal_error = ietf_full_conn_ci_internal_error, + .ci_is_push_enabled = ietf_full_conn_ci_is_push_enabled, + .ci_is_tickable = ietf_full_conn_ci_is_tickable, + .ci_make_stream = ietf_full_conn_ci_make_stream, + .ci_n_avail_streams = ietf_full_conn_ci_n_avail_streams, + .ci_n_pending_streams = ietf_full_conn_ci_n_pending_streams, + .ci_next_packet_to_send = ietf_full_conn_ci_next_packet_to_send, + .ci_next_tick_time = ietf_full_conn_ci_next_tick_time, + .ci_packet_in = ietf_full_conn_ci_packet_in, + .ci_packet_not_sent = ietf_full_conn_ci_packet_not_sent, + .ci_packet_sent = ietf_full_conn_ci_packet_sent, + .ci_push_stream = ietf_full_conn_ci_push_stream, + .ci_record_addrs = ietf_full_conn_ci_record_addrs, + .ci_report_live = ietf_full_conn_ci_report_live, + .ci_set_ctx = ietf_full_conn_ci_set_ctx, + .ci_status = ietf_full_conn_ci_status, + .ci_stateless_reset = ietf_full_conn_ci_stateless_reset, + .ci_tick = ietf_full_conn_ci_tick, + .ci_tls_alert = ietf_full_conn_ci_tls_alert, + .ci_write_ack = ietf_full_conn_ci_write_ack, +}; + +static const struct conn_iface *ietf_full_conn_iface_ptr = + &ietf_full_conn_iface; + + +static void +on_priority (void *ctx, const struct hq_priority *priority) +{ + struct ietf_full_conn *const conn = ctx; + ABORT_QUIETLY(1, HEC_UNEXPECTED_FRAME, + "server should not send PRIORITY frames"); +} + + +static void +on_priority_server (void *ctx, const struct hq_priority *priority) +{ + struct ietf_full_conn *const conn = ctx; + enum h3_elem_type child_type, parent_type; + int s; + + LSQ_DEBUG("%s: %s #%"PRIu64" depends on %s #%"PRIu64"; " + "weight: %u", __func__, + lsquic_h3pet2str[priority->hqp_prio_type], priority->hqp_prio_id, + lsquic_h3det2str[priority->hqp_dep_type], priority->hqp_dep_id, + HQP_WEIGHT(priority)); + + switch (priority->hqp_dep_type) + { + case H3DET_REQ_STREAM: parent_type = H3ET_REQ_STREAM; break; + case H3DET_PUSH_STREAM: parent_type = H3ET_PUSH_STREAM; break; + case H3DET_PLACEHOLDER: parent_type = H3ET_PLACEHOLDER; break; + default: parent_type = H3ET_ROOT; break; + } + + switch (priority->hqp_prio_type) + { + case H3PET_REQ_STREAM: child_type = H3ET_REQ_STREAM; break; + case H3PET_PUSH_STREAM: child_type = H3ET_PUSH_STREAM; break; + case H3PET_PLACEHOLDER: child_type = H3ET_PLACEHOLDER; break; + default: + ABORT_QUIETLY(1, HEC_MALFORMED_FRAME + HQFT_PRIORITY, + "Priority frame on control stream specified current stream " + "prioritized type"); + return; + } + + s = lsquic_prio_tree_set_rel(conn->ifc_pub.u.ietf.prio_tree, child_type, + priority->hqp_prio_id, priority->hqp_weight, parent_type, + priority->hqp_dep_id); + /* TODO: differentiate between internal and protocol errors -- perhaps + * via a special callback to be called in prio_tree. + */ + if (s != 0) + ABORT_QUIETLY(1, HEC_GENERAL_PROTOCOL_ERROR, "error setting priority"); +} + + +static void +on_cancel_push (void *ctx, uint64_t push_id) +{ + struct ietf_full_conn *const conn = ctx; + LSQ_DEBUG("TODO %s: %"PRIu64, __func__, push_id); + /* TODO */ +} + + +static void +on_max_push_id_client (void *ctx, uint64_t push_id) +{ + struct ietf_full_conn *const conn = ctx; + ABORT_QUIETLY(1, HEC_WRONG_STREAM, "client does not expect the server " + "to send MAX_PUSH_ID frame"); +} + + +static void +on_max_push_id (void *ctx, uint64_t push_id) +{ + struct ietf_full_conn *const conn = ctx; + + if (!(conn->ifc_u.ser.ifser_flags & IFSER_MAX_PUSH_ID) + || push_id > conn->ifc_u.ser.ifser_max_push_id) + { + conn->ifc_u.ser.ifser_max_push_id = push_id; + conn->ifc_u.ser.ifser_flags |= IFSER_MAX_PUSH_ID; + LSQ_DEBUG("set MAX_PUSH_ID to %"PRIu64, push_id); + } + else if (push_id < conn->ifc_u.ser.ifser_max_push_id) + ABORT_QUIETLY(1, HEC_ID_ERROR, "MAX_PUSH_ID reduced from " + "%"PRIu64" to %"PRIu64, conn->ifc_u.ser.ifser_max_push_id, push_id); + else + LSQ_DEBUG("ignore repeated value of MAX_PUSH_ID=%"PRIu64, push_id); +} + + +static void +on_settings_frame (void *ctx) +{ + struct ietf_full_conn *const conn = ctx; + unsigned dyn_table_size, max_risked_streams; + + LSQ_DEBUG("SETTINGS frame"); + if (conn->ifc_flags & IFC_HAVE_PEER_SET) + { + ABORT_WARN("second incoming SETTING frame on HTTP control stream"); + return; + } + + conn->ifc_flags |= IFC_HAVE_PEER_SET; + dyn_table_size = MIN(conn->ifc_settings->es_qpack_enc_max_size, + conn->ifc_peer_hq_settings.header_table_size); + max_risked_streams = MIN(conn->ifc_settings->es_qpack_enc_max_blocked, + conn->ifc_peer_hq_settings.qpack_blocked_streams); + if (0 != lsquic_qeh_settings(&conn->ifc_qeh, + conn->ifc_peer_hq_settings.header_table_size, + dyn_table_size, max_risked_streams, conn->ifc_flags & IFC_SERVER)) + ABORT_WARN("could not initialize QPACK encoder handler"); + if (avail_streams_count(conn, conn->ifc_flags & IFC_SERVER, SD_UNI) > 0) + { + if (0 != create_qenc_stream_out(conn)) + ABORT_WARN("cannot create outgoing QPACK encoder stream"); + } + else + { + queue_streams_blocked_frame(conn, SD_UNI); + LSQ_DEBUG("cannot create QPACK encoder stream due to unidir limit"); + } + maybe_create_delayed_streams(conn); +} + + +static void +on_setting (void *ctx, uint64_t setting_id, uint64_t value) +{ + struct ietf_full_conn *const conn = ctx; + + switch (setting_id) + { + case HQSID_QPACK_BLOCKED_STREAMS: + LSQ_DEBUG("Peer's SETTINGS_QPACK_BLOCKED_STREAMS=%"PRIu64, value); + conn->ifc_peer_hq_settings.qpack_blocked_streams = value; + break; + case HQSID_NUM_PLACEHOLDERS: + LSQ_DEBUG("Peer's SETTINGS_NUM_PLACEHOLDERS=%"PRIu64, value); + if (conn->ifc_flags & IFC_SERVER) + ABORT_QUIETLY(0, TEC_PROTOCOL_VIOLATION, + "HTTP_WRONG_SETTING_DIRECTION"); + else + { + conn->ifc_peer_hq_settings.num_placeholders + = MIN(value, conn->ifc_settings->es_h3_placeholders); + lsquic_prio_tree_set_ph(conn->ifc_pub.u.ietf.prio_tree, + conn->ifc_peer_hq_settings.num_placeholders); + } + break; + case HQSID_QPACK_MAX_TABLE_CAPACITY: + LSQ_DEBUG("Peer's SETTINGS_QPACK_MAX_TABLE_CAPACITY=%"PRIu64, value); + conn->ifc_peer_hq_settings.header_table_size = value; + break; + case HQSID_MAX_HEADER_LIST_SIZE: + LSQ_DEBUG("Peer's SETTINGS_MAX_HEADER_LIST_SIZE=%"PRIu64, value); + conn->ifc_peer_hq_settings.max_header_list_size = value; + /* TODO: apply it */ + break; + default: + LSQ_DEBUG("received unknown SETTING 0x%"PRIX64"=0x%"PRIX64 + "; ignore it", setting_id, value); + break; + } +} + + +static void +on_goaway_server (void *ctx, uint64_t stream_id) +{ + struct ietf_full_conn *const conn = ctx; + ABORT_QUIETLY(1, HEC_UNEXPECTED_FRAME, + "client should not send GOAWAY frames"); +} + + +static void +on_goaway (void *ctx, uint64_t stream_id) +{ + struct ietf_full_conn *const conn = ctx; + struct lsquic_stream *stream; + struct lsquic_hash_elem *el; + enum stream_id_type sit; + + sit = stream_id & SIT_MASK; + if (sit != SIT_BIDI_CLIENT) + { + ABORT_QUIETLY(1, HEC_MALFORMED_FRAME, + "stream ID %"PRIu64" in GOAWAY frame", stream_id); + return; + } + + if (conn->ifc_conn.cn_flags & LSCONN_PEER_GOING_AWAY) + { + LSQ_DEBUG("ignore duplicate GOAWAY frame"); + return; + } + + conn->ifc_conn.cn_flags |= LSCONN_PEER_GOING_AWAY; + LSQ_DEBUG("received GOAWAY frame, last good stream ID: %"PRIu64, stream_id); + if (conn->ifc_enpub->enp_stream_if->on_goaway_received) + conn->ifc_enpub->enp_stream_if->on_goaway_received(&conn->ifc_conn); + + for (el = lsquic_hash_first(conn->ifc_pub.all_streams); el; + el = lsquic_hash_next(conn->ifc_pub.all_streams)) + { + stream = lsquic_hashelem_getdata(el); + if (stream->id >= stream_id + && (stream->id & SIT_MASK) == SIT_BIDI_CLIENT) + { + lsquic_stream_received_goaway(stream); + } + } +} + + +static void +on_unexpected_frame (void *ctx, uint64_t frame_type) +{ + struct ietf_full_conn *const conn = ctx; + ABORT_QUIETLY(1, HEC_WRONG_STREAM, "Frame type %"PRIu64" is not allowed " + "on the control stream", frame_type); +} + + +static const struct hcsi_callbacks hcsi_callbacks_server = +{ + .on_priority = on_priority_server, + .on_cancel_push = on_cancel_push, + .on_max_push_id = on_max_push_id, + .on_settings_frame = on_settings_frame, + .on_setting = on_setting, + .on_goaway = on_goaway_server, + .on_unexpected_frame = on_unexpected_frame, +}; + +static const struct hcsi_callbacks hcsi_callbacks = +{ + .on_priority = on_priority, + .on_cancel_push = on_cancel_push, + .on_max_push_id = on_max_push_id_client, + .on_settings_frame = on_settings_frame, + .on_setting = on_setting, + .on_goaway = on_goaway, + .on_unexpected_frame = on_unexpected_frame, +}; + + +static lsquic_stream_ctx_t * +hcsi_on_new (void *stream_if_ctx, struct lsquic_stream *stream) +{ + struct ietf_full_conn *const conn = (void *) stream_if_ctx; + conn->ifc_stream_hcsi = stream; + lsquic_hcsi_reader_init(&conn->ifc_hcsi.reader, &conn->ifc_conn, + conn->ifc_flags & IFC_SERVER ? &hcsi_callbacks_server : &hcsi_callbacks, + conn); + lsquic_stream_wantread(stream, 1); + return stream_if_ctx; +} + + +struct feed_hcsi_ctx +{ + struct ietf_full_conn *conn; + int s; +}; + + +static size_t +feed_hcsi_reader (void *ctx, const unsigned char *buf, size_t bufsz, int fin) +{ + struct feed_hcsi_ctx *feed_ctx = ctx; + struct ietf_full_conn *conn = feed_ctx->conn; + + feed_ctx->s = lsquic_hcsi_reader_feed(&conn->ifc_hcsi.reader, buf, bufsz); + return bufsz; +} + + +static void +hcsi_on_read (struct lsquic_stream *stream, lsquic_stream_ctx_t *ctx) +{ + struct ietf_full_conn *const conn = (void *) ctx; + struct lsquic_conn *const lconn = &conn->ifc_conn; + struct feed_hcsi_ctx feed_ctx = { conn, 0, }; + ssize_t nread; + + nread = lsquic_stream_readf(stream, feed_hcsi_reader, &feed_ctx); + LSQ_DEBUG("fed %zd bytes to HTTP control stream reader, status=%d", + nread, feed_ctx.s); + if (nread < 0) + { + lsquic_stream_wantread(stream, 0); + ABORT_WARN("error reading from HTTP control stream"); + } + else if (nread == 0) + { + lsquic_stream_wantread(stream, 0); + LSQ_INFO("control stream closed by peer: abort connection"); + lconn->cn_if->ci_abort_error(lconn, 1, + HEC_CLOSED_CRITICAL_STREAM, "control stream closed"); + } + else if (feed_ctx.s != 0) + { + lsquic_stream_wantread(stream, 0); + ABORT_WARN("error processing HTTP control stream"); + } +} + + +static void +hcsi_on_write (struct lsquic_stream *stream, lsquic_stream_ctx_t *ctx) +{ + assert(0); +} + + +static void +hcsi_on_close (struct lsquic_stream *stream, lsquic_stream_ctx_t *ctx) +{ + struct ietf_full_conn *const conn = (void *) ctx; + conn->ifc_stream_hcsi = NULL; +} + + +static const struct lsquic_stream_if hcsi_if = +{ + .on_new_stream = hcsi_on_new, + .on_read = hcsi_on_read, + .on_write = hcsi_on_write, + .on_close = hcsi_on_close, +}; + + +static void +apply_uni_stream_class (struct ietf_full_conn *conn, + struct lsquic_stream *stream, uint64_t stream_type) +{ + switch (stream_type) + { + case HQUST_CONTROL: + if (!conn->ifc_stream_hcsi) + { + LSQ_DEBUG("Incoming HTTP control stream ID: %"PRIu64, + stream->id); + lsquic_stream_set_stream_if(stream, &hcsi_if, conn); + } + else + { + ABORT_QUIETLY(1, HEC_STREAM_CREATION_ERROR, + "Control stream %"PRIu64" already exists: cannot create " + "second control stream %"PRIu64, conn->ifc_stream_hcsi->id, + stream->id); + lsquic_stream_close(stream); + } + break; + case HQUST_QPACK_ENC: + if (!lsquic_qdh_has_enc_stream(&conn->ifc_qdh)) + { + LSQ_DEBUG("Incoming QPACK encoder stream ID: %"PRIu64, + stream->id); + lsquic_stream_set_stream_if(stream, lsquic_qdh_enc_sm_in_if, + &conn->ifc_qdh); + } + else + { + ABORT_WARN("Incoming QPACK encoder stream already exists"); + /* TODO: special error code? */ + lsquic_stream_close(stream); + } + break; + case HQUST_QPACK_DEC: + if (!lsquic_qeh_has_dec_stream(&conn->ifc_qeh)) + { + LSQ_DEBUG("Incoming QPACK decoder stream ID: %"PRIu64, + stream->id); + lsquic_stream_set_stream_if(stream, lsquic_qeh_dec_sm_in_if, + &conn->ifc_qeh); + } + else + { + ABORT_WARN("Incoming QPACK decoder stream already exists"); + /* TODO: special error code? */ + lsquic_stream_close(stream); + } + break; + case HQUST_PUSH: + if (conn->ifc_flags & IFC_SERVER) + { + ABORT_QUIETLY(1, HEC_STREAM_CREATION_ERROR, + "clients can't open push streams"); + } + else + { + LSQ_DEBUG("Refuse push stream %"PRIu64, stream->id); + maybe_schedule_ss_for_stream(conn, stream->id, + HEC_REQUEST_CANCELLED); + } + if (stream->sm_hash_el.qhe_flags & QHE_HASHED) + lsquic_hash_erase(conn->ifc_pub.all_streams, &stream->sm_hash_el); + assert((stream->sm_qflags & SMQF_WANT_READ) == SMQF_WANT_READ); + lsquic_stream_destroy(stream); + break; + default: + LSQ_DEBUG("unknown unidirectional stream %"PRIu64 " of type %"PRIu64 + ", will send STOP_SENDING and close", stream->id, stream_type); + /* XXX This approach may be risky, as it assumes that the peer updates + * its flow control window correctly. The safe way to do it is to + * create a stream and wait for RESET_STREAM frame. This is not an + * issue in the normal case, as the server does not allow the peer to + * create more than 3 unidirectional streams. + */ + maybe_schedule_ss_for_stream(conn, stream->id, + HEC_STREAM_CREATION_ERROR); + if (stream->sm_hash_el.qhe_flags & QHE_HASHED) + lsquic_hash_erase(conn->ifc_pub.all_streams, &stream->sm_hash_el); + assert((stream->sm_qflags & SMQF_WANT_READ) == SMQF_WANT_READ); + lsquic_stream_destroy(stream); + break; + } +} + + +static lsquic_stream_ctx_t * +unicla_on_new (void *stream_if_ctx, struct lsquic_stream *stream) +{ + lsquic_stream_wantread(stream, 1); + stream->sm_uni_type_state.pos = 0; + return stream_if_ctx; +} + + +struct unicla_ctx +{ + struct varint_read_state *state; + enum { UC_MORE, UC_ERROR, UC_DONE, } status; +}; + + +static const char *const unicla_stat2str[] = { + [UC_ERROR] = "UC_ERROR", [UC_MORE] = "UC_MORE", [UC_DONE] = "UC_DONE", +}; + + +static size_t +unicla_readf (void *ctx, const unsigned char *begin, size_t sz, int fin) +{ + struct unicla_ctx *const unicla_ctx = ctx; + const unsigned char *buf = begin; + int s; + + switch (unicla_ctx->status) + { + case UC_MORE: + s = lsquic_varint_read_nb(&buf, begin + sz, unicla_ctx->state); + if (s == 0) + unicla_ctx->status = UC_DONE; + else if (fin) + unicla_ctx->status = UC_ERROR; + return buf - begin; + case UC_DONE: + return 0; + default: + return sz; + } +} + + +static void +unicla_on_read (struct lsquic_stream *stream, lsquic_stream_ctx_t *ctx) +{ + struct ietf_full_conn *const conn = (void *) ctx; + struct unicla_ctx unicla_ctx = { .state = &stream->sm_uni_type_state, + .status = UC_MORE, }; + ssize_t nr; + + nr = lsquic_stream_readf(stream, unicla_readf, &unicla_ctx); + LSQ_DEBUG("unistream classifier read %zd byte%.*s, status: %s", nr, + nr != 1, "s", unicla_stat2str[unicla_ctx.status]); + if (nr > 0) + { + if (unicla_ctx.status == UC_DONE) + apply_uni_stream_class(conn, stream, unicla_ctx.state->val); + else if (unicla_ctx.status == UC_ERROR) + goto unexpected_fin; + /* else: do nothing */ + } + else if (nr < 0) /* This should never happen */ + { + LSQ_WARN("unicla: cannot read from stream %"PRIu64, stream->id); + lsquic_stream_close(stream); + } + else + { + unexpected_fin: + LSQ_INFO("unicla: unexpected FIN while reading stream type from " + "stream %"PRIu64, stream->id); + lsquic_stream_close(stream); + } +} + + +static void +unicla_on_write (struct lsquic_stream *stream, lsquic_stream_ctx_t *ctx) +{ + assert(0); +} + + +static void +unicla_on_close (struct lsquic_stream *stream, lsquic_stream_ctx_t *ctx) +{ +} + + +static const struct lsquic_stream_if unicla_if = +{ + .on_new_stream = unicla_on_new, + .on_read = unicla_on_read, + .on_write = unicla_on_write, + .on_close = unicla_on_close, +}; + + +static const struct lsquic_stream_if *unicla_if_ptr = &unicla_if; + +typedef char dcid_elem_fits_in_128_bytes[(sizeof(struct dcid_elem) <= 128) - 1]; diff --git a/src/liblsquic/lsquic_global.c b/src/liblsquic/lsquic_global.c index 0903d41fa..c321c52f8 100644 --- a/src/liblsquic/lsquic_global.c +++ b/src/liblsquic/lsquic_global.c @@ -7,7 +7,7 @@ #include "lsquic_types.h" #include "lsquic.h" #include "lsquic_str.h" -#include "lsquic_handshake.h" +#include "lsquic_enc_sess.h" #include "lsquic_util.h" @@ -15,12 +15,17 @@ int lsquic_global_init (int flags) { lsquic_init_timers(); - return lsquic_enc_session_gquic_1.esf_global_init(flags); + if (0 != lsquic_enc_session_common_gquic_1.esf_global_init(flags)) + return -1; + if (0 != lsquic_enc_session_common_ietf_v1.esf_global_init(flags)) + return -1; + return 0; } void lsquic_global_cleanup (void) { - lsquic_enc_session_gquic_1.esf_global_cleanup(); + lsquic_enc_session_common_gquic_1.esf_global_cleanup(); + lsquic_enc_session_common_ietf_v1.esf_global_cleanup(); } diff --git a/src/liblsquic/lsquic_h3_prio.c b/src/liblsquic/lsquic_h3_prio.c new file mode 100644 index 000000000..9bc532153 --- /dev/null +++ b/src/liblsquic/lsquic_h3_prio.c @@ -0,0 +1,854 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#include +#include +#include +#include +#include +#include + +#include "lsquic_types.h" +#include "lsquic_int_types.h" +#include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" +#include "lsquic_stream.h" +#include "lsquic_h3_prio.h" + +#define LSQUIC_LOGGER_MODULE LSQLM_PRIO +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(tree->h3pt_conn) +#include "lsquic_logger.h" + +/* The tree supports up to 2^16 - 1 elements, which should suffice. + * Zero is not a valid value (thus -1 elements). + */ +typedef unsigned short elem_idx_t; + +/* Because stream IDs are 62-bit integers and we the HTTP/3 element type + * only has four values (enum h3_elem_type), we can combine the two into + * a single value. h3_id_t's lower 62 bits contain the ID, while the + * high 2 bits contain element type. This makes searching faster. + */ +typedef uint64_t h3_id_t; + +typedef unsigned char active_mark_t; + +#define H3_EL_ID(type, id) ((((uint64_t) (type)) << 62) | id) + +#define ROOT_IDX 1 + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) + +struct h3_prio_elem +{ + h3_id_t h3pe_id; + struct lsquic_stream *h3pe_stream; + + /* Time at which stream was closed: */ + lsquic_time_t h3pe_closed_at; + + /* Tree neighbors: */ + elem_idx_t h3pe_parent, + h3pe_first_child, + h3pe_left, + h3pe_right; + + /* Closed streams are kept on a separate queue for efficient pruning: */ + elem_idx_t h3pe_next_closed; + + /* Used as tiebreaker between elements with the same weight: streams + * added earlier to the iterator have higher priority. + */ + elem_idx_t h3pe_iter_order; +#define h3pe_taken h3pe_iter_order + + enum { + H3PE_FLAG_CLOSED = 1 << 0, + } h3pe_flags:8; + h3_weight_t h3pe_weight; + + /* These marks are part of the iterator state */ + active_mark_t h3pe_active_self; + active_mark_t h3pe_active_path; +}; + +#define EL_TYPE(el) ((enum h3_elem_type)((el)->h3pe_id >> 62)) +#define EL_ID(el) ((uint64_t)((el)->h3pe_id & ((1ull << 62) - 1))) + +#define CALC_EL_IDX(tree, el) (+((el) - (tree)->h3pt_els)) + +/* The weight and the iterator order are combined into a single value to + * reduce the number of branches. + */ +typedef uint32_t iter_prio_t; +#define EL_ITER_PRIO(el) (((uint32_t) ((el)->h3pe_weight << 16)) | \ + (el)->h3pe_iter_order) +#define MAX_ITER_PRIO ((1u << 24) - 1) + +#define MAX_CRIT_STREAMS (4 /* crypto streams */ \ + + 3 /* outgoing control, encoder, and decoder */ \ + + 3 /* incoming control, encoder, and decoder */) + +struct h3_iter +{ + const char *h3it_log_id; + elem_idx_t h3it_cursor; + elem_idx_t h3it_count; + active_mark_t h3it_active; + + /* Critical streams do not participate in the regular HTTP/3 priority + * mechanism. They have an implicit priority which is higher than + * that of the regular request or push streams. The iterator holds + * references to them only for the duration of the iteration. + */ + unsigned h3it_crit_off; + unsigned h3it_crit_count; + struct lsquic_stream *h3it_crit_streams[MAX_CRIT_STREAMS]; +}; + +struct h3_prio_tree +{ + const struct lsquic_conn *h3pt_conn; /* Used for logging */ + + /* Element 0 does not contain a valid value. Its only use is to store + * the linear search sentinel. + */ + struct h3_prio_elem *h3pt_els; + + struct h3_iter h3pt_iter; + + unsigned h3pt_nalloc; /* Including element 0 */ + unsigned h3pt_nelem; /* Including element 0 */ + unsigned h3pt_max_ph; /* Maximum placeholder ID */ + + /* STAILQ analog: first element is the oldest, newly closed stream + * elements are inserted at the end. + */ + elem_idx_t h3pt_closed_first, + h3pt_closed_last; +}; + + +struct h3_prio_tree * +lsquic_prio_tree_new (const struct lsquic_conn *conn, unsigned n_placeholders) +{ + struct h3_prio_tree *tree; + struct h3_prio_elem *els; + unsigned nalloc, nelem; + + tree = calloc(1, sizeof(*tree)); + if (!tree) + return NULL; + + nelem = 1 /* element 0 */ + 1 /* root */; + nalloc = nelem + 4; + els = malloc(nalloc * sizeof(els[0])); + if (!els) + { + free(tree); + return NULL; + } + + els[ROOT_IDX] = (struct h3_prio_elem) { .h3pe_id = H3_EL_ID(H3ET_ROOT, 0) }; + + tree->h3pt_conn = conn; + tree->h3pt_els = els; + tree->h3pt_nalloc = nalloc; + tree->h3pt_nelem = nelem; + tree->h3pt_max_ph = n_placeholders; + LSQ_DEBUG("create tree with maximum %u placeholders", n_placeholders); + return tree; +} + + +static struct h3_prio_elem * +prio_tree_find_by_h3_id (struct h3_prio_tree *tree, h3_id_t h3_id) +{ + struct h3_prio_elem *el; + + tree->h3pt_els[0].h3pe_id = h3_id; + for (el = &tree->h3pt_els[tree->h3pt_nelem - 1]; el->h3pe_id != h3_id; --el) + ; + + if (el > tree->h3pt_els) + return el; + else + return NULL; +} + + +static struct h3_prio_elem * +prio_tree_find (struct h3_prio_tree *tree, enum h3_elem_type type, uint64_t id) +{ + if (type == H3ET_ROOT) + return &tree->h3pt_els[ROOT_IDX]; + else + return prio_tree_find_by_h3_id(tree, H3_EL_ID(type, id)); +} + + +static struct h3_prio_elem * +prio_tree_alloc_elem (struct h3_prio_tree *tree) +{ + struct h3_prio_elem *els; + unsigned nalloc; + + if (tree->h3pt_nalloc > tree->h3pt_nelem) + return &tree->h3pt_els[ tree->h3pt_nelem++ ]; + + nalloc = MIN(H3_PRIO_MAX_ELEMS + 1, tree->h3pt_nalloc * 2); + if (nalloc <= tree->h3pt_nelem) + { + LSQ_ERROR("number of elements reached maximum"); + return NULL; + } + + els = realloc(tree->h3pt_els, nalloc * sizeof(tree->h3pt_els[0])); + if (!els) + { + LSQ_WARN("memory allocation failure"); + return NULL; + } + + tree->h3pt_els = els; + tree->h3pt_nalloc = nalloc; + return &tree->h3pt_els[ tree->h3pt_nelem++ ]; +} + + +static struct h3_prio_elem * +prio_tree_create_elem (struct h3_prio_tree *tree, enum h3_elem_type type, + uint64_t id) +{ + struct h3_prio_elem *el, *root; + + assert(type != H3ET_ROOT); + if (type == H3ET_PLACEHOLDER && id >= tree->h3pt_max_ph) + { + LSQ_INFO("invalid placeholder id %"PRIu64" is invalid (maximum " + "is %u placeholders", id, tree->h3pt_max_ph); + return NULL; + } + + el = prio_tree_alloc_elem(tree); + if (el) + { + root = &tree->h3pt_els[ROOT_IDX]; + *el = (struct h3_prio_elem) { .h3pe_id = H3_EL_ID(type, id), + .h3pe_parent = ROOT_IDX, + .h3pe_right = root->h3pe_first_child, + .h3pe_weight = H3_DEFAULT_WEIGHT, }; + if (root->h3pe_first_child) + tree->h3pt_els[ root->h3pe_first_child ].h3pe_left + = el - tree->h3pt_els; + root->h3pe_first_child = el - tree->h3pt_els; + } + + return el; +} + + +static void +prio_tree_reparent (struct h3_prio_tree *tree, + struct h3_prio_elem *const child, + struct h3_prio_elem *const parent) +{ + struct h3_prio_elem *orig_parent; + elem_idx_t child_idx; + + child_idx = CALC_EL_IDX(tree, child); + orig_parent = &tree->h3pt_els[child->h3pe_parent]; + + if (orig_parent->h3pe_first_child == child_idx) + orig_parent->h3pe_first_child = child->h3pe_right; + else + tree->h3pt_els[child->h3pe_left].h3pe_right = child->h3pe_right; + if (child->h3pe_right) + tree->h3pt_els[child->h3pe_right].h3pe_left = child->h3pe_left; + + child->h3pe_left = 0; + child->h3pe_right = parent->h3pe_first_child; + if (child->h3pe_right) + tree->h3pt_els[child->h3pe_right].h3pe_left = child_idx; + parent->h3pe_first_child = child_idx; + child->h3pe_parent = CALC_EL_IDX(tree, parent); +} + + +static int +prio_tree_is_parent (struct h3_prio_tree *tree, + const struct h3_prio_elem *parent, const struct h3_prio_elem *child) +{ + elem_idx_t idx; + + assert(parent != child); + tree->h3pt_els[0].h3pe_id = parent->h3pe_id; + idx = child->h3pe_parent; + while (tree->h3pt_els[idx].h3pe_id != parent->h3pe_id) + idx = tree->h3pt_els[idx].h3pe_parent; + return idx > 0; +} + + +static const char el_type2char[] = +{ + [H3ET_ROOT] = 'R', + [H3ET_REQ_STREAM] = 'Q', + [H3ET_PUSH_STREAM] = 'P', + [H3ET_PLACEHOLDER] = 'H', +}; + + +int +lsquic_prio_tree_set_rel (struct h3_prio_tree *tree, + enum h3_elem_type child_type, uint64_t child_id, h3_weight_t child_weight, + enum h3_elem_type parent_type, uint64_t parent_id) +{ + struct h3_prio_elem *parent, *child; + + parent = prio_tree_find(tree, parent_type, parent_id); + if (!parent) + { + parent = prio_tree_create_elem(tree, parent_type, parent_id); + if (!parent) + return -1; + } + const elem_idx_t parent_idx = CALC_EL_IDX(tree, parent); + + child = prio_tree_find(tree, child_type, child_id); + if (!child) + { + child = prio_tree_create_elem(tree, child_type, child_id); + if (!child) + return -1; + /* create() above may have realloced */ + parent = &tree->h3pt_els[ parent_idx ]; + } + + if (child->h3pe_parent != parent_idx) + { + if (prio_tree_is_parent(tree, child, parent)) + prio_tree_reparent(tree, parent, + &tree->h3pt_els[child->h3pe_parent]); + prio_tree_reparent(tree, child, parent); + } + else if (child == parent) + return -1; /* This is unlikely, so check for it last */ + + child->h3pe_weight = child_weight; + + LSQ_DEBUG("add rel to %c:%"PRIu64" -> %c:%"PRIu64" with w=%u", + el_type2char[ child_type ], child_id, + el_type2char[ parent_type ], parent_id, child_weight); + + return 0; +} + + +/* Assume that unidirectional streams are push streams */ +static enum h3_elem_type +stream_id_2_elem_type (lsquic_stream_id_t stream_id) +{ + enum stream_dir dir; + + dir = 1 & (stream_id >> SD_SHIFT); + if (dir == SD_BIDI) + return H3ET_REQ_STREAM; + else + return H3ET_PUSH_STREAM; +} + + +int +lsquic_prio_tree_add_stream (struct h3_prio_tree *tree, + struct lsquic_stream *stream, enum h3_elem_type parent_type, + uint64_t parent_id, h3_weight_t weight) +{ + struct h3_prio_elem *parent, *child; + enum h3_elem_type type; + elem_idx_t child_idx; + + assert(!lsquic_stream_is_critical(stream)); + + type = stream_id_2_elem_type(stream->id); + child = prio_tree_find(tree, type, stream->id); + if (child) + { + /* Prioritization information already exists: set the pointer + * and ignore PRIORITY frame information on the request stream. + */ + if (!child->h3pe_stream) + { + child_idx = CALC_EL_IDX(tree, child); + LSQ_DEBUG("reference stream %c:%"PRIu64" in prio element", + el_type2char[ type ], stream->id); + goto link; + } + LSQ_WARN("stream %"PRIu64" is already referenced", stream->id); + return -1; + } + + child = prio_tree_create_elem(tree, type, stream->id); + if (!child) + return -1; + child_idx = CALC_EL_IDX(tree, child); + + parent = prio_tree_find(tree, parent_type, parent_id); + if (!parent) + { + parent = prio_tree_create_elem(tree, parent_type, parent_id); + if (!parent) + return -1; + /* create() above may have realloced */ + child = &tree->h3pt_els[ child_idx ]; + } + + prio_tree_reparent(tree, child, parent); + child->h3pe_weight = weight; + LSQ_DEBUG("add stream %c:%"PRIu64" -> %c:%"PRIu64" with w=%u", + el_type2char[ type ], stream->id, + el_type2char[ parent_type ], parent_id, weight); + link: + child->h3pe_stream = stream; + stream->sm_h3_prio_idx = child_idx; + return 0; +} + + +int +lsquic_prio_tree_remove_stream (struct h3_prio_tree *tree, + struct lsquic_stream *stream, lsquic_time_t now) +{ + struct h3_prio_elem *el; + + el = &tree->h3pt_els[ stream->sm_h3_prio_idx ]; + + if (stream->sm_h3_prio_idx > 0 + && stream->sm_h3_prio_idx < tree->h3pt_nelem + && el->h3pe_stream == stream + && !(el->h3pe_flags & H3PE_FLAG_CLOSED)) + { + assert(el->h3pe_stream == stream); + if (tree->h3pt_closed_first) + { + tree->h3pt_els[ tree->h3pt_closed_last ].h3pe_next_closed + = stream->sm_h3_prio_idx; + tree->h3pt_closed_last = stream->sm_h3_prio_idx; + } + else + { + tree->h3pt_closed_first = stream->sm_h3_prio_idx; + tree->h3pt_closed_last = stream->sm_h3_prio_idx; + } + el->h3pe_stream = NULL; + el->h3pe_closed_at = now; + el->h3pe_flags |= H3PE_FLAG_CLOSED; + stream->sm_h3_prio_idx = 0; + LSQ_DEBUG("removed reference to stream %"PRIu64, stream->id); + return 0; + } + else + { + LSQ_WARN("cannot remove stream %"PRIu64, stream->id); + return -1; + } +} + + +void +lsquic_prio_tree_drop_el (struct h3_prio_tree *tree, struct h3_prio_elem *el) +{ + const elem_idx_t + right = el->h3pe_right, + left = el->h3pe_left, + parent = el->h3pe_parent, + el_idx = CALC_EL_IDX(tree, el); + elem_idx_t idx, last; + + /* Update links around the element: */ + idx = el->h3pe_first_child; + if (idx == 0) + { + if (left) + tree->h3pt_els[ left ].h3pe_right = right; + else + tree->h3pt_els[ parent ].h3pe_first_child = right; + + if (right) + tree->h3pt_els[ right ].h3pe_left = left; + } + else + { + if (left) + { + tree->h3pt_els[ left ].h3pe_right = idx; + tree->h3pt_els[ idx ].h3pe_left = left; + } + else + tree->h3pt_els[ parent ].h3pe_first_child = idx; + + do + { + last = idx; + tree->h3pt_els[ idx ].h3pe_parent = parent; + idx = tree->h3pt_els[ idx ].h3pe_right; + } + while (idx); + + if (right) + { + tree->h3pt_els[ right ].h3pe_left = last; + tree->h3pt_els[ last ].h3pe_right = right; + } + } + + /* Move last element into its spot */ + if (--tree->h3pt_nelem > el_idx) + { + el = &tree->h3pt_els[ el_idx ]; + *el = tree->h3pt_els[ tree->h3pt_nelem ]; + for (idx = el->h3pe_first_child; idx; + idx = tree->h3pt_els[ idx ].h3pe_right) + tree->h3pt_els[ idx ].h3pe_parent = el_idx; + if (el->h3pe_left) + tree->h3pt_els[ el->h3pe_left ].h3pe_right = el_idx; + if (el->h3pe_right) + tree->h3pt_els[ el->h3pe_right ].h3pe_left = el_idx; + if (tree->h3pt_els[ el->h3pe_parent ].h3pe_first_child + == tree->h3pt_nelem) + tree->h3pt_els[ el->h3pe_parent ].h3pe_first_child = el_idx; + if (el->h3pe_stream) + el->h3pe_stream->sm_h3_prio_idx = el_idx; + } +} + + +void +lsquic_prio_tree_prune (struct h3_prio_tree *tree, lsquic_time_t cutoff) +{ + struct h3_prio_elem *el; + unsigned count = 0; + + while (tree->h3pt_closed_first + && tree->h3pt_els[ tree->h3pt_closed_first ].h3pe_closed_at < cutoff) + { + el = &tree->h3pt_els[ tree->h3pt_closed_first ]; + tree->h3pt_closed_first = el->h3pe_next_closed; + if (tree->h3pt_closed_first == 0) + tree->h3pt_closed_last = 0; + ++count; + lsquic_prio_tree_drop_el(tree, el); + } + + LSQ_DEBUG("pruned %u element%.*s from the tree", count, count != 1, "s"); +} + + +void +lsquic_prio_tree_destroy (struct h3_prio_tree *tree) +{ + LSQ_DEBUG("destroyed"); + free(tree->h3pt_els); + free(tree); +} + + +void +lsquic_prio_tree_iter_reset (struct h3_prio_tree *tree, const char *log_id) +{ + struct h3_iter *const iter = &tree->h3pt_iter; + unsigned i; + + iter->h3it_log_id = log_id; + iter->h3it_count = 0; + iter->h3it_crit_count = 0; + iter->h3it_crit_off = 0; + iter->h3it_cursor = ROOT_IDX; + iter->h3it_active++; + if (0 == iter->h3it_active) + { + for (i = 0; i < tree->h3pt_nelem; ++i) + { + tree->h3pt_els[i].h3pe_active_self = 0; + tree->h3pt_els[i].h3pe_active_path = 0; + } + iter->h3it_active++; + } + + LSQ_DEBUG("reset iterator; log id: `%s'; active mark: %u", log_id, + iter->h3it_active); +} + + +static int +prio_tree_iter_add_critical (struct h3_prio_tree *tree, + struct lsquic_stream *stream) +{ + struct h3_iter *const iter = &tree->h3pt_iter; + + if (iter->h3it_crit_count < sizeof(iter->h3it_crit_streams) + / sizeof(iter->h3it_crit_streams[0])) + { + iter->h3it_crit_streams[ iter->h3it_crit_count++ ] = stream; + LSQ_DEBUG("%s: add critical stream %"PRIu64" at position %u", + iter->h3it_log_id, stream->id, iter->h3it_crit_count - 1); + return 0; + } + else + { + LSQ_WARN("could not add critical stream %"PRIu64" to the iterator: " + "no room", stream->id); + return -1; + } +} + + +static int +prio_tree_iter_add_regular (struct h3_prio_tree *tree, + struct lsquic_stream *stream) +{ + struct h3_iter *const iter = &tree->h3pt_iter; + struct h3_prio_elem *el; + + if (stream->sm_h3_prio_idx > 0 + && stream->sm_h3_prio_idx < tree->h3pt_nelem) + { + el = &tree->h3pt_els[stream->sm_h3_prio_idx]; + assert(el->h3pe_stream == stream); + el->h3pe_active_self = iter->h3it_active; + el->h3pe_iter_order = iter->h3it_count++; + while (el->h3pe_parent) + { + el = &tree->h3pt_els[ el->h3pe_parent ]; + el->h3pe_active_path = iter->h3it_active; + } + LSQ_DEBUG("%s: added stream %"PRIu64" to the iterator", + iter->h3it_log_id, stream->id); + return 0; + } + else + { + LSQ_WARN("%s: stream %"PRIu64" has invalid priority index value: %u", + iter->h3it_log_id, stream->id, stream->sm_h3_prio_idx); + assert(0); + return -1; + } +} + + +int +lsquic_prio_tree_iter_add (struct h3_prio_tree *tree, + struct lsquic_stream *stream) +{ + if (lsquic_stream_is_critical(stream)) + return prio_tree_iter_add_critical(tree, stream); + else + return prio_tree_iter_add_regular(tree, stream); +} + + +struct lsquic_stream * +lsquic_prio_tree_iter_next (struct h3_prio_tree *tree) +{ + struct h3_iter *const iter = &tree->h3pt_iter; + struct h3_prio_elem *el_self, *el_path; + iter_prio_t prio_self, prio_path; + elem_idx_t idx; + + if (iter->h3it_crit_off < iter->h3it_crit_count) + { + LSQ_DEBUG("%s: return critical stream %"PRIu64" at position %u", + iter->h3it_log_id, iter->h3it_crit_streams[iter->h3it_crit_off]->id, + iter->h3it_crit_off); + return iter->h3it_crit_streams[ iter->h3it_crit_off++ ]; + } + + top0: + if (!iter->h3it_cursor) + { + LSQ_DEBUG("%s: out of streams", iter->h3it_log_id); + return NULL; + } + + top1: + el_self = NULL, el_path = NULL; + prio_self = MAX_ITER_PRIO + 1; + prio_path = MAX_ITER_PRIO + 1; + for (idx = tree->h3pt_els[ iter->h3it_cursor ].h3pe_first_child; + idx; + idx = tree->h3pt_els[ idx ].h3pe_right) + { + if (tree->h3pt_els[ idx ].h3pe_active_self == iter->h3it_active + && EL_ITER_PRIO(&tree->h3pt_els[ idx ]) < prio_self) + { + el_self = &tree->h3pt_els[ idx ]; + prio_self = EL_ITER_PRIO(el_self); + } + if (tree->h3pt_els[ idx ].h3pe_active_path == iter->h3it_active + && EL_ITER_PRIO(&tree->h3pt_els[ idx ]) < prio_path) + { + el_path = &tree->h3pt_els[ idx ]; + prio_path = EL_ITER_PRIO(el_path); + } + } + + if (el_self) + { + el_self->h3pe_active_self = 0; + LSQ_DEBUG("%s: return %c stream %"PRIu64, iter->h3it_log_id, + el_type2char[ EL_TYPE(el_self) ], EL_ID(el_self)); + return el_self->h3pe_stream; + } + else if (el_path) + { + iter->h3it_cursor = CALC_EL_IDX(tree, el_path); + LSQ_DEBUG("%s: step down to %c:%"PRIu64, iter->h3it_log_id, + el_type2char[ EL_TYPE(el_path) ], EL_ID(el_path)); + goto top1; + } + else + { + tree->h3pt_els[ iter->h3it_cursor ].h3pe_active_path = 0; + iter->h3it_cursor = tree->h3pt_els[ iter->h3it_cursor ].h3pe_parent; + LSQ_DEBUG("%s: step up to %c:%"PRIu64, iter->h3it_log_id, + el_type2char[ EL_TYPE(&tree->h3pt_els[ iter->h3it_cursor ]) ], + EL_ID(&tree->h3pt_els[ iter->h3it_cursor ])); + goto top0; + } +} + + +struct lsquic_stream * +lsquic_prio_tree_highest_non_crit (struct h3_prio_tree *tree) +{ + elem_idx_t idx, parent; + struct h3_prio_elem *el; + unsigned weight; + + parent = ROOT_IDX; + + new_level: + /* Look for the stream */ + weight = 1u << sizeof(h3_weight_t) * 8; + el = NULL; + for (idx = tree->h3pt_els[ parent ].h3pe_first_child; + idx; + idx = tree->h3pt_els[ idx ].h3pe_right) + if (tree->h3pt_els[ idx ].h3pe_stream + && tree->h3pt_els[ idx ].h3pe_weight < weight) + { + el = &tree->h3pt_els[ idx ]; + weight = el->h3pe_weight; + } + else + /* Clear new level of crumbs */ + tree->h3pt_els[ idx ].h3pe_taken = 0; + + if (el) + return el->h3pe_stream; + + old_level: + /* Look for paths not taken */ + weight = 1u << sizeof(h3_weight_t) * 8; + el = NULL; + for (idx = tree->h3pt_els[ parent ].h3pe_first_child; + idx; + idx = tree->h3pt_els[ idx ].h3pe_right) + if (tree->h3pt_els[ idx ].h3pe_first_child + && !tree->h3pt_els[ idx ].h3pe_taken + && tree->h3pt_els[ idx ].h3pe_weight < weight) + { + el = &tree->h3pt_els[ idx ]; + weight = el->h3pe_weight; + } + + if (el) + { + parent = CALC_EL_IDX(tree, el); + goto new_level; + } + + tree->h3pt_els[ parent ].h3pe_taken = 1; + parent = tree->h3pt_els[ parent ].h3pe_parent; + if (parent) + goto old_level; + + return NULL; +} + + +static size_t +prio_tree_node_to_str (const struct h3_prio_tree *tree, + const struct h3_prio_elem *el, char *const buf, char *const end) +{ + elem_idx_t next_idx; + char *p; + int sz, comma; + + if (buf >= end) + return 0; + + p = buf; + sz = snprintf(p, end - p, "(t: %c; id: %"PRIu64"; w: %u", + el_type2char[EL_TYPE(el)], EL_ID(el), el->h3pe_weight); + if (sz > end - p) + return end - buf; + p += sz; + + if (el->h3pe_first_child) + { + sz = snprintf(p, end - p, "; c: ["); + if (sz > end - p) + return end - buf; + p += sz; + next_idx = el->h3pe_first_child; + comma = 0; + do + { + if (comma) + { + sz = snprintf(p, end - p, ","); + if (sz > end - p) + return end - buf; + p += sz; + } + else + ++comma; + el = &tree->h3pt_els[ next_idx ]; + p += prio_tree_node_to_str(tree, el, p, end); + if (p >= end) + return end - buf; + } + while ((next_idx = el->h3pe_right)); + sz = snprintf(p, end - p, "])"); + if (sz > end - p) + return end - buf; + p += sz; + } + else + { + sz = snprintf(p, end - p, ")"); + if (sz > end - p) + return end - buf; + p += sz; + } + + return p - buf; +} + + +size_t +lsquic_prio_tree_to_str (const struct h3_prio_tree *tree, char *buf, + size_t buf_sz) +{ + return prio_tree_node_to_str(tree, &tree->h3pt_els[ROOT_IDX], buf, + buf + buf_sz); +} + + +void +lsquic_prio_tree_set_ph (struct h3_prio_tree *tree, unsigned ph) +{ + LSQ_DEBUG("set max placeholders to %u", ph); + tree->h3pt_max_ph = ph; +} diff --git a/src/liblsquic/lsquic_h3_prio.h b/src/liblsquic/lsquic_h3_prio.h new file mode 100644 index 000000000..8d887869a --- /dev/null +++ b/src/liblsquic/lsquic_h3_prio.h @@ -0,0 +1,72 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#ifndef LSQUIC_H3_PRIO_H +#define LSQUIC_H3_PRIO_H 1 + +#define H3_PRIO_MAX_ELEMS ((1 << 16) - 1) + +struct h3_prio_tree; +struct lsquic_conn; +struct lsquic_stream; + +/* Same deal as with GQUIC priorities: lower value means higher priority */ +typedef uint8_t h3_weight_t; + +/* This corresponds to 16: */ +#define H3_DEFAULT_WEIGHT 240 + +enum h3_elem_type +{ + H3ET_ROOT, + H3ET_REQ_STREAM, + H3ET_PUSH_STREAM, + H3ET_PLACEHOLDER, +}; + +struct h3_prio_tree * +lsquic_prio_tree_new (const struct lsquic_conn *, unsigned); + +void +lsquic_prio_tree_set_ph (struct h3_prio_tree *, unsigned); + +void +lsquic_prio_tree_destroy (struct h3_prio_tree *); + +/* Call for PRIORITY frames arriving on request stream */ +int +lsquic_prio_tree_add_stream (struct h3_prio_tree *, struct lsquic_stream *, + enum h3_elem_type parent_type, uint64_t parent_id, h3_weight_t); + +/* Call for PRIORITY frames on the control stream */ +int +lsquic_prio_tree_set_rel (struct h3_prio_tree *, + enum h3_elem_type child_type, uint64_t child_id, h3_weight_t child_weight, + enum h3_elem_type parent_type, uint64_t parent_id); + +int +lsquic_prio_tree_remove_stream (struct h3_prio_tree *, struct lsquic_stream *, + lsquic_time_t now); + +void +lsquic_prio_tree_prune (struct h3_prio_tree *, lsquic_time_t cutoff); + +/* To begin to use the iterator, reset it first */ +void +lsquic_prio_tree_iter_reset (struct h3_prio_tree *tree, const char *); + +/* Then, add one or more stream objects */ +int +lsquic_prio_tree_iter_add (struct h3_prio_tree *tree, struct lsquic_stream *); + +struct lsquic_stream * +lsquic_prio_tree_highest_non_crit (struct h3_prio_tree *); + +/* Then, call next() until NULL is returned. It is OK to abandon the iterator + * at any time. + */ +struct lsquic_stream * +lsquic_prio_tree_iter_next (struct h3_prio_tree *tree); + +size_t +lsquic_prio_tree_to_str (const struct h3_prio_tree *tree, char *, size_t); + +#endif diff --git a/src/liblsquic/lsquic_handshake.c b/src/liblsquic/lsquic_handshake.c index e396e778c..e6edfa1a6 100644 --- a/src/liblsquic/lsquic_handshake.c +++ b/src/liblsquic/lsquic_handshake.c @@ -1,7 +1,12 @@ /* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#define _GNU_SOURCE /* for memmem */ + +#include +#include #include #include +#include #include #include #include @@ -21,7 +26,7 @@ #include "lsquic_types.h" #include "lsquic_crypto.h" #include "lsquic_str.h" -#include "lsquic_handshake.h" +#include "lsquic_enc_sess.h" #include "lsquic_parse.h" #include "lsquic_crt_compress.h" #include "lsquic_util.h" @@ -31,6 +36,14 @@ #include "lsquic_hash.h" #include "lsquic_buf.h" #include "lsquic_qtags.h" +#include "lsquic_byteswap.h" +#include "lsquic_sizes.h" +#include "lsquic_tokgen.h" +#include "lsquic_conn.h" +#include "lsquic_packet_common.h" +#include "lsquic_packet_out.h" +#include "lsquic_packet_in.h" +#include "lsquic_handshake.h" #include "fiu-local.h" @@ -38,6 +51,9 @@ #define MIN_CHLO_SIZE 1024 +#define MAX_SCFG_LENGTH 512 +#define MAX_SPUBS_LENGTH 32 + #define LSQUIC_LOGGER_MODULE LSQLM_HANDSHAKE #include "lsquic_logger.h" @@ -61,6 +77,18 @@ enum enc_sess_history_event ESHE_SET_SCID = 'D', ESHE_SET_PROF = 'P', ESHE_SET_SRST = 'S', + ESHE_VSTK_OK = 'V', + ESHE_VSTK_FAILED = 'W', + ESHE_SNI_FAIL = 'J', + ESHE_HAS_SSTK = 'H', + ESHE_UNKNOWN_CONFIG = 'a', + ESHE_MISSING_SCID = 'b', + ESHE_EMPTY_CCRT = 'c', + ESHE_MISSING_SNO = 'd', + ESHE_SNO_MISMATCH = 'e', + ESHE_SNO_OK = 'f', + ESHE_MULTI2_2BITS = 'i', + ESHE_SNI_DELAYED = 'Y', }; #endif @@ -86,6 +114,9 @@ typedef struct hs_ctx_st uint32_t scls; uint32_t cfcw; uint32_t sfcw; + uint32_t smids; + uint32_t scfcw; + uint32_t ssfcw; uint32_t icsl; uint32_t irtt; @@ -101,6 +132,7 @@ typedef struct hs_ctx_st uint32_t rrej; struct lsquic_str ccs; + struct lsquic_str uaid; struct lsquic_str sni; /* 0 rtt */ struct lsquic_str ccrt; struct lsquic_str stk; @@ -113,11 +145,66 @@ typedef struct hs_ctx_st } hs_ctx_t; +/* client side need to store 0rtt info per STK */ +typedef struct lsquic_session_cache_info_st +{ + unsigned char sscid[SCID_LENGTH]; + unsigned char spubs[32]; /* server pub key for next time 0rtt */ + uint32_t ver; /* one VERSION */ + uint32_t aead; + uint32_t kexs; + uint32_t pdmd; + uint64_t orbt; + uint64_t expy; + int scfg_flag; /* 0, no-init, 1, no parse, 2, parsed */ + struct lsquic_str sstk; + struct lsquic_str scfg; + struct lsquic_str sni_key; /* This is only used as key */ + struct lsquic_hash_elem hash_el; + +} lsquic_session_cache_info_t; + + +/* client */ +typedef struct c_cert_item_st +{ + struct lsquic_str* crts; + struct lsquic_str* hashs; + int count; +} c_cert_item_t; + + +struct lsquic_zero_rtt_storage +{ + uint32_t quic_version_tag; + uint32_t serializer_version; + uint32_t ver; + uint32_t aead; + uint32_t kexs; + uint32_t pdmd; + uint64_t orbt; + uint64_t expy; + uint64_t sstk_len; + uint64_t scfg_len; + uint64_t scfg_flag; + uint8_t sstk[STK_LENGTH]; + uint8_t scfg[MAX_SCFG_LENGTH]; + uint8_t sscid[SCID_LENGTH]; + uint8_t spubs[MAX_SPUBS_LENGTH]; + uint32_t cert_count; +}; + + + + struct lsquic_enc_session { enum handshake_state hsk_state; enum { - ES_RECV_REJ = 1 << 2, + ES_SERVER = 1 << 0, + ES_RECV_REJ = 1 << 1, + ES_RECV_SREJ = 1 << 2, + ES_FREE_CERT_PTR = 1 << 3, } es_flags; uint8_t have_key; /* 0, no 1, I, 2, D, 3, F */ @@ -143,6 +230,7 @@ struct lsquic_enc_session hs_ctx_t hs_ctx; lsquic_session_cache_info_t *info; c_cert_item_t *cert_item; + lsquic_server_config_t *server_config; SSL_CTX * ssl_ctx; const struct lsquic_engine_public *enpub; struct lsquic_str * cert_ptr; /* pointer to the leaf cert of the server, not real copy */ @@ -158,6 +246,60 @@ struct lsquic_enc_session +/* server side */ +typedef struct compress_cert_hash_item_st +{ + struct lsquic_str* domain; /*with port, such as "xyz.com:8088" as the key */ + struct lsquic_str* crts_compress_buf; + struct lsquic_hash_elem hash_el; + +} compress_cert_hash_item_t; + +/** + * server side, just for performance, will save the compressed certs buffer + */ +static struct lsquic_hash *s_compressed_server_certs; + +/*** + * Server side, it will store thr domain/cert [only the leaf cert] + */ +static struct lsquic_hash *s_server_certs; + +/** + * server side, will save one copy of s_server_scfg, it will update once a day + * This global pointer is point to the value in the hashtable + * Better to be put in ShM + */ +static lsquic_server_config_t s_server_config; + +/* server side, only one cert */ +typedef struct cert_item_st +{ + struct lsquic_str* crt; + struct lsquic_hash_elem hash_el; + size_t skid_len; + unsigned char skid_buf[0]; +} cert_item_t; + +/* server */ +static cert_item_t* s_find_cert(const unsigned char *skid_buf, size_t skid_len); +static void s_free_cert_hash_item(cert_item_t *item); +static cert_item_t* s_insert_cert(const unsigned char *skid_buf, + size_t skid_len, const struct lsquic_str *crt); + +static compress_cert_hash_item_t* find_compress_certs(struct lsquic_str *domain); +static compress_cert_hash_item_t *make_compress_cert_hash_item(struct lsquic_str *domain, struct lsquic_str *crts_compress_buf); + +#ifdef NDEBUG +static +enum hsk_failure_reason +verify_stk (enc_session_t *, + const struct sockaddr *ip_addr, uint64_t tm, lsquic_str_t *stk); +static +void gen_stk(lsquic_server_config_t *, const struct sockaddr *, uint64_t tm, + unsigned char stk_out[STK_LENGTH]); +#endif + /* client */ static c_cert_item_t *make_c_cert_item(struct lsquic_str **certs, int count); static void free_c_cert_item(c_cert_item_t *item); @@ -167,12 +309,12 @@ static int init_hs_hash_tables(int flags); static uint32_t get_tag_value_i32(unsigned char *, int); static uint64_t get_tag_value_i64(unsigned char *, int); -static int determine_keys(lsquic_enc_session_t *enc_session); +static void determine_keys(struct lsquic_enc_session *enc_session, int is_client); #if LSQUIC_KEEP_ENC_SESS_HISTORY static void -eshist_append (lsquic_enc_session_t *enc_session, +eshist_append (struct lsquic_enc_session *enc_session, enum enc_sess_history_event eh_event) { enc_session->es_hist_buf[ @@ -193,9 +335,41 @@ lsquic_handshake_init(int flags) } +static void +cleanup_hs_hash_tables (void) +{ + struct lsquic_hash_elem *el; + if (s_compressed_server_certs) + { + for (el = lsquic_hash_first(s_compressed_server_certs); el; + el = lsquic_hash_next(s_compressed_server_certs)) + { + compress_cert_hash_item_t *item = lsquic_hashelem_getdata(el); + lsquic_str_delete(item->domain); + lsquic_str_delete(item->crts_compress_buf); + free(item); + } + lsquic_hash_destroy(s_compressed_server_certs); + s_compressed_server_certs = NULL; + } + + if (s_server_certs) + { + for (el = lsquic_hash_first(s_server_certs); el; + el = lsquic_hash_next(s_server_certs)) + { + s_free_cert_hash_item( lsquic_hashelem_getdata(el) ); + } + lsquic_hash_destroy(s_server_certs); + s_server_certs = NULL; + } +} + + static void lsquic_handshake_cleanup (void) { + cleanup_hs_hash_tables(); lsquic_crt_cleanup(); } @@ -203,18 +377,45 @@ lsquic_handshake_cleanup (void) /* return -1 for fail, 0 OK*/ static int init_hs_hash_tables(int flags) { + if (flags & LSQUIC_GLOBAL_SERVER) + { + s_compressed_server_certs = lsquic_hash_create(); + if (!s_compressed_server_certs) + return -1; + + s_server_certs = lsquic_hash_create(); + if (!s_server_certs) + return -1; + } return 0; } +/* server */ +static cert_item_t * +s_find_cert (const unsigned char *skid_buf, size_t skid_len) +{ + struct lsquic_hash_elem *el; + + if (!s_server_certs) + return NULL; + + el = lsquic_hash_find(s_server_certs, skid_buf, skid_len); + if (el == NULL) + return NULL; + + return lsquic_hashelem_getdata(el); +} + + /* client */ static c_cert_item_t * make_c_cert_item (lsquic_str_t **certs, int count) { int i; uint64_t hash; - c_cert_item_t *item = (c_cert_item_t *)malloc(sizeof(c_cert_item_t)); + c_cert_item_t *item = calloc(1, sizeof(*item)); item->crts = (lsquic_str_t *)malloc(count * sizeof(lsquic_str_t)); item->hashs = lsquic_str_new(NULL, 0); item->count = count; @@ -245,6 +446,114 @@ free_c_cert_item (c_cert_item_t *item) } +/* server */ +static void +s_free_cert_hash_item (cert_item_t *item) +{ + if (item) + { + lsquic_str_delete(item->crt); + free(item); + } +} + + +/* server */ +static cert_item_t * +s_insert_cert (const unsigned char *skid_buf, size_t skid_len, + const lsquic_str_t *crt) +{ + struct lsquic_hash_elem *el; + lsquic_str_t *crt_copy; + cert_item_t *item; + + crt_copy = lsquic_str_new(lsquic_str_cstr(crt), lsquic_str_len(crt)); + if (!crt_copy) + return NULL; + + item = calloc(1, sizeof(*item) + skid_len); + if (!item) + { + lsquic_str_delete(crt_copy); + return NULL; + } + + memcpy(item->skid_buf, skid_buf, skid_len); + item->skid_len = skid_len; + item->crt = crt_copy; + el = lsquic_hash_insert(s_server_certs, item->skid_buf, item->skid_len, + item, &item->hash_el); + if (el) + return lsquic_hashelem_getdata(el); + else + { + s_free_cert_hash_item(item); + return NULL; + } +} + + +/* server */ +static compress_cert_hash_item_t * +find_compress_certs(lsquic_str_t *domain) +{ + struct lsquic_hash_elem *el; + + if (!s_compressed_server_certs) + return NULL; + + el = lsquic_hash_find(s_compressed_server_certs, lsquic_str_cstr(domain), + lsquic_str_len(domain)); + if (el == NULL) + return NULL; + + return lsquic_hashelem_getdata(el); +} + + +/* server */ +static compress_cert_hash_item_t * +make_compress_cert_hash_item(lsquic_str_t *domain, lsquic_str_t *crts_compress_buf) +{ + compress_cert_hash_item_t *item = calloc(1, sizeof(*item)); + item->crts_compress_buf = lsquic_str_new(NULL, 0); + item->domain = lsquic_str_new(NULL, 0); + lsquic_str_copy(item->domain, domain); + lsquic_str_copy(item->crts_compress_buf, crts_compress_buf); + return item; +} + + +/* server */ +#if __GNUC__ +__attribute__((unused)) /* XXX why? */ +#endif +static void +free_compress_cert_hash_item(compress_cert_hash_item_t *item) +{ + if (item) + { + lsquic_str_delete(item->crts_compress_buf); + lsquic_str_delete(item->domain); + free(item); + } +} + + +/* server */ +static int insert_compress_certs(compress_cert_hash_item_t *item) +{ + if (lsquic_hash_insert(s_compressed_server_certs, + lsquic_str_cstr(item->domain), + lsquic_str_len(item->domain), item, &item->hash_el) == NULL) + { + return -1; + } + else + return 0; +} + + enum rtt_deserialize_return_type { RTT_DESERIALIZE_OK = 0, @@ -366,13 +675,13 @@ lsquic_enc_session_deserialize_zero_rtt( } -static lsquic_enc_session_t * +static enc_session_t * lsquic_enc_session_create_client (const char *domain, lsquic_cid_t cid, const struct lsquic_engine_public *enpub, const unsigned char *zero_rtt, size_t zero_rtt_len) { lsquic_session_cache_info_t *info; - lsquic_enc_session_t *enc_session; + struct lsquic_enc_session *enc_session; c_cert_item_t *item; const struct lsquic_zero_rtt_storage *zero_rtt_storage; @@ -436,13 +745,46 @@ lsquic_enc_session_create_client (const char *domain, lsquic_cid_t cid, } +/* Server side: Session_cache_entry can be saved for 0rtt */ +static enc_session_t * +lsquic_enc_session_create_server (lsquic_cid_t cid, + const struct lsquic_engine_public *enpub) +{ + fiu_return_on("handshake/new_enc_session", NULL); + + struct lsquic_enc_session *enc_session; + + enc_session = calloc(1, sizeof(*enc_session)); + if (!enc_session) + return NULL; + + enc_session->enpub = enpub; + enc_session->cid = cid; + enc_session->es_flags |= ES_SERVER; + return enc_session; +} + + +static void +lsquic_enc_session_reset_cid (enc_session_t *enc_session_p, + const lsquic_cid_t *new_cid) +{ + struct lsquic_enc_session *const enc_session = enc_session_p; + + LSQ_INFOC("changing CID to %"CID_FMT, CID_BITS(new_cid)); + enc_session->cid = *new_cid; +} + + static void -lsquic_enc_session_destroy (lsquic_enc_session_t *enc_session) +lsquic_enc_session_destroy (enc_session_t *enc_session_p) { + struct lsquic_enc_session *const enc_session = enc_session_p; if (!enc_session) return ; hs_ctx_t *hs_ctx = &enc_session->hs_ctx; + lsquic_str_d(&hs_ctx->sni); lsquic_str_d(&hs_ctx->ccs); lsquic_str_d(&hs_ctx->ccrt); @@ -451,6 +793,7 @@ lsquic_enc_session_destroy (lsquic_enc_session_t *enc_session) lsquic_str_d(&hs_ctx->prof); lsquic_str_d(&hs_ctx->csct); lsquic_str_d(&hs_ctx->crt); + lsquic_str_d(&hs_ctx->uaid); lsquic_str_d(&hs_ctx->scfg_pubs); lsquic_str_d(&enc_session->chlo); lsquic_str_d(&enc_session->sstk); @@ -487,12 +830,14 @@ lsquic_enc_session_destroy (lsquic_enc_session_t *enc_session) free_c_cert_item(enc_session->cert_item); enc_session->cert_item = NULL; } + if ((enc_session->es_flags & ES_FREE_CERT_PTR) && enc_session->cert_ptr) + lsquic_str_delete(enc_session->cert_ptr); free(enc_session); } -static int get_hs_state(lsquic_enc_session_t *enc_session) +static int get_hs_state(struct lsquic_enc_session *enc_session) { return enc_session->hsk_state; } @@ -500,14 +845,15 @@ static int get_hs_state(lsquic_enc_session_t *enc_session) /* make sure have more room for encrypt */ static int -lsquic_enc_session_is_hsk_done (lsquic_enc_session_t *enc_session) +lsquic_enc_session_is_hsk_done (enc_session_t *enc_session_p) { + struct lsquic_enc_session *const enc_session = enc_session_p; return (get_hs_state(enc_session) == HSK_COMPLETED); } static void -process_copt (lsquic_enc_session_t *enc_session, const uint32_t *const opts, +process_copt (struct lsquic_enc_session *enc_session, const uint32_t *const opts, unsigned n_opts) { unsigned i; @@ -524,10 +870,11 @@ process_copt (lsquic_enc_session_t *enc_session, const uint32_t *const opts, } -static int parse_hs_data (lsquic_enc_session_t *enc_session, uint32_t tag, +static int parse_hs_data (struct lsquic_enc_session *enc_session, uint32_t tag, unsigned char *val, int len, uint32_t head_tag) { hs_ctx_t * hs_ctx = &enc_session->hs_ctx; + int is_client = (head_tag != QTAG_CHLO); switch(tag) { @@ -536,7 +883,8 @@ static int parse_hs_data (lsquic_enc_session_t *enc_session, uint32_t tag, break; case QTAG_MIDS: - if (0 != get_tag_val_u32(val, len, &hs_ctx->mids)) + if (0 != get_tag_val_u32(val, len, + (is_client ? &hs_ctx->mids : &hs_ctx->smids))) return -1; break; @@ -545,12 +893,12 @@ static int parse_hs_data (lsquic_enc_session_t *enc_session, uint32_t tag, break; case QTAG_CFCW: - if (0 != get_tag_val_u32(val, len, &hs_ctx->cfcw)) + if (0 != get_tag_val_u32(val, len, (is_client ? &hs_ctx->cfcw : &hs_ctx->scfcw))) return -1; break; case QTAG_SFCW: - if (0 != get_tag_val_u32(val, len, &hs_ctx->sfcw)) + if (0 != get_tag_val_u32(val, len, (is_client ? &hs_ctx->sfcw : &hs_ctx->ssfcw))) return -1; break; @@ -598,6 +946,9 @@ static int parse_hs_data (lsquic_enc_session_t *enc_session, uint32_t tag, hs_ctx->rcid = get_tag_value_i64(val, len); break; + case QTAG_UAID: + lsquic_str_setto(&hs_ctx->uaid, val, len); + break; case QTAG_SMHL: if (0 != get_tag_val_u32(val, len, &hs_ctx->smhl)) @@ -620,28 +971,56 @@ static int parse_hs_data (lsquic_enc_session_t *enc_session, uint32_t tag, break; case QTAG_SNO: - lsquic_str_setto(&enc_session->ssno, val, len); + if (is_client) + { + lsquic_str_setto(&enc_session->ssno, val, len); + } + else + { + /* Server side save a copy of SNO just for verify */ + lsquic_str_setto(&hs_ctx->sno, val, len); + } ESHIST_APPEND(enc_session, ESHE_SET_SNO); break; case QTAG_STK: - lsquic_str_setto(&enc_session->info->sstk, val, len); - ESHIST_APPEND(enc_session, ESHE_SET_STK); - break; + if (is_client) + { + lsquic_str_setto(&enc_session->info->sstk, val, len); + } + else + { + /* Server need to save a copy to verify */ + lsquic_str_setto(&hs_ctx->stk, val, len); + } + ESHIST_APPEND(enc_session, ESHE_SET_STK); + break; case QTAG_SCID: if (len != SCID_LENGTH) return -1; - memcpy(enc_session->info->sscid, val, len); + if (is_client) + { + memcpy(enc_session->info->sscid, val, len); + } + else + { + memcpy(hs_ctx->scid, val, len); + hs_ctx->set |= HSET_SCID; + } ESHIST_APPEND(enc_session, ESHE_SET_SCID); break; case QTAG_AEAD: - enc_session->info->aead = get_tag_value_i32(val, len); + if (is_client) + enc_session->info->aead = get_tag_value_i32(val, len); + else + hs_ctx->aead = get_tag_value_i32(val, len); break; case QTAG_KEXS: - { + if (is_client) + { if (head_tag == QTAG_SCFG && 0 == len % 4) { const unsigned char *p, *end; @@ -696,6 +1075,8 @@ static int parse_hs_data (lsquic_enc_session_t *enc_session, uint32_t tag, LSQ_INFO("No PUBS from SCFG to parse"); } } + else + hs_ctx->kexs = get_tag_value_i32(val, len); break; case QTAG_NONC: @@ -705,8 +1086,13 @@ static int parse_hs_data (lsquic_enc_session_t *enc_session, uint32_t tag, break; case QTAG_SCFG: - lsquic_str_setto(&enc_session->info->scfg, val, len); - enc_session->info->scfg_flag = 1; + if (is_client) + { + lsquic_str_setto(&enc_session->info->scfg, val, len); + enc_session->info->scfg_flag = 1; + } + else + LSQ_INFO("unexpected SCFG"); break; case QTAG_PROF: @@ -719,6 +1105,8 @@ static int parse_hs_data (lsquic_enc_session_t *enc_session, uint32_t tag, break; case QTAG_SRST: + if (enc_session->es_flags & ES_SERVER) + break; if (len != sizeof(hs_ctx->srst)) { LSQ_INFO("Unexpected size of SRST: %u instead of %zu bytes", @@ -740,7 +1128,7 @@ static int parse_hs_data (lsquic_enc_session_t *enc_session, uint32_t tag, /* only for the hs stream-frame data, NOT with the packet header or frame header*/ -static enum handshake_error parse_hs (lsquic_enc_session_t *enc_session, +static enum handshake_error parse_hs (struct lsquic_enc_session *enc_session, const unsigned char *buf, int buf_len, uint32_t *head_tag) { @@ -758,6 +1146,12 @@ static enum handshake_error parse_hs (lsquic_enc_session_t *enc_session, memcpy(&tag, p, 4); p += 4; + if (enc_session->es_flags & ES_SERVER) + { /* Server only expects to receive CHLO messages from the client */ + if (tag != QTAG_CHLO) + return DATA_FORMAT_ERROR; + } + else { if (tag != QTAG_SREJ && tag != QTAG_REJ && tag != QTAG_SHLO && tag != QTAG_SCFG) @@ -839,22 +1233,6 @@ get_tag_val_u32 (unsigned char *v, int len, uint32_t *val) } -static void -generate_cid_buf (void *buf, size_t bufsz) -{ - RAND_bytes(buf, bufsz); -} - - -static lsquic_cid_t -lsquic_generate_cid (void) -{ - lsquic_cid_t cid; - generate_cid_buf(&cid, sizeof(cid)); - return cid; -} - - /* From "QUIC Crypto" for easy reference: * * A handshake message consists of: @@ -959,10 +1337,11 @@ struct message_writer static int -lsquic_enc_session_gen_chlo (lsquic_enc_session_t *enc_session, +lsquic_enc_session_gen_chlo (enc_session_t *enc_session_p, enum lsquic_version version, uint8_t *buf, size_t *len) { - int ret, include_pad; + struct lsquic_enc_session *const enc_session = enc_session_p; + int include_pad; const lsquic_str_t *const ccs = get_common_certs_hash(); const struct lsquic_engine_settings *const settings = &enc_session->enpub->enp_settings; @@ -1118,85 +1497,714 @@ lsquic_enc_session_gen_chlo (lsquic_enc_session_t *enc_session, { enc_session->have_key = 0; assert(lsquic_str_len(enc_session->cert_ptr) > 0); - ret = determine_keys(enc_session - ); + determine_keys(enc_session, 1); enc_session->have_key = 1; } - else - ret = 0; - LSQ_DEBUG("lsquic_enc_session_gen_chlo called, return %d, buf_len %zd.", ret, *len); - return ret; + LSQ_DEBUG("lsquic_enc_session_gen_chlo called, return 0, buf_len %zd.", *len); + return 0; } -static int handle_chlo_reply_verify_prof(lsquic_enc_session_t *enc_session, - lsquic_str_t **out_certs, - size_t *out_certs_count, - lsquic_str_t *cached_certs, - int cached_certs_count) +static enum handshake_error +determine_rtts (struct lsquic_enc_session *enc_session, + const struct sockaddr *ip_addr, time_t t) { - const unsigned char *const in = - (const unsigned char *) lsquic_str_buf(&enc_session->hs_ctx.crt); - const unsigned char *const in_end = - in + lsquic_str_len(&enc_session->hs_ctx.crt); - EVP_PKEY *pub_key; - int ret; - size_t i; - X509 *cert, *server_cert; - STACK_OF(X509) *chain = NULL; - ret = decompress_certs(in, in_end,cached_certs, cached_certs_count, - out_certs, out_certs_count); - if (ret) - return ret; + hs_ctx_t *const hs_ctx = &enc_session->hs_ctx; + enum hsk_failure_reason hfr; - server_cert = bio_to_crt((const char *)lsquic_str_cstr(out_certs[0]), - lsquic_str_len(out_certs[0]), 0); - pub_key = X509_get_pubkey(server_cert); - ret = verify_prof((const uint8_t *)lsquic_str_cstr(&enc_session->chlo), - (size_t)lsquic_str_len(&enc_session->chlo), - &enc_session->info->scfg, - pub_key, - (const uint8_t *)lsquic_str_cstr(&enc_session->hs_ctx.prof), - lsquic_str_len(&enc_session->hs_ctx.prof)); - EVP_PKEY_free(pub_key); - if (ret != 0) - goto cleanup; + if (!(hs_ctx->set & HSET_SCID)) + { + hs_ctx->rrej = HFR_CONFIG_INCHOATE_HELLO; + ESHIST_APPEND(enc_session, ESHE_MISSING_SCID); + goto fail_1rtt; + } - if (enc_session->enpub->enp_verify_cert) + hfr = verify_stk(enc_session, ip_addr, t, &hs_ctx->stk); + if (hfr != HFR_HANDSHAKE_OK) { - chain = sk_X509_new_null(); - sk_X509_push(chain, server_cert); - for (i = 1; i < *out_certs_count; ++i) + hs_ctx->rrej = hfr; + ESHIST_APPEND(enc_session, ESHE_VSTK_FAILED); + goto fail_1rtt; + } + else + ESHIST_APPEND(enc_session, ESHE_VSTK_OK); + + if (memcmp(enc_session->server_config->lsc_scfg->info.sscid, hs_ctx->scid, 16) != 0) + { + hs_ctx->rrej = HFR_CONFIG_UNKNOWN_CONFIG; + ESHIST_APPEND(enc_session, ESHE_UNKNOWN_CONFIG); + goto fail_1rtt; + } + + if (!(lsquic_str_len(&hs_ctx->ccrt) > 0)) + { + /* We provide incorrect RREJ here because there is not one that fits + * this case. We can tell them apart: one comes in SREJ, the other + * in REJ. + */ + hs_ctx->rrej = HFR_CONFIG_INCHOATE_HELLO; + ESHIST_APPEND(enc_session, ESHE_EMPTY_CCRT); + goto fail_1rtt; + } + + if (lsquic_str_len(&enc_session->ssno) > 0) + { + if (lsquic_str_len(&hs_ctx->sno) == 0) { - cert = bio_to_crt((const char *)lsquic_str_cstr(out_certs[i]), - lsquic_str_len(out_certs[i]), 0); - if (cert) - sk_X509_push(chain, cert); - else - { - LSQ_WARN("cannot push certificate to stack"); - ret = -1; - goto cleanup; - } + hs_ctx->rrej = HFR_SERVER_NONCE_REQUIRED; + ESHIST_APPEND(enc_session, ESHE_MISSING_SNO); + goto fail_1rtt; } - ret = enc_session->enpub->enp_verify_cert( - enc_session->enpub->enp_verify_ctx, chain); - LSQ_INFO("server certificate verification %ssuccessful", - ret == 0 ? "" : "not "); + else if (lsquic_str_bcmp(&enc_session->ssno, &hs_ctx->sno) != 0) + { + hs_ctx->rrej = HFR_SERVER_NONCE_INVALID; + ESHIST_APPEND(enc_session, ESHE_SNO_MISMATCH); + goto fail_1rtt; + } + else + ESHIST_APPEND(enc_session, ESHE_SNO_OK); } - EV_LOG_CHECK_CERTS(enc_session->cid, (const lsquic_str_t **)out_certs, *out_certs_count); - cleanup: - if (chain) - sk_X509_free(chain); - X509_free(server_cert); - return ret; + enc_session->hsk_state = HSK_SHLO; + memcpy(enc_session->priv_key, enc_session->server_config->lsc_scfg->info.priv_key, 32); + return HS_SHLO; + + fail_1rtt: + enc_session->hsk_state = HSK_CHLO_REJ; + return HS_1RTT; } -void setup_aead_ctx(EVP_AEAD_CTX **ctx, unsigned char key[], int key_len, - unsigned char *key_copy) +static int +config_has_correct_size (const void *data, unsigned shm_len) +{ + /* EVP_AEAD_CTX from boringssl after-18d9f28f0df9f95570. */ + struct new_evp_aead_ctx_st { + void *ptr1; /* aead */ + void *ptr2; /* aead_state */ + uint8_t tag_len; + }; + + /* This is how SHM would like in 5.2.1 builds 7 and 8: */ + struct old_scfg_info + { + unsigned char sscid[SCID_LENGTH]; + unsigned char priv_key[32]; + unsigned char skt_key[16]; + uint32_t aead; + uint32_t kexs; + uint32_t pdmd; + uint64_t orbt; + uint64_t expy; + struct new_evp_aead_ctx_st ctx; + short scfg_len; + }; + + const SCFG_t *const modern_config = data; + const struct old_scfg_info *const old_info = data; + size_t expected_size; + + expected_size = modern_config->info.scfg_len + sizeof(*modern_config); + if (expected_size == shm_len) + return 1; + + if (old_info->scfg_len + sizeof(*old_info) == shm_len) + { + LSQ_WARN("Generating new server config"); + return 0; + } + + LSQ_ERROR("Server config has size %u -- expected %zd", shm_len, + expected_size); + return 0; +} + + +static lsquic_server_config_t * +get_valid_scfg (const struct lsquic_engine_public *enpub) +{ +#define SERVER_SCFG_KEY "SERVER_SCFG" +#define SERVER_SCFG_KEY_SIZE (sizeof(SERVER_SCFG_KEY) - 1) + const struct lsquic_engine_settings *const settings = &enpub->enp_settings; + const struct lsquic_shared_hash_if *const shi = enpub->enp_shi; + void *const shi_ctx = enpub->enp_shi_ctx; + uint8_t spubs[35] = {0x20, 0, 0, };/* need to init first 3 bytes */ + time_t t = time(NULL); + unsigned int real_len; + SCFG_info_t *temp_scfg; + SCFG_t *tmp_scfg_copy = NULL; + void *scfg_ptr; + int ret; + unsigned msg_len, server_config_sz; + struct message_writer mw; + + if (s_server_config.lsc_scfg && (s_server_config.lsc_scfg->info.expy > (uint64_t)t)) + return &s_server_config; + + ret = shi->shi_lookup(shi_ctx, SERVER_SCFG_KEY, SERVER_SCFG_KEY_SIZE, + &scfg_ptr, &real_len); + if (ret == 1) + { + if (config_has_correct_size(scfg_ptr, real_len) && + (s_server_config.lsc_scfg = scfg_ptr, + s_server_config.lsc_scfg->info.expy > (uint64_t)t)) + { + /* Why need to init here, because this memory may be read from SHM, + * the struct is ready but AEAD_CTX is not ready. + **/ + EVP_AEAD_CTX_init(&s_server_config.lsc_stk_ctx, EVP_aead_aes_128_gcm(), + s_server_config.lsc_scfg->info.skt_key, 16, 12, NULL); + return &s_server_config; + } + else + { + shi->shi_delete(shi_ctx, SERVER_SCFG_KEY, SERVER_SCFG_KEY_SIZE); + } + } + + MSG_LEN_INIT(msg_len); + MSG_LEN_ADD(msg_len, sizeof(temp_scfg->sscid)); + MSG_LEN_ADD(msg_len, sizeof(spubs)); + MSG_LEN_ADD(msg_len, enpub->enp_ver_tags_len); + MSG_LEN_ADD(msg_len, sizeof(temp_scfg->aead)); + MSG_LEN_ADD(msg_len, sizeof(temp_scfg->kexs)); + MSG_LEN_ADD(msg_len, sizeof(temp_scfg->pdmd)); + MSG_LEN_ADD(msg_len, sizeof(temp_scfg->orbt)); + MSG_LEN_ADD(msg_len, sizeof(temp_scfg->expy)); + + server_config_sz = sizeof(*s_server_config.lsc_scfg) + MSG_LEN_VAL(msg_len); + s_server_config.lsc_scfg = malloc(server_config_sz); + if (!s_server_config.lsc_scfg) + return NULL; + + temp_scfg = &s_server_config.lsc_scfg->info; + rand_bytes(temp_scfg->skt_key, sizeof(temp_scfg->skt_key)); + rand_bytes(temp_scfg->sscid, sizeof(temp_scfg->sscid)); + rand_bytes(temp_scfg->priv_key, sizeof(temp_scfg->priv_key)); + c255_get_pub_key(temp_scfg->priv_key, spubs + 3); + temp_scfg->aead = settings->es_aead; + temp_scfg->kexs = settings->es_kexs; + temp_scfg->pdmd = settings->es_pdmd; + temp_scfg->orbt = 0; + temp_scfg->expy = t + settings->es_sttl; + + MW_BEGIN(&mw, QTAG_SCFG, 8, s_server_config.lsc_scfg->scfg); + MW_WRITE_BUFFER(&mw, QTAG_VER, enpub->enp_ver_tags_buf, + enpub->enp_ver_tags_len); + MW_WRITE_UINT32(&mw, QTAG_AEAD, temp_scfg->aead); + MW_WRITE_BUFFER(&mw, QTAG_SCID, temp_scfg->sscid, sizeof(temp_scfg->sscid)); + MW_WRITE_UINT32(&mw, QTAG_PDMD, temp_scfg->pdmd); + MW_WRITE_BUFFER(&mw, QTAG_PUBS, spubs, sizeof(spubs)); + MW_WRITE_UINT32(&mw, QTAG_KEXS, temp_scfg->kexs); + MW_WRITE_UINT64(&mw, QTAG_ORBT, temp_scfg->orbt); + MW_WRITE_UINT64(&mw, QTAG_EXPY, temp_scfg->expy); + MW_END(&mw); + assert(MW_P(&mw) == s_server_config.lsc_scfg->scfg + MSG_LEN_VAL(msg_len)); + + temp_scfg->scfg_len = MSG_LEN_VAL(msg_len); + + LSQ_DEBUG("%s called, return len %d.", __func__, temp_scfg->scfg_len); + +// /* TODO: will shi_delete call free to release the buffer? */ +// shi->shi_delete(shi_ctx, SERVER_SCFG_KEY, SERVER_SCFG_KEY_SIZE); + void *scfg_key = strdup(SERVER_SCFG_KEY); + shi->shi_insert(shi_ctx, scfg_key, SERVER_SCFG_KEY_SIZE, + s_server_config.lsc_scfg, server_config_sz, t + settings->es_sttl); + + ret = shi->shi_lookup(shi_ctx, scfg_key, SERVER_SCFG_KEY_SIZE, + &scfg_ptr, &real_len); + if (ret == 1) + { + tmp_scfg_copy = scfg_ptr; + if (tmp_scfg_copy != s_server_config.lsc_scfg) + { + free(s_server_config.lsc_scfg); + s_server_config.lsc_scfg = tmp_scfg_copy; + } + } + else + { + /* Since internal error occured, but I have to use a SCFG, log it*/ + LSQ_DEBUG("get_valid_scfg got an shi internal error.\n"); + } + + ret = EVP_AEAD_CTX_init(&s_server_config.lsc_stk_ctx, EVP_aead_aes_128_gcm(), + s_server_config.lsc_scfg->info.skt_key, + sizeof(s_server_config.lsc_scfg->info.skt_key), 12, NULL); + + LSQ_DEBUG("get_valid_scfg::EVP_AEAD_CTX_init return %d.", ret); + return &s_server_config; +} + + +static int +generate_crt (struct lsquic_enc_session *enc_session, int common_case) +{ + int i, n, len, crt_num, rv = -1; + lsquic_str_t **crts; + unsigned char *out; + X509* crt; + STACK_OF(X509) *pXchain; + SSL_CTX *const ctx = enc_session->ssl_ctx; + hs_ctx_t *const hs_ctx = &enc_session->hs_ctx; + + SSL_CTX_get0_chain_certs(ctx, &pXchain); + n = sk_X509_num(pXchain); + crt_num = n + 1; + + crts = calloc(crt_num, sizeof(crts[0])); + if (!crts) + return -1; + + crts[0] = lsquic_str_new(lsquic_str_cstr(enc_session->cert_ptr), + lsquic_str_len(enc_session->cert_ptr)); + if (!crts[0]) + goto cleanup; + + for (i = 1; i < crt_num; i++) + { + crt = sk_X509_value(pXchain, i - 1); + out = NULL; + len = i2d_X509(crt, &out); + if (len < 0) + goto cleanup; + crts[i] = lsquic_str_new((const char *) out, len); + OPENSSL_free(out); + } + + if (0 != compress_certs(crts, crt_num, &hs_ctx->ccs, &hs_ctx->ccrt, + &hs_ctx->crt)) + goto cleanup; + + if (common_case) + { + if (0 != insert_compress_certs(make_compress_cert_hash_item( + &hs_ctx->sni, &hs_ctx->crt))) + goto cleanup; + } + + /* We got here, set rv to 0: success */ + rv = 0; + + cleanup: + for (i = 0; i < crt_num; ++i) + if (crts[i]) + lsquic_str_delete(crts[i]); + free(crts); + return rv; +} + + +/* rtt == 1 case */ +static int +gen_rej1_data (struct lsquic_enc_session *enc_session, uint8_t *data, + size_t max_len, const struct sockaddr *ip, time_t t) +{ + int len; + EVP_PKEY * rsa_priv_key; + SSL_CTX *ctx = enc_session->ssl_ctx; + const struct lsquic_engine_settings *const settings = + &enc_session->enpub->enp_settings; + hs_ctx_t *const hs_ctx = &enc_session->hs_ctx; + int scfg_len = enc_session->server_config->lsc_scfg->info.scfg_len; + uint8_t *scfg_data = enc_session->server_config->lsc_scfg->scfg; + char prof_buf[512]; + size_t prof_len = 512; + compress_cert_hash_item_t* compress_certs_item; + int common_case; + size_t msg_len; + struct message_writer mw; + + rsa_priv_key = SSL_CTX_get0_privatekey(ctx); + if (!rsa_priv_key) + return -1; + + lsquic_str_d(&hs_ctx->crt); + + /** + * Only cache hs_ctx->ccs is the hardcoded common certs and hs_ctx->ccrt is empty case + * This is the most common case + */ + common_case = lsquic_str_len(&hs_ctx->ccrt) == 0 + && lsquic_str_bcmp(&hs_ctx->ccs, get_common_certs_hash()) == 0; + if (common_case) + compress_certs_item = find_compress_certs(&hs_ctx->sni); + else + compress_certs_item = NULL; + + if (compress_certs_item) + { + lsquic_str_d(&hs_ctx->crt); + lsquic_str_copy(&hs_ctx->crt, compress_certs_item->crts_compress_buf); + } + else + generate_crt(enc_session, common_case); + + LSQ_DEBUG("gQUIC rej1 data"); + LSQ_DEBUG("gQUIC NOT enabled"); + gen_prof((const uint8_t *)lsquic_str_cstr(&enc_session->chlo), + (size_t)lsquic_str_len(&enc_session->chlo), + scfg_data, scfg_len, + rsa_priv_key, (uint8_t *)prof_buf, &prof_len); + + lsquic_str_setto(&hs_ctx->prof, prof_buf, prof_len); + + if (!hs_ctx->rrej) + { + LSQ_WARN("REJ: RREJ is not set, use default"); + hs_ctx->rrej = HFR_CLIENT_NONCE_UNKNOWN; + } + + MSG_LEN_INIT(msg_len); + MSG_LEN_ADD(msg_len, sizeof(hs_ctx->rrej)); + MSG_LEN_ADD(msg_len, scfg_len); + MSG_LEN_ADD(msg_len, STK_LENGTH); + MSG_LEN_ADD(msg_len, SNO_LENGTH); + MSG_LEN_ADD(msg_len, sizeof(settings->es_sttl)); + MSG_LEN_ADD(msg_len, lsquic_str_len(&hs_ctx->prof)); + MSG_LEN_ADD(msg_len, lsquic_str_len(&hs_ctx->crt)); + + if (MSG_LEN_VAL(msg_len) > max_len) + return -1; + + memcpy(enc_session->priv_key, enc_session->server_config->lsc_scfg->info.priv_key, 32); + + if (lsquic_str_len(&enc_session->sstk) != STK_LENGTH) + { + lsquic_str_d(&enc_session->sstk); + lsquic_str_prealloc(&enc_session->sstk, STK_LENGTH); + lsquic_str_setlen(&enc_session->sstk, STK_LENGTH); + } + gen_stk(enc_session->server_config, ip, t, + (unsigned char *) lsquic_str_buf(&enc_session->sstk)); + + if (lsquic_str_len(&enc_session->ssno) != SNO_LENGTH) + { + lsquic_str_d(&enc_session->ssno); + lsquic_str_prealloc(&enc_session->ssno, SNO_LENGTH); + lsquic_str_setlen(&enc_session->ssno, SNO_LENGTH); + } + rand_bytes(lsquic_str_buf(&enc_session->ssno), SNO_LENGTH); + + MW_BEGIN(&mw, QTAG_REJ, 7, data); + MW_WRITE_LS_STR(&mw, QTAG_STK, &enc_session->sstk); + MW_WRITE_LS_STR(&mw, QTAG_SNO, &enc_session->ssno); + MW_WRITE_LS_STR(&mw, QTAG_PROF, &hs_ctx->prof); + MW_WRITE_BUFFER(&mw, QTAG_SCFG, scfg_data, scfg_len); + MW_WRITE_BUFFER(&mw, QTAG_RREJ, &hs_ctx->rrej, sizeof(hs_ctx->rrej)); + MW_WRITE_BUFFER(&mw, QTAG_STTL, &settings->es_sttl, + sizeof(settings->es_sttl)); + MW_WRITE_LS_STR(&mw, QTAG_CRT, &hs_ctx->crt); + MW_END(&mw); + + assert(data + max_len >= MW_P(&mw)); + len = MW_P(&mw) - data; + LSQ_DEBUG("gen_rej1_data called, return len %d.", len); + return len; +} + + +/* rtt == 0 case */ +static int +gen_shlo_data (uint8_t *buf, size_t buf_len, struct lsquic_enc_session *enc_session, + enum lsquic_version version, const struct sockaddr *ip, + time_t t, uint8_t *nonce) +{ + char pub_key[32]; + const struct lsquic_engine_settings *const settings = + &enc_session->enpub->enp_settings; + struct message_writer mw; + int len; + const int include_reset_token = version >= LSQVER_046; + size_t msg_len; + + MSG_LEN_INIT(msg_len); + MSG_LEN_ADD(msg_len, enc_session->enpub->enp_ver_tags_len); + MSG_LEN_ADD(msg_len, sizeof(pub_key)); + MSG_LEN_ADD(msg_len, 4); /* MIDS */ + MSG_LEN_ADD(msg_len, 4); /* CFCW */ + MSG_LEN_ADD(msg_len, 4); /* SFCW */ + MSG_LEN_ADD(msg_len, 4); /* ICSL */ + MSG_LEN_ADD(msg_len, 4); /* SMHL */ + MSG_LEN_ADD(msg_len, lsquic_str_len(&enc_session->sstk)); + MSG_LEN_ADD(msg_len, lsquic_str_len(&enc_session->ssno)); + if (include_reset_token) + MSG_LEN_ADD(msg_len, SRST_LENGTH); + + if (MSG_LEN_VAL(msg_len) > buf_len) + return -1; + + rand_bytes(nonce, 32); + rand_bytes(enc_session->priv_key, 32); + c255_get_pub_key(enc_session->priv_key, (unsigned char *)pub_key); + if (lsquic_str_len(&enc_session->sstk) != STK_LENGTH) + { + lsquic_str_d(&enc_session->sstk); + lsquic_str_prealloc(&enc_session->sstk, STK_LENGTH); + lsquic_str_setlen(&enc_session->sstk, STK_LENGTH); + } + gen_stk(enc_session->server_config, ip, t, + (unsigned char *) lsquic_str_buf(&enc_session->sstk)); + if (lsquic_str_len(&enc_session->ssno) != SNO_LENGTH) + { + lsquic_str_d(&enc_session->ssno); + lsquic_str_prealloc(&enc_session->ssno, SNO_LENGTH); + lsquic_str_setlen(&enc_session->ssno, SNO_LENGTH); + } + rand_bytes(lsquic_str_buf(&enc_session->ssno), SNO_LENGTH); + + MW_BEGIN(&mw, QTAG_SHLO, 9 + include_reset_token, buf); + MW_WRITE_LS_STR(&mw, QTAG_STK, &enc_session->sstk); + MW_WRITE_LS_STR(&mw, QTAG_SNO, &enc_session->ssno); + MW_WRITE_BUFFER(&mw, QTAG_VER, enc_session->enpub->enp_ver_tags_buf, + enc_session->enpub->enp_ver_tags_len); + MW_WRITE_UINT32(&mw, QTAG_SMHL, 1); + MW_WRITE_UINT32(&mw, QTAG_ICSL, settings->es_idle_conn_to / 1000000); + MW_WRITE_BUFFER(&mw, QTAG_PUBS, pub_key, sizeof(pub_key)); + MW_WRITE_UINT32(&mw, QTAG_MIDS, settings->es_max_streams_in); + if (include_reset_token) + { + MW_WRITE_TABLE_ENTRY(&mw, QTAG_SRST, SRST_LENGTH); + lsquic_tg_generate_sreset(enc_session->enpub->enp_tokgen, + &enc_session->cid, MW_P(&mw)); + MW_ADVANCE_P(&mw, SRST_LENGTH); + } + MW_WRITE_UINT32(&mw, QTAG_CFCW, settings->es_cfcw); + MW_WRITE_UINT32(&mw, QTAG_SFCW, settings->es_sfcw); + MW_END(&mw); + + assert(buf + buf_len >= MW_P(&mw)); + len = MW_P(&mw) - buf; + LSQ_DEBUG("gen_shlo_data called, return len %d.", len); + return len; +} + + +/* We use ASN.1 string instead of the actual value, but it's only two + * extra bytes of overhead. We save a call to ASN1_get_object(). + */ +static int +get_skid (X509 *cert, const unsigned char **skid_buf, size_t *skid_len) +{ + ASN1_OCTET_STRING *skid; + X509_EXTENSION *ext; + int idx; + + idx = X509_get_ext_by_NID(cert, NID_subject_key_identifier, -1); + ext = X509_get_ext(cert, idx); + if (ext) + { + skid = X509_EXTENSION_get_data(ext); + *skid_buf = skid->data; + *skid_len = (size_t) skid->length; + return 0; + } + else + return -1; +} + + +static enum { GET_SNI_OK, GET_SNI_ERR, GET_SNI_DELAYED, } +get_sni_SSL_CTX(struct lsquic_enc_session *enc_session, lsquic_lookup_cert_f cb, + void *cb_ctx, const struct sockaddr *local) +{ + X509 *crt = NULL; + unsigned char *out; + int len; + lsquic_str_t crtstr; + cert_item_t *item; + struct ssl_ctx_st *ssl_ctx; + const unsigned char *skid_buf; + size_t skid_len; + + if (!enc_session->ssl_ctx) + { + if (!cb) + return GET_SNI_ERR; + ssl_ctx = cb(cb_ctx, local, lsquic_str_cstr(&enc_session->hs_ctx.sni)); + if (ssl_ctx == NULL) + return GET_SNI_ERR; + enc_session->ssl_ctx = ssl_ctx; + } + + if (enc_session->cert_ptr == NULL) + { + crt = SSL_CTX_get0_certificate(enc_session->ssl_ctx); + if (!crt) + return GET_SNI_ERR; + if (0 == get_skid(crt, &skid_buf, &skid_len)) + { + item = s_find_cert(skid_buf, skid_len); + if (item) + LSQ_DEBUG("found cert in cache"); + else + { + out = NULL; + len = i2d_X509(crt, &out); + if (len < 0) + return GET_SNI_ERR; + lsquic_str_set(&crtstr, (char *) out, len); + item = s_insert_cert(skid_buf, skid_len, &crtstr); + if (item) + { + OPENSSL_free(out); + LSQ_DEBUG("inserted cert into cache"); + } + else + { + LSQ_DEBUG("cert insertion failed, keep own copy"); + goto copy; + } + } + enc_session->cert_ptr = item->crt; + } + else + { + LSQ_DEBUG("skid not available, make a copy"); + out = NULL; + len = i2d_X509(crt, &out); + if (len < 0) + return GET_SNI_ERR; + copy: enc_session->cert_ptr = lsquic_str_new((char *) out, len); + OPENSSL_free(out); + if (!enc_session->cert_ptr) + return GET_SNI_ERR; + enc_session->es_flags |= ES_FREE_CERT_PTR; + } + } + return GET_SNI_OK; +} + + +/*** + * Comments: data and len are the frame(s) parsed data, no packet header. + * return rtt number: + * 1 for rej1 and 0 for shlo + * DATA_NOT_ENOUGH(-2) for not enough data, + * DATA_FORMAT_ERROR(-1) all other errors + * HS_DELAYED handshake delayed + */ +static enum handshake_error +handle_chlo_frames_data(const uint8_t *data, int len, + struct lsquic_enc_session *enc_session, + lsquic_lookup_cert_f cb, void *cb_ctx, + const struct sockaddr *local, + const struct lsquic_shared_hash_if *shi, + void *shi_ctx, const struct sockaddr *ip, time_t t) +{ + /* start to parse it */ +// struct lsquic_enc_session *enc_session = retrive_enc_session(cid); + uint32_t head_tag; + enum handshake_error rtt; + int ret; + + LSQ_DEBUG("handle_chlo_frames_data called."); + + ret = parse_hs(enc_session, data, len, &head_tag); + if (ret) + { + LSQ_DEBUG("handle_chlo_frames_data parse_hs error,s o quit."); + return ret; + } + + if (head_tag != QTAG_CHLO) + { + LSQ_DEBUG("handle_chlo_frames_data got data format error 1."); + return DATA_FORMAT_ERROR; + } + + + rtt = determine_rtts(enc_session, ip, t); + ESHIST_APPEND(enc_session, ESHE_MULTI2_2BITS + rtt); + lsquic_str_setto(&enc_session->chlo, (const char *)data, len); + switch (get_sni_SSL_CTX(enc_session, cb, cb_ctx, local)) + { + case GET_SNI_DELAYED: + ESHIST_APPEND(enc_session, ESHE_SNI_DELAYED); + LSQ_DEBUG("%s: sni delayed", __func__); + return HS_DELAYED; + case GET_SNI_ERR: + ESHIST_APPEND(enc_session, ESHE_SNI_FAIL); + LSQ_DEBUG("handle_chlo_frames_data got data format error 2."); + return DATA_FORMAT_ERROR; + default: + break; + } + + + LSQ_DEBUG("handle_chlo_frames_data return %d.", rtt); + return rtt; +} + + +static int handle_chlo_reply_verify_prof(struct lsquic_enc_session *enc_session, + lsquic_str_t **out_certs, + size_t *out_certs_count, + lsquic_str_t *cached_certs, + int cached_certs_count) +{ + const unsigned char *const in = + (const unsigned char *) lsquic_str_buf(&enc_session->hs_ctx.crt); + const unsigned char *const in_end = + in + lsquic_str_len(&enc_session->hs_ctx.crt); + EVP_PKEY *pub_key; + int ret; + size_t i; + X509 *cert, *server_cert; + STACK_OF(X509) *chain = NULL; + ret = decompress_certs(in, in_end,cached_certs, cached_certs_count, + out_certs, out_certs_count); + if (ret) + return ret; + + server_cert = bio_to_crt((const char *)lsquic_str_cstr(out_certs[0]), + lsquic_str_len(out_certs[0]), 0); + pub_key = X509_get_pubkey(server_cert); + ret = verify_prof((const uint8_t *)lsquic_str_cstr(&enc_session->chlo), + (size_t)lsquic_str_len(&enc_session->chlo), + &enc_session->info->scfg, + pub_key, + (const uint8_t *)lsquic_str_cstr(&enc_session->hs_ctx.prof), + lsquic_str_len(&enc_session->hs_ctx.prof)); + EVP_PKEY_free(pub_key); + if (ret != 0) + goto cleanup; + + if (enc_session->enpub->enp_verify_cert) + { + chain = sk_X509_new_null(); + sk_X509_push(chain, server_cert); + for (i = 1; i < *out_certs_count; ++i) + { + cert = bio_to_crt((const char *)lsquic_str_cstr(out_certs[i]), + lsquic_str_len(out_certs[i]), 0); + if (cert) + sk_X509_push(chain, cert); + else + { + LSQ_WARN("cannot push certificate to stack"); + ret = -1; + goto cleanup; + } + } + ret = enc_session->enpub->enp_verify_cert( + enc_session->enpub->enp_verify_ctx, chain); + LSQ_INFO("server certificate verification %ssuccessful", + ret == 0 ? "" : "not "); + } + EV_LOG_CHECK_CERTS(&enc_session->cid, (const lsquic_str_t **)out_certs, *out_certs_count); + + cleanup: + if (chain) + sk_X509_free(chain); + X509_free(server_cert); + return ret; +} + + +void setup_aead_ctx(EVP_AEAD_CTX **ctx, unsigned char key[], int key_len, + unsigned char *key_copy) { const EVP_AEAD *aead_ = EVP_aead_aes_128_gcm(); const int auth_tag_size = 12; @@ -1214,17 +2222,28 @@ void setup_aead_ctx(EVP_AEAD_CTX **ctx, unsigned char key[], int key_len, static int -determine_diversification_key (lsquic_enc_session_t *enc_session, +determine_diversification_key (enc_session_t *enc_session_p, uint8_t *diversification_nonce + , int is_client ) { + struct lsquic_enc_session *const enc_session = enc_session_p; EVP_AEAD_CTX **ctx_s_key; unsigned char *key_i, *iv; uint8_t ikm[aes128_key_len + aes128_iv_len]; - ctx_s_key = &enc_session->dec_ctx_i; - key_i = enc_session->dec_key_i; - iv = enc_session->dec_key_nonce_i; + if (is_client) + { + ctx_s_key = &enc_session->dec_ctx_i; + key_i = enc_session->dec_key_i; + iv = enc_session->dec_key_nonce_i; + } + else + { + ctx_s_key = &enc_session->enc_ctx_i; + key_i = enc_session->enc_key_i; + iv = enc_session->enc_key_nonce_i; + } memcpy(ikm, key_i, aes128_key_len); memcpy(ikm + aes128_key_len, iv, aes128_iv_len); export_key_material(ikm, aes128_key_len + aes128_iv_len, @@ -1243,7 +2262,8 @@ determine_diversification_key (lsquic_enc_session_t *enc_session, /* After CHLO msg generatered, call it to determine_keys */ -static int determine_keys(lsquic_enc_session_t *enc_session) +static void +determine_keys (struct lsquic_enc_session *enc_session, int is_client) { lsquic_str_t *chlo = &enc_session->chlo; uint8_t shared_key_c[32]; @@ -1277,6 +2297,7 @@ static int determine_keys(lsquic_enc_session_t *enc_session) c255_gen_share_key(enc_session->priv_key, enc_session->hs_ctx.pubs, (unsigned char *)shared_key_c); + if (is_client) { if (enc_session->have_key == 0) { @@ -1295,16 +2316,43 @@ static int determine_keys(lsquic_enc_session_t *enc_session) s_iv = (unsigned char *) enc_session->dec_key_nonce_f; } } + else + { + if (enc_session->have_key == 0) + { + ctx_c_key = &enc_session->dec_ctx_i; + ctx_s_key = &enc_session->enc_ctx_i; + c_iv = (unsigned char *) enc_session->dec_key_nonce_i; + s_iv = (unsigned char *) enc_session->enc_key_nonce_i; + c_key_bin = enc_session->dec_key_i; + s_key_bin = enc_session->enc_key_i; + } + else + { + ctx_c_key = &enc_session->dec_ctx_f; + ctx_s_key = &enc_session->enc_ctx_f; + c_iv = (unsigned char *) enc_session->dec_key_nonce_f; + s_iv = (unsigned char *) enc_session->enc_key_nonce_f; + } + } LSQ_DEBUG("export_key_material c255_gen_share_key %s", get_bin_str(shared_key_c, 32, 512)); - lsquic_buf_append(hkdf_input, (char *)&enc_session->cid, sizeof(enc_session->cid)); + lsquic_buf_append(hkdf_input, (const char *) enc_session->cid.idbuf, + enc_session->cid.len); lsquic_buf_append(hkdf_input, lsquic_str_cstr(chlo), lsquic_str_len(chlo)); /* CHLO msg */ + if (is_client) { lsquic_buf_append(hkdf_input, lsquic_str_cstr(&enc_session->info->scfg), lsquic_str_len(&enc_session->info->scfg)); /* scfg msg */ } + else + { + lsquic_buf_append(hkdf_input, + (const char *) enc_session->server_config->lsc_scfg->scfg, + enc_session->server_config->lsc_scfg->info.scfg_len); + } lsquic_buf_append(hkdf_input, lsquic_str_cstr(enc_session->cert_ptr), lsquic_str_len(enc_session->cert_ptr)); LSQ_DEBUG("export_key_material hkdf_input %s", @@ -1346,8 +2394,6 @@ static int determine_keys(lsquic_enc_session_t *enc_session) get_bin_str(s_iv, aes128_iv_len, 512)); LSQ_DEBUG("***export_key_material '%c' subkey: %s", key_flag, get_bin_str(sub_key, 32, 512)); - - return 0; } @@ -1378,7 +2424,9 @@ he2str (enum handshake_error he) case HS_ERROR: return "HS_ERROR"; case HS_SHLO: return "HS_SHLO"; case HS_1RTT: return "HS_1RTT"; - case HS_2RTT: return "HS_2RTT"; + case HS_SREJ: return "HS_SREJ"; + case HS_DELAYED: return "HS_DELAYED"; + case HS_PK_OFFLOAD: return "HS_PK_OFFLOAD"; default: assert(0); return ""; } @@ -1392,11 +2440,12 @@ he2str (enum handshake_error he) * DATA_FORMAT_ERROR(-1) all other errors */ static int -lsquic_enc_session_handle_chlo_reply (lsquic_enc_session_t *enc_session, +lsquic_enc_session_handle_chlo_reply (enc_session_t *enc_session_p, const uint8_t *data, int len) { + struct lsquic_enc_session *const enc_session = enc_session_p; uint32_t head_tag; - int ret; + int ret, got_srej; lsquic_session_cache_info_t *info = enc_session->info; c_cert_item_t *cert_item = enc_session->cert_item; @@ -1408,25 +2457,31 @@ lsquic_enc_session_handle_chlo_reply (lsquic_enc_session_t *enc_session, if (ret) goto end; - if (head_tag != QTAG_SREJ && - head_tag != QTAG_REJ && - head_tag != QTAG_SHLO) - { - ret = 1; - goto end; - } - - if (head_tag == QTAG_SREJ || head_tag == QTAG_REJ) + got_srej = head_tag == QTAG_SREJ; + switch (head_tag) { + case QTAG_SREJ: + if (enc_session->es_flags & ES_RECV_SREJ) + { + LSQ_DEBUG("received second SREJ: handshake failed"); + ret = -1; + goto end; + } + enc_session->es_flags |= ES_RECV_SREJ; + /* fall-through */ + case QTAG_REJ: enc_session->hsk_state = HSK_CHLO_REJ; enc_session->es_flags |= ES_RECV_REJ; - } - else if(head_tag == QTAG_SHLO) - { + break; + case QTAG_SHLO: enc_session->hsk_state = HSK_COMPLETED; - EV_LOG_HSK_COMPLETED(enc_session->cid); + EV_LOG_HSK_COMPLETED(&enc_session->cid); if (!(enc_session->es_flags & ES_RECV_REJ)) - EV_LOG_ZERO_RTT(enc_session->cid); + EV_LOG_ZERO_RTT(&enc_session->cid); + break; + default: + ret = 1; /* XXX Why 1? */ + goto end; } if (info->scfg_flag == 1) @@ -1439,6 +2494,18 @@ lsquic_enc_session_handle_chlo_reply (lsquic_enc_session_t *enc_session, if (ret) goto end; + if (got_srej) + { + if (lsquic_str_len(&enc_session->info->sstk)) + ret = HS_SREJ; + else + { + LSQ_DEBUG("expected STK in SREJ message from the server"); + ret = -1; + } + goto end; + } + if (lsquic_str_len(&enc_session->hs_ctx.crt) > 0) { out_certs_count = get_certs_count(&enc_session->hs_ctx.crt); @@ -1482,21 +2549,154 @@ lsquic_enc_session_handle_chlo_reply (lsquic_enc_session_t *enc_session, } } - if (enc_session->hsk_state == HSK_COMPLETED) + if (enc_session->hsk_state == HSK_COMPLETED) + { + determine_keys(enc_session , 1); + enc_session->have_key = 3; + } + + end: + LSQ_DEBUG("lsquic_enc_session_handle_chlo_reply called, buf in %d, return %d.", len, ret); + EV_LOG_CONN_EVENT(&enc_session->cid, "%s returning %s", __func__, + he2str(ret)); + return ret; +} + + +/** stk = 16 bytes IP ( V4 is 4 bytes, will add 12 byes 0 ) + * + 8 bytes time + * + 36 bytes random bytes (24 bytes can be reserved for other using) + * then stk first 48 byte will be encrypted with AES128-GCM + * when encrypting, the salt is the last 12 bytes + */ +#ifdef NDEBUG +static +#endif +void +gen_stk (lsquic_server_config_t *server_config, const struct sockaddr *ip_addr, + uint64_t tm, unsigned char stk_out[STK_LENGTH]) +{ + unsigned char stk[STK_LENGTH + 16]; + size_t out_len = STK_LENGTH + 16; + + memset(stk, 0 , 24); + if (AF_INET == ip_addr->sa_family) + memcpy(stk, &((struct sockaddr_in *)ip_addr)->sin_addr.s_addr, 4); + else + memcpy(stk, &((struct sockaddr_in6 *)ip_addr)->sin6_addr, 16); + memcpy(stk + 16, &tm, 8); + rand_bytes(stk + 24, STK_LENGTH - 24 - 12); + rand_bytes(stk_out + STK_LENGTH - 12, 12); + aes_aead_enc(&server_config->lsc_stk_ctx, NULL, 0, stk_out + STK_LENGTH - 12, 12, stk, + STK_LENGTH - 12 - 12, stk_out, &out_len); +} + + +/* server using */ +#ifdef NDEBUG +static +#endif +enum hsk_failure_reason +verify_stk0 (lsquic_server_config_t *server_config, + const struct sockaddr *ip_addr, uint64_t tm, lsquic_str_t *stk, + unsigned secs_since_stk_generated) +{ + uint64_t tm0, exp; + unsigned char *const stks = (unsigned char *) lsquic_str_buf(stk); + unsigned char stk_out[STK_LENGTH]; + size_t out_len = STK_LENGTH; + + if (lsquic_str_len(stk) < STK_LENGTH) + return HFR_SRC_ADDR_TOKEN_INVALID; + + int ret = aes_aead_dec(&server_config->lsc_stk_ctx, NULL, 0, + stks + STK_LENGTH - 12, 12, stks, + STK_LENGTH - 12, stk_out, &out_len); + if (ret != 0) + { + LSQ_DEBUG("***verify_stk decrypted failed."); + return HFR_SRC_ADDR_TOKEN_DECRYPTION; + } + + if (AF_INET == ip_addr->sa_family) + { + if (memcmp(stk_out, &((struct sockaddr_in *)ip_addr)->sin_addr.s_addr, 4) != 0) + { + LSQ_DEBUG("***verify_stk for ipv4 failed."); + return HFR_SRC_ADDR_TOKEN_DIFFERENT_IP_ADDRESS; + } + } + else + { + if (memcmp(stk_out, &((struct sockaddr_in6 *)ip_addr)->sin6_addr, 16) != 0) + { + LSQ_DEBUG("***verify_stk for ipv6 failed."); + return HFR_SRC_ADDR_TOKEN_DIFFERENT_IP_ADDRESS; + } + } + + memcpy((void *)&tm0, stk_out + 16, 8); + if (tm < tm0) { - ret = determine_keys(enc_session - ); /* FIXME: check ret */ - enc_session->have_key = 3; + LSQ_DEBUG("***verify_stk timestamp is in the future."); + return HFR_SRC_ADDR_TOKEN_CLOCK_SKEW; } - end: - LSQ_DEBUG("lsquic_enc_session_handle_chlo_reply called, buf in %d, return %d.", len, ret); - EV_LOG_CONN_EVENT(enc_session->cid, "%s returning %s", __func__, - he2str(ret)); - return ret; + if (secs_since_stk_generated) + exp = tm0 + secs_since_stk_generated; + else + exp = server_config->lsc_scfg->info.expy; + + if (tm > server_config->lsc_scfg->info.expy /* XXX this check does not seem needed */ || + tm0 > exp) + { + LSQ_DEBUG("***verify_stk stk expired"); + return HFR_SRC_ADDR_TOKEN_EXPIRED; + } + + LSQ_DEBUG("***verify_stk pass."); + return HFR_HANDSHAKE_OK; +} + + +/* 0, verified, other fail */ +#ifdef NDEBUG +static +#endif +enum hsk_failure_reason +verify_stk (enc_session_t *enc_session_p, + const struct sockaddr *ip_addr, uint64_t tm, lsquic_str_t *stk) +{ + struct lsquic_enc_session *const enc_session = enc_session_p; + if (lsquic_str_len(&enc_session->sstk) > 0) + { + ESHIST_APPEND(enc_session, ESHE_HAS_SSTK); + if (0 == lsquic_str_bcmp(&enc_session->sstk, &enc_session->hs_ctx.stk)) + return HFR_HANDSHAKE_OK; + else + return HFR_SRC_ADDR_TOKEN_INVALID; + } + else + return verify_stk0(enc_session->server_config, ip_addr, tm, stk, 0); +} + + +#if 0 /* unused */ +enum AEAD_TYPE determineaead() +{ + return AEAD_AESG; +} + + +enum KENX_TYPE determinekexs() +{ + /* only support C255 now */ + return KENX_C255; } +#endif /* 0 */ + static uint64_t combine_path_id_pack_num(uint8_t path_id, uint64_t pack_num) { uint64_t v = ((uint64_t)path_id << 56) | pack_num; @@ -1504,10 +2704,10 @@ static uint64_t combine_path_id_pack_num(uint8_t path_id, uint64_t pack_num) } -# define IS_SERVER(session) 0 +# define IS_SERVER(session) ((session)->es_flags & ES_SERVER) static int -verify_packet_hash (const lsquic_enc_session_t *enc_session, +verify_packet_hash (const struct lsquic_enc_session *enc_session, enum lsquic_version version, const unsigned char *buf, size_t *header_len, size_t data_len, unsigned char *buf_out, size_t max_out_len, size_t *out_len) @@ -1519,19 +2719,16 @@ verify_packet_hash (const lsquic_enc_session_t *enc_session, if (data_len < HS_PKT_HASH_LENGTH) return -1; - if (version >= LSQVER_039) - { + if (!enc_session || (IS_SERVER(enc_session))) hash = fnv1a_128_3(buf, *header_len, buf + *header_len + HS_PKT_HASH_LENGTH, data_len - HS_PKT_HASH_LENGTH, - (unsigned char *) "Server", 6); - } + (unsigned char *) "Client", 6); else - { - hash = fnv1a_128_2(buf, *header_len, - buf + *header_len + HS_PKT_HASH_LENGTH, - data_len - HS_PKT_HASH_LENGTH); - } + hash = fnv1a_128_3(buf, *header_len, + buf + *header_len + HS_PKT_HASH_LENGTH, + data_len - HS_PKT_HASH_LENGTH, + (unsigned char *) "Server", 6); serialize_fnv128_short(hash, md); ret = memcmp(md, buf + *header_len, HS_PKT_HASH_LENGTH); @@ -1551,7 +2748,7 @@ verify_packet_hash (const lsquic_enc_session_t *enc_session, static enum enc_level -decrypt_packet (lsquic_enc_session_t *enc_session, uint8_t path_id, +decrypt_packet (struct lsquic_enc_session *enc_session, uint8_t path_id, uint64_t pack_num, unsigned char *buf, size_t *header_len, size_t data_len, unsigned char *buf_out, size_t max_out_len, size_t *out_len) @@ -1602,7 +2799,7 @@ decrypt_packet (lsquic_enc_session_t *enc_session, uint8_t path_id, { LSQ_DEBUG("!!!decrypt_packet find peer have final key."); enc_session->peer_have_final_key = 1; - EV_LOG_CONN_EVENT(enc_session->cid, "settled on private key " + EV_LOG_CONN_EVENT(&enc_session->cid, "settled on private key " "'%c' after %d tries (packet number %"PRIu64")", key == enc_session->dec_ctx_f ? 'F' : 'I', try_times, pack_num); @@ -1618,8 +2815,9 @@ decrypt_packet (lsquic_enc_session_t *enc_session, uint8_t path_id, static int -lsquic_enc_session_have_key_gt_one (const lsquic_enc_session_t *enc_session) +lsquic_enc_session_have_key_gt_one (enc_session_t *enc_session_p) { + struct lsquic_enc_session *const enc_session = enc_session_p; return enc_session && enc_session->have_key > 1; } @@ -1628,17 +2826,18 @@ lsquic_enc_session_have_key_gt_one (const lsquic_enc_session_t *enc_session) * buffer correspond to the header and the payload of incoming QUIC packet. */ static enum enc_level -lsquic_enc_session_decrypt (lsquic_enc_session_t *enc_session, +lsquic_enc_session_decrypt (enc_session_t *enc_session_p, enum lsquic_version version, uint8_t path_id, uint64_t pack_num, unsigned char *buf, size_t *header_len, size_t data_len, unsigned char *diversification_nonce, unsigned char *buf_out, size_t max_out_len, size_t *out_len) { + struct lsquic_enc_session *const enc_session = enc_session_p; /* Client: got SHLO which should have diversification_nonce */ if (diversification_nonce && enc_session && enc_session->have_key == 1) { - determine_diversification_key(enc_session, diversification_nonce); + determine_diversification_key(enc_session, diversification_nonce, 1); enc_session->have_key = 2; } @@ -1653,8 +2852,54 @@ lsquic_enc_session_decrypt (lsquic_enc_session_t *enc_session, } +static enum dec_packin +gquic_decrypt_packet (enc_session_t *enc_session_p, + struct lsquic_engine_public *enpub, + const struct lsquic_conn *lconn, + struct lsquic_packet_in *packet_in) +{ + size_t header_len, data_len; + enum enc_level enc_level; + size_t out_len = 0; + unsigned char *copy = lsquic_mm_get_packet_in_buf(&enpub->enp_mm, 1370); + if (!copy) + { + LSQ_WARN("cannot allocate memory to copy incoming packet data"); + return DECPI_NOMEM; + } + + header_len = packet_in->pi_header_sz; + data_len = packet_in->pi_data_sz - packet_in->pi_header_sz; + enc_level = lsquic_enc_session_decrypt(enc_session_p, + lconn->cn_version, 0, + packet_in->pi_packno, packet_in->pi_data, + &header_len, data_len, + lsquic_packet_in_nonce(packet_in), + copy, 1370, &out_len); + if ((enum enc_level) -1 == enc_level) + { + lsquic_mm_put_packet_in_buf(&enpub->enp_mm, copy, 1370); + EV_LOG_CONN_EVENT(&lconn->cn_cid, "could not decrypt packet %"PRIu64, + packet_in->pi_packno); + return DECPI_BADCRYPT; + } + + assert(header_len + out_len <= 1370); + if (packet_in->pi_flags & PI_OWN_DATA) + lsquic_mm_put_packet_in_buf(&enpub->enp_mm, packet_in->pi_data, 1370); + packet_in->pi_data = copy; + packet_in->pi_flags |= PI_OWN_DATA | PI_DECRYPTED + | (enc_level << PIBIT_ENC_LEV_SHIFT); + packet_in->pi_header_sz = header_len; + packet_in->pi_data_sz = out_len + header_len; + EV_LOG_CONN_EVENT(&lconn->cn_cid, "decrypted packet %"PRIu64, + packet_in->pi_packno); + return DECPI_OK; +} + + static enum enc_level -lsquic_enc_session_encrypt (lsquic_enc_session_t *enc_session, +gquic_encrypt_buf (struct lsquic_enc_session *enc_session, enum lsquic_version version, uint8_t path_id, uint64_t pack_num, const unsigned char *header, size_t header_len, @@ -1685,15 +2930,12 @@ lsquic_enc_session_encrypt (lsquic_enc_session_t *enc_session, if (max_out_len < *out_len) return -1; - if (version >= LSQVER_039) - { + if (!enc_session || (IS_SERVER(enc_session))) hash = fnv1a_128_3(header, header_len, data, data_len, - (unsigned char *) "Client", 6); - } + (unsigned char *) "Server", 6); else - { - hash = fnv1a_128_2(header, header_len, data, data_len); - } + hash = fnv1a_128_3(header, header_len, data, data_len, + (unsigned char *) "Client", 6); serialize_fnv128_short(hash, md); memcpy(buf_out, header, header_len); @@ -1743,10 +2985,98 @@ lsquic_enc_session_encrypt (lsquic_enc_session_t *enc_session, } +/* server */ +/* out_len should have init value as the max length of out */ +/* return -1 error, 0, SHLO, 1, RTT1, 2, RTT2, DELAYED */ +static enum handshake_error +lsquic_enc_session_handle_chlo(enc_session_t *enc_session_p, + enum lsquic_version version, + const uint8_t *in, int in_len, time_t t, + const struct sockaddr *peer, + const struct sockaddr *local, + uint8_t *out, size_t *out_len, + uint8_t nonce[DNONC_LENGTH], int *nonce_set) +{ + struct lsquic_enc_session *const enc_session = enc_session_p; + enum handshake_error rtt; + int len; + lsquic_server_config_t *server_config; + const struct lsquic_engine_public *const enpub = enc_session->enpub; + const struct lsquic_shared_hash_if *const shi = enpub->enp_shi; + void *const shi_ctx = enpub->enp_shi_ctx; + + server_config = get_valid_scfg(enpub); + if (!server_config) + return HS_ERROR; + assert(server_config->lsc_scfg); + + enc_session->server_config = server_config; + + *nonce_set = 0; + rtt = handle_chlo_frames_data(in, in_len, enc_session, + enpub->enp_lookup_cert, enpub->enp_cert_lu_ctx, + local, shi, shi_ctx, peer, t); + if (rtt == HS_1RTT) + { + + LSQ_DEBUG("lsquic_enc_session_handle_chlo call gen_rej1_data"); + len = gen_rej1_data(enc_session, out, *out_len, peer, t); + if (len == -2) + { + rtt = HS_PK_OFFLOAD; + goto end; + } + if (len < 0) + { + rtt = HS_ERROR; + goto end; + } + *out_len = len; + } + else if (rtt == HS_SHLO) + { + enc_session->have_key = 0; + determine_keys(enc_session, 0); + enc_session->have_key = 1; + + if (lsquic_str_len(&enc_session->hs_ctx.stk) > 0) + { + shi->shi_delete(shi_ctx, lsquic_str_cstr(&enc_session->hs_ctx.stk), + lsquic_str_len(&enc_session->hs_ctx.stk)); + } + + LSQ_DEBUG("lsquic_enc_session_handle_chlo call gen_shlo_data"); + len = gen_shlo_data(out, *out_len, enc_session, version, peer, + t, nonce); + if (len < 0) + { + rtt = HS_ERROR; + goto end; + } + *out_len = len; + *nonce_set = 1; + + determine_diversification_key(enc_session, nonce, 0); + enc_session->have_key = 2; + determine_keys(enc_session, 0); + enc_session->have_key = 3; + + enc_session->hsk_state = HSK_COMPLETED; + LSQ_DEBUG("lsquic_enc_session_handle_chlo have_key 3 hsk_state HSK_COMPLETED."); + } + + end: + EV_LOG_CONN_EVENT(&enc_session->cid, "%s returning %s", __func__, + he2str(rtt)); + return rtt; +} + + static int -lsquic_enc_session_get_peer_option (const lsquic_enc_session_t *enc_session, +lsquic_enc_session_get_peer_option (enc_session_t *enc_session_p, uint32_t tag) { + struct lsquic_enc_session *const enc_session = enc_session_p; switch (tag) { case QTAG_NSTP: @@ -1764,9 +3094,10 @@ lsquic_enc_session_get_peer_option (const lsquic_enc_session_t *enc_session, * connection. */ static int -lsquic_enc_session_get_peer_setting (const lsquic_enc_session_t *enc_session, +lsquic_enc_session_get_peer_setting (enc_session_t *enc_session_p, uint32_t tag, uint32_t *val) { + struct lsquic_enc_session *const enc_session = enc_session_p; switch (tag) { case QTAG_TCID: @@ -1799,6 +3130,37 @@ lsquic_enc_session_get_peer_setting (const lsquic_enc_session_t *enc_session, * in CHLO or SHLO and which were not. Assume that zero means that * they weren't present. */ + if (IS_SERVER(enc_session)) + switch (tag) + { + case QTAG_CFCW: + if (enc_session->hs_ctx.scfcw) + { + *val = enc_session->hs_ctx.scfcw; + return 0; + } + else + return -1; + case QTAG_SFCW: + if (enc_session->hs_ctx.ssfcw) + { + *val = enc_session->hs_ctx.ssfcw; + return 0; + } + else + return -1; + case QTAG_MIDS: + if (enc_session->hs_ctx.smids) + { + *val = enc_session->hs_ctx.smids; + return 0; + } + else + return -1; + default: + return -1; + } + else switch (tag) { case QTAG_CFCW: @@ -1831,11 +3193,33 @@ lsquic_enc_session_get_peer_setting (const lsquic_enc_session_t *enc_session, } +static const char * +lsquic_enc_session_cipher (enc_session_t *enc_session_p) +{ + return LN_aes_128_gcm; /* TODO: get this string from enc_session */ +} + + +static int +lsquic_enc_session_keysize (enc_session_t *enc_session_p) +{ + return 128 /* bits */ / 8; /* TODO: get this info from enc_session */ +} + + +static int +lsquic_enc_session_alg_keysize (enc_session_t *enc_session_p) +{ + return 16; /* TODO: get this info from enc_session */ +} + + #if LSQUIC_KEEP_ENC_SESS_HISTORY static void -lsquic_get_enc_hist (const lsquic_enc_session_t *enc_session, +lsquic_get_enc_hist (enc_session_t *enc_session_p, char buf[(1 << ESHIST_BITS) + 1]) { + struct lsquic_enc_session *const enc_session = enc_session_p; const unsigned hist_idx = ESHIST_MASK & enc_session->es_hist_idx; if (enc_session->es_hist_buf[hist_idx] == ESHE_EMPTY) memcpy(buf, enc_session->es_hist_buf, hist_idx + 1); @@ -1851,11 +3235,107 @@ lsquic_get_enc_hist (const lsquic_enc_session_t *enc_session, #endif +static const char * +lsquic_enc_session_get_ua (enc_session_t *enc_session_p) +{ + struct lsquic_enc_session *const enc_session = enc_session_p; + if (enc_session && lsquic_str_len(&enc_session->hs_ctx.uaid) > 0) + return lsquic_str_buf(&enc_session->hs_ctx.uaid); + else + return NULL; +} + + +#if LSQUIC_ENABLE_HANDSHAKE_DISABLE +static void +set_handshake_completed (struct lsquic_enc_session *enc_session) +{ + enc_session->hsk_state = HSK_COMPLETED; +} + + +#endif + +static const char * +lsquic_enc_session_get_sni (enc_session_t *enc_session_p) +{ + struct lsquic_enc_session *const enc_session = enc_session_p; + return lsquic_str_cstr(&enc_session->hs_ctx.sni); +} + + +#ifndef NDEBUG +static uint8_t +lsquic_enc_session_have_key (enc_session_t *enc_session_p) +{ + struct lsquic_enc_session *const enc_session = enc_session_p; + return enc_session->have_key; +} + + +static void +lsquic_enc_session_set_have_key (enc_session_t *enc_session_p, uint8_t val) +{ + struct lsquic_enc_session *const enc_session = enc_session_p; + enc_session->have_key = val; +} + + +static const unsigned char * +lsquic_enc_session_get_enc_key_i (enc_session_t *enc_session_p) +{ + struct lsquic_enc_session *const enc_session = enc_session_p; + return enc_session->enc_key_i; +} + + +static const unsigned char * +lsquic_enc_session_get_dec_key_i (enc_session_t *enc_session_p) +{ + struct lsquic_enc_session *const enc_session = enc_session_p; + return enc_session->dec_key_i; +} + + +static const unsigned char * +lsquic_enc_session_get_enc_key_nonce_i (enc_session_t *enc_session_p) +{ + struct lsquic_enc_session *const enc_session = enc_session_p; + return enc_session->enc_key_nonce_i; +} + + +static const unsigned char * +lsquic_enc_session_get_dec_key_nonce_i (enc_session_t *enc_session_p) +{ + struct lsquic_enc_session *const enc_session = enc_session_p; + return enc_session->dec_key_nonce_i; +} + + +static const unsigned char * +lsquic_enc_session_get_enc_key_nonce_f (enc_session_t *enc_session_p) +{ + struct lsquic_enc_session *const enc_session = enc_session_p; + return enc_session->enc_key_nonce_f; +} + + +static const unsigned char * +lsquic_enc_session_get_dec_key_nonce_f (enc_session_t *enc_session_p) +{ + struct lsquic_enc_session *const enc_session = enc_session_p; + return enc_session->dec_key_nonce_f; +} + + +#endif /* not defined NDEBUG */ static size_t -lsquic_enc_session_mem_used (struct lsquic_enc_session *enc_session) +lsquic_enc_session_mem_used (enc_session_t *enc_session_p) { + struct lsquic_enc_session *const enc_session = enc_session_p; size_t size; size = sizeof(*enc_session); @@ -1865,6 +3345,7 @@ lsquic_enc_session_mem_used (struct lsquic_enc_session *enc_session) size += lsquic_str_len(&enc_session->ssno); size += lsquic_str_len(&enc_session->hs_ctx.ccs); + size += lsquic_str_len(&enc_session->hs_ctx.uaid); size += lsquic_str_len(&enc_session->hs_ctx.sni); size += lsquic_str_len(&enc_session->hs_ctx.ccrt); size += lsquic_str_len(&enc_session->hs_ctx.stk); @@ -1888,10 +3369,12 @@ lsquic_enc_session_mem_used (struct lsquic_enc_session *enc_session) static int -lsquic_enc_session_verify_reset_token (lsquic_enc_session_t *enc_session, +lsquic_enc_session_verify_reset_token (enc_session_t *enc_session_p, const unsigned char *buf, size_t bufsz) { + struct lsquic_enc_session *const enc_session = enc_session_p; if (bufsz == SRST_LENGTH + && 0 == (enc_session->es_flags & ES_SERVER) && (enc_session->hs_ctx.set & HSET_SRST) && 0 == memcmp(buf, enc_session->hs_ctx.srst, SRST_LENGTH)) return 0; @@ -1901,34 +3384,68 @@ lsquic_enc_session_verify_reset_token (lsquic_enc_session_t *enc_session, static int -lsquic_enc_session_did_zero_rtt_succeed (const lsquic_enc_session_t *enc_session) +lsquic_enc_session_did_zero_rtt_succeed (enc_session_t *enc_session_p) { + struct lsquic_enc_session *const enc_session = enc_session_p; return !(enc_session->es_flags & ES_RECV_REJ); } static int -lsquic_enc_session_is_zero_rtt_enabled (const lsquic_enc_session_t *enc_session) +lsquic_enc_session_is_zero_rtt_enabled (enc_session_t *enc_session_p) { + struct lsquic_enc_session *const enc_session = enc_session_p; return enc_session->info && enc_session->cert_item; } -static c_cert_item_t * -lsquic_enc_session_get_cert_item (const lsquic_enc_session_t *enc_session) +static ssize_t +gquic_really_encrypt_packet (struct lsquic_enc_session *enc_session, + const struct lsquic_conn *lconn, struct lsquic_packet_out *packet_out, + unsigned char *buf, size_t bufsz) { - return enc_session->cert_item; + int header_sz, is_hello_packet; + enum enc_level enc_level; + size_t packet_sz; + unsigned char header_buf[GQUIC_MAX_PUBHDR_SZ]; + + header_sz = lconn->cn_pf->pf_gen_reg_pkt_header(lconn, packet_out, + header_buf, sizeof(header_buf)); + if (header_sz < 0) + return -1; + + is_hello_packet = !!(packet_out->po_flags & PO_HELLO); + enc_level = gquic_encrypt_buf(enc_session, lconn->cn_version, 0, + packet_out->po_packno, header_buf, header_sz, + packet_out->po_data, packet_out->po_data_sz, + buf, bufsz, &packet_sz, is_hello_packet); + if ((int) enc_level >= 0) + { + LSQ_DEBUG("encrypted packet %"PRIu64"; plaintext is %zu bytes, " + "ciphertext is %zd bytes", + packet_out->po_packno, + lconn->cn_pf->pf_packout_size(lconn, packet_out) + + packet_out->po_data_sz, + packet_sz); + lsquic_packet_out_set_enc_level(packet_out, enc_level); + return packet_sz; + } + else + return -1; } static STACK_OF(X509) * -lsquic_enc_session_get_server_cert_chain (lsquic_enc_session_t *enc_session) +lsquic_enc_session_get_server_cert_chain (enc_session_t *enc_session_p) { + struct lsquic_enc_session *const enc_session = enc_session_p; const struct c_cert_item_st *item; STACK_OF(X509) *chain; X509 *cert; int i; + if (enc_session->es_flags & ES_SERVER) + return NULL; item = enc_session->cert_item; if (!item) { @@ -1956,86 +3473,190 @@ lsquic_enc_session_get_server_cert_chain (lsquic_enc_session_t *enc_session) } -ssize_t -lsquic_enc_session_get_zero_rtt (lsquic_enc_session_t *enc_session, - enum lsquic_version version, - void *buf, size_t len) +static void +maybe_dispatch_zero_rtt (enc_session_t *enc_session_p, + struct lsquic_conn *lconn, + void (*cb)(struct lsquic_conn *, const unsigned char *, size_t)) { + struct lsquic_enc_session *const enc_session = enc_session_p; + void *buf; + size_t sz; int i; - size_t sz = 0; - if (!enc_session->info || !enc_session->cert_item) + + if (!(enc_session->info && enc_session->cert_item && cb)) { - LSQ_DEBUG("client asked for rtt_into but it is not available"); - return 0; + LSQ_DEBUG("no zero-rtt information or callback is not set"); + return; } - for (i = 0; i < enc_session->cert_item->count; ++i) + + for (sz = 0, i = 0; i < enc_session->cert_item->count; ++i) { sz += sizeof(uint32_t); sz += lsquic_str_len(&enc_session->cert_item->crts[i]); } sz += sizeof(struct lsquic_zero_rtt_storage); - if (len < sz) + + buf = malloc(sz); + if (!buf) + { + LSQ_WARN("malloc failed: cannot allocate %zu bytes for zero-rtt", sz); + return; + } + + lsquic_enc_session_serialize_zero_rtt( + (struct lsquic_zero_rtt_storage *) buf, lconn->cn_version, + enc_session->info, enc_session->cert_item); + + cb(lconn, buf, sz); + free(buf); +} + + +#if LSQUIC_ENABLE_HANDSHAKE_DISABLE +static ssize_t +just_copy_packet (const struct lsquic_conn *lconn, + const struct lsquic_packet_out *packet_out, unsigned char *buf, + size_t bufsz) +{ + int header_sz; + + header_sz = lconn->cn_pf->pf_gen_reg_pkt_header(lconn, packet_out, + buf, bufsz); + if (header_sz < 0) + return -1; + + if ((unsigned) header_sz + packet_out->po_data_sz > bufsz) { - LSQ_DEBUG("client provided buf is too small %zu < %zu", len, sz); - errno = ENOBUFS; + LSQ_WARN("packet too large (%d bytes) to encrypt", + header_sz + packet_out->po_data_sz); return -1; } - lsquic_enc_session_serialize_zero_rtt((struct lsquic_zero_rtt_storage *)buf, - version, enc_session->info, - enc_session->cert_item); - return sz; + + memcpy(buf + header_sz, packet_out->po_data, packet_out->po_data_sz); + return header_sz + packet_out->po_data_sz; +} + + +#endif + + +static enum enc_packout +gquic_encrypt_packet (enc_session_t *enc_session_p, + const struct lsquic_engine_public *enpub, + struct lsquic_conn *lconn, struct lsquic_packet_out *packet_out) +{ + struct lsquic_enc_session *const enc_session = enc_session_p; + ssize_t enc_sz; + size_t bufsz; + unsigned sent_sz; + unsigned char *buf; + int ipv6; + + bufsz = lconn->cn_pf->pf_packout_size(lconn, packet_out); + if (bufsz > USHRT_MAX) + return ENCPA_BADCRYPT; /* To cause connection to close */ + ipv6 = NP_IS_IPv6(packet_out->po_path); + buf = enpub->enp_pmi->pmi_allocate(enpub->enp_pmi_ctx, + packet_out->po_path->np_peer_ctx, bufsz, ipv6); + if (!buf) + { + LSQ_DEBUG("could not allocate memory for outgoing packet of size %zd", + bufsz); + return ENCPA_NOMEM; + } + +#if LSQUIC_ENABLE_HANDSHAKE_DISABLE + if (getenv("LSQUIC_DISABLE_HANDSHAKE")) + { + enc_sz = just_copy_packet(lconn, packet_out, buf, bufsz); + sent_sz = enc_sz + GQUIC_PACKET_HASH_SZ; + } + else +#endif + { + enc_sz = gquic_really_encrypt_packet(enc_session, + lconn, packet_out, buf, bufsz); + sent_sz = enc_sz; + } + + if (enc_sz < 0) + { + enpub->enp_pmi->pmi_return(enpub->enp_pmi_ctx, + packet_out->po_path->np_peer_ctx, buf, ipv6); + return ENCPA_BADCRYPT; + } + + packet_out->po_enc_data = buf; + packet_out->po_enc_data_sz = enc_sz; + packet_out->po_sent_sz = sent_sz; + packet_out->po_flags &= ~PO_IPv6; + packet_out->po_flags |= PO_ENCRYPTED|PO_SENT_SZ|(ipv6 << POIPv6_SHIFT); + + return ENCPA_OK; } #ifdef NDEBUG const #endif -struct enc_session_funcs lsquic_enc_session_gquic_1 = +struct enc_session_funcs_common lsquic_enc_session_common_gquic_1 = { .esf_global_init = lsquic_handshake_init, .esf_global_cleanup = lsquic_handshake_cleanup, + .esf_cipher = lsquic_enc_session_cipher, + .esf_keysize = lsquic_enc_session_keysize, + .esf_alg_keysize = lsquic_enc_session_alg_keysize, + .esf_get_sni = lsquic_enc_session_get_sni, + .esf_encrypt_packet = gquic_encrypt_packet, + .esf_decrypt_packet = gquic_decrypt_packet, + .esf_tag_len = GQUIC_PACKET_HASH_SZ, + .esf_get_server_cert_chain = lsquic_enc_session_get_server_cert_chain, + .esf_verify_reset_token = lsquic_enc_session_verify_reset_token, + .esf_did_zero_rtt_succeed = lsquic_enc_session_did_zero_rtt_succeed, + .esf_is_zero_rtt_enabled = lsquic_enc_session_is_zero_rtt_enabled, +}; + + +#ifdef NDEBUG +const +#endif +struct enc_session_funcs_gquic lsquic_enc_session_gquic_gquic_1 = +{ #if LSQUIC_KEEP_ENC_SESS_HISTORY .esf_get_hist = lsquic_get_enc_hist, #endif .esf_destroy = lsquic_enc_session_destroy, .esf_is_hsk_done = lsquic_enc_session_is_hsk_done, - .esf_encrypt = lsquic_enc_session_encrypt, - .esf_decrypt = lsquic_enc_session_decrypt, .esf_get_peer_setting = lsquic_enc_session_get_peer_setting, .esf_get_peer_option = lsquic_enc_session_get_peer_option, + .esf_create_server = lsquic_enc_session_create_server, + .esf_handle_chlo = lsquic_enc_session_handle_chlo, + .esf_get_ua = lsquic_enc_session_get_ua, + .esf_have_key_gt_one = lsquic_enc_session_have_key_gt_one, +#ifndef NDEBUG + .esf_determine_diversification_key = determine_diversification_key, + .esf_have_key = lsquic_enc_session_have_key, + .esf_set_have_key = lsquic_enc_session_set_have_key, + .esf_get_enc_key_i = lsquic_enc_session_get_enc_key_i, + .esf_get_dec_key_i = lsquic_enc_session_get_dec_key_i, + .esf_get_enc_key_nonce_i = lsquic_enc_session_get_enc_key_nonce_i, + .esf_get_dec_key_nonce_i = lsquic_enc_session_get_dec_key_nonce_i, + .esf_get_enc_key_nonce_f = lsquic_enc_session_get_enc_key_nonce_f, + .esf_get_dec_key_nonce_f = lsquic_enc_session_get_dec_key_nonce_f, +#endif /* !defined(NDEBUG) */ +#if LSQUIC_ENABLE_HANDSHAKE_DISABLE + .esf_set_handshake_completed = set_handshake_completed, +#endif .esf_create_client = lsquic_enc_session_create_client, - .esf_generate_cid = lsquic_generate_cid, .esf_gen_chlo = lsquic_enc_session_gen_chlo, .esf_handle_chlo_reply = lsquic_enc_session_handle_chlo_reply, .esf_mem_used = lsquic_enc_session_mem_used, - .esf_verify_reset_token = lsquic_enc_session_verify_reset_token, - .esf_did_zero_rtt_succeed = lsquic_enc_session_did_zero_rtt_succeed, - .esf_is_zero_rtt_enabled = lsquic_enc_session_is_zero_rtt_enabled, - .esf_get_cert_item = lsquic_enc_session_get_cert_item, - .esf_get_server_cert_chain = lsquic_enc_session_get_server_cert_chain, - .esf_get_zero_rtt = lsquic_enc_session_get_zero_rtt, -}; - - -const char *const lsquic_enclev2str[] = -{ - [ENC_LEV_UNSET] = "unset", - [ENC_LEV_CLEAR] = "clear", - [ENC_LEV_INIT] = "initial", - [ENC_LEV_FORW] = "forw-secure", + .esf_maybe_dispatch_zero_rtt = maybe_dispatch_zero_rtt, + .esf_reset_cid = lsquic_enc_session_reset_cid, }; -enum lsquic_version -lsquic_zero_rtt_version (const unsigned char *buf, size_t bufsz) -{ - lsquic_ver_tag_t tag; +typedef char reset_token_lengths_match[ + SRST_LENGTH == IQUIC_SRESET_TOKEN_SZ ? 1 : -1]; - if (bufsz >= sizeof(tag)) - { - memcpy(&tag, buf, sizeof(tag)); - return lsquic_tag2ver(tag); - } - else - return -1; -} + diff --git a/src/liblsquic/lsquic_handshake.h b/src/liblsquic/lsquic_handshake.h index 8c0b4f130..9433adcf6 100644 --- a/src/liblsquic/lsquic_handshake.h +++ b/src/liblsquic/lsquic_handshake.h @@ -1,207 +1,115 @@ /* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ -#ifndef LSQUIC_HANDSHAKE_SERVER_H -#define LSQUIC_HANDSHAKE_SERVER_H +#ifndef LSQUIC_HANDSHAKE_H +#define LSQUIC_HANDSHAKE_H 1 -struct lsquic_engine_public; -struct lsquic_enc_session; -struct stack_st_X509; - -typedef struct lsquic_enc_session lsquic_enc_session_t; - -#define MAX_SCFG_LENGTH 512 -#define MAX_SPUBS_LENGTH 32 -#define STK_LENGTH 60 -#define SNO_LENGTH 56 -#define SCID_LENGTH 16 -#define DNONC_LENGTH 32 #define aes128_key_len 16 #define aes128_iv_len 4 -#define SRST_LENGTH 16 +#define STK_LENGTH 60 +#define SCID_LENGTH 16 -enum handshake_error /* TODO: rename this enum */ -{ - DATA_NOT_ENOUGH = -2, - DATA_FORMAT_ERROR = -1, - HS_ERROR = -1, - DATA_NO_ERROR = 0, - HS_SHLO = 0, - HS_1RTT = 1, - HS_2RTT = 2, -}; +struct lsquic_server_config; +struct sockaddr; +struct lsquic_str; +struct lsquic_packet_in; +struct lsquic_cid; -enum enc_level +/* client side, certs and hashs + */ +typedef struct cert_hash_item_st { - ENC_LEV_UNSET, - ENC_LEV_CLEAR, - ENC_LEV_INIT, - ENC_LEV_FORW, -}; + struct lsquic_str* domain; /*with port, such as "xyz.com:8088" as the key */ + struct lsquic_str* crts; + struct lsquic_str* hashs; + struct lsquic_hash_elem hash_el; + int count; +} cert_hash_item_t; + +#ifndef NDEBUG +void gen_stk(struct lsquic_server_config *, const struct sockaddr *ip_addr, uint64_t tm, + unsigned char stk_out[STK_LENGTH]); +enum hsk_failure_reason +verify_stk0(struct lsquic_server_config *, const struct sockaddr *ip_addr, uint64_t tm, + struct lsquic_str *stk, + unsigned secs_since_stk_generated); +enum hsk_failure_reason +verify_stk(void *, const struct sockaddr *ip_addr, + uint64_t tm, struct lsquic_str *stk); +struct cert_hash_item_st* c_find_certs(const struct lsquic_str *domain); +#endif -extern const char *const lsquic_enclev2str[]; +#define SNO_LENGTH 56 -/* client */ -typedef struct c_cert_item_st -{ - struct lsquic_str* crts; - struct lsquic_str* hashs; - int count; -} c_cert_item_t; +/* EVP_AEAD_CTX from boringssl pre-18d9f28f0df9f95570. */ +struct old_evp_aead_ctx_st { + void *ptr1; /* aead */ + void *ptr2; /* aead_state */ +}; -/* client side need to store 0rtt info per STK */ -typedef struct lsquic_session_cache_info_st +/* Server need refresh SCFG once a day */ +/* can not use sizeof() to get the size */ +typedef struct SCFG_info_st { unsigned char sscid[SCID_LENGTH]; - unsigned char spubs[32]; /* server pub key for next time 0rtt */ - uint32_t ver; /* one VERSION */ - uint32_t aead; - uint32_t kexs; - uint32_t pdmd; - uint64_t orbt; - uint64_t expy; - int scfg_flag; /* 0, no-init, 1, no parse, 2, parsed */ - struct lsquic_str sstk; - struct lsquic_str scfg; - struct lsquic_str sni_key; /* This is only used as key */ - -} lsquic_session_cache_info_t; + unsigned char priv_key[32]; + unsigned char skt_key[16]; + uint32_t aead; /* Fixed, ONLY AESG */ + uint32_t kexs; /* Fixed, ONLY C255 */ + uint32_t pdmd; /* Fixed, ONLY X509 */ + uint64_t orbt; /* Fixed, 0 */ + uint64_t expy; + /* Keep the hole for compatibility with older builds of LSWS: */ + struct old_evp_aead_ctx_st unused +#if __GNUC__ + __attribute__((deprecated)) +#endif + ; + short scfg_len; +} SCFG_info_t; -struct lsquic_zero_rtt_storage +struct SCFG_st { - uint32_t quic_version_tag; - uint32_t serializer_version; - uint32_t ver; - uint32_t aead; - uint32_t kexs; - uint32_t pdmd; - uint64_t orbt; - uint64_t expy; - uint64_t sstk_len; - uint64_t scfg_len; - uint64_t scfg_flag; - uint8_t sstk[STK_LENGTH]; - uint8_t scfg[MAX_SCFG_LENGTH]; - uint8_t sscid[SCID_LENGTH]; - uint8_t spubs[MAX_SPUBS_LENGTH]; - uint32_t cert_count; -/* - * uint32_t cert_len; - * uint8_t cert_data[0]; - */ + SCFG_info_t info; + unsigned char scfg[]; /* whoile buffer */ }; +typedef struct SCFG_st SCFG_t; +/* server side need to store STK with expired time */ -#ifndef LSQUIC_KEEP_ENC_SESS_HISTORY -# ifndef NDEBUG -# define LSQUIC_KEEP_ENC_SESS_HISTORY 1 -# else -# define LSQUIC_KEEP_ENC_SESS_HISTORY 0 -# endif -#endif - -#if LSQUIC_KEEP_ENC_SESS_HISTORY -#define ESHIST_BITS 7 -#define ESHIST_MASK ((1 << ESHIST_BITS) - 1) -#define ESHIST_STR_SIZE ((1 << ESHIST_BITS) + 1) -#endif - -struct enc_session_funcs +typedef struct lsquic_server_config { - /* Global initialization: call once per implementation */ - int (*esf_global_init)(int flags); - - /* Global cleanup: call once per implementation */ - void (*esf_global_cleanup) (void); + SCFG_t *lsc_scfg; /* This part is stored in SHM */ + EVP_AEAD_CTX lsc_stk_ctx; +} lsquic_server_config_t; -#if LSQUIC_KEEP_ENC_SESS_HISTORY - /* Grab encryption session history */ - void (*esf_get_hist) (const lsquic_enc_session_t *, - char buf[ESHIST_STR_SIZE]); -#endif - - /* Destroy enc session */ - void (*esf_destroy)(lsquic_enc_session_t *enc_session); - - /* Return true if handshake has been completed */ - int (*esf_is_hsk_done)(lsquic_enc_session_t *enc_session); - - /* Encrypt buffer */ - enum enc_level (*esf_encrypt)(lsquic_enc_session_t *enc_session, - enum lsquic_version, uint8_t path_id, uint64_t pack_num, - const unsigned char *header, size_t header_len, - const unsigned char *data, size_t data_len, - unsigned char *buf_out, size_t max_out_len, size_t *out_len, - int is_hello); - - /** Decrypt buffer - * - * If decryption is successful, decryption level is returned. Otherwise, - * the return value is -1. - */ - enum enc_level (*esf_decrypt)(lsquic_enc_session_t *enc_session, - enum lsquic_version, - uint8_t path_id, uint64_t pack_num, - unsigned char *buf, size_t *header_len, size_t data_len, - unsigned char *diversification_nonce, - unsigned char *buf_out, size_t max_out_len, size_t *out_len); - - /* Get value of setting specified by `tag' */ - int (*esf_get_peer_setting) (const lsquic_enc_session_t *, uint32_t tag, - uint32_t *val); - - /* Get value of peer option (that from COPT array) */ - int (*esf_get_peer_option) (const lsquic_enc_session_t *enc_session, - uint32_t tag); - - /* Create client session */ - lsquic_enc_session_t * - (*esf_create_client) (const char *domain, lsquic_cid_t cid, - const struct lsquic_engine_public *, - const unsigned char *, size_t); - - /* Generate connection ID */ - lsquic_cid_t (*esf_generate_cid) (void); - - /* -1 error, 0, OK, response in `buf' */ - int - (*esf_gen_chlo) (lsquic_enc_session_t *, enum lsquic_version, - uint8_t *buf, size_t *len); - - int - (*esf_handle_chlo_reply) (lsquic_enc_session_t *, - const uint8_t *data, int len); - - size_t - (*esf_mem_used)(lsquic_enc_session_t *); - - int - (*esf_verify_reset_token) (lsquic_enc_session_t *, const unsigned char *, - size_t); - - int - (*esf_did_zero_rtt_succeed) (const lsquic_enc_session_t *); - - int - (*esf_is_zero_rtt_enabled) (const lsquic_enc_session_t *); - - c_cert_item_t * - (*esf_get_cert_item) (const lsquic_enc_session_t *); - - struct stack_st_X509 * - (*esf_get_server_cert_chain) (lsquic_enc_session_t *); - - ssize_t - (*esf_get_zero_rtt) (lsquic_enc_session_t *, enum lsquic_version, - void *, size_t); +/* Based on enum HandshakeFailureReason in Chromium */ +enum hsk_failure_reason +{ + HFR_HANDSHAKE_OK = 0, + + /* Invalid client nonce in CHLO: */ + HFR_CLIENT_NONCE_UNKNOWN = 1, /* Default nonce failure */ + HFR_CLIENT_NONCE_INVALID = 2, /* Incorrect nonce length */ + HFR_CLIENT_NONCE_NOT_UNIQ = 3, + HFR_CLIENT_NONCE_INVALID_ORBIT = 4, + HFR_CLIENT_NONCE_INVALID_TIME = 5, + + /* Invalid server nonce in CHLO: */ + HFR_SERVER_NONCE_DECRYPTION = 8, + HFR_SERVER_NONCE_INVALID = 9, + HFR_SERVER_NONCE_NOT_UNIQUE = 10, + HFR_SERVER_NONCE_INVALID_TIME = 11, + HFR_SERVER_NONCE_REQUIRED = 20, + + HFR_CONFIG_INCHOATE_HELLO = 12, /* Missing SCID tag */ + HFR_CONFIG_UNKNOWN_CONFIG = 13, /* Could not find server config SCID */ + HFR_SRC_ADDR_TOKEN_INVALID = 14, /* Missing STK tag */ + HFR_SRC_ADDR_TOKEN_DECRYPTION = 15, + HFR_SRC_ADDR_TOKEN_PARSE = 16, + HFR_SRC_ADDR_TOKEN_DIFFERENT_IP_ADDRESS = 17, + HFR_SRC_ADDR_TOKEN_CLOCK_SKEW = 18, + HFR_SRC_ADDR_TOKEN_EXPIRED = 19, + HFR_INVALID_EXPECTED_LEAF_CERTIFICATE = 21, }; -extern -#ifdef NDEBUG -const -#endif -struct enc_session_funcs lsquic_enc_session_gquic_1; - -#define select_esf_by_ver(ver) \ - (ver ? &lsquic_enc_session_gquic_1 : &lsquic_enc_session_gquic_1) - enum lsquic_version lsquic_zero_rtt_version (const unsigned char *, size_t); diff --git a/src/liblsquic/lsquic_hash.c b/src/liblsquic/lsquic_hash.c index 15d646558..689497825 100644 --- a/src/liblsquic/lsquic_hash.c +++ b/src/liblsquic/lsquic_hash.c @@ -12,21 +12,9 @@ #include #endif -#include "lsquic_malo.h" #include "lsquic_hash.h" #include "lsquic_xxhash.h" -struct lsquic_hash_elem -{ - TAILQ_ENTRY(lsquic_hash_elem) - qhe_next_bucket, - qhe_next_all; - const void *qhe_key_data; - unsigned qhe_key_len; - void *qhe_value; - unsigned qhe_hash_val; -}; - TAILQ_HEAD(hels_head, lsquic_hash_elem); #define N_BUCKETS(n_bits) (1U << (n_bits)) @@ -36,7 +24,6 @@ struct lsquic_hash { struct hels_head *qh_buckets, qh_all; - struct malo *qh_malo_els; struct lsquic_hash_elem *qh_iter_next; unsigned qh_count; unsigned qh_nbits; @@ -48,7 +35,6 @@ lsquic_hash_create (void) { struct hels_head *buckets; struct lsquic_hash *hash; - struct malo *malo; unsigned nbits = 2; unsigned i; @@ -63,21 +49,12 @@ lsquic_hash_create (void) return NULL; } - malo = lsquic_malo_create(sizeof(struct lsquic_hash_elem)); - if (!malo) - { - free(hash); - free(buckets); - return NULL; - } - for (i = 0; i < N_BUCKETS(nbits); ++i) TAILQ_INIT(&buckets[i]); TAILQ_INIT(&hash->qh_all); hash->qh_buckets = buckets; hash->qh_nbits = nbits; - hash->qh_malo_els = malo; hash->qh_iter_next = NULL; hash->qh_count = 0; return hash; @@ -87,7 +64,6 @@ lsquic_hash_create (void) void lsquic_hash_destroy (struct lsquic_hash *hash) { - lsquic_malo_destroy(hash->qh_malo_els); free(hash->qh_buckets); free(hash); } @@ -129,21 +105,16 @@ lsquic_hash_grow (struct lsquic_hash *hash) struct lsquic_hash_elem * lsquic_hash_insert (struct lsquic_hash *hash, const void *key, - unsigned key_sz, void *data) + unsigned key_sz, void *value, struct lsquic_hash_elem *el) { unsigned buckno, hash_val; - struct lsquic_hash_elem *el; - el = lsquic_malo_get(hash->qh_malo_els); - if (!el) + if (el->qhe_flags & QHE_HASHED) return NULL; if (hash->qh_count >= N_BUCKETS(hash->qh_nbits) / 2 && 0 != lsquic_hash_grow(hash)) - { - lsquic_malo_put(el); return NULL; - } hash_val = XXH64(key, key_sz, (uintptr_t) hash); buckno = BUCKNO(hash->qh_nbits, hash_val); @@ -151,8 +122,9 @@ lsquic_hash_insert (struct lsquic_hash *hash, const void *key, TAILQ_INSERT_TAIL(&hash->qh_buckets[buckno], el, qhe_next_bucket); el->qhe_key_data = key; el->qhe_key_len = key_sz; - el->qhe_value = data; + el->qhe_value = value; el->qhe_hash_val = hash_val; + el->qhe_flags |= QHE_HASHED; ++hash->qh_count; return el; } @@ -178,22 +150,18 @@ lsquic_hash_find (struct lsquic_hash *hash, const void *key, unsigned key_sz) } -void * -lsquic_hashelem_getdata (const struct lsquic_hash_elem *el) -{ - return el->qhe_value; -} - - void lsquic_hash_erase (struct lsquic_hash *hash, struct lsquic_hash_elem *el) { unsigned buckno; + assert(el->qhe_flags & QHE_HASHED); buckno = BUCKNO(hash->qh_nbits, el->qhe_hash_val); + if (hash->qh_iter_next == el) + hash->qh_iter_next = TAILQ_NEXT(el, qhe_next_all); TAILQ_REMOVE(&hash->qh_buckets[buckno], el, qhe_next_bucket); TAILQ_REMOVE(&hash->qh_all, el, qhe_next_all); - lsquic_malo_put(el); + el->qhe_flags &= ~QHE_HASHED; --hash->qh_count; } @@ -235,6 +203,5 @@ size_t lsquic_hash_mem_used (const struct lsquic_hash *hash) { return sizeof(*hash) - + N_BUCKETS(hash->qh_nbits) * sizeof(hash->qh_buckets[0]) - + lsquic_malo_mem_used(hash->qh_malo_els); + + N_BUCKETS(hash->qh_nbits) * sizeof(hash->qh_buckets[0]); } diff --git a/src/liblsquic/lsquic_hash.h b/src/liblsquic/lsquic_hash.h index d55cf196b..8b0037a95 100644 --- a/src/liblsquic/lsquic_hash.h +++ b/src/liblsquic/lsquic_hash.h @@ -7,7 +7,20 @@ #define LSQUIC_HASH_H struct lsquic_hash; -struct lsquic_hash_elem; + +struct lsquic_hash_elem +{ + TAILQ_ENTRY(lsquic_hash_elem) + qhe_next_bucket, + qhe_next_all; + const void *qhe_key_data; + void *qhe_value; + unsigned qhe_key_len; + unsigned qhe_hash_val; + enum { + QHE_HASHED = 1 << 0, + } qhe_flags; +}; struct lsquic_hash * lsquic_hash_create (void); @@ -17,13 +30,12 @@ lsquic_hash_destroy (struct lsquic_hash *); struct lsquic_hash_elem * lsquic_hash_insert (struct lsquic_hash *, const void *key, unsigned key_sz, - void *data); + void *value, struct lsquic_hash_elem *); struct lsquic_hash_elem * lsquic_hash_find (struct lsquic_hash *, const void *key, unsigned key_sz); -void * -lsquic_hashelem_getdata (const struct lsquic_hash_elem *); +#define lsquic_hashelem_getdata(el) ((el)->qhe_value) void lsquic_hash_erase (struct lsquic_hash *, struct lsquic_hash_elem *); diff --git a/src/liblsquic/lsquic_hcsi_reader.c b/src/liblsquic/lsquic_hcsi_reader.c new file mode 100644 index 000000000..84d74f91c --- /dev/null +++ b/src/liblsquic/lsquic_hcsi_reader.c @@ -0,0 +1,221 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#include +#include +#include +#include +#include +#include + +#include "lsquic.h" +#include "lsquic_int_types.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" +#include "lsquic_conn.h" +#include "lsquic_hcsi_reader.h" + +#define LSQUIC_LOGGER_MODULE LSQLM_HCSI_READER +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(reader->hr_conn) +#include "lsquic_logger.h" + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) + + +void +lsquic_hcsi_reader_init (struct hcsi_reader *reader, + struct lsquic_conn *conn, const struct hcsi_callbacks *callbacks, + void *ctx) +{ + memset(reader, 0, sizeof(*reader)); + reader->hr_state = HR_READ_FRAME_BEGIN; + reader->hr_conn = conn; + reader->hr_cb = callbacks; + reader->hr_ctx = ctx; + LSQ_DEBUG("initialized"); +} + + +int +lsquic_hcsi_reader_feed (struct hcsi_reader *reader, const void *buf, + size_t bufsz) +{ + const unsigned char *p = buf; + const unsigned char *const end = p + bufsz; + + const unsigned char *orig_p; + enum h3_prio_frame_read_status prio_status; + uint64_t len; + int s; + + while (p < end) + { + switch (reader->hr_state) + { + case HR_READ_FRAME_BEGIN: + reader->hr_u.vint2_state.vr2s_state = 0; + reader->hr_state = HR_READ_FRAME_CONTINUE; + /* fall-through */ + case HR_READ_FRAME_CONTINUE: + s = lsquic_varint_read_two(&p, end, &reader->hr_u.vint2_state); + if (s < 0) + break; + reader->hr_frame_type = reader->hr_u.vint2_state.vr2s_one; + reader->hr_frame_length = reader->hr_u.vint2_state.vr2s_two; + switch (reader->hr_frame_type) + { + case HQFT_SETTINGS: + if (reader->hr_frame_length) + { + reader->hr_state = HR_READ_SETTING_BEGIN; + reader->hr_nread = 0; + } + else + { + reader->hr_cb->on_settings_frame(reader->hr_ctx); + reader->hr_state = HR_READ_FRAME_BEGIN; + } + break; + case HQFT_PRIORITY: + reader->hr_state = HR_READ_PRIORITY_BEGIN; + break; + case HQFT_GOAWAY: + reader->hr_state = HR_READ_VARINT; + break; + case HQFT_CANCEL_PUSH: + reader->hr_state = HR_READ_VARINT; + break; + case HQFT_MAX_PUSH_ID: + reader->hr_state = HR_READ_VARINT; + break; + case HQFT_DATA: + case HQFT_HEADERS: + case HQFT_PUSH_PROMISE: + reader->hr_cb->on_unexpected_frame(reader->hr_ctx, + reader->hr_frame_type); + return -1; + default: + if (!(reader->hr_frame_type >= 0xB && + (reader->hr_frame_type - 0xB) % 0x1F == 0)) + LSQ_INFO("unknown frame type 0x%"PRIX64" -- skipping", + reader->hr_frame_type); + reader->hr_state = HR_SKIPPING; + LSQ_DEBUG("unknown frame 0x%"PRIX64": will skip %"PRIu64" bytes", + reader->hr_frame_type, reader->hr_frame_length); + break; + } + break; + case HR_READ_VARINT: + reader->hr_u.vint_state.pos = 0; + reader->hr_state = HR_READ_VARINT_CONTINUE; + reader->hr_nread = 0; + /* fall-through */ + case HR_READ_VARINT_CONTINUE: + orig_p = p; + s = lsquic_varint_read_nb(&p, end, &reader->hr_u.vint_state); + reader->hr_nread += p - orig_p; + if (0 == s) + { + if (reader->hr_nread != reader->hr_frame_length) + { + reader->hr_conn->cn_if->ci_abort_error(reader->hr_conn, 1, + HEC_MALFORMED_FRAME + reader->hr_frame_type, + "Frame length does not match actual payload length"); + reader->hr_state = HR_ERROR; + return -1; + } + switch (reader->hr_frame_type) + { + case HQFT_GOAWAY: + reader->hr_cb->on_goaway(reader->hr_ctx, + reader->hr_u.vint_state.val); + break; + case HQFT_CANCEL_PUSH: + reader->hr_cb->on_cancel_push(reader->hr_ctx, + reader->hr_u.vint_state.val); + break; + case HQFT_MAX_PUSH_ID: + reader->hr_cb->on_max_push_id(reader->hr_ctx, + reader->hr_u.vint_state.val); + break; + default: + assert(0); + } + reader->hr_state = HR_READ_FRAME_BEGIN; + break; + } + else + { + assert(p == end); + return 0; + } + case HR_SKIPPING: + len = MIN((uintptr_t) (end - p), reader->hr_frame_length); + p += len; + reader->hr_frame_length -= len; + if (0 == reader->hr_frame_length) + reader->hr_state = HR_READ_FRAME_BEGIN; + break; + case HR_READ_SETTING_BEGIN: + reader->hr_u.vint2_state.vr2s_state = 0; + reader->hr_state = HR_READ_SETTING_CONTINUE; + /* fall-through */ + case HR_READ_SETTING_CONTINUE: + orig_p = p; + s = lsquic_varint_read_two(&p, end, &reader->hr_u.vint2_state); + reader->hr_nread += p - orig_p; + if (reader->hr_nread > reader->hr_frame_length) + { + reader->hr_conn->cn_if->ci_abort_error(reader->hr_conn, 1, + HEC_MALFORMED_FRAME + HQFT_SETTINGS, + "SETTING frame contents too long"); + reader->hr_state = HR_ERROR; + return -1; + } + if (s < 0) + break; + reader->hr_cb->on_setting(reader->hr_ctx, + reader->hr_u.vint2_state.vr2s_one, + reader->hr_u.vint2_state.vr2s_two); + if (reader->hr_nread >= reader->hr_frame_length) + { + reader->hr_state = HR_READ_FRAME_BEGIN; + reader->hr_cb->on_settings_frame(reader->hr_ctx); + } + else + reader->hr_state = HR_READ_SETTING_BEGIN; + break; + case HR_READ_PRIORITY_BEGIN: + reader->hr_u.prio.h3pfrs_state = 0; + reader->hr_nread = 0; + reader->hr_state = HR_READ_PRIORITY_CONTINUE; + /* fall-through */ + case HR_READ_PRIORITY_CONTINUE: + orig_p = p; + prio_status = lsquic_h3_prio_frame_read(&p, end - p, + &reader->hr_u.prio); + reader->hr_nread += p - orig_p; + if (prio_status == H3PFR_STATUS_DONE) + { + if (reader->hr_nread != reader->hr_frame_length) + { + reader->hr_conn->cn_if->ci_abort_error(reader->hr_conn, 1, + HEC_MALFORMED_FRAME + HQFT_PRIORITY, "PRIORITY frame " + "contents size does not match frame length"); + reader->hr_state = HR_ERROR; + return -1; + } + reader->hr_state = HR_READ_FRAME_BEGIN; + reader->hr_cb->on_priority(reader->hr_ctx, + &reader->hr_u.prio.h3pfrs_prio); + } + break; + default: + assert(0); + /* fall-through */ + case HR_ERROR: + return -1; + } + } + + return 0; +} diff --git a/src/liblsquic/lsquic_hcsi_reader.h b/src/liblsquic/lsquic_hcsi_reader.h new file mode 100644 index 000000000..f87c5bbdc --- /dev/null +++ b/src/liblsquic/lsquic_hcsi_reader.h @@ -0,0 +1,61 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_hcsi_reader.h -- HTTP Control Stream Incoming (HCSI) reader + */ + +#ifndef LSQUIC_HCSI_READER_H +#define LSQUIC_HCSI_READER_H 1 + +struct lsquic_conn; + + +struct hcsi_callbacks +{ + void (*on_priority)(void *ctx, const struct hq_priority *); + void (*on_cancel_push)(void *ctx, uint64_t push_id); + void (*on_max_push_id)(void *ctx, uint64_t push_id); + /* Gets called at the *end* of the SETTING frame */ + void (*on_settings_frame)(void *ctx); + void (*on_setting)(void *ctx, uint64_t setting_id, uint64_t value); + void (*on_goaway)(void *ctx, uint64_t stream_id); + void (*on_unexpected_frame)(void *ctx, uint64_t frame_type); +}; + + +struct hcsi_reader +{ + enum { + HR_READ_FRAME_BEGIN, + HR_READ_FRAME_CONTINUE, + HR_SKIPPING, + HR_READ_SETTING_BEGIN, + HR_READ_SETTING_CONTINUE, + HR_READ_PRIORITY_BEGIN, + HR_READ_PRIORITY_CONTINUE, + HR_READ_VARINT, + HR_READ_VARINT_CONTINUE, + HR_ERROR, + } hr_state; + struct lsquic_conn *hr_conn; + uint64_t hr_frame_type; + uint64_t hr_frame_length; + union + { + struct varint_read_state vint_state; + struct varint_read2_state vint2_state; + struct h3_prio_frame_read_state prio; + } hr_u; + const struct hcsi_callbacks *hr_cb; + void *hr_ctx; + unsigned hr_nread; /* Used for PRIORITY and SETTINGS frames */ +}; + + +void +lsquic_hcsi_reader_init (struct hcsi_reader *, struct lsquic_conn *, + const struct hcsi_callbacks *, void *cb_ctx); + +int +lsquic_hcsi_reader_feed (struct hcsi_reader *, const void *buf, size_t bufsz); + +#endif diff --git a/src/liblsquic/lsquic_hcso_writer.c b/src/liblsquic/lsquic_hcso_writer.c new file mode 100644 index 000000000..4e6d40c43 --- /dev/null +++ b/src/liblsquic/lsquic_hcso_writer.c @@ -0,0 +1,367 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_hcso_writer.c - write to outgoing HTTP Control Stream + */ + +#include +#include +#include +#include +#include + +#include "lsquic.h" +#include "lsquic_types.h" +#include "lsquic_int_types.h" +#include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" +#include "lsquic_stream.h" +#include "lsquic_frab_list.h" +#include "lsquic_varint.h" +#include "lsquic_byteswap.h" +#include "lsquic_hcso_writer.h" + +#define LSQUIC_LOGGER_MODULE LSQLM_HCSO_WRITER +#define LSQUIC_LOG_CONN_ID \ + lsquic_conn_log_cid(lsquic_stream_conn(writer->how_stream)) +#include "lsquic_logger.h" + + +static int +hcso_write_type (struct hcso_writer *writer) +{ + int s; + +#ifndef NDEBUG + if (writer->how_flags & HOW_RAND_VARINT) + { + s = rand() & 3; + LSQ_DEBUG("writing %d-byte stream type", 1 << s); + } + else +#endif + s = 0; + + switch (s) + { + case 0: + return lsquic_frab_list_write(&writer->how_fral, + (unsigned char []) { HQUST_CONTROL }, 1); + case 1: + return lsquic_frab_list_write(&writer->how_fral, + (unsigned char []) { 0x40, HQUST_CONTROL }, 2); + case 2: + return lsquic_frab_list_write(&writer->how_fral, + (unsigned char []) { 0x80, 0x00, 0x00, HQUST_CONTROL }, 4); + default: + return lsquic_frab_list_write(&writer->how_fral, + (unsigned char []) { 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + HQUST_CONTROL }, 8); + } +} + + + +static lsquic_stream_ctx_t * +hcso_on_new (void *stream_if_ctx, struct lsquic_stream *stream) +{ + struct hcso_writer *writer = stream_if_ctx; + writer->how_stream = stream; + lsquic_frab_list_init(&writer->how_fral, 0x100, NULL, NULL, NULL); +#ifndef NDEBUG + const char *env = getenv("LSQUIC_RND_VARINT_LEN"); + if (env && atoi(env)) + { + writer->how_flags |= HOW_RAND_VARINT; + LSQ_INFO("will randomize varints"); + if (0 == (rand() & 3)) + { + writer->how_flags |= HOW_CHOP_STREAM; + LSQ_INFO("will chop beginning of stream into tiny STREAM frames"); + } + } +#endif + if (0 != hcso_write_type(writer)) + { + LSQ_INFO("cannot write to frab list"); + /* TODO: abort connection */ + } + LSQ_DEBUG("create HTTP Control Stream Writer"); + lsquic_stream_wantwrite(stream, 1); + return stream_if_ctx; +} + + +static unsigned +hcso_setting_type2bits (struct hcso_writer *writer, unsigned setting) +{ + unsigned bits = vint_val2bits(setting); + +#ifndef NDEBUG + unsigned max_bits; + if (writer->how_flags & HOW_RAND_VARINT) + { + max_bits = rand() & 3; + if (max_bits > bits) + bits = max_bits; + LSQ_DEBUG("writing out HTTP/3 setting %u as %d-byte varint", + setting, 1 << bits); + } +#endif + + return bits; +} + + +int +lsquic_hcso_write_settings (struct hcso_writer *writer, + const struct lsquic_engine_settings *settings, + int is_server) +{ + unsigned char *p; + unsigned bits; + int was_empty; +#ifdef NDEBUG + const unsigned frame_size_len = 1; +#else + /* Need to use two bytes for frame length, as randomization may require + * more than 63 bytes. + */ + const unsigned frame_size_len = 2; +#endif + unsigned char buf[1 /* Frame type */ + /* Frame size */ frame_size_len + /* There are maximum four settings that need to be written out and + * each value can be encoded in maximum 8 bytes: + */ + + 4 * ( +#ifdef NDEBUG + 1 /* Each setting needs 1-byte varint number, */ +#else + 8 /* but it can be up to 8 bytes when randomized */ +#endif + + 8) ]; + + p = buf; + *p++ = HQFT_SETTINGS; + p += frame_size_len; + + if (is_server) + if (settings->es_h3_placeholders != HQ_DF_NUM_PLACEHOLDERS) + { + /* Write out SETTINGS_NUM_PLACEHOLDERS */ + bits = hcso_setting_type2bits(writer, HQSID_NUM_PLACEHOLDERS); + vint_write(p, HQSID_NUM_PLACEHOLDERS, bits, 1 << bits); + p += 1 << bits; + bits = vint_val2bits(settings->es_h3_placeholders); + vint_write(p, settings->es_h3_placeholders, bits, 1 << bits); + p += 1 << bits; + } + + if (settings->es_max_header_list_size != HQ_DF_MAX_HEADER_LIST_SIZE) + { + /* Write out SETTINGS_MAX_HEADER_LIST_SIZE */ + bits = hcso_setting_type2bits(writer, HQSID_MAX_HEADER_LIST_SIZE); + vint_write(p, HQSID_MAX_HEADER_LIST_SIZE, bits, 1 << bits); + p += 1 << bits; + bits = vint_val2bits(settings->es_max_header_list_size); + vint_write(p, settings->es_max_header_list_size, bits, 1 << bits); + p += 1 << bits; + } + + if (settings->es_qpack_dec_max_size != HQ_DF_QPACK_MAX_TABLE_CAPACITY) + { + /* Write out SETTINGS_QPACK_MAX_TABLE_CAPACITY */ + bits = hcso_setting_type2bits(writer, HQSID_QPACK_MAX_TABLE_CAPACITY); + vint_write(p, HQSID_QPACK_MAX_TABLE_CAPACITY, bits, 1 << bits); + p += 1 << bits; + bits = vint_val2bits(settings->es_qpack_dec_max_size); + vint_write(p, settings->es_qpack_dec_max_size, bits, 1 << bits); + p += 1 << bits; + } + + if (settings->es_qpack_dec_max_blocked != HQ_DF_QPACK_BLOCKED_STREAMS) + { + /* Write out SETTINGS_QPACK_BLOCKED_STREAMS */ + bits = hcso_setting_type2bits(writer, HQSID_QPACK_BLOCKED_STREAMS); + vint_write(p, HQSID_QPACK_BLOCKED_STREAMS, bits, 1 << bits); + p += 1 << bits; + bits = vint_val2bits(settings->es_qpack_dec_max_size); + vint_write(p, settings->es_qpack_dec_max_blocked, bits, 1 << bits); + p += 1 << bits; + } + +#ifdef NDEBUG + buf[1] = p - buf - 2; +#else + vint_write(buf + 1, p - buf - 3, 1, 2); +#endif + + was_empty = lsquic_frab_list_empty(&writer->how_fral); + + if (0 != lsquic_frab_list_write(&writer->how_fral, buf, p - buf)) + { + LSQ_INFO("cannot write SETTINGS frame to frab list"); + return -1; + } + + if (was_empty) + lsquic_stream_wantwrite(writer->how_stream, 1); + + LSQ_DEBUG("generated %u-byte SETTINGS frame", (unsigned) (p - buf)); + return 0; +} + + +static const char * +hqft2str (enum hq_frame_type type) +{ + switch (type) + { + case HQFT_PUSH_PROMISE: return "PUSH_PROMISE"; + case HQFT_MAX_PUSH_ID: return "MAX_PUSH_ID"; + case HQFT_CANCEL_PUSH: return "CANCEL_PUSH"; + case HQFT_GOAWAY: return "GOAWAY"; + default: return ""; + } +} + + +int +hcso_write_number_frame (struct hcso_writer *writer, + enum hq_frame_type type, uint64_t value) +{ + unsigned char *p; + unsigned bits; + int was_empty; + unsigned char buf[1 /* Frame type */ + /* Frame size */ 1 + 8 /* Value */ ]; + + p = buf; + *p++ = type; + + bits = vint_val2bits(value); + *p++ = 1 << bits; + + vint_write(p, value, bits, 1 << bits); + p += 1 << bits; + + was_empty = lsquic_frab_list_empty(&writer->how_fral); + + if (0 != lsquic_frab_list_write(&writer->how_fral, buf, p - buf)) + { + LSQ_INFO("cannot write %s frame to frab list", hqft2str(type)); + return -1; + } + + if (was_empty) + lsquic_stream_wantwrite(writer->how_stream, 1); + + LSQ_DEBUG("generated %u-byte %s frame", (unsigned) (p - buf), + hqft2str(type)); + return 0; +} + + +int +lsquic_hcso_write_goaway (struct hcso_writer *writer, + lsquic_stream_id_t stream_id) +{ + return hcso_write_number_frame(writer, HQFT_GOAWAY, stream_id); +} + + +int +lsquic_hcso_write_max_push_id (struct hcso_writer *writer, uint64_t max_push_id) +{ + return hcso_write_number_frame(writer, HQFT_MAX_PUSH_ID, max_push_id); +} + + +int +lsquic_hcso_write_cancel_push (struct hcso_writer *writer, uint64_t push_id) +{ + return hcso_write_number_frame(writer, HQFT_CANCEL_PUSH, push_id); +} + + +#ifndef NDEBUG +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +static size_t +one_byte_limit_read (void *ctx, void *buf, size_t bufsz) +{ + return lsquic_frab_list_read(ctx, buf, MIN(bufsz, 1)); +} + + +static size_t +one_byte_limit_size (void *ctx) +{ + size_t size; + + size = lsquic_frab_list_size(ctx); + return MIN(size, 1); +} +#endif + +static void +hcso_on_write (struct lsquic_stream *stream, lsquic_stream_ctx_t *ctx) +{ + struct hcso_writer *const writer = (void *) ctx; + struct lsquic_reader reader = { + .lsqr_read = lsquic_frab_list_read, + .lsqr_size = lsquic_frab_list_size, + .lsqr_ctx = &writer->how_fral + }; + ssize_t nw; + +#ifndef NDEBUG + if (stream->tosend_off < 8 && (writer->how_flags & HOW_CHOP_STREAM)) + { + reader.lsqr_read = one_byte_limit_read; + reader.lsqr_size = one_byte_limit_size; + } +#endif + + nw = lsquic_stream_writef(stream, &reader); + if (nw >= 0) + { + LSQ_DEBUG("wrote %zd bytes to stream", nw); + (void) lsquic_stream_flush(stream); + if (lsquic_frab_list_empty(&writer->how_fral)) + lsquic_stream_wantwrite(stream, 0); + } + else + { + /* TODO: abort connection */ + LSQ_WARN("cannot write to stream: %s", strerror(errno)); + lsquic_stream_wantwrite(stream, 0); + } +} + + +static void +hcso_on_close (struct lsquic_stream *stream, lsquic_stream_ctx_t *ctx) +{ + struct hcso_writer *writer = (void *) ctx; + LSQ_DEBUG("close HTTP Control Stream Writer"); + lsquic_frab_list_cleanup(&writer->how_fral); + writer->how_stream = NULL; +} + + +static void +hcso_on_read (struct lsquic_stream *stream, lsquic_stream_ctx_t *ctx) +{ + assert(0); +} + + +static const struct lsquic_stream_if hcso_if = +{ + .on_new_stream = hcso_on_new, + .on_read = hcso_on_read, + .on_write = hcso_on_write, + .on_close = hcso_on_close, +}; + +const struct lsquic_stream_if *const lsquic_hcso_writer_if = &hcso_if; diff --git a/src/liblsquic/lsquic_hcso_writer.h b/src/liblsquic/lsquic_hcso_writer.h new file mode 100644 index 000000000..30da9dc64 --- /dev/null +++ b/src/liblsquic/lsquic_hcso_writer.h @@ -0,0 +1,39 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_hcso_writer.h + */ + +#ifndef LSQUIC_HCSO_WRITER_H +#define LSQUIC_HCSO_WRITER_H 1 + +struct lsquic_engine_settings; +struct lsquic_stream; + +struct hcso_writer +{ + struct lsquic_stream *how_stream; + struct frab_list how_fral; +#ifndef NDEBUG + enum { + HOW_RAND_VARINT = 1 << 0, + HOW_CHOP_STREAM = 1 << 1, + } how_flags; +#endif +}; + +int +lsquic_hcso_write_settings (struct hcso_writer *, + const struct lsquic_engine_settings *, int); + +int +lsquic_hcso_write_goaway (struct hcso_writer *, lsquic_stream_id_t); + +int +lsquic_hcso_write_max_push_id (struct hcso_writer *, uint64_t max_push_id); + +int +lsquic_hcso_write_cancel_push (struct hcso_writer *, uint64_t push_id); + +extern const struct lsquic_stream_if *const lsquic_hcso_writer_if; + +#endif diff --git a/src/liblsquic/lsquic_headers.h b/src/liblsquic/lsquic_headers.h index f67a33d7c..dd59f97bf 100644 --- a/src/liblsquic/lsquic_headers.h +++ b/src/liblsquic/lsquic_headers.h @@ -2,8 +2,6 @@ #ifndef LSQUIC_HEADERS_H #define LSQUIC_HEADERS_H 1 -#include - /* When ea_hsi_if is not specified, the headers are converted to a C string * that contains HTTP/1.x-like header structure. */ @@ -23,8 +21,8 @@ struct http1x_headers */ struct uncompressed_headers { - uint32_t uh_stream_id; - uint32_t uh_oth_stream_id; /* For HEADERS frame, the ID of the + lsquic_stream_id_t uh_stream_id; + lsquic_stream_id_t uh_oth_stream_id; /* For HEADERS frame, the ID of the * stream that this stream depends * on. (Zero means unset.) For * PUSH_PROMISE, the promised stream diff --git a/src/liblsquic/lsquic_headers_stream.c b/src/liblsquic/lsquic_headers_stream.c index 0af159640..eaeb8af61 100644 --- a/src/liblsquic/lsquic_headers_stream.c +++ b/src/liblsquic/lsquic_headers_stream.c @@ -5,6 +5,7 @@ #include #include +#include #include #include #include @@ -29,7 +30,8 @@ #define MAX_HEADER_TABLE_SIZE (512 * 1024) #define LSQUIC_LOGGER_MODULE LSQLM_HEADERS -#define LSQUIC_LOG_CONN_ID lsquic_conn_id(lsquic_stream_conn(hs->hs_stream)) +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(\ + lsquic_stream_conn(hs->hs_stream)) #include "lsquic_logger.h" static const struct frame_reader_callbacks *frame_callbacks_ptr; @@ -85,6 +87,7 @@ headers_on_new_stream (void *stream_if_ctx, lsquic_stream_t *stream) LSQ_WARN("could not initialize HPACK encoder: %s", strerror(errno)); return NULL; } + (void) lshpack_enc_use_hist(&hs->hs_henc, 1); hs->hs_flags |= HS_HENC_INITED; hs->hs_stream = stream; LSQ_DEBUG("stream created"); @@ -103,7 +106,7 @@ headers_on_new_stream (void *stream_if_ctx, lsquic_stream_t *stream) return NULL; } hs->hs_fw = lsquic_frame_writer_new(&hs->hs_enpub->enp_mm, stream, 0, - &hs->hs_henc, lsquic_stream_write, + &hs->hs_henc, lsquic_stream_writef, #if LSQUIC_CONN_STATS hs->hs_conn_stats, #endif @@ -161,8 +164,8 @@ headers_on_close (lsquic_stream_t *stream, struct lsquic_stream_ctx *ctx) int lsquic_headers_stream_send_headers (struct headers_stream *hs, - uint32_t stream_id, const struct lsquic_http_headers *headers, int eos, - unsigned weight) + lsquic_stream_id_t stream_id, const struct lsquic_http_headers *headers, + int eos, unsigned weight) { LSQ_DEBUG("received compressed headers to send"); int s; @@ -181,7 +184,8 @@ lsquic_headers_stream_send_headers (struct headers_stream *hs, int lsquic_headers_stream_send_priority (struct headers_stream *hs, - uint32_t stream_id, int exclusive, uint32_t dep_stream_id, unsigned weight) + lsquic_stream_id_t stream_id, int exclusive, + lsquic_stream_id_t dep_stream_id, unsigned weight) { LSQ_DEBUG("received priority to send"); int s; @@ -272,8 +276,8 @@ headers_on_push_promise (void *ctx, struct uncompressed_headers *uh) static void -headers_on_priority (void *ctx, uint32_t stream_id, int exclusive, - uint32_t dep_stream_id, unsigned weight) +headers_on_priority (void *ctx, lsquic_stream_id_t stream_id, int exclusive, + lsquic_stream_id_t dep_stream_id, unsigned weight) { struct headers_stream *hs = ctx; hs->hs_callbacks->hsc_on_priority(hs->hs_cb_ctx, stream_id, exclusive, @@ -282,7 +286,8 @@ headers_on_priority (void *ctx, uint32_t stream_id, int exclusive, static void -headers_on_error (void *ctx, uint32_t stream_id, enum frame_reader_error err) +headers_on_error (void *ctx, lsquic_stream_id_t stream_id, + enum frame_reader_error err) { struct headers_stream *hs = ctx; switch (err) @@ -290,6 +295,7 @@ headers_on_error (void *ctx, uint32_t stream_id, enum frame_reader_error err) case FR_ERR_DUPLICATE_PSEH: case FR_ERR_INCOMPL_REQ_PSEH: case FR_ERR_UNNEC_REQ_PSEH: + case FR_ERR_BAD_REQ_HEADER: case FR_ERR_INCOMPL_RESP_PSEH: case FR_ERR_UNNEC_RESP_PSEH: case FR_ERR_UNKNOWN_PSEH: @@ -299,7 +305,8 @@ headers_on_error (void *ctx, uint32_t stream_id, enum frame_reader_error err) case FR_ERR_DECOMPRESS: case FR_ERR_HEADERS_TOO_LARGE: case FR_ERR_SELF_DEP_STREAM: - LSQ_INFO("error %u is a stream error (stream %u)", err, stream_id); + LSQ_INFO("error %u is a stream error (stream %"PRIu64")", err, + stream_id); hs->hs_callbacks->hsc_on_stream_error(hs->hs_cb_ctx, stream_id); break; case FR_ERR_INVALID_FRAME_SIZE: @@ -308,7 +315,8 @@ headers_on_error (void *ctx, uint32_t stream_id, enum frame_reader_error err) case FR_ERR_ZERO_STREAM_ID: case FR_ERR_NOMEM: case FR_ERR_EXPECTED_CONTIN: - LSQ_INFO("error %u is a connection error (stream %u)", err, stream_id); + LSQ_INFO("error %u is a connection error (stream %"PRIu64")", err, + stream_id); hs->hs_callbacks->hsc_on_conn_error(hs->hs_cb_ctx); break; } @@ -376,10 +384,12 @@ headers_on_settings (void *ctx, uint16_t setting_id, uint32_t setting_value) int lsquic_headers_stream_push_promise (struct headers_stream *hs, - uint32_t stream_id, uint32_t promised_stream_id, - const struct iovec *path, const struct iovec *host, - const struct lsquic_http_headers *headers) + lsquic_stream_id_t stream_id64, lsquic_stream_id_t promised_stream_id64, + const struct iovec *path, const struct iovec *host, + const struct lsquic_http_headers *headers) { + uint32_t stream_id = stream_id64; + uint32_t promised_stream_id = promised_stream_id64; int s; LSQ_DEBUG("promising stream %u in response to stream %u", promised_stream_id, stream_id); diff --git a/src/liblsquic/lsquic_headers_stream.h b/src/liblsquic/lsquic_headers_stream.h index bc7bfb610..1a4f47d77 100644 --- a/src/liblsquic/lsquic_headers_stream.h +++ b/src/liblsquic/lsquic_headers_stream.h @@ -33,9 +33,9 @@ struct headers_stream_callbacks void (*hsc_on_enable_push) (void *hs_cb_ctx, int enable_push); void (*hsc_on_push_promise) (void *frame_cb_ctx, struct uncompressed_headers *); - void (*hsc_on_priority) (void *hs_cb_ctx, uint32_t stream_id, - int exclusive, uint32_t dep_stream_id, unsigned weight); - void (*hsc_on_stream_error) (void *hs_cb_ctx, uint32_t stream_id); + void (*hsc_on_priority) (void *hs_cb_ctx, lsquic_stream_id_t stream_id, + int exclusive, lsquic_stream_id_t dep_stream_id, unsigned weight); + void (*hsc_on_stream_error) (void *hs_cb_ctx, lsquic_stream_id_t stream_id); void (*hsc_on_conn_error) (void *hs_cb_ctx); }; @@ -53,19 +53,20 @@ lsquic_headers_stream_destroy (struct headers_stream *); int lsquic_headers_stream_send_headers (struct headers_stream *hs, - uint32_t stream_id, + lsquic_stream_id_t stream_id, const struct lsquic_http_headers *, int eos, unsigned weight); int lsquic_headers_stream_push_promise (struct headers_stream *hs, - uint32_t stream_id, uint32_t promised_stream_id, + lsquic_stream_id_t stream_id, lsquic_stream_id_t promised_stream_id, const struct iovec *path, const struct iovec *host, const struct lsquic_http_headers *); int lsquic_headers_stream_send_priority (struct headers_stream *hs, - uint32_t stream_id, int exclusive, uint32_t dep_stream_id, unsigned weight); + lsquic_stream_id_t stream_id, int exclusive, + lsquic_stream_id_t dep_stream_id, unsigned weight); int lsquic_headers_stream_send_settings (struct headers_stream *hs, diff --git a/src/liblsquic/lsquic_hkdf.c b/src/liblsquic/lsquic_hkdf.c new file mode 100644 index 000000000..344787c3f --- /dev/null +++ b/src/liblsquic/lsquic_hkdf.c @@ -0,0 +1,40 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#include +#include +#include + +#include + +#include "lsquic_hkdf.h" + + +/* [draft-ietf-quic-tls-17] Section 5 */ +void +lsquic_qhkdf_expand (const EVP_MD *md, const unsigned char *secret, + unsigned secret_len, const char *label, uint8_t label_len, + unsigned char *out, uint16_t out_len) +{ +#ifndef NDEBUG + int s; +#endif + unsigned char info[ 2 + 1 + 6 + label_len + 1]; + + info[0] = out_len >> 8; + info[1] = out_len; + info[2] = label_len + 6; + info[3] = 't'; + info[4] = 'l'; + info[5] = 's'; + info[6] = '1'; + info[7] = '3'; + info[8] = ' '; + memcpy(info + 9, label, label_len); + info[9 + label_len] = 0; +#ifndef NDEBUG + s = +#else + (void) +#endif + HKDF_expand(out, out_len, md, secret, secret_len, info, sizeof(info)); + assert(s); +} diff --git a/src/liblsquic/lsquic_hkdf.h b/src/liblsquic/lsquic_hkdf.h new file mode 100644 index 000000000..118c29279 --- /dev/null +++ b/src/liblsquic/lsquic_hkdf.h @@ -0,0 +1,21 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#ifndef LSQUIC_HKDF_H +#define LSQUIC_HKDF_H 1 + +/* [draft-ietf-quic-tls-22] Section 5.2 */ +#define HSK_SALT_BUF "\x7f\xbc\xdb\x0e\x7c\x66\xbb\xe9\x19\x3a" \ + "\x96\xcd\x21\x51\x9e\xbd\x7a\x02\x64\x4a" +#define HSK_SALT ((unsigned char *) HSK_SALT_BUF) +#define HSK_SALT_SZ (sizeof(HSK_SALT_BUF) - 1) + +#define CLIENT_LABEL "client in" +#define CLIENT_LABEL_SZ (sizeof(CLIENT_LABEL) - 1) +#define SERVER_LABEL "server in" +#define SERVER_LABEL_SZ (sizeof(SERVER_LABEL) - 1) + +void +lsquic_qhkdf_expand (const struct env_md_st *, const unsigned char *secret, + unsigned secret_len, const char *label, uint8_t label_len, + unsigned char *out, uint16_t out_len); + +#endif diff --git a/src/liblsquic/lsquic_hq.c b/src/liblsquic/lsquic_hq.c new file mode 100644 index 000000000..c6ce95067 --- /dev/null +++ b/src/liblsquic/lsquic_hq.c @@ -0,0 +1,94 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#include +#include + +#include "lsquic_types.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" + +const char *const lsquic_h3det2str[] = +{ + [H3DET_REQ_STREAM] = "request stream", + [H3DET_PUSH_STREAM] = "push stream", + [H3DET_PLACEHOLDER] = "placeholder", + [H3DET_ROOT] = "root of the tree", +}; + +const char *const lsquic_h3pet2str[] = +{ + [H3PET_REQ_STREAM] = "request stream", + [H3PET_PUSH_STREAM] = "push stream", + [H3PET_PLACEHOLDER] = "placeholder", + [H3PET_CUR_STREAM] = "current stream", +}; + + +enum h3_prio_frame_read_status +lsquic_h3_prio_frame_read (const unsigned char **bufp, size_t bufsz, + struct h3_prio_frame_read_state *state) +{ + const unsigned char *p = *bufp; + const unsigned char *const end = p + bufsz; + int s; + + while (p < end) + { + switch (state->h3pfrs_state) + { + case H3PFRS_STATE_TYPE: + state->h3pfrs_prio.hqp_prio_type = (p[0] >> HQ_PT_SHIFT) & 3; + state->h3pfrs_prio.hqp_dep_type = (p[0] >> HQ_DT_SHIFT) & 3; + ++p; + if (state->h3pfrs_prio.hqp_prio_type == H3PET_CUR_STREAM + && state->h3pfrs_prio.hqp_dep_type == H3DET_ROOT) + state->h3pfrs_state = H3PFRS_STATE_WEIGHT; + else + { + state->h3pfrs_flags = 0; + state->h3pfrs_state = H3PFRS_STATE_VINT_BEGIN; + } + break; + case H3PFRS_STATE_VINT_BEGIN: + state->h3pfrs_vint.pos = 0; + state->h3pfrs_state = H3PFRS_STATE_VINT_CONTINUE; + /* fall-through */ + case H3PFRS_STATE_VINT_CONTINUE: + s = lsquic_varint_read_nb(&p, end, &state->h3pfrs_vint); + if (0 == s) + { + if (state->h3pfrs_prio.hqp_prio_type == H3PET_CUR_STREAM + || (state->h3pfrs_flags & H3PFRS_FLAG_HAVE_PRIO_ID)) + { + state->h3pfrs_prio.hqp_dep_id = state->h3pfrs_vint.val; + state->h3pfrs_state = H3PFRS_STATE_WEIGHT; + } + else + { + state->h3pfrs_prio.hqp_prio_id = state->h3pfrs_vint.val; + state->h3pfrs_flags |= H3PFRS_FLAG_HAVE_PRIO_ID; + if (state->h3pfrs_prio.hqp_dep_type == H3DET_ROOT) + state->h3pfrs_state = H3PFRS_STATE_WEIGHT; + else + state->h3pfrs_state = H3PFRS_STATE_VINT_BEGIN; + } + break; + } + else + { + assert(p == end); + *bufp = p; + return H3PFR_STATUS_NEED; + } + case H3PFRS_STATE_WEIGHT: + state->h3pfrs_prio.hqp_weight = *p++; + *bufp = p; + return H3PFR_STATUS_DONE; + default: + assert(0); + return H3PFR_STATUS_DONE; + } + } + + *bufp = p; + return H3PFR_STATUS_NEED; +} diff --git a/src/liblsquic/lsquic_hq.h b/src/liblsquic/lsquic_hq.h new file mode 100644 index 000000000..6a9dcd8ae --- /dev/null +++ b/src/liblsquic/lsquic_hq.h @@ -0,0 +1,152 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_hq.h -- HTTP over QUIC (HQ) types + */ + +#ifndef LSQUIC_HQ_H +#define LSQUIC_HQ_H 1 + +/* [draft-ietf-quic-http-15] Section 4 */ +enum hq_frame_type +{ + HQFT_DATA = 0, + HQFT_HEADERS = 1, + HQFT_PRIORITY = 2, + HQFT_CANCEL_PUSH = 3, + HQFT_SETTINGS = 4, + HQFT_PUSH_PROMISE = 5, + HQFT_GOAWAY = 7, + HQFT_MAX_PUSH_ID = 0xD, + HQFT_DUPLICATE_PUSH = 0xE, + /* This frame is made up and its type is never written to stream. + * Nevertheless, just to be on the safe side, give it a value as + * described in [draft-ietf-quic-http-20] Section 4.2.10. + */ + HQFT_PUSH_PREAMBLE = 0x1F * 3 + 0x21, +}; + + +enum h3_prio_el_type +{ + H3PET_REQ_STREAM = 0, + H3PET_PUSH_STREAM = 1, + H3PET_PLACEHOLDER = 2, + H3PET_CUR_STREAM = 3, +}; + + +enum h3_dep_el_type +{ + H3DET_REQ_STREAM = 0, + H3DET_PUSH_STREAM = 1, + H3DET_PLACEHOLDER = 2, + H3DET_ROOT = 3, +}; + + +#define HQ_PT_SHIFT 6 +#define HQ_DT_SHIFT 4 + + +enum hq_setting_id +{ + HQSID_QPACK_MAX_TABLE_CAPACITY = 1, + HQSID_MAX_HEADER_LIST_SIZE = 6, + HQSID_QPACK_BLOCKED_STREAMS = 7, + HQSID_NUM_PLACEHOLDERS = 9, +}; + +/* As of 12/18/2018: */ +#define HQ_DF_QPACK_MAX_TABLE_CAPACITY 0 +#define HQ_DF_NUM_PLACEHOLDERS 0 +#define HQ_DF_MAX_HEADER_LIST_SIZE 0 +#define HQ_DF_QPACK_BLOCKED_STREAMS 0 + +struct hq_priority +{ + lsquic_stream_id_t hqp_prio_id; + lsquic_stream_id_t hqp_dep_id; + enum h3_prio_el_type hqp_prio_type:8; + enum h3_dep_el_type hqp_dep_type:8; + uint8_t hqp_weight; +}; + +#define HQP_WEIGHT(p) ((p)->hqp_weight + 1) + +/* [draft-ietf-quic-http-19] Section 10.6, + * [draft-ietf-quic-qpack-07] Section 8.2 + */ +enum hq_uni_stream_type +{ + HQUST_CONTROL = 0, + HQUST_PUSH = 1, + HQUST_QPACK_ENC = 2, + HQUST_QPACK_DEC = 3, +}; + +extern const char *const lsquic_h3det2str[]; +extern const char *const lsquic_h3pet2str[]; + +/* [draft-ietf-quic-http-22] Section 8.1 and + * [draft-ietf-quic-qpack-08], Section 8.3 + */ +enum http_error_code +{ + HEC_NO_ERROR = 0x00, + HEC_GENERAL_PROTOCOL_ERROR = 0x01, + /* Error code 0x2 is reserved and has no meaning */ + HEC_INTERNAL_ERROR = 0x03, + /* Error code 0x4 is reserved and has no meaning */ + HEC_REQUEST_CANCELLED = 0x05, + HEC_INCOMPLETE_REQUEST = 0x06, + HEC_CONNECT_ERROR = 0x07, + HEC_EXCESSIVE_LOAD = 0x08, + HEC_VERSION_FALLBACK = 0x09, + HEC_WRONG_STREAM = 0x0A, + HEC_ID_ERROR = 0x0B, + /* Error code 0xC is reserved and has no meaning */ + HEC_STREAM_CREATION_ERROR = 0x0D, + /* Error code 0xE is reserved and has no meaning */ + HEC_CLOSED_CRITICAL_STREAM = 0x0F, + /* Error code 0x10 is reserved and has no meaning */ + HEC_EARLY_RESPONSE = 0x0011, + HEC_MISSING_SETTINGS = 0x0012, + HEC_UNEXPECTED_FRAME = 0x0013, + HEC_REQUEST_REJECTED = 0x14, + HEC_SETTINGS_ERROR = 0x00FF, + HEC_MALFORMED_FRAME = 0x0100, /* add frame type */ + HEC_QPACK_DECOMPRESSION_FAILED = 0x200, + HEC_QPACK_ENCODER_STREAM_ERROR = 0x201, + HEC_QPACK_DECODER_STREAM_ERROR = 0x202, +}; + + +struct h3_prio_frame_read_state +{ + struct varint_read_state h3pfrs_vint; + struct hq_priority h3pfrs_prio; + enum { + H3PFRS_STATE_TYPE = 0, + H3PFRS_STATE_VINT_BEGIN, + H3PFRS_STATE_VINT_CONTINUE, + H3PFRS_STATE_WEIGHT, + } h3pfrs_state; + enum { + H3PFRS_FLAG_HAVE_PRIO_ID = 1 << 0, + } h3pfrs_flags; +}; + + +enum h3_prio_frame_read_status +{ + H3PFR_STATUS_DONE, + H3PFR_STATUS_NEED, +}; + + +/* When first called, h3pfrs_state should be set to 0 */ +enum h3_prio_frame_read_status +lsquic_h3_prio_frame_read (const unsigned char **, size_t, + struct h3_prio_frame_read_state *); + +#endif diff --git a/src/liblsquic/lsquic_hspack_valid.c b/src/liblsquic/lsquic_hspack_valid.c new file mode 100644 index 000000000..1b196aad2 --- /dev/null +++ b/src/liblsquic/lsquic_hspack_valid.c @@ -0,0 +1,163 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_hspack_valid.c -- Handshake packet validator. + * + * We want to eliminate invalid packets as soon as we read them in and not + * feed them to lsquic engine if we can avoid it. The handshake packet + * possesses several characteristics which make it possible to detect + * garbage packets. + */ + + +#include +#include +#include + +#include "lsquic.h" +#include "lsquic_types.h" +#include "lsquic_int_types.h" +#include "lsquic_packet_common.h" +#include "lsquic_packet_gquic.h" +#include "lsquic_packet_ietf.h" +#include "lsquic_mm.h" +#include "lsquic_engine_public.h" +#include "lsquic_version.h" +#include "lsquic_parse_common.h" + + +#define SMALLEST_GQUIC_OVERHEAD \ + 1 /* Type */ \ + + GQUIC_CID_LEN \ + + sizeof(lsquic_ver_tag_t) \ + + 1 /* Packet number */ \ + + 1 /* Stream frame */ \ + + 1 /* Stream ID */ \ + + 2 /* Data length */ \ + + 12 /* IV */ + + + +/* Note that we ignore nonce: even if the flag is set, we know that Chrome + * does not actually include the 32-byte nonce. + */ +static int +is_valid_gquic_hs_packet (const unsigned char *buf, size_t bufsz, + lsquic_ver_tag_t *tag) +{ + if (bufsz > GQUIC_MAX_PACKET_SZ || + /* Data: HPACKed :method GET :path / is 2 bytes */ + bufsz < SMALLEST_GQUIC_OVERHEAD + 2 || + /* Check maximum packet number: */ + buf[1 + GQUIC_CID_LEN + sizeof(lsquic_ver_tag_t)] > 64 || + /* From [draft-hamilton-quic-transport-protocol-01]: + * 0x80 is currently unused, and must be set to 0. + * 0x40 = MULTIPATH. This bit is reserved for multipath use. + * + * 0x30 = Packet number length. We expect these bits to be + * unset. + * + * The reference implementation checks that two high bits are not + * set if version flag is not set or if the version is the same. + * For our purposes, all GQUIC version we support so far have these + * bits set to zero. + * + * Incoming handshake packets must have both connection ID and + * version bits set. + * + * Nonce flag is ignored: Chrome sets it erronesously, but it may + * not be true (a) in the future or (b) in other clients. + */ + ((buf[0] ^ ( + /* These should be unset: */ + (~(0x80|0x40|0x30|PACKET_PUBLIC_FLAGS_RST)) + & + /* While these should be set: */ + (PACKET_PUBLIC_FLAGS_VERSION| + PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID) + )) & /* Ignore this bit: */ ~PACKET_PUBLIC_FLAGS_NONCE) + ) + { + return 0; + } + + memcpy(tag, buf + 1 + 8, sizeof(*tag)); + + return 1; +} + + +int +lsquic_is_valid_hs_packet (struct lsquic_engine *engine, + const unsigned char *buf, size_t bufsz) +{ + lsquic_ver_tag_t tag; + int is_valid; + + if (bufsz < 1) + return 0; + + switch (buf[0] & 0xF8) + { + /* Xs vary, Gs are iGnored: */ + /* 1X11 XGGG: Q046 long header */ + case 0x80|0x40|0x20|0x10|0x08: + case 0x80|0x00|0x20|0x10|0x08: + case 0x80|0x40|0x20|0x10|0x00: + case 0x80|0x00|0x20|0x10|0x00: + is_valid = lsquic_is_valid_iquic_hs_packet(buf, bufsz, &tag); + break; + /* 1X00 XGGG: ID-22 long header */ + case 0x80|0x40|0x00|0x00|0x08: + case 0x80|0x00|0x00|0x00|0x08: + case 0x80|0x40|0x00|0x00|0x00: + case 0x80|0x00|0x00|0x00|0x00: + /* 1X01 XGGG: ID-22 long header */ + case 0x80|0x40|0x00|0x10|0x08: + case 0x80|0x00|0x00|0x10|0x08: + case 0x80|0x40|0x00|0x10|0x00: + case 0x80|0x00|0x00|0x10|0x00: + /* 1X10 XGGG: ID-22 long header */ + case 0x80|0x40|0x20|0x00|0x08: + case 0x80|0x00|0x20|0x00|0x08: + case 0x80|0x40|0x20|0x00|0x00: + case 0x80|0x00|0x20|0x00|0x00: + is_valid = lsquic_is_valid_ietf_v1_or_Q046_hs_packet(buf, bufsz, &tag); + break; + /* 01XX XGGG: ID-22 short header */ + case 0x00|0x40|0x00|0x00|0x00: + case 0x00|0x40|0x00|0x00|0x08: + case 0x00|0x40|0x00|0x10|0x00: + case 0x00|0x40|0x00|0x10|0x08: + case 0x00|0x40|0x20|0x00|0x00: + case 0x00|0x40|0x20|0x00|0x08: + case 0x00|0x40|0x20|0x10|0x00: + case 0x00|0x40|0x20|0x10|0x08: + is_valid = 0; + break; + /* 00XX 0GGG: Q046 short header */ + case 0x00|0x00|0x00|0x00|0x00: + case 0x00|0x00|0x00|0x10|0x00: + case 0x00|0x00|0x20|0x00|0x00: + case 0x00|0x00|0x20|0x10|0x00: + is_valid = 0; + break; + /* 00XX 1GGG: GQUIC */ + case 0x00|0x00|0x00|0x00|0x08: + case 0x00|0x00|0x00|0x10|0x08: + case 0x00|0x00|0x20|0x00|0x08: + case 0x00|0x00|0x20|0x10|0x08: + is_valid = is_valid_gquic_hs_packet(buf, bufsz, &tag); + break; + default: /* gcc thinks this is possible?! */ + assert(0); + is_valid = 0; + break; + } + + if (is_valid) + { + return 1; + } + else + return 0; +} diff --git a/src/liblsquic/lsquic_http1x_if.c b/src/liblsquic/lsquic_http1x_if.c index d3af4a860..5c65e5d7d 100644 --- a/src/liblsquic/lsquic_http1x_if.c +++ b/src/liblsquic/lsquic_http1x_if.c @@ -11,7 +11,7 @@ #include "lshpack.h" #define LSQUIC_LOGGER_MODULE LSQLM_HTTP1X -#define LSQUIC_LOG_CONN_ID hwc->hwc_cid +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(hwc->hwc_conn) #include "lsquic_logger.h" enum pseudo_header @@ -36,7 +36,7 @@ enum pseudo_header struct header_writer_ctx { - lsquic_cid_t hwc_cid; + const struct lsquic_conn *hwc_conn; char *buf; char *cookie_val; unsigned cookie_sz, cookie_nalloc; @@ -75,7 +75,7 @@ h1h_create_header_set (void *ctx, int is_push_promise) if (is_push_promise) hwc->hwc_flags |= HWC_PUSH_PROMISE; hwc->max_headers_sz = hcc->max_headers_sz; - hwc->hwc_cid = hcc->cid; + hwc->hwc_conn = hcc->conn; return &hwc->hwc_h1h; } diff --git a/src/liblsquic/lsquic_http1x_if.h b/src/liblsquic/lsquic_http1x_if.h index fa081b8e4..5768c2195 100644 --- a/src/liblsquic/lsquic_http1x_if.h +++ b/src/liblsquic/lsquic_http1x_if.h @@ -3,14 +3,17 @@ #define LSQUIC_HTTP1X_IF_H 1 struct lsquic_hset_if; +struct lsquic_conn; struct http1x_ctor_ctx { - lsquic_cid_t cid; /* Used for logging */ + const struct lsquic_conn *conn; /* Used for logging */ unsigned max_headers_sz; int is_server; }; extern const struct lsquic_hset_if *const lsquic_http1x_if; +#define MAX_HTTP1X_HEADERS_SIZE (64 * 1024) + #endif diff --git a/src/liblsquic/lsquic_ietf.h b/src/liblsquic/lsquic_ietf.h new file mode 100644 index 000000000..02a1eb094 --- /dev/null +++ b/src/liblsquic/lsquic_ietf.h @@ -0,0 +1,28 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#ifndef LSQUIC_IETF_H +#define LSQUIC_IETF_H 1 + +/* Things specific to the IETF version of QUIC that do not fit anywhere else */ + +/* [draft-ietf-quic-transport-18] Section 22.3 */ +enum trans_error_code +{ + TEC_NO_ERROR = 0x0, + TEC_INTERNAL_ERROR = 0x1, + TEC_SERVER_BUSY = 0x2, + TEC_FLOW_CONTROL_ERROR = 0x3, + TEC_STREAM_LIMIT_ERROR = 0x4, + TEC_STREAM_STATE_ERROR = 0x5, + TEC_FINAL_SIZE_ERROR = 0x6, + TEC_FRAME_ENCODING_ERROR = 0x7, + TEC_TRANSPORT_PARAMETER_ERROR = 0x8, + TEC_VERSION_NEGOTIATION_ERROR = 0x9, + TEC_PROTOCOL_VIOLATION = 0xA, + TEC_INVALID_MIGRATION = 0xC, + TEC_CRYPTO_BUFFER_EXCEEDED = 0xD, +}; + +/* Must be at least two */ +#define MAX_IETF_CONN_DCIDS 8 + +#endif diff --git a/src/liblsquic/lsquic_int_types.h b/src/liblsquic/lsquic_int_types.h index b14e66abe..2c98c9edb 100644 --- a/src/liblsquic/lsquic_int_types.h +++ b/src/liblsquic/lsquic_int_types.h @@ -19,4 +19,13 @@ struct lsquic_packno_range { lsquic_packno_t low, high; }; +/* RFC 3168 */ +enum ecn +{ + ECN_NOT_ECT = 0, + ECN_ECT1 = 1, + ECN_ECT0 = 2, + ECN_CE = 3, +}; + #endif diff --git a/src/liblsquic/lsquic_logger.c b/src/liblsquic/lsquic_logger.c index 097f92f9d..68ea93b37 100644 --- a/src/liblsquic/lsquic_logger.c +++ b/src/liblsquic/lsquic_logger.c @@ -16,43 +16,34 @@ #include #define LSQUIC_LOGGER_MODULE LSQLM_LOGGER /* Quis custodiet ipsos custodes? */ -#include "lsquic_logger.h" -#include "lsquic_byteswap.h" #include "lsquic.h" +#include "lsquic_logger.h" -/* The switch to big-endian format in GQUIC also resulted in Chrome swapping - * the CID in its log. We do the same thing in our log messages so that the - * CIDs are easy to match. The exception is Q035, which is the last little- - * endian GQUIC version this library supports. - */ -#if __BYTE_ORDER == __LITTLE_ENDIAN -#define DISP_CID(cid) bswap_64(cid) -#else -#define DISP_CID(cid) (cid) -#endif +#define MAX_LINE_LEN 8192 +#define FORMAT_PROBLEM(lb, len, max) (((ssize_t)lb < 0) || ((ssize_t)lb + (ssize_t)len >= (ssize_t)max)) + +/* TODO: display GQUIC CIDs in Chrome-compatible format */ static enum lsquic_logger_timestamp_style g_llts = LLTS_NONE; static int -null_vprintf (void *ctx, const char *fmt, va_list ap) +null_log_buf (void *ctx, const char *buf, size_t len) { return 0; } - static int -file_vprintf (void *ctx, const char *fmt, va_list ap) +file_log_buf (void *ctx, const char *buf, size_t len) { - return vfprintf((FILE *) ctx, fmt, ap); + return (int)fwrite(buf, sizeof(char), len, (FILE *) ctx); } - static const struct lsquic_logger_if file_logger_if = { - .vprintf = file_vprintf, + .log_buf = file_log_buf, }; static const struct lsquic_logger_if null_logger_if = { - .vprintf = null_vprintf, + .log_buf = null_log_buf, }; static void *logger_ctx = NULL; @@ -74,18 +65,31 @@ enum lsq_log_level lsq_log_levels[N_LSQUIC_LOGGER_MODULES] = { [LSQLM_CRYPTO] = LSQ_LOG_WARN, [LSQLM_HANDSHAKE] = LSQ_LOG_WARN, [LSQLM_HSK_ADAPTER] = LSQ_LOG_WARN, + [LSQLM_BBR] = LSQ_LOG_WARN, [LSQLM_CUBIC] = LSQ_LOG_WARN, [LSQLM_HEADERS] = LSQ_LOG_WARN, [LSQLM_FRAME_READER]= LSQ_LOG_WARN, [LSQLM_FRAME_WRITER]= LSQ_LOG_WARN, - [LSQLM_CONN_HASH] = LSQ_LOG_WARN, + [LSQLM_MINI_CONN] = LSQ_LOG_WARN, + [LSQLM_TOKGEN] = LSQ_LOG_WARN, [LSQLM_ENG_HIST] = LSQ_LOG_WARN, [LSQLM_SPI] = LSQ_LOG_WARN, [LSQLM_DI] = LSQ_LOG_WARN, + [LSQLM_PRQ] = LSQ_LOG_WARN, [LSQLM_PACER] = LSQ_LOG_WARN, [LSQLM_MIN_HEAP] = LSQ_LOG_WARN, [LSQLM_HTTP1X] = LSQ_LOG_WARN, [LSQLM_QLOG] = LSQ_LOG_WARN, + [LSQLM_TRAPA] = LSQ_LOG_WARN, + [LSQLM_PURGA] = LSQ_LOG_WARN, + [LSQLM_HCSI_READER] = LSQ_LOG_WARN, + [LSQLM_HCSO_WRITER] = LSQ_LOG_WARN, + [LSQLM_QENC_HDL] = LSQ_LOG_WARN, + [LSQLM_QDEC_HDL] = LSQ_LOG_WARN, + [LSQLM_QPACK_ENC] = LSQ_LOG_WARN, + [LSQLM_QPACK_DEC] = LSQ_LOG_WARN, + [LSQLM_PRIO] = LSQ_LOG_WARN, + [LSQLM_BW_SAMPLER] = LSQ_LOG_WARN, }; const char *const lsqlm_to_str[N_LSQUIC_LOGGER_MODULES] = { @@ -104,18 +108,31 @@ const char *const lsqlm_to_str[N_LSQUIC_LOGGER_MODULES] = { [LSQLM_CRYPTO] = "crypto", [LSQLM_HANDSHAKE] = "handshake", [LSQLM_HSK_ADAPTER] = "hsk-adapter", + [LSQLM_BBR] = "bbr", [LSQLM_CUBIC] = "cubic", [LSQLM_HEADERS] = "headers", [LSQLM_FRAME_READER]= "frame-reader", [LSQLM_FRAME_WRITER]= "frame-writer", - [LSQLM_CONN_HASH] = "conn-hash", + [LSQLM_MINI_CONN] = "mini-conn", + [LSQLM_TOKGEN] = "tokgen", [LSQLM_ENG_HIST] = "eng-hist", [LSQLM_SPI] = "spi", [LSQLM_DI] = "di", + [LSQLM_PRQ] = "prq", [LSQLM_PACER] = "pacer", [LSQLM_MIN_HEAP] = "min-heap", [LSQLM_HTTP1X] = "http1x", [LSQLM_QLOG] = "qlog", + [LSQLM_TRAPA] = "trapa", + [LSQLM_PURGA] = "purga", + [LSQLM_HCSI_READER] = "hcsi-reader", + [LSQLM_HCSO_WRITER] = "hcso-writer", + [LSQLM_QENC_HDL] = "qenc-hdl", + [LSQLM_QDEC_HDL] = "qdec-hdl", + [LSQLM_QPACK_ENC] = "qpack-enc", + [LSQLM_QPACK_DEC] = "qpack-dec", + [LSQLM_PRIO] = "prio", + [LSQLM_BW_SAMPLER] = "bw-sampler", }; const char *const lsq_loglevel2str[N_LSQUIC_LOG_LEVELS] = { @@ -130,16 +147,6 @@ const char *const lsq_loglevel2str[N_LSQUIC_LOG_LEVELS] = { }; -static void -lsquic_printf (const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - logger_if->vprintf(logger_ctx, fmt, ap); - va_end(ap); -} - - #ifdef WIN32 #define DELTA_EPOCH_IN_TICKS 116444736000000000Ui64 struct timezone @@ -180,16 +187,16 @@ gettimeofday (struct timeval *tv, struct timezone *tz) return 0; } - - #endif -static void -print_timestamp (void) +static size_t +print_timestamp (char *buf, size_t max) { struct tm tm; struct timeval tv; + size_t len = 0; + gettimeofday(&tv, NULL); #ifdef WIN32 { @@ -204,43 +211,66 @@ print_timestamp (void) localtime_r(&tv.tv_sec, &tm); #endif if (g_llts == LLTS_YYYYMMDD_HHMMSSUS) - lsquic_printf("%04d-%02d-%02d %02d:%02d:%02d.%06d ", + len = snprintf(buf, max, "%04d-%02d-%02d %02d:%02d:%02d.%06d ", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, (int) (tv.tv_usec)); else if (g_llts == LLTS_YYYYMMDD_HHMMSSMS) - lsquic_printf("%04d-%02d-%02d %02d:%02d:%02d.%03d ", + len = snprintf(buf, max, "%04d-%02d-%02d %02d:%02d:%02d.%03d ", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, (int) (tv.tv_usec / 1000)); else if (g_llts == LLTS_HHMMSSMS) - lsquic_printf("%02d:%02d:%02d.%03d ", tm.tm_hour, tm.tm_min, - tm.tm_sec, (int) (tv.tv_usec / 1000)); + len = snprintf(buf, max, "%02d:%02d:%02d.%03d ", + tm.tm_hour, tm.tm_min, tm.tm_sec, (int) (tv.tv_usec / 1000)); else if (g_llts == LLTS_HHMMSSUS) - lsquic_printf("%02d:%02d:%02d.%06d ", tm.tm_hour, tm.tm_min, - tm.tm_sec, (int) tv.tv_usec); + len = snprintf(buf, max, "%02d:%02d:%02d.%06d ", + tm.tm_hour, tm.tm_min, tm.tm_sec, (int) tv.tv_usec); else if (g_llts == LLTS_CHROMELIKE) - lsquic_printf("%02d%02d/%02d%02d%02d.%06d ", tm.tm_mon + 1, - tm.tm_mday,tm.tm_hour, tm.tm_min, tm.tm_sec, (int) tv.tv_usec); + len = snprintf(buf, max, "%02d%02d/%02d%02d%02d.%06d ", + tm.tm_mon + 1, tm.tm_mday,tm.tm_hour, tm.tm_min, + tm.tm_sec, (int) tv.tv_usec); + return len; } void lsquic_logger_log3 (enum lsq_log_level log_level, enum lsquic_logger_module module, - uint64_t conn_id, uint32_t stream_id, const char *fmt, ...) + const lsquic_cid_t *conn_id, lsquic_stream_id_t stream_id, + const char *fmt, ...) { const int saved_errno = errno; + char cidbuf_[MAX_CID_LEN * 2 + 1]; + size_t len = 0; + size_t lb; + size_t max = MAX_LINE_LEN; + char buf[MAX_LINE_LEN]; if (g_llts != LLTS_NONE) - print_timestamp(); - - lsquic_printf("[%s] [QUIC:%"PRIu64"-%"PRIu32"] %s: ", - lsq_loglevel2str[log_level], DISP_CID(conn_id), stream_id, - lsqlm_to_str[module]); + { + lb = print_timestamp(buf, max); + if (FORMAT_PROBLEM(lb, len, max)) + goto end; + len += lb; + } + lb = snprintf(buf + len, max - len, "[%s] [QUIC:%"CID_FMT"-%"PRIu64"] %s: ", + lsq_loglevel2str[log_level], CID_BITS(conn_id), + stream_id, lsqlm_to_str[module]); + if (FORMAT_PROBLEM(lb, len, max)) + goto end; + len += lb; va_list ap; va_start(ap, fmt); - logger_if->vprintf(logger_ctx, fmt, ap); + lb = vsnprintf(buf + len, max - len, fmt, ap); + if (FORMAT_PROBLEM(lb, len, max)) + goto end; + len += lb; va_end(ap); - lsquic_printf("\n"); + lb = snprintf(buf + len, max - len, "\n"); + if (FORMAT_PROBLEM(lb, len, max)) + goto end; + len += lb; + logger_if->log_buf(logger_ctx, buf, len); +end: errno = saved_errno; } @@ -248,20 +278,41 @@ lsquic_logger_log3 (enum lsq_log_level log_level, void lsquic_logger_log2 (enum lsq_log_level log_level, enum lsquic_logger_module module, - uint64_t conn_id, const char *fmt, ...) + const struct lsquic_cid *conn_id, const char *fmt, ...) { const int saved_errno = errno; + char cidbuf_[MAX_CID_LEN * 2 + 1]; + size_t len = 0; + size_t lb; + size_t max = MAX_LINE_LEN; + char buf[MAX_LINE_LEN]; if (g_llts != LLTS_NONE) - print_timestamp(); + { + lb = print_timestamp(buf, max); + if (FORMAT_PROBLEM(lb, len, max)) + goto end; + len += lb; + } - lsquic_printf("[%s] [QUIC:%"PRIu64"] %s: ", - lsq_loglevel2str[log_level], DISP_CID(conn_id), lsqlm_to_str[module]); + lb = snprintf(buf + len, max - len, "[%s] [QUIC:%"CID_FMT"] %s: ", + lsq_loglevel2str[log_level], CID_BITS(conn_id), lsqlm_to_str[module]); + if (FORMAT_PROBLEM(lb, len, max)) + goto end; + len += lb; va_list ap; va_start(ap, fmt); - logger_if->vprintf(logger_ctx, fmt, ap); + lb = vsnprintf(buf + len, max - len, fmt, ap); + if (FORMAT_PROBLEM(lb, len, max)) + goto end; + len += lb; va_end(ap); - lsquic_printf("\n"); + lb = snprintf(buf + len, max - len, "\n"); + if (FORMAT_PROBLEM(lb, len, max)) + goto end; + len += lb; + logger_if->log_buf(logger_ctx, buf, len); +end: errno = saved_errno; } @@ -272,17 +323,36 @@ lsquic_logger_log1 (enum lsq_log_level log_level, const char *fmt, ...) { const int saved_errno = errno; + size_t len = 0; + size_t lb; + size_t max = MAX_LINE_LEN; + char buf[MAX_LINE_LEN]; if (g_llts != LLTS_NONE) - print_timestamp(); - - lsquic_printf("[%s] %s: ", lsq_loglevel2str[log_level], + { + lb = print_timestamp(buf, max); + if (FORMAT_PROBLEM(lb, len, max)) + goto end; + len += lb; + } + lb = snprintf(buf + len, max - len, "[%s] %s: ", lsq_loglevel2str[log_level], lsqlm_to_str[module]); + if (FORMAT_PROBLEM(lb, len, max)) + goto end; + len += lb; va_list ap; va_start(ap, fmt); - logger_if->vprintf(logger_ctx, fmt, ap); + lb = vsnprintf(buf + len, max - len, fmt, ap); + if (FORMAT_PROBLEM(lb, len, max)) + goto end; + len += lb; va_end(ap); - lsquic_printf("\n"); + lb = snprintf(buf + len, max - len, "\n"); + if (FORMAT_PROBLEM(lb, len, max)) + goto end; + len += lb; + logger_if->log_buf(logger_ctx, buf, len); +end: errno = saved_errno; } @@ -291,16 +361,36 @@ void lsquic_logger_log0 (enum lsq_log_level log_level, const char *fmt, ...) { const int saved_errno = errno; + size_t len = 0; + size_t lb; + size_t max = MAX_LINE_LEN; + char buf[MAX_LINE_LEN]; if (g_llts != LLTS_NONE) - print_timestamp(); + { + lb = print_timestamp(buf, max); + if (FORMAT_PROBLEM(lb, len, max)) + goto end; + len += lb; + } - lsquic_printf("[%s] ", lsq_loglevel2str[log_level]); + lb = snprintf(buf + len, max - len, "[%s] ", lsq_loglevel2str[log_level]); + if (FORMAT_PROBLEM(lb, len, max)) + goto end; + len += lb; va_list ap; va_start(ap, fmt); - logger_if->vprintf(logger_ctx, fmt, ap); + lb = vsnprintf(buf + len, max - len, fmt, ap); va_end(ap); - lsquic_printf("\n"); + if (FORMAT_PROBLEM(lb, len, max)) + goto end; + len += lb; + lb = snprintf(buf + len, max - len, "\n"); + if (FORMAT_PROBLEM(lb, len, max)) + goto end; + len += lb; + logger_if->log_buf(logger_ctx, buf, len); +end: errno = saved_errno; } @@ -406,3 +496,19 @@ lsquic_set_log_level (const char *level_str) else return -1; } + + +/* `out' must be at least MAX_CID_LEN * 2 + 1 characters long */ +void +lsquic_cid2str (const lsquic_cid_t *cid, char *out) +{ + static const char hex[] = "0123456789ABCDEF"; + int i; + + for (i = 0; i < (int) cid->len; ++i) + { + *out++ = hex[ cid->idbuf[i] >> 4 ]; + *out++ = hex[ cid->idbuf[i] & 0xF ]; + } + *out = '\0'; +} diff --git a/src/liblsquic/lsquic_logger.h b/src/liblsquic/lsquic_logger.h index e7c70473a..40492631f 100644 --- a/src/liblsquic/lsquic_logger.h +++ b/src/liblsquic/lsquic_logger.h @@ -61,18 +61,31 @@ enum lsquic_logger_module { LSQLM_CRYPTO, LSQLM_HANDSHAKE, LSQLM_HSK_ADAPTER, + LSQLM_BBR, LSQLM_CUBIC, LSQLM_HEADERS, LSQLM_FRAME_WRITER, LSQLM_FRAME_READER, - LSQLM_CONN_HASH, + LSQLM_MINI_CONN, + LSQLM_TOKGEN, LSQLM_ENG_HIST, LSQLM_SPI, LSQLM_DI, + LSQLM_PRQ, LSQLM_PACER, LSQLM_MIN_HEAP, LSQLM_HTTP1X, LSQLM_QLOG, + LSQLM_TRAPA, + LSQLM_PURGA, + LSQLM_HCSI_READER, + LSQLM_HCSO_WRITER, + LSQLM_QENC_HDL, + LSQLM_QDEC_HDL, + LSQLM_QPACK_ENC, + LSQLM_QPACK_DEC, + LSQLM_PRIO, + LSQLM_BW_SAMPLER, N_LSQUIC_LOGGER_MODULES }; @@ -89,6 +102,8 @@ extern const char *const lsq_loglevel2str[N_LSQUIC_LOG_LEVELS]; #define LSQ_LOG_ENABLED(level) LSQ_LOG_ENABLED_EXT(level, LSQUIC_LOGGER_MODULE) +struct lsquic_cid; + /* The functions that perform actual logging are void. This is an * optimization. In majority of cases the calls will succeed; even if * they fail, there is nothing (at least, nothing simple) to be done to @@ -108,8 +123,8 @@ extern const char *const lsq_loglevel2str[N_LSQUIC_LOG_LEVELS]; void lsquic_logger_log3 (enum lsq_log_level, enum lsquic_logger_module, - uint64_t conn_id, uint32_t stream_id, - const char *format, ...) + const struct lsquic_cid *conn_id, + lsquic_stream_id_t stream_id, const char *format, ...) #if __GNUC__ __attribute__((format(printf, 5, 6))) #endif @@ -117,12 +132,13 @@ lsquic_logger_log3 (enum lsq_log_level, enum lsquic_logger_module, # define LSQ_LOG3(level, ...) do { \ if (LSQ_LOG_ENABLED(level)) \ lsquic_logger_log3(level, LSQUIC_LOGGER_MODULE, \ - LSQUIC_LOG_CONN_ID, LSQUIC_LOG_STREAM_ID, __VA_ARGS__); \ + LSQUIC_LOG_CONN_ID, LSQUIC_LOG_STREAM_ID, __VA_ARGS__); \ } while (0) + void lsquic_logger_log2 (enum lsq_log_level, enum lsquic_logger_module, - uint64_t conn_id, const char *format, ...) + const struct lsquic_cid *conn_id, const char *format, ...) #if __GNUC__ __attribute__((format(printf, 4, 5))) #endif @@ -130,7 +146,15 @@ lsquic_logger_log2 (enum lsq_log_level, enum lsquic_logger_module, # define LSQ_LOG2(level, ...) do { \ if (LSQ_LOG_ENABLED(level)) \ lsquic_logger_log2(level, LSQUIC_LOGGER_MODULE, \ - LSQUIC_LOG_CONN_ID, __VA_ARGS__); \ + LSQUIC_LOG_CONN_ID, __VA_ARGS__); \ + } while (0) +# define LSQ_LOG2C(level, ...) do { \ + if (LSQ_LOG_ENABLED(level)) \ + { \ + char cidbuf_[MAX_CID_LEN * 2 + 1]; \ + lsquic_logger_log2(level, LSQUIC_LOGGER_MODULE, \ + LSQUIC_LOG_CONN_ID, __VA_ARGS__); \ + } \ } while (0) void @@ -144,6 +168,13 @@ lsquic_logger_log1 (enum lsq_log_level, enum lsquic_logger_module, if (LSQ_LOG_ENABLED(level)) \ lsquic_logger_log1(level, LSQUIC_LOGGER_MODULE, __VA_ARGS__); \ } while (0) +# define LSQ_LOG1C(level, ...) do { \ + if (LSQ_LOG_ENABLED(level)) \ + { \ + char cidbuf_[MAX_CID_LEN * 2 + 1]; \ + lsquic_logger_log1(level, LSQUIC_LOGGER_MODULE, __VA_ARGS__); \ + } \ + } while (0) void lsquic_logger_log0 (enum lsq_log_level, const char *format, ...) @@ -155,6 +186,13 @@ lsquic_logger_log0 (enum lsq_log_level, const char *format, ...) if (LSQ_LOG_ENABLED(level)) \ lsquic_logger_log0(level, __VA_ARGS__); \ } while (0) +# define LSQ_LOG0C(level, ...) do { \ + if (LSQ_LOG_ENABLED(level)) \ + { \ + char cidbuf_[MAX_CID_LEN * 2 + 1]; \ + lsquic_logger_log0(level, __VA_ARGS__); \ + } \ + } while (0) #if defined(LSQUIC_LOGGER_MODULE) #if defined(LSQUIC_LOG_CONN_ID) @@ -162,12 +200,15 @@ lsquic_logger_log0 (enum lsq_log_level, const char *format, ...) # define LSQ_LOG LSQ_LOG3 #else # define LSQ_LOG LSQ_LOG2 +# define LSQ_LOGC LSQ_LOG2C #endif #else # define LSQ_LOG LSQ_LOG1 +# define LSQ_LOGC LSQ_LOG1C #endif #else # define LSQ_LOG LSQ_LOG0 +# define LSQ_LOGC LSQ_LOG0C # define LSQUIC_LOGGER_MODULE LSQLM_NOMODULE #endif @@ -180,6 +221,15 @@ lsquic_logger_log0 (enum lsq_log_level, const char *format, ...) #define LSQ_INFO(...) LSQ_LOG(LSQ_LOG_INFO, __VA_ARGS__) #define LSQ_EMERG(...) LSQ_LOG(LSQ_LOG_EMERG, __VA_ARGS__) +#define LSQ_DEBUGC(...) LSQ_LOGC(LSQ_LOG_DEBUG, __VA_ARGS__) +#define LSQ_WARNC(...) LSQ_LOGC(LSQ_LOG_WARN, __VA_ARGS__) +#define LSQ_ALERTC(...) LSQ_LOGC(LSQ_LOG_ALERT, __VA_ARGS__) +#define LSQ_CRITC(...) LSQ_LOGC(LSQ_LOG_CRIT, __VA_ARGS__) +#define LSQ_ERRORC(...) LSQ_LOGC(LSQ_LOG_ERROR, __VA_ARGS__) +#define LSQ_NOTICEC(...) LSQ_LOGC(LSQ_LOG_NOTICE, __VA_ARGS__) +#define LSQ_INFOC(...) LSQ_LOGC(LSQ_LOG_INFO, __VA_ARGS__) +#define LSQ_EMERGC(...) LSQ_LOGC(LSQ_LOG_EMERG, __VA_ARGS__) + /* Shorthand for printing to file streams using internal lsquic_logger_if */ void @@ -197,6 +247,17 @@ lsquic_str_to_log_level (const char *); int lsquic_logger_lopt (const char *optarg); +#define CID_FMT ".*s" + +#define CID_BITS(cid) 2 * (int) (cid)->len, \ + (lsquic_cid2str(cid, cidbuf_), cidbuf_) + +void +lsquic_cid2str (const struct lsquic_cid *, char *out); + +const struct lsquic_cid * +lsquic_conn_log_cid (const struct lsquic_conn *); + #ifdef __cplusplus } #endif diff --git a/src/liblsquic/lsquic_malo.c b/src/liblsquic/lsquic_malo.c index 724f58809..2cac218b6 100644 --- a/src/liblsquic/lsquic_malo.c +++ b/src/liblsquic/lsquic_malo.c @@ -7,7 +7,8 @@ * does the following: * * 1. Allocations occur 4 KB at a time. - * 2. No division or multiplication operations are performed. + * 2. No division or multiplication operations are performed for + * appropriately sized objects. (More on this below.) * * (In recent testing, malo was about 2.7 times faster than malloc for * 64-byte objects.) @@ -18,18 +19,17 @@ * 1. To free (put) an object, one does not need a pointer to the malo * object. This makes this allocator easy to use. * 2. A built-in iterator is provided to iterate over all allocated - * objects (with ability to safely release objects while iterator + * objects (with ability safely to release objects while iterator * is active). This may be useful in some circumstances. * * To gain all these advantages, there are trade-offs: * * 1. There are two memory penalties: - * a. Per object overhead. To avoid division and multiplication, - * the object sizes is rounded up to the nearest power or two, - * starting with 64 bytes (minumum) and up to 2 KB (maximum). - * Thus, a 104-byte object will have a 24-byte overhead; a - * 130-byte object will have 126-byte overhead. This is - * something to keep in mind. + * a. Per object overhead. If an object is at least ROUNDUP_THRESH in + * size as the next power of two, the allocator uses that power of + * two value as the object size. This is done to avoid using + * division and multiplication. For example, a 104-byte object + * will have a 24-byte overhead. * b. Per page overhead. Page links occupy some bytes in the * page. To keep things fast, at least one slot per page is * always occupied, independent of object size. Thus, for a @@ -56,17 +56,25 @@ #include "fiu-local.h" #include "lsquic_malo.h" +#ifndef LSQUIC_USE_POOLS +#define LSQUIC_USE_POOLS 1 +#endif + /* 64 slots in a 4KB page means that the smallest object is 64 bytes. * The largest object is 2KB. */ #define MALO_MIN_NBITS 6 #define MALO_MAX_NBITS 11 +#define ROUNDUP_THRESH 0.75f + /* A "free page" is a page with free slots available. */ +#if LSQUIC_USE_POOLS static unsigned find_free_slot (uint64_t slots); static unsigned size_in_bits (size_t sz); +#endif struct malo_page { SLIST_ENTRY(malo_page) next_page; @@ -74,14 +82,25 @@ struct malo_page { struct malo *malo; uint64_t slots, full_slot_mask; - unsigned nbits; + unsigned nbits; /* If pow is zero, stores object size */ unsigned initial_slot; + int pow; /* True if object is power of 2 */ }; typedef char malo_header_fits_in_one_slot - [(sizeof(struct malo_page) > (1 << MALO_MAX_NBITS)) ? -1 : 1]; + [(sizeof(struct malo_page) > (1 << MALO_MIN_NBITS)) ? -1 : 1]; + +#if !LSQUIC_USE_POOLS +struct nopool_elem +{ + TAILQ_ENTRY(nopool_elem) next; + struct malo *malo; + unsigned char data[0]; +}; +#endif struct malo { +#if LSQUIC_USE_POOLS struct malo_page page_header; SLIST_HEAD(, malo_page) all_pages; LIST_HEAD(, malo_page) free_pages; @@ -89,12 +108,23 @@ struct malo { struct malo_page *cur_page; unsigned next_slot; } iter; +#else + /* List of all elements: used by the iterator */ + TAILQ_HEAD(, nopool_elem) elems; + size_t obj_size; + struct nopool_elem *next_iter_elem; +#endif }; struct malo * lsquic_malo_create (size_t obj_size) { - unsigned nbits = size_in_bits(obj_size); +#if LSQUIC_USE_POOLS + int pow, n_slots; + unsigned nbits; + + obj_size = (obj_size + 7) & -8; + nbits = size_in_bits(obj_size); if (nbits < MALO_MIN_NBITS) nbits = MALO_MIN_NBITS; else if (nbits > MALO_MAX_NBITS) @@ -103,6 +133,9 @@ lsquic_malo_create (size_t obj_size) return NULL; } + pow = obj_size <= (1 << MALO_MIN_NBITS) + || (float) obj_size / (1 << nbits) > ROUNDUP_THRESH; + struct malo *malo; if (0 != posix_memalign((void **) &malo, 0x1000, 0x1000)) return NULL; @@ -112,25 +145,52 @@ lsquic_malo_create (size_t obj_size) malo->iter.cur_page = &malo->page_header; malo->iter.next_slot = 0; - int n_slots = sizeof(*malo) / (1 << nbits) + if (pow) + n_slots = sizeof(*malo) / (1 << nbits) + ((sizeof(*malo) % (1 << nbits)) > 0); + else + n_slots = sizeof(*malo) / obj_size + + ((sizeof(*malo) % obj_size) > 0); struct malo_page *const page = &malo->page_header; SLIST_INSERT_HEAD(&malo->all_pages, page, next_page); LIST_INSERT_HEAD(&malo->free_pages, page, next_free_page); page->malo = malo; - if (nbits == MALO_MIN_NBITS) + if (!pow) + page->full_slot_mask = (1ULL << (0x1000 / obj_size)) - 1; + else if (nbits == MALO_MIN_NBITS) page->full_slot_mask = ~0ULL; else page->full_slot_mask = (1ULL << (1 << (12 - nbits))) - 1; page->slots = (1ULL << n_slots) - 1; - page->nbits = nbits; + page->pow = pow; + page->nbits = pow ? nbits : obj_size; page->initial_slot = n_slots; return malo; +#else + struct malo *malo; + + /* Use the same sizing mechanism as in the normal version */ + if (obj_size < (1 << MALO_MIN_NBITS)) + obj_size = 1 << MALO_MIN_NBITS; + else + obj_size = (obj_size + 7) & -8; + + malo = malloc(sizeof(*malo)); + if (malo) + { + TAILQ_INIT(&malo->elems); + malo->obj_size = obj_size; + return malo; + } + else + return NULL; +#endif } +#if LSQUIC_USE_POOLS static struct malo_page * allocate_page (struct malo *malo) { @@ -142,10 +202,12 @@ allocate_page (struct malo *malo) page->slots = 1; page->full_slot_mask = malo->page_header.full_slot_mask; page->nbits = malo->page_header.nbits; + page->pow = malo->page_header.pow; page->malo = malo; page->initial_slot = 1; return page; } +#endif #define FAIL_NOMEM do { errno = ENOMEM; return NULL; } while (0) @@ -154,6 +216,7 @@ allocate_page (struct malo *malo) void * lsquic_malo_get (struct malo *malo) { +#if LSQUIC_USE_POOLS fiu_do_on("malo/get", FAIL_NOMEM); struct malo_page *page = LIST_FIRST(&malo->free_pages); if (!page) @@ -166,7 +229,22 @@ lsquic_malo_get (struct malo *malo) page->slots |= (1ULL << slot); if (page->full_slot_mask == page->slots) LIST_REMOVE(page, next_free_page); - return (char *) page + (slot << page->nbits); + if (page->pow) + return (char *) page + (slot << page->nbits); + else + return (char *) page + (slot * page->nbits); +#else + struct nopool_elem *el; + el = malloc(sizeof(*el) + malo->obj_size); + if (el) + { + TAILQ_INSERT_HEAD(&malo->elems, el, next); + el->malo = malo; + return el->data; + } + else + return NULL; +#endif } @@ -174,18 +252,32 @@ lsquic_malo_get (struct malo *malo) void lsquic_malo_put (void *obj) { +#if LSQUIC_USE_POOLS uintptr_t page_addr = (uintptr_t) obj & ~((1 << 12) - 1); struct malo_page *page = (void *) page_addr; - unsigned slot = ((uintptr_t) obj - page_addr) >> page->nbits; + unsigned slot; + if (page->pow) + slot = ((uintptr_t) obj - page_addr) >> page->nbits; + else + slot = ((uintptr_t) obj - page_addr) / page->nbits; if (page->full_slot_mask == page->slots) LIST_INSERT_HEAD(&page->malo->free_pages, page, next_free_page); page->slots &= ~(1ULL << slot); +#else + struct nopool_elem *el; + el = (struct nopool_elem *) ((char *) obj - sizeof(*el)); + if (el == el->malo->next_iter_elem) + el->malo->next_iter_elem = TAILQ_NEXT(el->malo->next_iter_elem, next); + TAILQ_REMOVE(&el->malo->elems, el, next); + free(el); +#endif } void lsquic_malo_destroy (struct malo *malo) { +#if LSQUIC_USE_POOLS struct malo_page *page, *next; page = SLIST_FIRST(&malo->all_pages); while (page != &malo->page_header) @@ -203,6 +295,15 @@ lsquic_malo_destroy (struct malo *malo) #else _aligned_free(page); #endif +#else + struct nopool_elem *el, *next_el; + for (el = TAILQ_FIRST(&malo->elems); el; el = next_el) + { + next_el = TAILQ_NEXT(el, next); + free(el); + } + free(malo); +#endif } @@ -214,8 +315,12 @@ lsquic_malo_destroy (struct malo *malo) void * lsquic_malo_first (struct malo *malo) { +#if LSQUIC_USE_POOLS malo->iter.cur_page = SLIST_FIRST(&malo->all_pages); malo->iter.next_slot = malo->iter.cur_page->initial_slot; +#else + malo->next_iter_elem = TAILQ_FIRST(&malo->elems); +#endif return lsquic_malo_next(malo); } @@ -223,13 +328,17 @@ lsquic_malo_first (struct malo *malo) void * lsquic_malo_next (struct malo *malo) { +#if LSQUIC_USE_POOLS struct malo_page *page; unsigned max_slot, slot; page = malo->iter.cur_page; if (page) { - max_slot = 1 << (12 - page->nbits); /* Same for all pages */ + if (page->pow) + max_slot = 1 << (12 - page->nbits); /* Same for all pages */ + else + max_slot = 0x1000 / page->nbits; slot = malo->iter.next_slot; while (1) { @@ -239,7 +348,13 @@ lsquic_malo_next (struct malo *malo) { malo->iter.cur_page = page; malo->iter.next_slot = slot + 1; - return (char *) page + (slot << page->nbits); + if (page->pow) + return (char *) page + (slot << page->nbits); + else + { + assert(slot * (page->nbits + 1) < 0x1000); + return (char *) page + (slot * page->nbits); + } } } page = SLIST_NEXT(page, next_page); @@ -254,14 +369,27 @@ lsquic_malo_next (struct malo *malo) } return NULL; +#else + struct nopool_elem *retval; + + if (malo->next_iter_elem) + { + retval = malo->next_iter_elem; + malo->next_iter_elem = TAILQ_NEXT(malo->next_iter_elem, next); + return retval->data; + } + else + return NULL; +#endif } +#if LSQUIC_USE_POOLS static unsigned size_in_bits (size_t sz) { #if __GNUC__ - unsigned clz = __builtin_clz(sz - 1); + unsigned clz = sz > 1 ? __builtin_clz(sz - 1) : 31; return 32 - clz; #elif defined(WIN32) unsigned char s; @@ -306,11 +434,13 @@ find_free_slot (uint64_t slots) return n; #endif } +#endif size_t lsquic_malo_mem_used (const struct malo *malo) { +#if LSQUIC_USE_POOLS const struct malo_page *page; size_t size; @@ -319,4 +449,7 @@ lsquic_malo_mem_used (const struct malo *malo) size += sizeof(*page); return size; +#else + return 0; +#endif } diff --git a/src/liblsquic/lsquic_malo.h b/src/liblsquic/lsquic_malo.h index c4fac88a1..9327037a9 100644 --- a/src/liblsquic/lsquic_malo.h +++ b/src/liblsquic/lsquic_malo.h @@ -6,6 +6,10 @@ #ifndef LSQUIC_MALO_H #define LSQUIC_MALO_H 1 +#ifndef LSQUIC_USE_POOLS +#define LSQUIC_USE_POOLS 1 +#endif + struct malo; /* Create a malo allocator for objects of size `obj_size'. */ @@ -24,6 +28,10 @@ lsquic_malo_put (void *obj); void lsquic_malo_destroy (struct malo *); +/* This iterator is slow. It is only used in unit tests for verification. + * + * If you to iterate over all elements allocated in a pool, keep track yourself. + */ /* The iterator is built-in. Usage: * void *obj; * for (obj = lsquic_malo_first(obj); obj; lsquic_malo_next(obj)) diff --git a/src/liblsquic/lsquic_min_heap.c b/src/liblsquic/lsquic_min_heap.c index ff5d1ef46..0aae5f303 100644 --- a/src/liblsquic/lsquic_min_heap.c +++ b/src/liblsquic/lsquic_min_heap.c @@ -8,6 +8,7 @@ #include "lsquic_min_heap.h" #define LSQUIC_LOGGER_MODULE LSQLM_MIN_HEAP +#include "lsquic_types.h" #include "lsquic_logger.h" #define MHE_PARENT(i) ((i - 1) / 2) diff --git a/src/liblsquic/lsquic_mini_conn.c b/src/liblsquic/lsquic_mini_conn.c new file mode 100644 index 000000000..4f7816146 --- /dev/null +++ b/src/liblsquic/lsquic_mini_conn.c @@ -0,0 +1,2010 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_mini_conn.c -- Mini connection. + * + * Mini connection is only used in server mode -- this assumption is relied + * upon by the code in this file. + * + * The purpose of this connection is to process incoming handshakes using + * minimal amount of resources until we confirm that the client is sending + * valid data. Here, we only process Stream 1 data; other packets are + * spooled, if necessary. When mini connection is promoted to full + * connection, the state, including spooled incoming packets, is transferred + * to the full connection. + * + * Note that mini connections do not retransmit lost packets. This is to + * minimize the effect of magnification attacks. Clients like Chrome and + * Opera fall back to using TCP if QUIC handshake times out. + */ + + +#include +#include +#include +#include +#include +#include + +#include "lsquic.h" +#include "lsquic_int_types.h" +#include "lsquic_hash.h" +#include "lsquic_conn.h" +#include "lsquic_rtt.h" +#include "lsquic_mini_conn.h" +#include "lsquic_mm.h" +#include "lsquic_malo.h" +#include "lsquic_packet_common.h" +#include "lsquic_packet_gquic.h" +#include "lsquic_packet_in.h" +#include "lsquic_packet_out.h" +#include "lsquic_util.h" +#include "lsquic_str.h" +#include "lsquic_enc_sess.h" +#include "lsquic_parse.h" +#include "lsquic_engine_public.h" +#include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_varint.h" +#include "lsquic_stream.h" +#include "lsquic_rechist.h" +#include "lsquic_ev_log.h" +#include "lsquic_qtags.h" + +#define LSQUIC_LOGGER_MODULE LSQLM_MINI_CONN +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(&mc->mc_conn) +#include "lsquic_logger.h" + + +static const struct conn_iface mini_conn_iface_standard; +#if LSQUIC_ENABLE_HANDSHAKE_DISABLE +static const struct conn_iface mini_conn_iface_disable_handshake; +#endif + +#if LSQUIC_KEEP_MINICONN_HISTORY + +static void +mchist_append (struct mini_conn *mc, enum miniconn_history_event mh_event) +{ + enum miniconn_history_event prev_event; + mchist_idx_t idx; + int plus; + + idx = (mc->mc_hist_idx - 1) & MCHIST_MASK; + plus = MCHE_PLUS == mc->mc_hist_buf[ idx ]; + idx = (idx - plus) & MCHIST_MASK; + prev_event = mc->mc_hist_buf[ idx ]; + + if (!(prev_event == mh_event && plus)) + { + if (prev_event == mh_event) + mh_event = MCHE_PLUS; + mc->mc_hist_buf[ MCHIST_MASK & mc->mc_hist_idx++ ] = mh_event; + } +} + + +# define MCHIST_APPEND(mc, event) mchist_append(mc, event) +#else +# define MCHIST_APPEND(mc, event) +#endif + +static void +process_deferred_packets (struct mini_conn *mc); + + +/* If this is not true, highest_bit_set() may be broken */ +typedef char packno_set_is_unsigned_long[ + (sizeof(unsigned long long) == sizeof(mconn_packno_set_t)) - 1]; + +static unsigned +highest_bit_set (unsigned long long sz) +{ +#if __GNUC__ + unsigned clz = __builtin_clzll(sz); + return 63 - clz; +#else + unsigned long y; + unsigned n; + n = 64; + y = sz >> 32; if (y) { n -= 32; sz = y; } + y = sz >> 16; if (y) { n -= 16; sz = y; } + y = sz >> 8; if (y) { n -= 8; sz = y; } + y = sz >> 4; if (y) { n -= 4; sz = y; } + y = sz >> 2; if (y) { n -= 2; sz = y; } + y = sz >> 1; if (y) return 63 - n + 2; + return 63 - n + sz; +#endif +} + + +static unsigned +lowest_bit_set (unsigned v) +{ +#if __GNUC__ + return __builtin_ctz(v); +#else + unsigned n; + n = 0; + if (0 == (v & ((1 << 16) - 1))) { n += 16; v >>= 16; } + if (0 == (v & ((1 << 8) - 1))) { n += 8; v >>= 8; } + if (0 == (v & ((1 << 4) - 1))) { n += 4; v >>= 4; } + if (0 == (v & ((1 << 2) - 1))) { n += 2; v >>= 2; } + if (0 == (v & ((1 << 1) - 1))) { n += 1; } + return n; +#endif +} + + +static void +mini_destroy_packet (struct mini_conn *mc, struct lsquic_packet_out *packet_out) +{ + lsquic_packet_out_destroy(packet_out, mc->mc_enpub, + mc->mc_path.np_peer_ctx); +} + + +static int +packet_in_is_ok (const struct lsquic_packet_in *packet_in) +{ + if (packet_in->pi_data_sz > GQUIC_MAX_PACKET_SZ) + { + LSQ_LOG1(LSQ_LOG_DEBUG, "incoming packet too large: %hu bytes", + packet_in->pi_data_sz); + return 0; + } + if (packet_in->pi_data_sz < 200) /* TODO: 64 packets now */ + { /* mini connection is limited to 32 packets, yet it must send out REJ + * and SHLO, which are about 4 KB combined. + */ + LSQ_LOG1(LSQ_LOG_DEBUG, "incoming packet too small: %hu bytes", + packet_in->pi_data_sz); + return 0; + } + return 1; +} + + +lsquic_conn_t * +mini_conn_new (struct lsquic_engine_public *enp, + const struct lsquic_packet_in *packet_in, + enum lsquic_version version) +{ + struct mini_conn *mc; + const struct conn_iface *conn_iface; + +#if LSQUIC_ENABLE_HANDSHAKE_DISABLE + if (getenv("LSQUIC_DISABLE_HANDSHAKE")) + conn_iface = &mini_conn_iface_disable_handshake; + else +#endif + { + if (!packet_in_is_ok(packet_in)) + return NULL; + conn_iface = &mini_conn_iface_standard; + } + + mc = lsquic_malo_get(enp->enp_mm.malo.mini_conn); + if (!mc) + { + LSQ_LOG1(LSQ_LOG_WARN, "cannot allocate mini connection: %s", + strerror(errno)); + return NULL; + } + + memset(mc, 0, sizeof(*mc)); + TAILQ_INIT(&mc->mc_deferred); + TAILQ_INIT(&mc->mc_packets_in); + TAILQ_INIT(&mc->mc_packets_out); + mc->mc_enpub = enp; + mc->mc_created = packet_in->pi_received; +#if LSQUIC_ENABLE_HANDSHAKE_DISABLE + if (conn_iface == &mini_conn_iface_disable_handshake) + mc->mc_path.np_pack_size = 1370; + else +#endif + mc->mc_path.np_pack_size = packet_in->pi_data_sz; + mc->mc_conn.cn_cces = mc->mc_cces; + mc->mc_conn.cn_cces_mask = 1; + mc->mc_conn.cn_n_cces = sizeof(mc->mc_cces) / sizeof(mc->mc_cces[0]); + mc->mc_conn.cn_version = version; + mc->mc_conn.cn_pf = select_pf_by_ver(version); + mc->mc_conn.cn_esf_c = select_esf_common_by_ver(version); + mc->mc_conn.cn_esf.g = select_esf_gquic_by_ver(version); + mc->mc_conn.cn_cid = packet_in->pi_conn_id; + mc->mc_conn.cn_flags = LSCONN_MINI | LSCONN_SERVER; + mc->mc_conn.cn_if = conn_iface; + LSQ_DEBUG("created mini connection object"); + MCHIST_APPEND(mc, MCHE_CREATED); + return &mc->mc_conn; +} + + +static int +in_acked_range (const struct ack_info *acki, lsquic_packno_t n) /* This is a copy */ +{ + int in_range = 0; + unsigned i; + for (i = 0; i < acki->n_ranges; ++i) + in_range += acki->ranges[i].high >= n + && acki->ranges[i].low <= n; + return in_range > 0; +} + + +static void +take_rtt_sample (struct mini_conn *mc, const lsquic_packet_out_t *packet_out, + lsquic_time_t now, lsquic_time_t lack_delta) +{ + assert(packet_out->po_sent); + lsquic_time_t measured_rtt = now - packet_out->po_sent; + if (lack_delta < measured_rtt) + { + lsquic_rtt_stats_update(&mc->mc_rtt_stats, measured_rtt, lack_delta); + LSQ_DEBUG("srtt: %"PRIu64" usec, var: %"PRIu64, + lsquic_rtt_stats_get_srtt(&mc->mc_rtt_stats), + lsquic_rtt_stats_get_rttvar(&mc->mc_rtt_stats)); + } +} + + +static unsigned +process_ack_frame (struct mini_conn *mc, lsquic_packet_in_t *packet_in, + const unsigned char *p, size_t len) +{ + int parsed_len; + int n_newly_acked; + unsigned n; + lsquic_packet_out_t *packet_out, *next; + struct ack_info *acki; + lsquic_packno_t packno; + lsquic_time_t warn_time; + char buf[200]; + + acki = mc->mc_enpub->enp_mm.acki; + parsed_len = mc->mc_conn.cn_pf->pf_parse_ack_frame(p, len, acki, 0); + if (parsed_len < 0) + return 0; + if (empty_ack_frame(acki)) + { + LSQ_DEBUG("Ignore empty ACK frame"); + return parsed_len; + } + if (packet_in->pi_packno <= mc->mc_max_ack_packno) + { + LSQ_DEBUG("Ignore old ack (max %u)", mc->mc_max_ack_packno); + return parsed_len; + } + + /* Verify ACK frame and update list of acked packet numbers: */ + for (n = 0; n < acki->n_ranges; ++n) + for (packno = acki->ranges[n].low; packno <= acki->ranges[n].high; + ++packno) + if (packno > MINICONN_MAX_PACKETS || + 0 == (MCONN_PACKET_MASK(packno) & mc->mc_sent_packnos)) + { + warn_time = lsquic_time_now(); + if (0 == mc->mc_enpub->enp_last_warning[WT_ACKPARSE_MINI] + || mc->mc_enpub->enp_last_warning[WT_ACKPARSE_MINI] + + WARNING_INTERVAL < warn_time) + { + mc->mc_enpub->enp_last_warning[WT_ACKPARSE_MINI] + = warn_time; + lsquic_hexdump(p, len, buf, sizeof(buf)); + LSQ_WARN("packet %"PRIu64" was never sent; ACK " + "frame:\n%s", packno, buf); + } + else + LSQ_DEBUG("packet %"PRIu64" was never sent", packno); + MCHIST_APPEND(mc, MCHE_UNSENT_ACKED); + return 0; + } + else + mc->mc_acked_packnos |= MCONN_PACKET_MASK(packno); + + EV_LOG_ACK_FRAME_IN(LSQUIC_LOG_CONN_ID, acki); + n_newly_acked = 0; + for (packet_out = TAILQ_FIRST(&mc->mc_packets_out); packet_out; + packet_out = next) + { + next = TAILQ_NEXT(packet_out, po_next); + if (in_acked_range(acki, packet_out->po_packno)) + { + ++n_newly_acked; + LSQ_DEBUG("Got ACK for packet %"PRIu64, packet_out->po_packno); + if (packet_out->po_packno == largest_acked(acki)) + take_rtt_sample(mc, packet_out, packet_in->pi_received, + acki->lack_delta); + TAILQ_REMOVE(&mc->mc_packets_out, packet_out, po_next); + mini_destroy_packet(mc, packet_out); + } + } + + if (n_newly_acked > 0) + mc->mc_hsk_count = 0; + + return parsed_len; +} + + +static unsigned +process_blocked_frame (struct mini_conn *mc, lsquic_packet_in_t *packet_in, + const unsigned char *p, size_t len) +{ + lsquic_stream_id_t stream_id; + int parsed_len; + parsed_len = mc->mc_conn.cn_pf->pf_parse_blocked_frame(p, len, &stream_id); + if (parsed_len < 0) + return 0; + EV_LOG_BLOCKED_FRAME_IN(LSQUIC_LOG_CONN_ID, stream_id); + LSQ_DEBUG("Peer reports stream %"PRIu64" as blocked", stream_id); + return parsed_len; +} + + +static unsigned +process_connection_close_frame (struct mini_conn *mc, + lsquic_packet_in_t *packet_in, const unsigned char *p, size_t len) +{ + uint64_t error_code; + uint16_t reason_len; + uint8_t reason_off; + int parsed_len; + parsed_len = mc->mc_conn.cn_pf->pf_parse_connect_close_frame(p, len, + NULL, &error_code, &reason_len, &reason_off); + if (parsed_len < 0) + return 0; + mc->mc_error_code = (uint64_t) error_code; + EV_LOG_CONNECTION_CLOSE_FRAME_IN(LSQUIC_LOG_CONN_ID, error_code, + (int) reason_len, (const char *) p + reason_off); + if (error_code != 25 /* No recent network activity */ + && error_code != 62 /* An active session exists for the given IP */ + && error_code != 27 ) /* Write failed with error: -142 (Unknown error)*/ + { + LSQ_WARN("Received CONNECTION_CLOSE frame (code: %"PRIu64"; reason: %.*s)", + error_code, (int) reason_len, (const char *) p + reason_off); + } + MCHIST_APPEND(mc, MCHE_CONN_CLOSE); + return 0; /* This shuts down the connection */ +} + + +static unsigned +process_goaway_frame (struct mini_conn *mc, lsquic_packet_in_t *packet_in, + const unsigned char *p, size_t len) +{ + lsquic_stream_id_t stream_id; + uint32_t error_code; + uint16_t reason_length; + const char *reason; + int parsed_len; + parsed_len = mc->mc_conn.cn_pf->pf_parse_goaway_frame(p, len, &error_code, &stream_id, + &reason_length, &reason); + if (parsed_len < 0) + return 0; + EV_LOG_GOAWAY_FRAME_IN(LSQUIC_LOG_CONN_ID, error_code, stream_id, + reason_length, reason); + LSQ_DEBUG("received GOAWAY frame, last good stream ID: %"PRIu64", " + "error code: 0x%X, reason: `%.*s'", stream_id, error_code, + reason_length, reason); + if (stream_id != 0) /* This is odd. We warn: */ + LSQ_WARN("stream ID is %"PRIu64" in GOAWAY frame", stream_id); + mc->mc_conn.cn_flags |= LSCONN_PEER_GOING_AWAY; + return parsed_len; +} + + +static unsigned +process_invalid_frame (struct mini_conn *mc, lsquic_packet_in_t *packet_in, + const unsigned char *p, size_t len) +{ + LSQ_INFO("invalid frame"); + MCHIST_APPEND(mc, MCHE_INVALID_FRAME); + return 0; +} + + +static unsigned +count_zero_bytes (const unsigned char *p, size_t len) +{ + const unsigned char *const end = p + len; + while (p < end && 0 == *p) + ++p; + return len - (end - p); +} + + +static unsigned +process_padding_frame (struct mini_conn *mc, lsquic_packet_in_t *packet_in, + const unsigned char *p, size_t len) +{ + len = (size_t) count_zero_bytes(p, len); + EV_LOG_PADDING_FRAME_IN(LSQUIC_LOG_CONN_ID, len); + return len; +} + + +static unsigned +process_ping_frame (struct mini_conn *mc, lsquic_packet_in_t *packet_in, + const unsigned char *p, size_t len) +{ + EV_LOG_PING_FRAME_IN(LSQUIC_LOG_CONN_ID); + return 1; +} + + +static unsigned +process_rst_stream_frame (struct mini_conn *mc, lsquic_packet_in_t *packet_in, + const unsigned char *p, size_t len) +{ + lsquic_stream_id_t stream_id; + uint64_t offset, error_code; + int parsed_len; + parsed_len = mc->mc_conn.cn_pf->pf_parse_rst_frame(p, len, &stream_id, &offset, &error_code); + if (parsed_len < 0) + return 0; + EV_LOG_RST_STREAM_FRAME_IN(LSQUIC_LOG_CONN_ID, stream_id, offset, + error_code); + LSQ_DEBUG("Got RST_STREAM; stream: %"PRIu64"; offset: 0x%"PRIX64, stream_id, + offset); + if (LSQUIC_GQUIC_STREAM_HANDSHAKE == stream_id) + { + LSQ_INFO("handshake stream reset, closing connection"); + return 0; + } + else + return parsed_len; +} + + +static unsigned +process_stop_waiting_frame (struct mini_conn *mc, lsquic_packet_in_t *packet_in, + const unsigned char *p, size_t len) +{ + lsquic_packno_t least; + enum packno_bits bits = lsquic_packet_in_packno_bits(packet_in); + int parsed_len; + parsed_len = mc->mc_conn.cn_pf->pf_parse_stop_waiting_frame(p, len, packet_in->pi_packno, bits, + &least); + if (parsed_len < 0) + return 0; + EV_LOG_STOP_WAITING_FRAME_IN(LSQUIC_LOG_CONN_ID, least); + LSQ_DEBUG("Got STOP_WAITING frame, least unacked: %"PRIu64, least); + if (least > MINICONN_MAX_PACKETS) + return 0; + else + { + mc->mc_cutoff = least; + return parsed_len; + } +} + + +static unsigned +process_stream_frame (struct mini_conn *mc, lsquic_packet_in_t *packet_in, + const unsigned char *p, size_t len) +{ + stream_frame_t stream_frame; + int parsed_len; + parsed_len = mc->mc_conn.cn_pf->pf_parse_stream_frame(p, len, &stream_frame); + if (parsed_len < 0) + return 0; + EV_LOG_STREAM_FRAME_IN(LSQUIC_LOG_CONN_ID, &stream_frame); + LSQ_DEBUG("Got stream frame for stream #%"PRIu64, stream_frame.stream_id); + if (LSQUIC_GQUIC_STREAM_HANDSHAKE == stream_frame.stream_id) + { + if (packet_in->pi_flags & PI_HSK_STREAM) + { /* This is not supported for simplicity. The spec recommends + * not putting more than one stream frame from the same stream + * into a single packet. If this changes and clients actually + * do that, we can revisit this code. + */ + LSQ_INFO("two handshake stream frames in single incoming packet"); + MCHIST_APPEND(mc, MCHE_2HSK_1STREAM); + return 0; + } + if (stream_frame.data_frame.df_offset >= mc->mc_read_off) + { + packet_in->pi_flags |= PI_HSK_STREAM; + packet_in->pi_hsk_stream = p - packet_in->pi_data; + mc->mc_flags |= MC_HAVE_NEW_HSK; + MCHIST_APPEND(mc, MCHE_NEW_HSK); + if (0 == stream_frame.data_frame.df_offset) + /* First CHLO message: update maximum packet size */ + mc->mc_path.np_pack_size = packet_in->pi_data_sz; + } + else + { + LSQ_DEBUG("drop duplicate frame"); + MCHIST_APPEND(mc, MCHE_DUP_HSK); + } + } + return parsed_len; +} + + +static unsigned +process_window_update_frame (struct mini_conn *mc, + lsquic_packet_in_t *packet_in, const unsigned char *p, size_t len) +{ + lsquic_stream_id_t stream_id; + uint64_t offset; + int parsed_len; + parsed_len = mc->mc_conn.cn_pf->pf_parse_window_update_frame(p, len, &stream_id, &offset); + if (parsed_len < 0) + return 0; + EV_LOG_WINDOW_UPDATE_FRAME_IN(LSQUIC_LOG_CONN_ID, stream_id, offset); + if (LSQUIC_GQUIC_STREAM_HANDSHAKE == stream_id) + /* This should not happen: why would the client send us WINDOW_UPDATE + * on stream 1? + */ + LSQ_WARN("client sent WINDOW_UPDATE for handshake stream, " + "offset %"PRIu64, offset); + return parsed_len; +} + + +typedef unsigned (*process_frame_f)( + struct mini_conn *, lsquic_packet_in_t *, const unsigned char *p, size_t); + + +static process_frame_f const process_frames[N_QUIC_FRAMES] = +{ + [QUIC_FRAME_ACK] = process_ack_frame, + [QUIC_FRAME_BLOCKED] = process_blocked_frame, + [QUIC_FRAME_CONNECTION_CLOSE] = process_connection_close_frame, + [QUIC_FRAME_GOAWAY] = process_goaway_frame, + [QUIC_FRAME_INVALID] = process_invalid_frame, + [QUIC_FRAME_PADDING] = process_padding_frame, + [QUIC_FRAME_PING] = process_ping_frame, + [QUIC_FRAME_RST_STREAM] = process_rst_stream_frame, + [QUIC_FRAME_STOP_WAITING] = process_stop_waiting_frame, + [QUIC_FRAME_STREAM] = process_stream_frame, + [QUIC_FRAME_WINDOW_UPDATE] = process_window_update_frame, +}; + + +static unsigned +process_packet_frame (struct mini_conn *mc, lsquic_packet_in_t *packet_in, + const unsigned char *p, size_t len) +{ + enum quic_frame_type type = mc->mc_conn.cn_pf->pf_parse_frame_type(p[0]); + packet_in->pi_frame_types |= 1 << type; + return process_frames[type](mc, packet_in, p, len); +} + + +static void +record_largest_recv (struct mini_conn *mc, lsquic_time_t t) +{ + if (t < mc->mc_created) + { + LSQ_WARN("largest received predates creation"); + return; + } + t -= mc->mc_created; + mc->mc_largest_recv[0] = t; + mc->mc_largest_recv[1] = t >> 8; + mc->mc_largest_recv[2] = t >> 16; + LSQ_DEBUG("recorded largest received timestamp as %"PRIu64" usec since " + "creation", t); +} + + +static enum dec_packin +conn_decrypt_packet (struct mini_conn *conn, lsquic_packet_in_t *packet_in) +{ +#if LSQUIC_ENABLE_HANDSHAKE_DISABLE + if (getenv("LSQUIC_DISABLE_HANDSHAKE")) + { + (void) lsquic_conn_copy_and_release_pi_data(&conn->mc_conn, + conn->mc_enpub, packet_in); + packet_in->pi_flags |= PI_DECRYPTED; + return 0; + } + else +#endif + return conn->mc_conn.cn_esf_c->esf_decrypt_packet( + conn->mc_conn.cn_enc_session, conn->mc_enpub, + &conn->mc_conn, packet_in); +} + + +static enum { PRP_KEEP, PRP_DEFER, PRP_DROP, PRP_ERROR } +process_regular_packet (struct mini_conn *mc, lsquic_packet_in_t *packet_in) +{ + const unsigned char *p, *pend; + unsigned len; + + /* Decrypt packet if necessary */ + if (0 == (packet_in->pi_flags & PI_DECRYPTED)) + { + if (DECPI_OK == conn_decrypt_packet(mc, packet_in)) + MCHIST_APPEND(mc, MCHE_DECRYPTED); + else if (mc->mc_conn.cn_esf.g->esf_have_key_gt_one( + mc->mc_conn.cn_enc_session)) + { + LSQ_INFO("could not decrypt packet: drop"); + mc->mc_dropped_packnos |= MCONN_PACKET_MASK(packet_in->pi_packno); + MCHIST_APPEND(mc, MCHE_UNDECR_DROP); + return PRP_DROP; + } + else if ((packet_in->pi_flags & PI_OWN_DATA) || + 0 == lsquic_conn_copy_and_release_pi_data(&mc->mc_conn, + mc->mc_enpub, packet_in)) + { + assert(packet_in->pi_flags & PI_OWN_DATA); + LSQ_INFO("could not decrypt packet: defer"); + mc->mc_deferred_packnos |= MCONN_PACKET_MASK(packet_in->pi_packno); + MCHIST_APPEND(mc, MCHE_UNDECR_DEFER); + return PRP_DEFER; + } + else + { + MCHIST_APPEND(mc, MCHE_ENOMEM); + return PRP_ERROR; /* Memory allocation must have failed */ + } + } + + /* Update receive history before processing the packet: if there is an + * error, the connection is terminated and recording this packet number + * is helpful when it is printed along with other diagnostics in dtor. + */ + if (0 == mc->mc_received_packnos || + packet_in->pi_packno > highest_bit_set(mc->mc_received_packnos) + 1) + record_largest_recv(mc, packet_in->pi_received); + mc->mc_received_packnos |= MCONN_PACKET_MASK(packet_in->pi_packno); + + /* Parse and process frames */ + p = packet_in->pi_data + packet_in->pi_header_sz; + pend = packet_in->pi_data + packet_in->pi_data_sz; + while (p < pend) + { + len = process_packet_frame(mc, packet_in, p, pend - p); + if (len > 0) + p += len; + else + { + if (mc->mc_conn.cn_pf->pf_parse_frame_type(p[0]) != + QUIC_FRAME_CONNECTION_CLOSE) + LSQ_WARN("error parsing frame: packno %"PRIu64"; sz: %u; type: " + "0x%X", packet_in->pi_packno, packet_in->pi_data_sz, p[0]); + MCHIST_APPEND(mc, MCHE_EFRAME); + return PRP_ERROR; + } + } + + mc->mc_flags |= MC_GEN_ACK; + + return PRP_KEEP; +} + + +struct hsk_chunk +{ + lsquic_packet_in_t *hsk_packet_in; + const unsigned char *hsk_data; + unsigned hsk_off; + unsigned hsk_sz; +}; + + +static int +compare_hsk_chunks (const void *ap, const void *bp) +{ + const struct hsk_chunk *a = ap; + const struct hsk_chunk *b = bp; + return (a->hsk_off > b->hsk_off) - (b->hsk_off > a->hsk_off); +} + + +struct mini_stream_ctx +{ + const unsigned char *buf; + size_t bufsz; + size_t off; +}; + + +static int +mini_stream_has_data (const struct mini_stream_ctx *ms_ctx) +{ + return ms_ctx->off < ms_ctx->bufsz; +} + + +static size_t +mini_stream_read (void *stream, void *buf, size_t len, int *reached_fin) +{ + struct mini_stream_ctx *ms_ctx = stream; + size_t avail = ms_ctx->bufsz - ms_ctx->off; + if (avail < len) + len = avail; + memcpy(buf, ms_ctx->buf + ms_ctx->off, len); + ms_ctx->off += len; + *reached_fin = 0; + return len; +} + + +static size_t +mini_stream_size (void *stream) +{ + struct mini_stream_ctx *ms_ctx = stream; + size_t avail = ms_ctx->bufsz - ms_ctx->off; + return avail; +} + + +static int +mini_stream_fin (void *stream) +{ /* There is never a FIN on the handshake stream */ + return 0; +} + + +static lsquic_packno_t +next_packno (struct mini_conn *mc) +{ + if (mc->mc_cur_packno < MINICONN_MAX_PACKETS) + { + return ++mc->mc_cur_packno; + } + else + { + if (!(mc->mc_flags & MC_OO_PACKNOS)) + { + MCHIST_APPEND(mc, MCHE_OUT_OF_PACKNOS); + mc->mc_flags |= MC_OO_PACKNOS; + LSQ_DEBUG("ran out of outgoing packet numbers"); + } + return MINICONN_MAX_PACKETS + 1; + } +} + + +static lsquic_packet_out_t * +allocate_packet_out (struct mini_conn *mc, const unsigned char *nonce) +{ + lsquic_packet_out_t *packet_out; + lsquic_packno_t packno; + packno = next_packno(mc); + if (packno > MINICONN_MAX_PACKETS) + { + LSQ_DEBUG("ran out of outgoing packet numbers, won't allocate packet"); + return NULL; + } + packet_out = lsquic_packet_out_new(&mc->mc_enpub->enp_mm, NULL, 1, + &mc->mc_conn, GQUIC_PACKNO_LEN_1, NULL, nonce, &mc->mc_path); + if (!packet_out) + { + LSQ_WARN("could not allocate packet: %s", strerror(errno)); + return NULL; + } + packet_out->po_loss_chain = packet_out; + packet_out->po_packno = packno; + packet_out->po_flags |= PO_MINI; + if (mc->mc_flags & MC_HAVE_SHLO) + { + packet_out->po_flags |= PO_HELLO; + packet_out->po_header_type = HETY_0RTT; + } + lsquic_packet_out_set_pns(packet_out, PNS_APP); + TAILQ_INSERT_TAIL(&mc->mc_packets_out, packet_out, po_next); + LSQ_DEBUG("allocated packet #%"PRIu64", nonce: %d", packno, !!nonce); + MCHIST_APPEND(mc, MCHE_NEW_PACKET_OUT); + EV_LOG_PACKET_CREATED(LSQUIC_LOG_CONN_ID, packet_out); + return packet_out; +} + + +static int +packetize_response (struct mini_conn *mc, const unsigned char *buf, + size_t bufsz, const unsigned char *nonce) +{ + struct mini_stream_ctx ms_ctx; + lsquic_packet_out_t *packet_out; + size_t cur_off; + int len; + + LSQ_DEBUG("Packetizing %zd bytes of handshake response", bufsz); + + ms_ctx.buf = buf; + ms_ctx.bufsz = bufsz; + ms_ctx.off = 0; + + do + { + packet_out = allocate_packet_out(mc, nonce); + if (!packet_out) + return -1; + cur_off = ms_ctx.off; + len = mc->mc_conn.cn_pf->pf_gen_stream_frame(packet_out->po_data + packet_out->po_data_sz, + lsquic_packet_out_avail(packet_out), + LSQUIC_GQUIC_STREAM_HANDSHAKE, mc->mc_write_off, mini_stream_fin(&ms_ctx), + mini_stream_size(&ms_ctx), mini_stream_read, &ms_ctx); + if (len < 0) + { + LSQ_WARN("cannot generate stream frame (avail: %u)", + lsquic_packet_out_avail(packet_out)); + return -1; + } + mc->mc_write_off += ms_ctx.off - cur_off; + EV_LOG_GENERATED_STREAM_FRAME(LSQUIC_LOG_CONN_ID, mc->mc_conn.cn_pf, + packet_out->po_data + packet_out->po_data_sz, len); + packet_out->po_data_sz += len; + packet_out->po_frame_types |= 1 << QUIC_FRAME_STREAM; + if (0 == lsquic_packet_out_avail(packet_out)) + packet_out->po_flags |= PO_STREAM_END; + } + while (mini_stream_has_data(&ms_ctx)); + + /* PAD the last packet with NULs. ACK and STOP_WAITING go into a separate + * packet. + */ + if (lsquic_packet_out_avail(packet_out)) + { + EV_LOG_CONN_EVENT(LSQUIC_LOG_CONN_ID, "generated PADDING frame %u " + "bytes long", lsquic_packet_out_avail(packet_out)); + memset(packet_out->po_data + packet_out->po_data_sz, 0, + lsquic_packet_out_avail(packet_out)); + packet_out->po_data_sz += lsquic_packet_out_avail(packet_out); + packet_out->po_frame_types |= 1 << QUIC_FRAME_PADDING; + } + + return 0; +} + + +static int +continue_handshake (struct mini_conn *mc) +{ + lsquic_packet_in_t *packet_in; + unsigned n_hsk_chunks = 0, n_contig, n, bufsz, off; + int s, rv; + size_t out_len; + enum handshake_error he; + unsigned char *buf_in_16k, *buf_out; + const unsigned char *buf_in; + time_t t; + stream_frame_t frame; + struct hsk_chunk hsk_chunks[MINICONN_MAX_PACKETS], *hsk_chunk; + unsigned char nonce_buf[32]; + int nonce_set = 0; + + /* Get handshake stream data from each packet that contains a handshake + * stream frame and place them into `hsk_chunks' array. + */ + TAILQ_FOREACH(packet_in, &mc->mc_packets_in, pi_next) + { + assert(n_hsk_chunks < sizeof(hsk_chunks) / sizeof(hsk_chunks[0])); + if (0 == (packet_in->pi_flags & PI_HSK_STREAM)) + continue; + s = mc->mc_conn.cn_pf->pf_parse_stream_frame(packet_in->pi_data + packet_in->pi_hsk_stream, + packet_in->pi_data_sz - packet_in->pi_hsk_stream, &frame); + if (-1 == s) + { + LSQ_WARN("cannot process hsk stream frame in packet %"PRIu64, + packet_in->pi_packno); + return -1; + } + hsk_chunk = &hsk_chunks[ n_hsk_chunks++ ]; + hsk_chunk->hsk_packet_in = packet_in; + hsk_chunk->hsk_data = frame.data_frame.df_data; + hsk_chunk->hsk_off = frame.data_frame.df_offset; + hsk_chunk->hsk_sz = frame.data_frame.df_size; + } + assert(n_hsk_chunks > 0); + + if (n_hsk_chunks > 1) + { + /* Sort handshake stream data */ + qsort(hsk_chunks, n_hsk_chunks, sizeof(hsk_chunks[0]), + compare_hsk_chunks); + /* Figure out how many packets contain handshake stream data in a + * contiguous buffer and how large this data is. + */ + for (n = 1, n_contig = 1, bufsz = hsk_chunks[0].hsk_sz; + n < n_hsk_chunks; ++n) + if (hsk_chunks[n - 1].hsk_off + hsk_chunks[n - 1].hsk_sz == + hsk_chunks[n].hsk_off) + { + ++n_contig; + bufsz += hsk_chunks[n].hsk_sz; + } + else + break; + } + else + { + n_contig = 1; + bufsz = hsk_chunks[0].hsk_sz; + } + + /* Handshake handler expects to start reading at a particular offset. + */ + if (hsk_chunks[0].hsk_off != mc->mc_read_off) + { + LSQ_DEBUG("smallest hsk offset is %u, need %hu", + hsk_chunks[0].hsk_off, mc->mc_read_off); + MCHIST_APPEND(mc, MCHE_HELLO_HOLE); + return 0; + } + + LSQ_DEBUG("# of contiguous stream frames: %u out of %u; offset: %u; " + "total size: %u", n_contig, n_hsk_chunks, hsk_chunks[0].hsk_off, bufsz); + + if (bufsz > 16 * 1024) + { + LSQ_INFO("too much contiguous handshake data (%u bytes); max: %u", + bufsz, 16 * 1024); + MCHIST_APPEND(mc, MCHE_HELLO_TOO_MUCH); + return -1; + } + + /* From here on, since we need to clean up, we use `rv' and `goto end' + * to handle error conditions and cleanup. + */ + rv = -1; + if (n_contig > 1) + { + buf_in = buf_in_16k = lsquic_mm_get_16k(&mc->mc_enpub->enp_mm); + if (!buf_in) + { + LSQ_WARN("could not allocate in buffer: %s", strerror(errno)); + buf_out = NULL; + goto end; + } + /* Create a single contiguous buffer to pass to lsquic_enc_session_handle_chlo */ + off = 0; + for (n = 0; n < n_contig; ++n) + { + memcpy(buf_in_16k + off, hsk_chunks[n].hsk_data, + hsk_chunks[n].hsk_sz); + off += hsk_chunks[n].hsk_sz; + } + assert(off == bufsz); + } + else + { + buf_in_16k = NULL; + buf_in = hsk_chunks[0].hsk_data; + } + + buf_out = lsquic_mm_get_16k(&mc->mc_enpub->enp_mm); + if (!buf_out) + { + LSQ_WARN("could not allocate out buffer: %s", strerror(errno)); + goto end; + } + out_len = 16 * 1024; + + /* Allocate enc_session for the server if first time around: */ + if (!mc->mc_conn.cn_enc_session) + { + mc->mc_conn.cn_enc_session = + mc->mc_conn.cn_esf.g->esf_create_server(mc->mc_conn.cn_cid, + mc->mc_enpub); + if (!mc->mc_conn.cn_enc_session) + { + LSQ_WARN("cannot create new enc session"); + goto end; + } + MCHIST_APPEND(mc, MCHE_NEW_ENC_SESS); + } + + t = time(NULL); + he = mc->mc_conn.cn_esf.g->esf_handle_chlo(mc->mc_conn.cn_enc_session, + mc->mc_conn.cn_version, + buf_in, bufsz, t, NP_PEER_SA(&mc->mc_path), + NP_LOCAL_SA(&mc->mc_path), + buf_out, &out_len, nonce_buf, &nonce_set); + + if (HS_SHLO == he) + mc->mc_flags |= MC_HAVE_SHLO; + else + mc->mc_flags &= ~MC_HAVE_SHLO; + + MCHIST_APPEND(mc, he == DATA_NOT_ENOUGH ? MCHE_HANDLE_NOT_ENOUGH : + he == HS_SHLO ? MCHE_HANDLE_SHLO : + he == HS_1RTT ? MCHE_HANDLE_1RTT : + he == HS_2RTT ? MCHE_HANDLE_2RTT : + he == HS_ERROR ? MCHE_HANDLE_ERROR : + MCHE_HAHDLE_UNKNOWN); + + if ((HS_SHLO == he || HS_1RTT == he) && !mc->mc_rtt_stats.srtt) + { + uint32_t irtt; + if (0 == mc->mc_conn.cn_esf.g->esf_get_peer_setting( + mc->mc_conn.cn_enc_session, QTAG_IRTT, &irtt)) + { + /* Do not allow the client to specify unreasonable values: + * smaller than 10ms or larger than 15s. Per reference + * implementation. + */ + if (irtt > 15 * 1000 * 1000) + irtt = 15 * 1000 * 1000; + else if (irtt < 10 * 1000) + irtt = 10 * 1000; + lsquic_rtt_stats_update(&mc->mc_rtt_stats, irtt, 0); + LSQ_DEBUG("Set initial SRTT to %"PRIu32" usec based on client-" + "supplied IRTT value", irtt); + } + } + + switch (he) + { + case DATA_NOT_ENOUGH: + LSQ_DEBUG("lsquic_enc_session_handle_chlo needs more data"); + break; + case HS_SHLO: + mc->mc_conn.cn_flags |= LSCONN_HANDSHAKE_DONE; + mc->mc_flags |= MC_PROMOTE; + LSQ_DEBUG("lsquic_enc_session_handle_chlo returned %d, promote", he); + /* Fall through */ + case HS_1RTT: + assert(out_len > 0); + if (mc->mc_conn.cn_version < LSQVER_046 + && !mc->mc_conn.cn_esf.g->esf_get_peer_option( + mc->mc_conn.cn_enc_session, QTAG_NSTP)) + mc->mc_flags |= MC_STOP_WAIT_ON; + if (0 != packetize_response(mc, buf_out, out_len, + nonce_set ? nonce_buf : NULL)) + goto end; + mc->mc_read_off += bufsz; + for (n = 0; n < n_contig; ++n) + hsk_chunks[n].hsk_packet_in->pi_flags &= ~PI_HSK_STREAM; + LSQ_DEBUG("read offset is now %hu", mc->mc_read_off); + break; + default: + LSQ_WARN("unexpected return value from lsquic_enc_session_handle_chlo: %u", he); + /* fallthru */ + case HS_ERROR: +#if !LSQUIC_KEEP_ENC_SESS_HISTORY + mc->mc_conn.cn_esf.g->esf_destroy(mc->mc_conn.cn_enc_session); + mc->mc_conn.cn_enc_session = NULL; +#endif + mc->mc_flags |= MC_HSK_ERR; + LSQ_INFO("lsquic_enc_session_handle_chlo returned an error (%d)", he); + goto end; + } + + rv = 0; + + end: + mc->mc_flags &= ~MC_HAVE_SHLO; + if (buf_in_16k) + lsquic_mm_put_16k(&mc->mc_enpub->enp_mm, buf_in_16k); + if (buf_out) + lsquic_mm_put_16k(&mc->mc_enpub->enp_mm, buf_out); + return rv; +} + + +struct mini_rechist +{ + const struct mini_conn *mc; + mconn_packno_set_t cur_set; + int cur_idx; + struct lsquic_packno_range range; /* We return a pointer to this */ +}; + + +static void +mini_rechist_init (struct mini_rechist *rechist, const struct mini_conn *mc) +{ + rechist->mc = mc; + rechist->cur_set = 0; + rechist->cur_idx = 0; +} + + +static lsquic_time_t +mini_rechist_largest_recv (void *rechist_ctx) +{ + struct mini_rechist *rechist = rechist_ctx; + const struct mini_conn *mc = rechist->mc; + lsquic_time_t delta = mc->mc_largest_recv[0] + + (mc->mc_largest_recv[1] << 8) + + (mc->mc_largest_recv[2] << 16); + LSQ_DEBUG("%s: largest received: %"PRIu64" usec since creation", + __func__, delta); + return mc->mc_created + delta; +} + + +static const struct lsquic_packno_range * +mini_rechist_next (void *rechist_ctx) +{ + struct mini_rechist *rechist = rechist_ctx; + const struct mini_conn *mc = rechist->mc; + mconn_packno_set_t packnos; + int i; + + packnos = rechist->cur_set; + if (0 == packnos) + return NULL; + + /* There may be a faster way to do this, but for now, we just want + * correctness. + */ + for (i = rechist->cur_idx; i >= 0; --i) + if (packnos & (1ULL << i)) + { + rechist->range.low = i + 1; + rechist->range.high = i + 1; + break; + } + assert(i >= 0); /* We must have hit at least one bit */ + --i; + for ( ; i >= 0 && (packnos & (1ULL << i)); --i) + rechist->range.low = i + 1; + if (i >= 0) + { + rechist->cur_set = packnos & ((1ULL << i) - 1); + rechist->cur_idx = i; + } + else + rechist->cur_set = 0; + LSQ_DEBUG("%s: return [%"PRIu64", %"PRIu64"]", __func__, + rechist->range.low, rechist->range.high); + return &rechist->range; +} + + +static const struct lsquic_packno_range * +mini_rechist_first (void *rechist_ctx) +{ + struct mini_rechist *rechist = rechist_ctx; + rechist->cur_set = rechist->mc->mc_received_packnos; + rechist->cur_idx = highest_bit_set(rechist->cur_set); + return mini_rechist_next(rechist_ctx); +} + + +static lsquic_packno_t +least_unacked (const struct mini_conn *mc) +{ + mconn_packno_set_t unacked; + lsquic_packno_t packno; + unacked = mc->mc_sent_packnos & ~mc->mc_acked_packnos; + if (unacked) + packno = lowest_bit_set(unacked) + 1; + else + packno = highest_bit_set(mc->mc_sent_packnos) + 2; + LSQ_DEBUG("%s: least unacked: %"PRIu64, __func__, packno); + return packno; +} + + +static int +generate_ack_and_stop_waiting (struct mini_conn *mc, lsquic_time_t now) +{ + lsquic_packet_out_t *packet_out; + struct mini_rechist rechist; + int len, not_used_has_missing; + lsquic_packno_t lunack; + + /* Chrome's quic_server places ACK and STOP_WAITING frames into a separate + * packet. + */ + packet_out = allocate_packet_out(mc, NULL); + if (!packet_out) + return -1; + + /* Generate ACK frame */ + mini_rechist_init(&rechist, mc); + len = mc->mc_conn.cn_pf->pf_gen_ack_frame(packet_out->po_data + packet_out->po_data_sz, + lsquic_packet_out_avail(packet_out), mini_rechist_first, + mini_rechist_next, mini_rechist_largest_recv, &rechist, + now, ¬_used_has_missing, &packet_out->po_ack2ed, NULL); + if (len < 0) + { + LSQ_WARN("could not generate ACK frame"); + return -1; + } + EV_LOG_GENERATED_ACK_FRAME(LSQUIC_LOG_CONN_ID, mc->mc_conn.cn_pf, + packet_out->po_data + packet_out->po_data_sz, len); + packet_out->po_frame_types |= 1 << QUIC_FRAME_ACK; + packet_out->po_data_sz += len; + packet_out->po_regen_sz += len; + LSQ_DEBUG("wrote ACK frame of size %d", len); + + /* Generate STOP_WAITING frame */ + if ((mc->mc_flags & MC_STOP_WAIT_ON) && mc->mc_sent_packnos) + { + lunack = least_unacked(mc); + len = mc->mc_conn.cn_pf->pf_gen_stop_waiting_frame(packet_out->po_data + + packet_out->po_data_sz, + lsquic_packet_out_avail(packet_out), packet_out->po_packno, + lsquic_packet_out_packno_bits(packet_out), lunack); + if (len < 0) + { + LSQ_WARN("could not generate STOP_WAITING frame"); + return -1; + } + packet_out->po_data_sz += len; + packet_out->po_regen_sz += len; + packet_out->po_frame_types |= 1 << QUIC_FRAME_STOP_WAITING; + LSQ_DEBUG("wrote STOP_WAITING frame of size %d", len); + EV_LOG_GENERATED_STOP_WAITING_FRAME(LSQUIC_LOG_CONN_ID, lunack); + } + else if (mc->mc_flags & MC_STOP_WAIT_ON) + LSQ_DEBUG("nothing sent: no need to generate STOP_WAITING frame"); + + mc->mc_flags |= MC_UNSENT_ACK; + return 0; +} + + +static int +calc_retx_timeout (const struct mini_conn *mc) +{ + lsquic_time_t to; + to = lsquic_rtt_stats_get_srtt(&mc->mc_rtt_stats); + if (to) + { + to += to / 2; + if (to < 10000) + to = 10000; + } + else + to = 300000; + return to << mc->mc_hsk_count; +} + + +static void +return_enc_data (struct mini_conn *mc, struct lsquic_packet_out *packet_out) +{ + mc->mc_enpub->enp_pmi->pmi_return(mc->mc_enpub->enp_pmi_ctx, + mc->mc_path.np_peer_ctx, packet_out->po_enc_data, + lsquic_packet_out_ipv6(packet_out)); + packet_out->po_flags &= ~PO_ENCRYPTED; + packet_out->po_enc_data = NULL; +} + + +static int +repackage_packet (struct mini_conn *mc, lsquic_packet_out_t *packet_out) +{ + const lsquic_packno_t oldno = packet_out->po_packno; + const lsquic_packno_t packno = next_packno(mc); + if (packno > MINICONN_MAX_PACKETS) + return -1; + + LSQ_DEBUG("Packet %"PRIu64" repackaged for resending as packet %"PRIu64, + oldno, packno); + EV_LOG_CONN_EVENT(LSQUIC_LOG_CONN_ID, "packet %"PRIu64" repackaged for " + "resending as packet %"PRIu64, oldno, packno); + packet_out->po_packno = packno; + packet_out->po_flags &= ~PO_SENT; + if (packet_out->po_flags & PO_ENCRYPTED) + return_enc_data(mc, packet_out); + TAILQ_INSERT_TAIL(&mc->mc_packets_out, packet_out, po_next); + return 0; +} + + +static int +handle_losses_and_have_unsent (struct mini_conn *mc, lsquic_time_t now) +{ + TAILQ_HEAD(, lsquic_packet_out) lost_packets = + TAILQ_HEAD_INITIALIZER(lost_packets); + lsquic_packet_out_t *packet_out, *next; + lsquic_time_t retx_to = 0; + unsigned n_to_send = 0; + + for (packet_out = TAILQ_FIRST(&mc->mc_packets_out); packet_out; + packet_out = next) + { + next = TAILQ_NEXT(packet_out, po_next); + if (packet_out->po_flags & PO_SENT) + { + if (0 == retx_to) + retx_to = calc_retx_timeout(mc); + if (packet_out->po_sent + retx_to < now) + { + LSQ_DEBUG("packet %"PRIu64" has been lost (rto: %"PRIu64")", + packet_out->po_packno, retx_to); + TAILQ_REMOVE(&mc->mc_packets_out, packet_out, po_next); + TAILQ_INSERT_TAIL(&lost_packets, packet_out, po_next); + mc->mc_lost_packnos |= MCONN_PACKET_MASK(packet_out->po_packno); + MCHIST_APPEND(mc, MCHE_PACKET_LOST); + } + } + else + ++n_to_send; + } + + mc->mc_hsk_count += !TAILQ_EMPTY(&lost_packets); + + while ((packet_out = TAILQ_FIRST(&lost_packets))) + { + TAILQ_REMOVE(&lost_packets, packet_out, po_next); + if ((packet_out->po_frame_types & GQUIC_FRAME_RETRANSMITTABLE_MASK) + && 0 == repackage_packet(mc, packet_out)) + ++n_to_send; + else + mini_destroy_packet(mc, packet_out); + } + + return n_to_send > 0; +} + + +static int +warning_is_warranted (const struct mini_conn *mc) +{ + return (mc->mc_flags & (MC_HSK_ERR|MC_OO_PACKNOS)) + || 0x1C /* QUIC_HANDSHAKE_FAILED */ == mc->mc_error_code + || 0x1D /* QUIC_CRYPTO_TAGS_OUT_OF_ORDER */ == mc->mc_error_code + || 0x1E /* QUIC_CRYPTO_TOO_MANY_ENTRIES */ == mc->mc_error_code + || 0x1F /* QUIC_CRYPTO_INVALID_VALUE_LENGTH */ == mc->mc_error_code + || 0x21 /* QUIC_INVALID_CRYPTO_MESSAGE_TYPE */ == mc->mc_error_code + || 0x22 /* QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER */ == mc->mc_error_code + || 0x23 /* QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND */ == mc->mc_error_code + || 0x24 /* QUIC_CRYPTO_MESSAGE_PARAMETER_NO_OVERLAP */ == mc->mc_error_code + || 0x29 /* QUIC_CRYPTO_TOO_MANY_REJECTS */ == mc->mc_error_code + || 0x2A /* QUIC_PROOF_INVALID */ == mc->mc_error_code + || 0x2B /* QUIC_CRYPTO_DUPLICATE_TAG */ == mc->mc_error_code + || 0x2C /* QUIC_CRYPTO_ENCRYPTION_LEVEL_INCORRECT */ == mc->mc_error_code + || 0x2D /* QUIC_CRYPTO_SERVER_CONFIG_EXPIRED */ == mc->mc_error_code + || 0x35 /* QUIC_CRYPTO_SYMMETRIC_KEY_SETUP_FAILED */ == mc->mc_error_code + ; +} + + +#if LSQUIC_KEEP_ENC_SESS_HISTORY +static void +maybe_log_enc_sess_history (const struct mini_conn *mc) +{ + char eshist[ESHIST_STR_SIZE]; + enum lsq_log_level log_level; + const char *ua; + + if (warning_is_warranted(mc)) + log_level = LSQ_LOG_WARN; + else + log_level = LSQ_LOG_DEBUG; + + if (mc->mc_conn.cn_enc_session) + { + mc->mc_conn.cn_esf.g->esf_get_hist(mc->mc_conn.cn_enc_session, eshist); + ua = mc->mc_conn.cn_esf.g->esf_get_ua(mc->mc_conn.cn_enc_session); + LSQ_LOG1(log_level, "enc hist %s; User-Agent: %s", eshist, + ua ? ua : ""); + } + else + LSQ_LOG1(log_level, "enc session gone: no history to log"); +} + + +#endif + + + + +static int +have_packets_to_send (struct mini_conn *mc, lsquic_time_t now) +{ + return handle_losses_and_have_unsent(mc, now); +} + + +static enum tick_st +mini_conn_ci_tick (struct lsquic_conn *lconn, lsquic_time_t now) +{ + struct mini_conn *mc = (struct mini_conn *) lconn; + enum tick_st tick; + + ++mc->mc_n_ticks; + + if (mc->mc_created + mc->mc_enpub->enp_settings.es_handshake_to < now) + { + LSQ_DEBUG("connection expired: closing"); + tick = TICK_CLOSE; + goto end; + } + + if (mc->mc_flags & MC_ERROR) + { + tick = TICK_CLOSE; + goto end; + } + + + if ((mc->mc_flags & (MC_UNSENT_ACK|MC_GEN_ACK)) == MC_GEN_ACK) + { + if (0 != generate_ack_and_stop_waiting(mc, now)) + { + mc->mc_flags |= MC_ERROR; + tick = TICK_CLOSE; + goto end; + } + else + mc->mc_flags &= ~MC_GEN_ACK; + } + + if (have_packets_to_send(mc, now)) + tick = TICK_SEND; + else + tick = TICK_QUIET; + + if (mc->mc_flags & MC_PROMOTE) + tick |= TICK_PROMOTE; + + end: +#if LSQUIC_KEEP_ENC_SESS_HISTORY + if (tick & (TICK_CLOSE|TICK_PROMOTE)) + maybe_log_enc_sess_history(mc); +#endif + + return tick; +} + + +static void +process_packet (struct mini_conn *mc, struct lsquic_packet_in *packet_in) +{ + switch (process_regular_packet(mc, packet_in)) + { + case PRP_KEEP: + assert(packet_in->pi_flags & PI_OWN_DATA); + lsquic_packet_in_upref(packet_in); + TAILQ_INSERT_TAIL(&mc->mc_packets_in, packet_in, pi_next); + if (mc->mc_flags & MC_HAVE_NEW_HSK) + { + if (0 != continue_handshake(mc)) + mc->mc_flags |= MC_ERROR; + mc->mc_flags &= ~MC_HAVE_NEW_HSK; + } + break; + case PRP_DEFER: + assert(packet_in->pi_flags & PI_OWN_DATA); + lsquic_packet_in_upref(packet_in); + TAILQ_INSERT_TAIL(&mc->mc_deferred, packet_in, pi_next); + break; + case PRP_ERROR: + mc->mc_flags |= MC_ERROR; + break; + case PRP_DROP: + break; + } +} + + +/* Keep deferred list ordered by packet number, so that we can process all + * of them in a single pass. + */ +static void +insert_into_deferred (struct mini_conn *mc, lsquic_packet_in_t *new_packet) +{ + lsquic_packet_in_t *packet_in; + + lsquic_packet_in_upref(new_packet); + + TAILQ_FOREACH(packet_in, &mc->mc_deferred, pi_next) + if (packet_in->pi_packno > new_packet->pi_packno) + break; + + if (packet_in) + TAILQ_INSERT_BEFORE(packet_in, new_packet, pi_next); + else + TAILQ_INSERT_TAIL(&mc->mc_deferred, new_packet, pi_next); +} + + +static void +process_deferred_packets (struct mini_conn *mc) +{ + lsquic_packet_in_t *last, *packet_in; + int reached_last; + + last = TAILQ_LAST(&mc->mc_deferred, head_packet_in); + do + { + packet_in = TAILQ_FIRST(&mc->mc_deferred); + TAILQ_REMOVE(&mc->mc_deferred, packet_in, pi_next); + process_packet(mc, packet_in); + reached_last = packet_in == last; + lsquic_packet_in_put(&mc->mc_enpub->enp_mm, packet_in); + } + while (!reached_last); +} + + +#if LSQUIC_RECORD_INORD_HIST +/* Packet number is encoded as a sequence of 1-bits and stored in mc_inord_hist + * separated by 0 bits. For example, sequence of packet numbers 3, 2, 1 would + * be encoded as (starting with LSB) 1110110100000000... This is not the most + * space-efficient scheme, but it is simple to implement and should suffice for + * our purposes. + */ +static void +record_inord_packno (struct mini_conn *mc, lsquic_packno_t packno) +{ + int n_avail; + lsquic_packno_t mask; + + for ( ; mc->mc_inord_idx < sizeof(mc->mc_inord_hist) / + sizeof(mc->mc_inord_hist[0]); ++mc->mc_inord_idx) + { + if (mc->mc_inord_hist[ mc->mc_inord_idx ]) + n_avail = __builtin_clzll(mc->mc_inord_hist[ mc->mc_inord_idx ]) - 1; + else + n_avail = sizeof(mc->mc_inord_hist[ mc->mc_inord_idx ]) * 8; + if (n_avail >= (int) packno) + { + mask = (1ULL << (int) packno) - 1; + mask <<= sizeof(mc->mc_inord_hist[ mc->mc_inord_idx ]) * 8 - n_avail; + mc->mc_inord_hist[ mc->mc_inord_idx ] |= mask; + return; /* Success */ + } + } +} + + +static void +inord_to_str (const struct mini_conn *mc, char *buf, size_t bufsz) +{ + unsigned long long hist; + size_t off; + ssize_t nw; + unsigned n; + int n_trail; + + off = 0; + for (n = 0; n < sizeof(mc->mc_inord_hist) / + sizeof(mc->mc_inord_hist[0]); ++n) + { + hist = mc->mc_inord_hist[n]; + while (hist) + { + n_trail = __builtin_ctzll(~hist); + nw = snprintf(buf + off, bufsz - off, + /* No spaces are included on purpose: this makes it a single + * field and thus easy to process log using standard command- + * line tools, such as sork -k, for example. + */ + (off ? ",%d" : "%d"), n_trail); + if ((size_t) nw > bufsz - off || nw < 0) + break; + off += nw; + hist >>= n_trail + 1; + } + } + buf[ bufsz - 1 ] = '\0'; /* CYA */ +} + + +#endif + + +static void +mini_conn_ci_packet_in (struct lsquic_conn *lconn, + struct lsquic_packet_in *packet_in) +{ + struct mini_conn *mc = (struct mini_conn *) lconn; + +#if LSQUIC_RECORD_INORD_HIST + record_inord_packno(mc, packet_in->pi_packno); +#endif +#if 0 + /* A convenient way to test lsquic_is_valid_hs_packet(): */ + if (!(mc->mc_sent_packnos)) + assert(lsquic_is_valid_hs_packet(NULL, packet_in->pi_data, + packet_in->pi_data_sz)); +#endif + + if (mc->mc_flags & MC_ERROR) + { + LSQ_DEBUG("error state: ignore packet %"PRIu64, packet_in->pi_packno); + return; + } + + if (lsquic_packet_in_is_gquic_prst(packet_in)) + { + LSQ_INFO("received reset packet"); + mc->mc_flags |= MC_ERROR; + MCHIST_APPEND(mc, MCHE_PRST_IN); + return; + } + + LSQ_DEBUG("packet in: %"PRIu64, packet_in->pi_packno); + EV_LOG_PACKET_IN(LSQUIC_LOG_CONN_ID, packet_in); + + + /* Check receive history */ + if (0 == packet_in->pi_packno) + { + LSQ_DEBUG("invalid packet number 0"); + mc->mc_flags |= MC_ERROR; + MCHIST_APPEND(mc, MCHE_PACKET0_IN); + return; + } + if (packet_in->pi_packno > MINICONN_MAX_PACKETS) + { + LSQ_DEBUG("packet number %"PRIu64" is too large (max %zd)", + packet_in->pi_packno, MINICONN_MAX_PACKETS); + mc->mc_flags |= MC_ERROR; + MCHIST_APPEND(mc, MCHE_PACKET2LARGE_IN); + return; + } + if (MCONN_PACKET_MASK(packet_in->pi_packno) & mc->mc_received_packnos) + { + LSQ_DEBUG("duplicate packet %"PRIu64", ignoring", packet_in->pi_packno); + MCHIST_APPEND(mc, MCHE_PACKET_DUP_IN); + return; + } + + if (TAILQ_EMPTY(&mc->mc_deferred)) + process_packet(mc, packet_in); + else + { + insert_into_deferred(mc, packet_in); + process_deferred_packets(mc); + } +} + + +static struct lsquic_packet_out * +mini_conn_ci_next_packet_to_send (struct lsquic_conn *lconn, size_t size) +{ + struct mini_conn *mc = (struct mini_conn *) lconn; + lsquic_packet_out_t *packet_out; + + assert(0 == size); + TAILQ_FOREACH(packet_out, &mc->mc_packets_out, po_next) + { + if (packet_out->po_flags & PO_SENT) + continue; + packet_out->po_flags |= PO_SENT; + LSQ_DEBUG("packet_to_send: %"PRIu64, packet_out->po_packno); + return packet_out; + } + return NULL; +} + + +static void +mini_conn_ci_packet_sent (struct lsquic_conn *lconn, + struct lsquic_packet_out *packet_out) +{ + struct mini_conn *mc = (struct mini_conn *) lconn; + mc->mc_sent_packnos |= MCONN_PACKET_MASK(packet_out->po_packno); + if (packet_out->po_frame_types & (1 << QUIC_FRAME_ACK)) + { + assert(mc->mc_flags & MC_UNSENT_ACK); + mc->mc_flags &= ~MC_UNSENT_ACK; + } + LSQ_DEBUG("%s: packet %"PRIu64" sent", __func__, packet_out->po_packno); + MCHIST_APPEND(mc, MCHE_PACKET_SENT); +} + + +static void +mini_conn_ci_packet_not_sent (struct lsquic_conn *lconn, + struct lsquic_packet_out *packet_out) +{ + struct mini_conn *mc = (struct mini_conn *) lconn; + packet_out->po_flags &= ~PO_SENT; + LSQ_DEBUG("%s: packet %"PRIu64" not sent", __func__, packet_out->po_packno); + MCHIST_APPEND(mc, MCHE_PACKET_DELAYED); +} + + +static void +mini_conn_ci_destroy (struct lsquic_conn *lconn) +{ + assert(!(lconn->cn_flags & LSCONN_HASHED)); + struct mini_conn *mc = (struct mini_conn *) lconn; + lsquic_packet_in_t *packet_in; + lsquic_packet_out_t *packet_out; + mconn_packno_set_t still_deferred = 0, in_flight = 0; + enum lsq_log_level log_level; +#if LSQUIC_RECORD_INORD_HIST + char inord_str[0x100]; +#endif + while ((packet_in = TAILQ_FIRST(&mc->mc_packets_in))) + { + TAILQ_REMOVE(&mc->mc_packets_in, packet_in, pi_next); + lsquic_packet_in_put(&mc->mc_enpub->enp_mm, packet_in); + } + while ((packet_in = TAILQ_FIRST(&mc->mc_deferred))) + { + TAILQ_REMOVE(&mc->mc_deferred, packet_in, pi_next); + still_deferred |= MCONN_PACKET_MASK(packet_in->pi_packno); + lsquic_packet_in_put(&mc->mc_enpub->enp_mm, packet_in); + } + while ((packet_out = TAILQ_FIRST(&mc->mc_packets_out))) + { + TAILQ_REMOVE(&mc->mc_packets_out, packet_out, po_next); + if (packet_out->po_flags & PO_SENT) + in_flight |= MCONN_PACKET_MASK(packet_out->po_packno); + mini_destroy_packet(mc, packet_out); + } + if (mc->mc_conn.cn_enc_session) + mc->mc_conn.cn_esf.g->esf_destroy(mc->mc_conn.cn_enc_session); + log_level = warning_is_warranted(mc) ? LSQ_LOG_WARN : LSQ_LOG_DEBUG; +#if LSQUIC_RECORD_INORD_HIST + if (LSQ_LOG_ENABLED(log_level)) + inord_to_str(mc, inord_str, sizeof(inord_str)); +#endif +#if LSQUIC_KEEP_MINICONN_HISTORY + const unsigned hist_idx = MCHIST_MASK & mc->mc_hist_idx; + if (MCHE_EMPTY == mc->mc_hist_buf[ hist_idx ]) + LSQ_LOG(log_level, "destroyed. Diagnostics: conn flags: 0x%X, " + "mc flags: 0x%X, " +#if LSQUIC_RECORD_INORD_HIST + "incoming-history (trunc: %d) %s, " +#endif + "received: %"PRIX64", sent: %"PRIX64", lost: %"PRIX64", " + "deferred: %"PRIX64", still-deferred: %"PRIX64", " + "dropped: %"PRIX64", in-flight: %"PRIX64", acked: %"PRIX64", " + "error_code: 0x%X, ticks: %hu, pack size: %hu, " + "lifetime: %"PRIu64" usec, version: %s, " + "mc hist: %.*s", mc->mc_conn.cn_flags, + mc->mc_flags, +#if LSQUIC_RECORD_INORD_HIST + mc->mc_inord_idx >= sizeof(mc->mc_inord_hist) / + sizeof(mc->mc_inord_hist[0]), inord_str, +#endif + mc->mc_received_packnos, mc->mc_sent_packnos, mc->mc_lost_packnos, + mc->mc_deferred_packnos, still_deferred, + mc->mc_dropped_packnos, in_flight, mc->mc_acked_packnos, + mc->mc_error_code, mc->mc_n_ticks, mc->mc_conn.cn_pack_size, + lsquic_time_now() - mc->mc_created, + lsquic_ver2str[mc->mc_conn.cn_version], + (int) hist_idx, mc->mc_hist_buf); + else + LSQ_LOG(log_level, "destroyed. Diagnostics: conn flags: 0x%X, " + "mc flags: 0x%X, " +#if LSQUIC_RECORD_INORD_HIST + "incoming-history (trunc: %d) %s, " +#endif + "received: %"PRIX64", sent: %"PRIX64", lost: %"PRIX64", " + "deferred: %"PRIX64", still-deferred: %"PRIX64", " + "dropped: %"PRIX64", in-flight: %"PRIX64", acked: %"PRIX64", " + "error_code: 0x%X, ticks: %hu, pack size: %hu, " + "lifetime: %"PRIu64" usec, version: %s, " + "mc hist: %.*s%.*s", mc->mc_conn.cn_flags, + mc->mc_flags, +#if LSQUIC_RECORD_INORD_HIST + mc->mc_inord_idx >= sizeof(mc->mc_inord_hist) / + sizeof(mc->mc_inord_hist[0]), inord_str, +#endif + mc->mc_received_packnos, mc->mc_sent_packnos, mc->mc_lost_packnos, + mc->mc_deferred_packnos, still_deferred, + mc->mc_dropped_packnos, in_flight, mc->mc_acked_packnos, + mc->mc_error_code, mc->mc_n_ticks, mc->mc_conn.cn_pack_size, + lsquic_time_now() - mc->mc_created, + lsquic_ver2str[mc->mc_conn.cn_version], + (int) (sizeof(mc->mc_hist_buf) - hist_idx), + mc->mc_hist_buf + hist_idx, (int) hist_idx, mc->mc_hist_buf); +#else + LSQ_LOG(log_level, "destroyed. Diagnostics: conn flags: 0x%X, " + "mc flags: 0x%X, " +#if LSQUIC_RECORD_INORD_HIST + "incoming-history (trunc: %d) %s, " +#endif + "received: %"PRIX64", sent: %"PRIX64", lost: %"PRIX64", " + "deferred: %"PRIX64", still-deferred: %"PRIX64", " + "dropped: %"PRIX64", in-flight: %"PRIX64", acked: %"PRIX64", " + "error_code: 0x%X, ticks: %hu, pack size: %hu, " + "lifetime: %"PRIu64" usec", + mc->mc_conn.cn_flags, + mc->mc_flags, +#if LSQUIC_RECORD_INORD_HIST + mc->mc_inord_idx >= sizeof(mc->mc_inord_hist) / + sizeof(mc->mc_inord_hist[0]), inord_str, +#endif + mc->mc_received_packnos, mc->mc_sent_packnos, mc->mc_lost_packnos, + mc->mc_deferred_packnos, still_deferred, + mc->mc_dropped_packnos, in_flight, mc->mc_acked_packnos, + mc->mc_error_code, mc->mc_n_ticks, mc->mc_path.np_pack_size, + lsquic_time_now() - mc->mc_created); +#endif + EV_LOG_CONN_EVENT(LSQUIC_LOG_CONN_ID, "mini connection destroyed"); + lsquic_malo_put(mc); +} + + +#if LSQUIC_ENABLE_HANDSHAKE_DISABLE +static void +mini_conn_ci_packet_in_disable_handshake (struct lsquic_conn *lconn, + struct lsquic_packet_in *packet_in) +{ + struct mini_conn *mc = (struct mini_conn *) lconn; + if (0 == (mc->mc_flags & MC_ERROR)) + { + if (packet_in->pi_packno > MINICONN_MAX_PACKETS) + mc->mc_flags |= MC_ERROR; + else if (!(mc->mc_received_packnos & + MCONN_PACKET_MASK(packet_in->pi_packno))) + { + lsquic_packet_in_upref(packet_in); + TAILQ_INSERT_TAIL(&mc->mc_packets_in, packet_in, pi_next); + mc->mc_received_packnos |= MCONN_PACKET_MASK(packet_in->pi_packno); + } + } +} + + +static enum tick_st +mini_conn_ci_tick_disable_handshake (struct lsquic_conn *lconn, + lsquic_time_t now) +{ + struct mini_conn *mc = (struct mini_conn *) lconn; + LSQ_WARN("handshake disabled, promote me now"); + lconn->cn_flags |= LSCONN_HANDSHAKE_DONE; + mc->mc_conn.cn_enc_session = + mc->mc_conn.cn_esf.g->esf_create_server(lconn->cn_cid, mc->mc_enpub, 0); + mc->mc_conn.cn_esf.g->esf_set_handshake_completed(mc->mc_conn.cn_enc_session); + return TICK_PROMOTE; +} + + +#endif + + +static struct lsquic_engine * +mini_conn_ci_get_engine (struct lsquic_conn *lconn) +{ + struct mini_conn *mc = (struct mini_conn *) lconn; + return mc->mc_enpub->enp_engine; +} + + +static void +mini_conn_ci_hsk_done (struct lsquic_conn *lconn, enum lsquic_hsk_status status) +{ + assert(0); +} + + +static int +mini_conn_ci_is_tickable (struct lsquic_conn *lconn) +{ + /* A mini connection is never tickable: Either there are incoming + * packets, in which case, the connection is going to be ticked, or + * there is an alarm pending, in which case it will be handled via + * the attq. + */ + return 0; +} + + +static lsquic_time_t +mini_conn_ci_next_tick_time (struct lsquic_conn *lconn) +{ + struct mini_conn *mc = (struct mini_conn *) lconn; + lsquic_packet_out_t *packet_out; + lsquic_time_t exp_time, retx_time; + + exp_time = mc->mc_created + mc->mc_enpub->enp_settings.es_handshake_to; + + TAILQ_FOREACH(packet_out, &mc->mc_packets_out, po_next) + if (packet_out->po_flags & PO_SENT) + { + retx_time = packet_out->po_sent + calc_retx_timeout(mc); + if (retx_time < exp_time) + return retx_time; + else + return exp_time; + } + + return exp_time; +} + + +static void +mini_conn_ci_client_call_on_new (struct lsquic_conn *lconn) +{ + assert(0); +} + + +static void +mini_conn_ci_internal_error (struct lsquic_conn *lconn, + const char *format, ...) +{ + struct mini_conn *mc = (struct mini_conn *) lconn; + LSQ_INFO("internal error reported"); + mc->mc_flags |= MC_ERROR; +} + + +/* This function should not be called, as this is specific to IETF QUIC */ +static void +mini_conn_ci_abort_error (struct lsquic_conn *lconn, int is_app, + unsigned error_code, const char *fmt, ...) +{ + struct mini_conn *mc = (struct mini_conn *) lconn; + assert(0); + LSQ_WARN("(GQUIC) abort error is called unexpectedly"); + mc->mc_flags |= MC_ERROR; +} + + +static void +mini_conn_ci_tls_alert (struct lsquic_conn *lconn, uint8_t alert) +{ + assert(0); +} + + +static unsigned char +mini_conn_ci_record_addrs (struct lsquic_conn *lconn, void *peer_ctx, + const struct sockaddr *local_sa, const struct sockaddr *peer_sa) +{ + struct mini_conn *mc = (struct mini_conn *) lconn; + struct lsquic_packet_out *packet_out; + + if (NP_IS_IPv6(&mc->mc_path) != (AF_INET6 == peer_sa->sa_family)) + TAILQ_FOREACH(packet_out, &mc->mc_packets_out, po_next) + if ((packet_out->po_flags & (PO_SENT|PO_ENCRYPTED)) == PO_ENCRYPTED) + return_enc_data(mc, packet_out); + + memcpy(mc->mc_path.np_peer_addr, peer_sa, sizeof(mc->mc_path.np_peer_addr)); + memcpy(mc->mc_path.np_local_addr, local_sa, sizeof(mc->mc_path.np_local_addr)); + mc->mc_path.np_peer_ctx = peer_ctx; + return 0; +} + + +static struct network_path * +mini_conn_ci_get_path (struct lsquic_conn *lconn, const struct sockaddr *sa) +{ + struct mini_conn *mc = (struct mini_conn *) lconn; + + return &mc->mc_path; +} + + +static const struct conn_iface mini_conn_iface_standard = { + .ci_abort_error = mini_conn_ci_abort_error, + .ci_client_call_on_new = mini_conn_ci_client_call_on_new, + .ci_destroy = mini_conn_ci_destroy, + .ci_get_engine = mini_conn_ci_get_engine, + .ci_get_path = mini_conn_ci_get_path, + .ci_hsk_done = mini_conn_ci_hsk_done, + .ci_internal_error = mini_conn_ci_internal_error, + .ci_is_tickable = mini_conn_ci_is_tickable, + .ci_next_packet_to_send = mini_conn_ci_next_packet_to_send, + .ci_next_tick_time = mini_conn_ci_next_tick_time, + .ci_packet_in = mini_conn_ci_packet_in, + .ci_packet_not_sent = mini_conn_ci_packet_not_sent, + .ci_packet_sent = mini_conn_ci_packet_sent, + .ci_record_addrs = mini_conn_ci_record_addrs, + .ci_tick = mini_conn_ci_tick, + .ci_tls_alert = mini_conn_ci_tls_alert, +}; + + +#if LSQUIC_ENABLE_HANDSHAKE_DISABLE +static const struct conn_iface mini_conn_iface_disable_handshake = { + .ci_abort_error = mini_conn_ci_abort_error, + .ci_client_call_on_new = mini_conn_ci_client_call_on_new, + .ci_destroy = mini_conn_ci_destroy, + .ci_get_engine = mini_conn_ci_get_engine, + .ci_hsk_done = mini_conn_ci_hsk_done, + .ci_internal_error = mini_conn_ci_internal_error, + .ci_is_tickable = mini_conn_ci_is_tickable, + .ci_next_packet_to_send = mini_conn_ci_next_packet_to_send, + .ci_next_tick_time = mini_conn_ci_next_tick_time, + .ci_packet_in = mini_conn_ci_packet_in_disable_handshake, + .ci_packet_not_sent = mini_conn_ci_packet_not_sent, + .ci_packet_sent = mini_conn_ci_packet_sent, + .ci_tick = mini_conn_ci_tick_disable_handshake, + .ci_tls_alert = mini_conn_ci_tls_alert, +}; +#endif + +typedef char largest_recv_holds_at_least_16_seconds[ + ((1 << (sizeof(((struct mini_conn *) 0)->mc_largest_recv) * 8)) / 1000000 + >= 16) - 1]; + +typedef char max_lifespan_smaller_than_largest_recv[ + ((1 << (sizeof(((struct mini_conn *) 0)->mc_largest_recv) * 8)) > + MAX_MINI_CONN_LIFESPAN_IN_USEC) - 1]; diff --git a/src/liblsquic/lsquic_mini_conn.h b/src/liblsquic/lsquic_mini_conn.h new file mode 100644 index 000000000..88c34bb0c --- /dev/null +++ b/src/liblsquic/lsquic_mini_conn.h @@ -0,0 +1,158 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_mini_conn.h -- Mini-connection + * + * Before a connection is established, the server keeps a "mini" connection + * object where it keeps track of stream 1 offsets and so on. + */ + +#ifndef LSQUIC_MINI_CONN_H +#define LSQUIC_MINI_CONN_H + +#include +#include + +#define MAX_MINI_CONN_LIFESPAN_IN_USEC \ + ((1 << (sizeof(((struct mini_conn *) 0)->mc_largest_recv) * 8)) - 1) + +struct lsquic_packet_in; +struct lsquic_packet_out; +struct lsquic_engine_public; + +#ifndef LSQUIC_KEEP_MINICONN_HISTORY +# ifndef NDEBUG +# define LSQUIC_KEEP_MINICONN_HISTORY 0 /* XXX */ +# else +# define LSQUIC_KEEP_MINICONN_HISTORY 0 +# endif +#endif + +#if LSQUIC_KEEP_MINICONN_HISTORY + +#define MCHIST_BITS 4 +#define MCHIST_MASK ((1 << MCHIST_BITS) - 1) +typedef unsigned char mchist_idx_t; + +enum miniconn_history_event +{ + MCHE_EMPTY = '\0', + MCHE_PLUS = '+', + MCHE_HANDLE_1RTT = '1', + MCHE_HANDLE_2RTT = '2', + MCHE_PACKET2LARGE_IN = 'a', + MCHE_CONN_CLOSE = 'c', + MCHE_CREATED = 'C', + MCHE_2HSK_1STREAM = 'd', + MCHE_DUP_HSK = 'D', + MCHE_HANDLE_ERROR = 'e', + MCHE_EFRAME = 'f', + MCHE_UNDECR_DEFER = 'F', + MCHE_HANDLE_NOT_ENOUGH = 'g', + MCHE_NEW_HSK = 'H', + MCHE_INVALID_FRAME = 'I', + MCHE_DECRYPTED = 'K', + MCHE_PACKET_LOST = 'L', + MCHE_HELLO_TOO_MUCH = 'm', + MCHE_ENOMEM = 'M', + MCHE_NEW_PACKET_OUT = 'N', + MCHE_HELLO_HOLE = 'o', + MCHE_PACKET_DUP_IN = 'p', + MCHE_UNDECR_DROP = 'P', + MCHE_PRST_IN = 'R', + MCHE_HANDLE_SHLO = 's', + MCHE_NEW_ENC_SESS = 'S', + MCHE_PACKET_SENT = 'T', + MCHE_HAHDLE_UNKNOWN = 'u', + MCHE_UNSENT_ACKED = 'U', + MCHE_HANDLE_DELAYED = 'y', + MCHE_PACKET_DELAYED = 'Y', + MCHE_PACKET0_IN = 'z', + MCHE_OUT_OF_PACKNOS = '#', +}; + +#endif + +#ifndef LSQUIC_RECORD_INORD_HIST +# if __GNUC__ +# define LSQUIC_RECORD_INORD_HIST 0 /* XXX */ +# else +# define LSQUIC_RECORD_INORD_HIST 0 +# endif +#endif + +typedef uint64_t mconn_packno_set_t; + +#define MINICONN_MAX_PACKETS (sizeof(mconn_packno_set_t) * 8) + +TAILQ_HEAD(head_packet_in, lsquic_packet_in); + +struct mini_conn { + struct lsquic_conn mc_conn; + struct conn_cid_elem mc_cces[1]; + struct head_packet_in mc_deferred, + mc_packets_in; + TAILQ_HEAD(, lsquic_packet_out) + mc_packets_out; + struct lsquic_engine_public + *mc_enpub; + lsquic_time_t mc_created; + struct lsquic_rtt_stats + mc_rtt_stats; + mconn_packno_set_t mc_received_packnos, + mc_sent_packnos, + mc_deferred_packnos, /* Informational */ + mc_dropped_packnos, /* Informational */ + mc_lost_packnos, /* Packets that were deemed lost */ /* Informational */ + mc_acked_packnos; +#if LSQUIC_RECORD_INORD_HIST + unsigned long long mc_inord_hist[2]; /* Informational */ +#endif + uint32_t mc_error_code; /* From CONNECTION_CLOSE frame */ /* Informational */ + unsigned short mc_n_ticks; /* Number of times mini conn ticked. */ /* Informational */ + unsigned short mc_read_off, /* Read offset for stream 1 */ + mc_write_off;/* Write offset for stream 1 */ + unsigned char mc_max_ack_packno, + /* XXX: mc_max_ack_packno is never set */ + mc_cutoff, + mc_cur_packno; + unsigned char mc_hsk_count; +#if LSQUIC_RECORD_INORD_HIST + unsigned char mc_inord_idx; +#endif + /* mc_largest_recv is the timestamp of when packet with the largest + * number was received; it is necessary to generate ACK frames. 24 + * bits holds about 16.5 seconds worth of microseconds, which is + * larger than the maximum amount of time a mini connection object + * is allowed to live. To get the timestamp, add this value to + * mc_created. + */ + unsigned char mc_largest_recv[3]; + enum { + MC_HAVE_NEW_HSK = (1 << 0), + MC_PROMOTE = (1 << 1), + MC_HAVE_SHLO = (1 << 2), + MC_UNUSED_3 = (1 << 3), + MC_ERROR = (1 << 4), + MC_UNSENT_ACK = (1 << 5), + MC_GEN_ACK = (1 << 6), + MC_HSK_ERR = (1 << 7), + MC_OO_PACKNOS = (1 << 8), + MC_STOP_WAIT_ON = (1 << 9), + } mc_flags:16; + struct network_path mc_path; +#if LSQUIC_KEEP_MINICONN_HISTORY + mchist_idx_t mc_hist_idx; + unsigned char mc_hist_buf[1 << MCHIST_BITS]; +#endif +}; + +lsquic_conn_t * +mini_conn_new (struct lsquic_engine_public *, const struct lsquic_packet_in *, + enum lsquic_version version); + +/* Packet numbers start with 1. By subtracting 1, we can utilize the full + * length of the bitmask. + */ +#define MCONN_PACKET_MASK(packno) (1ULL << (packno - 1)) + +#endif diff --git a/src/liblsquic/lsquic_mini_conn_ietf.c b/src/liblsquic/lsquic_mini_conn_ietf.c new file mode 100644 index 000000000..1365ae05a --- /dev/null +++ b/src/liblsquic/lsquic_mini_conn_ietf.c @@ -0,0 +1,1462 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_mini_conn_ietf.c -- Mini connection used by the IETF QUIC + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "lsquic.h" +#include "lsquic_int_types.h" +#include "lsquic_sizes.h" +#include "lsquic_hash.h" +#include "lsquic_conn.h" +#include "lsquic_mm.h" +#include "lsquic_malo.h" +#include "lsquic_engine_public.h" +#include "lsquic_packet_common.h" +#include "lsquic_packet_in.h" +#include "lsquic_packet_out.h" +#include "lsquic_parse.h" +#include "lsquic_rtt.h" +#include "lsquic_util.h" +#include "lsquic_enc_sess.h" +#include "lsquic_mini_conn_ietf.h" +#include "lsquic_ev_log.h" +#include "lsquic_trans_params.h" +#include "lsquic_ietf.h" +#include "lsquic_packet_ietf.h" + +#define LSQUIC_LOGGER_MODULE LSQLM_MINI_CONN +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(&conn->imc_conn) +#include "lsquic_logger.h" + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + +static const struct conn_iface mini_conn_ietf_iface; + +static unsigned highest_bit_set (unsigned long long); + + +static const enum header_type el2hety[] = +{ + [ENC_LEV_INIT] = HETY_HANDSHAKE, + [ENC_LEV_CLEAR] = HETY_INITIAL, + [ENC_LEV_FORW] = HETY_NOT_SET, + [ENC_LEV_EARLY] = 0, /* Invalid */ +}; + + +static void +imico_destroy_packet (struct ietf_mini_conn *conn, + struct lsquic_packet_out *packet_out) +{ + lsquic_packet_out_destroy(packet_out, conn->imc_enpub, + conn->imc_path.np_peer_ctx); +} + + +static struct lsquic_packet_out * +imico_get_packet_out (struct ietf_mini_conn *conn, + enum header_type header_type, size_t need) +{ + struct lsquic_packet_out *packet_out; + + if (need) + TAILQ_FOREACH(packet_out, &conn->imc_packets_out, po_next) + if (!(packet_out->po_flags & PO_SENT) + && packet_out->po_header_type == header_type + && lsquic_packet_out_avail(packet_out) >= need) + return packet_out; + + if (conn->imc_next_packno >= MAX_PACKETS) + { + LSQ_DEBUG("ran out of outgoing packet numbers, won't allocate packet"); + return NULL; + } + + packet_out = lsquic_packet_out_new(&conn->imc_enpub->enp_mm, NULL, 1, + &conn->imc_conn, IQUIC_PACKNO_LEN_1, NULL, NULL, &conn->imc_path); + if (!packet_out) + { + LSQ_WARN("could not allocate packet: %s", strerror(errno)); + return NULL; + } + + packet_out->po_header_type = header_type; + packet_out->po_packno = conn->imc_next_packno++; + packet_out->po_flags |= PO_MINI; + lsquic_packet_out_set_pns(packet_out, lsquic_hety2pns[header_type]); + if (conn->imc_enpub->enp_settings.es_ecn) + packet_out->po_lflags |= ECN_ECT0 << POECN_SHIFT; + TAILQ_INSERT_TAIL(&conn->imc_packets_out, packet_out, po_next); + packet_out->po_loss_chain = packet_out; + return packet_out; +} + + +static struct ietf_mini_conn * +cryst_get_conn (const struct mini_crypto_stream *cryst) +{ + return (void *) + ((unsigned char *) (cryst - cryst->mcs_enc_level) + - offsetof(struct ietf_mini_conn, imc_streams)); +} + + +struct msg_ctx +{ + const unsigned char *buf; + const unsigned char *const end; +}; + + +static size_t +read_from_msg_ctx (void *ctx, void *buf, size_t len) +{ + struct msg_ctx *msg_ctx = ctx; + if (len > (uintptr_t) (msg_ctx->end - msg_ctx->buf)) + len = msg_ctx->end - msg_ctx->buf; + memcpy(buf, msg_ctx->buf, len); + msg_ctx->buf += len; + return len; +} + + +static ssize_t +imico_stream_write (void *stream, const void *bufp, size_t bufsz) +{ + struct mini_crypto_stream *const cryst = stream; + struct ietf_mini_conn *const conn = cryst_get_conn(cryst); + struct lsquic_conn *const lconn = &conn->imc_conn; + const struct parse_funcs *const pf = lconn->cn_pf; + struct msg_ctx msg_ctx = { bufp, (unsigned char *) bufp + bufsz, }; + struct lsquic_packet_out *packet_out; + size_t header_sz, need; + const unsigned char *p; + int len; + + if (PNS_INIT == lsquic_enclev2pns[ cryst->mcs_enc_level ] + && (conn->imc_flags & IMC_IGNORE_INIT)) + { + LSQ_WARN("trying to write at the ignored Initial level"); + return bufsz; + } + + while (msg_ctx.buf < msg_ctx.end) + { + header_sz = lconn->cn_pf->pf_calc_crypto_frame_header_sz( + cryst->mcs_write_off); + need = header_sz + 1; + packet_out = imico_get_packet_out(conn, + el2hety[ cryst->mcs_enc_level ], need); + if (!packet_out) + return -1; + + p = msg_ctx.buf; + len = pf->pf_gen_crypto_frame(packet_out->po_data + packet_out->po_data_sz, + lsquic_packet_out_avail(packet_out), cryst->mcs_write_off, + msg_ctx.end - msg_ctx.buf, read_from_msg_ctx, &msg_ctx); + if (len < 0) + return len; + EV_LOG_GENERATED_CRYPTO_FRAME(LSQUIC_LOG_CONN_ID, pf, + packet_out->po_data + packet_out->po_data_sz, len); + packet_out->po_data_sz += len; + packet_out->po_frame_types |= 1 << QUIC_FRAME_CRYPTO; + packet_out->po_flags |= PO_HELLO; + cryst->mcs_write_off += msg_ctx.buf - p; + } + + assert(msg_ctx.buf == msg_ctx.end); + return bufsz; +} + + +static int +imico_stream_flush (void *stream) +{ + return 0; +} + + +static ssize_t +imico_stream_readf (void *stream, + size_t (*readf)(void *, const unsigned char *, size_t, int), void *ctx) +{ + struct mini_crypto_stream *const cryst = stream; + struct ietf_mini_conn *const conn = cryst_get_conn(cryst); + struct stream_frame *frame = conn->imc_last_in.frame; + size_t nread; + + if (cryst->mcs_enc_level == conn->imc_last_in.enc_level + && frame && cryst->mcs_read_off == DF_ROFF(frame)) + { + nread = readf(ctx, frame->data_frame.df_data + + frame->data_frame.df_read_off, DF_SIZE(frame) + - frame->data_frame.df_read_off, DF_FIN(frame)); + cryst->mcs_read_off += nread; + frame->data_frame.df_read_off += nread; + LSQ_DEBUG("read %zu bytes at offset %"PRIu64" on enc level %u", nread, + DF_ROFF(frame), cryst->mcs_enc_level); + return nread; + } + else + { + errno = EWOULDBLOCK; + return -1; + } +} + + +static int +imico_stream_wantX (struct mini_crypto_stream *cryst, int bit, int is_want) +{ + int old; + + old = (cryst->mcs_flags & (1 << bit)) > 0; + cryst->mcs_flags &= ~(1 << bit); + cryst->mcs_flags |= !!is_want << bit; + return old; +} + + +static int +imico_stream_wantwrite (void *stream, int is_want) +{ + return imico_stream_wantX(stream, MCSBIT_WANTWRITE, is_want); +} + + +static int +imico_stream_wantread (void *stream, int is_want) +{ + return imico_stream_wantX(stream, MCSBIT_WANTREAD, is_want); +} + + +static enum enc_level +imico_stream_enc_level (void *stream) +{ + struct mini_crypto_stream *const cryst = stream; + return cryst->mcs_enc_level; +} + + +static const struct crypto_stream_if crypto_stream_if = +{ + .csi_write = imico_stream_write, + .csi_flush = imico_stream_flush, + .csi_readf = imico_stream_readf, + .csi_wantwrite = imico_stream_wantwrite, + .csi_wantread = imico_stream_wantread, + .csi_enc_level = imico_stream_enc_level, +}; + + +static int +is_first_packet_ok (const struct lsquic_packet_in *packet_in) +{ + /* TODO: Move decryption of the first packet into this function? */ + return 1; /* TODO */ +} + + +struct lsquic_conn * +lsquic_mini_conn_ietf_new (struct lsquic_engine_public *enpub, + const struct lsquic_packet_in *packet_in, + enum lsquic_version version, int is_ipv4, const lsquic_cid_t *odcid) +{ + struct ietf_mini_conn *conn; + enc_session_t *enc_sess; + enum enc_level i; + const struct enc_session_funcs_iquic *esfi; + + if (!is_first_packet_ok(packet_in)) + return NULL; + + conn = lsquic_malo_get(enpub->enp_mm.malo.mini_conn_ietf); + if (!conn) + { + LSQ_LOG1(LSQ_LOG_WARN, "cannot allocate mini connection: %s", + strerror(errno)); + return NULL; + } + memset(conn, 0, sizeof(*conn)); + conn->imc_conn.cn_if = &mini_conn_ietf_iface; + conn->imc_conn.cn_cces = conn->imc_cces; + conn->imc_conn.cn_n_cces = sizeof(conn->imc_cces) + / sizeof(conn->imc_cces[0]); + conn->imc_cces[0].cce_cid = packet_in->pi_dcid; + conn->imc_cces[0].cce_flags = CCE_USED; + conn->imc_conn.cn_cces_mask = 1; + lsquic_scid_from_packet_in(packet_in, &conn->imc_path.np_dcid); + LSQ_DEBUGC("recv SCID from client %"CID_FMT, CID_BITS(&conn->imc_cces[0].cce_cid)); + LSQ_DEBUGC("recv DCID from client %"CID_FMT, CID_BITS(&conn->imc_path.np_dcid)); + + /* Generate new SCID. Since is not the original SCID, it is given + * a sequence number (0) and therefore can be retired by the client. + */ + lsquic_generate_cid(&conn->imc_conn.cn_cces[1].cce_cid, + enpub->enp_settings.es_scid_len); + LSQ_DEBUGC("generated SCID %"CID_FMT" at index %u, switching to it", + CID_BITS(&conn->imc_conn.cn_cces[1].cce_cid), 1); + conn->imc_conn.cn_cces[1].cce_flags = CCE_SEQNO | CCE_USED; + conn->imc_conn.cn_cces_mask |= 1u << 1; + conn->imc_conn.cn_cur_cce_idx = 1; + + conn->imc_conn.cn_flags = LSCONN_MINI|LSCONN_IETF|LSCONN_SERVER; + + for (i = 0; i < N_ENC_LEVS; ++i) + { + conn->imc_streams[i].mcs_enc_level = i; + conn->imc_stream_ps[i] = &conn->imc_streams[i]; + } + + esfi = select_esf_iquic_by_ver(version); + enc_sess = esfi->esfi_create_server(enpub, &conn->imc_conn, + &packet_in->pi_dcid, conn->imc_stream_ps, &crypto_stream_if, + odcid); + if (!enc_sess) + { + lsquic_malo_put(conn); + return NULL; + } + + conn->imc_enpub = enpub; + conn->imc_created = packet_in->pi_received; + conn->imc_path.np_pack_size = is_ipv4 ? IQUIC_MAX_IPv4_PACKET_SZ + : IQUIC_MAX_IPv6_PACKET_SZ; +#ifndef NDEBUG + if (getenv("LSQUIC_CN_PACK_SIZE")) + conn->imc_path.np_pack_size = atoi(getenv("LSQUIC_CN_PACK_SIZE")); +#endif + conn->imc_conn.cn_version = version; + conn->imc_conn.cn_pf = select_pf_by_ver(version); + conn->imc_conn.cn_esf.i = esfi; + conn->imc_conn.cn_enc_session = enc_sess; + conn->imc_conn.cn_esf_c = select_esf_common_by_ver(version); + TAILQ_INIT(&conn->imc_packets_out); + TAILQ_INIT(&conn->imc_app_packets); + + LSQ_DEBUG("created mini connection object %p; max packet size=%hu", + conn, conn->imc_path.np_pack_size); + return &conn->imc_conn; +} + + +static void +ietf_mini_conn_ci_client_call_on_new (struct lsquic_conn *lconn) +{ + assert(0); +} + + +static void +ietf_mini_conn_ci_destroy (struct lsquic_conn *lconn) +{ + struct ietf_mini_conn *conn = (struct ietf_mini_conn *) lconn; + struct lsquic_packet_out *packet_out; + struct lsquic_packet_in *packet_in; + + while ((packet_out = TAILQ_FIRST(&conn->imc_packets_out))) + { + TAILQ_REMOVE(&conn->imc_packets_out, packet_out, po_next); + imico_destroy_packet(conn, packet_out); + } + while ((packet_in = TAILQ_FIRST(&conn->imc_app_packets))) + { + TAILQ_REMOVE(&conn->imc_app_packets, packet_in, pi_next); + lsquic_packet_in_put(&conn->imc_enpub->enp_mm, packet_in); + } + if (lconn->cn_enc_session) + lconn->cn_esf.i->esfi_destroy(lconn->cn_enc_session); + LSQ_DEBUG("ietf_mini_conn_ci_destroyed"); + lsquic_malo_put(conn); +} + + +static struct lsquic_engine * +ietf_mini_conn_ci_get_engine (struct lsquic_conn *lconn) +{ + struct ietf_mini_conn *conn = (struct ietf_mini_conn *) lconn; + return conn->imc_enpub->enp_engine; +} + + +static void +ietf_mini_conn_ci_hsk_done (struct lsquic_conn *lconn, + enum lsquic_hsk_status status) +{ + struct ietf_mini_conn *conn = (struct ietf_mini_conn *) lconn; + + switch (status) + { + case LSQ_HSK_OK: + case LSQ_HSK_0RTT_OK: + conn->imc_flags |= IMC_HSK_OK; + conn->imc_conn.cn_flags |= LSCONN_HANDSHAKE_DONE; + LSQ_DEBUG("handshake OK"); + break; + default: + assert(0); + /* fall-through */ + case LSQ_HSK_FAIL: + conn->imc_flags |= IMC_HSK_FAILED|IMC_ERROR; + LSQ_INFO("handshake failed"); + break; + } +} + + +static void +ietf_mini_conn_ci_tls_alert (struct lsquic_conn *lconn, uint8_t alert) +{ + struct ietf_mini_conn *conn = (struct ietf_mini_conn *) lconn; + LSQ_DEBUG("got TLS alert %"PRIu8, alert); + conn->imc_flags |= IMC_ERROR|IMC_TLS_ALERT; + conn->imc_tls_alert = alert; +} + + +static int +ietf_mini_conn_ci_is_tickable (struct lsquic_conn *lconn) +{ + /* A mini connection is never tickable: Either there are incoming + * packets, in which case, the connection is going to be ticked, or + * there is an alarm pending, in which case it will be handled via + * the attq. + */ + return 0; +} + + +static int +imico_can_send (const struct ietf_mini_conn *conn, size_t size) +{ + return (conn->imc_flags & IMC_ADDR_VALIDATED) + || conn->imc_bytes_in * 3 >= conn->imc_bytes_out + size + ; +} + + +static struct lsquic_packet_out * +ietf_mini_conn_ci_next_packet_to_send (struct lsquic_conn *lconn, size_t size) +{ + struct ietf_mini_conn *conn = (struct ietf_mini_conn *) lconn; + struct lsquic_packet_out *packet_out; + size_t packet_size; + + TAILQ_FOREACH(packet_out, &conn->imc_packets_out, po_next) + { + if (packet_out->po_flags & PO_SENT) + continue; + packet_size = lsquic_packet_out_total_sz(lconn, packet_out); + if (size == 0 || packet_size + size <= conn->imc_path.np_pack_size) + { + if (!imico_can_send(conn, packet_size + IQUIC_TAG_LEN)) + { + LSQ_DEBUG("cannot send packet %"PRIu64" of size %zu: client " + "address has not been validated", packet_out->po_packno, + packet_size + IQUIC_TAG_LEN); + return NULL; + } + packet_out->po_flags |= PO_SENT; + conn->imc_bytes_out += packet_size + IQUIC_TAG_LEN; + if (size == 0) + LSQ_DEBUG("packet_to_send: %"PRIu64, packet_out->po_packno); + else + LSQ_DEBUG("packet_to_send: %"PRIu64" (coalesced)", + packet_out->po_packno); + return packet_out; + } + else + return NULL; + } + + return NULL; +} + + +static int +imico_calc_retx_timeout (const struct ietf_mini_conn *conn) +{ + lsquic_time_t to; + to = lsquic_rtt_stats_get_srtt(&conn->imc_rtt_stats); + if (to) + { + to += to / 2; + if (to < 10000) + to = 10000; + } + else + to = 300000; + return to << conn->imc_hsk_count; +} + + +static lsquic_time_t +ietf_mini_conn_ci_next_tick_time (struct lsquic_conn *lconn) +{ + struct ietf_mini_conn *conn = (struct ietf_mini_conn *) lconn; + const struct lsquic_packet_out *packet_out; + lsquic_time_t exp_time, retx_time; + + exp_time = conn->imc_created + + conn->imc_enpub->enp_settings.es_handshake_to; + + TAILQ_FOREACH(packet_out, &conn->imc_packets_out, po_next) + if (packet_out->po_flags & PO_SENT) + { + retx_time = packet_out->po_sent + imico_calc_retx_timeout(conn); + if (retx_time < exp_time) + return retx_time; + else + return exp_time; + } + + return exp_time; +} + + +#define IMICO_PROC_FRAME_ARGS \ + struct ietf_mini_conn *conn, struct lsquic_packet_in *packet_in, \ + const unsigned char *p, size_t len + + +static void +imico_dispatch_stream_events (struct ietf_mini_conn *conn) +{ + enum enc_level i; + + for (i = 0; i < N_ENC_LEVS; ++i) + if ((conn->imc_streams[i].mcs_flags & (MCS_CREATED|MCS_WANTREAD)) + == (MCS_CREATED|MCS_WANTREAD)) + { + LSQ_DEBUG("dispatch read events on level #%u", i); + lsquic_mini_cry_sm_if.on_read((void *) &conn->imc_streams[i], + conn->imc_conn.cn_enc_session); + } + + for (i = 0; i < N_ENC_LEVS; ++i) + if ((conn->imc_streams[i].mcs_flags & (MCS_CREATED|MCS_WANTWRITE)) + == (MCS_CREATED|MCS_WANTWRITE)) + { + LSQ_DEBUG("dispatch write events on level #%u", i); + lsquic_mini_cry_sm_if.on_write((void *) &conn->imc_streams[i], + conn->imc_conn.cn_enc_session); + } +} + + +static unsigned +imico_process_stream_frame (IMICO_PROC_FRAME_ARGS) +{ + LSQ_WARN("%s: TODO", __func__); + return 0; +} + + +static unsigned +imico_process_crypto_frame (IMICO_PROC_FRAME_ARGS) +{ + int parsed_len; + enum enc_level enc_level, i; + struct stream_frame stream_frame; + const struct transport_params *params; + + parsed_len = conn->imc_conn.cn_pf->pf_parse_crypto_frame(p, len, + &stream_frame); + if (parsed_len < 0) + return 0; + + enc_level = lsquic_packet_in_enc_level(packet_in); + EV_LOG_CRYPTO_FRAME_IN(LSQUIC_LOG_CONN_ID, &stream_frame, enc_level); + + if (!(conn->imc_streams[enc_level].mcs_flags & MCS_CREATED) + || conn->imc_streams[enc_level].mcs_read_off < + stream_frame.data_frame.df_offset + + stream_frame.data_frame.df_size) + LSQ_DEBUG("Got CRYPTO frame for enc level #%u", enc_level); + else + { + LSQ_DEBUG("Got duplicate CRYPTO frame for enc level #%u -- ignore", + enc_level); + return parsed_len; + } + + if (!(conn->imc_flags & IMC_ENC_SESS_INITED)) + { + if (0 != conn->imc_conn.cn_esf.i->esfi_init_server( + conn->imc_conn.cn_enc_session)) + return -1; + conn->imc_flags |= IMC_ENC_SESS_INITED; + } + + if (!(conn->imc_streams[enc_level].mcs_flags & MCS_CREATED)) + { + LSQ_DEBUG("creating stream on level #%u", enc_level); + conn->imc_streams[enc_level].mcs_flags |= MCS_CREATED; + lsquic_mini_cry_sm_if.on_new_stream(conn->imc_conn.cn_enc_session, + (void *) &conn->imc_streams[enc_level]); + } + + /* Assume that receiving a CRYPTO frame at a higher level means that we + * no longer want to read from a lower level. + */ + for (i = 0; i < enc_level; ++i) + conn->imc_streams[i].mcs_flags &= ~MCS_WANTREAD; + + conn->imc_last_in.frame = &stream_frame; + conn->imc_last_in.enc_level = enc_level; + imico_dispatch_stream_events(conn); + conn->imc_last_in.frame = NULL; + + + if (enc_level == ENC_LEV_CLEAR && stream_frame.data_frame.df_offset == 0 + /* Assume that we have ClientHello at offset zero and that it has + * transport parameters. + */ + && (conn->imc_flags & (IMC_ENC_SESS_INITED|IMC_HAVE_TP)) + == IMC_ENC_SESS_INITED) + { + params = conn->imc_conn.cn_esf.i->esfi_get_peer_transport_params( + conn->imc_conn.cn_enc_session); + if (params) + { + conn->imc_flags |= IMC_HAVE_TP; + conn->imc_ack_exp = params->tp_ack_delay_exponent; + } + else + { + conn->imc_flags |= IMC_BAD_TRANS_PARAMS; + return 0; + } + } + + return parsed_len; +} + + +static ptrdiff_t +imico_count_zero_bytes (const unsigned char *p, size_t len) +{ + const unsigned char *const end = p + len; + while (p < end && 0 == *p) + ++p; + return len - (end - p); +} + + +static unsigned +imico_process_padding_frame (IMICO_PROC_FRAME_ARGS) +{ + len = (size_t) imico_count_zero_bytes(p, len); + EV_LOG_PADDING_FRAME_IN(LSQUIC_LOG_CONN_ID, len); + return len; +} + + +static void +imico_take_rtt_sample (struct ietf_mini_conn *conn, + const struct lsquic_packet_out *packet_out, + lsquic_time_t now, lsquic_time_t lack_delta) +{ + assert(packet_out->po_sent); + lsquic_time_t measured_rtt = now - packet_out->po_sent; + if (lack_delta < measured_rtt) + { + lsquic_rtt_stats_update(&conn->imc_rtt_stats, measured_rtt, lack_delta); + LSQ_DEBUG("srtt: %"PRIu64" usec, var: %"PRIu64, + lsquic_rtt_stats_get_srtt(&conn->imc_rtt_stats), + lsquic_rtt_stats_get_rttvar(&conn->imc_rtt_stats)); + } +} + + +static unsigned +imico_process_ack_frame (IMICO_PROC_FRAME_ARGS) +{ + int parsed_len; + unsigned n; + lsquic_packet_out_t *packet_out, *next; + struct ack_info *acki; + lsquic_packno_t packno; + lsquic_time_t warn_time; + packno_set_t acked; + enum packnum_space pns; + uint8_t ack_exp; + + if (conn->imc_flags & IMC_HAVE_TP) + ack_exp = conn->imc_ack_exp; + else + ack_exp = TP_DEF_ACK_DELAY_EXP; /* Odd: no transport params yet? */ + acki = conn->imc_enpub->enp_mm.acki; + parsed_len = conn->imc_conn.cn_pf->pf_parse_ack_frame(p, len, acki, + ack_exp); + if (parsed_len < 0) + return 0; + + pns = lsquic_hety2pns[ packet_in->pi_header_type ]; + acked = 0; + + for (n = 0; n < acki->n_ranges; ++n) + { + if (acki->ranges[n].high <= MAX_PACKETS) + { + acked |= (1ULL << acki->ranges[n].high) + | ((1ULL << acki->ranges[n].high) - 1); + acked &= ~((1ULL << acki->ranges[n].low) - 1); + } + else + { + packno = acki->ranges[n].high; + goto err_never_sent; + } + } + if (acked & ~conn->imc_sent_packnos) + { + packno = highest_bit_set(acked & ~conn->imc_sent_packnos); + goto err_never_sent; + } + + EV_LOG_ACK_FRAME_IN(LSQUIC_LOG_CONN_ID, acki); + for (packet_out = TAILQ_FIRST(&conn->imc_packets_out); packet_out; + packet_out = next) + { + next = TAILQ_NEXT(packet_out, po_next); + if ((1ULL << packet_out->po_packno) & acked) + { + assert(lsquic_packet_out_pns(packet_out) == pns); + LSQ_DEBUG("Got ACK for packet %"PRIu64, packet_out->po_packno); + if (packet_out->po_packno == largest_acked(acki)) + imico_take_rtt_sample(conn, packet_out, + packet_in->pi_received, acki->lack_delta); + TAILQ_REMOVE(&conn->imc_packets_out, packet_out, po_next); + imico_destroy_packet(conn, packet_out); + } + } + + if (conn->imc_sent_packnos & ~conn->imc_acked_packnos[pns] & acked) + { + LSQ_DEBUG("Newly acked packets, reset handshake count"); + conn->imc_hsk_count = 0; + } + + conn->imc_acked_packnos[pns] |= acked; + + return parsed_len; + + err_never_sent: + warn_time = lsquic_time_now(); + if (0 == conn->imc_enpub->enp_last_warning[WT_ACKPARSE_MINI] + || conn->imc_enpub->enp_last_warning[WT_ACKPARSE_MINI] + + WARNING_INTERVAL < warn_time) + { + conn->imc_enpub->enp_last_warning[WT_ACKPARSE_MINI] = warn_time; + LSQ_WARN("packet %"PRIu64" (pns: %u) was never sent", packno, pns); + } + else + LSQ_DEBUG("packet %"PRIu64" (pns: %u) was never sent", packno, pns); + return 0; +} + + +static unsigned +imico_process_invalid_frame (IMICO_PROC_FRAME_ARGS) +{ + LSQ_DEBUG("invalid frame %u (%s)", p[0], + frame_type_2_str[ conn->imc_conn.cn_pf->pf_parse_frame_type(p[0]) ]); + return 0; +} + + +static unsigned (*const imico_process_frames[N_QUIC_FRAMES]) + (IMICO_PROC_FRAME_ARGS) = +{ + [QUIC_FRAME_PADDING] = imico_process_padding_frame, + [QUIC_FRAME_STREAM] = imico_process_stream_frame, + [QUIC_FRAME_CRYPTO] = imico_process_crypto_frame, + [QUIC_FRAME_ACK] = imico_process_ack_frame, + /* XXX: Some of them are invalid, while others are unexpected. We treat + * them the same: handshake cannot proceed. + */ + [QUIC_FRAME_RST_STREAM] = imico_process_invalid_frame, + [QUIC_FRAME_CONNECTION_CLOSE] = imico_process_invalid_frame, + [QUIC_FRAME_MAX_DATA] = imico_process_invalid_frame, + [QUIC_FRAME_MAX_STREAM_DATA] = imico_process_invalid_frame, + [QUIC_FRAME_MAX_STREAMS] = imico_process_invalid_frame, + [QUIC_FRAME_PING] = imico_process_invalid_frame, + [QUIC_FRAME_BLOCKED] = imico_process_invalid_frame, + [QUIC_FRAME_STREAM_BLOCKED] = imico_process_invalid_frame, + [QUIC_FRAME_STREAMS_BLOCKED] = imico_process_invalid_frame, + [QUIC_FRAME_NEW_CONNECTION_ID] = imico_process_invalid_frame, + [QUIC_FRAME_STOP_SENDING] = imico_process_invalid_frame, + [QUIC_FRAME_PATH_CHALLENGE] = imico_process_invalid_frame, + [QUIC_FRAME_PATH_RESPONSE] = imico_process_invalid_frame, +}; + + +static unsigned +imico_process_packet_frame (struct ietf_mini_conn *conn, + struct lsquic_packet_in *packet_in, const unsigned char *p, size_t len) +{ + enum enc_level enc_level = lsquic_packet_in_enc_level(packet_in); + enum quic_frame_type type = conn->imc_conn.cn_pf->pf_parse_frame_type(p[0]); + if (lsquic_legal_frames_by_level[enc_level] & (1 << type)) + { + packet_in->pi_frame_types |= 1 << type; + return imico_process_frames[type](conn, packet_in, p, len); + } + else + { + LSQ_DEBUG("invalid frame %u at encryption level %s", type, + lsquic_enclev2str[enc_level]); + return 0; + } +} + + +static int +imico_parse_regular_packet (struct ietf_mini_conn *conn, + struct lsquic_packet_in *packet_in) +{ + const unsigned char *p, *pend; + unsigned len; + + p = packet_in->pi_data + packet_in->pi_header_sz; + pend = packet_in->pi_data + packet_in->pi_data_sz; + + while (p < pend) + { + len = imico_process_packet_frame(conn, packet_in, p, pend - p); + if (len > 0) + p += len; + else + return -1; + } + + return 0; +} + + +static unsigned +highest_bit_set (unsigned long long sz) +{ +#if __GNUC__ + unsigned clz = __builtin_clzll(sz); + return 63 - clz; +#else + unsigned long y; + unsigned n; + n = 64; + y = sz >> 32; if (y) { n -= 32; sz = y; } + y = sz >> 16; if (y) { n -= 16; sz = y; } + y = sz >> 8; if (y) { n -= 8; sz = y; } + y = sz >> 4; if (y) { n -= 4; sz = y; } + y = sz >> 2; if (y) { n -= 2; sz = y; } + y = sz >> 1; if (y) return 63 - n + 2; + return 63 - n + sz; +#endif +} + + +static void +ignore_init (struct ietf_mini_conn *conn) +{ + struct lsquic_packet_out *packet_out, *next; + unsigned count; + + conn->imc_flags |= IMC_IGNORE_INIT; + conn->imc_flags &= ~(IMC_QUEUED_ACK_INIT << PNS_INIT); + + count = 0; + for (packet_out = TAILQ_FIRST(&conn->imc_packets_out); packet_out; + packet_out = next) + { + next = TAILQ_NEXT(packet_out, po_next); + if (PNS_INIT == lsquic_packet_out_pns(packet_out)) + { + TAILQ_REMOVE(&conn->imc_packets_out, packet_out, po_next); + imico_destroy_packet(conn, packet_out); + ++count; + } + } + + LSQ_DEBUG("henceforth, no Initial packets shall be sent or received; " + "destroyed %u packet%.*s", count, count != 1, "s"); +} + + +/* Only a single packet is supported */ +static void +ietf_mini_conn_ci_packet_in (struct lsquic_conn *lconn, + struct lsquic_packet_in *packet_in) +{ + struct ietf_mini_conn *conn = (struct ietf_mini_conn *) lconn; + enum dec_packin dec_packin; + enum packnum_space pns; + + + pns = lsquic_hety2pns[ packet_in->pi_header_type ]; + if (pns == PNS_INIT && (conn->imc_flags & IMC_IGNORE_INIT)) + { + LSQ_DEBUG("ignore init packet"); /* Don't bother decrypting */ + return; + } + + dec_packin = lconn->cn_esf_c->esf_decrypt_packet(lconn->cn_enc_session, + conn->imc_enpub, lconn, packet_in); + if (dec_packin != DECPI_OK) + { + /* TODO: handle reordering perhaps? */ + LSQ_DEBUG("could not decrypt packet"); + return; + } + + EV_LOG_PACKET_IN(LSQUIC_LOG_CONN_ID, packet_in); + conn->imc_bytes_in += packet_in->pi_data_sz + IQUIC_TAG_LEN; + + if (pns == PNS_APP) + { + lsquic_packet_in_upref(packet_in); + TAILQ_INSERT_TAIL(&conn->imc_app_packets, packet_in, pi_next); + LSQ_DEBUG("delay processing of packet %"PRIu64" in pns %u", + packet_in->pi_packno, pns); + return; + } + else if (pns == PNS_HSK) + conn->imc_flags |= IMC_ADDR_VALIDATED; + + if (((conn->imc_flags >> IMCBIT_PNS_BIT_SHIFT) & 3) < pns) + { + conn->imc_flags &= ~(3 << IMCBIT_PNS_BIT_SHIFT); + conn->imc_flags |= pns << IMCBIT_PNS_BIT_SHIFT; + } + + if (pns == PNS_HSK && !(conn->imc_flags & IMC_IGNORE_INIT)) + ignore_init(conn); + + if (conn->imc_recvd_packnos[pns] & (1ULL << packet_in->pi_packno)) + { + LSQ_DEBUG("duplicate packet %"PRIu64, packet_in->pi_packno); + return; + } + + /* Update receive history before processing the packet: if there is an + * error, the connection is terminated and recording this packet number + * is helpful when it is printed along with other diagnostics in dtor. + */ + if (0 == conn->imc_recvd_packnos[pns] || + packet_in->pi_packno > highest_bit_set(conn->imc_recvd_packnos[pns])) + conn->imc_largest_recvd[pns] = packet_in->pi_received; + conn->imc_recvd_packnos[pns] |= 1ULL << packet_in->pi_packno; + conn->imc_flags |= IMC_QUEUED_ACK_INIT << pns; + + if (0 != imico_parse_regular_packet(conn, packet_in)) + conn->imc_flags |= IMC_ERROR; + + ++conn->imc_ecn_counts_in[pns][ lsquic_packet_in_ecn(packet_in) ]; + conn->imc_incoming_ecn <<= 1; + conn->imc_incoming_ecn |= lsquic_packet_in_ecn(packet_in) != ECN_NOT_ECT; +} + + +static void +ietf_mini_conn_ci_packet_sent (struct lsquic_conn *lconn, + struct lsquic_packet_out *packet_out) +{ + struct ietf_mini_conn *conn = (struct ietf_mini_conn *) lconn; + conn->imc_sent_packnos |= 1ULL << packet_out->po_packno; +#if 0 + if (packet_out->po_frame_types & (1 << QUIC_FRAME_ACK)) + { + assert(mc->mc_flags & MC_UNSENT_ACK); + mc->mc_flags &= ~MC_UNSENT_ACK; + } +#endif + ++conn->imc_ecn_counts_out[ lsquic_packet_out_pns(packet_out) ] + [ lsquic_packet_out_ecn(packet_out) ]; + LSQ_DEBUG("%s: packet %"PRIu64" sent", __func__, packet_out->po_packno); +} + + +static void +ietf_mini_conn_ci_packet_not_sent (struct lsquic_conn *lconn, + struct lsquic_packet_out *packet_out) +{ + struct ietf_mini_conn *conn = (struct ietf_mini_conn *) lconn; + size_t packet_size; + + packet_out->po_flags &= ~PO_SENT; + packet_size = lsquic_packet_out_total_sz(lconn, packet_out); + conn->imc_bytes_out -= packet_size + IQUIC_TAG_LEN; + LSQ_DEBUG("%s: packet %"PRIu64" not sent", __func__, packet_out->po_packno); +} + + +static void +imico_return_enc_data (struct ietf_mini_conn *conn, + struct lsquic_packet_out *packet_out) +{ + conn->imc_enpub->enp_pmi->pmi_return(conn->imc_enpub->enp_pmi_ctx, + conn->imc_path.np_peer_ctx, packet_out->po_enc_data, + lsquic_packet_out_ipv6(packet_out)); + packet_out->po_flags &= ~PO_ENCRYPTED; + packet_out->po_enc_data = NULL; +} + + +static int +imico_repackage_packet (struct ietf_mini_conn *conn, + struct lsquic_packet_out *packet_out) +{ + const lsquic_packno_t oldno = packet_out->po_packno; + const lsquic_packno_t packno = conn->imc_next_packno++; + if (packno > MAX_PACKETS) + return -1; + + LSQ_DEBUG("Packet %"PRIu64" repackaged for resending as packet %"PRIu64, + oldno, packno); + EV_LOG_CONN_EVENT(LSQUIC_LOG_CONN_ID, "packet %"PRIu64" repackaged for " + "resending as packet %"PRIu64, oldno, packno); + packet_out->po_packno = packno; + packet_out->po_flags &= ~PO_SENT; + if (packet_out->po_flags & PO_ENCRYPTED) + imico_return_enc_data(conn, packet_out); + TAILQ_INSERT_TAIL(&conn->imc_packets_out, packet_out, po_next); + return 0; +} + + +static int +imico_handle_losses_and_have_unsent (struct ietf_mini_conn *conn, + lsquic_time_t now) +{ + TAILQ_HEAD(, lsquic_packet_out) lost_packets = + TAILQ_HEAD_INITIALIZER(lost_packets); + lsquic_packet_out_t *packet_out, *next; + lsquic_time_t retx_to = 0; + unsigned n_to_send = 0; + + for (packet_out = TAILQ_FIRST(&conn->imc_packets_out); packet_out; + packet_out = next) + { + next = TAILQ_NEXT(packet_out, po_next); + if (packet_out->po_flags & PO_SENT) + { + if (0 == retx_to) + retx_to = imico_calc_retx_timeout(conn); + if (packet_out->po_sent + retx_to < now) + { + LSQ_DEBUG("packet %"PRIu64" has been lost (rto: %"PRIu64")", + packet_out->po_packno, retx_to); + TAILQ_REMOVE(&conn->imc_packets_out, packet_out, po_next); + TAILQ_INSERT_TAIL(&lost_packets, packet_out, po_next); + } + } + else + ++n_to_send; + } + + conn->imc_hsk_count += !TAILQ_EMPTY(&lost_packets); + + while ((packet_out = TAILQ_FIRST(&lost_packets))) + { + TAILQ_REMOVE(&lost_packets, packet_out, po_next); + if ((packet_out->po_frame_types & IQUIC_FRAME_RETX_MASK) + && 0 == imico_repackage_packet(conn, packet_out)) + ++n_to_send; + else + imico_destroy_packet(conn, packet_out); + } + + return n_to_send > 0; +} + + +static int +imico_have_packets_to_send (struct ietf_mini_conn *conn, lsquic_time_t now) +{ + return imico_handle_losses_and_have_unsent(conn, now); +} + + +struct ietf_mini_rechist +{ + const struct ietf_mini_conn *conn; + packno_set_t cur_set; + struct lsquic_packno_range range; /* We return a pointer to this */ + int cur_idx; + enum packnum_space pns; +}; + + +static void +imico_rechist_init (struct ietf_mini_rechist *rechist, + const struct ietf_mini_conn *conn, enum packnum_space pns) +{ + rechist->conn = conn; + rechist->pns = pns; + rechist->cur_set = 0; + rechist->cur_idx = 0; +} + + +static lsquic_time_t +imico_rechist_largest_recv (void *rechist_ctx) +{ + struct ietf_mini_rechist *rechist = rechist_ctx; + return rechist->conn->imc_largest_recvd[ rechist->pns ]; +} + + +static const struct lsquic_packno_range * +imico_rechist_next (void *rechist_ctx) +{ + struct ietf_mini_rechist *rechist = rechist_ctx; + const struct ietf_mini_conn *conn = rechist->conn; + packno_set_t packnos; + int i; + + packnos = rechist->cur_set; + if (0 == packnos) + return NULL; + + /* There may be a faster way to do this, but for now, we just want + * correctness. + */ + for (i = rechist->cur_idx; i >= 0; --i) + if (packnos & (1ULL << i)) + { + rechist->range.low = i; + rechist->range.high = i; + break; + } + assert(i >= 0); /* We must have hit at least one bit */ + --i; + for ( ; i >= 0 && (packnos & (1ULL << i)); --i) + rechist->range.low = i; + if (i >= 0) + { + rechist->cur_set = packnos & ((1ULL << i) - 1); + rechist->cur_idx = i; + } + else + rechist->cur_set = 0; + LSQ_DEBUG("%s: return [%"PRIu64", %"PRIu64"]", __func__, + rechist->range.low, rechist->range.high); + return &rechist->range; +} + + +static const struct lsquic_packno_range * +imico_rechist_first (void *rechist_ctx) +{ + struct ietf_mini_rechist *rechist = rechist_ctx; + rechist->cur_set = rechist->conn->imc_recvd_packnos[ rechist->pns ]; + rechist->cur_idx = highest_bit_set(rechist->cur_set); + return imico_rechist_next(rechist_ctx); +} + + +static const enum header_type pns2hety[] = +{ + [PNS_INIT] = HETY_INITIAL, + [PNS_HSK] = HETY_HANDSHAKE, + [PNS_APP] = HETY_NOT_SET, +}; + + +static int +imico_generate_ack (struct ietf_mini_conn *conn, enum packnum_space pns, + lsquic_time_t now) +{ + struct lsquic_packet_out *packet_out; + enum header_type header_type; + struct ietf_mini_rechist rechist; + int not_used_has_missing, len; + uint64_t ecn_counts_buf[4]; + const uint64_t *ecn_counts; + + header_type = pns2hety[pns]; + + if (conn->imc_incoming_ecn) + { + ecn_counts_buf[0] = conn->imc_ecn_counts_in[pns][0]; + ecn_counts_buf[1] = conn->imc_ecn_counts_in[pns][1]; + ecn_counts_buf[2] = conn->imc_ecn_counts_in[pns][2]; + ecn_counts_buf[3] = conn->imc_ecn_counts_in[pns][3]; + ecn_counts = ecn_counts_buf; + } + else + ecn_counts = NULL; + + packet_out = imico_get_packet_out(conn, header_type, 0); + if (!packet_out) + return -1; + + /* Generate ACK frame */ + imico_rechist_init(&rechist, conn, pns); + len = conn->imc_conn.cn_pf->pf_gen_ack_frame( + packet_out->po_data + packet_out->po_data_sz, + lsquic_packet_out_avail(packet_out), imico_rechist_first, + imico_rechist_next, imico_rechist_largest_recv, &rechist, + now, ¬_used_has_missing, &packet_out->po_ack2ed, ecn_counts); + if (len < 0) + { + LSQ_WARN("could not generate ACK frame"); + return -1; + } + EV_LOG_GENERATED_ACK_FRAME(LSQUIC_LOG_CONN_ID, conn->imc_conn.cn_pf, + packet_out->po_data + packet_out->po_data_sz, len); + packet_out->po_frame_types |= 1 << QUIC_FRAME_ACK; + packet_out->po_data_sz += len; + packet_out->po_regen_sz += len; + conn->imc_flags &= ~(IMC_QUEUED_ACK_INIT << pns); + LSQ_DEBUG("wrote ACK frame of size %d", len); + return 0; +} + + +static int +imico_generate_acks (struct ietf_mini_conn *conn, lsquic_time_t now) +{ + enum packnum_space pns; + + for (pns = PNS_INIT; pns < N_PNS; ++pns) + if (conn->imc_flags & (IMC_QUEUED_ACK_INIT << pns) + && !(pns == PNS_INIT && (conn->imc_flags & IMC_IGNORE_INIT))) + if (0 != imico_generate_ack(conn, pns, now)) + return -1; + + return 0; +} + + +static void +imico_generate_conn_close (struct ietf_mini_conn *conn) +{ + struct lsquic_packet_out *packet_out; + enum header_type header_type; + enum packnum_space pns; + unsigned error_code; + const char *reason; + size_t need; + int sz, rlen, is_app; + char reason_buf[0x20]; + + pns = (conn->imc_flags >> IMCBIT_PNS_BIT_SHIFT) & 3; + header_type = pns2hety[pns]; + need = 30; /* Guess */ /* TODO: calculate, don't guess */ + packet_out = imico_get_packet_out(conn, header_type, need); + if (!packet_out) + return; + + if (conn->imc_flags & IMC_ABORT_ERROR) + { + is_app = !!(conn->imc_flags & IMC_ABORT_ISAPP); + error_code = conn->imc_error_code; + reason = NULL; + rlen = 0; + } + else if (conn->imc_flags & IMC_TLS_ALERT) + { + is_app = 0; + error_code = 0x100 + conn->imc_tls_alert; + if (ALERT_NO_APPLICATION_PROTOCOL == conn->imc_tls_alert) + reason = "no suitable application protocol"; + else + { + snprintf(reason_buf, sizeof(reason_buf), "TLS alert %"PRIu8, + conn->imc_tls_alert); + reason = reason_buf; + } + rlen = strlen(reason); + } + else if (conn->imc_flags & IMC_BAD_TRANS_PARAMS) + { + is_app = 0; + error_code = TEC_NO_ERROR; + reason = "bad transport parameters"; + rlen = 24; + } + else if (conn->imc_flags & IMC_HSK_FAILED) + { + is_app = 0; + error_code = TEC_NO_ERROR; + reason = "handshake failed"; + rlen = 16; + } + else + { + is_app = 0; + error_code = TEC_INTERNAL_ERROR; + reason = NULL; + rlen = 0; + } + + sz = conn->imc_conn.cn_pf->pf_gen_connect_close_frame( + packet_out->po_data + packet_out->po_data_sz, + lsquic_packet_out_avail(packet_out), is_app, error_code, reason, + rlen); + if (sz >= 0) + { + packet_out->po_frame_types |= 1 << QUIC_FRAME_CONNECTION_CLOSE; + packet_out->po_data_sz += sz; + LSQ_DEBUG("generated CONNECTION_CLOSE frame"); + } + else + LSQ_WARN("could not generate CONNECTION_CLOSE frame"); +} + + +static enum tick_st +ietf_mini_conn_ci_tick (struct lsquic_conn *lconn, lsquic_time_t now) +{ + struct ietf_mini_conn *conn = (struct ietf_mini_conn *) lconn; + enum tick_st tick; + + if (conn->imc_created + conn->imc_enpub->enp_settings.es_handshake_to < now) + { + LSQ_DEBUG("connection expired: closing"); + return TICK_CLOSE; + } + + if (conn->imc_flags & + (IMC_QUEUED_ACK_INIT|IMC_QUEUED_ACK_HSK|IMC_QUEUED_ACK_APP)) + { + if (0 != imico_generate_acks(conn, now)) + { + conn->imc_flags |= IMC_ERROR; + return TICK_CLOSE; + } + } + + + tick = 0; + + if (conn->imc_flags & IMC_ERROR) + { + imico_generate_conn_close(conn); + tick |= TICK_CLOSE; + } + else if (conn->imc_flags & IMC_HSK_OK) + tick |= TICK_PROMOTE; + + if (imico_have_packets_to_send(conn, now)) + tick |= TICK_SEND; + else + tick |= TICK_QUIET; + + LSQ_DEBUG("Return TICK %d", tick); + return tick; +} + + +static void +ietf_mini_conn_ci_internal_error (struct lsquic_conn *lconn, + const char *format, ...) +{ + struct ietf_mini_conn *conn = (struct ietf_mini_conn *) lconn; + LSQ_INFO("internal error reported"); + conn->imc_flags |= IMC_ERROR; +} + + +static void +ietf_mini_conn_ci_abort_error (struct lsquic_conn *lconn, int is_app, + unsigned error_code, const char *fmt, ...) +{ + struct ietf_mini_conn *conn = (struct ietf_mini_conn *) lconn; + va_list ap; + const char *err_str, *percent; + char err_buf[0x100]; + + percent = strchr(fmt, '%'); + if (percent) + { + va_start(ap, fmt); + vsnprintf(err_buf, sizeof(err_buf), fmt, ap); + va_end(ap); + err_str = err_buf; + } + else + err_str = fmt; + LSQ_INFO("abort error: is_app: %d; error code: %u; error str: %s", + is_app, error_code, err_str); + conn->imc_flags |= IMC_ERROR|IMC_ABORT_ERROR; + if (is_app) + conn->imc_flags |= IMC_ABORT_ISAPP; + conn->imc_error_code = error_code; +} + + +static struct network_path * +ietf_mini_conn_ci_get_path (struct lsquic_conn *lconn, + const struct sockaddr *sa) +{ + struct ietf_mini_conn *conn = (struct ietf_mini_conn *) lconn; + + return &conn->imc_path; +} + + +static const lsquic_cid_t * +ietf_mini_conn_ci_get_log_cid (const struct lsquic_conn *lconn) +{ + struct ietf_mini_conn *conn = (struct ietf_mini_conn *) lconn; + + if (conn->imc_path.np_dcid.len) + return &conn->imc_path.np_dcid; + else + return CN_SCID(lconn); +} + + +static unsigned char +ietf_mini_conn_ci_record_addrs (struct lsquic_conn *lconn, void *peer_ctx, + const struct sockaddr *local_sa, const struct sockaddr *peer_sa) +{ + struct ietf_mini_conn *conn = (struct ietf_mini_conn *) lconn; + struct lsquic_packet_out *packet_out; + + if (NP_IS_IPv6(&conn->imc_path) != (AF_INET6 == peer_sa->sa_family)) + TAILQ_FOREACH(packet_out, &conn->imc_packets_out, po_next) + if ((packet_out->po_flags & (PO_SENT|PO_ENCRYPTED)) == PO_ENCRYPTED) + imico_return_enc_data(conn, packet_out); + + memcpy(conn->imc_path.np_peer_addr, peer_sa, + sizeof(conn->imc_path.np_peer_addr)); + memcpy(conn->imc_path.np_local_addr, local_sa, + sizeof(conn->imc_path.np_local_addr)); + conn->imc_path.np_peer_ctx = peer_ctx; + return 0; +} + + +static const struct conn_iface mini_conn_ietf_iface = { + .ci_abort_error = ietf_mini_conn_ci_abort_error, + .ci_client_call_on_new = ietf_mini_conn_ci_client_call_on_new, + .ci_destroy = ietf_mini_conn_ci_destroy, + .ci_get_engine = ietf_mini_conn_ci_get_engine, + .ci_get_log_cid = ietf_mini_conn_ci_get_log_cid, + .ci_get_path = ietf_mini_conn_ci_get_path, + .ci_hsk_done = ietf_mini_conn_ci_hsk_done, + .ci_internal_error = ietf_mini_conn_ci_internal_error, + .ci_is_tickable = ietf_mini_conn_ci_is_tickable, + .ci_next_packet_to_send = ietf_mini_conn_ci_next_packet_to_send, + .ci_next_tick_time = ietf_mini_conn_ci_next_tick_time, + .ci_packet_in = ietf_mini_conn_ci_packet_in, + .ci_packet_not_sent = ietf_mini_conn_ci_packet_not_sent, + .ci_packet_sent = ietf_mini_conn_ci_packet_sent, + .ci_record_addrs = ietf_mini_conn_ci_record_addrs, + .ci_tick = ietf_mini_conn_ci_tick, + .ci_tls_alert = ietf_mini_conn_ci_tls_alert, +}; diff --git a/src/liblsquic/lsquic_mini_conn_ietf.h b/src/liblsquic/lsquic_mini_conn_ietf.h new file mode 100644 index 000000000..b27339834 --- /dev/null +++ b/src/liblsquic/lsquic_mini_conn_ietf.h @@ -0,0 +1,88 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_mini_conn_ietf.h -- Mini connection used by the IETF QUIC + */ + +#ifndef LSQUIC_MINI_CONN_IETF_H +#define LSQUIC_MINI_CONN_IETF_H 1 + +struct lsquic_conn; +struct lsquic_engine_public; +struct lsquic_packet_in; + +enum { MCSBIT_WANTREAD, MCSBIT_WANTWRITE, }; + +struct mini_crypto_stream +{ + unsigned mcs_read_off; + unsigned mcs_write_off; + enum { + MCS_WANTREAD = 1 << MCSBIT_WANTREAD, + MCS_WANTWRITE = 1 << MCSBIT_WANTWRITE, + MCS_CREATED = 1 << 2, + } mcs_flags:8; + enum enc_level mcs_enc_level:8; +}; + +typedef uint64_t packno_set_t; +#define MAX_PACKETS ((sizeof(packno_set_t) * 8) - 1) + +struct ietf_mini_conn +{ + struct lsquic_conn imc_conn; + struct conn_cid_elem imc_cces[3]; + struct lsquic_engine_public *imc_enpub; + lsquic_time_t imc_created; + enum { + IMC_ENC_SESS_INITED = 1 << 0, + IMC_QUEUED_ACK_INIT = 1 << 1, + IMC_QUEUED_ACK_HSK = IMC_QUEUED_ACK_INIT << PNS_HSK, + IMC_QUEUED_ACK_APP = IMC_QUEUED_ACK_INIT << PNS_APP, + IMC_ERROR = 1 << 4, + IMC_HSK_OK = 1 << 5, + IMC_HSK_FAILED = 1 << 6, + IMC_HAVE_TP = 1 << 7, + IMC_RETRY_MODE = 1 << 8, + IMC_RETRY_DONE = 1 << 9, + IMC_IGNORE_INIT = 1 << 10, +#define IMCBIT_PNS_BIT_SHIFT 11 + IMC_MAX_PNS_BIT_0 = 1 << 11, + IMC_MAX_PNS_BIT_1 = 1 << 12, + IMC_TLS_ALERT = 1 << 13, + IMC_ABORT_ERROR = 1 << 14, + IMC_ABORT_ISAPP = 1 << 15, + IMC_BAD_TRANS_PARAMS = 1 << 16, + IMC_ADDR_VALIDATED = 1 << 17, + } imc_flags; + struct mini_crypto_stream imc_streams[N_ENC_LEVS]; + void *imc_stream_ps[N_ENC_LEVS]; + struct { + struct stream_frame *frame; /* Latest frame - on stack - be careful. */ + enum enc_level enc_level; + } imc_last_in; + TAILQ_HEAD(, lsquic_packet_in) imc_app_packets; + TAILQ_HEAD(, lsquic_packet_out) imc_packets_out; + packno_set_t imc_sent_packnos; + packno_set_t imc_recvd_packnos[N_PNS]; + packno_set_t imc_acked_packnos[N_PNS]; + lsquic_time_t imc_largest_recvd[N_PNS]; + struct lsquic_rtt_stats imc_rtt_stats; + unsigned imc_error_code; + unsigned imc_bytes_in; + unsigned imc_bytes_out; + unsigned char imc_next_packno; + unsigned char imc_hsk_count; + uint8_t imc_ack_exp; + uint8_t imc_ecn_counts_in[N_PNS][4]; + uint8_t imc_ecn_counts_out[N_PNS][4]; + uint8_t imc_incoming_ecn; + uint8_t imc_tls_alert; + struct network_path imc_path; +}; + +struct lsquic_conn * +lsquic_mini_conn_ietf_new (struct lsquic_engine_public *, + const struct lsquic_packet_in *, + enum lsquic_version, int is_ipv4, const struct lsquic_cid *); + +#endif diff --git a/src/liblsquic/lsquic_minmax.c b/src/liblsquic/lsquic_minmax.c new file mode 100644 index 000000000..d5d8049b2 --- /dev/null +++ b/src/liblsquic/lsquic_minmax.c @@ -0,0 +1,155 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * Based on Google code released under BSD license here: + * https://groups.google.com/forum/#!topic/bbr-dev/3RTgkzi5ZD8 + */ + +/* + * Copyright 2017, Google Inc. + * + * Use of this source code is governed by the following BSD-style license: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * + * * Neither the name of Google Inc. 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 + * OWNER 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. + */ + +/* + * Kathleen Nichols' algorithm for tracking the minimum (or maximum) + * value of a data stream over some fixed time interval. (E.g., + * the minimum RTT over the past five minutes.) It uses constant + * space and constant time per update yet almost always delivers + * the same minimum as an implementation that has to keep all the + * data in the window. + * + * The algorithm keeps track of the best, 2nd best & 3rd best min + * values, maintaining an invariant that the measurement time of + * the n'th best >= n-1'th best. It also makes sure that the three + * values are widely separated in the time window since that bounds + * the worse case error when that data is monotonically increasing + * over the window. + * + * Upon getting a new min, we can forget everything earlier because + * it has no value - the new min is <= everything else in the window + * by definition and it'samples the most recent. So we restart fresh on + * every new min and overwrites 2nd & 3rd choices. The same property + * holds for 2nd & 3rd best. + */ + +#include +#include + +#include "lsquic_minmax.h" + +/* As time advances, update the 1st, 2nd, and 3rd choices. */ +static void +minmax_subwin_update (struct minmax *minmax, const struct minmax_sample *sample) +{ + uint64_t dt = sample->time - minmax->samples[0].time; + + if (dt > minmax->window) + { + /* + * Passed entire window without a new sample so make 2nd + * choice the new sample & 3rd choice the new 2nd choice. + * we may have to iterate this since our 2nd choice + * may also be outside the window (we checked on entry + * that the third choice was in the window). + */ + minmax->samples[0] = minmax->samples[1]; + minmax->samples[1] = minmax->samples[2]; + minmax->samples[2] = *sample; + if (sample->time - minmax->samples[0].time > minmax->window) { + minmax->samples[0] = minmax->samples[1]; + minmax->samples[1] = minmax->samples[2]; + minmax->samples[2] = *sample; + } + } + else if (minmax->samples[1].time == minmax->samples[0].time + && dt > minmax->window / 4) + { + /* + * We've passed a quarter of the window without a new sample + * so take a 2nd choice from the 2nd quarter of the window. + */ + minmax->samples[2] = minmax->samples[1] = *sample; + } + else if (minmax->samples[2].time == minmax->samples[1].time + && dt > minmax->window / 2) + { + /* + * We've passed half the window without finding a new sample + * so take a 3rd choice from the last half of the window + */ + minmax->samples[2] = *sample; + } +} + + +/* Check if new measurement updates the 1st, 2nd or 3rd choice max. */ +void +lsquic_minmax_update_max (struct minmax *minmax, uint64_t now, uint64_t meas) +{ + struct minmax_sample sample = { .time = now, .value = meas }; + + if (minmax->samples[0].value == 0 /* uninitialized */ + || sample.value >= minmax->samples[0].value /* found new max? */ + || sample.time - minmax->samples[2].time > minmax->window) /* nothing left in window? */ + { + minmax_reset(minmax, sample); /* forget earlier samples */ + return; + } + + if (sample.value >= minmax->samples[1].value) + minmax->samples[2] = minmax->samples[1] = sample; + else if (sample.value >= minmax->samples[2].value) + minmax->samples[2] = sample; + + minmax_subwin_update(minmax, &sample); +} + + +/* Check if new measurement updates the 1st, 2nd or 3rd choice min. */ +void +lsquic_minmax_update_min (struct minmax *minmax, uint64_t now, uint64_t meas) +{ + struct minmax_sample sample = { .time = now, .value = meas }; + + if (minmax->samples[0].value == 0 /* uninitialized */ + || sample.value <= minmax->samples[0].value /* found new min? */ + || sample.time - minmax->samples[2].time > minmax->window) /* nothing left in window? */ + { + minmax_reset(minmax, sample); /* forget earlier samples */ + return; + } + + if (sample.value <= minmax->samples[1].value) + minmax->samples[2] = minmax->samples[1] = sample; + else if (sample.value <= minmax->samples[2].value) + minmax->samples[2] = sample; + + minmax_subwin_update(minmax, &sample); +} diff --git a/src/liblsquic/lsquic_minmax.h b/src/liblsquic/lsquic_minmax.h new file mode 100644 index 000000000..ab42c59cc --- /dev/null +++ b/src/liblsquic/lsquic_minmax.h @@ -0,0 +1,44 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#ifndef LSQUIC_MINMAX_H +#define LSQUIC_MINMAX_H + +/* Windowed min/max tracker by Kathleen Nichols. + * + * Based on Google code released under BSD license here: + * https://groups.google.com/forum/#!topic/bbr-dev/3RTgkzi5ZD8 + */ + + +struct minmax_sample +{ + uint64_t time; + uint64_t value; +}; + +struct minmax +{ + uint64_t window; + struct minmax_sample samples[3]; +}; + +#define minmax_get_idx(minmax_, idx_) ((minmax_)->samples[idx_].value) + +#define minmax_get(minmax_) minmax_get_idx(minmax_, 0) + +#define minmax_reset(minmax_, sample_) do { \ + (minmax_)->samples[0] = (minmax_)->samples[1] \ + = (minmax_)->samples[2] = (sample_); \ +} while (0) + +#define minmax_init(minmax_, window_) do { \ + (minmax_)->window = (window_); \ + minmax_reset(minmax_, ((struct minmax_sample) { 0, 0, })); \ +} while (0) + +void lsquic_minmax_update_min(struct minmax *, uint64_t now, uint64_t meas); +void lsquic_minmax_update_max(struct minmax *, uint64_t now, uint64_t meas); + +#define minmax_upmin lsquic_minmax_update_min +#define minmax_upmax lsquic_minmax_update_max + +#endif diff --git a/src/liblsquic/lsquic_mm.c b/src/liblsquic/lsquic_mm.c index 2aa8424c6..b9881cb83 100644 --- a/src/liblsquic/lsquic_mm.c +++ b/src/liblsquic/lsquic_mm.c @@ -14,22 +14,45 @@ #include "lsquic.h" #include "lsquic_int_types.h" +#include "lsquic_sizes.h" #include "lsquic_malo.h" +#include "lsquic_hash.h" #include "lsquic_conn.h" #include "lsquic_rtt.h" #include "lsquic_packet_common.h" +#include "lsquic_mini_conn.h" +#include "lsquic_enc_sess.h" +#include "lsquic_mini_conn_ietf.h" +#include "lsquic_packet_gquic.h" #include "lsquic_packet_in.h" #include "lsquic_packet_out.h" #include "lsquic_parse.h" #include "lsquic_mm.h" #include "lsquic_engine_public.h" +#include "lsquic_full_conn.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_sfcw.h" +#include "lsquic_stream.h" + +#ifndef LSQUIC_LOG_POOL_STATS +#define LSQUIC_LOG_POOL_STATS 0 +#endif + +#if LSQUIC_LOG_POOL_STATS +#include "lsquic_logger.h" +#endif + +#ifndef LSQUIC_USE_POOLS +#define LSQUIC_USE_POOLS 1 +#endif #define FAIL_NOMEM do { errno = ENOMEM; return NULL; } while (0) -struct payload_buf +struct packet_in_buf { - SLIST_ENTRY(payload_buf) next_pb; + SLIST_ENTRY(packet_in_buf) next_pib; }; struct packet_out_buf @@ -51,21 +74,32 @@ struct sixteen_k_page int lsquic_mm_init (struct lsquic_mm *mm) { +#if LSQUIC_USE_POOLS int i; +#endif mm->acki = malloc(sizeof(*mm->acki)); mm->malo.stream_frame = lsquic_malo_create(sizeof(struct stream_frame)); mm->malo.stream_rec_arr = lsquic_malo_create(sizeof(struct stream_rec_arr)); + mm->malo.mini_conn = lsquic_malo_create(sizeof(struct mini_conn)); + mm->malo.mini_conn_ietf = lsquic_malo_create(sizeof(struct ietf_mini_conn)); mm->malo.packet_in = lsquic_malo_create(sizeof(struct lsquic_packet_in)); mm->malo.packet_out = lsquic_malo_create(sizeof(struct lsquic_packet_out)); + mm->malo.dcid_elem = lsquic_malo_create(sizeof(struct dcid_elem)); + mm->malo.stream_hq_frame + = lsquic_malo_create(sizeof(struct stream_hq_frame)); +#if LSQUIC_USE_POOLS TAILQ_INIT(&mm->free_packets_in); for (i = 0; i < MM_N_OUT_BUCKETS; ++i) SLIST_INIT(&mm->packet_out_bufs[i]); - SLIST_INIT(&mm->payload_bufs); + for (i = 0; i < MM_N_IN_BUCKETS; ++i) + SLIST_INIT(&mm->packet_in_bufs[i]); SLIST_INIT(&mm->four_k_pages); SLIST_INIT(&mm->sixteen_k_pages); - if (mm->acki && mm->malo.stream_frame && mm->malo.stream_rec_arr && - mm->malo.packet_in) +#endif + if (mm->acki && mm->malo.stream_frame && mm->malo.stream_rec_arr + && mm->malo.mini_conn && mm->malo.mini_conn_ietf && mm->malo.packet_in + && mm->malo.stream_hq_frame) { return 0; } @@ -77,18 +111,25 @@ lsquic_mm_init (struct lsquic_mm *mm) void lsquic_mm_cleanup (struct lsquic_mm *mm) { +#if LSQUIC_USE_POOLS int i; struct packet_out_buf *pob; - struct payload_buf *pb; + struct packet_in_buf *pib; struct four_k_page *fkp; struct sixteen_k_page *skp; +#endif free(mm->acki); + lsquic_malo_destroy(mm->malo.stream_hq_frame); + lsquic_malo_destroy(mm->malo.dcid_elem); lsquic_malo_destroy(mm->malo.packet_in); lsquic_malo_destroy(mm->malo.packet_out); lsquic_malo_destroy(mm->malo.stream_frame); lsquic_malo_destroy(mm->malo.stream_rec_arr); + lsquic_malo_destroy(mm->malo.mini_conn); + lsquic_malo_destroy(mm->malo.mini_conn_ietf); +#if LSQUIC_USE_POOLS for (i = 0; i < MM_N_OUT_BUCKETS; ++i) while ((pob = SLIST_FIRST(&mm->packet_out_bufs[i]))) { @@ -96,11 +137,12 @@ lsquic_mm_cleanup (struct lsquic_mm *mm) free(pob); } - while ((pb = SLIST_FIRST(&mm->payload_bufs))) - { - SLIST_REMOVE_HEAD(&mm->payload_bufs, next_pb); - free(pb); - } + for (i = 0; i < MM_N_IN_BUCKETS; ++i) + while ((pib = SLIST_FIRST(&mm->packet_in_bufs[i]))) + { + SLIST_REMOVE_HEAD(&mm->packet_in_bufs[i], next_pib); + free(pib); + } while ((fkp = SLIST_FIRST(&mm->four_k_pages))) { @@ -113,6 +155,56 @@ lsquic_mm_cleanup (struct lsquic_mm *mm) SLIST_REMOVE_HEAD(&mm->sixteen_k_pages, next_skp); free(skp); } +#endif +} + + +#if LSQUIC_USE_POOLS +enum { + PACKET_IN_PAYLOAD_0 = 1370, /* common QUIC payload size upperbound */ + PACKET_IN_PAYLOAD_1 = 4096, /* payload size middleground guess */ + PACKET_IN_PAYLOAD_2 = 0xffff, /* UDP payload size upperbound */ +}; + + +static const unsigned packet_in_sizes[] = { + PACKET_IN_PAYLOAD_0, + PACKET_IN_PAYLOAD_1, + PACKET_IN_PAYLOAD_2, +}; + + +static unsigned +packet_in_index (unsigned size) +{ + unsigned idx = (size > PACKET_IN_PAYLOAD_0) + + (size > PACKET_IN_PAYLOAD_1); + return idx; +} +#endif + + +void +lsquic_mm_put_packet_in (struct lsquic_mm *mm, + struct lsquic_packet_in *packet_in) +{ +#if LSQUIC_USE_POOLS + unsigned idx; + struct packet_in_buf *pib; + + assert(0 == packet_in->pi_refcnt); + if (packet_in->pi_flags & PI_OWN_DATA) + { + pib = (struct packet_in_buf *) packet_in->pi_data; + idx = packet_in_index(packet_in->pi_data_sz); + SLIST_INSERT_HEAD(&mm->packet_in_bufs[idx], pib, next_pib); + } + TAILQ_INSERT_HEAD(&mm->free_packets_in, packet_in, pi_next); +#else + if (packet_in->pi_flags & PI_OWN_DATA) + free(packet_in->pi_data); + lsquic_malo_put(packet_in); +#endif } @@ -123,6 +215,7 @@ lsquic_mm_get_packet_in (struct lsquic_mm *mm) fiu_do_on("mm/packet_in", FAIL_NOMEM); +#if LSQUIC_USE_POOLS packet_in = TAILQ_FIRST(&mm->free_packets_in); if (packet_in) { @@ -130,6 +223,7 @@ lsquic_mm_get_packet_in (struct lsquic_mm *mm) TAILQ_REMOVE(&mm->free_packets_in, packet_in, pi_next); } else +#endif packet_in = lsquic_malo_get(mm->malo.packet_in); if (packet_in) @@ -139,11 +233,14 @@ lsquic_mm_get_packet_in (struct lsquic_mm *mm) } +#if LSQUIC_USE_POOLS /* Based on commonly used MTUs, ordered from small to large: */ enum { - PACKET_OUT_PAYLOAD_0 = 1280 - QUIC_MIN_PACKET_OVERHEAD, - PACKET_OUT_PAYLOAD_1 = QUIC_MAX_IPv6_PACKET_SZ - QUIC_MIN_PACKET_OVERHEAD, - PACKET_OUT_PAYLOAD_2 = QUIC_MAX_IPv4_PACKET_SZ - QUIC_MIN_PACKET_OVERHEAD, + PACKET_OUT_PAYLOAD_0 = 1280 - GQUIC_MIN_PACKET_OVERHEAD, + PACKET_OUT_PAYLOAD_1 = GQUIC_MAX_IPv6_PACKET_SZ - GQUIC_MIN_PACKET_OVERHEAD, + PACKET_OUT_PAYLOAD_2 = GQUIC_MAX_IPv4_PACKET_SZ - GQUIC_MIN_PACKET_OVERHEAD, + PACKET_OUT_PAYLOAD_3 = 4096, + PACKET_OUT_PAYLOAD_4 = 0xffff, }; @@ -151,6 +248,8 @@ static const unsigned packet_out_sizes[] = { PACKET_OUT_PAYLOAD_0, PACKET_OUT_PAYLOAD_1, PACKET_OUT_PAYLOAD_2, + PACKET_OUT_PAYLOAD_3, + PACKET_OUT_PAYLOAD_4, }; @@ -158,15 +257,120 @@ static unsigned packet_out_index (unsigned size) { unsigned idx = (size > PACKET_OUT_PAYLOAD_0) - + (size > PACKET_OUT_PAYLOAD_1); + + (size > PACKET_OUT_PAYLOAD_1) + + (size > PACKET_OUT_PAYLOAD_2) + + (size > PACKET_OUT_PAYLOAD_3); return idx; } +#endif + +#if LSQUIC_USE_POOLS +#define POOL_SAMPLE_PERIOD 1024 + +static void +poolst_sample_max (struct pool_stats *poolst) +{ +#define ALPHA_SHIFT 3 +#define BETA_SHIFT 2 + unsigned diff; + + if (poolst->ps_max_avg) + { + poolst->ps_max_var -= poolst->ps_max_var >> BETA_SHIFT; + if (poolst->ps_max_avg > poolst->ps_max) + diff = poolst->ps_max_avg - poolst->ps_max; + else + diff = poolst->ps_max - poolst->ps_max_avg; + poolst->ps_max_var += diff >> BETA_SHIFT; + poolst->ps_max_avg -= poolst->ps_max_avg >> ALPHA_SHIFT; + poolst->ps_max_avg += poolst->ps_max >> ALPHA_SHIFT; + } + else + { + /* First measurement */ + poolst->ps_max_avg = poolst->ps_max; + poolst->ps_max_var = poolst->ps_max / 2; + } + + poolst->ps_calls = 0; + poolst->ps_max = poolst->ps_objs_out; +#if LSQUIC_LOG_POOL_STATS + LSQ_DEBUG("new sample: max avg: %u; var: %u", poolst->ps_max_avg, + poolst->ps_max_var); +#endif +} + + +static void +poolst_allocated (struct pool_stats *poolst, unsigned new) +{ + poolst->ps_objs_out += 1; + poolst->ps_objs_all += new; + if (poolst->ps_objs_out > poolst->ps_max) + poolst->ps_max = poolst->ps_objs_out; + ++poolst->ps_calls; + if (0 == poolst->ps_calls % POOL_SAMPLE_PERIOD) + poolst_sample_max(poolst); +} + + +static void +poolst_freed (struct pool_stats *poolst) +{ + --poolst->ps_objs_out; + ++poolst->ps_calls; + if (0 == poolst->ps_calls % POOL_SAMPLE_PERIOD) + poolst_sample_max(poolst); +} + + +static int +poolst_has_new_sample (const struct pool_stats *poolst) +{ + return poolst->ps_calls == 0; +} + + +/* If average maximum falls under 1/4 of all objects allocated, release + * half of the objects allocated. + */ +static void +maybe_shrink_packet_out_bufs (struct lsquic_mm *mm, unsigned idx) +{ + struct pool_stats *poolst; + struct packet_out_buf *pob; + unsigned n_to_leave; + + poolst = &mm->packet_out_bstats[idx]; + if (poolst->ps_max_avg * 4 < poolst->ps_objs_all) + { + n_to_leave = poolst->ps_objs_all / 2; + while (poolst->ps_objs_all > n_to_leave + && (pob = SLIST_FIRST(&mm->packet_out_bufs[idx]))) + { + SLIST_REMOVE_HEAD(&mm->packet_out_bufs[idx], next_pob); + free(pob); + --poolst->ps_objs_all; + } +#if LSQUIC_LOG_POOL_STATS + LSQ_DEBUG("pool #%u; max avg %u; shrank from %u to %u objs", + idx, poolst->ps_max_avg, n_to_leave * 2, poolst->ps_objs_all); +#endif + } +#if LSQUIC_LOG_POOL_STATS + else + LSQ_DEBUG("pool #%u; max avg %u; objs: %u; won't shrink", + idx, poolst->ps_max_avg, poolst->ps_objs_all); +#endif +} +#endif void lsquic_mm_put_packet_out (struct lsquic_mm *mm, struct lsquic_packet_out *packet_out) { +#if LSQUIC_USE_POOLS struct packet_out_buf *pob; unsigned idx; @@ -174,6 +378,14 @@ lsquic_mm_put_packet_out (struct lsquic_mm *mm, pob = (struct packet_out_buf *) packet_out->po_data; idx = packet_out_index(packet_out->po_n_alloc); SLIST_INSERT_HEAD(&mm->packet_out_bufs[idx], pob, next_pob); + poolst_freed(&mm->packet_out_bstats[idx]); + if (poolst_has_new_sample(&mm->packet_out_bstats[idx])) + maybe_shrink_packet_out_bufs(mm, idx); + if (packet_out->po_bwp_state) + lsquic_malo_put(packet_out->po_bwp_state); +#else + free(packet_out->po_data); +#endif lsquic_malo_put(packet_out); } @@ -184,9 +396,9 @@ lsquic_mm_get_packet_out (struct lsquic_mm *mm, struct malo *malo, { struct lsquic_packet_out *packet_out; struct packet_out_buf *pob; +#if LSQUIC_USE_POOLS unsigned idx; - - assert(size <= QUIC_MAX_PAYLOAD_SZ); +#endif fiu_do_on("mm/packet_out", FAIL_NOMEM); @@ -194,10 +406,14 @@ lsquic_mm_get_packet_out (struct lsquic_mm *mm, struct malo *malo, if (!packet_out) return NULL; +#if LSQUIC_USE_POOLS idx = packet_out_index(size); pob = SLIST_FIRST(&mm->packet_out_bufs[idx]); if (pob) + { SLIST_REMOVE_HEAD(&mm->packet_out_bufs[idx], next_pob); + poolst_allocated(&mm->packet_out_bstats[idx], 0); + } else { pob = malloc(packet_out_sizes[idx]); @@ -206,7 +422,18 @@ lsquic_mm_get_packet_out (struct lsquic_mm *mm, struct malo *malo, lsquic_malo_put(packet_out); return NULL; } + poolst_allocated(&mm->packet_out_bstats[idx], 1); } + if (poolst_has_new_sample(&mm->packet_out_bstats[idx])) + maybe_shrink_packet_out_bufs(mm, idx); +#else + pob = malloc(size); + if (!pob) + { + lsquic_malo_put(packet_out); + return NULL; + } +#endif memset(packet_out, 0, sizeof(*packet_out)); packet_out->po_n_alloc = size; @@ -217,29 +444,46 @@ lsquic_mm_get_packet_out (struct lsquic_mm *mm, struct malo *malo, void * -lsquic_mm_get_1370 (struct lsquic_mm *mm) +lsquic_mm_get_packet_in_buf (struct lsquic_mm *mm, size_t size) { - struct payload_buf *pb = SLIST_FIRST(&mm->payload_bufs); - fiu_do_on("mm/1370", FAIL_NOMEM); - if (pb) - SLIST_REMOVE_HEAD(&mm->payload_bufs, next_pb); + struct packet_in_buf *pib; +#if LSQUIC_USE_POOLS + unsigned idx; + + idx = packet_in_index(size); + pib = SLIST_FIRST(&mm->packet_in_bufs[idx]); + fiu_do_on("mm/packet_in_buf", FAIL_NOMEM); + if (pib) + SLIST_REMOVE_HEAD(&mm->packet_in_bufs[idx], next_pib); else - pb = malloc(1370); - return pb; + pib = malloc(packet_in_sizes[idx]); +#else + pib = malloc(size); +#endif + return pib; } void -lsquic_mm_put_1370 (struct lsquic_mm *mm, void *mem) +lsquic_mm_put_packet_in_buf (struct lsquic_mm *mm, void *mem, size_t size) { - struct payload_buf *pb = mem; - SLIST_INSERT_HEAD(&mm->payload_bufs, pb, next_pb); +#if LSQUIC_USE_POOLS + unsigned idx; + struct packet_in_buf *pib; + + pib = (struct packet_in_buf *) mem; + idx = packet_in_index(size); + SLIST_INSERT_HEAD(&mm->packet_in_bufs[idx], pib, next_pib); +#else + free(mem); +#endif } void * lsquic_mm_get_4k (struct lsquic_mm *mm) { +#if LSQUIC_USE_POOLS struct four_k_page *fkp = SLIST_FIRST(&mm->four_k_pages); fiu_do_on("mm/4k", FAIL_NOMEM); if (fkp) @@ -247,20 +491,28 @@ lsquic_mm_get_4k (struct lsquic_mm *mm) else fkp = malloc(0x1000); return fkp; +#else + return malloc(0x1000); +#endif } void lsquic_mm_put_4k (struct lsquic_mm *mm, void *mem) { +#if LSQUIC_USE_POOLS struct four_k_page *fkp = mem; SLIST_INSERT_HEAD(&mm->four_k_pages, fkp, next_fkp); +#else + free(mem); +#endif } void * lsquic_mm_get_16k (struct lsquic_mm *mm) { +#if LSQUIC_USE_POOLS struct sixteen_k_page *skp = SLIST_FIRST(&mm->sixteen_k_pages); fiu_do_on("mm/16k", FAIL_NOMEM); if (skp) @@ -268,33 +520,30 @@ lsquic_mm_get_16k (struct lsquic_mm *mm) else skp = malloc(16 * 1024); return skp; +#else + return malloc(16 * 1024); +#endif } void lsquic_mm_put_16k (struct lsquic_mm *mm, void *mem) { +#if LSQUIC_USE_POOLS struct sixteen_k_page *skp = mem; SLIST_INSERT_HEAD(&mm->sixteen_k_pages, skp, next_skp); -} - - -void -lsquic_mm_put_packet_in (struct lsquic_mm *mm, - struct lsquic_packet_in *packet_in) -{ - assert(0 == packet_in->pi_refcnt); - if (packet_in->pi_flags & PI_OWN_DATA) - lsquic_mm_put_1370(mm, packet_in->pi_data); - TAILQ_INSERT_HEAD(&mm->free_packets_in, packet_in, pi_next); +#else + free(mem); +#endif } size_t lsquic_mm_mem_used (const struct lsquic_mm *mm) { +#if LSQUIC_USE_POOLS const struct packet_out_buf *pob; - const struct payload_buf *pb; + const struct packet_in_buf *pib; const struct four_k_page *fkp; const struct sixteen_k_page *skp; unsigned i; @@ -304,6 +553,8 @@ lsquic_mm_mem_used (const struct lsquic_mm *mm) size += sizeof(*mm->acki); size += lsquic_malo_mem_used(mm->malo.stream_frame); size += lsquic_malo_mem_used(mm->malo.stream_rec_arr); + size += lsquic_malo_mem_used(mm->malo.mini_conn); + size += lsquic_malo_mem_used(mm->malo.mini_conn_ietf); size += lsquic_malo_mem_used(mm->malo.packet_in); size += lsquic_malo_mem_used(mm->malo.packet_out); @@ -311,8 +562,9 @@ lsquic_mm_mem_used (const struct lsquic_mm *mm) SLIST_FOREACH(pob, &mm->packet_out_bufs[i], next_pob) size += packet_out_sizes[i]; - SLIST_FOREACH(pb, &mm->payload_bufs, next_pb) - size += 1370; + for (i = 0; i < MM_N_IN_BUCKETS; ++i) + SLIST_FOREACH(pib, &mm->packet_in_bufs[i], next_pib) + size += packet_in_sizes[i]; SLIST_FOREACH(fkp, &mm->four_k_pages, next_fkp) size += 0x1000; @@ -321,4 +573,7 @@ lsquic_mm_mem_used (const struct lsquic_mm *mm) size += 0x4000; return size; +#else + return sizeof(*mm); +#endif } diff --git a/src/liblsquic/lsquic_mm.h b/src/liblsquic/lsquic_mm.h index ed39673aa..e6836d7f2 100644 --- a/src/liblsquic/lsquic_mm.h +++ b/src/liblsquic/lsquic_mm.h @@ -14,20 +14,38 @@ struct lsquic_packet_in; struct lsquic_packet_out; struct ack_info; struct malo; +struct mini_conn; + +struct pool_stats +{ + unsigned ps_calls; /* Calls to get/put */ + unsigned ps_max; /* Maximum during this sample period */ + unsigned ps_max_avg, /* Average maximum value */ + ps_max_var; + unsigned ps_objs_all; /* Number of objects owned by the pool */ + unsigned ps_objs_out; /* Number of objects in use */ +}; -#define MM_N_OUT_BUCKETS 3 +#define MM_N_OUT_BUCKETS 5 +#define MM_N_IN_BUCKETS 3 struct lsquic_mm { struct ack_info *acki; struct { struct malo *stream_frame; /* For struct stream_frame */ struct malo *stream_rec_arr;/* For struct stream_rec_arr */ + struct malo *mini_conn; /* For struct mini_conn */ + struct malo *mini_conn_ietf;/* For struct ietf_mini_conn */ + struct malo *retry_conn; /* For struct retry_conn */ struct malo *packet_in; /* For struct lsquic_packet_in */ struct malo *packet_out; /* For struct lsquic_packet_out */ + struct malo *dcid_elem; /* For struct dcid_elem */ + struct malo *stream_hq_frame; /* For struct stream_hq_frame */ } malo; TAILQ_HEAD(, lsquic_packet_in) free_packets_in; SLIST_HEAD(, packet_out_buf) packet_out_bufs[MM_N_OUT_BUCKETS]; - SLIST_HEAD(, payload_buf) payload_bufs; + struct pool_stats packet_out_bstats[MM_N_OUT_BUCKETS]; + SLIST_HEAD(, packet_in_buf) packet_in_bufs[MM_N_IN_BUCKETS]; SLIST_HEAD(, four_k_page) four_k_pages; SLIST_HEAD(, sixteen_k_page) sixteen_k_pages; }; @@ -58,10 +76,10 @@ void lsquic_mm_put_packet_out (struct lsquic_mm *, struct lsquic_packet_out *); void * -lsquic_mm_get_1370 (struct lsquic_mm *); +lsquic_mm_get_packet_in_buf (struct lsquic_mm *, size_t); void -lsquic_mm_put_1370 (struct lsquic_mm *, void *); +lsquic_mm_put_packet_in_buf (struct lsquic_mm *, void *, size_t); void * lsquic_mm_get_4k (struct lsquic_mm *); diff --git a/src/liblsquic/lsquic_pacer.c b/src/liblsquic/lsquic_pacer.c index 7f0c95162..ada3edd27 100644 --- a/src/liblsquic/lsquic_pacer.c +++ b/src/liblsquic/lsquic_pacer.c @@ -11,11 +11,12 @@ #include "lsquic_int_types.h" #include "lsquic_pacer.h" #include "lsquic_packet_common.h" +#include "lsquic_packet_gquic.h" #include "lsquic_packet_out.h" #include "lsquic_util.h" #define LSQUIC_LOGGER_MODULE LSQLM_PACER -#define LSQUIC_LOG_CONN_ID pacer->pa_cid +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(pacer->pa_conn) #include "lsquic_logger.h" #ifndef MAX @@ -24,11 +25,12 @@ void -pacer_init (struct pacer *pacer, lsquic_cid_t cid, unsigned clock_granularity) +pacer_init (struct pacer *pacer, const struct lsquic_conn *conn, + unsigned clock_granularity) { memset(pacer, 0, sizeof(*pacer)); pacer->pa_burst_tokens = 10; - pacer->pa_cid = cid; + pacer->pa_conn = conn; pacer->pa_clock_granularity = clock_granularity; } @@ -52,6 +54,7 @@ pacer_packet_scheduled (struct pacer *pacer, unsigned n_in_flight, #ifndef NDEBUG ++pacer->pa_stats.n_scheduled; #endif + ++pacer->pa_n_scheduled; if (n_in_flight == 0 && !in_recovery) { @@ -90,7 +93,7 @@ pacer_packet_scheduled (struct pacer *pacer, unsigned n_in_flight, pacer->pa_next_sched = MAX(pacer->pa_next_sched + delay, sched_time + delay); LSQ_DEBUG("next_sched is set to %"PRIu64" usec from now", - pacer->pa_next_sched - lsquic_time_now()); + pacer->pa_next_sched - pacer->pa_now); } @@ -123,8 +126,25 @@ pacer_can_schedule (struct pacer *pacer, unsigned n_in_flight) void -pacer_tick (struct pacer *pacer, lsquic_time_t now) +pacer_tick_in (struct pacer *pacer, lsquic_time_t now) { assert(now >= pacer->pa_now); pacer->pa_now = now; + if (pacer->pa_flags & PA_LAST_SCHED_DELAYED) + pacer->pa_flags |= PA_DELAYED_ON_TICK_IN; + pacer->pa_n_scheduled = 0; +} + + +void +pacer_tick_out (struct pacer *pacer) +{ + if ((pacer->pa_flags & PA_DELAYED_ON_TICK_IN) + && pacer->pa_n_scheduled == 0 + && pacer->pa_now > pacer->pa_next_sched) + { + LSQ_DEBUG("tick passed without scheduled packets: reset delayed flag"); + pacer->pa_flags &= ~PA_LAST_SCHED_DELAYED; + } + pacer->pa_flags &= ~PA_DELAYED_ON_TICK_IN; } diff --git a/src/liblsquic/lsquic_pacer.h b/src/liblsquic/lsquic_pacer.h index bc531fe7f..a96ffe136 100644 --- a/src/liblsquic/lsquic_pacer.h +++ b/src/liblsquic/lsquic_pacer.h @@ -2,9 +2,12 @@ #ifndef LSQUIC_PACER_H #define LSQUIC_PACER_H 1 +struct lsquic_conn; + struct pacer { - lsquic_cid_t pa_cid; /* Used for logging */ + const struct lsquic_conn + *pa_conn; /* Used for logging */ lsquic_time_t pa_next_sched; lsquic_time_t pa_last_delayed; lsquic_time_t pa_now; @@ -14,8 +17,10 @@ struct pacer unsigned pa_clock_granularity; unsigned pa_burst_tokens; + unsigned pa_n_scheduled; /* Within single tick */ enum { PA_LAST_SCHED_DELAYED = (1 << 0), + PA_DELAYED_ON_TICK_IN = (1 << 1), } pa_flags; #ifndef NDEBUG struct { @@ -28,13 +33,17 @@ struct pacer typedef lsquic_time_t (*tx_time_f)(void *ctx); void -pacer_init (struct pacer *, lsquic_cid_t, unsigned clock_granularity); +pacer_init (struct pacer *, const struct lsquic_conn *, + unsigned clock_granularity); void pacer_cleanup (struct pacer *); void -pacer_tick (struct pacer *, lsquic_time_t); +pacer_tick_in (struct pacer *, lsquic_time_t); + +void +pacer_tick_out (struct pacer *); int pacer_can_schedule (struct pacer *, unsigned n_in_flight); diff --git a/src/liblsquic/lsquic_packet_common.c b/src/liblsquic/lsquic_packet_common.c index bf3d8e747..02a09c779 100644 --- a/src/liblsquic/lsquic_packet_common.c +++ b/src/liblsquic/lsquic_packet_common.c @@ -3,10 +3,14 @@ * lsquic_packet_common.c -- some common packet-related routines */ +#include #include -#include +#include +#include "lsquic.h" +#include "lsquic_types.h" #include "lsquic_logger.h" +#include "lsquic_enc_sess.h" #include "lsquic_packet_common.h" @@ -43,58 +47,42 @@ lsquic_frame_types_to_str (char *buf, size_t bufsz, } -enum packno_bits -calc_packno_bits (lsquic_packno_t packno, lsquic_packno_t least_unacked, - uint64_t n_in_flight) +const char *const lsquic_hety2str[] = { - uint64_t delta; - unsigned bits; - - delta = packno - least_unacked; - if (n_in_flight > delta) - delta = n_in_flight; - - delta *= 4; - bits = (delta > (1ULL << 8)) - + (delta > (1ULL << 16)) - + (delta > (1ULL << 32)); - - return bits; -} + [HETY_NOT_SET] = "Short", + [HETY_VERNEG] = "Version Negotiation", + [HETY_INITIAL] = "Initial", + [HETY_RETRY] = "Retry", + [HETY_HANDSHAKE] = "Handshake", + [HETY_0RTT] = "0-RTT", +}; -lsquic_packno_t -restore_packno (lsquic_packno_t cur_packno, - unsigned len, - lsquic_packno_t max_packno) +/* [draft-ietf-quic-tls-14], Section 4 */ +const enum packnum_space lsquic_hety2pns[] = { - lsquic_packno_t candidates[3], epoch_delta; - int64_t diffs[3]; - unsigned min; - - epoch_delta = 1ULL << (len << 3); - candidates[1] = (max_packno & ~(epoch_delta - 1)) + cur_packno; - candidates[0] = candidates[1] - epoch_delta; - candidates[2] = candidates[1] + epoch_delta; - - diffs[0] = llabs((int64_t) candidates[0] - (int64_t) max_packno); - diffs[1] = llabs((int64_t) candidates[1] - (int64_t) max_packno); - diffs[2] = llabs((int64_t) candidates[2] - (int64_t) max_packno); + [HETY_NOT_SET] = PNS_APP, + [HETY_VERNEG] = 0, + [HETY_INITIAL] = PNS_INIT, + [HETY_RETRY] = 0, + [HETY_HANDSHAKE] = PNS_HSK, + [HETY_0RTT] = PNS_APP, +}; - min = diffs[1] < diffs[0]; - if (diffs[2] < diffs[min]) - min = 2; - return candidates[min]; -} +/* [draft-ietf-quic-tls-14], Section 4 */ +const enum packnum_space lsquic_enclev2pns[] = +{ + [ENC_LEV_CLEAR] = PNS_INIT, + [ENC_LEV_INIT] = PNS_HSK, + [ENC_LEV_EARLY] = PNS_APP, + [ENC_LEV_FORW] = PNS_APP, +}; -const char *const lsquic_hety2str[] = +const char *const lsquic_pns2str[] = { - [HETY_NOT_SET] = "Short", - [HETY_VERNEG] = "Version Negotiation", - [HETY_INITIAL] = "Initial", - [HETY_RETRY] = "Retry", - [HETY_HANDSHAKE] = "Handshake", - [HETY_0RTT] = "0-RTT", + [PNS_INIT] = "Init PNS", + [PNS_HSK] = "Handshake PNS", + [PNS_APP] = "App PNS", }; diff --git a/src/liblsquic/lsquic_packet_common.h b/src/liblsquic/lsquic_packet_common.h index 3604af46b..118a0acc5 100644 --- a/src/liblsquic/lsquic_packet_common.h +++ b/src/liblsquic/lsquic_packet_common.h @@ -2,52 +2,64 @@ #ifndef LSQUIC_PACKET_COMMON_H #define LSQUIC_PACKET_COMMON_H 1 -#include - -#include "lsquic_int_types.h" - -enum PACKET_PUBLIC_FLAGS -{ - PACKET_PUBLIC_FLAGS_VERSION = 1, - PACKET_PUBLIC_FLAGS_RST = 2, - PACKET_PUBLIC_FLAGS_NONCE = 4, - PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID = 8, - PACKET_PUBLIC_FLAGS_MULTIPATH = 1 << 6, - PACKET_PUBLIC_FLAGS_TWO_OR_MORE_BYTES = 1 << 7, -}; - +/* The list of frames contains frames both in GQUIC and in IETF QUIC. + * They are marked as follows: + * G Applicable to GQUIC only + * I Applicable to IETF QUIC only + * B Applicable to both GQUIC and IETF QUIC. + */ enum quic_frame_type { QUIC_FRAME_INVALID, - - /*Special*/ - QUIC_FRAME_STREAM, - QUIC_FRAME_ACK, - - /*Regular*/ - QUIC_FRAME_PADDING, - QUIC_FRAME_RST_STREAM, - QUIC_FRAME_CONNECTION_CLOSE, - QUIC_FRAME_GOAWAY, - QUIC_FRAME_WINDOW_UPDATE, - QUIC_FRAME_BLOCKED, - QUIC_FRAME_STOP_WAITING, - QUIC_FRAME_PING, + QUIC_FRAME_STREAM, /* B */ + QUIC_FRAME_ACK, /* B */ + QUIC_FRAME_PADDING, /* B */ + QUIC_FRAME_RST_STREAM, /* B */ + QUIC_FRAME_CONNECTION_CLOSE, /* B */ + QUIC_FRAME_GOAWAY, /* G */ + QUIC_FRAME_WINDOW_UPDATE, /* G */ + QUIC_FRAME_BLOCKED, /* B */ + QUIC_FRAME_STOP_WAITING, /* G */ + QUIC_FRAME_PING, /* B */ + QUIC_FRAME_MAX_DATA, /* I */ + QUIC_FRAME_MAX_STREAM_DATA, /* I */ + QUIC_FRAME_MAX_STREAMS, /* I */ + QUIC_FRAME_STREAM_BLOCKED, /* I */ + QUIC_FRAME_STREAMS_BLOCKED, /* I */ + QUIC_FRAME_NEW_CONNECTION_ID, /* I */ + QUIC_FRAME_STOP_SENDING, /* I */ + QUIC_FRAME_PATH_CHALLENGE, /* I */ + QUIC_FRAME_PATH_RESPONSE, /* I */ + QUIC_FRAME_CRYPTO, /* I */ + QUIC_FRAME_RETIRE_CONNECTION_ID,/* I */ + QUIC_FRAME_NEW_TOKEN, /* I */ N_QUIC_FRAMES }; enum quic_ft_bit { - QUIC_FTBIT_INVALID = 1 << QUIC_FRAME_INVALID, - QUIC_FTBIT_STREAM = 1 << QUIC_FRAME_STREAM, - QUIC_FTBIT_ACK = 1 << QUIC_FRAME_ACK, - QUIC_FTBIT_PADDING = 1 << QUIC_FRAME_PADDING, - QUIC_FTBIT_RST_STREAM = 1 << QUIC_FRAME_RST_STREAM, - QUIC_FTBIT_CONNECTION_CLOSE = 1 << QUIC_FRAME_CONNECTION_CLOSE, - QUIC_FTBIT_GOAWAY = 1 << QUIC_FRAME_GOAWAY, - QUIC_FTBIT_WINDOW_UPDATE = 1 << QUIC_FRAME_WINDOW_UPDATE, - QUIC_FTBIT_BLOCKED = 1 << QUIC_FRAME_BLOCKED, - QUIC_FTBIT_STOP_WAITING = 1 << QUIC_FRAME_STOP_WAITING, - QUIC_FTBIT_PING = 1 << QUIC_FRAME_PING, + QUIC_FTBIT_INVALID = 1 << QUIC_FRAME_INVALID, + QUIC_FTBIT_STREAM = 1 << QUIC_FRAME_STREAM, + QUIC_FTBIT_ACK = 1 << QUIC_FRAME_ACK, + QUIC_FTBIT_PADDING = 1 << QUIC_FRAME_PADDING, + QUIC_FTBIT_RST_STREAM = 1 << QUIC_FRAME_RST_STREAM, + QUIC_FTBIT_CONNECTION_CLOSE = 1 << QUIC_FRAME_CONNECTION_CLOSE, + QUIC_FTBIT_GOAWAY = 1 << QUIC_FRAME_GOAWAY, + QUIC_FTBIT_WINDOW_UPDATE = 1 << QUIC_FRAME_WINDOW_UPDATE, + QUIC_FTBIT_BLOCKED = 1 << QUIC_FRAME_BLOCKED, + QUIC_FTBIT_STOP_WAITING = 1 << QUIC_FRAME_STOP_WAITING, + QUIC_FTBIT_PING = 1 << QUIC_FRAME_PING, + QUIC_FTBIT_MAX_DATA = 1 << QUIC_FRAME_MAX_DATA, + QUIC_FTBIT_MAX_STREAM_DATA = 1 << QUIC_FRAME_MAX_STREAM_DATA, + QUIC_FTBIT_MAX_STREAMS = 1 << QUIC_FRAME_MAX_STREAMS, + QUIC_FTBIT_STREAM_BLOCKED = 1 << QUIC_FRAME_STREAM_BLOCKED, + QUIC_FTBIT_STREAMS_BLOCKED = 1 << QUIC_FRAME_STREAMS_BLOCKED, + QUIC_FTBIT_NEW_CONNECTION_ID = 1 << QUIC_FRAME_NEW_CONNECTION_ID, + QUIC_FTBIT_STOP_SENDING = 1 << QUIC_FRAME_STOP_SENDING, + QUIC_FTBIT_PATH_CHALLENGE = 1 << QUIC_FRAME_PATH_CHALLENGE, + QUIC_FTBIT_PATH_RESPONSE = 1 << QUIC_FRAME_PATH_RESPONSE, + QUIC_FTBIT_CRYPTO = 1 << QUIC_FRAME_CRYPTO, + QUIC_FTBIT_NEW_TOKEN = 1 << QUIC_FRAME_NEW_TOKEN, + QUIC_FTBIT_RETIRE_CONNECTION_ID = 1 << QUIC_FRAME_RETIRE_CONNECTION_ID, }; static const char * const frame_type_2_str[N_QUIC_FRAMES] = { @@ -62,6 +74,18 @@ static const char * const frame_type_2_str[N_QUIC_FRAMES] = { [QUIC_FRAME_BLOCKED] = "QUIC_FRAME_BLOCKED", [QUIC_FRAME_STOP_WAITING] = "QUIC_FRAME_STOP_WAITING", [QUIC_FRAME_PING] = "QUIC_FRAME_PING", + [QUIC_FRAME_MAX_DATA] = "QUIC_FRAME_MAX_DATA", + [QUIC_FRAME_MAX_STREAM_DATA] = "QUIC_FRAME_MAX_STREAM_DATA", + [QUIC_FRAME_MAX_STREAMS] = "QUIC_FRAME_MAX_STREAMS", + [QUIC_FRAME_STREAM_BLOCKED] = "QUIC_FRAME_STREAM_BLOCKED", + [QUIC_FRAME_STREAMS_BLOCKED] = "QUIC_FRAME_STREAMS_BLOCKED", + [QUIC_FRAME_NEW_CONNECTION_ID] = "QUIC_FRAME_NEW_CONNECTION_ID", + [QUIC_FRAME_STOP_SENDING] = "QUIC_FRAME_STOP_SENDING", + [QUIC_FRAME_PATH_CHALLENGE] = "QUIC_FRAME_PATH_CHALLENGE", + [QUIC_FRAME_PATH_RESPONSE] = "QUIC_FRAME_PATH_RESPONSE", + [QUIC_FRAME_CRYPTO] = "QUIC_FRAME_CRYPTO", + [QUIC_FRAME_NEW_TOKEN] = "QUIC_FRAME_NEW_TOKEN", + [QUIC_FRAME_RETIRE_CONNECTION_ID] = "QUIC_FRAME_RETIRE_CONNECTION_ID", }; #define QUIC_FRAME_PRELEN (sizeof("QUIC_FRAME_")) @@ -73,92 +97,35 @@ static const char * const frame_type_2_str[N_QUIC_FRAMES] = { * never a part of any frame list bitmask (e.g. po_frame_types). */ #define lsquic_frame_types_str_sz \ - QUIC_FRAME_SLEN(QUIC_FRAME_STREAM) + 1 + \ - QUIC_FRAME_SLEN(QUIC_FRAME_ACK) + 1 + \ - QUIC_FRAME_SLEN(QUIC_FRAME_PADDING) + 1 + \ - QUIC_FRAME_SLEN(QUIC_FRAME_RST_STREAM) + 1 + \ - QUIC_FRAME_SLEN(QUIC_FRAME_CONNECTION_CLOSE) + 1 + \ - QUIC_FRAME_SLEN(QUIC_FRAME_GOAWAY) + 1 + \ - QUIC_FRAME_SLEN(QUIC_FRAME_WINDOW_UPDATE) + 1 + \ - QUIC_FRAME_SLEN(QUIC_FRAME_BLOCKED) + 1 + \ - QUIC_FRAME_SLEN(QUIC_FRAME_STOP_WAITING) + 1 + \ - QUIC_FRAME_SLEN(QUIC_FRAME_PING) + 1 - + QUIC_FRAME_SLEN(QUIC_FRAME_STREAM) + 1 + \ + QUIC_FRAME_SLEN(QUIC_FRAME_ACK) + 1 + \ + QUIC_FRAME_SLEN(QUIC_FRAME_PADDING) + 1 + \ + QUIC_FRAME_SLEN(QUIC_FRAME_RST_STREAM) + 1 + \ + QUIC_FRAME_SLEN(QUIC_FRAME_CONNECTION_CLOSE) + 1 + \ + QUIC_FRAME_SLEN(QUIC_FRAME_GOAWAY) + 1 + \ + QUIC_FRAME_SLEN(QUIC_FRAME_WINDOW_UPDATE) + 1 + \ + QUIC_FRAME_SLEN(QUIC_FRAME_BLOCKED) + 1 + \ + QUIC_FRAME_SLEN(QUIC_FRAME_STOP_WAITING) + 1 + \ + QUIC_FRAME_SLEN(QUIC_FRAME_PING) + 1 + \ + QUIC_FRAME_SLEN(QUIC_FRAME_MAX_DATA) + 1 + \ + QUIC_FRAME_SLEN(QUIC_FRAME_MAX_STREAM_DATA) + 1 + \ + QUIC_FRAME_SLEN(QUIC_FRAME_MAX_STREAMS) + 1 + \ + QUIC_FRAME_SLEN(QUIC_FRAME_STREAM_BLOCKED) + 1 + \ + QUIC_FRAME_SLEN(QUIC_FRAME_STREAMS_BLOCKED) + 1 + \ + QUIC_FRAME_SLEN(QUIC_FRAME_NEW_CONNECTION_ID) + 1 + \ + QUIC_FRAME_SLEN(QUIC_FRAME_STOP_SENDING) + 1 + \ + QUIC_FRAME_SLEN(QUIC_FRAME_PATH_CHALLENGE) + 1 + \ + QUIC_FRAME_SLEN(QUIC_FRAME_PATH_RESPONSE) + 1 + \ + QUIC_FRAME_SLEN(QUIC_FRAME_CRYPTO) + 1 + \ + QUIC_FRAME_SLEN(QUIC_FRAME_RETIRE_CONNECTION_ID) \ + + 1 + \ + QUIC_FRAME_SLEN(QUIC_FRAME_NEW_TOKEN) + 1 + \ + 0 const char * lsquic_frame_types_to_str (char *buf, size_t bufsz, enum quic_ft_bit); -#define QFRAME_REGEN_MASK ((1 << QUIC_FRAME_ACK) \ - | (1 << QUIC_FRAME_STOP_WAITING)) - -#define QFRAME_REGENERATE(frame_type) ((1 << (frame_type)) & QFRAME_REGEN_MASK) - -#define QFRAME_ACKABLE_MASK ( \ - (1 << QUIC_FRAME_STREAM) \ - | (1 << QUIC_FRAME_RST_STREAM) \ - | (1 << QUIC_FRAME_GOAWAY) \ - | (1 << QUIC_FRAME_WINDOW_UPDATE) \ - | (1 << QUIC_FRAME_PING) \ - | (1 << QUIC_FRAME_BLOCKED) \ -) - -#define QFRAME_ACKABLE(frame_type) ((1 << (frame_type)) & QFRAME_ACKABLE_MASK) - -#define QFRAME_RETRANSMITTABLE_MASK ( \ - (1 << QUIC_FRAME_STREAM) \ - | (1 << QUIC_FRAME_RST_STREAM) \ - | (1 << QUIC_FRAME_GOAWAY) \ - | (1 << QUIC_FRAME_WINDOW_UPDATE) \ - | (1 << QUIC_FRAME_BLOCKED) \ - | (1 << QUIC_FRAME_CONNECTION_CLOSE) \ -) - -#define QFRAME_RETRANSMITTABLE(frame_type) \ - ((1 << (frame_type)) & QFRAME_RETRANSMITTABLE_MASK) - -#define GQUIC_MAX_PUBHDR_SZ (1 /* Type */ + 8 /* CID */ + 4 /* Version */ \ - + 32 /* Nonce */ + 6 /* Packet Number */ ) - -#define GQUIC_MIN_PUBHDR_SZ (1 /* Type */ + 1 /* Packet number */) - -#define GQUIC_IETF_LONG_HEADER_SIZE (1 /* Type */ + 4 /* Version */ \ - + 1 /* DCIL/SCIL */ + 8 /* CID */ + 4 /* Packet number */) - -/* XXX Nonce? */ -#define IQUIC_MAX_PUBHDR_SZ GQUIC_IETF_LONG_HEADER_SIZE - -#define IQUIC_MIN_PUBHDR_SZ (1 /* Type */ + 8 /* CID */ \ - + 1 /* Packet number */) - -#define QUIC_MAX_PUBHDR_SZ (GQUIC_MAX_PUBHDR_SZ > IQUIC_MAX_PUBHDR_SZ \ - ? GQUIC_MAX_PUBHDR_SZ : IQUIC_MAX_PUBHDR_SZ) - -#define QUIC_MIN_PUBHDR_SZ (GQUIC_MIN_PUBHDR_SZ < IQUIC_MIN_PUBHDR_SZ \ - ? GQUIC_MIN_PUBHDR_SZ : IQUIC_MIN_PUBHDR_SZ) - -/* 12 bytes of FNV hash or encryption IV */ -#define QUIC_PACKET_HASH_SZ 12 - -/* [draft-hamilton-quic-transport-protocol-01], Section 7 */ -#define QUIC_MAX_IPv4_PACKET_SZ 1370 -#define QUIC_MAX_IPv6_PACKET_SZ 1350 - -#define QUIC_MAX_PACKET_SZ (QUIC_MAX_IPv4_PACKET_SZ > \ - QUIC_MAX_IPv6_PACKET_SZ ? QUIC_MAX_IPv4_PACKET_SZ : QUIC_MAX_IPv6_PACKET_SZ) - -#define QUIC_MIN_PACKET_OVERHEAD (QUIC_PACKET_HASH_SZ + QUIC_MIN_PUBHDR_SZ) - -#define QUIC_MAX_PAYLOAD_SZ (QUIC_MAX_PACKET_SZ - QUIC_MIN_PACKET_OVERHEAD) - -#define QUIC_WUF_SZ 13 /* Type (1) + Stream ID (4) + Offset (8) */ -#define QUIC_BLOCKED_FRAME_SZ 5 /* Type (1) + Stream ID (4) */ -#define QUIC_RST_STREAM_SZ 17 /* Type (1) + Stream ID (4) + Offset (8) + - Error code (4) */ -#define QUIC_GOAWAY_FRAME_SZ 11 /* Type (1) + Error code (4) + Stream ID (4) + - Reason phrase length (2) */ - - /* This value represents a different number of bytes used to encode the packet * length based on whether GQUIC or IQUIC is used. */ @@ -203,15 +170,58 @@ enum header_type extern const char *const lsquic_hety2str[]; -enum packno_bits -calc_packno_bits (lsquic_packno_t packno, lsquic_packno_t least_unacked, - uint64_t n_in_flight); +#define IQUIC_MAX_PACKNO ((1ULL << 62) - 1) +#define IQUIC_INVALID_PACKNO (IQUIC_MAX_PACKNO + 1) + +/* IETF QUIC only: */ +#define is_valid_packno(packno) ((packno) <= IQUIC_MAX_PACKNO) -#define gquic_packno_bits2len(b) (((b) << 1) + !(b)) +enum packnum_space +{ + PNS_INIT, + PNS_HSK, + PNS_APP, + N_PNS +}; + +extern const enum packnum_space lsquic_hety2pns[]; +extern const enum packnum_space lsquic_enclev2pns[]; +extern const char *const lsquic_pns2str[]; + +#define ALL_IQUIC_FRAMES ( \ + QUIC_FTBIT_STREAM \ + | QUIC_FTBIT_ACK \ + | QUIC_FTBIT_PADDING \ + | QUIC_FTBIT_RST_STREAM \ + | QUIC_FTBIT_CONNECTION_CLOSE \ + | QUIC_FTBIT_BLOCKED \ + | QUIC_FTBIT_PING \ + | QUIC_FTBIT_MAX_DATA \ + | QUIC_FTBIT_MAX_STREAM_DATA \ + | QUIC_FTBIT_MAX_STREAMS \ + | QUIC_FTBIT_STREAM_BLOCKED \ + | QUIC_FTBIT_STREAMS_BLOCKED \ + | QUIC_FTBIT_NEW_CONNECTION_ID \ + | QUIC_FTBIT_STOP_SENDING \ + | QUIC_FTBIT_PATH_CHALLENGE \ + | QUIC_FTBIT_PATH_RESPONSE \ + | QUIC_FTBIT_RETIRE_CONNECTION_ID \ + | QUIC_FTBIT_NEW_TOKEN \ + | QUIC_FTBIT_CRYPTO ) + +/* [draft-ietf-quic-transport-20] Section 13.1.1 */ +#define IQUIC_FRAME_ACKABLE_MASK ( \ + ALL_IQUIC_FRAMES & ~(QUIC_FTBIT_ACK|QUIC_FTBIT_PADDING)) + +/* [draft-ietf-quic-transport-20], Section 13.2 */ +/* We bend some rules and retransmit BLOCKED, MAX_DATA, MAX_STREAM_DATA, + * MAX_STREAMS, STREAM_BLOCKED, and STREAMS_BLOCKED frames instead of + * regenerating them. This keeps the code simple(r). + */ +#define IQUIC_FRAME_RETX_MASK ( \ + ALL_IQUIC_FRAMES & ~(QUIC_FTBIT_PADDING|QUIC_FTBIT_PATH_RESPONSE \ + |QUIC_FTBIT_PATH_CHALLENGE|QUIC_FTBIT_ACK)) -lsquic_packno_t -restore_packno (lsquic_packno_t cur_packno, - unsigned packet_len, - lsquic_packno_t max_packno); +extern const enum quic_ft_bit lsquic_legal_frames_by_level[]; #endif diff --git a/src/liblsquic/lsquic_packet_gquic.c b/src/liblsquic/lsquic_packet_gquic.c new file mode 100644 index 000000000..4e2025d91 --- /dev/null +++ b/src/liblsquic/lsquic_packet_gquic.c @@ -0,0 +1,33 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#include +#include + +#include "lsquic_packet_common.h" +#include "lsquic_packet_gquic.h" + + + +lsquic_packno_t +restore_packno (lsquic_packno_t cur_packno, + unsigned len, + lsquic_packno_t max_packno) +{ + lsquic_packno_t candidates[3], epoch_delta; + int64_t diffs[3]; + unsigned min; + + epoch_delta = 1ULL << (len << 3); + candidates[1] = (max_packno & ~(epoch_delta - 1)) + cur_packno; + candidates[0] = candidates[1] - epoch_delta; + candidates[2] = candidates[1] + epoch_delta; + + diffs[0] = llabs((int64_t) candidates[0] - (int64_t) max_packno); + diffs[1] = llabs((int64_t) candidates[1] - (int64_t) max_packno); + diffs[2] = llabs((int64_t) candidates[2] - (int64_t) max_packno); + + min = diffs[1] < diffs[0]; + if (diffs[2] < diffs[min]) + min = 2; + + return candidates[min]; +} diff --git a/src/liblsquic/lsquic_packet_gquic.h b/src/liblsquic/lsquic_packet_gquic.h new file mode 100644 index 000000000..c85e44cdb --- /dev/null +++ b/src/liblsquic/lsquic_packet_gquic.h @@ -0,0 +1,99 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#ifndef LSQUIC_PACKET_GQUIC_H +#define LSQUIC_PACKET_GQUIC_H 1 + +#include + +#include "lsquic_int_types.h" + +enum PACKET_PUBLIC_FLAGS +{ + PACKET_PUBLIC_FLAGS_VERSION = 1, + PACKET_PUBLIC_FLAGS_RST = 2, + PACKET_PUBLIC_FLAGS_NONCE = 4, + PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID = 8, + PACKET_PUBLIC_FLAGS_MULTIPATH = 1 << 6, + PACKET_PUBLIC_FLAGS_TWO_OR_MORE_BYTES = 1 << 7, +}; + +#define GQUIC_FRAME_REGEN_MASK ((1 << QUIC_FRAME_ACK) \ + | (1 << QUIC_FRAME_PATH_CHALLENGE) | (1 << QUIC_FRAME_PATH_RESPONSE) \ + | (1 << QUIC_FRAME_STOP_WAITING)) + +#define GQUIC_FRAME_REGENERATE(frame_type) ((1 << (frame_type)) & GQUIC_FRAME_REGEN_MASK) + +#define GQUIC_FRAME_ACKABLE_MASK ( \ + (1 << QUIC_FRAME_STREAM) \ + | (1 << QUIC_FRAME_RST_STREAM) \ + | (1 << QUIC_FRAME_GOAWAY) \ + | (1 << QUIC_FRAME_WINDOW_UPDATE) \ + | (1 << QUIC_FRAME_PING) \ + | (1 << QUIC_FRAME_BLOCKED) \ + | (1 << QUIC_FRAME_CRYPTO) \ +) + +#define GQUIC_FRAME_ACKABLE(frame_type) ((1 << (frame_type)) & GQUIC_FRAME_ACKABLE_MASK) + +#define GQUIC_FRAME_RETRANSMITTABLE_MASK ( \ + (1 << QUIC_FRAME_STREAM) \ + | (1 << QUIC_FRAME_RST_STREAM) \ + | (1 << QUIC_FRAME_GOAWAY) \ + | (1 << QUIC_FRAME_WINDOW_UPDATE) \ + | (1 << QUIC_FRAME_BLOCKED) \ + | (1 << QUIC_FRAME_CONNECTION_CLOSE) \ + | (1 << QUIC_FRAME_CRYPTO) \ + | (1 << QUIC_FRAME_PING) \ +) + +#define GQUIC_FRAME_RETRANSMITTABLE(frame_type) \ + ((1 << (frame_type)) & GQUIC_FRAME_RETRANSMITTABLE_MASK) + +#define GQUIC_MAX_PUBHDR_SZ (1 /* Type */ + 8 /* CID */ + 4 /* Version */ \ + + 32 /* Nonce */ + 6 /* Packet Number */ ) + +#define GQUIC_MIN_PUBHDR_SZ (1 /* Type */ + 1 /* Packet number */) + +#define GQUIC_IETF_LONG_HEADER_SIZE (1 /* Type */ + 4 /* Version */ \ + + 1 /* DCIL/SCIL */ + 8 /* CID */ + 4 /* Packet number */) + +/* XXX Nonce? */ +#define IQUIC_MAX_PUBHDR_SZ GQUIC_IETF_LONG_HEADER_SIZE + +#define IQUIC_MIN_PUBHDR_SZ (1 /* Type */ + 8 /* CID */ \ + + 1 /* Packet number */) + +#define QUIC_MAX_PUBHDR_SZ (GQUIC_MAX_PUBHDR_SZ > IQUIC_MAX_PUBHDR_SZ \ + ? GQUIC_MAX_PUBHDR_SZ : IQUIC_MAX_PUBHDR_SZ) + +#define QUIC_MIN_PUBHDR_SZ (GQUIC_MIN_PUBHDR_SZ < IQUIC_MIN_PUBHDR_SZ \ + ? GQUIC_MIN_PUBHDR_SZ : IQUIC_MIN_PUBHDR_SZ) + +/* 12 bytes of FNV hash or encryption IV */ +#define GQUIC_PACKET_HASH_SZ 12 + +/* [draft-hamilton-quic-transport-protocol-01], Section 7 */ +#define GQUIC_MAX_IPv4_PACKET_SZ 1370 +#define GQUIC_MAX_IPv6_PACKET_SZ 1350 + +#define GQUIC_MAX_PACKET_SZ (GQUIC_MAX_IPv4_PACKET_SZ > \ + GQUIC_MAX_IPv6_PACKET_SZ ? GQUIC_MAX_IPv4_PACKET_SZ : GQUIC_MAX_IPv6_PACKET_SZ) + +#define GQUIC_MIN_PACKET_OVERHEAD (GQUIC_PACKET_HASH_SZ + GQUIC_MIN_PUBHDR_SZ) + +#define GQUIC_MAX_PAYLOAD_SZ (GQUIC_MAX_PACKET_SZ - GQUIC_MIN_PACKET_OVERHEAD) + +#define GQUIC_WUF_SZ 13 /* Type (1) + Stream ID (4) + Offset (8) */ +#define GQUIC_BLOCKED_FRAME_SZ 5 /* Type (1) + Stream ID (4) */ +#define GQUIC_RST_STREAM_SZ 17 /* Type (1) + Stream ID (4) + Offset (8) + + Error code (4) */ +#define GQUIC_GOAWAY_FRAME_SZ 11 /* Type (1) + Error code (4) + Stream ID (4) + + Reason phrase length (2) */ + +#define gquic_packno_bits2len(b) (((b) << 1) + !(b)) + +lsquic_packno_t +restore_packno (lsquic_packno_t cur_packno, + unsigned packet_len, + lsquic_packno_t max_packno); + +#endif diff --git a/src/liblsquic/lsquic_packet_ietf.h b/src/liblsquic/lsquic_packet_ietf.h new file mode 100644 index 000000000..42142503f --- /dev/null +++ b/src/liblsquic/lsquic_packet_ietf.h @@ -0,0 +1,23 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#ifndef LSQUIC_PACKET_IETF_H +#define LSQUIC_PACKET_IETF_H 1 + +#define IQUIC_MAX_IPv4_PACKET_SZ 1252 +#define IQUIC_MAX_IPv6_PACKET_SZ 1232 + +#define iquic_packno_bits2len(b) ((b) + 1) + +/* [draft-ietf-quic-transport-22] Section 7.2: + " + When an Initial packet is sent by a client that has not previously + received an Initial or Retry packet from the server, it populates the + Destination Connection ID field with an unpredictable value. This + MUST be at least 8 bytes in length. + " + * Because the server always generates 8-byte CIDs, the DCID length cannot be + * smaller than 8 even if the client received an Initial or Retry packet from + * us. + */ +#define MIN_INITIAL_DCID_LEN 8 + +#endif diff --git a/src/liblsquic/lsquic_packet_in.c b/src/liblsquic/lsquic_packet_in.c index 47401847c..9165f4bdc 100644 --- a/src/liblsquic/lsquic_packet_in.c +++ b/src/liblsquic/lsquic_packet_in.c @@ -52,3 +52,12 @@ lsquic_packet_in_mem_used (const struct lsquic_packet_in *packet_in) return size; } + + +void +lsquic_scid_from_packet_in (const struct lsquic_packet_in *packet_in, + lsquic_cid_t *scid) +{ + scid->len = packet_in->pi_scid_len; + memcpy(scid->idbuf, packet_in->pi_data + packet_in->pi_scid_off, scid->len); +} diff --git a/src/liblsquic/lsquic_packet_in.h b/src/liblsquic/lsquic_packet_in.h index 196c66fdf..3562719f4 100644 --- a/src/liblsquic/lsquic_packet_in.h +++ b/src/liblsquic/lsquic_packet_in.h @@ -6,7 +6,10 @@ #ifndef LSQUIC_PACKET_IN_H #define LSQUIC_PACKET_IN_H 1 + struct lsquic_packet_in; +struct lsquic_cid; + struct data_frame { @@ -17,6 +20,7 @@ struct data_frame signed char df_fin; /* FIN? */ }; + typedef struct stream_frame { /* Stream frames are stored in a list inside stream. */ @@ -31,47 +35,74 @@ typedef struct stream_frame struct data_frame data_frame; - uint32_t stream_id; /* Parsed from packet */ + lsquic_stream_id_t stream_id; /* Parsed from packet */ } stream_frame_t; + +#define DF_OFF(frame) (frame)->data_frame.df_offset +#define DF_ROFF(frame) (DF_OFF(frame) + (frame)->data_frame.df_read_off) +#define DF_FIN(frame) (frame)->data_frame.df_fin +#define DF_SIZE(frame) (frame)->data_frame.df_size +#define DF_END(frame) (DF_OFF(frame) + DF_SIZE(frame)) + + typedef struct lsquic_packet_in { TAILQ_ENTRY(lsquic_packet_in) pi_next; lsquic_time_t pi_received; /* Time received */ - lsquic_cid_t pi_conn_id; + lsquic_cid_t pi_dcid; +#define pi_conn_id pi_dcid lsquic_packno_t pi_packno; + enum quic_ft_bit pi_frame_types; unsigned short pi_header_sz; /* Points to payload */ unsigned short pi_data_sz; /* Data plus header */ /* A packet may be referred to by one or more frames and packets_in * list. */ unsigned short pi_refcnt; - enum quic_ft_bit pi_frame_types:16; unsigned short pi_hsk_stream; /* Offset to handshake stream * frame, only valid if * PI_HSK_STREAM is set. */ - unsigned char pi_quic_ver; /* Offset to QUIC version */ - unsigned char pi_nonce; /* Offset to nonce */ enum { PI_DECRYPTED = (1 << 0), PI_OWN_DATA = (1 << 1), /* We own pi_data */ PI_CONN_ID = (1 << 2), /* pi_conn_id is set */ + PI_HSK_STREAM = (1 << 3), /* Has handshake data (mini only) */ + PI_FROM_MINI = (1 << 4), /* Handed off by mini connection */ #define PIBIT_ENC_LEV_SHIFT 5 PI_ENC_LEV_BIT_0= (1 << 5), /* Encodes encryption level */ PI_ENC_LEV_BIT_1= (1 << 6), /* (see enum enc_level). */ PI_GQUIC = (1 << 7), -#define PIBIT_BITS_SHIFT 8 - PI_BITS_BIT_0 = (1 << 8), - PI_BITS_BIT_1 = (1 << 9), + PI_UNUSED_8 = (1 << 8), /* <-- hole, reuse me! */ +#define PIBIT_ECN_SHIFT 9 + PI_ECN_BIT_0 = (1 << 9), + PI_ECN_BIT_1 = (1 <<10), +#define PIBIT_SPIN_SHIFT 11 + PI_SPIN_BIT = (1 <<11), +#define PIBIT_BITS_SHIFT 12 + PI_BITS_BIT_0 = (1 <<12), + PI_BITS_BIT_1 = (1 <<13), } pi_flags:16; + /* pi_token and pi_token_size are set in Initial and Retry packets */ + unsigned short pi_token_size; /* Size of the token */ + unsigned char pi_token; /* Offset to token */ + /* pi_odcid and pi_odcid_len are only set in Retry packets */ + unsigned char pi_odcid; /* Offset to Original DCID */ + unsigned char pi_odcid_len; /* Size of ODCID */ + unsigned char pi_scid_off; /* Offset to SCID */ + unsigned char pi_scid_len; /* Size of SCID */ + unsigned char pi_quic_ver; /* Offset to QUIC version */ + unsigned char pi_nonce; /* Offset to nonce */ enum header_type pi_header_type:8; + unsigned char pi_path_id; /* If PI_OWN_DATA flag is not set, `pi_data' points to user-supplied * packet data, which is NOT TO BE MODIFIED. */ unsigned char *pi_data; } lsquic_packet_in_t; + #define lsquic_packet_in_public_flags(p) ((p)->pi_data[0]) #define lsquic_packet_in_is_gquic_prst(p) \ @@ -96,6 +127,23 @@ typedef struct lsquic_packet_in #define lsquic_packet_in_enc_level(p) \ (((p)->pi_flags >> PIBIT_ENC_LEV_SHIFT) & 0x3) +#define lsquic_packet_in_ecn(p) \ + (((p)->pi_flags >> PIBIT_ECN_SHIFT) & 0x3) + +#define lsquic_packet_in_spin_bit(p) (((p)->pi_flags & PI_SPIN_BIT) > 0) + +/* PATH_CHALLENGE, PATH_RESPONSE, NEW_CONNECTION_ID, and PADDING frames + * are "probing frames", and all other frames are "non-probing frames". + * A packet containing only probing frames is a "probing packet", and a + * packet containing any other frame is a "non-probing packet". + * + * [draft-ietf-quic-transport-20], Section 9.1 + */ +#define lsquic_packet_in_non_probing(p) \ + (!!((p)->pi_frame_types & ~(QUIC_FTBIT_PATH_CHALLENGE \ + |QUIC_FTBIT_PATH_RESPONSE|QUIC_FTBIT_PADDING \ + |QUIC_FTBIT_NEW_CONNECTION_ID))) + /* The version iterator is used on a version negotiation packet only. * The iterator functions return 1 when next version is returned and * 0 when there are no more versions. @@ -116,4 +164,8 @@ packet_in_ver_next (struct ver_iter *, lsquic_ver_tag_t *ver_tag); size_t lsquic_packet_in_mem_used (const struct lsquic_packet_in *); +void +lsquic_scid_from_packet_in (const struct lsquic_packet_in *, + struct lsquic_cid *); + #endif diff --git a/src/liblsquic/lsquic_packet_out.c b/src/liblsquic/lsquic_packet_out.c index 74459ad1f..bd4e83e6f 100644 --- a/src/liblsquic/lsquic_packet_out.c +++ b/src/liblsquic/lsquic_packet_out.c @@ -15,14 +15,19 @@ #include "lsquic_mm.h" #include "lsquic_engine_public.h" #include "lsquic_packet_common.h" +#include "lsquic_packet_gquic.h" #include "lsquic_packet_in.h" #include "lsquic_packet_out.h" #include "lsquic_parse.h" #include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" #include "lsquic_stream.h" #include "lsquic_logger.h" #include "lsquic_ev_log.h" #include "lsquic_conn.h" +#include "lsquic_enc_sess.h" typedef char _stream_rec_arr_is_at_most_64bytes[ (sizeof(struct stream_rec_arr) <= 64)? 1: - 1]; @@ -184,11 +189,12 @@ lsquic_packet_out_add_stream (lsquic_packet_out_t *packet_out, lsquic_packet_out_t * lsquic_packet_out_new (struct lsquic_mm *mm, struct malo *malo, int use_cid, const struct lsquic_conn *lconn, enum packno_bits bits, - const lsquic_ver_tag_t *ver_tag, const unsigned char *nonce) + const lsquic_ver_tag_t *ver_tag, const unsigned char *nonce, + const struct network_path *path) { lsquic_packet_out_t *packet_out; enum packet_out_flags flags; - unsigned short header_size, max_size; + size_t header_size, tag_len, max_size; flags = bits << POBIT_SHIFT; if (ver_tag) @@ -197,34 +203,28 @@ lsquic_packet_out_new (struct lsquic_mm *mm, struct malo *malo, int use_cid, flags |= PO_NONCE; if (use_cid) flags |= PO_CONN_ID; - if ((1 << lconn->cn_version) & LSQUIC_GQUIC_HEADER_VERSIONS) - flags |= PO_GQUIC; - if ( - 0 == (lconn->cn_flags & LSCONN_HANDSHAKE_DONE) - ) - { + if ((lconn->cn_flags & (LSCONN_MINI|LSCONN_HANDSHAKE_DONE)) + != LSCONN_HANDSHAKE_DONE) flags |= PO_LONGHEAD; - if (lconn->cn_version == LSQVER_044) - { - flags &= ~(3 << POBIT_SHIFT); - flags |= GQUIC_PACKNO_LEN_4 << POBIT_SHIFT; - } - } - header_size = lsquic_po_header_length(lconn, flags); - max_size = lconn->cn_pack_size; - if (header_size + QUIC_PACKET_HASH_SZ >= max_size) + header_size = lconn->cn_pf->pf_packout_max_header_size(lconn, flags, + path->np_dcid.len); + tag_len = lconn->cn_esf_c->esf_tag_len; + max_size = path->np_pack_size; + if (header_size + tag_len >= max_size) { errno = EINVAL; return NULL; } packet_out = lsquic_mm_get_packet_out(mm, malo, max_size - header_size - - QUIC_PACKET_HASH_SZ); + - tag_len); if (!packet_out) return NULL; packet_out->po_flags = flags; + if ((1 << lconn->cn_version) & LSQUIC_GQUIC_HEADER_VERSIONS) + packet_out->po_lflags = POL_GQUIC; if (ver_tag) packet_out->po_ver_tag = *ver_tag; if (nonce) @@ -242,6 +242,7 @@ lsquic_packet_out_new (struct lsquic_mm *mm, struct malo *malo, int use_cid, } if (flags & PO_LONGHEAD) packet_out->po_header_type = HETY_HANDSHAKE; + packet_out->po_path = path; return packet_out; } @@ -266,6 +267,8 @@ lsquic_packet_out_destroy (lsquic_packet_out_t *packet_out, packet_out->po_enc_data, lsquic_packet_out_ipv6(packet_out)); if (packet_out->po_nonce) free(packet_out->po_nonce); + if (packet_out->po_bwp_state) + lsquic_malo_put(packet_out->po_bwp_state); lsquic_mm_put_packet_out(&enpub->enp_mm, packet_out); } @@ -275,7 +278,7 @@ lsquic_packet_out_destroy (lsquic_packet_out_t *packet_out, */ unsigned lsquic_packet_out_elide_reset_stream_frames (lsquic_packet_out_t *packet_out, - uint32_t stream_id) + lsquic_stream_id_t stream_id) { struct packet_out_srec_iter posi; struct stream_rec *srec; @@ -314,9 +317,8 @@ lsquic_packet_out_elide_reset_stream_frames (lsquic_packet_out_t *packet_out, packet_out->po_data_sz - srec->sr_off - srec->sr_len); packet_out->po_data_sz -= srec->sr_len; - /* See what we can do with the stream */ + lsquic_stream_acked(srec->sr_stream, srec->sr_frame_type); srec->sr_frame_type = 0; - lsquic_stream_acked(srec->sr_stream); } } } @@ -357,7 +359,7 @@ lsquic_packet_out_ack_streams (lsquic_packet_out_t *packet_out) struct packet_out_srec_iter posi; struct stream_rec *srec; for (srec = posi_first(&posi, packet_out); srec; srec = posi_next(&posi)) - lsquic_stream_acked(srec->sr_stream); + lsquic_stream_acked(srec->sr_stream, srec->sr_frame_type); } @@ -425,7 +427,7 @@ struct split_reader_ctx unsigned off; unsigned len; signed char fin; - unsigned char buf[QUIC_MAX_PAYLOAD_SZ / 2 + 1]; + unsigned char buf[GQUIC_MAX_PAYLOAD_SZ / 2 + 1]; }; @@ -557,8 +559,6 @@ verify_srecs (lsquic_packet_out_t *packet_out) assert(packet_out->po_data_sz == off); } - - #endif @@ -738,7 +738,8 @@ lsquic_packet_out_turn_on_fin (struct lsquic_packet_out *packet_out, if (last_offset == stream->tosend_off) { pf->pf_turn_on_fin(packet_out->po_data + srec->sr_off); - EV_LOG_UPDATED_STREAM_FRAME(lsquic_stream_cid(stream), + EV_LOG_UPDATED_STREAM_FRAME( + lsquic_conn_log_cid(lsquic_stream_conn(stream)), pf, packet_out->po_data + srec->sr_off, srec->sr_len); return 0; } diff --git a/src/liblsquic/lsquic_packet_out.h b/src/liblsquic/lsquic_packet_out.h index 46ff0de6f..e9b89a8ab 100644 --- a/src/liblsquic/lsquic_packet_out.h +++ b/src/liblsquic/lsquic_packet_out.h @@ -13,7 +13,9 @@ struct lsquic_conn; struct lsquic_engine_public; struct lsquic_mm; struct lsquic_stream; +struct network_path; struct parse_funcs; +struct bwp_state; /* Each stream_rec is associated with one packet_out. packet_out can have * zero or more stream_rec structures. stream_rec keeps a pointer to a stream @@ -54,6 +56,7 @@ struct stream_rec_arr { TAILQ_HEAD(stream_rec_arr_tailq, stream_rec_arr); + typedef struct lsquic_packet_out { /* `po_next' is used for packets_out, unacked_packets and expired_packets @@ -63,9 +66,22 @@ typedef struct lsquic_packet_out po_next; lsquic_time_t po_sent; /* Time sent */ lsquic_packno_t po_packno; + lsquic_packno_t po_ack2ed; /* If packet has ACK frame, value of + * largest acked in it. + */ + struct lsquic_packet_out + *po_loss_chain; /* Circular linked list */ + enum quic_ft_bit po_frame_types; /* Bitmask of QUIC_FRAME_* */ enum packet_out_flags { + /* TODO XXX Phase out PO_MINI in favor of a more specialized flag: + * we only need an indicator that a packet contains STREAM frames + * but no associated srecs. This type of packets in only created + * by GQUIC mini conn. + */ + PO_MINI = (1 << 0), /* Allocated by mini connection */ PO_HELLO = (1 << 1), /* Packet contains SHLO or CHLO data */ + PO_SENT = (1 << 2), /* Packet has been sent (mini only) */ PO_ENCRYPTED= (1 << 3), /* po_enc_data has encrypted data */ PO_SREC_ARR = (1 << 4), #define POBIT_SHIFT 5 @@ -83,18 +99,28 @@ typedef struct lsquic_packet_out */ PO_SCHED = (1 <<14), /* On scheduled queue */ PO_SENT_SZ = (1 <<15), - PO_LONGHEAD = (1 <<16), - PO_GQUIC = (1 <<17), /* Used for logging */ -#define POLEV_SHIFT 18 - PO_BITS_2 = (1 <<18), /* PO_BITS_2 and PO_BITS_3 encode the */ - PO_BITS_3 = (1 <<19), /* crypto level. Used for logging. */ + PO_LONGHEAD = (1 <<16), /* Only used for Q044 */ #define POIPv6_SHIFT 20 PO_IPv6 = (1 <<20), /* Set if pmi_allocate was passed is_ipv6=1, * otherwise unset. */ PO_LIMITED = (1 <<21), /* Used to credit sc_next_limit if needed. */ +#define POPNS_SHIFT 22 + PO_PNS_HSK = (1 <<22), /* PNS bits contain the value of the */ + PO_PNS_APP = (1 <<23), /* packet number space. */ + PO_RETRY = (1 <<24), /* Retry packet */ + PO_RETX = (1 <<25), /* Retransmitted packet: don't append to it */ + PO_UNUSED26 = (1 <<26), /* Unused */ + PO_LOSS_REC = (1 <<27), /* This structure is a loss record */ + /* Only one of PO_SCHED, PO_UNACKED, or PO_LOST can be set. If pressed + * for room in the enum, we can switch to using two bits to represent + * this information. + */ + PO_UNACKED = (1 <<28), /* On unacked queue */ + PO_LOST = (1 <<29), /* On lost queue */ +#define POSPIN_SHIFT 30 + PO_SPIN_BIT = (1 <<30), /* Value of the spin bit */ } po_flags; - enum quic_ft_bit po_frame_types:16; /* Bitmask of QUIC_FRAME_* */ unsigned short po_data_sz; /* Number of usable bytes in data */ unsigned short po_enc_data_sz; /* Number of usable bytes in data */ unsigned short po_sent_sz; /* If PO_SENT_SZ is set, real size of sent buffer. */ @@ -104,11 +130,21 @@ typedef struct lsquic_packet_out * frames. */ unsigned short po_n_alloc; /* Total number of bytes allocated in po_data */ + unsigned short po_token_len; enum header_type po_header_type:8; + unsigned char po_path_id; + enum { + POL_GQUIC = 1 << 0, /* Used for logging */ +#define POLEV_SHIFT 1 + POL_ELBIT_0 = 1 << 1, /* EL bits encode the crypto level. */ + POL_ELBIT_1 = 1 << 2, +#define POKP_SHIFT 3 + POL_KEY_PHASE= 1 << 3, /* Used for logging */ +#define POECN_SHIFT 4 + POL_ECNBIT_0 = 1 << 4, + POL_ECNBIT_1 = 1 << 5, + } po_lflags:8; unsigned char *po_data; - lsquic_packno_t po_ack2ed; /* If packet has ACK frame, value of - * largest acked in it. - */ /* A lot of packets contain data belonging to only one stream. Thus, * `one' is used first. If this is not enough, any number of @@ -127,8 +163,18 @@ typedef struct lsquic_packet_out lsquic_ver_tag_t po_ver_tag; /* Set if PO_VERSION is set */ unsigned char *po_nonce; /* Use to generate header if PO_NONCE is set */ + const struct network_path + *po_path; +#define po_token po_nonce + struct bwp_state *po_bwp_state; } lsquic_packet_out_t; +/* This is to make sure these bit names are not used, they are only for + * convenience in gdb output. + */ +#define PO_PNS_HSK +#define PO_PNS_APP + /* The size of lsquic_packet_out_t could be further reduced: * * po_ver_tag could be encoded as a few bits representing enum lsquic_version @@ -152,8 +198,17 @@ typedef struct lsquic_packet_out (p)->po_flags |= ((b) & 1) << POIPv6_SHIFT; \ } while (0) -#define lsquic_po_header_length(lconn, po_flags) ( \ - lconn->cn_pf->pf_packout_header_size(lconn, po_flags)) +#define lsquic_packet_out_spin_bit(p) (((p)->po_flags & PO_SPIN_BIT) > 0) + +#define lsquic_packet_out_set_spin_bit(p, b) do { \ + (p)->po_flags &= ~PO_SPIN_BIT; \ + (p)->po_flags |= ((b) & 1) << POSPIN_SHIFT; \ +} while (0) + +#define lsquic_packet_out_key_phase(p) 0 /* TODO */ + +#define lsquic_po_header_length(lconn, po_flags, dcid_len) ( \ + lconn->cn_pf->pf_packout_max_header_size(lconn, po_flags, dcid_len)) #define lsquic_packet_out_total_sz(lconn, p) (\ lconn->cn_pf->pf_packout_size(lconn, p)) @@ -176,17 +231,41 @@ typedef struct lsquic_packet_out #endif #define lsquic_packet_out_verneg(p) \ - (((p)->po_flags & (PO_NOENCRYPT|PO_VERNEG)) == (PO_NOENCRYPT|PO_VERNEG)) + (((p)->po_flags & (PO_NOENCRYPT|PO_VERNEG|PO_RETRY)) == (PO_NOENCRYPT|PO_VERNEG)) #define lsquic_packet_out_pubres(p) \ - (((p)->po_flags & (PO_NOENCRYPT|PO_VERNEG)) == PO_NOENCRYPT ) + (((p)->po_flags & (PO_NOENCRYPT|PO_VERNEG|PO_RETRY)) == PO_NOENCRYPT ) + +#define lsquic_packet_out_retry(p) \ + (((p)->po_flags & (PO_NOENCRYPT|PO_VERNEG|PO_RETRY)) == (PO_NOENCRYPT|PO_RETRY) ) #define lsquic_packet_out_set_enc_level(p, level) do { \ - (p)->po_flags &= ~(3 << POLEV_SHIFT); \ - (p)->po_flags |= level << POLEV_SHIFT; \ + (p)->po_lflags &= ~(3 << POLEV_SHIFT); \ + (p)->po_lflags |= level << POLEV_SHIFT; \ +} while (0) + +#define lsquic_packet_out_enc_level(p) (((p)->po_lflags >> POLEV_SHIFT) & 3) + +#define lsquic_packet_out_set_kp(p, kp) do { \ + (p)->po_lflags &= ~(1 << POKP_SHIFT); \ + (p)->po_lflags |= kp << POKP_SHIFT; \ +} while (0) + +#define lsquic_packet_out_kp(p) (((p)->po_lflags >> POKP_SHIFT) & 1) + +#define lsquic_packet_out_set_pns(p, pns) do { \ + (p)->po_flags &= ~(3 << POPNS_SHIFT); \ + (p)->po_flags |= pns << POPNS_SHIFT; \ +} while (0) + +#define lsquic_packet_out_pns(p) (((p)->po_flags >> POPNS_SHIFT) & 3) + +#define lsquic_packet_out_set_ecn(p, ecn) do { \ + (p)->po_lflags &= ~(3 << POECN_SHIFT); \ + (p)->po_lflags |= ecn << POECN_SHIFT; \ } while (0) -#define lsquic_packet_out_enc_level(p) (((p)->po_flags >> POLEV_SHIFT) & 3) +#define lsquic_packet_out_ecn(p) (((p)->po_lflags >> POECN_SHIFT) & 3) struct packet_out_srec_iter { lsquic_packet_out_t *packet_out; @@ -195,6 +274,7 @@ struct packet_out_srec_iter { int impl_idx; }; + struct stream_rec * posi_first (struct packet_out_srec_iter *posi, lsquic_packet_out_t *); @@ -204,7 +284,8 @@ posi_next (struct packet_out_srec_iter *posi); lsquic_packet_out_t * lsquic_packet_out_new (struct lsquic_mm *, struct malo *, int use_cid, const struct lsquic_conn *, enum packno_bits, - const lsquic_ver_tag_t *, const unsigned char *nonce); + const lsquic_ver_tag_t *, const unsigned char *nonce, + const struct network_path *); void lsquic_packet_out_destroy (lsquic_packet_out_t *, @@ -218,7 +299,8 @@ lsquic_packet_out_add_stream (lsquic_packet_out_t *packet_out, unsigned short off, unsigned short len); unsigned -lsquic_packet_out_elide_reset_stream_frames (lsquic_packet_out_t *, uint32_t); +lsquic_packet_out_elide_reset_stream_frames (lsquic_packet_out_t *, + lsquic_stream_id_t); int lsquic_packet_out_split_in_two (struct lsquic_mm *, lsquic_packet_out_t *, diff --git a/src/liblsquic/lsquic_parse.h b/src/liblsquic/lsquic_parse.h index 96b521be7..4baf3cbc4 100644 --- a/src/liblsquic/lsquic_parse.h +++ b/src/liblsquic/lsquic_parse.h @@ -5,21 +5,34 @@ #include #include "lsquic_packet_common.h" +#include "lsquic_packet_gquic.h" +struct lsquic_conn; struct lsquic_packet_in; struct lsquic_packet_out; struct packin_parse_state; struct stream_frame; +struct lsquic_cid; enum packet_out_flags; +enum lsquic_version; +enum stream_dir; #define LSQUIC_PARSE_ACK_TIMESTAMPS 0 -typedef struct ack_info +struct ack_info { + enum packnum_space pns; + enum { + AI_ECN = 1 << 0, /* ecn_counts[1,2,3] contain ECN counts */ + AI_TRUNCATED = 1 << 1, /* There were more ranges to parse, but we + * ran out of elements in `ranges'. + */ + } flags; unsigned n_timestamps; /* 0 to 255 */ unsigned n_ranges; /* This is at least 1 */ /* Largest acked is ack_info.ranges[0].high */ lsquic_time_t lack_delta; + uint64_t ecn_counts[4]; struct lsquic_packno_range ranges[256]; #if LSQUIC_PARSE_ACK_TIMESTAMPS struct { @@ -32,7 +45,8 @@ typedef struct ack_info uint64_t delta_usec; } timestamps[255]; #endif -} ack_info_t; +}; + struct short_ack_info { @@ -45,6 +59,14 @@ struct short_ack_info #define smallest_acked(acki) (+(acki)->ranges[(acki)->n_ranges - 1].low) +/* Chrome may send an empty ACK frame when it closes a connection. + * We do not know why it occurs -- perhaps a bug in Chrome. + */ +/* This macro cannot be used in IETF QUIC as zero is a valid packet number. + * Hopefully the Chrome bug will have been fixed by then. + */ +#define empty_ack_frame(acki) (largest_acked(acki) == 0) + /* gaf_: generate ACK frame */ struct lsquic_packno_range; typedef const struct lsquic_packno_range * @@ -57,10 +79,13 @@ typedef lsquic_time_t /* gsf_: generate stream frame */ typedef size_t (*gsf_read_f) (void *stream, void *buf, size_t len, int *fin); +/* gcf_: generate CRYPTO frame */ +typedef size_t (*gcf_read_f) (void *stream, void *buf, size_t len); + /* This structure contains functions that parse and generate packets and * frames in version-specific manner. To begin with, there is difference * between GQUIC's little-endian (Q038 and lower) and big-endian formats - * (Q039 and higher). Q044 and higher uses different format for packet headers. + * (Q039 and higher). Q046 and higher uses different format for packet headers. */ struct parse_funcs { @@ -81,19 +106,26 @@ struct parse_funcs */ int (*pf_gen_stream_frame) (unsigned char *buf, size_t bufsz, - uint32_t stream_id, uint64_t offset, + lsquic_stream_id_t stream_id, uint64_t offset, int fin, size_t size, gsf_read_f, void *stream); int (*pf_parse_stream_frame) (const unsigned char *buf, size_t rem_packet_sz, struct stream_frame *); int + (*pf_parse_crypto_frame) (const unsigned char *buf, size_t rem_packet_sz, + struct stream_frame *); + int + (*pf_gen_crypto_frame) (unsigned char *buf, size_t bufsz, uint64_t offset, + size_t size, gcf_read_f, void *stream); + int (*pf_parse_ack_frame) (const unsigned char *buf, size_t buf_len, - ack_info_t *ack_info); + struct ack_info *ack_info, uint8_t exp); int (*pf_gen_ack_frame) (unsigned char *outbuf, size_t outbuf_sz, gaf_rechist_first_f, gaf_rechist_next_f, gaf_rechist_largest_recv_f, void *rechist, lsquic_time_t now, - int *has_missing, lsquic_packno_t *largest_received); + int *has_missing, lsquic_packno_t *largest_received, + const uint64_t *ecn_counts); int (*pf_gen_stop_waiting_frame) (unsigned char *buf, size_t buf_len, lsquic_packno_t cur_packno, enum packno_bits, @@ -106,39 +138,64 @@ struct parse_funcs (*pf_skip_stop_waiting_frame) (size_t buf_len, enum packno_bits); int (*pf_gen_window_update_frame) (unsigned char *buf, int buf_len, - uint32_t stream_id, uint64_t offset); + lsquic_stream_id_t stream_id, uint64_t offset); int (*pf_parse_window_update_frame) (const unsigned char *buf, size_t buf_len, - uint32_t *stream_id, uint64_t *offset); + lsquic_stream_id_t *stream_id, uint64_t *offset); + /* The third argument for pf_gen_blocked_frame() and pf_parse_blocked_frame() + * is Stream ID for GQUIC and offset for IETF QUIC. Since both of these are + * uint64_t, we'll use the same function pointer. Just have to be a little + * careful here. + */ int (*pf_gen_blocked_frame) (unsigned char *buf, size_t buf_len, - uint32_t stream_id); + lsquic_stream_id_t stream_id); int (*pf_parse_blocked_frame) (const unsigned char *buf, size_t buf_len, - uint32_t *stream_id); + /* TODO: rename third argument when dropping GQUIC */ + lsquic_stream_id_t *stream_id); + unsigned + (*pf_blocked_frame_size) (uint64_t); + unsigned + (*pf_rst_frame_size) (lsquic_stream_id_t stream_id, uint64_t final_size, + uint64_t error_code); int - (*pf_gen_rst_frame) (unsigned char *buf, size_t buf_len, uint32_t stream_id, - uint64_t offset, uint32_t error_code); + (*pf_gen_rst_frame) (unsigned char *buf, size_t buf_len, + lsquic_stream_id_t stream_id, uint64_t offset, uint64_t error_code); int (*pf_parse_rst_frame) (const unsigned char *buf, size_t buf_len, - uint32_t *stream_id, uint64_t *offset, uint32_t *error_code); + lsquic_stream_id_t *stream_id, uint64_t *offset, uint64_t *error_code); + int + (*pf_parse_stop_sending_frame) (const unsigned char *buf, size_t buf_len, + lsquic_stream_id_t *stream_id, uint64_t *error_code); + unsigned + (*pf_stop_sending_frame_size) (lsquic_stream_id_t, uint64_t); + int + (*pf_gen_stop_sending_frame) (unsigned char *buf, size_t buf_len, + lsquic_stream_id_t, uint64_t error_code); int - (*pf_gen_connect_close_frame) (unsigned char *buf, int buf_len, - uint32_t error_code, const char *reason, int reason_len); + (*pf_gen_connect_close_frame) (unsigned char *buf, size_t buf_len, + int app_error, unsigned error_code, const char *reason, int reason_len); int (*pf_parse_connect_close_frame) (const unsigned char *buf, size_t buf_len, - uint32_t *error_code, uint16_t *reason_length, + int *app_error, uint64_t *error_code, uint16_t *reason_length, uint8_t *reason_offset); int (*pf_gen_goaway_frame) (unsigned char *buf, size_t buf_len, - uint32_t error_code, uint32_t last_good_stream_id, + uint32_t error_code, lsquic_stream_id_t last_good_stream_id, const char *reason, size_t reason_len); int (*pf_parse_goaway_frame) (const unsigned char *buf, size_t buf_len, - uint32_t *error_code, uint32_t *last_good_stream_id, + uint32_t *error_code, lsquic_stream_id_t *last_good_stream_id, uint16_t *reason_length, const char **reason); int (*pf_gen_ping_frame) (unsigned char *buf, int buf_len); + int + (*pf_parse_path_chal_frame) (const unsigned char *buf, size_t, + uint64_t *chal); + int + (*pf_parse_path_resp_frame) (const unsigned char *buf, size_t, + uint64_t *resp); #ifndef NDEBUG /* These float reading and writing functions assume `mem' has at least * 2 bytes. @@ -148,8 +205,14 @@ struct parse_funcs uint64_t (*pf_read_float_time16) (const void *mem); #endif + ssize_t + (*pf_generate_simple_prst) (const lsquic_cid_t *cid, + unsigned char *, size_t); size_t - (*pf_calc_stream_frame_header_sz) (uint32_t stream_id, uint64_t offset); + (*pf_calc_stream_frame_header_sz) (lsquic_stream_id_t stream_id, + uint64_t offset, unsigned data_sz); + size_t + (*pf_calc_crypto_frame_header_sz) (uint64_t offset); void (*pf_turn_on_fin) (unsigned char *); @@ -157,49 +220,129 @@ struct parse_funcs (*pf_packout_size) (const struct lsquic_conn *, const struct lsquic_packet_out *); + /* This returns the high estimate of the header size. Note that it + * cannot account for the size of the token in the IETF QUIC Initial + * packets as it does not know it. + */ size_t - (*pf_packout_header_size) (const struct lsquic_conn *, - enum packet_out_flags); + (*pf_packout_max_header_size) (const struct lsquic_conn *, + enum packet_out_flags, size_t dcid_len); enum packno_bits (*pf_calc_packno_bits) (lsquic_packno_t packno, lsquic_packno_t least_unacked, uint64_t n_in_flight); unsigned (*pf_packno_bits2len) (enum packno_bits); + + /* Only used by IETF QUIC: */ + void + (*pf_packno_info) (const struct lsquic_conn *, + const struct lsquic_packet_out *, unsigned *packno_off, + unsigned *packno_len); + int + (*pf_parse_max_data) (const unsigned char *, size_t, uint64_t *); + int + (*pf_gen_max_data_frame) (unsigned char *, size_t, uint64_t); + unsigned + (*pf_max_data_frame_size) (uint64_t); + int + (*pf_parse_new_conn_id) (const unsigned char *, size_t, uint64_t *, + uint64_t *, lsquic_cid_t *, const unsigned char **); + unsigned + (*pf_stream_blocked_frame_size) (lsquic_stream_id_t, uint64_t); + int + (*pf_gen_stream_blocked_frame) (unsigned char *buf, size_t, + lsquic_stream_id_t, uint64_t); + int + (*pf_parse_stream_blocked_frame) (const unsigned char *buf, size_t, + lsquic_stream_id_t *, uint64_t *); + unsigned + (*pf_max_stream_data_frame_size) (lsquic_stream_id_t, uint64_t); + int + (*pf_gen_max_stream_data_frame) (unsigned char *buf, size_t, + lsquic_stream_id_t, uint64_t); + int + (*pf_parse_max_stream_data_frame) (const unsigned char *buf, size_t, + lsquic_stream_id_t *, uint64_t *); + int + (*pf_parse_new_token_frame) (const unsigned char *buf, size_t, + const unsigned char **token, size_t *token_size); + size_t + (*pf_new_connection_id_frame_size) (unsigned seqno, unsigned cid_len); + int + (*pf_gen_new_connection_id_frame) (unsigned char *buf, size_t, + unsigned seqno, const struct lsquic_cid *, + const unsigned char *token, size_t); + size_t + (*pf_retire_cid_frame_size) (uint64_t); + int + (*pf_gen_retire_cid_frame) (unsigned char *buf, size_t, uint64_t); + int + (*pf_parse_retire_cid_frame) (const unsigned char *buf, size_t, uint64_t *); + size_t + (*pf_new_token_frame_size) (size_t); + int + (*pf_gen_new_token_frame) (unsigned char *buf, size_t, + const unsigned char *token, size_t); + int + (*pf_gen_streams_blocked_frame) (unsigned char *buf, size_t buf_len, + enum stream_dir, uint64_t); + int + (*pf_parse_streams_blocked_frame) (const unsigned char *buf, size_t buf_len, + enum stream_dir *, uint64_t *); + unsigned + (*pf_streams_blocked_frame_size) (uint64_t); + int + (*pf_gen_max_streams_frame) (unsigned char *buf, size_t buf_len, + enum stream_dir, uint64_t); + int + (*pf_parse_max_streams_frame) (const unsigned char *buf, size_t buf_len, + enum stream_dir *, uint64_t *); + unsigned + (*pf_max_streams_frame_size) (uint64_t); + unsigned + (*pf_path_chal_frame_size) (void); + int + (*pf_gen_path_chal_frame) (unsigned char *, size_t, uint64_t chal); + unsigned + (*pf_path_resp_frame_size) (void); + int + (*pf_gen_path_resp_frame) (unsigned char *, size_t, uint64_t resp); }; -extern const struct parse_funcs lsquic_parse_funcs_gquic_le; -/* Q039 and later are big-endian: */ + extern const struct parse_funcs lsquic_parse_funcs_gquic_Q039; -extern const struct parse_funcs lsquic_parse_funcs_gquic_Q044; extern const struct parse_funcs lsquic_parse_funcs_gquic_Q046; +extern const struct parse_funcs lsquic_parse_funcs_ietf_v1; -#define select_pf_by_ver(ver) ( \ - ((1 << (ver)) & (1 << LSQVER_035)) \ - ? &lsquic_parse_funcs_gquic_le \ - : (ver) < LSQVER_044 \ - ? &lsquic_parse_funcs_gquic_Q039 \ - : (ver) < LSQVER_046 \ - ? &lsquic_parse_funcs_gquic_Q044 \ - : &lsquic_parse_funcs_gquic_Q046) +#define select_pf_by_ver(ver) ( \ + (1 << (ver)) & ((1 << LSQVER_039)|(1 << LSQVER_043)) ? \ + &lsquic_parse_funcs_gquic_Q039 : \ + (1 << (ver)) & ((1 << LSQVER_046)|LSQUIC_EXPERIMENTAL_Q098) ? \ + &lsquic_parse_funcs_gquic_Q046 : \ + &lsquic_parse_funcs_ietf_v1) +/* This function is gQUIC-version independent */ int lsquic_gquic_parse_packet_in_begin (struct lsquic_packet_in *, size_t length, - int is_server, struct packin_parse_state *); + int is_server, unsigned cid_len, struct packin_parse_state *); int -lsquic_iquic_parse_packet_in_long_begin (struct lsquic_packet_in *, - size_t length, int is_server, struct packin_parse_state *state); +lsquic_Q046_parse_packet_in_short_begin (struct lsquic_packet_in *, size_t length, + int is_server, unsigned, struct packin_parse_state *); int -lsquic_iquic_parse_packet_in_short_begin (struct lsquic_packet_in *, - size_t length, int is_server, struct packin_parse_state *state); +lsquic_Q046_parse_packet_in_long_begin (struct lsquic_packet_in *, size_t length, + int is_server, unsigned, struct packin_parse_state *); enum quic_frame_type parse_frame_type_gquic_Q035_thru_Q039 (unsigned char first_byte); +extern const enum quic_frame_type lsquic_iquic_byte2type[0x100]; + size_t -calc_stream_frame_header_sz_gquic (uint32_t stream_id, uint64_t offset); +calc_stream_frame_header_sz_gquic (lsquic_stream_id_t stream_id, + uint64_t offset, unsigned); size_t lsquic_gquic_packout_size (const struct lsquic_conn *, @@ -207,7 +350,14 @@ lsquic_gquic_packout_size (const struct lsquic_conn *, size_t lsquic_gquic_packout_header_size (const struct lsquic_conn *conn, - enum packet_out_flags flags); + enum packet_out_flags flags, size_t unused); + +size_t +lsquic_gquic_po_header_sz (enum packet_out_flags flags); + +size_t +lsquic_gquic_packout_size (const struct lsquic_conn *, + const struct lsquic_packet_out *); size_t lsquic_gquic_po_header_sz (enum packet_out_flags flags); diff --git a/src/liblsquic/lsquic_parse_Q046.c b/src/liblsquic/lsquic_parse_Q046.c index 3a3a1b113..deb309536 100644 --- a/src/liblsquic/lsquic_parse_Q046.c +++ b/src/liblsquic/lsquic_parse_Q046.c @@ -15,6 +15,7 @@ #endif #include "lsquic_types.h" +#include "lsquic_int_types.h" #include "lsquic_packet_common.h" #include "lsquic_packet_in.h" #include "lsquic_packet_out.h" @@ -24,21 +25,19 @@ #include "lsquic.h" #include "lsquic_parse_gquic_be.h" #include "lsquic_byteswap.h" +#include "lsquic_hash.h" #include "lsquic_conn.h" #define LSQUIC_LOGGER_MODULE LSQLM_PARSE #include "lsquic_logger.h" - - static unsigned gquic_Q046_packno_bits2len (enum packno_bits bits) { return bits + 1; } - #define iquic_packno_bits2len gquic_Q046_packno_bits2len @@ -98,15 +97,21 @@ gen_short_pkt_header (const struct lsquic_conn *lconn, bits = lsquic_packet_out_packno_bits(packet_out); packno_len = iquic_packno_bits2len(bits); - need = 1 + 8 /* CID */ + packno_len; + if (lconn->cn_flags & LSCONN_SERVER) + need = 1 + packno_len; + else + need = 1 + 8 /* CID */ + packno_len; if (need > bufsz) return -1; *buf++ = 0x40 | bits; - memcpy(buf, &lconn->cn_cid, 8); - buf += 8; + if (0 == (lconn->cn_flags & LSCONN_SERVER)) + { + memcpy(buf, lconn->cn_cid.idbuf, 8); + buf += 8; + } (void) write_packno(buf, packet_out->po_packno, bits); @@ -118,6 +123,8 @@ static size_t gquic_Q046_packout_header_size_long (const struct lsquic_conn *lconn, enum packet_out_flags flags) { + if ((lconn->cn_flags & LSCONN_SERVER) && (flags & PO_NONCE)) + return GQUIC_IETF_LONG_HEADER_SIZE + 32; return GQUIC_IETF_LONG_HEADER_SIZE; } @@ -157,13 +164,21 @@ gen_long_pkt_header (const struct lsquic_conn *lconn, memcpy(p, &ver_tag, sizeof(ver_tag)); p += sizeof(ver_tag); - *p++ = 0x50; + if (lconn->cn_flags & LSCONN_SERVER) + *p++ = 0x05; + else + *p++ = 0x50; - memcpy(p, &lconn->cn_cid, 8); + memcpy(p, lconn->cn_cid.idbuf, 8); p += 8; p += write_packno(p, packet_out->po_packno, packno_bits); + if (packet_out->po_nonce) + { + memcpy(p, packet_out->po_nonce, 32); + p += 32; + } assert(need == (unsigned int)(p - buf)); return p - buf; @@ -191,7 +206,7 @@ gquic_Q046_packout_header_size_short (const struct lsquic_conn *lconn, bits = (flags >> POBIT_SHIFT) & 0x3; sz = 1; /* Type */ - sz += 8; /* CID */ + sz += (lconn->cn_flags & LSCONN_SERVER) ? 0 : 8; sz += iquic_packno_bits2len(bits); return sz; @@ -200,7 +215,7 @@ gquic_Q046_packout_header_size_short (const struct lsquic_conn *lconn, static size_t gquic_Q046_packout_header_size (const struct lsquic_conn *lconn, - enum packet_out_flags flags) + enum packet_out_flags flags, size_t dcid_len_unused) { if (0 == (flags & PO_LONGHEAD)) return gquic_Q046_packout_header_size_short(lconn, flags); @@ -221,16 +236,36 @@ gquic_Q046_packout_size (const struct lsquic_conn *lconn, sz = gquic_Q046_packout_header_size_long(lconn, packet_out->po_flags); sz += packet_out->po_data_sz; - sz += QUIC_PACKET_HASH_SZ; + sz += GQUIC_PACKET_HASH_SZ; return sz; } +void +gquic_Q046_parse_packet_in_finish (struct lsquic_packet_in *packet_in, + struct packin_parse_state *state) +{ + lsquic_packno_t packno; + + if (packet_in->pi_header_type == HETY_NOT_SET + /* We can't check in the beginning because we don't know whether + * this is Q046 or ID-18. This is a bit hacky. + */ + && state->pps_p + state->pps_nbytes + <= packet_in->pi_data + packet_in->pi_data_sz) + { + READ_UINT(packno, 64, state->pps_p, state->pps_nbytes); + packet_in->pi_packno = packno; + packet_in->pi_header_sz += state->pps_nbytes; + } +} + + const struct parse_funcs lsquic_parse_funcs_gquic_Q046 = { .pf_gen_reg_pkt_header = gquic_Q046_gen_reg_pkt_header, - .pf_parse_packet_in_finish = gquic_be_parse_packet_in_finish, + .pf_parse_packet_in_finish = gquic_Q046_parse_packet_in_finish, .pf_gen_stream_frame = gquic_be_gen_stream_frame, .pf_calc_stream_frame_header_sz = calc_stream_frame_header_sz_gquic, .pf_parse_stream_frame = gquic_be_parse_stream_frame, @@ -254,10 +289,11 @@ const struct parse_funcs lsquic_parse_funcs_gquic_Q046 = .pf_write_float_time16 = gquic_be_write_float_time16, .pf_read_float_time16 = gquic_be_read_float_time16, #endif + .pf_generate_simple_prst = lsquic_generate_iquic_reset, .pf_parse_frame_type = parse_frame_type_gquic_Q035_thru_Q039, .pf_turn_on_fin = lsquic_turn_on_fin_Q035_thru_Q039, .pf_packout_size = gquic_Q046_packout_size, - .pf_packout_header_size = gquic_Q046_packout_header_size, + .pf_packout_max_header_size = gquic_Q046_packout_header_size, .pf_calc_packno_bits = gquic_Q046_calc_packno_bits, .pf_packno_bits2len = gquic_Q046_packno_bits2len, }; diff --git a/src/liblsquic/lsquic_parse_common.c b/src/liblsquic/lsquic_parse_common.c index 31fc69f63..d3a515108 100644 --- a/src/liblsquic/lsquic_parse_common.c +++ b/src/liblsquic/lsquic_parse_common.c @@ -1,36 +1,127 @@ /* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#include #include #include #include +#include "lsquic.h" #include "lsquic_types.h" #include "lsquic_int_types.h" #include "lsquic_packet_common.h" #include "lsquic_packet_in.h" #include "lsquic_parse_common.h" #include "lsquic_parse.h" +#include "lsquic_enc_sess.h" +#include "lsquic_version.h" + + +static int +parse_ietf_v1_or_Q046_long_begin (struct lsquic_packet_in *packet_in, + size_t length, int is_server, unsigned cid_len, + struct packin_parse_state *state) +{ + enum lsquic_version version; + lsquic_ver_tag_t tag; + + if (length >= 5) + { + memcpy(&tag, packet_in->pi_data + 1, 4); + version = lsquic_tag2ver(tag); + if (version == LSQVER_046) + return lsquic_Q046_parse_packet_in_long_begin(packet_in, length, + is_server, cid_len, state); + else + return lsquic_ietf_v1_parse_packet_in_long_begin(packet_in, length, + is_server, cid_len, state); + } + else + return -1; +} + + +static int (* const parse_begin_funcs[32]) (struct lsquic_packet_in *, + size_t length, int is_server, unsigned cid_len, + struct packin_parse_state *) = +{ + /* Xs vary, Gs are iGnored: */ +#define PBEL(mask) [(mask) >> 3] + /* 1X11 XGGG: */ + PBEL(0x80|0x40|0x20|0x10|0x08) = lsquic_Q046_parse_packet_in_long_begin, + PBEL(0x80|0x00|0x20|0x10|0x08) = lsquic_Q046_parse_packet_in_long_begin, + PBEL(0x80|0x40|0x20|0x10|0x00) = lsquic_Q046_parse_packet_in_long_begin, + PBEL(0x80|0x00|0x20|0x10|0x00) = lsquic_Q046_parse_packet_in_long_begin, + /* 1X00 XGGG: */ + PBEL(0x80|0x40|0x00|0x00|0x08) = parse_ietf_v1_or_Q046_long_begin, + PBEL(0x80|0x00|0x00|0x00|0x08) = parse_ietf_v1_or_Q046_long_begin, + PBEL(0x80|0x40|0x00|0x00|0x00) = parse_ietf_v1_or_Q046_long_begin, + PBEL(0x80|0x00|0x00|0x00|0x00) = parse_ietf_v1_or_Q046_long_begin, + /* 1X01 XGGG: */ + PBEL(0x80|0x40|0x00|0x10|0x08) = parse_ietf_v1_or_Q046_long_begin, + PBEL(0x80|0x00|0x00|0x10|0x08) = parse_ietf_v1_or_Q046_long_begin, + PBEL(0x80|0x40|0x00|0x10|0x00) = parse_ietf_v1_or_Q046_long_begin, + PBEL(0x80|0x00|0x00|0x10|0x00) = parse_ietf_v1_or_Q046_long_begin, + /* 1X10 XGGG: */ + PBEL(0x80|0x40|0x20|0x00|0x08) = parse_ietf_v1_or_Q046_long_begin, + PBEL(0x80|0x00|0x20|0x00|0x08) = parse_ietf_v1_or_Q046_long_begin, + PBEL(0x80|0x40|0x20|0x00|0x00) = parse_ietf_v1_or_Q046_long_begin, + PBEL(0x80|0x00|0x20|0x00|0x00) = parse_ietf_v1_or_Q046_long_begin, + /* 01XX XGGG */ + PBEL(0x00|0x40|0x00|0x00|0x00) = lsquic_ietf_v1_parse_packet_in_short_begin, + PBEL(0x00|0x40|0x00|0x00|0x08) = lsquic_ietf_v1_parse_packet_in_short_begin, + PBEL(0x00|0x40|0x00|0x10|0x00) = lsquic_ietf_v1_parse_packet_in_short_begin, + PBEL(0x00|0x40|0x00|0x10|0x08) = lsquic_ietf_v1_parse_packet_in_short_begin, + PBEL(0x00|0x40|0x20|0x00|0x00) = lsquic_ietf_v1_parse_packet_in_short_begin, + PBEL(0x00|0x40|0x20|0x00|0x08) = lsquic_ietf_v1_parse_packet_in_short_begin, + PBEL(0x00|0x40|0x20|0x10|0x00) = lsquic_ietf_v1_parse_packet_in_short_begin, + PBEL(0x00|0x40|0x20|0x10|0x08) = lsquic_ietf_v1_parse_packet_in_short_begin, + /* 00XX 0GGG */ + PBEL(0x00|0x00|0x00|0x00|0x00) = lsquic_Q046_parse_packet_in_short_begin, + PBEL(0x00|0x00|0x00|0x10|0x00) = lsquic_Q046_parse_packet_in_short_begin, + PBEL(0x00|0x00|0x20|0x00|0x00) = lsquic_Q046_parse_packet_in_short_begin, + PBEL(0x00|0x00|0x20|0x10|0x00) = lsquic_Q046_parse_packet_in_short_begin, + /* 00XX 1GGG */ + PBEL(0x00|0x00|0x00|0x00|0x08) = lsquic_gquic_parse_packet_in_begin, + PBEL(0x00|0x00|0x00|0x10|0x08) = lsquic_gquic_parse_packet_in_begin, + PBEL(0x00|0x00|0x20|0x00|0x08) = lsquic_gquic_parse_packet_in_begin, + PBEL(0x00|0x00|0x20|0x10|0x08) = lsquic_gquic_parse_packet_in_begin, +#undef PBEL +}; +int +lsquic_parse_packet_in_server_begin (struct lsquic_packet_in *packet_in, + size_t length, int is_server_UNUSED, unsigned cid_len, + struct packin_parse_state *state) +{ + if (length) + return parse_begin_funcs[ packet_in->pi_data[0] >> 3 ]( + packet_in, length, 1, cid_len, state); + else + return -1; + +} + + +/* This function does not support Q046 */ int lsquic_parse_packet_in_begin (lsquic_packet_in_t *packet_in, size_t length, - int is_server, struct packin_parse_state *state) + int is_server, unsigned cid_len, struct packin_parse_state *state) { if (length > 0) { - switch (packet_in->pi_data[0] & 0xC8) + switch (packet_in->pi_data[0] & 0xC0) { - case 0x88: - case 0x80: - case 0xC8: + /* XXX Revisit this: does this logic check out? */ case 0xC0: - return lsquic_iquic_parse_packet_in_long_begin(packet_in, length, - is_server, state); - case 0x08: + case 0x80: + return lsquic_ietf_v1_parse_packet_in_long_begin(packet_in, + length, is_server, cid_len, state); + case 0x00: return lsquic_gquic_parse_packet_in_begin(packet_in, length, - is_server, state); + is_server, cid_len, state); default: - return lsquic_iquic_parse_packet_in_short_begin(packet_in, length, - is_server, state); + return lsquic_ietf_v1_parse_packet_in_short_begin(packet_in, + length, is_server, cid_len, state); } } else @@ -39,20 +130,93 @@ lsquic_parse_packet_in_begin (lsquic_packet_in_t *packet_in, size_t length, int -lsquic_iquic_parse_packet_in_begin (struct lsquic_packet_in *packet_in, - size_t length, int is_server, struct packin_parse_state *state) +lsquic_ietf_v1_parse_packet_in_begin (struct lsquic_packet_in *packet_in, + size_t length, int is_server, unsigned cid_len, + struct packin_parse_state *state) { if (length > 0) { if (0 == (packet_in->pi_data[0] & 0x80)) - return lsquic_iquic_parse_packet_in_short_begin(packet_in, length, - is_server, state); + return lsquic_ietf_v1_parse_packet_in_short_begin(packet_in, length, + is_server, cid_len, state); else - return lsquic_iquic_parse_packet_in_long_begin(packet_in, length, - is_server, state); + return lsquic_ietf_v1_parse_packet_in_long_begin(packet_in, length, + is_server, cid_len, state); } else return -1; } +int +lsquic_Q046_parse_packet_in_begin (struct lsquic_packet_in *packet_in, + size_t length, int is_server, unsigned cid_len, + struct packin_parse_state *state) +{ + assert(!is_server); + assert(cid_len == GQUIC_CID_LEN); + if (length > 0) + { + if (0 == (packet_in->pi_data[0] & 0x80)) + return lsquic_ietf_v1_parse_packet_in_short_begin(packet_in, length, + is_server, is_server ? cid_len : 0, state); + else + return lsquic_Q046_parse_packet_in_long_begin(packet_in, length, + is_server, cid_len, state); + } + else + return -1; +} + + +/* TODO This function uses the full packet parsing functionality to get at + * the CID. This is an overkill and could be optimized -- at the cost of + * some code duplication, of course. + */ +int +lsquic_cid_from_packet (const unsigned char *buf, size_t bufsz, + lsquic_cid_t *cid) +{ + struct lsquic_packet_in packet_in; + struct packin_parse_state pps; + int s; + + packet_in.pi_data = (unsigned char *) buf; + s = lsquic_parse_packet_in_server_begin(&packet_in, bufsz, 1, 8, &pps); + if (0 == s && (packet_in.pi_flags & PI_CONN_ID)) + { + *cid = packet_in.pi_dcid; + return 0; + } + else + return -1; +} + + +/* See [draft-ietf-quic-tls-19], Section 4 */ +const enum quic_ft_bit lsquic_legal_frames_by_level[N_ENC_LEVS] = +{ + [ENC_LEV_CLEAR] = QUIC_FTBIT_CRYPTO | QUIC_FTBIT_PADDING | QUIC_FTBIT_PING + | QUIC_FTBIT_ACK | QUIC_FTBIT_CONNECTION_CLOSE, + [ENC_LEV_EARLY] = QUIC_FTBIT_PADDING | QUIC_FTBIT_PING + | QUIC_FTBIT_STREAM | QUIC_FTBIT_RST_STREAM + | QUIC_FTBIT_BLOCKED + | QUIC_FTBIT_MAX_DATA | QUIC_FTBIT_MAX_STREAM_DATA + | QUIC_FTBIT_MAX_STREAMS | QUIC_FTBIT_STREAM_BLOCKED + | QUIC_FTBIT_STREAMS_BLOCKED + | QUIC_FTBIT_NEW_CONNECTION_ID | QUIC_FTBIT_STOP_SENDING + | QUIC_FTBIT_PATH_CHALLENGE | QUIC_FTBIT_PATH_RESPONSE + | QUIC_FTBIT_RETIRE_CONNECTION_ID | QUIC_FTBIT_NEW_TOKEN, + [ENC_LEV_INIT] = QUIC_FTBIT_CRYPTO | QUIC_FTBIT_PADDING | QUIC_FTBIT_PING + | QUIC_FTBIT_ACK| QUIC_FTBIT_CONNECTION_CLOSE, + [ENC_LEV_FORW] = QUIC_FTBIT_CRYPTO | QUIC_FTBIT_PADDING | QUIC_FTBIT_PING + | QUIC_FTBIT_ACK | QUIC_FTBIT_CONNECTION_CLOSE + | QUIC_FTBIT_STREAM | QUIC_FTBIT_RST_STREAM + | QUIC_FTBIT_BLOCKED + | QUIC_FTBIT_MAX_DATA | QUIC_FTBIT_MAX_STREAM_DATA + | QUIC_FTBIT_MAX_STREAMS | QUIC_FTBIT_STREAM_BLOCKED + | QUIC_FTBIT_STREAMS_BLOCKED + | QUIC_FTBIT_NEW_CONNECTION_ID | QUIC_FTBIT_STOP_SENDING + | QUIC_FTBIT_PATH_CHALLENGE | QUIC_FTBIT_PATH_RESPONSE + | QUIC_FTBIT_RETIRE_CONNECTION_ID | QUIC_FTBIT_NEW_TOKEN, +}; diff --git a/src/liblsquic/lsquic_parse_common.h b/src/liblsquic/lsquic_parse_common.h index f68e06808..5aa88936a 100644 --- a/src/liblsquic/lsquic_parse_common.h +++ b/src/liblsquic/lsquic_parse_common.h @@ -7,6 +7,7 @@ #define LSQUIC_PARSE_COMMON_H 1 struct lsquic_packet_in; +struct packin_parse_state; struct packin_parse_state { const unsigned char *pps_p; /* Pointer to packet number */ @@ -15,11 +16,73 @@ struct packin_parse_state { int lsquic_parse_packet_in_begin (struct lsquic_packet_in *, - size_t length, int is_server, struct packin_parse_state *); + size_t length, int is_server, unsigned cid_len, + struct packin_parse_state *); int -lsquic_iquic_parse_packet_in_begin (struct lsquic_packet_in *, - size_t length, int is_server, struct packin_parse_state *); +lsquic_parse_packet_in_server_begin (struct lsquic_packet_in *packet_in, + size_t length, int is_server_UNUSED, unsigned cid_len, + struct packin_parse_state *); + +int +lsquic_ietf_v1_parse_packet_in_begin (struct lsquic_packet_in *, + size_t length, int is_server, unsigned cid_len, + struct packin_parse_state *); + +int +lsquic_Q046_parse_packet_in_begin (struct lsquic_packet_in *, + size_t length, int is_server, unsigned cid_len, + struct packin_parse_state *); + +int +lsquic_Q046_parse_packet_in_begin (struct lsquic_packet_in *, + size_t length, int is_server, unsigned cid_len, + struct packin_parse_state *); + +int +lsquic_ietf_v1_parse_packet_in_long_begin (struct lsquic_packet_in *, + size_t length, int is_server, unsigned cid_len, + struct packin_parse_state *); + +int +lsquic_ietf_v1_parse_packet_in_short_begin (struct lsquic_packet_in *, + size_t length, int is_server, unsigned cid_len, + struct packin_parse_state *); + +struct sockaddr; +enum lsquic_version; +struct lsquic_engine_public; + +int +lsquic_gquic_gen_ver_nego_pkt (unsigned char *buf, size_t bufsz, + const lsquic_cid_t *cid, unsigned versions); +int +lsquic_Q046_gen_ver_nego_pkt (unsigned char *buf, size_t bufsz, + const lsquic_cid_t *scid, const lsquic_cid_t *dcid, unsigned versions); +int +lsquic_ietf_v1_gen_ver_nego_pkt (unsigned char *buf, size_t bufsz, + const lsquic_cid_t *scid, const lsquic_cid_t *dcid, unsigned versions); +int +lsquic_iquic_gen_retry_pkt (unsigned char *buf, size_t bufsz, + const struct lsquic_engine_public *, const lsquic_cid_t *scid, + const lsquic_cid_t *dcid, enum lsquic_version, const struct sockaddr *, + uint8_t random_nybble); +ssize_t +lsquic_generate_iquic_reset (const lsquic_cid_t *, unsigned char *buf, + size_t buf_sz); + +#define GQUIC_RESET_SZ 33 +ssize_t +lsquic_generate_gquic_reset (const lsquic_cid_t *, unsigned char *buf, + size_t buf_sz); + +int +lsquic_is_valid_iquic_hs_packet (const unsigned char *buf, size_t buf_sz, + lsquic_ver_tag_t *tag); + +int +lsquic_is_valid_ietf_v1_or_Q046_hs_packet (const unsigned char *buf, + size_t length, lsquic_ver_tag_t *tagp); /* Instead of just -1 like CHECK_SPACE(), this macro returns the number * of bytes needed. diff --git a/src/liblsquic/lsquic_parse_gquic_be.c b/src/liblsquic/lsquic_parse_gquic_be.c index 33a641471..90faddf94 100644 --- a/src/liblsquic/lsquic_parse_gquic_be.c +++ b/src/liblsquic/lsquic_parse_gquic_be.c @@ -17,7 +17,7 @@ #endif #include "lsquic_types.h" -#include "lsquic_alarmset.h" +#include "lsquic_int_types.h" #include "lsquic_packet_common.h" #include "lsquic_packet_in.h" #include "lsquic_packet_out.h" @@ -25,6 +25,9 @@ #include "lsquic_parse_common.h" #include "lsquic_rechist.h" #include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" #include "lsquic_stream.h" #include "lsquic_mm.h" #include "lsquic_malo.h" @@ -155,8 +158,9 @@ gquic_be_gen_reg_pkt_header (const struct lsquic_conn *lconn, if (have_cid) { - memcpy(p, &lconn->cn_cid, sizeof(lconn->cn_cid)); - p += sizeof(lconn->cn_cid); + assert(lconn->cn_cid.len == GQUIC_CID_LEN); + memcpy(p, lconn->cn_cid.idbuf, lconn->cn_cid.len); + p += lconn->cn_cid.len; } if (have_ver) @@ -186,11 +190,12 @@ gquic_be_gen_reg_pkt_header (const struct lsquic_conn *lconn, int -gquic_be_gen_stream_frame (unsigned char *buf, size_t buf_len, uint32_t stream_id, - uint64_t offset, int fin, size_t size, - gsf_read_f gsf_read, void *stream) +gquic_be_gen_stream_frame (unsigned char *buf, size_t buf_len, + lsquic_stream_id_t stream_id64, uint64_t offset, int fin, size_t size, + gsf_read_f gsf_read, void *stream) { /* 1fdoooss */ + uint32_t stream_id = stream_id64; unsigned slen, olen, dlen; unsigned char *p = buf + 1; @@ -295,6 +300,7 @@ gquic_be_parse_stream_frame (const unsigned char *buf, size_t rem_packet_sz, stream_frame_t *stream_frame) { /* 1fdoooss */ + uint32_t stream_id; const unsigned char *p = buf; const unsigned char *const pend = p + rem_packet_sz; @@ -311,12 +317,13 @@ gquic_be_parse_stream_frame (const unsigned char *buf, size_t rem_packet_sz, stream_frame->data_frame.df_fin = (type >> 6) & 1; - memcpy((unsigned char *) &stream_frame->stream_id + 4 - stream_id_len, p, - stream_id_len); + stream_id = 0; + memcpy((unsigned char *) &stream_id + 4 - stream_id_len, p, stream_id_len); #if __BYTE_ORDER == __LITTLE_ENDIAN - stream_frame->stream_id = bswap_32(stream_frame->stream_id); + stream_id = bswap_32(stream_id); #endif + stream_frame->stream_id = stream_id; p += stream_id_len; memcpy((unsigned char *) &stream_frame->data_frame.df_offset @@ -361,7 +368,7 @@ gquic_be_parse_stream_frame (const unsigned char *buf, size_t rem_packet_sz, static int parse_ack_frame_without_blocks (const unsigned char *buf, size_t buf_len, - ack_info_t *ack) + struct ack_info *ack) { /* 01nullmm */ lsquic_packno_t tmp_packno; @@ -398,12 +405,14 @@ parse_ack_frame_without_blocks (const unsigned char *buf, size_t buf_len, assert(p <= pend); + ack->flags = 0; return p - (unsigned char *) buf; } static int -parse_ack_frame_with_blocks (const unsigned char *buf, size_t buf_len, ack_info_t *ack) +parse_ack_frame_with_blocks (const unsigned char *buf, size_t buf_len, + struct ack_info *ack) { /* 01nullmm */ lsquic_packno_t tmp_packno; @@ -481,6 +490,7 @@ parse_ack_frame_with_blocks (const unsigned char *buf, size_t buf_len, ack_info_ assert(p <= pend); + ack->flags = 0; return p - (unsigned char *) buf; } @@ -489,7 +499,8 @@ parse_ack_frame_with_blocks (const unsigned char *buf, size_t buf_len, ack_info_ * If parsing failed, negative value is returned. */ int -gquic_be_parse_ack_frame (const unsigned char *buf, size_t buf_len, ack_info_t *ack) +gquic_be_parse_ack_frame (const unsigned char *buf, size_t buf_len, + struct ack_info *ack, uint8_t UNUSED_exp) { if (!(buf[0] & 0x20)) return parse_ack_frame_without_blocks(buf, buf_len, ack); @@ -553,10 +564,12 @@ gquic_be_skip_stop_waiting_frame (size_t buf_len, enum packno_bits bits) int -gquic_be_gen_window_update_frame (unsigned char *buf, int buf_len, uint32_t stream_id, - uint64_t offset) +gquic_be_gen_window_update_frame (unsigned char *buf, int buf_len, + lsquic_stream_id_t stream_id64, uint64_t offset) { - if (buf_len < QUIC_WUF_SZ) + uint32_t stream_id = stream_id64; + + if (buf_len < GQUIC_WUF_SZ) return -1; *buf = 0x04; @@ -568,27 +581,33 @@ gquic_be_gen_window_update_frame (unsigned char *buf, int buf_len, uint32_t stre offset = bswap_64(offset); #endif memcpy(buf + 1 + 4, (unsigned char *) &offset, 8); - return QUIC_WUF_SZ; + return GQUIC_WUF_SZ; } int gquic_be_parse_window_update_frame (const unsigned char *buf, size_t buf_len, - uint32_t *stream_id, uint64_t *offset) + lsquic_stream_id_t *stream_id_p, uint64_t *offset) { - if (buf_len < QUIC_WUF_SZ) + uint32_t stream_id; + + if (buf_len < GQUIC_WUF_SZ) return -1; - READ_UINT(*stream_id, 32, buf + 1, 4); + READ_UINT(stream_id, 32, buf + 1, 4); READ_UINT(*offset, 64, buf + 1 + 4, 8); - return QUIC_WUF_SZ; + *stream_id_p = stream_id; + return GQUIC_WUF_SZ; } int -gquic_be_gen_blocked_frame (unsigned char *buf, size_t buf_len, uint32_t stream_id) +gquic_be_gen_blocked_frame (unsigned char *buf, size_t buf_len, + lsquic_stream_id_t stream_id64) { - if (buf_len < QUIC_BLOCKED_FRAME_SZ) + uint32_t stream_id = stream_id64; + + if (buf_len < GQUIC_BLOCKED_FRAME_SZ) return -1; *buf = 0x05; @@ -596,28 +615,40 @@ gquic_be_gen_blocked_frame (unsigned char *buf, size_t buf_len, uint32_t stream_ stream_id = bswap_32(stream_id); #endif memcpy(buf + 1, &stream_id, 4); - return QUIC_BLOCKED_FRAME_SZ; + return GQUIC_BLOCKED_FRAME_SZ; } int gquic_be_parse_blocked_frame (const unsigned char *buf, size_t buf_len, - uint32_t *stream_id) + lsquic_stream_id_t *stream_id_p) { - if (buf_len < QUIC_BLOCKED_FRAME_SZ) + uint32_t stream_id; + if (buf_len < GQUIC_BLOCKED_FRAME_SZ) return -1; - READ_UINT(*stream_id, 32, buf + 1, 4); - return QUIC_BLOCKED_FRAME_SZ; + READ_UINT(stream_id, 32, buf + 1, 4); + *stream_id_p = stream_id; + return GQUIC_BLOCKED_FRAME_SZ; +} + + +static unsigned +gquic_be_rst_frame_size (lsquic_stream_id_t stream_id, uint64_t error_code, + uint64_t final_size) +{ + assert(0); /* This function is not called */ + return GQUIC_RST_STREAM_SZ; } int -gquic_be_gen_rst_frame (unsigned char *buf, size_t buf_len, uint32_t stream_id, - uint64_t offset, uint32_t error_code) +gquic_be_gen_rst_frame (unsigned char *buf, size_t buf_len, + lsquic_stream_id_t stream_id64, uint64_t offset, uint64_t error_code64) { + uint32_t stream_id = stream_id64, error_code = error_code64; unsigned char *p = buf; - if (buf_len < QUIC_RST_STREAM_SZ) + if (buf_len < GQUIC_RST_STREAM_SZ) return -1; *p = 0x01; @@ -642,16 +673,20 @@ gquic_be_gen_rst_frame (unsigned char *buf, size_t buf_len, uint32_t stream_id, int -gquic_be_parse_rst_frame (const unsigned char *buf, size_t buf_len, uint32_t *stream_id, - uint64_t *offset, uint32_t *error_code) +gquic_be_parse_rst_frame (const unsigned char *buf, size_t buf_len, + lsquic_stream_id_t *stream_id_p, uint64_t *offset, uint64_t *error_code_p) { - if (buf_len < QUIC_RST_STREAM_SZ) + uint32_t stream_id, error_code; + + if (buf_len < GQUIC_RST_STREAM_SZ) return -1; - READ_UINT(*stream_id, 32, buf + 1, 4); + READ_UINT(stream_id, 32, buf + 1, 4); READ_UINT(*offset, 64, buf + 1 + 4, 8); - READ_UINT(*error_code, 32, buf + 1 + 4 + 8, 4); - return QUIC_RST_STREAM_SZ; + READ_UINT(error_code, 32, buf + 1 + 4 + 8, 4); + *stream_id_p = stream_id; + *error_code_p = error_code; + return GQUIC_RST_STREAM_SZ; } @@ -669,15 +704,17 @@ gquic_be_gen_ping_frame (unsigned char *buf, int buf_len) int -gquic_be_gen_connect_close_frame (unsigned char *buf, int buf_len, uint32_t error_code, - const char *reason, int reason_len) +gquic_be_gen_connect_close_frame (unsigned char *buf, size_t buf_len, + int app_error_UNUSED, unsigned ecode, const char *reason, int reason_len) { + uint32_t error_code; unsigned char *p = buf; - if (buf_len < 7) + if ((int) buf_len < 7 + reason_len) return -1; *p = 0x02; ++p; + error_code = ecode; #if __BYTE_ORDER == __LITTLE_ENDIAN error_code = bswap_32(error_code); #endif @@ -692,8 +729,6 @@ gquic_be_gen_connect_close_frame (unsigned char *buf, int buf_len, uint32_t erro p += 2; memcpy(p, reason, reason_len); p += reason_len; - if (buf_len < p - buf) - return -2; return p - buf; } @@ -701,28 +736,36 @@ gquic_be_gen_connect_close_frame (unsigned char *buf, int buf_len, uint32_t erro int gquic_be_parse_connect_close_frame (const unsigned char *buf, size_t buf_len, - uint32_t *error_code, uint16_t *reason_len, uint8_t *reason_offset) + int *app_error, uint64_t *error_code_p, + uint16_t *reason_len, uint8_t *reason_offset) { + uint32_t error_code; + if (buf_len < 7) return -1; - READ_UINT(*error_code, 32, buf + 1, 4); + READ_UINT(error_code, 32, buf + 1, 4); READ_UINT(*reason_len, 16, buf + 1 + 4, 2); *reason_offset = 7; if (buf_len < 7u + *reason_len) return -2; + *error_code_p = error_code; + if (app_error) + *app_error = 0; + return 7 + *reason_len; } int -gquic_be_gen_goaway_frame(unsigned char *buf, size_t buf_len, uint32_t error_code, - uint32_t last_good_stream_id, const char *reason, - size_t reason_len) +gquic_be_gen_goaway_frame (unsigned char *buf, size_t buf_len, + uint32_t error_code, lsquic_stream_id_t last_good_stream_id64, + const char *reason, size_t reason_len) { + uint32_t last_good_stream_id = last_good_stream_id64; unsigned char *p = buf; - if (buf_len < QUIC_GOAWAY_FRAME_SZ + reason_len) + if (buf_len < GQUIC_GOAWAY_FRAME_SZ + reason_len) return -1; *p = 0x03; @@ -757,25 +800,27 @@ gquic_be_gen_goaway_frame(unsigned char *buf, size_t buf_len, uint32_t error_cod /* the reason is buf + *reason_offset, length is *reason_length */ int gquic_be_parse_goaway_frame (const unsigned char *buf, size_t buf_len, - uint32_t *error_code, uint32_t *last_good_stream_id, - uint16_t *reason_length, const char **reason) + uint32_t *error_code, lsquic_stream_id_t *last_good_stream_id, + uint16_t *reason_length, const char **reason) { - if (buf_len < QUIC_GOAWAY_FRAME_SZ) + uint32_t stream_id; + if (buf_len < GQUIC_GOAWAY_FRAME_SZ) return -1; READ_UINT(*error_code, 32, buf + 1, 4); - READ_UINT(*last_good_stream_id, 32, buf + 1 + 4, 4); + READ_UINT(stream_id, 32, buf + 1 + 4, 4); READ_UINT(*reason_length, 16, buf + 1 + 4 + 4, 2); if (*reason_length) { - if ((int)buf_len < QUIC_GOAWAY_FRAME_SZ + *reason_length) + if ((int)buf_len < GQUIC_GOAWAY_FRAME_SZ + *reason_length) return -2; - *reason = (const char *) buf + QUIC_GOAWAY_FRAME_SZ; + *reason = (const char *) buf + GQUIC_GOAWAY_FRAME_SZ; } else *reason = NULL; - return QUIC_GOAWAY_FRAME_SZ + *reason_length; + *last_good_stream_id = stream_id; + return GQUIC_GOAWAY_FRAME_SZ + *reason_length; } @@ -786,7 +831,7 @@ gquic_be_gen_ack_frame (unsigned char *outbuf, size_t outbuf_sz, gaf_rechist_first_f rechist_first, gaf_rechist_next_f rechist_next, gaf_rechist_largest_recv_f rechist_largest_recv, void *rechist, lsquic_time_t now, int *has_missing, - lsquic_packno_t *largest_received) + lsquic_packno_t *largest_received, const uint64_t *unused) { lsquic_time_t time_diff; lsquic_packno_t tmp_packno; @@ -961,6 +1006,7 @@ const struct parse_funcs lsquic_parse_funcs_gquic_Q039 = .pf_parse_window_update_frame = gquic_be_parse_window_update_frame, .pf_gen_blocked_frame = gquic_be_gen_blocked_frame, .pf_parse_blocked_frame = gquic_be_parse_blocked_frame, + .pf_rst_frame_size = gquic_be_rst_frame_size, .pf_gen_rst_frame = gquic_be_gen_rst_frame, .pf_parse_rst_frame = gquic_be_parse_rst_frame, .pf_gen_connect_close_frame = gquic_be_gen_connect_close_frame, @@ -972,10 +1018,11 @@ const struct parse_funcs lsquic_parse_funcs_gquic_Q039 = .pf_write_float_time16 = gquic_be_write_float_time16, .pf_read_float_time16 = gquic_be_read_float_time16, #endif + .pf_generate_simple_prst = lsquic_generate_gquic_reset, .pf_parse_frame_type = parse_frame_type_gquic_Q035_thru_Q039, .pf_turn_on_fin = lsquic_turn_on_fin_Q035_thru_Q039, .pf_packout_size = lsquic_gquic_packout_size, - .pf_packout_header_size = lsquic_gquic_packout_header_size, + .pf_packout_max_header_size = lsquic_gquic_packout_header_size, .pf_calc_packno_bits = lsquic_gquic_calc_packno_bits, .pf_packno_bits2len = lsquic_gquic_packno_bits2len, }; diff --git a/src/liblsquic/lsquic_parse_gquic_be.h b/src/liblsquic/lsquic_parse_gquic_be.h index 93eefb068..56dd25cec 100644 --- a/src/liblsquic/lsquic_parse_gquic_be.h +++ b/src/liblsquic/lsquic_parse_gquic_be.h @@ -11,21 +11,6 @@ #define CHECK_SPACE(need, pstart, pend) \ do { if ((intptr_t) (need) > ((pend) - (pstart))) { return -1; } } while (0) -#if __BYTE_ORDER == __LITTLE_ENDIAN -#define READ_UINT(varname, varwidth, src, nbytes) do { \ - varname = 0; \ - memcpy((unsigned char *) &varname + varwidth / 8 - (nbytes), (src), \ - (nbytes)); \ - varname = bswap_##varwidth(varname); \ -} while (0) -#else -#define READ_UINT(varname, varwidth, src, nbytes) do { \ - varname = 0; \ - memcpy((unsigned char *) &varname + varwidth / 8 - (nbytes), (src), \ - (nbytes)); \ -} while (0) -#endif - uint64_t gquic_be_read_float_time16 (const void *mem); @@ -37,13 +22,13 @@ gquic_be_parse_packet_in_finish (lsquic_packet_in_t *packet_in, struct packin_parse_state *state); int -gquic_be_gen_ver_nego_pkt (unsigned char *buf, size_t bufsz, uint64_t conn_id, - unsigned version_bitmask); +gquic_be_gen_ver_nego_pkt (unsigned char *buf, size_t bufsz, + const lsquic_cid_t *, unsigned version_bitmask); int -gquic_be_gen_stream_frame (unsigned char *buf, size_t buf_len, uint32_t stream_id, - uint64_t offset, int fin, size_t size, - gsf_read_f gsf_read, void *stream); +gquic_be_gen_stream_frame (unsigned char *buf, size_t buf_len, + lsquic_stream_id_t stream_id, uint64_t offset, int fin, size_t size, + gsf_read_f gsf_read, void *stream); int gquic_be_parse_stream_frame (const unsigned char *buf, size_t rem_packet_sz, @@ -53,7 +38,8 @@ lsquic_packno_t gquic_be_parse_ack_high (const unsigned char *buf, size_t buf_len); int -gquic_be_parse_ack_frame (const unsigned char *buf, size_t buf_len, ack_info_t *ack); +gquic_be_parse_ack_frame (const unsigned char *buf, size_t buf_len, + struct ack_info *, uint8_t); int gquic_be_gen_stop_waiting_frame(unsigned char *buf, size_t buf_len, @@ -69,53 +55,56 @@ int gquic_be_skip_stop_waiting_frame (size_t buf_len, enum packno_bits bits); int -gquic_be_gen_window_update_frame (unsigned char *buf, int buf_len, uint32_t stream_id, - uint64_t offset); +gquic_be_gen_window_update_frame (unsigned char *buf, int buf_len, + lsquic_stream_id_t stream_id, uint64_t offset); int gquic_be_parse_window_update_frame (const unsigned char *buf, size_t buf_len, - uint32_t *stream_id, uint64_t *offset); + lsquic_stream_id_t *stream_id, uint64_t *offset); int -gquic_be_gen_blocked_frame (unsigned char *buf, size_t buf_len, uint32_t stream_id); +gquic_be_gen_blocked_frame (unsigned char *buf, size_t buf_len, + lsquic_stream_id_t stream_id); int gquic_be_parse_blocked_frame (const unsigned char *buf, size_t buf_len, - uint32_t *stream_id); + lsquic_stream_id_t *stream_id); int -gquic_be_gen_rst_frame (unsigned char *buf, size_t buf_len, uint32_t stream_id, - uint64_t offset, uint32_t error_code); +gquic_be_gen_rst_frame (unsigned char *buf, size_t buf_len, + lsquic_stream_id_t stream_id, uint64_t offset, uint64_t error_code); int -gquic_be_parse_rst_frame (const unsigned char *buf, size_t buf_len, uint32_t *stream_id, - uint64_t *offset, uint32_t *error_code); +gquic_be_parse_rst_frame (const unsigned char *buf, size_t buf_len, + lsquic_stream_id_t *stream_id, uint64_t *offset, uint64_t *error_code); int gquic_be_gen_ping_frame (unsigned char *buf, int buf_len); int -gquic_be_gen_connect_close_frame (unsigned char *buf, int buf_len, uint32_t error_code, - const char *reason, int reason_len); +gquic_be_gen_connect_close_frame (unsigned char *buf, size_t buf_len, + int app_error, unsigned error_code, const char *reason, int reason_len); int gquic_be_parse_connect_close_frame (const unsigned char *buf, size_t buf_len, - uint32_t *error_code, uint16_t *reason_len, uint8_t *reason_offset); + int *app_error, uint64_t *error_code, + uint16_t *reason_len, uint8_t *reason_offset); int gquic_be_gen_goaway_frame(unsigned char *buf, size_t buf_len, uint32_t error_code, - uint32_t last_good_stream_id, const char *reason, + lsquic_stream_id_t last_good_stream_id, const char *reason, size_t reason_len); int gquic_be_parse_goaway_frame (const unsigned char *buf, size_t buf_len, - uint32_t *error_code, uint32_t *last_good_stream_id, + uint32_t *error_code, lsquic_stream_id_t *last_good_stream_id, uint16_t *reason_length, const char **reason); int gquic_be_gen_ack_frame (unsigned char *outbuf, size_t outbuf_sz, gaf_rechist_first_f rechist_first, gaf_rechist_next_f rechist_next, gaf_rechist_largest_recv_f rechist_largest_recv, - void *rechist, lsquic_time_t now, int *has_missing, lsquic_packno_t *); + void *rechist, lsquic_time_t now, int *has_missing, lsquic_packno_t *, + const uint64_t *); #endif diff --git a/src/liblsquic/lsquic_parse_gquic_common.c b/src/liblsquic/lsquic_parse_gquic_common.c index 43f881abb..c1eab8743 100644 --- a/src/liblsquic/lsquic_parse_gquic_common.c +++ b/src/liblsquic/lsquic_parse_gquic_common.c @@ -16,9 +16,13 @@ #endif #include "lsquic_types.h" +#include "lsquic_int_types.h" #include "lsquic_packet_common.h" #include "lsquic_packet_out.h" +#include "lsquic_packet_gquic.h" #include "lsquic_packet_in.h" +#include "lsquic_packet_out.h" +#include "lsquic_parse_common.h" #include "lsquic_parse.h" #include "lsquic_parse_common.h" #include "lsquic_version.h" @@ -38,14 +42,22 @@ * pf_parse_packet_in_finish() routine. */ int -lsquic_gquic_parse_packet_in_begin (struct lsquic_packet_in *packet_in, - size_t length, int is_server, struct packin_parse_state *state) +lsquic_gquic_parse_packet_in_begin (lsquic_packet_in_t *packet_in, + size_t length, int is_server, unsigned cid_len, + struct packin_parse_state *state) { int nbytes; enum PACKET_PUBLIC_FLAGS public_flags; const unsigned char *p = packet_in->pi_data; const unsigned char *const pend = packet_in->pi_data + length; + if (length > GQUIC_MAX_PACKET_SZ) + { + LSQ_DEBUG("Cannot handle packet_in_size(%zd) > %d packet incoming " + "packet's header", length, GQUIC_MAX_PACKET_SZ); + return -1; + } + CHECK_SPACE(1, p, pend); public_flags = *p++; @@ -53,7 +65,9 @@ lsquic_gquic_parse_packet_in_begin (struct lsquic_packet_in *packet_in, if (public_flags & PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID) { CHECK_SPACE(8, p, pend); - memcpy(&packet_in->pi_conn_id, p, 8); + memset(&packet_in->pi_conn_id, 0, sizeof(packet_in->pi_conn_id)); + packet_in->pi_conn_id.len = 8; + memcpy(&packet_in->pi_conn_id.idbuf, p, 8); packet_in->pi_flags |= PI_CONN_ID; p += 8; } @@ -138,6 +152,52 @@ lsquic_gquic_parse_packet_in_begin (struct lsquic_packet_in *packet_in, } +static const unsigned char simple_prst_payload[] = { + 'P', 'R', 'S', 'T', + 0x01, 0x00, 0x00, 0x00, + 'R', 'N', 'O', 'N', + 0x08, 0x00, 0x00, 0x00, + 1, 2, 3, 4, 5, 6, 7, 8, +}; + + +typedef char correct_simple_prst_size[(GQUIC_RESET_SZ == + 1 + GQUIC_CID_LEN + sizeof(simple_prst_payload)) - 1]; + + +ssize_t +lsquic_generate_gquic_reset (const lsquic_cid_t *cidp, + unsigned char *buf, size_t buf_sz) +{ + lsquic_cid_t cid; + + if (buf_sz < 1 + GQUIC_CID_LEN + sizeof(simple_prst_payload)) + { + errno = ENOBUFS; + return -1; + } + + if (cidp) + { + assert(GQUIC_CID_LEN == cidp->len); + cid = *cidp; + } + else + { + memset(&cid, 0, sizeof(cid)); + cid.len = GQUIC_CID_LEN; + } + + *buf++ = PACKET_PUBLIC_FLAGS_RST | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID; + + memcpy(buf, cid.idbuf, GQUIC_CID_LEN); + buf += GQUIC_CID_LEN; + + memcpy(buf, simple_prst_payload, sizeof(simple_prst_payload)); + return 1 + GQUIC_CID_LEN + sizeof(simple_prst_payload); +} + + static const enum quic_frame_type byte2frame_type_Q035_thru_Q039[0x100] = { [0x00] = QUIC_FRAME_PADDING, @@ -415,7 +475,8 @@ lsquic_turn_on_fin_Q035_thru_Q039 (unsigned char *stream_header) size_t -calc_stream_frame_header_sz_gquic (uint32_t stream_id, uint64_t offset) +calc_stream_frame_header_sz_gquic (lsquic_stream_id_t stream_id, + uint64_t offset, unsigned data_sz_IGNORED) { return /* Type */ @@ -438,14 +499,31 @@ calc_stream_frame_header_sz_gquic (uint32_t stream_id, uint64_t offset) } +static const char *const ecn2str[4] = +{ + [ECN_NOT_ECT] = "", + [ECN_ECT0] = "ECT(0)", + [ECN_ECT1] = "ECT(1)", + [ECN_CE] = "CE", +}; + + +#define ECN_COUNTS " ECT(0): 01234567879012345678790;" \ + " ECT(1): 01234567879012345678790;" \ + " CE: 01234567879012345678790" +#define RANGES_TRUNCATED " ranges truncated! " + char * acki2str (const struct ack_info *acki, size_t *sz) { size_t off, bufsz, nw; + enum ecn ecn; unsigned n; char *buf; - bufsz = acki->n_ranges * (3 /* [-] */ + 20 /* ~0ULL */ * 2); + bufsz = acki->n_ranges * (3 /* [-] */ + 20 /* ~0ULL */ * 2) + + (acki->flags & AI_ECN ? sizeof(ECN_COUNTS) : 0) + + (acki->flags & AI_TRUNCATED ? sizeof(RANGES_TRUNCATED) : 0); buf = malloc(bufsz); if (!buf) { @@ -464,6 +542,30 @@ acki2str (const struct ack_info *acki, size_t *sz) off += nw; } + if (acki->flags & AI_TRUNCATED) + { + nw = snprintf(buf + off, bufsz - off, RANGES_TRUNCATED); + if (nw > bufsz - off) + { + nw = bufsz - off; + goto end; + } + off += nw; + } + + if (acki->flags & AI_ECN) + { + for (ecn = 1; ecn <= 3; ++ecn) + { + nw = snprintf(buf + off, bufsz - off, " %s: %"PRIu64"%.*s", + ecn2str[ecn], acki->ecn_counts[ecn], ecn < 3, ";"); + if (nw > bufsz - off) + break; + off += nw; + } + } + + end: *sz = off; return buf; } @@ -487,19 +589,46 @@ lsquic_gquic_packout_size (const struct lsquic_conn *conn, { return lsquic_gquic_po_header_sz(packet_out->po_flags) + packet_out->po_data_sz - + QUIC_PACKET_HASH_SZ + + GQUIC_PACKET_HASH_SZ ; } size_t lsquic_gquic_packout_header_size (const struct lsquic_conn *conn, - enum packet_out_flags flags) + enum packet_out_flags flags, size_t dcid_len) { return lsquic_gquic_po_header_sz(flags); } +int +lsquic_gquic_gen_ver_nego_pkt (unsigned char *buf, size_t bufsz, + const lsquic_cid_t *cid, unsigned version_bitmask) +{ + int sz; + unsigned char *p = buf; + unsigned char *const pend = p + bufsz; + + CHECK_SPACE(1, p, pend); + *p = PACKET_PUBLIC_FLAGS_VERSION | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID; + ++p; + + if (GQUIC_CID_LEN != cid->len) + return -1; + + CHECK_SPACE(GQUIC_CID_LEN, p, pend); + memcpy(p, cid->idbuf, GQUIC_CID_LEN); + p += GQUIC_CID_LEN; + + sz = lsquic_gen_ver_tags(p, pend - p, version_bitmask); + if (sz < 0) + return -1; + + return p + sz - buf; +} + + unsigned lsquic_gquic_packno_bits2len (enum packno_bits bits) { diff --git a/src/liblsquic/lsquic_parse_ietf_v1.c b/src/liblsquic/lsquic_parse_ietf_v1.c new file mode 100644 index 000000000..d7de85ba2 --- /dev/null +++ b/src/liblsquic/lsquic_parse_ietf_v1.c @@ -0,0 +1,1945 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_parse_ietf_v1.c -- Parsing functions specific to IETF QUIC v1 + */ + +#include +#include +#include +#include +#include +#include +#include +#ifndef WIN32 +#include +#else +#include +#endif + +#include "lsquic_types.h" +#include "lsquic_int_types.h" +#include "lsquic_sizes.h" +#include "lsquic_packet_common.h" +#include "lsquic_packet_ietf.h" +#include "lsquic_packet_in.h" +#include "lsquic_packet_out.h" +#include "lsquic_parse.h" +#include "lsquic_parse_common.h" +#include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" +#include "lsquic_stream.h" +#include "lsquic_mm.h" +#include "lsquic_malo.h" +#include "lsquic_version.h" +#include "lsquic.h" +#include "lsquic_byteswap.h" +#include "lsquic_varint.h" +#include "lsquic_conn.h" +#include "lsquic_enc_sess.h" +#include "lsquic_trans_params.h" + +#define LSQUIC_LOGGER_MODULE LSQLM_PARSE +#include "lsquic_logger.h" + +#define CHECK_SPACE(need, pstart, pend) \ + do { if ((intptr_t) (need) > ((pend) - (pstart))) { return -1; } } while (0) + +static int +ietf_v1_gen_one_varint (unsigned char *, size_t, unsigned char, uint64_t); + +static int +ietf_v1_gen_two_varints (unsigned char *, size_t, unsigned char, uint64_t[2]); + +static void +ietf_v1_parse_packet_in_finish (lsquic_packet_in_t *packet_in, + struct packin_parse_state *state) +{ + /* Packet number is set to an invalid value. The packet number must + * be decrypted, which happens later. + */ + packet_in->pi_packno = 1ULL << 62; +} + + +/* Note: token size is not accounted for */ +static size_t +ietf_v1_packout_header_size_long_by_flags (const struct lsquic_conn *lconn, + enum header_type header_type, enum packet_out_flags flags, + size_t dcid_len) +{ + size_t sz; + enum packno_bits packno_bits; + + packno_bits = (flags >> POBIT_SHIFT) & 0x3; + + sz = 1 /* Type */ + + 4 /* Version */ + + 1 /* DCIL */ + + dcid_len + + 1 /* SCIL */ + + CN_SCID(lconn)->len + + (header_type == HETY_INITIAL) /* Token length */ + + 2 /* Always use two bytes to encode payload length */ + + iquic_packno_bits2len(packno_bits) + ; + + return sz; +} + + +static size_t +ietf_v1_packout_header_size_long_by_packet (const struct lsquic_conn *lconn, + const struct lsquic_packet_out *packet_out) +{ + size_t sz; + unsigned token_len; /* Need intermediate value to quiet compiler warning */ + enum packno_bits packno_bits; + + packno_bits = lsquic_packet_out_packno_bits(packet_out); + + sz = 1 /* Type */ + + 4 /* Version */ + + 1 /* DCIL */ + + packet_out->po_path->np_dcid.len + + 1 /* SCIL */ + + CN_SCID(lconn)->len + + (packet_out->po_header_type == HETY_INITIAL ? + (token_len = packet_out->po_token_len, + (1 << vint_val2bits(token_len)) + token_len) : 0) + + 2 /* Always use two bytes to encode payload length */ + + iquic_packno_bits2len(packno_bits) + ; + + return sz; +} + + +static size_t +ietf_v1_packout_header_size_short (const struct lsquic_conn *lconn, + enum packet_out_flags flags, size_t dcid_len) +{ + enum packno_bits bits; + size_t sz; + + bits = (flags >> POBIT_SHIFT) & 0x3; + sz = 1 /* Type */ + + (flags & PO_CONN_ID ? dcid_len : 0) + + iquic_packno_bits2len(bits) + ; + + return sz; +} + + +static size_t +ietf_v1_packout_max_header_size (const struct lsquic_conn *lconn, + enum packet_out_flags flags, size_t dcid_len) +{ + if (lconn->cn_flags & LSCONN_HANDSHAKE_DONE) + return ietf_v1_packout_header_size_short(lconn, flags, dcid_len); + else if (lconn->cn_flags & LSCONN_SERVER) + /* Server does not set the token in its Initial packet header: set + * the packet type to something else in order not to overestimate + * header size. + */ + return ietf_v1_packout_header_size_long_by_flags(lconn, HETY_HANDSHAKE, + flags, dcid_len); + else + return ietf_v1_packout_header_size_long_by_flags(lconn, HETY_INITIAL, + flags, dcid_len); +} + + +/* [draft-ietf-quic-transport-17] Section-17.2 */ +static const unsigned char header_type_to_bin[] = { + [HETY_INITIAL] = 0x0, + [HETY_0RTT] = 0x1, + [HETY_HANDSHAKE] = 0x2, + [HETY_RETRY] = 0x3, +}; + + +static unsigned +write_packno (unsigned char *p, lsquic_packno_t packno, + enum packno_bits bits) +{ + unsigned char *const begin = p; + + switch (bits) + { + case IQUIC_PACKNO_LEN_4: + *p++ = packno >> 24; + case IQUIC_PACKNO_LEN_3: + *p++ = packno >> 16; + case IQUIC_PACKNO_LEN_2: + *p++ = packno >> 8; + default: + *p++ = packno; + } + + return p - begin; +} + + +static int +gen_long_pkt_header (const struct lsquic_conn *lconn, + const struct lsquic_packet_out *packet_out, unsigned char *buf, + size_t bufsz) +{ + unsigned payload_len, bits; + enum packno_bits packno_bits; + lsquic_ver_tag_t ver_tag; + unsigned char *p; + unsigned token_len; + size_t need; + + need = ietf_v1_packout_header_size_long_by_packet(lconn, packet_out); + if (need > bufsz) + { + errno = EINVAL; + return -1; + } + + packno_bits = lsquic_packet_out_packno_bits(packet_out); + p = buf; + *p++ = 0xC0 + | ( header_type_to_bin[ packet_out->po_header_type ] << 4) + | packno_bits + ; + ver_tag = lsquic_ver2tag(lconn->cn_version); + memcpy(p, &ver_tag, sizeof(ver_tag)); + p += sizeof(ver_tag); + + *p++ = packet_out->po_path->np_dcid.len; + memcpy(p, packet_out->po_path->np_dcid.idbuf, packet_out->po_path->np_dcid.len); + p += packet_out->po_path->np_dcid.len; + *p++ = CN_SCID(lconn)->len; + memcpy(p, CN_SCID(lconn)->idbuf, CN_SCID(lconn)->len); + p += CN_SCID(lconn)->len; + + if (HETY_INITIAL == packet_out->po_header_type) + { + token_len = packet_out->po_token_len; + bits = vint_val2bits(token_len); + vint_write(p, token_len, bits, 1 << bits); + p += 1 << bits; + memcpy(p, packet_out->po_token, token_len); + p += token_len; + } + + payload_len = packet_out->po_data_sz + + lconn->cn_esf_c->esf_tag_len + + iquic_packno_bits2len(packno_bits); + bits = 1; /* Always use two bytes to encode payload length */ + vint_write(p, payload_len, bits, 1 << bits); + p += 1 << bits; + + p += write_packno(p, packet_out->po_packno, + lsquic_packet_out_packno_bits(packet_out)); + + return p - buf; +} + + +static int +gen_short_pkt_header (const struct lsquic_conn *lconn, + const struct lsquic_packet_out *packet_out, unsigned char *buf, + size_t bufsz) +{ + unsigned packno_len, cid_len, need; + enum packno_bits packno_bits; + + packno_bits = lsquic_packet_out_packno_bits(packet_out); + packno_len = iquic_packno_bits2len(packno_bits); + cid_len = packet_out->po_flags & PO_CONN_ID ? packet_out->po_path->np_dcid.len : 0; + + need = 1 + cid_len + packno_len; + if (need > bufsz) + return -1; + + buf[0] = 0x40 + | (lsquic_packet_out_spin_bit(packet_out) << 5) + | (lsquic_packet_out_key_phase(packet_out) << 2) + | packno_bits + ; + + if (cid_len) + memcpy(buf + 1, packet_out->po_path->np_dcid.idbuf, cid_len); + + (void) write_packno(buf + 1 + cid_len, packet_out->po_packno, packno_bits); + + return need; +} + + +static int +ietf_v1_gen_reg_pkt_header (const struct lsquic_conn *lconn, + const struct lsquic_packet_out *packet_out, unsigned char *buf, + size_t bufsz) +{ + if (packet_out->po_header_type == HETY_NOT_SET) + return gen_short_pkt_header(lconn, packet_out, buf, bufsz); + else + return gen_long_pkt_header(lconn, packet_out, buf, bufsz); +} + + +static void +ietf_v1_packno_info (const struct lsquic_conn *lconn, + const struct lsquic_packet_out *packet_out, unsigned *packno_off, + unsigned *packno_len) +{ + unsigned token_len; /* Need intermediate value to quiet compiler warning */ + + if (packet_out->po_header_type == HETY_NOT_SET) + *packno_off = 1 + + (packet_out->po_flags & PO_CONN_ID ? packet_out->po_path->np_dcid.len : 0); + else + *packno_off = 1 + + 4 + + 1 + + packet_out->po_path->np_dcid.len + + 1 + + CN_SCID(lconn)->len + + (packet_out->po_header_type == HETY_INITIAL ? + (token_len = packet_out->po_token_len, + (1 << vint_val2bits(token_len)) + token_len) : 0) + + 2; + *packno_len = iquic_packno_bits2len( + lsquic_packet_out_packno_bits(packet_out)); +} + + +static size_t +ietf_v1_packout_size (const struct lsquic_conn *lconn, + const struct lsquic_packet_out *packet_out) +{ + size_t sz; + + if ((lconn->cn_flags & LSCONN_HANDSHAKE_DONE) + && packet_out->po_header_type == HETY_NOT_SET) + sz = ietf_v1_packout_header_size_short(lconn, packet_out->po_flags, + packet_out->po_path->np_dcid.len); + else + sz = ietf_v1_packout_header_size_long_by_packet(lconn, packet_out); + + sz += packet_out->po_data_sz; + sz += lconn->cn_esf_c->esf_tag_len; + + return sz; +} + + +static int +ietf_v1_gen_stream_frame (unsigned char *buf, size_t buf_len, + lsquic_stream_id_t stream_id, uint64_t offset, int fin, size_t size, + gsf_read_f gsf_read, void *stream) +{ + /* 0b00001XXX + * 0x4 OFF + * 0x2 LEN + * 0x1 FIN + */ + unsigned sbits, obits, dbits; + unsigned slen, olen, dlen; + unsigned char *p = buf + 1; + + assert(!!fin ^ !!size); + + /* We do not check that stream_id, offset, and size are smaller + * than 2^62: this is not necessary, as this code will never generate + * this many stream IDs, nor will it even transfer this much data. + * The size is limited by our own code. + */ + + sbits = vint_val2bits(stream_id); + slen = 1 << sbits; + if (offset) + { + obits = vint_val2bits(offset); + olen = 1 << obits; + } + else + olen = 0; + + if (!fin) + { + unsigned n_avail; + size_t nr; + + n_avail = buf_len - (p + slen + olen - buf); + + /* If we cannot fill remaining buffer, we need to include data + * length. + */ + if (size < n_avail) + { + dbits = vint_val2bits(size); + dlen = 1 << dbits; + n_avail -= dlen; + if (size > n_avail) + size = n_avail; + } + else + { + dlen = 0; + size = n_avail; + } + + CHECK_STREAM_SPACE(1 + olen + slen + dlen + + + 1 /* We need to write at least 1 byte */, buf, buf + buf_len); + + vint_write(p, stream_id, sbits, slen); + p += slen; + + if (olen) + vint_write(p, offset, obits, olen); + p += olen; + + /* Read as much as we can */ + nr = gsf_read(stream, p + dlen, size, &fin); + assert(nr != 0); + assert(nr <= size); + + if (dlen) + vint_write(p, nr, dbits, dlen); + + p += dlen + nr; + } + else + { + dlen = 1 + slen + olen < buf_len; + CHECK_STREAM_SPACE(1 + slen + olen + dlen, buf, buf + buf_len); + vint_write(p, stream_id, sbits, slen); + p += slen; + if (olen) + vint_write(p, offset, obits, olen); + p += olen; + if (dlen) + *p++ = 0; + } + + buf[0] = 0x08 + | (!!olen << 2) + | (!!dlen << 1) + | (!!fin << 0) + ; + return p - buf; +} + + +static int +ietf_v1_gen_crypto_frame (unsigned char *buf, size_t buf_len, + uint64_t offset, size_t size, gcf_read_f gcf_read, void *stream) +{ + unsigned char *const end = buf + buf_len; + unsigned char *p; + unsigned obits, dbits; + unsigned olen, dlen; + size_t nr, n_avail; + + obits = vint_val2bits(offset); + olen = 1 << obits; + dbits = vint_val2bits(size); + dlen = 1 << dbits; + + CHECK_SPACE(1 + olen + dlen + + (dlen > 0) /* We need to write at least 1 byte */, buf, end); + + n_avail = end - buf - 1 - olen - dlen; + if (n_avail < size) + size = n_avail; + + p = buf; + *p++ = 0x06; + + vint_write(p, offset, obits, olen); + p += olen; + + nr = gcf_read(stream, p + dlen, size); + assert(nr != 0); /* This indicates error in the caller */ + assert(nr <= size); /* This also indicates an error in the caller */ + + vint_write(p, nr, dbits, dlen); + p += dlen + nr; + + return p - buf; +} + + +/* return parsed (used) buffer length */ +static int +ietf_v1_parse_stream_frame (const unsigned char *buf, size_t rem_packet_sz, + struct stream_frame *stream_frame) +{ + /* 0b00001XXX + * 0x4 OFF + * 0x2 LEN + * 0x1 FIN + */ + const unsigned char *const pend = buf + rem_packet_sz; + const unsigned char *p = buf; + lsquic_stream_id_t stream_id; + uint64_t offset, data_sz; + int r; + + CHECK_SPACE(1, p, pend); + const char type = *p++; + + r = vint_read(p, pend, &stream_id); + if (r < 0) + return -1; + p += r; + + if (type & 0x4) + { + r = vint_read(p, pend, &offset); + if (r < 0) + return -1; + p += r; + } + else + offset = 0; + + if (type & 0x2) + { + r = vint_read(p, pend, &data_sz); + if (r < 0) + return -1; + p += r; + CHECK_SPACE(data_sz, p, pend); + } + else + data_sz = pend - p; + + stream_frame->stream_id = stream_id; + stream_frame->data_frame.df_fin = type & 0x1; + stream_frame->data_frame.df_offset = offset; + stream_frame->data_frame.df_size = data_sz; + stream_frame->data_frame.df_data = p; + stream_frame->data_frame.df_read_off= 0; + stream_frame->packet_in = NULL; + + assert(p <= pend); + + return p + data_sz - (unsigned char *) buf; +} + + +static int +ietf_v1_parse_crypto_frame (const unsigned char *buf, size_t rem_packet_sz, + struct stream_frame *stream_frame) +{ + const unsigned char *const pend = buf + rem_packet_sz; + const unsigned char *p = buf; + uint64_t offset, data_sz; + int r; + + CHECK_SPACE(1, p, pend); + + assert(0x06 == *p); + ++p; + + r = vint_read(p, pend, &offset); + if (r < 0) + return -1; + p += r; + + r = vint_read(p, pend, &data_sz); + if (r < 0) + return -1; + p += r; + CHECK_SPACE(data_sz, p, pend); + + stream_frame->stream_id = ~0ULL; /* Unset */ + stream_frame->data_frame.df_fin = 0; + stream_frame->data_frame.df_offset = offset; + stream_frame->data_frame.df_size = data_sz; + stream_frame->data_frame.df_data = p; + stream_frame->data_frame.df_read_off= 0; + stream_frame->packet_in = NULL; + + assert(p <= pend); + + return p + data_sz - (unsigned char *) buf; +} + + + +#if __GNUC__ +# define UNLIKELY(cond) __builtin_expect(cond, 0) +#else +# define UNLIKELY(cond) cond +#endif + + +/* Bits 10 (2) is ECT(0); * bits 01 (1) is ECT(1). */ +static const int ecnmap[4] = { 0, 2, 1, 3, }; + + +static int +ietf_v1_parse_ack_frame (const unsigned char *const buf, size_t buf_len, + struct ack_info *ack, uint8_t exp) +{ + const unsigned char *p = buf; + const unsigned char *const end = buf + buf_len; + uint64_t block_count, gap, block; + enum ecn ecn; + unsigned i; + int r; + + ++p; + r = vint_read(p, end, &ack->ranges[0].high); + if (UNLIKELY(r < 0)) + return -1; + p += r; + r = vint_read(p, end, &ack->lack_delta); + if (UNLIKELY(r < 0)) + return -1; + p += r; + ack->lack_delta <<= exp; + r = vint_read(p, end, &block_count); + if (UNLIKELY(r < 0)) + return -1; + p += r; + r = vint_read(p, end, &block); + if (UNLIKELY(r < 0)) + return -1; + ack->ranges[0].low = ack->ranges[0].high - block; + if (UNLIKELY(ack->ranges[0].high < ack->ranges[0].low)) + return -1; + p += r; + + for (i = 1; i <= block_count; ++i) + { + r = vint_read(p, end, &gap); + if (UNLIKELY(r < 0)) + return -1; + p += r; + r = vint_read(p, end, &block); + if (UNLIKELY(r < 0)) + return -1; + p += r; + if (i < sizeof(ack->ranges) / sizeof(ack->ranges[0])) + { + ack->ranges[i].high = ack->ranges[i - 1].low - gap - 2; + ack->ranges[i].low = ack->ranges[i].high - block; + if (UNLIKELY(ack->ranges[i].high >= ack->ranges[i - 1].low + || ack->ranges[i].high < ack->ranges[i].low)) + return -1; + } + } + + if (i < sizeof(ack->ranges) / sizeof(ack->ranges[0])) + { + ack->flags = 0; + ack->n_ranges = block_count + 1; + } + else + { + ack->flags = AI_TRUNCATED; + ack->n_ranges = sizeof(ack->ranges) / sizeof(ack->ranges[0]); + } + + + if (0x03 == buf[0]) + { + for (ecn = 1; ecn <= 3; ++ecn) + { + r = vint_read(p, end, &ack->ecn_counts[ecnmap[ecn]]); + if (UNLIKELY(r < 0)) + return -1; + p += r; + } + ack->flags |= AI_ECN; + } + +#if LSQUIC_PARSE_ACK_TIMESTAMPS +#error Pasing ACK timestamps not supported +#else + ack->n_timestamps = 0; +#endif + + return p - buf; +} + + +static unsigned +ietf_v1_rst_frame_size (lsquic_stream_id_t stream_id, uint64_t error_code, + uint64_t final_size) +{ + return 1 /* Type */ + + vint_size(stream_id) /* Stream ID (i) */ + + vint_size(error_code) /* Application Error Code (i) */ + + vint_size(final_size); /* Final Size (i) */ +} + + +static int +ietf_v1_gen_rst_frame (unsigned char *buf, size_t buf_len, + lsquic_stream_id_t stream_id, uint64_t error_code, uint64_t final_size) +{ + unsigned vbits; + unsigned char *p; + + if (buf_len < ietf_v1_rst_frame_size(stream_id, error_code, final_size)) + return -1; + p = buf; + + *p++ = 0x04; + /* Stream ID (i) */ + vbits = vint_val2bits(stream_id); + vint_write(p, stream_id, vbits, 1 << vbits); + p += 1 << vbits; + + /* Application Error Code (i) */ + vbits = vint_val2bits(error_code); + vint_write(p, error_code, vbits, 1 << vbits); + p += 1 << vbits; + + /* Final Size (i) */ + vbits = vint_val2bits(final_size); + vint_write(p, final_size, vbits, 1 << vbits); + p += 1 << vbits; + + return p - buf; +} + + +static int +ietf_v1_parse_rst_frame (const unsigned char *buf, size_t buf_len, + lsquic_stream_id_t *stream_id_p, uint64_t *final_size_p, uint64_t *error_code_p) +{ + const unsigned char *p = buf + 1; + const unsigned char *const end = buf + buf_len; + uint64_t stream_id, final_size, error_code; + int r; + + /* Stream ID (i) */ + r = vint_read(p, end, &stream_id); + if (r < 0) + return r; + p += r; + + /* Application Error Code (i) */ + r = vint_read(p, end, &error_code); + if (r < 0) + return r; + p += r; + + /* Final Size (i) */ + r = vint_read(p, end, &final_size); + if (r < 0) + return r; + p += r; + + *stream_id_p = stream_id; + *final_size_p = final_size; + *error_code_p = error_code; + + return p - buf; +} + + +static int +ietf_v1_parse_stop_sending_frame (const unsigned char *buf, size_t buf_len, + lsquic_stream_id_t *stream_id, uint64_t *error_code) +{ + const unsigned char *p = buf + 1; + const unsigned char *const end = buf + buf_len; + int r; + + r = vint_read(p, end, stream_id); + if (r < 0) + return r; + p += r; + + r = vint_read(p, end, error_code); + if (r < 0) + return r; + p += r; + + return p - buf; +} + + +static int +ietf_v1_gen_stop_sending_frame (unsigned char *buf, size_t len, + lsquic_stream_id_t stream_id, uint64_t error_code) +{ + return ietf_v1_gen_two_varints(buf, len, 0x05, (uint64_t[]){ stream_id, + error_code, }); +} + + +static unsigned +ietf_v1_stop_sending_frame_size (lsquic_stream_id_t val, uint64_t error_code) +{ + return 1 + vint_size(val) + vint_size(error_code); +} + + +static int +ietf_v1_parse_new_token_frame (const unsigned char *buf, size_t buf_len, + const unsigned char **token, size_t *token_size_p) +{ + uint64_t token_size; + const unsigned char *p = buf + 1; + const unsigned char *const end = buf + buf_len; + int r; + + r = vint_read(p, end, &token_size); + if (r < 0) + return r; + p += r; + + if (p + token_size > end) + return -1; + *token = p; + p += token_size; + *token_size_p = token_size; + + return p - buf; +} + + +static int +ietf_v1_gen_ping_frame (unsigned char *buf, int buf_len) +{ + if (buf_len > 0) + { + buf[0] = 0x01; + return 1; + } + else + return -1; +} + + +static int +ietf_v1_gen_connect_close_frame (unsigned char *buf, size_t buf_len, + int app_error, unsigned error_code, const char *reason, int reason_len) +{ + size_t needed; + unsigned bits_error, bits_reason; + unsigned char *p; + + assert(!!reason == !!reason_len); + + bits_reason = vint_val2bits(reason_len); + bits_error = vint_val2bits(error_code); + needed = 1 /* Type */ + (1 << bits_error) + + (app_error ? 0 : 1) /* Frame type */ + /* TODO: frame type instead of just zero */ + + (1 << bits_reason) + reason_len; + + if (buf_len < needed) + return -1; + + p = buf; + *p = 0x1C + !!app_error; + ++p; + vint_write(p, error_code, bits_error, 1 << bits_error); + p += 1 << bits_error; + if (!app_error) + *p++ = 0; /* Frame type */ /* TODO */ + vint_write(p, reason_len, bits_reason, 1 << bits_reason); + p += 1 << bits_reason; + if (reason_len) + { + memcpy(p, reason, reason_len); + p += reason_len; + } + + assert((unsigned) (p - buf) == needed); + return p - buf; +} + + +static int +ietf_v1_parse_connect_close_frame (const unsigned char *buf, size_t buf_len, + int *app_error_p, uint64_t *error_code, uint16_t *reason_len, + uint8_t *reason_offset) +{ + const unsigned char *const pend = buf + buf_len; + const unsigned char *p = buf + 1; + uint64_t len; + ptrdiff_t off; + int app_error, r; + + r = vint_read(p, pend, error_code); + if (r < 0) + return -1; + p += r; + + app_error = buf[0] == 0x1D; + if (!app_error) + { + r = vint_read(p, pend, &len); + if (r < 0) + return -1; + p += r; + } + + r = vint_read(p, pend, &len); + if (r < 0) + return -1; + if (len > UINT16_MAX) + return -1; + p += r; + + off = p - buf; + if (buf_len < off + len) + return -2; + + *app_error_p = app_error; + *reason_len = len; + *reason_offset = off; + return off + len; +} + + +/* Returns number of bytes written or -1 on failure */ +/* This function makes an assumption that there is at least one range */ +static int +ietf_v1_gen_ack_frame (unsigned char *outbuf, size_t outbuf_sz, + gaf_rechist_first_f rechist_first, gaf_rechist_next_f rechist_next, + gaf_rechist_largest_recv_f rechist_largest_recv, + void *rechist, lsquic_time_t now, int *has_missing, + lsquic_packno_t *largest_received, const uint64_t *ecn_counts) +{ + unsigned char *block_count_p, *p = outbuf; + unsigned char *const end = p + outbuf_sz; + lsquic_time_t time_diff; + lsquic_packno_t packno_diff, gap, prev_low, maxno, rsize; + size_t sz; + const struct lsquic_packno_range *range; + unsigned a, b, c, addl_ack_blocks; + unsigned bits[4]; + enum ecn ecn; + +#define AVAIL() (end - p) + +#define CHECKOUT(sz) do { \ + if ((intptr_t) (sz) > AVAIL()) { \ + errno = ENOBUFS; \ + return -1; \ + } \ +} while (0) + + range = rechist_first(rechist); + if (!range) + { + errno = EINVAL; + return -1; + } + // LSQ_DEBUG("range [%"PRIu64" - %"PRIu64"]", range->high, range->low); + + time_diff = now - rechist_largest_recv(rechist); + time_diff >>= TP_DEF_ACK_DELAY_EXP; + + maxno = range->high; + packno_diff = maxno - range->low; + + a = vint_val2bits(maxno); + b = vint_val2bits(time_diff); + c = vint_val2bits(packno_diff); + sz = 1 /* Type */ + + (1 << a) /* Largest Acknowledged */ + + (1 << b) /* ACK Delay */ + + 1 /* ACK Block Count */ + + (1 << c) /* ACK Blocks */ + ; + + CHECKOUT(sz); + + *p = 0x02 + !!ecn_counts; + ++p; + + vint_write(p, maxno, a, 1 << a); + p += 1 << a; + vint_write(p, time_diff, b, 1 << b); + p += 1 << b; + block_count_p = p; + p += 1; /* Initial guess that we have fewer than 64 additional ACK Blocks */ + vint_write(p, packno_diff, c, 1 << c); + p += 1 << c; + + prev_low = range->low; + addl_ack_blocks = 0; + while ((range = rechist_next(rechist))) + { + // LSQ_DEBUG("range [%"PRIu64" - %"PRIu64"]", range->high, range->low); + gap = prev_low - range->high - 1; + rsize = range->high - range->low; + a = vint_val2bits(gap - 1); + b = vint_val2bits(rsize); + if (addl_ack_blocks == VINT_MAX_ONE_BYTE) + { + memmove(block_count_p + 2, block_count_p + 1, + p - block_count_p - 1); + ++p; + } + CHECKOUT((1 << a) + (1 << b)); + vint_write(p, gap - 1, a, 1 << a); + p += 1 << a; + vint_write(p, rsize, b, 1 << b); + p += 1 << b; + ++addl_ack_blocks; + prev_low = range->low; + } + + /* Here we assume that addl_ack_blocks < (1 << 14), which is a safe + * assumption to make. + */ + vint_write(block_count_p, addl_ack_blocks, + addl_ack_blocks > VINT_MAX_ONE_BYTE, + 1 + (addl_ack_blocks > VINT_MAX_ONE_BYTE)); + + if (ecn_counts) + { + for (ecn = 1; ecn <= 3; ++ecn) + bits[ecn] = vint_val2bits(ecn_counts[ecn]); + CHECKOUT((1 << bits[1]) + (1 << bits[2]) + (1 << bits[3])); + for (ecn = 1; ecn <= 3; ++ecn) + { + vint_write(p, ecn_counts[ecnmap[ecn]], bits[ecnmap[ecn]], 1 << bits[ecnmap[ecn]]); + p += 1 << bits[ecnmap[ecn]]; + } + } + + *has_missing = addl_ack_blocks > 0; + *largest_received = maxno; + return p - (unsigned char *) outbuf; + +#undef CHECKOUT +#undef AVAIL +} + + +static size_t +ietf_v1_calc_stream_frame_header_sz (lsquic_stream_id_t stream_id, + uint64_t offset, unsigned data_sz) +{ + if (offset) + return 1 + + (1 << vint_val2bits(stream_id)) + + (1 << vint_val2bits(data_sz)) + + (1 << vint_val2bits(offset)); + else + return 1 + + (1 << vint_val2bits(data_sz)) + + (1 << vint_val2bits(stream_id)); +} + + +static size_t +ietf_v1_calc_crypto_frame_header_sz (uint64_t offset) +{ + return 1 /* Frame type */ + + (1 << vint_val2bits(offset)) + + 1 /* Data len */ + ; +} + + +static enum quic_frame_type +ietf_v1_parse_frame_type (unsigned char byte) +{ + return lsquic_iquic_byte2type[byte]; +} + + +static unsigned +ietf_v1_path_chal_frame_size (void) +{ + return 1 + sizeof(uint64_t); +} + + +static int +ietf_v1_gen_path_chal_frame (unsigned char *buf, size_t len, uint64_t chal) +{ + if (len >= 1 + sizeof(chal)) + { + *buf = 0x1A; + memcpy(buf + 1, &chal, sizeof(chal)); + return 1 + sizeof(chal); + } + else + return -1; +} + + +static int +ietf_v1_parse_path_chal_frame (const unsigned char *buf, size_t len, + uint64_t *chal) +{ + if (len >= 9) + { + memcpy(chal, buf + 1, 8); + return 9; + } + else + return -1; +} + + +static unsigned +ietf_v1_path_resp_frame_size (void) +{ + return 1 + sizeof(uint64_t); +} + + +static int +ietf_v1_gen_path_resp_frame (unsigned char *buf, size_t len, uint64_t resp) +{ + if (len >= 1 + sizeof(resp)) + { + *buf = 0x1B; + memcpy(buf + 1, &resp, sizeof(resp)); + return 1 + sizeof(resp); + } + else + return -1; +} + + +static int +ietf_v1_parse_path_resp_frame (const unsigned char *buf, size_t len, + uint64_t *resp) +{ + return ietf_v1_parse_path_chal_frame(buf, len, resp); +} + + +void +ietf_v1_turn_on_fin (unsigned char *stream_frame_header) +{ + *stream_frame_header |= 1; +} + + +static unsigned +ietf_v1_packno_bits2len (enum packno_bits bits) +{ + return iquic_packno_bits2len(bits); +} + + +static enum packno_bits +ietf_v1_calc_packno_bits (lsquic_packno_t packno, + lsquic_packno_t least_unacked, uint64_t n_in_flight) +{ + uint64_t delta; + unsigned bits; + + delta = packno - least_unacked; + if (n_in_flight > delta) + delta = n_in_flight; + + delta *= 4; + bits = (delta >= (1ULL << 8)) + + (delta >= (1ULL << 16)) + + (delta >= (1ULL << 24)) + ; + + return bits; +} + + +static int +ietf_v1_parse_one_varint (const unsigned char *buf, size_t len, uint64_t *val) +{ + int s; + + s = vint_read(buf + 1, buf + len, val); + if (s >= 0) + return 1 + s; + else + return s; +} + + +static int +ietf_v1_gen_one_varint (unsigned char *buf, size_t len, + unsigned char type, uint64_t val) +{ + unsigned vbits; + unsigned char *p; + + vbits = vint_val2bits(val); + + if (1u + (1u << vbits) > len) + return -1; + + p = buf; + *p++ = type; + vint_write(p, val, vbits, 1 << vbits); + p += 1 << vbits; + + return p - buf; +} + + +static int +ietf_v1_gen_blocked_frame (unsigned char *buf, size_t buf_len, uint64_t off) +{ + return ietf_v1_gen_one_varint(buf, buf_len, 0x14, off); +} + + +static int +ietf_v1_parse_blocked_frame (const unsigned char *buf, size_t sz, uint64_t *off) +{ + return ietf_v1_parse_one_varint(buf, sz, off); +} + + +static unsigned +ietf_v1_blocked_frame_size (uint64_t off) +{ + return 1 + vint_size(off); +} + + +static int +ietf_v1_parse_max_data (const unsigned char *buf, size_t len, uint64_t *val) +{ + return ietf_v1_parse_one_varint(buf, len, val); +} + + +static int +ietf_v1_gen_max_data_frame (unsigned char *buf, size_t len, uint64_t val) +{ + return ietf_v1_gen_one_varint(buf, len, 0x10, val); +} + + +static unsigned +ietf_v1_max_data_frame_size (uint64_t val) +{ + return 1 + vint_size(val); +} + + +static int +ietf_v1_parse_retire_cid_frame (const unsigned char *buf, size_t len, + uint64_t *val) +{ + return ietf_v1_parse_one_varint(buf, len, val); +} + + +static int +ietf_v1_gen_retire_cid_frame (unsigned char *buf, size_t len, uint64_t val) +{ + return ietf_v1_gen_one_varint(buf, len, 0x19, val); +} + + +static size_t +ietf_v1_retire_cid_frame_size (uint64_t val) +{ + return 1 + vint_size(val); +} + + +static int +ietf_v1_parse_new_conn_id (const unsigned char *buf, size_t len, + uint64_t *seqno, uint64_t *retire_prior_to, + lsquic_cid_t *cid, const unsigned char **reset_token) +{ + const unsigned char *p = buf + 1; + const unsigned char *const end = buf + len; + unsigned char cid_len; + int s; + + s = vint_read(p, end, seqno); + if (s < 0) + return s; + p += s; + + s = vint_read(p, end, retire_prior_to); + if (s < 0) + return s; + p += s; + + if (p >= end) + return -1; + + cid_len = *p++; + + if ((unsigned) (end - p) < cid_len + IQUIC_SRESET_TOKEN_SZ) + return -1; + cid->len = cid_len; + memcpy(cid->idbuf, p, cid_len); + p += cid_len; + if (reset_token) + *reset_token = p; + p += IQUIC_SRESET_TOKEN_SZ; + + return p - buf; +} + + +/* Size of a frame that contains two varints */ +static unsigned +ietf_v1_two_varints_size (uint64_t vals[2]) +{ + unsigned vbits[2]; + + vbits[0] = vint_val2bits(vals[0]); + vbits[1] = vint_val2bits(vals[1]); + return 1u + (1u << vbits[0]) + (1u << vbits[1]); +} + + +static int +ietf_v1_gen_two_varints (unsigned char *buf, size_t len, + unsigned char type, uint64_t vals[2]) +{ + unsigned vbits[2]; + unsigned char *p; + + vbits[0] = vint_val2bits(vals[0]); + vbits[1] = vint_val2bits(vals[1]); + + if (1u + (1u << vbits[0]) + (1u << vbits[1]) > len) + return -1; + + p = buf; + *p++ = type; + vint_write(p, vals[0], vbits[0], 1 << vbits[0]); + p += 1 << vbits[0]; + vint_write(p, vals[1], vbits[1], 1 << vbits[1]); + p += 1 << vbits[1]; + + return p - buf; +} + + +static int +ietf_v1_parse_two_varints (const unsigned char *buf, size_t len, uint64_t *vals[2]) +{ + const unsigned char *p = buf; + const unsigned char *const end = p + len; + int s; + + if (len < 2) + return -1; + + ++p; /* Type */ + + s = vint_read(p, end, vals[0]); + if (s < 0) + return s; + p += s; + + s = vint_read(p, end, vals[1]); + if (s < 0) + return s; + p += s; + + return p - buf; +} + + +static int +ietf_v1_parse_stream_blocked_frame (const unsigned char *buf, size_t len, + lsquic_stream_id_t *stream_id, uint64_t *offset) +{ + return ietf_v1_parse_two_varints(buf, len, + (uint64_t *[]) { stream_id, offset, }); +} + + +static unsigned +ietf_v1_stream_blocked_frame_size (lsquic_stream_id_t stream_id, uint64_t off) +{ + return ietf_v1_two_varints_size((uint64_t []) { stream_id, off, }); +} + + +static int +ietf_v1_gen_streams_blocked_frame (unsigned char *buf, size_t len, + enum stream_dir sd, uint64_t limit) +{ + return ietf_v1_gen_one_varint(buf, len, 0x16 + (sd == SD_UNI), limit); +} + + +static int +ietf_v1_parse_streams_blocked_frame (const unsigned char *buf, size_t len, + enum stream_dir *sd, uint64_t *limit) +{ + int s; + + s = ietf_v1_parse_one_varint(buf, len, limit); + if (s > 0) + { + if (buf[0] == 0x16) + *sd = SD_BIDI; + else + *sd = SD_UNI; + } + return s; +} + + +static unsigned +ietf_v1_streams_blocked_frame_size (uint64_t limit) +{ + return 1 + vint_size(limit); +} + + +static int +ietf_v1_gen_stream_blocked_frame (unsigned char *buf, size_t len, + lsquic_stream_id_t stream_id, uint64_t off) +{ + return ietf_v1_gen_two_varints(buf, len, 0x15, (uint64_t[]){ stream_id, off, }); +} + + +static int +ietf_v1_gen_max_stream_data_frame (unsigned char *buf, size_t len, + lsquic_stream_id_t stream_id, uint64_t off) +{ + return ietf_v1_gen_two_varints(buf, len, 0x11, (uint64_t[]){ stream_id, off, }); +} + + +static unsigned +ietf_v1_max_stream_data_frame_size (lsquic_stream_id_t stream_id, uint64_t off) +{ + return ietf_v1_two_varints_size((uint64_t []) { stream_id, off, }); +} + + + +static int +ietf_v1_parse_max_stream_data_frame (const unsigned char *buf, size_t len, + lsquic_stream_id_t *stream_id, uint64_t *off) +{ + return ietf_v1_parse_two_varints(buf, len, (uint64_t *[]){ stream_id, off, }); +} + + +static int +ietf_v1_parse_max_streams_frame (const unsigned char *buf, size_t len, + enum stream_dir *sd, uint64_t *max_streams) +{ + int s; + + s = ietf_v1_parse_one_varint(buf, len, max_streams); + if (s > 0) + *sd = buf[0] == 0x12 ? SD_BIDI : SD_UNI; + return s; +} + + +static int +ietf_v1_gen_max_streams_frame (unsigned char *buf, size_t len, + enum stream_dir sd, uint64_t limit) +{ + return ietf_v1_gen_one_varint(buf, len, 0x12 + (sd == SD_UNI), limit); +} + + +static unsigned +ietf_v1_max_streams_frame_size (uint64_t limit) +{ + return 1 + vint_size(limit); +} + + +static size_t +ietf_v1_new_token_frame_size (size_t token_sz) +{ + unsigned bits; + + bits = vint_val2bits(token_sz); + return 1 + (1 << bits) + token_sz; +} + + +int +ietf_v1_gen_new_token_frame (unsigned char *buf, size_t buf_sz, + const unsigned char *token, size_t token_sz) +{ + unsigned char *p; + unsigned bits; + + bits = vint_val2bits(token_sz); + if (buf_sz < 1 + (1 << bits) + token_sz) + { + errno = ENOBUFS; + return -1; + } + + p = buf; + *p++ = 0x07; + vint_write(p, token_sz, bits, 1 << bits); + p += 1 << bits; + memcpy(p, token, token_sz); + p += token_sz; + + return p - buf; +} + + +static size_t +ietf_v1_new_connection_id_frame_size (unsigned seqno, unsigned scid_len) +{ + unsigned bits; + + bits = vint_val2bits(seqno); + return 1 /* Frame Type */ + + (1 << bits) /* Sequence Number */ + + 1 /* Retire Prior To (we always set it to zero */ + + 1 /* CID length */ + + scid_len + + IQUIC_SRESET_TOKEN_SZ; +} + + +int +ietf_v1_gen_new_connection_id_frame (unsigned char *buf, size_t buf_sz, + unsigned seqno, const struct lsquic_cid *cid, + const unsigned char *token, size_t token_sz) +{ + unsigned char *p; + unsigned bits; + + if (buf_sz < ietf_v1_new_connection_id_frame_size(seqno, cid->len)) + return -1; + + p = buf; + *p++ = 0x18; + bits = vint_val2bits(seqno); + vint_write(p, seqno, bits, 1 << bits); + p += 1 << bits; + *p++ = 0; /* Retire Prior To */ + *p++ = cid->len; + memcpy(p, cid->idbuf, cid->len); + p += cid->len; + memcpy(p, token, token_sz); + p += token_sz; + + return p - buf; +} + + +/* [draft-ietf-quic-transport-17] Section-17.2 */ +static const enum header_type bits2ht[4] = +{ + [0] = HETY_INITIAL, + [1] = HETY_0RTT, + [2] = HETY_HANDSHAKE, + [3] = HETY_RETRY, +}; + + +int +lsquic_ietf_v1_parse_packet_in_long_begin (struct lsquic_packet_in *packet_in, + size_t length, int is_server, unsigned cid_len, + struct packin_parse_state *state) +{ + const unsigned char *p = packet_in->pi_data; + const unsigned char *const end = p + length; + lsquic_ver_tag_t tag; + enum header_type header_type; + unsigned dcil, scil, odcil; + int verneg, r; + unsigned char first_byte; + uint64_t payload_len, token_len; + + if (length < 6) + return -1; + first_byte = *p++; + + memcpy(&tag, p, 4); + p += 4; + verneg = 0 == tag; + if (!verneg) + header_type = bits2ht[ (first_byte >> 4) & 3 ]; + else + header_type = HETY_VERNEG; + + packet_in->pi_header_type = header_type; + + dcil = *p++; + if (p + dcil >= end || dcil > MAX_CID_LEN) + return -1; + if (dcil) + { + memcpy(packet_in->pi_dcid.idbuf, p, dcil); + packet_in->pi_flags |= PI_CONN_ID; + p += dcil; + } + packet_in->pi_dcid.len = dcil; + + scil = *p++; + if (p + scil > end || scil > MAX_CID_LEN) + return -1; + if (scil) + { + packet_in->pi_scid_off = p - packet_in->pi_data; + p += scil; + } + packet_in->pi_scid_len = scil; + + switch (header_type) + { + case HETY_INITIAL: + if (dcil < MIN_INITIAL_DCID_LEN) + return -1; + r = vint_read(p, end, &token_len); + if (r < 0) + return -1; + if (token_len && !is_server) + { + /* From [draft-ietf-quic-transport-14]: + * + * Token Length: A variable-length integer specifying the + * length of the Token field, in bytes. This value is zero + * if no token is present. Initial packets sent by the + * server MUST set the Token Length field to zero; clients + * that receive an Initial packet with a non-zero Token + * Length field MUST either discard the packet or generate + * a connection error of type PROTOCOL_VIOLATION. + */ + return -1; + } + p += r; + if (token_len) + { + if (token_len >= + 1ull << (sizeof(packet_in->pi_token_size) * 8)) + return -1; + if (p + token_len > end) + return -1; + packet_in->pi_token = p - packet_in->pi_data; + packet_in->pi_token_size = token_len; + p += token_len; + } + /* fall-through */ + case HETY_HANDSHAKE: + case HETY_0RTT: + if (p >= end) + return -1; + r = vint_read(p, end, &payload_len); + if (r < 0) + return -1; + p += r; + if (p - packet_in->pi_data + payload_len > length) + return -1; + length = p - packet_in->pi_data + payload_len; + if (end - p < 4) + return -1; + state->pps_p = p - r; + state->pps_nbytes = r; + packet_in->pi_quic_ver = 1; + break; + case HETY_RETRY: + if (p >= end) + return -1; + odcil = *p++; + if (p + odcil > end || odcil > MAX_CID_LEN) + return -1; + packet_in->pi_odcid_len = odcil; + packet_in->pi_odcid = p - packet_in->pi_data; + p += odcil; + packet_in->pi_token = p - packet_in->pi_data; + packet_in->pi_token_size = end - p; + p = end; + length = end - packet_in->pi_data; + state->pps_p = NULL; + state->pps_nbytes = 0; + packet_in->pi_quic_ver = 1; + break; + default: + assert(header_type == HETY_VERNEG); + if (p >= end || (3 & (uintptr_t) (end - p))) + return -1; + packet_in->pi_quic_ver = p - packet_in->pi_data; + p = end; + state->pps_p = NULL; + state->pps_nbytes = 0; + break; + } + + packet_in->pi_header_sz = p - packet_in->pi_data; + packet_in->pi_data_sz = length; + packet_in->pi_nonce = 0; + packet_in->pi_refcnt = 0; + packet_in->pi_frame_types = 0; + memset(&packet_in->pi_next, 0, sizeof(packet_in->pi_next)); + packet_in->pi_refcnt = 0; + packet_in->pi_received = 0; + + /* Packet number is set to an invalid value. The packet number must + * be decrypted, which happens later. + */ + packet_in->pi_packno = 1ULL << 62; + + return 0; +} + + +/* Is this a valid Initial packet? We take the perspective of the server. */ +int +lsquic_is_valid_ietf_v1_or_Q046_hs_packet (const unsigned char *buf, + size_t length, lsquic_ver_tag_t *tagp) +{ + const unsigned char *p = buf; + const unsigned char *const end = p + length; + lsquic_ver_tag_t tag; + enum header_type header_type; + unsigned dcil, scil; + int r; + unsigned char first_byte; + uint64_t payload_len, token_len, packet_len; + + if (length < 6) + return 0; + first_byte = *p++; + + header_type = bits2ht[ (first_byte >> 4) & 3 ]; + if (header_type != HETY_INITIAL) + return 0; + + memcpy(&tag, p, 4); + p += 4; + if (tag == 0) + return 0; /* Client never sends version negotiation packets */ + + if (tag == * (uint32_t *) "Q046") + { + dcil = p[0] >> 4; + if (dcil) + dcil += 3; + scil = p[0] & 0xF; + if (scil) + scil += 3; + ++p; + + if (!(dcil == GQUIC_CID_LEN && scil == 0)) + return 0; + + packet_len = first_byte & 3; + + if (end - p < (ptrdiff_t) (dcil + scil + packet_len)) + return 0; + } + else + { + dcil = *p++; + if (dcil < MIN_INITIAL_DCID_LEN || dcil > MAX_CID_LEN) + return 0; + if (p + dcil >= end) + return 0; + p += dcil; + scil = *p++; + if (p + scil > end || scil > MAX_CID_LEN) + return 0; + p += scil; + r = vint_read(p, end, &token_len); + if (r < 0) + return 0; + p += r; + p += token_len; + if (p >= end) + return 0; + r = vint_read(p, end, &payload_len); + if (r < 0) + return 0; + p += r; + if (p - buf + payload_len > length) + return 0; + if (end - p < 4) + return 0; + } + + *tagp = tag; + return 1; +} + + +int +lsquic_ietf_v1_parse_packet_in_short_begin (struct lsquic_packet_in *packet_in, + size_t length, int is_server, unsigned cid_len, + struct packin_parse_state *state) +{ + unsigned char byte; + unsigned header_sz; + + /* By the time this function has been called, we know length is non-zero */ + byte = packet_in->pi_data[0]; + + /* [draft-ietf-quic-transport-17] Section 17.3 */ + /* 01SRRKPP */ + + if (cid_len) + { + header_sz = 1 + cid_len; + if (length < header_sz) + return -1; + memcpy(packet_in->pi_dcid.idbuf, packet_in->pi_data + 1, cid_len); + packet_in->pi_dcid.len = cid_len; + packet_in->pi_flags |= PI_CONN_ID; + } + else + header_sz = 1; + + packet_in->pi_flags |= ((byte & 0x20) > 0) << PIBIT_SPIN_SHIFT; + packet_in->pi_flags |= (byte & 3) << PIBIT_BITS_SHIFT; + + packet_in->pi_header_sz = header_sz; + packet_in->pi_data_sz = length; + packet_in->pi_quic_ver = 0; + packet_in->pi_nonce = 0; + packet_in->pi_refcnt = 0; + packet_in->pi_frame_types = 0; + memset(&packet_in->pi_next, 0, sizeof(packet_in->pi_next)); + packet_in->pi_refcnt = 0; + packet_in->pi_received = 0; + + /* This is so that Q046 works, ID-18 code does not use it */ + state->pps_p = packet_in->pi_data + header_sz; + state->pps_nbytes = 1 + (byte & 3); + + return 0; +} + + +#if __GNUC__ +# define popcount __builtin_popcount +#else +static int +popcount (unsigned v) +{ + int count, i; + for (i = 0, count = 0; i < sizeof(v) * 8; ++i) + if (v & (1 << i)) + ++count; + return count; +} +#endif + + +int +lsquic_ietf_v1_gen_ver_nego_pkt (unsigned char *buf, size_t bufsz, + const lsquic_cid_t *scid, const lsquic_cid_t *dcid, unsigned versions) +{ + size_t need; + int r; + + need = 1 /* Type */ + 4 /* Version */ + 1 /* DCIL */ + + dcid->len + 1 /* SCIL */ + scid->len + popcount(versions) * 4; + + if (need > bufsz) + return -1; + + *buf++ = 0x80 | 0x40 | rand(); + memset(buf, 0, 4); + buf += 4; + + /* From [draft-ietf-quic-transport-22], Section 17.2.1: + * + * The server MUST include the value from the Source Connection ID field + * of the packet it receives in the Destination Connection ID field. + * The value for Source Connection ID MUST be copied from the + * Destination Connection ID of the received packet, which is initially + * randomly selected by a client. Echoing both connection IDs gives + * clients some assurance that the server received the packet and that + * the Version Negotiation packet was not generated by an off-path + * attacker. + */ + + *buf++ = dcid->len; + memcpy(buf, dcid->idbuf, dcid->len); + buf += dcid->len; + *buf++ = scid->len; + memcpy(buf, scid->idbuf, scid->len); + buf += scid->len; + + r = lsquic_gen_ver_tags(buf, bufsz - 1 - 4 - 2 - dcid->len - scid->len, + versions); + if (r < 0) + return -1; + assert((unsigned) r == popcount(versions) * 4u); + + return need; +} + + + + +const struct parse_funcs lsquic_parse_funcs_ietf_v1 = +{ + .pf_gen_reg_pkt_header = ietf_v1_gen_reg_pkt_header, + .pf_parse_packet_in_finish = ietf_v1_parse_packet_in_finish, + .pf_gen_stream_frame = ietf_v1_gen_stream_frame, + .pf_calc_stream_frame_header_sz = ietf_v1_calc_stream_frame_header_sz, + .pf_parse_stream_frame = ietf_v1_parse_stream_frame, + .pf_parse_ack_frame = ietf_v1_parse_ack_frame, + .pf_gen_ack_frame = ietf_v1_gen_ack_frame, + .pf_gen_blocked_frame = ietf_v1_gen_blocked_frame, + .pf_parse_blocked_frame = ietf_v1_parse_blocked_frame, + .pf_blocked_frame_size = ietf_v1_blocked_frame_size, + .pf_rst_frame_size = ietf_v1_rst_frame_size, + .pf_gen_rst_frame = ietf_v1_gen_rst_frame, + .pf_parse_rst_frame = ietf_v1_parse_rst_frame, + .pf_gen_connect_close_frame = ietf_v1_gen_connect_close_frame, + .pf_parse_connect_close_frame = ietf_v1_parse_connect_close_frame, + .pf_gen_ping_frame = ietf_v1_gen_ping_frame, + .pf_parse_frame_type = ietf_v1_parse_frame_type, + .pf_turn_on_fin = ietf_v1_turn_on_fin, + .pf_packout_size = ietf_v1_packout_size, + .pf_packout_max_header_size = ietf_v1_packout_max_header_size, + .pf_path_chal_frame_size = ietf_v1_path_chal_frame_size, + .pf_parse_path_chal_frame = ietf_v1_parse_path_chal_frame, + .pf_gen_path_chal_frame = ietf_v1_gen_path_chal_frame, + .pf_path_resp_frame_size = ietf_v1_path_resp_frame_size, + .pf_gen_path_resp_frame = ietf_v1_gen_path_resp_frame, + .pf_parse_path_resp_frame = ietf_v1_parse_path_resp_frame, + .pf_calc_packno_bits = ietf_v1_calc_packno_bits, + .pf_packno_bits2len = ietf_v1_packno_bits2len, + .pf_packno_info = ietf_v1_packno_info, + .pf_gen_crypto_frame = ietf_v1_gen_crypto_frame, + .pf_parse_crypto_frame = ietf_v1_parse_crypto_frame, + .pf_calc_crypto_frame_header_sz = ietf_v1_calc_crypto_frame_header_sz, + .pf_parse_max_data = ietf_v1_parse_max_data, + .pf_gen_max_data_frame = ietf_v1_gen_max_data_frame, + .pf_max_data_frame_size = ietf_v1_max_data_frame_size, + .pf_parse_new_conn_id = ietf_v1_parse_new_conn_id, + .pf_gen_stream_blocked_frame = ietf_v1_gen_stream_blocked_frame, + .pf_parse_stream_blocked_frame = ietf_v1_parse_stream_blocked_frame, + .pf_stream_blocked_frame_size = ietf_v1_stream_blocked_frame_size, + .pf_gen_max_stream_data_frame = ietf_v1_gen_max_stream_data_frame, + .pf_parse_max_stream_data_frame = ietf_v1_parse_max_stream_data_frame, + .pf_max_stream_data_frame_size = ietf_v1_max_stream_data_frame_size, + .pf_parse_stop_sending_frame = ietf_v1_parse_stop_sending_frame, + .pf_gen_stop_sending_frame = ietf_v1_gen_stop_sending_frame, + .pf_stop_sending_frame_size = ietf_v1_stop_sending_frame_size, + .pf_parse_new_token_frame = ietf_v1_parse_new_token_frame, + .pf_new_connection_id_frame_size = ietf_v1_new_connection_id_frame_size, + .pf_gen_new_connection_id_frame = ietf_v1_gen_new_connection_id_frame, + .pf_new_token_frame_size = ietf_v1_new_token_frame_size, + .pf_gen_new_token_frame = ietf_v1_gen_new_token_frame, + .pf_parse_retire_cid_frame = ietf_v1_parse_retire_cid_frame, + .pf_gen_retire_cid_frame = ietf_v1_gen_retire_cid_frame, + .pf_retire_cid_frame_size = ietf_v1_retire_cid_frame_size, + .pf_gen_streams_blocked_frame = ietf_v1_gen_streams_blocked_frame, + .pf_parse_streams_blocked_frame = ietf_v1_parse_streams_blocked_frame, + .pf_streams_blocked_frame_size = ietf_v1_streams_blocked_frame_size, + .pf_gen_max_streams_frame = ietf_v1_gen_max_streams_frame, + .pf_parse_max_streams_frame = ietf_v1_parse_max_streams_frame, + .pf_max_streams_frame_size = ietf_v1_max_streams_frame_size, +}; diff --git a/src/liblsquic/lsquic_parse_iquic_common.c b/src/liblsquic/lsquic_parse_iquic_common.c index 07a958a4a..c9d788505 100644 --- a/src/liblsquic/lsquic_parse_iquic_common.c +++ b/src/liblsquic/lsquic_parse_iquic_common.c @@ -1,6 +1,12 @@ /* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * Parsing routines shared by all IETF QUIC versions. + */ + +#include #include #include +#include #include #include #include @@ -17,17 +23,12 @@ #include "lsquic.h" #include "lsquic_logger.h" #include "lsquic_byteswap.h" -#include "lsquic_str.h" -#include "lsquic_handshake.h" - - -static const enum header_type bin_2_header_type_Q044[0x100] = -{ - [0x80 | 0x7F] = HETY_INITIAL, - [0x80 | 0x7E] = HETY_RETRY, - [0x80 | 0x7D] = HETY_HANDSHAKE, - [0x80 | 0x7C] = HETY_0RTT, -}; +#include "lsquic_varint.h" +#include "lsquic_enc_sess.h" +#include "lsquic_tokgen.h" +#include "lsquic.h" +#include "lsquic_mm.h" +#include "lsquic_engine_public.h" /* [draft-ietf-quic-transport-17] Section-17.2 */ @@ -40,10 +41,10 @@ static const enum header_type bits2ht[4] = }; -/* This function supports versions Q044 and higher */ int -lsquic_iquic_parse_packet_in_long_begin (lsquic_packet_in_t *packet_in, - size_t length, int is_server, struct packin_parse_state *state) +lsquic_Q046_parse_packet_in_long_begin (struct lsquic_packet_in *packet_in, + size_t length, int is_server, unsigned cid_len, + struct packin_parse_state *state) { const unsigned char *p = packet_in->pi_data; const unsigned char *const end = p + length; @@ -51,9 +52,8 @@ lsquic_iquic_parse_packet_in_long_begin (lsquic_packet_in_t *packet_in, enum header_type header_type; unsigned dcil, scil, packet_len; int verneg; - enum lsquic_version version; unsigned char first_byte; - const unsigned cid_len = 8; + lsquic_packno_t packno; if (length < 6) return -1; @@ -63,26 +63,9 @@ lsquic_iquic_parse_packet_in_long_begin (lsquic_packet_in_t *packet_in, p += 4; verneg = 0 == tag; if (!verneg) - { - version = lsquic_tag2ver(tag); - if (version == LSQVER_044) - { - header_type = bin_2_header_type_Q044[ first_byte ]; - if (!header_type) - return -1; - } - else - header_type = bits2ht[ (first_byte >> 4) & 3 ]; - } + header_type = bits2ht[ (first_byte >> 4) & 3 ]; else - { header_type = HETY_VERNEG; -#ifdef WIN32 - /* Useless initialization: */ - version = -1; -#endif - } - packet_in->pi_header_type = header_type; @@ -97,9 +80,6 @@ lsquic_iquic_parse_packet_in_long_begin (lsquic_packet_in_t *packet_in, /* Chromium comments state that the client sends packets with destination * CID of 8 bytes and source CID of 0 bytes and the server does it the * other way around. - * - * XXX When IETF branch is merged, this check for Q044 and higher will - * have to be moved to the pf_parse_packet_in_finish(). */ if (is_server) { @@ -107,23 +87,13 @@ lsquic_iquic_parse_packet_in_long_begin (lsquic_packet_in_t *packet_in, return -1; } else - { - if (!(dcil == 0 && scil == cid_len)) - return -1; - } + if (!(dcil == 0 && scil == cid_len)) + return -1; if (!verneg) { - if (version == LSQVER_044) - { - packet_in->pi_flags |= GQUIC_PACKNO_LEN_4 << PIBIT_BITS_SHIFT; - packet_len = 4; - } - else - { - packet_in->pi_flags |= (first_byte & 3) << PIBIT_BITS_SHIFT; - packet_len = 1 + (first_byte & 3); - } + packet_in->pi_flags |= (first_byte & 3) << PIBIT_BITS_SHIFT; + packet_len = 1 + (first_byte & 3); if (end - p < (ptrdiff_t) (dcil + scil + packet_len)) return -1; } @@ -138,16 +108,15 @@ lsquic_iquic_parse_packet_in_long_begin (lsquic_packet_in_t *packet_in, #endif } - memcpy(&packet_in->pi_conn_id, p, cid_len); + memcpy(&packet_in->pi_dcid.idbuf, p, cid_len); + packet_in->pi_dcid.len = cid_len; p += cid_len; packet_in->pi_flags |= PI_CONN_ID; - packet_in->pi_packno = 0; - if (!verneg) { - state->pps_p = p; - state->pps_nbytes = packet_len; + READ_UINT(packno, 64, p, packet_len); + packet_in->pi_packno = packno; p += packet_len; packet_in->pi_quic_ver = 1; if (is_server || HETY_0RTT != header_type) @@ -160,13 +129,10 @@ lsquic_iquic_parse_packet_in_long_begin (lsquic_packet_in_t *packet_in, } else { - if ((end - p) & 3) + if (p >= end || (3 & (uintptr_t) (end - p))) return -1; - state->pps_p = NULL; - state->pps_nbytes = 0; packet_in->pi_quic_ver = p - packet_in->pi_data; - p = packet_in->pi_data + length; - packet_in->pi_nonce = 0; + p = end; } packet_in->pi_header_sz = p - packet_in->pi_data; @@ -180,42 +146,40 @@ lsquic_iquic_parse_packet_in_long_begin (lsquic_packet_in_t *packet_in, int -lsquic_iquic_parse_packet_in_short_begin (lsquic_packet_in_t *packet_in, - size_t length, int is_server, struct packin_parse_state *state) +lsquic_Q046_parse_packet_in_short_begin (lsquic_packet_in_t *packet_in, + size_t length, int is_server, unsigned cid_len, + struct packin_parse_state *state) { const unsigned char *p = packet_in->pi_data; const unsigned char *const pend = packet_in->pi_data + length; - unsigned cid_len = 8; /* XXX this will need to be passed in */ - unsigned packet_len; + unsigned packet_len, header_len; + lsquic_packno_t packno; if (*p & 0x40) /* Q046 and higher */ packet_len = 1 + (*p & 3); else - { - if ((*p & 0x30) != 0x30 || (*p & 3) == 3) - return -1; - packet_len = 1 << (*p & 3); - } + return -1; + + if (is_server) + header_len = 1 + cid_len + packet_len; + else + header_len = 1 + packet_len; - if (pend - p < (ptrdiff_t) (1 + cid_len + packet_len)) + if (pend - p < (ptrdiff_t) header_len) return -1; packet_in->pi_flags |= (*p & 3) << PIBIT_BITS_SHIFT; ++p; - if (is_server) { - memcpy(&packet_in->pi_conn_id, p, cid_len); - p += cid_len; + memcpy(packet_in->pi_dcid.idbuf, packet_in->pi_data + 1, cid_len); + packet_in->pi_dcid.len = cid_len; packet_in->pi_flags |= PI_CONN_ID; + p += cid_len; } - /* We could read in the packet number here, but we choose to do it in - * the finish() call instead. - */ - packet_in->pi_packno = 0; - state->pps_p = p; - state->pps_nbytes = packet_len; + READ_UINT(packno, 64, p, packet_len); + packet_in->pi_packno = packno; p += packet_len; packet_in->pi_header_type = HETY_NOT_SET; @@ -231,3 +195,408 @@ lsquic_iquic_parse_packet_in_short_begin (lsquic_packet_in_t *packet_in, } +/* TODO: this only works Q044? XXX */ +ssize_t +lsquic_generate_iquic_reset (const lsquic_cid_t *cidp, unsigned char *buf, + size_t buf_sz) +{ + size_t need; + uint64_t id; + + need = 1 /* Type */ + 20 /* Random bytes */ + 16 /* Reset token */; + if (buf_sz < need) + return -1; + + *buf = 0x30; + (void) RAND_pseudo_bytes(buf + 1, 20); + /* XXX code duplication here and lsquic_generate_reset_token(). Which + * should call which: parse function the crypto functions or the other + * way around? + */ + /* TODO test this */ + memcpy(&id, cidp->idbuf, GQUIC_CID_LEN); +#if __BYTE_ORDER == __LITTLE_ENDIAN + id = bswap_64(id); +#endif + memcpy(buf + 21, &id, sizeof(id)); + memset(buf + 21 + sizeof(id), 0, SRST_LENGTH - sizeof(id)); + return need; +} + + +/* This is a bare-bones version of lsquic_Q046_parse_packet_in_long_begin() + */ +int +lsquic_is_valid_iquic_hs_packet (const unsigned char *buf, size_t length, + lsquic_ver_tag_t *tagp) +{ + const unsigned char *p = buf; + const unsigned char *const end = p + length; + lsquic_ver_tag_t tag; + unsigned dcil, scil, packet_len; + unsigned char first_byte; + const unsigned cid_len = 8; + + if (length < 6) + return 0; + first_byte = *p++; + + memcpy(&tag, p, 4); + p += 4; + if (0 == tag) + return 0; /* Client never sends version negotiation */ + + dcil = p[0] >> 4; + if (dcil) + dcil += 3; + scil = p[0] & 0xF; + if (scil) + scil += 3; + ++p; + + if (!(dcil == cid_len && scil == 0)) + return 0; + + packet_len = first_byte & 3; + + if (end - p >= (ptrdiff_t) (dcil + scil + packet_len)) + { + *tagp = tag; + return 1; + } + else + return 0; +} + + +const enum quic_frame_type lsquic_iquic_byte2type[0x100] = +{ + [0x00] = QUIC_FRAME_PADDING, + [0x01] = QUIC_FRAME_PING, + [0x02] = QUIC_FRAME_ACK, + [0x03] = QUIC_FRAME_ACK, + [0x04] = QUIC_FRAME_RST_STREAM, + [0x05] = QUIC_FRAME_STOP_SENDING, + [0x06] = QUIC_FRAME_CRYPTO, + [0x07] = QUIC_FRAME_NEW_TOKEN, + [0x08] = QUIC_FRAME_STREAM, + [0x09] = QUIC_FRAME_STREAM, + [0x0A] = QUIC_FRAME_STREAM, + [0x0B] = QUIC_FRAME_STREAM, + [0x0C] = QUIC_FRAME_STREAM, + [0x0D] = QUIC_FRAME_STREAM, + [0x0E] = QUIC_FRAME_STREAM, + [0x0F] = QUIC_FRAME_STREAM, + [0x10] = QUIC_FRAME_MAX_DATA, + [0x11] = QUIC_FRAME_MAX_STREAM_DATA, + [0x12] = QUIC_FRAME_MAX_STREAMS, + [0x13] = QUIC_FRAME_MAX_STREAMS, + [0x14] = QUIC_FRAME_BLOCKED, + [0x15] = QUIC_FRAME_STREAM_BLOCKED, + [0x16] = QUIC_FRAME_STREAMS_BLOCKED, + [0x17] = QUIC_FRAME_STREAMS_BLOCKED, + [0x18] = QUIC_FRAME_NEW_CONNECTION_ID, + [0x19] = QUIC_FRAME_RETIRE_CONNECTION_ID, + [0x1A] = QUIC_FRAME_PATH_CHALLENGE, + [0x1B] = QUIC_FRAME_PATH_RESPONSE, + [0x1C] = QUIC_FRAME_CONNECTION_CLOSE, + [0x1D] = QUIC_FRAME_CONNECTION_CLOSE, + [0x1E] = QUIC_FRAME_INVALID, + [0x1F] = QUIC_FRAME_INVALID, + [0x20] = QUIC_FRAME_INVALID, + [0x21] = QUIC_FRAME_INVALID, + [0x22] = QUIC_FRAME_INVALID, + [0x23] = QUIC_FRAME_INVALID, + [0x24] = QUIC_FRAME_INVALID, + [0x25] = QUIC_FRAME_INVALID, + [0x26] = QUIC_FRAME_INVALID, + [0x27] = QUIC_FRAME_INVALID, + [0x28] = QUIC_FRAME_INVALID, + [0x29] = QUIC_FRAME_INVALID, + [0x2A] = QUIC_FRAME_INVALID, + [0x2B] = QUIC_FRAME_INVALID, + [0x2C] = QUIC_FRAME_INVALID, + [0x2D] = QUIC_FRAME_INVALID, + [0x2E] = QUIC_FRAME_INVALID, + [0x2F] = QUIC_FRAME_INVALID, + [0x30] = QUIC_FRAME_INVALID, + [0x31] = QUIC_FRAME_INVALID, + [0x32] = QUIC_FRAME_INVALID, + [0x33] = QUIC_FRAME_INVALID, + [0x34] = QUIC_FRAME_INVALID, + [0x35] = QUIC_FRAME_INVALID, + [0x36] = QUIC_FRAME_INVALID, + [0x37] = QUIC_FRAME_INVALID, + [0x38] = QUIC_FRAME_INVALID, + [0x39] = QUIC_FRAME_INVALID, + [0x3A] = QUIC_FRAME_INVALID, + [0x3B] = QUIC_FRAME_INVALID, + [0x3C] = QUIC_FRAME_INVALID, + [0x3D] = QUIC_FRAME_INVALID, + [0x3E] = QUIC_FRAME_INVALID, + [0x3F] = QUIC_FRAME_INVALID, + [0x40] = QUIC_FRAME_INVALID, + [0x41] = QUIC_FRAME_INVALID, + [0x42] = QUIC_FRAME_INVALID, + [0x43] = QUIC_FRAME_INVALID, + [0x44] = QUIC_FRAME_INVALID, + [0x45] = QUIC_FRAME_INVALID, + [0x46] = QUIC_FRAME_INVALID, + [0x47] = QUIC_FRAME_INVALID, + [0x48] = QUIC_FRAME_INVALID, + [0x49] = QUIC_FRAME_INVALID, + [0x4A] = QUIC_FRAME_INVALID, + [0x4B] = QUIC_FRAME_INVALID, + [0x4C] = QUIC_FRAME_INVALID, + [0x4D] = QUIC_FRAME_INVALID, + [0x4E] = QUIC_FRAME_INVALID, + [0x4F] = QUIC_FRAME_INVALID, + [0x50] = QUIC_FRAME_INVALID, + [0x51] = QUIC_FRAME_INVALID, + [0x52] = QUIC_FRAME_INVALID, + [0x53] = QUIC_FRAME_INVALID, + [0x54] = QUIC_FRAME_INVALID, + [0x55] = QUIC_FRAME_INVALID, + [0x56] = QUIC_FRAME_INVALID, + [0x57] = QUIC_FRAME_INVALID, + [0x58] = QUIC_FRAME_INVALID, + [0x59] = QUIC_FRAME_INVALID, + [0x5A] = QUIC_FRAME_INVALID, + [0x5B] = QUIC_FRAME_INVALID, + [0x5C] = QUIC_FRAME_INVALID, + [0x5D] = QUIC_FRAME_INVALID, + [0x5E] = QUIC_FRAME_INVALID, + [0x5F] = QUIC_FRAME_INVALID, + [0x60] = QUIC_FRAME_INVALID, + [0x61] = QUIC_FRAME_INVALID, + [0x62] = QUIC_FRAME_INVALID, + [0x63] = QUIC_FRAME_INVALID, + [0x64] = QUIC_FRAME_INVALID, + [0x65] = QUIC_FRAME_INVALID, + [0x66] = QUIC_FRAME_INVALID, + [0x67] = QUIC_FRAME_INVALID, + [0x68] = QUIC_FRAME_INVALID, + [0x69] = QUIC_FRAME_INVALID, + [0x6A] = QUIC_FRAME_INVALID, + [0x6B] = QUIC_FRAME_INVALID, + [0x6C] = QUIC_FRAME_INVALID, + [0x6D] = QUIC_FRAME_INVALID, + [0x6E] = QUIC_FRAME_INVALID, + [0x6F] = QUIC_FRAME_INVALID, + [0x70] = QUIC_FRAME_INVALID, + [0x71] = QUIC_FRAME_INVALID, + [0x72] = QUIC_FRAME_INVALID, + [0x73] = QUIC_FRAME_INVALID, + [0x74] = QUIC_FRAME_INVALID, + [0x75] = QUIC_FRAME_INVALID, + [0x76] = QUIC_FRAME_INVALID, + [0x77] = QUIC_FRAME_INVALID, + [0x78] = QUIC_FRAME_INVALID, + [0x79] = QUIC_FRAME_INVALID, + [0x7A] = QUIC_FRAME_INVALID, + [0x7B] = QUIC_FRAME_INVALID, + [0x7C] = QUIC_FRAME_INVALID, + [0x7D] = QUIC_FRAME_INVALID, + [0x7E] = QUIC_FRAME_INVALID, + [0x7F] = QUIC_FRAME_INVALID, + [0x80] = QUIC_FRAME_INVALID, + [0x81] = QUIC_FRAME_INVALID, + [0x82] = QUIC_FRAME_INVALID, + [0x83] = QUIC_FRAME_INVALID, + [0x84] = QUIC_FRAME_INVALID, + [0x85] = QUIC_FRAME_INVALID, + [0x86] = QUIC_FRAME_INVALID, + [0x87] = QUIC_FRAME_INVALID, + [0x88] = QUIC_FRAME_INVALID, + [0x89] = QUIC_FRAME_INVALID, + [0x8A] = QUIC_FRAME_INVALID, + [0x8B] = QUIC_FRAME_INVALID, + [0x8C] = QUIC_FRAME_INVALID, + [0x8D] = QUIC_FRAME_INVALID, + [0x8E] = QUIC_FRAME_INVALID, + [0x8F] = QUIC_FRAME_INVALID, + [0x90] = QUIC_FRAME_INVALID, + [0x91] = QUIC_FRAME_INVALID, + [0x92] = QUIC_FRAME_INVALID, + [0x93] = QUIC_FRAME_INVALID, + [0x94] = QUIC_FRAME_INVALID, + [0x95] = QUIC_FRAME_INVALID, + [0x96] = QUIC_FRAME_INVALID, + [0x97] = QUIC_FRAME_INVALID, + [0x98] = QUIC_FRAME_INVALID, + [0x99] = QUIC_FRAME_INVALID, + [0x9A] = QUIC_FRAME_INVALID, + [0x9B] = QUIC_FRAME_INVALID, + [0x9C] = QUIC_FRAME_INVALID, + [0x9D] = QUIC_FRAME_INVALID, + [0x9E] = QUIC_FRAME_INVALID, + [0x9F] = QUIC_FRAME_INVALID, + [0xA0] = QUIC_FRAME_INVALID, + [0xA1] = QUIC_FRAME_INVALID, + [0xA2] = QUIC_FRAME_INVALID, + [0xA3] = QUIC_FRAME_INVALID, + [0xA4] = QUIC_FRAME_INVALID, + [0xA5] = QUIC_FRAME_INVALID, + [0xA6] = QUIC_FRAME_INVALID, + [0xA7] = QUIC_FRAME_INVALID, + [0xA8] = QUIC_FRAME_INVALID, + [0xA9] = QUIC_FRAME_INVALID, + [0xAA] = QUIC_FRAME_INVALID, + [0xAB] = QUIC_FRAME_INVALID, + [0xAC] = QUIC_FRAME_INVALID, + [0xAD] = QUIC_FRAME_INVALID, + [0xAE] = QUIC_FRAME_INVALID, + [0xAF] = QUIC_FRAME_INVALID, + [0xB0] = QUIC_FRAME_INVALID, + [0xB1] = QUIC_FRAME_INVALID, + [0xB2] = QUIC_FRAME_INVALID, + [0xB3] = QUIC_FRAME_INVALID, + [0xB4] = QUIC_FRAME_INVALID, + [0xB5] = QUIC_FRAME_INVALID, + [0xB6] = QUIC_FRAME_INVALID, + [0xB7] = QUIC_FRAME_INVALID, + [0xB8] = QUIC_FRAME_INVALID, + [0xB9] = QUIC_FRAME_INVALID, + [0xBA] = QUIC_FRAME_INVALID, + [0xBB] = QUIC_FRAME_INVALID, + [0xBC] = QUIC_FRAME_INVALID, + [0xBD] = QUIC_FRAME_INVALID, + [0xBE] = QUIC_FRAME_INVALID, + [0xBF] = QUIC_FRAME_INVALID, + [0xC0] = QUIC_FRAME_INVALID, + [0xC1] = QUIC_FRAME_INVALID, + [0xC2] = QUIC_FRAME_INVALID, + [0xC3] = QUIC_FRAME_INVALID, + [0xC4] = QUIC_FRAME_INVALID, + [0xC5] = QUIC_FRAME_INVALID, + [0xC6] = QUIC_FRAME_INVALID, + [0xC7] = QUIC_FRAME_INVALID, + [0xC8] = QUIC_FRAME_INVALID, + [0xC9] = QUIC_FRAME_INVALID, + [0xCA] = QUIC_FRAME_INVALID, + [0xCB] = QUIC_FRAME_INVALID, + [0xCC] = QUIC_FRAME_INVALID, + [0xCD] = QUIC_FRAME_INVALID, + [0xCE] = QUIC_FRAME_INVALID, + [0xCF] = QUIC_FRAME_INVALID, + [0xD0] = QUIC_FRAME_INVALID, + [0xD1] = QUIC_FRAME_INVALID, + [0xD2] = QUIC_FRAME_INVALID, + [0xD3] = QUIC_FRAME_INVALID, + [0xD4] = QUIC_FRAME_INVALID, + [0xD5] = QUIC_FRAME_INVALID, + [0xD6] = QUIC_FRAME_INVALID, + [0xD7] = QUIC_FRAME_INVALID, + [0xD8] = QUIC_FRAME_INVALID, + [0xD9] = QUIC_FRAME_INVALID, + [0xDA] = QUIC_FRAME_INVALID, + [0xDB] = QUIC_FRAME_INVALID, + [0xDC] = QUIC_FRAME_INVALID, + [0xDD] = QUIC_FRAME_INVALID, + [0xDE] = QUIC_FRAME_INVALID, + [0xDF] = QUIC_FRAME_INVALID, + [0xE0] = QUIC_FRAME_INVALID, + [0xE1] = QUIC_FRAME_INVALID, + [0xE2] = QUIC_FRAME_INVALID, + [0xE3] = QUIC_FRAME_INVALID, + [0xE4] = QUIC_FRAME_INVALID, + [0xE5] = QUIC_FRAME_INVALID, + [0xE6] = QUIC_FRAME_INVALID, + [0xE7] = QUIC_FRAME_INVALID, + [0xE8] = QUIC_FRAME_INVALID, + [0xE9] = QUIC_FRAME_INVALID, + [0xEA] = QUIC_FRAME_INVALID, + [0xEB] = QUIC_FRAME_INVALID, + [0xEC] = QUIC_FRAME_INVALID, + [0xED] = QUIC_FRAME_INVALID, + [0xEE] = QUIC_FRAME_INVALID, + [0xEF] = QUIC_FRAME_INVALID, + [0xF0] = QUIC_FRAME_INVALID, + [0xF1] = QUIC_FRAME_INVALID, + [0xF2] = QUIC_FRAME_INVALID, + [0xF3] = QUIC_FRAME_INVALID, + [0xF4] = QUIC_FRAME_INVALID, + [0xF5] = QUIC_FRAME_INVALID, + [0xF6] = QUIC_FRAME_INVALID, + [0xF7] = QUIC_FRAME_INVALID, + [0xF8] = QUIC_FRAME_INVALID, + [0xF9] = QUIC_FRAME_INVALID, + [0xFA] = QUIC_FRAME_INVALID, + [0xFB] = QUIC_FRAME_INVALID, + [0xFC] = QUIC_FRAME_INVALID, + [0xFD] = QUIC_FRAME_INVALID, + [0xFE] = QUIC_FRAME_INVALID, + [0xFF] = QUIC_FRAME_INVALID, +}; + + +#if __GNUC__ +# define popcount __builtin_popcount +#else +static int +popcount (unsigned v) +{ + int count, i; + for (i = 0, count = 0; i < sizeof(v) * 8; ++i) + if (v & (1 << i)) + ++count; + return count; +} + + +#endif + + +int +lsquic_Q046_gen_ver_nego_pkt (unsigned char *buf, size_t bufsz, + const lsquic_cid_t *scid, const lsquic_cid_t *dcid, unsigned versions) +{ + unsigned slen, dlen; + size_t need; + int r; + + need = 1 /* Type */ + 4 /* Packet number */ + 1 /* SCIL */ + + scid->len + dcid->len + popcount(versions) * 4; + + if (need > bufsz) + return -1; + + *buf++ = 0x80 | 0x40 | rand(); + memset(buf, 0, 4); + buf += 4; + + /* From [draft-ietf-quic-transport-11], Section 4.3: + * + * The server MUST include the value from the Source Connection ID field + * of the packet it receives in the Destination Connection ID field. + * The value for Source Connection ID MUST be copied from the + * Destination Connection ID of the received packet, which is initially + * randomly selected by a client. Echoing both connection IDs gives + * clients some assurance that the server received the packet and that + * the Version Negotiation packet was not generated by an off-path + * attacker. + */ + + dlen = dcid->len; + if (dlen) + dlen -= 3; + slen = scid->len; + if (slen) + slen -= 3; + *buf++ = (dlen << 4) | slen; + + memcpy(buf, dcid->idbuf, dcid->len); + buf += dcid->len; + memcpy(buf, scid->idbuf, scid->len); + buf += scid->len; + + r = lsquic_gen_ver_tags(buf, bufsz - 1 - 4 - 1 - dcid->len - scid->len, + versions); + if (r < 0) + return -1; + assert((unsigned) r == popcount(versions) * 4u); + + return need; +} + + diff --git a/src/liblsquic/lsquic_pr_queue.c b/src/liblsquic/lsquic_pr_queue.c new file mode 100644 index 000000000..1265a1423 --- /dev/null +++ b/src/liblsquic/lsquic_pr_queue.c @@ -0,0 +1,528 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_pr_queue.c -- packet request queue. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "lsquic.h" +#include "lsquic_types.h" +#include "lsquic_int_types.h" +#include "lsquic_packet_common.h" +#include "lsquic_packet_gquic.h" +#include "lsquic_packet_out.h" +#include "lsquic_packet_in.h" +#include "lsquic_hash.h" +#include "lsquic_conn.h" +#include "lsquic_parse.h" +#include "lsquic_malo.h" +#include "lsquic_pr_queue.h" +#include "lsquic_parse_common.h" +#include "lsquic_tokgen.h" +#include "lsquic_version.h" +#include "lsquic_mm.h" +#include "lsquic_engine_public.h" +#include "lsquic_sizes.h" +#include "lsquic_handshake.h" + +#define LSQUIC_LOGGER_MODULE LSQLM_PRQ +#include "lsquic_logger.h" + +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + + +static const struct conn_iface evanescent_conn_iface; + + +struct packet_req +{ + STAILQ_ENTRY(packet_req) pr_next; + lsquic_cid_t pr_scid; + lsquic_cid_t pr_dcid; + enum packet_req_type pr_type; + enum { + PR_GQUIC = 1 << 0, + } pr_flags; + enum lsquic_version pr_version; + struct network_path pr_path; +}; + + +struct evanescent_conn +{ + struct lsquic_conn evc_conn; + struct packet_req *evc_req; + struct pr_queue *evc_queue; + struct lsquic_packet_out evc_packet_out; + struct conn_cid_elem evc_cces[1]; + unsigned char evc_buf[0]; +}; + + +/* [draft-ietf-quic-transport-22], Section 17.2.1 */ +#define IQUIC_VERNEG_SIZE (1 /* Type */ + 4 /* Version (zero tag) */ \ + + 1 /* DCIL */ + MAX_CID_LEN + 1 /* SCIL */ + MAX_CID_LEN + \ + 4 * N_LSQVER) + + +struct pr_queue +{ + TAILQ_HEAD(, lsquic_conn) prq_free_conns, + prq_returned_conns; + STAILQ_HEAD(, packet_req) prq_reqs_queue; + struct malo *prq_reqs_pool; + const struct lsquic_engine_public + *prq_enpub; + unsigned prq_max_reqs; + unsigned prq_nreqs; + unsigned prq_max_conns; + unsigned prq_nconns; + unsigned prq_verneg_g_sz; /* Size of prq_verneg_g_buf */ + unsigned prq_pubres_g_sz; /* Size of prq_pubres_g_buf */ + + /* GQUIC version negotiation and stateless reset packets are generated + * once, when the Packet Request Queue is created. For each request, + * these buffers are simply copied and the connection ID is replaced. + * + * Since IETF QUIC uses variable-length connections IDs, we have to + * generate packets every time. + */ + unsigned char prq_pubres_g_buf[GQUIC_RESET_SZ]; + unsigned char prq_verneg_g_buf[1 + GQUIC_CID_LEN + + N_LSQVER * 4]; +}; + + +struct pr_queue * +prq_create (unsigned max_elems, unsigned max_conns, + const struct lsquic_engine_public *enpub) +{ + const struct parse_funcs *pf; + struct pr_queue *prq; + struct malo *malo; + unsigned verneg_g_sz; + ssize_t prst_g_sz; + int len; + + malo = lsquic_malo_create(sizeof(struct packet_req)); + if (!malo) + { + LSQ_WARN("malo_create failed: %s", strerror(errno)); + goto err0; + } + + prq = malloc(sizeof(*prq)); + if (!prq) + { + LSQ_WARN("malloc failed: %s", strerror(errno)); + goto err1; + } + + const lsquic_cid_t cid = { .len = 8, }; + pf = select_pf_by_ver(LSQVER_039); + len = lsquic_gquic_gen_ver_nego_pkt(prq->prq_verneg_g_buf, + sizeof(prq->prq_verneg_g_buf), &cid, + enpub->enp_settings.es_versions); + assert(len > 0); + if (len <= 0) + { + LSQ_ERROR("cannot generate version negotiation packet"); + goto err2; + } + verneg_g_sz = (unsigned) len; + + prst_g_sz = pf->pf_generate_simple_prst(0 /* This is just placeholder */, + prq->prq_pubres_g_buf, sizeof(prq->prq_pubres_g_buf)); + if (prst_g_sz < 0) + { + LSQ_ERROR("cannot generate public reset packet"); + goto err2; + } + + TAILQ_INIT(&prq->prq_free_conns); + TAILQ_INIT(&prq->prq_returned_conns); + STAILQ_INIT(&prq->prq_reqs_queue); + prq->prq_reqs_pool = malo; + prq->prq_max_reqs = max_elems; + prq->prq_nreqs = 0; + prq->prq_max_conns = max_conns; + prq->prq_nconns = 0; + prq->prq_verneg_g_sz = verneg_g_sz; + prq->prq_pubres_g_sz = (unsigned) prst_g_sz; + prq->prq_enpub = enpub; + + LSQ_INFO("initialized queue of size %d", max_elems); + + return prq; + + err2: + free(prq); + err1: + lsquic_malo_destroy(malo); + err0: + return NULL; +} + + +void +prq_destroy (struct pr_queue *prq) +{ + struct lsquic_conn *conn; + + LSQ_INFO("destroy"); + while ((conn = TAILQ_FIRST(&prq->prq_free_conns))) + { + TAILQ_REMOVE(&prq->prq_free_conns, conn, cn_next_pr); + free(conn); + } + lsquic_malo_destroy(prq->prq_reqs_pool); + free(prq); +} + + +static struct packet_req * +get_req (struct pr_queue *prq) +{ + struct packet_req *req; + if (prq->prq_nreqs < prq->prq_max_reqs) + { + req = lsquic_malo_get(prq->prq_reqs_pool); + if (req) + ++prq->prq_nreqs; + else + LSQ_WARN("malo_get failed: %s", strerror(errno)); + return req; + } + else + return NULL; +} + + +static void +put_req (struct pr_queue *prq, struct packet_req *req) +{ + lsquic_malo_put(req); + --prq->prq_nreqs; +} + + +int +prq_new_req (struct pr_queue *prq, enum packet_req_type type, + const struct lsquic_packet_in *packet_in, void *peer_ctx, + const struct sockaddr *local_addr, const struct sockaddr *peer_addr) +{ + struct packet_req *req; + lsquic_ver_tag_t ver_tag; + + req = get_req(prq); + if (!req) + { + LSQ_DEBUG("out of reqs: cannot allocated another one"); + return -1; + } + + STAILQ_INSERT_TAIL(&prq->prq_reqs_queue, req, pr_next); + + req->pr_type = type; + req->pr_flags = packet_in->pi_flags & PI_GQUIC ? PR_GQUIC : 0; + lsquic_scid_from_packet_in(packet_in, &req->pr_scid); + req->pr_dcid = packet_in->pi_dcid; + req->pr_path.np_peer_ctx = peer_ctx; + memcpy(NP_LOCAL_SA(&req->pr_path), local_addr, + sizeof(req->pr_path.np_local_addr)); + memcpy(NP_PEER_SA(&req->pr_path), peer_addr, + sizeof(req->pr_path.np_peer_addr)); + if (packet_in->pi_quic_ver) + { + memcpy(&ver_tag, packet_in->pi_data + packet_in->pi_quic_ver, + sizeof(ver_tag)); + req->pr_version = lsquic_tag2ver(ver_tag); + } + else /* Got to set it to something sensible... */ + req->pr_version = LSQVER_ID22; + LSQ_DEBUGC("scheduled %s packet for connection %"CID_FMT, + lsquic_preqt2str[type], CID_BITS(&req->pr_dcid)); + return 0; +} + + +static size_t +max_bufsz (const struct pr_queue *prq) +{ + return MAX(MAX(MAX(IQUIC_VERNEG_SIZE, + IQUIC_MIN_SRST_SIZE), + sizeof(prq->prq_verneg_g_buf)), + sizeof(prq->prq_pubres_g_buf)); +} + + +static struct evanescent_conn * +get_evconn (struct pr_queue *prq) +{ + struct evanescent_conn *evconn; + struct lsquic_conn *lconn; + struct lsquic_packet_out *packet_out; + size_t bufsz; + + if (prq->prq_nconns >= prq->prq_max_conns) + { /* This deserves a warning */ + LSQ_WARN("tried to get connection past limit of %u", prq->prq_max_conns); + return NULL; + } + + lconn = TAILQ_FIRST(&prq->prq_free_conns); + if (lconn) + { + TAILQ_REMOVE(&prq->prq_free_conns, lconn, cn_next_pr); + return (struct evanescent_conn *) lconn; + } + + bufsz = max_bufsz(prq); + evconn = calloc(1, sizeof(*evconn) + bufsz); + if (!evconn) + { + LSQ_WARN("calloc failed: %s", strerror(errno)); + return NULL; + } + + /* These values stay the same between connection usages: */ + evconn->evc_queue = prq; + lconn = &evconn->evc_conn; + lconn->cn_cces = evconn->evc_cces; + lconn->cn_cces_mask = 1; + lconn->cn_n_cces = sizeof(evconn->evc_cces) / sizeof(evconn->evc_cces[0]); + lconn->cn_if = &evanescent_conn_iface; + lconn->cn_flags = LSCONN_EVANESCENT; + packet_out = &evconn->evc_packet_out; + packet_out->po_flags = PO_NOENCRYPT; + packet_out->po_data = evconn->evc_buf; + + return evconn; +} + + +struct lsquic_conn * +prq_next_conn (struct pr_queue *prq) +{ + struct evanescent_conn *evconn; + struct lsquic_conn *lconn; + struct packet_req *req; + struct lsquic_packet_out *packet_out; + int (*gen_verneg) (unsigned char *, size_t, const lsquic_cid_t *, + const lsquic_cid_t *, unsigned); + int len; + + lconn = TAILQ_FIRST(&prq->prq_returned_conns); + if (lconn) + { + TAILQ_REMOVE(&prq->prq_returned_conns, lconn, cn_next_pr); + return lconn; + } + + req = STAILQ_FIRST(&prq->prq_reqs_queue); + if (!req) /* Nothing is queued */ + return NULL; + + evconn = get_evconn(prq); + if (!evconn) /* Reached limit or malloc failed */ + return NULL; + + packet_out = &evconn->evc_packet_out; + switch ((req->pr_type << 29) | req->pr_flags) + { + case (PACKET_REQ_VERNEG << 29) | PR_GQUIC: + packet_out->po_data_sz = prq->prq_verneg_g_sz; + packet_out->po_flags |= PO_VERNEG; + memcpy(packet_out->po_data, prq->prq_verneg_g_buf, + prq->prq_verneg_g_sz); + memcpy(packet_out->po_data + 1, req->pr_dcid.idbuf, GQUIC_CID_LEN); + break; + case (PACKET_REQ_PUBRES << 29) | PR_GQUIC: + packet_out->po_flags &= ~PO_VERNEG; + packet_out->po_data_sz = prq->prq_pubres_g_sz; + memcpy(packet_out->po_data, prq->prq_pubres_g_buf, + prq->prq_pubres_g_sz); + memcpy(packet_out->po_data + 1, req->pr_dcid.idbuf, GQUIC_CID_LEN); + break; + case (PACKET_REQ_VERNEG << 29) | 0: + packet_out->po_flags |= PO_VERNEG; + if (req->pr_version == LSQVER_046) + gen_verneg = lsquic_Q046_gen_ver_nego_pkt; + else + gen_verneg = lsquic_ietf_v1_gen_ver_nego_pkt; + len = gen_verneg(packet_out->po_data, max_bufsz(prq), + /* Flip SCID/DCID here: */ &req->pr_dcid, &req->pr_scid, + prq->prq_enpub->enp_settings.es_versions); + if (len > 0) + packet_out->po_data_sz = len; + else + packet_out->po_data_sz = 0; + break; + default: + packet_out->po_flags &= ~PO_VERNEG; + packet_out->po_data_sz = IQUIC_MIN_SRST_SIZE; + RAND_bytes(packet_out->po_data, IQUIC_MIN_SRST_RANDOM_BYTES); + packet_out->po_data[0] &= ~0x80; + packet_out->po_data[0] |= 0x40; + lsquic_tg_generate_sreset(prq->prq_enpub->enp_tokgen, &req->pr_dcid, + packet_out->po_data + IQUIC_MIN_SRST_RANDOM_BYTES); + break; + } + + STAILQ_REMOVE_HEAD(&prq->prq_reqs_queue, pr_next); + evconn->evc_req = req; + + lconn= &evconn->evc_conn; + evconn->evc_cces[0].cce_cid = req->pr_dcid; + packet_out->po_path = &req->pr_path; + + ++prq->prq_nconns; + return lconn; +} + + +int +prq_have_pending (const struct pr_queue *prq) +{ + return !STAILQ_EMPTY(&prq->prq_reqs_queue); +} + + +static struct lsquic_packet_out * +evanescent_conn_ci_next_packet_to_send (struct lsquic_conn *lconn, size_t size) +{ + struct evanescent_conn *const evconn = (struct evanescent_conn *) lconn; + assert(size == 0); + return &evconn->evc_packet_out; +} + + +static void +evanescent_conn_ci_packet_sent (struct lsquic_conn *lconn, + struct lsquic_packet_out *packet_out) +{ + struct evanescent_conn *const evconn = (struct evanescent_conn *) lconn; + struct pr_queue *const prq = evconn->evc_queue; + + assert(packet_out == &evconn->evc_packet_out); + assert(prq->prq_nconns > 0); + + LSQ_DEBUGC("sent %s packet for connection %"CID_FMT"; free resources", + lsquic_preqt2str[ evconn->evc_req->pr_type ], + CID_BITS(&evconn->evc_req->pr_dcid)); + TAILQ_INSERT_HEAD(&prq->prq_free_conns, lconn, cn_next_pr); + put_req(prq, evconn->evc_req); + --prq->prq_nconns; +} + + +static void +evanescent_conn_ci_packet_not_sent (struct lsquic_conn *lconn, + struct lsquic_packet_out *packet_out) +{ + struct evanescent_conn *const evconn = (struct evanescent_conn *) lconn; + struct pr_queue *const prq = evconn->evc_queue; + + assert(packet_out == &evconn->evc_packet_out); + assert(prq->prq_nconns > 0); + + LSQ_DEBUG("packet not sent; put connection onto used list"); + TAILQ_INSERT_HEAD(&prq->prq_returned_conns, lconn, cn_next_pr); +} + + +static enum tick_st +evanescent_conn_ci_tick (struct lsquic_conn *lconn, lsquic_time_t now) +{ + assert(0); + return TICK_CLOSE; +} + + +static void +evanescent_conn_ci_destroy (struct lsquic_conn *lconn) +{ + assert(0); +} + + +static struct lsquic_engine * +evanescent_conn_ci_get_engine (struct lsquic_conn *lconn) +{ + assert(0); + return NULL; +} + + +static void +evanescent_conn_ci_hsk_done (struct lsquic_conn *lconn, + enum lsquic_hsk_status status) +{ + assert(0); +} + + +static void +evanescent_conn_ci_packet_in (struct lsquic_conn *lconn, + struct lsquic_packet_in *packet_in) +{ + assert(0); +} + + +static void +evanescent_conn_ci_client_call_on_new (struct lsquic_conn *lconn) +{ + assert(0); +} + + +static struct network_path * +evanescent_conn_ci_get_path (struct lsquic_conn *lconn, + const struct sockaddr *sa) +{ + struct evanescent_conn *const evconn = (struct evanescent_conn *) lconn; + + return &evconn->evc_req->pr_path; +} + + +static unsigned char +evanescent_conn_ci_record_addrs (struct lsquic_conn *lconn, void *peer_ctx, + const struct sockaddr *local_sa, const struct sockaddr *peer_sa) +{ + assert(0); + return 0; +} + + +static const struct conn_iface evanescent_conn_iface = { + .ci_client_call_on_new = evanescent_conn_ci_client_call_on_new, + .ci_destroy = evanescent_conn_ci_destroy, + .ci_get_engine = evanescent_conn_ci_get_engine, + .ci_get_path = evanescent_conn_ci_get_path, + .ci_hsk_done = evanescent_conn_ci_hsk_done, + .ci_next_packet_to_send = evanescent_conn_ci_next_packet_to_send, + .ci_packet_in = evanescent_conn_ci_packet_in, + .ci_packet_not_sent = evanescent_conn_ci_packet_not_sent, + .ci_packet_sent = evanescent_conn_ci_packet_sent, + .ci_record_addrs = evanescent_conn_ci_record_addrs, + .ci_tick = evanescent_conn_ci_tick, +}; + + +const char *const lsquic_preqt2str[] = +{ + [PACKET_REQ_VERNEG] = "version negotiation", + [PACKET_REQ_PUBRES] = "stateless reset", +}; diff --git a/src/liblsquic/lsquic_pr_queue.h b/src/liblsquic/lsquic_pr_queue.h new file mode 100644 index 000000000..34b606b23 --- /dev/null +++ b/src/liblsquic/lsquic_pr_queue.h @@ -0,0 +1,78 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_pr_queue.h -- a queue of packet requests + * + * Some packets need to be replied to outside of context of existing + * mini or full connections: + * + * 1. A version negotiation packet needs to be sent when a packet + * arrives that specifies QUIC version that we do not support. + * 2. A public reset packet needs to be sent when we receive a + * packet that does not belong to a known QUIC connection. + * + * The replies cannot be sent immediately. They share outgoing + * socket with existing connections and must be scheduled according + * to prioritization rules. + * + * The information needed to generate reply packet -- connection ID, + * connection context, and the peer address -- is saved in the Packet + * Request Queue. + * + * When it is time to send packets, the connection iterator knows to + * call prq_next_conn() when appropriate. What is returned is an + * evanescent connection object that disappears as soon as the reply + * packet is successfully sent out. + * + * There are two limits associated with Packet Request Queue: + * 1. Maximum number of packet requests that are allowed to be + * pending at any one time. This is simply to prevent memory + * blowout. + * 2. Maximum verneg connection objects to be allocated at any one + * time. This number is the same as the maximum batch size in + * the engine, because the packet (and, therefore, the connection) + * is returned to the Packet Request Queue when it could not be + * sent. + * + * We call this a "request" queue because it describes what we do with + * QUIC packets whose version we do not support or those packets that + * do not belong to an existing connection: we send a reply for each of + * these packets, which effectively makes them "requests." + */ + +#ifndef LSQUIC_PR_QUEUE_H +#define LSQUIC_PR_QUEUE_H 1 + +struct lsquic_conn; +struct lsquic_packet_in; +struct lsquic_engine_settings; +struct pr_queue; +struct sockaddr; + +enum packet_req_type { + PACKET_REQ_VERNEG, + PACKET_REQ_PUBRES, + N_PREQ_TYPES, +}; + +extern const char *const lsquic_preqt2str[N_PREQ_TYPES]; + +struct pr_queue * +prq_create (unsigned max_elems, unsigned max_conns, + const struct lsquic_engine_public *); + +void +prq_destroy (struct pr_queue *); + +int +prq_new_req (struct pr_queue *, enum packet_req_type, + const struct lsquic_packet_in *, void *conn_ctx, + const struct sockaddr *local_addr, + const struct sockaddr *peer_addr); + +struct lsquic_conn * +prq_next_conn (struct pr_queue *); + +int +prq_have_pending (const struct pr_queue *); + +#endif diff --git a/src/liblsquic/lsquic_purga.c b/src/liblsquic/lsquic_purga.c new file mode 100644 index 000000000..d47a45d3c --- /dev/null +++ b/src/liblsquic/lsquic_purga.c @@ -0,0 +1,277 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#include +#include +#include +#include +#include +#include +#include + +#include "lsquic.h" +#include "lsquic_types.h" +#include "lsquic_int_types.h" +#include "lsquic_xxhash.h" +#include "lsquic_purga.h" + +#define LSQUIC_LOGGER_MODULE LSQLM_PURGA +#include "lsquic_logger.h" + + +/* To avoid scannig the whole list of CIDs, we use a Bloom filter. + * + * The Bloom filter is constructed using a 8192-bit bit field and 6 hash + * functions. With 273 elements per page, this gives us 0.004% possibility + * of a false positive. In other words, when we do have to search a page + * for a particular CID, the chance of finding the CID is 99.99%. + * + * Quick calc: + * perl -E '$k=6;$m=1<<13;$n=273;printf("%f\n", (1-exp(1)**-($k*$n/$m))**$k)' + * + * To extract 6 13-bit values from a 64-bit integer, they are overlapped: + * 0 10 20 30 40 50 60 + * +----------------------------------------------------------------+ + * | | + * +----------------------------------------------------------------+ + * 1111111111111 + * 2222222222222 + * 3333333333333 + * 4444444444444 + * 5555555555555 + * 6666666666666 + * + * This is not 100% kosher, but having 6 functions gives a better guarantee + * and it happens to work in practice. + */ + +#define BLOOM_N_FUNCS 6 +#define BLOOM_SHIFT 10 +#define BLOOM_N_BITS (1 << 13) +typedef uint64_t bloom_mask_el_t; +#define BLOOM_SET_SHIFT 6 /* log2(sizeof(bloom_mask_el_t)) */ +#define BLOOM_BITS_PER_EL (1 << BLOOM_SET_SHIFT) +#define BLOOM_N_MASK_ELS (BLOOM_N_BITS / BLOOM_BITS_PER_EL) +#define BLOOM_ONE 1ull + +#define PURGA_ELS_PER_PAGE 273 + +struct purga_page +{ + TAILQ_ENTRY(purga_page) pupa_next; + lsquic_time_t pupa_last; + unsigned pupa_count; + bloom_mask_el_t pupa_mask[BLOOM_N_MASK_ELS]; + lsquic_cid_t pupa_cids[PURGA_ELS_PER_PAGE]; + void * pupa_peer_ctx[PURGA_ELS_PER_PAGE]; + struct purga_el pupa_els[PURGA_ELS_PER_PAGE]; +}; + +#define PAGE_IS_FULL(page) ((page)->pupa_count >= PURGA_ELS_PER_PAGE) + +TAILQ_HEAD(purga_pages, purga_page); + +struct lsquic_purga +{ + lsquic_time_t pur_min_life; + lsquic_cids_update_f pur_remove_cids; + void *pur_remove_ctx; + struct purga_pages pur_pages; +#ifndef NDEBUG + struct purga_bloom_stats pur_stats; +#endif +}; + + +struct lsquic_purga * +lsquic_purga_new (lsquic_time_t min_life, lsquic_cids_update_f remove_cids, + void *remove_ctx) +{ + struct lsquic_purga *purga; + + purga = calloc(1, sizeof(*purga)); + if (!purga) + { + LSQ_WARN("cannot create purgatory: malloc failed: %s", strerror(errno)); + return NULL; + } + + purga->pur_min_life = min_life; + purga->pur_remove_cids = remove_cids; + purga->pur_remove_ctx = remove_ctx; + TAILQ_INIT(&purga->pur_pages); + LSQ_INFO("create purgatory, min life %"PRIu64" usec", min_life); + + return purga; +} + + +static struct purga_page * +purga_get_page (struct lsquic_purga *purga) +{ + struct purga_page *page; + + page = TAILQ_LAST(&purga->pur_pages, purga_pages); + if (page && !PAGE_IS_FULL(page)) + return page; + + page = malloc(sizeof(*page)); + if (!page) + { + LSQ_INFO("failed to allocate page: %s", strerror(errno)); + return NULL; + } + + page->pupa_count = 0; + page->pupa_last = 0; + memset(page->pupa_mask, 0, sizeof(page->pupa_mask)); + TAILQ_INSERT_TAIL(&purga->pur_pages, page, pupa_next); + LSQ_DEBUG("allocated new page"); + return page; +} + + +static void +purga_remove_cids (struct lsquic_purga *purga, struct purga_page *page) +{ + LSQ_DEBUG("calling remove_cids with %u CID%.*s", page->pupa_count, + page->pupa_count != 1, "s"); + /* XXX It is interesting that pur_remove_ctx is called with peer_ctx + * as an argument, which should could vary (at least theoretically or + * in the future) by path. + */ + purga->pur_remove_cids(purga->pur_remove_ctx, page->pupa_peer_ctx, + page->pupa_cids, page->pupa_count); +} + + +struct purga_el * +lsquic_purga_add (struct lsquic_purga *purga, const lsquic_cid_t *cid, + void *peer_ctx, enum purga_type putype, lsquic_time_t now) +{ + struct purga_page *last_page, *page; + uint64_t hash; + unsigned i, idx, set, bit; + + last_page = purga_get_page(purga); + if (!last_page) + return NULL; /* We do best effort, nothing to do if malloc fails */ + + idx = last_page->pupa_count++; + last_page->pupa_cids [idx] = *cid; + last_page->pupa_peer_ctx[idx] = peer_ctx; + last_page->pupa_els [idx] = (struct purga_el) { + .puel_type = putype, + }; + + hash = XXH64(cid->idbuf, cid->len, 0); + for (i = 0; i < BLOOM_N_FUNCS; ++i) + { + bit = (unsigned) hash & (BLOOM_BITS_PER_EL - 1); + set = ((unsigned) hash >> BLOOM_SET_SHIFT) & (BLOOM_N_MASK_ELS - 1); + last_page->pupa_mask[set] |= BLOOM_ONE << bit; + hash >>= BLOOM_SHIFT; + } + + LSQ_DEBUGC("added %"CID_FMT" to the set", CID_BITS(cid)); + if (PAGE_IS_FULL(last_page)) + { + LSQ_DEBUG("last page is full, set timestamp to %"PRIu64, now); + last_page->pupa_last = now; + } + + while ((page = TAILQ_FIRST(&purga->pur_pages)) + && PAGE_IS_FULL(page) + && page != last_page /* This is theoretical, but still... */ + && page->pupa_last + purga->pur_min_life < now) + { + LSQ_DEBUG("page at timestamp %"PRIu64" expired; now is %"PRIu64, + page->pupa_last, now); + TAILQ_REMOVE(&purga->pur_pages, page, pupa_next); + if (purga->pur_remove_cids && page->pupa_count) + purga_remove_cids(purga, page); + free(page); + } + + return &last_page->pupa_els[idx]; +} + + +struct purga_el * +lsquic_purga_contains (struct lsquic_purga *purga, const lsquic_cid_t *cid) +{ + struct purga_page *page; + unsigned i, bit, set, hits; + uint64_t cid_hash, hash; + + page = TAILQ_FIRST(&purga->pur_pages); + if (!page) + goto end; + + cid_hash = XXH64(cid->idbuf, cid->len, 0); + do + { +#ifndef NDEBUG + ++purga->pur_stats.searches; +#endif + hash = cid_hash; + hits = 0; + for (i = 0; i < BLOOM_N_FUNCS; ++i) + { + bit = (unsigned) hash & (BLOOM_BITS_PER_EL - 1); + set = ((unsigned) hash >> BLOOM_SET_SHIFT) & (BLOOM_N_MASK_ELS - 1); + hits += (page->pupa_mask[set] & (BLOOM_ONE << bit)) != 0; + hash >>= BLOOM_SHIFT; + } + if (hits < BLOOM_N_FUNCS) + goto next_page; + for (i = 0; i < page->pupa_count; ++i) + if (LSQUIC_CIDS_EQ(&page->pupa_cids[i], cid)) + { + LSQ_DEBUGC("found %"CID_FMT, CID_BITS(cid)); + return &page->pupa_els[i]; + } +#ifndef NDEBUG + ++purga->pur_stats.false_hits; +#endif + next_page: + page = TAILQ_NEXT(page, pupa_next); + } + while (page); + + end: + LSQ_DEBUGC("%"CID_FMT" not found", CID_BITS(cid)); + return NULL; +} + + +void +lsquic_purga_destroy (struct lsquic_purga *purga) +{ + struct purga_page *page; + + while ((page = TAILQ_FIRST(&purga->pur_pages))) + { + TAILQ_REMOVE(&purga->pur_pages, page, pupa_next); + if (purga->pur_remove_cids && page->pupa_count) + purga_remove_cids(purga, page); + free(page); + } + free(purga); + LSQ_INFO("destroyed"); +} + + +unsigned +lsquic_purga_cids_per_page (void) +{ + LSQ_DEBUG("CIDs per page: %u", PURGA_ELS_PER_PAGE); + return PURGA_ELS_PER_PAGE; +} + + +#ifndef NDEBUG +struct purga_bloom_stats * +lsquic_purga_get_bloom_stats (struct lsquic_purga *purga) +{ + return &purga->pur_stats; +} +#endif diff --git a/src/liblsquic/lsquic_purga.h b/src/liblsquic/lsquic_purga.h new file mode 100644 index 000000000..6177d9841 --- /dev/null +++ b/src/liblsquic/lsquic_purga.h @@ -0,0 +1,68 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_purga.h -- Purgatory for CIDs + * + * This module keeps a set of CIDs that should be ignored for a period + * of time. It is used when a connection is closed: this way, late + * packets will not create a new connection. + */ + +#ifndef LSQUIC_PURGA_H +#define LSQUIC_PURGA_H 1 + +struct lsquic_purga; + +/* Purgatory type is used to tell what action to take when a packet whose + * CID is in the purgatory is received. + */ +enum purga_type +{ + PUTY_CONN_DELETED, /* Connection was deleted */ + PUTY_CONN_DRAIN, /* Connection is in the "Drain" state */ + PUTY_CID_RETIRED, /* CID was retired */ +}; + +/* User can set these values freely */ +struct purga_el +{ + enum purga_type puel_type; + /* When puel_type is PUTY_CONN_DRAIN, puel_time specifies the time until + * the end of the drain period. + * + * When puel_type is PUTY_CONN_DELETED, puel_time specifies the time + * until the next time stateless reset can be sent. puel_count is the + * number of times puel_time was updated. + */ + unsigned puel_count; + lsquic_time_t puel_time; +}; + +struct lsquic_purga * +lsquic_purga_new (lsquic_time_t min_life, lsquic_cids_update_f remove_cids, + void *remove_ctx); + +struct purga_el * +lsquic_purga_add (struct lsquic_purga *, const lsquic_cid_t *, void *peer_ctx, + enum purga_type, lsquic_time_t); + +struct purga_el * +lsquic_purga_contains (struct lsquic_purga *, const lsquic_cid_t *); + +void +lsquic_purga_destroy (struct lsquic_purga *); + +unsigned +lsquic_purga_cids_per_page (void); + +#ifndef NDEBUG +struct purga_bloom_stats +{ + unsigned long searches; + unsigned long false_hits; +}; + +struct purga_bloom_stats * +lsquic_purga_get_bloom_stats (struct lsquic_purga *); +#endif + +#endif diff --git a/src/liblsquic/lsquic_push_promise.h b/src/liblsquic/lsquic_push_promise.h new file mode 100644 index 000000000..fe94eaf0c --- /dev/null +++ b/src/liblsquic/lsquic_push_promise.h @@ -0,0 +1,90 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#ifndef LSQUIC_PUSH_PROMISE_H +#define LSQUIC_PUSH_PROMISE_H 1 + +struct lsquic_hash_elem; +struct lsquic_stream; + + +enum push_promise_key_type { + PPKT_ID, + PPKT_CONTENT, +}; + + +struct push_promise +{ + /* A push promise is associated with a single stream, while a stream can + * have several push promises it depends on. These push promises are + * stored on a list. A push promise is destroyed when the dependent + * stream is destroyed. This bounds the amount of time when DUPLICATE_PUSH + * frames can be sent out. + */ + SLIST_ENTRY(push_promise) pp_next; + /* Push promises are stored in the same hash and can be searched either + * by ID or by content. To differentiate the two keys, the key type is + * appended at the end PPKT_ID or PPKT_CONTENT. + */ + struct lsquic_hash_elem pp_hash_id, + pp_hash_content; + union { + uint64_t id; + unsigned char buf[9]; + } pp_u_id; +#define pp_id pp_u_id.id + struct lsquic_stream *pp_pushed_stream; + /* This does not include the last key-type byte: */ + size_t pp_content_len; + /* Number of streams holding a reference to this push promise. When this + * value becomes zero, the push promise is destroyed. See lsquic_pp_put(). + * + * The stream on which PUSH_PROMISE frame is sent has a reference in its + * sm_promises list. The push streams themselves have a reference in + * sm_promise. + */ + unsigned pp_refcnt; + /* State for the promise reader. If the state is not PPWS_NONE, we are + * in the process of writing the first push promise on sm_promises list + * (that's the last promise received). + */ + enum { + PPWS_ID0, /* Write first byte of Push ID */ + PPWS_ID1, /* Write second byte of Push ID */ + PPWS_ID2, /* Write third byte of Push ID */ + PPWS_ID3, /* Write fourth byte of Push ID */ + PPWS_ID4, /* Write fifth byte of Push ID */ + PPWS_ID5, /* Write sixth byte of Push ID */ + PPWS_ID6, /* Write seventh byte of Push ID */ + PPWS_ID7, /* Write eighth byte of Push ID */ + PPWS_PFX0, /* Write first NUL byte of the Header Block Prefix */ + PPWS_PFX1, /* Write second NUL byte of the Header Block Prefix */ + PPWS_HBLOCK, /* Write header block -- use sm_push_hblock_off */ + PPWS_DONE, + } pp_write_state; + unsigned pp_write_off; + unsigned char pp_encoded_push_id[8]; + /* The content buffer is the header block: it does not include Header + * Block Prefix. It is followed by one-byte key type PPKT_CONTENT. + */ + unsigned char pp_content_buf[0]; +}; + + +#define lsquic_pp_put(promise_, all_promises_) do { \ + if ((promise_)->pp_refcnt > 0) { \ + --(promise_)->pp_refcnt; \ + if (0 == (promise_)->pp_refcnt) { \ + LSQ_DEBUG("destroy push promise %"PRIu64, (promise_)->pp_id); \ + if ((promise_)->pp_hash_id.qhe_flags & QHE_HASHED) \ + lsquic_hash_erase(all_promises_, &(promise_)->pp_hash_id); \ + if ((promise_)->pp_hash_content.qhe_flags & QHE_HASHED) \ + lsquic_hash_erase(all_promises_, \ + &(promise_)->pp_hash_content); \ + free(promise); \ + } \ + } \ + else \ + assert(0); \ +} while (0) + +#endif diff --git a/src/liblsquic/lsquic_qdec_hdl.c b/src/liblsquic/lsquic_qdec_hdl.c new file mode 100644 index 000000000..a2b3cae39 --- /dev/null +++ b/src/liblsquic/lsquic_qdec_hdl.c @@ -0,0 +1,570 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_qdec_hdl.c -- QPACK decoder streams handler + */ + +#include +#include +#include +#include +#include +#include + +#include "lsquic.h" +#include "lsquic_types.h" +#include "lsquic_int_types.h" +#include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" +#include "lsquic_stream.h" +#include "lsquic_frab_list.h" +#include "lsqpack.h" +#include "lsquic_http1x_if.h" +#include "lsquic_qdec_hdl.h" +#include "lsquic_mm.h" +#include "lsquic_engine_public.h" +#include "lsquic_headers.h" +#include "lsquic_http1x_if.h" +#include "lsquic_conn.h" + +#define LSQUIC_LOGGER_MODULE LSQLM_QDEC_HDL +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(qdh->qdh_conn) +#include "lsquic_logger.h" + +static void +qdh_hblock_unblocked (void *); + + +static int +qdh_write_decoder (struct qpack_dec_hdl *qdh, const unsigned char *buf, + size_t sz) +{ + ssize_t nw; + + if (!(qdh->qdh_dec_sm_out && lsquic_frab_list_empty(&qdh->qdh_fral))) + { + write_to_frab: + if (0 == lsquic_frab_list_write(&qdh->qdh_fral, + (unsigned char *) buf, sz)) + { + LSQ_DEBUG("wrote %zu bytes to frab list", sz); + lsquic_stream_wantwrite(qdh->qdh_dec_sm_out, 1); + return 0; + } + else + { + LSQ_INFO("error writing to frab list"); + return -1; + } + } + + nw = lsquic_stream_write(qdh->qdh_dec_sm_out, buf, sz); + if (nw < 0) + { + LSQ_INFO("error writing to outgoing QPACK decoder stream: %s", + strerror(errno)); + return -1; + } + LSQ_DEBUG("wrote %zd bytes to outgoing QPACK decoder stream", nw); + + if ((size_t) nw == sz) + return 0; + + buf = buf + nw; + sz -= (size_t) nw; + goto write_to_frab; +} + + +static int +qdh_write_type (struct qpack_dec_hdl *qdh) +{ + int s; + +#ifndef NDEBUG + const char *env = getenv("LSQUIC_RND_VARINT_LEN"); + if (env && atoi(env)) + { + s = rand() & 3; + LSQ_DEBUG("writing %d-byte stream type", 1 << s); + } + else +#endif + s = 0; + + switch (s) + { + case 0: + return qdh_write_decoder(qdh, + (unsigned char []) { HQUST_QPACK_DEC }, 1); + case 1: + return qdh_write_decoder(qdh, + (unsigned char []) { 0x40, HQUST_QPACK_DEC }, 2); + case 2: + return qdh_write_decoder(qdh, + (unsigned char []) { 0x80, 0x00, 0x00, HQUST_QPACK_DEC }, 4); + default: + return qdh_write_decoder(qdh, + (unsigned char []) { 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + HQUST_QPACK_DEC }, 8); + } +} + + +static void +qdh_begin_out (struct qpack_dec_hdl *qdh) +{ + if (0 != qdh_write_type(qdh)) + { + LSQ_WARN("%s: could not write to decoder", __func__); + qdh->qdh_conn->cn_if->ci_internal_error(qdh->qdh_conn, + "cannot write to decoder stream"); + } +} + + +int +lsquic_qdh_init (struct qpack_dec_hdl *qdh, struct lsquic_conn *conn, + int is_server, const struct lsquic_engine_public *enpub, + unsigned dyn_table_size, unsigned max_risked_streams) +{ + qdh->qdh_conn = conn; + lsquic_frab_list_init(&qdh->qdh_fral, 0x400, NULL, NULL, NULL); + lsqpack_dec_init(&qdh->qdh_decoder, (void *) conn, dyn_table_size, + max_risked_streams, qdh_hblock_unblocked); + qdh->qdh_flags |= QDH_INITIALIZED; + qdh->qdh_enpub = enpub; + if (qdh->qdh_enpub->enp_hsi_if == lsquic_http1x_if) + { + qdh->qdh_h1x_ctor_ctx = (struct http1x_ctor_ctx) { + .conn = conn, + .max_headers_sz = 0x10000, /* XXX */ + .is_server = is_server, + }; + qdh->qdh_hsi_ctx = &qdh->qdh_h1x_ctor_ctx; + } + else + qdh->qdh_hsi_ctx = qdh->qdh_enpub->enp_hsi_ctx; + if (qdh->qdh_dec_sm_out) + qdh_begin_out(qdh); + if (qdh->qdh_enc_sm_in) + lsquic_stream_wantread(qdh->qdh_enc_sm_in, 1); + LSQ_DEBUG("initialized"); + return 0; +} + + +void +lsquic_qdh_cleanup (struct qpack_dec_hdl *qdh) +{ + if (qdh->qdh_flags & QDH_INITIALIZED) + { + LSQ_DEBUG("cleanup"); + lsqpack_dec_cleanup(&qdh->qdh_decoder); + lsquic_frab_list_cleanup(&qdh->qdh_fral); + qdh->qdh_flags &= ~QDH_INITIALIZED; + } +} + +static lsquic_stream_ctx_t * +qdh_out_on_new (void *stream_if_ctx, struct lsquic_stream *stream) +{ + struct qpack_dec_hdl *const qdh = stream_if_ctx; + qdh->qdh_dec_sm_out = stream; + if (qdh->qdh_flags & QDH_INITIALIZED) + qdh_begin_out(qdh); + LSQ_DEBUG("initialized outgoing decoder stream"); + return (void *) qdh; +} + + +static void +qdh_out_on_write (struct lsquic_stream *stream, lsquic_stream_ctx_t *ctx) +{ + struct qpack_dec_hdl *const qdh = (void *) ctx; + struct lsquic_reader reader; + ssize_t nw; + unsigned char buf[LSQPACK_LONGEST_ICI]; + + if (lsqpack_dec_ici_pending(&qdh->qdh_decoder)) + { + nw = lsqpack_dec_write_ici(&qdh->qdh_decoder, buf, sizeof(buf)); + if (nw > 0) + { + if (0 == qdh_write_decoder(qdh, buf, nw)) + LSQ_DEBUG("wrote %zd-byte TSS instruction", nw); + else + goto err; + } + else if (nw < 0) + { + LSQ_WARN("could not generate TSS instruction"); + goto err; + } + } + + if (lsquic_frab_list_empty(&qdh->qdh_fral)) + { + LSQ_DEBUG("%s: nothing to write", __func__); + lsquic_stream_wantwrite(stream, 0); + return; + } + + reader = (struct lsquic_reader) { + .lsqr_read = lsquic_frab_list_read, + .lsqr_size = lsquic_frab_list_size, + .lsqr_ctx = &qdh->qdh_fral, + }; + + nw = lsquic_stream_writef(stream, &reader); + if (nw >= 0) + { + LSQ_DEBUG("wrote %zd bytes to stream", nw); + (void) lsquic_stream_flush(stream); + if (lsquic_frab_list_empty(&qdh->qdh_fral)) + lsquic_stream_wantwrite(stream, 0); + } + else + { + LSQ_WARN("cannot write to stream: %s", strerror(errno)); + err: + lsquic_stream_wantwrite(stream, 0); + qdh->qdh_conn->cn_if->ci_internal_error(qdh->qdh_conn, + "cannot write to stream"); + } +} + + +static void +qdh_out_on_close (struct lsquic_stream *stream, lsquic_stream_ctx_t *ctx) +{ + struct qpack_dec_hdl *const qdh = (void *) ctx; + qdh->qdh_dec_sm_out = NULL; + LSQ_DEBUG("closed outgoing decoder stream"); +} + + +static void +qdh_out_on_read (struct lsquic_stream *stream, lsquic_stream_ctx_t *ctx) +{ + assert(0); +} + + +static const struct lsquic_stream_if qdh_dec_sm_out_if = +{ + .on_new_stream = qdh_out_on_new, + .on_read = qdh_out_on_read, + .on_write = qdh_out_on_write, + .on_close = qdh_out_on_close, +}; +const struct lsquic_stream_if *const lsquic_qdh_dec_sm_out_if = + &qdh_dec_sm_out_if; + + +static lsquic_stream_ctx_t * +qdh_in_on_new (void *stream_if_ctx, struct lsquic_stream *stream) +{ + struct qpack_dec_hdl *const qdh = stream_if_ctx; + qdh->qdh_enc_sm_in = stream; + if (qdh->qdh_flags & QDH_INITIALIZED) + lsquic_stream_wantread(qdh->qdh_enc_sm_in, 1); + LSQ_DEBUG("initialized incoming encoder stream"); + return (void *) qdh; +} + + +static size_t +qdh_read_encoder_stream (void *ctx, const unsigned char *buf, size_t sz, + int fin) +{ + struct qpack_dec_hdl *const qdh = (void *) ctx; + const struct lsqpack_dec_err *qerr; + int s; + + if (fin) + { + LSQ_INFO("encoder stream is closed"); + qdh->qdh_conn->cn_if->ci_abort_error(qdh->qdh_conn, 1, + HEC_CLOSED_CRITICAL_STREAM, "Peer closed QPACK encoder stream"); + goto end; + } + + s = lsqpack_dec_enc_in(&qdh->qdh_decoder, buf, sz); + if (s != 0) + { + LSQ_INFO("error reading decoder stream"); + qerr = lsqpack_dec_get_err_info(&qdh->qdh_decoder); + qdh->qdh_conn->cn_if->ci_abort_error(qdh->qdh_conn, 1, + HEC_QPACK_DECODER_STREAM_ERROR, "Error interpreting QPACK encoder " + "stream; offset %"PRIu64", line %d", qerr->off, qerr->line); + goto end; + } + if (qdh->qdh_dec_sm_out + && lsqpack_dec_ici_pending(&qdh->qdh_decoder)) + lsquic_stream_wantwrite(qdh->qdh_dec_sm_out, 1); + + LSQ_DEBUG("successfully fed %zu bytes to QPACK decoder", sz); + + end: + return sz; +} + + +static void +qdh_in_on_read (struct lsquic_stream *stream, lsquic_stream_ctx_t *ctx) +{ + struct qpack_dec_hdl *const qdh = (void *) ctx; + ssize_t nread; + + nread = lsquic_stream_readf(stream, qdh_read_encoder_stream, qdh); + if (nread <= 0) + { + if (nread < 0) + { + LSQ_WARN("cannot read from encoder stream: %s", strerror(errno)); + qdh->qdh_conn->cn_if->ci_internal_error(qdh->qdh_conn, + "cannot read from encoder stream"); + } + else + { + LSQ_INFO("encoder stream closed by peer: abort connection"); + qdh->qdh_conn->cn_if->ci_abort_error(qdh->qdh_conn, 1, + HEC_CLOSED_CRITICAL_STREAM, "encoder stream closed"); + } + lsquic_stream_wantread(stream, 0); + } +} + + +static void +qdh_in_on_close (struct lsquic_stream *stream, lsquic_stream_ctx_t *ctx) +{ + struct qpack_dec_hdl *const qdh = (void *) ctx; + LSQ_DEBUG("closed incoming encoder stream"); + qdh->qdh_enc_sm_in = NULL; +} + + +static void +qdh_in_on_write (struct lsquic_stream *stream, lsquic_stream_ctx_t *ctx) +{ + assert(0); +} + + +static const struct lsquic_stream_if qdh_enc_sm_in_if = +{ + .on_new_stream = qdh_in_on_new, + .on_read = qdh_in_on_read, + .on_write = qdh_in_on_write, + .on_close = qdh_in_on_close, +}; +const struct lsquic_stream_if *const lsquic_qdh_enc_sm_in_if = + &qdh_enc_sm_in_if; + + +static void +qdh_hblock_unblocked (void *stream_p) +{ + struct lsquic_stream *const stream = stream_p; + struct qpack_dec_hdl *const qdh = lsquic_stream_get_qdh(stream); + + LSQ_DEBUG("header block for stream %"PRIu64" unblocked", stream->id); + lsquic_stream_qdec_unblocked(stream); +} + + +static int +qdh_supply_hset_to_stream (struct qpack_dec_hdl *qdh, + struct lsquic_stream *stream, struct lsqpack_header_list *qlist) +{ + const struct lsquic_hset_if *const hset_if = qdh->qdh_enpub->enp_hsi_if; + struct uncompressed_headers *uh = NULL; + const struct lsqpack_header *header; + enum lsquic_header_status st; + unsigned i; + void *hset; + + hset = hset_if->hsi_create_header_set(qdh->qdh_hsi_ctx, 0); + if (!hset) + { + LSQ_INFO("call to hsi_create_header_set failed"); + return -1; + } + + LSQ_DEBUG("got header set for stream %"PRIu64, stream->id); + + for (i = 0; i < qlist->qhl_count; ++i) + { + header = qlist->qhl_headers[i]; + LSQ_DEBUG("%.*s: %.*s", header->qh_name_len, header->qh_name, + header->qh_value_len, header->qh_value); + st = hset_if->hsi_process_header(hset, + header->qh_flags & QH_ID_SET ? 62 /* XXX: 62 */ + header->qh_static_id : 0, + header->qh_name, header->qh_name_len, + header->qh_value, header->qh_value_len); + if (st != LSQUIC_HDR_OK) + goto err; + } + + lsqpack_dec_destroy_header_list(qlist); + st = hset_if->hsi_process_header(hset, 0, 0, 0, 0, 0); + if (st != LSQUIC_HDR_OK) + goto err; + + uh = calloc(1, sizeof(*uh)); + if (!uh) + goto err; + uh->uh_stream_id = stream->id; + uh->uh_oth_stream_id = 0; + uh->uh_weight = 0; + uh->uh_exclusive = -1; + if (hset_if == lsquic_http1x_if) + uh->uh_flags |= UH_H1H; + uh->uh_hset = hset; + if (0 != lsquic_stream_uh_in(stream, uh)) + goto err; + LSQ_DEBUG("converted qlist to hset and gave it to stream %"PRIu64, + stream->id); + return 0; + + err: + lsqpack_dec_destroy_header_list(qlist); + hset_if->hsi_discard_header_set(hset); + free(uh); + return -1; +} + + +static enum lsqpack_read_header_status +qdh_header_read_results (struct qpack_dec_hdl *qdh, + struct lsquic_stream *stream, enum lsqpack_read_header_status rhs, + struct lsqpack_header_list *qlist, const unsigned char *dec_buf, + size_t dec_buf_sz) +{ + const struct lsqpack_dec_err *qerr; + + if (rhs == LQRHS_DONE) + { + if (qlist) + { + if (0 != qdh_supply_hset_to_stream(qdh, stream, qlist)) + return LQRHS_ERROR; + if (qdh->qdh_dec_sm_out) + { + if (dec_buf_sz + && 0 != qdh_write_decoder(qdh, dec_buf, dec_buf_sz)) + { + return LQRHS_ERROR; + } + if (dec_buf_sz || lsqpack_dec_ici_pending(&qdh->qdh_decoder)) + lsquic_stream_wantwrite(qdh->qdh_dec_sm_out, 1); + } + } + else + { + assert(0); /* XXX TODO What do we do here? */ + return LQRHS_ERROR; + } + } + else if (rhs == LQRHS_ERROR) + { + qerr = lsqpack_dec_get_err_info(&qdh->qdh_decoder); + qdh->qdh_conn->cn_if->ci_abort_error(qdh->qdh_conn, 1, + HEC_QPACK_DECOMPRESSION_FAILED, "QPACK decompression error; " + "stream %"PRIu64", offset %"PRIu64", line %d", qerr->stream_id, + qerr->off, qerr->line); + } + + return rhs; +} + + +enum lsqpack_read_header_status +lsquic_qdh_header_in_begin (struct qpack_dec_hdl *qdh, + struct lsquic_stream *stream, uint64_t header_size, + const unsigned char **buf, size_t bufsz) +{ + enum lsqpack_read_header_status rhs; + struct lsqpack_header_list *qlist; + size_t dec_buf_sz; + unsigned char dec_buf[LSQPACK_LONGEST_HEADER_ACK]; + + if (qdh->qdh_flags & QDH_INITIALIZED) + { + dec_buf_sz = sizeof(dec_buf); + rhs = lsqpack_dec_header_in(&qdh->qdh_decoder, stream, stream->id, + header_size, buf, bufsz, &qlist, dec_buf, &dec_buf_sz); + return qdh_header_read_results(qdh, stream, rhs, qlist, dec_buf, + dec_buf_sz); + } + else + { + LSQ_WARN("not initialized: cannot process header block"); + return LQRHS_ERROR; + } + +} + + +enum lsqpack_read_header_status +lsquic_qdh_header_in_continue (struct qpack_dec_hdl *qdh, + struct lsquic_stream *stream, const unsigned char **buf, size_t bufsz) +{ + enum lsqpack_read_header_status rhs; + struct lsqpack_header_list *qlist; + size_t dec_buf_sz; + unsigned char dec_buf[LSQPACK_LONGEST_HEADER_ACK]; + + if (qdh->qdh_flags & QDH_INITIALIZED) + { + dec_buf_sz = sizeof(dec_buf); + rhs = lsqpack_dec_header_read(&qdh->qdh_decoder, stream, + buf, bufsz, &qlist, dec_buf, &dec_buf_sz); + return qdh_header_read_results(qdh, stream, rhs, qlist, dec_buf, + dec_buf_sz); + } + else + { + LSQ_WARN("not initialized: cannot process header block"); + return LQRHS_ERROR; + } +} + + +void +lsquic_qdh_unref_stream (struct qpack_dec_hdl *qdh, + struct lsquic_stream *stream) +{ + if (0 == lsqpack_dec_unref_stream(&qdh->qdh_decoder, stream)) + LSQ_DEBUG("unreffed stream %"PRIu64, stream->id); + else + LSQ_WARN("cannot unref stream %"PRIu64, stream->id); +} + + +void +lsquic_qdh_cancel_stream (struct qpack_dec_hdl *qdh, + struct lsquic_stream *stream) +{ + ssize_t nw; + unsigned char buf[LSQPACK_LONGEST_CANCEL]; + + nw = lsqpack_dec_cancel_stream(&qdh->qdh_decoder, stream, buf, sizeof(buf)); + if (nw > 0) + { + if (0 == qdh_write_decoder(qdh, buf, nw)) + LSQ_DEBUG("cancelled stream %"PRIu64" and wrote %zd-byte Cancel " + "Stream instruction to the decoder stream", stream->id, nw); + } + else if (nw == 0) + LSQ_WARN("cannot cancel stream %"PRIu64" -- not found", stream->id); + else + { + LSQ_WARN("cannot cancel stream %"PRIu64" -- not enough buffer space " + "to encode Cancel Stream instructin", stream->id); + lsquic_qdh_unref_stream(qdh, stream); + } +} diff --git a/src/liblsquic/lsquic_qdec_hdl.h b/src/liblsquic/lsquic_qdec_hdl.h new file mode 100644 index 000000000..ed26c6253 --- /dev/null +++ b/src/liblsquic/lsquic_qdec_hdl.h @@ -0,0 +1,72 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_qdec_hdl.h -- QPACK decoder streams handler + * + * The handler owns two unidirectional streams: a) peer-initiated QPACK + * encoder stream, from which it reads; and b) locally-initiated QPACK + * decoder stream, to which it writes. + */ + +#ifndef LSQUIC_QDEC_HDL_H +#define LSQUIC_QDEC_HDL_H 1 + +struct lsquic_conn; +struct lsquic_stream; +struct lsquic_stream_if; +struct lsquic_engine_public; + + +struct qpack_dec_hdl +{ + struct lsquic_conn *qdh_conn; + enum { + QDH_INITIALIZED = 1 << 0, + } qdh_flags; + struct lsqpack_dec qdh_decoder; + struct lsquic_stream *qdh_enc_sm_in; + struct frab_list qdh_fral; + struct lsquic_stream *qdh_dec_sm_out; + const struct lsquic_engine_public + *qdh_enpub; + struct http1x_ctor_ctx qdh_h1x_ctor_ctx; + void *qdh_hsi_ctx; +}; + +int +lsquic_qdh_init (struct qpack_dec_hdl *, struct lsquic_conn *, + int is_server, const struct lsquic_engine_public *, + unsigned dyn_table_size, unsigned max_risked_streams); + +void +lsquic_qdh_cleanup (struct qpack_dec_hdl *); + +#define lsquic_qdh_has_enc_stream(qdh) ((qdh)->qdh_enc_sm_in != NULL) + +enum header_in_status +{ + HIS_DONE, + HIS_NEED, + HIS_BLOCKED, + HIS_ERROR, +}; + + +enum lsqpack_read_header_status +lsquic_qdh_header_in_begin (struct qpack_dec_hdl *, struct lsquic_stream *, + uint64_t size, const unsigned char **, size_t); + +enum lsqpack_read_header_status +lsquic_qdh_header_in_continue (struct qpack_dec_hdl *, struct lsquic_stream *, + const unsigned char **, size_t); + +void +lsquic_qdh_unref_stream (struct qpack_dec_hdl *, struct lsquic_stream *); + +void +lsquic_qdh_cancel_stream (struct qpack_dec_hdl *, + struct lsquic_stream *); + +extern const struct lsquic_stream_if *const lsquic_qdh_enc_sm_in_if; +extern const struct lsquic_stream_if *const lsquic_qdh_dec_sm_out_if; + +#endif diff --git a/src/liblsquic/lsquic_qenc_hdl.c b/src/liblsquic/lsquic_qenc_hdl.c new file mode 100644 index 000000000..723509190 --- /dev/null +++ b/src/liblsquic/lsquic_qenc_hdl.c @@ -0,0 +1,495 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_qenc_hdl.c -- QPACK encoder streams handler + */ + +#include +#include +#include +#include +#include +#include + +#include "lsquic.h" +#include "lsquic_types.h" +#include "lsquic_int_types.h" +#include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" +#include "lsquic_stream.h" +#include "lsquic_frab_list.h" +#include "lsqpack.h" +#include "lsquic_conn.h" +#include "lsquic_qenc_hdl.h" + +#define LSQUIC_LOGGER_MODULE LSQLM_QENC_HDL +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(qeh->qeh_conn) +#include "lsquic_logger.h" + + +static int +qeh_write_type (struct qpack_enc_hdl *qeh) +{ + int s; + +#ifndef NDEBUG + const char *env = getenv("LSQUIC_RND_VARINT_LEN"); + if (env && atoi(env)) + { + s = rand() & 3; + LSQ_DEBUG("writing %d-byte stream type", 1 << s); + } + else +#endif + s = 0; + + switch (s) + { + case 0: + return lsquic_frab_list_write(&qeh->qeh_fral, + (unsigned char []) { HQUST_QPACK_ENC }, 1); + case 1: + return lsquic_frab_list_write(&qeh->qeh_fral, + (unsigned char []) { 0x40, HQUST_QPACK_ENC }, 2); + case 2: + return lsquic_frab_list_write(&qeh->qeh_fral, + (unsigned char []) { 0x80, 0x00, 0x00, HQUST_QPACK_ENC }, 4); + default: + return lsquic_frab_list_write(&qeh->qeh_fral, + (unsigned char []) { 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + HQUST_QPACK_ENC }, 8); + } +} + + +static void +qeh_begin_out (struct qpack_enc_hdl *qeh) +{ + if (0 == qeh_write_type(qeh) + && (qeh->qeh_tsu_sz == 0 + || 0 == lsquic_frab_list_write(&qeh->qeh_fral, qeh->qeh_tsu_buf, + qeh->qeh_tsu_sz))) + { + LSQ_DEBUG("wrote %zu bytes to frab list", 1 + qeh->qeh_tsu_sz); + lsquic_stream_wantwrite(qeh->qeh_enc_sm_out, 1); + } + else + { + LSQ_WARN("could not write to frab list"); + qeh->qeh_conn->cn_if->ci_internal_error(qeh->qeh_conn, + "cannot write to frab list"); + } +} + + +void +lsquic_qeh_init (struct qpack_enc_hdl *qeh, struct lsquic_conn *conn) +{ + assert(!(qeh->qeh_flags & QEH_INITIALIZED)); + qeh->qeh_conn = conn; + lsquic_frab_list_init(&qeh->qeh_fral, 0x400, NULL, NULL, NULL); + lsqpack_enc_preinit(&qeh->qeh_encoder, (void *) conn); + qeh->qeh_flags |= QEH_INITIALIZED; + qeh->qeh_max_prefix_size = + lsqpack_enc_header_block_prefix_size(&qeh->qeh_encoder); + if (qeh->qeh_dec_sm_in) + lsquic_stream_wantread(qeh->qeh_dec_sm_in, 1); + LSQ_DEBUG("initialized"); +} + + +int +lsquic_qeh_settings (struct qpack_enc_hdl *qeh, unsigned max_table_size, + unsigned dyn_table_size, unsigned max_risked_streams, int server) +{ + enum lsqpack_enc_opts enc_opts; + + assert(qeh->qeh_flags & QEH_INITIALIZED); + + if (qeh->qeh_flags & QEH_HAVE_SETTINGS) + { + LSQ_WARN("settings already set"); + return -1; + } + + enc_opts = LSQPACK_ENC_OPT_STAGE_2 + | server ? LSQPACK_ENC_OPT_SERVER : 0; + qeh->qeh_tsu_sz = sizeof(qeh->qeh_tsu_buf); + if (0 != lsqpack_enc_init(&qeh->qeh_encoder, (void *) qeh->qeh_conn, + max_table_size, dyn_table_size, max_risked_streams, enc_opts, + qeh->qeh_tsu_buf, &qeh->qeh_tsu_sz)) + { + LSQ_INFO("could not initialize QPACK encoder"); + return -1; + } + LSQ_DEBUG("%zu-byte post-init TSU", qeh->qeh_tsu_sz); + qeh->qeh_flags |= QEH_HAVE_SETTINGS; + qeh->qeh_max_prefix_size = + lsqpack_enc_header_block_prefix_size(&qeh->qeh_encoder); + LSQ_DEBUG("have settings: max table size=%u; dyn table size=%u; max risked " + "streams=%u", max_table_size, dyn_table_size, max_risked_streams); + if (qeh->qeh_enc_sm_out) + qeh_begin_out(qeh); + return 0; +} + + +void +lsquic_qeh_cleanup (struct qpack_enc_hdl *qeh) +{ + if (qeh->qeh_flags & QEH_INITIALIZED) + { + LSQ_DEBUG("cleanup"); + lsqpack_enc_cleanup(&qeh->qeh_encoder); + lsquic_frab_list_cleanup(&qeh->qeh_fral); + memset(qeh, 0, sizeof(*qeh)); + } +} + +static lsquic_stream_ctx_t * +qeh_out_on_new (void *stream_if_ctx, struct lsquic_stream *stream) +{ + struct qpack_enc_hdl *const qeh = stream_if_ctx; + qeh->qeh_enc_sm_out = stream; + if ((qeh->qeh_flags & (QEH_INITIALIZED|QEH_HAVE_SETTINGS)) + == (QEH_INITIALIZED|QEH_HAVE_SETTINGS)) + qeh_begin_out(qeh); + else + qeh->qeh_conn = lsquic_stream_conn(stream); /* Or NULL deref in log */ + LSQ_DEBUG("initialized outgoing encoder stream"); + return (void *) qeh; +} + + +static void +qeh_out_on_write (struct lsquic_stream *stream, lsquic_stream_ctx_t *ctx) +{ + struct qpack_enc_hdl *const qeh = (void *) ctx; + struct lsquic_reader reader = { + .lsqr_read = lsquic_frab_list_read, + .lsqr_size = lsquic_frab_list_size, + .lsqr_ctx = &qeh->qeh_fral, + }; + ssize_t nw; + + nw = lsquic_stream_writef(stream, &reader); + if (nw >= 0) + { + LSQ_DEBUG("wrote %zd bytes to stream", nw); + (void) lsquic_stream_flush(stream); + if (lsquic_frab_list_empty(&qeh->qeh_fral)) + lsquic_stream_wantwrite(stream, 0); + } + else + { + qeh->qeh_conn->cn_if->ci_internal_error(qeh->qeh_conn, + "cannot write to stream"); + LSQ_WARN("cannot write to stream: %s", strerror(errno)); + lsquic_stream_wantwrite(stream, 0); + } +} + + +static void +qeh_out_on_close (struct lsquic_stream *stream, lsquic_stream_ctx_t *ctx) +{ + struct qpack_enc_hdl *const qeh = (void *) ctx; + qeh->qeh_enc_sm_out = NULL; + LSQ_DEBUG("closed outgoing encoder stream"); +} + + +static void +qeh_out_on_read (struct lsquic_stream *stream, lsquic_stream_ctx_t *ctx) +{ + assert(0); +} + + +static const struct lsquic_stream_if qeh_enc_sm_out_if = +{ + .on_new_stream = qeh_out_on_new, + .on_read = qeh_out_on_read, + .on_write = qeh_out_on_write, + .on_close = qeh_out_on_close, +}; +const struct lsquic_stream_if *const lsquic_qeh_enc_sm_out_if = + &qeh_enc_sm_out_if; + + +static lsquic_stream_ctx_t * +qeh_in_on_new (void *stream_if_ctx, struct lsquic_stream *stream) +{ + struct qpack_enc_hdl *const qeh = stream_if_ctx; + qeh->qeh_dec_sm_in = stream; + if (qeh->qeh_flags & QEH_INITIALIZED) + lsquic_stream_wantread(qeh->qeh_dec_sm_in, 1); + else + qeh->qeh_conn = lsquic_stream_conn(stream); /* Or NULL deref in log */ + LSQ_DEBUG("initialized incoming decoder stream"); + return (void *) qeh; +} + + +static size_t +qeh_read_decoder_stream (void *ctx, const unsigned char *buf, size_t sz, + int fin) +{ + struct qpack_enc_hdl *const qeh = (void *) ctx; + uint64_t offset; + int s; + + if (fin) + { + LSQ_INFO("decoder stream is closed"); + qeh->qeh_conn->cn_if->ci_abort_error(qeh->qeh_conn, 1, + HEC_CLOSED_CRITICAL_STREAM, "Peer closed QPACK decoder stream"); + goto end; + } + + offset = lsquic_stream_read_offset(qeh->qeh_dec_sm_in); + s = lsqpack_enc_decoder_in(&qeh->qeh_encoder, buf, sz); + if (s != 0) + { + LSQ_INFO("error reading decoder stream"); + qeh->qeh_conn->cn_if->ci_abort_error(qeh->qeh_conn, 1, + HEC_QPACK_DECODER_STREAM_ERROR, "Error interpreting QPACK decoder " + "stream at offset %"PRIu64, offset); + goto end; + } + LSQ_DEBUG("successfully fed %zu bytes to QPACK decoder", sz); + + end: + return sz; +} + + +static void +qeh_in_on_read (struct lsquic_stream *stream, lsquic_stream_ctx_t *ctx) +{ + struct qpack_enc_hdl *const qeh = (void *) ctx; + ssize_t nread; + + nread = lsquic_stream_readf(stream, qeh_read_decoder_stream, qeh); + if (nread <= 0) + { + if (nread < 0) + { + LSQ_WARN("cannot read from encoder stream: %s", strerror(errno)); + qeh->qeh_conn->cn_if->ci_internal_error(qeh->qeh_conn, + "cannot read from encoder stream"); + } + else + { + LSQ_INFO("encoder stream closed by peer: abort connection"); + qeh->qeh_conn->cn_if->ci_abort_error(qeh->qeh_conn, 1, + HEC_CLOSED_CRITICAL_STREAM, "encoder stream closed"); + } + lsquic_stream_wantread(stream, 0); + } +} + + +static void +qeh_in_on_close (struct lsquic_stream *stream, lsquic_stream_ctx_t *ctx) +{ + struct qpack_enc_hdl *const qeh = (void *) ctx; + LSQ_DEBUG("closed incoming decoder stream"); + qeh->qeh_dec_sm_in = NULL; +} + + +static void +qeh_in_on_write (struct lsquic_stream *stream, lsquic_stream_ctx_t *ctx) +{ + assert(0); +} + + +static const struct lsquic_stream_if qeh_dec_sm_in_if = +{ + .on_new_stream = qeh_in_on_new, + .on_read = qeh_in_on_read, + .on_write = qeh_in_on_write, + .on_close = qeh_in_on_close, +}; +const struct lsquic_stream_if *const lsquic_qeh_dec_sm_in_if = + &qeh_dec_sm_in_if; + + +static enum qwh_status +qeh_write_headers (struct qpack_enc_hdl *qeh, lsquic_stream_id_t stream_id, + unsigned seqno, const struct lsquic_http_headers *headers, + unsigned char *buf, size_t *prefix_sz, size_t *headers_sz, + uint64_t *completion_offset) +{ + unsigned char *p = buf; + unsigned char *const end = buf + *headers_sz; + const unsigned char *enc_p; + size_t enc_sz, hea_sz, total_enc_sz; + ssize_t nw; + enum lsqpack_enc_status st; + int i, s, write_to_stream; + enum lsqpack_enc_flags enc_flags; + unsigned char enc_buf[ qeh->qeh_encoder.qpe_cur_max_capacity * 2 ]; + + s = lsqpack_enc_start_header(&qeh->qeh_encoder, stream_id, 0); + if (s != 0) + { + LSQ_WARN("cannot start header"); + return QWH_ERR; + } + LSQ_DEBUG("begin encoding headers for stream %"PRIu64, stream_id); + + if (qeh->qeh_enc_sm_out) + enc_flags = 0; + else + { + enc_flags = LQEF_NO_INDEX; + LSQ_DEBUG("encoder stream is unavailable, won't index headers"); + } + write_to_stream = qeh->qeh_enc_sm_out + && lsquic_frab_list_empty(&qeh->qeh_fral); + total_enc_sz = 0; + for (i = 0; i < headers->count; ++i) + { + enc_sz = sizeof(enc_buf); + hea_sz = end - p; + st = lsqpack_enc_encode(&qeh->qeh_encoder, enc_buf, &enc_sz, p, + &hea_sz, headers->headers[i].name.iov_base, + headers->headers[i].name.iov_len, + headers->headers[i].value.iov_base, + headers->headers[i].value.iov_len, enc_flags); + switch (st) + { + case LQES_OK: + LSQ_DEBUG("encoded `%.*s': `%.*s' -- %zd bytes to header block, " + "%zd bytes to encoder stream", + (int) headers->headers[i].name.iov_len, + (char *) headers->headers[i].name.iov_base, + (int) headers->headers[i].value.iov_len, + (char *) headers->headers[i].value.iov_base, + hea_sz, enc_sz); + total_enc_sz += enc_sz; + p += hea_sz; + if (enc_sz) + { + if (write_to_stream) + { + nw = lsquic_stream_write(qeh->qeh_enc_sm_out, enc_buf, enc_sz); + if ((size_t) nw == enc_sz) + break; + if (nw < 0) + { + LSQ_INFO("could not write to encoder stream: %s", + strerror(errno)); + return QWH_ERR; + } + write_to_stream = 0; + enc_p = enc_buf + (size_t) nw; + enc_sz -= (size_t) nw; + } + else + enc_p = enc_buf; + if (0 != lsquic_frab_list_write(&qeh->qeh_fral, enc_p, enc_sz)) + { + LSQ_INFO("could not write to frab list"); + return QWH_ERR; + } + } + break; + case LQES_NOBUF_HEAD: + return QWH_ENOBUF; + default: + assert(0); + return QWH_ERR; + case LQES_NOBUF_ENC: + LSQ_DEBUG("not enough room to write encoder stream data"); + return QWH_ERR; + } + } + + nw = lsqpack_enc_end_header(&qeh->qeh_encoder, buf - *prefix_sz, *prefix_sz); + if (nw <= 0) + { + LSQ_WARN("could not end header: %zd", nw); + return QWH_ERR; + } + + if ((size_t) nw < *prefix_sz) + { + memmove(buf - nw, buf - *prefix_sz, (size_t) nw); + *prefix_sz = (size_t) nw; + } + *headers_sz = p - buf; + if (lsquic_frab_list_empty(&qeh->qeh_fral)) + { + LSQ_DEBUG("all %zd bytes of encoder stream written out; header block " + "is %zd bytes; estimated compression ratio %.3f", total_enc_sz, + *headers_sz, lsqpack_enc_ratio(&qeh->qeh_encoder)); + return QWH_FULL; + } + else + { + *completion_offset = lsquic_qeh_enc_off(qeh) + + lsquic_frab_list_size(&qeh->qeh_fral); + LSQ_DEBUG("not all %zd bytes of encoder stream written out; %zd bytes " + "buffered; header block is %zd bytes; estimated compression ratio " + "%.3f", total_enc_sz, lsquic_frab_list_size(&qeh->qeh_fral), + *headers_sz, lsqpack_enc_ratio(&qeh->qeh_encoder)); + return QWH_PARTIAL; + } +} + + +#if !defined(NDEBUG) && __GNUC__ +__attribute__((weak)) +#endif +enum qwh_status +lsquic_qeh_write_headers (struct qpack_enc_hdl *qeh, + lsquic_stream_id_t stream_id, unsigned seqno, + const struct lsquic_http_headers *headers, unsigned char *buf, + size_t *prefix_sz, size_t *headers_sz, uint64_t *completion_offset) +{ + if (qeh->qeh_flags & QEH_INITIALIZED) + return qeh_write_headers(qeh, stream_id, seqno, headers, buf, + prefix_sz, headers_sz, completion_offset); + else + return QWH_ERR; +} + + +#if !defined(NDEBUG) && __GNUC__ +__attribute__((weak)) +#endif +uint64_t +lsquic_qeh_enc_off (struct qpack_enc_hdl *qeh) +{ + if (qeh->qeh_enc_sm_out) + return qeh->qeh_enc_sm_out->tosend_off; + else + return 0; +} + + +size_t +lsquic_qeh_write_avail (struct qpack_enc_hdl *qeh) +{ + if ((qeh->qeh_flags & QEH_INITIALIZED) && qeh->qeh_enc_sm_out) + return lsquic_stream_write_avail(qeh->qeh_enc_sm_out); + else if (qeh->qeh_flags & QEH_INITIALIZED) + return ~((size_t) 0); /* Unlimited write */ + else + return 0; +} + + +size_t +lsquic_qeh_max_prefix_size (const struct qpack_enc_hdl *qeh) +{ + if (qeh->qeh_flags & QEH_HAVE_SETTINGS) + return qeh->qeh_max_prefix_size; + else + return LSQPACK_UINT64_ENC_SZ * 2; +} diff --git a/src/liblsquic/lsquic_qenc_hdl.h b/src/liblsquic/lsquic_qenc_hdl.h new file mode 100644 index 000000000..96d7e74fe --- /dev/null +++ b/src/liblsquic/lsquic_qenc_hdl.h @@ -0,0 +1,75 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_qenc_hdl.h -- QPACK encoder streams handler + * + * The handler owns two unidirectional streams: a) locally-initiated QPACK + * encoder stream, to which it writes; and b) peer-initiated QPACK decoder + * stream, from which it reads. + */ + +#ifndef LSQUIC_QENC_HDL_H +#define LSQUIC_QENC_HDL_H 1 + +struct lsquic_conn; +struct lsquic_stream; +struct lsquic_stream_if; + +struct qpack_enc_hdl +{ + struct lsquic_conn *qeh_conn; + enum { + QEH_INITIALIZED = 1 << 0, + QEH_HAVE_SETTINGS = 1 << 1, + } qeh_flags; + unsigned qeh_max_prefix_size; + struct lsqpack_enc qeh_encoder; + struct lsquic_stream *qeh_enc_sm_out; + struct frab_list qeh_fral; + struct lsquic_stream *qeh_dec_sm_in; + size_t qeh_tsu_sz; + unsigned char qeh_tsu_buf[LSQPACK_LONGEST_SDTC]; +}; + +void +lsquic_qeh_init (struct qpack_enc_hdl *, struct lsquic_conn *); + +int +lsquic_qeh_settings (struct qpack_enc_hdl *, unsigned max_table_size, + unsigned dyn_table_size, unsigned max_risked_streams, int server); + +void +lsquic_qeh_cleanup (struct qpack_enc_hdl *); + +#define lsquic_qeh_has_dec_stream(qeh) ((qeh)->qeh_dec_sm_in != NULL) + +enum qwh_status { + QWH_FULL, /* All bytes written to encoder stream. This is also returned + * if there were no bytes to write. + */ + QWH_PARTIAL,/* Not all bytes are written to the encoder stream. In this + * case, `completion_offset' is set to the value of the + * encoder stream offset when the necessary bytes will have + * been written. + */ + QWH_ENOBUF, /* Not enough room in `buf' to write the full header block */ + QWH_ERR, /* Some other error */ +}; + +enum qwh_status +lsquic_qeh_write_headers (struct qpack_enc_hdl *, lsquic_stream_id_t stream_id, + unsigned seqno, const struct lsquic_http_headers *, unsigned char *buf, + size_t *prefix_sz, size_t *headers_sz, uint64_t *completion_offset); + +uint64_t +lsquic_qeh_enc_off (struct qpack_enc_hdl *); + +size_t +lsquic_qeh_write_avail (struct qpack_enc_hdl *); + +size_t +lsquic_qeh_max_prefix_size (const struct qpack_enc_hdl *); + +extern const struct lsquic_stream_if *const lsquic_qeh_enc_sm_out_if; +extern const struct lsquic_stream_if *const lsquic_qeh_dec_sm_in_if; + +#endif diff --git a/src/liblsquic/lsquic_qlog.c b/src/liblsquic/lsquic_qlog.c index a0d11a284..a726b0967 100644 --- a/src/liblsquic/lsquic_qlog.c +++ b/src/liblsquic/lsquic_qlog.c @@ -34,7 +34,7 @@ void -lsquic_qlog_create_connection (lsquic_cid_t cid, +lsquic_qlog_create_connection (const lsquic_cid_t* cid, const struct sockaddr *local_sa, const struct sockaddr *peer_sa) { @@ -94,7 +94,7 @@ lsquic_qlog_create_connection (lsquic_cid_t cid, sizeof(QLOG_FRAME_DICT_SUFFIX))) void -lsquic_qlog_packet_rx (lsquic_cid_t cid, +lsquic_qlog_packet_rx (const lsquic_cid_t* cid, const struct lsquic_packet_in *packet_in, const unsigned char *packet_in_data, size_t packet_in_size) @@ -154,7 +154,7 @@ lsquic_qlog_packet_rx (lsquic_cid_t cid, void -lsquic_qlog_hsk_completed (lsquic_cid_t cid) +lsquic_qlog_hsk_completed (const lsquic_cid_t* cid) { LCID("[%" PRIu64 ",\"CONNECTIVITY\",\"HANDSHAKE\",\"PACKET_RX\"," "{\"status\":\"complete\"}]", lsquic_time_now()); @@ -162,7 +162,7 @@ lsquic_qlog_hsk_completed (lsquic_cid_t cid) void -lsquic_qlog_zero_rtt (lsquic_cid_t cid) +lsquic_qlog_zero_rtt (const lsquic_cid_t* cid) { LCID("[%" PRIu64 ",\"RECOVERY\",\"RTT_UPDATE\",\"PACKET_RX\"," "{\"zero_rtt\":\"successful\"}]", lsquic_time_now()); @@ -170,7 +170,7 @@ lsquic_qlog_zero_rtt (lsquic_cid_t cid) void -lsquic_qlog_check_certs (lsquic_cid_t cid, const lsquic_str_t **certs, +lsquic_qlog_check_certs (const lsquic_cid_t* cid, const lsquic_str_t **certs, size_t count) { size_t i; @@ -199,7 +199,7 @@ lsquic_qlog_check_certs (lsquic_cid_t cid, const lsquic_str_t **certs, void -lsquic_qlog_version_negotiation (lsquic_cid_t cid, +lsquic_qlog_version_negotiation (const lsquic_cid_t* cid, const char *action, const char *ver) { char *trig; @@ -208,7 +208,7 @@ lsquic_qlog_version_negotiation (lsquic_cid_t cid, return; if (strcmp(action, "proposed") == 0) trig = "LINE"; - else if (strcmp(action, "agreed") == 0) + else if (strcmp(action, "supports") == 0 || strcmp(action, "agreed") == 0) trig = "PACKET_RX"; else return; diff --git a/src/liblsquic/lsquic_qlog.h b/src/liblsquic/lsquic_qlog.h index 63c55550e..e7ce78746 100644 --- a/src/liblsquic/lsquic_qlog.h +++ b/src/liblsquic/lsquic_qlog.h @@ -62,11 +62,11 @@ EventData */ void -lsquic_qlog_create_connection (lsquic_cid_t, const struct sockaddr *, +lsquic_qlog_create_connection (const lsquic_cid_t *, const struct sockaddr *, const struct sockaddr *); void -lsquic_qlog_packet_rx (lsquic_cid_t cid, const struct lsquic_packet_in *, +lsquic_qlog_packet_rx (const lsquic_cid_t * cid, const struct lsquic_packet_in *, const unsigned char *, size_t); #define QLOG_PACKET_RX(...) do { \ @@ -75,15 +75,15 @@ lsquic_qlog_packet_rx (lsquic_cid_t cid, const struct lsquic_packet_in *, } while (0) void -lsquic_qlog_hsk_completed (lsquic_cid_t); +lsquic_qlog_hsk_completed (const lsquic_cid_t *); void -lsquic_qlog_zero_rtt (lsquic_cid_t); +lsquic_qlog_zero_rtt (const lsquic_cid_t *); void -lsquic_qlog_check_certs (lsquic_cid_t, const lsquic_str_t **, size_t); +lsquic_qlog_check_certs (const lsquic_cid_t *, const lsquic_str_t **, size_t); void -lsquic_qlog_version_negotiation (lsquic_cid_t, const char *, const char *); +lsquic_qlog_version_negotiation (const lsquic_cid_t *, const char *, const char *); -#endif \ No newline at end of file +#endif diff --git a/src/liblsquic/lsquic_qpack_dec_logger.h b/src/liblsquic/lsquic_qpack_dec_logger.h new file mode 100644 index 000000000..840ca4edd --- /dev/null +++ b/src/liblsquic/lsquic_qpack_dec_logger.h @@ -0,0 +1,19 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* This header file is included into lsqpack.c */ + +#include "lsquic.h" +#include "lsquic_int_types.h" +#include "lsquic_hash.h" +#include "lsquic_conn.h" + +#undef LSQUIC_LOGGER_MODULE +#undef LSQUIC_LOG_CONN_ID + +#define LSQUIC_LOGGER_MODULE LSQLM_QPACK_DEC +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(dec->qpd_logger_ctx) +#include "lsquic_logger.h" + +#define D_DEBUG LSQ_DEBUG +#define D_INFO LSQ_INFO +#define D_WARN LSQ_WARN +#define D_ERROR LSQ_ERROR diff --git a/src/liblsquic/lsquic_qpack_enc_logger.h b/src/liblsquic/lsquic_qpack_enc_logger.h new file mode 100644 index 000000000..3e6b2928f --- /dev/null +++ b/src/liblsquic/lsquic_qpack_enc_logger.h @@ -0,0 +1,16 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* This header file is included into lsqpack.c */ + +#include "lsquic.h" +#include "lsquic_int_types.h" +#include "lsquic_hash.h" +#include "lsquic_conn.h" + +#define LSQUIC_LOGGER_MODULE LSQLM_QPACK_ENC +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(enc->qpe_logger_ctx) +#include "lsquic_logger.h" + +#define E_DEBUG LSQ_DEBUG +#define E_INFO LSQ_INFO +#define E_WARN LSQ_WARN +#define E_ERROR LSQ_ERROR diff --git a/src/liblsquic/lsquic_rechist.c b/src/liblsquic/lsquic_rechist.c index 2fa3e57c6..80c5d3e87 100644 --- a/src/liblsquic/lsquic_rechist.c +++ b/src/liblsquic/lsquic_rechist.c @@ -17,16 +17,17 @@ #include "lsquic_rechist.h" #define LSQUIC_LOGGER_MODULE LSQLM_RECHIST -#define LSQUIC_LOG_CONN_ID rechist->rh_cid +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(rechist->rh_conn) #include "lsquic_logger.h" void -lsquic_rechist_init (struct lsquic_rechist *rechist, lsquic_cid_t cid) +lsquic_rechist_init (struct lsquic_rechist *rechist, + const struct lsquic_conn *conn, int ietf) { memset(rechist, 0, sizeof(*rechist)); - rechist->rh_cid = cid; - rechist->rh_cutoff = 1; + rechist->rh_conn = conn; + rechist->rh_cutoff = ietf ? 0 : 1; lsquic_packints_init(&rechist->rh_pints); LSQ_DEBUG("instantiated received packet history"); } diff --git a/src/liblsquic/lsquic_rechist.h b/src/liblsquic/lsquic_rechist.h index 39cf98af9..e932e1b1b 100644 --- a/src/liblsquic/lsquic_rechist.h +++ b/src/liblsquic/lsquic_rechist.h @@ -8,13 +8,15 @@ #ifndef LSQUIC_RECHIST_H #define LSQUIC_RECHIST_H 1 +struct lsquic_conn; + #include "lsquic_packints.h" struct lsquic_rechist { struct packints rh_pints; lsquic_packno_t rh_cutoff; lsquic_time_t rh_largest_acked_received; - lsquic_cid_t rh_cid; /* Used for logging */ + const struct lsquic_conn *rh_conn; /* Used for logging */ /* Chromium limits the number of tracked packets (see * kMaxTrackedPackets). We could do this, too. */ @@ -27,7 +29,7 @@ struct lsquic_rechist { typedef struct lsquic_rechist lsquic_rechist_t; void -lsquic_rechist_init (struct lsquic_rechist *, lsquic_cid_t); +lsquic_rechist_init (struct lsquic_rechist *, const struct lsquic_conn *, int); void lsquic_rechist_cleanup (struct lsquic_rechist *); diff --git a/src/liblsquic/lsquic_rtt.c b/src/liblsquic/lsquic_rtt.c index f631b184e..2915b49c6 100644 --- a/src/liblsquic/lsquic_rtt.c +++ b/src/liblsquic/lsquic_rtt.c @@ -33,9 +33,12 @@ lsquic_rtt_stats_update (struct lsquic_rtt_stats *stats, >> BETA_SHIFT; stats->srtt -= stats->srtt >> ALPHA_SHIFT; stats->srtt += send_delta >> ALPHA_SHIFT; + if (send_delta < stats->min_rtt) + stats->min_rtt = send_delta; } else { /* First measurement */ stats->srtt = send_delta; stats->rttvar = send_delta >> 1; + stats->min_rtt = send_delta; } } diff --git a/src/liblsquic/lsquic_rtt.h b/src/liblsquic/lsquic_rtt.h index e2f2a9c04..5c3ae6076 100644 --- a/src/liblsquic/lsquic_rtt.h +++ b/src/liblsquic/lsquic_rtt.h @@ -11,6 +11,7 @@ struct lsquic_rtt_stats { lsquic_time_t srtt; lsquic_time_t rttvar; + lsquic_time_t min_rtt; }; @@ -23,4 +24,6 @@ lsquic_rtt_stats_update (struct lsquic_rtt_stats *, lsquic_time_t send_delta, #define lsquic_rtt_stats_get_rttvar(stats) ((stats)->rttvar) +#define lsquic_rtt_stats_get_min_rtt(stats) (+(stats)->min_rtt) + #endif diff --git a/src/liblsquic/lsquic_send_ctl.c b/src/liblsquic/lsquic_send_ctl.c index 4654789af..d8f62b906 100644 --- a/src/liblsquic/lsquic_send_ctl.c +++ b/src/liblsquic/lsquic_send_ctl.c @@ -15,27 +15,37 @@ #include "lsquic.h" #include "lsquic_mm.h" #include "lsquic_engine_public.h" -#include "lsquic_alarmset.h" #include "lsquic_packet_common.h" +#include "lsquic_alarmset.h" #include "lsquic_parse.h" #include "lsquic_packet_out.h" #include "lsquic_senhist.h" #include "lsquic_rtt.h" #include "lsquic_cubic.h" #include "lsquic_pacer.h" +#include "lsquic_bw_sampler.h" +#include "lsquic_minmax.h" +#include "lsquic_bbr.h" #include "lsquic_send_ctl.h" #include "lsquic_util.h" #include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" #include "lsquic_stream.h" #include "lsquic_ver_neg.h" #include "lsquic_ev_log.h" #include "lsquic_conn.h" #include "lsquic_conn_flow.h" #include "lsquic_conn_public.h" +#include "lsquic_cong_ctl.h" +#include "lsquic_enc_sess.h" +#include "lsquic_h3_prio.h" #include "lsquic_hash.h" +#include "lsquic_malo.h" #define LSQUIC_LOGGER_MODULE LSQLM_SENDCTL -#define LSQUIC_LOG_CONN_ID ctl->sc_conn_pub->lconn->cn_cid +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(ctl->sc_conn_pub->lconn) #include "lsquic_logger.h" #define MAX_RESUBMITTED_ON_RTO 2 @@ -45,6 +55,8 @@ #define MIN_RTO_DELAY 1000000 /* Microseconds */ #define N_NACKS_BEFORE_RETX 3 +#define CGP(ctl) ((struct cong_ctl *) &(ctl)->sc_cong_u) + #define packet_out_total_sz(p) \ lsquic_packet_out_total_sz(ctl->sc_conn_pub->lconn, p) #define packet_out_sent_sz(p) \ @@ -65,6 +77,14 @@ static const char *const retx2str[] = { [RETX_MODE_RTO] = "RETX_MODE_RTO", }; +#ifdef NDEBUG +#define MAX_BPQ_COUNT 10 +#else +static unsigned MAX_BPQ_COUNT = 10; +void +lsquic_send_ctl_set_max_bpq_count (unsigned count) { MAX_BPQ_COUNT = count; } +#endif + static void update_for_resending (lsquic_send_ctl_t *ctl, lsquic_packet_out_t *packet_out); @@ -74,17 +94,22 @@ enum expire_filter { EXFI_ALL, EXFI_HSK, EXFI_LAST, }; static void -send_ctl_expire (lsquic_send_ctl_t *, enum expire_filter); +send_ctl_expire (struct lsquic_send_ctl *, enum packnum_space, + enum expire_filter); static void -set_retx_alarm (lsquic_send_ctl_t *ctl); +set_retx_alarm (struct lsquic_send_ctl *, enum packnum_space, lsquic_time_t); static void -send_ctl_detect_losses (lsquic_send_ctl_t *ctl, lsquic_time_t time); +send_ctl_detect_losses (struct lsquic_send_ctl *, enum packnum_space, + lsquic_time_t time); static unsigned send_ctl_retx_bytes_out (const struct lsquic_send_ctl *ctl); +static unsigned +send_ctl_all_bytes_out (const struct lsquic_send_ctl *ctl); + #ifdef NDEBUG static @@ -114,32 +139,41 @@ int lsquic_send_ctl_have_unacked_stream_frames (const lsquic_send_ctl_t *ctl) { const lsquic_packet_out_t *packet_out; - TAILQ_FOREACH(packet_out, &ctl->sc_unacked_packets, po_next) - if (packet_out->po_frame_types & - ((1 << QUIC_FRAME_STREAM) | (1 << QUIC_FRAME_RST_STREAM))) + + TAILQ_FOREACH(packet_out, &ctl->sc_unacked_packets[PNS_APP], po_next) + if (0 == (packet_out->po_flags & PO_LOSS_REC) + && (packet_out->po_frame_types & + ((1 << QUIC_FRAME_STREAM) | (1 << QUIC_FRAME_RST_STREAM)))) return 1; + return 0; } static lsquic_packet_out_t * -send_ctl_first_unacked_retx_packet (const lsquic_send_ctl_t *ctl) +send_ctl_first_unacked_retx_packet (const struct lsquic_send_ctl *ctl, + enum packnum_space pns) { lsquic_packet_out_t *packet_out; - TAILQ_FOREACH(packet_out, &ctl->sc_unacked_packets, po_next) - if (packet_out->po_frame_types & QFRAME_RETRANSMITTABLE_MASK) + + TAILQ_FOREACH(packet_out, &ctl->sc_unacked_packets[pns], po_next) + if (0 == (packet_out->po_flags & PO_LOSS_REC) + && (packet_out->po_frame_types & ctl->sc_retx_frames)) return packet_out; + return NULL; } static lsquic_packet_out_t * -send_ctl_last_unacked_retx_packet (const lsquic_send_ctl_t *ctl) +send_ctl_last_unacked_retx_packet (const struct lsquic_send_ctl *ctl, + enum packnum_space pns) { lsquic_packet_out_t *packet_out; - TAILQ_FOREACH_REVERSE(packet_out, &ctl->sc_unacked_packets, + TAILQ_FOREACH_REVERSE(packet_out, &ctl->sc_unacked_packets[pns], lsquic_packets_tailq, po_next) - if (packet_out->po_frame_types & QFRAME_RETRANSMITTABLE_MASK) + if (0 == (packet_out->po_flags & PO_LOSS_REC) + && (packet_out->po_frame_types & ctl->sc_retx_frames)) return packet_out; return NULL; } @@ -149,15 +183,18 @@ static int have_unacked_handshake_packets (const lsquic_send_ctl_t *ctl) { const lsquic_packet_out_t *packet_out; - TAILQ_FOREACH(packet_out, &ctl->sc_unacked_packets, po_next) - if (packet_out->po_flags & PO_HELLO) - return 1; + enum packnum_space pns; + + for (pns = ctl->sc_flags & SC_IETF ? PNS_INIT : PNS_APP; pns < N_PNS; ++pns) + TAILQ_FOREACH(packet_out, &ctl->sc_unacked_packets[pns], po_next) + if (packet_out->po_flags & PO_HELLO) + return 1; return 0; } static enum retx_mode -get_retx_mode (lsquic_send_ctl_t *ctl) +get_retx_mode (const lsquic_send_ctl_t *ctl) { if (!(ctl->sc_conn_pub->lconn->cn_flags & LSCONN_HANDSHAKE_DONE) && have_unacked_handshake_packets(ctl)) @@ -190,14 +227,17 @@ get_retx_delay (const struct lsquic_rtt_stats *rtt_stats) static void -retx_alarm_rings (void *ctx, lsquic_time_t expiry, lsquic_time_t now) +retx_alarm_rings (enum alarm_id al_id, void *ctx, lsquic_time_t expiry, lsquic_time_t now) { lsquic_send_ctl_t *ctl = ctx; lsquic_packet_out_t *packet_out; + enum packnum_space pns; enum retx_mode rm; + pns = al_id - AL_RETX_INIT; + /* This is a callback -- before it is called, the alarm is unset */ - assert(!lsquic_alarmset_is_set(ctl->sc_alset, AL_RETX)); + assert(!lsquic_alarmset_is_set(ctl->sc_alset, AL_RETX_INIT + pns)); rm = get_retx_mode(ctl); LSQ_INFO("retx timeout, mode %s", retx2str[rm]); @@ -205,54 +245,102 @@ retx_alarm_rings (void *ctx, lsquic_time_t expiry, lsquic_time_t now) switch (rm) { case RETX_MODE_HANDSHAKE: - send_ctl_expire(ctl, EXFI_HSK); + send_ctl_expire(ctl, pns, EXFI_HSK); /* Do not register cubic loss during handshake */ break; case RETX_MODE_LOSS: - send_ctl_detect_losses(ctl, lsquic_time_now()); + send_ctl_detect_losses(ctl, pns, now); break; case RETX_MODE_TLP: ++ctl->sc_n_tlp; - send_ctl_expire(ctl, EXFI_LAST); + send_ctl_expire(ctl, pns, EXFI_LAST); break; case RETX_MODE_RTO: + ctl->sc_last_rto_time = now; ++ctl->sc_n_consec_rtos; ctl->sc_next_limit = 2; LSQ_DEBUG("packet RTO is %"PRIu64" usec", expiry); - send_ctl_expire(ctl, EXFI_ALL); - lsquic_cubic_timeout(&ctl->sc_cubic); + send_ctl_expire(ctl, pns, EXFI_ALL); + ctl->sc_ci->cci_timeout(CGP(ctl)); break; } - packet_out = send_ctl_first_unacked_retx_packet(ctl); + packet_out = send_ctl_first_unacked_retx_packet(ctl, pns); if (packet_out) - set_retx_alarm(ctl); + set_retx_alarm(ctl, pns, now); lsquic_send_ctl_sanity_check(ctl); } +static lsquic_packno_t +first_packno (const struct lsquic_send_ctl *ctl) +{ + if (ctl->sc_flags & SC_IETF) + return 0; + else + return 1; +} + + +/* + * [draft-ietf-quic-transport-12], Section 4.4.1: + * + * " The first Initial packet that is sent by a client contains a packet + * " number of 0. All subsequent packets contain a packet number that is + * " incremented by at least one, see (Section 4.8). + */ +static void +send_ctl_pick_initial_packno (struct lsquic_send_ctl *ctl) +{ + ctl->sc_cur_packno = first_packno(ctl) - 1; +} + + void lsquic_send_ctl_init (lsquic_send_ctl_t *ctl, struct lsquic_alarmset *alset, struct lsquic_engine_public *enpub, const struct ver_neg *ver_neg, - struct lsquic_conn_public *conn_pub, unsigned short pack_size) + struct lsquic_conn_public *conn_pub, enum send_ctl_flags flags) { - unsigned i; + unsigned i, algo; memset(ctl, 0, sizeof(*ctl)); TAILQ_INIT(&ctl->sc_scheduled_packets); - TAILQ_INIT(&ctl->sc_unacked_packets); + TAILQ_INIT(&ctl->sc_unacked_packets[PNS_INIT]); + TAILQ_INIT(&ctl->sc_unacked_packets[PNS_HSK]); + TAILQ_INIT(&ctl->sc_unacked_packets[PNS_APP]); TAILQ_INIT(&ctl->sc_lost_packets); ctl->sc_enpub = enpub; ctl->sc_alset = alset; ctl->sc_ver_neg = ver_neg; - ctl->sc_pack_size = pack_size; ctl->sc_conn_pub = conn_pub; + assert(!(flags & ~(SC_IETF|SC_NSTP))); + ctl->sc_flags = flags; + send_ctl_pick_initial_packno(ctl); if (enpub->enp_settings.es_pace_packets) ctl->sc_flags |= SC_PACE; - lsquic_alarmset_init_alarm(alset, AL_RETX, retx_alarm_rings, ctl); - lsquic_senhist_init(&ctl->sc_senhist); - lsquic_cubic_init(&ctl->sc_cubic, LSQUIC_LOG_CONN_ID); + if ((flags & SC_IETF) && enpub->enp_settings.es_ecn) + ctl->sc_ecn = ECN_ECT0; + else + ctl->sc_ecn = ECN_NOT_ECT; + if (flags & SC_IETF) + ctl->sc_retx_frames = IQUIC_FRAME_RETX_MASK; + else + ctl->sc_retx_frames = GQUIC_FRAME_RETRANSMITTABLE_MASK; + lsquic_alarmset_init_alarm(alset, AL_RETX_INIT, retx_alarm_rings, ctl); + lsquic_alarmset_init_alarm(alset, AL_RETX_HSK, retx_alarm_rings, ctl); + lsquic_alarmset_init_alarm(alset, AL_RETX_APP, retx_alarm_rings, ctl); + lsquic_senhist_init(&ctl->sc_senhist, ctl->sc_flags & SC_IETF); + if (0 == enpub->enp_settings.es_cc_algo) + algo = LSQUIC_DF_CC_ALGO; + else + algo = enpub->enp_settings.es_cc_algo; + if (algo == 2) + ctl->sc_ci = &lsquic_cong_bbr_if; + else + ctl->sc_ci = &lsquic_cong_cubic_if; + ctl->sc_ci->cci_init(CGP(ctl), conn_pub, ctl->sc_retx_frames); if (ctl->sc_flags & SC_PACE) - pacer_init(&ctl->sc_pacer, LSQUIC_LOG_CONN_ID, + pacer_init(&ctl->sc_pacer, conn_pub->lconn, + /* TODO: conn_pub has a pointer to enpub: drop third argument */ enpub->enp_settings.es_clock_granularity); for (i = 0; i < sizeof(ctl->sc_buffered_packets) / sizeof(ctl->sc_buffered_packets[0]); ++i) @@ -261,6 +349,13 @@ lsquic_send_ctl_init (lsquic_send_ctl_t *ctl, struct lsquic_alarmset *alset, } +static int +send_ctl_ecn_on (const struct lsquic_send_ctl *ctl) +{ + return ctl->sc_ecn != ECN_NOT_ECT; +} + + static lsquic_time_t calculate_packet_rto (lsquic_send_ctl_t *ctl) { @@ -302,14 +397,13 @@ calculate_tlp_delay (lsquic_send_ctl_t *ctl) static void -set_retx_alarm (lsquic_send_ctl_t *ctl) +set_retx_alarm (struct lsquic_send_ctl *ctl, enum packnum_space pns, + lsquic_time_t now) { enum retx_mode rm; - lsquic_time_t delay, now; - - assert(!TAILQ_EMPTY(&ctl->sc_unacked_packets)); + lsquic_time_t delay; - now = lsquic_time_now(); + assert(!TAILQ_EMPTY(&ctl->sc_unacked_packets[pns])); rm = get_retx_mode(ctl); switch (rm) @@ -339,16 +433,16 @@ set_retx_alarm (lsquic_send_ctl_t *ctl) case RETX_MODE_TLP: delay = calculate_tlp_delay(ctl); break; - case RETX_MODE_RTO: + default: + assert(rm == RETX_MODE_RTO); + /* XXX the comment below as well as the name of the function + * that follows seem obsolete. + */ /* Base RTO on the first unacked packet, following reference * implementation. */ delay = calculate_packet_rto(ctl); break; -#ifdef WIN32 - default: - delay = 0; -#endif } if (delay > MAX_RTO_DELAY) @@ -356,7 +450,7 @@ set_retx_alarm (lsquic_send_ctl_t *ctl) LSQ_DEBUG("set retx alarm to %"PRIu64", which is %"PRIu64 " usec from now, mode %s", now + delay, delay, retx2str[rm]); - lsquic_alarmset_set(ctl->sc_alset, AL_RETX, now + delay); + lsquic_alarmset_set(ctl->sc_alset, AL_RETX_INIT + pns, now + delay); } @@ -368,37 +462,19 @@ send_ctl_in_recovery (lsquic_send_ctl_t *ctl) } -static int -send_ctl_in_slow_start (lsquic_send_ctl_t *ctl) -{ - return lsquic_cubic_in_slow_start(&ctl->sc_cubic); -} - +#define SC_PACK_SIZE(ctl_) (+(ctl_)->sc_conn_pub->path->np_pack_size) static lsquic_time_t send_ctl_transfer_time (void *ctx) { lsquic_send_ctl_t *const ctl = ctx; - uint64_t bandwidth, pacing_rate; - lsquic_time_t srtt, tx_time; - unsigned long cwnd; - - srtt = lsquic_rtt_stats_get_srtt(&ctl->sc_conn_pub->rtt_stats); - if (srtt == 0) - srtt = 50000; - cwnd = lsquic_cubic_get_cwnd(&ctl->sc_cubic); - bandwidth = cwnd * 1000000 / srtt; - if (send_ctl_in_slow_start(ctl)) - pacing_rate = bandwidth * 2; - else if (send_ctl_in_recovery(ctl)) - pacing_rate = bandwidth; - else - pacing_rate = bandwidth + bandwidth / 4; + lsquic_time_t tx_time; + uint64_t pacing_rate; + int in_recovery; - tx_time = (uint64_t) ctl->sc_pack_size * 1000000 / pacing_rate; - LSQ_DEBUG("srtt: %"PRIu64"; ss: %d; rec: %d; cwnd: %lu; bandwidth: " - "%"PRIu64"; tx_time: %"PRIu64, srtt, send_ctl_in_slow_start(ctl), - send_ctl_in_recovery(ctl), cwnd, bandwidth, tx_time); + in_recovery = send_ctl_in_recovery(ctl); + pacing_rate = ctl->sc_ci->cci_pacing_rate(CGP(ctl), in_recovery); + tx_time = (uint64_t) SC_PACK_SIZE(ctl) * 1000000 / pacing_rate; return tx_time; } @@ -407,10 +483,15 @@ static void send_ctl_unacked_append (struct lsquic_send_ctl *ctl, struct lsquic_packet_out *packet_out) { - TAILQ_INSERT_TAIL(&ctl->sc_unacked_packets, packet_out, po_next); - ctl->sc_bytes_unacked_all += packet_out_total_sz(packet_out); + enum packnum_space pns; + + pns = lsquic_packet_out_pns(packet_out); + assert(0 == (packet_out->po_flags & PO_LOSS_REC)); + TAILQ_INSERT_TAIL(&ctl->sc_unacked_packets[pns], packet_out, po_next); + packet_out->po_flags |= PO_UNACKED; + ctl->sc_bytes_unacked_all += packet_out_sent_sz(packet_out); ctl->sc_n_in_flight_all += 1; - if (packet_out->po_frame_types & QFRAME_RETRANSMITTABLE_MASK) + if (packet_out->po_frame_types & ctl->sc_retx_frames) { ctl->sc_bytes_unacked_retx += packet_out_total_sz(packet_out); ++ctl->sc_n_in_flight_retx; @@ -422,11 +503,15 @@ static void send_ctl_unacked_remove (struct lsquic_send_ctl *ctl, struct lsquic_packet_out *packet_out, unsigned packet_sz) { - TAILQ_REMOVE(&ctl->sc_unacked_packets, packet_out, po_next); + enum packnum_space pns; + + pns = lsquic_packet_out_pns(packet_out); + TAILQ_REMOVE(&ctl->sc_unacked_packets[pns], packet_out, po_next); + packet_out->po_flags &= ~PO_UNACKED; assert(ctl->sc_bytes_unacked_all >= packet_sz); ctl->sc_bytes_unacked_all -= packet_sz; ctl->sc_n_in_flight_all -= 1; - if (packet_out->po_frame_types & QFRAME_RETRANSMITTABLE_MASK) + if (packet_out->po_frame_types & ctl->sc_retx_frames) { ctl->sc_bytes_unacked_retx -= packet_sz; --ctl->sc_n_in_flight_retx; @@ -478,20 +563,23 @@ send_ctl_sched_remove (struct lsquic_send_ctl *ctl, int lsquic_send_ctl_sent_packet (lsquic_send_ctl_t *ctl, - struct lsquic_packet_out *packet_out, int account) + struct lsquic_packet_out *packet_out) { + enum packnum_space pns; char frames[lsquic_frame_types_str_sz]; + + assert(!(packet_out->po_flags & PO_ENCRYPTED)); + ctl->sc_last_sent_time = packet_out->po_sent; + pns = lsquic_packet_out_pns(packet_out); LSQ_DEBUG("packet %"PRIu64" has been sent (frame types: %s)", packet_out->po_packno, lsquic_frame_types_to_str(frames, sizeof(frames), packet_out->po_frame_types)); - if (account) - ctl->sc_bytes_out -= packet_out_total_sz(packet_out); lsquic_senhist_add(&ctl->sc_senhist, packet_out->po_packno); send_ctl_unacked_append(ctl, packet_out); - if (packet_out->po_frame_types & QFRAME_RETRANSMITTABLE_MASK) + if (packet_out->po_frame_types & ctl->sc_retx_frames) { - if (!lsquic_alarmset_is_set(ctl->sc_alset, AL_RETX)) - set_retx_alarm(ctl); + if (!lsquic_alarmset_is_set(ctl->sc_alset, AL_RETX_INIT + pns)) + set_retx_alarm(ctl, pns, packet_out->po_sent); if (ctl->sc_n_in_flight_retx == 1) ctl->sc_flags |= SC_WAS_QUIET; } @@ -502,6 +590,8 @@ lsquic_send_ctl_sent_packet (lsquic_send_ctl_t *ctl, #if LSQUIC_SEND_STATS ++ctl->sc_stats.n_total_sent; #endif + if (ctl->sc_ci->cci_sent) + ctl->sc_ci->cci_sent(CGP(ctl), packet_out, ctl->sc_n_in_flight_all); lsquic_send_ctl_sanity_check(ctl); return 0; } @@ -526,12 +616,12 @@ take_rtt_sample (lsquic_send_ctl_t *ctl, static void -send_ctl_release_enc_data (struct lsquic_send_ctl *ctl, +send_ctl_return_enc_data (struct lsquic_send_ctl *ctl, struct lsquic_packet_out *packet_out) { - ctl->sc_enpub->enp_pmi->pmi_release(ctl->sc_enpub->enp_pmi_ctx, - ctl->sc_conn_pub->lconn->cn_peer_ctx, packet_out->po_enc_data, - lsquic_packet_out_ipv6(packet_out)); + ctl->sc_enpub->enp_pmi->pmi_return(ctl->sc_enpub->enp_pmi_ctx, + packet_out->po_path->np_peer_ctx, + packet_out->po_enc_data, lsquic_packet_out_ipv6(packet_out)); packet_out->po_flags &= ~PO_ENCRYPTED; packet_out->po_enc_data = NULL; } @@ -541,8 +631,123 @@ static void send_ctl_destroy_packet (struct lsquic_send_ctl *ctl, struct lsquic_packet_out *packet_out) { - lsquic_packet_out_destroy(packet_out, ctl->sc_enpub, - ctl->sc_conn_pub->lconn->cn_peer_ctx); + if (0 == (packet_out->po_flags & PO_LOSS_REC)) + lsquic_packet_out_destroy(packet_out, ctl->sc_enpub, + packet_out->po_path->np_peer_ctx); + else + lsquic_malo_put(packet_out); +} + + +static void +send_ctl_maybe_renumber_sched_to_right (struct lsquic_send_ctl *ctl, + const struct lsquic_packet_out *cur) +{ + struct lsquic_packet_out *packet_out; + + /* If current packet has PO_REPACKNO set, it means that all those to the + * right of it have this flag set as well. + */ + if (0 == (cur->po_flags & PO_REPACKNO)) + { + ctl->sc_cur_packno = cur->po_packno - 1; + for (packet_out = TAILQ_NEXT(cur, po_next); + packet_out && 0 == (packet_out->po_flags & PO_REPACKNO); + packet_out = TAILQ_NEXT(packet_out, po_next)) + { + packet_out->po_flags |= PO_REPACKNO; + } + } +} + + +/* The third argument to advance `next' pointer when modifying the unacked + * queue. This is because the unacked queue may contain several elements + * of the same chain. This is not true of the lost and scheduled packet + * queue, as the loss records are only present on the unacked queue. + */ +static void +send_ctl_destroy_chain (struct lsquic_send_ctl *ctl, + struct lsquic_packet_out *const packet_out, + struct lsquic_packet_out **next) +{ + struct lsquic_packet_out *chain_cur, *chain_next; + unsigned packet_sz, count; + enum packnum_space pns = lsquic_packet_out_pns(packet_out); + + count = 0; + for (chain_cur = packet_out->po_loss_chain; chain_cur != packet_out; + chain_cur = chain_next) + { + chain_next = chain_cur->po_loss_chain; + switch (chain_cur->po_flags & (PO_SCHED|PO_UNACKED|PO_LOST)) + { + case PO_SCHED: + send_ctl_maybe_renumber_sched_to_right(ctl, chain_cur); + send_ctl_sched_remove(ctl, chain_cur); + break; + case PO_UNACKED: + if (chain_cur->po_flags & PO_LOSS_REC) + TAILQ_REMOVE(&ctl->sc_unacked_packets[pns], chain_cur, po_next); + else + { + packet_sz = packet_out_sent_sz(chain_cur); + send_ctl_unacked_remove(ctl, chain_cur, packet_sz); + } + break; + case PO_LOST: + TAILQ_REMOVE(&ctl->sc_lost_packets, chain_cur, po_next); + break; + case 0: + /* This is also weird, but let it pass */ + break; + default: + assert(0); + break; + } + if (next && *next == chain_cur) + *next = TAILQ_NEXT(*next, po_next); + if (0 == (chain_cur->po_flags & PO_LOSS_REC)) + lsquic_packet_out_ack_streams(chain_cur); + send_ctl_destroy_packet(ctl, chain_cur); + ++count; + } + packet_out->po_loss_chain = packet_out; + + if (count) + LSQ_DEBUG("destroyed %u packet%.*s in chain of packet %"PRIu64, + count, count != 1, "s", packet_out->po_packno); +} + + +static void +send_ctl_record_loss (struct lsquic_send_ctl *ctl, + struct lsquic_packet_out *packet_out) +{ + struct lsquic_packet_out *loss_record; + + loss_record = lsquic_malo_get(ctl->sc_conn_pub->packet_out_malo); + if (loss_record) + { + memset(loss_record, 0, sizeof(*loss_record)); + loss_record->po_flags = PO_UNACKED|PO_LOSS_REC|PO_SENT_SZ; + loss_record->po_flags |= + ((packet_out->po_flags >> POPNS_SHIFT) & 3) << POPNS_SHIFT; + /* Copy values used in ACK processing: */ + loss_record->po_packno = packet_out->po_packno; + loss_record->po_sent = packet_out->po_sent; + loss_record->po_sent_sz = packet_out_sent_sz(packet_out); + loss_record->po_frame_types = packet_out->po_frame_types; + /* Insert the loss record into the chain: */ + loss_record->po_loss_chain = packet_out->po_loss_chain; + packet_out->po_loss_chain = loss_record; + /* Place the loss record next to the lost packet we are about to + * remove from the list: + */ + TAILQ_INSERT_BEFORE(packet_out, loss_record, po_next); + } + else + LSQ_INFO("cannot allocate memory for loss record"); } @@ -551,31 +756,38 @@ send_ctl_destroy_packet (struct lsquic_send_ctl *ctl, */ static int send_ctl_handle_lost_packet (lsquic_send_ctl_t *ctl, - lsquic_packet_out_t *packet_out) + lsquic_packet_out_t *packet_out, struct lsquic_packet_out **next) { unsigned packet_sz; assert(ctl->sc_n_in_flight_all); packet_sz = packet_out_sent_sz(packet_out); - send_ctl_unacked_remove(ctl, packet_out, packet_sz); - if (packet_out->po_flags & PO_ENCRYPTED) - send_ctl_release_enc_data(ctl, packet_out); + if (packet_out->po_frame_types & (1 << QUIC_FRAME_ACK)) { - ctl->sc_flags |= SC_LOST_ACK; + ctl->sc_flags |= SC_LOST_ACK_INIT << lsquic_packet_out_pns(packet_out); LSQ_DEBUG("lost ACK in packet %"PRIu64, packet_out->po_packno); } - if (packet_out->po_frame_types & QFRAME_RETRANSMITTABLE_MASK) + + if (ctl->sc_ci->cci_lost) + ctl->sc_ci->cci_lost(CGP(ctl), packet_out, packet_sz); + + if (packet_out->po_frame_types & ctl->sc_retx_frames) { LSQ_DEBUG("lost retransmittable packet %"PRIu64, packet_out->po_packno); + send_ctl_record_loss(ctl, packet_out); + send_ctl_unacked_remove(ctl, packet_out, packet_sz); TAILQ_INSERT_TAIL(&ctl->sc_lost_packets, packet_out, po_next); + packet_out->po_flags |= PO_LOST; return 1; } else { LSQ_DEBUG("lost unretransmittable packet %"PRIu64, packet_out->po_packno); + send_ctl_unacked_remove(ctl, packet_out, packet_sz); + send_ctl_destroy_chain(ctl, packet_out, next); send_ctl_destroy_packet(ctl, packet_out); return 0; } @@ -583,13 +795,15 @@ send_ctl_handle_lost_packet (lsquic_send_ctl_t *ctl, static lsquic_packno_t -largest_retx_packet_number (const lsquic_send_ctl_t *ctl) +largest_retx_packet_number (const struct lsquic_send_ctl *ctl, + enum packnum_space pns) { const lsquic_packet_out_t *packet_out; - TAILQ_FOREACH_REVERSE(packet_out, &ctl->sc_unacked_packets, + TAILQ_FOREACH_REVERSE(packet_out, &ctl->sc_unacked_packets[pns], lsquic_packets_tailq, po_next) { - if (packet_out->po_frame_types & QFRAME_RETRANSMITTABLE_MASK) + if (0 == (packet_out->po_flags & PO_LOSS_REC) + && (packet_out->po_frame_types & ctl->sc_retx_frames)) return packet_out->po_packno; } return 0; @@ -597,33 +811,37 @@ largest_retx_packet_number (const lsquic_send_ctl_t *ctl) static void -send_ctl_detect_losses (lsquic_send_ctl_t *ctl, lsquic_time_t time) +send_ctl_detect_losses (struct lsquic_send_ctl *ctl, enum packnum_space pns, + lsquic_time_t time) { lsquic_packet_out_t *packet_out, *next; lsquic_packno_t largest_retx_packno, largest_lost_packno; - largest_retx_packno = largest_retx_packet_number(ctl); + largest_retx_packno = largest_retx_packet_number(ctl, pns); largest_lost_packno = 0; ctl->sc_loss_to = 0; - for (packet_out = TAILQ_FIRST(&ctl->sc_unacked_packets); + for (packet_out = TAILQ_FIRST(&ctl->sc_unacked_packets[pns]); packet_out && packet_out->po_packno <= ctl->sc_largest_acked_packno; packet_out = next) { next = TAILQ_NEXT(packet_out, po_next); + if (packet_out->po_flags & PO_LOSS_REC) + continue; + if (packet_out->po_packno + N_NACKS_BEFORE_RETX < ctl->sc_largest_acked_packno) { LSQ_DEBUG("loss by FACK detected, packet %"PRIu64, packet_out->po_packno); largest_lost_packno = packet_out->po_packno; - (void) send_ctl_handle_lost_packet(ctl, packet_out); + (void) send_ctl_handle_lost_packet(ctl, packet_out, &next); continue; } if (largest_retx_packno - && (packet_out->po_frame_types & QFRAME_RETRANSMITTABLE_MASK) + && (packet_out->po_frame_types & ctl->sc_retx_frames) && largest_retx_packno <= ctl->sc_largest_acked_packno) { LSQ_DEBUG("loss by early retransmit detected, packet %"PRIu64, @@ -633,7 +851,7 @@ send_ctl_detect_losses (lsquic_send_ctl_t *ctl, lsquic_time_t time) lsquic_rtt_stats_get_srtt(&ctl->sc_conn_pub->rtt_stats) / 4; LSQ_DEBUG("set sc_loss_to to %"PRIu64", packet %"PRIu64, ctl->sc_loss_to, packet_out->po_packno); - (void) send_ctl_handle_lost_packet(ctl, packet_out); + (void) send_ctl_handle_lost_packet(ctl, packet_out, &next); continue; } @@ -642,10 +860,10 @@ send_ctl_detect_losses (lsquic_send_ctl_t *ctl, lsquic_time_t time) { LSQ_DEBUG("loss by sent time detected: packet %"PRIu64, packet_out->po_packno); - if (packet_out->po_frame_types & QFRAME_RETRANSMITTABLE_MASK) + if (packet_out->po_frame_types & ctl->sc_retx_frames) largest_lost_packno = packet_out->po_packno; else { /* don't count it as a loss */; } - (void) send_ctl_handle_lost_packet(ctl, packet_out); + (void) send_ctl_handle_lost_packet(ctl, packet_out, &next); continue; } } @@ -654,7 +872,7 @@ send_ctl_detect_losses (lsquic_send_ctl_t *ctl, lsquic_time_t time) { LSQ_DEBUG("detected new loss: packet %"PRIu64"; new lsac: " "%"PRIu64, largest_lost_packno, ctl->sc_largest_sent_at_cutback); - lsquic_cubic_loss(&ctl->sc_cubic); + ctl->sc_ci->cci_loss(CGP(ctl)); if (ctl->sc_flags & SC_PACE) pacer_loss_event(&ctl->sc_pacer); ctl->sc_largest_sent_at_cutback = @@ -673,19 +891,21 @@ send_ctl_detect_losses (lsquic_send_ctl_t *ctl, lsquic_time_t time) int lsquic_send_ctl_got_ack (lsquic_send_ctl_t *ctl, const struct ack_info *acki, - lsquic_time_t ack_recv_time) + lsquic_time_t ack_recv_time, lsquic_time_t now) { const struct lsquic_packno_range *range = &acki->ranges[ acki->n_ranges - 1 ]; lsquic_packet_out_t *packet_out, *next; - lsquic_time_t now = 0; lsquic_packno_t smallest_unacked; lsquic_packno_t ack2ed[2]; unsigned packet_sz; int app_limited; signed char do_rtt, skip_checks; + enum packnum_space pns; + unsigned ecn_total_acked, ecn_ce_cnt, one_rtt_cnt; - packet_out = TAILQ_FIRST(&ctl->sc_unacked_packets); + pns = acki->pns; + packet_out = TAILQ_FIRST(&ctl->sc_unacked_packets[pns]); #if __GNUC__ __builtin_prefetch(packet_out); #endif @@ -711,24 +931,38 @@ lsquic_send_ctl_got_ack (lsquic_send_ctl_t *ctl, return -1; } + if (ctl->sc_ci->cci_begin_ack) + ctl->sc_ci->cci_begin_ack(CGP(ctl), ack_recv_time, + ctl->sc_bytes_unacked_all); + + ecn_total_acked = 0; + ecn_ce_cnt = 0; + one_rtt_cnt = 0; + if (UNLIKELY(ctl->sc_flags & SC_WAS_QUIET)) { ctl->sc_flags &= ~SC_WAS_QUIET; LSQ_DEBUG("ACK comes after a period of quiescence"); - if (!now) - now = lsquic_time_now(); - lsquic_cubic_was_quiet(&ctl->sc_cubic, now); + ctl->sc_ci->cci_was_quiet(CGP(ctl), now, ctl->sc_bytes_unacked_all); } if (UNLIKELY(!packet_out)) goto no_unacked_packets; smallest_unacked = packet_out->po_packno; + LSQ_DEBUG("Smallest unacked: %"PRIu64, smallest_unacked); + ack2ed[1] = 0; if (packet_out->po_packno > largest_acked(acki)) goto detect_losses; + if (largest_acked(acki) > ctl->sc_cur_rt_end) + { + ++ctl->sc_rt_count; + ctl->sc_cur_rt_end = lsquic_senhist_largest(&ctl->sc_senhist); + } + do_rtt = 0, skip_checks = 0; app_limited = -1; do @@ -748,22 +982,42 @@ lsquic_send_ctl_got_ack (lsquic_send_ctl_t *ctl, { skip_checks = range == acki->ranges; if (app_limited < 0) - app_limited = send_ctl_retx_bytes_out(ctl) + 3 * ctl->sc_pack_size /* This + app_limited = send_ctl_retx_bytes_out(ctl) + 3 * SC_PACK_SIZE(ctl) /* This is the "maximum burst" parameter */ - < lsquic_cubic_get_cwnd(&ctl->sc_cubic); - if (!now) - now = lsquic_time_now(); + < ctl->sc_ci->cci_get_cwnd(CGP(ctl)); after_checks: - packet_sz = packet_out_sent_sz(packet_out); ctl->sc_largest_acked_packno = packet_out->po_packno; ctl->sc_largest_acked_sent_time = packet_out->po_sent; - send_ctl_unacked_remove(ctl, packet_out, packet_sz); + ecn_total_acked += lsquic_packet_out_ecn(packet_out) != ECN_NOT_ECT; + ecn_ce_cnt += lsquic_packet_out_ecn(packet_out) == ECN_CE; + one_rtt_cnt += lsquic_packet_out_enc_level(packet_out) == ENC_LEV_FORW; + if (0 == (packet_out->po_flags & PO_LOSS_REC)) + { + packet_sz = packet_out_sent_sz(packet_out); + send_ctl_unacked_remove(ctl, packet_out, packet_sz); + lsquic_packet_out_ack_streams(packet_out); + LSQ_DEBUG("acking via regular record %"PRIu64, + packet_out->po_packno); + } + else + { + packet_sz = packet_out->po_sent_sz; + TAILQ_REMOVE(&ctl->sc_unacked_packets[pns], packet_out, + po_next); + LSQ_DEBUG("acking via loss record %"PRIu64, + packet_out->po_packno); +#if LSQUIC_CONN_STATS + ++ctl->sc_conn_pub->conn_stats->out.acked_via_loss; + LSQ_DEBUG("acking via loss record %"PRIu64, + packet_out->po_packno); +#endif + } ack2ed[!!(packet_out->po_frame_types & (1 << QUIC_FRAME_ACK))] = packet_out->po_ack2ed; do_rtt |= packet_out->po_packno == largest_acked(acki); - lsquic_cubic_ack(&ctl->sc_cubic, now, now - packet_out->po_sent, - app_limited, packet_sz); - lsquic_packet_out_ack_streams(packet_out); + ctl->sc_ci->cci_ack(CGP(ctl), packet_out, packet_sz, now, + app_limited); + send_ctl_destroy_chain(ctl, packet_out, &next); send_ctl_destroy_packet(ctl, packet_out); } packet_out = next; @@ -779,32 +1033,66 @@ lsquic_send_ctl_got_ack (lsquic_send_ctl_t *ctl, } detect_losses: - send_ctl_detect_losses(ctl, ack_recv_time); - if (send_ctl_first_unacked_retx_packet(ctl)) - set_retx_alarm(ctl); + send_ctl_detect_losses(ctl, pns, ack_recv_time); + if (send_ctl_first_unacked_retx_packet(ctl, pns)) + set_retx_alarm(ctl, pns, now); else { LSQ_DEBUG("No retransmittable packets: clear alarm"); - lsquic_alarmset_unset(ctl->sc_alset, AL_RETX); + lsquic_alarmset_unset(ctl->sc_alset, AL_RETX_INIT + pns); } lsquic_send_ctl_sanity_check(ctl); - if ((ctl->sc_flags & SC_NSTP) && ack2ed[1] > ctl->sc_largest_ack2ed) - ctl->sc_largest_ack2ed = ack2ed[1]; + if ((ctl->sc_flags & SC_NSTP) && ack2ed[1] > ctl->sc_largest_ack2ed[pns]) + ctl->sc_largest_ack2ed[pns] = ack2ed[1]; if (ctl->sc_n_in_flight_retx == 0) ctl->sc_flags |= SC_WAS_QUIET; + if (one_rtt_cnt) + ctl->sc_flags |= SC_1RTT_ACKED; + + if (send_ctl_ecn_on(ctl)) + { + const uint64_t sum = acki->ecn_counts[ECN_ECT0] + + acki->ecn_counts[ECN_ECT1] + + acki->ecn_counts[ECN_CE]; + ctl->sc_ecn_total_acked[pns] += ecn_total_acked; + ctl->sc_ecn_ce_cnt[pns] += ecn_ce_cnt; + if (sum >= ctl->sc_ecn_total_acked[pns]) + { + if (sum > ctl->sc_ecn_total_acked[pns]) + ctl->sc_ecn_total_acked[pns] = sum; + if (acki->ecn_counts[ECN_CE] > ctl->sc_ecn_ce_cnt[pns]) + { + ctl->sc_ecn_ce_cnt[pns] = acki->ecn_counts[ECN_CE]; + LSQ_WARN("TODO: handle ECN CE event"); /* XXX TODO */ + } + } + else + { + LSQ_INFO("ECN total ACKed (%"PRIu64") is greater than the sum " + "of ECN counters (%"PRIu64"): disable ECN", + ctl->sc_ecn_total_acked[pns], sum); + ctl->sc_ecn = ECN_NOT_ECT; + } + } + update_n_stop_waiting: - if (smallest_unacked > smallest_acked(acki)) - /* Peer is acking packets that have been acked already. Schedule ACK - * and STOP_WAITING frame to chop the range if we get two of these in - * a row. - */ - ++ctl->sc_n_stop_waiting; - else - ctl->sc_n_stop_waiting = 0; + if (!(ctl->sc_flags & (SC_NSTP|SC_IETF))) + { + if (smallest_unacked > smallest_acked(acki)) + /* Peer is acking packets that have been acked already. Schedule + * ACK and STOP_WAITING frame to chop the range if we get two of + * these in a row. + */ + ++ctl->sc_n_stop_waiting; + else + ctl->sc_n_stop_waiting = 0; + } lsquic_send_ctl_sanity_check(ctl); + if (ctl->sc_ci->cci_end_ack) + ctl->sc_ci->cci_end_ack(CGP(ctl), ctl->sc_bytes_unacked_all); return 0; no_unacked_packets: @@ -818,15 +1106,18 @@ lsquic_packno_t lsquic_send_ctl_smallest_unacked (lsquic_send_ctl_t *ctl) { const lsquic_packet_out_t *packet_out; + enum packnum_space pns; /* Packets are always sent out in order (unless we are reordering them * on purpose). Thus, the first packet on the unacked packets list has * the smallest packet number of all packets on that list. */ - if ((packet_out = TAILQ_FIRST(&ctl->sc_unacked_packets))) - return packet_out->po_packno; - else - return lsquic_senhist_largest(&ctl->sc_senhist) + 1; + for (pns = ctl->sc_flags & SC_IETF ? PNS_INIT : PNS_APP; pns < N_PNS; ++pns) + if ((packet_out = TAILQ_FIRST(&ctl->sc_unacked_packets[pns]))) + /* We're OK with using a loss record */ + return packet_out->po_packno; + + return lsquic_senhist_largest(&ctl->sc_senhist) + first_packno(ctl); } @@ -841,14 +1132,26 @@ send_ctl_next_lost (lsquic_send_ctl_t *ctl) { if (lost_packet->po_frame_types & (1 << QUIC_FRAME_STREAM)) { - lsquic_packet_out_elide_reset_stream_frames(lost_packet, 0); - if (lost_packet->po_regen_sz >= lost_packet->po_data_sz) + if (0 == (lost_packet->po_flags & PO_MINI)) + { + lsquic_packet_out_elide_reset_stream_frames(lost_packet, 0); + if (lost_packet->po_regen_sz >= lost_packet->po_data_sz) + { + LSQ_DEBUG("Dropping packet %"PRIu64" from lost queue", + lost_packet->po_packno); + TAILQ_REMOVE(&ctl->sc_lost_packets, lost_packet, po_next); + lost_packet->po_flags &= ~PO_LOST; + send_ctl_destroy_chain(ctl, lost_packet, NULL); + send_ctl_destroy_packet(ctl, lost_packet); + goto get_next_lost; + } + } + else { - LSQ_DEBUG("Dropping packet %"PRIu64" from lost queue", - lost_packet->po_packno); - TAILQ_REMOVE(&ctl->sc_lost_packets, lost_packet, po_next); - send_ctl_destroy_packet(ctl, lost_packet); - goto get_next_lost; + /* Mini connection only ever sends data on stream 1. There + * is nothing to elide: always resend it. + */ + ; } } @@ -856,6 +1159,8 @@ send_ctl_next_lost (lsquic_send_ctl_t *ctl) return NULL; TAILQ_REMOVE(&ctl->sc_lost_packets, lost_packet, po_next); + lost_packet->po_flags &= ~PO_LOST; + lost_packet->po_flags |= PO_RETX; } return lost_packet; @@ -873,7 +1178,9 @@ void lsquic_send_ctl_cleanup (lsquic_send_ctl_t *ctl) { lsquic_packet_out_t *packet_out, *next; + enum packnum_space pns; unsigned n; + lsquic_senhist_cleanup(&ctl->sc_senhist); while ((packet_out = TAILQ_FIRST(&ctl->sc_scheduled_packets))) { @@ -882,18 +1189,26 @@ lsquic_send_ctl_cleanup (lsquic_send_ctl_t *ctl) } assert(0 == ctl->sc_n_scheduled); assert(0 == ctl->sc_bytes_scheduled); - while ((packet_out = TAILQ_FIRST(&ctl->sc_unacked_packets))) - { - TAILQ_REMOVE(&ctl->sc_unacked_packets, packet_out, po_next); - ctl->sc_bytes_unacked_all -= packet_out_total_sz(packet_out); - send_ctl_destroy_packet(ctl, packet_out); - --ctl->sc_n_in_flight_all; - } + for (pns = PNS_INIT; pns < N_PNS; ++pns) + while ((packet_out = TAILQ_FIRST(&ctl->sc_unacked_packets[pns]))) + { + TAILQ_REMOVE(&ctl->sc_unacked_packets[pns], packet_out, po_next); + packet_out->po_flags &= ~PO_UNACKED; +#ifndef NDEBUG + if (0 == (packet_out->po_flags & PO_LOSS_REC)) + { + ctl->sc_bytes_unacked_all -= packet_out_sent_sz(packet_out); + --ctl->sc_n_in_flight_all; + } +#endif + send_ctl_destroy_packet(ctl, packet_out); + } assert(0 == ctl->sc_n_in_flight_all); assert(0 == ctl->sc_bytes_unacked_all); while ((packet_out = TAILQ_FIRST(&ctl->sc_lost_packets))) { TAILQ_REMOVE(&ctl->sc_lost_packets, packet_out, po_next); + packet_out->po_flags &= ~PO_LOST; send_ctl_destroy_packet(ctl, packet_out); } for (n = 0; n < sizeof(ctl->sc_buffered_packets) / @@ -913,6 +1228,7 @@ lsquic_send_ctl_cleanup (lsquic_send_ctl_t *ctl) ctl->sc_stats.n_total_sent, ctl->sc_stats.n_resent, ctl->sc_stats.n_delayed); #endif + free(ctl->sc_token); } @@ -921,7 +1237,7 @@ send_ctl_retx_bytes_out (const struct lsquic_send_ctl *ctl) { return ctl->sc_bytes_scheduled + ctl->sc_bytes_unacked_retx - + ctl->sc_bytes_out; + ; } @@ -930,7 +1246,7 @@ send_ctl_all_bytes_out (const struct lsquic_send_ctl *ctl) { return ctl->sc_bytes_scheduled + ctl->sc_bytes_unacked_all - + ctl->sc_bytes_out; + ; } @@ -952,12 +1268,12 @@ int lsquic_send_ctl_can_send (lsquic_send_ctl_t *ctl) { const unsigned n_out = send_ctl_all_bytes_out(ctl); - LSQ_DEBUG("%s: n_out: %u (unacked_all: %u, out: %u); cwnd: %lu", __func__, - n_out, ctl->sc_bytes_unacked_all, ctl->sc_bytes_out, - lsquic_cubic_get_cwnd(&ctl->sc_cubic)); + LSQ_DEBUG("%s: n_out: %u (unacked_all: %u); cwnd: %"PRIu64, __func__, + n_out, ctl->sc_bytes_unacked_all, + ctl->sc_ci->cci_get_cwnd(CGP(ctl))); if (ctl->sc_flags & SC_PACE) { - if (n_out >= lsquic_cubic_get_cwnd(&ctl->sc_cubic)) + if (n_out >= ctl->sc_ci->cci_get_cwnd(CGP(ctl))) return 0; if (pacer_can_schedule(&ctl->sc_pacer, ctl->sc_n_scheduled + ctl->sc_n_in_flight_all)) @@ -971,12 +1287,13 @@ lsquic_send_ctl_can_send (lsquic_send_ctl_t *ctl) return 0; } else - return n_out < lsquic_cubic_get_cwnd(&ctl->sc_cubic); + return n_out < ctl->sc_ci->cci_get_cwnd(CGP(ctl)); } static void -send_ctl_expire (lsquic_send_ctl_t *ctl, enum expire_filter filter) +send_ctl_expire (struct lsquic_send_ctl *ctl, enum packnum_space pns, + enum expire_filter filter) { lsquic_packet_out_t *packet_out, *next; int n_resubmitted; @@ -990,23 +1307,30 @@ send_ctl_expire (lsquic_send_ctl_t *ctl, enum expire_filter filter) { case EXFI_ALL: n_resubmitted = 0; - while ((packet_out = TAILQ_FIRST(&ctl->sc_unacked_packets))) - n_resubmitted += send_ctl_handle_lost_packet(ctl, packet_out); + for (packet_out = TAILQ_FIRST(&ctl->sc_unacked_packets[pns]); + packet_out; packet_out = next) + { + next = TAILQ_NEXT(packet_out, po_next); + if (0 == (packet_out->po_flags & PO_LOSS_REC)) + n_resubmitted += send_ctl_handle_lost_packet(ctl, packet_out, + &next); + } break; case EXFI_HSK: n_resubmitted = 0; - for (packet_out = TAILQ_FIRST(&ctl->sc_unacked_packets); packet_out; + for (packet_out = TAILQ_FIRST(&ctl->sc_unacked_packets[pns]); packet_out; packet_out = next) { next = TAILQ_NEXT(packet_out, po_next); if (packet_out->po_flags & PO_HELLO) - n_resubmitted += send_ctl_handle_lost_packet(ctl, packet_out); + n_resubmitted += send_ctl_handle_lost_packet(ctl, packet_out, + &next); } break; case EXFI_LAST: - packet_out = send_ctl_last_unacked_retx_packet(ctl); + packet_out = send_ctl_last_unacked_retx_packet(ctl, pns); if (packet_out) - n_resubmitted = send_ctl_handle_lost_packet(ctl, packet_out); + n_resubmitted = send_ctl_handle_lost_packet(ctl, packet_out, NULL); else n_resubmitted = 0; break; @@ -1024,8 +1348,13 @@ send_ctl_expire (lsquic_send_ctl_t *ctl, enum expire_filter filter) void lsquic_send_ctl_expire_all (lsquic_send_ctl_t *ctl) { - lsquic_alarmset_unset(ctl->sc_alset, AL_RETX); - send_ctl_expire(ctl, EXFI_ALL); + enum packnum_space pns; + + for (pns = ctl->sc_flags & SC_IETF ? PNS_INIT : PNS_APP; pns < N_PNS; ++pns) + { + lsquic_alarmset_unset(ctl->sc_alset, AL_RETX_INIT + pns); + send_ctl_expire(ctl, pns, EXFI_ALL); + } lsquic_send_ctl_sanity_check(ctl); } @@ -1035,21 +1364,39 @@ void lsquic_send_ctl_sanity_check (const lsquic_send_ctl_t *ctl) { const struct lsquic_packet_out *packet_out; + lsquic_packno_t prev_packno; + int prev_packno_set; unsigned count, bytes; + enum packnum_space pns; - assert(!send_ctl_first_unacked_retx_packet(ctl) || - lsquic_alarmset_is_set(ctl->sc_alset, AL_RETX)); - if (lsquic_alarmset_is_set(ctl->sc_alset, AL_RETX)) + assert(!send_ctl_first_unacked_retx_packet(ctl, PNS_APP) || + lsquic_alarmset_is_set(ctl->sc_alset, AL_RETX_APP)); + if (lsquic_alarmset_is_set(ctl->sc_alset, AL_RETX_APP)) { - assert(send_ctl_first_unacked_retx_packet(ctl)); - assert(lsquic_time_now() < ctl->sc_alset->as_expiry[AL_RETX] + MAX_RTO_DELAY); + assert(send_ctl_first_unacked_retx_packet(ctl, PNS_APP)); + assert(lsquic_time_now() + < ctl->sc_alset->as_expiry[AL_RETX_APP] + MAX_RTO_DELAY); } count = 0, bytes = 0; - TAILQ_FOREACH(packet_out, &ctl->sc_unacked_packets, po_next) + for (pns = PNS_INIT; pns <= PNS_APP; ++pns) { - bytes += packet_out_sent_sz(packet_out); - ++count; + prev_packno_set = 0; + TAILQ_FOREACH(packet_out, &ctl->sc_unacked_packets[pns], po_next) + { + if (prev_packno_set) + assert(packet_out->po_packno > prev_packno); + else + { + prev_packno = packet_out->po_packno; + prev_packno_set = 1; + } + if (0 == (packet_out->po_flags & PO_LOSS_REC)) + { + bytes += packet_out_sent_sz(packet_out); + ++count; + } + } } assert(count == ctl->sc_n_in_flight_all); assert(bytes == ctl->sc_bytes_unacked_all); @@ -1064,8 +1411,6 @@ lsquic_send_ctl_sanity_check (const lsquic_send_ctl_t *ctl) assert(count == ctl->sc_n_scheduled); assert(bytes == ctl->sc_bytes_scheduled); } - - #endif @@ -1090,23 +1435,77 @@ lsquic_send_ctl_scheduled_one (lsquic_send_ctl_t *ctl, } +/* Wrapper is used to reset the counter when it's been too long */ +static unsigned +send_ctl_get_n_consec_rtos (struct lsquic_send_ctl *ctl) +{ + lsquic_time_t timeout; + + if (ctl->sc_n_consec_rtos) + { + timeout = calculate_packet_rto(ctl); + if (ctl->sc_last_rto_time + timeout < ctl->sc_last_sent_time) + { + ctl->sc_n_consec_rtos = 0; + LSQ_DEBUG("reset RTO counter after %"PRIu64" usec", + ctl->sc_last_sent_time - ctl->sc_last_rto_time); + } + } + + return ctl->sc_n_consec_rtos; +} + + /* This mimics the logic in lsquic_send_ctl_next_packet_to_send(): we want * to check whether the first scheduled packet cannot be sent. */ int -lsquic_send_ctl_sched_is_blocked (const struct lsquic_send_ctl *ctl) +lsquic_send_ctl_sched_is_blocked (struct lsquic_send_ctl *ctl) { const lsquic_packet_out_t *packet_out = TAILQ_FIRST(&ctl->sc_scheduled_packets); - return ctl->sc_n_consec_rtos + return send_ctl_get_n_consec_rtos(ctl) && 0 == ctl->sc_next_limit && packet_out && !(packet_out->po_frame_types & (1 << QUIC_FRAME_ACK)); } +static void +send_ctl_maybe_zero_pad (struct lsquic_send_ctl *ctl, + struct lsquic_packet_out *initial_packet, size_t limit) +{ + struct lsquic_packet_out *packet_out; + size_t cum_size, size; + + cum_size = packet_out_total_sz(initial_packet); + if (cum_size >= limit) + return; + + TAILQ_FOREACH(packet_out, &ctl->sc_scheduled_packets, po_next) + { + size = packet_out_total_sz(packet_out); + if (cum_size + size > SC_PACK_SIZE(ctl)) + break; + cum_size += size; + if (cum_size >= limit) + return; + } + + assert(cum_size < limit); + size = limit - cum_size; + if (size > lsquic_packet_out_avail(initial_packet)) + size = lsquic_packet_out_avail(initial_packet); + memset(initial_packet->po_data + initial_packet->po_data_sz, 0, size); + initial_packet->po_data_sz += size; + initial_packet->po_frame_types |= QUIC_FTBIT_PADDING; + LSQ_DEBUG("Added %zu bytes of PADDING to packet %"PRIu64, size, + initial_packet->po_packno); +} + + lsquic_packet_out_t * -lsquic_send_ctl_next_packet_to_send (lsquic_send_ctl_t *ctl) +lsquic_send_ctl_next_packet_to_send (struct lsquic_send_ctl *ctl, size_t size) { lsquic_packet_out_t *packet_out; int dec_limit; @@ -1116,8 +1515,8 @@ lsquic_send_ctl_next_packet_to_send (lsquic_send_ctl_t *ctl) if (!packet_out) return NULL; - if (ctl->sc_n_consec_rtos && - !(packet_out->po_frame_types & (1 << QUIC_FRAME_ACK))) + if (!(packet_out->po_frame_types & (1 << QUIC_FRAME_ACK)) + && send_ctl_get_n_consec_rtos(ctl)) { if (ctl->sc_next_limit) dec_limit = 1; @@ -1127,7 +1526,6 @@ lsquic_send_ctl_next_packet_to_send (lsquic_send_ctl_t *ctl) else dec_limit = 0; - send_ctl_sched_remove(ctl, packet_out); if (packet_out->po_flags & PO_REPACKNO) { if (packet_out->po_regen_sz < packet_out->po_data_sz) @@ -1139,12 +1537,22 @@ lsquic_send_ctl_next_packet_to_send (lsquic_send_ctl_t *ctl) { LSQ_DEBUG("Dropping packet %"PRIu64" from scheduled queue", packet_out->po_packno); + send_ctl_sched_remove(ctl, packet_out); + send_ctl_destroy_chain(ctl, packet_out, NULL); send_ctl_destroy_packet(ctl, packet_out); goto get_packet; } } - ctl->sc_bytes_out += packet_out_total_sz(packet_out); + if (UNLIKELY(size)) + { + if (packet_out_total_sz(packet_out) + size > SC_PACK_SIZE(ctl)) + return NULL; + LSQ_DEBUG("packet %"PRIu64" will be tacked on to previous packet " + "(coalescing)", packet_out->po_packno); + } + send_ctl_sched_remove(ctl, packet_out); + if (dec_limit) { --ctl->sc_next_limit; @@ -1152,6 +1560,13 @@ lsquic_send_ctl_next_packet_to_send (lsquic_send_ctl_t *ctl) } else packet_out->po_flags &= ~PO_LIMITED; + + if (UNLIKELY(packet_out->po_header_type == HETY_INITIAL) + && !(ctl->sc_conn_pub->lconn->cn_flags & LSCONN_SERVER)) + { + send_ctl_maybe_zero_pad(ctl, packet_out, size ? size : 1200); + } + return packet_out; } @@ -1161,7 +1576,6 @@ lsquic_send_ctl_delayed_one (lsquic_send_ctl_t *ctl, lsquic_packet_out_t *packet_out) { send_ctl_sched_prepend(ctl, packet_out); - ctl->sc_bytes_out -= packet_out_total_sz(packet_out); if (packet_out->po_flags & PO_LIMITED) ++ctl->sc_next_limit; LSQ_DEBUG("packet %"PRIu64" has been delayed", packet_out->po_packno); @@ -1188,22 +1602,44 @@ lsquic_send_ctl_have_outgoing_retx_frames (const lsquic_send_ctl_t *ctl) { const lsquic_packet_out_t *packet_out; TAILQ_FOREACH(packet_out, &ctl->sc_scheduled_packets, po_next) - if (packet_out->po_frame_types & QFRAME_RETRANSMITTABLE_MASK) + if (packet_out->po_frame_types & ctl->sc_retx_frames) return 1; return 0; } +static void +send_ctl_set_packet_out_token (const struct lsquic_send_ctl *ctl, + struct lsquic_packet_out *packet_out) +{ + unsigned char *token; + + token = malloc(ctl->sc_token_sz); + if (!token) + { + LSQ_WARN("malloc failed: cannot set initial token"); + return; + } + + memcpy(token, ctl->sc_token, ctl->sc_token_sz); + packet_out->po_token = token; + packet_out->po_token_len = ctl->sc_token_sz; + packet_out->po_flags |= PO_NONCE; + LSQ_DEBUG("set initial token on packet"); +} + + static lsquic_packet_out_t * -send_ctl_allocate_packet (lsquic_send_ctl_t *ctl, enum packno_bits bits, - unsigned need_at_least) +send_ctl_allocate_packet (struct lsquic_send_ctl *ctl, enum packno_bits bits, + unsigned need_at_least, enum packnum_space pns, + const struct network_path *path) { lsquic_packet_out_t *packet_out; packet_out = lsquic_packet_out_new(&ctl->sc_enpub->enp_mm, ctl->sc_conn_pub->packet_out_malo, !(ctl->sc_flags & SC_TCID0), ctl->sc_conn_pub->lconn, bits, - ctl->sc_ver_neg->vn_tag, NULL); + ctl->sc_ver_neg->vn_tag, NULL, path); if (!packet_out) return NULL; @@ -1213,23 +1649,39 @@ send_ctl_allocate_packet (lsquic_send_ctl_t *ctl, enum packno_bits bits, */ LSQ_ERROR("wanted to allocate packet with at least %u bytes of " "payload, but only got %u bytes (mtu: %u bytes)", need_at_least, - lsquic_packet_out_avail(packet_out), ctl->sc_pack_size); + lsquic_packet_out_avail(packet_out), SC_PACK_SIZE(ctl)); send_ctl_destroy_packet(ctl, packet_out); return NULL; } + if (UNLIKELY(pns != PNS_APP)) + { + if (pns == PNS_INIT) + { + packet_out->po_header_type = HETY_INITIAL; + if (ctl->sc_token) + send_ctl_set_packet_out_token(ctl, packet_out); + } + else + packet_out->po_header_type = HETY_HANDSHAKE; + } + + lsquic_packet_out_set_pns(packet_out, pns); + packet_out->po_lflags |= ctl->sc_ecn << POECN_SHIFT; + packet_out->po_loss_chain = packet_out; return packet_out; } lsquic_packet_out_t * -lsquic_send_ctl_new_packet_out (lsquic_send_ctl_t *ctl, unsigned need_at_least) +lsquic_send_ctl_new_packet_out (lsquic_send_ctl_t *ctl, unsigned need_at_least, + enum packnum_space pns, const struct network_path *path) { lsquic_packet_out_t *packet_out; enum packno_bits bits; bits = lsquic_send_ctl_packno_bits(ctl); - packet_out = send_ctl_allocate_packet(ctl, bits, need_at_least); + packet_out = send_ctl_allocate_packet(ctl, bits, need_at_least, pns, path); if (!packet_out) return NULL; @@ -1240,17 +1692,49 @@ lsquic_send_ctl_new_packet_out (lsquic_send_ctl_t *ctl, unsigned need_at_least) } +struct lsquic_packet_out * +lsquic_send_ctl_last_scheduled (struct lsquic_send_ctl *ctl, + enum packnum_space pns, const struct network_path *path, + int regen_match) +{ + struct lsquic_packet_out *packet_out; + + if (0 == regen_match) + { + TAILQ_FOREACH_REVERSE(packet_out, &ctl->sc_scheduled_packets, + lsquic_packets_tailq, po_next) + if (pns == lsquic_packet_out_pns(packet_out) + && path == packet_out->po_path) + return packet_out; + } + else + { + TAILQ_FOREACH_REVERSE(packet_out, &ctl->sc_scheduled_packets, + lsquic_packets_tailq, po_next) + if (pns == lsquic_packet_out_pns(packet_out) + && packet_out->po_regen_sz == packet_out->po_data_sz + && path == packet_out->po_path) + return packet_out; + } + + return NULL; +} + + +/* Do not use for STREAM frames + */ lsquic_packet_out_t * lsquic_send_ctl_get_writeable_packet (lsquic_send_ctl_t *ctl, - unsigned need_at_least, int *is_err) + enum packnum_space pns, unsigned need_at_least, + const struct network_path *path, int regen_match, int *is_err) { lsquic_packet_out_t *packet_out; assert(need_at_least > 0); - packet_out = lsquic_send_ctl_last_scheduled(ctl); + packet_out = lsquic_send_ctl_last_scheduled(ctl, pns, path, regen_match); if (packet_out - && !(packet_out->po_flags & PO_STREAM_END) + && !(packet_out->po_flags & (PO_MINI|PO_STREAM_END|PO_RETX)) && lsquic_packet_out_avail(packet_out) >= need_at_least) { return packet_out; @@ -1263,15 +1747,48 @@ lsquic_send_ctl_get_writeable_packet (lsquic_send_ctl_t *ctl, return NULL; } - packet_out = lsquic_send_ctl_new_packet_out(ctl, need_at_least); + packet_out = lsquic_send_ctl_new_packet_out(ctl, need_at_least, pns, path); if (packet_out) + { + lsquic_packet_out_set_pns(packet_out, pns); lsquic_send_ctl_scheduled_one(ctl, packet_out); + } else if (is_err) *is_err = 1; return packet_out; } +struct lsquic_packet_out * +lsquic_send_ctl_get_packet_for_crypto (struct lsquic_send_ctl *ctl, + unsigned need_at_least, enum packnum_space pns, + const struct network_path *path) +{ + struct lsquic_packet_out *packet_out; + + assert(lsquic_send_ctl_schedule_stream_packets_immediately(ctl)); + assert(need_at_least > 0); + + packet_out = lsquic_send_ctl_last_scheduled(ctl, pns, path, 0); + if (packet_out + && !(packet_out->po_flags & (PO_STREAM_END|PO_RETX)) + && lsquic_packet_out_avail(packet_out) >= need_at_least) + { + return packet_out; + } + + if (!lsquic_send_ctl_can_send(ctl)) + return NULL; + + packet_out = lsquic_send_ctl_new_packet_out(ctl, need_at_least, pns, path); + if (!packet_out) + return NULL; + + lsquic_send_ctl_scheduled_one(ctl, packet_out); + return packet_out; +} + + static void update_for_resending (lsquic_send_ctl_t *ctl, lsquic_packet_out_t *packet_out) { @@ -1286,7 +1803,7 @@ update_for_resending (lsquic_send_ctl_t *ctl, lsquic_packet_out_t *packet_out) packno = send_ctl_next_packno(ctl); packet_out->po_flags &= ~PO_SENT_SZ; - packet_out->po_frame_types &= ~QFRAME_REGEN_MASK; + packet_out->po_frame_types &= ~GQUIC_FRAME_REGEN_MASK; assert(packet_out->po_frame_types); packet_out->po_packno = packno; @@ -1359,7 +1876,8 @@ lsquic_send_ctl_set_tcid0 (lsquic_send_ctl_t *ctl, int tcid0) * elided in due time. */ void -lsquic_send_ctl_elide_stream_frames (lsquic_send_ctl_t *ctl, uint32_t stream_id) +lsquic_send_ctl_elide_stream_frames (lsquic_send_ctl_t *ctl, + lsquic_stream_id_t stream_id) { struct lsquic_packet_out *packet_out, *next; unsigned n, adj; @@ -1375,7 +1893,7 @@ lsquic_send_ctl_elide_stream_frames (lsquic_send_ctl_t *ctl, uint32_t stream_id) next = TAILQ_NEXT(packet_out, po_next); if ((packet_out->po_frame_types & (1 << QUIC_FRAME_STREAM)) - ) + && 0 == (packet_out->po_flags & PO_MINI)) { adj = lsquic_packet_out_elide_reset_stream_frames(packet_out, stream_id); @@ -1383,8 +1901,9 @@ lsquic_send_ctl_elide_stream_frames (lsquic_send_ctl_t *ctl, uint32_t stream_id) if (0 == packet_out->po_frame_types) { LSQ_DEBUG("cancel packet %"PRIu64" after eliding frames for " - "stream %"PRIu32, packet_out->po_packno, stream_id); + "stream %"PRIu64, packet_out->po_packno, stream_id); send_ctl_sched_remove(ctl, packet_out); + send_ctl_destroy_chain(ctl, packet_out, NULL); send_ctl_destroy_packet(ctl, packet_out); ++dropped; } @@ -1407,7 +1926,7 @@ lsquic_send_ctl_elide_stream_frames (lsquic_send_ctl_t *ctl, uint32_t stream_id) if (0 == packet_out->po_frame_types) { LSQ_DEBUG("cancel buffered packet in queue #%u after eliding " - "frames for stream %"PRIu32, n, stream_id); + "frames for stream %"PRIu64, n, stream_id); TAILQ_REMOVE(&ctl->sc_buffered_packets[n].bpq_packets, packet_out, po_next); --ctl->sc_buffered_packets[n].bpq_count; @@ -1482,7 +2001,6 @@ send_ctl_log_packet_q (const lsquic_send_ctl_t *ctl, const char *prefix, free(buf); } - #define LOG_PACKET_Q(prefix, queue) do { \ if (LSQ_LOG_ENABLED(LSQ_LOG_DEBUG)) \ send_ctl_log_packet_q(ctl, queue, prefix); \ @@ -1509,7 +2027,7 @@ lsquic_send_ctl_squeeze_sched (lsquic_send_ctl_t *ctl) if (packet_out->po_regen_sz < packet_out->po_data_sz) { if (packet_out->po_flags & PO_ENCRYPTED) - send_ctl_release_enc_data(ctl, packet_out); + send_ctl_return_enc_data(ctl, packet_out); } else { @@ -1522,6 +2040,7 @@ lsquic_send_ctl_squeeze_sched (lsquic_send_ctl_t *ctl) send_ctl_sched_remove(ctl, packet_out); LSQ_DEBUG("Dropping packet %"PRIu64" from scheduled queue", packet_out->po_packno); + send_ctl_destroy_chain(ctl, packet_out, NULL); send_ctl_destroy_packet(ctl, packet_out); ++dropped; } @@ -1554,42 +2073,52 @@ lsquic_send_ctl_reset_packnos (lsquic_send_ctl_t *ctl) void -lsquic_send_ctl_ack_to_front (lsquic_send_ctl_t *ctl) +lsquic_send_ctl_ack_to_front (struct lsquic_send_ctl *ctl, unsigned n_acks) { struct lsquic_packet_out *ack_packet; - assert(ctl->sc_n_scheduled > 1); /* Otherwise, why is this called? */ - ack_packet = TAILQ_LAST(&ctl->sc_scheduled_packets, lsquic_packets_tailq); - assert(ack_packet->po_frame_types & (1 << QUIC_FRAME_ACK)); - TAILQ_REMOVE(&ctl->sc_scheduled_packets, ack_packet, po_next); - TAILQ_INSERT_HEAD(&ctl->sc_scheduled_packets, ack_packet, po_next); + assert(n_acks > 0); + assert(ctl->sc_n_scheduled > n_acks); /* Otherwise, why is this called? */ + for ( ; n_acks > 0; --n_acks) + { + ack_packet = TAILQ_LAST(&ctl->sc_scheduled_packets, lsquic_packets_tailq); + assert(ack_packet->po_frame_types & (1 << QUIC_FRAME_ACK)); + TAILQ_REMOVE(&ctl->sc_scheduled_packets, ack_packet, po_next); + TAILQ_INSERT_HEAD(&ctl->sc_scheduled_packets, ack_packet, po_next); + } } void lsquic_send_ctl_drop_scheduled (lsquic_send_ctl_t *ctl) { - lsquic_packet_out_t *packet_out; - const unsigned n = ctl->sc_n_scheduled; - while ((packet_out = TAILQ_FIRST(&ctl->sc_scheduled_packets))) + struct lsquic_packet_out *packet_out, *next; + unsigned n; + + n = 0; + for (packet_out = TAILQ_FIRST(&ctl->sc_scheduled_packets); packet_out; + packet_out = next) { - send_ctl_sched_remove(ctl, packet_out); - send_ctl_destroy_packet(ctl, packet_out); + next = TAILQ_NEXT(packet_out, po_next); + if (0 == (packet_out->po_flags & PO_HELLO)) + { + send_ctl_sched_remove(ctl, packet_out); + send_ctl_destroy_chain(ctl, packet_out, NULL); + send_ctl_destroy_packet(ctl, packet_out); + ++n; + } } - assert(0 == ctl->sc_n_scheduled); - ctl->sc_cur_packno = lsquic_senhist_largest(&ctl->sc_senhist); - LSQ_DEBUG("dropped %u scheduled packet%s", n, n != 0 ? "s" : ""); + + ctl->sc_senhist.sh_flags |= SH_GAP_OK; + + LSQ_DEBUG("dropped %u scheduled packet%s (%u left)", n, n != 1 ? "s" : "", + ctl->sc_n_scheduled); } -#ifdef NDEBUG -static -#elif __GNUC__ -__attribute__((weak)) -#endif -enum buf_packet_type -lsquic_send_ctl_determine_bpt (lsquic_send_ctl_t *ctl, - const lsquic_stream_t *stream) +static enum buf_packet_type +send_ctl_determine_gquic_bpt (struct lsquic_send_ctl *ctl, + const struct lsquic_stream *stream) { const lsquic_stream_t *other_stream; struct lsquic_hash_elem *el; @@ -1610,6 +2139,35 @@ lsquic_send_ctl_determine_bpt (lsquic_send_ctl_t *ctl, } +static enum buf_packet_type +send_ctl_determine_ietf_bpt (struct lsquic_send_ctl *ctl, + const struct lsquic_stream *stream) +{ + if (lsquic_stream_is_critical(stream) + || stream == lsquic_prio_tree_highest_non_crit( + ctl->sc_conn_pub->u.ietf.prio_tree)) + return BPT_HIGHEST_PRIO; + else + return BPT_OTHER_PRIO; +} + + +#ifdef NDEBUG +static +#elif __GNUC__ +__attribute__((weak)) +#endif +enum buf_packet_type +lsquic_send_ctl_determine_bpt (lsquic_send_ctl_t *ctl, + const lsquic_stream_t *stream) +{ + if (ctl->sc_flags & SC_IETF) + return send_ctl_determine_ietf_bpt(ctl, stream); + else + return send_ctl_determine_gquic_bpt(ctl, stream); +} + + static enum buf_packet_type send_ctl_lookup_bpt (lsquic_send_ctl_t *ctl, const struct lsquic_stream *stream) @@ -1628,6 +2186,7 @@ static unsigned send_ctl_max_bpq_count (const lsquic_send_ctl_t *ctl, enum buf_packet_type packet_type) { + unsigned long cwnd; unsigned count; switch (packet_type) @@ -1637,9 +2196,10 @@ send_ctl_max_bpq_count (const lsquic_send_ctl_t *ctl, case BPT_HIGHEST_PRIO: default: /* clang does not complain about absence of `default'... */ count = ctl->sc_n_scheduled + ctl->sc_n_in_flight_retx; - if (count < lsquic_cubic_get_cwnd(&ctl->sc_cubic) / ctl->sc_pack_size) + cwnd = ctl->sc_ci->cci_get_cwnd(CGP(ctl)); + if (count < cwnd / SC_PACK_SIZE(ctl)) { - count -= lsquic_cubic_get_cwnd(&ctl->sc_cubic) / ctl->sc_pack_size; + count -= cwnd / SC_PACK_SIZE(ctl); if (count > MAX_BPQ_COUNT) return count; } @@ -1659,8 +2219,8 @@ send_ctl_move_ack (struct lsquic_send_ctl *ctl, struct lsquic_packet_out *dst, memcpy(dst->po_data, src->po_data, src->po_regen_sz); dst->po_data_sz = src->po_regen_sz; dst->po_regen_sz = src->po_regen_sz; - dst->po_frame_types |= (QFRAME_REGEN_MASK & src->po_frame_types); - src->po_frame_types &= ~QFRAME_REGEN_MASK; + dst->po_frame_types |= (GQUIC_FRAME_REGEN_MASK & src->po_frame_types); + src->po_frame_types &= ~GQUIC_FRAME_REGEN_MASK; lsquic_packet_out_chop_regen(src); } } @@ -1668,8 +2228,8 @@ send_ctl_move_ack (struct lsquic_send_ctl *ctl, struct lsquic_packet_out *dst, static lsquic_packet_out_t * send_ctl_get_buffered_packet (lsquic_send_ctl_t *ctl, - enum buf_packet_type packet_type, unsigned need_at_least, - const struct lsquic_stream *stream) + enum buf_packet_type packet_type, unsigned need_at_least, + const struct network_path *path, const struct lsquic_stream *stream) { struct buf_packet_q *const packet_q = &ctl->sc_buffered_packets[packet_type]; @@ -1722,7 +2282,8 @@ send_ctl_get_buffered_packet (lsquic_send_ctl_t *ctl, bits = lsquic_send_ctl_guess_packno_bits(ctl); } - packet_out = send_ctl_allocate_packet(ctl, bits, need_at_least); + packet_out = send_ctl_allocate_packet(ctl, bits, need_at_least, PNS_APP, + path); if (!packet_out) return NULL; @@ -1749,21 +2310,24 @@ send_ctl_get_buffered_packet (lsquic_send_ctl_t *ctl, lsquic_packet_out_t * lsquic_send_ctl_get_packet_for_stream (lsquic_send_ctl_t *ctl, - unsigned need_at_least, const struct lsquic_stream *stream) + unsigned need_at_least, const struct network_path *path, + const struct lsquic_stream *stream) { enum buf_packet_type packet_type; if (lsquic_send_ctl_schedule_stream_packets_immediately(ctl)) - return lsquic_send_ctl_get_writeable_packet(ctl, need_at_least, NULL); + return lsquic_send_ctl_get_writeable_packet(ctl, PNS_APP, + need_at_least, path, 0, NULL); else { packet_type = send_ctl_lookup_bpt(ctl, stream); return send_ctl_get_buffered_packet(ctl, packet_type, need_at_least, - stream); + path, stream); } } + int lsquic_send_ctl_buffered_and_same_prio_as_headers (struct lsquic_send_ctl *ctl, const struct lsquic_stream *stream) @@ -1784,10 +2348,15 @@ lsquic_send_ctl_calc_packno_bits (lsquic_send_ctl_t *ctl) lsquic_packno_t smallest_unacked; enum packno_bits bits; unsigned n_in_flight; + unsigned long cwnd; + const struct parse_funcs *pf; + + pf = ctl->sc_conn_pub->lconn->cn_pf; smallest_unacked = lsquic_send_ctl_smallest_unacked(ctl); - n_in_flight = lsquic_cubic_get_cwnd(&ctl->sc_cubic) / ctl->sc_pack_size; - bits = calc_packno_bits(ctl->sc_cur_packno + 1, smallest_unacked, + cwnd = ctl->sc_ci->cci_get_cwnd(CGP(ctl)); + n_in_flight = cwnd / SC_PACK_SIZE(ctl); + bits = pf->pf_calc_packno_bits(ctl->sc_cur_packno + 1, smallest_unacked, n_in_flight); if (bits <= ctl->sc_max_packno_bits) return bits; @@ -1818,7 +2387,8 @@ split_buffered_packet (lsquic_send_ctl_t *ctl, assert(TAILQ_FIRST(&packet_q->bpq_packets) == packet_out); - new_packet_out = send_ctl_allocate_packet(ctl, bits, 0); + new_packet_out = send_ctl_allocate_packet(ctl, bits, 0, + lsquic_packet_out_pns(packet_out), packet_out->po_path); if (!packet_out) return -1; @@ -1861,6 +2431,11 @@ lsquic_send_ctl_schedule_buffered (lsquic_send_ctl_t *ctl, if ((packet_out->po_frame_types & QUIC_FTBIT_ACK) && packet_out->po_ack2ed < ctl->sc_largest_acked) { + /* Chrome watches for a decrease in the value of the Largest + * Observed field of the ACK frame and marks it as an error: + * this is why we have to send out ACK in the order they were + * generated. + */ LSQ_DEBUG("Remove out-of-order ACK from buffered packet"); lsquic_packet_out_chop_regen(packet_out); if (packet_out->po_data_sz == 0) @@ -1937,7 +2512,9 @@ lsquic_send_ctl_mem_used (const struct lsquic_send_ctl *ctl) size_t size; const struct lsquic_packets_tailq queues[] = { ctl->sc_scheduled_packets, - ctl->sc_unacked_packets, + ctl->sc_unacked_packets[PNS_INIT], + ctl->sc_unacked_packets[PNS_HSK], + ctl->sc_unacked_packets[PNS_APP], ctl->sc_lost_packets, ctl->sc_buffered_packets[0].bpq_packets, ctl->sc_buffered_packets[1].bpq_packets, @@ -1956,11 +2533,175 @@ lsquic_send_ctl_mem_used (const struct lsquic_send_ctl *ctl) void lsquic_send_ctl_verneg_done (struct lsquic_send_ctl *ctl) { - if (ctl->sc_conn_pub->lconn->cn_version == LSQVER_044) - ctl->sc_max_packno_bits = PACKNO_BITS_2; - else - ctl->sc_max_packno_bits = PACKNO_BITS_3; + ctl->sc_max_packno_bits = PACKNO_BITS_3; LSQ_DEBUG("version negotiation done (%s): max packno bits: %u", lsquic_ver2str[ ctl->sc_conn_pub->lconn->cn_version ], ctl->sc_max_packno_bits); } + + +int +lsquic_send_ctl_retry (struct lsquic_send_ctl *ctl, + const unsigned char *token, size_t token_sz, int cidlen_diff) +{ + struct lsquic_packet_out *packet_out; + + if (token_sz >= 1ull << (sizeof(packet_out->po_token_len) * 8)) + { + LSQ_WARN("token size %zu is too long", token_sz); + return -1; + } + + send_ctl_expire(ctl, PNS_INIT, EXFI_ALL); + packet_out = TAILQ_FIRST(&ctl->sc_lost_packets); + if (!(packet_out && HETY_INITIAL == packet_out->po_header_type)) + { + LSQ_INFO("cannot find initial packet to add token to"); + return -1; + } + + ++ctl->sc_retry_count; + if (ctl->sc_retry_count > 3) + { + LSQ_INFO("failing connection after %u retries", ctl->sc_retry_count); + return -1; + } + + if (0 != lsquic_send_ctl_set_token(ctl, token, token_sz)) + return -1; + + if (packet_out->po_nonce) + free(packet_out->po_nonce); + + packet_out->po_nonce = malloc(token_sz); + if (!packet_out->po_nonce) + { + LSQ_WARN("%s: malloc failed", __func__); + return -1; + } + memcpy(packet_out->po_nonce, token, token_sz); + packet_out->po_flags |= PO_NONCE; + packet_out->po_token_len = token_sz; + packet_out->po_data_sz -= token_sz; + if (cidlen_diff > 0) + packet_out->po_data_sz += cidlen_diff; + else if (cidlen_diff < 0) + packet_out->po_data_sz -= -cidlen_diff; + return 0; +} + + +int +lsquic_send_ctl_set_token (struct lsquic_send_ctl *ctl, + const unsigned char *token, size_t token_sz) +{ + unsigned char *copy; + + if (token_sz > 1 << + (sizeof(((struct lsquic_packet_out *)0)->po_token_len) * 8)) + { + errno = EINVAL; + return -1; + } + + copy = malloc(token_sz); + if (!copy) + return -1; + memcpy(copy, token, token_sz); + free(ctl->sc_token); + ctl->sc_token = copy; + ctl->sc_token_sz = token_sz; + LSQ_DEBUG("set token"); + return 0; +} + + +void +lsquic_send_ctl_empty_pns (struct lsquic_send_ctl *ctl, enum packnum_space pns) +{ + lsquic_packet_out_t *packet_out, *next; + unsigned count, packet_sz; + struct lsquic_packets_tailq *const *q; + struct lsquic_packets_tailq *const queues[] = { + &ctl->sc_scheduled_packets, + &ctl->sc_unacked_packets[pns], + &ctl->sc_lost_packets, + &ctl->sc_buffered_packets[0].bpq_packets, + &ctl->sc_buffered_packets[1].bpq_packets, + }; + + count = 0; + for (q = queues; q < queues + sizeof(queues) / sizeof(queues[0]); ++q) + for (packet_out = TAILQ_FIRST(*q); packet_out; packet_out = next) + { + next = TAILQ_NEXT(packet_out, po_next); + if (pns == lsquic_packet_out_pns(packet_out)) + { + TAILQ_REMOVE(*q, packet_out, po_next); + if (*q == &ctl->sc_unacked_packets[pns]) + { + if (0 == (packet_out->po_flags & PO_LOSS_REC)) + { + packet_sz = packet_out_sent_sz(packet_out); + send_ctl_unacked_remove(ctl, packet_out, packet_sz); + lsquic_packet_out_ack_streams(packet_out); + } + send_ctl_destroy_chain(ctl, packet_out, &next); + } + send_ctl_destroy_packet(ctl, packet_out); + ++count; + } + } + + lsquic_alarmset_unset(ctl->sc_alset, AL_RETX_INIT + pns); + + LSQ_DEBUG("emptied %s, destroyed %u packet%.*s", lsquic_pns2str[pns], + count, count != 1, "s"); +} + + +void +lsquic_send_ctl_repath (struct lsquic_send_ctl *ctl, struct network_path *old, + struct network_path *new) +{ + struct lsquic_packet_out *packet_out; + unsigned count; + struct lsquic_packets_tailq *const *q; + struct lsquic_packets_tailq *const queues[] = { + &ctl->sc_scheduled_packets, + &ctl->sc_unacked_packets[PNS_INIT], + &ctl->sc_unacked_packets[PNS_HSK], + &ctl->sc_unacked_packets[PNS_APP], + &ctl->sc_lost_packets, + &ctl->sc_buffered_packets[0].bpq_packets, + &ctl->sc_buffered_packets[1].bpq_packets, + }; + + assert(ctl->sc_flags & SC_IETF); + + count = 0; + for (q = queues; q < queues + sizeof(queues) / sizeof(queues[0]); ++q) + TAILQ_FOREACH(packet_out, *q, po_next) + if (packet_out->po_path == old) + { + ++count; + packet_out->po_path = new; + if (packet_out->po_flags & PO_ENCRYPTED) + send_ctl_return_enc_data(ctl, packet_out); + } + + LSQ_DEBUG("repathed %u packet%.*s", count, count != 1, "s"); +} + + +void +lsquic_send_ctl_return_enc_data (struct lsquic_send_ctl *ctl) +{ + struct lsquic_packet_out *packet_out; + + assert(!(ctl->sc_flags & SC_IETF)); + + TAILQ_FOREACH(packet_out, &ctl->sc_scheduled_packets, po_next) + if (packet_out->po_flags & PO_ENCRYPTED) + send_ctl_return_enc_data(ctl, packet_out); +} diff --git a/src/liblsquic/lsquic_send_ctl.h b/src/liblsquic/lsquic_send_ctl.h index 3d7fd399a..4fcf2dfea 100644 --- a/src/liblsquic/lsquic_send_ctl.h +++ b/src/liblsquic/lsquic_send_ctl.h @@ -17,11 +17,12 @@ struct ack_info; struct lsquic_alarmset; struct lsquic_engine_public; struct lsquic_conn_public; +struct network_path; struct ver_neg; +enum pns; enum buf_packet_type { BPT_HIGHEST_PRIO, BPT_OTHER_PRIO, }; -#define MAX_BPQ_COUNT 10 struct buf_packet_q { struct lsquic_packets_tailq bpq_packets; @@ -30,12 +31,17 @@ struct buf_packet_q enum send_ctl_flags { SC_TCID0 = (1 << 0), - SC_LOST_ACK = (1 << 1), SC_NSTP = (1 << 2), SC_PACE = (1 << 3), SC_SCHED_TICK = (1 << 4), SC_BUFFER_STREAM= (1 << 5), SC_WAS_QUIET = (1 << 6), + SC_IETF = (1 << 7), +#define SCBIT_LOST_ACK_SHIFT 8 + SC_LOST_ACK_INIT= 1 << 8, + SC_LOST_ACK_HSK = SC_LOST_ACK_INIT << PNS_HSK, + SC_LOST_ACK_APP = SC_LOST_ACK_INIT << PNS_APP, + SC_1RTT_ACKED = 1 << 11, }; typedef struct lsquic_send_ctl { @@ -45,15 +51,20 @@ typedef struct lsquic_send_ctl { */ lsquic_senhist_t sc_senhist; enum send_ctl_flags sc_flags; + enum ecn sc_ecn; unsigned sc_n_stop_waiting; - struct lsquic_packets_tailq sc_unacked_packets; + struct lsquic_packets_tailq sc_unacked_packets[N_PNS]; lsquic_packno_t sc_largest_acked_packno; lsquic_time_t sc_largest_acked_sent_time; - unsigned sc_bytes_out; + lsquic_time_t sc_last_sent_time; + lsquic_time_t sc_last_rto_time; unsigned sc_bytes_unacked_retx; unsigned sc_bytes_scheduled; - unsigned sc_pack_size; - struct lsquic_cubic sc_cubic; + union { + struct lsquic_cubic cubic; + struct lsquic_bbr bbr; + } sc_cong_u; + const struct cong_ctl_if *sc_ci; struct lsquic_engine_public *sc_enpub; unsigned sc_bytes_unacked_all; unsigned sc_n_in_flight_all; @@ -61,6 +72,7 @@ typedef struct lsquic_send_ctl { unsigned sc_n_consec_rtos; unsigned sc_n_hsk; unsigned sc_n_tlp; + enum quic_ft_bit sc_retx_frames; struct lsquic_alarmset *sc_alset; /* Second section: everything else. */ @@ -80,7 +92,7 @@ typedef struct lsquic_send_ctl { * is set. (The "ack2ed" is odd enough to not be confused with anything * else and it is not insanely long.) */ - lsquic_packno_t sc_largest_ack2ed; + lsquic_packno_t sc_largest_ack2ed[N_PNS]; /* sc_largest_acked is the largest packet number in PNS_APP packet number * space sent by peer for which we generated (not necessarily sent) an ACK. * This information is used to drop stale ACK frames from packets in @@ -88,9 +100,11 @@ typedef struct lsquic_send_ctl { */ lsquic_packno_t sc_largest_acked; lsquic_time_t sc_loss_to; + uint64_t sc_ecn_total_acked[N_PNS]; + uint64_t sc_ecn_ce_cnt[N_PNS]; struct { - uint32_t stream_id; + lsquic_stream_id_t stream_id; enum buf_packet_type packet_type; } sc_cached_bpt; unsigned sc_next_limit; @@ -103,20 +117,24 @@ typedef struct lsquic_send_ctl { n_delayed; } sc_stats; #endif + unsigned char *sc_token; + size_t sc_token_sz; + unsigned sc_retry_count; + unsigned sc_rt_count; /* Count round trips */ + lsquic_packno_t sc_cur_rt_end; } lsquic_send_ctl_t; void lsquic_send_ctl_init (lsquic_send_ctl_t *, struct lsquic_alarmset *, struct lsquic_engine_public *, const struct ver_neg *, - struct lsquic_conn_public *, unsigned short max_packet_size); + struct lsquic_conn_public *, enum send_ctl_flags); int -lsquic_send_ctl_sent_packet (lsquic_send_ctl_t *, struct lsquic_packet_out *, - int); +lsquic_send_ctl_sent_packet (lsquic_send_ctl_t *, struct lsquic_packet_out *); int lsquic_send_ctl_got_ack (lsquic_send_ctl_t *, const struct ack_info *, - lsquic_time_t); + lsquic_time_t, lsquic_time_t); lsquic_packno_t lsquic_send_ctl_smallest_unacked (lsquic_send_ctl_t *ctl); @@ -137,7 +155,7 @@ void lsquic_send_ctl_delayed_one (lsquic_send_ctl_t *, struct lsquic_packet_out *); struct lsquic_packet_out * -lsquic_send_ctl_next_packet_to_send (lsquic_send_ctl_t *); +lsquic_send_ctl_next_packet_to_send (struct lsquic_send_ctl *, size_t); void lsquic_send_ctl_expire_all (lsquic_send_ctl_t *ctl); @@ -146,7 +164,8 @@ lsquic_send_ctl_expire_all (lsquic_send_ctl_t *ctl); #define lsquic_send_ctl_n_scheduled(ctl) (+(ctl)->sc_n_scheduled) -#define lsquic_send_ctl_largest_ack2ed(ctl) (+(ctl)->sc_largest_ack2ed) +#define lsquic_send_ctl_largest_ack2ed(ctl, pns) \ + (+(ctl)->sc_largest_ack2ed[pns]) #if LSQUIC_EXTRA_CHECKS void @@ -161,28 +180,38 @@ lsquic_send_ctl_have_outgoing_stream_frames (const lsquic_send_ctl_t *); int lsquic_send_ctl_have_outgoing_retx_frames (const lsquic_send_ctl_t *); -#define lsquic_send_ctl_last_scheduled(ctl) \ - TAILQ_LAST(&(ctl)->sc_scheduled_packets, lsquic_packets_tailq) +struct lsquic_packet_out * +lsquic_send_ctl_last_scheduled (struct lsquic_send_ctl *, enum packnum_space, + const struct network_path *, int); struct lsquic_packet_out * -lsquic_send_ctl_new_packet_out (lsquic_send_ctl_t *, unsigned); +lsquic_send_ctl_new_packet_out (lsquic_send_ctl_t *, unsigned, + enum packnum_space, const struct network_path *); struct lsquic_packet_out * -lsquic_send_ctl_get_writeable_packet (lsquic_send_ctl_t *, - unsigned need_at_least, int *is_err); +lsquic_send_ctl_get_writeable_packet (lsquic_send_ctl_t *, enum packnum_space, + unsigned need_at_least, const struct network_path *, int, int *is_err); struct lsquic_packet_out * lsquic_send_ctl_get_packet_for_stream (lsquic_send_ctl_t *, - unsigned need_at_least, const struct lsquic_stream *); + unsigned need_at_least, const struct network_path *, + const struct lsquic_stream *); + +struct lsquic_packet_out * +lsquic_send_ctl_get_packet_for_crypto (struct lsquic_send_ctl *ctl, + unsigned need_at_least, enum packnum_space, const struct network_path *); unsigned lsquic_send_ctl_reschedule_packets (lsquic_send_ctl_t *); -#define lsquic_send_ctl_lost_ack(ctl) ((ctl)->sc_flags & SC_LOST_ACK) +#define lsquic_send_ctl_lost_ack(ctl) \ + (((ctl)->sc_flags & (SC_LOST_ACK_INIT|SC_LOST_ACK_HSK|SC_LOST_ACK_APP)) \ + >> SCBIT_LOST_ACK_SHIFT) -#define lsquic_send_ctl_scheduled_ack(ctl, packno) do { \ - (ctl)->sc_flags &= ~SC_LOST_ACK; \ - (ctl)->sc_largest_acked = packno; \ +#define lsquic_send_ctl_scheduled_ack(ctl, pns, acked) do { \ + (ctl)->sc_flags &= ~(SC_LOST_ACK_INIT << pns); \ + if (PNS_APP == pns) \ + (ctl)->sc_largest_acked = acked; \ } while (0) void @@ -191,7 +220,7 @@ lsquic_send_ctl_set_tcid0 (lsquic_send_ctl_t *, int); #define lsquic_send_ctl_turn_nstp_on(ctl) ((ctl)->sc_flags |= SC_NSTP) void -lsquic_send_ctl_elide_stream_frames (lsquic_send_ctl_t *, uint32_t); +lsquic_send_ctl_elide_stream_frames (lsquic_send_ctl_t *, lsquic_stream_id_t); int lsquic_send_ctl_squeeze_sched (lsquic_send_ctl_t *); @@ -208,9 +237,10 @@ void lsquic_send_ctl_reset_packnos (lsquic_send_ctl_t *); void -lsquic_send_ctl_ack_to_front (lsquic_send_ctl_t *); +lsquic_send_ctl_ack_to_front (struct lsquic_send_ctl *, unsigned n_acks); -#define lsquic_send_ctl_n_stop_waiting(ctl) (+(ctl)->sc_n_stop_waiting) +#define lsquic_send_ctl_n_stop_waiting(ctl) \ + (+(ctl)->sc_n_stop_waiting) #define lsquic_send_ctl_n_stop_waiting_reset(ctl) do { \ (ctl)->sc_n_stop_waiting = 0; \ @@ -219,14 +249,19 @@ lsquic_send_ctl_ack_to_front (lsquic_send_ctl_t *); void lsquic_send_ctl_drop_scheduled (lsquic_send_ctl_t *); -#define lsquic_send_ctl_tick(ctl, now) do { \ +#define lsquic_send_ctl_tick_in(ctl, now) do { \ if ((ctl)->sc_flags & SC_PACE) \ { \ (ctl)->sc_flags |= SC_SCHED_TICK; \ - pacer_tick(&(ctl)->sc_pacer, now); \ + pacer_tick_in(&(ctl)->sc_pacer, now); \ } \ } while (0) +#define lsquic_send_ctl_tick_out(ctl) do { \ + if ((ctl)->sc_flags & SC_PACE) \ + pacer_tick_out(&(ctl)->sc_pacer); \ +} while (0) + #define lsquic_send_ctl_next_pacer_time(ctl) ( \ ((ctl)->sc_flags & SC_PACE) \ && pacer_delayed(&(ctl)->sc_pacer) \ @@ -260,6 +295,9 @@ lsquic_send_ctl_determine_bpt (struct lsquic_send_ctl *, enum packno_bits lsquic_send_ctl_calc_packno_bits (struct lsquic_send_ctl *); + +void +lsquic_send_ctl_set_max_bpq_count (unsigned); #endif size_t @@ -278,20 +316,41 @@ int lsquic_send_ctl_pacer_blocked (struct lsquic_send_ctl *); #define lsquic_send_ctl_incr_pack_sz(ctl, packet, delta) do { \ - (packet)->po_data_sz += delta; \ + (packet)->po_data_sz += (delta); \ if ((packet)->po_flags & PO_SCHED) \ - (ctl)->sc_bytes_scheduled += delta; \ + (ctl)->sc_bytes_scheduled += (delta); \ lsquic_send_ctl_sanity_check(ctl); \ } while (0) int -lsquic_send_ctl_sched_is_blocked (const struct lsquic_send_ctl *); +lsquic_send_ctl_sched_is_blocked (struct lsquic_send_ctl *); int + lsquic_send_ctl_buffered_and_same_prio_as_headers (struct lsquic_send_ctl *, const struct lsquic_stream *); void lsquic_send_ctl_verneg_done (struct lsquic_send_ctl *); +int +lsquic_send_ctl_retry (struct lsquic_send_ctl *, const unsigned char *, + size_t, int); + +int +lsquic_send_ctl_set_token (struct lsquic_send_ctl *, + const unsigned char *token, size_t token_sz); + +void +lsquic_send_ctl_empty_pns (struct lsquic_send_ctl *, enum packnum_space); + +void +lsquic_send_ctl_repath (struct lsquic_send_ctl *, struct network_path *old, + struct network_path *new); + +void +lsquic_send_ctl_return_enc_data (struct lsquic_send_ctl *); + +#define lsquic_send_ctl_1rtt_acked(ctl) ((ctl)->sc_flags & SC_1RTT_ACKED) + #endif diff --git a/src/liblsquic/lsquic_senhist.h b/src/liblsquic/lsquic_senhist.h index a026be03c..c1610cff7 100644 --- a/src/liblsquic/lsquic_senhist.h +++ b/src/liblsquic/lsquic_senhist.h @@ -16,38 +16,43 @@ typedef struct lsquic_senhist { lsquic_packno_t sh_last_sent; -#if !LSQUIC_SENHIST_FATAL enum { +#if !LSQUIC_SENHIST_FATAL SH_WARNED = 1 << 0, /* Warn once */ - } sh_flags; #endif + SH_GAP_OK = 1 << 1, /* Before connection is just about to close */ + } sh_flags; } lsquic_senhist_t; -#define lsquic_senhist_init(hist) do { \ - (hist)->sh_last_sent = 0; \ +#define lsquic_senhist_init(hist, is_ietf) do { \ + if (is_ietf) \ + (hist)->sh_last_sent = ~0ull; \ + else \ + (hist)->sh_last_sent = 0; \ } while (0) #define lsquic_senhist_cleanup(hist) #if LSQUIC_SENHIST_FATAL #define lsquic_senhist_add(hist, packno) do { \ - assert((hist)->sh_last_sent == packno - 1); \ - (hist)->sh_last_sent = packno; \ + if (!((hist)->sh_flags & SH_GAP_OK)) \ + assert((hist)->sh_last_sent == packno - 1); \ + if ((int64_t) (packno) > (int64_t) (hist)->sh_last_sent) \ + (hist)->sh_last_sent = packno; \ } while (0) #else #define lsquic_senhist_add(hist, packno) do { \ - if ((hist)->sh_last_sent == packno - 1) \ - (hist)->sh_last_sent = packno; \ - else \ + if ((hist)->sh_last_sent != packno - 1) \ { \ - if (!((hist)->sh_flags & SH_WARNED)) \ + if (!((hist)->sh_flags & (SH_WARNED|SH_GAP_OK))) \ { \ LSQ_WARN("send history gap %"PRIu64" - %"PRIu64, \ (hist)->sh_last_sent, packno); \ (hist)->sh_flags |= SH_WARNED; \ } \ - (hist)->sh_last_sent = packno; \ } \ + if ((int64_t) (packno) > (int64_t) (hist)->sh_last_sent) \ + (hist)->sh_last_sent = packno; \ } while (0) #endif diff --git a/src/liblsquic/lsquic_sfcw.c b/src/liblsquic/lsquic_sfcw.c index ece093261..1dabb61e8 100644 --- a/src/liblsquic/lsquic_sfcw.c +++ b/src/liblsquic/lsquic_sfcw.c @@ -10,7 +10,11 @@ #include "lsquic_conn_flow.h" #include "lsquic_types.h" #include "lsquic_rtt.h" +#include "lsquic_varint.h" #include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" #include "lsquic_stream.h" #include "lsquic_conn_public.h" #include "lsquic_mm.h" @@ -20,14 +24,14 @@ #include "lsquic_ev_log.h" #define LSQUIC_LOGGER_MODULE LSQLM_SFCW -#define LSQUIC_LOG_CONN_ID fc->sf_conn_pub->lconn->cn_cid +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(fc->sf_conn_pub->lconn) #define LSQUIC_LOG_STREAM_ID fc->sf_stream_id #include "lsquic_logger.h" void lsquic_sfcw_init (struct lsquic_sfcw *fc, unsigned max_recv_window, struct lsquic_cfcw *cfcw, struct lsquic_conn_public *cpub, - unsigned stream_id) + lsquic_stream_id_t stream_id) { memset(fc, 0, sizeof(*fc)); fc->sf_max_recv_win = max_recv_window; diff --git a/src/liblsquic/lsquic_sfcw.h b/src/liblsquic/lsquic_sfcw.h index 6801e22f6..c8b8b9ae0 100644 --- a/src/liblsquic/lsquic_sfcw.h +++ b/src/liblsquic/lsquic_sfcw.h @@ -20,14 +20,14 @@ typedef struct lsquic_sfcw { struct lsquic_conn_public *sf_conn_pub; unsigned sf_max_recv_win; /* Maximum receive window */ - unsigned sf_stream_id; /* Used for logging */ + lsquic_stream_id_t sf_stream_id; /* Used for logging */ } lsquic_sfcw_t; void lsquic_sfcw_init (lsquic_sfcw_t *, unsigned initial_max_recv_window, struct lsquic_cfcw *cfcw, struct lsquic_conn_public *, - unsigned stream_id); + lsquic_stream_id_t stream_id); /* If update is to be sent, updates max_recv_off and returns true. Note * that if you call this function twice, the second call will return false. diff --git a/src/liblsquic/lsquic_shsk_stream.c b/src/liblsquic/lsquic_shsk_stream.c new file mode 100644 index 000000000..e75fbdda7 --- /dev/null +++ b/src/liblsquic/lsquic_shsk_stream.c @@ -0,0 +1,99 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * Stream/crypto handshake adapter for the server side. Since on the server + * side, the handshake logic is handled in mini conn, this adapter does not + * have much to do. If peer sends any data on this stream, the adapter + * throws the data out and warns. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "lsquic_int_types.h" +#include "lsquic.h" + +#include "lsquic_str.h" +#include "lsquic_mm.h" +#include "lsquic_engine_public.h" +#include "lsquic_hash.h" +#include "lsquic_conn.h" +#include "lsquic_shsk_stream.h" + +#define LSQUIC_LOGGER_MODULE LSQLM_HSK_ADAPTER +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(s_hsk->lconn) +#include "lsquic_logger.h" + + + +static lsquic_stream_ctx_t * +hsk_server_on_new_stream (void *stream_if_ctx, lsquic_stream_t *stream) +{ + struct server_hsk_ctx *const s_hsk = stream_if_ctx; + LSQ_DEBUG("stream created"); + + lsquic_stream_wantread(stream, 1); + + /* Note that we return the same thing we're passed. This structure lives + * inside struct full_conn. + */ + return (lsquic_stream_ctx_t *) s_hsk; +} + + +static void +hsk_server_on_read (lsquic_stream_t *stream, struct lsquic_stream_ctx *ctx) +{ + struct server_hsk_ctx *const s_hsk = (struct server_hsk_ctx *) ctx; + struct lsquic_mm *const mm = &s_hsk->enpub->enp_mm; + ssize_t nread; + unsigned char *buf; + + buf = lsquic_mm_get_4k(mm); + if (!buf) + { + LSQ_WARN("could not allocate buffer: %s", strerror(errno)); + return; + } + nread = lsquic_stream_read(stream, buf, 4 * 1024); + lsquic_mm_put_4k(mm, buf); + + if (!(s_hsk->flags & SHC_WARNED)) + { + LSQ_WARN("read %zd bytes from stream: what are we to do with them? " + "Further warnings suppressed", nread); + s_hsk->flags |= SHC_WARNED; + } + else + LSQ_DEBUG("read %zd bytes from stream", nread); +} + + +static void +hsk_server_on_write (lsquic_stream_t *stream, struct lsquic_stream_ctx *ctx) +{ + assert(0); /* This function is never called */ +} + + +static void +hsk_server_on_close (lsquic_stream_t *stream, struct lsquic_stream_ctx *ctx) +{ + struct server_hsk_ctx *s_hsk = (struct server_hsk_ctx *) ctx; + LSQ_DEBUG("stream closed"); +} + + +const struct lsquic_stream_if lsquic_server_hsk_stream_if = +{ + .on_new_stream = hsk_server_on_new_stream, + .on_read = hsk_server_on_read, + .on_write = hsk_server_on_write, + .on_close = hsk_server_on_close, +}; diff --git a/src/liblsquic/lsquic_shsk_stream.h b/src/liblsquic/lsquic_shsk_stream.h new file mode 100644 index 000000000..7fdfd706d --- /dev/null +++ b/src/liblsquic/lsquic_shsk_stream.h @@ -0,0 +1,23 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * Stream/crypto handshake adapter for the server side. See implementation + * for more comments and explanation. + */ + +#ifndef LSQUIC_SHSK_STREAM_H +#define LSQUIC_SHSK_STREAM_H 1 + +struct lsquic_conn; +struct lsquic_engine_public; + +struct server_hsk_ctx { + struct lsquic_conn *lconn; + struct lsquic_engine_public *enpub; + enum { + SHC_WARNED = (1 << 0), /* Warning has been printed */ + } flags; +}; + +extern const struct lsquic_stream_if lsquic_server_hsk_stream_if; + +#endif diff --git a/src/liblsquic/lsquic_sizes.h b/src/liblsquic/lsquic_sizes.h new file mode 100644 index 000000000..f40d61c03 --- /dev/null +++ b/src/liblsquic/lsquic_sizes.h @@ -0,0 +1,13 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#ifndef LSQUIC_SIZES_H +#define LSQUIC_SIZES_H 1 + +#define IQUIC_SRESET_TOKEN_SZ 16u + +#define IQUIC_MIN_SRST_RANDOM_BYTES (1 /* First byte: 01XX XXXX */ \ + + 24 /* Random bytes */) + +#define IQUIC_MIN_SRST_SIZE (IQUIC_MIN_SRST_RANDOM_BYTES \ + + IQUIC_SRESET_TOKEN_SZ /* Token */) + +#endif diff --git a/src/liblsquic/lsquic_spi.c b/src/liblsquic/lsquic_spi.c index 0dbb88107..d108bae53 100644 --- a/src/liblsquic/lsquic_spi.c +++ b/src/liblsquic/lsquic_spi.c @@ -17,11 +17,14 @@ #include "lsquic_types.h" #include "lsquic_int_types.h" #include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" #include "lsquic_stream.h" #include "lsquic_spi.h" #define LSQUIC_LOGGER_MODULE LSQLM_SPI -#define LSQUIC_LOG_CONN_ID iter->spi_cid +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(iter->spi_conn) #include "lsquic_logger.h" #define SPI_DEBUG(fmt, ...) LSQ_DEBUG("%s: " fmt, iter->spi_name, __VA_ARGS__) @@ -48,15 +51,16 @@ add_stream_to_spi (struct stream_prio_iter *iter, lsquic_stream_t *stream) void lsquic_spi_init (struct stream_prio_iter *iter, struct lsquic_stream *first, - struct lsquic_stream *last, uintptr_t next_ptr_offset, - enum stream_flags onlist_mask, lsquic_cid_t cid, const char *name, - int (*filter)(void *filter_ctx, struct lsquic_stream *), - void *filter_ctx) + struct lsquic_stream *last, uintptr_t next_ptr_offset, + enum stream_q_flags onlist_mask, const struct lsquic_conn *conn, + const char *name, + int (*filter)(void *filter_ctx, struct lsquic_stream *), + void *filter_ctx) { struct lsquic_stream *stream; unsigned count; - iter->spi_cid = cid; + iter->spi_conn = conn; iter->spi_name = name ? name : "UNSET"; iter->spi_set[0] = 0; iter->spi_set[1] = 0; @@ -198,9 +202,9 @@ maybe_evict_prev (struct stream_prio_iter *iter) { unsigned set, bit; - if (0 == (iter->spi_prev_stream->stream_flags & iter->spi_onlist_mask)) + if (0 == (iter->spi_prev_stream->sm_qflags & iter->spi_onlist_mask)) { - SPI_DEBUG("evict stream %u", iter->spi_prev_stream->id); + SPI_DEBUG("evict stream %"PRIu64, iter->spi_prev_stream->id); TAILQ_REMOVE(&iter->spi_streams[ iter->spi_prev_prio ], iter->spi_prev_stream, next_prio_stream); if (TAILQ_EMPTY(&iter->spi_streams[ iter->spi_prev_prio ])) @@ -241,9 +245,9 @@ lsquic_spi_first (struct stream_prio_iter *iter) iter->spi_prev_prio = iter->spi_cur_prio; iter->spi_prev_stream = stream; iter->spi_next_stream = TAILQ_NEXT(stream, next_prio_stream); - if (stream->id != 1 && stream->id != 3) - SPI_DEBUG("%s: return stream %u, priority %u", __func__, stream->id, - iter->spi_cur_prio); + if (LSQ_LOG_ENABLED(LSQ_LOG_DEBUG) && !lsquic_stream_is_critical(stream)) + SPI_DEBUG("%s: return stream %"PRIu64", priority %u", __func__, + stream->id, iter->spi_cur_prio); return stream; } @@ -262,9 +266,9 @@ lsquic_spi_next (struct stream_prio_iter *iter) assert(iter->spi_prev_prio == iter->spi_cur_prio); iter->spi_prev_stream = stream; iter->spi_next_stream = TAILQ_NEXT(stream, next_prio_stream); - if (stream->id != 1 && stream->id != 3) - SPI_DEBUG("%s: return stream %u, priority %u", __func__, stream->id, - iter->spi_cur_prio); + if (LSQ_LOG_ENABLED(LSQ_LOG_DEBUG) && !lsquic_stream_is_critical(stream)) + SPI_DEBUG("%s: return stream %"PRIu64", priority %u", __func__, + stream->id, iter->spi_cur_prio); return stream; } @@ -279,9 +283,9 @@ lsquic_spi_next (struct stream_prio_iter *iter) iter->spi_prev_stream = stream; iter->spi_next_stream = TAILQ_NEXT(stream, next_prio_stream); - if (!lsquic_stream_is_critical(stream)) - SPI_DEBUG("%s: return stream %u, priority %u", __func__, stream->id, - iter->spi_cur_prio); + if (LSQ_LOG_ENABLED(LSQ_LOG_DEBUG) && !lsquic_stream_is_critical(stream)) + SPI_DEBUG("%s: return stream %"PRIu64", priority %u", __func__, + stream->id, iter->spi_cur_prio); return stream; } diff --git a/src/liblsquic/lsquic_spi.h b/src/liblsquic/lsquic_spi.h index 371945aa2..e26737105 100644 --- a/src/liblsquic/lsquic_spi.h +++ b/src/liblsquic/lsquic_spi.h @@ -14,13 +14,15 @@ #include +enum stream_q_flags; + struct stream_prio_iter { - lsquic_cid_t spi_cid; /* Used for logging */ + const struct lsquic_conn *spi_conn; /* Used for logging */ const char *spi_name; /* Used for logging */ uint64_t spi_set[4]; /* 256 bits */ - enum stream_flags spi_onlist_mask; + enum stream_q_flags spi_onlist_mask; unsigned char spi_cur_prio; unsigned char spi_prev_prio; struct lsquic_stream *spi_prev_stream, @@ -32,7 +34,8 @@ struct stream_prio_iter void lsquic_spi_init (struct stream_prio_iter *, struct lsquic_stream *first, struct lsquic_stream *last, uintptr_t next_ptr_offset, - unsigned onlist_mask, lsquic_cid_t cid, const char *name, + enum stream_q_flags onlist_mask, const struct lsquic_conn *, + const char *name, int (*filter)(void *filter_ctx, struct lsquic_stream *), void *filter_ctx); diff --git a/src/liblsquic/lsquic_stock_shi.c b/src/liblsquic/lsquic_stock_shi.c new file mode 100644 index 000000000..7264d9bea --- /dev/null +++ b/src/liblsquic/lsquic_stock_shi.c @@ -0,0 +1,208 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_stock_shi.c + */ + +#include +#include +#include +#include +#include + +#include "lsquic.h" +#include "lsquic_stock_shi.h" +#include "lsquic_malo.h" +#include "lsquic_hash.h" + +struct stock_shared_hash +{ + TAILQ_HEAD(, hash_elem) lru_elems; + struct lsquic_hash *lhash; + struct malo *malo; +}; + + +struct key +{ + void *buf; + unsigned sz; +}; + + +struct hash_elem +{ + TAILQ_ENTRY(hash_elem) next_lru_he; + struct lsquic_hash_elem lhash_elem; + void *data; + time_t expiry; /* If not 0, the element is on LRU list */ + struct key key; + unsigned data_sz; +}; + + +static void +free_key_data (struct hash_elem *he) +{ + if (he->data_sz) + free(he->data); + free(he->key.buf); +} + + +static void +delete_expired_elements (struct stock_shared_hash *hash) +{ + struct hash_elem *he; + time_t now = time(NULL); + while ((he = TAILQ_FIRST(&hash->lru_elems))) + { + if (he->expiry < now) + { + lsquic_hash_erase(hash->lhash, &he->lhash_elem); + if (he->expiry) + TAILQ_REMOVE(&hash->lru_elems, he, next_lru_he); + free_key_data(he); + lsquic_malo_put(he); + } + else + break; + } +} + + +static int +stock_shi_insert (void *hash_ctx, void *key, unsigned key_sz, + void *data, unsigned data_sz, time_t expiry) +{ + struct stock_shared_hash *const hash = hash_ctx; + struct hash_elem *he; + + /* Potential optimization: do not exire on every insert. Use case: + * if many insert occur in a row, it is not efficient to perform + * this check every time. Can add a counter in hash. + */ + if (!TAILQ_EMPTY(&hash->lru_elems)) + delete_expired_elements(hash); + + he = lsquic_malo_get(hash->malo); + if (!he) + return -1; + he->key.buf = key; + he->key.sz = key_sz; + he->data = data; + he->data_sz = data_sz; + he->expiry = expiry; + memset(&he->lhash_elem, 0, sizeof(he->lhash_elem)); + if (lsquic_hash_insert(hash->lhash, he->key.buf, + he->key.sz, he, &he->lhash_elem)) + { + if (expiry) + TAILQ_INSERT_TAIL(&hash->lru_elems, he, next_lru_he); + return 0; + } + else + { + lsquic_malo_put(he); + return -1; + } +} + + +static int +stock_shi_lookup (void *hash_ctx, const void *key, unsigned key_sz, + void **data, unsigned *data_sz) +{ + struct stock_shared_hash *const hash = hash_ctx; + struct hash_elem *he; + struct lsquic_hash_elem *el; + + if (!TAILQ_EMPTY(&hash->lru_elems)) + delete_expired_elements(hash); + + el = lsquic_hash_find(hash->lhash, key, key_sz); + if (!el) + return 0; /* 0: not found */ + he = lsquic_hashelem_getdata(el); + *data = he->data; + *data_sz = he->data_sz; + return 1; /* 1: found */ +} + + +static int +stock_shi_delete (void *hash_ctx, const void *key, unsigned key_sz) +{ + struct stock_shared_hash *const hash = hash_ctx; + struct lsquic_hash_elem *el; + struct hash_elem *he; + + if (!TAILQ_EMPTY(&hash->lru_elems)) + delete_expired_elements(hash); + + el = lsquic_hash_find(hash->lhash, key, key_sz); + if (!el) + return -1; + + he = lsquic_hashelem_getdata(el); + lsquic_hash_erase(hash->lhash, el); + if (he->expiry) + TAILQ_REMOVE(&hash->lru_elems, he, next_lru_he); + + free_key_data(he); + lsquic_malo_put(he); + return 0; +} + + +struct stock_shared_hash * +stock_shared_hash_new (void) +{ + struct malo *malo; + struct stock_shared_hash *hash; + + malo = lsquic_malo_create(sizeof(struct hash_elem)); + if (!malo) + return NULL; + + hash = lsquic_malo_get(malo); + if (!hash) + { /* This would be really odd, but let's check this for completeness. */ + lsquic_malo_destroy(malo); + return NULL; + } + + hash->malo = malo; + hash->lhash = lsquic_hash_create(); + TAILQ_INIT(&hash->lru_elems); + return hash; +} + + +void +stock_shared_hash_destroy (struct stock_shared_hash *hash) +{ + struct hash_elem *he; + struct lsquic_hash_elem *el; + for (el = lsquic_hash_first(hash->lhash); el; + el = lsquic_hash_next(hash->lhash)) + { + he = lsquic_hashelem_getdata(el); + free_key_data(he); + /* No need to lsquic_malo_put(he) here */ + } + lsquic_hash_destroy(hash->lhash); + lsquic_malo_destroy(hash->malo); +} + + +const struct lsquic_shared_hash_if stock_shi = +{ + .shi_insert = stock_shi_insert, + .shi_delete = stock_shi_delete, + .shi_lookup = stock_shi_lookup, +}; + + +/* Need this to save one malloc using malo: */ +typedef char hash_not_larger_than_hash_elem [ + (sizeof(struct stock_shared_hash) <= sizeof(struct hash_elem)) - 1]; diff --git a/src/liblsquic/lsquic_stock_shi.h b/src/liblsquic/lsquic_stock_shi.h new file mode 100644 index 000000000..6bfc1631b --- /dev/null +++ b/src/liblsquic/lsquic_stock_shi.h @@ -0,0 +1,30 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_stock_shi.h - Stock shared hash interface implementation. + */ + +#ifndef LSQUIC_STOCK_SHI +#define LSQUIC_STOCK_SHI 1 + + +#ifdef __cplusplus +extern "C" { +#endif + + +struct stock_shared_hash; + +struct stock_shared_hash * +stock_shared_hash_new (void); + +void +stock_shared_hash_destroy (struct stock_shared_hash *); + + +#ifdef __cplusplus +} +#endif + +extern const struct lsquic_shared_hash_if stock_shi; + +#endif diff --git a/src/liblsquic/lsquic_str.c b/src/liblsquic/lsquic_str.c index 4366a0111..b33e6ebd8 100644 --- a/src/liblsquic/lsquic_str.c +++ b/src/liblsquic/lsquic_str.c @@ -122,6 +122,7 @@ lsquic_str_copy (lsquic_str_t *lstr_dst, const lsquic_str_t *lstr_src) copy = malloc(lstr_src->len + 1); if (!copy) + /* Keeping the original behavior: */ return NULL; memcpy(copy, lstr_src->str, lstr_src->len); diff --git a/src/liblsquic/lsquic_stream.c b/src/liblsquic/lsquic_stream.c index 94c82cf19..1fb846b09 100644 --- a/src/liblsquic/lsquic_stream.c +++ b/src/liblsquic/lsquic_stream.c @@ -35,6 +35,9 @@ #include "lsquic_conn_flow.h" #include "lsquic_rtt.h" #include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" #include "lsquic_stream.h" #include "lsquic_conn_public.h" #include "lsquic_util.h" @@ -48,16 +51,29 @@ #include "lsquic_senhist.h" #include "lsquic_pacer.h" #include "lsquic_cubic.h" +#include "lsquic_bw_sampler.h" +#include "lsquic_minmax.h" +#include "lsquic_bbr.h" #include "lsquic_send_ctl.h" #include "lsquic_headers.h" #include "lsquic_ev_log.h" +#include "lsquic_enc_sess.h" +#include "lsqpack.h" +#include "lsquic_frab_list.h" +#include "lsquic_http1x_if.h" +#include "lsquic_qdec_hdl.h" +#include "lsquic_qenc_hdl.h" +#include "lsquic_byteswap.h" +#include "lsquic_h3_prio.h" +#include "lsquic_ietf.h" +#include "lsquic_push_promise.h" #define LSQUIC_LOGGER_MODULE LSQLM_STREAM -#define LSQUIC_LOG_CONN_ID stream->conn_pub->lconn->cn_cid +#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(stream->conn_pub->lconn) #define LSQUIC_LOG_STREAM_ID stream->id #include "lsquic_logger.h" -#define SM_BUF_SIZE QUIC_MAX_PACKET_SZ +#define MIN(a, b) ((a) < (b) ? (a) : (b)) static void drop_frames_in (lsquic_stream_t *stream); @@ -84,7 +100,64 @@ static int stream_flush_nocheck (lsquic_stream_t *stream); static void -maybe_remove_from_write_q (lsquic_stream_t *stream, enum stream_flags flag); +maybe_remove_from_write_q (lsquic_stream_t *stream, enum stream_q_flags flag); + +enum swtp_status { SWTP_OK, SWTP_STOP, SWTP_ERROR }; + +static enum swtp_status +stream_write_to_packet_std (struct frame_gen_ctx *fg_ctx, const size_t size); + +static enum swtp_status +stream_write_to_packet_hsk (struct frame_gen_ctx *fg_ctx, const size_t size); + +static enum swtp_status +stream_write_to_packet_crypto (struct frame_gen_ctx *fg_ctx, const size_t size); + +static size_t +stream_write_avail (struct lsquic_stream *); + +static size_t +stream_write_avail_with_headers (struct lsquic_stream *); + +static int +hq_filter_readable (struct lsquic_stream *stream); + +static void +hq_decr_left (struct lsquic_stream *stream, size_t); + +static size_t +hq_filter_df (struct lsquic_stream *stream, struct data_frame *data_frame); + +static int +stream_readable_non_http (struct lsquic_stream *stream); + +static int +stream_readable_http_gquic (struct lsquic_stream *stream); + +static int +stream_readable_http_ietf (struct lsquic_stream *stream); + +static ssize_t +stream_write_buf (struct lsquic_stream *stream, const void *buf, size_t sz); + +static size_t +active_hq_frame_sizes (const struct lsquic_stream *); + +static void +on_write_dp_wrapper (struct lsquic_stream *, lsquic_stream_ctx_t *); + +static void +on_write_pp_wrapper (struct lsquic_stream *, lsquic_stream_ctx_t *); + +static void +stream_hq_frame_put (struct lsquic_stream *, struct stream_hq_frame *); + +const struct stream_filter_if hq_stream_filter_if = +{ + .sfi_readable = hq_filter_readable, + .sfi_filter_df = hq_filter_df, + .sfi_decr_left = hq_decr_left, +}; #if LSQUIC_KEEP_STREAM_HISTORY @@ -110,6 +183,7 @@ enum stream_history_event SHE_GOAWAY_IN = 'g', SHE_USER_WRITE_HEADER = 'h', SHE_HEADERS_IN = 'H', + SHE_IF_SWITCH = 'i', SHE_ONCLOSE_SCHED = 'l', SHE_ONCLOSE_CALL = 'L', SHE_ONNEW = 'N', @@ -117,11 +191,14 @@ enum stream_history_event SHE_USER_READ = 'r', SHE_SHUTDOWN_READ = 'R', SHE_RST_IN = 's', + SHE_SS_IN = 'S', SHE_RST_OUT = 't', + SHE_RST_ACKED = 'T', SHE_FLUSH = 'u', SHE_USER_WRITE_DATA = 'w', SHE_SHUTDOWN_WRITE = 'W', SHE_CLOSE = 'X', + SHE_DELAY_SW = 'y', SHE_FORCE_FINISH = 'Z', }; @@ -216,65 +293,190 @@ maybe_conn_to_tickable_if_writeable (lsquic_stream_t *stream, static int stream_stalled (const lsquic_stream_t *stream) { - return 0 == (stream->stream_flags & (STREAM_WANT_WRITE|STREAM_WANT_READ)) && + return 0 == (stream->sm_qflags & (SMQF_WANT_WRITE|SMQF_WANT_READ)) && ((STREAM_U_READ_DONE|STREAM_U_WRITE_DONE) & stream->stream_flags) != (STREAM_U_READ_DONE|STREAM_U_WRITE_DONE); } +static size_t +stream_stream_frame_header_sz (const struct lsquic_stream *stream, + unsigned data_sz) +{ + return stream->conn_pub->lconn->cn_pf->pf_calc_stream_frame_header_sz( + stream->id, stream->tosend_off, data_sz); +} + + +static size_t +stream_crypto_frame_header_sz (const struct lsquic_stream *stream, + unsigned data_sz_IGNORED) +{ + return stream->conn_pub->lconn->cn_pf + ->pf_calc_crypto_frame_header_sz(stream->tosend_off); +} + + +/* GQUIC-only function */ +static int +stream_is_hsk (const struct lsquic_stream *stream) +{ + if (stream->sm_bflags & SMBF_IETF) + return 0; + else + return stream->id == LSQUIC_GQUIC_STREAM_HANDSHAKE; +} + + +static struct lsquic_stream * +stream_new_common (lsquic_stream_id_t id, struct lsquic_conn_public *conn_pub, + const struct lsquic_stream_if *stream_if, void *stream_if_ctx, + enum stream_ctor_flags ctor_flags) +{ + struct lsquic_stream *stream; + + stream = calloc(1, sizeof(*stream)); + if (!stream) + return NULL; + + if (ctor_flags & SCF_USE_DI_HASH) + stream->data_in = data_in_hash_new(conn_pub, id, 0); + else + stream->data_in = data_in_nocopy_new(conn_pub, id); + if (!stream->data_in) + { + free(stream); + return NULL; + } + + stream->id = id; + stream->stream_if = stream_if; + stream->conn_pub = conn_pub; + stream->sm_onnew_arg = stream_if_ctx; + stream->sm_write_avail = stream_write_avail; + + if ((ctor_flags & (SCF_IETF|SCF_CRITICAL)) == SCF_IETF) + { + if (0 == lsquic_prio_tree_add_stream(conn_pub->u.ietf.prio_tree, + stream, H3ET_ROOT, 0, 0)) + stream->sm_qflags |= SMQF_H3_PRIO; + else + { + stream->data_in->di_if->di_destroy(stream->data_in); + free(stream); + return NULL; + } + } + + STAILQ_INIT(&stream->sm_hq_frames); + + stream->sm_bflags |= ctor_flags & ((1 << (N_SMBF_FLAGS - 1)) - 1); + if (conn_pub->lconn->cn_flags & LSCONN_SERVER) + stream->sm_bflags |= SMBF_SERVER; + + return stream; +} + + /* TODO: The logic to figure out whether the stream is connection limited * should be taken out of the constructor. The caller should specify this * via one of enum stream_ctor_flags. */ lsquic_stream_t * -lsquic_stream_new_ext (uint32_t id, struct lsquic_conn_public *conn_pub, - const struct lsquic_stream_if *stream_if, - void *stream_if_ctx, unsigned initial_window, - unsigned initial_send_off, - enum stream_ctor_flags ctor_flags) +lsquic_stream_new (lsquic_stream_id_t id, + struct lsquic_conn_public *conn_pub, + const struct lsquic_stream_if *stream_if, void *stream_if_ctx, + unsigned initial_window, uint64_t initial_send_off, + enum stream_ctor_flags ctor_flags) { lsquic_cfcw_t *cfcw; lsquic_stream_t *stream; - stream = calloc(1, sizeof(*stream)); + stream = stream_new_common(id, conn_pub, stream_if, stream_if_ctx, + ctor_flags); if (!stream) return NULL; - stream->stream_if = stream_if; - stream->id = id; - stream->conn_pub = conn_pub; - stream->sm_onnew_arg = stream_if_ctx; if (!initial_window) initial_window = 16 * 1024; - if (LSQUIC_STREAM_HANDSHAKE == id || - (conn_pub->hs && LSQUIC_STREAM_HEADERS == id)) - cfcw = NULL; - else + + if (ctor_flags & SCF_IETF) { cfcw = &conn_pub->cfcw; - stream->stream_flags |= STREAM_CONN_LIMITED; - if (conn_pub->hs) - stream->stream_flags |= STREAM_USE_HEADERS; - lsquic_stream_set_priority_internal(stream, LSQUIC_STREAM_DEFAULT_PRIO); + stream->sm_bflags |= SMBF_CONN_LIMITED; + if (ctor_flags & SCF_HTTP) + { + stream->sm_write_avail = stream_write_avail_with_headers; + stream->sm_readable = stream_readable_http_ietf; + stream->sm_sfi = &hq_stream_filter_if; + } + else + stream->sm_readable = stream_readable_non_http; + lsquic_stream_set_priority_internal(stream, + LSQUIC_STREAM_DEFAULT_PRIO); + stream->sm_write_to_packet = stream_write_to_packet_std; + } + else + { + if (lsquic_stream_id_is_critical(ctor_flags & SCF_HTTP, id)) + cfcw = NULL; + else + { + cfcw = &conn_pub->cfcw; + stream->sm_bflags |= SMBF_CONN_LIMITED; + lsquic_stream_set_priority_internal(stream, + LSQUIC_STREAM_DEFAULT_PRIO); + } + if (stream->sm_bflags & SMBF_USE_HEADERS) + stream->sm_readable = stream_readable_http_gquic; + else + stream->sm_readable = stream_readable_non_http; + if (stream_is_hsk(stream)) + stream->sm_write_to_packet = stream_write_to_packet_hsk; + else + stream->sm_write_to_packet = stream_write_to_packet_std; } + lsquic_sfcw_init(&stream->fc, initial_window, cfcw, conn_pub, id); - if (!initial_send_off) - initial_send_off = 16 * 1024; stream->max_send_off = initial_send_off; - if (ctor_flags & SCF_USE_DI_HASH) - stream->data_in = data_in_hash_new(conn_pub, id, 0); - else - stream->data_in = data_in_nocopy_new(conn_pub, id); - LSQ_DEBUG("created stream %u @%p", id, stream); + LSQ_DEBUG("created stream"); + SM_HISTORY_APPEND(stream, SHE_CREATED); + stream->sm_frame_header_sz = stream_stream_frame_header_sz; + if (ctor_flags & SCF_CALL_ON_NEW) + lsquic_stream_call_on_new(stream); + return stream; +} + + +struct lsquic_stream * +lsquic_stream_new_crypto (enum enc_level enc_level, + struct lsquic_conn_public *conn_pub, + const struct lsquic_stream_if *stream_if, void *stream_if_ctx, + enum stream_ctor_flags ctor_flags) +{ + struct lsquic_stream *stream; + lsquic_stream_id_t stream_id; + + assert(ctor_flags & SCF_CRITICAL); + + stream_id = ~0ULL - enc_level; + stream = stream_new_common(stream_id, conn_pub, stream_if, + stream_if_ctx, ctor_flags); + if (!stream) + return NULL; + + stream->sm_bflags |= SMBF_CRYPTO|SMBF_IETF; + stream->sm_enc_level = enc_level; + /* TODO: why have limit in crypto stream? Set it to UINT64_MAX? */ + lsquic_sfcw_init(&stream->fc, 16 * 1024, NULL, conn_pub, stream_id); + stream->max_send_off = 16 * 1024; + LSQ_DEBUG("created crypto stream"); SM_HISTORY_APPEND(stream, SHE_CREATED); - if (ctor_flags & SCF_DI_AUTOSWITCH) - stream->stream_flags |= STREAM_AUTOSWITCH; + stream->sm_frame_header_sz = stream_crypto_frame_header_sz; + stream->sm_write_to_packet = stream_write_to_packet_crypto; + stream->sm_readable = stream_readable_non_http; if (ctor_flags & SCF_CALL_ON_NEW) lsquic_stream_call_on_new(stream); - if (ctor_flags & SCF_DISP_RW_ONCE) - stream->stream_flags |= STREAM_RW_ONCE; - if (ctor_flags & SCF_CRITICAL) - stream->stream_flags |= STREAM_CRITICAL; return stream; } @@ -297,7 +499,7 @@ lsquic_stream_call_on_new (lsquic_stream_t *stream) static void decr_conn_cap (struct lsquic_stream *stream, size_t incr) { - if (stream->stream_flags & STREAM_CONN_LIMITED) + if (stream->sm_bflags & SMBF_CONN_LIMITED) { assert(stream->conn_pub->conn_cap.cc_sent >= incr); stream->conn_pub->conn_cap.cc_sent -= incr; @@ -305,13 +507,30 @@ decr_conn_cap (struct lsquic_stream *stream, size_t incr) } +static void +maybe_resize_stream_buffer (struct lsquic_stream *stream) +{ + assert(0 == stream->sm_n_buffered); + + if (stream->sm_n_allocated < stream->conn_pub->path->np_pack_size) + { + free(stream->sm_buf); + stream->sm_buf = NULL; + stream->sm_n_allocated = 0; + } + else if (stream->sm_n_allocated > stream->conn_pub->path->np_pack_size) + stream->sm_n_allocated = stream->conn_pub->path->np_pack_size; +} + + static void drop_buffered_data (struct lsquic_stream *stream) { decr_conn_cap(stream, stream->sm_n_buffered); stream->sm_n_buffered = 0; - if (stream->stream_flags & STREAM_WRITE_Q_FLAGS) - maybe_remove_from_write_q(stream, STREAM_WRITE_Q_FLAGS); + maybe_resize_stream_buffer(stream); + if (stream->sm_qflags & SMQF_WRITE_Q_FLAGS) + maybe_remove_from_write_q(stream, SMQF_WRITE_Q_FLAGS); } @@ -332,6 +551,9 @@ destroy_uh (struct lsquic_stream *stream) void lsquic_stream_destroy (lsquic_stream_t *stream) { + struct push_promise *promise; + struct stream_hq_frame *shf; + stream->stream_flags |= STREAM_U_WRITE_DONE|STREAM_U_READ_DONE; if ((stream->stream_flags & (STREAM_ONNEW_DONE|STREAM_ONCLOSE_DONE)) == STREAM_ONNEW_DONE) @@ -339,14 +561,19 @@ lsquic_stream_destroy (lsquic_stream_t *stream) stream->stream_flags |= STREAM_ONCLOSE_DONE; stream->stream_if->on_close(stream, stream->st_ctx); } - if (stream->stream_flags & STREAM_SENDING_FLAGS) + if (stream->sm_qflags & SMQF_SENDING_FLAGS) TAILQ_REMOVE(&stream->conn_pub->sending_streams, stream, next_send_stream); - if (stream->stream_flags & STREAM_WANT_READ) + if (stream->sm_qflags & SMQF_WANT_READ) TAILQ_REMOVE(&stream->conn_pub->read_streams, stream, next_read_stream); - if (stream->stream_flags & STREAM_WRITE_Q_FLAGS) + if (stream->sm_qflags & SMQF_WRITE_Q_FLAGS) TAILQ_REMOVE(&stream->conn_pub->write_streams, stream, next_write_stream); - if (stream->stream_flags & STREAM_SERVICE_FLAGS) + if (stream->sm_qflags & SMQF_SERVICE_FLAGS) TAILQ_REMOVE(&stream->conn_pub->service_streams, stream, next_service_stream); + if (stream->sm_qflags & SMQF_QPACK_DEC) + lsquic_qdh_unref_stream(stream->conn_pub->u.ietf.qdh, stream); + if (stream->sm_qflags & SMQF_H3_PRIO) + lsquic_prio_tree_remove_stream(stream->conn_pub->u.ietf.prio_tree, + stream, lsquic_time_now() /* XXX: do we have to call this? */); drop_buffered_data(stream); lsquic_sfcw_consume_rem(&stream->fc); drop_frames_in(stream); @@ -357,9 +584,22 @@ lsquic_stream_destroy (lsquic_stream_t *stream) ->hsi_discard_header_set(stream->push_req->uh_hset); free(stream->push_req); } + while ((promise = SLIST_FIRST(&stream->sm_promises))) + { + SLIST_REMOVE_HEAD(&stream->sm_promises, pp_next); + lsquic_pp_put(promise, stream->conn_pub->u.ietf.promises); + } + if (stream->sm_promise) + { + assert(stream->sm_promise->pp_pushed_stream == stream); + stream->sm_promise->pp_pushed_stream = NULL; + lsquic_pp_put(stream->sm_promise, stream->conn_pub->u.ietf.promises); + } + while ((shf = STAILQ_FIRST(&stream->sm_hq_frames))) + stream_hq_frame_put(stream, shf); destroy_uh(stream); free(stream->sm_buf); - LSQ_DEBUG("destroyed stream %u @%p", stream->id, stream); + LSQ_DEBUG("destroyed stream"); SM_HISTORY_DUMP_REMAINING(stream); free(stream); } @@ -376,7 +616,7 @@ stream_is_finished (const lsquic_stream_t *stream) /* This checks that no packets that reference this stream will * become outstanding: */ - && 0 == (stream->stream_flags & STREAM_SEND_RST) + && 0 == (stream->sm_qflags & SMQF_SEND_RST) && ((stream->stream_flags & STREAM_FORCE_FINISH) || (stream->stream_flags & (STREAM_FIN_SENT |STREAM_RST_SENT))); } @@ -388,12 +628,13 @@ maybe_finish_stream (lsquic_stream_t *stream) if (0 == (stream->stream_flags & STREAM_FINISHED) && stream_is_finished(stream)) { - LSQ_DEBUG("stream %u is now finished", stream->id); + LSQ_DEBUG("stream is now finished"); SM_HISTORY_APPEND(stream, SHE_FINISHED); - if (0 == (stream->stream_flags & STREAM_SERVICE_FLAGS)) + if (0 == (stream->sm_qflags & SMQF_SERVICE_FLAGS)) TAILQ_INSERT_TAIL(&stream->conn_pub->service_streams, stream, next_service_stream); - stream->stream_flags |= STREAM_FREE_STREAM|STREAM_FINISHED; + stream->sm_qflags |= SMQF_FREE_STREAM; + stream->stream_flags |= STREAM_FINISHED; } } @@ -402,14 +643,15 @@ static void maybe_schedule_call_on_close (lsquic_stream_t *stream) { if ((stream->stream_flags & (STREAM_U_READ_DONE|STREAM_U_WRITE_DONE| - STREAM_ONNEW_DONE|STREAM_ONCLOSE_DONE|STREAM_CALL_ONCLOSE)) - == (STREAM_U_READ_DONE|STREAM_U_WRITE_DONE|STREAM_ONNEW_DONE)) + STREAM_ONNEW_DONE|STREAM_ONCLOSE_DONE)) + == (STREAM_U_READ_DONE|STREAM_U_WRITE_DONE|STREAM_ONNEW_DONE) + && !(stream->sm_qflags & SMQF_CALL_ONCLOSE)) { - if (0 == (stream->stream_flags & STREAM_SERVICE_FLAGS)) + if (0 == (stream->sm_qflags & SMQF_SERVICE_FLAGS)) TAILQ_INSERT_TAIL(&stream->conn_pub->service_streams, stream, next_service_stream); - stream->stream_flags |= STREAM_CALL_ONCLOSE; - LSQ_DEBUG("scheduled calling on_close for stream %u", stream->id); + stream->sm_qflags |= SMQF_CALL_ONCLOSE; + LSQ_DEBUG("scheduled calling on_close"); SM_HISTORY_APPEND(stream, SHE_ONCLOSE_SCHED); } } @@ -419,13 +661,13 @@ void lsquic_stream_call_on_close (lsquic_stream_t *stream) { assert(stream->stream_flags & STREAM_ONNEW_DONE); - stream->stream_flags &= ~STREAM_CALL_ONCLOSE; - if (!(stream->stream_flags & STREAM_SERVICE_FLAGS)) + stream->sm_qflags &= ~SMQF_CALL_ONCLOSE; + if (!(stream->sm_qflags & SMQF_SERVICE_FLAGS)) TAILQ_REMOVE(&stream->conn_pub->service_streams, stream, next_service_stream); if (0 == (stream->stream_flags & STREAM_ONCLOSE_DONE)) { - LSQ_DEBUG("calling on_close for stream %u", stream->id); + LSQ_DEBUG("calling on_close"); stream->stream_flags |= STREAM_ONCLOSE_DONE; SM_HISTORY_APPEND(stream, SHE_ONCLOSE_CALL); stream->stream_if->on_close(stream, stream->st_ctx); @@ -435,8 +677,44 @@ lsquic_stream_call_on_close (lsquic_stream_t *stream) } +static int +stream_readable_non_http (struct lsquic_stream *stream) +{ + return stream->data_in->di_if->di_get_frame(stream->data_in, + stream->read_offset) != NULL; +} + + +static int +stream_readable_http_gquic (struct lsquic_stream *stream) +{ + return (stream->stream_flags & STREAM_HAVE_UH) + && (stream->uh + || stream->data_in->di_if->di_get_frame(stream->data_in, + stream->read_offset)); +} + + +static int +stream_readable_http_ietf (struct lsquic_stream *stream) +{ + return + /* If we have read the header set and the header set has not yet + * been read, the stream is readable. + */ + ((stream->stream_flags & STREAM_HAVE_UH) && stream->uh) + || + /* Alternatively, run the filter and check for payload availability. */ + (stream->sm_sfi->sfi_readable(stream) + && (/* Running the filter may result in hitting FIN: */ + (stream->stream_flags & STREAM_FIN_REACHED) + || stream->data_in->di_if->di_get_frame(stream->data_in, + stream->read_offset))); +} + + int -lsquic_stream_readable (const lsquic_stream_t *stream) +lsquic_stream_readable (struct lsquic_stream *stream) { /* A stream is readable if one of the following is true: */ return @@ -448,51 +726,117 @@ lsquic_stream_readable (const lsquic_stream_t *stream) * lsquic_stream_read() will return -1 (we want the user to be * able to collect the error). */ - || (stream->stream_flags & STREAM_RST_FLAGS) - /* - Either we are not in HTTP mode or the HTTP headers have been - * received and the headers or data from the stream can be read. - */ - || (!((stream->stream_flags & (STREAM_USE_HEADERS|STREAM_HAVE_UH)) - == STREAM_USE_HEADERS) - && (stream->uh != NULL - || stream->data_in->di_if->di_get_frame(stream->data_in, - stream->read_offset))) + || lsquic_stream_is_reset(stream) + /* Type-dependent readability check: */ + || stream->sm_readable(stream); ; } -size_t -lsquic_stream_write_avail (const struct lsquic_stream *stream) +static size_t +stream_write_avail (struct lsquic_stream *stream) { uint64_t stream_avail, conn_avail; + size_t hq_frames_sz; stream_avail = stream->max_send_off - stream->tosend_off - stream->sm_n_buffered; - if (stream->stream_flags & STREAM_CONN_LIMITED) + + if (stream->sm_bflags & SMBF_CONN_LIMITED) { conn_avail = lsquic_conn_cap_avail(&stream->conn_pub->conn_cap); if (conn_avail < stream_avail) - return conn_avail; + stream_avail = conn_avail; + } + + if ((stream->sm_bflags & (SMBF_IETF|SMBF_USE_HEADERS)) + == (SMBF_IETF|SMBF_USE_HEADERS)) + { + hq_frames_sz = active_hq_frame_sizes(stream); + if (hq_frames_sz == 0) + hq_frames_sz = 3; /* Smallest new frame */ + + if (stream_avail > hq_frames_sz) + stream_avail -= hq_frames_sz; + else + stream_avail = 0; } return stream_avail; } +static int +stream_is_pushing_promise (const struct lsquic_stream *stream) +{ + return (stream->stream_flags & STREAM_PUSHING) + && SLIST_FIRST(&stream->sm_promises) + && (SLIST_FIRST(&stream->sm_promises))->pp_write_state != PPWS_DONE + ; +} + + +/* To prevent deadlocks, ensure that when headers are sent, the bytes + * sent on the encoder stream are written first. + * + * XXX If the encoder is set up in non-risking mode, it is perfectly + * fine to send the header block first. TODO: update the logic to + * reflect this. There should be two sending behaviors: risk and non-risk. + * For now, we assume risk for everything to be on the conservative side. + */ +static size_t +stream_write_avail_with_headers (struct lsquic_stream *stream) +{ + if (stream->stream_flags & STREAM_PUSHING) + return stream_write_avail(stream); + + switch (stream->sm_send_headers_state) + { + case SSHS_BEGIN: + return lsquic_qeh_write_avail(stream->conn_pub->u.ietf.qeh); + case SSHS_ENC_SENDING: + if (stream->sm_hb_compl > + lsquic_qeh_enc_off(stream->conn_pub->u.ietf.qeh)) + return 0; + LSQ_DEBUG("encoder stream bytes have all been sent"); + stream->sm_send_headers_state = SSHS_HBLOCK_SENDING; + /* fall-through */ + default: + assert(SSHS_HBLOCK_SENDING == stream->sm_send_headers_state); + return stream_write_avail(stream); + } +} + + +size_t +lsquic_stream_write_avail (struct lsquic_stream *stream) +{ + return stream->sm_write_avail(stream); +} + + int lsquic_stream_update_sfcw (lsquic_stream_t *stream, uint64_t max_off) { + struct lsquic_conn *lconn; + if (max_off > lsquic_sfcw_get_max_recv_off(&stream->fc) && !lsquic_sfcw_set_max_recv_off(&stream->fc, max_off)) { + if (stream->sm_bflags & SMBF_IETF) + { + lconn = stream->conn_pub->lconn; + lconn->cn_if->ci_abort_error(lconn, 0, TEC_FLOW_CONTROL_ERROR, + "flow control violation on stream %"PRIu64, stream->id); + } return -1; } if (lsquic_sfcw_fc_offsets_changed(&stream->fc)) { - if (!(stream->stream_flags & STREAM_SENDING_FLAGS)) + if (!(stream->sm_qflags & SMQF_SENDING_FLAGS)) TAILQ_INSERT_TAIL(&stream->conn_pub->sending_streams, stream, next_send_stream); - stream->stream_flags |= STREAM_SEND_WUF; + stream->sm_qflags |= SMQF_SEND_WUF; } return 0; } @@ -508,11 +852,11 @@ lsquic_stream_frame_in (lsquic_stream_t *stream, stream_frame_t *frame) assert(frame->packet_in); SM_HISTORY_APPEND(stream, SHE_FRAME_IN); - LSQ_DEBUG("received stream frame, stream %u, offset 0x%"PRIX64", len %u; " - "fin: %d", stream->id, frame->data_frame.df_offset, frame->data_frame.df_size, !!frame->data_frame.df_fin); + LSQ_DEBUG("received stream frame, offset 0x%"PRIX64", len %u; " + "fin: %d", frame->data_frame.df_offset, frame->data_frame.df_size, !!frame->data_frame.df_fin); - if ((stream->stream_flags & (STREAM_USE_HEADERS|STREAM_HEAD_IN_FIN)) == - (STREAM_USE_HEADERS|STREAM_HEAD_IN_FIN)) + if ((stream->sm_bflags & SMBF_USE_HEADERS) + && (stream->stream_flags & STREAM_HEAD_IN_FIN)) { lsquic_packet_in_put(stream->conn_pub->mm, frame->packet_in); lsquic_malo_put(frame); @@ -534,9 +878,10 @@ lsquic_stream_frame_in (lsquic_stream_t *stream, stream_frame_t *frame) { SM_HISTORY_APPEND(stream, SHE_FIN_IN); stream->stream_flags |= STREAM_FIN_RECVD; + stream->sm_fin_off = DF_END(frame); maybe_finish_stream(stream); } - if ((stream->stream_flags & STREAM_AUTOSWITCH) && + if ((stream->sm_bflags & SMBF_AUTOSWITCH) && (stream->data_in->di_flags & DI_SWITCH_IMPL)) { stream->data_in = stream->data_in->di_if->di_switch_impl( @@ -606,7 +951,7 @@ maybe_elide_stream_frames (struct lsquic_stream *stream) int lsquic_stream_rst_in (lsquic_stream_t *stream, uint64_t offset, - uint32_t error_code) + uint64_t error_code) { if (stream->stream_flags & STREAM_RST_RECVD) @@ -623,17 +968,17 @@ lsquic_stream_rst_in (lsquic_stream_t *stream, uint64_t offset, if (lsquic_sfcw_get_max_recv_off(&stream->fc) > offset) { - LSQ_INFO("stream %u: RST_STREAM invalid: its offset 0x%"PRIX64" is " + LSQ_INFO("RST_STREAM invalid: its offset 0x%"PRIX64" is " "smaller than that of byte following the last byte we have seen: " - "0x%"PRIX64, stream->id, offset, + "0x%"PRIX64, offset, lsquic_sfcw_get_max_recv_off(&stream->fc)); return -1; } if (!lsquic_sfcw_set_max_recv_off(&stream->fc, offset)) { - LSQ_INFO("stream %u: RST_STREAM invalid: its offset 0x%"PRIX64 - " violates flow control", stream->id, offset); + LSQ_INFO("RST_STREAM invalid: its offset 0x%"PRIX64 + " violates flow control", offset); return -1; } @@ -645,8 +990,8 @@ lsquic_stream_rst_in (lsquic_stream_t *stream, uint64_t offset, drop_buffered_data(stream); maybe_elide_stream_frames(stream); - if (!(stream->stream_flags & - (STREAM_SEND_RST|STREAM_RST_SENT|STREAM_FIN_SENT))) + if (!(stream->stream_flags & (STREAM_RST_SENT|STREAM_FIN_SENT)) + && !(stream->sm_qflags & SMQF_SEND_RST)) lsquic_stream_reset_ext(stream, 7 /* QUIC_RST_ACKNOWLEDGEMENT */, 0); stream->stream_flags |= STREAM_RST_RECVD; @@ -658,24 +1003,124 @@ lsquic_stream_rst_in (lsquic_stream_t *stream, uint64_t offset, } +void +lsquic_stream_stop_sending_in (struct lsquic_stream *stream, + uint64_t error_code) +{ + if (stream->stream_flags & STREAM_SS_RECVD) + { + LSQ_DEBUG("ignore duplicate STOP_SENDING frame"); + return; + } + + SM_HISTORY_APPEND(stream, SHE_SS_IN); + stream->stream_flags |= STREAM_SS_RECVD; + + /* Let user collect error: */ + maybe_conn_to_tickable_if_readable(stream); + + lsquic_sfcw_consume_rem(&stream->fc); + drop_frames_in(stream); + drop_buffered_data(stream); + maybe_elide_stream_frames(stream); + + if (!(stream->stream_flags & (STREAM_RST_SENT|STREAM_FIN_SENT)) + && !(stream->sm_qflags & SMQF_SEND_RST)) + lsquic_stream_reset_ext(stream, error_code, 0); + + maybe_finish_stream(stream); + maybe_schedule_call_on_close(stream); +} + + +uint64_t +lsquic_stream_fc_recv_off_const (const struct lsquic_stream *stream) +{ + return lsquic_sfcw_get_fc_recv_off(&stream->fc); +} + + +void +lsquic_stream_max_stream_data_sent (struct lsquic_stream *stream) +{ + assert(stream->sm_qflags & SMQF_SEND_MAX_STREAM_DATA); + stream->sm_qflags &= ~SMQF_SEND_MAX_STREAM_DATA; + if (!(stream->sm_qflags & SMQF_SENDING_FLAGS)) + TAILQ_REMOVE(&stream->conn_pub->sending_streams, stream, next_send_stream); + stream->sm_last_recv_off = lsquic_sfcw_get_fc_recv_off(&stream->fc); +} + + uint64_t lsquic_stream_fc_recv_off (lsquic_stream_t *stream) { - assert(stream->stream_flags & STREAM_SEND_WUF); - stream->stream_flags &= ~STREAM_SEND_WUF; - if (!(stream->stream_flags & STREAM_SENDING_FLAGS)) + assert(stream->sm_qflags & SMQF_SEND_WUF); + stream->sm_qflags &= ~SMQF_SEND_WUF; + if (!(stream->sm_qflags & SMQF_SENDING_FLAGS)) TAILQ_REMOVE(&stream->conn_pub->sending_streams, stream, next_send_stream); - return lsquic_sfcw_get_fc_recv_off(&stream->fc); + return stream->sm_last_recv_off = lsquic_sfcw_get_fc_recv_off(&stream->fc); +} + + +void +lsquic_stream_peer_blocked (struct lsquic_stream *stream, uint64_t peer_off) +{ + uint64_t last_off; + + if (stream->sm_last_recv_off) + last_off = stream->sm_last_recv_off; + else + /* This gets advertized in transport parameters */ + last_off = lsquic_sfcw_get_max_recv_off(&stream->fc); + + LSQ_DEBUG("Peer blocked at %"PRIu64", while the last MAX_STREAM_DATA " + "frame we sent advertized the limit of %"PRIu64, peer_off, last_off); + + if (peer_off > last_off && !(stream->sm_qflags & SMQF_SEND_WUF)) + { + if (!(stream->sm_qflags & SMQF_SENDING_FLAGS)) + TAILQ_INSERT_TAIL(&stream->conn_pub->sending_streams, stream, + next_send_stream); + stream->sm_qflags |= SMQF_SEND_WUF; + LSQ_DEBUG("marked to send MAX_STREAM_DATA frame"); + } + else if (stream->sm_qflags & SMQF_SEND_WUF) + LSQ_DEBUG("MAX_STREAM_DATA frame is already scheduled"); + else if (stream->sm_last_recv_off) + LSQ_DEBUG("MAX_STREAM_DATA(%"PRIu64") has already been either " + "packetized or sent", stream->sm_last_recv_off); + else + LSQ_INFO("Peer should have receive transport param limit " + "of %"PRIu64"; odd.", last_off); +} + + +/* GQUIC's BLOCKED frame does not have an offset */ +void +lsquic_stream_peer_blocked_gquic (struct lsquic_stream *stream) +{ + LSQ_DEBUG("Peer blocked: schedule another WINDOW_UPDATE frame"); + if (!(stream->sm_qflags & SMQF_SEND_WUF)) + { + if (!(stream->sm_qflags & SMQF_SENDING_FLAGS)) + TAILQ_INSERT_TAIL(&stream->conn_pub->sending_streams, stream, + next_send_stream); + stream->sm_qflags |= SMQF_SEND_WUF; + LSQ_DEBUG("marked to send MAX_STREAM_DATA frame"); + } + else + LSQ_DEBUG("WINDOW_UPDATE frame is already scheduled"); } void lsquic_stream_blocked_frame_sent (lsquic_stream_t *stream) { - assert(stream->stream_flags & STREAM_SEND_BLOCKED); + assert(stream->sm_qflags & SMQF_SEND_BLOCKED); SM_HISTORY_APPEND(stream, SHE_BLOCKED_OUT); - stream->stream_flags &= ~STREAM_SEND_BLOCKED; - if (!(stream->stream_flags & STREAM_SENDING_FLAGS)) + stream->sm_qflags &= ~SMQF_SEND_BLOCKED; + stream->stream_flags |= STREAM_BLOCKED_SENT; + if (!(stream->sm_qflags & SMQF_SENDING_FLAGS)) TAILQ_REMOVE(&stream->conn_pub->sending_streams, stream, next_send_stream); } @@ -683,10 +1128,10 @@ lsquic_stream_blocked_frame_sent (lsquic_stream_t *stream) void lsquic_stream_rst_frame_sent (lsquic_stream_t *stream) { - assert(stream->stream_flags & STREAM_SEND_RST); + assert(stream->sm_qflags & SMQF_SEND_RST); SM_HISTORY_APPEND(stream, SHE_RST_OUT); - stream->stream_flags &= ~STREAM_SEND_RST; - if (!(stream->stream_flags & STREAM_SENDING_FLAGS)) + stream->sm_qflags &= ~SMQF_SEND_RST; + if (!(stream->sm_qflags & SMQF_SENDING_FLAGS)) TAILQ_REMOVE(&stream->conn_pub->sending_streams, stream, next_send_stream); stream->stream_flags |= STREAM_RST_SENT; maybe_finish_stream(stream); @@ -694,17 +1139,19 @@ lsquic_stream_rst_frame_sent (lsquic_stream_t *stream) static size_t -read_uh (lsquic_stream_t *stream, unsigned char *dst, size_t len) -{ - struct http1x_headers *h1h = stream->uh->uh_hset; - size_t n_avail = h1h->h1h_size - h1h->h1h_off; - if (n_avail < len) - len = n_avail; - memcpy(dst, h1h->h1h_buf + h1h->h1h_off, len); - h1h->h1h_off += len; +read_uh (struct lsquic_stream *stream, + size_t (*readf)(void *, const unsigned char *, size_t, int), void *ctx) +{ + struct http1x_headers *const h1h = stream->uh->uh_hset; + size_t nread; + + nread = readf(ctx, (unsigned char *) h1h->h1h_buf + h1h->h1h_off, + h1h->h1h_size - h1h->h1h_off, + (stream->stream_flags & STREAM_HEAD_IN_FIN) > 0); + h1h->h1h_off += nread; if (h1h->h1h_off == h1h->h1h_size) { - LSQ_DEBUG("read all uncompressed headers for stream %u", stream->id); + LSQ_DEBUG("read all uncompressed headers"); destroy_uh(stream); if (stream->stream_flags & STREAM_HEAD_IN_FIN) { @@ -712,139 +1159,178 @@ read_uh (lsquic_stream_t *stream, unsigned char *dst, size_t len) SM_HISTORY_APPEND(stream, SHE_REACH_FIN); } } - return len; + return nread; } -/* This function returns 0 when EOF is reached. - */ -ssize_t -lsquic_stream_readv (lsquic_stream_t *stream, const struct iovec *iov, - int iovcnt) +static void +stream_consumed_bytes (struct lsquic_stream *stream) { - size_t total_nread, nread; - int processed_frames, read_unc_headers, iovidx; - unsigned char *p, *end; + lsquic_sfcw_set_read_off(&stream->fc, stream->read_offset); + if (lsquic_sfcw_fc_offsets_changed(&stream->fc)) + { + if (!(stream->sm_qflags & SMQF_SENDING_FLAGS)) + TAILQ_INSERT_TAIL(&stream->conn_pub->sending_streams, stream, + next_send_stream); + stream->sm_qflags |= SMQF_SEND_WUF; + maybe_conn_to_tickable_if_writeable(stream, 1); + } +} - SM_HISTORY_APPEND(stream, SHE_USER_READ); -#define NEXT_IOV() do { \ - ++iovidx; \ - while (iovidx < iovcnt && 0 == iov[iovidx].iov_len) \ - ++iovidx; \ - if (iovidx < iovcnt) \ - { \ - p = iov[iovidx].iov_base; \ - end = p + iov[iovidx].iov_len; \ - } \ - else \ - p = end = NULL; \ -} while (0) +struct read_frames_status +{ + int error; + int processed_frames; + size_t total_nread; +}; -#define AVAIL() (end - p) - if (stream->stream_flags & STREAM_RST_FLAGS) - { - errno = ECONNRESET; - return -1; - } - if (stream->stream_flags & STREAM_U_READ_DONE) - { - errno = EBADF; - return -1; - } - if (stream->stream_flags & STREAM_FIN_REACHED) - return 0; +static struct read_frames_status +read_data_frames (struct lsquic_stream *stream, int do_filtering, + size_t (*readf)(void *, const unsigned char *, size_t, int), void *ctx) +{ + struct data_frame *data_frame; + size_t nread, toread, total_nread; + int short_read, processed_frames; - total_nread = 0; processed_frames = 0; + total_nread = 0; - iovidx = -1; - NEXT_IOV(); - - if (stream->uh) + while ((data_frame = stream->data_in->di_if->di_get_frame( + stream->data_in, stream->read_offset))) { - if (stream->uh->uh_flags & UH_H1H) + + ++processed_frames; + + do { - if (AVAIL()) + if (do_filtering && stream->sm_sfi) + toread = stream->sm_sfi->sfi_filter_df(stream, data_frame); + else + toread = data_frame->df_size - data_frame->df_read_off; + + if (toread || data_frame->df_fin) { - read_unc_headers = 1; - do + nread = readf(ctx, data_frame->df_data + data_frame->df_read_off, + toread, data_frame->df_fin); + if (do_filtering && stream->sm_sfi) + stream->sm_sfi->sfi_decr_left(stream, nread); + data_frame->df_read_off += nread; + stream->read_offset += nread; + total_nread += nread; + short_read = nread < toread; + } + else + short_read = 0; + + if (data_frame->df_read_off == data_frame->df_size) + { + const int fin = data_frame->df_fin; + stream->data_in->di_if->di_frame_done(stream->data_in, data_frame); + data_frame = NULL; + if ((stream->sm_bflags & SMBF_AUTOSWITCH) && + (stream->data_in->di_flags & DI_SWITCH_IMPL)) { - nread = read_uh(stream, p, AVAIL()); - p += nread; - total_nread += nread; - if (p == end) - NEXT_IOV(); + stream->data_in = stream->data_in->di_if->di_switch_impl( + stream->data_in, stream->read_offset); + if (!stream->data_in) + { + stream->data_in = data_in_error_new(); + return (struct read_frames_status) { .error = 1, }; + } + } + if (fin) + { + stream->stream_flags |= STREAM_FIN_REACHED; + goto end_while; } - while (stream->uh && AVAIL()); } - else - read_unc_headers = 0; - } - else - { - LSQ_INFO("header set not claimed: cannot read from stream"); - return -1; + else if (short_read) + goto end_while; } + while (data_frame); } - else - read_unc_headers = 0; + end_while: - struct data_frame *data_frame; - while (AVAIL() && (data_frame = stream->data_in->di_if->di_get_frame(stream->data_in, stream->read_offset))) + if (processed_frames) + stream_consumed_bytes(stream); + + return (struct read_frames_status) { + .error = 0, + .processed_frames = processed_frames, + .total_nread = total_nread, + }; +} + + +static ssize_t +stream_readf (struct lsquic_stream *stream, + size_t (*readf)(void *, const unsigned char *, size_t, int), void *ctx) +{ + size_t total_nread, nread; + int read_unc_headers; + + total_nread = 0; + + if ((stream->sm_bflags & (SMBF_USE_HEADERS|SMBF_IETF)) + == (SMBF_USE_HEADERS|SMBF_IETF) + && !(stream->stream_flags & STREAM_HAVE_UH) + && !stream->uh) { - ++processed_frames; - size_t navail = data_frame->df_size - data_frame->df_read_off; - size_t ntowrite = AVAIL(); - if (navail < ntowrite) - ntowrite = navail; - memcpy(p, data_frame->df_data + data_frame->df_read_off, ntowrite); - p += ntowrite; - data_frame->df_read_off += ntowrite; - stream->read_offset += ntowrite; - total_nread += ntowrite; - if (data_frame->df_read_off == data_frame->df_size) + if (stream->sm_readable(stream)) { - const int fin = data_frame->df_fin; - stream->data_in->di_if->di_frame_done(stream->data_in, data_frame); - if ((stream->stream_flags & STREAM_AUTOSWITCH) && - (stream->data_in->di_flags & DI_SWITCH_IMPL)) - { - stream->data_in = stream->data_in->di_if->di_switch_impl( - stream->data_in, stream->read_offset); - if (!stream->data_in) - { - stream->data_in = data_in_error_new(); - return -1; - } - } - if (fin) + if (stream->sm_hq_filter.hqfi_flags & HQFI_FLAG_ERROR) { - stream->stream_flags |= STREAM_FIN_REACHED; - break; + LSQ_INFO("HQ filter hit an error: cannot read from stream"); + errno = EBADMSG; + return -1; } + assert(stream->uh); + } + else + { + errno = EWOULDBLOCK; + return -1; } - if (p == end) - NEXT_IOV(); } - LSQ_DEBUG("%s: read %zd bytes, read offset %"PRIu64, __func__, - total_nread, stream->read_offset); - - if (processed_frames) + if (stream->uh) { - lsquic_sfcw_set_read_off(&stream->fc, stream->read_offset); - if (lsquic_sfcw_fc_offsets_changed(&stream->fc)) + if (stream->uh->uh_flags & UH_H1H) { - if (!(stream->stream_flags & STREAM_SENDING_FLAGS)) - TAILQ_INSERT_TAIL(&stream->conn_pub->sending_streams, stream, next_send_stream); - stream->stream_flags |= STREAM_SEND_WUF; - maybe_conn_to_tickable_if_writeable(stream, 1); + nread = read_uh(stream, readf, ctx); + read_unc_headers = nread > 0; + total_nread += nread; + if (stream->uh) + return total_nread; + } + else + { + LSQ_INFO("header set not claimed: cannot read from stream"); + return -1; } } + else if ((stream->sm_bflags & SMBF_USE_HEADERS) + && !(stream->stream_flags & STREAM_HAVE_UH)) + { + LSQ_DEBUG("cannot read: headers not available"); + errno = EWOULDBLOCK; + return -1; + } + else + read_unc_headers = 0; - if (processed_frames || read_unc_headers) + const struct read_frames_status rfs + = read_data_frames(stream, 1, readf, ctx); + if (rfs.error) + return -1; + total_nread += rfs.total_nread; + + LSQ_DEBUG("%s: read %zd bytes, read offset %"PRIu64, __func__, + total_nread, stream->read_offset); + + if (rfs.processed_frames || read_unc_headers) { return total_nread; } @@ -857,6 +1343,84 @@ lsquic_stream_readv (lsquic_stream_t *stream, const struct iovec *iov, } +/* This function returns 0 when EOF is reached. + */ +ssize_t +lsquic_stream_readf (struct lsquic_stream *stream, + size_t (*readf)(void *, const unsigned char *, size_t, int), void *ctx) +{ + SM_HISTORY_APPEND(stream, SHE_USER_READ); + + if (lsquic_stream_is_reset(stream)) + { + if (stream->stream_flags & STREAM_RST_RECVD) + stream->stream_flags |= STREAM_RST_READ; + errno = ECONNRESET; + return -1; + } + if (stream->stream_flags & STREAM_U_READ_DONE) + { + errno = EBADF; + return -1; + } + if ((stream->stream_flags & STREAM_FIN_REACHED) + && 0 == (!!(stream->stream_flags & STREAM_HAVE_UH) + ^ !!(stream->sm_bflags & SMBF_USE_HEADERS))) + return 0; + + return stream_readf(stream, readf, ctx); +} + + +struct readv_ctx +{ + const struct iovec *iov; + const struct iovec *const end; + unsigned char *p; +}; + + +static size_t +readv_f (void *ctx_p, const unsigned char *buf, size_t len, int fin) +{ + struct readv_ctx *const ctx = ctx_p; + const unsigned char *const end = buf + len; + size_t ntocopy; + + while (ctx->iov < ctx->end && buf < end) + { + ntocopy = (unsigned char *) ctx->iov->iov_base + ctx->iov->iov_len + - ctx->p; + if (ntocopy > (size_t) (end - buf)) + ntocopy = end - buf; + memcpy(ctx->p, buf, ntocopy); + ctx->p += ntocopy; + buf += ntocopy; + if (ctx->p == (unsigned char *) ctx->iov->iov_base + ctx->iov->iov_len) + { + do + ++ctx->iov; + while (ctx->iov < ctx->end && ctx->iov->iov_len == 0); + if (ctx->iov < ctx->end) + ctx->p = ctx->iov->iov_base; + else + ctx->p = NULL; + } + } + + return len - (end - buf); +} + + +ssize_t +lsquic_stream_readv (struct lsquic_stream *stream, const struct iovec *iov, + int iovcnt) +{ + struct readv_ctx ctx = { iov, iov + iovcnt, iov->iov_base, }; + return lsquic_stream_readf(stream, readv_f, &ctx); +} + + ssize_t lsquic_stream_read (lsquic_stream_t *stream, void *buf, size_t len) { @@ -891,8 +1455,9 @@ stream_shutdown_write (lsquic_stream_t *stream) /* Don't bother to check whether there is anything else to write if * the flags indicate that nothing else should be written. */ - if (!(stream->stream_flags & - (STREAM_FIN_SENT|STREAM_SEND_RST|STREAM_RST_SENT))) + if (!(stream->sm_bflags & SMBF_CRYPTO) + && !(stream->stream_flags & (STREAM_FIN_SENT|STREAM_RST_SENT)) + && !(stream->sm_qflags & SMQF_SEND_RST)) { if (stream->sm_n_buffered == 0) { @@ -915,13 +1480,27 @@ stream_shutdown_write (lsquic_stream_t *stream) } +static void +maybe_stream_shutdown_write (struct lsquic_stream *stream) +{ + if (stream->sm_send_headers_state == SSHS_BEGIN) + stream_shutdown_write(stream); + else if (0 == (stream->stream_flags & STREAM_DELAYED_SW)) + { + LSQ_DEBUG("shutdown delayed"); + SM_HISTORY_APPEND(stream, SHE_DELAY_SW); + stream->stream_flags |= STREAM_DELAYED_SW; + } +} + + int lsquic_stream_shutdown (lsquic_stream_t *stream, int how) { - LSQ_DEBUG("shutdown(stream: %u; how: %d)", stream->id, how); + LSQ_DEBUG("shutdown; how: %d", how); if (lsquic_stream_is_closed(stream)) { - LSQ_INFO("Attempt to shut down a closed stream %u", stream->id); + LSQ_INFO("Attempt to shut down a closed stream"); errno = EBADF; return -1; } @@ -934,13 +1513,13 @@ lsquic_stream_shutdown (lsquic_stream_t *stream, int how) } if (how) - stream_shutdown_write(stream); + maybe_stream_shutdown_write(stream); if (how != 1) stream_shutdown_read(stream); maybe_finish_stream(stream); maybe_schedule_call_on_close(stream); - if (how) + if (how && !(stream->stream_flags & STREAM_DELAYED_SW)) maybe_conn_to_tickable_if_writeable(stream, 1); return 0; @@ -950,12 +1529,10 @@ lsquic_stream_shutdown (lsquic_stream_t *stream, int how) void lsquic_stream_shutdown_internal (lsquic_stream_t *stream) { - LSQ_DEBUG("internal shutdown of stream %u", stream->id); - if (LSQUIC_STREAM_HANDSHAKE == stream->id - || ((stream->stream_flags & STREAM_USE_HEADERS) && - LSQUIC_STREAM_HEADERS == stream->id)) + LSQ_DEBUG("internal shutdown"); + if (lsquic_stream_is_critical(stream)) { - LSQ_DEBUG("add flag to force-finish special stream %u", stream->id); + LSQ_DEBUG("add flag to force-finish special stream"); stream->stream_flags |= STREAM_FORCE_FINISH; SM_HISTORY_APPEND(stream, SHE_FORCE_FINISH); } @@ -973,13 +1550,13 @@ fake_reset_unused_stream (lsquic_stream_t *stream) ; /* Cancel all writes to the network scheduled for this stream: */ - if (stream->stream_flags & STREAM_SENDING_FLAGS) + if (stream->sm_qflags & SMQF_SENDING_FLAGS) TAILQ_REMOVE(&stream->conn_pub->sending_streams, stream, next_send_stream); - stream->stream_flags &= ~STREAM_SENDING_FLAGS; + stream->sm_qflags &= ~SMQF_SENDING_FLAGS; - LSQ_DEBUG("fake-reset stream %u%s", - stream->id, stream_stalled(stream) ? " (stalled)" : ""); + LSQ_DEBUG("fake-reset stream%s", + stream_stalled(stream) ? " (stalled)" : ""); maybe_finish_stream(stream); maybe_schedule_call_on_close(stream); } @@ -1022,7 +1599,7 @@ lsquic_stream_read_offset (const lsquic_stream_t *stream) static int stream_wantread (lsquic_stream_t *stream, int is_want) { - const int old_val = !!(stream->stream_flags & STREAM_WANT_READ); + const int old_val = !!(stream->sm_qflags & SMQF_WANT_READ); const int new_val = !!is_want; if (old_val != new_val) { @@ -1031,11 +1608,11 @@ stream_wantread (lsquic_stream_t *stream, int is_want) if (!old_val) TAILQ_INSERT_TAIL(&stream->conn_pub->read_streams, stream, next_read_stream); - stream->stream_flags |= STREAM_WANT_READ; + stream->sm_qflags |= SMQF_WANT_READ; } else { - stream->stream_flags &= ~STREAM_WANT_READ; + stream->sm_qflags &= ~SMQF_WANT_READ; if (old_val) TAILQ_REMOVE(&stream->conn_pub->read_streams, stream, next_read_stream); @@ -1046,24 +1623,24 @@ stream_wantread (lsquic_stream_t *stream, int is_want) static void -maybe_put_onto_write_q (lsquic_stream_t *stream, enum stream_flags flag) +maybe_put_onto_write_q (lsquic_stream_t *stream, enum stream_q_flags flag) { - assert(STREAM_WRITE_Q_FLAGS & flag); - if (!(stream->stream_flags & STREAM_WRITE_Q_FLAGS)) + assert(SMQF_WRITE_Q_FLAGS & flag); + if (!(stream->sm_qflags & SMQF_WRITE_Q_FLAGS)) TAILQ_INSERT_TAIL(&stream->conn_pub->write_streams, stream, next_write_stream); - stream->stream_flags |= flag; + stream->sm_qflags |= flag; } static void -maybe_remove_from_write_q (lsquic_stream_t *stream, enum stream_flags flag) +maybe_remove_from_write_q (lsquic_stream_t *stream, enum stream_q_flags flag) { - assert(STREAM_WRITE_Q_FLAGS & flag); - if (stream->stream_flags & flag) + assert(SMQF_WRITE_Q_FLAGS & flag); + if (stream->sm_qflags & flag) { - stream->stream_flags &= ~flag; - if (!(stream->stream_flags & STREAM_WRITE_Q_FLAGS)) + stream->sm_qflags &= ~flag; + if (!(stream->sm_qflags & SMQF_WRITE_Q_FLAGS)) TAILQ_REMOVE(&stream->conn_pub->write_streams, stream, next_write_stream); } @@ -1071,16 +1648,18 @@ maybe_remove_from_write_q (lsquic_stream_t *stream, enum stream_flags flag) static int -stream_wantwrite (lsquic_stream_t *stream, int is_want) +stream_wantwrite (struct lsquic_stream *stream, int new_val) { - const int old_val = !!(stream->stream_flags & STREAM_WANT_WRITE); - const int new_val = !!is_want; + const int old_val = !!(stream->sm_qflags & SMQF_WANT_WRITE); + + assert(0 == (new_val & ~1)); /* new_val is either 0 or 1 */ + if (old_val != new_val) { if (new_val) - maybe_put_onto_write_q(stream, STREAM_WANT_WRITE); + maybe_put_onto_write_q(stream, SMQF_WANT_WRITE); else - maybe_remove_from_write_q(stream, STREAM_WANT_WRITE); + maybe_remove_from_write_q(stream, SMQF_WANT_WRITE); } return old_val; } @@ -1106,12 +1685,24 @@ lsquic_stream_wantread (lsquic_stream_t *stream, int is_want) int lsquic_stream_wantwrite (lsquic_stream_t *stream, int is_want) { - if (0 == (stream->stream_flags & STREAM_U_WRITE_DONE)) + int old_val; + + is_want = !!is_want; + + if (0 == (stream->stream_flags & STREAM_U_WRITE_DONE) + && SSHS_BEGIN == stream->sm_send_headers_state) { + stream->sm_saved_want_write = is_want; if (is_want) maybe_conn_to_tickable_if_writeable(stream, 1); return stream_wantwrite(stream, is_want); } + else if (SSHS_BEGIN != stream->sm_send_headers_state) + { + old_val = stream->sm_saved_want_write; + stream->sm_saved_want_write = is_want; + return old_val; + } else { errno = EBADF; @@ -1120,30 +1711,52 @@ lsquic_stream_wantwrite (lsquic_stream_t *stream, int is_want) } -#define USER_PROGRESS_FLAGS (STREAM_WANT_READ|STREAM_WANT_WRITE| \ - STREAM_WANT_FLUSH|STREAM_U_WRITE_DONE|STREAM_U_READ_DONE|STREAM_SEND_RST) +struct progress +{ + enum stream_flags s_flags; + enum stream_q_flags q_flags; +}; + + +static struct progress +stream_progress (const struct lsquic_stream *stream) +{ + return (struct progress) { + .s_flags = stream->stream_flags + & (STREAM_U_WRITE_DONE|STREAM_U_READ_DONE), + .q_flags = stream->sm_qflags + & (SMQF_WANT_READ|SMQF_WANT_WRITE|SMQF_WANT_FLUSH|SMQF_SEND_RST), + }; +} + + +static int +progress_eq (struct progress a, struct progress b) +{ + return a.s_flags == b.s_flags && a.q_flags == b.q_flags; +} static void stream_dispatch_read_events_loop (lsquic_stream_t *stream) { unsigned no_progress_count, no_progress_limit; - enum stream_flags flags; + struct progress progress; uint64_t size; no_progress_limit = stream->conn_pub->enpub->enp_settings.es_progress_check; no_progress_count = 0; - while ((stream->stream_flags & STREAM_WANT_READ) + while ((stream->sm_qflags & SMQF_WANT_READ) && lsquic_stream_readable(stream)) { - flags = stream->stream_flags & USER_PROGRESS_FLAGS; + progress = stream_progress(stream); size = stream->read_offset; stream->stream_if->on_read(stream, stream->st_ctx); if (no_progress_limit && size == stream->read_offset && - flags == (stream->stream_flags & USER_PROGRESS_FLAGS)) + progress_eq(progress, stream_progress(stream))) { ++no_progress_count; if (no_progress_count >= no_progress_limit) @@ -1161,26 +1774,111 @@ stream_dispatch_read_events_loop (lsquic_stream_t *stream) } +static void +stream_hblock_sent (struct lsquic_stream *stream) +{ + int want_write; + + LSQ_DEBUG("header block has been sent: restore default behavior"); + stream->sm_send_headers_state = SSHS_BEGIN; + stream->sm_write_avail = stream_write_avail; + + want_write = !!(stream->sm_qflags & SMQF_WANT_WRITE); + if (want_write != stream->sm_saved_want_write) + (void) lsquic_stream_wantwrite(stream, stream->sm_saved_want_write); + + if (stream->stream_flags & STREAM_DELAYED_SW) + { + LSQ_DEBUG("performing delayed shutdown write"); + stream->stream_flags &= ~STREAM_DELAYED_SW; + stream_shutdown_write(stream); + maybe_schedule_call_on_close(stream); + maybe_finish_stream(stream); + maybe_conn_to_tickable_if_writeable(stream, 1); + } +} + + +static void +on_write_header_wrapper (struct lsquic_stream *stream, lsquic_stream_ctx_t *h) +{ + ssize_t nw; + + nw = stream_write_buf(stream, + stream->sm_header_block + stream->sm_hblock_off, + stream->sm_hblock_sz - stream->sm_hblock_off); + if (nw > 0) + { + stream->sm_hblock_off += nw; + if (stream->sm_hblock_off == stream->sm_hblock_sz) + { + stream->stream_flags |= STREAM_HEADERS_SENT; + free(stream->sm_header_block); + stream->sm_header_block = NULL; + stream->sm_hblock_sz = 0; + stream_hblock_sent(stream); + LSQ_DEBUG("header block written out successfully"); + /* TODO: if there was eos, do something else */ + if (stream->sm_qflags & SMQF_WANT_WRITE) + stream->stream_if->on_write(stream, h); + } + else + { + LSQ_DEBUG("wrote %zd bytes more of header block; not done yet", + nw); + } + } + else if (nw < 0) + { + /* XXX What should happen if we hit an error? TODO */ + } +} + + +static void +(*select_on_write (struct lsquic_stream *stream))(struct lsquic_stream *, + lsquic_stream_ctx_t *) +{ + if (0 == (stream->stream_flags & STREAM_PUSHING) + && SSHS_HBLOCK_SENDING != stream->sm_send_headers_state) + /* Common case */ + return stream->stream_if->on_write; + else if (SSHS_HBLOCK_SENDING == stream->sm_send_headers_state) + return on_write_header_wrapper; + else + { + assert(stream->stream_flags & STREAM_PUSHING); + if (stream_is_pushing_promise(stream)) + return on_write_pp_wrapper; + else if (stream->sm_dup_push_off < stream->sm_dup_push_len) + return on_write_dp_wrapper; + else + return stream->stream_if->on_write; + } +} + + static void stream_dispatch_write_events_loop (lsquic_stream_t *stream) { unsigned no_progress_count, no_progress_limit; - enum stream_flags flags; + void (*on_write) (struct lsquic_stream *, lsquic_stream_ctx_t *); + struct progress progress; no_progress_limit = stream->conn_pub->enpub->enp_settings.es_progress_check; no_progress_count = 0; stream->stream_flags |= STREAM_LAST_WRITE_OK; - while ((stream->stream_flags & (STREAM_WANT_WRITE|STREAM_LAST_WRITE_OK)) - == (STREAM_WANT_WRITE|STREAM_LAST_WRITE_OK) - && lsquic_stream_write_avail(stream)) + while ((stream->sm_qflags & SMQF_WANT_WRITE) + && (stream->stream_flags & STREAM_LAST_WRITE_OK) + && lsquic_stream_write_avail(stream)) { - flags = stream->stream_flags & USER_PROGRESS_FLAGS; + progress = stream_progress(stream); - stream->stream_if->on_write(stream, stream->st_ctx); + on_write = select_on_write(stream); + on_write(stream, stream->st_ctx); - if (no_progress_limit && - flags == (stream->stream_flags & USER_PROGRESS_FLAGS)) + if (no_progress_limit && progress_eq(progress, stream_progress(stream))) { ++no_progress_count; if (no_progress_count >= no_progress_limit) @@ -1201,27 +1899,39 @@ stream_dispatch_write_events_loop (lsquic_stream_t *stream) static void stream_dispatch_read_events_once (lsquic_stream_t *stream) { - if ((stream->stream_flags & STREAM_WANT_READ) && lsquic_stream_readable(stream)) + if ((stream->sm_qflags & SMQF_WANT_READ) && lsquic_stream_readable(stream)) { stream->stream_if->on_read(stream, stream->st_ctx); } } +uint64_t +lsquic_stream_combined_send_off (const struct lsquic_stream *stream) +{ + size_t frames_sizes; + + frames_sizes = active_hq_frame_sizes(stream); + return stream->tosend_off + stream->sm_n_buffered + frames_sizes; +} + + static void maybe_mark_as_blocked (lsquic_stream_t *stream) { struct lsquic_conn_cap *cc; + uint64_t used; - if (stream->max_send_off == stream->tosend_off + stream->sm_n_buffered) + used = lsquic_stream_combined_send_off(stream); + if (stream->max_send_off == used) { if (stream->blocked_off < stream->max_send_off) { - stream->blocked_off = stream->max_send_off + stream->sm_n_buffered; - if (!(stream->stream_flags & STREAM_SENDING_FLAGS)) + stream->blocked_off = used; + if (!(stream->sm_qflags & SMQF_SENDING_FLAGS)) TAILQ_INSERT_TAIL(&stream->conn_pub->sending_streams, stream, next_send_stream); - stream->stream_flags |= STREAM_SEND_BLOCKED; + stream->sm_qflags |= SMQF_SEND_BLOCKED; LSQ_DEBUG("marked stream-blocked at stream offset " "%"PRIu64, stream->blocked_off); } @@ -1230,7 +1940,7 @@ maybe_mark_as_blocked (lsquic_stream_t *stream) " has been, or is about to be, sent", stream->blocked_off); } - if ((stream->stream_flags & STREAM_CONN_LIMITED) + if ((stream->sm_bflags & SMBF_CONN_LIMITED) && (cc = &stream->conn_pub->conn_cap, stream->sm_n_buffered == lsquic_conn_cap_avail(cc))) { @@ -1251,9 +1961,9 @@ maybe_mark_as_blocked (lsquic_stream_t *stream) void lsquic_stream_dispatch_read_events (lsquic_stream_t *stream) { - assert(stream->stream_flags & STREAM_WANT_READ); + assert(stream->sm_qflags & SMQF_WANT_READ); - if (stream->stream_flags & STREAM_RW_ONCE) + if (stream->sm_bflags & SMBF_RW_ONCE) stream_dispatch_read_events_once(stream); else stream_dispatch_read_events_loop(stream); @@ -1263,36 +1973,38 @@ lsquic_stream_dispatch_read_events (lsquic_stream_t *stream) void lsquic_stream_dispatch_write_events (lsquic_stream_t *stream) { + void (*on_write) (struct lsquic_stream *, lsquic_stream_ctx_t *); int progress; uint64_t tosend_off; unsigned short n_buffered; - enum stream_flags flags; + enum stream_q_flags q_flags; - assert(stream->stream_flags & STREAM_WRITE_Q_FLAGS); - flags = stream->stream_flags & STREAM_WRITE_Q_FLAGS; + assert(stream->sm_qflags & SMQF_WRITE_Q_FLAGS); + q_flags = stream->sm_qflags & SMQF_WRITE_Q_FLAGS; tosend_off = stream->tosend_off; n_buffered = stream->sm_n_buffered; - if (stream->stream_flags & STREAM_WANT_FLUSH) + if (stream->sm_qflags & SMQF_WANT_FLUSH) (void) stream_flush(stream); - if (stream->stream_flags & STREAM_RW_ONCE) + if (stream->sm_bflags & SMBF_RW_ONCE) { - if ((stream->stream_flags & STREAM_WANT_WRITE) + if ((stream->sm_qflags & SMQF_WANT_WRITE) && lsquic_stream_write_avail(stream)) { - stream->stream_if->on_write(stream, stream->st_ctx); + on_write = select_on_write(stream); + on_write(stream, stream->st_ctx); } } else stream_dispatch_write_events_loop(stream); /* Progress means either flags or offsets changed: */ - progress = !((stream->stream_flags & STREAM_WRITE_Q_FLAGS) == flags && + progress = !((stream->sm_qflags & SMQF_WRITE_Q_FLAGS) == q_flags && stream->tosend_off == tosend_off && stream->sm_n_buffered == n_buffered); - if (stream->stream_flags & STREAM_WRITE_Q_FLAGS) + if (stream->sm_qflags & SMQF_WRITE_Q_FLAGS) { if (progress) { /* Move the stream to the end of the list to ensure fairness. */ @@ -1325,7 +2037,7 @@ stream_flush (lsquic_stream_t *stream) struct lsquic_reader empty_reader; ssize_t nw; - assert(stream->stream_flags & STREAM_WANT_FLUSH); + assert(stream->sm_qflags & SMQF_WANT_FLUSH); assert(stream->sm_n_buffered > 0 || /* Flushing is also used to packetize standalone FIN: */ ((stream->stream_flags & (STREAM_U_WRITE_DONE|STREAM_FIN_SENT)) @@ -1349,8 +2061,12 @@ stream_flush (lsquic_stream_t *stream) static int stream_flush_nocheck (lsquic_stream_t *stream) { - stream->sm_flush_to = stream->tosend_off + stream->sm_n_buffered; - maybe_put_onto_write_q(stream, STREAM_WANT_FLUSH); + size_t frames; + + frames = active_hq_frame_sizes(stream); + stream->sm_flush_to = stream->tosend_off + stream->sm_n_buffered + frames; + stream->sm_flush_to_payload = stream->sm_payload + stream->sm_n_buffered; + maybe_put_onto_write_q(stream, SMQF_WANT_FLUSH); LSQ_DEBUG("will flush up to offset %"PRIu64, stream->sm_flush_to); return stream_flush(stream); @@ -1377,6 +2093,16 @@ lsquic_stream_flush (lsquic_stream_t *stream) } +static size_t +stream_get_n_allowed (const struct lsquic_stream *stream) +{ + if (stream->sm_n_allocated) + return stream->sm_n_allocated; + else + return stream->conn_pub->path->np_pack_size; +} + + /* The flush threshold is the maximum size of stream data that can be sent * in a full packet. */ @@ -1384,39 +2110,50 @@ lsquic_stream_flush (lsquic_stream_t *stream) static #endif size_t -lsquic_stream_flush_threshold (const struct lsquic_stream *stream) +lsquic_stream_flush_threshold (const struct lsquic_stream *stream, + unsigned data_sz) { enum packet_out_flags flags; enum packno_bits bits; - unsigned packet_header_sz, stream_header_sz; + size_t packet_header_sz, stream_header_sz, tag_len; size_t threshold; bits = lsquic_send_ctl_packno_bits(stream->conn_pub->send_ctl); flags = bits << POBIT_SHIFT; if (!(stream->conn_pub->lconn->cn_flags & LSCONN_TCID0)) flags |= PO_CONN_ID; - if (LSQUIC_STREAM_HANDSHAKE == stream->id) + if (stream_is_hsk(stream)) flags |= PO_LONGHEAD; - packet_header_sz = lsquic_po_header_length(stream->conn_pub->lconn, flags); - stream_header_sz = stream->conn_pub->lconn->cn_pf - ->pf_calc_stream_frame_header_sz(stream->id, stream->tosend_off); + packet_header_sz = lsquic_po_header_length(stream->conn_pub->lconn, flags, + stream->conn_pub->path->np_dcid.len); + stream_header_sz = stream->sm_frame_header_sz(stream, data_sz); + tag_len = stream->conn_pub->lconn->cn_esf_c->esf_tag_len; - threshold = stream->conn_pub->lconn->cn_pack_size - QUIC_PACKET_HASH_SZ + threshold = stream_get_n_allowed(stream) - tag_len - packet_header_sz - stream_header_sz; return threshold; } #define COMMON_WRITE_CHECKS() do { \ - if ((stream->stream_flags & (STREAM_USE_HEADERS|STREAM_HEADERS_SENT)) \ - == STREAM_USE_HEADERS) \ + if ((stream->sm_bflags & SMBF_USE_HEADERS) \ + && !(stream->stream_flags & STREAM_HEADERS_SENT)) \ { \ - LSQ_INFO("Attempt to write to stream before sending HTTP headers"); \ - errno = EILSEQ; \ - return -1; \ + if (SSHS_BEGIN != stream->sm_send_headers_state) \ + { \ + LSQ_DEBUG("still sending headers: no writing allowed"); \ + return 0; \ + } \ + else \ + { \ + LSQ_INFO("Attempt to write to stream before sending HTTP " \ + "headers"); \ + errno = EILSEQ; \ + return -1; \ + } \ } \ - if (stream->stream_flags & STREAM_RST_FLAGS) \ + if (lsquic_stream_is_reset(stream)) \ { \ LSQ_INFO("Attempt to write to stream after it had been reset"); \ errno = ECONNRESET; \ @@ -1441,11 +2178,14 @@ struct frame_gen_ctx * on our count, but it can. */ size_t fgc_nread_from_reader; + size_t (*fgc_size) (void *ctx); + int (*fgc_fin) (void *ctx); + gsf_read_f fgc_read; }; static size_t -frame_gen_size (void *ctx) +frame_std_gen_size (void *ctx) { struct frame_gen_ctx *fg_ctx = ctx; size_t available, remaining; @@ -1460,53 +2200,180 @@ frame_gen_size (void *ctx) } +static size_t +stream_hq_frame_size (const struct stream_hq_frame *shf) +{ + if (0 == (shf->shf_flags & (SHF_FIXED_SIZE|SHF_PHANTOM))) + return 1 + 1 + ((shf->shf_flags & SHF_TWO_BYTES) > 0); + else if ((shf->shf_flags & (SHF_FIXED_SIZE|SHF_PHANTOM)) == SHF_FIXED_SIZE) + return 1 + (1 << vint_val2bits(shf->shf_frame_size)); + else + { + assert((shf->shf_flags & (SHF_FIXED_SIZE|SHF_PHANTOM)) + == (SHF_FIXED_SIZE|SHF_PHANTOM)); + return 0; + } +} + + +static size_t +active_hq_frame_sizes (const struct lsquic_stream *stream) +{ + const struct stream_hq_frame *shf; + size_t size; + + size = 0; + if ((stream->sm_bflags & (SMBF_IETF|SMBF_USE_HEADERS)) + == (SMBF_IETF|SMBF_USE_HEADERS)) + STAILQ_FOREACH(shf, &stream->sm_hq_frames, shf_next) + if (!(shf->shf_flags & SHF_WRITTEN)) + size += stream_hq_frame_size(shf); + + return size; +} + + +static uint64_t +stream_hq_frame_end (const struct stream_hq_frame *shf) +{ + if (shf->shf_flags & SHF_FIXED_SIZE) + return shf->shf_off + shf->shf_frame_size; + else if (shf->shf_flags & SHF_TWO_BYTES) + return shf->shf_off + ((1 << 14) - 1); + else + return shf->shf_off + ((1 << 6) - 1); +} + + static int -frame_gen_fin (void *ctx) +frame_in_stream (const struct lsquic_stream *stream, + const struct stream_hq_frame *shf) { - struct frame_gen_ctx *fg_ctx = ctx; - return fg_ctx->fgc_stream->stream_flags & STREAM_U_WRITE_DONE - && 0 == fg_ctx->fgc_stream->sm_n_buffered - /* Do not use frame_gen_size() as it may chop the real size: */ - && 0 == fg_ctx->fgc_reader->lsqr_size(fg_ctx->fgc_reader->lsqr_ctx); + return shf >= stream->sm_hq_frame_arr + && shf < stream->sm_hq_frame_arr + sizeof(stream->sm_hq_frame_arr) + / sizeof(stream->sm_hq_frame_arr[0]) + ; } static void -incr_conn_cap (struct lsquic_stream *stream, size_t incr) +stream_hq_frame_put (struct lsquic_stream *stream, + struct stream_hq_frame *shf) +{ + assert(STAILQ_FIRST(&stream->sm_hq_frames) == shf); + STAILQ_REMOVE_HEAD(&stream->sm_hq_frames, shf_next); + if (frame_in_stream(stream, shf)) + memset(shf, 0, sizeof(*shf)); + else + lsquic_malo_put(shf); +} + + +static void +stream_hq_frame_close (struct lsquic_stream *stream, + struct stream_hq_frame *shf) { - if (stream->stream_flags & STREAM_CONN_LIMITED) + unsigned bits; + + LSQ_DEBUG("close HQ frame of type 0x%X at payload offset %"PRIu64 + " (actual offset %"PRIu64")", shf->shf_frame_type, + stream->sm_payload, stream->tosend_off); + assert(shf->shf_flags & SHF_ACTIVE); + if (!(shf->shf_flags & SHF_FIXED_SIZE)) { - stream->conn_pub->conn_cap.cc_sent += incr; - assert(stream->conn_pub->conn_cap.cc_sent - <= stream->conn_pub->conn_cap.cc_max); + shf->shf_frame_ptr[0] = shf->shf_frame_type; + bits = (shf->shf_flags & SHF_TWO_BYTES) > 0; + vint_write(shf->shf_frame_ptr + 1, stream->sm_payload - shf->shf_off, + bits, 1 << bits); } + stream_hq_frame_put(stream, shf); } static size_t -frame_gen_read (void *ctx, void *begin_buf, size_t len, int *fin) +frame_hq_gen_size (void *ctx) { struct frame_gen_ctx *fg_ctx = ctx; - unsigned char *p = begin_buf; - unsigned char *const end = p + len; - lsquic_stream_t *const stream = fg_ctx->fgc_stream; - size_t n_written, available, n_to_write; + struct lsquic_stream *const stream = fg_ctx->fgc_stream; + size_t available, remaining, frames; + const struct stream_hq_frame *shf; - if (stream->sm_n_buffered > 0) - { - if (len <= stream->sm_n_buffered) - { - memcpy(p, stream->sm_buf, len); + frames = 0; + STAILQ_FOREACH(shf, &stream->sm_hq_frames, shf_next) + if (shf->shf_off >= stream->sm_payload) + frames += stream_hq_frame_size(shf); + + /* Make sure we are not writing past available size: */ + remaining = fg_ctx->fgc_reader->lsqr_size(fg_ctx->fgc_reader->lsqr_ctx); + available = lsquic_stream_write_avail(stream); + if (available < remaining) + remaining = available; + + return remaining + stream->sm_n_buffered + frames; +} + + +static int +frame_std_gen_fin (void *ctx) +{ + struct frame_gen_ctx *fg_ctx = ctx; + return !(fg_ctx->fgc_stream->sm_bflags & SMBF_CRYPTO) + && (fg_ctx->fgc_stream->stream_flags & STREAM_U_WRITE_DONE) + && 0 == fg_ctx->fgc_stream->sm_n_buffered + /* Do not use frame_std_gen_size() as it may chop the real size: */ + && 0 == fg_ctx->fgc_reader->lsqr_size(fg_ctx->fgc_reader->lsqr_ctx); +} + + +static void +incr_conn_cap (struct lsquic_stream *stream, size_t incr) +{ + if (stream->sm_bflags & SMBF_CONN_LIMITED) + { + stream->conn_pub->conn_cap.cc_sent += incr; + assert(stream->conn_pub->conn_cap.cc_sent + <= stream->conn_pub->conn_cap.cc_max); + } +} + + +void +incr_sm_payload (struct lsquic_stream *stream, size_t incr) +{ + stream->sm_payload += incr; + stream->tosend_off += incr; + assert(stream->tosend_off <= stream->max_send_off); +} + + +static size_t +frame_std_gen_read (void *ctx, void *begin_buf, size_t len, int *fin) +{ + struct frame_gen_ctx *fg_ctx = ctx; + unsigned char *p = begin_buf; + unsigned char *const end = p + len; + lsquic_stream_t *const stream = fg_ctx->fgc_stream; + size_t n_written, available, n_to_write; + + if (stream->sm_n_buffered > 0) + { + if (len <= stream->sm_n_buffered) + { + memcpy(p, stream->sm_buf, len); memmove(stream->sm_buf, stream->sm_buf + len, stream->sm_n_buffered - len); stream->sm_n_buffered -= len; - stream->tosend_off += len; - *fin = frame_gen_fin(fg_ctx); + if (0 == stream->sm_n_buffered) + maybe_resize_stream_buffer(stream); + assert(stream->max_send_off >= stream->tosend_off + stream->sm_n_buffered); + incr_sm_payload(stream, len); + *fin = fg_ctx->fgc_fin(fg_ctx); return len; } memcpy(p, stream->sm_buf, stream->sm_n_buffered); p += stream->sm_n_buffered; stream->sm_n_buffered = 0; + maybe_resize_stream_buffer(stream); } available = lsquic_stream_write_avail(fg_ctx->fgc_stream); @@ -1517,58 +2384,291 @@ frame_gen_read (void *ctx, void *begin_buf, size_t len, int *fin) n_to_write); p += n_written; fg_ctx->fgc_nread_from_reader += n_written; - *fin = frame_gen_fin(fg_ctx); - stream->tosend_off += p - (const unsigned char *) begin_buf; + *fin = fg_ctx->fgc_fin(fg_ctx); + incr_sm_payload(stream, p - (const unsigned char *) begin_buf); incr_conn_cap(stream, n_written); return p - (const unsigned char *) begin_buf; } +static struct stream_hq_frame * +find_hq_frame (const struct lsquic_stream *stream, uint64_t off) +{ + struct stream_hq_frame *shf; + + STAILQ_FOREACH(shf, &stream->sm_hq_frames, shf_next) + if (shf->shf_off <= off && stream_hq_frame_end(shf) > off) + return shf; + + return NULL; +} + + +static struct stream_hq_frame * +find_cur_hq_frame (const struct lsquic_stream *stream) +{ + return find_hq_frame(stream, stream->sm_payload); +} + + +static struct stream_hq_frame * +open_hq_frame (struct lsquic_stream *stream) +{ + struct stream_hq_frame *shf; + + for (shf = stream->sm_hq_frame_arr; shf < stream->sm_hq_frame_arr + + sizeof(stream->sm_hq_frame_arr) + / sizeof(stream->sm_hq_frame_arr[0]); ++shf) + if (!(shf->shf_flags & SHF_ACTIVE)) + goto found; + + shf = lsquic_malo_get(stream->conn_pub->mm->malo.stream_hq_frame); + if (!shf) + { + LSQ_WARN("cannot allocate HQ frame"); + return NULL; + } + memset(shf, 0, sizeof(*shf)); + + found: + STAILQ_INSERT_TAIL(&stream->sm_hq_frames, shf, shf_next); + shf->shf_flags = SHF_ACTIVE; + return shf; +} + + +/* Returns index of the new frame */ +static struct stream_hq_frame * +stream_activate_hq_frame (struct lsquic_stream *stream, uint64_t off, + enum hq_frame_type frame_type, enum shf_flags flags, size_t size) +{ + struct stream_hq_frame *shf; + + shf = open_hq_frame(stream); + if (!shf) + { + LSQ_WARN("could not open HQ frame"); + return NULL; + } + + shf->shf_off = off; + shf->shf_flags |= flags; + shf->shf_frame_type = frame_type; + if (shf->shf_flags & SHF_FIXED_SIZE) + shf->shf_frame_size = size; + else + { + shf->shf_frame_ptr = NULL; + if (size >= (1 << 6)) + shf->shf_flags |= SHF_TWO_BYTES; + } + + return shf; +} + + +static size_t +frame_hq_gen_read (void *ctx, void *begin_buf, size_t len, int *fin) +{ + struct frame_gen_ctx *fg_ctx = ctx; + unsigned char *p = begin_buf; + unsigned char *const end = p + len; + struct lsquic_stream *const stream = fg_ctx->fgc_stream; + struct stream_hq_frame *shf; + size_t nw, frame_sz, avail, rem; + unsigned bits; + + while (p < end) + { + shf = find_cur_hq_frame(stream); + if (!shf) + { + rem = frame_std_gen_size(ctx); + if (rem) + { + if (rem > ((1 << 14) - 1)) + rem = (1 << 14) - 1; + shf = stream_activate_hq_frame(stream, + stream->sm_payload, HQFT_DATA, 0, rem); + /* XXX malloc can fail */ + } + else + break; + } + avail = stream->sm_n_buffered + stream->sm_write_avail(stream); + if (shf->shf_off == stream->sm_payload + && !(shf->shf_flags & SHF_WRITTEN)) + { + frame_sz = stream_hq_frame_size(shf); + if (frame_sz > (uintptr_t) (end - p)) + break; + LSQ_DEBUG("insert %zu-byte HQ frame of type 0x%X at payload " + "offset %"PRIu64" (actual offset %"PRIu64")", frame_sz, + shf->shf_frame_type, stream->sm_payload, stream->tosend_off); + if (0 == (shf->shf_flags & (SHF_FIXED_SIZE|SHF_PHANTOM))) + { + shf->shf_frame_ptr = p; + memset(p, 0, frame_sz); + p += frame_sz; + } + else if ((shf->shf_flags & (SHF_FIXED_SIZE|SHF_PHANTOM)) + == SHF_FIXED_SIZE) + { + *p++ = shf->shf_frame_type; + bits = vint_val2bits(shf->shf_frame_size); + vint_write(p, shf->shf_frame_size, bits, 1 << bits); + p += 1 << bits; + } + else + assert((shf->shf_flags & (SHF_FIXED_SIZE|SHF_PHANTOM)) + == (SHF_FIXED_SIZE|SHF_PHANTOM)); + if (!(shf->shf_flags & SHF_CC_PAID)) + { + incr_conn_cap(stream, frame_sz); + shf->shf_flags |= SHF_CC_PAID; + } + shf->shf_flags |= SHF_WRITTEN; + stream->tosend_off += frame_sz; + assert(stream->tosend_off <= stream->max_send_off); + } + else + { + len = stream_hq_frame_end(shf) - stream->sm_payload; + assert(len); + if (len > (unsigned) (end - p)) + len = end - p; + if (len > avail) + len = avail; + if (!len) + break; + nw = frame_std_gen_read(ctx, p, len, fin); + p += nw; + if (nw < len) + break; + if (stream_hq_frame_end(shf) == stream->sm_payload) + stream_hq_frame_close(stream, shf); + } + } + + return p - (unsigned char *) begin_buf; +} + + +static size_t +crypto_frame_gen_read (void *ctx, void *buf, size_t len) +{ + int fin_ignored; + + return frame_std_gen_read(ctx, buf, len, &fin_ignored); +} + + static void check_flush_threshold (lsquic_stream_t *stream) { - if ((stream->stream_flags & STREAM_WANT_FLUSH) && + if ((stream->sm_qflags & SMQF_WANT_FLUSH) && stream->tosend_off >= stream->sm_flush_to) { LSQ_DEBUG("flushed to or past required offset %"PRIu64, stream->sm_flush_to); - maybe_remove_from_write_q(stream, STREAM_WANT_FLUSH); + maybe_remove_from_write_q(stream, SMQF_WANT_FLUSH); } } -static struct lsquic_packet_out * -get_brand_new_packet (struct lsquic_send_ctl *ctl, unsigned need_at_least, - const struct lsquic_stream *stream) +static int +write_stream_frame (struct frame_gen_ctx *fg_ctx, const size_t size, + struct lsquic_packet_out *packet_out) { - return lsquic_send_ctl_new_packet_out(ctl, need_at_least); + lsquic_stream_t *const stream = fg_ctx->fgc_stream; + const struct parse_funcs *const pf = stream->conn_pub->lconn->cn_pf; + struct lsquic_send_ctl *const send_ctl = stream->conn_pub->send_ctl; + unsigned off; + int len, s; + +#if LSQUIC_CONN_STATS + const uint64_t begin_off = stream->tosend_off; +#endif + off = packet_out->po_data_sz; + len = pf->pf_gen_stream_frame( + packet_out->po_data + packet_out->po_data_sz, + lsquic_packet_out_avail(packet_out), stream->id, + stream->tosend_off, + fg_ctx->fgc_fin(fg_ctx), size, fg_ctx->fgc_read, fg_ctx); + if (len < 0) + return len; + +#if LSQUIC_CONN_STATS + stream->conn_pub->conn_stats->out.stream_frames += 1; + stream->conn_pub->conn_stats->out.stream_data_sz + += stream->tosend_off - begin_off; +#endif + EV_LOG_GENERATED_STREAM_FRAME(LSQUIC_LOG_CONN_ID, pf, + packet_out->po_data + packet_out->po_data_sz, len); + lsquic_send_ctl_incr_pack_sz(send_ctl, packet_out, len); + packet_out->po_frame_types |= 1 << QUIC_FRAME_STREAM; + if (0 == lsquic_packet_out_avail(packet_out)) + packet_out->po_flags |= PO_STREAM_END; + s = lsquic_packet_out_add_stream(packet_out, stream->conn_pub->mm, + stream, QUIC_FRAME_STREAM, off, len); + if (s != 0) + { + LSQ_ERROR("adding stream to packet failed: %s", strerror(errno)); + return -1; + } + + check_flush_threshold(stream); + return len; } -static struct lsquic_packet_out * (* const get_packet[])( - struct lsquic_send_ctl *, unsigned, const struct lsquic_stream *) = +static enum swtp_status +stream_write_to_packet_hsk (struct frame_gen_ctx *fg_ctx, const size_t size) { - lsquic_send_ctl_get_packet_for_stream, - get_brand_new_packet, -}; + struct lsquic_stream *const stream = fg_ctx->fgc_stream; + struct lsquic_send_ctl *const send_ctl = stream->conn_pub->send_ctl; + struct lsquic_packet_out *packet_out; + int len; + + packet_out = lsquic_send_ctl_new_packet_out(send_ctl, 0, PNS_APP, + stream->conn_pub->path); + if (!packet_out) + return SWTP_STOP; + packet_out->po_header_type = stream->tosend_off == 0 + ? HETY_INITIAL : HETY_HANDSHAKE; + + len = write_stream_frame(fg_ctx, size, packet_out); + if (len > 0) + { + packet_out->po_flags |= PO_HELLO; + lsquic_packet_out_zero_pad(packet_out); + lsquic_send_ctl_scheduled_one(send_ctl, packet_out); + return SWTP_OK; + } + else + return SWTP_ERROR; +} -static enum { SWTP_OK, SWTP_STOP, SWTP_ERROR } -stream_write_to_packet (struct frame_gen_ctx *fg_ctx, const size_t size) + +static enum swtp_status +stream_write_to_packet_std (struct frame_gen_ctx *fg_ctx, const size_t size) { - lsquic_stream_t *const stream = fg_ctx->fgc_stream; - const struct parse_funcs *const pf = stream->conn_pub->lconn->cn_pf; + struct lsquic_stream *const stream = fg_ctx->fgc_stream; struct lsquic_send_ctl *const send_ctl = stream->conn_pub->send_ctl; - unsigned stream_header_sz, need_at_least, off; - lsquic_packet_out_t *packet_out; - int len, s, hsk; + unsigned stream_header_sz, need_at_least; + struct lsquic_packet_out *packet_out; + int len; - if ((stream->stream_flags & (STREAM_HEADERS_SENT|STREAM_HDRS_FLUSHED)) + if (!(stream->sm_bflags & SMBF_IETF) + && (stream->stream_flags & + (STREAM_HEADERS_SENT|STREAM_HDRS_FLUSHED)) == STREAM_HEADERS_SENT && lsquic_send_ctl_buffered_and_same_prio_as_headers(send_ctl, stream)) { + /* TODO: make this logic work for IETF streams as well XXX */ struct lsquic_stream *const headers_stream - = lsquic_headers_stream_get_stream(stream->conn_pub->hs); + = lsquic_headers_stream_get_stream(stream->conn_pub->u.gquic.hs); if (lsquic_stream_has_data_to_flush(headers_stream)) { LSQ_DEBUG("flushing headers stream before potential write to a " @@ -1582,29 +2682,17 @@ stream_write_to_packet (struct frame_gen_ctx *fg_ctx, const size_t size) stream->stream_flags |= STREAM_HDRS_FLUSHED; } - stream_header_sz = pf->pf_calc_stream_frame_header_sz(stream->id, - stream->tosend_off); + stream_header_sz = stream->sm_frame_header_sz(stream, size); need_at_least = stream_header_sz + (size > 0); - hsk = LSQUIC_STREAM_HANDSHAKE == stream->id; get_packet: - packet_out = get_packet[hsk](send_ctl, need_at_least, stream); - if (!packet_out) - return SWTP_STOP; - if (hsk) - packet_out->po_header_type = stream->tosend_off == 0 - ? HETY_INITIAL : HETY_HANDSHAKE; - -#if LSQUIC_CONN_STATS - const uint64_t begin_off = stream->tosend_off; -#endif - off = packet_out->po_data_sz; - len = pf->pf_gen_stream_frame( - packet_out->po_data + packet_out->po_data_sz, - lsquic_packet_out_avail(packet_out), stream->id, - stream->tosend_off, - frame_gen_fin(fg_ctx), size, frame_gen_read, fg_ctx); - if (len < 0) + packet_out = lsquic_send_ctl_get_packet_for_stream(send_ctl, + need_at_least, stream->conn_pub->path, stream); + if (packet_out) { + len = write_stream_frame(fg_ctx, size, packet_out); + if (len > 0) + return SWTP_OK; + assert(len < 0); if (-len > (int) need_at_least) { LSQ_DEBUG("need more room (%d bytes) than initially calculated " @@ -1612,42 +2700,56 @@ stream_write_to_packet (struct frame_gen_ctx *fg_ctx, const size_t size) need_at_least = -len; goto get_packet; } - else - { - LSQ_ERROR("could not generate stream frame"); - return SWTP_ERROR; - } + return SWTP_ERROR; } + else + return SWTP_STOP; +} -#if LSQUIC_CONN_STATS - stream->conn_pub->conn_stats->out.stream_frames += 1; - stream->conn_pub->conn_stats->out.stream_data_sz - += stream->tosend_off - begin_off; -#endif - EV_LOG_GENERATED_STREAM_FRAME(LSQUIC_LOG_CONN_ID, pf, + +static enum swtp_status +stream_write_to_packet_crypto (struct frame_gen_ctx *fg_ctx, const size_t size) +{ + struct lsquic_stream *const stream = fg_ctx->fgc_stream; + struct lsquic_send_ctl *const send_ctl = stream->conn_pub->send_ctl; + const struct parse_funcs *const pf = stream->conn_pub->lconn->cn_pf; + unsigned crypto_header_sz, need_at_least; + struct lsquic_packet_out *packet_out; + unsigned short off; + const enum packnum_space pns = lsquic_enclev2pns[ crypto_level(stream) ]; + int len, s; + + assert(size > 0); + crypto_header_sz = stream->sm_frame_header_sz(stream, size); + need_at_least = crypto_header_sz + 1; + + packet_out = lsquic_send_ctl_get_packet_for_crypto(send_ctl, + need_at_least, pns, stream->conn_pub->path); + if (!packet_out) + return SWTP_STOP; + + off = packet_out->po_data_sz; + len = pf->pf_gen_crypto_frame(packet_out->po_data + packet_out->po_data_sz, + lsquic_packet_out_avail(packet_out), stream->tosend_off, + size, crypto_frame_gen_read, fg_ctx); + if (len < 0) + return len; + + EV_LOG_GENERATED_CRYPTO_FRAME(LSQUIC_LOG_CONN_ID, pf, packet_out->po_data + packet_out->po_data_sz, len); lsquic_send_ctl_incr_pack_sz(send_ctl, packet_out, len); - packet_out->po_frame_types |= 1 << QUIC_FRAME_STREAM; - if (0 == lsquic_packet_out_avail(packet_out)) - packet_out->po_flags |= PO_STREAM_END; + packet_out->po_frame_types |= 1 << QUIC_FRAME_CRYPTO; s = lsquic_packet_out_add_stream(packet_out, stream->conn_pub->mm, - stream, QUIC_FRAME_STREAM, off, len); + stream, QUIC_FRAME_CRYPTO, off, len); if (s != 0) { - LSQ_ERROR("adding stream to packet failed: %s", strerror(errno)); - return SWTP_ERROR; + LSQ_WARN("adding crypto stream to packet failed: %s", strerror(errno)); + return -1; } - check_flush_threshold(stream); - - /* XXX: I don't like it that this is here */ - if (hsk && !(packet_out->po_flags & PO_HELLO)) - { - lsquic_packet_out_zero_pad(packet_out); - packet_out->po_flags |= PO_HELLO; - lsquic_send_ctl_scheduled_one(send_ctl, packet_out); - } + packet_out->po_flags |= PO_HELLO; + check_flush_threshold(stream); return SWTP_OK; } @@ -1655,15 +2757,69 @@ stream_write_to_packet (struct frame_gen_ctx *fg_ctx, const size_t size) static void abort_connection (struct lsquic_stream *stream) { - if (0 == (stream->stream_flags & STREAM_SERVICE_FLAGS)) + if (0 == (stream->sm_qflags & SMQF_SERVICE_FLAGS)) TAILQ_INSERT_TAIL(&stream->conn_pub->service_streams, stream, next_service_stream); - stream->stream_flags |= STREAM_ABORT_CONN; + stream->sm_qflags |= SMQF_ABORT_CONN; LSQ_WARN("connection will be aborted"); maybe_conn_to_tickable(stream); } +static void +maybe_close_varsize_hq_frame (struct lsquic_stream *stream) +{ + struct stream_hq_frame *shf; + uint64_t size; + unsigned bits; + + shf = find_cur_hq_frame(stream); + if (!shf) + return; + + if (shf->shf_flags & SHF_FIXED_SIZE) + { + stream_hq_frame_put(stream, shf); + return; + } + + bits = (shf->shf_flags & SHF_TWO_BYTES) > 0; + size = stream->sm_payload + stream->sm_n_buffered - shf->shf_off; + if (size && size <= VINT_MAX_B(bits)) + { + if (0 == stream->sm_n_buffered) + LSQ_DEBUG("close HQ frame type 0x%X of size %"PRIu64, + shf->shf_frame_type, size); + else + LSQ_DEBUG("convert HQ frame type 0x%X of to fixed %"PRIu64, + shf->shf_frame_type, size); + shf->shf_frame_ptr[0] = shf->shf_frame_type; + vint_write(shf->shf_frame_ptr + 1, size, bits, 1 << bits); + if (0 == stream->sm_n_buffered) + stream_hq_frame_put(stream, shf); + else + { + shf->shf_frame_size = size; + shf->shf_flags |= SHF_FIXED_SIZE; + } + } + else if (!size) + { + assert(!shf->shf_frame_ptr); + LSQ_WARN("discard zero-sized HQ frame type 0x%X (off: %"PRIu64")", + shf->shf_frame_type, shf->shf_off); + stream_hq_frame_put(stream, shf); + } + else + { + assert(stream->sm_n_buffered); + LSQ_ERROR("cannot close frame of size %"PRIu64" -- too large", size); + /* TODO: abort connection */ + stream_hq_frame_put(stream, shf); + } +} + + static ssize_t stream_write_to_packets (lsquic_stream_t *stream, struct lsquic_reader *reader, size_t thresh) @@ -1671,23 +2827,41 @@ stream_write_to_packets (lsquic_stream_t *stream, struct lsquic_reader *reader, size_t size; ssize_t nw; unsigned seen_ok; + int use_framing; struct frame_gen_ctx fg_ctx = { .fgc_stream = stream, .fgc_reader = reader, .fgc_nread_from_reader = 0, }; + use_framing = (stream->sm_bflags & (SMBF_IETF|SMBF_USE_HEADERS)) + == (SMBF_IETF|SMBF_USE_HEADERS); + if (use_framing) + { + fg_ctx.fgc_size = frame_hq_gen_size; + fg_ctx.fgc_read = frame_hq_gen_read; + fg_ctx.fgc_fin = frame_std_gen_fin; /* This seems to work for either? XXX */ + } + else + { + fg_ctx.fgc_size = frame_std_gen_size; + fg_ctx.fgc_read = frame_std_gen_read; + fg_ctx.fgc_fin = frame_std_gen_fin; + } + seen_ok = 0; - while ((size = frame_gen_size(&fg_ctx), thresh ? size >= thresh : size > 0) - || frame_gen_fin(&fg_ctx)) + while ((size = fg_ctx.fgc_size(&fg_ctx), thresh ? size >= thresh : size > 0) + || fg_ctx.fgc_fin(&fg_ctx)) { - switch (stream_write_to_packet(&fg_ctx, size)) + switch (stream->sm_write_to_packet(&fg_ctx, size)) { case SWTP_OK: if (!seen_ok++) maybe_conn_to_tickable_if_writeable(stream, 0); - if (frame_gen_fin(&fg_ctx)) + if (fg_ctx.fgc_fin(&fg_ctx)) { + if (use_framing && seen_ok) + maybe_close_varsize_hq_frame(stream); stream->stream_flags |= STREAM_FIN_SENT; goto end; } @@ -1695,6 +2869,8 @@ stream_write_to_packets (lsquic_stream_t *stream, struct lsquic_reader *reader, break; case SWTP_STOP: stream->stream_flags &= ~STREAM_LAST_WRITE_OK; + if (use_framing && seen_ok) + maybe_close_varsize_hq_frame(stream); goto end; default: abort_connection(stream); @@ -1703,6 +2879,9 @@ stream_write_to_packets (lsquic_stream_t *stream, struct lsquic_reader *reader, } } + if (use_framing && seen_ok) + maybe_close_varsize_hq_frame(stream); + if (thresh) { assert(size < thresh); @@ -1744,7 +2923,7 @@ static int maybe_flush_stream (struct lsquic_stream *stream) { if (stream->sm_n_buffered > 0 - && (stream->stream_flags & STREAM_CONN_LIMITED) + && (stream->sm_bflags & SMBF_CONN_LIMITED) && lsquic_conn_cap_avail(&stream->conn_pub->conn_cap) == 0) return stream_flush_nocheck(stream); else @@ -1752,28 +2931,114 @@ maybe_flush_stream (struct lsquic_stream *stream) } -static ssize_t -save_to_buffer (lsquic_stream_t *stream, struct lsquic_reader *reader, - size_t len) +static int +stream_hq_frame_extendable (const struct stream_hq_frame *shf, uint64_t cur_off, + unsigned len) { - size_t avail, n_written; + return (shf->shf_flags & (SHF_TWO_BYTES|SHF_FIXED_SIZE)) == 0 + && cur_off - shf->shf_off < (1 << 6) + && cur_off - shf->shf_off + len >= (1 << 6) + ; +} + + +/* Update currently buffered HQ frame or create a new one, if possible. + * Return update length to be buffered. If a HQ frame cannot be + * buffered due to size, 0 is returned, thereby preventing both HQ frame + * creation and buffering. + */ +static size_t +update_buffered_hq_frames (struct lsquic_stream *stream, size_t len, + size_t avail) +{ + struct stream_hq_frame *shf; + uint64_t cur_off, end; + size_t frame_sz; + int extendable; + + cur_off = stream->sm_payload + stream->sm_n_buffered; + STAILQ_FOREACH(shf, &stream->sm_hq_frames, shf_next) + if (shf->shf_off <= cur_off) + { + end = stream_hq_frame_end(shf); + extendable = stream_hq_frame_extendable(shf, cur_off, len); + if (cur_off < end + extendable) + break; + } + + if (shf) + { + if (len > end - cur_off) + len = end - cur_off; + frame_sz = stream_hq_frame_size(shf); + } + else if (avail >= 3) + { + shf = stream_activate_hq_frame(stream, cur_off, HQFT_DATA, 0, len); + /* XXX malloc can fail */ + if (len > stream_hq_frame_end(shf) - cur_off) + len = stream_hq_frame_end(shf) - cur_off; + extendable = 0; + frame_sz = stream_hq_frame_size(shf); + if (avail < frame_sz) + return 0; + avail -= frame_sz; + } + else + return 0; + + if (!(shf->shf_flags & SHF_CC_PAID)) + { + incr_conn_cap(stream, frame_sz); + shf->shf_flags |= SHF_CC_PAID; + } + if (extendable) + { + shf->shf_flags |= SHF_TWO_BYTES; + incr_conn_cap(stream, 1); + avail -= 1; + if ((stream->sm_qflags & SMQF_WANT_FLUSH) + && shf->shf_off <= stream->sm_payload + && stream_hq_frame_end(shf) >= stream->sm_flush_to_payload) + stream->sm_flush_to += 1; + } + + if (len <= avail) + return len; + else + return avail; +} + + +static ssize_t +save_to_buffer (lsquic_stream_t *stream, struct lsquic_reader *reader, + size_t len) +{ + size_t avail, n_written, n_allowed; - assert(stream->sm_n_buffered + len <= SM_BUF_SIZE); + n_allowed = stream_get_n_allowed(stream); + assert(stream->sm_n_buffered + len <= n_allowed); if (!stream->sm_buf) { - stream->sm_buf = malloc(SM_BUF_SIZE); + stream->sm_buf = malloc(n_allowed); if (!stream->sm_buf) return -1; + stream->sm_n_allocated = n_allowed; } avail = lsquic_stream_write_avail(stream); if (avail < len) len = avail; + if ((stream->sm_bflags & (SMBF_IETF|SMBF_USE_HEADERS)) + == (SMBF_IETF|SMBF_USE_HEADERS)) + len = update_buffered_hq_frames(stream, len, avail); + n_written = reader->lsqr_read(reader->lsqr_ctx, stream->sm_buf + stream->sm_n_buffered, len); stream->sm_n_buffered += n_written; + assert(stream->max_send_off >= stream->tosend_off + stream->sm_n_buffered); incr_conn_cap(stream, n_written); LSQ_DEBUG("buffered %zd bytes; %hu bytes are now in buffer", n_written, stream->sm_n_buffered); @@ -1786,13 +3051,40 @@ save_to_buffer (lsquic_stream_t *stream, struct lsquic_reader *reader, static ssize_t stream_write (lsquic_stream_t *stream, struct lsquic_reader *reader) { - size_t thresh, len; + const struct stream_hq_frame *shf; + size_t thresh, len, frames, total_len, n_allowed, nwritten; + ssize_t nw; - thresh = lsquic_stream_flush_threshold(stream); len = reader->lsqr_size(reader->lsqr_ctx); - if (stream->sm_n_buffered + len <= SM_BUF_SIZE && - stream->sm_n_buffered + len < thresh) - return save_to_buffer(stream, reader, len); + if (len == 0) + return 0; + + frames = 0; + if ((stream->sm_bflags & (SMBF_IETF|SMBF_USE_HEADERS)) + == (SMBF_IETF|SMBF_USE_HEADERS)) + STAILQ_FOREACH(shf, &stream->sm_hq_frames, shf_next) + if (shf->shf_off >= stream->sm_payload) + frames += stream_hq_frame_size(shf); + total_len = len + frames + stream->sm_n_buffered; + thresh = lsquic_stream_flush_threshold(stream, total_len); + n_allowed = stream_get_n_allowed(stream); + if (total_len <= n_allowed && total_len < thresh) + { + nwritten = 0; + do + { + nw = save_to_buffer(stream, reader, len - nwritten); + if (nw > 0) + nwritten += (size_t) nw; + else if (nw == 0) + break; + else + return nw; + } + while (nwritten < len + && stream->sm_n_buffered < stream->sm_n_allocated); + return nwritten; + } else return stream_write_to_packets(stream, reader, thresh); } @@ -1887,31 +3179,174 @@ lsquic_stream_writef (lsquic_stream_t *stream, struct lsquic_reader *reader) } +/* This bypasses COMMON_WRITE_CHECKS */ +static ssize_t +stream_write_buf (struct lsquic_stream *stream, const void *buf, size_t sz) +{ + struct iovec iov = { (void *) buf, sz, }; + struct inner_reader_iovec iro = { + .iov = &iov, + .end = &iov + 1, + .cur_iovec_off = 0, + }; + struct lsquic_reader reader = { + .lsqr_read = inner_reader_iovec_read, + .lsqr_size = inner_reader_iovec_size, + .lsqr_ctx = &iro, + }; + return stream_write(stream, &reader); +} + + +/* XXX Move this define elsewhere? */ +#define MAX_HEADERS_SIZE (64 * 1024) + +static int +send_headers_ietf (struct lsquic_stream *stream, + const struct lsquic_http_headers *headers, int eos) +{ + enum qwh_status qwh; + const size_t max_prefix_size = + lsquic_qeh_max_prefix_size(stream->conn_pub->u.ietf.qeh); + const size_t max_push_size = 1 /* Stream type */ + 8 /* Push ID */; + size_t prefix_sz, headers_sz, hblock_sz, push_sz; + unsigned bits; + ssize_t nw; + unsigned char *header_block; + unsigned char buf[max_push_size + max_prefix_size + MAX_HEADERS_SIZE]; + + stream->stream_flags &= ~STREAM_PUSHING; + stream->stream_flags |= STREAM_NOPUSH; + + /* TODO: Optimize for the common case: write directly to sm_buf and fall + * back to a larger buffer if that fails. + */ + prefix_sz = max_prefix_size; + headers_sz = sizeof(buf) - max_prefix_size - max_push_size; + qwh = lsquic_qeh_write_headers(stream->conn_pub->u.ietf.qeh, stream->id, 0, + headers, buf + max_push_size + max_prefix_size, &prefix_sz, + &headers_sz, &stream->sm_hb_compl); + + if (!(qwh == QWH_FULL || qwh == QWH_PARTIAL)) + { + if (qwh == QWH_ENOBUF) + LSQ_INFO("not enough room for header block"); + else + LSQ_WARN("internal error encoding and sending HTTP headers"); + return -1; + } + + if (stream->sm_promise) + { + assert(lsquic_stream_is_pushed(stream)); + bits = vint_val2bits(stream->sm_promise->pp_id); + push_sz = 1 + (1 << bits); + if (!stream_activate_hq_frame(stream, + stream->sm_payload + stream->sm_n_buffered, HQFT_PUSH_PREAMBLE, + SHF_FIXED_SIZE|SHF_PHANTOM, push_sz)) + return -1; + buf[max_push_size + max_prefix_size - prefix_sz - push_sz] = HQUST_PUSH; + vint_write(buf + max_push_size + max_prefix_size - prefix_sz + - push_sz + 1,stream->sm_promise->pp_id, bits, 1 << bits); + } + else + push_sz = 0; + + /* Construct contiguous header block buffer including HQ framing */ + header_block = buf + max_push_size + max_prefix_size - prefix_sz - push_sz; + hblock_sz = push_sz + prefix_sz + headers_sz; + if (!stream_activate_hq_frame(stream, + stream->sm_payload + stream->sm_n_buffered + push_sz, + HQFT_HEADERS, SHF_FIXED_SIZE, hblock_sz - push_sz)) + return -1; + + if (qwh == QWH_FULL) + { + stream->sm_send_headers_state = SSHS_HBLOCK_SENDING; + if (lsquic_stream_write_avail(stream)) + { + nw = stream_write_buf(stream, header_block, hblock_sz); + if (nw < 0) + { + LSQ_WARN("cannot write to stream: %s", strerror(errno)); + return -1; + } + if ((size_t) nw == hblock_sz) + { + stream->stream_flags |= STREAM_HEADERS_SENT; + stream_hblock_sent(stream); + LSQ_DEBUG("wrote all %zu bytes of header block", hblock_sz); + return 0; + } + LSQ_DEBUG("wrote only %zd bytes of header block, stash", nw); + } + else + { + LSQ_DEBUG("cannot write to stream, stash all %zu bytes of " + "header block", hblock_sz); + nw = 0; + } + } + else + { + stream->sm_send_headers_state = SSHS_ENC_SENDING; + nw = 0; + } + + stream->sm_saved_want_write = !!(stream->sm_qflags & SMQF_WANT_WRITE); + stream_wantwrite(stream, 1); + + stream->sm_header_block = malloc(hblock_sz - (size_t) nw); + if (!stream->sm_header_block) + { + LSQ_WARN("cannot allocate %zd bytes to stash %s header block", + hblock_sz - (size_t) nw, qwh == QWH_FULL ? "full" : "partial"); + return -1; + } + memcpy(stream->sm_header_block, header_block + (size_t) nw, + hblock_sz - (size_t) nw); + stream->sm_hblock_sz = hblock_sz - (size_t) nw; + stream->sm_hblock_off = 0; + LSQ_DEBUG("stashed %u bytes of header block", stream->sm_hblock_sz); + return 0; +} + + +static int +send_headers_gquic (struct lsquic_stream *stream, + const struct lsquic_http_headers *headers, int eos) +{ + int s = lsquic_headers_stream_send_headers(stream->conn_pub->u.gquic.hs, + stream->id, headers, eos, lsquic_stream_priority(stream)); + if (0 == s) + { + SM_HISTORY_APPEND(stream, SHE_USER_WRITE_HEADER); + stream->stream_flags |= STREAM_HEADERS_SENT; + if (eos) + stream->stream_flags |= STREAM_FIN_SENT; + LSQ_INFO("sent headers"); + } + else + LSQ_WARN("could not send headers: %s", strerror(errno)); + return s; +} + + int lsquic_stream_send_headers (lsquic_stream_t *stream, const lsquic_http_headers_t *headers, int eos) { - if ((stream->stream_flags & (STREAM_USE_HEADERS|STREAM_HEADERS_SENT| - STREAM_U_WRITE_DONE)) - == STREAM_USE_HEADERS) + if ((stream->sm_bflags & SMBF_USE_HEADERS) + && !(stream->stream_flags & (STREAM_HEADERS_SENT|STREAM_U_WRITE_DONE))) { - int s = lsquic_headers_stream_send_headers(stream->conn_pub->hs, - stream->id, headers, eos, lsquic_stream_priority(stream)); - if (0 == s) - { - SM_HISTORY_APPEND(stream, SHE_USER_WRITE_HEADER); - stream->stream_flags |= STREAM_HEADERS_SENT; - if (eos) - stream->stream_flags |= STREAM_FIN_SENT; - LSQ_INFO("sent headers for stream %u", stream->id); - } + if (stream->sm_bflags & SMBF_IETF) + return send_headers_ietf(stream, headers, eos); else - LSQ_WARN("could not send headers: %s", strerror(errno)); - return s; + return send_headers_gquic(stream, headers, eos); } else { - LSQ_INFO("cannot send headers for stream %u in this state", stream->id); + LSQ_INFO("cannot send headers in this state"); errno = EBADMSG; return -1; } @@ -1924,13 +3359,13 @@ lsquic_stream_window_update (lsquic_stream_t *stream, uint64_t offset) if (offset > stream->max_send_off) { SM_HISTORY_APPEND(stream, SHE_WINDOW_UPDATE); - LSQ_DEBUG("stream %u: update max send offset from 0x%"PRIX64" to " - "0x%"PRIX64, stream->id, stream->max_send_off, offset); + LSQ_DEBUG("update max send offset from 0x%"PRIX64" to " + "0x%"PRIX64, stream->max_send_off, offset); stream->max_send_off = offset; } else - LSQ_DEBUG("stream %u: new offset 0x%"PRIX64" is not larger than old " - "max send offset 0x%"PRIX64", ignoring", stream->id, offset, + LSQ_DEBUG("new offset 0x%"PRIX64" is not larger than old " + "max send offset 0x%"PRIX64", ignoring", offset, stream->max_send_off); } @@ -1939,9 +3374,9 @@ lsquic_stream_window_update (lsquic_stream_t *stream, uint64_t offset) * learn of peer's limits from the handshake values. */ int -lsquic_stream_set_max_send_off (lsquic_stream_t *stream, unsigned offset) +lsquic_stream_set_max_send_off (lsquic_stream_t *stream, uint64_t offset) { - LSQ_DEBUG("setting max_send_off to %u", offset); + LSQ_DEBUG("setting max_send_off to %"PRIu64, offset); if (offset > stream->max_send_off) { lsquic_stream_window_update(stream, offset); @@ -1949,8 +3384,8 @@ lsquic_stream_set_max_send_off (lsquic_stream_t *stream, unsigned offset) } else if (offset < stream->tosend_off) { - LSQ_INFO("new offset (%u bytes) is smaller than the amount of data " - "already sent on this stream (%"PRIu64" bytes)", offset, + LSQ_INFO("new offset (%"PRIu64" bytes) is smaller than the amount of " + "data already sent on this stream (%"PRIu64" bytes)", offset, stream->tosend_off); return -1; } @@ -1963,17 +3398,18 @@ lsquic_stream_set_max_send_off (lsquic_stream_t *stream, unsigned offset) void -lsquic_stream_reset (lsquic_stream_t *stream, uint32_t error_code) +lsquic_stream_reset (lsquic_stream_t *stream, uint64_t error_code) { lsquic_stream_reset_ext(stream, error_code, 1); } void -lsquic_stream_reset_ext (lsquic_stream_t *stream, uint32_t error_code, +lsquic_stream_reset_ext (lsquic_stream_t *stream, uint64_t error_code, int do_close) { - if (stream->stream_flags & (STREAM_SEND_RST|STREAM_RST_SENT)) + if ((stream->stream_flags & STREAM_RST_SENT) + || (stream->sm_qflags & SMQF_SEND_RST)) { LSQ_INFO("reset already sent"); return; @@ -1981,14 +3417,20 @@ lsquic_stream_reset_ext (lsquic_stream_t *stream, uint32_t error_code, SM_HISTORY_APPEND(stream, SHE_RESET); - LSQ_INFO("reset stream %u, error code 0x%X", stream->id, error_code); + LSQ_INFO("reset, error code %"PRIu64, error_code); stream->error_code = error_code; - if (!(stream->stream_flags & STREAM_SENDING_FLAGS)) + if (!(stream->sm_qflags & SMQF_SENDING_FLAGS)) TAILQ_INSERT_TAIL(&stream->conn_pub->sending_streams, stream, next_send_stream); - stream->stream_flags &= ~STREAM_SENDING_FLAGS; - stream->stream_flags |= STREAM_SEND_RST; + stream->sm_qflags &= ~SMQF_SENDING_FLAGS; + stream->sm_qflags |= SMQF_SEND_RST; + + if (stream->sm_qflags & SMQF_QPACK_DEC) + { + lsquic_qdh_cancel_stream(stream->conn_pub->u.ietf.qdh, stream); + stream->sm_qflags |= ~SMQF_QPACK_DEC; + } drop_buffered_data(stream); maybe_elide_stream_frames(stream); @@ -2001,13 +3443,16 @@ lsquic_stream_reset_ext (lsquic_stream_t *stream, uint32_t error_code, } -unsigned +lsquic_stream_id_t lsquic_stream_id (const lsquic_stream_t *stream) { return stream->id; } +#if !defined(NDEBUG) && __GNUC__ +__attribute__((weak)) +#endif struct lsquic_conn * lsquic_stream_conn (const lsquic_stream_t *stream) { @@ -2018,19 +3463,20 @@ lsquic_stream_conn (const lsquic_stream_t *stream) int lsquic_stream_close (lsquic_stream_t *stream) { - LSQ_DEBUG("lsquic_stream_close(stream %u) called", stream->id); + LSQ_DEBUG("lsquic_stream_close() called"); SM_HISTORY_APPEND(stream, SHE_CLOSE); if (lsquic_stream_is_closed(stream)) { - LSQ_INFO("Attempt to close an already-closed stream %u", stream->id); + LSQ_INFO("Attempt to close an already-closed stream"); errno = EBADF; return -1; } - stream_shutdown_write(stream); + maybe_stream_shutdown_write(stream); stream_shutdown_read(stream); maybe_schedule_call_on_close(stream); maybe_finish_stream(stream); - maybe_conn_to_tickable_if_writeable(stream, 1); + if (!(stream->stream_flags & STREAM_DELAYED_SW)) + maybe_conn_to_tickable_if_writeable(stream, 1); return 0; } @@ -2041,11 +3487,18 @@ __attribute__((weak)) #endif #endif void -lsquic_stream_acked (lsquic_stream_t *stream) +lsquic_stream_acked (struct lsquic_stream *stream, + enum quic_frame_type frame_type) { assert(stream->n_unacked); --stream->n_unacked; - LSQ_DEBUG("stream %u ACKed; n_unacked: %u", stream->id, stream->n_unacked); + LSQ_DEBUG("ACKed; n_unacked: %u", stream->n_unacked); + if (frame_type == QUIC_FRAME_RST_STREAM) + { + SM_HISTORY_APPEND(stream, SHE_RST_ACKED); + LSQ_DEBUG("RESET that we sent has been acked by peer"); + stream->stream_flags |= STREAM_RST_ACKED; + } if (0 == stream->n_unacked) maybe_finish_stream(stream); } @@ -2064,13 +3517,21 @@ lsquic_stream_push_req (lsquic_stream_t *stream, int lsquic_stream_is_pushed (const lsquic_stream_t *stream) { - return 1 & ~stream->id; + enum stream_id_type sit; + + if (stream->sm_bflags & SMBF_IETF) + { + sit = stream->id & SIT_MASK; + return sit == SIT_UNI_SERVER; + } + else + return 1 & ~stream->id; } int lsquic_stream_push_info (const lsquic_stream_t *stream, - uint32_t *ref_stream_id, void **hset) + lsquic_stream_id_t *ref_stream_id, void **hset) { if (lsquic_stream_is_pushed(stream)) { @@ -2087,13 +3548,22 @@ lsquic_stream_push_info (const lsquic_stream_t *stream, int lsquic_stream_uh_in (lsquic_stream_t *stream, struct uncompressed_headers *uh) { - if ((stream->stream_flags & (STREAM_USE_HEADERS|STREAM_HAVE_UH)) == STREAM_USE_HEADERS) + if ((stream->sm_bflags & SMBF_USE_HEADERS) + && !(stream->stream_flags & STREAM_HAVE_UH)) { SM_HISTORY_APPEND(stream, SHE_HEADERS_IN); - LSQ_DEBUG("received uncompressed headers for stream %u", stream->id); + LSQ_DEBUG("received uncompressed headers"); stream->stream_flags |= STREAM_HAVE_UH; if (uh->uh_flags & UH_FIN) + { + /* IETF QUIC only sets UH_FIN for a pushed stream on the server to + * mark request as done: + */ + if (stream->sm_bflags & SMBF_IETF) + assert((stream->sm_bflags & SMBF_SERVER) + && lsquic_stream_is_pushed(stream)); stream->stream_flags |= STREAM_FIN_RECVD|STREAM_HEAD_IN_FIN; + } stream->uh = uh; if (uh->uh_oth_stream_id == 0) { @@ -2101,13 +3571,13 @@ lsquic_stream_uh_in (lsquic_stream_t *stream, struct uncompressed_headers *uh) lsquic_stream_set_priority_internal(stream, uh->uh_weight); } else - LSQ_NOTICE("don't know how to depend on stream %u", + LSQ_NOTICE("don't know how to depend on stream %"PRIu64, uh->uh_oth_stream_id); return 0; } else { - LSQ_ERROR("received unexpected uncompressed headers for stream %u", stream->id); + LSQ_ERROR("received unexpected uncompressed headers"); return -1; } } @@ -2126,9 +3596,7 @@ lsquic_stream_set_priority_internal (lsquic_stream_t *stream, unsigned priority) /* The user should never get a reference to the special streams, * but let's check just in case: */ - if (LSQUIC_STREAM_HANDSHAKE == stream->id - || ((stream->stream_flags & STREAM_USE_HEADERS) && - LSQUIC_STREAM_HEADERS == stream->id)) + if (lsquic_stream_is_critical(stream)) return -1; if (priority < 1 || priority > 256) return -1; @@ -2140,24 +3608,42 @@ lsquic_stream_set_priority_internal (lsquic_stream_t *stream, unsigned priority) } +static int +maybe_send_priority_gquic (struct lsquic_stream *stream, unsigned priority) +{ + if ((stream->sm_bflags & SMBF_USE_HEADERS) + && (stream->stream_flags & STREAM_HEADERS_SENT)) + { + /* We need to send headers only if we are a) using HEADERS stream + * and b) we already sent initial headers. If initial headers + * have not been sent yet, stream priority will be sent in the + * HEADERS frame. + */ + return lsquic_headers_stream_send_priority(stream->conn_pub->u.gquic.hs, + stream->id, 0, 0, priority); + } + else + return 0; +} + + +static int +send_priority_ietf (struct lsquic_stream *stream, unsigned priority) +{ + LSQ_WARN("%s: TODO", __func__); /* TODO */ + return -1; +} + + int lsquic_stream_set_priority (lsquic_stream_t *stream, unsigned priority) { if (0 == lsquic_stream_set_priority_internal(stream, priority)) { - if ((stream->stream_flags & (STREAM_USE_HEADERS|STREAM_HEADERS_SENT)) == - (STREAM_USE_HEADERS|STREAM_HEADERS_SENT)) - { - /* We need to send headers only if we are a) using HEADERS stream - * and b) we already sent initial headers. If initial headers - * have not been sent yet, stream priority will be sent in the - * HEADERS frame. - */ - return lsquic_headers_stream_send_priority(stream->conn_pub->hs, - stream->id, 0, 0, priority); - } + if (stream->sm_bflags & SMBF_IETF) + return send_priority_ietf(stream, priority); else - return 0; + return maybe_send_priority_gquic(stream, priority); } else return -1; @@ -2174,8 +3660,9 @@ lsquic_stream_get_ctx (const lsquic_stream_t *stream) int lsquic_stream_refuse_push (lsquic_stream_t *stream) { - if (lsquic_stream_is_pushed(stream) && - !(stream->stream_flags & (STREAM_RST_SENT|STREAM_SEND_RST))) + if (lsquic_stream_is_pushed(stream) + && !(stream->sm_qflags & SMQF_SEND_RST) + && !(stream->stream_flags & STREAM_RST_SENT)) { LSQ_DEBUG("refusing pushed stream: send reset"); lsquic_stream_reset_ext(stream, 8 /* QUIC_REFUSED_STREAM */, 1); @@ -2193,7 +3680,7 @@ lsquic_stream_mem_used (const struct lsquic_stream *stream) size = sizeof(stream); if (stream->sm_buf) - size += SM_BUF_SIZE; + size += stream->sm_n_allocated; if (stream->data_in) size += stream->data_in->di_if->di_mem_used(stream->data_in); @@ -2201,27 +3688,36 @@ lsquic_stream_mem_used (const struct lsquic_stream *stream) } -lsquic_cid_t +const lsquic_cid_t * lsquic_stream_cid (const struct lsquic_stream *stream) { return LSQUIC_LOG_CONN_ID; } +void +lsquic_stream_dump_state (const struct lsquic_stream *stream) +{ + LSQ_DEBUG("flags: %X; read off: %"PRIu64, stream->stream_flags, + stream->read_offset); + stream->data_in->di_if->di_dump_state(stream->data_in); +} + + void * lsquic_stream_get_hset (struct lsquic_stream *stream) { void *hset; - if (stream->stream_flags & STREAM_RST_FLAGS) + if (lsquic_stream_is_reset(stream)) { LSQ_INFO("%s: stream is reset, no headers returned", __func__); errno = ECONNRESET; return NULL; } - if ((stream->stream_flags & (STREAM_USE_HEADERS|STREAM_HAVE_UH)) - != (STREAM_USE_HEADERS|STREAM_HAVE_UH)) + if (!((stream->sm_bflags & SMBF_USE_HEADERS) + && (stream->stream_flags & STREAM_HAVE_UH))) { LSQ_INFO("%s: unexpected call, flags: 0x%X", __func__, stream->stream_flags); @@ -2251,3 +3747,815 @@ lsquic_stream_get_hset (struct lsquic_stream *stream) LSQ_DEBUG("return header set"); return hset; } + + +/* GQUIC-only function */ +int +lsquic_stream_id_is_critical (int use_http, lsquic_stream_id_t stream_id) +{ + return stream_id == LSQUIC_GQUIC_STREAM_HANDSHAKE + || (stream_id == LSQUIC_GQUIC_STREAM_HEADERS && use_http); +} + + +int +lsquic_stream_is_critical (const struct lsquic_stream *stream) +{ + return stream->sm_bflags & SMBF_CRITICAL; +} + + +void +lsquic_stream_set_stream_if (struct lsquic_stream *stream, + const struct lsquic_stream_if *stream_if, void *stream_if_ctx) +{ + SM_HISTORY_APPEND(stream, SHE_IF_SWITCH); + stream->stream_if = stream_if; + stream->sm_onnew_arg = stream_if_ctx; + LSQ_DEBUG("switched interface"); + assert(stream->stream_flags & STREAM_ONNEW_DONE); + stream->st_ctx = stream->stream_if->on_new_stream(stream->sm_onnew_arg, + stream); +} + + +static int +update_type_hist_and_check (struct hq_filter *filter) +{ + /* 3-bit codes: */ + enum { + CODE_UNSET, + CODE_HEADER, /* H Header */ + CODE_DATA, /* D Data */ + CODE_PLUS, /* + Plus: meaning previous frame repeats */ + }; + static const unsigned valid_seqs[] = { + /* Ordered by expected frequency */ + 0123, /* HD+ */ + 012, /* HD */ + 01, /* H */ + 01231, /* HD+H */ + 0121, /* HDH */ + }; + unsigned code, i; + + switch (filter->hqfi_type) + { + case HQFT_HEADERS: + code = CODE_HEADER; + break; + case HQFT_DATA: + code = CODE_DATA; + break; + default: + /* Ignore unknown frames */ + return 0; + } + + if (filter->hqfi_hist_idx >= MAX_HQFI_ENTRIES) + return -1; + + if (filter->hqfi_hist_idx && (filter->hqfi_hist_buf & 7) == code) + { + filter->hqfi_hist_buf <<= 3; + filter->hqfi_hist_buf |= CODE_PLUS; + filter->hqfi_hist_idx++; + } + else if (filter->hqfi_hist_idx > 1 + && ((filter->hqfi_hist_buf >> 3) & 7) == code + && (filter->hqfi_hist_buf & 7) == CODE_PLUS) + /* Keep it at plus, do nothing */; + else + { + filter->hqfi_hist_buf <<= 3; + filter->hqfi_hist_buf |= code; + filter->hqfi_hist_idx++; + } + + for (i = 0; i < sizeof(valid_seqs) / sizeof(valid_seqs[0]); ++i) + if (filter->hqfi_hist_buf == valid_seqs[i]) + return 0; + + return -1; +} + + +static size_t +hq_read (void *ctx, const unsigned char *buf, size_t sz, int fin) +{ + struct lsquic_stream *const stream = ctx; + struct hq_filter *const filter = &stream->sm_hq_filter; + const unsigned char *p = buf, *prev; + const unsigned char *const end = buf + sz; + struct lsquic_conn *lconn; + enum lsqpack_read_header_status rhs; + int s; + + while (p < end) + { + switch (filter->hqfi_state) + { + case HQFI_STATE_FRAME_HEADER_BEGIN: + filter->hqfi_vint_state.vr2s_state = 0; + filter->hqfi_state = HQFI_STATE_FRAME_HEADER_CONTINUE; + /* fall-through */ + case HQFI_STATE_FRAME_HEADER_CONTINUE: + s = lsquic_varint_read_two(&p, end, &filter->hqfi_vint_state); + if (s < 0) + break; + filter->hqfi_flags |= HQFI_FLAG_BEGIN; + filter->hqfi_state = HQFI_STATE_READING_PAYLOAD; + LSQ_DEBUG("HQ frame type 0x%"PRIX64" at offset %"PRIu64", size %"PRIu64, + filter->hqfi_type, stream->read_offset + (unsigned) (p - buf), + filter->hqfi_left); + if (0 != update_type_hist_and_check(filter)) + { + lconn = stream->conn_pub->lconn; + filter->hqfi_flags |= HQFI_FLAG_ERROR; + LSQ_INFO("unexpected HTTP/3 frame sequence: %o", + filter->hqfi_hist_buf); + lconn->cn_if->ci_abort_error(lconn, 1, HEC_UNEXPECTED_FRAME, + "unexpected HTTP/3 frame sequence on stream %"PRIu64, + stream->id); + goto end; + } + if (filter->hqfi_type == HQFT_HEADERS) + { + if (0 == (filter->hqfi_flags & HQFI_FLAG_GOT_HEADERS)) + filter->hqfi_flags |= HQFI_FLAG_GOT_HEADERS; + else + { + filter->hqfi_type = (1ull << 62) - 1; + LSQ_DEBUG("Ignoring HEADERS frame"); + } + } + if (filter->hqfi_left > 0) + { + if (filter->hqfi_type == HQFT_DATA) + goto end; + else if (filter->hqfi_type == HQFT_PUSH_PROMISE) + { + lconn = stream->conn_pub->lconn; + if (stream->sm_bflags & SMBF_SERVER) + lconn->cn_if->ci_abort_error(lconn, 1, + HEC_UNEXPECTED_FRAME, "Received PUSH_PROMISE frame " + "on stream %"PRIu64" (clients are not supposed to " + "send those)", stream->id); + else + /* Our client implementation does not support server + * push. + */ + lconn->cn_if->ci_abort_error(lconn, 1, + HEC_UNEXPECTED_FRAME, /* TODO: in ID-21 ID_ERROR? */ + "Received PUSH_PROMISE frame (not supported)" + "on stream %"PRIu64, stream->id); + goto end; + } + } + else + { + switch (filter->hqfi_type) + { + case HQFT_CANCEL_PUSH: + case HQFT_GOAWAY: + case HQFT_HEADERS: + case HQFT_MAX_PUSH_ID: + case HQFT_PRIORITY: + case HQFT_PUSH_PROMISE: + case HQFT_SETTINGS: + filter->hqfi_flags |= HQFI_FLAG_ERROR; + LSQ_INFO("HQ frame of type %"PRIu64" cannot be size 0", + filter->hqfi_type); + abort_connection(stream); /* XXX Overkill? */ + goto end; + default: + filter->hqfi_flags &= ~HQFI_FLAG_BEGIN; + filter->hqfi_state = HQFI_STATE_FRAME_HEADER_BEGIN; + break; + } + } + break; + case HQFI_STATE_READING_PAYLOAD: + if (filter->hqfi_type == HQFT_DATA) + goto end; + sz = filter->hqfi_left; + if (sz > (uintptr_t) (end - p)) + sz = (uintptr_t) (end - p); + switch (filter->hqfi_type) + { + case HQFT_HEADERS: + prev = p; + if (filter->hqfi_flags & HQFI_FLAG_BEGIN) + { + filter->hqfi_flags &= ~HQFI_FLAG_BEGIN; + rhs = lsquic_qdh_header_in_begin( + stream->conn_pub->u.ietf.qdh, + stream, filter->hqfi_left, &p, sz); + } + else + rhs = lsquic_qdh_header_in_continue( + stream->conn_pub->u.ietf.qdh, stream, &p, sz); + assert(p > prev || LQRHS_ERROR == rhs); + filter->hqfi_left -= p - prev; + if (filter->hqfi_left == 0) + filter->hqfi_state = HQFI_STATE_FRAME_HEADER_BEGIN; + switch (rhs) + { + case LQRHS_DONE: + assert(filter->hqfi_left == 0); + stream->sm_qflags &= ~SMQF_QPACK_DEC; + break; + case LQRHS_NEED: + stream->sm_qflags |= SMQF_QPACK_DEC; + break; + case LQRHS_BLOCKED: + stream->sm_qflags |= SMQF_QPACK_DEC; + filter->hqfi_flags |= HQFI_FLAG_BLOCKED; + goto end; + default: + assert(LQRHS_ERROR == rhs); + filter->hqfi_flags |= HQFI_FLAG_ERROR; + LSQ_INFO("error processing header block"); + abort_connection(stream); /* XXX Overkill? */ + goto end; + } + break; + default: + /* Simply skip unknown frame type payload for now */ + filter->hqfi_flags &= ~HQFI_FLAG_BEGIN; + p += sz; + filter->hqfi_left -= sz; + if (filter->hqfi_left == 0) + filter->hqfi_state = HQFI_STATE_FRAME_HEADER_BEGIN; + break; + } + break; + default: + assert(0); + goto end; + } + } + + end: + if (fin && p == end && filter->hqfi_state != HQFI_STATE_FRAME_HEADER_BEGIN) + { + LSQ_INFO("FIN at unexpected place in filter; state: %u", + filter->hqfi_state); + filter->hqfi_flags |= HQFI_FLAG_ERROR; +/* From [draft-ietf-quic-http-16] Section 3.1: + * When a stream terminates cleanly, if the last frame on + * the stream was truncated, this MUST be treated as a connection error + * (see HTTP_MALFORMED_FRAME in Section 8.1). + */ + abort_connection(stream); + } + + return p - buf; +} + + +static int +hq_filter_readable_now (const struct lsquic_stream *stream) +{ + const struct hq_filter *const filter = &stream->sm_hq_filter; + + return (filter->hqfi_type == HQFT_DATA + && filter->hqfi_state == HQFI_STATE_READING_PAYLOAD) + || (filter->hqfi_flags & HQFI_FLAG_ERROR) + || stream->uh + || (stream->stream_flags & STREAM_FIN_REACHED) + ; +} + + +static int +hq_filter_readable (struct lsquic_stream *stream) +{ + struct hq_filter *const filter = &stream->sm_hq_filter; + struct read_frames_status rfs; + + if (filter->hqfi_flags & HQFI_FLAG_BLOCKED) + return 0; + + if (!hq_filter_readable_now(stream)) + { + rfs = read_data_frames(stream, 0, hq_read, stream); + if (rfs.total_nread == 0) + { + if (rfs.error) + { + filter->hqfi_flags |= HQFI_FLAG_ERROR; + abort_connection(stream); /* XXX Overkill? */ + return 1; /* Collect error */ + } + return 0; + } + } + + return hq_filter_readable_now(stream); +} + + +static size_t +hq_filter_df (struct lsquic_stream *stream, struct data_frame *data_frame) +{ + struct hq_filter *const filter = &stream->sm_hq_filter; + size_t nr; + + if (!(filter->hqfi_state == HQFI_STATE_READING_PAYLOAD + && filter->hqfi_type == HQFT_DATA)) + { + nr = hq_read(stream, data_frame->df_data + data_frame->df_read_off, + data_frame->df_size - data_frame->df_read_off, + data_frame->df_fin); + if (nr) + { + stream->read_offset += nr; + stream_consumed_bytes(stream); + } + } + else + nr = 0; + + if (0 == (filter->hqfi_flags & HQFI_FLAG_ERROR)) + { + data_frame->df_read_off += nr; + if (filter->hqfi_state == HQFI_STATE_READING_PAYLOAD + && filter->hqfi_type == HQFT_DATA) + return MIN(filter->hqfi_left, + (unsigned) data_frame->df_size - data_frame->df_read_off); + else + { + assert(data_frame->df_read_off == data_frame->df_size); + return 0; + } + } + else + { + data_frame->df_read_off = data_frame->df_size; + return 0; + } +} + + +static void +hq_decr_left (struct lsquic_stream *stream, size_t read) +{ + struct hq_filter *const filter = &stream->sm_hq_filter; + + if (read) + { + assert(filter->hqfi_state == HQFI_STATE_READING_PAYLOAD + && filter->hqfi_type == HQFT_DATA); + assert(read <= filter->hqfi_left); + } + + filter->hqfi_left -= read; + if (0 == filter->hqfi_left) + filter->hqfi_state = HQFI_STATE_FRAME_HEADER_BEGIN; +} + + +struct qpack_dec_hdl * +lsquic_stream_get_qdh (const struct lsquic_stream *stream) +{ + return stream->conn_pub->u.ietf.qdh; +} + + +/* These are IETF QUIC states */ +enum stream_state_sending +lsquic_stream_sending_state (const struct lsquic_stream *stream) +{ + if (0 == (stream->stream_flags & STREAM_RST_SENT)) + { + if (stream->stream_flags & STREAM_FIN_SENT) + { + if (stream->n_unacked) + return SSS_DATA_SENT; + else + return SSS_DATA_RECVD; + } + else + { + if (stream->tosend_off + || (stream->stream_flags & STREAM_BLOCKED_SENT)) + return SSS_SEND; + else + return SSS_READY; + } + } + else if (stream->stream_flags & STREAM_RST_ACKED) + return SSS_RESET_RECVD; + else + return SSS_RESET_SENT; +} + + +const char *const lsquic_sss2str[] = +{ + [SSS_READY] = "Ready", + [SSS_SEND] = "Send", + [SSS_DATA_SENT] = "Data Sent", + [SSS_RESET_SENT] = "Reset Sent", + [SSS_DATA_RECVD] = "Data Recvd", + [SSS_RESET_RECVD] = "Reset Recvd", +}; + + +const char *const lsquic_ssr2str[] = +{ + [SSR_RECV] = "Recv", + [SSR_SIZE_KNOWN] = "Size Known", + [SSR_DATA_RECVD] = "Data Recvd", + [SSR_RESET_RECVD] = "Reset Recvd", + [SSR_DATA_READ] = "Data Read", + [SSR_RESET_READ] = "Reset Read", +}; + + +/* These are IETF QUIC states */ +enum stream_state_receiving +lsquic_stream_receiving_state (struct lsquic_stream *stream) +{ + uint64_t n_bytes; + + if (0 == (stream->stream_flags & STREAM_RST_RECVD)) + { + if (0 == (stream->stream_flags & STREAM_FIN_RECVD)) + return SSR_RECV; + if (stream->stream_flags & STREAM_FIN_REACHED) + return SSR_DATA_READ; + if (0 == (stream->stream_flags & STREAM_DATA_RECVD)) + { + n_bytes = stream->data_in->di_if->di_readable_bytes( + stream->data_in, stream->read_offset); + if (stream->read_offset + n_bytes == stream->sm_fin_off) + { + stream->stream_flags |= STREAM_DATA_RECVD; + return SSR_DATA_RECVD; + } + else + return SSR_SIZE_KNOWN; + } + else + return SSR_DATA_RECVD; + } + else if (stream->stream_flags & STREAM_RST_READ) + return SSR_RESET_READ; + else + return SSR_RESET_RECVD; +} + + +void +lsquic_stream_qdec_unblocked (struct lsquic_stream *stream) +{ + struct hq_filter *const filter = &stream->sm_hq_filter; + + assert(stream->sm_qflags & SMQF_QPACK_DEC); + assert(filter->hqfi_flags & HQFI_FLAG_BLOCKED); + + filter->hqfi_flags &= ~HQFI_FLAG_BLOCKED; + stream->conn_pub->cp_flags |= CP_STREAM_UNBLOCKED; + LSQ_DEBUG("QPACK decoder unblocked"); +} + + +int +lsquic_stream_is_rejected (const struct lsquic_stream *stream) +{ + return stream->stream_flags & STREAM_SS_RECVD; +} + + +int +lsquic_stream_can_push (const struct lsquic_stream *stream) +{ + if (lsquic_stream_is_pushed(stream)) + return 0; + else if (stream->sm_bflags & SMBF_IETF) + return (stream->sm_bflags & SMBF_USE_HEADERS) + && !(stream->stream_flags & (STREAM_HEADERS_SENT|STREAM_NOPUSH)) + && stream->sm_send_headers_state == SSHS_BEGIN + ; + else + return 1; +} + + +static size_t +dp_reader_read (void *lsqr_ctx, void *buf, size_t count) +{ + struct lsquic_stream *const stream = lsqr_ctx; + unsigned char *dst = buf; + unsigned char *const end = buf + count; + size_t len; + + len = MIN((size_t) (stream->sm_dup_push_len - stream->sm_dup_push_off), + (size_t) (end - dst)); + memcpy(dst, stream->sm_dup_push_buf + stream->sm_dup_push_off, len); + stream->sm_dup_push_off += len; + + if (stream->sm_dup_push_len == stream->sm_dup_push_off) + LSQ_DEBUG("finish writing duplicate push"); + + return len; +} + + +static size_t +dp_reader_size (void *lsqr_ctx) +{ + struct lsquic_stream *const stream = lsqr_ctx; + + return stream->sm_dup_push_len - stream->sm_dup_push_off; +} + + +static void +init_dp_reader (struct lsquic_stream *stream, struct lsquic_reader *reader) +{ + reader->lsqr_read = dp_reader_read; + reader->lsqr_size = dp_reader_size; + reader->lsqr_ctx = stream; +} + + +static void +on_write_dp_wrapper (struct lsquic_stream *stream, lsquic_stream_ctx_t *h) +{ + struct lsquic_reader dp_reader; + ssize_t nw; + int want_write; + + assert(stream->sm_dup_push_off < stream->sm_dup_push_len); + + init_dp_reader(stream, &dp_reader); + nw = stream_write(stream, &dp_reader); + if (nw > 0) + { + LSQ_DEBUG("wrote %zd bytes more of duplicate push (%s)", + nw, stream->sm_dup_push_off == stream->sm_dup_push_len ? + "done" : "not done"); + if (stream->sm_dup_push_off == stream->sm_dup_push_len) + { + /* Restore want_write flag */ + want_write = !!(stream->sm_qflags & SMQF_WANT_WRITE); + if (want_write != stream->sm_saved_want_write) + (void) lsquic_stream_wantwrite(stream, + stream->sm_saved_want_write); + } + } + else if (nw < 0) + { + LSQ_WARN("could not write duplicate push (wrapper)"); + /* XXX What should happen if we hit an error? TODO */ + } +} + + +int +lsquic_stream_duplicate_push (struct lsquic_stream *stream, uint64_t push_id) +{ + struct lsquic_reader dp_reader; + unsigned bits, len; + ssize_t nw; + + assert(stream->sm_bflags & SMBF_IETF); + assert(lsquic_stream_can_push(stream)); + + bits = vint_val2bits(push_id); + len = 1 << bits; + + if (!stream_activate_hq_frame(stream, + stream->sm_payload + stream->sm_n_buffered, HQFT_DUPLICATE_PUSH, + SHF_FIXED_SIZE, len)) + return -1; + + stream->stream_flags |= STREAM_PUSHING; + + stream->sm_dup_push_len = len; + stream->sm_dup_push_off = 0; + vint_write(stream->sm_dup_push_buf, push_id, bits, 1 << bits); + + init_dp_reader(stream, &dp_reader); + nw = stream_write(stream, &dp_reader); + if (nw > 0) + { + if (stream->sm_dup_push_off == stream->sm_dup_push_len) + LSQ_DEBUG("fully wrote DUPLICATE_PUSH %"PRIu64, push_id); + else + { + LSQ_DEBUG("partially wrote DUPLICATE_PUSH %"PRIu64, push_id); + stream->stream_flags |= STREAM_NOPUSH; + stream->sm_saved_want_write = + !!(stream->sm_qflags & SMQF_WANT_WRITE); + stream_wantwrite(stream, 1); + } + return 0; + } + else + { + if (nw < 0) + LSQ_WARN("failure writing DUPLICATE_PUSH"); + stream->stream_flags |= STREAM_NOPUSH; + stream->stream_flags &= ~STREAM_PUSHING; + return -1; + } +} + + +static size_t +pp_reader_read (void *lsqr_ctx, void *buf, size_t count) +{ + struct push_promise *const promise = lsqr_ctx; + unsigned char *dst = buf; + unsigned char *const end = buf + count; + size_t len; + + while (dst < end) + { + switch (promise->pp_write_state) + { + case PPWS_ID0: + case PPWS_ID1: + case PPWS_ID2: + case PPWS_ID3: + case PPWS_ID4: + case PPWS_ID5: + case PPWS_ID6: + case PPWS_ID7: + *dst++ = promise->pp_encoded_push_id[promise->pp_write_state]; + ++promise->pp_write_state; + break; + case PPWS_PFX0: + *dst++ = 0; + ++promise->pp_write_state; + break; + case PPWS_PFX1: + *dst++ = 0; + ++promise->pp_write_state; + break; + case PPWS_HBLOCK: + len = MIN(promise->pp_content_len - promise->pp_write_off, + (size_t) (end - dst)); + memcpy(dst, promise->pp_content_buf + promise->pp_write_off, + len); + promise->pp_write_off += len; + dst += len; + if (promise->pp_content_len == promise->pp_write_off) + { + LSQ_LOG1(LSQ_LOG_DEBUG, "finish writing push promise %"PRIu64 + ": reset push state", promise->pp_id); + promise->pp_write_state = PPWS_DONE; + } + goto end; + default: + goto end; + } + } + + end: + return dst - (unsigned char *) buf; +} + + +static size_t +pp_reader_size (void *lsqr_ctx) +{ + struct push_promise *const promise = lsqr_ctx; + size_t size; + + size = 0; + switch (promise->pp_write_state) + { + case PPWS_ID0: + case PPWS_ID1: + case PPWS_ID2: + case PPWS_ID3: + case PPWS_ID4: + case PPWS_ID5: + case PPWS_ID6: + case PPWS_ID7: + size += 8 - promise->pp_write_state; + case PPWS_PFX0: + ++size; + /* fall-through */ + case PPWS_PFX1: + ++size; + /* fall-through */ + case PPWS_HBLOCK: + size += promise->pp_content_len - promise->pp_write_off; + break; + default: + break; + } + + return size; +} + + +static void +init_pp_reader (struct push_promise *promise, struct lsquic_reader *reader) +{ + reader->lsqr_read = pp_reader_read; + reader->lsqr_size = pp_reader_size; + reader->lsqr_ctx = promise; +} + + +static void +on_write_pp_wrapper (struct lsquic_stream *stream, lsquic_stream_ctx_t *h) +{ + struct lsquic_reader pp_reader; + struct push_promise *promise; + ssize_t nw; + int want_write; + + assert(stream_is_pushing_promise(stream)); + + promise = SLIST_FIRST(&stream->sm_promises); + init_pp_reader(promise, &pp_reader); + nw = stream_write(stream, &pp_reader); + if (nw > 0) + { + LSQ_DEBUG("wrote %zd bytes more of push promise (%s)", + nw, promise->pp_write_state == PPWS_DONE ? "done" : "not done"); + if (promise->pp_write_state == PPWS_DONE) + { + /* Restore want_write flag */ + want_write = !!(stream->sm_qflags & SMQF_WANT_WRITE); + if (want_write != stream->sm_saved_want_write) + (void) lsquic_stream_wantwrite(stream, + stream->sm_saved_want_write); + } + } + else if (nw < 0) + { + LSQ_WARN("could not write push promise (wrapper)"); + /* XXX What should happen if we hit an error? TODO */ + } +} + + +/* Success means that the push promise has been placed on sm_promises list and + * the stream now owns it. Failure means that the push promise should be + * destroyed by the caller. + * + * A push promise is written immediately. If it cannot be written to packets + * or buffered whole, the stream is marked as unable to push further promises. + */ +int +lsquic_stream_push_promise (struct lsquic_stream *stream, + struct push_promise *promise) +{ + struct lsquic_reader pp_reader; + unsigned bits, len; + ssize_t nw; + + assert(stream->sm_bflags & SMBF_IETF); + assert(lsquic_stream_can_push(stream)); + + bits = vint_val2bits(promise->pp_id); + len = 1 << bits; + promise->pp_write_state = 8 - len; + vint_write(promise->pp_encoded_push_id + 8 - len, promise->pp_id, + bits, 1 << bits); + + if (!stream_activate_hq_frame(stream, + stream->sm_payload + stream->sm_n_buffered, HQFT_PUSH_PROMISE, + SHF_FIXED_SIZE, pp_reader_size(promise))) + return -1; + + stream->stream_flags |= STREAM_PUSHING; + + init_pp_reader(promise, &pp_reader); + nw = stream_write(stream, &pp_reader); + if (nw > 0) + { + SLIST_INSERT_HEAD(&stream->sm_promises, promise, pp_next); + ++promise->pp_refcnt; + if (promise->pp_write_state == PPWS_DONE) + LSQ_DEBUG("fully wrote promise %"PRIu64, promise->pp_id); + else + { + LSQ_DEBUG("partially wrote promise %"PRIu64" (state: %d, off: %u)" + ", disable further pushing", promise->pp_id, + promise->pp_write_state, promise->pp_write_off); + stream->stream_flags |= STREAM_NOPUSH; + stream->sm_saved_want_write = + !!(stream->sm_qflags & SMQF_WANT_WRITE); + stream_wantwrite(stream, 1); + } + return 0; + } + else + { + if (nw < 0) + LSQ_WARN("failure writing push promise"); + stream->stream_flags |= STREAM_NOPUSH; + stream->stream_flags &= ~STREAM_PUSHING; + return -1; + } +} diff --git a/src/liblsquic/lsquic_stream.h b/src/liblsquic/lsquic_stream.h index 5a1bad3f5..83013a295 100644 --- a/src/liblsquic/lsquic_stream.h +++ b/src/liblsquic/lsquic_stream.h @@ -2,19 +2,27 @@ #ifndef LSQUIC_STREAM_H #define LSQUIC_STREAM_H -#define LSQUIC_STREAM_HANDSHAKE 1 -#define LSQUIC_STREAM_HEADERS 3 +#define LSQUIC_GQUIC_STREAM_HANDSHAKE 1 +#define LSQUIC_GQUIC_STREAM_HEADERS 3 #define LSQUIC_STREAM_DEFAULT_PRIO 16 /* RFC 7540, Section 5.3.5 */ + struct lsquic_stream_if; struct lsquic_stream_ctx; struct lsquic_conn_public; struct stream_frame; struct uncompressed_headers; +enum enc_level; +enum swtp_status; +struct frame_gen_ctx; +struct data_frame; +enum quic_frame_type; +struct push_promise; TAILQ_HEAD(lsquic_streams_tailq, lsquic_stream); + #ifndef LSQUIC_KEEP_STREAM_HISTORY # ifdef NDEBUG # define LSQUIC_KEEP_STREAM_HISTORY 0 @@ -23,68 +31,209 @@ TAILQ_HEAD(lsquic_streams_tailq, lsquic_stream); # endif #endif + #if LSQUIC_KEEP_STREAM_HISTORY #define SM_HIST_BITS 6 #define SM_HIST_IDX_MASK ((1 << SM_HIST_BITS) - 1) typedef unsigned char sm_hist_idx_t; #endif -struct lsquic_stream + +/* + * +----------+----------------------------------+ + * | Low Bits | Stream Type | + * +----------+----------------------------------+ + * | 0x0 | Client-Initiated, Bidirectional | + * | | | + * | 0x1 | Server-Initiated, Bidirectional | + * | | | + * | 0x2 | Client-Initiated, Unidirectional | + * | | | + * | 0x3 | Server-Initiated, Unidirectional | + * +----------+----------------------------------+ + */ + +enum stream_id_type +{ + SIT_BIDI_CLIENT, + SIT_BIDI_SERVER, + SIT_UNI_CLIENT, + SIT_UNI_SERVER, + N_SITS +}; + +#define SIT_MASK (N_SITS - 1) + +#define SIT_SHIFT 2 +#define SD_SHIFT 1 + +enum stream_dir { SD_BIDI, SD_UNI, N_SDS }; + + +struct stream_hq_frame { - uint32_t id; - enum stream_flags { - STREAM_WANT_READ = (1 << 0), - STREAM_WANT_WRITE = (1 << 1), - STREAM_FIN_RECVD = (1 << 2), /* Received STREAM frame with FIN bit set */ - STREAM_RST_RECVD = (1 << 3), /* Received RST frame */ - STREAM_SEND_WUF = (1 << 4), /* WUF: Window Update Frame */ - STREAM_LAST_WRITE_OK= (1 << 5), /* Used to break out of write event dispatch loop */ - STREAM_SEND_BLOCKED = (1 << 6), - STREAM_SEND_RST = (1 << 7), /* Error: want to send RST_STREAM */ - STREAM_U_READ_DONE = (1 << 8), /* User is done reading (shutdown was called) */ - STREAM_U_WRITE_DONE = (1 << 9), /* User is done writing (shutdown was called) */ - STREAM_FIN_SENT = (1 <<10), /* FIN was written to network */ - STREAM_RST_SENT = (1 <<11), /* RST_STREAM was written to network */ - STREAM_WANT_FLUSH = (1 <<12), /* Flush until sm_flush_to is hit */ - STREAM_FIN_REACHED = (1 <<13), /* User read data up to FIN */ - STREAM_FINISHED = (1 <<14), /* Stream is finished */ - STREAM_ONCLOSE_DONE = (1 <<15), /* on_close has been called */ - STREAM_CALL_ONCLOSE = (1 <<16), - STREAM_FREE_STREAM = (1 <<17), - STREAM_USE_HEADERS = (1 <<18), - STREAM_HEADERS_SENT = (1 <<19), - STREAM_HAVE_UH = (1 <<20), /* Have uncompressed headers */ - STREAM_CONN_LIMITED = (1 <<21), - STREAM_HEAD_IN_FIN = (1 <<22), /* Incoming headers has FIN bit set */ - STREAM_ABORT_CONN = (1 <<23), /* Unrecoverable error occurred */ - STREAM_FRAMES_ELIDED= (1 <<24), - STREAM_FORCE_FINISH = (1 <<25), /* Replaces FIN sent and received */ - STREAM_ONNEW_DONE = (1 <<26), /* on_new_stream has been called */ - STREAM_AUTOSWITCH = (1 <<27), - STREAM_RW_ONCE = (1 <<28), /* When set, read/write events are dispatched once per call */ - STREAM_CRITICAL = (1 <<29), - STREAM_HDRS_FLUSHED = (1 <<30), /* Only used in buffered packets mode */ - } stream_flags; + STAILQ_ENTRY(stream_hq_frame) + shf_next; + /* At which point in the stream (sm_payload) to insert the HQ frame. */ + uint64_t shf_off; + union { + /* Points to the frame if SHF_FIXED_SIZE is not set */ + unsigned char *frame_ptr; + /* If SHF_FIXED_SIZE is set, the size of the frame to follow. + * Non-fixed frame size gets calculated using sm_payload when they + * are closed. + */ + size_t frame_size; + } shf_u; +#define shf_frame_ptr shf_u.frame_ptr +#define shf_frame_size shf_u.frame_size + enum hq_frame_type shf_frame_type:8; + enum shf_flags { + SHF_TWO_BYTES = 1 << 0, /* Use two byte to encode frame length */ + SHF_FIXED_SIZE = 1 << 1, /* Payload size guaranteed */ + SHF_ACTIVE = 1 << 2, /* On sm_hq_frames list */ + SHF_WRITTEN = 1 << 3, /* Framing bytes have been packetized */ + SHF_CC_PAID = 1 << 4, /* Paid connection cap */ + SHF_PHANTOM = 1 << 5, /* Phantom frame headers are not written */ + } shf_flags:8; +}; + + +struct hq_filter +{ + struct varint_read2_state hqfi_vint_state; + /* No need to copy the values: use it directly */ +#define hqfi_left hqfi_vint_state.vr2s_two +#define hqfi_type hqfi_vint_state.vr2s_one + enum { + HQFI_FLAG_GOT_HEADERS = 1 << 0, + HQFI_FLAG_ERROR = 1 << 1, + HQFI_FLAG_BEGIN = 1 << 2, + HQFI_FLAG_BLOCKED = 1 << 3, + } hqfi_flags:8; + enum { + HQFI_STATE_FRAME_HEADER_BEGIN, + HQFI_STATE_FRAME_HEADER_CONTINUE, + HQFI_STATE_READING_PAYLOAD, + } hqfi_state:8; + unsigned char hqfi_hist_idx; +#define MAX_HQFI_ENTRIES (sizeof(unsigned) * 8 / 3) + unsigned hqfi_hist_buf; +}; + + +struct stream_filter_if +{ + int (*sfi_readable)(struct lsquic_stream *); + size_t (*sfi_filter_df)(struct lsquic_stream *, struct data_frame *); + void (*sfi_decr_left)(struct lsquic_stream *, size_t); +}; + + +/* These flags indicate which queues -- or other entities -- currently + * reference the stream. + */ +enum stream_q_flags +{ + /* read_streams: */ + SMQF_WANT_READ = 1 << 0, + + /* write_streams: */ +#define SMQF_WRITE_Q_FLAGS (SMQF_WANT_FLUSH|SMQF_WANT_WRITE) + SMQF_WANT_WRITE = 1 << 1, + SMQF_WANT_FLUSH = 1 << 2, /* Flush until sm_flush_to is hit */ /* There are more than one reason that a stream may be put onto * connections's sending_streams queue. Note that writing STREAM * frames is done separately. */ - #define STREAM_SENDING_FLAGS (STREAM_SEND_WUF| \ - STREAM_SEND_RST|STREAM_SEND_BLOCKED) +#define SMQF_SENDING_FLAGS (SMQF_SEND_WUF|SMQF_SEND_RST|SMQF_SEND_BLOCKED) + /* sending_streams: */ + SMQF_SEND_WUF = 1 << 3, /* WUF: Window Update Frame */ + SMQF_SEND_BLOCKED = 1 << 4, + SMQF_SEND_RST = 1 << 5, /* Error: want to send RST_STREAM */ + + /* The equivalent of WINDOW_UPDATE frame for streams in IETF QUIC is + * the MAX_STREAM_DATA frame. Define an alias for use in the IETF + * QUIC code: + */ +#define SMQF_SEND_MAX_STREAM_DATA SMQF_SEND_WUF - #define STREAM_WRITE_Q_FLAGS (STREAM_WANT_FLUSH|STREAM_WANT_WRITE) +#define SMQF_SERVICE_FLAGS (SMQF_CALL_ONCLOSE|SMQF_FREE_STREAM|SMQF_ABORT_CONN) + SMQF_CALL_ONCLOSE = 1 << 6, + SMQF_FREE_STREAM = 1 << 7, + SMQF_ABORT_CONN = 1 << 8, /* Unrecoverable error occurred */ - /* Any of these flags will cause user-facing read and write and - * shutdown calls to return an error. They also make the stream - * both readable and writeable, as we want the user to collect - * the error. - */ - #define STREAM_RST_FLAGS (STREAM_RST_RECVD|STREAM_RST_SENT|\ - STREAM_SEND_RST) + SMQF_QPACK_DEC = 1 << 9, /* QPACK decoder is holding a reference to this stream */ + + SMQF_H3_PRIO = 1 <<10, /* Referenced from HTTP/3 priority tree */ +}; + + +/* Stream behavior flags */ +enum stream_b_flags +{ + SMBF_SERVER = 1 << 0, + SMBF_IETF = 1 << 1, + SMBF_USE_HEADERS = 1 << 2, + SMBF_CRYPTO = 1 << 3, + SMBF_CRITICAL = 1 << 4, /* This is a critical stream */ + SMBF_AUTOSWITCH = 1 << 5, + SMBF_RW_ONCE = 1 << 6, /* When set, read/write events are dispatched once per call */ + SMBF_CONN_LIMITED = 1 << 7, +#define N_SMBF_FLAGS 8 +}; + + +enum stream_flags { + STREAM_FIN_RECVD = 1 << 0, /* Received STREAM frame with FIN bit set */ + STREAM_RST_RECVD = 1 << 1, /* Received RST frame */ + STREAM_LAST_WRITE_OK= 1 << 2, /* Used to break out of write event dispatch loop */ + STREAM_U_READ_DONE = 1 << 3, /* User is done reading (shutdown was called) */ + STREAM_U_WRITE_DONE = 1 << 4, /* User is done writing (shutdown was called) */ + STREAM_FIN_SENT = 1 << 5, /* FIN was written to network */ + STREAM_RST_SENT = 1 << 6, /* RST_STREAM was written to network */ + STREAM_FIN_REACHED = 1 << 7, /* User read data up to FIN */ + STREAM_FINISHED = 1 << 8, /* Stream is finished */ + STREAM_ONCLOSE_DONE = 1 << 9, /* on_close has been called */ + STREAM_UNUSED10 = 1 << 10, /* Unused */ + STREAM_HEADERS_SENT = 1 << 11, + STREAM_HAVE_UH = 1 << 12, /* Have uncompressed headers */ + STREAM_UNUSED13 = 1 << 13, /* Unused */ + STREAM_HEAD_IN_FIN = 1 << 14, /* Incoming headers has FIN bit set */ + STREAM_FRAMES_ELIDED= 1 << 15, + STREAM_FORCE_FINISH = 1 << 16, /* Replaces FIN sent and received */ + STREAM_ONNEW_DONE = 1 << 17, /* on_new_stream has been called */ + STREAM_PUSHING = 1 << 18, + STREAM_NOPUSH = 1 << 19, /* Disallow further push promises */ + STREAM_UNUSED20 = 1 << 20, /* Unused */ + STREAM_UNUSED21 = 1 << 21, /* Unused */ + STREAM_RST_ACKED = 1 << 22, /* Packet containing RST has been acked */ + STREAM_BLOCKED_SENT = 1 << 23, /* Stays set once a STREAM_BLOCKED frame is sent */ + STREAM_RST_READ = 1 << 24, /* User code collected the error */ + STREAM_DATA_RECVD = 1 << 25, /* Cache stream state calculation */ + STREAM_UNUSED26 = 1 << 26, /* Unused */ + STREAM_HDRS_FLUSHED = 1 << 27, /* Only used in buffered packets mode */ + STREAM_SS_RECVD = 1 << 28, /* Received STOP_SENDING frame */ + STREAM_DELAYED_SW = 1 << 29, /* Delayed shutdown_write call */ +}; + + +/* By keeping this number low, we make sure that the code to allocate HQ + * frames dynamically gets exercised whenever push promises are sent. + */ +#define NUM_ALLOCED_HQ_FRAMES 2 - #define STREAM_SERVICE_FLAGS (STREAM_CALL_ONCLOSE|STREAM_FREE_STREAM|\ - STREAM_ABORT_CONN) + +struct lsquic_stream +{ + struct lsquic_hash_elem sm_hash_el; + lsquic_stream_id_t id; + enum stream_flags stream_flags; + enum stream_b_flags sm_bflags; + enum stream_q_flags sm_qflags; + unsigned n_unacked; + unsigned sm_h3_prio_idx; const struct lsquic_stream_if *stream_if; struct lsquic_stream_ctx *st_ctx; @@ -93,9 +242,11 @@ struct lsquic_stream next_write_stream, next_service_stream, next_prio_stream; - uint32_t error_code; uint64_t tosend_off; + uint64_t sm_payload; /* Not counting HQ frames */ uint64_t max_send_off; + uint64_t sm_last_recv_off; + uint64_t error_code; /* From the network, we get frames, which we keep on a list ordered * by offset. @@ -104,9 +255,29 @@ struct lsquic_stream uint64_t read_offset; lsquic_sfcw_t fc; - /** If @ref STREAM_WANT_FLUSH is set, flush until this offset. */ + /* List of active HQ frames */ + STAILQ_HEAD(, stream_hq_frame) sm_hq_frames; + + /* For efficiency, several frames are allocated as part of the stream + * itself. If more frames are needed, they are allocated. + */ + struct stream_hq_frame sm_hq_frame_arr[NUM_ALLOCED_HQ_FRAMES]; + + struct hq_filter sm_hq_filter; + + /* We can safely use sm_hq_filter */ +#define sm_uni_type_state sm_hq_filter.hqfi_vint_state.vr2s_varint_state + + /** If @ref SMQF_WANT_FLUSH is set, flush until this offset. */ uint64_t sm_flush_to; + /** + * If @ref SMQF_WANT_FLUSH is set, this indicates payload offset + * to flush to. Used to adjust @ref sm_flush_to when H3 frame + * size grows. + */ + uint64_t sm_flush_to_payload; + /* Last offset sent in BLOCKED frame */ uint64_t blocked_off; @@ -116,10 +287,54 @@ struct lsquic_stream unsigned char *sm_buf; void *sm_onnew_arg; - unsigned n_unacked; + unsigned char *sm_header_block; + uint64_t sm_hb_compl; + + /* Valid if STREAM_FIN_RECVD is set: */ + uint64_t sm_fin_off; + + /* A stream may be generating STREAM or CRYPTO frames */ + size_t (*sm_frame_header_sz)( + const struct lsquic_stream *, unsigned); + enum swtp_status (*sm_write_to_packet)(struct frame_gen_ctx *, + const size_t); + size_t (*sm_write_avail)(struct lsquic_stream *); + int (*sm_readable)(struct lsquic_stream *); + + /* This element is optional */ + const struct stream_filter_if *sm_sfi; + + /* sm_promise and sm_promises are never used at the same time and can + * be combined into a union should space in this struct become tight. + */ + /* Push promise that engendered this push stream */ + struct push_promise *sm_promise; + + /* Push promises sent on this stream */ + SLIST_HEAD(, push_promise) sm_promises; + + /* How much data there is in sm_header_block and how much of it has been + * sent: + */ + unsigned sm_hblock_sz, + sm_hblock_off; + unsigned short sm_n_buffered; /* Amount of data in sm_buf */ + unsigned short sm_n_allocated; /* Size of sm_buf */ unsigned char sm_priority; /* 0: high; 255: low */ + unsigned char sm_enc_level; + enum { + SSHS_BEGIN, /* Nothing has happened yet */ + SSHS_ENC_SENDING, /* Sending encoder stream data */ + SSHS_HBLOCK_SENDING,/* Sending header block data */ + } sm_send_headers_state:8; + signed char sm_saved_want_write; + + unsigned char sm_dup_push_off; + unsigned char sm_dup_push_len; + unsigned char sm_dup_push_buf[8]; + #if LSQUIC_KEEP_STREAM_HISTORY sm_hist_idx_t sm_hist_idx; #endif @@ -130,29 +345,35 @@ struct lsquic_stream #endif }; + enum stream_ctor_flags { - SCF_CALL_ON_NEW = (1 << 0), /* Call on_new_stream() immediately */ - SCF_USE_DI_HASH = (1 << 1), /* Use hash-based data input. If not set, + SCF_CALL_ON_NEW = (1 << (N_SMBF_FLAGS + 0)), /* Call on_new_stream() immediately */ + SCF_USE_DI_HASH = (1 << (N_SMBF_FLAGS + 1)), /* Use hash-based data input. If not set, * the nocopy data input is used. */ - SCF_DI_AUTOSWITCH = (1 << 2), /* Automatically switch between nocopy + SCF_DI_AUTOSWITCH = SMBF_AUTOSWITCH, /* Automatically switch between nocopy * and hash-based to data input for optimal * performance. */ - SCF_DISP_RW_ONCE = (1 << 3), - SCF_CRITICAL = (1 << 4), /* This is a critical stream */ + SCF_DISP_RW_ONCE = SMBF_RW_ONCE, + SCF_CRITICAL = SMBF_CRITICAL, /* This is a critical stream */ + SCF_IETF = SMBF_IETF, + SCF_HTTP = SMBF_USE_HEADERS, }; + lsquic_stream_t * -lsquic_stream_new_ext (uint32_t id, struct lsquic_conn_public *conn_pub, - const struct lsquic_stream_if *, void *stream_if_ctx, - unsigned initial_sfrw, unsigned initial_send_off, - enum stream_ctor_flags); +lsquic_stream_new (lsquic_stream_id_t id, struct lsquic_conn_public *, + const struct lsquic_stream_if *, void *stream_if_ctx, + unsigned initial_sfrw, uint64_t initial_send_off, + enum stream_ctor_flags); -#define lsquic_stream_new(id, pub, sm_if, sm_if_ctx, cfcw, send_off) \ - lsquic_stream_new_ext(id, pub, sm_if, sm_if_ctx, cfcw, send_off, \ - (SCF_CALL_ON_NEW|SCF_DI_AUTOSWITCH)) +struct lsquic_stream * +lsquic_stream_new_crypto (enum enc_level, + struct lsquic_conn_public *conn_pub, + const struct lsquic_stream_if *stream_if, void *stream_if_ctx, + enum stream_ctor_flags ctor_flags); void lsquic_stream_call_on_new (lsquic_stream_t *); @@ -160,8 +381,15 @@ lsquic_stream_call_on_new (lsquic_stream_t *); void lsquic_stream_destroy (lsquic_stream_t *); +/* Any of these flags will cause user-facing read and write and + * shutdown calls to return an error. They also make the stream + * both readable and writeable, as we want the user to collect + * the error. + */ #define lsquic_stream_is_reset(stream) \ - (!!((stream)->stream_flags & STREAM_RST_FLAGS)) + (((stream)->stream_flags & \ + (STREAM_RST_RECVD|STREAM_RST_SENT|STREAM_SS_RECVD)) \ + || ((stream)->sm_qflags & SMQF_SEND_RST)) /* Data that from the network gets inserted into the stream using * lsquic_stream_frame_in() function. Returns 0 on success, -1 on @@ -187,7 +415,10 @@ lsquic_stream_push_req (lsquic_stream_t *, struct uncompressed_headers *push_req); int -lsquic_stream_rst_in (lsquic_stream_t *, uint64_t offset, uint32_t error_code); +lsquic_stream_rst_in (lsquic_stream_t *, uint64_t offset, uint64_t error_code); + +void +lsquic_stream_stop_sending_in (struct lsquic_stream *, uint64_t error_code); ssize_t lsquic_stream_read (lsquic_stream_t *stream, void *buf, size_t len); @@ -210,14 +441,20 @@ void lsquic_stream_window_update (lsquic_stream_t *stream, uint64_t offset); int -lsquic_stream_set_max_send_off (lsquic_stream_t *stream, unsigned offset); +lsquic_stream_set_max_send_off (lsquic_stream_t *stream, uint64_t offset); -/* The caller should only call this function if STREAM_SEND_WUF is set and +/* The caller should only call this function if SMQF_SEND_WUF is set and * it must generate a window update frame using this value. */ uint64_t lsquic_stream_fc_recv_off (lsquic_stream_t *stream); +void +lsquic_stream_peer_blocked (struct lsquic_stream *, uint64_t); + +void +lsquic_stream_peer_blocked_gquic (struct lsquic_stream *); + void lsquic_stream_dispatch_read_events (lsquic_stream_t *); @@ -234,10 +471,10 @@ void lsquic_stream_stream_frame_sent (lsquic_stream_t *); void -lsquic_stream_reset (lsquic_stream_t *, uint32_t error_code); +lsquic_stream_reset (lsquic_stream_t *, uint64_t error_code); void -lsquic_stream_reset_ext (lsquic_stream_t *, uint32_t error_code, int close); +lsquic_stream_reset_ext (lsquic_stream_t *, uint64_t error_code, int close); void lsquic_stream_call_on_close (lsquic_stream_t *); @@ -249,7 +486,7 @@ void lsquic_stream_received_goaway (lsquic_stream_t *); void -lsquic_stream_acked (lsquic_stream_t *); +lsquic_stream_acked (struct lsquic_stream *, enum quic_frame_type); #define lsquic_stream_is_closed(s) \ (((s)->stream_flags & (STREAM_U_READ_DONE|STREAM_U_WRITE_DONE)) \ @@ -260,43 +497,94 @@ lsquic_stream_update_sfcw (lsquic_stream_t *, uint64_t max_off); int lsquic_stream_set_priority_internal (lsquic_stream_t *, unsigned priority); -/* The following flags are checked to see whether progress was made: */ -#define STREAM_RW_PROG_FLAGS ( \ - STREAM_U_READ_DONE /* User closed read side of the stream */ \ - |STREAM_FIN_REACHED /* User reached FIN. We check this because it */ \ - /* may have been a result of zero-byte read. */ \ -) - -/* Stream progress status is used to judge whether a connection made progress - * during Pending RW Queue processing. We only check for stream read progress, - * as the write progress is defined as any new data packetized for sending. - */ -struct stream_read_prog_status -{ - uint64_t srps_read_offset; - enum stream_flags srps_flags; -}; +int +lsquic_stream_id_is_critical (int use_http, lsquic_stream_id_t); -#define lsquic_stream_is_critical(stream) \ - ((stream)->stream_flags & STREAM_CRITICAL) +int +lsquic_stream_is_critical (const struct lsquic_stream *); size_t lsquic_stream_mem_used (const struct lsquic_stream *); -lsquic_cid_t +const lsquic_cid_t * lsquic_stream_cid (const struct lsquic_stream *); #define lsquic_stream_has_data_to_flush(stream) ((stream)->sm_n_buffered > 0) int -lsquic_stream_readable (const lsquic_stream_t *); +lsquic_stream_readable (struct lsquic_stream *); size_t -lsquic_stream_write_avail (const struct lsquic_stream *); +lsquic_stream_write_avail (struct lsquic_stream *); + +void +lsquic_stream_dump_state (const struct lsquic_stream *); #ifndef NDEBUG size_t -lsquic_stream_flush_threshold (const struct lsquic_stream *); +lsquic_stream_flush_threshold (const struct lsquic_stream *, unsigned); #endif +#define crypto_level(stream) (~0ULL - (stream)->id) + +void +lsquic_stream_set_stream_if (struct lsquic_stream *, + const struct lsquic_stream_if *, void *stream_if_ctx); + +struct qpack_dec_hdl * +lsquic_stream_get_qdh (const struct lsquic_stream *); + +uint64_t +lsquic_stream_combined_send_off (const struct lsquic_stream *); + +/* [draft-ietf-quic-transport-16] Section 3.1 */ +enum stream_state_sending +{ + SSS_READY, + SSS_SEND, + SSS_DATA_SENT, + SSS_RESET_SENT, + SSS_DATA_RECVD, + SSS_RESET_RECVD, +}; + +extern const char *const lsquic_sss2str[]; + +enum stream_state_sending +lsquic_stream_sending_state (const struct lsquic_stream *); + +/* [draft-ietf-quic-transport-16] Section 3.2 */ +enum stream_state_receiving +{ + SSR_RECV, + SSR_SIZE_KNOWN, + SSR_DATA_RECVD, + SSR_RESET_RECVD, + SSR_DATA_READ, + SSR_RESET_READ, +}; + +extern const char *const lsquic_ssr2str[]; + +enum stream_state_receiving +lsquic_stream_receiving_state (struct lsquic_stream *); + +uint64_t +lsquic_stream_fc_recv_off_const (const struct lsquic_stream *); + +void +lsquic_stream_max_stream_data_sent (struct lsquic_stream *); + +void +lsquic_stream_qdec_unblocked (struct lsquic_stream *); + +int +lsquic_stream_can_push (const struct lsquic_stream *); + +int +lsquic_stream_duplicate_push (struct lsquic_stream *, uint64_t push_id); + +int +lsquic_stream_push_promise (struct lsquic_stream *, struct push_promise *); + #endif diff --git a/src/liblsquic/lsquic_tokgen.c b/src/liblsquic/lsquic_tokgen.c new file mode 100644 index 000000000..1d947507b --- /dev/null +++ b/src/liblsquic/lsquic_tokgen.c @@ -0,0 +1,250 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "lsquic.h" +#include "lsquic_int_types.h" +#include "lsquic_sizes.h" +#include "lsquic_types.h" +#include "lsquic_packet_common.h" +#include "lsquic_packet_in.h" +#include "lsquic_tokgen.h" +#include "lsquic_trans_params.h" +#include "lsquic_util.h" +#include "lsquic_mm.h" +#include "lsquic_engine_public.h" + +#define LSQUIC_LOGGER_MODULE LSQLM_TOKGEN +#include "lsquic_logger.h" + +#define STRINGIFY(x) #x +#define TOSTRING(x) STRINGIFY(x) + +#define TOKGEN_VERSION 1 + +#define CRYPTER_KEY_SIZE 16 +#define SRST_MAX_PRK_SIZE EVP_MAX_MD_SIZE + +#define TOKGEN_SHM_KEY "TOKGEN" TOSTRING(TOKGEN_VERSION) +#define TOKGEN_SHM_KEY_SIZE (sizeof(TOKGEN_SHM_KEY) - 1) + +#define TOKGEN_SHM_MAGIC_TOP "Feliz" +#define TOKGEN_SHM_MAGIC_BOTTOM "Navidad" + +struct tokgen_shm_state +{ + uint8_t tgss_version; + uint8_t tgss_magic_top[sizeof(TOKGEN_SHM_MAGIC_TOP) - 1]; + uint8_t tgss_crypter_key[N_TOKEN_TYPES][CRYPTER_KEY_SIZE]; + uint8_t tgss_srst_prk_size; + uint8_t tgss_srst_prk[SRST_MAX_PRK_SIZE]; + uint8_t tgss_magic_bottom[sizeof(TOKGEN_SHM_MAGIC_BOTTOM) - 1]; +}; + + + +static const uint8_t srst_salt[8] = "\x28\x6e\x81\x02\x40\x5b\x2c\x2b"; + +struct crypter +{ + EVP_AEAD_CTX ctx; + unsigned long nonce_counter; + size_t nonce_prk_sz; + uint8_t nonce_prk_buf[EVP_MAX_MD_SIZE]; +}; + + +struct token_generator +{ + /* We encrypt different token types using different keys. */ + struct crypter tg_crypters[N_TOKEN_TYPES]; + + /* Stateless reset token is generated using HKDF with CID as the + * `info' parameter to HKDF-Expand. + */ + size_t tg_srst_prk_sz; + uint8_t tg_srst_prk_buf[SRST_MAX_PRK_SIZE]; +}; + + + + +static int +get_or_generate_state (struct lsquic_engine_public *enpub, time_t now, + struct tokgen_shm_state *shm_state) +{ + const struct lsquic_shared_hash_if *const shi = enpub->enp_shi; + void *const ctx = enpub->enp_shi_ctx; + void *data, *copy, *key_copy; + int s; + unsigned sz; + size_t bufsz; + struct { + time_t now; + unsigned char buf[20]; + } srst_ikm; + + data = shm_state; + sz = sizeof(shm_state); + s = shi->shi_lookup(ctx, TOKGEN_SHM_KEY, TOKGEN_SHM_KEY_SIZE, &data, &sz); + + if (s == 1) + { + if (sz != sizeof(*shm_state)) + { + LSQ_WARN("found SHM data has non-matching size %u", sz); + return -1; + } + if (data != (void *) shm_state) + memcpy(shm_state, data, sizeof(*shm_state)); + if (shm_state->tgss_version != TOKGEN_VERSION) + { + LSQ_DEBUG("found SHM data has non-matching version %u", + shm_state->tgss_version); + return -1; + } + LSQ_DEBUG("found SHM data: size %u; version %u", sz, + shm_state->tgss_version); + return 0; + } + + if (s != 0) + { + if (s != -1) + LSQ_WARN("SHM lookup returned unexpected value %d", s); + LSQ_DEBUG("SHM lookup returned an error: generate"); + goto generate; + } + + assert(s == 0); + LSQ_DEBUG("%s does not exist: generate", TOKGEN_SHM_KEY); + generate: + now = time(NULL); + memset(shm_state, 0, sizeof(*shm_state)); + shm_state->tgss_version = TOKGEN_VERSION; + memcpy(shm_state->tgss_magic_top, TOKGEN_SHM_MAGIC_TOP, + sizeof(TOKGEN_SHM_MAGIC_TOP) - 1); + if (getenv("LSQUIC_NULL_TOKGEN")) + { + memset(&srst_ikm, 0, sizeof(srst_ikm)); + LSQ_NOTICE("using NULL tokgen"); + } + else + { + srst_ikm.now = now; + RAND_bytes(srst_ikm.buf, sizeof(srst_ikm.buf)); + } + if (!HKDF_extract(shm_state->tgss_srst_prk, &bufsz, + EVP_sha256(), (uint8_t *) &srst_ikm, sizeof(srst_ikm), + srst_salt, sizeof(srst_salt))) + { + LSQ_ERROR("HKDF_extract failed"); + return -1; + } + shm_state->tgss_srst_prk_size = (uint8_t) bufsz; + memcpy(shm_state->tgss_magic_bottom, TOKGEN_SHM_MAGIC_BOTTOM, + sizeof(TOKGEN_SHM_MAGIC_BOTTOM) - 1); + + data = malloc(sizeof(*shm_state)); + if (!data) + { + LSQ_ERROR("%s: malloc", __func__); + return -1; + } + memcpy(data, shm_state, sizeof(*shm_state)); + key_copy = malloc(TOKGEN_SHM_KEY_SIZE); + if (!key_copy) + { + LSQ_ERROR("%s: malloc", __func__); + free(data); + return -1; + } + memcpy(key_copy, TOKGEN_SHM_KEY, TOKGEN_SHM_KEY_SIZE); + s = shi->shi_insert(ctx, key_copy, TOKGEN_SHM_KEY_SIZE, data, + sizeof(*shm_state), 0); + if (s != 0) + { + LSQ_ERROR("cannot insert into SHM"); + free(data); + free(key_copy); + return -1; + } + sz = sizeof(*shm_state); + s = shi->shi_lookup(ctx, TOKGEN_SHM_KEY, TOKGEN_SHM_KEY_SIZE, ©, &sz); + if (s != 1 || sz != sizeof(*shm_state)) + { + LSQ_ERROR("cannot lookup after insert: s=%d; sz=%u", s, sz); + return -1; + } + if (copy != data) + memcpy(shm_state, copy, sizeof(*shm_state)); + LSQ_INFO("inserted %s of size %u", TOKGEN_SHM_KEY, sz); + return 0; +} + + +struct token_generator * +lsquic_tg_new (struct lsquic_engine_public *enpub) +{ + struct token_generator *tokgen; + time_t now; + struct tokgen_shm_state shm_state; + + tokgen = calloc(1, sizeof(*tokgen)); + if (!tokgen) + goto err; + + now = time(NULL); + if (0 != get_or_generate_state(enpub, now, &shm_state)) + goto err; + + + tokgen->tg_srst_prk_sz = shm_state.tgss_srst_prk_size; + if (tokgen->tg_srst_prk_sz > sizeof(tokgen->tg_srst_prk_buf)) + { + LSQ_WARN("bad stateless reset key size"); + goto err; + } + memcpy(tokgen->tg_srst_prk_buf, shm_state.tgss_srst_prk, + tokgen->tg_srst_prk_sz); + + LSQ_DEBUG("initialized"); + return tokgen; + + err: + LSQ_ERROR("error initializing"); + free(tokgen); + return NULL; +} + + +void +lsquic_tg_destroy (struct token_generator *tokgen) +{ + free(tokgen); + LSQ_DEBUG("destroyed"); +} + + +void +lsquic_tg_generate_sreset (struct token_generator *tokgen, + const struct lsquic_cid *cid, unsigned char *reset_token) +{ + char str[IQUIC_SRESET_TOKEN_SZ * 2 + 1]; + + (void) HKDF_expand(reset_token, IQUIC_SRESET_TOKEN_SZ, EVP_sha256(), + tokgen->tg_srst_prk_buf, tokgen->tg_srst_prk_sz, cid->idbuf, cid->len); + LSQ_DEBUGC("generated stateless reset token %s for CID %"CID_FMT, + HEXSTR(reset_token, IQUIC_SRESET_TOKEN_SZ, str), CID_BITS(cid)); +} diff --git a/src/liblsquic/lsquic_tokgen.h b/src/liblsquic/lsquic_tokgen.h new file mode 100644 index 000000000..5bc6df236 --- /dev/null +++ b/src/liblsquic/lsquic_tokgen.h @@ -0,0 +1,25 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#ifndef LSQUIC_TOKEN_H +#define LSQUIC_TOKEN_H 1 + +struct lsquic_engine_public; +struct sockaddr; +struct lsquic_packet_in; +struct lsquic_cid; + +enum token_type { TOKEN_RETRY, TOKEN_RESUME, N_TOKEN_TYPES, }; + +struct token_generator; + +struct token_generator * +lsquic_tg_new (struct lsquic_engine_public *); + +void +lsquic_tg_destroy (struct token_generator *); + +/* `reset_token' must be IQUIC_SRESET_TOKEN_SZ bytes in length */ +void +lsquic_tg_generate_sreset (struct token_generator *, + const struct lsquic_cid *cid, unsigned char *reset_token); + +#endif diff --git a/src/liblsquic/lsquic_trans_params.c b/src/liblsquic/lsquic_trans_params.c new file mode 100644 index 000000000..e4c4b14f6 --- /dev/null +++ b/src/liblsquic/lsquic_trans_params.c @@ -0,0 +1,528 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_trans_params.c + */ + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "lsquic_byteswap.h" +#include "lsquic_int_types.h" +#include "lsquic_types.h" +#include "lsquic_version.h" +#include "lsquic_sizes.h" +#include "lsquic_trans_params.h" +#include "lsquic_util.h" +#include "lsquic_varint.h" + +#define LSQUIC_LOGGER_MODULE LSQLM_TRAPA +#include "lsquic_logger.h" + + +static const uint64_t def_vals[MAX_TPI + 1] = +{ + [TPI_MAX_PACKET_SIZE] = TP_DEF_MAX_PACKET_SIZE, + [TPI_ACK_DELAY_EXPONENT] = TP_DEF_ACK_DELAY_EXP, + [TPI_INIT_MAX_STREAMS_UNI] = TP_DEF_INIT_MAX_STREAMS_UNI, + [TPI_INIT_MAX_STREAMS_BIDI] = TP_DEF_INIT_MAX_STREAMS_BIDI, + [TPI_INIT_MAX_DATA] = TP_DEF_INIT_MAX_DATA, + [TPI_INIT_MAX_STREAM_DATA_BIDI_LOCAL] = TP_DEF_INIT_MAX_STREAM_DATA_BIDI_LOCAL, + [TPI_INIT_MAX_STREAM_DATA_BIDI_REMOTE] = TP_DEF_INIT_MAX_STREAM_DATA_BIDI_REMOTE, + [TPI_INIT_MAX_STREAM_DATA_UNI] = TP_DEF_INIT_MAX_STREAM_DATA_UNI, + [TPI_IDLE_TIMEOUT] = TP_DEF_IDLE_TIMEOUT, + [TPI_MAX_ACK_DELAY] = TP_DEF_MAX_ACK_DELAY, + [TPI_ACTIVE_CONNECTION_ID_LIMIT] = TP_DEF_ACTIVE_CONNECTION_ID_LIMIT, +}; + + +static const uint64_t max_vals[MAX_TPI + 1] = +{ + [TPI_MAX_PACKET_SIZE] = VINT_MAX_VALUE, + [TPI_ACK_DELAY_EXPONENT] = VINT_MAX_VALUE, + [TPI_INIT_MAX_STREAMS_UNI] = VINT_MAX_VALUE, + [TPI_INIT_MAX_STREAMS_BIDI] = VINT_MAX_VALUE, + [TPI_INIT_MAX_DATA] = VINT_MAX_VALUE, + [TPI_INIT_MAX_STREAM_DATA_BIDI_LOCAL] = VINT_MAX_VALUE, + [TPI_INIT_MAX_STREAM_DATA_BIDI_REMOTE] = VINT_MAX_VALUE, + [TPI_INIT_MAX_STREAM_DATA_UNI] = VINT_MAX_VALUE, + [TPI_IDLE_TIMEOUT] = VINT_MAX_VALUE, + [TPI_MAX_ACK_DELAY] = TP_MAX_MAX_ACK_DELAY, + [TPI_ACTIVE_CONNECTION_ID_LIMIT] = VINT_MAX_VALUE, +}; + + +#define TP_OFF(name_) ((uint64_t *) &((struct transport_params *) 0 \ + )->tp_numerics_u.s.name_ - (uint64_t *) &((struct transport_params *) \ + 0)->tp_numerics_u.s) + +/* Map enum transport_params to index of tp_numerics_u.a; for numeric values only */ +static const unsigned tpi2idx[MAX_TPI + 1] = +{ + [TPI_MAX_PACKET_SIZE] = TP_OFF(max_packet_size), + [TPI_ACK_DELAY_EXPONENT] = TP_OFF(ack_delay_exponent), + [TPI_INIT_MAX_STREAMS_UNI] = TP_OFF(init_max_streams_uni), + [TPI_INIT_MAX_STREAMS_BIDI] = TP_OFF(init_max_streams_bidi), + [TPI_INIT_MAX_DATA] = TP_OFF(init_max_data), + [TPI_INIT_MAX_STREAM_DATA_BIDI_LOCAL] = TP_OFF(init_max_stream_data_bidi_local), + [TPI_INIT_MAX_STREAM_DATA_BIDI_REMOTE] = TP_OFF(init_max_stream_data_bidi_remote), + [TPI_INIT_MAX_STREAM_DATA_UNI] = TP_OFF(init_max_stream_data_uni), + [TPI_IDLE_TIMEOUT] = TP_OFF(idle_timeout), + [TPI_MAX_ACK_DELAY] = TP_OFF(max_ack_delay), + [TPI_ACTIVE_CONNECTION_ID_LIMIT] = TP_OFF(active_connection_id_limit), +}; + + +static size_t +preferred_address_size (const struct transport_params *params) +{ + return sizeof(params->tp_preferred_address.ipv4_addr) + + sizeof(params->tp_preferred_address.ipv4_port) + + sizeof(params->tp_preferred_address.ipv6_addr) + + sizeof(params->tp_preferred_address.ipv6_port) + + 1 + params->tp_preferred_address.cid.len + + sizeof(params->tp_preferred_address.srst) + ; +} + + +int +lsquic_tp_encode (const struct transport_params *params, + unsigned char *const buf, size_t bufsz) +{ + unsigned char *p; + size_t need = 2; + uint16_t u16; + enum transport_param_id tpi; + unsigned bits[MAX_TPI + 1]; + + if (params->tp_flags & TRAPA_SERVER) + { + if (params->tp_flags & TRAPA_ORIGINAL_CID) + need += 4 + params->tp_original_cid.len; + if (params->tp_flags & TRAPA_RESET_TOKEN) + need += 4 + sizeof(params->tp_stateless_reset_token); + if (params->tp_flags & (TRAPA_PREFADDR_IPv4|TRAPA_PREFADDR_IPv6)) + need += 4 + preferred_address_size(params); + } + + for (tpi = 0; tpi <= MAX_TPI; ++tpi) + if ((NUMERIC_TRANS_PARAMS & (1 << tpi)) + && params->tp_numerics_u.a[tpi2idx[tpi]] != def_vals[tpi]) + { + if (params->tp_numerics_u.a[tpi2idx[tpi]] < max_vals[tpi]) + { + bits[tpi] = vint_val2bits(params->tp_numerics_u.a[tpi2idx[tpi]]); + need += 4 + (1 << bits[tpi]); + } + else + { + LSQ_DEBUG("numeric value is too large (%"PRIu64" vs maximum " + "of %"PRIu64, params->tp_numerics_u.a[tpi2idx[tpi]], + max_vals[tpi]); + return -1; + } + } + + if (params->tp_disable_migration != TP_DEF_DISABLE_MIGRATION) + need += 4 + 0; + + if (need > bufsz || need > UINT16_MAX) + { + errno = ENOBUFS; + return -1; + } + + p = buf; + +#define WRITE_TO_P(src, len) do { \ + memcpy(p, src, len); \ + p += len; \ +} while (0) + +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define WRITE_UINT_TO_P(val, width) do { \ + u##width = bswap_##width(val); \ + WRITE_TO_P(&u##width, sizeof(u##width)); \ +} while (0) +#else +#define WRITE_UINT_TO_P(val, width) do { \ + u##width = val; \ + WRITE_TO_P(&u##width, sizeof(u##width)); \ +} while (0) +#endif + +#define WRITE_PARAM_TO_P(tpidx, tpval, width) do { \ + WRITE_UINT_TO_P(tpidx, 16); \ + WRITE_UINT_TO_P(width / 8, 16); \ + if (width > 8) \ + WRITE_UINT_TO_P(tpval, width); \ + else if (width) \ + *p++ = tpval; \ +} while (0) + + WRITE_UINT_TO_P(need - 2 + buf - p, 16); + + for (tpi = 0; tpi <= MAX_TPI; ++tpi) + if (NUMERIC_TRANS_PARAMS & (1 << tpi)) + { + if (params->tp_numerics_u.a[tpi2idx[tpi]] != def_vals[tpi]) + { + WRITE_UINT_TO_P(tpi, 16); + WRITE_UINT_TO_P(1 << bits[tpi], 16); + vint_write(p, params->tp_numerics_u.a[tpi2idx[tpi]], bits[tpi], + 1 << bits[tpi]); + p += 1 << bits[tpi]; + } + } + else + switch (tpi) + { + case TPI_ORIGINAL_CONNECTION_ID: + if (params->tp_flags & TRAPA_ORIGINAL_CID) + { + WRITE_UINT_TO_P(TPI_ORIGINAL_CONNECTION_ID, 16); + WRITE_UINT_TO_P(params->tp_original_cid.len, 16); + WRITE_TO_P(params->tp_original_cid.idbuf, + params->tp_original_cid.len); + } + break; + case TPI_STATELESS_RESET_TOKEN: + if (params->tp_flags & TRAPA_RESET_TOKEN) + { + WRITE_UINT_TO_P(TPI_STATELESS_RESET_TOKEN, 16); + WRITE_UINT_TO_P(sizeof(params->tp_stateless_reset_token), + 16); + WRITE_TO_P(params->tp_stateless_reset_token, + sizeof(params->tp_stateless_reset_token)); + } + break; + case TPI_PREFERRED_ADDRESS: + if (params->tp_flags + & (TRAPA_PREFADDR_IPv4|TRAPA_PREFADDR_IPv6)) + { + WRITE_UINT_TO_P(TPI_PREFERRED_ADDRESS, 16); + WRITE_UINT_TO_P(preferred_address_size(params), 16); + if (params->tp_flags & TRAPA_PREFADDR_IPv4) + { + WRITE_TO_P(¶ms->tp_preferred_address.ipv4_addr, + sizeof(params->tp_preferred_address.ipv4_addr)); + WRITE_UINT_TO_P(params->tp_preferred_address.ipv4_port, + 16); + } + else + { + memset(p, 0, 6); + p += 6; + } + if (params->tp_flags & TRAPA_PREFADDR_IPv6) + { + WRITE_TO_P(¶ms->tp_preferred_address.ipv6_addr, + sizeof(params->tp_preferred_address.ipv6_addr)); + WRITE_UINT_TO_P(params->tp_preferred_address.ipv6_port, + 16); + } + else + { + memset(p, 0, 18); + p += 18; + } + *p++ = params->tp_preferred_address.cid.len; + WRITE_TO_P(params->tp_preferred_address.cid.idbuf, + params->tp_preferred_address.cid.len); + WRITE_TO_P(params->tp_preferred_address.srst, + sizeof(params->tp_preferred_address.srst)); + } + break; + case TPI_DISABLE_MIGRATION: + if (params->tp_disable_migration != TP_DEF_DISABLE_MIGRATION) + { + WRITE_UINT_TO_P(TPI_DISABLE_MIGRATION, 16); + WRITE_UINT_TO_P(0, 16); + } + break; + default: + assert(0); + return -1; + } + + assert(buf + need == p); + return (int) (p - buf); + +#undef WRITE_TO_P +#undef WRITE_UINT_TO_P +} + + +int +lsquic_tp_decode (const unsigned char *const buf, size_t bufsz, + int is_server, + struct transport_params *params) +{ + const unsigned char *p, *end, *q; + uint16_t len, param_id, tlen; + unsigned set_of_ids; + int s; + + p = buf; + end = buf + bufsz; + + *params = TP_INITIALIZER(); + + if (is_server) + params->tp_flags |= TRAPA_SERVER; + + if (end - p < 2) + return -1; + READ_UINT(len, 16, p, 2); + p += 2; + if (len > end - p) + return -1; + end = p + len; + +#define EXPECT_LEN(expected_len) do { \ + if (expected_len != len) \ + return -1; \ +} while (0) + +#define EXPECT_AT_LEAST(expected_len) do { \ + if ((expected_len) > (uintptr_t) (p + len - q)) \ + return -1; \ +} while (0) + + set_of_ids = 0; + while (p < end) + { + READ_UINT(param_id, 16, p, 2); + p += 2; + READ_UINT(len, 16, p, 2); + p += 2; + if (len > end - p) + return -1; + /* If we need to support parameter IDs 31 and up, we will need to + * change this code: + */ + if (param_id < sizeof(set_of_ids) * 8) + { + /* Only check duplicates for IDs <= 31: all standard parameters + * fit in a bitmask 32 bits wide. + */ + if (set_of_ids & (1 << param_id)) + return -1; + set_of_ids |= 1 << param_id; + } + else + goto unknown; + if (NUMERIC_TRANS_PARAMS & (1u << param_id)) + { + switch (len) + { + case 1: + case 2: + case 4: + case 8: + s = vint_read(p, p + len, + ¶ms->tp_numerics_u.a[tpi2idx[param_id]]); + if (s == len) + { + if (params->tp_numerics_u.a[tpi2idx[param_id]] + > max_vals[param_id]) + { + LSQ_DEBUG("numeric value of parameter 0x%X is too " + "large (%"PRIu64" vs maximum of %"PRIu64, + param_id, + params->tp_numerics_u.a[tpi2idx[param_id]], + max_vals[param_id]); + return -1; + } + p += s; + break; + } + else + { + LSQ_DEBUG("cannot read the value of numeric transport " + "param %u of length %u", param_id, len); + return -1; + } + default: + LSQ_DEBUG("invalid length=%u for numeric transport parameter", + len); + return -1; + } + } + else + { + switch (param_id) + { + case TPI_DISABLE_MIGRATION: + EXPECT_LEN(0); + params->tp_disable_migration = 1; + break; + case TPI_STATELESS_RESET_TOKEN: + /* Client MUST not include reset token, + * see [draft-ietf-quic-transport-11], Section 6.4.1 + */ + if (!is_server) + return -1; + EXPECT_LEN(sizeof(params->tp_stateless_reset_token)); + memcpy(params->tp_stateless_reset_token, p, + sizeof(params->tp_stateless_reset_token)); + params->tp_flags |= TRAPA_RESET_TOKEN; + break; + case TPI_ORIGINAL_CONNECTION_ID: + /* Client MUST not original connecti ID, + * see [draft-ietf-quic-transport-15], Section 6.6.1 + */ + if (!is_server) + return -1; + if (len > MAX_CID_LEN) + return -1; + memcpy(params->tp_original_cid.idbuf, p, len); + params->tp_original_cid.len = len; + params->tp_flags |= TRAPA_ORIGINAL_CID; + break; + case TPI_PREFERRED_ADDRESS: + /* Client MUST not include preferred address, + * see [draft-ietf-quic-transport-12], Section 6.4.1 + */ + if (!is_server) + return -1; + q = p; + EXPECT_AT_LEAST(sizeof(params->tp_preferred_address.ipv4_addr)); + memcpy(params->tp_preferred_address.ipv4_addr, q, + sizeof(params->tp_preferred_address.ipv4_addr)); + q += sizeof(params->tp_preferred_address.ipv4_addr); + EXPECT_AT_LEAST(sizeof(params->tp_preferred_address.ipv4_port)); + READ_UINT(params->tp_preferred_address.ipv4_port, 16, q, 2); + q += 2; + EXPECT_AT_LEAST(sizeof(params->tp_preferred_address.ipv6_addr)); + memcpy(params->tp_preferred_address.ipv6_addr, q, + sizeof(params->tp_preferred_address.ipv6_addr)); + q += sizeof(params->tp_preferred_address.ipv6_addr); + EXPECT_AT_LEAST(sizeof(params->tp_preferred_address.ipv6_port)); + READ_UINT(params->tp_preferred_address.ipv6_port, 16, q, 2); + q += 2; + EXPECT_AT_LEAST(1); + tlen = *q; + q += 1; + if (tlen < 4 || tlen > MAX_CID_LEN) + { + LSQ_DEBUG("preferred server address contains invalid " + "CID length of %"PRIu16" bytes", tlen); + return -1; + } + EXPECT_AT_LEAST(tlen); + memcpy(params->tp_preferred_address.cid.idbuf, q, tlen); + params->tp_preferred_address.cid.len = tlen; + q += tlen; + EXPECT_AT_LEAST(sizeof(params->tp_preferred_address.srst)); + memcpy(params->tp_preferred_address.srst, q, + sizeof(params->tp_preferred_address.srst)); + q += sizeof(params->tp_preferred_address.srst); + if (q != p + len) + return -1; + if (params->tp_preferred_address.ipv4_port + && !lsquic_is_zero(params->tp_preferred_address.ipv4_addr, + sizeof(params->tp_preferred_address.ipv4_addr))) + params->tp_flags |= TRAPA_PREFADDR_IPv4; + if (params->tp_preferred_address.ipv6_port + && !lsquic_is_zero(params->tp_preferred_address.ipv6_addr, + sizeof(params->tp_preferred_address.ipv6_addr))) + params->tp_flags |= TRAPA_PREFADDR_IPv6; + break; + } + unknown: + p += len; + } + } + + if (p != end) + return -1; + + return (int) (end - buf); +#undef EXPECT_LEN +} + + +void +lsquic_tp_to_str (const struct transport_params *params, char *buf, size_t sz) +{ + char *const end = buf + sz; + int nw; + char tok_str[sizeof(params->tp_stateless_reset_token) * 2 + 1]; + char addr_str[INET6_ADDRSTRLEN]; + +#define SEMICOLON "; " +#define WRITE_ONE_PARAM(name, fmt) do { \ + nw = snprintf(buf, end - buf, #name ": " fmt SEMICOLON, params->tp_##name); \ + buf += nw; \ + if (buf >= end) \ + return; \ +} while (0) + + WRITE_ONE_PARAM(init_max_stream_data_bidi_local, "%"PRIu64); + WRITE_ONE_PARAM(init_max_stream_data_bidi_remote, "%"PRIu64); + WRITE_ONE_PARAM(init_max_stream_data_uni, "%"PRIu64); + WRITE_ONE_PARAM(init_max_data, "%"PRIu64); + WRITE_ONE_PARAM(idle_timeout, "%"PRIu64); + WRITE_ONE_PARAM(init_max_streams_bidi, "%"PRIu64); + WRITE_ONE_PARAM(init_max_streams_uni, "%"PRIu64); + WRITE_ONE_PARAM(max_packet_size, "%"PRIu64); + WRITE_ONE_PARAM(ack_delay_exponent, "%"PRIu64); + WRITE_ONE_PARAM(active_connection_id_limit, "%"PRIu64); + WRITE_ONE_PARAM(disable_migration, "%hhd"); +#undef SEMICOLON +#define SEMICOLON "" + WRITE_ONE_PARAM(max_ack_delay, "%"PRIu64); + if (params->tp_flags & TRAPA_RESET_TOKEN) + { + lsquic_hexstr(params->tp_stateless_reset_token, + sizeof(params->tp_stateless_reset_token), tok_str, sizeof(tok_str)); + nw = snprintf(buf, end - buf, "; stateless_reset_token: %s", tok_str); + buf += nw; + if (buf >= end) + return; + } + if (params->tp_flags & TRAPA_RESET_TOKEN) + { + char cidbuf_[MAX_CID_LEN * 2 + 1]; + nw = snprintf(buf, end - buf, "; original DCID (ODCID): %"CID_FMT, + CID_BITS(¶ms->tp_original_cid)); + buf += nw; + if (buf >= end) + return; + } + if (params->tp_flags & TRAPA_PREFADDR_IPv4) + { + if (inet_ntop(AF_INET, params->tp_preferred_address.ipv4_addr, + addr_str, sizeof(addr_str))) + { + nw = snprintf(buf, end - buf, "; IPv4 preferred address: %s:%u", + addr_str, params->tp_preferred_address.ipv4_port); + buf += nw; + if (buf >= end) + return; + } + } + if (params->tp_flags & TRAPA_PREFADDR_IPv6) + { + if (inet_ntop(AF_INET6, params->tp_preferred_address.ipv6_addr, + addr_str, sizeof(addr_str))) + { + nw = snprintf(buf, end - buf, "; IPv6 preferred address: %s:%u", + addr_str, params->tp_preferred_address.ipv6_port); + buf += nw; + if (buf >= end) + return; + } + } + +#undef SEMICOLON +#undef WRITE_ONE_PARAM +} diff --git a/src/liblsquic/lsquic_trans_params.h b/src/liblsquic/lsquic_trans_params.h new file mode 100644 index 000000000..4044103f7 --- /dev/null +++ b/src/liblsquic/lsquic_trans_params.h @@ -0,0 +1,149 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_trans_params.h -- Transport parameters types and functions. + */ + +#ifndef LSQUIC_TRANS_PARAMS_H +#define LSQUIC_TRANS_PARAMS_H 1 + +/* [draft-ietf-quic-transport-17], Section 18 */ +enum transport_param_id +{ + TPI_ORIGINAL_CONNECTION_ID = 0, + TPI_IDLE_TIMEOUT = 1, + TPI_STATELESS_RESET_TOKEN = 2, + TPI_MAX_PACKET_SIZE = 3, + TPI_INIT_MAX_DATA = 4, + TPI_INIT_MAX_STREAM_DATA_BIDI_LOCAL = 5, + TPI_INIT_MAX_STREAM_DATA_BIDI_REMOTE = 6, + TPI_INIT_MAX_STREAM_DATA_UNI = 7, + TPI_INIT_MAX_STREAMS_BIDI = 8, + TPI_INIT_MAX_STREAMS_UNI = 9, + TPI_ACK_DELAY_EXPONENT = 10, + TPI_MAX_ACK_DELAY = 11, + TPI_DISABLE_MIGRATION = 12, + TPI_PREFERRED_ADDRESS = 13, + TPI_ACTIVE_CONNECTION_ID_LIMIT = 14, +#define MAX_TPI TPI_ACTIVE_CONNECTION_ID_LIMIT +}; + +#define NUMERIC_TRANS_PARAMS (\ + (1 << TPI_MAX_PACKET_SIZE) \ + |(1 << TPI_INIT_MAX_STREAMS_UNI) \ + |(1 << TPI_INIT_MAX_STREAMS_UNI) \ + |(1 << TPI_INIT_MAX_STREAMS_BIDI) \ + |(1 << TPI_INIT_MAX_DATA) \ + |(1 << TPI_INIT_MAX_STREAM_DATA_BIDI_LOCAL) \ + |(1 << TPI_INIT_MAX_STREAM_DATA_BIDI_REMOTE) \ + |(1 << TPI_INIT_MAX_STREAM_DATA_UNI) \ + |(1 << TPI_IDLE_TIMEOUT) \ + |(1 << TPI_MAX_ACK_DELAY) \ + |(1 << TPI_ACK_DELAY_EXPONENT) \ + |(1 << TPI_ACTIVE_CONNECTION_ID_LIMIT) \ + ) + +#define IQUIC_MAX_SUPP_VERS ((2<<7) - 4)/sizeof(uint32_t) + +enum trapa_flags +{ + TRAPA_RESET_TOKEN = 1 << 0, /* Reset token is set */ + TRAPA_SERVER = 1 << 1, /* Server transport parameters */ + TRAPA_PREFADDR_IPv4 = 1 << 2, /* Preferred IPv4 address is set */ + TRAPA_PREFADDR_IPv6 = 1 << 3, /* Preferred IPv6 address is set */ + TRAPA_ORIGINAL_CID = 1 << 4, /* Original CID is set */ +}; + +struct transport_params +{ + enum trapa_flags tp_flags; + + union { + struct { + uint64_t init_max_stream_data_bidi_local; + uint64_t init_max_stream_data_bidi_remote; + uint64_t init_max_stream_data_uni; + uint64_t init_max_data; + uint64_t idle_timeout; + uint64_t init_max_streams_bidi; + uint64_t init_max_streams_uni; + uint64_t max_packet_size; + uint64_t ack_delay_exponent; + uint64_t max_ack_delay; + uint64_t active_connection_id_limit; + } s; + uint64_t a[10]; + } tp_numerics_u; +#define tp_init_max_stream_data_bidi_local tp_numerics_u.s.init_max_stream_data_bidi_local +#define tp_init_max_stream_data_bidi_remote tp_numerics_u.s.init_max_stream_data_bidi_remote +#define tp_init_max_stream_data_uni tp_numerics_u.s.init_max_stream_data_uni +#define tp_init_max_data tp_numerics_u.s.init_max_data +#define tp_idle_timeout tp_numerics_u.s.idle_timeout +#define tp_init_max_streams_bidi tp_numerics_u.s.init_max_streams_bidi +#define tp_init_max_streams_uni tp_numerics_u.s.init_max_streams_uni +#define tp_max_packet_size tp_numerics_u.s.max_packet_size +#define tp_ack_delay_exponent tp_numerics_u.s.ack_delay_exponent +#define tp_max_ack_delay tp_numerics_u.s.max_ack_delay +#define tp_active_connection_id_limit tp_numerics_u.s.active_connection_id_limit + + signed char tp_disable_migration; + uint8_t tp_stateless_reset_token[IQUIC_SRESET_TOKEN_SZ]; + struct { + uint8_t ipv4_addr[4]; + uint16_t ipv4_port; + uint8_t ipv6_addr[16]; + uint16_t ipv6_port; + lsquic_cid_t cid; + uint8_t srst[IQUIC_SRESET_TOKEN_SZ]; + } tp_preferred_address; + lsquic_cid_t tp_original_cid; +}; + +#define TP_DEF_MAX_PACKET_SIZE 65527 +#define TP_DEF_ACK_DELAY_EXP 3 +#define TP_DEF_INIT_MAX_STREAMS_UNI 0 +#define TP_DEF_INIT_MAX_STREAMS_BIDI 0 +#define TP_DEF_INIT_MAX_DATA 0 +#define TP_DEF_DISABLE_MIGRATION 0 +#define TP_DEF_INIT_MAX_STREAM_DATA_BIDI_LOCAL 0 +#define TP_DEF_INIT_MAX_STREAM_DATA_BIDI_REMOTE 0 +#define TP_DEF_INIT_MAX_STREAM_DATA_UNI 0 +#define TP_DEF_IDLE_TIMEOUT 0 +#define TP_DEF_MAX_ACK_DELAY 25 +#define TP_DEF_ACTIVE_CONNECTION_ID_LIMIT 0 + +/* [draft-ietf-quic-transport-18], Section 18.1 */ +#define TP_MAX_MAX_ACK_DELAY ((1u << 14) - 1) + +#define TP_DEFAULT_VALUES \ + .tp_active_connection_id_limit = TP_DEF_ACTIVE_CONNECTION_ID_LIMIT, \ + .tp_idle_timeout = TP_DEF_IDLE_TIMEOUT, \ + .tp_max_ack_delay = TP_DEF_MAX_ACK_DELAY, \ + .tp_max_packet_size = TP_DEF_MAX_PACKET_SIZE, \ + .tp_ack_delay_exponent = TP_DEF_ACK_DELAY_EXP, \ + .tp_init_max_streams_bidi = TP_DEF_INIT_MAX_STREAMS_BIDI, \ + .tp_init_max_streams_uni = TP_DEF_INIT_MAX_STREAMS_UNI, \ + .tp_init_max_data = TP_DEF_INIT_MAX_DATA, \ + .tp_disable_migration = TP_DEF_DISABLE_MIGRATION, \ + .tp_init_max_stream_data_bidi_local = TP_DEF_INIT_MAX_STREAM_DATA_BIDI_LOCAL, \ + .tp_init_max_stream_data_bidi_remote = TP_DEF_INIT_MAX_STREAM_DATA_BIDI_REMOTE, \ + .tp_init_max_stream_data_uni = TP_DEF_INIT_MAX_STREAM_DATA_UNI + +#define TP_INITIALIZER() (struct transport_params) { TP_DEFAULT_VALUES } + +int +lsquic_tp_encode (const struct transport_params *, + unsigned char *buf, size_t bufsz); + +int +lsquic_tp_decode (const unsigned char *buf, size_t bufsz, + /* This argument specifies whose transport parameters we are parsing. If + * true, we are parsing parameters sent by the server; if false, we are + * parsing parameteres sent by the client. + */ + int is_server, + struct transport_params *); + +void +lsquic_tp_to_str (const struct transport_params *params, char *buf, size_t sz); + +#endif diff --git a/src/liblsquic/lsquic_util.c b/src/liblsquic/lsquic_util.c index 6796082e7..0dd3d1d40 100644 --- a/src/liblsquic/lsquic_util.c +++ b/src/liblsquic/lsquic_util.c @@ -21,6 +21,11 @@ #include "lsquic_int_types.h" #include "lsquic_util.h" +#if LSQUIC_COUNT_TIME_CALLS +#include +#include "lsquic_types.h" +#include "lsquic_logger.h" +#endif #if defined(__APPLE__) @@ -30,9 +35,25 @@ static mach_timebase_info_data_t timebase; static LARGE_INTEGER perf_frequency; #endif + +#if LSQUIC_COUNT_TIME_CALLS +static volatile unsigned long n_time_now_calls; + + +static void +print_call_stats (void) +{ + LSQ_NOTICE("number of lsquic_time_now() calls: %lu", n_time_now_calls); +} +#endif + + void lsquic_init_timers (void) { +#if LSQUIC_COUNT_TIME_CALLS + atexit(print_call_stats); +#endif #if defined(__APPLE__) mach_timebase_info(&timebase); #endif @@ -45,6 +66,9 @@ lsquic_init_timers (void) lsquic_time_t lsquic_time_now (void) { +#if LSQUIC_COUNT_TIME_CALLS + ++n_time_now_calls; +#endif #if defined(_POSIX_TIMERS) && _POSIX_TIMERS > 0 struct timespec ts; (void) clock_gettime(CLOCK_MONOTONIC, &ts); @@ -97,7 +121,7 @@ lsquic_is_zero (const void *pbuf, size_t bufsz) } -/* XXX this function uses static buffer. Replace it with hexdump() if possible */ +/* XXX this function uses static buffer. Replace it with lsquic_hexdump() if possible */ char *get_bin_str(const void *s, size_t len, size_t max_display_len) { const unsigned char *p, *pEnd; @@ -156,8 +180,29 @@ lsquic_hex_encode (const void *src, size_t src_sz, void *dst, size_t dst_sz) } +void +lsquic_hexstr (const unsigned char *buf, size_t bufsz, char *out, size_t outsz) +{ + static const char b2c[16] = "0123456789ABCDEF"; + const unsigned char *const end_input = buf + bufsz; + char *const end_output = out + outsz; + + while (buf < end_input && out + 2 < end_output) + { + *out++ = b2c[ *buf >> 4 ]; + *out++ = b2c[ *buf & 0xF ]; + ++buf; + } + + if (buf < end_input) + out[-1] = '!'; + + *out = '\0'; +} + + size_t -hexdump (const void *src_void, size_t src_sz, char *out, size_t out_sz) +lsquic_hexdump (const void *src_void, size_t src_sz, char *out, size_t out_sz) { /* Ruler: * @@ -179,7 +224,7 @@ hexdump (const void *src_void, size_t src_sz, char *out, size_t out_sz) limit = src_end; unsigned hex_off = 6; unsigned alpha_off = 57; - sprintf(out, "%04x", line++); + sprintf(out, "%03X0", line++); out[4] = ' '; out[5] = ' '; while (src < limit) diff --git a/src/liblsquic/lsquic_util.h b/src/liblsquic/lsquic_util.h index 3f9f59796..501fb57f6 100644 --- a/src/liblsquic/lsquic_util.h +++ b/src/liblsquic/lsquic_util.h @@ -30,7 +30,13 @@ lsquic_hex_encode (const void *src, size_t src_sz, void *dst, size_t dst_sz); /* `out_sz' is assumed to be at least 1. `out' is always NUL-terminated. */ size_t -hexdump (const void *src, size_t src_sz, char *out, size_t out_sz); +lsquic_hexdump (const void *src, size_t src_sz, char *out, size_t out_sz); + +void +lsquic_hexstr (const unsigned char *buf, size_t bufsz, char *out, size_t outsz); + +#define HEXSTR(buf, bufsz, out) \ + (lsquic_hexstr(buf, bufsz, out, sizeof(out)), out) #ifdef __cplusplus } diff --git a/src/liblsquic/lsquic_varint.c b/src/liblsquic/lsquic_varint.c new file mode 100644 index 000000000..1c752b061 --- /dev/null +++ b/src/liblsquic/lsquic_varint.c @@ -0,0 +1,192 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * lsquic_varint.c -- routines dealing with IETF QUIC varint. + */ + +#include +#include +#include + +#include "lsquic_byteswap.h" +#include "lsquic_varint.h" + +/* Returns number of bytes read from p (1, 2, 4, or 8), or a negative + * value on error. + */ +int +lsquic_varint_read (const unsigned char *p, const unsigned char *end, + uint64_t *valp) +{ + uint64_t val; + + if (p >= end) + return -1; + + switch (*p >> 6) + { + case 0: + *valp = *p; + return 1; + case 1: + if (p + 1 >= end) + return -1; + *valp = (p[0] & VINT_MASK) << 8 + | p[1] + ; + return 2; + case 2: + if (p + 3 >= end) + return -1; + *valp = (p[0] & VINT_MASK) << 24 + | p[1] << 16 + | p[2] << 8 + | p[3] << 0 + ; + return 4; + default: + if (p + 7 >= end) + return -1; + memcpy(&val, p, 8); +#if __BYTE_ORDER == __LITTLE_ENDIAN + val = bswap_64(val); +#endif + val &= (1ULL << 62) - 1; + *valp = val; + return 8; + } + assert(0); +} + + +int +lsquic_varint_read_nb (const unsigned char **pp, const unsigned char *end, + struct varint_read_state *state) +{ + const unsigned char *p = *pp; + + if (p >= end) + return -1; + + switch (state->pos ? state->pos : *p >> 6) + { + case 0: + state->val = *p++; + *pp = p; + return 0; + case 1: + state->val = (*p++ & VINT_MASK) << 8; + if (p >= end) { state->pos = __LINE__ + 1; break; } + case __LINE__: + state->val |= *p++; + *pp = p; + return 0; + case 2: + if (p + 3 < end) + { + state->val = (p[0] & VINT_MASK) << 24 + | p[1] << 16 + | p[2] << 8 + | p[3] << 0 + ; + *pp += 4; + return 0; + } + state->val = (*p++ & VINT_MASK) << 24; + if (p >= end) { state->pos = __LINE__ + 1; break; } + case __LINE__: + state->val |= *p++ << 16; + if (p >= end) { state->pos = __LINE__ + 1; break; } + case __LINE__: + state->val |= *p++ << 8; + if (p >= end) { state->pos = __LINE__ + 1; break; } + case __LINE__: + state->val |= *p++; + *pp = p; + return 0; + case 3: + if (p + 7 < end) + { + memcpy(&state->val, p, 8); +#if __BYTE_ORDER == __LITTLE_ENDIAN + state->val = bswap_64(state->val); +#endif + state->val &= (1ULL << 62) - 1; + *pp += 8; + return 0; + } + state->val = (uint64_t) (*p++ & VINT_MASK) << 56; + if (p >= end) { state->pos = __LINE__ + 1; break; } + case __LINE__: + state->val |= (uint64_t) *p++ << 48; + if (p >= end) { state->pos = __LINE__ + 1; break; } + case __LINE__: + state->val |= (uint64_t) *p++ << 40; + if (p >= end) { state->pos = __LINE__ + 1; break; } + case __LINE__: + state->val |= (uint64_t) *p++ << 32; + if (p >= end) { state->pos = __LINE__ + 1; break; } + case __LINE__: + state->val |= (uint64_t) *p++ << 24; + if (p >= end) { state->pos = __LINE__ + 1; break; } + case __LINE__: + state->val |= (uint64_t) *p++ << 16; + if (p >= end) { state->pos = __LINE__ + 1; break; } + case __LINE__: + state->val |= (uint64_t) *p++ << 8; + if (p >= end) { state->pos = __LINE__ + 1; break; } + case __LINE__: + state->val |= *p++; + *pp = p; + return 0; + default: + assert(0); + } + + *pp = p; + return -1; +} + + +int +lsquic_varint_read_two (const unsigned char **begin, const unsigned char *end, + struct varint_read2_state *state) +{ + const unsigned char *p = *begin; + int s; + + while (p < end) + { + switch (state->vr2s_state) + { + case VR2S_READ_ONE_BEGIN: + state->vr2s_varint_state.pos = 0; + state->vr2s_state = VR2S_READ_ONE_CONTINUE; + goto cont; + case VR2S_READ_TWO_BEGIN: + state->vr2s_varint_state.pos = 0; + state->vr2s_state = VR2S_READ_TWO_CONTINUE; + goto cont; + cont: case VR2S_READ_ONE_CONTINUE: + case VR2S_READ_TWO_CONTINUE: + s = lsquic_varint_read_nb(&p, end, &state->vr2s_varint_state); + if (s == 0) + { + if (state->vr2s_state == VR2S_READ_TWO_CONTINUE) + goto done; + state->vr2s_one = state->vr2s_varint_state.val; + state->vr2s_state = VR2S_READ_TWO_BEGIN; + break; + } + else + goto more; + } + } + + more: + *begin = p; + return -1; + + done: + *begin = p; + return 0; +} diff --git a/src/liblsquic/lsquic_varint.h b/src/liblsquic/lsquic_varint.h new file mode 100644 index 000000000..294868e0e --- /dev/null +++ b/src/liblsquic/lsquic_varint.h @@ -0,0 +1,83 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#ifndef LSQUIC_VARINT_H +#define LSQUIC_VARINT_H 1 + +#define VINT_MASK ((1 << 6) - 1) + +/* See [draft-ietf-quic-transport-11], section-7.1 */ +#define vint_val2bits(val) ( \ + (val >= (1 << 6)) + (val >= (1 << 14)) + (val >= (1 << 30))) + +#define vint_size(val) (1u << vint_val2bits(val)) + +#define VINT_MAX_VALUE ((1ull << 62) - 1) + +/* Map + * 0 -> 6 + * 1 -> 14 + * 2 -> 30 + * 3 -> 62 + */ +#define vint_bits2shift(bits) ((1 << (3 + (bits))) - 2) + +#define VINT_MAX_B(bits_) ((1ull << (vint_bits2shift(bits_))) - 1) + +/* Maximum value that can be encoded as one byte: */ +#define VINT_MAX_ONE_BYTE VINT_MAX_B(0) + +int +lsquic_varint_read (const unsigned char *p, const unsigned char *end, + uint64_t *valp); + +#define vint_read lsquic_varint_read + +struct varint_read_state +{ + uint64_t val; + int pos; +}; + +int +lsquic_varint_read_nb (const unsigned char **p, const unsigned char *end, + struct varint_read_state *); + +struct varint_read2_state +{ + uint64_t vr2s_one; + struct varint_read_state vr2s_varint_state; +#define vr2s_two vr2s_varint_state.val + enum { + VR2S_READ_ONE_BEGIN = 0, + VR2S_READ_ONE_CONTINUE, + VR2S_READ_TWO_BEGIN, + VR2S_READ_TWO_CONTINUE, + } vr2s_state; +}; + +/* When first called, vr2s_state must be set to 0. + * + * Returns 0 when both varint values have been read. They are available + * in vr2s_one and vr2s_two. + * + * Returns -1 when more input is needed. + */ +int +lsquic_varint_read_two (const unsigned char **p, const unsigned char *end, + struct varint_read2_state *); + +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define vint_write(dst, val, bits, len) do { \ + uint64_t buf_ = (val) \ + | (uint64_t) (bits) << vint_bits2shift(bits); \ + buf_ = bswap_64(buf_); \ + memcpy(dst, (unsigned char *) &buf_ + 8 - (len), (len)); \ +} while (0) +#else +#define vint_write(dst, val, bits, len) do { \ + uint64_t buf_ = (val) \ + | (uint64_t) (bits) << vint_bits2shift(bits); \ + memcpy(dst, (unsigned char *) &buf_ + 8 - (len), (len)); \ +} while (0) +#endif + +#endif diff --git a/src/liblsquic/lsquic_version.c b/src/liblsquic/lsquic_version.c index 96b4a3467..a7a109215 100644 --- a/src/liblsquic/lsquic_version.c +++ b/src/liblsquic/lsquic_version.c @@ -8,14 +8,14 @@ static const unsigned char version_tags[N_LSQVER][4] = { - [LSQVER_035] = { 'Q', '0', '3', '5', }, [LSQVER_039] = { 'Q', '0', '3', '9', }, [LSQVER_043] = { 'Q', '0', '4', '3', }, - [LSQVER_044] = { 'Q', '0', '4', '4', }, [LSQVER_046] = { 'Q', '0', '4', '6', }, #if LSQUIC_USE_Q098 [LSQVER_098] = { 'Q', '0', '9', '8', }, #endif + [LSQVER_ID22] = { 0xFF, 0, 0, 22, }, + [LSQVER_VERNEG] = { 0xFA, 0xFA, 0xFA, 0xFA, }, }; @@ -44,9 +44,22 @@ lsquic_tag2ver (uint32_t ver_tag) } +const char *const lsquic_ver2str[N_LSQVER] = { + [LSQVER_039] = "Q039", + [LSQVER_043] = "Q043", + [LSQVER_046] = "Q046", +#if LSQUIC_USE_Q098 + [LSQVER_098] = "Q098", +#endif + [LSQVER_ID22] = "FF000016", + [LSQVER_VERNEG] = "FAFAFAFA", +}; + + enum lsquic_version lsquic_str2ver (const char *str, size_t len) { + enum lsquic_version ver; uint32_t tag; if (len == sizeof(tag) && 'Q' == str[0]) @@ -54,20 +67,38 @@ lsquic_str2ver (const char *str, size_t len) memcpy(&tag, str, sizeof(tag)); return lsquic_tag2ver(tag); } - else - return -1; -} + for (ver = 0; ver < N_LSQVER; ++ver) + if (strlen(lsquic_ver2str[ver]) == len + && strncasecmp(lsquic_ver2str[ver], str, len) == 0) + { + return ver; + } -const char *const lsquic_ver2str[N_LSQVER] = { - [LSQVER_035] = "Q035", - [LSQVER_039] = "Q039", - [LSQVER_043] = "Q043", - [LSQVER_044] = "Q044", - [LSQVER_046] = "Q046", -#if LSQUIC_USE_Q098 - [LSQVER_098] = "Q098", -#endif -}; + return -1; +} +int +lsquic_gen_ver_tags (unsigned char *buf, size_t bufsz, unsigned version_bitmask) +{ + unsigned n; + lsquic_ver_tag_t tag; + unsigned char *p = buf; + unsigned char *const pend = p + bufsz; + for (n = 0; version_bitmask; ++n) + { + if (version_bitmask & (1 << n)) + { + if (p + 4 > pend) + return -1; + version_bitmask &= ~(1 << n); + tag = lsquic_ver2tag(n); + if (0 == tag) + return -1; + memcpy(p, &tag, 4); + p += 4; + } + } + return p - buf; +} diff --git a/src/liblsquic/lsquic_version.h b/src/liblsquic/lsquic_version.h index cc38ae920..fba9ee770 100644 --- a/src/liblsquic/lsquic_version.h +++ b/src/liblsquic/lsquic_version.h @@ -16,4 +16,7 @@ lsquic_tag2ver (uint32_t ver_tag); extern const char *const lsquic_ver2str[]; +int +lsquic_gen_ver_tags (unsigned char *buf, size_t bufsz, unsigned versions); + #endif diff --git a/src/lshpack/lshpack.c b/src/lshpack/lshpack.c index 1284d1dd4..53879c9aa 100644 --- a/src/lshpack/lshpack.c +++ b/src/lshpack/lshpack.c @@ -5691,12 +5691,9 @@ lshpack_enc_enc_int (unsigned char *dst, unsigned char *const end, } -#if !LS_HPACK_EMIT_TEST_CODE -static -#endif - int -henc_huffman_enc (const unsigned char *src, const unsigned char *const src_end, - unsigned char *dst, int dst_len) +int +lshpack_enc_huff_encode (const unsigned char *src, + const unsigned char *const src_end, unsigned char *const dst, int dst_len) { const unsigned char *p_src = src; unsigned char *p_dst = dst; @@ -5752,7 +5749,7 @@ lshpack_enc_enc_str (unsigned char *const dst, size_t dst_len, * case. Thus, we immediately write compressed string to the output * buffer. If our guess is not correct, we fix it later. */ - rc = henc_huffman_enc(str, str + str_len, dst + 1, dst_len - 1); + rc = lshpack_enc_huff_encode(str, str + str_len, dst + 1, dst_len - 1); else if (dst_len == 1) /* Here, the call can only succeed if the string to encode is empty. */ rc = 0; @@ -6294,8 +6291,8 @@ hdec_huff_dec4bits (uint8_t src_4bits, unsigned char *dst, } -static int -hdec_huff_decode (const unsigned char *src, int src_len, +int +lshpack_dec_huff_decode_full (const unsigned char *src, int src_len, unsigned char *dst, int dst_len) { const unsigned char *p_src = src; @@ -6326,6 +6323,11 @@ hdec_huff_decode (const unsigned char *src, int src_len, } +int +lshpack_dec_huff_decode (const unsigned char *src, int src_len, + unsigned char *dst, int dst_len); + + //reutrn the length in the dst, also update the src #if !LS_HPACK_EMIT_TEST_CODE static @@ -6349,7 +6351,7 @@ hdec_dec_str (unsigned char *dst, size_t dst_len, const unsigned char **src, if (is_huffman) { - ret = hdec_huff_decode(*src, len, dst, dst_len); + ret = lshpack_dec_huff_decode(*src, len, dst, dst_len); if (ret < 0) return -3; //Wrong code @@ -6357,7 +6359,7 @@ hdec_dec_str (unsigned char *dst, size_t dst_len, const unsigned char **src, } else { - if (dst_len < (size_t)(src_end - (*src))) + if (dst_len < len) ret = -3; //dst not enough space else { @@ -6451,7 +6453,8 @@ lshpack_dec_decode (struct lshpack_dec *dec, { if (0 != lshpack_dec_dec_int(src, src_end, 7, &index)) return -1; - + if (index == 0) + return -1; indexed_type = 3; //need to parse value } else if (*(*src) > 0x40) //01 xxxxxx @@ -6504,14 +6507,15 @@ lshpack_dec_decode (struct lshpack_dec *dec, { if (index <= HPACK_STATIC_TABLE_SIZE) //static table { - if (static_table[index - 1].name_len > dst_end - dst) + if (static_table[index - 1].name_len > (unsigned) (dst_end - dst)) return -1; *name_len = static_table[index - 1].name_len; memcpy(name, static_table[index - 1].name, *name_len); if (indexed_type == 3) { if (static_table[index - 1].name_len + - static_table[index - 1].val_len > dst_end - dst) + static_table[index - 1].val_len + > (unsigned) (dst_end - dst)) return -1; *val_len = static_table[index - 1].val_len; memcpy(name + *name_len, static_table[index - 1].val, *val_len); @@ -6523,16 +6527,19 @@ lshpack_dec_decode (struct lshpack_dec *dec, entry = hdec_get_table_entry(dec, index); if (entry == NULL) return -1; - if (entry->dte_name_len > dst_end - dst) + if (entry->dte_name_len > (unsigned) (dst_end - dst)) return -1; *name_len = entry->dte_name_len; memcpy(name, DTE_NAME(entry), *name_len); if (entry->dte_name_idx) *name_idx = entry->dte_name_idx; + else + *name_idx = 0; if (indexed_type == 3) { - if (entry->dte_name_len + entry->dte_val_len > dst_end - dst) + if (entry->dte_name_len + entry->dte_val_len + > (unsigned) (dst_end - dst)) return -1; *val_len = entry->dte_val_len; memcpy(name + *name_len, DTE_VALUE(entry), *val_len); @@ -6565,3 +6572,65732 @@ lshpack_dec_decode (struct lshpack_dec *dec, return 0; } + + +static const struct hdec { uint8_t lens; uint8_t out[3]; } hdecs[] = +{ +/* + ,------------- Number of bits consumed by the index + | ,------ Number of bytes in output; 0 means long or invalid code + | | ,--- Output, aligned to the left + V V V */ +/* 0 */ {(15<<2)|3,{48,48,48}}, +/* 1 */ {(15<<2)|3,{48,48,48}}, +/* 2 */ {(15<<2)|3,{48,48,49}}, +/* 3 */ {(15<<2)|3,{48,48,49}}, +/* 4 */ {(15<<2)|3,{48,48,50}}, +/* 5 */ {(15<<2)|3,{48,48,50}}, +/* 6 */ {(15<<2)|3,{48,48,97}}, +/* 7 */ {(15<<2)|3,{48,48,97}}, +/* 8 */ {(15<<2)|3,{48,48,99}}, +/* 9 */ {(15<<2)|3,{48,48,99}}, +/* 10 */ {(15<<2)|3,{48,48,101}}, +/* 11 */ {(15<<2)|3,{48,48,101}}, +/* 12 */ {(15<<2)|3,{48,48,105}}, +/* 13 */ {(15<<2)|3,{48,48,105}}, +/* 14 */ {(15<<2)|3,{48,48,111}}, +/* 15 */ {(15<<2)|3,{48,48,111}}, +/* 16 */ {(15<<2)|3,{48,48,115}}, +/* 17 */ {(15<<2)|3,{48,48,115}}, +/* 18 */ {(15<<2)|3,{48,48,116}}, +/* 19 */ {(15<<2)|3,{48,48,116}}, +/* 20 */ {(16<<2)|3,{48,48,32}}, +/* 21 */ {(16<<2)|3,{48,48,37}}, +/* 22 */ {(16<<2)|3,{48,48,45}}, +/* 23 */ {(16<<2)|3,{48,48,46}}, +/* 24 */ {(16<<2)|3,{48,48,47}}, +/* 25 */ {(16<<2)|3,{48,48,51}}, +/* 26 */ {(16<<2)|3,{48,48,52}}, +/* 27 */ {(16<<2)|3,{48,48,53}}, +/* 28 */ {(16<<2)|3,{48,48,54}}, +/* 29 */ {(16<<2)|3,{48,48,55}}, +/* 30 */ {(16<<2)|3,{48,48,56}}, +/* 31 */ {(16<<2)|3,{48,48,57}}, +/* 32 */ {(16<<2)|3,{48,48,61}}, +/* 33 */ {(16<<2)|3,{48,48,65}}, +/* 34 */ {(16<<2)|3,{48,48,95}}, +/* 35 */ {(16<<2)|3,{48,48,98}}, +/* 36 */ {(16<<2)|3,{48,48,100}}, +/* 37 */ {(16<<2)|3,{48,48,102}}, +/* 38 */ {(16<<2)|3,{48,48,103}}, +/* 39 */ {(16<<2)|3,{48,48,104}}, +/* 40 */ {(16<<2)|3,{48,48,108}}, +/* 41 */ {(16<<2)|3,{48,48,109}}, +/* 42 */ {(16<<2)|3,{48,48,110}}, +/* 43 */ {(16<<2)|3,{48,48,112}}, +/* 44 */ {(16<<2)|3,{48,48,114}}, +/* 45 */ {(16<<2)|3,{48,48,117}}, +/* 46 */ {(10<<2)|2,{48,48,0}}, +/* 47 */ {(10<<2)|2,{48,48,0}}, +/* 48 */ {(10<<2)|2,{48,48,0}}, +/* 49 */ {(10<<2)|2,{48,48,0}}, +/* 50 */ {(10<<2)|2,{48,48,0}}, +/* 51 */ {(10<<2)|2,{48,48,0}}, +/* 52 */ {(10<<2)|2,{48,48,0}}, +/* 53 */ {(10<<2)|2,{48,48,0}}, +/* 54 */ {(10<<2)|2,{48,48,0}}, +/* 55 */ {(10<<2)|2,{48,48,0}}, +/* 56 */ {(10<<2)|2,{48,48,0}}, +/* 57 */ {(10<<2)|2,{48,48,0}}, +/* 58 */ {(10<<2)|2,{48,48,0}}, +/* 59 */ {(10<<2)|2,{48,48,0}}, +/* 60 */ {(10<<2)|2,{48,48,0}}, +/* 61 */ {(10<<2)|2,{48,48,0}}, +/* 62 */ {(10<<2)|2,{48,48,0}}, +/* 63 */ {(10<<2)|2,{48,48,0}}, +/* 64 */ {(15<<2)|3,{48,49,48}}, +/* 65 */ {(15<<2)|3,{48,49,48}}, +/* 66 */ {(15<<2)|3,{48,49,49}}, +/* 67 */ {(15<<2)|3,{48,49,49}}, +/* 68 */ {(15<<2)|3,{48,49,50}}, +/* 69 */ {(15<<2)|3,{48,49,50}}, +/* 70 */ {(15<<2)|3,{48,49,97}}, +/* 71 */ {(15<<2)|3,{48,49,97}}, +/* 72 */ {(15<<2)|3,{48,49,99}}, +/* 73 */ {(15<<2)|3,{48,49,99}}, +/* 74 */ {(15<<2)|3,{48,49,101}}, +/* 75 */ {(15<<2)|3,{48,49,101}}, +/* 76 */ {(15<<2)|3,{48,49,105}}, +/* 77 */ {(15<<2)|3,{48,49,105}}, +/* 78 */ {(15<<2)|3,{48,49,111}}, +/* 79 */ {(15<<2)|3,{48,49,111}}, +/* 80 */ {(15<<2)|3,{48,49,115}}, +/* 81 */ {(15<<2)|3,{48,49,115}}, +/* 82 */ {(15<<2)|3,{48,49,116}}, +/* 83 */ {(15<<2)|3,{48,49,116}}, +/* 84 */ {(16<<2)|3,{48,49,32}}, +/* 85 */ {(16<<2)|3,{48,49,37}}, +/* 86 */ {(16<<2)|3,{48,49,45}}, +/* 87 */ {(16<<2)|3,{48,49,46}}, +/* 88 */ {(16<<2)|3,{48,49,47}}, +/* 89 */ {(16<<2)|3,{48,49,51}}, +/* 90 */ {(16<<2)|3,{48,49,52}}, +/* 91 */ {(16<<2)|3,{48,49,53}}, +/* 92 */ {(16<<2)|3,{48,49,54}}, +/* 93 */ {(16<<2)|3,{48,49,55}}, +/* 94 */ {(16<<2)|3,{48,49,56}}, +/* 95 */ {(16<<2)|3,{48,49,57}}, +/* 96 */ {(16<<2)|3,{48,49,61}}, +/* 97 */ {(16<<2)|3,{48,49,65}}, +/* 98 */ {(16<<2)|3,{48,49,95}}, +/* 99 */ {(16<<2)|3,{48,49,98}}, +/* 100 */ {(16<<2)|3,{48,49,100}}, +/* 101 */ {(16<<2)|3,{48,49,102}}, +/* 102 */ {(16<<2)|3,{48,49,103}}, +/* 103 */ {(16<<2)|3,{48,49,104}}, +/* 104 */ {(16<<2)|3,{48,49,108}}, +/* 105 */ {(16<<2)|3,{48,49,109}}, +/* 106 */ {(16<<2)|3,{48,49,110}}, +/* 107 */ {(16<<2)|3,{48,49,112}}, +/* 108 */ {(16<<2)|3,{48,49,114}}, +/* 109 */ {(16<<2)|3,{48,49,117}}, +/* 110 */ {(10<<2)|2,{48,49,0}}, +/* 111 */ {(10<<2)|2,{48,49,0}}, +/* 112 */ {(10<<2)|2,{48,49,0}}, +/* 113 */ {(10<<2)|2,{48,49,0}}, +/* 114 */ {(10<<2)|2,{48,49,0}}, +/* 115 */ {(10<<2)|2,{48,49,0}}, +/* 116 */ {(10<<2)|2,{48,49,0}}, +/* 117 */ {(10<<2)|2,{48,49,0}}, +/* 118 */ {(10<<2)|2,{48,49,0}}, +/* 119 */ {(10<<2)|2,{48,49,0}}, +/* 120 */ {(10<<2)|2,{48,49,0}}, +/* 121 */ {(10<<2)|2,{48,49,0}}, +/* 122 */ {(10<<2)|2,{48,49,0}}, +/* 123 */ {(10<<2)|2,{48,49,0}}, +/* 124 */ {(10<<2)|2,{48,49,0}}, +/* 125 */ {(10<<2)|2,{48,49,0}}, +/* 126 */ {(10<<2)|2,{48,49,0}}, +/* 127 */ {(10<<2)|2,{48,49,0}}, +/* 128 */ {(15<<2)|3,{48,50,48}}, +/* 129 */ {(15<<2)|3,{48,50,48}}, +/* 130 */ {(15<<2)|3,{48,50,49}}, +/* 131 */ {(15<<2)|3,{48,50,49}}, +/* 132 */ {(15<<2)|3,{48,50,50}}, +/* 133 */ {(15<<2)|3,{48,50,50}}, +/* 134 */ {(15<<2)|3,{48,50,97}}, +/* 135 */ {(15<<2)|3,{48,50,97}}, +/* 136 */ {(15<<2)|3,{48,50,99}}, +/* 137 */ {(15<<2)|3,{48,50,99}}, +/* 138 */ {(15<<2)|3,{48,50,101}}, +/* 139 */ {(15<<2)|3,{48,50,101}}, +/* 140 */ {(15<<2)|3,{48,50,105}}, +/* 141 */ {(15<<2)|3,{48,50,105}}, +/* 142 */ {(15<<2)|3,{48,50,111}}, +/* 143 */ {(15<<2)|3,{48,50,111}}, +/* 144 */ {(15<<2)|3,{48,50,115}}, +/* 145 */ {(15<<2)|3,{48,50,115}}, +/* 146 */ {(15<<2)|3,{48,50,116}}, +/* 147 */ {(15<<2)|3,{48,50,116}}, +/* 148 */ {(16<<2)|3,{48,50,32}}, +/* 149 */ {(16<<2)|3,{48,50,37}}, +/* 150 */ {(16<<2)|3,{48,50,45}}, +/* 151 */ {(16<<2)|3,{48,50,46}}, +/* 152 */ {(16<<2)|3,{48,50,47}}, +/* 153 */ {(16<<2)|3,{48,50,51}}, +/* 154 */ {(16<<2)|3,{48,50,52}}, +/* 155 */ {(16<<2)|3,{48,50,53}}, +/* 156 */ {(16<<2)|3,{48,50,54}}, +/* 157 */ {(16<<2)|3,{48,50,55}}, +/* 158 */ {(16<<2)|3,{48,50,56}}, +/* 159 */ {(16<<2)|3,{48,50,57}}, +/* 160 */ {(16<<2)|3,{48,50,61}}, +/* 161 */ {(16<<2)|3,{48,50,65}}, +/* 162 */ {(16<<2)|3,{48,50,95}}, +/* 163 */ {(16<<2)|3,{48,50,98}}, +/* 164 */ {(16<<2)|3,{48,50,100}}, +/* 165 */ {(16<<2)|3,{48,50,102}}, +/* 166 */ {(16<<2)|3,{48,50,103}}, +/* 167 */ {(16<<2)|3,{48,50,104}}, +/* 168 */ {(16<<2)|3,{48,50,108}}, +/* 169 */ {(16<<2)|3,{48,50,109}}, +/* 170 */ {(16<<2)|3,{48,50,110}}, +/* 171 */ {(16<<2)|3,{48,50,112}}, +/* 172 */ {(16<<2)|3,{48,50,114}}, +/* 173 */ {(16<<2)|3,{48,50,117}}, +/* 174 */ {(10<<2)|2,{48,50,0}}, +/* 175 */ {(10<<2)|2,{48,50,0}}, +/* 176 */ {(10<<2)|2,{48,50,0}}, +/* 177 */ {(10<<2)|2,{48,50,0}}, +/* 178 */ {(10<<2)|2,{48,50,0}}, +/* 179 */ {(10<<2)|2,{48,50,0}}, +/* 180 */ {(10<<2)|2,{48,50,0}}, +/* 181 */ {(10<<2)|2,{48,50,0}}, +/* 182 */ {(10<<2)|2,{48,50,0}}, +/* 183 */ {(10<<2)|2,{48,50,0}}, +/* 184 */ {(10<<2)|2,{48,50,0}}, +/* 185 */ {(10<<2)|2,{48,50,0}}, +/* 186 */ {(10<<2)|2,{48,50,0}}, +/* 187 */ {(10<<2)|2,{48,50,0}}, +/* 188 */ {(10<<2)|2,{48,50,0}}, +/* 189 */ {(10<<2)|2,{48,50,0}}, +/* 190 */ {(10<<2)|2,{48,50,0}}, +/* 191 */ {(10<<2)|2,{48,50,0}}, +/* 192 */ {(15<<2)|3,{48,97,48}}, +/* 193 */ {(15<<2)|3,{48,97,48}}, +/* 194 */ {(15<<2)|3,{48,97,49}}, +/* 195 */ {(15<<2)|3,{48,97,49}}, +/* 196 */ {(15<<2)|3,{48,97,50}}, +/* 197 */ {(15<<2)|3,{48,97,50}}, +/* 198 */ {(15<<2)|3,{48,97,97}}, +/* 199 */ {(15<<2)|3,{48,97,97}}, +/* 200 */ {(15<<2)|3,{48,97,99}}, +/* 201 */ {(15<<2)|3,{48,97,99}}, +/* 202 */ {(15<<2)|3,{48,97,101}}, +/* 203 */ {(15<<2)|3,{48,97,101}}, +/* 204 */ {(15<<2)|3,{48,97,105}}, +/* 205 */ {(15<<2)|3,{48,97,105}}, +/* 206 */ {(15<<2)|3,{48,97,111}}, +/* 207 */ {(15<<2)|3,{48,97,111}}, +/* 208 */ {(15<<2)|3,{48,97,115}}, +/* 209 */ {(15<<2)|3,{48,97,115}}, +/* 210 */ {(15<<2)|3,{48,97,116}}, +/* 211 */ {(15<<2)|3,{48,97,116}}, +/* 212 */ {(16<<2)|3,{48,97,32}}, +/* 213 */ {(16<<2)|3,{48,97,37}}, +/* 214 */ {(16<<2)|3,{48,97,45}}, +/* 215 */ {(16<<2)|3,{48,97,46}}, +/* 216 */ {(16<<2)|3,{48,97,47}}, +/* 217 */ {(16<<2)|3,{48,97,51}}, +/* 218 */ {(16<<2)|3,{48,97,52}}, +/* 219 */ {(16<<2)|3,{48,97,53}}, +/* 220 */ {(16<<2)|3,{48,97,54}}, +/* 221 */ {(16<<2)|3,{48,97,55}}, +/* 222 */ {(16<<2)|3,{48,97,56}}, +/* 223 */ {(16<<2)|3,{48,97,57}}, +/* 224 */ {(16<<2)|3,{48,97,61}}, +/* 225 */ {(16<<2)|3,{48,97,65}}, +/* 226 */ {(16<<2)|3,{48,97,95}}, +/* 227 */ {(16<<2)|3,{48,97,98}}, +/* 228 */ {(16<<2)|3,{48,97,100}}, +/* 229 */ {(16<<2)|3,{48,97,102}}, +/* 230 */ {(16<<2)|3,{48,97,103}}, +/* 231 */ {(16<<2)|3,{48,97,104}}, +/* 232 */ {(16<<2)|3,{48,97,108}}, +/* 233 */ {(16<<2)|3,{48,97,109}}, +/* 234 */ {(16<<2)|3,{48,97,110}}, +/* 235 */ {(16<<2)|3,{48,97,112}}, +/* 236 */ {(16<<2)|3,{48,97,114}}, +/* 237 */ {(16<<2)|3,{48,97,117}}, +/* 238 */ {(10<<2)|2,{48,97,0}}, +/* 239 */ {(10<<2)|2,{48,97,0}}, +/* 240 */ {(10<<2)|2,{48,97,0}}, +/* 241 */ {(10<<2)|2,{48,97,0}}, +/* 242 */ {(10<<2)|2,{48,97,0}}, +/* 243 */ {(10<<2)|2,{48,97,0}}, +/* 244 */ {(10<<2)|2,{48,97,0}}, +/* 245 */ {(10<<2)|2,{48,97,0}}, +/* 246 */ {(10<<2)|2,{48,97,0}}, +/* 247 */ {(10<<2)|2,{48,97,0}}, +/* 248 */ {(10<<2)|2,{48,97,0}}, +/* 249 */ {(10<<2)|2,{48,97,0}}, +/* 250 */ {(10<<2)|2,{48,97,0}}, +/* 251 */ {(10<<2)|2,{48,97,0}}, +/* 252 */ {(10<<2)|2,{48,97,0}}, +/* 253 */ {(10<<2)|2,{48,97,0}}, +/* 254 */ {(10<<2)|2,{48,97,0}}, +/* 255 */ {(10<<2)|2,{48,97,0}}, +/* 256 */ {(15<<2)|3,{48,99,48}}, +/* 257 */ {(15<<2)|3,{48,99,48}}, +/* 258 */ {(15<<2)|3,{48,99,49}}, +/* 259 */ {(15<<2)|3,{48,99,49}}, +/* 260 */ {(15<<2)|3,{48,99,50}}, +/* 261 */ {(15<<2)|3,{48,99,50}}, +/* 262 */ {(15<<2)|3,{48,99,97}}, +/* 263 */ {(15<<2)|3,{48,99,97}}, +/* 264 */ {(15<<2)|3,{48,99,99}}, +/* 265 */ {(15<<2)|3,{48,99,99}}, +/* 266 */ {(15<<2)|3,{48,99,101}}, +/* 267 */ {(15<<2)|3,{48,99,101}}, +/* 268 */ {(15<<2)|3,{48,99,105}}, +/* 269 */ {(15<<2)|3,{48,99,105}}, +/* 270 */ {(15<<2)|3,{48,99,111}}, +/* 271 */ {(15<<2)|3,{48,99,111}}, +/* 272 */ {(15<<2)|3,{48,99,115}}, +/* 273 */ {(15<<2)|3,{48,99,115}}, +/* 274 */ {(15<<2)|3,{48,99,116}}, +/* 275 */ {(15<<2)|3,{48,99,116}}, +/* 276 */ {(16<<2)|3,{48,99,32}}, +/* 277 */ {(16<<2)|3,{48,99,37}}, +/* 278 */ {(16<<2)|3,{48,99,45}}, +/* 279 */ {(16<<2)|3,{48,99,46}}, +/* 280 */ {(16<<2)|3,{48,99,47}}, +/* 281 */ {(16<<2)|3,{48,99,51}}, +/* 282 */ {(16<<2)|3,{48,99,52}}, +/* 283 */ {(16<<2)|3,{48,99,53}}, +/* 284 */ {(16<<2)|3,{48,99,54}}, +/* 285 */ {(16<<2)|3,{48,99,55}}, +/* 286 */ {(16<<2)|3,{48,99,56}}, +/* 287 */ {(16<<2)|3,{48,99,57}}, +/* 288 */ {(16<<2)|3,{48,99,61}}, +/* 289 */ {(16<<2)|3,{48,99,65}}, +/* 290 */ {(16<<2)|3,{48,99,95}}, +/* 291 */ {(16<<2)|3,{48,99,98}}, +/* 292 */ {(16<<2)|3,{48,99,100}}, +/* 293 */ {(16<<2)|3,{48,99,102}}, +/* 294 */ {(16<<2)|3,{48,99,103}}, +/* 295 */ {(16<<2)|3,{48,99,104}}, +/* 296 */ {(16<<2)|3,{48,99,108}}, +/* 297 */ {(16<<2)|3,{48,99,109}}, +/* 298 */ {(16<<2)|3,{48,99,110}}, +/* 299 */ {(16<<2)|3,{48,99,112}}, +/* 300 */ {(16<<2)|3,{48,99,114}}, +/* 301 */ {(16<<2)|3,{48,99,117}}, +/* 302 */ {(10<<2)|2,{48,99,0}}, +/* 303 */ {(10<<2)|2,{48,99,0}}, +/* 304 */ {(10<<2)|2,{48,99,0}}, +/* 305 */ {(10<<2)|2,{48,99,0}}, +/* 306 */ {(10<<2)|2,{48,99,0}}, +/* 307 */ {(10<<2)|2,{48,99,0}}, +/* 308 */ {(10<<2)|2,{48,99,0}}, +/* 309 */ {(10<<2)|2,{48,99,0}}, +/* 310 */ {(10<<2)|2,{48,99,0}}, +/* 311 */ {(10<<2)|2,{48,99,0}}, +/* 312 */ {(10<<2)|2,{48,99,0}}, +/* 313 */ {(10<<2)|2,{48,99,0}}, +/* 314 */ {(10<<2)|2,{48,99,0}}, +/* 315 */ {(10<<2)|2,{48,99,0}}, +/* 316 */ {(10<<2)|2,{48,99,0}}, +/* 317 */ {(10<<2)|2,{48,99,0}}, +/* 318 */ {(10<<2)|2,{48,99,0}}, +/* 319 */ {(10<<2)|2,{48,99,0}}, +/* 320 */ {(15<<2)|3,{48,101,48}}, +/* 321 */ {(15<<2)|3,{48,101,48}}, +/* 322 */ {(15<<2)|3,{48,101,49}}, +/* 323 */ {(15<<2)|3,{48,101,49}}, +/* 324 */ {(15<<2)|3,{48,101,50}}, +/* 325 */ {(15<<2)|3,{48,101,50}}, +/* 326 */ {(15<<2)|3,{48,101,97}}, +/* 327 */ {(15<<2)|3,{48,101,97}}, +/* 328 */ {(15<<2)|3,{48,101,99}}, +/* 329 */ {(15<<2)|3,{48,101,99}}, +/* 330 */ {(15<<2)|3,{48,101,101}}, +/* 331 */ {(15<<2)|3,{48,101,101}}, +/* 332 */ {(15<<2)|3,{48,101,105}}, +/* 333 */ {(15<<2)|3,{48,101,105}}, +/* 334 */ {(15<<2)|3,{48,101,111}}, +/* 335 */ {(15<<2)|3,{48,101,111}}, +/* 336 */ {(15<<2)|3,{48,101,115}}, +/* 337 */ {(15<<2)|3,{48,101,115}}, +/* 338 */ {(15<<2)|3,{48,101,116}}, +/* 339 */ {(15<<2)|3,{48,101,116}}, +/* 340 */ {(16<<2)|3,{48,101,32}}, +/* 341 */ {(16<<2)|3,{48,101,37}}, +/* 342 */ {(16<<2)|3,{48,101,45}}, +/* 343 */ {(16<<2)|3,{48,101,46}}, +/* 344 */ {(16<<2)|3,{48,101,47}}, +/* 345 */ {(16<<2)|3,{48,101,51}}, +/* 346 */ {(16<<2)|3,{48,101,52}}, +/* 347 */ {(16<<2)|3,{48,101,53}}, +/* 348 */ {(16<<2)|3,{48,101,54}}, +/* 349 */ {(16<<2)|3,{48,101,55}}, +/* 350 */ {(16<<2)|3,{48,101,56}}, +/* 351 */ {(16<<2)|3,{48,101,57}}, +/* 352 */ {(16<<2)|3,{48,101,61}}, +/* 353 */ {(16<<2)|3,{48,101,65}}, +/* 354 */ {(16<<2)|3,{48,101,95}}, +/* 355 */ {(16<<2)|3,{48,101,98}}, +/* 356 */ {(16<<2)|3,{48,101,100}}, +/* 357 */ {(16<<2)|3,{48,101,102}}, +/* 358 */ {(16<<2)|3,{48,101,103}}, +/* 359 */ {(16<<2)|3,{48,101,104}}, +/* 360 */ {(16<<2)|3,{48,101,108}}, +/* 361 */ {(16<<2)|3,{48,101,109}}, +/* 362 */ {(16<<2)|3,{48,101,110}}, +/* 363 */ {(16<<2)|3,{48,101,112}}, +/* 364 */ {(16<<2)|3,{48,101,114}}, +/* 365 */ {(16<<2)|3,{48,101,117}}, +/* 366 */ {(10<<2)|2,{48,101,0}}, +/* 367 */ {(10<<2)|2,{48,101,0}}, +/* 368 */ {(10<<2)|2,{48,101,0}}, +/* 369 */ {(10<<2)|2,{48,101,0}}, +/* 370 */ {(10<<2)|2,{48,101,0}}, +/* 371 */ {(10<<2)|2,{48,101,0}}, +/* 372 */ {(10<<2)|2,{48,101,0}}, +/* 373 */ {(10<<2)|2,{48,101,0}}, +/* 374 */ {(10<<2)|2,{48,101,0}}, +/* 375 */ {(10<<2)|2,{48,101,0}}, +/* 376 */ {(10<<2)|2,{48,101,0}}, +/* 377 */ {(10<<2)|2,{48,101,0}}, +/* 378 */ {(10<<2)|2,{48,101,0}}, +/* 379 */ {(10<<2)|2,{48,101,0}}, +/* 380 */ {(10<<2)|2,{48,101,0}}, +/* 381 */ {(10<<2)|2,{48,101,0}}, +/* 382 */ {(10<<2)|2,{48,101,0}}, +/* 383 */ {(10<<2)|2,{48,101,0}}, +/* 384 */ {(15<<2)|3,{48,105,48}}, +/* 385 */ {(15<<2)|3,{48,105,48}}, +/* 386 */ {(15<<2)|3,{48,105,49}}, +/* 387 */ {(15<<2)|3,{48,105,49}}, +/* 388 */ {(15<<2)|3,{48,105,50}}, +/* 389 */ {(15<<2)|3,{48,105,50}}, +/* 390 */ {(15<<2)|3,{48,105,97}}, +/* 391 */ {(15<<2)|3,{48,105,97}}, +/* 392 */ {(15<<2)|3,{48,105,99}}, +/* 393 */ {(15<<2)|3,{48,105,99}}, +/* 394 */ {(15<<2)|3,{48,105,101}}, +/* 395 */ {(15<<2)|3,{48,105,101}}, +/* 396 */ {(15<<2)|3,{48,105,105}}, +/* 397 */ {(15<<2)|3,{48,105,105}}, +/* 398 */ {(15<<2)|3,{48,105,111}}, +/* 399 */ {(15<<2)|3,{48,105,111}}, +/* 400 */ {(15<<2)|3,{48,105,115}}, +/* 401 */ {(15<<2)|3,{48,105,115}}, +/* 402 */ {(15<<2)|3,{48,105,116}}, +/* 403 */ {(15<<2)|3,{48,105,116}}, +/* 404 */ {(16<<2)|3,{48,105,32}}, +/* 405 */ {(16<<2)|3,{48,105,37}}, +/* 406 */ {(16<<2)|3,{48,105,45}}, +/* 407 */ {(16<<2)|3,{48,105,46}}, +/* 408 */ {(16<<2)|3,{48,105,47}}, +/* 409 */ {(16<<2)|3,{48,105,51}}, +/* 410 */ {(16<<2)|3,{48,105,52}}, +/* 411 */ {(16<<2)|3,{48,105,53}}, +/* 412 */ {(16<<2)|3,{48,105,54}}, +/* 413 */ {(16<<2)|3,{48,105,55}}, +/* 414 */ {(16<<2)|3,{48,105,56}}, +/* 415 */ {(16<<2)|3,{48,105,57}}, +/* 416 */ {(16<<2)|3,{48,105,61}}, +/* 417 */ {(16<<2)|3,{48,105,65}}, +/* 418 */ {(16<<2)|3,{48,105,95}}, +/* 419 */ {(16<<2)|3,{48,105,98}}, +/* 420 */ {(16<<2)|3,{48,105,100}}, +/* 421 */ {(16<<2)|3,{48,105,102}}, +/* 422 */ {(16<<2)|3,{48,105,103}}, +/* 423 */ {(16<<2)|3,{48,105,104}}, +/* 424 */ {(16<<2)|3,{48,105,108}}, +/* 425 */ {(16<<2)|3,{48,105,109}}, +/* 426 */ {(16<<2)|3,{48,105,110}}, +/* 427 */ {(16<<2)|3,{48,105,112}}, +/* 428 */ {(16<<2)|3,{48,105,114}}, +/* 429 */ {(16<<2)|3,{48,105,117}}, +/* 430 */ {(10<<2)|2,{48,105,0}}, +/* 431 */ {(10<<2)|2,{48,105,0}}, +/* 432 */ {(10<<2)|2,{48,105,0}}, +/* 433 */ {(10<<2)|2,{48,105,0}}, +/* 434 */ {(10<<2)|2,{48,105,0}}, +/* 435 */ {(10<<2)|2,{48,105,0}}, +/* 436 */ {(10<<2)|2,{48,105,0}}, +/* 437 */ {(10<<2)|2,{48,105,0}}, +/* 438 */ {(10<<2)|2,{48,105,0}}, +/* 439 */ {(10<<2)|2,{48,105,0}}, +/* 440 */ {(10<<2)|2,{48,105,0}}, +/* 441 */ {(10<<2)|2,{48,105,0}}, +/* 442 */ {(10<<2)|2,{48,105,0}}, +/* 443 */ {(10<<2)|2,{48,105,0}}, +/* 444 */ {(10<<2)|2,{48,105,0}}, +/* 445 */ {(10<<2)|2,{48,105,0}}, +/* 446 */ {(10<<2)|2,{48,105,0}}, +/* 447 */ {(10<<2)|2,{48,105,0}}, +/* 448 */ {(15<<2)|3,{48,111,48}}, +/* 449 */ {(15<<2)|3,{48,111,48}}, +/* 450 */ {(15<<2)|3,{48,111,49}}, +/* 451 */ {(15<<2)|3,{48,111,49}}, +/* 452 */ {(15<<2)|3,{48,111,50}}, +/* 453 */ {(15<<2)|3,{48,111,50}}, +/* 454 */ {(15<<2)|3,{48,111,97}}, +/* 455 */ {(15<<2)|3,{48,111,97}}, +/* 456 */ {(15<<2)|3,{48,111,99}}, +/* 457 */ {(15<<2)|3,{48,111,99}}, +/* 458 */ {(15<<2)|3,{48,111,101}}, +/* 459 */ {(15<<2)|3,{48,111,101}}, +/* 460 */ {(15<<2)|3,{48,111,105}}, +/* 461 */ {(15<<2)|3,{48,111,105}}, +/* 462 */ {(15<<2)|3,{48,111,111}}, +/* 463 */ {(15<<2)|3,{48,111,111}}, +/* 464 */ {(15<<2)|3,{48,111,115}}, +/* 465 */ {(15<<2)|3,{48,111,115}}, +/* 466 */ {(15<<2)|3,{48,111,116}}, +/* 467 */ {(15<<2)|3,{48,111,116}}, +/* 468 */ {(16<<2)|3,{48,111,32}}, +/* 469 */ {(16<<2)|3,{48,111,37}}, +/* 470 */ {(16<<2)|3,{48,111,45}}, +/* 471 */ {(16<<2)|3,{48,111,46}}, +/* 472 */ {(16<<2)|3,{48,111,47}}, +/* 473 */ {(16<<2)|3,{48,111,51}}, +/* 474 */ {(16<<2)|3,{48,111,52}}, +/* 475 */ {(16<<2)|3,{48,111,53}}, +/* 476 */ {(16<<2)|3,{48,111,54}}, +/* 477 */ {(16<<2)|3,{48,111,55}}, +/* 478 */ {(16<<2)|3,{48,111,56}}, +/* 479 */ {(16<<2)|3,{48,111,57}}, +/* 480 */ {(16<<2)|3,{48,111,61}}, +/* 481 */ {(16<<2)|3,{48,111,65}}, +/* 482 */ {(16<<2)|3,{48,111,95}}, +/* 483 */ {(16<<2)|3,{48,111,98}}, +/* 484 */ {(16<<2)|3,{48,111,100}}, +/* 485 */ {(16<<2)|3,{48,111,102}}, +/* 486 */ {(16<<2)|3,{48,111,103}}, +/* 487 */ {(16<<2)|3,{48,111,104}}, +/* 488 */ {(16<<2)|3,{48,111,108}}, +/* 489 */ {(16<<2)|3,{48,111,109}}, +/* 490 */ {(16<<2)|3,{48,111,110}}, +/* 491 */ {(16<<2)|3,{48,111,112}}, +/* 492 */ {(16<<2)|3,{48,111,114}}, +/* 493 */ {(16<<2)|3,{48,111,117}}, +/* 494 */ {(10<<2)|2,{48,111,0}}, +/* 495 */ {(10<<2)|2,{48,111,0}}, +/* 496 */ {(10<<2)|2,{48,111,0}}, +/* 497 */ {(10<<2)|2,{48,111,0}}, +/* 498 */ {(10<<2)|2,{48,111,0}}, +/* 499 */ {(10<<2)|2,{48,111,0}}, +/* 500 */ {(10<<2)|2,{48,111,0}}, +/* 501 */ {(10<<2)|2,{48,111,0}}, +/* 502 */ {(10<<2)|2,{48,111,0}}, +/* 503 */ {(10<<2)|2,{48,111,0}}, +/* 504 */ {(10<<2)|2,{48,111,0}}, +/* 505 */ {(10<<2)|2,{48,111,0}}, +/* 506 */ {(10<<2)|2,{48,111,0}}, +/* 507 */ {(10<<2)|2,{48,111,0}}, +/* 508 */ {(10<<2)|2,{48,111,0}}, +/* 509 */ {(10<<2)|2,{48,111,0}}, +/* 510 */ {(10<<2)|2,{48,111,0}}, +/* 511 */ {(10<<2)|2,{48,111,0}}, +/* 512 */ {(15<<2)|3,{48,115,48}}, +/* 513 */ {(15<<2)|3,{48,115,48}}, +/* 514 */ {(15<<2)|3,{48,115,49}}, +/* 515 */ {(15<<2)|3,{48,115,49}}, +/* 516 */ {(15<<2)|3,{48,115,50}}, +/* 517 */ {(15<<2)|3,{48,115,50}}, +/* 518 */ {(15<<2)|3,{48,115,97}}, +/* 519 */ {(15<<2)|3,{48,115,97}}, +/* 520 */ {(15<<2)|3,{48,115,99}}, +/* 521 */ {(15<<2)|3,{48,115,99}}, +/* 522 */ {(15<<2)|3,{48,115,101}}, +/* 523 */ {(15<<2)|3,{48,115,101}}, +/* 524 */ {(15<<2)|3,{48,115,105}}, +/* 525 */ {(15<<2)|3,{48,115,105}}, +/* 526 */ {(15<<2)|3,{48,115,111}}, +/* 527 */ {(15<<2)|3,{48,115,111}}, +/* 528 */ {(15<<2)|3,{48,115,115}}, +/* 529 */ {(15<<2)|3,{48,115,115}}, +/* 530 */ {(15<<2)|3,{48,115,116}}, +/* 531 */ {(15<<2)|3,{48,115,116}}, +/* 532 */ {(16<<2)|3,{48,115,32}}, +/* 533 */ {(16<<2)|3,{48,115,37}}, +/* 534 */ {(16<<2)|3,{48,115,45}}, +/* 535 */ {(16<<2)|3,{48,115,46}}, +/* 536 */ {(16<<2)|3,{48,115,47}}, +/* 537 */ {(16<<2)|3,{48,115,51}}, +/* 538 */ {(16<<2)|3,{48,115,52}}, +/* 539 */ {(16<<2)|3,{48,115,53}}, +/* 540 */ {(16<<2)|3,{48,115,54}}, +/* 541 */ {(16<<2)|3,{48,115,55}}, +/* 542 */ {(16<<2)|3,{48,115,56}}, +/* 543 */ {(16<<2)|3,{48,115,57}}, +/* 544 */ {(16<<2)|3,{48,115,61}}, +/* 545 */ {(16<<2)|3,{48,115,65}}, +/* 546 */ {(16<<2)|3,{48,115,95}}, +/* 547 */ {(16<<2)|3,{48,115,98}}, +/* 548 */ {(16<<2)|3,{48,115,100}}, +/* 549 */ {(16<<2)|3,{48,115,102}}, +/* 550 */ {(16<<2)|3,{48,115,103}}, +/* 551 */ {(16<<2)|3,{48,115,104}}, +/* 552 */ {(16<<2)|3,{48,115,108}}, +/* 553 */ {(16<<2)|3,{48,115,109}}, +/* 554 */ {(16<<2)|3,{48,115,110}}, +/* 555 */ {(16<<2)|3,{48,115,112}}, +/* 556 */ {(16<<2)|3,{48,115,114}}, +/* 557 */ {(16<<2)|3,{48,115,117}}, +/* 558 */ {(10<<2)|2,{48,115,0}}, +/* 559 */ {(10<<2)|2,{48,115,0}}, +/* 560 */ {(10<<2)|2,{48,115,0}}, +/* 561 */ {(10<<2)|2,{48,115,0}}, +/* 562 */ {(10<<2)|2,{48,115,0}}, +/* 563 */ {(10<<2)|2,{48,115,0}}, +/* 564 */ {(10<<2)|2,{48,115,0}}, +/* 565 */ {(10<<2)|2,{48,115,0}}, +/* 566 */ {(10<<2)|2,{48,115,0}}, +/* 567 */ {(10<<2)|2,{48,115,0}}, +/* 568 */ {(10<<2)|2,{48,115,0}}, +/* 569 */ {(10<<2)|2,{48,115,0}}, +/* 570 */ {(10<<2)|2,{48,115,0}}, +/* 571 */ {(10<<2)|2,{48,115,0}}, +/* 572 */ {(10<<2)|2,{48,115,0}}, +/* 573 */ {(10<<2)|2,{48,115,0}}, +/* 574 */ {(10<<2)|2,{48,115,0}}, +/* 575 */ {(10<<2)|2,{48,115,0}}, +/* 576 */ {(15<<2)|3,{48,116,48}}, +/* 577 */ {(15<<2)|3,{48,116,48}}, +/* 578 */ {(15<<2)|3,{48,116,49}}, +/* 579 */ {(15<<2)|3,{48,116,49}}, +/* 580 */ {(15<<2)|3,{48,116,50}}, +/* 581 */ {(15<<2)|3,{48,116,50}}, +/* 582 */ {(15<<2)|3,{48,116,97}}, +/* 583 */ {(15<<2)|3,{48,116,97}}, +/* 584 */ {(15<<2)|3,{48,116,99}}, +/* 585 */ {(15<<2)|3,{48,116,99}}, +/* 586 */ {(15<<2)|3,{48,116,101}}, +/* 587 */ {(15<<2)|3,{48,116,101}}, +/* 588 */ {(15<<2)|3,{48,116,105}}, +/* 589 */ {(15<<2)|3,{48,116,105}}, +/* 590 */ {(15<<2)|3,{48,116,111}}, +/* 591 */ {(15<<2)|3,{48,116,111}}, +/* 592 */ {(15<<2)|3,{48,116,115}}, +/* 593 */ {(15<<2)|3,{48,116,115}}, +/* 594 */ {(15<<2)|3,{48,116,116}}, +/* 595 */ {(15<<2)|3,{48,116,116}}, +/* 596 */ {(16<<2)|3,{48,116,32}}, +/* 597 */ {(16<<2)|3,{48,116,37}}, +/* 598 */ {(16<<2)|3,{48,116,45}}, +/* 599 */ {(16<<2)|3,{48,116,46}}, +/* 600 */ {(16<<2)|3,{48,116,47}}, +/* 601 */ {(16<<2)|3,{48,116,51}}, +/* 602 */ {(16<<2)|3,{48,116,52}}, +/* 603 */ {(16<<2)|3,{48,116,53}}, +/* 604 */ {(16<<2)|3,{48,116,54}}, +/* 605 */ {(16<<2)|3,{48,116,55}}, +/* 606 */ {(16<<2)|3,{48,116,56}}, +/* 607 */ {(16<<2)|3,{48,116,57}}, +/* 608 */ {(16<<2)|3,{48,116,61}}, +/* 609 */ {(16<<2)|3,{48,116,65}}, +/* 610 */ {(16<<2)|3,{48,116,95}}, +/* 611 */ {(16<<2)|3,{48,116,98}}, +/* 612 */ {(16<<2)|3,{48,116,100}}, +/* 613 */ {(16<<2)|3,{48,116,102}}, +/* 614 */ {(16<<2)|3,{48,116,103}}, +/* 615 */ {(16<<2)|3,{48,116,104}}, +/* 616 */ {(16<<2)|3,{48,116,108}}, +/* 617 */ {(16<<2)|3,{48,116,109}}, +/* 618 */ {(16<<2)|3,{48,116,110}}, +/* 619 */ {(16<<2)|3,{48,116,112}}, +/* 620 */ {(16<<2)|3,{48,116,114}}, +/* 621 */ {(16<<2)|3,{48,116,117}}, +/* 622 */ {(10<<2)|2,{48,116,0}}, +/* 623 */ {(10<<2)|2,{48,116,0}}, +/* 624 */ {(10<<2)|2,{48,116,0}}, +/* 625 */ {(10<<2)|2,{48,116,0}}, +/* 626 */ {(10<<2)|2,{48,116,0}}, +/* 627 */ {(10<<2)|2,{48,116,0}}, +/* 628 */ {(10<<2)|2,{48,116,0}}, +/* 629 */ {(10<<2)|2,{48,116,0}}, +/* 630 */ {(10<<2)|2,{48,116,0}}, +/* 631 */ {(10<<2)|2,{48,116,0}}, +/* 632 */ {(10<<2)|2,{48,116,0}}, +/* 633 */ {(10<<2)|2,{48,116,0}}, +/* 634 */ {(10<<2)|2,{48,116,0}}, +/* 635 */ {(10<<2)|2,{48,116,0}}, +/* 636 */ {(10<<2)|2,{48,116,0}}, +/* 637 */ {(10<<2)|2,{48,116,0}}, +/* 638 */ {(10<<2)|2,{48,116,0}}, +/* 639 */ {(10<<2)|2,{48,116,0}}, +/* 640 */ {(16<<2)|3,{48,32,48}}, +/* 641 */ {(16<<2)|3,{48,32,49}}, +/* 642 */ {(16<<2)|3,{48,32,50}}, +/* 643 */ {(16<<2)|3,{48,32,97}}, +/* 644 */ {(16<<2)|3,{48,32,99}}, +/* 645 */ {(16<<2)|3,{48,32,101}}, +/* 646 */ {(16<<2)|3,{48,32,105}}, +/* 647 */ {(16<<2)|3,{48,32,111}}, +/* 648 */ {(16<<2)|3,{48,32,115}}, +/* 649 */ {(16<<2)|3,{48,32,116}}, +/* 650 */ {(11<<2)|2,{48,32,0}}, +/* 651 */ {(11<<2)|2,{48,32,0}}, +/* 652 */ {(11<<2)|2,{48,32,0}}, +/* 653 */ {(11<<2)|2,{48,32,0}}, +/* 654 */ {(11<<2)|2,{48,32,0}}, +/* 655 */ {(11<<2)|2,{48,32,0}}, +/* 656 */ {(11<<2)|2,{48,32,0}}, +/* 657 */ {(11<<2)|2,{48,32,0}}, +/* 658 */ {(11<<2)|2,{48,32,0}}, +/* 659 */ {(11<<2)|2,{48,32,0}}, +/* 660 */ {(11<<2)|2,{48,32,0}}, +/* 661 */ {(11<<2)|2,{48,32,0}}, +/* 662 */ {(11<<2)|2,{48,32,0}}, +/* 663 */ {(11<<2)|2,{48,32,0}}, +/* 664 */ {(11<<2)|2,{48,32,0}}, +/* 665 */ {(11<<2)|2,{48,32,0}}, +/* 666 */ {(11<<2)|2,{48,32,0}}, +/* 667 */ {(11<<2)|2,{48,32,0}}, +/* 668 */ {(11<<2)|2,{48,32,0}}, +/* 669 */ {(11<<2)|2,{48,32,0}}, +/* 670 */ {(11<<2)|2,{48,32,0}}, +/* 671 */ {(11<<2)|2,{48,32,0}}, +/* 672 */ {(16<<2)|3,{48,37,48}}, +/* 673 */ {(16<<2)|3,{48,37,49}}, +/* 674 */ {(16<<2)|3,{48,37,50}}, +/* 675 */ {(16<<2)|3,{48,37,97}}, +/* 676 */ {(16<<2)|3,{48,37,99}}, +/* 677 */ {(16<<2)|3,{48,37,101}}, +/* 678 */ {(16<<2)|3,{48,37,105}}, +/* 679 */ {(16<<2)|3,{48,37,111}}, +/* 680 */ {(16<<2)|3,{48,37,115}}, +/* 681 */ {(16<<2)|3,{48,37,116}}, +/* 682 */ {(11<<2)|2,{48,37,0}}, +/* 683 */ {(11<<2)|2,{48,37,0}}, +/* 684 */ {(11<<2)|2,{48,37,0}}, +/* 685 */ {(11<<2)|2,{48,37,0}}, +/* 686 */ {(11<<2)|2,{48,37,0}}, +/* 687 */ {(11<<2)|2,{48,37,0}}, +/* 688 */ {(11<<2)|2,{48,37,0}}, +/* 689 */ {(11<<2)|2,{48,37,0}}, +/* 690 */ {(11<<2)|2,{48,37,0}}, +/* 691 */ {(11<<2)|2,{48,37,0}}, +/* 692 */ {(11<<2)|2,{48,37,0}}, +/* 693 */ {(11<<2)|2,{48,37,0}}, +/* 694 */ {(11<<2)|2,{48,37,0}}, +/* 695 */ {(11<<2)|2,{48,37,0}}, +/* 696 */ {(11<<2)|2,{48,37,0}}, +/* 697 */ {(11<<2)|2,{48,37,0}}, +/* 698 */ {(11<<2)|2,{48,37,0}}, +/* 699 */ {(11<<2)|2,{48,37,0}}, +/* 700 */ {(11<<2)|2,{48,37,0}}, +/* 701 */ {(11<<2)|2,{48,37,0}}, +/* 702 */ {(11<<2)|2,{48,37,0}}, +/* 703 */ {(11<<2)|2,{48,37,0}}, +/* 704 */ {(16<<2)|3,{48,45,48}}, +/* 705 */ {(16<<2)|3,{48,45,49}}, +/* 706 */ {(16<<2)|3,{48,45,50}}, +/* 707 */ {(16<<2)|3,{48,45,97}}, +/* 708 */ {(16<<2)|3,{48,45,99}}, +/* 709 */ {(16<<2)|3,{48,45,101}}, +/* 710 */ {(16<<2)|3,{48,45,105}}, +/* 711 */ {(16<<2)|3,{48,45,111}}, +/* 712 */ {(16<<2)|3,{48,45,115}}, +/* 713 */ {(16<<2)|3,{48,45,116}}, +/* 714 */ {(11<<2)|2,{48,45,0}}, +/* 715 */ {(11<<2)|2,{48,45,0}}, +/* 716 */ {(11<<2)|2,{48,45,0}}, +/* 717 */ {(11<<2)|2,{48,45,0}}, +/* 718 */ {(11<<2)|2,{48,45,0}}, +/* 719 */ {(11<<2)|2,{48,45,0}}, +/* 720 */ {(11<<2)|2,{48,45,0}}, +/* 721 */ {(11<<2)|2,{48,45,0}}, +/* 722 */ {(11<<2)|2,{48,45,0}}, +/* 723 */ {(11<<2)|2,{48,45,0}}, +/* 724 */ {(11<<2)|2,{48,45,0}}, +/* 725 */ {(11<<2)|2,{48,45,0}}, +/* 726 */ {(11<<2)|2,{48,45,0}}, +/* 727 */ {(11<<2)|2,{48,45,0}}, +/* 728 */ {(11<<2)|2,{48,45,0}}, +/* 729 */ {(11<<2)|2,{48,45,0}}, +/* 730 */ {(11<<2)|2,{48,45,0}}, +/* 731 */ {(11<<2)|2,{48,45,0}}, +/* 732 */ {(11<<2)|2,{48,45,0}}, +/* 733 */ {(11<<2)|2,{48,45,0}}, +/* 734 */ {(11<<2)|2,{48,45,0}}, +/* 735 */ {(11<<2)|2,{48,45,0}}, +/* 736 */ {(16<<2)|3,{48,46,48}}, +/* 737 */ {(16<<2)|3,{48,46,49}}, +/* 738 */ {(16<<2)|3,{48,46,50}}, +/* 739 */ {(16<<2)|3,{48,46,97}}, +/* 740 */ {(16<<2)|3,{48,46,99}}, +/* 741 */ {(16<<2)|3,{48,46,101}}, +/* 742 */ {(16<<2)|3,{48,46,105}}, +/* 743 */ {(16<<2)|3,{48,46,111}}, +/* 744 */ {(16<<2)|3,{48,46,115}}, +/* 745 */ {(16<<2)|3,{48,46,116}}, +/* 746 */ {(11<<2)|2,{48,46,0}}, +/* 747 */ {(11<<2)|2,{48,46,0}}, +/* 748 */ {(11<<2)|2,{48,46,0}}, +/* 749 */ {(11<<2)|2,{48,46,0}}, +/* 750 */ {(11<<2)|2,{48,46,0}}, +/* 751 */ {(11<<2)|2,{48,46,0}}, +/* 752 */ {(11<<2)|2,{48,46,0}}, +/* 753 */ {(11<<2)|2,{48,46,0}}, +/* 754 */ {(11<<2)|2,{48,46,0}}, +/* 755 */ {(11<<2)|2,{48,46,0}}, +/* 756 */ {(11<<2)|2,{48,46,0}}, +/* 757 */ {(11<<2)|2,{48,46,0}}, +/* 758 */ {(11<<2)|2,{48,46,0}}, +/* 759 */ {(11<<2)|2,{48,46,0}}, +/* 760 */ {(11<<2)|2,{48,46,0}}, +/* 761 */ {(11<<2)|2,{48,46,0}}, +/* 762 */ {(11<<2)|2,{48,46,0}}, +/* 763 */ {(11<<2)|2,{48,46,0}}, +/* 764 */ {(11<<2)|2,{48,46,0}}, +/* 765 */ {(11<<2)|2,{48,46,0}}, +/* 766 */ {(11<<2)|2,{48,46,0}}, +/* 767 */ {(11<<2)|2,{48,46,0}}, +/* 768 */ {(16<<2)|3,{48,47,48}}, +/* 769 */ {(16<<2)|3,{48,47,49}}, +/* 770 */ {(16<<2)|3,{48,47,50}}, +/* 771 */ {(16<<2)|3,{48,47,97}}, +/* 772 */ {(16<<2)|3,{48,47,99}}, +/* 773 */ {(16<<2)|3,{48,47,101}}, +/* 774 */ {(16<<2)|3,{48,47,105}}, +/* 775 */ {(16<<2)|3,{48,47,111}}, +/* 776 */ {(16<<2)|3,{48,47,115}}, +/* 777 */ {(16<<2)|3,{48,47,116}}, +/* 778 */ {(11<<2)|2,{48,47,0}}, +/* 779 */ {(11<<2)|2,{48,47,0}}, +/* 780 */ {(11<<2)|2,{48,47,0}}, +/* 781 */ {(11<<2)|2,{48,47,0}}, +/* 782 */ {(11<<2)|2,{48,47,0}}, +/* 783 */ {(11<<2)|2,{48,47,0}}, +/* 784 */ {(11<<2)|2,{48,47,0}}, +/* 785 */ {(11<<2)|2,{48,47,0}}, +/* 786 */ {(11<<2)|2,{48,47,0}}, +/* 787 */ {(11<<2)|2,{48,47,0}}, +/* 788 */ {(11<<2)|2,{48,47,0}}, +/* 789 */ {(11<<2)|2,{48,47,0}}, +/* 790 */ {(11<<2)|2,{48,47,0}}, +/* 791 */ {(11<<2)|2,{48,47,0}}, +/* 792 */ {(11<<2)|2,{48,47,0}}, +/* 793 */ {(11<<2)|2,{48,47,0}}, +/* 794 */ {(11<<2)|2,{48,47,0}}, +/* 795 */ {(11<<2)|2,{48,47,0}}, +/* 796 */ {(11<<2)|2,{48,47,0}}, +/* 797 */ {(11<<2)|2,{48,47,0}}, +/* 798 */ {(11<<2)|2,{48,47,0}}, +/* 799 */ {(11<<2)|2,{48,47,0}}, +/* 800 */ {(16<<2)|3,{48,51,48}}, +/* 801 */ {(16<<2)|3,{48,51,49}}, +/* 802 */ {(16<<2)|3,{48,51,50}}, +/* 803 */ {(16<<2)|3,{48,51,97}}, +/* 804 */ {(16<<2)|3,{48,51,99}}, +/* 805 */ {(16<<2)|3,{48,51,101}}, +/* 806 */ {(16<<2)|3,{48,51,105}}, +/* 807 */ {(16<<2)|3,{48,51,111}}, +/* 808 */ {(16<<2)|3,{48,51,115}}, +/* 809 */ {(16<<2)|3,{48,51,116}}, +/* 810 */ {(11<<2)|2,{48,51,0}}, +/* 811 */ {(11<<2)|2,{48,51,0}}, +/* 812 */ {(11<<2)|2,{48,51,0}}, +/* 813 */ {(11<<2)|2,{48,51,0}}, +/* 814 */ {(11<<2)|2,{48,51,0}}, +/* 815 */ {(11<<2)|2,{48,51,0}}, +/* 816 */ {(11<<2)|2,{48,51,0}}, +/* 817 */ {(11<<2)|2,{48,51,0}}, +/* 818 */ {(11<<2)|2,{48,51,0}}, +/* 819 */ {(11<<2)|2,{48,51,0}}, +/* 820 */ {(11<<2)|2,{48,51,0}}, +/* 821 */ {(11<<2)|2,{48,51,0}}, +/* 822 */ {(11<<2)|2,{48,51,0}}, +/* 823 */ {(11<<2)|2,{48,51,0}}, +/* 824 */ {(11<<2)|2,{48,51,0}}, +/* 825 */ {(11<<2)|2,{48,51,0}}, +/* 826 */ {(11<<2)|2,{48,51,0}}, +/* 827 */ {(11<<2)|2,{48,51,0}}, +/* 828 */ {(11<<2)|2,{48,51,0}}, +/* 829 */ {(11<<2)|2,{48,51,0}}, +/* 830 */ {(11<<2)|2,{48,51,0}}, +/* 831 */ {(11<<2)|2,{48,51,0}}, +/* 832 */ {(16<<2)|3,{48,52,48}}, +/* 833 */ {(16<<2)|3,{48,52,49}}, +/* 834 */ {(16<<2)|3,{48,52,50}}, +/* 835 */ {(16<<2)|3,{48,52,97}}, +/* 836 */ {(16<<2)|3,{48,52,99}}, +/* 837 */ {(16<<2)|3,{48,52,101}}, +/* 838 */ {(16<<2)|3,{48,52,105}}, +/* 839 */ {(16<<2)|3,{48,52,111}}, +/* 840 */ {(16<<2)|3,{48,52,115}}, +/* 841 */ {(16<<2)|3,{48,52,116}}, +/* 842 */ {(11<<2)|2,{48,52,0}}, +/* 843 */ {(11<<2)|2,{48,52,0}}, +/* 844 */ {(11<<2)|2,{48,52,0}}, +/* 845 */ {(11<<2)|2,{48,52,0}}, +/* 846 */ {(11<<2)|2,{48,52,0}}, +/* 847 */ {(11<<2)|2,{48,52,0}}, +/* 848 */ {(11<<2)|2,{48,52,0}}, +/* 849 */ {(11<<2)|2,{48,52,0}}, +/* 850 */ {(11<<2)|2,{48,52,0}}, +/* 851 */ {(11<<2)|2,{48,52,0}}, +/* 852 */ {(11<<2)|2,{48,52,0}}, +/* 853 */ {(11<<2)|2,{48,52,0}}, +/* 854 */ {(11<<2)|2,{48,52,0}}, +/* 855 */ {(11<<2)|2,{48,52,0}}, +/* 856 */ {(11<<2)|2,{48,52,0}}, +/* 857 */ {(11<<2)|2,{48,52,0}}, +/* 858 */ {(11<<2)|2,{48,52,0}}, +/* 859 */ {(11<<2)|2,{48,52,0}}, +/* 860 */ {(11<<2)|2,{48,52,0}}, +/* 861 */ {(11<<2)|2,{48,52,0}}, +/* 862 */ {(11<<2)|2,{48,52,0}}, +/* 863 */ {(11<<2)|2,{48,52,0}}, +/* 864 */ {(16<<2)|3,{48,53,48}}, +/* 865 */ {(16<<2)|3,{48,53,49}}, +/* 866 */ {(16<<2)|3,{48,53,50}}, +/* 867 */ {(16<<2)|3,{48,53,97}}, +/* 868 */ {(16<<2)|3,{48,53,99}}, +/* 869 */ {(16<<2)|3,{48,53,101}}, +/* 870 */ {(16<<2)|3,{48,53,105}}, +/* 871 */ {(16<<2)|3,{48,53,111}}, +/* 872 */ {(16<<2)|3,{48,53,115}}, +/* 873 */ {(16<<2)|3,{48,53,116}}, +/* 874 */ {(11<<2)|2,{48,53,0}}, +/* 875 */ {(11<<2)|2,{48,53,0}}, +/* 876 */ {(11<<2)|2,{48,53,0}}, +/* 877 */ {(11<<2)|2,{48,53,0}}, +/* 878 */ {(11<<2)|2,{48,53,0}}, +/* 879 */ {(11<<2)|2,{48,53,0}}, +/* 880 */ {(11<<2)|2,{48,53,0}}, +/* 881 */ {(11<<2)|2,{48,53,0}}, +/* 882 */ {(11<<2)|2,{48,53,0}}, +/* 883 */ {(11<<2)|2,{48,53,0}}, +/* 884 */ {(11<<2)|2,{48,53,0}}, +/* 885 */ {(11<<2)|2,{48,53,0}}, +/* 886 */ {(11<<2)|2,{48,53,0}}, +/* 887 */ {(11<<2)|2,{48,53,0}}, +/* 888 */ {(11<<2)|2,{48,53,0}}, +/* 889 */ {(11<<2)|2,{48,53,0}}, +/* 890 */ {(11<<2)|2,{48,53,0}}, +/* 891 */ {(11<<2)|2,{48,53,0}}, +/* 892 */ {(11<<2)|2,{48,53,0}}, +/* 893 */ {(11<<2)|2,{48,53,0}}, +/* 894 */ {(11<<2)|2,{48,53,0}}, +/* 895 */ {(11<<2)|2,{48,53,0}}, +/* 896 */ {(16<<2)|3,{48,54,48}}, +/* 897 */ {(16<<2)|3,{48,54,49}}, +/* 898 */ {(16<<2)|3,{48,54,50}}, +/* 899 */ {(16<<2)|3,{48,54,97}}, +/* 900 */ {(16<<2)|3,{48,54,99}}, +/* 901 */ {(16<<2)|3,{48,54,101}}, +/* 902 */ {(16<<2)|3,{48,54,105}}, +/* 903 */ {(16<<2)|3,{48,54,111}}, +/* 904 */ {(16<<2)|3,{48,54,115}}, +/* 905 */ {(16<<2)|3,{48,54,116}}, +/* 906 */ {(11<<2)|2,{48,54,0}}, +/* 907 */ {(11<<2)|2,{48,54,0}}, +/* 908 */ {(11<<2)|2,{48,54,0}}, +/* 909 */ {(11<<2)|2,{48,54,0}}, +/* 910 */ {(11<<2)|2,{48,54,0}}, +/* 911 */ {(11<<2)|2,{48,54,0}}, +/* 912 */ {(11<<2)|2,{48,54,0}}, +/* 913 */ {(11<<2)|2,{48,54,0}}, +/* 914 */ {(11<<2)|2,{48,54,0}}, +/* 915 */ {(11<<2)|2,{48,54,0}}, +/* 916 */ {(11<<2)|2,{48,54,0}}, +/* 917 */ {(11<<2)|2,{48,54,0}}, +/* 918 */ {(11<<2)|2,{48,54,0}}, +/* 919 */ {(11<<2)|2,{48,54,0}}, +/* 920 */ {(11<<2)|2,{48,54,0}}, +/* 921 */ {(11<<2)|2,{48,54,0}}, +/* 922 */ {(11<<2)|2,{48,54,0}}, +/* 923 */ {(11<<2)|2,{48,54,0}}, +/* 924 */ {(11<<2)|2,{48,54,0}}, +/* 925 */ {(11<<2)|2,{48,54,0}}, +/* 926 */ {(11<<2)|2,{48,54,0}}, +/* 927 */ {(11<<2)|2,{48,54,0}}, +/* 928 */ {(16<<2)|3,{48,55,48}}, +/* 929 */ {(16<<2)|3,{48,55,49}}, +/* 930 */ {(16<<2)|3,{48,55,50}}, +/* 931 */ {(16<<2)|3,{48,55,97}}, +/* 932 */ {(16<<2)|3,{48,55,99}}, +/* 933 */ {(16<<2)|3,{48,55,101}}, +/* 934 */ {(16<<2)|3,{48,55,105}}, +/* 935 */ {(16<<2)|3,{48,55,111}}, +/* 936 */ {(16<<2)|3,{48,55,115}}, +/* 937 */ {(16<<2)|3,{48,55,116}}, +/* 938 */ {(11<<2)|2,{48,55,0}}, +/* 939 */ {(11<<2)|2,{48,55,0}}, +/* 940 */ {(11<<2)|2,{48,55,0}}, +/* 941 */ {(11<<2)|2,{48,55,0}}, +/* 942 */ {(11<<2)|2,{48,55,0}}, +/* 943 */ {(11<<2)|2,{48,55,0}}, +/* 944 */ {(11<<2)|2,{48,55,0}}, +/* 945 */ {(11<<2)|2,{48,55,0}}, +/* 946 */ {(11<<2)|2,{48,55,0}}, +/* 947 */ {(11<<2)|2,{48,55,0}}, +/* 948 */ {(11<<2)|2,{48,55,0}}, +/* 949 */ {(11<<2)|2,{48,55,0}}, +/* 950 */ {(11<<2)|2,{48,55,0}}, +/* 951 */ {(11<<2)|2,{48,55,0}}, +/* 952 */ {(11<<2)|2,{48,55,0}}, +/* 953 */ {(11<<2)|2,{48,55,0}}, +/* 954 */ {(11<<2)|2,{48,55,0}}, +/* 955 */ {(11<<2)|2,{48,55,0}}, +/* 956 */ {(11<<2)|2,{48,55,0}}, +/* 957 */ {(11<<2)|2,{48,55,0}}, +/* 958 */ {(11<<2)|2,{48,55,0}}, +/* 959 */ {(11<<2)|2,{48,55,0}}, +/* 960 */ {(16<<2)|3,{48,56,48}}, +/* 961 */ {(16<<2)|3,{48,56,49}}, +/* 962 */ {(16<<2)|3,{48,56,50}}, +/* 963 */ {(16<<2)|3,{48,56,97}}, +/* 964 */ {(16<<2)|3,{48,56,99}}, +/* 965 */ {(16<<2)|3,{48,56,101}}, +/* 966 */ {(16<<2)|3,{48,56,105}}, +/* 967 */ {(16<<2)|3,{48,56,111}}, +/* 968 */ {(16<<2)|3,{48,56,115}}, +/* 969 */ {(16<<2)|3,{48,56,116}}, +/* 970 */ {(11<<2)|2,{48,56,0}}, +/* 971 */ {(11<<2)|2,{48,56,0}}, +/* 972 */ {(11<<2)|2,{48,56,0}}, +/* 973 */ {(11<<2)|2,{48,56,0}}, +/* 974 */ {(11<<2)|2,{48,56,0}}, +/* 975 */ {(11<<2)|2,{48,56,0}}, +/* 976 */ {(11<<2)|2,{48,56,0}}, +/* 977 */ {(11<<2)|2,{48,56,0}}, +/* 978 */ {(11<<2)|2,{48,56,0}}, +/* 979 */ {(11<<2)|2,{48,56,0}}, +/* 980 */ {(11<<2)|2,{48,56,0}}, +/* 981 */ {(11<<2)|2,{48,56,0}}, +/* 982 */ {(11<<2)|2,{48,56,0}}, +/* 983 */ {(11<<2)|2,{48,56,0}}, +/* 984 */ {(11<<2)|2,{48,56,0}}, +/* 985 */ {(11<<2)|2,{48,56,0}}, +/* 986 */ {(11<<2)|2,{48,56,0}}, +/* 987 */ {(11<<2)|2,{48,56,0}}, +/* 988 */ {(11<<2)|2,{48,56,0}}, +/* 989 */ {(11<<2)|2,{48,56,0}}, +/* 990 */ {(11<<2)|2,{48,56,0}}, +/* 991 */ {(11<<2)|2,{48,56,0}}, +/* 992 */ {(16<<2)|3,{48,57,48}}, +/* 993 */ {(16<<2)|3,{48,57,49}}, +/* 994 */ {(16<<2)|3,{48,57,50}}, +/* 995 */ {(16<<2)|3,{48,57,97}}, +/* 996 */ {(16<<2)|3,{48,57,99}}, +/* 997 */ {(16<<2)|3,{48,57,101}}, +/* 998 */ {(16<<2)|3,{48,57,105}}, +/* 999 */ {(16<<2)|3,{48,57,111}}, +/* 1000 */ {(16<<2)|3,{48,57,115}}, +/* 1001 */ {(16<<2)|3,{48,57,116}}, +/* 1002 */ {(11<<2)|2,{48,57,0}}, +/* 1003 */ {(11<<2)|2,{48,57,0}}, +/* 1004 */ {(11<<2)|2,{48,57,0}}, +/* 1005 */ {(11<<2)|2,{48,57,0}}, +/* 1006 */ {(11<<2)|2,{48,57,0}}, +/* 1007 */ {(11<<2)|2,{48,57,0}}, +/* 1008 */ {(11<<2)|2,{48,57,0}}, +/* 1009 */ {(11<<2)|2,{48,57,0}}, +/* 1010 */ {(11<<2)|2,{48,57,0}}, +/* 1011 */ {(11<<2)|2,{48,57,0}}, +/* 1012 */ {(11<<2)|2,{48,57,0}}, +/* 1013 */ {(11<<2)|2,{48,57,0}}, +/* 1014 */ {(11<<2)|2,{48,57,0}}, +/* 1015 */ {(11<<2)|2,{48,57,0}}, +/* 1016 */ {(11<<2)|2,{48,57,0}}, +/* 1017 */ {(11<<2)|2,{48,57,0}}, +/* 1018 */ {(11<<2)|2,{48,57,0}}, +/* 1019 */ {(11<<2)|2,{48,57,0}}, +/* 1020 */ {(11<<2)|2,{48,57,0}}, +/* 1021 */ {(11<<2)|2,{48,57,0}}, +/* 1022 */ {(11<<2)|2,{48,57,0}}, +/* 1023 */ {(11<<2)|2,{48,57,0}}, +/* 1024 */ {(16<<2)|3,{48,61,48}}, +/* 1025 */ {(16<<2)|3,{48,61,49}}, +/* 1026 */ {(16<<2)|3,{48,61,50}}, +/* 1027 */ {(16<<2)|3,{48,61,97}}, +/* 1028 */ {(16<<2)|3,{48,61,99}}, +/* 1029 */ {(16<<2)|3,{48,61,101}}, +/* 1030 */ {(16<<2)|3,{48,61,105}}, +/* 1031 */ {(16<<2)|3,{48,61,111}}, +/* 1032 */ {(16<<2)|3,{48,61,115}}, +/* 1033 */ {(16<<2)|3,{48,61,116}}, +/* 1034 */ {(11<<2)|2,{48,61,0}}, +/* 1035 */ {(11<<2)|2,{48,61,0}}, +/* 1036 */ {(11<<2)|2,{48,61,0}}, +/* 1037 */ {(11<<2)|2,{48,61,0}}, +/* 1038 */ {(11<<2)|2,{48,61,0}}, +/* 1039 */ {(11<<2)|2,{48,61,0}}, +/* 1040 */ {(11<<2)|2,{48,61,0}}, +/* 1041 */ {(11<<2)|2,{48,61,0}}, +/* 1042 */ {(11<<2)|2,{48,61,0}}, +/* 1043 */ {(11<<2)|2,{48,61,0}}, +/* 1044 */ {(11<<2)|2,{48,61,0}}, +/* 1045 */ {(11<<2)|2,{48,61,0}}, +/* 1046 */ {(11<<2)|2,{48,61,0}}, +/* 1047 */ {(11<<2)|2,{48,61,0}}, +/* 1048 */ {(11<<2)|2,{48,61,0}}, +/* 1049 */ {(11<<2)|2,{48,61,0}}, +/* 1050 */ {(11<<2)|2,{48,61,0}}, +/* 1051 */ {(11<<2)|2,{48,61,0}}, +/* 1052 */ {(11<<2)|2,{48,61,0}}, +/* 1053 */ {(11<<2)|2,{48,61,0}}, +/* 1054 */ {(11<<2)|2,{48,61,0}}, +/* 1055 */ {(11<<2)|2,{48,61,0}}, +/* 1056 */ {(16<<2)|3,{48,65,48}}, +/* 1057 */ {(16<<2)|3,{48,65,49}}, +/* 1058 */ {(16<<2)|3,{48,65,50}}, +/* 1059 */ {(16<<2)|3,{48,65,97}}, +/* 1060 */ {(16<<2)|3,{48,65,99}}, +/* 1061 */ {(16<<2)|3,{48,65,101}}, +/* 1062 */ {(16<<2)|3,{48,65,105}}, +/* 1063 */ {(16<<2)|3,{48,65,111}}, +/* 1064 */ {(16<<2)|3,{48,65,115}}, +/* 1065 */ {(16<<2)|3,{48,65,116}}, +/* 1066 */ {(11<<2)|2,{48,65,0}}, +/* 1067 */ {(11<<2)|2,{48,65,0}}, +/* 1068 */ {(11<<2)|2,{48,65,0}}, +/* 1069 */ {(11<<2)|2,{48,65,0}}, +/* 1070 */ {(11<<2)|2,{48,65,0}}, +/* 1071 */ {(11<<2)|2,{48,65,0}}, +/* 1072 */ {(11<<2)|2,{48,65,0}}, +/* 1073 */ {(11<<2)|2,{48,65,0}}, +/* 1074 */ {(11<<2)|2,{48,65,0}}, +/* 1075 */ {(11<<2)|2,{48,65,0}}, +/* 1076 */ {(11<<2)|2,{48,65,0}}, +/* 1077 */ {(11<<2)|2,{48,65,0}}, +/* 1078 */ {(11<<2)|2,{48,65,0}}, +/* 1079 */ {(11<<2)|2,{48,65,0}}, +/* 1080 */ {(11<<2)|2,{48,65,0}}, +/* 1081 */ {(11<<2)|2,{48,65,0}}, +/* 1082 */ {(11<<2)|2,{48,65,0}}, +/* 1083 */ {(11<<2)|2,{48,65,0}}, +/* 1084 */ {(11<<2)|2,{48,65,0}}, +/* 1085 */ {(11<<2)|2,{48,65,0}}, +/* 1086 */ {(11<<2)|2,{48,65,0}}, +/* 1087 */ {(11<<2)|2,{48,65,0}}, +/* 1088 */ {(16<<2)|3,{48,95,48}}, +/* 1089 */ {(16<<2)|3,{48,95,49}}, +/* 1090 */ {(16<<2)|3,{48,95,50}}, +/* 1091 */ {(16<<2)|3,{48,95,97}}, +/* 1092 */ {(16<<2)|3,{48,95,99}}, +/* 1093 */ {(16<<2)|3,{48,95,101}}, +/* 1094 */ {(16<<2)|3,{48,95,105}}, +/* 1095 */ {(16<<2)|3,{48,95,111}}, +/* 1096 */ {(16<<2)|3,{48,95,115}}, +/* 1097 */ {(16<<2)|3,{48,95,116}}, +/* 1098 */ {(11<<2)|2,{48,95,0}}, +/* 1099 */ {(11<<2)|2,{48,95,0}}, +/* 1100 */ {(11<<2)|2,{48,95,0}}, +/* 1101 */ {(11<<2)|2,{48,95,0}}, +/* 1102 */ {(11<<2)|2,{48,95,0}}, +/* 1103 */ {(11<<2)|2,{48,95,0}}, +/* 1104 */ {(11<<2)|2,{48,95,0}}, +/* 1105 */ {(11<<2)|2,{48,95,0}}, +/* 1106 */ {(11<<2)|2,{48,95,0}}, +/* 1107 */ {(11<<2)|2,{48,95,0}}, +/* 1108 */ {(11<<2)|2,{48,95,0}}, +/* 1109 */ {(11<<2)|2,{48,95,0}}, +/* 1110 */ {(11<<2)|2,{48,95,0}}, +/* 1111 */ {(11<<2)|2,{48,95,0}}, +/* 1112 */ {(11<<2)|2,{48,95,0}}, +/* 1113 */ {(11<<2)|2,{48,95,0}}, +/* 1114 */ {(11<<2)|2,{48,95,0}}, +/* 1115 */ {(11<<2)|2,{48,95,0}}, +/* 1116 */ {(11<<2)|2,{48,95,0}}, +/* 1117 */ {(11<<2)|2,{48,95,0}}, +/* 1118 */ {(11<<2)|2,{48,95,0}}, +/* 1119 */ {(11<<2)|2,{48,95,0}}, +/* 1120 */ {(16<<2)|3,{48,98,48}}, +/* 1121 */ {(16<<2)|3,{48,98,49}}, +/* 1122 */ {(16<<2)|3,{48,98,50}}, +/* 1123 */ {(16<<2)|3,{48,98,97}}, +/* 1124 */ {(16<<2)|3,{48,98,99}}, +/* 1125 */ {(16<<2)|3,{48,98,101}}, +/* 1126 */ {(16<<2)|3,{48,98,105}}, +/* 1127 */ {(16<<2)|3,{48,98,111}}, +/* 1128 */ {(16<<2)|3,{48,98,115}}, +/* 1129 */ {(16<<2)|3,{48,98,116}}, +/* 1130 */ {(11<<2)|2,{48,98,0}}, +/* 1131 */ {(11<<2)|2,{48,98,0}}, +/* 1132 */ {(11<<2)|2,{48,98,0}}, +/* 1133 */ {(11<<2)|2,{48,98,0}}, +/* 1134 */ {(11<<2)|2,{48,98,0}}, +/* 1135 */ {(11<<2)|2,{48,98,0}}, +/* 1136 */ {(11<<2)|2,{48,98,0}}, +/* 1137 */ {(11<<2)|2,{48,98,0}}, +/* 1138 */ {(11<<2)|2,{48,98,0}}, +/* 1139 */ {(11<<2)|2,{48,98,0}}, +/* 1140 */ {(11<<2)|2,{48,98,0}}, +/* 1141 */ {(11<<2)|2,{48,98,0}}, +/* 1142 */ {(11<<2)|2,{48,98,0}}, +/* 1143 */ {(11<<2)|2,{48,98,0}}, +/* 1144 */ {(11<<2)|2,{48,98,0}}, +/* 1145 */ {(11<<2)|2,{48,98,0}}, +/* 1146 */ {(11<<2)|2,{48,98,0}}, +/* 1147 */ {(11<<2)|2,{48,98,0}}, +/* 1148 */ {(11<<2)|2,{48,98,0}}, +/* 1149 */ {(11<<2)|2,{48,98,0}}, +/* 1150 */ {(11<<2)|2,{48,98,0}}, +/* 1151 */ {(11<<2)|2,{48,98,0}}, +/* 1152 */ {(16<<2)|3,{48,100,48}}, +/* 1153 */ {(16<<2)|3,{48,100,49}}, +/* 1154 */ {(16<<2)|3,{48,100,50}}, +/* 1155 */ {(16<<2)|3,{48,100,97}}, +/* 1156 */ {(16<<2)|3,{48,100,99}}, +/* 1157 */ {(16<<2)|3,{48,100,101}}, +/* 1158 */ {(16<<2)|3,{48,100,105}}, +/* 1159 */ {(16<<2)|3,{48,100,111}}, +/* 1160 */ {(16<<2)|3,{48,100,115}}, +/* 1161 */ {(16<<2)|3,{48,100,116}}, +/* 1162 */ {(11<<2)|2,{48,100,0}}, +/* 1163 */ {(11<<2)|2,{48,100,0}}, +/* 1164 */ {(11<<2)|2,{48,100,0}}, +/* 1165 */ {(11<<2)|2,{48,100,0}}, +/* 1166 */ {(11<<2)|2,{48,100,0}}, +/* 1167 */ {(11<<2)|2,{48,100,0}}, +/* 1168 */ {(11<<2)|2,{48,100,0}}, +/* 1169 */ {(11<<2)|2,{48,100,0}}, +/* 1170 */ {(11<<2)|2,{48,100,0}}, +/* 1171 */ {(11<<2)|2,{48,100,0}}, +/* 1172 */ {(11<<2)|2,{48,100,0}}, +/* 1173 */ {(11<<2)|2,{48,100,0}}, +/* 1174 */ {(11<<2)|2,{48,100,0}}, +/* 1175 */ {(11<<2)|2,{48,100,0}}, +/* 1176 */ {(11<<2)|2,{48,100,0}}, +/* 1177 */ {(11<<2)|2,{48,100,0}}, +/* 1178 */ {(11<<2)|2,{48,100,0}}, +/* 1179 */ {(11<<2)|2,{48,100,0}}, +/* 1180 */ {(11<<2)|2,{48,100,0}}, +/* 1181 */ {(11<<2)|2,{48,100,0}}, +/* 1182 */ {(11<<2)|2,{48,100,0}}, +/* 1183 */ {(11<<2)|2,{48,100,0}}, +/* 1184 */ {(16<<2)|3,{48,102,48}}, +/* 1185 */ {(16<<2)|3,{48,102,49}}, +/* 1186 */ {(16<<2)|3,{48,102,50}}, +/* 1187 */ {(16<<2)|3,{48,102,97}}, +/* 1188 */ {(16<<2)|3,{48,102,99}}, +/* 1189 */ {(16<<2)|3,{48,102,101}}, +/* 1190 */ {(16<<2)|3,{48,102,105}}, +/* 1191 */ {(16<<2)|3,{48,102,111}}, +/* 1192 */ {(16<<2)|3,{48,102,115}}, +/* 1193 */ {(16<<2)|3,{48,102,116}}, +/* 1194 */ {(11<<2)|2,{48,102,0}}, +/* 1195 */ {(11<<2)|2,{48,102,0}}, +/* 1196 */ {(11<<2)|2,{48,102,0}}, +/* 1197 */ {(11<<2)|2,{48,102,0}}, +/* 1198 */ {(11<<2)|2,{48,102,0}}, +/* 1199 */ {(11<<2)|2,{48,102,0}}, +/* 1200 */ {(11<<2)|2,{48,102,0}}, +/* 1201 */ {(11<<2)|2,{48,102,0}}, +/* 1202 */ {(11<<2)|2,{48,102,0}}, +/* 1203 */ {(11<<2)|2,{48,102,0}}, +/* 1204 */ {(11<<2)|2,{48,102,0}}, +/* 1205 */ {(11<<2)|2,{48,102,0}}, +/* 1206 */ {(11<<2)|2,{48,102,0}}, +/* 1207 */ {(11<<2)|2,{48,102,0}}, +/* 1208 */ {(11<<2)|2,{48,102,0}}, +/* 1209 */ {(11<<2)|2,{48,102,0}}, +/* 1210 */ {(11<<2)|2,{48,102,0}}, +/* 1211 */ {(11<<2)|2,{48,102,0}}, +/* 1212 */ {(11<<2)|2,{48,102,0}}, +/* 1213 */ {(11<<2)|2,{48,102,0}}, +/* 1214 */ {(11<<2)|2,{48,102,0}}, +/* 1215 */ {(11<<2)|2,{48,102,0}}, +/* 1216 */ {(16<<2)|3,{48,103,48}}, +/* 1217 */ {(16<<2)|3,{48,103,49}}, +/* 1218 */ {(16<<2)|3,{48,103,50}}, +/* 1219 */ {(16<<2)|3,{48,103,97}}, +/* 1220 */ {(16<<2)|3,{48,103,99}}, +/* 1221 */ {(16<<2)|3,{48,103,101}}, +/* 1222 */ {(16<<2)|3,{48,103,105}}, +/* 1223 */ {(16<<2)|3,{48,103,111}}, +/* 1224 */ {(16<<2)|3,{48,103,115}}, +/* 1225 */ {(16<<2)|3,{48,103,116}}, +/* 1226 */ {(11<<2)|2,{48,103,0}}, +/* 1227 */ {(11<<2)|2,{48,103,0}}, +/* 1228 */ {(11<<2)|2,{48,103,0}}, +/* 1229 */ {(11<<2)|2,{48,103,0}}, +/* 1230 */ {(11<<2)|2,{48,103,0}}, +/* 1231 */ {(11<<2)|2,{48,103,0}}, +/* 1232 */ {(11<<2)|2,{48,103,0}}, +/* 1233 */ {(11<<2)|2,{48,103,0}}, +/* 1234 */ {(11<<2)|2,{48,103,0}}, +/* 1235 */ {(11<<2)|2,{48,103,0}}, +/* 1236 */ {(11<<2)|2,{48,103,0}}, +/* 1237 */ {(11<<2)|2,{48,103,0}}, +/* 1238 */ {(11<<2)|2,{48,103,0}}, +/* 1239 */ {(11<<2)|2,{48,103,0}}, +/* 1240 */ {(11<<2)|2,{48,103,0}}, +/* 1241 */ {(11<<2)|2,{48,103,0}}, +/* 1242 */ {(11<<2)|2,{48,103,0}}, +/* 1243 */ {(11<<2)|2,{48,103,0}}, +/* 1244 */ {(11<<2)|2,{48,103,0}}, +/* 1245 */ {(11<<2)|2,{48,103,0}}, +/* 1246 */ {(11<<2)|2,{48,103,0}}, +/* 1247 */ {(11<<2)|2,{48,103,0}}, +/* 1248 */ {(16<<2)|3,{48,104,48}}, +/* 1249 */ {(16<<2)|3,{48,104,49}}, +/* 1250 */ {(16<<2)|3,{48,104,50}}, +/* 1251 */ {(16<<2)|3,{48,104,97}}, +/* 1252 */ {(16<<2)|3,{48,104,99}}, +/* 1253 */ {(16<<2)|3,{48,104,101}}, +/* 1254 */ {(16<<2)|3,{48,104,105}}, +/* 1255 */ {(16<<2)|3,{48,104,111}}, +/* 1256 */ {(16<<2)|3,{48,104,115}}, +/* 1257 */ {(16<<2)|3,{48,104,116}}, +/* 1258 */ {(11<<2)|2,{48,104,0}}, +/* 1259 */ {(11<<2)|2,{48,104,0}}, +/* 1260 */ {(11<<2)|2,{48,104,0}}, +/* 1261 */ {(11<<2)|2,{48,104,0}}, +/* 1262 */ {(11<<2)|2,{48,104,0}}, +/* 1263 */ {(11<<2)|2,{48,104,0}}, +/* 1264 */ {(11<<2)|2,{48,104,0}}, +/* 1265 */ {(11<<2)|2,{48,104,0}}, +/* 1266 */ {(11<<2)|2,{48,104,0}}, +/* 1267 */ {(11<<2)|2,{48,104,0}}, +/* 1268 */ {(11<<2)|2,{48,104,0}}, +/* 1269 */ {(11<<2)|2,{48,104,0}}, +/* 1270 */ {(11<<2)|2,{48,104,0}}, +/* 1271 */ {(11<<2)|2,{48,104,0}}, +/* 1272 */ {(11<<2)|2,{48,104,0}}, +/* 1273 */ {(11<<2)|2,{48,104,0}}, +/* 1274 */ {(11<<2)|2,{48,104,0}}, +/* 1275 */ {(11<<2)|2,{48,104,0}}, +/* 1276 */ {(11<<2)|2,{48,104,0}}, +/* 1277 */ {(11<<2)|2,{48,104,0}}, +/* 1278 */ {(11<<2)|2,{48,104,0}}, +/* 1279 */ {(11<<2)|2,{48,104,0}}, +/* 1280 */ {(16<<2)|3,{48,108,48}}, +/* 1281 */ {(16<<2)|3,{48,108,49}}, +/* 1282 */ {(16<<2)|3,{48,108,50}}, +/* 1283 */ {(16<<2)|3,{48,108,97}}, +/* 1284 */ {(16<<2)|3,{48,108,99}}, +/* 1285 */ {(16<<2)|3,{48,108,101}}, +/* 1286 */ {(16<<2)|3,{48,108,105}}, +/* 1287 */ {(16<<2)|3,{48,108,111}}, +/* 1288 */ {(16<<2)|3,{48,108,115}}, +/* 1289 */ {(16<<2)|3,{48,108,116}}, +/* 1290 */ {(11<<2)|2,{48,108,0}}, +/* 1291 */ {(11<<2)|2,{48,108,0}}, +/* 1292 */ {(11<<2)|2,{48,108,0}}, +/* 1293 */ {(11<<2)|2,{48,108,0}}, +/* 1294 */ {(11<<2)|2,{48,108,0}}, +/* 1295 */ {(11<<2)|2,{48,108,0}}, +/* 1296 */ {(11<<2)|2,{48,108,0}}, +/* 1297 */ {(11<<2)|2,{48,108,0}}, +/* 1298 */ {(11<<2)|2,{48,108,0}}, +/* 1299 */ {(11<<2)|2,{48,108,0}}, +/* 1300 */ {(11<<2)|2,{48,108,0}}, +/* 1301 */ {(11<<2)|2,{48,108,0}}, +/* 1302 */ {(11<<2)|2,{48,108,0}}, +/* 1303 */ {(11<<2)|2,{48,108,0}}, +/* 1304 */ {(11<<2)|2,{48,108,0}}, +/* 1305 */ {(11<<2)|2,{48,108,0}}, +/* 1306 */ {(11<<2)|2,{48,108,0}}, +/* 1307 */ {(11<<2)|2,{48,108,0}}, +/* 1308 */ {(11<<2)|2,{48,108,0}}, +/* 1309 */ {(11<<2)|2,{48,108,0}}, +/* 1310 */ {(11<<2)|2,{48,108,0}}, +/* 1311 */ {(11<<2)|2,{48,108,0}}, +/* 1312 */ {(16<<2)|3,{48,109,48}}, +/* 1313 */ {(16<<2)|3,{48,109,49}}, +/* 1314 */ {(16<<2)|3,{48,109,50}}, +/* 1315 */ {(16<<2)|3,{48,109,97}}, +/* 1316 */ {(16<<2)|3,{48,109,99}}, +/* 1317 */ {(16<<2)|3,{48,109,101}}, +/* 1318 */ {(16<<2)|3,{48,109,105}}, +/* 1319 */ {(16<<2)|3,{48,109,111}}, +/* 1320 */ {(16<<2)|3,{48,109,115}}, +/* 1321 */ {(16<<2)|3,{48,109,116}}, +/* 1322 */ {(11<<2)|2,{48,109,0}}, +/* 1323 */ {(11<<2)|2,{48,109,0}}, +/* 1324 */ {(11<<2)|2,{48,109,0}}, +/* 1325 */ {(11<<2)|2,{48,109,0}}, +/* 1326 */ {(11<<2)|2,{48,109,0}}, +/* 1327 */ {(11<<2)|2,{48,109,0}}, +/* 1328 */ {(11<<2)|2,{48,109,0}}, +/* 1329 */ {(11<<2)|2,{48,109,0}}, +/* 1330 */ {(11<<2)|2,{48,109,0}}, +/* 1331 */ {(11<<2)|2,{48,109,0}}, +/* 1332 */ {(11<<2)|2,{48,109,0}}, +/* 1333 */ {(11<<2)|2,{48,109,0}}, +/* 1334 */ {(11<<2)|2,{48,109,0}}, +/* 1335 */ {(11<<2)|2,{48,109,0}}, +/* 1336 */ {(11<<2)|2,{48,109,0}}, +/* 1337 */ {(11<<2)|2,{48,109,0}}, +/* 1338 */ {(11<<2)|2,{48,109,0}}, +/* 1339 */ {(11<<2)|2,{48,109,0}}, +/* 1340 */ {(11<<2)|2,{48,109,0}}, +/* 1341 */ {(11<<2)|2,{48,109,0}}, +/* 1342 */ {(11<<2)|2,{48,109,0}}, +/* 1343 */ {(11<<2)|2,{48,109,0}}, +/* 1344 */ {(16<<2)|3,{48,110,48}}, +/* 1345 */ {(16<<2)|3,{48,110,49}}, +/* 1346 */ {(16<<2)|3,{48,110,50}}, +/* 1347 */ {(16<<2)|3,{48,110,97}}, +/* 1348 */ {(16<<2)|3,{48,110,99}}, +/* 1349 */ {(16<<2)|3,{48,110,101}}, +/* 1350 */ {(16<<2)|3,{48,110,105}}, +/* 1351 */ {(16<<2)|3,{48,110,111}}, +/* 1352 */ {(16<<2)|3,{48,110,115}}, +/* 1353 */ {(16<<2)|3,{48,110,116}}, +/* 1354 */ {(11<<2)|2,{48,110,0}}, +/* 1355 */ {(11<<2)|2,{48,110,0}}, +/* 1356 */ {(11<<2)|2,{48,110,0}}, +/* 1357 */ {(11<<2)|2,{48,110,0}}, +/* 1358 */ {(11<<2)|2,{48,110,0}}, +/* 1359 */ {(11<<2)|2,{48,110,0}}, +/* 1360 */ {(11<<2)|2,{48,110,0}}, +/* 1361 */ {(11<<2)|2,{48,110,0}}, +/* 1362 */ {(11<<2)|2,{48,110,0}}, +/* 1363 */ {(11<<2)|2,{48,110,0}}, +/* 1364 */ {(11<<2)|2,{48,110,0}}, +/* 1365 */ {(11<<2)|2,{48,110,0}}, +/* 1366 */ {(11<<2)|2,{48,110,0}}, +/* 1367 */ {(11<<2)|2,{48,110,0}}, +/* 1368 */ {(11<<2)|2,{48,110,0}}, +/* 1369 */ {(11<<2)|2,{48,110,0}}, +/* 1370 */ {(11<<2)|2,{48,110,0}}, +/* 1371 */ {(11<<2)|2,{48,110,0}}, +/* 1372 */ {(11<<2)|2,{48,110,0}}, +/* 1373 */ {(11<<2)|2,{48,110,0}}, +/* 1374 */ {(11<<2)|2,{48,110,0}}, +/* 1375 */ {(11<<2)|2,{48,110,0}}, +/* 1376 */ {(16<<2)|3,{48,112,48}}, +/* 1377 */ {(16<<2)|3,{48,112,49}}, +/* 1378 */ {(16<<2)|3,{48,112,50}}, +/* 1379 */ {(16<<2)|3,{48,112,97}}, +/* 1380 */ {(16<<2)|3,{48,112,99}}, +/* 1381 */ {(16<<2)|3,{48,112,101}}, +/* 1382 */ {(16<<2)|3,{48,112,105}}, +/* 1383 */ {(16<<2)|3,{48,112,111}}, +/* 1384 */ {(16<<2)|3,{48,112,115}}, +/* 1385 */ {(16<<2)|3,{48,112,116}}, +/* 1386 */ {(11<<2)|2,{48,112,0}}, +/* 1387 */ {(11<<2)|2,{48,112,0}}, +/* 1388 */ {(11<<2)|2,{48,112,0}}, +/* 1389 */ {(11<<2)|2,{48,112,0}}, +/* 1390 */ {(11<<2)|2,{48,112,0}}, +/* 1391 */ {(11<<2)|2,{48,112,0}}, +/* 1392 */ {(11<<2)|2,{48,112,0}}, +/* 1393 */ {(11<<2)|2,{48,112,0}}, +/* 1394 */ {(11<<2)|2,{48,112,0}}, +/* 1395 */ {(11<<2)|2,{48,112,0}}, +/* 1396 */ {(11<<2)|2,{48,112,0}}, +/* 1397 */ {(11<<2)|2,{48,112,0}}, +/* 1398 */ {(11<<2)|2,{48,112,0}}, +/* 1399 */ {(11<<2)|2,{48,112,0}}, +/* 1400 */ {(11<<2)|2,{48,112,0}}, +/* 1401 */ {(11<<2)|2,{48,112,0}}, +/* 1402 */ {(11<<2)|2,{48,112,0}}, +/* 1403 */ {(11<<2)|2,{48,112,0}}, +/* 1404 */ {(11<<2)|2,{48,112,0}}, +/* 1405 */ {(11<<2)|2,{48,112,0}}, +/* 1406 */ {(11<<2)|2,{48,112,0}}, +/* 1407 */ {(11<<2)|2,{48,112,0}}, +/* 1408 */ {(16<<2)|3,{48,114,48}}, +/* 1409 */ {(16<<2)|3,{48,114,49}}, +/* 1410 */ {(16<<2)|3,{48,114,50}}, +/* 1411 */ {(16<<2)|3,{48,114,97}}, +/* 1412 */ {(16<<2)|3,{48,114,99}}, +/* 1413 */ {(16<<2)|3,{48,114,101}}, +/* 1414 */ {(16<<2)|3,{48,114,105}}, +/* 1415 */ {(16<<2)|3,{48,114,111}}, +/* 1416 */ {(16<<2)|3,{48,114,115}}, +/* 1417 */ {(16<<2)|3,{48,114,116}}, +/* 1418 */ {(11<<2)|2,{48,114,0}}, +/* 1419 */ {(11<<2)|2,{48,114,0}}, +/* 1420 */ {(11<<2)|2,{48,114,0}}, +/* 1421 */ {(11<<2)|2,{48,114,0}}, +/* 1422 */ {(11<<2)|2,{48,114,0}}, +/* 1423 */ {(11<<2)|2,{48,114,0}}, +/* 1424 */ {(11<<2)|2,{48,114,0}}, +/* 1425 */ {(11<<2)|2,{48,114,0}}, +/* 1426 */ {(11<<2)|2,{48,114,0}}, +/* 1427 */ {(11<<2)|2,{48,114,0}}, +/* 1428 */ {(11<<2)|2,{48,114,0}}, +/* 1429 */ {(11<<2)|2,{48,114,0}}, +/* 1430 */ {(11<<2)|2,{48,114,0}}, +/* 1431 */ {(11<<2)|2,{48,114,0}}, +/* 1432 */ {(11<<2)|2,{48,114,0}}, +/* 1433 */ {(11<<2)|2,{48,114,0}}, +/* 1434 */ {(11<<2)|2,{48,114,0}}, +/* 1435 */ {(11<<2)|2,{48,114,0}}, +/* 1436 */ {(11<<2)|2,{48,114,0}}, +/* 1437 */ {(11<<2)|2,{48,114,0}}, +/* 1438 */ {(11<<2)|2,{48,114,0}}, +/* 1439 */ {(11<<2)|2,{48,114,0}}, +/* 1440 */ {(16<<2)|3,{48,117,48}}, +/* 1441 */ {(16<<2)|3,{48,117,49}}, +/* 1442 */ {(16<<2)|3,{48,117,50}}, +/* 1443 */ {(16<<2)|3,{48,117,97}}, +/* 1444 */ {(16<<2)|3,{48,117,99}}, +/* 1445 */ {(16<<2)|3,{48,117,101}}, +/* 1446 */ {(16<<2)|3,{48,117,105}}, +/* 1447 */ {(16<<2)|3,{48,117,111}}, +/* 1448 */ {(16<<2)|3,{48,117,115}}, +/* 1449 */ {(16<<2)|3,{48,117,116}}, +/* 1450 */ {(11<<2)|2,{48,117,0}}, +/* 1451 */ {(11<<2)|2,{48,117,0}}, +/* 1452 */ {(11<<2)|2,{48,117,0}}, +/* 1453 */ {(11<<2)|2,{48,117,0}}, +/* 1454 */ {(11<<2)|2,{48,117,0}}, +/* 1455 */ {(11<<2)|2,{48,117,0}}, +/* 1456 */ {(11<<2)|2,{48,117,0}}, +/* 1457 */ {(11<<2)|2,{48,117,0}}, +/* 1458 */ {(11<<2)|2,{48,117,0}}, +/* 1459 */ {(11<<2)|2,{48,117,0}}, +/* 1460 */ {(11<<2)|2,{48,117,0}}, +/* 1461 */ {(11<<2)|2,{48,117,0}}, +/* 1462 */ {(11<<2)|2,{48,117,0}}, +/* 1463 */ {(11<<2)|2,{48,117,0}}, +/* 1464 */ {(11<<2)|2,{48,117,0}}, +/* 1465 */ {(11<<2)|2,{48,117,0}}, +/* 1466 */ {(11<<2)|2,{48,117,0}}, +/* 1467 */ {(11<<2)|2,{48,117,0}}, +/* 1468 */ {(11<<2)|2,{48,117,0}}, +/* 1469 */ {(11<<2)|2,{48,117,0}}, +/* 1470 */ {(11<<2)|2,{48,117,0}}, +/* 1471 */ {(11<<2)|2,{48,117,0}}, +/* 1472 */ {(12<<2)|2,{48,58,0}}, +/* 1473 */ {(12<<2)|2,{48,58,0}}, +/* 1474 */ {(12<<2)|2,{48,58,0}}, +/* 1475 */ {(12<<2)|2,{48,58,0}}, +/* 1476 */ {(12<<2)|2,{48,58,0}}, +/* 1477 */ {(12<<2)|2,{48,58,0}}, +/* 1478 */ {(12<<2)|2,{48,58,0}}, +/* 1479 */ {(12<<2)|2,{48,58,0}}, +/* 1480 */ {(12<<2)|2,{48,58,0}}, +/* 1481 */ {(12<<2)|2,{48,58,0}}, +/* 1482 */ {(12<<2)|2,{48,58,0}}, +/* 1483 */ {(12<<2)|2,{48,58,0}}, +/* 1484 */ {(12<<2)|2,{48,58,0}}, +/* 1485 */ {(12<<2)|2,{48,58,0}}, +/* 1486 */ {(12<<2)|2,{48,58,0}}, +/* 1487 */ {(12<<2)|2,{48,58,0}}, +/* 1488 */ {(12<<2)|2,{48,66,0}}, +/* 1489 */ {(12<<2)|2,{48,66,0}}, +/* 1490 */ {(12<<2)|2,{48,66,0}}, +/* 1491 */ {(12<<2)|2,{48,66,0}}, +/* 1492 */ {(12<<2)|2,{48,66,0}}, +/* 1493 */ {(12<<2)|2,{48,66,0}}, +/* 1494 */ {(12<<2)|2,{48,66,0}}, +/* 1495 */ {(12<<2)|2,{48,66,0}}, +/* 1496 */ {(12<<2)|2,{48,66,0}}, +/* 1497 */ {(12<<2)|2,{48,66,0}}, +/* 1498 */ {(12<<2)|2,{48,66,0}}, +/* 1499 */ {(12<<2)|2,{48,66,0}}, +/* 1500 */ {(12<<2)|2,{48,66,0}}, +/* 1501 */ {(12<<2)|2,{48,66,0}}, +/* 1502 */ {(12<<2)|2,{48,66,0}}, +/* 1503 */ {(12<<2)|2,{48,66,0}}, +/* 1504 */ {(12<<2)|2,{48,67,0}}, +/* 1505 */ {(12<<2)|2,{48,67,0}}, +/* 1506 */ {(12<<2)|2,{48,67,0}}, +/* 1507 */ {(12<<2)|2,{48,67,0}}, +/* 1508 */ {(12<<2)|2,{48,67,0}}, +/* 1509 */ {(12<<2)|2,{48,67,0}}, +/* 1510 */ {(12<<2)|2,{48,67,0}}, +/* 1511 */ {(12<<2)|2,{48,67,0}}, +/* 1512 */ {(12<<2)|2,{48,67,0}}, +/* 1513 */ {(12<<2)|2,{48,67,0}}, +/* 1514 */ {(12<<2)|2,{48,67,0}}, +/* 1515 */ {(12<<2)|2,{48,67,0}}, +/* 1516 */ {(12<<2)|2,{48,67,0}}, +/* 1517 */ {(12<<2)|2,{48,67,0}}, +/* 1518 */ {(12<<2)|2,{48,67,0}}, +/* 1519 */ {(12<<2)|2,{48,67,0}}, +/* 1520 */ {(12<<2)|2,{48,68,0}}, +/* 1521 */ {(12<<2)|2,{48,68,0}}, +/* 1522 */ {(12<<2)|2,{48,68,0}}, +/* 1523 */ {(12<<2)|2,{48,68,0}}, +/* 1524 */ {(12<<2)|2,{48,68,0}}, +/* 1525 */ {(12<<2)|2,{48,68,0}}, +/* 1526 */ {(12<<2)|2,{48,68,0}}, +/* 1527 */ {(12<<2)|2,{48,68,0}}, +/* 1528 */ {(12<<2)|2,{48,68,0}}, +/* 1529 */ {(12<<2)|2,{48,68,0}}, +/* 1530 */ {(12<<2)|2,{48,68,0}}, +/* 1531 */ {(12<<2)|2,{48,68,0}}, +/* 1532 */ {(12<<2)|2,{48,68,0}}, +/* 1533 */ {(12<<2)|2,{48,68,0}}, +/* 1534 */ {(12<<2)|2,{48,68,0}}, +/* 1535 */ {(12<<2)|2,{48,68,0}}, +/* 1536 */ {(12<<2)|2,{48,69,0}}, +/* 1537 */ {(12<<2)|2,{48,69,0}}, +/* 1538 */ {(12<<2)|2,{48,69,0}}, +/* 1539 */ {(12<<2)|2,{48,69,0}}, +/* 1540 */ {(12<<2)|2,{48,69,0}}, +/* 1541 */ {(12<<2)|2,{48,69,0}}, +/* 1542 */ {(12<<2)|2,{48,69,0}}, +/* 1543 */ {(12<<2)|2,{48,69,0}}, +/* 1544 */ {(12<<2)|2,{48,69,0}}, +/* 1545 */ {(12<<2)|2,{48,69,0}}, +/* 1546 */ {(12<<2)|2,{48,69,0}}, +/* 1547 */ {(12<<2)|2,{48,69,0}}, +/* 1548 */ {(12<<2)|2,{48,69,0}}, +/* 1549 */ {(12<<2)|2,{48,69,0}}, +/* 1550 */ {(12<<2)|2,{48,69,0}}, +/* 1551 */ {(12<<2)|2,{48,69,0}}, +/* 1552 */ {(12<<2)|2,{48,70,0}}, +/* 1553 */ {(12<<2)|2,{48,70,0}}, +/* 1554 */ {(12<<2)|2,{48,70,0}}, +/* 1555 */ {(12<<2)|2,{48,70,0}}, +/* 1556 */ {(12<<2)|2,{48,70,0}}, +/* 1557 */ {(12<<2)|2,{48,70,0}}, +/* 1558 */ {(12<<2)|2,{48,70,0}}, +/* 1559 */ {(12<<2)|2,{48,70,0}}, +/* 1560 */ {(12<<2)|2,{48,70,0}}, +/* 1561 */ {(12<<2)|2,{48,70,0}}, +/* 1562 */ {(12<<2)|2,{48,70,0}}, +/* 1563 */ {(12<<2)|2,{48,70,0}}, +/* 1564 */ {(12<<2)|2,{48,70,0}}, +/* 1565 */ {(12<<2)|2,{48,70,0}}, +/* 1566 */ {(12<<2)|2,{48,70,0}}, +/* 1567 */ {(12<<2)|2,{48,70,0}}, +/* 1568 */ {(12<<2)|2,{48,71,0}}, +/* 1569 */ {(12<<2)|2,{48,71,0}}, +/* 1570 */ {(12<<2)|2,{48,71,0}}, +/* 1571 */ {(12<<2)|2,{48,71,0}}, +/* 1572 */ {(12<<2)|2,{48,71,0}}, +/* 1573 */ {(12<<2)|2,{48,71,0}}, +/* 1574 */ {(12<<2)|2,{48,71,0}}, +/* 1575 */ {(12<<2)|2,{48,71,0}}, +/* 1576 */ {(12<<2)|2,{48,71,0}}, +/* 1577 */ {(12<<2)|2,{48,71,0}}, +/* 1578 */ {(12<<2)|2,{48,71,0}}, +/* 1579 */ {(12<<2)|2,{48,71,0}}, +/* 1580 */ {(12<<2)|2,{48,71,0}}, +/* 1581 */ {(12<<2)|2,{48,71,0}}, +/* 1582 */ {(12<<2)|2,{48,71,0}}, +/* 1583 */ {(12<<2)|2,{48,71,0}}, +/* 1584 */ {(12<<2)|2,{48,72,0}}, +/* 1585 */ {(12<<2)|2,{48,72,0}}, +/* 1586 */ {(12<<2)|2,{48,72,0}}, +/* 1587 */ {(12<<2)|2,{48,72,0}}, +/* 1588 */ {(12<<2)|2,{48,72,0}}, +/* 1589 */ {(12<<2)|2,{48,72,0}}, +/* 1590 */ {(12<<2)|2,{48,72,0}}, +/* 1591 */ {(12<<2)|2,{48,72,0}}, +/* 1592 */ {(12<<2)|2,{48,72,0}}, +/* 1593 */ {(12<<2)|2,{48,72,0}}, +/* 1594 */ {(12<<2)|2,{48,72,0}}, +/* 1595 */ {(12<<2)|2,{48,72,0}}, +/* 1596 */ {(12<<2)|2,{48,72,0}}, +/* 1597 */ {(12<<2)|2,{48,72,0}}, +/* 1598 */ {(12<<2)|2,{48,72,0}}, +/* 1599 */ {(12<<2)|2,{48,72,0}}, +/* 1600 */ {(12<<2)|2,{48,73,0}}, +/* 1601 */ {(12<<2)|2,{48,73,0}}, +/* 1602 */ {(12<<2)|2,{48,73,0}}, +/* 1603 */ {(12<<2)|2,{48,73,0}}, +/* 1604 */ {(12<<2)|2,{48,73,0}}, +/* 1605 */ {(12<<2)|2,{48,73,0}}, +/* 1606 */ {(12<<2)|2,{48,73,0}}, +/* 1607 */ {(12<<2)|2,{48,73,0}}, +/* 1608 */ {(12<<2)|2,{48,73,0}}, +/* 1609 */ {(12<<2)|2,{48,73,0}}, +/* 1610 */ {(12<<2)|2,{48,73,0}}, +/* 1611 */ {(12<<2)|2,{48,73,0}}, +/* 1612 */ {(12<<2)|2,{48,73,0}}, +/* 1613 */ {(12<<2)|2,{48,73,0}}, +/* 1614 */ {(12<<2)|2,{48,73,0}}, +/* 1615 */ {(12<<2)|2,{48,73,0}}, +/* 1616 */ {(12<<2)|2,{48,74,0}}, +/* 1617 */ {(12<<2)|2,{48,74,0}}, +/* 1618 */ {(12<<2)|2,{48,74,0}}, +/* 1619 */ {(12<<2)|2,{48,74,0}}, +/* 1620 */ {(12<<2)|2,{48,74,0}}, +/* 1621 */ {(12<<2)|2,{48,74,0}}, +/* 1622 */ {(12<<2)|2,{48,74,0}}, +/* 1623 */ {(12<<2)|2,{48,74,0}}, +/* 1624 */ {(12<<2)|2,{48,74,0}}, +/* 1625 */ {(12<<2)|2,{48,74,0}}, +/* 1626 */ {(12<<2)|2,{48,74,0}}, +/* 1627 */ {(12<<2)|2,{48,74,0}}, +/* 1628 */ {(12<<2)|2,{48,74,0}}, +/* 1629 */ {(12<<2)|2,{48,74,0}}, +/* 1630 */ {(12<<2)|2,{48,74,0}}, +/* 1631 */ {(12<<2)|2,{48,74,0}}, +/* 1632 */ {(12<<2)|2,{48,75,0}}, +/* 1633 */ {(12<<2)|2,{48,75,0}}, +/* 1634 */ {(12<<2)|2,{48,75,0}}, +/* 1635 */ {(12<<2)|2,{48,75,0}}, +/* 1636 */ {(12<<2)|2,{48,75,0}}, +/* 1637 */ {(12<<2)|2,{48,75,0}}, +/* 1638 */ {(12<<2)|2,{48,75,0}}, +/* 1639 */ {(12<<2)|2,{48,75,0}}, +/* 1640 */ {(12<<2)|2,{48,75,0}}, +/* 1641 */ {(12<<2)|2,{48,75,0}}, +/* 1642 */ {(12<<2)|2,{48,75,0}}, +/* 1643 */ {(12<<2)|2,{48,75,0}}, +/* 1644 */ {(12<<2)|2,{48,75,0}}, +/* 1645 */ {(12<<2)|2,{48,75,0}}, +/* 1646 */ {(12<<2)|2,{48,75,0}}, +/* 1647 */ {(12<<2)|2,{48,75,0}}, +/* 1648 */ {(12<<2)|2,{48,76,0}}, +/* 1649 */ {(12<<2)|2,{48,76,0}}, +/* 1650 */ {(12<<2)|2,{48,76,0}}, +/* 1651 */ {(12<<2)|2,{48,76,0}}, +/* 1652 */ {(12<<2)|2,{48,76,0}}, +/* 1653 */ {(12<<2)|2,{48,76,0}}, +/* 1654 */ {(12<<2)|2,{48,76,0}}, +/* 1655 */ {(12<<2)|2,{48,76,0}}, +/* 1656 */ {(12<<2)|2,{48,76,0}}, +/* 1657 */ {(12<<2)|2,{48,76,0}}, +/* 1658 */ {(12<<2)|2,{48,76,0}}, +/* 1659 */ {(12<<2)|2,{48,76,0}}, +/* 1660 */ {(12<<2)|2,{48,76,0}}, +/* 1661 */ {(12<<2)|2,{48,76,0}}, +/* 1662 */ {(12<<2)|2,{48,76,0}}, +/* 1663 */ {(12<<2)|2,{48,76,0}}, +/* 1664 */ {(12<<2)|2,{48,77,0}}, +/* 1665 */ {(12<<2)|2,{48,77,0}}, +/* 1666 */ {(12<<2)|2,{48,77,0}}, +/* 1667 */ {(12<<2)|2,{48,77,0}}, +/* 1668 */ {(12<<2)|2,{48,77,0}}, +/* 1669 */ {(12<<2)|2,{48,77,0}}, +/* 1670 */ {(12<<2)|2,{48,77,0}}, +/* 1671 */ {(12<<2)|2,{48,77,0}}, +/* 1672 */ {(12<<2)|2,{48,77,0}}, +/* 1673 */ {(12<<2)|2,{48,77,0}}, +/* 1674 */ {(12<<2)|2,{48,77,0}}, +/* 1675 */ {(12<<2)|2,{48,77,0}}, +/* 1676 */ {(12<<2)|2,{48,77,0}}, +/* 1677 */ {(12<<2)|2,{48,77,0}}, +/* 1678 */ {(12<<2)|2,{48,77,0}}, +/* 1679 */ {(12<<2)|2,{48,77,0}}, +/* 1680 */ {(12<<2)|2,{48,78,0}}, +/* 1681 */ {(12<<2)|2,{48,78,0}}, +/* 1682 */ {(12<<2)|2,{48,78,0}}, +/* 1683 */ {(12<<2)|2,{48,78,0}}, +/* 1684 */ {(12<<2)|2,{48,78,0}}, +/* 1685 */ {(12<<2)|2,{48,78,0}}, +/* 1686 */ {(12<<2)|2,{48,78,0}}, +/* 1687 */ {(12<<2)|2,{48,78,0}}, +/* 1688 */ {(12<<2)|2,{48,78,0}}, +/* 1689 */ {(12<<2)|2,{48,78,0}}, +/* 1690 */ {(12<<2)|2,{48,78,0}}, +/* 1691 */ {(12<<2)|2,{48,78,0}}, +/* 1692 */ {(12<<2)|2,{48,78,0}}, +/* 1693 */ {(12<<2)|2,{48,78,0}}, +/* 1694 */ {(12<<2)|2,{48,78,0}}, +/* 1695 */ {(12<<2)|2,{48,78,0}}, +/* 1696 */ {(12<<2)|2,{48,79,0}}, +/* 1697 */ {(12<<2)|2,{48,79,0}}, +/* 1698 */ {(12<<2)|2,{48,79,0}}, +/* 1699 */ {(12<<2)|2,{48,79,0}}, +/* 1700 */ {(12<<2)|2,{48,79,0}}, +/* 1701 */ {(12<<2)|2,{48,79,0}}, +/* 1702 */ {(12<<2)|2,{48,79,0}}, +/* 1703 */ {(12<<2)|2,{48,79,0}}, +/* 1704 */ {(12<<2)|2,{48,79,0}}, +/* 1705 */ {(12<<2)|2,{48,79,0}}, +/* 1706 */ {(12<<2)|2,{48,79,0}}, +/* 1707 */ {(12<<2)|2,{48,79,0}}, +/* 1708 */ {(12<<2)|2,{48,79,0}}, +/* 1709 */ {(12<<2)|2,{48,79,0}}, +/* 1710 */ {(12<<2)|2,{48,79,0}}, +/* 1711 */ {(12<<2)|2,{48,79,0}}, +/* 1712 */ {(12<<2)|2,{48,80,0}}, +/* 1713 */ {(12<<2)|2,{48,80,0}}, +/* 1714 */ {(12<<2)|2,{48,80,0}}, +/* 1715 */ {(12<<2)|2,{48,80,0}}, +/* 1716 */ {(12<<2)|2,{48,80,0}}, +/* 1717 */ {(12<<2)|2,{48,80,0}}, +/* 1718 */ {(12<<2)|2,{48,80,0}}, +/* 1719 */ {(12<<2)|2,{48,80,0}}, +/* 1720 */ {(12<<2)|2,{48,80,0}}, +/* 1721 */ {(12<<2)|2,{48,80,0}}, +/* 1722 */ {(12<<2)|2,{48,80,0}}, +/* 1723 */ {(12<<2)|2,{48,80,0}}, +/* 1724 */ {(12<<2)|2,{48,80,0}}, +/* 1725 */ {(12<<2)|2,{48,80,0}}, +/* 1726 */ {(12<<2)|2,{48,80,0}}, +/* 1727 */ {(12<<2)|2,{48,80,0}}, +/* 1728 */ {(12<<2)|2,{48,81,0}}, +/* 1729 */ {(12<<2)|2,{48,81,0}}, +/* 1730 */ {(12<<2)|2,{48,81,0}}, +/* 1731 */ {(12<<2)|2,{48,81,0}}, +/* 1732 */ {(12<<2)|2,{48,81,0}}, +/* 1733 */ {(12<<2)|2,{48,81,0}}, +/* 1734 */ {(12<<2)|2,{48,81,0}}, +/* 1735 */ {(12<<2)|2,{48,81,0}}, +/* 1736 */ {(12<<2)|2,{48,81,0}}, +/* 1737 */ {(12<<2)|2,{48,81,0}}, +/* 1738 */ {(12<<2)|2,{48,81,0}}, +/* 1739 */ {(12<<2)|2,{48,81,0}}, +/* 1740 */ {(12<<2)|2,{48,81,0}}, +/* 1741 */ {(12<<2)|2,{48,81,0}}, +/* 1742 */ {(12<<2)|2,{48,81,0}}, +/* 1743 */ {(12<<2)|2,{48,81,0}}, +/* 1744 */ {(12<<2)|2,{48,82,0}}, +/* 1745 */ {(12<<2)|2,{48,82,0}}, +/* 1746 */ {(12<<2)|2,{48,82,0}}, +/* 1747 */ {(12<<2)|2,{48,82,0}}, +/* 1748 */ {(12<<2)|2,{48,82,0}}, +/* 1749 */ {(12<<2)|2,{48,82,0}}, +/* 1750 */ {(12<<2)|2,{48,82,0}}, +/* 1751 */ {(12<<2)|2,{48,82,0}}, +/* 1752 */ {(12<<2)|2,{48,82,0}}, +/* 1753 */ {(12<<2)|2,{48,82,0}}, +/* 1754 */ {(12<<2)|2,{48,82,0}}, +/* 1755 */ {(12<<2)|2,{48,82,0}}, +/* 1756 */ {(12<<2)|2,{48,82,0}}, +/* 1757 */ {(12<<2)|2,{48,82,0}}, +/* 1758 */ {(12<<2)|2,{48,82,0}}, +/* 1759 */ {(12<<2)|2,{48,82,0}}, +/* 1760 */ {(12<<2)|2,{48,83,0}}, +/* 1761 */ {(12<<2)|2,{48,83,0}}, +/* 1762 */ {(12<<2)|2,{48,83,0}}, +/* 1763 */ {(12<<2)|2,{48,83,0}}, +/* 1764 */ {(12<<2)|2,{48,83,0}}, +/* 1765 */ {(12<<2)|2,{48,83,0}}, +/* 1766 */ {(12<<2)|2,{48,83,0}}, +/* 1767 */ {(12<<2)|2,{48,83,0}}, +/* 1768 */ {(12<<2)|2,{48,83,0}}, +/* 1769 */ {(12<<2)|2,{48,83,0}}, +/* 1770 */ {(12<<2)|2,{48,83,0}}, +/* 1771 */ {(12<<2)|2,{48,83,0}}, +/* 1772 */ {(12<<2)|2,{48,83,0}}, +/* 1773 */ {(12<<2)|2,{48,83,0}}, +/* 1774 */ {(12<<2)|2,{48,83,0}}, +/* 1775 */ {(12<<2)|2,{48,83,0}}, +/* 1776 */ {(12<<2)|2,{48,84,0}}, +/* 1777 */ {(12<<2)|2,{48,84,0}}, +/* 1778 */ {(12<<2)|2,{48,84,0}}, +/* 1779 */ {(12<<2)|2,{48,84,0}}, +/* 1780 */ {(12<<2)|2,{48,84,0}}, +/* 1781 */ {(12<<2)|2,{48,84,0}}, +/* 1782 */ {(12<<2)|2,{48,84,0}}, +/* 1783 */ {(12<<2)|2,{48,84,0}}, +/* 1784 */ {(12<<2)|2,{48,84,0}}, +/* 1785 */ {(12<<2)|2,{48,84,0}}, +/* 1786 */ {(12<<2)|2,{48,84,0}}, +/* 1787 */ {(12<<2)|2,{48,84,0}}, +/* 1788 */ {(12<<2)|2,{48,84,0}}, +/* 1789 */ {(12<<2)|2,{48,84,0}}, +/* 1790 */ {(12<<2)|2,{48,84,0}}, +/* 1791 */ {(12<<2)|2,{48,84,0}}, +/* 1792 */ {(12<<2)|2,{48,85,0}}, +/* 1793 */ {(12<<2)|2,{48,85,0}}, +/* 1794 */ {(12<<2)|2,{48,85,0}}, +/* 1795 */ {(12<<2)|2,{48,85,0}}, +/* 1796 */ {(12<<2)|2,{48,85,0}}, +/* 1797 */ {(12<<2)|2,{48,85,0}}, +/* 1798 */ {(12<<2)|2,{48,85,0}}, +/* 1799 */ {(12<<2)|2,{48,85,0}}, +/* 1800 */ {(12<<2)|2,{48,85,0}}, +/* 1801 */ {(12<<2)|2,{48,85,0}}, +/* 1802 */ {(12<<2)|2,{48,85,0}}, +/* 1803 */ {(12<<2)|2,{48,85,0}}, +/* 1804 */ {(12<<2)|2,{48,85,0}}, +/* 1805 */ {(12<<2)|2,{48,85,0}}, +/* 1806 */ {(12<<2)|2,{48,85,0}}, +/* 1807 */ {(12<<2)|2,{48,85,0}}, +/* 1808 */ {(12<<2)|2,{48,86,0}}, +/* 1809 */ {(12<<2)|2,{48,86,0}}, +/* 1810 */ {(12<<2)|2,{48,86,0}}, +/* 1811 */ {(12<<2)|2,{48,86,0}}, +/* 1812 */ {(12<<2)|2,{48,86,0}}, +/* 1813 */ {(12<<2)|2,{48,86,0}}, +/* 1814 */ {(12<<2)|2,{48,86,0}}, +/* 1815 */ {(12<<2)|2,{48,86,0}}, +/* 1816 */ {(12<<2)|2,{48,86,0}}, +/* 1817 */ {(12<<2)|2,{48,86,0}}, +/* 1818 */ {(12<<2)|2,{48,86,0}}, +/* 1819 */ {(12<<2)|2,{48,86,0}}, +/* 1820 */ {(12<<2)|2,{48,86,0}}, +/* 1821 */ {(12<<2)|2,{48,86,0}}, +/* 1822 */ {(12<<2)|2,{48,86,0}}, +/* 1823 */ {(12<<2)|2,{48,86,0}}, +/* 1824 */ {(12<<2)|2,{48,87,0}}, +/* 1825 */ {(12<<2)|2,{48,87,0}}, +/* 1826 */ {(12<<2)|2,{48,87,0}}, +/* 1827 */ {(12<<2)|2,{48,87,0}}, +/* 1828 */ {(12<<2)|2,{48,87,0}}, +/* 1829 */ {(12<<2)|2,{48,87,0}}, +/* 1830 */ {(12<<2)|2,{48,87,0}}, +/* 1831 */ {(12<<2)|2,{48,87,0}}, +/* 1832 */ {(12<<2)|2,{48,87,0}}, +/* 1833 */ {(12<<2)|2,{48,87,0}}, +/* 1834 */ {(12<<2)|2,{48,87,0}}, +/* 1835 */ {(12<<2)|2,{48,87,0}}, +/* 1836 */ {(12<<2)|2,{48,87,0}}, +/* 1837 */ {(12<<2)|2,{48,87,0}}, +/* 1838 */ {(12<<2)|2,{48,87,0}}, +/* 1839 */ {(12<<2)|2,{48,87,0}}, +/* 1840 */ {(12<<2)|2,{48,89,0}}, +/* 1841 */ {(12<<2)|2,{48,89,0}}, +/* 1842 */ {(12<<2)|2,{48,89,0}}, +/* 1843 */ {(12<<2)|2,{48,89,0}}, +/* 1844 */ {(12<<2)|2,{48,89,0}}, +/* 1845 */ {(12<<2)|2,{48,89,0}}, +/* 1846 */ {(12<<2)|2,{48,89,0}}, +/* 1847 */ {(12<<2)|2,{48,89,0}}, +/* 1848 */ {(12<<2)|2,{48,89,0}}, +/* 1849 */ {(12<<2)|2,{48,89,0}}, +/* 1850 */ {(12<<2)|2,{48,89,0}}, +/* 1851 */ {(12<<2)|2,{48,89,0}}, +/* 1852 */ {(12<<2)|2,{48,89,0}}, +/* 1853 */ {(12<<2)|2,{48,89,0}}, +/* 1854 */ {(12<<2)|2,{48,89,0}}, +/* 1855 */ {(12<<2)|2,{48,89,0}}, +/* 1856 */ {(12<<2)|2,{48,106,0}}, +/* 1857 */ {(12<<2)|2,{48,106,0}}, +/* 1858 */ {(12<<2)|2,{48,106,0}}, +/* 1859 */ {(12<<2)|2,{48,106,0}}, +/* 1860 */ {(12<<2)|2,{48,106,0}}, +/* 1861 */ {(12<<2)|2,{48,106,0}}, +/* 1862 */ {(12<<2)|2,{48,106,0}}, +/* 1863 */ {(12<<2)|2,{48,106,0}}, +/* 1864 */ {(12<<2)|2,{48,106,0}}, +/* 1865 */ {(12<<2)|2,{48,106,0}}, +/* 1866 */ {(12<<2)|2,{48,106,0}}, +/* 1867 */ {(12<<2)|2,{48,106,0}}, +/* 1868 */ {(12<<2)|2,{48,106,0}}, +/* 1869 */ {(12<<2)|2,{48,106,0}}, +/* 1870 */ {(12<<2)|2,{48,106,0}}, +/* 1871 */ {(12<<2)|2,{48,106,0}}, +/* 1872 */ {(12<<2)|2,{48,107,0}}, +/* 1873 */ {(12<<2)|2,{48,107,0}}, +/* 1874 */ {(12<<2)|2,{48,107,0}}, +/* 1875 */ {(12<<2)|2,{48,107,0}}, +/* 1876 */ {(12<<2)|2,{48,107,0}}, +/* 1877 */ {(12<<2)|2,{48,107,0}}, +/* 1878 */ {(12<<2)|2,{48,107,0}}, +/* 1879 */ {(12<<2)|2,{48,107,0}}, +/* 1880 */ {(12<<2)|2,{48,107,0}}, +/* 1881 */ {(12<<2)|2,{48,107,0}}, +/* 1882 */ {(12<<2)|2,{48,107,0}}, +/* 1883 */ {(12<<2)|2,{48,107,0}}, +/* 1884 */ {(12<<2)|2,{48,107,0}}, +/* 1885 */ {(12<<2)|2,{48,107,0}}, +/* 1886 */ {(12<<2)|2,{48,107,0}}, +/* 1887 */ {(12<<2)|2,{48,107,0}}, +/* 1888 */ {(12<<2)|2,{48,113,0}}, +/* 1889 */ {(12<<2)|2,{48,113,0}}, +/* 1890 */ {(12<<2)|2,{48,113,0}}, +/* 1891 */ {(12<<2)|2,{48,113,0}}, +/* 1892 */ {(12<<2)|2,{48,113,0}}, +/* 1893 */ {(12<<2)|2,{48,113,0}}, +/* 1894 */ {(12<<2)|2,{48,113,0}}, +/* 1895 */ {(12<<2)|2,{48,113,0}}, +/* 1896 */ {(12<<2)|2,{48,113,0}}, +/* 1897 */ {(12<<2)|2,{48,113,0}}, +/* 1898 */ {(12<<2)|2,{48,113,0}}, +/* 1899 */ {(12<<2)|2,{48,113,0}}, +/* 1900 */ {(12<<2)|2,{48,113,0}}, +/* 1901 */ {(12<<2)|2,{48,113,0}}, +/* 1902 */ {(12<<2)|2,{48,113,0}}, +/* 1903 */ {(12<<2)|2,{48,113,0}}, +/* 1904 */ {(12<<2)|2,{48,118,0}}, +/* 1905 */ {(12<<2)|2,{48,118,0}}, +/* 1906 */ {(12<<2)|2,{48,118,0}}, +/* 1907 */ {(12<<2)|2,{48,118,0}}, +/* 1908 */ {(12<<2)|2,{48,118,0}}, +/* 1909 */ {(12<<2)|2,{48,118,0}}, +/* 1910 */ {(12<<2)|2,{48,118,0}}, +/* 1911 */ {(12<<2)|2,{48,118,0}}, +/* 1912 */ {(12<<2)|2,{48,118,0}}, +/* 1913 */ {(12<<2)|2,{48,118,0}}, +/* 1914 */ {(12<<2)|2,{48,118,0}}, +/* 1915 */ {(12<<2)|2,{48,118,0}}, +/* 1916 */ {(12<<2)|2,{48,118,0}}, +/* 1917 */ {(12<<2)|2,{48,118,0}}, +/* 1918 */ {(12<<2)|2,{48,118,0}}, +/* 1919 */ {(12<<2)|2,{48,118,0}}, +/* 1920 */ {(12<<2)|2,{48,119,0}}, +/* 1921 */ {(12<<2)|2,{48,119,0}}, +/* 1922 */ {(12<<2)|2,{48,119,0}}, +/* 1923 */ {(12<<2)|2,{48,119,0}}, +/* 1924 */ {(12<<2)|2,{48,119,0}}, +/* 1925 */ {(12<<2)|2,{48,119,0}}, +/* 1926 */ {(12<<2)|2,{48,119,0}}, +/* 1927 */ {(12<<2)|2,{48,119,0}}, +/* 1928 */ {(12<<2)|2,{48,119,0}}, +/* 1929 */ {(12<<2)|2,{48,119,0}}, +/* 1930 */ {(12<<2)|2,{48,119,0}}, +/* 1931 */ {(12<<2)|2,{48,119,0}}, +/* 1932 */ {(12<<2)|2,{48,119,0}}, +/* 1933 */ {(12<<2)|2,{48,119,0}}, +/* 1934 */ {(12<<2)|2,{48,119,0}}, +/* 1935 */ {(12<<2)|2,{48,119,0}}, +/* 1936 */ {(12<<2)|2,{48,120,0}}, +/* 1937 */ {(12<<2)|2,{48,120,0}}, +/* 1938 */ {(12<<2)|2,{48,120,0}}, +/* 1939 */ {(12<<2)|2,{48,120,0}}, +/* 1940 */ {(12<<2)|2,{48,120,0}}, +/* 1941 */ {(12<<2)|2,{48,120,0}}, +/* 1942 */ {(12<<2)|2,{48,120,0}}, +/* 1943 */ {(12<<2)|2,{48,120,0}}, +/* 1944 */ {(12<<2)|2,{48,120,0}}, +/* 1945 */ {(12<<2)|2,{48,120,0}}, +/* 1946 */ {(12<<2)|2,{48,120,0}}, +/* 1947 */ {(12<<2)|2,{48,120,0}}, +/* 1948 */ {(12<<2)|2,{48,120,0}}, +/* 1949 */ {(12<<2)|2,{48,120,0}}, +/* 1950 */ {(12<<2)|2,{48,120,0}}, +/* 1951 */ {(12<<2)|2,{48,120,0}}, +/* 1952 */ {(12<<2)|2,{48,121,0}}, +/* 1953 */ {(12<<2)|2,{48,121,0}}, +/* 1954 */ {(12<<2)|2,{48,121,0}}, +/* 1955 */ {(12<<2)|2,{48,121,0}}, +/* 1956 */ {(12<<2)|2,{48,121,0}}, +/* 1957 */ {(12<<2)|2,{48,121,0}}, +/* 1958 */ {(12<<2)|2,{48,121,0}}, +/* 1959 */ {(12<<2)|2,{48,121,0}}, +/* 1960 */ {(12<<2)|2,{48,121,0}}, +/* 1961 */ {(12<<2)|2,{48,121,0}}, +/* 1962 */ {(12<<2)|2,{48,121,0}}, +/* 1963 */ {(12<<2)|2,{48,121,0}}, +/* 1964 */ {(12<<2)|2,{48,121,0}}, +/* 1965 */ {(12<<2)|2,{48,121,0}}, +/* 1966 */ {(12<<2)|2,{48,121,0}}, +/* 1967 */ {(12<<2)|2,{48,121,0}}, +/* 1968 */ {(12<<2)|2,{48,122,0}}, +/* 1969 */ {(12<<2)|2,{48,122,0}}, +/* 1970 */ {(12<<2)|2,{48,122,0}}, +/* 1971 */ {(12<<2)|2,{48,122,0}}, +/* 1972 */ {(12<<2)|2,{48,122,0}}, +/* 1973 */ {(12<<2)|2,{48,122,0}}, +/* 1974 */ {(12<<2)|2,{48,122,0}}, +/* 1975 */ {(12<<2)|2,{48,122,0}}, +/* 1976 */ {(12<<2)|2,{48,122,0}}, +/* 1977 */ {(12<<2)|2,{48,122,0}}, +/* 1978 */ {(12<<2)|2,{48,122,0}}, +/* 1979 */ {(12<<2)|2,{48,122,0}}, +/* 1980 */ {(12<<2)|2,{48,122,0}}, +/* 1981 */ {(12<<2)|2,{48,122,0}}, +/* 1982 */ {(12<<2)|2,{48,122,0}}, +/* 1983 */ {(12<<2)|2,{48,122,0}}, +/* 1984 */ {(13<<2)|2,{48,38,0}}, +/* 1985 */ {(13<<2)|2,{48,38,0}}, +/* 1986 */ {(13<<2)|2,{48,38,0}}, +/* 1987 */ {(13<<2)|2,{48,38,0}}, +/* 1988 */ {(13<<2)|2,{48,38,0}}, +/* 1989 */ {(13<<2)|2,{48,38,0}}, +/* 1990 */ {(13<<2)|2,{48,38,0}}, +/* 1991 */ {(13<<2)|2,{48,38,0}}, +/* 1992 */ {(13<<2)|2,{48,42,0}}, +/* 1993 */ {(13<<2)|2,{48,42,0}}, +/* 1994 */ {(13<<2)|2,{48,42,0}}, +/* 1995 */ {(13<<2)|2,{48,42,0}}, +/* 1996 */ {(13<<2)|2,{48,42,0}}, +/* 1997 */ {(13<<2)|2,{48,42,0}}, +/* 1998 */ {(13<<2)|2,{48,42,0}}, +/* 1999 */ {(13<<2)|2,{48,42,0}}, +/* 2000 */ {(13<<2)|2,{48,44,0}}, +/* 2001 */ {(13<<2)|2,{48,44,0}}, +/* 2002 */ {(13<<2)|2,{48,44,0}}, +/* 2003 */ {(13<<2)|2,{48,44,0}}, +/* 2004 */ {(13<<2)|2,{48,44,0}}, +/* 2005 */ {(13<<2)|2,{48,44,0}}, +/* 2006 */ {(13<<2)|2,{48,44,0}}, +/* 2007 */ {(13<<2)|2,{48,44,0}}, +/* 2008 */ {(13<<2)|2,{48,59,0}}, +/* 2009 */ {(13<<2)|2,{48,59,0}}, +/* 2010 */ {(13<<2)|2,{48,59,0}}, +/* 2011 */ {(13<<2)|2,{48,59,0}}, +/* 2012 */ {(13<<2)|2,{48,59,0}}, +/* 2013 */ {(13<<2)|2,{48,59,0}}, +/* 2014 */ {(13<<2)|2,{48,59,0}}, +/* 2015 */ {(13<<2)|2,{48,59,0}}, +/* 2016 */ {(13<<2)|2,{48,88,0}}, +/* 2017 */ {(13<<2)|2,{48,88,0}}, +/* 2018 */ {(13<<2)|2,{48,88,0}}, +/* 2019 */ {(13<<2)|2,{48,88,0}}, +/* 2020 */ {(13<<2)|2,{48,88,0}}, +/* 2021 */ {(13<<2)|2,{48,88,0}}, +/* 2022 */ {(13<<2)|2,{48,88,0}}, +/* 2023 */ {(13<<2)|2,{48,88,0}}, +/* 2024 */ {(13<<2)|2,{48,90,0}}, +/* 2025 */ {(13<<2)|2,{48,90,0}}, +/* 2026 */ {(13<<2)|2,{48,90,0}}, +/* 2027 */ {(13<<2)|2,{48,90,0}}, +/* 2028 */ {(13<<2)|2,{48,90,0}}, +/* 2029 */ {(13<<2)|2,{48,90,0}}, +/* 2030 */ {(13<<2)|2,{48,90,0}}, +/* 2031 */ {(13<<2)|2,{48,90,0}}, +/* 2032 */ {(15<<2)|2,{48,33,0}}, +/* 2033 */ {(15<<2)|2,{48,33,0}}, +/* 2034 */ {(15<<2)|2,{48,34,0}}, +/* 2035 */ {(15<<2)|2,{48,34,0}}, +/* 2036 */ {(15<<2)|2,{48,40,0}}, +/* 2037 */ {(15<<2)|2,{48,40,0}}, +/* 2038 */ {(15<<2)|2,{48,41,0}}, +/* 2039 */ {(15<<2)|2,{48,41,0}}, +/* 2040 */ {(15<<2)|2,{48,63,0}}, +/* 2041 */ {(15<<2)|2,{48,63,0}}, +/* 2042 */ {(16<<2)|2,{48,39,0}}, +/* 2043 */ {(16<<2)|2,{48,43,0}}, +/* 2044 */ {(16<<2)|2,{48,124,0}}, +/* 2045 */ {(5<<2)|1,{48,0,0}}, +/* 2046 */ {(5<<2)|1,{48,0,0}}, +/* 2047 */ {(5<<2)|1,{48,0,0}}, +/* 2048 */ {(15<<2)|3,{49,48,48}}, +/* 2049 */ {(15<<2)|3,{49,48,48}}, +/* 2050 */ {(15<<2)|3,{49,48,49}}, +/* 2051 */ {(15<<2)|3,{49,48,49}}, +/* 2052 */ {(15<<2)|3,{49,48,50}}, +/* 2053 */ {(15<<2)|3,{49,48,50}}, +/* 2054 */ {(15<<2)|3,{49,48,97}}, +/* 2055 */ {(15<<2)|3,{49,48,97}}, +/* 2056 */ {(15<<2)|3,{49,48,99}}, +/* 2057 */ {(15<<2)|3,{49,48,99}}, +/* 2058 */ {(15<<2)|3,{49,48,101}}, +/* 2059 */ {(15<<2)|3,{49,48,101}}, +/* 2060 */ {(15<<2)|3,{49,48,105}}, +/* 2061 */ {(15<<2)|3,{49,48,105}}, +/* 2062 */ {(15<<2)|3,{49,48,111}}, +/* 2063 */ {(15<<2)|3,{49,48,111}}, +/* 2064 */ {(15<<2)|3,{49,48,115}}, +/* 2065 */ {(15<<2)|3,{49,48,115}}, +/* 2066 */ {(15<<2)|3,{49,48,116}}, +/* 2067 */ {(15<<2)|3,{49,48,116}}, +/* 2068 */ {(16<<2)|3,{49,48,32}}, +/* 2069 */ {(16<<2)|3,{49,48,37}}, +/* 2070 */ {(16<<2)|3,{49,48,45}}, +/* 2071 */ {(16<<2)|3,{49,48,46}}, +/* 2072 */ {(16<<2)|3,{49,48,47}}, +/* 2073 */ {(16<<2)|3,{49,48,51}}, +/* 2074 */ {(16<<2)|3,{49,48,52}}, +/* 2075 */ {(16<<2)|3,{49,48,53}}, +/* 2076 */ {(16<<2)|3,{49,48,54}}, +/* 2077 */ {(16<<2)|3,{49,48,55}}, +/* 2078 */ {(16<<2)|3,{49,48,56}}, +/* 2079 */ {(16<<2)|3,{49,48,57}}, +/* 2080 */ {(16<<2)|3,{49,48,61}}, +/* 2081 */ {(16<<2)|3,{49,48,65}}, +/* 2082 */ {(16<<2)|3,{49,48,95}}, +/* 2083 */ {(16<<2)|3,{49,48,98}}, +/* 2084 */ {(16<<2)|3,{49,48,100}}, +/* 2085 */ {(16<<2)|3,{49,48,102}}, +/* 2086 */ {(16<<2)|3,{49,48,103}}, +/* 2087 */ {(16<<2)|3,{49,48,104}}, +/* 2088 */ {(16<<2)|3,{49,48,108}}, +/* 2089 */ {(16<<2)|3,{49,48,109}}, +/* 2090 */ {(16<<2)|3,{49,48,110}}, +/* 2091 */ {(16<<2)|3,{49,48,112}}, +/* 2092 */ {(16<<2)|3,{49,48,114}}, +/* 2093 */ {(16<<2)|3,{49,48,117}}, +/* 2094 */ {(10<<2)|2,{49,48,0}}, +/* 2095 */ {(10<<2)|2,{49,48,0}}, +/* 2096 */ {(10<<2)|2,{49,48,0}}, +/* 2097 */ {(10<<2)|2,{49,48,0}}, +/* 2098 */ {(10<<2)|2,{49,48,0}}, +/* 2099 */ {(10<<2)|2,{49,48,0}}, +/* 2100 */ {(10<<2)|2,{49,48,0}}, +/* 2101 */ {(10<<2)|2,{49,48,0}}, +/* 2102 */ {(10<<2)|2,{49,48,0}}, +/* 2103 */ {(10<<2)|2,{49,48,0}}, +/* 2104 */ {(10<<2)|2,{49,48,0}}, +/* 2105 */ {(10<<2)|2,{49,48,0}}, +/* 2106 */ {(10<<2)|2,{49,48,0}}, +/* 2107 */ {(10<<2)|2,{49,48,0}}, +/* 2108 */ {(10<<2)|2,{49,48,0}}, +/* 2109 */ {(10<<2)|2,{49,48,0}}, +/* 2110 */ {(10<<2)|2,{49,48,0}}, +/* 2111 */ {(10<<2)|2,{49,48,0}}, +/* 2112 */ {(15<<2)|3,{49,49,48}}, +/* 2113 */ {(15<<2)|3,{49,49,48}}, +/* 2114 */ {(15<<2)|3,{49,49,49}}, +/* 2115 */ {(15<<2)|3,{49,49,49}}, +/* 2116 */ {(15<<2)|3,{49,49,50}}, +/* 2117 */ {(15<<2)|3,{49,49,50}}, +/* 2118 */ {(15<<2)|3,{49,49,97}}, +/* 2119 */ {(15<<2)|3,{49,49,97}}, +/* 2120 */ {(15<<2)|3,{49,49,99}}, +/* 2121 */ {(15<<2)|3,{49,49,99}}, +/* 2122 */ {(15<<2)|3,{49,49,101}}, +/* 2123 */ {(15<<2)|3,{49,49,101}}, +/* 2124 */ {(15<<2)|3,{49,49,105}}, +/* 2125 */ {(15<<2)|3,{49,49,105}}, +/* 2126 */ {(15<<2)|3,{49,49,111}}, +/* 2127 */ {(15<<2)|3,{49,49,111}}, +/* 2128 */ {(15<<2)|3,{49,49,115}}, +/* 2129 */ {(15<<2)|3,{49,49,115}}, +/* 2130 */ {(15<<2)|3,{49,49,116}}, +/* 2131 */ {(15<<2)|3,{49,49,116}}, +/* 2132 */ {(16<<2)|3,{49,49,32}}, +/* 2133 */ {(16<<2)|3,{49,49,37}}, +/* 2134 */ {(16<<2)|3,{49,49,45}}, +/* 2135 */ {(16<<2)|3,{49,49,46}}, +/* 2136 */ {(16<<2)|3,{49,49,47}}, +/* 2137 */ {(16<<2)|3,{49,49,51}}, +/* 2138 */ {(16<<2)|3,{49,49,52}}, +/* 2139 */ {(16<<2)|3,{49,49,53}}, +/* 2140 */ {(16<<2)|3,{49,49,54}}, +/* 2141 */ {(16<<2)|3,{49,49,55}}, +/* 2142 */ {(16<<2)|3,{49,49,56}}, +/* 2143 */ {(16<<2)|3,{49,49,57}}, +/* 2144 */ {(16<<2)|3,{49,49,61}}, +/* 2145 */ {(16<<2)|3,{49,49,65}}, +/* 2146 */ {(16<<2)|3,{49,49,95}}, +/* 2147 */ {(16<<2)|3,{49,49,98}}, +/* 2148 */ {(16<<2)|3,{49,49,100}}, +/* 2149 */ {(16<<2)|3,{49,49,102}}, +/* 2150 */ {(16<<2)|3,{49,49,103}}, +/* 2151 */ {(16<<2)|3,{49,49,104}}, +/* 2152 */ {(16<<2)|3,{49,49,108}}, +/* 2153 */ {(16<<2)|3,{49,49,109}}, +/* 2154 */ {(16<<2)|3,{49,49,110}}, +/* 2155 */ {(16<<2)|3,{49,49,112}}, +/* 2156 */ {(16<<2)|3,{49,49,114}}, +/* 2157 */ {(16<<2)|3,{49,49,117}}, +/* 2158 */ {(10<<2)|2,{49,49,0}}, +/* 2159 */ {(10<<2)|2,{49,49,0}}, +/* 2160 */ {(10<<2)|2,{49,49,0}}, +/* 2161 */ {(10<<2)|2,{49,49,0}}, +/* 2162 */ {(10<<2)|2,{49,49,0}}, +/* 2163 */ {(10<<2)|2,{49,49,0}}, +/* 2164 */ {(10<<2)|2,{49,49,0}}, +/* 2165 */ {(10<<2)|2,{49,49,0}}, +/* 2166 */ {(10<<2)|2,{49,49,0}}, +/* 2167 */ {(10<<2)|2,{49,49,0}}, +/* 2168 */ {(10<<2)|2,{49,49,0}}, +/* 2169 */ {(10<<2)|2,{49,49,0}}, +/* 2170 */ {(10<<2)|2,{49,49,0}}, +/* 2171 */ {(10<<2)|2,{49,49,0}}, +/* 2172 */ {(10<<2)|2,{49,49,0}}, +/* 2173 */ {(10<<2)|2,{49,49,0}}, +/* 2174 */ {(10<<2)|2,{49,49,0}}, +/* 2175 */ {(10<<2)|2,{49,49,0}}, +/* 2176 */ {(15<<2)|3,{49,50,48}}, +/* 2177 */ {(15<<2)|3,{49,50,48}}, +/* 2178 */ {(15<<2)|3,{49,50,49}}, +/* 2179 */ {(15<<2)|3,{49,50,49}}, +/* 2180 */ {(15<<2)|3,{49,50,50}}, +/* 2181 */ {(15<<2)|3,{49,50,50}}, +/* 2182 */ {(15<<2)|3,{49,50,97}}, +/* 2183 */ {(15<<2)|3,{49,50,97}}, +/* 2184 */ {(15<<2)|3,{49,50,99}}, +/* 2185 */ {(15<<2)|3,{49,50,99}}, +/* 2186 */ {(15<<2)|3,{49,50,101}}, +/* 2187 */ {(15<<2)|3,{49,50,101}}, +/* 2188 */ {(15<<2)|3,{49,50,105}}, +/* 2189 */ {(15<<2)|3,{49,50,105}}, +/* 2190 */ {(15<<2)|3,{49,50,111}}, +/* 2191 */ {(15<<2)|3,{49,50,111}}, +/* 2192 */ {(15<<2)|3,{49,50,115}}, +/* 2193 */ {(15<<2)|3,{49,50,115}}, +/* 2194 */ {(15<<2)|3,{49,50,116}}, +/* 2195 */ {(15<<2)|3,{49,50,116}}, +/* 2196 */ {(16<<2)|3,{49,50,32}}, +/* 2197 */ {(16<<2)|3,{49,50,37}}, +/* 2198 */ {(16<<2)|3,{49,50,45}}, +/* 2199 */ {(16<<2)|3,{49,50,46}}, +/* 2200 */ {(16<<2)|3,{49,50,47}}, +/* 2201 */ {(16<<2)|3,{49,50,51}}, +/* 2202 */ {(16<<2)|3,{49,50,52}}, +/* 2203 */ {(16<<2)|3,{49,50,53}}, +/* 2204 */ {(16<<2)|3,{49,50,54}}, +/* 2205 */ {(16<<2)|3,{49,50,55}}, +/* 2206 */ {(16<<2)|3,{49,50,56}}, +/* 2207 */ {(16<<2)|3,{49,50,57}}, +/* 2208 */ {(16<<2)|3,{49,50,61}}, +/* 2209 */ {(16<<2)|3,{49,50,65}}, +/* 2210 */ {(16<<2)|3,{49,50,95}}, +/* 2211 */ {(16<<2)|3,{49,50,98}}, +/* 2212 */ {(16<<2)|3,{49,50,100}}, +/* 2213 */ {(16<<2)|3,{49,50,102}}, +/* 2214 */ {(16<<2)|3,{49,50,103}}, +/* 2215 */ {(16<<2)|3,{49,50,104}}, +/* 2216 */ {(16<<2)|3,{49,50,108}}, +/* 2217 */ {(16<<2)|3,{49,50,109}}, +/* 2218 */ {(16<<2)|3,{49,50,110}}, +/* 2219 */ {(16<<2)|3,{49,50,112}}, +/* 2220 */ {(16<<2)|3,{49,50,114}}, +/* 2221 */ {(16<<2)|3,{49,50,117}}, +/* 2222 */ {(10<<2)|2,{49,50,0}}, +/* 2223 */ {(10<<2)|2,{49,50,0}}, +/* 2224 */ {(10<<2)|2,{49,50,0}}, +/* 2225 */ {(10<<2)|2,{49,50,0}}, +/* 2226 */ {(10<<2)|2,{49,50,0}}, +/* 2227 */ {(10<<2)|2,{49,50,0}}, +/* 2228 */ {(10<<2)|2,{49,50,0}}, +/* 2229 */ {(10<<2)|2,{49,50,0}}, +/* 2230 */ {(10<<2)|2,{49,50,0}}, +/* 2231 */ {(10<<2)|2,{49,50,0}}, +/* 2232 */ {(10<<2)|2,{49,50,0}}, +/* 2233 */ {(10<<2)|2,{49,50,0}}, +/* 2234 */ {(10<<2)|2,{49,50,0}}, +/* 2235 */ {(10<<2)|2,{49,50,0}}, +/* 2236 */ {(10<<2)|2,{49,50,0}}, +/* 2237 */ {(10<<2)|2,{49,50,0}}, +/* 2238 */ {(10<<2)|2,{49,50,0}}, +/* 2239 */ {(10<<2)|2,{49,50,0}}, +/* 2240 */ {(15<<2)|3,{49,97,48}}, +/* 2241 */ {(15<<2)|3,{49,97,48}}, +/* 2242 */ {(15<<2)|3,{49,97,49}}, +/* 2243 */ {(15<<2)|3,{49,97,49}}, +/* 2244 */ {(15<<2)|3,{49,97,50}}, +/* 2245 */ {(15<<2)|3,{49,97,50}}, +/* 2246 */ {(15<<2)|3,{49,97,97}}, +/* 2247 */ {(15<<2)|3,{49,97,97}}, +/* 2248 */ {(15<<2)|3,{49,97,99}}, +/* 2249 */ {(15<<2)|3,{49,97,99}}, +/* 2250 */ {(15<<2)|3,{49,97,101}}, +/* 2251 */ {(15<<2)|3,{49,97,101}}, +/* 2252 */ {(15<<2)|3,{49,97,105}}, +/* 2253 */ {(15<<2)|3,{49,97,105}}, +/* 2254 */ {(15<<2)|3,{49,97,111}}, +/* 2255 */ {(15<<2)|3,{49,97,111}}, +/* 2256 */ {(15<<2)|3,{49,97,115}}, +/* 2257 */ {(15<<2)|3,{49,97,115}}, +/* 2258 */ {(15<<2)|3,{49,97,116}}, +/* 2259 */ {(15<<2)|3,{49,97,116}}, +/* 2260 */ {(16<<2)|3,{49,97,32}}, +/* 2261 */ {(16<<2)|3,{49,97,37}}, +/* 2262 */ {(16<<2)|3,{49,97,45}}, +/* 2263 */ {(16<<2)|3,{49,97,46}}, +/* 2264 */ {(16<<2)|3,{49,97,47}}, +/* 2265 */ {(16<<2)|3,{49,97,51}}, +/* 2266 */ {(16<<2)|3,{49,97,52}}, +/* 2267 */ {(16<<2)|3,{49,97,53}}, +/* 2268 */ {(16<<2)|3,{49,97,54}}, +/* 2269 */ {(16<<2)|3,{49,97,55}}, +/* 2270 */ {(16<<2)|3,{49,97,56}}, +/* 2271 */ {(16<<2)|3,{49,97,57}}, +/* 2272 */ {(16<<2)|3,{49,97,61}}, +/* 2273 */ {(16<<2)|3,{49,97,65}}, +/* 2274 */ {(16<<2)|3,{49,97,95}}, +/* 2275 */ {(16<<2)|3,{49,97,98}}, +/* 2276 */ {(16<<2)|3,{49,97,100}}, +/* 2277 */ {(16<<2)|3,{49,97,102}}, +/* 2278 */ {(16<<2)|3,{49,97,103}}, +/* 2279 */ {(16<<2)|3,{49,97,104}}, +/* 2280 */ {(16<<2)|3,{49,97,108}}, +/* 2281 */ {(16<<2)|3,{49,97,109}}, +/* 2282 */ {(16<<2)|3,{49,97,110}}, +/* 2283 */ {(16<<2)|3,{49,97,112}}, +/* 2284 */ {(16<<2)|3,{49,97,114}}, +/* 2285 */ {(16<<2)|3,{49,97,117}}, +/* 2286 */ {(10<<2)|2,{49,97,0}}, +/* 2287 */ {(10<<2)|2,{49,97,0}}, +/* 2288 */ {(10<<2)|2,{49,97,0}}, +/* 2289 */ {(10<<2)|2,{49,97,0}}, +/* 2290 */ {(10<<2)|2,{49,97,0}}, +/* 2291 */ {(10<<2)|2,{49,97,0}}, +/* 2292 */ {(10<<2)|2,{49,97,0}}, +/* 2293 */ {(10<<2)|2,{49,97,0}}, +/* 2294 */ {(10<<2)|2,{49,97,0}}, +/* 2295 */ {(10<<2)|2,{49,97,0}}, +/* 2296 */ {(10<<2)|2,{49,97,0}}, +/* 2297 */ {(10<<2)|2,{49,97,0}}, +/* 2298 */ {(10<<2)|2,{49,97,0}}, +/* 2299 */ {(10<<2)|2,{49,97,0}}, +/* 2300 */ {(10<<2)|2,{49,97,0}}, +/* 2301 */ {(10<<2)|2,{49,97,0}}, +/* 2302 */ {(10<<2)|2,{49,97,0}}, +/* 2303 */ {(10<<2)|2,{49,97,0}}, +/* 2304 */ {(15<<2)|3,{49,99,48}}, +/* 2305 */ {(15<<2)|3,{49,99,48}}, +/* 2306 */ {(15<<2)|3,{49,99,49}}, +/* 2307 */ {(15<<2)|3,{49,99,49}}, +/* 2308 */ {(15<<2)|3,{49,99,50}}, +/* 2309 */ {(15<<2)|3,{49,99,50}}, +/* 2310 */ {(15<<2)|3,{49,99,97}}, +/* 2311 */ {(15<<2)|3,{49,99,97}}, +/* 2312 */ {(15<<2)|3,{49,99,99}}, +/* 2313 */ {(15<<2)|3,{49,99,99}}, +/* 2314 */ {(15<<2)|3,{49,99,101}}, +/* 2315 */ {(15<<2)|3,{49,99,101}}, +/* 2316 */ {(15<<2)|3,{49,99,105}}, +/* 2317 */ {(15<<2)|3,{49,99,105}}, +/* 2318 */ {(15<<2)|3,{49,99,111}}, +/* 2319 */ {(15<<2)|3,{49,99,111}}, +/* 2320 */ {(15<<2)|3,{49,99,115}}, +/* 2321 */ {(15<<2)|3,{49,99,115}}, +/* 2322 */ {(15<<2)|3,{49,99,116}}, +/* 2323 */ {(15<<2)|3,{49,99,116}}, +/* 2324 */ {(16<<2)|3,{49,99,32}}, +/* 2325 */ {(16<<2)|3,{49,99,37}}, +/* 2326 */ {(16<<2)|3,{49,99,45}}, +/* 2327 */ {(16<<2)|3,{49,99,46}}, +/* 2328 */ {(16<<2)|3,{49,99,47}}, +/* 2329 */ {(16<<2)|3,{49,99,51}}, +/* 2330 */ {(16<<2)|3,{49,99,52}}, +/* 2331 */ {(16<<2)|3,{49,99,53}}, +/* 2332 */ {(16<<2)|3,{49,99,54}}, +/* 2333 */ {(16<<2)|3,{49,99,55}}, +/* 2334 */ {(16<<2)|3,{49,99,56}}, +/* 2335 */ {(16<<2)|3,{49,99,57}}, +/* 2336 */ {(16<<2)|3,{49,99,61}}, +/* 2337 */ {(16<<2)|3,{49,99,65}}, +/* 2338 */ {(16<<2)|3,{49,99,95}}, +/* 2339 */ {(16<<2)|3,{49,99,98}}, +/* 2340 */ {(16<<2)|3,{49,99,100}}, +/* 2341 */ {(16<<2)|3,{49,99,102}}, +/* 2342 */ {(16<<2)|3,{49,99,103}}, +/* 2343 */ {(16<<2)|3,{49,99,104}}, +/* 2344 */ {(16<<2)|3,{49,99,108}}, +/* 2345 */ {(16<<2)|3,{49,99,109}}, +/* 2346 */ {(16<<2)|3,{49,99,110}}, +/* 2347 */ {(16<<2)|3,{49,99,112}}, +/* 2348 */ {(16<<2)|3,{49,99,114}}, +/* 2349 */ {(16<<2)|3,{49,99,117}}, +/* 2350 */ {(10<<2)|2,{49,99,0}}, +/* 2351 */ {(10<<2)|2,{49,99,0}}, +/* 2352 */ {(10<<2)|2,{49,99,0}}, +/* 2353 */ {(10<<2)|2,{49,99,0}}, +/* 2354 */ {(10<<2)|2,{49,99,0}}, +/* 2355 */ {(10<<2)|2,{49,99,0}}, +/* 2356 */ {(10<<2)|2,{49,99,0}}, +/* 2357 */ {(10<<2)|2,{49,99,0}}, +/* 2358 */ {(10<<2)|2,{49,99,0}}, +/* 2359 */ {(10<<2)|2,{49,99,0}}, +/* 2360 */ {(10<<2)|2,{49,99,0}}, +/* 2361 */ {(10<<2)|2,{49,99,0}}, +/* 2362 */ {(10<<2)|2,{49,99,0}}, +/* 2363 */ {(10<<2)|2,{49,99,0}}, +/* 2364 */ {(10<<2)|2,{49,99,0}}, +/* 2365 */ {(10<<2)|2,{49,99,0}}, +/* 2366 */ {(10<<2)|2,{49,99,0}}, +/* 2367 */ {(10<<2)|2,{49,99,0}}, +/* 2368 */ {(15<<2)|3,{49,101,48}}, +/* 2369 */ {(15<<2)|3,{49,101,48}}, +/* 2370 */ {(15<<2)|3,{49,101,49}}, +/* 2371 */ {(15<<2)|3,{49,101,49}}, +/* 2372 */ {(15<<2)|3,{49,101,50}}, +/* 2373 */ {(15<<2)|3,{49,101,50}}, +/* 2374 */ {(15<<2)|3,{49,101,97}}, +/* 2375 */ {(15<<2)|3,{49,101,97}}, +/* 2376 */ {(15<<2)|3,{49,101,99}}, +/* 2377 */ {(15<<2)|3,{49,101,99}}, +/* 2378 */ {(15<<2)|3,{49,101,101}}, +/* 2379 */ {(15<<2)|3,{49,101,101}}, +/* 2380 */ {(15<<2)|3,{49,101,105}}, +/* 2381 */ {(15<<2)|3,{49,101,105}}, +/* 2382 */ {(15<<2)|3,{49,101,111}}, +/* 2383 */ {(15<<2)|3,{49,101,111}}, +/* 2384 */ {(15<<2)|3,{49,101,115}}, +/* 2385 */ {(15<<2)|3,{49,101,115}}, +/* 2386 */ {(15<<2)|3,{49,101,116}}, +/* 2387 */ {(15<<2)|3,{49,101,116}}, +/* 2388 */ {(16<<2)|3,{49,101,32}}, +/* 2389 */ {(16<<2)|3,{49,101,37}}, +/* 2390 */ {(16<<2)|3,{49,101,45}}, +/* 2391 */ {(16<<2)|3,{49,101,46}}, +/* 2392 */ {(16<<2)|3,{49,101,47}}, +/* 2393 */ {(16<<2)|3,{49,101,51}}, +/* 2394 */ {(16<<2)|3,{49,101,52}}, +/* 2395 */ {(16<<2)|3,{49,101,53}}, +/* 2396 */ {(16<<2)|3,{49,101,54}}, +/* 2397 */ {(16<<2)|3,{49,101,55}}, +/* 2398 */ {(16<<2)|3,{49,101,56}}, +/* 2399 */ {(16<<2)|3,{49,101,57}}, +/* 2400 */ {(16<<2)|3,{49,101,61}}, +/* 2401 */ {(16<<2)|3,{49,101,65}}, +/* 2402 */ {(16<<2)|3,{49,101,95}}, +/* 2403 */ {(16<<2)|3,{49,101,98}}, +/* 2404 */ {(16<<2)|3,{49,101,100}}, +/* 2405 */ {(16<<2)|3,{49,101,102}}, +/* 2406 */ {(16<<2)|3,{49,101,103}}, +/* 2407 */ {(16<<2)|3,{49,101,104}}, +/* 2408 */ {(16<<2)|3,{49,101,108}}, +/* 2409 */ {(16<<2)|3,{49,101,109}}, +/* 2410 */ {(16<<2)|3,{49,101,110}}, +/* 2411 */ {(16<<2)|3,{49,101,112}}, +/* 2412 */ {(16<<2)|3,{49,101,114}}, +/* 2413 */ {(16<<2)|3,{49,101,117}}, +/* 2414 */ {(10<<2)|2,{49,101,0}}, +/* 2415 */ {(10<<2)|2,{49,101,0}}, +/* 2416 */ {(10<<2)|2,{49,101,0}}, +/* 2417 */ {(10<<2)|2,{49,101,0}}, +/* 2418 */ {(10<<2)|2,{49,101,0}}, +/* 2419 */ {(10<<2)|2,{49,101,0}}, +/* 2420 */ {(10<<2)|2,{49,101,0}}, +/* 2421 */ {(10<<2)|2,{49,101,0}}, +/* 2422 */ {(10<<2)|2,{49,101,0}}, +/* 2423 */ {(10<<2)|2,{49,101,0}}, +/* 2424 */ {(10<<2)|2,{49,101,0}}, +/* 2425 */ {(10<<2)|2,{49,101,0}}, +/* 2426 */ {(10<<2)|2,{49,101,0}}, +/* 2427 */ {(10<<2)|2,{49,101,0}}, +/* 2428 */ {(10<<2)|2,{49,101,0}}, +/* 2429 */ {(10<<2)|2,{49,101,0}}, +/* 2430 */ {(10<<2)|2,{49,101,0}}, +/* 2431 */ {(10<<2)|2,{49,101,0}}, +/* 2432 */ {(15<<2)|3,{49,105,48}}, +/* 2433 */ {(15<<2)|3,{49,105,48}}, +/* 2434 */ {(15<<2)|3,{49,105,49}}, +/* 2435 */ {(15<<2)|3,{49,105,49}}, +/* 2436 */ {(15<<2)|3,{49,105,50}}, +/* 2437 */ {(15<<2)|3,{49,105,50}}, +/* 2438 */ {(15<<2)|3,{49,105,97}}, +/* 2439 */ {(15<<2)|3,{49,105,97}}, +/* 2440 */ {(15<<2)|3,{49,105,99}}, +/* 2441 */ {(15<<2)|3,{49,105,99}}, +/* 2442 */ {(15<<2)|3,{49,105,101}}, +/* 2443 */ {(15<<2)|3,{49,105,101}}, +/* 2444 */ {(15<<2)|3,{49,105,105}}, +/* 2445 */ {(15<<2)|3,{49,105,105}}, +/* 2446 */ {(15<<2)|3,{49,105,111}}, +/* 2447 */ {(15<<2)|3,{49,105,111}}, +/* 2448 */ {(15<<2)|3,{49,105,115}}, +/* 2449 */ {(15<<2)|3,{49,105,115}}, +/* 2450 */ {(15<<2)|3,{49,105,116}}, +/* 2451 */ {(15<<2)|3,{49,105,116}}, +/* 2452 */ {(16<<2)|3,{49,105,32}}, +/* 2453 */ {(16<<2)|3,{49,105,37}}, +/* 2454 */ {(16<<2)|3,{49,105,45}}, +/* 2455 */ {(16<<2)|3,{49,105,46}}, +/* 2456 */ {(16<<2)|3,{49,105,47}}, +/* 2457 */ {(16<<2)|3,{49,105,51}}, +/* 2458 */ {(16<<2)|3,{49,105,52}}, +/* 2459 */ {(16<<2)|3,{49,105,53}}, +/* 2460 */ {(16<<2)|3,{49,105,54}}, +/* 2461 */ {(16<<2)|3,{49,105,55}}, +/* 2462 */ {(16<<2)|3,{49,105,56}}, +/* 2463 */ {(16<<2)|3,{49,105,57}}, +/* 2464 */ {(16<<2)|3,{49,105,61}}, +/* 2465 */ {(16<<2)|3,{49,105,65}}, +/* 2466 */ {(16<<2)|3,{49,105,95}}, +/* 2467 */ {(16<<2)|3,{49,105,98}}, +/* 2468 */ {(16<<2)|3,{49,105,100}}, +/* 2469 */ {(16<<2)|3,{49,105,102}}, +/* 2470 */ {(16<<2)|3,{49,105,103}}, +/* 2471 */ {(16<<2)|3,{49,105,104}}, +/* 2472 */ {(16<<2)|3,{49,105,108}}, +/* 2473 */ {(16<<2)|3,{49,105,109}}, +/* 2474 */ {(16<<2)|3,{49,105,110}}, +/* 2475 */ {(16<<2)|3,{49,105,112}}, +/* 2476 */ {(16<<2)|3,{49,105,114}}, +/* 2477 */ {(16<<2)|3,{49,105,117}}, +/* 2478 */ {(10<<2)|2,{49,105,0}}, +/* 2479 */ {(10<<2)|2,{49,105,0}}, +/* 2480 */ {(10<<2)|2,{49,105,0}}, +/* 2481 */ {(10<<2)|2,{49,105,0}}, +/* 2482 */ {(10<<2)|2,{49,105,0}}, +/* 2483 */ {(10<<2)|2,{49,105,0}}, +/* 2484 */ {(10<<2)|2,{49,105,0}}, +/* 2485 */ {(10<<2)|2,{49,105,0}}, +/* 2486 */ {(10<<2)|2,{49,105,0}}, +/* 2487 */ {(10<<2)|2,{49,105,0}}, +/* 2488 */ {(10<<2)|2,{49,105,0}}, +/* 2489 */ {(10<<2)|2,{49,105,0}}, +/* 2490 */ {(10<<2)|2,{49,105,0}}, +/* 2491 */ {(10<<2)|2,{49,105,0}}, +/* 2492 */ {(10<<2)|2,{49,105,0}}, +/* 2493 */ {(10<<2)|2,{49,105,0}}, +/* 2494 */ {(10<<2)|2,{49,105,0}}, +/* 2495 */ {(10<<2)|2,{49,105,0}}, +/* 2496 */ {(15<<2)|3,{49,111,48}}, +/* 2497 */ {(15<<2)|3,{49,111,48}}, +/* 2498 */ {(15<<2)|3,{49,111,49}}, +/* 2499 */ {(15<<2)|3,{49,111,49}}, +/* 2500 */ {(15<<2)|3,{49,111,50}}, +/* 2501 */ {(15<<2)|3,{49,111,50}}, +/* 2502 */ {(15<<2)|3,{49,111,97}}, +/* 2503 */ {(15<<2)|3,{49,111,97}}, +/* 2504 */ {(15<<2)|3,{49,111,99}}, +/* 2505 */ {(15<<2)|3,{49,111,99}}, +/* 2506 */ {(15<<2)|3,{49,111,101}}, +/* 2507 */ {(15<<2)|3,{49,111,101}}, +/* 2508 */ {(15<<2)|3,{49,111,105}}, +/* 2509 */ {(15<<2)|3,{49,111,105}}, +/* 2510 */ {(15<<2)|3,{49,111,111}}, +/* 2511 */ {(15<<2)|3,{49,111,111}}, +/* 2512 */ {(15<<2)|3,{49,111,115}}, +/* 2513 */ {(15<<2)|3,{49,111,115}}, +/* 2514 */ {(15<<2)|3,{49,111,116}}, +/* 2515 */ {(15<<2)|3,{49,111,116}}, +/* 2516 */ {(16<<2)|3,{49,111,32}}, +/* 2517 */ {(16<<2)|3,{49,111,37}}, +/* 2518 */ {(16<<2)|3,{49,111,45}}, +/* 2519 */ {(16<<2)|3,{49,111,46}}, +/* 2520 */ {(16<<2)|3,{49,111,47}}, +/* 2521 */ {(16<<2)|3,{49,111,51}}, +/* 2522 */ {(16<<2)|3,{49,111,52}}, +/* 2523 */ {(16<<2)|3,{49,111,53}}, +/* 2524 */ {(16<<2)|3,{49,111,54}}, +/* 2525 */ {(16<<2)|3,{49,111,55}}, +/* 2526 */ {(16<<2)|3,{49,111,56}}, +/* 2527 */ {(16<<2)|3,{49,111,57}}, +/* 2528 */ {(16<<2)|3,{49,111,61}}, +/* 2529 */ {(16<<2)|3,{49,111,65}}, +/* 2530 */ {(16<<2)|3,{49,111,95}}, +/* 2531 */ {(16<<2)|3,{49,111,98}}, +/* 2532 */ {(16<<2)|3,{49,111,100}}, +/* 2533 */ {(16<<2)|3,{49,111,102}}, +/* 2534 */ {(16<<2)|3,{49,111,103}}, +/* 2535 */ {(16<<2)|3,{49,111,104}}, +/* 2536 */ {(16<<2)|3,{49,111,108}}, +/* 2537 */ {(16<<2)|3,{49,111,109}}, +/* 2538 */ {(16<<2)|3,{49,111,110}}, +/* 2539 */ {(16<<2)|3,{49,111,112}}, +/* 2540 */ {(16<<2)|3,{49,111,114}}, +/* 2541 */ {(16<<2)|3,{49,111,117}}, +/* 2542 */ {(10<<2)|2,{49,111,0}}, +/* 2543 */ {(10<<2)|2,{49,111,0}}, +/* 2544 */ {(10<<2)|2,{49,111,0}}, +/* 2545 */ {(10<<2)|2,{49,111,0}}, +/* 2546 */ {(10<<2)|2,{49,111,0}}, +/* 2547 */ {(10<<2)|2,{49,111,0}}, +/* 2548 */ {(10<<2)|2,{49,111,0}}, +/* 2549 */ {(10<<2)|2,{49,111,0}}, +/* 2550 */ {(10<<2)|2,{49,111,0}}, +/* 2551 */ {(10<<2)|2,{49,111,0}}, +/* 2552 */ {(10<<2)|2,{49,111,0}}, +/* 2553 */ {(10<<2)|2,{49,111,0}}, +/* 2554 */ {(10<<2)|2,{49,111,0}}, +/* 2555 */ {(10<<2)|2,{49,111,0}}, +/* 2556 */ {(10<<2)|2,{49,111,0}}, +/* 2557 */ {(10<<2)|2,{49,111,0}}, +/* 2558 */ {(10<<2)|2,{49,111,0}}, +/* 2559 */ {(10<<2)|2,{49,111,0}}, +/* 2560 */ {(15<<2)|3,{49,115,48}}, +/* 2561 */ {(15<<2)|3,{49,115,48}}, +/* 2562 */ {(15<<2)|3,{49,115,49}}, +/* 2563 */ {(15<<2)|3,{49,115,49}}, +/* 2564 */ {(15<<2)|3,{49,115,50}}, +/* 2565 */ {(15<<2)|3,{49,115,50}}, +/* 2566 */ {(15<<2)|3,{49,115,97}}, +/* 2567 */ {(15<<2)|3,{49,115,97}}, +/* 2568 */ {(15<<2)|3,{49,115,99}}, +/* 2569 */ {(15<<2)|3,{49,115,99}}, +/* 2570 */ {(15<<2)|3,{49,115,101}}, +/* 2571 */ {(15<<2)|3,{49,115,101}}, +/* 2572 */ {(15<<2)|3,{49,115,105}}, +/* 2573 */ {(15<<2)|3,{49,115,105}}, +/* 2574 */ {(15<<2)|3,{49,115,111}}, +/* 2575 */ {(15<<2)|3,{49,115,111}}, +/* 2576 */ {(15<<2)|3,{49,115,115}}, +/* 2577 */ {(15<<2)|3,{49,115,115}}, +/* 2578 */ {(15<<2)|3,{49,115,116}}, +/* 2579 */ {(15<<2)|3,{49,115,116}}, +/* 2580 */ {(16<<2)|3,{49,115,32}}, +/* 2581 */ {(16<<2)|3,{49,115,37}}, +/* 2582 */ {(16<<2)|3,{49,115,45}}, +/* 2583 */ {(16<<2)|3,{49,115,46}}, +/* 2584 */ {(16<<2)|3,{49,115,47}}, +/* 2585 */ {(16<<2)|3,{49,115,51}}, +/* 2586 */ {(16<<2)|3,{49,115,52}}, +/* 2587 */ {(16<<2)|3,{49,115,53}}, +/* 2588 */ {(16<<2)|3,{49,115,54}}, +/* 2589 */ {(16<<2)|3,{49,115,55}}, +/* 2590 */ {(16<<2)|3,{49,115,56}}, +/* 2591 */ {(16<<2)|3,{49,115,57}}, +/* 2592 */ {(16<<2)|3,{49,115,61}}, +/* 2593 */ {(16<<2)|3,{49,115,65}}, +/* 2594 */ {(16<<2)|3,{49,115,95}}, +/* 2595 */ {(16<<2)|3,{49,115,98}}, +/* 2596 */ {(16<<2)|3,{49,115,100}}, +/* 2597 */ {(16<<2)|3,{49,115,102}}, +/* 2598 */ {(16<<2)|3,{49,115,103}}, +/* 2599 */ {(16<<2)|3,{49,115,104}}, +/* 2600 */ {(16<<2)|3,{49,115,108}}, +/* 2601 */ {(16<<2)|3,{49,115,109}}, +/* 2602 */ {(16<<2)|3,{49,115,110}}, +/* 2603 */ {(16<<2)|3,{49,115,112}}, +/* 2604 */ {(16<<2)|3,{49,115,114}}, +/* 2605 */ {(16<<2)|3,{49,115,117}}, +/* 2606 */ {(10<<2)|2,{49,115,0}}, +/* 2607 */ {(10<<2)|2,{49,115,0}}, +/* 2608 */ {(10<<2)|2,{49,115,0}}, +/* 2609 */ {(10<<2)|2,{49,115,0}}, +/* 2610 */ {(10<<2)|2,{49,115,0}}, +/* 2611 */ {(10<<2)|2,{49,115,0}}, +/* 2612 */ {(10<<2)|2,{49,115,0}}, +/* 2613 */ {(10<<2)|2,{49,115,0}}, +/* 2614 */ {(10<<2)|2,{49,115,0}}, +/* 2615 */ {(10<<2)|2,{49,115,0}}, +/* 2616 */ {(10<<2)|2,{49,115,0}}, +/* 2617 */ {(10<<2)|2,{49,115,0}}, +/* 2618 */ {(10<<2)|2,{49,115,0}}, +/* 2619 */ {(10<<2)|2,{49,115,0}}, +/* 2620 */ {(10<<2)|2,{49,115,0}}, +/* 2621 */ {(10<<2)|2,{49,115,0}}, +/* 2622 */ {(10<<2)|2,{49,115,0}}, +/* 2623 */ {(10<<2)|2,{49,115,0}}, +/* 2624 */ {(15<<2)|3,{49,116,48}}, +/* 2625 */ {(15<<2)|3,{49,116,48}}, +/* 2626 */ {(15<<2)|3,{49,116,49}}, +/* 2627 */ {(15<<2)|3,{49,116,49}}, +/* 2628 */ {(15<<2)|3,{49,116,50}}, +/* 2629 */ {(15<<2)|3,{49,116,50}}, +/* 2630 */ {(15<<2)|3,{49,116,97}}, +/* 2631 */ {(15<<2)|3,{49,116,97}}, +/* 2632 */ {(15<<2)|3,{49,116,99}}, +/* 2633 */ {(15<<2)|3,{49,116,99}}, +/* 2634 */ {(15<<2)|3,{49,116,101}}, +/* 2635 */ {(15<<2)|3,{49,116,101}}, +/* 2636 */ {(15<<2)|3,{49,116,105}}, +/* 2637 */ {(15<<2)|3,{49,116,105}}, +/* 2638 */ {(15<<2)|3,{49,116,111}}, +/* 2639 */ {(15<<2)|3,{49,116,111}}, +/* 2640 */ {(15<<2)|3,{49,116,115}}, +/* 2641 */ {(15<<2)|3,{49,116,115}}, +/* 2642 */ {(15<<2)|3,{49,116,116}}, +/* 2643 */ {(15<<2)|3,{49,116,116}}, +/* 2644 */ {(16<<2)|3,{49,116,32}}, +/* 2645 */ {(16<<2)|3,{49,116,37}}, +/* 2646 */ {(16<<2)|3,{49,116,45}}, +/* 2647 */ {(16<<2)|3,{49,116,46}}, +/* 2648 */ {(16<<2)|3,{49,116,47}}, +/* 2649 */ {(16<<2)|3,{49,116,51}}, +/* 2650 */ {(16<<2)|3,{49,116,52}}, +/* 2651 */ {(16<<2)|3,{49,116,53}}, +/* 2652 */ {(16<<2)|3,{49,116,54}}, +/* 2653 */ {(16<<2)|3,{49,116,55}}, +/* 2654 */ {(16<<2)|3,{49,116,56}}, +/* 2655 */ {(16<<2)|3,{49,116,57}}, +/* 2656 */ {(16<<2)|3,{49,116,61}}, +/* 2657 */ {(16<<2)|3,{49,116,65}}, +/* 2658 */ {(16<<2)|3,{49,116,95}}, +/* 2659 */ {(16<<2)|3,{49,116,98}}, +/* 2660 */ {(16<<2)|3,{49,116,100}}, +/* 2661 */ {(16<<2)|3,{49,116,102}}, +/* 2662 */ {(16<<2)|3,{49,116,103}}, +/* 2663 */ {(16<<2)|3,{49,116,104}}, +/* 2664 */ {(16<<2)|3,{49,116,108}}, +/* 2665 */ {(16<<2)|3,{49,116,109}}, +/* 2666 */ {(16<<2)|3,{49,116,110}}, +/* 2667 */ {(16<<2)|3,{49,116,112}}, +/* 2668 */ {(16<<2)|3,{49,116,114}}, +/* 2669 */ {(16<<2)|3,{49,116,117}}, +/* 2670 */ {(10<<2)|2,{49,116,0}}, +/* 2671 */ {(10<<2)|2,{49,116,0}}, +/* 2672 */ {(10<<2)|2,{49,116,0}}, +/* 2673 */ {(10<<2)|2,{49,116,0}}, +/* 2674 */ {(10<<2)|2,{49,116,0}}, +/* 2675 */ {(10<<2)|2,{49,116,0}}, +/* 2676 */ {(10<<2)|2,{49,116,0}}, +/* 2677 */ {(10<<2)|2,{49,116,0}}, +/* 2678 */ {(10<<2)|2,{49,116,0}}, +/* 2679 */ {(10<<2)|2,{49,116,0}}, +/* 2680 */ {(10<<2)|2,{49,116,0}}, +/* 2681 */ {(10<<2)|2,{49,116,0}}, +/* 2682 */ {(10<<2)|2,{49,116,0}}, +/* 2683 */ {(10<<2)|2,{49,116,0}}, +/* 2684 */ {(10<<2)|2,{49,116,0}}, +/* 2685 */ {(10<<2)|2,{49,116,0}}, +/* 2686 */ {(10<<2)|2,{49,116,0}}, +/* 2687 */ {(10<<2)|2,{49,116,0}}, +/* 2688 */ {(16<<2)|3,{49,32,48}}, +/* 2689 */ {(16<<2)|3,{49,32,49}}, +/* 2690 */ {(16<<2)|3,{49,32,50}}, +/* 2691 */ {(16<<2)|3,{49,32,97}}, +/* 2692 */ {(16<<2)|3,{49,32,99}}, +/* 2693 */ {(16<<2)|3,{49,32,101}}, +/* 2694 */ {(16<<2)|3,{49,32,105}}, +/* 2695 */ {(16<<2)|3,{49,32,111}}, +/* 2696 */ {(16<<2)|3,{49,32,115}}, +/* 2697 */ {(16<<2)|3,{49,32,116}}, +/* 2698 */ {(11<<2)|2,{49,32,0}}, +/* 2699 */ {(11<<2)|2,{49,32,0}}, +/* 2700 */ {(11<<2)|2,{49,32,0}}, +/* 2701 */ {(11<<2)|2,{49,32,0}}, +/* 2702 */ {(11<<2)|2,{49,32,0}}, +/* 2703 */ {(11<<2)|2,{49,32,0}}, +/* 2704 */ {(11<<2)|2,{49,32,0}}, +/* 2705 */ {(11<<2)|2,{49,32,0}}, +/* 2706 */ {(11<<2)|2,{49,32,0}}, +/* 2707 */ {(11<<2)|2,{49,32,0}}, +/* 2708 */ {(11<<2)|2,{49,32,0}}, +/* 2709 */ {(11<<2)|2,{49,32,0}}, +/* 2710 */ {(11<<2)|2,{49,32,0}}, +/* 2711 */ {(11<<2)|2,{49,32,0}}, +/* 2712 */ {(11<<2)|2,{49,32,0}}, +/* 2713 */ {(11<<2)|2,{49,32,0}}, +/* 2714 */ {(11<<2)|2,{49,32,0}}, +/* 2715 */ {(11<<2)|2,{49,32,0}}, +/* 2716 */ {(11<<2)|2,{49,32,0}}, +/* 2717 */ {(11<<2)|2,{49,32,0}}, +/* 2718 */ {(11<<2)|2,{49,32,0}}, +/* 2719 */ {(11<<2)|2,{49,32,0}}, +/* 2720 */ {(16<<2)|3,{49,37,48}}, +/* 2721 */ {(16<<2)|3,{49,37,49}}, +/* 2722 */ {(16<<2)|3,{49,37,50}}, +/* 2723 */ {(16<<2)|3,{49,37,97}}, +/* 2724 */ {(16<<2)|3,{49,37,99}}, +/* 2725 */ {(16<<2)|3,{49,37,101}}, +/* 2726 */ {(16<<2)|3,{49,37,105}}, +/* 2727 */ {(16<<2)|3,{49,37,111}}, +/* 2728 */ {(16<<2)|3,{49,37,115}}, +/* 2729 */ {(16<<2)|3,{49,37,116}}, +/* 2730 */ {(11<<2)|2,{49,37,0}}, +/* 2731 */ {(11<<2)|2,{49,37,0}}, +/* 2732 */ {(11<<2)|2,{49,37,0}}, +/* 2733 */ {(11<<2)|2,{49,37,0}}, +/* 2734 */ {(11<<2)|2,{49,37,0}}, +/* 2735 */ {(11<<2)|2,{49,37,0}}, +/* 2736 */ {(11<<2)|2,{49,37,0}}, +/* 2737 */ {(11<<2)|2,{49,37,0}}, +/* 2738 */ {(11<<2)|2,{49,37,0}}, +/* 2739 */ {(11<<2)|2,{49,37,0}}, +/* 2740 */ {(11<<2)|2,{49,37,0}}, +/* 2741 */ {(11<<2)|2,{49,37,0}}, +/* 2742 */ {(11<<2)|2,{49,37,0}}, +/* 2743 */ {(11<<2)|2,{49,37,0}}, +/* 2744 */ {(11<<2)|2,{49,37,0}}, +/* 2745 */ {(11<<2)|2,{49,37,0}}, +/* 2746 */ {(11<<2)|2,{49,37,0}}, +/* 2747 */ {(11<<2)|2,{49,37,0}}, +/* 2748 */ {(11<<2)|2,{49,37,0}}, +/* 2749 */ {(11<<2)|2,{49,37,0}}, +/* 2750 */ {(11<<2)|2,{49,37,0}}, +/* 2751 */ {(11<<2)|2,{49,37,0}}, +/* 2752 */ {(16<<2)|3,{49,45,48}}, +/* 2753 */ {(16<<2)|3,{49,45,49}}, +/* 2754 */ {(16<<2)|3,{49,45,50}}, +/* 2755 */ {(16<<2)|3,{49,45,97}}, +/* 2756 */ {(16<<2)|3,{49,45,99}}, +/* 2757 */ {(16<<2)|3,{49,45,101}}, +/* 2758 */ {(16<<2)|3,{49,45,105}}, +/* 2759 */ {(16<<2)|3,{49,45,111}}, +/* 2760 */ {(16<<2)|3,{49,45,115}}, +/* 2761 */ {(16<<2)|3,{49,45,116}}, +/* 2762 */ {(11<<2)|2,{49,45,0}}, +/* 2763 */ {(11<<2)|2,{49,45,0}}, +/* 2764 */ {(11<<2)|2,{49,45,0}}, +/* 2765 */ {(11<<2)|2,{49,45,0}}, +/* 2766 */ {(11<<2)|2,{49,45,0}}, +/* 2767 */ {(11<<2)|2,{49,45,0}}, +/* 2768 */ {(11<<2)|2,{49,45,0}}, +/* 2769 */ {(11<<2)|2,{49,45,0}}, +/* 2770 */ {(11<<2)|2,{49,45,0}}, +/* 2771 */ {(11<<2)|2,{49,45,0}}, +/* 2772 */ {(11<<2)|2,{49,45,0}}, +/* 2773 */ {(11<<2)|2,{49,45,0}}, +/* 2774 */ {(11<<2)|2,{49,45,0}}, +/* 2775 */ {(11<<2)|2,{49,45,0}}, +/* 2776 */ {(11<<2)|2,{49,45,0}}, +/* 2777 */ {(11<<2)|2,{49,45,0}}, +/* 2778 */ {(11<<2)|2,{49,45,0}}, +/* 2779 */ {(11<<2)|2,{49,45,0}}, +/* 2780 */ {(11<<2)|2,{49,45,0}}, +/* 2781 */ {(11<<2)|2,{49,45,0}}, +/* 2782 */ {(11<<2)|2,{49,45,0}}, +/* 2783 */ {(11<<2)|2,{49,45,0}}, +/* 2784 */ {(16<<2)|3,{49,46,48}}, +/* 2785 */ {(16<<2)|3,{49,46,49}}, +/* 2786 */ {(16<<2)|3,{49,46,50}}, +/* 2787 */ {(16<<2)|3,{49,46,97}}, +/* 2788 */ {(16<<2)|3,{49,46,99}}, +/* 2789 */ {(16<<2)|3,{49,46,101}}, +/* 2790 */ {(16<<2)|3,{49,46,105}}, +/* 2791 */ {(16<<2)|3,{49,46,111}}, +/* 2792 */ {(16<<2)|3,{49,46,115}}, +/* 2793 */ {(16<<2)|3,{49,46,116}}, +/* 2794 */ {(11<<2)|2,{49,46,0}}, +/* 2795 */ {(11<<2)|2,{49,46,0}}, +/* 2796 */ {(11<<2)|2,{49,46,0}}, +/* 2797 */ {(11<<2)|2,{49,46,0}}, +/* 2798 */ {(11<<2)|2,{49,46,0}}, +/* 2799 */ {(11<<2)|2,{49,46,0}}, +/* 2800 */ {(11<<2)|2,{49,46,0}}, +/* 2801 */ {(11<<2)|2,{49,46,0}}, +/* 2802 */ {(11<<2)|2,{49,46,0}}, +/* 2803 */ {(11<<2)|2,{49,46,0}}, +/* 2804 */ {(11<<2)|2,{49,46,0}}, +/* 2805 */ {(11<<2)|2,{49,46,0}}, +/* 2806 */ {(11<<2)|2,{49,46,0}}, +/* 2807 */ {(11<<2)|2,{49,46,0}}, +/* 2808 */ {(11<<2)|2,{49,46,0}}, +/* 2809 */ {(11<<2)|2,{49,46,0}}, +/* 2810 */ {(11<<2)|2,{49,46,0}}, +/* 2811 */ {(11<<2)|2,{49,46,0}}, +/* 2812 */ {(11<<2)|2,{49,46,0}}, +/* 2813 */ {(11<<2)|2,{49,46,0}}, +/* 2814 */ {(11<<2)|2,{49,46,0}}, +/* 2815 */ {(11<<2)|2,{49,46,0}}, +/* 2816 */ {(16<<2)|3,{49,47,48}}, +/* 2817 */ {(16<<2)|3,{49,47,49}}, +/* 2818 */ {(16<<2)|3,{49,47,50}}, +/* 2819 */ {(16<<2)|3,{49,47,97}}, +/* 2820 */ {(16<<2)|3,{49,47,99}}, +/* 2821 */ {(16<<2)|3,{49,47,101}}, +/* 2822 */ {(16<<2)|3,{49,47,105}}, +/* 2823 */ {(16<<2)|3,{49,47,111}}, +/* 2824 */ {(16<<2)|3,{49,47,115}}, +/* 2825 */ {(16<<2)|3,{49,47,116}}, +/* 2826 */ {(11<<2)|2,{49,47,0}}, +/* 2827 */ {(11<<2)|2,{49,47,0}}, +/* 2828 */ {(11<<2)|2,{49,47,0}}, +/* 2829 */ {(11<<2)|2,{49,47,0}}, +/* 2830 */ {(11<<2)|2,{49,47,0}}, +/* 2831 */ {(11<<2)|2,{49,47,0}}, +/* 2832 */ {(11<<2)|2,{49,47,0}}, +/* 2833 */ {(11<<2)|2,{49,47,0}}, +/* 2834 */ {(11<<2)|2,{49,47,0}}, +/* 2835 */ {(11<<2)|2,{49,47,0}}, +/* 2836 */ {(11<<2)|2,{49,47,0}}, +/* 2837 */ {(11<<2)|2,{49,47,0}}, +/* 2838 */ {(11<<2)|2,{49,47,0}}, +/* 2839 */ {(11<<2)|2,{49,47,0}}, +/* 2840 */ {(11<<2)|2,{49,47,0}}, +/* 2841 */ {(11<<2)|2,{49,47,0}}, +/* 2842 */ {(11<<2)|2,{49,47,0}}, +/* 2843 */ {(11<<2)|2,{49,47,0}}, +/* 2844 */ {(11<<2)|2,{49,47,0}}, +/* 2845 */ {(11<<2)|2,{49,47,0}}, +/* 2846 */ {(11<<2)|2,{49,47,0}}, +/* 2847 */ {(11<<2)|2,{49,47,0}}, +/* 2848 */ {(16<<2)|3,{49,51,48}}, +/* 2849 */ {(16<<2)|3,{49,51,49}}, +/* 2850 */ {(16<<2)|3,{49,51,50}}, +/* 2851 */ {(16<<2)|3,{49,51,97}}, +/* 2852 */ {(16<<2)|3,{49,51,99}}, +/* 2853 */ {(16<<2)|3,{49,51,101}}, +/* 2854 */ {(16<<2)|3,{49,51,105}}, +/* 2855 */ {(16<<2)|3,{49,51,111}}, +/* 2856 */ {(16<<2)|3,{49,51,115}}, +/* 2857 */ {(16<<2)|3,{49,51,116}}, +/* 2858 */ {(11<<2)|2,{49,51,0}}, +/* 2859 */ {(11<<2)|2,{49,51,0}}, +/* 2860 */ {(11<<2)|2,{49,51,0}}, +/* 2861 */ {(11<<2)|2,{49,51,0}}, +/* 2862 */ {(11<<2)|2,{49,51,0}}, +/* 2863 */ {(11<<2)|2,{49,51,0}}, +/* 2864 */ {(11<<2)|2,{49,51,0}}, +/* 2865 */ {(11<<2)|2,{49,51,0}}, +/* 2866 */ {(11<<2)|2,{49,51,0}}, +/* 2867 */ {(11<<2)|2,{49,51,0}}, +/* 2868 */ {(11<<2)|2,{49,51,0}}, +/* 2869 */ {(11<<2)|2,{49,51,0}}, +/* 2870 */ {(11<<2)|2,{49,51,0}}, +/* 2871 */ {(11<<2)|2,{49,51,0}}, +/* 2872 */ {(11<<2)|2,{49,51,0}}, +/* 2873 */ {(11<<2)|2,{49,51,0}}, +/* 2874 */ {(11<<2)|2,{49,51,0}}, +/* 2875 */ {(11<<2)|2,{49,51,0}}, +/* 2876 */ {(11<<2)|2,{49,51,0}}, +/* 2877 */ {(11<<2)|2,{49,51,0}}, +/* 2878 */ {(11<<2)|2,{49,51,0}}, +/* 2879 */ {(11<<2)|2,{49,51,0}}, +/* 2880 */ {(16<<2)|3,{49,52,48}}, +/* 2881 */ {(16<<2)|3,{49,52,49}}, +/* 2882 */ {(16<<2)|3,{49,52,50}}, +/* 2883 */ {(16<<2)|3,{49,52,97}}, +/* 2884 */ {(16<<2)|3,{49,52,99}}, +/* 2885 */ {(16<<2)|3,{49,52,101}}, +/* 2886 */ {(16<<2)|3,{49,52,105}}, +/* 2887 */ {(16<<2)|3,{49,52,111}}, +/* 2888 */ {(16<<2)|3,{49,52,115}}, +/* 2889 */ {(16<<2)|3,{49,52,116}}, +/* 2890 */ {(11<<2)|2,{49,52,0}}, +/* 2891 */ {(11<<2)|2,{49,52,0}}, +/* 2892 */ {(11<<2)|2,{49,52,0}}, +/* 2893 */ {(11<<2)|2,{49,52,0}}, +/* 2894 */ {(11<<2)|2,{49,52,0}}, +/* 2895 */ {(11<<2)|2,{49,52,0}}, +/* 2896 */ {(11<<2)|2,{49,52,0}}, +/* 2897 */ {(11<<2)|2,{49,52,0}}, +/* 2898 */ {(11<<2)|2,{49,52,0}}, +/* 2899 */ {(11<<2)|2,{49,52,0}}, +/* 2900 */ {(11<<2)|2,{49,52,0}}, +/* 2901 */ {(11<<2)|2,{49,52,0}}, +/* 2902 */ {(11<<2)|2,{49,52,0}}, +/* 2903 */ {(11<<2)|2,{49,52,0}}, +/* 2904 */ {(11<<2)|2,{49,52,0}}, +/* 2905 */ {(11<<2)|2,{49,52,0}}, +/* 2906 */ {(11<<2)|2,{49,52,0}}, +/* 2907 */ {(11<<2)|2,{49,52,0}}, +/* 2908 */ {(11<<2)|2,{49,52,0}}, +/* 2909 */ {(11<<2)|2,{49,52,0}}, +/* 2910 */ {(11<<2)|2,{49,52,0}}, +/* 2911 */ {(11<<2)|2,{49,52,0}}, +/* 2912 */ {(16<<2)|3,{49,53,48}}, +/* 2913 */ {(16<<2)|3,{49,53,49}}, +/* 2914 */ {(16<<2)|3,{49,53,50}}, +/* 2915 */ {(16<<2)|3,{49,53,97}}, +/* 2916 */ {(16<<2)|3,{49,53,99}}, +/* 2917 */ {(16<<2)|3,{49,53,101}}, +/* 2918 */ {(16<<2)|3,{49,53,105}}, +/* 2919 */ {(16<<2)|3,{49,53,111}}, +/* 2920 */ {(16<<2)|3,{49,53,115}}, +/* 2921 */ {(16<<2)|3,{49,53,116}}, +/* 2922 */ {(11<<2)|2,{49,53,0}}, +/* 2923 */ {(11<<2)|2,{49,53,0}}, +/* 2924 */ {(11<<2)|2,{49,53,0}}, +/* 2925 */ {(11<<2)|2,{49,53,0}}, +/* 2926 */ {(11<<2)|2,{49,53,0}}, +/* 2927 */ {(11<<2)|2,{49,53,0}}, +/* 2928 */ {(11<<2)|2,{49,53,0}}, +/* 2929 */ {(11<<2)|2,{49,53,0}}, +/* 2930 */ {(11<<2)|2,{49,53,0}}, +/* 2931 */ {(11<<2)|2,{49,53,0}}, +/* 2932 */ {(11<<2)|2,{49,53,0}}, +/* 2933 */ {(11<<2)|2,{49,53,0}}, +/* 2934 */ {(11<<2)|2,{49,53,0}}, +/* 2935 */ {(11<<2)|2,{49,53,0}}, +/* 2936 */ {(11<<2)|2,{49,53,0}}, +/* 2937 */ {(11<<2)|2,{49,53,0}}, +/* 2938 */ {(11<<2)|2,{49,53,0}}, +/* 2939 */ {(11<<2)|2,{49,53,0}}, +/* 2940 */ {(11<<2)|2,{49,53,0}}, +/* 2941 */ {(11<<2)|2,{49,53,0}}, +/* 2942 */ {(11<<2)|2,{49,53,0}}, +/* 2943 */ {(11<<2)|2,{49,53,0}}, +/* 2944 */ {(16<<2)|3,{49,54,48}}, +/* 2945 */ {(16<<2)|3,{49,54,49}}, +/* 2946 */ {(16<<2)|3,{49,54,50}}, +/* 2947 */ {(16<<2)|3,{49,54,97}}, +/* 2948 */ {(16<<2)|3,{49,54,99}}, +/* 2949 */ {(16<<2)|3,{49,54,101}}, +/* 2950 */ {(16<<2)|3,{49,54,105}}, +/* 2951 */ {(16<<2)|3,{49,54,111}}, +/* 2952 */ {(16<<2)|3,{49,54,115}}, +/* 2953 */ {(16<<2)|3,{49,54,116}}, +/* 2954 */ {(11<<2)|2,{49,54,0}}, +/* 2955 */ {(11<<2)|2,{49,54,0}}, +/* 2956 */ {(11<<2)|2,{49,54,0}}, +/* 2957 */ {(11<<2)|2,{49,54,0}}, +/* 2958 */ {(11<<2)|2,{49,54,0}}, +/* 2959 */ {(11<<2)|2,{49,54,0}}, +/* 2960 */ {(11<<2)|2,{49,54,0}}, +/* 2961 */ {(11<<2)|2,{49,54,0}}, +/* 2962 */ {(11<<2)|2,{49,54,0}}, +/* 2963 */ {(11<<2)|2,{49,54,0}}, +/* 2964 */ {(11<<2)|2,{49,54,0}}, +/* 2965 */ {(11<<2)|2,{49,54,0}}, +/* 2966 */ {(11<<2)|2,{49,54,0}}, +/* 2967 */ {(11<<2)|2,{49,54,0}}, +/* 2968 */ {(11<<2)|2,{49,54,0}}, +/* 2969 */ {(11<<2)|2,{49,54,0}}, +/* 2970 */ {(11<<2)|2,{49,54,0}}, +/* 2971 */ {(11<<2)|2,{49,54,0}}, +/* 2972 */ {(11<<2)|2,{49,54,0}}, +/* 2973 */ {(11<<2)|2,{49,54,0}}, +/* 2974 */ {(11<<2)|2,{49,54,0}}, +/* 2975 */ {(11<<2)|2,{49,54,0}}, +/* 2976 */ {(16<<2)|3,{49,55,48}}, +/* 2977 */ {(16<<2)|3,{49,55,49}}, +/* 2978 */ {(16<<2)|3,{49,55,50}}, +/* 2979 */ {(16<<2)|3,{49,55,97}}, +/* 2980 */ {(16<<2)|3,{49,55,99}}, +/* 2981 */ {(16<<2)|3,{49,55,101}}, +/* 2982 */ {(16<<2)|3,{49,55,105}}, +/* 2983 */ {(16<<2)|3,{49,55,111}}, +/* 2984 */ {(16<<2)|3,{49,55,115}}, +/* 2985 */ {(16<<2)|3,{49,55,116}}, +/* 2986 */ {(11<<2)|2,{49,55,0}}, +/* 2987 */ {(11<<2)|2,{49,55,0}}, +/* 2988 */ {(11<<2)|2,{49,55,0}}, +/* 2989 */ {(11<<2)|2,{49,55,0}}, +/* 2990 */ {(11<<2)|2,{49,55,0}}, +/* 2991 */ {(11<<2)|2,{49,55,0}}, +/* 2992 */ {(11<<2)|2,{49,55,0}}, +/* 2993 */ {(11<<2)|2,{49,55,0}}, +/* 2994 */ {(11<<2)|2,{49,55,0}}, +/* 2995 */ {(11<<2)|2,{49,55,0}}, +/* 2996 */ {(11<<2)|2,{49,55,0}}, +/* 2997 */ {(11<<2)|2,{49,55,0}}, +/* 2998 */ {(11<<2)|2,{49,55,0}}, +/* 2999 */ {(11<<2)|2,{49,55,0}}, +/* 3000 */ {(11<<2)|2,{49,55,0}}, +/* 3001 */ {(11<<2)|2,{49,55,0}}, +/* 3002 */ {(11<<2)|2,{49,55,0}}, +/* 3003 */ {(11<<2)|2,{49,55,0}}, +/* 3004 */ {(11<<2)|2,{49,55,0}}, +/* 3005 */ {(11<<2)|2,{49,55,0}}, +/* 3006 */ {(11<<2)|2,{49,55,0}}, +/* 3007 */ {(11<<2)|2,{49,55,0}}, +/* 3008 */ {(16<<2)|3,{49,56,48}}, +/* 3009 */ {(16<<2)|3,{49,56,49}}, +/* 3010 */ {(16<<2)|3,{49,56,50}}, +/* 3011 */ {(16<<2)|3,{49,56,97}}, +/* 3012 */ {(16<<2)|3,{49,56,99}}, +/* 3013 */ {(16<<2)|3,{49,56,101}}, +/* 3014 */ {(16<<2)|3,{49,56,105}}, +/* 3015 */ {(16<<2)|3,{49,56,111}}, +/* 3016 */ {(16<<2)|3,{49,56,115}}, +/* 3017 */ {(16<<2)|3,{49,56,116}}, +/* 3018 */ {(11<<2)|2,{49,56,0}}, +/* 3019 */ {(11<<2)|2,{49,56,0}}, +/* 3020 */ {(11<<2)|2,{49,56,0}}, +/* 3021 */ {(11<<2)|2,{49,56,0}}, +/* 3022 */ {(11<<2)|2,{49,56,0}}, +/* 3023 */ {(11<<2)|2,{49,56,0}}, +/* 3024 */ {(11<<2)|2,{49,56,0}}, +/* 3025 */ {(11<<2)|2,{49,56,0}}, +/* 3026 */ {(11<<2)|2,{49,56,0}}, +/* 3027 */ {(11<<2)|2,{49,56,0}}, +/* 3028 */ {(11<<2)|2,{49,56,0}}, +/* 3029 */ {(11<<2)|2,{49,56,0}}, +/* 3030 */ {(11<<2)|2,{49,56,0}}, +/* 3031 */ {(11<<2)|2,{49,56,0}}, +/* 3032 */ {(11<<2)|2,{49,56,0}}, +/* 3033 */ {(11<<2)|2,{49,56,0}}, +/* 3034 */ {(11<<2)|2,{49,56,0}}, +/* 3035 */ {(11<<2)|2,{49,56,0}}, +/* 3036 */ {(11<<2)|2,{49,56,0}}, +/* 3037 */ {(11<<2)|2,{49,56,0}}, +/* 3038 */ {(11<<2)|2,{49,56,0}}, +/* 3039 */ {(11<<2)|2,{49,56,0}}, +/* 3040 */ {(16<<2)|3,{49,57,48}}, +/* 3041 */ {(16<<2)|3,{49,57,49}}, +/* 3042 */ {(16<<2)|3,{49,57,50}}, +/* 3043 */ {(16<<2)|3,{49,57,97}}, +/* 3044 */ {(16<<2)|3,{49,57,99}}, +/* 3045 */ {(16<<2)|3,{49,57,101}}, +/* 3046 */ {(16<<2)|3,{49,57,105}}, +/* 3047 */ {(16<<2)|3,{49,57,111}}, +/* 3048 */ {(16<<2)|3,{49,57,115}}, +/* 3049 */ {(16<<2)|3,{49,57,116}}, +/* 3050 */ {(11<<2)|2,{49,57,0}}, +/* 3051 */ {(11<<2)|2,{49,57,0}}, +/* 3052 */ {(11<<2)|2,{49,57,0}}, +/* 3053 */ {(11<<2)|2,{49,57,0}}, +/* 3054 */ {(11<<2)|2,{49,57,0}}, +/* 3055 */ {(11<<2)|2,{49,57,0}}, +/* 3056 */ {(11<<2)|2,{49,57,0}}, +/* 3057 */ {(11<<2)|2,{49,57,0}}, +/* 3058 */ {(11<<2)|2,{49,57,0}}, +/* 3059 */ {(11<<2)|2,{49,57,0}}, +/* 3060 */ {(11<<2)|2,{49,57,0}}, +/* 3061 */ {(11<<2)|2,{49,57,0}}, +/* 3062 */ {(11<<2)|2,{49,57,0}}, +/* 3063 */ {(11<<2)|2,{49,57,0}}, +/* 3064 */ {(11<<2)|2,{49,57,0}}, +/* 3065 */ {(11<<2)|2,{49,57,0}}, +/* 3066 */ {(11<<2)|2,{49,57,0}}, +/* 3067 */ {(11<<2)|2,{49,57,0}}, +/* 3068 */ {(11<<2)|2,{49,57,0}}, +/* 3069 */ {(11<<2)|2,{49,57,0}}, +/* 3070 */ {(11<<2)|2,{49,57,0}}, +/* 3071 */ {(11<<2)|2,{49,57,0}}, +/* 3072 */ {(16<<2)|3,{49,61,48}}, +/* 3073 */ {(16<<2)|3,{49,61,49}}, +/* 3074 */ {(16<<2)|3,{49,61,50}}, +/* 3075 */ {(16<<2)|3,{49,61,97}}, +/* 3076 */ {(16<<2)|3,{49,61,99}}, +/* 3077 */ {(16<<2)|3,{49,61,101}}, +/* 3078 */ {(16<<2)|3,{49,61,105}}, +/* 3079 */ {(16<<2)|3,{49,61,111}}, +/* 3080 */ {(16<<2)|3,{49,61,115}}, +/* 3081 */ {(16<<2)|3,{49,61,116}}, +/* 3082 */ {(11<<2)|2,{49,61,0}}, +/* 3083 */ {(11<<2)|2,{49,61,0}}, +/* 3084 */ {(11<<2)|2,{49,61,0}}, +/* 3085 */ {(11<<2)|2,{49,61,0}}, +/* 3086 */ {(11<<2)|2,{49,61,0}}, +/* 3087 */ {(11<<2)|2,{49,61,0}}, +/* 3088 */ {(11<<2)|2,{49,61,0}}, +/* 3089 */ {(11<<2)|2,{49,61,0}}, +/* 3090 */ {(11<<2)|2,{49,61,0}}, +/* 3091 */ {(11<<2)|2,{49,61,0}}, +/* 3092 */ {(11<<2)|2,{49,61,0}}, +/* 3093 */ {(11<<2)|2,{49,61,0}}, +/* 3094 */ {(11<<2)|2,{49,61,0}}, +/* 3095 */ {(11<<2)|2,{49,61,0}}, +/* 3096 */ {(11<<2)|2,{49,61,0}}, +/* 3097 */ {(11<<2)|2,{49,61,0}}, +/* 3098 */ {(11<<2)|2,{49,61,0}}, +/* 3099 */ {(11<<2)|2,{49,61,0}}, +/* 3100 */ {(11<<2)|2,{49,61,0}}, +/* 3101 */ {(11<<2)|2,{49,61,0}}, +/* 3102 */ {(11<<2)|2,{49,61,0}}, +/* 3103 */ {(11<<2)|2,{49,61,0}}, +/* 3104 */ {(16<<2)|3,{49,65,48}}, +/* 3105 */ {(16<<2)|3,{49,65,49}}, +/* 3106 */ {(16<<2)|3,{49,65,50}}, +/* 3107 */ {(16<<2)|3,{49,65,97}}, +/* 3108 */ {(16<<2)|3,{49,65,99}}, +/* 3109 */ {(16<<2)|3,{49,65,101}}, +/* 3110 */ {(16<<2)|3,{49,65,105}}, +/* 3111 */ {(16<<2)|3,{49,65,111}}, +/* 3112 */ {(16<<2)|3,{49,65,115}}, +/* 3113 */ {(16<<2)|3,{49,65,116}}, +/* 3114 */ {(11<<2)|2,{49,65,0}}, +/* 3115 */ {(11<<2)|2,{49,65,0}}, +/* 3116 */ {(11<<2)|2,{49,65,0}}, +/* 3117 */ {(11<<2)|2,{49,65,0}}, +/* 3118 */ {(11<<2)|2,{49,65,0}}, +/* 3119 */ {(11<<2)|2,{49,65,0}}, +/* 3120 */ {(11<<2)|2,{49,65,0}}, +/* 3121 */ {(11<<2)|2,{49,65,0}}, +/* 3122 */ {(11<<2)|2,{49,65,0}}, +/* 3123 */ {(11<<2)|2,{49,65,0}}, +/* 3124 */ {(11<<2)|2,{49,65,0}}, +/* 3125 */ {(11<<2)|2,{49,65,0}}, +/* 3126 */ {(11<<2)|2,{49,65,0}}, +/* 3127 */ {(11<<2)|2,{49,65,0}}, +/* 3128 */ {(11<<2)|2,{49,65,0}}, +/* 3129 */ {(11<<2)|2,{49,65,0}}, +/* 3130 */ {(11<<2)|2,{49,65,0}}, +/* 3131 */ {(11<<2)|2,{49,65,0}}, +/* 3132 */ {(11<<2)|2,{49,65,0}}, +/* 3133 */ {(11<<2)|2,{49,65,0}}, +/* 3134 */ {(11<<2)|2,{49,65,0}}, +/* 3135 */ {(11<<2)|2,{49,65,0}}, +/* 3136 */ {(16<<2)|3,{49,95,48}}, +/* 3137 */ {(16<<2)|3,{49,95,49}}, +/* 3138 */ {(16<<2)|3,{49,95,50}}, +/* 3139 */ {(16<<2)|3,{49,95,97}}, +/* 3140 */ {(16<<2)|3,{49,95,99}}, +/* 3141 */ {(16<<2)|3,{49,95,101}}, +/* 3142 */ {(16<<2)|3,{49,95,105}}, +/* 3143 */ {(16<<2)|3,{49,95,111}}, +/* 3144 */ {(16<<2)|3,{49,95,115}}, +/* 3145 */ {(16<<2)|3,{49,95,116}}, +/* 3146 */ {(11<<2)|2,{49,95,0}}, +/* 3147 */ {(11<<2)|2,{49,95,0}}, +/* 3148 */ {(11<<2)|2,{49,95,0}}, +/* 3149 */ {(11<<2)|2,{49,95,0}}, +/* 3150 */ {(11<<2)|2,{49,95,0}}, +/* 3151 */ {(11<<2)|2,{49,95,0}}, +/* 3152 */ {(11<<2)|2,{49,95,0}}, +/* 3153 */ {(11<<2)|2,{49,95,0}}, +/* 3154 */ {(11<<2)|2,{49,95,0}}, +/* 3155 */ {(11<<2)|2,{49,95,0}}, +/* 3156 */ {(11<<2)|2,{49,95,0}}, +/* 3157 */ {(11<<2)|2,{49,95,0}}, +/* 3158 */ {(11<<2)|2,{49,95,0}}, +/* 3159 */ {(11<<2)|2,{49,95,0}}, +/* 3160 */ {(11<<2)|2,{49,95,0}}, +/* 3161 */ {(11<<2)|2,{49,95,0}}, +/* 3162 */ {(11<<2)|2,{49,95,0}}, +/* 3163 */ {(11<<2)|2,{49,95,0}}, +/* 3164 */ {(11<<2)|2,{49,95,0}}, +/* 3165 */ {(11<<2)|2,{49,95,0}}, +/* 3166 */ {(11<<2)|2,{49,95,0}}, +/* 3167 */ {(11<<2)|2,{49,95,0}}, +/* 3168 */ {(16<<2)|3,{49,98,48}}, +/* 3169 */ {(16<<2)|3,{49,98,49}}, +/* 3170 */ {(16<<2)|3,{49,98,50}}, +/* 3171 */ {(16<<2)|3,{49,98,97}}, +/* 3172 */ {(16<<2)|3,{49,98,99}}, +/* 3173 */ {(16<<2)|3,{49,98,101}}, +/* 3174 */ {(16<<2)|3,{49,98,105}}, +/* 3175 */ {(16<<2)|3,{49,98,111}}, +/* 3176 */ {(16<<2)|3,{49,98,115}}, +/* 3177 */ {(16<<2)|3,{49,98,116}}, +/* 3178 */ {(11<<2)|2,{49,98,0}}, +/* 3179 */ {(11<<2)|2,{49,98,0}}, +/* 3180 */ {(11<<2)|2,{49,98,0}}, +/* 3181 */ {(11<<2)|2,{49,98,0}}, +/* 3182 */ {(11<<2)|2,{49,98,0}}, +/* 3183 */ {(11<<2)|2,{49,98,0}}, +/* 3184 */ {(11<<2)|2,{49,98,0}}, +/* 3185 */ {(11<<2)|2,{49,98,0}}, +/* 3186 */ {(11<<2)|2,{49,98,0}}, +/* 3187 */ {(11<<2)|2,{49,98,0}}, +/* 3188 */ {(11<<2)|2,{49,98,0}}, +/* 3189 */ {(11<<2)|2,{49,98,0}}, +/* 3190 */ {(11<<2)|2,{49,98,0}}, +/* 3191 */ {(11<<2)|2,{49,98,0}}, +/* 3192 */ {(11<<2)|2,{49,98,0}}, +/* 3193 */ {(11<<2)|2,{49,98,0}}, +/* 3194 */ {(11<<2)|2,{49,98,0}}, +/* 3195 */ {(11<<2)|2,{49,98,0}}, +/* 3196 */ {(11<<2)|2,{49,98,0}}, +/* 3197 */ {(11<<2)|2,{49,98,0}}, +/* 3198 */ {(11<<2)|2,{49,98,0}}, +/* 3199 */ {(11<<2)|2,{49,98,0}}, +/* 3200 */ {(16<<2)|3,{49,100,48}}, +/* 3201 */ {(16<<2)|3,{49,100,49}}, +/* 3202 */ {(16<<2)|3,{49,100,50}}, +/* 3203 */ {(16<<2)|3,{49,100,97}}, +/* 3204 */ {(16<<2)|3,{49,100,99}}, +/* 3205 */ {(16<<2)|3,{49,100,101}}, +/* 3206 */ {(16<<2)|3,{49,100,105}}, +/* 3207 */ {(16<<2)|3,{49,100,111}}, +/* 3208 */ {(16<<2)|3,{49,100,115}}, +/* 3209 */ {(16<<2)|3,{49,100,116}}, +/* 3210 */ {(11<<2)|2,{49,100,0}}, +/* 3211 */ {(11<<2)|2,{49,100,0}}, +/* 3212 */ {(11<<2)|2,{49,100,0}}, +/* 3213 */ {(11<<2)|2,{49,100,0}}, +/* 3214 */ {(11<<2)|2,{49,100,0}}, +/* 3215 */ {(11<<2)|2,{49,100,0}}, +/* 3216 */ {(11<<2)|2,{49,100,0}}, +/* 3217 */ {(11<<2)|2,{49,100,0}}, +/* 3218 */ {(11<<2)|2,{49,100,0}}, +/* 3219 */ {(11<<2)|2,{49,100,0}}, +/* 3220 */ {(11<<2)|2,{49,100,0}}, +/* 3221 */ {(11<<2)|2,{49,100,0}}, +/* 3222 */ {(11<<2)|2,{49,100,0}}, +/* 3223 */ {(11<<2)|2,{49,100,0}}, +/* 3224 */ {(11<<2)|2,{49,100,0}}, +/* 3225 */ {(11<<2)|2,{49,100,0}}, +/* 3226 */ {(11<<2)|2,{49,100,0}}, +/* 3227 */ {(11<<2)|2,{49,100,0}}, +/* 3228 */ {(11<<2)|2,{49,100,0}}, +/* 3229 */ {(11<<2)|2,{49,100,0}}, +/* 3230 */ {(11<<2)|2,{49,100,0}}, +/* 3231 */ {(11<<2)|2,{49,100,0}}, +/* 3232 */ {(16<<2)|3,{49,102,48}}, +/* 3233 */ {(16<<2)|3,{49,102,49}}, +/* 3234 */ {(16<<2)|3,{49,102,50}}, +/* 3235 */ {(16<<2)|3,{49,102,97}}, +/* 3236 */ {(16<<2)|3,{49,102,99}}, +/* 3237 */ {(16<<2)|3,{49,102,101}}, +/* 3238 */ {(16<<2)|3,{49,102,105}}, +/* 3239 */ {(16<<2)|3,{49,102,111}}, +/* 3240 */ {(16<<2)|3,{49,102,115}}, +/* 3241 */ {(16<<2)|3,{49,102,116}}, +/* 3242 */ {(11<<2)|2,{49,102,0}}, +/* 3243 */ {(11<<2)|2,{49,102,0}}, +/* 3244 */ {(11<<2)|2,{49,102,0}}, +/* 3245 */ {(11<<2)|2,{49,102,0}}, +/* 3246 */ {(11<<2)|2,{49,102,0}}, +/* 3247 */ {(11<<2)|2,{49,102,0}}, +/* 3248 */ {(11<<2)|2,{49,102,0}}, +/* 3249 */ {(11<<2)|2,{49,102,0}}, +/* 3250 */ {(11<<2)|2,{49,102,0}}, +/* 3251 */ {(11<<2)|2,{49,102,0}}, +/* 3252 */ {(11<<2)|2,{49,102,0}}, +/* 3253 */ {(11<<2)|2,{49,102,0}}, +/* 3254 */ {(11<<2)|2,{49,102,0}}, +/* 3255 */ {(11<<2)|2,{49,102,0}}, +/* 3256 */ {(11<<2)|2,{49,102,0}}, +/* 3257 */ {(11<<2)|2,{49,102,0}}, +/* 3258 */ {(11<<2)|2,{49,102,0}}, +/* 3259 */ {(11<<2)|2,{49,102,0}}, +/* 3260 */ {(11<<2)|2,{49,102,0}}, +/* 3261 */ {(11<<2)|2,{49,102,0}}, +/* 3262 */ {(11<<2)|2,{49,102,0}}, +/* 3263 */ {(11<<2)|2,{49,102,0}}, +/* 3264 */ {(16<<2)|3,{49,103,48}}, +/* 3265 */ {(16<<2)|3,{49,103,49}}, +/* 3266 */ {(16<<2)|3,{49,103,50}}, +/* 3267 */ {(16<<2)|3,{49,103,97}}, +/* 3268 */ {(16<<2)|3,{49,103,99}}, +/* 3269 */ {(16<<2)|3,{49,103,101}}, +/* 3270 */ {(16<<2)|3,{49,103,105}}, +/* 3271 */ {(16<<2)|3,{49,103,111}}, +/* 3272 */ {(16<<2)|3,{49,103,115}}, +/* 3273 */ {(16<<2)|3,{49,103,116}}, +/* 3274 */ {(11<<2)|2,{49,103,0}}, +/* 3275 */ {(11<<2)|2,{49,103,0}}, +/* 3276 */ {(11<<2)|2,{49,103,0}}, +/* 3277 */ {(11<<2)|2,{49,103,0}}, +/* 3278 */ {(11<<2)|2,{49,103,0}}, +/* 3279 */ {(11<<2)|2,{49,103,0}}, +/* 3280 */ {(11<<2)|2,{49,103,0}}, +/* 3281 */ {(11<<2)|2,{49,103,0}}, +/* 3282 */ {(11<<2)|2,{49,103,0}}, +/* 3283 */ {(11<<2)|2,{49,103,0}}, +/* 3284 */ {(11<<2)|2,{49,103,0}}, +/* 3285 */ {(11<<2)|2,{49,103,0}}, +/* 3286 */ {(11<<2)|2,{49,103,0}}, +/* 3287 */ {(11<<2)|2,{49,103,0}}, +/* 3288 */ {(11<<2)|2,{49,103,0}}, +/* 3289 */ {(11<<2)|2,{49,103,0}}, +/* 3290 */ {(11<<2)|2,{49,103,0}}, +/* 3291 */ {(11<<2)|2,{49,103,0}}, +/* 3292 */ {(11<<2)|2,{49,103,0}}, +/* 3293 */ {(11<<2)|2,{49,103,0}}, +/* 3294 */ {(11<<2)|2,{49,103,0}}, +/* 3295 */ {(11<<2)|2,{49,103,0}}, +/* 3296 */ {(16<<2)|3,{49,104,48}}, +/* 3297 */ {(16<<2)|3,{49,104,49}}, +/* 3298 */ {(16<<2)|3,{49,104,50}}, +/* 3299 */ {(16<<2)|3,{49,104,97}}, +/* 3300 */ {(16<<2)|3,{49,104,99}}, +/* 3301 */ {(16<<2)|3,{49,104,101}}, +/* 3302 */ {(16<<2)|3,{49,104,105}}, +/* 3303 */ {(16<<2)|3,{49,104,111}}, +/* 3304 */ {(16<<2)|3,{49,104,115}}, +/* 3305 */ {(16<<2)|3,{49,104,116}}, +/* 3306 */ {(11<<2)|2,{49,104,0}}, +/* 3307 */ {(11<<2)|2,{49,104,0}}, +/* 3308 */ {(11<<2)|2,{49,104,0}}, +/* 3309 */ {(11<<2)|2,{49,104,0}}, +/* 3310 */ {(11<<2)|2,{49,104,0}}, +/* 3311 */ {(11<<2)|2,{49,104,0}}, +/* 3312 */ {(11<<2)|2,{49,104,0}}, +/* 3313 */ {(11<<2)|2,{49,104,0}}, +/* 3314 */ {(11<<2)|2,{49,104,0}}, +/* 3315 */ {(11<<2)|2,{49,104,0}}, +/* 3316 */ {(11<<2)|2,{49,104,0}}, +/* 3317 */ {(11<<2)|2,{49,104,0}}, +/* 3318 */ {(11<<2)|2,{49,104,0}}, +/* 3319 */ {(11<<2)|2,{49,104,0}}, +/* 3320 */ {(11<<2)|2,{49,104,0}}, +/* 3321 */ {(11<<2)|2,{49,104,0}}, +/* 3322 */ {(11<<2)|2,{49,104,0}}, +/* 3323 */ {(11<<2)|2,{49,104,0}}, +/* 3324 */ {(11<<2)|2,{49,104,0}}, +/* 3325 */ {(11<<2)|2,{49,104,0}}, +/* 3326 */ {(11<<2)|2,{49,104,0}}, +/* 3327 */ {(11<<2)|2,{49,104,0}}, +/* 3328 */ {(16<<2)|3,{49,108,48}}, +/* 3329 */ {(16<<2)|3,{49,108,49}}, +/* 3330 */ {(16<<2)|3,{49,108,50}}, +/* 3331 */ {(16<<2)|3,{49,108,97}}, +/* 3332 */ {(16<<2)|3,{49,108,99}}, +/* 3333 */ {(16<<2)|3,{49,108,101}}, +/* 3334 */ {(16<<2)|3,{49,108,105}}, +/* 3335 */ {(16<<2)|3,{49,108,111}}, +/* 3336 */ {(16<<2)|3,{49,108,115}}, +/* 3337 */ {(16<<2)|3,{49,108,116}}, +/* 3338 */ {(11<<2)|2,{49,108,0}}, +/* 3339 */ {(11<<2)|2,{49,108,0}}, +/* 3340 */ {(11<<2)|2,{49,108,0}}, +/* 3341 */ {(11<<2)|2,{49,108,0}}, +/* 3342 */ {(11<<2)|2,{49,108,0}}, +/* 3343 */ {(11<<2)|2,{49,108,0}}, +/* 3344 */ {(11<<2)|2,{49,108,0}}, +/* 3345 */ {(11<<2)|2,{49,108,0}}, +/* 3346 */ {(11<<2)|2,{49,108,0}}, +/* 3347 */ {(11<<2)|2,{49,108,0}}, +/* 3348 */ {(11<<2)|2,{49,108,0}}, +/* 3349 */ {(11<<2)|2,{49,108,0}}, +/* 3350 */ {(11<<2)|2,{49,108,0}}, +/* 3351 */ {(11<<2)|2,{49,108,0}}, +/* 3352 */ {(11<<2)|2,{49,108,0}}, +/* 3353 */ {(11<<2)|2,{49,108,0}}, +/* 3354 */ {(11<<2)|2,{49,108,0}}, +/* 3355 */ {(11<<2)|2,{49,108,0}}, +/* 3356 */ {(11<<2)|2,{49,108,0}}, +/* 3357 */ {(11<<2)|2,{49,108,0}}, +/* 3358 */ {(11<<2)|2,{49,108,0}}, +/* 3359 */ {(11<<2)|2,{49,108,0}}, +/* 3360 */ {(16<<2)|3,{49,109,48}}, +/* 3361 */ {(16<<2)|3,{49,109,49}}, +/* 3362 */ {(16<<2)|3,{49,109,50}}, +/* 3363 */ {(16<<2)|3,{49,109,97}}, +/* 3364 */ {(16<<2)|3,{49,109,99}}, +/* 3365 */ {(16<<2)|3,{49,109,101}}, +/* 3366 */ {(16<<2)|3,{49,109,105}}, +/* 3367 */ {(16<<2)|3,{49,109,111}}, +/* 3368 */ {(16<<2)|3,{49,109,115}}, +/* 3369 */ {(16<<2)|3,{49,109,116}}, +/* 3370 */ {(11<<2)|2,{49,109,0}}, +/* 3371 */ {(11<<2)|2,{49,109,0}}, +/* 3372 */ {(11<<2)|2,{49,109,0}}, +/* 3373 */ {(11<<2)|2,{49,109,0}}, +/* 3374 */ {(11<<2)|2,{49,109,0}}, +/* 3375 */ {(11<<2)|2,{49,109,0}}, +/* 3376 */ {(11<<2)|2,{49,109,0}}, +/* 3377 */ {(11<<2)|2,{49,109,0}}, +/* 3378 */ {(11<<2)|2,{49,109,0}}, +/* 3379 */ {(11<<2)|2,{49,109,0}}, +/* 3380 */ {(11<<2)|2,{49,109,0}}, +/* 3381 */ {(11<<2)|2,{49,109,0}}, +/* 3382 */ {(11<<2)|2,{49,109,0}}, +/* 3383 */ {(11<<2)|2,{49,109,0}}, +/* 3384 */ {(11<<2)|2,{49,109,0}}, +/* 3385 */ {(11<<2)|2,{49,109,0}}, +/* 3386 */ {(11<<2)|2,{49,109,0}}, +/* 3387 */ {(11<<2)|2,{49,109,0}}, +/* 3388 */ {(11<<2)|2,{49,109,0}}, +/* 3389 */ {(11<<2)|2,{49,109,0}}, +/* 3390 */ {(11<<2)|2,{49,109,0}}, +/* 3391 */ {(11<<2)|2,{49,109,0}}, +/* 3392 */ {(16<<2)|3,{49,110,48}}, +/* 3393 */ {(16<<2)|3,{49,110,49}}, +/* 3394 */ {(16<<2)|3,{49,110,50}}, +/* 3395 */ {(16<<2)|3,{49,110,97}}, +/* 3396 */ {(16<<2)|3,{49,110,99}}, +/* 3397 */ {(16<<2)|3,{49,110,101}}, +/* 3398 */ {(16<<2)|3,{49,110,105}}, +/* 3399 */ {(16<<2)|3,{49,110,111}}, +/* 3400 */ {(16<<2)|3,{49,110,115}}, +/* 3401 */ {(16<<2)|3,{49,110,116}}, +/* 3402 */ {(11<<2)|2,{49,110,0}}, +/* 3403 */ {(11<<2)|2,{49,110,0}}, +/* 3404 */ {(11<<2)|2,{49,110,0}}, +/* 3405 */ {(11<<2)|2,{49,110,0}}, +/* 3406 */ {(11<<2)|2,{49,110,0}}, +/* 3407 */ {(11<<2)|2,{49,110,0}}, +/* 3408 */ {(11<<2)|2,{49,110,0}}, +/* 3409 */ {(11<<2)|2,{49,110,0}}, +/* 3410 */ {(11<<2)|2,{49,110,0}}, +/* 3411 */ {(11<<2)|2,{49,110,0}}, +/* 3412 */ {(11<<2)|2,{49,110,0}}, +/* 3413 */ {(11<<2)|2,{49,110,0}}, +/* 3414 */ {(11<<2)|2,{49,110,0}}, +/* 3415 */ {(11<<2)|2,{49,110,0}}, +/* 3416 */ {(11<<2)|2,{49,110,0}}, +/* 3417 */ {(11<<2)|2,{49,110,0}}, +/* 3418 */ {(11<<2)|2,{49,110,0}}, +/* 3419 */ {(11<<2)|2,{49,110,0}}, +/* 3420 */ {(11<<2)|2,{49,110,0}}, +/* 3421 */ {(11<<2)|2,{49,110,0}}, +/* 3422 */ {(11<<2)|2,{49,110,0}}, +/* 3423 */ {(11<<2)|2,{49,110,0}}, +/* 3424 */ {(16<<2)|3,{49,112,48}}, +/* 3425 */ {(16<<2)|3,{49,112,49}}, +/* 3426 */ {(16<<2)|3,{49,112,50}}, +/* 3427 */ {(16<<2)|3,{49,112,97}}, +/* 3428 */ {(16<<2)|3,{49,112,99}}, +/* 3429 */ {(16<<2)|3,{49,112,101}}, +/* 3430 */ {(16<<2)|3,{49,112,105}}, +/* 3431 */ {(16<<2)|3,{49,112,111}}, +/* 3432 */ {(16<<2)|3,{49,112,115}}, +/* 3433 */ {(16<<2)|3,{49,112,116}}, +/* 3434 */ {(11<<2)|2,{49,112,0}}, +/* 3435 */ {(11<<2)|2,{49,112,0}}, +/* 3436 */ {(11<<2)|2,{49,112,0}}, +/* 3437 */ {(11<<2)|2,{49,112,0}}, +/* 3438 */ {(11<<2)|2,{49,112,0}}, +/* 3439 */ {(11<<2)|2,{49,112,0}}, +/* 3440 */ {(11<<2)|2,{49,112,0}}, +/* 3441 */ {(11<<2)|2,{49,112,0}}, +/* 3442 */ {(11<<2)|2,{49,112,0}}, +/* 3443 */ {(11<<2)|2,{49,112,0}}, +/* 3444 */ {(11<<2)|2,{49,112,0}}, +/* 3445 */ {(11<<2)|2,{49,112,0}}, +/* 3446 */ {(11<<2)|2,{49,112,0}}, +/* 3447 */ {(11<<2)|2,{49,112,0}}, +/* 3448 */ {(11<<2)|2,{49,112,0}}, +/* 3449 */ {(11<<2)|2,{49,112,0}}, +/* 3450 */ {(11<<2)|2,{49,112,0}}, +/* 3451 */ {(11<<2)|2,{49,112,0}}, +/* 3452 */ {(11<<2)|2,{49,112,0}}, +/* 3453 */ {(11<<2)|2,{49,112,0}}, +/* 3454 */ {(11<<2)|2,{49,112,0}}, +/* 3455 */ {(11<<2)|2,{49,112,0}}, +/* 3456 */ {(16<<2)|3,{49,114,48}}, +/* 3457 */ {(16<<2)|3,{49,114,49}}, +/* 3458 */ {(16<<2)|3,{49,114,50}}, +/* 3459 */ {(16<<2)|3,{49,114,97}}, +/* 3460 */ {(16<<2)|3,{49,114,99}}, +/* 3461 */ {(16<<2)|3,{49,114,101}}, +/* 3462 */ {(16<<2)|3,{49,114,105}}, +/* 3463 */ {(16<<2)|3,{49,114,111}}, +/* 3464 */ {(16<<2)|3,{49,114,115}}, +/* 3465 */ {(16<<2)|3,{49,114,116}}, +/* 3466 */ {(11<<2)|2,{49,114,0}}, +/* 3467 */ {(11<<2)|2,{49,114,0}}, +/* 3468 */ {(11<<2)|2,{49,114,0}}, +/* 3469 */ {(11<<2)|2,{49,114,0}}, +/* 3470 */ {(11<<2)|2,{49,114,0}}, +/* 3471 */ {(11<<2)|2,{49,114,0}}, +/* 3472 */ {(11<<2)|2,{49,114,0}}, +/* 3473 */ {(11<<2)|2,{49,114,0}}, +/* 3474 */ {(11<<2)|2,{49,114,0}}, +/* 3475 */ {(11<<2)|2,{49,114,0}}, +/* 3476 */ {(11<<2)|2,{49,114,0}}, +/* 3477 */ {(11<<2)|2,{49,114,0}}, +/* 3478 */ {(11<<2)|2,{49,114,0}}, +/* 3479 */ {(11<<2)|2,{49,114,0}}, +/* 3480 */ {(11<<2)|2,{49,114,0}}, +/* 3481 */ {(11<<2)|2,{49,114,0}}, +/* 3482 */ {(11<<2)|2,{49,114,0}}, +/* 3483 */ {(11<<2)|2,{49,114,0}}, +/* 3484 */ {(11<<2)|2,{49,114,0}}, +/* 3485 */ {(11<<2)|2,{49,114,0}}, +/* 3486 */ {(11<<2)|2,{49,114,0}}, +/* 3487 */ {(11<<2)|2,{49,114,0}}, +/* 3488 */ {(16<<2)|3,{49,117,48}}, +/* 3489 */ {(16<<2)|3,{49,117,49}}, +/* 3490 */ {(16<<2)|3,{49,117,50}}, +/* 3491 */ {(16<<2)|3,{49,117,97}}, +/* 3492 */ {(16<<2)|3,{49,117,99}}, +/* 3493 */ {(16<<2)|3,{49,117,101}}, +/* 3494 */ {(16<<2)|3,{49,117,105}}, +/* 3495 */ {(16<<2)|3,{49,117,111}}, +/* 3496 */ {(16<<2)|3,{49,117,115}}, +/* 3497 */ {(16<<2)|3,{49,117,116}}, +/* 3498 */ {(11<<2)|2,{49,117,0}}, +/* 3499 */ {(11<<2)|2,{49,117,0}}, +/* 3500 */ {(11<<2)|2,{49,117,0}}, +/* 3501 */ {(11<<2)|2,{49,117,0}}, +/* 3502 */ {(11<<2)|2,{49,117,0}}, +/* 3503 */ {(11<<2)|2,{49,117,0}}, +/* 3504 */ {(11<<2)|2,{49,117,0}}, +/* 3505 */ {(11<<2)|2,{49,117,0}}, +/* 3506 */ {(11<<2)|2,{49,117,0}}, +/* 3507 */ {(11<<2)|2,{49,117,0}}, +/* 3508 */ {(11<<2)|2,{49,117,0}}, +/* 3509 */ {(11<<2)|2,{49,117,0}}, +/* 3510 */ {(11<<2)|2,{49,117,0}}, +/* 3511 */ {(11<<2)|2,{49,117,0}}, +/* 3512 */ {(11<<2)|2,{49,117,0}}, +/* 3513 */ {(11<<2)|2,{49,117,0}}, +/* 3514 */ {(11<<2)|2,{49,117,0}}, +/* 3515 */ {(11<<2)|2,{49,117,0}}, +/* 3516 */ {(11<<2)|2,{49,117,0}}, +/* 3517 */ {(11<<2)|2,{49,117,0}}, +/* 3518 */ {(11<<2)|2,{49,117,0}}, +/* 3519 */ {(11<<2)|2,{49,117,0}}, +/* 3520 */ {(12<<2)|2,{49,58,0}}, +/* 3521 */ {(12<<2)|2,{49,58,0}}, +/* 3522 */ {(12<<2)|2,{49,58,0}}, +/* 3523 */ {(12<<2)|2,{49,58,0}}, +/* 3524 */ {(12<<2)|2,{49,58,0}}, +/* 3525 */ {(12<<2)|2,{49,58,0}}, +/* 3526 */ {(12<<2)|2,{49,58,0}}, +/* 3527 */ {(12<<2)|2,{49,58,0}}, +/* 3528 */ {(12<<2)|2,{49,58,0}}, +/* 3529 */ {(12<<2)|2,{49,58,0}}, +/* 3530 */ {(12<<2)|2,{49,58,0}}, +/* 3531 */ {(12<<2)|2,{49,58,0}}, +/* 3532 */ {(12<<2)|2,{49,58,0}}, +/* 3533 */ {(12<<2)|2,{49,58,0}}, +/* 3534 */ {(12<<2)|2,{49,58,0}}, +/* 3535 */ {(12<<2)|2,{49,58,0}}, +/* 3536 */ {(12<<2)|2,{49,66,0}}, +/* 3537 */ {(12<<2)|2,{49,66,0}}, +/* 3538 */ {(12<<2)|2,{49,66,0}}, +/* 3539 */ {(12<<2)|2,{49,66,0}}, +/* 3540 */ {(12<<2)|2,{49,66,0}}, +/* 3541 */ {(12<<2)|2,{49,66,0}}, +/* 3542 */ {(12<<2)|2,{49,66,0}}, +/* 3543 */ {(12<<2)|2,{49,66,0}}, +/* 3544 */ {(12<<2)|2,{49,66,0}}, +/* 3545 */ {(12<<2)|2,{49,66,0}}, +/* 3546 */ {(12<<2)|2,{49,66,0}}, +/* 3547 */ {(12<<2)|2,{49,66,0}}, +/* 3548 */ {(12<<2)|2,{49,66,0}}, +/* 3549 */ {(12<<2)|2,{49,66,0}}, +/* 3550 */ {(12<<2)|2,{49,66,0}}, +/* 3551 */ {(12<<2)|2,{49,66,0}}, +/* 3552 */ {(12<<2)|2,{49,67,0}}, +/* 3553 */ {(12<<2)|2,{49,67,0}}, +/* 3554 */ {(12<<2)|2,{49,67,0}}, +/* 3555 */ {(12<<2)|2,{49,67,0}}, +/* 3556 */ {(12<<2)|2,{49,67,0}}, +/* 3557 */ {(12<<2)|2,{49,67,0}}, +/* 3558 */ {(12<<2)|2,{49,67,0}}, +/* 3559 */ {(12<<2)|2,{49,67,0}}, +/* 3560 */ {(12<<2)|2,{49,67,0}}, +/* 3561 */ {(12<<2)|2,{49,67,0}}, +/* 3562 */ {(12<<2)|2,{49,67,0}}, +/* 3563 */ {(12<<2)|2,{49,67,0}}, +/* 3564 */ {(12<<2)|2,{49,67,0}}, +/* 3565 */ {(12<<2)|2,{49,67,0}}, +/* 3566 */ {(12<<2)|2,{49,67,0}}, +/* 3567 */ {(12<<2)|2,{49,67,0}}, +/* 3568 */ {(12<<2)|2,{49,68,0}}, +/* 3569 */ {(12<<2)|2,{49,68,0}}, +/* 3570 */ {(12<<2)|2,{49,68,0}}, +/* 3571 */ {(12<<2)|2,{49,68,0}}, +/* 3572 */ {(12<<2)|2,{49,68,0}}, +/* 3573 */ {(12<<2)|2,{49,68,0}}, +/* 3574 */ {(12<<2)|2,{49,68,0}}, +/* 3575 */ {(12<<2)|2,{49,68,0}}, +/* 3576 */ {(12<<2)|2,{49,68,0}}, +/* 3577 */ {(12<<2)|2,{49,68,0}}, +/* 3578 */ {(12<<2)|2,{49,68,0}}, +/* 3579 */ {(12<<2)|2,{49,68,0}}, +/* 3580 */ {(12<<2)|2,{49,68,0}}, +/* 3581 */ {(12<<2)|2,{49,68,0}}, +/* 3582 */ {(12<<2)|2,{49,68,0}}, +/* 3583 */ {(12<<2)|2,{49,68,0}}, +/* 3584 */ {(12<<2)|2,{49,69,0}}, +/* 3585 */ {(12<<2)|2,{49,69,0}}, +/* 3586 */ {(12<<2)|2,{49,69,0}}, +/* 3587 */ {(12<<2)|2,{49,69,0}}, +/* 3588 */ {(12<<2)|2,{49,69,0}}, +/* 3589 */ {(12<<2)|2,{49,69,0}}, +/* 3590 */ {(12<<2)|2,{49,69,0}}, +/* 3591 */ {(12<<2)|2,{49,69,0}}, +/* 3592 */ {(12<<2)|2,{49,69,0}}, +/* 3593 */ {(12<<2)|2,{49,69,0}}, +/* 3594 */ {(12<<2)|2,{49,69,0}}, +/* 3595 */ {(12<<2)|2,{49,69,0}}, +/* 3596 */ {(12<<2)|2,{49,69,0}}, +/* 3597 */ {(12<<2)|2,{49,69,0}}, +/* 3598 */ {(12<<2)|2,{49,69,0}}, +/* 3599 */ {(12<<2)|2,{49,69,0}}, +/* 3600 */ {(12<<2)|2,{49,70,0}}, +/* 3601 */ {(12<<2)|2,{49,70,0}}, +/* 3602 */ {(12<<2)|2,{49,70,0}}, +/* 3603 */ {(12<<2)|2,{49,70,0}}, +/* 3604 */ {(12<<2)|2,{49,70,0}}, +/* 3605 */ {(12<<2)|2,{49,70,0}}, +/* 3606 */ {(12<<2)|2,{49,70,0}}, +/* 3607 */ {(12<<2)|2,{49,70,0}}, +/* 3608 */ {(12<<2)|2,{49,70,0}}, +/* 3609 */ {(12<<2)|2,{49,70,0}}, +/* 3610 */ {(12<<2)|2,{49,70,0}}, +/* 3611 */ {(12<<2)|2,{49,70,0}}, +/* 3612 */ {(12<<2)|2,{49,70,0}}, +/* 3613 */ {(12<<2)|2,{49,70,0}}, +/* 3614 */ {(12<<2)|2,{49,70,0}}, +/* 3615 */ {(12<<2)|2,{49,70,0}}, +/* 3616 */ {(12<<2)|2,{49,71,0}}, +/* 3617 */ {(12<<2)|2,{49,71,0}}, +/* 3618 */ {(12<<2)|2,{49,71,0}}, +/* 3619 */ {(12<<2)|2,{49,71,0}}, +/* 3620 */ {(12<<2)|2,{49,71,0}}, +/* 3621 */ {(12<<2)|2,{49,71,0}}, +/* 3622 */ {(12<<2)|2,{49,71,0}}, +/* 3623 */ {(12<<2)|2,{49,71,0}}, +/* 3624 */ {(12<<2)|2,{49,71,0}}, +/* 3625 */ {(12<<2)|2,{49,71,0}}, +/* 3626 */ {(12<<2)|2,{49,71,0}}, +/* 3627 */ {(12<<2)|2,{49,71,0}}, +/* 3628 */ {(12<<2)|2,{49,71,0}}, +/* 3629 */ {(12<<2)|2,{49,71,0}}, +/* 3630 */ {(12<<2)|2,{49,71,0}}, +/* 3631 */ {(12<<2)|2,{49,71,0}}, +/* 3632 */ {(12<<2)|2,{49,72,0}}, +/* 3633 */ {(12<<2)|2,{49,72,0}}, +/* 3634 */ {(12<<2)|2,{49,72,0}}, +/* 3635 */ {(12<<2)|2,{49,72,0}}, +/* 3636 */ {(12<<2)|2,{49,72,0}}, +/* 3637 */ {(12<<2)|2,{49,72,0}}, +/* 3638 */ {(12<<2)|2,{49,72,0}}, +/* 3639 */ {(12<<2)|2,{49,72,0}}, +/* 3640 */ {(12<<2)|2,{49,72,0}}, +/* 3641 */ {(12<<2)|2,{49,72,0}}, +/* 3642 */ {(12<<2)|2,{49,72,0}}, +/* 3643 */ {(12<<2)|2,{49,72,0}}, +/* 3644 */ {(12<<2)|2,{49,72,0}}, +/* 3645 */ {(12<<2)|2,{49,72,0}}, +/* 3646 */ {(12<<2)|2,{49,72,0}}, +/* 3647 */ {(12<<2)|2,{49,72,0}}, +/* 3648 */ {(12<<2)|2,{49,73,0}}, +/* 3649 */ {(12<<2)|2,{49,73,0}}, +/* 3650 */ {(12<<2)|2,{49,73,0}}, +/* 3651 */ {(12<<2)|2,{49,73,0}}, +/* 3652 */ {(12<<2)|2,{49,73,0}}, +/* 3653 */ {(12<<2)|2,{49,73,0}}, +/* 3654 */ {(12<<2)|2,{49,73,0}}, +/* 3655 */ {(12<<2)|2,{49,73,0}}, +/* 3656 */ {(12<<2)|2,{49,73,0}}, +/* 3657 */ {(12<<2)|2,{49,73,0}}, +/* 3658 */ {(12<<2)|2,{49,73,0}}, +/* 3659 */ {(12<<2)|2,{49,73,0}}, +/* 3660 */ {(12<<2)|2,{49,73,0}}, +/* 3661 */ {(12<<2)|2,{49,73,0}}, +/* 3662 */ {(12<<2)|2,{49,73,0}}, +/* 3663 */ {(12<<2)|2,{49,73,0}}, +/* 3664 */ {(12<<2)|2,{49,74,0}}, +/* 3665 */ {(12<<2)|2,{49,74,0}}, +/* 3666 */ {(12<<2)|2,{49,74,0}}, +/* 3667 */ {(12<<2)|2,{49,74,0}}, +/* 3668 */ {(12<<2)|2,{49,74,0}}, +/* 3669 */ {(12<<2)|2,{49,74,0}}, +/* 3670 */ {(12<<2)|2,{49,74,0}}, +/* 3671 */ {(12<<2)|2,{49,74,0}}, +/* 3672 */ {(12<<2)|2,{49,74,0}}, +/* 3673 */ {(12<<2)|2,{49,74,0}}, +/* 3674 */ {(12<<2)|2,{49,74,0}}, +/* 3675 */ {(12<<2)|2,{49,74,0}}, +/* 3676 */ {(12<<2)|2,{49,74,0}}, +/* 3677 */ {(12<<2)|2,{49,74,0}}, +/* 3678 */ {(12<<2)|2,{49,74,0}}, +/* 3679 */ {(12<<2)|2,{49,74,0}}, +/* 3680 */ {(12<<2)|2,{49,75,0}}, +/* 3681 */ {(12<<2)|2,{49,75,0}}, +/* 3682 */ {(12<<2)|2,{49,75,0}}, +/* 3683 */ {(12<<2)|2,{49,75,0}}, +/* 3684 */ {(12<<2)|2,{49,75,0}}, +/* 3685 */ {(12<<2)|2,{49,75,0}}, +/* 3686 */ {(12<<2)|2,{49,75,0}}, +/* 3687 */ {(12<<2)|2,{49,75,0}}, +/* 3688 */ {(12<<2)|2,{49,75,0}}, +/* 3689 */ {(12<<2)|2,{49,75,0}}, +/* 3690 */ {(12<<2)|2,{49,75,0}}, +/* 3691 */ {(12<<2)|2,{49,75,0}}, +/* 3692 */ {(12<<2)|2,{49,75,0}}, +/* 3693 */ {(12<<2)|2,{49,75,0}}, +/* 3694 */ {(12<<2)|2,{49,75,0}}, +/* 3695 */ {(12<<2)|2,{49,75,0}}, +/* 3696 */ {(12<<2)|2,{49,76,0}}, +/* 3697 */ {(12<<2)|2,{49,76,0}}, +/* 3698 */ {(12<<2)|2,{49,76,0}}, +/* 3699 */ {(12<<2)|2,{49,76,0}}, +/* 3700 */ {(12<<2)|2,{49,76,0}}, +/* 3701 */ {(12<<2)|2,{49,76,0}}, +/* 3702 */ {(12<<2)|2,{49,76,0}}, +/* 3703 */ {(12<<2)|2,{49,76,0}}, +/* 3704 */ {(12<<2)|2,{49,76,0}}, +/* 3705 */ {(12<<2)|2,{49,76,0}}, +/* 3706 */ {(12<<2)|2,{49,76,0}}, +/* 3707 */ {(12<<2)|2,{49,76,0}}, +/* 3708 */ {(12<<2)|2,{49,76,0}}, +/* 3709 */ {(12<<2)|2,{49,76,0}}, +/* 3710 */ {(12<<2)|2,{49,76,0}}, +/* 3711 */ {(12<<2)|2,{49,76,0}}, +/* 3712 */ {(12<<2)|2,{49,77,0}}, +/* 3713 */ {(12<<2)|2,{49,77,0}}, +/* 3714 */ {(12<<2)|2,{49,77,0}}, +/* 3715 */ {(12<<2)|2,{49,77,0}}, +/* 3716 */ {(12<<2)|2,{49,77,0}}, +/* 3717 */ {(12<<2)|2,{49,77,0}}, +/* 3718 */ {(12<<2)|2,{49,77,0}}, +/* 3719 */ {(12<<2)|2,{49,77,0}}, +/* 3720 */ {(12<<2)|2,{49,77,0}}, +/* 3721 */ {(12<<2)|2,{49,77,0}}, +/* 3722 */ {(12<<2)|2,{49,77,0}}, +/* 3723 */ {(12<<2)|2,{49,77,0}}, +/* 3724 */ {(12<<2)|2,{49,77,0}}, +/* 3725 */ {(12<<2)|2,{49,77,0}}, +/* 3726 */ {(12<<2)|2,{49,77,0}}, +/* 3727 */ {(12<<2)|2,{49,77,0}}, +/* 3728 */ {(12<<2)|2,{49,78,0}}, +/* 3729 */ {(12<<2)|2,{49,78,0}}, +/* 3730 */ {(12<<2)|2,{49,78,0}}, +/* 3731 */ {(12<<2)|2,{49,78,0}}, +/* 3732 */ {(12<<2)|2,{49,78,0}}, +/* 3733 */ {(12<<2)|2,{49,78,0}}, +/* 3734 */ {(12<<2)|2,{49,78,0}}, +/* 3735 */ {(12<<2)|2,{49,78,0}}, +/* 3736 */ {(12<<2)|2,{49,78,0}}, +/* 3737 */ {(12<<2)|2,{49,78,0}}, +/* 3738 */ {(12<<2)|2,{49,78,0}}, +/* 3739 */ {(12<<2)|2,{49,78,0}}, +/* 3740 */ {(12<<2)|2,{49,78,0}}, +/* 3741 */ {(12<<2)|2,{49,78,0}}, +/* 3742 */ {(12<<2)|2,{49,78,0}}, +/* 3743 */ {(12<<2)|2,{49,78,0}}, +/* 3744 */ {(12<<2)|2,{49,79,0}}, +/* 3745 */ {(12<<2)|2,{49,79,0}}, +/* 3746 */ {(12<<2)|2,{49,79,0}}, +/* 3747 */ {(12<<2)|2,{49,79,0}}, +/* 3748 */ {(12<<2)|2,{49,79,0}}, +/* 3749 */ {(12<<2)|2,{49,79,0}}, +/* 3750 */ {(12<<2)|2,{49,79,0}}, +/* 3751 */ {(12<<2)|2,{49,79,0}}, +/* 3752 */ {(12<<2)|2,{49,79,0}}, +/* 3753 */ {(12<<2)|2,{49,79,0}}, +/* 3754 */ {(12<<2)|2,{49,79,0}}, +/* 3755 */ {(12<<2)|2,{49,79,0}}, +/* 3756 */ {(12<<2)|2,{49,79,0}}, +/* 3757 */ {(12<<2)|2,{49,79,0}}, +/* 3758 */ {(12<<2)|2,{49,79,0}}, +/* 3759 */ {(12<<2)|2,{49,79,0}}, +/* 3760 */ {(12<<2)|2,{49,80,0}}, +/* 3761 */ {(12<<2)|2,{49,80,0}}, +/* 3762 */ {(12<<2)|2,{49,80,0}}, +/* 3763 */ {(12<<2)|2,{49,80,0}}, +/* 3764 */ {(12<<2)|2,{49,80,0}}, +/* 3765 */ {(12<<2)|2,{49,80,0}}, +/* 3766 */ {(12<<2)|2,{49,80,0}}, +/* 3767 */ {(12<<2)|2,{49,80,0}}, +/* 3768 */ {(12<<2)|2,{49,80,0}}, +/* 3769 */ {(12<<2)|2,{49,80,0}}, +/* 3770 */ {(12<<2)|2,{49,80,0}}, +/* 3771 */ {(12<<2)|2,{49,80,0}}, +/* 3772 */ {(12<<2)|2,{49,80,0}}, +/* 3773 */ {(12<<2)|2,{49,80,0}}, +/* 3774 */ {(12<<2)|2,{49,80,0}}, +/* 3775 */ {(12<<2)|2,{49,80,0}}, +/* 3776 */ {(12<<2)|2,{49,81,0}}, +/* 3777 */ {(12<<2)|2,{49,81,0}}, +/* 3778 */ {(12<<2)|2,{49,81,0}}, +/* 3779 */ {(12<<2)|2,{49,81,0}}, +/* 3780 */ {(12<<2)|2,{49,81,0}}, +/* 3781 */ {(12<<2)|2,{49,81,0}}, +/* 3782 */ {(12<<2)|2,{49,81,0}}, +/* 3783 */ {(12<<2)|2,{49,81,0}}, +/* 3784 */ {(12<<2)|2,{49,81,0}}, +/* 3785 */ {(12<<2)|2,{49,81,0}}, +/* 3786 */ {(12<<2)|2,{49,81,0}}, +/* 3787 */ {(12<<2)|2,{49,81,0}}, +/* 3788 */ {(12<<2)|2,{49,81,0}}, +/* 3789 */ {(12<<2)|2,{49,81,0}}, +/* 3790 */ {(12<<2)|2,{49,81,0}}, +/* 3791 */ {(12<<2)|2,{49,81,0}}, +/* 3792 */ {(12<<2)|2,{49,82,0}}, +/* 3793 */ {(12<<2)|2,{49,82,0}}, +/* 3794 */ {(12<<2)|2,{49,82,0}}, +/* 3795 */ {(12<<2)|2,{49,82,0}}, +/* 3796 */ {(12<<2)|2,{49,82,0}}, +/* 3797 */ {(12<<2)|2,{49,82,0}}, +/* 3798 */ {(12<<2)|2,{49,82,0}}, +/* 3799 */ {(12<<2)|2,{49,82,0}}, +/* 3800 */ {(12<<2)|2,{49,82,0}}, +/* 3801 */ {(12<<2)|2,{49,82,0}}, +/* 3802 */ {(12<<2)|2,{49,82,0}}, +/* 3803 */ {(12<<2)|2,{49,82,0}}, +/* 3804 */ {(12<<2)|2,{49,82,0}}, +/* 3805 */ {(12<<2)|2,{49,82,0}}, +/* 3806 */ {(12<<2)|2,{49,82,0}}, +/* 3807 */ {(12<<2)|2,{49,82,0}}, +/* 3808 */ {(12<<2)|2,{49,83,0}}, +/* 3809 */ {(12<<2)|2,{49,83,0}}, +/* 3810 */ {(12<<2)|2,{49,83,0}}, +/* 3811 */ {(12<<2)|2,{49,83,0}}, +/* 3812 */ {(12<<2)|2,{49,83,0}}, +/* 3813 */ {(12<<2)|2,{49,83,0}}, +/* 3814 */ {(12<<2)|2,{49,83,0}}, +/* 3815 */ {(12<<2)|2,{49,83,0}}, +/* 3816 */ {(12<<2)|2,{49,83,0}}, +/* 3817 */ {(12<<2)|2,{49,83,0}}, +/* 3818 */ {(12<<2)|2,{49,83,0}}, +/* 3819 */ {(12<<2)|2,{49,83,0}}, +/* 3820 */ {(12<<2)|2,{49,83,0}}, +/* 3821 */ {(12<<2)|2,{49,83,0}}, +/* 3822 */ {(12<<2)|2,{49,83,0}}, +/* 3823 */ {(12<<2)|2,{49,83,0}}, +/* 3824 */ {(12<<2)|2,{49,84,0}}, +/* 3825 */ {(12<<2)|2,{49,84,0}}, +/* 3826 */ {(12<<2)|2,{49,84,0}}, +/* 3827 */ {(12<<2)|2,{49,84,0}}, +/* 3828 */ {(12<<2)|2,{49,84,0}}, +/* 3829 */ {(12<<2)|2,{49,84,0}}, +/* 3830 */ {(12<<2)|2,{49,84,0}}, +/* 3831 */ {(12<<2)|2,{49,84,0}}, +/* 3832 */ {(12<<2)|2,{49,84,0}}, +/* 3833 */ {(12<<2)|2,{49,84,0}}, +/* 3834 */ {(12<<2)|2,{49,84,0}}, +/* 3835 */ {(12<<2)|2,{49,84,0}}, +/* 3836 */ {(12<<2)|2,{49,84,0}}, +/* 3837 */ {(12<<2)|2,{49,84,0}}, +/* 3838 */ {(12<<2)|2,{49,84,0}}, +/* 3839 */ {(12<<2)|2,{49,84,0}}, +/* 3840 */ {(12<<2)|2,{49,85,0}}, +/* 3841 */ {(12<<2)|2,{49,85,0}}, +/* 3842 */ {(12<<2)|2,{49,85,0}}, +/* 3843 */ {(12<<2)|2,{49,85,0}}, +/* 3844 */ {(12<<2)|2,{49,85,0}}, +/* 3845 */ {(12<<2)|2,{49,85,0}}, +/* 3846 */ {(12<<2)|2,{49,85,0}}, +/* 3847 */ {(12<<2)|2,{49,85,0}}, +/* 3848 */ {(12<<2)|2,{49,85,0}}, +/* 3849 */ {(12<<2)|2,{49,85,0}}, +/* 3850 */ {(12<<2)|2,{49,85,0}}, +/* 3851 */ {(12<<2)|2,{49,85,0}}, +/* 3852 */ {(12<<2)|2,{49,85,0}}, +/* 3853 */ {(12<<2)|2,{49,85,0}}, +/* 3854 */ {(12<<2)|2,{49,85,0}}, +/* 3855 */ {(12<<2)|2,{49,85,0}}, +/* 3856 */ {(12<<2)|2,{49,86,0}}, +/* 3857 */ {(12<<2)|2,{49,86,0}}, +/* 3858 */ {(12<<2)|2,{49,86,0}}, +/* 3859 */ {(12<<2)|2,{49,86,0}}, +/* 3860 */ {(12<<2)|2,{49,86,0}}, +/* 3861 */ {(12<<2)|2,{49,86,0}}, +/* 3862 */ {(12<<2)|2,{49,86,0}}, +/* 3863 */ {(12<<2)|2,{49,86,0}}, +/* 3864 */ {(12<<2)|2,{49,86,0}}, +/* 3865 */ {(12<<2)|2,{49,86,0}}, +/* 3866 */ {(12<<2)|2,{49,86,0}}, +/* 3867 */ {(12<<2)|2,{49,86,0}}, +/* 3868 */ {(12<<2)|2,{49,86,0}}, +/* 3869 */ {(12<<2)|2,{49,86,0}}, +/* 3870 */ {(12<<2)|2,{49,86,0}}, +/* 3871 */ {(12<<2)|2,{49,86,0}}, +/* 3872 */ {(12<<2)|2,{49,87,0}}, +/* 3873 */ {(12<<2)|2,{49,87,0}}, +/* 3874 */ {(12<<2)|2,{49,87,0}}, +/* 3875 */ {(12<<2)|2,{49,87,0}}, +/* 3876 */ {(12<<2)|2,{49,87,0}}, +/* 3877 */ {(12<<2)|2,{49,87,0}}, +/* 3878 */ {(12<<2)|2,{49,87,0}}, +/* 3879 */ {(12<<2)|2,{49,87,0}}, +/* 3880 */ {(12<<2)|2,{49,87,0}}, +/* 3881 */ {(12<<2)|2,{49,87,0}}, +/* 3882 */ {(12<<2)|2,{49,87,0}}, +/* 3883 */ {(12<<2)|2,{49,87,0}}, +/* 3884 */ {(12<<2)|2,{49,87,0}}, +/* 3885 */ {(12<<2)|2,{49,87,0}}, +/* 3886 */ {(12<<2)|2,{49,87,0}}, +/* 3887 */ {(12<<2)|2,{49,87,0}}, +/* 3888 */ {(12<<2)|2,{49,89,0}}, +/* 3889 */ {(12<<2)|2,{49,89,0}}, +/* 3890 */ {(12<<2)|2,{49,89,0}}, +/* 3891 */ {(12<<2)|2,{49,89,0}}, +/* 3892 */ {(12<<2)|2,{49,89,0}}, +/* 3893 */ {(12<<2)|2,{49,89,0}}, +/* 3894 */ {(12<<2)|2,{49,89,0}}, +/* 3895 */ {(12<<2)|2,{49,89,0}}, +/* 3896 */ {(12<<2)|2,{49,89,0}}, +/* 3897 */ {(12<<2)|2,{49,89,0}}, +/* 3898 */ {(12<<2)|2,{49,89,0}}, +/* 3899 */ {(12<<2)|2,{49,89,0}}, +/* 3900 */ {(12<<2)|2,{49,89,0}}, +/* 3901 */ {(12<<2)|2,{49,89,0}}, +/* 3902 */ {(12<<2)|2,{49,89,0}}, +/* 3903 */ {(12<<2)|2,{49,89,0}}, +/* 3904 */ {(12<<2)|2,{49,106,0}}, +/* 3905 */ {(12<<2)|2,{49,106,0}}, +/* 3906 */ {(12<<2)|2,{49,106,0}}, +/* 3907 */ {(12<<2)|2,{49,106,0}}, +/* 3908 */ {(12<<2)|2,{49,106,0}}, +/* 3909 */ {(12<<2)|2,{49,106,0}}, +/* 3910 */ {(12<<2)|2,{49,106,0}}, +/* 3911 */ {(12<<2)|2,{49,106,0}}, +/* 3912 */ {(12<<2)|2,{49,106,0}}, +/* 3913 */ {(12<<2)|2,{49,106,0}}, +/* 3914 */ {(12<<2)|2,{49,106,0}}, +/* 3915 */ {(12<<2)|2,{49,106,0}}, +/* 3916 */ {(12<<2)|2,{49,106,0}}, +/* 3917 */ {(12<<2)|2,{49,106,0}}, +/* 3918 */ {(12<<2)|2,{49,106,0}}, +/* 3919 */ {(12<<2)|2,{49,106,0}}, +/* 3920 */ {(12<<2)|2,{49,107,0}}, +/* 3921 */ {(12<<2)|2,{49,107,0}}, +/* 3922 */ {(12<<2)|2,{49,107,0}}, +/* 3923 */ {(12<<2)|2,{49,107,0}}, +/* 3924 */ {(12<<2)|2,{49,107,0}}, +/* 3925 */ {(12<<2)|2,{49,107,0}}, +/* 3926 */ {(12<<2)|2,{49,107,0}}, +/* 3927 */ {(12<<2)|2,{49,107,0}}, +/* 3928 */ {(12<<2)|2,{49,107,0}}, +/* 3929 */ {(12<<2)|2,{49,107,0}}, +/* 3930 */ {(12<<2)|2,{49,107,0}}, +/* 3931 */ {(12<<2)|2,{49,107,0}}, +/* 3932 */ {(12<<2)|2,{49,107,0}}, +/* 3933 */ {(12<<2)|2,{49,107,0}}, +/* 3934 */ {(12<<2)|2,{49,107,0}}, +/* 3935 */ {(12<<2)|2,{49,107,0}}, +/* 3936 */ {(12<<2)|2,{49,113,0}}, +/* 3937 */ {(12<<2)|2,{49,113,0}}, +/* 3938 */ {(12<<2)|2,{49,113,0}}, +/* 3939 */ {(12<<2)|2,{49,113,0}}, +/* 3940 */ {(12<<2)|2,{49,113,0}}, +/* 3941 */ {(12<<2)|2,{49,113,0}}, +/* 3942 */ {(12<<2)|2,{49,113,0}}, +/* 3943 */ {(12<<2)|2,{49,113,0}}, +/* 3944 */ {(12<<2)|2,{49,113,0}}, +/* 3945 */ {(12<<2)|2,{49,113,0}}, +/* 3946 */ {(12<<2)|2,{49,113,0}}, +/* 3947 */ {(12<<2)|2,{49,113,0}}, +/* 3948 */ {(12<<2)|2,{49,113,0}}, +/* 3949 */ {(12<<2)|2,{49,113,0}}, +/* 3950 */ {(12<<2)|2,{49,113,0}}, +/* 3951 */ {(12<<2)|2,{49,113,0}}, +/* 3952 */ {(12<<2)|2,{49,118,0}}, +/* 3953 */ {(12<<2)|2,{49,118,0}}, +/* 3954 */ {(12<<2)|2,{49,118,0}}, +/* 3955 */ {(12<<2)|2,{49,118,0}}, +/* 3956 */ {(12<<2)|2,{49,118,0}}, +/* 3957 */ {(12<<2)|2,{49,118,0}}, +/* 3958 */ {(12<<2)|2,{49,118,0}}, +/* 3959 */ {(12<<2)|2,{49,118,0}}, +/* 3960 */ {(12<<2)|2,{49,118,0}}, +/* 3961 */ {(12<<2)|2,{49,118,0}}, +/* 3962 */ {(12<<2)|2,{49,118,0}}, +/* 3963 */ {(12<<2)|2,{49,118,0}}, +/* 3964 */ {(12<<2)|2,{49,118,0}}, +/* 3965 */ {(12<<2)|2,{49,118,0}}, +/* 3966 */ {(12<<2)|2,{49,118,0}}, +/* 3967 */ {(12<<2)|2,{49,118,0}}, +/* 3968 */ {(12<<2)|2,{49,119,0}}, +/* 3969 */ {(12<<2)|2,{49,119,0}}, +/* 3970 */ {(12<<2)|2,{49,119,0}}, +/* 3971 */ {(12<<2)|2,{49,119,0}}, +/* 3972 */ {(12<<2)|2,{49,119,0}}, +/* 3973 */ {(12<<2)|2,{49,119,0}}, +/* 3974 */ {(12<<2)|2,{49,119,0}}, +/* 3975 */ {(12<<2)|2,{49,119,0}}, +/* 3976 */ {(12<<2)|2,{49,119,0}}, +/* 3977 */ {(12<<2)|2,{49,119,0}}, +/* 3978 */ {(12<<2)|2,{49,119,0}}, +/* 3979 */ {(12<<2)|2,{49,119,0}}, +/* 3980 */ {(12<<2)|2,{49,119,0}}, +/* 3981 */ {(12<<2)|2,{49,119,0}}, +/* 3982 */ {(12<<2)|2,{49,119,0}}, +/* 3983 */ {(12<<2)|2,{49,119,0}}, +/* 3984 */ {(12<<2)|2,{49,120,0}}, +/* 3985 */ {(12<<2)|2,{49,120,0}}, +/* 3986 */ {(12<<2)|2,{49,120,0}}, +/* 3987 */ {(12<<2)|2,{49,120,0}}, +/* 3988 */ {(12<<2)|2,{49,120,0}}, +/* 3989 */ {(12<<2)|2,{49,120,0}}, +/* 3990 */ {(12<<2)|2,{49,120,0}}, +/* 3991 */ {(12<<2)|2,{49,120,0}}, +/* 3992 */ {(12<<2)|2,{49,120,0}}, +/* 3993 */ {(12<<2)|2,{49,120,0}}, +/* 3994 */ {(12<<2)|2,{49,120,0}}, +/* 3995 */ {(12<<2)|2,{49,120,0}}, +/* 3996 */ {(12<<2)|2,{49,120,0}}, +/* 3997 */ {(12<<2)|2,{49,120,0}}, +/* 3998 */ {(12<<2)|2,{49,120,0}}, +/* 3999 */ {(12<<2)|2,{49,120,0}}, +/* 4000 */ {(12<<2)|2,{49,121,0}}, +/* 4001 */ {(12<<2)|2,{49,121,0}}, +/* 4002 */ {(12<<2)|2,{49,121,0}}, +/* 4003 */ {(12<<2)|2,{49,121,0}}, +/* 4004 */ {(12<<2)|2,{49,121,0}}, +/* 4005 */ {(12<<2)|2,{49,121,0}}, +/* 4006 */ {(12<<2)|2,{49,121,0}}, +/* 4007 */ {(12<<2)|2,{49,121,0}}, +/* 4008 */ {(12<<2)|2,{49,121,0}}, +/* 4009 */ {(12<<2)|2,{49,121,0}}, +/* 4010 */ {(12<<2)|2,{49,121,0}}, +/* 4011 */ {(12<<2)|2,{49,121,0}}, +/* 4012 */ {(12<<2)|2,{49,121,0}}, +/* 4013 */ {(12<<2)|2,{49,121,0}}, +/* 4014 */ {(12<<2)|2,{49,121,0}}, +/* 4015 */ {(12<<2)|2,{49,121,0}}, +/* 4016 */ {(12<<2)|2,{49,122,0}}, +/* 4017 */ {(12<<2)|2,{49,122,0}}, +/* 4018 */ {(12<<2)|2,{49,122,0}}, +/* 4019 */ {(12<<2)|2,{49,122,0}}, +/* 4020 */ {(12<<2)|2,{49,122,0}}, +/* 4021 */ {(12<<2)|2,{49,122,0}}, +/* 4022 */ {(12<<2)|2,{49,122,0}}, +/* 4023 */ {(12<<2)|2,{49,122,0}}, +/* 4024 */ {(12<<2)|2,{49,122,0}}, +/* 4025 */ {(12<<2)|2,{49,122,0}}, +/* 4026 */ {(12<<2)|2,{49,122,0}}, +/* 4027 */ {(12<<2)|2,{49,122,0}}, +/* 4028 */ {(12<<2)|2,{49,122,0}}, +/* 4029 */ {(12<<2)|2,{49,122,0}}, +/* 4030 */ {(12<<2)|2,{49,122,0}}, +/* 4031 */ {(12<<2)|2,{49,122,0}}, +/* 4032 */ {(13<<2)|2,{49,38,0}}, +/* 4033 */ {(13<<2)|2,{49,38,0}}, +/* 4034 */ {(13<<2)|2,{49,38,0}}, +/* 4035 */ {(13<<2)|2,{49,38,0}}, +/* 4036 */ {(13<<2)|2,{49,38,0}}, +/* 4037 */ {(13<<2)|2,{49,38,0}}, +/* 4038 */ {(13<<2)|2,{49,38,0}}, +/* 4039 */ {(13<<2)|2,{49,38,0}}, +/* 4040 */ {(13<<2)|2,{49,42,0}}, +/* 4041 */ {(13<<2)|2,{49,42,0}}, +/* 4042 */ {(13<<2)|2,{49,42,0}}, +/* 4043 */ {(13<<2)|2,{49,42,0}}, +/* 4044 */ {(13<<2)|2,{49,42,0}}, +/* 4045 */ {(13<<2)|2,{49,42,0}}, +/* 4046 */ {(13<<2)|2,{49,42,0}}, +/* 4047 */ {(13<<2)|2,{49,42,0}}, +/* 4048 */ {(13<<2)|2,{49,44,0}}, +/* 4049 */ {(13<<2)|2,{49,44,0}}, +/* 4050 */ {(13<<2)|2,{49,44,0}}, +/* 4051 */ {(13<<2)|2,{49,44,0}}, +/* 4052 */ {(13<<2)|2,{49,44,0}}, +/* 4053 */ {(13<<2)|2,{49,44,0}}, +/* 4054 */ {(13<<2)|2,{49,44,0}}, +/* 4055 */ {(13<<2)|2,{49,44,0}}, +/* 4056 */ {(13<<2)|2,{49,59,0}}, +/* 4057 */ {(13<<2)|2,{49,59,0}}, +/* 4058 */ {(13<<2)|2,{49,59,0}}, +/* 4059 */ {(13<<2)|2,{49,59,0}}, +/* 4060 */ {(13<<2)|2,{49,59,0}}, +/* 4061 */ {(13<<2)|2,{49,59,0}}, +/* 4062 */ {(13<<2)|2,{49,59,0}}, +/* 4063 */ {(13<<2)|2,{49,59,0}}, +/* 4064 */ {(13<<2)|2,{49,88,0}}, +/* 4065 */ {(13<<2)|2,{49,88,0}}, +/* 4066 */ {(13<<2)|2,{49,88,0}}, +/* 4067 */ {(13<<2)|2,{49,88,0}}, +/* 4068 */ {(13<<2)|2,{49,88,0}}, +/* 4069 */ {(13<<2)|2,{49,88,0}}, +/* 4070 */ {(13<<2)|2,{49,88,0}}, +/* 4071 */ {(13<<2)|2,{49,88,0}}, +/* 4072 */ {(13<<2)|2,{49,90,0}}, +/* 4073 */ {(13<<2)|2,{49,90,0}}, +/* 4074 */ {(13<<2)|2,{49,90,0}}, +/* 4075 */ {(13<<2)|2,{49,90,0}}, +/* 4076 */ {(13<<2)|2,{49,90,0}}, +/* 4077 */ {(13<<2)|2,{49,90,0}}, +/* 4078 */ {(13<<2)|2,{49,90,0}}, +/* 4079 */ {(13<<2)|2,{49,90,0}}, +/* 4080 */ {(15<<2)|2,{49,33,0}}, +/* 4081 */ {(15<<2)|2,{49,33,0}}, +/* 4082 */ {(15<<2)|2,{49,34,0}}, +/* 4083 */ {(15<<2)|2,{49,34,0}}, +/* 4084 */ {(15<<2)|2,{49,40,0}}, +/* 4085 */ {(15<<2)|2,{49,40,0}}, +/* 4086 */ {(15<<2)|2,{49,41,0}}, +/* 4087 */ {(15<<2)|2,{49,41,0}}, +/* 4088 */ {(15<<2)|2,{49,63,0}}, +/* 4089 */ {(15<<2)|2,{49,63,0}}, +/* 4090 */ {(16<<2)|2,{49,39,0}}, +/* 4091 */ {(16<<2)|2,{49,43,0}}, +/* 4092 */ {(16<<2)|2,{49,124,0}}, +/* 4093 */ {(5<<2)|1,{49,0,0}}, +/* 4094 */ {(5<<2)|1,{49,0,0}}, +/* 4095 */ {(5<<2)|1,{49,0,0}}, +/* 4096 */ {(15<<2)|3,{50,48,48}}, +/* 4097 */ {(15<<2)|3,{50,48,48}}, +/* 4098 */ {(15<<2)|3,{50,48,49}}, +/* 4099 */ {(15<<2)|3,{50,48,49}}, +/* 4100 */ {(15<<2)|3,{50,48,50}}, +/* 4101 */ {(15<<2)|3,{50,48,50}}, +/* 4102 */ {(15<<2)|3,{50,48,97}}, +/* 4103 */ {(15<<2)|3,{50,48,97}}, +/* 4104 */ {(15<<2)|3,{50,48,99}}, +/* 4105 */ {(15<<2)|3,{50,48,99}}, +/* 4106 */ {(15<<2)|3,{50,48,101}}, +/* 4107 */ {(15<<2)|3,{50,48,101}}, +/* 4108 */ {(15<<2)|3,{50,48,105}}, +/* 4109 */ {(15<<2)|3,{50,48,105}}, +/* 4110 */ {(15<<2)|3,{50,48,111}}, +/* 4111 */ {(15<<2)|3,{50,48,111}}, +/* 4112 */ {(15<<2)|3,{50,48,115}}, +/* 4113 */ {(15<<2)|3,{50,48,115}}, +/* 4114 */ {(15<<2)|3,{50,48,116}}, +/* 4115 */ {(15<<2)|3,{50,48,116}}, +/* 4116 */ {(16<<2)|3,{50,48,32}}, +/* 4117 */ {(16<<2)|3,{50,48,37}}, +/* 4118 */ {(16<<2)|3,{50,48,45}}, +/* 4119 */ {(16<<2)|3,{50,48,46}}, +/* 4120 */ {(16<<2)|3,{50,48,47}}, +/* 4121 */ {(16<<2)|3,{50,48,51}}, +/* 4122 */ {(16<<2)|3,{50,48,52}}, +/* 4123 */ {(16<<2)|3,{50,48,53}}, +/* 4124 */ {(16<<2)|3,{50,48,54}}, +/* 4125 */ {(16<<2)|3,{50,48,55}}, +/* 4126 */ {(16<<2)|3,{50,48,56}}, +/* 4127 */ {(16<<2)|3,{50,48,57}}, +/* 4128 */ {(16<<2)|3,{50,48,61}}, +/* 4129 */ {(16<<2)|3,{50,48,65}}, +/* 4130 */ {(16<<2)|3,{50,48,95}}, +/* 4131 */ {(16<<2)|3,{50,48,98}}, +/* 4132 */ {(16<<2)|3,{50,48,100}}, +/* 4133 */ {(16<<2)|3,{50,48,102}}, +/* 4134 */ {(16<<2)|3,{50,48,103}}, +/* 4135 */ {(16<<2)|3,{50,48,104}}, +/* 4136 */ {(16<<2)|3,{50,48,108}}, +/* 4137 */ {(16<<2)|3,{50,48,109}}, +/* 4138 */ {(16<<2)|3,{50,48,110}}, +/* 4139 */ {(16<<2)|3,{50,48,112}}, +/* 4140 */ {(16<<2)|3,{50,48,114}}, +/* 4141 */ {(16<<2)|3,{50,48,117}}, +/* 4142 */ {(10<<2)|2,{50,48,0}}, +/* 4143 */ {(10<<2)|2,{50,48,0}}, +/* 4144 */ {(10<<2)|2,{50,48,0}}, +/* 4145 */ {(10<<2)|2,{50,48,0}}, +/* 4146 */ {(10<<2)|2,{50,48,0}}, +/* 4147 */ {(10<<2)|2,{50,48,0}}, +/* 4148 */ {(10<<2)|2,{50,48,0}}, +/* 4149 */ {(10<<2)|2,{50,48,0}}, +/* 4150 */ {(10<<2)|2,{50,48,0}}, +/* 4151 */ {(10<<2)|2,{50,48,0}}, +/* 4152 */ {(10<<2)|2,{50,48,0}}, +/* 4153 */ {(10<<2)|2,{50,48,0}}, +/* 4154 */ {(10<<2)|2,{50,48,0}}, +/* 4155 */ {(10<<2)|2,{50,48,0}}, +/* 4156 */ {(10<<2)|2,{50,48,0}}, +/* 4157 */ {(10<<2)|2,{50,48,0}}, +/* 4158 */ {(10<<2)|2,{50,48,0}}, +/* 4159 */ {(10<<2)|2,{50,48,0}}, +/* 4160 */ {(15<<2)|3,{50,49,48}}, +/* 4161 */ {(15<<2)|3,{50,49,48}}, +/* 4162 */ {(15<<2)|3,{50,49,49}}, +/* 4163 */ {(15<<2)|3,{50,49,49}}, +/* 4164 */ {(15<<2)|3,{50,49,50}}, +/* 4165 */ {(15<<2)|3,{50,49,50}}, +/* 4166 */ {(15<<2)|3,{50,49,97}}, +/* 4167 */ {(15<<2)|3,{50,49,97}}, +/* 4168 */ {(15<<2)|3,{50,49,99}}, +/* 4169 */ {(15<<2)|3,{50,49,99}}, +/* 4170 */ {(15<<2)|3,{50,49,101}}, +/* 4171 */ {(15<<2)|3,{50,49,101}}, +/* 4172 */ {(15<<2)|3,{50,49,105}}, +/* 4173 */ {(15<<2)|3,{50,49,105}}, +/* 4174 */ {(15<<2)|3,{50,49,111}}, +/* 4175 */ {(15<<2)|3,{50,49,111}}, +/* 4176 */ {(15<<2)|3,{50,49,115}}, +/* 4177 */ {(15<<2)|3,{50,49,115}}, +/* 4178 */ {(15<<2)|3,{50,49,116}}, +/* 4179 */ {(15<<2)|3,{50,49,116}}, +/* 4180 */ {(16<<2)|3,{50,49,32}}, +/* 4181 */ {(16<<2)|3,{50,49,37}}, +/* 4182 */ {(16<<2)|3,{50,49,45}}, +/* 4183 */ {(16<<2)|3,{50,49,46}}, +/* 4184 */ {(16<<2)|3,{50,49,47}}, +/* 4185 */ {(16<<2)|3,{50,49,51}}, +/* 4186 */ {(16<<2)|3,{50,49,52}}, +/* 4187 */ {(16<<2)|3,{50,49,53}}, +/* 4188 */ {(16<<2)|3,{50,49,54}}, +/* 4189 */ {(16<<2)|3,{50,49,55}}, +/* 4190 */ {(16<<2)|3,{50,49,56}}, +/* 4191 */ {(16<<2)|3,{50,49,57}}, +/* 4192 */ {(16<<2)|3,{50,49,61}}, +/* 4193 */ {(16<<2)|3,{50,49,65}}, +/* 4194 */ {(16<<2)|3,{50,49,95}}, +/* 4195 */ {(16<<2)|3,{50,49,98}}, +/* 4196 */ {(16<<2)|3,{50,49,100}}, +/* 4197 */ {(16<<2)|3,{50,49,102}}, +/* 4198 */ {(16<<2)|3,{50,49,103}}, +/* 4199 */ {(16<<2)|3,{50,49,104}}, +/* 4200 */ {(16<<2)|3,{50,49,108}}, +/* 4201 */ {(16<<2)|3,{50,49,109}}, +/* 4202 */ {(16<<2)|3,{50,49,110}}, +/* 4203 */ {(16<<2)|3,{50,49,112}}, +/* 4204 */ {(16<<2)|3,{50,49,114}}, +/* 4205 */ {(16<<2)|3,{50,49,117}}, +/* 4206 */ {(10<<2)|2,{50,49,0}}, +/* 4207 */ {(10<<2)|2,{50,49,0}}, +/* 4208 */ {(10<<2)|2,{50,49,0}}, +/* 4209 */ {(10<<2)|2,{50,49,0}}, +/* 4210 */ {(10<<2)|2,{50,49,0}}, +/* 4211 */ {(10<<2)|2,{50,49,0}}, +/* 4212 */ {(10<<2)|2,{50,49,0}}, +/* 4213 */ {(10<<2)|2,{50,49,0}}, +/* 4214 */ {(10<<2)|2,{50,49,0}}, +/* 4215 */ {(10<<2)|2,{50,49,0}}, +/* 4216 */ {(10<<2)|2,{50,49,0}}, +/* 4217 */ {(10<<2)|2,{50,49,0}}, +/* 4218 */ {(10<<2)|2,{50,49,0}}, +/* 4219 */ {(10<<2)|2,{50,49,0}}, +/* 4220 */ {(10<<2)|2,{50,49,0}}, +/* 4221 */ {(10<<2)|2,{50,49,0}}, +/* 4222 */ {(10<<2)|2,{50,49,0}}, +/* 4223 */ {(10<<2)|2,{50,49,0}}, +/* 4224 */ {(15<<2)|3,{50,50,48}}, +/* 4225 */ {(15<<2)|3,{50,50,48}}, +/* 4226 */ {(15<<2)|3,{50,50,49}}, +/* 4227 */ {(15<<2)|3,{50,50,49}}, +/* 4228 */ {(15<<2)|3,{50,50,50}}, +/* 4229 */ {(15<<2)|3,{50,50,50}}, +/* 4230 */ {(15<<2)|3,{50,50,97}}, +/* 4231 */ {(15<<2)|3,{50,50,97}}, +/* 4232 */ {(15<<2)|3,{50,50,99}}, +/* 4233 */ {(15<<2)|3,{50,50,99}}, +/* 4234 */ {(15<<2)|3,{50,50,101}}, +/* 4235 */ {(15<<2)|3,{50,50,101}}, +/* 4236 */ {(15<<2)|3,{50,50,105}}, +/* 4237 */ {(15<<2)|3,{50,50,105}}, +/* 4238 */ {(15<<2)|3,{50,50,111}}, +/* 4239 */ {(15<<2)|3,{50,50,111}}, +/* 4240 */ {(15<<2)|3,{50,50,115}}, +/* 4241 */ {(15<<2)|3,{50,50,115}}, +/* 4242 */ {(15<<2)|3,{50,50,116}}, +/* 4243 */ {(15<<2)|3,{50,50,116}}, +/* 4244 */ {(16<<2)|3,{50,50,32}}, +/* 4245 */ {(16<<2)|3,{50,50,37}}, +/* 4246 */ {(16<<2)|3,{50,50,45}}, +/* 4247 */ {(16<<2)|3,{50,50,46}}, +/* 4248 */ {(16<<2)|3,{50,50,47}}, +/* 4249 */ {(16<<2)|3,{50,50,51}}, +/* 4250 */ {(16<<2)|3,{50,50,52}}, +/* 4251 */ {(16<<2)|3,{50,50,53}}, +/* 4252 */ {(16<<2)|3,{50,50,54}}, +/* 4253 */ {(16<<2)|3,{50,50,55}}, +/* 4254 */ {(16<<2)|3,{50,50,56}}, +/* 4255 */ {(16<<2)|3,{50,50,57}}, +/* 4256 */ {(16<<2)|3,{50,50,61}}, +/* 4257 */ {(16<<2)|3,{50,50,65}}, +/* 4258 */ {(16<<2)|3,{50,50,95}}, +/* 4259 */ {(16<<2)|3,{50,50,98}}, +/* 4260 */ {(16<<2)|3,{50,50,100}}, +/* 4261 */ {(16<<2)|3,{50,50,102}}, +/* 4262 */ {(16<<2)|3,{50,50,103}}, +/* 4263 */ {(16<<2)|3,{50,50,104}}, +/* 4264 */ {(16<<2)|3,{50,50,108}}, +/* 4265 */ {(16<<2)|3,{50,50,109}}, +/* 4266 */ {(16<<2)|3,{50,50,110}}, +/* 4267 */ {(16<<2)|3,{50,50,112}}, +/* 4268 */ {(16<<2)|3,{50,50,114}}, +/* 4269 */ {(16<<2)|3,{50,50,117}}, +/* 4270 */ {(10<<2)|2,{50,50,0}}, +/* 4271 */ {(10<<2)|2,{50,50,0}}, +/* 4272 */ {(10<<2)|2,{50,50,0}}, +/* 4273 */ {(10<<2)|2,{50,50,0}}, +/* 4274 */ {(10<<2)|2,{50,50,0}}, +/* 4275 */ {(10<<2)|2,{50,50,0}}, +/* 4276 */ {(10<<2)|2,{50,50,0}}, +/* 4277 */ {(10<<2)|2,{50,50,0}}, +/* 4278 */ {(10<<2)|2,{50,50,0}}, +/* 4279 */ {(10<<2)|2,{50,50,0}}, +/* 4280 */ {(10<<2)|2,{50,50,0}}, +/* 4281 */ {(10<<2)|2,{50,50,0}}, +/* 4282 */ {(10<<2)|2,{50,50,0}}, +/* 4283 */ {(10<<2)|2,{50,50,0}}, +/* 4284 */ {(10<<2)|2,{50,50,0}}, +/* 4285 */ {(10<<2)|2,{50,50,0}}, +/* 4286 */ {(10<<2)|2,{50,50,0}}, +/* 4287 */ {(10<<2)|2,{50,50,0}}, +/* 4288 */ {(15<<2)|3,{50,97,48}}, +/* 4289 */ {(15<<2)|3,{50,97,48}}, +/* 4290 */ {(15<<2)|3,{50,97,49}}, +/* 4291 */ {(15<<2)|3,{50,97,49}}, +/* 4292 */ {(15<<2)|3,{50,97,50}}, +/* 4293 */ {(15<<2)|3,{50,97,50}}, +/* 4294 */ {(15<<2)|3,{50,97,97}}, +/* 4295 */ {(15<<2)|3,{50,97,97}}, +/* 4296 */ {(15<<2)|3,{50,97,99}}, +/* 4297 */ {(15<<2)|3,{50,97,99}}, +/* 4298 */ {(15<<2)|3,{50,97,101}}, +/* 4299 */ {(15<<2)|3,{50,97,101}}, +/* 4300 */ {(15<<2)|3,{50,97,105}}, +/* 4301 */ {(15<<2)|3,{50,97,105}}, +/* 4302 */ {(15<<2)|3,{50,97,111}}, +/* 4303 */ {(15<<2)|3,{50,97,111}}, +/* 4304 */ {(15<<2)|3,{50,97,115}}, +/* 4305 */ {(15<<2)|3,{50,97,115}}, +/* 4306 */ {(15<<2)|3,{50,97,116}}, +/* 4307 */ {(15<<2)|3,{50,97,116}}, +/* 4308 */ {(16<<2)|3,{50,97,32}}, +/* 4309 */ {(16<<2)|3,{50,97,37}}, +/* 4310 */ {(16<<2)|3,{50,97,45}}, +/* 4311 */ {(16<<2)|3,{50,97,46}}, +/* 4312 */ {(16<<2)|3,{50,97,47}}, +/* 4313 */ {(16<<2)|3,{50,97,51}}, +/* 4314 */ {(16<<2)|3,{50,97,52}}, +/* 4315 */ {(16<<2)|3,{50,97,53}}, +/* 4316 */ {(16<<2)|3,{50,97,54}}, +/* 4317 */ {(16<<2)|3,{50,97,55}}, +/* 4318 */ {(16<<2)|3,{50,97,56}}, +/* 4319 */ {(16<<2)|3,{50,97,57}}, +/* 4320 */ {(16<<2)|3,{50,97,61}}, +/* 4321 */ {(16<<2)|3,{50,97,65}}, +/* 4322 */ {(16<<2)|3,{50,97,95}}, +/* 4323 */ {(16<<2)|3,{50,97,98}}, +/* 4324 */ {(16<<2)|3,{50,97,100}}, +/* 4325 */ {(16<<2)|3,{50,97,102}}, +/* 4326 */ {(16<<2)|3,{50,97,103}}, +/* 4327 */ {(16<<2)|3,{50,97,104}}, +/* 4328 */ {(16<<2)|3,{50,97,108}}, +/* 4329 */ {(16<<2)|3,{50,97,109}}, +/* 4330 */ {(16<<2)|3,{50,97,110}}, +/* 4331 */ {(16<<2)|3,{50,97,112}}, +/* 4332 */ {(16<<2)|3,{50,97,114}}, +/* 4333 */ {(16<<2)|3,{50,97,117}}, +/* 4334 */ {(10<<2)|2,{50,97,0}}, +/* 4335 */ {(10<<2)|2,{50,97,0}}, +/* 4336 */ {(10<<2)|2,{50,97,0}}, +/* 4337 */ {(10<<2)|2,{50,97,0}}, +/* 4338 */ {(10<<2)|2,{50,97,0}}, +/* 4339 */ {(10<<2)|2,{50,97,0}}, +/* 4340 */ {(10<<2)|2,{50,97,0}}, +/* 4341 */ {(10<<2)|2,{50,97,0}}, +/* 4342 */ {(10<<2)|2,{50,97,0}}, +/* 4343 */ {(10<<2)|2,{50,97,0}}, +/* 4344 */ {(10<<2)|2,{50,97,0}}, +/* 4345 */ {(10<<2)|2,{50,97,0}}, +/* 4346 */ {(10<<2)|2,{50,97,0}}, +/* 4347 */ {(10<<2)|2,{50,97,0}}, +/* 4348 */ {(10<<2)|2,{50,97,0}}, +/* 4349 */ {(10<<2)|2,{50,97,0}}, +/* 4350 */ {(10<<2)|2,{50,97,0}}, +/* 4351 */ {(10<<2)|2,{50,97,0}}, +/* 4352 */ {(15<<2)|3,{50,99,48}}, +/* 4353 */ {(15<<2)|3,{50,99,48}}, +/* 4354 */ {(15<<2)|3,{50,99,49}}, +/* 4355 */ {(15<<2)|3,{50,99,49}}, +/* 4356 */ {(15<<2)|3,{50,99,50}}, +/* 4357 */ {(15<<2)|3,{50,99,50}}, +/* 4358 */ {(15<<2)|3,{50,99,97}}, +/* 4359 */ {(15<<2)|3,{50,99,97}}, +/* 4360 */ {(15<<2)|3,{50,99,99}}, +/* 4361 */ {(15<<2)|3,{50,99,99}}, +/* 4362 */ {(15<<2)|3,{50,99,101}}, +/* 4363 */ {(15<<2)|3,{50,99,101}}, +/* 4364 */ {(15<<2)|3,{50,99,105}}, +/* 4365 */ {(15<<2)|3,{50,99,105}}, +/* 4366 */ {(15<<2)|3,{50,99,111}}, +/* 4367 */ {(15<<2)|3,{50,99,111}}, +/* 4368 */ {(15<<2)|3,{50,99,115}}, +/* 4369 */ {(15<<2)|3,{50,99,115}}, +/* 4370 */ {(15<<2)|3,{50,99,116}}, +/* 4371 */ {(15<<2)|3,{50,99,116}}, +/* 4372 */ {(16<<2)|3,{50,99,32}}, +/* 4373 */ {(16<<2)|3,{50,99,37}}, +/* 4374 */ {(16<<2)|3,{50,99,45}}, +/* 4375 */ {(16<<2)|3,{50,99,46}}, +/* 4376 */ {(16<<2)|3,{50,99,47}}, +/* 4377 */ {(16<<2)|3,{50,99,51}}, +/* 4378 */ {(16<<2)|3,{50,99,52}}, +/* 4379 */ {(16<<2)|3,{50,99,53}}, +/* 4380 */ {(16<<2)|3,{50,99,54}}, +/* 4381 */ {(16<<2)|3,{50,99,55}}, +/* 4382 */ {(16<<2)|3,{50,99,56}}, +/* 4383 */ {(16<<2)|3,{50,99,57}}, +/* 4384 */ {(16<<2)|3,{50,99,61}}, +/* 4385 */ {(16<<2)|3,{50,99,65}}, +/* 4386 */ {(16<<2)|3,{50,99,95}}, +/* 4387 */ {(16<<2)|3,{50,99,98}}, +/* 4388 */ {(16<<2)|3,{50,99,100}}, +/* 4389 */ {(16<<2)|3,{50,99,102}}, +/* 4390 */ {(16<<2)|3,{50,99,103}}, +/* 4391 */ {(16<<2)|3,{50,99,104}}, +/* 4392 */ {(16<<2)|3,{50,99,108}}, +/* 4393 */ {(16<<2)|3,{50,99,109}}, +/* 4394 */ {(16<<2)|3,{50,99,110}}, +/* 4395 */ {(16<<2)|3,{50,99,112}}, +/* 4396 */ {(16<<2)|3,{50,99,114}}, +/* 4397 */ {(16<<2)|3,{50,99,117}}, +/* 4398 */ {(10<<2)|2,{50,99,0}}, +/* 4399 */ {(10<<2)|2,{50,99,0}}, +/* 4400 */ {(10<<2)|2,{50,99,0}}, +/* 4401 */ {(10<<2)|2,{50,99,0}}, +/* 4402 */ {(10<<2)|2,{50,99,0}}, +/* 4403 */ {(10<<2)|2,{50,99,0}}, +/* 4404 */ {(10<<2)|2,{50,99,0}}, +/* 4405 */ {(10<<2)|2,{50,99,0}}, +/* 4406 */ {(10<<2)|2,{50,99,0}}, +/* 4407 */ {(10<<2)|2,{50,99,0}}, +/* 4408 */ {(10<<2)|2,{50,99,0}}, +/* 4409 */ {(10<<2)|2,{50,99,0}}, +/* 4410 */ {(10<<2)|2,{50,99,0}}, +/* 4411 */ {(10<<2)|2,{50,99,0}}, +/* 4412 */ {(10<<2)|2,{50,99,0}}, +/* 4413 */ {(10<<2)|2,{50,99,0}}, +/* 4414 */ {(10<<2)|2,{50,99,0}}, +/* 4415 */ {(10<<2)|2,{50,99,0}}, +/* 4416 */ {(15<<2)|3,{50,101,48}}, +/* 4417 */ {(15<<2)|3,{50,101,48}}, +/* 4418 */ {(15<<2)|3,{50,101,49}}, +/* 4419 */ {(15<<2)|3,{50,101,49}}, +/* 4420 */ {(15<<2)|3,{50,101,50}}, +/* 4421 */ {(15<<2)|3,{50,101,50}}, +/* 4422 */ {(15<<2)|3,{50,101,97}}, +/* 4423 */ {(15<<2)|3,{50,101,97}}, +/* 4424 */ {(15<<2)|3,{50,101,99}}, +/* 4425 */ {(15<<2)|3,{50,101,99}}, +/* 4426 */ {(15<<2)|3,{50,101,101}}, +/* 4427 */ {(15<<2)|3,{50,101,101}}, +/* 4428 */ {(15<<2)|3,{50,101,105}}, +/* 4429 */ {(15<<2)|3,{50,101,105}}, +/* 4430 */ {(15<<2)|3,{50,101,111}}, +/* 4431 */ {(15<<2)|3,{50,101,111}}, +/* 4432 */ {(15<<2)|3,{50,101,115}}, +/* 4433 */ {(15<<2)|3,{50,101,115}}, +/* 4434 */ {(15<<2)|3,{50,101,116}}, +/* 4435 */ {(15<<2)|3,{50,101,116}}, +/* 4436 */ {(16<<2)|3,{50,101,32}}, +/* 4437 */ {(16<<2)|3,{50,101,37}}, +/* 4438 */ {(16<<2)|3,{50,101,45}}, +/* 4439 */ {(16<<2)|3,{50,101,46}}, +/* 4440 */ {(16<<2)|3,{50,101,47}}, +/* 4441 */ {(16<<2)|3,{50,101,51}}, +/* 4442 */ {(16<<2)|3,{50,101,52}}, +/* 4443 */ {(16<<2)|3,{50,101,53}}, +/* 4444 */ {(16<<2)|3,{50,101,54}}, +/* 4445 */ {(16<<2)|3,{50,101,55}}, +/* 4446 */ {(16<<2)|3,{50,101,56}}, +/* 4447 */ {(16<<2)|3,{50,101,57}}, +/* 4448 */ {(16<<2)|3,{50,101,61}}, +/* 4449 */ {(16<<2)|3,{50,101,65}}, +/* 4450 */ {(16<<2)|3,{50,101,95}}, +/* 4451 */ {(16<<2)|3,{50,101,98}}, +/* 4452 */ {(16<<2)|3,{50,101,100}}, +/* 4453 */ {(16<<2)|3,{50,101,102}}, +/* 4454 */ {(16<<2)|3,{50,101,103}}, +/* 4455 */ {(16<<2)|3,{50,101,104}}, +/* 4456 */ {(16<<2)|3,{50,101,108}}, +/* 4457 */ {(16<<2)|3,{50,101,109}}, +/* 4458 */ {(16<<2)|3,{50,101,110}}, +/* 4459 */ {(16<<2)|3,{50,101,112}}, +/* 4460 */ {(16<<2)|3,{50,101,114}}, +/* 4461 */ {(16<<2)|3,{50,101,117}}, +/* 4462 */ {(10<<2)|2,{50,101,0}}, +/* 4463 */ {(10<<2)|2,{50,101,0}}, +/* 4464 */ {(10<<2)|2,{50,101,0}}, +/* 4465 */ {(10<<2)|2,{50,101,0}}, +/* 4466 */ {(10<<2)|2,{50,101,0}}, +/* 4467 */ {(10<<2)|2,{50,101,0}}, +/* 4468 */ {(10<<2)|2,{50,101,0}}, +/* 4469 */ {(10<<2)|2,{50,101,0}}, +/* 4470 */ {(10<<2)|2,{50,101,0}}, +/* 4471 */ {(10<<2)|2,{50,101,0}}, +/* 4472 */ {(10<<2)|2,{50,101,0}}, +/* 4473 */ {(10<<2)|2,{50,101,0}}, +/* 4474 */ {(10<<2)|2,{50,101,0}}, +/* 4475 */ {(10<<2)|2,{50,101,0}}, +/* 4476 */ {(10<<2)|2,{50,101,0}}, +/* 4477 */ {(10<<2)|2,{50,101,0}}, +/* 4478 */ {(10<<2)|2,{50,101,0}}, +/* 4479 */ {(10<<2)|2,{50,101,0}}, +/* 4480 */ {(15<<2)|3,{50,105,48}}, +/* 4481 */ {(15<<2)|3,{50,105,48}}, +/* 4482 */ {(15<<2)|3,{50,105,49}}, +/* 4483 */ {(15<<2)|3,{50,105,49}}, +/* 4484 */ {(15<<2)|3,{50,105,50}}, +/* 4485 */ {(15<<2)|3,{50,105,50}}, +/* 4486 */ {(15<<2)|3,{50,105,97}}, +/* 4487 */ {(15<<2)|3,{50,105,97}}, +/* 4488 */ {(15<<2)|3,{50,105,99}}, +/* 4489 */ {(15<<2)|3,{50,105,99}}, +/* 4490 */ {(15<<2)|3,{50,105,101}}, +/* 4491 */ {(15<<2)|3,{50,105,101}}, +/* 4492 */ {(15<<2)|3,{50,105,105}}, +/* 4493 */ {(15<<2)|3,{50,105,105}}, +/* 4494 */ {(15<<2)|3,{50,105,111}}, +/* 4495 */ {(15<<2)|3,{50,105,111}}, +/* 4496 */ {(15<<2)|3,{50,105,115}}, +/* 4497 */ {(15<<2)|3,{50,105,115}}, +/* 4498 */ {(15<<2)|3,{50,105,116}}, +/* 4499 */ {(15<<2)|3,{50,105,116}}, +/* 4500 */ {(16<<2)|3,{50,105,32}}, +/* 4501 */ {(16<<2)|3,{50,105,37}}, +/* 4502 */ {(16<<2)|3,{50,105,45}}, +/* 4503 */ {(16<<2)|3,{50,105,46}}, +/* 4504 */ {(16<<2)|3,{50,105,47}}, +/* 4505 */ {(16<<2)|3,{50,105,51}}, +/* 4506 */ {(16<<2)|3,{50,105,52}}, +/* 4507 */ {(16<<2)|3,{50,105,53}}, +/* 4508 */ {(16<<2)|3,{50,105,54}}, +/* 4509 */ {(16<<2)|3,{50,105,55}}, +/* 4510 */ {(16<<2)|3,{50,105,56}}, +/* 4511 */ {(16<<2)|3,{50,105,57}}, +/* 4512 */ {(16<<2)|3,{50,105,61}}, +/* 4513 */ {(16<<2)|3,{50,105,65}}, +/* 4514 */ {(16<<2)|3,{50,105,95}}, +/* 4515 */ {(16<<2)|3,{50,105,98}}, +/* 4516 */ {(16<<2)|3,{50,105,100}}, +/* 4517 */ {(16<<2)|3,{50,105,102}}, +/* 4518 */ {(16<<2)|3,{50,105,103}}, +/* 4519 */ {(16<<2)|3,{50,105,104}}, +/* 4520 */ {(16<<2)|3,{50,105,108}}, +/* 4521 */ {(16<<2)|3,{50,105,109}}, +/* 4522 */ {(16<<2)|3,{50,105,110}}, +/* 4523 */ {(16<<2)|3,{50,105,112}}, +/* 4524 */ {(16<<2)|3,{50,105,114}}, +/* 4525 */ {(16<<2)|3,{50,105,117}}, +/* 4526 */ {(10<<2)|2,{50,105,0}}, +/* 4527 */ {(10<<2)|2,{50,105,0}}, +/* 4528 */ {(10<<2)|2,{50,105,0}}, +/* 4529 */ {(10<<2)|2,{50,105,0}}, +/* 4530 */ {(10<<2)|2,{50,105,0}}, +/* 4531 */ {(10<<2)|2,{50,105,0}}, +/* 4532 */ {(10<<2)|2,{50,105,0}}, +/* 4533 */ {(10<<2)|2,{50,105,0}}, +/* 4534 */ {(10<<2)|2,{50,105,0}}, +/* 4535 */ {(10<<2)|2,{50,105,0}}, +/* 4536 */ {(10<<2)|2,{50,105,0}}, +/* 4537 */ {(10<<2)|2,{50,105,0}}, +/* 4538 */ {(10<<2)|2,{50,105,0}}, +/* 4539 */ {(10<<2)|2,{50,105,0}}, +/* 4540 */ {(10<<2)|2,{50,105,0}}, +/* 4541 */ {(10<<2)|2,{50,105,0}}, +/* 4542 */ {(10<<2)|2,{50,105,0}}, +/* 4543 */ {(10<<2)|2,{50,105,0}}, +/* 4544 */ {(15<<2)|3,{50,111,48}}, +/* 4545 */ {(15<<2)|3,{50,111,48}}, +/* 4546 */ {(15<<2)|3,{50,111,49}}, +/* 4547 */ {(15<<2)|3,{50,111,49}}, +/* 4548 */ {(15<<2)|3,{50,111,50}}, +/* 4549 */ {(15<<2)|3,{50,111,50}}, +/* 4550 */ {(15<<2)|3,{50,111,97}}, +/* 4551 */ {(15<<2)|3,{50,111,97}}, +/* 4552 */ {(15<<2)|3,{50,111,99}}, +/* 4553 */ {(15<<2)|3,{50,111,99}}, +/* 4554 */ {(15<<2)|3,{50,111,101}}, +/* 4555 */ {(15<<2)|3,{50,111,101}}, +/* 4556 */ {(15<<2)|3,{50,111,105}}, +/* 4557 */ {(15<<2)|3,{50,111,105}}, +/* 4558 */ {(15<<2)|3,{50,111,111}}, +/* 4559 */ {(15<<2)|3,{50,111,111}}, +/* 4560 */ {(15<<2)|3,{50,111,115}}, +/* 4561 */ {(15<<2)|3,{50,111,115}}, +/* 4562 */ {(15<<2)|3,{50,111,116}}, +/* 4563 */ {(15<<2)|3,{50,111,116}}, +/* 4564 */ {(16<<2)|3,{50,111,32}}, +/* 4565 */ {(16<<2)|3,{50,111,37}}, +/* 4566 */ {(16<<2)|3,{50,111,45}}, +/* 4567 */ {(16<<2)|3,{50,111,46}}, +/* 4568 */ {(16<<2)|3,{50,111,47}}, +/* 4569 */ {(16<<2)|3,{50,111,51}}, +/* 4570 */ {(16<<2)|3,{50,111,52}}, +/* 4571 */ {(16<<2)|3,{50,111,53}}, +/* 4572 */ {(16<<2)|3,{50,111,54}}, +/* 4573 */ {(16<<2)|3,{50,111,55}}, +/* 4574 */ {(16<<2)|3,{50,111,56}}, +/* 4575 */ {(16<<2)|3,{50,111,57}}, +/* 4576 */ {(16<<2)|3,{50,111,61}}, +/* 4577 */ {(16<<2)|3,{50,111,65}}, +/* 4578 */ {(16<<2)|3,{50,111,95}}, +/* 4579 */ {(16<<2)|3,{50,111,98}}, +/* 4580 */ {(16<<2)|3,{50,111,100}}, +/* 4581 */ {(16<<2)|3,{50,111,102}}, +/* 4582 */ {(16<<2)|3,{50,111,103}}, +/* 4583 */ {(16<<2)|3,{50,111,104}}, +/* 4584 */ {(16<<2)|3,{50,111,108}}, +/* 4585 */ {(16<<2)|3,{50,111,109}}, +/* 4586 */ {(16<<2)|3,{50,111,110}}, +/* 4587 */ {(16<<2)|3,{50,111,112}}, +/* 4588 */ {(16<<2)|3,{50,111,114}}, +/* 4589 */ {(16<<2)|3,{50,111,117}}, +/* 4590 */ {(10<<2)|2,{50,111,0}}, +/* 4591 */ {(10<<2)|2,{50,111,0}}, +/* 4592 */ {(10<<2)|2,{50,111,0}}, +/* 4593 */ {(10<<2)|2,{50,111,0}}, +/* 4594 */ {(10<<2)|2,{50,111,0}}, +/* 4595 */ {(10<<2)|2,{50,111,0}}, +/* 4596 */ {(10<<2)|2,{50,111,0}}, +/* 4597 */ {(10<<2)|2,{50,111,0}}, +/* 4598 */ {(10<<2)|2,{50,111,0}}, +/* 4599 */ {(10<<2)|2,{50,111,0}}, +/* 4600 */ {(10<<2)|2,{50,111,0}}, +/* 4601 */ {(10<<2)|2,{50,111,0}}, +/* 4602 */ {(10<<2)|2,{50,111,0}}, +/* 4603 */ {(10<<2)|2,{50,111,0}}, +/* 4604 */ {(10<<2)|2,{50,111,0}}, +/* 4605 */ {(10<<2)|2,{50,111,0}}, +/* 4606 */ {(10<<2)|2,{50,111,0}}, +/* 4607 */ {(10<<2)|2,{50,111,0}}, +/* 4608 */ {(15<<2)|3,{50,115,48}}, +/* 4609 */ {(15<<2)|3,{50,115,48}}, +/* 4610 */ {(15<<2)|3,{50,115,49}}, +/* 4611 */ {(15<<2)|3,{50,115,49}}, +/* 4612 */ {(15<<2)|3,{50,115,50}}, +/* 4613 */ {(15<<2)|3,{50,115,50}}, +/* 4614 */ {(15<<2)|3,{50,115,97}}, +/* 4615 */ {(15<<2)|3,{50,115,97}}, +/* 4616 */ {(15<<2)|3,{50,115,99}}, +/* 4617 */ {(15<<2)|3,{50,115,99}}, +/* 4618 */ {(15<<2)|3,{50,115,101}}, +/* 4619 */ {(15<<2)|3,{50,115,101}}, +/* 4620 */ {(15<<2)|3,{50,115,105}}, +/* 4621 */ {(15<<2)|3,{50,115,105}}, +/* 4622 */ {(15<<2)|3,{50,115,111}}, +/* 4623 */ {(15<<2)|3,{50,115,111}}, +/* 4624 */ {(15<<2)|3,{50,115,115}}, +/* 4625 */ {(15<<2)|3,{50,115,115}}, +/* 4626 */ {(15<<2)|3,{50,115,116}}, +/* 4627 */ {(15<<2)|3,{50,115,116}}, +/* 4628 */ {(16<<2)|3,{50,115,32}}, +/* 4629 */ {(16<<2)|3,{50,115,37}}, +/* 4630 */ {(16<<2)|3,{50,115,45}}, +/* 4631 */ {(16<<2)|3,{50,115,46}}, +/* 4632 */ {(16<<2)|3,{50,115,47}}, +/* 4633 */ {(16<<2)|3,{50,115,51}}, +/* 4634 */ {(16<<2)|3,{50,115,52}}, +/* 4635 */ {(16<<2)|3,{50,115,53}}, +/* 4636 */ {(16<<2)|3,{50,115,54}}, +/* 4637 */ {(16<<2)|3,{50,115,55}}, +/* 4638 */ {(16<<2)|3,{50,115,56}}, +/* 4639 */ {(16<<2)|3,{50,115,57}}, +/* 4640 */ {(16<<2)|3,{50,115,61}}, +/* 4641 */ {(16<<2)|3,{50,115,65}}, +/* 4642 */ {(16<<2)|3,{50,115,95}}, +/* 4643 */ {(16<<2)|3,{50,115,98}}, +/* 4644 */ {(16<<2)|3,{50,115,100}}, +/* 4645 */ {(16<<2)|3,{50,115,102}}, +/* 4646 */ {(16<<2)|3,{50,115,103}}, +/* 4647 */ {(16<<2)|3,{50,115,104}}, +/* 4648 */ {(16<<2)|3,{50,115,108}}, +/* 4649 */ {(16<<2)|3,{50,115,109}}, +/* 4650 */ {(16<<2)|3,{50,115,110}}, +/* 4651 */ {(16<<2)|3,{50,115,112}}, +/* 4652 */ {(16<<2)|3,{50,115,114}}, +/* 4653 */ {(16<<2)|3,{50,115,117}}, +/* 4654 */ {(10<<2)|2,{50,115,0}}, +/* 4655 */ {(10<<2)|2,{50,115,0}}, +/* 4656 */ {(10<<2)|2,{50,115,0}}, +/* 4657 */ {(10<<2)|2,{50,115,0}}, +/* 4658 */ {(10<<2)|2,{50,115,0}}, +/* 4659 */ {(10<<2)|2,{50,115,0}}, +/* 4660 */ {(10<<2)|2,{50,115,0}}, +/* 4661 */ {(10<<2)|2,{50,115,0}}, +/* 4662 */ {(10<<2)|2,{50,115,0}}, +/* 4663 */ {(10<<2)|2,{50,115,0}}, +/* 4664 */ {(10<<2)|2,{50,115,0}}, +/* 4665 */ {(10<<2)|2,{50,115,0}}, +/* 4666 */ {(10<<2)|2,{50,115,0}}, +/* 4667 */ {(10<<2)|2,{50,115,0}}, +/* 4668 */ {(10<<2)|2,{50,115,0}}, +/* 4669 */ {(10<<2)|2,{50,115,0}}, +/* 4670 */ {(10<<2)|2,{50,115,0}}, +/* 4671 */ {(10<<2)|2,{50,115,0}}, +/* 4672 */ {(15<<2)|3,{50,116,48}}, +/* 4673 */ {(15<<2)|3,{50,116,48}}, +/* 4674 */ {(15<<2)|3,{50,116,49}}, +/* 4675 */ {(15<<2)|3,{50,116,49}}, +/* 4676 */ {(15<<2)|3,{50,116,50}}, +/* 4677 */ {(15<<2)|3,{50,116,50}}, +/* 4678 */ {(15<<2)|3,{50,116,97}}, +/* 4679 */ {(15<<2)|3,{50,116,97}}, +/* 4680 */ {(15<<2)|3,{50,116,99}}, +/* 4681 */ {(15<<2)|3,{50,116,99}}, +/* 4682 */ {(15<<2)|3,{50,116,101}}, +/* 4683 */ {(15<<2)|3,{50,116,101}}, +/* 4684 */ {(15<<2)|3,{50,116,105}}, +/* 4685 */ {(15<<2)|3,{50,116,105}}, +/* 4686 */ {(15<<2)|3,{50,116,111}}, +/* 4687 */ {(15<<2)|3,{50,116,111}}, +/* 4688 */ {(15<<2)|3,{50,116,115}}, +/* 4689 */ {(15<<2)|3,{50,116,115}}, +/* 4690 */ {(15<<2)|3,{50,116,116}}, +/* 4691 */ {(15<<2)|3,{50,116,116}}, +/* 4692 */ {(16<<2)|3,{50,116,32}}, +/* 4693 */ {(16<<2)|3,{50,116,37}}, +/* 4694 */ {(16<<2)|3,{50,116,45}}, +/* 4695 */ {(16<<2)|3,{50,116,46}}, +/* 4696 */ {(16<<2)|3,{50,116,47}}, +/* 4697 */ {(16<<2)|3,{50,116,51}}, +/* 4698 */ {(16<<2)|3,{50,116,52}}, +/* 4699 */ {(16<<2)|3,{50,116,53}}, +/* 4700 */ {(16<<2)|3,{50,116,54}}, +/* 4701 */ {(16<<2)|3,{50,116,55}}, +/* 4702 */ {(16<<2)|3,{50,116,56}}, +/* 4703 */ {(16<<2)|3,{50,116,57}}, +/* 4704 */ {(16<<2)|3,{50,116,61}}, +/* 4705 */ {(16<<2)|3,{50,116,65}}, +/* 4706 */ {(16<<2)|3,{50,116,95}}, +/* 4707 */ {(16<<2)|3,{50,116,98}}, +/* 4708 */ {(16<<2)|3,{50,116,100}}, +/* 4709 */ {(16<<2)|3,{50,116,102}}, +/* 4710 */ {(16<<2)|3,{50,116,103}}, +/* 4711 */ {(16<<2)|3,{50,116,104}}, +/* 4712 */ {(16<<2)|3,{50,116,108}}, +/* 4713 */ {(16<<2)|3,{50,116,109}}, +/* 4714 */ {(16<<2)|3,{50,116,110}}, +/* 4715 */ {(16<<2)|3,{50,116,112}}, +/* 4716 */ {(16<<2)|3,{50,116,114}}, +/* 4717 */ {(16<<2)|3,{50,116,117}}, +/* 4718 */ {(10<<2)|2,{50,116,0}}, +/* 4719 */ {(10<<2)|2,{50,116,0}}, +/* 4720 */ {(10<<2)|2,{50,116,0}}, +/* 4721 */ {(10<<2)|2,{50,116,0}}, +/* 4722 */ {(10<<2)|2,{50,116,0}}, +/* 4723 */ {(10<<2)|2,{50,116,0}}, +/* 4724 */ {(10<<2)|2,{50,116,0}}, +/* 4725 */ {(10<<2)|2,{50,116,0}}, +/* 4726 */ {(10<<2)|2,{50,116,0}}, +/* 4727 */ {(10<<2)|2,{50,116,0}}, +/* 4728 */ {(10<<2)|2,{50,116,0}}, +/* 4729 */ {(10<<2)|2,{50,116,0}}, +/* 4730 */ {(10<<2)|2,{50,116,0}}, +/* 4731 */ {(10<<2)|2,{50,116,0}}, +/* 4732 */ {(10<<2)|2,{50,116,0}}, +/* 4733 */ {(10<<2)|2,{50,116,0}}, +/* 4734 */ {(10<<2)|2,{50,116,0}}, +/* 4735 */ {(10<<2)|2,{50,116,0}}, +/* 4736 */ {(16<<2)|3,{50,32,48}}, +/* 4737 */ {(16<<2)|3,{50,32,49}}, +/* 4738 */ {(16<<2)|3,{50,32,50}}, +/* 4739 */ {(16<<2)|3,{50,32,97}}, +/* 4740 */ {(16<<2)|3,{50,32,99}}, +/* 4741 */ {(16<<2)|3,{50,32,101}}, +/* 4742 */ {(16<<2)|3,{50,32,105}}, +/* 4743 */ {(16<<2)|3,{50,32,111}}, +/* 4744 */ {(16<<2)|3,{50,32,115}}, +/* 4745 */ {(16<<2)|3,{50,32,116}}, +/* 4746 */ {(11<<2)|2,{50,32,0}}, +/* 4747 */ {(11<<2)|2,{50,32,0}}, +/* 4748 */ {(11<<2)|2,{50,32,0}}, +/* 4749 */ {(11<<2)|2,{50,32,0}}, +/* 4750 */ {(11<<2)|2,{50,32,0}}, +/* 4751 */ {(11<<2)|2,{50,32,0}}, +/* 4752 */ {(11<<2)|2,{50,32,0}}, +/* 4753 */ {(11<<2)|2,{50,32,0}}, +/* 4754 */ {(11<<2)|2,{50,32,0}}, +/* 4755 */ {(11<<2)|2,{50,32,0}}, +/* 4756 */ {(11<<2)|2,{50,32,0}}, +/* 4757 */ {(11<<2)|2,{50,32,0}}, +/* 4758 */ {(11<<2)|2,{50,32,0}}, +/* 4759 */ {(11<<2)|2,{50,32,0}}, +/* 4760 */ {(11<<2)|2,{50,32,0}}, +/* 4761 */ {(11<<2)|2,{50,32,0}}, +/* 4762 */ {(11<<2)|2,{50,32,0}}, +/* 4763 */ {(11<<2)|2,{50,32,0}}, +/* 4764 */ {(11<<2)|2,{50,32,0}}, +/* 4765 */ {(11<<2)|2,{50,32,0}}, +/* 4766 */ {(11<<2)|2,{50,32,0}}, +/* 4767 */ {(11<<2)|2,{50,32,0}}, +/* 4768 */ {(16<<2)|3,{50,37,48}}, +/* 4769 */ {(16<<2)|3,{50,37,49}}, +/* 4770 */ {(16<<2)|3,{50,37,50}}, +/* 4771 */ {(16<<2)|3,{50,37,97}}, +/* 4772 */ {(16<<2)|3,{50,37,99}}, +/* 4773 */ {(16<<2)|3,{50,37,101}}, +/* 4774 */ {(16<<2)|3,{50,37,105}}, +/* 4775 */ {(16<<2)|3,{50,37,111}}, +/* 4776 */ {(16<<2)|3,{50,37,115}}, +/* 4777 */ {(16<<2)|3,{50,37,116}}, +/* 4778 */ {(11<<2)|2,{50,37,0}}, +/* 4779 */ {(11<<2)|2,{50,37,0}}, +/* 4780 */ {(11<<2)|2,{50,37,0}}, +/* 4781 */ {(11<<2)|2,{50,37,0}}, +/* 4782 */ {(11<<2)|2,{50,37,0}}, +/* 4783 */ {(11<<2)|2,{50,37,0}}, +/* 4784 */ {(11<<2)|2,{50,37,0}}, +/* 4785 */ {(11<<2)|2,{50,37,0}}, +/* 4786 */ {(11<<2)|2,{50,37,0}}, +/* 4787 */ {(11<<2)|2,{50,37,0}}, +/* 4788 */ {(11<<2)|2,{50,37,0}}, +/* 4789 */ {(11<<2)|2,{50,37,0}}, +/* 4790 */ {(11<<2)|2,{50,37,0}}, +/* 4791 */ {(11<<2)|2,{50,37,0}}, +/* 4792 */ {(11<<2)|2,{50,37,0}}, +/* 4793 */ {(11<<2)|2,{50,37,0}}, +/* 4794 */ {(11<<2)|2,{50,37,0}}, +/* 4795 */ {(11<<2)|2,{50,37,0}}, +/* 4796 */ {(11<<2)|2,{50,37,0}}, +/* 4797 */ {(11<<2)|2,{50,37,0}}, +/* 4798 */ {(11<<2)|2,{50,37,0}}, +/* 4799 */ {(11<<2)|2,{50,37,0}}, +/* 4800 */ {(16<<2)|3,{50,45,48}}, +/* 4801 */ {(16<<2)|3,{50,45,49}}, +/* 4802 */ {(16<<2)|3,{50,45,50}}, +/* 4803 */ {(16<<2)|3,{50,45,97}}, +/* 4804 */ {(16<<2)|3,{50,45,99}}, +/* 4805 */ {(16<<2)|3,{50,45,101}}, +/* 4806 */ {(16<<2)|3,{50,45,105}}, +/* 4807 */ {(16<<2)|3,{50,45,111}}, +/* 4808 */ {(16<<2)|3,{50,45,115}}, +/* 4809 */ {(16<<2)|3,{50,45,116}}, +/* 4810 */ {(11<<2)|2,{50,45,0}}, +/* 4811 */ {(11<<2)|2,{50,45,0}}, +/* 4812 */ {(11<<2)|2,{50,45,0}}, +/* 4813 */ {(11<<2)|2,{50,45,0}}, +/* 4814 */ {(11<<2)|2,{50,45,0}}, +/* 4815 */ {(11<<2)|2,{50,45,0}}, +/* 4816 */ {(11<<2)|2,{50,45,0}}, +/* 4817 */ {(11<<2)|2,{50,45,0}}, +/* 4818 */ {(11<<2)|2,{50,45,0}}, +/* 4819 */ {(11<<2)|2,{50,45,0}}, +/* 4820 */ {(11<<2)|2,{50,45,0}}, +/* 4821 */ {(11<<2)|2,{50,45,0}}, +/* 4822 */ {(11<<2)|2,{50,45,0}}, +/* 4823 */ {(11<<2)|2,{50,45,0}}, +/* 4824 */ {(11<<2)|2,{50,45,0}}, +/* 4825 */ {(11<<2)|2,{50,45,0}}, +/* 4826 */ {(11<<2)|2,{50,45,0}}, +/* 4827 */ {(11<<2)|2,{50,45,0}}, +/* 4828 */ {(11<<2)|2,{50,45,0}}, +/* 4829 */ {(11<<2)|2,{50,45,0}}, +/* 4830 */ {(11<<2)|2,{50,45,0}}, +/* 4831 */ {(11<<2)|2,{50,45,0}}, +/* 4832 */ {(16<<2)|3,{50,46,48}}, +/* 4833 */ {(16<<2)|3,{50,46,49}}, +/* 4834 */ {(16<<2)|3,{50,46,50}}, +/* 4835 */ {(16<<2)|3,{50,46,97}}, +/* 4836 */ {(16<<2)|3,{50,46,99}}, +/* 4837 */ {(16<<2)|3,{50,46,101}}, +/* 4838 */ {(16<<2)|3,{50,46,105}}, +/* 4839 */ {(16<<2)|3,{50,46,111}}, +/* 4840 */ {(16<<2)|3,{50,46,115}}, +/* 4841 */ {(16<<2)|3,{50,46,116}}, +/* 4842 */ {(11<<2)|2,{50,46,0}}, +/* 4843 */ {(11<<2)|2,{50,46,0}}, +/* 4844 */ {(11<<2)|2,{50,46,0}}, +/* 4845 */ {(11<<2)|2,{50,46,0}}, +/* 4846 */ {(11<<2)|2,{50,46,0}}, +/* 4847 */ {(11<<2)|2,{50,46,0}}, +/* 4848 */ {(11<<2)|2,{50,46,0}}, +/* 4849 */ {(11<<2)|2,{50,46,0}}, +/* 4850 */ {(11<<2)|2,{50,46,0}}, +/* 4851 */ {(11<<2)|2,{50,46,0}}, +/* 4852 */ {(11<<2)|2,{50,46,0}}, +/* 4853 */ {(11<<2)|2,{50,46,0}}, +/* 4854 */ {(11<<2)|2,{50,46,0}}, +/* 4855 */ {(11<<2)|2,{50,46,0}}, +/* 4856 */ {(11<<2)|2,{50,46,0}}, +/* 4857 */ {(11<<2)|2,{50,46,0}}, +/* 4858 */ {(11<<2)|2,{50,46,0}}, +/* 4859 */ {(11<<2)|2,{50,46,0}}, +/* 4860 */ {(11<<2)|2,{50,46,0}}, +/* 4861 */ {(11<<2)|2,{50,46,0}}, +/* 4862 */ {(11<<2)|2,{50,46,0}}, +/* 4863 */ {(11<<2)|2,{50,46,0}}, +/* 4864 */ {(16<<2)|3,{50,47,48}}, +/* 4865 */ {(16<<2)|3,{50,47,49}}, +/* 4866 */ {(16<<2)|3,{50,47,50}}, +/* 4867 */ {(16<<2)|3,{50,47,97}}, +/* 4868 */ {(16<<2)|3,{50,47,99}}, +/* 4869 */ {(16<<2)|3,{50,47,101}}, +/* 4870 */ {(16<<2)|3,{50,47,105}}, +/* 4871 */ {(16<<2)|3,{50,47,111}}, +/* 4872 */ {(16<<2)|3,{50,47,115}}, +/* 4873 */ {(16<<2)|3,{50,47,116}}, +/* 4874 */ {(11<<2)|2,{50,47,0}}, +/* 4875 */ {(11<<2)|2,{50,47,0}}, +/* 4876 */ {(11<<2)|2,{50,47,0}}, +/* 4877 */ {(11<<2)|2,{50,47,0}}, +/* 4878 */ {(11<<2)|2,{50,47,0}}, +/* 4879 */ {(11<<2)|2,{50,47,0}}, +/* 4880 */ {(11<<2)|2,{50,47,0}}, +/* 4881 */ {(11<<2)|2,{50,47,0}}, +/* 4882 */ {(11<<2)|2,{50,47,0}}, +/* 4883 */ {(11<<2)|2,{50,47,0}}, +/* 4884 */ {(11<<2)|2,{50,47,0}}, +/* 4885 */ {(11<<2)|2,{50,47,0}}, +/* 4886 */ {(11<<2)|2,{50,47,0}}, +/* 4887 */ {(11<<2)|2,{50,47,0}}, +/* 4888 */ {(11<<2)|2,{50,47,0}}, +/* 4889 */ {(11<<2)|2,{50,47,0}}, +/* 4890 */ {(11<<2)|2,{50,47,0}}, +/* 4891 */ {(11<<2)|2,{50,47,0}}, +/* 4892 */ {(11<<2)|2,{50,47,0}}, +/* 4893 */ {(11<<2)|2,{50,47,0}}, +/* 4894 */ {(11<<2)|2,{50,47,0}}, +/* 4895 */ {(11<<2)|2,{50,47,0}}, +/* 4896 */ {(16<<2)|3,{50,51,48}}, +/* 4897 */ {(16<<2)|3,{50,51,49}}, +/* 4898 */ {(16<<2)|3,{50,51,50}}, +/* 4899 */ {(16<<2)|3,{50,51,97}}, +/* 4900 */ {(16<<2)|3,{50,51,99}}, +/* 4901 */ {(16<<2)|3,{50,51,101}}, +/* 4902 */ {(16<<2)|3,{50,51,105}}, +/* 4903 */ {(16<<2)|3,{50,51,111}}, +/* 4904 */ {(16<<2)|3,{50,51,115}}, +/* 4905 */ {(16<<2)|3,{50,51,116}}, +/* 4906 */ {(11<<2)|2,{50,51,0}}, +/* 4907 */ {(11<<2)|2,{50,51,0}}, +/* 4908 */ {(11<<2)|2,{50,51,0}}, +/* 4909 */ {(11<<2)|2,{50,51,0}}, +/* 4910 */ {(11<<2)|2,{50,51,0}}, +/* 4911 */ {(11<<2)|2,{50,51,0}}, +/* 4912 */ {(11<<2)|2,{50,51,0}}, +/* 4913 */ {(11<<2)|2,{50,51,0}}, +/* 4914 */ {(11<<2)|2,{50,51,0}}, +/* 4915 */ {(11<<2)|2,{50,51,0}}, +/* 4916 */ {(11<<2)|2,{50,51,0}}, +/* 4917 */ {(11<<2)|2,{50,51,0}}, +/* 4918 */ {(11<<2)|2,{50,51,0}}, +/* 4919 */ {(11<<2)|2,{50,51,0}}, +/* 4920 */ {(11<<2)|2,{50,51,0}}, +/* 4921 */ {(11<<2)|2,{50,51,0}}, +/* 4922 */ {(11<<2)|2,{50,51,0}}, +/* 4923 */ {(11<<2)|2,{50,51,0}}, +/* 4924 */ {(11<<2)|2,{50,51,0}}, +/* 4925 */ {(11<<2)|2,{50,51,0}}, +/* 4926 */ {(11<<2)|2,{50,51,0}}, +/* 4927 */ {(11<<2)|2,{50,51,0}}, +/* 4928 */ {(16<<2)|3,{50,52,48}}, +/* 4929 */ {(16<<2)|3,{50,52,49}}, +/* 4930 */ {(16<<2)|3,{50,52,50}}, +/* 4931 */ {(16<<2)|3,{50,52,97}}, +/* 4932 */ {(16<<2)|3,{50,52,99}}, +/* 4933 */ {(16<<2)|3,{50,52,101}}, +/* 4934 */ {(16<<2)|3,{50,52,105}}, +/* 4935 */ {(16<<2)|3,{50,52,111}}, +/* 4936 */ {(16<<2)|3,{50,52,115}}, +/* 4937 */ {(16<<2)|3,{50,52,116}}, +/* 4938 */ {(11<<2)|2,{50,52,0}}, +/* 4939 */ {(11<<2)|2,{50,52,0}}, +/* 4940 */ {(11<<2)|2,{50,52,0}}, +/* 4941 */ {(11<<2)|2,{50,52,0}}, +/* 4942 */ {(11<<2)|2,{50,52,0}}, +/* 4943 */ {(11<<2)|2,{50,52,0}}, +/* 4944 */ {(11<<2)|2,{50,52,0}}, +/* 4945 */ {(11<<2)|2,{50,52,0}}, +/* 4946 */ {(11<<2)|2,{50,52,0}}, +/* 4947 */ {(11<<2)|2,{50,52,0}}, +/* 4948 */ {(11<<2)|2,{50,52,0}}, +/* 4949 */ {(11<<2)|2,{50,52,0}}, +/* 4950 */ {(11<<2)|2,{50,52,0}}, +/* 4951 */ {(11<<2)|2,{50,52,0}}, +/* 4952 */ {(11<<2)|2,{50,52,0}}, +/* 4953 */ {(11<<2)|2,{50,52,0}}, +/* 4954 */ {(11<<2)|2,{50,52,0}}, +/* 4955 */ {(11<<2)|2,{50,52,0}}, +/* 4956 */ {(11<<2)|2,{50,52,0}}, +/* 4957 */ {(11<<2)|2,{50,52,0}}, +/* 4958 */ {(11<<2)|2,{50,52,0}}, +/* 4959 */ {(11<<2)|2,{50,52,0}}, +/* 4960 */ {(16<<2)|3,{50,53,48}}, +/* 4961 */ {(16<<2)|3,{50,53,49}}, +/* 4962 */ {(16<<2)|3,{50,53,50}}, +/* 4963 */ {(16<<2)|3,{50,53,97}}, +/* 4964 */ {(16<<2)|3,{50,53,99}}, +/* 4965 */ {(16<<2)|3,{50,53,101}}, +/* 4966 */ {(16<<2)|3,{50,53,105}}, +/* 4967 */ {(16<<2)|3,{50,53,111}}, +/* 4968 */ {(16<<2)|3,{50,53,115}}, +/* 4969 */ {(16<<2)|3,{50,53,116}}, +/* 4970 */ {(11<<2)|2,{50,53,0}}, +/* 4971 */ {(11<<2)|2,{50,53,0}}, +/* 4972 */ {(11<<2)|2,{50,53,0}}, +/* 4973 */ {(11<<2)|2,{50,53,0}}, +/* 4974 */ {(11<<2)|2,{50,53,0}}, +/* 4975 */ {(11<<2)|2,{50,53,0}}, +/* 4976 */ {(11<<2)|2,{50,53,0}}, +/* 4977 */ {(11<<2)|2,{50,53,0}}, +/* 4978 */ {(11<<2)|2,{50,53,0}}, +/* 4979 */ {(11<<2)|2,{50,53,0}}, +/* 4980 */ {(11<<2)|2,{50,53,0}}, +/* 4981 */ {(11<<2)|2,{50,53,0}}, +/* 4982 */ {(11<<2)|2,{50,53,0}}, +/* 4983 */ {(11<<2)|2,{50,53,0}}, +/* 4984 */ {(11<<2)|2,{50,53,0}}, +/* 4985 */ {(11<<2)|2,{50,53,0}}, +/* 4986 */ {(11<<2)|2,{50,53,0}}, +/* 4987 */ {(11<<2)|2,{50,53,0}}, +/* 4988 */ {(11<<2)|2,{50,53,0}}, +/* 4989 */ {(11<<2)|2,{50,53,0}}, +/* 4990 */ {(11<<2)|2,{50,53,0}}, +/* 4991 */ {(11<<2)|2,{50,53,0}}, +/* 4992 */ {(16<<2)|3,{50,54,48}}, +/* 4993 */ {(16<<2)|3,{50,54,49}}, +/* 4994 */ {(16<<2)|3,{50,54,50}}, +/* 4995 */ {(16<<2)|3,{50,54,97}}, +/* 4996 */ {(16<<2)|3,{50,54,99}}, +/* 4997 */ {(16<<2)|3,{50,54,101}}, +/* 4998 */ {(16<<2)|3,{50,54,105}}, +/* 4999 */ {(16<<2)|3,{50,54,111}}, +/* 5000 */ {(16<<2)|3,{50,54,115}}, +/* 5001 */ {(16<<2)|3,{50,54,116}}, +/* 5002 */ {(11<<2)|2,{50,54,0}}, +/* 5003 */ {(11<<2)|2,{50,54,0}}, +/* 5004 */ {(11<<2)|2,{50,54,0}}, +/* 5005 */ {(11<<2)|2,{50,54,0}}, +/* 5006 */ {(11<<2)|2,{50,54,0}}, +/* 5007 */ {(11<<2)|2,{50,54,0}}, +/* 5008 */ {(11<<2)|2,{50,54,0}}, +/* 5009 */ {(11<<2)|2,{50,54,0}}, +/* 5010 */ {(11<<2)|2,{50,54,0}}, +/* 5011 */ {(11<<2)|2,{50,54,0}}, +/* 5012 */ {(11<<2)|2,{50,54,0}}, +/* 5013 */ {(11<<2)|2,{50,54,0}}, +/* 5014 */ {(11<<2)|2,{50,54,0}}, +/* 5015 */ {(11<<2)|2,{50,54,0}}, +/* 5016 */ {(11<<2)|2,{50,54,0}}, +/* 5017 */ {(11<<2)|2,{50,54,0}}, +/* 5018 */ {(11<<2)|2,{50,54,0}}, +/* 5019 */ {(11<<2)|2,{50,54,0}}, +/* 5020 */ {(11<<2)|2,{50,54,0}}, +/* 5021 */ {(11<<2)|2,{50,54,0}}, +/* 5022 */ {(11<<2)|2,{50,54,0}}, +/* 5023 */ {(11<<2)|2,{50,54,0}}, +/* 5024 */ {(16<<2)|3,{50,55,48}}, +/* 5025 */ {(16<<2)|3,{50,55,49}}, +/* 5026 */ {(16<<2)|3,{50,55,50}}, +/* 5027 */ {(16<<2)|3,{50,55,97}}, +/* 5028 */ {(16<<2)|3,{50,55,99}}, +/* 5029 */ {(16<<2)|3,{50,55,101}}, +/* 5030 */ {(16<<2)|3,{50,55,105}}, +/* 5031 */ {(16<<2)|3,{50,55,111}}, +/* 5032 */ {(16<<2)|3,{50,55,115}}, +/* 5033 */ {(16<<2)|3,{50,55,116}}, +/* 5034 */ {(11<<2)|2,{50,55,0}}, +/* 5035 */ {(11<<2)|2,{50,55,0}}, +/* 5036 */ {(11<<2)|2,{50,55,0}}, +/* 5037 */ {(11<<2)|2,{50,55,0}}, +/* 5038 */ {(11<<2)|2,{50,55,0}}, +/* 5039 */ {(11<<2)|2,{50,55,0}}, +/* 5040 */ {(11<<2)|2,{50,55,0}}, +/* 5041 */ {(11<<2)|2,{50,55,0}}, +/* 5042 */ {(11<<2)|2,{50,55,0}}, +/* 5043 */ {(11<<2)|2,{50,55,0}}, +/* 5044 */ {(11<<2)|2,{50,55,0}}, +/* 5045 */ {(11<<2)|2,{50,55,0}}, +/* 5046 */ {(11<<2)|2,{50,55,0}}, +/* 5047 */ {(11<<2)|2,{50,55,0}}, +/* 5048 */ {(11<<2)|2,{50,55,0}}, +/* 5049 */ {(11<<2)|2,{50,55,0}}, +/* 5050 */ {(11<<2)|2,{50,55,0}}, +/* 5051 */ {(11<<2)|2,{50,55,0}}, +/* 5052 */ {(11<<2)|2,{50,55,0}}, +/* 5053 */ {(11<<2)|2,{50,55,0}}, +/* 5054 */ {(11<<2)|2,{50,55,0}}, +/* 5055 */ {(11<<2)|2,{50,55,0}}, +/* 5056 */ {(16<<2)|3,{50,56,48}}, +/* 5057 */ {(16<<2)|3,{50,56,49}}, +/* 5058 */ {(16<<2)|3,{50,56,50}}, +/* 5059 */ {(16<<2)|3,{50,56,97}}, +/* 5060 */ {(16<<2)|3,{50,56,99}}, +/* 5061 */ {(16<<2)|3,{50,56,101}}, +/* 5062 */ {(16<<2)|3,{50,56,105}}, +/* 5063 */ {(16<<2)|3,{50,56,111}}, +/* 5064 */ {(16<<2)|3,{50,56,115}}, +/* 5065 */ {(16<<2)|3,{50,56,116}}, +/* 5066 */ {(11<<2)|2,{50,56,0}}, +/* 5067 */ {(11<<2)|2,{50,56,0}}, +/* 5068 */ {(11<<2)|2,{50,56,0}}, +/* 5069 */ {(11<<2)|2,{50,56,0}}, +/* 5070 */ {(11<<2)|2,{50,56,0}}, +/* 5071 */ {(11<<2)|2,{50,56,0}}, +/* 5072 */ {(11<<2)|2,{50,56,0}}, +/* 5073 */ {(11<<2)|2,{50,56,0}}, +/* 5074 */ {(11<<2)|2,{50,56,0}}, +/* 5075 */ {(11<<2)|2,{50,56,0}}, +/* 5076 */ {(11<<2)|2,{50,56,0}}, +/* 5077 */ {(11<<2)|2,{50,56,0}}, +/* 5078 */ {(11<<2)|2,{50,56,0}}, +/* 5079 */ {(11<<2)|2,{50,56,0}}, +/* 5080 */ {(11<<2)|2,{50,56,0}}, +/* 5081 */ {(11<<2)|2,{50,56,0}}, +/* 5082 */ {(11<<2)|2,{50,56,0}}, +/* 5083 */ {(11<<2)|2,{50,56,0}}, +/* 5084 */ {(11<<2)|2,{50,56,0}}, +/* 5085 */ {(11<<2)|2,{50,56,0}}, +/* 5086 */ {(11<<2)|2,{50,56,0}}, +/* 5087 */ {(11<<2)|2,{50,56,0}}, +/* 5088 */ {(16<<2)|3,{50,57,48}}, +/* 5089 */ {(16<<2)|3,{50,57,49}}, +/* 5090 */ {(16<<2)|3,{50,57,50}}, +/* 5091 */ {(16<<2)|3,{50,57,97}}, +/* 5092 */ {(16<<2)|3,{50,57,99}}, +/* 5093 */ {(16<<2)|3,{50,57,101}}, +/* 5094 */ {(16<<2)|3,{50,57,105}}, +/* 5095 */ {(16<<2)|3,{50,57,111}}, +/* 5096 */ {(16<<2)|3,{50,57,115}}, +/* 5097 */ {(16<<2)|3,{50,57,116}}, +/* 5098 */ {(11<<2)|2,{50,57,0}}, +/* 5099 */ {(11<<2)|2,{50,57,0}}, +/* 5100 */ {(11<<2)|2,{50,57,0}}, +/* 5101 */ {(11<<2)|2,{50,57,0}}, +/* 5102 */ {(11<<2)|2,{50,57,0}}, +/* 5103 */ {(11<<2)|2,{50,57,0}}, +/* 5104 */ {(11<<2)|2,{50,57,0}}, +/* 5105 */ {(11<<2)|2,{50,57,0}}, +/* 5106 */ {(11<<2)|2,{50,57,0}}, +/* 5107 */ {(11<<2)|2,{50,57,0}}, +/* 5108 */ {(11<<2)|2,{50,57,0}}, +/* 5109 */ {(11<<2)|2,{50,57,0}}, +/* 5110 */ {(11<<2)|2,{50,57,0}}, +/* 5111 */ {(11<<2)|2,{50,57,0}}, +/* 5112 */ {(11<<2)|2,{50,57,0}}, +/* 5113 */ {(11<<2)|2,{50,57,0}}, +/* 5114 */ {(11<<2)|2,{50,57,0}}, +/* 5115 */ {(11<<2)|2,{50,57,0}}, +/* 5116 */ {(11<<2)|2,{50,57,0}}, +/* 5117 */ {(11<<2)|2,{50,57,0}}, +/* 5118 */ {(11<<2)|2,{50,57,0}}, +/* 5119 */ {(11<<2)|2,{50,57,0}}, +/* 5120 */ {(16<<2)|3,{50,61,48}}, +/* 5121 */ {(16<<2)|3,{50,61,49}}, +/* 5122 */ {(16<<2)|3,{50,61,50}}, +/* 5123 */ {(16<<2)|3,{50,61,97}}, +/* 5124 */ {(16<<2)|3,{50,61,99}}, +/* 5125 */ {(16<<2)|3,{50,61,101}}, +/* 5126 */ {(16<<2)|3,{50,61,105}}, +/* 5127 */ {(16<<2)|3,{50,61,111}}, +/* 5128 */ {(16<<2)|3,{50,61,115}}, +/* 5129 */ {(16<<2)|3,{50,61,116}}, +/* 5130 */ {(11<<2)|2,{50,61,0}}, +/* 5131 */ {(11<<2)|2,{50,61,0}}, +/* 5132 */ {(11<<2)|2,{50,61,0}}, +/* 5133 */ {(11<<2)|2,{50,61,0}}, +/* 5134 */ {(11<<2)|2,{50,61,0}}, +/* 5135 */ {(11<<2)|2,{50,61,0}}, +/* 5136 */ {(11<<2)|2,{50,61,0}}, +/* 5137 */ {(11<<2)|2,{50,61,0}}, +/* 5138 */ {(11<<2)|2,{50,61,0}}, +/* 5139 */ {(11<<2)|2,{50,61,0}}, +/* 5140 */ {(11<<2)|2,{50,61,0}}, +/* 5141 */ {(11<<2)|2,{50,61,0}}, +/* 5142 */ {(11<<2)|2,{50,61,0}}, +/* 5143 */ {(11<<2)|2,{50,61,0}}, +/* 5144 */ {(11<<2)|2,{50,61,0}}, +/* 5145 */ {(11<<2)|2,{50,61,0}}, +/* 5146 */ {(11<<2)|2,{50,61,0}}, +/* 5147 */ {(11<<2)|2,{50,61,0}}, +/* 5148 */ {(11<<2)|2,{50,61,0}}, +/* 5149 */ {(11<<2)|2,{50,61,0}}, +/* 5150 */ {(11<<2)|2,{50,61,0}}, +/* 5151 */ {(11<<2)|2,{50,61,0}}, +/* 5152 */ {(16<<2)|3,{50,65,48}}, +/* 5153 */ {(16<<2)|3,{50,65,49}}, +/* 5154 */ {(16<<2)|3,{50,65,50}}, +/* 5155 */ {(16<<2)|3,{50,65,97}}, +/* 5156 */ {(16<<2)|3,{50,65,99}}, +/* 5157 */ {(16<<2)|3,{50,65,101}}, +/* 5158 */ {(16<<2)|3,{50,65,105}}, +/* 5159 */ {(16<<2)|3,{50,65,111}}, +/* 5160 */ {(16<<2)|3,{50,65,115}}, +/* 5161 */ {(16<<2)|3,{50,65,116}}, +/* 5162 */ {(11<<2)|2,{50,65,0}}, +/* 5163 */ {(11<<2)|2,{50,65,0}}, +/* 5164 */ {(11<<2)|2,{50,65,0}}, +/* 5165 */ {(11<<2)|2,{50,65,0}}, +/* 5166 */ {(11<<2)|2,{50,65,0}}, +/* 5167 */ {(11<<2)|2,{50,65,0}}, +/* 5168 */ {(11<<2)|2,{50,65,0}}, +/* 5169 */ {(11<<2)|2,{50,65,0}}, +/* 5170 */ {(11<<2)|2,{50,65,0}}, +/* 5171 */ {(11<<2)|2,{50,65,0}}, +/* 5172 */ {(11<<2)|2,{50,65,0}}, +/* 5173 */ {(11<<2)|2,{50,65,0}}, +/* 5174 */ {(11<<2)|2,{50,65,0}}, +/* 5175 */ {(11<<2)|2,{50,65,0}}, +/* 5176 */ {(11<<2)|2,{50,65,0}}, +/* 5177 */ {(11<<2)|2,{50,65,0}}, +/* 5178 */ {(11<<2)|2,{50,65,0}}, +/* 5179 */ {(11<<2)|2,{50,65,0}}, +/* 5180 */ {(11<<2)|2,{50,65,0}}, +/* 5181 */ {(11<<2)|2,{50,65,0}}, +/* 5182 */ {(11<<2)|2,{50,65,0}}, +/* 5183 */ {(11<<2)|2,{50,65,0}}, +/* 5184 */ {(16<<2)|3,{50,95,48}}, +/* 5185 */ {(16<<2)|3,{50,95,49}}, +/* 5186 */ {(16<<2)|3,{50,95,50}}, +/* 5187 */ {(16<<2)|3,{50,95,97}}, +/* 5188 */ {(16<<2)|3,{50,95,99}}, +/* 5189 */ {(16<<2)|3,{50,95,101}}, +/* 5190 */ {(16<<2)|3,{50,95,105}}, +/* 5191 */ {(16<<2)|3,{50,95,111}}, +/* 5192 */ {(16<<2)|3,{50,95,115}}, +/* 5193 */ {(16<<2)|3,{50,95,116}}, +/* 5194 */ {(11<<2)|2,{50,95,0}}, +/* 5195 */ {(11<<2)|2,{50,95,0}}, +/* 5196 */ {(11<<2)|2,{50,95,0}}, +/* 5197 */ {(11<<2)|2,{50,95,0}}, +/* 5198 */ {(11<<2)|2,{50,95,0}}, +/* 5199 */ {(11<<2)|2,{50,95,0}}, +/* 5200 */ {(11<<2)|2,{50,95,0}}, +/* 5201 */ {(11<<2)|2,{50,95,0}}, +/* 5202 */ {(11<<2)|2,{50,95,0}}, +/* 5203 */ {(11<<2)|2,{50,95,0}}, +/* 5204 */ {(11<<2)|2,{50,95,0}}, +/* 5205 */ {(11<<2)|2,{50,95,0}}, +/* 5206 */ {(11<<2)|2,{50,95,0}}, +/* 5207 */ {(11<<2)|2,{50,95,0}}, +/* 5208 */ {(11<<2)|2,{50,95,0}}, +/* 5209 */ {(11<<2)|2,{50,95,0}}, +/* 5210 */ {(11<<2)|2,{50,95,0}}, +/* 5211 */ {(11<<2)|2,{50,95,0}}, +/* 5212 */ {(11<<2)|2,{50,95,0}}, +/* 5213 */ {(11<<2)|2,{50,95,0}}, +/* 5214 */ {(11<<2)|2,{50,95,0}}, +/* 5215 */ {(11<<2)|2,{50,95,0}}, +/* 5216 */ {(16<<2)|3,{50,98,48}}, +/* 5217 */ {(16<<2)|3,{50,98,49}}, +/* 5218 */ {(16<<2)|3,{50,98,50}}, +/* 5219 */ {(16<<2)|3,{50,98,97}}, +/* 5220 */ {(16<<2)|3,{50,98,99}}, +/* 5221 */ {(16<<2)|3,{50,98,101}}, +/* 5222 */ {(16<<2)|3,{50,98,105}}, +/* 5223 */ {(16<<2)|3,{50,98,111}}, +/* 5224 */ {(16<<2)|3,{50,98,115}}, +/* 5225 */ {(16<<2)|3,{50,98,116}}, +/* 5226 */ {(11<<2)|2,{50,98,0}}, +/* 5227 */ {(11<<2)|2,{50,98,0}}, +/* 5228 */ {(11<<2)|2,{50,98,0}}, +/* 5229 */ {(11<<2)|2,{50,98,0}}, +/* 5230 */ {(11<<2)|2,{50,98,0}}, +/* 5231 */ {(11<<2)|2,{50,98,0}}, +/* 5232 */ {(11<<2)|2,{50,98,0}}, +/* 5233 */ {(11<<2)|2,{50,98,0}}, +/* 5234 */ {(11<<2)|2,{50,98,0}}, +/* 5235 */ {(11<<2)|2,{50,98,0}}, +/* 5236 */ {(11<<2)|2,{50,98,0}}, +/* 5237 */ {(11<<2)|2,{50,98,0}}, +/* 5238 */ {(11<<2)|2,{50,98,0}}, +/* 5239 */ {(11<<2)|2,{50,98,0}}, +/* 5240 */ {(11<<2)|2,{50,98,0}}, +/* 5241 */ {(11<<2)|2,{50,98,0}}, +/* 5242 */ {(11<<2)|2,{50,98,0}}, +/* 5243 */ {(11<<2)|2,{50,98,0}}, +/* 5244 */ {(11<<2)|2,{50,98,0}}, +/* 5245 */ {(11<<2)|2,{50,98,0}}, +/* 5246 */ {(11<<2)|2,{50,98,0}}, +/* 5247 */ {(11<<2)|2,{50,98,0}}, +/* 5248 */ {(16<<2)|3,{50,100,48}}, +/* 5249 */ {(16<<2)|3,{50,100,49}}, +/* 5250 */ {(16<<2)|3,{50,100,50}}, +/* 5251 */ {(16<<2)|3,{50,100,97}}, +/* 5252 */ {(16<<2)|3,{50,100,99}}, +/* 5253 */ {(16<<2)|3,{50,100,101}}, +/* 5254 */ {(16<<2)|3,{50,100,105}}, +/* 5255 */ {(16<<2)|3,{50,100,111}}, +/* 5256 */ {(16<<2)|3,{50,100,115}}, +/* 5257 */ {(16<<2)|3,{50,100,116}}, +/* 5258 */ {(11<<2)|2,{50,100,0}}, +/* 5259 */ {(11<<2)|2,{50,100,0}}, +/* 5260 */ {(11<<2)|2,{50,100,0}}, +/* 5261 */ {(11<<2)|2,{50,100,0}}, +/* 5262 */ {(11<<2)|2,{50,100,0}}, +/* 5263 */ {(11<<2)|2,{50,100,0}}, +/* 5264 */ {(11<<2)|2,{50,100,0}}, +/* 5265 */ {(11<<2)|2,{50,100,0}}, +/* 5266 */ {(11<<2)|2,{50,100,0}}, +/* 5267 */ {(11<<2)|2,{50,100,0}}, +/* 5268 */ {(11<<2)|2,{50,100,0}}, +/* 5269 */ {(11<<2)|2,{50,100,0}}, +/* 5270 */ {(11<<2)|2,{50,100,0}}, +/* 5271 */ {(11<<2)|2,{50,100,0}}, +/* 5272 */ {(11<<2)|2,{50,100,0}}, +/* 5273 */ {(11<<2)|2,{50,100,0}}, +/* 5274 */ {(11<<2)|2,{50,100,0}}, +/* 5275 */ {(11<<2)|2,{50,100,0}}, +/* 5276 */ {(11<<2)|2,{50,100,0}}, +/* 5277 */ {(11<<2)|2,{50,100,0}}, +/* 5278 */ {(11<<2)|2,{50,100,0}}, +/* 5279 */ {(11<<2)|2,{50,100,0}}, +/* 5280 */ {(16<<2)|3,{50,102,48}}, +/* 5281 */ {(16<<2)|3,{50,102,49}}, +/* 5282 */ {(16<<2)|3,{50,102,50}}, +/* 5283 */ {(16<<2)|3,{50,102,97}}, +/* 5284 */ {(16<<2)|3,{50,102,99}}, +/* 5285 */ {(16<<2)|3,{50,102,101}}, +/* 5286 */ {(16<<2)|3,{50,102,105}}, +/* 5287 */ {(16<<2)|3,{50,102,111}}, +/* 5288 */ {(16<<2)|3,{50,102,115}}, +/* 5289 */ {(16<<2)|3,{50,102,116}}, +/* 5290 */ {(11<<2)|2,{50,102,0}}, +/* 5291 */ {(11<<2)|2,{50,102,0}}, +/* 5292 */ {(11<<2)|2,{50,102,0}}, +/* 5293 */ {(11<<2)|2,{50,102,0}}, +/* 5294 */ {(11<<2)|2,{50,102,0}}, +/* 5295 */ {(11<<2)|2,{50,102,0}}, +/* 5296 */ {(11<<2)|2,{50,102,0}}, +/* 5297 */ {(11<<2)|2,{50,102,0}}, +/* 5298 */ {(11<<2)|2,{50,102,0}}, +/* 5299 */ {(11<<2)|2,{50,102,0}}, +/* 5300 */ {(11<<2)|2,{50,102,0}}, +/* 5301 */ {(11<<2)|2,{50,102,0}}, +/* 5302 */ {(11<<2)|2,{50,102,0}}, +/* 5303 */ {(11<<2)|2,{50,102,0}}, +/* 5304 */ {(11<<2)|2,{50,102,0}}, +/* 5305 */ {(11<<2)|2,{50,102,0}}, +/* 5306 */ {(11<<2)|2,{50,102,0}}, +/* 5307 */ {(11<<2)|2,{50,102,0}}, +/* 5308 */ {(11<<2)|2,{50,102,0}}, +/* 5309 */ {(11<<2)|2,{50,102,0}}, +/* 5310 */ {(11<<2)|2,{50,102,0}}, +/* 5311 */ {(11<<2)|2,{50,102,0}}, +/* 5312 */ {(16<<2)|3,{50,103,48}}, +/* 5313 */ {(16<<2)|3,{50,103,49}}, +/* 5314 */ {(16<<2)|3,{50,103,50}}, +/* 5315 */ {(16<<2)|3,{50,103,97}}, +/* 5316 */ {(16<<2)|3,{50,103,99}}, +/* 5317 */ {(16<<2)|3,{50,103,101}}, +/* 5318 */ {(16<<2)|3,{50,103,105}}, +/* 5319 */ {(16<<2)|3,{50,103,111}}, +/* 5320 */ {(16<<2)|3,{50,103,115}}, +/* 5321 */ {(16<<2)|3,{50,103,116}}, +/* 5322 */ {(11<<2)|2,{50,103,0}}, +/* 5323 */ {(11<<2)|2,{50,103,0}}, +/* 5324 */ {(11<<2)|2,{50,103,0}}, +/* 5325 */ {(11<<2)|2,{50,103,0}}, +/* 5326 */ {(11<<2)|2,{50,103,0}}, +/* 5327 */ {(11<<2)|2,{50,103,0}}, +/* 5328 */ {(11<<2)|2,{50,103,0}}, +/* 5329 */ {(11<<2)|2,{50,103,0}}, +/* 5330 */ {(11<<2)|2,{50,103,0}}, +/* 5331 */ {(11<<2)|2,{50,103,0}}, +/* 5332 */ {(11<<2)|2,{50,103,0}}, +/* 5333 */ {(11<<2)|2,{50,103,0}}, +/* 5334 */ {(11<<2)|2,{50,103,0}}, +/* 5335 */ {(11<<2)|2,{50,103,0}}, +/* 5336 */ {(11<<2)|2,{50,103,0}}, +/* 5337 */ {(11<<2)|2,{50,103,0}}, +/* 5338 */ {(11<<2)|2,{50,103,0}}, +/* 5339 */ {(11<<2)|2,{50,103,0}}, +/* 5340 */ {(11<<2)|2,{50,103,0}}, +/* 5341 */ {(11<<2)|2,{50,103,0}}, +/* 5342 */ {(11<<2)|2,{50,103,0}}, +/* 5343 */ {(11<<2)|2,{50,103,0}}, +/* 5344 */ {(16<<2)|3,{50,104,48}}, +/* 5345 */ {(16<<2)|3,{50,104,49}}, +/* 5346 */ {(16<<2)|3,{50,104,50}}, +/* 5347 */ {(16<<2)|3,{50,104,97}}, +/* 5348 */ {(16<<2)|3,{50,104,99}}, +/* 5349 */ {(16<<2)|3,{50,104,101}}, +/* 5350 */ {(16<<2)|3,{50,104,105}}, +/* 5351 */ {(16<<2)|3,{50,104,111}}, +/* 5352 */ {(16<<2)|3,{50,104,115}}, +/* 5353 */ {(16<<2)|3,{50,104,116}}, +/* 5354 */ {(11<<2)|2,{50,104,0}}, +/* 5355 */ {(11<<2)|2,{50,104,0}}, +/* 5356 */ {(11<<2)|2,{50,104,0}}, +/* 5357 */ {(11<<2)|2,{50,104,0}}, +/* 5358 */ {(11<<2)|2,{50,104,0}}, +/* 5359 */ {(11<<2)|2,{50,104,0}}, +/* 5360 */ {(11<<2)|2,{50,104,0}}, +/* 5361 */ {(11<<2)|2,{50,104,0}}, +/* 5362 */ {(11<<2)|2,{50,104,0}}, +/* 5363 */ {(11<<2)|2,{50,104,0}}, +/* 5364 */ {(11<<2)|2,{50,104,0}}, +/* 5365 */ {(11<<2)|2,{50,104,0}}, +/* 5366 */ {(11<<2)|2,{50,104,0}}, +/* 5367 */ {(11<<2)|2,{50,104,0}}, +/* 5368 */ {(11<<2)|2,{50,104,0}}, +/* 5369 */ {(11<<2)|2,{50,104,0}}, +/* 5370 */ {(11<<2)|2,{50,104,0}}, +/* 5371 */ {(11<<2)|2,{50,104,0}}, +/* 5372 */ {(11<<2)|2,{50,104,0}}, +/* 5373 */ {(11<<2)|2,{50,104,0}}, +/* 5374 */ {(11<<2)|2,{50,104,0}}, +/* 5375 */ {(11<<2)|2,{50,104,0}}, +/* 5376 */ {(16<<2)|3,{50,108,48}}, +/* 5377 */ {(16<<2)|3,{50,108,49}}, +/* 5378 */ {(16<<2)|3,{50,108,50}}, +/* 5379 */ {(16<<2)|3,{50,108,97}}, +/* 5380 */ {(16<<2)|3,{50,108,99}}, +/* 5381 */ {(16<<2)|3,{50,108,101}}, +/* 5382 */ {(16<<2)|3,{50,108,105}}, +/* 5383 */ {(16<<2)|3,{50,108,111}}, +/* 5384 */ {(16<<2)|3,{50,108,115}}, +/* 5385 */ {(16<<2)|3,{50,108,116}}, +/* 5386 */ {(11<<2)|2,{50,108,0}}, +/* 5387 */ {(11<<2)|2,{50,108,0}}, +/* 5388 */ {(11<<2)|2,{50,108,0}}, +/* 5389 */ {(11<<2)|2,{50,108,0}}, +/* 5390 */ {(11<<2)|2,{50,108,0}}, +/* 5391 */ {(11<<2)|2,{50,108,0}}, +/* 5392 */ {(11<<2)|2,{50,108,0}}, +/* 5393 */ {(11<<2)|2,{50,108,0}}, +/* 5394 */ {(11<<2)|2,{50,108,0}}, +/* 5395 */ {(11<<2)|2,{50,108,0}}, +/* 5396 */ {(11<<2)|2,{50,108,0}}, +/* 5397 */ {(11<<2)|2,{50,108,0}}, +/* 5398 */ {(11<<2)|2,{50,108,0}}, +/* 5399 */ {(11<<2)|2,{50,108,0}}, +/* 5400 */ {(11<<2)|2,{50,108,0}}, +/* 5401 */ {(11<<2)|2,{50,108,0}}, +/* 5402 */ {(11<<2)|2,{50,108,0}}, +/* 5403 */ {(11<<2)|2,{50,108,0}}, +/* 5404 */ {(11<<2)|2,{50,108,0}}, +/* 5405 */ {(11<<2)|2,{50,108,0}}, +/* 5406 */ {(11<<2)|2,{50,108,0}}, +/* 5407 */ {(11<<2)|2,{50,108,0}}, +/* 5408 */ {(16<<2)|3,{50,109,48}}, +/* 5409 */ {(16<<2)|3,{50,109,49}}, +/* 5410 */ {(16<<2)|3,{50,109,50}}, +/* 5411 */ {(16<<2)|3,{50,109,97}}, +/* 5412 */ {(16<<2)|3,{50,109,99}}, +/* 5413 */ {(16<<2)|3,{50,109,101}}, +/* 5414 */ {(16<<2)|3,{50,109,105}}, +/* 5415 */ {(16<<2)|3,{50,109,111}}, +/* 5416 */ {(16<<2)|3,{50,109,115}}, +/* 5417 */ {(16<<2)|3,{50,109,116}}, +/* 5418 */ {(11<<2)|2,{50,109,0}}, +/* 5419 */ {(11<<2)|2,{50,109,0}}, +/* 5420 */ {(11<<2)|2,{50,109,0}}, +/* 5421 */ {(11<<2)|2,{50,109,0}}, +/* 5422 */ {(11<<2)|2,{50,109,0}}, +/* 5423 */ {(11<<2)|2,{50,109,0}}, +/* 5424 */ {(11<<2)|2,{50,109,0}}, +/* 5425 */ {(11<<2)|2,{50,109,0}}, +/* 5426 */ {(11<<2)|2,{50,109,0}}, +/* 5427 */ {(11<<2)|2,{50,109,0}}, +/* 5428 */ {(11<<2)|2,{50,109,0}}, +/* 5429 */ {(11<<2)|2,{50,109,0}}, +/* 5430 */ {(11<<2)|2,{50,109,0}}, +/* 5431 */ {(11<<2)|2,{50,109,0}}, +/* 5432 */ {(11<<2)|2,{50,109,0}}, +/* 5433 */ {(11<<2)|2,{50,109,0}}, +/* 5434 */ {(11<<2)|2,{50,109,0}}, +/* 5435 */ {(11<<2)|2,{50,109,0}}, +/* 5436 */ {(11<<2)|2,{50,109,0}}, +/* 5437 */ {(11<<2)|2,{50,109,0}}, +/* 5438 */ {(11<<2)|2,{50,109,0}}, +/* 5439 */ {(11<<2)|2,{50,109,0}}, +/* 5440 */ {(16<<2)|3,{50,110,48}}, +/* 5441 */ {(16<<2)|3,{50,110,49}}, +/* 5442 */ {(16<<2)|3,{50,110,50}}, +/* 5443 */ {(16<<2)|3,{50,110,97}}, +/* 5444 */ {(16<<2)|3,{50,110,99}}, +/* 5445 */ {(16<<2)|3,{50,110,101}}, +/* 5446 */ {(16<<2)|3,{50,110,105}}, +/* 5447 */ {(16<<2)|3,{50,110,111}}, +/* 5448 */ {(16<<2)|3,{50,110,115}}, +/* 5449 */ {(16<<2)|3,{50,110,116}}, +/* 5450 */ {(11<<2)|2,{50,110,0}}, +/* 5451 */ {(11<<2)|2,{50,110,0}}, +/* 5452 */ {(11<<2)|2,{50,110,0}}, +/* 5453 */ {(11<<2)|2,{50,110,0}}, +/* 5454 */ {(11<<2)|2,{50,110,0}}, +/* 5455 */ {(11<<2)|2,{50,110,0}}, +/* 5456 */ {(11<<2)|2,{50,110,0}}, +/* 5457 */ {(11<<2)|2,{50,110,0}}, +/* 5458 */ {(11<<2)|2,{50,110,0}}, +/* 5459 */ {(11<<2)|2,{50,110,0}}, +/* 5460 */ {(11<<2)|2,{50,110,0}}, +/* 5461 */ {(11<<2)|2,{50,110,0}}, +/* 5462 */ {(11<<2)|2,{50,110,0}}, +/* 5463 */ {(11<<2)|2,{50,110,0}}, +/* 5464 */ {(11<<2)|2,{50,110,0}}, +/* 5465 */ {(11<<2)|2,{50,110,0}}, +/* 5466 */ {(11<<2)|2,{50,110,0}}, +/* 5467 */ {(11<<2)|2,{50,110,0}}, +/* 5468 */ {(11<<2)|2,{50,110,0}}, +/* 5469 */ {(11<<2)|2,{50,110,0}}, +/* 5470 */ {(11<<2)|2,{50,110,0}}, +/* 5471 */ {(11<<2)|2,{50,110,0}}, +/* 5472 */ {(16<<2)|3,{50,112,48}}, +/* 5473 */ {(16<<2)|3,{50,112,49}}, +/* 5474 */ {(16<<2)|3,{50,112,50}}, +/* 5475 */ {(16<<2)|3,{50,112,97}}, +/* 5476 */ {(16<<2)|3,{50,112,99}}, +/* 5477 */ {(16<<2)|3,{50,112,101}}, +/* 5478 */ {(16<<2)|3,{50,112,105}}, +/* 5479 */ {(16<<2)|3,{50,112,111}}, +/* 5480 */ {(16<<2)|3,{50,112,115}}, +/* 5481 */ {(16<<2)|3,{50,112,116}}, +/* 5482 */ {(11<<2)|2,{50,112,0}}, +/* 5483 */ {(11<<2)|2,{50,112,0}}, +/* 5484 */ {(11<<2)|2,{50,112,0}}, +/* 5485 */ {(11<<2)|2,{50,112,0}}, +/* 5486 */ {(11<<2)|2,{50,112,0}}, +/* 5487 */ {(11<<2)|2,{50,112,0}}, +/* 5488 */ {(11<<2)|2,{50,112,0}}, +/* 5489 */ {(11<<2)|2,{50,112,0}}, +/* 5490 */ {(11<<2)|2,{50,112,0}}, +/* 5491 */ {(11<<2)|2,{50,112,0}}, +/* 5492 */ {(11<<2)|2,{50,112,0}}, +/* 5493 */ {(11<<2)|2,{50,112,0}}, +/* 5494 */ {(11<<2)|2,{50,112,0}}, +/* 5495 */ {(11<<2)|2,{50,112,0}}, +/* 5496 */ {(11<<2)|2,{50,112,0}}, +/* 5497 */ {(11<<2)|2,{50,112,0}}, +/* 5498 */ {(11<<2)|2,{50,112,0}}, +/* 5499 */ {(11<<2)|2,{50,112,0}}, +/* 5500 */ {(11<<2)|2,{50,112,0}}, +/* 5501 */ {(11<<2)|2,{50,112,0}}, +/* 5502 */ {(11<<2)|2,{50,112,0}}, +/* 5503 */ {(11<<2)|2,{50,112,0}}, +/* 5504 */ {(16<<2)|3,{50,114,48}}, +/* 5505 */ {(16<<2)|3,{50,114,49}}, +/* 5506 */ {(16<<2)|3,{50,114,50}}, +/* 5507 */ {(16<<2)|3,{50,114,97}}, +/* 5508 */ {(16<<2)|3,{50,114,99}}, +/* 5509 */ {(16<<2)|3,{50,114,101}}, +/* 5510 */ {(16<<2)|3,{50,114,105}}, +/* 5511 */ {(16<<2)|3,{50,114,111}}, +/* 5512 */ {(16<<2)|3,{50,114,115}}, +/* 5513 */ {(16<<2)|3,{50,114,116}}, +/* 5514 */ {(11<<2)|2,{50,114,0}}, +/* 5515 */ {(11<<2)|2,{50,114,0}}, +/* 5516 */ {(11<<2)|2,{50,114,0}}, +/* 5517 */ {(11<<2)|2,{50,114,0}}, +/* 5518 */ {(11<<2)|2,{50,114,0}}, +/* 5519 */ {(11<<2)|2,{50,114,0}}, +/* 5520 */ {(11<<2)|2,{50,114,0}}, +/* 5521 */ {(11<<2)|2,{50,114,0}}, +/* 5522 */ {(11<<2)|2,{50,114,0}}, +/* 5523 */ {(11<<2)|2,{50,114,0}}, +/* 5524 */ {(11<<2)|2,{50,114,0}}, +/* 5525 */ {(11<<2)|2,{50,114,0}}, +/* 5526 */ {(11<<2)|2,{50,114,0}}, +/* 5527 */ {(11<<2)|2,{50,114,0}}, +/* 5528 */ {(11<<2)|2,{50,114,0}}, +/* 5529 */ {(11<<2)|2,{50,114,0}}, +/* 5530 */ {(11<<2)|2,{50,114,0}}, +/* 5531 */ {(11<<2)|2,{50,114,0}}, +/* 5532 */ {(11<<2)|2,{50,114,0}}, +/* 5533 */ {(11<<2)|2,{50,114,0}}, +/* 5534 */ {(11<<2)|2,{50,114,0}}, +/* 5535 */ {(11<<2)|2,{50,114,0}}, +/* 5536 */ {(16<<2)|3,{50,117,48}}, +/* 5537 */ {(16<<2)|3,{50,117,49}}, +/* 5538 */ {(16<<2)|3,{50,117,50}}, +/* 5539 */ {(16<<2)|3,{50,117,97}}, +/* 5540 */ {(16<<2)|3,{50,117,99}}, +/* 5541 */ {(16<<2)|3,{50,117,101}}, +/* 5542 */ {(16<<2)|3,{50,117,105}}, +/* 5543 */ {(16<<2)|3,{50,117,111}}, +/* 5544 */ {(16<<2)|3,{50,117,115}}, +/* 5545 */ {(16<<2)|3,{50,117,116}}, +/* 5546 */ {(11<<2)|2,{50,117,0}}, +/* 5547 */ {(11<<2)|2,{50,117,0}}, +/* 5548 */ {(11<<2)|2,{50,117,0}}, +/* 5549 */ {(11<<2)|2,{50,117,0}}, +/* 5550 */ {(11<<2)|2,{50,117,0}}, +/* 5551 */ {(11<<2)|2,{50,117,0}}, +/* 5552 */ {(11<<2)|2,{50,117,0}}, +/* 5553 */ {(11<<2)|2,{50,117,0}}, +/* 5554 */ {(11<<2)|2,{50,117,0}}, +/* 5555 */ {(11<<2)|2,{50,117,0}}, +/* 5556 */ {(11<<2)|2,{50,117,0}}, +/* 5557 */ {(11<<2)|2,{50,117,0}}, +/* 5558 */ {(11<<2)|2,{50,117,0}}, +/* 5559 */ {(11<<2)|2,{50,117,0}}, +/* 5560 */ {(11<<2)|2,{50,117,0}}, +/* 5561 */ {(11<<2)|2,{50,117,0}}, +/* 5562 */ {(11<<2)|2,{50,117,0}}, +/* 5563 */ {(11<<2)|2,{50,117,0}}, +/* 5564 */ {(11<<2)|2,{50,117,0}}, +/* 5565 */ {(11<<2)|2,{50,117,0}}, +/* 5566 */ {(11<<2)|2,{50,117,0}}, +/* 5567 */ {(11<<2)|2,{50,117,0}}, +/* 5568 */ {(12<<2)|2,{50,58,0}}, +/* 5569 */ {(12<<2)|2,{50,58,0}}, +/* 5570 */ {(12<<2)|2,{50,58,0}}, +/* 5571 */ {(12<<2)|2,{50,58,0}}, +/* 5572 */ {(12<<2)|2,{50,58,0}}, +/* 5573 */ {(12<<2)|2,{50,58,0}}, +/* 5574 */ {(12<<2)|2,{50,58,0}}, +/* 5575 */ {(12<<2)|2,{50,58,0}}, +/* 5576 */ {(12<<2)|2,{50,58,0}}, +/* 5577 */ {(12<<2)|2,{50,58,0}}, +/* 5578 */ {(12<<2)|2,{50,58,0}}, +/* 5579 */ {(12<<2)|2,{50,58,0}}, +/* 5580 */ {(12<<2)|2,{50,58,0}}, +/* 5581 */ {(12<<2)|2,{50,58,0}}, +/* 5582 */ {(12<<2)|2,{50,58,0}}, +/* 5583 */ {(12<<2)|2,{50,58,0}}, +/* 5584 */ {(12<<2)|2,{50,66,0}}, +/* 5585 */ {(12<<2)|2,{50,66,0}}, +/* 5586 */ {(12<<2)|2,{50,66,0}}, +/* 5587 */ {(12<<2)|2,{50,66,0}}, +/* 5588 */ {(12<<2)|2,{50,66,0}}, +/* 5589 */ {(12<<2)|2,{50,66,0}}, +/* 5590 */ {(12<<2)|2,{50,66,0}}, +/* 5591 */ {(12<<2)|2,{50,66,0}}, +/* 5592 */ {(12<<2)|2,{50,66,0}}, +/* 5593 */ {(12<<2)|2,{50,66,0}}, +/* 5594 */ {(12<<2)|2,{50,66,0}}, +/* 5595 */ {(12<<2)|2,{50,66,0}}, +/* 5596 */ {(12<<2)|2,{50,66,0}}, +/* 5597 */ {(12<<2)|2,{50,66,0}}, +/* 5598 */ {(12<<2)|2,{50,66,0}}, +/* 5599 */ {(12<<2)|2,{50,66,0}}, +/* 5600 */ {(12<<2)|2,{50,67,0}}, +/* 5601 */ {(12<<2)|2,{50,67,0}}, +/* 5602 */ {(12<<2)|2,{50,67,0}}, +/* 5603 */ {(12<<2)|2,{50,67,0}}, +/* 5604 */ {(12<<2)|2,{50,67,0}}, +/* 5605 */ {(12<<2)|2,{50,67,0}}, +/* 5606 */ {(12<<2)|2,{50,67,0}}, +/* 5607 */ {(12<<2)|2,{50,67,0}}, +/* 5608 */ {(12<<2)|2,{50,67,0}}, +/* 5609 */ {(12<<2)|2,{50,67,0}}, +/* 5610 */ {(12<<2)|2,{50,67,0}}, +/* 5611 */ {(12<<2)|2,{50,67,0}}, +/* 5612 */ {(12<<2)|2,{50,67,0}}, +/* 5613 */ {(12<<2)|2,{50,67,0}}, +/* 5614 */ {(12<<2)|2,{50,67,0}}, +/* 5615 */ {(12<<2)|2,{50,67,0}}, +/* 5616 */ {(12<<2)|2,{50,68,0}}, +/* 5617 */ {(12<<2)|2,{50,68,0}}, +/* 5618 */ {(12<<2)|2,{50,68,0}}, +/* 5619 */ {(12<<2)|2,{50,68,0}}, +/* 5620 */ {(12<<2)|2,{50,68,0}}, +/* 5621 */ {(12<<2)|2,{50,68,0}}, +/* 5622 */ {(12<<2)|2,{50,68,0}}, +/* 5623 */ {(12<<2)|2,{50,68,0}}, +/* 5624 */ {(12<<2)|2,{50,68,0}}, +/* 5625 */ {(12<<2)|2,{50,68,0}}, +/* 5626 */ {(12<<2)|2,{50,68,0}}, +/* 5627 */ {(12<<2)|2,{50,68,0}}, +/* 5628 */ {(12<<2)|2,{50,68,0}}, +/* 5629 */ {(12<<2)|2,{50,68,0}}, +/* 5630 */ {(12<<2)|2,{50,68,0}}, +/* 5631 */ {(12<<2)|2,{50,68,0}}, +/* 5632 */ {(12<<2)|2,{50,69,0}}, +/* 5633 */ {(12<<2)|2,{50,69,0}}, +/* 5634 */ {(12<<2)|2,{50,69,0}}, +/* 5635 */ {(12<<2)|2,{50,69,0}}, +/* 5636 */ {(12<<2)|2,{50,69,0}}, +/* 5637 */ {(12<<2)|2,{50,69,0}}, +/* 5638 */ {(12<<2)|2,{50,69,0}}, +/* 5639 */ {(12<<2)|2,{50,69,0}}, +/* 5640 */ {(12<<2)|2,{50,69,0}}, +/* 5641 */ {(12<<2)|2,{50,69,0}}, +/* 5642 */ {(12<<2)|2,{50,69,0}}, +/* 5643 */ {(12<<2)|2,{50,69,0}}, +/* 5644 */ {(12<<2)|2,{50,69,0}}, +/* 5645 */ {(12<<2)|2,{50,69,0}}, +/* 5646 */ {(12<<2)|2,{50,69,0}}, +/* 5647 */ {(12<<2)|2,{50,69,0}}, +/* 5648 */ {(12<<2)|2,{50,70,0}}, +/* 5649 */ {(12<<2)|2,{50,70,0}}, +/* 5650 */ {(12<<2)|2,{50,70,0}}, +/* 5651 */ {(12<<2)|2,{50,70,0}}, +/* 5652 */ {(12<<2)|2,{50,70,0}}, +/* 5653 */ {(12<<2)|2,{50,70,0}}, +/* 5654 */ {(12<<2)|2,{50,70,0}}, +/* 5655 */ {(12<<2)|2,{50,70,0}}, +/* 5656 */ {(12<<2)|2,{50,70,0}}, +/* 5657 */ {(12<<2)|2,{50,70,0}}, +/* 5658 */ {(12<<2)|2,{50,70,0}}, +/* 5659 */ {(12<<2)|2,{50,70,0}}, +/* 5660 */ {(12<<2)|2,{50,70,0}}, +/* 5661 */ {(12<<2)|2,{50,70,0}}, +/* 5662 */ {(12<<2)|2,{50,70,0}}, +/* 5663 */ {(12<<2)|2,{50,70,0}}, +/* 5664 */ {(12<<2)|2,{50,71,0}}, +/* 5665 */ {(12<<2)|2,{50,71,0}}, +/* 5666 */ {(12<<2)|2,{50,71,0}}, +/* 5667 */ {(12<<2)|2,{50,71,0}}, +/* 5668 */ {(12<<2)|2,{50,71,0}}, +/* 5669 */ {(12<<2)|2,{50,71,0}}, +/* 5670 */ {(12<<2)|2,{50,71,0}}, +/* 5671 */ {(12<<2)|2,{50,71,0}}, +/* 5672 */ {(12<<2)|2,{50,71,0}}, +/* 5673 */ {(12<<2)|2,{50,71,0}}, +/* 5674 */ {(12<<2)|2,{50,71,0}}, +/* 5675 */ {(12<<2)|2,{50,71,0}}, +/* 5676 */ {(12<<2)|2,{50,71,0}}, +/* 5677 */ {(12<<2)|2,{50,71,0}}, +/* 5678 */ {(12<<2)|2,{50,71,0}}, +/* 5679 */ {(12<<2)|2,{50,71,0}}, +/* 5680 */ {(12<<2)|2,{50,72,0}}, +/* 5681 */ {(12<<2)|2,{50,72,0}}, +/* 5682 */ {(12<<2)|2,{50,72,0}}, +/* 5683 */ {(12<<2)|2,{50,72,0}}, +/* 5684 */ {(12<<2)|2,{50,72,0}}, +/* 5685 */ {(12<<2)|2,{50,72,0}}, +/* 5686 */ {(12<<2)|2,{50,72,0}}, +/* 5687 */ {(12<<2)|2,{50,72,0}}, +/* 5688 */ {(12<<2)|2,{50,72,0}}, +/* 5689 */ {(12<<2)|2,{50,72,0}}, +/* 5690 */ {(12<<2)|2,{50,72,0}}, +/* 5691 */ {(12<<2)|2,{50,72,0}}, +/* 5692 */ {(12<<2)|2,{50,72,0}}, +/* 5693 */ {(12<<2)|2,{50,72,0}}, +/* 5694 */ {(12<<2)|2,{50,72,0}}, +/* 5695 */ {(12<<2)|2,{50,72,0}}, +/* 5696 */ {(12<<2)|2,{50,73,0}}, +/* 5697 */ {(12<<2)|2,{50,73,0}}, +/* 5698 */ {(12<<2)|2,{50,73,0}}, +/* 5699 */ {(12<<2)|2,{50,73,0}}, +/* 5700 */ {(12<<2)|2,{50,73,0}}, +/* 5701 */ {(12<<2)|2,{50,73,0}}, +/* 5702 */ {(12<<2)|2,{50,73,0}}, +/* 5703 */ {(12<<2)|2,{50,73,0}}, +/* 5704 */ {(12<<2)|2,{50,73,0}}, +/* 5705 */ {(12<<2)|2,{50,73,0}}, +/* 5706 */ {(12<<2)|2,{50,73,0}}, +/* 5707 */ {(12<<2)|2,{50,73,0}}, +/* 5708 */ {(12<<2)|2,{50,73,0}}, +/* 5709 */ {(12<<2)|2,{50,73,0}}, +/* 5710 */ {(12<<2)|2,{50,73,0}}, +/* 5711 */ {(12<<2)|2,{50,73,0}}, +/* 5712 */ {(12<<2)|2,{50,74,0}}, +/* 5713 */ {(12<<2)|2,{50,74,0}}, +/* 5714 */ {(12<<2)|2,{50,74,0}}, +/* 5715 */ {(12<<2)|2,{50,74,0}}, +/* 5716 */ {(12<<2)|2,{50,74,0}}, +/* 5717 */ {(12<<2)|2,{50,74,0}}, +/* 5718 */ {(12<<2)|2,{50,74,0}}, +/* 5719 */ {(12<<2)|2,{50,74,0}}, +/* 5720 */ {(12<<2)|2,{50,74,0}}, +/* 5721 */ {(12<<2)|2,{50,74,0}}, +/* 5722 */ {(12<<2)|2,{50,74,0}}, +/* 5723 */ {(12<<2)|2,{50,74,0}}, +/* 5724 */ {(12<<2)|2,{50,74,0}}, +/* 5725 */ {(12<<2)|2,{50,74,0}}, +/* 5726 */ {(12<<2)|2,{50,74,0}}, +/* 5727 */ {(12<<2)|2,{50,74,0}}, +/* 5728 */ {(12<<2)|2,{50,75,0}}, +/* 5729 */ {(12<<2)|2,{50,75,0}}, +/* 5730 */ {(12<<2)|2,{50,75,0}}, +/* 5731 */ {(12<<2)|2,{50,75,0}}, +/* 5732 */ {(12<<2)|2,{50,75,0}}, +/* 5733 */ {(12<<2)|2,{50,75,0}}, +/* 5734 */ {(12<<2)|2,{50,75,0}}, +/* 5735 */ {(12<<2)|2,{50,75,0}}, +/* 5736 */ {(12<<2)|2,{50,75,0}}, +/* 5737 */ {(12<<2)|2,{50,75,0}}, +/* 5738 */ {(12<<2)|2,{50,75,0}}, +/* 5739 */ {(12<<2)|2,{50,75,0}}, +/* 5740 */ {(12<<2)|2,{50,75,0}}, +/* 5741 */ {(12<<2)|2,{50,75,0}}, +/* 5742 */ {(12<<2)|2,{50,75,0}}, +/* 5743 */ {(12<<2)|2,{50,75,0}}, +/* 5744 */ {(12<<2)|2,{50,76,0}}, +/* 5745 */ {(12<<2)|2,{50,76,0}}, +/* 5746 */ {(12<<2)|2,{50,76,0}}, +/* 5747 */ {(12<<2)|2,{50,76,0}}, +/* 5748 */ {(12<<2)|2,{50,76,0}}, +/* 5749 */ {(12<<2)|2,{50,76,0}}, +/* 5750 */ {(12<<2)|2,{50,76,0}}, +/* 5751 */ {(12<<2)|2,{50,76,0}}, +/* 5752 */ {(12<<2)|2,{50,76,0}}, +/* 5753 */ {(12<<2)|2,{50,76,0}}, +/* 5754 */ {(12<<2)|2,{50,76,0}}, +/* 5755 */ {(12<<2)|2,{50,76,0}}, +/* 5756 */ {(12<<2)|2,{50,76,0}}, +/* 5757 */ {(12<<2)|2,{50,76,0}}, +/* 5758 */ {(12<<2)|2,{50,76,0}}, +/* 5759 */ {(12<<2)|2,{50,76,0}}, +/* 5760 */ {(12<<2)|2,{50,77,0}}, +/* 5761 */ {(12<<2)|2,{50,77,0}}, +/* 5762 */ {(12<<2)|2,{50,77,0}}, +/* 5763 */ {(12<<2)|2,{50,77,0}}, +/* 5764 */ {(12<<2)|2,{50,77,0}}, +/* 5765 */ {(12<<2)|2,{50,77,0}}, +/* 5766 */ {(12<<2)|2,{50,77,0}}, +/* 5767 */ {(12<<2)|2,{50,77,0}}, +/* 5768 */ {(12<<2)|2,{50,77,0}}, +/* 5769 */ {(12<<2)|2,{50,77,0}}, +/* 5770 */ {(12<<2)|2,{50,77,0}}, +/* 5771 */ {(12<<2)|2,{50,77,0}}, +/* 5772 */ {(12<<2)|2,{50,77,0}}, +/* 5773 */ {(12<<2)|2,{50,77,0}}, +/* 5774 */ {(12<<2)|2,{50,77,0}}, +/* 5775 */ {(12<<2)|2,{50,77,0}}, +/* 5776 */ {(12<<2)|2,{50,78,0}}, +/* 5777 */ {(12<<2)|2,{50,78,0}}, +/* 5778 */ {(12<<2)|2,{50,78,0}}, +/* 5779 */ {(12<<2)|2,{50,78,0}}, +/* 5780 */ {(12<<2)|2,{50,78,0}}, +/* 5781 */ {(12<<2)|2,{50,78,0}}, +/* 5782 */ {(12<<2)|2,{50,78,0}}, +/* 5783 */ {(12<<2)|2,{50,78,0}}, +/* 5784 */ {(12<<2)|2,{50,78,0}}, +/* 5785 */ {(12<<2)|2,{50,78,0}}, +/* 5786 */ {(12<<2)|2,{50,78,0}}, +/* 5787 */ {(12<<2)|2,{50,78,0}}, +/* 5788 */ {(12<<2)|2,{50,78,0}}, +/* 5789 */ {(12<<2)|2,{50,78,0}}, +/* 5790 */ {(12<<2)|2,{50,78,0}}, +/* 5791 */ {(12<<2)|2,{50,78,0}}, +/* 5792 */ {(12<<2)|2,{50,79,0}}, +/* 5793 */ {(12<<2)|2,{50,79,0}}, +/* 5794 */ {(12<<2)|2,{50,79,0}}, +/* 5795 */ {(12<<2)|2,{50,79,0}}, +/* 5796 */ {(12<<2)|2,{50,79,0}}, +/* 5797 */ {(12<<2)|2,{50,79,0}}, +/* 5798 */ {(12<<2)|2,{50,79,0}}, +/* 5799 */ {(12<<2)|2,{50,79,0}}, +/* 5800 */ {(12<<2)|2,{50,79,0}}, +/* 5801 */ {(12<<2)|2,{50,79,0}}, +/* 5802 */ {(12<<2)|2,{50,79,0}}, +/* 5803 */ {(12<<2)|2,{50,79,0}}, +/* 5804 */ {(12<<2)|2,{50,79,0}}, +/* 5805 */ {(12<<2)|2,{50,79,0}}, +/* 5806 */ {(12<<2)|2,{50,79,0}}, +/* 5807 */ {(12<<2)|2,{50,79,0}}, +/* 5808 */ {(12<<2)|2,{50,80,0}}, +/* 5809 */ {(12<<2)|2,{50,80,0}}, +/* 5810 */ {(12<<2)|2,{50,80,0}}, +/* 5811 */ {(12<<2)|2,{50,80,0}}, +/* 5812 */ {(12<<2)|2,{50,80,0}}, +/* 5813 */ {(12<<2)|2,{50,80,0}}, +/* 5814 */ {(12<<2)|2,{50,80,0}}, +/* 5815 */ {(12<<2)|2,{50,80,0}}, +/* 5816 */ {(12<<2)|2,{50,80,0}}, +/* 5817 */ {(12<<2)|2,{50,80,0}}, +/* 5818 */ {(12<<2)|2,{50,80,0}}, +/* 5819 */ {(12<<2)|2,{50,80,0}}, +/* 5820 */ {(12<<2)|2,{50,80,0}}, +/* 5821 */ {(12<<2)|2,{50,80,0}}, +/* 5822 */ {(12<<2)|2,{50,80,0}}, +/* 5823 */ {(12<<2)|2,{50,80,0}}, +/* 5824 */ {(12<<2)|2,{50,81,0}}, +/* 5825 */ {(12<<2)|2,{50,81,0}}, +/* 5826 */ {(12<<2)|2,{50,81,0}}, +/* 5827 */ {(12<<2)|2,{50,81,0}}, +/* 5828 */ {(12<<2)|2,{50,81,0}}, +/* 5829 */ {(12<<2)|2,{50,81,0}}, +/* 5830 */ {(12<<2)|2,{50,81,0}}, +/* 5831 */ {(12<<2)|2,{50,81,0}}, +/* 5832 */ {(12<<2)|2,{50,81,0}}, +/* 5833 */ {(12<<2)|2,{50,81,0}}, +/* 5834 */ {(12<<2)|2,{50,81,0}}, +/* 5835 */ {(12<<2)|2,{50,81,0}}, +/* 5836 */ {(12<<2)|2,{50,81,0}}, +/* 5837 */ {(12<<2)|2,{50,81,0}}, +/* 5838 */ {(12<<2)|2,{50,81,0}}, +/* 5839 */ {(12<<2)|2,{50,81,0}}, +/* 5840 */ {(12<<2)|2,{50,82,0}}, +/* 5841 */ {(12<<2)|2,{50,82,0}}, +/* 5842 */ {(12<<2)|2,{50,82,0}}, +/* 5843 */ {(12<<2)|2,{50,82,0}}, +/* 5844 */ {(12<<2)|2,{50,82,0}}, +/* 5845 */ {(12<<2)|2,{50,82,0}}, +/* 5846 */ {(12<<2)|2,{50,82,0}}, +/* 5847 */ {(12<<2)|2,{50,82,0}}, +/* 5848 */ {(12<<2)|2,{50,82,0}}, +/* 5849 */ {(12<<2)|2,{50,82,0}}, +/* 5850 */ {(12<<2)|2,{50,82,0}}, +/* 5851 */ {(12<<2)|2,{50,82,0}}, +/* 5852 */ {(12<<2)|2,{50,82,0}}, +/* 5853 */ {(12<<2)|2,{50,82,0}}, +/* 5854 */ {(12<<2)|2,{50,82,0}}, +/* 5855 */ {(12<<2)|2,{50,82,0}}, +/* 5856 */ {(12<<2)|2,{50,83,0}}, +/* 5857 */ {(12<<2)|2,{50,83,0}}, +/* 5858 */ {(12<<2)|2,{50,83,0}}, +/* 5859 */ {(12<<2)|2,{50,83,0}}, +/* 5860 */ {(12<<2)|2,{50,83,0}}, +/* 5861 */ {(12<<2)|2,{50,83,0}}, +/* 5862 */ {(12<<2)|2,{50,83,0}}, +/* 5863 */ {(12<<2)|2,{50,83,0}}, +/* 5864 */ {(12<<2)|2,{50,83,0}}, +/* 5865 */ {(12<<2)|2,{50,83,0}}, +/* 5866 */ {(12<<2)|2,{50,83,0}}, +/* 5867 */ {(12<<2)|2,{50,83,0}}, +/* 5868 */ {(12<<2)|2,{50,83,0}}, +/* 5869 */ {(12<<2)|2,{50,83,0}}, +/* 5870 */ {(12<<2)|2,{50,83,0}}, +/* 5871 */ {(12<<2)|2,{50,83,0}}, +/* 5872 */ {(12<<2)|2,{50,84,0}}, +/* 5873 */ {(12<<2)|2,{50,84,0}}, +/* 5874 */ {(12<<2)|2,{50,84,0}}, +/* 5875 */ {(12<<2)|2,{50,84,0}}, +/* 5876 */ {(12<<2)|2,{50,84,0}}, +/* 5877 */ {(12<<2)|2,{50,84,0}}, +/* 5878 */ {(12<<2)|2,{50,84,0}}, +/* 5879 */ {(12<<2)|2,{50,84,0}}, +/* 5880 */ {(12<<2)|2,{50,84,0}}, +/* 5881 */ {(12<<2)|2,{50,84,0}}, +/* 5882 */ {(12<<2)|2,{50,84,0}}, +/* 5883 */ {(12<<2)|2,{50,84,0}}, +/* 5884 */ {(12<<2)|2,{50,84,0}}, +/* 5885 */ {(12<<2)|2,{50,84,0}}, +/* 5886 */ {(12<<2)|2,{50,84,0}}, +/* 5887 */ {(12<<2)|2,{50,84,0}}, +/* 5888 */ {(12<<2)|2,{50,85,0}}, +/* 5889 */ {(12<<2)|2,{50,85,0}}, +/* 5890 */ {(12<<2)|2,{50,85,0}}, +/* 5891 */ {(12<<2)|2,{50,85,0}}, +/* 5892 */ {(12<<2)|2,{50,85,0}}, +/* 5893 */ {(12<<2)|2,{50,85,0}}, +/* 5894 */ {(12<<2)|2,{50,85,0}}, +/* 5895 */ {(12<<2)|2,{50,85,0}}, +/* 5896 */ {(12<<2)|2,{50,85,0}}, +/* 5897 */ {(12<<2)|2,{50,85,0}}, +/* 5898 */ {(12<<2)|2,{50,85,0}}, +/* 5899 */ {(12<<2)|2,{50,85,0}}, +/* 5900 */ {(12<<2)|2,{50,85,0}}, +/* 5901 */ {(12<<2)|2,{50,85,0}}, +/* 5902 */ {(12<<2)|2,{50,85,0}}, +/* 5903 */ {(12<<2)|2,{50,85,0}}, +/* 5904 */ {(12<<2)|2,{50,86,0}}, +/* 5905 */ {(12<<2)|2,{50,86,0}}, +/* 5906 */ {(12<<2)|2,{50,86,0}}, +/* 5907 */ {(12<<2)|2,{50,86,0}}, +/* 5908 */ {(12<<2)|2,{50,86,0}}, +/* 5909 */ {(12<<2)|2,{50,86,0}}, +/* 5910 */ {(12<<2)|2,{50,86,0}}, +/* 5911 */ {(12<<2)|2,{50,86,0}}, +/* 5912 */ {(12<<2)|2,{50,86,0}}, +/* 5913 */ {(12<<2)|2,{50,86,0}}, +/* 5914 */ {(12<<2)|2,{50,86,0}}, +/* 5915 */ {(12<<2)|2,{50,86,0}}, +/* 5916 */ {(12<<2)|2,{50,86,0}}, +/* 5917 */ {(12<<2)|2,{50,86,0}}, +/* 5918 */ {(12<<2)|2,{50,86,0}}, +/* 5919 */ {(12<<2)|2,{50,86,0}}, +/* 5920 */ {(12<<2)|2,{50,87,0}}, +/* 5921 */ {(12<<2)|2,{50,87,0}}, +/* 5922 */ {(12<<2)|2,{50,87,0}}, +/* 5923 */ {(12<<2)|2,{50,87,0}}, +/* 5924 */ {(12<<2)|2,{50,87,0}}, +/* 5925 */ {(12<<2)|2,{50,87,0}}, +/* 5926 */ {(12<<2)|2,{50,87,0}}, +/* 5927 */ {(12<<2)|2,{50,87,0}}, +/* 5928 */ {(12<<2)|2,{50,87,0}}, +/* 5929 */ {(12<<2)|2,{50,87,0}}, +/* 5930 */ {(12<<2)|2,{50,87,0}}, +/* 5931 */ {(12<<2)|2,{50,87,0}}, +/* 5932 */ {(12<<2)|2,{50,87,0}}, +/* 5933 */ {(12<<2)|2,{50,87,0}}, +/* 5934 */ {(12<<2)|2,{50,87,0}}, +/* 5935 */ {(12<<2)|2,{50,87,0}}, +/* 5936 */ {(12<<2)|2,{50,89,0}}, +/* 5937 */ {(12<<2)|2,{50,89,0}}, +/* 5938 */ {(12<<2)|2,{50,89,0}}, +/* 5939 */ {(12<<2)|2,{50,89,0}}, +/* 5940 */ {(12<<2)|2,{50,89,0}}, +/* 5941 */ {(12<<2)|2,{50,89,0}}, +/* 5942 */ {(12<<2)|2,{50,89,0}}, +/* 5943 */ {(12<<2)|2,{50,89,0}}, +/* 5944 */ {(12<<2)|2,{50,89,0}}, +/* 5945 */ {(12<<2)|2,{50,89,0}}, +/* 5946 */ {(12<<2)|2,{50,89,0}}, +/* 5947 */ {(12<<2)|2,{50,89,0}}, +/* 5948 */ {(12<<2)|2,{50,89,0}}, +/* 5949 */ {(12<<2)|2,{50,89,0}}, +/* 5950 */ {(12<<2)|2,{50,89,0}}, +/* 5951 */ {(12<<2)|2,{50,89,0}}, +/* 5952 */ {(12<<2)|2,{50,106,0}}, +/* 5953 */ {(12<<2)|2,{50,106,0}}, +/* 5954 */ {(12<<2)|2,{50,106,0}}, +/* 5955 */ {(12<<2)|2,{50,106,0}}, +/* 5956 */ {(12<<2)|2,{50,106,0}}, +/* 5957 */ {(12<<2)|2,{50,106,0}}, +/* 5958 */ {(12<<2)|2,{50,106,0}}, +/* 5959 */ {(12<<2)|2,{50,106,0}}, +/* 5960 */ {(12<<2)|2,{50,106,0}}, +/* 5961 */ {(12<<2)|2,{50,106,0}}, +/* 5962 */ {(12<<2)|2,{50,106,0}}, +/* 5963 */ {(12<<2)|2,{50,106,0}}, +/* 5964 */ {(12<<2)|2,{50,106,0}}, +/* 5965 */ {(12<<2)|2,{50,106,0}}, +/* 5966 */ {(12<<2)|2,{50,106,0}}, +/* 5967 */ {(12<<2)|2,{50,106,0}}, +/* 5968 */ {(12<<2)|2,{50,107,0}}, +/* 5969 */ {(12<<2)|2,{50,107,0}}, +/* 5970 */ {(12<<2)|2,{50,107,0}}, +/* 5971 */ {(12<<2)|2,{50,107,0}}, +/* 5972 */ {(12<<2)|2,{50,107,0}}, +/* 5973 */ {(12<<2)|2,{50,107,0}}, +/* 5974 */ {(12<<2)|2,{50,107,0}}, +/* 5975 */ {(12<<2)|2,{50,107,0}}, +/* 5976 */ {(12<<2)|2,{50,107,0}}, +/* 5977 */ {(12<<2)|2,{50,107,0}}, +/* 5978 */ {(12<<2)|2,{50,107,0}}, +/* 5979 */ {(12<<2)|2,{50,107,0}}, +/* 5980 */ {(12<<2)|2,{50,107,0}}, +/* 5981 */ {(12<<2)|2,{50,107,0}}, +/* 5982 */ {(12<<2)|2,{50,107,0}}, +/* 5983 */ {(12<<2)|2,{50,107,0}}, +/* 5984 */ {(12<<2)|2,{50,113,0}}, +/* 5985 */ {(12<<2)|2,{50,113,0}}, +/* 5986 */ {(12<<2)|2,{50,113,0}}, +/* 5987 */ {(12<<2)|2,{50,113,0}}, +/* 5988 */ {(12<<2)|2,{50,113,0}}, +/* 5989 */ {(12<<2)|2,{50,113,0}}, +/* 5990 */ {(12<<2)|2,{50,113,0}}, +/* 5991 */ {(12<<2)|2,{50,113,0}}, +/* 5992 */ {(12<<2)|2,{50,113,0}}, +/* 5993 */ {(12<<2)|2,{50,113,0}}, +/* 5994 */ {(12<<2)|2,{50,113,0}}, +/* 5995 */ {(12<<2)|2,{50,113,0}}, +/* 5996 */ {(12<<2)|2,{50,113,0}}, +/* 5997 */ {(12<<2)|2,{50,113,0}}, +/* 5998 */ {(12<<2)|2,{50,113,0}}, +/* 5999 */ {(12<<2)|2,{50,113,0}}, +/* 6000 */ {(12<<2)|2,{50,118,0}}, +/* 6001 */ {(12<<2)|2,{50,118,0}}, +/* 6002 */ {(12<<2)|2,{50,118,0}}, +/* 6003 */ {(12<<2)|2,{50,118,0}}, +/* 6004 */ {(12<<2)|2,{50,118,0}}, +/* 6005 */ {(12<<2)|2,{50,118,0}}, +/* 6006 */ {(12<<2)|2,{50,118,0}}, +/* 6007 */ {(12<<2)|2,{50,118,0}}, +/* 6008 */ {(12<<2)|2,{50,118,0}}, +/* 6009 */ {(12<<2)|2,{50,118,0}}, +/* 6010 */ {(12<<2)|2,{50,118,0}}, +/* 6011 */ {(12<<2)|2,{50,118,0}}, +/* 6012 */ {(12<<2)|2,{50,118,0}}, +/* 6013 */ {(12<<2)|2,{50,118,0}}, +/* 6014 */ {(12<<2)|2,{50,118,0}}, +/* 6015 */ {(12<<2)|2,{50,118,0}}, +/* 6016 */ {(12<<2)|2,{50,119,0}}, +/* 6017 */ {(12<<2)|2,{50,119,0}}, +/* 6018 */ {(12<<2)|2,{50,119,0}}, +/* 6019 */ {(12<<2)|2,{50,119,0}}, +/* 6020 */ {(12<<2)|2,{50,119,0}}, +/* 6021 */ {(12<<2)|2,{50,119,0}}, +/* 6022 */ {(12<<2)|2,{50,119,0}}, +/* 6023 */ {(12<<2)|2,{50,119,0}}, +/* 6024 */ {(12<<2)|2,{50,119,0}}, +/* 6025 */ {(12<<2)|2,{50,119,0}}, +/* 6026 */ {(12<<2)|2,{50,119,0}}, +/* 6027 */ {(12<<2)|2,{50,119,0}}, +/* 6028 */ {(12<<2)|2,{50,119,0}}, +/* 6029 */ {(12<<2)|2,{50,119,0}}, +/* 6030 */ {(12<<2)|2,{50,119,0}}, +/* 6031 */ {(12<<2)|2,{50,119,0}}, +/* 6032 */ {(12<<2)|2,{50,120,0}}, +/* 6033 */ {(12<<2)|2,{50,120,0}}, +/* 6034 */ {(12<<2)|2,{50,120,0}}, +/* 6035 */ {(12<<2)|2,{50,120,0}}, +/* 6036 */ {(12<<2)|2,{50,120,0}}, +/* 6037 */ {(12<<2)|2,{50,120,0}}, +/* 6038 */ {(12<<2)|2,{50,120,0}}, +/* 6039 */ {(12<<2)|2,{50,120,0}}, +/* 6040 */ {(12<<2)|2,{50,120,0}}, +/* 6041 */ {(12<<2)|2,{50,120,0}}, +/* 6042 */ {(12<<2)|2,{50,120,0}}, +/* 6043 */ {(12<<2)|2,{50,120,0}}, +/* 6044 */ {(12<<2)|2,{50,120,0}}, +/* 6045 */ {(12<<2)|2,{50,120,0}}, +/* 6046 */ {(12<<2)|2,{50,120,0}}, +/* 6047 */ {(12<<2)|2,{50,120,0}}, +/* 6048 */ {(12<<2)|2,{50,121,0}}, +/* 6049 */ {(12<<2)|2,{50,121,0}}, +/* 6050 */ {(12<<2)|2,{50,121,0}}, +/* 6051 */ {(12<<2)|2,{50,121,0}}, +/* 6052 */ {(12<<2)|2,{50,121,0}}, +/* 6053 */ {(12<<2)|2,{50,121,0}}, +/* 6054 */ {(12<<2)|2,{50,121,0}}, +/* 6055 */ {(12<<2)|2,{50,121,0}}, +/* 6056 */ {(12<<2)|2,{50,121,0}}, +/* 6057 */ {(12<<2)|2,{50,121,0}}, +/* 6058 */ {(12<<2)|2,{50,121,0}}, +/* 6059 */ {(12<<2)|2,{50,121,0}}, +/* 6060 */ {(12<<2)|2,{50,121,0}}, +/* 6061 */ {(12<<2)|2,{50,121,0}}, +/* 6062 */ {(12<<2)|2,{50,121,0}}, +/* 6063 */ {(12<<2)|2,{50,121,0}}, +/* 6064 */ {(12<<2)|2,{50,122,0}}, +/* 6065 */ {(12<<2)|2,{50,122,0}}, +/* 6066 */ {(12<<2)|2,{50,122,0}}, +/* 6067 */ {(12<<2)|2,{50,122,0}}, +/* 6068 */ {(12<<2)|2,{50,122,0}}, +/* 6069 */ {(12<<2)|2,{50,122,0}}, +/* 6070 */ {(12<<2)|2,{50,122,0}}, +/* 6071 */ {(12<<2)|2,{50,122,0}}, +/* 6072 */ {(12<<2)|2,{50,122,0}}, +/* 6073 */ {(12<<2)|2,{50,122,0}}, +/* 6074 */ {(12<<2)|2,{50,122,0}}, +/* 6075 */ {(12<<2)|2,{50,122,0}}, +/* 6076 */ {(12<<2)|2,{50,122,0}}, +/* 6077 */ {(12<<2)|2,{50,122,0}}, +/* 6078 */ {(12<<2)|2,{50,122,0}}, +/* 6079 */ {(12<<2)|2,{50,122,0}}, +/* 6080 */ {(13<<2)|2,{50,38,0}}, +/* 6081 */ {(13<<2)|2,{50,38,0}}, +/* 6082 */ {(13<<2)|2,{50,38,0}}, +/* 6083 */ {(13<<2)|2,{50,38,0}}, +/* 6084 */ {(13<<2)|2,{50,38,0}}, +/* 6085 */ {(13<<2)|2,{50,38,0}}, +/* 6086 */ {(13<<2)|2,{50,38,0}}, +/* 6087 */ {(13<<2)|2,{50,38,0}}, +/* 6088 */ {(13<<2)|2,{50,42,0}}, +/* 6089 */ {(13<<2)|2,{50,42,0}}, +/* 6090 */ {(13<<2)|2,{50,42,0}}, +/* 6091 */ {(13<<2)|2,{50,42,0}}, +/* 6092 */ {(13<<2)|2,{50,42,0}}, +/* 6093 */ {(13<<2)|2,{50,42,0}}, +/* 6094 */ {(13<<2)|2,{50,42,0}}, +/* 6095 */ {(13<<2)|2,{50,42,0}}, +/* 6096 */ {(13<<2)|2,{50,44,0}}, +/* 6097 */ {(13<<2)|2,{50,44,0}}, +/* 6098 */ {(13<<2)|2,{50,44,0}}, +/* 6099 */ {(13<<2)|2,{50,44,0}}, +/* 6100 */ {(13<<2)|2,{50,44,0}}, +/* 6101 */ {(13<<2)|2,{50,44,0}}, +/* 6102 */ {(13<<2)|2,{50,44,0}}, +/* 6103 */ {(13<<2)|2,{50,44,0}}, +/* 6104 */ {(13<<2)|2,{50,59,0}}, +/* 6105 */ {(13<<2)|2,{50,59,0}}, +/* 6106 */ {(13<<2)|2,{50,59,0}}, +/* 6107 */ {(13<<2)|2,{50,59,0}}, +/* 6108 */ {(13<<2)|2,{50,59,0}}, +/* 6109 */ {(13<<2)|2,{50,59,0}}, +/* 6110 */ {(13<<2)|2,{50,59,0}}, +/* 6111 */ {(13<<2)|2,{50,59,0}}, +/* 6112 */ {(13<<2)|2,{50,88,0}}, +/* 6113 */ {(13<<2)|2,{50,88,0}}, +/* 6114 */ {(13<<2)|2,{50,88,0}}, +/* 6115 */ {(13<<2)|2,{50,88,0}}, +/* 6116 */ {(13<<2)|2,{50,88,0}}, +/* 6117 */ {(13<<2)|2,{50,88,0}}, +/* 6118 */ {(13<<2)|2,{50,88,0}}, +/* 6119 */ {(13<<2)|2,{50,88,0}}, +/* 6120 */ {(13<<2)|2,{50,90,0}}, +/* 6121 */ {(13<<2)|2,{50,90,0}}, +/* 6122 */ {(13<<2)|2,{50,90,0}}, +/* 6123 */ {(13<<2)|2,{50,90,0}}, +/* 6124 */ {(13<<2)|2,{50,90,0}}, +/* 6125 */ {(13<<2)|2,{50,90,0}}, +/* 6126 */ {(13<<2)|2,{50,90,0}}, +/* 6127 */ {(13<<2)|2,{50,90,0}}, +/* 6128 */ {(15<<2)|2,{50,33,0}}, +/* 6129 */ {(15<<2)|2,{50,33,0}}, +/* 6130 */ {(15<<2)|2,{50,34,0}}, +/* 6131 */ {(15<<2)|2,{50,34,0}}, +/* 6132 */ {(15<<2)|2,{50,40,0}}, +/* 6133 */ {(15<<2)|2,{50,40,0}}, +/* 6134 */ {(15<<2)|2,{50,41,0}}, +/* 6135 */ {(15<<2)|2,{50,41,0}}, +/* 6136 */ {(15<<2)|2,{50,63,0}}, +/* 6137 */ {(15<<2)|2,{50,63,0}}, +/* 6138 */ {(16<<2)|2,{50,39,0}}, +/* 6139 */ {(16<<2)|2,{50,43,0}}, +/* 6140 */ {(16<<2)|2,{50,124,0}}, +/* 6141 */ {(5<<2)|1,{50,0,0}}, +/* 6142 */ {(5<<2)|1,{50,0,0}}, +/* 6143 */ {(5<<2)|1,{50,0,0}}, +/* 6144 */ {(15<<2)|3,{97,48,48}}, +/* 6145 */ {(15<<2)|3,{97,48,48}}, +/* 6146 */ {(15<<2)|3,{97,48,49}}, +/* 6147 */ {(15<<2)|3,{97,48,49}}, +/* 6148 */ {(15<<2)|3,{97,48,50}}, +/* 6149 */ {(15<<2)|3,{97,48,50}}, +/* 6150 */ {(15<<2)|3,{97,48,97}}, +/* 6151 */ {(15<<2)|3,{97,48,97}}, +/* 6152 */ {(15<<2)|3,{97,48,99}}, +/* 6153 */ {(15<<2)|3,{97,48,99}}, +/* 6154 */ {(15<<2)|3,{97,48,101}}, +/* 6155 */ {(15<<2)|3,{97,48,101}}, +/* 6156 */ {(15<<2)|3,{97,48,105}}, +/* 6157 */ {(15<<2)|3,{97,48,105}}, +/* 6158 */ {(15<<2)|3,{97,48,111}}, +/* 6159 */ {(15<<2)|3,{97,48,111}}, +/* 6160 */ {(15<<2)|3,{97,48,115}}, +/* 6161 */ {(15<<2)|3,{97,48,115}}, +/* 6162 */ {(15<<2)|3,{97,48,116}}, +/* 6163 */ {(15<<2)|3,{97,48,116}}, +/* 6164 */ {(16<<2)|3,{97,48,32}}, +/* 6165 */ {(16<<2)|3,{97,48,37}}, +/* 6166 */ {(16<<2)|3,{97,48,45}}, +/* 6167 */ {(16<<2)|3,{97,48,46}}, +/* 6168 */ {(16<<2)|3,{97,48,47}}, +/* 6169 */ {(16<<2)|3,{97,48,51}}, +/* 6170 */ {(16<<2)|3,{97,48,52}}, +/* 6171 */ {(16<<2)|3,{97,48,53}}, +/* 6172 */ {(16<<2)|3,{97,48,54}}, +/* 6173 */ {(16<<2)|3,{97,48,55}}, +/* 6174 */ {(16<<2)|3,{97,48,56}}, +/* 6175 */ {(16<<2)|3,{97,48,57}}, +/* 6176 */ {(16<<2)|3,{97,48,61}}, +/* 6177 */ {(16<<2)|3,{97,48,65}}, +/* 6178 */ {(16<<2)|3,{97,48,95}}, +/* 6179 */ {(16<<2)|3,{97,48,98}}, +/* 6180 */ {(16<<2)|3,{97,48,100}}, +/* 6181 */ {(16<<2)|3,{97,48,102}}, +/* 6182 */ {(16<<2)|3,{97,48,103}}, +/* 6183 */ {(16<<2)|3,{97,48,104}}, +/* 6184 */ {(16<<2)|3,{97,48,108}}, +/* 6185 */ {(16<<2)|3,{97,48,109}}, +/* 6186 */ {(16<<2)|3,{97,48,110}}, +/* 6187 */ {(16<<2)|3,{97,48,112}}, +/* 6188 */ {(16<<2)|3,{97,48,114}}, +/* 6189 */ {(16<<2)|3,{97,48,117}}, +/* 6190 */ {(10<<2)|2,{97,48,0}}, +/* 6191 */ {(10<<2)|2,{97,48,0}}, +/* 6192 */ {(10<<2)|2,{97,48,0}}, +/* 6193 */ {(10<<2)|2,{97,48,0}}, +/* 6194 */ {(10<<2)|2,{97,48,0}}, +/* 6195 */ {(10<<2)|2,{97,48,0}}, +/* 6196 */ {(10<<2)|2,{97,48,0}}, +/* 6197 */ {(10<<2)|2,{97,48,0}}, +/* 6198 */ {(10<<2)|2,{97,48,0}}, +/* 6199 */ {(10<<2)|2,{97,48,0}}, +/* 6200 */ {(10<<2)|2,{97,48,0}}, +/* 6201 */ {(10<<2)|2,{97,48,0}}, +/* 6202 */ {(10<<2)|2,{97,48,0}}, +/* 6203 */ {(10<<2)|2,{97,48,0}}, +/* 6204 */ {(10<<2)|2,{97,48,0}}, +/* 6205 */ {(10<<2)|2,{97,48,0}}, +/* 6206 */ {(10<<2)|2,{97,48,0}}, +/* 6207 */ {(10<<2)|2,{97,48,0}}, +/* 6208 */ {(15<<2)|3,{97,49,48}}, +/* 6209 */ {(15<<2)|3,{97,49,48}}, +/* 6210 */ {(15<<2)|3,{97,49,49}}, +/* 6211 */ {(15<<2)|3,{97,49,49}}, +/* 6212 */ {(15<<2)|3,{97,49,50}}, +/* 6213 */ {(15<<2)|3,{97,49,50}}, +/* 6214 */ {(15<<2)|3,{97,49,97}}, +/* 6215 */ {(15<<2)|3,{97,49,97}}, +/* 6216 */ {(15<<2)|3,{97,49,99}}, +/* 6217 */ {(15<<2)|3,{97,49,99}}, +/* 6218 */ {(15<<2)|3,{97,49,101}}, +/* 6219 */ {(15<<2)|3,{97,49,101}}, +/* 6220 */ {(15<<2)|3,{97,49,105}}, +/* 6221 */ {(15<<2)|3,{97,49,105}}, +/* 6222 */ {(15<<2)|3,{97,49,111}}, +/* 6223 */ {(15<<2)|3,{97,49,111}}, +/* 6224 */ {(15<<2)|3,{97,49,115}}, +/* 6225 */ {(15<<2)|3,{97,49,115}}, +/* 6226 */ {(15<<2)|3,{97,49,116}}, +/* 6227 */ {(15<<2)|3,{97,49,116}}, +/* 6228 */ {(16<<2)|3,{97,49,32}}, +/* 6229 */ {(16<<2)|3,{97,49,37}}, +/* 6230 */ {(16<<2)|3,{97,49,45}}, +/* 6231 */ {(16<<2)|3,{97,49,46}}, +/* 6232 */ {(16<<2)|3,{97,49,47}}, +/* 6233 */ {(16<<2)|3,{97,49,51}}, +/* 6234 */ {(16<<2)|3,{97,49,52}}, +/* 6235 */ {(16<<2)|3,{97,49,53}}, +/* 6236 */ {(16<<2)|3,{97,49,54}}, +/* 6237 */ {(16<<2)|3,{97,49,55}}, +/* 6238 */ {(16<<2)|3,{97,49,56}}, +/* 6239 */ {(16<<2)|3,{97,49,57}}, +/* 6240 */ {(16<<2)|3,{97,49,61}}, +/* 6241 */ {(16<<2)|3,{97,49,65}}, +/* 6242 */ {(16<<2)|3,{97,49,95}}, +/* 6243 */ {(16<<2)|3,{97,49,98}}, +/* 6244 */ {(16<<2)|3,{97,49,100}}, +/* 6245 */ {(16<<2)|3,{97,49,102}}, +/* 6246 */ {(16<<2)|3,{97,49,103}}, +/* 6247 */ {(16<<2)|3,{97,49,104}}, +/* 6248 */ {(16<<2)|3,{97,49,108}}, +/* 6249 */ {(16<<2)|3,{97,49,109}}, +/* 6250 */ {(16<<2)|3,{97,49,110}}, +/* 6251 */ {(16<<2)|3,{97,49,112}}, +/* 6252 */ {(16<<2)|3,{97,49,114}}, +/* 6253 */ {(16<<2)|3,{97,49,117}}, +/* 6254 */ {(10<<2)|2,{97,49,0}}, +/* 6255 */ {(10<<2)|2,{97,49,0}}, +/* 6256 */ {(10<<2)|2,{97,49,0}}, +/* 6257 */ {(10<<2)|2,{97,49,0}}, +/* 6258 */ {(10<<2)|2,{97,49,0}}, +/* 6259 */ {(10<<2)|2,{97,49,0}}, +/* 6260 */ {(10<<2)|2,{97,49,0}}, +/* 6261 */ {(10<<2)|2,{97,49,0}}, +/* 6262 */ {(10<<2)|2,{97,49,0}}, +/* 6263 */ {(10<<2)|2,{97,49,0}}, +/* 6264 */ {(10<<2)|2,{97,49,0}}, +/* 6265 */ {(10<<2)|2,{97,49,0}}, +/* 6266 */ {(10<<2)|2,{97,49,0}}, +/* 6267 */ {(10<<2)|2,{97,49,0}}, +/* 6268 */ {(10<<2)|2,{97,49,0}}, +/* 6269 */ {(10<<2)|2,{97,49,0}}, +/* 6270 */ {(10<<2)|2,{97,49,0}}, +/* 6271 */ {(10<<2)|2,{97,49,0}}, +/* 6272 */ {(15<<2)|3,{97,50,48}}, +/* 6273 */ {(15<<2)|3,{97,50,48}}, +/* 6274 */ {(15<<2)|3,{97,50,49}}, +/* 6275 */ {(15<<2)|3,{97,50,49}}, +/* 6276 */ {(15<<2)|3,{97,50,50}}, +/* 6277 */ {(15<<2)|3,{97,50,50}}, +/* 6278 */ {(15<<2)|3,{97,50,97}}, +/* 6279 */ {(15<<2)|3,{97,50,97}}, +/* 6280 */ {(15<<2)|3,{97,50,99}}, +/* 6281 */ {(15<<2)|3,{97,50,99}}, +/* 6282 */ {(15<<2)|3,{97,50,101}}, +/* 6283 */ {(15<<2)|3,{97,50,101}}, +/* 6284 */ {(15<<2)|3,{97,50,105}}, +/* 6285 */ {(15<<2)|3,{97,50,105}}, +/* 6286 */ {(15<<2)|3,{97,50,111}}, +/* 6287 */ {(15<<2)|3,{97,50,111}}, +/* 6288 */ {(15<<2)|3,{97,50,115}}, +/* 6289 */ {(15<<2)|3,{97,50,115}}, +/* 6290 */ {(15<<2)|3,{97,50,116}}, +/* 6291 */ {(15<<2)|3,{97,50,116}}, +/* 6292 */ {(16<<2)|3,{97,50,32}}, +/* 6293 */ {(16<<2)|3,{97,50,37}}, +/* 6294 */ {(16<<2)|3,{97,50,45}}, +/* 6295 */ {(16<<2)|3,{97,50,46}}, +/* 6296 */ {(16<<2)|3,{97,50,47}}, +/* 6297 */ {(16<<2)|3,{97,50,51}}, +/* 6298 */ {(16<<2)|3,{97,50,52}}, +/* 6299 */ {(16<<2)|3,{97,50,53}}, +/* 6300 */ {(16<<2)|3,{97,50,54}}, +/* 6301 */ {(16<<2)|3,{97,50,55}}, +/* 6302 */ {(16<<2)|3,{97,50,56}}, +/* 6303 */ {(16<<2)|3,{97,50,57}}, +/* 6304 */ {(16<<2)|3,{97,50,61}}, +/* 6305 */ {(16<<2)|3,{97,50,65}}, +/* 6306 */ {(16<<2)|3,{97,50,95}}, +/* 6307 */ {(16<<2)|3,{97,50,98}}, +/* 6308 */ {(16<<2)|3,{97,50,100}}, +/* 6309 */ {(16<<2)|3,{97,50,102}}, +/* 6310 */ {(16<<2)|3,{97,50,103}}, +/* 6311 */ {(16<<2)|3,{97,50,104}}, +/* 6312 */ {(16<<2)|3,{97,50,108}}, +/* 6313 */ {(16<<2)|3,{97,50,109}}, +/* 6314 */ {(16<<2)|3,{97,50,110}}, +/* 6315 */ {(16<<2)|3,{97,50,112}}, +/* 6316 */ {(16<<2)|3,{97,50,114}}, +/* 6317 */ {(16<<2)|3,{97,50,117}}, +/* 6318 */ {(10<<2)|2,{97,50,0}}, +/* 6319 */ {(10<<2)|2,{97,50,0}}, +/* 6320 */ {(10<<2)|2,{97,50,0}}, +/* 6321 */ {(10<<2)|2,{97,50,0}}, +/* 6322 */ {(10<<2)|2,{97,50,0}}, +/* 6323 */ {(10<<2)|2,{97,50,0}}, +/* 6324 */ {(10<<2)|2,{97,50,0}}, +/* 6325 */ {(10<<2)|2,{97,50,0}}, +/* 6326 */ {(10<<2)|2,{97,50,0}}, +/* 6327 */ {(10<<2)|2,{97,50,0}}, +/* 6328 */ {(10<<2)|2,{97,50,0}}, +/* 6329 */ {(10<<2)|2,{97,50,0}}, +/* 6330 */ {(10<<2)|2,{97,50,0}}, +/* 6331 */ {(10<<2)|2,{97,50,0}}, +/* 6332 */ {(10<<2)|2,{97,50,0}}, +/* 6333 */ {(10<<2)|2,{97,50,0}}, +/* 6334 */ {(10<<2)|2,{97,50,0}}, +/* 6335 */ {(10<<2)|2,{97,50,0}}, +/* 6336 */ {(15<<2)|3,{97,97,48}}, +/* 6337 */ {(15<<2)|3,{97,97,48}}, +/* 6338 */ {(15<<2)|3,{97,97,49}}, +/* 6339 */ {(15<<2)|3,{97,97,49}}, +/* 6340 */ {(15<<2)|3,{97,97,50}}, +/* 6341 */ {(15<<2)|3,{97,97,50}}, +/* 6342 */ {(15<<2)|3,{97,97,97}}, +/* 6343 */ {(15<<2)|3,{97,97,97}}, +/* 6344 */ {(15<<2)|3,{97,97,99}}, +/* 6345 */ {(15<<2)|3,{97,97,99}}, +/* 6346 */ {(15<<2)|3,{97,97,101}}, +/* 6347 */ {(15<<2)|3,{97,97,101}}, +/* 6348 */ {(15<<2)|3,{97,97,105}}, +/* 6349 */ {(15<<2)|3,{97,97,105}}, +/* 6350 */ {(15<<2)|3,{97,97,111}}, +/* 6351 */ {(15<<2)|3,{97,97,111}}, +/* 6352 */ {(15<<2)|3,{97,97,115}}, +/* 6353 */ {(15<<2)|3,{97,97,115}}, +/* 6354 */ {(15<<2)|3,{97,97,116}}, +/* 6355 */ {(15<<2)|3,{97,97,116}}, +/* 6356 */ {(16<<2)|3,{97,97,32}}, +/* 6357 */ {(16<<2)|3,{97,97,37}}, +/* 6358 */ {(16<<2)|3,{97,97,45}}, +/* 6359 */ {(16<<2)|3,{97,97,46}}, +/* 6360 */ {(16<<2)|3,{97,97,47}}, +/* 6361 */ {(16<<2)|3,{97,97,51}}, +/* 6362 */ {(16<<2)|3,{97,97,52}}, +/* 6363 */ {(16<<2)|3,{97,97,53}}, +/* 6364 */ {(16<<2)|3,{97,97,54}}, +/* 6365 */ {(16<<2)|3,{97,97,55}}, +/* 6366 */ {(16<<2)|3,{97,97,56}}, +/* 6367 */ {(16<<2)|3,{97,97,57}}, +/* 6368 */ {(16<<2)|3,{97,97,61}}, +/* 6369 */ {(16<<2)|3,{97,97,65}}, +/* 6370 */ {(16<<2)|3,{97,97,95}}, +/* 6371 */ {(16<<2)|3,{97,97,98}}, +/* 6372 */ {(16<<2)|3,{97,97,100}}, +/* 6373 */ {(16<<2)|3,{97,97,102}}, +/* 6374 */ {(16<<2)|3,{97,97,103}}, +/* 6375 */ {(16<<2)|3,{97,97,104}}, +/* 6376 */ {(16<<2)|3,{97,97,108}}, +/* 6377 */ {(16<<2)|3,{97,97,109}}, +/* 6378 */ {(16<<2)|3,{97,97,110}}, +/* 6379 */ {(16<<2)|3,{97,97,112}}, +/* 6380 */ {(16<<2)|3,{97,97,114}}, +/* 6381 */ {(16<<2)|3,{97,97,117}}, +/* 6382 */ {(10<<2)|2,{97,97,0}}, +/* 6383 */ {(10<<2)|2,{97,97,0}}, +/* 6384 */ {(10<<2)|2,{97,97,0}}, +/* 6385 */ {(10<<2)|2,{97,97,0}}, +/* 6386 */ {(10<<2)|2,{97,97,0}}, +/* 6387 */ {(10<<2)|2,{97,97,0}}, +/* 6388 */ {(10<<2)|2,{97,97,0}}, +/* 6389 */ {(10<<2)|2,{97,97,0}}, +/* 6390 */ {(10<<2)|2,{97,97,0}}, +/* 6391 */ {(10<<2)|2,{97,97,0}}, +/* 6392 */ {(10<<2)|2,{97,97,0}}, +/* 6393 */ {(10<<2)|2,{97,97,0}}, +/* 6394 */ {(10<<2)|2,{97,97,0}}, +/* 6395 */ {(10<<2)|2,{97,97,0}}, +/* 6396 */ {(10<<2)|2,{97,97,0}}, +/* 6397 */ {(10<<2)|2,{97,97,0}}, +/* 6398 */ {(10<<2)|2,{97,97,0}}, +/* 6399 */ {(10<<2)|2,{97,97,0}}, +/* 6400 */ {(15<<2)|3,{97,99,48}}, +/* 6401 */ {(15<<2)|3,{97,99,48}}, +/* 6402 */ {(15<<2)|3,{97,99,49}}, +/* 6403 */ {(15<<2)|3,{97,99,49}}, +/* 6404 */ {(15<<2)|3,{97,99,50}}, +/* 6405 */ {(15<<2)|3,{97,99,50}}, +/* 6406 */ {(15<<2)|3,{97,99,97}}, +/* 6407 */ {(15<<2)|3,{97,99,97}}, +/* 6408 */ {(15<<2)|3,{97,99,99}}, +/* 6409 */ {(15<<2)|3,{97,99,99}}, +/* 6410 */ {(15<<2)|3,{97,99,101}}, +/* 6411 */ {(15<<2)|3,{97,99,101}}, +/* 6412 */ {(15<<2)|3,{97,99,105}}, +/* 6413 */ {(15<<2)|3,{97,99,105}}, +/* 6414 */ {(15<<2)|3,{97,99,111}}, +/* 6415 */ {(15<<2)|3,{97,99,111}}, +/* 6416 */ {(15<<2)|3,{97,99,115}}, +/* 6417 */ {(15<<2)|3,{97,99,115}}, +/* 6418 */ {(15<<2)|3,{97,99,116}}, +/* 6419 */ {(15<<2)|3,{97,99,116}}, +/* 6420 */ {(16<<2)|3,{97,99,32}}, +/* 6421 */ {(16<<2)|3,{97,99,37}}, +/* 6422 */ {(16<<2)|3,{97,99,45}}, +/* 6423 */ {(16<<2)|3,{97,99,46}}, +/* 6424 */ {(16<<2)|3,{97,99,47}}, +/* 6425 */ {(16<<2)|3,{97,99,51}}, +/* 6426 */ {(16<<2)|3,{97,99,52}}, +/* 6427 */ {(16<<2)|3,{97,99,53}}, +/* 6428 */ {(16<<2)|3,{97,99,54}}, +/* 6429 */ {(16<<2)|3,{97,99,55}}, +/* 6430 */ {(16<<2)|3,{97,99,56}}, +/* 6431 */ {(16<<2)|3,{97,99,57}}, +/* 6432 */ {(16<<2)|3,{97,99,61}}, +/* 6433 */ {(16<<2)|3,{97,99,65}}, +/* 6434 */ {(16<<2)|3,{97,99,95}}, +/* 6435 */ {(16<<2)|3,{97,99,98}}, +/* 6436 */ {(16<<2)|3,{97,99,100}}, +/* 6437 */ {(16<<2)|3,{97,99,102}}, +/* 6438 */ {(16<<2)|3,{97,99,103}}, +/* 6439 */ {(16<<2)|3,{97,99,104}}, +/* 6440 */ {(16<<2)|3,{97,99,108}}, +/* 6441 */ {(16<<2)|3,{97,99,109}}, +/* 6442 */ {(16<<2)|3,{97,99,110}}, +/* 6443 */ {(16<<2)|3,{97,99,112}}, +/* 6444 */ {(16<<2)|3,{97,99,114}}, +/* 6445 */ {(16<<2)|3,{97,99,117}}, +/* 6446 */ {(10<<2)|2,{97,99,0}}, +/* 6447 */ {(10<<2)|2,{97,99,0}}, +/* 6448 */ {(10<<2)|2,{97,99,0}}, +/* 6449 */ {(10<<2)|2,{97,99,0}}, +/* 6450 */ {(10<<2)|2,{97,99,0}}, +/* 6451 */ {(10<<2)|2,{97,99,0}}, +/* 6452 */ {(10<<2)|2,{97,99,0}}, +/* 6453 */ {(10<<2)|2,{97,99,0}}, +/* 6454 */ {(10<<2)|2,{97,99,0}}, +/* 6455 */ {(10<<2)|2,{97,99,0}}, +/* 6456 */ {(10<<2)|2,{97,99,0}}, +/* 6457 */ {(10<<2)|2,{97,99,0}}, +/* 6458 */ {(10<<2)|2,{97,99,0}}, +/* 6459 */ {(10<<2)|2,{97,99,0}}, +/* 6460 */ {(10<<2)|2,{97,99,0}}, +/* 6461 */ {(10<<2)|2,{97,99,0}}, +/* 6462 */ {(10<<2)|2,{97,99,0}}, +/* 6463 */ {(10<<2)|2,{97,99,0}}, +/* 6464 */ {(15<<2)|3,{97,101,48}}, +/* 6465 */ {(15<<2)|3,{97,101,48}}, +/* 6466 */ {(15<<2)|3,{97,101,49}}, +/* 6467 */ {(15<<2)|3,{97,101,49}}, +/* 6468 */ {(15<<2)|3,{97,101,50}}, +/* 6469 */ {(15<<2)|3,{97,101,50}}, +/* 6470 */ {(15<<2)|3,{97,101,97}}, +/* 6471 */ {(15<<2)|3,{97,101,97}}, +/* 6472 */ {(15<<2)|3,{97,101,99}}, +/* 6473 */ {(15<<2)|3,{97,101,99}}, +/* 6474 */ {(15<<2)|3,{97,101,101}}, +/* 6475 */ {(15<<2)|3,{97,101,101}}, +/* 6476 */ {(15<<2)|3,{97,101,105}}, +/* 6477 */ {(15<<2)|3,{97,101,105}}, +/* 6478 */ {(15<<2)|3,{97,101,111}}, +/* 6479 */ {(15<<2)|3,{97,101,111}}, +/* 6480 */ {(15<<2)|3,{97,101,115}}, +/* 6481 */ {(15<<2)|3,{97,101,115}}, +/* 6482 */ {(15<<2)|3,{97,101,116}}, +/* 6483 */ {(15<<2)|3,{97,101,116}}, +/* 6484 */ {(16<<2)|3,{97,101,32}}, +/* 6485 */ {(16<<2)|3,{97,101,37}}, +/* 6486 */ {(16<<2)|3,{97,101,45}}, +/* 6487 */ {(16<<2)|3,{97,101,46}}, +/* 6488 */ {(16<<2)|3,{97,101,47}}, +/* 6489 */ {(16<<2)|3,{97,101,51}}, +/* 6490 */ {(16<<2)|3,{97,101,52}}, +/* 6491 */ {(16<<2)|3,{97,101,53}}, +/* 6492 */ {(16<<2)|3,{97,101,54}}, +/* 6493 */ {(16<<2)|3,{97,101,55}}, +/* 6494 */ {(16<<2)|3,{97,101,56}}, +/* 6495 */ {(16<<2)|3,{97,101,57}}, +/* 6496 */ {(16<<2)|3,{97,101,61}}, +/* 6497 */ {(16<<2)|3,{97,101,65}}, +/* 6498 */ {(16<<2)|3,{97,101,95}}, +/* 6499 */ {(16<<2)|3,{97,101,98}}, +/* 6500 */ {(16<<2)|3,{97,101,100}}, +/* 6501 */ {(16<<2)|3,{97,101,102}}, +/* 6502 */ {(16<<2)|3,{97,101,103}}, +/* 6503 */ {(16<<2)|3,{97,101,104}}, +/* 6504 */ {(16<<2)|3,{97,101,108}}, +/* 6505 */ {(16<<2)|3,{97,101,109}}, +/* 6506 */ {(16<<2)|3,{97,101,110}}, +/* 6507 */ {(16<<2)|3,{97,101,112}}, +/* 6508 */ {(16<<2)|3,{97,101,114}}, +/* 6509 */ {(16<<2)|3,{97,101,117}}, +/* 6510 */ {(10<<2)|2,{97,101,0}}, +/* 6511 */ {(10<<2)|2,{97,101,0}}, +/* 6512 */ {(10<<2)|2,{97,101,0}}, +/* 6513 */ {(10<<2)|2,{97,101,0}}, +/* 6514 */ {(10<<2)|2,{97,101,0}}, +/* 6515 */ {(10<<2)|2,{97,101,0}}, +/* 6516 */ {(10<<2)|2,{97,101,0}}, +/* 6517 */ {(10<<2)|2,{97,101,0}}, +/* 6518 */ {(10<<2)|2,{97,101,0}}, +/* 6519 */ {(10<<2)|2,{97,101,0}}, +/* 6520 */ {(10<<2)|2,{97,101,0}}, +/* 6521 */ {(10<<2)|2,{97,101,0}}, +/* 6522 */ {(10<<2)|2,{97,101,0}}, +/* 6523 */ {(10<<2)|2,{97,101,0}}, +/* 6524 */ {(10<<2)|2,{97,101,0}}, +/* 6525 */ {(10<<2)|2,{97,101,0}}, +/* 6526 */ {(10<<2)|2,{97,101,0}}, +/* 6527 */ {(10<<2)|2,{97,101,0}}, +/* 6528 */ {(15<<2)|3,{97,105,48}}, +/* 6529 */ {(15<<2)|3,{97,105,48}}, +/* 6530 */ {(15<<2)|3,{97,105,49}}, +/* 6531 */ {(15<<2)|3,{97,105,49}}, +/* 6532 */ {(15<<2)|3,{97,105,50}}, +/* 6533 */ {(15<<2)|3,{97,105,50}}, +/* 6534 */ {(15<<2)|3,{97,105,97}}, +/* 6535 */ {(15<<2)|3,{97,105,97}}, +/* 6536 */ {(15<<2)|3,{97,105,99}}, +/* 6537 */ {(15<<2)|3,{97,105,99}}, +/* 6538 */ {(15<<2)|3,{97,105,101}}, +/* 6539 */ {(15<<2)|3,{97,105,101}}, +/* 6540 */ {(15<<2)|3,{97,105,105}}, +/* 6541 */ {(15<<2)|3,{97,105,105}}, +/* 6542 */ {(15<<2)|3,{97,105,111}}, +/* 6543 */ {(15<<2)|3,{97,105,111}}, +/* 6544 */ {(15<<2)|3,{97,105,115}}, +/* 6545 */ {(15<<2)|3,{97,105,115}}, +/* 6546 */ {(15<<2)|3,{97,105,116}}, +/* 6547 */ {(15<<2)|3,{97,105,116}}, +/* 6548 */ {(16<<2)|3,{97,105,32}}, +/* 6549 */ {(16<<2)|3,{97,105,37}}, +/* 6550 */ {(16<<2)|3,{97,105,45}}, +/* 6551 */ {(16<<2)|3,{97,105,46}}, +/* 6552 */ {(16<<2)|3,{97,105,47}}, +/* 6553 */ {(16<<2)|3,{97,105,51}}, +/* 6554 */ {(16<<2)|3,{97,105,52}}, +/* 6555 */ {(16<<2)|3,{97,105,53}}, +/* 6556 */ {(16<<2)|3,{97,105,54}}, +/* 6557 */ {(16<<2)|3,{97,105,55}}, +/* 6558 */ {(16<<2)|3,{97,105,56}}, +/* 6559 */ {(16<<2)|3,{97,105,57}}, +/* 6560 */ {(16<<2)|3,{97,105,61}}, +/* 6561 */ {(16<<2)|3,{97,105,65}}, +/* 6562 */ {(16<<2)|3,{97,105,95}}, +/* 6563 */ {(16<<2)|3,{97,105,98}}, +/* 6564 */ {(16<<2)|3,{97,105,100}}, +/* 6565 */ {(16<<2)|3,{97,105,102}}, +/* 6566 */ {(16<<2)|3,{97,105,103}}, +/* 6567 */ {(16<<2)|3,{97,105,104}}, +/* 6568 */ {(16<<2)|3,{97,105,108}}, +/* 6569 */ {(16<<2)|3,{97,105,109}}, +/* 6570 */ {(16<<2)|3,{97,105,110}}, +/* 6571 */ {(16<<2)|3,{97,105,112}}, +/* 6572 */ {(16<<2)|3,{97,105,114}}, +/* 6573 */ {(16<<2)|3,{97,105,117}}, +/* 6574 */ {(10<<2)|2,{97,105,0}}, +/* 6575 */ {(10<<2)|2,{97,105,0}}, +/* 6576 */ {(10<<2)|2,{97,105,0}}, +/* 6577 */ {(10<<2)|2,{97,105,0}}, +/* 6578 */ {(10<<2)|2,{97,105,0}}, +/* 6579 */ {(10<<2)|2,{97,105,0}}, +/* 6580 */ {(10<<2)|2,{97,105,0}}, +/* 6581 */ {(10<<2)|2,{97,105,0}}, +/* 6582 */ {(10<<2)|2,{97,105,0}}, +/* 6583 */ {(10<<2)|2,{97,105,0}}, +/* 6584 */ {(10<<2)|2,{97,105,0}}, +/* 6585 */ {(10<<2)|2,{97,105,0}}, +/* 6586 */ {(10<<2)|2,{97,105,0}}, +/* 6587 */ {(10<<2)|2,{97,105,0}}, +/* 6588 */ {(10<<2)|2,{97,105,0}}, +/* 6589 */ {(10<<2)|2,{97,105,0}}, +/* 6590 */ {(10<<2)|2,{97,105,0}}, +/* 6591 */ {(10<<2)|2,{97,105,0}}, +/* 6592 */ {(15<<2)|3,{97,111,48}}, +/* 6593 */ {(15<<2)|3,{97,111,48}}, +/* 6594 */ {(15<<2)|3,{97,111,49}}, +/* 6595 */ {(15<<2)|3,{97,111,49}}, +/* 6596 */ {(15<<2)|3,{97,111,50}}, +/* 6597 */ {(15<<2)|3,{97,111,50}}, +/* 6598 */ {(15<<2)|3,{97,111,97}}, +/* 6599 */ {(15<<2)|3,{97,111,97}}, +/* 6600 */ {(15<<2)|3,{97,111,99}}, +/* 6601 */ {(15<<2)|3,{97,111,99}}, +/* 6602 */ {(15<<2)|3,{97,111,101}}, +/* 6603 */ {(15<<2)|3,{97,111,101}}, +/* 6604 */ {(15<<2)|3,{97,111,105}}, +/* 6605 */ {(15<<2)|3,{97,111,105}}, +/* 6606 */ {(15<<2)|3,{97,111,111}}, +/* 6607 */ {(15<<2)|3,{97,111,111}}, +/* 6608 */ {(15<<2)|3,{97,111,115}}, +/* 6609 */ {(15<<2)|3,{97,111,115}}, +/* 6610 */ {(15<<2)|3,{97,111,116}}, +/* 6611 */ {(15<<2)|3,{97,111,116}}, +/* 6612 */ {(16<<2)|3,{97,111,32}}, +/* 6613 */ {(16<<2)|3,{97,111,37}}, +/* 6614 */ {(16<<2)|3,{97,111,45}}, +/* 6615 */ {(16<<2)|3,{97,111,46}}, +/* 6616 */ {(16<<2)|3,{97,111,47}}, +/* 6617 */ {(16<<2)|3,{97,111,51}}, +/* 6618 */ {(16<<2)|3,{97,111,52}}, +/* 6619 */ {(16<<2)|3,{97,111,53}}, +/* 6620 */ {(16<<2)|3,{97,111,54}}, +/* 6621 */ {(16<<2)|3,{97,111,55}}, +/* 6622 */ {(16<<2)|3,{97,111,56}}, +/* 6623 */ {(16<<2)|3,{97,111,57}}, +/* 6624 */ {(16<<2)|3,{97,111,61}}, +/* 6625 */ {(16<<2)|3,{97,111,65}}, +/* 6626 */ {(16<<2)|3,{97,111,95}}, +/* 6627 */ {(16<<2)|3,{97,111,98}}, +/* 6628 */ {(16<<2)|3,{97,111,100}}, +/* 6629 */ {(16<<2)|3,{97,111,102}}, +/* 6630 */ {(16<<2)|3,{97,111,103}}, +/* 6631 */ {(16<<2)|3,{97,111,104}}, +/* 6632 */ {(16<<2)|3,{97,111,108}}, +/* 6633 */ {(16<<2)|3,{97,111,109}}, +/* 6634 */ {(16<<2)|3,{97,111,110}}, +/* 6635 */ {(16<<2)|3,{97,111,112}}, +/* 6636 */ {(16<<2)|3,{97,111,114}}, +/* 6637 */ {(16<<2)|3,{97,111,117}}, +/* 6638 */ {(10<<2)|2,{97,111,0}}, +/* 6639 */ {(10<<2)|2,{97,111,0}}, +/* 6640 */ {(10<<2)|2,{97,111,0}}, +/* 6641 */ {(10<<2)|2,{97,111,0}}, +/* 6642 */ {(10<<2)|2,{97,111,0}}, +/* 6643 */ {(10<<2)|2,{97,111,0}}, +/* 6644 */ {(10<<2)|2,{97,111,0}}, +/* 6645 */ {(10<<2)|2,{97,111,0}}, +/* 6646 */ {(10<<2)|2,{97,111,0}}, +/* 6647 */ {(10<<2)|2,{97,111,0}}, +/* 6648 */ {(10<<2)|2,{97,111,0}}, +/* 6649 */ {(10<<2)|2,{97,111,0}}, +/* 6650 */ {(10<<2)|2,{97,111,0}}, +/* 6651 */ {(10<<2)|2,{97,111,0}}, +/* 6652 */ {(10<<2)|2,{97,111,0}}, +/* 6653 */ {(10<<2)|2,{97,111,0}}, +/* 6654 */ {(10<<2)|2,{97,111,0}}, +/* 6655 */ {(10<<2)|2,{97,111,0}}, +/* 6656 */ {(15<<2)|3,{97,115,48}}, +/* 6657 */ {(15<<2)|3,{97,115,48}}, +/* 6658 */ {(15<<2)|3,{97,115,49}}, +/* 6659 */ {(15<<2)|3,{97,115,49}}, +/* 6660 */ {(15<<2)|3,{97,115,50}}, +/* 6661 */ {(15<<2)|3,{97,115,50}}, +/* 6662 */ {(15<<2)|3,{97,115,97}}, +/* 6663 */ {(15<<2)|3,{97,115,97}}, +/* 6664 */ {(15<<2)|3,{97,115,99}}, +/* 6665 */ {(15<<2)|3,{97,115,99}}, +/* 6666 */ {(15<<2)|3,{97,115,101}}, +/* 6667 */ {(15<<2)|3,{97,115,101}}, +/* 6668 */ {(15<<2)|3,{97,115,105}}, +/* 6669 */ {(15<<2)|3,{97,115,105}}, +/* 6670 */ {(15<<2)|3,{97,115,111}}, +/* 6671 */ {(15<<2)|3,{97,115,111}}, +/* 6672 */ {(15<<2)|3,{97,115,115}}, +/* 6673 */ {(15<<2)|3,{97,115,115}}, +/* 6674 */ {(15<<2)|3,{97,115,116}}, +/* 6675 */ {(15<<2)|3,{97,115,116}}, +/* 6676 */ {(16<<2)|3,{97,115,32}}, +/* 6677 */ {(16<<2)|3,{97,115,37}}, +/* 6678 */ {(16<<2)|3,{97,115,45}}, +/* 6679 */ {(16<<2)|3,{97,115,46}}, +/* 6680 */ {(16<<2)|3,{97,115,47}}, +/* 6681 */ {(16<<2)|3,{97,115,51}}, +/* 6682 */ {(16<<2)|3,{97,115,52}}, +/* 6683 */ {(16<<2)|3,{97,115,53}}, +/* 6684 */ {(16<<2)|3,{97,115,54}}, +/* 6685 */ {(16<<2)|3,{97,115,55}}, +/* 6686 */ {(16<<2)|3,{97,115,56}}, +/* 6687 */ {(16<<2)|3,{97,115,57}}, +/* 6688 */ {(16<<2)|3,{97,115,61}}, +/* 6689 */ {(16<<2)|3,{97,115,65}}, +/* 6690 */ {(16<<2)|3,{97,115,95}}, +/* 6691 */ {(16<<2)|3,{97,115,98}}, +/* 6692 */ {(16<<2)|3,{97,115,100}}, +/* 6693 */ {(16<<2)|3,{97,115,102}}, +/* 6694 */ {(16<<2)|3,{97,115,103}}, +/* 6695 */ {(16<<2)|3,{97,115,104}}, +/* 6696 */ {(16<<2)|3,{97,115,108}}, +/* 6697 */ {(16<<2)|3,{97,115,109}}, +/* 6698 */ {(16<<2)|3,{97,115,110}}, +/* 6699 */ {(16<<2)|3,{97,115,112}}, +/* 6700 */ {(16<<2)|3,{97,115,114}}, +/* 6701 */ {(16<<2)|3,{97,115,117}}, +/* 6702 */ {(10<<2)|2,{97,115,0}}, +/* 6703 */ {(10<<2)|2,{97,115,0}}, +/* 6704 */ {(10<<2)|2,{97,115,0}}, +/* 6705 */ {(10<<2)|2,{97,115,0}}, +/* 6706 */ {(10<<2)|2,{97,115,0}}, +/* 6707 */ {(10<<2)|2,{97,115,0}}, +/* 6708 */ {(10<<2)|2,{97,115,0}}, +/* 6709 */ {(10<<2)|2,{97,115,0}}, +/* 6710 */ {(10<<2)|2,{97,115,0}}, +/* 6711 */ {(10<<2)|2,{97,115,0}}, +/* 6712 */ {(10<<2)|2,{97,115,0}}, +/* 6713 */ {(10<<2)|2,{97,115,0}}, +/* 6714 */ {(10<<2)|2,{97,115,0}}, +/* 6715 */ {(10<<2)|2,{97,115,0}}, +/* 6716 */ {(10<<2)|2,{97,115,0}}, +/* 6717 */ {(10<<2)|2,{97,115,0}}, +/* 6718 */ {(10<<2)|2,{97,115,0}}, +/* 6719 */ {(10<<2)|2,{97,115,0}}, +/* 6720 */ {(15<<2)|3,{97,116,48}}, +/* 6721 */ {(15<<2)|3,{97,116,48}}, +/* 6722 */ {(15<<2)|3,{97,116,49}}, +/* 6723 */ {(15<<2)|3,{97,116,49}}, +/* 6724 */ {(15<<2)|3,{97,116,50}}, +/* 6725 */ {(15<<2)|3,{97,116,50}}, +/* 6726 */ {(15<<2)|3,{97,116,97}}, +/* 6727 */ {(15<<2)|3,{97,116,97}}, +/* 6728 */ {(15<<2)|3,{97,116,99}}, +/* 6729 */ {(15<<2)|3,{97,116,99}}, +/* 6730 */ {(15<<2)|3,{97,116,101}}, +/* 6731 */ {(15<<2)|3,{97,116,101}}, +/* 6732 */ {(15<<2)|3,{97,116,105}}, +/* 6733 */ {(15<<2)|3,{97,116,105}}, +/* 6734 */ {(15<<2)|3,{97,116,111}}, +/* 6735 */ {(15<<2)|3,{97,116,111}}, +/* 6736 */ {(15<<2)|3,{97,116,115}}, +/* 6737 */ {(15<<2)|3,{97,116,115}}, +/* 6738 */ {(15<<2)|3,{97,116,116}}, +/* 6739 */ {(15<<2)|3,{97,116,116}}, +/* 6740 */ {(16<<2)|3,{97,116,32}}, +/* 6741 */ {(16<<2)|3,{97,116,37}}, +/* 6742 */ {(16<<2)|3,{97,116,45}}, +/* 6743 */ {(16<<2)|3,{97,116,46}}, +/* 6744 */ {(16<<2)|3,{97,116,47}}, +/* 6745 */ {(16<<2)|3,{97,116,51}}, +/* 6746 */ {(16<<2)|3,{97,116,52}}, +/* 6747 */ {(16<<2)|3,{97,116,53}}, +/* 6748 */ {(16<<2)|3,{97,116,54}}, +/* 6749 */ {(16<<2)|3,{97,116,55}}, +/* 6750 */ {(16<<2)|3,{97,116,56}}, +/* 6751 */ {(16<<2)|3,{97,116,57}}, +/* 6752 */ {(16<<2)|3,{97,116,61}}, +/* 6753 */ {(16<<2)|3,{97,116,65}}, +/* 6754 */ {(16<<2)|3,{97,116,95}}, +/* 6755 */ {(16<<2)|3,{97,116,98}}, +/* 6756 */ {(16<<2)|3,{97,116,100}}, +/* 6757 */ {(16<<2)|3,{97,116,102}}, +/* 6758 */ {(16<<2)|3,{97,116,103}}, +/* 6759 */ {(16<<2)|3,{97,116,104}}, +/* 6760 */ {(16<<2)|3,{97,116,108}}, +/* 6761 */ {(16<<2)|3,{97,116,109}}, +/* 6762 */ {(16<<2)|3,{97,116,110}}, +/* 6763 */ {(16<<2)|3,{97,116,112}}, +/* 6764 */ {(16<<2)|3,{97,116,114}}, +/* 6765 */ {(16<<2)|3,{97,116,117}}, +/* 6766 */ {(10<<2)|2,{97,116,0}}, +/* 6767 */ {(10<<2)|2,{97,116,0}}, +/* 6768 */ {(10<<2)|2,{97,116,0}}, +/* 6769 */ {(10<<2)|2,{97,116,0}}, +/* 6770 */ {(10<<2)|2,{97,116,0}}, +/* 6771 */ {(10<<2)|2,{97,116,0}}, +/* 6772 */ {(10<<2)|2,{97,116,0}}, +/* 6773 */ {(10<<2)|2,{97,116,0}}, +/* 6774 */ {(10<<2)|2,{97,116,0}}, +/* 6775 */ {(10<<2)|2,{97,116,0}}, +/* 6776 */ {(10<<2)|2,{97,116,0}}, +/* 6777 */ {(10<<2)|2,{97,116,0}}, +/* 6778 */ {(10<<2)|2,{97,116,0}}, +/* 6779 */ {(10<<2)|2,{97,116,0}}, +/* 6780 */ {(10<<2)|2,{97,116,0}}, +/* 6781 */ {(10<<2)|2,{97,116,0}}, +/* 6782 */ {(10<<2)|2,{97,116,0}}, +/* 6783 */ {(10<<2)|2,{97,116,0}}, +/* 6784 */ {(16<<2)|3,{97,32,48}}, +/* 6785 */ {(16<<2)|3,{97,32,49}}, +/* 6786 */ {(16<<2)|3,{97,32,50}}, +/* 6787 */ {(16<<2)|3,{97,32,97}}, +/* 6788 */ {(16<<2)|3,{97,32,99}}, +/* 6789 */ {(16<<2)|3,{97,32,101}}, +/* 6790 */ {(16<<2)|3,{97,32,105}}, +/* 6791 */ {(16<<2)|3,{97,32,111}}, +/* 6792 */ {(16<<2)|3,{97,32,115}}, +/* 6793 */ {(16<<2)|3,{97,32,116}}, +/* 6794 */ {(11<<2)|2,{97,32,0}}, +/* 6795 */ {(11<<2)|2,{97,32,0}}, +/* 6796 */ {(11<<2)|2,{97,32,0}}, +/* 6797 */ {(11<<2)|2,{97,32,0}}, +/* 6798 */ {(11<<2)|2,{97,32,0}}, +/* 6799 */ {(11<<2)|2,{97,32,0}}, +/* 6800 */ {(11<<2)|2,{97,32,0}}, +/* 6801 */ {(11<<2)|2,{97,32,0}}, +/* 6802 */ {(11<<2)|2,{97,32,0}}, +/* 6803 */ {(11<<2)|2,{97,32,0}}, +/* 6804 */ {(11<<2)|2,{97,32,0}}, +/* 6805 */ {(11<<2)|2,{97,32,0}}, +/* 6806 */ {(11<<2)|2,{97,32,0}}, +/* 6807 */ {(11<<2)|2,{97,32,0}}, +/* 6808 */ {(11<<2)|2,{97,32,0}}, +/* 6809 */ {(11<<2)|2,{97,32,0}}, +/* 6810 */ {(11<<2)|2,{97,32,0}}, +/* 6811 */ {(11<<2)|2,{97,32,0}}, +/* 6812 */ {(11<<2)|2,{97,32,0}}, +/* 6813 */ {(11<<2)|2,{97,32,0}}, +/* 6814 */ {(11<<2)|2,{97,32,0}}, +/* 6815 */ {(11<<2)|2,{97,32,0}}, +/* 6816 */ {(16<<2)|3,{97,37,48}}, +/* 6817 */ {(16<<2)|3,{97,37,49}}, +/* 6818 */ {(16<<2)|3,{97,37,50}}, +/* 6819 */ {(16<<2)|3,{97,37,97}}, +/* 6820 */ {(16<<2)|3,{97,37,99}}, +/* 6821 */ {(16<<2)|3,{97,37,101}}, +/* 6822 */ {(16<<2)|3,{97,37,105}}, +/* 6823 */ {(16<<2)|3,{97,37,111}}, +/* 6824 */ {(16<<2)|3,{97,37,115}}, +/* 6825 */ {(16<<2)|3,{97,37,116}}, +/* 6826 */ {(11<<2)|2,{97,37,0}}, +/* 6827 */ {(11<<2)|2,{97,37,0}}, +/* 6828 */ {(11<<2)|2,{97,37,0}}, +/* 6829 */ {(11<<2)|2,{97,37,0}}, +/* 6830 */ {(11<<2)|2,{97,37,0}}, +/* 6831 */ {(11<<2)|2,{97,37,0}}, +/* 6832 */ {(11<<2)|2,{97,37,0}}, +/* 6833 */ {(11<<2)|2,{97,37,0}}, +/* 6834 */ {(11<<2)|2,{97,37,0}}, +/* 6835 */ {(11<<2)|2,{97,37,0}}, +/* 6836 */ {(11<<2)|2,{97,37,0}}, +/* 6837 */ {(11<<2)|2,{97,37,0}}, +/* 6838 */ {(11<<2)|2,{97,37,0}}, +/* 6839 */ {(11<<2)|2,{97,37,0}}, +/* 6840 */ {(11<<2)|2,{97,37,0}}, +/* 6841 */ {(11<<2)|2,{97,37,0}}, +/* 6842 */ {(11<<2)|2,{97,37,0}}, +/* 6843 */ {(11<<2)|2,{97,37,0}}, +/* 6844 */ {(11<<2)|2,{97,37,0}}, +/* 6845 */ {(11<<2)|2,{97,37,0}}, +/* 6846 */ {(11<<2)|2,{97,37,0}}, +/* 6847 */ {(11<<2)|2,{97,37,0}}, +/* 6848 */ {(16<<2)|3,{97,45,48}}, +/* 6849 */ {(16<<2)|3,{97,45,49}}, +/* 6850 */ {(16<<2)|3,{97,45,50}}, +/* 6851 */ {(16<<2)|3,{97,45,97}}, +/* 6852 */ {(16<<2)|3,{97,45,99}}, +/* 6853 */ {(16<<2)|3,{97,45,101}}, +/* 6854 */ {(16<<2)|3,{97,45,105}}, +/* 6855 */ {(16<<2)|3,{97,45,111}}, +/* 6856 */ {(16<<2)|3,{97,45,115}}, +/* 6857 */ {(16<<2)|3,{97,45,116}}, +/* 6858 */ {(11<<2)|2,{97,45,0}}, +/* 6859 */ {(11<<2)|2,{97,45,0}}, +/* 6860 */ {(11<<2)|2,{97,45,0}}, +/* 6861 */ {(11<<2)|2,{97,45,0}}, +/* 6862 */ {(11<<2)|2,{97,45,0}}, +/* 6863 */ {(11<<2)|2,{97,45,0}}, +/* 6864 */ {(11<<2)|2,{97,45,0}}, +/* 6865 */ {(11<<2)|2,{97,45,0}}, +/* 6866 */ {(11<<2)|2,{97,45,0}}, +/* 6867 */ {(11<<2)|2,{97,45,0}}, +/* 6868 */ {(11<<2)|2,{97,45,0}}, +/* 6869 */ {(11<<2)|2,{97,45,0}}, +/* 6870 */ {(11<<2)|2,{97,45,0}}, +/* 6871 */ {(11<<2)|2,{97,45,0}}, +/* 6872 */ {(11<<2)|2,{97,45,0}}, +/* 6873 */ {(11<<2)|2,{97,45,0}}, +/* 6874 */ {(11<<2)|2,{97,45,0}}, +/* 6875 */ {(11<<2)|2,{97,45,0}}, +/* 6876 */ {(11<<2)|2,{97,45,0}}, +/* 6877 */ {(11<<2)|2,{97,45,0}}, +/* 6878 */ {(11<<2)|2,{97,45,0}}, +/* 6879 */ {(11<<2)|2,{97,45,0}}, +/* 6880 */ {(16<<2)|3,{97,46,48}}, +/* 6881 */ {(16<<2)|3,{97,46,49}}, +/* 6882 */ {(16<<2)|3,{97,46,50}}, +/* 6883 */ {(16<<2)|3,{97,46,97}}, +/* 6884 */ {(16<<2)|3,{97,46,99}}, +/* 6885 */ {(16<<2)|3,{97,46,101}}, +/* 6886 */ {(16<<2)|3,{97,46,105}}, +/* 6887 */ {(16<<2)|3,{97,46,111}}, +/* 6888 */ {(16<<2)|3,{97,46,115}}, +/* 6889 */ {(16<<2)|3,{97,46,116}}, +/* 6890 */ {(11<<2)|2,{97,46,0}}, +/* 6891 */ {(11<<2)|2,{97,46,0}}, +/* 6892 */ {(11<<2)|2,{97,46,0}}, +/* 6893 */ {(11<<2)|2,{97,46,0}}, +/* 6894 */ {(11<<2)|2,{97,46,0}}, +/* 6895 */ {(11<<2)|2,{97,46,0}}, +/* 6896 */ {(11<<2)|2,{97,46,0}}, +/* 6897 */ {(11<<2)|2,{97,46,0}}, +/* 6898 */ {(11<<2)|2,{97,46,0}}, +/* 6899 */ {(11<<2)|2,{97,46,0}}, +/* 6900 */ {(11<<2)|2,{97,46,0}}, +/* 6901 */ {(11<<2)|2,{97,46,0}}, +/* 6902 */ {(11<<2)|2,{97,46,0}}, +/* 6903 */ {(11<<2)|2,{97,46,0}}, +/* 6904 */ {(11<<2)|2,{97,46,0}}, +/* 6905 */ {(11<<2)|2,{97,46,0}}, +/* 6906 */ {(11<<2)|2,{97,46,0}}, +/* 6907 */ {(11<<2)|2,{97,46,0}}, +/* 6908 */ {(11<<2)|2,{97,46,0}}, +/* 6909 */ {(11<<2)|2,{97,46,0}}, +/* 6910 */ {(11<<2)|2,{97,46,0}}, +/* 6911 */ {(11<<2)|2,{97,46,0}}, +/* 6912 */ {(16<<2)|3,{97,47,48}}, +/* 6913 */ {(16<<2)|3,{97,47,49}}, +/* 6914 */ {(16<<2)|3,{97,47,50}}, +/* 6915 */ {(16<<2)|3,{97,47,97}}, +/* 6916 */ {(16<<2)|3,{97,47,99}}, +/* 6917 */ {(16<<2)|3,{97,47,101}}, +/* 6918 */ {(16<<2)|3,{97,47,105}}, +/* 6919 */ {(16<<2)|3,{97,47,111}}, +/* 6920 */ {(16<<2)|3,{97,47,115}}, +/* 6921 */ {(16<<2)|3,{97,47,116}}, +/* 6922 */ {(11<<2)|2,{97,47,0}}, +/* 6923 */ {(11<<2)|2,{97,47,0}}, +/* 6924 */ {(11<<2)|2,{97,47,0}}, +/* 6925 */ {(11<<2)|2,{97,47,0}}, +/* 6926 */ {(11<<2)|2,{97,47,0}}, +/* 6927 */ {(11<<2)|2,{97,47,0}}, +/* 6928 */ {(11<<2)|2,{97,47,0}}, +/* 6929 */ {(11<<2)|2,{97,47,0}}, +/* 6930 */ {(11<<2)|2,{97,47,0}}, +/* 6931 */ {(11<<2)|2,{97,47,0}}, +/* 6932 */ {(11<<2)|2,{97,47,0}}, +/* 6933 */ {(11<<2)|2,{97,47,0}}, +/* 6934 */ {(11<<2)|2,{97,47,0}}, +/* 6935 */ {(11<<2)|2,{97,47,0}}, +/* 6936 */ {(11<<2)|2,{97,47,0}}, +/* 6937 */ {(11<<2)|2,{97,47,0}}, +/* 6938 */ {(11<<2)|2,{97,47,0}}, +/* 6939 */ {(11<<2)|2,{97,47,0}}, +/* 6940 */ {(11<<2)|2,{97,47,0}}, +/* 6941 */ {(11<<2)|2,{97,47,0}}, +/* 6942 */ {(11<<2)|2,{97,47,0}}, +/* 6943 */ {(11<<2)|2,{97,47,0}}, +/* 6944 */ {(16<<2)|3,{97,51,48}}, +/* 6945 */ {(16<<2)|3,{97,51,49}}, +/* 6946 */ {(16<<2)|3,{97,51,50}}, +/* 6947 */ {(16<<2)|3,{97,51,97}}, +/* 6948 */ {(16<<2)|3,{97,51,99}}, +/* 6949 */ {(16<<2)|3,{97,51,101}}, +/* 6950 */ {(16<<2)|3,{97,51,105}}, +/* 6951 */ {(16<<2)|3,{97,51,111}}, +/* 6952 */ {(16<<2)|3,{97,51,115}}, +/* 6953 */ {(16<<2)|3,{97,51,116}}, +/* 6954 */ {(11<<2)|2,{97,51,0}}, +/* 6955 */ {(11<<2)|2,{97,51,0}}, +/* 6956 */ {(11<<2)|2,{97,51,0}}, +/* 6957 */ {(11<<2)|2,{97,51,0}}, +/* 6958 */ {(11<<2)|2,{97,51,0}}, +/* 6959 */ {(11<<2)|2,{97,51,0}}, +/* 6960 */ {(11<<2)|2,{97,51,0}}, +/* 6961 */ {(11<<2)|2,{97,51,0}}, +/* 6962 */ {(11<<2)|2,{97,51,0}}, +/* 6963 */ {(11<<2)|2,{97,51,0}}, +/* 6964 */ {(11<<2)|2,{97,51,0}}, +/* 6965 */ {(11<<2)|2,{97,51,0}}, +/* 6966 */ {(11<<2)|2,{97,51,0}}, +/* 6967 */ {(11<<2)|2,{97,51,0}}, +/* 6968 */ {(11<<2)|2,{97,51,0}}, +/* 6969 */ {(11<<2)|2,{97,51,0}}, +/* 6970 */ {(11<<2)|2,{97,51,0}}, +/* 6971 */ {(11<<2)|2,{97,51,0}}, +/* 6972 */ {(11<<2)|2,{97,51,0}}, +/* 6973 */ {(11<<2)|2,{97,51,0}}, +/* 6974 */ {(11<<2)|2,{97,51,0}}, +/* 6975 */ {(11<<2)|2,{97,51,0}}, +/* 6976 */ {(16<<2)|3,{97,52,48}}, +/* 6977 */ {(16<<2)|3,{97,52,49}}, +/* 6978 */ {(16<<2)|3,{97,52,50}}, +/* 6979 */ {(16<<2)|3,{97,52,97}}, +/* 6980 */ {(16<<2)|3,{97,52,99}}, +/* 6981 */ {(16<<2)|3,{97,52,101}}, +/* 6982 */ {(16<<2)|3,{97,52,105}}, +/* 6983 */ {(16<<2)|3,{97,52,111}}, +/* 6984 */ {(16<<2)|3,{97,52,115}}, +/* 6985 */ {(16<<2)|3,{97,52,116}}, +/* 6986 */ {(11<<2)|2,{97,52,0}}, +/* 6987 */ {(11<<2)|2,{97,52,0}}, +/* 6988 */ {(11<<2)|2,{97,52,0}}, +/* 6989 */ {(11<<2)|2,{97,52,0}}, +/* 6990 */ {(11<<2)|2,{97,52,0}}, +/* 6991 */ {(11<<2)|2,{97,52,0}}, +/* 6992 */ {(11<<2)|2,{97,52,0}}, +/* 6993 */ {(11<<2)|2,{97,52,0}}, +/* 6994 */ {(11<<2)|2,{97,52,0}}, +/* 6995 */ {(11<<2)|2,{97,52,0}}, +/* 6996 */ {(11<<2)|2,{97,52,0}}, +/* 6997 */ {(11<<2)|2,{97,52,0}}, +/* 6998 */ {(11<<2)|2,{97,52,0}}, +/* 6999 */ {(11<<2)|2,{97,52,0}}, +/* 7000 */ {(11<<2)|2,{97,52,0}}, +/* 7001 */ {(11<<2)|2,{97,52,0}}, +/* 7002 */ {(11<<2)|2,{97,52,0}}, +/* 7003 */ {(11<<2)|2,{97,52,0}}, +/* 7004 */ {(11<<2)|2,{97,52,0}}, +/* 7005 */ {(11<<2)|2,{97,52,0}}, +/* 7006 */ {(11<<2)|2,{97,52,0}}, +/* 7007 */ {(11<<2)|2,{97,52,0}}, +/* 7008 */ {(16<<2)|3,{97,53,48}}, +/* 7009 */ {(16<<2)|3,{97,53,49}}, +/* 7010 */ {(16<<2)|3,{97,53,50}}, +/* 7011 */ {(16<<2)|3,{97,53,97}}, +/* 7012 */ {(16<<2)|3,{97,53,99}}, +/* 7013 */ {(16<<2)|3,{97,53,101}}, +/* 7014 */ {(16<<2)|3,{97,53,105}}, +/* 7015 */ {(16<<2)|3,{97,53,111}}, +/* 7016 */ {(16<<2)|3,{97,53,115}}, +/* 7017 */ {(16<<2)|3,{97,53,116}}, +/* 7018 */ {(11<<2)|2,{97,53,0}}, +/* 7019 */ {(11<<2)|2,{97,53,0}}, +/* 7020 */ {(11<<2)|2,{97,53,0}}, +/* 7021 */ {(11<<2)|2,{97,53,0}}, +/* 7022 */ {(11<<2)|2,{97,53,0}}, +/* 7023 */ {(11<<2)|2,{97,53,0}}, +/* 7024 */ {(11<<2)|2,{97,53,0}}, +/* 7025 */ {(11<<2)|2,{97,53,0}}, +/* 7026 */ {(11<<2)|2,{97,53,0}}, +/* 7027 */ {(11<<2)|2,{97,53,0}}, +/* 7028 */ {(11<<2)|2,{97,53,0}}, +/* 7029 */ {(11<<2)|2,{97,53,0}}, +/* 7030 */ {(11<<2)|2,{97,53,0}}, +/* 7031 */ {(11<<2)|2,{97,53,0}}, +/* 7032 */ {(11<<2)|2,{97,53,0}}, +/* 7033 */ {(11<<2)|2,{97,53,0}}, +/* 7034 */ {(11<<2)|2,{97,53,0}}, +/* 7035 */ {(11<<2)|2,{97,53,0}}, +/* 7036 */ {(11<<2)|2,{97,53,0}}, +/* 7037 */ {(11<<2)|2,{97,53,0}}, +/* 7038 */ {(11<<2)|2,{97,53,0}}, +/* 7039 */ {(11<<2)|2,{97,53,0}}, +/* 7040 */ {(16<<2)|3,{97,54,48}}, +/* 7041 */ {(16<<2)|3,{97,54,49}}, +/* 7042 */ {(16<<2)|3,{97,54,50}}, +/* 7043 */ {(16<<2)|3,{97,54,97}}, +/* 7044 */ {(16<<2)|3,{97,54,99}}, +/* 7045 */ {(16<<2)|3,{97,54,101}}, +/* 7046 */ {(16<<2)|3,{97,54,105}}, +/* 7047 */ {(16<<2)|3,{97,54,111}}, +/* 7048 */ {(16<<2)|3,{97,54,115}}, +/* 7049 */ {(16<<2)|3,{97,54,116}}, +/* 7050 */ {(11<<2)|2,{97,54,0}}, +/* 7051 */ {(11<<2)|2,{97,54,0}}, +/* 7052 */ {(11<<2)|2,{97,54,0}}, +/* 7053 */ {(11<<2)|2,{97,54,0}}, +/* 7054 */ {(11<<2)|2,{97,54,0}}, +/* 7055 */ {(11<<2)|2,{97,54,0}}, +/* 7056 */ {(11<<2)|2,{97,54,0}}, +/* 7057 */ {(11<<2)|2,{97,54,0}}, +/* 7058 */ {(11<<2)|2,{97,54,0}}, +/* 7059 */ {(11<<2)|2,{97,54,0}}, +/* 7060 */ {(11<<2)|2,{97,54,0}}, +/* 7061 */ {(11<<2)|2,{97,54,0}}, +/* 7062 */ {(11<<2)|2,{97,54,0}}, +/* 7063 */ {(11<<2)|2,{97,54,0}}, +/* 7064 */ {(11<<2)|2,{97,54,0}}, +/* 7065 */ {(11<<2)|2,{97,54,0}}, +/* 7066 */ {(11<<2)|2,{97,54,0}}, +/* 7067 */ {(11<<2)|2,{97,54,0}}, +/* 7068 */ {(11<<2)|2,{97,54,0}}, +/* 7069 */ {(11<<2)|2,{97,54,0}}, +/* 7070 */ {(11<<2)|2,{97,54,0}}, +/* 7071 */ {(11<<2)|2,{97,54,0}}, +/* 7072 */ {(16<<2)|3,{97,55,48}}, +/* 7073 */ {(16<<2)|3,{97,55,49}}, +/* 7074 */ {(16<<2)|3,{97,55,50}}, +/* 7075 */ {(16<<2)|3,{97,55,97}}, +/* 7076 */ {(16<<2)|3,{97,55,99}}, +/* 7077 */ {(16<<2)|3,{97,55,101}}, +/* 7078 */ {(16<<2)|3,{97,55,105}}, +/* 7079 */ {(16<<2)|3,{97,55,111}}, +/* 7080 */ {(16<<2)|3,{97,55,115}}, +/* 7081 */ {(16<<2)|3,{97,55,116}}, +/* 7082 */ {(11<<2)|2,{97,55,0}}, +/* 7083 */ {(11<<2)|2,{97,55,0}}, +/* 7084 */ {(11<<2)|2,{97,55,0}}, +/* 7085 */ {(11<<2)|2,{97,55,0}}, +/* 7086 */ {(11<<2)|2,{97,55,0}}, +/* 7087 */ {(11<<2)|2,{97,55,0}}, +/* 7088 */ {(11<<2)|2,{97,55,0}}, +/* 7089 */ {(11<<2)|2,{97,55,0}}, +/* 7090 */ {(11<<2)|2,{97,55,0}}, +/* 7091 */ {(11<<2)|2,{97,55,0}}, +/* 7092 */ {(11<<2)|2,{97,55,0}}, +/* 7093 */ {(11<<2)|2,{97,55,0}}, +/* 7094 */ {(11<<2)|2,{97,55,0}}, +/* 7095 */ {(11<<2)|2,{97,55,0}}, +/* 7096 */ {(11<<2)|2,{97,55,0}}, +/* 7097 */ {(11<<2)|2,{97,55,0}}, +/* 7098 */ {(11<<2)|2,{97,55,0}}, +/* 7099 */ {(11<<2)|2,{97,55,0}}, +/* 7100 */ {(11<<2)|2,{97,55,0}}, +/* 7101 */ {(11<<2)|2,{97,55,0}}, +/* 7102 */ {(11<<2)|2,{97,55,0}}, +/* 7103 */ {(11<<2)|2,{97,55,0}}, +/* 7104 */ {(16<<2)|3,{97,56,48}}, +/* 7105 */ {(16<<2)|3,{97,56,49}}, +/* 7106 */ {(16<<2)|3,{97,56,50}}, +/* 7107 */ {(16<<2)|3,{97,56,97}}, +/* 7108 */ {(16<<2)|3,{97,56,99}}, +/* 7109 */ {(16<<2)|3,{97,56,101}}, +/* 7110 */ {(16<<2)|3,{97,56,105}}, +/* 7111 */ {(16<<2)|3,{97,56,111}}, +/* 7112 */ {(16<<2)|3,{97,56,115}}, +/* 7113 */ {(16<<2)|3,{97,56,116}}, +/* 7114 */ {(11<<2)|2,{97,56,0}}, +/* 7115 */ {(11<<2)|2,{97,56,0}}, +/* 7116 */ {(11<<2)|2,{97,56,0}}, +/* 7117 */ {(11<<2)|2,{97,56,0}}, +/* 7118 */ {(11<<2)|2,{97,56,0}}, +/* 7119 */ {(11<<2)|2,{97,56,0}}, +/* 7120 */ {(11<<2)|2,{97,56,0}}, +/* 7121 */ {(11<<2)|2,{97,56,0}}, +/* 7122 */ {(11<<2)|2,{97,56,0}}, +/* 7123 */ {(11<<2)|2,{97,56,0}}, +/* 7124 */ {(11<<2)|2,{97,56,0}}, +/* 7125 */ {(11<<2)|2,{97,56,0}}, +/* 7126 */ {(11<<2)|2,{97,56,0}}, +/* 7127 */ {(11<<2)|2,{97,56,0}}, +/* 7128 */ {(11<<2)|2,{97,56,0}}, +/* 7129 */ {(11<<2)|2,{97,56,0}}, +/* 7130 */ {(11<<2)|2,{97,56,0}}, +/* 7131 */ {(11<<2)|2,{97,56,0}}, +/* 7132 */ {(11<<2)|2,{97,56,0}}, +/* 7133 */ {(11<<2)|2,{97,56,0}}, +/* 7134 */ {(11<<2)|2,{97,56,0}}, +/* 7135 */ {(11<<2)|2,{97,56,0}}, +/* 7136 */ {(16<<2)|3,{97,57,48}}, +/* 7137 */ {(16<<2)|3,{97,57,49}}, +/* 7138 */ {(16<<2)|3,{97,57,50}}, +/* 7139 */ {(16<<2)|3,{97,57,97}}, +/* 7140 */ {(16<<2)|3,{97,57,99}}, +/* 7141 */ {(16<<2)|3,{97,57,101}}, +/* 7142 */ {(16<<2)|3,{97,57,105}}, +/* 7143 */ {(16<<2)|3,{97,57,111}}, +/* 7144 */ {(16<<2)|3,{97,57,115}}, +/* 7145 */ {(16<<2)|3,{97,57,116}}, +/* 7146 */ {(11<<2)|2,{97,57,0}}, +/* 7147 */ {(11<<2)|2,{97,57,0}}, +/* 7148 */ {(11<<2)|2,{97,57,0}}, +/* 7149 */ {(11<<2)|2,{97,57,0}}, +/* 7150 */ {(11<<2)|2,{97,57,0}}, +/* 7151 */ {(11<<2)|2,{97,57,0}}, +/* 7152 */ {(11<<2)|2,{97,57,0}}, +/* 7153 */ {(11<<2)|2,{97,57,0}}, +/* 7154 */ {(11<<2)|2,{97,57,0}}, +/* 7155 */ {(11<<2)|2,{97,57,0}}, +/* 7156 */ {(11<<2)|2,{97,57,0}}, +/* 7157 */ {(11<<2)|2,{97,57,0}}, +/* 7158 */ {(11<<2)|2,{97,57,0}}, +/* 7159 */ {(11<<2)|2,{97,57,0}}, +/* 7160 */ {(11<<2)|2,{97,57,0}}, +/* 7161 */ {(11<<2)|2,{97,57,0}}, +/* 7162 */ {(11<<2)|2,{97,57,0}}, +/* 7163 */ {(11<<2)|2,{97,57,0}}, +/* 7164 */ {(11<<2)|2,{97,57,0}}, +/* 7165 */ {(11<<2)|2,{97,57,0}}, +/* 7166 */ {(11<<2)|2,{97,57,0}}, +/* 7167 */ {(11<<2)|2,{97,57,0}}, +/* 7168 */ {(16<<2)|3,{97,61,48}}, +/* 7169 */ {(16<<2)|3,{97,61,49}}, +/* 7170 */ {(16<<2)|3,{97,61,50}}, +/* 7171 */ {(16<<2)|3,{97,61,97}}, +/* 7172 */ {(16<<2)|3,{97,61,99}}, +/* 7173 */ {(16<<2)|3,{97,61,101}}, +/* 7174 */ {(16<<2)|3,{97,61,105}}, +/* 7175 */ {(16<<2)|3,{97,61,111}}, +/* 7176 */ {(16<<2)|3,{97,61,115}}, +/* 7177 */ {(16<<2)|3,{97,61,116}}, +/* 7178 */ {(11<<2)|2,{97,61,0}}, +/* 7179 */ {(11<<2)|2,{97,61,0}}, +/* 7180 */ {(11<<2)|2,{97,61,0}}, +/* 7181 */ {(11<<2)|2,{97,61,0}}, +/* 7182 */ {(11<<2)|2,{97,61,0}}, +/* 7183 */ {(11<<2)|2,{97,61,0}}, +/* 7184 */ {(11<<2)|2,{97,61,0}}, +/* 7185 */ {(11<<2)|2,{97,61,0}}, +/* 7186 */ {(11<<2)|2,{97,61,0}}, +/* 7187 */ {(11<<2)|2,{97,61,0}}, +/* 7188 */ {(11<<2)|2,{97,61,0}}, +/* 7189 */ {(11<<2)|2,{97,61,0}}, +/* 7190 */ {(11<<2)|2,{97,61,0}}, +/* 7191 */ {(11<<2)|2,{97,61,0}}, +/* 7192 */ {(11<<2)|2,{97,61,0}}, +/* 7193 */ {(11<<2)|2,{97,61,0}}, +/* 7194 */ {(11<<2)|2,{97,61,0}}, +/* 7195 */ {(11<<2)|2,{97,61,0}}, +/* 7196 */ {(11<<2)|2,{97,61,0}}, +/* 7197 */ {(11<<2)|2,{97,61,0}}, +/* 7198 */ {(11<<2)|2,{97,61,0}}, +/* 7199 */ {(11<<2)|2,{97,61,0}}, +/* 7200 */ {(16<<2)|3,{97,65,48}}, +/* 7201 */ {(16<<2)|3,{97,65,49}}, +/* 7202 */ {(16<<2)|3,{97,65,50}}, +/* 7203 */ {(16<<2)|3,{97,65,97}}, +/* 7204 */ {(16<<2)|3,{97,65,99}}, +/* 7205 */ {(16<<2)|3,{97,65,101}}, +/* 7206 */ {(16<<2)|3,{97,65,105}}, +/* 7207 */ {(16<<2)|3,{97,65,111}}, +/* 7208 */ {(16<<2)|3,{97,65,115}}, +/* 7209 */ {(16<<2)|3,{97,65,116}}, +/* 7210 */ {(11<<2)|2,{97,65,0}}, +/* 7211 */ {(11<<2)|2,{97,65,0}}, +/* 7212 */ {(11<<2)|2,{97,65,0}}, +/* 7213 */ {(11<<2)|2,{97,65,0}}, +/* 7214 */ {(11<<2)|2,{97,65,0}}, +/* 7215 */ {(11<<2)|2,{97,65,0}}, +/* 7216 */ {(11<<2)|2,{97,65,0}}, +/* 7217 */ {(11<<2)|2,{97,65,0}}, +/* 7218 */ {(11<<2)|2,{97,65,0}}, +/* 7219 */ {(11<<2)|2,{97,65,0}}, +/* 7220 */ {(11<<2)|2,{97,65,0}}, +/* 7221 */ {(11<<2)|2,{97,65,0}}, +/* 7222 */ {(11<<2)|2,{97,65,0}}, +/* 7223 */ {(11<<2)|2,{97,65,0}}, +/* 7224 */ {(11<<2)|2,{97,65,0}}, +/* 7225 */ {(11<<2)|2,{97,65,0}}, +/* 7226 */ {(11<<2)|2,{97,65,0}}, +/* 7227 */ {(11<<2)|2,{97,65,0}}, +/* 7228 */ {(11<<2)|2,{97,65,0}}, +/* 7229 */ {(11<<2)|2,{97,65,0}}, +/* 7230 */ {(11<<2)|2,{97,65,0}}, +/* 7231 */ {(11<<2)|2,{97,65,0}}, +/* 7232 */ {(16<<2)|3,{97,95,48}}, +/* 7233 */ {(16<<2)|3,{97,95,49}}, +/* 7234 */ {(16<<2)|3,{97,95,50}}, +/* 7235 */ {(16<<2)|3,{97,95,97}}, +/* 7236 */ {(16<<2)|3,{97,95,99}}, +/* 7237 */ {(16<<2)|3,{97,95,101}}, +/* 7238 */ {(16<<2)|3,{97,95,105}}, +/* 7239 */ {(16<<2)|3,{97,95,111}}, +/* 7240 */ {(16<<2)|3,{97,95,115}}, +/* 7241 */ {(16<<2)|3,{97,95,116}}, +/* 7242 */ {(11<<2)|2,{97,95,0}}, +/* 7243 */ {(11<<2)|2,{97,95,0}}, +/* 7244 */ {(11<<2)|2,{97,95,0}}, +/* 7245 */ {(11<<2)|2,{97,95,0}}, +/* 7246 */ {(11<<2)|2,{97,95,0}}, +/* 7247 */ {(11<<2)|2,{97,95,0}}, +/* 7248 */ {(11<<2)|2,{97,95,0}}, +/* 7249 */ {(11<<2)|2,{97,95,0}}, +/* 7250 */ {(11<<2)|2,{97,95,0}}, +/* 7251 */ {(11<<2)|2,{97,95,0}}, +/* 7252 */ {(11<<2)|2,{97,95,0}}, +/* 7253 */ {(11<<2)|2,{97,95,0}}, +/* 7254 */ {(11<<2)|2,{97,95,0}}, +/* 7255 */ {(11<<2)|2,{97,95,0}}, +/* 7256 */ {(11<<2)|2,{97,95,0}}, +/* 7257 */ {(11<<2)|2,{97,95,0}}, +/* 7258 */ {(11<<2)|2,{97,95,0}}, +/* 7259 */ {(11<<2)|2,{97,95,0}}, +/* 7260 */ {(11<<2)|2,{97,95,0}}, +/* 7261 */ {(11<<2)|2,{97,95,0}}, +/* 7262 */ {(11<<2)|2,{97,95,0}}, +/* 7263 */ {(11<<2)|2,{97,95,0}}, +/* 7264 */ {(16<<2)|3,{97,98,48}}, +/* 7265 */ {(16<<2)|3,{97,98,49}}, +/* 7266 */ {(16<<2)|3,{97,98,50}}, +/* 7267 */ {(16<<2)|3,{97,98,97}}, +/* 7268 */ {(16<<2)|3,{97,98,99}}, +/* 7269 */ {(16<<2)|3,{97,98,101}}, +/* 7270 */ {(16<<2)|3,{97,98,105}}, +/* 7271 */ {(16<<2)|3,{97,98,111}}, +/* 7272 */ {(16<<2)|3,{97,98,115}}, +/* 7273 */ {(16<<2)|3,{97,98,116}}, +/* 7274 */ {(11<<2)|2,{97,98,0}}, +/* 7275 */ {(11<<2)|2,{97,98,0}}, +/* 7276 */ {(11<<2)|2,{97,98,0}}, +/* 7277 */ {(11<<2)|2,{97,98,0}}, +/* 7278 */ {(11<<2)|2,{97,98,0}}, +/* 7279 */ {(11<<2)|2,{97,98,0}}, +/* 7280 */ {(11<<2)|2,{97,98,0}}, +/* 7281 */ {(11<<2)|2,{97,98,0}}, +/* 7282 */ {(11<<2)|2,{97,98,0}}, +/* 7283 */ {(11<<2)|2,{97,98,0}}, +/* 7284 */ {(11<<2)|2,{97,98,0}}, +/* 7285 */ {(11<<2)|2,{97,98,0}}, +/* 7286 */ {(11<<2)|2,{97,98,0}}, +/* 7287 */ {(11<<2)|2,{97,98,0}}, +/* 7288 */ {(11<<2)|2,{97,98,0}}, +/* 7289 */ {(11<<2)|2,{97,98,0}}, +/* 7290 */ {(11<<2)|2,{97,98,0}}, +/* 7291 */ {(11<<2)|2,{97,98,0}}, +/* 7292 */ {(11<<2)|2,{97,98,0}}, +/* 7293 */ {(11<<2)|2,{97,98,0}}, +/* 7294 */ {(11<<2)|2,{97,98,0}}, +/* 7295 */ {(11<<2)|2,{97,98,0}}, +/* 7296 */ {(16<<2)|3,{97,100,48}}, +/* 7297 */ {(16<<2)|3,{97,100,49}}, +/* 7298 */ {(16<<2)|3,{97,100,50}}, +/* 7299 */ {(16<<2)|3,{97,100,97}}, +/* 7300 */ {(16<<2)|3,{97,100,99}}, +/* 7301 */ {(16<<2)|3,{97,100,101}}, +/* 7302 */ {(16<<2)|3,{97,100,105}}, +/* 7303 */ {(16<<2)|3,{97,100,111}}, +/* 7304 */ {(16<<2)|3,{97,100,115}}, +/* 7305 */ {(16<<2)|3,{97,100,116}}, +/* 7306 */ {(11<<2)|2,{97,100,0}}, +/* 7307 */ {(11<<2)|2,{97,100,0}}, +/* 7308 */ {(11<<2)|2,{97,100,0}}, +/* 7309 */ {(11<<2)|2,{97,100,0}}, +/* 7310 */ {(11<<2)|2,{97,100,0}}, +/* 7311 */ {(11<<2)|2,{97,100,0}}, +/* 7312 */ {(11<<2)|2,{97,100,0}}, +/* 7313 */ {(11<<2)|2,{97,100,0}}, +/* 7314 */ {(11<<2)|2,{97,100,0}}, +/* 7315 */ {(11<<2)|2,{97,100,0}}, +/* 7316 */ {(11<<2)|2,{97,100,0}}, +/* 7317 */ {(11<<2)|2,{97,100,0}}, +/* 7318 */ {(11<<2)|2,{97,100,0}}, +/* 7319 */ {(11<<2)|2,{97,100,0}}, +/* 7320 */ {(11<<2)|2,{97,100,0}}, +/* 7321 */ {(11<<2)|2,{97,100,0}}, +/* 7322 */ {(11<<2)|2,{97,100,0}}, +/* 7323 */ {(11<<2)|2,{97,100,0}}, +/* 7324 */ {(11<<2)|2,{97,100,0}}, +/* 7325 */ {(11<<2)|2,{97,100,0}}, +/* 7326 */ {(11<<2)|2,{97,100,0}}, +/* 7327 */ {(11<<2)|2,{97,100,0}}, +/* 7328 */ {(16<<2)|3,{97,102,48}}, +/* 7329 */ {(16<<2)|3,{97,102,49}}, +/* 7330 */ {(16<<2)|3,{97,102,50}}, +/* 7331 */ {(16<<2)|3,{97,102,97}}, +/* 7332 */ {(16<<2)|3,{97,102,99}}, +/* 7333 */ {(16<<2)|3,{97,102,101}}, +/* 7334 */ {(16<<2)|3,{97,102,105}}, +/* 7335 */ {(16<<2)|3,{97,102,111}}, +/* 7336 */ {(16<<2)|3,{97,102,115}}, +/* 7337 */ {(16<<2)|3,{97,102,116}}, +/* 7338 */ {(11<<2)|2,{97,102,0}}, +/* 7339 */ {(11<<2)|2,{97,102,0}}, +/* 7340 */ {(11<<2)|2,{97,102,0}}, +/* 7341 */ {(11<<2)|2,{97,102,0}}, +/* 7342 */ {(11<<2)|2,{97,102,0}}, +/* 7343 */ {(11<<2)|2,{97,102,0}}, +/* 7344 */ {(11<<2)|2,{97,102,0}}, +/* 7345 */ {(11<<2)|2,{97,102,0}}, +/* 7346 */ {(11<<2)|2,{97,102,0}}, +/* 7347 */ {(11<<2)|2,{97,102,0}}, +/* 7348 */ {(11<<2)|2,{97,102,0}}, +/* 7349 */ {(11<<2)|2,{97,102,0}}, +/* 7350 */ {(11<<2)|2,{97,102,0}}, +/* 7351 */ {(11<<2)|2,{97,102,0}}, +/* 7352 */ {(11<<2)|2,{97,102,0}}, +/* 7353 */ {(11<<2)|2,{97,102,0}}, +/* 7354 */ {(11<<2)|2,{97,102,0}}, +/* 7355 */ {(11<<2)|2,{97,102,0}}, +/* 7356 */ {(11<<2)|2,{97,102,0}}, +/* 7357 */ {(11<<2)|2,{97,102,0}}, +/* 7358 */ {(11<<2)|2,{97,102,0}}, +/* 7359 */ {(11<<2)|2,{97,102,0}}, +/* 7360 */ {(16<<2)|3,{97,103,48}}, +/* 7361 */ {(16<<2)|3,{97,103,49}}, +/* 7362 */ {(16<<2)|3,{97,103,50}}, +/* 7363 */ {(16<<2)|3,{97,103,97}}, +/* 7364 */ {(16<<2)|3,{97,103,99}}, +/* 7365 */ {(16<<2)|3,{97,103,101}}, +/* 7366 */ {(16<<2)|3,{97,103,105}}, +/* 7367 */ {(16<<2)|3,{97,103,111}}, +/* 7368 */ {(16<<2)|3,{97,103,115}}, +/* 7369 */ {(16<<2)|3,{97,103,116}}, +/* 7370 */ {(11<<2)|2,{97,103,0}}, +/* 7371 */ {(11<<2)|2,{97,103,0}}, +/* 7372 */ {(11<<2)|2,{97,103,0}}, +/* 7373 */ {(11<<2)|2,{97,103,0}}, +/* 7374 */ {(11<<2)|2,{97,103,0}}, +/* 7375 */ {(11<<2)|2,{97,103,0}}, +/* 7376 */ {(11<<2)|2,{97,103,0}}, +/* 7377 */ {(11<<2)|2,{97,103,0}}, +/* 7378 */ {(11<<2)|2,{97,103,0}}, +/* 7379 */ {(11<<2)|2,{97,103,0}}, +/* 7380 */ {(11<<2)|2,{97,103,0}}, +/* 7381 */ {(11<<2)|2,{97,103,0}}, +/* 7382 */ {(11<<2)|2,{97,103,0}}, +/* 7383 */ {(11<<2)|2,{97,103,0}}, +/* 7384 */ {(11<<2)|2,{97,103,0}}, +/* 7385 */ {(11<<2)|2,{97,103,0}}, +/* 7386 */ {(11<<2)|2,{97,103,0}}, +/* 7387 */ {(11<<2)|2,{97,103,0}}, +/* 7388 */ {(11<<2)|2,{97,103,0}}, +/* 7389 */ {(11<<2)|2,{97,103,0}}, +/* 7390 */ {(11<<2)|2,{97,103,0}}, +/* 7391 */ {(11<<2)|2,{97,103,0}}, +/* 7392 */ {(16<<2)|3,{97,104,48}}, +/* 7393 */ {(16<<2)|3,{97,104,49}}, +/* 7394 */ {(16<<2)|3,{97,104,50}}, +/* 7395 */ {(16<<2)|3,{97,104,97}}, +/* 7396 */ {(16<<2)|3,{97,104,99}}, +/* 7397 */ {(16<<2)|3,{97,104,101}}, +/* 7398 */ {(16<<2)|3,{97,104,105}}, +/* 7399 */ {(16<<2)|3,{97,104,111}}, +/* 7400 */ {(16<<2)|3,{97,104,115}}, +/* 7401 */ {(16<<2)|3,{97,104,116}}, +/* 7402 */ {(11<<2)|2,{97,104,0}}, +/* 7403 */ {(11<<2)|2,{97,104,0}}, +/* 7404 */ {(11<<2)|2,{97,104,0}}, +/* 7405 */ {(11<<2)|2,{97,104,0}}, +/* 7406 */ {(11<<2)|2,{97,104,0}}, +/* 7407 */ {(11<<2)|2,{97,104,0}}, +/* 7408 */ {(11<<2)|2,{97,104,0}}, +/* 7409 */ {(11<<2)|2,{97,104,0}}, +/* 7410 */ {(11<<2)|2,{97,104,0}}, +/* 7411 */ {(11<<2)|2,{97,104,0}}, +/* 7412 */ {(11<<2)|2,{97,104,0}}, +/* 7413 */ {(11<<2)|2,{97,104,0}}, +/* 7414 */ {(11<<2)|2,{97,104,0}}, +/* 7415 */ {(11<<2)|2,{97,104,0}}, +/* 7416 */ {(11<<2)|2,{97,104,0}}, +/* 7417 */ {(11<<2)|2,{97,104,0}}, +/* 7418 */ {(11<<2)|2,{97,104,0}}, +/* 7419 */ {(11<<2)|2,{97,104,0}}, +/* 7420 */ {(11<<2)|2,{97,104,0}}, +/* 7421 */ {(11<<2)|2,{97,104,0}}, +/* 7422 */ {(11<<2)|2,{97,104,0}}, +/* 7423 */ {(11<<2)|2,{97,104,0}}, +/* 7424 */ {(16<<2)|3,{97,108,48}}, +/* 7425 */ {(16<<2)|3,{97,108,49}}, +/* 7426 */ {(16<<2)|3,{97,108,50}}, +/* 7427 */ {(16<<2)|3,{97,108,97}}, +/* 7428 */ {(16<<2)|3,{97,108,99}}, +/* 7429 */ {(16<<2)|3,{97,108,101}}, +/* 7430 */ {(16<<2)|3,{97,108,105}}, +/* 7431 */ {(16<<2)|3,{97,108,111}}, +/* 7432 */ {(16<<2)|3,{97,108,115}}, +/* 7433 */ {(16<<2)|3,{97,108,116}}, +/* 7434 */ {(11<<2)|2,{97,108,0}}, +/* 7435 */ {(11<<2)|2,{97,108,0}}, +/* 7436 */ {(11<<2)|2,{97,108,0}}, +/* 7437 */ {(11<<2)|2,{97,108,0}}, +/* 7438 */ {(11<<2)|2,{97,108,0}}, +/* 7439 */ {(11<<2)|2,{97,108,0}}, +/* 7440 */ {(11<<2)|2,{97,108,0}}, +/* 7441 */ {(11<<2)|2,{97,108,0}}, +/* 7442 */ {(11<<2)|2,{97,108,0}}, +/* 7443 */ {(11<<2)|2,{97,108,0}}, +/* 7444 */ {(11<<2)|2,{97,108,0}}, +/* 7445 */ {(11<<2)|2,{97,108,0}}, +/* 7446 */ {(11<<2)|2,{97,108,0}}, +/* 7447 */ {(11<<2)|2,{97,108,0}}, +/* 7448 */ {(11<<2)|2,{97,108,0}}, +/* 7449 */ {(11<<2)|2,{97,108,0}}, +/* 7450 */ {(11<<2)|2,{97,108,0}}, +/* 7451 */ {(11<<2)|2,{97,108,0}}, +/* 7452 */ {(11<<2)|2,{97,108,0}}, +/* 7453 */ {(11<<2)|2,{97,108,0}}, +/* 7454 */ {(11<<2)|2,{97,108,0}}, +/* 7455 */ {(11<<2)|2,{97,108,0}}, +/* 7456 */ {(16<<2)|3,{97,109,48}}, +/* 7457 */ {(16<<2)|3,{97,109,49}}, +/* 7458 */ {(16<<2)|3,{97,109,50}}, +/* 7459 */ {(16<<2)|3,{97,109,97}}, +/* 7460 */ {(16<<2)|3,{97,109,99}}, +/* 7461 */ {(16<<2)|3,{97,109,101}}, +/* 7462 */ {(16<<2)|3,{97,109,105}}, +/* 7463 */ {(16<<2)|3,{97,109,111}}, +/* 7464 */ {(16<<2)|3,{97,109,115}}, +/* 7465 */ {(16<<2)|3,{97,109,116}}, +/* 7466 */ {(11<<2)|2,{97,109,0}}, +/* 7467 */ {(11<<2)|2,{97,109,0}}, +/* 7468 */ {(11<<2)|2,{97,109,0}}, +/* 7469 */ {(11<<2)|2,{97,109,0}}, +/* 7470 */ {(11<<2)|2,{97,109,0}}, +/* 7471 */ {(11<<2)|2,{97,109,0}}, +/* 7472 */ {(11<<2)|2,{97,109,0}}, +/* 7473 */ {(11<<2)|2,{97,109,0}}, +/* 7474 */ {(11<<2)|2,{97,109,0}}, +/* 7475 */ {(11<<2)|2,{97,109,0}}, +/* 7476 */ {(11<<2)|2,{97,109,0}}, +/* 7477 */ {(11<<2)|2,{97,109,0}}, +/* 7478 */ {(11<<2)|2,{97,109,0}}, +/* 7479 */ {(11<<2)|2,{97,109,0}}, +/* 7480 */ {(11<<2)|2,{97,109,0}}, +/* 7481 */ {(11<<2)|2,{97,109,0}}, +/* 7482 */ {(11<<2)|2,{97,109,0}}, +/* 7483 */ {(11<<2)|2,{97,109,0}}, +/* 7484 */ {(11<<2)|2,{97,109,0}}, +/* 7485 */ {(11<<2)|2,{97,109,0}}, +/* 7486 */ {(11<<2)|2,{97,109,0}}, +/* 7487 */ {(11<<2)|2,{97,109,0}}, +/* 7488 */ {(16<<2)|3,{97,110,48}}, +/* 7489 */ {(16<<2)|3,{97,110,49}}, +/* 7490 */ {(16<<2)|3,{97,110,50}}, +/* 7491 */ {(16<<2)|3,{97,110,97}}, +/* 7492 */ {(16<<2)|3,{97,110,99}}, +/* 7493 */ {(16<<2)|3,{97,110,101}}, +/* 7494 */ {(16<<2)|3,{97,110,105}}, +/* 7495 */ {(16<<2)|3,{97,110,111}}, +/* 7496 */ {(16<<2)|3,{97,110,115}}, +/* 7497 */ {(16<<2)|3,{97,110,116}}, +/* 7498 */ {(11<<2)|2,{97,110,0}}, +/* 7499 */ {(11<<2)|2,{97,110,0}}, +/* 7500 */ {(11<<2)|2,{97,110,0}}, +/* 7501 */ {(11<<2)|2,{97,110,0}}, +/* 7502 */ {(11<<2)|2,{97,110,0}}, +/* 7503 */ {(11<<2)|2,{97,110,0}}, +/* 7504 */ {(11<<2)|2,{97,110,0}}, +/* 7505 */ {(11<<2)|2,{97,110,0}}, +/* 7506 */ {(11<<2)|2,{97,110,0}}, +/* 7507 */ {(11<<2)|2,{97,110,0}}, +/* 7508 */ {(11<<2)|2,{97,110,0}}, +/* 7509 */ {(11<<2)|2,{97,110,0}}, +/* 7510 */ {(11<<2)|2,{97,110,0}}, +/* 7511 */ {(11<<2)|2,{97,110,0}}, +/* 7512 */ {(11<<2)|2,{97,110,0}}, +/* 7513 */ {(11<<2)|2,{97,110,0}}, +/* 7514 */ {(11<<2)|2,{97,110,0}}, +/* 7515 */ {(11<<2)|2,{97,110,0}}, +/* 7516 */ {(11<<2)|2,{97,110,0}}, +/* 7517 */ {(11<<2)|2,{97,110,0}}, +/* 7518 */ {(11<<2)|2,{97,110,0}}, +/* 7519 */ {(11<<2)|2,{97,110,0}}, +/* 7520 */ {(16<<2)|3,{97,112,48}}, +/* 7521 */ {(16<<2)|3,{97,112,49}}, +/* 7522 */ {(16<<2)|3,{97,112,50}}, +/* 7523 */ {(16<<2)|3,{97,112,97}}, +/* 7524 */ {(16<<2)|3,{97,112,99}}, +/* 7525 */ {(16<<2)|3,{97,112,101}}, +/* 7526 */ {(16<<2)|3,{97,112,105}}, +/* 7527 */ {(16<<2)|3,{97,112,111}}, +/* 7528 */ {(16<<2)|3,{97,112,115}}, +/* 7529 */ {(16<<2)|3,{97,112,116}}, +/* 7530 */ {(11<<2)|2,{97,112,0}}, +/* 7531 */ {(11<<2)|2,{97,112,0}}, +/* 7532 */ {(11<<2)|2,{97,112,0}}, +/* 7533 */ {(11<<2)|2,{97,112,0}}, +/* 7534 */ {(11<<2)|2,{97,112,0}}, +/* 7535 */ {(11<<2)|2,{97,112,0}}, +/* 7536 */ {(11<<2)|2,{97,112,0}}, +/* 7537 */ {(11<<2)|2,{97,112,0}}, +/* 7538 */ {(11<<2)|2,{97,112,0}}, +/* 7539 */ {(11<<2)|2,{97,112,0}}, +/* 7540 */ {(11<<2)|2,{97,112,0}}, +/* 7541 */ {(11<<2)|2,{97,112,0}}, +/* 7542 */ {(11<<2)|2,{97,112,0}}, +/* 7543 */ {(11<<2)|2,{97,112,0}}, +/* 7544 */ {(11<<2)|2,{97,112,0}}, +/* 7545 */ {(11<<2)|2,{97,112,0}}, +/* 7546 */ {(11<<2)|2,{97,112,0}}, +/* 7547 */ {(11<<2)|2,{97,112,0}}, +/* 7548 */ {(11<<2)|2,{97,112,0}}, +/* 7549 */ {(11<<2)|2,{97,112,0}}, +/* 7550 */ {(11<<2)|2,{97,112,0}}, +/* 7551 */ {(11<<2)|2,{97,112,0}}, +/* 7552 */ {(16<<2)|3,{97,114,48}}, +/* 7553 */ {(16<<2)|3,{97,114,49}}, +/* 7554 */ {(16<<2)|3,{97,114,50}}, +/* 7555 */ {(16<<2)|3,{97,114,97}}, +/* 7556 */ {(16<<2)|3,{97,114,99}}, +/* 7557 */ {(16<<2)|3,{97,114,101}}, +/* 7558 */ {(16<<2)|3,{97,114,105}}, +/* 7559 */ {(16<<2)|3,{97,114,111}}, +/* 7560 */ {(16<<2)|3,{97,114,115}}, +/* 7561 */ {(16<<2)|3,{97,114,116}}, +/* 7562 */ {(11<<2)|2,{97,114,0}}, +/* 7563 */ {(11<<2)|2,{97,114,0}}, +/* 7564 */ {(11<<2)|2,{97,114,0}}, +/* 7565 */ {(11<<2)|2,{97,114,0}}, +/* 7566 */ {(11<<2)|2,{97,114,0}}, +/* 7567 */ {(11<<2)|2,{97,114,0}}, +/* 7568 */ {(11<<2)|2,{97,114,0}}, +/* 7569 */ {(11<<2)|2,{97,114,0}}, +/* 7570 */ {(11<<2)|2,{97,114,0}}, +/* 7571 */ {(11<<2)|2,{97,114,0}}, +/* 7572 */ {(11<<2)|2,{97,114,0}}, +/* 7573 */ {(11<<2)|2,{97,114,0}}, +/* 7574 */ {(11<<2)|2,{97,114,0}}, +/* 7575 */ {(11<<2)|2,{97,114,0}}, +/* 7576 */ {(11<<2)|2,{97,114,0}}, +/* 7577 */ {(11<<2)|2,{97,114,0}}, +/* 7578 */ {(11<<2)|2,{97,114,0}}, +/* 7579 */ {(11<<2)|2,{97,114,0}}, +/* 7580 */ {(11<<2)|2,{97,114,0}}, +/* 7581 */ {(11<<2)|2,{97,114,0}}, +/* 7582 */ {(11<<2)|2,{97,114,0}}, +/* 7583 */ {(11<<2)|2,{97,114,0}}, +/* 7584 */ {(16<<2)|3,{97,117,48}}, +/* 7585 */ {(16<<2)|3,{97,117,49}}, +/* 7586 */ {(16<<2)|3,{97,117,50}}, +/* 7587 */ {(16<<2)|3,{97,117,97}}, +/* 7588 */ {(16<<2)|3,{97,117,99}}, +/* 7589 */ {(16<<2)|3,{97,117,101}}, +/* 7590 */ {(16<<2)|3,{97,117,105}}, +/* 7591 */ {(16<<2)|3,{97,117,111}}, +/* 7592 */ {(16<<2)|3,{97,117,115}}, +/* 7593 */ {(16<<2)|3,{97,117,116}}, +/* 7594 */ {(11<<2)|2,{97,117,0}}, +/* 7595 */ {(11<<2)|2,{97,117,0}}, +/* 7596 */ {(11<<2)|2,{97,117,0}}, +/* 7597 */ {(11<<2)|2,{97,117,0}}, +/* 7598 */ {(11<<2)|2,{97,117,0}}, +/* 7599 */ {(11<<2)|2,{97,117,0}}, +/* 7600 */ {(11<<2)|2,{97,117,0}}, +/* 7601 */ {(11<<2)|2,{97,117,0}}, +/* 7602 */ {(11<<2)|2,{97,117,0}}, +/* 7603 */ {(11<<2)|2,{97,117,0}}, +/* 7604 */ {(11<<2)|2,{97,117,0}}, +/* 7605 */ {(11<<2)|2,{97,117,0}}, +/* 7606 */ {(11<<2)|2,{97,117,0}}, +/* 7607 */ {(11<<2)|2,{97,117,0}}, +/* 7608 */ {(11<<2)|2,{97,117,0}}, +/* 7609 */ {(11<<2)|2,{97,117,0}}, +/* 7610 */ {(11<<2)|2,{97,117,0}}, +/* 7611 */ {(11<<2)|2,{97,117,0}}, +/* 7612 */ {(11<<2)|2,{97,117,0}}, +/* 7613 */ {(11<<2)|2,{97,117,0}}, +/* 7614 */ {(11<<2)|2,{97,117,0}}, +/* 7615 */ {(11<<2)|2,{97,117,0}}, +/* 7616 */ {(12<<2)|2,{97,58,0}}, +/* 7617 */ {(12<<2)|2,{97,58,0}}, +/* 7618 */ {(12<<2)|2,{97,58,0}}, +/* 7619 */ {(12<<2)|2,{97,58,0}}, +/* 7620 */ {(12<<2)|2,{97,58,0}}, +/* 7621 */ {(12<<2)|2,{97,58,0}}, +/* 7622 */ {(12<<2)|2,{97,58,0}}, +/* 7623 */ {(12<<2)|2,{97,58,0}}, +/* 7624 */ {(12<<2)|2,{97,58,0}}, +/* 7625 */ {(12<<2)|2,{97,58,0}}, +/* 7626 */ {(12<<2)|2,{97,58,0}}, +/* 7627 */ {(12<<2)|2,{97,58,0}}, +/* 7628 */ {(12<<2)|2,{97,58,0}}, +/* 7629 */ {(12<<2)|2,{97,58,0}}, +/* 7630 */ {(12<<2)|2,{97,58,0}}, +/* 7631 */ {(12<<2)|2,{97,58,0}}, +/* 7632 */ {(12<<2)|2,{97,66,0}}, +/* 7633 */ {(12<<2)|2,{97,66,0}}, +/* 7634 */ {(12<<2)|2,{97,66,0}}, +/* 7635 */ {(12<<2)|2,{97,66,0}}, +/* 7636 */ {(12<<2)|2,{97,66,0}}, +/* 7637 */ {(12<<2)|2,{97,66,0}}, +/* 7638 */ {(12<<2)|2,{97,66,0}}, +/* 7639 */ {(12<<2)|2,{97,66,0}}, +/* 7640 */ {(12<<2)|2,{97,66,0}}, +/* 7641 */ {(12<<2)|2,{97,66,0}}, +/* 7642 */ {(12<<2)|2,{97,66,0}}, +/* 7643 */ {(12<<2)|2,{97,66,0}}, +/* 7644 */ {(12<<2)|2,{97,66,0}}, +/* 7645 */ {(12<<2)|2,{97,66,0}}, +/* 7646 */ {(12<<2)|2,{97,66,0}}, +/* 7647 */ {(12<<2)|2,{97,66,0}}, +/* 7648 */ {(12<<2)|2,{97,67,0}}, +/* 7649 */ {(12<<2)|2,{97,67,0}}, +/* 7650 */ {(12<<2)|2,{97,67,0}}, +/* 7651 */ {(12<<2)|2,{97,67,0}}, +/* 7652 */ {(12<<2)|2,{97,67,0}}, +/* 7653 */ {(12<<2)|2,{97,67,0}}, +/* 7654 */ {(12<<2)|2,{97,67,0}}, +/* 7655 */ {(12<<2)|2,{97,67,0}}, +/* 7656 */ {(12<<2)|2,{97,67,0}}, +/* 7657 */ {(12<<2)|2,{97,67,0}}, +/* 7658 */ {(12<<2)|2,{97,67,0}}, +/* 7659 */ {(12<<2)|2,{97,67,0}}, +/* 7660 */ {(12<<2)|2,{97,67,0}}, +/* 7661 */ {(12<<2)|2,{97,67,0}}, +/* 7662 */ {(12<<2)|2,{97,67,0}}, +/* 7663 */ {(12<<2)|2,{97,67,0}}, +/* 7664 */ {(12<<2)|2,{97,68,0}}, +/* 7665 */ {(12<<2)|2,{97,68,0}}, +/* 7666 */ {(12<<2)|2,{97,68,0}}, +/* 7667 */ {(12<<2)|2,{97,68,0}}, +/* 7668 */ {(12<<2)|2,{97,68,0}}, +/* 7669 */ {(12<<2)|2,{97,68,0}}, +/* 7670 */ {(12<<2)|2,{97,68,0}}, +/* 7671 */ {(12<<2)|2,{97,68,0}}, +/* 7672 */ {(12<<2)|2,{97,68,0}}, +/* 7673 */ {(12<<2)|2,{97,68,0}}, +/* 7674 */ {(12<<2)|2,{97,68,0}}, +/* 7675 */ {(12<<2)|2,{97,68,0}}, +/* 7676 */ {(12<<2)|2,{97,68,0}}, +/* 7677 */ {(12<<2)|2,{97,68,0}}, +/* 7678 */ {(12<<2)|2,{97,68,0}}, +/* 7679 */ {(12<<2)|2,{97,68,0}}, +/* 7680 */ {(12<<2)|2,{97,69,0}}, +/* 7681 */ {(12<<2)|2,{97,69,0}}, +/* 7682 */ {(12<<2)|2,{97,69,0}}, +/* 7683 */ {(12<<2)|2,{97,69,0}}, +/* 7684 */ {(12<<2)|2,{97,69,0}}, +/* 7685 */ {(12<<2)|2,{97,69,0}}, +/* 7686 */ {(12<<2)|2,{97,69,0}}, +/* 7687 */ {(12<<2)|2,{97,69,0}}, +/* 7688 */ {(12<<2)|2,{97,69,0}}, +/* 7689 */ {(12<<2)|2,{97,69,0}}, +/* 7690 */ {(12<<2)|2,{97,69,0}}, +/* 7691 */ {(12<<2)|2,{97,69,0}}, +/* 7692 */ {(12<<2)|2,{97,69,0}}, +/* 7693 */ {(12<<2)|2,{97,69,0}}, +/* 7694 */ {(12<<2)|2,{97,69,0}}, +/* 7695 */ {(12<<2)|2,{97,69,0}}, +/* 7696 */ {(12<<2)|2,{97,70,0}}, +/* 7697 */ {(12<<2)|2,{97,70,0}}, +/* 7698 */ {(12<<2)|2,{97,70,0}}, +/* 7699 */ {(12<<2)|2,{97,70,0}}, +/* 7700 */ {(12<<2)|2,{97,70,0}}, +/* 7701 */ {(12<<2)|2,{97,70,0}}, +/* 7702 */ {(12<<2)|2,{97,70,0}}, +/* 7703 */ {(12<<2)|2,{97,70,0}}, +/* 7704 */ {(12<<2)|2,{97,70,0}}, +/* 7705 */ {(12<<2)|2,{97,70,0}}, +/* 7706 */ {(12<<2)|2,{97,70,0}}, +/* 7707 */ {(12<<2)|2,{97,70,0}}, +/* 7708 */ {(12<<2)|2,{97,70,0}}, +/* 7709 */ {(12<<2)|2,{97,70,0}}, +/* 7710 */ {(12<<2)|2,{97,70,0}}, +/* 7711 */ {(12<<2)|2,{97,70,0}}, +/* 7712 */ {(12<<2)|2,{97,71,0}}, +/* 7713 */ {(12<<2)|2,{97,71,0}}, +/* 7714 */ {(12<<2)|2,{97,71,0}}, +/* 7715 */ {(12<<2)|2,{97,71,0}}, +/* 7716 */ {(12<<2)|2,{97,71,0}}, +/* 7717 */ {(12<<2)|2,{97,71,0}}, +/* 7718 */ {(12<<2)|2,{97,71,0}}, +/* 7719 */ {(12<<2)|2,{97,71,0}}, +/* 7720 */ {(12<<2)|2,{97,71,0}}, +/* 7721 */ {(12<<2)|2,{97,71,0}}, +/* 7722 */ {(12<<2)|2,{97,71,0}}, +/* 7723 */ {(12<<2)|2,{97,71,0}}, +/* 7724 */ {(12<<2)|2,{97,71,0}}, +/* 7725 */ {(12<<2)|2,{97,71,0}}, +/* 7726 */ {(12<<2)|2,{97,71,0}}, +/* 7727 */ {(12<<2)|2,{97,71,0}}, +/* 7728 */ {(12<<2)|2,{97,72,0}}, +/* 7729 */ {(12<<2)|2,{97,72,0}}, +/* 7730 */ {(12<<2)|2,{97,72,0}}, +/* 7731 */ {(12<<2)|2,{97,72,0}}, +/* 7732 */ {(12<<2)|2,{97,72,0}}, +/* 7733 */ {(12<<2)|2,{97,72,0}}, +/* 7734 */ {(12<<2)|2,{97,72,0}}, +/* 7735 */ {(12<<2)|2,{97,72,0}}, +/* 7736 */ {(12<<2)|2,{97,72,0}}, +/* 7737 */ {(12<<2)|2,{97,72,0}}, +/* 7738 */ {(12<<2)|2,{97,72,0}}, +/* 7739 */ {(12<<2)|2,{97,72,0}}, +/* 7740 */ {(12<<2)|2,{97,72,0}}, +/* 7741 */ {(12<<2)|2,{97,72,0}}, +/* 7742 */ {(12<<2)|2,{97,72,0}}, +/* 7743 */ {(12<<2)|2,{97,72,0}}, +/* 7744 */ {(12<<2)|2,{97,73,0}}, +/* 7745 */ {(12<<2)|2,{97,73,0}}, +/* 7746 */ {(12<<2)|2,{97,73,0}}, +/* 7747 */ {(12<<2)|2,{97,73,0}}, +/* 7748 */ {(12<<2)|2,{97,73,0}}, +/* 7749 */ {(12<<2)|2,{97,73,0}}, +/* 7750 */ {(12<<2)|2,{97,73,0}}, +/* 7751 */ {(12<<2)|2,{97,73,0}}, +/* 7752 */ {(12<<2)|2,{97,73,0}}, +/* 7753 */ {(12<<2)|2,{97,73,0}}, +/* 7754 */ {(12<<2)|2,{97,73,0}}, +/* 7755 */ {(12<<2)|2,{97,73,0}}, +/* 7756 */ {(12<<2)|2,{97,73,0}}, +/* 7757 */ {(12<<2)|2,{97,73,0}}, +/* 7758 */ {(12<<2)|2,{97,73,0}}, +/* 7759 */ {(12<<2)|2,{97,73,0}}, +/* 7760 */ {(12<<2)|2,{97,74,0}}, +/* 7761 */ {(12<<2)|2,{97,74,0}}, +/* 7762 */ {(12<<2)|2,{97,74,0}}, +/* 7763 */ {(12<<2)|2,{97,74,0}}, +/* 7764 */ {(12<<2)|2,{97,74,0}}, +/* 7765 */ {(12<<2)|2,{97,74,0}}, +/* 7766 */ {(12<<2)|2,{97,74,0}}, +/* 7767 */ {(12<<2)|2,{97,74,0}}, +/* 7768 */ {(12<<2)|2,{97,74,0}}, +/* 7769 */ {(12<<2)|2,{97,74,0}}, +/* 7770 */ {(12<<2)|2,{97,74,0}}, +/* 7771 */ {(12<<2)|2,{97,74,0}}, +/* 7772 */ {(12<<2)|2,{97,74,0}}, +/* 7773 */ {(12<<2)|2,{97,74,0}}, +/* 7774 */ {(12<<2)|2,{97,74,0}}, +/* 7775 */ {(12<<2)|2,{97,74,0}}, +/* 7776 */ {(12<<2)|2,{97,75,0}}, +/* 7777 */ {(12<<2)|2,{97,75,0}}, +/* 7778 */ {(12<<2)|2,{97,75,0}}, +/* 7779 */ {(12<<2)|2,{97,75,0}}, +/* 7780 */ {(12<<2)|2,{97,75,0}}, +/* 7781 */ {(12<<2)|2,{97,75,0}}, +/* 7782 */ {(12<<2)|2,{97,75,0}}, +/* 7783 */ {(12<<2)|2,{97,75,0}}, +/* 7784 */ {(12<<2)|2,{97,75,0}}, +/* 7785 */ {(12<<2)|2,{97,75,0}}, +/* 7786 */ {(12<<2)|2,{97,75,0}}, +/* 7787 */ {(12<<2)|2,{97,75,0}}, +/* 7788 */ {(12<<2)|2,{97,75,0}}, +/* 7789 */ {(12<<2)|2,{97,75,0}}, +/* 7790 */ {(12<<2)|2,{97,75,0}}, +/* 7791 */ {(12<<2)|2,{97,75,0}}, +/* 7792 */ {(12<<2)|2,{97,76,0}}, +/* 7793 */ {(12<<2)|2,{97,76,0}}, +/* 7794 */ {(12<<2)|2,{97,76,0}}, +/* 7795 */ {(12<<2)|2,{97,76,0}}, +/* 7796 */ {(12<<2)|2,{97,76,0}}, +/* 7797 */ {(12<<2)|2,{97,76,0}}, +/* 7798 */ {(12<<2)|2,{97,76,0}}, +/* 7799 */ {(12<<2)|2,{97,76,0}}, +/* 7800 */ {(12<<2)|2,{97,76,0}}, +/* 7801 */ {(12<<2)|2,{97,76,0}}, +/* 7802 */ {(12<<2)|2,{97,76,0}}, +/* 7803 */ {(12<<2)|2,{97,76,0}}, +/* 7804 */ {(12<<2)|2,{97,76,0}}, +/* 7805 */ {(12<<2)|2,{97,76,0}}, +/* 7806 */ {(12<<2)|2,{97,76,0}}, +/* 7807 */ {(12<<2)|2,{97,76,0}}, +/* 7808 */ {(12<<2)|2,{97,77,0}}, +/* 7809 */ {(12<<2)|2,{97,77,0}}, +/* 7810 */ {(12<<2)|2,{97,77,0}}, +/* 7811 */ {(12<<2)|2,{97,77,0}}, +/* 7812 */ {(12<<2)|2,{97,77,0}}, +/* 7813 */ {(12<<2)|2,{97,77,0}}, +/* 7814 */ {(12<<2)|2,{97,77,0}}, +/* 7815 */ {(12<<2)|2,{97,77,0}}, +/* 7816 */ {(12<<2)|2,{97,77,0}}, +/* 7817 */ {(12<<2)|2,{97,77,0}}, +/* 7818 */ {(12<<2)|2,{97,77,0}}, +/* 7819 */ {(12<<2)|2,{97,77,0}}, +/* 7820 */ {(12<<2)|2,{97,77,0}}, +/* 7821 */ {(12<<2)|2,{97,77,0}}, +/* 7822 */ {(12<<2)|2,{97,77,0}}, +/* 7823 */ {(12<<2)|2,{97,77,0}}, +/* 7824 */ {(12<<2)|2,{97,78,0}}, +/* 7825 */ {(12<<2)|2,{97,78,0}}, +/* 7826 */ {(12<<2)|2,{97,78,0}}, +/* 7827 */ {(12<<2)|2,{97,78,0}}, +/* 7828 */ {(12<<2)|2,{97,78,0}}, +/* 7829 */ {(12<<2)|2,{97,78,0}}, +/* 7830 */ {(12<<2)|2,{97,78,0}}, +/* 7831 */ {(12<<2)|2,{97,78,0}}, +/* 7832 */ {(12<<2)|2,{97,78,0}}, +/* 7833 */ {(12<<2)|2,{97,78,0}}, +/* 7834 */ {(12<<2)|2,{97,78,0}}, +/* 7835 */ {(12<<2)|2,{97,78,0}}, +/* 7836 */ {(12<<2)|2,{97,78,0}}, +/* 7837 */ {(12<<2)|2,{97,78,0}}, +/* 7838 */ {(12<<2)|2,{97,78,0}}, +/* 7839 */ {(12<<2)|2,{97,78,0}}, +/* 7840 */ {(12<<2)|2,{97,79,0}}, +/* 7841 */ {(12<<2)|2,{97,79,0}}, +/* 7842 */ {(12<<2)|2,{97,79,0}}, +/* 7843 */ {(12<<2)|2,{97,79,0}}, +/* 7844 */ {(12<<2)|2,{97,79,0}}, +/* 7845 */ {(12<<2)|2,{97,79,0}}, +/* 7846 */ {(12<<2)|2,{97,79,0}}, +/* 7847 */ {(12<<2)|2,{97,79,0}}, +/* 7848 */ {(12<<2)|2,{97,79,0}}, +/* 7849 */ {(12<<2)|2,{97,79,0}}, +/* 7850 */ {(12<<2)|2,{97,79,0}}, +/* 7851 */ {(12<<2)|2,{97,79,0}}, +/* 7852 */ {(12<<2)|2,{97,79,0}}, +/* 7853 */ {(12<<2)|2,{97,79,0}}, +/* 7854 */ {(12<<2)|2,{97,79,0}}, +/* 7855 */ {(12<<2)|2,{97,79,0}}, +/* 7856 */ {(12<<2)|2,{97,80,0}}, +/* 7857 */ {(12<<2)|2,{97,80,0}}, +/* 7858 */ {(12<<2)|2,{97,80,0}}, +/* 7859 */ {(12<<2)|2,{97,80,0}}, +/* 7860 */ {(12<<2)|2,{97,80,0}}, +/* 7861 */ {(12<<2)|2,{97,80,0}}, +/* 7862 */ {(12<<2)|2,{97,80,0}}, +/* 7863 */ {(12<<2)|2,{97,80,0}}, +/* 7864 */ {(12<<2)|2,{97,80,0}}, +/* 7865 */ {(12<<2)|2,{97,80,0}}, +/* 7866 */ {(12<<2)|2,{97,80,0}}, +/* 7867 */ {(12<<2)|2,{97,80,0}}, +/* 7868 */ {(12<<2)|2,{97,80,0}}, +/* 7869 */ {(12<<2)|2,{97,80,0}}, +/* 7870 */ {(12<<2)|2,{97,80,0}}, +/* 7871 */ {(12<<2)|2,{97,80,0}}, +/* 7872 */ {(12<<2)|2,{97,81,0}}, +/* 7873 */ {(12<<2)|2,{97,81,0}}, +/* 7874 */ {(12<<2)|2,{97,81,0}}, +/* 7875 */ {(12<<2)|2,{97,81,0}}, +/* 7876 */ {(12<<2)|2,{97,81,0}}, +/* 7877 */ {(12<<2)|2,{97,81,0}}, +/* 7878 */ {(12<<2)|2,{97,81,0}}, +/* 7879 */ {(12<<2)|2,{97,81,0}}, +/* 7880 */ {(12<<2)|2,{97,81,0}}, +/* 7881 */ {(12<<2)|2,{97,81,0}}, +/* 7882 */ {(12<<2)|2,{97,81,0}}, +/* 7883 */ {(12<<2)|2,{97,81,0}}, +/* 7884 */ {(12<<2)|2,{97,81,0}}, +/* 7885 */ {(12<<2)|2,{97,81,0}}, +/* 7886 */ {(12<<2)|2,{97,81,0}}, +/* 7887 */ {(12<<2)|2,{97,81,0}}, +/* 7888 */ {(12<<2)|2,{97,82,0}}, +/* 7889 */ {(12<<2)|2,{97,82,0}}, +/* 7890 */ {(12<<2)|2,{97,82,0}}, +/* 7891 */ {(12<<2)|2,{97,82,0}}, +/* 7892 */ {(12<<2)|2,{97,82,0}}, +/* 7893 */ {(12<<2)|2,{97,82,0}}, +/* 7894 */ {(12<<2)|2,{97,82,0}}, +/* 7895 */ {(12<<2)|2,{97,82,0}}, +/* 7896 */ {(12<<2)|2,{97,82,0}}, +/* 7897 */ {(12<<2)|2,{97,82,0}}, +/* 7898 */ {(12<<2)|2,{97,82,0}}, +/* 7899 */ {(12<<2)|2,{97,82,0}}, +/* 7900 */ {(12<<2)|2,{97,82,0}}, +/* 7901 */ {(12<<2)|2,{97,82,0}}, +/* 7902 */ {(12<<2)|2,{97,82,0}}, +/* 7903 */ {(12<<2)|2,{97,82,0}}, +/* 7904 */ {(12<<2)|2,{97,83,0}}, +/* 7905 */ {(12<<2)|2,{97,83,0}}, +/* 7906 */ {(12<<2)|2,{97,83,0}}, +/* 7907 */ {(12<<2)|2,{97,83,0}}, +/* 7908 */ {(12<<2)|2,{97,83,0}}, +/* 7909 */ {(12<<2)|2,{97,83,0}}, +/* 7910 */ {(12<<2)|2,{97,83,0}}, +/* 7911 */ {(12<<2)|2,{97,83,0}}, +/* 7912 */ {(12<<2)|2,{97,83,0}}, +/* 7913 */ {(12<<2)|2,{97,83,0}}, +/* 7914 */ {(12<<2)|2,{97,83,0}}, +/* 7915 */ {(12<<2)|2,{97,83,0}}, +/* 7916 */ {(12<<2)|2,{97,83,0}}, +/* 7917 */ {(12<<2)|2,{97,83,0}}, +/* 7918 */ {(12<<2)|2,{97,83,0}}, +/* 7919 */ {(12<<2)|2,{97,83,0}}, +/* 7920 */ {(12<<2)|2,{97,84,0}}, +/* 7921 */ {(12<<2)|2,{97,84,0}}, +/* 7922 */ {(12<<2)|2,{97,84,0}}, +/* 7923 */ {(12<<2)|2,{97,84,0}}, +/* 7924 */ {(12<<2)|2,{97,84,0}}, +/* 7925 */ {(12<<2)|2,{97,84,0}}, +/* 7926 */ {(12<<2)|2,{97,84,0}}, +/* 7927 */ {(12<<2)|2,{97,84,0}}, +/* 7928 */ {(12<<2)|2,{97,84,0}}, +/* 7929 */ {(12<<2)|2,{97,84,0}}, +/* 7930 */ {(12<<2)|2,{97,84,0}}, +/* 7931 */ {(12<<2)|2,{97,84,0}}, +/* 7932 */ {(12<<2)|2,{97,84,0}}, +/* 7933 */ {(12<<2)|2,{97,84,0}}, +/* 7934 */ {(12<<2)|2,{97,84,0}}, +/* 7935 */ {(12<<2)|2,{97,84,0}}, +/* 7936 */ {(12<<2)|2,{97,85,0}}, +/* 7937 */ {(12<<2)|2,{97,85,0}}, +/* 7938 */ {(12<<2)|2,{97,85,0}}, +/* 7939 */ {(12<<2)|2,{97,85,0}}, +/* 7940 */ {(12<<2)|2,{97,85,0}}, +/* 7941 */ {(12<<2)|2,{97,85,0}}, +/* 7942 */ {(12<<2)|2,{97,85,0}}, +/* 7943 */ {(12<<2)|2,{97,85,0}}, +/* 7944 */ {(12<<2)|2,{97,85,0}}, +/* 7945 */ {(12<<2)|2,{97,85,0}}, +/* 7946 */ {(12<<2)|2,{97,85,0}}, +/* 7947 */ {(12<<2)|2,{97,85,0}}, +/* 7948 */ {(12<<2)|2,{97,85,0}}, +/* 7949 */ {(12<<2)|2,{97,85,0}}, +/* 7950 */ {(12<<2)|2,{97,85,0}}, +/* 7951 */ {(12<<2)|2,{97,85,0}}, +/* 7952 */ {(12<<2)|2,{97,86,0}}, +/* 7953 */ {(12<<2)|2,{97,86,0}}, +/* 7954 */ {(12<<2)|2,{97,86,0}}, +/* 7955 */ {(12<<2)|2,{97,86,0}}, +/* 7956 */ {(12<<2)|2,{97,86,0}}, +/* 7957 */ {(12<<2)|2,{97,86,0}}, +/* 7958 */ {(12<<2)|2,{97,86,0}}, +/* 7959 */ {(12<<2)|2,{97,86,0}}, +/* 7960 */ {(12<<2)|2,{97,86,0}}, +/* 7961 */ {(12<<2)|2,{97,86,0}}, +/* 7962 */ {(12<<2)|2,{97,86,0}}, +/* 7963 */ {(12<<2)|2,{97,86,0}}, +/* 7964 */ {(12<<2)|2,{97,86,0}}, +/* 7965 */ {(12<<2)|2,{97,86,0}}, +/* 7966 */ {(12<<2)|2,{97,86,0}}, +/* 7967 */ {(12<<2)|2,{97,86,0}}, +/* 7968 */ {(12<<2)|2,{97,87,0}}, +/* 7969 */ {(12<<2)|2,{97,87,0}}, +/* 7970 */ {(12<<2)|2,{97,87,0}}, +/* 7971 */ {(12<<2)|2,{97,87,0}}, +/* 7972 */ {(12<<2)|2,{97,87,0}}, +/* 7973 */ {(12<<2)|2,{97,87,0}}, +/* 7974 */ {(12<<2)|2,{97,87,0}}, +/* 7975 */ {(12<<2)|2,{97,87,0}}, +/* 7976 */ {(12<<2)|2,{97,87,0}}, +/* 7977 */ {(12<<2)|2,{97,87,0}}, +/* 7978 */ {(12<<2)|2,{97,87,0}}, +/* 7979 */ {(12<<2)|2,{97,87,0}}, +/* 7980 */ {(12<<2)|2,{97,87,0}}, +/* 7981 */ {(12<<2)|2,{97,87,0}}, +/* 7982 */ {(12<<2)|2,{97,87,0}}, +/* 7983 */ {(12<<2)|2,{97,87,0}}, +/* 7984 */ {(12<<2)|2,{97,89,0}}, +/* 7985 */ {(12<<2)|2,{97,89,0}}, +/* 7986 */ {(12<<2)|2,{97,89,0}}, +/* 7987 */ {(12<<2)|2,{97,89,0}}, +/* 7988 */ {(12<<2)|2,{97,89,0}}, +/* 7989 */ {(12<<2)|2,{97,89,0}}, +/* 7990 */ {(12<<2)|2,{97,89,0}}, +/* 7991 */ {(12<<2)|2,{97,89,0}}, +/* 7992 */ {(12<<2)|2,{97,89,0}}, +/* 7993 */ {(12<<2)|2,{97,89,0}}, +/* 7994 */ {(12<<2)|2,{97,89,0}}, +/* 7995 */ {(12<<2)|2,{97,89,0}}, +/* 7996 */ {(12<<2)|2,{97,89,0}}, +/* 7997 */ {(12<<2)|2,{97,89,0}}, +/* 7998 */ {(12<<2)|2,{97,89,0}}, +/* 7999 */ {(12<<2)|2,{97,89,0}}, +/* 8000 */ {(12<<2)|2,{97,106,0}}, +/* 8001 */ {(12<<2)|2,{97,106,0}}, +/* 8002 */ {(12<<2)|2,{97,106,0}}, +/* 8003 */ {(12<<2)|2,{97,106,0}}, +/* 8004 */ {(12<<2)|2,{97,106,0}}, +/* 8005 */ {(12<<2)|2,{97,106,0}}, +/* 8006 */ {(12<<2)|2,{97,106,0}}, +/* 8007 */ {(12<<2)|2,{97,106,0}}, +/* 8008 */ {(12<<2)|2,{97,106,0}}, +/* 8009 */ {(12<<2)|2,{97,106,0}}, +/* 8010 */ {(12<<2)|2,{97,106,0}}, +/* 8011 */ {(12<<2)|2,{97,106,0}}, +/* 8012 */ {(12<<2)|2,{97,106,0}}, +/* 8013 */ {(12<<2)|2,{97,106,0}}, +/* 8014 */ {(12<<2)|2,{97,106,0}}, +/* 8015 */ {(12<<2)|2,{97,106,0}}, +/* 8016 */ {(12<<2)|2,{97,107,0}}, +/* 8017 */ {(12<<2)|2,{97,107,0}}, +/* 8018 */ {(12<<2)|2,{97,107,0}}, +/* 8019 */ {(12<<2)|2,{97,107,0}}, +/* 8020 */ {(12<<2)|2,{97,107,0}}, +/* 8021 */ {(12<<2)|2,{97,107,0}}, +/* 8022 */ {(12<<2)|2,{97,107,0}}, +/* 8023 */ {(12<<2)|2,{97,107,0}}, +/* 8024 */ {(12<<2)|2,{97,107,0}}, +/* 8025 */ {(12<<2)|2,{97,107,0}}, +/* 8026 */ {(12<<2)|2,{97,107,0}}, +/* 8027 */ {(12<<2)|2,{97,107,0}}, +/* 8028 */ {(12<<2)|2,{97,107,0}}, +/* 8029 */ {(12<<2)|2,{97,107,0}}, +/* 8030 */ {(12<<2)|2,{97,107,0}}, +/* 8031 */ {(12<<2)|2,{97,107,0}}, +/* 8032 */ {(12<<2)|2,{97,113,0}}, +/* 8033 */ {(12<<2)|2,{97,113,0}}, +/* 8034 */ {(12<<2)|2,{97,113,0}}, +/* 8035 */ {(12<<2)|2,{97,113,0}}, +/* 8036 */ {(12<<2)|2,{97,113,0}}, +/* 8037 */ {(12<<2)|2,{97,113,0}}, +/* 8038 */ {(12<<2)|2,{97,113,0}}, +/* 8039 */ {(12<<2)|2,{97,113,0}}, +/* 8040 */ {(12<<2)|2,{97,113,0}}, +/* 8041 */ {(12<<2)|2,{97,113,0}}, +/* 8042 */ {(12<<2)|2,{97,113,0}}, +/* 8043 */ {(12<<2)|2,{97,113,0}}, +/* 8044 */ {(12<<2)|2,{97,113,0}}, +/* 8045 */ {(12<<2)|2,{97,113,0}}, +/* 8046 */ {(12<<2)|2,{97,113,0}}, +/* 8047 */ {(12<<2)|2,{97,113,0}}, +/* 8048 */ {(12<<2)|2,{97,118,0}}, +/* 8049 */ {(12<<2)|2,{97,118,0}}, +/* 8050 */ {(12<<2)|2,{97,118,0}}, +/* 8051 */ {(12<<2)|2,{97,118,0}}, +/* 8052 */ {(12<<2)|2,{97,118,0}}, +/* 8053 */ {(12<<2)|2,{97,118,0}}, +/* 8054 */ {(12<<2)|2,{97,118,0}}, +/* 8055 */ {(12<<2)|2,{97,118,0}}, +/* 8056 */ {(12<<2)|2,{97,118,0}}, +/* 8057 */ {(12<<2)|2,{97,118,0}}, +/* 8058 */ {(12<<2)|2,{97,118,0}}, +/* 8059 */ {(12<<2)|2,{97,118,0}}, +/* 8060 */ {(12<<2)|2,{97,118,0}}, +/* 8061 */ {(12<<2)|2,{97,118,0}}, +/* 8062 */ {(12<<2)|2,{97,118,0}}, +/* 8063 */ {(12<<2)|2,{97,118,0}}, +/* 8064 */ {(12<<2)|2,{97,119,0}}, +/* 8065 */ {(12<<2)|2,{97,119,0}}, +/* 8066 */ {(12<<2)|2,{97,119,0}}, +/* 8067 */ {(12<<2)|2,{97,119,0}}, +/* 8068 */ {(12<<2)|2,{97,119,0}}, +/* 8069 */ {(12<<2)|2,{97,119,0}}, +/* 8070 */ {(12<<2)|2,{97,119,0}}, +/* 8071 */ {(12<<2)|2,{97,119,0}}, +/* 8072 */ {(12<<2)|2,{97,119,0}}, +/* 8073 */ {(12<<2)|2,{97,119,0}}, +/* 8074 */ {(12<<2)|2,{97,119,0}}, +/* 8075 */ {(12<<2)|2,{97,119,0}}, +/* 8076 */ {(12<<2)|2,{97,119,0}}, +/* 8077 */ {(12<<2)|2,{97,119,0}}, +/* 8078 */ {(12<<2)|2,{97,119,0}}, +/* 8079 */ {(12<<2)|2,{97,119,0}}, +/* 8080 */ {(12<<2)|2,{97,120,0}}, +/* 8081 */ {(12<<2)|2,{97,120,0}}, +/* 8082 */ {(12<<2)|2,{97,120,0}}, +/* 8083 */ {(12<<2)|2,{97,120,0}}, +/* 8084 */ {(12<<2)|2,{97,120,0}}, +/* 8085 */ {(12<<2)|2,{97,120,0}}, +/* 8086 */ {(12<<2)|2,{97,120,0}}, +/* 8087 */ {(12<<2)|2,{97,120,0}}, +/* 8088 */ {(12<<2)|2,{97,120,0}}, +/* 8089 */ {(12<<2)|2,{97,120,0}}, +/* 8090 */ {(12<<2)|2,{97,120,0}}, +/* 8091 */ {(12<<2)|2,{97,120,0}}, +/* 8092 */ {(12<<2)|2,{97,120,0}}, +/* 8093 */ {(12<<2)|2,{97,120,0}}, +/* 8094 */ {(12<<2)|2,{97,120,0}}, +/* 8095 */ {(12<<2)|2,{97,120,0}}, +/* 8096 */ {(12<<2)|2,{97,121,0}}, +/* 8097 */ {(12<<2)|2,{97,121,0}}, +/* 8098 */ {(12<<2)|2,{97,121,0}}, +/* 8099 */ {(12<<2)|2,{97,121,0}}, +/* 8100 */ {(12<<2)|2,{97,121,0}}, +/* 8101 */ {(12<<2)|2,{97,121,0}}, +/* 8102 */ {(12<<2)|2,{97,121,0}}, +/* 8103 */ {(12<<2)|2,{97,121,0}}, +/* 8104 */ {(12<<2)|2,{97,121,0}}, +/* 8105 */ {(12<<2)|2,{97,121,0}}, +/* 8106 */ {(12<<2)|2,{97,121,0}}, +/* 8107 */ {(12<<2)|2,{97,121,0}}, +/* 8108 */ {(12<<2)|2,{97,121,0}}, +/* 8109 */ {(12<<2)|2,{97,121,0}}, +/* 8110 */ {(12<<2)|2,{97,121,0}}, +/* 8111 */ {(12<<2)|2,{97,121,0}}, +/* 8112 */ {(12<<2)|2,{97,122,0}}, +/* 8113 */ {(12<<2)|2,{97,122,0}}, +/* 8114 */ {(12<<2)|2,{97,122,0}}, +/* 8115 */ {(12<<2)|2,{97,122,0}}, +/* 8116 */ {(12<<2)|2,{97,122,0}}, +/* 8117 */ {(12<<2)|2,{97,122,0}}, +/* 8118 */ {(12<<2)|2,{97,122,0}}, +/* 8119 */ {(12<<2)|2,{97,122,0}}, +/* 8120 */ {(12<<2)|2,{97,122,0}}, +/* 8121 */ {(12<<2)|2,{97,122,0}}, +/* 8122 */ {(12<<2)|2,{97,122,0}}, +/* 8123 */ {(12<<2)|2,{97,122,0}}, +/* 8124 */ {(12<<2)|2,{97,122,0}}, +/* 8125 */ {(12<<2)|2,{97,122,0}}, +/* 8126 */ {(12<<2)|2,{97,122,0}}, +/* 8127 */ {(12<<2)|2,{97,122,0}}, +/* 8128 */ {(13<<2)|2,{97,38,0}}, +/* 8129 */ {(13<<2)|2,{97,38,0}}, +/* 8130 */ {(13<<2)|2,{97,38,0}}, +/* 8131 */ {(13<<2)|2,{97,38,0}}, +/* 8132 */ {(13<<2)|2,{97,38,0}}, +/* 8133 */ {(13<<2)|2,{97,38,0}}, +/* 8134 */ {(13<<2)|2,{97,38,0}}, +/* 8135 */ {(13<<2)|2,{97,38,0}}, +/* 8136 */ {(13<<2)|2,{97,42,0}}, +/* 8137 */ {(13<<2)|2,{97,42,0}}, +/* 8138 */ {(13<<2)|2,{97,42,0}}, +/* 8139 */ {(13<<2)|2,{97,42,0}}, +/* 8140 */ {(13<<2)|2,{97,42,0}}, +/* 8141 */ {(13<<2)|2,{97,42,0}}, +/* 8142 */ {(13<<2)|2,{97,42,0}}, +/* 8143 */ {(13<<2)|2,{97,42,0}}, +/* 8144 */ {(13<<2)|2,{97,44,0}}, +/* 8145 */ {(13<<2)|2,{97,44,0}}, +/* 8146 */ {(13<<2)|2,{97,44,0}}, +/* 8147 */ {(13<<2)|2,{97,44,0}}, +/* 8148 */ {(13<<2)|2,{97,44,0}}, +/* 8149 */ {(13<<2)|2,{97,44,0}}, +/* 8150 */ {(13<<2)|2,{97,44,0}}, +/* 8151 */ {(13<<2)|2,{97,44,0}}, +/* 8152 */ {(13<<2)|2,{97,59,0}}, +/* 8153 */ {(13<<2)|2,{97,59,0}}, +/* 8154 */ {(13<<2)|2,{97,59,0}}, +/* 8155 */ {(13<<2)|2,{97,59,0}}, +/* 8156 */ {(13<<2)|2,{97,59,0}}, +/* 8157 */ {(13<<2)|2,{97,59,0}}, +/* 8158 */ {(13<<2)|2,{97,59,0}}, +/* 8159 */ {(13<<2)|2,{97,59,0}}, +/* 8160 */ {(13<<2)|2,{97,88,0}}, +/* 8161 */ {(13<<2)|2,{97,88,0}}, +/* 8162 */ {(13<<2)|2,{97,88,0}}, +/* 8163 */ {(13<<2)|2,{97,88,0}}, +/* 8164 */ {(13<<2)|2,{97,88,0}}, +/* 8165 */ {(13<<2)|2,{97,88,0}}, +/* 8166 */ {(13<<2)|2,{97,88,0}}, +/* 8167 */ {(13<<2)|2,{97,88,0}}, +/* 8168 */ {(13<<2)|2,{97,90,0}}, +/* 8169 */ {(13<<2)|2,{97,90,0}}, +/* 8170 */ {(13<<2)|2,{97,90,0}}, +/* 8171 */ {(13<<2)|2,{97,90,0}}, +/* 8172 */ {(13<<2)|2,{97,90,0}}, +/* 8173 */ {(13<<2)|2,{97,90,0}}, +/* 8174 */ {(13<<2)|2,{97,90,0}}, +/* 8175 */ {(13<<2)|2,{97,90,0}}, +/* 8176 */ {(15<<2)|2,{97,33,0}}, +/* 8177 */ {(15<<2)|2,{97,33,0}}, +/* 8178 */ {(15<<2)|2,{97,34,0}}, +/* 8179 */ {(15<<2)|2,{97,34,0}}, +/* 8180 */ {(15<<2)|2,{97,40,0}}, +/* 8181 */ {(15<<2)|2,{97,40,0}}, +/* 8182 */ {(15<<2)|2,{97,41,0}}, +/* 8183 */ {(15<<2)|2,{97,41,0}}, +/* 8184 */ {(15<<2)|2,{97,63,0}}, +/* 8185 */ {(15<<2)|2,{97,63,0}}, +/* 8186 */ {(16<<2)|2,{97,39,0}}, +/* 8187 */ {(16<<2)|2,{97,43,0}}, +/* 8188 */ {(16<<2)|2,{97,124,0}}, +/* 8189 */ {(5<<2)|1,{97,0,0}}, +/* 8190 */ {(5<<2)|1,{97,0,0}}, +/* 8191 */ {(5<<2)|1,{97,0,0}}, +/* 8192 */ {(15<<2)|3,{99,48,48}}, +/* 8193 */ {(15<<2)|3,{99,48,48}}, +/* 8194 */ {(15<<2)|3,{99,48,49}}, +/* 8195 */ {(15<<2)|3,{99,48,49}}, +/* 8196 */ {(15<<2)|3,{99,48,50}}, +/* 8197 */ {(15<<2)|3,{99,48,50}}, +/* 8198 */ {(15<<2)|3,{99,48,97}}, +/* 8199 */ {(15<<2)|3,{99,48,97}}, +/* 8200 */ {(15<<2)|3,{99,48,99}}, +/* 8201 */ {(15<<2)|3,{99,48,99}}, +/* 8202 */ {(15<<2)|3,{99,48,101}}, +/* 8203 */ {(15<<2)|3,{99,48,101}}, +/* 8204 */ {(15<<2)|3,{99,48,105}}, +/* 8205 */ {(15<<2)|3,{99,48,105}}, +/* 8206 */ {(15<<2)|3,{99,48,111}}, +/* 8207 */ {(15<<2)|3,{99,48,111}}, +/* 8208 */ {(15<<2)|3,{99,48,115}}, +/* 8209 */ {(15<<2)|3,{99,48,115}}, +/* 8210 */ {(15<<2)|3,{99,48,116}}, +/* 8211 */ {(15<<2)|3,{99,48,116}}, +/* 8212 */ {(16<<2)|3,{99,48,32}}, +/* 8213 */ {(16<<2)|3,{99,48,37}}, +/* 8214 */ {(16<<2)|3,{99,48,45}}, +/* 8215 */ {(16<<2)|3,{99,48,46}}, +/* 8216 */ {(16<<2)|3,{99,48,47}}, +/* 8217 */ {(16<<2)|3,{99,48,51}}, +/* 8218 */ {(16<<2)|3,{99,48,52}}, +/* 8219 */ {(16<<2)|3,{99,48,53}}, +/* 8220 */ {(16<<2)|3,{99,48,54}}, +/* 8221 */ {(16<<2)|3,{99,48,55}}, +/* 8222 */ {(16<<2)|3,{99,48,56}}, +/* 8223 */ {(16<<2)|3,{99,48,57}}, +/* 8224 */ {(16<<2)|3,{99,48,61}}, +/* 8225 */ {(16<<2)|3,{99,48,65}}, +/* 8226 */ {(16<<2)|3,{99,48,95}}, +/* 8227 */ {(16<<2)|3,{99,48,98}}, +/* 8228 */ {(16<<2)|3,{99,48,100}}, +/* 8229 */ {(16<<2)|3,{99,48,102}}, +/* 8230 */ {(16<<2)|3,{99,48,103}}, +/* 8231 */ {(16<<2)|3,{99,48,104}}, +/* 8232 */ {(16<<2)|3,{99,48,108}}, +/* 8233 */ {(16<<2)|3,{99,48,109}}, +/* 8234 */ {(16<<2)|3,{99,48,110}}, +/* 8235 */ {(16<<2)|3,{99,48,112}}, +/* 8236 */ {(16<<2)|3,{99,48,114}}, +/* 8237 */ {(16<<2)|3,{99,48,117}}, +/* 8238 */ {(10<<2)|2,{99,48,0}}, +/* 8239 */ {(10<<2)|2,{99,48,0}}, +/* 8240 */ {(10<<2)|2,{99,48,0}}, +/* 8241 */ {(10<<2)|2,{99,48,0}}, +/* 8242 */ {(10<<2)|2,{99,48,0}}, +/* 8243 */ {(10<<2)|2,{99,48,0}}, +/* 8244 */ {(10<<2)|2,{99,48,0}}, +/* 8245 */ {(10<<2)|2,{99,48,0}}, +/* 8246 */ {(10<<2)|2,{99,48,0}}, +/* 8247 */ {(10<<2)|2,{99,48,0}}, +/* 8248 */ {(10<<2)|2,{99,48,0}}, +/* 8249 */ {(10<<2)|2,{99,48,0}}, +/* 8250 */ {(10<<2)|2,{99,48,0}}, +/* 8251 */ {(10<<2)|2,{99,48,0}}, +/* 8252 */ {(10<<2)|2,{99,48,0}}, +/* 8253 */ {(10<<2)|2,{99,48,0}}, +/* 8254 */ {(10<<2)|2,{99,48,0}}, +/* 8255 */ {(10<<2)|2,{99,48,0}}, +/* 8256 */ {(15<<2)|3,{99,49,48}}, +/* 8257 */ {(15<<2)|3,{99,49,48}}, +/* 8258 */ {(15<<2)|3,{99,49,49}}, +/* 8259 */ {(15<<2)|3,{99,49,49}}, +/* 8260 */ {(15<<2)|3,{99,49,50}}, +/* 8261 */ {(15<<2)|3,{99,49,50}}, +/* 8262 */ {(15<<2)|3,{99,49,97}}, +/* 8263 */ {(15<<2)|3,{99,49,97}}, +/* 8264 */ {(15<<2)|3,{99,49,99}}, +/* 8265 */ {(15<<2)|3,{99,49,99}}, +/* 8266 */ {(15<<2)|3,{99,49,101}}, +/* 8267 */ {(15<<2)|3,{99,49,101}}, +/* 8268 */ {(15<<2)|3,{99,49,105}}, +/* 8269 */ {(15<<2)|3,{99,49,105}}, +/* 8270 */ {(15<<2)|3,{99,49,111}}, +/* 8271 */ {(15<<2)|3,{99,49,111}}, +/* 8272 */ {(15<<2)|3,{99,49,115}}, +/* 8273 */ {(15<<2)|3,{99,49,115}}, +/* 8274 */ {(15<<2)|3,{99,49,116}}, +/* 8275 */ {(15<<2)|3,{99,49,116}}, +/* 8276 */ {(16<<2)|3,{99,49,32}}, +/* 8277 */ {(16<<2)|3,{99,49,37}}, +/* 8278 */ {(16<<2)|3,{99,49,45}}, +/* 8279 */ {(16<<2)|3,{99,49,46}}, +/* 8280 */ {(16<<2)|3,{99,49,47}}, +/* 8281 */ {(16<<2)|3,{99,49,51}}, +/* 8282 */ {(16<<2)|3,{99,49,52}}, +/* 8283 */ {(16<<2)|3,{99,49,53}}, +/* 8284 */ {(16<<2)|3,{99,49,54}}, +/* 8285 */ {(16<<2)|3,{99,49,55}}, +/* 8286 */ {(16<<2)|3,{99,49,56}}, +/* 8287 */ {(16<<2)|3,{99,49,57}}, +/* 8288 */ {(16<<2)|3,{99,49,61}}, +/* 8289 */ {(16<<2)|3,{99,49,65}}, +/* 8290 */ {(16<<2)|3,{99,49,95}}, +/* 8291 */ {(16<<2)|3,{99,49,98}}, +/* 8292 */ {(16<<2)|3,{99,49,100}}, +/* 8293 */ {(16<<2)|3,{99,49,102}}, +/* 8294 */ {(16<<2)|3,{99,49,103}}, +/* 8295 */ {(16<<2)|3,{99,49,104}}, +/* 8296 */ {(16<<2)|3,{99,49,108}}, +/* 8297 */ {(16<<2)|3,{99,49,109}}, +/* 8298 */ {(16<<2)|3,{99,49,110}}, +/* 8299 */ {(16<<2)|3,{99,49,112}}, +/* 8300 */ {(16<<2)|3,{99,49,114}}, +/* 8301 */ {(16<<2)|3,{99,49,117}}, +/* 8302 */ {(10<<2)|2,{99,49,0}}, +/* 8303 */ {(10<<2)|2,{99,49,0}}, +/* 8304 */ {(10<<2)|2,{99,49,0}}, +/* 8305 */ {(10<<2)|2,{99,49,0}}, +/* 8306 */ {(10<<2)|2,{99,49,0}}, +/* 8307 */ {(10<<2)|2,{99,49,0}}, +/* 8308 */ {(10<<2)|2,{99,49,0}}, +/* 8309 */ {(10<<2)|2,{99,49,0}}, +/* 8310 */ {(10<<2)|2,{99,49,0}}, +/* 8311 */ {(10<<2)|2,{99,49,0}}, +/* 8312 */ {(10<<2)|2,{99,49,0}}, +/* 8313 */ {(10<<2)|2,{99,49,0}}, +/* 8314 */ {(10<<2)|2,{99,49,0}}, +/* 8315 */ {(10<<2)|2,{99,49,0}}, +/* 8316 */ {(10<<2)|2,{99,49,0}}, +/* 8317 */ {(10<<2)|2,{99,49,0}}, +/* 8318 */ {(10<<2)|2,{99,49,0}}, +/* 8319 */ {(10<<2)|2,{99,49,0}}, +/* 8320 */ {(15<<2)|3,{99,50,48}}, +/* 8321 */ {(15<<2)|3,{99,50,48}}, +/* 8322 */ {(15<<2)|3,{99,50,49}}, +/* 8323 */ {(15<<2)|3,{99,50,49}}, +/* 8324 */ {(15<<2)|3,{99,50,50}}, +/* 8325 */ {(15<<2)|3,{99,50,50}}, +/* 8326 */ {(15<<2)|3,{99,50,97}}, +/* 8327 */ {(15<<2)|3,{99,50,97}}, +/* 8328 */ {(15<<2)|3,{99,50,99}}, +/* 8329 */ {(15<<2)|3,{99,50,99}}, +/* 8330 */ {(15<<2)|3,{99,50,101}}, +/* 8331 */ {(15<<2)|3,{99,50,101}}, +/* 8332 */ {(15<<2)|3,{99,50,105}}, +/* 8333 */ {(15<<2)|3,{99,50,105}}, +/* 8334 */ {(15<<2)|3,{99,50,111}}, +/* 8335 */ {(15<<2)|3,{99,50,111}}, +/* 8336 */ {(15<<2)|3,{99,50,115}}, +/* 8337 */ {(15<<2)|3,{99,50,115}}, +/* 8338 */ {(15<<2)|3,{99,50,116}}, +/* 8339 */ {(15<<2)|3,{99,50,116}}, +/* 8340 */ {(16<<2)|3,{99,50,32}}, +/* 8341 */ {(16<<2)|3,{99,50,37}}, +/* 8342 */ {(16<<2)|3,{99,50,45}}, +/* 8343 */ {(16<<2)|3,{99,50,46}}, +/* 8344 */ {(16<<2)|3,{99,50,47}}, +/* 8345 */ {(16<<2)|3,{99,50,51}}, +/* 8346 */ {(16<<2)|3,{99,50,52}}, +/* 8347 */ {(16<<2)|3,{99,50,53}}, +/* 8348 */ {(16<<2)|3,{99,50,54}}, +/* 8349 */ {(16<<2)|3,{99,50,55}}, +/* 8350 */ {(16<<2)|3,{99,50,56}}, +/* 8351 */ {(16<<2)|3,{99,50,57}}, +/* 8352 */ {(16<<2)|3,{99,50,61}}, +/* 8353 */ {(16<<2)|3,{99,50,65}}, +/* 8354 */ {(16<<2)|3,{99,50,95}}, +/* 8355 */ {(16<<2)|3,{99,50,98}}, +/* 8356 */ {(16<<2)|3,{99,50,100}}, +/* 8357 */ {(16<<2)|3,{99,50,102}}, +/* 8358 */ {(16<<2)|3,{99,50,103}}, +/* 8359 */ {(16<<2)|3,{99,50,104}}, +/* 8360 */ {(16<<2)|3,{99,50,108}}, +/* 8361 */ {(16<<2)|3,{99,50,109}}, +/* 8362 */ {(16<<2)|3,{99,50,110}}, +/* 8363 */ {(16<<2)|3,{99,50,112}}, +/* 8364 */ {(16<<2)|3,{99,50,114}}, +/* 8365 */ {(16<<2)|3,{99,50,117}}, +/* 8366 */ {(10<<2)|2,{99,50,0}}, +/* 8367 */ {(10<<2)|2,{99,50,0}}, +/* 8368 */ {(10<<2)|2,{99,50,0}}, +/* 8369 */ {(10<<2)|2,{99,50,0}}, +/* 8370 */ {(10<<2)|2,{99,50,0}}, +/* 8371 */ {(10<<2)|2,{99,50,0}}, +/* 8372 */ {(10<<2)|2,{99,50,0}}, +/* 8373 */ {(10<<2)|2,{99,50,0}}, +/* 8374 */ {(10<<2)|2,{99,50,0}}, +/* 8375 */ {(10<<2)|2,{99,50,0}}, +/* 8376 */ {(10<<2)|2,{99,50,0}}, +/* 8377 */ {(10<<2)|2,{99,50,0}}, +/* 8378 */ {(10<<2)|2,{99,50,0}}, +/* 8379 */ {(10<<2)|2,{99,50,0}}, +/* 8380 */ {(10<<2)|2,{99,50,0}}, +/* 8381 */ {(10<<2)|2,{99,50,0}}, +/* 8382 */ {(10<<2)|2,{99,50,0}}, +/* 8383 */ {(10<<2)|2,{99,50,0}}, +/* 8384 */ {(15<<2)|3,{99,97,48}}, +/* 8385 */ {(15<<2)|3,{99,97,48}}, +/* 8386 */ {(15<<2)|3,{99,97,49}}, +/* 8387 */ {(15<<2)|3,{99,97,49}}, +/* 8388 */ {(15<<2)|3,{99,97,50}}, +/* 8389 */ {(15<<2)|3,{99,97,50}}, +/* 8390 */ {(15<<2)|3,{99,97,97}}, +/* 8391 */ {(15<<2)|3,{99,97,97}}, +/* 8392 */ {(15<<2)|3,{99,97,99}}, +/* 8393 */ {(15<<2)|3,{99,97,99}}, +/* 8394 */ {(15<<2)|3,{99,97,101}}, +/* 8395 */ {(15<<2)|3,{99,97,101}}, +/* 8396 */ {(15<<2)|3,{99,97,105}}, +/* 8397 */ {(15<<2)|3,{99,97,105}}, +/* 8398 */ {(15<<2)|3,{99,97,111}}, +/* 8399 */ {(15<<2)|3,{99,97,111}}, +/* 8400 */ {(15<<2)|3,{99,97,115}}, +/* 8401 */ {(15<<2)|3,{99,97,115}}, +/* 8402 */ {(15<<2)|3,{99,97,116}}, +/* 8403 */ {(15<<2)|3,{99,97,116}}, +/* 8404 */ {(16<<2)|3,{99,97,32}}, +/* 8405 */ {(16<<2)|3,{99,97,37}}, +/* 8406 */ {(16<<2)|3,{99,97,45}}, +/* 8407 */ {(16<<2)|3,{99,97,46}}, +/* 8408 */ {(16<<2)|3,{99,97,47}}, +/* 8409 */ {(16<<2)|3,{99,97,51}}, +/* 8410 */ {(16<<2)|3,{99,97,52}}, +/* 8411 */ {(16<<2)|3,{99,97,53}}, +/* 8412 */ {(16<<2)|3,{99,97,54}}, +/* 8413 */ {(16<<2)|3,{99,97,55}}, +/* 8414 */ {(16<<2)|3,{99,97,56}}, +/* 8415 */ {(16<<2)|3,{99,97,57}}, +/* 8416 */ {(16<<2)|3,{99,97,61}}, +/* 8417 */ {(16<<2)|3,{99,97,65}}, +/* 8418 */ {(16<<2)|3,{99,97,95}}, +/* 8419 */ {(16<<2)|3,{99,97,98}}, +/* 8420 */ {(16<<2)|3,{99,97,100}}, +/* 8421 */ {(16<<2)|3,{99,97,102}}, +/* 8422 */ {(16<<2)|3,{99,97,103}}, +/* 8423 */ {(16<<2)|3,{99,97,104}}, +/* 8424 */ {(16<<2)|3,{99,97,108}}, +/* 8425 */ {(16<<2)|3,{99,97,109}}, +/* 8426 */ {(16<<2)|3,{99,97,110}}, +/* 8427 */ {(16<<2)|3,{99,97,112}}, +/* 8428 */ {(16<<2)|3,{99,97,114}}, +/* 8429 */ {(16<<2)|3,{99,97,117}}, +/* 8430 */ {(10<<2)|2,{99,97,0}}, +/* 8431 */ {(10<<2)|2,{99,97,0}}, +/* 8432 */ {(10<<2)|2,{99,97,0}}, +/* 8433 */ {(10<<2)|2,{99,97,0}}, +/* 8434 */ {(10<<2)|2,{99,97,0}}, +/* 8435 */ {(10<<2)|2,{99,97,0}}, +/* 8436 */ {(10<<2)|2,{99,97,0}}, +/* 8437 */ {(10<<2)|2,{99,97,0}}, +/* 8438 */ {(10<<2)|2,{99,97,0}}, +/* 8439 */ {(10<<2)|2,{99,97,0}}, +/* 8440 */ {(10<<2)|2,{99,97,0}}, +/* 8441 */ {(10<<2)|2,{99,97,0}}, +/* 8442 */ {(10<<2)|2,{99,97,0}}, +/* 8443 */ {(10<<2)|2,{99,97,0}}, +/* 8444 */ {(10<<2)|2,{99,97,0}}, +/* 8445 */ {(10<<2)|2,{99,97,0}}, +/* 8446 */ {(10<<2)|2,{99,97,0}}, +/* 8447 */ {(10<<2)|2,{99,97,0}}, +/* 8448 */ {(15<<2)|3,{99,99,48}}, +/* 8449 */ {(15<<2)|3,{99,99,48}}, +/* 8450 */ {(15<<2)|3,{99,99,49}}, +/* 8451 */ {(15<<2)|3,{99,99,49}}, +/* 8452 */ {(15<<2)|3,{99,99,50}}, +/* 8453 */ {(15<<2)|3,{99,99,50}}, +/* 8454 */ {(15<<2)|3,{99,99,97}}, +/* 8455 */ {(15<<2)|3,{99,99,97}}, +/* 8456 */ {(15<<2)|3,{99,99,99}}, +/* 8457 */ {(15<<2)|3,{99,99,99}}, +/* 8458 */ {(15<<2)|3,{99,99,101}}, +/* 8459 */ {(15<<2)|3,{99,99,101}}, +/* 8460 */ {(15<<2)|3,{99,99,105}}, +/* 8461 */ {(15<<2)|3,{99,99,105}}, +/* 8462 */ {(15<<2)|3,{99,99,111}}, +/* 8463 */ {(15<<2)|3,{99,99,111}}, +/* 8464 */ {(15<<2)|3,{99,99,115}}, +/* 8465 */ {(15<<2)|3,{99,99,115}}, +/* 8466 */ {(15<<2)|3,{99,99,116}}, +/* 8467 */ {(15<<2)|3,{99,99,116}}, +/* 8468 */ {(16<<2)|3,{99,99,32}}, +/* 8469 */ {(16<<2)|3,{99,99,37}}, +/* 8470 */ {(16<<2)|3,{99,99,45}}, +/* 8471 */ {(16<<2)|3,{99,99,46}}, +/* 8472 */ {(16<<2)|3,{99,99,47}}, +/* 8473 */ {(16<<2)|3,{99,99,51}}, +/* 8474 */ {(16<<2)|3,{99,99,52}}, +/* 8475 */ {(16<<2)|3,{99,99,53}}, +/* 8476 */ {(16<<2)|3,{99,99,54}}, +/* 8477 */ {(16<<2)|3,{99,99,55}}, +/* 8478 */ {(16<<2)|3,{99,99,56}}, +/* 8479 */ {(16<<2)|3,{99,99,57}}, +/* 8480 */ {(16<<2)|3,{99,99,61}}, +/* 8481 */ {(16<<2)|3,{99,99,65}}, +/* 8482 */ {(16<<2)|3,{99,99,95}}, +/* 8483 */ {(16<<2)|3,{99,99,98}}, +/* 8484 */ {(16<<2)|3,{99,99,100}}, +/* 8485 */ {(16<<2)|3,{99,99,102}}, +/* 8486 */ {(16<<2)|3,{99,99,103}}, +/* 8487 */ {(16<<2)|3,{99,99,104}}, +/* 8488 */ {(16<<2)|3,{99,99,108}}, +/* 8489 */ {(16<<2)|3,{99,99,109}}, +/* 8490 */ {(16<<2)|3,{99,99,110}}, +/* 8491 */ {(16<<2)|3,{99,99,112}}, +/* 8492 */ {(16<<2)|3,{99,99,114}}, +/* 8493 */ {(16<<2)|3,{99,99,117}}, +/* 8494 */ {(10<<2)|2,{99,99,0}}, +/* 8495 */ {(10<<2)|2,{99,99,0}}, +/* 8496 */ {(10<<2)|2,{99,99,0}}, +/* 8497 */ {(10<<2)|2,{99,99,0}}, +/* 8498 */ {(10<<2)|2,{99,99,0}}, +/* 8499 */ {(10<<2)|2,{99,99,0}}, +/* 8500 */ {(10<<2)|2,{99,99,0}}, +/* 8501 */ {(10<<2)|2,{99,99,0}}, +/* 8502 */ {(10<<2)|2,{99,99,0}}, +/* 8503 */ {(10<<2)|2,{99,99,0}}, +/* 8504 */ {(10<<2)|2,{99,99,0}}, +/* 8505 */ {(10<<2)|2,{99,99,0}}, +/* 8506 */ {(10<<2)|2,{99,99,0}}, +/* 8507 */ {(10<<2)|2,{99,99,0}}, +/* 8508 */ {(10<<2)|2,{99,99,0}}, +/* 8509 */ {(10<<2)|2,{99,99,0}}, +/* 8510 */ {(10<<2)|2,{99,99,0}}, +/* 8511 */ {(10<<2)|2,{99,99,0}}, +/* 8512 */ {(15<<2)|3,{99,101,48}}, +/* 8513 */ {(15<<2)|3,{99,101,48}}, +/* 8514 */ {(15<<2)|3,{99,101,49}}, +/* 8515 */ {(15<<2)|3,{99,101,49}}, +/* 8516 */ {(15<<2)|3,{99,101,50}}, +/* 8517 */ {(15<<2)|3,{99,101,50}}, +/* 8518 */ {(15<<2)|3,{99,101,97}}, +/* 8519 */ {(15<<2)|3,{99,101,97}}, +/* 8520 */ {(15<<2)|3,{99,101,99}}, +/* 8521 */ {(15<<2)|3,{99,101,99}}, +/* 8522 */ {(15<<2)|3,{99,101,101}}, +/* 8523 */ {(15<<2)|3,{99,101,101}}, +/* 8524 */ {(15<<2)|3,{99,101,105}}, +/* 8525 */ {(15<<2)|3,{99,101,105}}, +/* 8526 */ {(15<<2)|3,{99,101,111}}, +/* 8527 */ {(15<<2)|3,{99,101,111}}, +/* 8528 */ {(15<<2)|3,{99,101,115}}, +/* 8529 */ {(15<<2)|3,{99,101,115}}, +/* 8530 */ {(15<<2)|3,{99,101,116}}, +/* 8531 */ {(15<<2)|3,{99,101,116}}, +/* 8532 */ {(16<<2)|3,{99,101,32}}, +/* 8533 */ {(16<<2)|3,{99,101,37}}, +/* 8534 */ {(16<<2)|3,{99,101,45}}, +/* 8535 */ {(16<<2)|3,{99,101,46}}, +/* 8536 */ {(16<<2)|3,{99,101,47}}, +/* 8537 */ {(16<<2)|3,{99,101,51}}, +/* 8538 */ {(16<<2)|3,{99,101,52}}, +/* 8539 */ {(16<<2)|3,{99,101,53}}, +/* 8540 */ {(16<<2)|3,{99,101,54}}, +/* 8541 */ {(16<<2)|3,{99,101,55}}, +/* 8542 */ {(16<<2)|3,{99,101,56}}, +/* 8543 */ {(16<<2)|3,{99,101,57}}, +/* 8544 */ {(16<<2)|3,{99,101,61}}, +/* 8545 */ {(16<<2)|3,{99,101,65}}, +/* 8546 */ {(16<<2)|3,{99,101,95}}, +/* 8547 */ {(16<<2)|3,{99,101,98}}, +/* 8548 */ {(16<<2)|3,{99,101,100}}, +/* 8549 */ {(16<<2)|3,{99,101,102}}, +/* 8550 */ {(16<<2)|3,{99,101,103}}, +/* 8551 */ {(16<<2)|3,{99,101,104}}, +/* 8552 */ {(16<<2)|3,{99,101,108}}, +/* 8553 */ {(16<<2)|3,{99,101,109}}, +/* 8554 */ {(16<<2)|3,{99,101,110}}, +/* 8555 */ {(16<<2)|3,{99,101,112}}, +/* 8556 */ {(16<<2)|3,{99,101,114}}, +/* 8557 */ {(16<<2)|3,{99,101,117}}, +/* 8558 */ {(10<<2)|2,{99,101,0}}, +/* 8559 */ {(10<<2)|2,{99,101,0}}, +/* 8560 */ {(10<<2)|2,{99,101,0}}, +/* 8561 */ {(10<<2)|2,{99,101,0}}, +/* 8562 */ {(10<<2)|2,{99,101,0}}, +/* 8563 */ {(10<<2)|2,{99,101,0}}, +/* 8564 */ {(10<<2)|2,{99,101,0}}, +/* 8565 */ {(10<<2)|2,{99,101,0}}, +/* 8566 */ {(10<<2)|2,{99,101,0}}, +/* 8567 */ {(10<<2)|2,{99,101,0}}, +/* 8568 */ {(10<<2)|2,{99,101,0}}, +/* 8569 */ {(10<<2)|2,{99,101,0}}, +/* 8570 */ {(10<<2)|2,{99,101,0}}, +/* 8571 */ {(10<<2)|2,{99,101,0}}, +/* 8572 */ {(10<<2)|2,{99,101,0}}, +/* 8573 */ {(10<<2)|2,{99,101,0}}, +/* 8574 */ {(10<<2)|2,{99,101,0}}, +/* 8575 */ {(10<<2)|2,{99,101,0}}, +/* 8576 */ {(15<<2)|3,{99,105,48}}, +/* 8577 */ {(15<<2)|3,{99,105,48}}, +/* 8578 */ {(15<<2)|3,{99,105,49}}, +/* 8579 */ {(15<<2)|3,{99,105,49}}, +/* 8580 */ {(15<<2)|3,{99,105,50}}, +/* 8581 */ {(15<<2)|3,{99,105,50}}, +/* 8582 */ {(15<<2)|3,{99,105,97}}, +/* 8583 */ {(15<<2)|3,{99,105,97}}, +/* 8584 */ {(15<<2)|3,{99,105,99}}, +/* 8585 */ {(15<<2)|3,{99,105,99}}, +/* 8586 */ {(15<<2)|3,{99,105,101}}, +/* 8587 */ {(15<<2)|3,{99,105,101}}, +/* 8588 */ {(15<<2)|3,{99,105,105}}, +/* 8589 */ {(15<<2)|3,{99,105,105}}, +/* 8590 */ {(15<<2)|3,{99,105,111}}, +/* 8591 */ {(15<<2)|3,{99,105,111}}, +/* 8592 */ {(15<<2)|3,{99,105,115}}, +/* 8593 */ {(15<<2)|3,{99,105,115}}, +/* 8594 */ {(15<<2)|3,{99,105,116}}, +/* 8595 */ {(15<<2)|3,{99,105,116}}, +/* 8596 */ {(16<<2)|3,{99,105,32}}, +/* 8597 */ {(16<<2)|3,{99,105,37}}, +/* 8598 */ {(16<<2)|3,{99,105,45}}, +/* 8599 */ {(16<<2)|3,{99,105,46}}, +/* 8600 */ {(16<<2)|3,{99,105,47}}, +/* 8601 */ {(16<<2)|3,{99,105,51}}, +/* 8602 */ {(16<<2)|3,{99,105,52}}, +/* 8603 */ {(16<<2)|3,{99,105,53}}, +/* 8604 */ {(16<<2)|3,{99,105,54}}, +/* 8605 */ {(16<<2)|3,{99,105,55}}, +/* 8606 */ {(16<<2)|3,{99,105,56}}, +/* 8607 */ {(16<<2)|3,{99,105,57}}, +/* 8608 */ {(16<<2)|3,{99,105,61}}, +/* 8609 */ {(16<<2)|3,{99,105,65}}, +/* 8610 */ {(16<<2)|3,{99,105,95}}, +/* 8611 */ {(16<<2)|3,{99,105,98}}, +/* 8612 */ {(16<<2)|3,{99,105,100}}, +/* 8613 */ {(16<<2)|3,{99,105,102}}, +/* 8614 */ {(16<<2)|3,{99,105,103}}, +/* 8615 */ {(16<<2)|3,{99,105,104}}, +/* 8616 */ {(16<<2)|3,{99,105,108}}, +/* 8617 */ {(16<<2)|3,{99,105,109}}, +/* 8618 */ {(16<<2)|3,{99,105,110}}, +/* 8619 */ {(16<<2)|3,{99,105,112}}, +/* 8620 */ {(16<<2)|3,{99,105,114}}, +/* 8621 */ {(16<<2)|3,{99,105,117}}, +/* 8622 */ {(10<<2)|2,{99,105,0}}, +/* 8623 */ {(10<<2)|2,{99,105,0}}, +/* 8624 */ {(10<<2)|2,{99,105,0}}, +/* 8625 */ {(10<<2)|2,{99,105,0}}, +/* 8626 */ {(10<<2)|2,{99,105,0}}, +/* 8627 */ {(10<<2)|2,{99,105,0}}, +/* 8628 */ {(10<<2)|2,{99,105,0}}, +/* 8629 */ {(10<<2)|2,{99,105,0}}, +/* 8630 */ {(10<<2)|2,{99,105,0}}, +/* 8631 */ {(10<<2)|2,{99,105,0}}, +/* 8632 */ {(10<<2)|2,{99,105,0}}, +/* 8633 */ {(10<<2)|2,{99,105,0}}, +/* 8634 */ {(10<<2)|2,{99,105,0}}, +/* 8635 */ {(10<<2)|2,{99,105,0}}, +/* 8636 */ {(10<<2)|2,{99,105,0}}, +/* 8637 */ {(10<<2)|2,{99,105,0}}, +/* 8638 */ {(10<<2)|2,{99,105,0}}, +/* 8639 */ {(10<<2)|2,{99,105,0}}, +/* 8640 */ {(15<<2)|3,{99,111,48}}, +/* 8641 */ {(15<<2)|3,{99,111,48}}, +/* 8642 */ {(15<<2)|3,{99,111,49}}, +/* 8643 */ {(15<<2)|3,{99,111,49}}, +/* 8644 */ {(15<<2)|3,{99,111,50}}, +/* 8645 */ {(15<<2)|3,{99,111,50}}, +/* 8646 */ {(15<<2)|3,{99,111,97}}, +/* 8647 */ {(15<<2)|3,{99,111,97}}, +/* 8648 */ {(15<<2)|3,{99,111,99}}, +/* 8649 */ {(15<<2)|3,{99,111,99}}, +/* 8650 */ {(15<<2)|3,{99,111,101}}, +/* 8651 */ {(15<<2)|3,{99,111,101}}, +/* 8652 */ {(15<<2)|3,{99,111,105}}, +/* 8653 */ {(15<<2)|3,{99,111,105}}, +/* 8654 */ {(15<<2)|3,{99,111,111}}, +/* 8655 */ {(15<<2)|3,{99,111,111}}, +/* 8656 */ {(15<<2)|3,{99,111,115}}, +/* 8657 */ {(15<<2)|3,{99,111,115}}, +/* 8658 */ {(15<<2)|3,{99,111,116}}, +/* 8659 */ {(15<<2)|3,{99,111,116}}, +/* 8660 */ {(16<<2)|3,{99,111,32}}, +/* 8661 */ {(16<<2)|3,{99,111,37}}, +/* 8662 */ {(16<<2)|3,{99,111,45}}, +/* 8663 */ {(16<<2)|3,{99,111,46}}, +/* 8664 */ {(16<<2)|3,{99,111,47}}, +/* 8665 */ {(16<<2)|3,{99,111,51}}, +/* 8666 */ {(16<<2)|3,{99,111,52}}, +/* 8667 */ {(16<<2)|3,{99,111,53}}, +/* 8668 */ {(16<<2)|3,{99,111,54}}, +/* 8669 */ {(16<<2)|3,{99,111,55}}, +/* 8670 */ {(16<<2)|3,{99,111,56}}, +/* 8671 */ {(16<<2)|3,{99,111,57}}, +/* 8672 */ {(16<<2)|3,{99,111,61}}, +/* 8673 */ {(16<<2)|3,{99,111,65}}, +/* 8674 */ {(16<<2)|3,{99,111,95}}, +/* 8675 */ {(16<<2)|3,{99,111,98}}, +/* 8676 */ {(16<<2)|3,{99,111,100}}, +/* 8677 */ {(16<<2)|3,{99,111,102}}, +/* 8678 */ {(16<<2)|3,{99,111,103}}, +/* 8679 */ {(16<<2)|3,{99,111,104}}, +/* 8680 */ {(16<<2)|3,{99,111,108}}, +/* 8681 */ {(16<<2)|3,{99,111,109}}, +/* 8682 */ {(16<<2)|3,{99,111,110}}, +/* 8683 */ {(16<<2)|3,{99,111,112}}, +/* 8684 */ {(16<<2)|3,{99,111,114}}, +/* 8685 */ {(16<<2)|3,{99,111,117}}, +/* 8686 */ {(10<<2)|2,{99,111,0}}, +/* 8687 */ {(10<<2)|2,{99,111,0}}, +/* 8688 */ {(10<<2)|2,{99,111,0}}, +/* 8689 */ {(10<<2)|2,{99,111,0}}, +/* 8690 */ {(10<<2)|2,{99,111,0}}, +/* 8691 */ {(10<<2)|2,{99,111,0}}, +/* 8692 */ {(10<<2)|2,{99,111,0}}, +/* 8693 */ {(10<<2)|2,{99,111,0}}, +/* 8694 */ {(10<<2)|2,{99,111,0}}, +/* 8695 */ {(10<<2)|2,{99,111,0}}, +/* 8696 */ {(10<<2)|2,{99,111,0}}, +/* 8697 */ {(10<<2)|2,{99,111,0}}, +/* 8698 */ {(10<<2)|2,{99,111,0}}, +/* 8699 */ {(10<<2)|2,{99,111,0}}, +/* 8700 */ {(10<<2)|2,{99,111,0}}, +/* 8701 */ {(10<<2)|2,{99,111,0}}, +/* 8702 */ {(10<<2)|2,{99,111,0}}, +/* 8703 */ {(10<<2)|2,{99,111,0}}, +/* 8704 */ {(15<<2)|3,{99,115,48}}, +/* 8705 */ {(15<<2)|3,{99,115,48}}, +/* 8706 */ {(15<<2)|3,{99,115,49}}, +/* 8707 */ {(15<<2)|3,{99,115,49}}, +/* 8708 */ {(15<<2)|3,{99,115,50}}, +/* 8709 */ {(15<<2)|3,{99,115,50}}, +/* 8710 */ {(15<<2)|3,{99,115,97}}, +/* 8711 */ {(15<<2)|3,{99,115,97}}, +/* 8712 */ {(15<<2)|3,{99,115,99}}, +/* 8713 */ {(15<<2)|3,{99,115,99}}, +/* 8714 */ {(15<<2)|3,{99,115,101}}, +/* 8715 */ {(15<<2)|3,{99,115,101}}, +/* 8716 */ {(15<<2)|3,{99,115,105}}, +/* 8717 */ {(15<<2)|3,{99,115,105}}, +/* 8718 */ {(15<<2)|3,{99,115,111}}, +/* 8719 */ {(15<<2)|3,{99,115,111}}, +/* 8720 */ {(15<<2)|3,{99,115,115}}, +/* 8721 */ {(15<<2)|3,{99,115,115}}, +/* 8722 */ {(15<<2)|3,{99,115,116}}, +/* 8723 */ {(15<<2)|3,{99,115,116}}, +/* 8724 */ {(16<<2)|3,{99,115,32}}, +/* 8725 */ {(16<<2)|3,{99,115,37}}, +/* 8726 */ {(16<<2)|3,{99,115,45}}, +/* 8727 */ {(16<<2)|3,{99,115,46}}, +/* 8728 */ {(16<<2)|3,{99,115,47}}, +/* 8729 */ {(16<<2)|3,{99,115,51}}, +/* 8730 */ {(16<<2)|3,{99,115,52}}, +/* 8731 */ {(16<<2)|3,{99,115,53}}, +/* 8732 */ {(16<<2)|3,{99,115,54}}, +/* 8733 */ {(16<<2)|3,{99,115,55}}, +/* 8734 */ {(16<<2)|3,{99,115,56}}, +/* 8735 */ {(16<<2)|3,{99,115,57}}, +/* 8736 */ {(16<<2)|3,{99,115,61}}, +/* 8737 */ {(16<<2)|3,{99,115,65}}, +/* 8738 */ {(16<<2)|3,{99,115,95}}, +/* 8739 */ {(16<<2)|3,{99,115,98}}, +/* 8740 */ {(16<<2)|3,{99,115,100}}, +/* 8741 */ {(16<<2)|3,{99,115,102}}, +/* 8742 */ {(16<<2)|3,{99,115,103}}, +/* 8743 */ {(16<<2)|3,{99,115,104}}, +/* 8744 */ {(16<<2)|3,{99,115,108}}, +/* 8745 */ {(16<<2)|3,{99,115,109}}, +/* 8746 */ {(16<<2)|3,{99,115,110}}, +/* 8747 */ {(16<<2)|3,{99,115,112}}, +/* 8748 */ {(16<<2)|3,{99,115,114}}, +/* 8749 */ {(16<<2)|3,{99,115,117}}, +/* 8750 */ {(10<<2)|2,{99,115,0}}, +/* 8751 */ {(10<<2)|2,{99,115,0}}, +/* 8752 */ {(10<<2)|2,{99,115,0}}, +/* 8753 */ {(10<<2)|2,{99,115,0}}, +/* 8754 */ {(10<<2)|2,{99,115,0}}, +/* 8755 */ {(10<<2)|2,{99,115,0}}, +/* 8756 */ {(10<<2)|2,{99,115,0}}, +/* 8757 */ {(10<<2)|2,{99,115,0}}, +/* 8758 */ {(10<<2)|2,{99,115,0}}, +/* 8759 */ {(10<<2)|2,{99,115,0}}, +/* 8760 */ {(10<<2)|2,{99,115,0}}, +/* 8761 */ {(10<<2)|2,{99,115,0}}, +/* 8762 */ {(10<<2)|2,{99,115,0}}, +/* 8763 */ {(10<<2)|2,{99,115,0}}, +/* 8764 */ {(10<<2)|2,{99,115,0}}, +/* 8765 */ {(10<<2)|2,{99,115,0}}, +/* 8766 */ {(10<<2)|2,{99,115,0}}, +/* 8767 */ {(10<<2)|2,{99,115,0}}, +/* 8768 */ {(15<<2)|3,{99,116,48}}, +/* 8769 */ {(15<<2)|3,{99,116,48}}, +/* 8770 */ {(15<<2)|3,{99,116,49}}, +/* 8771 */ {(15<<2)|3,{99,116,49}}, +/* 8772 */ {(15<<2)|3,{99,116,50}}, +/* 8773 */ {(15<<2)|3,{99,116,50}}, +/* 8774 */ {(15<<2)|3,{99,116,97}}, +/* 8775 */ {(15<<2)|3,{99,116,97}}, +/* 8776 */ {(15<<2)|3,{99,116,99}}, +/* 8777 */ {(15<<2)|3,{99,116,99}}, +/* 8778 */ {(15<<2)|3,{99,116,101}}, +/* 8779 */ {(15<<2)|3,{99,116,101}}, +/* 8780 */ {(15<<2)|3,{99,116,105}}, +/* 8781 */ {(15<<2)|3,{99,116,105}}, +/* 8782 */ {(15<<2)|3,{99,116,111}}, +/* 8783 */ {(15<<2)|3,{99,116,111}}, +/* 8784 */ {(15<<2)|3,{99,116,115}}, +/* 8785 */ {(15<<2)|3,{99,116,115}}, +/* 8786 */ {(15<<2)|3,{99,116,116}}, +/* 8787 */ {(15<<2)|3,{99,116,116}}, +/* 8788 */ {(16<<2)|3,{99,116,32}}, +/* 8789 */ {(16<<2)|3,{99,116,37}}, +/* 8790 */ {(16<<2)|3,{99,116,45}}, +/* 8791 */ {(16<<2)|3,{99,116,46}}, +/* 8792 */ {(16<<2)|3,{99,116,47}}, +/* 8793 */ {(16<<2)|3,{99,116,51}}, +/* 8794 */ {(16<<2)|3,{99,116,52}}, +/* 8795 */ {(16<<2)|3,{99,116,53}}, +/* 8796 */ {(16<<2)|3,{99,116,54}}, +/* 8797 */ {(16<<2)|3,{99,116,55}}, +/* 8798 */ {(16<<2)|3,{99,116,56}}, +/* 8799 */ {(16<<2)|3,{99,116,57}}, +/* 8800 */ {(16<<2)|3,{99,116,61}}, +/* 8801 */ {(16<<2)|3,{99,116,65}}, +/* 8802 */ {(16<<2)|3,{99,116,95}}, +/* 8803 */ {(16<<2)|3,{99,116,98}}, +/* 8804 */ {(16<<2)|3,{99,116,100}}, +/* 8805 */ {(16<<2)|3,{99,116,102}}, +/* 8806 */ {(16<<2)|3,{99,116,103}}, +/* 8807 */ {(16<<2)|3,{99,116,104}}, +/* 8808 */ {(16<<2)|3,{99,116,108}}, +/* 8809 */ {(16<<2)|3,{99,116,109}}, +/* 8810 */ {(16<<2)|3,{99,116,110}}, +/* 8811 */ {(16<<2)|3,{99,116,112}}, +/* 8812 */ {(16<<2)|3,{99,116,114}}, +/* 8813 */ {(16<<2)|3,{99,116,117}}, +/* 8814 */ {(10<<2)|2,{99,116,0}}, +/* 8815 */ {(10<<2)|2,{99,116,0}}, +/* 8816 */ {(10<<2)|2,{99,116,0}}, +/* 8817 */ {(10<<2)|2,{99,116,0}}, +/* 8818 */ {(10<<2)|2,{99,116,0}}, +/* 8819 */ {(10<<2)|2,{99,116,0}}, +/* 8820 */ {(10<<2)|2,{99,116,0}}, +/* 8821 */ {(10<<2)|2,{99,116,0}}, +/* 8822 */ {(10<<2)|2,{99,116,0}}, +/* 8823 */ {(10<<2)|2,{99,116,0}}, +/* 8824 */ {(10<<2)|2,{99,116,0}}, +/* 8825 */ {(10<<2)|2,{99,116,0}}, +/* 8826 */ {(10<<2)|2,{99,116,0}}, +/* 8827 */ {(10<<2)|2,{99,116,0}}, +/* 8828 */ {(10<<2)|2,{99,116,0}}, +/* 8829 */ {(10<<2)|2,{99,116,0}}, +/* 8830 */ {(10<<2)|2,{99,116,0}}, +/* 8831 */ {(10<<2)|2,{99,116,0}}, +/* 8832 */ {(16<<2)|3,{99,32,48}}, +/* 8833 */ {(16<<2)|3,{99,32,49}}, +/* 8834 */ {(16<<2)|3,{99,32,50}}, +/* 8835 */ {(16<<2)|3,{99,32,97}}, +/* 8836 */ {(16<<2)|3,{99,32,99}}, +/* 8837 */ {(16<<2)|3,{99,32,101}}, +/* 8838 */ {(16<<2)|3,{99,32,105}}, +/* 8839 */ {(16<<2)|3,{99,32,111}}, +/* 8840 */ {(16<<2)|3,{99,32,115}}, +/* 8841 */ {(16<<2)|3,{99,32,116}}, +/* 8842 */ {(11<<2)|2,{99,32,0}}, +/* 8843 */ {(11<<2)|2,{99,32,0}}, +/* 8844 */ {(11<<2)|2,{99,32,0}}, +/* 8845 */ {(11<<2)|2,{99,32,0}}, +/* 8846 */ {(11<<2)|2,{99,32,0}}, +/* 8847 */ {(11<<2)|2,{99,32,0}}, +/* 8848 */ {(11<<2)|2,{99,32,0}}, +/* 8849 */ {(11<<2)|2,{99,32,0}}, +/* 8850 */ {(11<<2)|2,{99,32,0}}, +/* 8851 */ {(11<<2)|2,{99,32,0}}, +/* 8852 */ {(11<<2)|2,{99,32,0}}, +/* 8853 */ {(11<<2)|2,{99,32,0}}, +/* 8854 */ {(11<<2)|2,{99,32,0}}, +/* 8855 */ {(11<<2)|2,{99,32,0}}, +/* 8856 */ {(11<<2)|2,{99,32,0}}, +/* 8857 */ {(11<<2)|2,{99,32,0}}, +/* 8858 */ {(11<<2)|2,{99,32,0}}, +/* 8859 */ {(11<<2)|2,{99,32,0}}, +/* 8860 */ {(11<<2)|2,{99,32,0}}, +/* 8861 */ {(11<<2)|2,{99,32,0}}, +/* 8862 */ {(11<<2)|2,{99,32,0}}, +/* 8863 */ {(11<<2)|2,{99,32,0}}, +/* 8864 */ {(16<<2)|3,{99,37,48}}, +/* 8865 */ {(16<<2)|3,{99,37,49}}, +/* 8866 */ {(16<<2)|3,{99,37,50}}, +/* 8867 */ {(16<<2)|3,{99,37,97}}, +/* 8868 */ {(16<<2)|3,{99,37,99}}, +/* 8869 */ {(16<<2)|3,{99,37,101}}, +/* 8870 */ {(16<<2)|3,{99,37,105}}, +/* 8871 */ {(16<<2)|3,{99,37,111}}, +/* 8872 */ {(16<<2)|3,{99,37,115}}, +/* 8873 */ {(16<<2)|3,{99,37,116}}, +/* 8874 */ {(11<<2)|2,{99,37,0}}, +/* 8875 */ {(11<<2)|2,{99,37,0}}, +/* 8876 */ {(11<<2)|2,{99,37,0}}, +/* 8877 */ {(11<<2)|2,{99,37,0}}, +/* 8878 */ {(11<<2)|2,{99,37,0}}, +/* 8879 */ {(11<<2)|2,{99,37,0}}, +/* 8880 */ {(11<<2)|2,{99,37,0}}, +/* 8881 */ {(11<<2)|2,{99,37,0}}, +/* 8882 */ {(11<<2)|2,{99,37,0}}, +/* 8883 */ {(11<<2)|2,{99,37,0}}, +/* 8884 */ {(11<<2)|2,{99,37,0}}, +/* 8885 */ {(11<<2)|2,{99,37,0}}, +/* 8886 */ {(11<<2)|2,{99,37,0}}, +/* 8887 */ {(11<<2)|2,{99,37,0}}, +/* 8888 */ {(11<<2)|2,{99,37,0}}, +/* 8889 */ {(11<<2)|2,{99,37,0}}, +/* 8890 */ {(11<<2)|2,{99,37,0}}, +/* 8891 */ {(11<<2)|2,{99,37,0}}, +/* 8892 */ {(11<<2)|2,{99,37,0}}, +/* 8893 */ {(11<<2)|2,{99,37,0}}, +/* 8894 */ {(11<<2)|2,{99,37,0}}, +/* 8895 */ {(11<<2)|2,{99,37,0}}, +/* 8896 */ {(16<<2)|3,{99,45,48}}, +/* 8897 */ {(16<<2)|3,{99,45,49}}, +/* 8898 */ {(16<<2)|3,{99,45,50}}, +/* 8899 */ {(16<<2)|3,{99,45,97}}, +/* 8900 */ {(16<<2)|3,{99,45,99}}, +/* 8901 */ {(16<<2)|3,{99,45,101}}, +/* 8902 */ {(16<<2)|3,{99,45,105}}, +/* 8903 */ {(16<<2)|3,{99,45,111}}, +/* 8904 */ {(16<<2)|3,{99,45,115}}, +/* 8905 */ {(16<<2)|3,{99,45,116}}, +/* 8906 */ {(11<<2)|2,{99,45,0}}, +/* 8907 */ {(11<<2)|2,{99,45,0}}, +/* 8908 */ {(11<<2)|2,{99,45,0}}, +/* 8909 */ {(11<<2)|2,{99,45,0}}, +/* 8910 */ {(11<<2)|2,{99,45,0}}, +/* 8911 */ {(11<<2)|2,{99,45,0}}, +/* 8912 */ {(11<<2)|2,{99,45,0}}, +/* 8913 */ {(11<<2)|2,{99,45,0}}, +/* 8914 */ {(11<<2)|2,{99,45,0}}, +/* 8915 */ {(11<<2)|2,{99,45,0}}, +/* 8916 */ {(11<<2)|2,{99,45,0}}, +/* 8917 */ {(11<<2)|2,{99,45,0}}, +/* 8918 */ {(11<<2)|2,{99,45,0}}, +/* 8919 */ {(11<<2)|2,{99,45,0}}, +/* 8920 */ {(11<<2)|2,{99,45,0}}, +/* 8921 */ {(11<<2)|2,{99,45,0}}, +/* 8922 */ {(11<<2)|2,{99,45,0}}, +/* 8923 */ {(11<<2)|2,{99,45,0}}, +/* 8924 */ {(11<<2)|2,{99,45,0}}, +/* 8925 */ {(11<<2)|2,{99,45,0}}, +/* 8926 */ {(11<<2)|2,{99,45,0}}, +/* 8927 */ {(11<<2)|2,{99,45,0}}, +/* 8928 */ {(16<<2)|3,{99,46,48}}, +/* 8929 */ {(16<<2)|3,{99,46,49}}, +/* 8930 */ {(16<<2)|3,{99,46,50}}, +/* 8931 */ {(16<<2)|3,{99,46,97}}, +/* 8932 */ {(16<<2)|3,{99,46,99}}, +/* 8933 */ {(16<<2)|3,{99,46,101}}, +/* 8934 */ {(16<<2)|3,{99,46,105}}, +/* 8935 */ {(16<<2)|3,{99,46,111}}, +/* 8936 */ {(16<<2)|3,{99,46,115}}, +/* 8937 */ {(16<<2)|3,{99,46,116}}, +/* 8938 */ {(11<<2)|2,{99,46,0}}, +/* 8939 */ {(11<<2)|2,{99,46,0}}, +/* 8940 */ {(11<<2)|2,{99,46,0}}, +/* 8941 */ {(11<<2)|2,{99,46,0}}, +/* 8942 */ {(11<<2)|2,{99,46,0}}, +/* 8943 */ {(11<<2)|2,{99,46,0}}, +/* 8944 */ {(11<<2)|2,{99,46,0}}, +/* 8945 */ {(11<<2)|2,{99,46,0}}, +/* 8946 */ {(11<<2)|2,{99,46,0}}, +/* 8947 */ {(11<<2)|2,{99,46,0}}, +/* 8948 */ {(11<<2)|2,{99,46,0}}, +/* 8949 */ {(11<<2)|2,{99,46,0}}, +/* 8950 */ {(11<<2)|2,{99,46,0}}, +/* 8951 */ {(11<<2)|2,{99,46,0}}, +/* 8952 */ {(11<<2)|2,{99,46,0}}, +/* 8953 */ {(11<<2)|2,{99,46,0}}, +/* 8954 */ {(11<<2)|2,{99,46,0}}, +/* 8955 */ {(11<<2)|2,{99,46,0}}, +/* 8956 */ {(11<<2)|2,{99,46,0}}, +/* 8957 */ {(11<<2)|2,{99,46,0}}, +/* 8958 */ {(11<<2)|2,{99,46,0}}, +/* 8959 */ {(11<<2)|2,{99,46,0}}, +/* 8960 */ {(16<<2)|3,{99,47,48}}, +/* 8961 */ {(16<<2)|3,{99,47,49}}, +/* 8962 */ {(16<<2)|3,{99,47,50}}, +/* 8963 */ {(16<<2)|3,{99,47,97}}, +/* 8964 */ {(16<<2)|3,{99,47,99}}, +/* 8965 */ {(16<<2)|3,{99,47,101}}, +/* 8966 */ {(16<<2)|3,{99,47,105}}, +/* 8967 */ {(16<<2)|3,{99,47,111}}, +/* 8968 */ {(16<<2)|3,{99,47,115}}, +/* 8969 */ {(16<<2)|3,{99,47,116}}, +/* 8970 */ {(11<<2)|2,{99,47,0}}, +/* 8971 */ {(11<<2)|2,{99,47,0}}, +/* 8972 */ {(11<<2)|2,{99,47,0}}, +/* 8973 */ {(11<<2)|2,{99,47,0}}, +/* 8974 */ {(11<<2)|2,{99,47,0}}, +/* 8975 */ {(11<<2)|2,{99,47,0}}, +/* 8976 */ {(11<<2)|2,{99,47,0}}, +/* 8977 */ {(11<<2)|2,{99,47,0}}, +/* 8978 */ {(11<<2)|2,{99,47,0}}, +/* 8979 */ {(11<<2)|2,{99,47,0}}, +/* 8980 */ {(11<<2)|2,{99,47,0}}, +/* 8981 */ {(11<<2)|2,{99,47,0}}, +/* 8982 */ {(11<<2)|2,{99,47,0}}, +/* 8983 */ {(11<<2)|2,{99,47,0}}, +/* 8984 */ {(11<<2)|2,{99,47,0}}, +/* 8985 */ {(11<<2)|2,{99,47,0}}, +/* 8986 */ {(11<<2)|2,{99,47,0}}, +/* 8987 */ {(11<<2)|2,{99,47,0}}, +/* 8988 */ {(11<<2)|2,{99,47,0}}, +/* 8989 */ {(11<<2)|2,{99,47,0}}, +/* 8990 */ {(11<<2)|2,{99,47,0}}, +/* 8991 */ {(11<<2)|2,{99,47,0}}, +/* 8992 */ {(16<<2)|3,{99,51,48}}, +/* 8993 */ {(16<<2)|3,{99,51,49}}, +/* 8994 */ {(16<<2)|3,{99,51,50}}, +/* 8995 */ {(16<<2)|3,{99,51,97}}, +/* 8996 */ {(16<<2)|3,{99,51,99}}, +/* 8997 */ {(16<<2)|3,{99,51,101}}, +/* 8998 */ {(16<<2)|3,{99,51,105}}, +/* 8999 */ {(16<<2)|3,{99,51,111}}, +/* 9000 */ {(16<<2)|3,{99,51,115}}, +/* 9001 */ {(16<<2)|3,{99,51,116}}, +/* 9002 */ {(11<<2)|2,{99,51,0}}, +/* 9003 */ {(11<<2)|2,{99,51,0}}, +/* 9004 */ {(11<<2)|2,{99,51,0}}, +/* 9005 */ {(11<<2)|2,{99,51,0}}, +/* 9006 */ {(11<<2)|2,{99,51,0}}, +/* 9007 */ {(11<<2)|2,{99,51,0}}, +/* 9008 */ {(11<<2)|2,{99,51,0}}, +/* 9009 */ {(11<<2)|2,{99,51,0}}, +/* 9010 */ {(11<<2)|2,{99,51,0}}, +/* 9011 */ {(11<<2)|2,{99,51,0}}, +/* 9012 */ {(11<<2)|2,{99,51,0}}, +/* 9013 */ {(11<<2)|2,{99,51,0}}, +/* 9014 */ {(11<<2)|2,{99,51,0}}, +/* 9015 */ {(11<<2)|2,{99,51,0}}, +/* 9016 */ {(11<<2)|2,{99,51,0}}, +/* 9017 */ {(11<<2)|2,{99,51,0}}, +/* 9018 */ {(11<<2)|2,{99,51,0}}, +/* 9019 */ {(11<<2)|2,{99,51,0}}, +/* 9020 */ {(11<<2)|2,{99,51,0}}, +/* 9021 */ {(11<<2)|2,{99,51,0}}, +/* 9022 */ {(11<<2)|2,{99,51,0}}, +/* 9023 */ {(11<<2)|2,{99,51,0}}, +/* 9024 */ {(16<<2)|3,{99,52,48}}, +/* 9025 */ {(16<<2)|3,{99,52,49}}, +/* 9026 */ {(16<<2)|3,{99,52,50}}, +/* 9027 */ {(16<<2)|3,{99,52,97}}, +/* 9028 */ {(16<<2)|3,{99,52,99}}, +/* 9029 */ {(16<<2)|3,{99,52,101}}, +/* 9030 */ {(16<<2)|3,{99,52,105}}, +/* 9031 */ {(16<<2)|3,{99,52,111}}, +/* 9032 */ {(16<<2)|3,{99,52,115}}, +/* 9033 */ {(16<<2)|3,{99,52,116}}, +/* 9034 */ {(11<<2)|2,{99,52,0}}, +/* 9035 */ {(11<<2)|2,{99,52,0}}, +/* 9036 */ {(11<<2)|2,{99,52,0}}, +/* 9037 */ {(11<<2)|2,{99,52,0}}, +/* 9038 */ {(11<<2)|2,{99,52,0}}, +/* 9039 */ {(11<<2)|2,{99,52,0}}, +/* 9040 */ {(11<<2)|2,{99,52,0}}, +/* 9041 */ {(11<<2)|2,{99,52,0}}, +/* 9042 */ {(11<<2)|2,{99,52,0}}, +/* 9043 */ {(11<<2)|2,{99,52,0}}, +/* 9044 */ {(11<<2)|2,{99,52,0}}, +/* 9045 */ {(11<<2)|2,{99,52,0}}, +/* 9046 */ {(11<<2)|2,{99,52,0}}, +/* 9047 */ {(11<<2)|2,{99,52,0}}, +/* 9048 */ {(11<<2)|2,{99,52,0}}, +/* 9049 */ {(11<<2)|2,{99,52,0}}, +/* 9050 */ {(11<<2)|2,{99,52,0}}, +/* 9051 */ {(11<<2)|2,{99,52,0}}, +/* 9052 */ {(11<<2)|2,{99,52,0}}, +/* 9053 */ {(11<<2)|2,{99,52,0}}, +/* 9054 */ {(11<<2)|2,{99,52,0}}, +/* 9055 */ {(11<<2)|2,{99,52,0}}, +/* 9056 */ {(16<<2)|3,{99,53,48}}, +/* 9057 */ {(16<<2)|3,{99,53,49}}, +/* 9058 */ {(16<<2)|3,{99,53,50}}, +/* 9059 */ {(16<<2)|3,{99,53,97}}, +/* 9060 */ {(16<<2)|3,{99,53,99}}, +/* 9061 */ {(16<<2)|3,{99,53,101}}, +/* 9062 */ {(16<<2)|3,{99,53,105}}, +/* 9063 */ {(16<<2)|3,{99,53,111}}, +/* 9064 */ {(16<<2)|3,{99,53,115}}, +/* 9065 */ {(16<<2)|3,{99,53,116}}, +/* 9066 */ {(11<<2)|2,{99,53,0}}, +/* 9067 */ {(11<<2)|2,{99,53,0}}, +/* 9068 */ {(11<<2)|2,{99,53,0}}, +/* 9069 */ {(11<<2)|2,{99,53,0}}, +/* 9070 */ {(11<<2)|2,{99,53,0}}, +/* 9071 */ {(11<<2)|2,{99,53,0}}, +/* 9072 */ {(11<<2)|2,{99,53,0}}, +/* 9073 */ {(11<<2)|2,{99,53,0}}, +/* 9074 */ {(11<<2)|2,{99,53,0}}, +/* 9075 */ {(11<<2)|2,{99,53,0}}, +/* 9076 */ {(11<<2)|2,{99,53,0}}, +/* 9077 */ {(11<<2)|2,{99,53,0}}, +/* 9078 */ {(11<<2)|2,{99,53,0}}, +/* 9079 */ {(11<<2)|2,{99,53,0}}, +/* 9080 */ {(11<<2)|2,{99,53,0}}, +/* 9081 */ {(11<<2)|2,{99,53,0}}, +/* 9082 */ {(11<<2)|2,{99,53,0}}, +/* 9083 */ {(11<<2)|2,{99,53,0}}, +/* 9084 */ {(11<<2)|2,{99,53,0}}, +/* 9085 */ {(11<<2)|2,{99,53,0}}, +/* 9086 */ {(11<<2)|2,{99,53,0}}, +/* 9087 */ {(11<<2)|2,{99,53,0}}, +/* 9088 */ {(16<<2)|3,{99,54,48}}, +/* 9089 */ {(16<<2)|3,{99,54,49}}, +/* 9090 */ {(16<<2)|3,{99,54,50}}, +/* 9091 */ {(16<<2)|3,{99,54,97}}, +/* 9092 */ {(16<<2)|3,{99,54,99}}, +/* 9093 */ {(16<<2)|3,{99,54,101}}, +/* 9094 */ {(16<<2)|3,{99,54,105}}, +/* 9095 */ {(16<<2)|3,{99,54,111}}, +/* 9096 */ {(16<<2)|3,{99,54,115}}, +/* 9097 */ {(16<<2)|3,{99,54,116}}, +/* 9098 */ {(11<<2)|2,{99,54,0}}, +/* 9099 */ {(11<<2)|2,{99,54,0}}, +/* 9100 */ {(11<<2)|2,{99,54,0}}, +/* 9101 */ {(11<<2)|2,{99,54,0}}, +/* 9102 */ {(11<<2)|2,{99,54,0}}, +/* 9103 */ {(11<<2)|2,{99,54,0}}, +/* 9104 */ {(11<<2)|2,{99,54,0}}, +/* 9105 */ {(11<<2)|2,{99,54,0}}, +/* 9106 */ {(11<<2)|2,{99,54,0}}, +/* 9107 */ {(11<<2)|2,{99,54,0}}, +/* 9108 */ {(11<<2)|2,{99,54,0}}, +/* 9109 */ {(11<<2)|2,{99,54,0}}, +/* 9110 */ {(11<<2)|2,{99,54,0}}, +/* 9111 */ {(11<<2)|2,{99,54,0}}, +/* 9112 */ {(11<<2)|2,{99,54,0}}, +/* 9113 */ {(11<<2)|2,{99,54,0}}, +/* 9114 */ {(11<<2)|2,{99,54,0}}, +/* 9115 */ {(11<<2)|2,{99,54,0}}, +/* 9116 */ {(11<<2)|2,{99,54,0}}, +/* 9117 */ {(11<<2)|2,{99,54,0}}, +/* 9118 */ {(11<<2)|2,{99,54,0}}, +/* 9119 */ {(11<<2)|2,{99,54,0}}, +/* 9120 */ {(16<<2)|3,{99,55,48}}, +/* 9121 */ {(16<<2)|3,{99,55,49}}, +/* 9122 */ {(16<<2)|3,{99,55,50}}, +/* 9123 */ {(16<<2)|3,{99,55,97}}, +/* 9124 */ {(16<<2)|3,{99,55,99}}, +/* 9125 */ {(16<<2)|3,{99,55,101}}, +/* 9126 */ {(16<<2)|3,{99,55,105}}, +/* 9127 */ {(16<<2)|3,{99,55,111}}, +/* 9128 */ {(16<<2)|3,{99,55,115}}, +/* 9129 */ {(16<<2)|3,{99,55,116}}, +/* 9130 */ {(11<<2)|2,{99,55,0}}, +/* 9131 */ {(11<<2)|2,{99,55,0}}, +/* 9132 */ {(11<<2)|2,{99,55,0}}, +/* 9133 */ {(11<<2)|2,{99,55,0}}, +/* 9134 */ {(11<<2)|2,{99,55,0}}, +/* 9135 */ {(11<<2)|2,{99,55,0}}, +/* 9136 */ {(11<<2)|2,{99,55,0}}, +/* 9137 */ {(11<<2)|2,{99,55,0}}, +/* 9138 */ {(11<<2)|2,{99,55,0}}, +/* 9139 */ {(11<<2)|2,{99,55,0}}, +/* 9140 */ {(11<<2)|2,{99,55,0}}, +/* 9141 */ {(11<<2)|2,{99,55,0}}, +/* 9142 */ {(11<<2)|2,{99,55,0}}, +/* 9143 */ {(11<<2)|2,{99,55,0}}, +/* 9144 */ {(11<<2)|2,{99,55,0}}, +/* 9145 */ {(11<<2)|2,{99,55,0}}, +/* 9146 */ {(11<<2)|2,{99,55,0}}, +/* 9147 */ {(11<<2)|2,{99,55,0}}, +/* 9148 */ {(11<<2)|2,{99,55,0}}, +/* 9149 */ {(11<<2)|2,{99,55,0}}, +/* 9150 */ {(11<<2)|2,{99,55,0}}, +/* 9151 */ {(11<<2)|2,{99,55,0}}, +/* 9152 */ {(16<<2)|3,{99,56,48}}, +/* 9153 */ {(16<<2)|3,{99,56,49}}, +/* 9154 */ {(16<<2)|3,{99,56,50}}, +/* 9155 */ {(16<<2)|3,{99,56,97}}, +/* 9156 */ {(16<<2)|3,{99,56,99}}, +/* 9157 */ {(16<<2)|3,{99,56,101}}, +/* 9158 */ {(16<<2)|3,{99,56,105}}, +/* 9159 */ {(16<<2)|3,{99,56,111}}, +/* 9160 */ {(16<<2)|3,{99,56,115}}, +/* 9161 */ {(16<<2)|3,{99,56,116}}, +/* 9162 */ {(11<<2)|2,{99,56,0}}, +/* 9163 */ {(11<<2)|2,{99,56,0}}, +/* 9164 */ {(11<<2)|2,{99,56,0}}, +/* 9165 */ {(11<<2)|2,{99,56,0}}, +/* 9166 */ {(11<<2)|2,{99,56,0}}, +/* 9167 */ {(11<<2)|2,{99,56,0}}, +/* 9168 */ {(11<<2)|2,{99,56,0}}, +/* 9169 */ {(11<<2)|2,{99,56,0}}, +/* 9170 */ {(11<<2)|2,{99,56,0}}, +/* 9171 */ {(11<<2)|2,{99,56,0}}, +/* 9172 */ {(11<<2)|2,{99,56,0}}, +/* 9173 */ {(11<<2)|2,{99,56,0}}, +/* 9174 */ {(11<<2)|2,{99,56,0}}, +/* 9175 */ {(11<<2)|2,{99,56,0}}, +/* 9176 */ {(11<<2)|2,{99,56,0}}, +/* 9177 */ {(11<<2)|2,{99,56,0}}, +/* 9178 */ {(11<<2)|2,{99,56,0}}, +/* 9179 */ {(11<<2)|2,{99,56,0}}, +/* 9180 */ {(11<<2)|2,{99,56,0}}, +/* 9181 */ {(11<<2)|2,{99,56,0}}, +/* 9182 */ {(11<<2)|2,{99,56,0}}, +/* 9183 */ {(11<<2)|2,{99,56,0}}, +/* 9184 */ {(16<<2)|3,{99,57,48}}, +/* 9185 */ {(16<<2)|3,{99,57,49}}, +/* 9186 */ {(16<<2)|3,{99,57,50}}, +/* 9187 */ {(16<<2)|3,{99,57,97}}, +/* 9188 */ {(16<<2)|3,{99,57,99}}, +/* 9189 */ {(16<<2)|3,{99,57,101}}, +/* 9190 */ {(16<<2)|3,{99,57,105}}, +/* 9191 */ {(16<<2)|3,{99,57,111}}, +/* 9192 */ {(16<<2)|3,{99,57,115}}, +/* 9193 */ {(16<<2)|3,{99,57,116}}, +/* 9194 */ {(11<<2)|2,{99,57,0}}, +/* 9195 */ {(11<<2)|2,{99,57,0}}, +/* 9196 */ {(11<<2)|2,{99,57,0}}, +/* 9197 */ {(11<<2)|2,{99,57,0}}, +/* 9198 */ {(11<<2)|2,{99,57,0}}, +/* 9199 */ {(11<<2)|2,{99,57,0}}, +/* 9200 */ {(11<<2)|2,{99,57,0}}, +/* 9201 */ {(11<<2)|2,{99,57,0}}, +/* 9202 */ {(11<<2)|2,{99,57,0}}, +/* 9203 */ {(11<<2)|2,{99,57,0}}, +/* 9204 */ {(11<<2)|2,{99,57,0}}, +/* 9205 */ {(11<<2)|2,{99,57,0}}, +/* 9206 */ {(11<<2)|2,{99,57,0}}, +/* 9207 */ {(11<<2)|2,{99,57,0}}, +/* 9208 */ {(11<<2)|2,{99,57,0}}, +/* 9209 */ {(11<<2)|2,{99,57,0}}, +/* 9210 */ {(11<<2)|2,{99,57,0}}, +/* 9211 */ {(11<<2)|2,{99,57,0}}, +/* 9212 */ {(11<<2)|2,{99,57,0}}, +/* 9213 */ {(11<<2)|2,{99,57,0}}, +/* 9214 */ {(11<<2)|2,{99,57,0}}, +/* 9215 */ {(11<<2)|2,{99,57,0}}, +/* 9216 */ {(16<<2)|3,{99,61,48}}, +/* 9217 */ {(16<<2)|3,{99,61,49}}, +/* 9218 */ {(16<<2)|3,{99,61,50}}, +/* 9219 */ {(16<<2)|3,{99,61,97}}, +/* 9220 */ {(16<<2)|3,{99,61,99}}, +/* 9221 */ {(16<<2)|3,{99,61,101}}, +/* 9222 */ {(16<<2)|3,{99,61,105}}, +/* 9223 */ {(16<<2)|3,{99,61,111}}, +/* 9224 */ {(16<<2)|3,{99,61,115}}, +/* 9225 */ {(16<<2)|3,{99,61,116}}, +/* 9226 */ {(11<<2)|2,{99,61,0}}, +/* 9227 */ {(11<<2)|2,{99,61,0}}, +/* 9228 */ {(11<<2)|2,{99,61,0}}, +/* 9229 */ {(11<<2)|2,{99,61,0}}, +/* 9230 */ {(11<<2)|2,{99,61,0}}, +/* 9231 */ {(11<<2)|2,{99,61,0}}, +/* 9232 */ {(11<<2)|2,{99,61,0}}, +/* 9233 */ {(11<<2)|2,{99,61,0}}, +/* 9234 */ {(11<<2)|2,{99,61,0}}, +/* 9235 */ {(11<<2)|2,{99,61,0}}, +/* 9236 */ {(11<<2)|2,{99,61,0}}, +/* 9237 */ {(11<<2)|2,{99,61,0}}, +/* 9238 */ {(11<<2)|2,{99,61,0}}, +/* 9239 */ {(11<<2)|2,{99,61,0}}, +/* 9240 */ {(11<<2)|2,{99,61,0}}, +/* 9241 */ {(11<<2)|2,{99,61,0}}, +/* 9242 */ {(11<<2)|2,{99,61,0}}, +/* 9243 */ {(11<<2)|2,{99,61,0}}, +/* 9244 */ {(11<<2)|2,{99,61,0}}, +/* 9245 */ {(11<<2)|2,{99,61,0}}, +/* 9246 */ {(11<<2)|2,{99,61,0}}, +/* 9247 */ {(11<<2)|2,{99,61,0}}, +/* 9248 */ {(16<<2)|3,{99,65,48}}, +/* 9249 */ {(16<<2)|3,{99,65,49}}, +/* 9250 */ {(16<<2)|3,{99,65,50}}, +/* 9251 */ {(16<<2)|3,{99,65,97}}, +/* 9252 */ {(16<<2)|3,{99,65,99}}, +/* 9253 */ {(16<<2)|3,{99,65,101}}, +/* 9254 */ {(16<<2)|3,{99,65,105}}, +/* 9255 */ {(16<<2)|3,{99,65,111}}, +/* 9256 */ {(16<<2)|3,{99,65,115}}, +/* 9257 */ {(16<<2)|3,{99,65,116}}, +/* 9258 */ {(11<<2)|2,{99,65,0}}, +/* 9259 */ {(11<<2)|2,{99,65,0}}, +/* 9260 */ {(11<<2)|2,{99,65,0}}, +/* 9261 */ {(11<<2)|2,{99,65,0}}, +/* 9262 */ {(11<<2)|2,{99,65,0}}, +/* 9263 */ {(11<<2)|2,{99,65,0}}, +/* 9264 */ {(11<<2)|2,{99,65,0}}, +/* 9265 */ {(11<<2)|2,{99,65,0}}, +/* 9266 */ {(11<<2)|2,{99,65,0}}, +/* 9267 */ {(11<<2)|2,{99,65,0}}, +/* 9268 */ {(11<<2)|2,{99,65,0}}, +/* 9269 */ {(11<<2)|2,{99,65,0}}, +/* 9270 */ {(11<<2)|2,{99,65,0}}, +/* 9271 */ {(11<<2)|2,{99,65,0}}, +/* 9272 */ {(11<<2)|2,{99,65,0}}, +/* 9273 */ {(11<<2)|2,{99,65,0}}, +/* 9274 */ {(11<<2)|2,{99,65,0}}, +/* 9275 */ {(11<<2)|2,{99,65,0}}, +/* 9276 */ {(11<<2)|2,{99,65,0}}, +/* 9277 */ {(11<<2)|2,{99,65,0}}, +/* 9278 */ {(11<<2)|2,{99,65,0}}, +/* 9279 */ {(11<<2)|2,{99,65,0}}, +/* 9280 */ {(16<<2)|3,{99,95,48}}, +/* 9281 */ {(16<<2)|3,{99,95,49}}, +/* 9282 */ {(16<<2)|3,{99,95,50}}, +/* 9283 */ {(16<<2)|3,{99,95,97}}, +/* 9284 */ {(16<<2)|3,{99,95,99}}, +/* 9285 */ {(16<<2)|3,{99,95,101}}, +/* 9286 */ {(16<<2)|3,{99,95,105}}, +/* 9287 */ {(16<<2)|3,{99,95,111}}, +/* 9288 */ {(16<<2)|3,{99,95,115}}, +/* 9289 */ {(16<<2)|3,{99,95,116}}, +/* 9290 */ {(11<<2)|2,{99,95,0}}, +/* 9291 */ {(11<<2)|2,{99,95,0}}, +/* 9292 */ {(11<<2)|2,{99,95,0}}, +/* 9293 */ {(11<<2)|2,{99,95,0}}, +/* 9294 */ {(11<<2)|2,{99,95,0}}, +/* 9295 */ {(11<<2)|2,{99,95,0}}, +/* 9296 */ {(11<<2)|2,{99,95,0}}, +/* 9297 */ {(11<<2)|2,{99,95,0}}, +/* 9298 */ {(11<<2)|2,{99,95,0}}, +/* 9299 */ {(11<<2)|2,{99,95,0}}, +/* 9300 */ {(11<<2)|2,{99,95,0}}, +/* 9301 */ {(11<<2)|2,{99,95,0}}, +/* 9302 */ {(11<<2)|2,{99,95,0}}, +/* 9303 */ {(11<<2)|2,{99,95,0}}, +/* 9304 */ {(11<<2)|2,{99,95,0}}, +/* 9305 */ {(11<<2)|2,{99,95,0}}, +/* 9306 */ {(11<<2)|2,{99,95,0}}, +/* 9307 */ {(11<<2)|2,{99,95,0}}, +/* 9308 */ {(11<<2)|2,{99,95,0}}, +/* 9309 */ {(11<<2)|2,{99,95,0}}, +/* 9310 */ {(11<<2)|2,{99,95,0}}, +/* 9311 */ {(11<<2)|2,{99,95,0}}, +/* 9312 */ {(16<<2)|3,{99,98,48}}, +/* 9313 */ {(16<<2)|3,{99,98,49}}, +/* 9314 */ {(16<<2)|3,{99,98,50}}, +/* 9315 */ {(16<<2)|3,{99,98,97}}, +/* 9316 */ {(16<<2)|3,{99,98,99}}, +/* 9317 */ {(16<<2)|3,{99,98,101}}, +/* 9318 */ {(16<<2)|3,{99,98,105}}, +/* 9319 */ {(16<<2)|3,{99,98,111}}, +/* 9320 */ {(16<<2)|3,{99,98,115}}, +/* 9321 */ {(16<<2)|3,{99,98,116}}, +/* 9322 */ {(11<<2)|2,{99,98,0}}, +/* 9323 */ {(11<<2)|2,{99,98,0}}, +/* 9324 */ {(11<<2)|2,{99,98,0}}, +/* 9325 */ {(11<<2)|2,{99,98,0}}, +/* 9326 */ {(11<<2)|2,{99,98,0}}, +/* 9327 */ {(11<<2)|2,{99,98,0}}, +/* 9328 */ {(11<<2)|2,{99,98,0}}, +/* 9329 */ {(11<<2)|2,{99,98,0}}, +/* 9330 */ {(11<<2)|2,{99,98,0}}, +/* 9331 */ {(11<<2)|2,{99,98,0}}, +/* 9332 */ {(11<<2)|2,{99,98,0}}, +/* 9333 */ {(11<<2)|2,{99,98,0}}, +/* 9334 */ {(11<<2)|2,{99,98,0}}, +/* 9335 */ {(11<<2)|2,{99,98,0}}, +/* 9336 */ {(11<<2)|2,{99,98,0}}, +/* 9337 */ {(11<<2)|2,{99,98,0}}, +/* 9338 */ {(11<<2)|2,{99,98,0}}, +/* 9339 */ {(11<<2)|2,{99,98,0}}, +/* 9340 */ {(11<<2)|2,{99,98,0}}, +/* 9341 */ {(11<<2)|2,{99,98,0}}, +/* 9342 */ {(11<<2)|2,{99,98,0}}, +/* 9343 */ {(11<<2)|2,{99,98,0}}, +/* 9344 */ {(16<<2)|3,{99,100,48}}, +/* 9345 */ {(16<<2)|3,{99,100,49}}, +/* 9346 */ {(16<<2)|3,{99,100,50}}, +/* 9347 */ {(16<<2)|3,{99,100,97}}, +/* 9348 */ {(16<<2)|3,{99,100,99}}, +/* 9349 */ {(16<<2)|3,{99,100,101}}, +/* 9350 */ {(16<<2)|3,{99,100,105}}, +/* 9351 */ {(16<<2)|3,{99,100,111}}, +/* 9352 */ {(16<<2)|3,{99,100,115}}, +/* 9353 */ {(16<<2)|3,{99,100,116}}, +/* 9354 */ {(11<<2)|2,{99,100,0}}, +/* 9355 */ {(11<<2)|2,{99,100,0}}, +/* 9356 */ {(11<<2)|2,{99,100,0}}, +/* 9357 */ {(11<<2)|2,{99,100,0}}, +/* 9358 */ {(11<<2)|2,{99,100,0}}, +/* 9359 */ {(11<<2)|2,{99,100,0}}, +/* 9360 */ {(11<<2)|2,{99,100,0}}, +/* 9361 */ {(11<<2)|2,{99,100,0}}, +/* 9362 */ {(11<<2)|2,{99,100,0}}, +/* 9363 */ {(11<<2)|2,{99,100,0}}, +/* 9364 */ {(11<<2)|2,{99,100,0}}, +/* 9365 */ {(11<<2)|2,{99,100,0}}, +/* 9366 */ {(11<<2)|2,{99,100,0}}, +/* 9367 */ {(11<<2)|2,{99,100,0}}, +/* 9368 */ {(11<<2)|2,{99,100,0}}, +/* 9369 */ {(11<<2)|2,{99,100,0}}, +/* 9370 */ {(11<<2)|2,{99,100,0}}, +/* 9371 */ {(11<<2)|2,{99,100,0}}, +/* 9372 */ {(11<<2)|2,{99,100,0}}, +/* 9373 */ {(11<<2)|2,{99,100,0}}, +/* 9374 */ {(11<<2)|2,{99,100,0}}, +/* 9375 */ {(11<<2)|2,{99,100,0}}, +/* 9376 */ {(16<<2)|3,{99,102,48}}, +/* 9377 */ {(16<<2)|3,{99,102,49}}, +/* 9378 */ {(16<<2)|3,{99,102,50}}, +/* 9379 */ {(16<<2)|3,{99,102,97}}, +/* 9380 */ {(16<<2)|3,{99,102,99}}, +/* 9381 */ {(16<<2)|3,{99,102,101}}, +/* 9382 */ {(16<<2)|3,{99,102,105}}, +/* 9383 */ {(16<<2)|3,{99,102,111}}, +/* 9384 */ {(16<<2)|3,{99,102,115}}, +/* 9385 */ {(16<<2)|3,{99,102,116}}, +/* 9386 */ {(11<<2)|2,{99,102,0}}, +/* 9387 */ {(11<<2)|2,{99,102,0}}, +/* 9388 */ {(11<<2)|2,{99,102,0}}, +/* 9389 */ {(11<<2)|2,{99,102,0}}, +/* 9390 */ {(11<<2)|2,{99,102,0}}, +/* 9391 */ {(11<<2)|2,{99,102,0}}, +/* 9392 */ {(11<<2)|2,{99,102,0}}, +/* 9393 */ {(11<<2)|2,{99,102,0}}, +/* 9394 */ {(11<<2)|2,{99,102,0}}, +/* 9395 */ {(11<<2)|2,{99,102,0}}, +/* 9396 */ {(11<<2)|2,{99,102,0}}, +/* 9397 */ {(11<<2)|2,{99,102,0}}, +/* 9398 */ {(11<<2)|2,{99,102,0}}, +/* 9399 */ {(11<<2)|2,{99,102,0}}, +/* 9400 */ {(11<<2)|2,{99,102,0}}, +/* 9401 */ {(11<<2)|2,{99,102,0}}, +/* 9402 */ {(11<<2)|2,{99,102,0}}, +/* 9403 */ {(11<<2)|2,{99,102,0}}, +/* 9404 */ {(11<<2)|2,{99,102,0}}, +/* 9405 */ {(11<<2)|2,{99,102,0}}, +/* 9406 */ {(11<<2)|2,{99,102,0}}, +/* 9407 */ {(11<<2)|2,{99,102,0}}, +/* 9408 */ {(16<<2)|3,{99,103,48}}, +/* 9409 */ {(16<<2)|3,{99,103,49}}, +/* 9410 */ {(16<<2)|3,{99,103,50}}, +/* 9411 */ {(16<<2)|3,{99,103,97}}, +/* 9412 */ {(16<<2)|3,{99,103,99}}, +/* 9413 */ {(16<<2)|3,{99,103,101}}, +/* 9414 */ {(16<<2)|3,{99,103,105}}, +/* 9415 */ {(16<<2)|3,{99,103,111}}, +/* 9416 */ {(16<<2)|3,{99,103,115}}, +/* 9417 */ {(16<<2)|3,{99,103,116}}, +/* 9418 */ {(11<<2)|2,{99,103,0}}, +/* 9419 */ {(11<<2)|2,{99,103,0}}, +/* 9420 */ {(11<<2)|2,{99,103,0}}, +/* 9421 */ {(11<<2)|2,{99,103,0}}, +/* 9422 */ {(11<<2)|2,{99,103,0}}, +/* 9423 */ {(11<<2)|2,{99,103,0}}, +/* 9424 */ {(11<<2)|2,{99,103,0}}, +/* 9425 */ {(11<<2)|2,{99,103,0}}, +/* 9426 */ {(11<<2)|2,{99,103,0}}, +/* 9427 */ {(11<<2)|2,{99,103,0}}, +/* 9428 */ {(11<<2)|2,{99,103,0}}, +/* 9429 */ {(11<<2)|2,{99,103,0}}, +/* 9430 */ {(11<<2)|2,{99,103,0}}, +/* 9431 */ {(11<<2)|2,{99,103,0}}, +/* 9432 */ {(11<<2)|2,{99,103,0}}, +/* 9433 */ {(11<<2)|2,{99,103,0}}, +/* 9434 */ {(11<<2)|2,{99,103,0}}, +/* 9435 */ {(11<<2)|2,{99,103,0}}, +/* 9436 */ {(11<<2)|2,{99,103,0}}, +/* 9437 */ {(11<<2)|2,{99,103,0}}, +/* 9438 */ {(11<<2)|2,{99,103,0}}, +/* 9439 */ {(11<<2)|2,{99,103,0}}, +/* 9440 */ {(16<<2)|3,{99,104,48}}, +/* 9441 */ {(16<<2)|3,{99,104,49}}, +/* 9442 */ {(16<<2)|3,{99,104,50}}, +/* 9443 */ {(16<<2)|3,{99,104,97}}, +/* 9444 */ {(16<<2)|3,{99,104,99}}, +/* 9445 */ {(16<<2)|3,{99,104,101}}, +/* 9446 */ {(16<<2)|3,{99,104,105}}, +/* 9447 */ {(16<<2)|3,{99,104,111}}, +/* 9448 */ {(16<<2)|3,{99,104,115}}, +/* 9449 */ {(16<<2)|3,{99,104,116}}, +/* 9450 */ {(11<<2)|2,{99,104,0}}, +/* 9451 */ {(11<<2)|2,{99,104,0}}, +/* 9452 */ {(11<<2)|2,{99,104,0}}, +/* 9453 */ {(11<<2)|2,{99,104,0}}, +/* 9454 */ {(11<<2)|2,{99,104,0}}, +/* 9455 */ {(11<<2)|2,{99,104,0}}, +/* 9456 */ {(11<<2)|2,{99,104,0}}, +/* 9457 */ {(11<<2)|2,{99,104,0}}, +/* 9458 */ {(11<<2)|2,{99,104,0}}, +/* 9459 */ {(11<<2)|2,{99,104,0}}, +/* 9460 */ {(11<<2)|2,{99,104,0}}, +/* 9461 */ {(11<<2)|2,{99,104,0}}, +/* 9462 */ {(11<<2)|2,{99,104,0}}, +/* 9463 */ {(11<<2)|2,{99,104,0}}, +/* 9464 */ {(11<<2)|2,{99,104,0}}, +/* 9465 */ {(11<<2)|2,{99,104,0}}, +/* 9466 */ {(11<<2)|2,{99,104,0}}, +/* 9467 */ {(11<<2)|2,{99,104,0}}, +/* 9468 */ {(11<<2)|2,{99,104,0}}, +/* 9469 */ {(11<<2)|2,{99,104,0}}, +/* 9470 */ {(11<<2)|2,{99,104,0}}, +/* 9471 */ {(11<<2)|2,{99,104,0}}, +/* 9472 */ {(16<<2)|3,{99,108,48}}, +/* 9473 */ {(16<<2)|3,{99,108,49}}, +/* 9474 */ {(16<<2)|3,{99,108,50}}, +/* 9475 */ {(16<<2)|3,{99,108,97}}, +/* 9476 */ {(16<<2)|3,{99,108,99}}, +/* 9477 */ {(16<<2)|3,{99,108,101}}, +/* 9478 */ {(16<<2)|3,{99,108,105}}, +/* 9479 */ {(16<<2)|3,{99,108,111}}, +/* 9480 */ {(16<<2)|3,{99,108,115}}, +/* 9481 */ {(16<<2)|3,{99,108,116}}, +/* 9482 */ {(11<<2)|2,{99,108,0}}, +/* 9483 */ {(11<<2)|2,{99,108,0}}, +/* 9484 */ {(11<<2)|2,{99,108,0}}, +/* 9485 */ {(11<<2)|2,{99,108,0}}, +/* 9486 */ {(11<<2)|2,{99,108,0}}, +/* 9487 */ {(11<<2)|2,{99,108,0}}, +/* 9488 */ {(11<<2)|2,{99,108,0}}, +/* 9489 */ {(11<<2)|2,{99,108,0}}, +/* 9490 */ {(11<<2)|2,{99,108,0}}, +/* 9491 */ {(11<<2)|2,{99,108,0}}, +/* 9492 */ {(11<<2)|2,{99,108,0}}, +/* 9493 */ {(11<<2)|2,{99,108,0}}, +/* 9494 */ {(11<<2)|2,{99,108,0}}, +/* 9495 */ {(11<<2)|2,{99,108,0}}, +/* 9496 */ {(11<<2)|2,{99,108,0}}, +/* 9497 */ {(11<<2)|2,{99,108,0}}, +/* 9498 */ {(11<<2)|2,{99,108,0}}, +/* 9499 */ {(11<<2)|2,{99,108,0}}, +/* 9500 */ {(11<<2)|2,{99,108,0}}, +/* 9501 */ {(11<<2)|2,{99,108,0}}, +/* 9502 */ {(11<<2)|2,{99,108,0}}, +/* 9503 */ {(11<<2)|2,{99,108,0}}, +/* 9504 */ {(16<<2)|3,{99,109,48}}, +/* 9505 */ {(16<<2)|3,{99,109,49}}, +/* 9506 */ {(16<<2)|3,{99,109,50}}, +/* 9507 */ {(16<<2)|3,{99,109,97}}, +/* 9508 */ {(16<<2)|3,{99,109,99}}, +/* 9509 */ {(16<<2)|3,{99,109,101}}, +/* 9510 */ {(16<<2)|3,{99,109,105}}, +/* 9511 */ {(16<<2)|3,{99,109,111}}, +/* 9512 */ {(16<<2)|3,{99,109,115}}, +/* 9513 */ {(16<<2)|3,{99,109,116}}, +/* 9514 */ {(11<<2)|2,{99,109,0}}, +/* 9515 */ {(11<<2)|2,{99,109,0}}, +/* 9516 */ {(11<<2)|2,{99,109,0}}, +/* 9517 */ {(11<<2)|2,{99,109,0}}, +/* 9518 */ {(11<<2)|2,{99,109,0}}, +/* 9519 */ {(11<<2)|2,{99,109,0}}, +/* 9520 */ {(11<<2)|2,{99,109,0}}, +/* 9521 */ {(11<<2)|2,{99,109,0}}, +/* 9522 */ {(11<<2)|2,{99,109,0}}, +/* 9523 */ {(11<<2)|2,{99,109,0}}, +/* 9524 */ {(11<<2)|2,{99,109,0}}, +/* 9525 */ {(11<<2)|2,{99,109,0}}, +/* 9526 */ {(11<<2)|2,{99,109,0}}, +/* 9527 */ {(11<<2)|2,{99,109,0}}, +/* 9528 */ {(11<<2)|2,{99,109,0}}, +/* 9529 */ {(11<<2)|2,{99,109,0}}, +/* 9530 */ {(11<<2)|2,{99,109,0}}, +/* 9531 */ {(11<<2)|2,{99,109,0}}, +/* 9532 */ {(11<<2)|2,{99,109,0}}, +/* 9533 */ {(11<<2)|2,{99,109,0}}, +/* 9534 */ {(11<<2)|2,{99,109,0}}, +/* 9535 */ {(11<<2)|2,{99,109,0}}, +/* 9536 */ {(16<<2)|3,{99,110,48}}, +/* 9537 */ {(16<<2)|3,{99,110,49}}, +/* 9538 */ {(16<<2)|3,{99,110,50}}, +/* 9539 */ {(16<<2)|3,{99,110,97}}, +/* 9540 */ {(16<<2)|3,{99,110,99}}, +/* 9541 */ {(16<<2)|3,{99,110,101}}, +/* 9542 */ {(16<<2)|3,{99,110,105}}, +/* 9543 */ {(16<<2)|3,{99,110,111}}, +/* 9544 */ {(16<<2)|3,{99,110,115}}, +/* 9545 */ {(16<<2)|3,{99,110,116}}, +/* 9546 */ {(11<<2)|2,{99,110,0}}, +/* 9547 */ {(11<<2)|2,{99,110,0}}, +/* 9548 */ {(11<<2)|2,{99,110,0}}, +/* 9549 */ {(11<<2)|2,{99,110,0}}, +/* 9550 */ {(11<<2)|2,{99,110,0}}, +/* 9551 */ {(11<<2)|2,{99,110,0}}, +/* 9552 */ {(11<<2)|2,{99,110,0}}, +/* 9553 */ {(11<<2)|2,{99,110,0}}, +/* 9554 */ {(11<<2)|2,{99,110,0}}, +/* 9555 */ {(11<<2)|2,{99,110,0}}, +/* 9556 */ {(11<<2)|2,{99,110,0}}, +/* 9557 */ {(11<<2)|2,{99,110,0}}, +/* 9558 */ {(11<<2)|2,{99,110,0}}, +/* 9559 */ {(11<<2)|2,{99,110,0}}, +/* 9560 */ {(11<<2)|2,{99,110,0}}, +/* 9561 */ {(11<<2)|2,{99,110,0}}, +/* 9562 */ {(11<<2)|2,{99,110,0}}, +/* 9563 */ {(11<<2)|2,{99,110,0}}, +/* 9564 */ {(11<<2)|2,{99,110,0}}, +/* 9565 */ {(11<<2)|2,{99,110,0}}, +/* 9566 */ {(11<<2)|2,{99,110,0}}, +/* 9567 */ {(11<<2)|2,{99,110,0}}, +/* 9568 */ {(16<<2)|3,{99,112,48}}, +/* 9569 */ {(16<<2)|3,{99,112,49}}, +/* 9570 */ {(16<<2)|3,{99,112,50}}, +/* 9571 */ {(16<<2)|3,{99,112,97}}, +/* 9572 */ {(16<<2)|3,{99,112,99}}, +/* 9573 */ {(16<<2)|3,{99,112,101}}, +/* 9574 */ {(16<<2)|3,{99,112,105}}, +/* 9575 */ {(16<<2)|3,{99,112,111}}, +/* 9576 */ {(16<<2)|3,{99,112,115}}, +/* 9577 */ {(16<<2)|3,{99,112,116}}, +/* 9578 */ {(11<<2)|2,{99,112,0}}, +/* 9579 */ {(11<<2)|2,{99,112,0}}, +/* 9580 */ {(11<<2)|2,{99,112,0}}, +/* 9581 */ {(11<<2)|2,{99,112,0}}, +/* 9582 */ {(11<<2)|2,{99,112,0}}, +/* 9583 */ {(11<<2)|2,{99,112,0}}, +/* 9584 */ {(11<<2)|2,{99,112,0}}, +/* 9585 */ {(11<<2)|2,{99,112,0}}, +/* 9586 */ {(11<<2)|2,{99,112,0}}, +/* 9587 */ {(11<<2)|2,{99,112,0}}, +/* 9588 */ {(11<<2)|2,{99,112,0}}, +/* 9589 */ {(11<<2)|2,{99,112,0}}, +/* 9590 */ {(11<<2)|2,{99,112,0}}, +/* 9591 */ {(11<<2)|2,{99,112,0}}, +/* 9592 */ {(11<<2)|2,{99,112,0}}, +/* 9593 */ {(11<<2)|2,{99,112,0}}, +/* 9594 */ {(11<<2)|2,{99,112,0}}, +/* 9595 */ {(11<<2)|2,{99,112,0}}, +/* 9596 */ {(11<<2)|2,{99,112,0}}, +/* 9597 */ {(11<<2)|2,{99,112,0}}, +/* 9598 */ {(11<<2)|2,{99,112,0}}, +/* 9599 */ {(11<<2)|2,{99,112,0}}, +/* 9600 */ {(16<<2)|3,{99,114,48}}, +/* 9601 */ {(16<<2)|3,{99,114,49}}, +/* 9602 */ {(16<<2)|3,{99,114,50}}, +/* 9603 */ {(16<<2)|3,{99,114,97}}, +/* 9604 */ {(16<<2)|3,{99,114,99}}, +/* 9605 */ {(16<<2)|3,{99,114,101}}, +/* 9606 */ {(16<<2)|3,{99,114,105}}, +/* 9607 */ {(16<<2)|3,{99,114,111}}, +/* 9608 */ {(16<<2)|3,{99,114,115}}, +/* 9609 */ {(16<<2)|3,{99,114,116}}, +/* 9610 */ {(11<<2)|2,{99,114,0}}, +/* 9611 */ {(11<<2)|2,{99,114,0}}, +/* 9612 */ {(11<<2)|2,{99,114,0}}, +/* 9613 */ {(11<<2)|2,{99,114,0}}, +/* 9614 */ {(11<<2)|2,{99,114,0}}, +/* 9615 */ {(11<<2)|2,{99,114,0}}, +/* 9616 */ {(11<<2)|2,{99,114,0}}, +/* 9617 */ {(11<<2)|2,{99,114,0}}, +/* 9618 */ {(11<<2)|2,{99,114,0}}, +/* 9619 */ {(11<<2)|2,{99,114,0}}, +/* 9620 */ {(11<<2)|2,{99,114,0}}, +/* 9621 */ {(11<<2)|2,{99,114,0}}, +/* 9622 */ {(11<<2)|2,{99,114,0}}, +/* 9623 */ {(11<<2)|2,{99,114,0}}, +/* 9624 */ {(11<<2)|2,{99,114,0}}, +/* 9625 */ {(11<<2)|2,{99,114,0}}, +/* 9626 */ {(11<<2)|2,{99,114,0}}, +/* 9627 */ {(11<<2)|2,{99,114,0}}, +/* 9628 */ {(11<<2)|2,{99,114,0}}, +/* 9629 */ {(11<<2)|2,{99,114,0}}, +/* 9630 */ {(11<<2)|2,{99,114,0}}, +/* 9631 */ {(11<<2)|2,{99,114,0}}, +/* 9632 */ {(16<<2)|3,{99,117,48}}, +/* 9633 */ {(16<<2)|3,{99,117,49}}, +/* 9634 */ {(16<<2)|3,{99,117,50}}, +/* 9635 */ {(16<<2)|3,{99,117,97}}, +/* 9636 */ {(16<<2)|3,{99,117,99}}, +/* 9637 */ {(16<<2)|3,{99,117,101}}, +/* 9638 */ {(16<<2)|3,{99,117,105}}, +/* 9639 */ {(16<<2)|3,{99,117,111}}, +/* 9640 */ {(16<<2)|3,{99,117,115}}, +/* 9641 */ {(16<<2)|3,{99,117,116}}, +/* 9642 */ {(11<<2)|2,{99,117,0}}, +/* 9643 */ {(11<<2)|2,{99,117,0}}, +/* 9644 */ {(11<<2)|2,{99,117,0}}, +/* 9645 */ {(11<<2)|2,{99,117,0}}, +/* 9646 */ {(11<<2)|2,{99,117,0}}, +/* 9647 */ {(11<<2)|2,{99,117,0}}, +/* 9648 */ {(11<<2)|2,{99,117,0}}, +/* 9649 */ {(11<<2)|2,{99,117,0}}, +/* 9650 */ {(11<<2)|2,{99,117,0}}, +/* 9651 */ {(11<<2)|2,{99,117,0}}, +/* 9652 */ {(11<<2)|2,{99,117,0}}, +/* 9653 */ {(11<<2)|2,{99,117,0}}, +/* 9654 */ {(11<<2)|2,{99,117,0}}, +/* 9655 */ {(11<<2)|2,{99,117,0}}, +/* 9656 */ {(11<<2)|2,{99,117,0}}, +/* 9657 */ {(11<<2)|2,{99,117,0}}, +/* 9658 */ {(11<<2)|2,{99,117,0}}, +/* 9659 */ {(11<<2)|2,{99,117,0}}, +/* 9660 */ {(11<<2)|2,{99,117,0}}, +/* 9661 */ {(11<<2)|2,{99,117,0}}, +/* 9662 */ {(11<<2)|2,{99,117,0}}, +/* 9663 */ {(11<<2)|2,{99,117,0}}, +/* 9664 */ {(12<<2)|2,{99,58,0}}, +/* 9665 */ {(12<<2)|2,{99,58,0}}, +/* 9666 */ {(12<<2)|2,{99,58,0}}, +/* 9667 */ {(12<<2)|2,{99,58,0}}, +/* 9668 */ {(12<<2)|2,{99,58,0}}, +/* 9669 */ {(12<<2)|2,{99,58,0}}, +/* 9670 */ {(12<<2)|2,{99,58,0}}, +/* 9671 */ {(12<<2)|2,{99,58,0}}, +/* 9672 */ {(12<<2)|2,{99,58,0}}, +/* 9673 */ {(12<<2)|2,{99,58,0}}, +/* 9674 */ {(12<<2)|2,{99,58,0}}, +/* 9675 */ {(12<<2)|2,{99,58,0}}, +/* 9676 */ {(12<<2)|2,{99,58,0}}, +/* 9677 */ {(12<<2)|2,{99,58,0}}, +/* 9678 */ {(12<<2)|2,{99,58,0}}, +/* 9679 */ {(12<<2)|2,{99,58,0}}, +/* 9680 */ {(12<<2)|2,{99,66,0}}, +/* 9681 */ {(12<<2)|2,{99,66,0}}, +/* 9682 */ {(12<<2)|2,{99,66,0}}, +/* 9683 */ {(12<<2)|2,{99,66,0}}, +/* 9684 */ {(12<<2)|2,{99,66,0}}, +/* 9685 */ {(12<<2)|2,{99,66,0}}, +/* 9686 */ {(12<<2)|2,{99,66,0}}, +/* 9687 */ {(12<<2)|2,{99,66,0}}, +/* 9688 */ {(12<<2)|2,{99,66,0}}, +/* 9689 */ {(12<<2)|2,{99,66,0}}, +/* 9690 */ {(12<<2)|2,{99,66,0}}, +/* 9691 */ {(12<<2)|2,{99,66,0}}, +/* 9692 */ {(12<<2)|2,{99,66,0}}, +/* 9693 */ {(12<<2)|2,{99,66,0}}, +/* 9694 */ {(12<<2)|2,{99,66,0}}, +/* 9695 */ {(12<<2)|2,{99,66,0}}, +/* 9696 */ {(12<<2)|2,{99,67,0}}, +/* 9697 */ {(12<<2)|2,{99,67,0}}, +/* 9698 */ {(12<<2)|2,{99,67,0}}, +/* 9699 */ {(12<<2)|2,{99,67,0}}, +/* 9700 */ {(12<<2)|2,{99,67,0}}, +/* 9701 */ {(12<<2)|2,{99,67,0}}, +/* 9702 */ {(12<<2)|2,{99,67,0}}, +/* 9703 */ {(12<<2)|2,{99,67,0}}, +/* 9704 */ {(12<<2)|2,{99,67,0}}, +/* 9705 */ {(12<<2)|2,{99,67,0}}, +/* 9706 */ {(12<<2)|2,{99,67,0}}, +/* 9707 */ {(12<<2)|2,{99,67,0}}, +/* 9708 */ {(12<<2)|2,{99,67,0}}, +/* 9709 */ {(12<<2)|2,{99,67,0}}, +/* 9710 */ {(12<<2)|2,{99,67,0}}, +/* 9711 */ {(12<<2)|2,{99,67,0}}, +/* 9712 */ {(12<<2)|2,{99,68,0}}, +/* 9713 */ {(12<<2)|2,{99,68,0}}, +/* 9714 */ {(12<<2)|2,{99,68,0}}, +/* 9715 */ {(12<<2)|2,{99,68,0}}, +/* 9716 */ {(12<<2)|2,{99,68,0}}, +/* 9717 */ {(12<<2)|2,{99,68,0}}, +/* 9718 */ {(12<<2)|2,{99,68,0}}, +/* 9719 */ {(12<<2)|2,{99,68,0}}, +/* 9720 */ {(12<<2)|2,{99,68,0}}, +/* 9721 */ {(12<<2)|2,{99,68,0}}, +/* 9722 */ {(12<<2)|2,{99,68,0}}, +/* 9723 */ {(12<<2)|2,{99,68,0}}, +/* 9724 */ {(12<<2)|2,{99,68,0}}, +/* 9725 */ {(12<<2)|2,{99,68,0}}, +/* 9726 */ {(12<<2)|2,{99,68,0}}, +/* 9727 */ {(12<<2)|2,{99,68,0}}, +/* 9728 */ {(12<<2)|2,{99,69,0}}, +/* 9729 */ {(12<<2)|2,{99,69,0}}, +/* 9730 */ {(12<<2)|2,{99,69,0}}, +/* 9731 */ {(12<<2)|2,{99,69,0}}, +/* 9732 */ {(12<<2)|2,{99,69,0}}, +/* 9733 */ {(12<<2)|2,{99,69,0}}, +/* 9734 */ {(12<<2)|2,{99,69,0}}, +/* 9735 */ {(12<<2)|2,{99,69,0}}, +/* 9736 */ {(12<<2)|2,{99,69,0}}, +/* 9737 */ {(12<<2)|2,{99,69,0}}, +/* 9738 */ {(12<<2)|2,{99,69,0}}, +/* 9739 */ {(12<<2)|2,{99,69,0}}, +/* 9740 */ {(12<<2)|2,{99,69,0}}, +/* 9741 */ {(12<<2)|2,{99,69,0}}, +/* 9742 */ {(12<<2)|2,{99,69,0}}, +/* 9743 */ {(12<<2)|2,{99,69,0}}, +/* 9744 */ {(12<<2)|2,{99,70,0}}, +/* 9745 */ {(12<<2)|2,{99,70,0}}, +/* 9746 */ {(12<<2)|2,{99,70,0}}, +/* 9747 */ {(12<<2)|2,{99,70,0}}, +/* 9748 */ {(12<<2)|2,{99,70,0}}, +/* 9749 */ {(12<<2)|2,{99,70,0}}, +/* 9750 */ {(12<<2)|2,{99,70,0}}, +/* 9751 */ {(12<<2)|2,{99,70,0}}, +/* 9752 */ {(12<<2)|2,{99,70,0}}, +/* 9753 */ {(12<<2)|2,{99,70,0}}, +/* 9754 */ {(12<<2)|2,{99,70,0}}, +/* 9755 */ {(12<<2)|2,{99,70,0}}, +/* 9756 */ {(12<<2)|2,{99,70,0}}, +/* 9757 */ {(12<<2)|2,{99,70,0}}, +/* 9758 */ {(12<<2)|2,{99,70,0}}, +/* 9759 */ {(12<<2)|2,{99,70,0}}, +/* 9760 */ {(12<<2)|2,{99,71,0}}, +/* 9761 */ {(12<<2)|2,{99,71,0}}, +/* 9762 */ {(12<<2)|2,{99,71,0}}, +/* 9763 */ {(12<<2)|2,{99,71,0}}, +/* 9764 */ {(12<<2)|2,{99,71,0}}, +/* 9765 */ {(12<<2)|2,{99,71,0}}, +/* 9766 */ {(12<<2)|2,{99,71,0}}, +/* 9767 */ {(12<<2)|2,{99,71,0}}, +/* 9768 */ {(12<<2)|2,{99,71,0}}, +/* 9769 */ {(12<<2)|2,{99,71,0}}, +/* 9770 */ {(12<<2)|2,{99,71,0}}, +/* 9771 */ {(12<<2)|2,{99,71,0}}, +/* 9772 */ {(12<<2)|2,{99,71,0}}, +/* 9773 */ {(12<<2)|2,{99,71,0}}, +/* 9774 */ {(12<<2)|2,{99,71,0}}, +/* 9775 */ {(12<<2)|2,{99,71,0}}, +/* 9776 */ {(12<<2)|2,{99,72,0}}, +/* 9777 */ {(12<<2)|2,{99,72,0}}, +/* 9778 */ {(12<<2)|2,{99,72,0}}, +/* 9779 */ {(12<<2)|2,{99,72,0}}, +/* 9780 */ {(12<<2)|2,{99,72,0}}, +/* 9781 */ {(12<<2)|2,{99,72,0}}, +/* 9782 */ {(12<<2)|2,{99,72,0}}, +/* 9783 */ {(12<<2)|2,{99,72,0}}, +/* 9784 */ {(12<<2)|2,{99,72,0}}, +/* 9785 */ {(12<<2)|2,{99,72,0}}, +/* 9786 */ {(12<<2)|2,{99,72,0}}, +/* 9787 */ {(12<<2)|2,{99,72,0}}, +/* 9788 */ {(12<<2)|2,{99,72,0}}, +/* 9789 */ {(12<<2)|2,{99,72,0}}, +/* 9790 */ {(12<<2)|2,{99,72,0}}, +/* 9791 */ {(12<<2)|2,{99,72,0}}, +/* 9792 */ {(12<<2)|2,{99,73,0}}, +/* 9793 */ {(12<<2)|2,{99,73,0}}, +/* 9794 */ {(12<<2)|2,{99,73,0}}, +/* 9795 */ {(12<<2)|2,{99,73,0}}, +/* 9796 */ {(12<<2)|2,{99,73,0}}, +/* 9797 */ {(12<<2)|2,{99,73,0}}, +/* 9798 */ {(12<<2)|2,{99,73,0}}, +/* 9799 */ {(12<<2)|2,{99,73,0}}, +/* 9800 */ {(12<<2)|2,{99,73,0}}, +/* 9801 */ {(12<<2)|2,{99,73,0}}, +/* 9802 */ {(12<<2)|2,{99,73,0}}, +/* 9803 */ {(12<<2)|2,{99,73,0}}, +/* 9804 */ {(12<<2)|2,{99,73,0}}, +/* 9805 */ {(12<<2)|2,{99,73,0}}, +/* 9806 */ {(12<<2)|2,{99,73,0}}, +/* 9807 */ {(12<<2)|2,{99,73,0}}, +/* 9808 */ {(12<<2)|2,{99,74,0}}, +/* 9809 */ {(12<<2)|2,{99,74,0}}, +/* 9810 */ {(12<<2)|2,{99,74,0}}, +/* 9811 */ {(12<<2)|2,{99,74,0}}, +/* 9812 */ {(12<<2)|2,{99,74,0}}, +/* 9813 */ {(12<<2)|2,{99,74,0}}, +/* 9814 */ {(12<<2)|2,{99,74,0}}, +/* 9815 */ {(12<<2)|2,{99,74,0}}, +/* 9816 */ {(12<<2)|2,{99,74,0}}, +/* 9817 */ {(12<<2)|2,{99,74,0}}, +/* 9818 */ {(12<<2)|2,{99,74,0}}, +/* 9819 */ {(12<<2)|2,{99,74,0}}, +/* 9820 */ {(12<<2)|2,{99,74,0}}, +/* 9821 */ {(12<<2)|2,{99,74,0}}, +/* 9822 */ {(12<<2)|2,{99,74,0}}, +/* 9823 */ {(12<<2)|2,{99,74,0}}, +/* 9824 */ {(12<<2)|2,{99,75,0}}, +/* 9825 */ {(12<<2)|2,{99,75,0}}, +/* 9826 */ {(12<<2)|2,{99,75,0}}, +/* 9827 */ {(12<<2)|2,{99,75,0}}, +/* 9828 */ {(12<<2)|2,{99,75,0}}, +/* 9829 */ {(12<<2)|2,{99,75,0}}, +/* 9830 */ {(12<<2)|2,{99,75,0}}, +/* 9831 */ {(12<<2)|2,{99,75,0}}, +/* 9832 */ {(12<<2)|2,{99,75,0}}, +/* 9833 */ {(12<<2)|2,{99,75,0}}, +/* 9834 */ {(12<<2)|2,{99,75,0}}, +/* 9835 */ {(12<<2)|2,{99,75,0}}, +/* 9836 */ {(12<<2)|2,{99,75,0}}, +/* 9837 */ {(12<<2)|2,{99,75,0}}, +/* 9838 */ {(12<<2)|2,{99,75,0}}, +/* 9839 */ {(12<<2)|2,{99,75,0}}, +/* 9840 */ {(12<<2)|2,{99,76,0}}, +/* 9841 */ {(12<<2)|2,{99,76,0}}, +/* 9842 */ {(12<<2)|2,{99,76,0}}, +/* 9843 */ {(12<<2)|2,{99,76,0}}, +/* 9844 */ {(12<<2)|2,{99,76,0}}, +/* 9845 */ {(12<<2)|2,{99,76,0}}, +/* 9846 */ {(12<<2)|2,{99,76,0}}, +/* 9847 */ {(12<<2)|2,{99,76,0}}, +/* 9848 */ {(12<<2)|2,{99,76,0}}, +/* 9849 */ {(12<<2)|2,{99,76,0}}, +/* 9850 */ {(12<<2)|2,{99,76,0}}, +/* 9851 */ {(12<<2)|2,{99,76,0}}, +/* 9852 */ {(12<<2)|2,{99,76,0}}, +/* 9853 */ {(12<<2)|2,{99,76,0}}, +/* 9854 */ {(12<<2)|2,{99,76,0}}, +/* 9855 */ {(12<<2)|2,{99,76,0}}, +/* 9856 */ {(12<<2)|2,{99,77,0}}, +/* 9857 */ {(12<<2)|2,{99,77,0}}, +/* 9858 */ {(12<<2)|2,{99,77,0}}, +/* 9859 */ {(12<<2)|2,{99,77,0}}, +/* 9860 */ {(12<<2)|2,{99,77,0}}, +/* 9861 */ {(12<<2)|2,{99,77,0}}, +/* 9862 */ {(12<<2)|2,{99,77,0}}, +/* 9863 */ {(12<<2)|2,{99,77,0}}, +/* 9864 */ {(12<<2)|2,{99,77,0}}, +/* 9865 */ {(12<<2)|2,{99,77,0}}, +/* 9866 */ {(12<<2)|2,{99,77,0}}, +/* 9867 */ {(12<<2)|2,{99,77,0}}, +/* 9868 */ {(12<<2)|2,{99,77,0}}, +/* 9869 */ {(12<<2)|2,{99,77,0}}, +/* 9870 */ {(12<<2)|2,{99,77,0}}, +/* 9871 */ {(12<<2)|2,{99,77,0}}, +/* 9872 */ {(12<<2)|2,{99,78,0}}, +/* 9873 */ {(12<<2)|2,{99,78,0}}, +/* 9874 */ {(12<<2)|2,{99,78,0}}, +/* 9875 */ {(12<<2)|2,{99,78,0}}, +/* 9876 */ {(12<<2)|2,{99,78,0}}, +/* 9877 */ {(12<<2)|2,{99,78,0}}, +/* 9878 */ {(12<<2)|2,{99,78,0}}, +/* 9879 */ {(12<<2)|2,{99,78,0}}, +/* 9880 */ {(12<<2)|2,{99,78,0}}, +/* 9881 */ {(12<<2)|2,{99,78,0}}, +/* 9882 */ {(12<<2)|2,{99,78,0}}, +/* 9883 */ {(12<<2)|2,{99,78,0}}, +/* 9884 */ {(12<<2)|2,{99,78,0}}, +/* 9885 */ {(12<<2)|2,{99,78,0}}, +/* 9886 */ {(12<<2)|2,{99,78,0}}, +/* 9887 */ {(12<<2)|2,{99,78,0}}, +/* 9888 */ {(12<<2)|2,{99,79,0}}, +/* 9889 */ {(12<<2)|2,{99,79,0}}, +/* 9890 */ {(12<<2)|2,{99,79,0}}, +/* 9891 */ {(12<<2)|2,{99,79,0}}, +/* 9892 */ {(12<<2)|2,{99,79,0}}, +/* 9893 */ {(12<<2)|2,{99,79,0}}, +/* 9894 */ {(12<<2)|2,{99,79,0}}, +/* 9895 */ {(12<<2)|2,{99,79,0}}, +/* 9896 */ {(12<<2)|2,{99,79,0}}, +/* 9897 */ {(12<<2)|2,{99,79,0}}, +/* 9898 */ {(12<<2)|2,{99,79,0}}, +/* 9899 */ {(12<<2)|2,{99,79,0}}, +/* 9900 */ {(12<<2)|2,{99,79,0}}, +/* 9901 */ {(12<<2)|2,{99,79,0}}, +/* 9902 */ {(12<<2)|2,{99,79,0}}, +/* 9903 */ {(12<<2)|2,{99,79,0}}, +/* 9904 */ {(12<<2)|2,{99,80,0}}, +/* 9905 */ {(12<<2)|2,{99,80,0}}, +/* 9906 */ {(12<<2)|2,{99,80,0}}, +/* 9907 */ {(12<<2)|2,{99,80,0}}, +/* 9908 */ {(12<<2)|2,{99,80,0}}, +/* 9909 */ {(12<<2)|2,{99,80,0}}, +/* 9910 */ {(12<<2)|2,{99,80,0}}, +/* 9911 */ {(12<<2)|2,{99,80,0}}, +/* 9912 */ {(12<<2)|2,{99,80,0}}, +/* 9913 */ {(12<<2)|2,{99,80,0}}, +/* 9914 */ {(12<<2)|2,{99,80,0}}, +/* 9915 */ {(12<<2)|2,{99,80,0}}, +/* 9916 */ {(12<<2)|2,{99,80,0}}, +/* 9917 */ {(12<<2)|2,{99,80,0}}, +/* 9918 */ {(12<<2)|2,{99,80,0}}, +/* 9919 */ {(12<<2)|2,{99,80,0}}, +/* 9920 */ {(12<<2)|2,{99,81,0}}, +/* 9921 */ {(12<<2)|2,{99,81,0}}, +/* 9922 */ {(12<<2)|2,{99,81,0}}, +/* 9923 */ {(12<<2)|2,{99,81,0}}, +/* 9924 */ {(12<<2)|2,{99,81,0}}, +/* 9925 */ {(12<<2)|2,{99,81,0}}, +/* 9926 */ {(12<<2)|2,{99,81,0}}, +/* 9927 */ {(12<<2)|2,{99,81,0}}, +/* 9928 */ {(12<<2)|2,{99,81,0}}, +/* 9929 */ {(12<<2)|2,{99,81,0}}, +/* 9930 */ {(12<<2)|2,{99,81,0}}, +/* 9931 */ {(12<<2)|2,{99,81,0}}, +/* 9932 */ {(12<<2)|2,{99,81,0}}, +/* 9933 */ {(12<<2)|2,{99,81,0}}, +/* 9934 */ {(12<<2)|2,{99,81,0}}, +/* 9935 */ {(12<<2)|2,{99,81,0}}, +/* 9936 */ {(12<<2)|2,{99,82,0}}, +/* 9937 */ {(12<<2)|2,{99,82,0}}, +/* 9938 */ {(12<<2)|2,{99,82,0}}, +/* 9939 */ {(12<<2)|2,{99,82,0}}, +/* 9940 */ {(12<<2)|2,{99,82,0}}, +/* 9941 */ {(12<<2)|2,{99,82,0}}, +/* 9942 */ {(12<<2)|2,{99,82,0}}, +/* 9943 */ {(12<<2)|2,{99,82,0}}, +/* 9944 */ {(12<<2)|2,{99,82,0}}, +/* 9945 */ {(12<<2)|2,{99,82,0}}, +/* 9946 */ {(12<<2)|2,{99,82,0}}, +/* 9947 */ {(12<<2)|2,{99,82,0}}, +/* 9948 */ {(12<<2)|2,{99,82,0}}, +/* 9949 */ {(12<<2)|2,{99,82,0}}, +/* 9950 */ {(12<<2)|2,{99,82,0}}, +/* 9951 */ {(12<<2)|2,{99,82,0}}, +/* 9952 */ {(12<<2)|2,{99,83,0}}, +/* 9953 */ {(12<<2)|2,{99,83,0}}, +/* 9954 */ {(12<<2)|2,{99,83,0}}, +/* 9955 */ {(12<<2)|2,{99,83,0}}, +/* 9956 */ {(12<<2)|2,{99,83,0}}, +/* 9957 */ {(12<<2)|2,{99,83,0}}, +/* 9958 */ {(12<<2)|2,{99,83,0}}, +/* 9959 */ {(12<<2)|2,{99,83,0}}, +/* 9960 */ {(12<<2)|2,{99,83,0}}, +/* 9961 */ {(12<<2)|2,{99,83,0}}, +/* 9962 */ {(12<<2)|2,{99,83,0}}, +/* 9963 */ {(12<<2)|2,{99,83,0}}, +/* 9964 */ {(12<<2)|2,{99,83,0}}, +/* 9965 */ {(12<<2)|2,{99,83,0}}, +/* 9966 */ {(12<<2)|2,{99,83,0}}, +/* 9967 */ {(12<<2)|2,{99,83,0}}, +/* 9968 */ {(12<<2)|2,{99,84,0}}, +/* 9969 */ {(12<<2)|2,{99,84,0}}, +/* 9970 */ {(12<<2)|2,{99,84,0}}, +/* 9971 */ {(12<<2)|2,{99,84,0}}, +/* 9972 */ {(12<<2)|2,{99,84,0}}, +/* 9973 */ {(12<<2)|2,{99,84,0}}, +/* 9974 */ {(12<<2)|2,{99,84,0}}, +/* 9975 */ {(12<<2)|2,{99,84,0}}, +/* 9976 */ {(12<<2)|2,{99,84,0}}, +/* 9977 */ {(12<<2)|2,{99,84,0}}, +/* 9978 */ {(12<<2)|2,{99,84,0}}, +/* 9979 */ {(12<<2)|2,{99,84,0}}, +/* 9980 */ {(12<<2)|2,{99,84,0}}, +/* 9981 */ {(12<<2)|2,{99,84,0}}, +/* 9982 */ {(12<<2)|2,{99,84,0}}, +/* 9983 */ {(12<<2)|2,{99,84,0}}, +/* 9984 */ {(12<<2)|2,{99,85,0}}, +/* 9985 */ {(12<<2)|2,{99,85,0}}, +/* 9986 */ {(12<<2)|2,{99,85,0}}, +/* 9987 */ {(12<<2)|2,{99,85,0}}, +/* 9988 */ {(12<<2)|2,{99,85,0}}, +/* 9989 */ {(12<<2)|2,{99,85,0}}, +/* 9990 */ {(12<<2)|2,{99,85,0}}, +/* 9991 */ {(12<<2)|2,{99,85,0}}, +/* 9992 */ {(12<<2)|2,{99,85,0}}, +/* 9993 */ {(12<<2)|2,{99,85,0}}, +/* 9994 */ {(12<<2)|2,{99,85,0}}, +/* 9995 */ {(12<<2)|2,{99,85,0}}, +/* 9996 */ {(12<<2)|2,{99,85,0}}, +/* 9997 */ {(12<<2)|2,{99,85,0}}, +/* 9998 */ {(12<<2)|2,{99,85,0}}, +/* 9999 */ {(12<<2)|2,{99,85,0}}, +/* 10000 */ {(12<<2)|2,{99,86,0}}, +/* 10001 */ {(12<<2)|2,{99,86,0}}, +/* 10002 */ {(12<<2)|2,{99,86,0}}, +/* 10003 */ {(12<<2)|2,{99,86,0}}, +/* 10004 */ {(12<<2)|2,{99,86,0}}, +/* 10005 */ {(12<<2)|2,{99,86,0}}, +/* 10006 */ {(12<<2)|2,{99,86,0}}, +/* 10007 */ {(12<<2)|2,{99,86,0}}, +/* 10008 */ {(12<<2)|2,{99,86,0}}, +/* 10009 */ {(12<<2)|2,{99,86,0}}, +/* 10010 */ {(12<<2)|2,{99,86,0}}, +/* 10011 */ {(12<<2)|2,{99,86,0}}, +/* 10012 */ {(12<<2)|2,{99,86,0}}, +/* 10013 */ {(12<<2)|2,{99,86,0}}, +/* 10014 */ {(12<<2)|2,{99,86,0}}, +/* 10015 */ {(12<<2)|2,{99,86,0}}, +/* 10016 */ {(12<<2)|2,{99,87,0}}, +/* 10017 */ {(12<<2)|2,{99,87,0}}, +/* 10018 */ {(12<<2)|2,{99,87,0}}, +/* 10019 */ {(12<<2)|2,{99,87,0}}, +/* 10020 */ {(12<<2)|2,{99,87,0}}, +/* 10021 */ {(12<<2)|2,{99,87,0}}, +/* 10022 */ {(12<<2)|2,{99,87,0}}, +/* 10023 */ {(12<<2)|2,{99,87,0}}, +/* 10024 */ {(12<<2)|2,{99,87,0}}, +/* 10025 */ {(12<<2)|2,{99,87,0}}, +/* 10026 */ {(12<<2)|2,{99,87,0}}, +/* 10027 */ {(12<<2)|2,{99,87,0}}, +/* 10028 */ {(12<<2)|2,{99,87,0}}, +/* 10029 */ {(12<<2)|2,{99,87,0}}, +/* 10030 */ {(12<<2)|2,{99,87,0}}, +/* 10031 */ {(12<<2)|2,{99,87,0}}, +/* 10032 */ {(12<<2)|2,{99,89,0}}, +/* 10033 */ {(12<<2)|2,{99,89,0}}, +/* 10034 */ {(12<<2)|2,{99,89,0}}, +/* 10035 */ {(12<<2)|2,{99,89,0}}, +/* 10036 */ {(12<<2)|2,{99,89,0}}, +/* 10037 */ {(12<<2)|2,{99,89,0}}, +/* 10038 */ {(12<<2)|2,{99,89,0}}, +/* 10039 */ {(12<<2)|2,{99,89,0}}, +/* 10040 */ {(12<<2)|2,{99,89,0}}, +/* 10041 */ {(12<<2)|2,{99,89,0}}, +/* 10042 */ {(12<<2)|2,{99,89,0}}, +/* 10043 */ {(12<<2)|2,{99,89,0}}, +/* 10044 */ {(12<<2)|2,{99,89,0}}, +/* 10045 */ {(12<<2)|2,{99,89,0}}, +/* 10046 */ {(12<<2)|2,{99,89,0}}, +/* 10047 */ {(12<<2)|2,{99,89,0}}, +/* 10048 */ {(12<<2)|2,{99,106,0}}, +/* 10049 */ {(12<<2)|2,{99,106,0}}, +/* 10050 */ {(12<<2)|2,{99,106,0}}, +/* 10051 */ {(12<<2)|2,{99,106,0}}, +/* 10052 */ {(12<<2)|2,{99,106,0}}, +/* 10053 */ {(12<<2)|2,{99,106,0}}, +/* 10054 */ {(12<<2)|2,{99,106,0}}, +/* 10055 */ {(12<<2)|2,{99,106,0}}, +/* 10056 */ {(12<<2)|2,{99,106,0}}, +/* 10057 */ {(12<<2)|2,{99,106,0}}, +/* 10058 */ {(12<<2)|2,{99,106,0}}, +/* 10059 */ {(12<<2)|2,{99,106,0}}, +/* 10060 */ {(12<<2)|2,{99,106,0}}, +/* 10061 */ {(12<<2)|2,{99,106,0}}, +/* 10062 */ {(12<<2)|2,{99,106,0}}, +/* 10063 */ {(12<<2)|2,{99,106,0}}, +/* 10064 */ {(12<<2)|2,{99,107,0}}, +/* 10065 */ {(12<<2)|2,{99,107,0}}, +/* 10066 */ {(12<<2)|2,{99,107,0}}, +/* 10067 */ {(12<<2)|2,{99,107,0}}, +/* 10068 */ {(12<<2)|2,{99,107,0}}, +/* 10069 */ {(12<<2)|2,{99,107,0}}, +/* 10070 */ {(12<<2)|2,{99,107,0}}, +/* 10071 */ {(12<<2)|2,{99,107,0}}, +/* 10072 */ {(12<<2)|2,{99,107,0}}, +/* 10073 */ {(12<<2)|2,{99,107,0}}, +/* 10074 */ {(12<<2)|2,{99,107,0}}, +/* 10075 */ {(12<<2)|2,{99,107,0}}, +/* 10076 */ {(12<<2)|2,{99,107,0}}, +/* 10077 */ {(12<<2)|2,{99,107,0}}, +/* 10078 */ {(12<<2)|2,{99,107,0}}, +/* 10079 */ {(12<<2)|2,{99,107,0}}, +/* 10080 */ {(12<<2)|2,{99,113,0}}, +/* 10081 */ {(12<<2)|2,{99,113,0}}, +/* 10082 */ {(12<<2)|2,{99,113,0}}, +/* 10083 */ {(12<<2)|2,{99,113,0}}, +/* 10084 */ {(12<<2)|2,{99,113,0}}, +/* 10085 */ {(12<<2)|2,{99,113,0}}, +/* 10086 */ {(12<<2)|2,{99,113,0}}, +/* 10087 */ {(12<<2)|2,{99,113,0}}, +/* 10088 */ {(12<<2)|2,{99,113,0}}, +/* 10089 */ {(12<<2)|2,{99,113,0}}, +/* 10090 */ {(12<<2)|2,{99,113,0}}, +/* 10091 */ {(12<<2)|2,{99,113,0}}, +/* 10092 */ {(12<<2)|2,{99,113,0}}, +/* 10093 */ {(12<<2)|2,{99,113,0}}, +/* 10094 */ {(12<<2)|2,{99,113,0}}, +/* 10095 */ {(12<<2)|2,{99,113,0}}, +/* 10096 */ {(12<<2)|2,{99,118,0}}, +/* 10097 */ {(12<<2)|2,{99,118,0}}, +/* 10098 */ {(12<<2)|2,{99,118,0}}, +/* 10099 */ {(12<<2)|2,{99,118,0}}, +/* 10100 */ {(12<<2)|2,{99,118,0}}, +/* 10101 */ {(12<<2)|2,{99,118,0}}, +/* 10102 */ {(12<<2)|2,{99,118,0}}, +/* 10103 */ {(12<<2)|2,{99,118,0}}, +/* 10104 */ {(12<<2)|2,{99,118,0}}, +/* 10105 */ {(12<<2)|2,{99,118,0}}, +/* 10106 */ {(12<<2)|2,{99,118,0}}, +/* 10107 */ {(12<<2)|2,{99,118,0}}, +/* 10108 */ {(12<<2)|2,{99,118,0}}, +/* 10109 */ {(12<<2)|2,{99,118,0}}, +/* 10110 */ {(12<<2)|2,{99,118,0}}, +/* 10111 */ {(12<<2)|2,{99,118,0}}, +/* 10112 */ {(12<<2)|2,{99,119,0}}, +/* 10113 */ {(12<<2)|2,{99,119,0}}, +/* 10114 */ {(12<<2)|2,{99,119,0}}, +/* 10115 */ {(12<<2)|2,{99,119,0}}, +/* 10116 */ {(12<<2)|2,{99,119,0}}, +/* 10117 */ {(12<<2)|2,{99,119,0}}, +/* 10118 */ {(12<<2)|2,{99,119,0}}, +/* 10119 */ {(12<<2)|2,{99,119,0}}, +/* 10120 */ {(12<<2)|2,{99,119,0}}, +/* 10121 */ {(12<<2)|2,{99,119,0}}, +/* 10122 */ {(12<<2)|2,{99,119,0}}, +/* 10123 */ {(12<<2)|2,{99,119,0}}, +/* 10124 */ {(12<<2)|2,{99,119,0}}, +/* 10125 */ {(12<<2)|2,{99,119,0}}, +/* 10126 */ {(12<<2)|2,{99,119,0}}, +/* 10127 */ {(12<<2)|2,{99,119,0}}, +/* 10128 */ {(12<<2)|2,{99,120,0}}, +/* 10129 */ {(12<<2)|2,{99,120,0}}, +/* 10130 */ {(12<<2)|2,{99,120,0}}, +/* 10131 */ {(12<<2)|2,{99,120,0}}, +/* 10132 */ {(12<<2)|2,{99,120,0}}, +/* 10133 */ {(12<<2)|2,{99,120,0}}, +/* 10134 */ {(12<<2)|2,{99,120,0}}, +/* 10135 */ {(12<<2)|2,{99,120,0}}, +/* 10136 */ {(12<<2)|2,{99,120,0}}, +/* 10137 */ {(12<<2)|2,{99,120,0}}, +/* 10138 */ {(12<<2)|2,{99,120,0}}, +/* 10139 */ {(12<<2)|2,{99,120,0}}, +/* 10140 */ {(12<<2)|2,{99,120,0}}, +/* 10141 */ {(12<<2)|2,{99,120,0}}, +/* 10142 */ {(12<<2)|2,{99,120,0}}, +/* 10143 */ {(12<<2)|2,{99,120,0}}, +/* 10144 */ {(12<<2)|2,{99,121,0}}, +/* 10145 */ {(12<<2)|2,{99,121,0}}, +/* 10146 */ {(12<<2)|2,{99,121,0}}, +/* 10147 */ {(12<<2)|2,{99,121,0}}, +/* 10148 */ {(12<<2)|2,{99,121,0}}, +/* 10149 */ {(12<<2)|2,{99,121,0}}, +/* 10150 */ {(12<<2)|2,{99,121,0}}, +/* 10151 */ {(12<<2)|2,{99,121,0}}, +/* 10152 */ {(12<<2)|2,{99,121,0}}, +/* 10153 */ {(12<<2)|2,{99,121,0}}, +/* 10154 */ {(12<<2)|2,{99,121,0}}, +/* 10155 */ {(12<<2)|2,{99,121,0}}, +/* 10156 */ {(12<<2)|2,{99,121,0}}, +/* 10157 */ {(12<<2)|2,{99,121,0}}, +/* 10158 */ {(12<<2)|2,{99,121,0}}, +/* 10159 */ {(12<<2)|2,{99,121,0}}, +/* 10160 */ {(12<<2)|2,{99,122,0}}, +/* 10161 */ {(12<<2)|2,{99,122,0}}, +/* 10162 */ {(12<<2)|2,{99,122,0}}, +/* 10163 */ {(12<<2)|2,{99,122,0}}, +/* 10164 */ {(12<<2)|2,{99,122,0}}, +/* 10165 */ {(12<<2)|2,{99,122,0}}, +/* 10166 */ {(12<<2)|2,{99,122,0}}, +/* 10167 */ {(12<<2)|2,{99,122,0}}, +/* 10168 */ {(12<<2)|2,{99,122,0}}, +/* 10169 */ {(12<<2)|2,{99,122,0}}, +/* 10170 */ {(12<<2)|2,{99,122,0}}, +/* 10171 */ {(12<<2)|2,{99,122,0}}, +/* 10172 */ {(12<<2)|2,{99,122,0}}, +/* 10173 */ {(12<<2)|2,{99,122,0}}, +/* 10174 */ {(12<<2)|2,{99,122,0}}, +/* 10175 */ {(12<<2)|2,{99,122,0}}, +/* 10176 */ {(13<<2)|2,{99,38,0}}, +/* 10177 */ {(13<<2)|2,{99,38,0}}, +/* 10178 */ {(13<<2)|2,{99,38,0}}, +/* 10179 */ {(13<<2)|2,{99,38,0}}, +/* 10180 */ {(13<<2)|2,{99,38,0}}, +/* 10181 */ {(13<<2)|2,{99,38,0}}, +/* 10182 */ {(13<<2)|2,{99,38,0}}, +/* 10183 */ {(13<<2)|2,{99,38,0}}, +/* 10184 */ {(13<<2)|2,{99,42,0}}, +/* 10185 */ {(13<<2)|2,{99,42,0}}, +/* 10186 */ {(13<<2)|2,{99,42,0}}, +/* 10187 */ {(13<<2)|2,{99,42,0}}, +/* 10188 */ {(13<<2)|2,{99,42,0}}, +/* 10189 */ {(13<<2)|2,{99,42,0}}, +/* 10190 */ {(13<<2)|2,{99,42,0}}, +/* 10191 */ {(13<<2)|2,{99,42,0}}, +/* 10192 */ {(13<<2)|2,{99,44,0}}, +/* 10193 */ {(13<<2)|2,{99,44,0}}, +/* 10194 */ {(13<<2)|2,{99,44,0}}, +/* 10195 */ {(13<<2)|2,{99,44,0}}, +/* 10196 */ {(13<<2)|2,{99,44,0}}, +/* 10197 */ {(13<<2)|2,{99,44,0}}, +/* 10198 */ {(13<<2)|2,{99,44,0}}, +/* 10199 */ {(13<<2)|2,{99,44,0}}, +/* 10200 */ {(13<<2)|2,{99,59,0}}, +/* 10201 */ {(13<<2)|2,{99,59,0}}, +/* 10202 */ {(13<<2)|2,{99,59,0}}, +/* 10203 */ {(13<<2)|2,{99,59,0}}, +/* 10204 */ {(13<<2)|2,{99,59,0}}, +/* 10205 */ {(13<<2)|2,{99,59,0}}, +/* 10206 */ {(13<<2)|2,{99,59,0}}, +/* 10207 */ {(13<<2)|2,{99,59,0}}, +/* 10208 */ {(13<<2)|2,{99,88,0}}, +/* 10209 */ {(13<<2)|2,{99,88,0}}, +/* 10210 */ {(13<<2)|2,{99,88,0}}, +/* 10211 */ {(13<<2)|2,{99,88,0}}, +/* 10212 */ {(13<<2)|2,{99,88,0}}, +/* 10213 */ {(13<<2)|2,{99,88,0}}, +/* 10214 */ {(13<<2)|2,{99,88,0}}, +/* 10215 */ {(13<<2)|2,{99,88,0}}, +/* 10216 */ {(13<<2)|2,{99,90,0}}, +/* 10217 */ {(13<<2)|2,{99,90,0}}, +/* 10218 */ {(13<<2)|2,{99,90,0}}, +/* 10219 */ {(13<<2)|2,{99,90,0}}, +/* 10220 */ {(13<<2)|2,{99,90,0}}, +/* 10221 */ {(13<<2)|2,{99,90,0}}, +/* 10222 */ {(13<<2)|2,{99,90,0}}, +/* 10223 */ {(13<<2)|2,{99,90,0}}, +/* 10224 */ {(15<<2)|2,{99,33,0}}, +/* 10225 */ {(15<<2)|2,{99,33,0}}, +/* 10226 */ {(15<<2)|2,{99,34,0}}, +/* 10227 */ {(15<<2)|2,{99,34,0}}, +/* 10228 */ {(15<<2)|2,{99,40,0}}, +/* 10229 */ {(15<<2)|2,{99,40,0}}, +/* 10230 */ {(15<<2)|2,{99,41,0}}, +/* 10231 */ {(15<<2)|2,{99,41,0}}, +/* 10232 */ {(15<<2)|2,{99,63,0}}, +/* 10233 */ {(15<<2)|2,{99,63,0}}, +/* 10234 */ {(16<<2)|2,{99,39,0}}, +/* 10235 */ {(16<<2)|2,{99,43,0}}, +/* 10236 */ {(16<<2)|2,{99,124,0}}, +/* 10237 */ {(5<<2)|1,{99,0,0}}, +/* 10238 */ {(5<<2)|1,{99,0,0}}, +/* 10239 */ {(5<<2)|1,{99,0,0}}, +/* 10240 */ {(15<<2)|3,{101,48,48}}, +/* 10241 */ {(15<<2)|3,{101,48,48}}, +/* 10242 */ {(15<<2)|3,{101,48,49}}, +/* 10243 */ {(15<<2)|3,{101,48,49}}, +/* 10244 */ {(15<<2)|3,{101,48,50}}, +/* 10245 */ {(15<<2)|3,{101,48,50}}, +/* 10246 */ {(15<<2)|3,{101,48,97}}, +/* 10247 */ {(15<<2)|3,{101,48,97}}, +/* 10248 */ {(15<<2)|3,{101,48,99}}, +/* 10249 */ {(15<<2)|3,{101,48,99}}, +/* 10250 */ {(15<<2)|3,{101,48,101}}, +/* 10251 */ {(15<<2)|3,{101,48,101}}, +/* 10252 */ {(15<<2)|3,{101,48,105}}, +/* 10253 */ {(15<<2)|3,{101,48,105}}, +/* 10254 */ {(15<<2)|3,{101,48,111}}, +/* 10255 */ {(15<<2)|3,{101,48,111}}, +/* 10256 */ {(15<<2)|3,{101,48,115}}, +/* 10257 */ {(15<<2)|3,{101,48,115}}, +/* 10258 */ {(15<<2)|3,{101,48,116}}, +/* 10259 */ {(15<<2)|3,{101,48,116}}, +/* 10260 */ {(16<<2)|3,{101,48,32}}, +/* 10261 */ {(16<<2)|3,{101,48,37}}, +/* 10262 */ {(16<<2)|3,{101,48,45}}, +/* 10263 */ {(16<<2)|3,{101,48,46}}, +/* 10264 */ {(16<<2)|3,{101,48,47}}, +/* 10265 */ {(16<<2)|3,{101,48,51}}, +/* 10266 */ {(16<<2)|3,{101,48,52}}, +/* 10267 */ {(16<<2)|3,{101,48,53}}, +/* 10268 */ {(16<<2)|3,{101,48,54}}, +/* 10269 */ {(16<<2)|3,{101,48,55}}, +/* 10270 */ {(16<<2)|3,{101,48,56}}, +/* 10271 */ {(16<<2)|3,{101,48,57}}, +/* 10272 */ {(16<<2)|3,{101,48,61}}, +/* 10273 */ {(16<<2)|3,{101,48,65}}, +/* 10274 */ {(16<<2)|3,{101,48,95}}, +/* 10275 */ {(16<<2)|3,{101,48,98}}, +/* 10276 */ {(16<<2)|3,{101,48,100}}, +/* 10277 */ {(16<<2)|3,{101,48,102}}, +/* 10278 */ {(16<<2)|3,{101,48,103}}, +/* 10279 */ {(16<<2)|3,{101,48,104}}, +/* 10280 */ {(16<<2)|3,{101,48,108}}, +/* 10281 */ {(16<<2)|3,{101,48,109}}, +/* 10282 */ {(16<<2)|3,{101,48,110}}, +/* 10283 */ {(16<<2)|3,{101,48,112}}, +/* 10284 */ {(16<<2)|3,{101,48,114}}, +/* 10285 */ {(16<<2)|3,{101,48,117}}, +/* 10286 */ {(10<<2)|2,{101,48,0}}, +/* 10287 */ {(10<<2)|2,{101,48,0}}, +/* 10288 */ {(10<<2)|2,{101,48,0}}, +/* 10289 */ {(10<<2)|2,{101,48,0}}, +/* 10290 */ {(10<<2)|2,{101,48,0}}, +/* 10291 */ {(10<<2)|2,{101,48,0}}, +/* 10292 */ {(10<<2)|2,{101,48,0}}, +/* 10293 */ {(10<<2)|2,{101,48,0}}, +/* 10294 */ {(10<<2)|2,{101,48,0}}, +/* 10295 */ {(10<<2)|2,{101,48,0}}, +/* 10296 */ {(10<<2)|2,{101,48,0}}, +/* 10297 */ {(10<<2)|2,{101,48,0}}, +/* 10298 */ {(10<<2)|2,{101,48,0}}, +/* 10299 */ {(10<<2)|2,{101,48,0}}, +/* 10300 */ {(10<<2)|2,{101,48,0}}, +/* 10301 */ {(10<<2)|2,{101,48,0}}, +/* 10302 */ {(10<<2)|2,{101,48,0}}, +/* 10303 */ {(10<<2)|2,{101,48,0}}, +/* 10304 */ {(15<<2)|3,{101,49,48}}, +/* 10305 */ {(15<<2)|3,{101,49,48}}, +/* 10306 */ {(15<<2)|3,{101,49,49}}, +/* 10307 */ {(15<<2)|3,{101,49,49}}, +/* 10308 */ {(15<<2)|3,{101,49,50}}, +/* 10309 */ {(15<<2)|3,{101,49,50}}, +/* 10310 */ {(15<<2)|3,{101,49,97}}, +/* 10311 */ {(15<<2)|3,{101,49,97}}, +/* 10312 */ {(15<<2)|3,{101,49,99}}, +/* 10313 */ {(15<<2)|3,{101,49,99}}, +/* 10314 */ {(15<<2)|3,{101,49,101}}, +/* 10315 */ {(15<<2)|3,{101,49,101}}, +/* 10316 */ {(15<<2)|3,{101,49,105}}, +/* 10317 */ {(15<<2)|3,{101,49,105}}, +/* 10318 */ {(15<<2)|3,{101,49,111}}, +/* 10319 */ {(15<<2)|3,{101,49,111}}, +/* 10320 */ {(15<<2)|3,{101,49,115}}, +/* 10321 */ {(15<<2)|3,{101,49,115}}, +/* 10322 */ {(15<<2)|3,{101,49,116}}, +/* 10323 */ {(15<<2)|3,{101,49,116}}, +/* 10324 */ {(16<<2)|3,{101,49,32}}, +/* 10325 */ {(16<<2)|3,{101,49,37}}, +/* 10326 */ {(16<<2)|3,{101,49,45}}, +/* 10327 */ {(16<<2)|3,{101,49,46}}, +/* 10328 */ {(16<<2)|3,{101,49,47}}, +/* 10329 */ {(16<<2)|3,{101,49,51}}, +/* 10330 */ {(16<<2)|3,{101,49,52}}, +/* 10331 */ {(16<<2)|3,{101,49,53}}, +/* 10332 */ {(16<<2)|3,{101,49,54}}, +/* 10333 */ {(16<<2)|3,{101,49,55}}, +/* 10334 */ {(16<<2)|3,{101,49,56}}, +/* 10335 */ {(16<<2)|3,{101,49,57}}, +/* 10336 */ {(16<<2)|3,{101,49,61}}, +/* 10337 */ {(16<<2)|3,{101,49,65}}, +/* 10338 */ {(16<<2)|3,{101,49,95}}, +/* 10339 */ {(16<<2)|3,{101,49,98}}, +/* 10340 */ {(16<<2)|3,{101,49,100}}, +/* 10341 */ {(16<<2)|3,{101,49,102}}, +/* 10342 */ {(16<<2)|3,{101,49,103}}, +/* 10343 */ {(16<<2)|3,{101,49,104}}, +/* 10344 */ {(16<<2)|3,{101,49,108}}, +/* 10345 */ {(16<<2)|3,{101,49,109}}, +/* 10346 */ {(16<<2)|3,{101,49,110}}, +/* 10347 */ {(16<<2)|3,{101,49,112}}, +/* 10348 */ {(16<<2)|3,{101,49,114}}, +/* 10349 */ {(16<<2)|3,{101,49,117}}, +/* 10350 */ {(10<<2)|2,{101,49,0}}, +/* 10351 */ {(10<<2)|2,{101,49,0}}, +/* 10352 */ {(10<<2)|2,{101,49,0}}, +/* 10353 */ {(10<<2)|2,{101,49,0}}, +/* 10354 */ {(10<<2)|2,{101,49,0}}, +/* 10355 */ {(10<<2)|2,{101,49,0}}, +/* 10356 */ {(10<<2)|2,{101,49,0}}, +/* 10357 */ {(10<<2)|2,{101,49,0}}, +/* 10358 */ {(10<<2)|2,{101,49,0}}, +/* 10359 */ {(10<<2)|2,{101,49,0}}, +/* 10360 */ {(10<<2)|2,{101,49,0}}, +/* 10361 */ {(10<<2)|2,{101,49,0}}, +/* 10362 */ {(10<<2)|2,{101,49,0}}, +/* 10363 */ {(10<<2)|2,{101,49,0}}, +/* 10364 */ {(10<<2)|2,{101,49,0}}, +/* 10365 */ {(10<<2)|2,{101,49,0}}, +/* 10366 */ {(10<<2)|2,{101,49,0}}, +/* 10367 */ {(10<<2)|2,{101,49,0}}, +/* 10368 */ {(15<<2)|3,{101,50,48}}, +/* 10369 */ {(15<<2)|3,{101,50,48}}, +/* 10370 */ {(15<<2)|3,{101,50,49}}, +/* 10371 */ {(15<<2)|3,{101,50,49}}, +/* 10372 */ {(15<<2)|3,{101,50,50}}, +/* 10373 */ {(15<<2)|3,{101,50,50}}, +/* 10374 */ {(15<<2)|3,{101,50,97}}, +/* 10375 */ {(15<<2)|3,{101,50,97}}, +/* 10376 */ {(15<<2)|3,{101,50,99}}, +/* 10377 */ {(15<<2)|3,{101,50,99}}, +/* 10378 */ {(15<<2)|3,{101,50,101}}, +/* 10379 */ {(15<<2)|3,{101,50,101}}, +/* 10380 */ {(15<<2)|3,{101,50,105}}, +/* 10381 */ {(15<<2)|3,{101,50,105}}, +/* 10382 */ {(15<<2)|3,{101,50,111}}, +/* 10383 */ {(15<<2)|3,{101,50,111}}, +/* 10384 */ {(15<<2)|3,{101,50,115}}, +/* 10385 */ {(15<<2)|3,{101,50,115}}, +/* 10386 */ {(15<<2)|3,{101,50,116}}, +/* 10387 */ {(15<<2)|3,{101,50,116}}, +/* 10388 */ {(16<<2)|3,{101,50,32}}, +/* 10389 */ {(16<<2)|3,{101,50,37}}, +/* 10390 */ {(16<<2)|3,{101,50,45}}, +/* 10391 */ {(16<<2)|3,{101,50,46}}, +/* 10392 */ {(16<<2)|3,{101,50,47}}, +/* 10393 */ {(16<<2)|3,{101,50,51}}, +/* 10394 */ {(16<<2)|3,{101,50,52}}, +/* 10395 */ {(16<<2)|3,{101,50,53}}, +/* 10396 */ {(16<<2)|3,{101,50,54}}, +/* 10397 */ {(16<<2)|3,{101,50,55}}, +/* 10398 */ {(16<<2)|3,{101,50,56}}, +/* 10399 */ {(16<<2)|3,{101,50,57}}, +/* 10400 */ {(16<<2)|3,{101,50,61}}, +/* 10401 */ {(16<<2)|3,{101,50,65}}, +/* 10402 */ {(16<<2)|3,{101,50,95}}, +/* 10403 */ {(16<<2)|3,{101,50,98}}, +/* 10404 */ {(16<<2)|3,{101,50,100}}, +/* 10405 */ {(16<<2)|3,{101,50,102}}, +/* 10406 */ {(16<<2)|3,{101,50,103}}, +/* 10407 */ {(16<<2)|3,{101,50,104}}, +/* 10408 */ {(16<<2)|3,{101,50,108}}, +/* 10409 */ {(16<<2)|3,{101,50,109}}, +/* 10410 */ {(16<<2)|3,{101,50,110}}, +/* 10411 */ {(16<<2)|3,{101,50,112}}, +/* 10412 */ {(16<<2)|3,{101,50,114}}, +/* 10413 */ {(16<<2)|3,{101,50,117}}, +/* 10414 */ {(10<<2)|2,{101,50,0}}, +/* 10415 */ {(10<<2)|2,{101,50,0}}, +/* 10416 */ {(10<<2)|2,{101,50,0}}, +/* 10417 */ {(10<<2)|2,{101,50,0}}, +/* 10418 */ {(10<<2)|2,{101,50,0}}, +/* 10419 */ {(10<<2)|2,{101,50,0}}, +/* 10420 */ {(10<<2)|2,{101,50,0}}, +/* 10421 */ {(10<<2)|2,{101,50,0}}, +/* 10422 */ {(10<<2)|2,{101,50,0}}, +/* 10423 */ {(10<<2)|2,{101,50,0}}, +/* 10424 */ {(10<<2)|2,{101,50,0}}, +/* 10425 */ {(10<<2)|2,{101,50,0}}, +/* 10426 */ {(10<<2)|2,{101,50,0}}, +/* 10427 */ {(10<<2)|2,{101,50,0}}, +/* 10428 */ {(10<<2)|2,{101,50,0}}, +/* 10429 */ {(10<<2)|2,{101,50,0}}, +/* 10430 */ {(10<<2)|2,{101,50,0}}, +/* 10431 */ {(10<<2)|2,{101,50,0}}, +/* 10432 */ {(15<<2)|3,{101,97,48}}, +/* 10433 */ {(15<<2)|3,{101,97,48}}, +/* 10434 */ {(15<<2)|3,{101,97,49}}, +/* 10435 */ {(15<<2)|3,{101,97,49}}, +/* 10436 */ {(15<<2)|3,{101,97,50}}, +/* 10437 */ {(15<<2)|3,{101,97,50}}, +/* 10438 */ {(15<<2)|3,{101,97,97}}, +/* 10439 */ {(15<<2)|3,{101,97,97}}, +/* 10440 */ {(15<<2)|3,{101,97,99}}, +/* 10441 */ {(15<<2)|3,{101,97,99}}, +/* 10442 */ {(15<<2)|3,{101,97,101}}, +/* 10443 */ {(15<<2)|3,{101,97,101}}, +/* 10444 */ {(15<<2)|3,{101,97,105}}, +/* 10445 */ {(15<<2)|3,{101,97,105}}, +/* 10446 */ {(15<<2)|3,{101,97,111}}, +/* 10447 */ {(15<<2)|3,{101,97,111}}, +/* 10448 */ {(15<<2)|3,{101,97,115}}, +/* 10449 */ {(15<<2)|3,{101,97,115}}, +/* 10450 */ {(15<<2)|3,{101,97,116}}, +/* 10451 */ {(15<<2)|3,{101,97,116}}, +/* 10452 */ {(16<<2)|3,{101,97,32}}, +/* 10453 */ {(16<<2)|3,{101,97,37}}, +/* 10454 */ {(16<<2)|3,{101,97,45}}, +/* 10455 */ {(16<<2)|3,{101,97,46}}, +/* 10456 */ {(16<<2)|3,{101,97,47}}, +/* 10457 */ {(16<<2)|3,{101,97,51}}, +/* 10458 */ {(16<<2)|3,{101,97,52}}, +/* 10459 */ {(16<<2)|3,{101,97,53}}, +/* 10460 */ {(16<<2)|3,{101,97,54}}, +/* 10461 */ {(16<<2)|3,{101,97,55}}, +/* 10462 */ {(16<<2)|3,{101,97,56}}, +/* 10463 */ {(16<<2)|3,{101,97,57}}, +/* 10464 */ {(16<<2)|3,{101,97,61}}, +/* 10465 */ {(16<<2)|3,{101,97,65}}, +/* 10466 */ {(16<<2)|3,{101,97,95}}, +/* 10467 */ {(16<<2)|3,{101,97,98}}, +/* 10468 */ {(16<<2)|3,{101,97,100}}, +/* 10469 */ {(16<<2)|3,{101,97,102}}, +/* 10470 */ {(16<<2)|3,{101,97,103}}, +/* 10471 */ {(16<<2)|3,{101,97,104}}, +/* 10472 */ {(16<<2)|3,{101,97,108}}, +/* 10473 */ {(16<<2)|3,{101,97,109}}, +/* 10474 */ {(16<<2)|3,{101,97,110}}, +/* 10475 */ {(16<<2)|3,{101,97,112}}, +/* 10476 */ {(16<<2)|3,{101,97,114}}, +/* 10477 */ {(16<<2)|3,{101,97,117}}, +/* 10478 */ {(10<<2)|2,{101,97,0}}, +/* 10479 */ {(10<<2)|2,{101,97,0}}, +/* 10480 */ {(10<<2)|2,{101,97,0}}, +/* 10481 */ {(10<<2)|2,{101,97,0}}, +/* 10482 */ {(10<<2)|2,{101,97,0}}, +/* 10483 */ {(10<<2)|2,{101,97,0}}, +/* 10484 */ {(10<<2)|2,{101,97,0}}, +/* 10485 */ {(10<<2)|2,{101,97,0}}, +/* 10486 */ {(10<<2)|2,{101,97,0}}, +/* 10487 */ {(10<<2)|2,{101,97,0}}, +/* 10488 */ {(10<<2)|2,{101,97,0}}, +/* 10489 */ {(10<<2)|2,{101,97,0}}, +/* 10490 */ {(10<<2)|2,{101,97,0}}, +/* 10491 */ {(10<<2)|2,{101,97,0}}, +/* 10492 */ {(10<<2)|2,{101,97,0}}, +/* 10493 */ {(10<<2)|2,{101,97,0}}, +/* 10494 */ {(10<<2)|2,{101,97,0}}, +/* 10495 */ {(10<<2)|2,{101,97,0}}, +/* 10496 */ {(15<<2)|3,{101,99,48}}, +/* 10497 */ {(15<<2)|3,{101,99,48}}, +/* 10498 */ {(15<<2)|3,{101,99,49}}, +/* 10499 */ {(15<<2)|3,{101,99,49}}, +/* 10500 */ {(15<<2)|3,{101,99,50}}, +/* 10501 */ {(15<<2)|3,{101,99,50}}, +/* 10502 */ {(15<<2)|3,{101,99,97}}, +/* 10503 */ {(15<<2)|3,{101,99,97}}, +/* 10504 */ {(15<<2)|3,{101,99,99}}, +/* 10505 */ {(15<<2)|3,{101,99,99}}, +/* 10506 */ {(15<<2)|3,{101,99,101}}, +/* 10507 */ {(15<<2)|3,{101,99,101}}, +/* 10508 */ {(15<<2)|3,{101,99,105}}, +/* 10509 */ {(15<<2)|3,{101,99,105}}, +/* 10510 */ {(15<<2)|3,{101,99,111}}, +/* 10511 */ {(15<<2)|3,{101,99,111}}, +/* 10512 */ {(15<<2)|3,{101,99,115}}, +/* 10513 */ {(15<<2)|3,{101,99,115}}, +/* 10514 */ {(15<<2)|3,{101,99,116}}, +/* 10515 */ {(15<<2)|3,{101,99,116}}, +/* 10516 */ {(16<<2)|3,{101,99,32}}, +/* 10517 */ {(16<<2)|3,{101,99,37}}, +/* 10518 */ {(16<<2)|3,{101,99,45}}, +/* 10519 */ {(16<<2)|3,{101,99,46}}, +/* 10520 */ {(16<<2)|3,{101,99,47}}, +/* 10521 */ {(16<<2)|3,{101,99,51}}, +/* 10522 */ {(16<<2)|3,{101,99,52}}, +/* 10523 */ {(16<<2)|3,{101,99,53}}, +/* 10524 */ {(16<<2)|3,{101,99,54}}, +/* 10525 */ {(16<<2)|3,{101,99,55}}, +/* 10526 */ {(16<<2)|3,{101,99,56}}, +/* 10527 */ {(16<<2)|3,{101,99,57}}, +/* 10528 */ {(16<<2)|3,{101,99,61}}, +/* 10529 */ {(16<<2)|3,{101,99,65}}, +/* 10530 */ {(16<<2)|3,{101,99,95}}, +/* 10531 */ {(16<<2)|3,{101,99,98}}, +/* 10532 */ {(16<<2)|3,{101,99,100}}, +/* 10533 */ {(16<<2)|3,{101,99,102}}, +/* 10534 */ {(16<<2)|3,{101,99,103}}, +/* 10535 */ {(16<<2)|3,{101,99,104}}, +/* 10536 */ {(16<<2)|3,{101,99,108}}, +/* 10537 */ {(16<<2)|3,{101,99,109}}, +/* 10538 */ {(16<<2)|3,{101,99,110}}, +/* 10539 */ {(16<<2)|3,{101,99,112}}, +/* 10540 */ {(16<<2)|3,{101,99,114}}, +/* 10541 */ {(16<<2)|3,{101,99,117}}, +/* 10542 */ {(10<<2)|2,{101,99,0}}, +/* 10543 */ {(10<<2)|2,{101,99,0}}, +/* 10544 */ {(10<<2)|2,{101,99,0}}, +/* 10545 */ {(10<<2)|2,{101,99,0}}, +/* 10546 */ {(10<<2)|2,{101,99,0}}, +/* 10547 */ {(10<<2)|2,{101,99,0}}, +/* 10548 */ {(10<<2)|2,{101,99,0}}, +/* 10549 */ {(10<<2)|2,{101,99,0}}, +/* 10550 */ {(10<<2)|2,{101,99,0}}, +/* 10551 */ {(10<<2)|2,{101,99,0}}, +/* 10552 */ {(10<<2)|2,{101,99,0}}, +/* 10553 */ {(10<<2)|2,{101,99,0}}, +/* 10554 */ {(10<<2)|2,{101,99,0}}, +/* 10555 */ {(10<<2)|2,{101,99,0}}, +/* 10556 */ {(10<<2)|2,{101,99,0}}, +/* 10557 */ {(10<<2)|2,{101,99,0}}, +/* 10558 */ {(10<<2)|2,{101,99,0}}, +/* 10559 */ {(10<<2)|2,{101,99,0}}, +/* 10560 */ {(15<<2)|3,{101,101,48}}, +/* 10561 */ {(15<<2)|3,{101,101,48}}, +/* 10562 */ {(15<<2)|3,{101,101,49}}, +/* 10563 */ {(15<<2)|3,{101,101,49}}, +/* 10564 */ {(15<<2)|3,{101,101,50}}, +/* 10565 */ {(15<<2)|3,{101,101,50}}, +/* 10566 */ {(15<<2)|3,{101,101,97}}, +/* 10567 */ {(15<<2)|3,{101,101,97}}, +/* 10568 */ {(15<<2)|3,{101,101,99}}, +/* 10569 */ {(15<<2)|3,{101,101,99}}, +/* 10570 */ {(15<<2)|3,{101,101,101}}, +/* 10571 */ {(15<<2)|3,{101,101,101}}, +/* 10572 */ {(15<<2)|3,{101,101,105}}, +/* 10573 */ {(15<<2)|3,{101,101,105}}, +/* 10574 */ {(15<<2)|3,{101,101,111}}, +/* 10575 */ {(15<<2)|3,{101,101,111}}, +/* 10576 */ {(15<<2)|3,{101,101,115}}, +/* 10577 */ {(15<<2)|3,{101,101,115}}, +/* 10578 */ {(15<<2)|3,{101,101,116}}, +/* 10579 */ {(15<<2)|3,{101,101,116}}, +/* 10580 */ {(16<<2)|3,{101,101,32}}, +/* 10581 */ {(16<<2)|3,{101,101,37}}, +/* 10582 */ {(16<<2)|3,{101,101,45}}, +/* 10583 */ {(16<<2)|3,{101,101,46}}, +/* 10584 */ {(16<<2)|3,{101,101,47}}, +/* 10585 */ {(16<<2)|3,{101,101,51}}, +/* 10586 */ {(16<<2)|3,{101,101,52}}, +/* 10587 */ {(16<<2)|3,{101,101,53}}, +/* 10588 */ {(16<<2)|3,{101,101,54}}, +/* 10589 */ {(16<<2)|3,{101,101,55}}, +/* 10590 */ {(16<<2)|3,{101,101,56}}, +/* 10591 */ {(16<<2)|3,{101,101,57}}, +/* 10592 */ {(16<<2)|3,{101,101,61}}, +/* 10593 */ {(16<<2)|3,{101,101,65}}, +/* 10594 */ {(16<<2)|3,{101,101,95}}, +/* 10595 */ {(16<<2)|3,{101,101,98}}, +/* 10596 */ {(16<<2)|3,{101,101,100}}, +/* 10597 */ {(16<<2)|3,{101,101,102}}, +/* 10598 */ {(16<<2)|3,{101,101,103}}, +/* 10599 */ {(16<<2)|3,{101,101,104}}, +/* 10600 */ {(16<<2)|3,{101,101,108}}, +/* 10601 */ {(16<<2)|3,{101,101,109}}, +/* 10602 */ {(16<<2)|3,{101,101,110}}, +/* 10603 */ {(16<<2)|3,{101,101,112}}, +/* 10604 */ {(16<<2)|3,{101,101,114}}, +/* 10605 */ {(16<<2)|3,{101,101,117}}, +/* 10606 */ {(10<<2)|2,{101,101,0}}, +/* 10607 */ {(10<<2)|2,{101,101,0}}, +/* 10608 */ {(10<<2)|2,{101,101,0}}, +/* 10609 */ {(10<<2)|2,{101,101,0}}, +/* 10610 */ {(10<<2)|2,{101,101,0}}, +/* 10611 */ {(10<<2)|2,{101,101,0}}, +/* 10612 */ {(10<<2)|2,{101,101,0}}, +/* 10613 */ {(10<<2)|2,{101,101,0}}, +/* 10614 */ {(10<<2)|2,{101,101,0}}, +/* 10615 */ {(10<<2)|2,{101,101,0}}, +/* 10616 */ {(10<<2)|2,{101,101,0}}, +/* 10617 */ {(10<<2)|2,{101,101,0}}, +/* 10618 */ {(10<<2)|2,{101,101,0}}, +/* 10619 */ {(10<<2)|2,{101,101,0}}, +/* 10620 */ {(10<<2)|2,{101,101,0}}, +/* 10621 */ {(10<<2)|2,{101,101,0}}, +/* 10622 */ {(10<<2)|2,{101,101,0}}, +/* 10623 */ {(10<<2)|2,{101,101,0}}, +/* 10624 */ {(15<<2)|3,{101,105,48}}, +/* 10625 */ {(15<<2)|3,{101,105,48}}, +/* 10626 */ {(15<<2)|3,{101,105,49}}, +/* 10627 */ {(15<<2)|3,{101,105,49}}, +/* 10628 */ {(15<<2)|3,{101,105,50}}, +/* 10629 */ {(15<<2)|3,{101,105,50}}, +/* 10630 */ {(15<<2)|3,{101,105,97}}, +/* 10631 */ {(15<<2)|3,{101,105,97}}, +/* 10632 */ {(15<<2)|3,{101,105,99}}, +/* 10633 */ {(15<<2)|3,{101,105,99}}, +/* 10634 */ {(15<<2)|3,{101,105,101}}, +/* 10635 */ {(15<<2)|3,{101,105,101}}, +/* 10636 */ {(15<<2)|3,{101,105,105}}, +/* 10637 */ {(15<<2)|3,{101,105,105}}, +/* 10638 */ {(15<<2)|3,{101,105,111}}, +/* 10639 */ {(15<<2)|3,{101,105,111}}, +/* 10640 */ {(15<<2)|3,{101,105,115}}, +/* 10641 */ {(15<<2)|3,{101,105,115}}, +/* 10642 */ {(15<<2)|3,{101,105,116}}, +/* 10643 */ {(15<<2)|3,{101,105,116}}, +/* 10644 */ {(16<<2)|3,{101,105,32}}, +/* 10645 */ {(16<<2)|3,{101,105,37}}, +/* 10646 */ {(16<<2)|3,{101,105,45}}, +/* 10647 */ {(16<<2)|3,{101,105,46}}, +/* 10648 */ {(16<<2)|3,{101,105,47}}, +/* 10649 */ {(16<<2)|3,{101,105,51}}, +/* 10650 */ {(16<<2)|3,{101,105,52}}, +/* 10651 */ {(16<<2)|3,{101,105,53}}, +/* 10652 */ {(16<<2)|3,{101,105,54}}, +/* 10653 */ {(16<<2)|3,{101,105,55}}, +/* 10654 */ {(16<<2)|3,{101,105,56}}, +/* 10655 */ {(16<<2)|3,{101,105,57}}, +/* 10656 */ {(16<<2)|3,{101,105,61}}, +/* 10657 */ {(16<<2)|3,{101,105,65}}, +/* 10658 */ {(16<<2)|3,{101,105,95}}, +/* 10659 */ {(16<<2)|3,{101,105,98}}, +/* 10660 */ {(16<<2)|3,{101,105,100}}, +/* 10661 */ {(16<<2)|3,{101,105,102}}, +/* 10662 */ {(16<<2)|3,{101,105,103}}, +/* 10663 */ {(16<<2)|3,{101,105,104}}, +/* 10664 */ {(16<<2)|3,{101,105,108}}, +/* 10665 */ {(16<<2)|3,{101,105,109}}, +/* 10666 */ {(16<<2)|3,{101,105,110}}, +/* 10667 */ {(16<<2)|3,{101,105,112}}, +/* 10668 */ {(16<<2)|3,{101,105,114}}, +/* 10669 */ {(16<<2)|3,{101,105,117}}, +/* 10670 */ {(10<<2)|2,{101,105,0}}, +/* 10671 */ {(10<<2)|2,{101,105,0}}, +/* 10672 */ {(10<<2)|2,{101,105,0}}, +/* 10673 */ {(10<<2)|2,{101,105,0}}, +/* 10674 */ {(10<<2)|2,{101,105,0}}, +/* 10675 */ {(10<<2)|2,{101,105,0}}, +/* 10676 */ {(10<<2)|2,{101,105,0}}, +/* 10677 */ {(10<<2)|2,{101,105,0}}, +/* 10678 */ {(10<<2)|2,{101,105,0}}, +/* 10679 */ {(10<<2)|2,{101,105,0}}, +/* 10680 */ {(10<<2)|2,{101,105,0}}, +/* 10681 */ {(10<<2)|2,{101,105,0}}, +/* 10682 */ {(10<<2)|2,{101,105,0}}, +/* 10683 */ {(10<<2)|2,{101,105,0}}, +/* 10684 */ {(10<<2)|2,{101,105,0}}, +/* 10685 */ {(10<<2)|2,{101,105,0}}, +/* 10686 */ {(10<<2)|2,{101,105,0}}, +/* 10687 */ {(10<<2)|2,{101,105,0}}, +/* 10688 */ {(15<<2)|3,{101,111,48}}, +/* 10689 */ {(15<<2)|3,{101,111,48}}, +/* 10690 */ {(15<<2)|3,{101,111,49}}, +/* 10691 */ {(15<<2)|3,{101,111,49}}, +/* 10692 */ {(15<<2)|3,{101,111,50}}, +/* 10693 */ {(15<<2)|3,{101,111,50}}, +/* 10694 */ {(15<<2)|3,{101,111,97}}, +/* 10695 */ {(15<<2)|3,{101,111,97}}, +/* 10696 */ {(15<<2)|3,{101,111,99}}, +/* 10697 */ {(15<<2)|3,{101,111,99}}, +/* 10698 */ {(15<<2)|3,{101,111,101}}, +/* 10699 */ {(15<<2)|3,{101,111,101}}, +/* 10700 */ {(15<<2)|3,{101,111,105}}, +/* 10701 */ {(15<<2)|3,{101,111,105}}, +/* 10702 */ {(15<<2)|3,{101,111,111}}, +/* 10703 */ {(15<<2)|3,{101,111,111}}, +/* 10704 */ {(15<<2)|3,{101,111,115}}, +/* 10705 */ {(15<<2)|3,{101,111,115}}, +/* 10706 */ {(15<<2)|3,{101,111,116}}, +/* 10707 */ {(15<<2)|3,{101,111,116}}, +/* 10708 */ {(16<<2)|3,{101,111,32}}, +/* 10709 */ {(16<<2)|3,{101,111,37}}, +/* 10710 */ {(16<<2)|3,{101,111,45}}, +/* 10711 */ {(16<<2)|3,{101,111,46}}, +/* 10712 */ {(16<<2)|3,{101,111,47}}, +/* 10713 */ {(16<<2)|3,{101,111,51}}, +/* 10714 */ {(16<<2)|3,{101,111,52}}, +/* 10715 */ {(16<<2)|3,{101,111,53}}, +/* 10716 */ {(16<<2)|3,{101,111,54}}, +/* 10717 */ {(16<<2)|3,{101,111,55}}, +/* 10718 */ {(16<<2)|3,{101,111,56}}, +/* 10719 */ {(16<<2)|3,{101,111,57}}, +/* 10720 */ {(16<<2)|3,{101,111,61}}, +/* 10721 */ {(16<<2)|3,{101,111,65}}, +/* 10722 */ {(16<<2)|3,{101,111,95}}, +/* 10723 */ {(16<<2)|3,{101,111,98}}, +/* 10724 */ {(16<<2)|3,{101,111,100}}, +/* 10725 */ {(16<<2)|3,{101,111,102}}, +/* 10726 */ {(16<<2)|3,{101,111,103}}, +/* 10727 */ {(16<<2)|3,{101,111,104}}, +/* 10728 */ {(16<<2)|3,{101,111,108}}, +/* 10729 */ {(16<<2)|3,{101,111,109}}, +/* 10730 */ {(16<<2)|3,{101,111,110}}, +/* 10731 */ {(16<<2)|3,{101,111,112}}, +/* 10732 */ {(16<<2)|3,{101,111,114}}, +/* 10733 */ {(16<<2)|3,{101,111,117}}, +/* 10734 */ {(10<<2)|2,{101,111,0}}, +/* 10735 */ {(10<<2)|2,{101,111,0}}, +/* 10736 */ {(10<<2)|2,{101,111,0}}, +/* 10737 */ {(10<<2)|2,{101,111,0}}, +/* 10738 */ {(10<<2)|2,{101,111,0}}, +/* 10739 */ {(10<<2)|2,{101,111,0}}, +/* 10740 */ {(10<<2)|2,{101,111,0}}, +/* 10741 */ {(10<<2)|2,{101,111,0}}, +/* 10742 */ {(10<<2)|2,{101,111,0}}, +/* 10743 */ {(10<<2)|2,{101,111,0}}, +/* 10744 */ {(10<<2)|2,{101,111,0}}, +/* 10745 */ {(10<<2)|2,{101,111,0}}, +/* 10746 */ {(10<<2)|2,{101,111,0}}, +/* 10747 */ {(10<<2)|2,{101,111,0}}, +/* 10748 */ {(10<<2)|2,{101,111,0}}, +/* 10749 */ {(10<<2)|2,{101,111,0}}, +/* 10750 */ {(10<<2)|2,{101,111,0}}, +/* 10751 */ {(10<<2)|2,{101,111,0}}, +/* 10752 */ {(15<<2)|3,{101,115,48}}, +/* 10753 */ {(15<<2)|3,{101,115,48}}, +/* 10754 */ {(15<<2)|3,{101,115,49}}, +/* 10755 */ {(15<<2)|3,{101,115,49}}, +/* 10756 */ {(15<<2)|3,{101,115,50}}, +/* 10757 */ {(15<<2)|3,{101,115,50}}, +/* 10758 */ {(15<<2)|3,{101,115,97}}, +/* 10759 */ {(15<<2)|3,{101,115,97}}, +/* 10760 */ {(15<<2)|3,{101,115,99}}, +/* 10761 */ {(15<<2)|3,{101,115,99}}, +/* 10762 */ {(15<<2)|3,{101,115,101}}, +/* 10763 */ {(15<<2)|3,{101,115,101}}, +/* 10764 */ {(15<<2)|3,{101,115,105}}, +/* 10765 */ {(15<<2)|3,{101,115,105}}, +/* 10766 */ {(15<<2)|3,{101,115,111}}, +/* 10767 */ {(15<<2)|3,{101,115,111}}, +/* 10768 */ {(15<<2)|3,{101,115,115}}, +/* 10769 */ {(15<<2)|3,{101,115,115}}, +/* 10770 */ {(15<<2)|3,{101,115,116}}, +/* 10771 */ {(15<<2)|3,{101,115,116}}, +/* 10772 */ {(16<<2)|3,{101,115,32}}, +/* 10773 */ {(16<<2)|3,{101,115,37}}, +/* 10774 */ {(16<<2)|3,{101,115,45}}, +/* 10775 */ {(16<<2)|3,{101,115,46}}, +/* 10776 */ {(16<<2)|3,{101,115,47}}, +/* 10777 */ {(16<<2)|3,{101,115,51}}, +/* 10778 */ {(16<<2)|3,{101,115,52}}, +/* 10779 */ {(16<<2)|3,{101,115,53}}, +/* 10780 */ {(16<<2)|3,{101,115,54}}, +/* 10781 */ {(16<<2)|3,{101,115,55}}, +/* 10782 */ {(16<<2)|3,{101,115,56}}, +/* 10783 */ {(16<<2)|3,{101,115,57}}, +/* 10784 */ {(16<<2)|3,{101,115,61}}, +/* 10785 */ {(16<<2)|3,{101,115,65}}, +/* 10786 */ {(16<<2)|3,{101,115,95}}, +/* 10787 */ {(16<<2)|3,{101,115,98}}, +/* 10788 */ {(16<<2)|3,{101,115,100}}, +/* 10789 */ {(16<<2)|3,{101,115,102}}, +/* 10790 */ {(16<<2)|3,{101,115,103}}, +/* 10791 */ {(16<<2)|3,{101,115,104}}, +/* 10792 */ {(16<<2)|3,{101,115,108}}, +/* 10793 */ {(16<<2)|3,{101,115,109}}, +/* 10794 */ {(16<<2)|3,{101,115,110}}, +/* 10795 */ {(16<<2)|3,{101,115,112}}, +/* 10796 */ {(16<<2)|3,{101,115,114}}, +/* 10797 */ {(16<<2)|3,{101,115,117}}, +/* 10798 */ {(10<<2)|2,{101,115,0}}, +/* 10799 */ {(10<<2)|2,{101,115,0}}, +/* 10800 */ {(10<<2)|2,{101,115,0}}, +/* 10801 */ {(10<<2)|2,{101,115,0}}, +/* 10802 */ {(10<<2)|2,{101,115,0}}, +/* 10803 */ {(10<<2)|2,{101,115,0}}, +/* 10804 */ {(10<<2)|2,{101,115,0}}, +/* 10805 */ {(10<<2)|2,{101,115,0}}, +/* 10806 */ {(10<<2)|2,{101,115,0}}, +/* 10807 */ {(10<<2)|2,{101,115,0}}, +/* 10808 */ {(10<<2)|2,{101,115,0}}, +/* 10809 */ {(10<<2)|2,{101,115,0}}, +/* 10810 */ {(10<<2)|2,{101,115,0}}, +/* 10811 */ {(10<<2)|2,{101,115,0}}, +/* 10812 */ {(10<<2)|2,{101,115,0}}, +/* 10813 */ {(10<<2)|2,{101,115,0}}, +/* 10814 */ {(10<<2)|2,{101,115,0}}, +/* 10815 */ {(10<<2)|2,{101,115,0}}, +/* 10816 */ {(15<<2)|3,{101,116,48}}, +/* 10817 */ {(15<<2)|3,{101,116,48}}, +/* 10818 */ {(15<<2)|3,{101,116,49}}, +/* 10819 */ {(15<<2)|3,{101,116,49}}, +/* 10820 */ {(15<<2)|3,{101,116,50}}, +/* 10821 */ {(15<<2)|3,{101,116,50}}, +/* 10822 */ {(15<<2)|3,{101,116,97}}, +/* 10823 */ {(15<<2)|3,{101,116,97}}, +/* 10824 */ {(15<<2)|3,{101,116,99}}, +/* 10825 */ {(15<<2)|3,{101,116,99}}, +/* 10826 */ {(15<<2)|3,{101,116,101}}, +/* 10827 */ {(15<<2)|3,{101,116,101}}, +/* 10828 */ {(15<<2)|3,{101,116,105}}, +/* 10829 */ {(15<<2)|3,{101,116,105}}, +/* 10830 */ {(15<<2)|3,{101,116,111}}, +/* 10831 */ {(15<<2)|3,{101,116,111}}, +/* 10832 */ {(15<<2)|3,{101,116,115}}, +/* 10833 */ {(15<<2)|3,{101,116,115}}, +/* 10834 */ {(15<<2)|3,{101,116,116}}, +/* 10835 */ {(15<<2)|3,{101,116,116}}, +/* 10836 */ {(16<<2)|3,{101,116,32}}, +/* 10837 */ {(16<<2)|3,{101,116,37}}, +/* 10838 */ {(16<<2)|3,{101,116,45}}, +/* 10839 */ {(16<<2)|3,{101,116,46}}, +/* 10840 */ {(16<<2)|3,{101,116,47}}, +/* 10841 */ {(16<<2)|3,{101,116,51}}, +/* 10842 */ {(16<<2)|3,{101,116,52}}, +/* 10843 */ {(16<<2)|3,{101,116,53}}, +/* 10844 */ {(16<<2)|3,{101,116,54}}, +/* 10845 */ {(16<<2)|3,{101,116,55}}, +/* 10846 */ {(16<<2)|3,{101,116,56}}, +/* 10847 */ {(16<<2)|3,{101,116,57}}, +/* 10848 */ {(16<<2)|3,{101,116,61}}, +/* 10849 */ {(16<<2)|3,{101,116,65}}, +/* 10850 */ {(16<<2)|3,{101,116,95}}, +/* 10851 */ {(16<<2)|3,{101,116,98}}, +/* 10852 */ {(16<<2)|3,{101,116,100}}, +/* 10853 */ {(16<<2)|3,{101,116,102}}, +/* 10854 */ {(16<<2)|3,{101,116,103}}, +/* 10855 */ {(16<<2)|3,{101,116,104}}, +/* 10856 */ {(16<<2)|3,{101,116,108}}, +/* 10857 */ {(16<<2)|3,{101,116,109}}, +/* 10858 */ {(16<<2)|3,{101,116,110}}, +/* 10859 */ {(16<<2)|3,{101,116,112}}, +/* 10860 */ {(16<<2)|3,{101,116,114}}, +/* 10861 */ {(16<<2)|3,{101,116,117}}, +/* 10862 */ {(10<<2)|2,{101,116,0}}, +/* 10863 */ {(10<<2)|2,{101,116,0}}, +/* 10864 */ {(10<<2)|2,{101,116,0}}, +/* 10865 */ {(10<<2)|2,{101,116,0}}, +/* 10866 */ {(10<<2)|2,{101,116,0}}, +/* 10867 */ {(10<<2)|2,{101,116,0}}, +/* 10868 */ {(10<<2)|2,{101,116,0}}, +/* 10869 */ {(10<<2)|2,{101,116,0}}, +/* 10870 */ {(10<<2)|2,{101,116,0}}, +/* 10871 */ {(10<<2)|2,{101,116,0}}, +/* 10872 */ {(10<<2)|2,{101,116,0}}, +/* 10873 */ {(10<<2)|2,{101,116,0}}, +/* 10874 */ {(10<<2)|2,{101,116,0}}, +/* 10875 */ {(10<<2)|2,{101,116,0}}, +/* 10876 */ {(10<<2)|2,{101,116,0}}, +/* 10877 */ {(10<<2)|2,{101,116,0}}, +/* 10878 */ {(10<<2)|2,{101,116,0}}, +/* 10879 */ {(10<<2)|2,{101,116,0}}, +/* 10880 */ {(16<<2)|3,{101,32,48}}, +/* 10881 */ {(16<<2)|3,{101,32,49}}, +/* 10882 */ {(16<<2)|3,{101,32,50}}, +/* 10883 */ {(16<<2)|3,{101,32,97}}, +/* 10884 */ {(16<<2)|3,{101,32,99}}, +/* 10885 */ {(16<<2)|3,{101,32,101}}, +/* 10886 */ {(16<<2)|3,{101,32,105}}, +/* 10887 */ {(16<<2)|3,{101,32,111}}, +/* 10888 */ {(16<<2)|3,{101,32,115}}, +/* 10889 */ {(16<<2)|3,{101,32,116}}, +/* 10890 */ {(11<<2)|2,{101,32,0}}, +/* 10891 */ {(11<<2)|2,{101,32,0}}, +/* 10892 */ {(11<<2)|2,{101,32,0}}, +/* 10893 */ {(11<<2)|2,{101,32,0}}, +/* 10894 */ {(11<<2)|2,{101,32,0}}, +/* 10895 */ {(11<<2)|2,{101,32,0}}, +/* 10896 */ {(11<<2)|2,{101,32,0}}, +/* 10897 */ {(11<<2)|2,{101,32,0}}, +/* 10898 */ {(11<<2)|2,{101,32,0}}, +/* 10899 */ {(11<<2)|2,{101,32,0}}, +/* 10900 */ {(11<<2)|2,{101,32,0}}, +/* 10901 */ {(11<<2)|2,{101,32,0}}, +/* 10902 */ {(11<<2)|2,{101,32,0}}, +/* 10903 */ {(11<<2)|2,{101,32,0}}, +/* 10904 */ {(11<<2)|2,{101,32,0}}, +/* 10905 */ {(11<<2)|2,{101,32,0}}, +/* 10906 */ {(11<<2)|2,{101,32,0}}, +/* 10907 */ {(11<<2)|2,{101,32,0}}, +/* 10908 */ {(11<<2)|2,{101,32,0}}, +/* 10909 */ {(11<<2)|2,{101,32,0}}, +/* 10910 */ {(11<<2)|2,{101,32,0}}, +/* 10911 */ {(11<<2)|2,{101,32,0}}, +/* 10912 */ {(16<<2)|3,{101,37,48}}, +/* 10913 */ {(16<<2)|3,{101,37,49}}, +/* 10914 */ {(16<<2)|3,{101,37,50}}, +/* 10915 */ {(16<<2)|3,{101,37,97}}, +/* 10916 */ {(16<<2)|3,{101,37,99}}, +/* 10917 */ {(16<<2)|3,{101,37,101}}, +/* 10918 */ {(16<<2)|3,{101,37,105}}, +/* 10919 */ {(16<<2)|3,{101,37,111}}, +/* 10920 */ {(16<<2)|3,{101,37,115}}, +/* 10921 */ {(16<<2)|3,{101,37,116}}, +/* 10922 */ {(11<<2)|2,{101,37,0}}, +/* 10923 */ {(11<<2)|2,{101,37,0}}, +/* 10924 */ {(11<<2)|2,{101,37,0}}, +/* 10925 */ {(11<<2)|2,{101,37,0}}, +/* 10926 */ {(11<<2)|2,{101,37,0}}, +/* 10927 */ {(11<<2)|2,{101,37,0}}, +/* 10928 */ {(11<<2)|2,{101,37,0}}, +/* 10929 */ {(11<<2)|2,{101,37,0}}, +/* 10930 */ {(11<<2)|2,{101,37,0}}, +/* 10931 */ {(11<<2)|2,{101,37,0}}, +/* 10932 */ {(11<<2)|2,{101,37,0}}, +/* 10933 */ {(11<<2)|2,{101,37,0}}, +/* 10934 */ {(11<<2)|2,{101,37,0}}, +/* 10935 */ {(11<<2)|2,{101,37,0}}, +/* 10936 */ {(11<<2)|2,{101,37,0}}, +/* 10937 */ {(11<<2)|2,{101,37,0}}, +/* 10938 */ {(11<<2)|2,{101,37,0}}, +/* 10939 */ {(11<<2)|2,{101,37,0}}, +/* 10940 */ {(11<<2)|2,{101,37,0}}, +/* 10941 */ {(11<<2)|2,{101,37,0}}, +/* 10942 */ {(11<<2)|2,{101,37,0}}, +/* 10943 */ {(11<<2)|2,{101,37,0}}, +/* 10944 */ {(16<<2)|3,{101,45,48}}, +/* 10945 */ {(16<<2)|3,{101,45,49}}, +/* 10946 */ {(16<<2)|3,{101,45,50}}, +/* 10947 */ {(16<<2)|3,{101,45,97}}, +/* 10948 */ {(16<<2)|3,{101,45,99}}, +/* 10949 */ {(16<<2)|3,{101,45,101}}, +/* 10950 */ {(16<<2)|3,{101,45,105}}, +/* 10951 */ {(16<<2)|3,{101,45,111}}, +/* 10952 */ {(16<<2)|3,{101,45,115}}, +/* 10953 */ {(16<<2)|3,{101,45,116}}, +/* 10954 */ {(11<<2)|2,{101,45,0}}, +/* 10955 */ {(11<<2)|2,{101,45,0}}, +/* 10956 */ {(11<<2)|2,{101,45,0}}, +/* 10957 */ {(11<<2)|2,{101,45,0}}, +/* 10958 */ {(11<<2)|2,{101,45,0}}, +/* 10959 */ {(11<<2)|2,{101,45,0}}, +/* 10960 */ {(11<<2)|2,{101,45,0}}, +/* 10961 */ {(11<<2)|2,{101,45,0}}, +/* 10962 */ {(11<<2)|2,{101,45,0}}, +/* 10963 */ {(11<<2)|2,{101,45,0}}, +/* 10964 */ {(11<<2)|2,{101,45,0}}, +/* 10965 */ {(11<<2)|2,{101,45,0}}, +/* 10966 */ {(11<<2)|2,{101,45,0}}, +/* 10967 */ {(11<<2)|2,{101,45,0}}, +/* 10968 */ {(11<<2)|2,{101,45,0}}, +/* 10969 */ {(11<<2)|2,{101,45,0}}, +/* 10970 */ {(11<<2)|2,{101,45,0}}, +/* 10971 */ {(11<<2)|2,{101,45,0}}, +/* 10972 */ {(11<<2)|2,{101,45,0}}, +/* 10973 */ {(11<<2)|2,{101,45,0}}, +/* 10974 */ {(11<<2)|2,{101,45,0}}, +/* 10975 */ {(11<<2)|2,{101,45,0}}, +/* 10976 */ {(16<<2)|3,{101,46,48}}, +/* 10977 */ {(16<<2)|3,{101,46,49}}, +/* 10978 */ {(16<<2)|3,{101,46,50}}, +/* 10979 */ {(16<<2)|3,{101,46,97}}, +/* 10980 */ {(16<<2)|3,{101,46,99}}, +/* 10981 */ {(16<<2)|3,{101,46,101}}, +/* 10982 */ {(16<<2)|3,{101,46,105}}, +/* 10983 */ {(16<<2)|3,{101,46,111}}, +/* 10984 */ {(16<<2)|3,{101,46,115}}, +/* 10985 */ {(16<<2)|3,{101,46,116}}, +/* 10986 */ {(11<<2)|2,{101,46,0}}, +/* 10987 */ {(11<<2)|2,{101,46,0}}, +/* 10988 */ {(11<<2)|2,{101,46,0}}, +/* 10989 */ {(11<<2)|2,{101,46,0}}, +/* 10990 */ {(11<<2)|2,{101,46,0}}, +/* 10991 */ {(11<<2)|2,{101,46,0}}, +/* 10992 */ {(11<<2)|2,{101,46,0}}, +/* 10993 */ {(11<<2)|2,{101,46,0}}, +/* 10994 */ {(11<<2)|2,{101,46,0}}, +/* 10995 */ {(11<<2)|2,{101,46,0}}, +/* 10996 */ {(11<<2)|2,{101,46,0}}, +/* 10997 */ {(11<<2)|2,{101,46,0}}, +/* 10998 */ {(11<<2)|2,{101,46,0}}, +/* 10999 */ {(11<<2)|2,{101,46,0}}, +/* 11000 */ {(11<<2)|2,{101,46,0}}, +/* 11001 */ {(11<<2)|2,{101,46,0}}, +/* 11002 */ {(11<<2)|2,{101,46,0}}, +/* 11003 */ {(11<<2)|2,{101,46,0}}, +/* 11004 */ {(11<<2)|2,{101,46,0}}, +/* 11005 */ {(11<<2)|2,{101,46,0}}, +/* 11006 */ {(11<<2)|2,{101,46,0}}, +/* 11007 */ {(11<<2)|2,{101,46,0}}, +/* 11008 */ {(16<<2)|3,{101,47,48}}, +/* 11009 */ {(16<<2)|3,{101,47,49}}, +/* 11010 */ {(16<<2)|3,{101,47,50}}, +/* 11011 */ {(16<<2)|3,{101,47,97}}, +/* 11012 */ {(16<<2)|3,{101,47,99}}, +/* 11013 */ {(16<<2)|3,{101,47,101}}, +/* 11014 */ {(16<<2)|3,{101,47,105}}, +/* 11015 */ {(16<<2)|3,{101,47,111}}, +/* 11016 */ {(16<<2)|3,{101,47,115}}, +/* 11017 */ {(16<<2)|3,{101,47,116}}, +/* 11018 */ {(11<<2)|2,{101,47,0}}, +/* 11019 */ {(11<<2)|2,{101,47,0}}, +/* 11020 */ {(11<<2)|2,{101,47,0}}, +/* 11021 */ {(11<<2)|2,{101,47,0}}, +/* 11022 */ {(11<<2)|2,{101,47,0}}, +/* 11023 */ {(11<<2)|2,{101,47,0}}, +/* 11024 */ {(11<<2)|2,{101,47,0}}, +/* 11025 */ {(11<<2)|2,{101,47,0}}, +/* 11026 */ {(11<<2)|2,{101,47,0}}, +/* 11027 */ {(11<<2)|2,{101,47,0}}, +/* 11028 */ {(11<<2)|2,{101,47,0}}, +/* 11029 */ {(11<<2)|2,{101,47,0}}, +/* 11030 */ {(11<<2)|2,{101,47,0}}, +/* 11031 */ {(11<<2)|2,{101,47,0}}, +/* 11032 */ {(11<<2)|2,{101,47,0}}, +/* 11033 */ {(11<<2)|2,{101,47,0}}, +/* 11034 */ {(11<<2)|2,{101,47,0}}, +/* 11035 */ {(11<<2)|2,{101,47,0}}, +/* 11036 */ {(11<<2)|2,{101,47,0}}, +/* 11037 */ {(11<<2)|2,{101,47,0}}, +/* 11038 */ {(11<<2)|2,{101,47,0}}, +/* 11039 */ {(11<<2)|2,{101,47,0}}, +/* 11040 */ {(16<<2)|3,{101,51,48}}, +/* 11041 */ {(16<<2)|3,{101,51,49}}, +/* 11042 */ {(16<<2)|3,{101,51,50}}, +/* 11043 */ {(16<<2)|3,{101,51,97}}, +/* 11044 */ {(16<<2)|3,{101,51,99}}, +/* 11045 */ {(16<<2)|3,{101,51,101}}, +/* 11046 */ {(16<<2)|3,{101,51,105}}, +/* 11047 */ {(16<<2)|3,{101,51,111}}, +/* 11048 */ {(16<<2)|3,{101,51,115}}, +/* 11049 */ {(16<<2)|3,{101,51,116}}, +/* 11050 */ {(11<<2)|2,{101,51,0}}, +/* 11051 */ {(11<<2)|2,{101,51,0}}, +/* 11052 */ {(11<<2)|2,{101,51,0}}, +/* 11053 */ {(11<<2)|2,{101,51,0}}, +/* 11054 */ {(11<<2)|2,{101,51,0}}, +/* 11055 */ {(11<<2)|2,{101,51,0}}, +/* 11056 */ {(11<<2)|2,{101,51,0}}, +/* 11057 */ {(11<<2)|2,{101,51,0}}, +/* 11058 */ {(11<<2)|2,{101,51,0}}, +/* 11059 */ {(11<<2)|2,{101,51,0}}, +/* 11060 */ {(11<<2)|2,{101,51,0}}, +/* 11061 */ {(11<<2)|2,{101,51,0}}, +/* 11062 */ {(11<<2)|2,{101,51,0}}, +/* 11063 */ {(11<<2)|2,{101,51,0}}, +/* 11064 */ {(11<<2)|2,{101,51,0}}, +/* 11065 */ {(11<<2)|2,{101,51,0}}, +/* 11066 */ {(11<<2)|2,{101,51,0}}, +/* 11067 */ {(11<<2)|2,{101,51,0}}, +/* 11068 */ {(11<<2)|2,{101,51,0}}, +/* 11069 */ {(11<<2)|2,{101,51,0}}, +/* 11070 */ {(11<<2)|2,{101,51,0}}, +/* 11071 */ {(11<<2)|2,{101,51,0}}, +/* 11072 */ {(16<<2)|3,{101,52,48}}, +/* 11073 */ {(16<<2)|3,{101,52,49}}, +/* 11074 */ {(16<<2)|3,{101,52,50}}, +/* 11075 */ {(16<<2)|3,{101,52,97}}, +/* 11076 */ {(16<<2)|3,{101,52,99}}, +/* 11077 */ {(16<<2)|3,{101,52,101}}, +/* 11078 */ {(16<<2)|3,{101,52,105}}, +/* 11079 */ {(16<<2)|3,{101,52,111}}, +/* 11080 */ {(16<<2)|3,{101,52,115}}, +/* 11081 */ {(16<<2)|3,{101,52,116}}, +/* 11082 */ {(11<<2)|2,{101,52,0}}, +/* 11083 */ {(11<<2)|2,{101,52,0}}, +/* 11084 */ {(11<<2)|2,{101,52,0}}, +/* 11085 */ {(11<<2)|2,{101,52,0}}, +/* 11086 */ {(11<<2)|2,{101,52,0}}, +/* 11087 */ {(11<<2)|2,{101,52,0}}, +/* 11088 */ {(11<<2)|2,{101,52,0}}, +/* 11089 */ {(11<<2)|2,{101,52,0}}, +/* 11090 */ {(11<<2)|2,{101,52,0}}, +/* 11091 */ {(11<<2)|2,{101,52,0}}, +/* 11092 */ {(11<<2)|2,{101,52,0}}, +/* 11093 */ {(11<<2)|2,{101,52,0}}, +/* 11094 */ {(11<<2)|2,{101,52,0}}, +/* 11095 */ {(11<<2)|2,{101,52,0}}, +/* 11096 */ {(11<<2)|2,{101,52,0}}, +/* 11097 */ {(11<<2)|2,{101,52,0}}, +/* 11098 */ {(11<<2)|2,{101,52,0}}, +/* 11099 */ {(11<<2)|2,{101,52,0}}, +/* 11100 */ {(11<<2)|2,{101,52,0}}, +/* 11101 */ {(11<<2)|2,{101,52,0}}, +/* 11102 */ {(11<<2)|2,{101,52,0}}, +/* 11103 */ {(11<<2)|2,{101,52,0}}, +/* 11104 */ {(16<<2)|3,{101,53,48}}, +/* 11105 */ {(16<<2)|3,{101,53,49}}, +/* 11106 */ {(16<<2)|3,{101,53,50}}, +/* 11107 */ {(16<<2)|3,{101,53,97}}, +/* 11108 */ {(16<<2)|3,{101,53,99}}, +/* 11109 */ {(16<<2)|3,{101,53,101}}, +/* 11110 */ {(16<<2)|3,{101,53,105}}, +/* 11111 */ {(16<<2)|3,{101,53,111}}, +/* 11112 */ {(16<<2)|3,{101,53,115}}, +/* 11113 */ {(16<<2)|3,{101,53,116}}, +/* 11114 */ {(11<<2)|2,{101,53,0}}, +/* 11115 */ {(11<<2)|2,{101,53,0}}, +/* 11116 */ {(11<<2)|2,{101,53,0}}, +/* 11117 */ {(11<<2)|2,{101,53,0}}, +/* 11118 */ {(11<<2)|2,{101,53,0}}, +/* 11119 */ {(11<<2)|2,{101,53,0}}, +/* 11120 */ {(11<<2)|2,{101,53,0}}, +/* 11121 */ {(11<<2)|2,{101,53,0}}, +/* 11122 */ {(11<<2)|2,{101,53,0}}, +/* 11123 */ {(11<<2)|2,{101,53,0}}, +/* 11124 */ {(11<<2)|2,{101,53,0}}, +/* 11125 */ {(11<<2)|2,{101,53,0}}, +/* 11126 */ {(11<<2)|2,{101,53,0}}, +/* 11127 */ {(11<<2)|2,{101,53,0}}, +/* 11128 */ {(11<<2)|2,{101,53,0}}, +/* 11129 */ {(11<<2)|2,{101,53,0}}, +/* 11130 */ {(11<<2)|2,{101,53,0}}, +/* 11131 */ {(11<<2)|2,{101,53,0}}, +/* 11132 */ {(11<<2)|2,{101,53,0}}, +/* 11133 */ {(11<<2)|2,{101,53,0}}, +/* 11134 */ {(11<<2)|2,{101,53,0}}, +/* 11135 */ {(11<<2)|2,{101,53,0}}, +/* 11136 */ {(16<<2)|3,{101,54,48}}, +/* 11137 */ {(16<<2)|3,{101,54,49}}, +/* 11138 */ {(16<<2)|3,{101,54,50}}, +/* 11139 */ {(16<<2)|3,{101,54,97}}, +/* 11140 */ {(16<<2)|3,{101,54,99}}, +/* 11141 */ {(16<<2)|3,{101,54,101}}, +/* 11142 */ {(16<<2)|3,{101,54,105}}, +/* 11143 */ {(16<<2)|3,{101,54,111}}, +/* 11144 */ {(16<<2)|3,{101,54,115}}, +/* 11145 */ {(16<<2)|3,{101,54,116}}, +/* 11146 */ {(11<<2)|2,{101,54,0}}, +/* 11147 */ {(11<<2)|2,{101,54,0}}, +/* 11148 */ {(11<<2)|2,{101,54,0}}, +/* 11149 */ {(11<<2)|2,{101,54,0}}, +/* 11150 */ {(11<<2)|2,{101,54,0}}, +/* 11151 */ {(11<<2)|2,{101,54,0}}, +/* 11152 */ {(11<<2)|2,{101,54,0}}, +/* 11153 */ {(11<<2)|2,{101,54,0}}, +/* 11154 */ {(11<<2)|2,{101,54,0}}, +/* 11155 */ {(11<<2)|2,{101,54,0}}, +/* 11156 */ {(11<<2)|2,{101,54,0}}, +/* 11157 */ {(11<<2)|2,{101,54,0}}, +/* 11158 */ {(11<<2)|2,{101,54,0}}, +/* 11159 */ {(11<<2)|2,{101,54,0}}, +/* 11160 */ {(11<<2)|2,{101,54,0}}, +/* 11161 */ {(11<<2)|2,{101,54,0}}, +/* 11162 */ {(11<<2)|2,{101,54,0}}, +/* 11163 */ {(11<<2)|2,{101,54,0}}, +/* 11164 */ {(11<<2)|2,{101,54,0}}, +/* 11165 */ {(11<<2)|2,{101,54,0}}, +/* 11166 */ {(11<<2)|2,{101,54,0}}, +/* 11167 */ {(11<<2)|2,{101,54,0}}, +/* 11168 */ {(16<<2)|3,{101,55,48}}, +/* 11169 */ {(16<<2)|3,{101,55,49}}, +/* 11170 */ {(16<<2)|3,{101,55,50}}, +/* 11171 */ {(16<<2)|3,{101,55,97}}, +/* 11172 */ {(16<<2)|3,{101,55,99}}, +/* 11173 */ {(16<<2)|3,{101,55,101}}, +/* 11174 */ {(16<<2)|3,{101,55,105}}, +/* 11175 */ {(16<<2)|3,{101,55,111}}, +/* 11176 */ {(16<<2)|3,{101,55,115}}, +/* 11177 */ {(16<<2)|3,{101,55,116}}, +/* 11178 */ {(11<<2)|2,{101,55,0}}, +/* 11179 */ {(11<<2)|2,{101,55,0}}, +/* 11180 */ {(11<<2)|2,{101,55,0}}, +/* 11181 */ {(11<<2)|2,{101,55,0}}, +/* 11182 */ {(11<<2)|2,{101,55,0}}, +/* 11183 */ {(11<<2)|2,{101,55,0}}, +/* 11184 */ {(11<<2)|2,{101,55,0}}, +/* 11185 */ {(11<<2)|2,{101,55,0}}, +/* 11186 */ {(11<<2)|2,{101,55,0}}, +/* 11187 */ {(11<<2)|2,{101,55,0}}, +/* 11188 */ {(11<<2)|2,{101,55,0}}, +/* 11189 */ {(11<<2)|2,{101,55,0}}, +/* 11190 */ {(11<<2)|2,{101,55,0}}, +/* 11191 */ {(11<<2)|2,{101,55,0}}, +/* 11192 */ {(11<<2)|2,{101,55,0}}, +/* 11193 */ {(11<<2)|2,{101,55,0}}, +/* 11194 */ {(11<<2)|2,{101,55,0}}, +/* 11195 */ {(11<<2)|2,{101,55,0}}, +/* 11196 */ {(11<<2)|2,{101,55,0}}, +/* 11197 */ {(11<<2)|2,{101,55,0}}, +/* 11198 */ {(11<<2)|2,{101,55,0}}, +/* 11199 */ {(11<<2)|2,{101,55,0}}, +/* 11200 */ {(16<<2)|3,{101,56,48}}, +/* 11201 */ {(16<<2)|3,{101,56,49}}, +/* 11202 */ {(16<<2)|3,{101,56,50}}, +/* 11203 */ {(16<<2)|3,{101,56,97}}, +/* 11204 */ {(16<<2)|3,{101,56,99}}, +/* 11205 */ {(16<<2)|3,{101,56,101}}, +/* 11206 */ {(16<<2)|3,{101,56,105}}, +/* 11207 */ {(16<<2)|3,{101,56,111}}, +/* 11208 */ {(16<<2)|3,{101,56,115}}, +/* 11209 */ {(16<<2)|3,{101,56,116}}, +/* 11210 */ {(11<<2)|2,{101,56,0}}, +/* 11211 */ {(11<<2)|2,{101,56,0}}, +/* 11212 */ {(11<<2)|2,{101,56,0}}, +/* 11213 */ {(11<<2)|2,{101,56,0}}, +/* 11214 */ {(11<<2)|2,{101,56,0}}, +/* 11215 */ {(11<<2)|2,{101,56,0}}, +/* 11216 */ {(11<<2)|2,{101,56,0}}, +/* 11217 */ {(11<<2)|2,{101,56,0}}, +/* 11218 */ {(11<<2)|2,{101,56,0}}, +/* 11219 */ {(11<<2)|2,{101,56,0}}, +/* 11220 */ {(11<<2)|2,{101,56,0}}, +/* 11221 */ {(11<<2)|2,{101,56,0}}, +/* 11222 */ {(11<<2)|2,{101,56,0}}, +/* 11223 */ {(11<<2)|2,{101,56,0}}, +/* 11224 */ {(11<<2)|2,{101,56,0}}, +/* 11225 */ {(11<<2)|2,{101,56,0}}, +/* 11226 */ {(11<<2)|2,{101,56,0}}, +/* 11227 */ {(11<<2)|2,{101,56,0}}, +/* 11228 */ {(11<<2)|2,{101,56,0}}, +/* 11229 */ {(11<<2)|2,{101,56,0}}, +/* 11230 */ {(11<<2)|2,{101,56,0}}, +/* 11231 */ {(11<<2)|2,{101,56,0}}, +/* 11232 */ {(16<<2)|3,{101,57,48}}, +/* 11233 */ {(16<<2)|3,{101,57,49}}, +/* 11234 */ {(16<<2)|3,{101,57,50}}, +/* 11235 */ {(16<<2)|3,{101,57,97}}, +/* 11236 */ {(16<<2)|3,{101,57,99}}, +/* 11237 */ {(16<<2)|3,{101,57,101}}, +/* 11238 */ {(16<<2)|3,{101,57,105}}, +/* 11239 */ {(16<<2)|3,{101,57,111}}, +/* 11240 */ {(16<<2)|3,{101,57,115}}, +/* 11241 */ {(16<<2)|3,{101,57,116}}, +/* 11242 */ {(11<<2)|2,{101,57,0}}, +/* 11243 */ {(11<<2)|2,{101,57,0}}, +/* 11244 */ {(11<<2)|2,{101,57,0}}, +/* 11245 */ {(11<<2)|2,{101,57,0}}, +/* 11246 */ {(11<<2)|2,{101,57,0}}, +/* 11247 */ {(11<<2)|2,{101,57,0}}, +/* 11248 */ {(11<<2)|2,{101,57,0}}, +/* 11249 */ {(11<<2)|2,{101,57,0}}, +/* 11250 */ {(11<<2)|2,{101,57,0}}, +/* 11251 */ {(11<<2)|2,{101,57,0}}, +/* 11252 */ {(11<<2)|2,{101,57,0}}, +/* 11253 */ {(11<<2)|2,{101,57,0}}, +/* 11254 */ {(11<<2)|2,{101,57,0}}, +/* 11255 */ {(11<<2)|2,{101,57,0}}, +/* 11256 */ {(11<<2)|2,{101,57,0}}, +/* 11257 */ {(11<<2)|2,{101,57,0}}, +/* 11258 */ {(11<<2)|2,{101,57,0}}, +/* 11259 */ {(11<<2)|2,{101,57,0}}, +/* 11260 */ {(11<<2)|2,{101,57,0}}, +/* 11261 */ {(11<<2)|2,{101,57,0}}, +/* 11262 */ {(11<<2)|2,{101,57,0}}, +/* 11263 */ {(11<<2)|2,{101,57,0}}, +/* 11264 */ {(16<<2)|3,{101,61,48}}, +/* 11265 */ {(16<<2)|3,{101,61,49}}, +/* 11266 */ {(16<<2)|3,{101,61,50}}, +/* 11267 */ {(16<<2)|3,{101,61,97}}, +/* 11268 */ {(16<<2)|3,{101,61,99}}, +/* 11269 */ {(16<<2)|3,{101,61,101}}, +/* 11270 */ {(16<<2)|3,{101,61,105}}, +/* 11271 */ {(16<<2)|3,{101,61,111}}, +/* 11272 */ {(16<<2)|3,{101,61,115}}, +/* 11273 */ {(16<<2)|3,{101,61,116}}, +/* 11274 */ {(11<<2)|2,{101,61,0}}, +/* 11275 */ {(11<<2)|2,{101,61,0}}, +/* 11276 */ {(11<<2)|2,{101,61,0}}, +/* 11277 */ {(11<<2)|2,{101,61,0}}, +/* 11278 */ {(11<<2)|2,{101,61,0}}, +/* 11279 */ {(11<<2)|2,{101,61,0}}, +/* 11280 */ {(11<<2)|2,{101,61,0}}, +/* 11281 */ {(11<<2)|2,{101,61,0}}, +/* 11282 */ {(11<<2)|2,{101,61,0}}, +/* 11283 */ {(11<<2)|2,{101,61,0}}, +/* 11284 */ {(11<<2)|2,{101,61,0}}, +/* 11285 */ {(11<<2)|2,{101,61,0}}, +/* 11286 */ {(11<<2)|2,{101,61,0}}, +/* 11287 */ {(11<<2)|2,{101,61,0}}, +/* 11288 */ {(11<<2)|2,{101,61,0}}, +/* 11289 */ {(11<<2)|2,{101,61,0}}, +/* 11290 */ {(11<<2)|2,{101,61,0}}, +/* 11291 */ {(11<<2)|2,{101,61,0}}, +/* 11292 */ {(11<<2)|2,{101,61,0}}, +/* 11293 */ {(11<<2)|2,{101,61,0}}, +/* 11294 */ {(11<<2)|2,{101,61,0}}, +/* 11295 */ {(11<<2)|2,{101,61,0}}, +/* 11296 */ {(16<<2)|3,{101,65,48}}, +/* 11297 */ {(16<<2)|3,{101,65,49}}, +/* 11298 */ {(16<<2)|3,{101,65,50}}, +/* 11299 */ {(16<<2)|3,{101,65,97}}, +/* 11300 */ {(16<<2)|3,{101,65,99}}, +/* 11301 */ {(16<<2)|3,{101,65,101}}, +/* 11302 */ {(16<<2)|3,{101,65,105}}, +/* 11303 */ {(16<<2)|3,{101,65,111}}, +/* 11304 */ {(16<<2)|3,{101,65,115}}, +/* 11305 */ {(16<<2)|3,{101,65,116}}, +/* 11306 */ {(11<<2)|2,{101,65,0}}, +/* 11307 */ {(11<<2)|2,{101,65,0}}, +/* 11308 */ {(11<<2)|2,{101,65,0}}, +/* 11309 */ {(11<<2)|2,{101,65,0}}, +/* 11310 */ {(11<<2)|2,{101,65,0}}, +/* 11311 */ {(11<<2)|2,{101,65,0}}, +/* 11312 */ {(11<<2)|2,{101,65,0}}, +/* 11313 */ {(11<<2)|2,{101,65,0}}, +/* 11314 */ {(11<<2)|2,{101,65,0}}, +/* 11315 */ {(11<<2)|2,{101,65,0}}, +/* 11316 */ {(11<<2)|2,{101,65,0}}, +/* 11317 */ {(11<<2)|2,{101,65,0}}, +/* 11318 */ {(11<<2)|2,{101,65,0}}, +/* 11319 */ {(11<<2)|2,{101,65,0}}, +/* 11320 */ {(11<<2)|2,{101,65,0}}, +/* 11321 */ {(11<<2)|2,{101,65,0}}, +/* 11322 */ {(11<<2)|2,{101,65,0}}, +/* 11323 */ {(11<<2)|2,{101,65,0}}, +/* 11324 */ {(11<<2)|2,{101,65,0}}, +/* 11325 */ {(11<<2)|2,{101,65,0}}, +/* 11326 */ {(11<<2)|2,{101,65,0}}, +/* 11327 */ {(11<<2)|2,{101,65,0}}, +/* 11328 */ {(16<<2)|3,{101,95,48}}, +/* 11329 */ {(16<<2)|3,{101,95,49}}, +/* 11330 */ {(16<<2)|3,{101,95,50}}, +/* 11331 */ {(16<<2)|3,{101,95,97}}, +/* 11332 */ {(16<<2)|3,{101,95,99}}, +/* 11333 */ {(16<<2)|3,{101,95,101}}, +/* 11334 */ {(16<<2)|3,{101,95,105}}, +/* 11335 */ {(16<<2)|3,{101,95,111}}, +/* 11336 */ {(16<<2)|3,{101,95,115}}, +/* 11337 */ {(16<<2)|3,{101,95,116}}, +/* 11338 */ {(11<<2)|2,{101,95,0}}, +/* 11339 */ {(11<<2)|2,{101,95,0}}, +/* 11340 */ {(11<<2)|2,{101,95,0}}, +/* 11341 */ {(11<<2)|2,{101,95,0}}, +/* 11342 */ {(11<<2)|2,{101,95,0}}, +/* 11343 */ {(11<<2)|2,{101,95,0}}, +/* 11344 */ {(11<<2)|2,{101,95,0}}, +/* 11345 */ {(11<<2)|2,{101,95,0}}, +/* 11346 */ {(11<<2)|2,{101,95,0}}, +/* 11347 */ {(11<<2)|2,{101,95,0}}, +/* 11348 */ {(11<<2)|2,{101,95,0}}, +/* 11349 */ {(11<<2)|2,{101,95,0}}, +/* 11350 */ {(11<<2)|2,{101,95,0}}, +/* 11351 */ {(11<<2)|2,{101,95,0}}, +/* 11352 */ {(11<<2)|2,{101,95,0}}, +/* 11353 */ {(11<<2)|2,{101,95,0}}, +/* 11354 */ {(11<<2)|2,{101,95,0}}, +/* 11355 */ {(11<<2)|2,{101,95,0}}, +/* 11356 */ {(11<<2)|2,{101,95,0}}, +/* 11357 */ {(11<<2)|2,{101,95,0}}, +/* 11358 */ {(11<<2)|2,{101,95,0}}, +/* 11359 */ {(11<<2)|2,{101,95,0}}, +/* 11360 */ {(16<<2)|3,{101,98,48}}, +/* 11361 */ {(16<<2)|3,{101,98,49}}, +/* 11362 */ {(16<<2)|3,{101,98,50}}, +/* 11363 */ {(16<<2)|3,{101,98,97}}, +/* 11364 */ {(16<<2)|3,{101,98,99}}, +/* 11365 */ {(16<<2)|3,{101,98,101}}, +/* 11366 */ {(16<<2)|3,{101,98,105}}, +/* 11367 */ {(16<<2)|3,{101,98,111}}, +/* 11368 */ {(16<<2)|3,{101,98,115}}, +/* 11369 */ {(16<<2)|3,{101,98,116}}, +/* 11370 */ {(11<<2)|2,{101,98,0}}, +/* 11371 */ {(11<<2)|2,{101,98,0}}, +/* 11372 */ {(11<<2)|2,{101,98,0}}, +/* 11373 */ {(11<<2)|2,{101,98,0}}, +/* 11374 */ {(11<<2)|2,{101,98,0}}, +/* 11375 */ {(11<<2)|2,{101,98,0}}, +/* 11376 */ {(11<<2)|2,{101,98,0}}, +/* 11377 */ {(11<<2)|2,{101,98,0}}, +/* 11378 */ {(11<<2)|2,{101,98,0}}, +/* 11379 */ {(11<<2)|2,{101,98,0}}, +/* 11380 */ {(11<<2)|2,{101,98,0}}, +/* 11381 */ {(11<<2)|2,{101,98,0}}, +/* 11382 */ {(11<<2)|2,{101,98,0}}, +/* 11383 */ {(11<<2)|2,{101,98,0}}, +/* 11384 */ {(11<<2)|2,{101,98,0}}, +/* 11385 */ {(11<<2)|2,{101,98,0}}, +/* 11386 */ {(11<<2)|2,{101,98,0}}, +/* 11387 */ {(11<<2)|2,{101,98,0}}, +/* 11388 */ {(11<<2)|2,{101,98,0}}, +/* 11389 */ {(11<<2)|2,{101,98,0}}, +/* 11390 */ {(11<<2)|2,{101,98,0}}, +/* 11391 */ {(11<<2)|2,{101,98,0}}, +/* 11392 */ {(16<<2)|3,{101,100,48}}, +/* 11393 */ {(16<<2)|3,{101,100,49}}, +/* 11394 */ {(16<<2)|3,{101,100,50}}, +/* 11395 */ {(16<<2)|3,{101,100,97}}, +/* 11396 */ {(16<<2)|3,{101,100,99}}, +/* 11397 */ {(16<<2)|3,{101,100,101}}, +/* 11398 */ {(16<<2)|3,{101,100,105}}, +/* 11399 */ {(16<<2)|3,{101,100,111}}, +/* 11400 */ {(16<<2)|3,{101,100,115}}, +/* 11401 */ {(16<<2)|3,{101,100,116}}, +/* 11402 */ {(11<<2)|2,{101,100,0}}, +/* 11403 */ {(11<<2)|2,{101,100,0}}, +/* 11404 */ {(11<<2)|2,{101,100,0}}, +/* 11405 */ {(11<<2)|2,{101,100,0}}, +/* 11406 */ {(11<<2)|2,{101,100,0}}, +/* 11407 */ {(11<<2)|2,{101,100,0}}, +/* 11408 */ {(11<<2)|2,{101,100,0}}, +/* 11409 */ {(11<<2)|2,{101,100,0}}, +/* 11410 */ {(11<<2)|2,{101,100,0}}, +/* 11411 */ {(11<<2)|2,{101,100,0}}, +/* 11412 */ {(11<<2)|2,{101,100,0}}, +/* 11413 */ {(11<<2)|2,{101,100,0}}, +/* 11414 */ {(11<<2)|2,{101,100,0}}, +/* 11415 */ {(11<<2)|2,{101,100,0}}, +/* 11416 */ {(11<<2)|2,{101,100,0}}, +/* 11417 */ {(11<<2)|2,{101,100,0}}, +/* 11418 */ {(11<<2)|2,{101,100,0}}, +/* 11419 */ {(11<<2)|2,{101,100,0}}, +/* 11420 */ {(11<<2)|2,{101,100,0}}, +/* 11421 */ {(11<<2)|2,{101,100,0}}, +/* 11422 */ {(11<<2)|2,{101,100,0}}, +/* 11423 */ {(11<<2)|2,{101,100,0}}, +/* 11424 */ {(16<<2)|3,{101,102,48}}, +/* 11425 */ {(16<<2)|3,{101,102,49}}, +/* 11426 */ {(16<<2)|3,{101,102,50}}, +/* 11427 */ {(16<<2)|3,{101,102,97}}, +/* 11428 */ {(16<<2)|3,{101,102,99}}, +/* 11429 */ {(16<<2)|3,{101,102,101}}, +/* 11430 */ {(16<<2)|3,{101,102,105}}, +/* 11431 */ {(16<<2)|3,{101,102,111}}, +/* 11432 */ {(16<<2)|3,{101,102,115}}, +/* 11433 */ {(16<<2)|3,{101,102,116}}, +/* 11434 */ {(11<<2)|2,{101,102,0}}, +/* 11435 */ {(11<<2)|2,{101,102,0}}, +/* 11436 */ {(11<<2)|2,{101,102,0}}, +/* 11437 */ {(11<<2)|2,{101,102,0}}, +/* 11438 */ {(11<<2)|2,{101,102,0}}, +/* 11439 */ {(11<<2)|2,{101,102,0}}, +/* 11440 */ {(11<<2)|2,{101,102,0}}, +/* 11441 */ {(11<<2)|2,{101,102,0}}, +/* 11442 */ {(11<<2)|2,{101,102,0}}, +/* 11443 */ {(11<<2)|2,{101,102,0}}, +/* 11444 */ {(11<<2)|2,{101,102,0}}, +/* 11445 */ {(11<<2)|2,{101,102,0}}, +/* 11446 */ {(11<<2)|2,{101,102,0}}, +/* 11447 */ {(11<<2)|2,{101,102,0}}, +/* 11448 */ {(11<<2)|2,{101,102,0}}, +/* 11449 */ {(11<<2)|2,{101,102,0}}, +/* 11450 */ {(11<<2)|2,{101,102,0}}, +/* 11451 */ {(11<<2)|2,{101,102,0}}, +/* 11452 */ {(11<<2)|2,{101,102,0}}, +/* 11453 */ {(11<<2)|2,{101,102,0}}, +/* 11454 */ {(11<<2)|2,{101,102,0}}, +/* 11455 */ {(11<<2)|2,{101,102,0}}, +/* 11456 */ {(16<<2)|3,{101,103,48}}, +/* 11457 */ {(16<<2)|3,{101,103,49}}, +/* 11458 */ {(16<<2)|3,{101,103,50}}, +/* 11459 */ {(16<<2)|3,{101,103,97}}, +/* 11460 */ {(16<<2)|3,{101,103,99}}, +/* 11461 */ {(16<<2)|3,{101,103,101}}, +/* 11462 */ {(16<<2)|3,{101,103,105}}, +/* 11463 */ {(16<<2)|3,{101,103,111}}, +/* 11464 */ {(16<<2)|3,{101,103,115}}, +/* 11465 */ {(16<<2)|3,{101,103,116}}, +/* 11466 */ {(11<<2)|2,{101,103,0}}, +/* 11467 */ {(11<<2)|2,{101,103,0}}, +/* 11468 */ {(11<<2)|2,{101,103,0}}, +/* 11469 */ {(11<<2)|2,{101,103,0}}, +/* 11470 */ {(11<<2)|2,{101,103,0}}, +/* 11471 */ {(11<<2)|2,{101,103,0}}, +/* 11472 */ {(11<<2)|2,{101,103,0}}, +/* 11473 */ {(11<<2)|2,{101,103,0}}, +/* 11474 */ {(11<<2)|2,{101,103,0}}, +/* 11475 */ {(11<<2)|2,{101,103,0}}, +/* 11476 */ {(11<<2)|2,{101,103,0}}, +/* 11477 */ {(11<<2)|2,{101,103,0}}, +/* 11478 */ {(11<<2)|2,{101,103,0}}, +/* 11479 */ {(11<<2)|2,{101,103,0}}, +/* 11480 */ {(11<<2)|2,{101,103,0}}, +/* 11481 */ {(11<<2)|2,{101,103,0}}, +/* 11482 */ {(11<<2)|2,{101,103,0}}, +/* 11483 */ {(11<<2)|2,{101,103,0}}, +/* 11484 */ {(11<<2)|2,{101,103,0}}, +/* 11485 */ {(11<<2)|2,{101,103,0}}, +/* 11486 */ {(11<<2)|2,{101,103,0}}, +/* 11487 */ {(11<<2)|2,{101,103,0}}, +/* 11488 */ {(16<<2)|3,{101,104,48}}, +/* 11489 */ {(16<<2)|3,{101,104,49}}, +/* 11490 */ {(16<<2)|3,{101,104,50}}, +/* 11491 */ {(16<<2)|3,{101,104,97}}, +/* 11492 */ {(16<<2)|3,{101,104,99}}, +/* 11493 */ {(16<<2)|3,{101,104,101}}, +/* 11494 */ {(16<<2)|3,{101,104,105}}, +/* 11495 */ {(16<<2)|3,{101,104,111}}, +/* 11496 */ {(16<<2)|3,{101,104,115}}, +/* 11497 */ {(16<<2)|3,{101,104,116}}, +/* 11498 */ {(11<<2)|2,{101,104,0}}, +/* 11499 */ {(11<<2)|2,{101,104,0}}, +/* 11500 */ {(11<<2)|2,{101,104,0}}, +/* 11501 */ {(11<<2)|2,{101,104,0}}, +/* 11502 */ {(11<<2)|2,{101,104,0}}, +/* 11503 */ {(11<<2)|2,{101,104,0}}, +/* 11504 */ {(11<<2)|2,{101,104,0}}, +/* 11505 */ {(11<<2)|2,{101,104,0}}, +/* 11506 */ {(11<<2)|2,{101,104,0}}, +/* 11507 */ {(11<<2)|2,{101,104,0}}, +/* 11508 */ {(11<<2)|2,{101,104,0}}, +/* 11509 */ {(11<<2)|2,{101,104,0}}, +/* 11510 */ {(11<<2)|2,{101,104,0}}, +/* 11511 */ {(11<<2)|2,{101,104,0}}, +/* 11512 */ {(11<<2)|2,{101,104,0}}, +/* 11513 */ {(11<<2)|2,{101,104,0}}, +/* 11514 */ {(11<<2)|2,{101,104,0}}, +/* 11515 */ {(11<<2)|2,{101,104,0}}, +/* 11516 */ {(11<<2)|2,{101,104,0}}, +/* 11517 */ {(11<<2)|2,{101,104,0}}, +/* 11518 */ {(11<<2)|2,{101,104,0}}, +/* 11519 */ {(11<<2)|2,{101,104,0}}, +/* 11520 */ {(16<<2)|3,{101,108,48}}, +/* 11521 */ {(16<<2)|3,{101,108,49}}, +/* 11522 */ {(16<<2)|3,{101,108,50}}, +/* 11523 */ {(16<<2)|3,{101,108,97}}, +/* 11524 */ {(16<<2)|3,{101,108,99}}, +/* 11525 */ {(16<<2)|3,{101,108,101}}, +/* 11526 */ {(16<<2)|3,{101,108,105}}, +/* 11527 */ {(16<<2)|3,{101,108,111}}, +/* 11528 */ {(16<<2)|3,{101,108,115}}, +/* 11529 */ {(16<<2)|3,{101,108,116}}, +/* 11530 */ {(11<<2)|2,{101,108,0}}, +/* 11531 */ {(11<<2)|2,{101,108,0}}, +/* 11532 */ {(11<<2)|2,{101,108,0}}, +/* 11533 */ {(11<<2)|2,{101,108,0}}, +/* 11534 */ {(11<<2)|2,{101,108,0}}, +/* 11535 */ {(11<<2)|2,{101,108,0}}, +/* 11536 */ {(11<<2)|2,{101,108,0}}, +/* 11537 */ {(11<<2)|2,{101,108,0}}, +/* 11538 */ {(11<<2)|2,{101,108,0}}, +/* 11539 */ {(11<<2)|2,{101,108,0}}, +/* 11540 */ {(11<<2)|2,{101,108,0}}, +/* 11541 */ {(11<<2)|2,{101,108,0}}, +/* 11542 */ {(11<<2)|2,{101,108,0}}, +/* 11543 */ {(11<<2)|2,{101,108,0}}, +/* 11544 */ {(11<<2)|2,{101,108,0}}, +/* 11545 */ {(11<<2)|2,{101,108,0}}, +/* 11546 */ {(11<<2)|2,{101,108,0}}, +/* 11547 */ {(11<<2)|2,{101,108,0}}, +/* 11548 */ {(11<<2)|2,{101,108,0}}, +/* 11549 */ {(11<<2)|2,{101,108,0}}, +/* 11550 */ {(11<<2)|2,{101,108,0}}, +/* 11551 */ {(11<<2)|2,{101,108,0}}, +/* 11552 */ {(16<<2)|3,{101,109,48}}, +/* 11553 */ {(16<<2)|3,{101,109,49}}, +/* 11554 */ {(16<<2)|3,{101,109,50}}, +/* 11555 */ {(16<<2)|3,{101,109,97}}, +/* 11556 */ {(16<<2)|3,{101,109,99}}, +/* 11557 */ {(16<<2)|3,{101,109,101}}, +/* 11558 */ {(16<<2)|3,{101,109,105}}, +/* 11559 */ {(16<<2)|3,{101,109,111}}, +/* 11560 */ {(16<<2)|3,{101,109,115}}, +/* 11561 */ {(16<<2)|3,{101,109,116}}, +/* 11562 */ {(11<<2)|2,{101,109,0}}, +/* 11563 */ {(11<<2)|2,{101,109,0}}, +/* 11564 */ {(11<<2)|2,{101,109,0}}, +/* 11565 */ {(11<<2)|2,{101,109,0}}, +/* 11566 */ {(11<<2)|2,{101,109,0}}, +/* 11567 */ {(11<<2)|2,{101,109,0}}, +/* 11568 */ {(11<<2)|2,{101,109,0}}, +/* 11569 */ {(11<<2)|2,{101,109,0}}, +/* 11570 */ {(11<<2)|2,{101,109,0}}, +/* 11571 */ {(11<<2)|2,{101,109,0}}, +/* 11572 */ {(11<<2)|2,{101,109,0}}, +/* 11573 */ {(11<<2)|2,{101,109,0}}, +/* 11574 */ {(11<<2)|2,{101,109,0}}, +/* 11575 */ {(11<<2)|2,{101,109,0}}, +/* 11576 */ {(11<<2)|2,{101,109,0}}, +/* 11577 */ {(11<<2)|2,{101,109,0}}, +/* 11578 */ {(11<<2)|2,{101,109,0}}, +/* 11579 */ {(11<<2)|2,{101,109,0}}, +/* 11580 */ {(11<<2)|2,{101,109,0}}, +/* 11581 */ {(11<<2)|2,{101,109,0}}, +/* 11582 */ {(11<<2)|2,{101,109,0}}, +/* 11583 */ {(11<<2)|2,{101,109,0}}, +/* 11584 */ {(16<<2)|3,{101,110,48}}, +/* 11585 */ {(16<<2)|3,{101,110,49}}, +/* 11586 */ {(16<<2)|3,{101,110,50}}, +/* 11587 */ {(16<<2)|3,{101,110,97}}, +/* 11588 */ {(16<<2)|3,{101,110,99}}, +/* 11589 */ {(16<<2)|3,{101,110,101}}, +/* 11590 */ {(16<<2)|3,{101,110,105}}, +/* 11591 */ {(16<<2)|3,{101,110,111}}, +/* 11592 */ {(16<<2)|3,{101,110,115}}, +/* 11593 */ {(16<<2)|3,{101,110,116}}, +/* 11594 */ {(11<<2)|2,{101,110,0}}, +/* 11595 */ {(11<<2)|2,{101,110,0}}, +/* 11596 */ {(11<<2)|2,{101,110,0}}, +/* 11597 */ {(11<<2)|2,{101,110,0}}, +/* 11598 */ {(11<<2)|2,{101,110,0}}, +/* 11599 */ {(11<<2)|2,{101,110,0}}, +/* 11600 */ {(11<<2)|2,{101,110,0}}, +/* 11601 */ {(11<<2)|2,{101,110,0}}, +/* 11602 */ {(11<<2)|2,{101,110,0}}, +/* 11603 */ {(11<<2)|2,{101,110,0}}, +/* 11604 */ {(11<<2)|2,{101,110,0}}, +/* 11605 */ {(11<<2)|2,{101,110,0}}, +/* 11606 */ {(11<<2)|2,{101,110,0}}, +/* 11607 */ {(11<<2)|2,{101,110,0}}, +/* 11608 */ {(11<<2)|2,{101,110,0}}, +/* 11609 */ {(11<<2)|2,{101,110,0}}, +/* 11610 */ {(11<<2)|2,{101,110,0}}, +/* 11611 */ {(11<<2)|2,{101,110,0}}, +/* 11612 */ {(11<<2)|2,{101,110,0}}, +/* 11613 */ {(11<<2)|2,{101,110,0}}, +/* 11614 */ {(11<<2)|2,{101,110,0}}, +/* 11615 */ {(11<<2)|2,{101,110,0}}, +/* 11616 */ {(16<<2)|3,{101,112,48}}, +/* 11617 */ {(16<<2)|3,{101,112,49}}, +/* 11618 */ {(16<<2)|3,{101,112,50}}, +/* 11619 */ {(16<<2)|3,{101,112,97}}, +/* 11620 */ {(16<<2)|3,{101,112,99}}, +/* 11621 */ {(16<<2)|3,{101,112,101}}, +/* 11622 */ {(16<<2)|3,{101,112,105}}, +/* 11623 */ {(16<<2)|3,{101,112,111}}, +/* 11624 */ {(16<<2)|3,{101,112,115}}, +/* 11625 */ {(16<<2)|3,{101,112,116}}, +/* 11626 */ {(11<<2)|2,{101,112,0}}, +/* 11627 */ {(11<<2)|2,{101,112,0}}, +/* 11628 */ {(11<<2)|2,{101,112,0}}, +/* 11629 */ {(11<<2)|2,{101,112,0}}, +/* 11630 */ {(11<<2)|2,{101,112,0}}, +/* 11631 */ {(11<<2)|2,{101,112,0}}, +/* 11632 */ {(11<<2)|2,{101,112,0}}, +/* 11633 */ {(11<<2)|2,{101,112,0}}, +/* 11634 */ {(11<<2)|2,{101,112,0}}, +/* 11635 */ {(11<<2)|2,{101,112,0}}, +/* 11636 */ {(11<<2)|2,{101,112,0}}, +/* 11637 */ {(11<<2)|2,{101,112,0}}, +/* 11638 */ {(11<<2)|2,{101,112,0}}, +/* 11639 */ {(11<<2)|2,{101,112,0}}, +/* 11640 */ {(11<<2)|2,{101,112,0}}, +/* 11641 */ {(11<<2)|2,{101,112,0}}, +/* 11642 */ {(11<<2)|2,{101,112,0}}, +/* 11643 */ {(11<<2)|2,{101,112,0}}, +/* 11644 */ {(11<<2)|2,{101,112,0}}, +/* 11645 */ {(11<<2)|2,{101,112,0}}, +/* 11646 */ {(11<<2)|2,{101,112,0}}, +/* 11647 */ {(11<<2)|2,{101,112,0}}, +/* 11648 */ {(16<<2)|3,{101,114,48}}, +/* 11649 */ {(16<<2)|3,{101,114,49}}, +/* 11650 */ {(16<<2)|3,{101,114,50}}, +/* 11651 */ {(16<<2)|3,{101,114,97}}, +/* 11652 */ {(16<<2)|3,{101,114,99}}, +/* 11653 */ {(16<<2)|3,{101,114,101}}, +/* 11654 */ {(16<<2)|3,{101,114,105}}, +/* 11655 */ {(16<<2)|3,{101,114,111}}, +/* 11656 */ {(16<<2)|3,{101,114,115}}, +/* 11657 */ {(16<<2)|3,{101,114,116}}, +/* 11658 */ {(11<<2)|2,{101,114,0}}, +/* 11659 */ {(11<<2)|2,{101,114,0}}, +/* 11660 */ {(11<<2)|2,{101,114,0}}, +/* 11661 */ {(11<<2)|2,{101,114,0}}, +/* 11662 */ {(11<<2)|2,{101,114,0}}, +/* 11663 */ {(11<<2)|2,{101,114,0}}, +/* 11664 */ {(11<<2)|2,{101,114,0}}, +/* 11665 */ {(11<<2)|2,{101,114,0}}, +/* 11666 */ {(11<<2)|2,{101,114,0}}, +/* 11667 */ {(11<<2)|2,{101,114,0}}, +/* 11668 */ {(11<<2)|2,{101,114,0}}, +/* 11669 */ {(11<<2)|2,{101,114,0}}, +/* 11670 */ {(11<<2)|2,{101,114,0}}, +/* 11671 */ {(11<<2)|2,{101,114,0}}, +/* 11672 */ {(11<<2)|2,{101,114,0}}, +/* 11673 */ {(11<<2)|2,{101,114,0}}, +/* 11674 */ {(11<<2)|2,{101,114,0}}, +/* 11675 */ {(11<<2)|2,{101,114,0}}, +/* 11676 */ {(11<<2)|2,{101,114,0}}, +/* 11677 */ {(11<<2)|2,{101,114,0}}, +/* 11678 */ {(11<<2)|2,{101,114,0}}, +/* 11679 */ {(11<<2)|2,{101,114,0}}, +/* 11680 */ {(16<<2)|3,{101,117,48}}, +/* 11681 */ {(16<<2)|3,{101,117,49}}, +/* 11682 */ {(16<<2)|3,{101,117,50}}, +/* 11683 */ {(16<<2)|3,{101,117,97}}, +/* 11684 */ {(16<<2)|3,{101,117,99}}, +/* 11685 */ {(16<<2)|3,{101,117,101}}, +/* 11686 */ {(16<<2)|3,{101,117,105}}, +/* 11687 */ {(16<<2)|3,{101,117,111}}, +/* 11688 */ {(16<<2)|3,{101,117,115}}, +/* 11689 */ {(16<<2)|3,{101,117,116}}, +/* 11690 */ {(11<<2)|2,{101,117,0}}, +/* 11691 */ {(11<<2)|2,{101,117,0}}, +/* 11692 */ {(11<<2)|2,{101,117,0}}, +/* 11693 */ {(11<<2)|2,{101,117,0}}, +/* 11694 */ {(11<<2)|2,{101,117,0}}, +/* 11695 */ {(11<<2)|2,{101,117,0}}, +/* 11696 */ {(11<<2)|2,{101,117,0}}, +/* 11697 */ {(11<<2)|2,{101,117,0}}, +/* 11698 */ {(11<<2)|2,{101,117,0}}, +/* 11699 */ {(11<<2)|2,{101,117,0}}, +/* 11700 */ {(11<<2)|2,{101,117,0}}, +/* 11701 */ {(11<<2)|2,{101,117,0}}, +/* 11702 */ {(11<<2)|2,{101,117,0}}, +/* 11703 */ {(11<<2)|2,{101,117,0}}, +/* 11704 */ {(11<<2)|2,{101,117,0}}, +/* 11705 */ {(11<<2)|2,{101,117,0}}, +/* 11706 */ {(11<<2)|2,{101,117,0}}, +/* 11707 */ {(11<<2)|2,{101,117,0}}, +/* 11708 */ {(11<<2)|2,{101,117,0}}, +/* 11709 */ {(11<<2)|2,{101,117,0}}, +/* 11710 */ {(11<<2)|2,{101,117,0}}, +/* 11711 */ {(11<<2)|2,{101,117,0}}, +/* 11712 */ {(12<<2)|2,{101,58,0}}, +/* 11713 */ {(12<<2)|2,{101,58,0}}, +/* 11714 */ {(12<<2)|2,{101,58,0}}, +/* 11715 */ {(12<<2)|2,{101,58,0}}, +/* 11716 */ {(12<<2)|2,{101,58,0}}, +/* 11717 */ {(12<<2)|2,{101,58,0}}, +/* 11718 */ {(12<<2)|2,{101,58,0}}, +/* 11719 */ {(12<<2)|2,{101,58,0}}, +/* 11720 */ {(12<<2)|2,{101,58,0}}, +/* 11721 */ {(12<<2)|2,{101,58,0}}, +/* 11722 */ {(12<<2)|2,{101,58,0}}, +/* 11723 */ {(12<<2)|2,{101,58,0}}, +/* 11724 */ {(12<<2)|2,{101,58,0}}, +/* 11725 */ {(12<<2)|2,{101,58,0}}, +/* 11726 */ {(12<<2)|2,{101,58,0}}, +/* 11727 */ {(12<<2)|2,{101,58,0}}, +/* 11728 */ {(12<<2)|2,{101,66,0}}, +/* 11729 */ {(12<<2)|2,{101,66,0}}, +/* 11730 */ {(12<<2)|2,{101,66,0}}, +/* 11731 */ {(12<<2)|2,{101,66,0}}, +/* 11732 */ {(12<<2)|2,{101,66,0}}, +/* 11733 */ {(12<<2)|2,{101,66,0}}, +/* 11734 */ {(12<<2)|2,{101,66,0}}, +/* 11735 */ {(12<<2)|2,{101,66,0}}, +/* 11736 */ {(12<<2)|2,{101,66,0}}, +/* 11737 */ {(12<<2)|2,{101,66,0}}, +/* 11738 */ {(12<<2)|2,{101,66,0}}, +/* 11739 */ {(12<<2)|2,{101,66,0}}, +/* 11740 */ {(12<<2)|2,{101,66,0}}, +/* 11741 */ {(12<<2)|2,{101,66,0}}, +/* 11742 */ {(12<<2)|2,{101,66,0}}, +/* 11743 */ {(12<<2)|2,{101,66,0}}, +/* 11744 */ {(12<<2)|2,{101,67,0}}, +/* 11745 */ {(12<<2)|2,{101,67,0}}, +/* 11746 */ {(12<<2)|2,{101,67,0}}, +/* 11747 */ {(12<<2)|2,{101,67,0}}, +/* 11748 */ {(12<<2)|2,{101,67,0}}, +/* 11749 */ {(12<<2)|2,{101,67,0}}, +/* 11750 */ {(12<<2)|2,{101,67,0}}, +/* 11751 */ {(12<<2)|2,{101,67,0}}, +/* 11752 */ {(12<<2)|2,{101,67,0}}, +/* 11753 */ {(12<<2)|2,{101,67,0}}, +/* 11754 */ {(12<<2)|2,{101,67,0}}, +/* 11755 */ {(12<<2)|2,{101,67,0}}, +/* 11756 */ {(12<<2)|2,{101,67,0}}, +/* 11757 */ {(12<<2)|2,{101,67,0}}, +/* 11758 */ {(12<<2)|2,{101,67,0}}, +/* 11759 */ {(12<<2)|2,{101,67,0}}, +/* 11760 */ {(12<<2)|2,{101,68,0}}, +/* 11761 */ {(12<<2)|2,{101,68,0}}, +/* 11762 */ {(12<<2)|2,{101,68,0}}, +/* 11763 */ {(12<<2)|2,{101,68,0}}, +/* 11764 */ {(12<<2)|2,{101,68,0}}, +/* 11765 */ {(12<<2)|2,{101,68,0}}, +/* 11766 */ {(12<<2)|2,{101,68,0}}, +/* 11767 */ {(12<<2)|2,{101,68,0}}, +/* 11768 */ {(12<<2)|2,{101,68,0}}, +/* 11769 */ {(12<<2)|2,{101,68,0}}, +/* 11770 */ {(12<<2)|2,{101,68,0}}, +/* 11771 */ {(12<<2)|2,{101,68,0}}, +/* 11772 */ {(12<<2)|2,{101,68,0}}, +/* 11773 */ {(12<<2)|2,{101,68,0}}, +/* 11774 */ {(12<<2)|2,{101,68,0}}, +/* 11775 */ {(12<<2)|2,{101,68,0}}, +/* 11776 */ {(12<<2)|2,{101,69,0}}, +/* 11777 */ {(12<<2)|2,{101,69,0}}, +/* 11778 */ {(12<<2)|2,{101,69,0}}, +/* 11779 */ {(12<<2)|2,{101,69,0}}, +/* 11780 */ {(12<<2)|2,{101,69,0}}, +/* 11781 */ {(12<<2)|2,{101,69,0}}, +/* 11782 */ {(12<<2)|2,{101,69,0}}, +/* 11783 */ {(12<<2)|2,{101,69,0}}, +/* 11784 */ {(12<<2)|2,{101,69,0}}, +/* 11785 */ {(12<<2)|2,{101,69,0}}, +/* 11786 */ {(12<<2)|2,{101,69,0}}, +/* 11787 */ {(12<<2)|2,{101,69,0}}, +/* 11788 */ {(12<<2)|2,{101,69,0}}, +/* 11789 */ {(12<<2)|2,{101,69,0}}, +/* 11790 */ {(12<<2)|2,{101,69,0}}, +/* 11791 */ {(12<<2)|2,{101,69,0}}, +/* 11792 */ {(12<<2)|2,{101,70,0}}, +/* 11793 */ {(12<<2)|2,{101,70,0}}, +/* 11794 */ {(12<<2)|2,{101,70,0}}, +/* 11795 */ {(12<<2)|2,{101,70,0}}, +/* 11796 */ {(12<<2)|2,{101,70,0}}, +/* 11797 */ {(12<<2)|2,{101,70,0}}, +/* 11798 */ {(12<<2)|2,{101,70,0}}, +/* 11799 */ {(12<<2)|2,{101,70,0}}, +/* 11800 */ {(12<<2)|2,{101,70,0}}, +/* 11801 */ {(12<<2)|2,{101,70,0}}, +/* 11802 */ {(12<<2)|2,{101,70,0}}, +/* 11803 */ {(12<<2)|2,{101,70,0}}, +/* 11804 */ {(12<<2)|2,{101,70,0}}, +/* 11805 */ {(12<<2)|2,{101,70,0}}, +/* 11806 */ {(12<<2)|2,{101,70,0}}, +/* 11807 */ {(12<<2)|2,{101,70,0}}, +/* 11808 */ {(12<<2)|2,{101,71,0}}, +/* 11809 */ {(12<<2)|2,{101,71,0}}, +/* 11810 */ {(12<<2)|2,{101,71,0}}, +/* 11811 */ {(12<<2)|2,{101,71,0}}, +/* 11812 */ {(12<<2)|2,{101,71,0}}, +/* 11813 */ {(12<<2)|2,{101,71,0}}, +/* 11814 */ {(12<<2)|2,{101,71,0}}, +/* 11815 */ {(12<<2)|2,{101,71,0}}, +/* 11816 */ {(12<<2)|2,{101,71,0}}, +/* 11817 */ {(12<<2)|2,{101,71,0}}, +/* 11818 */ {(12<<2)|2,{101,71,0}}, +/* 11819 */ {(12<<2)|2,{101,71,0}}, +/* 11820 */ {(12<<2)|2,{101,71,0}}, +/* 11821 */ {(12<<2)|2,{101,71,0}}, +/* 11822 */ {(12<<2)|2,{101,71,0}}, +/* 11823 */ {(12<<2)|2,{101,71,0}}, +/* 11824 */ {(12<<2)|2,{101,72,0}}, +/* 11825 */ {(12<<2)|2,{101,72,0}}, +/* 11826 */ {(12<<2)|2,{101,72,0}}, +/* 11827 */ {(12<<2)|2,{101,72,0}}, +/* 11828 */ {(12<<2)|2,{101,72,0}}, +/* 11829 */ {(12<<2)|2,{101,72,0}}, +/* 11830 */ {(12<<2)|2,{101,72,0}}, +/* 11831 */ {(12<<2)|2,{101,72,0}}, +/* 11832 */ {(12<<2)|2,{101,72,0}}, +/* 11833 */ {(12<<2)|2,{101,72,0}}, +/* 11834 */ {(12<<2)|2,{101,72,0}}, +/* 11835 */ {(12<<2)|2,{101,72,0}}, +/* 11836 */ {(12<<2)|2,{101,72,0}}, +/* 11837 */ {(12<<2)|2,{101,72,0}}, +/* 11838 */ {(12<<2)|2,{101,72,0}}, +/* 11839 */ {(12<<2)|2,{101,72,0}}, +/* 11840 */ {(12<<2)|2,{101,73,0}}, +/* 11841 */ {(12<<2)|2,{101,73,0}}, +/* 11842 */ {(12<<2)|2,{101,73,0}}, +/* 11843 */ {(12<<2)|2,{101,73,0}}, +/* 11844 */ {(12<<2)|2,{101,73,0}}, +/* 11845 */ {(12<<2)|2,{101,73,0}}, +/* 11846 */ {(12<<2)|2,{101,73,0}}, +/* 11847 */ {(12<<2)|2,{101,73,0}}, +/* 11848 */ {(12<<2)|2,{101,73,0}}, +/* 11849 */ {(12<<2)|2,{101,73,0}}, +/* 11850 */ {(12<<2)|2,{101,73,0}}, +/* 11851 */ {(12<<2)|2,{101,73,0}}, +/* 11852 */ {(12<<2)|2,{101,73,0}}, +/* 11853 */ {(12<<2)|2,{101,73,0}}, +/* 11854 */ {(12<<2)|2,{101,73,0}}, +/* 11855 */ {(12<<2)|2,{101,73,0}}, +/* 11856 */ {(12<<2)|2,{101,74,0}}, +/* 11857 */ {(12<<2)|2,{101,74,0}}, +/* 11858 */ {(12<<2)|2,{101,74,0}}, +/* 11859 */ {(12<<2)|2,{101,74,0}}, +/* 11860 */ {(12<<2)|2,{101,74,0}}, +/* 11861 */ {(12<<2)|2,{101,74,0}}, +/* 11862 */ {(12<<2)|2,{101,74,0}}, +/* 11863 */ {(12<<2)|2,{101,74,0}}, +/* 11864 */ {(12<<2)|2,{101,74,0}}, +/* 11865 */ {(12<<2)|2,{101,74,0}}, +/* 11866 */ {(12<<2)|2,{101,74,0}}, +/* 11867 */ {(12<<2)|2,{101,74,0}}, +/* 11868 */ {(12<<2)|2,{101,74,0}}, +/* 11869 */ {(12<<2)|2,{101,74,0}}, +/* 11870 */ {(12<<2)|2,{101,74,0}}, +/* 11871 */ {(12<<2)|2,{101,74,0}}, +/* 11872 */ {(12<<2)|2,{101,75,0}}, +/* 11873 */ {(12<<2)|2,{101,75,0}}, +/* 11874 */ {(12<<2)|2,{101,75,0}}, +/* 11875 */ {(12<<2)|2,{101,75,0}}, +/* 11876 */ {(12<<2)|2,{101,75,0}}, +/* 11877 */ {(12<<2)|2,{101,75,0}}, +/* 11878 */ {(12<<2)|2,{101,75,0}}, +/* 11879 */ {(12<<2)|2,{101,75,0}}, +/* 11880 */ {(12<<2)|2,{101,75,0}}, +/* 11881 */ {(12<<2)|2,{101,75,0}}, +/* 11882 */ {(12<<2)|2,{101,75,0}}, +/* 11883 */ {(12<<2)|2,{101,75,0}}, +/* 11884 */ {(12<<2)|2,{101,75,0}}, +/* 11885 */ {(12<<2)|2,{101,75,0}}, +/* 11886 */ {(12<<2)|2,{101,75,0}}, +/* 11887 */ {(12<<2)|2,{101,75,0}}, +/* 11888 */ {(12<<2)|2,{101,76,0}}, +/* 11889 */ {(12<<2)|2,{101,76,0}}, +/* 11890 */ {(12<<2)|2,{101,76,0}}, +/* 11891 */ {(12<<2)|2,{101,76,0}}, +/* 11892 */ {(12<<2)|2,{101,76,0}}, +/* 11893 */ {(12<<2)|2,{101,76,0}}, +/* 11894 */ {(12<<2)|2,{101,76,0}}, +/* 11895 */ {(12<<2)|2,{101,76,0}}, +/* 11896 */ {(12<<2)|2,{101,76,0}}, +/* 11897 */ {(12<<2)|2,{101,76,0}}, +/* 11898 */ {(12<<2)|2,{101,76,0}}, +/* 11899 */ {(12<<2)|2,{101,76,0}}, +/* 11900 */ {(12<<2)|2,{101,76,0}}, +/* 11901 */ {(12<<2)|2,{101,76,0}}, +/* 11902 */ {(12<<2)|2,{101,76,0}}, +/* 11903 */ {(12<<2)|2,{101,76,0}}, +/* 11904 */ {(12<<2)|2,{101,77,0}}, +/* 11905 */ {(12<<2)|2,{101,77,0}}, +/* 11906 */ {(12<<2)|2,{101,77,0}}, +/* 11907 */ {(12<<2)|2,{101,77,0}}, +/* 11908 */ {(12<<2)|2,{101,77,0}}, +/* 11909 */ {(12<<2)|2,{101,77,0}}, +/* 11910 */ {(12<<2)|2,{101,77,0}}, +/* 11911 */ {(12<<2)|2,{101,77,0}}, +/* 11912 */ {(12<<2)|2,{101,77,0}}, +/* 11913 */ {(12<<2)|2,{101,77,0}}, +/* 11914 */ {(12<<2)|2,{101,77,0}}, +/* 11915 */ {(12<<2)|2,{101,77,0}}, +/* 11916 */ {(12<<2)|2,{101,77,0}}, +/* 11917 */ {(12<<2)|2,{101,77,0}}, +/* 11918 */ {(12<<2)|2,{101,77,0}}, +/* 11919 */ {(12<<2)|2,{101,77,0}}, +/* 11920 */ {(12<<2)|2,{101,78,0}}, +/* 11921 */ {(12<<2)|2,{101,78,0}}, +/* 11922 */ {(12<<2)|2,{101,78,0}}, +/* 11923 */ {(12<<2)|2,{101,78,0}}, +/* 11924 */ {(12<<2)|2,{101,78,0}}, +/* 11925 */ {(12<<2)|2,{101,78,0}}, +/* 11926 */ {(12<<2)|2,{101,78,0}}, +/* 11927 */ {(12<<2)|2,{101,78,0}}, +/* 11928 */ {(12<<2)|2,{101,78,0}}, +/* 11929 */ {(12<<2)|2,{101,78,0}}, +/* 11930 */ {(12<<2)|2,{101,78,0}}, +/* 11931 */ {(12<<2)|2,{101,78,0}}, +/* 11932 */ {(12<<2)|2,{101,78,0}}, +/* 11933 */ {(12<<2)|2,{101,78,0}}, +/* 11934 */ {(12<<2)|2,{101,78,0}}, +/* 11935 */ {(12<<2)|2,{101,78,0}}, +/* 11936 */ {(12<<2)|2,{101,79,0}}, +/* 11937 */ {(12<<2)|2,{101,79,0}}, +/* 11938 */ {(12<<2)|2,{101,79,0}}, +/* 11939 */ {(12<<2)|2,{101,79,0}}, +/* 11940 */ {(12<<2)|2,{101,79,0}}, +/* 11941 */ {(12<<2)|2,{101,79,0}}, +/* 11942 */ {(12<<2)|2,{101,79,0}}, +/* 11943 */ {(12<<2)|2,{101,79,0}}, +/* 11944 */ {(12<<2)|2,{101,79,0}}, +/* 11945 */ {(12<<2)|2,{101,79,0}}, +/* 11946 */ {(12<<2)|2,{101,79,0}}, +/* 11947 */ {(12<<2)|2,{101,79,0}}, +/* 11948 */ {(12<<2)|2,{101,79,0}}, +/* 11949 */ {(12<<2)|2,{101,79,0}}, +/* 11950 */ {(12<<2)|2,{101,79,0}}, +/* 11951 */ {(12<<2)|2,{101,79,0}}, +/* 11952 */ {(12<<2)|2,{101,80,0}}, +/* 11953 */ {(12<<2)|2,{101,80,0}}, +/* 11954 */ {(12<<2)|2,{101,80,0}}, +/* 11955 */ {(12<<2)|2,{101,80,0}}, +/* 11956 */ {(12<<2)|2,{101,80,0}}, +/* 11957 */ {(12<<2)|2,{101,80,0}}, +/* 11958 */ {(12<<2)|2,{101,80,0}}, +/* 11959 */ {(12<<2)|2,{101,80,0}}, +/* 11960 */ {(12<<2)|2,{101,80,0}}, +/* 11961 */ {(12<<2)|2,{101,80,0}}, +/* 11962 */ {(12<<2)|2,{101,80,0}}, +/* 11963 */ {(12<<2)|2,{101,80,0}}, +/* 11964 */ {(12<<2)|2,{101,80,0}}, +/* 11965 */ {(12<<2)|2,{101,80,0}}, +/* 11966 */ {(12<<2)|2,{101,80,0}}, +/* 11967 */ {(12<<2)|2,{101,80,0}}, +/* 11968 */ {(12<<2)|2,{101,81,0}}, +/* 11969 */ {(12<<2)|2,{101,81,0}}, +/* 11970 */ {(12<<2)|2,{101,81,0}}, +/* 11971 */ {(12<<2)|2,{101,81,0}}, +/* 11972 */ {(12<<2)|2,{101,81,0}}, +/* 11973 */ {(12<<2)|2,{101,81,0}}, +/* 11974 */ {(12<<2)|2,{101,81,0}}, +/* 11975 */ {(12<<2)|2,{101,81,0}}, +/* 11976 */ {(12<<2)|2,{101,81,0}}, +/* 11977 */ {(12<<2)|2,{101,81,0}}, +/* 11978 */ {(12<<2)|2,{101,81,0}}, +/* 11979 */ {(12<<2)|2,{101,81,0}}, +/* 11980 */ {(12<<2)|2,{101,81,0}}, +/* 11981 */ {(12<<2)|2,{101,81,0}}, +/* 11982 */ {(12<<2)|2,{101,81,0}}, +/* 11983 */ {(12<<2)|2,{101,81,0}}, +/* 11984 */ {(12<<2)|2,{101,82,0}}, +/* 11985 */ {(12<<2)|2,{101,82,0}}, +/* 11986 */ {(12<<2)|2,{101,82,0}}, +/* 11987 */ {(12<<2)|2,{101,82,0}}, +/* 11988 */ {(12<<2)|2,{101,82,0}}, +/* 11989 */ {(12<<2)|2,{101,82,0}}, +/* 11990 */ {(12<<2)|2,{101,82,0}}, +/* 11991 */ {(12<<2)|2,{101,82,0}}, +/* 11992 */ {(12<<2)|2,{101,82,0}}, +/* 11993 */ {(12<<2)|2,{101,82,0}}, +/* 11994 */ {(12<<2)|2,{101,82,0}}, +/* 11995 */ {(12<<2)|2,{101,82,0}}, +/* 11996 */ {(12<<2)|2,{101,82,0}}, +/* 11997 */ {(12<<2)|2,{101,82,0}}, +/* 11998 */ {(12<<2)|2,{101,82,0}}, +/* 11999 */ {(12<<2)|2,{101,82,0}}, +/* 12000 */ {(12<<2)|2,{101,83,0}}, +/* 12001 */ {(12<<2)|2,{101,83,0}}, +/* 12002 */ {(12<<2)|2,{101,83,0}}, +/* 12003 */ {(12<<2)|2,{101,83,0}}, +/* 12004 */ {(12<<2)|2,{101,83,0}}, +/* 12005 */ {(12<<2)|2,{101,83,0}}, +/* 12006 */ {(12<<2)|2,{101,83,0}}, +/* 12007 */ {(12<<2)|2,{101,83,0}}, +/* 12008 */ {(12<<2)|2,{101,83,0}}, +/* 12009 */ {(12<<2)|2,{101,83,0}}, +/* 12010 */ {(12<<2)|2,{101,83,0}}, +/* 12011 */ {(12<<2)|2,{101,83,0}}, +/* 12012 */ {(12<<2)|2,{101,83,0}}, +/* 12013 */ {(12<<2)|2,{101,83,0}}, +/* 12014 */ {(12<<2)|2,{101,83,0}}, +/* 12015 */ {(12<<2)|2,{101,83,0}}, +/* 12016 */ {(12<<2)|2,{101,84,0}}, +/* 12017 */ {(12<<2)|2,{101,84,0}}, +/* 12018 */ {(12<<2)|2,{101,84,0}}, +/* 12019 */ {(12<<2)|2,{101,84,0}}, +/* 12020 */ {(12<<2)|2,{101,84,0}}, +/* 12021 */ {(12<<2)|2,{101,84,0}}, +/* 12022 */ {(12<<2)|2,{101,84,0}}, +/* 12023 */ {(12<<2)|2,{101,84,0}}, +/* 12024 */ {(12<<2)|2,{101,84,0}}, +/* 12025 */ {(12<<2)|2,{101,84,0}}, +/* 12026 */ {(12<<2)|2,{101,84,0}}, +/* 12027 */ {(12<<2)|2,{101,84,0}}, +/* 12028 */ {(12<<2)|2,{101,84,0}}, +/* 12029 */ {(12<<2)|2,{101,84,0}}, +/* 12030 */ {(12<<2)|2,{101,84,0}}, +/* 12031 */ {(12<<2)|2,{101,84,0}}, +/* 12032 */ {(12<<2)|2,{101,85,0}}, +/* 12033 */ {(12<<2)|2,{101,85,0}}, +/* 12034 */ {(12<<2)|2,{101,85,0}}, +/* 12035 */ {(12<<2)|2,{101,85,0}}, +/* 12036 */ {(12<<2)|2,{101,85,0}}, +/* 12037 */ {(12<<2)|2,{101,85,0}}, +/* 12038 */ {(12<<2)|2,{101,85,0}}, +/* 12039 */ {(12<<2)|2,{101,85,0}}, +/* 12040 */ {(12<<2)|2,{101,85,0}}, +/* 12041 */ {(12<<2)|2,{101,85,0}}, +/* 12042 */ {(12<<2)|2,{101,85,0}}, +/* 12043 */ {(12<<2)|2,{101,85,0}}, +/* 12044 */ {(12<<2)|2,{101,85,0}}, +/* 12045 */ {(12<<2)|2,{101,85,0}}, +/* 12046 */ {(12<<2)|2,{101,85,0}}, +/* 12047 */ {(12<<2)|2,{101,85,0}}, +/* 12048 */ {(12<<2)|2,{101,86,0}}, +/* 12049 */ {(12<<2)|2,{101,86,0}}, +/* 12050 */ {(12<<2)|2,{101,86,0}}, +/* 12051 */ {(12<<2)|2,{101,86,0}}, +/* 12052 */ {(12<<2)|2,{101,86,0}}, +/* 12053 */ {(12<<2)|2,{101,86,0}}, +/* 12054 */ {(12<<2)|2,{101,86,0}}, +/* 12055 */ {(12<<2)|2,{101,86,0}}, +/* 12056 */ {(12<<2)|2,{101,86,0}}, +/* 12057 */ {(12<<2)|2,{101,86,0}}, +/* 12058 */ {(12<<2)|2,{101,86,0}}, +/* 12059 */ {(12<<2)|2,{101,86,0}}, +/* 12060 */ {(12<<2)|2,{101,86,0}}, +/* 12061 */ {(12<<2)|2,{101,86,0}}, +/* 12062 */ {(12<<2)|2,{101,86,0}}, +/* 12063 */ {(12<<2)|2,{101,86,0}}, +/* 12064 */ {(12<<2)|2,{101,87,0}}, +/* 12065 */ {(12<<2)|2,{101,87,0}}, +/* 12066 */ {(12<<2)|2,{101,87,0}}, +/* 12067 */ {(12<<2)|2,{101,87,0}}, +/* 12068 */ {(12<<2)|2,{101,87,0}}, +/* 12069 */ {(12<<2)|2,{101,87,0}}, +/* 12070 */ {(12<<2)|2,{101,87,0}}, +/* 12071 */ {(12<<2)|2,{101,87,0}}, +/* 12072 */ {(12<<2)|2,{101,87,0}}, +/* 12073 */ {(12<<2)|2,{101,87,0}}, +/* 12074 */ {(12<<2)|2,{101,87,0}}, +/* 12075 */ {(12<<2)|2,{101,87,0}}, +/* 12076 */ {(12<<2)|2,{101,87,0}}, +/* 12077 */ {(12<<2)|2,{101,87,0}}, +/* 12078 */ {(12<<2)|2,{101,87,0}}, +/* 12079 */ {(12<<2)|2,{101,87,0}}, +/* 12080 */ {(12<<2)|2,{101,89,0}}, +/* 12081 */ {(12<<2)|2,{101,89,0}}, +/* 12082 */ {(12<<2)|2,{101,89,0}}, +/* 12083 */ {(12<<2)|2,{101,89,0}}, +/* 12084 */ {(12<<2)|2,{101,89,0}}, +/* 12085 */ {(12<<2)|2,{101,89,0}}, +/* 12086 */ {(12<<2)|2,{101,89,0}}, +/* 12087 */ {(12<<2)|2,{101,89,0}}, +/* 12088 */ {(12<<2)|2,{101,89,0}}, +/* 12089 */ {(12<<2)|2,{101,89,0}}, +/* 12090 */ {(12<<2)|2,{101,89,0}}, +/* 12091 */ {(12<<2)|2,{101,89,0}}, +/* 12092 */ {(12<<2)|2,{101,89,0}}, +/* 12093 */ {(12<<2)|2,{101,89,0}}, +/* 12094 */ {(12<<2)|2,{101,89,0}}, +/* 12095 */ {(12<<2)|2,{101,89,0}}, +/* 12096 */ {(12<<2)|2,{101,106,0}}, +/* 12097 */ {(12<<2)|2,{101,106,0}}, +/* 12098 */ {(12<<2)|2,{101,106,0}}, +/* 12099 */ {(12<<2)|2,{101,106,0}}, +/* 12100 */ {(12<<2)|2,{101,106,0}}, +/* 12101 */ {(12<<2)|2,{101,106,0}}, +/* 12102 */ {(12<<2)|2,{101,106,0}}, +/* 12103 */ {(12<<2)|2,{101,106,0}}, +/* 12104 */ {(12<<2)|2,{101,106,0}}, +/* 12105 */ {(12<<2)|2,{101,106,0}}, +/* 12106 */ {(12<<2)|2,{101,106,0}}, +/* 12107 */ {(12<<2)|2,{101,106,0}}, +/* 12108 */ {(12<<2)|2,{101,106,0}}, +/* 12109 */ {(12<<2)|2,{101,106,0}}, +/* 12110 */ {(12<<2)|2,{101,106,0}}, +/* 12111 */ {(12<<2)|2,{101,106,0}}, +/* 12112 */ {(12<<2)|2,{101,107,0}}, +/* 12113 */ {(12<<2)|2,{101,107,0}}, +/* 12114 */ {(12<<2)|2,{101,107,0}}, +/* 12115 */ {(12<<2)|2,{101,107,0}}, +/* 12116 */ {(12<<2)|2,{101,107,0}}, +/* 12117 */ {(12<<2)|2,{101,107,0}}, +/* 12118 */ {(12<<2)|2,{101,107,0}}, +/* 12119 */ {(12<<2)|2,{101,107,0}}, +/* 12120 */ {(12<<2)|2,{101,107,0}}, +/* 12121 */ {(12<<2)|2,{101,107,0}}, +/* 12122 */ {(12<<2)|2,{101,107,0}}, +/* 12123 */ {(12<<2)|2,{101,107,0}}, +/* 12124 */ {(12<<2)|2,{101,107,0}}, +/* 12125 */ {(12<<2)|2,{101,107,0}}, +/* 12126 */ {(12<<2)|2,{101,107,0}}, +/* 12127 */ {(12<<2)|2,{101,107,0}}, +/* 12128 */ {(12<<2)|2,{101,113,0}}, +/* 12129 */ {(12<<2)|2,{101,113,0}}, +/* 12130 */ {(12<<2)|2,{101,113,0}}, +/* 12131 */ {(12<<2)|2,{101,113,0}}, +/* 12132 */ {(12<<2)|2,{101,113,0}}, +/* 12133 */ {(12<<2)|2,{101,113,0}}, +/* 12134 */ {(12<<2)|2,{101,113,0}}, +/* 12135 */ {(12<<2)|2,{101,113,0}}, +/* 12136 */ {(12<<2)|2,{101,113,0}}, +/* 12137 */ {(12<<2)|2,{101,113,0}}, +/* 12138 */ {(12<<2)|2,{101,113,0}}, +/* 12139 */ {(12<<2)|2,{101,113,0}}, +/* 12140 */ {(12<<2)|2,{101,113,0}}, +/* 12141 */ {(12<<2)|2,{101,113,0}}, +/* 12142 */ {(12<<2)|2,{101,113,0}}, +/* 12143 */ {(12<<2)|2,{101,113,0}}, +/* 12144 */ {(12<<2)|2,{101,118,0}}, +/* 12145 */ {(12<<2)|2,{101,118,0}}, +/* 12146 */ {(12<<2)|2,{101,118,0}}, +/* 12147 */ {(12<<2)|2,{101,118,0}}, +/* 12148 */ {(12<<2)|2,{101,118,0}}, +/* 12149 */ {(12<<2)|2,{101,118,0}}, +/* 12150 */ {(12<<2)|2,{101,118,0}}, +/* 12151 */ {(12<<2)|2,{101,118,0}}, +/* 12152 */ {(12<<2)|2,{101,118,0}}, +/* 12153 */ {(12<<2)|2,{101,118,0}}, +/* 12154 */ {(12<<2)|2,{101,118,0}}, +/* 12155 */ {(12<<2)|2,{101,118,0}}, +/* 12156 */ {(12<<2)|2,{101,118,0}}, +/* 12157 */ {(12<<2)|2,{101,118,0}}, +/* 12158 */ {(12<<2)|2,{101,118,0}}, +/* 12159 */ {(12<<2)|2,{101,118,0}}, +/* 12160 */ {(12<<2)|2,{101,119,0}}, +/* 12161 */ {(12<<2)|2,{101,119,0}}, +/* 12162 */ {(12<<2)|2,{101,119,0}}, +/* 12163 */ {(12<<2)|2,{101,119,0}}, +/* 12164 */ {(12<<2)|2,{101,119,0}}, +/* 12165 */ {(12<<2)|2,{101,119,0}}, +/* 12166 */ {(12<<2)|2,{101,119,0}}, +/* 12167 */ {(12<<2)|2,{101,119,0}}, +/* 12168 */ {(12<<2)|2,{101,119,0}}, +/* 12169 */ {(12<<2)|2,{101,119,0}}, +/* 12170 */ {(12<<2)|2,{101,119,0}}, +/* 12171 */ {(12<<2)|2,{101,119,0}}, +/* 12172 */ {(12<<2)|2,{101,119,0}}, +/* 12173 */ {(12<<2)|2,{101,119,0}}, +/* 12174 */ {(12<<2)|2,{101,119,0}}, +/* 12175 */ {(12<<2)|2,{101,119,0}}, +/* 12176 */ {(12<<2)|2,{101,120,0}}, +/* 12177 */ {(12<<2)|2,{101,120,0}}, +/* 12178 */ {(12<<2)|2,{101,120,0}}, +/* 12179 */ {(12<<2)|2,{101,120,0}}, +/* 12180 */ {(12<<2)|2,{101,120,0}}, +/* 12181 */ {(12<<2)|2,{101,120,0}}, +/* 12182 */ {(12<<2)|2,{101,120,0}}, +/* 12183 */ {(12<<2)|2,{101,120,0}}, +/* 12184 */ {(12<<2)|2,{101,120,0}}, +/* 12185 */ {(12<<2)|2,{101,120,0}}, +/* 12186 */ {(12<<2)|2,{101,120,0}}, +/* 12187 */ {(12<<2)|2,{101,120,0}}, +/* 12188 */ {(12<<2)|2,{101,120,0}}, +/* 12189 */ {(12<<2)|2,{101,120,0}}, +/* 12190 */ {(12<<2)|2,{101,120,0}}, +/* 12191 */ {(12<<2)|2,{101,120,0}}, +/* 12192 */ {(12<<2)|2,{101,121,0}}, +/* 12193 */ {(12<<2)|2,{101,121,0}}, +/* 12194 */ {(12<<2)|2,{101,121,0}}, +/* 12195 */ {(12<<2)|2,{101,121,0}}, +/* 12196 */ {(12<<2)|2,{101,121,0}}, +/* 12197 */ {(12<<2)|2,{101,121,0}}, +/* 12198 */ {(12<<2)|2,{101,121,0}}, +/* 12199 */ {(12<<2)|2,{101,121,0}}, +/* 12200 */ {(12<<2)|2,{101,121,0}}, +/* 12201 */ {(12<<2)|2,{101,121,0}}, +/* 12202 */ {(12<<2)|2,{101,121,0}}, +/* 12203 */ {(12<<2)|2,{101,121,0}}, +/* 12204 */ {(12<<2)|2,{101,121,0}}, +/* 12205 */ {(12<<2)|2,{101,121,0}}, +/* 12206 */ {(12<<2)|2,{101,121,0}}, +/* 12207 */ {(12<<2)|2,{101,121,0}}, +/* 12208 */ {(12<<2)|2,{101,122,0}}, +/* 12209 */ {(12<<2)|2,{101,122,0}}, +/* 12210 */ {(12<<2)|2,{101,122,0}}, +/* 12211 */ {(12<<2)|2,{101,122,0}}, +/* 12212 */ {(12<<2)|2,{101,122,0}}, +/* 12213 */ {(12<<2)|2,{101,122,0}}, +/* 12214 */ {(12<<2)|2,{101,122,0}}, +/* 12215 */ {(12<<2)|2,{101,122,0}}, +/* 12216 */ {(12<<2)|2,{101,122,0}}, +/* 12217 */ {(12<<2)|2,{101,122,0}}, +/* 12218 */ {(12<<2)|2,{101,122,0}}, +/* 12219 */ {(12<<2)|2,{101,122,0}}, +/* 12220 */ {(12<<2)|2,{101,122,0}}, +/* 12221 */ {(12<<2)|2,{101,122,0}}, +/* 12222 */ {(12<<2)|2,{101,122,0}}, +/* 12223 */ {(12<<2)|2,{101,122,0}}, +/* 12224 */ {(13<<2)|2,{101,38,0}}, +/* 12225 */ {(13<<2)|2,{101,38,0}}, +/* 12226 */ {(13<<2)|2,{101,38,0}}, +/* 12227 */ {(13<<2)|2,{101,38,0}}, +/* 12228 */ {(13<<2)|2,{101,38,0}}, +/* 12229 */ {(13<<2)|2,{101,38,0}}, +/* 12230 */ {(13<<2)|2,{101,38,0}}, +/* 12231 */ {(13<<2)|2,{101,38,0}}, +/* 12232 */ {(13<<2)|2,{101,42,0}}, +/* 12233 */ {(13<<2)|2,{101,42,0}}, +/* 12234 */ {(13<<2)|2,{101,42,0}}, +/* 12235 */ {(13<<2)|2,{101,42,0}}, +/* 12236 */ {(13<<2)|2,{101,42,0}}, +/* 12237 */ {(13<<2)|2,{101,42,0}}, +/* 12238 */ {(13<<2)|2,{101,42,0}}, +/* 12239 */ {(13<<2)|2,{101,42,0}}, +/* 12240 */ {(13<<2)|2,{101,44,0}}, +/* 12241 */ {(13<<2)|2,{101,44,0}}, +/* 12242 */ {(13<<2)|2,{101,44,0}}, +/* 12243 */ {(13<<2)|2,{101,44,0}}, +/* 12244 */ {(13<<2)|2,{101,44,0}}, +/* 12245 */ {(13<<2)|2,{101,44,0}}, +/* 12246 */ {(13<<2)|2,{101,44,0}}, +/* 12247 */ {(13<<2)|2,{101,44,0}}, +/* 12248 */ {(13<<2)|2,{101,59,0}}, +/* 12249 */ {(13<<2)|2,{101,59,0}}, +/* 12250 */ {(13<<2)|2,{101,59,0}}, +/* 12251 */ {(13<<2)|2,{101,59,0}}, +/* 12252 */ {(13<<2)|2,{101,59,0}}, +/* 12253 */ {(13<<2)|2,{101,59,0}}, +/* 12254 */ {(13<<2)|2,{101,59,0}}, +/* 12255 */ {(13<<2)|2,{101,59,0}}, +/* 12256 */ {(13<<2)|2,{101,88,0}}, +/* 12257 */ {(13<<2)|2,{101,88,0}}, +/* 12258 */ {(13<<2)|2,{101,88,0}}, +/* 12259 */ {(13<<2)|2,{101,88,0}}, +/* 12260 */ {(13<<2)|2,{101,88,0}}, +/* 12261 */ {(13<<2)|2,{101,88,0}}, +/* 12262 */ {(13<<2)|2,{101,88,0}}, +/* 12263 */ {(13<<2)|2,{101,88,0}}, +/* 12264 */ {(13<<2)|2,{101,90,0}}, +/* 12265 */ {(13<<2)|2,{101,90,0}}, +/* 12266 */ {(13<<2)|2,{101,90,0}}, +/* 12267 */ {(13<<2)|2,{101,90,0}}, +/* 12268 */ {(13<<2)|2,{101,90,0}}, +/* 12269 */ {(13<<2)|2,{101,90,0}}, +/* 12270 */ {(13<<2)|2,{101,90,0}}, +/* 12271 */ {(13<<2)|2,{101,90,0}}, +/* 12272 */ {(15<<2)|2,{101,33,0}}, +/* 12273 */ {(15<<2)|2,{101,33,0}}, +/* 12274 */ {(15<<2)|2,{101,34,0}}, +/* 12275 */ {(15<<2)|2,{101,34,0}}, +/* 12276 */ {(15<<2)|2,{101,40,0}}, +/* 12277 */ {(15<<2)|2,{101,40,0}}, +/* 12278 */ {(15<<2)|2,{101,41,0}}, +/* 12279 */ {(15<<2)|2,{101,41,0}}, +/* 12280 */ {(15<<2)|2,{101,63,0}}, +/* 12281 */ {(15<<2)|2,{101,63,0}}, +/* 12282 */ {(16<<2)|2,{101,39,0}}, +/* 12283 */ {(16<<2)|2,{101,43,0}}, +/* 12284 */ {(16<<2)|2,{101,124,0}}, +/* 12285 */ {(5<<2)|1,{101,0,0}}, +/* 12286 */ {(5<<2)|1,{101,0,0}}, +/* 12287 */ {(5<<2)|1,{101,0,0}}, +/* 12288 */ {(15<<2)|3,{105,48,48}}, +/* 12289 */ {(15<<2)|3,{105,48,48}}, +/* 12290 */ {(15<<2)|3,{105,48,49}}, +/* 12291 */ {(15<<2)|3,{105,48,49}}, +/* 12292 */ {(15<<2)|3,{105,48,50}}, +/* 12293 */ {(15<<2)|3,{105,48,50}}, +/* 12294 */ {(15<<2)|3,{105,48,97}}, +/* 12295 */ {(15<<2)|3,{105,48,97}}, +/* 12296 */ {(15<<2)|3,{105,48,99}}, +/* 12297 */ {(15<<2)|3,{105,48,99}}, +/* 12298 */ {(15<<2)|3,{105,48,101}}, +/* 12299 */ {(15<<2)|3,{105,48,101}}, +/* 12300 */ {(15<<2)|3,{105,48,105}}, +/* 12301 */ {(15<<2)|3,{105,48,105}}, +/* 12302 */ {(15<<2)|3,{105,48,111}}, +/* 12303 */ {(15<<2)|3,{105,48,111}}, +/* 12304 */ {(15<<2)|3,{105,48,115}}, +/* 12305 */ {(15<<2)|3,{105,48,115}}, +/* 12306 */ {(15<<2)|3,{105,48,116}}, +/* 12307 */ {(15<<2)|3,{105,48,116}}, +/* 12308 */ {(16<<2)|3,{105,48,32}}, +/* 12309 */ {(16<<2)|3,{105,48,37}}, +/* 12310 */ {(16<<2)|3,{105,48,45}}, +/* 12311 */ {(16<<2)|3,{105,48,46}}, +/* 12312 */ {(16<<2)|3,{105,48,47}}, +/* 12313 */ {(16<<2)|3,{105,48,51}}, +/* 12314 */ {(16<<2)|3,{105,48,52}}, +/* 12315 */ {(16<<2)|3,{105,48,53}}, +/* 12316 */ {(16<<2)|3,{105,48,54}}, +/* 12317 */ {(16<<2)|3,{105,48,55}}, +/* 12318 */ {(16<<2)|3,{105,48,56}}, +/* 12319 */ {(16<<2)|3,{105,48,57}}, +/* 12320 */ {(16<<2)|3,{105,48,61}}, +/* 12321 */ {(16<<2)|3,{105,48,65}}, +/* 12322 */ {(16<<2)|3,{105,48,95}}, +/* 12323 */ {(16<<2)|3,{105,48,98}}, +/* 12324 */ {(16<<2)|3,{105,48,100}}, +/* 12325 */ {(16<<2)|3,{105,48,102}}, +/* 12326 */ {(16<<2)|3,{105,48,103}}, +/* 12327 */ {(16<<2)|3,{105,48,104}}, +/* 12328 */ {(16<<2)|3,{105,48,108}}, +/* 12329 */ {(16<<2)|3,{105,48,109}}, +/* 12330 */ {(16<<2)|3,{105,48,110}}, +/* 12331 */ {(16<<2)|3,{105,48,112}}, +/* 12332 */ {(16<<2)|3,{105,48,114}}, +/* 12333 */ {(16<<2)|3,{105,48,117}}, +/* 12334 */ {(10<<2)|2,{105,48,0}}, +/* 12335 */ {(10<<2)|2,{105,48,0}}, +/* 12336 */ {(10<<2)|2,{105,48,0}}, +/* 12337 */ {(10<<2)|2,{105,48,0}}, +/* 12338 */ {(10<<2)|2,{105,48,0}}, +/* 12339 */ {(10<<2)|2,{105,48,0}}, +/* 12340 */ {(10<<2)|2,{105,48,0}}, +/* 12341 */ {(10<<2)|2,{105,48,0}}, +/* 12342 */ {(10<<2)|2,{105,48,0}}, +/* 12343 */ {(10<<2)|2,{105,48,0}}, +/* 12344 */ {(10<<2)|2,{105,48,0}}, +/* 12345 */ {(10<<2)|2,{105,48,0}}, +/* 12346 */ {(10<<2)|2,{105,48,0}}, +/* 12347 */ {(10<<2)|2,{105,48,0}}, +/* 12348 */ {(10<<2)|2,{105,48,0}}, +/* 12349 */ {(10<<2)|2,{105,48,0}}, +/* 12350 */ {(10<<2)|2,{105,48,0}}, +/* 12351 */ {(10<<2)|2,{105,48,0}}, +/* 12352 */ {(15<<2)|3,{105,49,48}}, +/* 12353 */ {(15<<2)|3,{105,49,48}}, +/* 12354 */ {(15<<2)|3,{105,49,49}}, +/* 12355 */ {(15<<2)|3,{105,49,49}}, +/* 12356 */ {(15<<2)|3,{105,49,50}}, +/* 12357 */ {(15<<2)|3,{105,49,50}}, +/* 12358 */ {(15<<2)|3,{105,49,97}}, +/* 12359 */ {(15<<2)|3,{105,49,97}}, +/* 12360 */ {(15<<2)|3,{105,49,99}}, +/* 12361 */ {(15<<2)|3,{105,49,99}}, +/* 12362 */ {(15<<2)|3,{105,49,101}}, +/* 12363 */ {(15<<2)|3,{105,49,101}}, +/* 12364 */ {(15<<2)|3,{105,49,105}}, +/* 12365 */ {(15<<2)|3,{105,49,105}}, +/* 12366 */ {(15<<2)|3,{105,49,111}}, +/* 12367 */ {(15<<2)|3,{105,49,111}}, +/* 12368 */ {(15<<2)|3,{105,49,115}}, +/* 12369 */ {(15<<2)|3,{105,49,115}}, +/* 12370 */ {(15<<2)|3,{105,49,116}}, +/* 12371 */ {(15<<2)|3,{105,49,116}}, +/* 12372 */ {(16<<2)|3,{105,49,32}}, +/* 12373 */ {(16<<2)|3,{105,49,37}}, +/* 12374 */ {(16<<2)|3,{105,49,45}}, +/* 12375 */ {(16<<2)|3,{105,49,46}}, +/* 12376 */ {(16<<2)|3,{105,49,47}}, +/* 12377 */ {(16<<2)|3,{105,49,51}}, +/* 12378 */ {(16<<2)|3,{105,49,52}}, +/* 12379 */ {(16<<2)|3,{105,49,53}}, +/* 12380 */ {(16<<2)|3,{105,49,54}}, +/* 12381 */ {(16<<2)|3,{105,49,55}}, +/* 12382 */ {(16<<2)|3,{105,49,56}}, +/* 12383 */ {(16<<2)|3,{105,49,57}}, +/* 12384 */ {(16<<2)|3,{105,49,61}}, +/* 12385 */ {(16<<2)|3,{105,49,65}}, +/* 12386 */ {(16<<2)|3,{105,49,95}}, +/* 12387 */ {(16<<2)|3,{105,49,98}}, +/* 12388 */ {(16<<2)|3,{105,49,100}}, +/* 12389 */ {(16<<2)|3,{105,49,102}}, +/* 12390 */ {(16<<2)|3,{105,49,103}}, +/* 12391 */ {(16<<2)|3,{105,49,104}}, +/* 12392 */ {(16<<2)|3,{105,49,108}}, +/* 12393 */ {(16<<2)|3,{105,49,109}}, +/* 12394 */ {(16<<2)|3,{105,49,110}}, +/* 12395 */ {(16<<2)|3,{105,49,112}}, +/* 12396 */ {(16<<2)|3,{105,49,114}}, +/* 12397 */ {(16<<2)|3,{105,49,117}}, +/* 12398 */ {(10<<2)|2,{105,49,0}}, +/* 12399 */ {(10<<2)|2,{105,49,0}}, +/* 12400 */ {(10<<2)|2,{105,49,0}}, +/* 12401 */ {(10<<2)|2,{105,49,0}}, +/* 12402 */ {(10<<2)|2,{105,49,0}}, +/* 12403 */ {(10<<2)|2,{105,49,0}}, +/* 12404 */ {(10<<2)|2,{105,49,0}}, +/* 12405 */ {(10<<2)|2,{105,49,0}}, +/* 12406 */ {(10<<2)|2,{105,49,0}}, +/* 12407 */ {(10<<2)|2,{105,49,0}}, +/* 12408 */ {(10<<2)|2,{105,49,0}}, +/* 12409 */ {(10<<2)|2,{105,49,0}}, +/* 12410 */ {(10<<2)|2,{105,49,0}}, +/* 12411 */ {(10<<2)|2,{105,49,0}}, +/* 12412 */ {(10<<2)|2,{105,49,0}}, +/* 12413 */ {(10<<2)|2,{105,49,0}}, +/* 12414 */ {(10<<2)|2,{105,49,0}}, +/* 12415 */ {(10<<2)|2,{105,49,0}}, +/* 12416 */ {(15<<2)|3,{105,50,48}}, +/* 12417 */ {(15<<2)|3,{105,50,48}}, +/* 12418 */ {(15<<2)|3,{105,50,49}}, +/* 12419 */ {(15<<2)|3,{105,50,49}}, +/* 12420 */ {(15<<2)|3,{105,50,50}}, +/* 12421 */ {(15<<2)|3,{105,50,50}}, +/* 12422 */ {(15<<2)|3,{105,50,97}}, +/* 12423 */ {(15<<2)|3,{105,50,97}}, +/* 12424 */ {(15<<2)|3,{105,50,99}}, +/* 12425 */ {(15<<2)|3,{105,50,99}}, +/* 12426 */ {(15<<2)|3,{105,50,101}}, +/* 12427 */ {(15<<2)|3,{105,50,101}}, +/* 12428 */ {(15<<2)|3,{105,50,105}}, +/* 12429 */ {(15<<2)|3,{105,50,105}}, +/* 12430 */ {(15<<2)|3,{105,50,111}}, +/* 12431 */ {(15<<2)|3,{105,50,111}}, +/* 12432 */ {(15<<2)|3,{105,50,115}}, +/* 12433 */ {(15<<2)|3,{105,50,115}}, +/* 12434 */ {(15<<2)|3,{105,50,116}}, +/* 12435 */ {(15<<2)|3,{105,50,116}}, +/* 12436 */ {(16<<2)|3,{105,50,32}}, +/* 12437 */ {(16<<2)|3,{105,50,37}}, +/* 12438 */ {(16<<2)|3,{105,50,45}}, +/* 12439 */ {(16<<2)|3,{105,50,46}}, +/* 12440 */ {(16<<2)|3,{105,50,47}}, +/* 12441 */ {(16<<2)|3,{105,50,51}}, +/* 12442 */ {(16<<2)|3,{105,50,52}}, +/* 12443 */ {(16<<2)|3,{105,50,53}}, +/* 12444 */ {(16<<2)|3,{105,50,54}}, +/* 12445 */ {(16<<2)|3,{105,50,55}}, +/* 12446 */ {(16<<2)|3,{105,50,56}}, +/* 12447 */ {(16<<2)|3,{105,50,57}}, +/* 12448 */ {(16<<2)|3,{105,50,61}}, +/* 12449 */ {(16<<2)|3,{105,50,65}}, +/* 12450 */ {(16<<2)|3,{105,50,95}}, +/* 12451 */ {(16<<2)|3,{105,50,98}}, +/* 12452 */ {(16<<2)|3,{105,50,100}}, +/* 12453 */ {(16<<2)|3,{105,50,102}}, +/* 12454 */ {(16<<2)|3,{105,50,103}}, +/* 12455 */ {(16<<2)|3,{105,50,104}}, +/* 12456 */ {(16<<2)|3,{105,50,108}}, +/* 12457 */ {(16<<2)|3,{105,50,109}}, +/* 12458 */ {(16<<2)|3,{105,50,110}}, +/* 12459 */ {(16<<2)|3,{105,50,112}}, +/* 12460 */ {(16<<2)|3,{105,50,114}}, +/* 12461 */ {(16<<2)|3,{105,50,117}}, +/* 12462 */ {(10<<2)|2,{105,50,0}}, +/* 12463 */ {(10<<2)|2,{105,50,0}}, +/* 12464 */ {(10<<2)|2,{105,50,0}}, +/* 12465 */ {(10<<2)|2,{105,50,0}}, +/* 12466 */ {(10<<2)|2,{105,50,0}}, +/* 12467 */ {(10<<2)|2,{105,50,0}}, +/* 12468 */ {(10<<2)|2,{105,50,0}}, +/* 12469 */ {(10<<2)|2,{105,50,0}}, +/* 12470 */ {(10<<2)|2,{105,50,0}}, +/* 12471 */ {(10<<2)|2,{105,50,0}}, +/* 12472 */ {(10<<2)|2,{105,50,0}}, +/* 12473 */ {(10<<2)|2,{105,50,0}}, +/* 12474 */ {(10<<2)|2,{105,50,0}}, +/* 12475 */ {(10<<2)|2,{105,50,0}}, +/* 12476 */ {(10<<2)|2,{105,50,0}}, +/* 12477 */ {(10<<2)|2,{105,50,0}}, +/* 12478 */ {(10<<2)|2,{105,50,0}}, +/* 12479 */ {(10<<2)|2,{105,50,0}}, +/* 12480 */ {(15<<2)|3,{105,97,48}}, +/* 12481 */ {(15<<2)|3,{105,97,48}}, +/* 12482 */ {(15<<2)|3,{105,97,49}}, +/* 12483 */ {(15<<2)|3,{105,97,49}}, +/* 12484 */ {(15<<2)|3,{105,97,50}}, +/* 12485 */ {(15<<2)|3,{105,97,50}}, +/* 12486 */ {(15<<2)|3,{105,97,97}}, +/* 12487 */ {(15<<2)|3,{105,97,97}}, +/* 12488 */ {(15<<2)|3,{105,97,99}}, +/* 12489 */ {(15<<2)|3,{105,97,99}}, +/* 12490 */ {(15<<2)|3,{105,97,101}}, +/* 12491 */ {(15<<2)|3,{105,97,101}}, +/* 12492 */ {(15<<2)|3,{105,97,105}}, +/* 12493 */ {(15<<2)|3,{105,97,105}}, +/* 12494 */ {(15<<2)|3,{105,97,111}}, +/* 12495 */ {(15<<2)|3,{105,97,111}}, +/* 12496 */ {(15<<2)|3,{105,97,115}}, +/* 12497 */ {(15<<2)|3,{105,97,115}}, +/* 12498 */ {(15<<2)|3,{105,97,116}}, +/* 12499 */ {(15<<2)|3,{105,97,116}}, +/* 12500 */ {(16<<2)|3,{105,97,32}}, +/* 12501 */ {(16<<2)|3,{105,97,37}}, +/* 12502 */ {(16<<2)|3,{105,97,45}}, +/* 12503 */ {(16<<2)|3,{105,97,46}}, +/* 12504 */ {(16<<2)|3,{105,97,47}}, +/* 12505 */ {(16<<2)|3,{105,97,51}}, +/* 12506 */ {(16<<2)|3,{105,97,52}}, +/* 12507 */ {(16<<2)|3,{105,97,53}}, +/* 12508 */ {(16<<2)|3,{105,97,54}}, +/* 12509 */ {(16<<2)|3,{105,97,55}}, +/* 12510 */ {(16<<2)|3,{105,97,56}}, +/* 12511 */ {(16<<2)|3,{105,97,57}}, +/* 12512 */ {(16<<2)|3,{105,97,61}}, +/* 12513 */ {(16<<2)|3,{105,97,65}}, +/* 12514 */ {(16<<2)|3,{105,97,95}}, +/* 12515 */ {(16<<2)|3,{105,97,98}}, +/* 12516 */ {(16<<2)|3,{105,97,100}}, +/* 12517 */ {(16<<2)|3,{105,97,102}}, +/* 12518 */ {(16<<2)|3,{105,97,103}}, +/* 12519 */ {(16<<2)|3,{105,97,104}}, +/* 12520 */ {(16<<2)|3,{105,97,108}}, +/* 12521 */ {(16<<2)|3,{105,97,109}}, +/* 12522 */ {(16<<2)|3,{105,97,110}}, +/* 12523 */ {(16<<2)|3,{105,97,112}}, +/* 12524 */ {(16<<2)|3,{105,97,114}}, +/* 12525 */ {(16<<2)|3,{105,97,117}}, +/* 12526 */ {(10<<2)|2,{105,97,0}}, +/* 12527 */ {(10<<2)|2,{105,97,0}}, +/* 12528 */ {(10<<2)|2,{105,97,0}}, +/* 12529 */ {(10<<2)|2,{105,97,0}}, +/* 12530 */ {(10<<2)|2,{105,97,0}}, +/* 12531 */ {(10<<2)|2,{105,97,0}}, +/* 12532 */ {(10<<2)|2,{105,97,0}}, +/* 12533 */ {(10<<2)|2,{105,97,0}}, +/* 12534 */ {(10<<2)|2,{105,97,0}}, +/* 12535 */ {(10<<2)|2,{105,97,0}}, +/* 12536 */ {(10<<2)|2,{105,97,0}}, +/* 12537 */ {(10<<2)|2,{105,97,0}}, +/* 12538 */ {(10<<2)|2,{105,97,0}}, +/* 12539 */ {(10<<2)|2,{105,97,0}}, +/* 12540 */ {(10<<2)|2,{105,97,0}}, +/* 12541 */ {(10<<2)|2,{105,97,0}}, +/* 12542 */ {(10<<2)|2,{105,97,0}}, +/* 12543 */ {(10<<2)|2,{105,97,0}}, +/* 12544 */ {(15<<2)|3,{105,99,48}}, +/* 12545 */ {(15<<2)|3,{105,99,48}}, +/* 12546 */ {(15<<2)|3,{105,99,49}}, +/* 12547 */ {(15<<2)|3,{105,99,49}}, +/* 12548 */ {(15<<2)|3,{105,99,50}}, +/* 12549 */ {(15<<2)|3,{105,99,50}}, +/* 12550 */ {(15<<2)|3,{105,99,97}}, +/* 12551 */ {(15<<2)|3,{105,99,97}}, +/* 12552 */ {(15<<2)|3,{105,99,99}}, +/* 12553 */ {(15<<2)|3,{105,99,99}}, +/* 12554 */ {(15<<2)|3,{105,99,101}}, +/* 12555 */ {(15<<2)|3,{105,99,101}}, +/* 12556 */ {(15<<2)|3,{105,99,105}}, +/* 12557 */ {(15<<2)|3,{105,99,105}}, +/* 12558 */ {(15<<2)|3,{105,99,111}}, +/* 12559 */ {(15<<2)|3,{105,99,111}}, +/* 12560 */ {(15<<2)|3,{105,99,115}}, +/* 12561 */ {(15<<2)|3,{105,99,115}}, +/* 12562 */ {(15<<2)|3,{105,99,116}}, +/* 12563 */ {(15<<2)|3,{105,99,116}}, +/* 12564 */ {(16<<2)|3,{105,99,32}}, +/* 12565 */ {(16<<2)|3,{105,99,37}}, +/* 12566 */ {(16<<2)|3,{105,99,45}}, +/* 12567 */ {(16<<2)|3,{105,99,46}}, +/* 12568 */ {(16<<2)|3,{105,99,47}}, +/* 12569 */ {(16<<2)|3,{105,99,51}}, +/* 12570 */ {(16<<2)|3,{105,99,52}}, +/* 12571 */ {(16<<2)|3,{105,99,53}}, +/* 12572 */ {(16<<2)|3,{105,99,54}}, +/* 12573 */ {(16<<2)|3,{105,99,55}}, +/* 12574 */ {(16<<2)|3,{105,99,56}}, +/* 12575 */ {(16<<2)|3,{105,99,57}}, +/* 12576 */ {(16<<2)|3,{105,99,61}}, +/* 12577 */ {(16<<2)|3,{105,99,65}}, +/* 12578 */ {(16<<2)|3,{105,99,95}}, +/* 12579 */ {(16<<2)|3,{105,99,98}}, +/* 12580 */ {(16<<2)|3,{105,99,100}}, +/* 12581 */ {(16<<2)|3,{105,99,102}}, +/* 12582 */ {(16<<2)|3,{105,99,103}}, +/* 12583 */ {(16<<2)|3,{105,99,104}}, +/* 12584 */ {(16<<2)|3,{105,99,108}}, +/* 12585 */ {(16<<2)|3,{105,99,109}}, +/* 12586 */ {(16<<2)|3,{105,99,110}}, +/* 12587 */ {(16<<2)|3,{105,99,112}}, +/* 12588 */ {(16<<2)|3,{105,99,114}}, +/* 12589 */ {(16<<2)|3,{105,99,117}}, +/* 12590 */ {(10<<2)|2,{105,99,0}}, +/* 12591 */ {(10<<2)|2,{105,99,0}}, +/* 12592 */ {(10<<2)|2,{105,99,0}}, +/* 12593 */ {(10<<2)|2,{105,99,0}}, +/* 12594 */ {(10<<2)|2,{105,99,0}}, +/* 12595 */ {(10<<2)|2,{105,99,0}}, +/* 12596 */ {(10<<2)|2,{105,99,0}}, +/* 12597 */ {(10<<2)|2,{105,99,0}}, +/* 12598 */ {(10<<2)|2,{105,99,0}}, +/* 12599 */ {(10<<2)|2,{105,99,0}}, +/* 12600 */ {(10<<2)|2,{105,99,0}}, +/* 12601 */ {(10<<2)|2,{105,99,0}}, +/* 12602 */ {(10<<2)|2,{105,99,0}}, +/* 12603 */ {(10<<2)|2,{105,99,0}}, +/* 12604 */ {(10<<2)|2,{105,99,0}}, +/* 12605 */ {(10<<2)|2,{105,99,0}}, +/* 12606 */ {(10<<2)|2,{105,99,0}}, +/* 12607 */ {(10<<2)|2,{105,99,0}}, +/* 12608 */ {(15<<2)|3,{105,101,48}}, +/* 12609 */ {(15<<2)|3,{105,101,48}}, +/* 12610 */ {(15<<2)|3,{105,101,49}}, +/* 12611 */ {(15<<2)|3,{105,101,49}}, +/* 12612 */ {(15<<2)|3,{105,101,50}}, +/* 12613 */ {(15<<2)|3,{105,101,50}}, +/* 12614 */ {(15<<2)|3,{105,101,97}}, +/* 12615 */ {(15<<2)|3,{105,101,97}}, +/* 12616 */ {(15<<2)|3,{105,101,99}}, +/* 12617 */ {(15<<2)|3,{105,101,99}}, +/* 12618 */ {(15<<2)|3,{105,101,101}}, +/* 12619 */ {(15<<2)|3,{105,101,101}}, +/* 12620 */ {(15<<2)|3,{105,101,105}}, +/* 12621 */ {(15<<2)|3,{105,101,105}}, +/* 12622 */ {(15<<2)|3,{105,101,111}}, +/* 12623 */ {(15<<2)|3,{105,101,111}}, +/* 12624 */ {(15<<2)|3,{105,101,115}}, +/* 12625 */ {(15<<2)|3,{105,101,115}}, +/* 12626 */ {(15<<2)|3,{105,101,116}}, +/* 12627 */ {(15<<2)|3,{105,101,116}}, +/* 12628 */ {(16<<2)|3,{105,101,32}}, +/* 12629 */ {(16<<2)|3,{105,101,37}}, +/* 12630 */ {(16<<2)|3,{105,101,45}}, +/* 12631 */ {(16<<2)|3,{105,101,46}}, +/* 12632 */ {(16<<2)|3,{105,101,47}}, +/* 12633 */ {(16<<2)|3,{105,101,51}}, +/* 12634 */ {(16<<2)|3,{105,101,52}}, +/* 12635 */ {(16<<2)|3,{105,101,53}}, +/* 12636 */ {(16<<2)|3,{105,101,54}}, +/* 12637 */ {(16<<2)|3,{105,101,55}}, +/* 12638 */ {(16<<2)|3,{105,101,56}}, +/* 12639 */ {(16<<2)|3,{105,101,57}}, +/* 12640 */ {(16<<2)|3,{105,101,61}}, +/* 12641 */ {(16<<2)|3,{105,101,65}}, +/* 12642 */ {(16<<2)|3,{105,101,95}}, +/* 12643 */ {(16<<2)|3,{105,101,98}}, +/* 12644 */ {(16<<2)|3,{105,101,100}}, +/* 12645 */ {(16<<2)|3,{105,101,102}}, +/* 12646 */ {(16<<2)|3,{105,101,103}}, +/* 12647 */ {(16<<2)|3,{105,101,104}}, +/* 12648 */ {(16<<2)|3,{105,101,108}}, +/* 12649 */ {(16<<2)|3,{105,101,109}}, +/* 12650 */ {(16<<2)|3,{105,101,110}}, +/* 12651 */ {(16<<2)|3,{105,101,112}}, +/* 12652 */ {(16<<2)|3,{105,101,114}}, +/* 12653 */ {(16<<2)|3,{105,101,117}}, +/* 12654 */ {(10<<2)|2,{105,101,0}}, +/* 12655 */ {(10<<2)|2,{105,101,0}}, +/* 12656 */ {(10<<2)|2,{105,101,0}}, +/* 12657 */ {(10<<2)|2,{105,101,0}}, +/* 12658 */ {(10<<2)|2,{105,101,0}}, +/* 12659 */ {(10<<2)|2,{105,101,0}}, +/* 12660 */ {(10<<2)|2,{105,101,0}}, +/* 12661 */ {(10<<2)|2,{105,101,0}}, +/* 12662 */ {(10<<2)|2,{105,101,0}}, +/* 12663 */ {(10<<2)|2,{105,101,0}}, +/* 12664 */ {(10<<2)|2,{105,101,0}}, +/* 12665 */ {(10<<2)|2,{105,101,0}}, +/* 12666 */ {(10<<2)|2,{105,101,0}}, +/* 12667 */ {(10<<2)|2,{105,101,0}}, +/* 12668 */ {(10<<2)|2,{105,101,0}}, +/* 12669 */ {(10<<2)|2,{105,101,0}}, +/* 12670 */ {(10<<2)|2,{105,101,0}}, +/* 12671 */ {(10<<2)|2,{105,101,0}}, +/* 12672 */ {(15<<2)|3,{105,105,48}}, +/* 12673 */ {(15<<2)|3,{105,105,48}}, +/* 12674 */ {(15<<2)|3,{105,105,49}}, +/* 12675 */ {(15<<2)|3,{105,105,49}}, +/* 12676 */ {(15<<2)|3,{105,105,50}}, +/* 12677 */ {(15<<2)|3,{105,105,50}}, +/* 12678 */ {(15<<2)|3,{105,105,97}}, +/* 12679 */ {(15<<2)|3,{105,105,97}}, +/* 12680 */ {(15<<2)|3,{105,105,99}}, +/* 12681 */ {(15<<2)|3,{105,105,99}}, +/* 12682 */ {(15<<2)|3,{105,105,101}}, +/* 12683 */ {(15<<2)|3,{105,105,101}}, +/* 12684 */ {(15<<2)|3,{105,105,105}}, +/* 12685 */ {(15<<2)|3,{105,105,105}}, +/* 12686 */ {(15<<2)|3,{105,105,111}}, +/* 12687 */ {(15<<2)|3,{105,105,111}}, +/* 12688 */ {(15<<2)|3,{105,105,115}}, +/* 12689 */ {(15<<2)|3,{105,105,115}}, +/* 12690 */ {(15<<2)|3,{105,105,116}}, +/* 12691 */ {(15<<2)|3,{105,105,116}}, +/* 12692 */ {(16<<2)|3,{105,105,32}}, +/* 12693 */ {(16<<2)|3,{105,105,37}}, +/* 12694 */ {(16<<2)|3,{105,105,45}}, +/* 12695 */ {(16<<2)|3,{105,105,46}}, +/* 12696 */ {(16<<2)|3,{105,105,47}}, +/* 12697 */ {(16<<2)|3,{105,105,51}}, +/* 12698 */ {(16<<2)|3,{105,105,52}}, +/* 12699 */ {(16<<2)|3,{105,105,53}}, +/* 12700 */ {(16<<2)|3,{105,105,54}}, +/* 12701 */ {(16<<2)|3,{105,105,55}}, +/* 12702 */ {(16<<2)|3,{105,105,56}}, +/* 12703 */ {(16<<2)|3,{105,105,57}}, +/* 12704 */ {(16<<2)|3,{105,105,61}}, +/* 12705 */ {(16<<2)|3,{105,105,65}}, +/* 12706 */ {(16<<2)|3,{105,105,95}}, +/* 12707 */ {(16<<2)|3,{105,105,98}}, +/* 12708 */ {(16<<2)|3,{105,105,100}}, +/* 12709 */ {(16<<2)|3,{105,105,102}}, +/* 12710 */ {(16<<2)|3,{105,105,103}}, +/* 12711 */ {(16<<2)|3,{105,105,104}}, +/* 12712 */ {(16<<2)|3,{105,105,108}}, +/* 12713 */ {(16<<2)|3,{105,105,109}}, +/* 12714 */ {(16<<2)|3,{105,105,110}}, +/* 12715 */ {(16<<2)|3,{105,105,112}}, +/* 12716 */ {(16<<2)|3,{105,105,114}}, +/* 12717 */ {(16<<2)|3,{105,105,117}}, +/* 12718 */ {(10<<2)|2,{105,105,0}}, +/* 12719 */ {(10<<2)|2,{105,105,0}}, +/* 12720 */ {(10<<2)|2,{105,105,0}}, +/* 12721 */ {(10<<2)|2,{105,105,0}}, +/* 12722 */ {(10<<2)|2,{105,105,0}}, +/* 12723 */ {(10<<2)|2,{105,105,0}}, +/* 12724 */ {(10<<2)|2,{105,105,0}}, +/* 12725 */ {(10<<2)|2,{105,105,0}}, +/* 12726 */ {(10<<2)|2,{105,105,0}}, +/* 12727 */ {(10<<2)|2,{105,105,0}}, +/* 12728 */ {(10<<2)|2,{105,105,0}}, +/* 12729 */ {(10<<2)|2,{105,105,0}}, +/* 12730 */ {(10<<2)|2,{105,105,0}}, +/* 12731 */ {(10<<2)|2,{105,105,0}}, +/* 12732 */ {(10<<2)|2,{105,105,0}}, +/* 12733 */ {(10<<2)|2,{105,105,0}}, +/* 12734 */ {(10<<2)|2,{105,105,0}}, +/* 12735 */ {(10<<2)|2,{105,105,0}}, +/* 12736 */ {(15<<2)|3,{105,111,48}}, +/* 12737 */ {(15<<2)|3,{105,111,48}}, +/* 12738 */ {(15<<2)|3,{105,111,49}}, +/* 12739 */ {(15<<2)|3,{105,111,49}}, +/* 12740 */ {(15<<2)|3,{105,111,50}}, +/* 12741 */ {(15<<2)|3,{105,111,50}}, +/* 12742 */ {(15<<2)|3,{105,111,97}}, +/* 12743 */ {(15<<2)|3,{105,111,97}}, +/* 12744 */ {(15<<2)|3,{105,111,99}}, +/* 12745 */ {(15<<2)|3,{105,111,99}}, +/* 12746 */ {(15<<2)|3,{105,111,101}}, +/* 12747 */ {(15<<2)|3,{105,111,101}}, +/* 12748 */ {(15<<2)|3,{105,111,105}}, +/* 12749 */ {(15<<2)|3,{105,111,105}}, +/* 12750 */ {(15<<2)|3,{105,111,111}}, +/* 12751 */ {(15<<2)|3,{105,111,111}}, +/* 12752 */ {(15<<2)|3,{105,111,115}}, +/* 12753 */ {(15<<2)|3,{105,111,115}}, +/* 12754 */ {(15<<2)|3,{105,111,116}}, +/* 12755 */ {(15<<2)|3,{105,111,116}}, +/* 12756 */ {(16<<2)|3,{105,111,32}}, +/* 12757 */ {(16<<2)|3,{105,111,37}}, +/* 12758 */ {(16<<2)|3,{105,111,45}}, +/* 12759 */ {(16<<2)|3,{105,111,46}}, +/* 12760 */ {(16<<2)|3,{105,111,47}}, +/* 12761 */ {(16<<2)|3,{105,111,51}}, +/* 12762 */ {(16<<2)|3,{105,111,52}}, +/* 12763 */ {(16<<2)|3,{105,111,53}}, +/* 12764 */ {(16<<2)|3,{105,111,54}}, +/* 12765 */ {(16<<2)|3,{105,111,55}}, +/* 12766 */ {(16<<2)|3,{105,111,56}}, +/* 12767 */ {(16<<2)|3,{105,111,57}}, +/* 12768 */ {(16<<2)|3,{105,111,61}}, +/* 12769 */ {(16<<2)|3,{105,111,65}}, +/* 12770 */ {(16<<2)|3,{105,111,95}}, +/* 12771 */ {(16<<2)|3,{105,111,98}}, +/* 12772 */ {(16<<2)|3,{105,111,100}}, +/* 12773 */ {(16<<2)|3,{105,111,102}}, +/* 12774 */ {(16<<2)|3,{105,111,103}}, +/* 12775 */ {(16<<2)|3,{105,111,104}}, +/* 12776 */ {(16<<2)|3,{105,111,108}}, +/* 12777 */ {(16<<2)|3,{105,111,109}}, +/* 12778 */ {(16<<2)|3,{105,111,110}}, +/* 12779 */ {(16<<2)|3,{105,111,112}}, +/* 12780 */ {(16<<2)|3,{105,111,114}}, +/* 12781 */ {(16<<2)|3,{105,111,117}}, +/* 12782 */ {(10<<2)|2,{105,111,0}}, +/* 12783 */ {(10<<2)|2,{105,111,0}}, +/* 12784 */ {(10<<2)|2,{105,111,0}}, +/* 12785 */ {(10<<2)|2,{105,111,0}}, +/* 12786 */ {(10<<2)|2,{105,111,0}}, +/* 12787 */ {(10<<2)|2,{105,111,0}}, +/* 12788 */ {(10<<2)|2,{105,111,0}}, +/* 12789 */ {(10<<2)|2,{105,111,0}}, +/* 12790 */ {(10<<2)|2,{105,111,0}}, +/* 12791 */ {(10<<2)|2,{105,111,0}}, +/* 12792 */ {(10<<2)|2,{105,111,0}}, +/* 12793 */ {(10<<2)|2,{105,111,0}}, +/* 12794 */ {(10<<2)|2,{105,111,0}}, +/* 12795 */ {(10<<2)|2,{105,111,0}}, +/* 12796 */ {(10<<2)|2,{105,111,0}}, +/* 12797 */ {(10<<2)|2,{105,111,0}}, +/* 12798 */ {(10<<2)|2,{105,111,0}}, +/* 12799 */ {(10<<2)|2,{105,111,0}}, +/* 12800 */ {(15<<2)|3,{105,115,48}}, +/* 12801 */ {(15<<2)|3,{105,115,48}}, +/* 12802 */ {(15<<2)|3,{105,115,49}}, +/* 12803 */ {(15<<2)|3,{105,115,49}}, +/* 12804 */ {(15<<2)|3,{105,115,50}}, +/* 12805 */ {(15<<2)|3,{105,115,50}}, +/* 12806 */ {(15<<2)|3,{105,115,97}}, +/* 12807 */ {(15<<2)|3,{105,115,97}}, +/* 12808 */ {(15<<2)|3,{105,115,99}}, +/* 12809 */ {(15<<2)|3,{105,115,99}}, +/* 12810 */ {(15<<2)|3,{105,115,101}}, +/* 12811 */ {(15<<2)|3,{105,115,101}}, +/* 12812 */ {(15<<2)|3,{105,115,105}}, +/* 12813 */ {(15<<2)|3,{105,115,105}}, +/* 12814 */ {(15<<2)|3,{105,115,111}}, +/* 12815 */ {(15<<2)|3,{105,115,111}}, +/* 12816 */ {(15<<2)|3,{105,115,115}}, +/* 12817 */ {(15<<2)|3,{105,115,115}}, +/* 12818 */ {(15<<2)|3,{105,115,116}}, +/* 12819 */ {(15<<2)|3,{105,115,116}}, +/* 12820 */ {(16<<2)|3,{105,115,32}}, +/* 12821 */ {(16<<2)|3,{105,115,37}}, +/* 12822 */ {(16<<2)|3,{105,115,45}}, +/* 12823 */ {(16<<2)|3,{105,115,46}}, +/* 12824 */ {(16<<2)|3,{105,115,47}}, +/* 12825 */ {(16<<2)|3,{105,115,51}}, +/* 12826 */ {(16<<2)|3,{105,115,52}}, +/* 12827 */ {(16<<2)|3,{105,115,53}}, +/* 12828 */ {(16<<2)|3,{105,115,54}}, +/* 12829 */ {(16<<2)|3,{105,115,55}}, +/* 12830 */ {(16<<2)|3,{105,115,56}}, +/* 12831 */ {(16<<2)|3,{105,115,57}}, +/* 12832 */ {(16<<2)|3,{105,115,61}}, +/* 12833 */ {(16<<2)|3,{105,115,65}}, +/* 12834 */ {(16<<2)|3,{105,115,95}}, +/* 12835 */ {(16<<2)|3,{105,115,98}}, +/* 12836 */ {(16<<2)|3,{105,115,100}}, +/* 12837 */ {(16<<2)|3,{105,115,102}}, +/* 12838 */ {(16<<2)|3,{105,115,103}}, +/* 12839 */ {(16<<2)|3,{105,115,104}}, +/* 12840 */ {(16<<2)|3,{105,115,108}}, +/* 12841 */ {(16<<2)|3,{105,115,109}}, +/* 12842 */ {(16<<2)|3,{105,115,110}}, +/* 12843 */ {(16<<2)|3,{105,115,112}}, +/* 12844 */ {(16<<2)|3,{105,115,114}}, +/* 12845 */ {(16<<2)|3,{105,115,117}}, +/* 12846 */ {(10<<2)|2,{105,115,0}}, +/* 12847 */ {(10<<2)|2,{105,115,0}}, +/* 12848 */ {(10<<2)|2,{105,115,0}}, +/* 12849 */ {(10<<2)|2,{105,115,0}}, +/* 12850 */ {(10<<2)|2,{105,115,0}}, +/* 12851 */ {(10<<2)|2,{105,115,0}}, +/* 12852 */ {(10<<2)|2,{105,115,0}}, +/* 12853 */ {(10<<2)|2,{105,115,0}}, +/* 12854 */ {(10<<2)|2,{105,115,0}}, +/* 12855 */ {(10<<2)|2,{105,115,0}}, +/* 12856 */ {(10<<2)|2,{105,115,0}}, +/* 12857 */ {(10<<2)|2,{105,115,0}}, +/* 12858 */ {(10<<2)|2,{105,115,0}}, +/* 12859 */ {(10<<2)|2,{105,115,0}}, +/* 12860 */ {(10<<2)|2,{105,115,0}}, +/* 12861 */ {(10<<2)|2,{105,115,0}}, +/* 12862 */ {(10<<2)|2,{105,115,0}}, +/* 12863 */ {(10<<2)|2,{105,115,0}}, +/* 12864 */ {(15<<2)|3,{105,116,48}}, +/* 12865 */ {(15<<2)|3,{105,116,48}}, +/* 12866 */ {(15<<2)|3,{105,116,49}}, +/* 12867 */ {(15<<2)|3,{105,116,49}}, +/* 12868 */ {(15<<2)|3,{105,116,50}}, +/* 12869 */ {(15<<2)|3,{105,116,50}}, +/* 12870 */ {(15<<2)|3,{105,116,97}}, +/* 12871 */ {(15<<2)|3,{105,116,97}}, +/* 12872 */ {(15<<2)|3,{105,116,99}}, +/* 12873 */ {(15<<2)|3,{105,116,99}}, +/* 12874 */ {(15<<2)|3,{105,116,101}}, +/* 12875 */ {(15<<2)|3,{105,116,101}}, +/* 12876 */ {(15<<2)|3,{105,116,105}}, +/* 12877 */ {(15<<2)|3,{105,116,105}}, +/* 12878 */ {(15<<2)|3,{105,116,111}}, +/* 12879 */ {(15<<2)|3,{105,116,111}}, +/* 12880 */ {(15<<2)|3,{105,116,115}}, +/* 12881 */ {(15<<2)|3,{105,116,115}}, +/* 12882 */ {(15<<2)|3,{105,116,116}}, +/* 12883 */ {(15<<2)|3,{105,116,116}}, +/* 12884 */ {(16<<2)|3,{105,116,32}}, +/* 12885 */ {(16<<2)|3,{105,116,37}}, +/* 12886 */ {(16<<2)|3,{105,116,45}}, +/* 12887 */ {(16<<2)|3,{105,116,46}}, +/* 12888 */ {(16<<2)|3,{105,116,47}}, +/* 12889 */ {(16<<2)|3,{105,116,51}}, +/* 12890 */ {(16<<2)|3,{105,116,52}}, +/* 12891 */ {(16<<2)|3,{105,116,53}}, +/* 12892 */ {(16<<2)|3,{105,116,54}}, +/* 12893 */ {(16<<2)|3,{105,116,55}}, +/* 12894 */ {(16<<2)|3,{105,116,56}}, +/* 12895 */ {(16<<2)|3,{105,116,57}}, +/* 12896 */ {(16<<2)|3,{105,116,61}}, +/* 12897 */ {(16<<2)|3,{105,116,65}}, +/* 12898 */ {(16<<2)|3,{105,116,95}}, +/* 12899 */ {(16<<2)|3,{105,116,98}}, +/* 12900 */ {(16<<2)|3,{105,116,100}}, +/* 12901 */ {(16<<2)|3,{105,116,102}}, +/* 12902 */ {(16<<2)|3,{105,116,103}}, +/* 12903 */ {(16<<2)|3,{105,116,104}}, +/* 12904 */ {(16<<2)|3,{105,116,108}}, +/* 12905 */ {(16<<2)|3,{105,116,109}}, +/* 12906 */ {(16<<2)|3,{105,116,110}}, +/* 12907 */ {(16<<2)|3,{105,116,112}}, +/* 12908 */ {(16<<2)|3,{105,116,114}}, +/* 12909 */ {(16<<2)|3,{105,116,117}}, +/* 12910 */ {(10<<2)|2,{105,116,0}}, +/* 12911 */ {(10<<2)|2,{105,116,0}}, +/* 12912 */ {(10<<2)|2,{105,116,0}}, +/* 12913 */ {(10<<2)|2,{105,116,0}}, +/* 12914 */ {(10<<2)|2,{105,116,0}}, +/* 12915 */ {(10<<2)|2,{105,116,0}}, +/* 12916 */ {(10<<2)|2,{105,116,0}}, +/* 12917 */ {(10<<2)|2,{105,116,0}}, +/* 12918 */ {(10<<2)|2,{105,116,0}}, +/* 12919 */ {(10<<2)|2,{105,116,0}}, +/* 12920 */ {(10<<2)|2,{105,116,0}}, +/* 12921 */ {(10<<2)|2,{105,116,0}}, +/* 12922 */ {(10<<2)|2,{105,116,0}}, +/* 12923 */ {(10<<2)|2,{105,116,0}}, +/* 12924 */ {(10<<2)|2,{105,116,0}}, +/* 12925 */ {(10<<2)|2,{105,116,0}}, +/* 12926 */ {(10<<2)|2,{105,116,0}}, +/* 12927 */ {(10<<2)|2,{105,116,0}}, +/* 12928 */ {(16<<2)|3,{105,32,48}}, +/* 12929 */ {(16<<2)|3,{105,32,49}}, +/* 12930 */ {(16<<2)|3,{105,32,50}}, +/* 12931 */ {(16<<2)|3,{105,32,97}}, +/* 12932 */ {(16<<2)|3,{105,32,99}}, +/* 12933 */ {(16<<2)|3,{105,32,101}}, +/* 12934 */ {(16<<2)|3,{105,32,105}}, +/* 12935 */ {(16<<2)|3,{105,32,111}}, +/* 12936 */ {(16<<2)|3,{105,32,115}}, +/* 12937 */ {(16<<2)|3,{105,32,116}}, +/* 12938 */ {(11<<2)|2,{105,32,0}}, +/* 12939 */ {(11<<2)|2,{105,32,0}}, +/* 12940 */ {(11<<2)|2,{105,32,0}}, +/* 12941 */ {(11<<2)|2,{105,32,0}}, +/* 12942 */ {(11<<2)|2,{105,32,0}}, +/* 12943 */ {(11<<2)|2,{105,32,0}}, +/* 12944 */ {(11<<2)|2,{105,32,0}}, +/* 12945 */ {(11<<2)|2,{105,32,0}}, +/* 12946 */ {(11<<2)|2,{105,32,0}}, +/* 12947 */ {(11<<2)|2,{105,32,0}}, +/* 12948 */ {(11<<2)|2,{105,32,0}}, +/* 12949 */ {(11<<2)|2,{105,32,0}}, +/* 12950 */ {(11<<2)|2,{105,32,0}}, +/* 12951 */ {(11<<2)|2,{105,32,0}}, +/* 12952 */ {(11<<2)|2,{105,32,0}}, +/* 12953 */ {(11<<2)|2,{105,32,0}}, +/* 12954 */ {(11<<2)|2,{105,32,0}}, +/* 12955 */ {(11<<2)|2,{105,32,0}}, +/* 12956 */ {(11<<2)|2,{105,32,0}}, +/* 12957 */ {(11<<2)|2,{105,32,0}}, +/* 12958 */ {(11<<2)|2,{105,32,0}}, +/* 12959 */ {(11<<2)|2,{105,32,0}}, +/* 12960 */ {(16<<2)|3,{105,37,48}}, +/* 12961 */ {(16<<2)|3,{105,37,49}}, +/* 12962 */ {(16<<2)|3,{105,37,50}}, +/* 12963 */ {(16<<2)|3,{105,37,97}}, +/* 12964 */ {(16<<2)|3,{105,37,99}}, +/* 12965 */ {(16<<2)|3,{105,37,101}}, +/* 12966 */ {(16<<2)|3,{105,37,105}}, +/* 12967 */ {(16<<2)|3,{105,37,111}}, +/* 12968 */ {(16<<2)|3,{105,37,115}}, +/* 12969 */ {(16<<2)|3,{105,37,116}}, +/* 12970 */ {(11<<2)|2,{105,37,0}}, +/* 12971 */ {(11<<2)|2,{105,37,0}}, +/* 12972 */ {(11<<2)|2,{105,37,0}}, +/* 12973 */ {(11<<2)|2,{105,37,0}}, +/* 12974 */ {(11<<2)|2,{105,37,0}}, +/* 12975 */ {(11<<2)|2,{105,37,0}}, +/* 12976 */ {(11<<2)|2,{105,37,0}}, +/* 12977 */ {(11<<2)|2,{105,37,0}}, +/* 12978 */ {(11<<2)|2,{105,37,0}}, +/* 12979 */ {(11<<2)|2,{105,37,0}}, +/* 12980 */ {(11<<2)|2,{105,37,0}}, +/* 12981 */ {(11<<2)|2,{105,37,0}}, +/* 12982 */ {(11<<2)|2,{105,37,0}}, +/* 12983 */ {(11<<2)|2,{105,37,0}}, +/* 12984 */ {(11<<2)|2,{105,37,0}}, +/* 12985 */ {(11<<2)|2,{105,37,0}}, +/* 12986 */ {(11<<2)|2,{105,37,0}}, +/* 12987 */ {(11<<2)|2,{105,37,0}}, +/* 12988 */ {(11<<2)|2,{105,37,0}}, +/* 12989 */ {(11<<2)|2,{105,37,0}}, +/* 12990 */ {(11<<2)|2,{105,37,0}}, +/* 12991 */ {(11<<2)|2,{105,37,0}}, +/* 12992 */ {(16<<2)|3,{105,45,48}}, +/* 12993 */ {(16<<2)|3,{105,45,49}}, +/* 12994 */ {(16<<2)|3,{105,45,50}}, +/* 12995 */ {(16<<2)|3,{105,45,97}}, +/* 12996 */ {(16<<2)|3,{105,45,99}}, +/* 12997 */ {(16<<2)|3,{105,45,101}}, +/* 12998 */ {(16<<2)|3,{105,45,105}}, +/* 12999 */ {(16<<2)|3,{105,45,111}}, +/* 13000 */ {(16<<2)|3,{105,45,115}}, +/* 13001 */ {(16<<2)|3,{105,45,116}}, +/* 13002 */ {(11<<2)|2,{105,45,0}}, +/* 13003 */ {(11<<2)|2,{105,45,0}}, +/* 13004 */ {(11<<2)|2,{105,45,0}}, +/* 13005 */ {(11<<2)|2,{105,45,0}}, +/* 13006 */ {(11<<2)|2,{105,45,0}}, +/* 13007 */ {(11<<2)|2,{105,45,0}}, +/* 13008 */ {(11<<2)|2,{105,45,0}}, +/* 13009 */ {(11<<2)|2,{105,45,0}}, +/* 13010 */ {(11<<2)|2,{105,45,0}}, +/* 13011 */ {(11<<2)|2,{105,45,0}}, +/* 13012 */ {(11<<2)|2,{105,45,0}}, +/* 13013 */ {(11<<2)|2,{105,45,0}}, +/* 13014 */ {(11<<2)|2,{105,45,0}}, +/* 13015 */ {(11<<2)|2,{105,45,0}}, +/* 13016 */ {(11<<2)|2,{105,45,0}}, +/* 13017 */ {(11<<2)|2,{105,45,0}}, +/* 13018 */ {(11<<2)|2,{105,45,0}}, +/* 13019 */ {(11<<2)|2,{105,45,0}}, +/* 13020 */ {(11<<2)|2,{105,45,0}}, +/* 13021 */ {(11<<2)|2,{105,45,0}}, +/* 13022 */ {(11<<2)|2,{105,45,0}}, +/* 13023 */ {(11<<2)|2,{105,45,0}}, +/* 13024 */ {(16<<2)|3,{105,46,48}}, +/* 13025 */ {(16<<2)|3,{105,46,49}}, +/* 13026 */ {(16<<2)|3,{105,46,50}}, +/* 13027 */ {(16<<2)|3,{105,46,97}}, +/* 13028 */ {(16<<2)|3,{105,46,99}}, +/* 13029 */ {(16<<2)|3,{105,46,101}}, +/* 13030 */ {(16<<2)|3,{105,46,105}}, +/* 13031 */ {(16<<2)|3,{105,46,111}}, +/* 13032 */ {(16<<2)|3,{105,46,115}}, +/* 13033 */ {(16<<2)|3,{105,46,116}}, +/* 13034 */ {(11<<2)|2,{105,46,0}}, +/* 13035 */ {(11<<2)|2,{105,46,0}}, +/* 13036 */ {(11<<2)|2,{105,46,0}}, +/* 13037 */ {(11<<2)|2,{105,46,0}}, +/* 13038 */ {(11<<2)|2,{105,46,0}}, +/* 13039 */ {(11<<2)|2,{105,46,0}}, +/* 13040 */ {(11<<2)|2,{105,46,0}}, +/* 13041 */ {(11<<2)|2,{105,46,0}}, +/* 13042 */ {(11<<2)|2,{105,46,0}}, +/* 13043 */ {(11<<2)|2,{105,46,0}}, +/* 13044 */ {(11<<2)|2,{105,46,0}}, +/* 13045 */ {(11<<2)|2,{105,46,0}}, +/* 13046 */ {(11<<2)|2,{105,46,0}}, +/* 13047 */ {(11<<2)|2,{105,46,0}}, +/* 13048 */ {(11<<2)|2,{105,46,0}}, +/* 13049 */ {(11<<2)|2,{105,46,0}}, +/* 13050 */ {(11<<2)|2,{105,46,0}}, +/* 13051 */ {(11<<2)|2,{105,46,0}}, +/* 13052 */ {(11<<2)|2,{105,46,0}}, +/* 13053 */ {(11<<2)|2,{105,46,0}}, +/* 13054 */ {(11<<2)|2,{105,46,0}}, +/* 13055 */ {(11<<2)|2,{105,46,0}}, +/* 13056 */ {(16<<2)|3,{105,47,48}}, +/* 13057 */ {(16<<2)|3,{105,47,49}}, +/* 13058 */ {(16<<2)|3,{105,47,50}}, +/* 13059 */ {(16<<2)|3,{105,47,97}}, +/* 13060 */ {(16<<2)|3,{105,47,99}}, +/* 13061 */ {(16<<2)|3,{105,47,101}}, +/* 13062 */ {(16<<2)|3,{105,47,105}}, +/* 13063 */ {(16<<2)|3,{105,47,111}}, +/* 13064 */ {(16<<2)|3,{105,47,115}}, +/* 13065 */ {(16<<2)|3,{105,47,116}}, +/* 13066 */ {(11<<2)|2,{105,47,0}}, +/* 13067 */ {(11<<2)|2,{105,47,0}}, +/* 13068 */ {(11<<2)|2,{105,47,0}}, +/* 13069 */ {(11<<2)|2,{105,47,0}}, +/* 13070 */ {(11<<2)|2,{105,47,0}}, +/* 13071 */ {(11<<2)|2,{105,47,0}}, +/* 13072 */ {(11<<2)|2,{105,47,0}}, +/* 13073 */ {(11<<2)|2,{105,47,0}}, +/* 13074 */ {(11<<2)|2,{105,47,0}}, +/* 13075 */ {(11<<2)|2,{105,47,0}}, +/* 13076 */ {(11<<2)|2,{105,47,0}}, +/* 13077 */ {(11<<2)|2,{105,47,0}}, +/* 13078 */ {(11<<2)|2,{105,47,0}}, +/* 13079 */ {(11<<2)|2,{105,47,0}}, +/* 13080 */ {(11<<2)|2,{105,47,0}}, +/* 13081 */ {(11<<2)|2,{105,47,0}}, +/* 13082 */ {(11<<2)|2,{105,47,0}}, +/* 13083 */ {(11<<2)|2,{105,47,0}}, +/* 13084 */ {(11<<2)|2,{105,47,0}}, +/* 13085 */ {(11<<2)|2,{105,47,0}}, +/* 13086 */ {(11<<2)|2,{105,47,0}}, +/* 13087 */ {(11<<2)|2,{105,47,0}}, +/* 13088 */ {(16<<2)|3,{105,51,48}}, +/* 13089 */ {(16<<2)|3,{105,51,49}}, +/* 13090 */ {(16<<2)|3,{105,51,50}}, +/* 13091 */ {(16<<2)|3,{105,51,97}}, +/* 13092 */ {(16<<2)|3,{105,51,99}}, +/* 13093 */ {(16<<2)|3,{105,51,101}}, +/* 13094 */ {(16<<2)|3,{105,51,105}}, +/* 13095 */ {(16<<2)|3,{105,51,111}}, +/* 13096 */ {(16<<2)|3,{105,51,115}}, +/* 13097 */ {(16<<2)|3,{105,51,116}}, +/* 13098 */ {(11<<2)|2,{105,51,0}}, +/* 13099 */ {(11<<2)|2,{105,51,0}}, +/* 13100 */ {(11<<2)|2,{105,51,0}}, +/* 13101 */ {(11<<2)|2,{105,51,0}}, +/* 13102 */ {(11<<2)|2,{105,51,0}}, +/* 13103 */ {(11<<2)|2,{105,51,0}}, +/* 13104 */ {(11<<2)|2,{105,51,0}}, +/* 13105 */ {(11<<2)|2,{105,51,0}}, +/* 13106 */ {(11<<2)|2,{105,51,0}}, +/* 13107 */ {(11<<2)|2,{105,51,0}}, +/* 13108 */ {(11<<2)|2,{105,51,0}}, +/* 13109 */ {(11<<2)|2,{105,51,0}}, +/* 13110 */ {(11<<2)|2,{105,51,0}}, +/* 13111 */ {(11<<2)|2,{105,51,0}}, +/* 13112 */ {(11<<2)|2,{105,51,0}}, +/* 13113 */ {(11<<2)|2,{105,51,0}}, +/* 13114 */ {(11<<2)|2,{105,51,0}}, +/* 13115 */ {(11<<2)|2,{105,51,0}}, +/* 13116 */ {(11<<2)|2,{105,51,0}}, +/* 13117 */ {(11<<2)|2,{105,51,0}}, +/* 13118 */ {(11<<2)|2,{105,51,0}}, +/* 13119 */ {(11<<2)|2,{105,51,0}}, +/* 13120 */ {(16<<2)|3,{105,52,48}}, +/* 13121 */ {(16<<2)|3,{105,52,49}}, +/* 13122 */ {(16<<2)|3,{105,52,50}}, +/* 13123 */ {(16<<2)|3,{105,52,97}}, +/* 13124 */ {(16<<2)|3,{105,52,99}}, +/* 13125 */ {(16<<2)|3,{105,52,101}}, +/* 13126 */ {(16<<2)|3,{105,52,105}}, +/* 13127 */ {(16<<2)|3,{105,52,111}}, +/* 13128 */ {(16<<2)|3,{105,52,115}}, +/* 13129 */ {(16<<2)|3,{105,52,116}}, +/* 13130 */ {(11<<2)|2,{105,52,0}}, +/* 13131 */ {(11<<2)|2,{105,52,0}}, +/* 13132 */ {(11<<2)|2,{105,52,0}}, +/* 13133 */ {(11<<2)|2,{105,52,0}}, +/* 13134 */ {(11<<2)|2,{105,52,0}}, +/* 13135 */ {(11<<2)|2,{105,52,0}}, +/* 13136 */ {(11<<2)|2,{105,52,0}}, +/* 13137 */ {(11<<2)|2,{105,52,0}}, +/* 13138 */ {(11<<2)|2,{105,52,0}}, +/* 13139 */ {(11<<2)|2,{105,52,0}}, +/* 13140 */ {(11<<2)|2,{105,52,0}}, +/* 13141 */ {(11<<2)|2,{105,52,0}}, +/* 13142 */ {(11<<2)|2,{105,52,0}}, +/* 13143 */ {(11<<2)|2,{105,52,0}}, +/* 13144 */ {(11<<2)|2,{105,52,0}}, +/* 13145 */ {(11<<2)|2,{105,52,0}}, +/* 13146 */ {(11<<2)|2,{105,52,0}}, +/* 13147 */ {(11<<2)|2,{105,52,0}}, +/* 13148 */ {(11<<2)|2,{105,52,0}}, +/* 13149 */ {(11<<2)|2,{105,52,0}}, +/* 13150 */ {(11<<2)|2,{105,52,0}}, +/* 13151 */ {(11<<2)|2,{105,52,0}}, +/* 13152 */ {(16<<2)|3,{105,53,48}}, +/* 13153 */ {(16<<2)|3,{105,53,49}}, +/* 13154 */ {(16<<2)|3,{105,53,50}}, +/* 13155 */ {(16<<2)|3,{105,53,97}}, +/* 13156 */ {(16<<2)|3,{105,53,99}}, +/* 13157 */ {(16<<2)|3,{105,53,101}}, +/* 13158 */ {(16<<2)|3,{105,53,105}}, +/* 13159 */ {(16<<2)|3,{105,53,111}}, +/* 13160 */ {(16<<2)|3,{105,53,115}}, +/* 13161 */ {(16<<2)|3,{105,53,116}}, +/* 13162 */ {(11<<2)|2,{105,53,0}}, +/* 13163 */ {(11<<2)|2,{105,53,0}}, +/* 13164 */ {(11<<2)|2,{105,53,0}}, +/* 13165 */ {(11<<2)|2,{105,53,0}}, +/* 13166 */ {(11<<2)|2,{105,53,0}}, +/* 13167 */ {(11<<2)|2,{105,53,0}}, +/* 13168 */ {(11<<2)|2,{105,53,0}}, +/* 13169 */ {(11<<2)|2,{105,53,0}}, +/* 13170 */ {(11<<2)|2,{105,53,0}}, +/* 13171 */ {(11<<2)|2,{105,53,0}}, +/* 13172 */ {(11<<2)|2,{105,53,0}}, +/* 13173 */ {(11<<2)|2,{105,53,0}}, +/* 13174 */ {(11<<2)|2,{105,53,0}}, +/* 13175 */ {(11<<2)|2,{105,53,0}}, +/* 13176 */ {(11<<2)|2,{105,53,0}}, +/* 13177 */ {(11<<2)|2,{105,53,0}}, +/* 13178 */ {(11<<2)|2,{105,53,0}}, +/* 13179 */ {(11<<2)|2,{105,53,0}}, +/* 13180 */ {(11<<2)|2,{105,53,0}}, +/* 13181 */ {(11<<2)|2,{105,53,0}}, +/* 13182 */ {(11<<2)|2,{105,53,0}}, +/* 13183 */ {(11<<2)|2,{105,53,0}}, +/* 13184 */ {(16<<2)|3,{105,54,48}}, +/* 13185 */ {(16<<2)|3,{105,54,49}}, +/* 13186 */ {(16<<2)|3,{105,54,50}}, +/* 13187 */ {(16<<2)|3,{105,54,97}}, +/* 13188 */ {(16<<2)|3,{105,54,99}}, +/* 13189 */ {(16<<2)|3,{105,54,101}}, +/* 13190 */ {(16<<2)|3,{105,54,105}}, +/* 13191 */ {(16<<2)|3,{105,54,111}}, +/* 13192 */ {(16<<2)|3,{105,54,115}}, +/* 13193 */ {(16<<2)|3,{105,54,116}}, +/* 13194 */ {(11<<2)|2,{105,54,0}}, +/* 13195 */ {(11<<2)|2,{105,54,0}}, +/* 13196 */ {(11<<2)|2,{105,54,0}}, +/* 13197 */ {(11<<2)|2,{105,54,0}}, +/* 13198 */ {(11<<2)|2,{105,54,0}}, +/* 13199 */ {(11<<2)|2,{105,54,0}}, +/* 13200 */ {(11<<2)|2,{105,54,0}}, +/* 13201 */ {(11<<2)|2,{105,54,0}}, +/* 13202 */ {(11<<2)|2,{105,54,0}}, +/* 13203 */ {(11<<2)|2,{105,54,0}}, +/* 13204 */ {(11<<2)|2,{105,54,0}}, +/* 13205 */ {(11<<2)|2,{105,54,0}}, +/* 13206 */ {(11<<2)|2,{105,54,0}}, +/* 13207 */ {(11<<2)|2,{105,54,0}}, +/* 13208 */ {(11<<2)|2,{105,54,0}}, +/* 13209 */ {(11<<2)|2,{105,54,0}}, +/* 13210 */ {(11<<2)|2,{105,54,0}}, +/* 13211 */ {(11<<2)|2,{105,54,0}}, +/* 13212 */ {(11<<2)|2,{105,54,0}}, +/* 13213 */ {(11<<2)|2,{105,54,0}}, +/* 13214 */ {(11<<2)|2,{105,54,0}}, +/* 13215 */ {(11<<2)|2,{105,54,0}}, +/* 13216 */ {(16<<2)|3,{105,55,48}}, +/* 13217 */ {(16<<2)|3,{105,55,49}}, +/* 13218 */ {(16<<2)|3,{105,55,50}}, +/* 13219 */ {(16<<2)|3,{105,55,97}}, +/* 13220 */ {(16<<2)|3,{105,55,99}}, +/* 13221 */ {(16<<2)|3,{105,55,101}}, +/* 13222 */ {(16<<2)|3,{105,55,105}}, +/* 13223 */ {(16<<2)|3,{105,55,111}}, +/* 13224 */ {(16<<2)|3,{105,55,115}}, +/* 13225 */ {(16<<2)|3,{105,55,116}}, +/* 13226 */ {(11<<2)|2,{105,55,0}}, +/* 13227 */ {(11<<2)|2,{105,55,0}}, +/* 13228 */ {(11<<2)|2,{105,55,0}}, +/* 13229 */ {(11<<2)|2,{105,55,0}}, +/* 13230 */ {(11<<2)|2,{105,55,0}}, +/* 13231 */ {(11<<2)|2,{105,55,0}}, +/* 13232 */ {(11<<2)|2,{105,55,0}}, +/* 13233 */ {(11<<2)|2,{105,55,0}}, +/* 13234 */ {(11<<2)|2,{105,55,0}}, +/* 13235 */ {(11<<2)|2,{105,55,0}}, +/* 13236 */ {(11<<2)|2,{105,55,0}}, +/* 13237 */ {(11<<2)|2,{105,55,0}}, +/* 13238 */ {(11<<2)|2,{105,55,0}}, +/* 13239 */ {(11<<2)|2,{105,55,0}}, +/* 13240 */ {(11<<2)|2,{105,55,0}}, +/* 13241 */ {(11<<2)|2,{105,55,0}}, +/* 13242 */ {(11<<2)|2,{105,55,0}}, +/* 13243 */ {(11<<2)|2,{105,55,0}}, +/* 13244 */ {(11<<2)|2,{105,55,0}}, +/* 13245 */ {(11<<2)|2,{105,55,0}}, +/* 13246 */ {(11<<2)|2,{105,55,0}}, +/* 13247 */ {(11<<2)|2,{105,55,0}}, +/* 13248 */ {(16<<2)|3,{105,56,48}}, +/* 13249 */ {(16<<2)|3,{105,56,49}}, +/* 13250 */ {(16<<2)|3,{105,56,50}}, +/* 13251 */ {(16<<2)|3,{105,56,97}}, +/* 13252 */ {(16<<2)|3,{105,56,99}}, +/* 13253 */ {(16<<2)|3,{105,56,101}}, +/* 13254 */ {(16<<2)|3,{105,56,105}}, +/* 13255 */ {(16<<2)|3,{105,56,111}}, +/* 13256 */ {(16<<2)|3,{105,56,115}}, +/* 13257 */ {(16<<2)|3,{105,56,116}}, +/* 13258 */ {(11<<2)|2,{105,56,0}}, +/* 13259 */ {(11<<2)|2,{105,56,0}}, +/* 13260 */ {(11<<2)|2,{105,56,0}}, +/* 13261 */ {(11<<2)|2,{105,56,0}}, +/* 13262 */ {(11<<2)|2,{105,56,0}}, +/* 13263 */ {(11<<2)|2,{105,56,0}}, +/* 13264 */ {(11<<2)|2,{105,56,0}}, +/* 13265 */ {(11<<2)|2,{105,56,0}}, +/* 13266 */ {(11<<2)|2,{105,56,0}}, +/* 13267 */ {(11<<2)|2,{105,56,0}}, +/* 13268 */ {(11<<2)|2,{105,56,0}}, +/* 13269 */ {(11<<2)|2,{105,56,0}}, +/* 13270 */ {(11<<2)|2,{105,56,0}}, +/* 13271 */ {(11<<2)|2,{105,56,0}}, +/* 13272 */ {(11<<2)|2,{105,56,0}}, +/* 13273 */ {(11<<2)|2,{105,56,0}}, +/* 13274 */ {(11<<2)|2,{105,56,0}}, +/* 13275 */ {(11<<2)|2,{105,56,0}}, +/* 13276 */ {(11<<2)|2,{105,56,0}}, +/* 13277 */ {(11<<2)|2,{105,56,0}}, +/* 13278 */ {(11<<2)|2,{105,56,0}}, +/* 13279 */ {(11<<2)|2,{105,56,0}}, +/* 13280 */ {(16<<2)|3,{105,57,48}}, +/* 13281 */ {(16<<2)|3,{105,57,49}}, +/* 13282 */ {(16<<2)|3,{105,57,50}}, +/* 13283 */ {(16<<2)|3,{105,57,97}}, +/* 13284 */ {(16<<2)|3,{105,57,99}}, +/* 13285 */ {(16<<2)|3,{105,57,101}}, +/* 13286 */ {(16<<2)|3,{105,57,105}}, +/* 13287 */ {(16<<2)|3,{105,57,111}}, +/* 13288 */ {(16<<2)|3,{105,57,115}}, +/* 13289 */ {(16<<2)|3,{105,57,116}}, +/* 13290 */ {(11<<2)|2,{105,57,0}}, +/* 13291 */ {(11<<2)|2,{105,57,0}}, +/* 13292 */ {(11<<2)|2,{105,57,0}}, +/* 13293 */ {(11<<2)|2,{105,57,0}}, +/* 13294 */ {(11<<2)|2,{105,57,0}}, +/* 13295 */ {(11<<2)|2,{105,57,0}}, +/* 13296 */ {(11<<2)|2,{105,57,0}}, +/* 13297 */ {(11<<2)|2,{105,57,0}}, +/* 13298 */ {(11<<2)|2,{105,57,0}}, +/* 13299 */ {(11<<2)|2,{105,57,0}}, +/* 13300 */ {(11<<2)|2,{105,57,0}}, +/* 13301 */ {(11<<2)|2,{105,57,0}}, +/* 13302 */ {(11<<2)|2,{105,57,0}}, +/* 13303 */ {(11<<2)|2,{105,57,0}}, +/* 13304 */ {(11<<2)|2,{105,57,0}}, +/* 13305 */ {(11<<2)|2,{105,57,0}}, +/* 13306 */ {(11<<2)|2,{105,57,0}}, +/* 13307 */ {(11<<2)|2,{105,57,0}}, +/* 13308 */ {(11<<2)|2,{105,57,0}}, +/* 13309 */ {(11<<2)|2,{105,57,0}}, +/* 13310 */ {(11<<2)|2,{105,57,0}}, +/* 13311 */ {(11<<2)|2,{105,57,0}}, +/* 13312 */ {(16<<2)|3,{105,61,48}}, +/* 13313 */ {(16<<2)|3,{105,61,49}}, +/* 13314 */ {(16<<2)|3,{105,61,50}}, +/* 13315 */ {(16<<2)|3,{105,61,97}}, +/* 13316 */ {(16<<2)|3,{105,61,99}}, +/* 13317 */ {(16<<2)|3,{105,61,101}}, +/* 13318 */ {(16<<2)|3,{105,61,105}}, +/* 13319 */ {(16<<2)|3,{105,61,111}}, +/* 13320 */ {(16<<2)|3,{105,61,115}}, +/* 13321 */ {(16<<2)|3,{105,61,116}}, +/* 13322 */ {(11<<2)|2,{105,61,0}}, +/* 13323 */ {(11<<2)|2,{105,61,0}}, +/* 13324 */ {(11<<2)|2,{105,61,0}}, +/* 13325 */ {(11<<2)|2,{105,61,0}}, +/* 13326 */ {(11<<2)|2,{105,61,0}}, +/* 13327 */ {(11<<2)|2,{105,61,0}}, +/* 13328 */ {(11<<2)|2,{105,61,0}}, +/* 13329 */ {(11<<2)|2,{105,61,0}}, +/* 13330 */ {(11<<2)|2,{105,61,0}}, +/* 13331 */ {(11<<2)|2,{105,61,0}}, +/* 13332 */ {(11<<2)|2,{105,61,0}}, +/* 13333 */ {(11<<2)|2,{105,61,0}}, +/* 13334 */ {(11<<2)|2,{105,61,0}}, +/* 13335 */ {(11<<2)|2,{105,61,0}}, +/* 13336 */ {(11<<2)|2,{105,61,0}}, +/* 13337 */ {(11<<2)|2,{105,61,0}}, +/* 13338 */ {(11<<2)|2,{105,61,0}}, +/* 13339 */ {(11<<2)|2,{105,61,0}}, +/* 13340 */ {(11<<2)|2,{105,61,0}}, +/* 13341 */ {(11<<2)|2,{105,61,0}}, +/* 13342 */ {(11<<2)|2,{105,61,0}}, +/* 13343 */ {(11<<2)|2,{105,61,0}}, +/* 13344 */ {(16<<2)|3,{105,65,48}}, +/* 13345 */ {(16<<2)|3,{105,65,49}}, +/* 13346 */ {(16<<2)|3,{105,65,50}}, +/* 13347 */ {(16<<2)|3,{105,65,97}}, +/* 13348 */ {(16<<2)|3,{105,65,99}}, +/* 13349 */ {(16<<2)|3,{105,65,101}}, +/* 13350 */ {(16<<2)|3,{105,65,105}}, +/* 13351 */ {(16<<2)|3,{105,65,111}}, +/* 13352 */ {(16<<2)|3,{105,65,115}}, +/* 13353 */ {(16<<2)|3,{105,65,116}}, +/* 13354 */ {(11<<2)|2,{105,65,0}}, +/* 13355 */ {(11<<2)|2,{105,65,0}}, +/* 13356 */ {(11<<2)|2,{105,65,0}}, +/* 13357 */ {(11<<2)|2,{105,65,0}}, +/* 13358 */ {(11<<2)|2,{105,65,0}}, +/* 13359 */ {(11<<2)|2,{105,65,0}}, +/* 13360 */ {(11<<2)|2,{105,65,0}}, +/* 13361 */ {(11<<2)|2,{105,65,0}}, +/* 13362 */ {(11<<2)|2,{105,65,0}}, +/* 13363 */ {(11<<2)|2,{105,65,0}}, +/* 13364 */ {(11<<2)|2,{105,65,0}}, +/* 13365 */ {(11<<2)|2,{105,65,0}}, +/* 13366 */ {(11<<2)|2,{105,65,0}}, +/* 13367 */ {(11<<2)|2,{105,65,0}}, +/* 13368 */ {(11<<2)|2,{105,65,0}}, +/* 13369 */ {(11<<2)|2,{105,65,0}}, +/* 13370 */ {(11<<2)|2,{105,65,0}}, +/* 13371 */ {(11<<2)|2,{105,65,0}}, +/* 13372 */ {(11<<2)|2,{105,65,0}}, +/* 13373 */ {(11<<2)|2,{105,65,0}}, +/* 13374 */ {(11<<2)|2,{105,65,0}}, +/* 13375 */ {(11<<2)|2,{105,65,0}}, +/* 13376 */ {(16<<2)|3,{105,95,48}}, +/* 13377 */ {(16<<2)|3,{105,95,49}}, +/* 13378 */ {(16<<2)|3,{105,95,50}}, +/* 13379 */ {(16<<2)|3,{105,95,97}}, +/* 13380 */ {(16<<2)|3,{105,95,99}}, +/* 13381 */ {(16<<2)|3,{105,95,101}}, +/* 13382 */ {(16<<2)|3,{105,95,105}}, +/* 13383 */ {(16<<2)|3,{105,95,111}}, +/* 13384 */ {(16<<2)|3,{105,95,115}}, +/* 13385 */ {(16<<2)|3,{105,95,116}}, +/* 13386 */ {(11<<2)|2,{105,95,0}}, +/* 13387 */ {(11<<2)|2,{105,95,0}}, +/* 13388 */ {(11<<2)|2,{105,95,0}}, +/* 13389 */ {(11<<2)|2,{105,95,0}}, +/* 13390 */ {(11<<2)|2,{105,95,0}}, +/* 13391 */ {(11<<2)|2,{105,95,0}}, +/* 13392 */ {(11<<2)|2,{105,95,0}}, +/* 13393 */ {(11<<2)|2,{105,95,0}}, +/* 13394 */ {(11<<2)|2,{105,95,0}}, +/* 13395 */ {(11<<2)|2,{105,95,0}}, +/* 13396 */ {(11<<2)|2,{105,95,0}}, +/* 13397 */ {(11<<2)|2,{105,95,0}}, +/* 13398 */ {(11<<2)|2,{105,95,0}}, +/* 13399 */ {(11<<2)|2,{105,95,0}}, +/* 13400 */ {(11<<2)|2,{105,95,0}}, +/* 13401 */ {(11<<2)|2,{105,95,0}}, +/* 13402 */ {(11<<2)|2,{105,95,0}}, +/* 13403 */ {(11<<2)|2,{105,95,0}}, +/* 13404 */ {(11<<2)|2,{105,95,0}}, +/* 13405 */ {(11<<2)|2,{105,95,0}}, +/* 13406 */ {(11<<2)|2,{105,95,0}}, +/* 13407 */ {(11<<2)|2,{105,95,0}}, +/* 13408 */ {(16<<2)|3,{105,98,48}}, +/* 13409 */ {(16<<2)|3,{105,98,49}}, +/* 13410 */ {(16<<2)|3,{105,98,50}}, +/* 13411 */ {(16<<2)|3,{105,98,97}}, +/* 13412 */ {(16<<2)|3,{105,98,99}}, +/* 13413 */ {(16<<2)|3,{105,98,101}}, +/* 13414 */ {(16<<2)|3,{105,98,105}}, +/* 13415 */ {(16<<2)|3,{105,98,111}}, +/* 13416 */ {(16<<2)|3,{105,98,115}}, +/* 13417 */ {(16<<2)|3,{105,98,116}}, +/* 13418 */ {(11<<2)|2,{105,98,0}}, +/* 13419 */ {(11<<2)|2,{105,98,0}}, +/* 13420 */ {(11<<2)|2,{105,98,0}}, +/* 13421 */ {(11<<2)|2,{105,98,0}}, +/* 13422 */ {(11<<2)|2,{105,98,0}}, +/* 13423 */ {(11<<2)|2,{105,98,0}}, +/* 13424 */ {(11<<2)|2,{105,98,0}}, +/* 13425 */ {(11<<2)|2,{105,98,0}}, +/* 13426 */ {(11<<2)|2,{105,98,0}}, +/* 13427 */ {(11<<2)|2,{105,98,0}}, +/* 13428 */ {(11<<2)|2,{105,98,0}}, +/* 13429 */ {(11<<2)|2,{105,98,0}}, +/* 13430 */ {(11<<2)|2,{105,98,0}}, +/* 13431 */ {(11<<2)|2,{105,98,0}}, +/* 13432 */ {(11<<2)|2,{105,98,0}}, +/* 13433 */ {(11<<2)|2,{105,98,0}}, +/* 13434 */ {(11<<2)|2,{105,98,0}}, +/* 13435 */ {(11<<2)|2,{105,98,0}}, +/* 13436 */ {(11<<2)|2,{105,98,0}}, +/* 13437 */ {(11<<2)|2,{105,98,0}}, +/* 13438 */ {(11<<2)|2,{105,98,0}}, +/* 13439 */ {(11<<2)|2,{105,98,0}}, +/* 13440 */ {(16<<2)|3,{105,100,48}}, +/* 13441 */ {(16<<2)|3,{105,100,49}}, +/* 13442 */ {(16<<2)|3,{105,100,50}}, +/* 13443 */ {(16<<2)|3,{105,100,97}}, +/* 13444 */ {(16<<2)|3,{105,100,99}}, +/* 13445 */ {(16<<2)|3,{105,100,101}}, +/* 13446 */ {(16<<2)|3,{105,100,105}}, +/* 13447 */ {(16<<2)|3,{105,100,111}}, +/* 13448 */ {(16<<2)|3,{105,100,115}}, +/* 13449 */ {(16<<2)|3,{105,100,116}}, +/* 13450 */ {(11<<2)|2,{105,100,0}}, +/* 13451 */ {(11<<2)|2,{105,100,0}}, +/* 13452 */ {(11<<2)|2,{105,100,0}}, +/* 13453 */ {(11<<2)|2,{105,100,0}}, +/* 13454 */ {(11<<2)|2,{105,100,0}}, +/* 13455 */ {(11<<2)|2,{105,100,0}}, +/* 13456 */ {(11<<2)|2,{105,100,0}}, +/* 13457 */ {(11<<2)|2,{105,100,0}}, +/* 13458 */ {(11<<2)|2,{105,100,0}}, +/* 13459 */ {(11<<2)|2,{105,100,0}}, +/* 13460 */ {(11<<2)|2,{105,100,0}}, +/* 13461 */ {(11<<2)|2,{105,100,0}}, +/* 13462 */ {(11<<2)|2,{105,100,0}}, +/* 13463 */ {(11<<2)|2,{105,100,0}}, +/* 13464 */ {(11<<2)|2,{105,100,0}}, +/* 13465 */ {(11<<2)|2,{105,100,0}}, +/* 13466 */ {(11<<2)|2,{105,100,0}}, +/* 13467 */ {(11<<2)|2,{105,100,0}}, +/* 13468 */ {(11<<2)|2,{105,100,0}}, +/* 13469 */ {(11<<2)|2,{105,100,0}}, +/* 13470 */ {(11<<2)|2,{105,100,0}}, +/* 13471 */ {(11<<2)|2,{105,100,0}}, +/* 13472 */ {(16<<2)|3,{105,102,48}}, +/* 13473 */ {(16<<2)|3,{105,102,49}}, +/* 13474 */ {(16<<2)|3,{105,102,50}}, +/* 13475 */ {(16<<2)|3,{105,102,97}}, +/* 13476 */ {(16<<2)|3,{105,102,99}}, +/* 13477 */ {(16<<2)|3,{105,102,101}}, +/* 13478 */ {(16<<2)|3,{105,102,105}}, +/* 13479 */ {(16<<2)|3,{105,102,111}}, +/* 13480 */ {(16<<2)|3,{105,102,115}}, +/* 13481 */ {(16<<2)|3,{105,102,116}}, +/* 13482 */ {(11<<2)|2,{105,102,0}}, +/* 13483 */ {(11<<2)|2,{105,102,0}}, +/* 13484 */ {(11<<2)|2,{105,102,0}}, +/* 13485 */ {(11<<2)|2,{105,102,0}}, +/* 13486 */ {(11<<2)|2,{105,102,0}}, +/* 13487 */ {(11<<2)|2,{105,102,0}}, +/* 13488 */ {(11<<2)|2,{105,102,0}}, +/* 13489 */ {(11<<2)|2,{105,102,0}}, +/* 13490 */ {(11<<2)|2,{105,102,0}}, +/* 13491 */ {(11<<2)|2,{105,102,0}}, +/* 13492 */ {(11<<2)|2,{105,102,0}}, +/* 13493 */ {(11<<2)|2,{105,102,0}}, +/* 13494 */ {(11<<2)|2,{105,102,0}}, +/* 13495 */ {(11<<2)|2,{105,102,0}}, +/* 13496 */ {(11<<2)|2,{105,102,0}}, +/* 13497 */ {(11<<2)|2,{105,102,0}}, +/* 13498 */ {(11<<2)|2,{105,102,0}}, +/* 13499 */ {(11<<2)|2,{105,102,0}}, +/* 13500 */ {(11<<2)|2,{105,102,0}}, +/* 13501 */ {(11<<2)|2,{105,102,0}}, +/* 13502 */ {(11<<2)|2,{105,102,0}}, +/* 13503 */ {(11<<2)|2,{105,102,0}}, +/* 13504 */ {(16<<2)|3,{105,103,48}}, +/* 13505 */ {(16<<2)|3,{105,103,49}}, +/* 13506 */ {(16<<2)|3,{105,103,50}}, +/* 13507 */ {(16<<2)|3,{105,103,97}}, +/* 13508 */ {(16<<2)|3,{105,103,99}}, +/* 13509 */ {(16<<2)|3,{105,103,101}}, +/* 13510 */ {(16<<2)|3,{105,103,105}}, +/* 13511 */ {(16<<2)|3,{105,103,111}}, +/* 13512 */ {(16<<2)|3,{105,103,115}}, +/* 13513 */ {(16<<2)|3,{105,103,116}}, +/* 13514 */ {(11<<2)|2,{105,103,0}}, +/* 13515 */ {(11<<2)|2,{105,103,0}}, +/* 13516 */ {(11<<2)|2,{105,103,0}}, +/* 13517 */ {(11<<2)|2,{105,103,0}}, +/* 13518 */ {(11<<2)|2,{105,103,0}}, +/* 13519 */ {(11<<2)|2,{105,103,0}}, +/* 13520 */ {(11<<2)|2,{105,103,0}}, +/* 13521 */ {(11<<2)|2,{105,103,0}}, +/* 13522 */ {(11<<2)|2,{105,103,0}}, +/* 13523 */ {(11<<2)|2,{105,103,0}}, +/* 13524 */ {(11<<2)|2,{105,103,0}}, +/* 13525 */ {(11<<2)|2,{105,103,0}}, +/* 13526 */ {(11<<2)|2,{105,103,0}}, +/* 13527 */ {(11<<2)|2,{105,103,0}}, +/* 13528 */ {(11<<2)|2,{105,103,0}}, +/* 13529 */ {(11<<2)|2,{105,103,0}}, +/* 13530 */ {(11<<2)|2,{105,103,0}}, +/* 13531 */ {(11<<2)|2,{105,103,0}}, +/* 13532 */ {(11<<2)|2,{105,103,0}}, +/* 13533 */ {(11<<2)|2,{105,103,0}}, +/* 13534 */ {(11<<2)|2,{105,103,0}}, +/* 13535 */ {(11<<2)|2,{105,103,0}}, +/* 13536 */ {(16<<2)|3,{105,104,48}}, +/* 13537 */ {(16<<2)|3,{105,104,49}}, +/* 13538 */ {(16<<2)|3,{105,104,50}}, +/* 13539 */ {(16<<2)|3,{105,104,97}}, +/* 13540 */ {(16<<2)|3,{105,104,99}}, +/* 13541 */ {(16<<2)|3,{105,104,101}}, +/* 13542 */ {(16<<2)|3,{105,104,105}}, +/* 13543 */ {(16<<2)|3,{105,104,111}}, +/* 13544 */ {(16<<2)|3,{105,104,115}}, +/* 13545 */ {(16<<2)|3,{105,104,116}}, +/* 13546 */ {(11<<2)|2,{105,104,0}}, +/* 13547 */ {(11<<2)|2,{105,104,0}}, +/* 13548 */ {(11<<2)|2,{105,104,0}}, +/* 13549 */ {(11<<2)|2,{105,104,0}}, +/* 13550 */ {(11<<2)|2,{105,104,0}}, +/* 13551 */ {(11<<2)|2,{105,104,0}}, +/* 13552 */ {(11<<2)|2,{105,104,0}}, +/* 13553 */ {(11<<2)|2,{105,104,0}}, +/* 13554 */ {(11<<2)|2,{105,104,0}}, +/* 13555 */ {(11<<2)|2,{105,104,0}}, +/* 13556 */ {(11<<2)|2,{105,104,0}}, +/* 13557 */ {(11<<2)|2,{105,104,0}}, +/* 13558 */ {(11<<2)|2,{105,104,0}}, +/* 13559 */ {(11<<2)|2,{105,104,0}}, +/* 13560 */ {(11<<2)|2,{105,104,0}}, +/* 13561 */ {(11<<2)|2,{105,104,0}}, +/* 13562 */ {(11<<2)|2,{105,104,0}}, +/* 13563 */ {(11<<2)|2,{105,104,0}}, +/* 13564 */ {(11<<2)|2,{105,104,0}}, +/* 13565 */ {(11<<2)|2,{105,104,0}}, +/* 13566 */ {(11<<2)|2,{105,104,0}}, +/* 13567 */ {(11<<2)|2,{105,104,0}}, +/* 13568 */ {(16<<2)|3,{105,108,48}}, +/* 13569 */ {(16<<2)|3,{105,108,49}}, +/* 13570 */ {(16<<2)|3,{105,108,50}}, +/* 13571 */ {(16<<2)|3,{105,108,97}}, +/* 13572 */ {(16<<2)|3,{105,108,99}}, +/* 13573 */ {(16<<2)|3,{105,108,101}}, +/* 13574 */ {(16<<2)|3,{105,108,105}}, +/* 13575 */ {(16<<2)|3,{105,108,111}}, +/* 13576 */ {(16<<2)|3,{105,108,115}}, +/* 13577 */ {(16<<2)|3,{105,108,116}}, +/* 13578 */ {(11<<2)|2,{105,108,0}}, +/* 13579 */ {(11<<2)|2,{105,108,0}}, +/* 13580 */ {(11<<2)|2,{105,108,0}}, +/* 13581 */ {(11<<2)|2,{105,108,0}}, +/* 13582 */ {(11<<2)|2,{105,108,0}}, +/* 13583 */ {(11<<2)|2,{105,108,0}}, +/* 13584 */ {(11<<2)|2,{105,108,0}}, +/* 13585 */ {(11<<2)|2,{105,108,0}}, +/* 13586 */ {(11<<2)|2,{105,108,0}}, +/* 13587 */ {(11<<2)|2,{105,108,0}}, +/* 13588 */ {(11<<2)|2,{105,108,0}}, +/* 13589 */ {(11<<2)|2,{105,108,0}}, +/* 13590 */ {(11<<2)|2,{105,108,0}}, +/* 13591 */ {(11<<2)|2,{105,108,0}}, +/* 13592 */ {(11<<2)|2,{105,108,0}}, +/* 13593 */ {(11<<2)|2,{105,108,0}}, +/* 13594 */ {(11<<2)|2,{105,108,0}}, +/* 13595 */ {(11<<2)|2,{105,108,0}}, +/* 13596 */ {(11<<2)|2,{105,108,0}}, +/* 13597 */ {(11<<2)|2,{105,108,0}}, +/* 13598 */ {(11<<2)|2,{105,108,0}}, +/* 13599 */ {(11<<2)|2,{105,108,0}}, +/* 13600 */ {(16<<2)|3,{105,109,48}}, +/* 13601 */ {(16<<2)|3,{105,109,49}}, +/* 13602 */ {(16<<2)|3,{105,109,50}}, +/* 13603 */ {(16<<2)|3,{105,109,97}}, +/* 13604 */ {(16<<2)|3,{105,109,99}}, +/* 13605 */ {(16<<2)|3,{105,109,101}}, +/* 13606 */ {(16<<2)|3,{105,109,105}}, +/* 13607 */ {(16<<2)|3,{105,109,111}}, +/* 13608 */ {(16<<2)|3,{105,109,115}}, +/* 13609 */ {(16<<2)|3,{105,109,116}}, +/* 13610 */ {(11<<2)|2,{105,109,0}}, +/* 13611 */ {(11<<2)|2,{105,109,0}}, +/* 13612 */ {(11<<2)|2,{105,109,0}}, +/* 13613 */ {(11<<2)|2,{105,109,0}}, +/* 13614 */ {(11<<2)|2,{105,109,0}}, +/* 13615 */ {(11<<2)|2,{105,109,0}}, +/* 13616 */ {(11<<2)|2,{105,109,0}}, +/* 13617 */ {(11<<2)|2,{105,109,0}}, +/* 13618 */ {(11<<2)|2,{105,109,0}}, +/* 13619 */ {(11<<2)|2,{105,109,0}}, +/* 13620 */ {(11<<2)|2,{105,109,0}}, +/* 13621 */ {(11<<2)|2,{105,109,0}}, +/* 13622 */ {(11<<2)|2,{105,109,0}}, +/* 13623 */ {(11<<2)|2,{105,109,0}}, +/* 13624 */ {(11<<2)|2,{105,109,0}}, +/* 13625 */ {(11<<2)|2,{105,109,0}}, +/* 13626 */ {(11<<2)|2,{105,109,0}}, +/* 13627 */ {(11<<2)|2,{105,109,0}}, +/* 13628 */ {(11<<2)|2,{105,109,0}}, +/* 13629 */ {(11<<2)|2,{105,109,0}}, +/* 13630 */ {(11<<2)|2,{105,109,0}}, +/* 13631 */ {(11<<2)|2,{105,109,0}}, +/* 13632 */ {(16<<2)|3,{105,110,48}}, +/* 13633 */ {(16<<2)|3,{105,110,49}}, +/* 13634 */ {(16<<2)|3,{105,110,50}}, +/* 13635 */ {(16<<2)|3,{105,110,97}}, +/* 13636 */ {(16<<2)|3,{105,110,99}}, +/* 13637 */ {(16<<2)|3,{105,110,101}}, +/* 13638 */ {(16<<2)|3,{105,110,105}}, +/* 13639 */ {(16<<2)|3,{105,110,111}}, +/* 13640 */ {(16<<2)|3,{105,110,115}}, +/* 13641 */ {(16<<2)|3,{105,110,116}}, +/* 13642 */ {(11<<2)|2,{105,110,0}}, +/* 13643 */ {(11<<2)|2,{105,110,0}}, +/* 13644 */ {(11<<2)|2,{105,110,0}}, +/* 13645 */ {(11<<2)|2,{105,110,0}}, +/* 13646 */ {(11<<2)|2,{105,110,0}}, +/* 13647 */ {(11<<2)|2,{105,110,0}}, +/* 13648 */ {(11<<2)|2,{105,110,0}}, +/* 13649 */ {(11<<2)|2,{105,110,0}}, +/* 13650 */ {(11<<2)|2,{105,110,0}}, +/* 13651 */ {(11<<2)|2,{105,110,0}}, +/* 13652 */ {(11<<2)|2,{105,110,0}}, +/* 13653 */ {(11<<2)|2,{105,110,0}}, +/* 13654 */ {(11<<2)|2,{105,110,0}}, +/* 13655 */ {(11<<2)|2,{105,110,0}}, +/* 13656 */ {(11<<2)|2,{105,110,0}}, +/* 13657 */ {(11<<2)|2,{105,110,0}}, +/* 13658 */ {(11<<2)|2,{105,110,0}}, +/* 13659 */ {(11<<2)|2,{105,110,0}}, +/* 13660 */ {(11<<2)|2,{105,110,0}}, +/* 13661 */ {(11<<2)|2,{105,110,0}}, +/* 13662 */ {(11<<2)|2,{105,110,0}}, +/* 13663 */ {(11<<2)|2,{105,110,0}}, +/* 13664 */ {(16<<2)|3,{105,112,48}}, +/* 13665 */ {(16<<2)|3,{105,112,49}}, +/* 13666 */ {(16<<2)|3,{105,112,50}}, +/* 13667 */ {(16<<2)|3,{105,112,97}}, +/* 13668 */ {(16<<2)|3,{105,112,99}}, +/* 13669 */ {(16<<2)|3,{105,112,101}}, +/* 13670 */ {(16<<2)|3,{105,112,105}}, +/* 13671 */ {(16<<2)|3,{105,112,111}}, +/* 13672 */ {(16<<2)|3,{105,112,115}}, +/* 13673 */ {(16<<2)|3,{105,112,116}}, +/* 13674 */ {(11<<2)|2,{105,112,0}}, +/* 13675 */ {(11<<2)|2,{105,112,0}}, +/* 13676 */ {(11<<2)|2,{105,112,0}}, +/* 13677 */ {(11<<2)|2,{105,112,0}}, +/* 13678 */ {(11<<2)|2,{105,112,0}}, +/* 13679 */ {(11<<2)|2,{105,112,0}}, +/* 13680 */ {(11<<2)|2,{105,112,0}}, +/* 13681 */ {(11<<2)|2,{105,112,0}}, +/* 13682 */ {(11<<2)|2,{105,112,0}}, +/* 13683 */ {(11<<2)|2,{105,112,0}}, +/* 13684 */ {(11<<2)|2,{105,112,0}}, +/* 13685 */ {(11<<2)|2,{105,112,0}}, +/* 13686 */ {(11<<2)|2,{105,112,0}}, +/* 13687 */ {(11<<2)|2,{105,112,0}}, +/* 13688 */ {(11<<2)|2,{105,112,0}}, +/* 13689 */ {(11<<2)|2,{105,112,0}}, +/* 13690 */ {(11<<2)|2,{105,112,0}}, +/* 13691 */ {(11<<2)|2,{105,112,0}}, +/* 13692 */ {(11<<2)|2,{105,112,0}}, +/* 13693 */ {(11<<2)|2,{105,112,0}}, +/* 13694 */ {(11<<2)|2,{105,112,0}}, +/* 13695 */ {(11<<2)|2,{105,112,0}}, +/* 13696 */ {(16<<2)|3,{105,114,48}}, +/* 13697 */ {(16<<2)|3,{105,114,49}}, +/* 13698 */ {(16<<2)|3,{105,114,50}}, +/* 13699 */ {(16<<2)|3,{105,114,97}}, +/* 13700 */ {(16<<2)|3,{105,114,99}}, +/* 13701 */ {(16<<2)|3,{105,114,101}}, +/* 13702 */ {(16<<2)|3,{105,114,105}}, +/* 13703 */ {(16<<2)|3,{105,114,111}}, +/* 13704 */ {(16<<2)|3,{105,114,115}}, +/* 13705 */ {(16<<2)|3,{105,114,116}}, +/* 13706 */ {(11<<2)|2,{105,114,0}}, +/* 13707 */ {(11<<2)|2,{105,114,0}}, +/* 13708 */ {(11<<2)|2,{105,114,0}}, +/* 13709 */ {(11<<2)|2,{105,114,0}}, +/* 13710 */ {(11<<2)|2,{105,114,0}}, +/* 13711 */ {(11<<2)|2,{105,114,0}}, +/* 13712 */ {(11<<2)|2,{105,114,0}}, +/* 13713 */ {(11<<2)|2,{105,114,0}}, +/* 13714 */ {(11<<2)|2,{105,114,0}}, +/* 13715 */ {(11<<2)|2,{105,114,0}}, +/* 13716 */ {(11<<2)|2,{105,114,0}}, +/* 13717 */ {(11<<2)|2,{105,114,0}}, +/* 13718 */ {(11<<2)|2,{105,114,0}}, +/* 13719 */ {(11<<2)|2,{105,114,0}}, +/* 13720 */ {(11<<2)|2,{105,114,0}}, +/* 13721 */ {(11<<2)|2,{105,114,0}}, +/* 13722 */ {(11<<2)|2,{105,114,0}}, +/* 13723 */ {(11<<2)|2,{105,114,0}}, +/* 13724 */ {(11<<2)|2,{105,114,0}}, +/* 13725 */ {(11<<2)|2,{105,114,0}}, +/* 13726 */ {(11<<2)|2,{105,114,0}}, +/* 13727 */ {(11<<2)|2,{105,114,0}}, +/* 13728 */ {(16<<2)|3,{105,117,48}}, +/* 13729 */ {(16<<2)|3,{105,117,49}}, +/* 13730 */ {(16<<2)|3,{105,117,50}}, +/* 13731 */ {(16<<2)|3,{105,117,97}}, +/* 13732 */ {(16<<2)|3,{105,117,99}}, +/* 13733 */ {(16<<2)|3,{105,117,101}}, +/* 13734 */ {(16<<2)|3,{105,117,105}}, +/* 13735 */ {(16<<2)|3,{105,117,111}}, +/* 13736 */ {(16<<2)|3,{105,117,115}}, +/* 13737 */ {(16<<2)|3,{105,117,116}}, +/* 13738 */ {(11<<2)|2,{105,117,0}}, +/* 13739 */ {(11<<2)|2,{105,117,0}}, +/* 13740 */ {(11<<2)|2,{105,117,0}}, +/* 13741 */ {(11<<2)|2,{105,117,0}}, +/* 13742 */ {(11<<2)|2,{105,117,0}}, +/* 13743 */ {(11<<2)|2,{105,117,0}}, +/* 13744 */ {(11<<2)|2,{105,117,0}}, +/* 13745 */ {(11<<2)|2,{105,117,0}}, +/* 13746 */ {(11<<2)|2,{105,117,0}}, +/* 13747 */ {(11<<2)|2,{105,117,0}}, +/* 13748 */ {(11<<2)|2,{105,117,0}}, +/* 13749 */ {(11<<2)|2,{105,117,0}}, +/* 13750 */ {(11<<2)|2,{105,117,0}}, +/* 13751 */ {(11<<2)|2,{105,117,0}}, +/* 13752 */ {(11<<2)|2,{105,117,0}}, +/* 13753 */ {(11<<2)|2,{105,117,0}}, +/* 13754 */ {(11<<2)|2,{105,117,0}}, +/* 13755 */ {(11<<2)|2,{105,117,0}}, +/* 13756 */ {(11<<2)|2,{105,117,0}}, +/* 13757 */ {(11<<2)|2,{105,117,0}}, +/* 13758 */ {(11<<2)|2,{105,117,0}}, +/* 13759 */ {(11<<2)|2,{105,117,0}}, +/* 13760 */ {(12<<2)|2,{105,58,0}}, +/* 13761 */ {(12<<2)|2,{105,58,0}}, +/* 13762 */ {(12<<2)|2,{105,58,0}}, +/* 13763 */ {(12<<2)|2,{105,58,0}}, +/* 13764 */ {(12<<2)|2,{105,58,0}}, +/* 13765 */ {(12<<2)|2,{105,58,0}}, +/* 13766 */ {(12<<2)|2,{105,58,0}}, +/* 13767 */ {(12<<2)|2,{105,58,0}}, +/* 13768 */ {(12<<2)|2,{105,58,0}}, +/* 13769 */ {(12<<2)|2,{105,58,0}}, +/* 13770 */ {(12<<2)|2,{105,58,0}}, +/* 13771 */ {(12<<2)|2,{105,58,0}}, +/* 13772 */ {(12<<2)|2,{105,58,0}}, +/* 13773 */ {(12<<2)|2,{105,58,0}}, +/* 13774 */ {(12<<2)|2,{105,58,0}}, +/* 13775 */ {(12<<2)|2,{105,58,0}}, +/* 13776 */ {(12<<2)|2,{105,66,0}}, +/* 13777 */ {(12<<2)|2,{105,66,0}}, +/* 13778 */ {(12<<2)|2,{105,66,0}}, +/* 13779 */ {(12<<2)|2,{105,66,0}}, +/* 13780 */ {(12<<2)|2,{105,66,0}}, +/* 13781 */ {(12<<2)|2,{105,66,0}}, +/* 13782 */ {(12<<2)|2,{105,66,0}}, +/* 13783 */ {(12<<2)|2,{105,66,0}}, +/* 13784 */ {(12<<2)|2,{105,66,0}}, +/* 13785 */ {(12<<2)|2,{105,66,0}}, +/* 13786 */ {(12<<2)|2,{105,66,0}}, +/* 13787 */ {(12<<2)|2,{105,66,0}}, +/* 13788 */ {(12<<2)|2,{105,66,0}}, +/* 13789 */ {(12<<2)|2,{105,66,0}}, +/* 13790 */ {(12<<2)|2,{105,66,0}}, +/* 13791 */ {(12<<2)|2,{105,66,0}}, +/* 13792 */ {(12<<2)|2,{105,67,0}}, +/* 13793 */ {(12<<2)|2,{105,67,0}}, +/* 13794 */ {(12<<2)|2,{105,67,0}}, +/* 13795 */ {(12<<2)|2,{105,67,0}}, +/* 13796 */ {(12<<2)|2,{105,67,0}}, +/* 13797 */ {(12<<2)|2,{105,67,0}}, +/* 13798 */ {(12<<2)|2,{105,67,0}}, +/* 13799 */ {(12<<2)|2,{105,67,0}}, +/* 13800 */ {(12<<2)|2,{105,67,0}}, +/* 13801 */ {(12<<2)|2,{105,67,0}}, +/* 13802 */ {(12<<2)|2,{105,67,0}}, +/* 13803 */ {(12<<2)|2,{105,67,0}}, +/* 13804 */ {(12<<2)|2,{105,67,0}}, +/* 13805 */ {(12<<2)|2,{105,67,0}}, +/* 13806 */ {(12<<2)|2,{105,67,0}}, +/* 13807 */ {(12<<2)|2,{105,67,0}}, +/* 13808 */ {(12<<2)|2,{105,68,0}}, +/* 13809 */ {(12<<2)|2,{105,68,0}}, +/* 13810 */ {(12<<2)|2,{105,68,0}}, +/* 13811 */ {(12<<2)|2,{105,68,0}}, +/* 13812 */ {(12<<2)|2,{105,68,0}}, +/* 13813 */ {(12<<2)|2,{105,68,0}}, +/* 13814 */ {(12<<2)|2,{105,68,0}}, +/* 13815 */ {(12<<2)|2,{105,68,0}}, +/* 13816 */ {(12<<2)|2,{105,68,0}}, +/* 13817 */ {(12<<2)|2,{105,68,0}}, +/* 13818 */ {(12<<2)|2,{105,68,0}}, +/* 13819 */ {(12<<2)|2,{105,68,0}}, +/* 13820 */ {(12<<2)|2,{105,68,0}}, +/* 13821 */ {(12<<2)|2,{105,68,0}}, +/* 13822 */ {(12<<2)|2,{105,68,0}}, +/* 13823 */ {(12<<2)|2,{105,68,0}}, +/* 13824 */ {(12<<2)|2,{105,69,0}}, +/* 13825 */ {(12<<2)|2,{105,69,0}}, +/* 13826 */ {(12<<2)|2,{105,69,0}}, +/* 13827 */ {(12<<2)|2,{105,69,0}}, +/* 13828 */ {(12<<2)|2,{105,69,0}}, +/* 13829 */ {(12<<2)|2,{105,69,0}}, +/* 13830 */ {(12<<2)|2,{105,69,0}}, +/* 13831 */ {(12<<2)|2,{105,69,0}}, +/* 13832 */ {(12<<2)|2,{105,69,0}}, +/* 13833 */ {(12<<2)|2,{105,69,0}}, +/* 13834 */ {(12<<2)|2,{105,69,0}}, +/* 13835 */ {(12<<2)|2,{105,69,0}}, +/* 13836 */ {(12<<2)|2,{105,69,0}}, +/* 13837 */ {(12<<2)|2,{105,69,0}}, +/* 13838 */ {(12<<2)|2,{105,69,0}}, +/* 13839 */ {(12<<2)|2,{105,69,0}}, +/* 13840 */ {(12<<2)|2,{105,70,0}}, +/* 13841 */ {(12<<2)|2,{105,70,0}}, +/* 13842 */ {(12<<2)|2,{105,70,0}}, +/* 13843 */ {(12<<2)|2,{105,70,0}}, +/* 13844 */ {(12<<2)|2,{105,70,0}}, +/* 13845 */ {(12<<2)|2,{105,70,0}}, +/* 13846 */ {(12<<2)|2,{105,70,0}}, +/* 13847 */ {(12<<2)|2,{105,70,0}}, +/* 13848 */ {(12<<2)|2,{105,70,0}}, +/* 13849 */ {(12<<2)|2,{105,70,0}}, +/* 13850 */ {(12<<2)|2,{105,70,0}}, +/* 13851 */ {(12<<2)|2,{105,70,0}}, +/* 13852 */ {(12<<2)|2,{105,70,0}}, +/* 13853 */ {(12<<2)|2,{105,70,0}}, +/* 13854 */ {(12<<2)|2,{105,70,0}}, +/* 13855 */ {(12<<2)|2,{105,70,0}}, +/* 13856 */ {(12<<2)|2,{105,71,0}}, +/* 13857 */ {(12<<2)|2,{105,71,0}}, +/* 13858 */ {(12<<2)|2,{105,71,0}}, +/* 13859 */ {(12<<2)|2,{105,71,0}}, +/* 13860 */ {(12<<2)|2,{105,71,0}}, +/* 13861 */ {(12<<2)|2,{105,71,0}}, +/* 13862 */ {(12<<2)|2,{105,71,0}}, +/* 13863 */ {(12<<2)|2,{105,71,0}}, +/* 13864 */ {(12<<2)|2,{105,71,0}}, +/* 13865 */ {(12<<2)|2,{105,71,0}}, +/* 13866 */ {(12<<2)|2,{105,71,0}}, +/* 13867 */ {(12<<2)|2,{105,71,0}}, +/* 13868 */ {(12<<2)|2,{105,71,0}}, +/* 13869 */ {(12<<2)|2,{105,71,0}}, +/* 13870 */ {(12<<2)|2,{105,71,0}}, +/* 13871 */ {(12<<2)|2,{105,71,0}}, +/* 13872 */ {(12<<2)|2,{105,72,0}}, +/* 13873 */ {(12<<2)|2,{105,72,0}}, +/* 13874 */ {(12<<2)|2,{105,72,0}}, +/* 13875 */ {(12<<2)|2,{105,72,0}}, +/* 13876 */ {(12<<2)|2,{105,72,0}}, +/* 13877 */ {(12<<2)|2,{105,72,0}}, +/* 13878 */ {(12<<2)|2,{105,72,0}}, +/* 13879 */ {(12<<2)|2,{105,72,0}}, +/* 13880 */ {(12<<2)|2,{105,72,0}}, +/* 13881 */ {(12<<2)|2,{105,72,0}}, +/* 13882 */ {(12<<2)|2,{105,72,0}}, +/* 13883 */ {(12<<2)|2,{105,72,0}}, +/* 13884 */ {(12<<2)|2,{105,72,0}}, +/* 13885 */ {(12<<2)|2,{105,72,0}}, +/* 13886 */ {(12<<2)|2,{105,72,0}}, +/* 13887 */ {(12<<2)|2,{105,72,0}}, +/* 13888 */ {(12<<2)|2,{105,73,0}}, +/* 13889 */ {(12<<2)|2,{105,73,0}}, +/* 13890 */ {(12<<2)|2,{105,73,0}}, +/* 13891 */ {(12<<2)|2,{105,73,0}}, +/* 13892 */ {(12<<2)|2,{105,73,0}}, +/* 13893 */ {(12<<2)|2,{105,73,0}}, +/* 13894 */ {(12<<2)|2,{105,73,0}}, +/* 13895 */ {(12<<2)|2,{105,73,0}}, +/* 13896 */ {(12<<2)|2,{105,73,0}}, +/* 13897 */ {(12<<2)|2,{105,73,0}}, +/* 13898 */ {(12<<2)|2,{105,73,0}}, +/* 13899 */ {(12<<2)|2,{105,73,0}}, +/* 13900 */ {(12<<2)|2,{105,73,0}}, +/* 13901 */ {(12<<2)|2,{105,73,0}}, +/* 13902 */ {(12<<2)|2,{105,73,0}}, +/* 13903 */ {(12<<2)|2,{105,73,0}}, +/* 13904 */ {(12<<2)|2,{105,74,0}}, +/* 13905 */ {(12<<2)|2,{105,74,0}}, +/* 13906 */ {(12<<2)|2,{105,74,0}}, +/* 13907 */ {(12<<2)|2,{105,74,0}}, +/* 13908 */ {(12<<2)|2,{105,74,0}}, +/* 13909 */ {(12<<2)|2,{105,74,0}}, +/* 13910 */ {(12<<2)|2,{105,74,0}}, +/* 13911 */ {(12<<2)|2,{105,74,0}}, +/* 13912 */ {(12<<2)|2,{105,74,0}}, +/* 13913 */ {(12<<2)|2,{105,74,0}}, +/* 13914 */ {(12<<2)|2,{105,74,0}}, +/* 13915 */ {(12<<2)|2,{105,74,0}}, +/* 13916 */ {(12<<2)|2,{105,74,0}}, +/* 13917 */ {(12<<2)|2,{105,74,0}}, +/* 13918 */ {(12<<2)|2,{105,74,0}}, +/* 13919 */ {(12<<2)|2,{105,74,0}}, +/* 13920 */ {(12<<2)|2,{105,75,0}}, +/* 13921 */ {(12<<2)|2,{105,75,0}}, +/* 13922 */ {(12<<2)|2,{105,75,0}}, +/* 13923 */ {(12<<2)|2,{105,75,0}}, +/* 13924 */ {(12<<2)|2,{105,75,0}}, +/* 13925 */ {(12<<2)|2,{105,75,0}}, +/* 13926 */ {(12<<2)|2,{105,75,0}}, +/* 13927 */ {(12<<2)|2,{105,75,0}}, +/* 13928 */ {(12<<2)|2,{105,75,0}}, +/* 13929 */ {(12<<2)|2,{105,75,0}}, +/* 13930 */ {(12<<2)|2,{105,75,0}}, +/* 13931 */ {(12<<2)|2,{105,75,0}}, +/* 13932 */ {(12<<2)|2,{105,75,0}}, +/* 13933 */ {(12<<2)|2,{105,75,0}}, +/* 13934 */ {(12<<2)|2,{105,75,0}}, +/* 13935 */ {(12<<2)|2,{105,75,0}}, +/* 13936 */ {(12<<2)|2,{105,76,0}}, +/* 13937 */ {(12<<2)|2,{105,76,0}}, +/* 13938 */ {(12<<2)|2,{105,76,0}}, +/* 13939 */ {(12<<2)|2,{105,76,0}}, +/* 13940 */ {(12<<2)|2,{105,76,0}}, +/* 13941 */ {(12<<2)|2,{105,76,0}}, +/* 13942 */ {(12<<2)|2,{105,76,0}}, +/* 13943 */ {(12<<2)|2,{105,76,0}}, +/* 13944 */ {(12<<2)|2,{105,76,0}}, +/* 13945 */ {(12<<2)|2,{105,76,0}}, +/* 13946 */ {(12<<2)|2,{105,76,0}}, +/* 13947 */ {(12<<2)|2,{105,76,0}}, +/* 13948 */ {(12<<2)|2,{105,76,0}}, +/* 13949 */ {(12<<2)|2,{105,76,0}}, +/* 13950 */ {(12<<2)|2,{105,76,0}}, +/* 13951 */ {(12<<2)|2,{105,76,0}}, +/* 13952 */ {(12<<2)|2,{105,77,0}}, +/* 13953 */ {(12<<2)|2,{105,77,0}}, +/* 13954 */ {(12<<2)|2,{105,77,0}}, +/* 13955 */ {(12<<2)|2,{105,77,0}}, +/* 13956 */ {(12<<2)|2,{105,77,0}}, +/* 13957 */ {(12<<2)|2,{105,77,0}}, +/* 13958 */ {(12<<2)|2,{105,77,0}}, +/* 13959 */ {(12<<2)|2,{105,77,0}}, +/* 13960 */ {(12<<2)|2,{105,77,0}}, +/* 13961 */ {(12<<2)|2,{105,77,0}}, +/* 13962 */ {(12<<2)|2,{105,77,0}}, +/* 13963 */ {(12<<2)|2,{105,77,0}}, +/* 13964 */ {(12<<2)|2,{105,77,0}}, +/* 13965 */ {(12<<2)|2,{105,77,0}}, +/* 13966 */ {(12<<2)|2,{105,77,0}}, +/* 13967 */ {(12<<2)|2,{105,77,0}}, +/* 13968 */ {(12<<2)|2,{105,78,0}}, +/* 13969 */ {(12<<2)|2,{105,78,0}}, +/* 13970 */ {(12<<2)|2,{105,78,0}}, +/* 13971 */ {(12<<2)|2,{105,78,0}}, +/* 13972 */ {(12<<2)|2,{105,78,0}}, +/* 13973 */ {(12<<2)|2,{105,78,0}}, +/* 13974 */ {(12<<2)|2,{105,78,0}}, +/* 13975 */ {(12<<2)|2,{105,78,0}}, +/* 13976 */ {(12<<2)|2,{105,78,0}}, +/* 13977 */ {(12<<2)|2,{105,78,0}}, +/* 13978 */ {(12<<2)|2,{105,78,0}}, +/* 13979 */ {(12<<2)|2,{105,78,0}}, +/* 13980 */ {(12<<2)|2,{105,78,0}}, +/* 13981 */ {(12<<2)|2,{105,78,0}}, +/* 13982 */ {(12<<2)|2,{105,78,0}}, +/* 13983 */ {(12<<2)|2,{105,78,0}}, +/* 13984 */ {(12<<2)|2,{105,79,0}}, +/* 13985 */ {(12<<2)|2,{105,79,0}}, +/* 13986 */ {(12<<2)|2,{105,79,0}}, +/* 13987 */ {(12<<2)|2,{105,79,0}}, +/* 13988 */ {(12<<2)|2,{105,79,0}}, +/* 13989 */ {(12<<2)|2,{105,79,0}}, +/* 13990 */ {(12<<2)|2,{105,79,0}}, +/* 13991 */ {(12<<2)|2,{105,79,0}}, +/* 13992 */ {(12<<2)|2,{105,79,0}}, +/* 13993 */ {(12<<2)|2,{105,79,0}}, +/* 13994 */ {(12<<2)|2,{105,79,0}}, +/* 13995 */ {(12<<2)|2,{105,79,0}}, +/* 13996 */ {(12<<2)|2,{105,79,0}}, +/* 13997 */ {(12<<2)|2,{105,79,0}}, +/* 13998 */ {(12<<2)|2,{105,79,0}}, +/* 13999 */ {(12<<2)|2,{105,79,0}}, +/* 14000 */ {(12<<2)|2,{105,80,0}}, +/* 14001 */ {(12<<2)|2,{105,80,0}}, +/* 14002 */ {(12<<2)|2,{105,80,0}}, +/* 14003 */ {(12<<2)|2,{105,80,0}}, +/* 14004 */ {(12<<2)|2,{105,80,0}}, +/* 14005 */ {(12<<2)|2,{105,80,0}}, +/* 14006 */ {(12<<2)|2,{105,80,0}}, +/* 14007 */ {(12<<2)|2,{105,80,0}}, +/* 14008 */ {(12<<2)|2,{105,80,0}}, +/* 14009 */ {(12<<2)|2,{105,80,0}}, +/* 14010 */ {(12<<2)|2,{105,80,0}}, +/* 14011 */ {(12<<2)|2,{105,80,0}}, +/* 14012 */ {(12<<2)|2,{105,80,0}}, +/* 14013 */ {(12<<2)|2,{105,80,0}}, +/* 14014 */ {(12<<2)|2,{105,80,0}}, +/* 14015 */ {(12<<2)|2,{105,80,0}}, +/* 14016 */ {(12<<2)|2,{105,81,0}}, +/* 14017 */ {(12<<2)|2,{105,81,0}}, +/* 14018 */ {(12<<2)|2,{105,81,0}}, +/* 14019 */ {(12<<2)|2,{105,81,0}}, +/* 14020 */ {(12<<2)|2,{105,81,0}}, +/* 14021 */ {(12<<2)|2,{105,81,0}}, +/* 14022 */ {(12<<2)|2,{105,81,0}}, +/* 14023 */ {(12<<2)|2,{105,81,0}}, +/* 14024 */ {(12<<2)|2,{105,81,0}}, +/* 14025 */ {(12<<2)|2,{105,81,0}}, +/* 14026 */ {(12<<2)|2,{105,81,0}}, +/* 14027 */ {(12<<2)|2,{105,81,0}}, +/* 14028 */ {(12<<2)|2,{105,81,0}}, +/* 14029 */ {(12<<2)|2,{105,81,0}}, +/* 14030 */ {(12<<2)|2,{105,81,0}}, +/* 14031 */ {(12<<2)|2,{105,81,0}}, +/* 14032 */ {(12<<2)|2,{105,82,0}}, +/* 14033 */ {(12<<2)|2,{105,82,0}}, +/* 14034 */ {(12<<2)|2,{105,82,0}}, +/* 14035 */ {(12<<2)|2,{105,82,0}}, +/* 14036 */ {(12<<2)|2,{105,82,0}}, +/* 14037 */ {(12<<2)|2,{105,82,0}}, +/* 14038 */ {(12<<2)|2,{105,82,0}}, +/* 14039 */ {(12<<2)|2,{105,82,0}}, +/* 14040 */ {(12<<2)|2,{105,82,0}}, +/* 14041 */ {(12<<2)|2,{105,82,0}}, +/* 14042 */ {(12<<2)|2,{105,82,0}}, +/* 14043 */ {(12<<2)|2,{105,82,0}}, +/* 14044 */ {(12<<2)|2,{105,82,0}}, +/* 14045 */ {(12<<2)|2,{105,82,0}}, +/* 14046 */ {(12<<2)|2,{105,82,0}}, +/* 14047 */ {(12<<2)|2,{105,82,0}}, +/* 14048 */ {(12<<2)|2,{105,83,0}}, +/* 14049 */ {(12<<2)|2,{105,83,0}}, +/* 14050 */ {(12<<2)|2,{105,83,0}}, +/* 14051 */ {(12<<2)|2,{105,83,0}}, +/* 14052 */ {(12<<2)|2,{105,83,0}}, +/* 14053 */ {(12<<2)|2,{105,83,0}}, +/* 14054 */ {(12<<2)|2,{105,83,0}}, +/* 14055 */ {(12<<2)|2,{105,83,0}}, +/* 14056 */ {(12<<2)|2,{105,83,0}}, +/* 14057 */ {(12<<2)|2,{105,83,0}}, +/* 14058 */ {(12<<2)|2,{105,83,0}}, +/* 14059 */ {(12<<2)|2,{105,83,0}}, +/* 14060 */ {(12<<2)|2,{105,83,0}}, +/* 14061 */ {(12<<2)|2,{105,83,0}}, +/* 14062 */ {(12<<2)|2,{105,83,0}}, +/* 14063 */ {(12<<2)|2,{105,83,0}}, +/* 14064 */ {(12<<2)|2,{105,84,0}}, +/* 14065 */ {(12<<2)|2,{105,84,0}}, +/* 14066 */ {(12<<2)|2,{105,84,0}}, +/* 14067 */ {(12<<2)|2,{105,84,0}}, +/* 14068 */ {(12<<2)|2,{105,84,0}}, +/* 14069 */ {(12<<2)|2,{105,84,0}}, +/* 14070 */ {(12<<2)|2,{105,84,0}}, +/* 14071 */ {(12<<2)|2,{105,84,0}}, +/* 14072 */ {(12<<2)|2,{105,84,0}}, +/* 14073 */ {(12<<2)|2,{105,84,0}}, +/* 14074 */ {(12<<2)|2,{105,84,0}}, +/* 14075 */ {(12<<2)|2,{105,84,0}}, +/* 14076 */ {(12<<2)|2,{105,84,0}}, +/* 14077 */ {(12<<2)|2,{105,84,0}}, +/* 14078 */ {(12<<2)|2,{105,84,0}}, +/* 14079 */ {(12<<2)|2,{105,84,0}}, +/* 14080 */ {(12<<2)|2,{105,85,0}}, +/* 14081 */ {(12<<2)|2,{105,85,0}}, +/* 14082 */ {(12<<2)|2,{105,85,0}}, +/* 14083 */ {(12<<2)|2,{105,85,0}}, +/* 14084 */ {(12<<2)|2,{105,85,0}}, +/* 14085 */ {(12<<2)|2,{105,85,0}}, +/* 14086 */ {(12<<2)|2,{105,85,0}}, +/* 14087 */ {(12<<2)|2,{105,85,0}}, +/* 14088 */ {(12<<2)|2,{105,85,0}}, +/* 14089 */ {(12<<2)|2,{105,85,0}}, +/* 14090 */ {(12<<2)|2,{105,85,0}}, +/* 14091 */ {(12<<2)|2,{105,85,0}}, +/* 14092 */ {(12<<2)|2,{105,85,0}}, +/* 14093 */ {(12<<2)|2,{105,85,0}}, +/* 14094 */ {(12<<2)|2,{105,85,0}}, +/* 14095 */ {(12<<2)|2,{105,85,0}}, +/* 14096 */ {(12<<2)|2,{105,86,0}}, +/* 14097 */ {(12<<2)|2,{105,86,0}}, +/* 14098 */ {(12<<2)|2,{105,86,0}}, +/* 14099 */ {(12<<2)|2,{105,86,0}}, +/* 14100 */ {(12<<2)|2,{105,86,0}}, +/* 14101 */ {(12<<2)|2,{105,86,0}}, +/* 14102 */ {(12<<2)|2,{105,86,0}}, +/* 14103 */ {(12<<2)|2,{105,86,0}}, +/* 14104 */ {(12<<2)|2,{105,86,0}}, +/* 14105 */ {(12<<2)|2,{105,86,0}}, +/* 14106 */ {(12<<2)|2,{105,86,0}}, +/* 14107 */ {(12<<2)|2,{105,86,0}}, +/* 14108 */ {(12<<2)|2,{105,86,0}}, +/* 14109 */ {(12<<2)|2,{105,86,0}}, +/* 14110 */ {(12<<2)|2,{105,86,0}}, +/* 14111 */ {(12<<2)|2,{105,86,0}}, +/* 14112 */ {(12<<2)|2,{105,87,0}}, +/* 14113 */ {(12<<2)|2,{105,87,0}}, +/* 14114 */ {(12<<2)|2,{105,87,0}}, +/* 14115 */ {(12<<2)|2,{105,87,0}}, +/* 14116 */ {(12<<2)|2,{105,87,0}}, +/* 14117 */ {(12<<2)|2,{105,87,0}}, +/* 14118 */ {(12<<2)|2,{105,87,0}}, +/* 14119 */ {(12<<2)|2,{105,87,0}}, +/* 14120 */ {(12<<2)|2,{105,87,0}}, +/* 14121 */ {(12<<2)|2,{105,87,0}}, +/* 14122 */ {(12<<2)|2,{105,87,0}}, +/* 14123 */ {(12<<2)|2,{105,87,0}}, +/* 14124 */ {(12<<2)|2,{105,87,0}}, +/* 14125 */ {(12<<2)|2,{105,87,0}}, +/* 14126 */ {(12<<2)|2,{105,87,0}}, +/* 14127 */ {(12<<2)|2,{105,87,0}}, +/* 14128 */ {(12<<2)|2,{105,89,0}}, +/* 14129 */ {(12<<2)|2,{105,89,0}}, +/* 14130 */ {(12<<2)|2,{105,89,0}}, +/* 14131 */ {(12<<2)|2,{105,89,0}}, +/* 14132 */ {(12<<2)|2,{105,89,0}}, +/* 14133 */ {(12<<2)|2,{105,89,0}}, +/* 14134 */ {(12<<2)|2,{105,89,0}}, +/* 14135 */ {(12<<2)|2,{105,89,0}}, +/* 14136 */ {(12<<2)|2,{105,89,0}}, +/* 14137 */ {(12<<2)|2,{105,89,0}}, +/* 14138 */ {(12<<2)|2,{105,89,0}}, +/* 14139 */ {(12<<2)|2,{105,89,0}}, +/* 14140 */ {(12<<2)|2,{105,89,0}}, +/* 14141 */ {(12<<2)|2,{105,89,0}}, +/* 14142 */ {(12<<2)|2,{105,89,0}}, +/* 14143 */ {(12<<2)|2,{105,89,0}}, +/* 14144 */ {(12<<2)|2,{105,106,0}}, +/* 14145 */ {(12<<2)|2,{105,106,0}}, +/* 14146 */ {(12<<2)|2,{105,106,0}}, +/* 14147 */ {(12<<2)|2,{105,106,0}}, +/* 14148 */ {(12<<2)|2,{105,106,0}}, +/* 14149 */ {(12<<2)|2,{105,106,0}}, +/* 14150 */ {(12<<2)|2,{105,106,0}}, +/* 14151 */ {(12<<2)|2,{105,106,0}}, +/* 14152 */ {(12<<2)|2,{105,106,0}}, +/* 14153 */ {(12<<2)|2,{105,106,0}}, +/* 14154 */ {(12<<2)|2,{105,106,0}}, +/* 14155 */ {(12<<2)|2,{105,106,0}}, +/* 14156 */ {(12<<2)|2,{105,106,0}}, +/* 14157 */ {(12<<2)|2,{105,106,0}}, +/* 14158 */ {(12<<2)|2,{105,106,0}}, +/* 14159 */ {(12<<2)|2,{105,106,0}}, +/* 14160 */ {(12<<2)|2,{105,107,0}}, +/* 14161 */ {(12<<2)|2,{105,107,0}}, +/* 14162 */ {(12<<2)|2,{105,107,0}}, +/* 14163 */ {(12<<2)|2,{105,107,0}}, +/* 14164 */ {(12<<2)|2,{105,107,0}}, +/* 14165 */ {(12<<2)|2,{105,107,0}}, +/* 14166 */ {(12<<2)|2,{105,107,0}}, +/* 14167 */ {(12<<2)|2,{105,107,0}}, +/* 14168 */ {(12<<2)|2,{105,107,0}}, +/* 14169 */ {(12<<2)|2,{105,107,0}}, +/* 14170 */ {(12<<2)|2,{105,107,0}}, +/* 14171 */ {(12<<2)|2,{105,107,0}}, +/* 14172 */ {(12<<2)|2,{105,107,0}}, +/* 14173 */ {(12<<2)|2,{105,107,0}}, +/* 14174 */ {(12<<2)|2,{105,107,0}}, +/* 14175 */ {(12<<2)|2,{105,107,0}}, +/* 14176 */ {(12<<2)|2,{105,113,0}}, +/* 14177 */ {(12<<2)|2,{105,113,0}}, +/* 14178 */ {(12<<2)|2,{105,113,0}}, +/* 14179 */ {(12<<2)|2,{105,113,0}}, +/* 14180 */ {(12<<2)|2,{105,113,0}}, +/* 14181 */ {(12<<2)|2,{105,113,0}}, +/* 14182 */ {(12<<2)|2,{105,113,0}}, +/* 14183 */ {(12<<2)|2,{105,113,0}}, +/* 14184 */ {(12<<2)|2,{105,113,0}}, +/* 14185 */ {(12<<2)|2,{105,113,0}}, +/* 14186 */ {(12<<2)|2,{105,113,0}}, +/* 14187 */ {(12<<2)|2,{105,113,0}}, +/* 14188 */ {(12<<2)|2,{105,113,0}}, +/* 14189 */ {(12<<2)|2,{105,113,0}}, +/* 14190 */ {(12<<2)|2,{105,113,0}}, +/* 14191 */ {(12<<2)|2,{105,113,0}}, +/* 14192 */ {(12<<2)|2,{105,118,0}}, +/* 14193 */ {(12<<2)|2,{105,118,0}}, +/* 14194 */ {(12<<2)|2,{105,118,0}}, +/* 14195 */ {(12<<2)|2,{105,118,0}}, +/* 14196 */ {(12<<2)|2,{105,118,0}}, +/* 14197 */ {(12<<2)|2,{105,118,0}}, +/* 14198 */ {(12<<2)|2,{105,118,0}}, +/* 14199 */ {(12<<2)|2,{105,118,0}}, +/* 14200 */ {(12<<2)|2,{105,118,0}}, +/* 14201 */ {(12<<2)|2,{105,118,0}}, +/* 14202 */ {(12<<2)|2,{105,118,0}}, +/* 14203 */ {(12<<2)|2,{105,118,0}}, +/* 14204 */ {(12<<2)|2,{105,118,0}}, +/* 14205 */ {(12<<2)|2,{105,118,0}}, +/* 14206 */ {(12<<2)|2,{105,118,0}}, +/* 14207 */ {(12<<2)|2,{105,118,0}}, +/* 14208 */ {(12<<2)|2,{105,119,0}}, +/* 14209 */ {(12<<2)|2,{105,119,0}}, +/* 14210 */ {(12<<2)|2,{105,119,0}}, +/* 14211 */ {(12<<2)|2,{105,119,0}}, +/* 14212 */ {(12<<2)|2,{105,119,0}}, +/* 14213 */ {(12<<2)|2,{105,119,0}}, +/* 14214 */ {(12<<2)|2,{105,119,0}}, +/* 14215 */ {(12<<2)|2,{105,119,0}}, +/* 14216 */ {(12<<2)|2,{105,119,0}}, +/* 14217 */ {(12<<2)|2,{105,119,0}}, +/* 14218 */ {(12<<2)|2,{105,119,0}}, +/* 14219 */ {(12<<2)|2,{105,119,0}}, +/* 14220 */ {(12<<2)|2,{105,119,0}}, +/* 14221 */ {(12<<2)|2,{105,119,0}}, +/* 14222 */ {(12<<2)|2,{105,119,0}}, +/* 14223 */ {(12<<2)|2,{105,119,0}}, +/* 14224 */ {(12<<2)|2,{105,120,0}}, +/* 14225 */ {(12<<2)|2,{105,120,0}}, +/* 14226 */ {(12<<2)|2,{105,120,0}}, +/* 14227 */ {(12<<2)|2,{105,120,0}}, +/* 14228 */ {(12<<2)|2,{105,120,0}}, +/* 14229 */ {(12<<2)|2,{105,120,0}}, +/* 14230 */ {(12<<2)|2,{105,120,0}}, +/* 14231 */ {(12<<2)|2,{105,120,0}}, +/* 14232 */ {(12<<2)|2,{105,120,0}}, +/* 14233 */ {(12<<2)|2,{105,120,0}}, +/* 14234 */ {(12<<2)|2,{105,120,0}}, +/* 14235 */ {(12<<2)|2,{105,120,0}}, +/* 14236 */ {(12<<2)|2,{105,120,0}}, +/* 14237 */ {(12<<2)|2,{105,120,0}}, +/* 14238 */ {(12<<2)|2,{105,120,0}}, +/* 14239 */ {(12<<2)|2,{105,120,0}}, +/* 14240 */ {(12<<2)|2,{105,121,0}}, +/* 14241 */ {(12<<2)|2,{105,121,0}}, +/* 14242 */ {(12<<2)|2,{105,121,0}}, +/* 14243 */ {(12<<2)|2,{105,121,0}}, +/* 14244 */ {(12<<2)|2,{105,121,0}}, +/* 14245 */ {(12<<2)|2,{105,121,0}}, +/* 14246 */ {(12<<2)|2,{105,121,0}}, +/* 14247 */ {(12<<2)|2,{105,121,0}}, +/* 14248 */ {(12<<2)|2,{105,121,0}}, +/* 14249 */ {(12<<2)|2,{105,121,0}}, +/* 14250 */ {(12<<2)|2,{105,121,0}}, +/* 14251 */ {(12<<2)|2,{105,121,0}}, +/* 14252 */ {(12<<2)|2,{105,121,0}}, +/* 14253 */ {(12<<2)|2,{105,121,0}}, +/* 14254 */ {(12<<2)|2,{105,121,0}}, +/* 14255 */ {(12<<2)|2,{105,121,0}}, +/* 14256 */ {(12<<2)|2,{105,122,0}}, +/* 14257 */ {(12<<2)|2,{105,122,0}}, +/* 14258 */ {(12<<2)|2,{105,122,0}}, +/* 14259 */ {(12<<2)|2,{105,122,0}}, +/* 14260 */ {(12<<2)|2,{105,122,0}}, +/* 14261 */ {(12<<2)|2,{105,122,0}}, +/* 14262 */ {(12<<2)|2,{105,122,0}}, +/* 14263 */ {(12<<2)|2,{105,122,0}}, +/* 14264 */ {(12<<2)|2,{105,122,0}}, +/* 14265 */ {(12<<2)|2,{105,122,0}}, +/* 14266 */ {(12<<2)|2,{105,122,0}}, +/* 14267 */ {(12<<2)|2,{105,122,0}}, +/* 14268 */ {(12<<2)|2,{105,122,0}}, +/* 14269 */ {(12<<2)|2,{105,122,0}}, +/* 14270 */ {(12<<2)|2,{105,122,0}}, +/* 14271 */ {(12<<2)|2,{105,122,0}}, +/* 14272 */ {(13<<2)|2,{105,38,0}}, +/* 14273 */ {(13<<2)|2,{105,38,0}}, +/* 14274 */ {(13<<2)|2,{105,38,0}}, +/* 14275 */ {(13<<2)|2,{105,38,0}}, +/* 14276 */ {(13<<2)|2,{105,38,0}}, +/* 14277 */ {(13<<2)|2,{105,38,0}}, +/* 14278 */ {(13<<2)|2,{105,38,0}}, +/* 14279 */ {(13<<2)|2,{105,38,0}}, +/* 14280 */ {(13<<2)|2,{105,42,0}}, +/* 14281 */ {(13<<2)|2,{105,42,0}}, +/* 14282 */ {(13<<2)|2,{105,42,0}}, +/* 14283 */ {(13<<2)|2,{105,42,0}}, +/* 14284 */ {(13<<2)|2,{105,42,0}}, +/* 14285 */ {(13<<2)|2,{105,42,0}}, +/* 14286 */ {(13<<2)|2,{105,42,0}}, +/* 14287 */ {(13<<2)|2,{105,42,0}}, +/* 14288 */ {(13<<2)|2,{105,44,0}}, +/* 14289 */ {(13<<2)|2,{105,44,0}}, +/* 14290 */ {(13<<2)|2,{105,44,0}}, +/* 14291 */ {(13<<2)|2,{105,44,0}}, +/* 14292 */ {(13<<2)|2,{105,44,0}}, +/* 14293 */ {(13<<2)|2,{105,44,0}}, +/* 14294 */ {(13<<2)|2,{105,44,0}}, +/* 14295 */ {(13<<2)|2,{105,44,0}}, +/* 14296 */ {(13<<2)|2,{105,59,0}}, +/* 14297 */ {(13<<2)|2,{105,59,0}}, +/* 14298 */ {(13<<2)|2,{105,59,0}}, +/* 14299 */ {(13<<2)|2,{105,59,0}}, +/* 14300 */ {(13<<2)|2,{105,59,0}}, +/* 14301 */ {(13<<2)|2,{105,59,0}}, +/* 14302 */ {(13<<2)|2,{105,59,0}}, +/* 14303 */ {(13<<2)|2,{105,59,0}}, +/* 14304 */ {(13<<2)|2,{105,88,0}}, +/* 14305 */ {(13<<2)|2,{105,88,0}}, +/* 14306 */ {(13<<2)|2,{105,88,0}}, +/* 14307 */ {(13<<2)|2,{105,88,0}}, +/* 14308 */ {(13<<2)|2,{105,88,0}}, +/* 14309 */ {(13<<2)|2,{105,88,0}}, +/* 14310 */ {(13<<2)|2,{105,88,0}}, +/* 14311 */ {(13<<2)|2,{105,88,0}}, +/* 14312 */ {(13<<2)|2,{105,90,0}}, +/* 14313 */ {(13<<2)|2,{105,90,0}}, +/* 14314 */ {(13<<2)|2,{105,90,0}}, +/* 14315 */ {(13<<2)|2,{105,90,0}}, +/* 14316 */ {(13<<2)|2,{105,90,0}}, +/* 14317 */ {(13<<2)|2,{105,90,0}}, +/* 14318 */ {(13<<2)|2,{105,90,0}}, +/* 14319 */ {(13<<2)|2,{105,90,0}}, +/* 14320 */ {(15<<2)|2,{105,33,0}}, +/* 14321 */ {(15<<2)|2,{105,33,0}}, +/* 14322 */ {(15<<2)|2,{105,34,0}}, +/* 14323 */ {(15<<2)|2,{105,34,0}}, +/* 14324 */ {(15<<2)|2,{105,40,0}}, +/* 14325 */ {(15<<2)|2,{105,40,0}}, +/* 14326 */ {(15<<2)|2,{105,41,0}}, +/* 14327 */ {(15<<2)|2,{105,41,0}}, +/* 14328 */ {(15<<2)|2,{105,63,0}}, +/* 14329 */ {(15<<2)|2,{105,63,0}}, +/* 14330 */ {(16<<2)|2,{105,39,0}}, +/* 14331 */ {(16<<2)|2,{105,43,0}}, +/* 14332 */ {(16<<2)|2,{105,124,0}}, +/* 14333 */ {(5<<2)|1,{105,0,0}}, +/* 14334 */ {(5<<2)|1,{105,0,0}}, +/* 14335 */ {(5<<2)|1,{105,0,0}}, +/* 14336 */ {(15<<2)|3,{111,48,48}}, +/* 14337 */ {(15<<2)|3,{111,48,48}}, +/* 14338 */ {(15<<2)|3,{111,48,49}}, +/* 14339 */ {(15<<2)|3,{111,48,49}}, +/* 14340 */ {(15<<2)|3,{111,48,50}}, +/* 14341 */ {(15<<2)|3,{111,48,50}}, +/* 14342 */ {(15<<2)|3,{111,48,97}}, +/* 14343 */ {(15<<2)|3,{111,48,97}}, +/* 14344 */ {(15<<2)|3,{111,48,99}}, +/* 14345 */ {(15<<2)|3,{111,48,99}}, +/* 14346 */ {(15<<2)|3,{111,48,101}}, +/* 14347 */ {(15<<2)|3,{111,48,101}}, +/* 14348 */ {(15<<2)|3,{111,48,105}}, +/* 14349 */ {(15<<2)|3,{111,48,105}}, +/* 14350 */ {(15<<2)|3,{111,48,111}}, +/* 14351 */ {(15<<2)|3,{111,48,111}}, +/* 14352 */ {(15<<2)|3,{111,48,115}}, +/* 14353 */ {(15<<2)|3,{111,48,115}}, +/* 14354 */ {(15<<2)|3,{111,48,116}}, +/* 14355 */ {(15<<2)|3,{111,48,116}}, +/* 14356 */ {(16<<2)|3,{111,48,32}}, +/* 14357 */ {(16<<2)|3,{111,48,37}}, +/* 14358 */ {(16<<2)|3,{111,48,45}}, +/* 14359 */ {(16<<2)|3,{111,48,46}}, +/* 14360 */ {(16<<2)|3,{111,48,47}}, +/* 14361 */ {(16<<2)|3,{111,48,51}}, +/* 14362 */ {(16<<2)|3,{111,48,52}}, +/* 14363 */ {(16<<2)|3,{111,48,53}}, +/* 14364 */ {(16<<2)|3,{111,48,54}}, +/* 14365 */ {(16<<2)|3,{111,48,55}}, +/* 14366 */ {(16<<2)|3,{111,48,56}}, +/* 14367 */ {(16<<2)|3,{111,48,57}}, +/* 14368 */ {(16<<2)|3,{111,48,61}}, +/* 14369 */ {(16<<2)|3,{111,48,65}}, +/* 14370 */ {(16<<2)|3,{111,48,95}}, +/* 14371 */ {(16<<2)|3,{111,48,98}}, +/* 14372 */ {(16<<2)|3,{111,48,100}}, +/* 14373 */ {(16<<2)|3,{111,48,102}}, +/* 14374 */ {(16<<2)|3,{111,48,103}}, +/* 14375 */ {(16<<2)|3,{111,48,104}}, +/* 14376 */ {(16<<2)|3,{111,48,108}}, +/* 14377 */ {(16<<2)|3,{111,48,109}}, +/* 14378 */ {(16<<2)|3,{111,48,110}}, +/* 14379 */ {(16<<2)|3,{111,48,112}}, +/* 14380 */ {(16<<2)|3,{111,48,114}}, +/* 14381 */ {(16<<2)|3,{111,48,117}}, +/* 14382 */ {(10<<2)|2,{111,48,0}}, +/* 14383 */ {(10<<2)|2,{111,48,0}}, +/* 14384 */ {(10<<2)|2,{111,48,0}}, +/* 14385 */ {(10<<2)|2,{111,48,0}}, +/* 14386 */ {(10<<2)|2,{111,48,0}}, +/* 14387 */ {(10<<2)|2,{111,48,0}}, +/* 14388 */ {(10<<2)|2,{111,48,0}}, +/* 14389 */ {(10<<2)|2,{111,48,0}}, +/* 14390 */ {(10<<2)|2,{111,48,0}}, +/* 14391 */ {(10<<2)|2,{111,48,0}}, +/* 14392 */ {(10<<2)|2,{111,48,0}}, +/* 14393 */ {(10<<2)|2,{111,48,0}}, +/* 14394 */ {(10<<2)|2,{111,48,0}}, +/* 14395 */ {(10<<2)|2,{111,48,0}}, +/* 14396 */ {(10<<2)|2,{111,48,0}}, +/* 14397 */ {(10<<2)|2,{111,48,0}}, +/* 14398 */ {(10<<2)|2,{111,48,0}}, +/* 14399 */ {(10<<2)|2,{111,48,0}}, +/* 14400 */ {(15<<2)|3,{111,49,48}}, +/* 14401 */ {(15<<2)|3,{111,49,48}}, +/* 14402 */ {(15<<2)|3,{111,49,49}}, +/* 14403 */ {(15<<2)|3,{111,49,49}}, +/* 14404 */ {(15<<2)|3,{111,49,50}}, +/* 14405 */ {(15<<2)|3,{111,49,50}}, +/* 14406 */ {(15<<2)|3,{111,49,97}}, +/* 14407 */ {(15<<2)|3,{111,49,97}}, +/* 14408 */ {(15<<2)|3,{111,49,99}}, +/* 14409 */ {(15<<2)|3,{111,49,99}}, +/* 14410 */ {(15<<2)|3,{111,49,101}}, +/* 14411 */ {(15<<2)|3,{111,49,101}}, +/* 14412 */ {(15<<2)|3,{111,49,105}}, +/* 14413 */ {(15<<2)|3,{111,49,105}}, +/* 14414 */ {(15<<2)|3,{111,49,111}}, +/* 14415 */ {(15<<2)|3,{111,49,111}}, +/* 14416 */ {(15<<2)|3,{111,49,115}}, +/* 14417 */ {(15<<2)|3,{111,49,115}}, +/* 14418 */ {(15<<2)|3,{111,49,116}}, +/* 14419 */ {(15<<2)|3,{111,49,116}}, +/* 14420 */ {(16<<2)|3,{111,49,32}}, +/* 14421 */ {(16<<2)|3,{111,49,37}}, +/* 14422 */ {(16<<2)|3,{111,49,45}}, +/* 14423 */ {(16<<2)|3,{111,49,46}}, +/* 14424 */ {(16<<2)|3,{111,49,47}}, +/* 14425 */ {(16<<2)|3,{111,49,51}}, +/* 14426 */ {(16<<2)|3,{111,49,52}}, +/* 14427 */ {(16<<2)|3,{111,49,53}}, +/* 14428 */ {(16<<2)|3,{111,49,54}}, +/* 14429 */ {(16<<2)|3,{111,49,55}}, +/* 14430 */ {(16<<2)|3,{111,49,56}}, +/* 14431 */ {(16<<2)|3,{111,49,57}}, +/* 14432 */ {(16<<2)|3,{111,49,61}}, +/* 14433 */ {(16<<2)|3,{111,49,65}}, +/* 14434 */ {(16<<2)|3,{111,49,95}}, +/* 14435 */ {(16<<2)|3,{111,49,98}}, +/* 14436 */ {(16<<2)|3,{111,49,100}}, +/* 14437 */ {(16<<2)|3,{111,49,102}}, +/* 14438 */ {(16<<2)|3,{111,49,103}}, +/* 14439 */ {(16<<2)|3,{111,49,104}}, +/* 14440 */ {(16<<2)|3,{111,49,108}}, +/* 14441 */ {(16<<2)|3,{111,49,109}}, +/* 14442 */ {(16<<2)|3,{111,49,110}}, +/* 14443 */ {(16<<2)|3,{111,49,112}}, +/* 14444 */ {(16<<2)|3,{111,49,114}}, +/* 14445 */ {(16<<2)|3,{111,49,117}}, +/* 14446 */ {(10<<2)|2,{111,49,0}}, +/* 14447 */ {(10<<2)|2,{111,49,0}}, +/* 14448 */ {(10<<2)|2,{111,49,0}}, +/* 14449 */ {(10<<2)|2,{111,49,0}}, +/* 14450 */ {(10<<2)|2,{111,49,0}}, +/* 14451 */ {(10<<2)|2,{111,49,0}}, +/* 14452 */ {(10<<2)|2,{111,49,0}}, +/* 14453 */ {(10<<2)|2,{111,49,0}}, +/* 14454 */ {(10<<2)|2,{111,49,0}}, +/* 14455 */ {(10<<2)|2,{111,49,0}}, +/* 14456 */ {(10<<2)|2,{111,49,0}}, +/* 14457 */ {(10<<2)|2,{111,49,0}}, +/* 14458 */ {(10<<2)|2,{111,49,0}}, +/* 14459 */ {(10<<2)|2,{111,49,0}}, +/* 14460 */ {(10<<2)|2,{111,49,0}}, +/* 14461 */ {(10<<2)|2,{111,49,0}}, +/* 14462 */ {(10<<2)|2,{111,49,0}}, +/* 14463 */ {(10<<2)|2,{111,49,0}}, +/* 14464 */ {(15<<2)|3,{111,50,48}}, +/* 14465 */ {(15<<2)|3,{111,50,48}}, +/* 14466 */ {(15<<2)|3,{111,50,49}}, +/* 14467 */ {(15<<2)|3,{111,50,49}}, +/* 14468 */ {(15<<2)|3,{111,50,50}}, +/* 14469 */ {(15<<2)|3,{111,50,50}}, +/* 14470 */ {(15<<2)|3,{111,50,97}}, +/* 14471 */ {(15<<2)|3,{111,50,97}}, +/* 14472 */ {(15<<2)|3,{111,50,99}}, +/* 14473 */ {(15<<2)|3,{111,50,99}}, +/* 14474 */ {(15<<2)|3,{111,50,101}}, +/* 14475 */ {(15<<2)|3,{111,50,101}}, +/* 14476 */ {(15<<2)|3,{111,50,105}}, +/* 14477 */ {(15<<2)|3,{111,50,105}}, +/* 14478 */ {(15<<2)|3,{111,50,111}}, +/* 14479 */ {(15<<2)|3,{111,50,111}}, +/* 14480 */ {(15<<2)|3,{111,50,115}}, +/* 14481 */ {(15<<2)|3,{111,50,115}}, +/* 14482 */ {(15<<2)|3,{111,50,116}}, +/* 14483 */ {(15<<2)|3,{111,50,116}}, +/* 14484 */ {(16<<2)|3,{111,50,32}}, +/* 14485 */ {(16<<2)|3,{111,50,37}}, +/* 14486 */ {(16<<2)|3,{111,50,45}}, +/* 14487 */ {(16<<2)|3,{111,50,46}}, +/* 14488 */ {(16<<2)|3,{111,50,47}}, +/* 14489 */ {(16<<2)|3,{111,50,51}}, +/* 14490 */ {(16<<2)|3,{111,50,52}}, +/* 14491 */ {(16<<2)|3,{111,50,53}}, +/* 14492 */ {(16<<2)|3,{111,50,54}}, +/* 14493 */ {(16<<2)|3,{111,50,55}}, +/* 14494 */ {(16<<2)|3,{111,50,56}}, +/* 14495 */ {(16<<2)|3,{111,50,57}}, +/* 14496 */ {(16<<2)|3,{111,50,61}}, +/* 14497 */ {(16<<2)|3,{111,50,65}}, +/* 14498 */ {(16<<2)|3,{111,50,95}}, +/* 14499 */ {(16<<2)|3,{111,50,98}}, +/* 14500 */ {(16<<2)|3,{111,50,100}}, +/* 14501 */ {(16<<2)|3,{111,50,102}}, +/* 14502 */ {(16<<2)|3,{111,50,103}}, +/* 14503 */ {(16<<2)|3,{111,50,104}}, +/* 14504 */ {(16<<2)|3,{111,50,108}}, +/* 14505 */ {(16<<2)|3,{111,50,109}}, +/* 14506 */ {(16<<2)|3,{111,50,110}}, +/* 14507 */ {(16<<2)|3,{111,50,112}}, +/* 14508 */ {(16<<2)|3,{111,50,114}}, +/* 14509 */ {(16<<2)|3,{111,50,117}}, +/* 14510 */ {(10<<2)|2,{111,50,0}}, +/* 14511 */ {(10<<2)|2,{111,50,0}}, +/* 14512 */ {(10<<2)|2,{111,50,0}}, +/* 14513 */ {(10<<2)|2,{111,50,0}}, +/* 14514 */ {(10<<2)|2,{111,50,0}}, +/* 14515 */ {(10<<2)|2,{111,50,0}}, +/* 14516 */ {(10<<2)|2,{111,50,0}}, +/* 14517 */ {(10<<2)|2,{111,50,0}}, +/* 14518 */ {(10<<2)|2,{111,50,0}}, +/* 14519 */ {(10<<2)|2,{111,50,0}}, +/* 14520 */ {(10<<2)|2,{111,50,0}}, +/* 14521 */ {(10<<2)|2,{111,50,0}}, +/* 14522 */ {(10<<2)|2,{111,50,0}}, +/* 14523 */ {(10<<2)|2,{111,50,0}}, +/* 14524 */ {(10<<2)|2,{111,50,0}}, +/* 14525 */ {(10<<2)|2,{111,50,0}}, +/* 14526 */ {(10<<2)|2,{111,50,0}}, +/* 14527 */ {(10<<2)|2,{111,50,0}}, +/* 14528 */ {(15<<2)|3,{111,97,48}}, +/* 14529 */ {(15<<2)|3,{111,97,48}}, +/* 14530 */ {(15<<2)|3,{111,97,49}}, +/* 14531 */ {(15<<2)|3,{111,97,49}}, +/* 14532 */ {(15<<2)|3,{111,97,50}}, +/* 14533 */ {(15<<2)|3,{111,97,50}}, +/* 14534 */ {(15<<2)|3,{111,97,97}}, +/* 14535 */ {(15<<2)|3,{111,97,97}}, +/* 14536 */ {(15<<2)|3,{111,97,99}}, +/* 14537 */ {(15<<2)|3,{111,97,99}}, +/* 14538 */ {(15<<2)|3,{111,97,101}}, +/* 14539 */ {(15<<2)|3,{111,97,101}}, +/* 14540 */ {(15<<2)|3,{111,97,105}}, +/* 14541 */ {(15<<2)|3,{111,97,105}}, +/* 14542 */ {(15<<2)|3,{111,97,111}}, +/* 14543 */ {(15<<2)|3,{111,97,111}}, +/* 14544 */ {(15<<2)|3,{111,97,115}}, +/* 14545 */ {(15<<2)|3,{111,97,115}}, +/* 14546 */ {(15<<2)|3,{111,97,116}}, +/* 14547 */ {(15<<2)|3,{111,97,116}}, +/* 14548 */ {(16<<2)|3,{111,97,32}}, +/* 14549 */ {(16<<2)|3,{111,97,37}}, +/* 14550 */ {(16<<2)|3,{111,97,45}}, +/* 14551 */ {(16<<2)|3,{111,97,46}}, +/* 14552 */ {(16<<2)|3,{111,97,47}}, +/* 14553 */ {(16<<2)|3,{111,97,51}}, +/* 14554 */ {(16<<2)|3,{111,97,52}}, +/* 14555 */ {(16<<2)|3,{111,97,53}}, +/* 14556 */ {(16<<2)|3,{111,97,54}}, +/* 14557 */ {(16<<2)|3,{111,97,55}}, +/* 14558 */ {(16<<2)|3,{111,97,56}}, +/* 14559 */ {(16<<2)|3,{111,97,57}}, +/* 14560 */ {(16<<2)|3,{111,97,61}}, +/* 14561 */ {(16<<2)|3,{111,97,65}}, +/* 14562 */ {(16<<2)|3,{111,97,95}}, +/* 14563 */ {(16<<2)|3,{111,97,98}}, +/* 14564 */ {(16<<2)|3,{111,97,100}}, +/* 14565 */ {(16<<2)|3,{111,97,102}}, +/* 14566 */ {(16<<2)|3,{111,97,103}}, +/* 14567 */ {(16<<2)|3,{111,97,104}}, +/* 14568 */ {(16<<2)|3,{111,97,108}}, +/* 14569 */ {(16<<2)|3,{111,97,109}}, +/* 14570 */ {(16<<2)|3,{111,97,110}}, +/* 14571 */ {(16<<2)|3,{111,97,112}}, +/* 14572 */ {(16<<2)|3,{111,97,114}}, +/* 14573 */ {(16<<2)|3,{111,97,117}}, +/* 14574 */ {(10<<2)|2,{111,97,0}}, +/* 14575 */ {(10<<2)|2,{111,97,0}}, +/* 14576 */ {(10<<2)|2,{111,97,0}}, +/* 14577 */ {(10<<2)|2,{111,97,0}}, +/* 14578 */ {(10<<2)|2,{111,97,0}}, +/* 14579 */ {(10<<2)|2,{111,97,0}}, +/* 14580 */ {(10<<2)|2,{111,97,0}}, +/* 14581 */ {(10<<2)|2,{111,97,0}}, +/* 14582 */ {(10<<2)|2,{111,97,0}}, +/* 14583 */ {(10<<2)|2,{111,97,0}}, +/* 14584 */ {(10<<2)|2,{111,97,0}}, +/* 14585 */ {(10<<2)|2,{111,97,0}}, +/* 14586 */ {(10<<2)|2,{111,97,0}}, +/* 14587 */ {(10<<2)|2,{111,97,0}}, +/* 14588 */ {(10<<2)|2,{111,97,0}}, +/* 14589 */ {(10<<2)|2,{111,97,0}}, +/* 14590 */ {(10<<2)|2,{111,97,0}}, +/* 14591 */ {(10<<2)|2,{111,97,0}}, +/* 14592 */ {(15<<2)|3,{111,99,48}}, +/* 14593 */ {(15<<2)|3,{111,99,48}}, +/* 14594 */ {(15<<2)|3,{111,99,49}}, +/* 14595 */ {(15<<2)|3,{111,99,49}}, +/* 14596 */ {(15<<2)|3,{111,99,50}}, +/* 14597 */ {(15<<2)|3,{111,99,50}}, +/* 14598 */ {(15<<2)|3,{111,99,97}}, +/* 14599 */ {(15<<2)|3,{111,99,97}}, +/* 14600 */ {(15<<2)|3,{111,99,99}}, +/* 14601 */ {(15<<2)|3,{111,99,99}}, +/* 14602 */ {(15<<2)|3,{111,99,101}}, +/* 14603 */ {(15<<2)|3,{111,99,101}}, +/* 14604 */ {(15<<2)|3,{111,99,105}}, +/* 14605 */ {(15<<2)|3,{111,99,105}}, +/* 14606 */ {(15<<2)|3,{111,99,111}}, +/* 14607 */ {(15<<2)|3,{111,99,111}}, +/* 14608 */ {(15<<2)|3,{111,99,115}}, +/* 14609 */ {(15<<2)|3,{111,99,115}}, +/* 14610 */ {(15<<2)|3,{111,99,116}}, +/* 14611 */ {(15<<2)|3,{111,99,116}}, +/* 14612 */ {(16<<2)|3,{111,99,32}}, +/* 14613 */ {(16<<2)|3,{111,99,37}}, +/* 14614 */ {(16<<2)|3,{111,99,45}}, +/* 14615 */ {(16<<2)|3,{111,99,46}}, +/* 14616 */ {(16<<2)|3,{111,99,47}}, +/* 14617 */ {(16<<2)|3,{111,99,51}}, +/* 14618 */ {(16<<2)|3,{111,99,52}}, +/* 14619 */ {(16<<2)|3,{111,99,53}}, +/* 14620 */ {(16<<2)|3,{111,99,54}}, +/* 14621 */ {(16<<2)|3,{111,99,55}}, +/* 14622 */ {(16<<2)|3,{111,99,56}}, +/* 14623 */ {(16<<2)|3,{111,99,57}}, +/* 14624 */ {(16<<2)|3,{111,99,61}}, +/* 14625 */ {(16<<2)|3,{111,99,65}}, +/* 14626 */ {(16<<2)|3,{111,99,95}}, +/* 14627 */ {(16<<2)|3,{111,99,98}}, +/* 14628 */ {(16<<2)|3,{111,99,100}}, +/* 14629 */ {(16<<2)|3,{111,99,102}}, +/* 14630 */ {(16<<2)|3,{111,99,103}}, +/* 14631 */ {(16<<2)|3,{111,99,104}}, +/* 14632 */ {(16<<2)|3,{111,99,108}}, +/* 14633 */ {(16<<2)|3,{111,99,109}}, +/* 14634 */ {(16<<2)|3,{111,99,110}}, +/* 14635 */ {(16<<2)|3,{111,99,112}}, +/* 14636 */ {(16<<2)|3,{111,99,114}}, +/* 14637 */ {(16<<2)|3,{111,99,117}}, +/* 14638 */ {(10<<2)|2,{111,99,0}}, +/* 14639 */ {(10<<2)|2,{111,99,0}}, +/* 14640 */ {(10<<2)|2,{111,99,0}}, +/* 14641 */ {(10<<2)|2,{111,99,0}}, +/* 14642 */ {(10<<2)|2,{111,99,0}}, +/* 14643 */ {(10<<2)|2,{111,99,0}}, +/* 14644 */ {(10<<2)|2,{111,99,0}}, +/* 14645 */ {(10<<2)|2,{111,99,0}}, +/* 14646 */ {(10<<2)|2,{111,99,0}}, +/* 14647 */ {(10<<2)|2,{111,99,0}}, +/* 14648 */ {(10<<2)|2,{111,99,0}}, +/* 14649 */ {(10<<2)|2,{111,99,0}}, +/* 14650 */ {(10<<2)|2,{111,99,0}}, +/* 14651 */ {(10<<2)|2,{111,99,0}}, +/* 14652 */ {(10<<2)|2,{111,99,0}}, +/* 14653 */ {(10<<2)|2,{111,99,0}}, +/* 14654 */ {(10<<2)|2,{111,99,0}}, +/* 14655 */ {(10<<2)|2,{111,99,0}}, +/* 14656 */ {(15<<2)|3,{111,101,48}}, +/* 14657 */ {(15<<2)|3,{111,101,48}}, +/* 14658 */ {(15<<2)|3,{111,101,49}}, +/* 14659 */ {(15<<2)|3,{111,101,49}}, +/* 14660 */ {(15<<2)|3,{111,101,50}}, +/* 14661 */ {(15<<2)|3,{111,101,50}}, +/* 14662 */ {(15<<2)|3,{111,101,97}}, +/* 14663 */ {(15<<2)|3,{111,101,97}}, +/* 14664 */ {(15<<2)|3,{111,101,99}}, +/* 14665 */ {(15<<2)|3,{111,101,99}}, +/* 14666 */ {(15<<2)|3,{111,101,101}}, +/* 14667 */ {(15<<2)|3,{111,101,101}}, +/* 14668 */ {(15<<2)|3,{111,101,105}}, +/* 14669 */ {(15<<2)|3,{111,101,105}}, +/* 14670 */ {(15<<2)|3,{111,101,111}}, +/* 14671 */ {(15<<2)|3,{111,101,111}}, +/* 14672 */ {(15<<2)|3,{111,101,115}}, +/* 14673 */ {(15<<2)|3,{111,101,115}}, +/* 14674 */ {(15<<2)|3,{111,101,116}}, +/* 14675 */ {(15<<2)|3,{111,101,116}}, +/* 14676 */ {(16<<2)|3,{111,101,32}}, +/* 14677 */ {(16<<2)|3,{111,101,37}}, +/* 14678 */ {(16<<2)|3,{111,101,45}}, +/* 14679 */ {(16<<2)|3,{111,101,46}}, +/* 14680 */ {(16<<2)|3,{111,101,47}}, +/* 14681 */ {(16<<2)|3,{111,101,51}}, +/* 14682 */ {(16<<2)|3,{111,101,52}}, +/* 14683 */ {(16<<2)|3,{111,101,53}}, +/* 14684 */ {(16<<2)|3,{111,101,54}}, +/* 14685 */ {(16<<2)|3,{111,101,55}}, +/* 14686 */ {(16<<2)|3,{111,101,56}}, +/* 14687 */ {(16<<2)|3,{111,101,57}}, +/* 14688 */ {(16<<2)|3,{111,101,61}}, +/* 14689 */ {(16<<2)|3,{111,101,65}}, +/* 14690 */ {(16<<2)|3,{111,101,95}}, +/* 14691 */ {(16<<2)|3,{111,101,98}}, +/* 14692 */ {(16<<2)|3,{111,101,100}}, +/* 14693 */ {(16<<2)|3,{111,101,102}}, +/* 14694 */ {(16<<2)|3,{111,101,103}}, +/* 14695 */ {(16<<2)|3,{111,101,104}}, +/* 14696 */ {(16<<2)|3,{111,101,108}}, +/* 14697 */ {(16<<2)|3,{111,101,109}}, +/* 14698 */ {(16<<2)|3,{111,101,110}}, +/* 14699 */ {(16<<2)|3,{111,101,112}}, +/* 14700 */ {(16<<2)|3,{111,101,114}}, +/* 14701 */ {(16<<2)|3,{111,101,117}}, +/* 14702 */ {(10<<2)|2,{111,101,0}}, +/* 14703 */ {(10<<2)|2,{111,101,0}}, +/* 14704 */ {(10<<2)|2,{111,101,0}}, +/* 14705 */ {(10<<2)|2,{111,101,0}}, +/* 14706 */ {(10<<2)|2,{111,101,0}}, +/* 14707 */ {(10<<2)|2,{111,101,0}}, +/* 14708 */ {(10<<2)|2,{111,101,0}}, +/* 14709 */ {(10<<2)|2,{111,101,0}}, +/* 14710 */ {(10<<2)|2,{111,101,0}}, +/* 14711 */ {(10<<2)|2,{111,101,0}}, +/* 14712 */ {(10<<2)|2,{111,101,0}}, +/* 14713 */ {(10<<2)|2,{111,101,0}}, +/* 14714 */ {(10<<2)|2,{111,101,0}}, +/* 14715 */ {(10<<2)|2,{111,101,0}}, +/* 14716 */ {(10<<2)|2,{111,101,0}}, +/* 14717 */ {(10<<2)|2,{111,101,0}}, +/* 14718 */ {(10<<2)|2,{111,101,0}}, +/* 14719 */ {(10<<2)|2,{111,101,0}}, +/* 14720 */ {(15<<2)|3,{111,105,48}}, +/* 14721 */ {(15<<2)|3,{111,105,48}}, +/* 14722 */ {(15<<2)|3,{111,105,49}}, +/* 14723 */ {(15<<2)|3,{111,105,49}}, +/* 14724 */ {(15<<2)|3,{111,105,50}}, +/* 14725 */ {(15<<2)|3,{111,105,50}}, +/* 14726 */ {(15<<2)|3,{111,105,97}}, +/* 14727 */ {(15<<2)|3,{111,105,97}}, +/* 14728 */ {(15<<2)|3,{111,105,99}}, +/* 14729 */ {(15<<2)|3,{111,105,99}}, +/* 14730 */ {(15<<2)|3,{111,105,101}}, +/* 14731 */ {(15<<2)|3,{111,105,101}}, +/* 14732 */ {(15<<2)|3,{111,105,105}}, +/* 14733 */ {(15<<2)|3,{111,105,105}}, +/* 14734 */ {(15<<2)|3,{111,105,111}}, +/* 14735 */ {(15<<2)|3,{111,105,111}}, +/* 14736 */ {(15<<2)|3,{111,105,115}}, +/* 14737 */ {(15<<2)|3,{111,105,115}}, +/* 14738 */ {(15<<2)|3,{111,105,116}}, +/* 14739 */ {(15<<2)|3,{111,105,116}}, +/* 14740 */ {(16<<2)|3,{111,105,32}}, +/* 14741 */ {(16<<2)|3,{111,105,37}}, +/* 14742 */ {(16<<2)|3,{111,105,45}}, +/* 14743 */ {(16<<2)|3,{111,105,46}}, +/* 14744 */ {(16<<2)|3,{111,105,47}}, +/* 14745 */ {(16<<2)|3,{111,105,51}}, +/* 14746 */ {(16<<2)|3,{111,105,52}}, +/* 14747 */ {(16<<2)|3,{111,105,53}}, +/* 14748 */ {(16<<2)|3,{111,105,54}}, +/* 14749 */ {(16<<2)|3,{111,105,55}}, +/* 14750 */ {(16<<2)|3,{111,105,56}}, +/* 14751 */ {(16<<2)|3,{111,105,57}}, +/* 14752 */ {(16<<2)|3,{111,105,61}}, +/* 14753 */ {(16<<2)|3,{111,105,65}}, +/* 14754 */ {(16<<2)|3,{111,105,95}}, +/* 14755 */ {(16<<2)|3,{111,105,98}}, +/* 14756 */ {(16<<2)|3,{111,105,100}}, +/* 14757 */ {(16<<2)|3,{111,105,102}}, +/* 14758 */ {(16<<2)|3,{111,105,103}}, +/* 14759 */ {(16<<2)|3,{111,105,104}}, +/* 14760 */ {(16<<2)|3,{111,105,108}}, +/* 14761 */ {(16<<2)|3,{111,105,109}}, +/* 14762 */ {(16<<2)|3,{111,105,110}}, +/* 14763 */ {(16<<2)|3,{111,105,112}}, +/* 14764 */ {(16<<2)|3,{111,105,114}}, +/* 14765 */ {(16<<2)|3,{111,105,117}}, +/* 14766 */ {(10<<2)|2,{111,105,0}}, +/* 14767 */ {(10<<2)|2,{111,105,0}}, +/* 14768 */ {(10<<2)|2,{111,105,0}}, +/* 14769 */ {(10<<2)|2,{111,105,0}}, +/* 14770 */ {(10<<2)|2,{111,105,0}}, +/* 14771 */ {(10<<2)|2,{111,105,0}}, +/* 14772 */ {(10<<2)|2,{111,105,0}}, +/* 14773 */ {(10<<2)|2,{111,105,0}}, +/* 14774 */ {(10<<2)|2,{111,105,0}}, +/* 14775 */ {(10<<2)|2,{111,105,0}}, +/* 14776 */ {(10<<2)|2,{111,105,0}}, +/* 14777 */ {(10<<2)|2,{111,105,0}}, +/* 14778 */ {(10<<2)|2,{111,105,0}}, +/* 14779 */ {(10<<2)|2,{111,105,0}}, +/* 14780 */ {(10<<2)|2,{111,105,0}}, +/* 14781 */ {(10<<2)|2,{111,105,0}}, +/* 14782 */ {(10<<2)|2,{111,105,0}}, +/* 14783 */ {(10<<2)|2,{111,105,0}}, +/* 14784 */ {(15<<2)|3,{111,111,48}}, +/* 14785 */ {(15<<2)|3,{111,111,48}}, +/* 14786 */ {(15<<2)|3,{111,111,49}}, +/* 14787 */ {(15<<2)|3,{111,111,49}}, +/* 14788 */ {(15<<2)|3,{111,111,50}}, +/* 14789 */ {(15<<2)|3,{111,111,50}}, +/* 14790 */ {(15<<2)|3,{111,111,97}}, +/* 14791 */ {(15<<2)|3,{111,111,97}}, +/* 14792 */ {(15<<2)|3,{111,111,99}}, +/* 14793 */ {(15<<2)|3,{111,111,99}}, +/* 14794 */ {(15<<2)|3,{111,111,101}}, +/* 14795 */ {(15<<2)|3,{111,111,101}}, +/* 14796 */ {(15<<2)|3,{111,111,105}}, +/* 14797 */ {(15<<2)|3,{111,111,105}}, +/* 14798 */ {(15<<2)|3,{111,111,111}}, +/* 14799 */ {(15<<2)|3,{111,111,111}}, +/* 14800 */ {(15<<2)|3,{111,111,115}}, +/* 14801 */ {(15<<2)|3,{111,111,115}}, +/* 14802 */ {(15<<2)|3,{111,111,116}}, +/* 14803 */ {(15<<2)|3,{111,111,116}}, +/* 14804 */ {(16<<2)|3,{111,111,32}}, +/* 14805 */ {(16<<2)|3,{111,111,37}}, +/* 14806 */ {(16<<2)|3,{111,111,45}}, +/* 14807 */ {(16<<2)|3,{111,111,46}}, +/* 14808 */ {(16<<2)|3,{111,111,47}}, +/* 14809 */ {(16<<2)|3,{111,111,51}}, +/* 14810 */ {(16<<2)|3,{111,111,52}}, +/* 14811 */ {(16<<2)|3,{111,111,53}}, +/* 14812 */ {(16<<2)|3,{111,111,54}}, +/* 14813 */ {(16<<2)|3,{111,111,55}}, +/* 14814 */ {(16<<2)|3,{111,111,56}}, +/* 14815 */ {(16<<2)|3,{111,111,57}}, +/* 14816 */ {(16<<2)|3,{111,111,61}}, +/* 14817 */ {(16<<2)|3,{111,111,65}}, +/* 14818 */ {(16<<2)|3,{111,111,95}}, +/* 14819 */ {(16<<2)|3,{111,111,98}}, +/* 14820 */ {(16<<2)|3,{111,111,100}}, +/* 14821 */ {(16<<2)|3,{111,111,102}}, +/* 14822 */ {(16<<2)|3,{111,111,103}}, +/* 14823 */ {(16<<2)|3,{111,111,104}}, +/* 14824 */ {(16<<2)|3,{111,111,108}}, +/* 14825 */ {(16<<2)|3,{111,111,109}}, +/* 14826 */ {(16<<2)|3,{111,111,110}}, +/* 14827 */ {(16<<2)|3,{111,111,112}}, +/* 14828 */ {(16<<2)|3,{111,111,114}}, +/* 14829 */ {(16<<2)|3,{111,111,117}}, +/* 14830 */ {(10<<2)|2,{111,111,0}}, +/* 14831 */ {(10<<2)|2,{111,111,0}}, +/* 14832 */ {(10<<2)|2,{111,111,0}}, +/* 14833 */ {(10<<2)|2,{111,111,0}}, +/* 14834 */ {(10<<2)|2,{111,111,0}}, +/* 14835 */ {(10<<2)|2,{111,111,0}}, +/* 14836 */ {(10<<2)|2,{111,111,0}}, +/* 14837 */ {(10<<2)|2,{111,111,0}}, +/* 14838 */ {(10<<2)|2,{111,111,0}}, +/* 14839 */ {(10<<2)|2,{111,111,0}}, +/* 14840 */ {(10<<2)|2,{111,111,0}}, +/* 14841 */ {(10<<2)|2,{111,111,0}}, +/* 14842 */ {(10<<2)|2,{111,111,0}}, +/* 14843 */ {(10<<2)|2,{111,111,0}}, +/* 14844 */ {(10<<2)|2,{111,111,0}}, +/* 14845 */ {(10<<2)|2,{111,111,0}}, +/* 14846 */ {(10<<2)|2,{111,111,0}}, +/* 14847 */ {(10<<2)|2,{111,111,0}}, +/* 14848 */ {(15<<2)|3,{111,115,48}}, +/* 14849 */ {(15<<2)|3,{111,115,48}}, +/* 14850 */ {(15<<2)|3,{111,115,49}}, +/* 14851 */ {(15<<2)|3,{111,115,49}}, +/* 14852 */ {(15<<2)|3,{111,115,50}}, +/* 14853 */ {(15<<2)|3,{111,115,50}}, +/* 14854 */ {(15<<2)|3,{111,115,97}}, +/* 14855 */ {(15<<2)|3,{111,115,97}}, +/* 14856 */ {(15<<2)|3,{111,115,99}}, +/* 14857 */ {(15<<2)|3,{111,115,99}}, +/* 14858 */ {(15<<2)|3,{111,115,101}}, +/* 14859 */ {(15<<2)|3,{111,115,101}}, +/* 14860 */ {(15<<2)|3,{111,115,105}}, +/* 14861 */ {(15<<2)|3,{111,115,105}}, +/* 14862 */ {(15<<2)|3,{111,115,111}}, +/* 14863 */ {(15<<2)|3,{111,115,111}}, +/* 14864 */ {(15<<2)|3,{111,115,115}}, +/* 14865 */ {(15<<2)|3,{111,115,115}}, +/* 14866 */ {(15<<2)|3,{111,115,116}}, +/* 14867 */ {(15<<2)|3,{111,115,116}}, +/* 14868 */ {(16<<2)|3,{111,115,32}}, +/* 14869 */ {(16<<2)|3,{111,115,37}}, +/* 14870 */ {(16<<2)|3,{111,115,45}}, +/* 14871 */ {(16<<2)|3,{111,115,46}}, +/* 14872 */ {(16<<2)|3,{111,115,47}}, +/* 14873 */ {(16<<2)|3,{111,115,51}}, +/* 14874 */ {(16<<2)|3,{111,115,52}}, +/* 14875 */ {(16<<2)|3,{111,115,53}}, +/* 14876 */ {(16<<2)|3,{111,115,54}}, +/* 14877 */ {(16<<2)|3,{111,115,55}}, +/* 14878 */ {(16<<2)|3,{111,115,56}}, +/* 14879 */ {(16<<2)|3,{111,115,57}}, +/* 14880 */ {(16<<2)|3,{111,115,61}}, +/* 14881 */ {(16<<2)|3,{111,115,65}}, +/* 14882 */ {(16<<2)|3,{111,115,95}}, +/* 14883 */ {(16<<2)|3,{111,115,98}}, +/* 14884 */ {(16<<2)|3,{111,115,100}}, +/* 14885 */ {(16<<2)|3,{111,115,102}}, +/* 14886 */ {(16<<2)|3,{111,115,103}}, +/* 14887 */ {(16<<2)|3,{111,115,104}}, +/* 14888 */ {(16<<2)|3,{111,115,108}}, +/* 14889 */ {(16<<2)|3,{111,115,109}}, +/* 14890 */ {(16<<2)|3,{111,115,110}}, +/* 14891 */ {(16<<2)|3,{111,115,112}}, +/* 14892 */ {(16<<2)|3,{111,115,114}}, +/* 14893 */ {(16<<2)|3,{111,115,117}}, +/* 14894 */ {(10<<2)|2,{111,115,0}}, +/* 14895 */ {(10<<2)|2,{111,115,0}}, +/* 14896 */ {(10<<2)|2,{111,115,0}}, +/* 14897 */ {(10<<2)|2,{111,115,0}}, +/* 14898 */ {(10<<2)|2,{111,115,0}}, +/* 14899 */ {(10<<2)|2,{111,115,0}}, +/* 14900 */ {(10<<2)|2,{111,115,0}}, +/* 14901 */ {(10<<2)|2,{111,115,0}}, +/* 14902 */ {(10<<2)|2,{111,115,0}}, +/* 14903 */ {(10<<2)|2,{111,115,0}}, +/* 14904 */ {(10<<2)|2,{111,115,0}}, +/* 14905 */ {(10<<2)|2,{111,115,0}}, +/* 14906 */ {(10<<2)|2,{111,115,0}}, +/* 14907 */ {(10<<2)|2,{111,115,0}}, +/* 14908 */ {(10<<2)|2,{111,115,0}}, +/* 14909 */ {(10<<2)|2,{111,115,0}}, +/* 14910 */ {(10<<2)|2,{111,115,0}}, +/* 14911 */ {(10<<2)|2,{111,115,0}}, +/* 14912 */ {(15<<2)|3,{111,116,48}}, +/* 14913 */ {(15<<2)|3,{111,116,48}}, +/* 14914 */ {(15<<2)|3,{111,116,49}}, +/* 14915 */ {(15<<2)|3,{111,116,49}}, +/* 14916 */ {(15<<2)|3,{111,116,50}}, +/* 14917 */ {(15<<2)|3,{111,116,50}}, +/* 14918 */ {(15<<2)|3,{111,116,97}}, +/* 14919 */ {(15<<2)|3,{111,116,97}}, +/* 14920 */ {(15<<2)|3,{111,116,99}}, +/* 14921 */ {(15<<2)|3,{111,116,99}}, +/* 14922 */ {(15<<2)|3,{111,116,101}}, +/* 14923 */ {(15<<2)|3,{111,116,101}}, +/* 14924 */ {(15<<2)|3,{111,116,105}}, +/* 14925 */ {(15<<2)|3,{111,116,105}}, +/* 14926 */ {(15<<2)|3,{111,116,111}}, +/* 14927 */ {(15<<2)|3,{111,116,111}}, +/* 14928 */ {(15<<2)|3,{111,116,115}}, +/* 14929 */ {(15<<2)|3,{111,116,115}}, +/* 14930 */ {(15<<2)|3,{111,116,116}}, +/* 14931 */ {(15<<2)|3,{111,116,116}}, +/* 14932 */ {(16<<2)|3,{111,116,32}}, +/* 14933 */ {(16<<2)|3,{111,116,37}}, +/* 14934 */ {(16<<2)|3,{111,116,45}}, +/* 14935 */ {(16<<2)|3,{111,116,46}}, +/* 14936 */ {(16<<2)|3,{111,116,47}}, +/* 14937 */ {(16<<2)|3,{111,116,51}}, +/* 14938 */ {(16<<2)|3,{111,116,52}}, +/* 14939 */ {(16<<2)|3,{111,116,53}}, +/* 14940 */ {(16<<2)|3,{111,116,54}}, +/* 14941 */ {(16<<2)|3,{111,116,55}}, +/* 14942 */ {(16<<2)|3,{111,116,56}}, +/* 14943 */ {(16<<2)|3,{111,116,57}}, +/* 14944 */ {(16<<2)|3,{111,116,61}}, +/* 14945 */ {(16<<2)|3,{111,116,65}}, +/* 14946 */ {(16<<2)|3,{111,116,95}}, +/* 14947 */ {(16<<2)|3,{111,116,98}}, +/* 14948 */ {(16<<2)|3,{111,116,100}}, +/* 14949 */ {(16<<2)|3,{111,116,102}}, +/* 14950 */ {(16<<2)|3,{111,116,103}}, +/* 14951 */ {(16<<2)|3,{111,116,104}}, +/* 14952 */ {(16<<2)|3,{111,116,108}}, +/* 14953 */ {(16<<2)|3,{111,116,109}}, +/* 14954 */ {(16<<2)|3,{111,116,110}}, +/* 14955 */ {(16<<2)|3,{111,116,112}}, +/* 14956 */ {(16<<2)|3,{111,116,114}}, +/* 14957 */ {(16<<2)|3,{111,116,117}}, +/* 14958 */ {(10<<2)|2,{111,116,0}}, +/* 14959 */ {(10<<2)|2,{111,116,0}}, +/* 14960 */ {(10<<2)|2,{111,116,0}}, +/* 14961 */ {(10<<2)|2,{111,116,0}}, +/* 14962 */ {(10<<2)|2,{111,116,0}}, +/* 14963 */ {(10<<2)|2,{111,116,0}}, +/* 14964 */ {(10<<2)|2,{111,116,0}}, +/* 14965 */ {(10<<2)|2,{111,116,0}}, +/* 14966 */ {(10<<2)|2,{111,116,0}}, +/* 14967 */ {(10<<2)|2,{111,116,0}}, +/* 14968 */ {(10<<2)|2,{111,116,0}}, +/* 14969 */ {(10<<2)|2,{111,116,0}}, +/* 14970 */ {(10<<2)|2,{111,116,0}}, +/* 14971 */ {(10<<2)|2,{111,116,0}}, +/* 14972 */ {(10<<2)|2,{111,116,0}}, +/* 14973 */ {(10<<2)|2,{111,116,0}}, +/* 14974 */ {(10<<2)|2,{111,116,0}}, +/* 14975 */ {(10<<2)|2,{111,116,0}}, +/* 14976 */ {(16<<2)|3,{111,32,48}}, +/* 14977 */ {(16<<2)|3,{111,32,49}}, +/* 14978 */ {(16<<2)|3,{111,32,50}}, +/* 14979 */ {(16<<2)|3,{111,32,97}}, +/* 14980 */ {(16<<2)|3,{111,32,99}}, +/* 14981 */ {(16<<2)|3,{111,32,101}}, +/* 14982 */ {(16<<2)|3,{111,32,105}}, +/* 14983 */ {(16<<2)|3,{111,32,111}}, +/* 14984 */ {(16<<2)|3,{111,32,115}}, +/* 14985 */ {(16<<2)|3,{111,32,116}}, +/* 14986 */ {(11<<2)|2,{111,32,0}}, +/* 14987 */ {(11<<2)|2,{111,32,0}}, +/* 14988 */ {(11<<2)|2,{111,32,0}}, +/* 14989 */ {(11<<2)|2,{111,32,0}}, +/* 14990 */ {(11<<2)|2,{111,32,0}}, +/* 14991 */ {(11<<2)|2,{111,32,0}}, +/* 14992 */ {(11<<2)|2,{111,32,0}}, +/* 14993 */ {(11<<2)|2,{111,32,0}}, +/* 14994 */ {(11<<2)|2,{111,32,0}}, +/* 14995 */ {(11<<2)|2,{111,32,0}}, +/* 14996 */ {(11<<2)|2,{111,32,0}}, +/* 14997 */ {(11<<2)|2,{111,32,0}}, +/* 14998 */ {(11<<2)|2,{111,32,0}}, +/* 14999 */ {(11<<2)|2,{111,32,0}}, +/* 15000 */ {(11<<2)|2,{111,32,0}}, +/* 15001 */ {(11<<2)|2,{111,32,0}}, +/* 15002 */ {(11<<2)|2,{111,32,0}}, +/* 15003 */ {(11<<2)|2,{111,32,0}}, +/* 15004 */ {(11<<2)|2,{111,32,0}}, +/* 15005 */ {(11<<2)|2,{111,32,0}}, +/* 15006 */ {(11<<2)|2,{111,32,0}}, +/* 15007 */ {(11<<2)|2,{111,32,0}}, +/* 15008 */ {(16<<2)|3,{111,37,48}}, +/* 15009 */ {(16<<2)|3,{111,37,49}}, +/* 15010 */ {(16<<2)|3,{111,37,50}}, +/* 15011 */ {(16<<2)|3,{111,37,97}}, +/* 15012 */ {(16<<2)|3,{111,37,99}}, +/* 15013 */ {(16<<2)|3,{111,37,101}}, +/* 15014 */ {(16<<2)|3,{111,37,105}}, +/* 15015 */ {(16<<2)|3,{111,37,111}}, +/* 15016 */ {(16<<2)|3,{111,37,115}}, +/* 15017 */ {(16<<2)|3,{111,37,116}}, +/* 15018 */ {(11<<2)|2,{111,37,0}}, +/* 15019 */ {(11<<2)|2,{111,37,0}}, +/* 15020 */ {(11<<2)|2,{111,37,0}}, +/* 15021 */ {(11<<2)|2,{111,37,0}}, +/* 15022 */ {(11<<2)|2,{111,37,0}}, +/* 15023 */ {(11<<2)|2,{111,37,0}}, +/* 15024 */ {(11<<2)|2,{111,37,0}}, +/* 15025 */ {(11<<2)|2,{111,37,0}}, +/* 15026 */ {(11<<2)|2,{111,37,0}}, +/* 15027 */ {(11<<2)|2,{111,37,0}}, +/* 15028 */ {(11<<2)|2,{111,37,0}}, +/* 15029 */ {(11<<2)|2,{111,37,0}}, +/* 15030 */ {(11<<2)|2,{111,37,0}}, +/* 15031 */ {(11<<2)|2,{111,37,0}}, +/* 15032 */ {(11<<2)|2,{111,37,0}}, +/* 15033 */ {(11<<2)|2,{111,37,0}}, +/* 15034 */ {(11<<2)|2,{111,37,0}}, +/* 15035 */ {(11<<2)|2,{111,37,0}}, +/* 15036 */ {(11<<2)|2,{111,37,0}}, +/* 15037 */ {(11<<2)|2,{111,37,0}}, +/* 15038 */ {(11<<2)|2,{111,37,0}}, +/* 15039 */ {(11<<2)|2,{111,37,0}}, +/* 15040 */ {(16<<2)|3,{111,45,48}}, +/* 15041 */ {(16<<2)|3,{111,45,49}}, +/* 15042 */ {(16<<2)|3,{111,45,50}}, +/* 15043 */ {(16<<2)|3,{111,45,97}}, +/* 15044 */ {(16<<2)|3,{111,45,99}}, +/* 15045 */ {(16<<2)|3,{111,45,101}}, +/* 15046 */ {(16<<2)|3,{111,45,105}}, +/* 15047 */ {(16<<2)|3,{111,45,111}}, +/* 15048 */ {(16<<2)|3,{111,45,115}}, +/* 15049 */ {(16<<2)|3,{111,45,116}}, +/* 15050 */ {(11<<2)|2,{111,45,0}}, +/* 15051 */ {(11<<2)|2,{111,45,0}}, +/* 15052 */ {(11<<2)|2,{111,45,0}}, +/* 15053 */ {(11<<2)|2,{111,45,0}}, +/* 15054 */ {(11<<2)|2,{111,45,0}}, +/* 15055 */ {(11<<2)|2,{111,45,0}}, +/* 15056 */ {(11<<2)|2,{111,45,0}}, +/* 15057 */ {(11<<2)|2,{111,45,0}}, +/* 15058 */ {(11<<2)|2,{111,45,0}}, +/* 15059 */ {(11<<2)|2,{111,45,0}}, +/* 15060 */ {(11<<2)|2,{111,45,0}}, +/* 15061 */ {(11<<2)|2,{111,45,0}}, +/* 15062 */ {(11<<2)|2,{111,45,0}}, +/* 15063 */ {(11<<2)|2,{111,45,0}}, +/* 15064 */ {(11<<2)|2,{111,45,0}}, +/* 15065 */ {(11<<2)|2,{111,45,0}}, +/* 15066 */ {(11<<2)|2,{111,45,0}}, +/* 15067 */ {(11<<2)|2,{111,45,0}}, +/* 15068 */ {(11<<2)|2,{111,45,0}}, +/* 15069 */ {(11<<2)|2,{111,45,0}}, +/* 15070 */ {(11<<2)|2,{111,45,0}}, +/* 15071 */ {(11<<2)|2,{111,45,0}}, +/* 15072 */ {(16<<2)|3,{111,46,48}}, +/* 15073 */ {(16<<2)|3,{111,46,49}}, +/* 15074 */ {(16<<2)|3,{111,46,50}}, +/* 15075 */ {(16<<2)|3,{111,46,97}}, +/* 15076 */ {(16<<2)|3,{111,46,99}}, +/* 15077 */ {(16<<2)|3,{111,46,101}}, +/* 15078 */ {(16<<2)|3,{111,46,105}}, +/* 15079 */ {(16<<2)|3,{111,46,111}}, +/* 15080 */ {(16<<2)|3,{111,46,115}}, +/* 15081 */ {(16<<2)|3,{111,46,116}}, +/* 15082 */ {(11<<2)|2,{111,46,0}}, +/* 15083 */ {(11<<2)|2,{111,46,0}}, +/* 15084 */ {(11<<2)|2,{111,46,0}}, +/* 15085 */ {(11<<2)|2,{111,46,0}}, +/* 15086 */ {(11<<2)|2,{111,46,0}}, +/* 15087 */ {(11<<2)|2,{111,46,0}}, +/* 15088 */ {(11<<2)|2,{111,46,0}}, +/* 15089 */ {(11<<2)|2,{111,46,0}}, +/* 15090 */ {(11<<2)|2,{111,46,0}}, +/* 15091 */ {(11<<2)|2,{111,46,0}}, +/* 15092 */ {(11<<2)|2,{111,46,0}}, +/* 15093 */ {(11<<2)|2,{111,46,0}}, +/* 15094 */ {(11<<2)|2,{111,46,0}}, +/* 15095 */ {(11<<2)|2,{111,46,0}}, +/* 15096 */ {(11<<2)|2,{111,46,0}}, +/* 15097 */ {(11<<2)|2,{111,46,0}}, +/* 15098 */ {(11<<2)|2,{111,46,0}}, +/* 15099 */ {(11<<2)|2,{111,46,0}}, +/* 15100 */ {(11<<2)|2,{111,46,0}}, +/* 15101 */ {(11<<2)|2,{111,46,0}}, +/* 15102 */ {(11<<2)|2,{111,46,0}}, +/* 15103 */ {(11<<2)|2,{111,46,0}}, +/* 15104 */ {(16<<2)|3,{111,47,48}}, +/* 15105 */ {(16<<2)|3,{111,47,49}}, +/* 15106 */ {(16<<2)|3,{111,47,50}}, +/* 15107 */ {(16<<2)|3,{111,47,97}}, +/* 15108 */ {(16<<2)|3,{111,47,99}}, +/* 15109 */ {(16<<2)|3,{111,47,101}}, +/* 15110 */ {(16<<2)|3,{111,47,105}}, +/* 15111 */ {(16<<2)|3,{111,47,111}}, +/* 15112 */ {(16<<2)|3,{111,47,115}}, +/* 15113 */ {(16<<2)|3,{111,47,116}}, +/* 15114 */ {(11<<2)|2,{111,47,0}}, +/* 15115 */ {(11<<2)|2,{111,47,0}}, +/* 15116 */ {(11<<2)|2,{111,47,0}}, +/* 15117 */ {(11<<2)|2,{111,47,0}}, +/* 15118 */ {(11<<2)|2,{111,47,0}}, +/* 15119 */ {(11<<2)|2,{111,47,0}}, +/* 15120 */ {(11<<2)|2,{111,47,0}}, +/* 15121 */ {(11<<2)|2,{111,47,0}}, +/* 15122 */ {(11<<2)|2,{111,47,0}}, +/* 15123 */ {(11<<2)|2,{111,47,0}}, +/* 15124 */ {(11<<2)|2,{111,47,0}}, +/* 15125 */ {(11<<2)|2,{111,47,0}}, +/* 15126 */ {(11<<2)|2,{111,47,0}}, +/* 15127 */ {(11<<2)|2,{111,47,0}}, +/* 15128 */ {(11<<2)|2,{111,47,0}}, +/* 15129 */ {(11<<2)|2,{111,47,0}}, +/* 15130 */ {(11<<2)|2,{111,47,0}}, +/* 15131 */ {(11<<2)|2,{111,47,0}}, +/* 15132 */ {(11<<2)|2,{111,47,0}}, +/* 15133 */ {(11<<2)|2,{111,47,0}}, +/* 15134 */ {(11<<2)|2,{111,47,0}}, +/* 15135 */ {(11<<2)|2,{111,47,0}}, +/* 15136 */ {(16<<2)|3,{111,51,48}}, +/* 15137 */ {(16<<2)|3,{111,51,49}}, +/* 15138 */ {(16<<2)|3,{111,51,50}}, +/* 15139 */ {(16<<2)|3,{111,51,97}}, +/* 15140 */ {(16<<2)|3,{111,51,99}}, +/* 15141 */ {(16<<2)|3,{111,51,101}}, +/* 15142 */ {(16<<2)|3,{111,51,105}}, +/* 15143 */ {(16<<2)|3,{111,51,111}}, +/* 15144 */ {(16<<2)|3,{111,51,115}}, +/* 15145 */ {(16<<2)|3,{111,51,116}}, +/* 15146 */ {(11<<2)|2,{111,51,0}}, +/* 15147 */ {(11<<2)|2,{111,51,0}}, +/* 15148 */ {(11<<2)|2,{111,51,0}}, +/* 15149 */ {(11<<2)|2,{111,51,0}}, +/* 15150 */ {(11<<2)|2,{111,51,0}}, +/* 15151 */ {(11<<2)|2,{111,51,0}}, +/* 15152 */ {(11<<2)|2,{111,51,0}}, +/* 15153 */ {(11<<2)|2,{111,51,0}}, +/* 15154 */ {(11<<2)|2,{111,51,0}}, +/* 15155 */ {(11<<2)|2,{111,51,0}}, +/* 15156 */ {(11<<2)|2,{111,51,0}}, +/* 15157 */ {(11<<2)|2,{111,51,0}}, +/* 15158 */ {(11<<2)|2,{111,51,0}}, +/* 15159 */ {(11<<2)|2,{111,51,0}}, +/* 15160 */ {(11<<2)|2,{111,51,0}}, +/* 15161 */ {(11<<2)|2,{111,51,0}}, +/* 15162 */ {(11<<2)|2,{111,51,0}}, +/* 15163 */ {(11<<2)|2,{111,51,0}}, +/* 15164 */ {(11<<2)|2,{111,51,0}}, +/* 15165 */ {(11<<2)|2,{111,51,0}}, +/* 15166 */ {(11<<2)|2,{111,51,0}}, +/* 15167 */ {(11<<2)|2,{111,51,0}}, +/* 15168 */ {(16<<2)|3,{111,52,48}}, +/* 15169 */ {(16<<2)|3,{111,52,49}}, +/* 15170 */ {(16<<2)|3,{111,52,50}}, +/* 15171 */ {(16<<2)|3,{111,52,97}}, +/* 15172 */ {(16<<2)|3,{111,52,99}}, +/* 15173 */ {(16<<2)|3,{111,52,101}}, +/* 15174 */ {(16<<2)|3,{111,52,105}}, +/* 15175 */ {(16<<2)|3,{111,52,111}}, +/* 15176 */ {(16<<2)|3,{111,52,115}}, +/* 15177 */ {(16<<2)|3,{111,52,116}}, +/* 15178 */ {(11<<2)|2,{111,52,0}}, +/* 15179 */ {(11<<2)|2,{111,52,0}}, +/* 15180 */ {(11<<2)|2,{111,52,0}}, +/* 15181 */ {(11<<2)|2,{111,52,0}}, +/* 15182 */ {(11<<2)|2,{111,52,0}}, +/* 15183 */ {(11<<2)|2,{111,52,0}}, +/* 15184 */ {(11<<2)|2,{111,52,0}}, +/* 15185 */ {(11<<2)|2,{111,52,0}}, +/* 15186 */ {(11<<2)|2,{111,52,0}}, +/* 15187 */ {(11<<2)|2,{111,52,0}}, +/* 15188 */ {(11<<2)|2,{111,52,0}}, +/* 15189 */ {(11<<2)|2,{111,52,0}}, +/* 15190 */ {(11<<2)|2,{111,52,0}}, +/* 15191 */ {(11<<2)|2,{111,52,0}}, +/* 15192 */ {(11<<2)|2,{111,52,0}}, +/* 15193 */ {(11<<2)|2,{111,52,0}}, +/* 15194 */ {(11<<2)|2,{111,52,0}}, +/* 15195 */ {(11<<2)|2,{111,52,0}}, +/* 15196 */ {(11<<2)|2,{111,52,0}}, +/* 15197 */ {(11<<2)|2,{111,52,0}}, +/* 15198 */ {(11<<2)|2,{111,52,0}}, +/* 15199 */ {(11<<2)|2,{111,52,0}}, +/* 15200 */ {(16<<2)|3,{111,53,48}}, +/* 15201 */ {(16<<2)|3,{111,53,49}}, +/* 15202 */ {(16<<2)|3,{111,53,50}}, +/* 15203 */ {(16<<2)|3,{111,53,97}}, +/* 15204 */ {(16<<2)|3,{111,53,99}}, +/* 15205 */ {(16<<2)|3,{111,53,101}}, +/* 15206 */ {(16<<2)|3,{111,53,105}}, +/* 15207 */ {(16<<2)|3,{111,53,111}}, +/* 15208 */ {(16<<2)|3,{111,53,115}}, +/* 15209 */ {(16<<2)|3,{111,53,116}}, +/* 15210 */ {(11<<2)|2,{111,53,0}}, +/* 15211 */ {(11<<2)|2,{111,53,0}}, +/* 15212 */ {(11<<2)|2,{111,53,0}}, +/* 15213 */ {(11<<2)|2,{111,53,0}}, +/* 15214 */ {(11<<2)|2,{111,53,0}}, +/* 15215 */ {(11<<2)|2,{111,53,0}}, +/* 15216 */ {(11<<2)|2,{111,53,0}}, +/* 15217 */ {(11<<2)|2,{111,53,0}}, +/* 15218 */ {(11<<2)|2,{111,53,0}}, +/* 15219 */ {(11<<2)|2,{111,53,0}}, +/* 15220 */ {(11<<2)|2,{111,53,0}}, +/* 15221 */ {(11<<2)|2,{111,53,0}}, +/* 15222 */ {(11<<2)|2,{111,53,0}}, +/* 15223 */ {(11<<2)|2,{111,53,0}}, +/* 15224 */ {(11<<2)|2,{111,53,0}}, +/* 15225 */ {(11<<2)|2,{111,53,0}}, +/* 15226 */ {(11<<2)|2,{111,53,0}}, +/* 15227 */ {(11<<2)|2,{111,53,0}}, +/* 15228 */ {(11<<2)|2,{111,53,0}}, +/* 15229 */ {(11<<2)|2,{111,53,0}}, +/* 15230 */ {(11<<2)|2,{111,53,0}}, +/* 15231 */ {(11<<2)|2,{111,53,0}}, +/* 15232 */ {(16<<2)|3,{111,54,48}}, +/* 15233 */ {(16<<2)|3,{111,54,49}}, +/* 15234 */ {(16<<2)|3,{111,54,50}}, +/* 15235 */ {(16<<2)|3,{111,54,97}}, +/* 15236 */ {(16<<2)|3,{111,54,99}}, +/* 15237 */ {(16<<2)|3,{111,54,101}}, +/* 15238 */ {(16<<2)|3,{111,54,105}}, +/* 15239 */ {(16<<2)|3,{111,54,111}}, +/* 15240 */ {(16<<2)|3,{111,54,115}}, +/* 15241 */ {(16<<2)|3,{111,54,116}}, +/* 15242 */ {(11<<2)|2,{111,54,0}}, +/* 15243 */ {(11<<2)|2,{111,54,0}}, +/* 15244 */ {(11<<2)|2,{111,54,0}}, +/* 15245 */ {(11<<2)|2,{111,54,0}}, +/* 15246 */ {(11<<2)|2,{111,54,0}}, +/* 15247 */ {(11<<2)|2,{111,54,0}}, +/* 15248 */ {(11<<2)|2,{111,54,0}}, +/* 15249 */ {(11<<2)|2,{111,54,0}}, +/* 15250 */ {(11<<2)|2,{111,54,0}}, +/* 15251 */ {(11<<2)|2,{111,54,0}}, +/* 15252 */ {(11<<2)|2,{111,54,0}}, +/* 15253 */ {(11<<2)|2,{111,54,0}}, +/* 15254 */ {(11<<2)|2,{111,54,0}}, +/* 15255 */ {(11<<2)|2,{111,54,0}}, +/* 15256 */ {(11<<2)|2,{111,54,0}}, +/* 15257 */ {(11<<2)|2,{111,54,0}}, +/* 15258 */ {(11<<2)|2,{111,54,0}}, +/* 15259 */ {(11<<2)|2,{111,54,0}}, +/* 15260 */ {(11<<2)|2,{111,54,0}}, +/* 15261 */ {(11<<2)|2,{111,54,0}}, +/* 15262 */ {(11<<2)|2,{111,54,0}}, +/* 15263 */ {(11<<2)|2,{111,54,0}}, +/* 15264 */ {(16<<2)|3,{111,55,48}}, +/* 15265 */ {(16<<2)|3,{111,55,49}}, +/* 15266 */ {(16<<2)|3,{111,55,50}}, +/* 15267 */ {(16<<2)|3,{111,55,97}}, +/* 15268 */ {(16<<2)|3,{111,55,99}}, +/* 15269 */ {(16<<2)|3,{111,55,101}}, +/* 15270 */ {(16<<2)|3,{111,55,105}}, +/* 15271 */ {(16<<2)|3,{111,55,111}}, +/* 15272 */ {(16<<2)|3,{111,55,115}}, +/* 15273 */ {(16<<2)|3,{111,55,116}}, +/* 15274 */ {(11<<2)|2,{111,55,0}}, +/* 15275 */ {(11<<2)|2,{111,55,0}}, +/* 15276 */ {(11<<2)|2,{111,55,0}}, +/* 15277 */ {(11<<2)|2,{111,55,0}}, +/* 15278 */ {(11<<2)|2,{111,55,0}}, +/* 15279 */ {(11<<2)|2,{111,55,0}}, +/* 15280 */ {(11<<2)|2,{111,55,0}}, +/* 15281 */ {(11<<2)|2,{111,55,0}}, +/* 15282 */ {(11<<2)|2,{111,55,0}}, +/* 15283 */ {(11<<2)|2,{111,55,0}}, +/* 15284 */ {(11<<2)|2,{111,55,0}}, +/* 15285 */ {(11<<2)|2,{111,55,0}}, +/* 15286 */ {(11<<2)|2,{111,55,0}}, +/* 15287 */ {(11<<2)|2,{111,55,0}}, +/* 15288 */ {(11<<2)|2,{111,55,0}}, +/* 15289 */ {(11<<2)|2,{111,55,0}}, +/* 15290 */ {(11<<2)|2,{111,55,0}}, +/* 15291 */ {(11<<2)|2,{111,55,0}}, +/* 15292 */ {(11<<2)|2,{111,55,0}}, +/* 15293 */ {(11<<2)|2,{111,55,0}}, +/* 15294 */ {(11<<2)|2,{111,55,0}}, +/* 15295 */ {(11<<2)|2,{111,55,0}}, +/* 15296 */ {(16<<2)|3,{111,56,48}}, +/* 15297 */ {(16<<2)|3,{111,56,49}}, +/* 15298 */ {(16<<2)|3,{111,56,50}}, +/* 15299 */ {(16<<2)|3,{111,56,97}}, +/* 15300 */ {(16<<2)|3,{111,56,99}}, +/* 15301 */ {(16<<2)|3,{111,56,101}}, +/* 15302 */ {(16<<2)|3,{111,56,105}}, +/* 15303 */ {(16<<2)|3,{111,56,111}}, +/* 15304 */ {(16<<2)|3,{111,56,115}}, +/* 15305 */ {(16<<2)|3,{111,56,116}}, +/* 15306 */ {(11<<2)|2,{111,56,0}}, +/* 15307 */ {(11<<2)|2,{111,56,0}}, +/* 15308 */ {(11<<2)|2,{111,56,0}}, +/* 15309 */ {(11<<2)|2,{111,56,0}}, +/* 15310 */ {(11<<2)|2,{111,56,0}}, +/* 15311 */ {(11<<2)|2,{111,56,0}}, +/* 15312 */ {(11<<2)|2,{111,56,0}}, +/* 15313 */ {(11<<2)|2,{111,56,0}}, +/* 15314 */ {(11<<2)|2,{111,56,0}}, +/* 15315 */ {(11<<2)|2,{111,56,0}}, +/* 15316 */ {(11<<2)|2,{111,56,0}}, +/* 15317 */ {(11<<2)|2,{111,56,0}}, +/* 15318 */ {(11<<2)|2,{111,56,0}}, +/* 15319 */ {(11<<2)|2,{111,56,0}}, +/* 15320 */ {(11<<2)|2,{111,56,0}}, +/* 15321 */ {(11<<2)|2,{111,56,0}}, +/* 15322 */ {(11<<2)|2,{111,56,0}}, +/* 15323 */ {(11<<2)|2,{111,56,0}}, +/* 15324 */ {(11<<2)|2,{111,56,0}}, +/* 15325 */ {(11<<2)|2,{111,56,0}}, +/* 15326 */ {(11<<2)|2,{111,56,0}}, +/* 15327 */ {(11<<2)|2,{111,56,0}}, +/* 15328 */ {(16<<2)|3,{111,57,48}}, +/* 15329 */ {(16<<2)|3,{111,57,49}}, +/* 15330 */ {(16<<2)|3,{111,57,50}}, +/* 15331 */ {(16<<2)|3,{111,57,97}}, +/* 15332 */ {(16<<2)|3,{111,57,99}}, +/* 15333 */ {(16<<2)|3,{111,57,101}}, +/* 15334 */ {(16<<2)|3,{111,57,105}}, +/* 15335 */ {(16<<2)|3,{111,57,111}}, +/* 15336 */ {(16<<2)|3,{111,57,115}}, +/* 15337 */ {(16<<2)|3,{111,57,116}}, +/* 15338 */ {(11<<2)|2,{111,57,0}}, +/* 15339 */ {(11<<2)|2,{111,57,0}}, +/* 15340 */ {(11<<2)|2,{111,57,0}}, +/* 15341 */ {(11<<2)|2,{111,57,0}}, +/* 15342 */ {(11<<2)|2,{111,57,0}}, +/* 15343 */ {(11<<2)|2,{111,57,0}}, +/* 15344 */ {(11<<2)|2,{111,57,0}}, +/* 15345 */ {(11<<2)|2,{111,57,0}}, +/* 15346 */ {(11<<2)|2,{111,57,0}}, +/* 15347 */ {(11<<2)|2,{111,57,0}}, +/* 15348 */ {(11<<2)|2,{111,57,0}}, +/* 15349 */ {(11<<2)|2,{111,57,0}}, +/* 15350 */ {(11<<2)|2,{111,57,0}}, +/* 15351 */ {(11<<2)|2,{111,57,0}}, +/* 15352 */ {(11<<2)|2,{111,57,0}}, +/* 15353 */ {(11<<2)|2,{111,57,0}}, +/* 15354 */ {(11<<2)|2,{111,57,0}}, +/* 15355 */ {(11<<2)|2,{111,57,0}}, +/* 15356 */ {(11<<2)|2,{111,57,0}}, +/* 15357 */ {(11<<2)|2,{111,57,0}}, +/* 15358 */ {(11<<2)|2,{111,57,0}}, +/* 15359 */ {(11<<2)|2,{111,57,0}}, +/* 15360 */ {(16<<2)|3,{111,61,48}}, +/* 15361 */ {(16<<2)|3,{111,61,49}}, +/* 15362 */ {(16<<2)|3,{111,61,50}}, +/* 15363 */ {(16<<2)|3,{111,61,97}}, +/* 15364 */ {(16<<2)|3,{111,61,99}}, +/* 15365 */ {(16<<2)|3,{111,61,101}}, +/* 15366 */ {(16<<2)|3,{111,61,105}}, +/* 15367 */ {(16<<2)|3,{111,61,111}}, +/* 15368 */ {(16<<2)|3,{111,61,115}}, +/* 15369 */ {(16<<2)|3,{111,61,116}}, +/* 15370 */ {(11<<2)|2,{111,61,0}}, +/* 15371 */ {(11<<2)|2,{111,61,0}}, +/* 15372 */ {(11<<2)|2,{111,61,0}}, +/* 15373 */ {(11<<2)|2,{111,61,0}}, +/* 15374 */ {(11<<2)|2,{111,61,0}}, +/* 15375 */ {(11<<2)|2,{111,61,0}}, +/* 15376 */ {(11<<2)|2,{111,61,0}}, +/* 15377 */ {(11<<2)|2,{111,61,0}}, +/* 15378 */ {(11<<2)|2,{111,61,0}}, +/* 15379 */ {(11<<2)|2,{111,61,0}}, +/* 15380 */ {(11<<2)|2,{111,61,0}}, +/* 15381 */ {(11<<2)|2,{111,61,0}}, +/* 15382 */ {(11<<2)|2,{111,61,0}}, +/* 15383 */ {(11<<2)|2,{111,61,0}}, +/* 15384 */ {(11<<2)|2,{111,61,0}}, +/* 15385 */ {(11<<2)|2,{111,61,0}}, +/* 15386 */ {(11<<2)|2,{111,61,0}}, +/* 15387 */ {(11<<2)|2,{111,61,0}}, +/* 15388 */ {(11<<2)|2,{111,61,0}}, +/* 15389 */ {(11<<2)|2,{111,61,0}}, +/* 15390 */ {(11<<2)|2,{111,61,0}}, +/* 15391 */ {(11<<2)|2,{111,61,0}}, +/* 15392 */ {(16<<2)|3,{111,65,48}}, +/* 15393 */ {(16<<2)|3,{111,65,49}}, +/* 15394 */ {(16<<2)|3,{111,65,50}}, +/* 15395 */ {(16<<2)|3,{111,65,97}}, +/* 15396 */ {(16<<2)|3,{111,65,99}}, +/* 15397 */ {(16<<2)|3,{111,65,101}}, +/* 15398 */ {(16<<2)|3,{111,65,105}}, +/* 15399 */ {(16<<2)|3,{111,65,111}}, +/* 15400 */ {(16<<2)|3,{111,65,115}}, +/* 15401 */ {(16<<2)|3,{111,65,116}}, +/* 15402 */ {(11<<2)|2,{111,65,0}}, +/* 15403 */ {(11<<2)|2,{111,65,0}}, +/* 15404 */ {(11<<2)|2,{111,65,0}}, +/* 15405 */ {(11<<2)|2,{111,65,0}}, +/* 15406 */ {(11<<2)|2,{111,65,0}}, +/* 15407 */ {(11<<2)|2,{111,65,0}}, +/* 15408 */ {(11<<2)|2,{111,65,0}}, +/* 15409 */ {(11<<2)|2,{111,65,0}}, +/* 15410 */ {(11<<2)|2,{111,65,0}}, +/* 15411 */ {(11<<2)|2,{111,65,0}}, +/* 15412 */ {(11<<2)|2,{111,65,0}}, +/* 15413 */ {(11<<2)|2,{111,65,0}}, +/* 15414 */ {(11<<2)|2,{111,65,0}}, +/* 15415 */ {(11<<2)|2,{111,65,0}}, +/* 15416 */ {(11<<2)|2,{111,65,0}}, +/* 15417 */ {(11<<2)|2,{111,65,0}}, +/* 15418 */ {(11<<2)|2,{111,65,0}}, +/* 15419 */ {(11<<2)|2,{111,65,0}}, +/* 15420 */ {(11<<2)|2,{111,65,0}}, +/* 15421 */ {(11<<2)|2,{111,65,0}}, +/* 15422 */ {(11<<2)|2,{111,65,0}}, +/* 15423 */ {(11<<2)|2,{111,65,0}}, +/* 15424 */ {(16<<2)|3,{111,95,48}}, +/* 15425 */ {(16<<2)|3,{111,95,49}}, +/* 15426 */ {(16<<2)|3,{111,95,50}}, +/* 15427 */ {(16<<2)|3,{111,95,97}}, +/* 15428 */ {(16<<2)|3,{111,95,99}}, +/* 15429 */ {(16<<2)|3,{111,95,101}}, +/* 15430 */ {(16<<2)|3,{111,95,105}}, +/* 15431 */ {(16<<2)|3,{111,95,111}}, +/* 15432 */ {(16<<2)|3,{111,95,115}}, +/* 15433 */ {(16<<2)|3,{111,95,116}}, +/* 15434 */ {(11<<2)|2,{111,95,0}}, +/* 15435 */ {(11<<2)|2,{111,95,0}}, +/* 15436 */ {(11<<2)|2,{111,95,0}}, +/* 15437 */ {(11<<2)|2,{111,95,0}}, +/* 15438 */ {(11<<2)|2,{111,95,0}}, +/* 15439 */ {(11<<2)|2,{111,95,0}}, +/* 15440 */ {(11<<2)|2,{111,95,0}}, +/* 15441 */ {(11<<2)|2,{111,95,0}}, +/* 15442 */ {(11<<2)|2,{111,95,0}}, +/* 15443 */ {(11<<2)|2,{111,95,0}}, +/* 15444 */ {(11<<2)|2,{111,95,0}}, +/* 15445 */ {(11<<2)|2,{111,95,0}}, +/* 15446 */ {(11<<2)|2,{111,95,0}}, +/* 15447 */ {(11<<2)|2,{111,95,0}}, +/* 15448 */ {(11<<2)|2,{111,95,0}}, +/* 15449 */ {(11<<2)|2,{111,95,0}}, +/* 15450 */ {(11<<2)|2,{111,95,0}}, +/* 15451 */ {(11<<2)|2,{111,95,0}}, +/* 15452 */ {(11<<2)|2,{111,95,0}}, +/* 15453 */ {(11<<2)|2,{111,95,0}}, +/* 15454 */ {(11<<2)|2,{111,95,0}}, +/* 15455 */ {(11<<2)|2,{111,95,0}}, +/* 15456 */ {(16<<2)|3,{111,98,48}}, +/* 15457 */ {(16<<2)|3,{111,98,49}}, +/* 15458 */ {(16<<2)|3,{111,98,50}}, +/* 15459 */ {(16<<2)|3,{111,98,97}}, +/* 15460 */ {(16<<2)|3,{111,98,99}}, +/* 15461 */ {(16<<2)|3,{111,98,101}}, +/* 15462 */ {(16<<2)|3,{111,98,105}}, +/* 15463 */ {(16<<2)|3,{111,98,111}}, +/* 15464 */ {(16<<2)|3,{111,98,115}}, +/* 15465 */ {(16<<2)|3,{111,98,116}}, +/* 15466 */ {(11<<2)|2,{111,98,0}}, +/* 15467 */ {(11<<2)|2,{111,98,0}}, +/* 15468 */ {(11<<2)|2,{111,98,0}}, +/* 15469 */ {(11<<2)|2,{111,98,0}}, +/* 15470 */ {(11<<2)|2,{111,98,0}}, +/* 15471 */ {(11<<2)|2,{111,98,0}}, +/* 15472 */ {(11<<2)|2,{111,98,0}}, +/* 15473 */ {(11<<2)|2,{111,98,0}}, +/* 15474 */ {(11<<2)|2,{111,98,0}}, +/* 15475 */ {(11<<2)|2,{111,98,0}}, +/* 15476 */ {(11<<2)|2,{111,98,0}}, +/* 15477 */ {(11<<2)|2,{111,98,0}}, +/* 15478 */ {(11<<2)|2,{111,98,0}}, +/* 15479 */ {(11<<2)|2,{111,98,0}}, +/* 15480 */ {(11<<2)|2,{111,98,0}}, +/* 15481 */ {(11<<2)|2,{111,98,0}}, +/* 15482 */ {(11<<2)|2,{111,98,0}}, +/* 15483 */ {(11<<2)|2,{111,98,0}}, +/* 15484 */ {(11<<2)|2,{111,98,0}}, +/* 15485 */ {(11<<2)|2,{111,98,0}}, +/* 15486 */ {(11<<2)|2,{111,98,0}}, +/* 15487 */ {(11<<2)|2,{111,98,0}}, +/* 15488 */ {(16<<2)|3,{111,100,48}}, +/* 15489 */ {(16<<2)|3,{111,100,49}}, +/* 15490 */ {(16<<2)|3,{111,100,50}}, +/* 15491 */ {(16<<2)|3,{111,100,97}}, +/* 15492 */ {(16<<2)|3,{111,100,99}}, +/* 15493 */ {(16<<2)|3,{111,100,101}}, +/* 15494 */ {(16<<2)|3,{111,100,105}}, +/* 15495 */ {(16<<2)|3,{111,100,111}}, +/* 15496 */ {(16<<2)|3,{111,100,115}}, +/* 15497 */ {(16<<2)|3,{111,100,116}}, +/* 15498 */ {(11<<2)|2,{111,100,0}}, +/* 15499 */ {(11<<2)|2,{111,100,0}}, +/* 15500 */ {(11<<2)|2,{111,100,0}}, +/* 15501 */ {(11<<2)|2,{111,100,0}}, +/* 15502 */ {(11<<2)|2,{111,100,0}}, +/* 15503 */ {(11<<2)|2,{111,100,0}}, +/* 15504 */ {(11<<2)|2,{111,100,0}}, +/* 15505 */ {(11<<2)|2,{111,100,0}}, +/* 15506 */ {(11<<2)|2,{111,100,0}}, +/* 15507 */ {(11<<2)|2,{111,100,0}}, +/* 15508 */ {(11<<2)|2,{111,100,0}}, +/* 15509 */ {(11<<2)|2,{111,100,0}}, +/* 15510 */ {(11<<2)|2,{111,100,0}}, +/* 15511 */ {(11<<2)|2,{111,100,0}}, +/* 15512 */ {(11<<2)|2,{111,100,0}}, +/* 15513 */ {(11<<2)|2,{111,100,0}}, +/* 15514 */ {(11<<2)|2,{111,100,0}}, +/* 15515 */ {(11<<2)|2,{111,100,0}}, +/* 15516 */ {(11<<2)|2,{111,100,0}}, +/* 15517 */ {(11<<2)|2,{111,100,0}}, +/* 15518 */ {(11<<2)|2,{111,100,0}}, +/* 15519 */ {(11<<2)|2,{111,100,0}}, +/* 15520 */ {(16<<2)|3,{111,102,48}}, +/* 15521 */ {(16<<2)|3,{111,102,49}}, +/* 15522 */ {(16<<2)|3,{111,102,50}}, +/* 15523 */ {(16<<2)|3,{111,102,97}}, +/* 15524 */ {(16<<2)|3,{111,102,99}}, +/* 15525 */ {(16<<2)|3,{111,102,101}}, +/* 15526 */ {(16<<2)|3,{111,102,105}}, +/* 15527 */ {(16<<2)|3,{111,102,111}}, +/* 15528 */ {(16<<2)|3,{111,102,115}}, +/* 15529 */ {(16<<2)|3,{111,102,116}}, +/* 15530 */ {(11<<2)|2,{111,102,0}}, +/* 15531 */ {(11<<2)|2,{111,102,0}}, +/* 15532 */ {(11<<2)|2,{111,102,0}}, +/* 15533 */ {(11<<2)|2,{111,102,0}}, +/* 15534 */ {(11<<2)|2,{111,102,0}}, +/* 15535 */ {(11<<2)|2,{111,102,0}}, +/* 15536 */ {(11<<2)|2,{111,102,0}}, +/* 15537 */ {(11<<2)|2,{111,102,0}}, +/* 15538 */ {(11<<2)|2,{111,102,0}}, +/* 15539 */ {(11<<2)|2,{111,102,0}}, +/* 15540 */ {(11<<2)|2,{111,102,0}}, +/* 15541 */ {(11<<2)|2,{111,102,0}}, +/* 15542 */ {(11<<2)|2,{111,102,0}}, +/* 15543 */ {(11<<2)|2,{111,102,0}}, +/* 15544 */ {(11<<2)|2,{111,102,0}}, +/* 15545 */ {(11<<2)|2,{111,102,0}}, +/* 15546 */ {(11<<2)|2,{111,102,0}}, +/* 15547 */ {(11<<2)|2,{111,102,0}}, +/* 15548 */ {(11<<2)|2,{111,102,0}}, +/* 15549 */ {(11<<2)|2,{111,102,0}}, +/* 15550 */ {(11<<2)|2,{111,102,0}}, +/* 15551 */ {(11<<2)|2,{111,102,0}}, +/* 15552 */ {(16<<2)|3,{111,103,48}}, +/* 15553 */ {(16<<2)|3,{111,103,49}}, +/* 15554 */ {(16<<2)|3,{111,103,50}}, +/* 15555 */ {(16<<2)|3,{111,103,97}}, +/* 15556 */ {(16<<2)|3,{111,103,99}}, +/* 15557 */ {(16<<2)|3,{111,103,101}}, +/* 15558 */ {(16<<2)|3,{111,103,105}}, +/* 15559 */ {(16<<2)|3,{111,103,111}}, +/* 15560 */ {(16<<2)|3,{111,103,115}}, +/* 15561 */ {(16<<2)|3,{111,103,116}}, +/* 15562 */ {(11<<2)|2,{111,103,0}}, +/* 15563 */ {(11<<2)|2,{111,103,0}}, +/* 15564 */ {(11<<2)|2,{111,103,0}}, +/* 15565 */ {(11<<2)|2,{111,103,0}}, +/* 15566 */ {(11<<2)|2,{111,103,0}}, +/* 15567 */ {(11<<2)|2,{111,103,0}}, +/* 15568 */ {(11<<2)|2,{111,103,0}}, +/* 15569 */ {(11<<2)|2,{111,103,0}}, +/* 15570 */ {(11<<2)|2,{111,103,0}}, +/* 15571 */ {(11<<2)|2,{111,103,0}}, +/* 15572 */ {(11<<2)|2,{111,103,0}}, +/* 15573 */ {(11<<2)|2,{111,103,0}}, +/* 15574 */ {(11<<2)|2,{111,103,0}}, +/* 15575 */ {(11<<2)|2,{111,103,0}}, +/* 15576 */ {(11<<2)|2,{111,103,0}}, +/* 15577 */ {(11<<2)|2,{111,103,0}}, +/* 15578 */ {(11<<2)|2,{111,103,0}}, +/* 15579 */ {(11<<2)|2,{111,103,0}}, +/* 15580 */ {(11<<2)|2,{111,103,0}}, +/* 15581 */ {(11<<2)|2,{111,103,0}}, +/* 15582 */ {(11<<2)|2,{111,103,0}}, +/* 15583 */ {(11<<2)|2,{111,103,0}}, +/* 15584 */ {(16<<2)|3,{111,104,48}}, +/* 15585 */ {(16<<2)|3,{111,104,49}}, +/* 15586 */ {(16<<2)|3,{111,104,50}}, +/* 15587 */ {(16<<2)|3,{111,104,97}}, +/* 15588 */ {(16<<2)|3,{111,104,99}}, +/* 15589 */ {(16<<2)|3,{111,104,101}}, +/* 15590 */ {(16<<2)|3,{111,104,105}}, +/* 15591 */ {(16<<2)|3,{111,104,111}}, +/* 15592 */ {(16<<2)|3,{111,104,115}}, +/* 15593 */ {(16<<2)|3,{111,104,116}}, +/* 15594 */ {(11<<2)|2,{111,104,0}}, +/* 15595 */ {(11<<2)|2,{111,104,0}}, +/* 15596 */ {(11<<2)|2,{111,104,0}}, +/* 15597 */ {(11<<2)|2,{111,104,0}}, +/* 15598 */ {(11<<2)|2,{111,104,0}}, +/* 15599 */ {(11<<2)|2,{111,104,0}}, +/* 15600 */ {(11<<2)|2,{111,104,0}}, +/* 15601 */ {(11<<2)|2,{111,104,0}}, +/* 15602 */ {(11<<2)|2,{111,104,0}}, +/* 15603 */ {(11<<2)|2,{111,104,0}}, +/* 15604 */ {(11<<2)|2,{111,104,0}}, +/* 15605 */ {(11<<2)|2,{111,104,0}}, +/* 15606 */ {(11<<2)|2,{111,104,0}}, +/* 15607 */ {(11<<2)|2,{111,104,0}}, +/* 15608 */ {(11<<2)|2,{111,104,0}}, +/* 15609 */ {(11<<2)|2,{111,104,0}}, +/* 15610 */ {(11<<2)|2,{111,104,0}}, +/* 15611 */ {(11<<2)|2,{111,104,0}}, +/* 15612 */ {(11<<2)|2,{111,104,0}}, +/* 15613 */ {(11<<2)|2,{111,104,0}}, +/* 15614 */ {(11<<2)|2,{111,104,0}}, +/* 15615 */ {(11<<2)|2,{111,104,0}}, +/* 15616 */ {(16<<2)|3,{111,108,48}}, +/* 15617 */ {(16<<2)|3,{111,108,49}}, +/* 15618 */ {(16<<2)|3,{111,108,50}}, +/* 15619 */ {(16<<2)|3,{111,108,97}}, +/* 15620 */ {(16<<2)|3,{111,108,99}}, +/* 15621 */ {(16<<2)|3,{111,108,101}}, +/* 15622 */ {(16<<2)|3,{111,108,105}}, +/* 15623 */ {(16<<2)|3,{111,108,111}}, +/* 15624 */ {(16<<2)|3,{111,108,115}}, +/* 15625 */ {(16<<2)|3,{111,108,116}}, +/* 15626 */ {(11<<2)|2,{111,108,0}}, +/* 15627 */ {(11<<2)|2,{111,108,0}}, +/* 15628 */ {(11<<2)|2,{111,108,0}}, +/* 15629 */ {(11<<2)|2,{111,108,0}}, +/* 15630 */ {(11<<2)|2,{111,108,0}}, +/* 15631 */ {(11<<2)|2,{111,108,0}}, +/* 15632 */ {(11<<2)|2,{111,108,0}}, +/* 15633 */ {(11<<2)|2,{111,108,0}}, +/* 15634 */ {(11<<2)|2,{111,108,0}}, +/* 15635 */ {(11<<2)|2,{111,108,0}}, +/* 15636 */ {(11<<2)|2,{111,108,0}}, +/* 15637 */ {(11<<2)|2,{111,108,0}}, +/* 15638 */ {(11<<2)|2,{111,108,0}}, +/* 15639 */ {(11<<2)|2,{111,108,0}}, +/* 15640 */ {(11<<2)|2,{111,108,0}}, +/* 15641 */ {(11<<2)|2,{111,108,0}}, +/* 15642 */ {(11<<2)|2,{111,108,0}}, +/* 15643 */ {(11<<2)|2,{111,108,0}}, +/* 15644 */ {(11<<2)|2,{111,108,0}}, +/* 15645 */ {(11<<2)|2,{111,108,0}}, +/* 15646 */ {(11<<2)|2,{111,108,0}}, +/* 15647 */ {(11<<2)|2,{111,108,0}}, +/* 15648 */ {(16<<2)|3,{111,109,48}}, +/* 15649 */ {(16<<2)|3,{111,109,49}}, +/* 15650 */ {(16<<2)|3,{111,109,50}}, +/* 15651 */ {(16<<2)|3,{111,109,97}}, +/* 15652 */ {(16<<2)|3,{111,109,99}}, +/* 15653 */ {(16<<2)|3,{111,109,101}}, +/* 15654 */ {(16<<2)|3,{111,109,105}}, +/* 15655 */ {(16<<2)|3,{111,109,111}}, +/* 15656 */ {(16<<2)|3,{111,109,115}}, +/* 15657 */ {(16<<2)|3,{111,109,116}}, +/* 15658 */ {(11<<2)|2,{111,109,0}}, +/* 15659 */ {(11<<2)|2,{111,109,0}}, +/* 15660 */ {(11<<2)|2,{111,109,0}}, +/* 15661 */ {(11<<2)|2,{111,109,0}}, +/* 15662 */ {(11<<2)|2,{111,109,0}}, +/* 15663 */ {(11<<2)|2,{111,109,0}}, +/* 15664 */ {(11<<2)|2,{111,109,0}}, +/* 15665 */ {(11<<2)|2,{111,109,0}}, +/* 15666 */ {(11<<2)|2,{111,109,0}}, +/* 15667 */ {(11<<2)|2,{111,109,0}}, +/* 15668 */ {(11<<2)|2,{111,109,0}}, +/* 15669 */ {(11<<2)|2,{111,109,0}}, +/* 15670 */ {(11<<2)|2,{111,109,0}}, +/* 15671 */ {(11<<2)|2,{111,109,0}}, +/* 15672 */ {(11<<2)|2,{111,109,0}}, +/* 15673 */ {(11<<2)|2,{111,109,0}}, +/* 15674 */ {(11<<2)|2,{111,109,0}}, +/* 15675 */ {(11<<2)|2,{111,109,0}}, +/* 15676 */ {(11<<2)|2,{111,109,0}}, +/* 15677 */ {(11<<2)|2,{111,109,0}}, +/* 15678 */ {(11<<2)|2,{111,109,0}}, +/* 15679 */ {(11<<2)|2,{111,109,0}}, +/* 15680 */ {(16<<2)|3,{111,110,48}}, +/* 15681 */ {(16<<2)|3,{111,110,49}}, +/* 15682 */ {(16<<2)|3,{111,110,50}}, +/* 15683 */ {(16<<2)|3,{111,110,97}}, +/* 15684 */ {(16<<2)|3,{111,110,99}}, +/* 15685 */ {(16<<2)|3,{111,110,101}}, +/* 15686 */ {(16<<2)|3,{111,110,105}}, +/* 15687 */ {(16<<2)|3,{111,110,111}}, +/* 15688 */ {(16<<2)|3,{111,110,115}}, +/* 15689 */ {(16<<2)|3,{111,110,116}}, +/* 15690 */ {(11<<2)|2,{111,110,0}}, +/* 15691 */ {(11<<2)|2,{111,110,0}}, +/* 15692 */ {(11<<2)|2,{111,110,0}}, +/* 15693 */ {(11<<2)|2,{111,110,0}}, +/* 15694 */ {(11<<2)|2,{111,110,0}}, +/* 15695 */ {(11<<2)|2,{111,110,0}}, +/* 15696 */ {(11<<2)|2,{111,110,0}}, +/* 15697 */ {(11<<2)|2,{111,110,0}}, +/* 15698 */ {(11<<2)|2,{111,110,0}}, +/* 15699 */ {(11<<2)|2,{111,110,0}}, +/* 15700 */ {(11<<2)|2,{111,110,0}}, +/* 15701 */ {(11<<2)|2,{111,110,0}}, +/* 15702 */ {(11<<2)|2,{111,110,0}}, +/* 15703 */ {(11<<2)|2,{111,110,0}}, +/* 15704 */ {(11<<2)|2,{111,110,0}}, +/* 15705 */ {(11<<2)|2,{111,110,0}}, +/* 15706 */ {(11<<2)|2,{111,110,0}}, +/* 15707 */ {(11<<2)|2,{111,110,0}}, +/* 15708 */ {(11<<2)|2,{111,110,0}}, +/* 15709 */ {(11<<2)|2,{111,110,0}}, +/* 15710 */ {(11<<2)|2,{111,110,0}}, +/* 15711 */ {(11<<2)|2,{111,110,0}}, +/* 15712 */ {(16<<2)|3,{111,112,48}}, +/* 15713 */ {(16<<2)|3,{111,112,49}}, +/* 15714 */ {(16<<2)|3,{111,112,50}}, +/* 15715 */ {(16<<2)|3,{111,112,97}}, +/* 15716 */ {(16<<2)|3,{111,112,99}}, +/* 15717 */ {(16<<2)|3,{111,112,101}}, +/* 15718 */ {(16<<2)|3,{111,112,105}}, +/* 15719 */ {(16<<2)|3,{111,112,111}}, +/* 15720 */ {(16<<2)|3,{111,112,115}}, +/* 15721 */ {(16<<2)|3,{111,112,116}}, +/* 15722 */ {(11<<2)|2,{111,112,0}}, +/* 15723 */ {(11<<2)|2,{111,112,0}}, +/* 15724 */ {(11<<2)|2,{111,112,0}}, +/* 15725 */ {(11<<2)|2,{111,112,0}}, +/* 15726 */ {(11<<2)|2,{111,112,0}}, +/* 15727 */ {(11<<2)|2,{111,112,0}}, +/* 15728 */ {(11<<2)|2,{111,112,0}}, +/* 15729 */ {(11<<2)|2,{111,112,0}}, +/* 15730 */ {(11<<2)|2,{111,112,0}}, +/* 15731 */ {(11<<2)|2,{111,112,0}}, +/* 15732 */ {(11<<2)|2,{111,112,0}}, +/* 15733 */ {(11<<2)|2,{111,112,0}}, +/* 15734 */ {(11<<2)|2,{111,112,0}}, +/* 15735 */ {(11<<2)|2,{111,112,0}}, +/* 15736 */ {(11<<2)|2,{111,112,0}}, +/* 15737 */ {(11<<2)|2,{111,112,0}}, +/* 15738 */ {(11<<2)|2,{111,112,0}}, +/* 15739 */ {(11<<2)|2,{111,112,0}}, +/* 15740 */ {(11<<2)|2,{111,112,0}}, +/* 15741 */ {(11<<2)|2,{111,112,0}}, +/* 15742 */ {(11<<2)|2,{111,112,0}}, +/* 15743 */ {(11<<2)|2,{111,112,0}}, +/* 15744 */ {(16<<2)|3,{111,114,48}}, +/* 15745 */ {(16<<2)|3,{111,114,49}}, +/* 15746 */ {(16<<2)|3,{111,114,50}}, +/* 15747 */ {(16<<2)|3,{111,114,97}}, +/* 15748 */ {(16<<2)|3,{111,114,99}}, +/* 15749 */ {(16<<2)|3,{111,114,101}}, +/* 15750 */ {(16<<2)|3,{111,114,105}}, +/* 15751 */ {(16<<2)|3,{111,114,111}}, +/* 15752 */ {(16<<2)|3,{111,114,115}}, +/* 15753 */ {(16<<2)|3,{111,114,116}}, +/* 15754 */ {(11<<2)|2,{111,114,0}}, +/* 15755 */ {(11<<2)|2,{111,114,0}}, +/* 15756 */ {(11<<2)|2,{111,114,0}}, +/* 15757 */ {(11<<2)|2,{111,114,0}}, +/* 15758 */ {(11<<2)|2,{111,114,0}}, +/* 15759 */ {(11<<2)|2,{111,114,0}}, +/* 15760 */ {(11<<2)|2,{111,114,0}}, +/* 15761 */ {(11<<2)|2,{111,114,0}}, +/* 15762 */ {(11<<2)|2,{111,114,0}}, +/* 15763 */ {(11<<2)|2,{111,114,0}}, +/* 15764 */ {(11<<2)|2,{111,114,0}}, +/* 15765 */ {(11<<2)|2,{111,114,0}}, +/* 15766 */ {(11<<2)|2,{111,114,0}}, +/* 15767 */ {(11<<2)|2,{111,114,0}}, +/* 15768 */ {(11<<2)|2,{111,114,0}}, +/* 15769 */ {(11<<2)|2,{111,114,0}}, +/* 15770 */ {(11<<2)|2,{111,114,0}}, +/* 15771 */ {(11<<2)|2,{111,114,0}}, +/* 15772 */ {(11<<2)|2,{111,114,0}}, +/* 15773 */ {(11<<2)|2,{111,114,0}}, +/* 15774 */ {(11<<2)|2,{111,114,0}}, +/* 15775 */ {(11<<2)|2,{111,114,0}}, +/* 15776 */ {(16<<2)|3,{111,117,48}}, +/* 15777 */ {(16<<2)|3,{111,117,49}}, +/* 15778 */ {(16<<2)|3,{111,117,50}}, +/* 15779 */ {(16<<2)|3,{111,117,97}}, +/* 15780 */ {(16<<2)|3,{111,117,99}}, +/* 15781 */ {(16<<2)|3,{111,117,101}}, +/* 15782 */ {(16<<2)|3,{111,117,105}}, +/* 15783 */ {(16<<2)|3,{111,117,111}}, +/* 15784 */ {(16<<2)|3,{111,117,115}}, +/* 15785 */ {(16<<2)|3,{111,117,116}}, +/* 15786 */ {(11<<2)|2,{111,117,0}}, +/* 15787 */ {(11<<2)|2,{111,117,0}}, +/* 15788 */ {(11<<2)|2,{111,117,0}}, +/* 15789 */ {(11<<2)|2,{111,117,0}}, +/* 15790 */ {(11<<2)|2,{111,117,0}}, +/* 15791 */ {(11<<2)|2,{111,117,0}}, +/* 15792 */ {(11<<2)|2,{111,117,0}}, +/* 15793 */ {(11<<2)|2,{111,117,0}}, +/* 15794 */ {(11<<2)|2,{111,117,0}}, +/* 15795 */ {(11<<2)|2,{111,117,0}}, +/* 15796 */ {(11<<2)|2,{111,117,0}}, +/* 15797 */ {(11<<2)|2,{111,117,0}}, +/* 15798 */ {(11<<2)|2,{111,117,0}}, +/* 15799 */ {(11<<2)|2,{111,117,0}}, +/* 15800 */ {(11<<2)|2,{111,117,0}}, +/* 15801 */ {(11<<2)|2,{111,117,0}}, +/* 15802 */ {(11<<2)|2,{111,117,0}}, +/* 15803 */ {(11<<2)|2,{111,117,0}}, +/* 15804 */ {(11<<2)|2,{111,117,0}}, +/* 15805 */ {(11<<2)|2,{111,117,0}}, +/* 15806 */ {(11<<2)|2,{111,117,0}}, +/* 15807 */ {(11<<2)|2,{111,117,0}}, +/* 15808 */ {(12<<2)|2,{111,58,0}}, +/* 15809 */ {(12<<2)|2,{111,58,0}}, +/* 15810 */ {(12<<2)|2,{111,58,0}}, +/* 15811 */ {(12<<2)|2,{111,58,0}}, +/* 15812 */ {(12<<2)|2,{111,58,0}}, +/* 15813 */ {(12<<2)|2,{111,58,0}}, +/* 15814 */ {(12<<2)|2,{111,58,0}}, +/* 15815 */ {(12<<2)|2,{111,58,0}}, +/* 15816 */ {(12<<2)|2,{111,58,0}}, +/* 15817 */ {(12<<2)|2,{111,58,0}}, +/* 15818 */ {(12<<2)|2,{111,58,0}}, +/* 15819 */ {(12<<2)|2,{111,58,0}}, +/* 15820 */ {(12<<2)|2,{111,58,0}}, +/* 15821 */ {(12<<2)|2,{111,58,0}}, +/* 15822 */ {(12<<2)|2,{111,58,0}}, +/* 15823 */ {(12<<2)|2,{111,58,0}}, +/* 15824 */ {(12<<2)|2,{111,66,0}}, +/* 15825 */ {(12<<2)|2,{111,66,0}}, +/* 15826 */ {(12<<2)|2,{111,66,0}}, +/* 15827 */ {(12<<2)|2,{111,66,0}}, +/* 15828 */ {(12<<2)|2,{111,66,0}}, +/* 15829 */ {(12<<2)|2,{111,66,0}}, +/* 15830 */ {(12<<2)|2,{111,66,0}}, +/* 15831 */ {(12<<2)|2,{111,66,0}}, +/* 15832 */ {(12<<2)|2,{111,66,0}}, +/* 15833 */ {(12<<2)|2,{111,66,0}}, +/* 15834 */ {(12<<2)|2,{111,66,0}}, +/* 15835 */ {(12<<2)|2,{111,66,0}}, +/* 15836 */ {(12<<2)|2,{111,66,0}}, +/* 15837 */ {(12<<2)|2,{111,66,0}}, +/* 15838 */ {(12<<2)|2,{111,66,0}}, +/* 15839 */ {(12<<2)|2,{111,66,0}}, +/* 15840 */ {(12<<2)|2,{111,67,0}}, +/* 15841 */ {(12<<2)|2,{111,67,0}}, +/* 15842 */ {(12<<2)|2,{111,67,0}}, +/* 15843 */ {(12<<2)|2,{111,67,0}}, +/* 15844 */ {(12<<2)|2,{111,67,0}}, +/* 15845 */ {(12<<2)|2,{111,67,0}}, +/* 15846 */ {(12<<2)|2,{111,67,0}}, +/* 15847 */ {(12<<2)|2,{111,67,0}}, +/* 15848 */ {(12<<2)|2,{111,67,0}}, +/* 15849 */ {(12<<2)|2,{111,67,0}}, +/* 15850 */ {(12<<2)|2,{111,67,0}}, +/* 15851 */ {(12<<2)|2,{111,67,0}}, +/* 15852 */ {(12<<2)|2,{111,67,0}}, +/* 15853 */ {(12<<2)|2,{111,67,0}}, +/* 15854 */ {(12<<2)|2,{111,67,0}}, +/* 15855 */ {(12<<2)|2,{111,67,0}}, +/* 15856 */ {(12<<2)|2,{111,68,0}}, +/* 15857 */ {(12<<2)|2,{111,68,0}}, +/* 15858 */ {(12<<2)|2,{111,68,0}}, +/* 15859 */ {(12<<2)|2,{111,68,0}}, +/* 15860 */ {(12<<2)|2,{111,68,0}}, +/* 15861 */ {(12<<2)|2,{111,68,0}}, +/* 15862 */ {(12<<2)|2,{111,68,0}}, +/* 15863 */ {(12<<2)|2,{111,68,0}}, +/* 15864 */ {(12<<2)|2,{111,68,0}}, +/* 15865 */ {(12<<2)|2,{111,68,0}}, +/* 15866 */ {(12<<2)|2,{111,68,0}}, +/* 15867 */ {(12<<2)|2,{111,68,0}}, +/* 15868 */ {(12<<2)|2,{111,68,0}}, +/* 15869 */ {(12<<2)|2,{111,68,0}}, +/* 15870 */ {(12<<2)|2,{111,68,0}}, +/* 15871 */ {(12<<2)|2,{111,68,0}}, +/* 15872 */ {(12<<2)|2,{111,69,0}}, +/* 15873 */ {(12<<2)|2,{111,69,0}}, +/* 15874 */ {(12<<2)|2,{111,69,0}}, +/* 15875 */ {(12<<2)|2,{111,69,0}}, +/* 15876 */ {(12<<2)|2,{111,69,0}}, +/* 15877 */ {(12<<2)|2,{111,69,0}}, +/* 15878 */ {(12<<2)|2,{111,69,0}}, +/* 15879 */ {(12<<2)|2,{111,69,0}}, +/* 15880 */ {(12<<2)|2,{111,69,0}}, +/* 15881 */ {(12<<2)|2,{111,69,0}}, +/* 15882 */ {(12<<2)|2,{111,69,0}}, +/* 15883 */ {(12<<2)|2,{111,69,0}}, +/* 15884 */ {(12<<2)|2,{111,69,0}}, +/* 15885 */ {(12<<2)|2,{111,69,0}}, +/* 15886 */ {(12<<2)|2,{111,69,0}}, +/* 15887 */ {(12<<2)|2,{111,69,0}}, +/* 15888 */ {(12<<2)|2,{111,70,0}}, +/* 15889 */ {(12<<2)|2,{111,70,0}}, +/* 15890 */ {(12<<2)|2,{111,70,0}}, +/* 15891 */ {(12<<2)|2,{111,70,0}}, +/* 15892 */ {(12<<2)|2,{111,70,0}}, +/* 15893 */ {(12<<2)|2,{111,70,0}}, +/* 15894 */ {(12<<2)|2,{111,70,0}}, +/* 15895 */ {(12<<2)|2,{111,70,0}}, +/* 15896 */ {(12<<2)|2,{111,70,0}}, +/* 15897 */ {(12<<2)|2,{111,70,0}}, +/* 15898 */ {(12<<2)|2,{111,70,0}}, +/* 15899 */ {(12<<2)|2,{111,70,0}}, +/* 15900 */ {(12<<2)|2,{111,70,0}}, +/* 15901 */ {(12<<2)|2,{111,70,0}}, +/* 15902 */ {(12<<2)|2,{111,70,0}}, +/* 15903 */ {(12<<2)|2,{111,70,0}}, +/* 15904 */ {(12<<2)|2,{111,71,0}}, +/* 15905 */ {(12<<2)|2,{111,71,0}}, +/* 15906 */ {(12<<2)|2,{111,71,0}}, +/* 15907 */ {(12<<2)|2,{111,71,0}}, +/* 15908 */ {(12<<2)|2,{111,71,0}}, +/* 15909 */ {(12<<2)|2,{111,71,0}}, +/* 15910 */ {(12<<2)|2,{111,71,0}}, +/* 15911 */ {(12<<2)|2,{111,71,0}}, +/* 15912 */ {(12<<2)|2,{111,71,0}}, +/* 15913 */ {(12<<2)|2,{111,71,0}}, +/* 15914 */ {(12<<2)|2,{111,71,0}}, +/* 15915 */ {(12<<2)|2,{111,71,0}}, +/* 15916 */ {(12<<2)|2,{111,71,0}}, +/* 15917 */ {(12<<2)|2,{111,71,0}}, +/* 15918 */ {(12<<2)|2,{111,71,0}}, +/* 15919 */ {(12<<2)|2,{111,71,0}}, +/* 15920 */ {(12<<2)|2,{111,72,0}}, +/* 15921 */ {(12<<2)|2,{111,72,0}}, +/* 15922 */ {(12<<2)|2,{111,72,0}}, +/* 15923 */ {(12<<2)|2,{111,72,0}}, +/* 15924 */ {(12<<2)|2,{111,72,0}}, +/* 15925 */ {(12<<2)|2,{111,72,0}}, +/* 15926 */ {(12<<2)|2,{111,72,0}}, +/* 15927 */ {(12<<2)|2,{111,72,0}}, +/* 15928 */ {(12<<2)|2,{111,72,0}}, +/* 15929 */ {(12<<2)|2,{111,72,0}}, +/* 15930 */ {(12<<2)|2,{111,72,0}}, +/* 15931 */ {(12<<2)|2,{111,72,0}}, +/* 15932 */ {(12<<2)|2,{111,72,0}}, +/* 15933 */ {(12<<2)|2,{111,72,0}}, +/* 15934 */ {(12<<2)|2,{111,72,0}}, +/* 15935 */ {(12<<2)|2,{111,72,0}}, +/* 15936 */ {(12<<2)|2,{111,73,0}}, +/* 15937 */ {(12<<2)|2,{111,73,0}}, +/* 15938 */ {(12<<2)|2,{111,73,0}}, +/* 15939 */ {(12<<2)|2,{111,73,0}}, +/* 15940 */ {(12<<2)|2,{111,73,0}}, +/* 15941 */ {(12<<2)|2,{111,73,0}}, +/* 15942 */ {(12<<2)|2,{111,73,0}}, +/* 15943 */ {(12<<2)|2,{111,73,0}}, +/* 15944 */ {(12<<2)|2,{111,73,0}}, +/* 15945 */ {(12<<2)|2,{111,73,0}}, +/* 15946 */ {(12<<2)|2,{111,73,0}}, +/* 15947 */ {(12<<2)|2,{111,73,0}}, +/* 15948 */ {(12<<2)|2,{111,73,0}}, +/* 15949 */ {(12<<2)|2,{111,73,0}}, +/* 15950 */ {(12<<2)|2,{111,73,0}}, +/* 15951 */ {(12<<2)|2,{111,73,0}}, +/* 15952 */ {(12<<2)|2,{111,74,0}}, +/* 15953 */ {(12<<2)|2,{111,74,0}}, +/* 15954 */ {(12<<2)|2,{111,74,0}}, +/* 15955 */ {(12<<2)|2,{111,74,0}}, +/* 15956 */ {(12<<2)|2,{111,74,0}}, +/* 15957 */ {(12<<2)|2,{111,74,0}}, +/* 15958 */ {(12<<2)|2,{111,74,0}}, +/* 15959 */ {(12<<2)|2,{111,74,0}}, +/* 15960 */ {(12<<2)|2,{111,74,0}}, +/* 15961 */ {(12<<2)|2,{111,74,0}}, +/* 15962 */ {(12<<2)|2,{111,74,0}}, +/* 15963 */ {(12<<2)|2,{111,74,0}}, +/* 15964 */ {(12<<2)|2,{111,74,0}}, +/* 15965 */ {(12<<2)|2,{111,74,0}}, +/* 15966 */ {(12<<2)|2,{111,74,0}}, +/* 15967 */ {(12<<2)|2,{111,74,0}}, +/* 15968 */ {(12<<2)|2,{111,75,0}}, +/* 15969 */ {(12<<2)|2,{111,75,0}}, +/* 15970 */ {(12<<2)|2,{111,75,0}}, +/* 15971 */ {(12<<2)|2,{111,75,0}}, +/* 15972 */ {(12<<2)|2,{111,75,0}}, +/* 15973 */ {(12<<2)|2,{111,75,0}}, +/* 15974 */ {(12<<2)|2,{111,75,0}}, +/* 15975 */ {(12<<2)|2,{111,75,0}}, +/* 15976 */ {(12<<2)|2,{111,75,0}}, +/* 15977 */ {(12<<2)|2,{111,75,0}}, +/* 15978 */ {(12<<2)|2,{111,75,0}}, +/* 15979 */ {(12<<2)|2,{111,75,0}}, +/* 15980 */ {(12<<2)|2,{111,75,0}}, +/* 15981 */ {(12<<2)|2,{111,75,0}}, +/* 15982 */ {(12<<2)|2,{111,75,0}}, +/* 15983 */ {(12<<2)|2,{111,75,0}}, +/* 15984 */ {(12<<2)|2,{111,76,0}}, +/* 15985 */ {(12<<2)|2,{111,76,0}}, +/* 15986 */ {(12<<2)|2,{111,76,0}}, +/* 15987 */ {(12<<2)|2,{111,76,0}}, +/* 15988 */ {(12<<2)|2,{111,76,0}}, +/* 15989 */ {(12<<2)|2,{111,76,0}}, +/* 15990 */ {(12<<2)|2,{111,76,0}}, +/* 15991 */ {(12<<2)|2,{111,76,0}}, +/* 15992 */ {(12<<2)|2,{111,76,0}}, +/* 15993 */ {(12<<2)|2,{111,76,0}}, +/* 15994 */ {(12<<2)|2,{111,76,0}}, +/* 15995 */ {(12<<2)|2,{111,76,0}}, +/* 15996 */ {(12<<2)|2,{111,76,0}}, +/* 15997 */ {(12<<2)|2,{111,76,0}}, +/* 15998 */ {(12<<2)|2,{111,76,0}}, +/* 15999 */ {(12<<2)|2,{111,76,0}}, +/* 16000 */ {(12<<2)|2,{111,77,0}}, +/* 16001 */ {(12<<2)|2,{111,77,0}}, +/* 16002 */ {(12<<2)|2,{111,77,0}}, +/* 16003 */ {(12<<2)|2,{111,77,0}}, +/* 16004 */ {(12<<2)|2,{111,77,0}}, +/* 16005 */ {(12<<2)|2,{111,77,0}}, +/* 16006 */ {(12<<2)|2,{111,77,0}}, +/* 16007 */ {(12<<2)|2,{111,77,0}}, +/* 16008 */ {(12<<2)|2,{111,77,0}}, +/* 16009 */ {(12<<2)|2,{111,77,0}}, +/* 16010 */ {(12<<2)|2,{111,77,0}}, +/* 16011 */ {(12<<2)|2,{111,77,0}}, +/* 16012 */ {(12<<2)|2,{111,77,0}}, +/* 16013 */ {(12<<2)|2,{111,77,0}}, +/* 16014 */ {(12<<2)|2,{111,77,0}}, +/* 16015 */ {(12<<2)|2,{111,77,0}}, +/* 16016 */ {(12<<2)|2,{111,78,0}}, +/* 16017 */ {(12<<2)|2,{111,78,0}}, +/* 16018 */ {(12<<2)|2,{111,78,0}}, +/* 16019 */ {(12<<2)|2,{111,78,0}}, +/* 16020 */ {(12<<2)|2,{111,78,0}}, +/* 16021 */ {(12<<2)|2,{111,78,0}}, +/* 16022 */ {(12<<2)|2,{111,78,0}}, +/* 16023 */ {(12<<2)|2,{111,78,0}}, +/* 16024 */ {(12<<2)|2,{111,78,0}}, +/* 16025 */ {(12<<2)|2,{111,78,0}}, +/* 16026 */ {(12<<2)|2,{111,78,0}}, +/* 16027 */ {(12<<2)|2,{111,78,0}}, +/* 16028 */ {(12<<2)|2,{111,78,0}}, +/* 16029 */ {(12<<2)|2,{111,78,0}}, +/* 16030 */ {(12<<2)|2,{111,78,0}}, +/* 16031 */ {(12<<2)|2,{111,78,0}}, +/* 16032 */ {(12<<2)|2,{111,79,0}}, +/* 16033 */ {(12<<2)|2,{111,79,0}}, +/* 16034 */ {(12<<2)|2,{111,79,0}}, +/* 16035 */ {(12<<2)|2,{111,79,0}}, +/* 16036 */ {(12<<2)|2,{111,79,0}}, +/* 16037 */ {(12<<2)|2,{111,79,0}}, +/* 16038 */ {(12<<2)|2,{111,79,0}}, +/* 16039 */ {(12<<2)|2,{111,79,0}}, +/* 16040 */ {(12<<2)|2,{111,79,0}}, +/* 16041 */ {(12<<2)|2,{111,79,0}}, +/* 16042 */ {(12<<2)|2,{111,79,0}}, +/* 16043 */ {(12<<2)|2,{111,79,0}}, +/* 16044 */ {(12<<2)|2,{111,79,0}}, +/* 16045 */ {(12<<2)|2,{111,79,0}}, +/* 16046 */ {(12<<2)|2,{111,79,0}}, +/* 16047 */ {(12<<2)|2,{111,79,0}}, +/* 16048 */ {(12<<2)|2,{111,80,0}}, +/* 16049 */ {(12<<2)|2,{111,80,0}}, +/* 16050 */ {(12<<2)|2,{111,80,0}}, +/* 16051 */ {(12<<2)|2,{111,80,0}}, +/* 16052 */ {(12<<2)|2,{111,80,0}}, +/* 16053 */ {(12<<2)|2,{111,80,0}}, +/* 16054 */ {(12<<2)|2,{111,80,0}}, +/* 16055 */ {(12<<2)|2,{111,80,0}}, +/* 16056 */ {(12<<2)|2,{111,80,0}}, +/* 16057 */ {(12<<2)|2,{111,80,0}}, +/* 16058 */ {(12<<2)|2,{111,80,0}}, +/* 16059 */ {(12<<2)|2,{111,80,0}}, +/* 16060 */ {(12<<2)|2,{111,80,0}}, +/* 16061 */ {(12<<2)|2,{111,80,0}}, +/* 16062 */ {(12<<2)|2,{111,80,0}}, +/* 16063 */ {(12<<2)|2,{111,80,0}}, +/* 16064 */ {(12<<2)|2,{111,81,0}}, +/* 16065 */ {(12<<2)|2,{111,81,0}}, +/* 16066 */ {(12<<2)|2,{111,81,0}}, +/* 16067 */ {(12<<2)|2,{111,81,0}}, +/* 16068 */ {(12<<2)|2,{111,81,0}}, +/* 16069 */ {(12<<2)|2,{111,81,0}}, +/* 16070 */ {(12<<2)|2,{111,81,0}}, +/* 16071 */ {(12<<2)|2,{111,81,0}}, +/* 16072 */ {(12<<2)|2,{111,81,0}}, +/* 16073 */ {(12<<2)|2,{111,81,0}}, +/* 16074 */ {(12<<2)|2,{111,81,0}}, +/* 16075 */ {(12<<2)|2,{111,81,0}}, +/* 16076 */ {(12<<2)|2,{111,81,0}}, +/* 16077 */ {(12<<2)|2,{111,81,0}}, +/* 16078 */ {(12<<2)|2,{111,81,0}}, +/* 16079 */ {(12<<2)|2,{111,81,0}}, +/* 16080 */ {(12<<2)|2,{111,82,0}}, +/* 16081 */ {(12<<2)|2,{111,82,0}}, +/* 16082 */ {(12<<2)|2,{111,82,0}}, +/* 16083 */ {(12<<2)|2,{111,82,0}}, +/* 16084 */ {(12<<2)|2,{111,82,0}}, +/* 16085 */ {(12<<2)|2,{111,82,0}}, +/* 16086 */ {(12<<2)|2,{111,82,0}}, +/* 16087 */ {(12<<2)|2,{111,82,0}}, +/* 16088 */ {(12<<2)|2,{111,82,0}}, +/* 16089 */ {(12<<2)|2,{111,82,0}}, +/* 16090 */ {(12<<2)|2,{111,82,0}}, +/* 16091 */ {(12<<2)|2,{111,82,0}}, +/* 16092 */ {(12<<2)|2,{111,82,0}}, +/* 16093 */ {(12<<2)|2,{111,82,0}}, +/* 16094 */ {(12<<2)|2,{111,82,0}}, +/* 16095 */ {(12<<2)|2,{111,82,0}}, +/* 16096 */ {(12<<2)|2,{111,83,0}}, +/* 16097 */ {(12<<2)|2,{111,83,0}}, +/* 16098 */ {(12<<2)|2,{111,83,0}}, +/* 16099 */ {(12<<2)|2,{111,83,0}}, +/* 16100 */ {(12<<2)|2,{111,83,0}}, +/* 16101 */ {(12<<2)|2,{111,83,0}}, +/* 16102 */ {(12<<2)|2,{111,83,0}}, +/* 16103 */ {(12<<2)|2,{111,83,0}}, +/* 16104 */ {(12<<2)|2,{111,83,0}}, +/* 16105 */ {(12<<2)|2,{111,83,0}}, +/* 16106 */ {(12<<2)|2,{111,83,0}}, +/* 16107 */ {(12<<2)|2,{111,83,0}}, +/* 16108 */ {(12<<2)|2,{111,83,0}}, +/* 16109 */ {(12<<2)|2,{111,83,0}}, +/* 16110 */ {(12<<2)|2,{111,83,0}}, +/* 16111 */ {(12<<2)|2,{111,83,0}}, +/* 16112 */ {(12<<2)|2,{111,84,0}}, +/* 16113 */ {(12<<2)|2,{111,84,0}}, +/* 16114 */ {(12<<2)|2,{111,84,0}}, +/* 16115 */ {(12<<2)|2,{111,84,0}}, +/* 16116 */ {(12<<2)|2,{111,84,0}}, +/* 16117 */ {(12<<2)|2,{111,84,0}}, +/* 16118 */ {(12<<2)|2,{111,84,0}}, +/* 16119 */ {(12<<2)|2,{111,84,0}}, +/* 16120 */ {(12<<2)|2,{111,84,0}}, +/* 16121 */ {(12<<2)|2,{111,84,0}}, +/* 16122 */ {(12<<2)|2,{111,84,0}}, +/* 16123 */ {(12<<2)|2,{111,84,0}}, +/* 16124 */ {(12<<2)|2,{111,84,0}}, +/* 16125 */ {(12<<2)|2,{111,84,0}}, +/* 16126 */ {(12<<2)|2,{111,84,0}}, +/* 16127 */ {(12<<2)|2,{111,84,0}}, +/* 16128 */ {(12<<2)|2,{111,85,0}}, +/* 16129 */ {(12<<2)|2,{111,85,0}}, +/* 16130 */ {(12<<2)|2,{111,85,0}}, +/* 16131 */ {(12<<2)|2,{111,85,0}}, +/* 16132 */ {(12<<2)|2,{111,85,0}}, +/* 16133 */ {(12<<2)|2,{111,85,0}}, +/* 16134 */ {(12<<2)|2,{111,85,0}}, +/* 16135 */ {(12<<2)|2,{111,85,0}}, +/* 16136 */ {(12<<2)|2,{111,85,0}}, +/* 16137 */ {(12<<2)|2,{111,85,0}}, +/* 16138 */ {(12<<2)|2,{111,85,0}}, +/* 16139 */ {(12<<2)|2,{111,85,0}}, +/* 16140 */ {(12<<2)|2,{111,85,0}}, +/* 16141 */ {(12<<2)|2,{111,85,0}}, +/* 16142 */ {(12<<2)|2,{111,85,0}}, +/* 16143 */ {(12<<2)|2,{111,85,0}}, +/* 16144 */ {(12<<2)|2,{111,86,0}}, +/* 16145 */ {(12<<2)|2,{111,86,0}}, +/* 16146 */ {(12<<2)|2,{111,86,0}}, +/* 16147 */ {(12<<2)|2,{111,86,0}}, +/* 16148 */ {(12<<2)|2,{111,86,0}}, +/* 16149 */ {(12<<2)|2,{111,86,0}}, +/* 16150 */ {(12<<2)|2,{111,86,0}}, +/* 16151 */ {(12<<2)|2,{111,86,0}}, +/* 16152 */ {(12<<2)|2,{111,86,0}}, +/* 16153 */ {(12<<2)|2,{111,86,0}}, +/* 16154 */ {(12<<2)|2,{111,86,0}}, +/* 16155 */ {(12<<2)|2,{111,86,0}}, +/* 16156 */ {(12<<2)|2,{111,86,0}}, +/* 16157 */ {(12<<2)|2,{111,86,0}}, +/* 16158 */ {(12<<2)|2,{111,86,0}}, +/* 16159 */ {(12<<2)|2,{111,86,0}}, +/* 16160 */ {(12<<2)|2,{111,87,0}}, +/* 16161 */ {(12<<2)|2,{111,87,0}}, +/* 16162 */ {(12<<2)|2,{111,87,0}}, +/* 16163 */ {(12<<2)|2,{111,87,0}}, +/* 16164 */ {(12<<2)|2,{111,87,0}}, +/* 16165 */ {(12<<2)|2,{111,87,0}}, +/* 16166 */ {(12<<2)|2,{111,87,0}}, +/* 16167 */ {(12<<2)|2,{111,87,0}}, +/* 16168 */ {(12<<2)|2,{111,87,0}}, +/* 16169 */ {(12<<2)|2,{111,87,0}}, +/* 16170 */ {(12<<2)|2,{111,87,0}}, +/* 16171 */ {(12<<2)|2,{111,87,0}}, +/* 16172 */ {(12<<2)|2,{111,87,0}}, +/* 16173 */ {(12<<2)|2,{111,87,0}}, +/* 16174 */ {(12<<2)|2,{111,87,0}}, +/* 16175 */ {(12<<2)|2,{111,87,0}}, +/* 16176 */ {(12<<2)|2,{111,89,0}}, +/* 16177 */ {(12<<2)|2,{111,89,0}}, +/* 16178 */ {(12<<2)|2,{111,89,0}}, +/* 16179 */ {(12<<2)|2,{111,89,0}}, +/* 16180 */ {(12<<2)|2,{111,89,0}}, +/* 16181 */ {(12<<2)|2,{111,89,0}}, +/* 16182 */ {(12<<2)|2,{111,89,0}}, +/* 16183 */ {(12<<2)|2,{111,89,0}}, +/* 16184 */ {(12<<2)|2,{111,89,0}}, +/* 16185 */ {(12<<2)|2,{111,89,0}}, +/* 16186 */ {(12<<2)|2,{111,89,0}}, +/* 16187 */ {(12<<2)|2,{111,89,0}}, +/* 16188 */ {(12<<2)|2,{111,89,0}}, +/* 16189 */ {(12<<2)|2,{111,89,0}}, +/* 16190 */ {(12<<2)|2,{111,89,0}}, +/* 16191 */ {(12<<2)|2,{111,89,0}}, +/* 16192 */ {(12<<2)|2,{111,106,0}}, +/* 16193 */ {(12<<2)|2,{111,106,0}}, +/* 16194 */ {(12<<2)|2,{111,106,0}}, +/* 16195 */ {(12<<2)|2,{111,106,0}}, +/* 16196 */ {(12<<2)|2,{111,106,0}}, +/* 16197 */ {(12<<2)|2,{111,106,0}}, +/* 16198 */ {(12<<2)|2,{111,106,0}}, +/* 16199 */ {(12<<2)|2,{111,106,0}}, +/* 16200 */ {(12<<2)|2,{111,106,0}}, +/* 16201 */ {(12<<2)|2,{111,106,0}}, +/* 16202 */ {(12<<2)|2,{111,106,0}}, +/* 16203 */ {(12<<2)|2,{111,106,0}}, +/* 16204 */ {(12<<2)|2,{111,106,0}}, +/* 16205 */ {(12<<2)|2,{111,106,0}}, +/* 16206 */ {(12<<2)|2,{111,106,0}}, +/* 16207 */ {(12<<2)|2,{111,106,0}}, +/* 16208 */ {(12<<2)|2,{111,107,0}}, +/* 16209 */ {(12<<2)|2,{111,107,0}}, +/* 16210 */ {(12<<2)|2,{111,107,0}}, +/* 16211 */ {(12<<2)|2,{111,107,0}}, +/* 16212 */ {(12<<2)|2,{111,107,0}}, +/* 16213 */ {(12<<2)|2,{111,107,0}}, +/* 16214 */ {(12<<2)|2,{111,107,0}}, +/* 16215 */ {(12<<2)|2,{111,107,0}}, +/* 16216 */ {(12<<2)|2,{111,107,0}}, +/* 16217 */ {(12<<2)|2,{111,107,0}}, +/* 16218 */ {(12<<2)|2,{111,107,0}}, +/* 16219 */ {(12<<2)|2,{111,107,0}}, +/* 16220 */ {(12<<2)|2,{111,107,0}}, +/* 16221 */ {(12<<2)|2,{111,107,0}}, +/* 16222 */ {(12<<2)|2,{111,107,0}}, +/* 16223 */ {(12<<2)|2,{111,107,0}}, +/* 16224 */ {(12<<2)|2,{111,113,0}}, +/* 16225 */ {(12<<2)|2,{111,113,0}}, +/* 16226 */ {(12<<2)|2,{111,113,0}}, +/* 16227 */ {(12<<2)|2,{111,113,0}}, +/* 16228 */ {(12<<2)|2,{111,113,0}}, +/* 16229 */ {(12<<2)|2,{111,113,0}}, +/* 16230 */ {(12<<2)|2,{111,113,0}}, +/* 16231 */ {(12<<2)|2,{111,113,0}}, +/* 16232 */ {(12<<2)|2,{111,113,0}}, +/* 16233 */ {(12<<2)|2,{111,113,0}}, +/* 16234 */ {(12<<2)|2,{111,113,0}}, +/* 16235 */ {(12<<2)|2,{111,113,0}}, +/* 16236 */ {(12<<2)|2,{111,113,0}}, +/* 16237 */ {(12<<2)|2,{111,113,0}}, +/* 16238 */ {(12<<2)|2,{111,113,0}}, +/* 16239 */ {(12<<2)|2,{111,113,0}}, +/* 16240 */ {(12<<2)|2,{111,118,0}}, +/* 16241 */ {(12<<2)|2,{111,118,0}}, +/* 16242 */ {(12<<2)|2,{111,118,0}}, +/* 16243 */ {(12<<2)|2,{111,118,0}}, +/* 16244 */ {(12<<2)|2,{111,118,0}}, +/* 16245 */ {(12<<2)|2,{111,118,0}}, +/* 16246 */ {(12<<2)|2,{111,118,0}}, +/* 16247 */ {(12<<2)|2,{111,118,0}}, +/* 16248 */ {(12<<2)|2,{111,118,0}}, +/* 16249 */ {(12<<2)|2,{111,118,0}}, +/* 16250 */ {(12<<2)|2,{111,118,0}}, +/* 16251 */ {(12<<2)|2,{111,118,0}}, +/* 16252 */ {(12<<2)|2,{111,118,0}}, +/* 16253 */ {(12<<2)|2,{111,118,0}}, +/* 16254 */ {(12<<2)|2,{111,118,0}}, +/* 16255 */ {(12<<2)|2,{111,118,0}}, +/* 16256 */ {(12<<2)|2,{111,119,0}}, +/* 16257 */ {(12<<2)|2,{111,119,0}}, +/* 16258 */ {(12<<2)|2,{111,119,0}}, +/* 16259 */ {(12<<2)|2,{111,119,0}}, +/* 16260 */ {(12<<2)|2,{111,119,0}}, +/* 16261 */ {(12<<2)|2,{111,119,0}}, +/* 16262 */ {(12<<2)|2,{111,119,0}}, +/* 16263 */ {(12<<2)|2,{111,119,0}}, +/* 16264 */ {(12<<2)|2,{111,119,0}}, +/* 16265 */ {(12<<2)|2,{111,119,0}}, +/* 16266 */ {(12<<2)|2,{111,119,0}}, +/* 16267 */ {(12<<2)|2,{111,119,0}}, +/* 16268 */ {(12<<2)|2,{111,119,0}}, +/* 16269 */ {(12<<2)|2,{111,119,0}}, +/* 16270 */ {(12<<2)|2,{111,119,0}}, +/* 16271 */ {(12<<2)|2,{111,119,0}}, +/* 16272 */ {(12<<2)|2,{111,120,0}}, +/* 16273 */ {(12<<2)|2,{111,120,0}}, +/* 16274 */ {(12<<2)|2,{111,120,0}}, +/* 16275 */ {(12<<2)|2,{111,120,0}}, +/* 16276 */ {(12<<2)|2,{111,120,0}}, +/* 16277 */ {(12<<2)|2,{111,120,0}}, +/* 16278 */ {(12<<2)|2,{111,120,0}}, +/* 16279 */ {(12<<2)|2,{111,120,0}}, +/* 16280 */ {(12<<2)|2,{111,120,0}}, +/* 16281 */ {(12<<2)|2,{111,120,0}}, +/* 16282 */ {(12<<2)|2,{111,120,0}}, +/* 16283 */ {(12<<2)|2,{111,120,0}}, +/* 16284 */ {(12<<2)|2,{111,120,0}}, +/* 16285 */ {(12<<2)|2,{111,120,0}}, +/* 16286 */ {(12<<2)|2,{111,120,0}}, +/* 16287 */ {(12<<2)|2,{111,120,0}}, +/* 16288 */ {(12<<2)|2,{111,121,0}}, +/* 16289 */ {(12<<2)|2,{111,121,0}}, +/* 16290 */ {(12<<2)|2,{111,121,0}}, +/* 16291 */ {(12<<2)|2,{111,121,0}}, +/* 16292 */ {(12<<2)|2,{111,121,0}}, +/* 16293 */ {(12<<2)|2,{111,121,0}}, +/* 16294 */ {(12<<2)|2,{111,121,0}}, +/* 16295 */ {(12<<2)|2,{111,121,0}}, +/* 16296 */ {(12<<2)|2,{111,121,0}}, +/* 16297 */ {(12<<2)|2,{111,121,0}}, +/* 16298 */ {(12<<2)|2,{111,121,0}}, +/* 16299 */ {(12<<2)|2,{111,121,0}}, +/* 16300 */ {(12<<2)|2,{111,121,0}}, +/* 16301 */ {(12<<2)|2,{111,121,0}}, +/* 16302 */ {(12<<2)|2,{111,121,0}}, +/* 16303 */ {(12<<2)|2,{111,121,0}}, +/* 16304 */ {(12<<2)|2,{111,122,0}}, +/* 16305 */ {(12<<2)|2,{111,122,0}}, +/* 16306 */ {(12<<2)|2,{111,122,0}}, +/* 16307 */ {(12<<2)|2,{111,122,0}}, +/* 16308 */ {(12<<2)|2,{111,122,0}}, +/* 16309 */ {(12<<2)|2,{111,122,0}}, +/* 16310 */ {(12<<2)|2,{111,122,0}}, +/* 16311 */ {(12<<2)|2,{111,122,0}}, +/* 16312 */ {(12<<2)|2,{111,122,0}}, +/* 16313 */ {(12<<2)|2,{111,122,0}}, +/* 16314 */ {(12<<2)|2,{111,122,0}}, +/* 16315 */ {(12<<2)|2,{111,122,0}}, +/* 16316 */ {(12<<2)|2,{111,122,0}}, +/* 16317 */ {(12<<2)|2,{111,122,0}}, +/* 16318 */ {(12<<2)|2,{111,122,0}}, +/* 16319 */ {(12<<2)|2,{111,122,0}}, +/* 16320 */ {(13<<2)|2,{111,38,0}}, +/* 16321 */ {(13<<2)|2,{111,38,0}}, +/* 16322 */ {(13<<2)|2,{111,38,0}}, +/* 16323 */ {(13<<2)|2,{111,38,0}}, +/* 16324 */ {(13<<2)|2,{111,38,0}}, +/* 16325 */ {(13<<2)|2,{111,38,0}}, +/* 16326 */ {(13<<2)|2,{111,38,0}}, +/* 16327 */ {(13<<2)|2,{111,38,0}}, +/* 16328 */ {(13<<2)|2,{111,42,0}}, +/* 16329 */ {(13<<2)|2,{111,42,0}}, +/* 16330 */ {(13<<2)|2,{111,42,0}}, +/* 16331 */ {(13<<2)|2,{111,42,0}}, +/* 16332 */ {(13<<2)|2,{111,42,0}}, +/* 16333 */ {(13<<2)|2,{111,42,0}}, +/* 16334 */ {(13<<2)|2,{111,42,0}}, +/* 16335 */ {(13<<2)|2,{111,42,0}}, +/* 16336 */ {(13<<2)|2,{111,44,0}}, +/* 16337 */ {(13<<2)|2,{111,44,0}}, +/* 16338 */ {(13<<2)|2,{111,44,0}}, +/* 16339 */ {(13<<2)|2,{111,44,0}}, +/* 16340 */ {(13<<2)|2,{111,44,0}}, +/* 16341 */ {(13<<2)|2,{111,44,0}}, +/* 16342 */ {(13<<2)|2,{111,44,0}}, +/* 16343 */ {(13<<2)|2,{111,44,0}}, +/* 16344 */ {(13<<2)|2,{111,59,0}}, +/* 16345 */ {(13<<2)|2,{111,59,0}}, +/* 16346 */ {(13<<2)|2,{111,59,0}}, +/* 16347 */ {(13<<2)|2,{111,59,0}}, +/* 16348 */ {(13<<2)|2,{111,59,0}}, +/* 16349 */ {(13<<2)|2,{111,59,0}}, +/* 16350 */ {(13<<2)|2,{111,59,0}}, +/* 16351 */ {(13<<2)|2,{111,59,0}}, +/* 16352 */ {(13<<2)|2,{111,88,0}}, +/* 16353 */ {(13<<2)|2,{111,88,0}}, +/* 16354 */ {(13<<2)|2,{111,88,0}}, +/* 16355 */ {(13<<2)|2,{111,88,0}}, +/* 16356 */ {(13<<2)|2,{111,88,0}}, +/* 16357 */ {(13<<2)|2,{111,88,0}}, +/* 16358 */ {(13<<2)|2,{111,88,0}}, +/* 16359 */ {(13<<2)|2,{111,88,0}}, +/* 16360 */ {(13<<2)|2,{111,90,0}}, +/* 16361 */ {(13<<2)|2,{111,90,0}}, +/* 16362 */ {(13<<2)|2,{111,90,0}}, +/* 16363 */ {(13<<2)|2,{111,90,0}}, +/* 16364 */ {(13<<2)|2,{111,90,0}}, +/* 16365 */ {(13<<2)|2,{111,90,0}}, +/* 16366 */ {(13<<2)|2,{111,90,0}}, +/* 16367 */ {(13<<2)|2,{111,90,0}}, +/* 16368 */ {(15<<2)|2,{111,33,0}}, +/* 16369 */ {(15<<2)|2,{111,33,0}}, +/* 16370 */ {(15<<2)|2,{111,34,0}}, +/* 16371 */ {(15<<2)|2,{111,34,0}}, +/* 16372 */ {(15<<2)|2,{111,40,0}}, +/* 16373 */ {(15<<2)|2,{111,40,0}}, +/* 16374 */ {(15<<2)|2,{111,41,0}}, +/* 16375 */ {(15<<2)|2,{111,41,0}}, +/* 16376 */ {(15<<2)|2,{111,63,0}}, +/* 16377 */ {(15<<2)|2,{111,63,0}}, +/* 16378 */ {(16<<2)|2,{111,39,0}}, +/* 16379 */ {(16<<2)|2,{111,43,0}}, +/* 16380 */ {(16<<2)|2,{111,124,0}}, +/* 16381 */ {(5<<2)|1,{111,0,0}}, +/* 16382 */ {(5<<2)|1,{111,0,0}}, +/* 16383 */ {(5<<2)|1,{111,0,0}}, +/* 16384 */ {(15<<2)|3,{115,48,48}}, +/* 16385 */ {(15<<2)|3,{115,48,48}}, +/* 16386 */ {(15<<2)|3,{115,48,49}}, +/* 16387 */ {(15<<2)|3,{115,48,49}}, +/* 16388 */ {(15<<2)|3,{115,48,50}}, +/* 16389 */ {(15<<2)|3,{115,48,50}}, +/* 16390 */ {(15<<2)|3,{115,48,97}}, +/* 16391 */ {(15<<2)|3,{115,48,97}}, +/* 16392 */ {(15<<2)|3,{115,48,99}}, +/* 16393 */ {(15<<2)|3,{115,48,99}}, +/* 16394 */ {(15<<2)|3,{115,48,101}}, +/* 16395 */ {(15<<2)|3,{115,48,101}}, +/* 16396 */ {(15<<2)|3,{115,48,105}}, +/* 16397 */ {(15<<2)|3,{115,48,105}}, +/* 16398 */ {(15<<2)|3,{115,48,111}}, +/* 16399 */ {(15<<2)|3,{115,48,111}}, +/* 16400 */ {(15<<2)|3,{115,48,115}}, +/* 16401 */ {(15<<2)|3,{115,48,115}}, +/* 16402 */ {(15<<2)|3,{115,48,116}}, +/* 16403 */ {(15<<2)|3,{115,48,116}}, +/* 16404 */ {(16<<2)|3,{115,48,32}}, +/* 16405 */ {(16<<2)|3,{115,48,37}}, +/* 16406 */ {(16<<2)|3,{115,48,45}}, +/* 16407 */ {(16<<2)|3,{115,48,46}}, +/* 16408 */ {(16<<2)|3,{115,48,47}}, +/* 16409 */ {(16<<2)|3,{115,48,51}}, +/* 16410 */ {(16<<2)|3,{115,48,52}}, +/* 16411 */ {(16<<2)|3,{115,48,53}}, +/* 16412 */ {(16<<2)|3,{115,48,54}}, +/* 16413 */ {(16<<2)|3,{115,48,55}}, +/* 16414 */ {(16<<2)|3,{115,48,56}}, +/* 16415 */ {(16<<2)|3,{115,48,57}}, +/* 16416 */ {(16<<2)|3,{115,48,61}}, +/* 16417 */ {(16<<2)|3,{115,48,65}}, +/* 16418 */ {(16<<2)|3,{115,48,95}}, +/* 16419 */ {(16<<2)|3,{115,48,98}}, +/* 16420 */ {(16<<2)|3,{115,48,100}}, +/* 16421 */ {(16<<2)|3,{115,48,102}}, +/* 16422 */ {(16<<2)|3,{115,48,103}}, +/* 16423 */ {(16<<2)|3,{115,48,104}}, +/* 16424 */ {(16<<2)|3,{115,48,108}}, +/* 16425 */ {(16<<2)|3,{115,48,109}}, +/* 16426 */ {(16<<2)|3,{115,48,110}}, +/* 16427 */ {(16<<2)|3,{115,48,112}}, +/* 16428 */ {(16<<2)|3,{115,48,114}}, +/* 16429 */ {(16<<2)|3,{115,48,117}}, +/* 16430 */ {(10<<2)|2,{115,48,0}}, +/* 16431 */ {(10<<2)|2,{115,48,0}}, +/* 16432 */ {(10<<2)|2,{115,48,0}}, +/* 16433 */ {(10<<2)|2,{115,48,0}}, +/* 16434 */ {(10<<2)|2,{115,48,0}}, +/* 16435 */ {(10<<2)|2,{115,48,0}}, +/* 16436 */ {(10<<2)|2,{115,48,0}}, +/* 16437 */ {(10<<2)|2,{115,48,0}}, +/* 16438 */ {(10<<2)|2,{115,48,0}}, +/* 16439 */ {(10<<2)|2,{115,48,0}}, +/* 16440 */ {(10<<2)|2,{115,48,0}}, +/* 16441 */ {(10<<2)|2,{115,48,0}}, +/* 16442 */ {(10<<2)|2,{115,48,0}}, +/* 16443 */ {(10<<2)|2,{115,48,0}}, +/* 16444 */ {(10<<2)|2,{115,48,0}}, +/* 16445 */ {(10<<2)|2,{115,48,0}}, +/* 16446 */ {(10<<2)|2,{115,48,0}}, +/* 16447 */ {(10<<2)|2,{115,48,0}}, +/* 16448 */ {(15<<2)|3,{115,49,48}}, +/* 16449 */ {(15<<2)|3,{115,49,48}}, +/* 16450 */ {(15<<2)|3,{115,49,49}}, +/* 16451 */ {(15<<2)|3,{115,49,49}}, +/* 16452 */ {(15<<2)|3,{115,49,50}}, +/* 16453 */ {(15<<2)|3,{115,49,50}}, +/* 16454 */ {(15<<2)|3,{115,49,97}}, +/* 16455 */ {(15<<2)|3,{115,49,97}}, +/* 16456 */ {(15<<2)|3,{115,49,99}}, +/* 16457 */ {(15<<2)|3,{115,49,99}}, +/* 16458 */ {(15<<2)|3,{115,49,101}}, +/* 16459 */ {(15<<2)|3,{115,49,101}}, +/* 16460 */ {(15<<2)|3,{115,49,105}}, +/* 16461 */ {(15<<2)|3,{115,49,105}}, +/* 16462 */ {(15<<2)|3,{115,49,111}}, +/* 16463 */ {(15<<2)|3,{115,49,111}}, +/* 16464 */ {(15<<2)|3,{115,49,115}}, +/* 16465 */ {(15<<2)|3,{115,49,115}}, +/* 16466 */ {(15<<2)|3,{115,49,116}}, +/* 16467 */ {(15<<2)|3,{115,49,116}}, +/* 16468 */ {(16<<2)|3,{115,49,32}}, +/* 16469 */ {(16<<2)|3,{115,49,37}}, +/* 16470 */ {(16<<2)|3,{115,49,45}}, +/* 16471 */ {(16<<2)|3,{115,49,46}}, +/* 16472 */ {(16<<2)|3,{115,49,47}}, +/* 16473 */ {(16<<2)|3,{115,49,51}}, +/* 16474 */ {(16<<2)|3,{115,49,52}}, +/* 16475 */ {(16<<2)|3,{115,49,53}}, +/* 16476 */ {(16<<2)|3,{115,49,54}}, +/* 16477 */ {(16<<2)|3,{115,49,55}}, +/* 16478 */ {(16<<2)|3,{115,49,56}}, +/* 16479 */ {(16<<2)|3,{115,49,57}}, +/* 16480 */ {(16<<2)|3,{115,49,61}}, +/* 16481 */ {(16<<2)|3,{115,49,65}}, +/* 16482 */ {(16<<2)|3,{115,49,95}}, +/* 16483 */ {(16<<2)|3,{115,49,98}}, +/* 16484 */ {(16<<2)|3,{115,49,100}}, +/* 16485 */ {(16<<2)|3,{115,49,102}}, +/* 16486 */ {(16<<2)|3,{115,49,103}}, +/* 16487 */ {(16<<2)|3,{115,49,104}}, +/* 16488 */ {(16<<2)|3,{115,49,108}}, +/* 16489 */ {(16<<2)|3,{115,49,109}}, +/* 16490 */ {(16<<2)|3,{115,49,110}}, +/* 16491 */ {(16<<2)|3,{115,49,112}}, +/* 16492 */ {(16<<2)|3,{115,49,114}}, +/* 16493 */ {(16<<2)|3,{115,49,117}}, +/* 16494 */ {(10<<2)|2,{115,49,0}}, +/* 16495 */ {(10<<2)|2,{115,49,0}}, +/* 16496 */ {(10<<2)|2,{115,49,0}}, +/* 16497 */ {(10<<2)|2,{115,49,0}}, +/* 16498 */ {(10<<2)|2,{115,49,0}}, +/* 16499 */ {(10<<2)|2,{115,49,0}}, +/* 16500 */ {(10<<2)|2,{115,49,0}}, +/* 16501 */ {(10<<2)|2,{115,49,0}}, +/* 16502 */ {(10<<2)|2,{115,49,0}}, +/* 16503 */ {(10<<2)|2,{115,49,0}}, +/* 16504 */ {(10<<2)|2,{115,49,0}}, +/* 16505 */ {(10<<2)|2,{115,49,0}}, +/* 16506 */ {(10<<2)|2,{115,49,0}}, +/* 16507 */ {(10<<2)|2,{115,49,0}}, +/* 16508 */ {(10<<2)|2,{115,49,0}}, +/* 16509 */ {(10<<2)|2,{115,49,0}}, +/* 16510 */ {(10<<2)|2,{115,49,0}}, +/* 16511 */ {(10<<2)|2,{115,49,0}}, +/* 16512 */ {(15<<2)|3,{115,50,48}}, +/* 16513 */ {(15<<2)|3,{115,50,48}}, +/* 16514 */ {(15<<2)|3,{115,50,49}}, +/* 16515 */ {(15<<2)|3,{115,50,49}}, +/* 16516 */ {(15<<2)|3,{115,50,50}}, +/* 16517 */ {(15<<2)|3,{115,50,50}}, +/* 16518 */ {(15<<2)|3,{115,50,97}}, +/* 16519 */ {(15<<2)|3,{115,50,97}}, +/* 16520 */ {(15<<2)|3,{115,50,99}}, +/* 16521 */ {(15<<2)|3,{115,50,99}}, +/* 16522 */ {(15<<2)|3,{115,50,101}}, +/* 16523 */ {(15<<2)|3,{115,50,101}}, +/* 16524 */ {(15<<2)|3,{115,50,105}}, +/* 16525 */ {(15<<2)|3,{115,50,105}}, +/* 16526 */ {(15<<2)|3,{115,50,111}}, +/* 16527 */ {(15<<2)|3,{115,50,111}}, +/* 16528 */ {(15<<2)|3,{115,50,115}}, +/* 16529 */ {(15<<2)|3,{115,50,115}}, +/* 16530 */ {(15<<2)|3,{115,50,116}}, +/* 16531 */ {(15<<2)|3,{115,50,116}}, +/* 16532 */ {(16<<2)|3,{115,50,32}}, +/* 16533 */ {(16<<2)|3,{115,50,37}}, +/* 16534 */ {(16<<2)|3,{115,50,45}}, +/* 16535 */ {(16<<2)|3,{115,50,46}}, +/* 16536 */ {(16<<2)|3,{115,50,47}}, +/* 16537 */ {(16<<2)|3,{115,50,51}}, +/* 16538 */ {(16<<2)|3,{115,50,52}}, +/* 16539 */ {(16<<2)|3,{115,50,53}}, +/* 16540 */ {(16<<2)|3,{115,50,54}}, +/* 16541 */ {(16<<2)|3,{115,50,55}}, +/* 16542 */ {(16<<2)|3,{115,50,56}}, +/* 16543 */ {(16<<2)|3,{115,50,57}}, +/* 16544 */ {(16<<2)|3,{115,50,61}}, +/* 16545 */ {(16<<2)|3,{115,50,65}}, +/* 16546 */ {(16<<2)|3,{115,50,95}}, +/* 16547 */ {(16<<2)|3,{115,50,98}}, +/* 16548 */ {(16<<2)|3,{115,50,100}}, +/* 16549 */ {(16<<2)|3,{115,50,102}}, +/* 16550 */ {(16<<2)|3,{115,50,103}}, +/* 16551 */ {(16<<2)|3,{115,50,104}}, +/* 16552 */ {(16<<2)|3,{115,50,108}}, +/* 16553 */ {(16<<2)|3,{115,50,109}}, +/* 16554 */ {(16<<2)|3,{115,50,110}}, +/* 16555 */ {(16<<2)|3,{115,50,112}}, +/* 16556 */ {(16<<2)|3,{115,50,114}}, +/* 16557 */ {(16<<2)|3,{115,50,117}}, +/* 16558 */ {(10<<2)|2,{115,50,0}}, +/* 16559 */ {(10<<2)|2,{115,50,0}}, +/* 16560 */ {(10<<2)|2,{115,50,0}}, +/* 16561 */ {(10<<2)|2,{115,50,0}}, +/* 16562 */ {(10<<2)|2,{115,50,0}}, +/* 16563 */ {(10<<2)|2,{115,50,0}}, +/* 16564 */ {(10<<2)|2,{115,50,0}}, +/* 16565 */ {(10<<2)|2,{115,50,0}}, +/* 16566 */ {(10<<2)|2,{115,50,0}}, +/* 16567 */ {(10<<2)|2,{115,50,0}}, +/* 16568 */ {(10<<2)|2,{115,50,0}}, +/* 16569 */ {(10<<2)|2,{115,50,0}}, +/* 16570 */ {(10<<2)|2,{115,50,0}}, +/* 16571 */ {(10<<2)|2,{115,50,0}}, +/* 16572 */ {(10<<2)|2,{115,50,0}}, +/* 16573 */ {(10<<2)|2,{115,50,0}}, +/* 16574 */ {(10<<2)|2,{115,50,0}}, +/* 16575 */ {(10<<2)|2,{115,50,0}}, +/* 16576 */ {(15<<2)|3,{115,97,48}}, +/* 16577 */ {(15<<2)|3,{115,97,48}}, +/* 16578 */ {(15<<2)|3,{115,97,49}}, +/* 16579 */ {(15<<2)|3,{115,97,49}}, +/* 16580 */ {(15<<2)|3,{115,97,50}}, +/* 16581 */ {(15<<2)|3,{115,97,50}}, +/* 16582 */ {(15<<2)|3,{115,97,97}}, +/* 16583 */ {(15<<2)|3,{115,97,97}}, +/* 16584 */ {(15<<2)|3,{115,97,99}}, +/* 16585 */ {(15<<2)|3,{115,97,99}}, +/* 16586 */ {(15<<2)|3,{115,97,101}}, +/* 16587 */ {(15<<2)|3,{115,97,101}}, +/* 16588 */ {(15<<2)|3,{115,97,105}}, +/* 16589 */ {(15<<2)|3,{115,97,105}}, +/* 16590 */ {(15<<2)|3,{115,97,111}}, +/* 16591 */ {(15<<2)|3,{115,97,111}}, +/* 16592 */ {(15<<2)|3,{115,97,115}}, +/* 16593 */ {(15<<2)|3,{115,97,115}}, +/* 16594 */ {(15<<2)|3,{115,97,116}}, +/* 16595 */ {(15<<2)|3,{115,97,116}}, +/* 16596 */ {(16<<2)|3,{115,97,32}}, +/* 16597 */ {(16<<2)|3,{115,97,37}}, +/* 16598 */ {(16<<2)|3,{115,97,45}}, +/* 16599 */ {(16<<2)|3,{115,97,46}}, +/* 16600 */ {(16<<2)|3,{115,97,47}}, +/* 16601 */ {(16<<2)|3,{115,97,51}}, +/* 16602 */ {(16<<2)|3,{115,97,52}}, +/* 16603 */ {(16<<2)|3,{115,97,53}}, +/* 16604 */ {(16<<2)|3,{115,97,54}}, +/* 16605 */ {(16<<2)|3,{115,97,55}}, +/* 16606 */ {(16<<2)|3,{115,97,56}}, +/* 16607 */ {(16<<2)|3,{115,97,57}}, +/* 16608 */ {(16<<2)|3,{115,97,61}}, +/* 16609 */ {(16<<2)|3,{115,97,65}}, +/* 16610 */ {(16<<2)|3,{115,97,95}}, +/* 16611 */ {(16<<2)|3,{115,97,98}}, +/* 16612 */ {(16<<2)|3,{115,97,100}}, +/* 16613 */ {(16<<2)|3,{115,97,102}}, +/* 16614 */ {(16<<2)|3,{115,97,103}}, +/* 16615 */ {(16<<2)|3,{115,97,104}}, +/* 16616 */ {(16<<2)|3,{115,97,108}}, +/* 16617 */ {(16<<2)|3,{115,97,109}}, +/* 16618 */ {(16<<2)|3,{115,97,110}}, +/* 16619 */ {(16<<2)|3,{115,97,112}}, +/* 16620 */ {(16<<2)|3,{115,97,114}}, +/* 16621 */ {(16<<2)|3,{115,97,117}}, +/* 16622 */ {(10<<2)|2,{115,97,0}}, +/* 16623 */ {(10<<2)|2,{115,97,0}}, +/* 16624 */ {(10<<2)|2,{115,97,0}}, +/* 16625 */ {(10<<2)|2,{115,97,0}}, +/* 16626 */ {(10<<2)|2,{115,97,0}}, +/* 16627 */ {(10<<2)|2,{115,97,0}}, +/* 16628 */ {(10<<2)|2,{115,97,0}}, +/* 16629 */ {(10<<2)|2,{115,97,0}}, +/* 16630 */ {(10<<2)|2,{115,97,0}}, +/* 16631 */ {(10<<2)|2,{115,97,0}}, +/* 16632 */ {(10<<2)|2,{115,97,0}}, +/* 16633 */ {(10<<2)|2,{115,97,0}}, +/* 16634 */ {(10<<2)|2,{115,97,0}}, +/* 16635 */ {(10<<2)|2,{115,97,0}}, +/* 16636 */ {(10<<2)|2,{115,97,0}}, +/* 16637 */ {(10<<2)|2,{115,97,0}}, +/* 16638 */ {(10<<2)|2,{115,97,0}}, +/* 16639 */ {(10<<2)|2,{115,97,0}}, +/* 16640 */ {(15<<2)|3,{115,99,48}}, +/* 16641 */ {(15<<2)|3,{115,99,48}}, +/* 16642 */ {(15<<2)|3,{115,99,49}}, +/* 16643 */ {(15<<2)|3,{115,99,49}}, +/* 16644 */ {(15<<2)|3,{115,99,50}}, +/* 16645 */ {(15<<2)|3,{115,99,50}}, +/* 16646 */ {(15<<2)|3,{115,99,97}}, +/* 16647 */ {(15<<2)|3,{115,99,97}}, +/* 16648 */ {(15<<2)|3,{115,99,99}}, +/* 16649 */ {(15<<2)|3,{115,99,99}}, +/* 16650 */ {(15<<2)|3,{115,99,101}}, +/* 16651 */ {(15<<2)|3,{115,99,101}}, +/* 16652 */ {(15<<2)|3,{115,99,105}}, +/* 16653 */ {(15<<2)|3,{115,99,105}}, +/* 16654 */ {(15<<2)|3,{115,99,111}}, +/* 16655 */ {(15<<2)|3,{115,99,111}}, +/* 16656 */ {(15<<2)|3,{115,99,115}}, +/* 16657 */ {(15<<2)|3,{115,99,115}}, +/* 16658 */ {(15<<2)|3,{115,99,116}}, +/* 16659 */ {(15<<2)|3,{115,99,116}}, +/* 16660 */ {(16<<2)|3,{115,99,32}}, +/* 16661 */ {(16<<2)|3,{115,99,37}}, +/* 16662 */ {(16<<2)|3,{115,99,45}}, +/* 16663 */ {(16<<2)|3,{115,99,46}}, +/* 16664 */ {(16<<2)|3,{115,99,47}}, +/* 16665 */ {(16<<2)|3,{115,99,51}}, +/* 16666 */ {(16<<2)|3,{115,99,52}}, +/* 16667 */ {(16<<2)|3,{115,99,53}}, +/* 16668 */ {(16<<2)|3,{115,99,54}}, +/* 16669 */ {(16<<2)|3,{115,99,55}}, +/* 16670 */ {(16<<2)|3,{115,99,56}}, +/* 16671 */ {(16<<2)|3,{115,99,57}}, +/* 16672 */ {(16<<2)|3,{115,99,61}}, +/* 16673 */ {(16<<2)|3,{115,99,65}}, +/* 16674 */ {(16<<2)|3,{115,99,95}}, +/* 16675 */ {(16<<2)|3,{115,99,98}}, +/* 16676 */ {(16<<2)|3,{115,99,100}}, +/* 16677 */ {(16<<2)|3,{115,99,102}}, +/* 16678 */ {(16<<2)|3,{115,99,103}}, +/* 16679 */ {(16<<2)|3,{115,99,104}}, +/* 16680 */ {(16<<2)|3,{115,99,108}}, +/* 16681 */ {(16<<2)|3,{115,99,109}}, +/* 16682 */ {(16<<2)|3,{115,99,110}}, +/* 16683 */ {(16<<2)|3,{115,99,112}}, +/* 16684 */ {(16<<2)|3,{115,99,114}}, +/* 16685 */ {(16<<2)|3,{115,99,117}}, +/* 16686 */ {(10<<2)|2,{115,99,0}}, +/* 16687 */ {(10<<2)|2,{115,99,0}}, +/* 16688 */ {(10<<2)|2,{115,99,0}}, +/* 16689 */ {(10<<2)|2,{115,99,0}}, +/* 16690 */ {(10<<2)|2,{115,99,0}}, +/* 16691 */ {(10<<2)|2,{115,99,0}}, +/* 16692 */ {(10<<2)|2,{115,99,0}}, +/* 16693 */ {(10<<2)|2,{115,99,0}}, +/* 16694 */ {(10<<2)|2,{115,99,0}}, +/* 16695 */ {(10<<2)|2,{115,99,0}}, +/* 16696 */ {(10<<2)|2,{115,99,0}}, +/* 16697 */ {(10<<2)|2,{115,99,0}}, +/* 16698 */ {(10<<2)|2,{115,99,0}}, +/* 16699 */ {(10<<2)|2,{115,99,0}}, +/* 16700 */ {(10<<2)|2,{115,99,0}}, +/* 16701 */ {(10<<2)|2,{115,99,0}}, +/* 16702 */ {(10<<2)|2,{115,99,0}}, +/* 16703 */ {(10<<2)|2,{115,99,0}}, +/* 16704 */ {(15<<2)|3,{115,101,48}}, +/* 16705 */ {(15<<2)|3,{115,101,48}}, +/* 16706 */ {(15<<2)|3,{115,101,49}}, +/* 16707 */ {(15<<2)|3,{115,101,49}}, +/* 16708 */ {(15<<2)|3,{115,101,50}}, +/* 16709 */ {(15<<2)|3,{115,101,50}}, +/* 16710 */ {(15<<2)|3,{115,101,97}}, +/* 16711 */ {(15<<2)|3,{115,101,97}}, +/* 16712 */ {(15<<2)|3,{115,101,99}}, +/* 16713 */ {(15<<2)|3,{115,101,99}}, +/* 16714 */ {(15<<2)|3,{115,101,101}}, +/* 16715 */ {(15<<2)|3,{115,101,101}}, +/* 16716 */ {(15<<2)|3,{115,101,105}}, +/* 16717 */ {(15<<2)|3,{115,101,105}}, +/* 16718 */ {(15<<2)|3,{115,101,111}}, +/* 16719 */ {(15<<2)|3,{115,101,111}}, +/* 16720 */ {(15<<2)|3,{115,101,115}}, +/* 16721 */ {(15<<2)|3,{115,101,115}}, +/* 16722 */ {(15<<2)|3,{115,101,116}}, +/* 16723 */ {(15<<2)|3,{115,101,116}}, +/* 16724 */ {(16<<2)|3,{115,101,32}}, +/* 16725 */ {(16<<2)|3,{115,101,37}}, +/* 16726 */ {(16<<2)|3,{115,101,45}}, +/* 16727 */ {(16<<2)|3,{115,101,46}}, +/* 16728 */ {(16<<2)|3,{115,101,47}}, +/* 16729 */ {(16<<2)|3,{115,101,51}}, +/* 16730 */ {(16<<2)|3,{115,101,52}}, +/* 16731 */ {(16<<2)|3,{115,101,53}}, +/* 16732 */ {(16<<2)|3,{115,101,54}}, +/* 16733 */ {(16<<2)|3,{115,101,55}}, +/* 16734 */ {(16<<2)|3,{115,101,56}}, +/* 16735 */ {(16<<2)|3,{115,101,57}}, +/* 16736 */ {(16<<2)|3,{115,101,61}}, +/* 16737 */ {(16<<2)|3,{115,101,65}}, +/* 16738 */ {(16<<2)|3,{115,101,95}}, +/* 16739 */ {(16<<2)|3,{115,101,98}}, +/* 16740 */ {(16<<2)|3,{115,101,100}}, +/* 16741 */ {(16<<2)|3,{115,101,102}}, +/* 16742 */ {(16<<2)|3,{115,101,103}}, +/* 16743 */ {(16<<2)|3,{115,101,104}}, +/* 16744 */ {(16<<2)|3,{115,101,108}}, +/* 16745 */ {(16<<2)|3,{115,101,109}}, +/* 16746 */ {(16<<2)|3,{115,101,110}}, +/* 16747 */ {(16<<2)|3,{115,101,112}}, +/* 16748 */ {(16<<2)|3,{115,101,114}}, +/* 16749 */ {(16<<2)|3,{115,101,117}}, +/* 16750 */ {(10<<2)|2,{115,101,0}}, +/* 16751 */ {(10<<2)|2,{115,101,0}}, +/* 16752 */ {(10<<2)|2,{115,101,0}}, +/* 16753 */ {(10<<2)|2,{115,101,0}}, +/* 16754 */ {(10<<2)|2,{115,101,0}}, +/* 16755 */ {(10<<2)|2,{115,101,0}}, +/* 16756 */ {(10<<2)|2,{115,101,0}}, +/* 16757 */ {(10<<2)|2,{115,101,0}}, +/* 16758 */ {(10<<2)|2,{115,101,0}}, +/* 16759 */ {(10<<2)|2,{115,101,0}}, +/* 16760 */ {(10<<2)|2,{115,101,0}}, +/* 16761 */ {(10<<2)|2,{115,101,0}}, +/* 16762 */ {(10<<2)|2,{115,101,0}}, +/* 16763 */ {(10<<2)|2,{115,101,0}}, +/* 16764 */ {(10<<2)|2,{115,101,0}}, +/* 16765 */ {(10<<2)|2,{115,101,0}}, +/* 16766 */ {(10<<2)|2,{115,101,0}}, +/* 16767 */ {(10<<2)|2,{115,101,0}}, +/* 16768 */ {(15<<2)|3,{115,105,48}}, +/* 16769 */ {(15<<2)|3,{115,105,48}}, +/* 16770 */ {(15<<2)|3,{115,105,49}}, +/* 16771 */ {(15<<2)|3,{115,105,49}}, +/* 16772 */ {(15<<2)|3,{115,105,50}}, +/* 16773 */ {(15<<2)|3,{115,105,50}}, +/* 16774 */ {(15<<2)|3,{115,105,97}}, +/* 16775 */ {(15<<2)|3,{115,105,97}}, +/* 16776 */ {(15<<2)|3,{115,105,99}}, +/* 16777 */ {(15<<2)|3,{115,105,99}}, +/* 16778 */ {(15<<2)|3,{115,105,101}}, +/* 16779 */ {(15<<2)|3,{115,105,101}}, +/* 16780 */ {(15<<2)|3,{115,105,105}}, +/* 16781 */ {(15<<2)|3,{115,105,105}}, +/* 16782 */ {(15<<2)|3,{115,105,111}}, +/* 16783 */ {(15<<2)|3,{115,105,111}}, +/* 16784 */ {(15<<2)|3,{115,105,115}}, +/* 16785 */ {(15<<2)|3,{115,105,115}}, +/* 16786 */ {(15<<2)|3,{115,105,116}}, +/* 16787 */ {(15<<2)|3,{115,105,116}}, +/* 16788 */ {(16<<2)|3,{115,105,32}}, +/* 16789 */ {(16<<2)|3,{115,105,37}}, +/* 16790 */ {(16<<2)|3,{115,105,45}}, +/* 16791 */ {(16<<2)|3,{115,105,46}}, +/* 16792 */ {(16<<2)|3,{115,105,47}}, +/* 16793 */ {(16<<2)|3,{115,105,51}}, +/* 16794 */ {(16<<2)|3,{115,105,52}}, +/* 16795 */ {(16<<2)|3,{115,105,53}}, +/* 16796 */ {(16<<2)|3,{115,105,54}}, +/* 16797 */ {(16<<2)|3,{115,105,55}}, +/* 16798 */ {(16<<2)|3,{115,105,56}}, +/* 16799 */ {(16<<2)|3,{115,105,57}}, +/* 16800 */ {(16<<2)|3,{115,105,61}}, +/* 16801 */ {(16<<2)|3,{115,105,65}}, +/* 16802 */ {(16<<2)|3,{115,105,95}}, +/* 16803 */ {(16<<2)|3,{115,105,98}}, +/* 16804 */ {(16<<2)|3,{115,105,100}}, +/* 16805 */ {(16<<2)|3,{115,105,102}}, +/* 16806 */ {(16<<2)|3,{115,105,103}}, +/* 16807 */ {(16<<2)|3,{115,105,104}}, +/* 16808 */ {(16<<2)|3,{115,105,108}}, +/* 16809 */ {(16<<2)|3,{115,105,109}}, +/* 16810 */ {(16<<2)|3,{115,105,110}}, +/* 16811 */ {(16<<2)|3,{115,105,112}}, +/* 16812 */ {(16<<2)|3,{115,105,114}}, +/* 16813 */ {(16<<2)|3,{115,105,117}}, +/* 16814 */ {(10<<2)|2,{115,105,0}}, +/* 16815 */ {(10<<2)|2,{115,105,0}}, +/* 16816 */ {(10<<2)|2,{115,105,0}}, +/* 16817 */ {(10<<2)|2,{115,105,0}}, +/* 16818 */ {(10<<2)|2,{115,105,0}}, +/* 16819 */ {(10<<2)|2,{115,105,0}}, +/* 16820 */ {(10<<2)|2,{115,105,0}}, +/* 16821 */ {(10<<2)|2,{115,105,0}}, +/* 16822 */ {(10<<2)|2,{115,105,0}}, +/* 16823 */ {(10<<2)|2,{115,105,0}}, +/* 16824 */ {(10<<2)|2,{115,105,0}}, +/* 16825 */ {(10<<2)|2,{115,105,0}}, +/* 16826 */ {(10<<2)|2,{115,105,0}}, +/* 16827 */ {(10<<2)|2,{115,105,0}}, +/* 16828 */ {(10<<2)|2,{115,105,0}}, +/* 16829 */ {(10<<2)|2,{115,105,0}}, +/* 16830 */ {(10<<2)|2,{115,105,0}}, +/* 16831 */ {(10<<2)|2,{115,105,0}}, +/* 16832 */ {(15<<2)|3,{115,111,48}}, +/* 16833 */ {(15<<2)|3,{115,111,48}}, +/* 16834 */ {(15<<2)|3,{115,111,49}}, +/* 16835 */ {(15<<2)|3,{115,111,49}}, +/* 16836 */ {(15<<2)|3,{115,111,50}}, +/* 16837 */ {(15<<2)|3,{115,111,50}}, +/* 16838 */ {(15<<2)|3,{115,111,97}}, +/* 16839 */ {(15<<2)|3,{115,111,97}}, +/* 16840 */ {(15<<2)|3,{115,111,99}}, +/* 16841 */ {(15<<2)|3,{115,111,99}}, +/* 16842 */ {(15<<2)|3,{115,111,101}}, +/* 16843 */ {(15<<2)|3,{115,111,101}}, +/* 16844 */ {(15<<2)|3,{115,111,105}}, +/* 16845 */ {(15<<2)|3,{115,111,105}}, +/* 16846 */ {(15<<2)|3,{115,111,111}}, +/* 16847 */ {(15<<2)|3,{115,111,111}}, +/* 16848 */ {(15<<2)|3,{115,111,115}}, +/* 16849 */ {(15<<2)|3,{115,111,115}}, +/* 16850 */ {(15<<2)|3,{115,111,116}}, +/* 16851 */ {(15<<2)|3,{115,111,116}}, +/* 16852 */ {(16<<2)|3,{115,111,32}}, +/* 16853 */ {(16<<2)|3,{115,111,37}}, +/* 16854 */ {(16<<2)|3,{115,111,45}}, +/* 16855 */ {(16<<2)|3,{115,111,46}}, +/* 16856 */ {(16<<2)|3,{115,111,47}}, +/* 16857 */ {(16<<2)|3,{115,111,51}}, +/* 16858 */ {(16<<2)|3,{115,111,52}}, +/* 16859 */ {(16<<2)|3,{115,111,53}}, +/* 16860 */ {(16<<2)|3,{115,111,54}}, +/* 16861 */ {(16<<2)|3,{115,111,55}}, +/* 16862 */ {(16<<2)|3,{115,111,56}}, +/* 16863 */ {(16<<2)|3,{115,111,57}}, +/* 16864 */ {(16<<2)|3,{115,111,61}}, +/* 16865 */ {(16<<2)|3,{115,111,65}}, +/* 16866 */ {(16<<2)|3,{115,111,95}}, +/* 16867 */ {(16<<2)|3,{115,111,98}}, +/* 16868 */ {(16<<2)|3,{115,111,100}}, +/* 16869 */ {(16<<2)|3,{115,111,102}}, +/* 16870 */ {(16<<2)|3,{115,111,103}}, +/* 16871 */ {(16<<2)|3,{115,111,104}}, +/* 16872 */ {(16<<2)|3,{115,111,108}}, +/* 16873 */ {(16<<2)|3,{115,111,109}}, +/* 16874 */ {(16<<2)|3,{115,111,110}}, +/* 16875 */ {(16<<2)|3,{115,111,112}}, +/* 16876 */ {(16<<2)|3,{115,111,114}}, +/* 16877 */ {(16<<2)|3,{115,111,117}}, +/* 16878 */ {(10<<2)|2,{115,111,0}}, +/* 16879 */ {(10<<2)|2,{115,111,0}}, +/* 16880 */ {(10<<2)|2,{115,111,0}}, +/* 16881 */ {(10<<2)|2,{115,111,0}}, +/* 16882 */ {(10<<2)|2,{115,111,0}}, +/* 16883 */ {(10<<2)|2,{115,111,0}}, +/* 16884 */ {(10<<2)|2,{115,111,0}}, +/* 16885 */ {(10<<2)|2,{115,111,0}}, +/* 16886 */ {(10<<2)|2,{115,111,0}}, +/* 16887 */ {(10<<2)|2,{115,111,0}}, +/* 16888 */ {(10<<2)|2,{115,111,0}}, +/* 16889 */ {(10<<2)|2,{115,111,0}}, +/* 16890 */ {(10<<2)|2,{115,111,0}}, +/* 16891 */ {(10<<2)|2,{115,111,0}}, +/* 16892 */ {(10<<2)|2,{115,111,0}}, +/* 16893 */ {(10<<2)|2,{115,111,0}}, +/* 16894 */ {(10<<2)|2,{115,111,0}}, +/* 16895 */ {(10<<2)|2,{115,111,0}}, +/* 16896 */ {(15<<2)|3,{115,115,48}}, +/* 16897 */ {(15<<2)|3,{115,115,48}}, +/* 16898 */ {(15<<2)|3,{115,115,49}}, +/* 16899 */ {(15<<2)|3,{115,115,49}}, +/* 16900 */ {(15<<2)|3,{115,115,50}}, +/* 16901 */ {(15<<2)|3,{115,115,50}}, +/* 16902 */ {(15<<2)|3,{115,115,97}}, +/* 16903 */ {(15<<2)|3,{115,115,97}}, +/* 16904 */ {(15<<2)|3,{115,115,99}}, +/* 16905 */ {(15<<2)|3,{115,115,99}}, +/* 16906 */ {(15<<2)|3,{115,115,101}}, +/* 16907 */ {(15<<2)|3,{115,115,101}}, +/* 16908 */ {(15<<2)|3,{115,115,105}}, +/* 16909 */ {(15<<2)|3,{115,115,105}}, +/* 16910 */ {(15<<2)|3,{115,115,111}}, +/* 16911 */ {(15<<2)|3,{115,115,111}}, +/* 16912 */ {(15<<2)|3,{115,115,115}}, +/* 16913 */ {(15<<2)|3,{115,115,115}}, +/* 16914 */ {(15<<2)|3,{115,115,116}}, +/* 16915 */ {(15<<2)|3,{115,115,116}}, +/* 16916 */ {(16<<2)|3,{115,115,32}}, +/* 16917 */ {(16<<2)|3,{115,115,37}}, +/* 16918 */ {(16<<2)|3,{115,115,45}}, +/* 16919 */ {(16<<2)|3,{115,115,46}}, +/* 16920 */ {(16<<2)|3,{115,115,47}}, +/* 16921 */ {(16<<2)|3,{115,115,51}}, +/* 16922 */ {(16<<2)|3,{115,115,52}}, +/* 16923 */ {(16<<2)|3,{115,115,53}}, +/* 16924 */ {(16<<2)|3,{115,115,54}}, +/* 16925 */ {(16<<2)|3,{115,115,55}}, +/* 16926 */ {(16<<2)|3,{115,115,56}}, +/* 16927 */ {(16<<2)|3,{115,115,57}}, +/* 16928 */ {(16<<2)|3,{115,115,61}}, +/* 16929 */ {(16<<2)|3,{115,115,65}}, +/* 16930 */ {(16<<2)|3,{115,115,95}}, +/* 16931 */ {(16<<2)|3,{115,115,98}}, +/* 16932 */ {(16<<2)|3,{115,115,100}}, +/* 16933 */ {(16<<2)|3,{115,115,102}}, +/* 16934 */ {(16<<2)|3,{115,115,103}}, +/* 16935 */ {(16<<2)|3,{115,115,104}}, +/* 16936 */ {(16<<2)|3,{115,115,108}}, +/* 16937 */ {(16<<2)|3,{115,115,109}}, +/* 16938 */ {(16<<2)|3,{115,115,110}}, +/* 16939 */ {(16<<2)|3,{115,115,112}}, +/* 16940 */ {(16<<2)|3,{115,115,114}}, +/* 16941 */ {(16<<2)|3,{115,115,117}}, +/* 16942 */ {(10<<2)|2,{115,115,0}}, +/* 16943 */ {(10<<2)|2,{115,115,0}}, +/* 16944 */ {(10<<2)|2,{115,115,0}}, +/* 16945 */ {(10<<2)|2,{115,115,0}}, +/* 16946 */ {(10<<2)|2,{115,115,0}}, +/* 16947 */ {(10<<2)|2,{115,115,0}}, +/* 16948 */ {(10<<2)|2,{115,115,0}}, +/* 16949 */ {(10<<2)|2,{115,115,0}}, +/* 16950 */ {(10<<2)|2,{115,115,0}}, +/* 16951 */ {(10<<2)|2,{115,115,0}}, +/* 16952 */ {(10<<2)|2,{115,115,0}}, +/* 16953 */ {(10<<2)|2,{115,115,0}}, +/* 16954 */ {(10<<2)|2,{115,115,0}}, +/* 16955 */ {(10<<2)|2,{115,115,0}}, +/* 16956 */ {(10<<2)|2,{115,115,0}}, +/* 16957 */ {(10<<2)|2,{115,115,0}}, +/* 16958 */ {(10<<2)|2,{115,115,0}}, +/* 16959 */ {(10<<2)|2,{115,115,0}}, +/* 16960 */ {(15<<2)|3,{115,116,48}}, +/* 16961 */ {(15<<2)|3,{115,116,48}}, +/* 16962 */ {(15<<2)|3,{115,116,49}}, +/* 16963 */ {(15<<2)|3,{115,116,49}}, +/* 16964 */ {(15<<2)|3,{115,116,50}}, +/* 16965 */ {(15<<2)|3,{115,116,50}}, +/* 16966 */ {(15<<2)|3,{115,116,97}}, +/* 16967 */ {(15<<2)|3,{115,116,97}}, +/* 16968 */ {(15<<2)|3,{115,116,99}}, +/* 16969 */ {(15<<2)|3,{115,116,99}}, +/* 16970 */ {(15<<2)|3,{115,116,101}}, +/* 16971 */ {(15<<2)|3,{115,116,101}}, +/* 16972 */ {(15<<2)|3,{115,116,105}}, +/* 16973 */ {(15<<2)|3,{115,116,105}}, +/* 16974 */ {(15<<2)|3,{115,116,111}}, +/* 16975 */ {(15<<2)|3,{115,116,111}}, +/* 16976 */ {(15<<2)|3,{115,116,115}}, +/* 16977 */ {(15<<2)|3,{115,116,115}}, +/* 16978 */ {(15<<2)|3,{115,116,116}}, +/* 16979 */ {(15<<2)|3,{115,116,116}}, +/* 16980 */ {(16<<2)|3,{115,116,32}}, +/* 16981 */ {(16<<2)|3,{115,116,37}}, +/* 16982 */ {(16<<2)|3,{115,116,45}}, +/* 16983 */ {(16<<2)|3,{115,116,46}}, +/* 16984 */ {(16<<2)|3,{115,116,47}}, +/* 16985 */ {(16<<2)|3,{115,116,51}}, +/* 16986 */ {(16<<2)|3,{115,116,52}}, +/* 16987 */ {(16<<2)|3,{115,116,53}}, +/* 16988 */ {(16<<2)|3,{115,116,54}}, +/* 16989 */ {(16<<2)|3,{115,116,55}}, +/* 16990 */ {(16<<2)|3,{115,116,56}}, +/* 16991 */ {(16<<2)|3,{115,116,57}}, +/* 16992 */ {(16<<2)|3,{115,116,61}}, +/* 16993 */ {(16<<2)|3,{115,116,65}}, +/* 16994 */ {(16<<2)|3,{115,116,95}}, +/* 16995 */ {(16<<2)|3,{115,116,98}}, +/* 16996 */ {(16<<2)|3,{115,116,100}}, +/* 16997 */ {(16<<2)|3,{115,116,102}}, +/* 16998 */ {(16<<2)|3,{115,116,103}}, +/* 16999 */ {(16<<2)|3,{115,116,104}}, +/* 17000 */ {(16<<2)|3,{115,116,108}}, +/* 17001 */ {(16<<2)|3,{115,116,109}}, +/* 17002 */ {(16<<2)|3,{115,116,110}}, +/* 17003 */ {(16<<2)|3,{115,116,112}}, +/* 17004 */ {(16<<2)|3,{115,116,114}}, +/* 17005 */ {(16<<2)|3,{115,116,117}}, +/* 17006 */ {(10<<2)|2,{115,116,0}}, +/* 17007 */ {(10<<2)|2,{115,116,0}}, +/* 17008 */ {(10<<2)|2,{115,116,0}}, +/* 17009 */ {(10<<2)|2,{115,116,0}}, +/* 17010 */ {(10<<2)|2,{115,116,0}}, +/* 17011 */ {(10<<2)|2,{115,116,0}}, +/* 17012 */ {(10<<2)|2,{115,116,0}}, +/* 17013 */ {(10<<2)|2,{115,116,0}}, +/* 17014 */ {(10<<2)|2,{115,116,0}}, +/* 17015 */ {(10<<2)|2,{115,116,0}}, +/* 17016 */ {(10<<2)|2,{115,116,0}}, +/* 17017 */ {(10<<2)|2,{115,116,0}}, +/* 17018 */ {(10<<2)|2,{115,116,0}}, +/* 17019 */ {(10<<2)|2,{115,116,0}}, +/* 17020 */ {(10<<2)|2,{115,116,0}}, +/* 17021 */ {(10<<2)|2,{115,116,0}}, +/* 17022 */ {(10<<2)|2,{115,116,0}}, +/* 17023 */ {(10<<2)|2,{115,116,0}}, +/* 17024 */ {(16<<2)|3,{115,32,48}}, +/* 17025 */ {(16<<2)|3,{115,32,49}}, +/* 17026 */ {(16<<2)|3,{115,32,50}}, +/* 17027 */ {(16<<2)|3,{115,32,97}}, +/* 17028 */ {(16<<2)|3,{115,32,99}}, +/* 17029 */ {(16<<2)|3,{115,32,101}}, +/* 17030 */ {(16<<2)|3,{115,32,105}}, +/* 17031 */ {(16<<2)|3,{115,32,111}}, +/* 17032 */ {(16<<2)|3,{115,32,115}}, +/* 17033 */ {(16<<2)|3,{115,32,116}}, +/* 17034 */ {(11<<2)|2,{115,32,0}}, +/* 17035 */ {(11<<2)|2,{115,32,0}}, +/* 17036 */ {(11<<2)|2,{115,32,0}}, +/* 17037 */ {(11<<2)|2,{115,32,0}}, +/* 17038 */ {(11<<2)|2,{115,32,0}}, +/* 17039 */ {(11<<2)|2,{115,32,0}}, +/* 17040 */ {(11<<2)|2,{115,32,0}}, +/* 17041 */ {(11<<2)|2,{115,32,0}}, +/* 17042 */ {(11<<2)|2,{115,32,0}}, +/* 17043 */ {(11<<2)|2,{115,32,0}}, +/* 17044 */ {(11<<2)|2,{115,32,0}}, +/* 17045 */ {(11<<2)|2,{115,32,0}}, +/* 17046 */ {(11<<2)|2,{115,32,0}}, +/* 17047 */ {(11<<2)|2,{115,32,0}}, +/* 17048 */ {(11<<2)|2,{115,32,0}}, +/* 17049 */ {(11<<2)|2,{115,32,0}}, +/* 17050 */ {(11<<2)|2,{115,32,0}}, +/* 17051 */ {(11<<2)|2,{115,32,0}}, +/* 17052 */ {(11<<2)|2,{115,32,0}}, +/* 17053 */ {(11<<2)|2,{115,32,0}}, +/* 17054 */ {(11<<2)|2,{115,32,0}}, +/* 17055 */ {(11<<2)|2,{115,32,0}}, +/* 17056 */ {(16<<2)|3,{115,37,48}}, +/* 17057 */ {(16<<2)|3,{115,37,49}}, +/* 17058 */ {(16<<2)|3,{115,37,50}}, +/* 17059 */ {(16<<2)|3,{115,37,97}}, +/* 17060 */ {(16<<2)|3,{115,37,99}}, +/* 17061 */ {(16<<2)|3,{115,37,101}}, +/* 17062 */ {(16<<2)|3,{115,37,105}}, +/* 17063 */ {(16<<2)|3,{115,37,111}}, +/* 17064 */ {(16<<2)|3,{115,37,115}}, +/* 17065 */ {(16<<2)|3,{115,37,116}}, +/* 17066 */ {(11<<2)|2,{115,37,0}}, +/* 17067 */ {(11<<2)|2,{115,37,0}}, +/* 17068 */ {(11<<2)|2,{115,37,0}}, +/* 17069 */ {(11<<2)|2,{115,37,0}}, +/* 17070 */ {(11<<2)|2,{115,37,0}}, +/* 17071 */ {(11<<2)|2,{115,37,0}}, +/* 17072 */ {(11<<2)|2,{115,37,0}}, +/* 17073 */ {(11<<2)|2,{115,37,0}}, +/* 17074 */ {(11<<2)|2,{115,37,0}}, +/* 17075 */ {(11<<2)|2,{115,37,0}}, +/* 17076 */ {(11<<2)|2,{115,37,0}}, +/* 17077 */ {(11<<2)|2,{115,37,0}}, +/* 17078 */ {(11<<2)|2,{115,37,0}}, +/* 17079 */ {(11<<2)|2,{115,37,0}}, +/* 17080 */ {(11<<2)|2,{115,37,0}}, +/* 17081 */ {(11<<2)|2,{115,37,0}}, +/* 17082 */ {(11<<2)|2,{115,37,0}}, +/* 17083 */ {(11<<2)|2,{115,37,0}}, +/* 17084 */ {(11<<2)|2,{115,37,0}}, +/* 17085 */ {(11<<2)|2,{115,37,0}}, +/* 17086 */ {(11<<2)|2,{115,37,0}}, +/* 17087 */ {(11<<2)|2,{115,37,0}}, +/* 17088 */ {(16<<2)|3,{115,45,48}}, +/* 17089 */ {(16<<2)|3,{115,45,49}}, +/* 17090 */ {(16<<2)|3,{115,45,50}}, +/* 17091 */ {(16<<2)|3,{115,45,97}}, +/* 17092 */ {(16<<2)|3,{115,45,99}}, +/* 17093 */ {(16<<2)|3,{115,45,101}}, +/* 17094 */ {(16<<2)|3,{115,45,105}}, +/* 17095 */ {(16<<2)|3,{115,45,111}}, +/* 17096 */ {(16<<2)|3,{115,45,115}}, +/* 17097 */ {(16<<2)|3,{115,45,116}}, +/* 17098 */ {(11<<2)|2,{115,45,0}}, +/* 17099 */ {(11<<2)|2,{115,45,0}}, +/* 17100 */ {(11<<2)|2,{115,45,0}}, +/* 17101 */ {(11<<2)|2,{115,45,0}}, +/* 17102 */ {(11<<2)|2,{115,45,0}}, +/* 17103 */ {(11<<2)|2,{115,45,0}}, +/* 17104 */ {(11<<2)|2,{115,45,0}}, +/* 17105 */ {(11<<2)|2,{115,45,0}}, +/* 17106 */ {(11<<2)|2,{115,45,0}}, +/* 17107 */ {(11<<2)|2,{115,45,0}}, +/* 17108 */ {(11<<2)|2,{115,45,0}}, +/* 17109 */ {(11<<2)|2,{115,45,0}}, +/* 17110 */ {(11<<2)|2,{115,45,0}}, +/* 17111 */ {(11<<2)|2,{115,45,0}}, +/* 17112 */ {(11<<2)|2,{115,45,0}}, +/* 17113 */ {(11<<2)|2,{115,45,0}}, +/* 17114 */ {(11<<2)|2,{115,45,0}}, +/* 17115 */ {(11<<2)|2,{115,45,0}}, +/* 17116 */ {(11<<2)|2,{115,45,0}}, +/* 17117 */ {(11<<2)|2,{115,45,0}}, +/* 17118 */ {(11<<2)|2,{115,45,0}}, +/* 17119 */ {(11<<2)|2,{115,45,0}}, +/* 17120 */ {(16<<2)|3,{115,46,48}}, +/* 17121 */ {(16<<2)|3,{115,46,49}}, +/* 17122 */ {(16<<2)|3,{115,46,50}}, +/* 17123 */ {(16<<2)|3,{115,46,97}}, +/* 17124 */ {(16<<2)|3,{115,46,99}}, +/* 17125 */ {(16<<2)|3,{115,46,101}}, +/* 17126 */ {(16<<2)|3,{115,46,105}}, +/* 17127 */ {(16<<2)|3,{115,46,111}}, +/* 17128 */ {(16<<2)|3,{115,46,115}}, +/* 17129 */ {(16<<2)|3,{115,46,116}}, +/* 17130 */ {(11<<2)|2,{115,46,0}}, +/* 17131 */ {(11<<2)|2,{115,46,0}}, +/* 17132 */ {(11<<2)|2,{115,46,0}}, +/* 17133 */ {(11<<2)|2,{115,46,0}}, +/* 17134 */ {(11<<2)|2,{115,46,0}}, +/* 17135 */ {(11<<2)|2,{115,46,0}}, +/* 17136 */ {(11<<2)|2,{115,46,0}}, +/* 17137 */ {(11<<2)|2,{115,46,0}}, +/* 17138 */ {(11<<2)|2,{115,46,0}}, +/* 17139 */ {(11<<2)|2,{115,46,0}}, +/* 17140 */ {(11<<2)|2,{115,46,0}}, +/* 17141 */ {(11<<2)|2,{115,46,0}}, +/* 17142 */ {(11<<2)|2,{115,46,0}}, +/* 17143 */ {(11<<2)|2,{115,46,0}}, +/* 17144 */ {(11<<2)|2,{115,46,0}}, +/* 17145 */ {(11<<2)|2,{115,46,0}}, +/* 17146 */ {(11<<2)|2,{115,46,0}}, +/* 17147 */ {(11<<2)|2,{115,46,0}}, +/* 17148 */ {(11<<2)|2,{115,46,0}}, +/* 17149 */ {(11<<2)|2,{115,46,0}}, +/* 17150 */ {(11<<2)|2,{115,46,0}}, +/* 17151 */ {(11<<2)|2,{115,46,0}}, +/* 17152 */ {(16<<2)|3,{115,47,48}}, +/* 17153 */ {(16<<2)|3,{115,47,49}}, +/* 17154 */ {(16<<2)|3,{115,47,50}}, +/* 17155 */ {(16<<2)|3,{115,47,97}}, +/* 17156 */ {(16<<2)|3,{115,47,99}}, +/* 17157 */ {(16<<2)|3,{115,47,101}}, +/* 17158 */ {(16<<2)|3,{115,47,105}}, +/* 17159 */ {(16<<2)|3,{115,47,111}}, +/* 17160 */ {(16<<2)|3,{115,47,115}}, +/* 17161 */ {(16<<2)|3,{115,47,116}}, +/* 17162 */ {(11<<2)|2,{115,47,0}}, +/* 17163 */ {(11<<2)|2,{115,47,0}}, +/* 17164 */ {(11<<2)|2,{115,47,0}}, +/* 17165 */ {(11<<2)|2,{115,47,0}}, +/* 17166 */ {(11<<2)|2,{115,47,0}}, +/* 17167 */ {(11<<2)|2,{115,47,0}}, +/* 17168 */ {(11<<2)|2,{115,47,0}}, +/* 17169 */ {(11<<2)|2,{115,47,0}}, +/* 17170 */ {(11<<2)|2,{115,47,0}}, +/* 17171 */ {(11<<2)|2,{115,47,0}}, +/* 17172 */ {(11<<2)|2,{115,47,0}}, +/* 17173 */ {(11<<2)|2,{115,47,0}}, +/* 17174 */ {(11<<2)|2,{115,47,0}}, +/* 17175 */ {(11<<2)|2,{115,47,0}}, +/* 17176 */ {(11<<2)|2,{115,47,0}}, +/* 17177 */ {(11<<2)|2,{115,47,0}}, +/* 17178 */ {(11<<2)|2,{115,47,0}}, +/* 17179 */ {(11<<2)|2,{115,47,0}}, +/* 17180 */ {(11<<2)|2,{115,47,0}}, +/* 17181 */ {(11<<2)|2,{115,47,0}}, +/* 17182 */ {(11<<2)|2,{115,47,0}}, +/* 17183 */ {(11<<2)|2,{115,47,0}}, +/* 17184 */ {(16<<2)|3,{115,51,48}}, +/* 17185 */ {(16<<2)|3,{115,51,49}}, +/* 17186 */ {(16<<2)|3,{115,51,50}}, +/* 17187 */ {(16<<2)|3,{115,51,97}}, +/* 17188 */ {(16<<2)|3,{115,51,99}}, +/* 17189 */ {(16<<2)|3,{115,51,101}}, +/* 17190 */ {(16<<2)|3,{115,51,105}}, +/* 17191 */ {(16<<2)|3,{115,51,111}}, +/* 17192 */ {(16<<2)|3,{115,51,115}}, +/* 17193 */ {(16<<2)|3,{115,51,116}}, +/* 17194 */ {(11<<2)|2,{115,51,0}}, +/* 17195 */ {(11<<2)|2,{115,51,0}}, +/* 17196 */ {(11<<2)|2,{115,51,0}}, +/* 17197 */ {(11<<2)|2,{115,51,0}}, +/* 17198 */ {(11<<2)|2,{115,51,0}}, +/* 17199 */ {(11<<2)|2,{115,51,0}}, +/* 17200 */ {(11<<2)|2,{115,51,0}}, +/* 17201 */ {(11<<2)|2,{115,51,0}}, +/* 17202 */ {(11<<2)|2,{115,51,0}}, +/* 17203 */ {(11<<2)|2,{115,51,0}}, +/* 17204 */ {(11<<2)|2,{115,51,0}}, +/* 17205 */ {(11<<2)|2,{115,51,0}}, +/* 17206 */ {(11<<2)|2,{115,51,0}}, +/* 17207 */ {(11<<2)|2,{115,51,0}}, +/* 17208 */ {(11<<2)|2,{115,51,0}}, +/* 17209 */ {(11<<2)|2,{115,51,0}}, +/* 17210 */ {(11<<2)|2,{115,51,0}}, +/* 17211 */ {(11<<2)|2,{115,51,0}}, +/* 17212 */ {(11<<2)|2,{115,51,0}}, +/* 17213 */ {(11<<2)|2,{115,51,0}}, +/* 17214 */ {(11<<2)|2,{115,51,0}}, +/* 17215 */ {(11<<2)|2,{115,51,0}}, +/* 17216 */ {(16<<2)|3,{115,52,48}}, +/* 17217 */ {(16<<2)|3,{115,52,49}}, +/* 17218 */ {(16<<2)|3,{115,52,50}}, +/* 17219 */ {(16<<2)|3,{115,52,97}}, +/* 17220 */ {(16<<2)|3,{115,52,99}}, +/* 17221 */ {(16<<2)|3,{115,52,101}}, +/* 17222 */ {(16<<2)|3,{115,52,105}}, +/* 17223 */ {(16<<2)|3,{115,52,111}}, +/* 17224 */ {(16<<2)|3,{115,52,115}}, +/* 17225 */ {(16<<2)|3,{115,52,116}}, +/* 17226 */ {(11<<2)|2,{115,52,0}}, +/* 17227 */ {(11<<2)|2,{115,52,0}}, +/* 17228 */ {(11<<2)|2,{115,52,0}}, +/* 17229 */ {(11<<2)|2,{115,52,0}}, +/* 17230 */ {(11<<2)|2,{115,52,0}}, +/* 17231 */ {(11<<2)|2,{115,52,0}}, +/* 17232 */ {(11<<2)|2,{115,52,0}}, +/* 17233 */ {(11<<2)|2,{115,52,0}}, +/* 17234 */ {(11<<2)|2,{115,52,0}}, +/* 17235 */ {(11<<2)|2,{115,52,0}}, +/* 17236 */ {(11<<2)|2,{115,52,0}}, +/* 17237 */ {(11<<2)|2,{115,52,0}}, +/* 17238 */ {(11<<2)|2,{115,52,0}}, +/* 17239 */ {(11<<2)|2,{115,52,0}}, +/* 17240 */ {(11<<2)|2,{115,52,0}}, +/* 17241 */ {(11<<2)|2,{115,52,0}}, +/* 17242 */ {(11<<2)|2,{115,52,0}}, +/* 17243 */ {(11<<2)|2,{115,52,0}}, +/* 17244 */ {(11<<2)|2,{115,52,0}}, +/* 17245 */ {(11<<2)|2,{115,52,0}}, +/* 17246 */ {(11<<2)|2,{115,52,0}}, +/* 17247 */ {(11<<2)|2,{115,52,0}}, +/* 17248 */ {(16<<2)|3,{115,53,48}}, +/* 17249 */ {(16<<2)|3,{115,53,49}}, +/* 17250 */ {(16<<2)|3,{115,53,50}}, +/* 17251 */ {(16<<2)|3,{115,53,97}}, +/* 17252 */ {(16<<2)|3,{115,53,99}}, +/* 17253 */ {(16<<2)|3,{115,53,101}}, +/* 17254 */ {(16<<2)|3,{115,53,105}}, +/* 17255 */ {(16<<2)|3,{115,53,111}}, +/* 17256 */ {(16<<2)|3,{115,53,115}}, +/* 17257 */ {(16<<2)|3,{115,53,116}}, +/* 17258 */ {(11<<2)|2,{115,53,0}}, +/* 17259 */ {(11<<2)|2,{115,53,0}}, +/* 17260 */ {(11<<2)|2,{115,53,0}}, +/* 17261 */ {(11<<2)|2,{115,53,0}}, +/* 17262 */ {(11<<2)|2,{115,53,0}}, +/* 17263 */ {(11<<2)|2,{115,53,0}}, +/* 17264 */ {(11<<2)|2,{115,53,0}}, +/* 17265 */ {(11<<2)|2,{115,53,0}}, +/* 17266 */ {(11<<2)|2,{115,53,0}}, +/* 17267 */ {(11<<2)|2,{115,53,0}}, +/* 17268 */ {(11<<2)|2,{115,53,0}}, +/* 17269 */ {(11<<2)|2,{115,53,0}}, +/* 17270 */ {(11<<2)|2,{115,53,0}}, +/* 17271 */ {(11<<2)|2,{115,53,0}}, +/* 17272 */ {(11<<2)|2,{115,53,0}}, +/* 17273 */ {(11<<2)|2,{115,53,0}}, +/* 17274 */ {(11<<2)|2,{115,53,0}}, +/* 17275 */ {(11<<2)|2,{115,53,0}}, +/* 17276 */ {(11<<2)|2,{115,53,0}}, +/* 17277 */ {(11<<2)|2,{115,53,0}}, +/* 17278 */ {(11<<2)|2,{115,53,0}}, +/* 17279 */ {(11<<2)|2,{115,53,0}}, +/* 17280 */ {(16<<2)|3,{115,54,48}}, +/* 17281 */ {(16<<2)|3,{115,54,49}}, +/* 17282 */ {(16<<2)|3,{115,54,50}}, +/* 17283 */ {(16<<2)|3,{115,54,97}}, +/* 17284 */ {(16<<2)|3,{115,54,99}}, +/* 17285 */ {(16<<2)|3,{115,54,101}}, +/* 17286 */ {(16<<2)|3,{115,54,105}}, +/* 17287 */ {(16<<2)|3,{115,54,111}}, +/* 17288 */ {(16<<2)|3,{115,54,115}}, +/* 17289 */ {(16<<2)|3,{115,54,116}}, +/* 17290 */ {(11<<2)|2,{115,54,0}}, +/* 17291 */ {(11<<2)|2,{115,54,0}}, +/* 17292 */ {(11<<2)|2,{115,54,0}}, +/* 17293 */ {(11<<2)|2,{115,54,0}}, +/* 17294 */ {(11<<2)|2,{115,54,0}}, +/* 17295 */ {(11<<2)|2,{115,54,0}}, +/* 17296 */ {(11<<2)|2,{115,54,0}}, +/* 17297 */ {(11<<2)|2,{115,54,0}}, +/* 17298 */ {(11<<2)|2,{115,54,0}}, +/* 17299 */ {(11<<2)|2,{115,54,0}}, +/* 17300 */ {(11<<2)|2,{115,54,0}}, +/* 17301 */ {(11<<2)|2,{115,54,0}}, +/* 17302 */ {(11<<2)|2,{115,54,0}}, +/* 17303 */ {(11<<2)|2,{115,54,0}}, +/* 17304 */ {(11<<2)|2,{115,54,0}}, +/* 17305 */ {(11<<2)|2,{115,54,0}}, +/* 17306 */ {(11<<2)|2,{115,54,0}}, +/* 17307 */ {(11<<2)|2,{115,54,0}}, +/* 17308 */ {(11<<2)|2,{115,54,0}}, +/* 17309 */ {(11<<2)|2,{115,54,0}}, +/* 17310 */ {(11<<2)|2,{115,54,0}}, +/* 17311 */ {(11<<2)|2,{115,54,0}}, +/* 17312 */ {(16<<2)|3,{115,55,48}}, +/* 17313 */ {(16<<2)|3,{115,55,49}}, +/* 17314 */ {(16<<2)|3,{115,55,50}}, +/* 17315 */ {(16<<2)|3,{115,55,97}}, +/* 17316 */ {(16<<2)|3,{115,55,99}}, +/* 17317 */ {(16<<2)|3,{115,55,101}}, +/* 17318 */ {(16<<2)|3,{115,55,105}}, +/* 17319 */ {(16<<2)|3,{115,55,111}}, +/* 17320 */ {(16<<2)|3,{115,55,115}}, +/* 17321 */ {(16<<2)|3,{115,55,116}}, +/* 17322 */ {(11<<2)|2,{115,55,0}}, +/* 17323 */ {(11<<2)|2,{115,55,0}}, +/* 17324 */ {(11<<2)|2,{115,55,0}}, +/* 17325 */ {(11<<2)|2,{115,55,0}}, +/* 17326 */ {(11<<2)|2,{115,55,0}}, +/* 17327 */ {(11<<2)|2,{115,55,0}}, +/* 17328 */ {(11<<2)|2,{115,55,0}}, +/* 17329 */ {(11<<2)|2,{115,55,0}}, +/* 17330 */ {(11<<2)|2,{115,55,0}}, +/* 17331 */ {(11<<2)|2,{115,55,0}}, +/* 17332 */ {(11<<2)|2,{115,55,0}}, +/* 17333 */ {(11<<2)|2,{115,55,0}}, +/* 17334 */ {(11<<2)|2,{115,55,0}}, +/* 17335 */ {(11<<2)|2,{115,55,0}}, +/* 17336 */ {(11<<2)|2,{115,55,0}}, +/* 17337 */ {(11<<2)|2,{115,55,0}}, +/* 17338 */ {(11<<2)|2,{115,55,0}}, +/* 17339 */ {(11<<2)|2,{115,55,0}}, +/* 17340 */ {(11<<2)|2,{115,55,0}}, +/* 17341 */ {(11<<2)|2,{115,55,0}}, +/* 17342 */ {(11<<2)|2,{115,55,0}}, +/* 17343 */ {(11<<2)|2,{115,55,0}}, +/* 17344 */ {(16<<2)|3,{115,56,48}}, +/* 17345 */ {(16<<2)|3,{115,56,49}}, +/* 17346 */ {(16<<2)|3,{115,56,50}}, +/* 17347 */ {(16<<2)|3,{115,56,97}}, +/* 17348 */ {(16<<2)|3,{115,56,99}}, +/* 17349 */ {(16<<2)|3,{115,56,101}}, +/* 17350 */ {(16<<2)|3,{115,56,105}}, +/* 17351 */ {(16<<2)|3,{115,56,111}}, +/* 17352 */ {(16<<2)|3,{115,56,115}}, +/* 17353 */ {(16<<2)|3,{115,56,116}}, +/* 17354 */ {(11<<2)|2,{115,56,0}}, +/* 17355 */ {(11<<2)|2,{115,56,0}}, +/* 17356 */ {(11<<2)|2,{115,56,0}}, +/* 17357 */ {(11<<2)|2,{115,56,0}}, +/* 17358 */ {(11<<2)|2,{115,56,0}}, +/* 17359 */ {(11<<2)|2,{115,56,0}}, +/* 17360 */ {(11<<2)|2,{115,56,0}}, +/* 17361 */ {(11<<2)|2,{115,56,0}}, +/* 17362 */ {(11<<2)|2,{115,56,0}}, +/* 17363 */ {(11<<2)|2,{115,56,0}}, +/* 17364 */ {(11<<2)|2,{115,56,0}}, +/* 17365 */ {(11<<2)|2,{115,56,0}}, +/* 17366 */ {(11<<2)|2,{115,56,0}}, +/* 17367 */ {(11<<2)|2,{115,56,0}}, +/* 17368 */ {(11<<2)|2,{115,56,0}}, +/* 17369 */ {(11<<2)|2,{115,56,0}}, +/* 17370 */ {(11<<2)|2,{115,56,0}}, +/* 17371 */ {(11<<2)|2,{115,56,0}}, +/* 17372 */ {(11<<2)|2,{115,56,0}}, +/* 17373 */ {(11<<2)|2,{115,56,0}}, +/* 17374 */ {(11<<2)|2,{115,56,0}}, +/* 17375 */ {(11<<2)|2,{115,56,0}}, +/* 17376 */ {(16<<2)|3,{115,57,48}}, +/* 17377 */ {(16<<2)|3,{115,57,49}}, +/* 17378 */ {(16<<2)|3,{115,57,50}}, +/* 17379 */ {(16<<2)|3,{115,57,97}}, +/* 17380 */ {(16<<2)|3,{115,57,99}}, +/* 17381 */ {(16<<2)|3,{115,57,101}}, +/* 17382 */ {(16<<2)|3,{115,57,105}}, +/* 17383 */ {(16<<2)|3,{115,57,111}}, +/* 17384 */ {(16<<2)|3,{115,57,115}}, +/* 17385 */ {(16<<2)|3,{115,57,116}}, +/* 17386 */ {(11<<2)|2,{115,57,0}}, +/* 17387 */ {(11<<2)|2,{115,57,0}}, +/* 17388 */ {(11<<2)|2,{115,57,0}}, +/* 17389 */ {(11<<2)|2,{115,57,0}}, +/* 17390 */ {(11<<2)|2,{115,57,0}}, +/* 17391 */ {(11<<2)|2,{115,57,0}}, +/* 17392 */ {(11<<2)|2,{115,57,0}}, +/* 17393 */ {(11<<2)|2,{115,57,0}}, +/* 17394 */ {(11<<2)|2,{115,57,0}}, +/* 17395 */ {(11<<2)|2,{115,57,0}}, +/* 17396 */ {(11<<2)|2,{115,57,0}}, +/* 17397 */ {(11<<2)|2,{115,57,0}}, +/* 17398 */ {(11<<2)|2,{115,57,0}}, +/* 17399 */ {(11<<2)|2,{115,57,0}}, +/* 17400 */ {(11<<2)|2,{115,57,0}}, +/* 17401 */ {(11<<2)|2,{115,57,0}}, +/* 17402 */ {(11<<2)|2,{115,57,0}}, +/* 17403 */ {(11<<2)|2,{115,57,0}}, +/* 17404 */ {(11<<2)|2,{115,57,0}}, +/* 17405 */ {(11<<2)|2,{115,57,0}}, +/* 17406 */ {(11<<2)|2,{115,57,0}}, +/* 17407 */ {(11<<2)|2,{115,57,0}}, +/* 17408 */ {(16<<2)|3,{115,61,48}}, +/* 17409 */ {(16<<2)|3,{115,61,49}}, +/* 17410 */ {(16<<2)|3,{115,61,50}}, +/* 17411 */ {(16<<2)|3,{115,61,97}}, +/* 17412 */ {(16<<2)|3,{115,61,99}}, +/* 17413 */ {(16<<2)|3,{115,61,101}}, +/* 17414 */ {(16<<2)|3,{115,61,105}}, +/* 17415 */ {(16<<2)|3,{115,61,111}}, +/* 17416 */ {(16<<2)|3,{115,61,115}}, +/* 17417 */ {(16<<2)|3,{115,61,116}}, +/* 17418 */ {(11<<2)|2,{115,61,0}}, +/* 17419 */ {(11<<2)|2,{115,61,0}}, +/* 17420 */ {(11<<2)|2,{115,61,0}}, +/* 17421 */ {(11<<2)|2,{115,61,0}}, +/* 17422 */ {(11<<2)|2,{115,61,0}}, +/* 17423 */ {(11<<2)|2,{115,61,0}}, +/* 17424 */ {(11<<2)|2,{115,61,0}}, +/* 17425 */ {(11<<2)|2,{115,61,0}}, +/* 17426 */ {(11<<2)|2,{115,61,0}}, +/* 17427 */ {(11<<2)|2,{115,61,0}}, +/* 17428 */ {(11<<2)|2,{115,61,0}}, +/* 17429 */ {(11<<2)|2,{115,61,0}}, +/* 17430 */ {(11<<2)|2,{115,61,0}}, +/* 17431 */ {(11<<2)|2,{115,61,0}}, +/* 17432 */ {(11<<2)|2,{115,61,0}}, +/* 17433 */ {(11<<2)|2,{115,61,0}}, +/* 17434 */ {(11<<2)|2,{115,61,0}}, +/* 17435 */ {(11<<2)|2,{115,61,0}}, +/* 17436 */ {(11<<2)|2,{115,61,0}}, +/* 17437 */ {(11<<2)|2,{115,61,0}}, +/* 17438 */ {(11<<2)|2,{115,61,0}}, +/* 17439 */ {(11<<2)|2,{115,61,0}}, +/* 17440 */ {(16<<2)|3,{115,65,48}}, +/* 17441 */ {(16<<2)|3,{115,65,49}}, +/* 17442 */ {(16<<2)|3,{115,65,50}}, +/* 17443 */ {(16<<2)|3,{115,65,97}}, +/* 17444 */ {(16<<2)|3,{115,65,99}}, +/* 17445 */ {(16<<2)|3,{115,65,101}}, +/* 17446 */ {(16<<2)|3,{115,65,105}}, +/* 17447 */ {(16<<2)|3,{115,65,111}}, +/* 17448 */ {(16<<2)|3,{115,65,115}}, +/* 17449 */ {(16<<2)|3,{115,65,116}}, +/* 17450 */ {(11<<2)|2,{115,65,0}}, +/* 17451 */ {(11<<2)|2,{115,65,0}}, +/* 17452 */ {(11<<2)|2,{115,65,0}}, +/* 17453 */ {(11<<2)|2,{115,65,0}}, +/* 17454 */ {(11<<2)|2,{115,65,0}}, +/* 17455 */ {(11<<2)|2,{115,65,0}}, +/* 17456 */ {(11<<2)|2,{115,65,0}}, +/* 17457 */ {(11<<2)|2,{115,65,0}}, +/* 17458 */ {(11<<2)|2,{115,65,0}}, +/* 17459 */ {(11<<2)|2,{115,65,0}}, +/* 17460 */ {(11<<2)|2,{115,65,0}}, +/* 17461 */ {(11<<2)|2,{115,65,0}}, +/* 17462 */ {(11<<2)|2,{115,65,0}}, +/* 17463 */ {(11<<2)|2,{115,65,0}}, +/* 17464 */ {(11<<2)|2,{115,65,0}}, +/* 17465 */ {(11<<2)|2,{115,65,0}}, +/* 17466 */ {(11<<2)|2,{115,65,0}}, +/* 17467 */ {(11<<2)|2,{115,65,0}}, +/* 17468 */ {(11<<2)|2,{115,65,0}}, +/* 17469 */ {(11<<2)|2,{115,65,0}}, +/* 17470 */ {(11<<2)|2,{115,65,0}}, +/* 17471 */ {(11<<2)|2,{115,65,0}}, +/* 17472 */ {(16<<2)|3,{115,95,48}}, +/* 17473 */ {(16<<2)|3,{115,95,49}}, +/* 17474 */ {(16<<2)|3,{115,95,50}}, +/* 17475 */ {(16<<2)|3,{115,95,97}}, +/* 17476 */ {(16<<2)|3,{115,95,99}}, +/* 17477 */ {(16<<2)|3,{115,95,101}}, +/* 17478 */ {(16<<2)|3,{115,95,105}}, +/* 17479 */ {(16<<2)|3,{115,95,111}}, +/* 17480 */ {(16<<2)|3,{115,95,115}}, +/* 17481 */ {(16<<2)|3,{115,95,116}}, +/* 17482 */ {(11<<2)|2,{115,95,0}}, +/* 17483 */ {(11<<2)|2,{115,95,0}}, +/* 17484 */ {(11<<2)|2,{115,95,0}}, +/* 17485 */ {(11<<2)|2,{115,95,0}}, +/* 17486 */ {(11<<2)|2,{115,95,0}}, +/* 17487 */ {(11<<2)|2,{115,95,0}}, +/* 17488 */ {(11<<2)|2,{115,95,0}}, +/* 17489 */ {(11<<2)|2,{115,95,0}}, +/* 17490 */ {(11<<2)|2,{115,95,0}}, +/* 17491 */ {(11<<2)|2,{115,95,0}}, +/* 17492 */ {(11<<2)|2,{115,95,0}}, +/* 17493 */ {(11<<2)|2,{115,95,0}}, +/* 17494 */ {(11<<2)|2,{115,95,0}}, +/* 17495 */ {(11<<2)|2,{115,95,0}}, +/* 17496 */ {(11<<2)|2,{115,95,0}}, +/* 17497 */ {(11<<2)|2,{115,95,0}}, +/* 17498 */ {(11<<2)|2,{115,95,0}}, +/* 17499 */ {(11<<2)|2,{115,95,0}}, +/* 17500 */ {(11<<2)|2,{115,95,0}}, +/* 17501 */ {(11<<2)|2,{115,95,0}}, +/* 17502 */ {(11<<2)|2,{115,95,0}}, +/* 17503 */ {(11<<2)|2,{115,95,0}}, +/* 17504 */ {(16<<2)|3,{115,98,48}}, +/* 17505 */ {(16<<2)|3,{115,98,49}}, +/* 17506 */ {(16<<2)|3,{115,98,50}}, +/* 17507 */ {(16<<2)|3,{115,98,97}}, +/* 17508 */ {(16<<2)|3,{115,98,99}}, +/* 17509 */ {(16<<2)|3,{115,98,101}}, +/* 17510 */ {(16<<2)|3,{115,98,105}}, +/* 17511 */ {(16<<2)|3,{115,98,111}}, +/* 17512 */ {(16<<2)|3,{115,98,115}}, +/* 17513 */ {(16<<2)|3,{115,98,116}}, +/* 17514 */ {(11<<2)|2,{115,98,0}}, +/* 17515 */ {(11<<2)|2,{115,98,0}}, +/* 17516 */ {(11<<2)|2,{115,98,0}}, +/* 17517 */ {(11<<2)|2,{115,98,0}}, +/* 17518 */ {(11<<2)|2,{115,98,0}}, +/* 17519 */ {(11<<2)|2,{115,98,0}}, +/* 17520 */ {(11<<2)|2,{115,98,0}}, +/* 17521 */ {(11<<2)|2,{115,98,0}}, +/* 17522 */ {(11<<2)|2,{115,98,0}}, +/* 17523 */ {(11<<2)|2,{115,98,0}}, +/* 17524 */ {(11<<2)|2,{115,98,0}}, +/* 17525 */ {(11<<2)|2,{115,98,0}}, +/* 17526 */ {(11<<2)|2,{115,98,0}}, +/* 17527 */ {(11<<2)|2,{115,98,0}}, +/* 17528 */ {(11<<2)|2,{115,98,0}}, +/* 17529 */ {(11<<2)|2,{115,98,0}}, +/* 17530 */ {(11<<2)|2,{115,98,0}}, +/* 17531 */ {(11<<2)|2,{115,98,0}}, +/* 17532 */ {(11<<2)|2,{115,98,0}}, +/* 17533 */ {(11<<2)|2,{115,98,0}}, +/* 17534 */ {(11<<2)|2,{115,98,0}}, +/* 17535 */ {(11<<2)|2,{115,98,0}}, +/* 17536 */ {(16<<2)|3,{115,100,48}}, +/* 17537 */ {(16<<2)|3,{115,100,49}}, +/* 17538 */ {(16<<2)|3,{115,100,50}}, +/* 17539 */ {(16<<2)|3,{115,100,97}}, +/* 17540 */ {(16<<2)|3,{115,100,99}}, +/* 17541 */ {(16<<2)|3,{115,100,101}}, +/* 17542 */ {(16<<2)|3,{115,100,105}}, +/* 17543 */ {(16<<2)|3,{115,100,111}}, +/* 17544 */ {(16<<2)|3,{115,100,115}}, +/* 17545 */ {(16<<2)|3,{115,100,116}}, +/* 17546 */ {(11<<2)|2,{115,100,0}}, +/* 17547 */ {(11<<2)|2,{115,100,0}}, +/* 17548 */ {(11<<2)|2,{115,100,0}}, +/* 17549 */ {(11<<2)|2,{115,100,0}}, +/* 17550 */ {(11<<2)|2,{115,100,0}}, +/* 17551 */ {(11<<2)|2,{115,100,0}}, +/* 17552 */ {(11<<2)|2,{115,100,0}}, +/* 17553 */ {(11<<2)|2,{115,100,0}}, +/* 17554 */ {(11<<2)|2,{115,100,0}}, +/* 17555 */ {(11<<2)|2,{115,100,0}}, +/* 17556 */ {(11<<2)|2,{115,100,0}}, +/* 17557 */ {(11<<2)|2,{115,100,0}}, +/* 17558 */ {(11<<2)|2,{115,100,0}}, +/* 17559 */ {(11<<2)|2,{115,100,0}}, +/* 17560 */ {(11<<2)|2,{115,100,0}}, +/* 17561 */ {(11<<2)|2,{115,100,0}}, +/* 17562 */ {(11<<2)|2,{115,100,0}}, +/* 17563 */ {(11<<2)|2,{115,100,0}}, +/* 17564 */ {(11<<2)|2,{115,100,0}}, +/* 17565 */ {(11<<2)|2,{115,100,0}}, +/* 17566 */ {(11<<2)|2,{115,100,0}}, +/* 17567 */ {(11<<2)|2,{115,100,0}}, +/* 17568 */ {(16<<2)|3,{115,102,48}}, +/* 17569 */ {(16<<2)|3,{115,102,49}}, +/* 17570 */ {(16<<2)|3,{115,102,50}}, +/* 17571 */ {(16<<2)|3,{115,102,97}}, +/* 17572 */ {(16<<2)|3,{115,102,99}}, +/* 17573 */ {(16<<2)|3,{115,102,101}}, +/* 17574 */ {(16<<2)|3,{115,102,105}}, +/* 17575 */ {(16<<2)|3,{115,102,111}}, +/* 17576 */ {(16<<2)|3,{115,102,115}}, +/* 17577 */ {(16<<2)|3,{115,102,116}}, +/* 17578 */ {(11<<2)|2,{115,102,0}}, +/* 17579 */ {(11<<2)|2,{115,102,0}}, +/* 17580 */ {(11<<2)|2,{115,102,0}}, +/* 17581 */ {(11<<2)|2,{115,102,0}}, +/* 17582 */ {(11<<2)|2,{115,102,0}}, +/* 17583 */ {(11<<2)|2,{115,102,0}}, +/* 17584 */ {(11<<2)|2,{115,102,0}}, +/* 17585 */ {(11<<2)|2,{115,102,0}}, +/* 17586 */ {(11<<2)|2,{115,102,0}}, +/* 17587 */ {(11<<2)|2,{115,102,0}}, +/* 17588 */ {(11<<2)|2,{115,102,0}}, +/* 17589 */ {(11<<2)|2,{115,102,0}}, +/* 17590 */ {(11<<2)|2,{115,102,0}}, +/* 17591 */ {(11<<2)|2,{115,102,0}}, +/* 17592 */ {(11<<2)|2,{115,102,0}}, +/* 17593 */ {(11<<2)|2,{115,102,0}}, +/* 17594 */ {(11<<2)|2,{115,102,0}}, +/* 17595 */ {(11<<2)|2,{115,102,0}}, +/* 17596 */ {(11<<2)|2,{115,102,0}}, +/* 17597 */ {(11<<2)|2,{115,102,0}}, +/* 17598 */ {(11<<2)|2,{115,102,0}}, +/* 17599 */ {(11<<2)|2,{115,102,0}}, +/* 17600 */ {(16<<2)|3,{115,103,48}}, +/* 17601 */ {(16<<2)|3,{115,103,49}}, +/* 17602 */ {(16<<2)|3,{115,103,50}}, +/* 17603 */ {(16<<2)|3,{115,103,97}}, +/* 17604 */ {(16<<2)|3,{115,103,99}}, +/* 17605 */ {(16<<2)|3,{115,103,101}}, +/* 17606 */ {(16<<2)|3,{115,103,105}}, +/* 17607 */ {(16<<2)|3,{115,103,111}}, +/* 17608 */ {(16<<2)|3,{115,103,115}}, +/* 17609 */ {(16<<2)|3,{115,103,116}}, +/* 17610 */ {(11<<2)|2,{115,103,0}}, +/* 17611 */ {(11<<2)|2,{115,103,0}}, +/* 17612 */ {(11<<2)|2,{115,103,0}}, +/* 17613 */ {(11<<2)|2,{115,103,0}}, +/* 17614 */ {(11<<2)|2,{115,103,0}}, +/* 17615 */ {(11<<2)|2,{115,103,0}}, +/* 17616 */ {(11<<2)|2,{115,103,0}}, +/* 17617 */ {(11<<2)|2,{115,103,0}}, +/* 17618 */ {(11<<2)|2,{115,103,0}}, +/* 17619 */ {(11<<2)|2,{115,103,0}}, +/* 17620 */ {(11<<2)|2,{115,103,0}}, +/* 17621 */ {(11<<2)|2,{115,103,0}}, +/* 17622 */ {(11<<2)|2,{115,103,0}}, +/* 17623 */ {(11<<2)|2,{115,103,0}}, +/* 17624 */ {(11<<2)|2,{115,103,0}}, +/* 17625 */ {(11<<2)|2,{115,103,0}}, +/* 17626 */ {(11<<2)|2,{115,103,0}}, +/* 17627 */ {(11<<2)|2,{115,103,0}}, +/* 17628 */ {(11<<2)|2,{115,103,0}}, +/* 17629 */ {(11<<2)|2,{115,103,0}}, +/* 17630 */ {(11<<2)|2,{115,103,0}}, +/* 17631 */ {(11<<2)|2,{115,103,0}}, +/* 17632 */ {(16<<2)|3,{115,104,48}}, +/* 17633 */ {(16<<2)|3,{115,104,49}}, +/* 17634 */ {(16<<2)|3,{115,104,50}}, +/* 17635 */ {(16<<2)|3,{115,104,97}}, +/* 17636 */ {(16<<2)|3,{115,104,99}}, +/* 17637 */ {(16<<2)|3,{115,104,101}}, +/* 17638 */ {(16<<2)|3,{115,104,105}}, +/* 17639 */ {(16<<2)|3,{115,104,111}}, +/* 17640 */ {(16<<2)|3,{115,104,115}}, +/* 17641 */ {(16<<2)|3,{115,104,116}}, +/* 17642 */ {(11<<2)|2,{115,104,0}}, +/* 17643 */ {(11<<2)|2,{115,104,0}}, +/* 17644 */ {(11<<2)|2,{115,104,0}}, +/* 17645 */ {(11<<2)|2,{115,104,0}}, +/* 17646 */ {(11<<2)|2,{115,104,0}}, +/* 17647 */ {(11<<2)|2,{115,104,0}}, +/* 17648 */ {(11<<2)|2,{115,104,0}}, +/* 17649 */ {(11<<2)|2,{115,104,0}}, +/* 17650 */ {(11<<2)|2,{115,104,0}}, +/* 17651 */ {(11<<2)|2,{115,104,0}}, +/* 17652 */ {(11<<2)|2,{115,104,0}}, +/* 17653 */ {(11<<2)|2,{115,104,0}}, +/* 17654 */ {(11<<2)|2,{115,104,0}}, +/* 17655 */ {(11<<2)|2,{115,104,0}}, +/* 17656 */ {(11<<2)|2,{115,104,0}}, +/* 17657 */ {(11<<2)|2,{115,104,0}}, +/* 17658 */ {(11<<2)|2,{115,104,0}}, +/* 17659 */ {(11<<2)|2,{115,104,0}}, +/* 17660 */ {(11<<2)|2,{115,104,0}}, +/* 17661 */ {(11<<2)|2,{115,104,0}}, +/* 17662 */ {(11<<2)|2,{115,104,0}}, +/* 17663 */ {(11<<2)|2,{115,104,0}}, +/* 17664 */ {(16<<2)|3,{115,108,48}}, +/* 17665 */ {(16<<2)|3,{115,108,49}}, +/* 17666 */ {(16<<2)|3,{115,108,50}}, +/* 17667 */ {(16<<2)|3,{115,108,97}}, +/* 17668 */ {(16<<2)|3,{115,108,99}}, +/* 17669 */ {(16<<2)|3,{115,108,101}}, +/* 17670 */ {(16<<2)|3,{115,108,105}}, +/* 17671 */ {(16<<2)|3,{115,108,111}}, +/* 17672 */ {(16<<2)|3,{115,108,115}}, +/* 17673 */ {(16<<2)|3,{115,108,116}}, +/* 17674 */ {(11<<2)|2,{115,108,0}}, +/* 17675 */ {(11<<2)|2,{115,108,0}}, +/* 17676 */ {(11<<2)|2,{115,108,0}}, +/* 17677 */ {(11<<2)|2,{115,108,0}}, +/* 17678 */ {(11<<2)|2,{115,108,0}}, +/* 17679 */ {(11<<2)|2,{115,108,0}}, +/* 17680 */ {(11<<2)|2,{115,108,0}}, +/* 17681 */ {(11<<2)|2,{115,108,0}}, +/* 17682 */ {(11<<2)|2,{115,108,0}}, +/* 17683 */ {(11<<2)|2,{115,108,0}}, +/* 17684 */ {(11<<2)|2,{115,108,0}}, +/* 17685 */ {(11<<2)|2,{115,108,0}}, +/* 17686 */ {(11<<2)|2,{115,108,0}}, +/* 17687 */ {(11<<2)|2,{115,108,0}}, +/* 17688 */ {(11<<2)|2,{115,108,0}}, +/* 17689 */ {(11<<2)|2,{115,108,0}}, +/* 17690 */ {(11<<2)|2,{115,108,0}}, +/* 17691 */ {(11<<2)|2,{115,108,0}}, +/* 17692 */ {(11<<2)|2,{115,108,0}}, +/* 17693 */ {(11<<2)|2,{115,108,0}}, +/* 17694 */ {(11<<2)|2,{115,108,0}}, +/* 17695 */ {(11<<2)|2,{115,108,0}}, +/* 17696 */ {(16<<2)|3,{115,109,48}}, +/* 17697 */ {(16<<2)|3,{115,109,49}}, +/* 17698 */ {(16<<2)|3,{115,109,50}}, +/* 17699 */ {(16<<2)|3,{115,109,97}}, +/* 17700 */ {(16<<2)|3,{115,109,99}}, +/* 17701 */ {(16<<2)|3,{115,109,101}}, +/* 17702 */ {(16<<2)|3,{115,109,105}}, +/* 17703 */ {(16<<2)|3,{115,109,111}}, +/* 17704 */ {(16<<2)|3,{115,109,115}}, +/* 17705 */ {(16<<2)|3,{115,109,116}}, +/* 17706 */ {(11<<2)|2,{115,109,0}}, +/* 17707 */ {(11<<2)|2,{115,109,0}}, +/* 17708 */ {(11<<2)|2,{115,109,0}}, +/* 17709 */ {(11<<2)|2,{115,109,0}}, +/* 17710 */ {(11<<2)|2,{115,109,0}}, +/* 17711 */ {(11<<2)|2,{115,109,0}}, +/* 17712 */ {(11<<2)|2,{115,109,0}}, +/* 17713 */ {(11<<2)|2,{115,109,0}}, +/* 17714 */ {(11<<2)|2,{115,109,0}}, +/* 17715 */ {(11<<2)|2,{115,109,0}}, +/* 17716 */ {(11<<2)|2,{115,109,0}}, +/* 17717 */ {(11<<2)|2,{115,109,0}}, +/* 17718 */ {(11<<2)|2,{115,109,0}}, +/* 17719 */ {(11<<2)|2,{115,109,0}}, +/* 17720 */ {(11<<2)|2,{115,109,0}}, +/* 17721 */ {(11<<2)|2,{115,109,0}}, +/* 17722 */ {(11<<2)|2,{115,109,0}}, +/* 17723 */ {(11<<2)|2,{115,109,0}}, +/* 17724 */ {(11<<2)|2,{115,109,0}}, +/* 17725 */ {(11<<2)|2,{115,109,0}}, +/* 17726 */ {(11<<2)|2,{115,109,0}}, +/* 17727 */ {(11<<2)|2,{115,109,0}}, +/* 17728 */ {(16<<2)|3,{115,110,48}}, +/* 17729 */ {(16<<2)|3,{115,110,49}}, +/* 17730 */ {(16<<2)|3,{115,110,50}}, +/* 17731 */ {(16<<2)|3,{115,110,97}}, +/* 17732 */ {(16<<2)|3,{115,110,99}}, +/* 17733 */ {(16<<2)|3,{115,110,101}}, +/* 17734 */ {(16<<2)|3,{115,110,105}}, +/* 17735 */ {(16<<2)|3,{115,110,111}}, +/* 17736 */ {(16<<2)|3,{115,110,115}}, +/* 17737 */ {(16<<2)|3,{115,110,116}}, +/* 17738 */ {(11<<2)|2,{115,110,0}}, +/* 17739 */ {(11<<2)|2,{115,110,0}}, +/* 17740 */ {(11<<2)|2,{115,110,0}}, +/* 17741 */ {(11<<2)|2,{115,110,0}}, +/* 17742 */ {(11<<2)|2,{115,110,0}}, +/* 17743 */ {(11<<2)|2,{115,110,0}}, +/* 17744 */ {(11<<2)|2,{115,110,0}}, +/* 17745 */ {(11<<2)|2,{115,110,0}}, +/* 17746 */ {(11<<2)|2,{115,110,0}}, +/* 17747 */ {(11<<2)|2,{115,110,0}}, +/* 17748 */ {(11<<2)|2,{115,110,0}}, +/* 17749 */ {(11<<2)|2,{115,110,0}}, +/* 17750 */ {(11<<2)|2,{115,110,0}}, +/* 17751 */ {(11<<2)|2,{115,110,0}}, +/* 17752 */ {(11<<2)|2,{115,110,0}}, +/* 17753 */ {(11<<2)|2,{115,110,0}}, +/* 17754 */ {(11<<2)|2,{115,110,0}}, +/* 17755 */ {(11<<2)|2,{115,110,0}}, +/* 17756 */ {(11<<2)|2,{115,110,0}}, +/* 17757 */ {(11<<2)|2,{115,110,0}}, +/* 17758 */ {(11<<2)|2,{115,110,0}}, +/* 17759 */ {(11<<2)|2,{115,110,0}}, +/* 17760 */ {(16<<2)|3,{115,112,48}}, +/* 17761 */ {(16<<2)|3,{115,112,49}}, +/* 17762 */ {(16<<2)|3,{115,112,50}}, +/* 17763 */ {(16<<2)|3,{115,112,97}}, +/* 17764 */ {(16<<2)|3,{115,112,99}}, +/* 17765 */ {(16<<2)|3,{115,112,101}}, +/* 17766 */ {(16<<2)|3,{115,112,105}}, +/* 17767 */ {(16<<2)|3,{115,112,111}}, +/* 17768 */ {(16<<2)|3,{115,112,115}}, +/* 17769 */ {(16<<2)|3,{115,112,116}}, +/* 17770 */ {(11<<2)|2,{115,112,0}}, +/* 17771 */ {(11<<2)|2,{115,112,0}}, +/* 17772 */ {(11<<2)|2,{115,112,0}}, +/* 17773 */ {(11<<2)|2,{115,112,0}}, +/* 17774 */ {(11<<2)|2,{115,112,0}}, +/* 17775 */ {(11<<2)|2,{115,112,0}}, +/* 17776 */ {(11<<2)|2,{115,112,0}}, +/* 17777 */ {(11<<2)|2,{115,112,0}}, +/* 17778 */ {(11<<2)|2,{115,112,0}}, +/* 17779 */ {(11<<2)|2,{115,112,0}}, +/* 17780 */ {(11<<2)|2,{115,112,0}}, +/* 17781 */ {(11<<2)|2,{115,112,0}}, +/* 17782 */ {(11<<2)|2,{115,112,0}}, +/* 17783 */ {(11<<2)|2,{115,112,0}}, +/* 17784 */ {(11<<2)|2,{115,112,0}}, +/* 17785 */ {(11<<2)|2,{115,112,0}}, +/* 17786 */ {(11<<2)|2,{115,112,0}}, +/* 17787 */ {(11<<2)|2,{115,112,0}}, +/* 17788 */ {(11<<2)|2,{115,112,0}}, +/* 17789 */ {(11<<2)|2,{115,112,0}}, +/* 17790 */ {(11<<2)|2,{115,112,0}}, +/* 17791 */ {(11<<2)|2,{115,112,0}}, +/* 17792 */ {(16<<2)|3,{115,114,48}}, +/* 17793 */ {(16<<2)|3,{115,114,49}}, +/* 17794 */ {(16<<2)|3,{115,114,50}}, +/* 17795 */ {(16<<2)|3,{115,114,97}}, +/* 17796 */ {(16<<2)|3,{115,114,99}}, +/* 17797 */ {(16<<2)|3,{115,114,101}}, +/* 17798 */ {(16<<2)|3,{115,114,105}}, +/* 17799 */ {(16<<2)|3,{115,114,111}}, +/* 17800 */ {(16<<2)|3,{115,114,115}}, +/* 17801 */ {(16<<2)|3,{115,114,116}}, +/* 17802 */ {(11<<2)|2,{115,114,0}}, +/* 17803 */ {(11<<2)|2,{115,114,0}}, +/* 17804 */ {(11<<2)|2,{115,114,0}}, +/* 17805 */ {(11<<2)|2,{115,114,0}}, +/* 17806 */ {(11<<2)|2,{115,114,0}}, +/* 17807 */ {(11<<2)|2,{115,114,0}}, +/* 17808 */ {(11<<2)|2,{115,114,0}}, +/* 17809 */ {(11<<2)|2,{115,114,0}}, +/* 17810 */ {(11<<2)|2,{115,114,0}}, +/* 17811 */ {(11<<2)|2,{115,114,0}}, +/* 17812 */ {(11<<2)|2,{115,114,0}}, +/* 17813 */ {(11<<2)|2,{115,114,0}}, +/* 17814 */ {(11<<2)|2,{115,114,0}}, +/* 17815 */ {(11<<2)|2,{115,114,0}}, +/* 17816 */ {(11<<2)|2,{115,114,0}}, +/* 17817 */ {(11<<2)|2,{115,114,0}}, +/* 17818 */ {(11<<2)|2,{115,114,0}}, +/* 17819 */ {(11<<2)|2,{115,114,0}}, +/* 17820 */ {(11<<2)|2,{115,114,0}}, +/* 17821 */ {(11<<2)|2,{115,114,0}}, +/* 17822 */ {(11<<2)|2,{115,114,0}}, +/* 17823 */ {(11<<2)|2,{115,114,0}}, +/* 17824 */ {(16<<2)|3,{115,117,48}}, +/* 17825 */ {(16<<2)|3,{115,117,49}}, +/* 17826 */ {(16<<2)|3,{115,117,50}}, +/* 17827 */ {(16<<2)|3,{115,117,97}}, +/* 17828 */ {(16<<2)|3,{115,117,99}}, +/* 17829 */ {(16<<2)|3,{115,117,101}}, +/* 17830 */ {(16<<2)|3,{115,117,105}}, +/* 17831 */ {(16<<2)|3,{115,117,111}}, +/* 17832 */ {(16<<2)|3,{115,117,115}}, +/* 17833 */ {(16<<2)|3,{115,117,116}}, +/* 17834 */ {(11<<2)|2,{115,117,0}}, +/* 17835 */ {(11<<2)|2,{115,117,0}}, +/* 17836 */ {(11<<2)|2,{115,117,0}}, +/* 17837 */ {(11<<2)|2,{115,117,0}}, +/* 17838 */ {(11<<2)|2,{115,117,0}}, +/* 17839 */ {(11<<2)|2,{115,117,0}}, +/* 17840 */ {(11<<2)|2,{115,117,0}}, +/* 17841 */ {(11<<2)|2,{115,117,0}}, +/* 17842 */ {(11<<2)|2,{115,117,0}}, +/* 17843 */ {(11<<2)|2,{115,117,0}}, +/* 17844 */ {(11<<2)|2,{115,117,0}}, +/* 17845 */ {(11<<2)|2,{115,117,0}}, +/* 17846 */ {(11<<2)|2,{115,117,0}}, +/* 17847 */ {(11<<2)|2,{115,117,0}}, +/* 17848 */ {(11<<2)|2,{115,117,0}}, +/* 17849 */ {(11<<2)|2,{115,117,0}}, +/* 17850 */ {(11<<2)|2,{115,117,0}}, +/* 17851 */ {(11<<2)|2,{115,117,0}}, +/* 17852 */ {(11<<2)|2,{115,117,0}}, +/* 17853 */ {(11<<2)|2,{115,117,0}}, +/* 17854 */ {(11<<2)|2,{115,117,0}}, +/* 17855 */ {(11<<2)|2,{115,117,0}}, +/* 17856 */ {(12<<2)|2,{115,58,0}}, +/* 17857 */ {(12<<2)|2,{115,58,0}}, +/* 17858 */ {(12<<2)|2,{115,58,0}}, +/* 17859 */ {(12<<2)|2,{115,58,0}}, +/* 17860 */ {(12<<2)|2,{115,58,0}}, +/* 17861 */ {(12<<2)|2,{115,58,0}}, +/* 17862 */ {(12<<2)|2,{115,58,0}}, +/* 17863 */ {(12<<2)|2,{115,58,0}}, +/* 17864 */ {(12<<2)|2,{115,58,0}}, +/* 17865 */ {(12<<2)|2,{115,58,0}}, +/* 17866 */ {(12<<2)|2,{115,58,0}}, +/* 17867 */ {(12<<2)|2,{115,58,0}}, +/* 17868 */ {(12<<2)|2,{115,58,0}}, +/* 17869 */ {(12<<2)|2,{115,58,0}}, +/* 17870 */ {(12<<2)|2,{115,58,0}}, +/* 17871 */ {(12<<2)|2,{115,58,0}}, +/* 17872 */ {(12<<2)|2,{115,66,0}}, +/* 17873 */ {(12<<2)|2,{115,66,0}}, +/* 17874 */ {(12<<2)|2,{115,66,0}}, +/* 17875 */ {(12<<2)|2,{115,66,0}}, +/* 17876 */ {(12<<2)|2,{115,66,0}}, +/* 17877 */ {(12<<2)|2,{115,66,0}}, +/* 17878 */ {(12<<2)|2,{115,66,0}}, +/* 17879 */ {(12<<2)|2,{115,66,0}}, +/* 17880 */ {(12<<2)|2,{115,66,0}}, +/* 17881 */ {(12<<2)|2,{115,66,0}}, +/* 17882 */ {(12<<2)|2,{115,66,0}}, +/* 17883 */ {(12<<2)|2,{115,66,0}}, +/* 17884 */ {(12<<2)|2,{115,66,0}}, +/* 17885 */ {(12<<2)|2,{115,66,0}}, +/* 17886 */ {(12<<2)|2,{115,66,0}}, +/* 17887 */ {(12<<2)|2,{115,66,0}}, +/* 17888 */ {(12<<2)|2,{115,67,0}}, +/* 17889 */ {(12<<2)|2,{115,67,0}}, +/* 17890 */ {(12<<2)|2,{115,67,0}}, +/* 17891 */ {(12<<2)|2,{115,67,0}}, +/* 17892 */ {(12<<2)|2,{115,67,0}}, +/* 17893 */ {(12<<2)|2,{115,67,0}}, +/* 17894 */ {(12<<2)|2,{115,67,0}}, +/* 17895 */ {(12<<2)|2,{115,67,0}}, +/* 17896 */ {(12<<2)|2,{115,67,0}}, +/* 17897 */ {(12<<2)|2,{115,67,0}}, +/* 17898 */ {(12<<2)|2,{115,67,0}}, +/* 17899 */ {(12<<2)|2,{115,67,0}}, +/* 17900 */ {(12<<2)|2,{115,67,0}}, +/* 17901 */ {(12<<2)|2,{115,67,0}}, +/* 17902 */ {(12<<2)|2,{115,67,0}}, +/* 17903 */ {(12<<2)|2,{115,67,0}}, +/* 17904 */ {(12<<2)|2,{115,68,0}}, +/* 17905 */ {(12<<2)|2,{115,68,0}}, +/* 17906 */ {(12<<2)|2,{115,68,0}}, +/* 17907 */ {(12<<2)|2,{115,68,0}}, +/* 17908 */ {(12<<2)|2,{115,68,0}}, +/* 17909 */ {(12<<2)|2,{115,68,0}}, +/* 17910 */ {(12<<2)|2,{115,68,0}}, +/* 17911 */ {(12<<2)|2,{115,68,0}}, +/* 17912 */ {(12<<2)|2,{115,68,0}}, +/* 17913 */ {(12<<2)|2,{115,68,0}}, +/* 17914 */ {(12<<2)|2,{115,68,0}}, +/* 17915 */ {(12<<2)|2,{115,68,0}}, +/* 17916 */ {(12<<2)|2,{115,68,0}}, +/* 17917 */ {(12<<2)|2,{115,68,0}}, +/* 17918 */ {(12<<2)|2,{115,68,0}}, +/* 17919 */ {(12<<2)|2,{115,68,0}}, +/* 17920 */ {(12<<2)|2,{115,69,0}}, +/* 17921 */ {(12<<2)|2,{115,69,0}}, +/* 17922 */ {(12<<2)|2,{115,69,0}}, +/* 17923 */ {(12<<2)|2,{115,69,0}}, +/* 17924 */ {(12<<2)|2,{115,69,0}}, +/* 17925 */ {(12<<2)|2,{115,69,0}}, +/* 17926 */ {(12<<2)|2,{115,69,0}}, +/* 17927 */ {(12<<2)|2,{115,69,0}}, +/* 17928 */ {(12<<2)|2,{115,69,0}}, +/* 17929 */ {(12<<2)|2,{115,69,0}}, +/* 17930 */ {(12<<2)|2,{115,69,0}}, +/* 17931 */ {(12<<2)|2,{115,69,0}}, +/* 17932 */ {(12<<2)|2,{115,69,0}}, +/* 17933 */ {(12<<2)|2,{115,69,0}}, +/* 17934 */ {(12<<2)|2,{115,69,0}}, +/* 17935 */ {(12<<2)|2,{115,69,0}}, +/* 17936 */ {(12<<2)|2,{115,70,0}}, +/* 17937 */ {(12<<2)|2,{115,70,0}}, +/* 17938 */ {(12<<2)|2,{115,70,0}}, +/* 17939 */ {(12<<2)|2,{115,70,0}}, +/* 17940 */ {(12<<2)|2,{115,70,0}}, +/* 17941 */ {(12<<2)|2,{115,70,0}}, +/* 17942 */ {(12<<2)|2,{115,70,0}}, +/* 17943 */ {(12<<2)|2,{115,70,0}}, +/* 17944 */ {(12<<2)|2,{115,70,0}}, +/* 17945 */ {(12<<2)|2,{115,70,0}}, +/* 17946 */ {(12<<2)|2,{115,70,0}}, +/* 17947 */ {(12<<2)|2,{115,70,0}}, +/* 17948 */ {(12<<2)|2,{115,70,0}}, +/* 17949 */ {(12<<2)|2,{115,70,0}}, +/* 17950 */ {(12<<2)|2,{115,70,0}}, +/* 17951 */ {(12<<2)|2,{115,70,0}}, +/* 17952 */ {(12<<2)|2,{115,71,0}}, +/* 17953 */ {(12<<2)|2,{115,71,0}}, +/* 17954 */ {(12<<2)|2,{115,71,0}}, +/* 17955 */ {(12<<2)|2,{115,71,0}}, +/* 17956 */ {(12<<2)|2,{115,71,0}}, +/* 17957 */ {(12<<2)|2,{115,71,0}}, +/* 17958 */ {(12<<2)|2,{115,71,0}}, +/* 17959 */ {(12<<2)|2,{115,71,0}}, +/* 17960 */ {(12<<2)|2,{115,71,0}}, +/* 17961 */ {(12<<2)|2,{115,71,0}}, +/* 17962 */ {(12<<2)|2,{115,71,0}}, +/* 17963 */ {(12<<2)|2,{115,71,0}}, +/* 17964 */ {(12<<2)|2,{115,71,0}}, +/* 17965 */ {(12<<2)|2,{115,71,0}}, +/* 17966 */ {(12<<2)|2,{115,71,0}}, +/* 17967 */ {(12<<2)|2,{115,71,0}}, +/* 17968 */ {(12<<2)|2,{115,72,0}}, +/* 17969 */ {(12<<2)|2,{115,72,0}}, +/* 17970 */ {(12<<2)|2,{115,72,0}}, +/* 17971 */ {(12<<2)|2,{115,72,0}}, +/* 17972 */ {(12<<2)|2,{115,72,0}}, +/* 17973 */ {(12<<2)|2,{115,72,0}}, +/* 17974 */ {(12<<2)|2,{115,72,0}}, +/* 17975 */ {(12<<2)|2,{115,72,0}}, +/* 17976 */ {(12<<2)|2,{115,72,0}}, +/* 17977 */ {(12<<2)|2,{115,72,0}}, +/* 17978 */ {(12<<2)|2,{115,72,0}}, +/* 17979 */ {(12<<2)|2,{115,72,0}}, +/* 17980 */ {(12<<2)|2,{115,72,0}}, +/* 17981 */ {(12<<2)|2,{115,72,0}}, +/* 17982 */ {(12<<2)|2,{115,72,0}}, +/* 17983 */ {(12<<2)|2,{115,72,0}}, +/* 17984 */ {(12<<2)|2,{115,73,0}}, +/* 17985 */ {(12<<2)|2,{115,73,0}}, +/* 17986 */ {(12<<2)|2,{115,73,0}}, +/* 17987 */ {(12<<2)|2,{115,73,0}}, +/* 17988 */ {(12<<2)|2,{115,73,0}}, +/* 17989 */ {(12<<2)|2,{115,73,0}}, +/* 17990 */ {(12<<2)|2,{115,73,0}}, +/* 17991 */ {(12<<2)|2,{115,73,0}}, +/* 17992 */ {(12<<2)|2,{115,73,0}}, +/* 17993 */ {(12<<2)|2,{115,73,0}}, +/* 17994 */ {(12<<2)|2,{115,73,0}}, +/* 17995 */ {(12<<2)|2,{115,73,0}}, +/* 17996 */ {(12<<2)|2,{115,73,0}}, +/* 17997 */ {(12<<2)|2,{115,73,0}}, +/* 17998 */ {(12<<2)|2,{115,73,0}}, +/* 17999 */ {(12<<2)|2,{115,73,0}}, +/* 18000 */ {(12<<2)|2,{115,74,0}}, +/* 18001 */ {(12<<2)|2,{115,74,0}}, +/* 18002 */ {(12<<2)|2,{115,74,0}}, +/* 18003 */ {(12<<2)|2,{115,74,0}}, +/* 18004 */ {(12<<2)|2,{115,74,0}}, +/* 18005 */ {(12<<2)|2,{115,74,0}}, +/* 18006 */ {(12<<2)|2,{115,74,0}}, +/* 18007 */ {(12<<2)|2,{115,74,0}}, +/* 18008 */ {(12<<2)|2,{115,74,0}}, +/* 18009 */ {(12<<2)|2,{115,74,0}}, +/* 18010 */ {(12<<2)|2,{115,74,0}}, +/* 18011 */ {(12<<2)|2,{115,74,0}}, +/* 18012 */ {(12<<2)|2,{115,74,0}}, +/* 18013 */ {(12<<2)|2,{115,74,0}}, +/* 18014 */ {(12<<2)|2,{115,74,0}}, +/* 18015 */ {(12<<2)|2,{115,74,0}}, +/* 18016 */ {(12<<2)|2,{115,75,0}}, +/* 18017 */ {(12<<2)|2,{115,75,0}}, +/* 18018 */ {(12<<2)|2,{115,75,0}}, +/* 18019 */ {(12<<2)|2,{115,75,0}}, +/* 18020 */ {(12<<2)|2,{115,75,0}}, +/* 18021 */ {(12<<2)|2,{115,75,0}}, +/* 18022 */ {(12<<2)|2,{115,75,0}}, +/* 18023 */ {(12<<2)|2,{115,75,0}}, +/* 18024 */ {(12<<2)|2,{115,75,0}}, +/* 18025 */ {(12<<2)|2,{115,75,0}}, +/* 18026 */ {(12<<2)|2,{115,75,0}}, +/* 18027 */ {(12<<2)|2,{115,75,0}}, +/* 18028 */ {(12<<2)|2,{115,75,0}}, +/* 18029 */ {(12<<2)|2,{115,75,0}}, +/* 18030 */ {(12<<2)|2,{115,75,0}}, +/* 18031 */ {(12<<2)|2,{115,75,0}}, +/* 18032 */ {(12<<2)|2,{115,76,0}}, +/* 18033 */ {(12<<2)|2,{115,76,0}}, +/* 18034 */ {(12<<2)|2,{115,76,0}}, +/* 18035 */ {(12<<2)|2,{115,76,0}}, +/* 18036 */ {(12<<2)|2,{115,76,0}}, +/* 18037 */ {(12<<2)|2,{115,76,0}}, +/* 18038 */ {(12<<2)|2,{115,76,0}}, +/* 18039 */ {(12<<2)|2,{115,76,0}}, +/* 18040 */ {(12<<2)|2,{115,76,0}}, +/* 18041 */ {(12<<2)|2,{115,76,0}}, +/* 18042 */ {(12<<2)|2,{115,76,0}}, +/* 18043 */ {(12<<2)|2,{115,76,0}}, +/* 18044 */ {(12<<2)|2,{115,76,0}}, +/* 18045 */ {(12<<2)|2,{115,76,0}}, +/* 18046 */ {(12<<2)|2,{115,76,0}}, +/* 18047 */ {(12<<2)|2,{115,76,0}}, +/* 18048 */ {(12<<2)|2,{115,77,0}}, +/* 18049 */ {(12<<2)|2,{115,77,0}}, +/* 18050 */ {(12<<2)|2,{115,77,0}}, +/* 18051 */ {(12<<2)|2,{115,77,0}}, +/* 18052 */ {(12<<2)|2,{115,77,0}}, +/* 18053 */ {(12<<2)|2,{115,77,0}}, +/* 18054 */ {(12<<2)|2,{115,77,0}}, +/* 18055 */ {(12<<2)|2,{115,77,0}}, +/* 18056 */ {(12<<2)|2,{115,77,0}}, +/* 18057 */ {(12<<2)|2,{115,77,0}}, +/* 18058 */ {(12<<2)|2,{115,77,0}}, +/* 18059 */ {(12<<2)|2,{115,77,0}}, +/* 18060 */ {(12<<2)|2,{115,77,0}}, +/* 18061 */ {(12<<2)|2,{115,77,0}}, +/* 18062 */ {(12<<2)|2,{115,77,0}}, +/* 18063 */ {(12<<2)|2,{115,77,0}}, +/* 18064 */ {(12<<2)|2,{115,78,0}}, +/* 18065 */ {(12<<2)|2,{115,78,0}}, +/* 18066 */ {(12<<2)|2,{115,78,0}}, +/* 18067 */ {(12<<2)|2,{115,78,0}}, +/* 18068 */ {(12<<2)|2,{115,78,0}}, +/* 18069 */ {(12<<2)|2,{115,78,0}}, +/* 18070 */ {(12<<2)|2,{115,78,0}}, +/* 18071 */ {(12<<2)|2,{115,78,0}}, +/* 18072 */ {(12<<2)|2,{115,78,0}}, +/* 18073 */ {(12<<2)|2,{115,78,0}}, +/* 18074 */ {(12<<2)|2,{115,78,0}}, +/* 18075 */ {(12<<2)|2,{115,78,0}}, +/* 18076 */ {(12<<2)|2,{115,78,0}}, +/* 18077 */ {(12<<2)|2,{115,78,0}}, +/* 18078 */ {(12<<2)|2,{115,78,0}}, +/* 18079 */ {(12<<2)|2,{115,78,0}}, +/* 18080 */ {(12<<2)|2,{115,79,0}}, +/* 18081 */ {(12<<2)|2,{115,79,0}}, +/* 18082 */ {(12<<2)|2,{115,79,0}}, +/* 18083 */ {(12<<2)|2,{115,79,0}}, +/* 18084 */ {(12<<2)|2,{115,79,0}}, +/* 18085 */ {(12<<2)|2,{115,79,0}}, +/* 18086 */ {(12<<2)|2,{115,79,0}}, +/* 18087 */ {(12<<2)|2,{115,79,0}}, +/* 18088 */ {(12<<2)|2,{115,79,0}}, +/* 18089 */ {(12<<2)|2,{115,79,0}}, +/* 18090 */ {(12<<2)|2,{115,79,0}}, +/* 18091 */ {(12<<2)|2,{115,79,0}}, +/* 18092 */ {(12<<2)|2,{115,79,0}}, +/* 18093 */ {(12<<2)|2,{115,79,0}}, +/* 18094 */ {(12<<2)|2,{115,79,0}}, +/* 18095 */ {(12<<2)|2,{115,79,0}}, +/* 18096 */ {(12<<2)|2,{115,80,0}}, +/* 18097 */ {(12<<2)|2,{115,80,0}}, +/* 18098 */ {(12<<2)|2,{115,80,0}}, +/* 18099 */ {(12<<2)|2,{115,80,0}}, +/* 18100 */ {(12<<2)|2,{115,80,0}}, +/* 18101 */ {(12<<2)|2,{115,80,0}}, +/* 18102 */ {(12<<2)|2,{115,80,0}}, +/* 18103 */ {(12<<2)|2,{115,80,0}}, +/* 18104 */ {(12<<2)|2,{115,80,0}}, +/* 18105 */ {(12<<2)|2,{115,80,0}}, +/* 18106 */ {(12<<2)|2,{115,80,0}}, +/* 18107 */ {(12<<2)|2,{115,80,0}}, +/* 18108 */ {(12<<2)|2,{115,80,0}}, +/* 18109 */ {(12<<2)|2,{115,80,0}}, +/* 18110 */ {(12<<2)|2,{115,80,0}}, +/* 18111 */ {(12<<2)|2,{115,80,0}}, +/* 18112 */ {(12<<2)|2,{115,81,0}}, +/* 18113 */ {(12<<2)|2,{115,81,0}}, +/* 18114 */ {(12<<2)|2,{115,81,0}}, +/* 18115 */ {(12<<2)|2,{115,81,0}}, +/* 18116 */ {(12<<2)|2,{115,81,0}}, +/* 18117 */ {(12<<2)|2,{115,81,0}}, +/* 18118 */ {(12<<2)|2,{115,81,0}}, +/* 18119 */ {(12<<2)|2,{115,81,0}}, +/* 18120 */ {(12<<2)|2,{115,81,0}}, +/* 18121 */ {(12<<2)|2,{115,81,0}}, +/* 18122 */ {(12<<2)|2,{115,81,0}}, +/* 18123 */ {(12<<2)|2,{115,81,0}}, +/* 18124 */ {(12<<2)|2,{115,81,0}}, +/* 18125 */ {(12<<2)|2,{115,81,0}}, +/* 18126 */ {(12<<2)|2,{115,81,0}}, +/* 18127 */ {(12<<2)|2,{115,81,0}}, +/* 18128 */ {(12<<2)|2,{115,82,0}}, +/* 18129 */ {(12<<2)|2,{115,82,0}}, +/* 18130 */ {(12<<2)|2,{115,82,0}}, +/* 18131 */ {(12<<2)|2,{115,82,0}}, +/* 18132 */ {(12<<2)|2,{115,82,0}}, +/* 18133 */ {(12<<2)|2,{115,82,0}}, +/* 18134 */ {(12<<2)|2,{115,82,0}}, +/* 18135 */ {(12<<2)|2,{115,82,0}}, +/* 18136 */ {(12<<2)|2,{115,82,0}}, +/* 18137 */ {(12<<2)|2,{115,82,0}}, +/* 18138 */ {(12<<2)|2,{115,82,0}}, +/* 18139 */ {(12<<2)|2,{115,82,0}}, +/* 18140 */ {(12<<2)|2,{115,82,0}}, +/* 18141 */ {(12<<2)|2,{115,82,0}}, +/* 18142 */ {(12<<2)|2,{115,82,0}}, +/* 18143 */ {(12<<2)|2,{115,82,0}}, +/* 18144 */ {(12<<2)|2,{115,83,0}}, +/* 18145 */ {(12<<2)|2,{115,83,0}}, +/* 18146 */ {(12<<2)|2,{115,83,0}}, +/* 18147 */ {(12<<2)|2,{115,83,0}}, +/* 18148 */ {(12<<2)|2,{115,83,0}}, +/* 18149 */ {(12<<2)|2,{115,83,0}}, +/* 18150 */ {(12<<2)|2,{115,83,0}}, +/* 18151 */ {(12<<2)|2,{115,83,0}}, +/* 18152 */ {(12<<2)|2,{115,83,0}}, +/* 18153 */ {(12<<2)|2,{115,83,0}}, +/* 18154 */ {(12<<2)|2,{115,83,0}}, +/* 18155 */ {(12<<2)|2,{115,83,0}}, +/* 18156 */ {(12<<2)|2,{115,83,0}}, +/* 18157 */ {(12<<2)|2,{115,83,0}}, +/* 18158 */ {(12<<2)|2,{115,83,0}}, +/* 18159 */ {(12<<2)|2,{115,83,0}}, +/* 18160 */ {(12<<2)|2,{115,84,0}}, +/* 18161 */ {(12<<2)|2,{115,84,0}}, +/* 18162 */ {(12<<2)|2,{115,84,0}}, +/* 18163 */ {(12<<2)|2,{115,84,0}}, +/* 18164 */ {(12<<2)|2,{115,84,0}}, +/* 18165 */ {(12<<2)|2,{115,84,0}}, +/* 18166 */ {(12<<2)|2,{115,84,0}}, +/* 18167 */ {(12<<2)|2,{115,84,0}}, +/* 18168 */ {(12<<2)|2,{115,84,0}}, +/* 18169 */ {(12<<2)|2,{115,84,0}}, +/* 18170 */ {(12<<2)|2,{115,84,0}}, +/* 18171 */ {(12<<2)|2,{115,84,0}}, +/* 18172 */ {(12<<2)|2,{115,84,0}}, +/* 18173 */ {(12<<2)|2,{115,84,0}}, +/* 18174 */ {(12<<2)|2,{115,84,0}}, +/* 18175 */ {(12<<2)|2,{115,84,0}}, +/* 18176 */ {(12<<2)|2,{115,85,0}}, +/* 18177 */ {(12<<2)|2,{115,85,0}}, +/* 18178 */ {(12<<2)|2,{115,85,0}}, +/* 18179 */ {(12<<2)|2,{115,85,0}}, +/* 18180 */ {(12<<2)|2,{115,85,0}}, +/* 18181 */ {(12<<2)|2,{115,85,0}}, +/* 18182 */ {(12<<2)|2,{115,85,0}}, +/* 18183 */ {(12<<2)|2,{115,85,0}}, +/* 18184 */ {(12<<2)|2,{115,85,0}}, +/* 18185 */ {(12<<2)|2,{115,85,0}}, +/* 18186 */ {(12<<2)|2,{115,85,0}}, +/* 18187 */ {(12<<2)|2,{115,85,0}}, +/* 18188 */ {(12<<2)|2,{115,85,0}}, +/* 18189 */ {(12<<2)|2,{115,85,0}}, +/* 18190 */ {(12<<2)|2,{115,85,0}}, +/* 18191 */ {(12<<2)|2,{115,85,0}}, +/* 18192 */ {(12<<2)|2,{115,86,0}}, +/* 18193 */ {(12<<2)|2,{115,86,0}}, +/* 18194 */ {(12<<2)|2,{115,86,0}}, +/* 18195 */ {(12<<2)|2,{115,86,0}}, +/* 18196 */ {(12<<2)|2,{115,86,0}}, +/* 18197 */ {(12<<2)|2,{115,86,0}}, +/* 18198 */ {(12<<2)|2,{115,86,0}}, +/* 18199 */ {(12<<2)|2,{115,86,0}}, +/* 18200 */ {(12<<2)|2,{115,86,0}}, +/* 18201 */ {(12<<2)|2,{115,86,0}}, +/* 18202 */ {(12<<2)|2,{115,86,0}}, +/* 18203 */ {(12<<2)|2,{115,86,0}}, +/* 18204 */ {(12<<2)|2,{115,86,0}}, +/* 18205 */ {(12<<2)|2,{115,86,0}}, +/* 18206 */ {(12<<2)|2,{115,86,0}}, +/* 18207 */ {(12<<2)|2,{115,86,0}}, +/* 18208 */ {(12<<2)|2,{115,87,0}}, +/* 18209 */ {(12<<2)|2,{115,87,0}}, +/* 18210 */ {(12<<2)|2,{115,87,0}}, +/* 18211 */ {(12<<2)|2,{115,87,0}}, +/* 18212 */ {(12<<2)|2,{115,87,0}}, +/* 18213 */ {(12<<2)|2,{115,87,0}}, +/* 18214 */ {(12<<2)|2,{115,87,0}}, +/* 18215 */ {(12<<2)|2,{115,87,0}}, +/* 18216 */ {(12<<2)|2,{115,87,0}}, +/* 18217 */ {(12<<2)|2,{115,87,0}}, +/* 18218 */ {(12<<2)|2,{115,87,0}}, +/* 18219 */ {(12<<2)|2,{115,87,0}}, +/* 18220 */ {(12<<2)|2,{115,87,0}}, +/* 18221 */ {(12<<2)|2,{115,87,0}}, +/* 18222 */ {(12<<2)|2,{115,87,0}}, +/* 18223 */ {(12<<2)|2,{115,87,0}}, +/* 18224 */ {(12<<2)|2,{115,89,0}}, +/* 18225 */ {(12<<2)|2,{115,89,0}}, +/* 18226 */ {(12<<2)|2,{115,89,0}}, +/* 18227 */ {(12<<2)|2,{115,89,0}}, +/* 18228 */ {(12<<2)|2,{115,89,0}}, +/* 18229 */ {(12<<2)|2,{115,89,0}}, +/* 18230 */ {(12<<2)|2,{115,89,0}}, +/* 18231 */ {(12<<2)|2,{115,89,0}}, +/* 18232 */ {(12<<2)|2,{115,89,0}}, +/* 18233 */ {(12<<2)|2,{115,89,0}}, +/* 18234 */ {(12<<2)|2,{115,89,0}}, +/* 18235 */ {(12<<2)|2,{115,89,0}}, +/* 18236 */ {(12<<2)|2,{115,89,0}}, +/* 18237 */ {(12<<2)|2,{115,89,0}}, +/* 18238 */ {(12<<2)|2,{115,89,0}}, +/* 18239 */ {(12<<2)|2,{115,89,0}}, +/* 18240 */ {(12<<2)|2,{115,106,0}}, +/* 18241 */ {(12<<2)|2,{115,106,0}}, +/* 18242 */ {(12<<2)|2,{115,106,0}}, +/* 18243 */ {(12<<2)|2,{115,106,0}}, +/* 18244 */ {(12<<2)|2,{115,106,0}}, +/* 18245 */ {(12<<2)|2,{115,106,0}}, +/* 18246 */ {(12<<2)|2,{115,106,0}}, +/* 18247 */ {(12<<2)|2,{115,106,0}}, +/* 18248 */ {(12<<2)|2,{115,106,0}}, +/* 18249 */ {(12<<2)|2,{115,106,0}}, +/* 18250 */ {(12<<2)|2,{115,106,0}}, +/* 18251 */ {(12<<2)|2,{115,106,0}}, +/* 18252 */ {(12<<2)|2,{115,106,0}}, +/* 18253 */ {(12<<2)|2,{115,106,0}}, +/* 18254 */ {(12<<2)|2,{115,106,0}}, +/* 18255 */ {(12<<2)|2,{115,106,0}}, +/* 18256 */ {(12<<2)|2,{115,107,0}}, +/* 18257 */ {(12<<2)|2,{115,107,0}}, +/* 18258 */ {(12<<2)|2,{115,107,0}}, +/* 18259 */ {(12<<2)|2,{115,107,0}}, +/* 18260 */ {(12<<2)|2,{115,107,0}}, +/* 18261 */ {(12<<2)|2,{115,107,0}}, +/* 18262 */ {(12<<2)|2,{115,107,0}}, +/* 18263 */ {(12<<2)|2,{115,107,0}}, +/* 18264 */ {(12<<2)|2,{115,107,0}}, +/* 18265 */ {(12<<2)|2,{115,107,0}}, +/* 18266 */ {(12<<2)|2,{115,107,0}}, +/* 18267 */ {(12<<2)|2,{115,107,0}}, +/* 18268 */ {(12<<2)|2,{115,107,0}}, +/* 18269 */ {(12<<2)|2,{115,107,0}}, +/* 18270 */ {(12<<2)|2,{115,107,0}}, +/* 18271 */ {(12<<2)|2,{115,107,0}}, +/* 18272 */ {(12<<2)|2,{115,113,0}}, +/* 18273 */ {(12<<2)|2,{115,113,0}}, +/* 18274 */ {(12<<2)|2,{115,113,0}}, +/* 18275 */ {(12<<2)|2,{115,113,0}}, +/* 18276 */ {(12<<2)|2,{115,113,0}}, +/* 18277 */ {(12<<2)|2,{115,113,0}}, +/* 18278 */ {(12<<2)|2,{115,113,0}}, +/* 18279 */ {(12<<2)|2,{115,113,0}}, +/* 18280 */ {(12<<2)|2,{115,113,0}}, +/* 18281 */ {(12<<2)|2,{115,113,0}}, +/* 18282 */ {(12<<2)|2,{115,113,0}}, +/* 18283 */ {(12<<2)|2,{115,113,0}}, +/* 18284 */ {(12<<2)|2,{115,113,0}}, +/* 18285 */ {(12<<2)|2,{115,113,0}}, +/* 18286 */ {(12<<2)|2,{115,113,0}}, +/* 18287 */ {(12<<2)|2,{115,113,0}}, +/* 18288 */ {(12<<2)|2,{115,118,0}}, +/* 18289 */ {(12<<2)|2,{115,118,0}}, +/* 18290 */ {(12<<2)|2,{115,118,0}}, +/* 18291 */ {(12<<2)|2,{115,118,0}}, +/* 18292 */ {(12<<2)|2,{115,118,0}}, +/* 18293 */ {(12<<2)|2,{115,118,0}}, +/* 18294 */ {(12<<2)|2,{115,118,0}}, +/* 18295 */ {(12<<2)|2,{115,118,0}}, +/* 18296 */ {(12<<2)|2,{115,118,0}}, +/* 18297 */ {(12<<2)|2,{115,118,0}}, +/* 18298 */ {(12<<2)|2,{115,118,0}}, +/* 18299 */ {(12<<2)|2,{115,118,0}}, +/* 18300 */ {(12<<2)|2,{115,118,0}}, +/* 18301 */ {(12<<2)|2,{115,118,0}}, +/* 18302 */ {(12<<2)|2,{115,118,0}}, +/* 18303 */ {(12<<2)|2,{115,118,0}}, +/* 18304 */ {(12<<2)|2,{115,119,0}}, +/* 18305 */ {(12<<2)|2,{115,119,0}}, +/* 18306 */ {(12<<2)|2,{115,119,0}}, +/* 18307 */ {(12<<2)|2,{115,119,0}}, +/* 18308 */ {(12<<2)|2,{115,119,0}}, +/* 18309 */ {(12<<2)|2,{115,119,0}}, +/* 18310 */ {(12<<2)|2,{115,119,0}}, +/* 18311 */ {(12<<2)|2,{115,119,0}}, +/* 18312 */ {(12<<2)|2,{115,119,0}}, +/* 18313 */ {(12<<2)|2,{115,119,0}}, +/* 18314 */ {(12<<2)|2,{115,119,0}}, +/* 18315 */ {(12<<2)|2,{115,119,0}}, +/* 18316 */ {(12<<2)|2,{115,119,0}}, +/* 18317 */ {(12<<2)|2,{115,119,0}}, +/* 18318 */ {(12<<2)|2,{115,119,0}}, +/* 18319 */ {(12<<2)|2,{115,119,0}}, +/* 18320 */ {(12<<2)|2,{115,120,0}}, +/* 18321 */ {(12<<2)|2,{115,120,0}}, +/* 18322 */ {(12<<2)|2,{115,120,0}}, +/* 18323 */ {(12<<2)|2,{115,120,0}}, +/* 18324 */ {(12<<2)|2,{115,120,0}}, +/* 18325 */ {(12<<2)|2,{115,120,0}}, +/* 18326 */ {(12<<2)|2,{115,120,0}}, +/* 18327 */ {(12<<2)|2,{115,120,0}}, +/* 18328 */ {(12<<2)|2,{115,120,0}}, +/* 18329 */ {(12<<2)|2,{115,120,0}}, +/* 18330 */ {(12<<2)|2,{115,120,0}}, +/* 18331 */ {(12<<2)|2,{115,120,0}}, +/* 18332 */ {(12<<2)|2,{115,120,0}}, +/* 18333 */ {(12<<2)|2,{115,120,0}}, +/* 18334 */ {(12<<2)|2,{115,120,0}}, +/* 18335 */ {(12<<2)|2,{115,120,0}}, +/* 18336 */ {(12<<2)|2,{115,121,0}}, +/* 18337 */ {(12<<2)|2,{115,121,0}}, +/* 18338 */ {(12<<2)|2,{115,121,0}}, +/* 18339 */ {(12<<2)|2,{115,121,0}}, +/* 18340 */ {(12<<2)|2,{115,121,0}}, +/* 18341 */ {(12<<2)|2,{115,121,0}}, +/* 18342 */ {(12<<2)|2,{115,121,0}}, +/* 18343 */ {(12<<2)|2,{115,121,0}}, +/* 18344 */ {(12<<2)|2,{115,121,0}}, +/* 18345 */ {(12<<2)|2,{115,121,0}}, +/* 18346 */ {(12<<2)|2,{115,121,0}}, +/* 18347 */ {(12<<2)|2,{115,121,0}}, +/* 18348 */ {(12<<2)|2,{115,121,0}}, +/* 18349 */ {(12<<2)|2,{115,121,0}}, +/* 18350 */ {(12<<2)|2,{115,121,0}}, +/* 18351 */ {(12<<2)|2,{115,121,0}}, +/* 18352 */ {(12<<2)|2,{115,122,0}}, +/* 18353 */ {(12<<2)|2,{115,122,0}}, +/* 18354 */ {(12<<2)|2,{115,122,0}}, +/* 18355 */ {(12<<2)|2,{115,122,0}}, +/* 18356 */ {(12<<2)|2,{115,122,0}}, +/* 18357 */ {(12<<2)|2,{115,122,0}}, +/* 18358 */ {(12<<2)|2,{115,122,0}}, +/* 18359 */ {(12<<2)|2,{115,122,0}}, +/* 18360 */ {(12<<2)|2,{115,122,0}}, +/* 18361 */ {(12<<2)|2,{115,122,0}}, +/* 18362 */ {(12<<2)|2,{115,122,0}}, +/* 18363 */ {(12<<2)|2,{115,122,0}}, +/* 18364 */ {(12<<2)|2,{115,122,0}}, +/* 18365 */ {(12<<2)|2,{115,122,0}}, +/* 18366 */ {(12<<2)|2,{115,122,0}}, +/* 18367 */ {(12<<2)|2,{115,122,0}}, +/* 18368 */ {(13<<2)|2,{115,38,0}}, +/* 18369 */ {(13<<2)|2,{115,38,0}}, +/* 18370 */ {(13<<2)|2,{115,38,0}}, +/* 18371 */ {(13<<2)|2,{115,38,0}}, +/* 18372 */ {(13<<2)|2,{115,38,0}}, +/* 18373 */ {(13<<2)|2,{115,38,0}}, +/* 18374 */ {(13<<2)|2,{115,38,0}}, +/* 18375 */ {(13<<2)|2,{115,38,0}}, +/* 18376 */ {(13<<2)|2,{115,42,0}}, +/* 18377 */ {(13<<2)|2,{115,42,0}}, +/* 18378 */ {(13<<2)|2,{115,42,0}}, +/* 18379 */ {(13<<2)|2,{115,42,0}}, +/* 18380 */ {(13<<2)|2,{115,42,0}}, +/* 18381 */ {(13<<2)|2,{115,42,0}}, +/* 18382 */ {(13<<2)|2,{115,42,0}}, +/* 18383 */ {(13<<2)|2,{115,42,0}}, +/* 18384 */ {(13<<2)|2,{115,44,0}}, +/* 18385 */ {(13<<2)|2,{115,44,0}}, +/* 18386 */ {(13<<2)|2,{115,44,0}}, +/* 18387 */ {(13<<2)|2,{115,44,0}}, +/* 18388 */ {(13<<2)|2,{115,44,0}}, +/* 18389 */ {(13<<2)|2,{115,44,0}}, +/* 18390 */ {(13<<2)|2,{115,44,0}}, +/* 18391 */ {(13<<2)|2,{115,44,0}}, +/* 18392 */ {(13<<2)|2,{115,59,0}}, +/* 18393 */ {(13<<2)|2,{115,59,0}}, +/* 18394 */ {(13<<2)|2,{115,59,0}}, +/* 18395 */ {(13<<2)|2,{115,59,0}}, +/* 18396 */ {(13<<2)|2,{115,59,0}}, +/* 18397 */ {(13<<2)|2,{115,59,0}}, +/* 18398 */ {(13<<2)|2,{115,59,0}}, +/* 18399 */ {(13<<2)|2,{115,59,0}}, +/* 18400 */ {(13<<2)|2,{115,88,0}}, +/* 18401 */ {(13<<2)|2,{115,88,0}}, +/* 18402 */ {(13<<2)|2,{115,88,0}}, +/* 18403 */ {(13<<2)|2,{115,88,0}}, +/* 18404 */ {(13<<2)|2,{115,88,0}}, +/* 18405 */ {(13<<2)|2,{115,88,0}}, +/* 18406 */ {(13<<2)|2,{115,88,0}}, +/* 18407 */ {(13<<2)|2,{115,88,0}}, +/* 18408 */ {(13<<2)|2,{115,90,0}}, +/* 18409 */ {(13<<2)|2,{115,90,0}}, +/* 18410 */ {(13<<2)|2,{115,90,0}}, +/* 18411 */ {(13<<2)|2,{115,90,0}}, +/* 18412 */ {(13<<2)|2,{115,90,0}}, +/* 18413 */ {(13<<2)|2,{115,90,0}}, +/* 18414 */ {(13<<2)|2,{115,90,0}}, +/* 18415 */ {(13<<2)|2,{115,90,0}}, +/* 18416 */ {(15<<2)|2,{115,33,0}}, +/* 18417 */ {(15<<2)|2,{115,33,0}}, +/* 18418 */ {(15<<2)|2,{115,34,0}}, +/* 18419 */ {(15<<2)|2,{115,34,0}}, +/* 18420 */ {(15<<2)|2,{115,40,0}}, +/* 18421 */ {(15<<2)|2,{115,40,0}}, +/* 18422 */ {(15<<2)|2,{115,41,0}}, +/* 18423 */ {(15<<2)|2,{115,41,0}}, +/* 18424 */ {(15<<2)|2,{115,63,0}}, +/* 18425 */ {(15<<2)|2,{115,63,0}}, +/* 18426 */ {(16<<2)|2,{115,39,0}}, +/* 18427 */ {(16<<2)|2,{115,43,0}}, +/* 18428 */ {(16<<2)|2,{115,124,0}}, +/* 18429 */ {(5<<2)|1,{115,0,0}}, +/* 18430 */ {(5<<2)|1,{115,0,0}}, +/* 18431 */ {(5<<2)|1,{115,0,0}}, +/* 18432 */ {(15<<2)|3,{116,48,48}}, +/* 18433 */ {(15<<2)|3,{116,48,48}}, +/* 18434 */ {(15<<2)|3,{116,48,49}}, +/* 18435 */ {(15<<2)|3,{116,48,49}}, +/* 18436 */ {(15<<2)|3,{116,48,50}}, +/* 18437 */ {(15<<2)|3,{116,48,50}}, +/* 18438 */ {(15<<2)|3,{116,48,97}}, +/* 18439 */ {(15<<2)|3,{116,48,97}}, +/* 18440 */ {(15<<2)|3,{116,48,99}}, +/* 18441 */ {(15<<2)|3,{116,48,99}}, +/* 18442 */ {(15<<2)|3,{116,48,101}}, +/* 18443 */ {(15<<2)|3,{116,48,101}}, +/* 18444 */ {(15<<2)|3,{116,48,105}}, +/* 18445 */ {(15<<2)|3,{116,48,105}}, +/* 18446 */ {(15<<2)|3,{116,48,111}}, +/* 18447 */ {(15<<2)|3,{116,48,111}}, +/* 18448 */ {(15<<2)|3,{116,48,115}}, +/* 18449 */ {(15<<2)|3,{116,48,115}}, +/* 18450 */ {(15<<2)|3,{116,48,116}}, +/* 18451 */ {(15<<2)|3,{116,48,116}}, +/* 18452 */ {(16<<2)|3,{116,48,32}}, +/* 18453 */ {(16<<2)|3,{116,48,37}}, +/* 18454 */ {(16<<2)|3,{116,48,45}}, +/* 18455 */ {(16<<2)|3,{116,48,46}}, +/* 18456 */ {(16<<2)|3,{116,48,47}}, +/* 18457 */ {(16<<2)|3,{116,48,51}}, +/* 18458 */ {(16<<2)|3,{116,48,52}}, +/* 18459 */ {(16<<2)|3,{116,48,53}}, +/* 18460 */ {(16<<2)|3,{116,48,54}}, +/* 18461 */ {(16<<2)|3,{116,48,55}}, +/* 18462 */ {(16<<2)|3,{116,48,56}}, +/* 18463 */ {(16<<2)|3,{116,48,57}}, +/* 18464 */ {(16<<2)|3,{116,48,61}}, +/* 18465 */ {(16<<2)|3,{116,48,65}}, +/* 18466 */ {(16<<2)|3,{116,48,95}}, +/* 18467 */ {(16<<2)|3,{116,48,98}}, +/* 18468 */ {(16<<2)|3,{116,48,100}}, +/* 18469 */ {(16<<2)|3,{116,48,102}}, +/* 18470 */ {(16<<2)|3,{116,48,103}}, +/* 18471 */ {(16<<2)|3,{116,48,104}}, +/* 18472 */ {(16<<2)|3,{116,48,108}}, +/* 18473 */ {(16<<2)|3,{116,48,109}}, +/* 18474 */ {(16<<2)|3,{116,48,110}}, +/* 18475 */ {(16<<2)|3,{116,48,112}}, +/* 18476 */ {(16<<2)|3,{116,48,114}}, +/* 18477 */ {(16<<2)|3,{116,48,117}}, +/* 18478 */ {(10<<2)|2,{116,48,0}}, +/* 18479 */ {(10<<2)|2,{116,48,0}}, +/* 18480 */ {(10<<2)|2,{116,48,0}}, +/* 18481 */ {(10<<2)|2,{116,48,0}}, +/* 18482 */ {(10<<2)|2,{116,48,0}}, +/* 18483 */ {(10<<2)|2,{116,48,0}}, +/* 18484 */ {(10<<2)|2,{116,48,0}}, +/* 18485 */ {(10<<2)|2,{116,48,0}}, +/* 18486 */ {(10<<2)|2,{116,48,0}}, +/* 18487 */ {(10<<2)|2,{116,48,0}}, +/* 18488 */ {(10<<2)|2,{116,48,0}}, +/* 18489 */ {(10<<2)|2,{116,48,0}}, +/* 18490 */ {(10<<2)|2,{116,48,0}}, +/* 18491 */ {(10<<2)|2,{116,48,0}}, +/* 18492 */ {(10<<2)|2,{116,48,0}}, +/* 18493 */ {(10<<2)|2,{116,48,0}}, +/* 18494 */ {(10<<2)|2,{116,48,0}}, +/* 18495 */ {(10<<2)|2,{116,48,0}}, +/* 18496 */ {(15<<2)|3,{116,49,48}}, +/* 18497 */ {(15<<2)|3,{116,49,48}}, +/* 18498 */ {(15<<2)|3,{116,49,49}}, +/* 18499 */ {(15<<2)|3,{116,49,49}}, +/* 18500 */ {(15<<2)|3,{116,49,50}}, +/* 18501 */ {(15<<2)|3,{116,49,50}}, +/* 18502 */ {(15<<2)|3,{116,49,97}}, +/* 18503 */ {(15<<2)|3,{116,49,97}}, +/* 18504 */ {(15<<2)|3,{116,49,99}}, +/* 18505 */ {(15<<2)|3,{116,49,99}}, +/* 18506 */ {(15<<2)|3,{116,49,101}}, +/* 18507 */ {(15<<2)|3,{116,49,101}}, +/* 18508 */ {(15<<2)|3,{116,49,105}}, +/* 18509 */ {(15<<2)|3,{116,49,105}}, +/* 18510 */ {(15<<2)|3,{116,49,111}}, +/* 18511 */ {(15<<2)|3,{116,49,111}}, +/* 18512 */ {(15<<2)|3,{116,49,115}}, +/* 18513 */ {(15<<2)|3,{116,49,115}}, +/* 18514 */ {(15<<2)|3,{116,49,116}}, +/* 18515 */ {(15<<2)|3,{116,49,116}}, +/* 18516 */ {(16<<2)|3,{116,49,32}}, +/* 18517 */ {(16<<2)|3,{116,49,37}}, +/* 18518 */ {(16<<2)|3,{116,49,45}}, +/* 18519 */ {(16<<2)|3,{116,49,46}}, +/* 18520 */ {(16<<2)|3,{116,49,47}}, +/* 18521 */ {(16<<2)|3,{116,49,51}}, +/* 18522 */ {(16<<2)|3,{116,49,52}}, +/* 18523 */ {(16<<2)|3,{116,49,53}}, +/* 18524 */ {(16<<2)|3,{116,49,54}}, +/* 18525 */ {(16<<2)|3,{116,49,55}}, +/* 18526 */ {(16<<2)|3,{116,49,56}}, +/* 18527 */ {(16<<2)|3,{116,49,57}}, +/* 18528 */ {(16<<2)|3,{116,49,61}}, +/* 18529 */ {(16<<2)|3,{116,49,65}}, +/* 18530 */ {(16<<2)|3,{116,49,95}}, +/* 18531 */ {(16<<2)|3,{116,49,98}}, +/* 18532 */ {(16<<2)|3,{116,49,100}}, +/* 18533 */ {(16<<2)|3,{116,49,102}}, +/* 18534 */ {(16<<2)|3,{116,49,103}}, +/* 18535 */ {(16<<2)|3,{116,49,104}}, +/* 18536 */ {(16<<2)|3,{116,49,108}}, +/* 18537 */ {(16<<2)|3,{116,49,109}}, +/* 18538 */ {(16<<2)|3,{116,49,110}}, +/* 18539 */ {(16<<2)|3,{116,49,112}}, +/* 18540 */ {(16<<2)|3,{116,49,114}}, +/* 18541 */ {(16<<2)|3,{116,49,117}}, +/* 18542 */ {(10<<2)|2,{116,49,0}}, +/* 18543 */ {(10<<2)|2,{116,49,0}}, +/* 18544 */ {(10<<2)|2,{116,49,0}}, +/* 18545 */ {(10<<2)|2,{116,49,0}}, +/* 18546 */ {(10<<2)|2,{116,49,0}}, +/* 18547 */ {(10<<2)|2,{116,49,0}}, +/* 18548 */ {(10<<2)|2,{116,49,0}}, +/* 18549 */ {(10<<2)|2,{116,49,0}}, +/* 18550 */ {(10<<2)|2,{116,49,0}}, +/* 18551 */ {(10<<2)|2,{116,49,0}}, +/* 18552 */ {(10<<2)|2,{116,49,0}}, +/* 18553 */ {(10<<2)|2,{116,49,0}}, +/* 18554 */ {(10<<2)|2,{116,49,0}}, +/* 18555 */ {(10<<2)|2,{116,49,0}}, +/* 18556 */ {(10<<2)|2,{116,49,0}}, +/* 18557 */ {(10<<2)|2,{116,49,0}}, +/* 18558 */ {(10<<2)|2,{116,49,0}}, +/* 18559 */ {(10<<2)|2,{116,49,0}}, +/* 18560 */ {(15<<2)|3,{116,50,48}}, +/* 18561 */ {(15<<2)|3,{116,50,48}}, +/* 18562 */ {(15<<2)|3,{116,50,49}}, +/* 18563 */ {(15<<2)|3,{116,50,49}}, +/* 18564 */ {(15<<2)|3,{116,50,50}}, +/* 18565 */ {(15<<2)|3,{116,50,50}}, +/* 18566 */ {(15<<2)|3,{116,50,97}}, +/* 18567 */ {(15<<2)|3,{116,50,97}}, +/* 18568 */ {(15<<2)|3,{116,50,99}}, +/* 18569 */ {(15<<2)|3,{116,50,99}}, +/* 18570 */ {(15<<2)|3,{116,50,101}}, +/* 18571 */ {(15<<2)|3,{116,50,101}}, +/* 18572 */ {(15<<2)|3,{116,50,105}}, +/* 18573 */ {(15<<2)|3,{116,50,105}}, +/* 18574 */ {(15<<2)|3,{116,50,111}}, +/* 18575 */ {(15<<2)|3,{116,50,111}}, +/* 18576 */ {(15<<2)|3,{116,50,115}}, +/* 18577 */ {(15<<2)|3,{116,50,115}}, +/* 18578 */ {(15<<2)|3,{116,50,116}}, +/* 18579 */ {(15<<2)|3,{116,50,116}}, +/* 18580 */ {(16<<2)|3,{116,50,32}}, +/* 18581 */ {(16<<2)|3,{116,50,37}}, +/* 18582 */ {(16<<2)|3,{116,50,45}}, +/* 18583 */ {(16<<2)|3,{116,50,46}}, +/* 18584 */ {(16<<2)|3,{116,50,47}}, +/* 18585 */ {(16<<2)|3,{116,50,51}}, +/* 18586 */ {(16<<2)|3,{116,50,52}}, +/* 18587 */ {(16<<2)|3,{116,50,53}}, +/* 18588 */ {(16<<2)|3,{116,50,54}}, +/* 18589 */ {(16<<2)|3,{116,50,55}}, +/* 18590 */ {(16<<2)|3,{116,50,56}}, +/* 18591 */ {(16<<2)|3,{116,50,57}}, +/* 18592 */ {(16<<2)|3,{116,50,61}}, +/* 18593 */ {(16<<2)|3,{116,50,65}}, +/* 18594 */ {(16<<2)|3,{116,50,95}}, +/* 18595 */ {(16<<2)|3,{116,50,98}}, +/* 18596 */ {(16<<2)|3,{116,50,100}}, +/* 18597 */ {(16<<2)|3,{116,50,102}}, +/* 18598 */ {(16<<2)|3,{116,50,103}}, +/* 18599 */ {(16<<2)|3,{116,50,104}}, +/* 18600 */ {(16<<2)|3,{116,50,108}}, +/* 18601 */ {(16<<2)|3,{116,50,109}}, +/* 18602 */ {(16<<2)|3,{116,50,110}}, +/* 18603 */ {(16<<2)|3,{116,50,112}}, +/* 18604 */ {(16<<2)|3,{116,50,114}}, +/* 18605 */ {(16<<2)|3,{116,50,117}}, +/* 18606 */ {(10<<2)|2,{116,50,0}}, +/* 18607 */ {(10<<2)|2,{116,50,0}}, +/* 18608 */ {(10<<2)|2,{116,50,0}}, +/* 18609 */ {(10<<2)|2,{116,50,0}}, +/* 18610 */ {(10<<2)|2,{116,50,0}}, +/* 18611 */ {(10<<2)|2,{116,50,0}}, +/* 18612 */ {(10<<2)|2,{116,50,0}}, +/* 18613 */ {(10<<2)|2,{116,50,0}}, +/* 18614 */ {(10<<2)|2,{116,50,0}}, +/* 18615 */ {(10<<2)|2,{116,50,0}}, +/* 18616 */ {(10<<2)|2,{116,50,0}}, +/* 18617 */ {(10<<2)|2,{116,50,0}}, +/* 18618 */ {(10<<2)|2,{116,50,0}}, +/* 18619 */ {(10<<2)|2,{116,50,0}}, +/* 18620 */ {(10<<2)|2,{116,50,0}}, +/* 18621 */ {(10<<2)|2,{116,50,0}}, +/* 18622 */ {(10<<2)|2,{116,50,0}}, +/* 18623 */ {(10<<2)|2,{116,50,0}}, +/* 18624 */ {(15<<2)|3,{116,97,48}}, +/* 18625 */ {(15<<2)|3,{116,97,48}}, +/* 18626 */ {(15<<2)|3,{116,97,49}}, +/* 18627 */ {(15<<2)|3,{116,97,49}}, +/* 18628 */ {(15<<2)|3,{116,97,50}}, +/* 18629 */ {(15<<2)|3,{116,97,50}}, +/* 18630 */ {(15<<2)|3,{116,97,97}}, +/* 18631 */ {(15<<2)|3,{116,97,97}}, +/* 18632 */ {(15<<2)|3,{116,97,99}}, +/* 18633 */ {(15<<2)|3,{116,97,99}}, +/* 18634 */ {(15<<2)|3,{116,97,101}}, +/* 18635 */ {(15<<2)|3,{116,97,101}}, +/* 18636 */ {(15<<2)|3,{116,97,105}}, +/* 18637 */ {(15<<2)|3,{116,97,105}}, +/* 18638 */ {(15<<2)|3,{116,97,111}}, +/* 18639 */ {(15<<2)|3,{116,97,111}}, +/* 18640 */ {(15<<2)|3,{116,97,115}}, +/* 18641 */ {(15<<2)|3,{116,97,115}}, +/* 18642 */ {(15<<2)|3,{116,97,116}}, +/* 18643 */ {(15<<2)|3,{116,97,116}}, +/* 18644 */ {(16<<2)|3,{116,97,32}}, +/* 18645 */ {(16<<2)|3,{116,97,37}}, +/* 18646 */ {(16<<2)|3,{116,97,45}}, +/* 18647 */ {(16<<2)|3,{116,97,46}}, +/* 18648 */ {(16<<2)|3,{116,97,47}}, +/* 18649 */ {(16<<2)|3,{116,97,51}}, +/* 18650 */ {(16<<2)|3,{116,97,52}}, +/* 18651 */ {(16<<2)|3,{116,97,53}}, +/* 18652 */ {(16<<2)|3,{116,97,54}}, +/* 18653 */ {(16<<2)|3,{116,97,55}}, +/* 18654 */ {(16<<2)|3,{116,97,56}}, +/* 18655 */ {(16<<2)|3,{116,97,57}}, +/* 18656 */ {(16<<2)|3,{116,97,61}}, +/* 18657 */ {(16<<2)|3,{116,97,65}}, +/* 18658 */ {(16<<2)|3,{116,97,95}}, +/* 18659 */ {(16<<2)|3,{116,97,98}}, +/* 18660 */ {(16<<2)|3,{116,97,100}}, +/* 18661 */ {(16<<2)|3,{116,97,102}}, +/* 18662 */ {(16<<2)|3,{116,97,103}}, +/* 18663 */ {(16<<2)|3,{116,97,104}}, +/* 18664 */ {(16<<2)|3,{116,97,108}}, +/* 18665 */ {(16<<2)|3,{116,97,109}}, +/* 18666 */ {(16<<2)|3,{116,97,110}}, +/* 18667 */ {(16<<2)|3,{116,97,112}}, +/* 18668 */ {(16<<2)|3,{116,97,114}}, +/* 18669 */ {(16<<2)|3,{116,97,117}}, +/* 18670 */ {(10<<2)|2,{116,97,0}}, +/* 18671 */ {(10<<2)|2,{116,97,0}}, +/* 18672 */ {(10<<2)|2,{116,97,0}}, +/* 18673 */ {(10<<2)|2,{116,97,0}}, +/* 18674 */ {(10<<2)|2,{116,97,0}}, +/* 18675 */ {(10<<2)|2,{116,97,0}}, +/* 18676 */ {(10<<2)|2,{116,97,0}}, +/* 18677 */ {(10<<2)|2,{116,97,0}}, +/* 18678 */ {(10<<2)|2,{116,97,0}}, +/* 18679 */ {(10<<2)|2,{116,97,0}}, +/* 18680 */ {(10<<2)|2,{116,97,0}}, +/* 18681 */ {(10<<2)|2,{116,97,0}}, +/* 18682 */ {(10<<2)|2,{116,97,0}}, +/* 18683 */ {(10<<2)|2,{116,97,0}}, +/* 18684 */ {(10<<2)|2,{116,97,0}}, +/* 18685 */ {(10<<2)|2,{116,97,0}}, +/* 18686 */ {(10<<2)|2,{116,97,0}}, +/* 18687 */ {(10<<2)|2,{116,97,0}}, +/* 18688 */ {(15<<2)|3,{116,99,48}}, +/* 18689 */ {(15<<2)|3,{116,99,48}}, +/* 18690 */ {(15<<2)|3,{116,99,49}}, +/* 18691 */ {(15<<2)|3,{116,99,49}}, +/* 18692 */ {(15<<2)|3,{116,99,50}}, +/* 18693 */ {(15<<2)|3,{116,99,50}}, +/* 18694 */ {(15<<2)|3,{116,99,97}}, +/* 18695 */ {(15<<2)|3,{116,99,97}}, +/* 18696 */ {(15<<2)|3,{116,99,99}}, +/* 18697 */ {(15<<2)|3,{116,99,99}}, +/* 18698 */ {(15<<2)|3,{116,99,101}}, +/* 18699 */ {(15<<2)|3,{116,99,101}}, +/* 18700 */ {(15<<2)|3,{116,99,105}}, +/* 18701 */ {(15<<2)|3,{116,99,105}}, +/* 18702 */ {(15<<2)|3,{116,99,111}}, +/* 18703 */ {(15<<2)|3,{116,99,111}}, +/* 18704 */ {(15<<2)|3,{116,99,115}}, +/* 18705 */ {(15<<2)|3,{116,99,115}}, +/* 18706 */ {(15<<2)|3,{116,99,116}}, +/* 18707 */ {(15<<2)|3,{116,99,116}}, +/* 18708 */ {(16<<2)|3,{116,99,32}}, +/* 18709 */ {(16<<2)|3,{116,99,37}}, +/* 18710 */ {(16<<2)|3,{116,99,45}}, +/* 18711 */ {(16<<2)|3,{116,99,46}}, +/* 18712 */ {(16<<2)|3,{116,99,47}}, +/* 18713 */ {(16<<2)|3,{116,99,51}}, +/* 18714 */ {(16<<2)|3,{116,99,52}}, +/* 18715 */ {(16<<2)|3,{116,99,53}}, +/* 18716 */ {(16<<2)|3,{116,99,54}}, +/* 18717 */ {(16<<2)|3,{116,99,55}}, +/* 18718 */ {(16<<2)|3,{116,99,56}}, +/* 18719 */ {(16<<2)|3,{116,99,57}}, +/* 18720 */ {(16<<2)|3,{116,99,61}}, +/* 18721 */ {(16<<2)|3,{116,99,65}}, +/* 18722 */ {(16<<2)|3,{116,99,95}}, +/* 18723 */ {(16<<2)|3,{116,99,98}}, +/* 18724 */ {(16<<2)|3,{116,99,100}}, +/* 18725 */ {(16<<2)|3,{116,99,102}}, +/* 18726 */ {(16<<2)|3,{116,99,103}}, +/* 18727 */ {(16<<2)|3,{116,99,104}}, +/* 18728 */ {(16<<2)|3,{116,99,108}}, +/* 18729 */ {(16<<2)|3,{116,99,109}}, +/* 18730 */ {(16<<2)|3,{116,99,110}}, +/* 18731 */ {(16<<2)|3,{116,99,112}}, +/* 18732 */ {(16<<2)|3,{116,99,114}}, +/* 18733 */ {(16<<2)|3,{116,99,117}}, +/* 18734 */ {(10<<2)|2,{116,99,0}}, +/* 18735 */ {(10<<2)|2,{116,99,0}}, +/* 18736 */ {(10<<2)|2,{116,99,0}}, +/* 18737 */ {(10<<2)|2,{116,99,0}}, +/* 18738 */ {(10<<2)|2,{116,99,0}}, +/* 18739 */ {(10<<2)|2,{116,99,0}}, +/* 18740 */ {(10<<2)|2,{116,99,0}}, +/* 18741 */ {(10<<2)|2,{116,99,0}}, +/* 18742 */ {(10<<2)|2,{116,99,0}}, +/* 18743 */ {(10<<2)|2,{116,99,0}}, +/* 18744 */ {(10<<2)|2,{116,99,0}}, +/* 18745 */ {(10<<2)|2,{116,99,0}}, +/* 18746 */ {(10<<2)|2,{116,99,0}}, +/* 18747 */ {(10<<2)|2,{116,99,0}}, +/* 18748 */ {(10<<2)|2,{116,99,0}}, +/* 18749 */ {(10<<2)|2,{116,99,0}}, +/* 18750 */ {(10<<2)|2,{116,99,0}}, +/* 18751 */ {(10<<2)|2,{116,99,0}}, +/* 18752 */ {(15<<2)|3,{116,101,48}}, +/* 18753 */ {(15<<2)|3,{116,101,48}}, +/* 18754 */ {(15<<2)|3,{116,101,49}}, +/* 18755 */ {(15<<2)|3,{116,101,49}}, +/* 18756 */ {(15<<2)|3,{116,101,50}}, +/* 18757 */ {(15<<2)|3,{116,101,50}}, +/* 18758 */ {(15<<2)|3,{116,101,97}}, +/* 18759 */ {(15<<2)|3,{116,101,97}}, +/* 18760 */ {(15<<2)|3,{116,101,99}}, +/* 18761 */ {(15<<2)|3,{116,101,99}}, +/* 18762 */ {(15<<2)|3,{116,101,101}}, +/* 18763 */ {(15<<2)|3,{116,101,101}}, +/* 18764 */ {(15<<2)|3,{116,101,105}}, +/* 18765 */ {(15<<2)|3,{116,101,105}}, +/* 18766 */ {(15<<2)|3,{116,101,111}}, +/* 18767 */ {(15<<2)|3,{116,101,111}}, +/* 18768 */ {(15<<2)|3,{116,101,115}}, +/* 18769 */ {(15<<2)|3,{116,101,115}}, +/* 18770 */ {(15<<2)|3,{116,101,116}}, +/* 18771 */ {(15<<2)|3,{116,101,116}}, +/* 18772 */ {(16<<2)|3,{116,101,32}}, +/* 18773 */ {(16<<2)|3,{116,101,37}}, +/* 18774 */ {(16<<2)|3,{116,101,45}}, +/* 18775 */ {(16<<2)|3,{116,101,46}}, +/* 18776 */ {(16<<2)|3,{116,101,47}}, +/* 18777 */ {(16<<2)|3,{116,101,51}}, +/* 18778 */ {(16<<2)|3,{116,101,52}}, +/* 18779 */ {(16<<2)|3,{116,101,53}}, +/* 18780 */ {(16<<2)|3,{116,101,54}}, +/* 18781 */ {(16<<2)|3,{116,101,55}}, +/* 18782 */ {(16<<2)|3,{116,101,56}}, +/* 18783 */ {(16<<2)|3,{116,101,57}}, +/* 18784 */ {(16<<2)|3,{116,101,61}}, +/* 18785 */ {(16<<2)|3,{116,101,65}}, +/* 18786 */ {(16<<2)|3,{116,101,95}}, +/* 18787 */ {(16<<2)|3,{116,101,98}}, +/* 18788 */ {(16<<2)|3,{116,101,100}}, +/* 18789 */ {(16<<2)|3,{116,101,102}}, +/* 18790 */ {(16<<2)|3,{116,101,103}}, +/* 18791 */ {(16<<2)|3,{116,101,104}}, +/* 18792 */ {(16<<2)|3,{116,101,108}}, +/* 18793 */ {(16<<2)|3,{116,101,109}}, +/* 18794 */ {(16<<2)|3,{116,101,110}}, +/* 18795 */ {(16<<2)|3,{116,101,112}}, +/* 18796 */ {(16<<2)|3,{116,101,114}}, +/* 18797 */ {(16<<2)|3,{116,101,117}}, +/* 18798 */ {(10<<2)|2,{116,101,0}}, +/* 18799 */ {(10<<2)|2,{116,101,0}}, +/* 18800 */ {(10<<2)|2,{116,101,0}}, +/* 18801 */ {(10<<2)|2,{116,101,0}}, +/* 18802 */ {(10<<2)|2,{116,101,0}}, +/* 18803 */ {(10<<2)|2,{116,101,0}}, +/* 18804 */ {(10<<2)|2,{116,101,0}}, +/* 18805 */ {(10<<2)|2,{116,101,0}}, +/* 18806 */ {(10<<2)|2,{116,101,0}}, +/* 18807 */ {(10<<2)|2,{116,101,0}}, +/* 18808 */ {(10<<2)|2,{116,101,0}}, +/* 18809 */ {(10<<2)|2,{116,101,0}}, +/* 18810 */ {(10<<2)|2,{116,101,0}}, +/* 18811 */ {(10<<2)|2,{116,101,0}}, +/* 18812 */ {(10<<2)|2,{116,101,0}}, +/* 18813 */ {(10<<2)|2,{116,101,0}}, +/* 18814 */ {(10<<2)|2,{116,101,0}}, +/* 18815 */ {(10<<2)|2,{116,101,0}}, +/* 18816 */ {(15<<2)|3,{116,105,48}}, +/* 18817 */ {(15<<2)|3,{116,105,48}}, +/* 18818 */ {(15<<2)|3,{116,105,49}}, +/* 18819 */ {(15<<2)|3,{116,105,49}}, +/* 18820 */ {(15<<2)|3,{116,105,50}}, +/* 18821 */ {(15<<2)|3,{116,105,50}}, +/* 18822 */ {(15<<2)|3,{116,105,97}}, +/* 18823 */ {(15<<2)|3,{116,105,97}}, +/* 18824 */ {(15<<2)|3,{116,105,99}}, +/* 18825 */ {(15<<2)|3,{116,105,99}}, +/* 18826 */ {(15<<2)|3,{116,105,101}}, +/* 18827 */ {(15<<2)|3,{116,105,101}}, +/* 18828 */ {(15<<2)|3,{116,105,105}}, +/* 18829 */ {(15<<2)|3,{116,105,105}}, +/* 18830 */ {(15<<2)|3,{116,105,111}}, +/* 18831 */ {(15<<2)|3,{116,105,111}}, +/* 18832 */ {(15<<2)|3,{116,105,115}}, +/* 18833 */ {(15<<2)|3,{116,105,115}}, +/* 18834 */ {(15<<2)|3,{116,105,116}}, +/* 18835 */ {(15<<2)|3,{116,105,116}}, +/* 18836 */ {(16<<2)|3,{116,105,32}}, +/* 18837 */ {(16<<2)|3,{116,105,37}}, +/* 18838 */ {(16<<2)|3,{116,105,45}}, +/* 18839 */ {(16<<2)|3,{116,105,46}}, +/* 18840 */ {(16<<2)|3,{116,105,47}}, +/* 18841 */ {(16<<2)|3,{116,105,51}}, +/* 18842 */ {(16<<2)|3,{116,105,52}}, +/* 18843 */ {(16<<2)|3,{116,105,53}}, +/* 18844 */ {(16<<2)|3,{116,105,54}}, +/* 18845 */ {(16<<2)|3,{116,105,55}}, +/* 18846 */ {(16<<2)|3,{116,105,56}}, +/* 18847 */ {(16<<2)|3,{116,105,57}}, +/* 18848 */ {(16<<2)|3,{116,105,61}}, +/* 18849 */ {(16<<2)|3,{116,105,65}}, +/* 18850 */ {(16<<2)|3,{116,105,95}}, +/* 18851 */ {(16<<2)|3,{116,105,98}}, +/* 18852 */ {(16<<2)|3,{116,105,100}}, +/* 18853 */ {(16<<2)|3,{116,105,102}}, +/* 18854 */ {(16<<2)|3,{116,105,103}}, +/* 18855 */ {(16<<2)|3,{116,105,104}}, +/* 18856 */ {(16<<2)|3,{116,105,108}}, +/* 18857 */ {(16<<2)|3,{116,105,109}}, +/* 18858 */ {(16<<2)|3,{116,105,110}}, +/* 18859 */ {(16<<2)|3,{116,105,112}}, +/* 18860 */ {(16<<2)|3,{116,105,114}}, +/* 18861 */ {(16<<2)|3,{116,105,117}}, +/* 18862 */ {(10<<2)|2,{116,105,0}}, +/* 18863 */ {(10<<2)|2,{116,105,0}}, +/* 18864 */ {(10<<2)|2,{116,105,0}}, +/* 18865 */ {(10<<2)|2,{116,105,0}}, +/* 18866 */ {(10<<2)|2,{116,105,0}}, +/* 18867 */ {(10<<2)|2,{116,105,0}}, +/* 18868 */ {(10<<2)|2,{116,105,0}}, +/* 18869 */ {(10<<2)|2,{116,105,0}}, +/* 18870 */ {(10<<2)|2,{116,105,0}}, +/* 18871 */ {(10<<2)|2,{116,105,0}}, +/* 18872 */ {(10<<2)|2,{116,105,0}}, +/* 18873 */ {(10<<2)|2,{116,105,0}}, +/* 18874 */ {(10<<2)|2,{116,105,0}}, +/* 18875 */ {(10<<2)|2,{116,105,0}}, +/* 18876 */ {(10<<2)|2,{116,105,0}}, +/* 18877 */ {(10<<2)|2,{116,105,0}}, +/* 18878 */ {(10<<2)|2,{116,105,0}}, +/* 18879 */ {(10<<2)|2,{116,105,0}}, +/* 18880 */ {(15<<2)|3,{116,111,48}}, +/* 18881 */ {(15<<2)|3,{116,111,48}}, +/* 18882 */ {(15<<2)|3,{116,111,49}}, +/* 18883 */ {(15<<2)|3,{116,111,49}}, +/* 18884 */ {(15<<2)|3,{116,111,50}}, +/* 18885 */ {(15<<2)|3,{116,111,50}}, +/* 18886 */ {(15<<2)|3,{116,111,97}}, +/* 18887 */ {(15<<2)|3,{116,111,97}}, +/* 18888 */ {(15<<2)|3,{116,111,99}}, +/* 18889 */ {(15<<2)|3,{116,111,99}}, +/* 18890 */ {(15<<2)|3,{116,111,101}}, +/* 18891 */ {(15<<2)|3,{116,111,101}}, +/* 18892 */ {(15<<2)|3,{116,111,105}}, +/* 18893 */ {(15<<2)|3,{116,111,105}}, +/* 18894 */ {(15<<2)|3,{116,111,111}}, +/* 18895 */ {(15<<2)|3,{116,111,111}}, +/* 18896 */ {(15<<2)|3,{116,111,115}}, +/* 18897 */ {(15<<2)|3,{116,111,115}}, +/* 18898 */ {(15<<2)|3,{116,111,116}}, +/* 18899 */ {(15<<2)|3,{116,111,116}}, +/* 18900 */ {(16<<2)|3,{116,111,32}}, +/* 18901 */ {(16<<2)|3,{116,111,37}}, +/* 18902 */ {(16<<2)|3,{116,111,45}}, +/* 18903 */ {(16<<2)|3,{116,111,46}}, +/* 18904 */ {(16<<2)|3,{116,111,47}}, +/* 18905 */ {(16<<2)|3,{116,111,51}}, +/* 18906 */ {(16<<2)|3,{116,111,52}}, +/* 18907 */ {(16<<2)|3,{116,111,53}}, +/* 18908 */ {(16<<2)|3,{116,111,54}}, +/* 18909 */ {(16<<2)|3,{116,111,55}}, +/* 18910 */ {(16<<2)|3,{116,111,56}}, +/* 18911 */ {(16<<2)|3,{116,111,57}}, +/* 18912 */ {(16<<2)|3,{116,111,61}}, +/* 18913 */ {(16<<2)|3,{116,111,65}}, +/* 18914 */ {(16<<2)|3,{116,111,95}}, +/* 18915 */ {(16<<2)|3,{116,111,98}}, +/* 18916 */ {(16<<2)|3,{116,111,100}}, +/* 18917 */ {(16<<2)|3,{116,111,102}}, +/* 18918 */ {(16<<2)|3,{116,111,103}}, +/* 18919 */ {(16<<2)|3,{116,111,104}}, +/* 18920 */ {(16<<2)|3,{116,111,108}}, +/* 18921 */ {(16<<2)|3,{116,111,109}}, +/* 18922 */ {(16<<2)|3,{116,111,110}}, +/* 18923 */ {(16<<2)|3,{116,111,112}}, +/* 18924 */ {(16<<2)|3,{116,111,114}}, +/* 18925 */ {(16<<2)|3,{116,111,117}}, +/* 18926 */ {(10<<2)|2,{116,111,0}}, +/* 18927 */ {(10<<2)|2,{116,111,0}}, +/* 18928 */ {(10<<2)|2,{116,111,0}}, +/* 18929 */ {(10<<2)|2,{116,111,0}}, +/* 18930 */ {(10<<2)|2,{116,111,0}}, +/* 18931 */ {(10<<2)|2,{116,111,0}}, +/* 18932 */ {(10<<2)|2,{116,111,0}}, +/* 18933 */ {(10<<2)|2,{116,111,0}}, +/* 18934 */ {(10<<2)|2,{116,111,0}}, +/* 18935 */ {(10<<2)|2,{116,111,0}}, +/* 18936 */ {(10<<2)|2,{116,111,0}}, +/* 18937 */ {(10<<2)|2,{116,111,0}}, +/* 18938 */ {(10<<2)|2,{116,111,0}}, +/* 18939 */ {(10<<2)|2,{116,111,0}}, +/* 18940 */ {(10<<2)|2,{116,111,0}}, +/* 18941 */ {(10<<2)|2,{116,111,0}}, +/* 18942 */ {(10<<2)|2,{116,111,0}}, +/* 18943 */ {(10<<2)|2,{116,111,0}}, +/* 18944 */ {(15<<2)|3,{116,115,48}}, +/* 18945 */ {(15<<2)|3,{116,115,48}}, +/* 18946 */ {(15<<2)|3,{116,115,49}}, +/* 18947 */ {(15<<2)|3,{116,115,49}}, +/* 18948 */ {(15<<2)|3,{116,115,50}}, +/* 18949 */ {(15<<2)|3,{116,115,50}}, +/* 18950 */ {(15<<2)|3,{116,115,97}}, +/* 18951 */ {(15<<2)|3,{116,115,97}}, +/* 18952 */ {(15<<2)|3,{116,115,99}}, +/* 18953 */ {(15<<2)|3,{116,115,99}}, +/* 18954 */ {(15<<2)|3,{116,115,101}}, +/* 18955 */ {(15<<2)|3,{116,115,101}}, +/* 18956 */ {(15<<2)|3,{116,115,105}}, +/* 18957 */ {(15<<2)|3,{116,115,105}}, +/* 18958 */ {(15<<2)|3,{116,115,111}}, +/* 18959 */ {(15<<2)|3,{116,115,111}}, +/* 18960 */ {(15<<2)|3,{116,115,115}}, +/* 18961 */ {(15<<2)|3,{116,115,115}}, +/* 18962 */ {(15<<2)|3,{116,115,116}}, +/* 18963 */ {(15<<2)|3,{116,115,116}}, +/* 18964 */ {(16<<2)|3,{116,115,32}}, +/* 18965 */ {(16<<2)|3,{116,115,37}}, +/* 18966 */ {(16<<2)|3,{116,115,45}}, +/* 18967 */ {(16<<2)|3,{116,115,46}}, +/* 18968 */ {(16<<2)|3,{116,115,47}}, +/* 18969 */ {(16<<2)|3,{116,115,51}}, +/* 18970 */ {(16<<2)|3,{116,115,52}}, +/* 18971 */ {(16<<2)|3,{116,115,53}}, +/* 18972 */ {(16<<2)|3,{116,115,54}}, +/* 18973 */ {(16<<2)|3,{116,115,55}}, +/* 18974 */ {(16<<2)|3,{116,115,56}}, +/* 18975 */ {(16<<2)|3,{116,115,57}}, +/* 18976 */ {(16<<2)|3,{116,115,61}}, +/* 18977 */ {(16<<2)|3,{116,115,65}}, +/* 18978 */ {(16<<2)|3,{116,115,95}}, +/* 18979 */ {(16<<2)|3,{116,115,98}}, +/* 18980 */ {(16<<2)|3,{116,115,100}}, +/* 18981 */ {(16<<2)|3,{116,115,102}}, +/* 18982 */ {(16<<2)|3,{116,115,103}}, +/* 18983 */ {(16<<2)|3,{116,115,104}}, +/* 18984 */ {(16<<2)|3,{116,115,108}}, +/* 18985 */ {(16<<2)|3,{116,115,109}}, +/* 18986 */ {(16<<2)|3,{116,115,110}}, +/* 18987 */ {(16<<2)|3,{116,115,112}}, +/* 18988 */ {(16<<2)|3,{116,115,114}}, +/* 18989 */ {(16<<2)|3,{116,115,117}}, +/* 18990 */ {(10<<2)|2,{116,115,0}}, +/* 18991 */ {(10<<2)|2,{116,115,0}}, +/* 18992 */ {(10<<2)|2,{116,115,0}}, +/* 18993 */ {(10<<2)|2,{116,115,0}}, +/* 18994 */ {(10<<2)|2,{116,115,0}}, +/* 18995 */ {(10<<2)|2,{116,115,0}}, +/* 18996 */ {(10<<2)|2,{116,115,0}}, +/* 18997 */ {(10<<2)|2,{116,115,0}}, +/* 18998 */ {(10<<2)|2,{116,115,0}}, +/* 18999 */ {(10<<2)|2,{116,115,0}}, +/* 19000 */ {(10<<2)|2,{116,115,0}}, +/* 19001 */ {(10<<2)|2,{116,115,0}}, +/* 19002 */ {(10<<2)|2,{116,115,0}}, +/* 19003 */ {(10<<2)|2,{116,115,0}}, +/* 19004 */ {(10<<2)|2,{116,115,0}}, +/* 19005 */ {(10<<2)|2,{116,115,0}}, +/* 19006 */ {(10<<2)|2,{116,115,0}}, +/* 19007 */ {(10<<2)|2,{116,115,0}}, +/* 19008 */ {(15<<2)|3,{116,116,48}}, +/* 19009 */ {(15<<2)|3,{116,116,48}}, +/* 19010 */ {(15<<2)|3,{116,116,49}}, +/* 19011 */ {(15<<2)|3,{116,116,49}}, +/* 19012 */ {(15<<2)|3,{116,116,50}}, +/* 19013 */ {(15<<2)|3,{116,116,50}}, +/* 19014 */ {(15<<2)|3,{116,116,97}}, +/* 19015 */ {(15<<2)|3,{116,116,97}}, +/* 19016 */ {(15<<2)|3,{116,116,99}}, +/* 19017 */ {(15<<2)|3,{116,116,99}}, +/* 19018 */ {(15<<2)|3,{116,116,101}}, +/* 19019 */ {(15<<2)|3,{116,116,101}}, +/* 19020 */ {(15<<2)|3,{116,116,105}}, +/* 19021 */ {(15<<2)|3,{116,116,105}}, +/* 19022 */ {(15<<2)|3,{116,116,111}}, +/* 19023 */ {(15<<2)|3,{116,116,111}}, +/* 19024 */ {(15<<2)|3,{116,116,115}}, +/* 19025 */ {(15<<2)|3,{116,116,115}}, +/* 19026 */ {(15<<2)|3,{116,116,116}}, +/* 19027 */ {(15<<2)|3,{116,116,116}}, +/* 19028 */ {(16<<2)|3,{116,116,32}}, +/* 19029 */ {(16<<2)|3,{116,116,37}}, +/* 19030 */ {(16<<2)|3,{116,116,45}}, +/* 19031 */ {(16<<2)|3,{116,116,46}}, +/* 19032 */ {(16<<2)|3,{116,116,47}}, +/* 19033 */ {(16<<2)|3,{116,116,51}}, +/* 19034 */ {(16<<2)|3,{116,116,52}}, +/* 19035 */ {(16<<2)|3,{116,116,53}}, +/* 19036 */ {(16<<2)|3,{116,116,54}}, +/* 19037 */ {(16<<2)|3,{116,116,55}}, +/* 19038 */ {(16<<2)|3,{116,116,56}}, +/* 19039 */ {(16<<2)|3,{116,116,57}}, +/* 19040 */ {(16<<2)|3,{116,116,61}}, +/* 19041 */ {(16<<2)|3,{116,116,65}}, +/* 19042 */ {(16<<2)|3,{116,116,95}}, +/* 19043 */ {(16<<2)|3,{116,116,98}}, +/* 19044 */ {(16<<2)|3,{116,116,100}}, +/* 19045 */ {(16<<2)|3,{116,116,102}}, +/* 19046 */ {(16<<2)|3,{116,116,103}}, +/* 19047 */ {(16<<2)|3,{116,116,104}}, +/* 19048 */ {(16<<2)|3,{116,116,108}}, +/* 19049 */ {(16<<2)|3,{116,116,109}}, +/* 19050 */ {(16<<2)|3,{116,116,110}}, +/* 19051 */ {(16<<2)|3,{116,116,112}}, +/* 19052 */ {(16<<2)|3,{116,116,114}}, +/* 19053 */ {(16<<2)|3,{116,116,117}}, +/* 19054 */ {(10<<2)|2,{116,116,0}}, +/* 19055 */ {(10<<2)|2,{116,116,0}}, +/* 19056 */ {(10<<2)|2,{116,116,0}}, +/* 19057 */ {(10<<2)|2,{116,116,0}}, +/* 19058 */ {(10<<2)|2,{116,116,0}}, +/* 19059 */ {(10<<2)|2,{116,116,0}}, +/* 19060 */ {(10<<2)|2,{116,116,0}}, +/* 19061 */ {(10<<2)|2,{116,116,0}}, +/* 19062 */ {(10<<2)|2,{116,116,0}}, +/* 19063 */ {(10<<2)|2,{116,116,0}}, +/* 19064 */ {(10<<2)|2,{116,116,0}}, +/* 19065 */ {(10<<2)|2,{116,116,0}}, +/* 19066 */ {(10<<2)|2,{116,116,0}}, +/* 19067 */ {(10<<2)|2,{116,116,0}}, +/* 19068 */ {(10<<2)|2,{116,116,0}}, +/* 19069 */ {(10<<2)|2,{116,116,0}}, +/* 19070 */ {(10<<2)|2,{116,116,0}}, +/* 19071 */ {(10<<2)|2,{116,116,0}}, +/* 19072 */ {(16<<2)|3,{116,32,48}}, +/* 19073 */ {(16<<2)|3,{116,32,49}}, +/* 19074 */ {(16<<2)|3,{116,32,50}}, +/* 19075 */ {(16<<2)|3,{116,32,97}}, +/* 19076 */ {(16<<2)|3,{116,32,99}}, +/* 19077 */ {(16<<2)|3,{116,32,101}}, +/* 19078 */ {(16<<2)|3,{116,32,105}}, +/* 19079 */ {(16<<2)|3,{116,32,111}}, +/* 19080 */ {(16<<2)|3,{116,32,115}}, +/* 19081 */ {(16<<2)|3,{116,32,116}}, +/* 19082 */ {(11<<2)|2,{116,32,0}}, +/* 19083 */ {(11<<2)|2,{116,32,0}}, +/* 19084 */ {(11<<2)|2,{116,32,0}}, +/* 19085 */ {(11<<2)|2,{116,32,0}}, +/* 19086 */ {(11<<2)|2,{116,32,0}}, +/* 19087 */ {(11<<2)|2,{116,32,0}}, +/* 19088 */ {(11<<2)|2,{116,32,0}}, +/* 19089 */ {(11<<2)|2,{116,32,0}}, +/* 19090 */ {(11<<2)|2,{116,32,0}}, +/* 19091 */ {(11<<2)|2,{116,32,0}}, +/* 19092 */ {(11<<2)|2,{116,32,0}}, +/* 19093 */ {(11<<2)|2,{116,32,0}}, +/* 19094 */ {(11<<2)|2,{116,32,0}}, +/* 19095 */ {(11<<2)|2,{116,32,0}}, +/* 19096 */ {(11<<2)|2,{116,32,0}}, +/* 19097 */ {(11<<2)|2,{116,32,0}}, +/* 19098 */ {(11<<2)|2,{116,32,0}}, +/* 19099 */ {(11<<2)|2,{116,32,0}}, +/* 19100 */ {(11<<2)|2,{116,32,0}}, +/* 19101 */ {(11<<2)|2,{116,32,0}}, +/* 19102 */ {(11<<2)|2,{116,32,0}}, +/* 19103 */ {(11<<2)|2,{116,32,0}}, +/* 19104 */ {(16<<2)|3,{116,37,48}}, +/* 19105 */ {(16<<2)|3,{116,37,49}}, +/* 19106 */ {(16<<2)|3,{116,37,50}}, +/* 19107 */ {(16<<2)|3,{116,37,97}}, +/* 19108 */ {(16<<2)|3,{116,37,99}}, +/* 19109 */ {(16<<2)|3,{116,37,101}}, +/* 19110 */ {(16<<2)|3,{116,37,105}}, +/* 19111 */ {(16<<2)|3,{116,37,111}}, +/* 19112 */ {(16<<2)|3,{116,37,115}}, +/* 19113 */ {(16<<2)|3,{116,37,116}}, +/* 19114 */ {(11<<2)|2,{116,37,0}}, +/* 19115 */ {(11<<2)|2,{116,37,0}}, +/* 19116 */ {(11<<2)|2,{116,37,0}}, +/* 19117 */ {(11<<2)|2,{116,37,0}}, +/* 19118 */ {(11<<2)|2,{116,37,0}}, +/* 19119 */ {(11<<2)|2,{116,37,0}}, +/* 19120 */ {(11<<2)|2,{116,37,0}}, +/* 19121 */ {(11<<2)|2,{116,37,0}}, +/* 19122 */ {(11<<2)|2,{116,37,0}}, +/* 19123 */ {(11<<2)|2,{116,37,0}}, +/* 19124 */ {(11<<2)|2,{116,37,0}}, +/* 19125 */ {(11<<2)|2,{116,37,0}}, +/* 19126 */ {(11<<2)|2,{116,37,0}}, +/* 19127 */ {(11<<2)|2,{116,37,0}}, +/* 19128 */ {(11<<2)|2,{116,37,0}}, +/* 19129 */ {(11<<2)|2,{116,37,0}}, +/* 19130 */ {(11<<2)|2,{116,37,0}}, +/* 19131 */ {(11<<2)|2,{116,37,0}}, +/* 19132 */ {(11<<2)|2,{116,37,0}}, +/* 19133 */ {(11<<2)|2,{116,37,0}}, +/* 19134 */ {(11<<2)|2,{116,37,0}}, +/* 19135 */ {(11<<2)|2,{116,37,0}}, +/* 19136 */ {(16<<2)|3,{116,45,48}}, +/* 19137 */ {(16<<2)|3,{116,45,49}}, +/* 19138 */ {(16<<2)|3,{116,45,50}}, +/* 19139 */ {(16<<2)|3,{116,45,97}}, +/* 19140 */ {(16<<2)|3,{116,45,99}}, +/* 19141 */ {(16<<2)|3,{116,45,101}}, +/* 19142 */ {(16<<2)|3,{116,45,105}}, +/* 19143 */ {(16<<2)|3,{116,45,111}}, +/* 19144 */ {(16<<2)|3,{116,45,115}}, +/* 19145 */ {(16<<2)|3,{116,45,116}}, +/* 19146 */ {(11<<2)|2,{116,45,0}}, +/* 19147 */ {(11<<2)|2,{116,45,0}}, +/* 19148 */ {(11<<2)|2,{116,45,0}}, +/* 19149 */ {(11<<2)|2,{116,45,0}}, +/* 19150 */ {(11<<2)|2,{116,45,0}}, +/* 19151 */ {(11<<2)|2,{116,45,0}}, +/* 19152 */ {(11<<2)|2,{116,45,0}}, +/* 19153 */ {(11<<2)|2,{116,45,0}}, +/* 19154 */ {(11<<2)|2,{116,45,0}}, +/* 19155 */ {(11<<2)|2,{116,45,0}}, +/* 19156 */ {(11<<2)|2,{116,45,0}}, +/* 19157 */ {(11<<2)|2,{116,45,0}}, +/* 19158 */ {(11<<2)|2,{116,45,0}}, +/* 19159 */ {(11<<2)|2,{116,45,0}}, +/* 19160 */ {(11<<2)|2,{116,45,0}}, +/* 19161 */ {(11<<2)|2,{116,45,0}}, +/* 19162 */ {(11<<2)|2,{116,45,0}}, +/* 19163 */ {(11<<2)|2,{116,45,0}}, +/* 19164 */ {(11<<2)|2,{116,45,0}}, +/* 19165 */ {(11<<2)|2,{116,45,0}}, +/* 19166 */ {(11<<2)|2,{116,45,0}}, +/* 19167 */ {(11<<2)|2,{116,45,0}}, +/* 19168 */ {(16<<2)|3,{116,46,48}}, +/* 19169 */ {(16<<2)|3,{116,46,49}}, +/* 19170 */ {(16<<2)|3,{116,46,50}}, +/* 19171 */ {(16<<2)|3,{116,46,97}}, +/* 19172 */ {(16<<2)|3,{116,46,99}}, +/* 19173 */ {(16<<2)|3,{116,46,101}}, +/* 19174 */ {(16<<2)|3,{116,46,105}}, +/* 19175 */ {(16<<2)|3,{116,46,111}}, +/* 19176 */ {(16<<2)|3,{116,46,115}}, +/* 19177 */ {(16<<2)|3,{116,46,116}}, +/* 19178 */ {(11<<2)|2,{116,46,0}}, +/* 19179 */ {(11<<2)|2,{116,46,0}}, +/* 19180 */ {(11<<2)|2,{116,46,0}}, +/* 19181 */ {(11<<2)|2,{116,46,0}}, +/* 19182 */ {(11<<2)|2,{116,46,0}}, +/* 19183 */ {(11<<2)|2,{116,46,0}}, +/* 19184 */ {(11<<2)|2,{116,46,0}}, +/* 19185 */ {(11<<2)|2,{116,46,0}}, +/* 19186 */ {(11<<2)|2,{116,46,0}}, +/* 19187 */ {(11<<2)|2,{116,46,0}}, +/* 19188 */ {(11<<2)|2,{116,46,0}}, +/* 19189 */ {(11<<2)|2,{116,46,0}}, +/* 19190 */ {(11<<2)|2,{116,46,0}}, +/* 19191 */ {(11<<2)|2,{116,46,0}}, +/* 19192 */ {(11<<2)|2,{116,46,0}}, +/* 19193 */ {(11<<2)|2,{116,46,0}}, +/* 19194 */ {(11<<2)|2,{116,46,0}}, +/* 19195 */ {(11<<2)|2,{116,46,0}}, +/* 19196 */ {(11<<2)|2,{116,46,0}}, +/* 19197 */ {(11<<2)|2,{116,46,0}}, +/* 19198 */ {(11<<2)|2,{116,46,0}}, +/* 19199 */ {(11<<2)|2,{116,46,0}}, +/* 19200 */ {(16<<2)|3,{116,47,48}}, +/* 19201 */ {(16<<2)|3,{116,47,49}}, +/* 19202 */ {(16<<2)|3,{116,47,50}}, +/* 19203 */ {(16<<2)|3,{116,47,97}}, +/* 19204 */ {(16<<2)|3,{116,47,99}}, +/* 19205 */ {(16<<2)|3,{116,47,101}}, +/* 19206 */ {(16<<2)|3,{116,47,105}}, +/* 19207 */ {(16<<2)|3,{116,47,111}}, +/* 19208 */ {(16<<2)|3,{116,47,115}}, +/* 19209 */ {(16<<2)|3,{116,47,116}}, +/* 19210 */ {(11<<2)|2,{116,47,0}}, +/* 19211 */ {(11<<2)|2,{116,47,0}}, +/* 19212 */ {(11<<2)|2,{116,47,0}}, +/* 19213 */ {(11<<2)|2,{116,47,0}}, +/* 19214 */ {(11<<2)|2,{116,47,0}}, +/* 19215 */ {(11<<2)|2,{116,47,0}}, +/* 19216 */ {(11<<2)|2,{116,47,0}}, +/* 19217 */ {(11<<2)|2,{116,47,0}}, +/* 19218 */ {(11<<2)|2,{116,47,0}}, +/* 19219 */ {(11<<2)|2,{116,47,0}}, +/* 19220 */ {(11<<2)|2,{116,47,0}}, +/* 19221 */ {(11<<2)|2,{116,47,0}}, +/* 19222 */ {(11<<2)|2,{116,47,0}}, +/* 19223 */ {(11<<2)|2,{116,47,0}}, +/* 19224 */ {(11<<2)|2,{116,47,0}}, +/* 19225 */ {(11<<2)|2,{116,47,0}}, +/* 19226 */ {(11<<2)|2,{116,47,0}}, +/* 19227 */ {(11<<2)|2,{116,47,0}}, +/* 19228 */ {(11<<2)|2,{116,47,0}}, +/* 19229 */ {(11<<2)|2,{116,47,0}}, +/* 19230 */ {(11<<2)|2,{116,47,0}}, +/* 19231 */ {(11<<2)|2,{116,47,0}}, +/* 19232 */ {(16<<2)|3,{116,51,48}}, +/* 19233 */ {(16<<2)|3,{116,51,49}}, +/* 19234 */ {(16<<2)|3,{116,51,50}}, +/* 19235 */ {(16<<2)|3,{116,51,97}}, +/* 19236 */ {(16<<2)|3,{116,51,99}}, +/* 19237 */ {(16<<2)|3,{116,51,101}}, +/* 19238 */ {(16<<2)|3,{116,51,105}}, +/* 19239 */ {(16<<2)|3,{116,51,111}}, +/* 19240 */ {(16<<2)|3,{116,51,115}}, +/* 19241 */ {(16<<2)|3,{116,51,116}}, +/* 19242 */ {(11<<2)|2,{116,51,0}}, +/* 19243 */ {(11<<2)|2,{116,51,0}}, +/* 19244 */ {(11<<2)|2,{116,51,0}}, +/* 19245 */ {(11<<2)|2,{116,51,0}}, +/* 19246 */ {(11<<2)|2,{116,51,0}}, +/* 19247 */ {(11<<2)|2,{116,51,0}}, +/* 19248 */ {(11<<2)|2,{116,51,0}}, +/* 19249 */ {(11<<2)|2,{116,51,0}}, +/* 19250 */ {(11<<2)|2,{116,51,0}}, +/* 19251 */ {(11<<2)|2,{116,51,0}}, +/* 19252 */ {(11<<2)|2,{116,51,0}}, +/* 19253 */ {(11<<2)|2,{116,51,0}}, +/* 19254 */ {(11<<2)|2,{116,51,0}}, +/* 19255 */ {(11<<2)|2,{116,51,0}}, +/* 19256 */ {(11<<2)|2,{116,51,0}}, +/* 19257 */ {(11<<2)|2,{116,51,0}}, +/* 19258 */ {(11<<2)|2,{116,51,0}}, +/* 19259 */ {(11<<2)|2,{116,51,0}}, +/* 19260 */ {(11<<2)|2,{116,51,0}}, +/* 19261 */ {(11<<2)|2,{116,51,0}}, +/* 19262 */ {(11<<2)|2,{116,51,0}}, +/* 19263 */ {(11<<2)|2,{116,51,0}}, +/* 19264 */ {(16<<2)|3,{116,52,48}}, +/* 19265 */ {(16<<2)|3,{116,52,49}}, +/* 19266 */ {(16<<2)|3,{116,52,50}}, +/* 19267 */ {(16<<2)|3,{116,52,97}}, +/* 19268 */ {(16<<2)|3,{116,52,99}}, +/* 19269 */ {(16<<2)|3,{116,52,101}}, +/* 19270 */ {(16<<2)|3,{116,52,105}}, +/* 19271 */ {(16<<2)|3,{116,52,111}}, +/* 19272 */ {(16<<2)|3,{116,52,115}}, +/* 19273 */ {(16<<2)|3,{116,52,116}}, +/* 19274 */ {(11<<2)|2,{116,52,0}}, +/* 19275 */ {(11<<2)|2,{116,52,0}}, +/* 19276 */ {(11<<2)|2,{116,52,0}}, +/* 19277 */ {(11<<2)|2,{116,52,0}}, +/* 19278 */ {(11<<2)|2,{116,52,0}}, +/* 19279 */ {(11<<2)|2,{116,52,0}}, +/* 19280 */ {(11<<2)|2,{116,52,0}}, +/* 19281 */ {(11<<2)|2,{116,52,0}}, +/* 19282 */ {(11<<2)|2,{116,52,0}}, +/* 19283 */ {(11<<2)|2,{116,52,0}}, +/* 19284 */ {(11<<2)|2,{116,52,0}}, +/* 19285 */ {(11<<2)|2,{116,52,0}}, +/* 19286 */ {(11<<2)|2,{116,52,0}}, +/* 19287 */ {(11<<2)|2,{116,52,0}}, +/* 19288 */ {(11<<2)|2,{116,52,0}}, +/* 19289 */ {(11<<2)|2,{116,52,0}}, +/* 19290 */ {(11<<2)|2,{116,52,0}}, +/* 19291 */ {(11<<2)|2,{116,52,0}}, +/* 19292 */ {(11<<2)|2,{116,52,0}}, +/* 19293 */ {(11<<2)|2,{116,52,0}}, +/* 19294 */ {(11<<2)|2,{116,52,0}}, +/* 19295 */ {(11<<2)|2,{116,52,0}}, +/* 19296 */ {(16<<2)|3,{116,53,48}}, +/* 19297 */ {(16<<2)|3,{116,53,49}}, +/* 19298 */ {(16<<2)|3,{116,53,50}}, +/* 19299 */ {(16<<2)|3,{116,53,97}}, +/* 19300 */ {(16<<2)|3,{116,53,99}}, +/* 19301 */ {(16<<2)|3,{116,53,101}}, +/* 19302 */ {(16<<2)|3,{116,53,105}}, +/* 19303 */ {(16<<2)|3,{116,53,111}}, +/* 19304 */ {(16<<2)|3,{116,53,115}}, +/* 19305 */ {(16<<2)|3,{116,53,116}}, +/* 19306 */ {(11<<2)|2,{116,53,0}}, +/* 19307 */ {(11<<2)|2,{116,53,0}}, +/* 19308 */ {(11<<2)|2,{116,53,0}}, +/* 19309 */ {(11<<2)|2,{116,53,0}}, +/* 19310 */ {(11<<2)|2,{116,53,0}}, +/* 19311 */ {(11<<2)|2,{116,53,0}}, +/* 19312 */ {(11<<2)|2,{116,53,0}}, +/* 19313 */ {(11<<2)|2,{116,53,0}}, +/* 19314 */ {(11<<2)|2,{116,53,0}}, +/* 19315 */ {(11<<2)|2,{116,53,0}}, +/* 19316 */ {(11<<2)|2,{116,53,0}}, +/* 19317 */ {(11<<2)|2,{116,53,0}}, +/* 19318 */ {(11<<2)|2,{116,53,0}}, +/* 19319 */ {(11<<2)|2,{116,53,0}}, +/* 19320 */ {(11<<2)|2,{116,53,0}}, +/* 19321 */ {(11<<2)|2,{116,53,0}}, +/* 19322 */ {(11<<2)|2,{116,53,0}}, +/* 19323 */ {(11<<2)|2,{116,53,0}}, +/* 19324 */ {(11<<2)|2,{116,53,0}}, +/* 19325 */ {(11<<2)|2,{116,53,0}}, +/* 19326 */ {(11<<2)|2,{116,53,0}}, +/* 19327 */ {(11<<2)|2,{116,53,0}}, +/* 19328 */ {(16<<2)|3,{116,54,48}}, +/* 19329 */ {(16<<2)|3,{116,54,49}}, +/* 19330 */ {(16<<2)|3,{116,54,50}}, +/* 19331 */ {(16<<2)|3,{116,54,97}}, +/* 19332 */ {(16<<2)|3,{116,54,99}}, +/* 19333 */ {(16<<2)|3,{116,54,101}}, +/* 19334 */ {(16<<2)|3,{116,54,105}}, +/* 19335 */ {(16<<2)|3,{116,54,111}}, +/* 19336 */ {(16<<2)|3,{116,54,115}}, +/* 19337 */ {(16<<2)|3,{116,54,116}}, +/* 19338 */ {(11<<2)|2,{116,54,0}}, +/* 19339 */ {(11<<2)|2,{116,54,0}}, +/* 19340 */ {(11<<2)|2,{116,54,0}}, +/* 19341 */ {(11<<2)|2,{116,54,0}}, +/* 19342 */ {(11<<2)|2,{116,54,0}}, +/* 19343 */ {(11<<2)|2,{116,54,0}}, +/* 19344 */ {(11<<2)|2,{116,54,0}}, +/* 19345 */ {(11<<2)|2,{116,54,0}}, +/* 19346 */ {(11<<2)|2,{116,54,0}}, +/* 19347 */ {(11<<2)|2,{116,54,0}}, +/* 19348 */ {(11<<2)|2,{116,54,0}}, +/* 19349 */ {(11<<2)|2,{116,54,0}}, +/* 19350 */ {(11<<2)|2,{116,54,0}}, +/* 19351 */ {(11<<2)|2,{116,54,0}}, +/* 19352 */ {(11<<2)|2,{116,54,0}}, +/* 19353 */ {(11<<2)|2,{116,54,0}}, +/* 19354 */ {(11<<2)|2,{116,54,0}}, +/* 19355 */ {(11<<2)|2,{116,54,0}}, +/* 19356 */ {(11<<2)|2,{116,54,0}}, +/* 19357 */ {(11<<2)|2,{116,54,0}}, +/* 19358 */ {(11<<2)|2,{116,54,0}}, +/* 19359 */ {(11<<2)|2,{116,54,0}}, +/* 19360 */ {(16<<2)|3,{116,55,48}}, +/* 19361 */ {(16<<2)|3,{116,55,49}}, +/* 19362 */ {(16<<2)|3,{116,55,50}}, +/* 19363 */ {(16<<2)|3,{116,55,97}}, +/* 19364 */ {(16<<2)|3,{116,55,99}}, +/* 19365 */ {(16<<2)|3,{116,55,101}}, +/* 19366 */ {(16<<2)|3,{116,55,105}}, +/* 19367 */ {(16<<2)|3,{116,55,111}}, +/* 19368 */ {(16<<2)|3,{116,55,115}}, +/* 19369 */ {(16<<2)|3,{116,55,116}}, +/* 19370 */ {(11<<2)|2,{116,55,0}}, +/* 19371 */ {(11<<2)|2,{116,55,0}}, +/* 19372 */ {(11<<2)|2,{116,55,0}}, +/* 19373 */ {(11<<2)|2,{116,55,0}}, +/* 19374 */ {(11<<2)|2,{116,55,0}}, +/* 19375 */ {(11<<2)|2,{116,55,0}}, +/* 19376 */ {(11<<2)|2,{116,55,0}}, +/* 19377 */ {(11<<2)|2,{116,55,0}}, +/* 19378 */ {(11<<2)|2,{116,55,0}}, +/* 19379 */ {(11<<2)|2,{116,55,0}}, +/* 19380 */ {(11<<2)|2,{116,55,0}}, +/* 19381 */ {(11<<2)|2,{116,55,0}}, +/* 19382 */ {(11<<2)|2,{116,55,0}}, +/* 19383 */ {(11<<2)|2,{116,55,0}}, +/* 19384 */ {(11<<2)|2,{116,55,0}}, +/* 19385 */ {(11<<2)|2,{116,55,0}}, +/* 19386 */ {(11<<2)|2,{116,55,0}}, +/* 19387 */ {(11<<2)|2,{116,55,0}}, +/* 19388 */ {(11<<2)|2,{116,55,0}}, +/* 19389 */ {(11<<2)|2,{116,55,0}}, +/* 19390 */ {(11<<2)|2,{116,55,0}}, +/* 19391 */ {(11<<2)|2,{116,55,0}}, +/* 19392 */ {(16<<2)|3,{116,56,48}}, +/* 19393 */ {(16<<2)|3,{116,56,49}}, +/* 19394 */ {(16<<2)|3,{116,56,50}}, +/* 19395 */ {(16<<2)|3,{116,56,97}}, +/* 19396 */ {(16<<2)|3,{116,56,99}}, +/* 19397 */ {(16<<2)|3,{116,56,101}}, +/* 19398 */ {(16<<2)|3,{116,56,105}}, +/* 19399 */ {(16<<2)|3,{116,56,111}}, +/* 19400 */ {(16<<2)|3,{116,56,115}}, +/* 19401 */ {(16<<2)|3,{116,56,116}}, +/* 19402 */ {(11<<2)|2,{116,56,0}}, +/* 19403 */ {(11<<2)|2,{116,56,0}}, +/* 19404 */ {(11<<2)|2,{116,56,0}}, +/* 19405 */ {(11<<2)|2,{116,56,0}}, +/* 19406 */ {(11<<2)|2,{116,56,0}}, +/* 19407 */ {(11<<2)|2,{116,56,0}}, +/* 19408 */ {(11<<2)|2,{116,56,0}}, +/* 19409 */ {(11<<2)|2,{116,56,0}}, +/* 19410 */ {(11<<2)|2,{116,56,0}}, +/* 19411 */ {(11<<2)|2,{116,56,0}}, +/* 19412 */ {(11<<2)|2,{116,56,0}}, +/* 19413 */ {(11<<2)|2,{116,56,0}}, +/* 19414 */ {(11<<2)|2,{116,56,0}}, +/* 19415 */ {(11<<2)|2,{116,56,0}}, +/* 19416 */ {(11<<2)|2,{116,56,0}}, +/* 19417 */ {(11<<2)|2,{116,56,0}}, +/* 19418 */ {(11<<2)|2,{116,56,0}}, +/* 19419 */ {(11<<2)|2,{116,56,0}}, +/* 19420 */ {(11<<2)|2,{116,56,0}}, +/* 19421 */ {(11<<2)|2,{116,56,0}}, +/* 19422 */ {(11<<2)|2,{116,56,0}}, +/* 19423 */ {(11<<2)|2,{116,56,0}}, +/* 19424 */ {(16<<2)|3,{116,57,48}}, +/* 19425 */ {(16<<2)|3,{116,57,49}}, +/* 19426 */ {(16<<2)|3,{116,57,50}}, +/* 19427 */ {(16<<2)|3,{116,57,97}}, +/* 19428 */ {(16<<2)|3,{116,57,99}}, +/* 19429 */ {(16<<2)|3,{116,57,101}}, +/* 19430 */ {(16<<2)|3,{116,57,105}}, +/* 19431 */ {(16<<2)|3,{116,57,111}}, +/* 19432 */ {(16<<2)|3,{116,57,115}}, +/* 19433 */ {(16<<2)|3,{116,57,116}}, +/* 19434 */ {(11<<2)|2,{116,57,0}}, +/* 19435 */ {(11<<2)|2,{116,57,0}}, +/* 19436 */ {(11<<2)|2,{116,57,0}}, +/* 19437 */ {(11<<2)|2,{116,57,0}}, +/* 19438 */ {(11<<2)|2,{116,57,0}}, +/* 19439 */ {(11<<2)|2,{116,57,0}}, +/* 19440 */ {(11<<2)|2,{116,57,0}}, +/* 19441 */ {(11<<2)|2,{116,57,0}}, +/* 19442 */ {(11<<2)|2,{116,57,0}}, +/* 19443 */ {(11<<2)|2,{116,57,0}}, +/* 19444 */ {(11<<2)|2,{116,57,0}}, +/* 19445 */ {(11<<2)|2,{116,57,0}}, +/* 19446 */ {(11<<2)|2,{116,57,0}}, +/* 19447 */ {(11<<2)|2,{116,57,0}}, +/* 19448 */ {(11<<2)|2,{116,57,0}}, +/* 19449 */ {(11<<2)|2,{116,57,0}}, +/* 19450 */ {(11<<2)|2,{116,57,0}}, +/* 19451 */ {(11<<2)|2,{116,57,0}}, +/* 19452 */ {(11<<2)|2,{116,57,0}}, +/* 19453 */ {(11<<2)|2,{116,57,0}}, +/* 19454 */ {(11<<2)|2,{116,57,0}}, +/* 19455 */ {(11<<2)|2,{116,57,0}}, +/* 19456 */ {(16<<2)|3,{116,61,48}}, +/* 19457 */ {(16<<2)|3,{116,61,49}}, +/* 19458 */ {(16<<2)|3,{116,61,50}}, +/* 19459 */ {(16<<2)|3,{116,61,97}}, +/* 19460 */ {(16<<2)|3,{116,61,99}}, +/* 19461 */ {(16<<2)|3,{116,61,101}}, +/* 19462 */ {(16<<2)|3,{116,61,105}}, +/* 19463 */ {(16<<2)|3,{116,61,111}}, +/* 19464 */ {(16<<2)|3,{116,61,115}}, +/* 19465 */ {(16<<2)|3,{116,61,116}}, +/* 19466 */ {(11<<2)|2,{116,61,0}}, +/* 19467 */ {(11<<2)|2,{116,61,0}}, +/* 19468 */ {(11<<2)|2,{116,61,0}}, +/* 19469 */ {(11<<2)|2,{116,61,0}}, +/* 19470 */ {(11<<2)|2,{116,61,0}}, +/* 19471 */ {(11<<2)|2,{116,61,0}}, +/* 19472 */ {(11<<2)|2,{116,61,0}}, +/* 19473 */ {(11<<2)|2,{116,61,0}}, +/* 19474 */ {(11<<2)|2,{116,61,0}}, +/* 19475 */ {(11<<2)|2,{116,61,0}}, +/* 19476 */ {(11<<2)|2,{116,61,0}}, +/* 19477 */ {(11<<2)|2,{116,61,0}}, +/* 19478 */ {(11<<2)|2,{116,61,0}}, +/* 19479 */ {(11<<2)|2,{116,61,0}}, +/* 19480 */ {(11<<2)|2,{116,61,0}}, +/* 19481 */ {(11<<2)|2,{116,61,0}}, +/* 19482 */ {(11<<2)|2,{116,61,0}}, +/* 19483 */ {(11<<2)|2,{116,61,0}}, +/* 19484 */ {(11<<2)|2,{116,61,0}}, +/* 19485 */ {(11<<2)|2,{116,61,0}}, +/* 19486 */ {(11<<2)|2,{116,61,0}}, +/* 19487 */ {(11<<2)|2,{116,61,0}}, +/* 19488 */ {(16<<2)|3,{116,65,48}}, +/* 19489 */ {(16<<2)|3,{116,65,49}}, +/* 19490 */ {(16<<2)|3,{116,65,50}}, +/* 19491 */ {(16<<2)|3,{116,65,97}}, +/* 19492 */ {(16<<2)|3,{116,65,99}}, +/* 19493 */ {(16<<2)|3,{116,65,101}}, +/* 19494 */ {(16<<2)|3,{116,65,105}}, +/* 19495 */ {(16<<2)|3,{116,65,111}}, +/* 19496 */ {(16<<2)|3,{116,65,115}}, +/* 19497 */ {(16<<2)|3,{116,65,116}}, +/* 19498 */ {(11<<2)|2,{116,65,0}}, +/* 19499 */ {(11<<2)|2,{116,65,0}}, +/* 19500 */ {(11<<2)|2,{116,65,0}}, +/* 19501 */ {(11<<2)|2,{116,65,0}}, +/* 19502 */ {(11<<2)|2,{116,65,0}}, +/* 19503 */ {(11<<2)|2,{116,65,0}}, +/* 19504 */ {(11<<2)|2,{116,65,0}}, +/* 19505 */ {(11<<2)|2,{116,65,0}}, +/* 19506 */ {(11<<2)|2,{116,65,0}}, +/* 19507 */ {(11<<2)|2,{116,65,0}}, +/* 19508 */ {(11<<2)|2,{116,65,0}}, +/* 19509 */ {(11<<2)|2,{116,65,0}}, +/* 19510 */ {(11<<2)|2,{116,65,0}}, +/* 19511 */ {(11<<2)|2,{116,65,0}}, +/* 19512 */ {(11<<2)|2,{116,65,0}}, +/* 19513 */ {(11<<2)|2,{116,65,0}}, +/* 19514 */ {(11<<2)|2,{116,65,0}}, +/* 19515 */ {(11<<2)|2,{116,65,0}}, +/* 19516 */ {(11<<2)|2,{116,65,0}}, +/* 19517 */ {(11<<2)|2,{116,65,0}}, +/* 19518 */ {(11<<2)|2,{116,65,0}}, +/* 19519 */ {(11<<2)|2,{116,65,0}}, +/* 19520 */ {(16<<2)|3,{116,95,48}}, +/* 19521 */ {(16<<2)|3,{116,95,49}}, +/* 19522 */ {(16<<2)|3,{116,95,50}}, +/* 19523 */ {(16<<2)|3,{116,95,97}}, +/* 19524 */ {(16<<2)|3,{116,95,99}}, +/* 19525 */ {(16<<2)|3,{116,95,101}}, +/* 19526 */ {(16<<2)|3,{116,95,105}}, +/* 19527 */ {(16<<2)|3,{116,95,111}}, +/* 19528 */ {(16<<2)|3,{116,95,115}}, +/* 19529 */ {(16<<2)|3,{116,95,116}}, +/* 19530 */ {(11<<2)|2,{116,95,0}}, +/* 19531 */ {(11<<2)|2,{116,95,0}}, +/* 19532 */ {(11<<2)|2,{116,95,0}}, +/* 19533 */ {(11<<2)|2,{116,95,0}}, +/* 19534 */ {(11<<2)|2,{116,95,0}}, +/* 19535 */ {(11<<2)|2,{116,95,0}}, +/* 19536 */ {(11<<2)|2,{116,95,0}}, +/* 19537 */ {(11<<2)|2,{116,95,0}}, +/* 19538 */ {(11<<2)|2,{116,95,0}}, +/* 19539 */ {(11<<2)|2,{116,95,0}}, +/* 19540 */ {(11<<2)|2,{116,95,0}}, +/* 19541 */ {(11<<2)|2,{116,95,0}}, +/* 19542 */ {(11<<2)|2,{116,95,0}}, +/* 19543 */ {(11<<2)|2,{116,95,0}}, +/* 19544 */ {(11<<2)|2,{116,95,0}}, +/* 19545 */ {(11<<2)|2,{116,95,0}}, +/* 19546 */ {(11<<2)|2,{116,95,0}}, +/* 19547 */ {(11<<2)|2,{116,95,0}}, +/* 19548 */ {(11<<2)|2,{116,95,0}}, +/* 19549 */ {(11<<2)|2,{116,95,0}}, +/* 19550 */ {(11<<2)|2,{116,95,0}}, +/* 19551 */ {(11<<2)|2,{116,95,0}}, +/* 19552 */ {(16<<2)|3,{116,98,48}}, +/* 19553 */ {(16<<2)|3,{116,98,49}}, +/* 19554 */ {(16<<2)|3,{116,98,50}}, +/* 19555 */ {(16<<2)|3,{116,98,97}}, +/* 19556 */ {(16<<2)|3,{116,98,99}}, +/* 19557 */ {(16<<2)|3,{116,98,101}}, +/* 19558 */ {(16<<2)|3,{116,98,105}}, +/* 19559 */ {(16<<2)|3,{116,98,111}}, +/* 19560 */ {(16<<2)|3,{116,98,115}}, +/* 19561 */ {(16<<2)|3,{116,98,116}}, +/* 19562 */ {(11<<2)|2,{116,98,0}}, +/* 19563 */ {(11<<2)|2,{116,98,0}}, +/* 19564 */ {(11<<2)|2,{116,98,0}}, +/* 19565 */ {(11<<2)|2,{116,98,0}}, +/* 19566 */ {(11<<2)|2,{116,98,0}}, +/* 19567 */ {(11<<2)|2,{116,98,0}}, +/* 19568 */ {(11<<2)|2,{116,98,0}}, +/* 19569 */ {(11<<2)|2,{116,98,0}}, +/* 19570 */ {(11<<2)|2,{116,98,0}}, +/* 19571 */ {(11<<2)|2,{116,98,0}}, +/* 19572 */ {(11<<2)|2,{116,98,0}}, +/* 19573 */ {(11<<2)|2,{116,98,0}}, +/* 19574 */ {(11<<2)|2,{116,98,0}}, +/* 19575 */ {(11<<2)|2,{116,98,0}}, +/* 19576 */ {(11<<2)|2,{116,98,0}}, +/* 19577 */ {(11<<2)|2,{116,98,0}}, +/* 19578 */ {(11<<2)|2,{116,98,0}}, +/* 19579 */ {(11<<2)|2,{116,98,0}}, +/* 19580 */ {(11<<2)|2,{116,98,0}}, +/* 19581 */ {(11<<2)|2,{116,98,0}}, +/* 19582 */ {(11<<2)|2,{116,98,0}}, +/* 19583 */ {(11<<2)|2,{116,98,0}}, +/* 19584 */ {(16<<2)|3,{116,100,48}}, +/* 19585 */ {(16<<2)|3,{116,100,49}}, +/* 19586 */ {(16<<2)|3,{116,100,50}}, +/* 19587 */ {(16<<2)|3,{116,100,97}}, +/* 19588 */ {(16<<2)|3,{116,100,99}}, +/* 19589 */ {(16<<2)|3,{116,100,101}}, +/* 19590 */ {(16<<2)|3,{116,100,105}}, +/* 19591 */ {(16<<2)|3,{116,100,111}}, +/* 19592 */ {(16<<2)|3,{116,100,115}}, +/* 19593 */ {(16<<2)|3,{116,100,116}}, +/* 19594 */ {(11<<2)|2,{116,100,0}}, +/* 19595 */ {(11<<2)|2,{116,100,0}}, +/* 19596 */ {(11<<2)|2,{116,100,0}}, +/* 19597 */ {(11<<2)|2,{116,100,0}}, +/* 19598 */ {(11<<2)|2,{116,100,0}}, +/* 19599 */ {(11<<2)|2,{116,100,0}}, +/* 19600 */ {(11<<2)|2,{116,100,0}}, +/* 19601 */ {(11<<2)|2,{116,100,0}}, +/* 19602 */ {(11<<2)|2,{116,100,0}}, +/* 19603 */ {(11<<2)|2,{116,100,0}}, +/* 19604 */ {(11<<2)|2,{116,100,0}}, +/* 19605 */ {(11<<2)|2,{116,100,0}}, +/* 19606 */ {(11<<2)|2,{116,100,0}}, +/* 19607 */ {(11<<2)|2,{116,100,0}}, +/* 19608 */ {(11<<2)|2,{116,100,0}}, +/* 19609 */ {(11<<2)|2,{116,100,0}}, +/* 19610 */ {(11<<2)|2,{116,100,0}}, +/* 19611 */ {(11<<2)|2,{116,100,0}}, +/* 19612 */ {(11<<2)|2,{116,100,0}}, +/* 19613 */ {(11<<2)|2,{116,100,0}}, +/* 19614 */ {(11<<2)|2,{116,100,0}}, +/* 19615 */ {(11<<2)|2,{116,100,0}}, +/* 19616 */ {(16<<2)|3,{116,102,48}}, +/* 19617 */ {(16<<2)|3,{116,102,49}}, +/* 19618 */ {(16<<2)|3,{116,102,50}}, +/* 19619 */ {(16<<2)|3,{116,102,97}}, +/* 19620 */ {(16<<2)|3,{116,102,99}}, +/* 19621 */ {(16<<2)|3,{116,102,101}}, +/* 19622 */ {(16<<2)|3,{116,102,105}}, +/* 19623 */ {(16<<2)|3,{116,102,111}}, +/* 19624 */ {(16<<2)|3,{116,102,115}}, +/* 19625 */ {(16<<2)|3,{116,102,116}}, +/* 19626 */ {(11<<2)|2,{116,102,0}}, +/* 19627 */ {(11<<2)|2,{116,102,0}}, +/* 19628 */ {(11<<2)|2,{116,102,0}}, +/* 19629 */ {(11<<2)|2,{116,102,0}}, +/* 19630 */ {(11<<2)|2,{116,102,0}}, +/* 19631 */ {(11<<2)|2,{116,102,0}}, +/* 19632 */ {(11<<2)|2,{116,102,0}}, +/* 19633 */ {(11<<2)|2,{116,102,0}}, +/* 19634 */ {(11<<2)|2,{116,102,0}}, +/* 19635 */ {(11<<2)|2,{116,102,0}}, +/* 19636 */ {(11<<2)|2,{116,102,0}}, +/* 19637 */ {(11<<2)|2,{116,102,0}}, +/* 19638 */ {(11<<2)|2,{116,102,0}}, +/* 19639 */ {(11<<2)|2,{116,102,0}}, +/* 19640 */ {(11<<2)|2,{116,102,0}}, +/* 19641 */ {(11<<2)|2,{116,102,0}}, +/* 19642 */ {(11<<2)|2,{116,102,0}}, +/* 19643 */ {(11<<2)|2,{116,102,0}}, +/* 19644 */ {(11<<2)|2,{116,102,0}}, +/* 19645 */ {(11<<2)|2,{116,102,0}}, +/* 19646 */ {(11<<2)|2,{116,102,0}}, +/* 19647 */ {(11<<2)|2,{116,102,0}}, +/* 19648 */ {(16<<2)|3,{116,103,48}}, +/* 19649 */ {(16<<2)|3,{116,103,49}}, +/* 19650 */ {(16<<2)|3,{116,103,50}}, +/* 19651 */ {(16<<2)|3,{116,103,97}}, +/* 19652 */ {(16<<2)|3,{116,103,99}}, +/* 19653 */ {(16<<2)|3,{116,103,101}}, +/* 19654 */ {(16<<2)|3,{116,103,105}}, +/* 19655 */ {(16<<2)|3,{116,103,111}}, +/* 19656 */ {(16<<2)|3,{116,103,115}}, +/* 19657 */ {(16<<2)|3,{116,103,116}}, +/* 19658 */ {(11<<2)|2,{116,103,0}}, +/* 19659 */ {(11<<2)|2,{116,103,0}}, +/* 19660 */ {(11<<2)|2,{116,103,0}}, +/* 19661 */ {(11<<2)|2,{116,103,0}}, +/* 19662 */ {(11<<2)|2,{116,103,0}}, +/* 19663 */ {(11<<2)|2,{116,103,0}}, +/* 19664 */ {(11<<2)|2,{116,103,0}}, +/* 19665 */ {(11<<2)|2,{116,103,0}}, +/* 19666 */ {(11<<2)|2,{116,103,0}}, +/* 19667 */ {(11<<2)|2,{116,103,0}}, +/* 19668 */ {(11<<2)|2,{116,103,0}}, +/* 19669 */ {(11<<2)|2,{116,103,0}}, +/* 19670 */ {(11<<2)|2,{116,103,0}}, +/* 19671 */ {(11<<2)|2,{116,103,0}}, +/* 19672 */ {(11<<2)|2,{116,103,0}}, +/* 19673 */ {(11<<2)|2,{116,103,0}}, +/* 19674 */ {(11<<2)|2,{116,103,0}}, +/* 19675 */ {(11<<2)|2,{116,103,0}}, +/* 19676 */ {(11<<2)|2,{116,103,0}}, +/* 19677 */ {(11<<2)|2,{116,103,0}}, +/* 19678 */ {(11<<2)|2,{116,103,0}}, +/* 19679 */ {(11<<2)|2,{116,103,0}}, +/* 19680 */ {(16<<2)|3,{116,104,48}}, +/* 19681 */ {(16<<2)|3,{116,104,49}}, +/* 19682 */ {(16<<2)|3,{116,104,50}}, +/* 19683 */ {(16<<2)|3,{116,104,97}}, +/* 19684 */ {(16<<2)|3,{116,104,99}}, +/* 19685 */ {(16<<2)|3,{116,104,101}}, +/* 19686 */ {(16<<2)|3,{116,104,105}}, +/* 19687 */ {(16<<2)|3,{116,104,111}}, +/* 19688 */ {(16<<2)|3,{116,104,115}}, +/* 19689 */ {(16<<2)|3,{116,104,116}}, +/* 19690 */ {(11<<2)|2,{116,104,0}}, +/* 19691 */ {(11<<2)|2,{116,104,0}}, +/* 19692 */ {(11<<2)|2,{116,104,0}}, +/* 19693 */ {(11<<2)|2,{116,104,0}}, +/* 19694 */ {(11<<2)|2,{116,104,0}}, +/* 19695 */ {(11<<2)|2,{116,104,0}}, +/* 19696 */ {(11<<2)|2,{116,104,0}}, +/* 19697 */ {(11<<2)|2,{116,104,0}}, +/* 19698 */ {(11<<2)|2,{116,104,0}}, +/* 19699 */ {(11<<2)|2,{116,104,0}}, +/* 19700 */ {(11<<2)|2,{116,104,0}}, +/* 19701 */ {(11<<2)|2,{116,104,0}}, +/* 19702 */ {(11<<2)|2,{116,104,0}}, +/* 19703 */ {(11<<2)|2,{116,104,0}}, +/* 19704 */ {(11<<2)|2,{116,104,0}}, +/* 19705 */ {(11<<2)|2,{116,104,0}}, +/* 19706 */ {(11<<2)|2,{116,104,0}}, +/* 19707 */ {(11<<2)|2,{116,104,0}}, +/* 19708 */ {(11<<2)|2,{116,104,0}}, +/* 19709 */ {(11<<2)|2,{116,104,0}}, +/* 19710 */ {(11<<2)|2,{116,104,0}}, +/* 19711 */ {(11<<2)|2,{116,104,0}}, +/* 19712 */ {(16<<2)|3,{116,108,48}}, +/* 19713 */ {(16<<2)|3,{116,108,49}}, +/* 19714 */ {(16<<2)|3,{116,108,50}}, +/* 19715 */ {(16<<2)|3,{116,108,97}}, +/* 19716 */ {(16<<2)|3,{116,108,99}}, +/* 19717 */ {(16<<2)|3,{116,108,101}}, +/* 19718 */ {(16<<2)|3,{116,108,105}}, +/* 19719 */ {(16<<2)|3,{116,108,111}}, +/* 19720 */ {(16<<2)|3,{116,108,115}}, +/* 19721 */ {(16<<2)|3,{116,108,116}}, +/* 19722 */ {(11<<2)|2,{116,108,0}}, +/* 19723 */ {(11<<2)|2,{116,108,0}}, +/* 19724 */ {(11<<2)|2,{116,108,0}}, +/* 19725 */ {(11<<2)|2,{116,108,0}}, +/* 19726 */ {(11<<2)|2,{116,108,0}}, +/* 19727 */ {(11<<2)|2,{116,108,0}}, +/* 19728 */ {(11<<2)|2,{116,108,0}}, +/* 19729 */ {(11<<2)|2,{116,108,0}}, +/* 19730 */ {(11<<2)|2,{116,108,0}}, +/* 19731 */ {(11<<2)|2,{116,108,0}}, +/* 19732 */ {(11<<2)|2,{116,108,0}}, +/* 19733 */ {(11<<2)|2,{116,108,0}}, +/* 19734 */ {(11<<2)|2,{116,108,0}}, +/* 19735 */ {(11<<2)|2,{116,108,0}}, +/* 19736 */ {(11<<2)|2,{116,108,0}}, +/* 19737 */ {(11<<2)|2,{116,108,0}}, +/* 19738 */ {(11<<2)|2,{116,108,0}}, +/* 19739 */ {(11<<2)|2,{116,108,0}}, +/* 19740 */ {(11<<2)|2,{116,108,0}}, +/* 19741 */ {(11<<2)|2,{116,108,0}}, +/* 19742 */ {(11<<2)|2,{116,108,0}}, +/* 19743 */ {(11<<2)|2,{116,108,0}}, +/* 19744 */ {(16<<2)|3,{116,109,48}}, +/* 19745 */ {(16<<2)|3,{116,109,49}}, +/* 19746 */ {(16<<2)|3,{116,109,50}}, +/* 19747 */ {(16<<2)|3,{116,109,97}}, +/* 19748 */ {(16<<2)|3,{116,109,99}}, +/* 19749 */ {(16<<2)|3,{116,109,101}}, +/* 19750 */ {(16<<2)|3,{116,109,105}}, +/* 19751 */ {(16<<2)|3,{116,109,111}}, +/* 19752 */ {(16<<2)|3,{116,109,115}}, +/* 19753 */ {(16<<2)|3,{116,109,116}}, +/* 19754 */ {(11<<2)|2,{116,109,0}}, +/* 19755 */ {(11<<2)|2,{116,109,0}}, +/* 19756 */ {(11<<2)|2,{116,109,0}}, +/* 19757 */ {(11<<2)|2,{116,109,0}}, +/* 19758 */ {(11<<2)|2,{116,109,0}}, +/* 19759 */ {(11<<2)|2,{116,109,0}}, +/* 19760 */ {(11<<2)|2,{116,109,0}}, +/* 19761 */ {(11<<2)|2,{116,109,0}}, +/* 19762 */ {(11<<2)|2,{116,109,0}}, +/* 19763 */ {(11<<2)|2,{116,109,0}}, +/* 19764 */ {(11<<2)|2,{116,109,0}}, +/* 19765 */ {(11<<2)|2,{116,109,0}}, +/* 19766 */ {(11<<2)|2,{116,109,0}}, +/* 19767 */ {(11<<2)|2,{116,109,0}}, +/* 19768 */ {(11<<2)|2,{116,109,0}}, +/* 19769 */ {(11<<2)|2,{116,109,0}}, +/* 19770 */ {(11<<2)|2,{116,109,0}}, +/* 19771 */ {(11<<2)|2,{116,109,0}}, +/* 19772 */ {(11<<2)|2,{116,109,0}}, +/* 19773 */ {(11<<2)|2,{116,109,0}}, +/* 19774 */ {(11<<2)|2,{116,109,0}}, +/* 19775 */ {(11<<2)|2,{116,109,0}}, +/* 19776 */ {(16<<2)|3,{116,110,48}}, +/* 19777 */ {(16<<2)|3,{116,110,49}}, +/* 19778 */ {(16<<2)|3,{116,110,50}}, +/* 19779 */ {(16<<2)|3,{116,110,97}}, +/* 19780 */ {(16<<2)|3,{116,110,99}}, +/* 19781 */ {(16<<2)|3,{116,110,101}}, +/* 19782 */ {(16<<2)|3,{116,110,105}}, +/* 19783 */ {(16<<2)|3,{116,110,111}}, +/* 19784 */ {(16<<2)|3,{116,110,115}}, +/* 19785 */ {(16<<2)|3,{116,110,116}}, +/* 19786 */ {(11<<2)|2,{116,110,0}}, +/* 19787 */ {(11<<2)|2,{116,110,0}}, +/* 19788 */ {(11<<2)|2,{116,110,0}}, +/* 19789 */ {(11<<2)|2,{116,110,0}}, +/* 19790 */ {(11<<2)|2,{116,110,0}}, +/* 19791 */ {(11<<2)|2,{116,110,0}}, +/* 19792 */ {(11<<2)|2,{116,110,0}}, +/* 19793 */ {(11<<2)|2,{116,110,0}}, +/* 19794 */ {(11<<2)|2,{116,110,0}}, +/* 19795 */ {(11<<2)|2,{116,110,0}}, +/* 19796 */ {(11<<2)|2,{116,110,0}}, +/* 19797 */ {(11<<2)|2,{116,110,0}}, +/* 19798 */ {(11<<2)|2,{116,110,0}}, +/* 19799 */ {(11<<2)|2,{116,110,0}}, +/* 19800 */ {(11<<2)|2,{116,110,0}}, +/* 19801 */ {(11<<2)|2,{116,110,0}}, +/* 19802 */ {(11<<2)|2,{116,110,0}}, +/* 19803 */ {(11<<2)|2,{116,110,0}}, +/* 19804 */ {(11<<2)|2,{116,110,0}}, +/* 19805 */ {(11<<2)|2,{116,110,0}}, +/* 19806 */ {(11<<2)|2,{116,110,0}}, +/* 19807 */ {(11<<2)|2,{116,110,0}}, +/* 19808 */ {(16<<2)|3,{116,112,48}}, +/* 19809 */ {(16<<2)|3,{116,112,49}}, +/* 19810 */ {(16<<2)|3,{116,112,50}}, +/* 19811 */ {(16<<2)|3,{116,112,97}}, +/* 19812 */ {(16<<2)|3,{116,112,99}}, +/* 19813 */ {(16<<2)|3,{116,112,101}}, +/* 19814 */ {(16<<2)|3,{116,112,105}}, +/* 19815 */ {(16<<2)|3,{116,112,111}}, +/* 19816 */ {(16<<2)|3,{116,112,115}}, +/* 19817 */ {(16<<2)|3,{116,112,116}}, +/* 19818 */ {(11<<2)|2,{116,112,0}}, +/* 19819 */ {(11<<2)|2,{116,112,0}}, +/* 19820 */ {(11<<2)|2,{116,112,0}}, +/* 19821 */ {(11<<2)|2,{116,112,0}}, +/* 19822 */ {(11<<2)|2,{116,112,0}}, +/* 19823 */ {(11<<2)|2,{116,112,0}}, +/* 19824 */ {(11<<2)|2,{116,112,0}}, +/* 19825 */ {(11<<2)|2,{116,112,0}}, +/* 19826 */ {(11<<2)|2,{116,112,0}}, +/* 19827 */ {(11<<2)|2,{116,112,0}}, +/* 19828 */ {(11<<2)|2,{116,112,0}}, +/* 19829 */ {(11<<2)|2,{116,112,0}}, +/* 19830 */ {(11<<2)|2,{116,112,0}}, +/* 19831 */ {(11<<2)|2,{116,112,0}}, +/* 19832 */ {(11<<2)|2,{116,112,0}}, +/* 19833 */ {(11<<2)|2,{116,112,0}}, +/* 19834 */ {(11<<2)|2,{116,112,0}}, +/* 19835 */ {(11<<2)|2,{116,112,0}}, +/* 19836 */ {(11<<2)|2,{116,112,0}}, +/* 19837 */ {(11<<2)|2,{116,112,0}}, +/* 19838 */ {(11<<2)|2,{116,112,0}}, +/* 19839 */ {(11<<2)|2,{116,112,0}}, +/* 19840 */ {(16<<2)|3,{116,114,48}}, +/* 19841 */ {(16<<2)|3,{116,114,49}}, +/* 19842 */ {(16<<2)|3,{116,114,50}}, +/* 19843 */ {(16<<2)|3,{116,114,97}}, +/* 19844 */ {(16<<2)|3,{116,114,99}}, +/* 19845 */ {(16<<2)|3,{116,114,101}}, +/* 19846 */ {(16<<2)|3,{116,114,105}}, +/* 19847 */ {(16<<2)|3,{116,114,111}}, +/* 19848 */ {(16<<2)|3,{116,114,115}}, +/* 19849 */ {(16<<2)|3,{116,114,116}}, +/* 19850 */ {(11<<2)|2,{116,114,0}}, +/* 19851 */ {(11<<2)|2,{116,114,0}}, +/* 19852 */ {(11<<2)|2,{116,114,0}}, +/* 19853 */ {(11<<2)|2,{116,114,0}}, +/* 19854 */ {(11<<2)|2,{116,114,0}}, +/* 19855 */ {(11<<2)|2,{116,114,0}}, +/* 19856 */ {(11<<2)|2,{116,114,0}}, +/* 19857 */ {(11<<2)|2,{116,114,0}}, +/* 19858 */ {(11<<2)|2,{116,114,0}}, +/* 19859 */ {(11<<2)|2,{116,114,0}}, +/* 19860 */ {(11<<2)|2,{116,114,0}}, +/* 19861 */ {(11<<2)|2,{116,114,0}}, +/* 19862 */ {(11<<2)|2,{116,114,0}}, +/* 19863 */ {(11<<2)|2,{116,114,0}}, +/* 19864 */ {(11<<2)|2,{116,114,0}}, +/* 19865 */ {(11<<2)|2,{116,114,0}}, +/* 19866 */ {(11<<2)|2,{116,114,0}}, +/* 19867 */ {(11<<2)|2,{116,114,0}}, +/* 19868 */ {(11<<2)|2,{116,114,0}}, +/* 19869 */ {(11<<2)|2,{116,114,0}}, +/* 19870 */ {(11<<2)|2,{116,114,0}}, +/* 19871 */ {(11<<2)|2,{116,114,0}}, +/* 19872 */ {(16<<2)|3,{116,117,48}}, +/* 19873 */ {(16<<2)|3,{116,117,49}}, +/* 19874 */ {(16<<2)|3,{116,117,50}}, +/* 19875 */ {(16<<2)|3,{116,117,97}}, +/* 19876 */ {(16<<2)|3,{116,117,99}}, +/* 19877 */ {(16<<2)|3,{116,117,101}}, +/* 19878 */ {(16<<2)|3,{116,117,105}}, +/* 19879 */ {(16<<2)|3,{116,117,111}}, +/* 19880 */ {(16<<2)|3,{116,117,115}}, +/* 19881 */ {(16<<2)|3,{116,117,116}}, +/* 19882 */ {(11<<2)|2,{116,117,0}}, +/* 19883 */ {(11<<2)|2,{116,117,0}}, +/* 19884 */ {(11<<2)|2,{116,117,0}}, +/* 19885 */ {(11<<2)|2,{116,117,0}}, +/* 19886 */ {(11<<2)|2,{116,117,0}}, +/* 19887 */ {(11<<2)|2,{116,117,0}}, +/* 19888 */ {(11<<2)|2,{116,117,0}}, +/* 19889 */ {(11<<2)|2,{116,117,0}}, +/* 19890 */ {(11<<2)|2,{116,117,0}}, +/* 19891 */ {(11<<2)|2,{116,117,0}}, +/* 19892 */ {(11<<2)|2,{116,117,0}}, +/* 19893 */ {(11<<2)|2,{116,117,0}}, +/* 19894 */ {(11<<2)|2,{116,117,0}}, +/* 19895 */ {(11<<2)|2,{116,117,0}}, +/* 19896 */ {(11<<2)|2,{116,117,0}}, +/* 19897 */ {(11<<2)|2,{116,117,0}}, +/* 19898 */ {(11<<2)|2,{116,117,0}}, +/* 19899 */ {(11<<2)|2,{116,117,0}}, +/* 19900 */ {(11<<2)|2,{116,117,0}}, +/* 19901 */ {(11<<2)|2,{116,117,0}}, +/* 19902 */ {(11<<2)|2,{116,117,0}}, +/* 19903 */ {(11<<2)|2,{116,117,0}}, +/* 19904 */ {(12<<2)|2,{116,58,0}}, +/* 19905 */ {(12<<2)|2,{116,58,0}}, +/* 19906 */ {(12<<2)|2,{116,58,0}}, +/* 19907 */ {(12<<2)|2,{116,58,0}}, +/* 19908 */ {(12<<2)|2,{116,58,0}}, +/* 19909 */ {(12<<2)|2,{116,58,0}}, +/* 19910 */ {(12<<2)|2,{116,58,0}}, +/* 19911 */ {(12<<2)|2,{116,58,0}}, +/* 19912 */ {(12<<2)|2,{116,58,0}}, +/* 19913 */ {(12<<2)|2,{116,58,0}}, +/* 19914 */ {(12<<2)|2,{116,58,0}}, +/* 19915 */ {(12<<2)|2,{116,58,0}}, +/* 19916 */ {(12<<2)|2,{116,58,0}}, +/* 19917 */ {(12<<2)|2,{116,58,0}}, +/* 19918 */ {(12<<2)|2,{116,58,0}}, +/* 19919 */ {(12<<2)|2,{116,58,0}}, +/* 19920 */ {(12<<2)|2,{116,66,0}}, +/* 19921 */ {(12<<2)|2,{116,66,0}}, +/* 19922 */ {(12<<2)|2,{116,66,0}}, +/* 19923 */ {(12<<2)|2,{116,66,0}}, +/* 19924 */ {(12<<2)|2,{116,66,0}}, +/* 19925 */ {(12<<2)|2,{116,66,0}}, +/* 19926 */ {(12<<2)|2,{116,66,0}}, +/* 19927 */ {(12<<2)|2,{116,66,0}}, +/* 19928 */ {(12<<2)|2,{116,66,0}}, +/* 19929 */ {(12<<2)|2,{116,66,0}}, +/* 19930 */ {(12<<2)|2,{116,66,0}}, +/* 19931 */ {(12<<2)|2,{116,66,0}}, +/* 19932 */ {(12<<2)|2,{116,66,0}}, +/* 19933 */ {(12<<2)|2,{116,66,0}}, +/* 19934 */ {(12<<2)|2,{116,66,0}}, +/* 19935 */ {(12<<2)|2,{116,66,0}}, +/* 19936 */ {(12<<2)|2,{116,67,0}}, +/* 19937 */ {(12<<2)|2,{116,67,0}}, +/* 19938 */ {(12<<2)|2,{116,67,0}}, +/* 19939 */ {(12<<2)|2,{116,67,0}}, +/* 19940 */ {(12<<2)|2,{116,67,0}}, +/* 19941 */ {(12<<2)|2,{116,67,0}}, +/* 19942 */ {(12<<2)|2,{116,67,0}}, +/* 19943 */ {(12<<2)|2,{116,67,0}}, +/* 19944 */ {(12<<2)|2,{116,67,0}}, +/* 19945 */ {(12<<2)|2,{116,67,0}}, +/* 19946 */ {(12<<2)|2,{116,67,0}}, +/* 19947 */ {(12<<2)|2,{116,67,0}}, +/* 19948 */ {(12<<2)|2,{116,67,0}}, +/* 19949 */ {(12<<2)|2,{116,67,0}}, +/* 19950 */ {(12<<2)|2,{116,67,0}}, +/* 19951 */ {(12<<2)|2,{116,67,0}}, +/* 19952 */ {(12<<2)|2,{116,68,0}}, +/* 19953 */ {(12<<2)|2,{116,68,0}}, +/* 19954 */ {(12<<2)|2,{116,68,0}}, +/* 19955 */ {(12<<2)|2,{116,68,0}}, +/* 19956 */ {(12<<2)|2,{116,68,0}}, +/* 19957 */ {(12<<2)|2,{116,68,0}}, +/* 19958 */ {(12<<2)|2,{116,68,0}}, +/* 19959 */ {(12<<2)|2,{116,68,0}}, +/* 19960 */ {(12<<2)|2,{116,68,0}}, +/* 19961 */ {(12<<2)|2,{116,68,0}}, +/* 19962 */ {(12<<2)|2,{116,68,0}}, +/* 19963 */ {(12<<2)|2,{116,68,0}}, +/* 19964 */ {(12<<2)|2,{116,68,0}}, +/* 19965 */ {(12<<2)|2,{116,68,0}}, +/* 19966 */ {(12<<2)|2,{116,68,0}}, +/* 19967 */ {(12<<2)|2,{116,68,0}}, +/* 19968 */ {(12<<2)|2,{116,69,0}}, +/* 19969 */ {(12<<2)|2,{116,69,0}}, +/* 19970 */ {(12<<2)|2,{116,69,0}}, +/* 19971 */ {(12<<2)|2,{116,69,0}}, +/* 19972 */ {(12<<2)|2,{116,69,0}}, +/* 19973 */ {(12<<2)|2,{116,69,0}}, +/* 19974 */ {(12<<2)|2,{116,69,0}}, +/* 19975 */ {(12<<2)|2,{116,69,0}}, +/* 19976 */ {(12<<2)|2,{116,69,0}}, +/* 19977 */ {(12<<2)|2,{116,69,0}}, +/* 19978 */ {(12<<2)|2,{116,69,0}}, +/* 19979 */ {(12<<2)|2,{116,69,0}}, +/* 19980 */ {(12<<2)|2,{116,69,0}}, +/* 19981 */ {(12<<2)|2,{116,69,0}}, +/* 19982 */ {(12<<2)|2,{116,69,0}}, +/* 19983 */ {(12<<2)|2,{116,69,0}}, +/* 19984 */ {(12<<2)|2,{116,70,0}}, +/* 19985 */ {(12<<2)|2,{116,70,0}}, +/* 19986 */ {(12<<2)|2,{116,70,0}}, +/* 19987 */ {(12<<2)|2,{116,70,0}}, +/* 19988 */ {(12<<2)|2,{116,70,0}}, +/* 19989 */ {(12<<2)|2,{116,70,0}}, +/* 19990 */ {(12<<2)|2,{116,70,0}}, +/* 19991 */ {(12<<2)|2,{116,70,0}}, +/* 19992 */ {(12<<2)|2,{116,70,0}}, +/* 19993 */ {(12<<2)|2,{116,70,0}}, +/* 19994 */ {(12<<2)|2,{116,70,0}}, +/* 19995 */ {(12<<2)|2,{116,70,0}}, +/* 19996 */ {(12<<2)|2,{116,70,0}}, +/* 19997 */ {(12<<2)|2,{116,70,0}}, +/* 19998 */ {(12<<2)|2,{116,70,0}}, +/* 19999 */ {(12<<2)|2,{116,70,0}}, +/* 20000 */ {(12<<2)|2,{116,71,0}}, +/* 20001 */ {(12<<2)|2,{116,71,0}}, +/* 20002 */ {(12<<2)|2,{116,71,0}}, +/* 20003 */ {(12<<2)|2,{116,71,0}}, +/* 20004 */ {(12<<2)|2,{116,71,0}}, +/* 20005 */ {(12<<2)|2,{116,71,0}}, +/* 20006 */ {(12<<2)|2,{116,71,0}}, +/* 20007 */ {(12<<2)|2,{116,71,0}}, +/* 20008 */ {(12<<2)|2,{116,71,0}}, +/* 20009 */ {(12<<2)|2,{116,71,0}}, +/* 20010 */ {(12<<2)|2,{116,71,0}}, +/* 20011 */ {(12<<2)|2,{116,71,0}}, +/* 20012 */ {(12<<2)|2,{116,71,0}}, +/* 20013 */ {(12<<2)|2,{116,71,0}}, +/* 20014 */ {(12<<2)|2,{116,71,0}}, +/* 20015 */ {(12<<2)|2,{116,71,0}}, +/* 20016 */ {(12<<2)|2,{116,72,0}}, +/* 20017 */ {(12<<2)|2,{116,72,0}}, +/* 20018 */ {(12<<2)|2,{116,72,0}}, +/* 20019 */ {(12<<2)|2,{116,72,0}}, +/* 20020 */ {(12<<2)|2,{116,72,0}}, +/* 20021 */ {(12<<2)|2,{116,72,0}}, +/* 20022 */ {(12<<2)|2,{116,72,0}}, +/* 20023 */ {(12<<2)|2,{116,72,0}}, +/* 20024 */ {(12<<2)|2,{116,72,0}}, +/* 20025 */ {(12<<2)|2,{116,72,0}}, +/* 20026 */ {(12<<2)|2,{116,72,0}}, +/* 20027 */ {(12<<2)|2,{116,72,0}}, +/* 20028 */ {(12<<2)|2,{116,72,0}}, +/* 20029 */ {(12<<2)|2,{116,72,0}}, +/* 20030 */ {(12<<2)|2,{116,72,0}}, +/* 20031 */ {(12<<2)|2,{116,72,0}}, +/* 20032 */ {(12<<2)|2,{116,73,0}}, +/* 20033 */ {(12<<2)|2,{116,73,0}}, +/* 20034 */ {(12<<2)|2,{116,73,0}}, +/* 20035 */ {(12<<2)|2,{116,73,0}}, +/* 20036 */ {(12<<2)|2,{116,73,0}}, +/* 20037 */ {(12<<2)|2,{116,73,0}}, +/* 20038 */ {(12<<2)|2,{116,73,0}}, +/* 20039 */ {(12<<2)|2,{116,73,0}}, +/* 20040 */ {(12<<2)|2,{116,73,0}}, +/* 20041 */ {(12<<2)|2,{116,73,0}}, +/* 20042 */ {(12<<2)|2,{116,73,0}}, +/* 20043 */ {(12<<2)|2,{116,73,0}}, +/* 20044 */ {(12<<2)|2,{116,73,0}}, +/* 20045 */ {(12<<2)|2,{116,73,0}}, +/* 20046 */ {(12<<2)|2,{116,73,0}}, +/* 20047 */ {(12<<2)|2,{116,73,0}}, +/* 20048 */ {(12<<2)|2,{116,74,0}}, +/* 20049 */ {(12<<2)|2,{116,74,0}}, +/* 20050 */ {(12<<2)|2,{116,74,0}}, +/* 20051 */ {(12<<2)|2,{116,74,0}}, +/* 20052 */ {(12<<2)|2,{116,74,0}}, +/* 20053 */ {(12<<2)|2,{116,74,0}}, +/* 20054 */ {(12<<2)|2,{116,74,0}}, +/* 20055 */ {(12<<2)|2,{116,74,0}}, +/* 20056 */ {(12<<2)|2,{116,74,0}}, +/* 20057 */ {(12<<2)|2,{116,74,0}}, +/* 20058 */ {(12<<2)|2,{116,74,0}}, +/* 20059 */ {(12<<2)|2,{116,74,0}}, +/* 20060 */ {(12<<2)|2,{116,74,0}}, +/* 20061 */ {(12<<2)|2,{116,74,0}}, +/* 20062 */ {(12<<2)|2,{116,74,0}}, +/* 20063 */ {(12<<2)|2,{116,74,0}}, +/* 20064 */ {(12<<2)|2,{116,75,0}}, +/* 20065 */ {(12<<2)|2,{116,75,0}}, +/* 20066 */ {(12<<2)|2,{116,75,0}}, +/* 20067 */ {(12<<2)|2,{116,75,0}}, +/* 20068 */ {(12<<2)|2,{116,75,0}}, +/* 20069 */ {(12<<2)|2,{116,75,0}}, +/* 20070 */ {(12<<2)|2,{116,75,0}}, +/* 20071 */ {(12<<2)|2,{116,75,0}}, +/* 20072 */ {(12<<2)|2,{116,75,0}}, +/* 20073 */ {(12<<2)|2,{116,75,0}}, +/* 20074 */ {(12<<2)|2,{116,75,0}}, +/* 20075 */ {(12<<2)|2,{116,75,0}}, +/* 20076 */ {(12<<2)|2,{116,75,0}}, +/* 20077 */ {(12<<2)|2,{116,75,0}}, +/* 20078 */ {(12<<2)|2,{116,75,0}}, +/* 20079 */ {(12<<2)|2,{116,75,0}}, +/* 20080 */ {(12<<2)|2,{116,76,0}}, +/* 20081 */ {(12<<2)|2,{116,76,0}}, +/* 20082 */ {(12<<2)|2,{116,76,0}}, +/* 20083 */ {(12<<2)|2,{116,76,0}}, +/* 20084 */ {(12<<2)|2,{116,76,0}}, +/* 20085 */ {(12<<2)|2,{116,76,0}}, +/* 20086 */ {(12<<2)|2,{116,76,0}}, +/* 20087 */ {(12<<2)|2,{116,76,0}}, +/* 20088 */ {(12<<2)|2,{116,76,0}}, +/* 20089 */ {(12<<2)|2,{116,76,0}}, +/* 20090 */ {(12<<2)|2,{116,76,0}}, +/* 20091 */ {(12<<2)|2,{116,76,0}}, +/* 20092 */ {(12<<2)|2,{116,76,0}}, +/* 20093 */ {(12<<2)|2,{116,76,0}}, +/* 20094 */ {(12<<2)|2,{116,76,0}}, +/* 20095 */ {(12<<2)|2,{116,76,0}}, +/* 20096 */ {(12<<2)|2,{116,77,0}}, +/* 20097 */ {(12<<2)|2,{116,77,0}}, +/* 20098 */ {(12<<2)|2,{116,77,0}}, +/* 20099 */ {(12<<2)|2,{116,77,0}}, +/* 20100 */ {(12<<2)|2,{116,77,0}}, +/* 20101 */ {(12<<2)|2,{116,77,0}}, +/* 20102 */ {(12<<2)|2,{116,77,0}}, +/* 20103 */ {(12<<2)|2,{116,77,0}}, +/* 20104 */ {(12<<2)|2,{116,77,0}}, +/* 20105 */ {(12<<2)|2,{116,77,0}}, +/* 20106 */ {(12<<2)|2,{116,77,0}}, +/* 20107 */ {(12<<2)|2,{116,77,0}}, +/* 20108 */ {(12<<2)|2,{116,77,0}}, +/* 20109 */ {(12<<2)|2,{116,77,0}}, +/* 20110 */ {(12<<2)|2,{116,77,0}}, +/* 20111 */ {(12<<2)|2,{116,77,0}}, +/* 20112 */ {(12<<2)|2,{116,78,0}}, +/* 20113 */ {(12<<2)|2,{116,78,0}}, +/* 20114 */ {(12<<2)|2,{116,78,0}}, +/* 20115 */ {(12<<2)|2,{116,78,0}}, +/* 20116 */ {(12<<2)|2,{116,78,0}}, +/* 20117 */ {(12<<2)|2,{116,78,0}}, +/* 20118 */ {(12<<2)|2,{116,78,0}}, +/* 20119 */ {(12<<2)|2,{116,78,0}}, +/* 20120 */ {(12<<2)|2,{116,78,0}}, +/* 20121 */ {(12<<2)|2,{116,78,0}}, +/* 20122 */ {(12<<2)|2,{116,78,0}}, +/* 20123 */ {(12<<2)|2,{116,78,0}}, +/* 20124 */ {(12<<2)|2,{116,78,0}}, +/* 20125 */ {(12<<2)|2,{116,78,0}}, +/* 20126 */ {(12<<2)|2,{116,78,0}}, +/* 20127 */ {(12<<2)|2,{116,78,0}}, +/* 20128 */ {(12<<2)|2,{116,79,0}}, +/* 20129 */ {(12<<2)|2,{116,79,0}}, +/* 20130 */ {(12<<2)|2,{116,79,0}}, +/* 20131 */ {(12<<2)|2,{116,79,0}}, +/* 20132 */ {(12<<2)|2,{116,79,0}}, +/* 20133 */ {(12<<2)|2,{116,79,0}}, +/* 20134 */ {(12<<2)|2,{116,79,0}}, +/* 20135 */ {(12<<2)|2,{116,79,0}}, +/* 20136 */ {(12<<2)|2,{116,79,0}}, +/* 20137 */ {(12<<2)|2,{116,79,0}}, +/* 20138 */ {(12<<2)|2,{116,79,0}}, +/* 20139 */ {(12<<2)|2,{116,79,0}}, +/* 20140 */ {(12<<2)|2,{116,79,0}}, +/* 20141 */ {(12<<2)|2,{116,79,0}}, +/* 20142 */ {(12<<2)|2,{116,79,0}}, +/* 20143 */ {(12<<2)|2,{116,79,0}}, +/* 20144 */ {(12<<2)|2,{116,80,0}}, +/* 20145 */ {(12<<2)|2,{116,80,0}}, +/* 20146 */ {(12<<2)|2,{116,80,0}}, +/* 20147 */ {(12<<2)|2,{116,80,0}}, +/* 20148 */ {(12<<2)|2,{116,80,0}}, +/* 20149 */ {(12<<2)|2,{116,80,0}}, +/* 20150 */ {(12<<2)|2,{116,80,0}}, +/* 20151 */ {(12<<2)|2,{116,80,0}}, +/* 20152 */ {(12<<2)|2,{116,80,0}}, +/* 20153 */ {(12<<2)|2,{116,80,0}}, +/* 20154 */ {(12<<2)|2,{116,80,0}}, +/* 20155 */ {(12<<2)|2,{116,80,0}}, +/* 20156 */ {(12<<2)|2,{116,80,0}}, +/* 20157 */ {(12<<2)|2,{116,80,0}}, +/* 20158 */ {(12<<2)|2,{116,80,0}}, +/* 20159 */ {(12<<2)|2,{116,80,0}}, +/* 20160 */ {(12<<2)|2,{116,81,0}}, +/* 20161 */ {(12<<2)|2,{116,81,0}}, +/* 20162 */ {(12<<2)|2,{116,81,0}}, +/* 20163 */ {(12<<2)|2,{116,81,0}}, +/* 20164 */ {(12<<2)|2,{116,81,0}}, +/* 20165 */ {(12<<2)|2,{116,81,0}}, +/* 20166 */ {(12<<2)|2,{116,81,0}}, +/* 20167 */ {(12<<2)|2,{116,81,0}}, +/* 20168 */ {(12<<2)|2,{116,81,0}}, +/* 20169 */ {(12<<2)|2,{116,81,0}}, +/* 20170 */ {(12<<2)|2,{116,81,0}}, +/* 20171 */ {(12<<2)|2,{116,81,0}}, +/* 20172 */ {(12<<2)|2,{116,81,0}}, +/* 20173 */ {(12<<2)|2,{116,81,0}}, +/* 20174 */ {(12<<2)|2,{116,81,0}}, +/* 20175 */ {(12<<2)|2,{116,81,0}}, +/* 20176 */ {(12<<2)|2,{116,82,0}}, +/* 20177 */ {(12<<2)|2,{116,82,0}}, +/* 20178 */ {(12<<2)|2,{116,82,0}}, +/* 20179 */ {(12<<2)|2,{116,82,0}}, +/* 20180 */ {(12<<2)|2,{116,82,0}}, +/* 20181 */ {(12<<2)|2,{116,82,0}}, +/* 20182 */ {(12<<2)|2,{116,82,0}}, +/* 20183 */ {(12<<2)|2,{116,82,0}}, +/* 20184 */ {(12<<2)|2,{116,82,0}}, +/* 20185 */ {(12<<2)|2,{116,82,0}}, +/* 20186 */ {(12<<2)|2,{116,82,0}}, +/* 20187 */ {(12<<2)|2,{116,82,0}}, +/* 20188 */ {(12<<2)|2,{116,82,0}}, +/* 20189 */ {(12<<2)|2,{116,82,0}}, +/* 20190 */ {(12<<2)|2,{116,82,0}}, +/* 20191 */ {(12<<2)|2,{116,82,0}}, +/* 20192 */ {(12<<2)|2,{116,83,0}}, +/* 20193 */ {(12<<2)|2,{116,83,0}}, +/* 20194 */ {(12<<2)|2,{116,83,0}}, +/* 20195 */ {(12<<2)|2,{116,83,0}}, +/* 20196 */ {(12<<2)|2,{116,83,0}}, +/* 20197 */ {(12<<2)|2,{116,83,0}}, +/* 20198 */ {(12<<2)|2,{116,83,0}}, +/* 20199 */ {(12<<2)|2,{116,83,0}}, +/* 20200 */ {(12<<2)|2,{116,83,0}}, +/* 20201 */ {(12<<2)|2,{116,83,0}}, +/* 20202 */ {(12<<2)|2,{116,83,0}}, +/* 20203 */ {(12<<2)|2,{116,83,0}}, +/* 20204 */ {(12<<2)|2,{116,83,0}}, +/* 20205 */ {(12<<2)|2,{116,83,0}}, +/* 20206 */ {(12<<2)|2,{116,83,0}}, +/* 20207 */ {(12<<2)|2,{116,83,0}}, +/* 20208 */ {(12<<2)|2,{116,84,0}}, +/* 20209 */ {(12<<2)|2,{116,84,0}}, +/* 20210 */ {(12<<2)|2,{116,84,0}}, +/* 20211 */ {(12<<2)|2,{116,84,0}}, +/* 20212 */ {(12<<2)|2,{116,84,0}}, +/* 20213 */ {(12<<2)|2,{116,84,0}}, +/* 20214 */ {(12<<2)|2,{116,84,0}}, +/* 20215 */ {(12<<2)|2,{116,84,0}}, +/* 20216 */ {(12<<2)|2,{116,84,0}}, +/* 20217 */ {(12<<2)|2,{116,84,0}}, +/* 20218 */ {(12<<2)|2,{116,84,0}}, +/* 20219 */ {(12<<2)|2,{116,84,0}}, +/* 20220 */ {(12<<2)|2,{116,84,0}}, +/* 20221 */ {(12<<2)|2,{116,84,0}}, +/* 20222 */ {(12<<2)|2,{116,84,0}}, +/* 20223 */ {(12<<2)|2,{116,84,0}}, +/* 20224 */ {(12<<2)|2,{116,85,0}}, +/* 20225 */ {(12<<2)|2,{116,85,0}}, +/* 20226 */ {(12<<2)|2,{116,85,0}}, +/* 20227 */ {(12<<2)|2,{116,85,0}}, +/* 20228 */ {(12<<2)|2,{116,85,0}}, +/* 20229 */ {(12<<2)|2,{116,85,0}}, +/* 20230 */ {(12<<2)|2,{116,85,0}}, +/* 20231 */ {(12<<2)|2,{116,85,0}}, +/* 20232 */ {(12<<2)|2,{116,85,0}}, +/* 20233 */ {(12<<2)|2,{116,85,0}}, +/* 20234 */ {(12<<2)|2,{116,85,0}}, +/* 20235 */ {(12<<2)|2,{116,85,0}}, +/* 20236 */ {(12<<2)|2,{116,85,0}}, +/* 20237 */ {(12<<2)|2,{116,85,0}}, +/* 20238 */ {(12<<2)|2,{116,85,0}}, +/* 20239 */ {(12<<2)|2,{116,85,0}}, +/* 20240 */ {(12<<2)|2,{116,86,0}}, +/* 20241 */ {(12<<2)|2,{116,86,0}}, +/* 20242 */ {(12<<2)|2,{116,86,0}}, +/* 20243 */ {(12<<2)|2,{116,86,0}}, +/* 20244 */ {(12<<2)|2,{116,86,0}}, +/* 20245 */ {(12<<2)|2,{116,86,0}}, +/* 20246 */ {(12<<2)|2,{116,86,0}}, +/* 20247 */ {(12<<2)|2,{116,86,0}}, +/* 20248 */ {(12<<2)|2,{116,86,0}}, +/* 20249 */ {(12<<2)|2,{116,86,0}}, +/* 20250 */ {(12<<2)|2,{116,86,0}}, +/* 20251 */ {(12<<2)|2,{116,86,0}}, +/* 20252 */ {(12<<2)|2,{116,86,0}}, +/* 20253 */ {(12<<2)|2,{116,86,0}}, +/* 20254 */ {(12<<2)|2,{116,86,0}}, +/* 20255 */ {(12<<2)|2,{116,86,0}}, +/* 20256 */ {(12<<2)|2,{116,87,0}}, +/* 20257 */ {(12<<2)|2,{116,87,0}}, +/* 20258 */ {(12<<2)|2,{116,87,0}}, +/* 20259 */ {(12<<2)|2,{116,87,0}}, +/* 20260 */ {(12<<2)|2,{116,87,0}}, +/* 20261 */ {(12<<2)|2,{116,87,0}}, +/* 20262 */ {(12<<2)|2,{116,87,0}}, +/* 20263 */ {(12<<2)|2,{116,87,0}}, +/* 20264 */ {(12<<2)|2,{116,87,0}}, +/* 20265 */ {(12<<2)|2,{116,87,0}}, +/* 20266 */ {(12<<2)|2,{116,87,0}}, +/* 20267 */ {(12<<2)|2,{116,87,0}}, +/* 20268 */ {(12<<2)|2,{116,87,0}}, +/* 20269 */ {(12<<2)|2,{116,87,0}}, +/* 20270 */ {(12<<2)|2,{116,87,0}}, +/* 20271 */ {(12<<2)|2,{116,87,0}}, +/* 20272 */ {(12<<2)|2,{116,89,0}}, +/* 20273 */ {(12<<2)|2,{116,89,0}}, +/* 20274 */ {(12<<2)|2,{116,89,0}}, +/* 20275 */ {(12<<2)|2,{116,89,0}}, +/* 20276 */ {(12<<2)|2,{116,89,0}}, +/* 20277 */ {(12<<2)|2,{116,89,0}}, +/* 20278 */ {(12<<2)|2,{116,89,0}}, +/* 20279 */ {(12<<2)|2,{116,89,0}}, +/* 20280 */ {(12<<2)|2,{116,89,0}}, +/* 20281 */ {(12<<2)|2,{116,89,0}}, +/* 20282 */ {(12<<2)|2,{116,89,0}}, +/* 20283 */ {(12<<2)|2,{116,89,0}}, +/* 20284 */ {(12<<2)|2,{116,89,0}}, +/* 20285 */ {(12<<2)|2,{116,89,0}}, +/* 20286 */ {(12<<2)|2,{116,89,0}}, +/* 20287 */ {(12<<2)|2,{116,89,0}}, +/* 20288 */ {(12<<2)|2,{116,106,0}}, +/* 20289 */ {(12<<2)|2,{116,106,0}}, +/* 20290 */ {(12<<2)|2,{116,106,0}}, +/* 20291 */ {(12<<2)|2,{116,106,0}}, +/* 20292 */ {(12<<2)|2,{116,106,0}}, +/* 20293 */ {(12<<2)|2,{116,106,0}}, +/* 20294 */ {(12<<2)|2,{116,106,0}}, +/* 20295 */ {(12<<2)|2,{116,106,0}}, +/* 20296 */ {(12<<2)|2,{116,106,0}}, +/* 20297 */ {(12<<2)|2,{116,106,0}}, +/* 20298 */ {(12<<2)|2,{116,106,0}}, +/* 20299 */ {(12<<2)|2,{116,106,0}}, +/* 20300 */ {(12<<2)|2,{116,106,0}}, +/* 20301 */ {(12<<2)|2,{116,106,0}}, +/* 20302 */ {(12<<2)|2,{116,106,0}}, +/* 20303 */ {(12<<2)|2,{116,106,0}}, +/* 20304 */ {(12<<2)|2,{116,107,0}}, +/* 20305 */ {(12<<2)|2,{116,107,0}}, +/* 20306 */ {(12<<2)|2,{116,107,0}}, +/* 20307 */ {(12<<2)|2,{116,107,0}}, +/* 20308 */ {(12<<2)|2,{116,107,0}}, +/* 20309 */ {(12<<2)|2,{116,107,0}}, +/* 20310 */ {(12<<2)|2,{116,107,0}}, +/* 20311 */ {(12<<2)|2,{116,107,0}}, +/* 20312 */ {(12<<2)|2,{116,107,0}}, +/* 20313 */ {(12<<2)|2,{116,107,0}}, +/* 20314 */ {(12<<2)|2,{116,107,0}}, +/* 20315 */ {(12<<2)|2,{116,107,0}}, +/* 20316 */ {(12<<2)|2,{116,107,0}}, +/* 20317 */ {(12<<2)|2,{116,107,0}}, +/* 20318 */ {(12<<2)|2,{116,107,0}}, +/* 20319 */ {(12<<2)|2,{116,107,0}}, +/* 20320 */ {(12<<2)|2,{116,113,0}}, +/* 20321 */ {(12<<2)|2,{116,113,0}}, +/* 20322 */ {(12<<2)|2,{116,113,0}}, +/* 20323 */ {(12<<2)|2,{116,113,0}}, +/* 20324 */ {(12<<2)|2,{116,113,0}}, +/* 20325 */ {(12<<2)|2,{116,113,0}}, +/* 20326 */ {(12<<2)|2,{116,113,0}}, +/* 20327 */ {(12<<2)|2,{116,113,0}}, +/* 20328 */ {(12<<2)|2,{116,113,0}}, +/* 20329 */ {(12<<2)|2,{116,113,0}}, +/* 20330 */ {(12<<2)|2,{116,113,0}}, +/* 20331 */ {(12<<2)|2,{116,113,0}}, +/* 20332 */ {(12<<2)|2,{116,113,0}}, +/* 20333 */ {(12<<2)|2,{116,113,0}}, +/* 20334 */ {(12<<2)|2,{116,113,0}}, +/* 20335 */ {(12<<2)|2,{116,113,0}}, +/* 20336 */ {(12<<2)|2,{116,118,0}}, +/* 20337 */ {(12<<2)|2,{116,118,0}}, +/* 20338 */ {(12<<2)|2,{116,118,0}}, +/* 20339 */ {(12<<2)|2,{116,118,0}}, +/* 20340 */ {(12<<2)|2,{116,118,0}}, +/* 20341 */ {(12<<2)|2,{116,118,0}}, +/* 20342 */ {(12<<2)|2,{116,118,0}}, +/* 20343 */ {(12<<2)|2,{116,118,0}}, +/* 20344 */ {(12<<2)|2,{116,118,0}}, +/* 20345 */ {(12<<2)|2,{116,118,0}}, +/* 20346 */ {(12<<2)|2,{116,118,0}}, +/* 20347 */ {(12<<2)|2,{116,118,0}}, +/* 20348 */ {(12<<2)|2,{116,118,0}}, +/* 20349 */ {(12<<2)|2,{116,118,0}}, +/* 20350 */ {(12<<2)|2,{116,118,0}}, +/* 20351 */ {(12<<2)|2,{116,118,0}}, +/* 20352 */ {(12<<2)|2,{116,119,0}}, +/* 20353 */ {(12<<2)|2,{116,119,0}}, +/* 20354 */ {(12<<2)|2,{116,119,0}}, +/* 20355 */ {(12<<2)|2,{116,119,0}}, +/* 20356 */ {(12<<2)|2,{116,119,0}}, +/* 20357 */ {(12<<2)|2,{116,119,0}}, +/* 20358 */ {(12<<2)|2,{116,119,0}}, +/* 20359 */ {(12<<2)|2,{116,119,0}}, +/* 20360 */ {(12<<2)|2,{116,119,0}}, +/* 20361 */ {(12<<2)|2,{116,119,0}}, +/* 20362 */ {(12<<2)|2,{116,119,0}}, +/* 20363 */ {(12<<2)|2,{116,119,0}}, +/* 20364 */ {(12<<2)|2,{116,119,0}}, +/* 20365 */ {(12<<2)|2,{116,119,0}}, +/* 20366 */ {(12<<2)|2,{116,119,0}}, +/* 20367 */ {(12<<2)|2,{116,119,0}}, +/* 20368 */ {(12<<2)|2,{116,120,0}}, +/* 20369 */ {(12<<2)|2,{116,120,0}}, +/* 20370 */ {(12<<2)|2,{116,120,0}}, +/* 20371 */ {(12<<2)|2,{116,120,0}}, +/* 20372 */ {(12<<2)|2,{116,120,0}}, +/* 20373 */ {(12<<2)|2,{116,120,0}}, +/* 20374 */ {(12<<2)|2,{116,120,0}}, +/* 20375 */ {(12<<2)|2,{116,120,0}}, +/* 20376 */ {(12<<2)|2,{116,120,0}}, +/* 20377 */ {(12<<2)|2,{116,120,0}}, +/* 20378 */ {(12<<2)|2,{116,120,0}}, +/* 20379 */ {(12<<2)|2,{116,120,0}}, +/* 20380 */ {(12<<2)|2,{116,120,0}}, +/* 20381 */ {(12<<2)|2,{116,120,0}}, +/* 20382 */ {(12<<2)|2,{116,120,0}}, +/* 20383 */ {(12<<2)|2,{116,120,0}}, +/* 20384 */ {(12<<2)|2,{116,121,0}}, +/* 20385 */ {(12<<2)|2,{116,121,0}}, +/* 20386 */ {(12<<2)|2,{116,121,0}}, +/* 20387 */ {(12<<2)|2,{116,121,0}}, +/* 20388 */ {(12<<2)|2,{116,121,0}}, +/* 20389 */ {(12<<2)|2,{116,121,0}}, +/* 20390 */ {(12<<2)|2,{116,121,0}}, +/* 20391 */ {(12<<2)|2,{116,121,0}}, +/* 20392 */ {(12<<2)|2,{116,121,0}}, +/* 20393 */ {(12<<2)|2,{116,121,0}}, +/* 20394 */ {(12<<2)|2,{116,121,0}}, +/* 20395 */ {(12<<2)|2,{116,121,0}}, +/* 20396 */ {(12<<2)|2,{116,121,0}}, +/* 20397 */ {(12<<2)|2,{116,121,0}}, +/* 20398 */ {(12<<2)|2,{116,121,0}}, +/* 20399 */ {(12<<2)|2,{116,121,0}}, +/* 20400 */ {(12<<2)|2,{116,122,0}}, +/* 20401 */ {(12<<2)|2,{116,122,0}}, +/* 20402 */ {(12<<2)|2,{116,122,0}}, +/* 20403 */ {(12<<2)|2,{116,122,0}}, +/* 20404 */ {(12<<2)|2,{116,122,0}}, +/* 20405 */ {(12<<2)|2,{116,122,0}}, +/* 20406 */ {(12<<2)|2,{116,122,0}}, +/* 20407 */ {(12<<2)|2,{116,122,0}}, +/* 20408 */ {(12<<2)|2,{116,122,0}}, +/* 20409 */ {(12<<2)|2,{116,122,0}}, +/* 20410 */ {(12<<2)|2,{116,122,0}}, +/* 20411 */ {(12<<2)|2,{116,122,0}}, +/* 20412 */ {(12<<2)|2,{116,122,0}}, +/* 20413 */ {(12<<2)|2,{116,122,0}}, +/* 20414 */ {(12<<2)|2,{116,122,0}}, +/* 20415 */ {(12<<2)|2,{116,122,0}}, +/* 20416 */ {(13<<2)|2,{116,38,0}}, +/* 20417 */ {(13<<2)|2,{116,38,0}}, +/* 20418 */ {(13<<2)|2,{116,38,0}}, +/* 20419 */ {(13<<2)|2,{116,38,0}}, +/* 20420 */ {(13<<2)|2,{116,38,0}}, +/* 20421 */ {(13<<2)|2,{116,38,0}}, +/* 20422 */ {(13<<2)|2,{116,38,0}}, +/* 20423 */ {(13<<2)|2,{116,38,0}}, +/* 20424 */ {(13<<2)|2,{116,42,0}}, +/* 20425 */ {(13<<2)|2,{116,42,0}}, +/* 20426 */ {(13<<2)|2,{116,42,0}}, +/* 20427 */ {(13<<2)|2,{116,42,0}}, +/* 20428 */ {(13<<2)|2,{116,42,0}}, +/* 20429 */ {(13<<2)|2,{116,42,0}}, +/* 20430 */ {(13<<2)|2,{116,42,0}}, +/* 20431 */ {(13<<2)|2,{116,42,0}}, +/* 20432 */ {(13<<2)|2,{116,44,0}}, +/* 20433 */ {(13<<2)|2,{116,44,0}}, +/* 20434 */ {(13<<2)|2,{116,44,0}}, +/* 20435 */ {(13<<2)|2,{116,44,0}}, +/* 20436 */ {(13<<2)|2,{116,44,0}}, +/* 20437 */ {(13<<2)|2,{116,44,0}}, +/* 20438 */ {(13<<2)|2,{116,44,0}}, +/* 20439 */ {(13<<2)|2,{116,44,0}}, +/* 20440 */ {(13<<2)|2,{116,59,0}}, +/* 20441 */ {(13<<2)|2,{116,59,0}}, +/* 20442 */ {(13<<2)|2,{116,59,0}}, +/* 20443 */ {(13<<2)|2,{116,59,0}}, +/* 20444 */ {(13<<2)|2,{116,59,0}}, +/* 20445 */ {(13<<2)|2,{116,59,0}}, +/* 20446 */ {(13<<2)|2,{116,59,0}}, +/* 20447 */ {(13<<2)|2,{116,59,0}}, +/* 20448 */ {(13<<2)|2,{116,88,0}}, +/* 20449 */ {(13<<2)|2,{116,88,0}}, +/* 20450 */ {(13<<2)|2,{116,88,0}}, +/* 20451 */ {(13<<2)|2,{116,88,0}}, +/* 20452 */ {(13<<2)|2,{116,88,0}}, +/* 20453 */ {(13<<2)|2,{116,88,0}}, +/* 20454 */ {(13<<2)|2,{116,88,0}}, +/* 20455 */ {(13<<2)|2,{116,88,0}}, +/* 20456 */ {(13<<2)|2,{116,90,0}}, +/* 20457 */ {(13<<2)|2,{116,90,0}}, +/* 20458 */ {(13<<2)|2,{116,90,0}}, +/* 20459 */ {(13<<2)|2,{116,90,0}}, +/* 20460 */ {(13<<2)|2,{116,90,0}}, +/* 20461 */ {(13<<2)|2,{116,90,0}}, +/* 20462 */ {(13<<2)|2,{116,90,0}}, +/* 20463 */ {(13<<2)|2,{116,90,0}}, +/* 20464 */ {(15<<2)|2,{116,33,0}}, +/* 20465 */ {(15<<2)|2,{116,33,0}}, +/* 20466 */ {(15<<2)|2,{116,34,0}}, +/* 20467 */ {(15<<2)|2,{116,34,0}}, +/* 20468 */ {(15<<2)|2,{116,40,0}}, +/* 20469 */ {(15<<2)|2,{116,40,0}}, +/* 20470 */ {(15<<2)|2,{116,41,0}}, +/* 20471 */ {(15<<2)|2,{116,41,0}}, +/* 20472 */ {(15<<2)|2,{116,63,0}}, +/* 20473 */ {(15<<2)|2,{116,63,0}}, +/* 20474 */ {(16<<2)|2,{116,39,0}}, +/* 20475 */ {(16<<2)|2,{116,43,0}}, +/* 20476 */ {(16<<2)|2,{116,124,0}}, +/* 20477 */ {(5<<2)|1,{116,0,0}}, +/* 20478 */ {(5<<2)|1,{116,0,0}}, +/* 20479 */ {(5<<2)|1,{116,0,0}}, +/* 20480 */ {(16<<2)|3,{32,48,48}}, +/* 20481 */ {(16<<2)|3,{32,48,49}}, +/* 20482 */ {(16<<2)|3,{32,48,50}}, +/* 20483 */ {(16<<2)|3,{32,48,97}}, +/* 20484 */ {(16<<2)|3,{32,48,99}}, +/* 20485 */ {(16<<2)|3,{32,48,101}}, +/* 20486 */ {(16<<2)|3,{32,48,105}}, +/* 20487 */ {(16<<2)|3,{32,48,111}}, +/* 20488 */ {(16<<2)|3,{32,48,115}}, +/* 20489 */ {(16<<2)|3,{32,48,116}}, +/* 20490 */ {(11<<2)|2,{32,48,0}}, +/* 20491 */ {(11<<2)|2,{32,48,0}}, +/* 20492 */ {(11<<2)|2,{32,48,0}}, +/* 20493 */ {(11<<2)|2,{32,48,0}}, +/* 20494 */ {(11<<2)|2,{32,48,0}}, +/* 20495 */ {(11<<2)|2,{32,48,0}}, +/* 20496 */ {(11<<2)|2,{32,48,0}}, +/* 20497 */ {(11<<2)|2,{32,48,0}}, +/* 20498 */ {(11<<2)|2,{32,48,0}}, +/* 20499 */ {(11<<2)|2,{32,48,0}}, +/* 20500 */ {(11<<2)|2,{32,48,0}}, +/* 20501 */ {(11<<2)|2,{32,48,0}}, +/* 20502 */ {(11<<2)|2,{32,48,0}}, +/* 20503 */ {(11<<2)|2,{32,48,0}}, +/* 20504 */ {(11<<2)|2,{32,48,0}}, +/* 20505 */ {(11<<2)|2,{32,48,0}}, +/* 20506 */ {(11<<2)|2,{32,48,0}}, +/* 20507 */ {(11<<2)|2,{32,48,0}}, +/* 20508 */ {(11<<2)|2,{32,48,0}}, +/* 20509 */ {(11<<2)|2,{32,48,0}}, +/* 20510 */ {(11<<2)|2,{32,48,0}}, +/* 20511 */ {(11<<2)|2,{32,48,0}}, +/* 20512 */ {(16<<2)|3,{32,49,48}}, +/* 20513 */ {(16<<2)|3,{32,49,49}}, +/* 20514 */ {(16<<2)|3,{32,49,50}}, +/* 20515 */ {(16<<2)|3,{32,49,97}}, +/* 20516 */ {(16<<2)|3,{32,49,99}}, +/* 20517 */ {(16<<2)|3,{32,49,101}}, +/* 20518 */ {(16<<2)|3,{32,49,105}}, +/* 20519 */ {(16<<2)|3,{32,49,111}}, +/* 20520 */ {(16<<2)|3,{32,49,115}}, +/* 20521 */ {(16<<2)|3,{32,49,116}}, +/* 20522 */ {(11<<2)|2,{32,49,0}}, +/* 20523 */ {(11<<2)|2,{32,49,0}}, +/* 20524 */ {(11<<2)|2,{32,49,0}}, +/* 20525 */ {(11<<2)|2,{32,49,0}}, +/* 20526 */ {(11<<2)|2,{32,49,0}}, +/* 20527 */ {(11<<2)|2,{32,49,0}}, +/* 20528 */ {(11<<2)|2,{32,49,0}}, +/* 20529 */ {(11<<2)|2,{32,49,0}}, +/* 20530 */ {(11<<2)|2,{32,49,0}}, +/* 20531 */ {(11<<2)|2,{32,49,0}}, +/* 20532 */ {(11<<2)|2,{32,49,0}}, +/* 20533 */ {(11<<2)|2,{32,49,0}}, +/* 20534 */ {(11<<2)|2,{32,49,0}}, +/* 20535 */ {(11<<2)|2,{32,49,0}}, +/* 20536 */ {(11<<2)|2,{32,49,0}}, +/* 20537 */ {(11<<2)|2,{32,49,0}}, +/* 20538 */ {(11<<2)|2,{32,49,0}}, +/* 20539 */ {(11<<2)|2,{32,49,0}}, +/* 20540 */ {(11<<2)|2,{32,49,0}}, +/* 20541 */ {(11<<2)|2,{32,49,0}}, +/* 20542 */ {(11<<2)|2,{32,49,0}}, +/* 20543 */ {(11<<2)|2,{32,49,0}}, +/* 20544 */ {(16<<2)|3,{32,50,48}}, +/* 20545 */ {(16<<2)|3,{32,50,49}}, +/* 20546 */ {(16<<2)|3,{32,50,50}}, +/* 20547 */ {(16<<2)|3,{32,50,97}}, +/* 20548 */ {(16<<2)|3,{32,50,99}}, +/* 20549 */ {(16<<2)|3,{32,50,101}}, +/* 20550 */ {(16<<2)|3,{32,50,105}}, +/* 20551 */ {(16<<2)|3,{32,50,111}}, +/* 20552 */ {(16<<2)|3,{32,50,115}}, +/* 20553 */ {(16<<2)|3,{32,50,116}}, +/* 20554 */ {(11<<2)|2,{32,50,0}}, +/* 20555 */ {(11<<2)|2,{32,50,0}}, +/* 20556 */ {(11<<2)|2,{32,50,0}}, +/* 20557 */ {(11<<2)|2,{32,50,0}}, +/* 20558 */ {(11<<2)|2,{32,50,0}}, +/* 20559 */ {(11<<2)|2,{32,50,0}}, +/* 20560 */ {(11<<2)|2,{32,50,0}}, +/* 20561 */ {(11<<2)|2,{32,50,0}}, +/* 20562 */ {(11<<2)|2,{32,50,0}}, +/* 20563 */ {(11<<2)|2,{32,50,0}}, +/* 20564 */ {(11<<2)|2,{32,50,0}}, +/* 20565 */ {(11<<2)|2,{32,50,0}}, +/* 20566 */ {(11<<2)|2,{32,50,0}}, +/* 20567 */ {(11<<2)|2,{32,50,0}}, +/* 20568 */ {(11<<2)|2,{32,50,0}}, +/* 20569 */ {(11<<2)|2,{32,50,0}}, +/* 20570 */ {(11<<2)|2,{32,50,0}}, +/* 20571 */ {(11<<2)|2,{32,50,0}}, +/* 20572 */ {(11<<2)|2,{32,50,0}}, +/* 20573 */ {(11<<2)|2,{32,50,0}}, +/* 20574 */ {(11<<2)|2,{32,50,0}}, +/* 20575 */ {(11<<2)|2,{32,50,0}}, +/* 20576 */ {(16<<2)|3,{32,97,48}}, +/* 20577 */ {(16<<2)|3,{32,97,49}}, +/* 20578 */ {(16<<2)|3,{32,97,50}}, +/* 20579 */ {(16<<2)|3,{32,97,97}}, +/* 20580 */ {(16<<2)|3,{32,97,99}}, +/* 20581 */ {(16<<2)|3,{32,97,101}}, +/* 20582 */ {(16<<2)|3,{32,97,105}}, +/* 20583 */ {(16<<2)|3,{32,97,111}}, +/* 20584 */ {(16<<2)|3,{32,97,115}}, +/* 20585 */ {(16<<2)|3,{32,97,116}}, +/* 20586 */ {(11<<2)|2,{32,97,0}}, +/* 20587 */ {(11<<2)|2,{32,97,0}}, +/* 20588 */ {(11<<2)|2,{32,97,0}}, +/* 20589 */ {(11<<2)|2,{32,97,0}}, +/* 20590 */ {(11<<2)|2,{32,97,0}}, +/* 20591 */ {(11<<2)|2,{32,97,0}}, +/* 20592 */ {(11<<2)|2,{32,97,0}}, +/* 20593 */ {(11<<2)|2,{32,97,0}}, +/* 20594 */ {(11<<2)|2,{32,97,0}}, +/* 20595 */ {(11<<2)|2,{32,97,0}}, +/* 20596 */ {(11<<2)|2,{32,97,0}}, +/* 20597 */ {(11<<2)|2,{32,97,0}}, +/* 20598 */ {(11<<2)|2,{32,97,0}}, +/* 20599 */ {(11<<2)|2,{32,97,0}}, +/* 20600 */ {(11<<2)|2,{32,97,0}}, +/* 20601 */ {(11<<2)|2,{32,97,0}}, +/* 20602 */ {(11<<2)|2,{32,97,0}}, +/* 20603 */ {(11<<2)|2,{32,97,0}}, +/* 20604 */ {(11<<2)|2,{32,97,0}}, +/* 20605 */ {(11<<2)|2,{32,97,0}}, +/* 20606 */ {(11<<2)|2,{32,97,0}}, +/* 20607 */ {(11<<2)|2,{32,97,0}}, +/* 20608 */ {(16<<2)|3,{32,99,48}}, +/* 20609 */ {(16<<2)|3,{32,99,49}}, +/* 20610 */ {(16<<2)|3,{32,99,50}}, +/* 20611 */ {(16<<2)|3,{32,99,97}}, +/* 20612 */ {(16<<2)|3,{32,99,99}}, +/* 20613 */ {(16<<2)|3,{32,99,101}}, +/* 20614 */ {(16<<2)|3,{32,99,105}}, +/* 20615 */ {(16<<2)|3,{32,99,111}}, +/* 20616 */ {(16<<2)|3,{32,99,115}}, +/* 20617 */ {(16<<2)|3,{32,99,116}}, +/* 20618 */ {(11<<2)|2,{32,99,0}}, +/* 20619 */ {(11<<2)|2,{32,99,0}}, +/* 20620 */ {(11<<2)|2,{32,99,0}}, +/* 20621 */ {(11<<2)|2,{32,99,0}}, +/* 20622 */ {(11<<2)|2,{32,99,0}}, +/* 20623 */ {(11<<2)|2,{32,99,0}}, +/* 20624 */ {(11<<2)|2,{32,99,0}}, +/* 20625 */ {(11<<2)|2,{32,99,0}}, +/* 20626 */ {(11<<2)|2,{32,99,0}}, +/* 20627 */ {(11<<2)|2,{32,99,0}}, +/* 20628 */ {(11<<2)|2,{32,99,0}}, +/* 20629 */ {(11<<2)|2,{32,99,0}}, +/* 20630 */ {(11<<2)|2,{32,99,0}}, +/* 20631 */ {(11<<2)|2,{32,99,0}}, +/* 20632 */ {(11<<2)|2,{32,99,0}}, +/* 20633 */ {(11<<2)|2,{32,99,0}}, +/* 20634 */ {(11<<2)|2,{32,99,0}}, +/* 20635 */ {(11<<2)|2,{32,99,0}}, +/* 20636 */ {(11<<2)|2,{32,99,0}}, +/* 20637 */ {(11<<2)|2,{32,99,0}}, +/* 20638 */ {(11<<2)|2,{32,99,0}}, +/* 20639 */ {(11<<2)|2,{32,99,0}}, +/* 20640 */ {(16<<2)|3,{32,101,48}}, +/* 20641 */ {(16<<2)|3,{32,101,49}}, +/* 20642 */ {(16<<2)|3,{32,101,50}}, +/* 20643 */ {(16<<2)|3,{32,101,97}}, +/* 20644 */ {(16<<2)|3,{32,101,99}}, +/* 20645 */ {(16<<2)|3,{32,101,101}}, +/* 20646 */ {(16<<2)|3,{32,101,105}}, +/* 20647 */ {(16<<2)|3,{32,101,111}}, +/* 20648 */ {(16<<2)|3,{32,101,115}}, +/* 20649 */ {(16<<2)|3,{32,101,116}}, +/* 20650 */ {(11<<2)|2,{32,101,0}}, +/* 20651 */ {(11<<2)|2,{32,101,0}}, +/* 20652 */ {(11<<2)|2,{32,101,0}}, +/* 20653 */ {(11<<2)|2,{32,101,0}}, +/* 20654 */ {(11<<2)|2,{32,101,0}}, +/* 20655 */ {(11<<2)|2,{32,101,0}}, +/* 20656 */ {(11<<2)|2,{32,101,0}}, +/* 20657 */ {(11<<2)|2,{32,101,0}}, +/* 20658 */ {(11<<2)|2,{32,101,0}}, +/* 20659 */ {(11<<2)|2,{32,101,0}}, +/* 20660 */ {(11<<2)|2,{32,101,0}}, +/* 20661 */ {(11<<2)|2,{32,101,0}}, +/* 20662 */ {(11<<2)|2,{32,101,0}}, +/* 20663 */ {(11<<2)|2,{32,101,0}}, +/* 20664 */ {(11<<2)|2,{32,101,0}}, +/* 20665 */ {(11<<2)|2,{32,101,0}}, +/* 20666 */ {(11<<2)|2,{32,101,0}}, +/* 20667 */ {(11<<2)|2,{32,101,0}}, +/* 20668 */ {(11<<2)|2,{32,101,0}}, +/* 20669 */ {(11<<2)|2,{32,101,0}}, +/* 20670 */ {(11<<2)|2,{32,101,0}}, +/* 20671 */ {(11<<2)|2,{32,101,0}}, +/* 20672 */ {(16<<2)|3,{32,105,48}}, +/* 20673 */ {(16<<2)|3,{32,105,49}}, +/* 20674 */ {(16<<2)|3,{32,105,50}}, +/* 20675 */ {(16<<2)|3,{32,105,97}}, +/* 20676 */ {(16<<2)|3,{32,105,99}}, +/* 20677 */ {(16<<2)|3,{32,105,101}}, +/* 20678 */ {(16<<2)|3,{32,105,105}}, +/* 20679 */ {(16<<2)|3,{32,105,111}}, +/* 20680 */ {(16<<2)|3,{32,105,115}}, +/* 20681 */ {(16<<2)|3,{32,105,116}}, +/* 20682 */ {(11<<2)|2,{32,105,0}}, +/* 20683 */ {(11<<2)|2,{32,105,0}}, +/* 20684 */ {(11<<2)|2,{32,105,0}}, +/* 20685 */ {(11<<2)|2,{32,105,0}}, +/* 20686 */ {(11<<2)|2,{32,105,0}}, +/* 20687 */ {(11<<2)|2,{32,105,0}}, +/* 20688 */ {(11<<2)|2,{32,105,0}}, +/* 20689 */ {(11<<2)|2,{32,105,0}}, +/* 20690 */ {(11<<2)|2,{32,105,0}}, +/* 20691 */ {(11<<2)|2,{32,105,0}}, +/* 20692 */ {(11<<2)|2,{32,105,0}}, +/* 20693 */ {(11<<2)|2,{32,105,0}}, +/* 20694 */ {(11<<2)|2,{32,105,0}}, +/* 20695 */ {(11<<2)|2,{32,105,0}}, +/* 20696 */ {(11<<2)|2,{32,105,0}}, +/* 20697 */ {(11<<2)|2,{32,105,0}}, +/* 20698 */ {(11<<2)|2,{32,105,0}}, +/* 20699 */ {(11<<2)|2,{32,105,0}}, +/* 20700 */ {(11<<2)|2,{32,105,0}}, +/* 20701 */ {(11<<2)|2,{32,105,0}}, +/* 20702 */ {(11<<2)|2,{32,105,0}}, +/* 20703 */ {(11<<2)|2,{32,105,0}}, +/* 20704 */ {(16<<2)|3,{32,111,48}}, +/* 20705 */ {(16<<2)|3,{32,111,49}}, +/* 20706 */ {(16<<2)|3,{32,111,50}}, +/* 20707 */ {(16<<2)|3,{32,111,97}}, +/* 20708 */ {(16<<2)|3,{32,111,99}}, +/* 20709 */ {(16<<2)|3,{32,111,101}}, +/* 20710 */ {(16<<2)|3,{32,111,105}}, +/* 20711 */ {(16<<2)|3,{32,111,111}}, +/* 20712 */ {(16<<2)|3,{32,111,115}}, +/* 20713 */ {(16<<2)|3,{32,111,116}}, +/* 20714 */ {(11<<2)|2,{32,111,0}}, +/* 20715 */ {(11<<2)|2,{32,111,0}}, +/* 20716 */ {(11<<2)|2,{32,111,0}}, +/* 20717 */ {(11<<2)|2,{32,111,0}}, +/* 20718 */ {(11<<2)|2,{32,111,0}}, +/* 20719 */ {(11<<2)|2,{32,111,0}}, +/* 20720 */ {(11<<2)|2,{32,111,0}}, +/* 20721 */ {(11<<2)|2,{32,111,0}}, +/* 20722 */ {(11<<2)|2,{32,111,0}}, +/* 20723 */ {(11<<2)|2,{32,111,0}}, +/* 20724 */ {(11<<2)|2,{32,111,0}}, +/* 20725 */ {(11<<2)|2,{32,111,0}}, +/* 20726 */ {(11<<2)|2,{32,111,0}}, +/* 20727 */ {(11<<2)|2,{32,111,0}}, +/* 20728 */ {(11<<2)|2,{32,111,0}}, +/* 20729 */ {(11<<2)|2,{32,111,0}}, +/* 20730 */ {(11<<2)|2,{32,111,0}}, +/* 20731 */ {(11<<2)|2,{32,111,0}}, +/* 20732 */ {(11<<2)|2,{32,111,0}}, +/* 20733 */ {(11<<2)|2,{32,111,0}}, +/* 20734 */ {(11<<2)|2,{32,111,0}}, +/* 20735 */ {(11<<2)|2,{32,111,0}}, +/* 20736 */ {(16<<2)|3,{32,115,48}}, +/* 20737 */ {(16<<2)|3,{32,115,49}}, +/* 20738 */ {(16<<2)|3,{32,115,50}}, +/* 20739 */ {(16<<2)|3,{32,115,97}}, +/* 20740 */ {(16<<2)|3,{32,115,99}}, +/* 20741 */ {(16<<2)|3,{32,115,101}}, +/* 20742 */ {(16<<2)|3,{32,115,105}}, +/* 20743 */ {(16<<2)|3,{32,115,111}}, +/* 20744 */ {(16<<2)|3,{32,115,115}}, +/* 20745 */ {(16<<2)|3,{32,115,116}}, +/* 20746 */ {(11<<2)|2,{32,115,0}}, +/* 20747 */ {(11<<2)|2,{32,115,0}}, +/* 20748 */ {(11<<2)|2,{32,115,0}}, +/* 20749 */ {(11<<2)|2,{32,115,0}}, +/* 20750 */ {(11<<2)|2,{32,115,0}}, +/* 20751 */ {(11<<2)|2,{32,115,0}}, +/* 20752 */ {(11<<2)|2,{32,115,0}}, +/* 20753 */ {(11<<2)|2,{32,115,0}}, +/* 20754 */ {(11<<2)|2,{32,115,0}}, +/* 20755 */ {(11<<2)|2,{32,115,0}}, +/* 20756 */ {(11<<2)|2,{32,115,0}}, +/* 20757 */ {(11<<2)|2,{32,115,0}}, +/* 20758 */ {(11<<2)|2,{32,115,0}}, +/* 20759 */ {(11<<2)|2,{32,115,0}}, +/* 20760 */ {(11<<2)|2,{32,115,0}}, +/* 20761 */ {(11<<2)|2,{32,115,0}}, +/* 20762 */ {(11<<2)|2,{32,115,0}}, +/* 20763 */ {(11<<2)|2,{32,115,0}}, +/* 20764 */ {(11<<2)|2,{32,115,0}}, +/* 20765 */ {(11<<2)|2,{32,115,0}}, +/* 20766 */ {(11<<2)|2,{32,115,0}}, +/* 20767 */ {(11<<2)|2,{32,115,0}}, +/* 20768 */ {(16<<2)|3,{32,116,48}}, +/* 20769 */ {(16<<2)|3,{32,116,49}}, +/* 20770 */ {(16<<2)|3,{32,116,50}}, +/* 20771 */ {(16<<2)|3,{32,116,97}}, +/* 20772 */ {(16<<2)|3,{32,116,99}}, +/* 20773 */ {(16<<2)|3,{32,116,101}}, +/* 20774 */ {(16<<2)|3,{32,116,105}}, +/* 20775 */ {(16<<2)|3,{32,116,111}}, +/* 20776 */ {(16<<2)|3,{32,116,115}}, +/* 20777 */ {(16<<2)|3,{32,116,116}}, +/* 20778 */ {(11<<2)|2,{32,116,0}}, +/* 20779 */ {(11<<2)|2,{32,116,0}}, +/* 20780 */ {(11<<2)|2,{32,116,0}}, +/* 20781 */ {(11<<2)|2,{32,116,0}}, +/* 20782 */ {(11<<2)|2,{32,116,0}}, +/* 20783 */ {(11<<2)|2,{32,116,0}}, +/* 20784 */ {(11<<2)|2,{32,116,0}}, +/* 20785 */ {(11<<2)|2,{32,116,0}}, +/* 20786 */ {(11<<2)|2,{32,116,0}}, +/* 20787 */ {(11<<2)|2,{32,116,0}}, +/* 20788 */ {(11<<2)|2,{32,116,0}}, +/* 20789 */ {(11<<2)|2,{32,116,0}}, +/* 20790 */ {(11<<2)|2,{32,116,0}}, +/* 20791 */ {(11<<2)|2,{32,116,0}}, +/* 20792 */ {(11<<2)|2,{32,116,0}}, +/* 20793 */ {(11<<2)|2,{32,116,0}}, +/* 20794 */ {(11<<2)|2,{32,116,0}}, +/* 20795 */ {(11<<2)|2,{32,116,0}}, +/* 20796 */ {(11<<2)|2,{32,116,0}}, +/* 20797 */ {(11<<2)|2,{32,116,0}}, +/* 20798 */ {(11<<2)|2,{32,116,0}}, +/* 20799 */ {(11<<2)|2,{32,116,0}}, +/* 20800 */ {(12<<2)|2,{32,32,0}}, +/* 20801 */ {(12<<2)|2,{32,32,0}}, +/* 20802 */ {(12<<2)|2,{32,32,0}}, +/* 20803 */ {(12<<2)|2,{32,32,0}}, +/* 20804 */ {(12<<2)|2,{32,32,0}}, +/* 20805 */ {(12<<2)|2,{32,32,0}}, +/* 20806 */ {(12<<2)|2,{32,32,0}}, +/* 20807 */ {(12<<2)|2,{32,32,0}}, +/* 20808 */ {(12<<2)|2,{32,32,0}}, +/* 20809 */ {(12<<2)|2,{32,32,0}}, +/* 20810 */ {(12<<2)|2,{32,32,0}}, +/* 20811 */ {(12<<2)|2,{32,32,0}}, +/* 20812 */ {(12<<2)|2,{32,32,0}}, +/* 20813 */ {(12<<2)|2,{32,32,0}}, +/* 20814 */ {(12<<2)|2,{32,32,0}}, +/* 20815 */ {(12<<2)|2,{32,32,0}}, +/* 20816 */ {(12<<2)|2,{32,37,0}}, +/* 20817 */ {(12<<2)|2,{32,37,0}}, +/* 20818 */ {(12<<2)|2,{32,37,0}}, +/* 20819 */ {(12<<2)|2,{32,37,0}}, +/* 20820 */ {(12<<2)|2,{32,37,0}}, +/* 20821 */ {(12<<2)|2,{32,37,0}}, +/* 20822 */ {(12<<2)|2,{32,37,0}}, +/* 20823 */ {(12<<2)|2,{32,37,0}}, +/* 20824 */ {(12<<2)|2,{32,37,0}}, +/* 20825 */ {(12<<2)|2,{32,37,0}}, +/* 20826 */ {(12<<2)|2,{32,37,0}}, +/* 20827 */ {(12<<2)|2,{32,37,0}}, +/* 20828 */ {(12<<2)|2,{32,37,0}}, +/* 20829 */ {(12<<2)|2,{32,37,0}}, +/* 20830 */ {(12<<2)|2,{32,37,0}}, +/* 20831 */ {(12<<2)|2,{32,37,0}}, +/* 20832 */ {(12<<2)|2,{32,45,0}}, +/* 20833 */ {(12<<2)|2,{32,45,0}}, +/* 20834 */ {(12<<2)|2,{32,45,0}}, +/* 20835 */ {(12<<2)|2,{32,45,0}}, +/* 20836 */ {(12<<2)|2,{32,45,0}}, +/* 20837 */ {(12<<2)|2,{32,45,0}}, +/* 20838 */ {(12<<2)|2,{32,45,0}}, +/* 20839 */ {(12<<2)|2,{32,45,0}}, +/* 20840 */ {(12<<2)|2,{32,45,0}}, +/* 20841 */ {(12<<2)|2,{32,45,0}}, +/* 20842 */ {(12<<2)|2,{32,45,0}}, +/* 20843 */ {(12<<2)|2,{32,45,0}}, +/* 20844 */ {(12<<2)|2,{32,45,0}}, +/* 20845 */ {(12<<2)|2,{32,45,0}}, +/* 20846 */ {(12<<2)|2,{32,45,0}}, +/* 20847 */ {(12<<2)|2,{32,45,0}}, +/* 20848 */ {(12<<2)|2,{32,46,0}}, +/* 20849 */ {(12<<2)|2,{32,46,0}}, +/* 20850 */ {(12<<2)|2,{32,46,0}}, +/* 20851 */ {(12<<2)|2,{32,46,0}}, +/* 20852 */ {(12<<2)|2,{32,46,0}}, +/* 20853 */ {(12<<2)|2,{32,46,0}}, +/* 20854 */ {(12<<2)|2,{32,46,0}}, +/* 20855 */ {(12<<2)|2,{32,46,0}}, +/* 20856 */ {(12<<2)|2,{32,46,0}}, +/* 20857 */ {(12<<2)|2,{32,46,0}}, +/* 20858 */ {(12<<2)|2,{32,46,0}}, +/* 20859 */ {(12<<2)|2,{32,46,0}}, +/* 20860 */ {(12<<2)|2,{32,46,0}}, +/* 20861 */ {(12<<2)|2,{32,46,0}}, +/* 20862 */ {(12<<2)|2,{32,46,0}}, +/* 20863 */ {(12<<2)|2,{32,46,0}}, +/* 20864 */ {(12<<2)|2,{32,47,0}}, +/* 20865 */ {(12<<2)|2,{32,47,0}}, +/* 20866 */ {(12<<2)|2,{32,47,0}}, +/* 20867 */ {(12<<2)|2,{32,47,0}}, +/* 20868 */ {(12<<2)|2,{32,47,0}}, +/* 20869 */ {(12<<2)|2,{32,47,0}}, +/* 20870 */ {(12<<2)|2,{32,47,0}}, +/* 20871 */ {(12<<2)|2,{32,47,0}}, +/* 20872 */ {(12<<2)|2,{32,47,0}}, +/* 20873 */ {(12<<2)|2,{32,47,0}}, +/* 20874 */ {(12<<2)|2,{32,47,0}}, +/* 20875 */ {(12<<2)|2,{32,47,0}}, +/* 20876 */ {(12<<2)|2,{32,47,0}}, +/* 20877 */ {(12<<2)|2,{32,47,0}}, +/* 20878 */ {(12<<2)|2,{32,47,0}}, +/* 20879 */ {(12<<2)|2,{32,47,0}}, +/* 20880 */ {(12<<2)|2,{32,51,0}}, +/* 20881 */ {(12<<2)|2,{32,51,0}}, +/* 20882 */ {(12<<2)|2,{32,51,0}}, +/* 20883 */ {(12<<2)|2,{32,51,0}}, +/* 20884 */ {(12<<2)|2,{32,51,0}}, +/* 20885 */ {(12<<2)|2,{32,51,0}}, +/* 20886 */ {(12<<2)|2,{32,51,0}}, +/* 20887 */ {(12<<2)|2,{32,51,0}}, +/* 20888 */ {(12<<2)|2,{32,51,0}}, +/* 20889 */ {(12<<2)|2,{32,51,0}}, +/* 20890 */ {(12<<2)|2,{32,51,0}}, +/* 20891 */ {(12<<2)|2,{32,51,0}}, +/* 20892 */ {(12<<2)|2,{32,51,0}}, +/* 20893 */ {(12<<2)|2,{32,51,0}}, +/* 20894 */ {(12<<2)|2,{32,51,0}}, +/* 20895 */ {(12<<2)|2,{32,51,0}}, +/* 20896 */ {(12<<2)|2,{32,52,0}}, +/* 20897 */ {(12<<2)|2,{32,52,0}}, +/* 20898 */ {(12<<2)|2,{32,52,0}}, +/* 20899 */ {(12<<2)|2,{32,52,0}}, +/* 20900 */ {(12<<2)|2,{32,52,0}}, +/* 20901 */ {(12<<2)|2,{32,52,0}}, +/* 20902 */ {(12<<2)|2,{32,52,0}}, +/* 20903 */ {(12<<2)|2,{32,52,0}}, +/* 20904 */ {(12<<2)|2,{32,52,0}}, +/* 20905 */ {(12<<2)|2,{32,52,0}}, +/* 20906 */ {(12<<2)|2,{32,52,0}}, +/* 20907 */ {(12<<2)|2,{32,52,0}}, +/* 20908 */ {(12<<2)|2,{32,52,0}}, +/* 20909 */ {(12<<2)|2,{32,52,0}}, +/* 20910 */ {(12<<2)|2,{32,52,0}}, +/* 20911 */ {(12<<2)|2,{32,52,0}}, +/* 20912 */ {(12<<2)|2,{32,53,0}}, +/* 20913 */ {(12<<2)|2,{32,53,0}}, +/* 20914 */ {(12<<2)|2,{32,53,0}}, +/* 20915 */ {(12<<2)|2,{32,53,0}}, +/* 20916 */ {(12<<2)|2,{32,53,0}}, +/* 20917 */ {(12<<2)|2,{32,53,0}}, +/* 20918 */ {(12<<2)|2,{32,53,0}}, +/* 20919 */ {(12<<2)|2,{32,53,0}}, +/* 20920 */ {(12<<2)|2,{32,53,0}}, +/* 20921 */ {(12<<2)|2,{32,53,0}}, +/* 20922 */ {(12<<2)|2,{32,53,0}}, +/* 20923 */ {(12<<2)|2,{32,53,0}}, +/* 20924 */ {(12<<2)|2,{32,53,0}}, +/* 20925 */ {(12<<2)|2,{32,53,0}}, +/* 20926 */ {(12<<2)|2,{32,53,0}}, +/* 20927 */ {(12<<2)|2,{32,53,0}}, +/* 20928 */ {(12<<2)|2,{32,54,0}}, +/* 20929 */ {(12<<2)|2,{32,54,0}}, +/* 20930 */ {(12<<2)|2,{32,54,0}}, +/* 20931 */ {(12<<2)|2,{32,54,0}}, +/* 20932 */ {(12<<2)|2,{32,54,0}}, +/* 20933 */ {(12<<2)|2,{32,54,0}}, +/* 20934 */ {(12<<2)|2,{32,54,0}}, +/* 20935 */ {(12<<2)|2,{32,54,0}}, +/* 20936 */ {(12<<2)|2,{32,54,0}}, +/* 20937 */ {(12<<2)|2,{32,54,0}}, +/* 20938 */ {(12<<2)|2,{32,54,0}}, +/* 20939 */ {(12<<2)|2,{32,54,0}}, +/* 20940 */ {(12<<2)|2,{32,54,0}}, +/* 20941 */ {(12<<2)|2,{32,54,0}}, +/* 20942 */ {(12<<2)|2,{32,54,0}}, +/* 20943 */ {(12<<2)|2,{32,54,0}}, +/* 20944 */ {(12<<2)|2,{32,55,0}}, +/* 20945 */ {(12<<2)|2,{32,55,0}}, +/* 20946 */ {(12<<2)|2,{32,55,0}}, +/* 20947 */ {(12<<2)|2,{32,55,0}}, +/* 20948 */ {(12<<2)|2,{32,55,0}}, +/* 20949 */ {(12<<2)|2,{32,55,0}}, +/* 20950 */ {(12<<2)|2,{32,55,0}}, +/* 20951 */ {(12<<2)|2,{32,55,0}}, +/* 20952 */ {(12<<2)|2,{32,55,0}}, +/* 20953 */ {(12<<2)|2,{32,55,0}}, +/* 20954 */ {(12<<2)|2,{32,55,0}}, +/* 20955 */ {(12<<2)|2,{32,55,0}}, +/* 20956 */ {(12<<2)|2,{32,55,0}}, +/* 20957 */ {(12<<2)|2,{32,55,0}}, +/* 20958 */ {(12<<2)|2,{32,55,0}}, +/* 20959 */ {(12<<2)|2,{32,55,0}}, +/* 20960 */ {(12<<2)|2,{32,56,0}}, +/* 20961 */ {(12<<2)|2,{32,56,0}}, +/* 20962 */ {(12<<2)|2,{32,56,0}}, +/* 20963 */ {(12<<2)|2,{32,56,0}}, +/* 20964 */ {(12<<2)|2,{32,56,0}}, +/* 20965 */ {(12<<2)|2,{32,56,0}}, +/* 20966 */ {(12<<2)|2,{32,56,0}}, +/* 20967 */ {(12<<2)|2,{32,56,0}}, +/* 20968 */ {(12<<2)|2,{32,56,0}}, +/* 20969 */ {(12<<2)|2,{32,56,0}}, +/* 20970 */ {(12<<2)|2,{32,56,0}}, +/* 20971 */ {(12<<2)|2,{32,56,0}}, +/* 20972 */ {(12<<2)|2,{32,56,0}}, +/* 20973 */ {(12<<2)|2,{32,56,0}}, +/* 20974 */ {(12<<2)|2,{32,56,0}}, +/* 20975 */ {(12<<2)|2,{32,56,0}}, +/* 20976 */ {(12<<2)|2,{32,57,0}}, +/* 20977 */ {(12<<2)|2,{32,57,0}}, +/* 20978 */ {(12<<2)|2,{32,57,0}}, +/* 20979 */ {(12<<2)|2,{32,57,0}}, +/* 20980 */ {(12<<2)|2,{32,57,0}}, +/* 20981 */ {(12<<2)|2,{32,57,0}}, +/* 20982 */ {(12<<2)|2,{32,57,0}}, +/* 20983 */ {(12<<2)|2,{32,57,0}}, +/* 20984 */ {(12<<2)|2,{32,57,0}}, +/* 20985 */ {(12<<2)|2,{32,57,0}}, +/* 20986 */ {(12<<2)|2,{32,57,0}}, +/* 20987 */ {(12<<2)|2,{32,57,0}}, +/* 20988 */ {(12<<2)|2,{32,57,0}}, +/* 20989 */ {(12<<2)|2,{32,57,0}}, +/* 20990 */ {(12<<2)|2,{32,57,0}}, +/* 20991 */ {(12<<2)|2,{32,57,0}}, +/* 20992 */ {(12<<2)|2,{32,61,0}}, +/* 20993 */ {(12<<2)|2,{32,61,0}}, +/* 20994 */ {(12<<2)|2,{32,61,0}}, +/* 20995 */ {(12<<2)|2,{32,61,0}}, +/* 20996 */ {(12<<2)|2,{32,61,0}}, +/* 20997 */ {(12<<2)|2,{32,61,0}}, +/* 20998 */ {(12<<2)|2,{32,61,0}}, +/* 20999 */ {(12<<2)|2,{32,61,0}}, +/* 21000 */ {(12<<2)|2,{32,61,0}}, +/* 21001 */ {(12<<2)|2,{32,61,0}}, +/* 21002 */ {(12<<2)|2,{32,61,0}}, +/* 21003 */ {(12<<2)|2,{32,61,0}}, +/* 21004 */ {(12<<2)|2,{32,61,0}}, +/* 21005 */ {(12<<2)|2,{32,61,0}}, +/* 21006 */ {(12<<2)|2,{32,61,0}}, +/* 21007 */ {(12<<2)|2,{32,61,0}}, +/* 21008 */ {(12<<2)|2,{32,65,0}}, +/* 21009 */ {(12<<2)|2,{32,65,0}}, +/* 21010 */ {(12<<2)|2,{32,65,0}}, +/* 21011 */ {(12<<2)|2,{32,65,0}}, +/* 21012 */ {(12<<2)|2,{32,65,0}}, +/* 21013 */ {(12<<2)|2,{32,65,0}}, +/* 21014 */ {(12<<2)|2,{32,65,0}}, +/* 21015 */ {(12<<2)|2,{32,65,0}}, +/* 21016 */ {(12<<2)|2,{32,65,0}}, +/* 21017 */ {(12<<2)|2,{32,65,0}}, +/* 21018 */ {(12<<2)|2,{32,65,0}}, +/* 21019 */ {(12<<2)|2,{32,65,0}}, +/* 21020 */ {(12<<2)|2,{32,65,0}}, +/* 21021 */ {(12<<2)|2,{32,65,0}}, +/* 21022 */ {(12<<2)|2,{32,65,0}}, +/* 21023 */ {(12<<2)|2,{32,65,0}}, +/* 21024 */ {(12<<2)|2,{32,95,0}}, +/* 21025 */ {(12<<2)|2,{32,95,0}}, +/* 21026 */ {(12<<2)|2,{32,95,0}}, +/* 21027 */ {(12<<2)|2,{32,95,0}}, +/* 21028 */ {(12<<2)|2,{32,95,0}}, +/* 21029 */ {(12<<2)|2,{32,95,0}}, +/* 21030 */ {(12<<2)|2,{32,95,0}}, +/* 21031 */ {(12<<2)|2,{32,95,0}}, +/* 21032 */ {(12<<2)|2,{32,95,0}}, +/* 21033 */ {(12<<2)|2,{32,95,0}}, +/* 21034 */ {(12<<2)|2,{32,95,0}}, +/* 21035 */ {(12<<2)|2,{32,95,0}}, +/* 21036 */ {(12<<2)|2,{32,95,0}}, +/* 21037 */ {(12<<2)|2,{32,95,0}}, +/* 21038 */ {(12<<2)|2,{32,95,0}}, +/* 21039 */ {(12<<2)|2,{32,95,0}}, +/* 21040 */ {(12<<2)|2,{32,98,0}}, +/* 21041 */ {(12<<2)|2,{32,98,0}}, +/* 21042 */ {(12<<2)|2,{32,98,0}}, +/* 21043 */ {(12<<2)|2,{32,98,0}}, +/* 21044 */ {(12<<2)|2,{32,98,0}}, +/* 21045 */ {(12<<2)|2,{32,98,0}}, +/* 21046 */ {(12<<2)|2,{32,98,0}}, +/* 21047 */ {(12<<2)|2,{32,98,0}}, +/* 21048 */ {(12<<2)|2,{32,98,0}}, +/* 21049 */ {(12<<2)|2,{32,98,0}}, +/* 21050 */ {(12<<2)|2,{32,98,0}}, +/* 21051 */ {(12<<2)|2,{32,98,0}}, +/* 21052 */ {(12<<2)|2,{32,98,0}}, +/* 21053 */ {(12<<2)|2,{32,98,0}}, +/* 21054 */ {(12<<2)|2,{32,98,0}}, +/* 21055 */ {(12<<2)|2,{32,98,0}}, +/* 21056 */ {(12<<2)|2,{32,100,0}}, +/* 21057 */ {(12<<2)|2,{32,100,0}}, +/* 21058 */ {(12<<2)|2,{32,100,0}}, +/* 21059 */ {(12<<2)|2,{32,100,0}}, +/* 21060 */ {(12<<2)|2,{32,100,0}}, +/* 21061 */ {(12<<2)|2,{32,100,0}}, +/* 21062 */ {(12<<2)|2,{32,100,0}}, +/* 21063 */ {(12<<2)|2,{32,100,0}}, +/* 21064 */ {(12<<2)|2,{32,100,0}}, +/* 21065 */ {(12<<2)|2,{32,100,0}}, +/* 21066 */ {(12<<2)|2,{32,100,0}}, +/* 21067 */ {(12<<2)|2,{32,100,0}}, +/* 21068 */ {(12<<2)|2,{32,100,0}}, +/* 21069 */ {(12<<2)|2,{32,100,0}}, +/* 21070 */ {(12<<2)|2,{32,100,0}}, +/* 21071 */ {(12<<2)|2,{32,100,0}}, +/* 21072 */ {(12<<2)|2,{32,102,0}}, +/* 21073 */ {(12<<2)|2,{32,102,0}}, +/* 21074 */ {(12<<2)|2,{32,102,0}}, +/* 21075 */ {(12<<2)|2,{32,102,0}}, +/* 21076 */ {(12<<2)|2,{32,102,0}}, +/* 21077 */ {(12<<2)|2,{32,102,0}}, +/* 21078 */ {(12<<2)|2,{32,102,0}}, +/* 21079 */ {(12<<2)|2,{32,102,0}}, +/* 21080 */ {(12<<2)|2,{32,102,0}}, +/* 21081 */ {(12<<2)|2,{32,102,0}}, +/* 21082 */ {(12<<2)|2,{32,102,0}}, +/* 21083 */ {(12<<2)|2,{32,102,0}}, +/* 21084 */ {(12<<2)|2,{32,102,0}}, +/* 21085 */ {(12<<2)|2,{32,102,0}}, +/* 21086 */ {(12<<2)|2,{32,102,0}}, +/* 21087 */ {(12<<2)|2,{32,102,0}}, +/* 21088 */ {(12<<2)|2,{32,103,0}}, +/* 21089 */ {(12<<2)|2,{32,103,0}}, +/* 21090 */ {(12<<2)|2,{32,103,0}}, +/* 21091 */ {(12<<2)|2,{32,103,0}}, +/* 21092 */ {(12<<2)|2,{32,103,0}}, +/* 21093 */ {(12<<2)|2,{32,103,0}}, +/* 21094 */ {(12<<2)|2,{32,103,0}}, +/* 21095 */ {(12<<2)|2,{32,103,0}}, +/* 21096 */ {(12<<2)|2,{32,103,0}}, +/* 21097 */ {(12<<2)|2,{32,103,0}}, +/* 21098 */ {(12<<2)|2,{32,103,0}}, +/* 21099 */ {(12<<2)|2,{32,103,0}}, +/* 21100 */ {(12<<2)|2,{32,103,0}}, +/* 21101 */ {(12<<2)|2,{32,103,0}}, +/* 21102 */ {(12<<2)|2,{32,103,0}}, +/* 21103 */ {(12<<2)|2,{32,103,0}}, +/* 21104 */ {(12<<2)|2,{32,104,0}}, +/* 21105 */ {(12<<2)|2,{32,104,0}}, +/* 21106 */ {(12<<2)|2,{32,104,0}}, +/* 21107 */ {(12<<2)|2,{32,104,0}}, +/* 21108 */ {(12<<2)|2,{32,104,0}}, +/* 21109 */ {(12<<2)|2,{32,104,0}}, +/* 21110 */ {(12<<2)|2,{32,104,0}}, +/* 21111 */ {(12<<2)|2,{32,104,0}}, +/* 21112 */ {(12<<2)|2,{32,104,0}}, +/* 21113 */ {(12<<2)|2,{32,104,0}}, +/* 21114 */ {(12<<2)|2,{32,104,0}}, +/* 21115 */ {(12<<2)|2,{32,104,0}}, +/* 21116 */ {(12<<2)|2,{32,104,0}}, +/* 21117 */ {(12<<2)|2,{32,104,0}}, +/* 21118 */ {(12<<2)|2,{32,104,0}}, +/* 21119 */ {(12<<2)|2,{32,104,0}}, +/* 21120 */ {(12<<2)|2,{32,108,0}}, +/* 21121 */ {(12<<2)|2,{32,108,0}}, +/* 21122 */ {(12<<2)|2,{32,108,0}}, +/* 21123 */ {(12<<2)|2,{32,108,0}}, +/* 21124 */ {(12<<2)|2,{32,108,0}}, +/* 21125 */ {(12<<2)|2,{32,108,0}}, +/* 21126 */ {(12<<2)|2,{32,108,0}}, +/* 21127 */ {(12<<2)|2,{32,108,0}}, +/* 21128 */ {(12<<2)|2,{32,108,0}}, +/* 21129 */ {(12<<2)|2,{32,108,0}}, +/* 21130 */ {(12<<2)|2,{32,108,0}}, +/* 21131 */ {(12<<2)|2,{32,108,0}}, +/* 21132 */ {(12<<2)|2,{32,108,0}}, +/* 21133 */ {(12<<2)|2,{32,108,0}}, +/* 21134 */ {(12<<2)|2,{32,108,0}}, +/* 21135 */ {(12<<2)|2,{32,108,0}}, +/* 21136 */ {(12<<2)|2,{32,109,0}}, +/* 21137 */ {(12<<2)|2,{32,109,0}}, +/* 21138 */ {(12<<2)|2,{32,109,0}}, +/* 21139 */ {(12<<2)|2,{32,109,0}}, +/* 21140 */ {(12<<2)|2,{32,109,0}}, +/* 21141 */ {(12<<2)|2,{32,109,0}}, +/* 21142 */ {(12<<2)|2,{32,109,0}}, +/* 21143 */ {(12<<2)|2,{32,109,0}}, +/* 21144 */ {(12<<2)|2,{32,109,0}}, +/* 21145 */ {(12<<2)|2,{32,109,0}}, +/* 21146 */ {(12<<2)|2,{32,109,0}}, +/* 21147 */ {(12<<2)|2,{32,109,0}}, +/* 21148 */ {(12<<2)|2,{32,109,0}}, +/* 21149 */ {(12<<2)|2,{32,109,0}}, +/* 21150 */ {(12<<2)|2,{32,109,0}}, +/* 21151 */ {(12<<2)|2,{32,109,0}}, +/* 21152 */ {(12<<2)|2,{32,110,0}}, +/* 21153 */ {(12<<2)|2,{32,110,0}}, +/* 21154 */ {(12<<2)|2,{32,110,0}}, +/* 21155 */ {(12<<2)|2,{32,110,0}}, +/* 21156 */ {(12<<2)|2,{32,110,0}}, +/* 21157 */ {(12<<2)|2,{32,110,0}}, +/* 21158 */ {(12<<2)|2,{32,110,0}}, +/* 21159 */ {(12<<2)|2,{32,110,0}}, +/* 21160 */ {(12<<2)|2,{32,110,0}}, +/* 21161 */ {(12<<2)|2,{32,110,0}}, +/* 21162 */ {(12<<2)|2,{32,110,0}}, +/* 21163 */ {(12<<2)|2,{32,110,0}}, +/* 21164 */ {(12<<2)|2,{32,110,0}}, +/* 21165 */ {(12<<2)|2,{32,110,0}}, +/* 21166 */ {(12<<2)|2,{32,110,0}}, +/* 21167 */ {(12<<2)|2,{32,110,0}}, +/* 21168 */ {(12<<2)|2,{32,112,0}}, +/* 21169 */ {(12<<2)|2,{32,112,0}}, +/* 21170 */ {(12<<2)|2,{32,112,0}}, +/* 21171 */ {(12<<2)|2,{32,112,0}}, +/* 21172 */ {(12<<2)|2,{32,112,0}}, +/* 21173 */ {(12<<2)|2,{32,112,0}}, +/* 21174 */ {(12<<2)|2,{32,112,0}}, +/* 21175 */ {(12<<2)|2,{32,112,0}}, +/* 21176 */ {(12<<2)|2,{32,112,0}}, +/* 21177 */ {(12<<2)|2,{32,112,0}}, +/* 21178 */ {(12<<2)|2,{32,112,0}}, +/* 21179 */ {(12<<2)|2,{32,112,0}}, +/* 21180 */ {(12<<2)|2,{32,112,0}}, +/* 21181 */ {(12<<2)|2,{32,112,0}}, +/* 21182 */ {(12<<2)|2,{32,112,0}}, +/* 21183 */ {(12<<2)|2,{32,112,0}}, +/* 21184 */ {(12<<2)|2,{32,114,0}}, +/* 21185 */ {(12<<2)|2,{32,114,0}}, +/* 21186 */ {(12<<2)|2,{32,114,0}}, +/* 21187 */ {(12<<2)|2,{32,114,0}}, +/* 21188 */ {(12<<2)|2,{32,114,0}}, +/* 21189 */ {(12<<2)|2,{32,114,0}}, +/* 21190 */ {(12<<2)|2,{32,114,0}}, +/* 21191 */ {(12<<2)|2,{32,114,0}}, +/* 21192 */ {(12<<2)|2,{32,114,0}}, +/* 21193 */ {(12<<2)|2,{32,114,0}}, +/* 21194 */ {(12<<2)|2,{32,114,0}}, +/* 21195 */ {(12<<2)|2,{32,114,0}}, +/* 21196 */ {(12<<2)|2,{32,114,0}}, +/* 21197 */ {(12<<2)|2,{32,114,0}}, +/* 21198 */ {(12<<2)|2,{32,114,0}}, +/* 21199 */ {(12<<2)|2,{32,114,0}}, +/* 21200 */ {(12<<2)|2,{32,117,0}}, +/* 21201 */ {(12<<2)|2,{32,117,0}}, +/* 21202 */ {(12<<2)|2,{32,117,0}}, +/* 21203 */ {(12<<2)|2,{32,117,0}}, +/* 21204 */ {(12<<2)|2,{32,117,0}}, +/* 21205 */ {(12<<2)|2,{32,117,0}}, +/* 21206 */ {(12<<2)|2,{32,117,0}}, +/* 21207 */ {(12<<2)|2,{32,117,0}}, +/* 21208 */ {(12<<2)|2,{32,117,0}}, +/* 21209 */ {(12<<2)|2,{32,117,0}}, +/* 21210 */ {(12<<2)|2,{32,117,0}}, +/* 21211 */ {(12<<2)|2,{32,117,0}}, +/* 21212 */ {(12<<2)|2,{32,117,0}}, +/* 21213 */ {(12<<2)|2,{32,117,0}}, +/* 21214 */ {(12<<2)|2,{32,117,0}}, +/* 21215 */ {(12<<2)|2,{32,117,0}}, +/* 21216 */ {(13<<2)|2,{32,58,0}}, +/* 21217 */ {(13<<2)|2,{32,58,0}}, +/* 21218 */ {(13<<2)|2,{32,58,0}}, +/* 21219 */ {(13<<2)|2,{32,58,0}}, +/* 21220 */ {(13<<2)|2,{32,58,0}}, +/* 21221 */ {(13<<2)|2,{32,58,0}}, +/* 21222 */ {(13<<2)|2,{32,58,0}}, +/* 21223 */ {(13<<2)|2,{32,58,0}}, +/* 21224 */ {(13<<2)|2,{32,66,0}}, +/* 21225 */ {(13<<2)|2,{32,66,0}}, +/* 21226 */ {(13<<2)|2,{32,66,0}}, +/* 21227 */ {(13<<2)|2,{32,66,0}}, +/* 21228 */ {(13<<2)|2,{32,66,0}}, +/* 21229 */ {(13<<2)|2,{32,66,0}}, +/* 21230 */ {(13<<2)|2,{32,66,0}}, +/* 21231 */ {(13<<2)|2,{32,66,0}}, +/* 21232 */ {(13<<2)|2,{32,67,0}}, +/* 21233 */ {(13<<2)|2,{32,67,0}}, +/* 21234 */ {(13<<2)|2,{32,67,0}}, +/* 21235 */ {(13<<2)|2,{32,67,0}}, +/* 21236 */ {(13<<2)|2,{32,67,0}}, +/* 21237 */ {(13<<2)|2,{32,67,0}}, +/* 21238 */ {(13<<2)|2,{32,67,0}}, +/* 21239 */ {(13<<2)|2,{32,67,0}}, +/* 21240 */ {(13<<2)|2,{32,68,0}}, +/* 21241 */ {(13<<2)|2,{32,68,0}}, +/* 21242 */ {(13<<2)|2,{32,68,0}}, +/* 21243 */ {(13<<2)|2,{32,68,0}}, +/* 21244 */ {(13<<2)|2,{32,68,0}}, +/* 21245 */ {(13<<2)|2,{32,68,0}}, +/* 21246 */ {(13<<2)|2,{32,68,0}}, +/* 21247 */ {(13<<2)|2,{32,68,0}}, +/* 21248 */ {(13<<2)|2,{32,69,0}}, +/* 21249 */ {(13<<2)|2,{32,69,0}}, +/* 21250 */ {(13<<2)|2,{32,69,0}}, +/* 21251 */ {(13<<2)|2,{32,69,0}}, +/* 21252 */ {(13<<2)|2,{32,69,0}}, +/* 21253 */ {(13<<2)|2,{32,69,0}}, +/* 21254 */ {(13<<2)|2,{32,69,0}}, +/* 21255 */ {(13<<2)|2,{32,69,0}}, +/* 21256 */ {(13<<2)|2,{32,70,0}}, +/* 21257 */ {(13<<2)|2,{32,70,0}}, +/* 21258 */ {(13<<2)|2,{32,70,0}}, +/* 21259 */ {(13<<2)|2,{32,70,0}}, +/* 21260 */ {(13<<2)|2,{32,70,0}}, +/* 21261 */ {(13<<2)|2,{32,70,0}}, +/* 21262 */ {(13<<2)|2,{32,70,0}}, +/* 21263 */ {(13<<2)|2,{32,70,0}}, +/* 21264 */ {(13<<2)|2,{32,71,0}}, +/* 21265 */ {(13<<2)|2,{32,71,0}}, +/* 21266 */ {(13<<2)|2,{32,71,0}}, +/* 21267 */ {(13<<2)|2,{32,71,0}}, +/* 21268 */ {(13<<2)|2,{32,71,0}}, +/* 21269 */ {(13<<2)|2,{32,71,0}}, +/* 21270 */ {(13<<2)|2,{32,71,0}}, +/* 21271 */ {(13<<2)|2,{32,71,0}}, +/* 21272 */ {(13<<2)|2,{32,72,0}}, +/* 21273 */ {(13<<2)|2,{32,72,0}}, +/* 21274 */ {(13<<2)|2,{32,72,0}}, +/* 21275 */ {(13<<2)|2,{32,72,0}}, +/* 21276 */ {(13<<2)|2,{32,72,0}}, +/* 21277 */ {(13<<2)|2,{32,72,0}}, +/* 21278 */ {(13<<2)|2,{32,72,0}}, +/* 21279 */ {(13<<2)|2,{32,72,0}}, +/* 21280 */ {(13<<2)|2,{32,73,0}}, +/* 21281 */ {(13<<2)|2,{32,73,0}}, +/* 21282 */ {(13<<2)|2,{32,73,0}}, +/* 21283 */ {(13<<2)|2,{32,73,0}}, +/* 21284 */ {(13<<2)|2,{32,73,0}}, +/* 21285 */ {(13<<2)|2,{32,73,0}}, +/* 21286 */ {(13<<2)|2,{32,73,0}}, +/* 21287 */ {(13<<2)|2,{32,73,0}}, +/* 21288 */ {(13<<2)|2,{32,74,0}}, +/* 21289 */ {(13<<2)|2,{32,74,0}}, +/* 21290 */ {(13<<2)|2,{32,74,0}}, +/* 21291 */ {(13<<2)|2,{32,74,0}}, +/* 21292 */ {(13<<2)|2,{32,74,0}}, +/* 21293 */ {(13<<2)|2,{32,74,0}}, +/* 21294 */ {(13<<2)|2,{32,74,0}}, +/* 21295 */ {(13<<2)|2,{32,74,0}}, +/* 21296 */ {(13<<2)|2,{32,75,0}}, +/* 21297 */ {(13<<2)|2,{32,75,0}}, +/* 21298 */ {(13<<2)|2,{32,75,0}}, +/* 21299 */ {(13<<2)|2,{32,75,0}}, +/* 21300 */ {(13<<2)|2,{32,75,0}}, +/* 21301 */ {(13<<2)|2,{32,75,0}}, +/* 21302 */ {(13<<2)|2,{32,75,0}}, +/* 21303 */ {(13<<2)|2,{32,75,0}}, +/* 21304 */ {(13<<2)|2,{32,76,0}}, +/* 21305 */ {(13<<2)|2,{32,76,0}}, +/* 21306 */ {(13<<2)|2,{32,76,0}}, +/* 21307 */ {(13<<2)|2,{32,76,0}}, +/* 21308 */ {(13<<2)|2,{32,76,0}}, +/* 21309 */ {(13<<2)|2,{32,76,0}}, +/* 21310 */ {(13<<2)|2,{32,76,0}}, +/* 21311 */ {(13<<2)|2,{32,76,0}}, +/* 21312 */ {(13<<2)|2,{32,77,0}}, +/* 21313 */ {(13<<2)|2,{32,77,0}}, +/* 21314 */ {(13<<2)|2,{32,77,0}}, +/* 21315 */ {(13<<2)|2,{32,77,0}}, +/* 21316 */ {(13<<2)|2,{32,77,0}}, +/* 21317 */ {(13<<2)|2,{32,77,0}}, +/* 21318 */ {(13<<2)|2,{32,77,0}}, +/* 21319 */ {(13<<2)|2,{32,77,0}}, +/* 21320 */ {(13<<2)|2,{32,78,0}}, +/* 21321 */ {(13<<2)|2,{32,78,0}}, +/* 21322 */ {(13<<2)|2,{32,78,0}}, +/* 21323 */ {(13<<2)|2,{32,78,0}}, +/* 21324 */ {(13<<2)|2,{32,78,0}}, +/* 21325 */ {(13<<2)|2,{32,78,0}}, +/* 21326 */ {(13<<2)|2,{32,78,0}}, +/* 21327 */ {(13<<2)|2,{32,78,0}}, +/* 21328 */ {(13<<2)|2,{32,79,0}}, +/* 21329 */ {(13<<2)|2,{32,79,0}}, +/* 21330 */ {(13<<2)|2,{32,79,0}}, +/* 21331 */ {(13<<2)|2,{32,79,0}}, +/* 21332 */ {(13<<2)|2,{32,79,0}}, +/* 21333 */ {(13<<2)|2,{32,79,0}}, +/* 21334 */ {(13<<2)|2,{32,79,0}}, +/* 21335 */ {(13<<2)|2,{32,79,0}}, +/* 21336 */ {(13<<2)|2,{32,80,0}}, +/* 21337 */ {(13<<2)|2,{32,80,0}}, +/* 21338 */ {(13<<2)|2,{32,80,0}}, +/* 21339 */ {(13<<2)|2,{32,80,0}}, +/* 21340 */ {(13<<2)|2,{32,80,0}}, +/* 21341 */ {(13<<2)|2,{32,80,0}}, +/* 21342 */ {(13<<2)|2,{32,80,0}}, +/* 21343 */ {(13<<2)|2,{32,80,0}}, +/* 21344 */ {(13<<2)|2,{32,81,0}}, +/* 21345 */ {(13<<2)|2,{32,81,0}}, +/* 21346 */ {(13<<2)|2,{32,81,0}}, +/* 21347 */ {(13<<2)|2,{32,81,0}}, +/* 21348 */ {(13<<2)|2,{32,81,0}}, +/* 21349 */ {(13<<2)|2,{32,81,0}}, +/* 21350 */ {(13<<2)|2,{32,81,0}}, +/* 21351 */ {(13<<2)|2,{32,81,0}}, +/* 21352 */ {(13<<2)|2,{32,82,0}}, +/* 21353 */ {(13<<2)|2,{32,82,0}}, +/* 21354 */ {(13<<2)|2,{32,82,0}}, +/* 21355 */ {(13<<2)|2,{32,82,0}}, +/* 21356 */ {(13<<2)|2,{32,82,0}}, +/* 21357 */ {(13<<2)|2,{32,82,0}}, +/* 21358 */ {(13<<2)|2,{32,82,0}}, +/* 21359 */ {(13<<2)|2,{32,82,0}}, +/* 21360 */ {(13<<2)|2,{32,83,0}}, +/* 21361 */ {(13<<2)|2,{32,83,0}}, +/* 21362 */ {(13<<2)|2,{32,83,0}}, +/* 21363 */ {(13<<2)|2,{32,83,0}}, +/* 21364 */ {(13<<2)|2,{32,83,0}}, +/* 21365 */ {(13<<2)|2,{32,83,0}}, +/* 21366 */ {(13<<2)|2,{32,83,0}}, +/* 21367 */ {(13<<2)|2,{32,83,0}}, +/* 21368 */ {(13<<2)|2,{32,84,0}}, +/* 21369 */ {(13<<2)|2,{32,84,0}}, +/* 21370 */ {(13<<2)|2,{32,84,0}}, +/* 21371 */ {(13<<2)|2,{32,84,0}}, +/* 21372 */ {(13<<2)|2,{32,84,0}}, +/* 21373 */ {(13<<2)|2,{32,84,0}}, +/* 21374 */ {(13<<2)|2,{32,84,0}}, +/* 21375 */ {(13<<2)|2,{32,84,0}}, +/* 21376 */ {(13<<2)|2,{32,85,0}}, +/* 21377 */ {(13<<2)|2,{32,85,0}}, +/* 21378 */ {(13<<2)|2,{32,85,0}}, +/* 21379 */ {(13<<2)|2,{32,85,0}}, +/* 21380 */ {(13<<2)|2,{32,85,0}}, +/* 21381 */ {(13<<2)|2,{32,85,0}}, +/* 21382 */ {(13<<2)|2,{32,85,0}}, +/* 21383 */ {(13<<2)|2,{32,85,0}}, +/* 21384 */ {(13<<2)|2,{32,86,0}}, +/* 21385 */ {(13<<2)|2,{32,86,0}}, +/* 21386 */ {(13<<2)|2,{32,86,0}}, +/* 21387 */ {(13<<2)|2,{32,86,0}}, +/* 21388 */ {(13<<2)|2,{32,86,0}}, +/* 21389 */ {(13<<2)|2,{32,86,0}}, +/* 21390 */ {(13<<2)|2,{32,86,0}}, +/* 21391 */ {(13<<2)|2,{32,86,0}}, +/* 21392 */ {(13<<2)|2,{32,87,0}}, +/* 21393 */ {(13<<2)|2,{32,87,0}}, +/* 21394 */ {(13<<2)|2,{32,87,0}}, +/* 21395 */ {(13<<2)|2,{32,87,0}}, +/* 21396 */ {(13<<2)|2,{32,87,0}}, +/* 21397 */ {(13<<2)|2,{32,87,0}}, +/* 21398 */ {(13<<2)|2,{32,87,0}}, +/* 21399 */ {(13<<2)|2,{32,87,0}}, +/* 21400 */ {(13<<2)|2,{32,89,0}}, +/* 21401 */ {(13<<2)|2,{32,89,0}}, +/* 21402 */ {(13<<2)|2,{32,89,0}}, +/* 21403 */ {(13<<2)|2,{32,89,0}}, +/* 21404 */ {(13<<2)|2,{32,89,0}}, +/* 21405 */ {(13<<2)|2,{32,89,0}}, +/* 21406 */ {(13<<2)|2,{32,89,0}}, +/* 21407 */ {(13<<2)|2,{32,89,0}}, +/* 21408 */ {(13<<2)|2,{32,106,0}}, +/* 21409 */ {(13<<2)|2,{32,106,0}}, +/* 21410 */ {(13<<2)|2,{32,106,0}}, +/* 21411 */ {(13<<2)|2,{32,106,0}}, +/* 21412 */ {(13<<2)|2,{32,106,0}}, +/* 21413 */ {(13<<2)|2,{32,106,0}}, +/* 21414 */ {(13<<2)|2,{32,106,0}}, +/* 21415 */ {(13<<2)|2,{32,106,0}}, +/* 21416 */ {(13<<2)|2,{32,107,0}}, +/* 21417 */ {(13<<2)|2,{32,107,0}}, +/* 21418 */ {(13<<2)|2,{32,107,0}}, +/* 21419 */ {(13<<2)|2,{32,107,0}}, +/* 21420 */ {(13<<2)|2,{32,107,0}}, +/* 21421 */ {(13<<2)|2,{32,107,0}}, +/* 21422 */ {(13<<2)|2,{32,107,0}}, +/* 21423 */ {(13<<2)|2,{32,107,0}}, +/* 21424 */ {(13<<2)|2,{32,113,0}}, +/* 21425 */ {(13<<2)|2,{32,113,0}}, +/* 21426 */ {(13<<2)|2,{32,113,0}}, +/* 21427 */ {(13<<2)|2,{32,113,0}}, +/* 21428 */ {(13<<2)|2,{32,113,0}}, +/* 21429 */ {(13<<2)|2,{32,113,0}}, +/* 21430 */ {(13<<2)|2,{32,113,0}}, +/* 21431 */ {(13<<2)|2,{32,113,0}}, +/* 21432 */ {(13<<2)|2,{32,118,0}}, +/* 21433 */ {(13<<2)|2,{32,118,0}}, +/* 21434 */ {(13<<2)|2,{32,118,0}}, +/* 21435 */ {(13<<2)|2,{32,118,0}}, +/* 21436 */ {(13<<2)|2,{32,118,0}}, +/* 21437 */ {(13<<2)|2,{32,118,0}}, +/* 21438 */ {(13<<2)|2,{32,118,0}}, +/* 21439 */ {(13<<2)|2,{32,118,0}}, +/* 21440 */ {(13<<2)|2,{32,119,0}}, +/* 21441 */ {(13<<2)|2,{32,119,0}}, +/* 21442 */ {(13<<2)|2,{32,119,0}}, +/* 21443 */ {(13<<2)|2,{32,119,0}}, +/* 21444 */ {(13<<2)|2,{32,119,0}}, +/* 21445 */ {(13<<2)|2,{32,119,0}}, +/* 21446 */ {(13<<2)|2,{32,119,0}}, +/* 21447 */ {(13<<2)|2,{32,119,0}}, +/* 21448 */ {(13<<2)|2,{32,120,0}}, +/* 21449 */ {(13<<2)|2,{32,120,0}}, +/* 21450 */ {(13<<2)|2,{32,120,0}}, +/* 21451 */ {(13<<2)|2,{32,120,0}}, +/* 21452 */ {(13<<2)|2,{32,120,0}}, +/* 21453 */ {(13<<2)|2,{32,120,0}}, +/* 21454 */ {(13<<2)|2,{32,120,0}}, +/* 21455 */ {(13<<2)|2,{32,120,0}}, +/* 21456 */ {(13<<2)|2,{32,121,0}}, +/* 21457 */ {(13<<2)|2,{32,121,0}}, +/* 21458 */ {(13<<2)|2,{32,121,0}}, +/* 21459 */ {(13<<2)|2,{32,121,0}}, +/* 21460 */ {(13<<2)|2,{32,121,0}}, +/* 21461 */ {(13<<2)|2,{32,121,0}}, +/* 21462 */ {(13<<2)|2,{32,121,0}}, +/* 21463 */ {(13<<2)|2,{32,121,0}}, +/* 21464 */ {(13<<2)|2,{32,122,0}}, +/* 21465 */ {(13<<2)|2,{32,122,0}}, +/* 21466 */ {(13<<2)|2,{32,122,0}}, +/* 21467 */ {(13<<2)|2,{32,122,0}}, +/* 21468 */ {(13<<2)|2,{32,122,0}}, +/* 21469 */ {(13<<2)|2,{32,122,0}}, +/* 21470 */ {(13<<2)|2,{32,122,0}}, +/* 21471 */ {(13<<2)|2,{32,122,0}}, +/* 21472 */ {(14<<2)|2,{32,38,0}}, +/* 21473 */ {(14<<2)|2,{32,38,0}}, +/* 21474 */ {(14<<2)|2,{32,38,0}}, +/* 21475 */ {(14<<2)|2,{32,38,0}}, +/* 21476 */ {(14<<2)|2,{32,42,0}}, +/* 21477 */ {(14<<2)|2,{32,42,0}}, +/* 21478 */ {(14<<2)|2,{32,42,0}}, +/* 21479 */ {(14<<2)|2,{32,42,0}}, +/* 21480 */ {(14<<2)|2,{32,44,0}}, +/* 21481 */ {(14<<2)|2,{32,44,0}}, +/* 21482 */ {(14<<2)|2,{32,44,0}}, +/* 21483 */ {(14<<2)|2,{32,44,0}}, +/* 21484 */ {(14<<2)|2,{32,59,0}}, +/* 21485 */ {(14<<2)|2,{32,59,0}}, +/* 21486 */ {(14<<2)|2,{32,59,0}}, +/* 21487 */ {(14<<2)|2,{32,59,0}}, +/* 21488 */ {(14<<2)|2,{32,88,0}}, +/* 21489 */ {(14<<2)|2,{32,88,0}}, +/* 21490 */ {(14<<2)|2,{32,88,0}}, +/* 21491 */ {(14<<2)|2,{32,88,0}}, +/* 21492 */ {(14<<2)|2,{32,90,0}}, +/* 21493 */ {(14<<2)|2,{32,90,0}}, +/* 21494 */ {(14<<2)|2,{32,90,0}}, +/* 21495 */ {(14<<2)|2,{32,90,0}}, +/* 21496 */ {(16<<2)|2,{32,33,0}}, +/* 21497 */ {(16<<2)|2,{32,34,0}}, +/* 21498 */ {(16<<2)|2,{32,40,0}}, +/* 21499 */ {(16<<2)|2,{32,41,0}}, +/* 21500 */ {(16<<2)|2,{32,63,0}}, +/* 21501 */ {(6<<2)|1,{32,0,0}}, +/* 21502 */ {(6<<2)|1,{32,0,0}}, +/* 21503 */ {(6<<2)|1,{32,0,0}}, +/* 21504 */ {(16<<2)|3,{37,48,48}}, +/* 21505 */ {(16<<2)|3,{37,48,49}}, +/* 21506 */ {(16<<2)|3,{37,48,50}}, +/* 21507 */ {(16<<2)|3,{37,48,97}}, +/* 21508 */ {(16<<2)|3,{37,48,99}}, +/* 21509 */ {(16<<2)|3,{37,48,101}}, +/* 21510 */ {(16<<2)|3,{37,48,105}}, +/* 21511 */ {(16<<2)|3,{37,48,111}}, +/* 21512 */ {(16<<2)|3,{37,48,115}}, +/* 21513 */ {(16<<2)|3,{37,48,116}}, +/* 21514 */ {(11<<2)|2,{37,48,0}}, +/* 21515 */ {(11<<2)|2,{37,48,0}}, +/* 21516 */ {(11<<2)|2,{37,48,0}}, +/* 21517 */ {(11<<2)|2,{37,48,0}}, +/* 21518 */ {(11<<2)|2,{37,48,0}}, +/* 21519 */ {(11<<2)|2,{37,48,0}}, +/* 21520 */ {(11<<2)|2,{37,48,0}}, +/* 21521 */ {(11<<2)|2,{37,48,0}}, +/* 21522 */ {(11<<2)|2,{37,48,0}}, +/* 21523 */ {(11<<2)|2,{37,48,0}}, +/* 21524 */ {(11<<2)|2,{37,48,0}}, +/* 21525 */ {(11<<2)|2,{37,48,0}}, +/* 21526 */ {(11<<2)|2,{37,48,0}}, +/* 21527 */ {(11<<2)|2,{37,48,0}}, +/* 21528 */ {(11<<2)|2,{37,48,0}}, +/* 21529 */ {(11<<2)|2,{37,48,0}}, +/* 21530 */ {(11<<2)|2,{37,48,0}}, +/* 21531 */ {(11<<2)|2,{37,48,0}}, +/* 21532 */ {(11<<2)|2,{37,48,0}}, +/* 21533 */ {(11<<2)|2,{37,48,0}}, +/* 21534 */ {(11<<2)|2,{37,48,0}}, +/* 21535 */ {(11<<2)|2,{37,48,0}}, +/* 21536 */ {(16<<2)|3,{37,49,48}}, +/* 21537 */ {(16<<2)|3,{37,49,49}}, +/* 21538 */ {(16<<2)|3,{37,49,50}}, +/* 21539 */ {(16<<2)|3,{37,49,97}}, +/* 21540 */ {(16<<2)|3,{37,49,99}}, +/* 21541 */ {(16<<2)|3,{37,49,101}}, +/* 21542 */ {(16<<2)|3,{37,49,105}}, +/* 21543 */ {(16<<2)|3,{37,49,111}}, +/* 21544 */ {(16<<2)|3,{37,49,115}}, +/* 21545 */ {(16<<2)|3,{37,49,116}}, +/* 21546 */ {(11<<2)|2,{37,49,0}}, +/* 21547 */ {(11<<2)|2,{37,49,0}}, +/* 21548 */ {(11<<2)|2,{37,49,0}}, +/* 21549 */ {(11<<2)|2,{37,49,0}}, +/* 21550 */ {(11<<2)|2,{37,49,0}}, +/* 21551 */ {(11<<2)|2,{37,49,0}}, +/* 21552 */ {(11<<2)|2,{37,49,0}}, +/* 21553 */ {(11<<2)|2,{37,49,0}}, +/* 21554 */ {(11<<2)|2,{37,49,0}}, +/* 21555 */ {(11<<2)|2,{37,49,0}}, +/* 21556 */ {(11<<2)|2,{37,49,0}}, +/* 21557 */ {(11<<2)|2,{37,49,0}}, +/* 21558 */ {(11<<2)|2,{37,49,0}}, +/* 21559 */ {(11<<2)|2,{37,49,0}}, +/* 21560 */ {(11<<2)|2,{37,49,0}}, +/* 21561 */ {(11<<2)|2,{37,49,0}}, +/* 21562 */ {(11<<2)|2,{37,49,0}}, +/* 21563 */ {(11<<2)|2,{37,49,0}}, +/* 21564 */ {(11<<2)|2,{37,49,0}}, +/* 21565 */ {(11<<2)|2,{37,49,0}}, +/* 21566 */ {(11<<2)|2,{37,49,0}}, +/* 21567 */ {(11<<2)|2,{37,49,0}}, +/* 21568 */ {(16<<2)|3,{37,50,48}}, +/* 21569 */ {(16<<2)|3,{37,50,49}}, +/* 21570 */ {(16<<2)|3,{37,50,50}}, +/* 21571 */ {(16<<2)|3,{37,50,97}}, +/* 21572 */ {(16<<2)|3,{37,50,99}}, +/* 21573 */ {(16<<2)|3,{37,50,101}}, +/* 21574 */ {(16<<2)|3,{37,50,105}}, +/* 21575 */ {(16<<2)|3,{37,50,111}}, +/* 21576 */ {(16<<2)|3,{37,50,115}}, +/* 21577 */ {(16<<2)|3,{37,50,116}}, +/* 21578 */ {(11<<2)|2,{37,50,0}}, +/* 21579 */ {(11<<2)|2,{37,50,0}}, +/* 21580 */ {(11<<2)|2,{37,50,0}}, +/* 21581 */ {(11<<2)|2,{37,50,0}}, +/* 21582 */ {(11<<2)|2,{37,50,0}}, +/* 21583 */ {(11<<2)|2,{37,50,0}}, +/* 21584 */ {(11<<2)|2,{37,50,0}}, +/* 21585 */ {(11<<2)|2,{37,50,0}}, +/* 21586 */ {(11<<2)|2,{37,50,0}}, +/* 21587 */ {(11<<2)|2,{37,50,0}}, +/* 21588 */ {(11<<2)|2,{37,50,0}}, +/* 21589 */ {(11<<2)|2,{37,50,0}}, +/* 21590 */ {(11<<2)|2,{37,50,0}}, +/* 21591 */ {(11<<2)|2,{37,50,0}}, +/* 21592 */ {(11<<2)|2,{37,50,0}}, +/* 21593 */ {(11<<2)|2,{37,50,0}}, +/* 21594 */ {(11<<2)|2,{37,50,0}}, +/* 21595 */ {(11<<2)|2,{37,50,0}}, +/* 21596 */ {(11<<2)|2,{37,50,0}}, +/* 21597 */ {(11<<2)|2,{37,50,0}}, +/* 21598 */ {(11<<2)|2,{37,50,0}}, +/* 21599 */ {(11<<2)|2,{37,50,0}}, +/* 21600 */ {(16<<2)|3,{37,97,48}}, +/* 21601 */ {(16<<2)|3,{37,97,49}}, +/* 21602 */ {(16<<2)|3,{37,97,50}}, +/* 21603 */ {(16<<2)|3,{37,97,97}}, +/* 21604 */ {(16<<2)|3,{37,97,99}}, +/* 21605 */ {(16<<2)|3,{37,97,101}}, +/* 21606 */ {(16<<2)|3,{37,97,105}}, +/* 21607 */ {(16<<2)|3,{37,97,111}}, +/* 21608 */ {(16<<2)|3,{37,97,115}}, +/* 21609 */ {(16<<2)|3,{37,97,116}}, +/* 21610 */ {(11<<2)|2,{37,97,0}}, +/* 21611 */ {(11<<2)|2,{37,97,0}}, +/* 21612 */ {(11<<2)|2,{37,97,0}}, +/* 21613 */ {(11<<2)|2,{37,97,0}}, +/* 21614 */ {(11<<2)|2,{37,97,0}}, +/* 21615 */ {(11<<2)|2,{37,97,0}}, +/* 21616 */ {(11<<2)|2,{37,97,0}}, +/* 21617 */ {(11<<2)|2,{37,97,0}}, +/* 21618 */ {(11<<2)|2,{37,97,0}}, +/* 21619 */ {(11<<2)|2,{37,97,0}}, +/* 21620 */ {(11<<2)|2,{37,97,0}}, +/* 21621 */ {(11<<2)|2,{37,97,0}}, +/* 21622 */ {(11<<2)|2,{37,97,0}}, +/* 21623 */ {(11<<2)|2,{37,97,0}}, +/* 21624 */ {(11<<2)|2,{37,97,0}}, +/* 21625 */ {(11<<2)|2,{37,97,0}}, +/* 21626 */ {(11<<2)|2,{37,97,0}}, +/* 21627 */ {(11<<2)|2,{37,97,0}}, +/* 21628 */ {(11<<2)|2,{37,97,0}}, +/* 21629 */ {(11<<2)|2,{37,97,0}}, +/* 21630 */ {(11<<2)|2,{37,97,0}}, +/* 21631 */ {(11<<2)|2,{37,97,0}}, +/* 21632 */ {(16<<2)|3,{37,99,48}}, +/* 21633 */ {(16<<2)|3,{37,99,49}}, +/* 21634 */ {(16<<2)|3,{37,99,50}}, +/* 21635 */ {(16<<2)|3,{37,99,97}}, +/* 21636 */ {(16<<2)|3,{37,99,99}}, +/* 21637 */ {(16<<2)|3,{37,99,101}}, +/* 21638 */ {(16<<2)|3,{37,99,105}}, +/* 21639 */ {(16<<2)|3,{37,99,111}}, +/* 21640 */ {(16<<2)|3,{37,99,115}}, +/* 21641 */ {(16<<2)|3,{37,99,116}}, +/* 21642 */ {(11<<2)|2,{37,99,0}}, +/* 21643 */ {(11<<2)|2,{37,99,0}}, +/* 21644 */ {(11<<2)|2,{37,99,0}}, +/* 21645 */ {(11<<2)|2,{37,99,0}}, +/* 21646 */ {(11<<2)|2,{37,99,0}}, +/* 21647 */ {(11<<2)|2,{37,99,0}}, +/* 21648 */ {(11<<2)|2,{37,99,0}}, +/* 21649 */ {(11<<2)|2,{37,99,0}}, +/* 21650 */ {(11<<2)|2,{37,99,0}}, +/* 21651 */ {(11<<2)|2,{37,99,0}}, +/* 21652 */ {(11<<2)|2,{37,99,0}}, +/* 21653 */ {(11<<2)|2,{37,99,0}}, +/* 21654 */ {(11<<2)|2,{37,99,0}}, +/* 21655 */ {(11<<2)|2,{37,99,0}}, +/* 21656 */ {(11<<2)|2,{37,99,0}}, +/* 21657 */ {(11<<2)|2,{37,99,0}}, +/* 21658 */ {(11<<2)|2,{37,99,0}}, +/* 21659 */ {(11<<2)|2,{37,99,0}}, +/* 21660 */ {(11<<2)|2,{37,99,0}}, +/* 21661 */ {(11<<2)|2,{37,99,0}}, +/* 21662 */ {(11<<2)|2,{37,99,0}}, +/* 21663 */ {(11<<2)|2,{37,99,0}}, +/* 21664 */ {(16<<2)|3,{37,101,48}}, +/* 21665 */ {(16<<2)|3,{37,101,49}}, +/* 21666 */ {(16<<2)|3,{37,101,50}}, +/* 21667 */ {(16<<2)|3,{37,101,97}}, +/* 21668 */ {(16<<2)|3,{37,101,99}}, +/* 21669 */ {(16<<2)|3,{37,101,101}}, +/* 21670 */ {(16<<2)|3,{37,101,105}}, +/* 21671 */ {(16<<2)|3,{37,101,111}}, +/* 21672 */ {(16<<2)|3,{37,101,115}}, +/* 21673 */ {(16<<2)|3,{37,101,116}}, +/* 21674 */ {(11<<2)|2,{37,101,0}}, +/* 21675 */ {(11<<2)|2,{37,101,0}}, +/* 21676 */ {(11<<2)|2,{37,101,0}}, +/* 21677 */ {(11<<2)|2,{37,101,0}}, +/* 21678 */ {(11<<2)|2,{37,101,0}}, +/* 21679 */ {(11<<2)|2,{37,101,0}}, +/* 21680 */ {(11<<2)|2,{37,101,0}}, +/* 21681 */ {(11<<2)|2,{37,101,0}}, +/* 21682 */ {(11<<2)|2,{37,101,0}}, +/* 21683 */ {(11<<2)|2,{37,101,0}}, +/* 21684 */ {(11<<2)|2,{37,101,0}}, +/* 21685 */ {(11<<2)|2,{37,101,0}}, +/* 21686 */ {(11<<2)|2,{37,101,0}}, +/* 21687 */ {(11<<2)|2,{37,101,0}}, +/* 21688 */ {(11<<2)|2,{37,101,0}}, +/* 21689 */ {(11<<2)|2,{37,101,0}}, +/* 21690 */ {(11<<2)|2,{37,101,0}}, +/* 21691 */ {(11<<2)|2,{37,101,0}}, +/* 21692 */ {(11<<2)|2,{37,101,0}}, +/* 21693 */ {(11<<2)|2,{37,101,0}}, +/* 21694 */ {(11<<2)|2,{37,101,0}}, +/* 21695 */ {(11<<2)|2,{37,101,0}}, +/* 21696 */ {(16<<2)|3,{37,105,48}}, +/* 21697 */ {(16<<2)|3,{37,105,49}}, +/* 21698 */ {(16<<2)|3,{37,105,50}}, +/* 21699 */ {(16<<2)|3,{37,105,97}}, +/* 21700 */ {(16<<2)|3,{37,105,99}}, +/* 21701 */ {(16<<2)|3,{37,105,101}}, +/* 21702 */ {(16<<2)|3,{37,105,105}}, +/* 21703 */ {(16<<2)|3,{37,105,111}}, +/* 21704 */ {(16<<2)|3,{37,105,115}}, +/* 21705 */ {(16<<2)|3,{37,105,116}}, +/* 21706 */ {(11<<2)|2,{37,105,0}}, +/* 21707 */ {(11<<2)|2,{37,105,0}}, +/* 21708 */ {(11<<2)|2,{37,105,0}}, +/* 21709 */ {(11<<2)|2,{37,105,0}}, +/* 21710 */ {(11<<2)|2,{37,105,0}}, +/* 21711 */ {(11<<2)|2,{37,105,0}}, +/* 21712 */ {(11<<2)|2,{37,105,0}}, +/* 21713 */ {(11<<2)|2,{37,105,0}}, +/* 21714 */ {(11<<2)|2,{37,105,0}}, +/* 21715 */ {(11<<2)|2,{37,105,0}}, +/* 21716 */ {(11<<2)|2,{37,105,0}}, +/* 21717 */ {(11<<2)|2,{37,105,0}}, +/* 21718 */ {(11<<2)|2,{37,105,0}}, +/* 21719 */ {(11<<2)|2,{37,105,0}}, +/* 21720 */ {(11<<2)|2,{37,105,0}}, +/* 21721 */ {(11<<2)|2,{37,105,0}}, +/* 21722 */ {(11<<2)|2,{37,105,0}}, +/* 21723 */ {(11<<2)|2,{37,105,0}}, +/* 21724 */ {(11<<2)|2,{37,105,0}}, +/* 21725 */ {(11<<2)|2,{37,105,0}}, +/* 21726 */ {(11<<2)|2,{37,105,0}}, +/* 21727 */ {(11<<2)|2,{37,105,0}}, +/* 21728 */ {(16<<2)|3,{37,111,48}}, +/* 21729 */ {(16<<2)|3,{37,111,49}}, +/* 21730 */ {(16<<2)|3,{37,111,50}}, +/* 21731 */ {(16<<2)|3,{37,111,97}}, +/* 21732 */ {(16<<2)|3,{37,111,99}}, +/* 21733 */ {(16<<2)|3,{37,111,101}}, +/* 21734 */ {(16<<2)|3,{37,111,105}}, +/* 21735 */ {(16<<2)|3,{37,111,111}}, +/* 21736 */ {(16<<2)|3,{37,111,115}}, +/* 21737 */ {(16<<2)|3,{37,111,116}}, +/* 21738 */ {(11<<2)|2,{37,111,0}}, +/* 21739 */ {(11<<2)|2,{37,111,0}}, +/* 21740 */ {(11<<2)|2,{37,111,0}}, +/* 21741 */ {(11<<2)|2,{37,111,0}}, +/* 21742 */ {(11<<2)|2,{37,111,0}}, +/* 21743 */ {(11<<2)|2,{37,111,0}}, +/* 21744 */ {(11<<2)|2,{37,111,0}}, +/* 21745 */ {(11<<2)|2,{37,111,0}}, +/* 21746 */ {(11<<2)|2,{37,111,0}}, +/* 21747 */ {(11<<2)|2,{37,111,0}}, +/* 21748 */ {(11<<2)|2,{37,111,0}}, +/* 21749 */ {(11<<2)|2,{37,111,0}}, +/* 21750 */ {(11<<2)|2,{37,111,0}}, +/* 21751 */ {(11<<2)|2,{37,111,0}}, +/* 21752 */ {(11<<2)|2,{37,111,0}}, +/* 21753 */ {(11<<2)|2,{37,111,0}}, +/* 21754 */ {(11<<2)|2,{37,111,0}}, +/* 21755 */ {(11<<2)|2,{37,111,0}}, +/* 21756 */ {(11<<2)|2,{37,111,0}}, +/* 21757 */ {(11<<2)|2,{37,111,0}}, +/* 21758 */ {(11<<2)|2,{37,111,0}}, +/* 21759 */ {(11<<2)|2,{37,111,0}}, +/* 21760 */ {(16<<2)|3,{37,115,48}}, +/* 21761 */ {(16<<2)|3,{37,115,49}}, +/* 21762 */ {(16<<2)|3,{37,115,50}}, +/* 21763 */ {(16<<2)|3,{37,115,97}}, +/* 21764 */ {(16<<2)|3,{37,115,99}}, +/* 21765 */ {(16<<2)|3,{37,115,101}}, +/* 21766 */ {(16<<2)|3,{37,115,105}}, +/* 21767 */ {(16<<2)|3,{37,115,111}}, +/* 21768 */ {(16<<2)|3,{37,115,115}}, +/* 21769 */ {(16<<2)|3,{37,115,116}}, +/* 21770 */ {(11<<2)|2,{37,115,0}}, +/* 21771 */ {(11<<2)|2,{37,115,0}}, +/* 21772 */ {(11<<2)|2,{37,115,0}}, +/* 21773 */ {(11<<2)|2,{37,115,0}}, +/* 21774 */ {(11<<2)|2,{37,115,0}}, +/* 21775 */ {(11<<2)|2,{37,115,0}}, +/* 21776 */ {(11<<2)|2,{37,115,0}}, +/* 21777 */ {(11<<2)|2,{37,115,0}}, +/* 21778 */ {(11<<2)|2,{37,115,0}}, +/* 21779 */ {(11<<2)|2,{37,115,0}}, +/* 21780 */ {(11<<2)|2,{37,115,0}}, +/* 21781 */ {(11<<2)|2,{37,115,0}}, +/* 21782 */ {(11<<2)|2,{37,115,0}}, +/* 21783 */ {(11<<2)|2,{37,115,0}}, +/* 21784 */ {(11<<2)|2,{37,115,0}}, +/* 21785 */ {(11<<2)|2,{37,115,0}}, +/* 21786 */ {(11<<2)|2,{37,115,0}}, +/* 21787 */ {(11<<2)|2,{37,115,0}}, +/* 21788 */ {(11<<2)|2,{37,115,0}}, +/* 21789 */ {(11<<2)|2,{37,115,0}}, +/* 21790 */ {(11<<2)|2,{37,115,0}}, +/* 21791 */ {(11<<2)|2,{37,115,0}}, +/* 21792 */ {(16<<2)|3,{37,116,48}}, +/* 21793 */ {(16<<2)|3,{37,116,49}}, +/* 21794 */ {(16<<2)|3,{37,116,50}}, +/* 21795 */ {(16<<2)|3,{37,116,97}}, +/* 21796 */ {(16<<2)|3,{37,116,99}}, +/* 21797 */ {(16<<2)|3,{37,116,101}}, +/* 21798 */ {(16<<2)|3,{37,116,105}}, +/* 21799 */ {(16<<2)|3,{37,116,111}}, +/* 21800 */ {(16<<2)|3,{37,116,115}}, +/* 21801 */ {(16<<2)|3,{37,116,116}}, +/* 21802 */ {(11<<2)|2,{37,116,0}}, +/* 21803 */ {(11<<2)|2,{37,116,0}}, +/* 21804 */ {(11<<2)|2,{37,116,0}}, +/* 21805 */ {(11<<2)|2,{37,116,0}}, +/* 21806 */ {(11<<2)|2,{37,116,0}}, +/* 21807 */ {(11<<2)|2,{37,116,0}}, +/* 21808 */ {(11<<2)|2,{37,116,0}}, +/* 21809 */ {(11<<2)|2,{37,116,0}}, +/* 21810 */ {(11<<2)|2,{37,116,0}}, +/* 21811 */ {(11<<2)|2,{37,116,0}}, +/* 21812 */ {(11<<2)|2,{37,116,0}}, +/* 21813 */ {(11<<2)|2,{37,116,0}}, +/* 21814 */ {(11<<2)|2,{37,116,0}}, +/* 21815 */ {(11<<2)|2,{37,116,0}}, +/* 21816 */ {(11<<2)|2,{37,116,0}}, +/* 21817 */ {(11<<2)|2,{37,116,0}}, +/* 21818 */ {(11<<2)|2,{37,116,0}}, +/* 21819 */ {(11<<2)|2,{37,116,0}}, +/* 21820 */ {(11<<2)|2,{37,116,0}}, +/* 21821 */ {(11<<2)|2,{37,116,0}}, +/* 21822 */ {(11<<2)|2,{37,116,0}}, +/* 21823 */ {(11<<2)|2,{37,116,0}}, +/* 21824 */ {(12<<2)|2,{37,32,0}}, +/* 21825 */ {(12<<2)|2,{37,32,0}}, +/* 21826 */ {(12<<2)|2,{37,32,0}}, +/* 21827 */ {(12<<2)|2,{37,32,0}}, +/* 21828 */ {(12<<2)|2,{37,32,0}}, +/* 21829 */ {(12<<2)|2,{37,32,0}}, +/* 21830 */ {(12<<2)|2,{37,32,0}}, +/* 21831 */ {(12<<2)|2,{37,32,0}}, +/* 21832 */ {(12<<2)|2,{37,32,0}}, +/* 21833 */ {(12<<2)|2,{37,32,0}}, +/* 21834 */ {(12<<2)|2,{37,32,0}}, +/* 21835 */ {(12<<2)|2,{37,32,0}}, +/* 21836 */ {(12<<2)|2,{37,32,0}}, +/* 21837 */ {(12<<2)|2,{37,32,0}}, +/* 21838 */ {(12<<2)|2,{37,32,0}}, +/* 21839 */ {(12<<2)|2,{37,32,0}}, +/* 21840 */ {(12<<2)|2,{37,37,0}}, +/* 21841 */ {(12<<2)|2,{37,37,0}}, +/* 21842 */ {(12<<2)|2,{37,37,0}}, +/* 21843 */ {(12<<2)|2,{37,37,0}}, +/* 21844 */ {(12<<2)|2,{37,37,0}}, +/* 21845 */ {(12<<2)|2,{37,37,0}}, +/* 21846 */ {(12<<2)|2,{37,37,0}}, +/* 21847 */ {(12<<2)|2,{37,37,0}}, +/* 21848 */ {(12<<2)|2,{37,37,0}}, +/* 21849 */ {(12<<2)|2,{37,37,0}}, +/* 21850 */ {(12<<2)|2,{37,37,0}}, +/* 21851 */ {(12<<2)|2,{37,37,0}}, +/* 21852 */ {(12<<2)|2,{37,37,0}}, +/* 21853 */ {(12<<2)|2,{37,37,0}}, +/* 21854 */ {(12<<2)|2,{37,37,0}}, +/* 21855 */ {(12<<2)|2,{37,37,0}}, +/* 21856 */ {(12<<2)|2,{37,45,0}}, +/* 21857 */ {(12<<2)|2,{37,45,0}}, +/* 21858 */ {(12<<2)|2,{37,45,0}}, +/* 21859 */ {(12<<2)|2,{37,45,0}}, +/* 21860 */ {(12<<2)|2,{37,45,0}}, +/* 21861 */ {(12<<2)|2,{37,45,0}}, +/* 21862 */ {(12<<2)|2,{37,45,0}}, +/* 21863 */ {(12<<2)|2,{37,45,0}}, +/* 21864 */ {(12<<2)|2,{37,45,0}}, +/* 21865 */ {(12<<2)|2,{37,45,0}}, +/* 21866 */ {(12<<2)|2,{37,45,0}}, +/* 21867 */ {(12<<2)|2,{37,45,0}}, +/* 21868 */ {(12<<2)|2,{37,45,0}}, +/* 21869 */ {(12<<2)|2,{37,45,0}}, +/* 21870 */ {(12<<2)|2,{37,45,0}}, +/* 21871 */ {(12<<2)|2,{37,45,0}}, +/* 21872 */ {(12<<2)|2,{37,46,0}}, +/* 21873 */ {(12<<2)|2,{37,46,0}}, +/* 21874 */ {(12<<2)|2,{37,46,0}}, +/* 21875 */ {(12<<2)|2,{37,46,0}}, +/* 21876 */ {(12<<2)|2,{37,46,0}}, +/* 21877 */ {(12<<2)|2,{37,46,0}}, +/* 21878 */ {(12<<2)|2,{37,46,0}}, +/* 21879 */ {(12<<2)|2,{37,46,0}}, +/* 21880 */ {(12<<2)|2,{37,46,0}}, +/* 21881 */ {(12<<2)|2,{37,46,0}}, +/* 21882 */ {(12<<2)|2,{37,46,0}}, +/* 21883 */ {(12<<2)|2,{37,46,0}}, +/* 21884 */ {(12<<2)|2,{37,46,0}}, +/* 21885 */ {(12<<2)|2,{37,46,0}}, +/* 21886 */ {(12<<2)|2,{37,46,0}}, +/* 21887 */ {(12<<2)|2,{37,46,0}}, +/* 21888 */ {(12<<2)|2,{37,47,0}}, +/* 21889 */ {(12<<2)|2,{37,47,0}}, +/* 21890 */ {(12<<2)|2,{37,47,0}}, +/* 21891 */ {(12<<2)|2,{37,47,0}}, +/* 21892 */ {(12<<2)|2,{37,47,0}}, +/* 21893 */ {(12<<2)|2,{37,47,0}}, +/* 21894 */ {(12<<2)|2,{37,47,0}}, +/* 21895 */ {(12<<2)|2,{37,47,0}}, +/* 21896 */ {(12<<2)|2,{37,47,0}}, +/* 21897 */ {(12<<2)|2,{37,47,0}}, +/* 21898 */ {(12<<2)|2,{37,47,0}}, +/* 21899 */ {(12<<2)|2,{37,47,0}}, +/* 21900 */ {(12<<2)|2,{37,47,0}}, +/* 21901 */ {(12<<2)|2,{37,47,0}}, +/* 21902 */ {(12<<2)|2,{37,47,0}}, +/* 21903 */ {(12<<2)|2,{37,47,0}}, +/* 21904 */ {(12<<2)|2,{37,51,0}}, +/* 21905 */ {(12<<2)|2,{37,51,0}}, +/* 21906 */ {(12<<2)|2,{37,51,0}}, +/* 21907 */ {(12<<2)|2,{37,51,0}}, +/* 21908 */ {(12<<2)|2,{37,51,0}}, +/* 21909 */ {(12<<2)|2,{37,51,0}}, +/* 21910 */ {(12<<2)|2,{37,51,0}}, +/* 21911 */ {(12<<2)|2,{37,51,0}}, +/* 21912 */ {(12<<2)|2,{37,51,0}}, +/* 21913 */ {(12<<2)|2,{37,51,0}}, +/* 21914 */ {(12<<2)|2,{37,51,0}}, +/* 21915 */ {(12<<2)|2,{37,51,0}}, +/* 21916 */ {(12<<2)|2,{37,51,0}}, +/* 21917 */ {(12<<2)|2,{37,51,0}}, +/* 21918 */ {(12<<2)|2,{37,51,0}}, +/* 21919 */ {(12<<2)|2,{37,51,0}}, +/* 21920 */ {(12<<2)|2,{37,52,0}}, +/* 21921 */ {(12<<2)|2,{37,52,0}}, +/* 21922 */ {(12<<2)|2,{37,52,0}}, +/* 21923 */ {(12<<2)|2,{37,52,0}}, +/* 21924 */ {(12<<2)|2,{37,52,0}}, +/* 21925 */ {(12<<2)|2,{37,52,0}}, +/* 21926 */ {(12<<2)|2,{37,52,0}}, +/* 21927 */ {(12<<2)|2,{37,52,0}}, +/* 21928 */ {(12<<2)|2,{37,52,0}}, +/* 21929 */ {(12<<2)|2,{37,52,0}}, +/* 21930 */ {(12<<2)|2,{37,52,0}}, +/* 21931 */ {(12<<2)|2,{37,52,0}}, +/* 21932 */ {(12<<2)|2,{37,52,0}}, +/* 21933 */ {(12<<2)|2,{37,52,0}}, +/* 21934 */ {(12<<2)|2,{37,52,0}}, +/* 21935 */ {(12<<2)|2,{37,52,0}}, +/* 21936 */ {(12<<2)|2,{37,53,0}}, +/* 21937 */ {(12<<2)|2,{37,53,0}}, +/* 21938 */ {(12<<2)|2,{37,53,0}}, +/* 21939 */ {(12<<2)|2,{37,53,0}}, +/* 21940 */ {(12<<2)|2,{37,53,0}}, +/* 21941 */ {(12<<2)|2,{37,53,0}}, +/* 21942 */ {(12<<2)|2,{37,53,0}}, +/* 21943 */ {(12<<2)|2,{37,53,0}}, +/* 21944 */ {(12<<2)|2,{37,53,0}}, +/* 21945 */ {(12<<2)|2,{37,53,0}}, +/* 21946 */ {(12<<2)|2,{37,53,0}}, +/* 21947 */ {(12<<2)|2,{37,53,0}}, +/* 21948 */ {(12<<2)|2,{37,53,0}}, +/* 21949 */ {(12<<2)|2,{37,53,0}}, +/* 21950 */ {(12<<2)|2,{37,53,0}}, +/* 21951 */ {(12<<2)|2,{37,53,0}}, +/* 21952 */ {(12<<2)|2,{37,54,0}}, +/* 21953 */ {(12<<2)|2,{37,54,0}}, +/* 21954 */ {(12<<2)|2,{37,54,0}}, +/* 21955 */ {(12<<2)|2,{37,54,0}}, +/* 21956 */ {(12<<2)|2,{37,54,0}}, +/* 21957 */ {(12<<2)|2,{37,54,0}}, +/* 21958 */ {(12<<2)|2,{37,54,0}}, +/* 21959 */ {(12<<2)|2,{37,54,0}}, +/* 21960 */ {(12<<2)|2,{37,54,0}}, +/* 21961 */ {(12<<2)|2,{37,54,0}}, +/* 21962 */ {(12<<2)|2,{37,54,0}}, +/* 21963 */ {(12<<2)|2,{37,54,0}}, +/* 21964 */ {(12<<2)|2,{37,54,0}}, +/* 21965 */ {(12<<2)|2,{37,54,0}}, +/* 21966 */ {(12<<2)|2,{37,54,0}}, +/* 21967 */ {(12<<2)|2,{37,54,0}}, +/* 21968 */ {(12<<2)|2,{37,55,0}}, +/* 21969 */ {(12<<2)|2,{37,55,0}}, +/* 21970 */ {(12<<2)|2,{37,55,0}}, +/* 21971 */ {(12<<2)|2,{37,55,0}}, +/* 21972 */ {(12<<2)|2,{37,55,0}}, +/* 21973 */ {(12<<2)|2,{37,55,0}}, +/* 21974 */ {(12<<2)|2,{37,55,0}}, +/* 21975 */ {(12<<2)|2,{37,55,0}}, +/* 21976 */ {(12<<2)|2,{37,55,0}}, +/* 21977 */ {(12<<2)|2,{37,55,0}}, +/* 21978 */ {(12<<2)|2,{37,55,0}}, +/* 21979 */ {(12<<2)|2,{37,55,0}}, +/* 21980 */ {(12<<2)|2,{37,55,0}}, +/* 21981 */ {(12<<2)|2,{37,55,0}}, +/* 21982 */ {(12<<2)|2,{37,55,0}}, +/* 21983 */ {(12<<2)|2,{37,55,0}}, +/* 21984 */ {(12<<2)|2,{37,56,0}}, +/* 21985 */ {(12<<2)|2,{37,56,0}}, +/* 21986 */ {(12<<2)|2,{37,56,0}}, +/* 21987 */ {(12<<2)|2,{37,56,0}}, +/* 21988 */ {(12<<2)|2,{37,56,0}}, +/* 21989 */ {(12<<2)|2,{37,56,0}}, +/* 21990 */ {(12<<2)|2,{37,56,0}}, +/* 21991 */ {(12<<2)|2,{37,56,0}}, +/* 21992 */ {(12<<2)|2,{37,56,0}}, +/* 21993 */ {(12<<2)|2,{37,56,0}}, +/* 21994 */ {(12<<2)|2,{37,56,0}}, +/* 21995 */ {(12<<2)|2,{37,56,0}}, +/* 21996 */ {(12<<2)|2,{37,56,0}}, +/* 21997 */ {(12<<2)|2,{37,56,0}}, +/* 21998 */ {(12<<2)|2,{37,56,0}}, +/* 21999 */ {(12<<2)|2,{37,56,0}}, +/* 22000 */ {(12<<2)|2,{37,57,0}}, +/* 22001 */ {(12<<2)|2,{37,57,0}}, +/* 22002 */ {(12<<2)|2,{37,57,0}}, +/* 22003 */ {(12<<2)|2,{37,57,0}}, +/* 22004 */ {(12<<2)|2,{37,57,0}}, +/* 22005 */ {(12<<2)|2,{37,57,0}}, +/* 22006 */ {(12<<2)|2,{37,57,0}}, +/* 22007 */ {(12<<2)|2,{37,57,0}}, +/* 22008 */ {(12<<2)|2,{37,57,0}}, +/* 22009 */ {(12<<2)|2,{37,57,0}}, +/* 22010 */ {(12<<2)|2,{37,57,0}}, +/* 22011 */ {(12<<2)|2,{37,57,0}}, +/* 22012 */ {(12<<2)|2,{37,57,0}}, +/* 22013 */ {(12<<2)|2,{37,57,0}}, +/* 22014 */ {(12<<2)|2,{37,57,0}}, +/* 22015 */ {(12<<2)|2,{37,57,0}}, +/* 22016 */ {(12<<2)|2,{37,61,0}}, +/* 22017 */ {(12<<2)|2,{37,61,0}}, +/* 22018 */ {(12<<2)|2,{37,61,0}}, +/* 22019 */ {(12<<2)|2,{37,61,0}}, +/* 22020 */ {(12<<2)|2,{37,61,0}}, +/* 22021 */ {(12<<2)|2,{37,61,0}}, +/* 22022 */ {(12<<2)|2,{37,61,0}}, +/* 22023 */ {(12<<2)|2,{37,61,0}}, +/* 22024 */ {(12<<2)|2,{37,61,0}}, +/* 22025 */ {(12<<2)|2,{37,61,0}}, +/* 22026 */ {(12<<2)|2,{37,61,0}}, +/* 22027 */ {(12<<2)|2,{37,61,0}}, +/* 22028 */ {(12<<2)|2,{37,61,0}}, +/* 22029 */ {(12<<2)|2,{37,61,0}}, +/* 22030 */ {(12<<2)|2,{37,61,0}}, +/* 22031 */ {(12<<2)|2,{37,61,0}}, +/* 22032 */ {(12<<2)|2,{37,65,0}}, +/* 22033 */ {(12<<2)|2,{37,65,0}}, +/* 22034 */ {(12<<2)|2,{37,65,0}}, +/* 22035 */ {(12<<2)|2,{37,65,0}}, +/* 22036 */ {(12<<2)|2,{37,65,0}}, +/* 22037 */ {(12<<2)|2,{37,65,0}}, +/* 22038 */ {(12<<2)|2,{37,65,0}}, +/* 22039 */ {(12<<2)|2,{37,65,0}}, +/* 22040 */ {(12<<2)|2,{37,65,0}}, +/* 22041 */ {(12<<2)|2,{37,65,0}}, +/* 22042 */ {(12<<2)|2,{37,65,0}}, +/* 22043 */ {(12<<2)|2,{37,65,0}}, +/* 22044 */ {(12<<2)|2,{37,65,0}}, +/* 22045 */ {(12<<2)|2,{37,65,0}}, +/* 22046 */ {(12<<2)|2,{37,65,0}}, +/* 22047 */ {(12<<2)|2,{37,65,0}}, +/* 22048 */ {(12<<2)|2,{37,95,0}}, +/* 22049 */ {(12<<2)|2,{37,95,0}}, +/* 22050 */ {(12<<2)|2,{37,95,0}}, +/* 22051 */ {(12<<2)|2,{37,95,0}}, +/* 22052 */ {(12<<2)|2,{37,95,0}}, +/* 22053 */ {(12<<2)|2,{37,95,0}}, +/* 22054 */ {(12<<2)|2,{37,95,0}}, +/* 22055 */ {(12<<2)|2,{37,95,0}}, +/* 22056 */ {(12<<2)|2,{37,95,0}}, +/* 22057 */ {(12<<2)|2,{37,95,0}}, +/* 22058 */ {(12<<2)|2,{37,95,0}}, +/* 22059 */ {(12<<2)|2,{37,95,0}}, +/* 22060 */ {(12<<2)|2,{37,95,0}}, +/* 22061 */ {(12<<2)|2,{37,95,0}}, +/* 22062 */ {(12<<2)|2,{37,95,0}}, +/* 22063 */ {(12<<2)|2,{37,95,0}}, +/* 22064 */ {(12<<2)|2,{37,98,0}}, +/* 22065 */ {(12<<2)|2,{37,98,0}}, +/* 22066 */ {(12<<2)|2,{37,98,0}}, +/* 22067 */ {(12<<2)|2,{37,98,0}}, +/* 22068 */ {(12<<2)|2,{37,98,0}}, +/* 22069 */ {(12<<2)|2,{37,98,0}}, +/* 22070 */ {(12<<2)|2,{37,98,0}}, +/* 22071 */ {(12<<2)|2,{37,98,0}}, +/* 22072 */ {(12<<2)|2,{37,98,0}}, +/* 22073 */ {(12<<2)|2,{37,98,0}}, +/* 22074 */ {(12<<2)|2,{37,98,0}}, +/* 22075 */ {(12<<2)|2,{37,98,0}}, +/* 22076 */ {(12<<2)|2,{37,98,0}}, +/* 22077 */ {(12<<2)|2,{37,98,0}}, +/* 22078 */ {(12<<2)|2,{37,98,0}}, +/* 22079 */ {(12<<2)|2,{37,98,0}}, +/* 22080 */ {(12<<2)|2,{37,100,0}}, +/* 22081 */ {(12<<2)|2,{37,100,0}}, +/* 22082 */ {(12<<2)|2,{37,100,0}}, +/* 22083 */ {(12<<2)|2,{37,100,0}}, +/* 22084 */ {(12<<2)|2,{37,100,0}}, +/* 22085 */ {(12<<2)|2,{37,100,0}}, +/* 22086 */ {(12<<2)|2,{37,100,0}}, +/* 22087 */ {(12<<2)|2,{37,100,0}}, +/* 22088 */ {(12<<2)|2,{37,100,0}}, +/* 22089 */ {(12<<2)|2,{37,100,0}}, +/* 22090 */ {(12<<2)|2,{37,100,0}}, +/* 22091 */ {(12<<2)|2,{37,100,0}}, +/* 22092 */ {(12<<2)|2,{37,100,0}}, +/* 22093 */ {(12<<2)|2,{37,100,0}}, +/* 22094 */ {(12<<2)|2,{37,100,0}}, +/* 22095 */ {(12<<2)|2,{37,100,0}}, +/* 22096 */ {(12<<2)|2,{37,102,0}}, +/* 22097 */ {(12<<2)|2,{37,102,0}}, +/* 22098 */ {(12<<2)|2,{37,102,0}}, +/* 22099 */ {(12<<2)|2,{37,102,0}}, +/* 22100 */ {(12<<2)|2,{37,102,0}}, +/* 22101 */ {(12<<2)|2,{37,102,0}}, +/* 22102 */ {(12<<2)|2,{37,102,0}}, +/* 22103 */ {(12<<2)|2,{37,102,0}}, +/* 22104 */ {(12<<2)|2,{37,102,0}}, +/* 22105 */ {(12<<2)|2,{37,102,0}}, +/* 22106 */ {(12<<2)|2,{37,102,0}}, +/* 22107 */ {(12<<2)|2,{37,102,0}}, +/* 22108 */ {(12<<2)|2,{37,102,0}}, +/* 22109 */ {(12<<2)|2,{37,102,0}}, +/* 22110 */ {(12<<2)|2,{37,102,0}}, +/* 22111 */ {(12<<2)|2,{37,102,0}}, +/* 22112 */ {(12<<2)|2,{37,103,0}}, +/* 22113 */ {(12<<2)|2,{37,103,0}}, +/* 22114 */ {(12<<2)|2,{37,103,0}}, +/* 22115 */ {(12<<2)|2,{37,103,0}}, +/* 22116 */ {(12<<2)|2,{37,103,0}}, +/* 22117 */ {(12<<2)|2,{37,103,0}}, +/* 22118 */ {(12<<2)|2,{37,103,0}}, +/* 22119 */ {(12<<2)|2,{37,103,0}}, +/* 22120 */ {(12<<2)|2,{37,103,0}}, +/* 22121 */ {(12<<2)|2,{37,103,0}}, +/* 22122 */ {(12<<2)|2,{37,103,0}}, +/* 22123 */ {(12<<2)|2,{37,103,0}}, +/* 22124 */ {(12<<2)|2,{37,103,0}}, +/* 22125 */ {(12<<2)|2,{37,103,0}}, +/* 22126 */ {(12<<2)|2,{37,103,0}}, +/* 22127 */ {(12<<2)|2,{37,103,0}}, +/* 22128 */ {(12<<2)|2,{37,104,0}}, +/* 22129 */ {(12<<2)|2,{37,104,0}}, +/* 22130 */ {(12<<2)|2,{37,104,0}}, +/* 22131 */ {(12<<2)|2,{37,104,0}}, +/* 22132 */ {(12<<2)|2,{37,104,0}}, +/* 22133 */ {(12<<2)|2,{37,104,0}}, +/* 22134 */ {(12<<2)|2,{37,104,0}}, +/* 22135 */ {(12<<2)|2,{37,104,0}}, +/* 22136 */ {(12<<2)|2,{37,104,0}}, +/* 22137 */ {(12<<2)|2,{37,104,0}}, +/* 22138 */ {(12<<2)|2,{37,104,0}}, +/* 22139 */ {(12<<2)|2,{37,104,0}}, +/* 22140 */ {(12<<2)|2,{37,104,0}}, +/* 22141 */ {(12<<2)|2,{37,104,0}}, +/* 22142 */ {(12<<2)|2,{37,104,0}}, +/* 22143 */ {(12<<2)|2,{37,104,0}}, +/* 22144 */ {(12<<2)|2,{37,108,0}}, +/* 22145 */ {(12<<2)|2,{37,108,0}}, +/* 22146 */ {(12<<2)|2,{37,108,0}}, +/* 22147 */ {(12<<2)|2,{37,108,0}}, +/* 22148 */ {(12<<2)|2,{37,108,0}}, +/* 22149 */ {(12<<2)|2,{37,108,0}}, +/* 22150 */ {(12<<2)|2,{37,108,0}}, +/* 22151 */ {(12<<2)|2,{37,108,0}}, +/* 22152 */ {(12<<2)|2,{37,108,0}}, +/* 22153 */ {(12<<2)|2,{37,108,0}}, +/* 22154 */ {(12<<2)|2,{37,108,0}}, +/* 22155 */ {(12<<2)|2,{37,108,0}}, +/* 22156 */ {(12<<2)|2,{37,108,0}}, +/* 22157 */ {(12<<2)|2,{37,108,0}}, +/* 22158 */ {(12<<2)|2,{37,108,0}}, +/* 22159 */ {(12<<2)|2,{37,108,0}}, +/* 22160 */ {(12<<2)|2,{37,109,0}}, +/* 22161 */ {(12<<2)|2,{37,109,0}}, +/* 22162 */ {(12<<2)|2,{37,109,0}}, +/* 22163 */ {(12<<2)|2,{37,109,0}}, +/* 22164 */ {(12<<2)|2,{37,109,0}}, +/* 22165 */ {(12<<2)|2,{37,109,0}}, +/* 22166 */ {(12<<2)|2,{37,109,0}}, +/* 22167 */ {(12<<2)|2,{37,109,0}}, +/* 22168 */ {(12<<2)|2,{37,109,0}}, +/* 22169 */ {(12<<2)|2,{37,109,0}}, +/* 22170 */ {(12<<2)|2,{37,109,0}}, +/* 22171 */ {(12<<2)|2,{37,109,0}}, +/* 22172 */ {(12<<2)|2,{37,109,0}}, +/* 22173 */ {(12<<2)|2,{37,109,0}}, +/* 22174 */ {(12<<2)|2,{37,109,0}}, +/* 22175 */ {(12<<2)|2,{37,109,0}}, +/* 22176 */ {(12<<2)|2,{37,110,0}}, +/* 22177 */ {(12<<2)|2,{37,110,0}}, +/* 22178 */ {(12<<2)|2,{37,110,0}}, +/* 22179 */ {(12<<2)|2,{37,110,0}}, +/* 22180 */ {(12<<2)|2,{37,110,0}}, +/* 22181 */ {(12<<2)|2,{37,110,0}}, +/* 22182 */ {(12<<2)|2,{37,110,0}}, +/* 22183 */ {(12<<2)|2,{37,110,0}}, +/* 22184 */ {(12<<2)|2,{37,110,0}}, +/* 22185 */ {(12<<2)|2,{37,110,0}}, +/* 22186 */ {(12<<2)|2,{37,110,0}}, +/* 22187 */ {(12<<2)|2,{37,110,0}}, +/* 22188 */ {(12<<2)|2,{37,110,0}}, +/* 22189 */ {(12<<2)|2,{37,110,0}}, +/* 22190 */ {(12<<2)|2,{37,110,0}}, +/* 22191 */ {(12<<2)|2,{37,110,0}}, +/* 22192 */ {(12<<2)|2,{37,112,0}}, +/* 22193 */ {(12<<2)|2,{37,112,0}}, +/* 22194 */ {(12<<2)|2,{37,112,0}}, +/* 22195 */ {(12<<2)|2,{37,112,0}}, +/* 22196 */ {(12<<2)|2,{37,112,0}}, +/* 22197 */ {(12<<2)|2,{37,112,0}}, +/* 22198 */ {(12<<2)|2,{37,112,0}}, +/* 22199 */ {(12<<2)|2,{37,112,0}}, +/* 22200 */ {(12<<2)|2,{37,112,0}}, +/* 22201 */ {(12<<2)|2,{37,112,0}}, +/* 22202 */ {(12<<2)|2,{37,112,0}}, +/* 22203 */ {(12<<2)|2,{37,112,0}}, +/* 22204 */ {(12<<2)|2,{37,112,0}}, +/* 22205 */ {(12<<2)|2,{37,112,0}}, +/* 22206 */ {(12<<2)|2,{37,112,0}}, +/* 22207 */ {(12<<2)|2,{37,112,0}}, +/* 22208 */ {(12<<2)|2,{37,114,0}}, +/* 22209 */ {(12<<2)|2,{37,114,0}}, +/* 22210 */ {(12<<2)|2,{37,114,0}}, +/* 22211 */ {(12<<2)|2,{37,114,0}}, +/* 22212 */ {(12<<2)|2,{37,114,0}}, +/* 22213 */ {(12<<2)|2,{37,114,0}}, +/* 22214 */ {(12<<2)|2,{37,114,0}}, +/* 22215 */ {(12<<2)|2,{37,114,0}}, +/* 22216 */ {(12<<2)|2,{37,114,0}}, +/* 22217 */ {(12<<2)|2,{37,114,0}}, +/* 22218 */ {(12<<2)|2,{37,114,0}}, +/* 22219 */ {(12<<2)|2,{37,114,0}}, +/* 22220 */ {(12<<2)|2,{37,114,0}}, +/* 22221 */ {(12<<2)|2,{37,114,0}}, +/* 22222 */ {(12<<2)|2,{37,114,0}}, +/* 22223 */ {(12<<2)|2,{37,114,0}}, +/* 22224 */ {(12<<2)|2,{37,117,0}}, +/* 22225 */ {(12<<2)|2,{37,117,0}}, +/* 22226 */ {(12<<2)|2,{37,117,0}}, +/* 22227 */ {(12<<2)|2,{37,117,0}}, +/* 22228 */ {(12<<2)|2,{37,117,0}}, +/* 22229 */ {(12<<2)|2,{37,117,0}}, +/* 22230 */ {(12<<2)|2,{37,117,0}}, +/* 22231 */ {(12<<2)|2,{37,117,0}}, +/* 22232 */ {(12<<2)|2,{37,117,0}}, +/* 22233 */ {(12<<2)|2,{37,117,0}}, +/* 22234 */ {(12<<2)|2,{37,117,0}}, +/* 22235 */ {(12<<2)|2,{37,117,0}}, +/* 22236 */ {(12<<2)|2,{37,117,0}}, +/* 22237 */ {(12<<2)|2,{37,117,0}}, +/* 22238 */ {(12<<2)|2,{37,117,0}}, +/* 22239 */ {(12<<2)|2,{37,117,0}}, +/* 22240 */ {(13<<2)|2,{37,58,0}}, +/* 22241 */ {(13<<2)|2,{37,58,0}}, +/* 22242 */ {(13<<2)|2,{37,58,0}}, +/* 22243 */ {(13<<2)|2,{37,58,0}}, +/* 22244 */ {(13<<2)|2,{37,58,0}}, +/* 22245 */ {(13<<2)|2,{37,58,0}}, +/* 22246 */ {(13<<2)|2,{37,58,0}}, +/* 22247 */ {(13<<2)|2,{37,58,0}}, +/* 22248 */ {(13<<2)|2,{37,66,0}}, +/* 22249 */ {(13<<2)|2,{37,66,0}}, +/* 22250 */ {(13<<2)|2,{37,66,0}}, +/* 22251 */ {(13<<2)|2,{37,66,0}}, +/* 22252 */ {(13<<2)|2,{37,66,0}}, +/* 22253 */ {(13<<2)|2,{37,66,0}}, +/* 22254 */ {(13<<2)|2,{37,66,0}}, +/* 22255 */ {(13<<2)|2,{37,66,0}}, +/* 22256 */ {(13<<2)|2,{37,67,0}}, +/* 22257 */ {(13<<2)|2,{37,67,0}}, +/* 22258 */ {(13<<2)|2,{37,67,0}}, +/* 22259 */ {(13<<2)|2,{37,67,0}}, +/* 22260 */ {(13<<2)|2,{37,67,0}}, +/* 22261 */ {(13<<2)|2,{37,67,0}}, +/* 22262 */ {(13<<2)|2,{37,67,0}}, +/* 22263 */ {(13<<2)|2,{37,67,0}}, +/* 22264 */ {(13<<2)|2,{37,68,0}}, +/* 22265 */ {(13<<2)|2,{37,68,0}}, +/* 22266 */ {(13<<2)|2,{37,68,0}}, +/* 22267 */ {(13<<2)|2,{37,68,0}}, +/* 22268 */ {(13<<2)|2,{37,68,0}}, +/* 22269 */ {(13<<2)|2,{37,68,0}}, +/* 22270 */ {(13<<2)|2,{37,68,0}}, +/* 22271 */ {(13<<2)|2,{37,68,0}}, +/* 22272 */ {(13<<2)|2,{37,69,0}}, +/* 22273 */ {(13<<2)|2,{37,69,0}}, +/* 22274 */ {(13<<2)|2,{37,69,0}}, +/* 22275 */ {(13<<2)|2,{37,69,0}}, +/* 22276 */ {(13<<2)|2,{37,69,0}}, +/* 22277 */ {(13<<2)|2,{37,69,0}}, +/* 22278 */ {(13<<2)|2,{37,69,0}}, +/* 22279 */ {(13<<2)|2,{37,69,0}}, +/* 22280 */ {(13<<2)|2,{37,70,0}}, +/* 22281 */ {(13<<2)|2,{37,70,0}}, +/* 22282 */ {(13<<2)|2,{37,70,0}}, +/* 22283 */ {(13<<2)|2,{37,70,0}}, +/* 22284 */ {(13<<2)|2,{37,70,0}}, +/* 22285 */ {(13<<2)|2,{37,70,0}}, +/* 22286 */ {(13<<2)|2,{37,70,0}}, +/* 22287 */ {(13<<2)|2,{37,70,0}}, +/* 22288 */ {(13<<2)|2,{37,71,0}}, +/* 22289 */ {(13<<2)|2,{37,71,0}}, +/* 22290 */ {(13<<2)|2,{37,71,0}}, +/* 22291 */ {(13<<2)|2,{37,71,0}}, +/* 22292 */ {(13<<2)|2,{37,71,0}}, +/* 22293 */ {(13<<2)|2,{37,71,0}}, +/* 22294 */ {(13<<2)|2,{37,71,0}}, +/* 22295 */ {(13<<2)|2,{37,71,0}}, +/* 22296 */ {(13<<2)|2,{37,72,0}}, +/* 22297 */ {(13<<2)|2,{37,72,0}}, +/* 22298 */ {(13<<2)|2,{37,72,0}}, +/* 22299 */ {(13<<2)|2,{37,72,0}}, +/* 22300 */ {(13<<2)|2,{37,72,0}}, +/* 22301 */ {(13<<2)|2,{37,72,0}}, +/* 22302 */ {(13<<2)|2,{37,72,0}}, +/* 22303 */ {(13<<2)|2,{37,72,0}}, +/* 22304 */ {(13<<2)|2,{37,73,0}}, +/* 22305 */ {(13<<2)|2,{37,73,0}}, +/* 22306 */ {(13<<2)|2,{37,73,0}}, +/* 22307 */ {(13<<2)|2,{37,73,0}}, +/* 22308 */ {(13<<2)|2,{37,73,0}}, +/* 22309 */ {(13<<2)|2,{37,73,0}}, +/* 22310 */ {(13<<2)|2,{37,73,0}}, +/* 22311 */ {(13<<2)|2,{37,73,0}}, +/* 22312 */ {(13<<2)|2,{37,74,0}}, +/* 22313 */ {(13<<2)|2,{37,74,0}}, +/* 22314 */ {(13<<2)|2,{37,74,0}}, +/* 22315 */ {(13<<2)|2,{37,74,0}}, +/* 22316 */ {(13<<2)|2,{37,74,0}}, +/* 22317 */ {(13<<2)|2,{37,74,0}}, +/* 22318 */ {(13<<2)|2,{37,74,0}}, +/* 22319 */ {(13<<2)|2,{37,74,0}}, +/* 22320 */ {(13<<2)|2,{37,75,0}}, +/* 22321 */ {(13<<2)|2,{37,75,0}}, +/* 22322 */ {(13<<2)|2,{37,75,0}}, +/* 22323 */ {(13<<2)|2,{37,75,0}}, +/* 22324 */ {(13<<2)|2,{37,75,0}}, +/* 22325 */ {(13<<2)|2,{37,75,0}}, +/* 22326 */ {(13<<2)|2,{37,75,0}}, +/* 22327 */ {(13<<2)|2,{37,75,0}}, +/* 22328 */ {(13<<2)|2,{37,76,0}}, +/* 22329 */ {(13<<2)|2,{37,76,0}}, +/* 22330 */ {(13<<2)|2,{37,76,0}}, +/* 22331 */ {(13<<2)|2,{37,76,0}}, +/* 22332 */ {(13<<2)|2,{37,76,0}}, +/* 22333 */ {(13<<2)|2,{37,76,0}}, +/* 22334 */ {(13<<2)|2,{37,76,0}}, +/* 22335 */ {(13<<2)|2,{37,76,0}}, +/* 22336 */ {(13<<2)|2,{37,77,0}}, +/* 22337 */ {(13<<2)|2,{37,77,0}}, +/* 22338 */ {(13<<2)|2,{37,77,0}}, +/* 22339 */ {(13<<2)|2,{37,77,0}}, +/* 22340 */ {(13<<2)|2,{37,77,0}}, +/* 22341 */ {(13<<2)|2,{37,77,0}}, +/* 22342 */ {(13<<2)|2,{37,77,0}}, +/* 22343 */ {(13<<2)|2,{37,77,0}}, +/* 22344 */ {(13<<2)|2,{37,78,0}}, +/* 22345 */ {(13<<2)|2,{37,78,0}}, +/* 22346 */ {(13<<2)|2,{37,78,0}}, +/* 22347 */ {(13<<2)|2,{37,78,0}}, +/* 22348 */ {(13<<2)|2,{37,78,0}}, +/* 22349 */ {(13<<2)|2,{37,78,0}}, +/* 22350 */ {(13<<2)|2,{37,78,0}}, +/* 22351 */ {(13<<2)|2,{37,78,0}}, +/* 22352 */ {(13<<2)|2,{37,79,0}}, +/* 22353 */ {(13<<2)|2,{37,79,0}}, +/* 22354 */ {(13<<2)|2,{37,79,0}}, +/* 22355 */ {(13<<2)|2,{37,79,0}}, +/* 22356 */ {(13<<2)|2,{37,79,0}}, +/* 22357 */ {(13<<2)|2,{37,79,0}}, +/* 22358 */ {(13<<2)|2,{37,79,0}}, +/* 22359 */ {(13<<2)|2,{37,79,0}}, +/* 22360 */ {(13<<2)|2,{37,80,0}}, +/* 22361 */ {(13<<2)|2,{37,80,0}}, +/* 22362 */ {(13<<2)|2,{37,80,0}}, +/* 22363 */ {(13<<2)|2,{37,80,0}}, +/* 22364 */ {(13<<2)|2,{37,80,0}}, +/* 22365 */ {(13<<2)|2,{37,80,0}}, +/* 22366 */ {(13<<2)|2,{37,80,0}}, +/* 22367 */ {(13<<2)|2,{37,80,0}}, +/* 22368 */ {(13<<2)|2,{37,81,0}}, +/* 22369 */ {(13<<2)|2,{37,81,0}}, +/* 22370 */ {(13<<2)|2,{37,81,0}}, +/* 22371 */ {(13<<2)|2,{37,81,0}}, +/* 22372 */ {(13<<2)|2,{37,81,0}}, +/* 22373 */ {(13<<2)|2,{37,81,0}}, +/* 22374 */ {(13<<2)|2,{37,81,0}}, +/* 22375 */ {(13<<2)|2,{37,81,0}}, +/* 22376 */ {(13<<2)|2,{37,82,0}}, +/* 22377 */ {(13<<2)|2,{37,82,0}}, +/* 22378 */ {(13<<2)|2,{37,82,0}}, +/* 22379 */ {(13<<2)|2,{37,82,0}}, +/* 22380 */ {(13<<2)|2,{37,82,0}}, +/* 22381 */ {(13<<2)|2,{37,82,0}}, +/* 22382 */ {(13<<2)|2,{37,82,0}}, +/* 22383 */ {(13<<2)|2,{37,82,0}}, +/* 22384 */ {(13<<2)|2,{37,83,0}}, +/* 22385 */ {(13<<2)|2,{37,83,0}}, +/* 22386 */ {(13<<2)|2,{37,83,0}}, +/* 22387 */ {(13<<2)|2,{37,83,0}}, +/* 22388 */ {(13<<2)|2,{37,83,0}}, +/* 22389 */ {(13<<2)|2,{37,83,0}}, +/* 22390 */ {(13<<2)|2,{37,83,0}}, +/* 22391 */ {(13<<2)|2,{37,83,0}}, +/* 22392 */ {(13<<2)|2,{37,84,0}}, +/* 22393 */ {(13<<2)|2,{37,84,0}}, +/* 22394 */ {(13<<2)|2,{37,84,0}}, +/* 22395 */ {(13<<2)|2,{37,84,0}}, +/* 22396 */ {(13<<2)|2,{37,84,0}}, +/* 22397 */ {(13<<2)|2,{37,84,0}}, +/* 22398 */ {(13<<2)|2,{37,84,0}}, +/* 22399 */ {(13<<2)|2,{37,84,0}}, +/* 22400 */ {(13<<2)|2,{37,85,0}}, +/* 22401 */ {(13<<2)|2,{37,85,0}}, +/* 22402 */ {(13<<2)|2,{37,85,0}}, +/* 22403 */ {(13<<2)|2,{37,85,0}}, +/* 22404 */ {(13<<2)|2,{37,85,0}}, +/* 22405 */ {(13<<2)|2,{37,85,0}}, +/* 22406 */ {(13<<2)|2,{37,85,0}}, +/* 22407 */ {(13<<2)|2,{37,85,0}}, +/* 22408 */ {(13<<2)|2,{37,86,0}}, +/* 22409 */ {(13<<2)|2,{37,86,0}}, +/* 22410 */ {(13<<2)|2,{37,86,0}}, +/* 22411 */ {(13<<2)|2,{37,86,0}}, +/* 22412 */ {(13<<2)|2,{37,86,0}}, +/* 22413 */ {(13<<2)|2,{37,86,0}}, +/* 22414 */ {(13<<2)|2,{37,86,0}}, +/* 22415 */ {(13<<2)|2,{37,86,0}}, +/* 22416 */ {(13<<2)|2,{37,87,0}}, +/* 22417 */ {(13<<2)|2,{37,87,0}}, +/* 22418 */ {(13<<2)|2,{37,87,0}}, +/* 22419 */ {(13<<2)|2,{37,87,0}}, +/* 22420 */ {(13<<2)|2,{37,87,0}}, +/* 22421 */ {(13<<2)|2,{37,87,0}}, +/* 22422 */ {(13<<2)|2,{37,87,0}}, +/* 22423 */ {(13<<2)|2,{37,87,0}}, +/* 22424 */ {(13<<2)|2,{37,89,0}}, +/* 22425 */ {(13<<2)|2,{37,89,0}}, +/* 22426 */ {(13<<2)|2,{37,89,0}}, +/* 22427 */ {(13<<2)|2,{37,89,0}}, +/* 22428 */ {(13<<2)|2,{37,89,0}}, +/* 22429 */ {(13<<2)|2,{37,89,0}}, +/* 22430 */ {(13<<2)|2,{37,89,0}}, +/* 22431 */ {(13<<2)|2,{37,89,0}}, +/* 22432 */ {(13<<2)|2,{37,106,0}}, +/* 22433 */ {(13<<2)|2,{37,106,0}}, +/* 22434 */ {(13<<2)|2,{37,106,0}}, +/* 22435 */ {(13<<2)|2,{37,106,0}}, +/* 22436 */ {(13<<2)|2,{37,106,0}}, +/* 22437 */ {(13<<2)|2,{37,106,0}}, +/* 22438 */ {(13<<2)|2,{37,106,0}}, +/* 22439 */ {(13<<2)|2,{37,106,0}}, +/* 22440 */ {(13<<2)|2,{37,107,0}}, +/* 22441 */ {(13<<2)|2,{37,107,0}}, +/* 22442 */ {(13<<2)|2,{37,107,0}}, +/* 22443 */ {(13<<2)|2,{37,107,0}}, +/* 22444 */ {(13<<2)|2,{37,107,0}}, +/* 22445 */ {(13<<2)|2,{37,107,0}}, +/* 22446 */ {(13<<2)|2,{37,107,0}}, +/* 22447 */ {(13<<2)|2,{37,107,0}}, +/* 22448 */ {(13<<2)|2,{37,113,0}}, +/* 22449 */ {(13<<2)|2,{37,113,0}}, +/* 22450 */ {(13<<2)|2,{37,113,0}}, +/* 22451 */ {(13<<2)|2,{37,113,0}}, +/* 22452 */ {(13<<2)|2,{37,113,0}}, +/* 22453 */ {(13<<2)|2,{37,113,0}}, +/* 22454 */ {(13<<2)|2,{37,113,0}}, +/* 22455 */ {(13<<2)|2,{37,113,0}}, +/* 22456 */ {(13<<2)|2,{37,118,0}}, +/* 22457 */ {(13<<2)|2,{37,118,0}}, +/* 22458 */ {(13<<2)|2,{37,118,0}}, +/* 22459 */ {(13<<2)|2,{37,118,0}}, +/* 22460 */ {(13<<2)|2,{37,118,0}}, +/* 22461 */ {(13<<2)|2,{37,118,0}}, +/* 22462 */ {(13<<2)|2,{37,118,0}}, +/* 22463 */ {(13<<2)|2,{37,118,0}}, +/* 22464 */ {(13<<2)|2,{37,119,0}}, +/* 22465 */ {(13<<2)|2,{37,119,0}}, +/* 22466 */ {(13<<2)|2,{37,119,0}}, +/* 22467 */ {(13<<2)|2,{37,119,0}}, +/* 22468 */ {(13<<2)|2,{37,119,0}}, +/* 22469 */ {(13<<2)|2,{37,119,0}}, +/* 22470 */ {(13<<2)|2,{37,119,0}}, +/* 22471 */ {(13<<2)|2,{37,119,0}}, +/* 22472 */ {(13<<2)|2,{37,120,0}}, +/* 22473 */ {(13<<2)|2,{37,120,0}}, +/* 22474 */ {(13<<2)|2,{37,120,0}}, +/* 22475 */ {(13<<2)|2,{37,120,0}}, +/* 22476 */ {(13<<2)|2,{37,120,0}}, +/* 22477 */ {(13<<2)|2,{37,120,0}}, +/* 22478 */ {(13<<2)|2,{37,120,0}}, +/* 22479 */ {(13<<2)|2,{37,120,0}}, +/* 22480 */ {(13<<2)|2,{37,121,0}}, +/* 22481 */ {(13<<2)|2,{37,121,0}}, +/* 22482 */ {(13<<2)|2,{37,121,0}}, +/* 22483 */ {(13<<2)|2,{37,121,0}}, +/* 22484 */ {(13<<2)|2,{37,121,0}}, +/* 22485 */ {(13<<2)|2,{37,121,0}}, +/* 22486 */ {(13<<2)|2,{37,121,0}}, +/* 22487 */ {(13<<2)|2,{37,121,0}}, +/* 22488 */ {(13<<2)|2,{37,122,0}}, +/* 22489 */ {(13<<2)|2,{37,122,0}}, +/* 22490 */ {(13<<2)|2,{37,122,0}}, +/* 22491 */ {(13<<2)|2,{37,122,0}}, +/* 22492 */ {(13<<2)|2,{37,122,0}}, +/* 22493 */ {(13<<2)|2,{37,122,0}}, +/* 22494 */ {(13<<2)|2,{37,122,0}}, +/* 22495 */ {(13<<2)|2,{37,122,0}}, +/* 22496 */ {(14<<2)|2,{37,38,0}}, +/* 22497 */ {(14<<2)|2,{37,38,0}}, +/* 22498 */ {(14<<2)|2,{37,38,0}}, +/* 22499 */ {(14<<2)|2,{37,38,0}}, +/* 22500 */ {(14<<2)|2,{37,42,0}}, +/* 22501 */ {(14<<2)|2,{37,42,0}}, +/* 22502 */ {(14<<2)|2,{37,42,0}}, +/* 22503 */ {(14<<2)|2,{37,42,0}}, +/* 22504 */ {(14<<2)|2,{37,44,0}}, +/* 22505 */ {(14<<2)|2,{37,44,0}}, +/* 22506 */ {(14<<2)|2,{37,44,0}}, +/* 22507 */ {(14<<2)|2,{37,44,0}}, +/* 22508 */ {(14<<2)|2,{37,59,0}}, +/* 22509 */ {(14<<2)|2,{37,59,0}}, +/* 22510 */ {(14<<2)|2,{37,59,0}}, +/* 22511 */ {(14<<2)|2,{37,59,0}}, +/* 22512 */ {(14<<2)|2,{37,88,0}}, +/* 22513 */ {(14<<2)|2,{37,88,0}}, +/* 22514 */ {(14<<2)|2,{37,88,0}}, +/* 22515 */ {(14<<2)|2,{37,88,0}}, +/* 22516 */ {(14<<2)|2,{37,90,0}}, +/* 22517 */ {(14<<2)|2,{37,90,0}}, +/* 22518 */ {(14<<2)|2,{37,90,0}}, +/* 22519 */ {(14<<2)|2,{37,90,0}}, +/* 22520 */ {(16<<2)|2,{37,33,0}}, +/* 22521 */ {(16<<2)|2,{37,34,0}}, +/* 22522 */ {(16<<2)|2,{37,40,0}}, +/* 22523 */ {(16<<2)|2,{37,41,0}}, +/* 22524 */ {(16<<2)|2,{37,63,0}}, +/* 22525 */ {(6<<2)|1,{37,0,0}}, +/* 22526 */ {(6<<2)|1,{37,0,0}}, +/* 22527 */ {(6<<2)|1,{37,0,0}}, +/* 22528 */ {(16<<2)|3,{45,48,48}}, +/* 22529 */ {(16<<2)|3,{45,48,49}}, +/* 22530 */ {(16<<2)|3,{45,48,50}}, +/* 22531 */ {(16<<2)|3,{45,48,97}}, +/* 22532 */ {(16<<2)|3,{45,48,99}}, +/* 22533 */ {(16<<2)|3,{45,48,101}}, +/* 22534 */ {(16<<2)|3,{45,48,105}}, +/* 22535 */ {(16<<2)|3,{45,48,111}}, +/* 22536 */ {(16<<2)|3,{45,48,115}}, +/* 22537 */ {(16<<2)|3,{45,48,116}}, +/* 22538 */ {(11<<2)|2,{45,48,0}}, +/* 22539 */ {(11<<2)|2,{45,48,0}}, +/* 22540 */ {(11<<2)|2,{45,48,0}}, +/* 22541 */ {(11<<2)|2,{45,48,0}}, +/* 22542 */ {(11<<2)|2,{45,48,0}}, +/* 22543 */ {(11<<2)|2,{45,48,0}}, +/* 22544 */ {(11<<2)|2,{45,48,0}}, +/* 22545 */ {(11<<2)|2,{45,48,0}}, +/* 22546 */ {(11<<2)|2,{45,48,0}}, +/* 22547 */ {(11<<2)|2,{45,48,0}}, +/* 22548 */ {(11<<2)|2,{45,48,0}}, +/* 22549 */ {(11<<2)|2,{45,48,0}}, +/* 22550 */ {(11<<2)|2,{45,48,0}}, +/* 22551 */ {(11<<2)|2,{45,48,0}}, +/* 22552 */ {(11<<2)|2,{45,48,0}}, +/* 22553 */ {(11<<2)|2,{45,48,0}}, +/* 22554 */ {(11<<2)|2,{45,48,0}}, +/* 22555 */ {(11<<2)|2,{45,48,0}}, +/* 22556 */ {(11<<2)|2,{45,48,0}}, +/* 22557 */ {(11<<2)|2,{45,48,0}}, +/* 22558 */ {(11<<2)|2,{45,48,0}}, +/* 22559 */ {(11<<2)|2,{45,48,0}}, +/* 22560 */ {(16<<2)|3,{45,49,48}}, +/* 22561 */ {(16<<2)|3,{45,49,49}}, +/* 22562 */ {(16<<2)|3,{45,49,50}}, +/* 22563 */ {(16<<2)|3,{45,49,97}}, +/* 22564 */ {(16<<2)|3,{45,49,99}}, +/* 22565 */ {(16<<2)|3,{45,49,101}}, +/* 22566 */ {(16<<2)|3,{45,49,105}}, +/* 22567 */ {(16<<2)|3,{45,49,111}}, +/* 22568 */ {(16<<2)|3,{45,49,115}}, +/* 22569 */ {(16<<2)|3,{45,49,116}}, +/* 22570 */ {(11<<2)|2,{45,49,0}}, +/* 22571 */ {(11<<2)|2,{45,49,0}}, +/* 22572 */ {(11<<2)|2,{45,49,0}}, +/* 22573 */ {(11<<2)|2,{45,49,0}}, +/* 22574 */ {(11<<2)|2,{45,49,0}}, +/* 22575 */ {(11<<2)|2,{45,49,0}}, +/* 22576 */ {(11<<2)|2,{45,49,0}}, +/* 22577 */ {(11<<2)|2,{45,49,0}}, +/* 22578 */ {(11<<2)|2,{45,49,0}}, +/* 22579 */ {(11<<2)|2,{45,49,0}}, +/* 22580 */ {(11<<2)|2,{45,49,0}}, +/* 22581 */ {(11<<2)|2,{45,49,0}}, +/* 22582 */ {(11<<2)|2,{45,49,0}}, +/* 22583 */ {(11<<2)|2,{45,49,0}}, +/* 22584 */ {(11<<2)|2,{45,49,0}}, +/* 22585 */ {(11<<2)|2,{45,49,0}}, +/* 22586 */ {(11<<2)|2,{45,49,0}}, +/* 22587 */ {(11<<2)|2,{45,49,0}}, +/* 22588 */ {(11<<2)|2,{45,49,0}}, +/* 22589 */ {(11<<2)|2,{45,49,0}}, +/* 22590 */ {(11<<2)|2,{45,49,0}}, +/* 22591 */ {(11<<2)|2,{45,49,0}}, +/* 22592 */ {(16<<2)|3,{45,50,48}}, +/* 22593 */ {(16<<2)|3,{45,50,49}}, +/* 22594 */ {(16<<2)|3,{45,50,50}}, +/* 22595 */ {(16<<2)|3,{45,50,97}}, +/* 22596 */ {(16<<2)|3,{45,50,99}}, +/* 22597 */ {(16<<2)|3,{45,50,101}}, +/* 22598 */ {(16<<2)|3,{45,50,105}}, +/* 22599 */ {(16<<2)|3,{45,50,111}}, +/* 22600 */ {(16<<2)|3,{45,50,115}}, +/* 22601 */ {(16<<2)|3,{45,50,116}}, +/* 22602 */ {(11<<2)|2,{45,50,0}}, +/* 22603 */ {(11<<2)|2,{45,50,0}}, +/* 22604 */ {(11<<2)|2,{45,50,0}}, +/* 22605 */ {(11<<2)|2,{45,50,0}}, +/* 22606 */ {(11<<2)|2,{45,50,0}}, +/* 22607 */ {(11<<2)|2,{45,50,0}}, +/* 22608 */ {(11<<2)|2,{45,50,0}}, +/* 22609 */ {(11<<2)|2,{45,50,0}}, +/* 22610 */ {(11<<2)|2,{45,50,0}}, +/* 22611 */ {(11<<2)|2,{45,50,0}}, +/* 22612 */ {(11<<2)|2,{45,50,0}}, +/* 22613 */ {(11<<2)|2,{45,50,0}}, +/* 22614 */ {(11<<2)|2,{45,50,0}}, +/* 22615 */ {(11<<2)|2,{45,50,0}}, +/* 22616 */ {(11<<2)|2,{45,50,0}}, +/* 22617 */ {(11<<2)|2,{45,50,0}}, +/* 22618 */ {(11<<2)|2,{45,50,0}}, +/* 22619 */ {(11<<2)|2,{45,50,0}}, +/* 22620 */ {(11<<2)|2,{45,50,0}}, +/* 22621 */ {(11<<2)|2,{45,50,0}}, +/* 22622 */ {(11<<2)|2,{45,50,0}}, +/* 22623 */ {(11<<2)|2,{45,50,0}}, +/* 22624 */ {(16<<2)|3,{45,97,48}}, +/* 22625 */ {(16<<2)|3,{45,97,49}}, +/* 22626 */ {(16<<2)|3,{45,97,50}}, +/* 22627 */ {(16<<2)|3,{45,97,97}}, +/* 22628 */ {(16<<2)|3,{45,97,99}}, +/* 22629 */ {(16<<2)|3,{45,97,101}}, +/* 22630 */ {(16<<2)|3,{45,97,105}}, +/* 22631 */ {(16<<2)|3,{45,97,111}}, +/* 22632 */ {(16<<2)|3,{45,97,115}}, +/* 22633 */ {(16<<2)|3,{45,97,116}}, +/* 22634 */ {(11<<2)|2,{45,97,0}}, +/* 22635 */ {(11<<2)|2,{45,97,0}}, +/* 22636 */ {(11<<2)|2,{45,97,0}}, +/* 22637 */ {(11<<2)|2,{45,97,0}}, +/* 22638 */ {(11<<2)|2,{45,97,0}}, +/* 22639 */ {(11<<2)|2,{45,97,0}}, +/* 22640 */ {(11<<2)|2,{45,97,0}}, +/* 22641 */ {(11<<2)|2,{45,97,0}}, +/* 22642 */ {(11<<2)|2,{45,97,0}}, +/* 22643 */ {(11<<2)|2,{45,97,0}}, +/* 22644 */ {(11<<2)|2,{45,97,0}}, +/* 22645 */ {(11<<2)|2,{45,97,0}}, +/* 22646 */ {(11<<2)|2,{45,97,0}}, +/* 22647 */ {(11<<2)|2,{45,97,0}}, +/* 22648 */ {(11<<2)|2,{45,97,0}}, +/* 22649 */ {(11<<2)|2,{45,97,0}}, +/* 22650 */ {(11<<2)|2,{45,97,0}}, +/* 22651 */ {(11<<2)|2,{45,97,0}}, +/* 22652 */ {(11<<2)|2,{45,97,0}}, +/* 22653 */ {(11<<2)|2,{45,97,0}}, +/* 22654 */ {(11<<2)|2,{45,97,0}}, +/* 22655 */ {(11<<2)|2,{45,97,0}}, +/* 22656 */ {(16<<2)|3,{45,99,48}}, +/* 22657 */ {(16<<2)|3,{45,99,49}}, +/* 22658 */ {(16<<2)|3,{45,99,50}}, +/* 22659 */ {(16<<2)|3,{45,99,97}}, +/* 22660 */ {(16<<2)|3,{45,99,99}}, +/* 22661 */ {(16<<2)|3,{45,99,101}}, +/* 22662 */ {(16<<2)|3,{45,99,105}}, +/* 22663 */ {(16<<2)|3,{45,99,111}}, +/* 22664 */ {(16<<2)|3,{45,99,115}}, +/* 22665 */ {(16<<2)|3,{45,99,116}}, +/* 22666 */ {(11<<2)|2,{45,99,0}}, +/* 22667 */ {(11<<2)|2,{45,99,0}}, +/* 22668 */ {(11<<2)|2,{45,99,0}}, +/* 22669 */ {(11<<2)|2,{45,99,0}}, +/* 22670 */ {(11<<2)|2,{45,99,0}}, +/* 22671 */ {(11<<2)|2,{45,99,0}}, +/* 22672 */ {(11<<2)|2,{45,99,0}}, +/* 22673 */ {(11<<2)|2,{45,99,0}}, +/* 22674 */ {(11<<2)|2,{45,99,0}}, +/* 22675 */ {(11<<2)|2,{45,99,0}}, +/* 22676 */ {(11<<2)|2,{45,99,0}}, +/* 22677 */ {(11<<2)|2,{45,99,0}}, +/* 22678 */ {(11<<2)|2,{45,99,0}}, +/* 22679 */ {(11<<2)|2,{45,99,0}}, +/* 22680 */ {(11<<2)|2,{45,99,0}}, +/* 22681 */ {(11<<2)|2,{45,99,0}}, +/* 22682 */ {(11<<2)|2,{45,99,0}}, +/* 22683 */ {(11<<2)|2,{45,99,0}}, +/* 22684 */ {(11<<2)|2,{45,99,0}}, +/* 22685 */ {(11<<2)|2,{45,99,0}}, +/* 22686 */ {(11<<2)|2,{45,99,0}}, +/* 22687 */ {(11<<2)|2,{45,99,0}}, +/* 22688 */ {(16<<2)|3,{45,101,48}}, +/* 22689 */ {(16<<2)|3,{45,101,49}}, +/* 22690 */ {(16<<2)|3,{45,101,50}}, +/* 22691 */ {(16<<2)|3,{45,101,97}}, +/* 22692 */ {(16<<2)|3,{45,101,99}}, +/* 22693 */ {(16<<2)|3,{45,101,101}}, +/* 22694 */ {(16<<2)|3,{45,101,105}}, +/* 22695 */ {(16<<2)|3,{45,101,111}}, +/* 22696 */ {(16<<2)|3,{45,101,115}}, +/* 22697 */ {(16<<2)|3,{45,101,116}}, +/* 22698 */ {(11<<2)|2,{45,101,0}}, +/* 22699 */ {(11<<2)|2,{45,101,0}}, +/* 22700 */ {(11<<2)|2,{45,101,0}}, +/* 22701 */ {(11<<2)|2,{45,101,0}}, +/* 22702 */ {(11<<2)|2,{45,101,0}}, +/* 22703 */ {(11<<2)|2,{45,101,0}}, +/* 22704 */ {(11<<2)|2,{45,101,0}}, +/* 22705 */ {(11<<2)|2,{45,101,0}}, +/* 22706 */ {(11<<2)|2,{45,101,0}}, +/* 22707 */ {(11<<2)|2,{45,101,0}}, +/* 22708 */ {(11<<2)|2,{45,101,0}}, +/* 22709 */ {(11<<2)|2,{45,101,0}}, +/* 22710 */ {(11<<2)|2,{45,101,0}}, +/* 22711 */ {(11<<2)|2,{45,101,0}}, +/* 22712 */ {(11<<2)|2,{45,101,0}}, +/* 22713 */ {(11<<2)|2,{45,101,0}}, +/* 22714 */ {(11<<2)|2,{45,101,0}}, +/* 22715 */ {(11<<2)|2,{45,101,0}}, +/* 22716 */ {(11<<2)|2,{45,101,0}}, +/* 22717 */ {(11<<2)|2,{45,101,0}}, +/* 22718 */ {(11<<2)|2,{45,101,0}}, +/* 22719 */ {(11<<2)|2,{45,101,0}}, +/* 22720 */ {(16<<2)|3,{45,105,48}}, +/* 22721 */ {(16<<2)|3,{45,105,49}}, +/* 22722 */ {(16<<2)|3,{45,105,50}}, +/* 22723 */ {(16<<2)|3,{45,105,97}}, +/* 22724 */ {(16<<2)|3,{45,105,99}}, +/* 22725 */ {(16<<2)|3,{45,105,101}}, +/* 22726 */ {(16<<2)|3,{45,105,105}}, +/* 22727 */ {(16<<2)|3,{45,105,111}}, +/* 22728 */ {(16<<2)|3,{45,105,115}}, +/* 22729 */ {(16<<2)|3,{45,105,116}}, +/* 22730 */ {(11<<2)|2,{45,105,0}}, +/* 22731 */ {(11<<2)|2,{45,105,0}}, +/* 22732 */ {(11<<2)|2,{45,105,0}}, +/* 22733 */ {(11<<2)|2,{45,105,0}}, +/* 22734 */ {(11<<2)|2,{45,105,0}}, +/* 22735 */ {(11<<2)|2,{45,105,0}}, +/* 22736 */ {(11<<2)|2,{45,105,0}}, +/* 22737 */ {(11<<2)|2,{45,105,0}}, +/* 22738 */ {(11<<2)|2,{45,105,0}}, +/* 22739 */ {(11<<2)|2,{45,105,0}}, +/* 22740 */ {(11<<2)|2,{45,105,0}}, +/* 22741 */ {(11<<2)|2,{45,105,0}}, +/* 22742 */ {(11<<2)|2,{45,105,0}}, +/* 22743 */ {(11<<2)|2,{45,105,0}}, +/* 22744 */ {(11<<2)|2,{45,105,0}}, +/* 22745 */ {(11<<2)|2,{45,105,0}}, +/* 22746 */ {(11<<2)|2,{45,105,0}}, +/* 22747 */ {(11<<2)|2,{45,105,0}}, +/* 22748 */ {(11<<2)|2,{45,105,0}}, +/* 22749 */ {(11<<2)|2,{45,105,0}}, +/* 22750 */ {(11<<2)|2,{45,105,0}}, +/* 22751 */ {(11<<2)|2,{45,105,0}}, +/* 22752 */ {(16<<2)|3,{45,111,48}}, +/* 22753 */ {(16<<2)|3,{45,111,49}}, +/* 22754 */ {(16<<2)|3,{45,111,50}}, +/* 22755 */ {(16<<2)|3,{45,111,97}}, +/* 22756 */ {(16<<2)|3,{45,111,99}}, +/* 22757 */ {(16<<2)|3,{45,111,101}}, +/* 22758 */ {(16<<2)|3,{45,111,105}}, +/* 22759 */ {(16<<2)|3,{45,111,111}}, +/* 22760 */ {(16<<2)|3,{45,111,115}}, +/* 22761 */ {(16<<2)|3,{45,111,116}}, +/* 22762 */ {(11<<2)|2,{45,111,0}}, +/* 22763 */ {(11<<2)|2,{45,111,0}}, +/* 22764 */ {(11<<2)|2,{45,111,0}}, +/* 22765 */ {(11<<2)|2,{45,111,0}}, +/* 22766 */ {(11<<2)|2,{45,111,0}}, +/* 22767 */ {(11<<2)|2,{45,111,0}}, +/* 22768 */ {(11<<2)|2,{45,111,0}}, +/* 22769 */ {(11<<2)|2,{45,111,0}}, +/* 22770 */ {(11<<2)|2,{45,111,0}}, +/* 22771 */ {(11<<2)|2,{45,111,0}}, +/* 22772 */ {(11<<2)|2,{45,111,0}}, +/* 22773 */ {(11<<2)|2,{45,111,0}}, +/* 22774 */ {(11<<2)|2,{45,111,0}}, +/* 22775 */ {(11<<2)|2,{45,111,0}}, +/* 22776 */ {(11<<2)|2,{45,111,0}}, +/* 22777 */ {(11<<2)|2,{45,111,0}}, +/* 22778 */ {(11<<2)|2,{45,111,0}}, +/* 22779 */ {(11<<2)|2,{45,111,0}}, +/* 22780 */ {(11<<2)|2,{45,111,0}}, +/* 22781 */ {(11<<2)|2,{45,111,0}}, +/* 22782 */ {(11<<2)|2,{45,111,0}}, +/* 22783 */ {(11<<2)|2,{45,111,0}}, +/* 22784 */ {(16<<2)|3,{45,115,48}}, +/* 22785 */ {(16<<2)|3,{45,115,49}}, +/* 22786 */ {(16<<2)|3,{45,115,50}}, +/* 22787 */ {(16<<2)|3,{45,115,97}}, +/* 22788 */ {(16<<2)|3,{45,115,99}}, +/* 22789 */ {(16<<2)|3,{45,115,101}}, +/* 22790 */ {(16<<2)|3,{45,115,105}}, +/* 22791 */ {(16<<2)|3,{45,115,111}}, +/* 22792 */ {(16<<2)|3,{45,115,115}}, +/* 22793 */ {(16<<2)|3,{45,115,116}}, +/* 22794 */ {(11<<2)|2,{45,115,0}}, +/* 22795 */ {(11<<2)|2,{45,115,0}}, +/* 22796 */ {(11<<2)|2,{45,115,0}}, +/* 22797 */ {(11<<2)|2,{45,115,0}}, +/* 22798 */ {(11<<2)|2,{45,115,0}}, +/* 22799 */ {(11<<2)|2,{45,115,0}}, +/* 22800 */ {(11<<2)|2,{45,115,0}}, +/* 22801 */ {(11<<2)|2,{45,115,0}}, +/* 22802 */ {(11<<2)|2,{45,115,0}}, +/* 22803 */ {(11<<2)|2,{45,115,0}}, +/* 22804 */ {(11<<2)|2,{45,115,0}}, +/* 22805 */ {(11<<2)|2,{45,115,0}}, +/* 22806 */ {(11<<2)|2,{45,115,0}}, +/* 22807 */ {(11<<2)|2,{45,115,0}}, +/* 22808 */ {(11<<2)|2,{45,115,0}}, +/* 22809 */ {(11<<2)|2,{45,115,0}}, +/* 22810 */ {(11<<2)|2,{45,115,0}}, +/* 22811 */ {(11<<2)|2,{45,115,0}}, +/* 22812 */ {(11<<2)|2,{45,115,0}}, +/* 22813 */ {(11<<2)|2,{45,115,0}}, +/* 22814 */ {(11<<2)|2,{45,115,0}}, +/* 22815 */ {(11<<2)|2,{45,115,0}}, +/* 22816 */ {(16<<2)|3,{45,116,48}}, +/* 22817 */ {(16<<2)|3,{45,116,49}}, +/* 22818 */ {(16<<2)|3,{45,116,50}}, +/* 22819 */ {(16<<2)|3,{45,116,97}}, +/* 22820 */ {(16<<2)|3,{45,116,99}}, +/* 22821 */ {(16<<2)|3,{45,116,101}}, +/* 22822 */ {(16<<2)|3,{45,116,105}}, +/* 22823 */ {(16<<2)|3,{45,116,111}}, +/* 22824 */ {(16<<2)|3,{45,116,115}}, +/* 22825 */ {(16<<2)|3,{45,116,116}}, +/* 22826 */ {(11<<2)|2,{45,116,0}}, +/* 22827 */ {(11<<2)|2,{45,116,0}}, +/* 22828 */ {(11<<2)|2,{45,116,0}}, +/* 22829 */ {(11<<2)|2,{45,116,0}}, +/* 22830 */ {(11<<2)|2,{45,116,0}}, +/* 22831 */ {(11<<2)|2,{45,116,0}}, +/* 22832 */ {(11<<2)|2,{45,116,0}}, +/* 22833 */ {(11<<2)|2,{45,116,0}}, +/* 22834 */ {(11<<2)|2,{45,116,0}}, +/* 22835 */ {(11<<2)|2,{45,116,0}}, +/* 22836 */ {(11<<2)|2,{45,116,0}}, +/* 22837 */ {(11<<2)|2,{45,116,0}}, +/* 22838 */ {(11<<2)|2,{45,116,0}}, +/* 22839 */ {(11<<2)|2,{45,116,0}}, +/* 22840 */ {(11<<2)|2,{45,116,0}}, +/* 22841 */ {(11<<2)|2,{45,116,0}}, +/* 22842 */ {(11<<2)|2,{45,116,0}}, +/* 22843 */ {(11<<2)|2,{45,116,0}}, +/* 22844 */ {(11<<2)|2,{45,116,0}}, +/* 22845 */ {(11<<2)|2,{45,116,0}}, +/* 22846 */ {(11<<2)|2,{45,116,0}}, +/* 22847 */ {(11<<2)|2,{45,116,0}}, +/* 22848 */ {(12<<2)|2,{45,32,0}}, +/* 22849 */ {(12<<2)|2,{45,32,0}}, +/* 22850 */ {(12<<2)|2,{45,32,0}}, +/* 22851 */ {(12<<2)|2,{45,32,0}}, +/* 22852 */ {(12<<2)|2,{45,32,0}}, +/* 22853 */ {(12<<2)|2,{45,32,0}}, +/* 22854 */ {(12<<2)|2,{45,32,0}}, +/* 22855 */ {(12<<2)|2,{45,32,0}}, +/* 22856 */ {(12<<2)|2,{45,32,0}}, +/* 22857 */ {(12<<2)|2,{45,32,0}}, +/* 22858 */ {(12<<2)|2,{45,32,0}}, +/* 22859 */ {(12<<2)|2,{45,32,0}}, +/* 22860 */ {(12<<2)|2,{45,32,0}}, +/* 22861 */ {(12<<2)|2,{45,32,0}}, +/* 22862 */ {(12<<2)|2,{45,32,0}}, +/* 22863 */ {(12<<2)|2,{45,32,0}}, +/* 22864 */ {(12<<2)|2,{45,37,0}}, +/* 22865 */ {(12<<2)|2,{45,37,0}}, +/* 22866 */ {(12<<2)|2,{45,37,0}}, +/* 22867 */ {(12<<2)|2,{45,37,0}}, +/* 22868 */ {(12<<2)|2,{45,37,0}}, +/* 22869 */ {(12<<2)|2,{45,37,0}}, +/* 22870 */ {(12<<2)|2,{45,37,0}}, +/* 22871 */ {(12<<2)|2,{45,37,0}}, +/* 22872 */ {(12<<2)|2,{45,37,0}}, +/* 22873 */ {(12<<2)|2,{45,37,0}}, +/* 22874 */ {(12<<2)|2,{45,37,0}}, +/* 22875 */ {(12<<2)|2,{45,37,0}}, +/* 22876 */ {(12<<2)|2,{45,37,0}}, +/* 22877 */ {(12<<2)|2,{45,37,0}}, +/* 22878 */ {(12<<2)|2,{45,37,0}}, +/* 22879 */ {(12<<2)|2,{45,37,0}}, +/* 22880 */ {(12<<2)|2,{45,45,0}}, +/* 22881 */ {(12<<2)|2,{45,45,0}}, +/* 22882 */ {(12<<2)|2,{45,45,0}}, +/* 22883 */ {(12<<2)|2,{45,45,0}}, +/* 22884 */ {(12<<2)|2,{45,45,0}}, +/* 22885 */ {(12<<2)|2,{45,45,0}}, +/* 22886 */ {(12<<2)|2,{45,45,0}}, +/* 22887 */ {(12<<2)|2,{45,45,0}}, +/* 22888 */ {(12<<2)|2,{45,45,0}}, +/* 22889 */ {(12<<2)|2,{45,45,0}}, +/* 22890 */ {(12<<2)|2,{45,45,0}}, +/* 22891 */ {(12<<2)|2,{45,45,0}}, +/* 22892 */ {(12<<2)|2,{45,45,0}}, +/* 22893 */ {(12<<2)|2,{45,45,0}}, +/* 22894 */ {(12<<2)|2,{45,45,0}}, +/* 22895 */ {(12<<2)|2,{45,45,0}}, +/* 22896 */ {(12<<2)|2,{45,46,0}}, +/* 22897 */ {(12<<2)|2,{45,46,0}}, +/* 22898 */ {(12<<2)|2,{45,46,0}}, +/* 22899 */ {(12<<2)|2,{45,46,0}}, +/* 22900 */ {(12<<2)|2,{45,46,0}}, +/* 22901 */ {(12<<2)|2,{45,46,0}}, +/* 22902 */ {(12<<2)|2,{45,46,0}}, +/* 22903 */ {(12<<2)|2,{45,46,0}}, +/* 22904 */ {(12<<2)|2,{45,46,0}}, +/* 22905 */ {(12<<2)|2,{45,46,0}}, +/* 22906 */ {(12<<2)|2,{45,46,0}}, +/* 22907 */ {(12<<2)|2,{45,46,0}}, +/* 22908 */ {(12<<2)|2,{45,46,0}}, +/* 22909 */ {(12<<2)|2,{45,46,0}}, +/* 22910 */ {(12<<2)|2,{45,46,0}}, +/* 22911 */ {(12<<2)|2,{45,46,0}}, +/* 22912 */ {(12<<2)|2,{45,47,0}}, +/* 22913 */ {(12<<2)|2,{45,47,0}}, +/* 22914 */ {(12<<2)|2,{45,47,0}}, +/* 22915 */ {(12<<2)|2,{45,47,0}}, +/* 22916 */ {(12<<2)|2,{45,47,0}}, +/* 22917 */ {(12<<2)|2,{45,47,0}}, +/* 22918 */ {(12<<2)|2,{45,47,0}}, +/* 22919 */ {(12<<2)|2,{45,47,0}}, +/* 22920 */ {(12<<2)|2,{45,47,0}}, +/* 22921 */ {(12<<2)|2,{45,47,0}}, +/* 22922 */ {(12<<2)|2,{45,47,0}}, +/* 22923 */ {(12<<2)|2,{45,47,0}}, +/* 22924 */ {(12<<2)|2,{45,47,0}}, +/* 22925 */ {(12<<2)|2,{45,47,0}}, +/* 22926 */ {(12<<2)|2,{45,47,0}}, +/* 22927 */ {(12<<2)|2,{45,47,0}}, +/* 22928 */ {(12<<2)|2,{45,51,0}}, +/* 22929 */ {(12<<2)|2,{45,51,0}}, +/* 22930 */ {(12<<2)|2,{45,51,0}}, +/* 22931 */ {(12<<2)|2,{45,51,0}}, +/* 22932 */ {(12<<2)|2,{45,51,0}}, +/* 22933 */ {(12<<2)|2,{45,51,0}}, +/* 22934 */ {(12<<2)|2,{45,51,0}}, +/* 22935 */ {(12<<2)|2,{45,51,0}}, +/* 22936 */ {(12<<2)|2,{45,51,0}}, +/* 22937 */ {(12<<2)|2,{45,51,0}}, +/* 22938 */ {(12<<2)|2,{45,51,0}}, +/* 22939 */ {(12<<2)|2,{45,51,0}}, +/* 22940 */ {(12<<2)|2,{45,51,0}}, +/* 22941 */ {(12<<2)|2,{45,51,0}}, +/* 22942 */ {(12<<2)|2,{45,51,0}}, +/* 22943 */ {(12<<2)|2,{45,51,0}}, +/* 22944 */ {(12<<2)|2,{45,52,0}}, +/* 22945 */ {(12<<2)|2,{45,52,0}}, +/* 22946 */ {(12<<2)|2,{45,52,0}}, +/* 22947 */ {(12<<2)|2,{45,52,0}}, +/* 22948 */ {(12<<2)|2,{45,52,0}}, +/* 22949 */ {(12<<2)|2,{45,52,0}}, +/* 22950 */ {(12<<2)|2,{45,52,0}}, +/* 22951 */ {(12<<2)|2,{45,52,0}}, +/* 22952 */ {(12<<2)|2,{45,52,0}}, +/* 22953 */ {(12<<2)|2,{45,52,0}}, +/* 22954 */ {(12<<2)|2,{45,52,0}}, +/* 22955 */ {(12<<2)|2,{45,52,0}}, +/* 22956 */ {(12<<2)|2,{45,52,0}}, +/* 22957 */ {(12<<2)|2,{45,52,0}}, +/* 22958 */ {(12<<2)|2,{45,52,0}}, +/* 22959 */ {(12<<2)|2,{45,52,0}}, +/* 22960 */ {(12<<2)|2,{45,53,0}}, +/* 22961 */ {(12<<2)|2,{45,53,0}}, +/* 22962 */ {(12<<2)|2,{45,53,0}}, +/* 22963 */ {(12<<2)|2,{45,53,0}}, +/* 22964 */ {(12<<2)|2,{45,53,0}}, +/* 22965 */ {(12<<2)|2,{45,53,0}}, +/* 22966 */ {(12<<2)|2,{45,53,0}}, +/* 22967 */ {(12<<2)|2,{45,53,0}}, +/* 22968 */ {(12<<2)|2,{45,53,0}}, +/* 22969 */ {(12<<2)|2,{45,53,0}}, +/* 22970 */ {(12<<2)|2,{45,53,0}}, +/* 22971 */ {(12<<2)|2,{45,53,0}}, +/* 22972 */ {(12<<2)|2,{45,53,0}}, +/* 22973 */ {(12<<2)|2,{45,53,0}}, +/* 22974 */ {(12<<2)|2,{45,53,0}}, +/* 22975 */ {(12<<2)|2,{45,53,0}}, +/* 22976 */ {(12<<2)|2,{45,54,0}}, +/* 22977 */ {(12<<2)|2,{45,54,0}}, +/* 22978 */ {(12<<2)|2,{45,54,0}}, +/* 22979 */ {(12<<2)|2,{45,54,0}}, +/* 22980 */ {(12<<2)|2,{45,54,0}}, +/* 22981 */ {(12<<2)|2,{45,54,0}}, +/* 22982 */ {(12<<2)|2,{45,54,0}}, +/* 22983 */ {(12<<2)|2,{45,54,0}}, +/* 22984 */ {(12<<2)|2,{45,54,0}}, +/* 22985 */ {(12<<2)|2,{45,54,0}}, +/* 22986 */ {(12<<2)|2,{45,54,0}}, +/* 22987 */ {(12<<2)|2,{45,54,0}}, +/* 22988 */ {(12<<2)|2,{45,54,0}}, +/* 22989 */ {(12<<2)|2,{45,54,0}}, +/* 22990 */ {(12<<2)|2,{45,54,0}}, +/* 22991 */ {(12<<2)|2,{45,54,0}}, +/* 22992 */ {(12<<2)|2,{45,55,0}}, +/* 22993 */ {(12<<2)|2,{45,55,0}}, +/* 22994 */ {(12<<2)|2,{45,55,0}}, +/* 22995 */ {(12<<2)|2,{45,55,0}}, +/* 22996 */ {(12<<2)|2,{45,55,0}}, +/* 22997 */ {(12<<2)|2,{45,55,0}}, +/* 22998 */ {(12<<2)|2,{45,55,0}}, +/* 22999 */ {(12<<2)|2,{45,55,0}}, +/* 23000 */ {(12<<2)|2,{45,55,0}}, +/* 23001 */ {(12<<2)|2,{45,55,0}}, +/* 23002 */ {(12<<2)|2,{45,55,0}}, +/* 23003 */ {(12<<2)|2,{45,55,0}}, +/* 23004 */ {(12<<2)|2,{45,55,0}}, +/* 23005 */ {(12<<2)|2,{45,55,0}}, +/* 23006 */ {(12<<2)|2,{45,55,0}}, +/* 23007 */ {(12<<2)|2,{45,55,0}}, +/* 23008 */ {(12<<2)|2,{45,56,0}}, +/* 23009 */ {(12<<2)|2,{45,56,0}}, +/* 23010 */ {(12<<2)|2,{45,56,0}}, +/* 23011 */ {(12<<2)|2,{45,56,0}}, +/* 23012 */ {(12<<2)|2,{45,56,0}}, +/* 23013 */ {(12<<2)|2,{45,56,0}}, +/* 23014 */ {(12<<2)|2,{45,56,0}}, +/* 23015 */ {(12<<2)|2,{45,56,0}}, +/* 23016 */ {(12<<2)|2,{45,56,0}}, +/* 23017 */ {(12<<2)|2,{45,56,0}}, +/* 23018 */ {(12<<2)|2,{45,56,0}}, +/* 23019 */ {(12<<2)|2,{45,56,0}}, +/* 23020 */ {(12<<2)|2,{45,56,0}}, +/* 23021 */ {(12<<2)|2,{45,56,0}}, +/* 23022 */ {(12<<2)|2,{45,56,0}}, +/* 23023 */ {(12<<2)|2,{45,56,0}}, +/* 23024 */ {(12<<2)|2,{45,57,0}}, +/* 23025 */ {(12<<2)|2,{45,57,0}}, +/* 23026 */ {(12<<2)|2,{45,57,0}}, +/* 23027 */ {(12<<2)|2,{45,57,0}}, +/* 23028 */ {(12<<2)|2,{45,57,0}}, +/* 23029 */ {(12<<2)|2,{45,57,0}}, +/* 23030 */ {(12<<2)|2,{45,57,0}}, +/* 23031 */ {(12<<2)|2,{45,57,0}}, +/* 23032 */ {(12<<2)|2,{45,57,0}}, +/* 23033 */ {(12<<2)|2,{45,57,0}}, +/* 23034 */ {(12<<2)|2,{45,57,0}}, +/* 23035 */ {(12<<2)|2,{45,57,0}}, +/* 23036 */ {(12<<2)|2,{45,57,0}}, +/* 23037 */ {(12<<2)|2,{45,57,0}}, +/* 23038 */ {(12<<2)|2,{45,57,0}}, +/* 23039 */ {(12<<2)|2,{45,57,0}}, +/* 23040 */ {(12<<2)|2,{45,61,0}}, +/* 23041 */ {(12<<2)|2,{45,61,0}}, +/* 23042 */ {(12<<2)|2,{45,61,0}}, +/* 23043 */ {(12<<2)|2,{45,61,0}}, +/* 23044 */ {(12<<2)|2,{45,61,0}}, +/* 23045 */ {(12<<2)|2,{45,61,0}}, +/* 23046 */ {(12<<2)|2,{45,61,0}}, +/* 23047 */ {(12<<2)|2,{45,61,0}}, +/* 23048 */ {(12<<2)|2,{45,61,0}}, +/* 23049 */ {(12<<2)|2,{45,61,0}}, +/* 23050 */ {(12<<2)|2,{45,61,0}}, +/* 23051 */ {(12<<2)|2,{45,61,0}}, +/* 23052 */ {(12<<2)|2,{45,61,0}}, +/* 23053 */ {(12<<2)|2,{45,61,0}}, +/* 23054 */ {(12<<2)|2,{45,61,0}}, +/* 23055 */ {(12<<2)|2,{45,61,0}}, +/* 23056 */ {(12<<2)|2,{45,65,0}}, +/* 23057 */ {(12<<2)|2,{45,65,0}}, +/* 23058 */ {(12<<2)|2,{45,65,0}}, +/* 23059 */ {(12<<2)|2,{45,65,0}}, +/* 23060 */ {(12<<2)|2,{45,65,0}}, +/* 23061 */ {(12<<2)|2,{45,65,0}}, +/* 23062 */ {(12<<2)|2,{45,65,0}}, +/* 23063 */ {(12<<2)|2,{45,65,0}}, +/* 23064 */ {(12<<2)|2,{45,65,0}}, +/* 23065 */ {(12<<2)|2,{45,65,0}}, +/* 23066 */ {(12<<2)|2,{45,65,0}}, +/* 23067 */ {(12<<2)|2,{45,65,0}}, +/* 23068 */ {(12<<2)|2,{45,65,0}}, +/* 23069 */ {(12<<2)|2,{45,65,0}}, +/* 23070 */ {(12<<2)|2,{45,65,0}}, +/* 23071 */ {(12<<2)|2,{45,65,0}}, +/* 23072 */ {(12<<2)|2,{45,95,0}}, +/* 23073 */ {(12<<2)|2,{45,95,0}}, +/* 23074 */ {(12<<2)|2,{45,95,0}}, +/* 23075 */ {(12<<2)|2,{45,95,0}}, +/* 23076 */ {(12<<2)|2,{45,95,0}}, +/* 23077 */ {(12<<2)|2,{45,95,0}}, +/* 23078 */ {(12<<2)|2,{45,95,0}}, +/* 23079 */ {(12<<2)|2,{45,95,0}}, +/* 23080 */ {(12<<2)|2,{45,95,0}}, +/* 23081 */ {(12<<2)|2,{45,95,0}}, +/* 23082 */ {(12<<2)|2,{45,95,0}}, +/* 23083 */ {(12<<2)|2,{45,95,0}}, +/* 23084 */ {(12<<2)|2,{45,95,0}}, +/* 23085 */ {(12<<2)|2,{45,95,0}}, +/* 23086 */ {(12<<2)|2,{45,95,0}}, +/* 23087 */ {(12<<2)|2,{45,95,0}}, +/* 23088 */ {(12<<2)|2,{45,98,0}}, +/* 23089 */ {(12<<2)|2,{45,98,0}}, +/* 23090 */ {(12<<2)|2,{45,98,0}}, +/* 23091 */ {(12<<2)|2,{45,98,0}}, +/* 23092 */ {(12<<2)|2,{45,98,0}}, +/* 23093 */ {(12<<2)|2,{45,98,0}}, +/* 23094 */ {(12<<2)|2,{45,98,0}}, +/* 23095 */ {(12<<2)|2,{45,98,0}}, +/* 23096 */ {(12<<2)|2,{45,98,0}}, +/* 23097 */ {(12<<2)|2,{45,98,0}}, +/* 23098 */ {(12<<2)|2,{45,98,0}}, +/* 23099 */ {(12<<2)|2,{45,98,0}}, +/* 23100 */ {(12<<2)|2,{45,98,0}}, +/* 23101 */ {(12<<2)|2,{45,98,0}}, +/* 23102 */ {(12<<2)|2,{45,98,0}}, +/* 23103 */ {(12<<2)|2,{45,98,0}}, +/* 23104 */ {(12<<2)|2,{45,100,0}}, +/* 23105 */ {(12<<2)|2,{45,100,0}}, +/* 23106 */ {(12<<2)|2,{45,100,0}}, +/* 23107 */ {(12<<2)|2,{45,100,0}}, +/* 23108 */ {(12<<2)|2,{45,100,0}}, +/* 23109 */ {(12<<2)|2,{45,100,0}}, +/* 23110 */ {(12<<2)|2,{45,100,0}}, +/* 23111 */ {(12<<2)|2,{45,100,0}}, +/* 23112 */ {(12<<2)|2,{45,100,0}}, +/* 23113 */ {(12<<2)|2,{45,100,0}}, +/* 23114 */ {(12<<2)|2,{45,100,0}}, +/* 23115 */ {(12<<2)|2,{45,100,0}}, +/* 23116 */ {(12<<2)|2,{45,100,0}}, +/* 23117 */ {(12<<2)|2,{45,100,0}}, +/* 23118 */ {(12<<2)|2,{45,100,0}}, +/* 23119 */ {(12<<2)|2,{45,100,0}}, +/* 23120 */ {(12<<2)|2,{45,102,0}}, +/* 23121 */ {(12<<2)|2,{45,102,0}}, +/* 23122 */ {(12<<2)|2,{45,102,0}}, +/* 23123 */ {(12<<2)|2,{45,102,0}}, +/* 23124 */ {(12<<2)|2,{45,102,0}}, +/* 23125 */ {(12<<2)|2,{45,102,0}}, +/* 23126 */ {(12<<2)|2,{45,102,0}}, +/* 23127 */ {(12<<2)|2,{45,102,0}}, +/* 23128 */ {(12<<2)|2,{45,102,0}}, +/* 23129 */ {(12<<2)|2,{45,102,0}}, +/* 23130 */ {(12<<2)|2,{45,102,0}}, +/* 23131 */ {(12<<2)|2,{45,102,0}}, +/* 23132 */ {(12<<2)|2,{45,102,0}}, +/* 23133 */ {(12<<2)|2,{45,102,0}}, +/* 23134 */ {(12<<2)|2,{45,102,0}}, +/* 23135 */ {(12<<2)|2,{45,102,0}}, +/* 23136 */ {(12<<2)|2,{45,103,0}}, +/* 23137 */ {(12<<2)|2,{45,103,0}}, +/* 23138 */ {(12<<2)|2,{45,103,0}}, +/* 23139 */ {(12<<2)|2,{45,103,0}}, +/* 23140 */ {(12<<2)|2,{45,103,0}}, +/* 23141 */ {(12<<2)|2,{45,103,0}}, +/* 23142 */ {(12<<2)|2,{45,103,0}}, +/* 23143 */ {(12<<2)|2,{45,103,0}}, +/* 23144 */ {(12<<2)|2,{45,103,0}}, +/* 23145 */ {(12<<2)|2,{45,103,0}}, +/* 23146 */ {(12<<2)|2,{45,103,0}}, +/* 23147 */ {(12<<2)|2,{45,103,0}}, +/* 23148 */ {(12<<2)|2,{45,103,0}}, +/* 23149 */ {(12<<2)|2,{45,103,0}}, +/* 23150 */ {(12<<2)|2,{45,103,0}}, +/* 23151 */ {(12<<2)|2,{45,103,0}}, +/* 23152 */ {(12<<2)|2,{45,104,0}}, +/* 23153 */ {(12<<2)|2,{45,104,0}}, +/* 23154 */ {(12<<2)|2,{45,104,0}}, +/* 23155 */ {(12<<2)|2,{45,104,0}}, +/* 23156 */ {(12<<2)|2,{45,104,0}}, +/* 23157 */ {(12<<2)|2,{45,104,0}}, +/* 23158 */ {(12<<2)|2,{45,104,0}}, +/* 23159 */ {(12<<2)|2,{45,104,0}}, +/* 23160 */ {(12<<2)|2,{45,104,0}}, +/* 23161 */ {(12<<2)|2,{45,104,0}}, +/* 23162 */ {(12<<2)|2,{45,104,0}}, +/* 23163 */ {(12<<2)|2,{45,104,0}}, +/* 23164 */ {(12<<2)|2,{45,104,0}}, +/* 23165 */ {(12<<2)|2,{45,104,0}}, +/* 23166 */ {(12<<2)|2,{45,104,0}}, +/* 23167 */ {(12<<2)|2,{45,104,0}}, +/* 23168 */ {(12<<2)|2,{45,108,0}}, +/* 23169 */ {(12<<2)|2,{45,108,0}}, +/* 23170 */ {(12<<2)|2,{45,108,0}}, +/* 23171 */ {(12<<2)|2,{45,108,0}}, +/* 23172 */ {(12<<2)|2,{45,108,0}}, +/* 23173 */ {(12<<2)|2,{45,108,0}}, +/* 23174 */ {(12<<2)|2,{45,108,0}}, +/* 23175 */ {(12<<2)|2,{45,108,0}}, +/* 23176 */ {(12<<2)|2,{45,108,0}}, +/* 23177 */ {(12<<2)|2,{45,108,0}}, +/* 23178 */ {(12<<2)|2,{45,108,0}}, +/* 23179 */ {(12<<2)|2,{45,108,0}}, +/* 23180 */ {(12<<2)|2,{45,108,0}}, +/* 23181 */ {(12<<2)|2,{45,108,0}}, +/* 23182 */ {(12<<2)|2,{45,108,0}}, +/* 23183 */ {(12<<2)|2,{45,108,0}}, +/* 23184 */ {(12<<2)|2,{45,109,0}}, +/* 23185 */ {(12<<2)|2,{45,109,0}}, +/* 23186 */ {(12<<2)|2,{45,109,0}}, +/* 23187 */ {(12<<2)|2,{45,109,0}}, +/* 23188 */ {(12<<2)|2,{45,109,0}}, +/* 23189 */ {(12<<2)|2,{45,109,0}}, +/* 23190 */ {(12<<2)|2,{45,109,0}}, +/* 23191 */ {(12<<2)|2,{45,109,0}}, +/* 23192 */ {(12<<2)|2,{45,109,0}}, +/* 23193 */ {(12<<2)|2,{45,109,0}}, +/* 23194 */ {(12<<2)|2,{45,109,0}}, +/* 23195 */ {(12<<2)|2,{45,109,0}}, +/* 23196 */ {(12<<2)|2,{45,109,0}}, +/* 23197 */ {(12<<2)|2,{45,109,0}}, +/* 23198 */ {(12<<2)|2,{45,109,0}}, +/* 23199 */ {(12<<2)|2,{45,109,0}}, +/* 23200 */ {(12<<2)|2,{45,110,0}}, +/* 23201 */ {(12<<2)|2,{45,110,0}}, +/* 23202 */ {(12<<2)|2,{45,110,0}}, +/* 23203 */ {(12<<2)|2,{45,110,0}}, +/* 23204 */ {(12<<2)|2,{45,110,0}}, +/* 23205 */ {(12<<2)|2,{45,110,0}}, +/* 23206 */ {(12<<2)|2,{45,110,0}}, +/* 23207 */ {(12<<2)|2,{45,110,0}}, +/* 23208 */ {(12<<2)|2,{45,110,0}}, +/* 23209 */ {(12<<2)|2,{45,110,0}}, +/* 23210 */ {(12<<2)|2,{45,110,0}}, +/* 23211 */ {(12<<2)|2,{45,110,0}}, +/* 23212 */ {(12<<2)|2,{45,110,0}}, +/* 23213 */ {(12<<2)|2,{45,110,0}}, +/* 23214 */ {(12<<2)|2,{45,110,0}}, +/* 23215 */ {(12<<2)|2,{45,110,0}}, +/* 23216 */ {(12<<2)|2,{45,112,0}}, +/* 23217 */ {(12<<2)|2,{45,112,0}}, +/* 23218 */ {(12<<2)|2,{45,112,0}}, +/* 23219 */ {(12<<2)|2,{45,112,0}}, +/* 23220 */ {(12<<2)|2,{45,112,0}}, +/* 23221 */ {(12<<2)|2,{45,112,0}}, +/* 23222 */ {(12<<2)|2,{45,112,0}}, +/* 23223 */ {(12<<2)|2,{45,112,0}}, +/* 23224 */ {(12<<2)|2,{45,112,0}}, +/* 23225 */ {(12<<2)|2,{45,112,0}}, +/* 23226 */ {(12<<2)|2,{45,112,0}}, +/* 23227 */ {(12<<2)|2,{45,112,0}}, +/* 23228 */ {(12<<2)|2,{45,112,0}}, +/* 23229 */ {(12<<2)|2,{45,112,0}}, +/* 23230 */ {(12<<2)|2,{45,112,0}}, +/* 23231 */ {(12<<2)|2,{45,112,0}}, +/* 23232 */ {(12<<2)|2,{45,114,0}}, +/* 23233 */ {(12<<2)|2,{45,114,0}}, +/* 23234 */ {(12<<2)|2,{45,114,0}}, +/* 23235 */ {(12<<2)|2,{45,114,0}}, +/* 23236 */ {(12<<2)|2,{45,114,0}}, +/* 23237 */ {(12<<2)|2,{45,114,0}}, +/* 23238 */ {(12<<2)|2,{45,114,0}}, +/* 23239 */ {(12<<2)|2,{45,114,0}}, +/* 23240 */ {(12<<2)|2,{45,114,0}}, +/* 23241 */ {(12<<2)|2,{45,114,0}}, +/* 23242 */ {(12<<2)|2,{45,114,0}}, +/* 23243 */ {(12<<2)|2,{45,114,0}}, +/* 23244 */ {(12<<2)|2,{45,114,0}}, +/* 23245 */ {(12<<2)|2,{45,114,0}}, +/* 23246 */ {(12<<2)|2,{45,114,0}}, +/* 23247 */ {(12<<2)|2,{45,114,0}}, +/* 23248 */ {(12<<2)|2,{45,117,0}}, +/* 23249 */ {(12<<2)|2,{45,117,0}}, +/* 23250 */ {(12<<2)|2,{45,117,0}}, +/* 23251 */ {(12<<2)|2,{45,117,0}}, +/* 23252 */ {(12<<2)|2,{45,117,0}}, +/* 23253 */ {(12<<2)|2,{45,117,0}}, +/* 23254 */ {(12<<2)|2,{45,117,0}}, +/* 23255 */ {(12<<2)|2,{45,117,0}}, +/* 23256 */ {(12<<2)|2,{45,117,0}}, +/* 23257 */ {(12<<2)|2,{45,117,0}}, +/* 23258 */ {(12<<2)|2,{45,117,0}}, +/* 23259 */ {(12<<2)|2,{45,117,0}}, +/* 23260 */ {(12<<2)|2,{45,117,0}}, +/* 23261 */ {(12<<2)|2,{45,117,0}}, +/* 23262 */ {(12<<2)|2,{45,117,0}}, +/* 23263 */ {(12<<2)|2,{45,117,0}}, +/* 23264 */ {(13<<2)|2,{45,58,0}}, +/* 23265 */ {(13<<2)|2,{45,58,0}}, +/* 23266 */ {(13<<2)|2,{45,58,0}}, +/* 23267 */ {(13<<2)|2,{45,58,0}}, +/* 23268 */ {(13<<2)|2,{45,58,0}}, +/* 23269 */ {(13<<2)|2,{45,58,0}}, +/* 23270 */ {(13<<2)|2,{45,58,0}}, +/* 23271 */ {(13<<2)|2,{45,58,0}}, +/* 23272 */ {(13<<2)|2,{45,66,0}}, +/* 23273 */ {(13<<2)|2,{45,66,0}}, +/* 23274 */ {(13<<2)|2,{45,66,0}}, +/* 23275 */ {(13<<2)|2,{45,66,0}}, +/* 23276 */ {(13<<2)|2,{45,66,0}}, +/* 23277 */ {(13<<2)|2,{45,66,0}}, +/* 23278 */ {(13<<2)|2,{45,66,0}}, +/* 23279 */ {(13<<2)|2,{45,66,0}}, +/* 23280 */ {(13<<2)|2,{45,67,0}}, +/* 23281 */ {(13<<2)|2,{45,67,0}}, +/* 23282 */ {(13<<2)|2,{45,67,0}}, +/* 23283 */ {(13<<2)|2,{45,67,0}}, +/* 23284 */ {(13<<2)|2,{45,67,0}}, +/* 23285 */ {(13<<2)|2,{45,67,0}}, +/* 23286 */ {(13<<2)|2,{45,67,0}}, +/* 23287 */ {(13<<2)|2,{45,67,0}}, +/* 23288 */ {(13<<2)|2,{45,68,0}}, +/* 23289 */ {(13<<2)|2,{45,68,0}}, +/* 23290 */ {(13<<2)|2,{45,68,0}}, +/* 23291 */ {(13<<2)|2,{45,68,0}}, +/* 23292 */ {(13<<2)|2,{45,68,0}}, +/* 23293 */ {(13<<2)|2,{45,68,0}}, +/* 23294 */ {(13<<2)|2,{45,68,0}}, +/* 23295 */ {(13<<2)|2,{45,68,0}}, +/* 23296 */ {(13<<2)|2,{45,69,0}}, +/* 23297 */ {(13<<2)|2,{45,69,0}}, +/* 23298 */ {(13<<2)|2,{45,69,0}}, +/* 23299 */ {(13<<2)|2,{45,69,0}}, +/* 23300 */ {(13<<2)|2,{45,69,0}}, +/* 23301 */ {(13<<2)|2,{45,69,0}}, +/* 23302 */ {(13<<2)|2,{45,69,0}}, +/* 23303 */ {(13<<2)|2,{45,69,0}}, +/* 23304 */ {(13<<2)|2,{45,70,0}}, +/* 23305 */ {(13<<2)|2,{45,70,0}}, +/* 23306 */ {(13<<2)|2,{45,70,0}}, +/* 23307 */ {(13<<2)|2,{45,70,0}}, +/* 23308 */ {(13<<2)|2,{45,70,0}}, +/* 23309 */ {(13<<2)|2,{45,70,0}}, +/* 23310 */ {(13<<2)|2,{45,70,0}}, +/* 23311 */ {(13<<2)|2,{45,70,0}}, +/* 23312 */ {(13<<2)|2,{45,71,0}}, +/* 23313 */ {(13<<2)|2,{45,71,0}}, +/* 23314 */ {(13<<2)|2,{45,71,0}}, +/* 23315 */ {(13<<2)|2,{45,71,0}}, +/* 23316 */ {(13<<2)|2,{45,71,0}}, +/* 23317 */ {(13<<2)|2,{45,71,0}}, +/* 23318 */ {(13<<2)|2,{45,71,0}}, +/* 23319 */ {(13<<2)|2,{45,71,0}}, +/* 23320 */ {(13<<2)|2,{45,72,0}}, +/* 23321 */ {(13<<2)|2,{45,72,0}}, +/* 23322 */ {(13<<2)|2,{45,72,0}}, +/* 23323 */ {(13<<2)|2,{45,72,0}}, +/* 23324 */ {(13<<2)|2,{45,72,0}}, +/* 23325 */ {(13<<2)|2,{45,72,0}}, +/* 23326 */ {(13<<2)|2,{45,72,0}}, +/* 23327 */ {(13<<2)|2,{45,72,0}}, +/* 23328 */ {(13<<2)|2,{45,73,0}}, +/* 23329 */ {(13<<2)|2,{45,73,0}}, +/* 23330 */ {(13<<2)|2,{45,73,0}}, +/* 23331 */ {(13<<2)|2,{45,73,0}}, +/* 23332 */ {(13<<2)|2,{45,73,0}}, +/* 23333 */ {(13<<2)|2,{45,73,0}}, +/* 23334 */ {(13<<2)|2,{45,73,0}}, +/* 23335 */ {(13<<2)|2,{45,73,0}}, +/* 23336 */ {(13<<2)|2,{45,74,0}}, +/* 23337 */ {(13<<2)|2,{45,74,0}}, +/* 23338 */ {(13<<2)|2,{45,74,0}}, +/* 23339 */ {(13<<2)|2,{45,74,0}}, +/* 23340 */ {(13<<2)|2,{45,74,0}}, +/* 23341 */ {(13<<2)|2,{45,74,0}}, +/* 23342 */ {(13<<2)|2,{45,74,0}}, +/* 23343 */ {(13<<2)|2,{45,74,0}}, +/* 23344 */ {(13<<2)|2,{45,75,0}}, +/* 23345 */ {(13<<2)|2,{45,75,0}}, +/* 23346 */ {(13<<2)|2,{45,75,0}}, +/* 23347 */ {(13<<2)|2,{45,75,0}}, +/* 23348 */ {(13<<2)|2,{45,75,0}}, +/* 23349 */ {(13<<2)|2,{45,75,0}}, +/* 23350 */ {(13<<2)|2,{45,75,0}}, +/* 23351 */ {(13<<2)|2,{45,75,0}}, +/* 23352 */ {(13<<2)|2,{45,76,0}}, +/* 23353 */ {(13<<2)|2,{45,76,0}}, +/* 23354 */ {(13<<2)|2,{45,76,0}}, +/* 23355 */ {(13<<2)|2,{45,76,0}}, +/* 23356 */ {(13<<2)|2,{45,76,0}}, +/* 23357 */ {(13<<2)|2,{45,76,0}}, +/* 23358 */ {(13<<2)|2,{45,76,0}}, +/* 23359 */ {(13<<2)|2,{45,76,0}}, +/* 23360 */ {(13<<2)|2,{45,77,0}}, +/* 23361 */ {(13<<2)|2,{45,77,0}}, +/* 23362 */ {(13<<2)|2,{45,77,0}}, +/* 23363 */ {(13<<2)|2,{45,77,0}}, +/* 23364 */ {(13<<2)|2,{45,77,0}}, +/* 23365 */ {(13<<2)|2,{45,77,0}}, +/* 23366 */ {(13<<2)|2,{45,77,0}}, +/* 23367 */ {(13<<2)|2,{45,77,0}}, +/* 23368 */ {(13<<2)|2,{45,78,0}}, +/* 23369 */ {(13<<2)|2,{45,78,0}}, +/* 23370 */ {(13<<2)|2,{45,78,0}}, +/* 23371 */ {(13<<2)|2,{45,78,0}}, +/* 23372 */ {(13<<2)|2,{45,78,0}}, +/* 23373 */ {(13<<2)|2,{45,78,0}}, +/* 23374 */ {(13<<2)|2,{45,78,0}}, +/* 23375 */ {(13<<2)|2,{45,78,0}}, +/* 23376 */ {(13<<2)|2,{45,79,0}}, +/* 23377 */ {(13<<2)|2,{45,79,0}}, +/* 23378 */ {(13<<2)|2,{45,79,0}}, +/* 23379 */ {(13<<2)|2,{45,79,0}}, +/* 23380 */ {(13<<2)|2,{45,79,0}}, +/* 23381 */ {(13<<2)|2,{45,79,0}}, +/* 23382 */ {(13<<2)|2,{45,79,0}}, +/* 23383 */ {(13<<2)|2,{45,79,0}}, +/* 23384 */ {(13<<2)|2,{45,80,0}}, +/* 23385 */ {(13<<2)|2,{45,80,0}}, +/* 23386 */ {(13<<2)|2,{45,80,0}}, +/* 23387 */ {(13<<2)|2,{45,80,0}}, +/* 23388 */ {(13<<2)|2,{45,80,0}}, +/* 23389 */ {(13<<2)|2,{45,80,0}}, +/* 23390 */ {(13<<2)|2,{45,80,0}}, +/* 23391 */ {(13<<2)|2,{45,80,0}}, +/* 23392 */ {(13<<2)|2,{45,81,0}}, +/* 23393 */ {(13<<2)|2,{45,81,0}}, +/* 23394 */ {(13<<2)|2,{45,81,0}}, +/* 23395 */ {(13<<2)|2,{45,81,0}}, +/* 23396 */ {(13<<2)|2,{45,81,0}}, +/* 23397 */ {(13<<2)|2,{45,81,0}}, +/* 23398 */ {(13<<2)|2,{45,81,0}}, +/* 23399 */ {(13<<2)|2,{45,81,0}}, +/* 23400 */ {(13<<2)|2,{45,82,0}}, +/* 23401 */ {(13<<2)|2,{45,82,0}}, +/* 23402 */ {(13<<2)|2,{45,82,0}}, +/* 23403 */ {(13<<2)|2,{45,82,0}}, +/* 23404 */ {(13<<2)|2,{45,82,0}}, +/* 23405 */ {(13<<2)|2,{45,82,0}}, +/* 23406 */ {(13<<2)|2,{45,82,0}}, +/* 23407 */ {(13<<2)|2,{45,82,0}}, +/* 23408 */ {(13<<2)|2,{45,83,0}}, +/* 23409 */ {(13<<2)|2,{45,83,0}}, +/* 23410 */ {(13<<2)|2,{45,83,0}}, +/* 23411 */ {(13<<2)|2,{45,83,0}}, +/* 23412 */ {(13<<2)|2,{45,83,0}}, +/* 23413 */ {(13<<2)|2,{45,83,0}}, +/* 23414 */ {(13<<2)|2,{45,83,0}}, +/* 23415 */ {(13<<2)|2,{45,83,0}}, +/* 23416 */ {(13<<2)|2,{45,84,0}}, +/* 23417 */ {(13<<2)|2,{45,84,0}}, +/* 23418 */ {(13<<2)|2,{45,84,0}}, +/* 23419 */ {(13<<2)|2,{45,84,0}}, +/* 23420 */ {(13<<2)|2,{45,84,0}}, +/* 23421 */ {(13<<2)|2,{45,84,0}}, +/* 23422 */ {(13<<2)|2,{45,84,0}}, +/* 23423 */ {(13<<2)|2,{45,84,0}}, +/* 23424 */ {(13<<2)|2,{45,85,0}}, +/* 23425 */ {(13<<2)|2,{45,85,0}}, +/* 23426 */ {(13<<2)|2,{45,85,0}}, +/* 23427 */ {(13<<2)|2,{45,85,0}}, +/* 23428 */ {(13<<2)|2,{45,85,0}}, +/* 23429 */ {(13<<2)|2,{45,85,0}}, +/* 23430 */ {(13<<2)|2,{45,85,0}}, +/* 23431 */ {(13<<2)|2,{45,85,0}}, +/* 23432 */ {(13<<2)|2,{45,86,0}}, +/* 23433 */ {(13<<2)|2,{45,86,0}}, +/* 23434 */ {(13<<2)|2,{45,86,0}}, +/* 23435 */ {(13<<2)|2,{45,86,0}}, +/* 23436 */ {(13<<2)|2,{45,86,0}}, +/* 23437 */ {(13<<2)|2,{45,86,0}}, +/* 23438 */ {(13<<2)|2,{45,86,0}}, +/* 23439 */ {(13<<2)|2,{45,86,0}}, +/* 23440 */ {(13<<2)|2,{45,87,0}}, +/* 23441 */ {(13<<2)|2,{45,87,0}}, +/* 23442 */ {(13<<2)|2,{45,87,0}}, +/* 23443 */ {(13<<2)|2,{45,87,0}}, +/* 23444 */ {(13<<2)|2,{45,87,0}}, +/* 23445 */ {(13<<2)|2,{45,87,0}}, +/* 23446 */ {(13<<2)|2,{45,87,0}}, +/* 23447 */ {(13<<2)|2,{45,87,0}}, +/* 23448 */ {(13<<2)|2,{45,89,0}}, +/* 23449 */ {(13<<2)|2,{45,89,0}}, +/* 23450 */ {(13<<2)|2,{45,89,0}}, +/* 23451 */ {(13<<2)|2,{45,89,0}}, +/* 23452 */ {(13<<2)|2,{45,89,0}}, +/* 23453 */ {(13<<2)|2,{45,89,0}}, +/* 23454 */ {(13<<2)|2,{45,89,0}}, +/* 23455 */ {(13<<2)|2,{45,89,0}}, +/* 23456 */ {(13<<2)|2,{45,106,0}}, +/* 23457 */ {(13<<2)|2,{45,106,0}}, +/* 23458 */ {(13<<2)|2,{45,106,0}}, +/* 23459 */ {(13<<2)|2,{45,106,0}}, +/* 23460 */ {(13<<2)|2,{45,106,0}}, +/* 23461 */ {(13<<2)|2,{45,106,0}}, +/* 23462 */ {(13<<2)|2,{45,106,0}}, +/* 23463 */ {(13<<2)|2,{45,106,0}}, +/* 23464 */ {(13<<2)|2,{45,107,0}}, +/* 23465 */ {(13<<2)|2,{45,107,0}}, +/* 23466 */ {(13<<2)|2,{45,107,0}}, +/* 23467 */ {(13<<2)|2,{45,107,0}}, +/* 23468 */ {(13<<2)|2,{45,107,0}}, +/* 23469 */ {(13<<2)|2,{45,107,0}}, +/* 23470 */ {(13<<2)|2,{45,107,0}}, +/* 23471 */ {(13<<2)|2,{45,107,0}}, +/* 23472 */ {(13<<2)|2,{45,113,0}}, +/* 23473 */ {(13<<2)|2,{45,113,0}}, +/* 23474 */ {(13<<2)|2,{45,113,0}}, +/* 23475 */ {(13<<2)|2,{45,113,0}}, +/* 23476 */ {(13<<2)|2,{45,113,0}}, +/* 23477 */ {(13<<2)|2,{45,113,0}}, +/* 23478 */ {(13<<2)|2,{45,113,0}}, +/* 23479 */ {(13<<2)|2,{45,113,0}}, +/* 23480 */ {(13<<2)|2,{45,118,0}}, +/* 23481 */ {(13<<2)|2,{45,118,0}}, +/* 23482 */ {(13<<2)|2,{45,118,0}}, +/* 23483 */ {(13<<2)|2,{45,118,0}}, +/* 23484 */ {(13<<2)|2,{45,118,0}}, +/* 23485 */ {(13<<2)|2,{45,118,0}}, +/* 23486 */ {(13<<2)|2,{45,118,0}}, +/* 23487 */ {(13<<2)|2,{45,118,0}}, +/* 23488 */ {(13<<2)|2,{45,119,0}}, +/* 23489 */ {(13<<2)|2,{45,119,0}}, +/* 23490 */ {(13<<2)|2,{45,119,0}}, +/* 23491 */ {(13<<2)|2,{45,119,0}}, +/* 23492 */ {(13<<2)|2,{45,119,0}}, +/* 23493 */ {(13<<2)|2,{45,119,0}}, +/* 23494 */ {(13<<2)|2,{45,119,0}}, +/* 23495 */ {(13<<2)|2,{45,119,0}}, +/* 23496 */ {(13<<2)|2,{45,120,0}}, +/* 23497 */ {(13<<2)|2,{45,120,0}}, +/* 23498 */ {(13<<2)|2,{45,120,0}}, +/* 23499 */ {(13<<2)|2,{45,120,0}}, +/* 23500 */ {(13<<2)|2,{45,120,0}}, +/* 23501 */ {(13<<2)|2,{45,120,0}}, +/* 23502 */ {(13<<2)|2,{45,120,0}}, +/* 23503 */ {(13<<2)|2,{45,120,0}}, +/* 23504 */ {(13<<2)|2,{45,121,0}}, +/* 23505 */ {(13<<2)|2,{45,121,0}}, +/* 23506 */ {(13<<2)|2,{45,121,0}}, +/* 23507 */ {(13<<2)|2,{45,121,0}}, +/* 23508 */ {(13<<2)|2,{45,121,0}}, +/* 23509 */ {(13<<2)|2,{45,121,0}}, +/* 23510 */ {(13<<2)|2,{45,121,0}}, +/* 23511 */ {(13<<2)|2,{45,121,0}}, +/* 23512 */ {(13<<2)|2,{45,122,0}}, +/* 23513 */ {(13<<2)|2,{45,122,0}}, +/* 23514 */ {(13<<2)|2,{45,122,0}}, +/* 23515 */ {(13<<2)|2,{45,122,0}}, +/* 23516 */ {(13<<2)|2,{45,122,0}}, +/* 23517 */ {(13<<2)|2,{45,122,0}}, +/* 23518 */ {(13<<2)|2,{45,122,0}}, +/* 23519 */ {(13<<2)|2,{45,122,0}}, +/* 23520 */ {(14<<2)|2,{45,38,0}}, +/* 23521 */ {(14<<2)|2,{45,38,0}}, +/* 23522 */ {(14<<2)|2,{45,38,0}}, +/* 23523 */ {(14<<2)|2,{45,38,0}}, +/* 23524 */ {(14<<2)|2,{45,42,0}}, +/* 23525 */ {(14<<2)|2,{45,42,0}}, +/* 23526 */ {(14<<2)|2,{45,42,0}}, +/* 23527 */ {(14<<2)|2,{45,42,0}}, +/* 23528 */ {(14<<2)|2,{45,44,0}}, +/* 23529 */ {(14<<2)|2,{45,44,0}}, +/* 23530 */ {(14<<2)|2,{45,44,0}}, +/* 23531 */ {(14<<2)|2,{45,44,0}}, +/* 23532 */ {(14<<2)|2,{45,59,0}}, +/* 23533 */ {(14<<2)|2,{45,59,0}}, +/* 23534 */ {(14<<2)|2,{45,59,0}}, +/* 23535 */ {(14<<2)|2,{45,59,0}}, +/* 23536 */ {(14<<2)|2,{45,88,0}}, +/* 23537 */ {(14<<2)|2,{45,88,0}}, +/* 23538 */ {(14<<2)|2,{45,88,0}}, +/* 23539 */ {(14<<2)|2,{45,88,0}}, +/* 23540 */ {(14<<2)|2,{45,90,0}}, +/* 23541 */ {(14<<2)|2,{45,90,0}}, +/* 23542 */ {(14<<2)|2,{45,90,0}}, +/* 23543 */ {(14<<2)|2,{45,90,0}}, +/* 23544 */ {(16<<2)|2,{45,33,0}}, +/* 23545 */ {(16<<2)|2,{45,34,0}}, +/* 23546 */ {(16<<2)|2,{45,40,0}}, +/* 23547 */ {(16<<2)|2,{45,41,0}}, +/* 23548 */ {(16<<2)|2,{45,63,0}}, +/* 23549 */ {(6<<2)|1,{45,0,0}}, +/* 23550 */ {(6<<2)|1,{45,0,0}}, +/* 23551 */ {(6<<2)|1,{45,0,0}}, +/* 23552 */ {(16<<2)|3,{46,48,48}}, +/* 23553 */ {(16<<2)|3,{46,48,49}}, +/* 23554 */ {(16<<2)|3,{46,48,50}}, +/* 23555 */ {(16<<2)|3,{46,48,97}}, +/* 23556 */ {(16<<2)|3,{46,48,99}}, +/* 23557 */ {(16<<2)|3,{46,48,101}}, +/* 23558 */ {(16<<2)|3,{46,48,105}}, +/* 23559 */ {(16<<2)|3,{46,48,111}}, +/* 23560 */ {(16<<2)|3,{46,48,115}}, +/* 23561 */ {(16<<2)|3,{46,48,116}}, +/* 23562 */ {(11<<2)|2,{46,48,0}}, +/* 23563 */ {(11<<2)|2,{46,48,0}}, +/* 23564 */ {(11<<2)|2,{46,48,0}}, +/* 23565 */ {(11<<2)|2,{46,48,0}}, +/* 23566 */ {(11<<2)|2,{46,48,0}}, +/* 23567 */ {(11<<2)|2,{46,48,0}}, +/* 23568 */ {(11<<2)|2,{46,48,0}}, +/* 23569 */ {(11<<2)|2,{46,48,0}}, +/* 23570 */ {(11<<2)|2,{46,48,0}}, +/* 23571 */ {(11<<2)|2,{46,48,0}}, +/* 23572 */ {(11<<2)|2,{46,48,0}}, +/* 23573 */ {(11<<2)|2,{46,48,0}}, +/* 23574 */ {(11<<2)|2,{46,48,0}}, +/* 23575 */ {(11<<2)|2,{46,48,0}}, +/* 23576 */ {(11<<2)|2,{46,48,0}}, +/* 23577 */ {(11<<2)|2,{46,48,0}}, +/* 23578 */ {(11<<2)|2,{46,48,0}}, +/* 23579 */ {(11<<2)|2,{46,48,0}}, +/* 23580 */ {(11<<2)|2,{46,48,0}}, +/* 23581 */ {(11<<2)|2,{46,48,0}}, +/* 23582 */ {(11<<2)|2,{46,48,0}}, +/* 23583 */ {(11<<2)|2,{46,48,0}}, +/* 23584 */ {(16<<2)|3,{46,49,48}}, +/* 23585 */ {(16<<2)|3,{46,49,49}}, +/* 23586 */ {(16<<2)|3,{46,49,50}}, +/* 23587 */ {(16<<2)|3,{46,49,97}}, +/* 23588 */ {(16<<2)|3,{46,49,99}}, +/* 23589 */ {(16<<2)|3,{46,49,101}}, +/* 23590 */ {(16<<2)|3,{46,49,105}}, +/* 23591 */ {(16<<2)|3,{46,49,111}}, +/* 23592 */ {(16<<2)|3,{46,49,115}}, +/* 23593 */ {(16<<2)|3,{46,49,116}}, +/* 23594 */ {(11<<2)|2,{46,49,0}}, +/* 23595 */ {(11<<2)|2,{46,49,0}}, +/* 23596 */ {(11<<2)|2,{46,49,0}}, +/* 23597 */ {(11<<2)|2,{46,49,0}}, +/* 23598 */ {(11<<2)|2,{46,49,0}}, +/* 23599 */ {(11<<2)|2,{46,49,0}}, +/* 23600 */ {(11<<2)|2,{46,49,0}}, +/* 23601 */ {(11<<2)|2,{46,49,0}}, +/* 23602 */ {(11<<2)|2,{46,49,0}}, +/* 23603 */ {(11<<2)|2,{46,49,0}}, +/* 23604 */ {(11<<2)|2,{46,49,0}}, +/* 23605 */ {(11<<2)|2,{46,49,0}}, +/* 23606 */ {(11<<2)|2,{46,49,0}}, +/* 23607 */ {(11<<2)|2,{46,49,0}}, +/* 23608 */ {(11<<2)|2,{46,49,0}}, +/* 23609 */ {(11<<2)|2,{46,49,0}}, +/* 23610 */ {(11<<2)|2,{46,49,0}}, +/* 23611 */ {(11<<2)|2,{46,49,0}}, +/* 23612 */ {(11<<2)|2,{46,49,0}}, +/* 23613 */ {(11<<2)|2,{46,49,0}}, +/* 23614 */ {(11<<2)|2,{46,49,0}}, +/* 23615 */ {(11<<2)|2,{46,49,0}}, +/* 23616 */ {(16<<2)|3,{46,50,48}}, +/* 23617 */ {(16<<2)|3,{46,50,49}}, +/* 23618 */ {(16<<2)|3,{46,50,50}}, +/* 23619 */ {(16<<2)|3,{46,50,97}}, +/* 23620 */ {(16<<2)|3,{46,50,99}}, +/* 23621 */ {(16<<2)|3,{46,50,101}}, +/* 23622 */ {(16<<2)|3,{46,50,105}}, +/* 23623 */ {(16<<2)|3,{46,50,111}}, +/* 23624 */ {(16<<2)|3,{46,50,115}}, +/* 23625 */ {(16<<2)|3,{46,50,116}}, +/* 23626 */ {(11<<2)|2,{46,50,0}}, +/* 23627 */ {(11<<2)|2,{46,50,0}}, +/* 23628 */ {(11<<2)|2,{46,50,0}}, +/* 23629 */ {(11<<2)|2,{46,50,0}}, +/* 23630 */ {(11<<2)|2,{46,50,0}}, +/* 23631 */ {(11<<2)|2,{46,50,0}}, +/* 23632 */ {(11<<2)|2,{46,50,0}}, +/* 23633 */ {(11<<2)|2,{46,50,0}}, +/* 23634 */ {(11<<2)|2,{46,50,0}}, +/* 23635 */ {(11<<2)|2,{46,50,0}}, +/* 23636 */ {(11<<2)|2,{46,50,0}}, +/* 23637 */ {(11<<2)|2,{46,50,0}}, +/* 23638 */ {(11<<2)|2,{46,50,0}}, +/* 23639 */ {(11<<2)|2,{46,50,0}}, +/* 23640 */ {(11<<2)|2,{46,50,0}}, +/* 23641 */ {(11<<2)|2,{46,50,0}}, +/* 23642 */ {(11<<2)|2,{46,50,0}}, +/* 23643 */ {(11<<2)|2,{46,50,0}}, +/* 23644 */ {(11<<2)|2,{46,50,0}}, +/* 23645 */ {(11<<2)|2,{46,50,0}}, +/* 23646 */ {(11<<2)|2,{46,50,0}}, +/* 23647 */ {(11<<2)|2,{46,50,0}}, +/* 23648 */ {(16<<2)|3,{46,97,48}}, +/* 23649 */ {(16<<2)|3,{46,97,49}}, +/* 23650 */ {(16<<2)|3,{46,97,50}}, +/* 23651 */ {(16<<2)|3,{46,97,97}}, +/* 23652 */ {(16<<2)|3,{46,97,99}}, +/* 23653 */ {(16<<2)|3,{46,97,101}}, +/* 23654 */ {(16<<2)|3,{46,97,105}}, +/* 23655 */ {(16<<2)|3,{46,97,111}}, +/* 23656 */ {(16<<2)|3,{46,97,115}}, +/* 23657 */ {(16<<2)|3,{46,97,116}}, +/* 23658 */ {(11<<2)|2,{46,97,0}}, +/* 23659 */ {(11<<2)|2,{46,97,0}}, +/* 23660 */ {(11<<2)|2,{46,97,0}}, +/* 23661 */ {(11<<2)|2,{46,97,0}}, +/* 23662 */ {(11<<2)|2,{46,97,0}}, +/* 23663 */ {(11<<2)|2,{46,97,0}}, +/* 23664 */ {(11<<2)|2,{46,97,0}}, +/* 23665 */ {(11<<2)|2,{46,97,0}}, +/* 23666 */ {(11<<2)|2,{46,97,0}}, +/* 23667 */ {(11<<2)|2,{46,97,0}}, +/* 23668 */ {(11<<2)|2,{46,97,0}}, +/* 23669 */ {(11<<2)|2,{46,97,0}}, +/* 23670 */ {(11<<2)|2,{46,97,0}}, +/* 23671 */ {(11<<2)|2,{46,97,0}}, +/* 23672 */ {(11<<2)|2,{46,97,0}}, +/* 23673 */ {(11<<2)|2,{46,97,0}}, +/* 23674 */ {(11<<2)|2,{46,97,0}}, +/* 23675 */ {(11<<2)|2,{46,97,0}}, +/* 23676 */ {(11<<2)|2,{46,97,0}}, +/* 23677 */ {(11<<2)|2,{46,97,0}}, +/* 23678 */ {(11<<2)|2,{46,97,0}}, +/* 23679 */ {(11<<2)|2,{46,97,0}}, +/* 23680 */ {(16<<2)|3,{46,99,48}}, +/* 23681 */ {(16<<2)|3,{46,99,49}}, +/* 23682 */ {(16<<2)|3,{46,99,50}}, +/* 23683 */ {(16<<2)|3,{46,99,97}}, +/* 23684 */ {(16<<2)|3,{46,99,99}}, +/* 23685 */ {(16<<2)|3,{46,99,101}}, +/* 23686 */ {(16<<2)|3,{46,99,105}}, +/* 23687 */ {(16<<2)|3,{46,99,111}}, +/* 23688 */ {(16<<2)|3,{46,99,115}}, +/* 23689 */ {(16<<2)|3,{46,99,116}}, +/* 23690 */ {(11<<2)|2,{46,99,0}}, +/* 23691 */ {(11<<2)|2,{46,99,0}}, +/* 23692 */ {(11<<2)|2,{46,99,0}}, +/* 23693 */ {(11<<2)|2,{46,99,0}}, +/* 23694 */ {(11<<2)|2,{46,99,0}}, +/* 23695 */ {(11<<2)|2,{46,99,0}}, +/* 23696 */ {(11<<2)|2,{46,99,0}}, +/* 23697 */ {(11<<2)|2,{46,99,0}}, +/* 23698 */ {(11<<2)|2,{46,99,0}}, +/* 23699 */ {(11<<2)|2,{46,99,0}}, +/* 23700 */ {(11<<2)|2,{46,99,0}}, +/* 23701 */ {(11<<2)|2,{46,99,0}}, +/* 23702 */ {(11<<2)|2,{46,99,0}}, +/* 23703 */ {(11<<2)|2,{46,99,0}}, +/* 23704 */ {(11<<2)|2,{46,99,0}}, +/* 23705 */ {(11<<2)|2,{46,99,0}}, +/* 23706 */ {(11<<2)|2,{46,99,0}}, +/* 23707 */ {(11<<2)|2,{46,99,0}}, +/* 23708 */ {(11<<2)|2,{46,99,0}}, +/* 23709 */ {(11<<2)|2,{46,99,0}}, +/* 23710 */ {(11<<2)|2,{46,99,0}}, +/* 23711 */ {(11<<2)|2,{46,99,0}}, +/* 23712 */ {(16<<2)|3,{46,101,48}}, +/* 23713 */ {(16<<2)|3,{46,101,49}}, +/* 23714 */ {(16<<2)|3,{46,101,50}}, +/* 23715 */ {(16<<2)|3,{46,101,97}}, +/* 23716 */ {(16<<2)|3,{46,101,99}}, +/* 23717 */ {(16<<2)|3,{46,101,101}}, +/* 23718 */ {(16<<2)|3,{46,101,105}}, +/* 23719 */ {(16<<2)|3,{46,101,111}}, +/* 23720 */ {(16<<2)|3,{46,101,115}}, +/* 23721 */ {(16<<2)|3,{46,101,116}}, +/* 23722 */ {(11<<2)|2,{46,101,0}}, +/* 23723 */ {(11<<2)|2,{46,101,0}}, +/* 23724 */ {(11<<2)|2,{46,101,0}}, +/* 23725 */ {(11<<2)|2,{46,101,0}}, +/* 23726 */ {(11<<2)|2,{46,101,0}}, +/* 23727 */ {(11<<2)|2,{46,101,0}}, +/* 23728 */ {(11<<2)|2,{46,101,0}}, +/* 23729 */ {(11<<2)|2,{46,101,0}}, +/* 23730 */ {(11<<2)|2,{46,101,0}}, +/* 23731 */ {(11<<2)|2,{46,101,0}}, +/* 23732 */ {(11<<2)|2,{46,101,0}}, +/* 23733 */ {(11<<2)|2,{46,101,0}}, +/* 23734 */ {(11<<2)|2,{46,101,0}}, +/* 23735 */ {(11<<2)|2,{46,101,0}}, +/* 23736 */ {(11<<2)|2,{46,101,0}}, +/* 23737 */ {(11<<2)|2,{46,101,0}}, +/* 23738 */ {(11<<2)|2,{46,101,0}}, +/* 23739 */ {(11<<2)|2,{46,101,0}}, +/* 23740 */ {(11<<2)|2,{46,101,0}}, +/* 23741 */ {(11<<2)|2,{46,101,0}}, +/* 23742 */ {(11<<2)|2,{46,101,0}}, +/* 23743 */ {(11<<2)|2,{46,101,0}}, +/* 23744 */ {(16<<2)|3,{46,105,48}}, +/* 23745 */ {(16<<2)|3,{46,105,49}}, +/* 23746 */ {(16<<2)|3,{46,105,50}}, +/* 23747 */ {(16<<2)|3,{46,105,97}}, +/* 23748 */ {(16<<2)|3,{46,105,99}}, +/* 23749 */ {(16<<2)|3,{46,105,101}}, +/* 23750 */ {(16<<2)|3,{46,105,105}}, +/* 23751 */ {(16<<2)|3,{46,105,111}}, +/* 23752 */ {(16<<2)|3,{46,105,115}}, +/* 23753 */ {(16<<2)|3,{46,105,116}}, +/* 23754 */ {(11<<2)|2,{46,105,0}}, +/* 23755 */ {(11<<2)|2,{46,105,0}}, +/* 23756 */ {(11<<2)|2,{46,105,0}}, +/* 23757 */ {(11<<2)|2,{46,105,0}}, +/* 23758 */ {(11<<2)|2,{46,105,0}}, +/* 23759 */ {(11<<2)|2,{46,105,0}}, +/* 23760 */ {(11<<2)|2,{46,105,0}}, +/* 23761 */ {(11<<2)|2,{46,105,0}}, +/* 23762 */ {(11<<2)|2,{46,105,0}}, +/* 23763 */ {(11<<2)|2,{46,105,0}}, +/* 23764 */ {(11<<2)|2,{46,105,0}}, +/* 23765 */ {(11<<2)|2,{46,105,0}}, +/* 23766 */ {(11<<2)|2,{46,105,0}}, +/* 23767 */ {(11<<2)|2,{46,105,0}}, +/* 23768 */ {(11<<2)|2,{46,105,0}}, +/* 23769 */ {(11<<2)|2,{46,105,0}}, +/* 23770 */ {(11<<2)|2,{46,105,0}}, +/* 23771 */ {(11<<2)|2,{46,105,0}}, +/* 23772 */ {(11<<2)|2,{46,105,0}}, +/* 23773 */ {(11<<2)|2,{46,105,0}}, +/* 23774 */ {(11<<2)|2,{46,105,0}}, +/* 23775 */ {(11<<2)|2,{46,105,0}}, +/* 23776 */ {(16<<2)|3,{46,111,48}}, +/* 23777 */ {(16<<2)|3,{46,111,49}}, +/* 23778 */ {(16<<2)|3,{46,111,50}}, +/* 23779 */ {(16<<2)|3,{46,111,97}}, +/* 23780 */ {(16<<2)|3,{46,111,99}}, +/* 23781 */ {(16<<2)|3,{46,111,101}}, +/* 23782 */ {(16<<2)|3,{46,111,105}}, +/* 23783 */ {(16<<2)|3,{46,111,111}}, +/* 23784 */ {(16<<2)|3,{46,111,115}}, +/* 23785 */ {(16<<2)|3,{46,111,116}}, +/* 23786 */ {(11<<2)|2,{46,111,0}}, +/* 23787 */ {(11<<2)|2,{46,111,0}}, +/* 23788 */ {(11<<2)|2,{46,111,0}}, +/* 23789 */ {(11<<2)|2,{46,111,0}}, +/* 23790 */ {(11<<2)|2,{46,111,0}}, +/* 23791 */ {(11<<2)|2,{46,111,0}}, +/* 23792 */ {(11<<2)|2,{46,111,0}}, +/* 23793 */ {(11<<2)|2,{46,111,0}}, +/* 23794 */ {(11<<2)|2,{46,111,0}}, +/* 23795 */ {(11<<2)|2,{46,111,0}}, +/* 23796 */ {(11<<2)|2,{46,111,0}}, +/* 23797 */ {(11<<2)|2,{46,111,0}}, +/* 23798 */ {(11<<2)|2,{46,111,0}}, +/* 23799 */ {(11<<2)|2,{46,111,0}}, +/* 23800 */ {(11<<2)|2,{46,111,0}}, +/* 23801 */ {(11<<2)|2,{46,111,0}}, +/* 23802 */ {(11<<2)|2,{46,111,0}}, +/* 23803 */ {(11<<2)|2,{46,111,0}}, +/* 23804 */ {(11<<2)|2,{46,111,0}}, +/* 23805 */ {(11<<2)|2,{46,111,0}}, +/* 23806 */ {(11<<2)|2,{46,111,0}}, +/* 23807 */ {(11<<2)|2,{46,111,0}}, +/* 23808 */ {(16<<2)|3,{46,115,48}}, +/* 23809 */ {(16<<2)|3,{46,115,49}}, +/* 23810 */ {(16<<2)|3,{46,115,50}}, +/* 23811 */ {(16<<2)|3,{46,115,97}}, +/* 23812 */ {(16<<2)|3,{46,115,99}}, +/* 23813 */ {(16<<2)|3,{46,115,101}}, +/* 23814 */ {(16<<2)|3,{46,115,105}}, +/* 23815 */ {(16<<2)|3,{46,115,111}}, +/* 23816 */ {(16<<2)|3,{46,115,115}}, +/* 23817 */ {(16<<2)|3,{46,115,116}}, +/* 23818 */ {(11<<2)|2,{46,115,0}}, +/* 23819 */ {(11<<2)|2,{46,115,0}}, +/* 23820 */ {(11<<2)|2,{46,115,0}}, +/* 23821 */ {(11<<2)|2,{46,115,0}}, +/* 23822 */ {(11<<2)|2,{46,115,0}}, +/* 23823 */ {(11<<2)|2,{46,115,0}}, +/* 23824 */ {(11<<2)|2,{46,115,0}}, +/* 23825 */ {(11<<2)|2,{46,115,0}}, +/* 23826 */ {(11<<2)|2,{46,115,0}}, +/* 23827 */ {(11<<2)|2,{46,115,0}}, +/* 23828 */ {(11<<2)|2,{46,115,0}}, +/* 23829 */ {(11<<2)|2,{46,115,0}}, +/* 23830 */ {(11<<2)|2,{46,115,0}}, +/* 23831 */ {(11<<2)|2,{46,115,0}}, +/* 23832 */ {(11<<2)|2,{46,115,0}}, +/* 23833 */ {(11<<2)|2,{46,115,0}}, +/* 23834 */ {(11<<2)|2,{46,115,0}}, +/* 23835 */ {(11<<2)|2,{46,115,0}}, +/* 23836 */ {(11<<2)|2,{46,115,0}}, +/* 23837 */ {(11<<2)|2,{46,115,0}}, +/* 23838 */ {(11<<2)|2,{46,115,0}}, +/* 23839 */ {(11<<2)|2,{46,115,0}}, +/* 23840 */ {(16<<2)|3,{46,116,48}}, +/* 23841 */ {(16<<2)|3,{46,116,49}}, +/* 23842 */ {(16<<2)|3,{46,116,50}}, +/* 23843 */ {(16<<2)|3,{46,116,97}}, +/* 23844 */ {(16<<2)|3,{46,116,99}}, +/* 23845 */ {(16<<2)|3,{46,116,101}}, +/* 23846 */ {(16<<2)|3,{46,116,105}}, +/* 23847 */ {(16<<2)|3,{46,116,111}}, +/* 23848 */ {(16<<2)|3,{46,116,115}}, +/* 23849 */ {(16<<2)|3,{46,116,116}}, +/* 23850 */ {(11<<2)|2,{46,116,0}}, +/* 23851 */ {(11<<2)|2,{46,116,0}}, +/* 23852 */ {(11<<2)|2,{46,116,0}}, +/* 23853 */ {(11<<2)|2,{46,116,0}}, +/* 23854 */ {(11<<2)|2,{46,116,0}}, +/* 23855 */ {(11<<2)|2,{46,116,0}}, +/* 23856 */ {(11<<2)|2,{46,116,0}}, +/* 23857 */ {(11<<2)|2,{46,116,0}}, +/* 23858 */ {(11<<2)|2,{46,116,0}}, +/* 23859 */ {(11<<2)|2,{46,116,0}}, +/* 23860 */ {(11<<2)|2,{46,116,0}}, +/* 23861 */ {(11<<2)|2,{46,116,0}}, +/* 23862 */ {(11<<2)|2,{46,116,0}}, +/* 23863 */ {(11<<2)|2,{46,116,0}}, +/* 23864 */ {(11<<2)|2,{46,116,0}}, +/* 23865 */ {(11<<2)|2,{46,116,0}}, +/* 23866 */ {(11<<2)|2,{46,116,0}}, +/* 23867 */ {(11<<2)|2,{46,116,0}}, +/* 23868 */ {(11<<2)|2,{46,116,0}}, +/* 23869 */ {(11<<2)|2,{46,116,0}}, +/* 23870 */ {(11<<2)|2,{46,116,0}}, +/* 23871 */ {(11<<2)|2,{46,116,0}}, +/* 23872 */ {(12<<2)|2,{46,32,0}}, +/* 23873 */ {(12<<2)|2,{46,32,0}}, +/* 23874 */ {(12<<2)|2,{46,32,0}}, +/* 23875 */ {(12<<2)|2,{46,32,0}}, +/* 23876 */ {(12<<2)|2,{46,32,0}}, +/* 23877 */ {(12<<2)|2,{46,32,0}}, +/* 23878 */ {(12<<2)|2,{46,32,0}}, +/* 23879 */ {(12<<2)|2,{46,32,0}}, +/* 23880 */ {(12<<2)|2,{46,32,0}}, +/* 23881 */ {(12<<2)|2,{46,32,0}}, +/* 23882 */ {(12<<2)|2,{46,32,0}}, +/* 23883 */ {(12<<2)|2,{46,32,0}}, +/* 23884 */ {(12<<2)|2,{46,32,0}}, +/* 23885 */ {(12<<2)|2,{46,32,0}}, +/* 23886 */ {(12<<2)|2,{46,32,0}}, +/* 23887 */ {(12<<2)|2,{46,32,0}}, +/* 23888 */ {(12<<2)|2,{46,37,0}}, +/* 23889 */ {(12<<2)|2,{46,37,0}}, +/* 23890 */ {(12<<2)|2,{46,37,0}}, +/* 23891 */ {(12<<2)|2,{46,37,0}}, +/* 23892 */ {(12<<2)|2,{46,37,0}}, +/* 23893 */ {(12<<2)|2,{46,37,0}}, +/* 23894 */ {(12<<2)|2,{46,37,0}}, +/* 23895 */ {(12<<2)|2,{46,37,0}}, +/* 23896 */ {(12<<2)|2,{46,37,0}}, +/* 23897 */ {(12<<2)|2,{46,37,0}}, +/* 23898 */ {(12<<2)|2,{46,37,0}}, +/* 23899 */ {(12<<2)|2,{46,37,0}}, +/* 23900 */ {(12<<2)|2,{46,37,0}}, +/* 23901 */ {(12<<2)|2,{46,37,0}}, +/* 23902 */ {(12<<2)|2,{46,37,0}}, +/* 23903 */ {(12<<2)|2,{46,37,0}}, +/* 23904 */ {(12<<2)|2,{46,45,0}}, +/* 23905 */ {(12<<2)|2,{46,45,0}}, +/* 23906 */ {(12<<2)|2,{46,45,0}}, +/* 23907 */ {(12<<2)|2,{46,45,0}}, +/* 23908 */ {(12<<2)|2,{46,45,0}}, +/* 23909 */ {(12<<2)|2,{46,45,0}}, +/* 23910 */ {(12<<2)|2,{46,45,0}}, +/* 23911 */ {(12<<2)|2,{46,45,0}}, +/* 23912 */ {(12<<2)|2,{46,45,0}}, +/* 23913 */ {(12<<2)|2,{46,45,0}}, +/* 23914 */ {(12<<2)|2,{46,45,0}}, +/* 23915 */ {(12<<2)|2,{46,45,0}}, +/* 23916 */ {(12<<2)|2,{46,45,0}}, +/* 23917 */ {(12<<2)|2,{46,45,0}}, +/* 23918 */ {(12<<2)|2,{46,45,0}}, +/* 23919 */ {(12<<2)|2,{46,45,0}}, +/* 23920 */ {(12<<2)|2,{46,46,0}}, +/* 23921 */ {(12<<2)|2,{46,46,0}}, +/* 23922 */ {(12<<2)|2,{46,46,0}}, +/* 23923 */ {(12<<2)|2,{46,46,0}}, +/* 23924 */ {(12<<2)|2,{46,46,0}}, +/* 23925 */ {(12<<2)|2,{46,46,0}}, +/* 23926 */ {(12<<2)|2,{46,46,0}}, +/* 23927 */ {(12<<2)|2,{46,46,0}}, +/* 23928 */ {(12<<2)|2,{46,46,0}}, +/* 23929 */ {(12<<2)|2,{46,46,0}}, +/* 23930 */ {(12<<2)|2,{46,46,0}}, +/* 23931 */ {(12<<2)|2,{46,46,0}}, +/* 23932 */ {(12<<2)|2,{46,46,0}}, +/* 23933 */ {(12<<2)|2,{46,46,0}}, +/* 23934 */ {(12<<2)|2,{46,46,0}}, +/* 23935 */ {(12<<2)|2,{46,46,0}}, +/* 23936 */ {(12<<2)|2,{46,47,0}}, +/* 23937 */ {(12<<2)|2,{46,47,0}}, +/* 23938 */ {(12<<2)|2,{46,47,0}}, +/* 23939 */ {(12<<2)|2,{46,47,0}}, +/* 23940 */ {(12<<2)|2,{46,47,0}}, +/* 23941 */ {(12<<2)|2,{46,47,0}}, +/* 23942 */ {(12<<2)|2,{46,47,0}}, +/* 23943 */ {(12<<2)|2,{46,47,0}}, +/* 23944 */ {(12<<2)|2,{46,47,0}}, +/* 23945 */ {(12<<2)|2,{46,47,0}}, +/* 23946 */ {(12<<2)|2,{46,47,0}}, +/* 23947 */ {(12<<2)|2,{46,47,0}}, +/* 23948 */ {(12<<2)|2,{46,47,0}}, +/* 23949 */ {(12<<2)|2,{46,47,0}}, +/* 23950 */ {(12<<2)|2,{46,47,0}}, +/* 23951 */ {(12<<2)|2,{46,47,0}}, +/* 23952 */ {(12<<2)|2,{46,51,0}}, +/* 23953 */ {(12<<2)|2,{46,51,0}}, +/* 23954 */ {(12<<2)|2,{46,51,0}}, +/* 23955 */ {(12<<2)|2,{46,51,0}}, +/* 23956 */ {(12<<2)|2,{46,51,0}}, +/* 23957 */ {(12<<2)|2,{46,51,0}}, +/* 23958 */ {(12<<2)|2,{46,51,0}}, +/* 23959 */ {(12<<2)|2,{46,51,0}}, +/* 23960 */ {(12<<2)|2,{46,51,0}}, +/* 23961 */ {(12<<2)|2,{46,51,0}}, +/* 23962 */ {(12<<2)|2,{46,51,0}}, +/* 23963 */ {(12<<2)|2,{46,51,0}}, +/* 23964 */ {(12<<2)|2,{46,51,0}}, +/* 23965 */ {(12<<2)|2,{46,51,0}}, +/* 23966 */ {(12<<2)|2,{46,51,0}}, +/* 23967 */ {(12<<2)|2,{46,51,0}}, +/* 23968 */ {(12<<2)|2,{46,52,0}}, +/* 23969 */ {(12<<2)|2,{46,52,0}}, +/* 23970 */ {(12<<2)|2,{46,52,0}}, +/* 23971 */ {(12<<2)|2,{46,52,0}}, +/* 23972 */ {(12<<2)|2,{46,52,0}}, +/* 23973 */ {(12<<2)|2,{46,52,0}}, +/* 23974 */ {(12<<2)|2,{46,52,0}}, +/* 23975 */ {(12<<2)|2,{46,52,0}}, +/* 23976 */ {(12<<2)|2,{46,52,0}}, +/* 23977 */ {(12<<2)|2,{46,52,0}}, +/* 23978 */ {(12<<2)|2,{46,52,0}}, +/* 23979 */ {(12<<2)|2,{46,52,0}}, +/* 23980 */ {(12<<2)|2,{46,52,0}}, +/* 23981 */ {(12<<2)|2,{46,52,0}}, +/* 23982 */ {(12<<2)|2,{46,52,0}}, +/* 23983 */ {(12<<2)|2,{46,52,0}}, +/* 23984 */ {(12<<2)|2,{46,53,0}}, +/* 23985 */ {(12<<2)|2,{46,53,0}}, +/* 23986 */ {(12<<2)|2,{46,53,0}}, +/* 23987 */ {(12<<2)|2,{46,53,0}}, +/* 23988 */ {(12<<2)|2,{46,53,0}}, +/* 23989 */ {(12<<2)|2,{46,53,0}}, +/* 23990 */ {(12<<2)|2,{46,53,0}}, +/* 23991 */ {(12<<2)|2,{46,53,0}}, +/* 23992 */ {(12<<2)|2,{46,53,0}}, +/* 23993 */ {(12<<2)|2,{46,53,0}}, +/* 23994 */ {(12<<2)|2,{46,53,0}}, +/* 23995 */ {(12<<2)|2,{46,53,0}}, +/* 23996 */ {(12<<2)|2,{46,53,0}}, +/* 23997 */ {(12<<2)|2,{46,53,0}}, +/* 23998 */ {(12<<2)|2,{46,53,0}}, +/* 23999 */ {(12<<2)|2,{46,53,0}}, +/* 24000 */ {(12<<2)|2,{46,54,0}}, +/* 24001 */ {(12<<2)|2,{46,54,0}}, +/* 24002 */ {(12<<2)|2,{46,54,0}}, +/* 24003 */ {(12<<2)|2,{46,54,0}}, +/* 24004 */ {(12<<2)|2,{46,54,0}}, +/* 24005 */ {(12<<2)|2,{46,54,0}}, +/* 24006 */ {(12<<2)|2,{46,54,0}}, +/* 24007 */ {(12<<2)|2,{46,54,0}}, +/* 24008 */ {(12<<2)|2,{46,54,0}}, +/* 24009 */ {(12<<2)|2,{46,54,0}}, +/* 24010 */ {(12<<2)|2,{46,54,0}}, +/* 24011 */ {(12<<2)|2,{46,54,0}}, +/* 24012 */ {(12<<2)|2,{46,54,0}}, +/* 24013 */ {(12<<2)|2,{46,54,0}}, +/* 24014 */ {(12<<2)|2,{46,54,0}}, +/* 24015 */ {(12<<2)|2,{46,54,0}}, +/* 24016 */ {(12<<2)|2,{46,55,0}}, +/* 24017 */ {(12<<2)|2,{46,55,0}}, +/* 24018 */ {(12<<2)|2,{46,55,0}}, +/* 24019 */ {(12<<2)|2,{46,55,0}}, +/* 24020 */ {(12<<2)|2,{46,55,0}}, +/* 24021 */ {(12<<2)|2,{46,55,0}}, +/* 24022 */ {(12<<2)|2,{46,55,0}}, +/* 24023 */ {(12<<2)|2,{46,55,0}}, +/* 24024 */ {(12<<2)|2,{46,55,0}}, +/* 24025 */ {(12<<2)|2,{46,55,0}}, +/* 24026 */ {(12<<2)|2,{46,55,0}}, +/* 24027 */ {(12<<2)|2,{46,55,0}}, +/* 24028 */ {(12<<2)|2,{46,55,0}}, +/* 24029 */ {(12<<2)|2,{46,55,0}}, +/* 24030 */ {(12<<2)|2,{46,55,0}}, +/* 24031 */ {(12<<2)|2,{46,55,0}}, +/* 24032 */ {(12<<2)|2,{46,56,0}}, +/* 24033 */ {(12<<2)|2,{46,56,0}}, +/* 24034 */ {(12<<2)|2,{46,56,0}}, +/* 24035 */ {(12<<2)|2,{46,56,0}}, +/* 24036 */ {(12<<2)|2,{46,56,0}}, +/* 24037 */ {(12<<2)|2,{46,56,0}}, +/* 24038 */ {(12<<2)|2,{46,56,0}}, +/* 24039 */ {(12<<2)|2,{46,56,0}}, +/* 24040 */ {(12<<2)|2,{46,56,0}}, +/* 24041 */ {(12<<2)|2,{46,56,0}}, +/* 24042 */ {(12<<2)|2,{46,56,0}}, +/* 24043 */ {(12<<2)|2,{46,56,0}}, +/* 24044 */ {(12<<2)|2,{46,56,0}}, +/* 24045 */ {(12<<2)|2,{46,56,0}}, +/* 24046 */ {(12<<2)|2,{46,56,0}}, +/* 24047 */ {(12<<2)|2,{46,56,0}}, +/* 24048 */ {(12<<2)|2,{46,57,0}}, +/* 24049 */ {(12<<2)|2,{46,57,0}}, +/* 24050 */ {(12<<2)|2,{46,57,0}}, +/* 24051 */ {(12<<2)|2,{46,57,0}}, +/* 24052 */ {(12<<2)|2,{46,57,0}}, +/* 24053 */ {(12<<2)|2,{46,57,0}}, +/* 24054 */ {(12<<2)|2,{46,57,0}}, +/* 24055 */ {(12<<2)|2,{46,57,0}}, +/* 24056 */ {(12<<2)|2,{46,57,0}}, +/* 24057 */ {(12<<2)|2,{46,57,0}}, +/* 24058 */ {(12<<2)|2,{46,57,0}}, +/* 24059 */ {(12<<2)|2,{46,57,0}}, +/* 24060 */ {(12<<2)|2,{46,57,0}}, +/* 24061 */ {(12<<2)|2,{46,57,0}}, +/* 24062 */ {(12<<2)|2,{46,57,0}}, +/* 24063 */ {(12<<2)|2,{46,57,0}}, +/* 24064 */ {(12<<2)|2,{46,61,0}}, +/* 24065 */ {(12<<2)|2,{46,61,0}}, +/* 24066 */ {(12<<2)|2,{46,61,0}}, +/* 24067 */ {(12<<2)|2,{46,61,0}}, +/* 24068 */ {(12<<2)|2,{46,61,0}}, +/* 24069 */ {(12<<2)|2,{46,61,0}}, +/* 24070 */ {(12<<2)|2,{46,61,0}}, +/* 24071 */ {(12<<2)|2,{46,61,0}}, +/* 24072 */ {(12<<2)|2,{46,61,0}}, +/* 24073 */ {(12<<2)|2,{46,61,0}}, +/* 24074 */ {(12<<2)|2,{46,61,0}}, +/* 24075 */ {(12<<2)|2,{46,61,0}}, +/* 24076 */ {(12<<2)|2,{46,61,0}}, +/* 24077 */ {(12<<2)|2,{46,61,0}}, +/* 24078 */ {(12<<2)|2,{46,61,0}}, +/* 24079 */ {(12<<2)|2,{46,61,0}}, +/* 24080 */ {(12<<2)|2,{46,65,0}}, +/* 24081 */ {(12<<2)|2,{46,65,0}}, +/* 24082 */ {(12<<2)|2,{46,65,0}}, +/* 24083 */ {(12<<2)|2,{46,65,0}}, +/* 24084 */ {(12<<2)|2,{46,65,0}}, +/* 24085 */ {(12<<2)|2,{46,65,0}}, +/* 24086 */ {(12<<2)|2,{46,65,0}}, +/* 24087 */ {(12<<2)|2,{46,65,0}}, +/* 24088 */ {(12<<2)|2,{46,65,0}}, +/* 24089 */ {(12<<2)|2,{46,65,0}}, +/* 24090 */ {(12<<2)|2,{46,65,0}}, +/* 24091 */ {(12<<2)|2,{46,65,0}}, +/* 24092 */ {(12<<2)|2,{46,65,0}}, +/* 24093 */ {(12<<2)|2,{46,65,0}}, +/* 24094 */ {(12<<2)|2,{46,65,0}}, +/* 24095 */ {(12<<2)|2,{46,65,0}}, +/* 24096 */ {(12<<2)|2,{46,95,0}}, +/* 24097 */ {(12<<2)|2,{46,95,0}}, +/* 24098 */ {(12<<2)|2,{46,95,0}}, +/* 24099 */ {(12<<2)|2,{46,95,0}}, +/* 24100 */ {(12<<2)|2,{46,95,0}}, +/* 24101 */ {(12<<2)|2,{46,95,0}}, +/* 24102 */ {(12<<2)|2,{46,95,0}}, +/* 24103 */ {(12<<2)|2,{46,95,0}}, +/* 24104 */ {(12<<2)|2,{46,95,0}}, +/* 24105 */ {(12<<2)|2,{46,95,0}}, +/* 24106 */ {(12<<2)|2,{46,95,0}}, +/* 24107 */ {(12<<2)|2,{46,95,0}}, +/* 24108 */ {(12<<2)|2,{46,95,0}}, +/* 24109 */ {(12<<2)|2,{46,95,0}}, +/* 24110 */ {(12<<2)|2,{46,95,0}}, +/* 24111 */ {(12<<2)|2,{46,95,0}}, +/* 24112 */ {(12<<2)|2,{46,98,0}}, +/* 24113 */ {(12<<2)|2,{46,98,0}}, +/* 24114 */ {(12<<2)|2,{46,98,0}}, +/* 24115 */ {(12<<2)|2,{46,98,0}}, +/* 24116 */ {(12<<2)|2,{46,98,0}}, +/* 24117 */ {(12<<2)|2,{46,98,0}}, +/* 24118 */ {(12<<2)|2,{46,98,0}}, +/* 24119 */ {(12<<2)|2,{46,98,0}}, +/* 24120 */ {(12<<2)|2,{46,98,0}}, +/* 24121 */ {(12<<2)|2,{46,98,0}}, +/* 24122 */ {(12<<2)|2,{46,98,0}}, +/* 24123 */ {(12<<2)|2,{46,98,0}}, +/* 24124 */ {(12<<2)|2,{46,98,0}}, +/* 24125 */ {(12<<2)|2,{46,98,0}}, +/* 24126 */ {(12<<2)|2,{46,98,0}}, +/* 24127 */ {(12<<2)|2,{46,98,0}}, +/* 24128 */ {(12<<2)|2,{46,100,0}}, +/* 24129 */ {(12<<2)|2,{46,100,0}}, +/* 24130 */ {(12<<2)|2,{46,100,0}}, +/* 24131 */ {(12<<2)|2,{46,100,0}}, +/* 24132 */ {(12<<2)|2,{46,100,0}}, +/* 24133 */ {(12<<2)|2,{46,100,0}}, +/* 24134 */ {(12<<2)|2,{46,100,0}}, +/* 24135 */ {(12<<2)|2,{46,100,0}}, +/* 24136 */ {(12<<2)|2,{46,100,0}}, +/* 24137 */ {(12<<2)|2,{46,100,0}}, +/* 24138 */ {(12<<2)|2,{46,100,0}}, +/* 24139 */ {(12<<2)|2,{46,100,0}}, +/* 24140 */ {(12<<2)|2,{46,100,0}}, +/* 24141 */ {(12<<2)|2,{46,100,0}}, +/* 24142 */ {(12<<2)|2,{46,100,0}}, +/* 24143 */ {(12<<2)|2,{46,100,0}}, +/* 24144 */ {(12<<2)|2,{46,102,0}}, +/* 24145 */ {(12<<2)|2,{46,102,0}}, +/* 24146 */ {(12<<2)|2,{46,102,0}}, +/* 24147 */ {(12<<2)|2,{46,102,0}}, +/* 24148 */ {(12<<2)|2,{46,102,0}}, +/* 24149 */ {(12<<2)|2,{46,102,0}}, +/* 24150 */ {(12<<2)|2,{46,102,0}}, +/* 24151 */ {(12<<2)|2,{46,102,0}}, +/* 24152 */ {(12<<2)|2,{46,102,0}}, +/* 24153 */ {(12<<2)|2,{46,102,0}}, +/* 24154 */ {(12<<2)|2,{46,102,0}}, +/* 24155 */ {(12<<2)|2,{46,102,0}}, +/* 24156 */ {(12<<2)|2,{46,102,0}}, +/* 24157 */ {(12<<2)|2,{46,102,0}}, +/* 24158 */ {(12<<2)|2,{46,102,0}}, +/* 24159 */ {(12<<2)|2,{46,102,0}}, +/* 24160 */ {(12<<2)|2,{46,103,0}}, +/* 24161 */ {(12<<2)|2,{46,103,0}}, +/* 24162 */ {(12<<2)|2,{46,103,0}}, +/* 24163 */ {(12<<2)|2,{46,103,0}}, +/* 24164 */ {(12<<2)|2,{46,103,0}}, +/* 24165 */ {(12<<2)|2,{46,103,0}}, +/* 24166 */ {(12<<2)|2,{46,103,0}}, +/* 24167 */ {(12<<2)|2,{46,103,0}}, +/* 24168 */ {(12<<2)|2,{46,103,0}}, +/* 24169 */ {(12<<2)|2,{46,103,0}}, +/* 24170 */ {(12<<2)|2,{46,103,0}}, +/* 24171 */ {(12<<2)|2,{46,103,0}}, +/* 24172 */ {(12<<2)|2,{46,103,0}}, +/* 24173 */ {(12<<2)|2,{46,103,0}}, +/* 24174 */ {(12<<2)|2,{46,103,0}}, +/* 24175 */ {(12<<2)|2,{46,103,0}}, +/* 24176 */ {(12<<2)|2,{46,104,0}}, +/* 24177 */ {(12<<2)|2,{46,104,0}}, +/* 24178 */ {(12<<2)|2,{46,104,0}}, +/* 24179 */ {(12<<2)|2,{46,104,0}}, +/* 24180 */ {(12<<2)|2,{46,104,0}}, +/* 24181 */ {(12<<2)|2,{46,104,0}}, +/* 24182 */ {(12<<2)|2,{46,104,0}}, +/* 24183 */ {(12<<2)|2,{46,104,0}}, +/* 24184 */ {(12<<2)|2,{46,104,0}}, +/* 24185 */ {(12<<2)|2,{46,104,0}}, +/* 24186 */ {(12<<2)|2,{46,104,0}}, +/* 24187 */ {(12<<2)|2,{46,104,0}}, +/* 24188 */ {(12<<2)|2,{46,104,0}}, +/* 24189 */ {(12<<2)|2,{46,104,0}}, +/* 24190 */ {(12<<2)|2,{46,104,0}}, +/* 24191 */ {(12<<2)|2,{46,104,0}}, +/* 24192 */ {(12<<2)|2,{46,108,0}}, +/* 24193 */ {(12<<2)|2,{46,108,0}}, +/* 24194 */ {(12<<2)|2,{46,108,0}}, +/* 24195 */ {(12<<2)|2,{46,108,0}}, +/* 24196 */ {(12<<2)|2,{46,108,0}}, +/* 24197 */ {(12<<2)|2,{46,108,0}}, +/* 24198 */ {(12<<2)|2,{46,108,0}}, +/* 24199 */ {(12<<2)|2,{46,108,0}}, +/* 24200 */ {(12<<2)|2,{46,108,0}}, +/* 24201 */ {(12<<2)|2,{46,108,0}}, +/* 24202 */ {(12<<2)|2,{46,108,0}}, +/* 24203 */ {(12<<2)|2,{46,108,0}}, +/* 24204 */ {(12<<2)|2,{46,108,0}}, +/* 24205 */ {(12<<2)|2,{46,108,0}}, +/* 24206 */ {(12<<2)|2,{46,108,0}}, +/* 24207 */ {(12<<2)|2,{46,108,0}}, +/* 24208 */ {(12<<2)|2,{46,109,0}}, +/* 24209 */ {(12<<2)|2,{46,109,0}}, +/* 24210 */ {(12<<2)|2,{46,109,0}}, +/* 24211 */ {(12<<2)|2,{46,109,0}}, +/* 24212 */ {(12<<2)|2,{46,109,0}}, +/* 24213 */ {(12<<2)|2,{46,109,0}}, +/* 24214 */ {(12<<2)|2,{46,109,0}}, +/* 24215 */ {(12<<2)|2,{46,109,0}}, +/* 24216 */ {(12<<2)|2,{46,109,0}}, +/* 24217 */ {(12<<2)|2,{46,109,0}}, +/* 24218 */ {(12<<2)|2,{46,109,0}}, +/* 24219 */ {(12<<2)|2,{46,109,0}}, +/* 24220 */ {(12<<2)|2,{46,109,0}}, +/* 24221 */ {(12<<2)|2,{46,109,0}}, +/* 24222 */ {(12<<2)|2,{46,109,0}}, +/* 24223 */ {(12<<2)|2,{46,109,0}}, +/* 24224 */ {(12<<2)|2,{46,110,0}}, +/* 24225 */ {(12<<2)|2,{46,110,0}}, +/* 24226 */ {(12<<2)|2,{46,110,0}}, +/* 24227 */ {(12<<2)|2,{46,110,0}}, +/* 24228 */ {(12<<2)|2,{46,110,0}}, +/* 24229 */ {(12<<2)|2,{46,110,0}}, +/* 24230 */ {(12<<2)|2,{46,110,0}}, +/* 24231 */ {(12<<2)|2,{46,110,0}}, +/* 24232 */ {(12<<2)|2,{46,110,0}}, +/* 24233 */ {(12<<2)|2,{46,110,0}}, +/* 24234 */ {(12<<2)|2,{46,110,0}}, +/* 24235 */ {(12<<2)|2,{46,110,0}}, +/* 24236 */ {(12<<2)|2,{46,110,0}}, +/* 24237 */ {(12<<2)|2,{46,110,0}}, +/* 24238 */ {(12<<2)|2,{46,110,0}}, +/* 24239 */ {(12<<2)|2,{46,110,0}}, +/* 24240 */ {(12<<2)|2,{46,112,0}}, +/* 24241 */ {(12<<2)|2,{46,112,0}}, +/* 24242 */ {(12<<2)|2,{46,112,0}}, +/* 24243 */ {(12<<2)|2,{46,112,0}}, +/* 24244 */ {(12<<2)|2,{46,112,0}}, +/* 24245 */ {(12<<2)|2,{46,112,0}}, +/* 24246 */ {(12<<2)|2,{46,112,0}}, +/* 24247 */ {(12<<2)|2,{46,112,0}}, +/* 24248 */ {(12<<2)|2,{46,112,0}}, +/* 24249 */ {(12<<2)|2,{46,112,0}}, +/* 24250 */ {(12<<2)|2,{46,112,0}}, +/* 24251 */ {(12<<2)|2,{46,112,0}}, +/* 24252 */ {(12<<2)|2,{46,112,0}}, +/* 24253 */ {(12<<2)|2,{46,112,0}}, +/* 24254 */ {(12<<2)|2,{46,112,0}}, +/* 24255 */ {(12<<2)|2,{46,112,0}}, +/* 24256 */ {(12<<2)|2,{46,114,0}}, +/* 24257 */ {(12<<2)|2,{46,114,0}}, +/* 24258 */ {(12<<2)|2,{46,114,0}}, +/* 24259 */ {(12<<2)|2,{46,114,0}}, +/* 24260 */ {(12<<2)|2,{46,114,0}}, +/* 24261 */ {(12<<2)|2,{46,114,0}}, +/* 24262 */ {(12<<2)|2,{46,114,0}}, +/* 24263 */ {(12<<2)|2,{46,114,0}}, +/* 24264 */ {(12<<2)|2,{46,114,0}}, +/* 24265 */ {(12<<2)|2,{46,114,0}}, +/* 24266 */ {(12<<2)|2,{46,114,0}}, +/* 24267 */ {(12<<2)|2,{46,114,0}}, +/* 24268 */ {(12<<2)|2,{46,114,0}}, +/* 24269 */ {(12<<2)|2,{46,114,0}}, +/* 24270 */ {(12<<2)|2,{46,114,0}}, +/* 24271 */ {(12<<2)|2,{46,114,0}}, +/* 24272 */ {(12<<2)|2,{46,117,0}}, +/* 24273 */ {(12<<2)|2,{46,117,0}}, +/* 24274 */ {(12<<2)|2,{46,117,0}}, +/* 24275 */ {(12<<2)|2,{46,117,0}}, +/* 24276 */ {(12<<2)|2,{46,117,0}}, +/* 24277 */ {(12<<2)|2,{46,117,0}}, +/* 24278 */ {(12<<2)|2,{46,117,0}}, +/* 24279 */ {(12<<2)|2,{46,117,0}}, +/* 24280 */ {(12<<2)|2,{46,117,0}}, +/* 24281 */ {(12<<2)|2,{46,117,0}}, +/* 24282 */ {(12<<2)|2,{46,117,0}}, +/* 24283 */ {(12<<2)|2,{46,117,0}}, +/* 24284 */ {(12<<2)|2,{46,117,0}}, +/* 24285 */ {(12<<2)|2,{46,117,0}}, +/* 24286 */ {(12<<2)|2,{46,117,0}}, +/* 24287 */ {(12<<2)|2,{46,117,0}}, +/* 24288 */ {(13<<2)|2,{46,58,0}}, +/* 24289 */ {(13<<2)|2,{46,58,0}}, +/* 24290 */ {(13<<2)|2,{46,58,0}}, +/* 24291 */ {(13<<2)|2,{46,58,0}}, +/* 24292 */ {(13<<2)|2,{46,58,0}}, +/* 24293 */ {(13<<2)|2,{46,58,0}}, +/* 24294 */ {(13<<2)|2,{46,58,0}}, +/* 24295 */ {(13<<2)|2,{46,58,0}}, +/* 24296 */ {(13<<2)|2,{46,66,0}}, +/* 24297 */ {(13<<2)|2,{46,66,0}}, +/* 24298 */ {(13<<2)|2,{46,66,0}}, +/* 24299 */ {(13<<2)|2,{46,66,0}}, +/* 24300 */ {(13<<2)|2,{46,66,0}}, +/* 24301 */ {(13<<2)|2,{46,66,0}}, +/* 24302 */ {(13<<2)|2,{46,66,0}}, +/* 24303 */ {(13<<2)|2,{46,66,0}}, +/* 24304 */ {(13<<2)|2,{46,67,0}}, +/* 24305 */ {(13<<2)|2,{46,67,0}}, +/* 24306 */ {(13<<2)|2,{46,67,0}}, +/* 24307 */ {(13<<2)|2,{46,67,0}}, +/* 24308 */ {(13<<2)|2,{46,67,0}}, +/* 24309 */ {(13<<2)|2,{46,67,0}}, +/* 24310 */ {(13<<2)|2,{46,67,0}}, +/* 24311 */ {(13<<2)|2,{46,67,0}}, +/* 24312 */ {(13<<2)|2,{46,68,0}}, +/* 24313 */ {(13<<2)|2,{46,68,0}}, +/* 24314 */ {(13<<2)|2,{46,68,0}}, +/* 24315 */ {(13<<2)|2,{46,68,0}}, +/* 24316 */ {(13<<2)|2,{46,68,0}}, +/* 24317 */ {(13<<2)|2,{46,68,0}}, +/* 24318 */ {(13<<2)|2,{46,68,0}}, +/* 24319 */ {(13<<2)|2,{46,68,0}}, +/* 24320 */ {(13<<2)|2,{46,69,0}}, +/* 24321 */ {(13<<2)|2,{46,69,0}}, +/* 24322 */ {(13<<2)|2,{46,69,0}}, +/* 24323 */ {(13<<2)|2,{46,69,0}}, +/* 24324 */ {(13<<2)|2,{46,69,0}}, +/* 24325 */ {(13<<2)|2,{46,69,0}}, +/* 24326 */ {(13<<2)|2,{46,69,0}}, +/* 24327 */ {(13<<2)|2,{46,69,0}}, +/* 24328 */ {(13<<2)|2,{46,70,0}}, +/* 24329 */ {(13<<2)|2,{46,70,0}}, +/* 24330 */ {(13<<2)|2,{46,70,0}}, +/* 24331 */ {(13<<2)|2,{46,70,0}}, +/* 24332 */ {(13<<2)|2,{46,70,0}}, +/* 24333 */ {(13<<2)|2,{46,70,0}}, +/* 24334 */ {(13<<2)|2,{46,70,0}}, +/* 24335 */ {(13<<2)|2,{46,70,0}}, +/* 24336 */ {(13<<2)|2,{46,71,0}}, +/* 24337 */ {(13<<2)|2,{46,71,0}}, +/* 24338 */ {(13<<2)|2,{46,71,0}}, +/* 24339 */ {(13<<2)|2,{46,71,0}}, +/* 24340 */ {(13<<2)|2,{46,71,0}}, +/* 24341 */ {(13<<2)|2,{46,71,0}}, +/* 24342 */ {(13<<2)|2,{46,71,0}}, +/* 24343 */ {(13<<2)|2,{46,71,0}}, +/* 24344 */ {(13<<2)|2,{46,72,0}}, +/* 24345 */ {(13<<2)|2,{46,72,0}}, +/* 24346 */ {(13<<2)|2,{46,72,0}}, +/* 24347 */ {(13<<2)|2,{46,72,0}}, +/* 24348 */ {(13<<2)|2,{46,72,0}}, +/* 24349 */ {(13<<2)|2,{46,72,0}}, +/* 24350 */ {(13<<2)|2,{46,72,0}}, +/* 24351 */ {(13<<2)|2,{46,72,0}}, +/* 24352 */ {(13<<2)|2,{46,73,0}}, +/* 24353 */ {(13<<2)|2,{46,73,0}}, +/* 24354 */ {(13<<2)|2,{46,73,0}}, +/* 24355 */ {(13<<2)|2,{46,73,0}}, +/* 24356 */ {(13<<2)|2,{46,73,0}}, +/* 24357 */ {(13<<2)|2,{46,73,0}}, +/* 24358 */ {(13<<2)|2,{46,73,0}}, +/* 24359 */ {(13<<2)|2,{46,73,0}}, +/* 24360 */ {(13<<2)|2,{46,74,0}}, +/* 24361 */ {(13<<2)|2,{46,74,0}}, +/* 24362 */ {(13<<2)|2,{46,74,0}}, +/* 24363 */ {(13<<2)|2,{46,74,0}}, +/* 24364 */ {(13<<2)|2,{46,74,0}}, +/* 24365 */ {(13<<2)|2,{46,74,0}}, +/* 24366 */ {(13<<2)|2,{46,74,0}}, +/* 24367 */ {(13<<2)|2,{46,74,0}}, +/* 24368 */ {(13<<2)|2,{46,75,0}}, +/* 24369 */ {(13<<2)|2,{46,75,0}}, +/* 24370 */ {(13<<2)|2,{46,75,0}}, +/* 24371 */ {(13<<2)|2,{46,75,0}}, +/* 24372 */ {(13<<2)|2,{46,75,0}}, +/* 24373 */ {(13<<2)|2,{46,75,0}}, +/* 24374 */ {(13<<2)|2,{46,75,0}}, +/* 24375 */ {(13<<2)|2,{46,75,0}}, +/* 24376 */ {(13<<2)|2,{46,76,0}}, +/* 24377 */ {(13<<2)|2,{46,76,0}}, +/* 24378 */ {(13<<2)|2,{46,76,0}}, +/* 24379 */ {(13<<2)|2,{46,76,0}}, +/* 24380 */ {(13<<2)|2,{46,76,0}}, +/* 24381 */ {(13<<2)|2,{46,76,0}}, +/* 24382 */ {(13<<2)|2,{46,76,0}}, +/* 24383 */ {(13<<2)|2,{46,76,0}}, +/* 24384 */ {(13<<2)|2,{46,77,0}}, +/* 24385 */ {(13<<2)|2,{46,77,0}}, +/* 24386 */ {(13<<2)|2,{46,77,0}}, +/* 24387 */ {(13<<2)|2,{46,77,0}}, +/* 24388 */ {(13<<2)|2,{46,77,0}}, +/* 24389 */ {(13<<2)|2,{46,77,0}}, +/* 24390 */ {(13<<2)|2,{46,77,0}}, +/* 24391 */ {(13<<2)|2,{46,77,0}}, +/* 24392 */ {(13<<2)|2,{46,78,0}}, +/* 24393 */ {(13<<2)|2,{46,78,0}}, +/* 24394 */ {(13<<2)|2,{46,78,0}}, +/* 24395 */ {(13<<2)|2,{46,78,0}}, +/* 24396 */ {(13<<2)|2,{46,78,0}}, +/* 24397 */ {(13<<2)|2,{46,78,0}}, +/* 24398 */ {(13<<2)|2,{46,78,0}}, +/* 24399 */ {(13<<2)|2,{46,78,0}}, +/* 24400 */ {(13<<2)|2,{46,79,0}}, +/* 24401 */ {(13<<2)|2,{46,79,0}}, +/* 24402 */ {(13<<2)|2,{46,79,0}}, +/* 24403 */ {(13<<2)|2,{46,79,0}}, +/* 24404 */ {(13<<2)|2,{46,79,0}}, +/* 24405 */ {(13<<2)|2,{46,79,0}}, +/* 24406 */ {(13<<2)|2,{46,79,0}}, +/* 24407 */ {(13<<2)|2,{46,79,0}}, +/* 24408 */ {(13<<2)|2,{46,80,0}}, +/* 24409 */ {(13<<2)|2,{46,80,0}}, +/* 24410 */ {(13<<2)|2,{46,80,0}}, +/* 24411 */ {(13<<2)|2,{46,80,0}}, +/* 24412 */ {(13<<2)|2,{46,80,0}}, +/* 24413 */ {(13<<2)|2,{46,80,0}}, +/* 24414 */ {(13<<2)|2,{46,80,0}}, +/* 24415 */ {(13<<2)|2,{46,80,0}}, +/* 24416 */ {(13<<2)|2,{46,81,0}}, +/* 24417 */ {(13<<2)|2,{46,81,0}}, +/* 24418 */ {(13<<2)|2,{46,81,0}}, +/* 24419 */ {(13<<2)|2,{46,81,0}}, +/* 24420 */ {(13<<2)|2,{46,81,0}}, +/* 24421 */ {(13<<2)|2,{46,81,0}}, +/* 24422 */ {(13<<2)|2,{46,81,0}}, +/* 24423 */ {(13<<2)|2,{46,81,0}}, +/* 24424 */ {(13<<2)|2,{46,82,0}}, +/* 24425 */ {(13<<2)|2,{46,82,0}}, +/* 24426 */ {(13<<2)|2,{46,82,0}}, +/* 24427 */ {(13<<2)|2,{46,82,0}}, +/* 24428 */ {(13<<2)|2,{46,82,0}}, +/* 24429 */ {(13<<2)|2,{46,82,0}}, +/* 24430 */ {(13<<2)|2,{46,82,0}}, +/* 24431 */ {(13<<2)|2,{46,82,0}}, +/* 24432 */ {(13<<2)|2,{46,83,0}}, +/* 24433 */ {(13<<2)|2,{46,83,0}}, +/* 24434 */ {(13<<2)|2,{46,83,0}}, +/* 24435 */ {(13<<2)|2,{46,83,0}}, +/* 24436 */ {(13<<2)|2,{46,83,0}}, +/* 24437 */ {(13<<2)|2,{46,83,0}}, +/* 24438 */ {(13<<2)|2,{46,83,0}}, +/* 24439 */ {(13<<2)|2,{46,83,0}}, +/* 24440 */ {(13<<2)|2,{46,84,0}}, +/* 24441 */ {(13<<2)|2,{46,84,0}}, +/* 24442 */ {(13<<2)|2,{46,84,0}}, +/* 24443 */ {(13<<2)|2,{46,84,0}}, +/* 24444 */ {(13<<2)|2,{46,84,0}}, +/* 24445 */ {(13<<2)|2,{46,84,0}}, +/* 24446 */ {(13<<2)|2,{46,84,0}}, +/* 24447 */ {(13<<2)|2,{46,84,0}}, +/* 24448 */ {(13<<2)|2,{46,85,0}}, +/* 24449 */ {(13<<2)|2,{46,85,0}}, +/* 24450 */ {(13<<2)|2,{46,85,0}}, +/* 24451 */ {(13<<2)|2,{46,85,0}}, +/* 24452 */ {(13<<2)|2,{46,85,0}}, +/* 24453 */ {(13<<2)|2,{46,85,0}}, +/* 24454 */ {(13<<2)|2,{46,85,0}}, +/* 24455 */ {(13<<2)|2,{46,85,0}}, +/* 24456 */ {(13<<2)|2,{46,86,0}}, +/* 24457 */ {(13<<2)|2,{46,86,0}}, +/* 24458 */ {(13<<2)|2,{46,86,0}}, +/* 24459 */ {(13<<2)|2,{46,86,0}}, +/* 24460 */ {(13<<2)|2,{46,86,0}}, +/* 24461 */ {(13<<2)|2,{46,86,0}}, +/* 24462 */ {(13<<2)|2,{46,86,0}}, +/* 24463 */ {(13<<2)|2,{46,86,0}}, +/* 24464 */ {(13<<2)|2,{46,87,0}}, +/* 24465 */ {(13<<2)|2,{46,87,0}}, +/* 24466 */ {(13<<2)|2,{46,87,0}}, +/* 24467 */ {(13<<2)|2,{46,87,0}}, +/* 24468 */ {(13<<2)|2,{46,87,0}}, +/* 24469 */ {(13<<2)|2,{46,87,0}}, +/* 24470 */ {(13<<2)|2,{46,87,0}}, +/* 24471 */ {(13<<2)|2,{46,87,0}}, +/* 24472 */ {(13<<2)|2,{46,89,0}}, +/* 24473 */ {(13<<2)|2,{46,89,0}}, +/* 24474 */ {(13<<2)|2,{46,89,0}}, +/* 24475 */ {(13<<2)|2,{46,89,0}}, +/* 24476 */ {(13<<2)|2,{46,89,0}}, +/* 24477 */ {(13<<2)|2,{46,89,0}}, +/* 24478 */ {(13<<2)|2,{46,89,0}}, +/* 24479 */ {(13<<2)|2,{46,89,0}}, +/* 24480 */ {(13<<2)|2,{46,106,0}}, +/* 24481 */ {(13<<2)|2,{46,106,0}}, +/* 24482 */ {(13<<2)|2,{46,106,0}}, +/* 24483 */ {(13<<2)|2,{46,106,0}}, +/* 24484 */ {(13<<2)|2,{46,106,0}}, +/* 24485 */ {(13<<2)|2,{46,106,0}}, +/* 24486 */ {(13<<2)|2,{46,106,0}}, +/* 24487 */ {(13<<2)|2,{46,106,0}}, +/* 24488 */ {(13<<2)|2,{46,107,0}}, +/* 24489 */ {(13<<2)|2,{46,107,0}}, +/* 24490 */ {(13<<2)|2,{46,107,0}}, +/* 24491 */ {(13<<2)|2,{46,107,0}}, +/* 24492 */ {(13<<2)|2,{46,107,0}}, +/* 24493 */ {(13<<2)|2,{46,107,0}}, +/* 24494 */ {(13<<2)|2,{46,107,0}}, +/* 24495 */ {(13<<2)|2,{46,107,0}}, +/* 24496 */ {(13<<2)|2,{46,113,0}}, +/* 24497 */ {(13<<2)|2,{46,113,0}}, +/* 24498 */ {(13<<2)|2,{46,113,0}}, +/* 24499 */ {(13<<2)|2,{46,113,0}}, +/* 24500 */ {(13<<2)|2,{46,113,0}}, +/* 24501 */ {(13<<2)|2,{46,113,0}}, +/* 24502 */ {(13<<2)|2,{46,113,0}}, +/* 24503 */ {(13<<2)|2,{46,113,0}}, +/* 24504 */ {(13<<2)|2,{46,118,0}}, +/* 24505 */ {(13<<2)|2,{46,118,0}}, +/* 24506 */ {(13<<2)|2,{46,118,0}}, +/* 24507 */ {(13<<2)|2,{46,118,0}}, +/* 24508 */ {(13<<2)|2,{46,118,0}}, +/* 24509 */ {(13<<2)|2,{46,118,0}}, +/* 24510 */ {(13<<2)|2,{46,118,0}}, +/* 24511 */ {(13<<2)|2,{46,118,0}}, +/* 24512 */ {(13<<2)|2,{46,119,0}}, +/* 24513 */ {(13<<2)|2,{46,119,0}}, +/* 24514 */ {(13<<2)|2,{46,119,0}}, +/* 24515 */ {(13<<2)|2,{46,119,0}}, +/* 24516 */ {(13<<2)|2,{46,119,0}}, +/* 24517 */ {(13<<2)|2,{46,119,0}}, +/* 24518 */ {(13<<2)|2,{46,119,0}}, +/* 24519 */ {(13<<2)|2,{46,119,0}}, +/* 24520 */ {(13<<2)|2,{46,120,0}}, +/* 24521 */ {(13<<2)|2,{46,120,0}}, +/* 24522 */ {(13<<2)|2,{46,120,0}}, +/* 24523 */ {(13<<2)|2,{46,120,0}}, +/* 24524 */ {(13<<2)|2,{46,120,0}}, +/* 24525 */ {(13<<2)|2,{46,120,0}}, +/* 24526 */ {(13<<2)|2,{46,120,0}}, +/* 24527 */ {(13<<2)|2,{46,120,0}}, +/* 24528 */ {(13<<2)|2,{46,121,0}}, +/* 24529 */ {(13<<2)|2,{46,121,0}}, +/* 24530 */ {(13<<2)|2,{46,121,0}}, +/* 24531 */ {(13<<2)|2,{46,121,0}}, +/* 24532 */ {(13<<2)|2,{46,121,0}}, +/* 24533 */ {(13<<2)|2,{46,121,0}}, +/* 24534 */ {(13<<2)|2,{46,121,0}}, +/* 24535 */ {(13<<2)|2,{46,121,0}}, +/* 24536 */ {(13<<2)|2,{46,122,0}}, +/* 24537 */ {(13<<2)|2,{46,122,0}}, +/* 24538 */ {(13<<2)|2,{46,122,0}}, +/* 24539 */ {(13<<2)|2,{46,122,0}}, +/* 24540 */ {(13<<2)|2,{46,122,0}}, +/* 24541 */ {(13<<2)|2,{46,122,0}}, +/* 24542 */ {(13<<2)|2,{46,122,0}}, +/* 24543 */ {(13<<2)|2,{46,122,0}}, +/* 24544 */ {(14<<2)|2,{46,38,0}}, +/* 24545 */ {(14<<2)|2,{46,38,0}}, +/* 24546 */ {(14<<2)|2,{46,38,0}}, +/* 24547 */ {(14<<2)|2,{46,38,0}}, +/* 24548 */ {(14<<2)|2,{46,42,0}}, +/* 24549 */ {(14<<2)|2,{46,42,0}}, +/* 24550 */ {(14<<2)|2,{46,42,0}}, +/* 24551 */ {(14<<2)|2,{46,42,0}}, +/* 24552 */ {(14<<2)|2,{46,44,0}}, +/* 24553 */ {(14<<2)|2,{46,44,0}}, +/* 24554 */ {(14<<2)|2,{46,44,0}}, +/* 24555 */ {(14<<2)|2,{46,44,0}}, +/* 24556 */ {(14<<2)|2,{46,59,0}}, +/* 24557 */ {(14<<2)|2,{46,59,0}}, +/* 24558 */ {(14<<2)|2,{46,59,0}}, +/* 24559 */ {(14<<2)|2,{46,59,0}}, +/* 24560 */ {(14<<2)|2,{46,88,0}}, +/* 24561 */ {(14<<2)|2,{46,88,0}}, +/* 24562 */ {(14<<2)|2,{46,88,0}}, +/* 24563 */ {(14<<2)|2,{46,88,0}}, +/* 24564 */ {(14<<2)|2,{46,90,0}}, +/* 24565 */ {(14<<2)|2,{46,90,0}}, +/* 24566 */ {(14<<2)|2,{46,90,0}}, +/* 24567 */ {(14<<2)|2,{46,90,0}}, +/* 24568 */ {(16<<2)|2,{46,33,0}}, +/* 24569 */ {(16<<2)|2,{46,34,0}}, +/* 24570 */ {(16<<2)|2,{46,40,0}}, +/* 24571 */ {(16<<2)|2,{46,41,0}}, +/* 24572 */ {(16<<2)|2,{46,63,0}}, +/* 24573 */ {(6<<2)|1,{46,0,0}}, +/* 24574 */ {(6<<2)|1,{46,0,0}}, +/* 24575 */ {(6<<2)|1,{46,0,0}}, +/* 24576 */ {(16<<2)|3,{47,48,48}}, +/* 24577 */ {(16<<2)|3,{47,48,49}}, +/* 24578 */ {(16<<2)|3,{47,48,50}}, +/* 24579 */ {(16<<2)|3,{47,48,97}}, +/* 24580 */ {(16<<2)|3,{47,48,99}}, +/* 24581 */ {(16<<2)|3,{47,48,101}}, +/* 24582 */ {(16<<2)|3,{47,48,105}}, +/* 24583 */ {(16<<2)|3,{47,48,111}}, +/* 24584 */ {(16<<2)|3,{47,48,115}}, +/* 24585 */ {(16<<2)|3,{47,48,116}}, +/* 24586 */ {(11<<2)|2,{47,48,0}}, +/* 24587 */ {(11<<2)|2,{47,48,0}}, +/* 24588 */ {(11<<2)|2,{47,48,0}}, +/* 24589 */ {(11<<2)|2,{47,48,0}}, +/* 24590 */ {(11<<2)|2,{47,48,0}}, +/* 24591 */ {(11<<2)|2,{47,48,0}}, +/* 24592 */ {(11<<2)|2,{47,48,0}}, +/* 24593 */ {(11<<2)|2,{47,48,0}}, +/* 24594 */ {(11<<2)|2,{47,48,0}}, +/* 24595 */ {(11<<2)|2,{47,48,0}}, +/* 24596 */ {(11<<2)|2,{47,48,0}}, +/* 24597 */ {(11<<2)|2,{47,48,0}}, +/* 24598 */ {(11<<2)|2,{47,48,0}}, +/* 24599 */ {(11<<2)|2,{47,48,0}}, +/* 24600 */ {(11<<2)|2,{47,48,0}}, +/* 24601 */ {(11<<2)|2,{47,48,0}}, +/* 24602 */ {(11<<2)|2,{47,48,0}}, +/* 24603 */ {(11<<2)|2,{47,48,0}}, +/* 24604 */ {(11<<2)|2,{47,48,0}}, +/* 24605 */ {(11<<2)|2,{47,48,0}}, +/* 24606 */ {(11<<2)|2,{47,48,0}}, +/* 24607 */ {(11<<2)|2,{47,48,0}}, +/* 24608 */ {(16<<2)|3,{47,49,48}}, +/* 24609 */ {(16<<2)|3,{47,49,49}}, +/* 24610 */ {(16<<2)|3,{47,49,50}}, +/* 24611 */ {(16<<2)|3,{47,49,97}}, +/* 24612 */ {(16<<2)|3,{47,49,99}}, +/* 24613 */ {(16<<2)|3,{47,49,101}}, +/* 24614 */ {(16<<2)|3,{47,49,105}}, +/* 24615 */ {(16<<2)|3,{47,49,111}}, +/* 24616 */ {(16<<2)|3,{47,49,115}}, +/* 24617 */ {(16<<2)|3,{47,49,116}}, +/* 24618 */ {(11<<2)|2,{47,49,0}}, +/* 24619 */ {(11<<2)|2,{47,49,0}}, +/* 24620 */ {(11<<2)|2,{47,49,0}}, +/* 24621 */ {(11<<2)|2,{47,49,0}}, +/* 24622 */ {(11<<2)|2,{47,49,0}}, +/* 24623 */ {(11<<2)|2,{47,49,0}}, +/* 24624 */ {(11<<2)|2,{47,49,0}}, +/* 24625 */ {(11<<2)|2,{47,49,0}}, +/* 24626 */ {(11<<2)|2,{47,49,0}}, +/* 24627 */ {(11<<2)|2,{47,49,0}}, +/* 24628 */ {(11<<2)|2,{47,49,0}}, +/* 24629 */ {(11<<2)|2,{47,49,0}}, +/* 24630 */ {(11<<2)|2,{47,49,0}}, +/* 24631 */ {(11<<2)|2,{47,49,0}}, +/* 24632 */ {(11<<2)|2,{47,49,0}}, +/* 24633 */ {(11<<2)|2,{47,49,0}}, +/* 24634 */ {(11<<2)|2,{47,49,0}}, +/* 24635 */ {(11<<2)|2,{47,49,0}}, +/* 24636 */ {(11<<2)|2,{47,49,0}}, +/* 24637 */ {(11<<2)|2,{47,49,0}}, +/* 24638 */ {(11<<2)|2,{47,49,0}}, +/* 24639 */ {(11<<2)|2,{47,49,0}}, +/* 24640 */ {(16<<2)|3,{47,50,48}}, +/* 24641 */ {(16<<2)|3,{47,50,49}}, +/* 24642 */ {(16<<2)|3,{47,50,50}}, +/* 24643 */ {(16<<2)|3,{47,50,97}}, +/* 24644 */ {(16<<2)|3,{47,50,99}}, +/* 24645 */ {(16<<2)|3,{47,50,101}}, +/* 24646 */ {(16<<2)|3,{47,50,105}}, +/* 24647 */ {(16<<2)|3,{47,50,111}}, +/* 24648 */ {(16<<2)|3,{47,50,115}}, +/* 24649 */ {(16<<2)|3,{47,50,116}}, +/* 24650 */ {(11<<2)|2,{47,50,0}}, +/* 24651 */ {(11<<2)|2,{47,50,0}}, +/* 24652 */ {(11<<2)|2,{47,50,0}}, +/* 24653 */ {(11<<2)|2,{47,50,0}}, +/* 24654 */ {(11<<2)|2,{47,50,0}}, +/* 24655 */ {(11<<2)|2,{47,50,0}}, +/* 24656 */ {(11<<2)|2,{47,50,0}}, +/* 24657 */ {(11<<2)|2,{47,50,0}}, +/* 24658 */ {(11<<2)|2,{47,50,0}}, +/* 24659 */ {(11<<2)|2,{47,50,0}}, +/* 24660 */ {(11<<2)|2,{47,50,0}}, +/* 24661 */ {(11<<2)|2,{47,50,0}}, +/* 24662 */ {(11<<2)|2,{47,50,0}}, +/* 24663 */ {(11<<2)|2,{47,50,0}}, +/* 24664 */ {(11<<2)|2,{47,50,0}}, +/* 24665 */ {(11<<2)|2,{47,50,0}}, +/* 24666 */ {(11<<2)|2,{47,50,0}}, +/* 24667 */ {(11<<2)|2,{47,50,0}}, +/* 24668 */ {(11<<2)|2,{47,50,0}}, +/* 24669 */ {(11<<2)|2,{47,50,0}}, +/* 24670 */ {(11<<2)|2,{47,50,0}}, +/* 24671 */ {(11<<2)|2,{47,50,0}}, +/* 24672 */ {(16<<2)|3,{47,97,48}}, +/* 24673 */ {(16<<2)|3,{47,97,49}}, +/* 24674 */ {(16<<2)|3,{47,97,50}}, +/* 24675 */ {(16<<2)|3,{47,97,97}}, +/* 24676 */ {(16<<2)|3,{47,97,99}}, +/* 24677 */ {(16<<2)|3,{47,97,101}}, +/* 24678 */ {(16<<2)|3,{47,97,105}}, +/* 24679 */ {(16<<2)|3,{47,97,111}}, +/* 24680 */ {(16<<2)|3,{47,97,115}}, +/* 24681 */ {(16<<2)|3,{47,97,116}}, +/* 24682 */ {(11<<2)|2,{47,97,0}}, +/* 24683 */ {(11<<2)|2,{47,97,0}}, +/* 24684 */ {(11<<2)|2,{47,97,0}}, +/* 24685 */ {(11<<2)|2,{47,97,0}}, +/* 24686 */ {(11<<2)|2,{47,97,0}}, +/* 24687 */ {(11<<2)|2,{47,97,0}}, +/* 24688 */ {(11<<2)|2,{47,97,0}}, +/* 24689 */ {(11<<2)|2,{47,97,0}}, +/* 24690 */ {(11<<2)|2,{47,97,0}}, +/* 24691 */ {(11<<2)|2,{47,97,0}}, +/* 24692 */ {(11<<2)|2,{47,97,0}}, +/* 24693 */ {(11<<2)|2,{47,97,0}}, +/* 24694 */ {(11<<2)|2,{47,97,0}}, +/* 24695 */ {(11<<2)|2,{47,97,0}}, +/* 24696 */ {(11<<2)|2,{47,97,0}}, +/* 24697 */ {(11<<2)|2,{47,97,0}}, +/* 24698 */ {(11<<2)|2,{47,97,0}}, +/* 24699 */ {(11<<2)|2,{47,97,0}}, +/* 24700 */ {(11<<2)|2,{47,97,0}}, +/* 24701 */ {(11<<2)|2,{47,97,0}}, +/* 24702 */ {(11<<2)|2,{47,97,0}}, +/* 24703 */ {(11<<2)|2,{47,97,0}}, +/* 24704 */ {(16<<2)|3,{47,99,48}}, +/* 24705 */ {(16<<2)|3,{47,99,49}}, +/* 24706 */ {(16<<2)|3,{47,99,50}}, +/* 24707 */ {(16<<2)|3,{47,99,97}}, +/* 24708 */ {(16<<2)|3,{47,99,99}}, +/* 24709 */ {(16<<2)|3,{47,99,101}}, +/* 24710 */ {(16<<2)|3,{47,99,105}}, +/* 24711 */ {(16<<2)|3,{47,99,111}}, +/* 24712 */ {(16<<2)|3,{47,99,115}}, +/* 24713 */ {(16<<2)|3,{47,99,116}}, +/* 24714 */ {(11<<2)|2,{47,99,0}}, +/* 24715 */ {(11<<2)|2,{47,99,0}}, +/* 24716 */ {(11<<2)|2,{47,99,0}}, +/* 24717 */ {(11<<2)|2,{47,99,0}}, +/* 24718 */ {(11<<2)|2,{47,99,0}}, +/* 24719 */ {(11<<2)|2,{47,99,0}}, +/* 24720 */ {(11<<2)|2,{47,99,0}}, +/* 24721 */ {(11<<2)|2,{47,99,0}}, +/* 24722 */ {(11<<2)|2,{47,99,0}}, +/* 24723 */ {(11<<2)|2,{47,99,0}}, +/* 24724 */ {(11<<2)|2,{47,99,0}}, +/* 24725 */ {(11<<2)|2,{47,99,0}}, +/* 24726 */ {(11<<2)|2,{47,99,0}}, +/* 24727 */ {(11<<2)|2,{47,99,0}}, +/* 24728 */ {(11<<2)|2,{47,99,0}}, +/* 24729 */ {(11<<2)|2,{47,99,0}}, +/* 24730 */ {(11<<2)|2,{47,99,0}}, +/* 24731 */ {(11<<2)|2,{47,99,0}}, +/* 24732 */ {(11<<2)|2,{47,99,0}}, +/* 24733 */ {(11<<2)|2,{47,99,0}}, +/* 24734 */ {(11<<2)|2,{47,99,0}}, +/* 24735 */ {(11<<2)|2,{47,99,0}}, +/* 24736 */ {(16<<2)|3,{47,101,48}}, +/* 24737 */ {(16<<2)|3,{47,101,49}}, +/* 24738 */ {(16<<2)|3,{47,101,50}}, +/* 24739 */ {(16<<2)|3,{47,101,97}}, +/* 24740 */ {(16<<2)|3,{47,101,99}}, +/* 24741 */ {(16<<2)|3,{47,101,101}}, +/* 24742 */ {(16<<2)|3,{47,101,105}}, +/* 24743 */ {(16<<2)|3,{47,101,111}}, +/* 24744 */ {(16<<2)|3,{47,101,115}}, +/* 24745 */ {(16<<2)|3,{47,101,116}}, +/* 24746 */ {(11<<2)|2,{47,101,0}}, +/* 24747 */ {(11<<2)|2,{47,101,0}}, +/* 24748 */ {(11<<2)|2,{47,101,0}}, +/* 24749 */ {(11<<2)|2,{47,101,0}}, +/* 24750 */ {(11<<2)|2,{47,101,0}}, +/* 24751 */ {(11<<2)|2,{47,101,0}}, +/* 24752 */ {(11<<2)|2,{47,101,0}}, +/* 24753 */ {(11<<2)|2,{47,101,0}}, +/* 24754 */ {(11<<2)|2,{47,101,0}}, +/* 24755 */ {(11<<2)|2,{47,101,0}}, +/* 24756 */ {(11<<2)|2,{47,101,0}}, +/* 24757 */ {(11<<2)|2,{47,101,0}}, +/* 24758 */ {(11<<2)|2,{47,101,0}}, +/* 24759 */ {(11<<2)|2,{47,101,0}}, +/* 24760 */ {(11<<2)|2,{47,101,0}}, +/* 24761 */ {(11<<2)|2,{47,101,0}}, +/* 24762 */ {(11<<2)|2,{47,101,0}}, +/* 24763 */ {(11<<2)|2,{47,101,0}}, +/* 24764 */ {(11<<2)|2,{47,101,0}}, +/* 24765 */ {(11<<2)|2,{47,101,0}}, +/* 24766 */ {(11<<2)|2,{47,101,0}}, +/* 24767 */ {(11<<2)|2,{47,101,0}}, +/* 24768 */ {(16<<2)|3,{47,105,48}}, +/* 24769 */ {(16<<2)|3,{47,105,49}}, +/* 24770 */ {(16<<2)|3,{47,105,50}}, +/* 24771 */ {(16<<2)|3,{47,105,97}}, +/* 24772 */ {(16<<2)|3,{47,105,99}}, +/* 24773 */ {(16<<2)|3,{47,105,101}}, +/* 24774 */ {(16<<2)|3,{47,105,105}}, +/* 24775 */ {(16<<2)|3,{47,105,111}}, +/* 24776 */ {(16<<2)|3,{47,105,115}}, +/* 24777 */ {(16<<2)|3,{47,105,116}}, +/* 24778 */ {(11<<2)|2,{47,105,0}}, +/* 24779 */ {(11<<2)|2,{47,105,0}}, +/* 24780 */ {(11<<2)|2,{47,105,0}}, +/* 24781 */ {(11<<2)|2,{47,105,0}}, +/* 24782 */ {(11<<2)|2,{47,105,0}}, +/* 24783 */ {(11<<2)|2,{47,105,0}}, +/* 24784 */ {(11<<2)|2,{47,105,0}}, +/* 24785 */ {(11<<2)|2,{47,105,0}}, +/* 24786 */ {(11<<2)|2,{47,105,0}}, +/* 24787 */ {(11<<2)|2,{47,105,0}}, +/* 24788 */ {(11<<2)|2,{47,105,0}}, +/* 24789 */ {(11<<2)|2,{47,105,0}}, +/* 24790 */ {(11<<2)|2,{47,105,0}}, +/* 24791 */ {(11<<2)|2,{47,105,0}}, +/* 24792 */ {(11<<2)|2,{47,105,0}}, +/* 24793 */ {(11<<2)|2,{47,105,0}}, +/* 24794 */ {(11<<2)|2,{47,105,0}}, +/* 24795 */ {(11<<2)|2,{47,105,0}}, +/* 24796 */ {(11<<2)|2,{47,105,0}}, +/* 24797 */ {(11<<2)|2,{47,105,0}}, +/* 24798 */ {(11<<2)|2,{47,105,0}}, +/* 24799 */ {(11<<2)|2,{47,105,0}}, +/* 24800 */ {(16<<2)|3,{47,111,48}}, +/* 24801 */ {(16<<2)|3,{47,111,49}}, +/* 24802 */ {(16<<2)|3,{47,111,50}}, +/* 24803 */ {(16<<2)|3,{47,111,97}}, +/* 24804 */ {(16<<2)|3,{47,111,99}}, +/* 24805 */ {(16<<2)|3,{47,111,101}}, +/* 24806 */ {(16<<2)|3,{47,111,105}}, +/* 24807 */ {(16<<2)|3,{47,111,111}}, +/* 24808 */ {(16<<2)|3,{47,111,115}}, +/* 24809 */ {(16<<2)|3,{47,111,116}}, +/* 24810 */ {(11<<2)|2,{47,111,0}}, +/* 24811 */ {(11<<2)|2,{47,111,0}}, +/* 24812 */ {(11<<2)|2,{47,111,0}}, +/* 24813 */ {(11<<2)|2,{47,111,0}}, +/* 24814 */ {(11<<2)|2,{47,111,0}}, +/* 24815 */ {(11<<2)|2,{47,111,0}}, +/* 24816 */ {(11<<2)|2,{47,111,0}}, +/* 24817 */ {(11<<2)|2,{47,111,0}}, +/* 24818 */ {(11<<2)|2,{47,111,0}}, +/* 24819 */ {(11<<2)|2,{47,111,0}}, +/* 24820 */ {(11<<2)|2,{47,111,0}}, +/* 24821 */ {(11<<2)|2,{47,111,0}}, +/* 24822 */ {(11<<2)|2,{47,111,0}}, +/* 24823 */ {(11<<2)|2,{47,111,0}}, +/* 24824 */ {(11<<2)|2,{47,111,0}}, +/* 24825 */ {(11<<2)|2,{47,111,0}}, +/* 24826 */ {(11<<2)|2,{47,111,0}}, +/* 24827 */ {(11<<2)|2,{47,111,0}}, +/* 24828 */ {(11<<2)|2,{47,111,0}}, +/* 24829 */ {(11<<2)|2,{47,111,0}}, +/* 24830 */ {(11<<2)|2,{47,111,0}}, +/* 24831 */ {(11<<2)|2,{47,111,0}}, +/* 24832 */ {(16<<2)|3,{47,115,48}}, +/* 24833 */ {(16<<2)|3,{47,115,49}}, +/* 24834 */ {(16<<2)|3,{47,115,50}}, +/* 24835 */ {(16<<2)|3,{47,115,97}}, +/* 24836 */ {(16<<2)|3,{47,115,99}}, +/* 24837 */ {(16<<2)|3,{47,115,101}}, +/* 24838 */ {(16<<2)|3,{47,115,105}}, +/* 24839 */ {(16<<2)|3,{47,115,111}}, +/* 24840 */ {(16<<2)|3,{47,115,115}}, +/* 24841 */ {(16<<2)|3,{47,115,116}}, +/* 24842 */ {(11<<2)|2,{47,115,0}}, +/* 24843 */ {(11<<2)|2,{47,115,0}}, +/* 24844 */ {(11<<2)|2,{47,115,0}}, +/* 24845 */ {(11<<2)|2,{47,115,0}}, +/* 24846 */ {(11<<2)|2,{47,115,0}}, +/* 24847 */ {(11<<2)|2,{47,115,0}}, +/* 24848 */ {(11<<2)|2,{47,115,0}}, +/* 24849 */ {(11<<2)|2,{47,115,0}}, +/* 24850 */ {(11<<2)|2,{47,115,0}}, +/* 24851 */ {(11<<2)|2,{47,115,0}}, +/* 24852 */ {(11<<2)|2,{47,115,0}}, +/* 24853 */ {(11<<2)|2,{47,115,0}}, +/* 24854 */ {(11<<2)|2,{47,115,0}}, +/* 24855 */ {(11<<2)|2,{47,115,0}}, +/* 24856 */ {(11<<2)|2,{47,115,0}}, +/* 24857 */ {(11<<2)|2,{47,115,0}}, +/* 24858 */ {(11<<2)|2,{47,115,0}}, +/* 24859 */ {(11<<2)|2,{47,115,0}}, +/* 24860 */ {(11<<2)|2,{47,115,0}}, +/* 24861 */ {(11<<2)|2,{47,115,0}}, +/* 24862 */ {(11<<2)|2,{47,115,0}}, +/* 24863 */ {(11<<2)|2,{47,115,0}}, +/* 24864 */ {(16<<2)|3,{47,116,48}}, +/* 24865 */ {(16<<2)|3,{47,116,49}}, +/* 24866 */ {(16<<2)|3,{47,116,50}}, +/* 24867 */ {(16<<2)|3,{47,116,97}}, +/* 24868 */ {(16<<2)|3,{47,116,99}}, +/* 24869 */ {(16<<2)|3,{47,116,101}}, +/* 24870 */ {(16<<2)|3,{47,116,105}}, +/* 24871 */ {(16<<2)|3,{47,116,111}}, +/* 24872 */ {(16<<2)|3,{47,116,115}}, +/* 24873 */ {(16<<2)|3,{47,116,116}}, +/* 24874 */ {(11<<2)|2,{47,116,0}}, +/* 24875 */ {(11<<2)|2,{47,116,0}}, +/* 24876 */ {(11<<2)|2,{47,116,0}}, +/* 24877 */ {(11<<2)|2,{47,116,0}}, +/* 24878 */ {(11<<2)|2,{47,116,0}}, +/* 24879 */ {(11<<2)|2,{47,116,0}}, +/* 24880 */ {(11<<2)|2,{47,116,0}}, +/* 24881 */ {(11<<2)|2,{47,116,0}}, +/* 24882 */ {(11<<2)|2,{47,116,0}}, +/* 24883 */ {(11<<2)|2,{47,116,0}}, +/* 24884 */ {(11<<2)|2,{47,116,0}}, +/* 24885 */ {(11<<2)|2,{47,116,0}}, +/* 24886 */ {(11<<2)|2,{47,116,0}}, +/* 24887 */ {(11<<2)|2,{47,116,0}}, +/* 24888 */ {(11<<2)|2,{47,116,0}}, +/* 24889 */ {(11<<2)|2,{47,116,0}}, +/* 24890 */ {(11<<2)|2,{47,116,0}}, +/* 24891 */ {(11<<2)|2,{47,116,0}}, +/* 24892 */ {(11<<2)|2,{47,116,0}}, +/* 24893 */ {(11<<2)|2,{47,116,0}}, +/* 24894 */ {(11<<2)|2,{47,116,0}}, +/* 24895 */ {(11<<2)|2,{47,116,0}}, +/* 24896 */ {(12<<2)|2,{47,32,0}}, +/* 24897 */ {(12<<2)|2,{47,32,0}}, +/* 24898 */ {(12<<2)|2,{47,32,0}}, +/* 24899 */ {(12<<2)|2,{47,32,0}}, +/* 24900 */ {(12<<2)|2,{47,32,0}}, +/* 24901 */ {(12<<2)|2,{47,32,0}}, +/* 24902 */ {(12<<2)|2,{47,32,0}}, +/* 24903 */ {(12<<2)|2,{47,32,0}}, +/* 24904 */ {(12<<2)|2,{47,32,0}}, +/* 24905 */ {(12<<2)|2,{47,32,0}}, +/* 24906 */ {(12<<2)|2,{47,32,0}}, +/* 24907 */ {(12<<2)|2,{47,32,0}}, +/* 24908 */ {(12<<2)|2,{47,32,0}}, +/* 24909 */ {(12<<2)|2,{47,32,0}}, +/* 24910 */ {(12<<2)|2,{47,32,0}}, +/* 24911 */ {(12<<2)|2,{47,32,0}}, +/* 24912 */ {(12<<2)|2,{47,37,0}}, +/* 24913 */ {(12<<2)|2,{47,37,0}}, +/* 24914 */ {(12<<2)|2,{47,37,0}}, +/* 24915 */ {(12<<2)|2,{47,37,0}}, +/* 24916 */ {(12<<2)|2,{47,37,0}}, +/* 24917 */ {(12<<2)|2,{47,37,0}}, +/* 24918 */ {(12<<2)|2,{47,37,0}}, +/* 24919 */ {(12<<2)|2,{47,37,0}}, +/* 24920 */ {(12<<2)|2,{47,37,0}}, +/* 24921 */ {(12<<2)|2,{47,37,0}}, +/* 24922 */ {(12<<2)|2,{47,37,0}}, +/* 24923 */ {(12<<2)|2,{47,37,0}}, +/* 24924 */ {(12<<2)|2,{47,37,0}}, +/* 24925 */ {(12<<2)|2,{47,37,0}}, +/* 24926 */ {(12<<2)|2,{47,37,0}}, +/* 24927 */ {(12<<2)|2,{47,37,0}}, +/* 24928 */ {(12<<2)|2,{47,45,0}}, +/* 24929 */ {(12<<2)|2,{47,45,0}}, +/* 24930 */ {(12<<2)|2,{47,45,0}}, +/* 24931 */ {(12<<2)|2,{47,45,0}}, +/* 24932 */ {(12<<2)|2,{47,45,0}}, +/* 24933 */ {(12<<2)|2,{47,45,0}}, +/* 24934 */ {(12<<2)|2,{47,45,0}}, +/* 24935 */ {(12<<2)|2,{47,45,0}}, +/* 24936 */ {(12<<2)|2,{47,45,0}}, +/* 24937 */ {(12<<2)|2,{47,45,0}}, +/* 24938 */ {(12<<2)|2,{47,45,0}}, +/* 24939 */ {(12<<2)|2,{47,45,0}}, +/* 24940 */ {(12<<2)|2,{47,45,0}}, +/* 24941 */ {(12<<2)|2,{47,45,0}}, +/* 24942 */ {(12<<2)|2,{47,45,0}}, +/* 24943 */ {(12<<2)|2,{47,45,0}}, +/* 24944 */ {(12<<2)|2,{47,46,0}}, +/* 24945 */ {(12<<2)|2,{47,46,0}}, +/* 24946 */ {(12<<2)|2,{47,46,0}}, +/* 24947 */ {(12<<2)|2,{47,46,0}}, +/* 24948 */ {(12<<2)|2,{47,46,0}}, +/* 24949 */ {(12<<2)|2,{47,46,0}}, +/* 24950 */ {(12<<2)|2,{47,46,0}}, +/* 24951 */ {(12<<2)|2,{47,46,0}}, +/* 24952 */ {(12<<2)|2,{47,46,0}}, +/* 24953 */ {(12<<2)|2,{47,46,0}}, +/* 24954 */ {(12<<2)|2,{47,46,0}}, +/* 24955 */ {(12<<2)|2,{47,46,0}}, +/* 24956 */ {(12<<2)|2,{47,46,0}}, +/* 24957 */ {(12<<2)|2,{47,46,0}}, +/* 24958 */ {(12<<2)|2,{47,46,0}}, +/* 24959 */ {(12<<2)|2,{47,46,0}}, +/* 24960 */ {(12<<2)|2,{47,47,0}}, +/* 24961 */ {(12<<2)|2,{47,47,0}}, +/* 24962 */ {(12<<2)|2,{47,47,0}}, +/* 24963 */ {(12<<2)|2,{47,47,0}}, +/* 24964 */ {(12<<2)|2,{47,47,0}}, +/* 24965 */ {(12<<2)|2,{47,47,0}}, +/* 24966 */ {(12<<2)|2,{47,47,0}}, +/* 24967 */ {(12<<2)|2,{47,47,0}}, +/* 24968 */ {(12<<2)|2,{47,47,0}}, +/* 24969 */ {(12<<2)|2,{47,47,0}}, +/* 24970 */ {(12<<2)|2,{47,47,0}}, +/* 24971 */ {(12<<2)|2,{47,47,0}}, +/* 24972 */ {(12<<2)|2,{47,47,0}}, +/* 24973 */ {(12<<2)|2,{47,47,0}}, +/* 24974 */ {(12<<2)|2,{47,47,0}}, +/* 24975 */ {(12<<2)|2,{47,47,0}}, +/* 24976 */ {(12<<2)|2,{47,51,0}}, +/* 24977 */ {(12<<2)|2,{47,51,0}}, +/* 24978 */ {(12<<2)|2,{47,51,0}}, +/* 24979 */ {(12<<2)|2,{47,51,0}}, +/* 24980 */ {(12<<2)|2,{47,51,0}}, +/* 24981 */ {(12<<2)|2,{47,51,0}}, +/* 24982 */ {(12<<2)|2,{47,51,0}}, +/* 24983 */ {(12<<2)|2,{47,51,0}}, +/* 24984 */ {(12<<2)|2,{47,51,0}}, +/* 24985 */ {(12<<2)|2,{47,51,0}}, +/* 24986 */ {(12<<2)|2,{47,51,0}}, +/* 24987 */ {(12<<2)|2,{47,51,0}}, +/* 24988 */ {(12<<2)|2,{47,51,0}}, +/* 24989 */ {(12<<2)|2,{47,51,0}}, +/* 24990 */ {(12<<2)|2,{47,51,0}}, +/* 24991 */ {(12<<2)|2,{47,51,0}}, +/* 24992 */ {(12<<2)|2,{47,52,0}}, +/* 24993 */ {(12<<2)|2,{47,52,0}}, +/* 24994 */ {(12<<2)|2,{47,52,0}}, +/* 24995 */ {(12<<2)|2,{47,52,0}}, +/* 24996 */ {(12<<2)|2,{47,52,0}}, +/* 24997 */ {(12<<2)|2,{47,52,0}}, +/* 24998 */ {(12<<2)|2,{47,52,0}}, +/* 24999 */ {(12<<2)|2,{47,52,0}}, +/* 25000 */ {(12<<2)|2,{47,52,0}}, +/* 25001 */ {(12<<2)|2,{47,52,0}}, +/* 25002 */ {(12<<2)|2,{47,52,0}}, +/* 25003 */ {(12<<2)|2,{47,52,0}}, +/* 25004 */ {(12<<2)|2,{47,52,0}}, +/* 25005 */ {(12<<2)|2,{47,52,0}}, +/* 25006 */ {(12<<2)|2,{47,52,0}}, +/* 25007 */ {(12<<2)|2,{47,52,0}}, +/* 25008 */ {(12<<2)|2,{47,53,0}}, +/* 25009 */ {(12<<2)|2,{47,53,0}}, +/* 25010 */ {(12<<2)|2,{47,53,0}}, +/* 25011 */ {(12<<2)|2,{47,53,0}}, +/* 25012 */ {(12<<2)|2,{47,53,0}}, +/* 25013 */ {(12<<2)|2,{47,53,0}}, +/* 25014 */ {(12<<2)|2,{47,53,0}}, +/* 25015 */ {(12<<2)|2,{47,53,0}}, +/* 25016 */ {(12<<2)|2,{47,53,0}}, +/* 25017 */ {(12<<2)|2,{47,53,0}}, +/* 25018 */ {(12<<2)|2,{47,53,0}}, +/* 25019 */ {(12<<2)|2,{47,53,0}}, +/* 25020 */ {(12<<2)|2,{47,53,0}}, +/* 25021 */ {(12<<2)|2,{47,53,0}}, +/* 25022 */ {(12<<2)|2,{47,53,0}}, +/* 25023 */ {(12<<2)|2,{47,53,0}}, +/* 25024 */ {(12<<2)|2,{47,54,0}}, +/* 25025 */ {(12<<2)|2,{47,54,0}}, +/* 25026 */ {(12<<2)|2,{47,54,0}}, +/* 25027 */ {(12<<2)|2,{47,54,0}}, +/* 25028 */ {(12<<2)|2,{47,54,0}}, +/* 25029 */ {(12<<2)|2,{47,54,0}}, +/* 25030 */ {(12<<2)|2,{47,54,0}}, +/* 25031 */ {(12<<2)|2,{47,54,0}}, +/* 25032 */ {(12<<2)|2,{47,54,0}}, +/* 25033 */ {(12<<2)|2,{47,54,0}}, +/* 25034 */ {(12<<2)|2,{47,54,0}}, +/* 25035 */ {(12<<2)|2,{47,54,0}}, +/* 25036 */ {(12<<2)|2,{47,54,0}}, +/* 25037 */ {(12<<2)|2,{47,54,0}}, +/* 25038 */ {(12<<2)|2,{47,54,0}}, +/* 25039 */ {(12<<2)|2,{47,54,0}}, +/* 25040 */ {(12<<2)|2,{47,55,0}}, +/* 25041 */ {(12<<2)|2,{47,55,0}}, +/* 25042 */ {(12<<2)|2,{47,55,0}}, +/* 25043 */ {(12<<2)|2,{47,55,0}}, +/* 25044 */ {(12<<2)|2,{47,55,0}}, +/* 25045 */ {(12<<2)|2,{47,55,0}}, +/* 25046 */ {(12<<2)|2,{47,55,0}}, +/* 25047 */ {(12<<2)|2,{47,55,0}}, +/* 25048 */ {(12<<2)|2,{47,55,0}}, +/* 25049 */ {(12<<2)|2,{47,55,0}}, +/* 25050 */ {(12<<2)|2,{47,55,0}}, +/* 25051 */ {(12<<2)|2,{47,55,0}}, +/* 25052 */ {(12<<2)|2,{47,55,0}}, +/* 25053 */ {(12<<2)|2,{47,55,0}}, +/* 25054 */ {(12<<2)|2,{47,55,0}}, +/* 25055 */ {(12<<2)|2,{47,55,0}}, +/* 25056 */ {(12<<2)|2,{47,56,0}}, +/* 25057 */ {(12<<2)|2,{47,56,0}}, +/* 25058 */ {(12<<2)|2,{47,56,0}}, +/* 25059 */ {(12<<2)|2,{47,56,0}}, +/* 25060 */ {(12<<2)|2,{47,56,0}}, +/* 25061 */ {(12<<2)|2,{47,56,0}}, +/* 25062 */ {(12<<2)|2,{47,56,0}}, +/* 25063 */ {(12<<2)|2,{47,56,0}}, +/* 25064 */ {(12<<2)|2,{47,56,0}}, +/* 25065 */ {(12<<2)|2,{47,56,0}}, +/* 25066 */ {(12<<2)|2,{47,56,0}}, +/* 25067 */ {(12<<2)|2,{47,56,0}}, +/* 25068 */ {(12<<2)|2,{47,56,0}}, +/* 25069 */ {(12<<2)|2,{47,56,0}}, +/* 25070 */ {(12<<2)|2,{47,56,0}}, +/* 25071 */ {(12<<2)|2,{47,56,0}}, +/* 25072 */ {(12<<2)|2,{47,57,0}}, +/* 25073 */ {(12<<2)|2,{47,57,0}}, +/* 25074 */ {(12<<2)|2,{47,57,0}}, +/* 25075 */ {(12<<2)|2,{47,57,0}}, +/* 25076 */ {(12<<2)|2,{47,57,0}}, +/* 25077 */ {(12<<2)|2,{47,57,0}}, +/* 25078 */ {(12<<2)|2,{47,57,0}}, +/* 25079 */ {(12<<2)|2,{47,57,0}}, +/* 25080 */ {(12<<2)|2,{47,57,0}}, +/* 25081 */ {(12<<2)|2,{47,57,0}}, +/* 25082 */ {(12<<2)|2,{47,57,0}}, +/* 25083 */ {(12<<2)|2,{47,57,0}}, +/* 25084 */ {(12<<2)|2,{47,57,0}}, +/* 25085 */ {(12<<2)|2,{47,57,0}}, +/* 25086 */ {(12<<2)|2,{47,57,0}}, +/* 25087 */ {(12<<2)|2,{47,57,0}}, +/* 25088 */ {(12<<2)|2,{47,61,0}}, +/* 25089 */ {(12<<2)|2,{47,61,0}}, +/* 25090 */ {(12<<2)|2,{47,61,0}}, +/* 25091 */ {(12<<2)|2,{47,61,0}}, +/* 25092 */ {(12<<2)|2,{47,61,0}}, +/* 25093 */ {(12<<2)|2,{47,61,0}}, +/* 25094 */ {(12<<2)|2,{47,61,0}}, +/* 25095 */ {(12<<2)|2,{47,61,0}}, +/* 25096 */ {(12<<2)|2,{47,61,0}}, +/* 25097 */ {(12<<2)|2,{47,61,0}}, +/* 25098 */ {(12<<2)|2,{47,61,0}}, +/* 25099 */ {(12<<2)|2,{47,61,0}}, +/* 25100 */ {(12<<2)|2,{47,61,0}}, +/* 25101 */ {(12<<2)|2,{47,61,0}}, +/* 25102 */ {(12<<2)|2,{47,61,0}}, +/* 25103 */ {(12<<2)|2,{47,61,0}}, +/* 25104 */ {(12<<2)|2,{47,65,0}}, +/* 25105 */ {(12<<2)|2,{47,65,0}}, +/* 25106 */ {(12<<2)|2,{47,65,0}}, +/* 25107 */ {(12<<2)|2,{47,65,0}}, +/* 25108 */ {(12<<2)|2,{47,65,0}}, +/* 25109 */ {(12<<2)|2,{47,65,0}}, +/* 25110 */ {(12<<2)|2,{47,65,0}}, +/* 25111 */ {(12<<2)|2,{47,65,0}}, +/* 25112 */ {(12<<2)|2,{47,65,0}}, +/* 25113 */ {(12<<2)|2,{47,65,0}}, +/* 25114 */ {(12<<2)|2,{47,65,0}}, +/* 25115 */ {(12<<2)|2,{47,65,0}}, +/* 25116 */ {(12<<2)|2,{47,65,0}}, +/* 25117 */ {(12<<2)|2,{47,65,0}}, +/* 25118 */ {(12<<2)|2,{47,65,0}}, +/* 25119 */ {(12<<2)|2,{47,65,0}}, +/* 25120 */ {(12<<2)|2,{47,95,0}}, +/* 25121 */ {(12<<2)|2,{47,95,0}}, +/* 25122 */ {(12<<2)|2,{47,95,0}}, +/* 25123 */ {(12<<2)|2,{47,95,0}}, +/* 25124 */ {(12<<2)|2,{47,95,0}}, +/* 25125 */ {(12<<2)|2,{47,95,0}}, +/* 25126 */ {(12<<2)|2,{47,95,0}}, +/* 25127 */ {(12<<2)|2,{47,95,0}}, +/* 25128 */ {(12<<2)|2,{47,95,0}}, +/* 25129 */ {(12<<2)|2,{47,95,0}}, +/* 25130 */ {(12<<2)|2,{47,95,0}}, +/* 25131 */ {(12<<2)|2,{47,95,0}}, +/* 25132 */ {(12<<2)|2,{47,95,0}}, +/* 25133 */ {(12<<2)|2,{47,95,0}}, +/* 25134 */ {(12<<2)|2,{47,95,0}}, +/* 25135 */ {(12<<2)|2,{47,95,0}}, +/* 25136 */ {(12<<2)|2,{47,98,0}}, +/* 25137 */ {(12<<2)|2,{47,98,0}}, +/* 25138 */ {(12<<2)|2,{47,98,0}}, +/* 25139 */ {(12<<2)|2,{47,98,0}}, +/* 25140 */ {(12<<2)|2,{47,98,0}}, +/* 25141 */ {(12<<2)|2,{47,98,0}}, +/* 25142 */ {(12<<2)|2,{47,98,0}}, +/* 25143 */ {(12<<2)|2,{47,98,0}}, +/* 25144 */ {(12<<2)|2,{47,98,0}}, +/* 25145 */ {(12<<2)|2,{47,98,0}}, +/* 25146 */ {(12<<2)|2,{47,98,0}}, +/* 25147 */ {(12<<2)|2,{47,98,0}}, +/* 25148 */ {(12<<2)|2,{47,98,0}}, +/* 25149 */ {(12<<2)|2,{47,98,0}}, +/* 25150 */ {(12<<2)|2,{47,98,0}}, +/* 25151 */ {(12<<2)|2,{47,98,0}}, +/* 25152 */ {(12<<2)|2,{47,100,0}}, +/* 25153 */ {(12<<2)|2,{47,100,0}}, +/* 25154 */ {(12<<2)|2,{47,100,0}}, +/* 25155 */ {(12<<2)|2,{47,100,0}}, +/* 25156 */ {(12<<2)|2,{47,100,0}}, +/* 25157 */ {(12<<2)|2,{47,100,0}}, +/* 25158 */ {(12<<2)|2,{47,100,0}}, +/* 25159 */ {(12<<2)|2,{47,100,0}}, +/* 25160 */ {(12<<2)|2,{47,100,0}}, +/* 25161 */ {(12<<2)|2,{47,100,0}}, +/* 25162 */ {(12<<2)|2,{47,100,0}}, +/* 25163 */ {(12<<2)|2,{47,100,0}}, +/* 25164 */ {(12<<2)|2,{47,100,0}}, +/* 25165 */ {(12<<2)|2,{47,100,0}}, +/* 25166 */ {(12<<2)|2,{47,100,0}}, +/* 25167 */ {(12<<2)|2,{47,100,0}}, +/* 25168 */ {(12<<2)|2,{47,102,0}}, +/* 25169 */ {(12<<2)|2,{47,102,0}}, +/* 25170 */ {(12<<2)|2,{47,102,0}}, +/* 25171 */ {(12<<2)|2,{47,102,0}}, +/* 25172 */ {(12<<2)|2,{47,102,0}}, +/* 25173 */ {(12<<2)|2,{47,102,0}}, +/* 25174 */ {(12<<2)|2,{47,102,0}}, +/* 25175 */ {(12<<2)|2,{47,102,0}}, +/* 25176 */ {(12<<2)|2,{47,102,0}}, +/* 25177 */ {(12<<2)|2,{47,102,0}}, +/* 25178 */ {(12<<2)|2,{47,102,0}}, +/* 25179 */ {(12<<2)|2,{47,102,0}}, +/* 25180 */ {(12<<2)|2,{47,102,0}}, +/* 25181 */ {(12<<2)|2,{47,102,0}}, +/* 25182 */ {(12<<2)|2,{47,102,0}}, +/* 25183 */ {(12<<2)|2,{47,102,0}}, +/* 25184 */ {(12<<2)|2,{47,103,0}}, +/* 25185 */ {(12<<2)|2,{47,103,0}}, +/* 25186 */ {(12<<2)|2,{47,103,0}}, +/* 25187 */ {(12<<2)|2,{47,103,0}}, +/* 25188 */ {(12<<2)|2,{47,103,0}}, +/* 25189 */ {(12<<2)|2,{47,103,0}}, +/* 25190 */ {(12<<2)|2,{47,103,0}}, +/* 25191 */ {(12<<2)|2,{47,103,0}}, +/* 25192 */ {(12<<2)|2,{47,103,0}}, +/* 25193 */ {(12<<2)|2,{47,103,0}}, +/* 25194 */ {(12<<2)|2,{47,103,0}}, +/* 25195 */ {(12<<2)|2,{47,103,0}}, +/* 25196 */ {(12<<2)|2,{47,103,0}}, +/* 25197 */ {(12<<2)|2,{47,103,0}}, +/* 25198 */ {(12<<2)|2,{47,103,0}}, +/* 25199 */ {(12<<2)|2,{47,103,0}}, +/* 25200 */ {(12<<2)|2,{47,104,0}}, +/* 25201 */ {(12<<2)|2,{47,104,0}}, +/* 25202 */ {(12<<2)|2,{47,104,0}}, +/* 25203 */ {(12<<2)|2,{47,104,0}}, +/* 25204 */ {(12<<2)|2,{47,104,0}}, +/* 25205 */ {(12<<2)|2,{47,104,0}}, +/* 25206 */ {(12<<2)|2,{47,104,0}}, +/* 25207 */ {(12<<2)|2,{47,104,0}}, +/* 25208 */ {(12<<2)|2,{47,104,0}}, +/* 25209 */ {(12<<2)|2,{47,104,0}}, +/* 25210 */ {(12<<2)|2,{47,104,0}}, +/* 25211 */ {(12<<2)|2,{47,104,0}}, +/* 25212 */ {(12<<2)|2,{47,104,0}}, +/* 25213 */ {(12<<2)|2,{47,104,0}}, +/* 25214 */ {(12<<2)|2,{47,104,0}}, +/* 25215 */ {(12<<2)|2,{47,104,0}}, +/* 25216 */ {(12<<2)|2,{47,108,0}}, +/* 25217 */ {(12<<2)|2,{47,108,0}}, +/* 25218 */ {(12<<2)|2,{47,108,0}}, +/* 25219 */ {(12<<2)|2,{47,108,0}}, +/* 25220 */ {(12<<2)|2,{47,108,0}}, +/* 25221 */ {(12<<2)|2,{47,108,0}}, +/* 25222 */ {(12<<2)|2,{47,108,0}}, +/* 25223 */ {(12<<2)|2,{47,108,0}}, +/* 25224 */ {(12<<2)|2,{47,108,0}}, +/* 25225 */ {(12<<2)|2,{47,108,0}}, +/* 25226 */ {(12<<2)|2,{47,108,0}}, +/* 25227 */ {(12<<2)|2,{47,108,0}}, +/* 25228 */ {(12<<2)|2,{47,108,0}}, +/* 25229 */ {(12<<2)|2,{47,108,0}}, +/* 25230 */ {(12<<2)|2,{47,108,0}}, +/* 25231 */ {(12<<2)|2,{47,108,0}}, +/* 25232 */ {(12<<2)|2,{47,109,0}}, +/* 25233 */ {(12<<2)|2,{47,109,0}}, +/* 25234 */ {(12<<2)|2,{47,109,0}}, +/* 25235 */ {(12<<2)|2,{47,109,0}}, +/* 25236 */ {(12<<2)|2,{47,109,0}}, +/* 25237 */ {(12<<2)|2,{47,109,0}}, +/* 25238 */ {(12<<2)|2,{47,109,0}}, +/* 25239 */ {(12<<2)|2,{47,109,0}}, +/* 25240 */ {(12<<2)|2,{47,109,0}}, +/* 25241 */ {(12<<2)|2,{47,109,0}}, +/* 25242 */ {(12<<2)|2,{47,109,0}}, +/* 25243 */ {(12<<2)|2,{47,109,0}}, +/* 25244 */ {(12<<2)|2,{47,109,0}}, +/* 25245 */ {(12<<2)|2,{47,109,0}}, +/* 25246 */ {(12<<2)|2,{47,109,0}}, +/* 25247 */ {(12<<2)|2,{47,109,0}}, +/* 25248 */ {(12<<2)|2,{47,110,0}}, +/* 25249 */ {(12<<2)|2,{47,110,0}}, +/* 25250 */ {(12<<2)|2,{47,110,0}}, +/* 25251 */ {(12<<2)|2,{47,110,0}}, +/* 25252 */ {(12<<2)|2,{47,110,0}}, +/* 25253 */ {(12<<2)|2,{47,110,0}}, +/* 25254 */ {(12<<2)|2,{47,110,0}}, +/* 25255 */ {(12<<2)|2,{47,110,0}}, +/* 25256 */ {(12<<2)|2,{47,110,0}}, +/* 25257 */ {(12<<2)|2,{47,110,0}}, +/* 25258 */ {(12<<2)|2,{47,110,0}}, +/* 25259 */ {(12<<2)|2,{47,110,0}}, +/* 25260 */ {(12<<2)|2,{47,110,0}}, +/* 25261 */ {(12<<2)|2,{47,110,0}}, +/* 25262 */ {(12<<2)|2,{47,110,0}}, +/* 25263 */ {(12<<2)|2,{47,110,0}}, +/* 25264 */ {(12<<2)|2,{47,112,0}}, +/* 25265 */ {(12<<2)|2,{47,112,0}}, +/* 25266 */ {(12<<2)|2,{47,112,0}}, +/* 25267 */ {(12<<2)|2,{47,112,0}}, +/* 25268 */ {(12<<2)|2,{47,112,0}}, +/* 25269 */ {(12<<2)|2,{47,112,0}}, +/* 25270 */ {(12<<2)|2,{47,112,0}}, +/* 25271 */ {(12<<2)|2,{47,112,0}}, +/* 25272 */ {(12<<2)|2,{47,112,0}}, +/* 25273 */ {(12<<2)|2,{47,112,0}}, +/* 25274 */ {(12<<2)|2,{47,112,0}}, +/* 25275 */ {(12<<2)|2,{47,112,0}}, +/* 25276 */ {(12<<2)|2,{47,112,0}}, +/* 25277 */ {(12<<2)|2,{47,112,0}}, +/* 25278 */ {(12<<2)|2,{47,112,0}}, +/* 25279 */ {(12<<2)|2,{47,112,0}}, +/* 25280 */ {(12<<2)|2,{47,114,0}}, +/* 25281 */ {(12<<2)|2,{47,114,0}}, +/* 25282 */ {(12<<2)|2,{47,114,0}}, +/* 25283 */ {(12<<2)|2,{47,114,0}}, +/* 25284 */ {(12<<2)|2,{47,114,0}}, +/* 25285 */ {(12<<2)|2,{47,114,0}}, +/* 25286 */ {(12<<2)|2,{47,114,0}}, +/* 25287 */ {(12<<2)|2,{47,114,0}}, +/* 25288 */ {(12<<2)|2,{47,114,0}}, +/* 25289 */ {(12<<2)|2,{47,114,0}}, +/* 25290 */ {(12<<2)|2,{47,114,0}}, +/* 25291 */ {(12<<2)|2,{47,114,0}}, +/* 25292 */ {(12<<2)|2,{47,114,0}}, +/* 25293 */ {(12<<2)|2,{47,114,0}}, +/* 25294 */ {(12<<2)|2,{47,114,0}}, +/* 25295 */ {(12<<2)|2,{47,114,0}}, +/* 25296 */ {(12<<2)|2,{47,117,0}}, +/* 25297 */ {(12<<2)|2,{47,117,0}}, +/* 25298 */ {(12<<2)|2,{47,117,0}}, +/* 25299 */ {(12<<2)|2,{47,117,0}}, +/* 25300 */ {(12<<2)|2,{47,117,0}}, +/* 25301 */ {(12<<2)|2,{47,117,0}}, +/* 25302 */ {(12<<2)|2,{47,117,0}}, +/* 25303 */ {(12<<2)|2,{47,117,0}}, +/* 25304 */ {(12<<2)|2,{47,117,0}}, +/* 25305 */ {(12<<2)|2,{47,117,0}}, +/* 25306 */ {(12<<2)|2,{47,117,0}}, +/* 25307 */ {(12<<2)|2,{47,117,0}}, +/* 25308 */ {(12<<2)|2,{47,117,0}}, +/* 25309 */ {(12<<2)|2,{47,117,0}}, +/* 25310 */ {(12<<2)|2,{47,117,0}}, +/* 25311 */ {(12<<2)|2,{47,117,0}}, +/* 25312 */ {(13<<2)|2,{47,58,0}}, +/* 25313 */ {(13<<2)|2,{47,58,0}}, +/* 25314 */ {(13<<2)|2,{47,58,0}}, +/* 25315 */ {(13<<2)|2,{47,58,0}}, +/* 25316 */ {(13<<2)|2,{47,58,0}}, +/* 25317 */ {(13<<2)|2,{47,58,0}}, +/* 25318 */ {(13<<2)|2,{47,58,0}}, +/* 25319 */ {(13<<2)|2,{47,58,0}}, +/* 25320 */ {(13<<2)|2,{47,66,0}}, +/* 25321 */ {(13<<2)|2,{47,66,0}}, +/* 25322 */ {(13<<2)|2,{47,66,0}}, +/* 25323 */ {(13<<2)|2,{47,66,0}}, +/* 25324 */ {(13<<2)|2,{47,66,0}}, +/* 25325 */ {(13<<2)|2,{47,66,0}}, +/* 25326 */ {(13<<2)|2,{47,66,0}}, +/* 25327 */ {(13<<2)|2,{47,66,0}}, +/* 25328 */ {(13<<2)|2,{47,67,0}}, +/* 25329 */ {(13<<2)|2,{47,67,0}}, +/* 25330 */ {(13<<2)|2,{47,67,0}}, +/* 25331 */ {(13<<2)|2,{47,67,0}}, +/* 25332 */ {(13<<2)|2,{47,67,0}}, +/* 25333 */ {(13<<2)|2,{47,67,0}}, +/* 25334 */ {(13<<2)|2,{47,67,0}}, +/* 25335 */ {(13<<2)|2,{47,67,0}}, +/* 25336 */ {(13<<2)|2,{47,68,0}}, +/* 25337 */ {(13<<2)|2,{47,68,0}}, +/* 25338 */ {(13<<2)|2,{47,68,0}}, +/* 25339 */ {(13<<2)|2,{47,68,0}}, +/* 25340 */ {(13<<2)|2,{47,68,0}}, +/* 25341 */ {(13<<2)|2,{47,68,0}}, +/* 25342 */ {(13<<2)|2,{47,68,0}}, +/* 25343 */ {(13<<2)|2,{47,68,0}}, +/* 25344 */ {(13<<2)|2,{47,69,0}}, +/* 25345 */ {(13<<2)|2,{47,69,0}}, +/* 25346 */ {(13<<2)|2,{47,69,0}}, +/* 25347 */ {(13<<2)|2,{47,69,0}}, +/* 25348 */ {(13<<2)|2,{47,69,0}}, +/* 25349 */ {(13<<2)|2,{47,69,0}}, +/* 25350 */ {(13<<2)|2,{47,69,0}}, +/* 25351 */ {(13<<2)|2,{47,69,0}}, +/* 25352 */ {(13<<2)|2,{47,70,0}}, +/* 25353 */ {(13<<2)|2,{47,70,0}}, +/* 25354 */ {(13<<2)|2,{47,70,0}}, +/* 25355 */ {(13<<2)|2,{47,70,0}}, +/* 25356 */ {(13<<2)|2,{47,70,0}}, +/* 25357 */ {(13<<2)|2,{47,70,0}}, +/* 25358 */ {(13<<2)|2,{47,70,0}}, +/* 25359 */ {(13<<2)|2,{47,70,0}}, +/* 25360 */ {(13<<2)|2,{47,71,0}}, +/* 25361 */ {(13<<2)|2,{47,71,0}}, +/* 25362 */ {(13<<2)|2,{47,71,0}}, +/* 25363 */ {(13<<2)|2,{47,71,0}}, +/* 25364 */ {(13<<2)|2,{47,71,0}}, +/* 25365 */ {(13<<2)|2,{47,71,0}}, +/* 25366 */ {(13<<2)|2,{47,71,0}}, +/* 25367 */ {(13<<2)|2,{47,71,0}}, +/* 25368 */ {(13<<2)|2,{47,72,0}}, +/* 25369 */ {(13<<2)|2,{47,72,0}}, +/* 25370 */ {(13<<2)|2,{47,72,0}}, +/* 25371 */ {(13<<2)|2,{47,72,0}}, +/* 25372 */ {(13<<2)|2,{47,72,0}}, +/* 25373 */ {(13<<2)|2,{47,72,0}}, +/* 25374 */ {(13<<2)|2,{47,72,0}}, +/* 25375 */ {(13<<2)|2,{47,72,0}}, +/* 25376 */ {(13<<2)|2,{47,73,0}}, +/* 25377 */ {(13<<2)|2,{47,73,0}}, +/* 25378 */ {(13<<2)|2,{47,73,0}}, +/* 25379 */ {(13<<2)|2,{47,73,0}}, +/* 25380 */ {(13<<2)|2,{47,73,0}}, +/* 25381 */ {(13<<2)|2,{47,73,0}}, +/* 25382 */ {(13<<2)|2,{47,73,0}}, +/* 25383 */ {(13<<2)|2,{47,73,0}}, +/* 25384 */ {(13<<2)|2,{47,74,0}}, +/* 25385 */ {(13<<2)|2,{47,74,0}}, +/* 25386 */ {(13<<2)|2,{47,74,0}}, +/* 25387 */ {(13<<2)|2,{47,74,0}}, +/* 25388 */ {(13<<2)|2,{47,74,0}}, +/* 25389 */ {(13<<2)|2,{47,74,0}}, +/* 25390 */ {(13<<2)|2,{47,74,0}}, +/* 25391 */ {(13<<2)|2,{47,74,0}}, +/* 25392 */ {(13<<2)|2,{47,75,0}}, +/* 25393 */ {(13<<2)|2,{47,75,0}}, +/* 25394 */ {(13<<2)|2,{47,75,0}}, +/* 25395 */ {(13<<2)|2,{47,75,0}}, +/* 25396 */ {(13<<2)|2,{47,75,0}}, +/* 25397 */ {(13<<2)|2,{47,75,0}}, +/* 25398 */ {(13<<2)|2,{47,75,0}}, +/* 25399 */ {(13<<2)|2,{47,75,0}}, +/* 25400 */ {(13<<2)|2,{47,76,0}}, +/* 25401 */ {(13<<2)|2,{47,76,0}}, +/* 25402 */ {(13<<2)|2,{47,76,0}}, +/* 25403 */ {(13<<2)|2,{47,76,0}}, +/* 25404 */ {(13<<2)|2,{47,76,0}}, +/* 25405 */ {(13<<2)|2,{47,76,0}}, +/* 25406 */ {(13<<2)|2,{47,76,0}}, +/* 25407 */ {(13<<2)|2,{47,76,0}}, +/* 25408 */ {(13<<2)|2,{47,77,0}}, +/* 25409 */ {(13<<2)|2,{47,77,0}}, +/* 25410 */ {(13<<2)|2,{47,77,0}}, +/* 25411 */ {(13<<2)|2,{47,77,0}}, +/* 25412 */ {(13<<2)|2,{47,77,0}}, +/* 25413 */ {(13<<2)|2,{47,77,0}}, +/* 25414 */ {(13<<2)|2,{47,77,0}}, +/* 25415 */ {(13<<2)|2,{47,77,0}}, +/* 25416 */ {(13<<2)|2,{47,78,0}}, +/* 25417 */ {(13<<2)|2,{47,78,0}}, +/* 25418 */ {(13<<2)|2,{47,78,0}}, +/* 25419 */ {(13<<2)|2,{47,78,0}}, +/* 25420 */ {(13<<2)|2,{47,78,0}}, +/* 25421 */ {(13<<2)|2,{47,78,0}}, +/* 25422 */ {(13<<2)|2,{47,78,0}}, +/* 25423 */ {(13<<2)|2,{47,78,0}}, +/* 25424 */ {(13<<2)|2,{47,79,0}}, +/* 25425 */ {(13<<2)|2,{47,79,0}}, +/* 25426 */ {(13<<2)|2,{47,79,0}}, +/* 25427 */ {(13<<2)|2,{47,79,0}}, +/* 25428 */ {(13<<2)|2,{47,79,0}}, +/* 25429 */ {(13<<2)|2,{47,79,0}}, +/* 25430 */ {(13<<2)|2,{47,79,0}}, +/* 25431 */ {(13<<2)|2,{47,79,0}}, +/* 25432 */ {(13<<2)|2,{47,80,0}}, +/* 25433 */ {(13<<2)|2,{47,80,0}}, +/* 25434 */ {(13<<2)|2,{47,80,0}}, +/* 25435 */ {(13<<2)|2,{47,80,0}}, +/* 25436 */ {(13<<2)|2,{47,80,0}}, +/* 25437 */ {(13<<2)|2,{47,80,0}}, +/* 25438 */ {(13<<2)|2,{47,80,0}}, +/* 25439 */ {(13<<2)|2,{47,80,0}}, +/* 25440 */ {(13<<2)|2,{47,81,0}}, +/* 25441 */ {(13<<2)|2,{47,81,0}}, +/* 25442 */ {(13<<2)|2,{47,81,0}}, +/* 25443 */ {(13<<2)|2,{47,81,0}}, +/* 25444 */ {(13<<2)|2,{47,81,0}}, +/* 25445 */ {(13<<2)|2,{47,81,0}}, +/* 25446 */ {(13<<2)|2,{47,81,0}}, +/* 25447 */ {(13<<2)|2,{47,81,0}}, +/* 25448 */ {(13<<2)|2,{47,82,0}}, +/* 25449 */ {(13<<2)|2,{47,82,0}}, +/* 25450 */ {(13<<2)|2,{47,82,0}}, +/* 25451 */ {(13<<2)|2,{47,82,0}}, +/* 25452 */ {(13<<2)|2,{47,82,0}}, +/* 25453 */ {(13<<2)|2,{47,82,0}}, +/* 25454 */ {(13<<2)|2,{47,82,0}}, +/* 25455 */ {(13<<2)|2,{47,82,0}}, +/* 25456 */ {(13<<2)|2,{47,83,0}}, +/* 25457 */ {(13<<2)|2,{47,83,0}}, +/* 25458 */ {(13<<2)|2,{47,83,0}}, +/* 25459 */ {(13<<2)|2,{47,83,0}}, +/* 25460 */ {(13<<2)|2,{47,83,0}}, +/* 25461 */ {(13<<2)|2,{47,83,0}}, +/* 25462 */ {(13<<2)|2,{47,83,0}}, +/* 25463 */ {(13<<2)|2,{47,83,0}}, +/* 25464 */ {(13<<2)|2,{47,84,0}}, +/* 25465 */ {(13<<2)|2,{47,84,0}}, +/* 25466 */ {(13<<2)|2,{47,84,0}}, +/* 25467 */ {(13<<2)|2,{47,84,0}}, +/* 25468 */ {(13<<2)|2,{47,84,0}}, +/* 25469 */ {(13<<2)|2,{47,84,0}}, +/* 25470 */ {(13<<2)|2,{47,84,0}}, +/* 25471 */ {(13<<2)|2,{47,84,0}}, +/* 25472 */ {(13<<2)|2,{47,85,0}}, +/* 25473 */ {(13<<2)|2,{47,85,0}}, +/* 25474 */ {(13<<2)|2,{47,85,0}}, +/* 25475 */ {(13<<2)|2,{47,85,0}}, +/* 25476 */ {(13<<2)|2,{47,85,0}}, +/* 25477 */ {(13<<2)|2,{47,85,0}}, +/* 25478 */ {(13<<2)|2,{47,85,0}}, +/* 25479 */ {(13<<2)|2,{47,85,0}}, +/* 25480 */ {(13<<2)|2,{47,86,0}}, +/* 25481 */ {(13<<2)|2,{47,86,0}}, +/* 25482 */ {(13<<2)|2,{47,86,0}}, +/* 25483 */ {(13<<2)|2,{47,86,0}}, +/* 25484 */ {(13<<2)|2,{47,86,0}}, +/* 25485 */ {(13<<2)|2,{47,86,0}}, +/* 25486 */ {(13<<2)|2,{47,86,0}}, +/* 25487 */ {(13<<2)|2,{47,86,0}}, +/* 25488 */ {(13<<2)|2,{47,87,0}}, +/* 25489 */ {(13<<2)|2,{47,87,0}}, +/* 25490 */ {(13<<2)|2,{47,87,0}}, +/* 25491 */ {(13<<2)|2,{47,87,0}}, +/* 25492 */ {(13<<2)|2,{47,87,0}}, +/* 25493 */ {(13<<2)|2,{47,87,0}}, +/* 25494 */ {(13<<2)|2,{47,87,0}}, +/* 25495 */ {(13<<2)|2,{47,87,0}}, +/* 25496 */ {(13<<2)|2,{47,89,0}}, +/* 25497 */ {(13<<2)|2,{47,89,0}}, +/* 25498 */ {(13<<2)|2,{47,89,0}}, +/* 25499 */ {(13<<2)|2,{47,89,0}}, +/* 25500 */ {(13<<2)|2,{47,89,0}}, +/* 25501 */ {(13<<2)|2,{47,89,0}}, +/* 25502 */ {(13<<2)|2,{47,89,0}}, +/* 25503 */ {(13<<2)|2,{47,89,0}}, +/* 25504 */ {(13<<2)|2,{47,106,0}}, +/* 25505 */ {(13<<2)|2,{47,106,0}}, +/* 25506 */ {(13<<2)|2,{47,106,0}}, +/* 25507 */ {(13<<2)|2,{47,106,0}}, +/* 25508 */ {(13<<2)|2,{47,106,0}}, +/* 25509 */ {(13<<2)|2,{47,106,0}}, +/* 25510 */ {(13<<2)|2,{47,106,0}}, +/* 25511 */ {(13<<2)|2,{47,106,0}}, +/* 25512 */ {(13<<2)|2,{47,107,0}}, +/* 25513 */ {(13<<2)|2,{47,107,0}}, +/* 25514 */ {(13<<2)|2,{47,107,0}}, +/* 25515 */ {(13<<2)|2,{47,107,0}}, +/* 25516 */ {(13<<2)|2,{47,107,0}}, +/* 25517 */ {(13<<2)|2,{47,107,0}}, +/* 25518 */ {(13<<2)|2,{47,107,0}}, +/* 25519 */ {(13<<2)|2,{47,107,0}}, +/* 25520 */ {(13<<2)|2,{47,113,0}}, +/* 25521 */ {(13<<2)|2,{47,113,0}}, +/* 25522 */ {(13<<2)|2,{47,113,0}}, +/* 25523 */ {(13<<2)|2,{47,113,0}}, +/* 25524 */ {(13<<2)|2,{47,113,0}}, +/* 25525 */ {(13<<2)|2,{47,113,0}}, +/* 25526 */ {(13<<2)|2,{47,113,0}}, +/* 25527 */ {(13<<2)|2,{47,113,0}}, +/* 25528 */ {(13<<2)|2,{47,118,0}}, +/* 25529 */ {(13<<2)|2,{47,118,0}}, +/* 25530 */ {(13<<2)|2,{47,118,0}}, +/* 25531 */ {(13<<2)|2,{47,118,0}}, +/* 25532 */ {(13<<2)|2,{47,118,0}}, +/* 25533 */ {(13<<2)|2,{47,118,0}}, +/* 25534 */ {(13<<2)|2,{47,118,0}}, +/* 25535 */ {(13<<2)|2,{47,118,0}}, +/* 25536 */ {(13<<2)|2,{47,119,0}}, +/* 25537 */ {(13<<2)|2,{47,119,0}}, +/* 25538 */ {(13<<2)|2,{47,119,0}}, +/* 25539 */ {(13<<2)|2,{47,119,0}}, +/* 25540 */ {(13<<2)|2,{47,119,0}}, +/* 25541 */ {(13<<2)|2,{47,119,0}}, +/* 25542 */ {(13<<2)|2,{47,119,0}}, +/* 25543 */ {(13<<2)|2,{47,119,0}}, +/* 25544 */ {(13<<2)|2,{47,120,0}}, +/* 25545 */ {(13<<2)|2,{47,120,0}}, +/* 25546 */ {(13<<2)|2,{47,120,0}}, +/* 25547 */ {(13<<2)|2,{47,120,0}}, +/* 25548 */ {(13<<2)|2,{47,120,0}}, +/* 25549 */ {(13<<2)|2,{47,120,0}}, +/* 25550 */ {(13<<2)|2,{47,120,0}}, +/* 25551 */ {(13<<2)|2,{47,120,0}}, +/* 25552 */ {(13<<2)|2,{47,121,0}}, +/* 25553 */ {(13<<2)|2,{47,121,0}}, +/* 25554 */ {(13<<2)|2,{47,121,0}}, +/* 25555 */ {(13<<2)|2,{47,121,0}}, +/* 25556 */ {(13<<2)|2,{47,121,0}}, +/* 25557 */ {(13<<2)|2,{47,121,0}}, +/* 25558 */ {(13<<2)|2,{47,121,0}}, +/* 25559 */ {(13<<2)|2,{47,121,0}}, +/* 25560 */ {(13<<2)|2,{47,122,0}}, +/* 25561 */ {(13<<2)|2,{47,122,0}}, +/* 25562 */ {(13<<2)|2,{47,122,0}}, +/* 25563 */ {(13<<2)|2,{47,122,0}}, +/* 25564 */ {(13<<2)|2,{47,122,0}}, +/* 25565 */ {(13<<2)|2,{47,122,0}}, +/* 25566 */ {(13<<2)|2,{47,122,0}}, +/* 25567 */ {(13<<2)|2,{47,122,0}}, +/* 25568 */ {(14<<2)|2,{47,38,0}}, +/* 25569 */ {(14<<2)|2,{47,38,0}}, +/* 25570 */ {(14<<2)|2,{47,38,0}}, +/* 25571 */ {(14<<2)|2,{47,38,0}}, +/* 25572 */ {(14<<2)|2,{47,42,0}}, +/* 25573 */ {(14<<2)|2,{47,42,0}}, +/* 25574 */ {(14<<2)|2,{47,42,0}}, +/* 25575 */ {(14<<2)|2,{47,42,0}}, +/* 25576 */ {(14<<2)|2,{47,44,0}}, +/* 25577 */ {(14<<2)|2,{47,44,0}}, +/* 25578 */ {(14<<2)|2,{47,44,0}}, +/* 25579 */ {(14<<2)|2,{47,44,0}}, +/* 25580 */ {(14<<2)|2,{47,59,0}}, +/* 25581 */ {(14<<2)|2,{47,59,0}}, +/* 25582 */ {(14<<2)|2,{47,59,0}}, +/* 25583 */ {(14<<2)|2,{47,59,0}}, +/* 25584 */ {(14<<2)|2,{47,88,0}}, +/* 25585 */ {(14<<2)|2,{47,88,0}}, +/* 25586 */ {(14<<2)|2,{47,88,0}}, +/* 25587 */ {(14<<2)|2,{47,88,0}}, +/* 25588 */ {(14<<2)|2,{47,90,0}}, +/* 25589 */ {(14<<2)|2,{47,90,0}}, +/* 25590 */ {(14<<2)|2,{47,90,0}}, +/* 25591 */ {(14<<2)|2,{47,90,0}}, +/* 25592 */ {(16<<2)|2,{47,33,0}}, +/* 25593 */ {(16<<2)|2,{47,34,0}}, +/* 25594 */ {(16<<2)|2,{47,40,0}}, +/* 25595 */ {(16<<2)|2,{47,41,0}}, +/* 25596 */ {(16<<2)|2,{47,63,0}}, +/* 25597 */ {(6<<2)|1,{47,0,0}}, +/* 25598 */ {(6<<2)|1,{47,0,0}}, +/* 25599 */ {(6<<2)|1,{47,0,0}}, +/* 25600 */ {(16<<2)|3,{51,48,48}}, +/* 25601 */ {(16<<2)|3,{51,48,49}}, +/* 25602 */ {(16<<2)|3,{51,48,50}}, +/* 25603 */ {(16<<2)|3,{51,48,97}}, +/* 25604 */ {(16<<2)|3,{51,48,99}}, +/* 25605 */ {(16<<2)|3,{51,48,101}}, +/* 25606 */ {(16<<2)|3,{51,48,105}}, +/* 25607 */ {(16<<2)|3,{51,48,111}}, +/* 25608 */ {(16<<2)|3,{51,48,115}}, +/* 25609 */ {(16<<2)|3,{51,48,116}}, +/* 25610 */ {(11<<2)|2,{51,48,0}}, +/* 25611 */ {(11<<2)|2,{51,48,0}}, +/* 25612 */ {(11<<2)|2,{51,48,0}}, +/* 25613 */ {(11<<2)|2,{51,48,0}}, +/* 25614 */ {(11<<2)|2,{51,48,0}}, +/* 25615 */ {(11<<2)|2,{51,48,0}}, +/* 25616 */ {(11<<2)|2,{51,48,0}}, +/* 25617 */ {(11<<2)|2,{51,48,0}}, +/* 25618 */ {(11<<2)|2,{51,48,0}}, +/* 25619 */ {(11<<2)|2,{51,48,0}}, +/* 25620 */ {(11<<2)|2,{51,48,0}}, +/* 25621 */ {(11<<2)|2,{51,48,0}}, +/* 25622 */ {(11<<2)|2,{51,48,0}}, +/* 25623 */ {(11<<2)|2,{51,48,0}}, +/* 25624 */ {(11<<2)|2,{51,48,0}}, +/* 25625 */ {(11<<2)|2,{51,48,0}}, +/* 25626 */ {(11<<2)|2,{51,48,0}}, +/* 25627 */ {(11<<2)|2,{51,48,0}}, +/* 25628 */ {(11<<2)|2,{51,48,0}}, +/* 25629 */ {(11<<2)|2,{51,48,0}}, +/* 25630 */ {(11<<2)|2,{51,48,0}}, +/* 25631 */ {(11<<2)|2,{51,48,0}}, +/* 25632 */ {(16<<2)|3,{51,49,48}}, +/* 25633 */ {(16<<2)|3,{51,49,49}}, +/* 25634 */ {(16<<2)|3,{51,49,50}}, +/* 25635 */ {(16<<2)|3,{51,49,97}}, +/* 25636 */ {(16<<2)|3,{51,49,99}}, +/* 25637 */ {(16<<2)|3,{51,49,101}}, +/* 25638 */ {(16<<2)|3,{51,49,105}}, +/* 25639 */ {(16<<2)|3,{51,49,111}}, +/* 25640 */ {(16<<2)|3,{51,49,115}}, +/* 25641 */ {(16<<2)|3,{51,49,116}}, +/* 25642 */ {(11<<2)|2,{51,49,0}}, +/* 25643 */ {(11<<2)|2,{51,49,0}}, +/* 25644 */ {(11<<2)|2,{51,49,0}}, +/* 25645 */ {(11<<2)|2,{51,49,0}}, +/* 25646 */ {(11<<2)|2,{51,49,0}}, +/* 25647 */ {(11<<2)|2,{51,49,0}}, +/* 25648 */ {(11<<2)|2,{51,49,0}}, +/* 25649 */ {(11<<2)|2,{51,49,0}}, +/* 25650 */ {(11<<2)|2,{51,49,0}}, +/* 25651 */ {(11<<2)|2,{51,49,0}}, +/* 25652 */ {(11<<2)|2,{51,49,0}}, +/* 25653 */ {(11<<2)|2,{51,49,0}}, +/* 25654 */ {(11<<2)|2,{51,49,0}}, +/* 25655 */ {(11<<2)|2,{51,49,0}}, +/* 25656 */ {(11<<2)|2,{51,49,0}}, +/* 25657 */ {(11<<2)|2,{51,49,0}}, +/* 25658 */ {(11<<2)|2,{51,49,0}}, +/* 25659 */ {(11<<2)|2,{51,49,0}}, +/* 25660 */ {(11<<2)|2,{51,49,0}}, +/* 25661 */ {(11<<2)|2,{51,49,0}}, +/* 25662 */ {(11<<2)|2,{51,49,0}}, +/* 25663 */ {(11<<2)|2,{51,49,0}}, +/* 25664 */ {(16<<2)|3,{51,50,48}}, +/* 25665 */ {(16<<2)|3,{51,50,49}}, +/* 25666 */ {(16<<2)|3,{51,50,50}}, +/* 25667 */ {(16<<2)|3,{51,50,97}}, +/* 25668 */ {(16<<2)|3,{51,50,99}}, +/* 25669 */ {(16<<2)|3,{51,50,101}}, +/* 25670 */ {(16<<2)|3,{51,50,105}}, +/* 25671 */ {(16<<2)|3,{51,50,111}}, +/* 25672 */ {(16<<2)|3,{51,50,115}}, +/* 25673 */ {(16<<2)|3,{51,50,116}}, +/* 25674 */ {(11<<2)|2,{51,50,0}}, +/* 25675 */ {(11<<2)|2,{51,50,0}}, +/* 25676 */ {(11<<2)|2,{51,50,0}}, +/* 25677 */ {(11<<2)|2,{51,50,0}}, +/* 25678 */ {(11<<2)|2,{51,50,0}}, +/* 25679 */ {(11<<2)|2,{51,50,0}}, +/* 25680 */ {(11<<2)|2,{51,50,0}}, +/* 25681 */ {(11<<2)|2,{51,50,0}}, +/* 25682 */ {(11<<2)|2,{51,50,0}}, +/* 25683 */ {(11<<2)|2,{51,50,0}}, +/* 25684 */ {(11<<2)|2,{51,50,0}}, +/* 25685 */ {(11<<2)|2,{51,50,0}}, +/* 25686 */ {(11<<2)|2,{51,50,0}}, +/* 25687 */ {(11<<2)|2,{51,50,0}}, +/* 25688 */ {(11<<2)|2,{51,50,0}}, +/* 25689 */ {(11<<2)|2,{51,50,0}}, +/* 25690 */ {(11<<2)|2,{51,50,0}}, +/* 25691 */ {(11<<2)|2,{51,50,0}}, +/* 25692 */ {(11<<2)|2,{51,50,0}}, +/* 25693 */ {(11<<2)|2,{51,50,0}}, +/* 25694 */ {(11<<2)|2,{51,50,0}}, +/* 25695 */ {(11<<2)|2,{51,50,0}}, +/* 25696 */ {(16<<2)|3,{51,97,48}}, +/* 25697 */ {(16<<2)|3,{51,97,49}}, +/* 25698 */ {(16<<2)|3,{51,97,50}}, +/* 25699 */ {(16<<2)|3,{51,97,97}}, +/* 25700 */ {(16<<2)|3,{51,97,99}}, +/* 25701 */ {(16<<2)|3,{51,97,101}}, +/* 25702 */ {(16<<2)|3,{51,97,105}}, +/* 25703 */ {(16<<2)|3,{51,97,111}}, +/* 25704 */ {(16<<2)|3,{51,97,115}}, +/* 25705 */ {(16<<2)|3,{51,97,116}}, +/* 25706 */ {(11<<2)|2,{51,97,0}}, +/* 25707 */ {(11<<2)|2,{51,97,0}}, +/* 25708 */ {(11<<2)|2,{51,97,0}}, +/* 25709 */ {(11<<2)|2,{51,97,0}}, +/* 25710 */ {(11<<2)|2,{51,97,0}}, +/* 25711 */ {(11<<2)|2,{51,97,0}}, +/* 25712 */ {(11<<2)|2,{51,97,0}}, +/* 25713 */ {(11<<2)|2,{51,97,0}}, +/* 25714 */ {(11<<2)|2,{51,97,0}}, +/* 25715 */ {(11<<2)|2,{51,97,0}}, +/* 25716 */ {(11<<2)|2,{51,97,0}}, +/* 25717 */ {(11<<2)|2,{51,97,0}}, +/* 25718 */ {(11<<2)|2,{51,97,0}}, +/* 25719 */ {(11<<2)|2,{51,97,0}}, +/* 25720 */ {(11<<2)|2,{51,97,0}}, +/* 25721 */ {(11<<2)|2,{51,97,0}}, +/* 25722 */ {(11<<2)|2,{51,97,0}}, +/* 25723 */ {(11<<2)|2,{51,97,0}}, +/* 25724 */ {(11<<2)|2,{51,97,0}}, +/* 25725 */ {(11<<2)|2,{51,97,0}}, +/* 25726 */ {(11<<2)|2,{51,97,0}}, +/* 25727 */ {(11<<2)|2,{51,97,0}}, +/* 25728 */ {(16<<2)|3,{51,99,48}}, +/* 25729 */ {(16<<2)|3,{51,99,49}}, +/* 25730 */ {(16<<2)|3,{51,99,50}}, +/* 25731 */ {(16<<2)|3,{51,99,97}}, +/* 25732 */ {(16<<2)|3,{51,99,99}}, +/* 25733 */ {(16<<2)|3,{51,99,101}}, +/* 25734 */ {(16<<2)|3,{51,99,105}}, +/* 25735 */ {(16<<2)|3,{51,99,111}}, +/* 25736 */ {(16<<2)|3,{51,99,115}}, +/* 25737 */ {(16<<2)|3,{51,99,116}}, +/* 25738 */ {(11<<2)|2,{51,99,0}}, +/* 25739 */ {(11<<2)|2,{51,99,0}}, +/* 25740 */ {(11<<2)|2,{51,99,0}}, +/* 25741 */ {(11<<2)|2,{51,99,0}}, +/* 25742 */ {(11<<2)|2,{51,99,0}}, +/* 25743 */ {(11<<2)|2,{51,99,0}}, +/* 25744 */ {(11<<2)|2,{51,99,0}}, +/* 25745 */ {(11<<2)|2,{51,99,0}}, +/* 25746 */ {(11<<2)|2,{51,99,0}}, +/* 25747 */ {(11<<2)|2,{51,99,0}}, +/* 25748 */ {(11<<2)|2,{51,99,0}}, +/* 25749 */ {(11<<2)|2,{51,99,0}}, +/* 25750 */ {(11<<2)|2,{51,99,0}}, +/* 25751 */ {(11<<2)|2,{51,99,0}}, +/* 25752 */ {(11<<2)|2,{51,99,0}}, +/* 25753 */ {(11<<2)|2,{51,99,0}}, +/* 25754 */ {(11<<2)|2,{51,99,0}}, +/* 25755 */ {(11<<2)|2,{51,99,0}}, +/* 25756 */ {(11<<2)|2,{51,99,0}}, +/* 25757 */ {(11<<2)|2,{51,99,0}}, +/* 25758 */ {(11<<2)|2,{51,99,0}}, +/* 25759 */ {(11<<2)|2,{51,99,0}}, +/* 25760 */ {(16<<2)|3,{51,101,48}}, +/* 25761 */ {(16<<2)|3,{51,101,49}}, +/* 25762 */ {(16<<2)|3,{51,101,50}}, +/* 25763 */ {(16<<2)|3,{51,101,97}}, +/* 25764 */ {(16<<2)|3,{51,101,99}}, +/* 25765 */ {(16<<2)|3,{51,101,101}}, +/* 25766 */ {(16<<2)|3,{51,101,105}}, +/* 25767 */ {(16<<2)|3,{51,101,111}}, +/* 25768 */ {(16<<2)|3,{51,101,115}}, +/* 25769 */ {(16<<2)|3,{51,101,116}}, +/* 25770 */ {(11<<2)|2,{51,101,0}}, +/* 25771 */ {(11<<2)|2,{51,101,0}}, +/* 25772 */ {(11<<2)|2,{51,101,0}}, +/* 25773 */ {(11<<2)|2,{51,101,0}}, +/* 25774 */ {(11<<2)|2,{51,101,0}}, +/* 25775 */ {(11<<2)|2,{51,101,0}}, +/* 25776 */ {(11<<2)|2,{51,101,0}}, +/* 25777 */ {(11<<2)|2,{51,101,0}}, +/* 25778 */ {(11<<2)|2,{51,101,0}}, +/* 25779 */ {(11<<2)|2,{51,101,0}}, +/* 25780 */ {(11<<2)|2,{51,101,0}}, +/* 25781 */ {(11<<2)|2,{51,101,0}}, +/* 25782 */ {(11<<2)|2,{51,101,0}}, +/* 25783 */ {(11<<2)|2,{51,101,0}}, +/* 25784 */ {(11<<2)|2,{51,101,0}}, +/* 25785 */ {(11<<2)|2,{51,101,0}}, +/* 25786 */ {(11<<2)|2,{51,101,0}}, +/* 25787 */ {(11<<2)|2,{51,101,0}}, +/* 25788 */ {(11<<2)|2,{51,101,0}}, +/* 25789 */ {(11<<2)|2,{51,101,0}}, +/* 25790 */ {(11<<2)|2,{51,101,0}}, +/* 25791 */ {(11<<2)|2,{51,101,0}}, +/* 25792 */ {(16<<2)|3,{51,105,48}}, +/* 25793 */ {(16<<2)|3,{51,105,49}}, +/* 25794 */ {(16<<2)|3,{51,105,50}}, +/* 25795 */ {(16<<2)|3,{51,105,97}}, +/* 25796 */ {(16<<2)|3,{51,105,99}}, +/* 25797 */ {(16<<2)|3,{51,105,101}}, +/* 25798 */ {(16<<2)|3,{51,105,105}}, +/* 25799 */ {(16<<2)|3,{51,105,111}}, +/* 25800 */ {(16<<2)|3,{51,105,115}}, +/* 25801 */ {(16<<2)|3,{51,105,116}}, +/* 25802 */ {(11<<2)|2,{51,105,0}}, +/* 25803 */ {(11<<2)|2,{51,105,0}}, +/* 25804 */ {(11<<2)|2,{51,105,0}}, +/* 25805 */ {(11<<2)|2,{51,105,0}}, +/* 25806 */ {(11<<2)|2,{51,105,0}}, +/* 25807 */ {(11<<2)|2,{51,105,0}}, +/* 25808 */ {(11<<2)|2,{51,105,0}}, +/* 25809 */ {(11<<2)|2,{51,105,0}}, +/* 25810 */ {(11<<2)|2,{51,105,0}}, +/* 25811 */ {(11<<2)|2,{51,105,0}}, +/* 25812 */ {(11<<2)|2,{51,105,0}}, +/* 25813 */ {(11<<2)|2,{51,105,0}}, +/* 25814 */ {(11<<2)|2,{51,105,0}}, +/* 25815 */ {(11<<2)|2,{51,105,0}}, +/* 25816 */ {(11<<2)|2,{51,105,0}}, +/* 25817 */ {(11<<2)|2,{51,105,0}}, +/* 25818 */ {(11<<2)|2,{51,105,0}}, +/* 25819 */ {(11<<2)|2,{51,105,0}}, +/* 25820 */ {(11<<2)|2,{51,105,0}}, +/* 25821 */ {(11<<2)|2,{51,105,0}}, +/* 25822 */ {(11<<2)|2,{51,105,0}}, +/* 25823 */ {(11<<2)|2,{51,105,0}}, +/* 25824 */ {(16<<2)|3,{51,111,48}}, +/* 25825 */ {(16<<2)|3,{51,111,49}}, +/* 25826 */ {(16<<2)|3,{51,111,50}}, +/* 25827 */ {(16<<2)|3,{51,111,97}}, +/* 25828 */ {(16<<2)|3,{51,111,99}}, +/* 25829 */ {(16<<2)|3,{51,111,101}}, +/* 25830 */ {(16<<2)|3,{51,111,105}}, +/* 25831 */ {(16<<2)|3,{51,111,111}}, +/* 25832 */ {(16<<2)|3,{51,111,115}}, +/* 25833 */ {(16<<2)|3,{51,111,116}}, +/* 25834 */ {(11<<2)|2,{51,111,0}}, +/* 25835 */ {(11<<2)|2,{51,111,0}}, +/* 25836 */ {(11<<2)|2,{51,111,0}}, +/* 25837 */ {(11<<2)|2,{51,111,0}}, +/* 25838 */ {(11<<2)|2,{51,111,0}}, +/* 25839 */ {(11<<2)|2,{51,111,0}}, +/* 25840 */ {(11<<2)|2,{51,111,0}}, +/* 25841 */ {(11<<2)|2,{51,111,0}}, +/* 25842 */ {(11<<2)|2,{51,111,0}}, +/* 25843 */ {(11<<2)|2,{51,111,0}}, +/* 25844 */ {(11<<2)|2,{51,111,0}}, +/* 25845 */ {(11<<2)|2,{51,111,0}}, +/* 25846 */ {(11<<2)|2,{51,111,0}}, +/* 25847 */ {(11<<2)|2,{51,111,0}}, +/* 25848 */ {(11<<2)|2,{51,111,0}}, +/* 25849 */ {(11<<2)|2,{51,111,0}}, +/* 25850 */ {(11<<2)|2,{51,111,0}}, +/* 25851 */ {(11<<2)|2,{51,111,0}}, +/* 25852 */ {(11<<2)|2,{51,111,0}}, +/* 25853 */ {(11<<2)|2,{51,111,0}}, +/* 25854 */ {(11<<2)|2,{51,111,0}}, +/* 25855 */ {(11<<2)|2,{51,111,0}}, +/* 25856 */ {(16<<2)|3,{51,115,48}}, +/* 25857 */ {(16<<2)|3,{51,115,49}}, +/* 25858 */ {(16<<2)|3,{51,115,50}}, +/* 25859 */ {(16<<2)|3,{51,115,97}}, +/* 25860 */ {(16<<2)|3,{51,115,99}}, +/* 25861 */ {(16<<2)|3,{51,115,101}}, +/* 25862 */ {(16<<2)|3,{51,115,105}}, +/* 25863 */ {(16<<2)|3,{51,115,111}}, +/* 25864 */ {(16<<2)|3,{51,115,115}}, +/* 25865 */ {(16<<2)|3,{51,115,116}}, +/* 25866 */ {(11<<2)|2,{51,115,0}}, +/* 25867 */ {(11<<2)|2,{51,115,0}}, +/* 25868 */ {(11<<2)|2,{51,115,0}}, +/* 25869 */ {(11<<2)|2,{51,115,0}}, +/* 25870 */ {(11<<2)|2,{51,115,0}}, +/* 25871 */ {(11<<2)|2,{51,115,0}}, +/* 25872 */ {(11<<2)|2,{51,115,0}}, +/* 25873 */ {(11<<2)|2,{51,115,0}}, +/* 25874 */ {(11<<2)|2,{51,115,0}}, +/* 25875 */ {(11<<2)|2,{51,115,0}}, +/* 25876 */ {(11<<2)|2,{51,115,0}}, +/* 25877 */ {(11<<2)|2,{51,115,0}}, +/* 25878 */ {(11<<2)|2,{51,115,0}}, +/* 25879 */ {(11<<2)|2,{51,115,0}}, +/* 25880 */ {(11<<2)|2,{51,115,0}}, +/* 25881 */ {(11<<2)|2,{51,115,0}}, +/* 25882 */ {(11<<2)|2,{51,115,0}}, +/* 25883 */ {(11<<2)|2,{51,115,0}}, +/* 25884 */ {(11<<2)|2,{51,115,0}}, +/* 25885 */ {(11<<2)|2,{51,115,0}}, +/* 25886 */ {(11<<2)|2,{51,115,0}}, +/* 25887 */ {(11<<2)|2,{51,115,0}}, +/* 25888 */ {(16<<2)|3,{51,116,48}}, +/* 25889 */ {(16<<2)|3,{51,116,49}}, +/* 25890 */ {(16<<2)|3,{51,116,50}}, +/* 25891 */ {(16<<2)|3,{51,116,97}}, +/* 25892 */ {(16<<2)|3,{51,116,99}}, +/* 25893 */ {(16<<2)|3,{51,116,101}}, +/* 25894 */ {(16<<2)|3,{51,116,105}}, +/* 25895 */ {(16<<2)|3,{51,116,111}}, +/* 25896 */ {(16<<2)|3,{51,116,115}}, +/* 25897 */ {(16<<2)|3,{51,116,116}}, +/* 25898 */ {(11<<2)|2,{51,116,0}}, +/* 25899 */ {(11<<2)|2,{51,116,0}}, +/* 25900 */ {(11<<2)|2,{51,116,0}}, +/* 25901 */ {(11<<2)|2,{51,116,0}}, +/* 25902 */ {(11<<2)|2,{51,116,0}}, +/* 25903 */ {(11<<2)|2,{51,116,0}}, +/* 25904 */ {(11<<2)|2,{51,116,0}}, +/* 25905 */ {(11<<2)|2,{51,116,0}}, +/* 25906 */ {(11<<2)|2,{51,116,0}}, +/* 25907 */ {(11<<2)|2,{51,116,0}}, +/* 25908 */ {(11<<2)|2,{51,116,0}}, +/* 25909 */ {(11<<2)|2,{51,116,0}}, +/* 25910 */ {(11<<2)|2,{51,116,0}}, +/* 25911 */ {(11<<2)|2,{51,116,0}}, +/* 25912 */ {(11<<2)|2,{51,116,0}}, +/* 25913 */ {(11<<2)|2,{51,116,0}}, +/* 25914 */ {(11<<2)|2,{51,116,0}}, +/* 25915 */ {(11<<2)|2,{51,116,0}}, +/* 25916 */ {(11<<2)|2,{51,116,0}}, +/* 25917 */ {(11<<2)|2,{51,116,0}}, +/* 25918 */ {(11<<2)|2,{51,116,0}}, +/* 25919 */ {(11<<2)|2,{51,116,0}}, +/* 25920 */ {(12<<2)|2,{51,32,0}}, +/* 25921 */ {(12<<2)|2,{51,32,0}}, +/* 25922 */ {(12<<2)|2,{51,32,0}}, +/* 25923 */ {(12<<2)|2,{51,32,0}}, +/* 25924 */ {(12<<2)|2,{51,32,0}}, +/* 25925 */ {(12<<2)|2,{51,32,0}}, +/* 25926 */ {(12<<2)|2,{51,32,0}}, +/* 25927 */ {(12<<2)|2,{51,32,0}}, +/* 25928 */ {(12<<2)|2,{51,32,0}}, +/* 25929 */ {(12<<2)|2,{51,32,0}}, +/* 25930 */ {(12<<2)|2,{51,32,0}}, +/* 25931 */ {(12<<2)|2,{51,32,0}}, +/* 25932 */ {(12<<2)|2,{51,32,0}}, +/* 25933 */ {(12<<2)|2,{51,32,0}}, +/* 25934 */ {(12<<2)|2,{51,32,0}}, +/* 25935 */ {(12<<2)|2,{51,32,0}}, +/* 25936 */ {(12<<2)|2,{51,37,0}}, +/* 25937 */ {(12<<2)|2,{51,37,0}}, +/* 25938 */ {(12<<2)|2,{51,37,0}}, +/* 25939 */ {(12<<2)|2,{51,37,0}}, +/* 25940 */ {(12<<2)|2,{51,37,0}}, +/* 25941 */ {(12<<2)|2,{51,37,0}}, +/* 25942 */ {(12<<2)|2,{51,37,0}}, +/* 25943 */ {(12<<2)|2,{51,37,0}}, +/* 25944 */ {(12<<2)|2,{51,37,0}}, +/* 25945 */ {(12<<2)|2,{51,37,0}}, +/* 25946 */ {(12<<2)|2,{51,37,0}}, +/* 25947 */ {(12<<2)|2,{51,37,0}}, +/* 25948 */ {(12<<2)|2,{51,37,0}}, +/* 25949 */ {(12<<2)|2,{51,37,0}}, +/* 25950 */ {(12<<2)|2,{51,37,0}}, +/* 25951 */ {(12<<2)|2,{51,37,0}}, +/* 25952 */ {(12<<2)|2,{51,45,0}}, +/* 25953 */ {(12<<2)|2,{51,45,0}}, +/* 25954 */ {(12<<2)|2,{51,45,0}}, +/* 25955 */ {(12<<2)|2,{51,45,0}}, +/* 25956 */ {(12<<2)|2,{51,45,0}}, +/* 25957 */ {(12<<2)|2,{51,45,0}}, +/* 25958 */ {(12<<2)|2,{51,45,0}}, +/* 25959 */ {(12<<2)|2,{51,45,0}}, +/* 25960 */ {(12<<2)|2,{51,45,0}}, +/* 25961 */ {(12<<2)|2,{51,45,0}}, +/* 25962 */ {(12<<2)|2,{51,45,0}}, +/* 25963 */ {(12<<2)|2,{51,45,0}}, +/* 25964 */ {(12<<2)|2,{51,45,0}}, +/* 25965 */ {(12<<2)|2,{51,45,0}}, +/* 25966 */ {(12<<2)|2,{51,45,0}}, +/* 25967 */ {(12<<2)|2,{51,45,0}}, +/* 25968 */ {(12<<2)|2,{51,46,0}}, +/* 25969 */ {(12<<2)|2,{51,46,0}}, +/* 25970 */ {(12<<2)|2,{51,46,0}}, +/* 25971 */ {(12<<2)|2,{51,46,0}}, +/* 25972 */ {(12<<2)|2,{51,46,0}}, +/* 25973 */ {(12<<2)|2,{51,46,0}}, +/* 25974 */ {(12<<2)|2,{51,46,0}}, +/* 25975 */ {(12<<2)|2,{51,46,0}}, +/* 25976 */ {(12<<2)|2,{51,46,0}}, +/* 25977 */ {(12<<2)|2,{51,46,0}}, +/* 25978 */ {(12<<2)|2,{51,46,0}}, +/* 25979 */ {(12<<2)|2,{51,46,0}}, +/* 25980 */ {(12<<2)|2,{51,46,0}}, +/* 25981 */ {(12<<2)|2,{51,46,0}}, +/* 25982 */ {(12<<2)|2,{51,46,0}}, +/* 25983 */ {(12<<2)|2,{51,46,0}}, +/* 25984 */ {(12<<2)|2,{51,47,0}}, +/* 25985 */ {(12<<2)|2,{51,47,0}}, +/* 25986 */ {(12<<2)|2,{51,47,0}}, +/* 25987 */ {(12<<2)|2,{51,47,0}}, +/* 25988 */ {(12<<2)|2,{51,47,0}}, +/* 25989 */ {(12<<2)|2,{51,47,0}}, +/* 25990 */ {(12<<2)|2,{51,47,0}}, +/* 25991 */ {(12<<2)|2,{51,47,0}}, +/* 25992 */ {(12<<2)|2,{51,47,0}}, +/* 25993 */ {(12<<2)|2,{51,47,0}}, +/* 25994 */ {(12<<2)|2,{51,47,0}}, +/* 25995 */ {(12<<2)|2,{51,47,0}}, +/* 25996 */ {(12<<2)|2,{51,47,0}}, +/* 25997 */ {(12<<2)|2,{51,47,0}}, +/* 25998 */ {(12<<2)|2,{51,47,0}}, +/* 25999 */ {(12<<2)|2,{51,47,0}}, +/* 26000 */ {(12<<2)|2,{51,51,0}}, +/* 26001 */ {(12<<2)|2,{51,51,0}}, +/* 26002 */ {(12<<2)|2,{51,51,0}}, +/* 26003 */ {(12<<2)|2,{51,51,0}}, +/* 26004 */ {(12<<2)|2,{51,51,0}}, +/* 26005 */ {(12<<2)|2,{51,51,0}}, +/* 26006 */ {(12<<2)|2,{51,51,0}}, +/* 26007 */ {(12<<2)|2,{51,51,0}}, +/* 26008 */ {(12<<2)|2,{51,51,0}}, +/* 26009 */ {(12<<2)|2,{51,51,0}}, +/* 26010 */ {(12<<2)|2,{51,51,0}}, +/* 26011 */ {(12<<2)|2,{51,51,0}}, +/* 26012 */ {(12<<2)|2,{51,51,0}}, +/* 26013 */ {(12<<2)|2,{51,51,0}}, +/* 26014 */ {(12<<2)|2,{51,51,0}}, +/* 26015 */ {(12<<2)|2,{51,51,0}}, +/* 26016 */ {(12<<2)|2,{51,52,0}}, +/* 26017 */ {(12<<2)|2,{51,52,0}}, +/* 26018 */ {(12<<2)|2,{51,52,0}}, +/* 26019 */ {(12<<2)|2,{51,52,0}}, +/* 26020 */ {(12<<2)|2,{51,52,0}}, +/* 26021 */ {(12<<2)|2,{51,52,0}}, +/* 26022 */ {(12<<2)|2,{51,52,0}}, +/* 26023 */ {(12<<2)|2,{51,52,0}}, +/* 26024 */ {(12<<2)|2,{51,52,0}}, +/* 26025 */ {(12<<2)|2,{51,52,0}}, +/* 26026 */ {(12<<2)|2,{51,52,0}}, +/* 26027 */ {(12<<2)|2,{51,52,0}}, +/* 26028 */ {(12<<2)|2,{51,52,0}}, +/* 26029 */ {(12<<2)|2,{51,52,0}}, +/* 26030 */ {(12<<2)|2,{51,52,0}}, +/* 26031 */ {(12<<2)|2,{51,52,0}}, +/* 26032 */ {(12<<2)|2,{51,53,0}}, +/* 26033 */ {(12<<2)|2,{51,53,0}}, +/* 26034 */ {(12<<2)|2,{51,53,0}}, +/* 26035 */ {(12<<2)|2,{51,53,0}}, +/* 26036 */ {(12<<2)|2,{51,53,0}}, +/* 26037 */ {(12<<2)|2,{51,53,0}}, +/* 26038 */ {(12<<2)|2,{51,53,0}}, +/* 26039 */ {(12<<2)|2,{51,53,0}}, +/* 26040 */ {(12<<2)|2,{51,53,0}}, +/* 26041 */ {(12<<2)|2,{51,53,0}}, +/* 26042 */ {(12<<2)|2,{51,53,0}}, +/* 26043 */ {(12<<2)|2,{51,53,0}}, +/* 26044 */ {(12<<2)|2,{51,53,0}}, +/* 26045 */ {(12<<2)|2,{51,53,0}}, +/* 26046 */ {(12<<2)|2,{51,53,0}}, +/* 26047 */ {(12<<2)|2,{51,53,0}}, +/* 26048 */ {(12<<2)|2,{51,54,0}}, +/* 26049 */ {(12<<2)|2,{51,54,0}}, +/* 26050 */ {(12<<2)|2,{51,54,0}}, +/* 26051 */ {(12<<2)|2,{51,54,0}}, +/* 26052 */ {(12<<2)|2,{51,54,0}}, +/* 26053 */ {(12<<2)|2,{51,54,0}}, +/* 26054 */ {(12<<2)|2,{51,54,0}}, +/* 26055 */ {(12<<2)|2,{51,54,0}}, +/* 26056 */ {(12<<2)|2,{51,54,0}}, +/* 26057 */ {(12<<2)|2,{51,54,0}}, +/* 26058 */ {(12<<2)|2,{51,54,0}}, +/* 26059 */ {(12<<2)|2,{51,54,0}}, +/* 26060 */ {(12<<2)|2,{51,54,0}}, +/* 26061 */ {(12<<2)|2,{51,54,0}}, +/* 26062 */ {(12<<2)|2,{51,54,0}}, +/* 26063 */ {(12<<2)|2,{51,54,0}}, +/* 26064 */ {(12<<2)|2,{51,55,0}}, +/* 26065 */ {(12<<2)|2,{51,55,0}}, +/* 26066 */ {(12<<2)|2,{51,55,0}}, +/* 26067 */ {(12<<2)|2,{51,55,0}}, +/* 26068 */ {(12<<2)|2,{51,55,0}}, +/* 26069 */ {(12<<2)|2,{51,55,0}}, +/* 26070 */ {(12<<2)|2,{51,55,0}}, +/* 26071 */ {(12<<2)|2,{51,55,0}}, +/* 26072 */ {(12<<2)|2,{51,55,0}}, +/* 26073 */ {(12<<2)|2,{51,55,0}}, +/* 26074 */ {(12<<2)|2,{51,55,0}}, +/* 26075 */ {(12<<2)|2,{51,55,0}}, +/* 26076 */ {(12<<2)|2,{51,55,0}}, +/* 26077 */ {(12<<2)|2,{51,55,0}}, +/* 26078 */ {(12<<2)|2,{51,55,0}}, +/* 26079 */ {(12<<2)|2,{51,55,0}}, +/* 26080 */ {(12<<2)|2,{51,56,0}}, +/* 26081 */ {(12<<2)|2,{51,56,0}}, +/* 26082 */ {(12<<2)|2,{51,56,0}}, +/* 26083 */ {(12<<2)|2,{51,56,0}}, +/* 26084 */ {(12<<2)|2,{51,56,0}}, +/* 26085 */ {(12<<2)|2,{51,56,0}}, +/* 26086 */ {(12<<2)|2,{51,56,0}}, +/* 26087 */ {(12<<2)|2,{51,56,0}}, +/* 26088 */ {(12<<2)|2,{51,56,0}}, +/* 26089 */ {(12<<2)|2,{51,56,0}}, +/* 26090 */ {(12<<2)|2,{51,56,0}}, +/* 26091 */ {(12<<2)|2,{51,56,0}}, +/* 26092 */ {(12<<2)|2,{51,56,0}}, +/* 26093 */ {(12<<2)|2,{51,56,0}}, +/* 26094 */ {(12<<2)|2,{51,56,0}}, +/* 26095 */ {(12<<2)|2,{51,56,0}}, +/* 26096 */ {(12<<2)|2,{51,57,0}}, +/* 26097 */ {(12<<2)|2,{51,57,0}}, +/* 26098 */ {(12<<2)|2,{51,57,0}}, +/* 26099 */ {(12<<2)|2,{51,57,0}}, +/* 26100 */ {(12<<2)|2,{51,57,0}}, +/* 26101 */ {(12<<2)|2,{51,57,0}}, +/* 26102 */ {(12<<2)|2,{51,57,0}}, +/* 26103 */ {(12<<2)|2,{51,57,0}}, +/* 26104 */ {(12<<2)|2,{51,57,0}}, +/* 26105 */ {(12<<2)|2,{51,57,0}}, +/* 26106 */ {(12<<2)|2,{51,57,0}}, +/* 26107 */ {(12<<2)|2,{51,57,0}}, +/* 26108 */ {(12<<2)|2,{51,57,0}}, +/* 26109 */ {(12<<2)|2,{51,57,0}}, +/* 26110 */ {(12<<2)|2,{51,57,0}}, +/* 26111 */ {(12<<2)|2,{51,57,0}}, +/* 26112 */ {(12<<2)|2,{51,61,0}}, +/* 26113 */ {(12<<2)|2,{51,61,0}}, +/* 26114 */ {(12<<2)|2,{51,61,0}}, +/* 26115 */ {(12<<2)|2,{51,61,0}}, +/* 26116 */ {(12<<2)|2,{51,61,0}}, +/* 26117 */ {(12<<2)|2,{51,61,0}}, +/* 26118 */ {(12<<2)|2,{51,61,0}}, +/* 26119 */ {(12<<2)|2,{51,61,0}}, +/* 26120 */ {(12<<2)|2,{51,61,0}}, +/* 26121 */ {(12<<2)|2,{51,61,0}}, +/* 26122 */ {(12<<2)|2,{51,61,0}}, +/* 26123 */ {(12<<2)|2,{51,61,0}}, +/* 26124 */ {(12<<2)|2,{51,61,0}}, +/* 26125 */ {(12<<2)|2,{51,61,0}}, +/* 26126 */ {(12<<2)|2,{51,61,0}}, +/* 26127 */ {(12<<2)|2,{51,61,0}}, +/* 26128 */ {(12<<2)|2,{51,65,0}}, +/* 26129 */ {(12<<2)|2,{51,65,0}}, +/* 26130 */ {(12<<2)|2,{51,65,0}}, +/* 26131 */ {(12<<2)|2,{51,65,0}}, +/* 26132 */ {(12<<2)|2,{51,65,0}}, +/* 26133 */ {(12<<2)|2,{51,65,0}}, +/* 26134 */ {(12<<2)|2,{51,65,0}}, +/* 26135 */ {(12<<2)|2,{51,65,0}}, +/* 26136 */ {(12<<2)|2,{51,65,0}}, +/* 26137 */ {(12<<2)|2,{51,65,0}}, +/* 26138 */ {(12<<2)|2,{51,65,0}}, +/* 26139 */ {(12<<2)|2,{51,65,0}}, +/* 26140 */ {(12<<2)|2,{51,65,0}}, +/* 26141 */ {(12<<2)|2,{51,65,0}}, +/* 26142 */ {(12<<2)|2,{51,65,0}}, +/* 26143 */ {(12<<2)|2,{51,65,0}}, +/* 26144 */ {(12<<2)|2,{51,95,0}}, +/* 26145 */ {(12<<2)|2,{51,95,0}}, +/* 26146 */ {(12<<2)|2,{51,95,0}}, +/* 26147 */ {(12<<2)|2,{51,95,0}}, +/* 26148 */ {(12<<2)|2,{51,95,0}}, +/* 26149 */ {(12<<2)|2,{51,95,0}}, +/* 26150 */ {(12<<2)|2,{51,95,0}}, +/* 26151 */ {(12<<2)|2,{51,95,0}}, +/* 26152 */ {(12<<2)|2,{51,95,0}}, +/* 26153 */ {(12<<2)|2,{51,95,0}}, +/* 26154 */ {(12<<2)|2,{51,95,0}}, +/* 26155 */ {(12<<2)|2,{51,95,0}}, +/* 26156 */ {(12<<2)|2,{51,95,0}}, +/* 26157 */ {(12<<2)|2,{51,95,0}}, +/* 26158 */ {(12<<2)|2,{51,95,0}}, +/* 26159 */ {(12<<2)|2,{51,95,0}}, +/* 26160 */ {(12<<2)|2,{51,98,0}}, +/* 26161 */ {(12<<2)|2,{51,98,0}}, +/* 26162 */ {(12<<2)|2,{51,98,0}}, +/* 26163 */ {(12<<2)|2,{51,98,0}}, +/* 26164 */ {(12<<2)|2,{51,98,0}}, +/* 26165 */ {(12<<2)|2,{51,98,0}}, +/* 26166 */ {(12<<2)|2,{51,98,0}}, +/* 26167 */ {(12<<2)|2,{51,98,0}}, +/* 26168 */ {(12<<2)|2,{51,98,0}}, +/* 26169 */ {(12<<2)|2,{51,98,0}}, +/* 26170 */ {(12<<2)|2,{51,98,0}}, +/* 26171 */ {(12<<2)|2,{51,98,0}}, +/* 26172 */ {(12<<2)|2,{51,98,0}}, +/* 26173 */ {(12<<2)|2,{51,98,0}}, +/* 26174 */ {(12<<2)|2,{51,98,0}}, +/* 26175 */ {(12<<2)|2,{51,98,0}}, +/* 26176 */ {(12<<2)|2,{51,100,0}}, +/* 26177 */ {(12<<2)|2,{51,100,0}}, +/* 26178 */ {(12<<2)|2,{51,100,0}}, +/* 26179 */ {(12<<2)|2,{51,100,0}}, +/* 26180 */ {(12<<2)|2,{51,100,0}}, +/* 26181 */ {(12<<2)|2,{51,100,0}}, +/* 26182 */ {(12<<2)|2,{51,100,0}}, +/* 26183 */ {(12<<2)|2,{51,100,0}}, +/* 26184 */ {(12<<2)|2,{51,100,0}}, +/* 26185 */ {(12<<2)|2,{51,100,0}}, +/* 26186 */ {(12<<2)|2,{51,100,0}}, +/* 26187 */ {(12<<2)|2,{51,100,0}}, +/* 26188 */ {(12<<2)|2,{51,100,0}}, +/* 26189 */ {(12<<2)|2,{51,100,0}}, +/* 26190 */ {(12<<2)|2,{51,100,0}}, +/* 26191 */ {(12<<2)|2,{51,100,0}}, +/* 26192 */ {(12<<2)|2,{51,102,0}}, +/* 26193 */ {(12<<2)|2,{51,102,0}}, +/* 26194 */ {(12<<2)|2,{51,102,0}}, +/* 26195 */ {(12<<2)|2,{51,102,0}}, +/* 26196 */ {(12<<2)|2,{51,102,0}}, +/* 26197 */ {(12<<2)|2,{51,102,0}}, +/* 26198 */ {(12<<2)|2,{51,102,0}}, +/* 26199 */ {(12<<2)|2,{51,102,0}}, +/* 26200 */ {(12<<2)|2,{51,102,0}}, +/* 26201 */ {(12<<2)|2,{51,102,0}}, +/* 26202 */ {(12<<2)|2,{51,102,0}}, +/* 26203 */ {(12<<2)|2,{51,102,0}}, +/* 26204 */ {(12<<2)|2,{51,102,0}}, +/* 26205 */ {(12<<2)|2,{51,102,0}}, +/* 26206 */ {(12<<2)|2,{51,102,0}}, +/* 26207 */ {(12<<2)|2,{51,102,0}}, +/* 26208 */ {(12<<2)|2,{51,103,0}}, +/* 26209 */ {(12<<2)|2,{51,103,0}}, +/* 26210 */ {(12<<2)|2,{51,103,0}}, +/* 26211 */ {(12<<2)|2,{51,103,0}}, +/* 26212 */ {(12<<2)|2,{51,103,0}}, +/* 26213 */ {(12<<2)|2,{51,103,0}}, +/* 26214 */ {(12<<2)|2,{51,103,0}}, +/* 26215 */ {(12<<2)|2,{51,103,0}}, +/* 26216 */ {(12<<2)|2,{51,103,0}}, +/* 26217 */ {(12<<2)|2,{51,103,0}}, +/* 26218 */ {(12<<2)|2,{51,103,0}}, +/* 26219 */ {(12<<2)|2,{51,103,0}}, +/* 26220 */ {(12<<2)|2,{51,103,0}}, +/* 26221 */ {(12<<2)|2,{51,103,0}}, +/* 26222 */ {(12<<2)|2,{51,103,0}}, +/* 26223 */ {(12<<2)|2,{51,103,0}}, +/* 26224 */ {(12<<2)|2,{51,104,0}}, +/* 26225 */ {(12<<2)|2,{51,104,0}}, +/* 26226 */ {(12<<2)|2,{51,104,0}}, +/* 26227 */ {(12<<2)|2,{51,104,0}}, +/* 26228 */ {(12<<2)|2,{51,104,0}}, +/* 26229 */ {(12<<2)|2,{51,104,0}}, +/* 26230 */ {(12<<2)|2,{51,104,0}}, +/* 26231 */ {(12<<2)|2,{51,104,0}}, +/* 26232 */ {(12<<2)|2,{51,104,0}}, +/* 26233 */ {(12<<2)|2,{51,104,0}}, +/* 26234 */ {(12<<2)|2,{51,104,0}}, +/* 26235 */ {(12<<2)|2,{51,104,0}}, +/* 26236 */ {(12<<2)|2,{51,104,0}}, +/* 26237 */ {(12<<2)|2,{51,104,0}}, +/* 26238 */ {(12<<2)|2,{51,104,0}}, +/* 26239 */ {(12<<2)|2,{51,104,0}}, +/* 26240 */ {(12<<2)|2,{51,108,0}}, +/* 26241 */ {(12<<2)|2,{51,108,0}}, +/* 26242 */ {(12<<2)|2,{51,108,0}}, +/* 26243 */ {(12<<2)|2,{51,108,0}}, +/* 26244 */ {(12<<2)|2,{51,108,0}}, +/* 26245 */ {(12<<2)|2,{51,108,0}}, +/* 26246 */ {(12<<2)|2,{51,108,0}}, +/* 26247 */ {(12<<2)|2,{51,108,0}}, +/* 26248 */ {(12<<2)|2,{51,108,0}}, +/* 26249 */ {(12<<2)|2,{51,108,0}}, +/* 26250 */ {(12<<2)|2,{51,108,0}}, +/* 26251 */ {(12<<2)|2,{51,108,0}}, +/* 26252 */ {(12<<2)|2,{51,108,0}}, +/* 26253 */ {(12<<2)|2,{51,108,0}}, +/* 26254 */ {(12<<2)|2,{51,108,0}}, +/* 26255 */ {(12<<2)|2,{51,108,0}}, +/* 26256 */ {(12<<2)|2,{51,109,0}}, +/* 26257 */ {(12<<2)|2,{51,109,0}}, +/* 26258 */ {(12<<2)|2,{51,109,0}}, +/* 26259 */ {(12<<2)|2,{51,109,0}}, +/* 26260 */ {(12<<2)|2,{51,109,0}}, +/* 26261 */ {(12<<2)|2,{51,109,0}}, +/* 26262 */ {(12<<2)|2,{51,109,0}}, +/* 26263 */ {(12<<2)|2,{51,109,0}}, +/* 26264 */ {(12<<2)|2,{51,109,0}}, +/* 26265 */ {(12<<2)|2,{51,109,0}}, +/* 26266 */ {(12<<2)|2,{51,109,0}}, +/* 26267 */ {(12<<2)|2,{51,109,0}}, +/* 26268 */ {(12<<2)|2,{51,109,0}}, +/* 26269 */ {(12<<2)|2,{51,109,0}}, +/* 26270 */ {(12<<2)|2,{51,109,0}}, +/* 26271 */ {(12<<2)|2,{51,109,0}}, +/* 26272 */ {(12<<2)|2,{51,110,0}}, +/* 26273 */ {(12<<2)|2,{51,110,0}}, +/* 26274 */ {(12<<2)|2,{51,110,0}}, +/* 26275 */ {(12<<2)|2,{51,110,0}}, +/* 26276 */ {(12<<2)|2,{51,110,0}}, +/* 26277 */ {(12<<2)|2,{51,110,0}}, +/* 26278 */ {(12<<2)|2,{51,110,0}}, +/* 26279 */ {(12<<2)|2,{51,110,0}}, +/* 26280 */ {(12<<2)|2,{51,110,0}}, +/* 26281 */ {(12<<2)|2,{51,110,0}}, +/* 26282 */ {(12<<2)|2,{51,110,0}}, +/* 26283 */ {(12<<2)|2,{51,110,0}}, +/* 26284 */ {(12<<2)|2,{51,110,0}}, +/* 26285 */ {(12<<2)|2,{51,110,0}}, +/* 26286 */ {(12<<2)|2,{51,110,0}}, +/* 26287 */ {(12<<2)|2,{51,110,0}}, +/* 26288 */ {(12<<2)|2,{51,112,0}}, +/* 26289 */ {(12<<2)|2,{51,112,0}}, +/* 26290 */ {(12<<2)|2,{51,112,0}}, +/* 26291 */ {(12<<2)|2,{51,112,0}}, +/* 26292 */ {(12<<2)|2,{51,112,0}}, +/* 26293 */ {(12<<2)|2,{51,112,0}}, +/* 26294 */ {(12<<2)|2,{51,112,0}}, +/* 26295 */ {(12<<2)|2,{51,112,0}}, +/* 26296 */ {(12<<2)|2,{51,112,0}}, +/* 26297 */ {(12<<2)|2,{51,112,0}}, +/* 26298 */ {(12<<2)|2,{51,112,0}}, +/* 26299 */ {(12<<2)|2,{51,112,0}}, +/* 26300 */ {(12<<2)|2,{51,112,0}}, +/* 26301 */ {(12<<2)|2,{51,112,0}}, +/* 26302 */ {(12<<2)|2,{51,112,0}}, +/* 26303 */ {(12<<2)|2,{51,112,0}}, +/* 26304 */ {(12<<2)|2,{51,114,0}}, +/* 26305 */ {(12<<2)|2,{51,114,0}}, +/* 26306 */ {(12<<2)|2,{51,114,0}}, +/* 26307 */ {(12<<2)|2,{51,114,0}}, +/* 26308 */ {(12<<2)|2,{51,114,0}}, +/* 26309 */ {(12<<2)|2,{51,114,0}}, +/* 26310 */ {(12<<2)|2,{51,114,0}}, +/* 26311 */ {(12<<2)|2,{51,114,0}}, +/* 26312 */ {(12<<2)|2,{51,114,0}}, +/* 26313 */ {(12<<2)|2,{51,114,0}}, +/* 26314 */ {(12<<2)|2,{51,114,0}}, +/* 26315 */ {(12<<2)|2,{51,114,0}}, +/* 26316 */ {(12<<2)|2,{51,114,0}}, +/* 26317 */ {(12<<2)|2,{51,114,0}}, +/* 26318 */ {(12<<2)|2,{51,114,0}}, +/* 26319 */ {(12<<2)|2,{51,114,0}}, +/* 26320 */ {(12<<2)|2,{51,117,0}}, +/* 26321 */ {(12<<2)|2,{51,117,0}}, +/* 26322 */ {(12<<2)|2,{51,117,0}}, +/* 26323 */ {(12<<2)|2,{51,117,0}}, +/* 26324 */ {(12<<2)|2,{51,117,0}}, +/* 26325 */ {(12<<2)|2,{51,117,0}}, +/* 26326 */ {(12<<2)|2,{51,117,0}}, +/* 26327 */ {(12<<2)|2,{51,117,0}}, +/* 26328 */ {(12<<2)|2,{51,117,0}}, +/* 26329 */ {(12<<2)|2,{51,117,0}}, +/* 26330 */ {(12<<2)|2,{51,117,0}}, +/* 26331 */ {(12<<2)|2,{51,117,0}}, +/* 26332 */ {(12<<2)|2,{51,117,0}}, +/* 26333 */ {(12<<2)|2,{51,117,0}}, +/* 26334 */ {(12<<2)|2,{51,117,0}}, +/* 26335 */ {(12<<2)|2,{51,117,0}}, +/* 26336 */ {(13<<2)|2,{51,58,0}}, +/* 26337 */ {(13<<2)|2,{51,58,0}}, +/* 26338 */ {(13<<2)|2,{51,58,0}}, +/* 26339 */ {(13<<2)|2,{51,58,0}}, +/* 26340 */ {(13<<2)|2,{51,58,0}}, +/* 26341 */ {(13<<2)|2,{51,58,0}}, +/* 26342 */ {(13<<2)|2,{51,58,0}}, +/* 26343 */ {(13<<2)|2,{51,58,0}}, +/* 26344 */ {(13<<2)|2,{51,66,0}}, +/* 26345 */ {(13<<2)|2,{51,66,0}}, +/* 26346 */ {(13<<2)|2,{51,66,0}}, +/* 26347 */ {(13<<2)|2,{51,66,0}}, +/* 26348 */ {(13<<2)|2,{51,66,0}}, +/* 26349 */ {(13<<2)|2,{51,66,0}}, +/* 26350 */ {(13<<2)|2,{51,66,0}}, +/* 26351 */ {(13<<2)|2,{51,66,0}}, +/* 26352 */ {(13<<2)|2,{51,67,0}}, +/* 26353 */ {(13<<2)|2,{51,67,0}}, +/* 26354 */ {(13<<2)|2,{51,67,0}}, +/* 26355 */ {(13<<2)|2,{51,67,0}}, +/* 26356 */ {(13<<2)|2,{51,67,0}}, +/* 26357 */ {(13<<2)|2,{51,67,0}}, +/* 26358 */ {(13<<2)|2,{51,67,0}}, +/* 26359 */ {(13<<2)|2,{51,67,0}}, +/* 26360 */ {(13<<2)|2,{51,68,0}}, +/* 26361 */ {(13<<2)|2,{51,68,0}}, +/* 26362 */ {(13<<2)|2,{51,68,0}}, +/* 26363 */ {(13<<2)|2,{51,68,0}}, +/* 26364 */ {(13<<2)|2,{51,68,0}}, +/* 26365 */ {(13<<2)|2,{51,68,0}}, +/* 26366 */ {(13<<2)|2,{51,68,0}}, +/* 26367 */ {(13<<2)|2,{51,68,0}}, +/* 26368 */ {(13<<2)|2,{51,69,0}}, +/* 26369 */ {(13<<2)|2,{51,69,0}}, +/* 26370 */ {(13<<2)|2,{51,69,0}}, +/* 26371 */ {(13<<2)|2,{51,69,0}}, +/* 26372 */ {(13<<2)|2,{51,69,0}}, +/* 26373 */ {(13<<2)|2,{51,69,0}}, +/* 26374 */ {(13<<2)|2,{51,69,0}}, +/* 26375 */ {(13<<2)|2,{51,69,0}}, +/* 26376 */ {(13<<2)|2,{51,70,0}}, +/* 26377 */ {(13<<2)|2,{51,70,0}}, +/* 26378 */ {(13<<2)|2,{51,70,0}}, +/* 26379 */ {(13<<2)|2,{51,70,0}}, +/* 26380 */ {(13<<2)|2,{51,70,0}}, +/* 26381 */ {(13<<2)|2,{51,70,0}}, +/* 26382 */ {(13<<2)|2,{51,70,0}}, +/* 26383 */ {(13<<2)|2,{51,70,0}}, +/* 26384 */ {(13<<2)|2,{51,71,0}}, +/* 26385 */ {(13<<2)|2,{51,71,0}}, +/* 26386 */ {(13<<2)|2,{51,71,0}}, +/* 26387 */ {(13<<2)|2,{51,71,0}}, +/* 26388 */ {(13<<2)|2,{51,71,0}}, +/* 26389 */ {(13<<2)|2,{51,71,0}}, +/* 26390 */ {(13<<2)|2,{51,71,0}}, +/* 26391 */ {(13<<2)|2,{51,71,0}}, +/* 26392 */ {(13<<2)|2,{51,72,0}}, +/* 26393 */ {(13<<2)|2,{51,72,0}}, +/* 26394 */ {(13<<2)|2,{51,72,0}}, +/* 26395 */ {(13<<2)|2,{51,72,0}}, +/* 26396 */ {(13<<2)|2,{51,72,0}}, +/* 26397 */ {(13<<2)|2,{51,72,0}}, +/* 26398 */ {(13<<2)|2,{51,72,0}}, +/* 26399 */ {(13<<2)|2,{51,72,0}}, +/* 26400 */ {(13<<2)|2,{51,73,0}}, +/* 26401 */ {(13<<2)|2,{51,73,0}}, +/* 26402 */ {(13<<2)|2,{51,73,0}}, +/* 26403 */ {(13<<2)|2,{51,73,0}}, +/* 26404 */ {(13<<2)|2,{51,73,0}}, +/* 26405 */ {(13<<2)|2,{51,73,0}}, +/* 26406 */ {(13<<2)|2,{51,73,0}}, +/* 26407 */ {(13<<2)|2,{51,73,0}}, +/* 26408 */ {(13<<2)|2,{51,74,0}}, +/* 26409 */ {(13<<2)|2,{51,74,0}}, +/* 26410 */ {(13<<2)|2,{51,74,0}}, +/* 26411 */ {(13<<2)|2,{51,74,0}}, +/* 26412 */ {(13<<2)|2,{51,74,0}}, +/* 26413 */ {(13<<2)|2,{51,74,0}}, +/* 26414 */ {(13<<2)|2,{51,74,0}}, +/* 26415 */ {(13<<2)|2,{51,74,0}}, +/* 26416 */ {(13<<2)|2,{51,75,0}}, +/* 26417 */ {(13<<2)|2,{51,75,0}}, +/* 26418 */ {(13<<2)|2,{51,75,0}}, +/* 26419 */ {(13<<2)|2,{51,75,0}}, +/* 26420 */ {(13<<2)|2,{51,75,0}}, +/* 26421 */ {(13<<2)|2,{51,75,0}}, +/* 26422 */ {(13<<2)|2,{51,75,0}}, +/* 26423 */ {(13<<2)|2,{51,75,0}}, +/* 26424 */ {(13<<2)|2,{51,76,0}}, +/* 26425 */ {(13<<2)|2,{51,76,0}}, +/* 26426 */ {(13<<2)|2,{51,76,0}}, +/* 26427 */ {(13<<2)|2,{51,76,0}}, +/* 26428 */ {(13<<2)|2,{51,76,0}}, +/* 26429 */ {(13<<2)|2,{51,76,0}}, +/* 26430 */ {(13<<2)|2,{51,76,0}}, +/* 26431 */ {(13<<2)|2,{51,76,0}}, +/* 26432 */ {(13<<2)|2,{51,77,0}}, +/* 26433 */ {(13<<2)|2,{51,77,0}}, +/* 26434 */ {(13<<2)|2,{51,77,0}}, +/* 26435 */ {(13<<2)|2,{51,77,0}}, +/* 26436 */ {(13<<2)|2,{51,77,0}}, +/* 26437 */ {(13<<2)|2,{51,77,0}}, +/* 26438 */ {(13<<2)|2,{51,77,0}}, +/* 26439 */ {(13<<2)|2,{51,77,0}}, +/* 26440 */ {(13<<2)|2,{51,78,0}}, +/* 26441 */ {(13<<2)|2,{51,78,0}}, +/* 26442 */ {(13<<2)|2,{51,78,0}}, +/* 26443 */ {(13<<2)|2,{51,78,0}}, +/* 26444 */ {(13<<2)|2,{51,78,0}}, +/* 26445 */ {(13<<2)|2,{51,78,0}}, +/* 26446 */ {(13<<2)|2,{51,78,0}}, +/* 26447 */ {(13<<2)|2,{51,78,0}}, +/* 26448 */ {(13<<2)|2,{51,79,0}}, +/* 26449 */ {(13<<2)|2,{51,79,0}}, +/* 26450 */ {(13<<2)|2,{51,79,0}}, +/* 26451 */ {(13<<2)|2,{51,79,0}}, +/* 26452 */ {(13<<2)|2,{51,79,0}}, +/* 26453 */ {(13<<2)|2,{51,79,0}}, +/* 26454 */ {(13<<2)|2,{51,79,0}}, +/* 26455 */ {(13<<2)|2,{51,79,0}}, +/* 26456 */ {(13<<2)|2,{51,80,0}}, +/* 26457 */ {(13<<2)|2,{51,80,0}}, +/* 26458 */ {(13<<2)|2,{51,80,0}}, +/* 26459 */ {(13<<2)|2,{51,80,0}}, +/* 26460 */ {(13<<2)|2,{51,80,0}}, +/* 26461 */ {(13<<2)|2,{51,80,0}}, +/* 26462 */ {(13<<2)|2,{51,80,0}}, +/* 26463 */ {(13<<2)|2,{51,80,0}}, +/* 26464 */ {(13<<2)|2,{51,81,0}}, +/* 26465 */ {(13<<2)|2,{51,81,0}}, +/* 26466 */ {(13<<2)|2,{51,81,0}}, +/* 26467 */ {(13<<2)|2,{51,81,0}}, +/* 26468 */ {(13<<2)|2,{51,81,0}}, +/* 26469 */ {(13<<2)|2,{51,81,0}}, +/* 26470 */ {(13<<2)|2,{51,81,0}}, +/* 26471 */ {(13<<2)|2,{51,81,0}}, +/* 26472 */ {(13<<2)|2,{51,82,0}}, +/* 26473 */ {(13<<2)|2,{51,82,0}}, +/* 26474 */ {(13<<2)|2,{51,82,0}}, +/* 26475 */ {(13<<2)|2,{51,82,0}}, +/* 26476 */ {(13<<2)|2,{51,82,0}}, +/* 26477 */ {(13<<2)|2,{51,82,0}}, +/* 26478 */ {(13<<2)|2,{51,82,0}}, +/* 26479 */ {(13<<2)|2,{51,82,0}}, +/* 26480 */ {(13<<2)|2,{51,83,0}}, +/* 26481 */ {(13<<2)|2,{51,83,0}}, +/* 26482 */ {(13<<2)|2,{51,83,0}}, +/* 26483 */ {(13<<2)|2,{51,83,0}}, +/* 26484 */ {(13<<2)|2,{51,83,0}}, +/* 26485 */ {(13<<2)|2,{51,83,0}}, +/* 26486 */ {(13<<2)|2,{51,83,0}}, +/* 26487 */ {(13<<2)|2,{51,83,0}}, +/* 26488 */ {(13<<2)|2,{51,84,0}}, +/* 26489 */ {(13<<2)|2,{51,84,0}}, +/* 26490 */ {(13<<2)|2,{51,84,0}}, +/* 26491 */ {(13<<2)|2,{51,84,0}}, +/* 26492 */ {(13<<2)|2,{51,84,0}}, +/* 26493 */ {(13<<2)|2,{51,84,0}}, +/* 26494 */ {(13<<2)|2,{51,84,0}}, +/* 26495 */ {(13<<2)|2,{51,84,0}}, +/* 26496 */ {(13<<2)|2,{51,85,0}}, +/* 26497 */ {(13<<2)|2,{51,85,0}}, +/* 26498 */ {(13<<2)|2,{51,85,0}}, +/* 26499 */ {(13<<2)|2,{51,85,0}}, +/* 26500 */ {(13<<2)|2,{51,85,0}}, +/* 26501 */ {(13<<2)|2,{51,85,0}}, +/* 26502 */ {(13<<2)|2,{51,85,0}}, +/* 26503 */ {(13<<2)|2,{51,85,0}}, +/* 26504 */ {(13<<2)|2,{51,86,0}}, +/* 26505 */ {(13<<2)|2,{51,86,0}}, +/* 26506 */ {(13<<2)|2,{51,86,0}}, +/* 26507 */ {(13<<2)|2,{51,86,0}}, +/* 26508 */ {(13<<2)|2,{51,86,0}}, +/* 26509 */ {(13<<2)|2,{51,86,0}}, +/* 26510 */ {(13<<2)|2,{51,86,0}}, +/* 26511 */ {(13<<2)|2,{51,86,0}}, +/* 26512 */ {(13<<2)|2,{51,87,0}}, +/* 26513 */ {(13<<2)|2,{51,87,0}}, +/* 26514 */ {(13<<2)|2,{51,87,0}}, +/* 26515 */ {(13<<2)|2,{51,87,0}}, +/* 26516 */ {(13<<2)|2,{51,87,0}}, +/* 26517 */ {(13<<2)|2,{51,87,0}}, +/* 26518 */ {(13<<2)|2,{51,87,0}}, +/* 26519 */ {(13<<2)|2,{51,87,0}}, +/* 26520 */ {(13<<2)|2,{51,89,0}}, +/* 26521 */ {(13<<2)|2,{51,89,0}}, +/* 26522 */ {(13<<2)|2,{51,89,0}}, +/* 26523 */ {(13<<2)|2,{51,89,0}}, +/* 26524 */ {(13<<2)|2,{51,89,0}}, +/* 26525 */ {(13<<2)|2,{51,89,0}}, +/* 26526 */ {(13<<2)|2,{51,89,0}}, +/* 26527 */ {(13<<2)|2,{51,89,0}}, +/* 26528 */ {(13<<2)|2,{51,106,0}}, +/* 26529 */ {(13<<2)|2,{51,106,0}}, +/* 26530 */ {(13<<2)|2,{51,106,0}}, +/* 26531 */ {(13<<2)|2,{51,106,0}}, +/* 26532 */ {(13<<2)|2,{51,106,0}}, +/* 26533 */ {(13<<2)|2,{51,106,0}}, +/* 26534 */ {(13<<2)|2,{51,106,0}}, +/* 26535 */ {(13<<2)|2,{51,106,0}}, +/* 26536 */ {(13<<2)|2,{51,107,0}}, +/* 26537 */ {(13<<2)|2,{51,107,0}}, +/* 26538 */ {(13<<2)|2,{51,107,0}}, +/* 26539 */ {(13<<2)|2,{51,107,0}}, +/* 26540 */ {(13<<2)|2,{51,107,0}}, +/* 26541 */ {(13<<2)|2,{51,107,0}}, +/* 26542 */ {(13<<2)|2,{51,107,0}}, +/* 26543 */ {(13<<2)|2,{51,107,0}}, +/* 26544 */ {(13<<2)|2,{51,113,0}}, +/* 26545 */ {(13<<2)|2,{51,113,0}}, +/* 26546 */ {(13<<2)|2,{51,113,0}}, +/* 26547 */ {(13<<2)|2,{51,113,0}}, +/* 26548 */ {(13<<2)|2,{51,113,0}}, +/* 26549 */ {(13<<2)|2,{51,113,0}}, +/* 26550 */ {(13<<2)|2,{51,113,0}}, +/* 26551 */ {(13<<2)|2,{51,113,0}}, +/* 26552 */ {(13<<2)|2,{51,118,0}}, +/* 26553 */ {(13<<2)|2,{51,118,0}}, +/* 26554 */ {(13<<2)|2,{51,118,0}}, +/* 26555 */ {(13<<2)|2,{51,118,0}}, +/* 26556 */ {(13<<2)|2,{51,118,0}}, +/* 26557 */ {(13<<2)|2,{51,118,0}}, +/* 26558 */ {(13<<2)|2,{51,118,0}}, +/* 26559 */ {(13<<2)|2,{51,118,0}}, +/* 26560 */ {(13<<2)|2,{51,119,0}}, +/* 26561 */ {(13<<2)|2,{51,119,0}}, +/* 26562 */ {(13<<2)|2,{51,119,0}}, +/* 26563 */ {(13<<2)|2,{51,119,0}}, +/* 26564 */ {(13<<2)|2,{51,119,0}}, +/* 26565 */ {(13<<2)|2,{51,119,0}}, +/* 26566 */ {(13<<2)|2,{51,119,0}}, +/* 26567 */ {(13<<2)|2,{51,119,0}}, +/* 26568 */ {(13<<2)|2,{51,120,0}}, +/* 26569 */ {(13<<2)|2,{51,120,0}}, +/* 26570 */ {(13<<2)|2,{51,120,0}}, +/* 26571 */ {(13<<2)|2,{51,120,0}}, +/* 26572 */ {(13<<2)|2,{51,120,0}}, +/* 26573 */ {(13<<2)|2,{51,120,0}}, +/* 26574 */ {(13<<2)|2,{51,120,0}}, +/* 26575 */ {(13<<2)|2,{51,120,0}}, +/* 26576 */ {(13<<2)|2,{51,121,0}}, +/* 26577 */ {(13<<2)|2,{51,121,0}}, +/* 26578 */ {(13<<2)|2,{51,121,0}}, +/* 26579 */ {(13<<2)|2,{51,121,0}}, +/* 26580 */ {(13<<2)|2,{51,121,0}}, +/* 26581 */ {(13<<2)|2,{51,121,0}}, +/* 26582 */ {(13<<2)|2,{51,121,0}}, +/* 26583 */ {(13<<2)|2,{51,121,0}}, +/* 26584 */ {(13<<2)|2,{51,122,0}}, +/* 26585 */ {(13<<2)|2,{51,122,0}}, +/* 26586 */ {(13<<2)|2,{51,122,0}}, +/* 26587 */ {(13<<2)|2,{51,122,0}}, +/* 26588 */ {(13<<2)|2,{51,122,0}}, +/* 26589 */ {(13<<2)|2,{51,122,0}}, +/* 26590 */ {(13<<2)|2,{51,122,0}}, +/* 26591 */ {(13<<2)|2,{51,122,0}}, +/* 26592 */ {(14<<2)|2,{51,38,0}}, +/* 26593 */ {(14<<2)|2,{51,38,0}}, +/* 26594 */ {(14<<2)|2,{51,38,0}}, +/* 26595 */ {(14<<2)|2,{51,38,0}}, +/* 26596 */ {(14<<2)|2,{51,42,0}}, +/* 26597 */ {(14<<2)|2,{51,42,0}}, +/* 26598 */ {(14<<2)|2,{51,42,0}}, +/* 26599 */ {(14<<2)|2,{51,42,0}}, +/* 26600 */ {(14<<2)|2,{51,44,0}}, +/* 26601 */ {(14<<2)|2,{51,44,0}}, +/* 26602 */ {(14<<2)|2,{51,44,0}}, +/* 26603 */ {(14<<2)|2,{51,44,0}}, +/* 26604 */ {(14<<2)|2,{51,59,0}}, +/* 26605 */ {(14<<2)|2,{51,59,0}}, +/* 26606 */ {(14<<2)|2,{51,59,0}}, +/* 26607 */ {(14<<2)|2,{51,59,0}}, +/* 26608 */ {(14<<2)|2,{51,88,0}}, +/* 26609 */ {(14<<2)|2,{51,88,0}}, +/* 26610 */ {(14<<2)|2,{51,88,0}}, +/* 26611 */ {(14<<2)|2,{51,88,0}}, +/* 26612 */ {(14<<2)|2,{51,90,0}}, +/* 26613 */ {(14<<2)|2,{51,90,0}}, +/* 26614 */ {(14<<2)|2,{51,90,0}}, +/* 26615 */ {(14<<2)|2,{51,90,0}}, +/* 26616 */ {(16<<2)|2,{51,33,0}}, +/* 26617 */ {(16<<2)|2,{51,34,0}}, +/* 26618 */ {(16<<2)|2,{51,40,0}}, +/* 26619 */ {(16<<2)|2,{51,41,0}}, +/* 26620 */ {(16<<2)|2,{51,63,0}}, +/* 26621 */ {(6<<2)|1,{51,0,0}}, +/* 26622 */ {(6<<2)|1,{51,0,0}}, +/* 26623 */ {(6<<2)|1,{51,0,0}}, +/* 26624 */ {(16<<2)|3,{52,48,48}}, +/* 26625 */ {(16<<2)|3,{52,48,49}}, +/* 26626 */ {(16<<2)|3,{52,48,50}}, +/* 26627 */ {(16<<2)|3,{52,48,97}}, +/* 26628 */ {(16<<2)|3,{52,48,99}}, +/* 26629 */ {(16<<2)|3,{52,48,101}}, +/* 26630 */ {(16<<2)|3,{52,48,105}}, +/* 26631 */ {(16<<2)|3,{52,48,111}}, +/* 26632 */ {(16<<2)|3,{52,48,115}}, +/* 26633 */ {(16<<2)|3,{52,48,116}}, +/* 26634 */ {(11<<2)|2,{52,48,0}}, +/* 26635 */ {(11<<2)|2,{52,48,0}}, +/* 26636 */ {(11<<2)|2,{52,48,0}}, +/* 26637 */ {(11<<2)|2,{52,48,0}}, +/* 26638 */ {(11<<2)|2,{52,48,0}}, +/* 26639 */ {(11<<2)|2,{52,48,0}}, +/* 26640 */ {(11<<2)|2,{52,48,0}}, +/* 26641 */ {(11<<2)|2,{52,48,0}}, +/* 26642 */ {(11<<2)|2,{52,48,0}}, +/* 26643 */ {(11<<2)|2,{52,48,0}}, +/* 26644 */ {(11<<2)|2,{52,48,0}}, +/* 26645 */ {(11<<2)|2,{52,48,0}}, +/* 26646 */ {(11<<2)|2,{52,48,0}}, +/* 26647 */ {(11<<2)|2,{52,48,0}}, +/* 26648 */ {(11<<2)|2,{52,48,0}}, +/* 26649 */ {(11<<2)|2,{52,48,0}}, +/* 26650 */ {(11<<2)|2,{52,48,0}}, +/* 26651 */ {(11<<2)|2,{52,48,0}}, +/* 26652 */ {(11<<2)|2,{52,48,0}}, +/* 26653 */ {(11<<2)|2,{52,48,0}}, +/* 26654 */ {(11<<2)|2,{52,48,0}}, +/* 26655 */ {(11<<2)|2,{52,48,0}}, +/* 26656 */ {(16<<2)|3,{52,49,48}}, +/* 26657 */ {(16<<2)|3,{52,49,49}}, +/* 26658 */ {(16<<2)|3,{52,49,50}}, +/* 26659 */ {(16<<2)|3,{52,49,97}}, +/* 26660 */ {(16<<2)|3,{52,49,99}}, +/* 26661 */ {(16<<2)|3,{52,49,101}}, +/* 26662 */ {(16<<2)|3,{52,49,105}}, +/* 26663 */ {(16<<2)|3,{52,49,111}}, +/* 26664 */ {(16<<2)|3,{52,49,115}}, +/* 26665 */ {(16<<2)|3,{52,49,116}}, +/* 26666 */ {(11<<2)|2,{52,49,0}}, +/* 26667 */ {(11<<2)|2,{52,49,0}}, +/* 26668 */ {(11<<2)|2,{52,49,0}}, +/* 26669 */ {(11<<2)|2,{52,49,0}}, +/* 26670 */ {(11<<2)|2,{52,49,0}}, +/* 26671 */ {(11<<2)|2,{52,49,0}}, +/* 26672 */ {(11<<2)|2,{52,49,0}}, +/* 26673 */ {(11<<2)|2,{52,49,0}}, +/* 26674 */ {(11<<2)|2,{52,49,0}}, +/* 26675 */ {(11<<2)|2,{52,49,0}}, +/* 26676 */ {(11<<2)|2,{52,49,0}}, +/* 26677 */ {(11<<2)|2,{52,49,0}}, +/* 26678 */ {(11<<2)|2,{52,49,0}}, +/* 26679 */ {(11<<2)|2,{52,49,0}}, +/* 26680 */ {(11<<2)|2,{52,49,0}}, +/* 26681 */ {(11<<2)|2,{52,49,0}}, +/* 26682 */ {(11<<2)|2,{52,49,0}}, +/* 26683 */ {(11<<2)|2,{52,49,0}}, +/* 26684 */ {(11<<2)|2,{52,49,0}}, +/* 26685 */ {(11<<2)|2,{52,49,0}}, +/* 26686 */ {(11<<2)|2,{52,49,0}}, +/* 26687 */ {(11<<2)|2,{52,49,0}}, +/* 26688 */ {(16<<2)|3,{52,50,48}}, +/* 26689 */ {(16<<2)|3,{52,50,49}}, +/* 26690 */ {(16<<2)|3,{52,50,50}}, +/* 26691 */ {(16<<2)|3,{52,50,97}}, +/* 26692 */ {(16<<2)|3,{52,50,99}}, +/* 26693 */ {(16<<2)|3,{52,50,101}}, +/* 26694 */ {(16<<2)|3,{52,50,105}}, +/* 26695 */ {(16<<2)|3,{52,50,111}}, +/* 26696 */ {(16<<2)|3,{52,50,115}}, +/* 26697 */ {(16<<2)|3,{52,50,116}}, +/* 26698 */ {(11<<2)|2,{52,50,0}}, +/* 26699 */ {(11<<2)|2,{52,50,0}}, +/* 26700 */ {(11<<2)|2,{52,50,0}}, +/* 26701 */ {(11<<2)|2,{52,50,0}}, +/* 26702 */ {(11<<2)|2,{52,50,0}}, +/* 26703 */ {(11<<2)|2,{52,50,0}}, +/* 26704 */ {(11<<2)|2,{52,50,0}}, +/* 26705 */ {(11<<2)|2,{52,50,0}}, +/* 26706 */ {(11<<2)|2,{52,50,0}}, +/* 26707 */ {(11<<2)|2,{52,50,0}}, +/* 26708 */ {(11<<2)|2,{52,50,0}}, +/* 26709 */ {(11<<2)|2,{52,50,0}}, +/* 26710 */ {(11<<2)|2,{52,50,0}}, +/* 26711 */ {(11<<2)|2,{52,50,0}}, +/* 26712 */ {(11<<2)|2,{52,50,0}}, +/* 26713 */ {(11<<2)|2,{52,50,0}}, +/* 26714 */ {(11<<2)|2,{52,50,0}}, +/* 26715 */ {(11<<2)|2,{52,50,0}}, +/* 26716 */ {(11<<2)|2,{52,50,0}}, +/* 26717 */ {(11<<2)|2,{52,50,0}}, +/* 26718 */ {(11<<2)|2,{52,50,0}}, +/* 26719 */ {(11<<2)|2,{52,50,0}}, +/* 26720 */ {(16<<2)|3,{52,97,48}}, +/* 26721 */ {(16<<2)|3,{52,97,49}}, +/* 26722 */ {(16<<2)|3,{52,97,50}}, +/* 26723 */ {(16<<2)|3,{52,97,97}}, +/* 26724 */ {(16<<2)|3,{52,97,99}}, +/* 26725 */ {(16<<2)|3,{52,97,101}}, +/* 26726 */ {(16<<2)|3,{52,97,105}}, +/* 26727 */ {(16<<2)|3,{52,97,111}}, +/* 26728 */ {(16<<2)|3,{52,97,115}}, +/* 26729 */ {(16<<2)|3,{52,97,116}}, +/* 26730 */ {(11<<2)|2,{52,97,0}}, +/* 26731 */ {(11<<2)|2,{52,97,0}}, +/* 26732 */ {(11<<2)|2,{52,97,0}}, +/* 26733 */ {(11<<2)|2,{52,97,0}}, +/* 26734 */ {(11<<2)|2,{52,97,0}}, +/* 26735 */ {(11<<2)|2,{52,97,0}}, +/* 26736 */ {(11<<2)|2,{52,97,0}}, +/* 26737 */ {(11<<2)|2,{52,97,0}}, +/* 26738 */ {(11<<2)|2,{52,97,0}}, +/* 26739 */ {(11<<2)|2,{52,97,0}}, +/* 26740 */ {(11<<2)|2,{52,97,0}}, +/* 26741 */ {(11<<2)|2,{52,97,0}}, +/* 26742 */ {(11<<2)|2,{52,97,0}}, +/* 26743 */ {(11<<2)|2,{52,97,0}}, +/* 26744 */ {(11<<2)|2,{52,97,0}}, +/* 26745 */ {(11<<2)|2,{52,97,0}}, +/* 26746 */ {(11<<2)|2,{52,97,0}}, +/* 26747 */ {(11<<2)|2,{52,97,0}}, +/* 26748 */ {(11<<2)|2,{52,97,0}}, +/* 26749 */ {(11<<2)|2,{52,97,0}}, +/* 26750 */ {(11<<2)|2,{52,97,0}}, +/* 26751 */ {(11<<2)|2,{52,97,0}}, +/* 26752 */ {(16<<2)|3,{52,99,48}}, +/* 26753 */ {(16<<2)|3,{52,99,49}}, +/* 26754 */ {(16<<2)|3,{52,99,50}}, +/* 26755 */ {(16<<2)|3,{52,99,97}}, +/* 26756 */ {(16<<2)|3,{52,99,99}}, +/* 26757 */ {(16<<2)|3,{52,99,101}}, +/* 26758 */ {(16<<2)|3,{52,99,105}}, +/* 26759 */ {(16<<2)|3,{52,99,111}}, +/* 26760 */ {(16<<2)|3,{52,99,115}}, +/* 26761 */ {(16<<2)|3,{52,99,116}}, +/* 26762 */ {(11<<2)|2,{52,99,0}}, +/* 26763 */ {(11<<2)|2,{52,99,0}}, +/* 26764 */ {(11<<2)|2,{52,99,0}}, +/* 26765 */ {(11<<2)|2,{52,99,0}}, +/* 26766 */ {(11<<2)|2,{52,99,0}}, +/* 26767 */ {(11<<2)|2,{52,99,0}}, +/* 26768 */ {(11<<2)|2,{52,99,0}}, +/* 26769 */ {(11<<2)|2,{52,99,0}}, +/* 26770 */ {(11<<2)|2,{52,99,0}}, +/* 26771 */ {(11<<2)|2,{52,99,0}}, +/* 26772 */ {(11<<2)|2,{52,99,0}}, +/* 26773 */ {(11<<2)|2,{52,99,0}}, +/* 26774 */ {(11<<2)|2,{52,99,0}}, +/* 26775 */ {(11<<2)|2,{52,99,0}}, +/* 26776 */ {(11<<2)|2,{52,99,0}}, +/* 26777 */ {(11<<2)|2,{52,99,0}}, +/* 26778 */ {(11<<2)|2,{52,99,0}}, +/* 26779 */ {(11<<2)|2,{52,99,0}}, +/* 26780 */ {(11<<2)|2,{52,99,0}}, +/* 26781 */ {(11<<2)|2,{52,99,0}}, +/* 26782 */ {(11<<2)|2,{52,99,0}}, +/* 26783 */ {(11<<2)|2,{52,99,0}}, +/* 26784 */ {(16<<2)|3,{52,101,48}}, +/* 26785 */ {(16<<2)|3,{52,101,49}}, +/* 26786 */ {(16<<2)|3,{52,101,50}}, +/* 26787 */ {(16<<2)|3,{52,101,97}}, +/* 26788 */ {(16<<2)|3,{52,101,99}}, +/* 26789 */ {(16<<2)|3,{52,101,101}}, +/* 26790 */ {(16<<2)|3,{52,101,105}}, +/* 26791 */ {(16<<2)|3,{52,101,111}}, +/* 26792 */ {(16<<2)|3,{52,101,115}}, +/* 26793 */ {(16<<2)|3,{52,101,116}}, +/* 26794 */ {(11<<2)|2,{52,101,0}}, +/* 26795 */ {(11<<2)|2,{52,101,0}}, +/* 26796 */ {(11<<2)|2,{52,101,0}}, +/* 26797 */ {(11<<2)|2,{52,101,0}}, +/* 26798 */ {(11<<2)|2,{52,101,0}}, +/* 26799 */ {(11<<2)|2,{52,101,0}}, +/* 26800 */ {(11<<2)|2,{52,101,0}}, +/* 26801 */ {(11<<2)|2,{52,101,0}}, +/* 26802 */ {(11<<2)|2,{52,101,0}}, +/* 26803 */ {(11<<2)|2,{52,101,0}}, +/* 26804 */ {(11<<2)|2,{52,101,0}}, +/* 26805 */ {(11<<2)|2,{52,101,0}}, +/* 26806 */ {(11<<2)|2,{52,101,0}}, +/* 26807 */ {(11<<2)|2,{52,101,0}}, +/* 26808 */ {(11<<2)|2,{52,101,0}}, +/* 26809 */ {(11<<2)|2,{52,101,0}}, +/* 26810 */ {(11<<2)|2,{52,101,0}}, +/* 26811 */ {(11<<2)|2,{52,101,0}}, +/* 26812 */ {(11<<2)|2,{52,101,0}}, +/* 26813 */ {(11<<2)|2,{52,101,0}}, +/* 26814 */ {(11<<2)|2,{52,101,0}}, +/* 26815 */ {(11<<2)|2,{52,101,0}}, +/* 26816 */ {(16<<2)|3,{52,105,48}}, +/* 26817 */ {(16<<2)|3,{52,105,49}}, +/* 26818 */ {(16<<2)|3,{52,105,50}}, +/* 26819 */ {(16<<2)|3,{52,105,97}}, +/* 26820 */ {(16<<2)|3,{52,105,99}}, +/* 26821 */ {(16<<2)|3,{52,105,101}}, +/* 26822 */ {(16<<2)|3,{52,105,105}}, +/* 26823 */ {(16<<2)|3,{52,105,111}}, +/* 26824 */ {(16<<2)|3,{52,105,115}}, +/* 26825 */ {(16<<2)|3,{52,105,116}}, +/* 26826 */ {(11<<2)|2,{52,105,0}}, +/* 26827 */ {(11<<2)|2,{52,105,0}}, +/* 26828 */ {(11<<2)|2,{52,105,0}}, +/* 26829 */ {(11<<2)|2,{52,105,0}}, +/* 26830 */ {(11<<2)|2,{52,105,0}}, +/* 26831 */ {(11<<2)|2,{52,105,0}}, +/* 26832 */ {(11<<2)|2,{52,105,0}}, +/* 26833 */ {(11<<2)|2,{52,105,0}}, +/* 26834 */ {(11<<2)|2,{52,105,0}}, +/* 26835 */ {(11<<2)|2,{52,105,0}}, +/* 26836 */ {(11<<2)|2,{52,105,0}}, +/* 26837 */ {(11<<2)|2,{52,105,0}}, +/* 26838 */ {(11<<2)|2,{52,105,0}}, +/* 26839 */ {(11<<2)|2,{52,105,0}}, +/* 26840 */ {(11<<2)|2,{52,105,0}}, +/* 26841 */ {(11<<2)|2,{52,105,0}}, +/* 26842 */ {(11<<2)|2,{52,105,0}}, +/* 26843 */ {(11<<2)|2,{52,105,0}}, +/* 26844 */ {(11<<2)|2,{52,105,0}}, +/* 26845 */ {(11<<2)|2,{52,105,0}}, +/* 26846 */ {(11<<2)|2,{52,105,0}}, +/* 26847 */ {(11<<2)|2,{52,105,0}}, +/* 26848 */ {(16<<2)|3,{52,111,48}}, +/* 26849 */ {(16<<2)|3,{52,111,49}}, +/* 26850 */ {(16<<2)|3,{52,111,50}}, +/* 26851 */ {(16<<2)|3,{52,111,97}}, +/* 26852 */ {(16<<2)|3,{52,111,99}}, +/* 26853 */ {(16<<2)|3,{52,111,101}}, +/* 26854 */ {(16<<2)|3,{52,111,105}}, +/* 26855 */ {(16<<2)|3,{52,111,111}}, +/* 26856 */ {(16<<2)|3,{52,111,115}}, +/* 26857 */ {(16<<2)|3,{52,111,116}}, +/* 26858 */ {(11<<2)|2,{52,111,0}}, +/* 26859 */ {(11<<2)|2,{52,111,0}}, +/* 26860 */ {(11<<2)|2,{52,111,0}}, +/* 26861 */ {(11<<2)|2,{52,111,0}}, +/* 26862 */ {(11<<2)|2,{52,111,0}}, +/* 26863 */ {(11<<2)|2,{52,111,0}}, +/* 26864 */ {(11<<2)|2,{52,111,0}}, +/* 26865 */ {(11<<2)|2,{52,111,0}}, +/* 26866 */ {(11<<2)|2,{52,111,0}}, +/* 26867 */ {(11<<2)|2,{52,111,0}}, +/* 26868 */ {(11<<2)|2,{52,111,0}}, +/* 26869 */ {(11<<2)|2,{52,111,0}}, +/* 26870 */ {(11<<2)|2,{52,111,0}}, +/* 26871 */ {(11<<2)|2,{52,111,0}}, +/* 26872 */ {(11<<2)|2,{52,111,0}}, +/* 26873 */ {(11<<2)|2,{52,111,0}}, +/* 26874 */ {(11<<2)|2,{52,111,0}}, +/* 26875 */ {(11<<2)|2,{52,111,0}}, +/* 26876 */ {(11<<2)|2,{52,111,0}}, +/* 26877 */ {(11<<2)|2,{52,111,0}}, +/* 26878 */ {(11<<2)|2,{52,111,0}}, +/* 26879 */ {(11<<2)|2,{52,111,0}}, +/* 26880 */ {(16<<2)|3,{52,115,48}}, +/* 26881 */ {(16<<2)|3,{52,115,49}}, +/* 26882 */ {(16<<2)|3,{52,115,50}}, +/* 26883 */ {(16<<2)|3,{52,115,97}}, +/* 26884 */ {(16<<2)|3,{52,115,99}}, +/* 26885 */ {(16<<2)|3,{52,115,101}}, +/* 26886 */ {(16<<2)|3,{52,115,105}}, +/* 26887 */ {(16<<2)|3,{52,115,111}}, +/* 26888 */ {(16<<2)|3,{52,115,115}}, +/* 26889 */ {(16<<2)|3,{52,115,116}}, +/* 26890 */ {(11<<2)|2,{52,115,0}}, +/* 26891 */ {(11<<2)|2,{52,115,0}}, +/* 26892 */ {(11<<2)|2,{52,115,0}}, +/* 26893 */ {(11<<2)|2,{52,115,0}}, +/* 26894 */ {(11<<2)|2,{52,115,0}}, +/* 26895 */ {(11<<2)|2,{52,115,0}}, +/* 26896 */ {(11<<2)|2,{52,115,0}}, +/* 26897 */ {(11<<2)|2,{52,115,0}}, +/* 26898 */ {(11<<2)|2,{52,115,0}}, +/* 26899 */ {(11<<2)|2,{52,115,0}}, +/* 26900 */ {(11<<2)|2,{52,115,0}}, +/* 26901 */ {(11<<2)|2,{52,115,0}}, +/* 26902 */ {(11<<2)|2,{52,115,0}}, +/* 26903 */ {(11<<2)|2,{52,115,0}}, +/* 26904 */ {(11<<2)|2,{52,115,0}}, +/* 26905 */ {(11<<2)|2,{52,115,0}}, +/* 26906 */ {(11<<2)|2,{52,115,0}}, +/* 26907 */ {(11<<2)|2,{52,115,0}}, +/* 26908 */ {(11<<2)|2,{52,115,0}}, +/* 26909 */ {(11<<2)|2,{52,115,0}}, +/* 26910 */ {(11<<2)|2,{52,115,0}}, +/* 26911 */ {(11<<2)|2,{52,115,0}}, +/* 26912 */ {(16<<2)|3,{52,116,48}}, +/* 26913 */ {(16<<2)|3,{52,116,49}}, +/* 26914 */ {(16<<2)|3,{52,116,50}}, +/* 26915 */ {(16<<2)|3,{52,116,97}}, +/* 26916 */ {(16<<2)|3,{52,116,99}}, +/* 26917 */ {(16<<2)|3,{52,116,101}}, +/* 26918 */ {(16<<2)|3,{52,116,105}}, +/* 26919 */ {(16<<2)|3,{52,116,111}}, +/* 26920 */ {(16<<2)|3,{52,116,115}}, +/* 26921 */ {(16<<2)|3,{52,116,116}}, +/* 26922 */ {(11<<2)|2,{52,116,0}}, +/* 26923 */ {(11<<2)|2,{52,116,0}}, +/* 26924 */ {(11<<2)|2,{52,116,0}}, +/* 26925 */ {(11<<2)|2,{52,116,0}}, +/* 26926 */ {(11<<2)|2,{52,116,0}}, +/* 26927 */ {(11<<2)|2,{52,116,0}}, +/* 26928 */ {(11<<2)|2,{52,116,0}}, +/* 26929 */ {(11<<2)|2,{52,116,0}}, +/* 26930 */ {(11<<2)|2,{52,116,0}}, +/* 26931 */ {(11<<2)|2,{52,116,0}}, +/* 26932 */ {(11<<2)|2,{52,116,0}}, +/* 26933 */ {(11<<2)|2,{52,116,0}}, +/* 26934 */ {(11<<2)|2,{52,116,0}}, +/* 26935 */ {(11<<2)|2,{52,116,0}}, +/* 26936 */ {(11<<2)|2,{52,116,0}}, +/* 26937 */ {(11<<2)|2,{52,116,0}}, +/* 26938 */ {(11<<2)|2,{52,116,0}}, +/* 26939 */ {(11<<2)|2,{52,116,0}}, +/* 26940 */ {(11<<2)|2,{52,116,0}}, +/* 26941 */ {(11<<2)|2,{52,116,0}}, +/* 26942 */ {(11<<2)|2,{52,116,0}}, +/* 26943 */ {(11<<2)|2,{52,116,0}}, +/* 26944 */ {(12<<2)|2,{52,32,0}}, +/* 26945 */ {(12<<2)|2,{52,32,0}}, +/* 26946 */ {(12<<2)|2,{52,32,0}}, +/* 26947 */ {(12<<2)|2,{52,32,0}}, +/* 26948 */ {(12<<2)|2,{52,32,0}}, +/* 26949 */ {(12<<2)|2,{52,32,0}}, +/* 26950 */ {(12<<2)|2,{52,32,0}}, +/* 26951 */ {(12<<2)|2,{52,32,0}}, +/* 26952 */ {(12<<2)|2,{52,32,0}}, +/* 26953 */ {(12<<2)|2,{52,32,0}}, +/* 26954 */ {(12<<2)|2,{52,32,0}}, +/* 26955 */ {(12<<2)|2,{52,32,0}}, +/* 26956 */ {(12<<2)|2,{52,32,0}}, +/* 26957 */ {(12<<2)|2,{52,32,0}}, +/* 26958 */ {(12<<2)|2,{52,32,0}}, +/* 26959 */ {(12<<2)|2,{52,32,0}}, +/* 26960 */ {(12<<2)|2,{52,37,0}}, +/* 26961 */ {(12<<2)|2,{52,37,0}}, +/* 26962 */ {(12<<2)|2,{52,37,0}}, +/* 26963 */ {(12<<2)|2,{52,37,0}}, +/* 26964 */ {(12<<2)|2,{52,37,0}}, +/* 26965 */ {(12<<2)|2,{52,37,0}}, +/* 26966 */ {(12<<2)|2,{52,37,0}}, +/* 26967 */ {(12<<2)|2,{52,37,0}}, +/* 26968 */ {(12<<2)|2,{52,37,0}}, +/* 26969 */ {(12<<2)|2,{52,37,0}}, +/* 26970 */ {(12<<2)|2,{52,37,0}}, +/* 26971 */ {(12<<2)|2,{52,37,0}}, +/* 26972 */ {(12<<2)|2,{52,37,0}}, +/* 26973 */ {(12<<2)|2,{52,37,0}}, +/* 26974 */ {(12<<2)|2,{52,37,0}}, +/* 26975 */ {(12<<2)|2,{52,37,0}}, +/* 26976 */ {(12<<2)|2,{52,45,0}}, +/* 26977 */ {(12<<2)|2,{52,45,0}}, +/* 26978 */ {(12<<2)|2,{52,45,0}}, +/* 26979 */ {(12<<2)|2,{52,45,0}}, +/* 26980 */ {(12<<2)|2,{52,45,0}}, +/* 26981 */ {(12<<2)|2,{52,45,0}}, +/* 26982 */ {(12<<2)|2,{52,45,0}}, +/* 26983 */ {(12<<2)|2,{52,45,0}}, +/* 26984 */ {(12<<2)|2,{52,45,0}}, +/* 26985 */ {(12<<2)|2,{52,45,0}}, +/* 26986 */ {(12<<2)|2,{52,45,0}}, +/* 26987 */ {(12<<2)|2,{52,45,0}}, +/* 26988 */ {(12<<2)|2,{52,45,0}}, +/* 26989 */ {(12<<2)|2,{52,45,0}}, +/* 26990 */ {(12<<2)|2,{52,45,0}}, +/* 26991 */ {(12<<2)|2,{52,45,0}}, +/* 26992 */ {(12<<2)|2,{52,46,0}}, +/* 26993 */ {(12<<2)|2,{52,46,0}}, +/* 26994 */ {(12<<2)|2,{52,46,0}}, +/* 26995 */ {(12<<2)|2,{52,46,0}}, +/* 26996 */ {(12<<2)|2,{52,46,0}}, +/* 26997 */ {(12<<2)|2,{52,46,0}}, +/* 26998 */ {(12<<2)|2,{52,46,0}}, +/* 26999 */ {(12<<2)|2,{52,46,0}}, +/* 27000 */ {(12<<2)|2,{52,46,0}}, +/* 27001 */ {(12<<2)|2,{52,46,0}}, +/* 27002 */ {(12<<2)|2,{52,46,0}}, +/* 27003 */ {(12<<2)|2,{52,46,0}}, +/* 27004 */ {(12<<2)|2,{52,46,0}}, +/* 27005 */ {(12<<2)|2,{52,46,0}}, +/* 27006 */ {(12<<2)|2,{52,46,0}}, +/* 27007 */ {(12<<2)|2,{52,46,0}}, +/* 27008 */ {(12<<2)|2,{52,47,0}}, +/* 27009 */ {(12<<2)|2,{52,47,0}}, +/* 27010 */ {(12<<2)|2,{52,47,0}}, +/* 27011 */ {(12<<2)|2,{52,47,0}}, +/* 27012 */ {(12<<2)|2,{52,47,0}}, +/* 27013 */ {(12<<2)|2,{52,47,0}}, +/* 27014 */ {(12<<2)|2,{52,47,0}}, +/* 27015 */ {(12<<2)|2,{52,47,0}}, +/* 27016 */ {(12<<2)|2,{52,47,0}}, +/* 27017 */ {(12<<2)|2,{52,47,0}}, +/* 27018 */ {(12<<2)|2,{52,47,0}}, +/* 27019 */ {(12<<2)|2,{52,47,0}}, +/* 27020 */ {(12<<2)|2,{52,47,0}}, +/* 27021 */ {(12<<2)|2,{52,47,0}}, +/* 27022 */ {(12<<2)|2,{52,47,0}}, +/* 27023 */ {(12<<2)|2,{52,47,0}}, +/* 27024 */ {(12<<2)|2,{52,51,0}}, +/* 27025 */ {(12<<2)|2,{52,51,0}}, +/* 27026 */ {(12<<2)|2,{52,51,0}}, +/* 27027 */ {(12<<2)|2,{52,51,0}}, +/* 27028 */ {(12<<2)|2,{52,51,0}}, +/* 27029 */ {(12<<2)|2,{52,51,0}}, +/* 27030 */ {(12<<2)|2,{52,51,0}}, +/* 27031 */ {(12<<2)|2,{52,51,0}}, +/* 27032 */ {(12<<2)|2,{52,51,0}}, +/* 27033 */ {(12<<2)|2,{52,51,0}}, +/* 27034 */ {(12<<2)|2,{52,51,0}}, +/* 27035 */ {(12<<2)|2,{52,51,0}}, +/* 27036 */ {(12<<2)|2,{52,51,0}}, +/* 27037 */ {(12<<2)|2,{52,51,0}}, +/* 27038 */ {(12<<2)|2,{52,51,0}}, +/* 27039 */ {(12<<2)|2,{52,51,0}}, +/* 27040 */ {(12<<2)|2,{52,52,0}}, +/* 27041 */ {(12<<2)|2,{52,52,0}}, +/* 27042 */ {(12<<2)|2,{52,52,0}}, +/* 27043 */ {(12<<2)|2,{52,52,0}}, +/* 27044 */ {(12<<2)|2,{52,52,0}}, +/* 27045 */ {(12<<2)|2,{52,52,0}}, +/* 27046 */ {(12<<2)|2,{52,52,0}}, +/* 27047 */ {(12<<2)|2,{52,52,0}}, +/* 27048 */ {(12<<2)|2,{52,52,0}}, +/* 27049 */ {(12<<2)|2,{52,52,0}}, +/* 27050 */ {(12<<2)|2,{52,52,0}}, +/* 27051 */ {(12<<2)|2,{52,52,0}}, +/* 27052 */ {(12<<2)|2,{52,52,0}}, +/* 27053 */ {(12<<2)|2,{52,52,0}}, +/* 27054 */ {(12<<2)|2,{52,52,0}}, +/* 27055 */ {(12<<2)|2,{52,52,0}}, +/* 27056 */ {(12<<2)|2,{52,53,0}}, +/* 27057 */ {(12<<2)|2,{52,53,0}}, +/* 27058 */ {(12<<2)|2,{52,53,0}}, +/* 27059 */ {(12<<2)|2,{52,53,0}}, +/* 27060 */ {(12<<2)|2,{52,53,0}}, +/* 27061 */ {(12<<2)|2,{52,53,0}}, +/* 27062 */ {(12<<2)|2,{52,53,0}}, +/* 27063 */ {(12<<2)|2,{52,53,0}}, +/* 27064 */ {(12<<2)|2,{52,53,0}}, +/* 27065 */ {(12<<2)|2,{52,53,0}}, +/* 27066 */ {(12<<2)|2,{52,53,0}}, +/* 27067 */ {(12<<2)|2,{52,53,0}}, +/* 27068 */ {(12<<2)|2,{52,53,0}}, +/* 27069 */ {(12<<2)|2,{52,53,0}}, +/* 27070 */ {(12<<2)|2,{52,53,0}}, +/* 27071 */ {(12<<2)|2,{52,53,0}}, +/* 27072 */ {(12<<2)|2,{52,54,0}}, +/* 27073 */ {(12<<2)|2,{52,54,0}}, +/* 27074 */ {(12<<2)|2,{52,54,0}}, +/* 27075 */ {(12<<2)|2,{52,54,0}}, +/* 27076 */ {(12<<2)|2,{52,54,0}}, +/* 27077 */ {(12<<2)|2,{52,54,0}}, +/* 27078 */ {(12<<2)|2,{52,54,0}}, +/* 27079 */ {(12<<2)|2,{52,54,0}}, +/* 27080 */ {(12<<2)|2,{52,54,0}}, +/* 27081 */ {(12<<2)|2,{52,54,0}}, +/* 27082 */ {(12<<2)|2,{52,54,0}}, +/* 27083 */ {(12<<2)|2,{52,54,0}}, +/* 27084 */ {(12<<2)|2,{52,54,0}}, +/* 27085 */ {(12<<2)|2,{52,54,0}}, +/* 27086 */ {(12<<2)|2,{52,54,0}}, +/* 27087 */ {(12<<2)|2,{52,54,0}}, +/* 27088 */ {(12<<2)|2,{52,55,0}}, +/* 27089 */ {(12<<2)|2,{52,55,0}}, +/* 27090 */ {(12<<2)|2,{52,55,0}}, +/* 27091 */ {(12<<2)|2,{52,55,0}}, +/* 27092 */ {(12<<2)|2,{52,55,0}}, +/* 27093 */ {(12<<2)|2,{52,55,0}}, +/* 27094 */ {(12<<2)|2,{52,55,0}}, +/* 27095 */ {(12<<2)|2,{52,55,0}}, +/* 27096 */ {(12<<2)|2,{52,55,0}}, +/* 27097 */ {(12<<2)|2,{52,55,0}}, +/* 27098 */ {(12<<2)|2,{52,55,0}}, +/* 27099 */ {(12<<2)|2,{52,55,0}}, +/* 27100 */ {(12<<2)|2,{52,55,0}}, +/* 27101 */ {(12<<2)|2,{52,55,0}}, +/* 27102 */ {(12<<2)|2,{52,55,0}}, +/* 27103 */ {(12<<2)|2,{52,55,0}}, +/* 27104 */ {(12<<2)|2,{52,56,0}}, +/* 27105 */ {(12<<2)|2,{52,56,0}}, +/* 27106 */ {(12<<2)|2,{52,56,0}}, +/* 27107 */ {(12<<2)|2,{52,56,0}}, +/* 27108 */ {(12<<2)|2,{52,56,0}}, +/* 27109 */ {(12<<2)|2,{52,56,0}}, +/* 27110 */ {(12<<2)|2,{52,56,0}}, +/* 27111 */ {(12<<2)|2,{52,56,0}}, +/* 27112 */ {(12<<2)|2,{52,56,0}}, +/* 27113 */ {(12<<2)|2,{52,56,0}}, +/* 27114 */ {(12<<2)|2,{52,56,0}}, +/* 27115 */ {(12<<2)|2,{52,56,0}}, +/* 27116 */ {(12<<2)|2,{52,56,0}}, +/* 27117 */ {(12<<2)|2,{52,56,0}}, +/* 27118 */ {(12<<2)|2,{52,56,0}}, +/* 27119 */ {(12<<2)|2,{52,56,0}}, +/* 27120 */ {(12<<2)|2,{52,57,0}}, +/* 27121 */ {(12<<2)|2,{52,57,0}}, +/* 27122 */ {(12<<2)|2,{52,57,0}}, +/* 27123 */ {(12<<2)|2,{52,57,0}}, +/* 27124 */ {(12<<2)|2,{52,57,0}}, +/* 27125 */ {(12<<2)|2,{52,57,0}}, +/* 27126 */ {(12<<2)|2,{52,57,0}}, +/* 27127 */ {(12<<2)|2,{52,57,0}}, +/* 27128 */ {(12<<2)|2,{52,57,0}}, +/* 27129 */ {(12<<2)|2,{52,57,0}}, +/* 27130 */ {(12<<2)|2,{52,57,0}}, +/* 27131 */ {(12<<2)|2,{52,57,0}}, +/* 27132 */ {(12<<2)|2,{52,57,0}}, +/* 27133 */ {(12<<2)|2,{52,57,0}}, +/* 27134 */ {(12<<2)|2,{52,57,0}}, +/* 27135 */ {(12<<2)|2,{52,57,0}}, +/* 27136 */ {(12<<2)|2,{52,61,0}}, +/* 27137 */ {(12<<2)|2,{52,61,0}}, +/* 27138 */ {(12<<2)|2,{52,61,0}}, +/* 27139 */ {(12<<2)|2,{52,61,0}}, +/* 27140 */ {(12<<2)|2,{52,61,0}}, +/* 27141 */ {(12<<2)|2,{52,61,0}}, +/* 27142 */ {(12<<2)|2,{52,61,0}}, +/* 27143 */ {(12<<2)|2,{52,61,0}}, +/* 27144 */ {(12<<2)|2,{52,61,0}}, +/* 27145 */ {(12<<2)|2,{52,61,0}}, +/* 27146 */ {(12<<2)|2,{52,61,0}}, +/* 27147 */ {(12<<2)|2,{52,61,0}}, +/* 27148 */ {(12<<2)|2,{52,61,0}}, +/* 27149 */ {(12<<2)|2,{52,61,0}}, +/* 27150 */ {(12<<2)|2,{52,61,0}}, +/* 27151 */ {(12<<2)|2,{52,61,0}}, +/* 27152 */ {(12<<2)|2,{52,65,0}}, +/* 27153 */ {(12<<2)|2,{52,65,0}}, +/* 27154 */ {(12<<2)|2,{52,65,0}}, +/* 27155 */ {(12<<2)|2,{52,65,0}}, +/* 27156 */ {(12<<2)|2,{52,65,0}}, +/* 27157 */ {(12<<2)|2,{52,65,0}}, +/* 27158 */ {(12<<2)|2,{52,65,0}}, +/* 27159 */ {(12<<2)|2,{52,65,0}}, +/* 27160 */ {(12<<2)|2,{52,65,0}}, +/* 27161 */ {(12<<2)|2,{52,65,0}}, +/* 27162 */ {(12<<2)|2,{52,65,0}}, +/* 27163 */ {(12<<2)|2,{52,65,0}}, +/* 27164 */ {(12<<2)|2,{52,65,0}}, +/* 27165 */ {(12<<2)|2,{52,65,0}}, +/* 27166 */ {(12<<2)|2,{52,65,0}}, +/* 27167 */ {(12<<2)|2,{52,65,0}}, +/* 27168 */ {(12<<2)|2,{52,95,0}}, +/* 27169 */ {(12<<2)|2,{52,95,0}}, +/* 27170 */ {(12<<2)|2,{52,95,0}}, +/* 27171 */ {(12<<2)|2,{52,95,0}}, +/* 27172 */ {(12<<2)|2,{52,95,0}}, +/* 27173 */ {(12<<2)|2,{52,95,0}}, +/* 27174 */ {(12<<2)|2,{52,95,0}}, +/* 27175 */ {(12<<2)|2,{52,95,0}}, +/* 27176 */ {(12<<2)|2,{52,95,0}}, +/* 27177 */ {(12<<2)|2,{52,95,0}}, +/* 27178 */ {(12<<2)|2,{52,95,0}}, +/* 27179 */ {(12<<2)|2,{52,95,0}}, +/* 27180 */ {(12<<2)|2,{52,95,0}}, +/* 27181 */ {(12<<2)|2,{52,95,0}}, +/* 27182 */ {(12<<2)|2,{52,95,0}}, +/* 27183 */ {(12<<2)|2,{52,95,0}}, +/* 27184 */ {(12<<2)|2,{52,98,0}}, +/* 27185 */ {(12<<2)|2,{52,98,0}}, +/* 27186 */ {(12<<2)|2,{52,98,0}}, +/* 27187 */ {(12<<2)|2,{52,98,0}}, +/* 27188 */ {(12<<2)|2,{52,98,0}}, +/* 27189 */ {(12<<2)|2,{52,98,0}}, +/* 27190 */ {(12<<2)|2,{52,98,0}}, +/* 27191 */ {(12<<2)|2,{52,98,0}}, +/* 27192 */ {(12<<2)|2,{52,98,0}}, +/* 27193 */ {(12<<2)|2,{52,98,0}}, +/* 27194 */ {(12<<2)|2,{52,98,0}}, +/* 27195 */ {(12<<2)|2,{52,98,0}}, +/* 27196 */ {(12<<2)|2,{52,98,0}}, +/* 27197 */ {(12<<2)|2,{52,98,0}}, +/* 27198 */ {(12<<2)|2,{52,98,0}}, +/* 27199 */ {(12<<2)|2,{52,98,0}}, +/* 27200 */ {(12<<2)|2,{52,100,0}}, +/* 27201 */ {(12<<2)|2,{52,100,0}}, +/* 27202 */ {(12<<2)|2,{52,100,0}}, +/* 27203 */ {(12<<2)|2,{52,100,0}}, +/* 27204 */ {(12<<2)|2,{52,100,0}}, +/* 27205 */ {(12<<2)|2,{52,100,0}}, +/* 27206 */ {(12<<2)|2,{52,100,0}}, +/* 27207 */ {(12<<2)|2,{52,100,0}}, +/* 27208 */ {(12<<2)|2,{52,100,0}}, +/* 27209 */ {(12<<2)|2,{52,100,0}}, +/* 27210 */ {(12<<2)|2,{52,100,0}}, +/* 27211 */ {(12<<2)|2,{52,100,0}}, +/* 27212 */ {(12<<2)|2,{52,100,0}}, +/* 27213 */ {(12<<2)|2,{52,100,0}}, +/* 27214 */ {(12<<2)|2,{52,100,0}}, +/* 27215 */ {(12<<2)|2,{52,100,0}}, +/* 27216 */ {(12<<2)|2,{52,102,0}}, +/* 27217 */ {(12<<2)|2,{52,102,0}}, +/* 27218 */ {(12<<2)|2,{52,102,0}}, +/* 27219 */ {(12<<2)|2,{52,102,0}}, +/* 27220 */ {(12<<2)|2,{52,102,0}}, +/* 27221 */ {(12<<2)|2,{52,102,0}}, +/* 27222 */ {(12<<2)|2,{52,102,0}}, +/* 27223 */ {(12<<2)|2,{52,102,0}}, +/* 27224 */ {(12<<2)|2,{52,102,0}}, +/* 27225 */ {(12<<2)|2,{52,102,0}}, +/* 27226 */ {(12<<2)|2,{52,102,0}}, +/* 27227 */ {(12<<2)|2,{52,102,0}}, +/* 27228 */ {(12<<2)|2,{52,102,0}}, +/* 27229 */ {(12<<2)|2,{52,102,0}}, +/* 27230 */ {(12<<2)|2,{52,102,0}}, +/* 27231 */ {(12<<2)|2,{52,102,0}}, +/* 27232 */ {(12<<2)|2,{52,103,0}}, +/* 27233 */ {(12<<2)|2,{52,103,0}}, +/* 27234 */ {(12<<2)|2,{52,103,0}}, +/* 27235 */ {(12<<2)|2,{52,103,0}}, +/* 27236 */ {(12<<2)|2,{52,103,0}}, +/* 27237 */ {(12<<2)|2,{52,103,0}}, +/* 27238 */ {(12<<2)|2,{52,103,0}}, +/* 27239 */ {(12<<2)|2,{52,103,0}}, +/* 27240 */ {(12<<2)|2,{52,103,0}}, +/* 27241 */ {(12<<2)|2,{52,103,0}}, +/* 27242 */ {(12<<2)|2,{52,103,0}}, +/* 27243 */ {(12<<2)|2,{52,103,0}}, +/* 27244 */ {(12<<2)|2,{52,103,0}}, +/* 27245 */ {(12<<2)|2,{52,103,0}}, +/* 27246 */ {(12<<2)|2,{52,103,0}}, +/* 27247 */ {(12<<2)|2,{52,103,0}}, +/* 27248 */ {(12<<2)|2,{52,104,0}}, +/* 27249 */ {(12<<2)|2,{52,104,0}}, +/* 27250 */ {(12<<2)|2,{52,104,0}}, +/* 27251 */ {(12<<2)|2,{52,104,0}}, +/* 27252 */ {(12<<2)|2,{52,104,0}}, +/* 27253 */ {(12<<2)|2,{52,104,0}}, +/* 27254 */ {(12<<2)|2,{52,104,0}}, +/* 27255 */ {(12<<2)|2,{52,104,0}}, +/* 27256 */ {(12<<2)|2,{52,104,0}}, +/* 27257 */ {(12<<2)|2,{52,104,0}}, +/* 27258 */ {(12<<2)|2,{52,104,0}}, +/* 27259 */ {(12<<2)|2,{52,104,0}}, +/* 27260 */ {(12<<2)|2,{52,104,0}}, +/* 27261 */ {(12<<2)|2,{52,104,0}}, +/* 27262 */ {(12<<2)|2,{52,104,0}}, +/* 27263 */ {(12<<2)|2,{52,104,0}}, +/* 27264 */ {(12<<2)|2,{52,108,0}}, +/* 27265 */ {(12<<2)|2,{52,108,0}}, +/* 27266 */ {(12<<2)|2,{52,108,0}}, +/* 27267 */ {(12<<2)|2,{52,108,0}}, +/* 27268 */ {(12<<2)|2,{52,108,0}}, +/* 27269 */ {(12<<2)|2,{52,108,0}}, +/* 27270 */ {(12<<2)|2,{52,108,0}}, +/* 27271 */ {(12<<2)|2,{52,108,0}}, +/* 27272 */ {(12<<2)|2,{52,108,0}}, +/* 27273 */ {(12<<2)|2,{52,108,0}}, +/* 27274 */ {(12<<2)|2,{52,108,0}}, +/* 27275 */ {(12<<2)|2,{52,108,0}}, +/* 27276 */ {(12<<2)|2,{52,108,0}}, +/* 27277 */ {(12<<2)|2,{52,108,0}}, +/* 27278 */ {(12<<2)|2,{52,108,0}}, +/* 27279 */ {(12<<2)|2,{52,108,0}}, +/* 27280 */ {(12<<2)|2,{52,109,0}}, +/* 27281 */ {(12<<2)|2,{52,109,0}}, +/* 27282 */ {(12<<2)|2,{52,109,0}}, +/* 27283 */ {(12<<2)|2,{52,109,0}}, +/* 27284 */ {(12<<2)|2,{52,109,0}}, +/* 27285 */ {(12<<2)|2,{52,109,0}}, +/* 27286 */ {(12<<2)|2,{52,109,0}}, +/* 27287 */ {(12<<2)|2,{52,109,0}}, +/* 27288 */ {(12<<2)|2,{52,109,0}}, +/* 27289 */ {(12<<2)|2,{52,109,0}}, +/* 27290 */ {(12<<2)|2,{52,109,0}}, +/* 27291 */ {(12<<2)|2,{52,109,0}}, +/* 27292 */ {(12<<2)|2,{52,109,0}}, +/* 27293 */ {(12<<2)|2,{52,109,0}}, +/* 27294 */ {(12<<2)|2,{52,109,0}}, +/* 27295 */ {(12<<2)|2,{52,109,0}}, +/* 27296 */ {(12<<2)|2,{52,110,0}}, +/* 27297 */ {(12<<2)|2,{52,110,0}}, +/* 27298 */ {(12<<2)|2,{52,110,0}}, +/* 27299 */ {(12<<2)|2,{52,110,0}}, +/* 27300 */ {(12<<2)|2,{52,110,0}}, +/* 27301 */ {(12<<2)|2,{52,110,0}}, +/* 27302 */ {(12<<2)|2,{52,110,0}}, +/* 27303 */ {(12<<2)|2,{52,110,0}}, +/* 27304 */ {(12<<2)|2,{52,110,0}}, +/* 27305 */ {(12<<2)|2,{52,110,0}}, +/* 27306 */ {(12<<2)|2,{52,110,0}}, +/* 27307 */ {(12<<2)|2,{52,110,0}}, +/* 27308 */ {(12<<2)|2,{52,110,0}}, +/* 27309 */ {(12<<2)|2,{52,110,0}}, +/* 27310 */ {(12<<2)|2,{52,110,0}}, +/* 27311 */ {(12<<2)|2,{52,110,0}}, +/* 27312 */ {(12<<2)|2,{52,112,0}}, +/* 27313 */ {(12<<2)|2,{52,112,0}}, +/* 27314 */ {(12<<2)|2,{52,112,0}}, +/* 27315 */ {(12<<2)|2,{52,112,0}}, +/* 27316 */ {(12<<2)|2,{52,112,0}}, +/* 27317 */ {(12<<2)|2,{52,112,0}}, +/* 27318 */ {(12<<2)|2,{52,112,0}}, +/* 27319 */ {(12<<2)|2,{52,112,0}}, +/* 27320 */ {(12<<2)|2,{52,112,0}}, +/* 27321 */ {(12<<2)|2,{52,112,0}}, +/* 27322 */ {(12<<2)|2,{52,112,0}}, +/* 27323 */ {(12<<2)|2,{52,112,0}}, +/* 27324 */ {(12<<2)|2,{52,112,0}}, +/* 27325 */ {(12<<2)|2,{52,112,0}}, +/* 27326 */ {(12<<2)|2,{52,112,0}}, +/* 27327 */ {(12<<2)|2,{52,112,0}}, +/* 27328 */ {(12<<2)|2,{52,114,0}}, +/* 27329 */ {(12<<2)|2,{52,114,0}}, +/* 27330 */ {(12<<2)|2,{52,114,0}}, +/* 27331 */ {(12<<2)|2,{52,114,0}}, +/* 27332 */ {(12<<2)|2,{52,114,0}}, +/* 27333 */ {(12<<2)|2,{52,114,0}}, +/* 27334 */ {(12<<2)|2,{52,114,0}}, +/* 27335 */ {(12<<2)|2,{52,114,0}}, +/* 27336 */ {(12<<2)|2,{52,114,0}}, +/* 27337 */ {(12<<2)|2,{52,114,0}}, +/* 27338 */ {(12<<2)|2,{52,114,0}}, +/* 27339 */ {(12<<2)|2,{52,114,0}}, +/* 27340 */ {(12<<2)|2,{52,114,0}}, +/* 27341 */ {(12<<2)|2,{52,114,0}}, +/* 27342 */ {(12<<2)|2,{52,114,0}}, +/* 27343 */ {(12<<2)|2,{52,114,0}}, +/* 27344 */ {(12<<2)|2,{52,117,0}}, +/* 27345 */ {(12<<2)|2,{52,117,0}}, +/* 27346 */ {(12<<2)|2,{52,117,0}}, +/* 27347 */ {(12<<2)|2,{52,117,0}}, +/* 27348 */ {(12<<2)|2,{52,117,0}}, +/* 27349 */ {(12<<2)|2,{52,117,0}}, +/* 27350 */ {(12<<2)|2,{52,117,0}}, +/* 27351 */ {(12<<2)|2,{52,117,0}}, +/* 27352 */ {(12<<2)|2,{52,117,0}}, +/* 27353 */ {(12<<2)|2,{52,117,0}}, +/* 27354 */ {(12<<2)|2,{52,117,0}}, +/* 27355 */ {(12<<2)|2,{52,117,0}}, +/* 27356 */ {(12<<2)|2,{52,117,0}}, +/* 27357 */ {(12<<2)|2,{52,117,0}}, +/* 27358 */ {(12<<2)|2,{52,117,0}}, +/* 27359 */ {(12<<2)|2,{52,117,0}}, +/* 27360 */ {(13<<2)|2,{52,58,0}}, +/* 27361 */ {(13<<2)|2,{52,58,0}}, +/* 27362 */ {(13<<2)|2,{52,58,0}}, +/* 27363 */ {(13<<2)|2,{52,58,0}}, +/* 27364 */ {(13<<2)|2,{52,58,0}}, +/* 27365 */ {(13<<2)|2,{52,58,0}}, +/* 27366 */ {(13<<2)|2,{52,58,0}}, +/* 27367 */ {(13<<2)|2,{52,58,0}}, +/* 27368 */ {(13<<2)|2,{52,66,0}}, +/* 27369 */ {(13<<2)|2,{52,66,0}}, +/* 27370 */ {(13<<2)|2,{52,66,0}}, +/* 27371 */ {(13<<2)|2,{52,66,0}}, +/* 27372 */ {(13<<2)|2,{52,66,0}}, +/* 27373 */ {(13<<2)|2,{52,66,0}}, +/* 27374 */ {(13<<2)|2,{52,66,0}}, +/* 27375 */ {(13<<2)|2,{52,66,0}}, +/* 27376 */ {(13<<2)|2,{52,67,0}}, +/* 27377 */ {(13<<2)|2,{52,67,0}}, +/* 27378 */ {(13<<2)|2,{52,67,0}}, +/* 27379 */ {(13<<2)|2,{52,67,0}}, +/* 27380 */ {(13<<2)|2,{52,67,0}}, +/* 27381 */ {(13<<2)|2,{52,67,0}}, +/* 27382 */ {(13<<2)|2,{52,67,0}}, +/* 27383 */ {(13<<2)|2,{52,67,0}}, +/* 27384 */ {(13<<2)|2,{52,68,0}}, +/* 27385 */ {(13<<2)|2,{52,68,0}}, +/* 27386 */ {(13<<2)|2,{52,68,0}}, +/* 27387 */ {(13<<2)|2,{52,68,0}}, +/* 27388 */ {(13<<2)|2,{52,68,0}}, +/* 27389 */ {(13<<2)|2,{52,68,0}}, +/* 27390 */ {(13<<2)|2,{52,68,0}}, +/* 27391 */ {(13<<2)|2,{52,68,0}}, +/* 27392 */ {(13<<2)|2,{52,69,0}}, +/* 27393 */ {(13<<2)|2,{52,69,0}}, +/* 27394 */ {(13<<2)|2,{52,69,0}}, +/* 27395 */ {(13<<2)|2,{52,69,0}}, +/* 27396 */ {(13<<2)|2,{52,69,0}}, +/* 27397 */ {(13<<2)|2,{52,69,0}}, +/* 27398 */ {(13<<2)|2,{52,69,0}}, +/* 27399 */ {(13<<2)|2,{52,69,0}}, +/* 27400 */ {(13<<2)|2,{52,70,0}}, +/* 27401 */ {(13<<2)|2,{52,70,0}}, +/* 27402 */ {(13<<2)|2,{52,70,0}}, +/* 27403 */ {(13<<2)|2,{52,70,0}}, +/* 27404 */ {(13<<2)|2,{52,70,0}}, +/* 27405 */ {(13<<2)|2,{52,70,0}}, +/* 27406 */ {(13<<2)|2,{52,70,0}}, +/* 27407 */ {(13<<2)|2,{52,70,0}}, +/* 27408 */ {(13<<2)|2,{52,71,0}}, +/* 27409 */ {(13<<2)|2,{52,71,0}}, +/* 27410 */ {(13<<2)|2,{52,71,0}}, +/* 27411 */ {(13<<2)|2,{52,71,0}}, +/* 27412 */ {(13<<2)|2,{52,71,0}}, +/* 27413 */ {(13<<2)|2,{52,71,0}}, +/* 27414 */ {(13<<2)|2,{52,71,0}}, +/* 27415 */ {(13<<2)|2,{52,71,0}}, +/* 27416 */ {(13<<2)|2,{52,72,0}}, +/* 27417 */ {(13<<2)|2,{52,72,0}}, +/* 27418 */ {(13<<2)|2,{52,72,0}}, +/* 27419 */ {(13<<2)|2,{52,72,0}}, +/* 27420 */ {(13<<2)|2,{52,72,0}}, +/* 27421 */ {(13<<2)|2,{52,72,0}}, +/* 27422 */ {(13<<2)|2,{52,72,0}}, +/* 27423 */ {(13<<2)|2,{52,72,0}}, +/* 27424 */ {(13<<2)|2,{52,73,0}}, +/* 27425 */ {(13<<2)|2,{52,73,0}}, +/* 27426 */ {(13<<2)|2,{52,73,0}}, +/* 27427 */ {(13<<2)|2,{52,73,0}}, +/* 27428 */ {(13<<2)|2,{52,73,0}}, +/* 27429 */ {(13<<2)|2,{52,73,0}}, +/* 27430 */ {(13<<2)|2,{52,73,0}}, +/* 27431 */ {(13<<2)|2,{52,73,0}}, +/* 27432 */ {(13<<2)|2,{52,74,0}}, +/* 27433 */ {(13<<2)|2,{52,74,0}}, +/* 27434 */ {(13<<2)|2,{52,74,0}}, +/* 27435 */ {(13<<2)|2,{52,74,0}}, +/* 27436 */ {(13<<2)|2,{52,74,0}}, +/* 27437 */ {(13<<2)|2,{52,74,0}}, +/* 27438 */ {(13<<2)|2,{52,74,0}}, +/* 27439 */ {(13<<2)|2,{52,74,0}}, +/* 27440 */ {(13<<2)|2,{52,75,0}}, +/* 27441 */ {(13<<2)|2,{52,75,0}}, +/* 27442 */ {(13<<2)|2,{52,75,0}}, +/* 27443 */ {(13<<2)|2,{52,75,0}}, +/* 27444 */ {(13<<2)|2,{52,75,0}}, +/* 27445 */ {(13<<2)|2,{52,75,0}}, +/* 27446 */ {(13<<2)|2,{52,75,0}}, +/* 27447 */ {(13<<2)|2,{52,75,0}}, +/* 27448 */ {(13<<2)|2,{52,76,0}}, +/* 27449 */ {(13<<2)|2,{52,76,0}}, +/* 27450 */ {(13<<2)|2,{52,76,0}}, +/* 27451 */ {(13<<2)|2,{52,76,0}}, +/* 27452 */ {(13<<2)|2,{52,76,0}}, +/* 27453 */ {(13<<2)|2,{52,76,0}}, +/* 27454 */ {(13<<2)|2,{52,76,0}}, +/* 27455 */ {(13<<2)|2,{52,76,0}}, +/* 27456 */ {(13<<2)|2,{52,77,0}}, +/* 27457 */ {(13<<2)|2,{52,77,0}}, +/* 27458 */ {(13<<2)|2,{52,77,0}}, +/* 27459 */ {(13<<2)|2,{52,77,0}}, +/* 27460 */ {(13<<2)|2,{52,77,0}}, +/* 27461 */ {(13<<2)|2,{52,77,0}}, +/* 27462 */ {(13<<2)|2,{52,77,0}}, +/* 27463 */ {(13<<2)|2,{52,77,0}}, +/* 27464 */ {(13<<2)|2,{52,78,0}}, +/* 27465 */ {(13<<2)|2,{52,78,0}}, +/* 27466 */ {(13<<2)|2,{52,78,0}}, +/* 27467 */ {(13<<2)|2,{52,78,0}}, +/* 27468 */ {(13<<2)|2,{52,78,0}}, +/* 27469 */ {(13<<2)|2,{52,78,0}}, +/* 27470 */ {(13<<2)|2,{52,78,0}}, +/* 27471 */ {(13<<2)|2,{52,78,0}}, +/* 27472 */ {(13<<2)|2,{52,79,0}}, +/* 27473 */ {(13<<2)|2,{52,79,0}}, +/* 27474 */ {(13<<2)|2,{52,79,0}}, +/* 27475 */ {(13<<2)|2,{52,79,0}}, +/* 27476 */ {(13<<2)|2,{52,79,0}}, +/* 27477 */ {(13<<2)|2,{52,79,0}}, +/* 27478 */ {(13<<2)|2,{52,79,0}}, +/* 27479 */ {(13<<2)|2,{52,79,0}}, +/* 27480 */ {(13<<2)|2,{52,80,0}}, +/* 27481 */ {(13<<2)|2,{52,80,0}}, +/* 27482 */ {(13<<2)|2,{52,80,0}}, +/* 27483 */ {(13<<2)|2,{52,80,0}}, +/* 27484 */ {(13<<2)|2,{52,80,0}}, +/* 27485 */ {(13<<2)|2,{52,80,0}}, +/* 27486 */ {(13<<2)|2,{52,80,0}}, +/* 27487 */ {(13<<2)|2,{52,80,0}}, +/* 27488 */ {(13<<2)|2,{52,81,0}}, +/* 27489 */ {(13<<2)|2,{52,81,0}}, +/* 27490 */ {(13<<2)|2,{52,81,0}}, +/* 27491 */ {(13<<2)|2,{52,81,0}}, +/* 27492 */ {(13<<2)|2,{52,81,0}}, +/* 27493 */ {(13<<2)|2,{52,81,0}}, +/* 27494 */ {(13<<2)|2,{52,81,0}}, +/* 27495 */ {(13<<2)|2,{52,81,0}}, +/* 27496 */ {(13<<2)|2,{52,82,0}}, +/* 27497 */ {(13<<2)|2,{52,82,0}}, +/* 27498 */ {(13<<2)|2,{52,82,0}}, +/* 27499 */ {(13<<2)|2,{52,82,0}}, +/* 27500 */ {(13<<2)|2,{52,82,0}}, +/* 27501 */ {(13<<2)|2,{52,82,0}}, +/* 27502 */ {(13<<2)|2,{52,82,0}}, +/* 27503 */ {(13<<2)|2,{52,82,0}}, +/* 27504 */ {(13<<2)|2,{52,83,0}}, +/* 27505 */ {(13<<2)|2,{52,83,0}}, +/* 27506 */ {(13<<2)|2,{52,83,0}}, +/* 27507 */ {(13<<2)|2,{52,83,0}}, +/* 27508 */ {(13<<2)|2,{52,83,0}}, +/* 27509 */ {(13<<2)|2,{52,83,0}}, +/* 27510 */ {(13<<2)|2,{52,83,0}}, +/* 27511 */ {(13<<2)|2,{52,83,0}}, +/* 27512 */ {(13<<2)|2,{52,84,0}}, +/* 27513 */ {(13<<2)|2,{52,84,0}}, +/* 27514 */ {(13<<2)|2,{52,84,0}}, +/* 27515 */ {(13<<2)|2,{52,84,0}}, +/* 27516 */ {(13<<2)|2,{52,84,0}}, +/* 27517 */ {(13<<2)|2,{52,84,0}}, +/* 27518 */ {(13<<2)|2,{52,84,0}}, +/* 27519 */ {(13<<2)|2,{52,84,0}}, +/* 27520 */ {(13<<2)|2,{52,85,0}}, +/* 27521 */ {(13<<2)|2,{52,85,0}}, +/* 27522 */ {(13<<2)|2,{52,85,0}}, +/* 27523 */ {(13<<2)|2,{52,85,0}}, +/* 27524 */ {(13<<2)|2,{52,85,0}}, +/* 27525 */ {(13<<2)|2,{52,85,0}}, +/* 27526 */ {(13<<2)|2,{52,85,0}}, +/* 27527 */ {(13<<2)|2,{52,85,0}}, +/* 27528 */ {(13<<2)|2,{52,86,0}}, +/* 27529 */ {(13<<2)|2,{52,86,0}}, +/* 27530 */ {(13<<2)|2,{52,86,0}}, +/* 27531 */ {(13<<2)|2,{52,86,0}}, +/* 27532 */ {(13<<2)|2,{52,86,0}}, +/* 27533 */ {(13<<2)|2,{52,86,0}}, +/* 27534 */ {(13<<2)|2,{52,86,0}}, +/* 27535 */ {(13<<2)|2,{52,86,0}}, +/* 27536 */ {(13<<2)|2,{52,87,0}}, +/* 27537 */ {(13<<2)|2,{52,87,0}}, +/* 27538 */ {(13<<2)|2,{52,87,0}}, +/* 27539 */ {(13<<2)|2,{52,87,0}}, +/* 27540 */ {(13<<2)|2,{52,87,0}}, +/* 27541 */ {(13<<2)|2,{52,87,0}}, +/* 27542 */ {(13<<2)|2,{52,87,0}}, +/* 27543 */ {(13<<2)|2,{52,87,0}}, +/* 27544 */ {(13<<2)|2,{52,89,0}}, +/* 27545 */ {(13<<2)|2,{52,89,0}}, +/* 27546 */ {(13<<2)|2,{52,89,0}}, +/* 27547 */ {(13<<2)|2,{52,89,0}}, +/* 27548 */ {(13<<2)|2,{52,89,0}}, +/* 27549 */ {(13<<2)|2,{52,89,0}}, +/* 27550 */ {(13<<2)|2,{52,89,0}}, +/* 27551 */ {(13<<2)|2,{52,89,0}}, +/* 27552 */ {(13<<2)|2,{52,106,0}}, +/* 27553 */ {(13<<2)|2,{52,106,0}}, +/* 27554 */ {(13<<2)|2,{52,106,0}}, +/* 27555 */ {(13<<2)|2,{52,106,0}}, +/* 27556 */ {(13<<2)|2,{52,106,0}}, +/* 27557 */ {(13<<2)|2,{52,106,0}}, +/* 27558 */ {(13<<2)|2,{52,106,0}}, +/* 27559 */ {(13<<2)|2,{52,106,0}}, +/* 27560 */ {(13<<2)|2,{52,107,0}}, +/* 27561 */ {(13<<2)|2,{52,107,0}}, +/* 27562 */ {(13<<2)|2,{52,107,0}}, +/* 27563 */ {(13<<2)|2,{52,107,0}}, +/* 27564 */ {(13<<2)|2,{52,107,0}}, +/* 27565 */ {(13<<2)|2,{52,107,0}}, +/* 27566 */ {(13<<2)|2,{52,107,0}}, +/* 27567 */ {(13<<2)|2,{52,107,0}}, +/* 27568 */ {(13<<2)|2,{52,113,0}}, +/* 27569 */ {(13<<2)|2,{52,113,0}}, +/* 27570 */ {(13<<2)|2,{52,113,0}}, +/* 27571 */ {(13<<2)|2,{52,113,0}}, +/* 27572 */ {(13<<2)|2,{52,113,0}}, +/* 27573 */ {(13<<2)|2,{52,113,0}}, +/* 27574 */ {(13<<2)|2,{52,113,0}}, +/* 27575 */ {(13<<2)|2,{52,113,0}}, +/* 27576 */ {(13<<2)|2,{52,118,0}}, +/* 27577 */ {(13<<2)|2,{52,118,0}}, +/* 27578 */ {(13<<2)|2,{52,118,0}}, +/* 27579 */ {(13<<2)|2,{52,118,0}}, +/* 27580 */ {(13<<2)|2,{52,118,0}}, +/* 27581 */ {(13<<2)|2,{52,118,0}}, +/* 27582 */ {(13<<2)|2,{52,118,0}}, +/* 27583 */ {(13<<2)|2,{52,118,0}}, +/* 27584 */ {(13<<2)|2,{52,119,0}}, +/* 27585 */ {(13<<2)|2,{52,119,0}}, +/* 27586 */ {(13<<2)|2,{52,119,0}}, +/* 27587 */ {(13<<2)|2,{52,119,0}}, +/* 27588 */ {(13<<2)|2,{52,119,0}}, +/* 27589 */ {(13<<2)|2,{52,119,0}}, +/* 27590 */ {(13<<2)|2,{52,119,0}}, +/* 27591 */ {(13<<2)|2,{52,119,0}}, +/* 27592 */ {(13<<2)|2,{52,120,0}}, +/* 27593 */ {(13<<2)|2,{52,120,0}}, +/* 27594 */ {(13<<2)|2,{52,120,0}}, +/* 27595 */ {(13<<2)|2,{52,120,0}}, +/* 27596 */ {(13<<2)|2,{52,120,0}}, +/* 27597 */ {(13<<2)|2,{52,120,0}}, +/* 27598 */ {(13<<2)|2,{52,120,0}}, +/* 27599 */ {(13<<2)|2,{52,120,0}}, +/* 27600 */ {(13<<2)|2,{52,121,0}}, +/* 27601 */ {(13<<2)|2,{52,121,0}}, +/* 27602 */ {(13<<2)|2,{52,121,0}}, +/* 27603 */ {(13<<2)|2,{52,121,0}}, +/* 27604 */ {(13<<2)|2,{52,121,0}}, +/* 27605 */ {(13<<2)|2,{52,121,0}}, +/* 27606 */ {(13<<2)|2,{52,121,0}}, +/* 27607 */ {(13<<2)|2,{52,121,0}}, +/* 27608 */ {(13<<2)|2,{52,122,0}}, +/* 27609 */ {(13<<2)|2,{52,122,0}}, +/* 27610 */ {(13<<2)|2,{52,122,0}}, +/* 27611 */ {(13<<2)|2,{52,122,0}}, +/* 27612 */ {(13<<2)|2,{52,122,0}}, +/* 27613 */ {(13<<2)|2,{52,122,0}}, +/* 27614 */ {(13<<2)|2,{52,122,0}}, +/* 27615 */ {(13<<2)|2,{52,122,0}}, +/* 27616 */ {(14<<2)|2,{52,38,0}}, +/* 27617 */ {(14<<2)|2,{52,38,0}}, +/* 27618 */ {(14<<2)|2,{52,38,0}}, +/* 27619 */ {(14<<2)|2,{52,38,0}}, +/* 27620 */ {(14<<2)|2,{52,42,0}}, +/* 27621 */ {(14<<2)|2,{52,42,0}}, +/* 27622 */ {(14<<2)|2,{52,42,0}}, +/* 27623 */ {(14<<2)|2,{52,42,0}}, +/* 27624 */ {(14<<2)|2,{52,44,0}}, +/* 27625 */ {(14<<2)|2,{52,44,0}}, +/* 27626 */ {(14<<2)|2,{52,44,0}}, +/* 27627 */ {(14<<2)|2,{52,44,0}}, +/* 27628 */ {(14<<2)|2,{52,59,0}}, +/* 27629 */ {(14<<2)|2,{52,59,0}}, +/* 27630 */ {(14<<2)|2,{52,59,0}}, +/* 27631 */ {(14<<2)|2,{52,59,0}}, +/* 27632 */ {(14<<2)|2,{52,88,0}}, +/* 27633 */ {(14<<2)|2,{52,88,0}}, +/* 27634 */ {(14<<2)|2,{52,88,0}}, +/* 27635 */ {(14<<2)|2,{52,88,0}}, +/* 27636 */ {(14<<2)|2,{52,90,0}}, +/* 27637 */ {(14<<2)|2,{52,90,0}}, +/* 27638 */ {(14<<2)|2,{52,90,0}}, +/* 27639 */ {(14<<2)|2,{52,90,0}}, +/* 27640 */ {(16<<2)|2,{52,33,0}}, +/* 27641 */ {(16<<2)|2,{52,34,0}}, +/* 27642 */ {(16<<2)|2,{52,40,0}}, +/* 27643 */ {(16<<2)|2,{52,41,0}}, +/* 27644 */ {(16<<2)|2,{52,63,0}}, +/* 27645 */ {(6<<2)|1,{52,0,0}}, +/* 27646 */ {(6<<2)|1,{52,0,0}}, +/* 27647 */ {(6<<2)|1,{52,0,0}}, +/* 27648 */ {(16<<2)|3,{53,48,48}}, +/* 27649 */ {(16<<2)|3,{53,48,49}}, +/* 27650 */ {(16<<2)|3,{53,48,50}}, +/* 27651 */ {(16<<2)|3,{53,48,97}}, +/* 27652 */ {(16<<2)|3,{53,48,99}}, +/* 27653 */ {(16<<2)|3,{53,48,101}}, +/* 27654 */ {(16<<2)|3,{53,48,105}}, +/* 27655 */ {(16<<2)|3,{53,48,111}}, +/* 27656 */ {(16<<2)|3,{53,48,115}}, +/* 27657 */ {(16<<2)|3,{53,48,116}}, +/* 27658 */ {(11<<2)|2,{53,48,0}}, +/* 27659 */ {(11<<2)|2,{53,48,0}}, +/* 27660 */ {(11<<2)|2,{53,48,0}}, +/* 27661 */ {(11<<2)|2,{53,48,0}}, +/* 27662 */ {(11<<2)|2,{53,48,0}}, +/* 27663 */ {(11<<2)|2,{53,48,0}}, +/* 27664 */ {(11<<2)|2,{53,48,0}}, +/* 27665 */ {(11<<2)|2,{53,48,0}}, +/* 27666 */ {(11<<2)|2,{53,48,0}}, +/* 27667 */ {(11<<2)|2,{53,48,0}}, +/* 27668 */ {(11<<2)|2,{53,48,0}}, +/* 27669 */ {(11<<2)|2,{53,48,0}}, +/* 27670 */ {(11<<2)|2,{53,48,0}}, +/* 27671 */ {(11<<2)|2,{53,48,0}}, +/* 27672 */ {(11<<2)|2,{53,48,0}}, +/* 27673 */ {(11<<2)|2,{53,48,0}}, +/* 27674 */ {(11<<2)|2,{53,48,0}}, +/* 27675 */ {(11<<2)|2,{53,48,0}}, +/* 27676 */ {(11<<2)|2,{53,48,0}}, +/* 27677 */ {(11<<2)|2,{53,48,0}}, +/* 27678 */ {(11<<2)|2,{53,48,0}}, +/* 27679 */ {(11<<2)|2,{53,48,0}}, +/* 27680 */ {(16<<2)|3,{53,49,48}}, +/* 27681 */ {(16<<2)|3,{53,49,49}}, +/* 27682 */ {(16<<2)|3,{53,49,50}}, +/* 27683 */ {(16<<2)|3,{53,49,97}}, +/* 27684 */ {(16<<2)|3,{53,49,99}}, +/* 27685 */ {(16<<2)|3,{53,49,101}}, +/* 27686 */ {(16<<2)|3,{53,49,105}}, +/* 27687 */ {(16<<2)|3,{53,49,111}}, +/* 27688 */ {(16<<2)|3,{53,49,115}}, +/* 27689 */ {(16<<2)|3,{53,49,116}}, +/* 27690 */ {(11<<2)|2,{53,49,0}}, +/* 27691 */ {(11<<2)|2,{53,49,0}}, +/* 27692 */ {(11<<2)|2,{53,49,0}}, +/* 27693 */ {(11<<2)|2,{53,49,0}}, +/* 27694 */ {(11<<2)|2,{53,49,0}}, +/* 27695 */ {(11<<2)|2,{53,49,0}}, +/* 27696 */ {(11<<2)|2,{53,49,0}}, +/* 27697 */ {(11<<2)|2,{53,49,0}}, +/* 27698 */ {(11<<2)|2,{53,49,0}}, +/* 27699 */ {(11<<2)|2,{53,49,0}}, +/* 27700 */ {(11<<2)|2,{53,49,0}}, +/* 27701 */ {(11<<2)|2,{53,49,0}}, +/* 27702 */ {(11<<2)|2,{53,49,0}}, +/* 27703 */ {(11<<2)|2,{53,49,0}}, +/* 27704 */ {(11<<2)|2,{53,49,0}}, +/* 27705 */ {(11<<2)|2,{53,49,0}}, +/* 27706 */ {(11<<2)|2,{53,49,0}}, +/* 27707 */ {(11<<2)|2,{53,49,0}}, +/* 27708 */ {(11<<2)|2,{53,49,0}}, +/* 27709 */ {(11<<2)|2,{53,49,0}}, +/* 27710 */ {(11<<2)|2,{53,49,0}}, +/* 27711 */ {(11<<2)|2,{53,49,0}}, +/* 27712 */ {(16<<2)|3,{53,50,48}}, +/* 27713 */ {(16<<2)|3,{53,50,49}}, +/* 27714 */ {(16<<2)|3,{53,50,50}}, +/* 27715 */ {(16<<2)|3,{53,50,97}}, +/* 27716 */ {(16<<2)|3,{53,50,99}}, +/* 27717 */ {(16<<2)|3,{53,50,101}}, +/* 27718 */ {(16<<2)|3,{53,50,105}}, +/* 27719 */ {(16<<2)|3,{53,50,111}}, +/* 27720 */ {(16<<2)|3,{53,50,115}}, +/* 27721 */ {(16<<2)|3,{53,50,116}}, +/* 27722 */ {(11<<2)|2,{53,50,0}}, +/* 27723 */ {(11<<2)|2,{53,50,0}}, +/* 27724 */ {(11<<2)|2,{53,50,0}}, +/* 27725 */ {(11<<2)|2,{53,50,0}}, +/* 27726 */ {(11<<2)|2,{53,50,0}}, +/* 27727 */ {(11<<2)|2,{53,50,0}}, +/* 27728 */ {(11<<2)|2,{53,50,0}}, +/* 27729 */ {(11<<2)|2,{53,50,0}}, +/* 27730 */ {(11<<2)|2,{53,50,0}}, +/* 27731 */ {(11<<2)|2,{53,50,0}}, +/* 27732 */ {(11<<2)|2,{53,50,0}}, +/* 27733 */ {(11<<2)|2,{53,50,0}}, +/* 27734 */ {(11<<2)|2,{53,50,0}}, +/* 27735 */ {(11<<2)|2,{53,50,0}}, +/* 27736 */ {(11<<2)|2,{53,50,0}}, +/* 27737 */ {(11<<2)|2,{53,50,0}}, +/* 27738 */ {(11<<2)|2,{53,50,0}}, +/* 27739 */ {(11<<2)|2,{53,50,0}}, +/* 27740 */ {(11<<2)|2,{53,50,0}}, +/* 27741 */ {(11<<2)|2,{53,50,0}}, +/* 27742 */ {(11<<2)|2,{53,50,0}}, +/* 27743 */ {(11<<2)|2,{53,50,0}}, +/* 27744 */ {(16<<2)|3,{53,97,48}}, +/* 27745 */ {(16<<2)|3,{53,97,49}}, +/* 27746 */ {(16<<2)|3,{53,97,50}}, +/* 27747 */ {(16<<2)|3,{53,97,97}}, +/* 27748 */ {(16<<2)|3,{53,97,99}}, +/* 27749 */ {(16<<2)|3,{53,97,101}}, +/* 27750 */ {(16<<2)|3,{53,97,105}}, +/* 27751 */ {(16<<2)|3,{53,97,111}}, +/* 27752 */ {(16<<2)|3,{53,97,115}}, +/* 27753 */ {(16<<2)|3,{53,97,116}}, +/* 27754 */ {(11<<2)|2,{53,97,0}}, +/* 27755 */ {(11<<2)|2,{53,97,0}}, +/* 27756 */ {(11<<2)|2,{53,97,0}}, +/* 27757 */ {(11<<2)|2,{53,97,0}}, +/* 27758 */ {(11<<2)|2,{53,97,0}}, +/* 27759 */ {(11<<2)|2,{53,97,0}}, +/* 27760 */ {(11<<2)|2,{53,97,0}}, +/* 27761 */ {(11<<2)|2,{53,97,0}}, +/* 27762 */ {(11<<2)|2,{53,97,0}}, +/* 27763 */ {(11<<2)|2,{53,97,0}}, +/* 27764 */ {(11<<2)|2,{53,97,0}}, +/* 27765 */ {(11<<2)|2,{53,97,0}}, +/* 27766 */ {(11<<2)|2,{53,97,0}}, +/* 27767 */ {(11<<2)|2,{53,97,0}}, +/* 27768 */ {(11<<2)|2,{53,97,0}}, +/* 27769 */ {(11<<2)|2,{53,97,0}}, +/* 27770 */ {(11<<2)|2,{53,97,0}}, +/* 27771 */ {(11<<2)|2,{53,97,0}}, +/* 27772 */ {(11<<2)|2,{53,97,0}}, +/* 27773 */ {(11<<2)|2,{53,97,0}}, +/* 27774 */ {(11<<2)|2,{53,97,0}}, +/* 27775 */ {(11<<2)|2,{53,97,0}}, +/* 27776 */ {(16<<2)|3,{53,99,48}}, +/* 27777 */ {(16<<2)|3,{53,99,49}}, +/* 27778 */ {(16<<2)|3,{53,99,50}}, +/* 27779 */ {(16<<2)|3,{53,99,97}}, +/* 27780 */ {(16<<2)|3,{53,99,99}}, +/* 27781 */ {(16<<2)|3,{53,99,101}}, +/* 27782 */ {(16<<2)|3,{53,99,105}}, +/* 27783 */ {(16<<2)|3,{53,99,111}}, +/* 27784 */ {(16<<2)|3,{53,99,115}}, +/* 27785 */ {(16<<2)|3,{53,99,116}}, +/* 27786 */ {(11<<2)|2,{53,99,0}}, +/* 27787 */ {(11<<2)|2,{53,99,0}}, +/* 27788 */ {(11<<2)|2,{53,99,0}}, +/* 27789 */ {(11<<2)|2,{53,99,0}}, +/* 27790 */ {(11<<2)|2,{53,99,0}}, +/* 27791 */ {(11<<2)|2,{53,99,0}}, +/* 27792 */ {(11<<2)|2,{53,99,0}}, +/* 27793 */ {(11<<2)|2,{53,99,0}}, +/* 27794 */ {(11<<2)|2,{53,99,0}}, +/* 27795 */ {(11<<2)|2,{53,99,0}}, +/* 27796 */ {(11<<2)|2,{53,99,0}}, +/* 27797 */ {(11<<2)|2,{53,99,0}}, +/* 27798 */ {(11<<2)|2,{53,99,0}}, +/* 27799 */ {(11<<2)|2,{53,99,0}}, +/* 27800 */ {(11<<2)|2,{53,99,0}}, +/* 27801 */ {(11<<2)|2,{53,99,0}}, +/* 27802 */ {(11<<2)|2,{53,99,0}}, +/* 27803 */ {(11<<2)|2,{53,99,0}}, +/* 27804 */ {(11<<2)|2,{53,99,0}}, +/* 27805 */ {(11<<2)|2,{53,99,0}}, +/* 27806 */ {(11<<2)|2,{53,99,0}}, +/* 27807 */ {(11<<2)|2,{53,99,0}}, +/* 27808 */ {(16<<2)|3,{53,101,48}}, +/* 27809 */ {(16<<2)|3,{53,101,49}}, +/* 27810 */ {(16<<2)|3,{53,101,50}}, +/* 27811 */ {(16<<2)|3,{53,101,97}}, +/* 27812 */ {(16<<2)|3,{53,101,99}}, +/* 27813 */ {(16<<2)|3,{53,101,101}}, +/* 27814 */ {(16<<2)|3,{53,101,105}}, +/* 27815 */ {(16<<2)|3,{53,101,111}}, +/* 27816 */ {(16<<2)|3,{53,101,115}}, +/* 27817 */ {(16<<2)|3,{53,101,116}}, +/* 27818 */ {(11<<2)|2,{53,101,0}}, +/* 27819 */ {(11<<2)|2,{53,101,0}}, +/* 27820 */ {(11<<2)|2,{53,101,0}}, +/* 27821 */ {(11<<2)|2,{53,101,0}}, +/* 27822 */ {(11<<2)|2,{53,101,0}}, +/* 27823 */ {(11<<2)|2,{53,101,0}}, +/* 27824 */ {(11<<2)|2,{53,101,0}}, +/* 27825 */ {(11<<2)|2,{53,101,0}}, +/* 27826 */ {(11<<2)|2,{53,101,0}}, +/* 27827 */ {(11<<2)|2,{53,101,0}}, +/* 27828 */ {(11<<2)|2,{53,101,0}}, +/* 27829 */ {(11<<2)|2,{53,101,0}}, +/* 27830 */ {(11<<2)|2,{53,101,0}}, +/* 27831 */ {(11<<2)|2,{53,101,0}}, +/* 27832 */ {(11<<2)|2,{53,101,0}}, +/* 27833 */ {(11<<2)|2,{53,101,0}}, +/* 27834 */ {(11<<2)|2,{53,101,0}}, +/* 27835 */ {(11<<2)|2,{53,101,0}}, +/* 27836 */ {(11<<2)|2,{53,101,0}}, +/* 27837 */ {(11<<2)|2,{53,101,0}}, +/* 27838 */ {(11<<2)|2,{53,101,0}}, +/* 27839 */ {(11<<2)|2,{53,101,0}}, +/* 27840 */ {(16<<2)|3,{53,105,48}}, +/* 27841 */ {(16<<2)|3,{53,105,49}}, +/* 27842 */ {(16<<2)|3,{53,105,50}}, +/* 27843 */ {(16<<2)|3,{53,105,97}}, +/* 27844 */ {(16<<2)|3,{53,105,99}}, +/* 27845 */ {(16<<2)|3,{53,105,101}}, +/* 27846 */ {(16<<2)|3,{53,105,105}}, +/* 27847 */ {(16<<2)|3,{53,105,111}}, +/* 27848 */ {(16<<2)|3,{53,105,115}}, +/* 27849 */ {(16<<2)|3,{53,105,116}}, +/* 27850 */ {(11<<2)|2,{53,105,0}}, +/* 27851 */ {(11<<2)|2,{53,105,0}}, +/* 27852 */ {(11<<2)|2,{53,105,0}}, +/* 27853 */ {(11<<2)|2,{53,105,0}}, +/* 27854 */ {(11<<2)|2,{53,105,0}}, +/* 27855 */ {(11<<2)|2,{53,105,0}}, +/* 27856 */ {(11<<2)|2,{53,105,0}}, +/* 27857 */ {(11<<2)|2,{53,105,0}}, +/* 27858 */ {(11<<2)|2,{53,105,0}}, +/* 27859 */ {(11<<2)|2,{53,105,0}}, +/* 27860 */ {(11<<2)|2,{53,105,0}}, +/* 27861 */ {(11<<2)|2,{53,105,0}}, +/* 27862 */ {(11<<2)|2,{53,105,0}}, +/* 27863 */ {(11<<2)|2,{53,105,0}}, +/* 27864 */ {(11<<2)|2,{53,105,0}}, +/* 27865 */ {(11<<2)|2,{53,105,0}}, +/* 27866 */ {(11<<2)|2,{53,105,0}}, +/* 27867 */ {(11<<2)|2,{53,105,0}}, +/* 27868 */ {(11<<2)|2,{53,105,0}}, +/* 27869 */ {(11<<2)|2,{53,105,0}}, +/* 27870 */ {(11<<2)|2,{53,105,0}}, +/* 27871 */ {(11<<2)|2,{53,105,0}}, +/* 27872 */ {(16<<2)|3,{53,111,48}}, +/* 27873 */ {(16<<2)|3,{53,111,49}}, +/* 27874 */ {(16<<2)|3,{53,111,50}}, +/* 27875 */ {(16<<2)|3,{53,111,97}}, +/* 27876 */ {(16<<2)|3,{53,111,99}}, +/* 27877 */ {(16<<2)|3,{53,111,101}}, +/* 27878 */ {(16<<2)|3,{53,111,105}}, +/* 27879 */ {(16<<2)|3,{53,111,111}}, +/* 27880 */ {(16<<2)|3,{53,111,115}}, +/* 27881 */ {(16<<2)|3,{53,111,116}}, +/* 27882 */ {(11<<2)|2,{53,111,0}}, +/* 27883 */ {(11<<2)|2,{53,111,0}}, +/* 27884 */ {(11<<2)|2,{53,111,0}}, +/* 27885 */ {(11<<2)|2,{53,111,0}}, +/* 27886 */ {(11<<2)|2,{53,111,0}}, +/* 27887 */ {(11<<2)|2,{53,111,0}}, +/* 27888 */ {(11<<2)|2,{53,111,0}}, +/* 27889 */ {(11<<2)|2,{53,111,0}}, +/* 27890 */ {(11<<2)|2,{53,111,0}}, +/* 27891 */ {(11<<2)|2,{53,111,0}}, +/* 27892 */ {(11<<2)|2,{53,111,0}}, +/* 27893 */ {(11<<2)|2,{53,111,0}}, +/* 27894 */ {(11<<2)|2,{53,111,0}}, +/* 27895 */ {(11<<2)|2,{53,111,0}}, +/* 27896 */ {(11<<2)|2,{53,111,0}}, +/* 27897 */ {(11<<2)|2,{53,111,0}}, +/* 27898 */ {(11<<2)|2,{53,111,0}}, +/* 27899 */ {(11<<2)|2,{53,111,0}}, +/* 27900 */ {(11<<2)|2,{53,111,0}}, +/* 27901 */ {(11<<2)|2,{53,111,0}}, +/* 27902 */ {(11<<2)|2,{53,111,0}}, +/* 27903 */ {(11<<2)|2,{53,111,0}}, +/* 27904 */ {(16<<2)|3,{53,115,48}}, +/* 27905 */ {(16<<2)|3,{53,115,49}}, +/* 27906 */ {(16<<2)|3,{53,115,50}}, +/* 27907 */ {(16<<2)|3,{53,115,97}}, +/* 27908 */ {(16<<2)|3,{53,115,99}}, +/* 27909 */ {(16<<2)|3,{53,115,101}}, +/* 27910 */ {(16<<2)|3,{53,115,105}}, +/* 27911 */ {(16<<2)|3,{53,115,111}}, +/* 27912 */ {(16<<2)|3,{53,115,115}}, +/* 27913 */ {(16<<2)|3,{53,115,116}}, +/* 27914 */ {(11<<2)|2,{53,115,0}}, +/* 27915 */ {(11<<2)|2,{53,115,0}}, +/* 27916 */ {(11<<2)|2,{53,115,0}}, +/* 27917 */ {(11<<2)|2,{53,115,0}}, +/* 27918 */ {(11<<2)|2,{53,115,0}}, +/* 27919 */ {(11<<2)|2,{53,115,0}}, +/* 27920 */ {(11<<2)|2,{53,115,0}}, +/* 27921 */ {(11<<2)|2,{53,115,0}}, +/* 27922 */ {(11<<2)|2,{53,115,0}}, +/* 27923 */ {(11<<2)|2,{53,115,0}}, +/* 27924 */ {(11<<2)|2,{53,115,0}}, +/* 27925 */ {(11<<2)|2,{53,115,0}}, +/* 27926 */ {(11<<2)|2,{53,115,0}}, +/* 27927 */ {(11<<2)|2,{53,115,0}}, +/* 27928 */ {(11<<2)|2,{53,115,0}}, +/* 27929 */ {(11<<2)|2,{53,115,0}}, +/* 27930 */ {(11<<2)|2,{53,115,0}}, +/* 27931 */ {(11<<2)|2,{53,115,0}}, +/* 27932 */ {(11<<2)|2,{53,115,0}}, +/* 27933 */ {(11<<2)|2,{53,115,0}}, +/* 27934 */ {(11<<2)|2,{53,115,0}}, +/* 27935 */ {(11<<2)|2,{53,115,0}}, +/* 27936 */ {(16<<2)|3,{53,116,48}}, +/* 27937 */ {(16<<2)|3,{53,116,49}}, +/* 27938 */ {(16<<2)|3,{53,116,50}}, +/* 27939 */ {(16<<2)|3,{53,116,97}}, +/* 27940 */ {(16<<2)|3,{53,116,99}}, +/* 27941 */ {(16<<2)|3,{53,116,101}}, +/* 27942 */ {(16<<2)|3,{53,116,105}}, +/* 27943 */ {(16<<2)|3,{53,116,111}}, +/* 27944 */ {(16<<2)|3,{53,116,115}}, +/* 27945 */ {(16<<2)|3,{53,116,116}}, +/* 27946 */ {(11<<2)|2,{53,116,0}}, +/* 27947 */ {(11<<2)|2,{53,116,0}}, +/* 27948 */ {(11<<2)|2,{53,116,0}}, +/* 27949 */ {(11<<2)|2,{53,116,0}}, +/* 27950 */ {(11<<2)|2,{53,116,0}}, +/* 27951 */ {(11<<2)|2,{53,116,0}}, +/* 27952 */ {(11<<2)|2,{53,116,0}}, +/* 27953 */ {(11<<2)|2,{53,116,0}}, +/* 27954 */ {(11<<2)|2,{53,116,0}}, +/* 27955 */ {(11<<2)|2,{53,116,0}}, +/* 27956 */ {(11<<2)|2,{53,116,0}}, +/* 27957 */ {(11<<2)|2,{53,116,0}}, +/* 27958 */ {(11<<2)|2,{53,116,0}}, +/* 27959 */ {(11<<2)|2,{53,116,0}}, +/* 27960 */ {(11<<2)|2,{53,116,0}}, +/* 27961 */ {(11<<2)|2,{53,116,0}}, +/* 27962 */ {(11<<2)|2,{53,116,0}}, +/* 27963 */ {(11<<2)|2,{53,116,0}}, +/* 27964 */ {(11<<2)|2,{53,116,0}}, +/* 27965 */ {(11<<2)|2,{53,116,0}}, +/* 27966 */ {(11<<2)|2,{53,116,0}}, +/* 27967 */ {(11<<2)|2,{53,116,0}}, +/* 27968 */ {(12<<2)|2,{53,32,0}}, +/* 27969 */ {(12<<2)|2,{53,32,0}}, +/* 27970 */ {(12<<2)|2,{53,32,0}}, +/* 27971 */ {(12<<2)|2,{53,32,0}}, +/* 27972 */ {(12<<2)|2,{53,32,0}}, +/* 27973 */ {(12<<2)|2,{53,32,0}}, +/* 27974 */ {(12<<2)|2,{53,32,0}}, +/* 27975 */ {(12<<2)|2,{53,32,0}}, +/* 27976 */ {(12<<2)|2,{53,32,0}}, +/* 27977 */ {(12<<2)|2,{53,32,0}}, +/* 27978 */ {(12<<2)|2,{53,32,0}}, +/* 27979 */ {(12<<2)|2,{53,32,0}}, +/* 27980 */ {(12<<2)|2,{53,32,0}}, +/* 27981 */ {(12<<2)|2,{53,32,0}}, +/* 27982 */ {(12<<2)|2,{53,32,0}}, +/* 27983 */ {(12<<2)|2,{53,32,0}}, +/* 27984 */ {(12<<2)|2,{53,37,0}}, +/* 27985 */ {(12<<2)|2,{53,37,0}}, +/* 27986 */ {(12<<2)|2,{53,37,0}}, +/* 27987 */ {(12<<2)|2,{53,37,0}}, +/* 27988 */ {(12<<2)|2,{53,37,0}}, +/* 27989 */ {(12<<2)|2,{53,37,0}}, +/* 27990 */ {(12<<2)|2,{53,37,0}}, +/* 27991 */ {(12<<2)|2,{53,37,0}}, +/* 27992 */ {(12<<2)|2,{53,37,0}}, +/* 27993 */ {(12<<2)|2,{53,37,0}}, +/* 27994 */ {(12<<2)|2,{53,37,0}}, +/* 27995 */ {(12<<2)|2,{53,37,0}}, +/* 27996 */ {(12<<2)|2,{53,37,0}}, +/* 27997 */ {(12<<2)|2,{53,37,0}}, +/* 27998 */ {(12<<2)|2,{53,37,0}}, +/* 27999 */ {(12<<2)|2,{53,37,0}}, +/* 28000 */ {(12<<2)|2,{53,45,0}}, +/* 28001 */ {(12<<2)|2,{53,45,0}}, +/* 28002 */ {(12<<2)|2,{53,45,0}}, +/* 28003 */ {(12<<2)|2,{53,45,0}}, +/* 28004 */ {(12<<2)|2,{53,45,0}}, +/* 28005 */ {(12<<2)|2,{53,45,0}}, +/* 28006 */ {(12<<2)|2,{53,45,0}}, +/* 28007 */ {(12<<2)|2,{53,45,0}}, +/* 28008 */ {(12<<2)|2,{53,45,0}}, +/* 28009 */ {(12<<2)|2,{53,45,0}}, +/* 28010 */ {(12<<2)|2,{53,45,0}}, +/* 28011 */ {(12<<2)|2,{53,45,0}}, +/* 28012 */ {(12<<2)|2,{53,45,0}}, +/* 28013 */ {(12<<2)|2,{53,45,0}}, +/* 28014 */ {(12<<2)|2,{53,45,0}}, +/* 28015 */ {(12<<2)|2,{53,45,0}}, +/* 28016 */ {(12<<2)|2,{53,46,0}}, +/* 28017 */ {(12<<2)|2,{53,46,0}}, +/* 28018 */ {(12<<2)|2,{53,46,0}}, +/* 28019 */ {(12<<2)|2,{53,46,0}}, +/* 28020 */ {(12<<2)|2,{53,46,0}}, +/* 28021 */ {(12<<2)|2,{53,46,0}}, +/* 28022 */ {(12<<2)|2,{53,46,0}}, +/* 28023 */ {(12<<2)|2,{53,46,0}}, +/* 28024 */ {(12<<2)|2,{53,46,0}}, +/* 28025 */ {(12<<2)|2,{53,46,0}}, +/* 28026 */ {(12<<2)|2,{53,46,0}}, +/* 28027 */ {(12<<2)|2,{53,46,0}}, +/* 28028 */ {(12<<2)|2,{53,46,0}}, +/* 28029 */ {(12<<2)|2,{53,46,0}}, +/* 28030 */ {(12<<2)|2,{53,46,0}}, +/* 28031 */ {(12<<2)|2,{53,46,0}}, +/* 28032 */ {(12<<2)|2,{53,47,0}}, +/* 28033 */ {(12<<2)|2,{53,47,0}}, +/* 28034 */ {(12<<2)|2,{53,47,0}}, +/* 28035 */ {(12<<2)|2,{53,47,0}}, +/* 28036 */ {(12<<2)|2,{53,47,0}}, +/* 28037 */ {(12<<2)|2,{53,47,0}}, +/* 28038 */ {(12<<2)|2,{53,47,0}}, +/* 28039 */ {(12<<2)|2,{53,47,0}}, +/* 28040 */ {(12<<2)|2,{53,47,0}}, +/* 28041 */ {(12<<2)|2,{53,47,0}}, +/* 28042 */ {(12<<2)|2,{53,47,0}}, +/* 28043 */ {(12<<2)|2,{53,47,0}}, +/* 28044 */ {(12<<2)|2,{53,47,0}}, +/* 28045 */ {(12<<2)|2,{53,47,0}}, +/* 28046 */ {(12<<2)|2,{53,47,0}}, +/* 28047 */ {(12<<2)|2,{53,47,0}}, +/* 28048 */ {(12<<2)|2,{53,51,0}}, +/* 28049 */ {(12<<2)|2,{53,51,0}}, +/* 28050 */ {(12<<2)|2,{53,51,0}}, +/* 28051 */ {(12<<2)|2,{53,51,0}}, +/* 28052 */ {(12<<2)|2,{53,51,0}}, +/* 28053 */ {(12<<2)|2,{53,51,0}}, +/* 28054 */ {(12<<2)|2,{53,51,0}}, +/* 28055 */ {(12<<2)|2,{53,51,0}}, +/* 28056 */ {(12<<2)|2,{53,51,0}}, +/* 28057 */ {(12<<2)|2,{53,51,0}}, +/* 28058 */ {(12<<2)|2,{53,51,0}}, +/* 28059 */ {(12<<2)|2,{53,51,0}}, +/* 28060 */ {(12<<2)|2,{53,51,0}}, +/* 28061 */ {(12<<2)|2,{53,51,0}}, +/* 28062 */ {(12<<2)|2,{53,51,0}}, +/* 28063 */ {(12<<2)|2,{53,51,0}}, +/* 28064 */ {(12<<2)|2,{53,52,0}}, +/* 28065 */ {(12<<2)|2,{53,52,0}}, +/* 28066 */ {(12<<2)|2,{53,52,0}}, +/* 28067 */ {(12<<2)|2,{53,52,0}}, +/* 28068 */ {(12<<2)|2,{53,52,0}}, +/* 28069 */ {(12<<2)|2,{53,52,0}}, +/* 28070 */ {(12<<2)|2,{53,52,0}}, +/* 28071 */ {(12<<2)|2,{53,52,0}}, +/* 28072 */ {(12<<2)|2,{53,52,0}}, +/* 28073 */ {(12<<2)|2,{53,52,0}}, +/* 28074 */ {(12<<2)|2,{53,52,0}}, +/* 28075 */ {(12<<2)|2,{53,52,0}}, +/* 28076 */ {(12<<2)|2,{53,52,0}}, +/* 28077 */ {(12<<2)|2,{53,52,0}}, +/* 28078 */ {(12<<2)|2,{53,52,0}}, +/* 28079 */ {(12<<2)|2,{53,52,0}}, +/* 28080 */ {(12<<2)|2,{53,53,0}}, +/* 28081 */ {(12<<2)|2,{53,53,0}}, +/* 28082 */ {(12<<2)|2,{53,53,0}}, +/* 28083 */ {(12<<2)|2,{53,53,0}}, +/* 28084 */ {(12<<2)|2,{53,53,0}}, +/* 28085 */ {(12<<2)|2,{53,53,0}}, +/* 28086 */ {(12<<2)|2,{53,53,0}}, +/* 28087 */ {(12<<2)|2,{53,53,0}}, +/* 28088 */ {(12<<2)|2,{53,53,0}}, +/* 28089 */ {(12<<2)|2,{53,53,0}}, +/* 28090 */ {(12<<2)|2,{53,53,0}}, +/* 28091 */ {(12<<2)|2,{53,53,0}}, +/* 28092 */ {(12<<2)|2,{53,53,0}}, +/* 28093 */ {(12<<2)|2,{53,53,0}}, +/* 28094 */ {(12<<2)|2,{53,53,0}}, +/* 28095 */ {(12<<2)|2,{53,53,0}}, +/* 28096 */ {(12<<2)|2,{53,54,0}}, +/* 28097 */ {(12<<2)|2,{53,54,0}}, +/* 28098 */ {(12<<2)|2,{53,54,0}}, +/* 28099 */ {(12<<2)|2,{53,54,0}}, +/* 28100 */ {(12<<2)|2,{53,54,0}}, +/* 28101 */ {(12<<2)|2,{53,54,0}}, +/* 28102 */ {(12<<2)|2,{53,54,0}}, +/* 28103 */ {(12<<2)|2,{53,54,0}}, +/* 28104 */ {(12<<2)|2,{53,54,0}}, +/* 28105 */ {(12<<2)|2,{53,54,0}}, +/* 28106 */ {(12<<2)|2,{53,54,0}}, +/* 28107 */ {(12<<2)|2,{53,54,0}}, +/* 28108 */ {(12<<2)|2,{53,54,0}}, +/* 28109 */ {(12<<2)|2,{53,54,0}}, +/* 28110 */ {(12<<2)|2,{53,54,0}}, +/* 28111 */ {(12<<2)|2,{53,54,0}}, +/* 28112 */ {(12<<2)|2,{53,55,0}}, +/* 28113 */ {(12<<2)|2,{53,55,0}}, +/* 28114 */ {(12<<2)|2,{53,55,0}}, +/* 28115 */ {(12<<2)|2,{53,55,0}}, +/* 28116 */ {(12<<2)|2,{53,55,0}}, +/* 28117 */ {(12<<2)|2,{53,55,0}}, +/* 28118 */ {(12<<2)|2,{53,55,0}}, +/* 28119 */ {(12<<2)|2,{53,55,0}}, +/* 28120 */ {(12<<2)|2,{53,55,0}}, +/* 28121 */ {(12<<2)|2,{53,55,0}}, +/* 28122 */ {(12<<2)|2,{53,55,0}}, +/* 28123 */ {(12<<2)|2,{53,55,0}}, +/* 28124 */ {(12<<2)|2,{53,55,0}}, +/* 28125 */ {(12<<2)|2,{53,55,0}}, +/* 28126 */ {(12<<2)|2,{53,55,0}}, +/* 28127 */ {(12<<2)|2,{53,55,0}}, +/* 28128 */ {(12<<2)|2,{53,56,0}}, +/* 28129 */ {(12<<2)|2,{53,56,0}}, +/* 28130 */ {(12<<2)|2,{53,56,0}}, +/* 28131 */ {(12<<2)|2,{53,56,0}}, +/* 28132 */ {(12<<2)|2,{53,56,0}}, +/* 28133 */ {(12<<2)|2,{53,56,0}}, +/* 28134 */ {(12<<2)|2,{53,56,0}}, +/* 28135 */ {(12<<2)|2,{53,56,0}}, +/* 28136 */ {(12<<2)|2,{53,56,0}}, +/* 28137 */ {(12<<2)|2,{53,56,0}}, +/* 28138 */ {(12<<2)|2,{53,56,0}}, +/* 28139 */ {(12<<2)|2,{53,56,0}}, +/* 28140 */ {(12<<2)|2,{53,56,0}}, +/* 28141 */ {(12<<2)|2,{53,56,0}}, +/* 28142 */ {(12<<2)|2,{53,56,0}}, +/* 28143 */ {(12<<2)|2,{53,56,0}}, +/* 28144 */ {(12<<2)|2,{53,57,0}}, +/* 28145 */ {(12<<2)|2,{53,57,0}}, +/* 28146 */ {(12<<2)|2,{53,57,0}}, +/* 28147 */ {(12<<2)|2,{53,57,0}}, +/* 28148 */ {(12<<2)|2,{53,57,0}}, +/* 28149 */ {(12<<2)|2,{53,57,0}}, +/* 28150 */ {(12<<2)|2,{53,57,0}}, +/* 28151 */ {(12<<2)|2,{53,57,0}}, +/* 28152 */ {(12<<2)|2,{53,57,0}}, +/* 28153 */ {(12<<2)|2,{53,57,0}}, +/* 28154 */ {(12<<2)|2,{53,57,0}}, +/* 28155 */ {(12<<2)|2,{53,57,0}}, +/* 28156 */ {(12<<2)|2,{53,57,0}}, +/* 28157 */ {(12<<2)|2,{53,57,0}}, +/* 28158 */ {(12<<2)|2,{53,57,0}}, +/* 28159 */ {(12<<2)|2,{53,57,0}}, +/* 28160 */ {(12<<2)|2,{53,61,0}}, +/* 28161 */ {(12<<2)|2,{53,61,0}}, +/* 28162 */ {(12<<2)|2,{53,61,0}}, +/* 28163 */ {(12<<2)|2,{53,61,0}}, +/* 28164 */ {(12<<2)|2,{53,61,0}}, +/* 28165 */ {(12<<2)|2,{53,61,0}}, +/* 28166 */ {(12<<2)|2,{53,61,0}}, +/* 28167 */ {(12<<2)|2,{53,61,0}}, +/* 28168 */ {(12<<2)|2,{53,61,0}}, +/* 28169 */ {(12<<2)|2,{53,61,0}}, +/* 28170 */ {(12<<2)|2,{53,61,0}}, +/* 28171 */ {(12<<2)|2,{53,61,0}}, +/* 28172 */ {(12<<2)|2,{53,61,0}}, +/* 28173 */ {(12<<2)|2,{53,61,0}}, +/* 28174 */ {(12<<2)|2,{53,61,0}}, +/* 28175 */ {(12<<2)|2,{53,61,0}}, +/* 28176 */ {(12<<2)|2,{53,65,0}}, +/* 28177 */ {(12<<2)|2,{53,65,0}}, +/* 28178 */ {(12<<2)|2,{53,65,0}}, +/* 28179 */ {(12<<2)|2,{53,65,0}}, +/* 28180 */ {(12<<2)|2,{53,65,0}}, +/* 28181 */ {(12<<2)|2,{53,65,0}}, +/* 28182 */ {(12<<2)|2,{53,65,0}}, +/* 28183 */ {(12<<2)|2,{53,65,0}}, +/* 28184 */ {(12<<2)|2,{53,65,0}}, +/* 28185 */ {(12<<2)|2,{53,65,0}}, +/* 28186 */ {(12<<2)|2,{53,65,0}}, +/* 28187 */ {(12<<2)|2,{53,65,0}}, +/* 28188 */ {(12<<2)|2,{53,65,0}}, +/* 28189 */ {(12<<2)|2,{53,65,0}}, +/* 28190 */ {(12<<2)|2,{53,65,0}}, +/* 28191 */ {(12<<2)|2,{53,65,0}}, +/* 28192 */ {(12<<2)|2,{53,95,0}}, +/* 28193 */ {(12<<2)|2,{53,95,0}}, +/* 28194 */ {(12<<2)|2,{53,95,0}}, +/* 28195 */ {(12<<2)|2,{53,95,0}}, +/* 28196 */ {(12<<2)|2,{53,95,0}}, +/* 28197 */ {(12<<2)|2,{53,95,0}}, +/* 28198 */ {(12<<2)|2,{53,95,0}}, +/* 28199 */ {(12<<2)|2,{53,95,0}}, +/* 28200 */ {(12<<2)|2,{53,95,0}}, +/* 28201 */ {(12<<2)|2,{53,95,0}}, +/* 28202 */ {(12<<2)|2,{53,95,0}}, +/* 28203 */ {(12<<2)|2,{53,95,0}}, +/* 28204 */ {(12<<2)|2,{53,95,0}}, +/* 28205 */ {(12<<2)|2,{53,95,0}}, +/* 28206 */ {(12<<2)|2,{53,95,0}}, +/* 28207 */ {(12<<2)|2,{53,95,0}}, +/* 28208 */ {(12<<2)|2,{53,98,0}}, +/* 28209 */ {(12<<2)|2,{53,98,0}}, +/* 28210 */ {(12<<2)|2,{53,98,0}}, +/* 28211 */ {(12<<2)|2,{53,98,0}}, +/* 28212 */ {(12<<2)|2,{53,98,0}}, +/* 28213 */ {(12<<2)|2,{53,98,0}}, +/* 28214 */ {(12<<2)|2,{53,98,0}}, +/* 28215 */ {(12<<2)|2,{53,98,0}}, +/* 28216 */ {(12<<2)|2,{53,98,0}}, +/* 28217 */ {(12<<2)|2,{53,98,0}}, +/* 28218 */ {(12<<2)|2,{53,98,0}}, +/* 28219 */ {(12<<2)|2,{53,98,0}}, +/* 28220 */ {(12<<2)|2,{53,98,0}}, +/* 28221 */ {(12<<2)|2,{53,98,0}}, +/* 28222 */ {(12<<2)|2,{53,98,0}}, +/* 28223 */ {(12<<2)|2,{53,98,0}}, +/* 28224 */ {(12<<2)|2,{53,100,0}}, +/* 28225 */ {(12<<2)|2,{53,100,0}}, +/* 28226 */ {(12<<2)|2,{53,100,0}}, +/* 28227 */ {(12<<2)|2,{53,100,0}}, +/* 28228 */ {(12<<2)|2,{53,100,0}}, +/* 28229 */ {(12<<2)|2,{53,100,0}}, +/* 28230 */ {(12<<2)|2,{53,100,0}}, +/* 28231 */ {(12<<2)|2,{53,100,0}}, +/* 28232 */ {(12<<2)|2,{53,100,0}}, +/* 28233 */ {(12<<2)|2,{53,100,0}}, +/* 28234 */ {(12<<2)|2,{53,100,0}}, +/* 28235 */ {(12<<2)|2,{53,100,0}}, +/* 28236 */ {(12<<2)|2,{53,100,0}}, +/* 28237 */ {(12<<2)|2,{53,100,0}}, +/* 28238 */ {(12<<2)|2,{53,100,0}}, +/* 28239 */ {(12<<2)|2,{53,100,0}}, +/* 28240 */ {(12<<2)|2,{53,102,0}}, +/* 28241 */ {(12<<2)|2,{53,102,0}}, +/* 28242 */ {(12<<2)|2,{53,102,0}}, +/* 28243 */ {(12<<2)|2,{53,102,0}}, +/* 28244 */ {(12<<2)|2,{53,102,0}}, +/* 28245 */ {(12<<2)|2,{53,102,0}}, +/* 28246 */ {(12<<2)|2,{53,102,0}}, +/* 28247 */ {(12<<2)|2,{53,102,0}}, +/* 28248 */ {(12<<2)|2,{53,102,0}}, +/* 28249 */ {(12<<2)|2,{53,102,0}}, +/* 28250 */ {(12<<2)|2,{53,102,0}}, +/* 28251 */ {(12<<2)|2,{53,102,0}}, +/* 28252 */ {(12<<2)|2,{53,102,0}}, +/* 28253 */ {(12<<2)|2,{53,102,0}}, +/* 28254 */ {(12<<2)|2,{53,102,0}}, +/* 28255 */ {(12<<2)|2,{53,102,0}}, +/* 28256 */ {(12<<2)|2,{53,103,0}}, +/* 28257 */ {(12<<2)|2,{53,103,0}}, +/* 28258 */ {(12<<2)|2,{53,103,0}}, +/* 28259 */ {(12<<2)|2,{53,103,0}}, +/* 28260 */ {(12<<2)|2,{53,103,0}}, +/* 28261 */ {(12<<2)|2,{53,103,0}}, +/* 28262 */ {(12<<2)|2,{53,103,0}}, +/* 28263 */ {(12<<2)|2,{53,103,0}}, +/* 28264 */ {(12<<2)|2,{53,103,0}}, +/* 28265 */ {(12<<2)|2,{53,103,0}}, +/* 28266 */ {(12<<2)|2,{53,103,0}}, +/* 28267 */ {(12<<2)|2,{53,103,0}}, +/* 28268 */ {(12<<2)|2,{53,103,0}}, +/* 28269 */ {(12<<2)|2,{53,103,0}}, +/* 28270 */ {(12<<2)|2,{53,103,0}}, +/* 28271 */ {(12<<2)|2,{53,103,0}}, +/* 28272 */ {(12<<2)|2,{53,104,0}}, +/* 28273 */ {(12<<2)|2,{53,104,0}}, +/* 28274 */ {(12<<2)|2,{53,104,0}}, +/* 28275 */ {(12<<2)|2,{53,104,0}}, +/* 28276 */ {(12<<2)|2,{53,104,0}}, +/* 28277 */ {(12<<2)|2,{53,104,0}}, +/* 28278 */ {(12<<2)|2,{53,104,0}}, +/* 28279 */ {(12<<2)|2,{53,104,0}}, +/* 28280 */ {(12<<2)|2,{53,104,0}}, +/* 28281 */ {(12<<2)|2,{53,104,0}}, +/* 28282 */ {(12<<2)|2,{53,104,0}}, +/* 28283 */ {(12<<2)|2,{53,104,0}}, +/* 28284 */ {(12<<2)|2,{53,104,0}}, +/* 28285 */ {(12<<2)|2,{53,104,0}}, +/* 28286 */ {(12<<2)|2,{53,104,0}}, +/* 28287 */ {(12<<2)|2,{53,104,0}}, +/* 28288 */ {(12<<2)|2,{53,108,0}}, +/* 28289 */ {(12<<2)|2,{53,108,0}}, +/* 28290 */ {(12<<2)|2,{53,108,0}}, +/* 28291 */ {(12<<2)|2,{53,108,0}}, +/* 28292 */ {(12<<2)|2,{53,108,0}}, +/* 28293 */ {(12<<2)|2,{53,108,0}}, +/* 28294 */ {(12<<2)|2,{53,108,0}}, +/* 28295 */ {(12<<2)|2,{53,108,0}}, +/* 28296 */ {(12<<2)|2,{53,108,0}}, +/* 28297 */ {(12<<2)|2,{53,108,0}}, +/* 28298 */ {(12<<2)|2,{53,108,0}}, +/* 28299 */ {(12<<2)|2,{53,108,0}}, +/* 28300 */ {(12<<2)|2,{53,108,0}}, +/* 28301 */ {(12<<2)|2,{53,108,0}}, +/* 28302 */ {(12<<2)|2,{53,108,0}}, +/* 28303 */ {(12<<2)|2,{53,108,0}}, +/* 28304 */ {(12<<2)|2,{53,109,0}}, +/* 28305 */ {(12<<2)|2,{53,109,0}}, +/* 28306 */ {(12<<2)|2,{53,109,0}}, +/* 28307 */ {(12<<2)|2,{53,109,0}}, +/* 28308 */ {(12<<2)|2,{53,109,0}}, +/* 28309 */ {(12<<2)|2,{53,109,0}}, +/* 28310 */ {(12<<2)|2,{53,109,0}}, +/* 28311 */ {(12<<2)|2,{53,109,0}}, +/* 28312 */ {(12<<2)|2,{53,109,0}}, +/* 28313 */ {(12<<2)|2,{53,109,0}}, +/* 28314 */ {(12<<2)|2,{53,109,0}}, +/* 28315 */ {(12<<2)|2,{53,109,0}}, +/* 28316 */ {(12<<2)|2,{53,109,0}}, +/* 28317 */ {(12<<2)|2,{53,109,0}}, +/* 28318 */ {(12<<2)|2,{53,109,0}}, +/* 28319 */ {(12<<2)|2,{53,109,0}}, +/* 28320 */ {(12<<2)|2,{53,110,0}}, +/* 28321 */ {(12<<2)|2,{53,110,0}}, +/* 28322 */ {(12<<2)|2,{53,110,0}}, +/* 28323 */ {(12<<2)|2,{53,110,0}}, +/* 28324 */ {(12<<2)|2,{53,110,0}}, +/* 28325 */ {(12<<2)|2,{53,110,0}}, +/* 28326 */ {(12<<2)|2,{53,110,0}}, +/* 28327 */ {(12<<2)|2,{53,110,0}}, +/* 28328 */ {(12<<2)|2,{53,110,0}}, +/* 28329 */ {(12<<2)|2,{53,110,0}}, +/* 28330 */ {(12<<2)|2,{53,110,0}}, +/* 28331 */ {(12<<2)|2,{53,110,0}}, +/* 28332 */ {(12<<2)|2,{53,110,0}}, +/* 28333 */ {(12<<2)|2,{53,110,0}}, +/* 28334 */ {(12<<2)|2,{53,110,0}}, +/* 28335 */ {(12<<2)|2,{53,110,0}}, +/* 28336 */ {(12<<2)|2,{53,112,0}}, +/* 28337 */ {(12<<2)|2,{53,112,0}}, +/* 28338 */ {(12<<2)|2,{53,112,0}}, +/* 28339 */ {(12<<2)|2,{53,112,0}}, +/* 28340 */ {(12<<2)|2,{53,112,0}}, +/* 28341 */ {(12<<2)|2,{53,112,0}}, +/* 28342 */ {(12<<2)|2,{53,112,0}}, +/* 28343 */ {(12<<2)|2,{53,112,0}}, +/* 28344 */ {(12<<2)|2,{53,112,0}}, +/* 28345 */ {(12<<2)|2,{53,112,0}}, +/* 28346 */ {(12<<2)|2,{53,112,0}}, +/* 28347 */ {(12<<2)|2,{53,112,0}}, +/* 28348 */ {(12<<2)|2,{53,112,0}}, +/* 28349 */ {(12<<2)|2,{53,112,0}}, +/* 28350 */ {(12<<2)|2,{53,112,0}}, +/* 28351 */ {(12<<2)|2,{53,112,0}}, +/* 28352 */ {(12<<2)|2,{53,114,0}}, +/* 28353 */ {(12<<2)|2,{53,114,0}}, +/* 28354 */ {(12<<2)|2,{53,114,0}}, +/* 28355 */ {(12<<2)|2,{53,114,0}}, +/* 28356 */ {(12<<2)|2,{53,114,0}}, +/* 28357 */ {(12<<2)|2,{53,114,0}}, +/* 28358 */ {(12<<2)|2,{53,114,0}}, +/* 28359 */ {(12<<2)|2,{53,114,0}}, +/* 28360 */ {(12<<2)|2,{53,114,0}}, +/* 28361 */ {(12<<2)|2,{53,114,0}}, +/* 28362 */ {(12<<2)|2,{53,114,0}}, +/* 28363 */ {(12<<2)|2,{53,114,0}}, +/* 28364 */ {(12<<2)|2,{53,114,0}}, +/* 28365 */ {(12<<2)|2,{53,114,0}}, +/* 28366 */ {(12<<2)|2,{53,114,0}}, +/* 28367 */ {(12<<2)|2,{53,114,0}}, +/* 28368 */ {(12<<2)|2,{53,117,0}}, +/* 28369 */ {(12<<2)|2,{53,117,0}}, +/* 28370 */ {(12<<2)|2,{53,117,0}}, +/* 28371 */ {(12<<2)|2,{53,117,0}}, +/* 28372 */ {(12<<2)|2,{53,117,0}}, +/* 28373 */ {(12<<2)|2,{53,117,0}}, +/* 28374 */ {(12<<2)|2,{53,117,0}}, +/* 28375 */ {(12<<2)|2,{53,117,0}}, +/* 28376 */ {(12<<2)|2,{53,117,0}}, +/* 28377 */ {(12<<2)|2,{53,117,0}}, +/* 28378 */ {(12<<2)|2,{53,117,0}}, +/* 28379 */ {(12<<2)|2,{53,117,0}}, +/* 28380 */ {(12<<2)|2,{53,117,0}}, +/* 28381 */ {(12<<2)|2,{53,117,0}}, +/* 28382 */ {(12<<2)|2,{53,117,0}}, +/* 28383 */ {(12<<2)|2,{53,117,0}}, +/* 28384 */ {(13<<2)|2,{53,58,0}}, +/* 28385 */ {(13<<2)|2,{53,58,0}}, +/* 28386 */ {(13<<2)|2,{53,58,0}}, +/* 28387 */ {(13<<2)|2,{53,58,0}}, +/* 28388 */ {(13<<2)|2,{53,58,0}}, +/* 28389 */ {(13<<2)|2,{53,58,0}}, +/* 28390 */ {(13<<2)|2,{53,58,0}}, +/* 28391 */ {(13<<2)|2,{53,58,0}}, +/* 28392 */ {(13<<2)|2,{53,66,0}}, +/* 28393 */ {(13<<2)|2,{53,66,0}}, +/* 28394 */ {(13<<2)|2,{53,66,0}}, +/* 28395 */ {(13<<2)|2,{53,66,0}}, +/* 28396 */ {(13<<2)|2,{53,66,0}}, +/* 28397 */ {(13<<2)|2,{53,66,0}}, +/* 28398 */ {(13<<2)|2,{53,66,0}}, +/* 28399 */ {(13<<2)|2,{53,66,0}}, +/* 28400 */ {(13<<2)|2,{53,67,0}}, +/* 28401 */ {(13<<2)|2,{53,67,0}}, +/* 28402 */ {(13<<2)|2,{53,67,0}}, +/* 28403 */ {(13<<2)|2,{53,67,0}}, +/* 28404 */ {(13<<2)|2,{53,67,0}}, +/* 28405 */ {(13<<2)|2,{53,67,0}}, +/* 28406 */ {(13<<2)|2,{53,67,0}}, +/* 28407 */ {(13<<2)|2,{53,67,0}}, +/* 28408 */ {(13<<2)|2,{53,68,0}}, +/* 28409 */ {(13<<2)|2,{53,68,0}}, +/* 28410 */ {(13<<2)|2,{53,68,0}}, +/* 28411 */ {(13<<2)|2,{53,68,0}}, +/* 28412 */ {(13<<2)|2,{53,68,0}}, +/* 28413 */ {(13<<2)|2,{53,68,0}}, +/* 28414 */ {(13<<2)|2,{53,68,0}}, +/* 28415 */ {(13<<2)|2,{53,68,0}}, +/* 28416 */ {(13<<2)|2,{53,69,0}}, +/* 28417 */ {(13<<2)|2,{53,69,0}}, +/* 28418 */ {(13<<2)|2,{53,69,0}}, +/* 28419 */ {(13<<2)|2,{53,69,0}}, +/* 28420 */ {(13<<2)|2,{53,69,0}}, +/* 28421 */ {(13<<2)|2,{53,69,0}}, +/* 28422 */ {(13<<2)|2,{53,69,0}}, +/* 28423 */ {(13<<2)|2,{53,69,0}}, +/* 28424 */ {(13<<2)|2,{53,70,0}}, +/* 28425 */ {(13<<2)|2,{53,70,0}}, +/* 28426 */ {(13<<2)|2,{53,70,0}}, +/* 28427 */ {(13<<2)|2,{53,70,0}}, +/* 28428 */ {(13<<2)|2,{53,70,0}}, +/* 28429 */ {(13<<2)|2,{53,70,0}}, +/* 28430 */ {(13<<2)|2,{53,70,0}}, +/* 28431 */ {(13<<2)|2,{53,70,0}}, +/* 28432 */ {(13<<2)|2,{53,71,0}}, +/* 28433 */ {(13<<2)|2,{53,71,0}}, +/* 28434 */ {(13<<2)|2,{53,71,0}}, +/* 28435 */ {(13<<2)|2,{53,71,0}}, +/* 28436 */ {(13<<2)|2,{53,71,0}}, +/* 28437 */ {(13<<2)|2,{53,71,0}}, +/* 28438 */ {(13<<2)|2,{53,71,0}}, +/* 28439 */ {(13<<2)|2,{53,71,0}}, +/* 28440 */ {(13<<2)|2,{53,72,0}}, +/* 28441 */ {(13<<2)|2,{53,72,0}}, +/* 28442 */ {(13<<2)|2,{53,72,0}}, +/* 28443 */ {(13<<2)|2,{53,72,0}}, +/* 28444 */ {(13<<2)|2,{53,72,0}}, +/* 28445 */ {(13<<2)|2,{53,72,0}}, +/* 28446 */ {(13<<2)|2,{53,72,0}}, +/* 28447 */ {(13<<2)|2,{53,72,0}}, +/* 28448 */ {(13<<2)|2,{53,73,0}}, +/* 28449 */ {(13<<2)|2,{53,73,0}}, +/* 28450 */ {(13<<2)|2,{53,73,0}}, +/* 28451 */ {(13<<2)|2,{53,73,0}}, +/* 28452 */ {(13<<2)|2,{53,73,0}}, +/* 28453 */ {(13<<2)|2,{53,73,0}}, +/* 28454 */ {(13<<2)|2,{53,73,0}}, +/* 28455 */ {(13<<2)|2,{53,73,0}}, +/* 28456 */ {(13<<2)|2,{53,74,0}}, +/* 28457 */ {(13<<2)|2,{53,74,0}}, +/* 28458 */ {(13<<2)|2,{53,74,0}}, +/* 28459 */ {(13<<2)|2,{53,74,0}}, +/* 28460 */ {(13<<2)|2,{53,74,0}}, +/* 28461 */ {(13<<2)|2,{53,74,0}}, +/* 28462 */ {(13<<2)|2,{53,74,0}}, +/* 28463 */ {(13<<2)|2,{53,74,0}}, +/* 28464 */ {(13<<2)|2,{53,75,0}}, +/* 28465 */ {(13<<2)|2,{53,75,0}}, +/* 28466 */ {(13<<2)|2,{53,75,0}}, +/* 28467 */ {(13<<2)|2,{53,75,0}}, +/* 28468 */ {(13<<2)|2,{53,75,0}}, +/* 28469 */ {(13<<2)|2,{53,75,0}}, +/* 28470 */ {(13<<2)|2,{53,75,0}}, +/* 28471 */ {(13<<2)|2,{53,75,0}}, +/* 28472 */ {(13<<2)|2,{53,76,0}}, +/* 28473 */ {(13<<2)|2,{53,76,0}}, +/* 28474 */ {(13<<2)|2,{53,76,0}}, +/* 28475 */ {(13<<2)|2,{53,76,0}}, +/* 28476 */ {(13<<2)|2,{53,76,0}}, +/* 28477 */ {(13<<2)|2,{53,76,0}}, +/* 28478 */ {(13<<2)|2,{53,76,0}}, +/* 28479 */ {(13<<2)|2,{53,76,0}}, +/* 28480 */ {(13<<2)|2,{53,77,0}}, +/* 28481 */ {(13<<2)|2,{53,77,0}}, +/* 28482 */ {(13<<2)|2,{53,77,0}}, +/* 28483 */ {(13<<2)|2,{53,77,0}}, +/* 28484 */ {(13<<2)|2,{53,77,0}}, +/* 28485 */ {(13<<2)|2,{53,77,0}}, +/* 28486 */ {(13<<2)|2,{53,77,0}}, +/* 28487 */ {(13<<2)|2,{53,77,0}}, +/* 28488 */ {(13<<2)|2,{53,78,0}}, +/* 28489 */ {(13<<2)|2,{53,78,0}}, +/* 28490 */ {(13<<2)|2,{53,78,0}}, +/* 28491 */ {(13<<2)|2,{53,78,0}}, +/* 28492 */ {(13<<2)|2,{53,78,0}}, +/* 28493 */ {(13<<2)|2,{53,78,0}}, +/* 28494 */ {(13<<2)|2,{53,78,0}}, +/* 28495 */ {(13<<2)|2,{53,78,0}}, +/* 28496 */ {(13<<2)|2,{53,79,0}}, +/* 28497 */ {(13<<2)|2,{53,79,0}}, +/* 28498 */ {(13<<2)|2,{53,79,0}}, +/* 28499 */ {(13<<2)|2,{53,79,0}}, +/* 28500 */ {(13<<2)|2,{53,79,0}}, +/* 28501 */ {(13<<2)|2,{53,79,0}}, +/* 28502 */ {(13<<2)|2,{53,79,0}}, +/* 28503 */ {(13<<2)|2,{53,79,0}}, +/* 28504 */ {(13<<2)|2,{53,80,0}}, +/* 28505 */ {(13<<2)|2,{53,80,0}}, +/* 28506 */ {(13<<2)|2,{53,80,0}}, +/* 28507 */ {(13<<2)|2,{53,80,0}}, +/* 28508 */ {(13<<2)|2,{53,80,0}}, +/* 28509 */ {(13<<2)|2,{53,80,0}}, +/* 28510 */ {(13<<2)|2,{53,80,0}}, +/* 28511 */ {(13<<2)|2,{53,80,0}}, +/* 28512 */ {(13<<2)|2,{53,81,0}}, +/* 28513 */ {(13<<2)|2,{53,81,0}}, +/* 28514 */ {(13<<2)|2,{53,81,0}}, +/* 28515 */ {(13<<2)|2,{53,81,0}}, +/* 28516 */ {(13<<2)|2,{53,81,0}}, +/* 28517 */ {(13<<2)|2,{53,81,0}}, +/* 28518 */ {(13<<2)|2,{53,81,0}}, +/* 28519 */ {(13<<2)|2,{53,81,0}}, +/* 28520 */ {(13<<2)|2,{53,82,0}}, +/* 28521 */ {(13<<2)|2,{53,82,0}}, +/* 28522 */ {(13<<2)|2,{53,82,0}}, +/* 28523 */ {(13<<2)|2,{53,82,0}}, +/* 28524 */ {(13<<2)|2,{53,82,0}}, +/* 28525 */ {(13<<2)|2,{53,82,0}}, +/* 28526 */ {(13<<2)|2,{53,82,0}}, +/* 28527 */ {(13<<2)|2,{53,82,0}}, +/* 28528 */ {(13<<2)|2,{53,83,0}}, +/* 28529 */ {(13<<2)|2,{53,83,0}}, +/* 28530 */ {(13<<2)|2,{53,83,0}}, +/* 28531 */ {(13<<2)|2,{53,83,0}}, +/* 28532 */ {(13<<2)|2,{53,83,0}}, +/* 28533 */ {(13<<2)|2,{53,83,0}}, +/* 28534 */ {(13<<2)|2,{53,83,0}}, +/* 28535 */ {(13<<2)|2,{53,83,0}}, +/* 28536 */ {(13<<2)|2,{53,84,0}}, +/* 28537 */ {(13<<2)|2,{53,84,0}}, +/* 28538 */ {(13<<2)|2,{53,84,0}}, +/* 28539 */ {(13<<2)|2,{53,84,0}}, +/* 28540 */ {(13<<2)|2,{53,84,0}}, +/* 28541 */ {(13<<2)|2,{53,84,0}}, +/* 28542 */ {(13<<2)|2,{53,84,0}}, +/* 28543 */ {(13<<2)|2,{53,84,0}}, +/* 28544 */ {(13<<2)|2,{53,85,0}}, +/* 28545 */ {(13<<2)|2,{53,85,0}}, +/* 28546 */ {(13<<2)|2,{53,85,0}}, +/* 28547 */ {(13<<2)|2,{53,85,0}}, +/* 28548 */ {(13<<2)|2,{53,85,0}}, +/* 28549 */ {(13<<2)|2,{53,85,0}}, +/* 28550 */ {(13<<2)|2,{53,85,0}}, +/* 28551 */ {(13<<2)|2,{53,85,0}}, +/* 28552 */ {(13<<2)|2,{53,86,0}}, +/* 28553 */ {(13<<2)|2,{53,86,0}}, +/* 28554 */ {(13<<2)|2,{53,86,0}}, +/* 28555 */ {(13<<2)|2,{53,86,0}}, +/* 28556 */ {(13<<2)|2,{53,86,0}}, +/* 28557 */ {(13<<2)|2,{53,86,0}}, +/* 28558 */ {(13<<2)|2,{53,86,0}}, +/* 28559 */ {(13<<2)|2,{53,86,0}}, +/* 28560 */ {(13<<2)|2,{53,87,0}}, +/* 28561 */ {(13<<2)|2,{53,87,0}}, +/* 28562 */ {(13<<2)|2,{53,87,0}}, +/* 28563 */ {(13<<2)|2,{53,87,0}}, +/* 28564 */ {(13<<2)|2,{53,87,0}}, +/* 28565 */ {(13<<2)|2,{53,87,0}}, +/* 28566 */ {(13<<2)|2,{53,87,0}}, +/* 28567 */ {(13<<2)|2,{53,87,0}}, +/* 28568 */ {(13<<2)|2,{53,89,0}}, +/* 28569 */ {(13<<2)|2,{53,89,0}}, +/* 28570 */ {(13<<2)|2,{53,89,0}}, +/* 28571 */ {(13<<2)|2,{53,89,0}}, +/* 28572 */ {(13<<2)|2,{53,89,0}}, +/* 28573 */ {(13<<2)|2,{53,89,0}}, +/* 28574 */ {(13<<2)|2,{53,89,0}}, +/* 28575 */ {(13<<2)|2,{53,89,0}}, +/* 28576 */ {(13<<2)|2,{53,106,0}}, +/* 28577 */ {(13<<2)|2,{53,106,0}}, +/* 28578 */ {(13<<2)|2,{53,106,0}}, +/* 28579 */ {(13<<2)|2,{53,106,0}}, +/* 28580 */ {(13<<2)|2,{53,106,0}}, +/* 28581 */ {(13<<2)|2,{53,106,0}}, +/* 28582 */ {(13<<2)|2,{53,106,0}}, +/* 28583 */ {(13<<2)|2,{53,106,0}}, +/* 28584 */ {(13<<2)|2,{53,107,0}}, +/* 28585 */ {(13<<2)|2,{53,107,0}}, +/* 28586 */ {(13<<2)|2,{53,107,0}}, +/* 28587 */ {(13<<2)|2,{53,107,0}}, +/* 28588 */ {(13<<2)|2,{53,107,0}}, +/* 28589 */ {(13<<2)|2,{53,107,0}}, +/* 28590 */ {(13<<2)|2,{53,107,0}}, +/* 28591 */ {(13<<2)|2,{53,107,0}}, +/* 28592 */ {(13<<2)|2,{53,113,0}}, +/* 28593 */ {(13<<2)|2,{53,113,0}}, +/* 28594 */ {(13<<2)|2,{53,113,0}}, +/* 28595 */ {(13<<2)|2,{53,113,0}}, +/* 28596 */ {(13<<2)|2,{53,113,0}}, +/* 28597 */ {(13<<2)|2,{53,113,0}}, +/* 28598 */ {(13<<2)|2,{53,113,0}}, +/* 28599 */ {(13<<2)|2,{53,113,0}}, +/* 28600 */ {(13<<2)|2,{53,118,0}}, +/* 28601 */ {(13<<2)|2,{53,118,0}}, +/* 28602 */ {(13<<2)|2,{53,118,0}}, +/* 28603 */ {(13<<2)|2,{53,118,0}}, +/* 28604 */ {(13<<2)|2,{53,118,0}}, +/* 28605 */ {(13<<2)|2,{53,118,0}}, +/* 28606 */ {(13<<2)|2,{53,118,0}}, +/* 28607 */ {(13<<2)|2,{53,118,0}}, +/* 28608 */ {(13<<2)|2,{53,119,0}}, +/* 28609 */ {(13<<2)|2,{53,119,0}}, +/* 28610 */ {(13<<2)|2,{53,119,0}}, +/* 28611 */ {(13<<2)|2,{53,119,0}}, +/* 28612 */ {(13<<2)|2,{53,119,0}}, +/* 28613 */ {(13<<2)|2,{53,119,0}}, +/* 28614 */ {(13<<2)|2,{53,119,0}}, +/* 28615 */ {(13<<2)|2,{53,119,0}}, +/* 28616 */ {(13<<2)|2,{53,120,0}}, +/* 28617 */ {(13<<2)|2,{53,120,0}}, +/* 28618 */ {(13<<2)|2,{53,120,0}}, +/* 28619 */ {(13<<2)|2,{53,120,0}}, +/* 28620 */ {(13<<2)|2,{53,120,0}}, +/* 28621 */ {(13<<2)|2,{53,120,0}}, +/* 28622 */ {(13<<2)|2,{53,120,0}}, +/* 28623 */ {(13<<2)|2,{53,120,0}}, +/* 28624 */ {(13<<2)|2,{53,121,0}}, +/* 28625 */ {(13<<2)|2,{53,121,0}}, +/* 28626 */ {(13<<2)|2,{53,121,0}}, +/* 28627 */ {(13<<2)|2,{53,121,0}}, +/* 28628 */ {(13<<2)|2,{53,121,0}}, +/* 28629 */ {(13<<2)|2,{53,121,0}}, +/* 28630 */ {(13<<2)|2,{53,121,0}}, +/* 28631 */ {(13<<2)|2,{53,121,0}}, +/* 28632 */ {(13<<2)|2,{53,122,0}}, +/* 28633 */ {(13<<2)|2,{53,122,0}}, +/* 28634 */ {(13<<2)|2,{53,122,0}}, +/* 28635 */ {(13<<2)|2,{53,122,0}}, +/* 28636 */ {(13<<2)|2,{53,122,0}}, +/* 28637 */ {(13<<2)|2,{53,122,0}}, +/* 28638 */ {(13<<2)|2,{53,122,0}}, +/* 28639 */ {(13<<2)|2,{53,122,0}}, +/* 28640 */ {(14<<2)|2,{53,38,0}}, +/* 28641 */ {(14<<2)|2,{53,38,0}}, +/* 28642 */ {(14<<2)|2,{53,38,0}}, +/* 28643 */ {(14<<2)|2,{53,38,0}}, +/* 28644 */ {(14<<2)|2,{53,42,0}}, +/* 28645 */ {(14<<2)|2,{53,42,0}}, +/* 28646 */ {(14<<2)|2,{53,42,0}}, +/* 28647 */ {(14<<2)|2,{53,42,0}}, +/* 28648 */ {(14<<2)|2,{53,44,0}}, +/* 28649 */ {(14<<2)|2,{53,44,0}}, +/* 28650 */ {(14<<2)|2,{53,44,0}}, +/* 28651 */ {(14<<2)|2,{53,44,0}}, +/* 28652 */ {(14<<2)|2,{53,59,0}}, +/* 28653 */ {(14<<2)|2,{53,59,0}}, +/* 28654 */ {(14<<2)|2,{53,59,0}}, +/* 28655 */ {(14<<2)|2,{53,59,0}}, +/* 28656 */ {(14<<2)|2,{53,88,0}}, +/* 28657 */ {(14<<2)|2,{53,88,0}}, +/* 28658 */ {(14<<2)|2,{53,88,0}}, +/* 28659 */ {(14<<2)|2,{53,88,0}}, +/* 28660 */ {(14<<2)|2,{53,90,0}}, +/* 28661 */ {(14<<2)|2,{53,90,0}}, +/* 28662 */ {(14<<2)|2,{53,90,0}}, +/* 28663 */ {(14<<2)|2,{53,90,0}}, +/* 28664 */ {(16<<2)|2,{53,33,0}}, +/* 28665 */ {(16<<2)|2,{53,34,0}}, +/* 28666 */ {(16<<2)|2,{53,40,0}}, +/* 28667 */ {(16<<2)|2,{53,41,0}}, +/* 28668 */ {(16<<2)|2,{53,63,0}}, +/* 28669 */ {(6<<2)|1,{53,0,0}}, +/* 28670 */ {(6<<2)|1,{53,0,0}}, +/* 28671 */ {(6<<2)|1,{53,0,0}}, +/* 28672 */ {(16<<2)|3,{54,48,48}}, +/* 28673 */ {(16<<2)|3,{54,48,49}}, +/* 28674 */ {(16<<2)|3,{54,48,50}}, +/* 28675 */ {(16<<2)|3,{54,48,97}}, +/* 28676 */ {(16<<2)|3,{54,48,99}}, +/* 28677 */ {(16<<2)|3,{54,48,101}}, +/* 28678 */ {(16<<2)|3,{54,48,105}}, +/* 28679 */ {(16<<2)|3,{54,48,111}}, +/* 28680 */ {(16<<2)|3,{54,48,115}}, +/* 28681 */ {(16<<2)|3,{54,48,116}}, +/* 28682 */ {(11<<2)|2,{54,48,0}}, +/* 28683 */ {(11<<2)|2,{54,48,0}}, +/* 28684 */ {(11<<2)|2,{54,48,0}}, +/* 28685 */ {(11<<2)|2,{54,48,0}}, +/* 28686 */ {(11<<2)|2,{54,48,0}}, +/* 28687 */ {(11<<2)|2,{54,48,0}}, +/* 28688 */ {(11<<2)|2,{54,48,0}}, +/* 28689 */ {(11<<2)|2,{54,48,0}}, +/* 28690 */ {(11<<2)|2,{54,48,0}}, +/* 28691 */ {(11<<2)|2,{54,48,0}}, +/* 28692 */ {(11<<2)|2,{54,48,0}}, +/* 28693 */ {(11<<2)|2,{54,48,0}}, +/* 28694 */ {(11<<2)|2,{54,48,0}}, +/* 28695 */ {(11<<2)|2,{54,48,0}}, +/* 28696 */ {(11<<2)|2,{54,48,0}}, +/* 28697 */ {(11<<2)|2,{54,48,0}}, +/* 28698 */ {(11<<2)|2,{54,48,0}}, +/* 28699 */ {(11<<2)|2,{54,48,0}}, +/* 28700 */ {(11<<2)|2,{54,48,0}}, +/* 28701 */ {(11<<2)|2,{54,48,0}}, +/* 28702 */ {(11<<2)|2,{54,48,0}}, +/* 28703 */ {(11<<2)|2,{54,48,0}}, +/* 28704 */ {(16<<2)|3,{54,49,48}}, +/* 28705 */ {(16<<2)|3,{54,49,49}}, +/* 28706 */ {(16<<2)|3,{54,49,50}}, +/* 28707 */ {(16<<2)|3,{54,49,97}}, +/* 28708 */ {(16<<2)|3,{54,49,99}}, +/* 28709 */ {(16<<2)|3,{54,49,101}}, +/* 28710 */ {(16<<2)|3,{54,49,105}}, +/* 28711 */ {(16<<2)|3,{54,49,111}}, +/* 28712 */ {(16<<2)|3,{54,49,115}}, +/* 28713 */ {(16<<2)|3,{54,49,116}}, +/* 28714 */ {(11<<2)|2,{54,49,0}}, +/* 28715 */ {(11<<2)|2,{54,49,0}}, +/* 28716 */ {(11<<2)|2,{54,49,0}}, +/* 28717 */ {(11<<2)|2,{54,49,0}}, +/* 28718 */ {(11<<2)|2,{54,49,0}}, +/* 28719 */ {(11<<2)|2,{54,49,0}}, +/* 28720 */ {(11<<2)|2,{54,49,0}}, +/* 28721 */ {(11<<2)|2,{54,49,0}}, +/* 28722 */ {(11<<2)|2,{54,49,0}}, +/* 28723 */ {(11<<2)|2,{54,49,0}}, +/* 28724 */ {(11<<2)|2,{54,49,0}}, +/* 28725 */ {(11<<2)|2,{54,49,0}}, +/* 28726 */ {(11<<2)|2,{54,49,0}}, +/* 28727 */ {(11<<2)|2,{54,49,0}}, +/* 28728 */ {(11<<2)|2,{54,49,0}}, +/* 28729 */ {(11<<2)|2,{54,49,0}}, +/* 28730 */ {(11<<2)|2,{54,49,0}}, +/* 28731 */ {(11<<2)|2,{54,49,0}}, +/* 28732 */ {(11<<2)|2,{54,49,0}}, +/* 28733 */ {(11<<2)|2,{54,49,0}}, +/* 28734 */ {(11<<2)|2,{54,49,0}}, +/* 28735 */ {(11<<2)|2,{54,49,0}}, +/* 28736 */ {(16<<2)|3,{54,50,48}}, +/* 28737 */ {(16<<2)|3,{54,50,49}}, +/* 28738 */ {(16<<2)|3,{54,50,50}}, +/* 28739 */ {(16<<2)|3,{54,50,97}}, +/* 28740 */ {(16<<2)|3,{54,50,99}}, +/* 28741 */ {(16<<2)|3,{54,50,101}}, +/* 28742 */ {(16<<2)|3,{54,50,105}}, +/* 28743 */ {(16<<2)|3,{54,50,111}}, +/* 28744 */ {(16<<2)|3,{54,50,115}}, +/* 28745 */ {(16<<2)|3,{54,50,116}}, +/* 28746 */ {(11<<2)|2,{54,50,0}}, +/* 28747 */ {(11<<2)|2,{54,50,0}}, +/* 28748 */ {(11<<2)|2,{54,50,0}}, +/* 28749 */ {(11<<2)|2,{54,50,0}}, +/* 28750 */ {(11<<2)|2,{54,50,0}}, +/* 28751 */ {(11<<2)|2,{54,50,0}}, +/* 28752 */ {(11<<2)|2,{54,50,0}}, +/* 28753 */ {(11<<2)|2,{54,50,0}}, +/* 28754 */ {(11<<2)|2,{54,50,0}}, +/* 28755 */ {(11<<2)|2,{54,50,0}}, +/* 28756 */ {(11<<2)|2,{54,50,0}}, +/* 28757 */ {(11<<2)|2,{54,50,0}}, +/* 28758 */ {(11<<2)|2,{54,50,0}}, +/* 28759 */ {(11<<2)|2,{54,50,0}}, +/* 28760 */ {(11<<2)|2,{54,50,0}}, +/* 28761 */ {(11<<2)|2,{54,50,0}}, +/* 28762 */ {(11<<2)|2,{54,50,0}}, +/* 28763 */ {(11<<2)|2,{54,50,0}}, +/* 28764 */ {(11<<2)|2,{54,50,0}}, +/* 28765 */ {(11<<2)|2,{54,50,0}}, +/* 28766 */ {(11<<2)|2,{54,50,0}}, +/* 28767 */ {(11<<2)|2,{54,50,0}}, +/* 28768 */ {(16<<2)|3,{54,97,48}}, +/* 28769 */ {(16<<2)|3,{54,97,49}}, +/* 28770 */ {(16<<2)|3,{54,97,50}}, +/* 28771 */ {(16<<2)|3,{54,97,97}}, +/* 28772 */ {(16<<2)|3,{54,97,99}}, +/* 28773 */ {(16<<2)|3,{54,97,101}}, +/* 28774 */ {(16<<2)|3,{54,97,105}}, +/* 28775 */ {(16<<2)|3,{54,97,111}}, +/* 28776 */ {(16<<2)|3,{54,97,115}}, +/* 28777 */ {(16<<2)|3,{54,97,116}}, +/* 28778 */ {(11<<2)|2,{54,97,0}}, +/* 28779 */ {(11<<2)|2,{54,97,0}}, +/* 28780 */ {(11<<2)|2,{54,97,0}}, +/* 28781 */ {(11<<2)|2,{54,97,0}}, +/* 28782 */ {(11<<2)|2,{54,97,0}}, +/* 28783 */ {(11<<2)|2,{54,97,0}}, +/* 28784 */ {(11<<2)|2,{54,97,0}}, +/* 28785 */ {(11<<2)|2,{54,97,0}}, +/* 28786 */ {(11<<2)|2,{54,97,0}}, +/* 28787 */ {(11<<2)|2,{54,97,0}}, +/* 28788 */ {(11<<2)|2,{54,97,0}}, +/* 28789 */ {(11<<2)|2,{54,97,0}}, +/* 28790 */ {(11<<2)|2,{54,97,0}}, +/* 28791 */ {(11<<2)|2,{54,97,0}}, +/* 28792 */ {(11<<2)|2,{54,97,0}}, +/* 28793 */ {(11<<2)|2,{54,97,0}}, +/* 28794 */ {(11<<2)|2,{54,97,0}}, +/* 28795 */ {(11<<2)|2,{54,97,0}}, +/* 28796 */ {(11<<2)|2,{54,97,0}}, +/* 28797 */ {(11<<2)|2,{54,97,0}}, +/* 28798 */ {(11<<2)|2,{54,97,0}}, +/* 28799 */ {(11<<2)|2,{54,97,0}}, +/* 28800 */ {(16<<2)|3,{54,99,48}}, +/* 28801 */ {(16<<2)|3,{54,99,49}}, +/* 28802 */ {(16<<2)|3,{54,99,50}}, +/* 28803 */ {(16<<2)|3,{54,99,97}}, +/* 28804 */ {(16<<2)|3,{54,99,99}}, +/* 28805 */ {(16<<2)|3,{54,99,101}}, +/* 28806 */ {(16<<2)|3,{54,99,105}}, +/* 28807 */ {(16<<2)|3,{54,99,111}}, +/* 28808 */ {(16<<2)|3,{54,99,115}}, +/* 28809 */ {(16<<2)|3,{54,99,116}}, +/* 28810 */ {(11<<2)|2,{54,99,0}}, +/* 28811 */ {(11<<2)|2,{54,99,0}}, +/* 28812 */ {(11<<2)|2,{54,99,0}}, +/* 28813 */ {(11<<2)|2,{54,99,0}}, +/* 28814 */ {(11<<2)|2,{54,99,0}}, +/* 28815 */ {(11<<2)|2,{54,99,0}}, +/* 28816 */ {(11<<2)|2,{54,99,0}}, +/* 28817 */ {(11<<2)|2,{54,99,0}}, +/* 28818 */ {(11<<2)|2,{54,99,0}}, +/* 28819 */ {(11<<2)|2,{54,99,0}}, +/* 28820 */ {(11<<2)|2,{54,99,0}}, +/* 28821 */ {(11<<2)|2,{54,99,0}}, +/* 28822 */ {(11<<2)|2,{54,99,0}}, +/* 28823 */ {(11<<2)|2,{54,99,0}}, +/* 28824 */ {(11<<2)|2,{54,99,0}}, +/* 28825 */ {(11<<2)|2,{54,99,0}}, +/* 28826 */ {(11<<2)|2,{54,99,0}}, +/* 28827 */ {(11<<2)|2,{54,99,0}}, +/* 28828 */ {(11<<2)|2,{54,99,0}}, +/* 28829 */ {(11<<2)|2,{54,99,0}}, +/* 28830 */ {(11<<2)|2,{54,99,0}}, +/* 28831 */ {(11<<2)|2,{54,99,0}}, +/* 28832 */ {(16<<2)|3,{54,101,48}}, +/* 28833 */ {(16<<2)|3,{54,101,49}}, +/* 28834 */ {(16<<2)|3,{54,101,50}}, +/* 28835 */ {(16<<2)|3,{54,101,97}}, +/* 28836 */ {(16<<2)|3,{54,101,99}}, +/* 28837 */ {(16<<2)|3,{54,101,101}}, +/* 28838 */ {(16<<2)|3,{54,101,105}}, +/* 28839 */ {(16<<2)|3,{54,101,111}}, +/* 28840 */ {(16<<2)|3,{54,101,115}}, +/* 28841 */ {(16<<2)|3,{54,101,116}}, +/* 28842 */ {(11<<2)|2,{54,101,0}}, +/* 28843 */ {(11<<2)|2,{54,101,0}}, +/* 28844 */ {(11<<2)|2,{54,101,0}}, +/* 28845 */ {(11<<2)|2,{54,101,0}}, +/* 28846 */ {(11<<2)|2,{54,101,0}}, +/* 28847 */ {(11<<2)|2,{54,101,0}}, +/* 28848 */ {(11<<2)|2,{54,101,0}}, +/* 28849 */ {(11<<2)|2,{54,101,0}}, +/* 28850 */ {(11<<2)|2,{54,101,0}}, +/* 28851 */ {(11<<2)|2,{54,101,0}}, +/* 28852 */ {(11<<2)|2,{54,101,0}}, +/* 28853 */ {(11<<2)|2,{54,101,0}}, +/* 28854 */ {(11<<2)|2,{54,101,0}}, +/* 28855 */ {(11<<2)|2,{54,101,0}}, +/* 28856 */ {(11<<2)|2,{54,101,0}}, +/* 28857 */ {(11<<2)|2,{54,101,0}}, +/* 28858 */ {(11<<2)|2,{54,101,0}}, +/* 28859 */ {(11<<2)|2,{54,101,0}}, +/* 28860 */ {(11<<2)|2,{54,101,0}}, +/* 28861 */ {(11<<2)|2,{54,101,0}}, +/* 28862 */ {(11<<2)|2,{54,101,0}}, +/* 28863 */ {(11<<2)|2,{54,101,0}}, +/* 28864 */ {(16<<2)|3,{54,105,48}}, +/* 28865 */ {(16<<2)|3,{54,105,49}}, +/* 28866 */ {(16<<2)|3,{54,105,50}}, +/* 28867 */ {(16<<2)|3,{54,105,97}}, +/* 28868 */ {(16<<2)|3,{54,105,99}}, +/* 28869 */ {(16<<2)|3,{54,105,101}}, +/* 28870 */ {(16<<2)|3,{54,105,105}}, +/* 28871 */ {(16<<2)|3,{54,105,111}}, +/* 28872 */ {(16<<2)|3,{54,105,115}}, +/* 28873 */ {(16<<2)|3,{54,105,116}}, +/* 28874 */ {(11<<2)|2,{54,105,0}}, +/* 28875 */ {(11<<2)|2,{54,105,0}}, +/* 28876 */ {(11<<2)|2,{54,105,0}}, +/* 28877 */ {(11<<2)|2,{54,105,0}}, +/* 28878 */ {(11<<2)|2,{54,105,0}}, +/* 28879 */ {(11<<2)|2,{54,105,0}}, +/* 28880 */ {(11<<2)|2,{54,105,0}}, +/* 28881 */ {(11<<2)|2,{54,105,0}}, +/* 28882 */ {(11<<2)|2,{54,105,0}}, +/* 28883 */ {(11<<2)|2,{54,105,0}}, +/* 28884 */ {(11<<2)|2,{54,105,0}}, +/* 28885 */ {(11<<2)|2,{54,105,0}}, +/* 28886 */ {(11<<2)|2,{54,105,0}}, +/* 28887 */ {(11<<2)|2,{54,105,0}}, +/* 28888 */ {(11<<2)|2,{54,105,0}}, +/* 28889 */ {(11<<2)|2,{54,105,0}}, +/* 28890 */ {(11<<2)|2,{54,105,0}}, +/* 28891 */ {(11<<2)|2,{54,105,0}}, +/* 28892 */ {(11<<2)|2,{54,105,0}}, +/* 28893 */ {(11<<2)|2,{54,105,0}}, +/* 28894 */ {(11<<2)|2,{54,105,0}}, +/* 28895 */ {(11<<2)|2,{54,105,0}}, +/* 28896 */ {(16<<2)|3,{54,111,48}}, +/* 28897 */ {(16<<2)|3,{54,111,49}}, +/* 28898 */ {(16<<2)|3,{54,111,50}}, +/* 28899 */ {(16<<2)|3,{54,111,97}}, +/* 28900 */ {(16<<2)|3,{54,111,99}}, +/* 28901 */ {(16<<2)|3,{54,111,101}}, +/* 28902 */ {(16<<2)|3,{54,111,105}}, +/* 28903 */ {(16<<2)|3,{54,111,111}}, +/* 28904 */ {(16<<2)|3,{54,111,115}}, +/* 28905 */ {(16<<2)|3,{54,111,116}}, +/* 28906 */ {(11<<2)|2,{54,111,0}}, +/* 28907 */ {(11<<2)|2,{54,111,0}}, +/* 28908 */ {(11<<2)|2,{54,111,0}}, +/* 28909 */ {(11<<2)|2,{54,111,0}}, +/* 28910 */ {(11<<2)|2,{54,111,0}}, +/* 28911 */ {(11<<2)|2,{54,111,0}}, +/* 28912 */ {(11<<2)|2,{54,111,0}}, +/* 28913 */ {(11<<2)|2,{54,111,0}}, +/* 28914 */ {(11<<2)|2,{54,111,0}}, +/* 28915 */ {(11<<2)|2,{54,111,0}}, +/* 28916 */ {(11<<2)|2,{54,111,0}}, +/* 28917 */ {(11<<2)|2,{54,111,0}}, +/* 28918 */ {(11<<2)|2,{54,111,0}}, +/* 28919 */ {(11<<2)|2,{54,111,0}}, +/* 28920 */ {(11<<2)|2,{54,111,0}}, +/* 28921 */ {(11<<2)|2,{54,111,0}}, +/* 28922 */ {(11<<2)|2,{54,111,0}}, +/* 28923 */ {(11<<2)|2,{54,111,0}}, +/* 28924 */ {(11<<2)|2,{54,111,0}}, +/* 28925 */ {(11<<2)|2,{54,111,0}}, +/* 28926 */ {(11<<2)|2,{54,111,0}}, +/* 28927 */ {(11<<2)|2,{54,111,0}}, +/* 28928 */ {(16<<2)|3,{54,115,48}}, +/* 28929 */ {(16<<2)|3,{54,115,49}}, +/* 28930 */ {(16<<2)|3,{54,115,50}}, +/* 28931 */ {(16<<2)|3,{54,115,97}}, +/* 28932 */ {(16<<2)|3,{54,115,99}}, +/* 28933 */ {(16<<2)|3,{54,115,101}}, +/* 28934 */ {(16<<2)|3,{54,115,105}}, +/* 28935 */ {(16<<2)|3,{54,115,111}}, +/* 28936 */ {(16<<2)|3,{54,115,115}}, +/* 28937 */ {(16<<2)|3,{54,115,116}}, +/* 28938 */ {(11<<2)|2,{54,115,0}}, +/* 28939 */ {(11<<2)|2,{54,115,0}}, +/* 28940 */ {(11<<2)|2,{54,115,0}}, +/* 28941 */ {(11<<2)|2,{54,115,0}}, +/* 28942 */ {(11<<2)|2,{54,115,0}}, +/* 28943 */ {(11<<2)|2,{54,115,0}}, +/* 28944 */ {(11<<2)|2,{54,115,0}}, +/* 28945 */ {(11<<2)|2,{54,115,0}}, +/* 28946 */ {(11<<2)|2,{54,115,0}}, +/* 28947 */ {(11<<2)|2,{54,115,0}}, +/* 28948 */ {(11<<2)|2,{54,115,0}}, +/* 28949 */ {(11<<2)|2,{54,115,0}}, +/* 28950 */ {(11<<2)|2,{54,115,0}}, +/* 28951 */ {(11<<2)|2,{54,115,0}}, +/* 28952 */ {(11<<2)|2,{54,115,0}}, +/* 28953 */ {(11<<2)|2,{54,115,0}}, +/* 28954 */ {(11<<2)|2,{54,115,0}}, +/* 28955 */ {(11<<2)|2,{54,115,0}}, +/* 28956 */ {(11<<2)|2,{54,115,0}}, +/* 28957 */ {(11<<2)|2,{54,115,0}}, +/* 28958 */ {(11<<2)|2,{54,115,0}}, +/* 28959 */ {(11<<2)|2,{54,115,0}}, +/* 28960 */ {(16<<2)|3,{54,116,48}}, +/* 28961 */ {(16<<2)|3,{54,116,49}}, +/* 28962 */ {(16<<2)|3,{54,116,50}}, +/* 28963 */ {(16<<2)|3,{54,116,97}}, +/* 28964 */ {(16<<2)|3,{54,116,99}}, +/* 28965 */ {(16<<2)|3,{54,116,101}}, +/* 28966 */ {(16<<2)|3,{54,116,105}}, +/* 28967 */ {(16<<2)|3,{54,116,111}}, +/* 28968 */ {(16<<2)|3,{54,116,115}}, +/* 28969 */ {(16<<2)|3,{54,116,116}}, +/* 28970 */ {(11<<2)|2,{54,116,0}}, +/* 28971 */ {(11<<2)|2,{54,116,0}}, +/* 28972 */ {(11<<2)|2,{54,116,0}}, +/* 28973 */ {(11<<2)|2,{54,116,0}}, +/* 28974 */ {(11<<2)|2,{54,116,0}}, +/* 28975 */ {(11<<2)|2,{54,116,0}}, +/* 28976 */ {(11<<2)|2,{54,116,0}}, +/* 28977 */ {(11<<2)|2,{54,116,0}}, +/* 28978 */ {(11<<2)|2,{54,116,0}}, +/* 28979 */ {(11<<2)|2,{54,116,0}}, +/* 28980 */ {(11<<2)|2,{54,116,0}}, +/* 28981 */ {(11<<2)|2,{54,116,0}}, +/* 28982 */ {(11<<2)|2,{54,116,0}}, +/* 28983 */ {(11<<2)|2,{54,116,0}}, +/* 28984 */ {(11<<2)|2,{54,116,0}}, +/* 28985 */ {(11<<2)|2,{54,116,0}}, +/* 28986 */ {(11<<2)|2,{54,116,0}}, +/* 28987 */ {(11<<2)|2,{54,116,0}}, +/* 28988 */ {(11<<2)|2,{54,116,0}}, +/* 28989 */ {(11<<2)|2,{54,116,0}}, +/* 28990 */ {(11<<2)|2,{54,116,0}}, +/* 28991 */ {(11<<2)|2,{54,116,0}}, +/* 28992 */ {(12<<2)|2,{54,32,0}}, +/* 28993 */ {(12<<2)|2,{54,32,0}}, +/* 28994 */ {(12<<2)|2,{54,32,0}}, +/* 28995 */ {(12<<2)|2,{54,32,0}}, +/* 28996 */ {(12<<2)|2,{54,32,0}}, +/* 28997 */ {(12<<2)|2,{54,32,0}}, +/* 28998 */ {(12<<2)|2,{54,32,0}}, +/* 28999 */ {(12<<2)|2,{54,32,0}}, +/* 29000 */ {(12<<2)|2,{54,32,0}}, +/* 29001 */ {(12<<2)|2,{54,32,0}}, +/* 29002 */ {(12<<2)|2,{54,32,0}}, +/* 29003 */ {(12<<2)|2,{54,32,0}}, +/* 29004 */ {(12<<2)|2,{54,32,0}}, +/* 29005 */ {(12<<2)|2,{54,32,0}}, +/* 29006 */ {(12<<2)|2,{54,32,0}}, +/* 29007 */ {(12<<2)|2,{54,32,0}}, +/* 29008 */ {(12<<2)|2,{54,37,0}}, +/* 29009 */ {(12<<2)|2,{54,37,0}}, +/* 29010 */ {(12<<2)|2,{54,37,0}}, +/* 29011 */ {(12<<2)|2,{54,37,0}}, +/* 29012 */ {(12<<2)|2,{54,37,0}}, +/* 29013 */ {(12<<2)|2,{54,37,0}}, +/* 29014 */ {(12<<2)|2,{54,37,0}}, +/* 29015 */ {(12<<2)|2,{54,37,0}}, +/* 29016 */ {(12<<2)|2,{54,37,0}}, +/* 29017 */ {(12<<2)|2,{54,37,0}}, +/* 29018 */ {(12<<2)|2,{54,37,0}}, +/* 29019 */ {(12<<2)|2,{54,37,0}}, +/* 29020 */ {(12<<2)|2,{54,37,0}}, +/* 29021 */ {(12<<2)|2,{54,37,0}}, +/* 29022 */ {(12<<2)|2,{54,37,0}}, +/* 29023 */ {(12<<2)|2,{54,37,0}}, +/* 29024 */ {(12<<2)|2,{54,45,0}}, +/* 29025 */ {(12<<2)|2,{54,45,0}}, +/* 29026 */ {(12<<2)|2,{54,45,0}}, +/* 29027 */ {(12<<2)|2,{54,45,0}}, +/* 29028 */ {(12<<2)|2,{54,45,0}}, +/* 29029 */ {(12<<2)|2,{54,45,0}}, +/* 29030 */ {(12<<2)|2,{54,45,0}}, +/* 29031 */ {(12<<2)|2,{54,45,0}}, +/* 29032 */ {(12<<2)|2,{54,45,0}}, +/* 29033 */ {(12<<2)|2,{54,45,0}}, +/* 29034 */ {(12<<2)|2,{54,45,0}}, +/* 29035 */ {(12<<2)|2,{54,45,0}}, +/* 29036 */ {(12<<2)|2,{54,45,0}}, +/* 29037 */ {(12<<2)|2,{54,45,0}}, +/* 29038 */ {(12<<2)|2,{54,45,0}}, +/* 29039 */ {(12<<2)|2,{54,45,0}}, +/* 29040 */ {(12<<2)|2,{54,46,0}}, +/* 29041 */ {(12<<2)|2,{54,46,0}}, +/* 29042 */ {(12<<2)|2,{54,46,0}}, +/* 29043 */ {(12<<2)|2,{54,46,0}}, +/* 29044 */ {(12<<2)|2,{54,46,0}}, +/* 29045 */ {(12<<2)|2,{54,46,0}}, +/* 29046 */ {(12<<2)|2,{54,46,0}}, +/* 29047 */ {(12<<2)|2,{54,46,0}}, +/* 29048 */ {(12<<2)|2,{54,46,0}}, +/* 29049 */ {(12<<2)|2,{54,46,0}}, +/* 29050 */ {(12<<2)|2,{54,46,0}}, +/* 29051 */ {(12<<2)|2,{54,46,0}}, +/* 29052 */ {(12<<2)|2,{54,46,0}}, +/* 29053 */ {(12<<2)|2,{54,46,0}}, +/* 29054 */ {(12<<2)|2,{54,46,0}}, +/* 29055 */ {(12<<2)|2,{54,46,0}}, +/* 29056 */ {(12<<2)|2,{54,47,0}}, +/* 29057 */ {(12<<2)|2,{54,47,0}}, +/* 29058 */ {(12<<2)|2,{54,47,0}}, +/* 29059 */ {(12<<2)|2,{54,47,0}}, +/* 29060 */ {(12<<2)|2,{54,47,0}}, +/* 29061 */ {(12<<2)|2,{54,47,0}}, +/* 29062 */ {(12<<2)|2,{54,47,0}}, +/* 29063 */ {(12<<2)|2,{54,47,0}}, +/* 29064 */ {(12<<2)|2,{54,47,0}}, +/* 29065 */ {(12<<2)|2,{54,47,0}}, +/* 29066 */ {(12<<2)|2,{54,47,0}}, +/* 29067 */ {(12<<2)|2,{54,47,0}}, +/* 29068 */ {(12<<2)|2,{54,47,0}}, +/* 29069 */ {(12<<2)|2,{54,47,0}}, +/* 29070 */ {(12<<2)|2,{54,47,0}}, +/* 29071 */ {(12<<2)|2,{54,47,0}}, +/* 29072 */ {(12<<2)|2,{54,51,0}}, +/* 29073 */ {(12<<2)|2,{54,51,0}}, +/* 29074 */ {(12<<2)|2,{54,51,0}}, +/* 29075 */ {(12<<2)|2,{54,51,0}}, +/* 29076 */ {(12<<2)|2,{54,51,0}}, +/* 29077 */ {(12<<2)|2,{54,51,0}}, +/* 29078 */ {(12<<2)|2,{54,51,0}}, +/* 29079 */ {(12<<2)|2,{54,51,0}}, +/* 29080 */ {(12<<2)|2,{54,51,0}}, +/* 29081 */ {(12<<2)|2,{54,51,0}}, +/* 29082 */ {(12<<2)|2,{54,51,0}}, +/* 29083 */ {(12<<2)|2,{54,51,0}}, +/* 29084 */ {(12<<2)|2,{54,51,0}}, +/* 29085 */ {(12<<2)|2,{54,51,0}}, +/* 29086 */ {(12<<2)|2,{54,51,0}}, +/* 29087 */ {(12<<2)|2,{54,51,0}}, +/* 29088 */ {(12<<2)|2,{54,52,0}}, +/* 29089 */ {(12<<2)|2,{54,52,0}}, +/* 29090 */ {(12<<2)|2,{54,52,0}}, +/* 29091 */ {(12<<2)|2,{54,52,0}}, +/* 29092 */ {(12<<2)|2,{54,52,0}}, +/* 29093 */ {(12<<2)|2,{54,52,0}}, +/* 29094 */ {(12<<2)|2,{54,52,0}}, +/* 29095 */ {(12<<2)|2,{54,52,0}}, +/* 29096 */ {(12<<2)|2,{54,52,0}}, +/* 29097 */ {(12<<2)|2,{54,52,0}}, +/* 29098 */ {(12<<2)|2,{54,52,0}}, +/* 29099 */ {(12<<2)|2,{54,52,0}}, +/* 29100 */ {(12<<2)|2,{54,52,0}}, +/* 29101 */ {(12<<2)|2,{54,52,0}}, +/* 29102 */ {(12<<2)|2,{54,52,0}}, +/* 29103 */ {(12<<2)|2,{54,52,0}}, +/* 29104 */ {(12<<2)|2,{54,53,0}}, +/* 29105 */ {(12<<2)|2,{54,53,0}}, +/* 29106 */ {(12<<2)|2,{54,53,0}}, +/* 29107 */ {(12<<2)|2,{54,53,0}}, +/* 29108 */ {(12<<2)|2,{54,53,0}}, +/* 29109 */ {(12<<2)|2,{54,53,0}}, +/* 29110 */ {(12<<2)|2,{54,53,0}}, +/* 29111 */ {(12<<2)|2,{54,53,0}}, +/* 29112 */ {(12<<2)|2,{54,53,0}}, +/* 29113 */ {(12<<2)|2,{54,53,0}}, +/* 29114 */ {(12<<2)|2,{54,53,0}}, +/* 29115 */ {(12<<2)|2,{54,53,0}}, +/* 29116 */ {(12<<2)|2,{54,53,0}}, +/* 29117 */ {(12<<2)|2,{54,53,0}}, +/* 29118 */ {(12<<2)|2,{54,53,0}}, +/* 29119 */ {(12<<2)|2,{54,53,0}}, +/* 29120 */ {(12<<2)|2,{54,54,0}}, +/* 29121 */ {(12<<2)|2,{54,54,0}}, +/* 29122 */ {(12<<2)|2,{54,54,0}}, +/* 29123 */ {(12<<2)|2,{54,54,0}}, +/* 29124 */ {(12<<2)|2,{54,54,0}}, +/* 29125 */ {(12<<2)|2,{54,54,0}}, +/* 29126 */ {(12<<2)|2,{54,54,0}}, +/* 29127 */ {(12<<2)|2,{54,54,0}}, +/* 29128 */ {(12<<2)|2,{54,54,0}}, +/* 29129 */ {(12<<2)|2,{54,54,0}}, +/* 29130 */ {(12<<2)|2,{54,54,0}}, +/* 29131 */ {(12<<2)|2,{54,54,0}}, +/* 29132 */ {(12<<2)|2,{54,54,0}}, +/* 29133 */ {(12<<2)|2,{54,54,0}}, +/* 29134 */ {(12<<2)|2,{54,54,0}}, +/* 29135 */ {(12<<2)|2,{54,54,0}}, +/* 29136 */ {(12<<2)|2,{54,55,0}}, +/* 29137 */ {(12<<2)|2,{54,55,0}}, +/* 29138 */ {(12<<2)|2,{54,55,0}}, +/* 29139 */ {(12<<2)|2,{54,55,0}}, +/* 29140 */ {(12<<2)|2,{54,55,0}}, +/* 29141 */ {(12<<2)|2,{54,55,0}}, +/* 29142 */ {(12<<2)|2,{54,55,0}}, +/* 29143 */ {(12<<2)|2,{54,55,0}}, +/* 29144 */ {(12<<2)|2,{54,55,0}}, +/* 29145 */ {(12<<2)|2,{54,55,0}}, +/* 29146 */ {(12<<2)|2,{54,55,0}}, +/* 29147 */ {(12<<2)|2,{54,55,0}}, +/* 29148 */ {(12<<2)|2,{54,55,0}}, +/* 29149 */ {(12<<2)|2,{54,55,0}}, +/* 29150 */ {(12<<2)|2,{54,55,0}}, +/* 29151 */ {(12<<2)|2,{54,55,0}}, +/* 29152 */ {(12<<2)|2,{54,56,0}}, +/* 29153 */ {(12<<2)|2,{54,56,0}}, +/* 29154 */ {(12<<2)|2,{54,56,0}}, +/* 29155 */ {(12<<2)|2,{54,56,0}}, +/* 29156 */ {(12<<2)|2,{54,56,0}}, +/* 29157 */ {(12<<2)|2,{54,56,0}}, +/* 29158 */ {(12<<2)|2,{54,56,0}}, +/* 29159 */ {(12<<2)|2,{54,56,0}}, +/* 29160 */ {(12<<2)|2,{54,56,0}}, +/* 29161 */ {(12<<2)|2,{54,56,0}}, +/* 29162 */ {(12<<2)|2,{54,56,0}}, +/* 29163 */ {(12<<2)|2,{54,56,0}}, +/* 29164 */ {(12<<2)|2,{54,56,0}}, +/* 29165 */ {(12<<2)|2,{54,56,0}}, +/* 29166 */ {(12<<2)|2,{54,56,0}}, +/* 29167 */ {(12<<2)|2,{54,56,0}}, +/* 29168 */ {(12<<2)|2,{54,57,0}}, +/* 29169 */ {(12<<2)|2,{54,57,0}}, +/* 29170 */ {(12<<2)|2,{54,57,0}}, +/* 29171 */ {(12<<2)|2,{54,57,0}}, +/* 29172 */ {(12<<2)|2,{54,57,0}}, +/* 29173 */ {(12<<2)|2,{54,57,0}}, +/* 29174 */ {(12<<2)|2,{54,57,0}}, +/* 29175 */ {(12<<2)|2,{54,57,0}}, +/* 29176 */ {(12<<2)|2,{54,57,0}}, +/* 29177 */ {(12<<2)|2,{54,57,0}}, +/* 29178 */ {(12<<2)|2,{54,57,0}}, +/* 29179 */ {(12<<2)|2,{54,57,0}}, +/* 29180 */ {(12<<2)|2,{54,57,0}}, +/* 29181 */ {(12<<2)|2,{54,57,0}}, +/* 29182 */ {(12<<2)|2,{54,57,0}}, +/* 29183 */ {(12<<2)|2,{54,57,0}}, +/* 29184 */ {(12<<2)|2,{54,61,0}}, +/* 29185 */ {(12<<2)|2,{54,61,0}}, +/* 29186 */ {(12<<2)|2,{54,61,0}}, +/* 29187 */ {(12<<2)|2,{54,61,0}}, +/* 29188 */ {(12<<2)|2,{54,61,0}}, +/* 29189 */ {(12<<2)|2,{54,61,0}}, +/* 29190 */ {(12<<2)|2,{54,61,0}}, +/* 29191 */ {(12<<2)|2,{54,61,0}}, +/* 29192 */ {(12<<2)|2,{54,61,0}}, +/* 29193 */ {(12<<2)|2,{54,61,0}}, +/* 29194 */ {(12<<2)|2,{54,61,0}}, +/* 29195 */ {(12<<2)|2,{54,61,0}}, +/* 29196 */ {(12<<2)|2,{54,61,0}}, +/* 29197 */ {(12<<2)|2,{54,61,0}}, +/* 29198 */ {(12<<2)|2,{54,61,0}}, +/* 29199 */ {(12<<2)|2,{54,61,0}}, +/* 29200 */ {(12<<2)|2,{54,65,0}}, +/* 29201 */ {(12<<2)|2,{54,65,0}}, +/* 29202 */ {(12<<2)|2,{54,65,0}}, +/* 29203 */ {(12<<2)|2,{54,65,0}}, +/* 29204 */ {(12<<2)|2,{54,65,0}}, +/* 29205 */ {(12<<2)|2,{54,65,0}}, +/* 29206 */ {(12<<2)|2,{54,65,0}}, +/* 29207 */ {(12<<2)|2,{54,65,0}}, +/* 29208 */ {(12<<2)|2,{54,65,0}}, +/* 29209 */ {(12<<2)|2,{54,65,0}}, +/* 29210 */ {(12<<2)|2,{54,65,0}}, +/* 29211 */ {(12<<2)|2,{54,65,0}}, +/* 29212 */ {(12<<2)|2,{54,65,0}}, +/* 29213 */ {(12<<2)|2,{54,65,0}}, +/* 29214 */ {(12<<2)|2,{54,65,0}}, +/* 29215 */ {(12<<2)|2,{54,65,0}}, +/* 29216 */ {(12<<2)|2,{54,95,0}}, +/* 29217 */ {(12<<2)|2,{54,95,0}}, +/* 29218 */ {(12<<2)|2,{54,95,0}}, +/* 29219 */ {(12<<2)|2,{54,95,0}}, +/* 29220 */ {(12<<2)|2,{54,95,0}}, +/* 29221 */ {(12<<2)|2,{54,95,0}}, +/* 29222 */ {(12<<2)|2,{54,95,0}}, +/* 29223 */ {(12<<2)|2,{54,95,0}}, +/* 29224 */ {(12<<2)|2,{54,95,0}}, +/* 29225 */ {(12<<2)|2,{54,95,0}}, +/* 29226 */ {(12<<2)|2,{54,95,0}}, +/* 29227 */ {(12<<2)|2,{54,95,0}}, +/* 29228 */ {(12<<2)|2,{54,95,0}}, +/* 29229 */ {(12<<2)|2,{54,95,0}}, +/* 29230 */ {(12<<2)|2,{54,95,0}}, +/* 29231 */ {(12<<2)|2,{54,95,0}}, +/* 29232 */ {(12<<2)|2,{54,98,0}}, +/* 29233 */ {(12<<2)|2,{54,98,0}}, +/* 29234 */ {(12<<2)|2,{54,98,0}}, +/* 29235 */ {(12<<2)|2,{54,98,0}}, +/* 29236 */ {(12<<2)|2,{54,98,0}}, +/* 29237 */ {(12<<2)|2,{54,98,0}}, +/* 29238 */ {(12<<2)|2,{54,98,0}}, +/* 29239 */ {(12<<2)|2,{54,98,0}}, +/* 29240 */ {(12<<2)|2,{54,98,0}}, +/* 29241 */ {(12<<2)|2,{54,98,0}}, +/* 29242 */ {(12<<2)|2,{54,98,0}}, +/* 29243 */ {(12<<2)|2,{54,98,0}}, +/* 29244 */ {(12<<2)|2,{54,98,0}}, +/* 29245 */ {(12<<2)|2,{54,98,0}}, +/* 29246 */ {(12<<2)|2,{54,98,0}}, +/* 29247 */ {(12<<2)|2,{54,98,0}}, +/* 29248 */ {(12<<2)|2,{54,100,0}}, +/* 29249 */ {(12<<2)|2,{54,100,0}}, +/* 29250 */ {(12<<2)|2,{54,100,0}}, +/* 29251 */ {(12<<2)|2,{54,100,0}}, +/* 29252 */ {(12<<2)|2,{54,100,0}}, +/* 29253 */ {(12<<2)|2,{54,100,0}}, +/* 29254 */ {(12<<2)|2,{54,100,0}}, +/* 29255 */ {(12<<2)|2,{54,100,0}}, +/* 29256 */ {(12<<2)|2,{54,100,0}}, +/* 29257 */ {(12<<2)|2,{54,100,0}}, +/* 29258 */ {(12<<2)|2,{54,100,0}}, +/* 29259 */ {(12<<2)|2,{54,100,0}}, +/* 29260 */ {(12<<2)|2,{54,100,0}}, +/* 29261 */ {(12<<2)|2,{54,100,0}}, +/* 29262 */ {(12<<2)|2,{54,100,0}}, +/* 29263 */ {(12<<2)|2,{54,100,0}}, +/* 29264 */ {(12<<2)|2,{54,102,0}}, +/* 29265 */ {(12<<2)|2,{54,102,0}}, +/* 29266 */ {(12<<2)|2,{54,102,0}}, +/* 29267 */ {(12<<2)|2,{54,102,0}}, +/* 29268 */ {(12<<2)|2,{54,102,0}}, +/* 29269 */ {(12<<2)|2,{54,102,0}}, +/* 29270 */ {(12<<2)|2,{54,102,0}}, +/* 29271 */ {(12<<2)|2,{54,102,0}}, +/* 29272 */ {(12<<2)|2,{54,102,0}}, +/* 29273 */ {(12<<2)|2,{54,102,0}}, +/* 29274 */ {(12<<2)|2,{54,102,0}}, +/* 29275 */ {(12<<2)|2,{54,102,0}}, +/* 29276 */ {(12<<2)|2,{54,102,0}}, +/* 29277 */ {(12<<2)|2,{54,102,0}}, +/* 29278 */ {(12<<2)|2,{54,102,0}}, +/* 29279 */ {(12<<2)|2,{54,102,0}}, +/* 29280 */ {(12<<2)|2,{54,103,0}}, +/* 29281 */ {(12<<2)|2,{54,103,0}}, +/* 29282 */ {(12<<2)|2,{54,103,0}}, +/* 29283 */ {(12<<2)|2,{54,103,0}}, +/* 29284 */ {(12<<2)|2,{54,103,0}}, +/* 29285 */ {(12<<2)|2,{54,103,0}}, +/* 29286 */ {(12<<2)|2,{54,103,0}}, +/* 29287 */ {(12<<2)|2,{54,103,0}}, +/* 29288 */ {(12<<2)|2,{54,103,0}}, +/* 29289 */ {(12<<2)|2,{54,103,0}}, +/* 29290 */ {(12<<2)|2,{54,103,0}}, +/* 29291 */ {(12<<2)|2,{54,103,0}}, +/* 29292 */ {(12<<2)|2,{54,103,0}}, +/* 29293 */ {(12<<2)|2,{54,103,0}}, +/* 29294 */ {(12<<2)|2,{54,103,0}}, +/* 29295 */ {(12<<2)|2,{54,103,0}}, +/* 29296 */ {(12<<2)|2,{54,104,0}}, +/* 29297 */ {(12<<2)|2,{54,104,0}}, +/* 29298 */ {(12<<2)|2,{54,104,0}}, +/* 29299 */ {(12<<2)|2,{54,104,0}}, +/* 29300 */ {(12<<2)|2,{54,104,0}}, +/* 29301 */ {(12<<2)|2,{54,104,0}}, +/* 29302 */ {(12<<2)|2,{54,104,0}}, +/* 29303 */ {(12<<2)|2,{54,104,0}}, +/* 29304 */ {(12<<2)|2,{54,104,0}}, +/* 29305 */ {(12<<2)|2,{54,104,0}}, +/* 29306 */ {(12<<2)|2,{54,104,0}}, +/* 29307 */ {(12<<2)|2,{54,104,0}}, +/* 29308 */ {(12<<2)|2,{54,104,0}}, +/* 29309 */ {(12<<2)|2,{54,104,0}}, +/* 29310 */ {(12<<2)|2,{54,104,0}}, +/* 29311 */ {(12<<2)|2,{54,104,0}}, +/* 29312 */ {(12<<2)|2,{54,108,0}}, +/* 29313 */ {(12<<2)|2,{54,108,0}}, +/* 29314 */ {(12<<2)|2,{54,108,0}}, +/* 29315 */ {(12<<2)|2,{54,108,0}}, +/* 29316 */ {(12<<2)|2,{54,108,0}}, +/* 29317 */ {(12<<2)|2,{54,108,0}}, +/* 29318 */ {(12<<2)|2,{54,108,0}}, +/* 29319 */ {(12<<2)|2,{54,108,0}}, +/* 29320 */ {(12<<2)|2,{54,108,0}}, +/* 29321 */ {(12<<2)|2,{54,108,0}}, +/* 29322 */ {(12<<2)|2,{54,108,0}}, +/* 29323 */ {(12<<2)|2,{54,108,0}}, +/* 29324 */ {(12<<2)|2,{54,108,0}}, +/* 29325 */ {(12<<2)|2,{54,108,0}}, +/* 29326 */ {(12<<2)|2,{54,108,0}}, +/* 29327 */ {(12<<2)|2,{54,108,0}}, +/* 29328 */ {(12<<2)|2,{54,109,0}}, +/* 29329 */ {(12<<2)|2,{54,109,0}}, +/* 29330 */ {(12<<2)|2,{54,109,0}}, +/* 29331 */ {(12<<2)|2,{54,109,0}}, +/* 29332 */ {(12<<2)|2,{54,109,0}}, +/* 29333 */ {(12<<2)|2,{54,109,0}}, +/* 29334 */ {(12<<2)|2,{54,109,0}}, +/* 29335 */ {(12<<2)|2,{54,109,0}}, +/* 29336 */ {(12<<2)|2,{54,109,0}}, +/* 29337 */ {(12<<2)|2,{54,109,0}}, +/* 29338 */ {(12<<2)|2,{54,109,0}}, +/* 29339 */ {(12<<2)|2,{54,109,0}}, +/* 29340 */ {(12<<2)|2,{54,109,0}}, +/* 29341 */ {(12<<2)|2,{54,109,0}}, +/* 29342 */ {(12<<2)|2,{54,109,0}}, +/* 29343 */ {(12<<2)|2,{54,109,0}}, +/* 29344 */ {(12<<2)|2,{54,110,0}}, +/* 29345 */ {(12<<2)|2,{54,110,0}}, +/* 29346 */ {(12<<2)|2,{54,110,0}}, +/* 29347 */ {(12<<2)|2,{54,110,0}}, +/* 29348 */ {(12<<2)|2,{54,110,0}}, +/* 29349 */ {(12<<2)|2,{54,110,0}}, +/* 29350 */ {(12<<2)|2,{54,110,0}}, +/* 29351 */ {(12<<2)|2,{54,110,0}}, +/* 29352 */ {(12<<2)|2,{54,110,0}}, +/* 29353 */ {(12<<2)|2,{54,110,0}}, +/* 29354 */ {(12<<2)|2,{54,110,0}}, +/* 29355 */ {(12<<2)|2,{54,110,0}}, +/* 29356 */ {(12<<2)|2,{54,110,0}}, +/* 29357 */ {(12<<2)|2,{54,110,0}}, +/* 29358 */ {(12<<2)|2,{54,110,0}}, +/* 29359 */ {(12<<2)|2,{54,110,0}}, +/* 29360 */ {(12<<2)|2,{54,112,0}}, +/* 29361 */ {(12<<2)|2,{54,112,0}}, +/* 29362 */ {(12<<2)|2,{54,112,0}}, +/* 29363 */ {(12<<2)|2,{54,112,0}}, +/* 29364 */ {(12<<2)|2,{54,112,0}}, +/* 29365 */ {(12<<2)|2,{54,112,0}}, +/* 29366 */ {(12<<2)|2,{54,112,0}}, +/* 29367 */ {(12<<2)|2,{54,112,0}}, +/* 29368 */ {(12<<2)|2,{54,112,0}}, +/* 29369 */ {(12<<2)|2,{54,112,0}}, +/* 29370 */ {(12<<2)|2,{54,112,0}}, +/* 29371 */ {(12<<2)|2,{54,112,0}}, +/* 29372 */ {(12<<2)|2,{54,112,0}}, +/* 29373 */ {(12<<2)|2,{54,112,0}}, +/* 29374 */ {(12<<2)|2,{54,112,0}}, +/* 29375 */ {(12<<2)|2,{54,112,0}}, +/* 29376 */ {(12<<2)|2,{54,114,0}}, +/* 29377 */ {(12<<2)|2,{54,114,0}}, +/* 29378 */ {(12<<2)|2,{54,114,0}}, +/* 29379 */ {(12<<2)|2,{54,114,0}}, +/* 29380 */ {(12<<2)|2,{54,114,0}}, +/* 29381 */ {(12<<2)|2,{54,114,0}}, +/* 29382 */ {(12<<2)|2,{54,114,0}}, +/* 29383 */ {(12<<2)|2,{54,114,0}}, +/* 29384 */ {(12<<2)|2,{54,114,0}}, +/* 29385 */ {(12<<2)|2,{54,114,0}}, +/* 29386 */ {(12<<2)|2,{54,114,0}}, +/* 29387 */ {(12<<2)|2,{54,114,0}}, +/* 29388 */ {(12<<2)|2,{54,114,0}}, +/* 29389 */ {(12<<2)|2,{54,114,0}}, +/* 29390 */ {(12<<2)|2,{54,114,0}}, +/* 29391 */ {(12<<2)|2,{54,114,0}}, +/* 29392 */ {(12<<2)|2,{54,117,0}}, +/* 29393 */ {(12<<2)|2,{54,117,0}}, +/* 29394 */ {(12<<2)|2,{54,117,0}}, +/* 29395 */ {(12<<2)|2,{54,117,0}}, +/* 29396 */ {(12<<2)|2,{54,117,0}}, +/* 29397 */ {(12<<2)|2,{54,117,0}}, +/* 29398 */ {(12<<2)|2,{54,117,0}}, +/* 29399 */ {(12<<2)|2,{54,117,0}}, +/* 29400 */ {(12<<2)|2,{54,117,0}}, +/* 29401 */ {(12<<2)|2,{54,117,0}}, +/* 29402 */ {(12<<2)|2,{54,117,0}}, +/* 29403 */ {(12<<2)|2,{54,117,0}}, +/* 29404 */ {(12<<2)|2,{54,117,0}}, +/* 29405 */ {(12<<2)|2,{54,117,0}}, +/* 29406 */ {(12<<2)|2,{54,117,0}}, +/* 29407 */ {(12<<2)|2,{54,117,0}}, +/* 29408 */ {(13<<2)|2,{54,58,0}}, +/* 29409 */ {(13<<2)|2,{54,58,0}}, +/* 29410 */ {(13<<2)|2,{54,58,0}}, +/* 29411 */ {(13<<2)|2,{54,58,0}}, +/* 29412 */ {(13<<2)|2,{54,58,0}}, +/* 29413 */ {(13<<2)|2,{54,58,0}}, +/* 29414 */ {(13<<2)|2,{54,58,0}}, +/* 29415 */ {(13<<2)|2,{54,58,0}}, +/* 29416 */ {(13<<2)|2,{54,66,0}}, +/* 29417 */ {(13<<2)|2,{54,66,0}}, +/* 29418 */ {(13<<2)|2,{54,66,0}}, +/* 29419 */ {(13<<2)|2,{54,66,0}}, +/* 29420 */ {(13<<2)|2,{54,66,0}}, +/* 29421 */ {(13<<2)|2,{54,66,0}}, +/* 29422 */ {(13<<2)|2,{54,66,0}}, +/* 29423 */ {(13<<2)|2,{54,66,0}}, +/* 29424 */ {(13<<2)|2,{54,67,0}}, +/* 29425 */ {(13<<2)|2,{54,67,0}}, +/* 29426 */ {(13<<2)|2,{54,67,0}}, +/* 29427 */ {(13<<2)|2,{54,67,0}}, +/* 29428 */ {(13<<2)|2,{54,67,0}}, +/* 29429 */ {(13<<2)|2,{54,67,0}}, +/* 29430 */ {(13<<2)|2,{54,67,0}}, +/* 29431 */ {(13<<2)|2,{54,67,0}}, +/* 29432 */ {(13<<2)|2,{54,68,0}}, +/* 29433 */ {(13<<2)|2,{54,68,0}}, +/* 29434 */ {(13<<2)|2,{54,68,0}}, +/* 29435 */ {(13<<2)|2,{54,68,0}}, +/* 29436 */ {(13<<2)|2,{54,68,0}}, +/* 29437 */ {(13<<2)|2,{54,68,0}}, +/* 29438 */ {(13<<2)|2,{54,68,0}}, +/* 29439 */ {(13<<2)|2,{54,68,0}}, +/* 29440 */ {(13<<2)|2,{54,69,0}}, +/* 29441 */ {(13<<2)|2,{54,69,0}}, +/* 29442 */ {(13<<2)|2,{54,69,0}}, +/* 29443 */ {(13<<2)|2,{54,69,0}}, +/* 29444 */ {(13<<2)|2,{54,69,0}}, +/* 29445 */ {(13<<2)|2,{54,69,0}}, +/* 29446 */ {(13<<2)|2,{54,69,0}}, +/* 29447 */ {(13<<2)|2,{54,69,0}}, +/* 29448 */ {(13<<2)|2,{54,70,0}}, +/* 29449 */ {(13<<2)|2,{54,70,0}}, +/* 29450 */ {(13<<2)|2,{54,70,0}}, +/* 29451 */ {(13<<2)|2,{54,70,0}}, +/* 29452 */ {(13<<2)|2,{54,70,0}}, +/* 29453 */ {(13<<2)|2,{54,70,0}}, +/* 29454 */ {(13<<2)|2,{54,70,0}}, +/* 29455 */ {(13<<2)|2,{54,70,0}}, +/* 29456 */ {(13<<2)|2,{54,71,0}}, +/* 29457 */ {(13<<2)|2,{54,71,0}}, +/* 29458 */ {(13<<2)|2,{54,71,0}}, +/* 29459 */ {(13<<2)|2,{54,71,0}}, +/* 29460 */ {(13<<2)|2,{54,71,0}}, +/* 29461 */ {(13<<2)|2,{54,71,0}}, +/* 29462 */ {(13<<2)|2,{54,71,0}}, +/* 29463 */ {(13<<2)|2,{54,71,0}}, +/* 29464 */ {(13<<2)|2,{54,72,0}}, +/* 29465 */ {(13<<2)|2,{54,72,0}}, +/* 29466 */ {(13<<2)|2,{54,72,0}}, +/* 29467 */ {(13<<2)|2,{54,72,0}}, +/* 29468 */ {(13<<2)|2,{54,72,0}}, +/* 29469 */ {(13<<2)|2,{54,72,0}}, +/* 29470 */ {(13<<2)|2,{54,72,0}}, +/* 29471 */ {(13<<2)|2,{54,72,0}}, +/* 29472 */ {(13<<2)|2,{54,73,0}}, +/* 29473 */ {(13<<2)|2,{54,73,0}}, +/* 29474 */ {(13<<2)|2,{54,73,0}}, +/* 29475 */ {(13<<2)|2,{54,73,0}}, +/* 29476 */ {(13<<2)|2,{54,73,0}}, +/* 29477 */ {(13<<2)|2,{54,73,0}}, +/* 29478 */ {(13<<2)|2,{54,73,0}}, +/* 29479 */ {(13<<2)|2,{54,73,0}}, +/* 29480 */ {(13<<2)|2,{54,74,0}}, +/* 29481 */ {(13<<2)|2,{54,74,0}}, +/* 29482 */ {(13<<2)|2,{54,74,0}}, +/* 29483 */ {(13<<2)|2,{54,74,0}}, +/* 29484 */ {(13<<2)|2,{54,74,0}}, +/* 29485 */ {(13<<2)|2,{54,74,0}}, +/* 29486 */ {(13<<2)|2,{54,74,0}}, +/* 29487 */ {(13<<2)|2,{54,74,0}}, +/* 29488 */ {(13<<2)|2,{54,75,0}}, +/* 29489 */ {(13<<2)|2,{54,75,0}}, +/* 29490 */ {(13<<2)|2,{54,75,0}}, +/* 29491 */ {(13<<2)|2,{54,75,0}}, +/* 29492 */ {(13<<2)|2,{54,75,0}}, +/* 29493 */ {(13<<2)|2,{54,75,0}}, +/* 29494 */ {(13<<2)|2,{54,75,0}}, +/* 29495 */ {(13<<2)|2,{54,75,0}}, +/* 29496 */ {(13<<2)|2,{54,76,0}}, +/* 29497 */ {(13<<2)|2,{54,76,0}}, +/* 29498 */ {(13<<2)|2,{54,76,0}}, +/* 29499 */ {(13<<2)|2,{54,76,0}}, +/* 29500 */ {(13<<2)|2,{54,76,0}}, +/* 29501 */ {(13<<2)|2,{54,76,0}}, +/* 29502 */ {(13<<2)|2,{54,76,0}}, +/* 29503 */ {(13<<2)|2,{54,76,0}}, +/* 29504 */ {(13<<2)|2,{54,77,0}}, +/* 29505 */ {(13<<2)|2,{54,77,0}}, +/* 29506 */ {(13<<2)|2,{54,77,0}}, +/* 29507 */ {(13<<2)|2,{54,77,0}}, +/* 29508 */ {(13<<2)|2,{54,77,0}}, +/* 29509 */ {(13<<2)|2,{54,77,0}}, +/* 29510 */ {(13<<2)|2,{54,77,0}}, +/* 29511 */ {(13<<2)|2,{54,77,0}}, +/* 29512 */ {(13<<2)|2,{54,78,0}}, +/* 29513 */ {(13<<2)|2,{54,78,0}}, +/* 29514 */ {(13<<2)|2,{54,78,0}}, +/* 29515 */ {(13<<2)|2,{54,78,0}}, +/* 29516 */ {(13<<2)|2,{54,78,0}}, +/* 29517 */ {(13<<2)|2,{54,78,0}}, +/* 29518 */ {(13<<2)|2,{54,78,0}}, +/* 29519 */ {(13<<2)|2,{54,78,0}}, +/* 29520 */ {(13<<2)|2,{54,79,0}}, +/* 29521 */ {(13<<2)|2,{54,79,0}}, +/* 29522 */ {(13<<2)|2,{54,79,0}}, +/* 29523 */ {(13<<2)|2,{54,79,0}}, +/* 29524 */ {(13<<2)|2,{54,79,0}}, +/* 29525 */ {(13<<2)|2,{54,79,0}}, +/* 29526 */ {(13<<2)|2,{54,79,0}}, +/* 29527 */ {(13<<2)|2,{54,79,0}}, +/* 29528 */ {(13<<2)|2,{54,80,0}}, +/* 29529 */ {(13<<2)|2,{54,80,0}}, +/* 29530 */ {(13<<2)|2,{54,80,0}}, +/* 29531 */ {(13<<2)|2,{54,80,0}}, +/* 29532 */ {(13<<2)|2,{54,80,0}}, +/* 29533 */ {(13<<2)|2,{54,80,0}}, +/* 29534 */ {(13<<2)|2,{54,80,0}}, +/* 29535 */ {(13<<2)|2,{54,80,0}}, +/* 29536 */ {(13<<2)|2,{54,81,0}}, +/* 29537 */ {(13<<2)|2,{54,81,0}}, +/* 29538 */ {(13<<2)|2,{54,81,0}}, +/* 29539 */ {(13<<2)|2,{54,81,0}}, +/* 29540 */ {(13<<2)|2,{54,81,0}}, +/* 29541 */ {(13<<2)|2,{54,81,0}}, +/* 29542 */ {(13<<2)|2,{54,81,0}}, +/* 29543 */ {(13<<2)|2,{54,81,0}}, +/* 29544 */ {(13<<2)|2,{54,82,0}}, +/* 29545 */ {(13<<2)|2,{54,82,0}}, +/* 29546 */ {(13<<2)|2,{54,82,0}}, +/* 29547 */ {(13<<2)|2,{54,82,0}}, +/* 29548 */ {(13<<2)|2,{54,82,0}}, +/* 29549 */ {(13<<2)|2,{54,82,0}}, +/* 29550 */ {(13<<2)|2,{54,82,0}}, +/* 29551 */ {(13<<2)|2,{54,82,0}}, +/* 29552 */ {(13<<2)|2,{54,83,0}}, +/* 29553 */ {(13<<2)|2,{54,83,0}}, +/* 29554 */ {(13<<2)|2,{54,83,0}}, +/* 29555 */ {(13<<2)|2,{54,83,0}}, +/* 29556 */ {(13<<2)|2,{54,83,0}}, +/* 29557 */ {(13<<2)|2,{54,83,0}}, +/* 29558 */ {(13<<2)|2,{54,83,0}}, +/* 29559 */ {(13<<2)|2,{54,83,0}}, +/* 29560 */ {(13<<2)|2,{54,84,0}}, +/* 29561 */ {(13<<2)|2,{54,84,0}}, +/* 29562 */ {(13<<2)|2,{54,84,0}}, +/* 29563 */ {(13<<2)|2,{54,84,0}}, +/* 29564 */ {(13<<2)|2,{54,84,0}}, +/* 29565 */ {(13<<2)|2,{54,84,0}}, +/* 29566 */ {(13<<2)|2,{54,84,0}}, +/* 29567 */ {(13<<2)|2,{54,84,0}}, +/* 29568 */ {(13<<2)|2,{54,85,0}}, +/* 29569 */ {(13<<2)|2,{54,85,0}}, +/* 29570 */ {(13<<2)|2,{54,85,0}}, +/* 29571 */ {(13<<2)|2,{54,85,0}}, +/* 29572 */ {(13<<2)|2,{54,85,0}}, +/* 29573 */ {(13<<2)|2,{54,85,0}}, +/* 29574 */ {(13<<2)|2,{54,85,0}}, +/* 29575 */ {(13<<2)|2,{54,85,0}}, +/* 29576 */ {(13<<2)|2,{54,86,0}}, +/* 29577 */ {(13<<2)|2,{54,86,0}}, +/* 29578 */ {(13<<2)|2,{54,86,0}}, +/* 29579 */ {(13<<2)|2,{54,86,0}}, +/* 29580 */ {(13<<2)|2,{54,86,0}}, +/* 29581 */ {(13<<2)|2,{54,86,0}}, +/* 29582 */ {(13<<2)|2,{54,86,0}}, +/* 29583 */ {(13<<2)|2,{54,86,0}}, +/* 29584 */ {(13<<2)|2,{54,87,0}}, +/* 29585 */ {(13<<2)|2,{54,87,0}}, +/* 29586 */ {(13<<2)|2,{54,87,0}}, +/* 29587 */ {(13<<2)|2,{54,87,0}}, +/* 29588 */ {(13<<2)|2,{54,87,0}}, +/* 29589 */ {(13<<2)|2,{54,87,0}}, +/* 29590 */ {(13<<2)|2,{54,87,0}}, +/* 29591 */ {(13<<2)|2,{54,87,0}}, +/* 29592 */ {(13<<2)|2,{54,89,0}}, +/* 29593 */ {(13<<2)|2,{54,89,0}}, +/* 29594 */ {(13<<2)|2,{54,89,0}}, +/* 29595 */ {(13<<2)|2,{54,89,0}}, +/* 29596 */ {(13<<2)|2,{54,89,0}}, +/* 29597 */ {(13<<2)|2,{54,89,0}}, +/* 29598 */ {(13<<2)|2,{54,89,0}}, +/* 29599 */ {(13<<2)|2,{54,89,0}}, +/* 29600 */ {(13<<2)|2,{54,106,0}}, +/* 29601 */ {(13<<2)|2,{54,106,0}}, +/* 29602 */ {(13<<2)|2,{54,106,0}}, +/* 29603 */ {(13<<2)|2,{54,106,0}}, +/* 29604 */ {(13<<2)|2,{54,106,0}}, +/* 29605 */ {(13<<2)|2,{54,106,0}}, +/* 29606 */ {(13<<2)|2,{54,106,0}}, +/* 29607 */ {(13<<2)|2,{54,106,0}}, +/* 29608 */ {(13<<2)|2,{54,107,0}}, +/* 29609 */ {(13<<2)|2,{54,107,0}}, +/* 29610 */ {(13<<2)|2,{54,107,0}}, +/* 29611 */ {(13<<2)|2,{54,107,0}}, +/* 29612 */ {(13<<2)|2,{54,107,0}}, +/* 29613 */ {(13<<2)|2,{54,107,0}}, +/* 29614 */ {(13<<2)|2,{54,107,0}}, +/* 29615 */ {(13<<2)|2,{54,107,0}}, +/* 29616 */ {(13<<2)|2,{54,113,0}}, +/* 29617 */ {(13<<2)|2,{54,113,0}}, +/* 29618 */ {(13<<2)|2,{54,113,0}}, +/* 29619 */ {(13<<2)|2,{54,113,0}}, +/* 29620 */ {(13<<2)|2,{54,113,0}}, +/* 29621 */ {(13<<2)|2,{54,113,0}}, +/* 29622 */ {(13<<2)|2,{54,113,0}}, +/* 29623 */ {(13<<2)|2,{54,113,0}}, +/* 29624 */ {(13<<2)|2,{54,118,0}}, +/* 29625 */ {(13<<2)|2,{54,118,0}}, +/* 29626 */ {(13<<2)|2,{54,118,0}}, +/* 29627 */ {(13<<2)|2,{54,118,0}}, +/* 29628 */ {(13<<2)|2,{54,118,0}}, +/* 29629 */ {(13<<2)|2,{54,118,0}}, +/* 29630 */ {(13<<2)|2,{54,118,0}}, +/* 29631 */ {(13<<2)|2,{54,118,0}}, +/* 29632 */ {(13<<2)|2,{54,119,0}}, +/* 29633 */ {(13<<2)|2,{54,119,0}}, +/* 29634 */ {(13<<2)|2,{54,119,0}}, +/* 29635 */ {(13<<2)|2,{54,119,0}}, +/* 29636 */ {(13<<2)|2,{54,119,0}}, +/* 29637 */ {(13<<2)|2,{54,119,0}}, +/* 29638 */ {(13<<2)|2,{54,119,0}}, +/* 29639 */ {(13<<2)|2,{54,119,0}}, +/* 29640 */ {(13<<2)|2,{54,120,0}}, +/* 29641 */ {(13<<2)|2,{54,120,0}}, +/* 29642 */ {(13<<2)|2,{54,120,0}}, +/* 29643 */ {(13<<2)|2,{54,120,0}}, +/* 29644 */ {(13<<2)|2,{54,120,0}}, +/* 29645 */ {(13<<2)|2,{54,120,0}}, +/* 29646 */ {(13<<2)|2,{54,120,0}}, +/* 29647 */ {(13<<2)|2,{54,120,0}}, +/* 29648 */ {(13<<2)|2,{54,121,0}}, +/* 29649 */ {(13<<2)|2,{54,121,0}}, +/* 29650 */ {(13<<2)|2,{54,121,0}}, +/* 29651 */ {(13<<2)|2,{54,121,0}}, +/* 29652 */ {(13<<2)|2,{54,121,0}}, +/* 29653 */ {(13<<2)|2,{54,121,0}}, +/* 29654 */ {(13<<2)|2,{54,121,0}}, +/* 29655 */ {(13<<2)|2,{54,121,0}}, +/* 29656 */ {(13<<2)|2,{54,122,0}}, +/* 29657 */ {(13<<2)|2,{54,122,0}}, +/* 29658 */ {(13<<2)|2,{54,122,0}}, +/* 29659 */ {(13<<2)|2,{54,122,0}}, +/* 29660 */ {(13<<2)|2,{54,122,0}}, +/* 29661 */ {(13<<2)|2,{54,122,0}}, +/* 29662 */ {(13<<2)|2,{54,122,0}}, +/* 29663 */ {(13<<2)|2,{54,122,0}}, +/* 29664 */ {(14<<2)|2,{54,38,0}}, +/* 29665 */ {(14<<2)|2,{54,38,0}}, +/* 29666 */ {(14<<2)|2,{54,38,0}}, +/* 29667 */ {(14<<2)|2,{54,38,0}}, +/* 29668 */ {(14<<2)|2,{54,42,0}}, +/* 29669 */ {(14<<2)|2,{54,42,0}}, +/* 29670 */ {(14<<2)|2,{54,42,0}}, +/* 29671 */ {(14<<2)|2,{54,42,0}}, +/* 29672 */ {(14<<2)|2,{54,44,0}}, +/* 29673 */ {(14<<2)|2,{54,44,0}}, +/* 29674 */ {(14<<2)|2,{54,44,0}}, +/* 29675 */ {(14<<2)|2,{54,44,0}}, +/* 29676 */ {(14<<2)|2,{54,59,0}}, +/* 29677 */ {(14<<2)|2,{54,59,0}}, +/* 29678 */ {(14<<2)|2,{54,59,0}}, +/* 29679 */ {(14<<2)|2,{54,59,0}}, +/* 29680 */ {(14<<2)|2,{54,88,0}}, +/* 29681 */ {(14<<2)|2,{54,88,0}}, +/* 29682 */ {(14<<2)|2,{54,88,0}}, +/* 29683 */ {(14<<2)|2,{54,88,0}}, +/* 29684 */ {(14<<2)|2,{54,90,0}}, +/* 29685 */ {(14<<2)|2,{54,90,0}}, +/* 29686 */ {(14<<2)|2,{54,90,0}}, +/* 29687 */ {(14<<2)|2,{54,90,0}}, +/* 29688 */ {(16<<2)|2,{54,33,0}}, +/* 29689 */ {(16<<2)|2,{54,34,0}}, +/* 29690 */ {(16<<2)|2,{54,40,0}}, +/* 29691 */ {(16<<2)|2,{54,41,0}}, +/* 29692 */ {(16<<2)|2,{54,63,0}}, +/* 29693 */ {(6<<2)|1,{54,0,0}}, +/* 29694 */ {(6<<2)|1,{54,0,0}}, +/* 29695 */ {(6<<2)|1,{54,0,0}}, +/* 29696 */ {(16<<2)|3,{55,48,48}}, +/* 29697 */ {(16<<2)|3,{55,48,49}}, +/* 29698 */ {(16<<2)|3,{55,48,50}}, +/* 29699 */ {(16<<2)|3,{55,48,97}}, +/* 29700 */ {(16<<2)|3,{55,48,99}}, +/* 29701 */ {(16<<2)|3,{55,48,101}}, +/* 29702 */ {(16<<2)|3,{55,48,105}}, +/* 29703 */ {(16<<2)|3,{55,48,111}}, +/* 29704 */ {(16<<2)|3,{55,48,115}}, +/* 29705 */ {(16<<2)|3,{55,48,116}}, +/* 29706 */ {(11<<2)|2,{55,48,0}}, +/* 29707 */ {(11<<2)|2,{55,48,0}}, +/* 29708 */ {(11<<2)|2,{55,48,0}}, +/* 29709 */ {(11<<2)|2,{55,48,0}}, +/* 29710 */ {(11<<2)|2,{55,48,0}}, +/* 29711 */ {(11<<2)|2,{55,48,0}}, +/* 29712 */ {(11<<2)|2,{55,48,0}}, +/* 29713 */ {(11<<2)|2,{55,48,0}}, +/* 29714 */ {(11<<2)|2,{55,48,0}}, +/* 29715 */ {(11<<2)|2,{55,48,0}}, +/* 29716 */ {(11<<2)|2,{55,48,0}}, +/* 29717 */ {(11<<2)|2,{55,48,0}}, +/* 29718 */ {(11<<2)|2,{55,48,0}}, +/* 29719 */ {(11<<2)|2,{55,48,0}}, +/* 29720 */ {(11<<2)|2,{55,48,0}}, +/* 29721 */ {(11<<2)|2,{55,48,0}}, +/* 29722 */ {(11<<2)|2,{55,48,0}}, +/* 29723 */ {(11<<2)|2,{55,48,0}}, +/* 29724 */ {(11<<2)|2,{55,48,0}}, +/* 29725 */ {(11<<2)|2,{55,48,0}}, +/* 29726 */ {(11<<2)|2,{55,48,0}}, +/* 29727 */ {(11<<2)|2,{55,48,0}}, +/* 29728 */ {(16<<2)|3,{55,49,48}}, +/* 29729 */ {(16<<2)|3,{55,49,49}}, +/* 29730 */ {(16<<2)|3,{55,49,50}}, +/* 29731 */ {(16<<2)|3,{55,49,97}}, +/* 29732 */ {(16<<2)|3,{55,49,99}}, +/* 29733 */ {(16<<2)|3,{55,49,101}}, +/* 29734 */ {(16<<2)|3,{55,49,105}}, +/* 29735 */ {(16<<2)|3,{55,49,111}}, +/* 29736 */ {(16<<2)|3,{55,49,115}}, +/* 29737 */ {(16<<2)|3,{55,49,116}}, +/* 29738 */ {(11<<2)|2,{55,49,0}}, +/* 29739 */ {(11<<2)|2,{55,49,0}}, +/* 29740 */ {(11<<2)|2,{55,49,0}}, +/* 29741 */ {(11<<2)|2,{55,49,0}}, +/* 29742 */ {(11<<2)|2,{55,49,0}}, +/* 29743 */ {(11<<2)|2,{55,49,0}}, +/* 29744 */ {(11<<2)|2,{55,49,0}}, +/* 29745 */ {(11<<2)|2,{55,49,0}}, +/* 29746 */ {(11<<2)|2,{55,49,0}}, +/* 29747 */ {(11<<2)|2,{55,49,0}}, +/* 29748 */ {(11<<2)|2,{55,49,0}}, +/* 29749 */ {(11<<2)|2,{55,49,0}}, +/* 29750 */ {(11<<2)|2,{55,49,0}}, +/* 29751 */ {(11<<2)|2,{55,49,0}}, +/* 29752 */ {(11<<2)|2,{55,49,0}}, +/* 29753 */ {(11<<2)|2,{55,49,0}}, +/* 29754 */ {(11<<2)|2,{55,49,0}}, +/* 29755 */ {(11<<2)|2,{55,49,0}}, +/* 29756 */ {(11<<2)|2,{55,49,0}}, +/* 29757 */ {(11<<2)|2,{55,49,0}}, +/* 29758 */ {(11<<2)|2,{55,49,0}}, +/* 29759 */ {(11<<2)|2,{55,49,0}}, +/* 29760 */ {(16<<2)|3,{55,50,48}}, +/* 29761 */ {(16<<2)|3,{55,50,49}}, +/* 29762 */ {(16<<2)|3,{55,50,50}}, +/* 29763 */ {(16<<2)|3,{55,50,97}}, +/* 29764 */ {(16<<2)|3,{55,50,99}}, +/* 29765 */ {(16<<2)|3,{55,50,101}}, +/* 29766 */ {(16<<2)|3,{55,50,105}}, +/* 29767 */ {(16<<2)|3,{55,50,111}}, +/* 29768 */ {(16<<2)|3,{55,50,115}}, +/* 29769 */ {(16<<2)|3,{55,50,116}}, +/* 29770 */ {(11<<2)|2,{55,50,0}}, +/* 29771 */ {(11<<2)|2,{55,50,0}}, +/* 29772 */ {(11<<2)|2,{55,50,0}}, +/* 29773 */ {(11<<2)|2,{55,50,0}}, +/* 29774 */ {(11<<2)|2,{55,50,0}}, +/* 29775 */ {(11<<2)|2,{55,50,0}}, +/* 29776 */ {(11<<2)|2,{55,50,0}}, +/* 29777 */ {(11<<2)|2,{55,50,0}}, +/* 29778 */ {(11<<2)|2,{55,50,0}}, +/* 29779 */ {(11<<2)|2,{55,50,0}}, +/* 29780 */ {(11<<2)|2,{55,50,0}}, +/* 29781 */ {(11<<2)|2,{55,50,0}}, +/* 29782 */ {(11<<2)|2,{55,50,0}}, +/* 29783 */ {(11<<2)|2,{55,50,0}}, +/* 29784 */ {(11<<2)|2,{55,50,0}}, +/* 29785 */ {(11<<2)|2,{55,50,0}}, +/* 29786 */ {(11<<2)|2,{55,50,0}}, +/* 29787 */ {(11<<2)|2,{55,50,0}}, +/* 29788 */ {(11<<2)|2,{55,50,0}}, +/* 29789 */ {(11<<2)|2,{55,50,0}}, +/* 29790 */ {(11<<2)|2,{55,50,0}}, +/* 29791 */ {(11<<2)|2,{55,50,0}}, +/* 29792 */ {(16<<2)|3,{55,97,48}}, +/* 29793 */ {(16<<2)|3,{55,97,49}}, +/* 29794 */ {(16<<2)|3,{55,97,50}}, +/* 29795 */ {(16<<2)|3,{55,97,97}}, +/* 29796 */ {(16<<2)|3,{55,97,99}}, +/* 29797 */ {(16<<2)|3,{55,97,101}}, +/* 29798 */ {(16<<2)|3,{55,97,105}}, +/* 29799 */ {(16<<2)|3,{55,97,111}}, +/* 29800 */ {(16<<2)|3,{55,97,115}}, +/* 29801 */ {(16<<2)|3,{55,97,116}}, +/* 29802 */ {(11<<2)|2,{55,97,0}}, +/* 29803 */ {(11<<2)|2,{55,97,0}}, +/* 29804 */ {(11<<2)|2,{55,97,0}}, +/* 29805 */ {(11<<2)|2,{55,97,0}}, +/* 29806 */ {(11<<2)|2,{55,97,0}}, +/* 29807 */ {(11<<2)|2,{55,97,0}}, +/* 29808 */ {(11<<2)|2,{55,97,0}}, +/* 29809 */ {(11<<2)|2,{55,97,0}}, +/* 29810 */ {(11<<2)|2,{55,97,0}}, +/* 29811 */ {(11<<2)|2,{55,97,0}}, +/* 29812 */ {(11<<2)|2,{55,97,0}}, +/* 29813 */ {(11<<2)|2,{55,97,0}}, +/* 29814 */ {(11<<2)|2,{55,97,0}}, +/* 29815 */ {(11<<2)|2,{55,97,0}}, +/* 29816 */ {(11<<2)|2,{55,97,0}}, +/* 29817 */ {(11<<2)|2,{55,97,0}}, +/* 29818 */ {(11<<2)|2,{55,97,0}}, +/* 29819 */ {(11<<2)|2,{55,97,0}}, +/* 29820 */ {(11<<2)|2,{55,97,0}}, +/* 29821 */ {(11<<2)|2,{55,97,0}}, +/* 29822 */ {(11<<2)|2,{55,97,0}}, +/* 29823 */ {(11<<2)|2,{55,97,0}}, +/* 29824 */ {(16<<2)|3,{55,99,48}}, +/* 29825 */ {(16<<2)|3,{55,99,49}}, +/* 29826 */ {(16<<2)|3,{55,99,50}}, +/* 29827 */ {(16<<2)|3,{55,99,97}}, +/* 29828 */ {(16<<2)|3,{55,99,99}}, +/* 29829 */ {(16<<2)|3,{55,99,101}}, +/* 29830 */ {(16<<2)|3,{55,99,105}}, +/* 29831 */ {(16<<2)|3,{55,99,111}}, +/* 29832 */ {(16<<2)|3,{55,99,115}}, +/* 29833 */ {(16<<2)|3,{55,99,116}}, +/* 29834 */ {(11<<2)|2,{55,99,0}}, +/* 29835 */ {(11<<2)|2,{55,99,0}}, +/* 29836 */ {(11<<2)|2,{55,99,0}}, +/* 29837 */ {(11<<2)|2,{55,99,0}}, +/* 29838 */ {(11<<2)|2,{55,99,0}}, +/* 29839 */ {(11<<2)|2,{55,99,0}}, +/* 29840 */ {(11<<2)|2,{55,99,0}}, +/* 29841 */ {(11<<2)|2,{55,99,0}}, +/* 29842 */ {(11<<2)|2,{55,99,0}}, +/* 29843 */ {(11<<2)|2,{55,99,0}}, +/* 29844 */ {(11<<2)|2,{55,99,0}}, +/* 29845 */ {(11<<2)|2,{55,99,0}}, +/* 29846 */ {(11<<2)|2,{55,99,0}}, +/* 29847 */ {(11<<2)|2,{55,99,0}}, +/* 29848 */ {(11<<2)|2,{55,99,0}}, +/* 29849 */ {(11<<2)|2,{55,99,0}}, +/* 29850 */ {(11<<2)|2,{55,99,0}}, +/* 29851 */ {(11<<2)|2,{55,99,0}}, +/* 29852 */ {(11<<2)|2,{55,99,0}}, +/* 29853 */ {(11<<2)|2,{55,99,0}}, +/* 29854 */ {(11<<2)|2,{55,99,0}}, +/* 29855 */ {(11<<2)|2,{55,99,0}}, +/* 29856 */ {(16<<2)|3,{55,101,48}}, +/* 29857 */ {(16<<2)|3,{55,101,49}}, +/* 29858 */ {(16<<2)|3,{55,101,50}}, +/* 29859 */ {(16<<2)|3,{55,101,97}}, +/* 29860 */ {(16<<2)|3,{55,101,99}}, +/* 29861 */ {(16<<2)|3,{55,101,101}}, +/* 29862 */ {(16<<2)|3,{55,101,105}}, +/* 29863 */ {(16<<2)|3,{55,101,111}}, +/* 29864 */ {(16<<2)|3,{55,101,115}}, +/* 29865 */ {(16<<2)|3,{55,101,116}}, +/* 29866 */ {(11<<2)|2,{55,101,0}}, +/* 29867 */ {(11<<2)|2,{55,101,0}}, +/* 29868 */ {(11<<2)|2,{55,101,0}}, +/* 29869 */ {(11<<2)|2,{55,101,0}}, +/* 29870 */ {(11<<2)|2,{55,101,0}}, +/* 29871 */ {(11<<2)|2,{55,101,0}}, +/* 29872 */ {(11<<2)|2,{55,101,0}}, +/* 29873 */ {(11<<2)|2,{55,101,0}}, +/* 29874 */ {(11<<2)|2,{55,101,0}}, +/* 29875 */ {(11<<2)|2,{55,101,0}}, +/* 29876 */ {(11<<2)|2,{55,101,0}}, +/* 29877 */ {(11<<2)|2,{55,101,0}}, +/* 29878 */ {(11<<2)|2,{55,101,0}}, +/* 29879 */ {(11<<2)|2,{55,101,0}}, +/* 29880 */ {(11<<2)|2,{55,101,0}}, +/* 29881 */ {(11<<2)|2,{55,101,0}}, +/* 29882 */ {(11<<2)|2,{55,101,0}}, +/* 29883 */ {(11<<2)|2,{55,101,0}}, +/* 29884 */ {(11<<2)|2,{55,101,0}}, +/* 29885 */ {(11<<2)|2,{55,101,0}}, +/* 29886 */ {(11<<2)|2,{55,101,0}}, +/* 29887 */ {(11<<2)|2,{55,101,0}}, +/* 29888 */ {(16<<2)|3,{55,105,48}}, +/* 29889 */ {(16<<2)|3,{55,105,49}}, +/* 29890 */ {(16<<2)|3,{55,105,50}}, +/* 29891 */ {(16<<2)|3,{55,105,97}}, +/* 29892 */ {(16<<2)|3,{55,105,99}}, +/* 29893 */ {(16<<2)|3,{55,105,101}}, +/* 29894 */ {(16<<2)|3,{55,105,105}}, +/* 29895 */ {(16<<2)|3,{55,105,111}}, +/* 29896 */ {(16<<2)|3,{55,105,115}}, +/* 29897 */ {(16<<2)|3,{55,105,116}}, +/* 29898 */ {(11<<2)|2,{55,105,0}}, +/* 29899 */ {(11<<2)|2,{55,105,0}}, +/* 29900 */ {(11<<2)|2,{55,105,0}}, +/* 29901 */ {(11<<2)|2,{55,105,0}}, +/* 29902 */ {(11<<2)|2,{55,105,0}}, +/* 29903 */ {(11<<2)|2,{55,105,0}}, +/* 29904 */ {(11<<2)|2,{55,105,0}}, +/* 29905 */ {(11<<2)|2,{55,105,0}}, +/* 29906 */ {(11<<2)|2,{55,105,0}}, +/* 29907 */ {(11<<2)|2,{55,105,0}}, +/* 29908 */ {(11<<2)|2,{55,105,0}}, +/* 29909 */ {(11<<2)|2,{55,105,0}}, +/* 29910 */ {(11<<2)|2,{55,105,0}}, +/* 29911 */ {(11<<2)|2,{55,105,0}}, +/* 29912 */ {(11<<2)|2,{55,105,0}}, +/* 29913 */ {(11<<2)|2,{55,105,0}}, +/* 29914 */ {(11<<2)|2,{55,105,0}}, +/* 29915 */ {(11<<2)|2,{55,105,0}}, +/* 29916 */ {(11<<2)|2,{55,105,0}}, +/* 29917 */ {(11<<2)|2,{55,105,0}}, +/* 29918 */ {(11<<2)|2,{55,105,0}}, +/* 29919 */ {(11<<2)|2,{55,105,0}}, +/* 29920 */ {(16<<2)|3,{55,111,48}}, +/* 29921 */ {(16<<2)|3,{55,111,49}}, +/* 29922 */ {(16<<2)|3,{55,111,50}}, +/* 29923 */ {(16<<2)|3,{55,111,97}}, +/* 29924 */ {(16<<2)|3,{55,111,99}}, +/* 29925 */ {(16<<2)|3,{55,111,101}}, +/* 29926 */ {(16<<2)|3,{55,111,105}}, +/* 29927 */ {(16<<2)|3,{55,111,111}}, +/* 29928 */ {(16<<2)|3,{55,111,115}}, +/* 29929 */ {(16<<2)|3,{55,111,116}}, +/* 29930 */ {(11<<2)|2,{55,111,0}}, +/* 29931 */ {(11<<2)|2,{55,111,0}}, +/* 29932 */ {(11<<2)|2,{55,111,0}}, +/* 29933 */ {(11<<2)|2,{55,111,0}}, +/* 29934 */ {(11<<2)|2,{55,111,0}}, +/* 29935 */ {(11<<2)|2,{55,111,0}}, +/* 29936 */ {(11<<2)|2,{55,111,0}}, +/* 29937 */ {(11<<2)|2,{55,111,0}}, +/* 29938 */ {(11<<2)|2,{55,111,0}}, +/* 29939 */ {(11<<2)|2,{55,111,0}}, +/* 29940 */ {(11<<2)|2,{55,111,0}}, +/* 29941 */ {(11<<2)|2,{55,111,0}}, +/* 29942 */ {(11<<2)|2,{55,111,0}}, +/* 29943 */ {(11<<2)|2,{55,111,0}}, +/* 29944 */ {(11<<2)|2,{55,111,0}}, +/* 29945 */ {(11<<2)|2,{55,111,0}}, +/* 29946 */ {(11<<2)|2,{55,111,0}}, +/* 29947 */ {(11<<2)|2,{55,111,0}}, +/* 29948 */ {(11<<2)|2,{55,111,0}}, +/* 29949 */ {(11<<2)|2,{55,111,0}}, +/* 29950 */ {(11<<2)|2,{55,111,0}}, +/* 29951 */ {(11<<2)|2,{55,111,0}}, +/* 29952 */ {(16<<2)|3,{55,115,48}}, +/* 29953 */ {(16<<2)|3,{55,115,49}}, +/* 29954 */ {(16<<2)|3,{55,115,50}}, +/* 29955 */ {(16<<2)|3,{55,115,97}}, +/* 29956 */ {(16<<2)|3,{55,115,99}}, +/* 29957 */ {(16<<2)|3,{55,115,101}}, +/* 29958 */ {(16<<2)|3,{55,115,105}}, +/* 29959 */ {(16<<2)|3,{55,115,111}}, +/* 29960 */ {(16<<2)|3,{55,115,115}}, +/* 29961 */ {(16<<2)|3,{55,115,116}}, +/* 29962 */ {(11<<2)|2,{55,115,0}}, +/* 29963 */ {(11<<2)|2,{55,115,0}}, +/* 29964 */ {(11<<2)|2,{55,115,0}}, +/* 29965 */ {(11<<2)|2,{55,115,0}}, +/* 29966 */ {(11<<2)|2,{55,115,0}}, +/* 29967 */ {(11<<2)|2,{55,115,0}}, +/* 29968 */ {(11<<2)|2,{55,115,0}}, +/* 29969 */ {(11<<2)|2,{55,115,0}}, +/* 29970 */ {(11<<2)|2,{55,115,0}}, +/* 29971 */ {(11<<2)|2,{55,115,0}}, +/* 29972 */ {(11<<2)|2,{55,115,0}}, +/* 29973 */ {(11<<2)|2,{55,115,0}}, +/* 29974 */ {(11<<2)|2,{55,115,0}}, +/* 29975 */ {(11<<2)|2,{55,115,0}}, +/* 29976 */ {(11<<2)|2,{55,115,0}}, +/* 29977 */ {(11<<2)|2,{55,115,0}}, +/* 29978 */ {(11<<2)|2,{55,115,0}}, +/* 29979 */ {(11<<2)|2,{55,115,0}}, +/* 29980 */ {(11<<2)|2,{55,115,0}}, +/* 29981 */ {(11<<2)|2,{55,115,0}}, +/* 29982 */ {(11<<2)|2,{55,115,0}}, +/* 29983 */ {(11<<2)|2,{55,115,0}}, +/* 29984 */ {(16<<2)|3,{55,116,48}}, +/* 29985 */ {(16<<2)|3,{55,116,49}}, +/* 29986 */ {(16<<2)|3,{55,116,50}}, +/* 29987 */ {(16<<2)|3,{55,116,97}}, +/* 29988 */ {(16<<2)|3,{55,116,99}}, +/* 29989 */ {(16<<2)|3,{55,116,101}}, +/* 29990 */ {(16<<2)|3,{55,116,105}}, +/* 29991 */ {(16<<2)|3,{55,116,111}}, +/* 29992 */ {(16<<2)|3,{55,116,115}}, +/* 29993 */ {(16<<2)|3,{55,116,116}}, +/* 29994 */ {(11<<2)|2,{55,116,0}}, +/* 29995 */ {(11<<2)|2,{55,116,0}}, +/* 29996 */ {(11<<2)|2,{55,116,0}}, +/* 29997 */ {(11<<2)|2,{55,116,0}}, +/* 29998 */ {(11<<2)|2,{55,116,0}}, +/* 29999 */ {(11<<2)|2,{55,116,0}}, +/* 30000 */ {(11<<2)|2,{55,116,0}}, +/* 30001 */ {(11<<2)|2,{55,116,0}}, +/* 30002 */ {(11<<2)|2,{55,116,0}}, +/* 30003 */ {(11<<2)|2,{55,116,0}}, +/* 30004 */ {(11<<2)|2,{55,116,0}}, +/* 30005 */ {(11<<2)|2,{55,116,0}}, +/* 30006 */ {(11<<2)|2,{55,116,0}}, +/* 30007 */ {(11<<2)|2,{55,116,0}}, +/* 30008 */ {(11<<2)|2,{55,116,0}}, +/* 30009 */ {(11<<2)|2,{55,116,0}}, +/* 30010 */ {(11<<2)|2,{55,116,0}}, +/* 30011 */ {(11<<2)|2,{55,116,0}}, +/* 30012 */ {(11<<2)|2,{55,116,0}}, +/* 30013 */ {(11<<2)|2,{55,116,0}}, +/* 30014 */ {(11<<2)|2,{55,116,0}}, +/* 30015 */ {(11<<2)|2,{55,116,0}}, +/* 30016 */ {(12<<2)|2,{55,32,0}}, +/* 30017 */ {(12<<2)|2,{55,32,0}}, +/* 30018 */ {(12<<2)|2,{55,32,0}}, +/* 30019 */ {(12<<2)|2,{55,32,0}}, +/* 30020 */ {(12<<2)|2,{55,32,0}}, +/* 30021 */ {(12<<2)|2,{55,32,0}}, +/* 30022 */ {(12<<2)|2,{55,32,0}}, +/* 30023 */ {(12<<2)|2,{55,32,0}}, +/* 30024 */ {(12<<2)|2,{55,32,0}}, +/* 30025 */ {(12<<2)|2,{55,32,0}}, +/* 30026 */ {(12<<2)|2,{55,32,0}}, +/* 30027 */ {(12<<2)|2,{55,32,0}}, +/* 30028 */ {(12<<2)|2,{55,32,0}}, +/* 30029 */ {(12<<2)|2,{55,32,0}}, +/* 30030 */ {(12<<2)|2,{55,32,0}}, +/* 30031 */ {(12<<2)|2,{55,32,0}}, +/* 30032 */ {(12<<2)|2,{55,37,0}}, +/* 30033 */ {(12<<2)|2,{55,37,0}}, +/* 30034 */ {(12<<2)|2,{55,37,0}}, +/* 30035 */ {(12<<2)|2,{55,37,0}}, +/* 30036 */ {(12<<2)|2,{55,37,0}}, +/* 30037 */ {(12<<2)|2,{55,37,0}}, +/* 30038 */ {(12<<2)|2,{55,37,0}}, +/* 30039 */ {(12<<2)|2,{55,37,0}}, +/* 30040 */ {(12<<2)|2,{55,37,0}}, +/* 30041 */ {(12<<2)|2,{55,37,0}}, +/* 30042 */ {(12<<2)|2,{55,37,0}}, +/* 30043 */ {(12<<2)|2,{55,37,0}}, +/* 30044 */ {(12<<2)|2,{55,37,0}}, +/* 30045 */ {(12<<2)|2,{55,37,0}}, +/* 30046 */ {(12<<2)|2,{55,37,0}}, +/* 30047 */ {(12<<2)|2,{55,37,0}}, +/* 30048 */ {(12<<2)|2,{55,45,0}}, +/* 30049 */ {(12<<2)|2,{55,45,0}}, +/* 30050 */ {(12<<2)|2,{55,45,0}}, +/* 30051 */ {(12<<2)|2,{55,45,0}}, +/* 30052 */ {(12<<2)|2,{55,45,0}}, +/* 30053 */ {(12<<2)|2,{55,45,0}}, +/* 30054 */ {(12<<2)|2,{55,45,0}}, +/* 30055 */ {(12<<2)|2,{55,45,0}}, +/* 30056 */ {(12<<2)|2,{55,45,0}}, +/* 30057 */ {(12<<2)|2,{55,45,0}}, +/* 30058 */ {(12<<2)|2,{55,45,0}}, +/* 30059 */ {(12<<2)|2,{55,45,0}}, +/* 30060 */ {(12<<2)|2,{55,45,0}}, +/* 30061 */ {(12<<2)|2,{55,45,0}}, +/* 30062 */ {(12<<2)|2,{55,45,0}}, +/* 30063 */ {(12<<2)|2,{55,45,0}}, +/* 30064 */ {(12<<2)|2,{55,46,0}}, +/* 30065 */ {(12<<2)|2,{55,46,0}}, +/* 30066 */ {(12<<2)|2,{55,46,0}}, +/* 30067 */ {(12<<2)|2,{55,46,0}}, +/* 30068 */ {(12<<2)|2,{55,46,0}}, +/* 30069 */ {(12<<2)|2,{55,46,0}}, +/* 30070 */ {(12<<2)|2,{55,46,0}}, +/* 30071 */ {(12<<2)|2,{55,46,0}}, +/* 30072 */ {(12<<2)|2,{55,46,0}}, +/* 30073 */ {(12<<2)|2,{55,46,0}}, +/* 30074 */ {(12<<2)|2,{55,46,0}}, +/* 30075 */ {(12<<2)|2,{55,46,0}}, +/* 30076 */ {(12<<2)|2,{55,46,0}}, +/* 30077 */ {(12<<2)|2,{55,46,0}}, +/* 30078 */ {(12<<2)|2,{55,46,0}}, +/* 30079 */ {(12<<2)|2,{55,46,0}}, +/* 30080 */ {(12<<2)|2,{55,47,0}}, +/* 30081 */ {(12<<2)|2,{55,47,0}}, +/* 30082 */ {(12<<2)|2,{55,47,0}}, +/* 30083 */ {(12<<2)|2,{55,47,0}}, +/* 30084 */ {(12<<2)|2,{55,47,0}}, +/* 30085 */ {(12<<2)|2,{55,47,0}}, +/* 30086 */ {(12<<2)|2,{55,47,0}}, +/* 30087 */ {(12<<2)|2,{55,47,0}}, +/* 30088 */ {(12<<2)|2,{55,47,0}}, +/* 30089 */ {(12<<2)|2,{55,47,0}}, +/* 30090 */ {(12<<2)|2,{55,47,0}}, +/* 30091 */ {(12<<2)|2,{55,47,0}}, +/* 30092 */ {(12<<2)|2,{55,47,0}}, +/* 30093 */ {(12<<2)|2,{55,47,0}}, +/* 30094 */ {(12<<2)|2,{55,47,0}}, +/* 30095 */ {(12<<2)|2,{55,47,0}}, +/* 30096 */ {(12<<2)|2,{55,51,0}}, +/* 30097 */ {(12<<2)|2,{55,51,0}}, +/* 30098 */ {(12<<2)|2,{55,51,0}}, +/* 30099 */ {(12<<2)|2,{55,51,0}}, +/* 30100 */ {(12<<2)|2,{55,51,0}}, +/* 30101 */ {(12<<2)|2,{55,51,0}}, +/* 30102 */ {(12<<2)|2,{55,51,0}}, +/* 30103 */ {(12<<2)|2,{55,51,0}}, +/* 30104 */ {(12<<2)|2,{55,51,0}}, +/* 30105 */ {(12<<2)|2,{55,51,0}}, +/* 30106 */ {(12<<2)|2,{55,51,0}}, +/* 30107 */ {(12<<2)|2,{55,51,0}}, +/* 30108 */ {(12<<2)|2,{55,51,0}}, +/* 30109 */ {(12<<2)|2,{55,51,0}}, +/* 30110 */ {(12<<2)|2,{55,51,0}}, +/* 30111 */ {(12<<2)|2,{55,51,0}}, +/* 30112 */ {(12<<2)|2,{55,52,0}}, +/* 30113 */ {(12<<2)|2,{55,52,0}}, +/* 30114 */ {(12<<2)|2,{55,52,0}}, +/* 30115 */ {(12<<2)|2,{55,52,0}}, +/* 30116 */ {(12<<2)|2,{55,52,0}}, +/* 30117 */ {(12<<2)|2,{55,52,0}}, +/* 30118 */ {(12<<2)|2,{55,52,0}}, +/* 30119 */ {(12<<2)|2,{55,52,0}}, +/* 30120 */ {(12<<2)|2,{55,52,0}}, +/* 30121 */ {(12<<2)|2,{55,52,0}}, +/* 30122 */ {(12<<2)|2,{55,52,0}}, +/* 30123 */ {(12<<2)|2,{55,52,0}}, +/* 30124 */ {(12<<2)|2,{55,52,0}}, +/* 30125 */ {(12<<2)|2,{55,52,0}}, +/* 30126 */ {(12<<2)|2,{55,52,0}}, +/* 30127 */ {(12<<2)|2,{55,52,0}}, +/* 30128 */ {(12<<2)|2,{55,53,0}}, +/* 30129 */ {(12<<2)|2,{55,53,0}}, +/* 30130 */ {(12<<2)|2,{55,53,0}}, +/* 30131 */ {(12<<2)|2,{55,53,0}}, +/* 30132 */ {(12<<2)|2,{55,53,0}}, +/* 30133 */ {(12<<2)|2,{55,53,0}}, +/* 30134 */ {(12<<2)|2,{55,53,0}}, +/* 30135 */ {(12<<2)|2,{55,53,0}}, +/* 30136 */ {(12<<2)|2,{55,53,0}}, +/* 30137 */ {(12<<2)|2,{55,53,0}}, +/* 30138 */ {(12<<2)|2,{55,53,0}}, +/* 30139 */ {(12<<2)|2,{55,53,0}}, +/* 30140 */ {(12<<2)|2,{55,53,0}}, +/* 30141 */ {(12<<2)|2,{55,53,0}}, +/* 30142 */ {(12<<2)|2,{55,53,0}}, +/* 30143 */ {(12<<2)|2,{55,53,0}}, +/* 30144 */ {(12<<2)|2,{55,54,0}}, +/* 30145 */ {(12<<2)|2,{55,54,0}}, +/* 30146 */ {(12<<2)|2,{55,54,0}}, +/* 30147 */ {(12<<2)|2,{55,54,0}}, +/* 30148 */ {(12<<2)|2,{55,54,0}}, +/* 30149 */ {(12<<2)|2,{55,54,0}}, +/* 30150 */ {(12<<2)|2,{55,54,0}}, +/* 30151 */ {(12<<2)|2,{55,54,0}}, +/* 30152 */ {(12<<2)|2,{55,54,0}}, +/* 30153 */ {(12<<2)|2,{55,54,0}}, +/* 30154 */ {(12<<2)|2,{55,54,0}}, +/* 30155 */ {(12<<2)|2,{55,54,0}}, +/* 30156 */ {(12<<2)|2,{55,54,0}}, +/* 30157 */ {(12<<2)|2,{55,54,0}}, +/* 30158 */ {(12<<2)|2,{55,54,0}}, +/* 30159 */ {(12<<2)|2,{55,54,0}}, +/* 30160 */ {(12<<2)|2,{55,55,0}}, +/* 30161 */ {(12<<2)|2,{55,55,0}}, +/* 30162 */ {(12<<2)|2,{55,55,0}}, +/* 30163 */ {(12<<2)|2,{55,55,0}}, +/* 30164 */ {(12<<2)|2,{55,55,0}}, +/* 30165 */ {(12<<2)|2,{55,55,0}}, +/* 30166 */ {(12<<2)|2,{55,55,0}}, +/* 30167 */ {(12<<2)|2,{55,55,0}}, +/* 30168 */ {(12<<2)|2,{55,55,0}}, +/* 30169 */ {(12<<2)|2,{55,55,0}}, +/* 30170 */ {(12<<2)|2,{55,55,0}}, +/* 30171 */ {(12<<2)|2,{55,55,0}}, +/* 30172 */ {(12<<2)|2,{55,55,0}}, +/* 30173 */ {(12<<2)|2,{55,55,0}}, +/* 30174 */ {(12<<2)|2,{55,55,0}}, +/* 30175 */ {(12<<2)|2,{55,55,0}}, +/* 30176 */ {(12<<2)|2,{55,56,0}}, +/* 30177 */ {(12<<2)|2,{55,56,0}}, +/* 30178 */ {(12<<2)|2,{55,56,0}}, +/* 30179 */ {(12<<2)|2,{55,56,0}}, +/* 30180 */ {(12<<2)|2,{55,56,0}}, +/* 30181 */ {(12<<2)|2,{55,56,0}}, +/* 30182 */ {(12<<2)|2,{55,56,0}}, +/* 30183 */ {(12<<2)|2,{55,56,0}}, +/* 30184 */ {(12<<2)|2,{55,56,0}}, +/* 30185 */ {(12<<2)|2,{55,56,0}}, +/* 30186 */ {(12<<2)|2,{55,56,0}}, +/* 30187 */ {(12<<2)|2,{55,56,0}}, +/* 30188 */ {(12<<2)|2,{55,56,0}}, +/* 30189 */ {(12<<2)|2,{55,56,0}}, +/* 30190 */ {(12<<2)|2,{55,56,0}}, +/* 30191 */ {(12<<2)|2,{55,56,0}}, +/* 30192 */ {(12<<2)|2,{55,57,0}}, +/* 30193 */ {(12<<2)|2,{55,57,0}}, +/* 30194 */ {(12<<2)|2,{55,57,0}}, +/* 30195 */ {(12<<2)|2,{55,57,0}}, +/* 30196 */ {(12<<2)|2,{55,57,0}}, +/* 30197 */ {(12<<2)|2,{55,57,0}}, +/* 30198 */ {(12<<2)|2,{55,57,0}}, +/* 30199 */ {(12<<2)|2,{55,57,0}}, +/* 30200 */ {(12<<2)|2,{55,57,0}}, +/* 30201 */ {(12<<2)|2,{55,57,0}}, +/* 30202 */ {(12<<2)|2,{55,57,0}}, +/* 30203 */ {(12<<2)|2,{55,57,0}}, +/* 30204 */ {(12<<2)|2,{55,57,0}}, +/* 30205 */ {(12<<2)|2,{55,57,0}}, +/* 30206 */ {(12<<2)|2,{55,57,0}}, +/* 30207 */ {(12<<2)|2,{55,57,0}}, +/* 30208 */ {(12<<2)|2,{55,61,0}}, +/* 30209 */ {(12<<2)|2,{55,61,0}}, +/* 30210 */ {(12<<2)|2,{55,61,0}}, +/* 30211 */ {(12<<2)|2,{55,61,0}}, +/* 30212 */ {(12<<2)|2,{55,61,0}}, +/* 30213 */ {(12<<2)|2,{55,61,0}}, +/* 30214 */ {(12<<2)|2,{55,61,0}}, +/* 30215 */ {(12<<2)|2,{55,61,0}}, +/* 30216 */ {(12<<2)|2,{55,61,0}}, +/* 30217 */ {(12<<2)|2,{55,61,0}}, +/* 30218 */ {(12<<2)|2,{55,61,0}}, +/* 30219 */ {(12<<2)|2,{55,61,0}}, +/* 30220 */ {(12<<2)|2,{55,61,0}}, +/* 30221 */ {(12<<2)|2,{55,61,0}}, +/* 30222 */ {(12<<2)|2,{55,61,0}}, +/* 30223 */ {(12<<2)|2,{55,61,0}}, +/* 30224 */ {(12<<2)|2,{55,65,0}}, +/* 30225 */ {(12<<2)|2,{55,65,0}}, +/* 30226 */ {(12<<2)|2,{55,65,0}}, +/* 30227 */ {(12<<2)|2,{55,65,0}}, +/* 30228 */ {(12<<2)|2,{55,65,0}}, +/* 30229 */ {(12<<2)|2,{55,65,0}}, +/* 30230 */ {(12<<2)|2,{55,65,0}}, +/* 30231 */ {(12<<2)|2,{55,65,0}}, +/* 30232 */ {(12<<2)|2,{55,65,0}}, +/* 30233 */ {(12<<2)|2,{55,65,0}}, +/* 30234 */ {(12<<2)|2,{55,65,0}}, +/* 30235 */ {(12<<2)|2,{55,65,0}}, +/* 30236 */ {(12<<2)|2,{55,65,0}}, +/* 30237 */ {(12<<2)|2,{55,65,0}}, +/* 30238 */ {(12<<2)|2,{55,65,0}}, +/* 30239 */ {(12<<2)|2,{55,65,0}}, +/* 30240 */ {(12<<2)|2,{55,95,0}}, +/* 30241 */ {(12<<2)|2,{55,95,0}}, +/* 30242 */ {(12<<2)|2,{55,95,0}}, +/* 30243 */ {(12<<2)|2,{55,95,0}}, +/* 30244 */ {(12<<2)|2,{55,95,0}}, +/* 30245 */ {(12<<2)|2,{55,95,0}}, +/* 30246 */ {(12<<2)|2,{55,95,0}}, +/* 30247 */ {(12<<2)|2,{55,95,0}}, +/* 30248 */ {(12<<2)|2,{55,95,0}}, +/* 30249 */ {(12<<2)|2,{55,95,0}}, +/* 30250 */ {(12<<2)|2,{55,95,0}}, +/* 30251 */ {(12<<2)|2,{55,95,0}}, +/* 30252 */ {(12<<2)|2,{55,95,0}}, +/* 30253 */ {(12<<2)|2,{55,95,0}}, +/* 30254 */ {(12<<2)|2,{55,95,0}}, +/* 30255 */ {(12<<2)|2,{55,95,0}}, +/* 30256 */ {(12<<2)|2,{55,98,0}}, +/* 30257 */ {(12<<2)|2,{55,98,0}}, +/* 30258 */ {(12<<2)|2,{55,98,0}}, +/* 30259 */ {(12<<2)|2,{55,98,0}}, +/* 30260 */ {(12<<2)|2,{55,98,0}}, +/* 30261 */ {(12<<2)|2,{55,98,0}}, +/* 30262 */ {(12<<2)|2,{55,98,0}}, +/* 30263 */ {(12<<2)|2,{55,98,0}}, +/* 30264 */ {(12<<2)|2,{55,98,0}}, +/* 30265 */ {(12<<2)|2,{55,98,0}}, +/* 30266 */ {(12<<2)|2,{55,98,0}}, +/* 30267 */ {(12<<2)|2,{55,98,0}}, +/* 30268 */ {(12<<2)|2,{55,98,0}}, +/* 30269 */ {(12<<2)|2,{55,98,0}}, +/* 30270 */ {(12<<2)|2,{55,98,0}}, +/* 30271 */ {(12<<2)|2,{55,98,0}}, +/* 30272 */ {(12<<2)|2,{55,100,0}}, +/* 30273 */ {(12<<2)|2,{55,100,0}}, +/* 30274 */ {(12<<2)|2,{55,100,0}}, +/* 30275 */ {(12<<2)|2,{55,100,0}}, +/* 30276 */ {(12<<2)|2,{55,100,0}}, +/* 30277 */ {(12<<2)|2,{55,100,0}}, +/* 30278 */ {(12<<2)|2,{55,100,0}}, +/* 30279 */ {(12<<2)|2,{55,100,0}}, +/* 30280 */ {(12<<2)|2,{55,100,0}}, +/* 30281 */ {(12<<2)|2,{55,100,0}}, +/* 30282 */ {(12<<2)|2,{55,100,0}}, +/* 30283 */ {(12<<2)|2,{55,100,0}}, +/* 30284 */ {(12<<2)|2,{55,100,0}}, +/* 30285 */ {(12<<2)|2,{55,100,0}}, +/* 30286 */ {(12<<2)|2,{55,100,0}}, +/* 30287 */ {(12<<2)|2,{55,100,0}}, +/* 30288 */ {(12<<2)|2,{55,102,0}}, +/* 30289 */ {(12<<2)|2,{55,102,0}}, +/* 30290 */ {(12<<2)|2,{55,102,0}}, +/* 30291 */ {(12<<2)|2,{55,102,0}}, +/* 30292 */ {(12<<2)|2,{55,102,0}}, +/* 30293 */ {(12<<2)|2,{55,102,0}}, +/* 30294 */ {(12<<2)|2,{55,102,0}}, +/* 30295 */ {(12<<2)|2,{55,102,0}}, +/* 30296 */ {(12<<2)|2,{55,102,0}}, +/* 30297 */ {(12<<2)|2,{55,102,0}}, +/* 30298 */ {(12<<2)|2,{55,102,0}}, +/* 30299 */ {(12<<2)|2,{55,102,0}}, +/* 30300 */ {(12<<2)|2,{55,102,0}}, +/* 30301 */ {(12<<2)|2,{55,102,0}}, +/* 30302 */ {(12<<2)|2,{55,102,0}}, +/* 30303 */ {(12<<2)|2,{55,102,0}}, +/* 30304 */ {(12<<2)|2,{55,103,0}}, +/* 30305 */ {(12<<2)|2,{55,103,0}}, +/* 30306 */ {(12<<2)|2,{55,103,0}}, +/* 30307 */ {(12<<2)|2,{55,103,0}}, +/* 30308 */ {(12<<2)|2,{55,103,0}}, +/* 30309 */ {(12<<2)|2,{55,103,0}}, +/* 30310 */ {(12<<2)|2,{55,103,0}}, +/* 30311 */ {(12<<2)|2,{55,103,0}}, +/* 30312 */ {(12<<2)|2,{55,103,0}}, +/* 30313 */ {(12<<2)|2,{55,103,0}}, +/* 30314 */ {(12<<2)|2,{55,103,0}}, +/* 30315 */ {(12<<2)|2,{55,103,0}}, +/* 30316 */ {(12<<2)|2,{55,103,0}}, +/* 30317 */ {(12<<2)|2,{55,103,0}}, +/* 30318 */ {(12<<2)|2,{55,103,0}}, +/* 30319 */ {(12<<2)|2,{55,103,0}}, +/* 30320 */ {(12<<2)|2,{55,104,0}}, +/* 30321 */ {(12<<2)|2,{55,104,0}}, +/* 30322 */ {(12<<2)|2,{55,104,0}}, +/* 30323 */ {(12<<2)|2,{55,104,0}}, +/* 30324 */ {(12<<2)|2,{55,104,0}}, +/* 30325 */ {(12<<2)|2,{55,104,0}}, +/* 30326 */ {(12<<2)|2,{55,104,0}}, +/* 30327 */ {(12<<2)|2,{55,104,0}}, +/* 30328 */ {(12<<2)|2,{55,104,0}}, +/* 30329 */ {(12<<2)|2,{55,104,0}}, +/* 30330 */ {(12<<2)|2,{55,104,0}}, +/* 30331 */ {(12<<2)|2,{55,104,0}}, +/* 30332 */ {(12<<2)|2,{55,104,0}}, +/* 30333 */ {(12<<2)|2,{55,104,0}}, +/* 30334 */ {(12<<2)|2,{55,104,0}}, +/* 30335 */ {(12<<2)|2,{55,104,0}}, +/* 30336 */ {(12<<2)|2,{55,108,0}}, +/* 30337 */ {(12<<2)|2,{55,108,0}}, +/* 30338 */ {(12<<2)|2,{55,108,0}}, +/* 30339 */ {(12<<2)|2,{55,108,0}}, +/* 30340 */ {(12<<2)|2,{55,108,0}}, +/* 30341 */ {(12<<2)|2,{55,108,0}}, +/* 30342 */ {(12<<2)|2,{55,108,0}}, +/* 30343 */ {(12<<2)|2,{55,108,0}}, +/* 30344 */ {(12<<2)|2,{55,108,0}}, +/* 30345 */ {(12<<2)|2,{55,108,0}}, +/* 30346 */ {(12<<2)|2,{55,108,0}}, +/* 30347 */ {(12<<2)|2,{55,108,0}}, +/* 30348 */ {(12<<2)|2,{55,108,0}}, +/* 30349 */ {(12<<2)|2,{55,108,0}}, +/* 30350 */ {(12<<2)|2,{55,108,0}}, +/* 30351 */ {(12<<2)|2,{55,108,0}}, +/* 30352 */ {(12<<2)|2,{55,109,0}}, +/* 30353 */ {(12<<2)|2,{55,109,0}}, +/* 30354 */ {(12<<2)|2,{55,109,0}}, +/* 30355 */ {(12<<2)|2,{55,109,0}}, +/* 30356 */ {(12<<2)|2,{55,109,0}}, +/* 30357 */ {(12<<2)|2,{55,109,0}}, +/* 30358 */ {(12<<2)|2,{55,109,0}}, +/* 30359 */ {(12<<2)|2,{55,109,0}}, +/* 30360 */ {(12<<2)|2,{55,109,0}}, +/* 30361 */ {(12<<2)|2,{55,109,0}}, +/* 30362 */ {(12<<2)|2,{55,109,0}}, +/* 30363 */ {(12<<2)|2,{55,109,0}}, +/* 30364 */ {(12<<2)|2,{55,109,0}}, +/* 30365 */ {(12<<2)|2,{55,109,0}}, +/* 30366 */ {(12<<2)|2,{55,109,0}}, +/* 30367 */ {(12<<2)|2,{55,109,0}}, +/* 30368 */ {(12<<2)|2,{55,110,0}}, +/* 30369 */ {(12<<2)|2,{55,110,0}}, +/* 30370 */ {(12<<2)|2,{55,110,0}}, +/* 30371 */ {(12<<2)|2,{55,110,0}}, +/* 30372 */ {(12<<2)|2,{55,110,0}}, +/* 30373 */ {(12<<2)|2,{55,110,0}}, +/* 30374 */ {(12<<2)|2,{55,110,0}}, +/* 30375 */ {(12<<2)|2,{55,110,0}}, +/* 30376 */ {(12<<2)|2,{55,110,0}}, +/* 30377 */ {(12<<2)|2,{55,110,0}}, +/* 30378 */ {(12<<2)|2,{55,110,0}}, +/* 30379 */ {(12<<2)|2,{55,110,0}}, +/* 30380 */ {(12<<2)|2,{55,110,0}}, +/* 30381 */ {(12<<2)|2,{55,110,0}}, +/* 30382 */ {(12<<2)|2,{55,110,0}}, +/* 30383 */ {(12<<2)|2,{55,110,0}}, +/* 30384 */ {(12<<2)|2,{55,112,0}}, +/* 30385 */ {(12<<2)|2,{55,112,0}}, +/* 30386 */ {(12<<2)|2,{55,112,0}}, +/* 30387 */ {(12<<2)|2,{55,112,0}}, +/* 30388 */ {(12<<2)|2,{55,112,0}}, +/* 30389 */ {(12<<2)|2,{55,112,0}}, +/* 30390 */ {(12<<2)|2,{55,112,0}}, +/* 30391 */ {(12<<2)|2,{55,112,0}}, +/* 30392 */ {(12<<2)|2,{55,112,0}}, +/* 30393 */ {(12<<2)|2,{55,112,0}}, +/* 30394 */ {(12<<2)|2,{55,112,0}}, +/* 30395 */ {(12<<2)|2,{55,112,0}}, +/* 30396 */ {(12<<2)|2,{55,112,0}}, +/* 30397 */ {(12<<2)|2,{55,112,0}}, +/* 30398 */ {(12<<2)|2,{55,112,0}}, +/* 30399 */ {(12<<2)|2,{55,112,0}}, +/* 30400 */ {(12<<2)|2,{55,114,0}}, +/* 30401 */ {(12<<2)|2,{55,114,0}}, +/* 30402 */ {(12<<2)|2,{55,114,0}}, +/* 30403 */ {(12<<2)|2,{55,114,0}}, +/* 30404 */ {(12<<2)|2,{55,114,0}}, +/* 30405 */ {(12<<2)|2,{55,114,0}}, +/* 30406 */ {(12<<2)|2,{55,114,0}}, +/* 30407 */ {(12<<2)|2,{55,114,0}}, +/* 30408 */ {(12<<2)|2,{55,114,0}}, +/* 30409 */ {(12<<2)|2,{55,114,0}}, +/* 30410 */ {(12<<2)|2,{55,114,0}}, +/* 30411 */ {(12<<2)|2,{55,114,0}}, +/* 30412 */ {(12<<2)|2,{55,114,0}}, +/* 30413 */ {(12<<2)|2,{55,114,0}}, +/* 30414 */ {(12<<2)|2,{55,114,0}}, +/* 30415 */ {(12<<2)|2,{55,114,0}}, +/* 30416 */ {(12<<2)|2,{55,117,0}}, +/* 30417 */ {(12<<2)|2,{55,117,0}}, +/* 30418 */ {(12<<2)|2,{55,117,0}}, +/* 30419 */ {(12<<2)|2,{55,117,0}}, +/* 30420 */ {(12<<2)|2,{55,117,0}}, +/* 30421 */ {(12<<2)|2,{55,117,0}}, +/* 30422 */ {(12<<2)|2,{55,117,0}}, +/* 30423 */ {(12<<2)|2,{55,117,0}}, +/* 30424 */ {(12<<2)|2,{55,117,0}}, +/* 30425 */ {(12<<2)|2,{55,117,0}}, +/* 30426 */ {(12<<2)|2,{55,117,0}}, +/* 30427 */ {(12<<2)|2,{55,117,0}}, +/* 30428 */ {(12<<2)|2,{55,117,0}}, +/* 30429 */ {(12<<2)|2,{55,117,0}}, +/* 30430 */ {(12<<2)|2,{55,117,0}}, +/* 30431 */ {(12<<2)|2,{55,117,0}}, +/* 30432 */ {(13<<2)|2,{55,58,0}}, +/* 30433 */ {(13<<2)|2,{55,58,0}}, +/* 30434 */ {(13<<2)|2,{55,58,0}}, +/* 30435 */ {(13<<2)|2,{55,58,0}}, +/* 30436 */ {(13<<2)|2,{55,58,0}}, +/* 30437 */ {(13<<2)|2,{55,58,0}}, +/* 30438 */ {(13<<2)|2,{55,58,0}}, +/* 30439 */ {(13<<2)|2,{55,58,0}}, +/* 30440 */ {(13<<2)|2,{55,66,0}}, +/* 30441 */ {(13<<2)|2,{55,66,0}}, +/* 30442 */ {(13<<2)|2,{55,66,0}}, +/* 30443 */ {(13<<2)|2,{55,66,0}}, +/* 30444 */ {(13<<2)|2,{55,66,0}}, +/* 30445 */ {(13<<2)|2,{55,66,0}}, +/* 30446 */ {(13<<2)|2,{55,66,0}}, +/* 30447 */ {(13<<2)|2,{55,66,0}}, +/* 30448 */ {(13<<2)|2,{55,67,0}}, +/* 30449 */ {(13<<2)|2,{55,67,0}}, +/* 30450 */ {(13<<2)|2,{55,67,0}}, +/* 30451 */ {(13<<2)|2,{55,67,0}}, +/* 30452 */ {(13<<2)|2,{55,67,0}}, +/* 30453 */ {(13<<2)|2,{55,67,0}}, +/* 30454 */ {(13<<2)|2,{55,67,0}}, +/* 30455 */ {(13<<2)|2,{55,67,0}}, +/* 30456 */ {(13<<2)|2,{55,68,0}}, +/* 30457 */ {(13<<2)|2,{55,68,0}}, +/* 30458 */ {(13<<2)|2,{55,68,0}}, +/* 30459 */ {(13<<2)|2,{55,68,0}}, +/* 30460 */ {(13<<2)|2,{55,68,0}}, +/* 30461 */ {(13<<2)|2,{55,68,0}}, +/* 30462 */ {(13<<2)|2,{55,68,0}}, +/* 30463 */ {(13<<2)|2,{55,68,0}}, +/* 30464 */ {(13<<2)|2,{55,69,0}}, +/* 30465 */ {(13<<2)|2,{55,69,0}}, +/* 30466 */ {(13<<2)|2,{55,69,0}}, +/* 30467 */ {(13<<2)|2,{55,69,0}}, +/* 30468 */ {(13<<2)|2,{55,69,0}}, +/* 30469 */ {(13<<2)|2,{55,69,0}}, +/* 30470 */ {(13<<2)|2,{55,69,0}}, +/* 30471 */ {(13<<2)|2,{55,69,0}}, +/* 30472 */ {(13<<2)|2,{55,70,0}}, +/* 30473 */ {(13<<2)|2,{55,70,0}}, +/* 30474 */ {(13<<2)|2,{55,70,0}}, +/* 30475 */ {(13<<2)|2,{55,70,0}}, +/* 30476 */ {(13<<2)|2,{55,70,0}}, +/* 30477 */ {(13<<2)|2,{55,70,0}}, +/* 30478 */ {(13<<2)|2,{55,70,0}}, +/* 30479 */ {(13<<2)|2,{55,70,0}}, +/* 30480 */ {(13<<2)|2,{55,71,0}}, +/* 30481 */ {(13<<2)|2,{55,71,0}}, +/* 30482 */ {(13<<2)|2,{55,71,0}}, +/* 30483 */ {(13<<2)|2,{55,71,0}}, +/* 30484 */ {(13<<2)|2,{55,71,0}}, +/* 30485 */ {(13<<2)|2,{55,71,0}}, +/* 30486 */ {(13<<2)|2,{55,71,0}}, +/* 30487 */ {(13<<2)|2,{55,71,0}}, +/* 30488 */ {(13<<2)|2,{55,72,0}}, +/* 30489 */ {(13<<2)|2,{55,72,0}}, +/* 30490 */ {(13<<2)|2,{55,72,0}}, +/* 30491 */ {(13<<2)|2,{55,72,0}}, +/* 30492 */ {(13<<2)|2,{55,72,0}}, +/* 30493 */ {(13<<2)|2,{55,72,0}}, +/* 30494 */ {(13<<2)|2,{55,72,0}}, +/* 30495 */ {(13<<2)|2,{55,72,0}}, +/* 30496 */ {(13<<2)|2,{55,73,0}}, +/* 30497 */ {(13<<2)|2,{55,73,0}}, +/* 30498 */ {(13<<2)|2,{55,73,0}}, +/* 30499 */ {(13<<2)|2,{55,73,0}}, +/* 30500 */ {(13<<2)|2,{55,73,0}}, +/* 30501 */ {(13<<2)|2,{55,73,0}}, +/* 30502 */ {(13<<2)|2,{55,73,0}}, +/* 30503 */ {(13<<2)|2,{55,73,0}}, +/* 30504 */ {(13<<2)|2,{55,74,0}}, +/* 30505 */ {(13<<2)|2,{55,74,0}}, +/* 30506 */ {(13<<2)|2,{55,74,0}}, +/* 30507 */ {(13<<2)|2,{55,74,0}}, +/* 30508 */ {(13<<2)|2,{55,74,0}}, +/* 30509 */ {(13<<2)|2,{55,74,0}}, +/* 30510 */ {(13<<2)|2,{55,74,0}}, +/* 30511 */ {(13<<2)|2,{55,74,0}}, +/* 30512 */ {(13<<2)|2,{55,75,0}}, +/* 30513 */ {(13<<2)|2,{55,75,0}}, +/* 30514 */ {(13<<2)|2,{55,75,0}}, +/* 30515 */ {(13<<2)|2,{55,75,0}}, +/* 30516 */ {(13<<2)|2,{55,75,0}}, +/* 30517 */ {(13<<2)|2,{55,75,0}}, +/* 30518 */ {(13<<2)|2,{55,75,0}}, +/* 30519 */ {(13<<2)|2,{55,75,0}}, +/* 30520 */ {(13<<2)|2,{55,76,0}}, +/* 30521 */ {(13<<2)|2,{55,76,0}}, +/* 30522 */ {(13<<2)|2,{55,76,0}}, +/* 30523 */ {(13<<2)|2,{55,76,0}}, +/* 30524 */ {(13<<2)|2,{55,76,0}}, +/* 30525 */ {(13<<2)|2,{55,76,0}}, +/* 30526 */ {(13<<2)|2,{55,76,0}}, +/* 30527 */ {(13<<2)|2,{55,76,0}}, +/* 30528 */ {(13<<2)|2,{55,77,0}}, +/* 30529 */ {(13<<2)|2,{55,77,0}}, +/* 30530 */ {(13<<2)|2,{55,77,0}}, +/* 30531 */ {(13<<2)|2,{55,77,0}}, +/* 30532 */ {(13<<2)|2,{55,77,0}}, +/* 30533 */ {(13<<2)|2,{55,77,0}}, +/* 30534 */ {(13<<2)|2,{55,77,0}}, +/* 30535 */ {(13<<2)|2,{55,77,0}}, +/* 30536 */ {(13<<2)|2,{55,78,0}}, +/* 30537 */ {(13<<2)|2,{55,78,0}}, +/* 30538 */ {(13<<2)|2,{55,78,0}}, +/* 30539 */ {(13<<2)|2,{55,78,0}}, +/* 30540 */ {(13<<2)|2,{55,78,0}}, +/* 30541 */ {(13<<2)|2,{55,78,0}}, +/* 30542 */ {(13<<2)|2,{55,78,0}}, +/* 30543 */ {(13<<2)|2,{55,78,0}}, +/* 30544 */ {(13<<2)|2,{55,79,0}}, +/* 30545 */ {(13<<2)|2,{55,79,0}}, +/* 30546 */ {(13<<2)|2,{55,79,0}}, +/* 30547 */ {(13<<2)|2,{55,79,0}}, +/* 30548 */ {(13<<2)|2,{55,79,0}}, +/* 30549 */ {(13<<2)|2,{55,79,0}}, +/* 30550 */ {(13<<2)|2,{55,79,0}}, +/* 30551 */ {(13<<2)|2,{55,79,0}}, +/* 30552 */ {(13<<2)|2,{55,80,0}}, +/* 30553 */ {(13<<2)|2,{55,80,0}}, +/* 30554 */ {(13<<2)|2,{55,80,0}}, +/* 30555 */ {(13<<2)|2,{55,80,0}}, +/* 30556 */ {(13<<2)|2,{55,80,0}}, +/* 30557 */ {(13<<2)|2,{55,80,0}}, +/* 30558 */ {(13<<2)|2,{55,80,0}}, +/* 30559 */ {(13<<2)|2,{55,80,0}}, +/* 30560 */ {(13<<2)|2,{55,81,0}}, +/* 30561 */ {(13<<2)|2,{55,81,0}}, +/* 30562 */ {(13<<2)|2,{55,81,0}}, +/* 30563 */ {(13<<2)|2,{55,81,0}}, +/* 30564 */ {(13<<2)|2,{55,81,0}}, +/* 30565 */ {(13<<2)|2,{55,81,0}}, +/* 30566 */ {(13<<2)|2,{55,81,0}}, +/* 30567 */ {(13<<2)|2,{55,81,0}}, +/* 30568 */ {(13<<2)|2,{55,82,0}}, +/* 30569 */ {(13<<2)|2,{55,82,0}}, +/* 30570 */ {(13<<2)|2,{55,82,0}}, +/* 30571 */ {(13<<2)|2,{55,82,0}}, +/* 30572 */ {(13<<2)|2,{55,82,0}}, +/* 30573 */ {(13<<2)|2,{55,82,0}}, +/* 30574 */ {(13<<2)|2,{55,82,0}}, +/* 30575 */ {(13<<2)|2,{55,82,0}}, +/* 30576 */ {(13<<2)|2,{55,83,0}}, +/* 30577 */ {(13<<2)|2,{55,83,0}}, +/* 30578 */ {(13<<2)|2,{55,83,0}}, +/* 30579 */ {(13<<2)|2,{55,83,0}}, +/* 30580 */ {(13<<2)|2,{55,83,0}}, +/* 30581 */ {(13<<2)|2,{55,83,0}}, +/* 30582 */ {(13<<2)|2,{55,83,0}}, +/* 30583 */ {(13<<2)|2,{55,83,0}}, +/* 30584 */ {(13<<2)|2,{55,84,0}}, +/* 30585 */ {(13<<2)|2,{55,84,0}}, +/* 30586 */ {(13<<2)|2,{55,84,0}}, +/* 30587 */ {(13<<2)|2,{55,84,0}}, +/* 30588 */ {(13<<2)|2,{55,84,0}}, +/* 30589 */ {(13<<2)|2,{55,84,0}}, +/* 30590 */ {(13<<2)|2,{55,84,0}}, +/* 30591 */ {(13<<2)|2,{55,84,0}}, +/* 30592 */ {(13<<2)|2,{55,85,0}}, +/* 30593 */ {(13<<2)|2,{55,85,0}}, +/* 30594 */ {(13<<2)|2,{55,85,0}}, +/* 30595 */ {(13<<2)|2,{55,85,0}}, +/* 30596 */ {(13<<2)|2,{55,85,0}}, +/* 30597 */ {(13<<2)|2,{55,85,0}}, +/* 30598 */ {(13<<2)|2,{55,85,0}}, +/* 30599 */ {(13<<2)|2,{55,85,0}}, +/* 30600 */ {(13<<2)|2,{55,86,0}}, +/* 30601 */ {(13<<2)|2,{55,86,0}}, +/* 30602 */ {(13<<2)|2,{55,86,0}}, +/* 30603 */ {(13<<2)|2,{55,86,0}}, +/* 30604 */ {(13<<2)|2,{55,86,0}}, +/* 30605 */ {(13<<2)|2,{55,86,0}}, +/* 30606 */ {(13<<2)|2,{55,86,0}}, +/* 30607 */ {(13<<2)|2,{55,86,0}}, +/* 30608 */ {(13<<2)|2,{55,87,0}}, +/* 30609 */ {(13<<2)|2,{55,87,0}}, +/* 30610 */ {(13<<2)|2,{55,87,0}}, +/* 30611 */ {(13<<2)|2,{55,87,0}}, +/* 30612 */ {(13<<2)|2,{55,87,0}}, +/* 30613 */ {(13<<2)|2,{55,87,0}}, +/* 30614 */ {(13<<2)|2,{55,87,0}}, +/* 30615 */ {(13<<2)|2,{55,87,0}}, +/* 30616 */ {(13<<2)|2,{55,89,0}}, +/* 30617 */ {(13<<2)|2,{55,89,0}}, +/* 30618 */ {(13<<2)|2,{55,89,0}}, +/* 30619 */ {(13<<2)|2,{55,89,0}}, +/* 30620 */ {(13<<2)|2,{55,89,0}}, +/* 30621 */ {(13<<2)|2,{55,89,0}}, +/* 30622 */ {(13<<2)|2,{55,89,0}}, +/* 30623 */ {(13<<2)|2,{55,89,0}}, +/* 30624 */ {(13<<2)|2,{55,106,0}}, +/* 30625 */ {(13<<2)|2,{55,106,0}}, +/* 30626 */ {(13<<2)|2,{55,106,0}}, +/* 30627 */ {(13<<2)|2,{55,106,0}}, +/* 30628 */ {(13<<2)|2,{55,106,0}}, +/* 30629 */ {(13<<2)|2,{55,106,0}}, +/* 30630 */ {(13<<2)|2,{55,106,0}}, +/* 30631 */ {(13<<2)|2,{55,106,0}}, +/* 30632 */ {(13<<2)|2,{55,107,0}}, +/* 30633 */ {(13<<2)|2,{55,107,0}}, +/* 30634 */ {(13<<2)|2,{55,107,0}}, +/* 30635 */ {(13<<2)|2,{55,107,0}}, +/* 30636 */ {(13<<2)|2,{55,107,0}}, +/* 30637 */ {(13<<2)|2,{55,107,0}}, +/* 30638 */ {(13<<2)|2,{55,107,0}}, +/* 30639 */ {(13<<2)|2,{55,107,0}}, +/* 30640 */ {(13<<2)|2,{55,113,0}}, +/* 30641 */ {(13<<2)|2,{55,113,0}}, +/* 30642 */ {(13<<2)|2,{55,113,0}}, +/* 30643 */ {(13<<2)|2,{55,113,0}}, +/* 30644 */ {(13<<2)|2,{55,113,0}}, +/* 30645 */ {(13<<2)|2,{55,113,0}}, +/* 30646 */ {(13<<2)|2,{55,113,0}}, +/* 30647 */ {(13<<2)|2,{55,113,0}}, +/* 30648 */ {(13<<2)|2,{55,118,0}}, +/* 30649 */ {(13<<2)|2,{55,118,0}}, +/* 30650 */ {(13<<2)|2,{55,118,0}}, +/* 30651 */ {(13<<2)|2,{55,118,0}}, +/* 30652 */ {(13<<2)|2,{55,118,0}}, +/* 30653 */ {(13<<2)|2,{55,118,0}}, +/* 30654 */ {(13<<2)|2,{55,118,0}}, +/* 30655 */ {(13<<2)|2,{55,118,0}}, +/* 30656 */ {(13<<2)|2,{55,119,0}}, +/* 30657 */ {(13<<2)|2,{55,119,0}}, +/* 30658 */ {(13<<2)|2,{55,119,0}}, +/* 30659 */ {(13<<2)|2,{55,119,0}}, +/* 30660 */ {(13<<2)|2,{55,119,0}}, +/* 30661 */ {(13<<2)|2,{55,119,0}}, +/* 30662 */ {(13<<2)|2,{55,119,0}}, +/* 30663 */ {(13<<2)|2,{55,119,0}}, +/* 30664 */ {(13<<2)|2,{55,120,0}}, +/* 30665 */ {(13<<2)|2,{55,120,0}}, +/* 30666 */ {(13<<2)|2,{55,120,0}}, +/* 30667 */ {(13<<2)|2,{55,120,0}}, +/* 30668 */ {(13<<2)|2,{55,120,0}}, +/* 30669 */ {(13<<2)|2,{55,120,0}}, +/* 30670 */ {(13<<2)|2,{55,120,0}}, +/* 30671 */ {(13<<2)|2,{55,120,0}}, +/* 30672 */ {(13<<2)|2,{55,121,0}}, +/* 30673 */ {(13<<2)|2,{55,121,0}}, +/* 30674 */ {(13<<2)|2,{55,121,0}}, +/* 30675 */ {(13<<2)|2,{55,121,0}}, +/* 30676 */ {(13<<2)|2,{55,121,0}}, +/* 30677 */ {(13<<2)|2,{55,121,0}}, +/* 30678 */ {(13<<2)|2,{55,121,0}}, +/* 30679 */ {(13<<2)|2,{55,121,0}}, +/* 30680 */ {(13<<2)|2,{55,122,0}}, +/* 30681 */ {(13<<2)|2,{55,122,0}}, +/* 30682 */ {(13<<2)|2,{55,122,0}}, +/* 30683 */ {(13<<2)|2,{55,122,0}}, +/* 30684 */ {(13<<2)|2,{55,122,0}}, +/* 30685 */ {(13<<2)|2,{55,122,0}}, +/* 30686 */ {(13<<2)|2,{55,122,0}}, +/* 30687 */ {(13<<2)|2,{55,122,0}}, +/* 30688 */ {(14<<2)|2,{55,38,0}}, +/* 30689 */ {(14<<2)|2,{55,38,0}}, +/* 30690 */ {(14<<2)|2,{55,38,0}}, +/* 30691 */ {(14<<2)|2,{55,38,0}}, +/* 30692 */ {(14<<2)|2,{55,42,0}}, +/* 30693 */ {(14<<2)|2,{55,42,0}}, +/* 30694 */ {(14<<2)|2,{55,42,0}}, +/* 30695 */ {(14<<2)|2,{55,42,0}}, +/* 30696 */ {(14<<2)|2,{55,44,0}}, +/* 30697 */ {(14<<2)|2,{55,44,0}}, +/* 30698 */ {(14<<2)|2,{55,44,0}}, +/* 30699 */ {(14<<2)|2,{55,44,0}}, +/* 30700 */ {(14<<2)|2,{55,59,0}}, +/* 30701 */ {(14<<2)|2,{55,59,0}}, +/* 30702 */ {(14<<2)|2,{55,59,0}}, +/* 30703 */ {(14<<2)|2,{55,59,0}}, +/* 30704 */ {(14<<2)|2,{55,88,0}}, +/* 30705 */ {(14<<2)|2,{55,88,0}}, +/* 30706 */ {(14<<2)|2,{55,88,0}}, +/* 30707 */ {(14<<2)|2,{55,88,0}}, +/* 30708 */ {(14<<2)|2,{55,90,0}}, +/* 30709 */ {(14<<2)|2,{55,90,0}}, +/* 30710 */ {(14<<2)|2,{55,90,0}}, +/* 30711 */ {(14<<2)|2,{55,90,0}}, +/* 30712 */ {(16<<2)|2,{55,33,0}}, +/* 30713 */ {(16<<2)|2,{55,34,0}}, +/* 30714 */ {(16<<2)|2,{55,40,0}}, +/* 30715 */ {(16<<2)|2,{55,41,0}}, +/* 30716 */ {(16<<2)|2,{55,63,0}}, +/* 30717 */ {(6<<2)|1,{55,0,0}}, +/* 30718 */ {(6<<2)|1,{55,0,0}}, +/* 30719 */ {(6<<2)|1,{55,0,0}}, +/* 30720 */ {(16<<2)|3,{56,48,48}}, +/* 30721 */ {(16<<2)|3,{56,48,49}}, +/* 30722 */ {(16<<2)|3,{56,48,50}}, +/* 30723 */ {(16<<2)|3,{56,48,97}}, +/* 30724 */ {(16<<2)|3,{56,48,99}}, +/* 30725 */ {(16<<2)|3,{56,48,101}}, +/* 30726 */ {(16<<2)|3,{56,48,105}}, +/* 30727 */ {(16<<2)|3,{56,48,111}}, +/* 30728 */ {(16<<2)|3,{56,48,115}}, +/* 30729 */ {(16<<2)|3,{56,48,116}}, +/* 30730 */ {(11<<2)|2,{56,48,0}}, +/* 30731 */ {(11<<2)|2,{56,48,0}}, +/* 30732 */ {(11<<2)|2,{56,48,0}}, +/* 30733 */ {(11<<2)|2,{56,48,0}}, +/* 30734 */ {(11<<2)|2,{56,48,0}}, +/* 30735 */ {(11<<2)|2,{56,48,0}}, +/* 30736 */ {(11<<2)|2,{56,48,0}}, +/* 30737 */ {(11<<2)|2,{56,48,0}}, +/* 30738 */ {(11<<2)|2,{56,48,0}}, +/* 30739 */ {(11<<2)|2,{56,48,0}}, +/* 30740 */ {(11<<2)|2,{56,48,0}}, +/* 30741 */ {(11<<2)|2,{56,48,0}}, +/* 30742 */ {(11<<2)|2,{56,48,0}}, +/* 30743 */ {(11<<2)|2,{56,48,0}}, +/* 30744 */ {(11<<2)|2,{56,48,0}}, +/* 30745 */ {(11<<2)|2,{56,48,0}}, +/* 30746 */ {(11<<2)|2,{56,48,0}}, +/* 30747 */ {(11<<2)|2,{56,48,0}}, +/* 30748 */ {(11<<2)|2,{56,48,0}}, +/* 30749 */ {(11<<2)|2,{56,48,0}}, +/* 30750 */ {(11<<2)|2,{56,48,0}}, +/* 30751 */ {(11<<2)|2,{56,48,0}}, +/* 30752 */ {(16<<2)|3,{56,49,48}}, +/* 30753 */ {(16<<2)|3,{56,49,49}}, +/* 30754 */ {(16<<2)|3,{56,49,50}}, +/* 30755 */ {(16<<2)|3,{56,49,97}}, +/* 30756 */ {(16<<2)|3,{56,49,99}}, +/* 30757 */ {(16<<2)|3,{56,49,101}}, +/* 30758 */ {(16<<2)|3,{56,49,105}}, +/* 30759 */ {(16<<2)|3,{56,49,111}}, +/* 30760 */ {(16<<2)|3,{56,49,115}}, +/* 30761 */ {(16<<2)|3,{56,49,116}}, +/* 30762 */ {(11<<2)|2,{56,49,0}}, +/* 30763 */ {(11<<2)|2,{56,49,0}}, +/* 30764 */ {(11<<2)|2,{56,49,0}}, +/* 30765 */ {(11<<2)|2,{56,49,0}}, +/* 30766 */ {(11<<2)|2,{56,49,0}}, +/* 30767 */ {(11<<2)|2,{56,49,0}}, +/* 30768 */ {(11<<2)|2,{56,49,0}}, +/* 30769 */ {(11<<2)|2,{56,49,0}}, +/* 30770 */ {(11<<2)|2,{56,49,0}}, +/* 30771 */ {(11<<2)|2,{56,49,0}}, +/* 30772 */ {(11<<2)|2,{56,49,0}}, +/* 30773 */ {(11<<2)|2,{56,49,0}}, +/* 30774 */ {(11<<2)|2,{56,49,0}}, +/* 30775 */ {(11<<2)|2,{56,49,0}}, +/* 30776 */ {(11<<2)|2,{56,49,0}}, +/* 30777 */ {(11<<2)|2,{56,49,0}}, +/* 30778 */ {(11<<2)|2,{56,49,0}}, +/* 30779 */ {(11<<2)|2,{56,49,0}}, +/* 30780 */ {(11<<2)|2,{56,49,0}}, +/* 30781 */ {(11<<2)|2,{56,49,0}}, +/* 30782 */ {(11<<2)|2,{56,49,0}}, +/* 30783 */ {(11<<2)|2,{56,49,0}}, +/* 30784 */ {(16<<2)|3,{56,50,48}}, +/* 30785 */ {(16<<2)|3,{56,50,49}}, +/* 30786 */ {(16<<2)|3,{56,50,50}}, +/* 30787 */ {(16<<2)|3,{56,50,97}}, +/* 30788 */ {(16<<2)|3,{56,50,99}}, +/* 30789 */ {(16<<2)|3,{56,50,101}}, +/* 30790 */ {(16<<2)|3,{56,50,105}}, +/* 30791 */ {(16<<2)|3,{56,50,111}}, +/* 30792 */ {(16<<2)|3,{56,50,115}}, +/* 30793 */ {(16<<2)|3,{56,50,116}}, +/* 30794 */ {(11<<2)|2,{56,50,0}}, +/* 30795 */ {(11<<2)|2,{56,50,0}}, +/* 30796 */ {(11<<2)|2,{56,50,0}}, +/* 30797 */ {(11<<2)|2,{56,50,0}}, +/* 30798 */ {(11<<2)|2,{56,50,0}}, +/* 30799 */ {(11<<2)|2,{56,50,0}}, +/* 30800 */ {(11<<2)|2,{56,50,0}}, +/* 30801 */ {(11<<2)|2,{56,50,0}}, +/* 30802 */ {(11<<2)|2,{56,50,0}}, +/* 30803 */ {(11<<2)|2,{56,50,0}}, +/* 30804 */ {(11<<2)|2,{56,50,0}}, +/* 30805 */ {(11<<2)|2,{56,50,0}}, +/* 30806 */ {(11<<2)|2,{56,50,0}}, +/* 30807 */ {(11<<2)|2,{56,50,0}}, +/* 30808 */ {(11<<2)|2,{56,50,0}}, +/* 30809 */ {(11<<2)|2,{56,50,0}}, +/* 30810 */ {(11<<2)|2,{56,50,0}}, +/* 30811 */ {(11<<2)|2,{56,50,0}}, +/* 30812 */ {(11<<2)|2,{56,50,0}}, +/* 30813 */ {(11<<2)|2,{56,50,0}}, +/* 30814 */ {(11<<2)|2,{56,50,0}}, +/* 30815 */ {(11<<2)|2,{56,50,0}}, +/* 30816 */ {(16<<2)|3,{56,97,48}}, +/* 30817 */ {(16<<2)|3,{56,97,49}}, +/* 30818 */ {(16<<2)|3,{56,97,50}}, +/* 30819 */ {(16<<2)|3,{56,97,97}}, +/* 30820 */ {(16<<2)|3,{56,97,99}}, +/* 30821 */ {(16<<2)|3,{56,97,101}}, +/* 30822 */ {(16<<2)|3,{56,97,105}}, +/* 30823 */ {(16<<2)|3,{56,97,111}}, +/* 30824 */ {(16<<2)|3,{56,97,115}}, +/* 30825 */ {(16<<2)|3,{56,97,116}}, +/* 30826 */ {(11<<2)|2,{56,97,0}}, +/* 30827 */ {(11<<2)|2,{56,97,0}}, +/* 30828 */ {(11<<2)|2,{56,97,0}}, +/* 30829 */ {(11<<2)|2,{56,97,0}}, +/* 30830 */ {(11<<2)|2,{56,97,0}}, +/* 30831 */ {(11<<2)|2,{56,97,0}}, +/* 30832 */ {(11<<2)|2,{56,97,0}}, +/* 30833 */ {(11<<2)|2,{56,97,0}}, +/* 30834 */ {(11<<2)|2,{56,97,0}}, +/* 30835 */ {(11<<2)|2,{56,97,0}}, +/* 30836 */ {(11<<2)|2,{56,97,0}}, +/* 30837 */ {(11<<2)|2,{56,97,0}}, +/* 30838 */ {(11<<2)|2,{56,97,0}}, +/* 30839 */ {(11<<2)|2,{56,97,0}}, +/* 30840 */ {(11<<2)|2,{56,97,0}}, +/* 30841 */ {(11<<2)|2,{56,97,0}}, +/* 30842 */ {(11<<2)|2,{56,97,0}}, +/* 30843 */ {(11<<2)|2,{56,97,0}}, +/* 30844 */ {(11<<2)|2,{56,97,0}}, +/* 30845 */ {(11<<2)|2,{56,97,0}}, +/* 30846 */ {(11<<2)|2,{56,97,0}}, +/* 30847 */ {(11<<2)|2,{56,97,0}}, +/* 30848 */ {(16<<2)|3,{56,99,48}}, +/* 30849 */ {(16<<2)|3,{56,99,49}}, +/* 30850 */ {(16<<2)|3,{56,99,50}}, +/* 30851 */ {(16<<2)|3,{56,99,97}}, +/* 30852 */ {(16<<2)|3,{56,99,99}}, +/* 30853 */ {(16<<2)|3,{56,99,101}}, +/* 30854 */ {(16<<2)|3,{56,99,105}}, +/* 30855 */ {(16<<2)|3,{56,99,111}}, +/* 30856 */ {(16<<2)|3,{56,99,115}}, +/* 30857 */ {(16<<2)|3,{56,99,116}}, +/* 30858 */ {(11<<2)|2,{56,99,0}}, +/* 30859 */ {(11<<2)|2,{56,99,0}}, +/* 30860 */ {(11<<2)|2,{56,99,0}}, +/* 30861 */ {(11<<2)|2,{56,99,0}}, +/* 30862 */ {(11<<2)|2,{56,99,0}}, +/* 30863 */ {(11<<2)|2,{56,99,0}}, +/* 30864 */ {(11<<2)|2,{56,99,0}}, +/* 30865 */ {(11<<2)|2,{56,99,0}}, +/* 30866 */ {(11<<2)|2,{56,99,0}}, +/* 30867 */ {(11<<2)|2,{56,99,0}}, +/* 30868 */ {(11<<2)|2,{56,99,0}}, +/* 30869 */ {(11<<2)|2,{56,99,0}}, +/* 30870 */ {(11<<2)|2,{56,99,0}}, +/* 30871 */ {(11<<2)|2,{56,99,0}}, +/* 30872 */ {(11<<2)|2,{56,99,0}}, +/* 30873 */ {(11<<2)|2,{56,99,0}}, +/* 30874 */ {(11<<2)|2,{56,99,0}}, +/* 30875 */ {(11<<2)|2,{56,99,0}}, +/* 30876 */ {(11<<2)|2,{56,99,0}}, +/* 30877 */ {(11<<2)|2,{56,99,0}}, +/* 30878 */ {(11<<2)|2,{56,99,0}}, +/* 30879 */ {(11<<2)|2,{56,99,0}}, +/* 30880 */ {(16<<2)|3,{56,101,48}}, +/* 30881 */ {(16<<2)|3,{56,101,49}}, +/* 30882 */ {(16<<2)|3,{56,101,50}}, +/* 30883 */ {(16<<2)|3,{56,101,97}}, +/* 30884 */ {(16<<2)|3,{56,101,99}}, +/* 30885 */ {(16<<2)|3,{56,101,101}}, +/* 30886 */ {(16<<2)|3,{56,101,105}}, +/* 30887 */ {(16<<2)|3,{56,101,111}}, +/* 30888 */ {(16<<2)|3,{56,101,115}}, +/* 30889 */ {(16<<2)|3,{56,101,116}}, +/* 30890 */ {(11<<2)|2,{56,101,0}}, +/* 30891 */ {(11<<2)|2,{56,101,0}}, +/* 30892 */ {(11<<2)|2,{56,101,0}}, +/* 30893 */ {(11<<2)|2,{56,101,0}}, +/* 30894 */ {(11<<2)|2,{56,101,0}}, +/* 30895 */ {(11<<2)|2,{56,101,0}}, +/* 30896 */ {(11<<2)|2,{56,101,0}}, +/* 30897 */ {(11<<2)|2,{56,101,0}}, +/* 30898 */ {(11<<2)|2,{56,101,0}}, +/* 30899 */ {(11<<2)|2,{56,101,0}}, +/* 30900 */ {(11<<2)|2,{56,101,0}}, +/* 30901 */ {(11<<2)|2,{56,101,0}}, +/* 30902 */ {(11<<2)|2,{56,101,0}}, +/* 30903 */ {(11<<2)|2,{56,101,0}}, +/* 30904 */ {(11<<2)|2,{56,101,0}}, +/* 30905 */ {(11<<2)|2,{56,101,0}}, +/* 30906 */ {(11<<2)|2,{56,101,0}}, +/* 30907 */ {(11<<2)|2,{56,101,0}}, +/* 30908 */ {(11<<2)|2,{56,101,0}}, +/* 30909 */ {(11<<2)|2,{56,101,0}}, +/* 30910 */ {(11<<2)|2,{56,101,0}}, +/* 30911 */ {(11<<2)|2,{56,101,0}}, +/* 30912 */ {(16<<2)|3,{56,105,48}}, +/* 30913 */ {(16<<2)|3,{56,105,49}}, +/* 30914 */ {(16<<2)|3,{56,105,50}}, +/* 30915 */ {(16<<2)|3,{56,105,97}}, +/* 30916 */ {(16<<2)|3,{56,105,99}}, +/* 30917 */ {(16<<2)|3,{56,105,101}}, +/* 30918 */ {(16<<2)|3,{56,105,105}}, +/* 30919 */ {(16<<2)|3,{56,105,111}}, +/* 30920 */ {(16<<2)|3,{56,105,115}}, +/* 30921 */ {(16<<2)|3,{56,105,116}}, +/* 30922 */ {(11<<2)|2,{56,105,0}}, +/* 30923 */ {(11<<2)|2,{56,105,0}}, +/* 30924 */ {(11<<2)|2,{56,105,0}}, +/* 30925 */ {(11<<2)|2,{56,105,0}}, +/* 30926 */ {(11<<2)|2,{56,105,0}}, +/* 30927 */ {(11<<2)|2,{56,105,0}}, +/* 30928 */ {(11<<2)|2,{56,105,0}}, +/* 30929 */ {(11<<2)|2,{56,105,0}}, +/* 30930 */ {(11<<2)|2,{56,105,0}}, +/* 30931 */ {(11<<2)|2,{56,105,0}}, +/* 30932 */ {(11<<2)|2,{56,105,0}}, +/* 30933 */ {(11<<2)|2,{56,105,0}}, +/* 30934 */ {(11<<2)|2,{56,105,0}}, +/* 30935 */ {(11<<2)|2,{56,105,0}}, +/* 30936 */ {(11<<2)|2,{56,105,0}}, +/* 30937 */ {(11<<2)|2,{56,105,0}}, +/* 30938 */ {(11<<2)|2,{56,105,0}}, +/* 30939 */ {(11<<2)|2,{56,105,0}}, +/* 30940 */ {(11<<2)|2,{56,105,0}}, +/* 30941 */ {(11<<2)|2,{56,105,0}}, +/* 30942 */ {(11<<2)|2,{56,105,0}}, +/* 30943 */ {(11<<2)|2,{56,105,0}}, +/* 30944 */ {(16<<2)|3,{56,111,48}}, +/* 30945 */ {(16<<2)|3,{56,111,49}}, +/* 30946 */ {(16<<2)|3,{56,111,50}}, +/* 30947 */ {(16<<2)|3,{56,111,97}}, +/* 30948 */ {(16<<2)|3,{56,111,99}}, +/* 30949 */ {(16<<2)|3,{56,111,101}}, +/* 30950 */ {(16<<2)|3,{56,111,105}}, +/* 30951 */ {(16<<2)|3,{56,111,111}}, +/* 30952 */ {(16<<2)|3,{56,111,115}}, +/* 30953 */ {(16<<2)|3,{56,111,116}}, +/* 30954 */ {(11<<2)|2,{56,111,0}}, +/* 30955 */ {(11<<2)|2,{56,111,0}}, +/* 30956 */ {(11<<2)|2,{56,111,0}}, +/* 30957 */ {(11<<2)|2,{56,111,0}}, +/* 30958 */ {(11<<2)|2,{56,111,0}}, +/* 30959 */ {(11<<2)|2,{56,111,0}}, +/* 30960 */ {(11<<2)|2,{56,111,0}}, +/* 30961 */ {(11<<2)|2,{56,111,0}}, +/* 30962 */ {(11<<2)|2,{56,111,0}}, +/* 30963 */ {(11<<2)|2,{56,111,0}}, +/* 30964 */ {(11<<2)|2,{56,111,0}}, +/* 30965 */ {(11<<2)|2,{56,111,0}}, +/* 30966 */ {(11<<2)|2,{56,111,0}}, +/* 30967 */ {(11<<2)|2,{56,111,0}}, +/* 30968 */ {(11<<2)|2,{56,111,0}}, +/* 30969 */ {(11<<2)|2,{56,111,0}}, +/* 30970 */ {(11<<2)|2,{56,111,0}}, +/* 30971 */ {(11<<2)|2,{56,111,0}}, +/* 30972 */ {(11<<2)|2,{56,111,0}}, +/* 30973 */ {(11<<2)|2,{56,111,0}}, +/* 30974 */ {(11<<2)|2,{56,111,0}}, +/* 30975 */ {(11<<2)|2,{56,111,0}}, +/* 30976 */ {(16<<2)|3,{56,115,48}}, +/* 30977 */ {(16<<2)|3,{56,115,49}}, +/* 30978 */ {(16<<2)|3,{56,115,50}}, +/* 30979 */ {(16<<2)|3,{56,115,97}}, +/* 30980 */ {(16<<2)|3,{56,115,99}}, +/* 30981 */ {(16<<2)|3,{56,115,101}}, +/* 30982 */ {(16<<2)|3,{56,115,105}}, +/* 30983 */ {(16<<2)|3,{56,115,111}}, +/* 30984 */ {(16<<2)|3,{56,115,115}}, +/* 30985 */ {(16<<2)|3,{56,115,116}}, +/* 30986 */ {(11<<2)|2,{56,115,0}}, +/* 30987 */ {(11<<2)|2,{56,115,0}}, +/* 30988 */ {(11<<2)|2,{56,115,0}}, +/* 30989 */ {(11<<2)|2,{56,115,0}}, +/* 30990 */ {(11<<2)|2,{56,115,0}}, +/* 30991 */ {(11<<2)|2,{56,115,0}}, +/* 30992 */ {(11<<2)|2,{56,115,0}}, +/* 30993 */ {(11<<2)|2,{56,115,0}}, +/* 30994 */ {(11<<2)|2,{56,115,0}}, +/* 30995 */ {(11<<2)|2,{56,115,0}}, +/* 30996 */ {(11<<2)|2,{56,115,0}}, +/* 30997 */ {(11<<2)|2,{56,115,0}}, +/* 30998 */ {(11<<2)|2,{56,115,0}}, +/* 30999 */ {(11<<2)|2,{56,115,0}}, +/* 31000 */ {(11<<2)|2,{56,115,0}}, +/* 31001 */ {(11<<2)|2,{56,115,0}}, +/* 31002 */ {(11<<2)|2,{56,115,0}}, +/* 31003 */ {(11<<2)|2,{56,115,0}}, +/* 31004 */ {(11<<2)|2,{56,115,0}}, +/* 31005 */ {(11<<2)|2,{56,115,0}}, +/* 31006 */ {(11<<2)|2,{56,115,0}}, +/* 31007 */ {(11<<2)|2,{56,115,0}}, +/* 31008 */ {(16<<2)|3,{56,116,48}}, +/* 31009 */ {(16<<2)|3,{56,116,49}}, +/* 31010 */ {(16<<2)|3,{56,116,50}}, +/* 31011 */ {(16<<2)|3,{56,116,97}}, +/* 31012 */ {(16<<2)|3,{56,116,99}}, +/* 31013 */ {(16<<2)|3,{56,116,101}}, +/* 31014 */ {(16<<2)|3,{56,116,105}}, +/* 31015 */ {(16<<2)|3,{56,116,111}}, +/* 31016 */ {(16<<2)|3,{56,116,115}}, +/* 31017 */ {(16<<2)|3,{56,116,116}}, +/* 31018 */ {(11<<2)|2,{56,116,0}}, +/* 31019 */ {(11<<2)|2,{56,116,0}}, +/* 31020 */ {(11<<2)|2,{56,116,0}}, +/* 31021 */ {(11<<2)|2,{56,116,0}}, +/* 31022 */ {(11<<2)|2,{56,116,0}}, +/* 31023 */ {(11<<2)|2,{56,116,0}}, +/* 31024 */ {(11<<2)|2,{56,116,0}}, +/* 31025 */ {(11<<2)|2,{56,116,0}}, +/* 31026 */ {(11<<2)|2,{56,116,0}}, +/* 31027 */ {(11<<2)|2,{56,116,0}}, +/* 31028 */ {(11<<2)|2,{56,116,0}}, +/* 31029 */ {(11<<2)|2,{56,116,0}}, +/* 31030 */ {(11<<2)|2,{56,116,0}}, +/* 31031 */ {(11<<2)|2,{56,116,0}}, +/* 31032 */ {(11<<2)|2,{56,116,0}}, +/* 31033 */ {(11<<2)|2,{56,116,0}}, +/* 31034 */ {(11<<2)|2,{56,116,0}}, +/* 31035 */ {(11<<2)|2,{56,116,0}}, +/* 31036 */ {(11<<2)|2,{56,116,0}}, +/* 31037 */ {(11<<2)|2,{56,116,0}}, +/* 31038 */ {(11<<2)|2,{56,116,0}}, +/* 31039 */ {(11<<2)|2,{56,116,0}}, +/* 31040 */ {(12<<2)|2,{56,32,0}}, +/* 31041 */ {(12<<2)|2,{56,32,0}}, +/* 31042 */ {(12<<2)|2,{56,32,0}}, +/* 31043 */ {(12<<2)|2,{56,32,0}}, +/* 31044 */ {(12<<2)|2,{56,32,0}}, +/* 31045 */ {(12<<2)|2,{56,32,0}}, +/* 31046 */ {(12<<2)|2,{56,32,0}}, +/* 31047 */ {(12<<2)|2,{56,32,0}}, +/* 31048 */ {(12<<2)|2,{56,32,0}}, +/* 31049 */ {(12<<2)|2,{56,32,0}}, +/* 31050 */ {(12<<2)|2,{56,32,0}}, +/* 31051 */ {(12<<2)|2,{56,32,0}}, +/* 31052 */ {(12<<2)|2,{56,32,0}}, +/* 31053 */ {(12<<2)|2,{56,32,0}}, +/* 31054 */ {(12<<2)|2,{56,32,0}}, +/* 31055 */ {(12<<2)|2,{56,32,0}}, +/* 31056 */ {(12<<2)|2,{56,37,0}}, +/* 31057 */ {(12<<2)|2,{56,37,0}}, +/* 31058 */ {(12<<2)|2,{56,37,0}}, +/* 31059 */ {(12<<2)|2,{56,37,0}}, +/* 31060 */ {(12<<2)|2,{56,37,0}}, +/* 31061 */ {(12<<2)|2,{56,37,0}}, +/* 31062 */ {(12<<2)|2,{56,37,0}}, +/* 31063 */ {(12<<2)|2,{56,37,0}}, +/* 31064 */ {(12<<2)|2,{56,37,0}}, +/* 31065 */ {(12<<2)|2,{56,37,0}}, +/* 31066 */ {(12<<2)|2,{56,37,0}}, +/* 31067 */ {(12<<2)|2,{56,37,0}}, +/* 31068 */ {(12<<2)|2,{56,37,0}}, +/* 31069 */ {(12<<2)|2,{56,37,0}}, +/* 31070 */ {(12<<2)|2,{56,37,0}}, +/* 31071 */ {(12<<2)|2,{56,37,0}}, +/* 31072 */ {(12<<2)|2,{56,45,0}}, +/* 31073 */ {(12<<2)|2,{56,45,0}}, +/* 31074 */ {(12<<2)|2,{56,45,0}}, +/* 31075 */ {(12<<2)|2,{56,45,0}}, +/* 31076 */ {(12<<2)|2,{56,45,0}}, +/* 31077 */ {(12<<2)|2,{56,45,0}}, +/* 31078 */ {(12<<2)|2,{56,45,0}}, +/* 31079 */ {(12<<2)|2,{56,45,0}}, +/* 31080 */ {(12<<2)|2,{56,45,0}}, +/* 31081 */ {(12<<2)|2,{56,45,0}}, +/* 31082 */ {(12<<2)|2,{56,45,0}}, +/* 31083 */ {(12<<2)|2,{56,45,0}}, +/* 31084 */ {(12<<2)|2,{56,45,0}}, +/* 31085 */ {(12<<2)|2,{56,45,0}}, +/* 31086 */ {(12<<2)|2,{56,45,0}}, +/* 31087 */ {(12<<2)|2,{56,45,0}}, +/* 31088 */ {(12<<2)|2,{56,46,0}}, +/* 31089 */ {(12<<2)|2,{56,46,0}}, +/* 31090 */ {(12<<2)|2,{56,46,0}}, +/* 31091 */ {(12<<2)|2,{56,46,0}}, +/* 31092 */ {(12<<2)|2,{56,46,0}}, +/* 31093 */ {(12<<2)|2,{56,46,0}}, +/* 31094 */ {(12<<2)|2,{56,46,0}}, +/* 31095 */ {(12<<2)|2,{56,46,0}}, +/* 31096 */ {(12<<2)|2,{56,46,0}}, +/* 31097 */ {(12<<2)|2,{56,46,0}}, +/* 31098 */ {(12<<2)|2,{56,46,0}}, +/* 31099 */ {(12<<2)|2,{56,46,0}}, +/* 31100 */ {(12<<2)|2,{56,46,0}}, +/* 31101 */ {(12<<2)|2,{56,46,0}}, +/* 31102 */ {(12<<2)|2,{56,46,0}}, +/* 31103 */ {(12<<2)|2,{56,46,0}}, +/* 31104 */ {(12<<2)|2,{56,47,0}}, +/* 31105 */ {(12<<2)|2,{56,47,0}}, +/* 31106 */ {(12<<2)|2,{56,47,0}}, +/* 31107 */ {(12<<2)|2,{56,47,0}}, +/* 31108 */ {(12<<2)|2,{56,47,0}}, +/* 31109 */ {(12<<2)|2,{56,47,0}}, +/* 31110 */ {(12<<2)|2,{56,47,0}}, +/* 31111 */ {(12<<2)|2,{56,47,0}}, +/* 31112 */ {(12<<2)|2,{56,47,0}}, +/* 31113 */ {(12<<2)|2,{56,47,0}}, +/* 31114 */ {(12<<2)|2,{56,47,0}}, +/* 31115 */ {(12<<2)|2,{56,47,0}}, +/* 31116 */ {(12<<2)|2,{56,47,0}}, +/* 31117 */ {(12<<2)|2,{56,47,0}}, +/* 31118 */ {(12<<2)|2,{56,47,0}}, +/* 31119 */ {(12<<2)|2,{56,47,0}}, +/* 31120 */ {(12<<2)|2,{56,51,0}}, +/* 31121 */ {(12<<2)|2,{56,51,0}}, +/* 31122 */ {(12<<2)|2,{56,51,0}}, +/* 31123 */ {(12<<2)|2,{56,51,0}}, +/* 31124 */ {(12<<2)|2,{56,51,0}}, +/* 31125 */ {(12<<2)|2,{56,51,0}}, +/* 31126 */ {(12<<2)|2,{56,51,0}}, +/* 31127 */ {(12<<2)|2,{56,51,0}}, +/* 31128 */ {(12<<2)|2,{56,51,0}}, +/* 31129 */ {(12<<2)|2,{56,51,0}}, +/* 31130 */ {(12<<2)|2,{56,51,0}}, +/* 31131 */ {(12<<2)|2,{56,51,0}}, +/* 31132 */ {(12<<2)|2,{56,51,0}}, +/* 31133 */ {(12<<2)|2,{56,51,0}}, +/* 31134 */ {(12<<2)|2,{56,51,0}}, +/* 31135 */ {(12<<2)|2,{56,51,0}}, +/* 31136 */ {(12<<2)|2,{56,52,0}}, +/* 31137 */ {(12<<2)|2,{56,52,0}}, +/* 31138 */ {(12<<2)|2,{56,52,0}}, +/* 31139 */ {(12<<2)|2,{56,52,0}}, +/* 31140 */ {(12<<2)|2,{56,52,0}}, +/* 31141 */ {(12<<2)|2,{56,52,0}}, +/* 31142 */ {(12<<2)|2,{56,52,0}}, +/* 31143 */ {(12<<2)|2,{56,52,0}}, +/* 31144 */ {(12<<2)|2,{56,52,0}}, +/* 31145 */ {(12<<2)|2,{56,52,0}}, +/* 31146 */ {(12<<2)|2,{56,52,0}}, +/* 31147 */ {(12<<2)|2,{56,52,0}}, +/* 31148 */ {(12<<2)|2,{56,52,0}}, +/* 31149 */ {(12<<2)|2,{56,52,0}}, +/* 31150 */ {(12<<2)|2,{56,52,0}}, +/* 31151 */ {(12<<2)|2,{56,52,0}}, +/* 31152 */ {(12<<2)|2,{56,53,0}}, +/* 31153 */ {(12<<2)|2,{56,53,0}}, +/* 31154 */ {(12<<2)|2,{56,53,0}}, +/* 31155 */ {(12<<2)|2,{56,53,0}}, +/* 31156 */ {(12<<2)|2,{56,53,0}}, +/* 31157 */ {(12<<2)|2,{56,53,0}}, +/* 31158 */ {(12<<2)|2,{56,53,0}}, +/* 31159 */ {(12<<2)|2,{56,53,0}}, +/* 31160 */ {(12<<2)|2,{56,53,0}}, +/* 31161 */ {(12<<2)|2,{56,53,0}}, +/* 31162 */ {(12<<2)|2,{56,53,0}}, +/* 31163 */ {(12<<2)|2,{56,53,0}}, +/* 31164 */ {(12<<2)|2,{56,53,0}}, +/* 31165 */ {(12<<2)|2,{56,53,0}}, +/* 31166 */ {(12<<2)|2,{56,53,0}}, +/* 31167 */ {(12<<2)|2,{56,53,0}}, +/* 31168 */ {(12<<2)|2,{56,54,0}}, +/* 31169 */ {(12<<2)|2,{56,54,0}}, +/* 31170 */ {(12<<2)|2,{56,54,0}}, +/* 31171 */ {(12<<2)|2,{56,54,0}}, +/* 31172 */ {(12<<2)|2,{56,54,0}}, +/* 31173 */ {(12<<2)|2,{56,54,0}}, +/* 31174 */ {(12<<2)|2,{56,54,0}}, +/* 31175 */ {(12<<2)|2,{56,54,0}}, +/* 31176 */ {(12<<2)|2,{56,54,0}}, +/* 31177 */ {(12<<2)|2,{56,54,0}}, +/* 31178 */ {(12<<2)|2,{56,54,0}}, +/* 31179 */ {(12<<2)|2,{56,54,0}}, +/* 31180 */ {(12<<2)|2,{56,54,0}}, +/* 31181 */ {(12<<2)|2,{56,54,0}}, +/* 31182 */ {(12<<2)|2,{56,54,0}}, +/* 31183 */ {(12<<2)|2,{56,54,0}}, +/* 31184 */ {(12<<2)|2,{56,55,0}}, +/* 31185 */ {(12<<2)|2,{56,55,0}}, +/* 31186 */ {(12<<2)|2,{56,55,0}}, +/* 31187 */ {(12<<2)|2,{56,55,0}}, +/* 31188 */ {(12<<2)|2,{56,55,0}}, +/* 31189 */ {(12<<2)|2,{56,55,0}}, +/* 31190 */ {(12<<2)|2,{56,55,0}}, +/* 31191 */ {(12<<2)|2,{56,55,0}}, +/* 31192 */ {(12<<2)|2,{56,55,0}}, +/* 31193 */ {(12<<2)|2,{56,55,0}}, +/* 31194 */ {(12<<2)|2,{56,55,0}}, +/* 31195 */ {(12<<2)|2,{56,55,0}}, +/* 31196 */ {(12<<2)|2,{56,55,0}}, +/* 31197 */ {(12<<2)|2,{56,55,0}}, +/* 31198 */ {(12<<2)|2,{56,55,0}}, +/* 31199 */ {(12<<2)|2,{56,55,0}}, +/* 31200 */ {(12<<2)|2,{56,56,0}}, +/* 31201 */ {(12<<2)|2,{56,56,0}}, +/* 31202 */ {(12<<2)|2,{56,56,0}}, +/* 31203 */ {(12<<2)|2,{56,56,0}}, +/* 31204 */ {(12<<2)|2,{56,56,0}}, +/* 31205 */ {(12<<2)|2,{56,56,0}}, +/* 31206 */ {(12<<2)|2,{56,56,0}}, +/* 31207 */ {(12<<2)|2,{56,56,0}}, +/* 31208 */ {(12<<2)|2,{56,56,0}}, +/* 31209 */ {(12<<2)|2,{56,56,0}}, +/* 31210 */ {(12<<2)|2,{56,56,0}}, +/* 31211 */ {(12<<2)|2,{56,56,0}}, +/* 31212 */ {(12<<2)|2,{56,56,0}}, +/* 31213 */ {(12<<2)|2,{56,56,0}}, +/* 31214 */ {(12<<2)|2,{56,56,0}}, +/* 31215 */ {(12<<2)|2,{56,56,0}}, +/* 31216 */ {(12<<2)|2,{56,57,0}}, +/* 31217 */ {(12<<2)|2,{56,57,0}}, +/* 31218 */ {(12<<2)|2,{56,57,0}}, +/* 31219 */ {(12<<2)|2,{56,57,0}}, +/* 31220 */ {(12<<2)|2,{56,57,0}}, +/* 31221 */ {(12<<2)|2,{56,57,0}}, +/* 31222 */ {(12<<2)|2,{56,57,0}}, +/* 31223 */ {(12<<2)|2,{56,57,0}}, +/* 31224 */ {(12<<2)|2,{56,57,0}}, +/* 31225 */ {(12<<2)|2,{56,57,0}}, +/* 31226 */ {(12<<2)|2,{56,57,0}}, +/* 31227 */ {(12<<2)|2,{56,57,0}}, +/* 31228 */ {(12<<2)|2,{56,57,0}}, +/* 31229 */ {(12<<2)|2,{56,57,0}}, +/* 31230 */ {(12<<2)|2,{56,57,0}}, +/* 31231 */ {(12<<2)|2,{56,57,0}}, +/* 31232 */ {(12<<2)|2,{56,61,0}}, +/* 31233 */ {(12<<2)|2,{56,61,0}}, +/* 31234 */ {(12<<2)|2,{56,61,0}}, +/* 31235 */ {(12<<2)|2,{56,61,0}}, +/* 31236 */ {(12<<2)|2,{56,61,0}}, +/* 31237 */ {(12<<2)|2,{56,61,0}}, +/* 31238 */ {(12<<2)|2,{56,61,0}}, +/* 31239 */ {(12<<2)|2,{56,61,0}}, +/* 31240 */ {(12<<2)|2,{56,61,0}}, +/* 31241 */ {(12<<2)|2,{56,61,0}}, +/* 31242 */ {(12<<2)|2,{56,61,0}}, +/* 31243 */ {(12<<2)|2,{56,61,0}}, +/* 31244 */ {(12<<2)|2,{56,61,0}}, +/* 31245 */ {(12<<2)|2,{56,61,0}}, +/* 31246 */ {(12<<2)|2,{56,61,0}}, +/* 31247 */ {(12<<2)|2,{56,61,0}}, +/* 31248 */ {(12<<2)|2,{56,65,0}}, +/* 31249 */ {(12<<2)|2,{56,65,0}}, +/* 31250 */ {(12<<2)|2,{56,65,0}}, +/* 31251 */ {(12<<2)|2,{56,65,0}}, +/* 31252 */ {(12<<2)|2,{56,65,0}}, +/* 31253 */ {(12<<2)|2,{56,65,0}}, +/* 31254 */ {(12<<2)|2,{56,65,0}}, +/* 31255 */ {(12<<2)|2,{56,65,0}}, +/* 31256 */ {(12<<2)|2,{56,65,0}}, +/* 31257 */ {(12<<2)|2,{56,65,0}}, +/* 31258 */ {(12<<2)|2,{56,65,0}}, +/* 31259 */ {(12<<2)|2,{56,65,0}}, +/* 31260 */ {(12<<2)|2,{56,65,0}}, +/* 31261 */ {(12<<2)|2,{56,65,0}}, +/* 31262 */ {(12<<2)|2,{56,65,0}}, +/* 31263 */ {(12<<2)|2,{56,65,0}}, +/* 31264 */ {(12<<2)|2,{56,95,0}}, +/* 31265 */ {(12<<2)|2,{56,95,0}}, +/* 31266 */ {(12<<2)|2,{56,95,0}}, +/* 31267 */ {(12<<2)|2,{56,95,0}}, +/* 31268 */ {(12<<2)|2,{56,95,0}}, +/* 31269 */ {(12<<2)|2,{56,95,0}}, +/* 31270 */ {(12<<2)|2,{56,95,0}}, +/* 31271 */ {(12<<2)|2,{56,95,0}}, +/* 31272 */ {(12<<2)|2,{56,95,0}}, +/* 31273 */ {(12<<2)|2,{56,95,0}}, +/* 31274 */ {(12<<2)|2,{56,95,0}}, +/* 31275 */ {(12<<2)|2,{56,95,0}}, +/* 31276 */ {(12<<2)|2,{56,95,0}}, +/* 31277 */ {(12<<2)|2,{56,95,0}}, +/* 31278 */ {(12<<2)|2,{56,95,0}}, +/* 31279 */ {(12<<2)|2,{56,95,0}}, +/* 31280 */ {(12<<2)|2,{56,98,0}}, +/* 31281 */ {(12<<2)|2,{56,98,0}}, +/* 31282 */ {(12<<2)|2,{56,98,0}}, +/* 31283 */ {(12<<2)|2,{56,98,0}}, +/* 31284 */ {(12<<2)|2,{56,98,0}}, +/* 31285 */ {(12<<2)|2,{56,98,0}}, +/* 31286 */ {(12<<2)|2,{56,98,0}}, +/* 31287 */ {(12<<2)|2,{56,98,0}}, +/* 31288 */ {(12<<2)|2,{56,98,0}}, +/* 31289 */ {(12<<2)|2,{56,98,0}}, +/* 31290 */ {(12<<2)|2,{56,98,0}}, +/* 31291 */ {(12<<2)|2,{56,98,0}}, +/* 31292 */ {(12<<2)|2,{56,98,0}}, +/* 31293 */ {(12<<2)|2,{56,98,0}}, +/* 31294 */ {(12<<2)|2,{56,98,0}}, +/* 31295 */ {(12<<2)|2,{56,98,0}}, +/* 31296 */ {(12<<2)|2,{56,100,0}}, +/* 31297 */ {(12<<2)|2,{56,100,0}}, +/* 31298 */ {(12<<2)|2,{56,100,0}}, +/* 31299 */ {(12<<2)|2,{56,100,0}}, +/* 31300 */ {(12<<2)|2,{56,100,0}}, +/* 31301 */ {(12<<2)|2,{56,100,0}}, +/* 31302 */ {(12<<2)|2,{56,100,0}}, +/* 31303 */ {(12<<2)|2,{56,100,0}}, +/* 31304 */ {(12<<2)|2,{56,100,0}}, +/* 31305 */ {(12<<2)|2,{56,100,0}}, +/* 31306 */ {(12<<2)|2,{56,100,0}}, +/* 31307 */ {(12<<2)|2,{56,100,0}}, +/* 31308 */ {(12<<2)|2,{56,100,0}}, +/* 31309 */ {(12<<2)|2,{56,100,0}}, +/* 31310 */ {(12<<2)|2,{56,100,0}}, +/* 31311 */ {(12<<2)|2,{56,100,0}}, +/* 31312 */ {(12<<2)|2,{56,102,0}}, +/* 31313 */ {(12<<2)|2,{56,102,0}}, +/* 31314 */ {(12<<2)|2,{56,102,0}}, +/* 31315 */ {(12<<2)|2,{56,102,0}}, +/* 31316 */ {(12<<2)|2,{56,102,0}}, +/* 31317 */ {(12<<2)|2,{56,102,0}}, +/* 31318 */ {(12<<2)|2,{56,102,0}}, +/* 31319 */ {(12<<2)|2,{56,102,0}}, +/* 31320 */ {(12<<2)|2,{56,102,0}}, +/* 31321 */ {(12<<2)|2,{56,102,0}}, +/* 31322 */ {(12<<2)|2,{56,102,0}}, +/* 31323 */ {(12<<2)|2,{56,102,0}}, +/* 31324 */ {(12<<2)|2,{56,102,0}}, +/* 31325 */ {(12<<2)|2,{56,102,0}}, +/* 31326 */ {(12<<2)|2,{56,102,0}}, +/* 31327 */ {(12<<2)|2,{56,102,0}}, +/* 31328 */ {(12<<2)|2,{56,103,0}}, +/* 31329 */ {(12<<2)|2,{56,103,0}}, +/* 31330 */ {(12<<2)|2,{56,103,0}}, +/* 31331 */ {(12<<2)|2,{56,103,0}}, +/* 31332 */ {(12<<2)|2,{56,103,0}}, +/* 31333 */ {(12<<2)|2,{56,103,0}}, +/* 31334 */ {(12<<2)|2,{56,103,0}}, +/* 31335 */ {(12<<2)|2,{56,103,0}}, +/* 31336 */ {(12<<2)|2,{56,103,0}}, +/* 31337 */ {(12<<2)|2,{56,103,0}}, +/* 31338 */ {(12<<2)|2,{56,103,0}}, +/* 31339 */ {(12<<2)|2,{56,103,0}}, +/* 31340 */ {(12<<2)|2,{56,103,0}}, +/* 31341 */ {(12<<2)|2,{56,103,0}}, +/* 31342 */ {(12<<2)|2,{56,103,0}}, +/* 31343 */ {(12<<2)|2,{56,103,0}}, +/* 31344 */ {(12<<2)|2,{56,104,0}}, +/* 31345 */ {(12<<2)|2,{56,104,0}}, +/* 31346 */ {(12<<2)|2,{56,104,0}}, +/* 31347 */ {(12<<2)|2,{56,104,0}}, +/* 31348 */ {(12<<2)|2,{56,104,0}}, +/* 31349 */ {(12<<2)|2,{56,104,0}}, +/* 31350 */ {(12<<2)|2,{56,104,0}}, +/* 31351 */ {(12<<2)|2,{56,104,0}}, +/* 31352 */ {(12<<2)|2,{56,104,0}}, +/* 31353 */ {(12<<2)|2,{56,104,0}}, +/* 31354 */ {(12<<2)|2,{56,104,0}}, +/* 31355 */ {(12<<2)|2,{56,104,0}}, +/* 31356 */ {(12<<2)|2,{56,104,0}}, +/* 31357 */ {(12<<2)|2,{56,104,0}}, +/* 31358 */ {(12<<2)|2,{56,104,0}}, +/* 31359 */ {(12<<2)|2,{56,104,0}}, +/* 31360 */ {(12<<2)|2,{56,108,0}}, +/* 31361 */ {(12<<2)|2,{56,108,0}}, +/* 31362 */ {(12<<2)|2,{56,108,0}}, +/* 31363 */ {(12<<2)|2,{56,108,0}}, +/* 31364 */ {(12<<2)|2,{56,108,0}}, +/* 31365 */ {(12<<2)|2,{56,108,0}}, +/* 31366 */ {(12<<2)|2,{56,108,0}}, +/* 31367 */ {(12<<2)|2,{56,108,0}}, +/* 31368 */ {(12<<2)|2,{56,108,0}}, +/* 31369 */ {(12<<2)|2,{56,108,0}}, +/* 31370 */ {(12<<2)|2,{56,108,0}}, +/* 31371 */ {(12<<2)|2,{56,108,0}}, +/* 31372 */ {(12<<2)|2,{56,108,0}}, +/* 31373 */ {(12<<2)|2,{56,108,0}}, +/* 31374 */ {(12<<2)|2,{56,108,0}}, +/* 31375 */ {(12<<2)|2,{56,108,0}}, +/* 31376 */ {(12<<2)|2,{56,109,0}}, +/* 31377 */ {(12<<2)|2,{56,109,0}}, +/* 31378 */ {(12<<2)|2,{56,109,0}}, +/* 31379 */ {(12<<2)|2,{56,109,0}}, +/* 31380 */ {(12<<2)|2,{56,109,0}}, +/* 31381 */ {(12<<2)|2,{56,109,0}}, +/* 31382 */ {(12<<2)|2,{56,109,0}}, +/* 31383 */ {(12<<2)|2,{56,109,0}}, +/* 31384 */ {(12<<2)|2,{56,109,0}}, +/* 31385 */ {(12<<2)|2,{56,109,0}}, +/* 31386 */ {(12<<2)|2,{56,109,0}}, +/* 31387 */ {(12<<2)|2,{56,109,0}}, +/* 31388 */ {(12<<2)|2,{56,109,0}}, +/* 31389 */ {(12<<2)|2,{56,109,0}}, +/* 31390 */ {(12<<2)|2,{56,109,0}}, +/* 31391 */ {(12<<2)|2,{56,109,0}}, +/* 31392 */ {(12<<2)|2,{56,110,0}}, +/* 31393 */ {(12<<2)|2,{56,110,0}}, +/* 31394 */ {(12<<2)|2,{56,110,0}}, +/* 31395 */ {(12<<2)|2,{56,110,0}}, +/* 31396 */ {(12<<2)|2,{56,110,0}}, +/* 31397 */ {(12<<2)|2,{56,110,0}}, +/* 31398 */ {(12<<2)|2,{56,110,0}}, +/* 31399 */ {(12<<2)|2,{56,110,0}}, +/* 31400 */ {(12<<2)|2,{56,110,0}}, +/* 31401 */ {(12<<2)|2,{56,110,0}}, +/* 31402 */ {(12<<2)|2,{56,110,0}}, +/* 31403 */ {(12<<2)|2,{56,110,0}}, +/* 31404 */ {(12<<2)|2,{56,110,0}}, +/* 31405 */ {(12<<2)|2,{56,110,0}}, +/* 31406 */ {(12<<2)|2,{56,110,0}}, +/* 31407 */ {(12<<2)|2,{56,110,0}}, +/* 31408 */ {(12<<2)|2,{56,112,0}}, +/* 31409 */ {(12<<2)|2,{56,112,0}}, +/* 31410 */ {(12<<2)|2,{56,112,0}}, +/* 31411 */ {(12<<2)|2,{56,112,0}}, +/* 31412 */ {(12<<2)|2,{56,112,0}}, +/* 31413 */ {(12<<2)|2,{56,112,0}}, +/* 31414 */ {(12<<2)|2,{56,112,0}}, +/* 31415 */ {(12<<2)|2,{56,112,0}}, +/* 31416 */ {(12<<2)|2,{56,112,0}}, +/* 31417 */ {(12<<2)|2,{56,112,0}}, +/* 31418 */ {(12<<2)|2,{56,112,0}}, +/* 31419 */ {(12<<2)|2,{56,112,0}}, +/* 31420 */ {(12<<2)|2,{56,112,0}}, +/* 31421 */ {(12<<2)|2,{56,112,0}}, +/* 31422 */ {(12<<2)|2,{56,112,0}}, +/* 31423 */ {(12<<2)|2,{56,112,0}}, +/* 31424 */ {(12<<2)|2,{56,114,0}}, +/* 31425 */ {(12<<2)|2,{56,114,0}}, +/* 31426 */ {(12<<2)|2,{56,114,0}}, +/* 31427 */ {(12<<2)|2,{56,114,0}}, +/* 31428 */ {(12<<2)|2,{56,114,0}}, +/* 31429 */ {(12<<2)|2,{56,114,0}}, +/* 31430 */ {(12<<2)|2,{56,114,0}}, +/* 31431 */ {(12<<2)|2,{56,114,0}}, +/* 31432 */ {(12<<2)|2,{56,114,0}}, +/* 31433 */ {(12<<2)|2,{56,114,0}}, +/* 31434 */ {(12<<2)|2,{56,114,0}}, +/* 31435 */ {(12<<2)|2,{56,114,0}}, +/* 31436 */ {(12<<2)|2,{56,114,0}}, +/* 31437 */ {(12<<2)|2,{56,114,0}}, +/* 31438 */ {(12<<2)|2,{56,114,0}}, +/* 31439 */ {(12<<2)|2,{56,114,0}}, +/* 31440 */ {(12<<2)|2,{56,117,0}}, +/* 31441 */ {(12<<2)|2,{56,117,0}}, +/* 31442 */ {(12<<2)|2,{56,117,0}}, +/* 31443 */ {(12<<2)|2,{56,117,0}}, +/* 31444 */ {(12<<2)|2,{56,117,0}}, +/* 31445 */ {(12<<2)|2,{56,117,0}}, +/* 31446 */ {(12<<2)|2,{56,117,0}}, +/* 31447 */ {(12<<2)|2,{56,117,0}}, +/* 31448 */ {(12<<2)|2,{56,117,0}}, +/* 31449 */ {(12<<2)|2,{56,117,0}}, +/* 31450 */ {(12<<2)|2,{56,117,0}}, +/* 31451 */ {(12<<2)|2,{56,117,0}}, +/* 31452 */ {(12<<2)|2,{56,117,0}}, +/* 31453 */ {(12<<2)|2,{56,117,0}}, +/* 31454 */ {(12<<2)|2,{56,117,0}}, +/* 31455 */ {(12<<2)|2,{56,117,0}}, +/* 31456 */ {(13<<2)|2,{56,58,0}}, +/* 31457 */ {(13<<2)|2,{56,58,0}}, +/* 31458 */ {(13<<2)|2,{56,58,0}}, +/* 31459 */ {(13<<2)|2,{56,58,0}}, +/* 31460 */ {(13<<2)|2,{56,58,0}}, +/* 31461 */ {(13<<2)|2,{56,58,0}}, +/* 31462 */ {(13<<2)|2,{56,58,0}}, +/* 31463 */ {(13<<2)|2,{56,58,0}}, +/* 31464 */ {(13<<2)|2,{56,66,0}}, +/* 31465 */ {(13<<2)|2,{56,66,0}}, +/* 31466 */ {(13<<2)|2,{56,66,0}}, +/* 31467 */ {(13<<2)|2,{56,66,0}}, +/* 31468 */ {(13<<2)|2,{56,66,0}}, +/* 31469 */ {(13<<2)|2,{56,66,0}}, +/* 31470 */ {(13<<2)|2,{56,66,0}}, +/* 31471 */ {(13<<2)|2,{56,66,0}}, +/* 31472 */ {(13<<2)|2,{56,67,0}}, +/* 31473 */ {(13<<2)|2,{56,67,0}}, +/* 31474 */ {(13<<2)|2,{56,67,0}}, +/* 31475 */ {(13<<2)|2,{56,67,0}}, +/* 31476 */ {(13<<2)|2,{56,67,0}}, +/* 31477 */ {(13<<2)|2,{56,67,0}}, +/* 31478 */ {(13<<2)|2,{56,67,0}}, +/* 31479 */ {(13<<2)|2,{56,67,0}}, +/* 31480 */ {(13<<2)|2,{56,68,0}}, +/* 31481 */ {(13<<2)|2,{56,68,0}}, +/* 31482 */ {(13<<2)|2,{56,68,0}}, +/* 31483 */ {(13<<2)|2,{56,68,0}}, +/* 31484 */ {(13<<2)|2,{56,68,0}}, +/* 31485 */ {(13<<2)|2,{56,68,0}}, +/* 31486 */ {(13<<2)|2,{56,68,0}}, +/* 31487 */ {(13<<2)|2,{56,68,0}}, +/* 31488 */ {(13<<2)|2,{56,69,0}}, +/* 31489 */ {(13<<2)|2,{56,69,0}}, +/* 31490 */ {(13<<2)|2,{56,69,0}}, +/* 31491 */ {(13<<2)|2,{56,69,0}}, +/* 31492 */ {(13<<2)|2,{56,69,0}}, +/* 31493 */ {(13<<2)|2,{56,69,0}}, +/* 31494 */ {(13<<2)|2,{56,69,0}}, +/* 31495 */ {(13<<2)|2,{56,69,0}}, +/* 31496 */ {(13<<2)|2,{56,70,0}}, +/* 31497 */ {(13<<2)|2,{56,70,0}}, +/* 31498 */ {(13<<2)|2,{56,70,0}}, +/* 31499 */ {(13<<2)|2,{56,70,0}}, +/* 31500 */ {(13<<2)|2,{56,70,0}}, +/* 31501 */ {(13<<2)|2,{56,70,0}}, +/* 31502 */ {(13<<2)|2,{56,70,0}}, +/* 31503 */ {(13<<2)|2,{56,70,0}}, +/* 31504 */ {(13<<2)|2,{56,71,0}}, +/* 31505 */ {(13<<2)|2,{56,71,0}}, +/* 31506 */ {(13<<2)|2,{56,71,0}}, +/* 31507 */ {(13<<2)|2,{56,71,0}}, +/* 31508 */ {(13<<2)|2,{56,71,0}}, +/* 31509 */ {(13<<2)|2,{56,71,0}}, +/* 31510 */ {(13<<2)|2,{56,71,0}}, +/* 31511 */ {(13<<2)|2,{56,71,0}}, +/* 31512 */ {(13<<2)|2,{56,72,0}}, +/* 31513 */ {(13<<2)|2,{56,72,0}}, +/* 31514 */ {(13<<2)|2,{56,72,0}}, +/* 31515 */ {(13<<2)|2,{56,72,0}}, +/* 31516 */ {(13<<2)|2,{56,72,0}}, +/* 31517 */ {(13<<2)|2,{56,72,0}}, +/* 31518 */ {(13<<2)|2,{56,72,0}}, +/* 31519 */ {(13<<2)|2,{56,72,0}}, +/* 31520 */ {(13<<2)|2,{56,73,0}}, +/* 31521 */ {(13<<2)|2,{56,73,0}}, +/* 31522 */ {(13<<2)|2,{56,73,0}}, +/* 31523 */ {(13<<2)|2,{56,73,0}}, +/* 31524 */ {(13<<2)|2,{56,73,0}}, +/* 31525 */ {(13<<2)|2,{56,73,0}}, +/* 31526 */ {(13<<2)|2,{56,73,0}}, +/* 31527 */ {(13<<2)|2,{56,73,0}}, +/* 31528 */ {(13<<2)|2,{56,74,0}}, +/* 31529 */ {(13<<2)|2,{56,74,0}}, +/* 31530 */ {(13<<2)|2,{56,74,0}}, +/* 31531 */ {(13<<2)|2,{56,74,0}}, +/* 31532 */ {(13<<2)|2,{56,74,0}}, +/* 31533 */ {(13<<2)|2,{56,74,0}}, +/* 31534 */ {(13<<2)|2,{56,74,0}}, +/* 31535 */ {(13<<2)|2,{56,74,0}}, +/* 31536 */ {(13<<2)|2,{56,75,0}}, +/* 31537 */ {(13<<2)|2,{56,75,0}}, +/* 31538 */ {(13<<2)|2,{56,75,0}}, +/* 31539 */ {(13<<2)|2,{56,75,0}}, +/* 31540 */ {(13<<2)|2,{56,75,0}}, +/* 31541 */ {(13<<2)|2,{56,75,0}}, +/* 31542 */ {(13<<2)|2,{56,75,0}}, +/* 31543 */ {(13<<2)|2,{56,75,0}}, +/* 31544 */ {(13<<2)|2,{56,76,0}}, +/* 31545 */ {(13<<2)|2,{56,76,0}}, +/* 31546 */ {(13<<2)|2,{56,76,0}}, +/* 31547 */ {(13<<2)|2,{56,76,0}}, +/* 31548 */ {(13<<2)|2,{56,76,0}}, +/* 31549 */ {(13<<2)|2,{56,76,0}}, +/* 31550 */ {(13<<2)|2,{56,76,0}}, +/* 31551 */ {(13<<2)|2,{56,76,0}}, +/* 31552 */ {(13<<2)|2,{56,77,0}}, +/* 31553 */ {(13<<2)|2,{56,77,0}}, +/* 31554 */ {(13<<2)|2,{56,77,0}}, +/* 31555 */ {(13<<2)|2,{56,77,0}}, +/* 31556 */ {(13<<2)|2,{56,77,0}}, +/* 31557 */ {(13<<2)|2,{56,77,0}}, +/* 31558 */ {(13<<2)|2,{56,77,0}}, +/* 31559 */ {(13<<2)|2,{56,77,0}}, +/* 31560 */ {(13<<2)|2,{56,78,0}}, +/* 31561 */ {(13<<2)|2,{56,78,0}}, +/* 31562 */ {(13<<2)|2,{56,78,0}}, +/* 31563 */ {(13<<2)|2,{56,78,0}}, +/* 31564 */ {(13<<2)|2,{56,78,0}}, +/* 31565 */ {(13<<2)|2,{56,78,0}}, +/* 31566 */ {(13<<2)|2,{56,78,0}}, +/* 31567 */ {(13<<2)|2,{56,78,0}}, +/* 31568 */ {(13<<2)|2,{56,79,0}}, +/* 31569 */ {(13<<2)|2,{56,79,0}}, +/* 31570 */ {(13<<2)|2,{56,79,0}}, +/* 31571 */ {(13<<2)|2,{56,79,0}}, +/* 31572 */ {(13<<2)|2,{56,79,0}}, +/* 31573 */ {(13<<2)|2,{56,79,0}}, +/* 31574 */ {(13<<2)|2,{56,79,0}}, +/* 31575 */ {(13<<2)|2,{56,79,0}}, +/* 31576 */ {(13<<2)|2,{56,80,0}}, +/* 31577 */ {(13<<2)|2,{56,80,0}}, +/* 31578 */ {(13<<2)|2,{56,80,0}}, +/* 31579 */ {(13<<2)|2,{56,80,0}}, +/* 31580 */ {(13<<2)|2,{56,80,0}}, +/* 31581 */ {(13<<2)|2,{56,80,0}}, +/* 31582 */ {(13<<2)|2,{56,80,0}}, +/* 31583 */ {(13<<2)|2,{56,80,0}}, +/* 31584 */ {(13<<2)|2,{56,81,0}}, +/* 31585 */ {(13<<2)|2,{56,81,0}}, +/* 31586 */ {(13<<2)|2,{56,81,0}}, +/* 31587 */ {(13<<2)|2,{56,81,0}}, +/* 31588 */ {(13<<2)|2,{56,81,0}}, +/* 31589 */ {(13<<2)|2,{56,81,0}}, +/* 31590 */ {(13<<2)|2,{56,81,0}}, +/* 31591 */ {(13<<2)|2,{56,81,0}}, +/* 31592 */ {(13<<2)|2,{56,82,0}}, +/* 31593 */ {(13<<2)|2,{56,82,0}}, +/* 31594 */ {(13<<2)|2,{56,82,0}}, +/* 31595 */ {(13<<2)|2,{56,82,0}}, +/* 31596 */ {(13<<2)|2,{56,82,0}}, +/* 31597 */ {(13<<2)|2,{56,82,0}}, +/* 31598 */ {(13<<2)|2,{56,82,0}}, +/* 31599 */ {(13<<2)|2,{56,82,0}}, +/* 31600 */ {(13<<2)|2,{56,83,0}}, +/* 31601 */ {(13<<2)|2,{56,83,0}}, +/* 31602 */ {(13<<2)|2,{56,83,0}}, +/* 31603 */ {(13<<2)|2,{56,83,0}}, +/* 31604 */ {(13<<2)|2,{56,83,0}}, +/* 31605 */ {(13<<2)|2,{56,83,0}}, +/* 31606 */ {(13<<2)|2,{56,83,0}}, +/* 31607 */ {(13<<2)|2,{56,83,0}}, +/* 31608 */ {(13<<2)|2,{56,84,0}}, +/* 31609 */ {(13<<2)|2,{56,84,0}}, +/* 31610 */ {(13<<2)|2,{56,84,0}}, +/* 31611 */ {(13<<2)|2,{56,84,0}}, +/* 31612 */ {(13<<2)|2,{56,84,0}}, +/* 31613 */ {(13<<2)|2,{56,84,0}}, +/* 31614 */ {(13<<2)|2,{56,84,0}}, +/* 31615 */ {(13<<2)|2,{56,84,0}}, +/* 31616 */ {(13<<2)|2,{56,85,0}}, +/* 31617 */ {(13<<2)|2,{56,85,0}}, +/* 31618 */ {(13<<2)|2,{56,85,0}}, +/* 31619 */ {(13<<2)|2,{56,85,0}}, +/* 31620 */ {(13<<2)|2,{56,85,0}}, +/* 31621 */ {(13<<2)|2,{56,85,0}}, +/* 31622 */ {(13<<2)|2,{56,85,0}}, +/* 31623 */ {(13<<2)|2,{56,85,0}}, +/* 31624 */ {(13<<2)|2,{56,86,0}}, +/* 31625 */ {(13<<2)|2,{56,86,0}}, +/* 31626 */ {(13<<2)|2,{56,86,0}}, +/* 31627 */ {(13<<2)|2,{56,86,0}}, +/* 31628 */ {(13<<2)|2,{56,86,0}}, +/* 31629 */ {(13<<2)|2,{56,86,0}}, +/* 31630 */ {(13<<2)|2,{56,86,0}}, +/* 31631 */ {(13<<2)|2,{56,86,0}}, +/* 31632 */ {(13<<2)|2,{56,87,0}}, +/* 31633 */ {(13<<2)|2,{56,87,0}}, +/* 31634 */ {(13<<2)|2,{56,87,0}}, +/* 31635 */ {(13<<2)|2,{56,87,0}}, +/* 31636 */ {(13<<2)|2,{56,87,0}}, +/* 31637 */ {(13<<2)|2,{56,87,0}}, +/* 31638 */ {(13<<2)|2,{56,87,0}}, +/* 31639 */ {(13<<2)|2,{56,87,0}}, +/* 31640 */ {(13<<2)|2,{56,89,0}}, +/* 31641 */ {(13<<2)|2,{56,89,0}}, +/* 31642 */ {(13<<2)|2,{56,89,0}}, +/* 31643 */ {(13<<2)|2,{56,89,0}}, +/* 31644 */ {(13<<2)|2,{56,89,0}}, +/* 31645 */ {(13<<2)|2,{56,89,0}}, +/* 31646 */ {(13<<2)|2,{56,89,0}}, +/* 31647 */ {(13<<2)|2,{56,89,0}}, +/* 31648 */ {(13<<2)|2,{56,106,0}}, +/* 31649 */ {(13<<2)|2,{56,106,0}}, +/* 31650 */ {(13<<2)|2,{56,106,0}}, +/* 31651 */ {(13<<2)|2,{56,106,0}}, +/* 31652 */ {(13<<2)|2,{56,106,0}}, +/* 31653 */ {(13<<2)|2,{56,106,0}}, +/* 31654 */ {(13<<2)|2,{56,106,0}}, +/* 31655 */ {(13<<2)|2,{56,106,0}}, +/* 31656 */ {(13<<2)|2,{56,107,0}}, +/* 31657 */ {(13<<2)|2,{56,107,0}}, +/* 31658 */ {(13<<2)|2,{56,107,0}}, +/* 31659 */ {(13<<2)|2,{56,107,0}}, +/* 31660 */ {(13<<2)|2,{56,107,0}}, +/* 31661 */ {(13<<2)|2,{56,107,0}}, +/* 31662 */ {(13<<2)|2,{56,107,0}}, +/* 31663 */ {(13<<2)|2,{56,107,0}}, +/* 31664 */ {(13<<2)|2,{56,113,0}}, +/* 31665 */ {(13<<2)|2,{56,113,0}}, +/* 31666 */ {(13<<2)|2,{56,113,0}}, +/* 31667 */ {(13<<2)|2,{56,113,0}}, +/* 31668 */ {(13<<2)|2,{56,113,0}}, +/* 31669 */ {(13<<2)|2,{56,113,0}}, +/* 31670 */ {(13<<2)|2,{56,113,0}}, +/* 31671 */ {(13<<2)|2,{56,113,0}}, +/* 31672 */ {(13<<2)|2,{56,118,0}}, +/* 31673 */ {(13<<2)|2,{56,118,0}}, +/* 31674 */ {(13<<2)|2,{56,118,0}}, +/* 31675 */ {(13<<2)|2,{56,118,0}}, +/* 31676 */ {(13<<2)|2,{56,118,0}}, +/* 31677 */ {(13<<2)|2,{56,118,0}}, +/* 31678 */ {(13<<2)|2,{56,118,0}}, +/* 31679 */ {(13<<2)|2,{56,118,0}}, +/* 31680 */ {(13<<2)|2,{56,119,0}}, +/* 31681 */ {(13<<2)|2,{56,119,0}}, +/* 31682 */ {(13<<2)|2,{56,119,0}}, +/* 31683 */ {(13<<2)|2,{56,119,0}}, +/* 31684 */ {(13<<2)|2,{56,119,0}}, +/* 31685 */ {(13<<2)|2,{56,119,0}}, +/* 31686 */ {(13<<2)|2,{56,119,0}}, +/* 31687 */ {(13<<2)|2,{56,119,0}}, +/* 31688 */ {(13<<2)|2,{56,120,0}}, +/* 31689 */ {(13<<2)|2,{56,120,0}}, +/* 31690 */ {(13<<2)|2,{56,120,0}}, +/* 31691 */ {(13<<2)|2,{56,120,0}}, +/* 31692 */ {(13<<2)|2,{56,120,0}}, +/* 31693 */ {(13<<2)|2,{56,120,0}}, +/* 31694 */ {(13<<2)|2,{56,120,0}}, +/* 31695 */ {(13<<2)|2,{56,120,0}}, +/* 31696 */ {(13<<2)|2,{56,121,0}}, +/* 31697 */ {(13<<2)|2,{56,121,0}}, +/* 31698 */ {(13<<2)|2,{56,121,0}}, +/* 31699 */ {(13<<2)|2,{56,121,0}}, +/* 31700 */ {(13<<2)|2,{56,121,0}}, +/* 31701 */ {(13<<2)|2,{56,121,0}}, +/* 31702 */ {(13<<2)|2,{56,121,0}}, +/* 31703 */ {(13<<2)|2,{56,121,0}}, +/* 31704 */ {(13<<2)|2,{56,122,0}}, +/* 31705 */ {(13<<2)|2,{56,122,0}}, +/* 31706 */ {(13<<2)|2,{56,122,0}}, +/* 31707 */ {(13<<2)|2,{56,122,0}}, +/* 31708 */ {(13<<2)|2,{56,122,0}}, +/* 31709 */ {(13<<2)|2,{56,122,0}}, +/* 31710 */ {(13<<2)|2,{56,122,0}}, +/* 31711 */ {(13<<2)|2,{56,122,0}}, +/* 31712 */ {(14<<2)|2,{56,38,0}}, +/* 31713 */ {(14<<2)|2,{56,38,0}}, +/* 31714 */ {(14<<2)|2,{56,38,0}}, +/* 31715 */ {(14<<2)|2,{56,38,0}}, +/* 31716 */ {(14<<2)|2,{56,42,0}}, +/* 31717 */ {(14<<2)|2,{56,42,0}}, +/* 31718 */ {(14<<2)|2,{56,42,0}}, +/* 31719 */ {(14<<2)|2,{56,42,0}}, +/* 31720 */ {(14<<2)|2,{56,44,0}}, +/* 31721 */ {(14<<2)|2,{56,44,0}}, +/* 31722 */ {(14<<2)|2,{56,44,0}}, +/* 31723 */ {(14<<2)|2,{56,44,0}}, +/* 31724 */ {(14<<2)|2,{56,59,0}}, +/* 31725 */ {(14<<2)|2,{56,59,0}}, +/* 31726 */ {(14<<2)|2,{56,59,0}}, +/* 31727 */ {(14<<2)|2,{56,59,0}}, +/* 31728 */ {(14<<2)|2,{56,88,0}}, +/* 31729 */ {(14<<2)|2,{56,88,0}}, +/* 31730 */ {(14<<2)|2,{56,88,0}}, +/* 31731 */ {(14<<2)|2,{56,88,0}}, +/* 31732 */ {(14<<2)|2,{56,90,0}}, +/* 31733 */ {(14<<2)|2,{56,90,0}}, +/* 31734 */ {(14<<2)|2,{56,90,0}}, +/* 31735 */ {(14<<2)|2,{56,90,0}}, +/* 31736 */ {(16<<2)|2,{56,33,0}}, +/* 31737 */ {(16<<2)|2,{56,34,0}}, +/* 31738 */ {(16<<2)|2,{56,40,0}}, +/* 31739 */ {(16<<2)|2,{56,41,0}}, +/* 31740 */ {(16<<2)|2,{56,63,0}}, +/* 31741 */ {(6<<2)|1,{56,0,0}}, +/* 31742 */ {(6<<2)|1,{56,0,0}}, +/* 31743 */ {(6<<2)|1,{56,0,0}}, +/* 31744 */ {(16<<2)|3,{57,48,48}}, +/* 31745 */ {(16<<2)|3,{57,48,49}}, +/* 31746 */ {(16<<2)|3,{57,48,50}}, +/* 31747 */ {(16<<2)|3,{57,48,97}}, +/* 31748 */ {(16<<2)|3,{57,48,99}}, +/* 31749 */ {(16<<2)|3,{57,48,101}}, +/* 31750 */ {(16<<2)|3,{57,48,105}}, +/* 31751 */ {(16<<2)|3,{57,48,111}}, +/* 31752 */ {(16<<2)|3,{57,48,115}}, +/* 31753 */ {(16<<2)|3,{57,48,116}}, +/* 31754 */ {(11<<2)|2,{57,48,0}}, +/* 31755 */ {(11<<2)|2,{57,48,0}}, +/* 31756 */ {(11<<2)|2,{57,48,0}}, +/* 31757 */ {(11<<2)|2,{57,48,0}}, +/* 31758 */ {(11<<2)|2,{57,48,0}}, +/* 31759 */ {(11<<2)|2,{57,48,0}}, +/* 31760 */ {(11<<2)|2,{57,48,0}}, +/* 31761 */ {(11<<2)|2,{57,48,0}}, +/* 31762 */ {(11<<2)|2,{57,48,0}}, +/* 31763 */ {(11<<2)|2,{57,48,0}}, +/* 31764 */ {(11<<2)|2,{57,48,0}}, +/* 31765 */ {(11<<2)|2,{57,48,0}}, +/* 31766 */ {(11<<2)|2,{57,48,0}}, +/* 31767 */ {(11<<2)|2,{57,48,0}}, +/* 31768 */ {(11<<2)|2,{57,48,0}}, +/* 31769 */ {(11<<2)|2,{57,48,0}}, +/* 31770 */ {(11<<2)|2,{57,48,0}}, +/* 31771 */ {(11<<2)|2,{57,48,0}}, +/* 31772 */ {(11<<2)|2,{57,48,0}}, +/* 31773 */ {(11<<2)|2,{57,48,0}}, +/* 31774 */ {(11<<2)|2,{57,48,0}}, +/* 31775 */ {(11<<2)|2,{57,48,0}}, +/* 31776 */ {(16<<2)|3,{57,49,48}}, +/* 31777 */ {(16<<2)|3,{57,49,49}}, +/* 31778 */ {(16<<2)|3,{57,49,50}}, +/* 31779 */ {(16<<2)|3,{57,49,97}}, +/* 31780 */ {(16<<2)|3,{57,49,99}}, +/* 31781 */ {(16<<2)|3,{57,49,101}}, +/* 31782 */ {(16<<2)|3,{57,49,105}}, +/* 31783 */ {(16<<2)|3,{57,49,111}}, +/* 31784 */ {(16<<2)|3,{57,49,115}}, +/* 31785 */ {(16<<2)|3,{57,49,116}}, +/* 31786 */ {(11<<2)|2,{57,49,0}}, +/* 31787 */ {(11<<2)|2,{57,49,0}}, +/* 31788 */ {(11<<2)|2,{57,49,0}}, +/* 31789 */ {(11<<2)|2,{57,49,0}}, +/* 31790 */ {(11<<2)|2,{57,49,0}}, +/* 31791 */ {(11<<2)|2,{57,49,0}}, +/* 31792 */ {(11<<2)|2,{57,49,0}}, +/* 31793 */ {(11<<2)|2,{57,49,0}}, +/* 31794 */ {(11<<2)|2,{57,49,0}}, +/* 31795 */ {(11<<2)|2,{57,49,0}}, +/* 31796 */ {(11<<2)|2,{57,49,0}}, +/* 31797 */ {(11<<2)|2,{57,49,0}}, +/* 31798 */ {(11<<2)|2,{57,49,0}}, +/* 31799 */ {(11<<2)|2,{57,49,0}}, +/* 31800 */ {(11<<2)|2,{57,49,0}}, +/* 31801 */ {(11<<2)|2,{57,49,0}}, +/* 31802 */ {(11<<2)|2,{57,49,0}}, +/* 31803 */ {(11<<2)|2,{57,49,0}}, +/* 31804 */ {(11<<2)|2,{57,49,0}}, +/* 31805 */ {(11<<2)|2,{57,49,0}}, +/* 31806 */ {(11<<2)|2,{57,49,0}}, +/* 31807 */ {(11<<2)|2,{57,49,0}}, +/* 31808 */ {(16<<2)|3,{57,50,48}}, +/* 31809 */ {(16<<2)|3,{57,50,49}}, +/* 31810 */ {(16<<2)|3,{57,50,50}}, +/* 31811 */ {(16<<2)|3,{57,50,97}}, +/* 31812 */ {(16<<2)|3,{57,50,99}}, +/* 31813 */ {(16<<2)|3,{57,50,101}}, +/* 31814 */ {(16<<2)|3,{57,50,105}}, +/* 31815 */ {(16<<2)|3,{57,50,111}}, +/* 31816 */ {(16<<2)|3,{57,50,115}}, +/* 31817 */ {(16<<2)|3,{57,50,116}}, +/* 31818 */ {(11<<2)|2,{57,50,0}}, +/* 31819 */ {(11<<2)|2,{57,50,0}}, +/* 31820 */ {(11<<2)|2,{57,50,0}}, +/* 31821 */ {(11<<2)|2,{57,50,0}}, +/* 31822 */ {(11<<2)|2,{57,50,0}}, +/* 31823 */ {(11<<2)|2,{57,50,0}}, +/* 31824 */ {(11<<2)|2,{57,50,0}}, +/* 31825 */ {(11<<2)|2,{57,50,0}}, +/* 31826 */ {(11<<2)|2,{57,50,0}}, +/* 31827 */ {(11<<2)|2,{57,50,0}}, +/* 31828 */ {(11<<2)|2,{57,50,0}}, +/* 31829 */ {(11<<2)|2,{57,50,0}}, +/* 31830 */ {(11<<2)|2,{57,50,0}}, +/* 31831 */ {(11<<2)|2,{57,50,0}}, +/* 31832 */ {(11<<2)|2,{57,50,0}}, +/* 31833 */ {(11<<2)|2,{57,50,0}}, +/* 31834 */ {(11<<2)|2,{57,50,0}}, +/* 31835 */ {(11<<2)|2,{57,50,0}}, +/* 31836 */ {(11<<2)|2,{57,50,0}}, +/* 31837 */ {(11<<2)|2,{57,50,0}}, +/* 31838 */ {(11<<2)|2,{57,50,0}}, +/* 31839 */ {(11<<2)|2,{57,50,0}}, +/* 31840 */ {(16<<2)|3,{57,97,48}}, +/* 31841 */ {(16<<2)|3,{57,97,49}}, +/* 31842 */ {(16<<2)|3,{57,97,50}}, +/* 31843 */ {(16<<2)|3,{57,97,97}}, +/* 31844 */ {(16<<2)|3,{57,97,99}}, +/* 31845 */ {(16<<2)|3,{57,97,101}}, +/* 31846 */ {(16<<2)|3,{57,97,105}}, +/* 31847 */ {(16<<2)|3,{57,97,111}}, +/* 31848 */ {(16<<2)|3,{57,97,115}}, +/* 31849 */ {(16<<2)|3,{57,97,116}}, +/* 31850 */ {(11<<2)|2,{57,97,0}}, +/* 31851 */ {(11<<2)|2,{57,97,0}}, +/* 31852 */ {(11<<2)|2,{57,97,0}}, +/* 31853 */ {(11<<2)|2,{57,97,0}}, +/* 31854 */ {(11<<2)|2,{57,97,0}}, +/* 31855 */ {(11<<2)|2,{57,97,0}}, +/* 31856 */ {(11<<2)|2,{57,97,0}}, +/* 31857 */ {(11<<2)|2,{57,97,0}}, +/* 31858 */ {(11<<2)|2,{57,97,0}}, +/* 31859 */ {(11<<2)|2,{57,97,0}}, +/* 31860 */ {(11<<2)|2,{57,97,0}}, +/* 31861 */ {(11<<2)|2,{57,97,0}}, +/* 31862 */ {(11<<2)|2,{57,97,0}}, +/* 31863 */ {(11<<2)|2,{57,97,0}}, +/* 31864 */ {(11<<2)|2,{57,97,0}}, +/* 31865 */ {(11<<2)|2,{57,97,0}}, +/* 31866 */ {(11<<2)|2,{57,97,0}}, +/* 31867 */ {(11<<2)|2,{57,97,0}}, +/* 31868 */ {(11<<2)|2,{57,97,0}}, +/* 31869 */ {(11<<2)|2,{57,97,0}}, +/* 31870 */ {(11<<2)|2,{57,97,0}}, +/* 31871 */ {(11<<2)|2,{57,97,0}}, +/* 31872 */ {(16<<2)|3,{57,99,48}}, +/* 31873 */ {(16<<2)|3,{57,99,49}}, +/* 31874 */ {(16<<2)|3,{57,99,50}}, +/* 31875 */ {(16<<2)|3,{57,99,97}}, +/* 31876 */ {(16<<2)|3,{57,99,99}}, +/* 31877 */ {(16<<2)|3,{57,99,101}}, +/* 31878 */ {(16<<2)|3,{57,99,105}}, +/* 31879 */ {(16<<2)|3,{57,99,111}}, +/* 31880 */ {(16<<2)|3,{57,99,115}}, +/* 31881 */ {(16<<2)|3,{57,99,116}}, +/* 31882 */ {(11<<2)|2,{57,99,0}}, +/* 31883 */ {(11<<2)|2,{57,99,0}}, +/* 31884 */ {(11<<2)|2,{57,99,0}}, +/* 31885 */ {(11<<2)|2,{57,99,0}}, +/* 31886 */ {(11<<2)|2,{57,99,0}}, +/* 31887 */ {(11<<2)|2,{57,99,0}}, +/* 31888 */ {(11<<2)|2,{57,99,0}}, +/* 31889 */ {(11<<2)|2,{57,99,0}}, +/* 31890 */ {(11<<2)|2,{57,99,0}}, +/* 31891 */ {(11<<2)|2,{57,99,0}}, +/* 31892 */ {(11<<2)|2,{57,99,0}}, +/* 31893 */ {(11<<2)|2,{57,99,0}}, +/* 31894 */ {(11<<2)|2,{57,99,0}}, +/* 31895 */ {(11<<2)|2,{57,99,0}}, +/* 31896 */ {(11<<2)|2,{57,99,0}}, +/* 31897 */ {(11<<2)|2,{57,99,0}}, +/* 31898 */ {(11<<2)|2,{57,99,0}}, +/* 31899 */ {(11<<2)|2,{57,99,0}}, +/* 31900 */ {(11<<2)|2,{57,99,0}}, +/* 31901 */ {(11<<2)|2,{57,99,0}}, +/* 31902 */ {(11<<2)|2,{57,99,0}}, +/* 31903 */ {(11<<2)|2,{57,99,0}}, +/* 31904 */ {(16<<2)|3,{57,101,48}}, +/* 31905 */ {(16<<2)|3,{57,101,49}}, +/* 31906 */ {(16<<2)|3,{57,101,50}}, +/* 31907 */ {(16<<2)|3,{57,101,97}}, +/* 31908 */ {(16<<2)|3,{57,101,99}}, +/* 31909 */ {(16<<2)|3,{57,101,101}}, +/* 31910 */ {(16<<2)|3,{57,101,105}}, +/* 31911 */ {(16<<2)|3,{57,101,111}}, +/* 31912 */ {(16<<2)|3,{57,101,115}}, +/* 31913 */ {(16<<2)|3,{57,101,116}}, +/* 31914 */ {(11<<2)|2,{57,101,0}}, +/* 31915 */ {(11<<2)|2,{57,101,0}}, +/* 31916 */ {(11<<2)|2,{57,101,0}}, +/* 31917 */ {(11<<2)|2,{57,101,0}}, +/* 31918 */ {(11<<2)|2,{57,101,0}}, +/* 31919 */ {(11<<2)|2,{57,101,0}}, +/* 31920 */ {(11<<2)|2,{57,101,0}}, +/* 31921 */ {(11<<2)|2,{57,101,0}}, +/* 31922 */ {(11<<2)|2,{57,101,0}}, +/* 31923 */ {(11<<2)|2,{57,101,0}}, +/* 31924 */ {(11<<2)|2,{57,101,0}}, +/* 31925 */ {(11<<2)|2,{57,101,0}}, +/* 31926 */ {(11<<2)|2,{57,101,0}}, +/* 31927 */ {(11<<2)|2,{57,101,0}}, +/* 31928 */ {(11<<2)|2,{57,101,0}}, +/* 31929 */ {(11<<2)|2,{57,101,0}}, +/* 31930 */ {(11<<2)|2,{57,101,0}}, +/* 31931 */ {(11<<2)|2,{57,101,0}}, +/* 31932 */ {(11<<2)|2,{57,101,0}}, +/* 31933 */ {(11<<2)|2,{57,101,0}}, +/* 31934 */ {(11<<2)|2,{57,101,0}}, +/* 31935 */ {(11<<2)|2,{57,101,0}}, +/* 31936 */ {(16<<2)|3,{57,105,48}}, +/* 31937 */ {(16<<2)|3,{57,105,49}}, +/* 31938 */ {(16<<2)|3,{57,105,50}}, +/* 31939 */ {(16<<2)|3,{57,105,97}}, +/* 31940 */ {(16<<2)|3,{57,105,99}}, +/* 31941 */ {(16<<2)|3,{57,105,101}}, +/* 31942 */ {(16<<2)|3,{57,105,105}}, +/* 31943 */ {(16<<2)|3,{57,105,111}}, +/* 31944 */ {(16<<2)|3,{57,105,115}}, +/* 31945 */ {(16<<2)|3,{57,105,116}}, +/* 31946 */ {(11<<2)|2,{57,105,0}}, +/* 31947 */ {(11<<2)|2,{57,105,0}}, +/* 31948 */ {(11<<2)|2,{57,105,0}}, +/* 31949 */ {(11<<2)|2,{57,105,0}}, +/* 31950 */ {(11<<2)|2,{57,105,0}}, +/* 31951 */ {(11<<2)|2,{57,105,0}}, +/* 31952 */ {(11<<2)|2,{57,105,0}}, +/* 31953 */ {(11<<2)|2,{57,105,0}}, +/* 31954 */ {(11<<2)|2,{57,105,0}}, +/* 31955 */ {(11<<2)|2,{57,105,0}}, +/* 31956 */ {(11<<2)|2,{57,105,0}}, +/* 31957 */ {(11<<2)|2,{57,105,0}}, +/* 31958 */ {(11<<2)|2,{57,105,0}}, +/* 31959 */ {(11<<2)|2,{57,105,0}}, +/* 31960 */ {(11<<2)|2,{57,105,0}}, +/* 31961 */ {(11<<2)|2,{57,105,0}}, +/* 31962 */ {(11<<2)|2,{57,105,0}}, +/* 31963 */ {(11<<2)|2,{57,105,0}}, +/* 31964 */ {(11<<2)|2,{57,105,0}}, +/* 31965 */ {(11<<2)|2,{57,105,0}}, +/* 31966 */ {(11<<2)|2,{57,105,0}}, +/* 31967 */ {(11<<2)|2,{57,105,0}}, +/* 31968 */ {(16<<2)|3,{57,111,48}}, +/* 31969 */ {(16<<2)|3,{57,111,49}}, +/* 31970 */ {(16<<2)|3,{57,111,50}}, +/* 31971 */ {(16<<2)|3,{57,111,97}}, +/* 31972 */ {(16<<2)|3,{57,111,99}}, +/* 31973 */ {(16<<2)|3,{57,111,101}}, +/* 31974 */ {(16<<2)|3,{57,111,105}}, +/* 31975 */ {(16<<2)|3,{57,111,111}}, +/* 31976 */ {(16<<2)|3,{57,111,115}}, +/* 31977 */ {(16<<2)|3,{57,111,116}}, +/* 31978 */ {(11<<2)|2,{57,111,0}}, +/* 31979 */ {(11<<2)|2,{57,111,0}}, +/* 31980 */ {(11<<2)|2,{57,111,0}}, +/* 31981 */ {(11<<2)|2,{57,111,0}}, +/* 31982 */ {(11<<2)|2,{57,111,0}}, +/* 31983 */ {(11<<2)|2,{57,111,0}}, +/* 31984 */ {(11<<2)|2,{57,111,0}}, +/* 31985 */ {(11<<2)|2,{57,111,0}}, +/* 31986 */ {(11<<2)|2,{57,111,0}}, +/* 31987 */ {(11<<2)|2,{57,111,0}}, +/* 31988 */ {(11<<2)|2,{57,111,0}}, +/* 31989 */ {(11<<2)|2,{57,111,0}}, +/* 31990 */ {(11<<2)|2,{57,111,0}}, +/* 31991 */ {(11<<2)|2,{57,111,0}}, +/* 31992 */ {(11<<2)|2,{57,111,0}}, +/* 31993 */ {(11<<2)|2,{57,111,0}}, +/* 31994 */ {(11<<2)|2,{57,111,0}}, +/* 31995 */ {(11<<2)|2,{57,111,0}}, +/* 31996 */ {(11<<2)|2,{57,111,0}}, +/* 31997 */ {(11<<2)|2,{57,111,0}}, +/* 31998 */ {(11<<2)|2,{57,111,0}}, +/* 31999 */ {(11<<2)|2,{57,111,0}}, +/* 32000 */ {(16<<2)|3,{57,115,48}}, +/* 32001 */ {(16<<2)|3,{57,115,49}}, +/* 32002 */ {(16<<2)|3,{57,115,50}}, +/* 32003 */ {(16<<2)|3,{57,115,97}}, +/* 32004 */ {(16<<2)|3,{57,115,99}}, +/* 32005 */ {(16<<2)|3,{57,115,101}}, +/* 32006 */ {(16<<2)|3,{57,115,105}}, +/* 32007 */ {(16<<2)|3,{57,115,111}}, +/* 32008 */ {(16<<2)|3,{57,115,115}}, +/* 32009 */ {(16<<2)|3,{57,115,116}}, +/* 32010 */ {(11<<2)|2,{57,115,0}}, +/* 32011 */ {(11<<2)|2,{57,115,0}}, +/* 32012 */ {(11<<2)|2,{57,115,0}}, +/* 32013 */ {(11<<2)|2,{57,115,0}}, +/* 32014 */ {(11<<2)|2,{57,115,0}}, +/* 32015 */ {(11<<2)|2,{57,115,0}}, +/* 32016 */ {(11<<2)|2,{57,115,0}}, +/* 32017 */ {(11<<2)|2,{57,115,0}}, +/* 32018 */ {(11<<2)|2,{57,115,0}}, +/* 32019 */ {(11<<2)|2,{57,115,0}}, +/* 32020 */ {(11<<2)|2,{57,115,0}}, +/* 32021 */ {(11<<2)|2,{57,115,0}}, +/* 32022 */ {(11<<2)|2,{57,115,0}}, +/* 32023 */ {(11<<2)|2,{57,115,0}}, +/* 32024 */ {(11<<2)|2,{57,115,0}}, +/* 32025 */ {(11<<2)|2,{57,115,0}}, +/* 32026 */ {(11<<2)|2,{57,115,0}}, +/* 32027 */ {(11<<2)|2,{57,115,0}}, +/* 32028 */ {(11<<2)|2,{57,115,0}}, +/* 32029 */ {(11<<2)|2,{57,115,0}}, +/* 32030 */ {(11<<2)|2,{57,115,0}}, +/* 32031 */ {(11<<2)|2,{57,115,0}}, +/* 32032 */ {(16<<2)|3,{57,116,48}}, +/* 32033 */ {(16<<2)|3,{57,116,49}}, +/* 32034 */ {(16<<2)|3,{57,116,50}}, +/* 32035 */ {(16<<2)|3,{57,116,97}}, +/* 32036 */ {(16<<2)|3,{57,116,99}}, +/* 32037 */ {(16<<2)|3,{57,116,101}}, +/* 32038 */ {(16<<2)|3,{57,116,105}}, +/* 32039 */ {(16<<2)|3,{57,116,111}}, +/* 32040 */ {(16<<2)|3,{57,116,115}}, +/* 32041 */ {(16<<2)|3,{57,116,116}}, +/* 32042 */ {(11<<2)|2,{57,116,0}}, +/* 32043 */ {(11<<2)|2,{57,116,0}}, +/* 32044 */ {(11<<2)|2,{57,116,0}}, +/* 32045 */ {(11<<2)|2,{57,116,0}}, +/* 32046 */ {(11<<2)|2,{57,116,0}}, +/* 32047 */ {(11<<2)|2,{57,116,0}}, +/* 32048 */ {(11<<2)|2,{57,116,0}}, +/* 32049 */ {(11<<2)|2,{57,116,0}}, +/* 32050 */ {(11<<2)|2,{57,116,0}}, +/* 32051 */ {(11<<2)|2,{57,116,0}}, +/* 32052 */ {(11<<2)|2,{57,116,0}}, +/* 32053 */ {(11<<2)|2,{57,116,0}}, +/* 32054 */ {(11<<2)|2,{57,116,0}}, +/* 32055 */ {(11<<2)|2,{57,116,0}}, +/* 32056 */ {(11<<2)|2,{57,116,0}}, +/* 32057 */ {(11<<2)|2,{57,116,0}}, +/* 32058 */ {(11<<2)|2,{57,116,0}}, +/* 32059 */ {(11<<2)|2,{57,116,0}}, +/* 32060 */ {(11<<2)|2,{57,116,0}}, +/* 32061 */ {(11<<2)|2,{57,116,0}}, +/* 32062 */ {(11<<2)|2,{57,116,0}}, +/* 32063 */ {(11<<2)|2,{57,116,0}}, +/* 32064 */ {(12<<2)|2,{57,32,0}}, +/* 32065 */ {(12<<2)|2,{57,32,0}}, +/* 32066 */ {(12<<2)|2,{57,32,0}}, +/* 32067 */ {(12<<2)|2,{57,32,0}}, +/* 32068 */ {(12<<2)|2,{57,32,0}}, +/* 32069 */ {(12<<2)|2,{57,32,0}}, +/* 32070 */ {(12<<2)|2,{57,32,0}}, +/* 32071 */ {(12<<2)|2,{57,32,0}}, +/* 32072 */ {(12<<2)|2,{57,32,0}}, +/* 32073 */ {(12<<2)|2,{57,32,0}}, +/* 32074 */ {(12<<2)|2,{57,32,0}}, +/* 32075 */ {(12<<2)|2,{57,32,0}}, +/* 32076 */ {(12<<2)|2,{57,32,0}}, +/* 32077 */ {(12<<2)|2,{57,32,0}}, +/* 32078 */ {(12<<2)|2,{57,32,0}}, +/* 32079 */ {(12<<2)|2,{57,32,0}}, +/* 32080 */ {(12<<2)|2,{57,37,0}}, +/* 32081 */ {(12<<2)|2,{57,37,0}}, +/* 32082 */ {(12<<2)|2,{57,37,0}}, +/* 32083 */ {(12<<2)|2,{57,37,0}}, +/* 32084 */ {(12<<2)|2,{57,37,0}}, +/* 32085 */ {(12<<2)|2,{57,37,0}}, +/* 32086 */ {(12<<2)|2,{57,37,0}}, +/* 32087 */ {(12<<2)|2,{57,37,0}}, +/* 32088 */ {(12<<2)|2,{57,37,0}}, +/* 32089 */ {(12<<2)|2,{57,37,0}}, +/* 32090 */ {(12<<2)|2,{57,37,0}}, +/* 32091 */ {(12<<2)|2,{57,37,0}}, +/* 32092 */ {(12<<2)|2,{57,37,0}}, +/* 32093 */ {(12<<2)|2,{57,37,0}}, +/* 32094 */ {(12<<2)|2,{57,37,0}}, +/* 32095 */ {(12<<2)|2,{57,37,0}}, +/* 32096 */ {(12<<2)|2,{57,45,0}}, +/* 32097 */ {(12<<2)|2,{57,45,0}}, +/* 32098 */ {(12<<2)|2,{57,45,0}}, +/* 32099 */ {(12<<2)|2,{57,45,0}}, +/* 32100 */ {(12<<2)|2,{57,45,0}}, +/* 32101 */ {(12<<2)|2,{57,45,0}}, +/* 32102 */ {(12<<2)|2,{57,45,0}}, +/* 32103 */ {(12<<2)|2,{57,45,0}}, +/* 32104 */ {(12<<2)|2,{57,45,0}}, +/* 32105 */ {(12<<2)|2,{57,45,0}}, +/* 32106 */ {(12<<2)|2,{57,45,0}}, +/* 32107 */ {(12<<2)|2,{57,45,0}}, +/* 32108 */ {(12<<2)|2,{57,45,0}}, +/* 32109 */ {(12<<2)|2,{57,45,0}}, +/* 32110 */ {(12<<2)|2,{57,45,0}}, +/* 32111 */ {(12<<2)|2,{57,45,0}}, +/* 32112 */ {(12<<2)|2,{57,46,0}}, +/* 32113 */ {(12<<2)|2,{57,46,0}}, +/* 32114 */ {(12<<2)|2,{57,46,0}}, +/* 32115 */ {(12<<2)|2,{57,46,0}}, +/* 32116 */ {(12<<2)|2,{57,46,0}}, +/* 32117 */ {(12<<2)|2,{57,46,0}}, +/* 32118 */ {(12<<2)|2,{57,46,0}}, +/* 32119 */ {(12<<2)|2,{57,46,0}}, +/* 32120 */ {(12<<2)|2,{57,46,0}}, +/* 32121 */ {(12<<2)|2,{57,46,0}}, +/* 32122 */ {(12<<2)|2,{57,46,0}}, +/* 32123 */ {(12<<2)|2,{57,46,0}}, +/* 32124 */ {(12<<2)|2,{57,46,0}}, +/* 32125 */ {(12<<2)|2,{57,46,0}}, +/* 32126 */ {(12<<2)|2,{57,46,0}}, +/* 32127 */ {(12<<2)|2,{57,46,0}}, +/* 32128 */ {(12<<2)|2,{57,47,0}}, +/* 32129 */ {(12<<2)|2,{57,47,0}}, +/* 32130 */ {(12<<2)|2,{57,47,0}}, +/* 32131 */ {(12<<2)|2,{57,47,0}}, +/* 32132 */ {(12<<2)|2,{57,47,0}}, +/* 32133 */ {(12<<2)|2,{57,47,0}}, +/* 32134 */ {(12<<2)|2,{57,47,0}}, +/* 32135 */ {(12<<2)|2,{57,47,0}}, +/* 32136 */ {(12<<2)|2,{57,47,0}}, +/* 32137 */ {(12<<2)|2,{57,47,0}}, +/* 32138 */ {(12<<2)|2,{57,47,0}}, +/* 32139 */ {(12<<2)|2,{57,47,0}}, +/* 32140 */ {(12<<2)|2,{57,47,0}}, +/* 32141 */ {(12<<2)|2,{57,47,0}}, +/* 32142 */ {(12<<2)|2,{57,47,0}}, +/* 32143 */ {(12<<2)|2,{57,47,0}}, +/* 32144 */ {(12<<2)|2,{57,51,0}}, +/* 32145 */ {(12<<2)|2,{57,51,0}}, +/* 32146 */ {(12<<2)|2,{57,51,0}}, +/* 32147 */ {(12<<2)|2,{57,51,0}}, +/* 32148 */ {(12<<2)|2,{57,51,0}}, +/* 32149 */ {(12<<2)|2,{57,51,0}}, +/* 32150 */ {(12<<2)|2,{57,51,0}}, +/* 32151 */ {(12<<2)|2,{57,51,0}}, +/* 32152 */ {(12<<2)|2,{57,51,0}}, +/* 32153 */ {(12<<2)|2,{57,51,0}}, +/* 32154 */ {(12<<2)|2,{57,51,0}}, +/* 32155 */ {(12<<2)|2,{57,51,0}}, +/* 32156 */ {(12<<2)|2,{57,51,0}}, +/* 32157 */ {(12<<2)|2,{57,51,0}}, +/* 32158 */ {(12<<2)|2,{57,51,0}}, +/* 32159 */ {(12<<2)|2,{57,51,0}}, +/* 32160 */ {(12<<2)|2,{57,52,0}}, +/* 32161 */ {(12<<2)|2,{57,52,0}}, +/* 32162 */ {(12<<2)|2,{57,52,0}}, +/* 32163 */ {(12<<2)|2,{57,52,0}}, +/* 32164 */ {(12<<2)|2,{57,52,0}}, +/* 32165 */ {(12<<2)|2,{57,52,0}}, +/* 32166 */ {(12<<2)|2,{57,52,0}}, +/* 32167 */ {(12<<2)|2,{57,52,0}}, +/* 32168 */ {(12<<2)|2,{57,52,0}}, +/* 32169 */ {(12<<2)|2,{57,52,0}}, +/* 32170 */ {(12<<2)|2,{57,52,0}}, +/* 32171 */ {(12<<2)|2,{57,52,0}}, +/* 32172 */ {(12<<2)|2,{57,52,0}}, +/* 32173 */ {(12<<2)|2,{57,52,0}}, +/* 32174 */ {(12<<2)|2,{57,52,0}}, +/* 32175 */ {(12<<2)|2,{57,52,0}}, +/* 32176 */ {(12<<2)|2,{57,53,0}}, +/* 32177 */ {(12<<2)|2,{57,53,0}}, +/* 32178 */ {(12<<2)|2,{57,53,0}}, +/* 32179 */ {(12<<2)|2,{57,53,0}}, +/* 32180 */ {(12<<2)|2,{57,53,0}}, +/* 32181 */ {(12<<2)|2,{57,53,0}}, +/* 32182 */ {(12<<2)|2,{57,53,0}}, +/* 32183 */ {(12<<2)|2,{57,53,0}}, +/* 32184 */ {(12<<2)|2,{57,53,0}}, +/* 32185 */ {(12<<2)|2,{57,53,0}}, +/* 32186 */ {(12<<2)|2,{57,53,0}}, +/* 32187 */ {(12<<2)|2,{57,53,0}}, +/* 32188 */ {(12<<2)|2,{57,53,0}}, +/* 32189 */ {(12<<2)|2,{57,53,0}}, +/* 32190 */ {(12<<2)|2,{57,53,0}}, +/* 32191 */ {(12<<2)|2,{57,53,0}}, +/* 32192 */ {(12<<2)|2,{57,54,0}}, +/* 32193 */ {(12<<2)|2,{57,54,0}}, +/* 32194 */ {(12<<2)|2,{57,54,0}}, +/* 32195 */ {(12<<2)|2,{57,54,0}}, +/* 32196 */ {(12<<2)|2,{57,54,0}}, +/* 32197 */ {(12<<2)|2,{57,54,0}}, +/* 32198 */ {(12<<2)|2,{57,54,0}}, +/* 32199 */ {(12<<2)|2,{57,54,0}}, +/* 32200 */ {(12<<2)|2,{57,54,0}}, +/* 32201 */ {(12<<2)|2,{57,54,0}}, +/* 32202 */ {(12<<2)|2,{57,54,0}}, +/* 32203 */ {(12<<2)|2,{57,54,0}}, +/* 32204 */ {(12<<2)|2,{57,54,0}}, +/* 32205 */ {(12<<2)|2,{57,54,0}}, +/* 32206 */ {(12<<2)|2,{57,54,0}}, +/* 32207 */ {(12<<2)|2,{57,54,0}}, +/* 32208 */ {(12<<2)|2,{57,55,0}}, +/* 32209 */ {(12<<2)|2,{57,55,0}}, +/* 32210 */ {(12<<2)|2,{57,55,0}}, +/* 32211 */ {(12<<2)|2,{57,55,0}}, +/* 32212 */ {(12<<2)|2,{57,55,0}}, +/* 32213 */ {(12<<2)|2,{57,55,0}}, +/* 32214 */ {(12<<2)|2,{57,55,0}}, +/* 32215 */ {(12<<2)|2,{57,55,0}}, +/* 32216 */ {(12<<2)|2,{57,55,0}}, +/* 32217 */ {(12<<2)|2,{57,55,0}}, +/* 32218 */ {(12<<2)|2,{57,55,0}}, +/* 32219 */ {(12<<2)|2,{57,55,0}}, +/* 32220 */ {(12<<2)|2,{57,55,0}}, +/* 32221 */ {(12<<2)|2,{57,55,0}}, +/* 32222 */ {(12<<2)|2,{57,55,0}}, +/* 32223 */ {(12<<2)|2,{57,55,0}}, +/* 32224 */ {(12<<2)|2,{57,56,0}}, +/* 32225 */ {(12<<2)|2,{57,56,0}}, +/* 32226 */ {(12<<2)|2,{57,56,0}}, +/* 32227 */ {(12<<2)|2,{57,56,0}}, +/* 32228 */ {(12<<2)|2,{57,56,0}}, +/* 32229 */ {(12<<2)|2,{57,56,0}}, +/* 32230 */ {(12<<2)|2,{57,56,0}}, +/* 32231 */ {(12<<2)|2,{57,56,0}}, +/* 32232 */ {(12<<2)|2,{57,56,0}}, +/* 32233 */ {(12<<2)|2,{57,56,0}}, +/* 32234 */ {(12<<2)|2,{57,56,0}}, +/* 32235 */ {(12<<2)|2,{57,56,0}}, +/* 32236 */ {(12<<2)|2,{57,56,0}}, +/* 32237 */ {(12<<2)|2,{57,56,0}}, +/* 32238 */ {(12<<2)|2,{57,56,0}}, +/* 32239 */ {(12<<2)|2,{57,56,0}}, +/* 32240 */ {(12<<2)|2,{57,57,0}}, +/* 32241 */ {(12<<2)|2,{57,57,0}}, +/* 32242 */ {(12<<2)|2,{57,57,0}}, +/* 32243 */ {(12<<2)|2,{57,57,0}}, +/* 32244 */ {(12<<2)|2,{57,57,0}}, +/* 32245 */ {(12<<2)|2,{57,57,0}}, +/* 32246 */ {(12<<2)|2,{57,57,0}}, +/* 32247 */ {(12<<2)|2,{57,57,0}}, +/* 32248 */ {(12<<2)|2,{57,57,0}}, +/* 32249 */ {(12<<2)|2,{57,57,0}}, +/* 32250 */ {(12<<2)|2,{57,57,0}}, +/* 32251 */ {(12<<2)|2,{57,57,0}}, +/* 32252 */ {(12<<2)|2,{57,57,0}}, +/* 32253 */ {(12<<2)|2,{57,57,0}}, +/* 32254 */ {(12<<2)|2,{57,57,0}}, +/* 32255 */ {(12<<2)|2,{57,57,0}}, +/* 32256 */ {(12<<2)|2,{57,61,0}}, +/* 32257 */ {(12<<2)|2,{57,61,0}}, +/* 32258 */ {(12<<2)|2,{57,61,0}}, +/* 32259 */ {(12<<2)|2,{57,61,0}}, +/* 32260 */ {(12<<2)|2,{57,61,0}}, +/* 32261 */ {(12<<2)|2,{57,61,0}}, +/* 32262 */ {(12<<2)|2,{57,61,0}}, +/* 32263 */ {(12<<2)|2,{57,61,0}}, +/* 32264 */ {(12<<2)|2,{57,61,0}}, +/* 32265 */ {(12<<2)|2,{57,61,0}}, +/* 32266 */ {(12<<2)|2,{57,61,0}}, +/* 32267 */ {(12<<2)|2,{57,61,0}}, +/* 32268 */ {(12<<2)|2,{57,61,0}}, +/* 32269 */ {(12<<2)|2,{57,61,0}}, +/* 32270 */ {(12<<2)|2,{57,61,0}}, +/* 32271 */ {(12<<2)|2,{57,61,0}}, +/* 32272 */ {(12<<2)|2,{57,65,0}}, +/* 32273 */ {(12<<2)|2,{57,65,0}}, +/* 32274 */ {(12<<2)|2,{57,65,0}}, +/* 32275 */ {(12<<2)|2,{57,65,0}}, +/* 32276 */ {(12<<2)|2,{57,65,0}}, +/* 32277 */ {(12<<2)|2,{57,65,0}}, +/* 32278 */ {(12<<2)|2,{57,65,0}}, +/* 32279 */ {(12<<2)|2,{57,65,0}}, +/* 32280 */ {(12<<2)|2,{57,65,0}}, +/* 32281 */ {(12<<2)|2,{57,65,0}}, +/* 32282 */ {(12<<2)|2,{57,65,0}}, +/* 32283 */ {(12<<2)|2,{57,65,0}}, +/* 32284 */ {(12<<2)|2,{57,65,0}}, +/* 32285 */ {(12<<2)|2,{57,65,0}}, +/* 32286 */ {(12<<2)|2,{57,65,0}}, +/* 32287 */ {(12<<2)|2,{57,65,0}}, +/* 32288 */ {(12<<2)|2,{57,95,0}}, +/* 32289 */ {(12<<2)|2,{57,95,0}}, +/* 32290 */ {(12<<2)|2,{57,95,0}}, +/* 32291 */ {(12<<2)|2,{57,95,0}}, +/* 32292 */ {(12<<2)|2,{57,95,0}}, +/* 32293 */ {(12<<2)|2,{57,95,0}}, +/* 32294 */ {(12<<2)|2,{57,95,0}}, +/* 32295 */ {(12<<2)|2,{57,95,0}}, +/* 32296 */ {(12<<2)|2,{57,95,0}}, +/* 32297 */ {(12<<2)|2,{57,95,0}}, +/* 32298 */ {(12<<2)|2,{57,95,0}}, +/* 32299 */ {(12<<2)|2,{57,95,0}}, +/* 32300 */ {(12<<2)|2,{57,95,0}}, +/* 32301 */ {(12<<2)|2,{57,95,0}}, +/* 32302 */ {(12<<2)|2,{57,95,0}}, +/* 32303 */ {(12<<2)|2,{57,95,0}}, +/* 32304 */ {(12<<2)|2,{57,98,0}}, +/* 32305 */ {(12<<2)|2,{57,98,0}}, +/* 32306 */ {(12<<2)|2,{57,98,0}}, +/* 32307 */ {(12<<2)|2,{57,98,0}}, +/* 32308 */ {(12<<2)|2,{57,98,0}}, +/* 32309 */ {(12<<2)|2,{57,98,0}}, +/* 32310 */ {(12<<2)|2,{57,98,0}}, +/* 32311 */ {(12<<2)|2,{57,98,0}}, +/* 32312 */ {(12<<2)|2,{57,98,0}}, +/* 32313 */ {(12<<2)|2,{57,98,0}}, +/* 32314 */ {(12<<2)|2,{57,98,0}}, +/* 32315 */ {(12<<2)|2,{57,98,0}}, +/* 32316 */ {(12<<2)|2,{57,98,0}}, +/* 32317 */ {(12<<2)|2,{57,98,0}}, +/* 32318 */ {(12<<2)|2,{57,98,0}}, +/* 32319 */ {(12<<2)|2,{57,98,0}}, +/* 32320 */ {(12<<2)|2,{57,100,0}}, +/* 32321 */ {(12<<2)|2,{57,100,0}}, +/* 32322 */ {(12<<2)|2,{57,100,0}}, +/* 32323 */ {(12<<2)|2,{57,100,0}}, +/* 32324 */ {(12<<2)|2,{57,100,0}}, +/* 32325 */ {(12<<2)|2,{57,100,0}}, +/* 32326 */ {(12<<2)|2,{57,100,0}}, +/* 32327 */ {(12<<2)|2,{57,100,0}}, +/* 32328 */ {(12<<2)|2,{57,100,0}}, +/* 32329 */ {(12<<2)|2,{57,100,0}}, +/* 32330 */ {(12<<2)|2,{57,100,0}}, +/* 32331 */ {(12<<2)|2,{57,100,0}}, +/* 32332 */ {(12<<2)|2,{57,100,0}}, +/* 32333 */ {(12<<2)|2,{57,100,0}}, +/* 32334 */ {(12<<2)|2,{57,100,0}}, +/* 32335 */ {(12<<2)|2,{57,100,0}}, +/* 32336 */ {(12<<2)|2,{57,102,0}}, +/* 32337 */ {(12<<2)|2,{57,102,0}}, +/* 32338 */ {(12<<2)|2,{57,102,0}}, +/* 32339 */ {(12<<2)|2,{57,102,0}}, +/* 32340 */ {(12<<2)|2,{57,102,0}}, +/* 32341 */ {(12<<2)|2,{57,102,0}}, +/* 32342 */ {(12<<2)|2,{57,102,0}}, +/* 32343 */ {(12<<2)|2,{57,102,0}}, +/* 32344 */ {(12<<2)|2,{57,102,0}}, +/* 32345 */ {(12<<2)|2,{57,102,0}}, +/* 32346 */ {(12<<2)|2,{57,102,0}}, +/* 32347 */ {(12<<2)|2,{57,102,0}}, +/* 32348 */ {(12<<2)|2,{57,102,0}}, +/* 32349 */ {(12<<2)|2,{57,102,0}}, +/* 32350 */ {(12<<2)|2,{57,102,0}}, +/* 32351 */ {(12<<2)|2,{57,102,0}}, +/* 32352 */ {(12<<2)|2,{57,103,0}}, +/* 32353 */ {(12<<2)|2,{57,103,0}}, +/* 32354 */ {(12<<2)|2,{57,103,0}}, +/* 32355 */ {(12<<2)|2,{57,103,0}}, +/* 32356 */ {(12<<2)|2,{57,103,0}}, +/* 32357 */ {(12<<2)|2,{57,103,0}}, +/* 32358 */ {(12<<2)|2,{57,103,0}}, +/* 32359 */ {(12<<2)|2,{57,103,0}}, +/* 32360 */ {(12<<2)|2,{57,103,0}}, +/* 32361 */ {(12<<2)|2,{57,103,0}}, +/* 32362 */ {(12<<2)|2,{57,103,0}}, +/* 32363 */ {(12<<2)|2,{57,103,0}}, +/* 32364 */ {(12<<2)|2,{57,103,0}}, +/* 32365 */ {(12<<2)|2,{57,103,0}}, +/* 32366 */ {(12<<2)|2,{57,103,0}}, +/* 32367 */ {(12<<2)|2,{57,103,0}}, +/* 32368 */ {(12<<2)|2,{57,104,0}}, +/* 32369 */ {(12<<2)|2,{57,104,0}}, +/* 32370 */ {(12<<2)|2,{57,104,0}}, +/* 32371 */ {(12<<2)|2,{57,104,0}}, +/* 32372 */ {(12<<2)|2,{57,104,0}}, +/* 32373 */ {(12<<2)|2,{57,104,0}}, +/* 32374 */ {(12<<2)|2,{57,104,0}}, +/* 32375 */ {(12<<2)|2,{57,104,0}}, +/* 32376 */ {(12<<2)|2,{57,104,0}}, +/* 32377 */ {(12<<2)|2,{57,104,0}}, +/* 32378 */ {(12<<2)|2,{57,104,0}}, +/* 32379 */ {(12<<2)|2,{57,104,0}}, +/* 32380 */ {(12<<2)|2,{57,104,0}}, +/* 32381 */ {(12<<2)|2,{57,104,0}}, +/* 32382 */ {(12<<2)|2,{57,104,0}}, +/* 32383 */ {(12<<2)|2,{57,104,0}}, +/* 32384 */ {(12<<2)|2,{57,108,0}}, +/* 32385 */ {(12<<2)|2,{57,108,0}}, +/* 32386 */ {(12<<2)|2,{57,108,0}}, +/* 32387 */ {(12<<2)|2,{57,108,0}}, +/* 32388 */ {(12<<2)|2,{57,108,0}}, +/* 32389 */ {(12<<2)|2,{57,108,0}}, +/* 32390 */ {(12<<2)|2,{57,108,0}}, +/* 32391 */ {(12<<2)|2,{57,108,0}}, +/* 32392 */ {(12<<2)|2,{57,108,0}}, +/* 32393 */ {(12<<2)|2,{57,108,0}}, +/* 32394 */ {(12<<2)|2,{57,108,0}}, +/* 32395 */ {(12<<2)|2,{57,108,0}}, +/* 32396 */ {(12<<2)|2,{57,108,0}}, +/* 32397 */ {(12<<2)|2,{57,108,0}}, +/* 32398 */ {(12<<2)|2,{57,108,0}}, +/* 32399 */ {(12<<2)|2,{57,108,0}}, +/* 32400 */ {(12<<2)|2,{57,109,0}}, +/* 32401 */ {(12<<2)|2,{57,109,0}}, +/* 32402 */ {(12<<2)|2,{57,109,0}}, +/* 32403 */ {(12<<2)|2,{57,109,0}}, +/* 32404 */ {(12<<2)|2,{57,109,0}}, +/* 32405 */ {(12<<2)|2,{57,109,0}}, +/* 32406 */ {(12<<2)|2,{57,109,0}}, +/* 32407 */ {(12<<2)|2,{57,109,0}}, +/* 32408 */ {(12<<2)|2,{57,109,0}}, +/* 32409 */ {(12<<2)|2,{57,109,0}}, +/* 32410 */ {(12<<2)|2,{57,109,0}}, +/* 32411 */ {(12<<2)|2,{57,109,0}}, +/* 32412 */ {(12<<2)|2,{57,109,0}}, +/* 32413 */ {(12<<2)|2,{57,109,0}}, +/* 32414 */ {(12<<2)|2,{57,109,0}}, +/* 32415 */ {(12<<2)|2,{57,109,0}}, +/* 32416 */ {(12<<2)|2,{57,110,0}}, +/* 32417 */ {(12<<2)|2,{57,110,0}}, +/* 32418 */ {(12<<2)|2,{57,110,0}}, +/* 32419 */ {(12<<2)|2,{57,110,0}}, +/* 32420 */ {(12<<2)|2,{57,110,0}}, +/* 32421 */ {(12<<2)|2,{57,110,0}}, +/* 32422 */ {(12<<2)|2,{57,110,0}}, +/* 32423 */ {(12<<2)|2,{57,110,0}}, +/* 32424 */ {(12<<2)|2,{57,110,0}}, +/* 32425 */ {(12<<2)|2,{57,110,0}}, +/* 32426 */ {(12<<2)|2,{57,110,0}}, +/* 32427 */ {(12<<2)|2,{57,110,0}}, +/* 32428 */ {(12<<2)|2,{57,110,0}}, +/* 32429 */ {(12<<2)|2,{57,110,0}}, +/* 32430 */ {(12<<2)|2,{57,110,0}}, +/* 32431 */ {(12<<2)|2,{57,110,0}}, +/* 32432 */ {(12<<2)|2,{57,112,0}}, +/* 32433 */ {(12<<2)|2,{57,112,0}}, +/* 32434 */ {(12<<2)|2,{57,112,0}}, +/* 32435 */ {(12<<2)|2,{57,112,0}}, +/* 32436 */ {(12<<2)|2,{57,112,0}}, +/* 32437 */ {(12<<2)|2,{57,112,0}}, +/* 32438 */ {(12<<2)|2,{57,112,0}}, +/* 32439 */ {(12<<2)|2,{57,112,0}}, +/* 32440 */ {(12<<2)|2,{57,112,0}}, +/* 32441 */ {(12<<2)|2,{57,112,0}}, +/* 32442 */ {(12<<2)|2,{57,112,0}}, +/* 32443 */ {(12<<2)|2,{57,112,0}}, +/* 32444 */ {(12<<2)|2,{57,112,0}}, +/* 32445 */ {(12<<2)|2,{57,112,0}}, +/* 32446 */ {(12<<2)|2,{57,112,0}}, +/* 32447 */ {(12<<2)|2,{57,112,0}}, +/* 32448 */ {(12<<2)|2,{57,114,0}}, +/* 32449 */ {(12<<2)|2,{57,114,0}}, +/* 32450 */ {(12<<2)|2,{57,114,0}}, +/* 32451 */ {(12<<2)|2,{57,114,0}}, +/* 32452 */ {(12<<2)|2,{57,114,0}}, +/* 32453 */ {(12<<2)|2,{57,114,0}}, +/* 32454 */ {(12<<2)|2,{57,114,0}}, +/* 32455 */ {(12<<2)|2,{57,114,0}}, +/* 32456 */ {(12<<2)|2,{57,114,0}}, +/* 32457 */ {(12<<2)|2,{57,114,0}}, +/* 32458 */ {(12<<2)|2,{57,114,0}}, +/* 32459 */ {(12<<2)|2,{57,114,0}}, +/* 32460 */ {(12<<2)|2,{57,114,0}}, +/* 32461 */ {(12<<2)|2,{57,114,0}}, +/* 32462 */ {(12<<2)|2,{57,114,0}}, +/* 32463 */ {(12<<2)|2,{57,114,0}}, +/* 32464 */ {(12<<2)|2,{57,117,0}}, +/* 32465 */ {(12<<2)|2,{57,117,0}}, +/* 32466 */ {(12<<2)|2,{57,117,0}}, +/* 32467 */ {(12<<2)|2,{57,117,0}}, +/* 32468 */ {(12<<2)|2,{57,117,0}}, +/* 32469 */ {(12<<2)|2,{57,117,0}}, +/* 32470 */ {(12<<2)|2,{57,117,0}}, +/* 32471 */ {(12<<2)|2,{57,117,0}}, +/* 32472 */ {(12<<2)|2,{57,117,0}}, +/* 32473 */ {(12<<2)|2,{57,117,0}}, +/* 32474 */ {(12<<2)|2,{57,117,0}}, +/* 32475 */ {(12<<2)|2,{57,117,0}}, +/* 32476 */ {(12<<2)|2,{57,117,0}}, +/* 32477 */ {(12<<2)|2,{57,117,0}}, +/* 32478 */ {(12<<2)|2,{57,117,0}}, +/* 32479 */ {(12<<2)|2,{57,117,0}}, +/* 32480 */ {(13<<2)|2,{57,58,0}}, +/* 32481 */ {(13<<2)|2,{57,58,0}}, +/* 32482 */ {(13<<2)|2,{57,58,0}}, +/* 32483 */ {(13<<2)|2,{57,58,0}}, +/* 32484 */ {(13<<2)|2,{57,58,0}}, +/* 32485 */ {(13<<2)|2,{57,58,0}}, +/* 32486 */ {(13<<2)|2,{57,58,0}}, +/* 32487 */ {(13<<2)|2,{57,58,0}}, +/* 32488 */ {(13<<2)|2,{57,66,0}}, +/* 32489 */ {(13<<2)|2,{57,66,0}}, +/* 32490 */ {(13<<2)|2,{57,66,0}}, +/* 32491 */ {(13<<2)|2,{57,66,0}}, +/* 32492 */ {(13<<2)|2,{57,66,0}}, +/* 32493 */ {(13<<2)|2,{57,66,0}}, +/* 32494 */ {(13<<2)|2,{57,66,0}}, +/* 32495 */ {(13<<2)|2,{57,66,0}}, +/* 32496 */ {(13<<2)|2,{57,67,0}}, +/* 32497 */ {(13<<2)|2,{57,67,0}}, +/* 32498 */ {(13<<2)|2,{57,67,0}}, +/* 32499 */ {(13<<2)|2,{57,67,0}}, +/* 32500 */ {(13<<2)|2,{57,67,0}}, +/* 32501 */ {(13<<2)|2,{57,67,0}}, +/* 32502 */ {(13<<2)|2,{57,67,0}}, +/* 32503 */ {(13<<2)|2,{57,67,0}}, +/* 32504 */ {(13<<2)|2,{57,68,0}}, +/* 32505 */ {(13<<2)|2,{57,68,0}}, +/* 32506 */ {(13<<2)|2,{57,68,0}}, +/* 32507 */ {(13<<2)|2,{57,68,0}}, +/* 32508 */ {(13<<2)|2,{57,68,0}}, +/* 32509 */ {(13<<2)|2,{57,68,0}}, +/* 32510 */ {(13<<2)|2,{57,68,0}}, +/* 32511 */ {(13<<2)|2,{57,68,0}}, +/* 32512 */ {(13<<2)|2,{57,69,0}}, +/* 32513 */ {(13<<2)|2,{57,69,0}}, +/* 32514 */ {(13<<2)|2,{57,69,0}}, +/* 32515 */ {(13<<2)|2,{57,69,0}}, +/* 32516 */ {(13<<2)|2,{57,69,0}}, +/* 32517 */ {(13<<2)|2,{57,69,0}}, +/* 32518 */ {(13<<2)|2,{57,69,0}}, +/* 32519 */ {(13<<2)|2,{57,69,0}}, +/* 32520 */ {(13<<2)|2,{57,70,0}}, +/* 32521 */ {(13<<2)|2,{57,70,0}}, +/* 32522 */ {(13<<2)|2,{57,70,0}}, +/* 32523 */ {(13<<2)|2,{57,70,0}}, +/* 32524 */ {(13<<2)|2,{57,70,0}}, +/* 32525 */ {(13<<2)|2,{57,70,0}}, +/* 32526 */ {(13<<2)|2,{57,70,0}}, +/* 32527 */ {(13<<2)|2,{57,70,0}}, +/* 32528 */ {(13<<2)|2,{57,71,0}}, +/* 32529 */ {(13<<2)|2,{57,71,0}}, +/* 32530 */ {(13<<2)|2,{57,71,0}}, +/* 32531 */ {(13<<2)|2,{57,71,0}}, +/* 32532 */ {(13<<2)|2,{57,71,0}}, +/* 32533 */ {(13<<2)|2,{57,71,0}}, +/* 32534 */ {(13<<2)|2,{57,71,0}}, +/* 32535 */ {(13<<2)|2,{57,71,0}}, +/* 32536 */ {(13<<2)|2,{57,72,0}}, +/* 32537 */ {(13<<2)|2,{57,72,0}}, +/* 32538 */ {(13<<2)|2,{57,72,0}}, +/* 32539 */ {(13<<2)|2,{57,72,0}}, +/* 32540 */ {(13<<2)|2,{57,72,0}}, +/* 32541 */ {(13<<2)|2,{57,72,0}}, +/* 32542 */ {(13<<2)|2,{57,72,0}}, +/* 32543 */ {(13<<2)|2,{57,72,0}}, +/* 32544 */ {(13<<2)|2,{57,73,0}}, +/* 32545 */ {(13<<2)|2,{57,73,0}}, +/* 32546 */ {(13<<2)|2,{57,73,0}}, +/* 32547 */ {(13<<2)|2,{57,73,0}}, +/* 32548 */ {(13<<2)|2,{57,73,0}}, +/* 32549 */ {(13<<2)|2,{57,73,0}}, +/* 32550 */ {(13<<2)|2,{57,73,0}}, +/* 32551 */ {(13<<2)|2,{57,73,0}}, +/* 32552 */ {(13<<2)|2,{57,74,0}}, +/* 32553 */ {(13<<2)|2,{57,74,0}}, +/* 32554 */ {(13<<2)|2,{57,74,0}}, +/* 32555 */ {(13<<2)|2,{57,74,0}}, +/* 32556 */ {(13<<2)|2,{57,74,0}}, +/* 32557 */ {(13<<2)|2,{57,74,0}}, +/* 32558 */ {(13<<2)|2,{57,74,0}}, +/* 32559 */ {(13<<2)|2,{57,74,0}}, +/* 32560 */ {(13<<2)|2,{57,75,0}}, +/* 32561 */ {(13<<2)|2,{57,75,0}}, +/* 32562 */ {(13<<2)|2,{57,75,0}}, +/* 32563 */ {(13<<2)|2,{57,75,0}}, +/* 32564 */ {(13<<2)|2,{57,75,0}}, +/* 32565 */ {(13<<2)|2,{57,75,0}}, +/* 32566 */ {(13<<2)|2,{57,75,0}}, +/* 32567 */ {(13<<2)|2,{57,75,0}}, +/* 32568 */ {(13<<2)|2,{57,76,0}}, +/* 32569 */ {(13<<2)|2,{57,76,0}}, +/* 32570 */ {(13<<2)|2,{57,76,0}}, +/* 32571 */ {(13<<2)|2,{57,76,0}}, +/* 32572 */ {(13<<2)|2,{57,76,0}}, +/* 32573 */ {(13<<2)|2,{57,76,0}}, +/* 32574 */ {(13<<2)|2,{57,76,0}}, +/* 32575 */ {(13<<2)|2,{57,76,0}}, +/* 32576 */ {(13<<2)|2,{57,77,0}}, +/* 32577 */ {(13<<2)|2,{57,77,0}}, +/* 32578 */ {(13<<2)|2,{57,77,0}}, +/* 32579 */ {(13<<2)|2,{57,77,0}}, +/* 32580 */ {(13<<2)|2,{57,77,0}}, +/* 32581 */ {(13<<2)|2,{57,77,0}}, +/* 32582 */ {(13<<2)|2,{57,77,0}}, +/* 32583 */ {(13<<2)|2,{57,77,0}}, +/* 32584 */ {(13<<2)|2,{57,78,0}}, +/* 32585 */ {(13<<2)|2,{57,78,0}}, +/* 32586 */ {(13<<2)|2,{57,78,0}}, +/* 32587 */ {(13<<2)|2,{57,78,0}}, +/* 32588 */ {(13<<2)|2,{57,78,0}}, +/* 32589 */ {(13<<2)|2,{57,78,0}}, +/* 32590 */ {(13<<2)|2,{57,78,0}}, +/* 32591 */ {(13<<2)|2,{57,78,0}}, +/* 32592 */ {(13<<2)|2,{57,79,0}}, +/* 32593 */ {(13<<2)|2,{57,79,0}}, +/* 32594 */ {(13<<2)|2,{57,79,0}}, +/* 32595 */ {(13<<2)|2,{57,79,0}}, +/* 32596 */ {(13<<2)|2,{57,79,0}}, +/* 32597 */ {(13<<2)|2,{57,79,0}}, +/* 32598 */ {(13<<2)|2,{57,79,0}}, +/* 32599 */ {(13<<2)|2,{57,79,0}}, +/* 32600 */ {(13<<2)|2,{57,80,0}}, +/* 32601 */ {(13<<2)|2,{57,80,0}}, +/* 32602 */ {(13<<2)|2,{57,80,0}}, +/* 32603 */ {(13<<2)|2,{57,80,0}}, +/* 32604 */ {(13<<2)|2,{57,80,0}}, +/* 32605 */ {(13<<2)|2,{57,80,0}}, +/* 32606 */ {(13<<2)|2,{57,80,0}}, +/* 32607 */ {(13<<2)|2,{57,80,0}}, +/* 32608 */ {(13<<2)|2,{57,81,0}}, +/* 32609 */ {(13<<2)|2,{57,81,0}}, +/* 32610 */ {(13<<2)|2,{57,81,0}}, +/* 32611 */ {(13<<2)|2,{57,81,0}}, +/* 32612 */ {(13<<2)|2,{57,81,0}}, +/* 32613 */ {(13<<2)|2,{57,81,0}}, +/* 32614 */ {(13<<2)|2,{57,81,0}}, +/* 32615 */ {(13<<2)|2,{57,81,0}}, +/* 32616 */ {(13<<2)|2,{57,82,0}}, +/* 32617 */ {(13<<2)|2,{57,82,0}}, +/* 32618 */ {(13<<2)|2,{57,82,0}}, +/* 32619 */ {(13<<2)|2,{57,82,0}}, +/* 32620 */ {(13<<2)|2,{57,82,0}}, +/* 32621 */ {(13<<2)|2,{57,82,0}}, +/* 32622 */ {(13<<2)|2,{57,82,0}}, +/* 32623 */ {(13<<2)|2,{57,82,0}}, +/* 32624 */ {(13<<2)|2,{57,83,0}}, +/* 32625 */ {(13<<2)|2,{57,83,0}}, +/* 32626 */ {(13<<2)|2,{57,83,0}}, +/* 32627 */ {(13<<2)|2,{57,83,0}}, +/* 32628 */ {(13<<2)|2,{57,83,0}}, +/* 32629 */ {(13<<2)|2,{57,83,0}}, +/* 32630 */ {(13<<2)|2,{57,83,0}}, +/* 32631 */ {(13<<2)|2,{57,83,0}}, +/* 32632 */ {(13<<2)|2,{57,84,0}}, +/* 32633 */ {(13<<2)|2,{57,84,0}}, +/* 32634 */ {(13<<2)|2,{57,84,0}}, +/* 32635 */ {(13<<2)|2,{57,84,0}}, +/* 32636 */ {(13<<2)|2,{57,84,0}}, +/* 32637 */ {(13<<2)|2,{57,84,0}}, +/* 32638 */ {(13<<2)|2,{57,84,0}}, +/* 32639 */ {(13<<2)|2,{57,84,0}}, +/* 32640 */ {(13<<2)|2,{57,85,0}}, +/* 32641 */ {(13<<2)|2,{57,85,0}}, +/* 32642 */ {(13<<2)|2,{57,85,0}}, +/* 32643 */ {(13<<2)|2,{57,85,0}}, +/* 32644 */ {(13<<2)|2,{57,85,0}}, +/* 32645 */ {(13<<2)|2,{57,85,0}}, +/* 32646 */ {(13<<2)|2,{57,85,0}}, +/* 32647 */ {(13<<2)|2,{57,85,0}}, +/* 32648 */ {(13<<2)|2,{57,86,0}}, +/* 32649 */ {(13<<2)|2,{57,86,0}}, +/* 32650 */ {(13<<2)|2,{57,86,0}}, +/* 32651 */ {(13<<2)|2,{57,86,0}}, +/* 32652 */ {(13<<2)|2,{57,86,0}}, +/* 32653 */ {(13<<2)|2,{57,86,0}}, +/* 32654 */ {(13<<2)|2,{57,86,0}}, +/* 32655 */ {(13<<2)|2,{57,86,0}}, +/* 32656 */ {(13<<2)|2,{57,87,0}}, +/* 32657 */ {(13<<2)|2,{57,87,0}}, +/* 32658 */ {(13<<2)|2,{57,87,0}}, +/* 32659 */ {(13<<2)|2,{57,87,0}}, +/* 32660 */ {(13<<2)|2,{57,87,0}}, +/* 32661 */ {(13<<2)|2,{57,87,0}}, +/* 32662 */ {(13<<2)|2,{57,87,0}}, +/* 32663 */ {(13<<2)|2,{57,87,0}}, +/* 32664 */ {(13<<2)|2,{57,89,0}}, +/* 32665 */ {(13<<2)|2,{57,89,0}}, +/* 32666 */ {(13<<2)|2,{57,89,0}}, +/* 32667 */ {(13<<2)|2,{57,89,0}}, +/* 32668 */ {(13<<2)|2,{57,89,0}}, +/* 32669 */ {(13<<2)|2,{57,89,0}}, +/* 32670 */ {(13<<2)|2,{57,89,0}}, +/* 32671 */ {(13<<2)|2,{57,89,0}}, +/* 32672 */ {(13<<2)|2,{57,106,0}}, +/* 32673 */ {(13<<2)|2,{57,106,0}}, +/* 32674 */ {(13<<2)|2,{57,106,0}}, +/* 32675 */ {(13<<2)|2,{57,106,0}}, +/* 32676 */ {(13<<2)|2,{57,106,0}}, +/* 32677 */ {(13<<2)|2,{57,106,0}}, +/* 32678 */ {(13<<2)|2,{57,106,0}}, +/* 32679 */ {(13<<2)|2,{57,106,0}}, +/* 32680 */ {(13<<2)|2,{57,107,0}}, +/* 32681 */ {(13<<2)|2,{57,107,0}}, +/* 32682 */ {(13<<2)|2,{57,107,0}}, +/* 32683 */ {(13<<2)|2,{57,107,0}}, +/* 32684 */ {(13<<2)|2,{57,107,0}}, +/* 32685 */ {(13<<2)|2,{57,107,0}}, +/* 32686 */ {(13<<2)|2,{57,107,0}}, +/* 32687 */ {(13<<2)|2,{57,107,0}}, +/* 32688 */ {(13<<2)|2,{57,113,0}}, +/* 32689 */ {(13<<2)|2,{57,113,0}}, +/* 32690 */ {(13<<2)|2,{57,113,0}}, +/* 32691 */ {(13<<2)|2,{57,113,0}}, +/* 32692 */ {(13<<2)|2,{57,113,0}}, +/* 32693 */ {(13<<2)|2,{57,113,0}}, +/* 32694 */ {(13<<2)|2,{57,113,0}}, +/* 32695 */ {(13<<2)|2,{57,113,0}}, +/* 32696 */ {(13<<2)|2,{57,118,0}}, +/* 32697 */ {(13<<2)|2,{57,118,0}}, +/* 32698 */ {(13<<2)|2,{57,118,0}}, +/* 32699 */ {(13<<2)|2,{57,118,0}}, +/* 32700 */ {(13<<2)|2,{57,118,0}}, +/* 32701 */ {(13<<2)|2,{57,118,0}}, +/* 32702 */ {(13<<2)|2,{57,118,0}}, +/* 32703 */ {(13<<2)|2,{57,118,0}}, +/* 32704 */ {(13<<2)|2,{57,119,0}}, +/* 32705 */ {(13<<2)|2,{57,119,0}}, +/* 32706 */ {(13<<2)|2,{57,119,0}}, +/* 32707 */ {(13<<2)|2,{57,119,0}}, +/* 32708 */ {(13<<2)|2,{57,119,0}}, +/* 32709 */ {(13<<2)|2,{57,119,0}}, +/* 32710 */ {(13<<2)|2,{57,119,0}}, +/* 32711 */ {(13<<2)|2,{57,119,0}}, +/* 32712 */ {(13<<2)|2,{57,120,0}}, +/* 32713 */ {(13<<2)|2,{57,120,0}}, +/* 32714 */ {(13<<2)|2,{57,120,0}}, +/* 32715 */ {(13<<2)|2,{57,120,0}}, +/* 32716 */ {(13<<2)|2,{57,120,0}}, +/* 32717 */ {(13<<2)|2,{57,120,0}}, +/* 32718 */ {(13<<2)|2,{57,120,0}}, +/* 32719 */ {(13<<2)|2,{57,120,0}}, +/* 32720 */ {(13<<2)|2,{57,121,0}}, +/* 32721 */ {(13<<2)|2,{57,121,0}}, +/* 32722 */ {(13<<2)|2,{57,121,0}}, +/* 32723 */ {(13<<2)|2,{57,121,0}}, +/* 32724 */ {(13<<2)|2,{57,121,0}}, +/* 32725 */ {(13<<2)|2,{57,121,0}}, +/* 32726 */ {(13<<2)|2,{57,121,0}}, +/* 32727 */ {(13<<2)|2,{57,121,0}}, +/* 32728 */ {(13<<2)|2,{57,122,0}}, +/* 32729 */ {(13<<2)|2,{57,122,0}}, +/* 32730 */ {(13<<2)|2,{57,122,0}}, +/* 32731 */ {(13<<2)|2,{57,122,0}}, +/* 32732 */ {(13<<2)|2,{57,122,0}}, +/* 32733 */ {(13<<2)|2,{57,122,0}}, +/* 32734 */ {(13<<2)|2,{57,122,0}}, +/* 32735 */ {(13<<2)|2,{57,122,0}}, +/* 32736 */ {(14<<2)|2,{57,38,0}}, +/* 32737 */ {(14<<2)|2,{57,38,0}}, +/* 32738 */ {(14<<2)|2,{57,38,0}}, +/* 32739 */ {(14<<2)|2,{57,38,0}}, +/* 32740 */ {(14<<2)|2,{57,42,0}}, +/* 32741 */ {(14<<2)|2,{57,42,0}}, +/* 32742 */ {(14<<2)|2,{57,42,0}}, +/* 32743 */ {(14<<2)|2,{57,42,0}}, +/* 32744 */ {(14<<2)|2,{57,44,0}}, +/* 32745 */ {(14<<2)|2,{57,44,0}}, +/* 32746 */ {(14<<2)|2,{57,44,0}}, +/* 32747 */ {(14<<2)|2,{57,44,0}}, +/* 32748 */ {(14<<2)|2,{57,59,0}}, +/* 32749 */ {(14<<2)|2,{57,59,0}}, +/* 32750 */ {(14<<2)|2,{57,59,0}}, +/* 32751 */ {(14<<2)|2,{57,59,0}}, +/* 32752 */ {(14<<2)|2,{57,88,0}}, +/* 32753 */ {(14<<2)|2,{57,88,0}}, +/* 32754 */ {(14<<2)|2,{57,88,0}}, +/* 32755 */ {(14<<2)|2,{57,88,0}}, +/* 32756 */ {(14<<2)|2,{57,90,0}}, +/* 32757 */ {(14<<2)|2,{57,90,0}}, +/* 32758 */ {(14<<2)|2,{57,90,0}}, +/* 32759 */ {(14<<2)|2,{57,90,0}}, +/* 32760 */ {(16<<2)|2,{57,33,0}}, +/* 32761 */ {(16<<2)|2,{57,34,0}}, +/* 32762 */ {(16<<2)|2,{57,40,0}}, +/* 32763 */ {(16<<2)|2,{57,41,0}}, +/* 32764 */ {(16<<2)|2,{57,63,0}}, +/* 32765 */ {(6<<2)|1,{57,0,0}}, +/* 32766 */ {(6<<2)|1,{57,0,0}}, +/* 32767 */ {(6<<2)|1,{57,0,0}}, +/* 32768 */ {(16<<2)|3,{61,48,48}}, +/* 32769 */ {(16<<2)|3,{61,48,49}}, +/* 32770 */ {(16<<2)|3,{61,48,50}}, +/* 32771 */ {(16<<2)|3,{61,48,97}}, +/* 32772 */ {(16<<2)|3,{61,48,99}}, +/* 32773 */ {(16<<2)|3,{61,48,101}}, +/* 32774 */ {(16<<2)|3,{61,48,105}}, +/* 32775 */ {(16<<2)|3,{61,48,111}}, +/* 32776 */ {(16<<2)|3,{61,48,115}}, +/* 32777 */ {(16<<2)|3,{61,48,116}}, +/* 32778 */ {(11<<2)|2,{61,48,0}}, +/* 32779 */ {(11<<2)|2,{61,48,0}}, +/* 32780 */ {(11<<2)|2,{61,48,0}}, +/* 32781 */ {(11<<2)|2,{61,48,0}}, +/* 32782 */ {(11<<2)|2,{61,48,0}}, +/* 32783 */ {(11<<2)|2,{61,48,0}}, +/* 32784 */ {(11<<2)|2,{61,48,0}}, +/* 32785 */ {(11<<2)|2,{61,48,0}}, +/* 32786 */ {(11<<2)|2,{61,48,0}}, +/* 32787 */ {(11<<2)|2,{61,48,0}}, +/* 32788 */ {(11<<2)|2,{61,48,0}}, +/* 32789 */ {(11<<2)|2,{61,48,0}}, +/* 32790 */ {(11<<2)|2,{61,48,0}}, +/* 32791 */ {(11<<2)|2,{61,48,0}}, +/* 32792 */ {(11<<2)|2,{61,48,0}}, +/* 32793 */ {(11<<2)|2,{61,48,0}}, +/* 32794 */ {(11<<2)|2,{61,48,0}}, +/* 32795 */ {(11<<2)|2,{61,48,0}}, +/* 32796 */ {(11<<2)|2,{61,48,0}}, +/* 32797 */ {(11<<2)|2,{61,48,0}}, +/* 32798 */ {(11<<2)|2,{61,48,0}}, +/* 32799 */ {(11<<2)|2,{61,48,0}}, +/* 32800 */ {(16<<2)|3,{61,49,48}}, +/* 32801 */ {(16<<2)|3,{61,49,49}}, +/* 32802 */ {(16<<2)|3,{61,49,50}}, +/* 32803 */ {(16<<2)|3,{61,49,97}}, +/* 32804 */ {(16<<2)|3,{61,49,99}}, +/* 32805 */ {(16<<2)|3,{61,49,101}}, +/* 32806 */ {(16<<2)|3,{61,49,105}}, +/* 32807 */ {(16<<2)|3,{61,49,111}}, +/* 32808 */ {(16<<2)|3,{61,49,115}}, +/* 32809 */ {(16<<2)|3,{61,49,116}}, +/* 32810 */ {(11<<2)|2,{61,49,0}}, +/* 32811 */ {(11<<2)|2,{61,49,0}}, +/* 32812 */ {(11<<2)|2,{61,49,0}}, +/* 32813 */ {(11<<2)|2,{61,49,0}}, +/* 32814 */ {(11<<2)|2,{61,49,0}}, +/* 32815 */ {(11<<2)|2,{61,49,0}}, +/* 32816 */ {(11<<2)|2,{61,49,0}}, +/* 32817 */ {(11<<2)|2,{61,49,0}}, +/* 32818 */ {(11<<2)|2,{61,49,0}}, +/* 32819 */ {(11<<2)|2,{61,49,0}}, +/* 32820 */ {(11<<2)|2,{61,49,0}}, +/* 32821 */ {(11<<2)|2,{61,49,0}}, +/* 32822 */ {(11<<2)|2,{61,49,0}}, +/* 32823 */ {(11<<2)|2,{61,49,0}}, +/* 32824 */ {(11<<2)|2,{61,49,0}}, +/* 32825 */ {(11<<2)|2,{61,49,0}}, +/* 32826 */ {(11<<2)|2,{61,49,0}}, +/* 32827 */ {(11<<2)|2,{61,49,0}}, +/* 32828 */ {(11<<2)|2,{61,49,0}}, +/* 32829 */ {(11<<2)|2,{61,49,0}}, +/* 32830 */ {(11<<2)|2,{61,49,0}}, +/* 32831 */ {(11<<2)|2,{61,49,0}}, +/* 32832 */ {(16<<2)|3,{61,50,48}}, +/* 32833 */ {(16<<2)|3,{61,50,49}}, +/* 32834 */ {(16<<2)|3,{61,50,50}}, +/* 32835 */ {(16<<2)|3,{61,50,97}}, +/* 32836 */ {(16<<2)|3,{61,50,99}}, +/* 32837 */ {(16<<2)|3,{61,50,101}}, +/* 32838 */ {(16<<2)|3,{61,50,105}}, +/* 32839 */ {(16<<2)|3,{61,50,111}}, +/* 32840 */ {(16<<2)|3,{61,50,115}}, +/* 32841 */ {(16<<2)|3,{61,50,116}}, +/* 32842 */ {(11<<2)|2,{61,50,0}}, +/* 32843 */ {(11<<2)|2,{61,50,0}}, +/* 32844 */ {(11<<2)|2,{61,50,0}}, +/* 32845 */ {(11<<2)|2,{61,50,0}}, +/* 32846 */ {(11<<2)|2,{61,50,0}}, +/* 32847 */ {(11<<2)|2,{61,50,0}}, +/* 32848 */ {(11<<2)|2,{61,50,0}}, +/* 32849 */ {(11<<2)|2,{61,50,0}}, +/* 32850 */ {(11<<2)|2,{61,50,0}}, +/* 32851 */ {(11<<2)|2,{61,50,0}}, +/* 32852 */ {(11<<2)|2,{61,50,0}}, +/* 32853 */ {(11<<2)|2,{61,50,0}}, +/* 32854 */ {(11<<2)|2,{61,50,0}}, +/* 32855 */ {(11<<2)|2,{61,50,0}}, +/* 32856 */ {(11<<2)|2,{61,50,0}}, +/* 32857 */ {(11<<2)|2,{61,50,0}}, +/* 32858 */ {(11<<2)|2,{61,50,0}}, +/* 32859 */ {(11<<2)|2,{61,50,0}}, +/* 32860 */ {(11<<2)|2,{61,50,0}}, +/* 32861 */ {(11<<2)|2,{61,50,0}}, +/* 32862 */ {(11<<2)|2,{61,50,0}}, +/* 32863 */ {(11<<2)|2,{61,50,0}}, +/* 32864 */ {(16<<2)|3,{61,97,48}}, +/* 32865 */ {(16<<2)|3,{61,97,49}}, +/* 32866 */ {(16<<2)|3,{61,97,50}}, +/* 32867 */ {(16<<2)|3,{61,97,97}}, +/* 32868 */ {(16<<2)|3,{61,97,99}}, +/* 32869 */ {(16<<2)|3,{61,97,101}}, +/* 32870 */ {(16<<2)|3,{61,97,105}}, +/* 32871 */ {(16<<2)|3,{61,97,111}}, +/* 32872 */ {(16<<2)|3,{61,97,115}}, +/* 32873 */ {(16<<2)|3,{61,97,116}}, +/* 32874 */ {(11<<2)|2,{61,97,0}}, +/* 32875 */ {(11<<2)|2,{61,97,0}}, +/* 32876 */ {(11<<2)|2,{61,97,0}}, +/* 32877 */ {(11<<2)|2,{61,97,0}}, +/* 32878 */ {(11<<2)|2,{61,97,0}}, +/* 32879 */ {(11<<2)|2,{61,97,0}}, +/* 32880 */ {(11<<2)|2,{61,97,0}}, +/* 32881 */ {(11<<2)|2,{61,97,0}}, +/* 32882 */ {(11<<2)|2,{61,97,0}}, +/* 32883 */ {(11<<2)|2,{61,97,0}}, +/* 32884 */ {(11<<2)|2,{61,97,0}}, +/* 32885 */ {(11<<2)|2,{61,97,0}}, +/* 32886 */ {(11<<2)|2,{61,97,0}}, +/* 32887 */ {(11<<2)|2,{61,97,0}}, +/* 32888 */ {(11<<2)|2,{61,97,0}}, +/* 32889 */ {(11<<2)|2,{61,97,0}}, +/* 32890 */ {(11<<2)|2,{61,97,0}}, +/* 32891 */ {(11<<2)|2,{61,97,0}}, +/* 32892 */ {(11<<2)|2,{61,97,0}}, +/* 32893 */ {(11<<2)|2,{61,97,0}}, +/* 32894 */ {(11<<2)|2,{61,97,0}}, +/* 32895 */ {(11<<2)|2,{61,97,0}}, +/* 32896 */ {(16<<2)|3,{61,99,48}}, +/* 32897 */ {(16<<2)|3,{61,99,49}}, +/* 32898 */ {(16<<2)|3,{61,99,50}}, +/* 32899 */ {(16<<2)|3,{61,99,97}}, +/* 32900 */ {(16<<2)|3,{61,99,99}}, +/* 32901 */ {(16<<2)|3,{61,99,101}}, +/* 32902 */ {(16<<2)|3,{61,99,105}}, +/* 32903 */ {(16<<2)|3,{61,99,111}}, +/* 32904 */ {(16<<2)|3,{61,99,115}}, +/* 32905 */ {(16<<2)|3,{61,99,116}}, +/* 32906 */ {(11<<2)|2,{61,99,0}}, +/* 32907 */ {(11<<2)|2,{61,99,0}}, +/* 32908 */ {(11<<2)|2,{61,99,0}}, +/* 32909 */ {(11<<2)|2,{61,99,0}}, +/* 32910 */ {(11<<2)|2,{61,99,0}}, +/* 32911 */ {(11<<2)|2,{61,99,0}}, +/* 32912 */ {(11<<2)|2,{61,99,0}}, +/* 32913 */ {(11<<2)|2,{61,99,0}}, +/* 32914 */ {(11<<2)|2,{61,99,0}}, +/* 32915 */ {(11<<2)|2,{61,99,0}}, +/* 32916 */ {(11<<2)|2,{61,99,0}}, +/* 32917 */ {(11<<2)|2,{61,99,0}}, +/* 32918 */ {(11<<2)|2,{61,99,0}}, +/* 32919 */ {(11<<2)|2,{61,99,0}}, +/* 32920 */ {(11<<2)|2,{61,99,0}}, +/* 32921 */ {(11<<2)|2,{61,99,0}}, +/* 32922 */ {(11<<2)|2,{61,99,0}}, +/* 32923 */ {(11<<2)|2,{61,99,0}}, +/* 32924 */ {(11<<2)|2,{61,99,0}}, +/* 32925 */ {(11<<2)|2,{61,99,0}}, +/* 32926 */ {(11<<2)|2,{61,99,0}}, +/* 32927 */ {(11<<2)|2,{61,99,0}}, +/* 32928 */ {(16<<2)|3,{61,101,48}}, +/* 32929 */ {(16<<2)|3,{61,101,49}}, +/* 32930 */ {(16<<2)|3,{61,101,50}}, +/* 32931 */ {(16<<2)|3,{61,101,97}}, +/* 32932 */ {(16<<2)|3,{61,101,99}}, +/* 32933 */ {(16<<2)|3,{61,101,101}}, +/* 32934 */ {(16<<2)|3,{61,101,105}}, +/* 32935 */ {(16<<2)|3,{61,101,111}}, +/* 32936 */ {(16<<2)|3,{61,101,115}}, +/* 32937 */ {(16<<2)|3,{61,101,116}}, +/* 32938 */ {(11<<2)|2,{61,101,0}}, +/* 32939 */ {(11<<2)|2,{61,101,0}}, +/* 32940 */ {(11<<2)|2,{61,101,0}}, +/* 32941 */ {(11<<2)|2,{61,101,0}}, +/* 32942 */ {(11<<2)|2,{61,101,0}}, +/* 32943 */ {(11<<2)|2,{61,101,0}}, +/* 32944 */ {(11<<2)|2,{61,101,0}}, +/* 32945 */ {(11<<2)|2,{61,101,0}}, +/* 32946 */ {(11<<2)|2,{61,101,0}}, +/* 32947 */ {(11<<2)|2,{61,101,0}}, +/* 32948 */ {(11<<2)|2,{61,101,0}}, +/* 32949 */ {(11<<2)|2,{61,101,0}}, +/* 32950 */ {(11<<2)|2,{61,101,0}}, +/* 32951 */ {(11<<2)|2,{61,101,0}}, +/* 32952 */ {(11<<2)|2,{61,101,0}}, +/* 32953 */ {(11<<2)|2,{61,101,0}}, +/* 32954 */ {(11<<2)|2,{61,101,0}}, +/* 32955 */ {(11<<2)|2,{61,101,0}}, +/* 32956 */ {(11<<2)|2,{61,101,0}}, +/* 32957 */ {(11<<2)|2,{61,101,0}}, +/* 32958 */ {(11<<2)|2,{61,101,0}}, +/* 32959 */ {(11<<2)|2,{61,101,0}}, +/* 32960 */ {(16<<2)|3,{61,105,48}}, +/* 32961 */ {(16<<2)|3,{61,105,49}}, +/* 32962 */ {(16<<2)|3,{61,105,50}}, +/* 32963 */ {(16<<2)|3,{61,105,97}}, +/* 32964 */ {(16<<2)|3,{61,105,99}}, +/* 32965 */ {(16<<2)|3,{61,105,101}}, +/* 32966 */ {(16<<2)|3,{61,105,105}}, +/* 32967 */ {(16<<2)|3,{61,105,111}}, +/* 32968 */ {(16<<2)|3,{61,105,115}}, +/* 32969 */ {(16<<2)|3,{61,105,116}}, +/* 32970 */ {(11<<2)|2,{61,105,0}}, +/* 32971 */ {(11<<2)|2,{61,105,0}}, +/* 32972 */ {(11<<2)|2,{61,105,0}}, +/* 32973 */ {(11<<2)|2,{61,105,0}}, +/* 32974 */ {(11<<2)|2,{61,105,0}}, +/* 32975 */ {(11<<2)|2,{61,105,0}}, +/* 32976 */ {(11<<2)|2,{61,105,0}}, +/* 32977 */ {(11<<2)|2,{61,105,0}}, +/* 32978 */ {(11<<2)|2,{61,105,0}}, +/* 32979 */ {(11<<2)|2,{61,105,0}}, +/* 32980 */ {(11<<2)|2,{61,105,0}}, +/* 32981 */ {(11<<2)|2,{61,105,0}}, +/* 32982 */ {(11<<2)|2,{61,105,0}}, +/* 32983 */ {(11<<2)|2,{61,105,0}}, +/* 32984 */ {(11<<2)|2,{61,105,0}}, +/* 32985 */ {(11<<2)|2,{61,105,0}}, +/* 32986 */ {(11<<2)|2,{61,105,0}}, +/* 32987 */ {(11<<2)|2,{61,105,0}}, +/* 32988 */ {(11<<2)|2,{61,105,0}}, +/* 32989 */ {(11<<2)|2,{61,105,0}}, +/* 32990 */ {(11<<2)|2,{61,105,0}}, +/* 32991 */ {(11<<2)|2,{61,105,0}}, +/* 32992 */ {(16<<2)|3,{61,111,48}}, +/* 32993 */ {(16<<2)|3,{61,111,49}}, +/* 32994 */ {(16<<2)|3,{61,111,50}}, +/* 32995 */ {(16<<2)|3,{61,111,97}}, +/* 32996 */ {(16<<2)|3,{61,111,99}}, +/* 32997 */ {(16<<2)|3,{61,111,101}}, +/* 32998 */ {(16<<2)|3,{61,111,105}}, +/* 32999 */ {(16<<2)|3,{61,111,111}}, +/* 33000 */ {(16<<2)|3,{61,111,115}}, +/* 33001 */ {(16<<2)|3,{61,111,116}}, +/* 33002 */ {(11<<2)|2,{61,111,0}}, +/* 33003 */ {(11<<2)|2,{61,111,0}}, +/* 33004 */ {(11<<2)|2,{61,111,0}}, +/* 33005 */ {(11<<2)|2,{61,111,0}}, +/* 33006 */ {(11<<2)|2,{61,111,0}}, +/* 33007 */ {(11<<2)|2,{61,111,0}}, +/* 33008 */ {(11<<2)|2,{61,111,0}}, +/* 33009 */ {(11<<2)|2,{61,111,0}}, +/* 33010 */ {(11<<2)|2,{61,111,0}}, +/* 33011 */ {(11<<2)|2,{61,111,0}}, +/* 33012 */ {(11<<2)|2,{61,111,0}}, +/* 33013 */ {(11<<2)|2,{61,111,0}}, +/* 33014 */ {(11<<2)|2,{61,111,0}}, +/* 33015 */ {(11<<2)|2,{61,111,0}}, +/* 33016 */ {(11<<2)|2,{61,111,0}}, +/* 33017 */ {(11<<2)|2,{61,111,0}}, +/* 33018 */ {(11<<2)|2,{61,111,0}}, +/* 33019 */ {(11<<2)|2,{61,111,0}}, +/* 33020 */ {(11<<2)|2,{61,111,0}}, +/* 33021 */ {(11<<2)|2,{61,111,0}}, +/* 33022 */ {(11<<2)|2,{61,111,0}}, +/* 33023 */ {(11<<2)|2,{61,111,0}}, +/* 33024 */ {(16<<2)|3,{61,115,48}}, +/* 33025 */ {(16<<2)|3,{61,115,49}}, +/* 33026 */ {(16<<2)|3,{61,115,50}}, +/* 33027 */ {(16<<2)|3,{61,115,97}}, +/* 33028 */ {(16<<2)|3,{61,115,99}}, +/* 33029 */ {(16<<2)|3,{61,115,101}}, +/* 33030 */ {(16<<2)|3,{61,115,105}}, +/* 33031 */ {(16<<2)|3,{61,115,111}}, +/* 33032 */ {(16<<2)|3,{61,115,115}}, +/* 33033 */ {(16<<2)|3,{61,115,116}}, +/* 33034 */ {(11<<2)|2,{61,115,0}}, +/* 33035 */ {(11<<2)|2,{61,115,0}}, +/* 33036 */ {(11<<2)|2,{61,115,0}}, +/* 33037 */ {(11<<2)|2,{61,115,0}}, +/* 33038 */ {(11<<2)|2,{61,115,0}}, +/* 33039 */ {(11<<2)|2,{61,115,0}}, +/* 33040 */ {(11<<2)|2,{61,115,0}}, +/* 33041 */ {(11<<2)|2,{61,115,0}}, +/* 33042 */ {(11<<2)|2,{61,115,0}}, +/* 33043 */ {(11<<2)|2,{61,115,0}}, +/* 33044 */ {(11<<2)|2,{61,115,0}}, +/* 33045 */ {(11<<2)|2,{61,115,0}}, +/* 33046 */ {(11<<2)|2,{61,115,0}}, +/* 33047 */ {(11<<2)|2,{61,115,0}}, +/* 33048 */ {(11<<2)|2,{61,115,0}}, +/* 33049 */ {(11<<2)|2,{61,115,0}}, +/* 33050 */ {(11<<2)|2,{61,115,0}}, +/* 33051 */ {(11<<2)|2,{61,115,0}}, +/* 33052 */ {(11<<2)|2,{61,115,0}}, +/* 33053 */ {(11<<2)|2,{61,115,0}}, +/* 33054 */ {(11<<2)|2,{61,115,0}}, +/* 33055 */ {(11<<2)|2,{61,115,0}}, +/* 33056 */ {(16<<2)|3,{61,116,48}}, +/* 33057 */ {(16<<2)|3,{61,116,49}}, +/* 33058 */ {(16<<2)|3,{61,116,50}}, +/* 33059 */ {(16<<2)|3,{61,116,97}}, +/* 33060 */ {(16<<2)|3,{61,116,99}}, +/* 33061 */ {(16<<2)|3,{61,116,101}}, +/* 33062 */ {(16<<2)|3,{61,116,105}}, +/* 33063 */ {(16<<2)|3,{61,116,111}}, +/* 33064 */ {(16<<2)|3,{61,116,115}}, +/* 33065 */ {(16<<2)|3,{61,116,116}}, +/* 33066 */ {(11<<2)|2,{61,116,0}}, +/* 33067 */ {(11<<2)|2,{61,116,0}}, +/* 33068 */ {(11<<2)|2,{61,116,0}}, +/* 33069 */ {(11<<2)|2,{61,116,0}}, +/* 33070 */ {(11<<2)|2,{61,116,0}}, +/* 33071 */ {(11<<2)|2,{61,116,0}}, +/* 33072 */ {(11<<2)|2,{61,116,0}}, +/* 33073 */ {(11<<2)|2,{61,116,0}}, +/* 33074 */ {(11<<2)|2,{61,116,0}}, +/* 33075 */ {(11<<2)|2,{61,116,0}}, +/* 33076 */ {(11<<2)|2,{61,116,0}}, +/* 33077 */ {(11<<2)|2,{61,116,0}}, +/* 33078 */ {(11<<2)|2,{61,116,0}}, +/* 33079 */ {(11<<2)|2,{61,116,0}}, +/* 33080 */ {(11<<2)|2,{61,116,0}}, +/* 33081 */ {(11<<2)|2,{61,116,0}}, +/* 33082 */ {(11<<2)|2,{61,116,0}}, +/* 33083 */ {(11<<2)|2,{61,116,0}}, +/* 33084 */ {(11<<2)|2,{61,116,0}}, +/* 33085 */ {(11<<2)|2,{61,116,0}}, +/* 33086 */ {(11<<2)|2,{61,116,0}}, +/* 33087 */ {(11<<2)|2,{61,116,0}}, +/* 33088 */ {(12<<2)|2,{61,32,0}}, +/* 33089 */ {(12<<2)|2,{61,32,0}}, +/* 33090 */ {(12<<2)|2,{61,32,0}}, +/* 33091 */ {(12<<2)|2,{61,32,0}}, +/* 33092 */ {(12<<2)|2,{61,32,0}}, +/* 33093 */ {(12<<2)|2,{61,32,0}}, +/* 33094 */ {(12<<2)|2,{61,32,0}}, +/* 33095 */ {(12<<2)|2,{61,32,0}}, +/* 33096 */ {(12<<2)|2,{61,32,0}}, +/* 33097 */ {(12<<2)|2,{61,32,0}}, +/* 33098 */ {(12<<2)|2,{61,32,0}}, +/* 33099 */ {(12<<2)|2,{61,32,0}}, +/* 33100 */ {(12<<2)|2,{61,32,0}}, +/* 33101 */ {(12<<2)|2,{61,32,0}}, +/* 33102 */ {(12<<2)|2,{61,32,0}}, +/* 33103 */ {(12<<2)|2,{61,32,0}}, +/* 33104 */ {(12<<2)|2,{61,37,0}}, +/* 33105 */ {(12<<2)|2,{61,37,0}}, +/* 33106 */ {(12<<2)|2,{61,37,0}}, +/* 33107 */ {(12<<2)|2,{61,37,0}}, +/* 33108 */ {(12<<2)|2,{61,37,0}}, +/* 33109 */ {(12<<2)|2,{61,37,0}}, +/* 33110 */ {(12<<2)|2,{61,37,0}}, +/* 33111 */ {(12<<2)|2,{61,37,0}}, +/* 33112 */ {(12<<2)|2,{61,37,0}}, +/* 33113 */ {(12<<2)|2,{61,37,0}}, +/* 33114 */ {(12<<2)|2,{61,37,0}}, +/* 33115 */ {(12<<2)|2,{61,37,0}}, +/* 33116 */ {(12<<2)|2,{61,37,0}}, +/* 33117 */ {(12<<2)|2,{61,37,0}}, +/* 33118 */ {(12<<2)|2,{61,37,0}}, +/* 33119 */ {(12<<2)|2,{61,37,0}}, +/* 33120 */ {(12<<2)|2,{61,45,0}}, +/* 33121 */ {(12<<2)|2,{61,45,0}}, +/* 33122 */ {(12<<2)|2,{61,45,0}}, +/* 33123 */ {(12<<2)|2,{61,45,0}}, +/* 33124 */ {(12<<2)|2,{61,45,0}}, +/* 33125 */ {(12<<2)|2,{61,45,0}}, +/* 33126 */ {(12<<2)|2,{61,45,0}}, +/* 33127 */ {(12<<2)|2,{61,45,0}}, +/* 33128 */ {(12<<2)|2,{61,45,0}}, +/* 33129 */ {(12<<2)|2,{61,45,0}}, +/* 33130 */ {(12<<2)|2,{61,45,0}}, +/* 33131 */ {(12<<2)|2,{61,45,0}}, +/* 33132 */ {(12<<2)|2,{61,45,0}}, +/* 33133 */ {(12<<2)|2,{61,45,0}}, +/* 33134 */ {(12<<2)|2,{61,45,0}}, +/* 33135 */ {(12<<2)|2,{61,45,0}}, +/* 33136 */ {(12<<2)|2,{61,46,0}}, +/* 33137 */ {(12<<2)|2,{61,46,0}}, +/* 33138 */ {(12<<2)|2,{61,46,0}}, +/* 33139 */ {(12<<2)|2,{61,46,0}}, +/* 33140 */ {(12<<2)|2,{61,46,0}}, +/* 33141 */ {(12<<2)|2,{61,46,0}}, +/* 33142 */ {(12<<2)|2,{61,46,0}}, +/* 33143 */ {(12<<2)|2,{61,46,0}}, +/* 33144 */ {(12<<2)|2,{61,46,0}}, +/* 33145 */ {(12<<2)|2,{61,46,0}}, +/* 33146 */ {(12<<2)|2,{61,46,0}}, +/* 33147 */ {(12<<2)|2,{61,46,0}}, +/* 33148 */ {(12<<2)|2,{61,46,0}}, +/* 33149 */ {(12<<2)|2,{61,46,0}}, +/* 33150 */ {(12<<2)|2,{61,46,0}}, +/* 33151 */ {(12<<2)|2,{61,46,0}}, +/* 33152 */ {(12<<2)|2,{61,47,0}}, +/* 33153 */ {(12<<2)|2,{61,47,0}}, +/* 33154 */ {(12<<2)|2,{61,47,0}}, +/* 33155 */ {(12<<2)|2,{61,47,0}}, +/* 33156 */ {(12<<2)|2,{61,47,0}}, +/* 33157 */ {(12<<2)|2,{61,47,0}}, +/* 33158 */ {(12<<2)|2,{61,47,0}}, +/* 33159 */ {(12<<2)|2,{61,47,0}}, +/* 33160 */ {(12<<2)|2,{61,47,0}}, +/* 33161 */ {(12<<2)|2,{61,47,0}}, +/* 33162 */ {(12<<2)|2,{61,47,0}}, +/* 33163 */ {(12<<2)|2,{61,47,0}}, +/* 33164 */ {(12<<2)|2,{61,47,0}}, +/* 33165 */ {(12<<2)|2,{61,47,0}}, +/* 33166 */ {(12<<2)|2,{61,47,0}}, +/* 33167 */ {(12<<2)|2,{61,47,0}}, +/* 33168 */ {(12<<2)|2,{61,51,0}}, +/* 33169 */ {(12<<2)|2,{61,51,0}}, +/* 33170 */ {(12<<2)|2,{61,51,0}}, +/* 33171 */ {(12<<2)|2,{61,51,0}}, +/* 33172 */ {(12<<2)|2,{61,51,0}}, +/* 33173 */ {(12<<2)|2,{61,51,0}}, +/* 33174 */ {(12<<2)|2,{61,51,0}}, +/* 33175 */ {(12<<2)|2,{61,51,0}}, +/* 33176 */ {(12<<2)|2,{61,51,0}}, +/* 33177 */ {(12<<2)|2,{61,51,0}}, +/* 33178 */ {(12<<2)|2,{61,51,0}}, +/* 33179 */ {(12<<2)|2,{61,51,0}}, +/* 33180 */ {(12<<2)|2,{61,51,0}}, +/* 33181 */ {(12<<2)|2,{61,51,0}}, +/* 33182 */ {(12<<2)|2,{61,51,0}}, +/* 33183 */ {(12<<2)|2,{61,51,0}}, +/* 33184 */ {(12<<2)|2,{61,52,0}}, +/* 33185 */ {(12<<2)|2,{61,52,0}}, +/* 33186 */ {(12<<2)|2,{61,52,0}}, +/* 33187 */ {(12<<2)|2,{61,52,0}}, +/* 33188 */ {(12<<2)|2,{61,52,0}}, +/* 33189 */ {(12<<2)|2,{61,52,0}}, +/* 33190 */ {(12<<2)|2,{61,52,0}}, +/* 33191 */ {(12<<2)|2,{61,52,0}}, +/* 33192 */ {(12<<2)|2,{61,52,0}}, +/* 33193 */ {(12<<2)|2,{61,52,0}}, +/* 33194 */ {(12<<2)|2,{61,52,0}}, +/* 33195 */ {(12<<2)|2,{61,52,0}}, +/* 33196 */ {(12<<2)|2,{61,52,0}}, +/* 33197 */ {(12<<2)|2,{61,52,0}}, +/* 33198 */ {(12<<2)|2,{61,52,0}}, +/* 33199 */ {(12<<2)|2,{61,52,0}}, +/* 33200 */ {(12<<2)|2,{61,53,0}}, +/* 33201 */ {(12<<2)|2,{61,53,0}}, +/* 33202 */ {(12<<2)|2,{61,53,0}}, +/* 33203 */ {(12<<2)|2,{61,53,0}}, +/* 33204 */ {(12<<2)|2,{61,53,0}}, +/* 33205 */ {(12<<2)|2,{61,53,0}}, +/* 33206 */ {(12<<2)|2,{61,53,0}}, +/* 33207 */ {(12<<2)|2,{61,53,0}}, +/* 33208 */ {(12<<2)|2,{61,53,0}}, +/* 33209 */ {(12<<2)|2,{61,53,0}}, +/* 33210 */ {(12<<2)|2,{61,53,0}}, +/* 33211 */ {(12<<2)|2,{61,53,0}}, +/* 33212 */ {(12<<2)|2,{61,53,0}}, +/* 33213 */ {(12<<2)|2,{61,53,0}}, +/* 33214 */ {(12<<2)|2,{61,53,0}}, +/* 33215 */ {(12<<2)|2,{61,53,0}}, +/* 33216 */ {(12<<2)|2,{61,54,0}}, +/* 33217 */ {(12<<2)|2,{61,54,0}}, +/* 33218 */ {(12<<2)|2,{61,54,0}}, +/* 33219 */ {(12<<2)|2,{61,54,0}}, +/* 33220 */ {(12<<2)|2,{61,54,0}}, +/* 33221 */ {(12<<2)|2,{61,54,0}}, +/* 33222 */ {(12<<2)|2,{61,54,0}}, +/* 33223 */ {(12<<2)|2,{61,54,0}}, +/* 33224 */ {(12<<2)|2,{61,54,0}}, +/* 33225 */ {(12<<2)|2,{61,54,0}}, +/* 33226 */ {(12<<2)|2,{61,54,0}}, +/* 33227 */ {(12<<2)|2,{61,54,0}}, +/* 33228 */ {(12<<2)|2,{61,54,0}}, +/* 33229 */ {(12<<2)|2,{61,54,0}}, +/* 33230 */ {(12<<2)|2,{61,54,0}}, +/* 33231 */ {(12<<2)|2,{61,54,0}}, +/* 33232 */ {(12<<2)|2,{61,55,0}}, +/* 33233 */ {(12<<2)|2,{61,55,0}}, +/* 33234 */ {(12<<2)|2,{61,55,0}}, +/* 33235 */ {(12<<2)|2,{61,55,0}}, +/* 33236 */ {(12<<2)|2,{61,55,0}}, +/* 33237 */ {(12<<2)|2,{61,55,0}}, +/* 33238 */ {(12<<2)|2,{61,55,0}}, +/* 33239 */ {(12<<2)|2,{61,55,0}}, +/* 33240 */ {(12<<2)|2,{61,55,0}}, +/* 33241 */ {(12<<2)|2,{61,55,0}}, +/* 33242 */ {(12<<2)|2,{61,55,0}}, +/* 33243 */ {(12<<2)|2,{61,55,0}}, +/* 33244 */ {(12<<2)|2,{61,55,0}}, +/* 33245 */ {(12<<2)|2,{61,55,0}}, +/* 33246 */ {(12<<2)|2,{61,55,0}}, +/* 33247 */ {(12<<2)|2,{61,55,0}}, +/* 33248 */ {(12<<2)|2,{61,56,0}}, +/* 33249 */ {(12<<2)|2,{61,56,0}}, +/* 33250 */ {(12<<2)|2,{61,56,0}}, +/* 33251 */ {(12<<2)|2,{61,56,0}}, +/* 33252 */ {(12<<2)|2,{61,56,0}}, +/* 33253 */ {(12<<2)|2,{61,56,0}}, +/* 33254 */ {(12<<2)|2,{61,56,0}}, +/* 33255 */ {(12<<2)|2,{61,56,0}}, +/* 33256 */ {(12<<2)|2,{61,56,0}}, +/* 33257 */ {(12<<2)|2,{61,56,0}}, +/* 33258 */ {(12<<2)|2,{61,56,0}}, +/* 33259 */ {(12<<2)|2,{61,56,0}}, +/* 33260 */ {(12<<2)|2,{61,56,0}}, +/* 33261 */ {(12<<2)|2,{61,56,0}}, +/* 33262 */ {(12<<2)|2,{61,56,0}}, +/* 33263 */ {(12<<2)|2,{61,56,0}}, +/* 33264 */ {(12<<2)|2,{61,57,0}}, +/* 33265 */ {(12<<2)|2,{61,57,0}}, +/* 33266 */ {(12<<2)|2,{61,57,0}}, +/* 33267 */ {(12<<2)|2,{61,57,0}}, +/* 33268 */ {(12<<2)|2,{61,57,0}}, +/* 33269 */ {(12<<2)|2,{61,57,0}}, +/* 33270 */ {(12<<2)|2,{61,57,0}}, +/* 33271 */ {(12<<2)|2,{61,57,0}}, +/* 33272 */ {(12<<2)|2,{61,57,0}}, +/* 33273 */ {(12<<2)|2,{61,57,0}}, +/* 33274 */ {(12<<2)|2,{61,57,0}}, +/* 33275 */ {(12<<2)|2,{61,57,0}}, +/* 33276 */ {(12<<2)|2,{61,57,0}}, +/* 33277 */ {(12<<2)|2,{61,57,0}}, +/* 33278 */ {(12<<2)|2,{61,57,0}}, +/* 33279 */ {(12<<2)|2,{61,57,0}}, +/* 33280 */ {(12<<2)|2,{61,61,0}}, +/* 33281 */ {(12<<2)|2,{61,61,0}}, +/* 33282 */ {(12<<2)|2,{61,61,0}}, +/* 33283 */ {(12<<2)|2,{61,61,0}}, +/* 33284 */ {(12<<2)|2,{61,61,0}}, +/* 33285 */ {(12<<2)|2,{61,61,0}}, +/* 33286 */ {(12<<2)|2,{61,61,0}}, +/* 33287 */ {(12<<2)|2,{61,61,0}}, +/* 33288 */ {(12<<2)|2,{61,61,0}}, +/* 33289 */ {(12<<2)|2,{61,61,0}}, +/* 33290 */ {(12<<2)|2,{61,61,0}}, +/* 33291 */ {(12<<2)|2,{61,61,0}}, +/* 33292 */ {(12<<2)|2,{61,61,0}}, +/* 33293 */ {(12<<2)|2,{61,61,0}}, +/* 33294 */ {(12<<2)|2,{61,61,0}}, +/* 33295 */ {(12<<2)|2,{61,61,0}}, +/* 33296 */ {(12<<2)|2,{61,65,0}}, +/* 33297 */ {(12<<2)|2,{61,65,0}}, +/* 33298 */ {(12<<2)|2,{61,65,0}}, +/* 33299 */ {(12<<2)|2,{61,65,0}}, +/* 33300 */ {(12<<2)|2,{61,65,0}}, +/* 33301 */ {(12<<2)|2,{61,65,0}}, +/* 33302 */ {(12<<2)|2,{61,65,0}}, +/* 33303 */ {(12<<2)|2,{61,65,0}}, +/* 33304 */ {(12<<2)|2,{61,65,0}}, +/* 33305 */ {(12<<2)|2,{61,65,0}}, +/* 33306 */ {(12<<2)|2,{61,65,0}}, +/* 33307 */ {(12<<2)|2,{61,65,0}}, +/* 33308 */ {(12<<2)|2,{61,65,0}}, +/* 33309 */ {(12<<2)|2,{61,65,0}}, +/* 33310 */ {(12<<2)|2,{61,65,0}}, +/* 33311 */ {(12<<2)|2,{61,65,0}}, +/* 33312 */ {(12<<2)|2,{61,95,0}}, +/* 33313 */ {(12<<2)|2,{61,95,0}}, +/* 33314 */ {(12<<2)|2,{61,95,0}}, +/* 33315 */ {(12<<2)|2,{61,95,0}}, +/* 33316 */ {(12<<2)|2,{61,95,0}}, +/* 33317 */ {(12<<2)|2,{61,95,0}}, +/* 33318 */ {(12<<2)|2,{61,95,0}}, +/* 33319 */ {(12<<2)|2,{61,95,0}}, +/* 33320 */ {(12<<2)|2,{61,95,0}}, +/* 33321 */ {(12<<2)|2,{61,95,0}}, +/* 33322 */ {(12<<2)|2,{61,95,0}}, +/* 33323 */ {(12<<2)|2,{61,95,0}}, +/* 33324 */ {(12<<2)|2,{61,95,0}}, +/* 33325 */ {(12<<2)|2,{61,95,0}}, +/* 33326 */ {(12<<2)|2,{61,95,0}}, +/* 33327 */ {(12<<2)|2,{61,95,0}}, +/* 33328 */ {(12<<2)|2,{61,98,0}}, +/* 33329 */ {(12<<2)|2,{61,98,0}}, +/* 33330 */ {(12<<2)|2,{61,98,0}}, +/* 33331 */ {(12<<2)|2,{61,98,0}}, +/* 33332 */ {(12<<2)|2,{61,98,0}}, +/* 33333 */ {(12<<2)|2,{61,98,0}}, +/* 33334 */ {(12<<2)|2,{61,98,0}}, +/* 33335 */ {(12<<2)|2,{61,98,0}}, +/* 33336 */ {(12<<2)|2,{61,98,0}}, +/* 33337 */ {(12<<2)|2,{61,98,0}}, +/* 33338 */ {(12<<2)|2,{61,98,0}}, +/* 33339 */ {(12<<2)|2,{61,98,0}}, +/* 33340 */ {(12<<2)|2,{61,98,0}}, +/* 33341 */ {(12<<2)|2,{61,98,0}}, +/* 33342 */ {(12<<2)|2,{61,98,0}}, +/* 33343 */ {(12<<2)|2,{61,98,0}}, +/* 33344 */ {(12<<2)|2,{61,100,0}}, +/* 33345 */ {(12<<2)|2,{61,100,0}}, +/* 33346 */ {(12<<2)|2,{61,100,0}}, +/* 33347 */ {(12<<2)|2,{61,100,0}}, +/* 33348 */ {(12<<2)|2,{61,100,0}}, +/* 33349 */ {(12<<2)|2,{61,100,0}}, +/* 33350 */ {(12<<2)|2,{61,100,0}}, +/* 33351 */ {(12<<2)|2,{61,100,0}}, +/* 33352 */ {(12<<2)|2,{61,100,0}}, +/* 33353 */ {(12<<2)|2,{61,100,0}}, +/* 33354 */ {(12<<2)|2,{61,100,0}}, +/* 33355 */ {(12<<2)|2,{61,100,0}}, +/* 33356 */ {(12<<2)|2,{61,100,0}}, +/* 33357 */ {(12<<2)|2,{61,100,0}}, +/* 33358 */ {(12<<2)|2,{61,100,0}}, +/* 33359 */ {(12<<2)|2,{61,100,0}}, +/* 33360 */ {(12<<2)|2,{61,102,0}}, +/* 33361 */ {(12<<2)|2,{61,102,0}}, +/* 33362 */ {(12<<2)|2,{61,102,0}}, +/* 33363 */ {(12<<2)|2,{61,102,0}}, +/* 33364 */ {(12<<2)|2,{61,102,0}}, +/* 33365 */ {(12<<2)|2,{61,102,0}}, +/* 33366 */ {(12<<2)|2,{61,102,0}}, +/* 33367 */ {(12<<2)|2,{61,102,0}}, +/* 33368 */ {(12<<2)|2,{61,102,0}}, +/* 33369 */ {(12<<2)|2,{61,102,0}}, +/* 33370 */ {(12<<2)|2,{61,102,0}}, +/* 33371 */ {(12<<2)|2,{61,102,0}}, +/* 33372 */ {(12<<2)|2,{61,102,0}}, +/* 33373 */ {(12<<2)|2,{61,102,0}}, +/* 33374 */ {(12<<2)|2,{61,102,0}}, +/* 33375 */ {(12<<2)|2,{61,102,0}}, +/* 33376 */ {(12<<2)|2,{61,103,0}}, +/* 33377 */ {(12<<2)|2,{61,103,0}}, +/* 33378 */ {(12<<2)|2,{61,103,0}}, +/* 33379 */ {(12<<2)|2,{61,103,0}}, +/* 33380 */ {(12<<2)|2,{61,103,0}}, +/* 33381 */ {(12<<2)|2,{61,103,0}}, +/* 33382 */ {(12<<2)|2,{61,103,0}}, +/* 33383 */ {(12<<2)|2,{61,103,0}}, +/* 33384 */ {(12<<2)|2,{61,103,0}}, +/* 33385 */ {(12<<2)|2,{61,103,0}}, +/* 33386 */ {(12<<2)|2,{61,103,0}}, +/* 33387 */ {(12<<2)|2,{61,103,0}}, +/* 33388 */ {(12<<2)|2,{61,103,0}}, +/* 33389 */ {(12<<2)|2,{61,103,0}}, +/* 33390 */ {(12<<2)|2,{61,103,0}}, +/* 33391 */ {(12<<2)|2,{61,103,0}}, +/* 33392 */ {(12<<2)|2,{61,104,0}}, +/* 33393 */ {(12<<2)|2,{61,104,0}}, +/* 33394 */ {(12<<2)|2,{61,104,0}}, +/* 33395 */ {(12<<2)|2,{61,104,0}}, +/* 33396 */ {(12<<2)|2,{61,104,0}}, +/* 33397 */ {(12<<2)|2,{61,104,0}}, +/* 33398 */ {(12<<2)|2,{61,104,0}}, +/* 33399 */ {(12<<2)|2,{61,104,0}}, +/* 33400 */ {(12<<2)|2,{61,104,0}}, +/* 33401 */ {(12<<2)|2,{61,104,0}}, +/* 33402 */ {(12<<2)|2,{61,104,0}}, +/* 33403 */ {(12<<2)|2,{61,104,0}}, +/* 33404 */ {(12<<2)|2,{61,104,0}}, +/* 33405 */ {(12<<2)|2,{61,104,0}}, +/* 33406 */ {(12<<2)|2,{61,104,0}}, +/* 33407 */ {(12<<2)|2,{61,104,0}}, +/* 33408 */ {(12<<2)|2,{61,108,0}}, +/* 33409 */ {(12<<2)|2,{61,108,0}}, +/* 33410 */ {(12<<2)|2,{61,108,0}}, +/* 33411 */ {(12<<2)|2,{61,108,0}}, +/* 33412 */ {(12<<2)|2,{61,108,0}}, +/* 33413 */ {(12<<2)|2,{61,108,0}}, +/* 33414 */ {(12<<2)|2,{61,108,0}}, +/* 33415 */ {(12<<2)|2,{61,108,0}}, +/* 33416 */ {(12<<2)|2,{61,108,0}}, +/* 33417 */ {(12<<2)|2,{61,108,0}}, +/* 33418 */ {(12<<2)|2,{61,108,0}}, +/* 33419 */ {(12<<2)|2,{61,108,0}}, +/* 33420 */ {(12<<2)|2,{61,108,0}}, +/* 33421 */ {(12<<2)|2,{61,108,0}}, +/* 33422 */ {(12<<2)|2,{61,108,0}}, +/* 33423 */ {(12<<2)|2,{61,108,0}}, +/* 33424 */ {(12<<2)|2,{61,109,0}}, +/* 33425 */ {(12<<2)|2,{61,109,0}}, +/* 33426 */ {(12<<2)|2,{61,109,0}}, +/* 33427 */ {(12<<2)|2,{61,109,0}}, +/* 33428 */ {(12<<2)|2,{61,109,0}}, +/* 33429 */ {(12<<2)|2,{61,109,0}}, +/* 33430 */ {(12<<2)|2,{61,109,0}}, +/* 33431 */ {(12<<2)|2,{61,109,0}}, +/* 33432 */ {(12<<2)|2,{61,109,0}}, +/* 33433 */ {(12<<2)|2,{61,109,0}}, +/* 33434 */ {(12<<2)|2,{61,109,0}}, +/* 33435 */ {(12<<2)|2,{61,109,0}}, +/* 33436 */ {(12<<2)|2,{61,109,0}}, +/* 33437 */ {(12<<2)|2,{61,109,0}}, +/* 33438 */ {(12<<2)|2,{61,109,0}}, +/* 33439 */ {(12<<2)|2,{61,109,0}}, +/* 33440 */ {(12<<2)|2,{61,110,0}}, +/* 33441 */ {(12<<2)|2,{61,110,0}}, +/* 33442 */ {(12<<2)|2,{61,110,0}}, +/* 33443 */ {(12<<2)|2,{61,110,0}}, +/* 33444 */ {(12<<2)|2,{61,110,0}}, +/* 33445 */ {(12<<2)|2,{61,110,0}}, +/* 33446 */ {(12<<2)|2,{61,110,0}}, +/* 33447 */ {(12<<2)|2,{61,110,0}}, +/* 33448 */ {(12<<2)|2,{61,110,0}}, +/* 33449 */ {(12<<2)|2,{61,110,0}}, +/* 33450 */ {(12<<2)|2,{61,110,0}}, +/* 33451 */ {(12<<2)|2,{61,110,0}}, +/* 33452 */ {(12<<2)|2,{61,110,0}}, +/* 33453 */ {(12<<2)|2,{61,110,0}}, +/* 33454 */ {(12<<2)|2,{61,110,0}}, +/* 33455 */ {(12<<2)|2,{61,110,0}}, +/* 33456 */ {(12<<2)|2,{61,112,0}}, +/* 33457 */ {(12<<2)|2,{61,112,0}}, +/* 33458 */ {(12<<2)|2,{61,112,0}}, +/* 33459 */ {(12<<2)|2,{61,112,0}}, +/* 33460 */ {(12<<2)|2,{61,112,0}}, +/* 33461 */ {(12<<2)|2,{61,112,0}}, +/* 33462 */ {(12<<2)|2,{61,112,0}}, +/* 33463 */ {(12<<2)|2,{61,112,0}}, +/* 33464 */ {(12<<2)|2,{61,112,0}}, +/* 33465 */ {(12<<2)|2,{61,112,0}}, +/* 33466 */ {(12<<2)|2,{61,112,0}}, +/* 33467 */ {(12<<2)|2,{61,112,0}}, +/* 33468 */ {(12<<2)|2,{61,112,0}}, +/* 33469 */ {(12<<2)|2,{61,112,0}}, +/* 33470 */ {(12<<2)|2,{61,112,0}}, +/* 33471 */ {(12<<2)|2,{61,112,0}}, +/* 33472 */ {(12<<2)|2,{61,114,0}}, +/* 33473 */ {(12<<2)|2,{61,114,0}}, +/* 33474 */ {(12<<2)|2,{61,114,0}}, +/* 33475 */ {(12<<2)|2,{61,114,0}}, +/* 33476 */ {(12<<2)|2,{61,114,0}}, +/* 33477 */ {(12<<2)|2,{61,114,0}}, +/* 33478 */ {(12<<2)|2,{61,114,0}}, +/* 33479 */ {(12<<2)|2,{61,114,0}}, +/* 33480 */ {(12<<2)|2,{61,114,0}}, +/* 33481 */ {(12<<2)|2,{61,114,0}}, +/* 33482 */ {(12<<2)|2,{61,114,0}}, +/* 33483 */ {(12<<2)|2,{61,114,0}}, +/* 33484 */ {(12<<2)|2,{61,114,0}}, +/* 33485 */ {(12<<2)|2,{61,114,0}}, +/* 33486 */ {(12<<2)|2,{61,114,0}}, +/* 33487 */ {(12<<2)|2,{61,114,0}}, +/* 33488 */ {(12<<2)|2,{61,117,0}}, +/* 33489 */ {(12<<2)|2,{61,117,0}}, +/* 33490 */ {(12<<2)|2,{61,117,0}}, +/* 33491 */ {(12<<2)|2,{61,117,0}}, +/* 33492 */ {(12<<2)|2,{61,117,0}}, +/* 33493 */ {(12<<2)|2,{61,117,0}}, +/* 33494 */ {(12<<2)|2,{61,117,0}}, +/* 33495 */ {(12<<2)|2,{61,117,0}}, +/* 33496 */ {(12<<2)|2,{61,117,0}}, +/* 33497 */ {(12<<2)|2,{61,117,0}}, +/* 33498 */ {(12<<2)|2,{61,117,0}}, +/* 33499 */ {(12<<2)|2,{61,117,0}}, +/* 33500 */ {(12<<2)|2,{61,117,0}}, +/* 33501 */ {(12<<2)|2,{61,117,0}}, +/* 33502 */ {(12<<2)|2,{61,117,0}}, +/* 33503 */ {(12<<2)|2,{61,117,0}}, +/* 33504 */ {(13<<2)|2,{61,58,0}}, +/* 33505 */ {(13<<2)|2,{61,58,0}}, +/* 33506 */ {(13<<2)|2,{61,58,0}}, +/* 33507 */ {(13<<2)|2,{61,58,0}}, +/* 33508 */ {(13<<2)|2,{61,58,0}}, +/* 33509 */ {(13<<2)|2,{61,58,0}}, +/* 33510 */ {(13<<2)|2,{61,58,0}}, +/* 33511 */ {(13<<2)|2,{61,58,0}}, +/* 33512 */ {(13<<2)|2,{61,66,0}}, +/* 33513 */ {(13<<2)|2,{61,66,0}}, +/* 33514 */ {(13<<2)|2,{61,66,0}}, +/* 33515 */ {(13<<2)|2,{61,66,0}}, +/* 33516 */ {(13<<2)|2,{61,66,0}}, +/* 33517 */ {(13<<2)|2,{61,66,0}}, +/* 33518 */ {(13<<2)|2,{61,66,0}}, +/* 33519 */ {(13<<2)|2,{61,66,0}}, +/* 33520 */ {(13<<2)|2,{61,67,0}}, +/* 33521 */ {(13<<2)|2,{61,67,0}}, +/* 33522 */ {(13<<2)|2,{61,67,0}}, +/* 33523 */ {(13<<2)|2,{61,67,0}}, +/* 33524 */ {(13<<2)|2,{61,67,0}}, +/* 33525 */ {(13<<2)|2,{61,67,0}}, +/* 33526 */ {(13<<2)|2,{61,67,0}}, +/* 33527 */ {(13<<2)|2,{61,67,0}}, +/* 33528 */ {(13<<2)|2,{61,68,0}}, +/* 33529 */ {(13<<2)|2,{61,68,0}}, +/* 33530 */ {(13<<2)|2,{61,68,0}}, +/* 33531 */ {(13<<2)|2,{61,68,0}}, +/* 33532 */ {(13<<2)|2,{61,68,0}}, +/* 33533 */ {(13<<2)|2,{61,68,0}}, +/* 33534 */ {(13<<2)|2,{61,68,0}}, +/* 33535 */ {(13<<2)|2,{61,68,0}}, +/* 33536 */ {(13<<2)|2,{61,69,0}}, +/* 33537 */ {(13<<2)|2,{61,69,0}}, +/* 33538 */ {(13<<2)|2,{61,69,0}}, +/* 33539 */ {(13<<2)|2,{61,69,0}}, +/* 33540 */ {(13<<2)|2,{61,69,0}}, +/* 33541 */ {(13<<2)|2,{61,69,0}}, +/* 33542 */ {(13<<2)|2,{61,69,0}}, +/* 33543 */ {(13<<2)|2,{61,69,0}}, +/* 33544 */ {(13<<2)|2,{61,70,0}}, +/* 33545 */ {(13<<2)|2,{61,70,0}}, +/* 33546 */ {(13<<2)|2,{61,70,0}}, +/* 33547 */ {(13<<2)|2,{61,70,0}}, +/* 33548 */ {(13<<2)|2,{61,70,0}}, +/* 33549 */ {(13<<2)|2,{61,70,0}}, +/* 33550 */ {(13<<2)|2,{61,70,0}}, +/* 33551 */ {(13<<2)|2,{61,70,0}}, +/* 33552 */ {(13<<2)|2,{61,71,0}}, +/* 33553 */ {(13<<2)|2,{61,71,0}}, +/* 33554 */ {(13<<2)|2,{61,71,0}}, +/* 33555 */ {(13<<2)|2,{61,71,0}}, +/* 33556 */ {(13<<2)|2,{61,71,0}}, +/* 33557 */ {(13<<2)|2,{61,71,0}}, +/* 33558 */ {(13<<2)|2,{61,71,0}}, +/* 33559 */ {(13<<2)|2,{61,71,0}}, +/* 33560 */ {(13<<2)|2,{61,72,0}}, +/* 33561 */ {(13<<2)|2,{61,72,0}}, +/* 33562 */ {(13<<2)|2,{61,72,0}}, +/* 33563 */ {(13<<2)|2,{61,72,0}}, +/* 33564 */ {(13<<2)|2,{61,72,0}}, +/* 33565 */ {(13<<2)|2,{61,72,0}}, +/* 33566 */ {(13<<2)|2,{61,72,0}}, +/* 33567 */ {(13<<2)|2,{61,72,0}}, +/* 33568 */ {(13<<2)|2,{61,73,0}}, +/* 33569 */ {(13<<2)|2,{61,73,0}}, +/* 33570 */ {(13<<2)|2,{61,73,0}}, +/* 33571 */ {(13<<2)|2,{61,73,0}}, +/* 33572 */ {(13<<2)|2,{61,73,0}}, +/* 33573 */ {(13<<2)|2,{61,73,0}}, +/* 33574 */ {(13<<2)|2,{61,73,0}}, +/* 33575 */ {(13<<2)|2,{61,73,0}}, +/* 33576 */ {(13<<2)|2,{61,74,0}}, +/* 33577 */ {(13<<2)|2,{61,74,0}}, +/* 33578 */ {(13<<2)|2,{61,74,0}}, +/* 33579 */ {(13<<2)|2,{61,74,0}}, +/* 33580 */ {(13<<2)|2,{61,74,0}}, +/* 33581 */ {(13<<2)|2,{61,74,0}}, +/* 33582 */ {(13<<2)|2,{61,74,0}}, +/* 33583 */ {(13<<2)|2,{61,74,0}}, +/* 33584 */ {(13<<2)|2,{61,75,0}}, +/* 33585 */ {(13<<2)|2,{61,75,0}}, +/* 33586 */ {(13<<2)|2,{61,75,0}}, +/* 33587 */ {(13<<2)|2,{61,75,0}}, +/* 33588 */ {(13<<2)|2,{61,75,0}}, +/* 33589 */ {(13<<2)|2,{61,75,0}}, +/* 33590 */ {(13<<2)|2,{61,75,0}}, +/* 33591 */ {(13<<2)|2,{61,75,0}}, +/* 33592 */ {(13<<2)|2,{61,76,0}}, +/* 33593 */ {(13<<2)|2,{61,76,0}}, +/* 33594 */ {(13<<2)|2,{61,76,0}}, +/* 33595 */ {(13<<2)|2,{61,76,0}}, +/* 33596 */ {(13<<2)|2,{61,76,0}}, +/* 33597 */ {(13<<2)|2,{61,76,0}}, +/* 33598 */ {(13<<2)|2,{61,76,0}}, +/* 33599 */ {(13<<2)|2,{61,76,0}}, +/* 33600 */ {(13<<2)|2,{61,77,0}}, +/* 33601 */ {(13<<2)|2,{61,77,0}}, +/* 33602 */ {(13<<2)|2,{61,77,0}}, +/* 33603 */ {(13<<2)|2,{61,77,0}}, +/* 33604 */ {(13<<2)|2,{61,77,0}}, +/* 33605 */ {(13<<2)|2,{61,77,0}}, +/* 33606 */ {(13<<2)|2,{61,77,0}}, +/* 33607 */ {(13<<2)|2,{61,77,0}}, +/* 33608 */ {(13<<2)|2,{61,78,0}}, +/* 33609 */ {(13<<2)|2,{61,78,0}}, +/* 33610 */ {(13<<2)|2,{61,78,0}}, +/* 33611 */ {(13<<2)|2,{61,78,0}}, +/* 33612 */ {(13<<2)|2,{61,78,0}}, +/* 33613 */ {(13<<2)|2,{61,78,0}}, +/* 33614 */ {(13<<2)|2,{61,78,0}}, +/* 33615 */ {(13<<2)|2,{61,78,0}}, +/* 33616 */ {(13<<2)|2,{61,79,0}}, +/* 33617 */ {(13<<2)|2,{61,79,0}}, +/* 33618 */ {(13<<2)|2,{61,79,0}}, +/* 33619 */ {(13<<2)|2,{61,79,0}}, +/* 33620 */ {(13<<2)|2,{61,79,0}}, +/* 33621 */ {(13<<2)|2,{61,79,0}}, +/* 33622 */ {(13<<2)|2,{61,79,0}}, +/* 33623 */ {(13<<2)|2,{61,79,0}}, +/* 33624 */ {(13<<2)|2,{61,80,0}}, +/* 33625 */ {(13<<2)|2,{61,80,0}}, +/* 33626 */ {(13<<2)|2,{61,80,0}}, +/* 33627 */ {(13<<2)|2,{61,80,0}}, +/* 33628 */ {(13<<2)|2,{61,80,0}}, +/* 33629 */ {(13<<2)|2,{61,80,0}}, +/* 33630 */ {(13<<2)|2,{61,80,0}}, +/* 33631 */ {(13<<2)|2,{61,80,0}}, +/* 33632 */ {(13<<2)|2,{61,81,0}}, +/* 33633 */ {(13<<2)|2,{61,81,0}}, +/* 33634 */ {(13<<2)|2,{61,81,0}}, +/* 33635 */ {(13<<2)|2,{61,81,0}}, +/* 33636 */ {(13<<2)|2,{61,81,0}}, +/* 33637 */ {(13<<2)|2,{61,81,0}}, +/* 33638 */ {(13<<2)|2,{61,81,0}}, +/* 33639 */ {(13<<2)|2,{61,81,0}}, +/* 33640 */ {(13<<2)|2,{61,82,0}}, +/* 33641 */ {(13<<2)|2,{61,82,0}}, +/* 33642 */ {(13<<2)|2,{61,82,0}}, +/* 33643 */ {(13<<2)|2,{61,82,0}}, +/* 33644 */ {(13<<2)|2,{61,82,0}}, +/* 33645 */ {(13<<2)|2,{61,82,0}}, +/* 33646 */ {(13<<2)|2,{61,82,0}}, +/* 33647 */ {(13<<2)|2,{61,82,0}}, +/* 33648 */ {(13<<2)|2,{61,83,0}}, +/* 33649 */ {(13<<2)|2,{61,83,0}}, +/* 33650 */ {(13<<2)|2,{61,83,0}}, +/* 33651 */ {(13<<2)|2,{61,83,0}}, +/* 33652 */ {(13<<2)|2,{61,83,0}}, +/* 33653 */ {(13<<2)|2,{61,83,0}}, +/* 33654 */ {(13<<2)|2,{61,83,0}}, +/* 33655 */ {(13<<2)|2,{61,83,0}}, +/* 33656 */ {(13<<2)|2,{61,84,0}}, +/* 33657 */ {(13<<2)|2,{61,84,0}}, +/* 33658 */ {(13<<2)|2,{61,84,0}}, +/* 33659 */ {(13<<2)|2,{61,84,0}}, +/* 33660 */ {(13<<2)|2,{61,84,0}}, +/* 33661 */ {(13<<2)|2,{61,84,0}}, +/* 33662 */ {(13<<2)|2,{61,84,0}}, +/* 33663 */ {(13<<2)|2,{61,84,0}}, +/* 33664 */ {(13<<2)|2,{61,85,0}}, +/* 33665 */ {(13<<2)|2,{61,85,0}}, +/* 33666 */ {(13<<2)|2,{61,85,0}}, +/* 33667 */ {(13<<2)|2,{61,85,0}}, +/* 33668 */ {(13<<2)|2,{61,85,0}}, +/* 33669 */ {(13<<2)|2,{61,85,0}}, +/* 33670 */ {(13<<2)|2,{61,85,0}}, +/* 33671 */ {(13<<2)|2,{61,85,0}}, +/* 33672 */ {(13<<2)|2,{61,86,0}}, +/* 33673 */ {(13<<2)|2,{61,86,0}}, +/* 33674 */ {(13<<2)|2,{61,86,0}}, +/* 33675 */ {(13<<2)|2,{61,86,0}}, +/* 33676 */ {(13<<2)|2,{61,86,0}}, +/* 33677 */ {(13<<2)|2,{61,86,0}}, +/* 33678 */ {(13<<2)|2,{61,86,0}}, +/* 33679 */ {(13<<2)|2,{61,86,0}}, +/* 33680 */ {(13<<2)|2,{61,87,0}}, +/* 33681 */ {(13<<2)|2,{61,87,0}}, +/* 33682 */ {(13<<2)|2,{61,87,0}}, +/* 33683 */ {(13<<2)|2,{61,87,0}}, +/* 33684 */ {(13<<2)|2,{61,87,0}}, +/* 33685 */ {(13<<2)|2,{61,87,0}}, +/* 33686 */ {(13<<2)|2,{61,87,0}}, +/* 33687 */ {(13<<2)|2,{61,87,0}}, +/* 33688 */ {(13<<2)|2,{61,89,0}}, +/* 33689 */ {(13<<2)|2,{61,89,0}}, +/* 33690 */ {(13<<2)|2,{61,89,0}}, +/* 33691 */ {(13<<2)|2,{61,89,0}}, +/* 33692 */ {(13<<2)|2,{61,89,0}}, +/* 33693 */ {(13<<2)|2,{61,89,0}}, +/* 33694 */ {(13<<2)|2,{61,89,0}}, +/* 33695 */ {(13<<2)|2,{61,89,0}}, +/* 33696 */ {(13<<2)|2,{61,106,0}}, +/* 33697 */ {(13<<2)|2,{61,106,0}}, +/* 33698 */ {(13<<2)|2,{61,106,0}}, +/* 33699 */ {(13<<2)|2,{61,106,0}}, +/* 33700 */ {(13<<2)|2,{61,106,0}}, +/* 33701 */ {(13<<2)|2,{61,106,0}}, +/* 33702 */ {(13<<2)|2,{61,106,0}}, +/* 33703 */ {(13<<2)|2,{61,106,0}}, +/* 33704 */ {(13<<2)|2,{61,107,0}}, +/* 33705 */ {(13<<2)|2,{61,107,0}}, +/* 33706 */ {(13<<2)|2,{61,107,0}}, +/* 33707 */ {(13<<2)|2,{61,107,0}}, +/* 33708 */ {(13<<2)|2,{61,107,0}}, +/* 33709 */ {(13<<2)|2,{61,107,0}}, +/* 33710 */ {(13<<2)|2,{61,107,0}}, +/* 33711 */ {(13<<2)|2,{61,107,0}}, +/* 33712 */ {(13<<2)|2,{61,113,0}}, +/* 33713 */ {(13<<2)|2,{61,113,0}}, +/* 33714 */ {(13<<2)|2,{61,113,0}}, +/* 33715 */ {(13<<2)|2,{61,113,0}}, +/* 33716 */ {(13<<2)|2,{61,113,0}}, +/* 33717 */ {(13<<2)|2,{61,113,0}}, +/* 33718 */ {(13<<2)|2,{61,113,0}}, +/* 33719 */ {(13<<2)|2,{61,113,0}}, +/* 33720 */ {(13<<2)|2,{61,118,0}}, +/* 33721 */ {(13<<2)|2,{61,118,0}}, +/* 33722 */ {(13<<2)|2,{61,118,0}}, +/* 33723 */ {(13<<2)|2,{61,118,0}}, +/* 33724 */ {(13<<2)|2,{61,118,0}}, +/* 33725 */ {(13<<2)|2,{61,118,0}}, +/* 33726 */ {(13<<2)|2,{61,118,0}}, +/* 33727 */ {(13<<2)|2,{61,118,0}}, +/* 33728 */ {(13<<2)|2,{61,119,0}}, +/* 33729 */ {(13<<2)|2,{61,119,0}}, +/* 33730 */ {(13<<2)|2,{61,119,0}}, +/* 33731 */ {(13<<2)|2,{61,119,0}}, +/* 33732 */ {(13<<2)|2,{61,119,0}}, +/* 33733 */ {(13<<2)|2,{61,119,0}}, +/* 33734 */ {(13<<2)|2,{61,119,0}}, +/* 33735 */ {(13<<2)|2,{61,119,0}}, +/* 33736 */ {(13<<2)|2,{61,120,0}}, +/* 33737 */ {(13<<2)|2,{61,120,0}}, +/* 33738 */ {(13<<2)|2,{61,120,0}}, +/* 33739 */ {(13<<2)|2,{61,120,0}}, +/* 33740 */ {(13<<2)|2,{61,120,0}}, +/* 33741 */ {(13<<2)|2,{61,120,0}}, +/* 33742 */ {(13<<2)|2,{61,120,0}}, +/* 33743 */ {(13<<2)|2,{61,120,0}}, +/* 33744 */ {(13<<2)|2,{61,121,0}}, +/* 33745 */ {(13<<2)|2,{61,121,0}}, +/* 33746 */ {(13<<2)|2,{61,121,0}}, +/* 33747 */ {(13<<2)|2,{61,121,0}}, +/* 33748 */ {(13<<2)|2,{61,121,0}}, +/* 33749 */ {(13<<2)|2,{61,121,0}}, +/* 33750 */ {(13<<2)|2,{61,121,0}}, +/* 33751 */ {(13<<2)|2,{61,121,0}}, +/* 33752 */ {(13<<2)|2,{61,122,0}}, +/* 33753 */ {(13<<2)|2,{61,122,0}}, +/* 33754 */ {(13<<2)|2,{61,122,0}}, +/* 33755 */ {(13<<2)|2,{61,122,0}}, +/* 33756 */ {(13<<2)|2,{61,122,0}}, +/* 33757 */ {(13<<2)|2,{61,122,0}}, +/* 33758 */ {(13<<2)|2,{61,122,0}}, +/* 33759 */ {(13<<2)|2,{61,122,0}}, +/* 33760 */ {(14<<2)|2,{61,38,0}}, +/* 33761 */ {(14<<2)|2,{61,38,0}}, +/* 33762 */ {(14<<2)|2,{61,38,0}}, +/* 33763 */ {(14<<2)|2,{61,38,0}}, +/* 33764 */ {(14<<2)|2,{61,42,0}}, +/* 33765 */ {(14<<2)|2,{61,42,0}}, +/* 33766 */ {(14<<2)|2,{61,42,0}}, +/* 33767 */ {(14<<2)|2,{61,42,0}}, +/* 33768 */ {(14<<2)|2,{61,44,0}}, +/* 33769 */ {(14<<2)|2,{61,44,0}}, +/* 33770 */ {(14<<2)|2,{61,44,0}}, +/* 33771 */ {(14<<2)|2,{61,44,0}}, +/* 33772 */ {(14<<2)|2,{61,59,0}}, +/* 33773 */ {(14<<2)|2,{61,59,0}}, +/* 33774 */ {(14<<2)|2,{61,59,0}}, +/* 33775 */ {(14<<2)|2,{61,59,0}}, +/* 33776 */ {(14<<2)|2,{61,88,0}}, +/* 33777 */ {(14<<2)|2,{61,88,0}}, +/* 33778 */ {(14<<2)|2,{61,88,0}}, +/* 33779 */ {(14<<2)|2,{61,88,0}}, +/* 33780 */ {(14<<2)|2,{61,90,0}}, +/* 33781 */ {(14<<2)|2,{61,90,0}}, +/* 33782 */ {(14<<2)|2,{61,90,0}}, +/* 33783 */ {(14<<2)|2,{61,90,0}}, +/* 33784 */ {(16<<2)|2,{61,33,0}}, +/* 33785 */ {(16<<2)|2,{61,34,0}}, +/* 33786 */ {(16<<2)|2,{61,40,0}}, +/* 33787 */ {(16<<2)|2,{61,41,0}}, +/* 33788 */ {(16<<2)|2,{61,63,0}}, +/* 33789 */ {(6<<2)|1,{61,0,0}}, +/* 33790 */ {(6<<2)|1,{61,0,0}}, +/* 33791 */ {(6<<2)|1,{61,0,0}}, +/* 33792 */ {(16<<2)|3,{65,48,48}}, +/* 33793 */ {(16<<2)|3,{65,48,49}}, +/* 33794 */ {(16<<2)|3,{65,48,50}}, +/* 33795 */ {(16<<2)|3,{65,48,97}}, +/* 33796 */ {(16<<2)|3,{65,48,99}}, +/* 33797 */ {(16<<2)|3,{65,48,101}}, +/* 33798 */ {(16<<2)|3,{65,48,105}}, +/* 33799 */ {(16<<2)|3,{65,48,111}}, +/* 33800 */ {(16<<2)|3,{65,48,115}}, +/* 33801 */ {(16<<2)|3,{65,48,116}}, +/* 33802 */ {(11<<2)|2,{65,48,0}}, +/* 33803 */ {(11<<2)|2,{65,48,0}}, +/* 33804 */ {(11<<2)|2,{65,48,0}}, +/* 33805 */ {(11<<2)|2,{65,48,0}}, +/* 33806 */ {(11<<2)|2,{65,48,0}}, +/* 33807 */ {(11<<2)|2,{65,48,0}}, +/* 33808 */ {(11<<2)|2,{65,48,0}}, +/* 33809 */ {(11<<2)|2,{65,48,0}}, +/* 33810 */ {(11<<2)|2,{65,48,0}}, +/* 33811 */ {(11<<2)|2,{65,48,0}}, +/* 33812 */ {(11<<2)|2,{65,48,0}}, +/* 33813 */ {(11<<2)|2,{65,48,0}}, +/* 33814 */ {(11<<2)|2,{65,48,0}}, +/* 33815 */ {(11<<2)|2,{65,48,0}}, +/* 33816 */ {(11<<2)|2,{65,48,0}}, +/* 33817 */ {(11<<2)|2,{65,48,0}}, +/* 33818 */ {(11<<2)|2,{65,48,0}}, +/* 33819 */ {(11<<2)|2,{65,48,0}}, +/* 33820 */ {(11<<2)|2,{65,48,0}}, +/* 33821 */ {(11<<2)|2,{65,48,0}}, +/* 33822 */ {(11<<2)|2,{65,48,0}}, +/* 33823 */ {(11<<2)|2,{65,48,0}}, +/* 33824 */ {(16<<2)|3,{65,49,48}}, +/* 33825 */ {(16<<2)|3,{65,49,49}}, +/* 33826 */ {(16<<2)|3,{65,49,50}}, +/* 33827 */ {(16<<2)|3,{65,49,97}}, +/* 33828 */ {(16<<2)|3,{65,49,99}}, +/* 33829 */ {(16<<2)|3,{65,49,101}}, +/* 33830 */ {(16<<2)|3,{65,49,105}}, +/* 33831 */ {(16<<2)|3,{65,49,111}}, +/* 33832 */ {(16<<2)|3,{65,49,115}}, +/* 33833 */ {(16<<2)|3,{65,49,116}}, +/* 33834 */ {(11<<2)|2,{65,49,0}}, +/* 33835 */ {(11<<2)|2,{65,49,0}}, +/* 33836 */ {(11<<2)|2,{65,49,0}}, +/* 33837 */ {(11<<2)|2,{65,49,0}}, +/* 33838 */ {(11<<2)|2,{65,49,0}}, +/* 33839 */ {(11<<2)|2,{65,49,0}}, +/* 33840 */ {(11<<2)|2,{65,49,0}}, +/* 33841 */ {(11<<2)|2,{65,49,0}}, +/* 33842 */ {(11<<2)|2,{65,49,0}}, +/* 33843 */ {(11<<2)|2,{65,49,0}}, +/* 33844 */ {(11<<2)|2,{65,49,0}}, +/* 33845 */ {(11<<2)|2,{65,49,0}}, +/* 33846 */ {(11<<2)|2,{65,49,0}}, +/* 33847 */ {(11<<2)|2,{65,49,0}}, +/* 33848 */ {(11<<2)|2,{65,49,0}}, +/* 33849 */ {(11<<2)|2,{65,49,0}}, +/* 33850 */ {(11<<2)|2,{65,49,0}}, +/* 33851 */ {(11<<2)|2,{65,49,0}}, +/* 33852 */ {(11<<2)|2,{65,49,0}}, +/* 33853 */ {(11<<2)|2,{65,49,0}}, +/* 33854 */ {(11<<2)|2,{65,49,0}}, +/* 33855 */ {(11<<2)|2,{65,49,0}}, +/* 33856 */ {(16<<2)|3,{65,50,48}}, +/* 33857 */ {(16<<2)|3,{65,50,49}}, +/* 33858 */ {(16<<2)|3,{65,50,50}}, +/* 33859 */ {(16<<2)|3,{65,50,97}}, +/* 33860 */ {(16<<2)|3,{65,50,99}}, +/* 33861 */ {(16<<2)|3,{65,50,101}}, +/* 33862 */ {(16<<2)|3,{65,50,105}}, +/* 33863 */ {(16<<2)|3,{65,50,111}}, +/* 33864 */ {(16<<2)|3,{65,50,115}}, +/* 33865 */ {(16<<2)|3,{65,50,116}}, +/* 33866 */ {(11<<2)|2,{65,50,0}}, +/* 33867 */ {(11<<2)|2,{65,50,0}}, +/* 33868 */ {(11<<2)|2,{65,50,0}}, +/* 33869 */ {(11<<2)|2,{65,50,0}}, +/* 33870 */ {(11<<2)|2,{65,50,0}}, +/* 33871 */ {(11<<2)|2,{65,50,0}}, +/* 33872 */ {(11<<2)|2,{65,50,0}}, +/* 33873 */ {(11<<2)|2,{65,50,0}}, +/* 33874 */ {(11<<2)|2,{65,50,0}}, +/* 33875 */ {(11<<2)|2,{65,50,0}}, +/* 33876 */ {(11<<2)|2,{65,50,0}}, +/* 33877 */ {(11<<2)|2,{65,50,0}}, +/* 33878 */ {(11<<2)|2,{65,50,0}}, +/* 33879 */ {(11<<2)|2,{65,50,0}}, +/* 33880 */ {(11<<2)|2,{65,50,0}}, +/* 33881 */ {(11<<2)|2,{65,50,0}}, +/* 33882 */ {(11<<2)|2,{65,50,0}}, +/* 33883 */ {(11<<2)|2,{65,50,0}}, +/* 33884 */ {(11<<2)|2,{65,50,0}}, +/* 33885 */ {(11<<2)|2,{65,50,0}}, +/* 33886 */ {(11<<2)|2,{65,50,0}}, +/* 33887 */ {(11<<2)|2,{65,50,0}}, +/* 33888 */ {(16<<2)|3,{65,97,48}}, +/* 33889 */ {(16<<2)|3,{65,97,49}}, +/* 33890 */ {(16<<2)|3,{65,97,50}}, +/* 33891 */ {(16<<2)|3,{65,97,97}}, +/* 33892 */ {(16<<2)|3,{65,97,99}}, +/* 33893 */ {(16<<2)|3,{65,97,101}}, +/* 33894 */ {(16<<2)|3,{65,97,105}}, +/* 33895 */ {(16<<2)|3,{65,97,111}}, +/* 33896 */ {(16<<2)|3,{65,97,115}}, +/* 33897 */ {(16<<2)|3,{65,97,116}}, +/* 33898 */ {(11<<2)|2,{65,97,0}}, +/* 33899 */ {(11<<2)|2,{65,97,0}}, +/* 33900 */ {(11<<2)|2,{65,97,0}}, +/* 33901 */ {(11<<2)|2,{65,97,0}}, +/* 33902 */ {(11<<2)|2,{65,97,0}}, +/* 33903 */ {(11<<2)|2,{65,97,0}}, +/* 33904 */ {(11<<2)|2,{65,97,0}}, +/* 33905 */ {(11<<2)|2,{65,97,0}}, +/* 33906 */ {(11<<2)|2,{65,97,0}}, +/* 33907 */ {(11<<2)|2,{65,97,0}}, +/* 33908 */ {(11<<2)|2,{65,97,0}}, +/* 33909 */ {(11<<2)|2,{65,97,0}}, +/* 33910 */ {(11<<2)|2,{65,97,0}}, +/* 33911 */ {(11<<2)|2,{65,97,0}}, +/* 33912 */ {(11<<2)|2,{65,97,0}}, +/* 33913 */ {(11<<2)|2,{65,97,0}}, +/* 33914 */ {(11<<2)|2,{65,97,0}}, +/* 33915 */ {(11<<2)|2,{65,97,0}}, +/* 33916 */ {(11<<2)|2,{65,97,0}}, +/* 33917 */ {(11<<2)|2,{65,97,0}}, +/* 33918 */ {(11<<2)|2,{65,97,0}}, +/* 33919 */ {(11<<2)|2,{65,97,0}}, +/* 33920 */ {(16<<2)|3,{65,99,48}}, +/* 33921 */ {(16<<2)|3,{65,99,49}}, +/* 33922 */ {(16<<2)|3,{65,99,50}}, +/* 33923 */ {(16<<2)|3,{65,99,97}}, +/* 33924 */ {(16<<2)|3,{65,99,99}}, +/* 33925 */ {(16<<2)|3,{65,99,101}}, +/* 33926 */ {(16<<2)|3,{65,99,105}}, +/* 33927 */ {(16<<2)|3,{65,99,111}}, +/* 33928 */ {(16<<2)|3,{65,99,115}}, +/* 33929 */ {(16<<2)|3,{65,99,116}}, +/* 33930 */ {(11<<2)|2,{65,99,0}}, +/* 33931 */ {(11<<2)|2,{65,99,0}}, +/* 33932 */ {(11<<2)|2,{65,99,0}}, +/* 33933 */ {(11<<2)|2,{65,99,0}}, +/* 33934 */ {(11<<2)|2,{65,99,0}}, +/* 33935 */ {(11<<2)|2,{65,99,0}}, +/* 33936 */ {(11<<2)|2,{65,99,0}}, +/* 33937 */ {(11<<2)|2,{65,99,0}}, +/* 33938 */ {(11<<2)|2,{65,99,0}}, +/* 33939 */ {(11<<2)|2,{65,99,0}}, +/* 33940 */ {(11<<2)|2,{65,99,0}}, +/* 33941 */ {(11<<2)|2,{65,99,0}}, +/* 33942 */ {(11<<2)|2,{65,99,0}}, +/* 33943 */ {(11<<2)|2,{65,99,0}}, +/* 33944 */ {(11<<2)|2,{65,99,0}}, +/* 33945 */ {(11<<2)|2,{65,99,0}}, +/* 33946 */ {(11<<2)|2,{65,99,0}}, +/* 33947 */ {(11<<2)|2,{65,99,0}}, +/* 33948 */ {(11<<2)|2,{65,99,0}}, +/* 33949 */ {(11<<2)|2,{65,99,0}}, +/* 33950 */ {(11<<2)|2,{65,99,0}}, +/* 33951 */ {(11<<2)|2,{65,99,0}}, +/* 33952 */ {(16<<2)|3,{65,101,48}}, +/* 33953 */ {(16<<2)|3,{65,101,49}}, +/* 33954 */ {(16<<2)|3,{65,101,50}}, +/* 33955 */ {(16<<2)|3,{65,101,97}}, +/* 33956 */ {(16<<2)|3,{65,101,99}}, +/* 33957 */ {(16<<2)|3,{65,101,101}}, +/* 33958 */ {(16<<2)|3,{65,101,105}}, +/* 33959 */ {(16<<2)|3,{65,101,111}}, +/* 33960 */ {(16<<2)|3,{65,101,115}}, +/* 33961 */ {(16<<2)|3,{65,101,116}}, +/* 33962 */ {(11<<2)|2,{65,101,0}}, +/* 33963 */ {(11<<2)|2,{65,101,0}}, +/* 33964 */ {(11<<2)|2,{65,101,0}}, +/* 33965 */ {(11<<2)|2,{65,101,0}}, +/* 33966 */ {(11<<2)|2,{65,101,0}}, +/* 33967 */ {(11<<2)|2,{65,101,0}}, +/* 33968 */ {(11<<2)|2,{65,101,0}}, +/* 33969 */ {(11<<2)|2,{65,101,0}}, +/* 33970 */ {(11<<2)|2,{65,101,0}}, +/* 33971 */ {(11<<2)|2,{65,101,0}}, +/* 33972 */ {(11<<2)|2,{65,101,0}}, +/* 33973 */ {(11<<2)|2,{65,101,0}}, +/* 33974 */ {(11<<2)|2,{65,101,0}}, +/* 33975 */ {(11<<2)|2,{65,101,0}}, +/* 33976 */ {(11<<2)|2,{65,101,0}}, +/* 33977 */ {(11<<2)|2,{65,101,0}}, +/* 33978 */ {(11<<2)|2,{65,101,0}}, +/* 33979 */ {(11<<2)|2,{65,101,0}}, +/* 33980 */ {(11<<2)|2,{65,101,0}}, +/* 33981 */ {(11<<2)|2,{65,101,0}}, +/* 33982 */ {(11<<2)|2,{65,101,0}}, +/* 33983 */ {(11<<2)|2,{65,101,0}}, +/* 33984 */ {(16<<2)|3,{65,105,48}}, +/* 33985 */ {(16<<2)|3,{65,105,49}}, +/* 33986 */ {(16<<2)|3,{65,105,50}}, +/* 33987 */ {(16<<2)|3,{65,105,97}}, +/* 33988 */ {(16<<2)|3,{65,105,99}}, +/* 33989 */ {(16<<2)|3,{65,105,101}}, +/* 33990 */ {(16<<2)|3,{65,105,105}}, +/* 33991 */ {(16<<2)|3,{65,105,111}}, +/* 33992 */ {(16<<2)|3,{65,105,115}}, +/* 33993 */ {(16<<2)|3,{65,105,116}}, +/* 33994 */ {(11<<2)|2,{65,105,0}}, +/* 33995 */ {(11<<2)|2,{65,105,0}}, +/* 33996 */ {(11<<2)|2,{65,105,0}}, +/* 33997 */ {(11<<2)|2,{65,105,0}}, +/* 33998 */ {(11<<2)|2,{65,105,0}}, +/* 33999 */ {(11<<2)|2,{65,105,0}}, +/* 34000 */ {(11<<2)|2,{65,105,0}}, +/* 34001 */ {(11<<2)|2,{65,105,0}}, +/* 34002 */ {(11<<2)|2,{65,105,0}}, +/* 34003 */ {(11<<2)|2,{65,105,0}}, +/* 34004 */ {(11<<2)|2,{65,105,0}}, +/* 34005 */ {(11<<2)|2,{65,105,0}}, +/* 34006 */ {(11<<2)|2,{65,105,0}}, +/* 34007 */ {(11<<2)|2,{65,105,0}}, +/* 34008 */ {(11<<2)|2,{65,105,0}}, +/* 34009 */ {(11<<2)|2,{65,105,0}}, +/* 34010 */ {(11<<2)|2,{65,105,0}}, +/* 34011 */ {(11<<2)|2,{65,105,0}}, +/* 34012 */ {(11<<2)|2,{65,105,0}}, +/* 34013 */ {(11<<2)|2,{65,105,0}}, +/* 34014 */ {(11<<2)|2,{65,105,0}}, +/* 34015 */ {(11<<2)|2,{65,105,0}}, +/* 34016 */ {(16<<2)|3,{65,111,48}}, +/* 34017 */ {(16<<2)|3,{65,111,49}}, +/* 34018 */ {(16<<2)|3,{65,111,50}}, +/* 34019 */ {(16<<2)|3,{65,111,97}}, +/* 34020 */ {(16<<2)|3,{65,111,99}}, +/* 34021 */ {(16<<2)|3,{65,111,101}}, +/* 34022 */ {(16<<2)|3,{65,111,105}}, +/* 34023 */ {(16<<2)|3,{65,111,111}}, +/* 34024 */ {(16<<2)|3,{65,111,115}}, +/* 34025 */ {(16<<2)|3,{65,111,116}}, +/* 34026 */ {(11<<2)|2,{65,111,0}}, +/* 34027 */ {(11<<2)|2,{65,111,0}}, +/* 34028 */ {(11<<2)|2,{65,111,0}}, +/* 34029 */ {(11<<2)|2,{65,111,0}}, +/* 34030 */ {(11<<2)|2,{65,111,0}}, +/* 34031 */ {(11<<2)|2,{65,111,0}}, +/* 34032 */ {(11<<2)|2,{65,111,0}}, +/* 34033 */ {(11<<2)|2,{65,111,0}}, +/* 34034 */ {(11<<2)|2,{65,111,0}}, +/* 34035 */ {(11<<2)|2,{65,111,0}}, +/* 34036 */ {(11<<2)|2,{65,111,0}}, +/* 34037 */ {(11<<2)|2,{65,111,0}}, +/* 34038 */ {(11<<2)|2,{65,111,0}}, +/* 34039 */ {(11<<2)|2,{65,111,0}}, +/* 34040 */ {(11<<2)|2,{65,111,0}}, +/* 34041 */ {(11<<2)|2,{65,111,0}}, +/* 34042 */ {(11<<2)|2,{65,111,0}}, +/* 34043 */ {(11<<2)|2,{65,111,0}}, +/* 34044 */ {(11<<2)|2,{65,111,0}}, +/* 34045 */ {(11<<2)|2,{65,111,0}}, +/* 34046 */ {(11<<2)|2,{65,111,0}}, +/* 34047 */ {(11<<2)|2,{65,111,0}}, +/* 34048 */ {(16<<2)|3,{65,115,48}}, +/* 34049 */ {(16<<2)|3,{65,115,49}}, +/* 34050 */ {(16<<2)|3,{65,115,50}}, +/* 34051 */ {(16<<2)|3,{65,115,97}}, +/* 34052 */ {(16<<2)|3,{65,115,99}}, +/* 34053 */ {(16<<2)|3,{65,115,101}}, +/* 34054 */ {(16<<2)|3,{65,115,105}}, +/* 34055 */ {(16<<2)|3,{65,115,111}}, +/* 34056 */ {(16<<2)|3,{65,115,115}}, +/* 34057 */ {(16<<2)|3,{65,115,116}}, +/* 34058 */ {(11<<2)|2,{65,115,0}}, +/* 34059 */ {(11<<2)|2,{65,115,0}}, +/* 34060 */ {(11<<2)|2,{65,115,0}}, +/* 34061 */ {(11<<2)|2,{65,115,0}}, +/* 34062 */ {(11<<2)|2,{65,115,0}}, +/* 34063 */ {(11<<2)|2,{65,115,0}}, +/* 34064 */ {(11<<2)|2,{65,115,0}}, +/* 34065 */ {(11<<2)|2,{65,115,0}}, +/* 34066 */ {(11<<2)|2,{65,115,0}}, +/* 34067 */ {(11<<2)|2,{65,115,0}}, +/* 34068 */ {(11<<2)|2,{65,115,0}}, +/* 34069 */ {(11<<2)|2,{65,115,0}}, +/* 34070 */ {(11<<2)|2,{65,115,0}}, +/* 34071 */ {(11<<2)|2,{65,115,0}}, +/* 34072 */ {(11<<2)|2,{65,115,0}}, +/* 34073 */ {(11<<2)|2,{65,115,0}}, +/* 34074 */ {(11<<2)|2,{65,115,0}}, +/* 34075 */ {(11<<2)|2,{65,115,0}}, +/* 34076 */ {(11<<2)|2,{65,115,0}}, +/* 34077 */ {(11<<2)|2,{65,115,0}}, +/* 34078 */ {(11<<2)|2,{65,115,0}}, +/* 34079 */ {(11<<2)|2,{65,115,0}}, +/* 34080 */ {(16<<2)|3,{65,116,48}}, +/* 34081 */ {(16<<2)|3,{65,116,49}}, +/* 34082 */ {(16<<2)|3,{65,116,50}}, +/* 34083 */ {(16<<2)|3,{65,116,97}}, +/* 34084 */ {(16<<2)|3,{65,116,99}}, +/* 34085 */ {(16<<2)|3,{65,116,101}}, +/* 34086 */ {(16<<2)|3,{65,116,105}}, +/* 34087 */ {(16<<2)|3,{65,116,111}}, +/* 34088 */ {(16<<2)|3,{65,116,115}}, +/* 34089 */ {(16<<2)|3,{65,116,116}}, +/* 34090 */ {(11<<2)|2,{65,116,0}}, +/* 34091 */ {(11<<2)|2,{65,116,0}}, +/* 34092 */ {(11<<2)|2,{65,116,0}}, +/* 34093 */ {(11<<2)|2,{65,116,0}}, +/* 34094 */ {(11<<2)|2,{65,116,0}}, +/* 34095 */ {(11<<2)|2,{65,116,0}}, +/* 34096 */ {(11<<2)|2,{65,116,0}}, +/* 34097 */ {(11<<2)|2,{65,116,0}}, +/* 34098 */ {(11<<2)|2,{65,116,0}}, +/* 34099 */ {(11<<2)|2,{65,116,0}}, +/* 34100 */ {(11<<2)|2,{65,116,0}}, +/* 34101 */ {(11<<2)|2,{65,116,0}}, +/* 34102 */ {(11<<2)|2,{65,116,0}}, +/* 34103 */ {(11<<2)|2,{65,116,0}}, +/* 34104 */ {(11<<2)|2,{65,116,0}}, +/* 34105 */ {(11<<2)|2,{65,116,0}}, +/* 34106 */ {(11<<2)|2,{65,116,0}}, +/* 34107 */ {(11<<2)|2,{65,116,0}}, +/* 34108 */ {(11<<2)|2,{65,116,0}}, +/* 34109 */ {(11<<2)|2,{65,116,0}}, +/* 34110 */ {(11<<2)|2,{65,116,0}}, +/* 34111 */ {(11<<2)|2,{65,116,0}}, +/* 34112 */ {(12<<2)|2,{65,32,0}}, +/* 34113 */ {(12<<2)|2,{65,32,0}}, +/* 34114 */ {(12<<2)|2,{65,32,0}}, +/* 34115 */ {(12<<2)|2,{65,32,0}}, +/* 34116 */ {(12<<2)|2,{65,32,0}}, +/* 34117 */ {(12<<2)|2,{65,32,0}}, +/* 34118 */ {(12<<2)|2,{65,32,0}}, +/* 34119 */ {(12<<2)|2,{65,32,0}}, +/* 34120 */ {(12<<2)|2,{65,32,0}}, +/* 34121 */ {(12<<2)|2,{65,32,0}}, +/* 34122 */ {(12<<2)|2,{65,32,0}}, +/* 34123 */ {(12<<2)|2,{65,32,0}}, +/* 34124 */ {(12<<2)|2,{65,32,0}}, +/* 34125 */ {(12<<2)|2,{65,32,0}}, +/* 34126 */ {(12<<2)|2,{65,32,0}}, +/* 34127 */ {(12<<2)|2,{65,32,0}}, +/* 34128 */ {(12<<2)|2,{65,37,0}}, +/* 34129 */ {(12<<2)|2,{65,37,0}}, +/* 34130 */ {(12<<2)|2,{65,37,0}}, +/* 34131 */ {(12<<2)|2,{65,37,0}}, +/* 34132 */ {(12<<2)|2,{65,37,0}}, +/* 34133 */ {(12<<2)|2,{65,37,0}}, +/* 34134 */ {(12<<2)|2,{65,37,0}}, +/* 34135 */ {(12<<2)|2,{65,37,0}}, +/* 34136 */ {(12<<2)|2,{65,37,0}}, +/* 34137 */ {(12<<2)|2,{65,37,0}}, +/* 34138 */ {(12<<2)|2,{65,37,0}}, +/* 34139 */ {(12<<2)|2,{65,37,0}}, +/* 34140 */ {(12<<2)|2,{65,37,0}}, +/* 34141 */ {(12<<2)|2,{65,37,0}}, +/* 34142 */ {(12<<2)|2,{65,37,0}}, +/* 34143 */ {(12<<2)|2,{65,37,0}}, +/* 34144 */ {(12<<2)|2,{65,45,0}}, +/* 34145 */ {(12<<2)|2,{65,45,0}}, +/* 34146 */ {(12<<2)|2,{65,45,0}}, +/* 34147 */ {(12<<2)|2,{65,45,0}}, +/* 34148 */ {(12<<2)|2,{65,45,0}}, +/* 34149 */ {(12<<2)|2,{65,45,0}}, +/* 34150 */ {(12<<2)|2,{65,45,0}}, +/* 34151 */ {(12<<2)|2,{65,45,0}}, +/* 34152 */ {(12<<2)|2,{65,45,0}}, +/* 34153 */ {(12<<2)|2,{65,45,0}}, +/* 34154 */ {(12<<2)|2,{65,45,0}}, +/* 34155 */ {(12<<2)|2,{65,45,0}}, +/* 34156 */ {(12<<2)|2,{65,45,0}}, +/* 34157 */ {(12<<2)|2,{65,45,0}}, +/* 34158 */ {(12<<2)|2,{65,45,0}}, +/* 34159 */ {(12<<2)|2,{65,45,0}}, +/* 34160 */ {(12<<2)|2,{65,46,0}}, +/* 34161 */ {(12<<2)|2,{65,46,0}}, +/* 34162 */ {(12<<2)|2,{65,46,0}}, +/* 34163 */ {(12<<2)|2,{65,46,0}}, +/* 34164 */ {(12<<2)|2,{65,46,0}}, +/* 34165 */ {(12<<2)|2,{65,46,0}}, +/* 34166 */ {(12<<2)|2,{65,46,0}}, +/* 34167 */ {(12<<2)|2,{65,46,0}}, +/* 34168 */ {(12<<2)|2,{65,46,0}}, +/* 34169 */ {(12<<2)|2,{65,46,0}}, +/* 34170 */ {(12<<2)|2,{65,46,0}}, +/* 34171 */ {(12<<2)|2,{65,46,0}}, +/* 34172 */ {(12<<2)|2,{65,46,0}}, +/* 34173 */ {(12<<2)|2,{65,46,0}}, +/* 34174 */ {(12<<2)|2,{65,46,0}}, +/* 34175 */ {(12<<2)|2,{65,46,0}}, +/* 34176 */ {(12<<2)|2,{65,47,0}}, +/* 34177 */ {(12<<2)|2,{65,47,0}}, +/* 34178 */ {(12<<2)|2,{65,47,0}}, +/* 34179 */ {(12<<2)|2,{65,47,0}}, +/* 34180 */ {(12<<2)|2,{65,47,0}}, +/* 34181 */ {(12<<2)|2,{65,47,0}}, +/* 34182 */ {(12<<2)|2,{65,47,0}}, +/* 34183 */ {(12<<2)|2,{65,47,0}}, +/* 34184 */ {(12<<2)|2,{65,47,0}}, +/* 34185 */ {(12<<2)|2,{65,47,0}}, +/* 34186 */ {(12<<2)|2,{65,47,0}}, +/* 34187 */ {(12<<2)|2,{65,47,0}}, +/* 34188 */ {(12<<2)|2,{65,47,0}}, +/* 34189 */ {(12<<2)|2,{65,47,0}}, +/* 34190 */ {(12<<2)|2,{65,47,0}}, +/* 34191 */ {(12<<2)|2,{65,47,0}}, +/* 34192 */ {(12<<2)|2,{65,51,0}}, +/* 34193 */ {(12<<2)|2,{65,51,0}}, +/* 34194 */ {(12<<2)|2,{65,51,0}}, +/* 34195 */ {(12<<2)|2,{65,51,0}}, +/* 34196 */ {(12<<2)|2,{65,51,0}}, +/* 34197 */ {(12<<2)|2,{65,51,0}}, +/* 34198 */ {(12<<2)|2,{65,51,0}}, +/* 34199 */ {(12<<2)|2,{65,51,0}}, +/* 34200 */ {(12<<2)|2,{65,51,0}}, +/* 34201 */ {(12<<2)|2,{65,51,0}}, +/* 34202 */ {(12<<2)|2,{65,51,0}}, +/* 34203 */ {(12<<2)|2,{65,51,0}}, +/* 34204 */ {(12<<2)|2,{65,51,0}}, +/* 34205 */ {(12<<2)|2,{65,51,0}}, +/* 34206 */ {(12<<2)|2,{65,51,0}}, +/* 34207 */ {(12<<2)|2,{65,51,0}}, +/* 34208 */ {(12<<2)|2,{65,52,0}}, +/* 34209 */ {(12<<2)|2,{65,52,0}}, +/* 34210 */ {(12<<2)|2,{65,52,0}}, +/* 34211 */ {(12<<2)|2,{65,52,0}}, +/* 34212 */ {(12<<2)|2,{65,52,0}}, +/* 34213 */ {(12<<2)|2,{65,52,0}}, +/* 34214 */ {(12<<2)|2,{65,52,0}}, +/* 34215 */ {(12<<2)|2,{65,52,0}}, +/* 34216 */ {(12<<2)|2,{65,52,0}}, +/* 34217 */ {(12<<2)|2,{65,52,0}}, +/* 34218 */ {(12<<2)|2,{65,52,0}}, +/* 34219 */ {(12<<2)|2,{65,52,0}}, +/* 34220 */ {(12<<2)|2,{65,52,0}}, +/* 34221 */ {(12<<2)|2,{65,52,0}}, +/* 34222 */ {(12<<2)|2,{65,52,0}}, +/* 34223 */ {(12<<2)|2,{65,52,0}}, +/* 34224 */ {(12<<2)|2,{65,53,0}}, +/* 34225 */ {(12<<2)|2,{65,53,0}}, +/* 34226 */ {(12<<2)|2,{65,53,0}}, +/* 34227 */ {(12<<2)|2,{65,53,0}}, +/* 34228 */ {(12<<2)|2,{65,53,0}}, +/* 34229 */ {(12<<2)|2,{65,53,0}}, +/* 34230 */ {(12<<2)|2,{65,53,0}}, +/* 34231 */ {(12<<2)|2,{65,53,0}}, +/* 34232 */ {(12<<2)|2,{65,53,0}}, +/* 34233 */ {(12<<2)|2,{65,53,0}}, +/* 34234 */ {(12<<2)|2,{65,53,0}}, +/* 34235 */ {(12<<2)|2,{65,53,0}}, +/* 34236 */ {(12<<2)|2,{65,53,0}}, +/* 34237 */ {(12<<2)|2,{65,53,0}}, +/* 34238 */ {(12<<2)|2,{65,53,0}}, +/* 34239 */ {(12<<2)|2,{65,53,0}}, +/* 34240 */ {(12<<2)|2,{65,54,0}}, +/* 34241 */ {(12<<2)|2,{65,54,0}}, +/* 34242 */ {(12<<2)|2,{65,54,0}}, +/* 34243 */ {(12<<2)|2,{65,54,0}}, +/* 34244 */ {(12<<2)|2,{65,54,0}}, +/* 34245 */ {(12<<2)|2,{65,54,0}}, +/* 34246 */ {(12<<2)|2,{65,54,0}}, +/* 34247 */ {(12<<2)|2,{65,54,0}}, +/* 34248 */ {(12<<2)|2,{65,54,0}}, +/* 34249 */ {(12<<2)|2,{65,54,0}}, +/* 34250 */ {(12<<2)|2,{65,54,0}}, +/* 34251 */ {(12<<2)|2,{65,54,0}}, +/* 34252 */ {(12<<2)|2,{65,54,0}}, +/* 34253 */ {(12<<2)|2,{65,54,0}}, +/* 34254 */ {(12<<2)|2,{65,54,0}}, +/* 34255 */ {(12<<2)|2,{65,54,0}}, +/* 34256 */ {(12<<2)|2,{65,55,0}}, +/* 34257 */ {(12<<2)|2,{65,55,0}}, +/* 34258 */ {(12<<2)|2,{65,55,0}}, +/* 34259 */ {(12<<2)|2,{65,55,0}}, +/* 34260 */ {(12<<2)|2,{65,55,0}}, +/* 34261 */ {(12<<2)|2,{65,55,0}}, +/* 34262 */ {(12<<2)|2,{65,55,0}}, +/* 34263 */ {(12<<2)|2,{65,55,0}}, +/* 34264 */ {(12<<2)|2,{65,55,0}}, +/* 34265 */ {(12<<2)|2,{65,55,0}}, +/* 34266 */ {(12<<2)|2,{65,55,0}}, +/* 34267 */ {(12<<2)|2,{65,55,0}}, +/* 34268 */ {(12<<2)|2,{65,55,0}}, +/* 34269 */ {(12<<2)|2,{65,55,0}}, +/* 34270 */ {(12<<2)|2,{65,55,0}}, +/* 34271 */ {(12<<2)|2,{65,55,0}}, +/* 34272 */ {(12<<2)|2,{65,56,0}}, +/* 34273 */ {(12<<2)|2,{65,56,0}}, +/* 34274 */ {(12<<2)|2,{65,56,0}}, +/* 34275 */ {(12<<2)|2,{65,56,0}}, +/* 34276 */ {(12<<2)|2,{65,56,0}}, +/* 34277 */ {(12<<2)|2,{65,56,0}}, +/* 34278 */ {(12<<2)|2,{65,56,0}}, +/* 34279 */ {(12<<2)|2,{65,56,0}}, +/* 34280 */ {(12<<2)|2,{65,56,0}}, +/* 34281 */ {(12<<2)|2,{65,56,0}}, +/* 34282 */ {(12<<2)|2,{65,56,0}}, +/* 34283 */ {(12<<2)|2,{65,56,0}}, +/* 34284 */ {(12<<2)|2,{65,56,0}}, +/* 34285 */ {(12<<2)|2,{65,56,0}}, +/* 34286 */ {(12<<2)|2,{65,56,0}}, +/* 34287 */ {(12<<2)|2,{65,56,0}}, +/* 34288 */ {(12<<2)|2,{65,57,0}}, +/* 34289 */ {(12<<2)|2,{65,57,0}}, +/* 34290 */ {(12<<2)|2,{65,57,0}}, +/* 34291 */ {(12<<2)|2,{65,57,0}}, +/* 34292 */ {(12<<2)|2,{65,57,0}}, +/* 34293 */ {(12<<2)|2,{65,57,0}}, +/* 34294 */ {(12<<2)|2,{65,57,0}}, +/* 34295 */ {(12<<2)|2,{65,57,0}}, +/* 34296 */ {(12<<2)|2,{65,57,0}}, +/* 34297 */ {(12<<2)|2,{65,57,0}}, +/* 34298 */ {(12<<2)|2,{65,57,0}}, +/* 34299 */ {(12<<2)|2,{65,57,0}}, +/* 34300 */ {(12<<2)|2,{65,57,0}}, +/* 34301 */ {(12<<2)|2,{65,57,0}}, +/* 34302 */ {(12<<2)|2,{65,57,0}}, +/* 34303 */ {(12<<2)|2,{65,57,0}}, +/* 34304 */ {(12<<2)|2,{65,61,0}}, +/* 34305 */ {(12<<2)|2,{65,61,0}}, +/* 34306 */ {(12<<2)|2,{65,61,0}}, +/* 34307 */ {(12<<2)|2,{65,61,0}}, +/* 34308 */ {(12<<2)|2,{65,61,0}}, +/* 34309 */ {(12<<2)|2,{65,61,0}}, +/* 34310 */ {(12<<2)|2,{65,61,0}}, +/* 34311 */ {(12<<2)|2,{65,61,0}}, +/* 34312 */ {(12<<2)|2,{65,61,0}}, +/* 34313 */ {(12<<2)|2,{65,61,0}}, +/* 34314 */ {(12<<2)|2,{65,61,0}}, +/* 34315 */ {(12<<2)|2,{65,61,0}}, +/* 34316 */ {(12<<2)|2,{65,61,0}}, +/* 34317 */ {(12<<2)|2,{65,61,0}}, +/* 34318 */ {(12<<2)|2,{65,61,0}}, +/* 34319 */ {(12<<2)|2,{65,61,0}}, +/* 34320 */ {(12<<2)|2,{65,65,0}}, +/* 34321 */ {(12<<2)|2,{65,65,0}}, +/* 34322 */ {(12<<2)|2,{65,65,0}}, +/* 34323 */ {(12<<2)|2,{65,65,0}}, +/* 34324 */ {(12<<2)|2,{65,65,0}}, +/* 34325 */ {(12<<2)|2,{65,65,0}}, +/* 34326 */ {(12<<2)|2,{65,65,0}}, +/* 34327 */ {(12<<2)|2,{65,65,0}}, +/* 34328 */ {(12<<2)|2,{65,65,0}}, +/* 34329 */ {(12<<2)|2,{65,65,0}}, +/* 34330 */ {(12<<2)|2,{65,65,0}}, +/* 34331 */ {(12<<2)|2,{65,65,0}}, +/* 34332 */ {(12<<2)|2,{65,65,0}}, +/* 34333 */ {(12<<2)|2,{65,65,0}}, +/* 34334 */ {(12<<2)|2,{65,65,0}}, +/* 34335 */ {(12<<2)|2,{65,65,0}}, +/* 34336 */ {(12<<2)|2,{65,95,0}}, +/* 34337 */ {(12<<2)|2,{65,95,0}}, +/* 34338 */ {(12<<2)|2,{65,95,0}}, +/* 34339 */ {(12<<2)|2,{65,95,0}}, +/* 34340 */ {(12<<2)|2,{65,95,0}}, +/* 34341 */ {(12<<2)|2,{65,95,0}}, +/* 34342 */ {(12<<2)|2,{65,95,0}}, +/* 34343 */ {(12<<2)|2,{65,95,0}}, +/* 34344 */ {(12<<2)|2,{65,95,0}}, +/* 34345 */ {(12<<2)|2,{65,95,0}}, +/* 34346 */ {(12<<2)|2,{65,95,0}}, +/* 34347 */ {(12<<2)|2,{65,95,0}}, +/* 34348 */ {(12<<2)|2,{65,95,0}}, +/* 34349 */ {(12<<2)|2,{65,95,0}}, +/* 34350 */ {(12<<2)|2,{65,95,0}}, +/* 34351 */ {(12<<2)|2,{65,95,0}}, +/* 34352 */ {(12<<2)|2,{65,98,0}}, +/* 34353 */ {(12<<2)|2,{65,98,0}}, +/* 34354 */ {(12<<2)|2,{65,98,0}}, +/* 34355 */ {(12<<2)|2,{65,98,0}}, +/* 34356 */ {(12<<2)|2,{65,98,0}}, +/* 34357 */ {(12<<2)|2,{65,98,0}}, +/* 34358 */ {(12<<2)|2,{65,98,0}}, +/* 34359 */ {(12<<2)|2,{65,98,0}}, +/* 34360 */ {(12<<2)|2,{65,98,0}}, +/* 34361 */ {(12<<2)|2,{65,98,0}}, +/* 34362 */ {(12<<2)|2,{65,98,0}}, +/* 34363 */ {(12<<2)|2,{65,98,0}}, +/* 34364 */ {(12<<2)|2,{65,98,0}}, +/* 34365 */ {(12<<2)|2,{65,98,0}}, +/* 34366 */ {(12<<2)|2,{65,98,0}}, +/* 34367 */ {(12<<2)|2,{65,98,0}}, +/* 34368 */ {(12<<2)|2,{65,100,0}}, +/* 34369 */ {(12<<2)|2,{65,100,0}}, +/* 34370 */ {(12<<2)|2,{65,100,0}}, +/* 34371 */ {(12<<2)|2,{65,100,0}}, +/* 34372 */ {(12<<2)|2,{65,100,0}}, +/* 34373 */ {(12<<2)|2,{65,100,0}}, +/* 34374 */ {(12<<2)|2,{65,100,0}}, +/* 34375 */ {(12<<2)|2,{65,100,0}}, +/* 34376 */ {(12<<2)|2,{65,100,0}}, +/* 34377 */ {(12<<2)|2,{65,100,0}}, +/* 34378 */ {(12<<2)|2,{65,100,0}}, +/* 34379 */ {(12<<2)|2,{65,100,0}}, +/* 34380 */ {(12<<2)|2,{65,100,0}}, +/* 34381 */ {(12<<2)|2,{65,100,0}}, +/* 34382 */ {(12<<2)|2,{65,100,0}}, +/* 34383 */ {(12<<2)|2,{65,100,0}}, +/* 34384 */ {(12<<2)|2,{65,102,0}}, +/* 34385 */ {(12<<2)|2,{65,102,0}}, +/* 34386 */ {(12<<2)|2,{65,102,0}}, +/* 34387 */ {(12<<2)|2,{65,102,0}}, +/* 34388 */ {(12<<2)|2,{65,102,0}}, +/* 34389 */ {(12<<2)|2,{65,102,0}}, +/* 34390 */ {(12<<2)|2,{65,102,0}}, +/* 34391 */ {(12<<2)|2,{65,102,0}}, +/* 34392 */ {(12<<2)|2,{65,102,0}}, +/* 34393 */ {(12<<2)|2,{65,102,0}}, +/* 34394 */ {(12<<2)|2,{65,102,0}}, +/* 34395 */ {(12<<2)|2,{65,102,0}}, +/* 34396 */ {(12<<2)|2,{65,102,0}}, +/* 34397 */ {(12<<2)|2,{65,102,0}}, +/* 34398 */ {(12<<2)|2,{65,102,0}}, +/* 34399 */ {(12<<2)|2,{65,102,0}}, +/* 34400 */ {(12<<2)|2,{65,103,0}}, +/* 34401 */ {(12<<2)|2,{65,103,0}}, +/* 34402 */ {(12<<2)|2,{65,103,0}}, +/* 34403 */ {(12<<2)|2,{65,103,0}}, +/* 34404 */ {(12<<2)|2,{65,103,0}}, +/* 34405 */ {(12<<2)|2,{65,103,0}}, +/* 34406 */ {(12<<2)|2,{65,103,0}}, +/* 34407 */ {(12<<2)|2,{65,103,0}}, +/* 34408 */ {(12<<2)|2,{65,103,0}}, +/* 34409 */ {(12<<2)|2,{65,103,0}}, +/* 34410 */ {(12<<2)|2,{65,103,0}}, +/* 34411 */ {(12<<2)|2,{65,103,0}}, +/* 34412 */ {(12<<2)|2,{65,103,0}}, +/* 34413 */ {(12<<2)|2,{65,103,0}}, +/* 34414 */ {(12<<2)|2,{65,103,0}}, +/* 34415 */ {(12<<2)|2,{65,103,0}}, +/* 34416 */ {(12<<2)|2,{65,104,0}}, +/* 34417 */ {(12<<2)|2,{65,104,0}}, +/* 34418 */ {(12<<2)|2,{65,104,0}}, +/* 34419 */ {(12<<2)|2,{65,104,0}}, +/* 34420 */ {(12<<2)|2,{65,104,0}}, +/* 34421 */ {(12<<2)|2,{65,104,0}}, +/* 34422 */ {(12<<2)|2,{65,104,0}}, +/* 34423 */ {(12<<2)|2,{65,104,0}}, +/* 34424 */ {(12<<2)|2,{65,104,0}}, +/* 34425 */ {(12<<2)|2,{65,104,0}}, +/* 34426 */ {(12<<2)|2,{65,104,0}}, +/* 34427 */ {(12<<2)|2,{65,104,0}}, +/* 34428 */ {(12<<2)|2,{65,104,0}}, +/* 34429 */ {(12<<2)|2,{65,104,0}}, +/* 34430 */ {(12<<2)|2,{65,104,0}}, +/* 34431 */ {(12<<2)|2,{65,104,0}}, +/* 34432 */ {(12<<2)|2,{65,108,0}}, +/* 34433 */ {(12<<2)|2,{65,108,0}}, +/* 34434 */ {(12<<2)|2,{65,108,0}}, +/* 34435 */ {(12<<2)|2,{65,108,0}}, +/* 34436 */ {(12<<2)|2,{65,108,0}}, +/* 34437 */ {(12<<2)|2,{65,108,0}}, +/* 34438 */ {(12<<2)|2,{65,108,0}}, +/* 34439 */ {(12<<2)|2,{65,108,0}}, +/* 34440 */ {(12<<2)|2,{65,108,0}}, +/* 34441 */ {(12<<2)|2,{65,108,0}}, +/* 34442 */ {(12<<2)|2,{65,108,0}}, +/* 34443 */ {(12<<2)|2,{65,108,0}}, +/* 34444 */ {(12<<2)|2,{65,108,0}}, +/* 34445 */ {(12<<2)|2,{65,108,0}}, +/* 34446 */ {(12<<2)|2,{65,108,0}}, +/* 34447 */ {(12<<2)|2,{65,108,0}}, +/* 34448 */ {(12<<2)|2,{65,109,0}}, +/* 34449 */ {(12<<2)|2,{65,109,0}}, +/* 34450 */ {(12<<2)|2,{65,109,0}}, +/* 34451 */ {(12<<2)|2,{65,109,0}}, +/* 34452 */ {(12<<2)|2,{65,109,0}}, +/* 34453 */ {(12<<2)|2,{65,109,0}}, +/* 34454 */ {(12<<2)|2,{65,109,0}}, +/* 34455 */ {(12<<2)|2,{65,109,0}}, +/* 34456 */ {(12<<2)|2,{65,109,0}}, +/* 34457 */ {(12<<2)|2,{65,109,0}}, +/* 34458 */ {(12<<2)|2,{65,109,0}}, +/* 34459 */ {(12<<2)|2,{65,109,0}}, +/* 34460 */ {(12<<2)|2,{65,109,0}}, +/* 34461 */ {(12<<2)|2,{65,109,0}}, +/* 34462 */ {(12<<2)|2,{65,109,0}}, +/* 34463 */ {(12<<2)|2,{65,109,0}}, +/* 34464 */ {(12<<2)|2,{65,110,0}}, +/* 34465 */ {(12<<2)|2,{65,110,0}}, +/* 34466 */ {(12<<2)|2,{65,110,0}}, +/* 34467 */ {(12<<2)|2,{65,110,0}}, +/* 34468 */ {(12<<2)|2,{65,110,0}}, +/* 34469 */ {(12<<2)|2,{65,110,0}}, +/* 34470 */ {(12<<2)|2,{65,110,0}}, +/* 34471 */ {(12<<2)|2,{65,110,0}}, +/* 34472 */ {(12<<2)|2,{65,110,0}}, +/* 34473 */ {(12<<2)|2,{65,110,0}}, +/* 34474 */ {(12<<2)|2,{65,110,0}}, +/* 34475 */ {(12<<2)|2,{65,110,0}}, +/* 34476 */ {(12<<2)|2,{65,110,0}}, +/* 34477 */ {(12<<2)|2,{65,110,0}}, +/* 34478 */ {(12<<2)|2,{65,110,0}}, +/* 34479 */ {(12<<2)|2,{65,110,0}}, +/* 34480 */ {(12<<2)|2,{65,112,0}}, +/* 34481 */ {(12<<2)|2,{65,112,0}}, +/* 34482 */ {(12<<2)|2,{65,112,0}}, +/* 34483 */ {(12<<2)|2,{65,112,0}}, +/* 34484 */ {(12<<2)|2,{65,112,0}}, +/* 34485 */ {(12<<2)|2,{65,112,0}}, +/* 34486 */ {(12<<2)|2,{65,112,0}}, +/* 34487 */ {(12<<2)|2,{65,112,0}}, +/* 34488 */ {(12<<2)|2,{65,112,0}}, +/* 34489 */ {(12<<2)|2,{65,112,0}}, +/* 34490 */ {(12<<2)|2,{65,112,0}}, +/* 34491 */ {(12<<2)|2,{65,112,0}}, +/* 34492 */ {(12<<2)|2,{65,112,0}}, +/* 34493 */ {(12<<2)|2,{65,112,0}}, +/* 34494 */ {(12<<2)|2,{65,112,0}}, +/* 34495 */ {(12<<2)|2,{65,112,0}}, +/* 34496 */ {(12<<2)|2,{65,114,0}}, +/* 34497 */ {(12<<2)|2,{65,114,0}}, +/* 34498 */ {(12<<2)|2,{65,114,0}}, +/* 34499 */ {(12<<2)|2,{65,114,0}}, +/* 34500 */ {(12<<2)|2,{65,114,0}}, +/* 34501 */ {(12<<2)|2,{65,114,0}}, +/* 34502 */ {(12<<2)|2,{65,114,0}}, +/* 34503 */ {(12<<2)|2,{65,114,0}}, +/* 34504 */ {(12<<2)|2,{65,114,0}}, +/* 34505 */ {(12<<2)|2,{65,114,0}}, +/* 34506 */ {(12<<2)|2,{65,114,0}}, +/* 34507 */ {(12<<2)|2,{65,114,0}}, +/* 34508 */ {(12<<2)|2,{65,114,0}}, +/* 34509 */ {(12<<2)|2,{65,114,0}}, +/* 34510 */ {(12<<2)|2,{65,114,0}}, +/* 34511 */ {(12<<2)|2,{65,114,0}}, +/* 34512 */ {(12<<2)|2,{65,117,0}}, +/* 34513 */ {(12<<2)|2,{65,117,0}}, +/* 34514 */ {(12<<2)|2,{65,117,0}}, +/* 34515 */ {(12<<2)|2,{65,117,0}}, +/* 34516 */ {(12<<2)|2,{65,117,0}}, +/* 34517 */ {(12<<2)|2,{65,117,0}}, +/* 34518 */ {(12<<2)|2,{65,117,0}}, +/* 34519 */ {(12<<2)|2,{65,117,0}}, +/* 34520 */ {(12<<2)|2,{65,117,0}}, +/* 34521 */ {(12<<2)|2,{65,117,0}}, +/* 34522 */ {(12<<2)|2,{65,117,0}}, +/* 34523 */ {(12<<2)|2,{65,117,0}}, +/* 34524 */ {(12<<2)|2,{65,117,0}}, +/* 34525 */ {(12<<2)|2,{65,117,0}}, +/* 34526 */ {(12<<2)|2,{65,117,0}}, +/* 34527 */ {(12<<2)|2,{65,117,0}}, +/* 34528 */ {(13<<2)|2,{65,58,0}}, +/* 34529 */ {(13<<2)|2,{65,58,0}}, +/* 34530 */ {(13<<2)|2,{65,58,0}}, +/* 34531 */ {(13<<2)|2,{65,58,0}}, +/* 34532 */ {(13<<2)|2,{65,58,0}}, +/* 34533 */ {(13<<2)|2,{65,58,0}}, +/* 34534 */ {(13<<2)|2,{65,58,0}}, +/* 34535 */ {(13<<2)|2,{65,58,0}}, +/* 34536 */ {(13<<2)|2,{65,66,0}}, +/* 34537 */ {(13<<2)|2,{65,66,0}}, +/* 34538 */ {(13<<2)|2,{65,66,0}}, +/* 34539 */ {(13<<2)|2,{65,66,0}}, +/* 34540 */ {(13<<2)|2,{65,66,0}}, +/* 34541 */ {(13<<2)|2,{65,66,0}}, +/* 34542 */ {(13<<2)|2,{65,66,0}}, +/* 34543 */ {(13<<2)|2,{65,66,0}}, +/* 34544 */ {(13<<2)|2,{65,67,0}}, +/* 34545 */ {(13<<2)|2,{65,67,0}}, +/* 34546 */ {(13<<2)|2,{65,67,0}}, +/* 34547 */ {(13<<2)|2,{65,67,0}}, +/* 34548 */ {(13<<2)|2,{65,67,0}}, +/* 34549 */ {(13<<2)|2,{65,67,0}}, +/* 34550 */ {(13<<2)|2,{65,67,0}}, +/* 34551 */ {(13<<2)|2,{65,67,0}}, +/* 34552 */ {(13<<2)|2,{65,68,0}}, +/* 34553 */ {(13<<2)|2,{65,68,0}}, +/* 34554 */ {(13<<2)|2,{65,68,0}}, +/* 34555 */ {(13<<2)|2,{65,68,0}}, +/* 34556 */ {(13<<2)|2,{65,68,0}}, +/* 34557 */ {(13<<2)|2,{65,68,0}}, +/* 34558 */ {(13<<2)|2,{65,68,0}}, +/* 34559 */ {(13<<2)|2,{65,68,0}}, +/* 34560 */ {(13<<2)|2,{65,69,0}}, +/* 34561 */ {(13<<2)|2,{65,69,0}}, +/* 34562 */ {(13<<2)|2,{65,69,0}}, +/* 34563 */ {(13<<2)|2,{65,69,0}}, +/* 34564 */ {(13<<2)|2,{65,69,0}}, +/* 34565 */ {(13<<2)|2,{65,69,0}}, +/* 34566 */ {(13<<2)|2,{65,69,0}}, +/* 34567 */ {(13<<2)|2,{65,69,0}}, +/* 34568 */ {(13<<2)|2,{65,70,0}}, +/* 34569 */ {(13<<2)|2,{65,70,0}}, +/* 34570 */ {(13<<2)|2,{65,70,0}}, +/* 34571 */ {(13<<2)|2,{65,70,0}}, +/* 34572 */ {(13<<2)|2,{65,70,0}}, +/* 34573 */ {(13<<2)|2,{65,70,0}}, +/* 34574 */ {(13<<2)|2,{65,70,0}}, +/* 34575 */ {(13<<2)|2,{65,70,0}}, +/* 34576 */ {(13<<2)|2,{65,71,0}}, +/* 34577 */ {(13<<2)|2,{65,71,0}}, +/* 34578 */ {(13<<2)|2,{65,71,0}}, +/* 34579 */ {(13<<2)|2,{65,71,0}}, +/* 34580 */ {(13<<2)|2,{65,71,0}}, +/* 34581 */ {(13<<2)|2,{65,71,0}}, +/* 34582 */ {(13<<2)|2,{65,71,0}}, +/* 34583 */ {(13<<2)|2,{65,71,0}}, +/* 34584 */ {(13<<2)|2,{65,72,0}}, +/* 34585 */ {(13<<2)|2,{65,72,0}}, +/* 34586 */ {(13<<2)|2,{65,72,0}}, +/* 34587 */ {(13<<2)|2,{65,72,0}}, +/* 34588 */ {(13<<2)|2,{65,72,0}}, +/* 34589 */ {(13<<2)|2,{65,72,0}}, +/* 34590 */ {(13<<2)|2,{65,72,0}}, +/* 34591 */ {(13<<2)|2,{65,72,0}}, +/* 34592 */ {(13<<2)|2,{65,73,0}}, +/* 34593 */ {(13<<2)|2,{65,73,0}}, +/* 34594 */ {(13<<2)|2,{65,73,0}}, +/* 34595 */ {(13<<2)|2,{65,73,0}}, +/* 34596 */ {(13<<2)|2,{65,73,0}}, +/* 34597 */ {(13<<2)|2,{65,73,0}}, +/* 34598 */ {(13<<2)|2,{65,73,0}}, +/* 34599 */ {(13<<2)|2,{65,73,0}}, +/* 34600 */ {(13<<2)|2,{65,74,0}}, +/* 34601 */ {(13<<2)|2,{65,74,0}}, +/* 34602 */ {(13<<2)|2,{65,74,0}}, +/* 34603 */ {(13<<2)|2,{65,74,0}}, +/* 34604 */ {(13<<2)|2,{65,74,0}}, +/* 34605 */ {(13<<2)|2,{65,74,0}}, +/* 34606 */ {(13<<2)|2,{65,74,0}}, +/* 34607 */ {(13<<2)|2,{65,74,0}}, +/* 34608 */ {(13<<2)|2,{65,75,0}}, +/* 34609 */ {(13<<2)|2,{65,75,0}}, +/* 34610 */ {(13<<2)|2,{65,75,0}}, +/* 34611 */ {(13<<2)|2,{65,75,0}}, +/* 34612 */ {(13<<2)|2,{65,75,0}}, +/* 34613 */ {(13<<2)|2,{65,75,0}}, +/* 34614 */ {(13<<2)|2,{65,75,0}}, +/* 34615 */ {(13<<2)|2,{65,75,0}}, +/* 34616 */ {(13<<2)|2,{65,76,0}}, +/* 34617 */ {(13<<2)|2,{65,76,0}}, +/* 34618 */ {(13<<2)|2,{65,76,0}}, +/* 34619 */ {(13<<2)|2,{65,76,0}}, +/* 34620 */ {(13<<2)|2,{65,76,0}}, +/* 34621 */ {(13<<2)|2,{65,76,0}}, +/* 34622 */ {(13<<2)|2,{65,76,0}}, +/* 34623 */ {(13<<2)|2,{65,76,0}}, +/* 34624 */ {(13<<2)|2,{65,77,0}}, +/* 34625 */ {(13<<2)|2,{65,77,0}}, +/* 34626 */ {(13<<2)|2,{65,77,0}}, +/* 34627 */ {(13<<2)|2,{65,77,0}}, +/* 34628 */ {(13<<2)|2,{65,77,0}}, +/* 34629 */ {(13<<2)|2,{65,77,0}}, +/* 34630 */ {(13<<2)|2,{65,77,0}}, +/* 34631 */ {(13<<2)|2,{65,77,0}}, +/* 34632 */ {(13<<2)|2,{65,78,0}}, +/* 34633 */ {(13<<2)|2,{65,78,0}}, +/* 34634 */ {(13<<2)|2,{65,78,0}}, +/* 34635 */ {(13<<2)|2,{65,78,0}}, +/* 34636 */ {(13<<2)|2,{65,78,0}}, +/* 34637 */ {(13<<2)|2,{65,78,0}}, +/* 34638 */ {(13<<2)|2,{65,78,0}}, +/* 34639 */ {(13<<2)|2,{65,78,0}}, +/* 34640 */ {(13<<2)|2,{65,79,0}}, +/* 34641 */ {(13<<2)|2,{65,79,0}}, +/* 34642 */ {(13<<2)|2,{65,79,0}}, +/* 34643 */ {(13<<2)|2,{65,79,0}}, +/* 34644 */ {(13<<2)|2,{65,79,0}}, +/* 34645 */ {(13<<2)|2,{65,79,0}}, +/* 34646 */ {(13<<2)|2,{65,79,0}}, +/* 34647 */ {(13<<2)|2,{65,79,0}}, +/* 34648 */ {(13<<2)|2,{65,80,0}}, +/* 34649 */ {(13<<2)|2,{65,80,0}}, +/* 34650 */ {(13<<2)|2,{65,80,0}}, +/* 34651 */ {(13<<2)|2,{65,80,0}}, +/* 34652 */ {(13<<2)|2,{65,80,0}}, +/* 34653 */ {(13<<2)|2,{65,80,0}}, +/* 34654 */ {(13<<2)|2,{65,80,0}}, +/* 34655 */ {(13<<2)|2,{65,80,0}}, +/* 34656 */ {(13<<2)|2,{65,81,0}}, +/* 34657 */ {(13<<2)|2,{65,81,0}}, +/* 34658 */ {(13<<2)|2,{65,81,0}}, +/* 34659 */ {(13<<2)|2,{65,81,0}}, +/* 34660 */ {(13<<2)|2,{65,81,0}}, +/* 34661 */ {(13<<2)|2,{65,81,0}}, +/* 34662 */ {(13<<2)|2,{65,81,0}}, +/* 34663 */ {(13<<2)|2,{65,81,0}}, +/* 34664 */ {(13<<2)|2,{65,82,0}}, +/* 34665 */ {(13<<2)|2,{65,82,0}}, +/* 34666 */ {(13<<2)|2,{65,82,0}}, +/* 34667 */ {(13<<2)|2,{65,82,0}}, +/* 34668 */ {(13<<2)|2,{65,82,0}}, +/* 34669 */ {(13<<2)|2,{65,82,0}}, +/* 34670 */ {(13<<2)|2,{65,82,0}}, +/* 34671 */ {(13<<2)|2,{65,82,0}}, +/* 34672 */ {(13<<2)|2,{65,83,0}}, +/* 34673 */ {(13<<2)|2,{65,83,0}}, +/* 34674 */ {(13<<2)|2,{65,83,0}}, +/* 34675 */ {(13<<2)|2,{65,83,0}}, +/* 34676 */ {(13<<2)|2,{65,83,0}}, +/* 34677 */ {(13<<2)|2,{65,83,0}}, +/* 34678 */ {(13<<2)|2,{65,83,0}}, +/* 34679 */ {(13<<2)|2,{65,83,0}}, +/* 34680 */ {(13<<2)|2,{65,84,0}}, +/* 34681 */ {(13<<2)|2,{65,84,0}}, +/* 34682 */ {(13<<2)|2,{65,84,0}}, +/* 34683 */ {(13<<2)|2,{65,84,0}}, +/* 34684 */ {(13<<2)|2,{65,84,0}}, +/* 34685 */ {(13<<2)|2,{65,84,0}}, +/* 34686 */ {(13<<2)|2,{65,84,0}}, +/* 34687 */ {(13<<2)|2,{65,84,0}}, +/* 34688 */ {(13<<2)|2,{65,85,0}}, +/* 34689 */ {(13<<2)|2,{65,85,0}}, +/* 34690 */ {(13<<2)|2,{65,85,0}}, +/* 34691 */ {(13<<2)|2,{65,85,0}}, +/* 34692 */ {(13<<2)|2,{65,85,0}}, +/* 34693 */ {(13<<2)|2,{65,85,0}}, +/* 34694 */ {(13<<2)|2,{65,85,0}}, +/* 34695 */ {(13<<2)|2,{65,85,0}}, +/* 34696 */ {(13<<2)|2,{65,86,0}}, +/* 34697 */ {(13<<2)|2,{65,86,0}}, +/* 34698 */ {(13<<2)|2,{65,86,0}}, +/* 34699 */ {(13<<2)|2,{65,86,0}}, +/* 34700 */ {(13<<2)|2,{65,86,0}}, +/* 34701 */ {(13<<2)|2,{65,86,0}}, +/* 34702 */ {(13<<2)|2,{65,86,0}}, +/* 34703 */ {(13<<2)|2,{65,86,0}}, +/* 34704 */ {(13<<2)|2,{65,87,0}}, +/* 34705 */ {(13<<2)|2,{65,87,0}}, +/* 34706 */ {(13<<2)|2,{65,87,0}}, +/* 34707 */ {(13<<2)|2,{65,87,0}}, +/* 34708 */ {(13<<2)|2,{65,87,0}}, +/* 34709 */ {(13<<2)|2,{65,87,0}}, +/* 34710 */ {(13<<2)|2,{65,87,0}}, +/* 34711 */ {(13<<2)|2,{65,87,0}}, +/* 34712 */ {(13<<2)|2,{65,89,0}}, +/* 34713 */ {(13<<2)|2,{65,89,0}}, +/* 34714 */ {(13<<2)|2,{65,89,0}}, +/* 34715 */ {(13<<2)|2,{65,89,0}}, +/* 34716 */ {(13<<2)|2,{65,89,0}}, +/* 34717 */ {(13<<2)|2,{65,89,0}}, +/* 34718 */ {(13<<2)|2,{65,89,0}}, +/* 34719 */ {(13<<2)|2,{65,89,0}}, +/* 34720 */ {(13<<2)|2,{65,106,0}}, +/* 34721 */ {(13<<2)|2,{65,106,0}}, +/* 34722 */ {(13<<2)|2,{65,106,0}}, +/* 34723 */ {(13<<2)|2,{65,106,0}}, +/* 34724 */ {(13<<2)|2,{65,106,0}}, +/* 34725 */ {(13<<2)|2,{65,106,0}}, +/* 34726 */ {(13<<2)|2,{65,106,0}}, +/* 34727 */ {(13<<2)|2,{65,106,0}}, +/* 34728 */ {(13<<2)|2,{65,107,0}}, +/* 34729 */ {(13<<2)|2,{65,107,0}}, +/* 34730 */ {(13<<2)|2,{65,107,0}}, +/* 34731 */ {(13<<2)|2,{65,107,0}}, +/* 34732 */ {(13<<2)|2,{65,107,0}}, +/* 34733 */ {(13<<2)|2,{65,107,0}}, +/* 34734 */ {(13<<2)|2,{65,107,0}}, +/* 34735 */ {(13<<2)|2,{65,107,0}}, +/* 34736 */ {(13<<2)|2,{65,113,0}}, +/* 34737 */ {(13<<2)|2,{65,113,0}}, +/* 34738 */ {(13<<2)|2,{65,113,0}}, +/* 34739 */ {(13<<2)|2,{65,113,0}}, +/* 34740 */ {(13<<2)|2,{65,113,0}}, +/* 34741 */ {(13<<2)|2,{65,113,0}}, +/* 34742 */ {(13<<2)|2,{65,113,0}}, +/* 34743 */ {(13<<2)|2,{65,113,0}}, +/* 34744 */ {(13<<2)|2,{65,118,0}}, +/* 34745 */ {(13<<2)|2,{65,118,0}}, +/* 34746 */ {(13<<2)|2,{65,118,0}}, +/* 34747 */ {(13<<2)|2,{65,118,0}}, +/* 34748 */ {(13<<2)|2,{65,118,0}}, +/* 34749 */ {(13<<2)|2,{65,118,0}}, +/* 34750 */ {(13<<2)|2,{65,118,0}}, +/* 34751 */ {(13<<2)|2,{65,118,0}}, +/* 34752 */ {(13<<2)|2,{65,119,0}}, +/* 34753 */ {(13<<2)|2,{65,119,0}}, +/* 34754 */ {(13<<2)|2,{65,119,0}}, +/* 34755 */ {(13<<2)|2,{65,119,0}}, +/* 34756 */ {(13<<2)|2,{65,119,0}}, +/* 34757 */ {(13<<2)|2,{65,119,0}}, +/* 34758 */ {(13<<2)|2,{65,119,0}}, +/* 34759 */ {(13<<2)|2,{65,119,0}}, +/* 34760 */ {(13<<2)|2,{65,120,0}}, +/* 34761 */ {(13<<2)|2,{65,120,0}}, +/* 34762 */ {(13<<2)|2,{65,120,0}}, +/* 34763 */ {(13<<2)|2,{65,120,0}}, +/* 34764 */ {(13<<2)|2,{65,120,0}}, +/* 34765 */ {(13<<2)|2,{65,120,0}}, +/* 34766 */ {(13<<2)|2,{65,120,0}}, +/* 34767 */ {(13<<2)|2,{65,120,0}}, +/* 34768 */ {(13<<2)|2,{65,121,0}}, +/* 34769 */ {(13<<2)|2,{65,121,0}}, +/* 34770 */ {(13<<2)|2,{65,121,0}}, +/* 34771 */ {(13<<2)|2,{65,121,0}}, +/* 34772 */ {(13<<2)|2,{65,121,0}}, +/* 34773 */ {(13<<2)|2,{65,121,0}}, +/* 34774 */ {(13<<2)|2,{65,121,0}}, +/* 34775 */ {(13<<2)|2,{65,121,0}}, +/* 34776 */ {(13<<2)|2,{65,122,0}}, +/* 34777 */ {(13<<2)|2,{65,122,0}}, +/* 34778 */ {(13<<2)|2,{65,122,0}}, +/* 34779 */ {(13<<2)|2,{65,122,0}}, +/* 34780 */ {(13<<2)|2,{65,122,0}}, +/* 34781 */ {(13<<2)|2,{65,122,0}}, +/* 34782 */ {(13<<2)|2,{65,122,0}}, +/* 34783 */ {(13<<2)|2,{65,122,0}}, +/* 34784 */ {(14<<2)|2,{65,38,0}}, +/* 34785 */ {(14<<2)|2,{65,38,0}}, +/* 34786 */ {(14<<2)|2,{65,38,0}}, +/* 34787 */ {(14<<2)|2,{65,38,0}}, +/* 34788 */ {(14<<2)|2,{65,42,0}}, +/* 34789 */ {(14<<2)|2,{65,42,0}}, +/* 34790 */ {(14<<2)|2,{65,42,0}}, +/* 34791 */ {(14<<2)|2,{65,42,0}}, +/* 34792 */ {(14<<2)|2,{65,44,0}}, +/* 34793 */ {(14<<2)|2,{65,44,0}}, +/* 34794 */ {(14<<2)|2,{65,44,0}}, +/* 34795 */ {(14<<2)|2,{65,44,0}}, +/* 34796 */ {(14<<2)|2,{65,59,0}}, +/* 34797 */ {(14<<2)|2,{65,59,0}}, +/* 34798 */ {(14<<2)|2,{65,59,0}}, +/* 34799 */ {(14<<2)|2,{65,59,0}}, +/* 34800 */ {(14<<2)|2,{65,88,0}}, +/* 34801 */ {(14<<2)|2,{65,88,0}}, +/* 34802 */ {(14<<2)|2,{65,88,0}}, +/* 34803 */ {(14<<2)|2,{65,88,0}}, +/* 34804 */ {(14<<2)|2,{65,90,0}}, +/* 34805 */ {(14<<2)|2,{65,90,0}}, +/* 34806 */ {(14<<2)|2,{65,90,0}}, +/* 34807 */ {(14<<2)|2,{65,90,0}}, +/* 34808 */ {(16<<2)|2,{65,33,0}}, +/* 34809 */ {(16<<2)|2,{65,34,0}}, +/* 34810 */ {(16<<2)|2,{65,40,0}}, +/* 34811 */ {(16<<2)|2,{65,41,0}}, +/* 34812 */ {(16<<2)|2,{65,63,0}}, +/* 34813 */ {(6<<2)|1,{65,0,0}}, +/* 34814 */ {(6<<2)|1,{65,0,0}}, +/* 34815 */ {(6<<2)|1,{65,0,0}}, +/* 34816 */ {(16<<2)|3,{95,48,48}}, +/* 34817 */ {(16<<2)|3,{95,48,49}}, +/* 34818 */ {(16<<2)|3,{95,48,50}}, +/* 34819 */ {(16<<2)|3,{95,48,97}}, +/* 34820 */ {(16<<2)|3,{95,48,99}}, +/* 34821 */ {(16<<2)|3,{95,48,101}}, +/* 34822 */ {(16<<2)|3,{95,48,105}}, +/* 34823 */ {(16<<2)|3,{95,48,111}}, +/* 34824 */ {(16<<2)|3,{95,48,115}}, +/* 34825 */ {(16<<2)|3,{95,48,116}}, +/* 34826 */ {(11<<2)|2,{95,48,0}}, +/* 34827 */ {(11<<2)|2,{95,48,0}}, +/* 34828 */ {(11<<2)|2,{95,48,0}}, +/* 34829 */ {(11<<2)|2,{95,48,0}}, +/* 34830 */ {(11<<2)|2,{95,48,0}}, +/* 34831 */ {(11<<2)|2,{95,48,0}}, +/* 34832 */ {(11<<2)|2,{95,48,0}}, +/* 34833 */ {(11<<2)|2,{95,48,0}}, +/* 34834 */ {(11<<2)|2,{95,48,0}}, +/* 34835 */ {(11<<2)|2,{95,48,0}}, +/* 34836 */ {(11<<2)|2,{95,48,0}}, +/* 34837 */ {(11<<2)|2,{95,48,0}}, +/* 34838 */ {(11<<2)|2,{95,48,0}}, +/* 34839 */ {(11<<2)|2,{95,48,0}}, +/* 34840 */ {(11<<2)|2,{95,48,0}}, +/* 34841 */ {(11<<2)|2,{95,48,0}}, +/* 34842 */ {(11<<2)|2,{95,48,0}}, +/* 34843 */ {(11<<2)|2,{95,48,0}}, +/* 34844 */ {(11<<2)|2,{95,48,0}}, +/* 34845 */ {(11<<2)|2,{95,48,0}}, +/* 34846 */ {(11<<2)|2,{95,48,0}}, +/* 34847 */ {(11<<2)|2,{95,48,0}}, +/* 34848 */ {(16<<2)|3,{95,49,48}}, +/* 34849 */ {(16<<2)|3,{95,49,49}}, +/* 34850 */ {(16<<2)|3,{95,49,50}}, +/* 34851 */ {(16<<2)|3,{95,49,97}}, +/* 34852 */ {(16<<2)|3,{95,49,99}}, +/* 34853 */ {(16<<2)|3,{95,49,101}}, +/* 34854 */ {(16<<2)|3,{95,49,105}}, +/* 34855 */ {(16<<2)|3,{95,49,111}}, +/* 34856 */ {(16<<2)|3,{95,49,115}}, +/* 34857 */ {(16<<2)|3,{95,49,116}}, +/* 34858 */ {(11<<2)|2,{95,49,0}}, +/* 34859 */ {(11<<2)|2,{95,49,0}}, +/* 34860 */ {(11<<2)|2,{95,49,0}}, +/* 34861 */ {(11<<2)|2,{95,49,0}}, +/* 34862 */ {(11<<2)|2,{95,49,0}}, +/* 34863 */ {(11<<2)|2,{95,49,0}}, +/* 34864 */ {(11<<2)|2,{95,49,0}}, +/* 34865 */ {(11<<2)|2,{95,49,0}}, +/* 34866 */ {(11<<2)|2,{95,49,0}}, +/* 34867 */ {(11<<2)|2,{95,49,0}}, +/* 34868 */ {(11<<2)|2,{95,49,0}}, +/* 34869 */ {(11<<2)|2,{95,49,0}}, +/* 34870 */ {(11<<2)|2,{95,49,0}}, +/* 34871 */ {(11<<2)|2,{95,49,0}}, +/* 34872 */ {(11<<2)|2,{95,49,0}}, +/* 34873 */ {(11<<2)|2,{95,49,0}}, +/* 34874 */ {(11<<2)|2,{95,49,0}}, +/* 34875 */ {(11<<2)|2,{95,49,0}}, +/* 34876 */ {(11<<2)|2,{95,49,0}}, +/* 34877 */ {(11<<2)|2,{95,49,0}}, +/* 34878 */ {(11<<2)|2,{95,49,0}}, +/* 34879 */ {(11<<2)|2,{95,49,0}}, +/* 34880 */ {(16<<2)|3,{95,50,48}}, +/* 34881 */ {(16<<2)|3,{95,50,49}}, +/* 34882 */ {(16<<2)|3,{95,50,50}}, +/* 34883 */ {(16<<2)|3,{95,50,97}}, +/* 34884 */ {(16<<2)|3,{95,50,99}}, +/* 34885 */ {(16<<2)|3,{95,50,101}}, +/* 34886 */ {(16<<2)|3,{95,50,105}}, +/* 34887 */ {(16<<2)|3,{95,50,111}}, +/* 34888 */ {(16<<2)|3,{95,50,115}}, +/* 34889 */ {(16<<2)|3,{95,50,116}}, +/* 34890 */ {(11<<2)|2,{95,50,0}}, +/* 34891 */ {(11<<2)|2,{95,50,0}}, +/* 34892 */ {(11<<2)|2,{95,50,0}}, +/* 34893 */ {(11<<2)|2,{95,50,0}}, +/* 34894 */ {(11<<2)|2,{95,50,0}}, +/* 34895 */ {(11<<2)|2,{95,50,0}}, +/* 34896 */ {(11<<2)|2,{95,50,0}}, +/* 34897 */ {(11<<2)|2,{95,50,0}}, +/* 34898 */ {(11<<2)|2,{95,50,0}}, +/* 34899 */ {(11<<2)|2,{95,50,0}}, +/* 34900 */ {(11<<2)|2,{95,50,0}}, +/* 34901 */ {(11<<2)|2,{95,50,0}}, +/* 34902 */ {(11<<2)|2,{95,50,0}}, +/* 34903 */ {(11<<2)|2,{95,50,0}}, +/* 34904 */ {(11<<2)|2,{95,50,0}}, +/* 34905 */ {(11<<2)|2,{95,50,0}}, +/* 34906 */ {(11<<2)|2,{95,50,0}}, +/* 34907 */ {(11<<2)|2,{95,50,0}}, +/* 34908 */ {(11<<2)|2,{95,50,0}}, +/* 34909 */ {(11<<2)|2,{95,50,0}}, +/* 34910 */ {(11<<2)|2,{95,50,0}}, +/* 34911 */ {(11<<2)|2,{95,50,0}}, +/* 34912 */ {(16<<2)|3,{95,97,48}}, +/* 34913 */ {(16<<2)|3,{95,97,49}}, +/* 34914 */ {(16<<2)|3,{95,97,50}}, +/* 34915 */ {(16<<2)|3,{95,97,97}}, +/* 34916 */ {(16<<2)|3,{95,97,99}}, +/* 34917 */ {(16<<2)|3,{95,97,101}}, +/* 34918 */ {(16<<2)|3,{95,97,105}}, +/* 34919 */ {(16<<2)|3,{95,97,111}}, +/* 34920 */ {(16<<2)|3,{95,97,115}}, +/* 34921 */ {(16<<2)|3,{95,97,116}}, +/* 34922 */ {(11<<2)|2,{95,97,0}}, +/* 34923 */ {(11<<2)|2,{95,97,0}}, +/* 34924 */ {(11<<2)|2,{95,97,0}}, +/* 34925 */ {(11<<2)|2,{95,97,0}}, +/* 34926 */ {(11<<2)|2,{95,97,0}}, +/* 34927 */ {(11<<2)|2,{95,97,0}}, +/* 34928 */ {(11<<2)|2,{95,97,0}}, +/* 34929 */ {(11<<2)|2,{95,97,0}}, +/* 34930 */ {(11<<2)|2,{95,97,0}}, +/* 34931 */ {(11<<2)|2,{95,97,0}}, +/* 34932 */ {(11<<2)|2,{95,97,0}}, +/* 34933 */ {(11<<2)|2,{95,97,0}}, +/* 34934 */ {(11<<2)|2,{95,97,0}}, +/* 34935 */ {(11<<2)|2,{95,97,0}}, +/* 34936 */ {(11<<2)|2,{95,97,0}}, +/* 34937 */ {(11<<2)|2,{95,97,0}}, +/* 34938 */ {(11<<2)|2,{95,97,0}}, +/* 34939 */ {(11<<2)|2,{95,97,0}}, +/* 34940 */ {(11<<2)|2,{95,97,0}}, +/* 34941 */ {(11<<2)|2,{95,97,0}}, +/* 34942 */ {(11<<2)|2,{95,97,0}}, +/* 34943 */ {(11<<2)|2,{95,97,0}}, +/* 34944 */ {(16<<2)|3,{95,99,48}}, +/* 34945 */ {(16<<2)|3,{95,99,49}}, +/* 34946 */ {(16<<2)|3,{95,99,50}}, +/* 34947 */ {(16<<2)|3,{95,99,97}}, +/* 34948 */ {(16<<2)|3,{95,99,99}}, +/* 34949 */ {(16<<2)|3,{95,99,101}}, +/* 34950 */ {(16<<2)|3,{95,99,105}}, +/* 34951 */ {(16<<2)|3,{95,99,111}}, +/* 34952 */ {(16<<2)|3,{95,99,115}}, +/* 34953 */ {(16<<2)|3,{95,99,116}}, +/* 34954 */ {(11<<2)|2,{95,99,0}}, +/* 34955 */ {(11<<2)|2,{95,99,0}}, +/* 34956 */ {(11<<2)|2,{95,99,0}}, +/* 34957 */ {(11<<2)|2,{95,99,0}}, +/* 34958 */ {(11<<2)|2,{95,99,0}}, +/* 34959 */ {(11<<2)|2,{95,99,0}}, +/* 34960 */ {(11<<2)|2,{95,99,0}}, +/* 34961 */ {(11<<2)|2,{95,99,0}}, +/* 34962 */ {(11<<2)|2,{95,99,0}}, +/* 34963 */ {(11<<2)|2,{95,99,0}}, +/* 34964 */ {(11<<2)|2,{95,99,0}}, +/* 34965 */ {(11<<2)|2,{95,99,0}}, +/* 34966 */ {(11<<2)|2,{95,99,0}}, +/* 34967 */ {(11<<2)|2,{95,99,0}}, +/* 34968 */ {(11<<2)|2,{95,99,0}}, +/* 34969 */ {(11<<2)|2,{95,99,0}}, +/* 34970 */ {(11<<2)|2,{95,99,0}}, +/* 34971 */ {(11<<2)|2,{95,99,0}}, +/* 34972 */ {(11<<2)|2,{95,99,0}}, +/* 34973 */ {(11<<2)|2,{95,99,0}}, +/* 34974 */ {(11<<2)|2,{95,99,0}}, +/* 34975 */ {(11<<2)|2,{95,99,0}}, +/* 34976 */ {(16<<2)|3,{95,101,48}}, +/* 34977 */ {(16<<2)|3,{95,101,49}}, +/* 34978 */ {(16<<2)|3,{95,101,50}}, +/* 34979 */ {(16<<2)|3,{95,101,97}}, +/* 34980 */ {(16<<2)|3,{95,101,99}}, +/* 34981 */ {(16<<2)|3,{95,101,101}}, +/* 34982 */ {(16<<2)|3,{95,101,105}}, +/* 34983 */ {(16<<2)|3,{95,101,111}}, +/* 34984 */ {(16<<2)|3,{95,101,115}}, +/* 34985 */ {(16<<2)|3,{95,101,116}}, +/* 34986 */ {(11<<2)|2,{95,101,0}}, +/* 34987 */ {(11<<2)|2,{95,101,0}}, +/* 34988 */ {(11<<2)|2,{95,101,0}}, +/* 34989 */ {(11<<2)|2,{95,101,0}}, +/* 34990 */ {(11<<2)|2,{95,101,0}}, +/* 34991 */ {(11<<2)|2,{95,101,0}}, +/* 34992 */ {(11<<2)|2,{95,101,0}}, +/* 34993 */ {(11<<2)|2,{95,101,0}}, +/* 34994 */ {(11<<2)|2,{95,101,0}}, +/* 34995 */ {(11<<2)|2,{95,101,0}}, +/* 34996 */ {(11<<2)|2,{95,101,0}}, +/* 34997 */ {(11<<2)|2,{95,101,0}}, +/* 34998 */ {(11<<2)|2,{95,101,0}}, +/* 34999 */ {(11<<2)|2,{95,101,0}}, +/* 35000 */ {(11<<2)|2,{95,101,0}}, +/* 35001 */ {(11<<2)|2,{95,101,0}}, +/* 35002 */ {(11<<2)|2,{95,101,0}}, +/* 35003 */ {(11<<2)|2,{95,101,0}}, +/* 35004 */ {(11<<2)|2,{95,101,0}}, +/* 35005 */ {(11<<2)|2,{95,101,0}}, +/* 35006 */ {(11<<2)|2,{95,101,0}}, +/* 35007 */ {(11<<2)|2,{95,101,0}}, +/* 35008 */ {(16<<2)|3,{95,105,48}}, +/* 35009 */ {(16<<2)|3,{95,105,49}}, +/* 35010 */ {(16<<2)|3,{95,105,50}}, +/* 35011 */ {(16<<2)|3,{95,105,97}}, +/* 35012 */ {(16<<2)|3,{95,105,99}}, +/* 35013 */ {(16<<2)|3,{95,105,101}}, +/* 35014 */ {(16<<2)|3,{95,105,105}}, +/* 35015 */ {(16<<2)|3,{95,105,111}}, +/* 35016 */ {(16<<2)|3,{95,105,115}}, +/* 35017 */ {(16<<2)|3,{95,105,116}}, +/* 35018 */ {(11<<2)|2,{95,105,0}}, +/* 35019 */ {(11<<2)|2,{95,105,0}}, +/* 35020 */ {(11<<2)|2,{95,105,0}}, +/* 35021 */ {(11<<2)|2,{95,105,0}}, +/* 35022 */ {(11<<2)|2,{95,105,0}}, +/* 35023 */ {(11<<2)|2,{95,105,0}}, +/* 35024 */ {(11<<2)|2,{95,105,0}}, +/* 35025 */ {(11<<2)|2,{95,105,0}}, +/* 35026 */ {(11<<2)|2,{95,105,0}}, +/* 35027 */ {(11<<2)|2,{95,105,0}}, +/* 35028 */ {(11<<2)|2,{95,105,0}}, +/* 35029 */ {(11<<2)|2,{95,105,0}}, +/* 35030 */ {(11<<2)|2,{95,105,0}}, +/* 35031 */ {(11<<2)|2,{95,105,0}}, +/* 35032 */ {(11<<2)|2,{95,105,0}}, +/* 35033 */ {(11<<2)|2,{95,105,0}}, +/* 35034 */ {(11<<2)|2,{95,105,0}}, +/* 35035 */ {(11<<2)|2,{95,105,0}}, +/* 35036 */ {(11<<2)|2,{95,105,0}}, +/* 35037 */ {(11<<2)|2,{95,105,0}}, +/* 35038 */ {(11<<2)|2,{95,105,0}}, +/* 35039 */ {(11<<2)|2,{95,105,0}}, +/* 35040 */ {(16<<2)|3,{95,111,48}}, +/* 35041 */ {(16<<2)|3,{95,111,49}}, +/* 35042 */ {(16<<2)|3,{95,111,50}}, +/* 35043 */ {(16<<2)|3,{95,111,97}}, +/* 35044 */ {(16<<2)|3,{95,111,99}}, +/* 35045 */ {(16<<2)|3,{95,111,101}}, +/* 35046 */ {(16<<2)|3,{95,111,105}}, +/* 35047 */ {(16<<2)|3,{95,111,111}}, +/* 35048 */ {(16<<2)|3,{95,111,115}}, +/* 35049 */ {(16<<2)|3,{95,111,116}}, +/* 35050 */ {(11<<2)|2,{95,111,0}}, +/* 35051 */ {(11<<2)|2,{95,111,0}}, +/* 35052 */ {(11<<2)|2,{95,111,0}}, +/* 35053 */ {(11<<2)|2,{95,111,0}}, +/* 35054 */ {(11<<2)|2,{95,111,0}}, +/* 35055 */ {(11<<2)|2,{95,111,0}}, +/* 35056 */ {(11<<2)|2,{95,111,0}}, +/* 35057 */ {(11<<2)|2,{95,111,0}}, +/* 35058 */ {(11<<2)|2,{95,111,0}}, +/* 35059 */ {(11<<2)|2,{95,111,0}}, +/* 35060 */ {(11<<2)|2,{95,111,0}}, +/* 35061 */ {(11<<2)|2,{95,111,0}}, +/* 35062 */ {(11<<2)|2,{95,111,0}}, +/* 35063 */ {(11<<2)|2,{95,111,0}}, +/* 35064 */ {(11<<2)|2,{95,111,0}}, +/* 35065 */ {(11<<2)|2,{95,111,0}}, +/* 35066 */ {(11<<2)|2,{95,111,0}}, +/* 35067 */ {(11<<2)|2,{95,111,0}}, +/* 35068 */ {(11<<2)|2,{95,111,0}}, +/* 35069 */ {(11<<2)|2,{95,111,0}}, +/* 35070 */ {(11<<2)|2,{95,111,0}}, +/* 35071 */ {(11<<2)|2,{95,111,0}}, +/* 35072 */ {(16<<2)|3,{95,115,48}}, +/* 35073 */ {(16<<2)|3,{95,115,49}}, +/* 35074 */ {(16<<2)|3,{95,115,50}}, +/* 35075 */ {(16<<2)|3,{95,115,97}}, +/* 35076 */ {(16<<2)|3,{95,115,99}}, +/* 35077 */ {(16<<2)|3,{95,115,101}}, +/* 35078 */ {(16<<2)|3,{95,115,105}}, +/* 35079 */ {(16<<2)|3,{95,115,111}}, +/* 35080 */ {(16<<2)|3,{95,115,115}}, +/* 35081 */ {(16<<2)|3,{95,115,116}}, +/* 35082 */ {(11<<2)|2,{95,115,0}}, +/* 35083 */ {(11<<2)|2,{95,115,0}}, +/* 35084 */ {(11<<2)|2,{95,115,0}}, +/* 35085 */ {(11<<2)|2,{95,115,0}}, +/* 35086 */ {(11<<2)|2,{95,115,0}}, +/* 35087 */ {(11<<2)|2,{95,115,0}}, +/* 35088 */ {(11<<2)|2,{95,115,0}}, +/* 35089 */ {(11<<2)|2,{95,115,0}}, +/* 35090 */ {(11<<2)|2,{95,115,0}}, +/* 35091 */ {(11<<2)|2,{95,115,0}}, +/* 35092 */ {(11<<2)|2,{95,115,0}}, +/* 35093 */ {(11<<2)|2,{95,115,0}}, +/* 35094 */ {(11<<2)|2,{95,115,0}}, +/* 35095 */ {(11<<2)|2,{95,115,0}}, +/* 35096 */ {(11<<2)|2,{95,115,0}}, +/* 35097 */ {(11<<2)|2,{95,115,0}}, +/* 35098 */ {(11<<2)|2,{95,115,0}}, +/* 35099 */ {(11<<2)|2,{95,115,0}}, +/* 35100 */ {(11<<2)|2,{95,115,0}}, +/* 35101 */ {(11<<2)|2,{95,115,0}}, +/* 35102 */ {(11<<2)|2,{95,115,0}}, +/* 35103 */ {(11<<2)|2,{95,115,0}}, +/* 35104 */ {(16<<2)|3,{95,116,48}}, +/* 35105 */ {(16<<2)|3,{95,116,49}}, +/* 35106 */ {(16<<2)|3,{95,116,50}}, +/* 35107 */ {(16<<2)|3,{95,116,97}}, +/* 35108 */ {(16<<2)|3,{95,116,99}}, +/* 35109 */ {(16<<2)|3,{95,116,101}}, +/* 35110 */ {(16<<2)|3,{95,116,105}}, +/* 35111 */ {(16<<2)|3,{95,116,111}}, +/* 35112 */ {(16<<2)|3,{95,116,115}}, +/* 35113 */ {(16<<2)|3,{95,116,116}}, +/* 35114 */ {(11<<2)|2,{95,116,0}}, +/* 35115 */ {(11<<2)|2,{95,116,0}}, +/* 35116 */ {(11<<2)|2,{95,116,0}}, +/* 35117 */ {(11<<2)|2,{95,116,0}}, +/* 35118 */ {(11<<2)|2,{95,116,0}}, +/* 35119 */ {(11<<2)|2,{95,116,0}}, +/* 35120 */ {(11<<2)|2,{95,116,0}}, +/* 35121 */ {(11<<2)|2,{95,116,0}}, +/* 35122 */ {(11<<2)|2,{95,116,0}}, +/* 35123 */ {(11<<2)|2,{95,116,0}}, +/* 35124 */ {(11<<2)|2,{95,116,0}}, +/* 35125 */ {(11<<2)|2,{95,116,0}}, +/* 35126 */ {(11<<2)|2,{95,116,0}}, +/* 35127 */ {(11<<2)|2,{95,116,0}}, +/* 35128 */ {(11<<2)|2,{95,116,0}}, +/* 35129 */ {(11<<2)|2,{95,116,0}}, +/* 35130 */ {(11<<2)|2,{95,116,0}}, +/* 35131 */ {(11<<2)|2,{95,116,0}}, +/* 35132 */ {(11<<2)|2,{95,116,0}}, +/* 35133 */ {(11<<2)|2,{95,116,0}}, +/* 35134 */ {(11<<2)|2,{95,116,0}}, +/* 35135 */ {(11<<2)|2,{95,116,0}}, +/* 35136 */ {(12<<2)|2,{95,32,0}}, +/* 35137 */ {(12<<2)|2,{95,32,0}}, +/* 35138 */ {(12<<2)|2,{95,32,0}}, +/* 35139 */ {(12<<2)|2,{95,32,0}}, +/* 35140 */ {(12<<2)|2,{95,32,0}}, +/* 35141 */ {(12<<2)|2,{95,32,0}}, +/* 35142 */ {(12<<2)|2,{95,32,0}}, +/* 35143 */ {(12<<2)|2,{95,32,0}}, +/* 35144 */ {(12<<2)|2,{95,32,0}}, +/* 35145 */ {(12<<2)|2,{95,32,0}}, +/* 35146 */ {(12<<2)|2,{95,32,0}}, +/* 35147 */ {(12<<2)|2,{95,32,0}}, +/* 35148 */ {(12<<2)|2,{95,32,0}}, +/* 35149 */ {(12<<2)|2,{95,32,0}}, +/* 35150 */ {(12<<2)|2,{95,32,0}}, +/* 35151 */ {(12<<2)|2,{95,32,0}}, +/* 35152 */ {(12<<2)|2,{95,37,0}}, +/* 35153 */ {(12<<2)|2,{95,37,0}}, +/* 35154 */ {(12<<2)|2,{95,37,0}}, +/* 35155 */ {(12<<2)|2,{95,37,0}}, +/* 35156 */ {(12<<2)|2,{95,37,0}}, +/* 35157 */ {(12<<2)|2,{95,37,0}}, +/* 35158 */ {(12<<2)|2,{95,37,0}}, +/* 35159 */ {(12<<2)|2,{95,37,0}}, +/* 35160 */ {(12<<2)|2,{95,37,0}}, +/* 35161 */ {(12<<2)|2,{95,37,0}}, +/* 35162 */ {(12<<2)|2,{95,37,0}}, +/* 35163 */ {(12<<2)|2,{95,37,0}}, +/* 35164 */ {(12<<2)|2,{95,37,0}}, +/* 35165 */ {(12<<2)|2,{95,37,0}}, +/* 35166 */ {(12<<2)|2,{95,37,0}}, +/* 35167 */ {(12<<2)|2,{95,37,0}}, +/* 35168 */ {(12<<2)|2,{95,45,0}}, +/* 35169 */ {(12<<2)|2,{95,45,0}}, +/* 35170 */ {(12<<2)|2,{95,45,0}}, +/* 35171 */ {(12<<2)|2,{95,45,0}}, +/* 35172 */ {(12<<2)|2,{95,45,0}}, +/* 35173 */ {(12<<2)|2,{95,45,0}}, +/* 35174 */ {(12<<2)|2,{95,45,0}}, +/* 35175 */ {(12<<2)|2,{95,45,0}}, +/* 35176 */ {(12<<2)|2,{95,45,0}}, +/* 35177 */ {(12<<2)|2,{95,45,0}}, +/* 35178 */ {(12<<2)|2,{95,45,0}}, +/* 35179 */ {(12<<2)|2,{95,45,0}}, +/* 35180 */ {(12<<2)|2,{95,45,0}}, +/* 35181 */ {(12<<2)|2,{95,45,0}}, +/* 35182 */ {(12<<2)|2,{95,45,0}}, +/* 35183 */ {(12<<2)|2,{95,45,0}}, +/* 35184 */ {(12<<2)|2,{95,46,0}}, +/* 35185 */ {(12<<2)|2,{95,46,0}}, +/* 35186 */ {(12<<2)|2,{95,46,0}}, +/* 35187 */ {(12<<2)|2,{95,46,0}}, +/* 35188 */ {(12<<2)|2,{95,46,0}}, +/* 35189 */ {(12<<2)|2,{95,46,0}}, +/* 35190 */ {(12<<2)|2,{95,46,0}}, +/* 35191 */ {(12<<2)|2,{95,46,0}}, +/* 35192 */ {(12<<2)|2,{95,46,0}}, +/* 35193 */ {(12<<2)|2,{95,46,0}}, +/* 35194 */ {(12<<2)|2,{95,46,0}}, +/* 35195 */ {(12<<2)|2,{95,46,0}}, +/* 35196 */ {(12<<2)|2,{95,46,0}}, +/* 35197 */ {(12<<2)|2,{95,46,0}}, +/* 35198 */ {(12<<2)|2,{95,46,0}}, +/* 35199 */ {(12<<2)|2,{95,46,0}}, +/* 35200 */ {(12<<2)|2,{95,47,0}}, +/* 35201 */ {(12<<2)|2,{95,47,0}}, +/* 35202 */ {(12<<2)|2,{95,47,0}}, +/* 35203 */ {(12<<2)|2,{95,47,0}}, +/* 35204 */ {(12<<2)|2,{95,47,0}}, +/* 35205 */ {(12<<2)|2,{95,47,0}}, +/* 35206 */ {(12<<2)|2,{95,47,0}}, +/* 35207 */ {(12<<2)|2,{95,47,0}}, +/* 35208 */ {(12<<2)|2,{95,47,0}}, +/* 35209 */ {(12<<2)|2,{95,47,0}}, +/* 35210 */ {(12<<2)|2,{95,47,0}}, +/* 35211 */ {(12<<2)|2,{95,47,0}}, +/* 35212 */ {(12<<2)|2,{95,47,0}}, +/* 35213 */ {(12<<2)|2,{95,47,0}}, +/* 35214 */ {(12<<2)|2,{95,47,0}}, +/* 35215 */ {(12<<2)|2,{95,47,0}}, +/* 35216 */ {(12<<2)|2,{95,51,0}}, +/* 35217 */ {(12<<2)|2,{95,51,0}}, +/* 35218 */ {(12<<2)|2,{95,51,0}}, +/* 35219 */ {(12<<2)|2,{95,51,0}}, +/* 35220 */ {(12<<2)|2,{95,51,0}}, +/* 35221 */ {(12<<2)|2,{95,51,0}}, +/* 35222 */ {(12<<2)|2,{95,51,0}}, +/* 35223 */ {(12<<2)|2,{95,51,0}}, +/* 35224 */ {(12<<2)|2,{95,51,0}}, +/* 35225 */ {(12<<2)|2,{95,51,0}}, +/* 35226 */ {(12<<2)|2,{95,51,0}}, +/* 35227 */ {(12<<2)|2,{95,51,0}}, +/* 35228 */ {(12<<2)|2,{95,51,0}}, +/* 35229 */ {(12<<2)|2,{95,51,0}}, +/* 35230 */ {(12<<2)|2,{95,51,0}}, +/* 35231 */ {(12<<2)|2,{95,51,0}}, +/* 35232 */ {(12<<2)|2,{95,52,0}}, +/* 35233 */ {(12<<2)|2,{95,52,0}}, +/* 35234 */ {(12<<2)|2,{95,52,0}}, +/* 35235 */ {(12<<2)|2,{95,52,0}}, +/* 35236 */ {(12<<2)|2,{95,52,0}}, +/* 35237 */ {(12<<2)|2,{95,52,0}}, +/* 35238 */ {(12<<2)|2,{95,52,0}}, +/* 35239 */ {(12<<2)|2,{95,52,0}}, +/* 35240 */ {(12<<2)|2,{95,52,0}}, +/* 35241 */ {(12<<2)|2,{95,52,0}}, +/* 35242 */ {(12<<2)|2,{95,52,0}}, +/* 35243 */ {(12<<2)|2,{95,52,0}}, +/* 35244 */ {(12<<2)|2,{95,52,0}}, +/* 35245 */ {(12<<2)|2,{95,52,0}}, +/* 35246 */ {(12<<2)|2,{95,52,0}}, +/* 35247 */ {(12<<2)|2,{95,52,0}}, +/* 35248 */ {(12<<2)|2,{95,53,0}}, +/* 35249 */ {(12<<2)|2,{95,53,0}}, +/* 35250 */ {(12<<2)|2,{95,53,0}}, +/* 35251 */ {(12<<2)|2,{95,53,0}}, +/* 35252 */ {(12<<2)|2,{95,53,0}}, +/* 35253 */ {(12<<2)|2,{95,53,0}}, +/* 35254 */ {(12<<2)|2,{95,53,0}}, +/* 35255 */ {(12<<2)|2,{95,53,0}}, +/* 35256 */ {(12<<2)|2,{95,53,0}}, +/* 35257 */ {(12<<2)|2,{95,53,0}}, +/* 35258 */ {(12<<2)|2,{95,53,0}}, +/* 35259 */ {(12<<2)|2,{95,53,0}}, +/* 35260 */ {(12<<2)|2,{95,53,0}}, +/* 35261 */ {(12<<2)|2,{95,53,0}}, +/* 35262 */ {(12<<2)|2,{95,53,0}}, +/* 35263 */ {(12<<2)|2,{95,53,0}}, +/* 35264 */ {(12<<2)|2,{95,54,0}}, +/* 35265 */ {(12<<2)|2,{95,54,0}}, +/* 35266 */ {(12<<2)|2,{95,54,0}}, +/* 35267 */ {(12<<2)|2,{95,54,0}}, +/* 35268 */ {(12<<2)|2,{95,54,0}}, +/* 35269 */ {(12<<2)|2,{95,54,0}}, +/* 35270 */ {(12<<2)|2,{95,54,0}}, +/* 35271 */ {(12<<2)|2,{95,54,0}}, +/* 35272 */ {(12<<2)|2,{95,54,0}}, +/* 35273 */ {(12<<2)|2,{95,54,0}}, +/* 35274 */ {(12<<2)|2,{95,54,0}}, +/* 35275 */ {(12<<2)|2,{95,54,0}}, +/* 35276 */ {(12<<2)|2,{95,54,0}}, +/* 35277 */ {(12<<2)|2,{95,54,0}}, +/* 35278 */ {(12<<2)|2,{95,54,0}}, +/* 35279 */ {(12<<2)|2,{95,54,0}}, +/* 35280 */ {(12<<2)|2,{95,55,0}}, +/* 35281 */ {(12<<2)|2,{95,55,0}}, +/* 35282 */ {(12<<2)|2,{95,55,0}}, +/* 35283 */ {(12<<2)|2,{95,55,0}}, +/* 35284 */ {(12<<2)|2,{95,55,0}}, +/* 35285 */ {(12<<2)|2,{95,55,0}}, +/* 35286 */ {(12<<2)|2,{95,55,0}}, +/* 35287 */ {(12<<2)|2,{95,55,0}}, +/* 35288 */ {(12<<2)|2,{95,55,0}}, +/* 35289 */ {(12<<2)|2,{95,55,0}}, +/* 35290 */ {(12<<2)|2,{95,55,0}}, +/* 35291 */ {(12<<2)|2,{95,55,0}}, +/* 35292 */ {(12<<2)|2,{95,55,0}}, +/* 35293 */ {(12<<2)|2,{95,55,0}}, +/* 35294 */ {(12<<2)|2,{95,55,0}}, +/* 35295 */ {(12<<2)|2,{95,55,0}}, +/* 35296 */ {(12<<2)|2,{95,56,0}}, +/* 35297 */ {(12<<2)|2,{95,56,0}}, +/* 35298 */ {(12<<2)|2,{95,56,0}}, +/* 35299 */ {(12<<2)|2,{95,56,0}}, +/* 35300 */ {(12<<2)|2,{95,56,0}}, +/* 35301 */ {(12<<2)|2,{95,56,0}}, +/* 35302 */ {(12<<2)|2,{95,56,0}}, +/* 35303 */ {(12<<2)|2,{95,56,0}}, +/* 35304 */ {(12<<2)|2,{95,56,0}}, +/* 35305 */ {(12<<2)|2,{95,56,0}}, +/* 35306 */ {(12<<2)|2,{95,56,0}}, +/* 35307 */ {(12<<2)|2,{95,56,0}}, +/* 35308 */ {(12<<2)|2,{95,56,0}}, +/* 35309 */ {(12<<2)|2,{95,56,0}}, +/* 35310 */ {(12<<2)|2,{95,56,0}}, +/* 35311 */ {(12<<2)|2,{95,56,0}}, +/* 35312 */ {(12<<2)|2,{95,57,0}}, +/* 35313 */ {(12<<2)|2,{95,57,0}}, +/* 35314 */ {(12<<2)|2,{95,57,0}}, +/* 35315 */ {(12<<2)|2,{95,57,0}}, +/* 35316 */ {(12<<2)|2,{95,57,0}}, +/* 35317 */ {(12<<2)|2,{95,57,0}}, +/* 35318 */ {(12<<2)|2,{95,57,0}}, +/* 35319 */ {(12<<2)|2,{95,57,0}}, +/* 35320 */ {(12<<2)|2,{95,57,0}}, +/* 35321 */ {(12<<2)|2,{95,57,0}}, +/* 35322 */ {(12<<2)|2,{95,57,0}}, +/* 35323 */ {(12<<2)|2,{95,57,0}}, +/* 35324 */ {(12<<2)|2,{95,57,0}}, +/* 35325 */ {(12<<2)|2,{95,57,0}}, +/* 35326 */ {(12<<2)|2,{95,57,0}}, +/* 35327 */ {(12<<2)|2,{95,57,0}}, +/* 35328 */ {(12<<2)|2,{95,61,0}}, +/* 35329 */ {(12<<2)|2,{95,61,0}}, +/* 35330 */ {(12<<2)|2,{95,61,0}}, +/* 35331 */ {(12<<2)|2,{95,61,0}}, +/* 35332 */ {(12<<2)|2,{95,61,0}}, +/* 35333 */ {(12<<2)|2,{95,61,0}}, +/* 35334 */ {(12<<2)|2,{95,61,0}}, +/* 35335 */ {(12<<2)|2,{95,61,0}}, +/* 35336 */ {(12<<2)|2,{95,61,0}}, +/* 35337 */ {(12<<2)|2,{95,61,0}}, +/* 35338 */ {(12<<2)|2,{95,61,0}}, +/* 35339 */ {(12<<2)|2,{95,61,0}}, +/* 35340 */ {(12<<2)|2,{95,61,0}}, +/* 35341 */ {(12<<2)|2,{95,61,0}}, +/* 35342 */ {(12<<2)|2,{95,61,0}}, +/* 35343 */ {(12<<2)|2,{95,61,0}}, +/* 35344 */ {(12<<2)|2,{95,65,0}}, +/* 35345 */ {(12<<2)|2,{95,65,0}}, +/* 35346 */ {(12<<2)|2,{95,65,0}}, +/* 35347 */ {(12<<2)|2,{95,65,0}}, +/* 35348 */ {(12<<2)|2,{95,65,0}}, +/* 35349 */ {(12<<2)|2,{95,65,0}}, +/* 35350 */ {(12<<2)|2,{95,65,0}}, +/* 35351 */ {(12<<2)|2,{95,65,0}}, +/* 35352 */ {(12<<2)|2,{95,65,0}}, +/* 35353 */ {(12<<2)|2,{95,65,0}}, +/* 35354 */ {(12<<2)|2,{95,65,0}}, +/* 35355 */ {(12<<2)|2,{95,65,0}}, +/* 35356 */ {(12<<2)|2,{95,65,0}}, +/* 35357 */ {(12<<2)|2,{95,65,0}}, +/* 35358 */ {(12<<2)|2,{95,65,0}}, +/* 35359 */ {(12<<2)|2,{95,65,0}}, +/* 35360 */ {(12<<2)|2,{95,95,0}}, +/* 35361 */ {(12<<2)|2,{95,95,0}}, +/* 35362 */ {(12<<2)|2,{95,95,0}}, +/* 35363 */ {(12<<2)|2,{95,95,0}}, +/* 35364 */ {(12<<2)|2,{95,95,0}}, +/* 35365 */ {(12<<2)|2,{95,95,0}}, +/* 35366 */ {(12<<2)|2,{95,95,0}}, +/* 35367 */ {(12<<2)|2,{95,95,0}}, +/* 35368 */ {(12<<2)|2,{95,95,0}}, +/* 35369 */ {(12<<2)|2,{95,95,0}}, +/* 35370 */ {(12<<2)|2,{95,95,0}}, +/* 35371 */ {(12<<2)|2,{95,95,0}}, +/* 35372 */ {(12<<2)|2,{95,95,0}}, +/* 35373 */ {(12<<2)|2,{95,95,0}}, +/* 35374 */ {(12<<2)|2,{95,95,0}}, +/* 35375 */ {(12<<2)|2,{95,95,0}}, +/* 35376 */ {(12<<2)|2,{95,98,0}}, +/* 35377 */ {(12<<2)|2,{95,98,0}}, +/* 35378 */ {(12<<2)|2,{95,98,0}}, +/* 35379 */ {(12<<2)|2,{95,98,0}}, +/* 35380 */ {(12<<2)|2,{95,98,0}}, +/* 35381 */ {(12<<2)|2,{95,98,0}}, +/* 35382 */ {(12<<2)|2,{95,98,0}}, +/* 35383 */ {(12<<2)|2,{95,98,0}}, +/* 35384 */ {(12<<2)|2,{95,98,0}}, +/* 35385 */ {(12<<2)|2,{95,98,0}}, +/* 35386 */ {(12<<2)|2,{95,98,0}}, +/* 35387 */ {(12<<2)|2,{95,98,0}}, +/* 35388 */ {(12<<2)|2,{95,98,0}}, +/* 35389 */ {(12<<2)|2,{95,98,0}}, +/* 35390 */ {(12<<2)|2,{95,98,0}}, +/* 35391 */ {(12<<2)|2,{95,98,0}}, +/* 35392 */ {(12<<2)|2,{95,100,0}}, +/* 35393 */ {(12<<2)|2,{95,100,0}}, +/* 35394 */ {(12<<2)|2,{95,100,0}}, +/* 35395 */ {(12<<2)|2,{95,100,0}}, +/* 35396 */ {(12<<2)|2,{95,100,0}}, +/* 35397 */ {(12<<2)|2,{95,100,0}}, +/* 35398 */ {(12<<2)|2,{95,100,0}}, +/* 35399 */ {(12<<2)|2,{95,100,0}}, +/* 35400 */ {(12<<2)|2,{95,100,0}}, +/* 35401 */ {(12<<2)|2,{95,100,0}}, +/* 35402 */ {(12<<2)|2,{95,100,0}}, +/* 35403 */ {(12<<2)|2,{95,100,0}}, +/* 35404 */ {(12<<2)|2,{95,100,0}}, +/* 35405 */ {(12<<2)|2,{95,100,0}}, +/* 35406 */ {(12<<2)|2,{95,100,0}}, +/* 35407 */ {(12<<2)|2,{95,100,0}}, +/* 35408 */ {(12<<2)|2,{95,102,0}}, +/* 35409 */ {(12<<2)|2,{95,102,0}}, +/* 35410 */ {(12<<2)|2,{95,102,0}}, +/* 35411 */ {(12<<2)|2,{95,102,0}}, +/* 35412 */ {(12<<2)|2,{95,102,0}}, +/* 35413 */ {(12<<2)|2,{95,102,0}}, +/* 35414 */ {(12<<2)|2,{95,102,0}}, +/* 35415 */ {(12<<2)|2,{95,102,0}}, +/* 35416 */ {(12<<2)|2,{95,102,0}}, +/* 35417 */ {(12<<2)|2,{95,102,0}}, +/* 35418 */ {(12<<2)|2,{95,102,0}}, +/* 35419 */ {(12<<2)|2,{95,102,0}}, +/* 35420 */ {(12<<2)|2,{95,102,0}}, +/* 35421 */ {(12<<2)|2,{95,102,0}}, +/* 35422 */ {(12<<2)|2,{95,102,0}}, +/* 35423 */ {(12<<2)|2,{95,102,0}}, +/* 35424 */ {(12<<2)|2,{95,103,0}}, +/* 35425 */ {(12<<2)|2,{95,103,0}}, +/* 35426 */ {(12<<2)|2,{95,103,0}}, +/* 35427 */ {(12<<2)|2,{95,103,0}}, +/* 35428 */ {(12<<2)|2,{95,103,0}}, +/* 35429 */ {(12<<2)|2,{95,103,0}}, +/* 35430 */ {(12<<2)|2,{95,103,0}}, +/* 35431 */ {(12<<2)|2,{95,103,0}}, +/* 35432 */ {(12<<2)|2,{95,103,0}}, +/* 35433 */ {(12<<2)|2,{95,103,0}}, +/* 35434 */ {(12<<2)|2,{95,103,0}}, +/* 35435 */ {(12<<2)|2,{95,103,0}}, +/* 35436 */ {(12<<2)|2,{95,103,0}}, +/* 35437 */ {(12<<2)|2,{95,103,0}}, +/* 35438 */ {(12<<2)|2,{95,103,0}}, +/* 35439 */ {(12<<2)|2,{95,103,0}}, +/* 35440 */ {(12<<2)|2,{95,104,0}}, +/* 35441 */ {(12<<2)|2,{95,104,0}}, +/* 35442 */ {(12<<2)|2,{95,104,0}}, +/* 35443 */ {(12<<2)|2,{95,104,0}}, +/* 35444 */ {(12<<2)|2,{95,104,0}}, +/* 35445 */ {(12<<2)|2,{95,104,0}}, +/* 35446 */ {(12<<2)|2,{95,104,0}}, +/* 35447 */ {(12<<2)|2,{95,104,0}}, +/* 35448 */ {(12<<2)|2,{95,104,0}}, +/* 35449 */ {(12<<2)|2,{95,104,0}}, +/* 35450 */ {(12<<2)|2,{95,104,0}}, +/* 35451 */ {(12<<2)|2,{95,104,0}}, +/* 35452 */ {(12<<2)|2,{95,104,0}}, +/* 35453 */ {(12<<2)|2,{95,104,0}}, +/* 35454 */ {(12<<2)|2,{95,104,0}}, +/* 35455 */ {(12<<2)|2,{95,104,0}}, +/* 35456 */ {(12<<2)|2,{95,108,0}}, +/* 35457 */ {(12<<2)|2,{95,108,0}}, +/* 35458 */ {(12<<2)|2,{95,108,0}}, +/* 35459 */ {(12<<2)|2,{95,108,0}}, +/* 35460 */ {(12<<2)|2,{95,108,0}}, +/* 35461 */ {(12<<2)|2,{95,108,0}}, +/* 35462 */ {(12<<2)|2,{95,108,0}}, +/* 35463 */ {(12<<2)|2,{95,108,0}}, +/* 35464 */ {(12<<2)|2,{95,108,0}}, +/* 35465 */ {(12<<2)|2,{95,108,0}}, +/* 35466 */ {(12<<2)|2,{95,108,0}}, +/* 35467 */ {(12<<2)|2,{95,108,0}}, +/* 35468 */ {(12<<2)|2,{95,108,0}}, +/* 35469 */ {(12<<2)|2,{95,108,0}}, +/* 35470 */ {(12<<2)|2,{95,108,0}}, +/* 35471 */ {(12<<2)|2,{95,108,0}}, +/* 35472 */ {(12<<2)|2,{95,109,0}}, +/* 35473 */ {(12<<2)|2,{95,109,0}}, +/* 35474 */ {(12<<2)|2,{95,109,0}}, +/* 35475 */ {(12<<2)|2,{95,109,0}}, +/* 35476 */ {(12<<2)|2,{95,109,0}}, +/* 35477 */ {(12<<2)|2,{95,109,0}}, +/* 35478 */ {(12<<2)|2,{95,109,0}}, +/* 35479 */ {(12<<2)|2,{95,109,0}}, +/* 35480 */ {(12<<2)|2,{95,109,0}}, +/* 35481 */ {(12<<2)|2,{95,109,0}}, +/* 35482 */ {(12<<2)|2,{95,109,0}}, +/* 35483 */ {(12<<2)|2,{95,109,0}}, +/* 35484 */ {(12<<2)|2,{95,109,0}}, +/* 35485 */ {(12<<2)|2,{95,109,0}}, +/* 35486 */ {(12<<2)|2,{95,109,0}}, +/* 35487 */ {(12<<2)|2,{95,109,0}}, +/* 35488 */ {(12<<2)|2,{95,110,0}}, +/* 35489 */ {(12<<2)|2,{95,110,0}}, +/* 35490 */ {(12<<2)|2,{95,110,0}}, +/* 35491 */ {(12<<2)|2,{95,110,0}}, +/* 35492 */ {(12<<2)|2,{95,110,0}}, +/* 35493 */ {(12<<2)|2,{95,110,0}}, +/* 35494 */ {(12<<2)|2,{95,110,0}}, +/* 35495 */ {(12<<2)|2,{95,110,0}}, +/* 35496 */ {(12<<2)|2,{95,110,0}}, +/* 35497 */ {(12<<2)|2,{95,110,0}}, +/* 35498 */ {(12<<2)|2,{95,110,0}}, +/* 35499 */ {(12<<2)|2,{95,110,0}}, +/* 35500 */ {(12<<2)|2,{95,110,0}}, +/* 35501 */ {(12<<2)|2,{95,110,0}}, +/* 35502 */ {(12<<2)|2,{95,110,0}}, +/* 35503 */ {(12<<2)|2,{95,110,0}}, +/* 35504 */ {(12<<2)|2,{95,112,0}}, +/* 35505 */ {(12<<2)|2,{95,112,0}}, +/* 35506 */ {(12<<2)|2,{95,112,0}}, +/* 35507 */ {(12<<2)|2,{95,112,0}}, +/* 35508 */ {(12<<2)|2,{95,112,0}}, +/* 35509 */ {(12<<2)|2,{95,112,0}}, +/* 35510 */ {(12<<2)|2,{95,112,0}}, +/* 35511 */ {(12<<2)|2,{95,112,0}}, +/* 35512 */ {(12<<2)|2,{95,112,0}}, +/* 35513 */ {(12<<2)|2,{95,112,0}}, +/* 35514 */ {(12<<2)|2,{95,112,0}}, +/* 35515 */ {(12<<2)|2,{95,112,0}}, +/* 35516 */ {(12<<2)|2,{95,112,0}}, +/* 35517 */ {(12<<2)|2,{95,112,0}}, +/* 35518 */ {(12<<2)|2,{95,112,0}}, +/* 35519 */ {(12<<2)|2,{95,112,0}}, +/* 35520 */ {(12<<2)|2,{95,114,0}}, +/* 35521 */ {(12<<2)|2,{95,114,0}}, +/* 35522 */ {(12<<2)|2,{95,114,0}}, +/* 35523 */ {(12<<2)|2,{95,114,0}}, +/* 35524 */ {(12<<2)|2,{95,114,0}}, +/* 35525 */ {(12<<2)|2,{95,114,0}}, +/* 35526 */ {(12<<2)|2,{95,114,0}}, +/* 35527 */ {(12<<2)|2,{95,114,0}}, +/* 35528 */ {(12<<2)|2,{95,114,0}}, +/* 35529 */ {(12<<2)|2,{95,114,0}}, +/* 35530 */ {(12<<2)|2,{95,114,0}}, +/* 35531 */ {(12<<2)|2,{95,114,0}}, +/* 35532 */ {(12<<2)|2,{95,114,0}}, +/* 35533 */ {(12<<2)|2,{95,114,0}}, +/* 35534 */ {(12<<2)|2,{95,114,0}}, +/* 35535 */ {(12<<2)|2,{95,114,0}}, +/* 35536 */ {(12<<2)|2,{95,117,0}}, +/* 35537 */ {(12<<2)|2,{95,117,0}}, +/* 35538 */ {(12<<2)|2,{95,117,0}}, +/* 35539 */ {(12<<2)|2,{95,117,0}}, +/* 35540 */ {(12<<2)|2,{95,117,0}}, +/* 35541 */ {(12<<2)|2,{95,117,0}}, +/* 35542 */ {(12<<2)|2,{95,117,0}}, +/* 35543 */ {(12<<2)|2,{95,117,0}}, +/* 35544 */ {(12<<2)|2,{95,117,0}}, +/* 35545 */ {(12<<2)|2,{95,117,0}}, +/* 35546 */ {(12<<2)|2,{95,117,0}}, +/* 35547 */ {(12<<2)|2,{95,117,0}}, +/* 35548 */ {(12<<2)|2,{95,117,0}}, +/* 35549 */ {(12<<2)|2,{95,117,0}}, +/* 35550 */ {(12<<2)|2,{95,117,0}}, +/* 35551 */ {(12<<2)|2,{95,117,0}}, +/* 35552 */ {(13<<2)|2,{95,58,0}}, +/* 35553 */ {(13<<2)|2,{95,58,0}}, +/* 35554 */ {(13<<2)|2,{95,58,0}}, +/* 35555 */ {(13<<2)|2,{95,58,0}}, +/* 35556 */ {(13<<2)|2,{95,58,0}}, +/* 35557 */ {(13<<2)|2,{95,58,0}}, +/* 35558 */ {(13<<2)|2,{95,58,0}}, +/* 35559 */ {(13<<2)|2,{95,58,0}}, +/* 35560 */ {(13<<2)|2,{95,66,0}}, +/* 35561 */ {(13<<2)|2,{95,66,0}}, +/* 35562 */ {(13<<2)|2,{95,66,0}}, +/* 35563 */ {(13<<2)|2,{95,66,0}}, +/* 35564 */ {(13<<2)|2,{95,66,0}}, +/* 35565 */ {(13<<2)|2,{95,66,0}}, +/* 35566 */ {(13<<2)|2,{95,66,0}}, +/* 35567 */ {(13<<2)|2,{95,66,0}}, +/* 35568 */ {(13<<2)|2,{95,67,0}}, +/* 35569 */ {(13<<2)|2,{95,67,0}}, +/* 35570 */ {(13<<2)|2,{95,67,0}}, +/* 35571 */ {(13<<2)|2,{95,67,0}}, +/* 35572 */ {(13<<2)|2,{95,67,0}}, +/* 35573 */ {(13<<2)|2,{95,67,0}}, +/* 35574 */ {(13<<2)|2,{95,67,0}}, +/* 35575 */ {(13<<2)|2,{95,67,0}}, +/* 35576 */ {(13<<2)|2,{95,68,0}}, +/* 35577 */ {(13<<2)|2,{95,68,0}}, +/* 35578 */ {(13<<2)|2,{95,68,0}}, +/* 35579 */ {(13<<2)|2,{95,68,0}}, +/* 35580 */ {(13<<2)|2,{95,68,0}}, +/* 35581 */ {(13<<2)|2,{95,68,0}}, +/* 35582 */ {(13<<2)|2,{95,68,0}}, +/* 35583 */ {(13<<2)|2,{95,68,0}}, +/* 35584 */ {(13<<2)|2,{95,69,0}}, +/* 35585 */ {(13<<2)|2,{95,69,0}}, +/* 35586 */ {(13<<2)|2,{95,69,0}}, +/* 35587 */ {(13<<2)|2,{95,69,0}}, +/* 35588 */ {(13<<2)|2,{95,69,0}}, +/* 35589 */ {(13<<2)|2,{95,69,0}}, +/* 35590 */ {(13<<2)|2,{95,69,0}}, +/* 35591 */ {(13<<2)|2,{95,69,0}}, +/* 35592 */ {(13<<2)|2,{95,70,0}}, +/* 35593 */ {(13<<2)|2,{95,70,0}}, +/* 35594 */ {(13<<2)|2,{95,70,0}}, +/* 35595 */ {(13<<2)|2,{95,70,0}}, +/* 35596 */ {(13<<2)|2,{95,70,0}}, +/* 35597 */ {(13<<2)|2,{95,70,0}}, +/* 35598 */ {(13<<2)|2,{95,70,0}}, +/* 35599 */ {(13<<2)|2,{95,70,0}}, +/* 35600 */ {(13<<2)|2,{95,71,0}}, +/* 35601 */ {(13<<2)|2,{95,71,0}}, +/* 35602 */ {(13<<2)|2,{95,71,0}}, +/* 35603 */ {(13<<2)|2,{95,71,0}}, +/* 35604 */ {(13<<2)|2,{95,71,0}}, +/* 35605 */ {(13<<2)|2,{95,71,0}}, +/* 35606 */ {(13<<2)|2,{95,71,0}}, +/* 35607 */ {(13<<2)|2,{95,71,0}}, +/* 35608 */ {(13<<2)|2,{95,72,0}}, +/* 35609 */ {(13<<2)|2,{95,72,0}}, +/* 35610 */ {(13<<2)|2,{95,72,0}}, +/* 35611 */ {(13<<2)|2,{95,72,0}}, +/* 35612 */ {(13<<2)|2,{95,72,0}}, +/* 35613 */ {(13<<2)|2,{95,72,0}}, +/* 35614 */ {(13<<2)|2,{95,72,0}}, +/* 35615 */ {(13<<2)|2,{95,72,0}}, +/* 35616 */ {(13<<2)|2,{95,73,0}}, +/* 35617 */ {(13<<2)|2,{95,73,0}}, +/* 35618 */ {(13<<2)|2,{95,73,0}}, +/* 35619 */ {(13<<2)|2,{95,73,0}}, +/* 35620 */ {(13<<2)|2,{95,73,0}}, +/* 35621 */ {(13<<2)|2,{95,73,0}}, +/* 35622 */ {(13<<2)|2,{95,73,0}}, +/* 35623 */ {(13<<2)|2,{95,73,0}}, +/* 35624 */ {(13<<2)|2,{95,74,0}}, +/* 35625 */ {(13<<2)|2,{95,74,0}}, +/* 35626 */ {(13<<2)|2,{95,74,0}}, +/* 35627 */ {(13<<2)|2,{95,74,0}}, +/* 35628 */ {(13<<2)|2,{95,74,0}}, +/* 35629 */ {(13<<2)|2,{95,74,0}}, +/* 35630 */ {(13<<2)|2,{95,74,0}}, +/* 35631 */ {(13<<2)|2,{95,74,0}}, +/* 35632 */ {(13<<2)|2,{95,75,0}}, +/* 35633 */ {(13<<2)|2,{95,75,0}}, +/* 35634 */ {(13<<2)|2,{95,75,0}}, +/* 35635 */ {(13<<2)|2,{95,75,0}}, +/* 35636 */ {(13<<2)|2,{95,75,0}}, +/* 35637 */ {(13<<2)|2,{95,75,0}}, +/* 35638 */ {(13<<2)|2,{95,75,0}}, +/* 35639 */ {(13<<2)|2,{95,75,0}}, +/* 35640 */ {(13<<2)|2,{95,76,0}}, +/* 35641 */ {(13<<2)|2,{95,76,0}}, +/* 35642 */ {(13<<2)|2,{95,76,0}}, +/* 35643 */ {(13<<2)|2,{95,76,0}}, +/* 35644 */ {(13<<2)|2,{95,76,0}}, +/* 35645 */ {(13<<2)|2,{95,76,0}}, +/* 35646 */ {(13<<2)|2,{95,76,0}}, +/* 35647 */ {(13<<2)|2,{95,76,0}}, +/* 35648 */ {(13<<2)|2,{95,77,0}}, +/* 35649 */ {(13<<2)|2,{95,77,0}}, +/* 35650 */ {(13<<2)|2,{95,77,0}}, +/* 35651 */ {(13<<2)|2,{95,77,0}}, +/* 35652 */ {(13<<2)|2,{95,77,0}}, +/* 35653 */ {(13<<2)|2,{95,77,0}}, +/* 35654 */ {(13<<2)|2,{95,77,0}}, +/* 35655 */ {(13<<2)|2,{95,77,0}}, +/* 35656 */ {(13<<2)|2,{95,78,0}}, +/* 35657 */ {(13<<2)|2,{95,78,0}}, +/* 35658 */ {(13<<2)|2,{95,78,0}}, +/* 35659 */ {(13<<2)|2,{95,78,0}}, +/* 35660 */ {(13<<2)|2,{95,78,0}}, +/* 35661 */ {(13<<2)|2,{95,78,0}}, +/* 35662 */ {(13<<2)|2,{95,78,0}}, +/* 35663 */ {(13<<2)|2,{95,78,0}}, +/* 35664 */ {(13<<2)|2,{95,79,0}}, +/* 35665 */ {(13<<2)|2,{95,79,0}}, +/* 35666 */ {(13<<2)|2,{95,79,0}}, +/* 35667 */ {(13<<2)|2,{95,79,0}}, +/* 35668 */ {(13<<2)|2,{95,79,0}}, +/* 35669 */ {(13<<2)|2,{95,79,0}}, +/* 35670 */ {(13<<2)|2,{95,79,0}}, +/* 35671 */ {(13<<2)|2,{95,79,0}}, +/* 35672 */ {(13<<2)|2,{95,80,0}}, +/* 35673 */ {(13<<2)|2,{95,80,0}}, +/* 35674 */ {(13<<2)|2,{95,80,0}}, +/* 35675 */ {(13<<2)|2,{95,80,0}}, +/* 35676 */ {(13<<2)|2,{95,80,0}}, +/* 35677 */ {(13<<2)|2,{95,80,0}}, +/* 35678 */ {(13<<2)|2,{95,80,0}}, +/* 35679 */ {(13<<2)|2,{95,80,0}}, +/* 35680 */ {(13<<2)|2,{95,81,0}}, +/* 35681 */ {(13<<2)|2,{95,81,0}}, +/* 35682 */ {(13<<2)|2,{95,81,0}}, +/* 35683 */ {(13<<2)|2,{95,81,0}}, +/* 35684 */ {(13<<2)|2,{95,81,0}}, +/* 35685 */ {(13<<2)|2,{95,81,0}}, +/* 35686 */ {(13<<2)|2,{95,81,0}}, +/* 35687 */ {(13<<2)|2,{95,81,0}}, +/* 35688 */ {(13<<2)|2,{95,82,0}}, +/* 35689 */ {(13<<2)|2,{95,82,0}}, +/* 35690 */ {(13<<2)|2,{95,82,0}}, +/* 35691 */ {(13<<2)|2,{95,82,0}}, +/* 35692 */ {(13<<2)|2,{95,82,0}}, +/* 35693 */ {(13<<2)|2,{95,82,0}}, +/* 35694 */ {(13<<2)|2,{95,82,0}}, +/* 35695 */ {(13<<2)|2,{95,82,0}}, +/* 35696 */ {(13<<2)|2,{95,83,0}}, +/* 35697 */ {(13<<2)|2,{95,83,0}}, +/* 35698 */ {(13<<2)|2,{95,83,0}}, +/* 35699 */ {(13<<2)|2,{95,83,0}}, +/* 35700 */ {(13<<2)|2,{95,83,0}}, +/* 35701 */ {(13<<2)|2,{95,83,0}}, +/* 35702 */ {(13<<2)|2,{95,83,0}}, +/* 35703 */ {(13<<2)|2,{95,83,0}}, +/* 35704 */ {(13<<2)|2,{95,84,0}}, +/* 35705 */ {(13<<2)|2,{95,84,0}}, +/* 35706 */ {(13<<2)|2,{95,84,0}}, +/* 35707 */ {(13<<2)|2,{95,84,0}}, +/* 35708 */ {(13<<2)|2,{95,84,0}}, +/* 35709 */ {(13<<2)|2,{95,84,0}}, +/* 35710 */ {(13<<2)|2,{95,84,0}}, +/* 35711 */ {(13<<2)|2,{95,84,0}}, +/* 35712 */ {(13<<2)|2,{95,85,0}}, +/* 35713 */ {(13<<2)|2,{95,85,0}}, +/* 35714 */ {(13<<2)|2,{95,85,0}}, +/* 35715 */ {(13<<2)|2,{95,85,0}}, +/* 35716 */ {(13<<2)|2,{95,85,0}}, +/* 35717 */ {(13<<2)|2,{95,85,0}}, +/* 35718 */ {(13<<2)|2,{95,85,0}}, +/* 35719 */ {(13<<2)|2,{95,85,0}}, +/* 35720 */ {(13<<2)|2,{95,86,0}}, +/* 35721 */ {(13<<2)|2,{95,86,0}}, +/* 35722 */ {(13<<2)|2,{95,86,0}}, +/* 35723 */ {(13<<2)|2,{95,86,0}}, +/* 35724 */ {(13<<2)|2,{95,86,0}}, +/* 35725 */ {(13<<2)|2,{95,86,0}}, +/* 35726 */ {(13<<2)|2,{95,86,0}}, +/* 35727 */ {(13<<2)|2,{95,86,0}}, +/* 35728 */ {(13<<2)|2,{95,87,0}}, +/* 35729 */ {(13<<2)|2,{95,87,0}}, +/* 35730 */ {(13<<2)|2,{95,87,0}}, +/* 35731 */ {(13<<2)|2,{95,87,0}}, +/* 35732 */ {(13<<2)|2,{95,87,0}}, +/* 35733 */ {(13<<2)|2,{95,87,0}}, +/* 35734 */ {(13<<2)|2,{95,87,0}}, +/* 35735 */ {(13<<2)|2,{95,87,0}}, +/* 35736 */ {(13<<2)|2,{95,89,0}}, +/* 35737 */ {(13<<2)|2,{95,89,0}}, +/* 35738 */ {(13<<2)|2,{95,89,0}}, +/* 35739 */ {(13<<2)|2,{95,89,0}}, +/* 35740 */ {(13<<2)|2,{95,89,0}}, +/* 35741 */ {(13<<2)|2,{95,89,0}}, +/* 35742 */ {(13<<2)|2,{95,89,0}}, +/* 35743 */ {(13<<2)|2,{95,89,0}}, +/* 35744 */ {(13<<2)|2,{95,106,0}}, +/* 35745 */ {(13<<2)|2,{95,106,0}}, +/* 35746 */ {(13<<2)|2,{95,106,0}}, +/* 35747 */ {(13<<2)|2,{95,106,0}}, +/* 35748 */ {(13<<2)|2,{95,106,0}}, +/* 35749 */ {(13<<2)|2,{95,106,0}}, +/* 35750 */ {(13<<2)|2,{95,106,0}}, +/* 35751 */ {(13<<2)|2,{95,106,0}}, +/* 35752 */ {(13<<2)|2,{95,107,0}}, +/* 35753 */ {(13<<2)|2,{95,107,0}}, +/* 35754 */ {(13<<2)|2,{95,107,0}}, +/* 35755 */ {(13<<2)|2,{95,107,0}}, +/* 35756 */ {(13<<2)|2,{95,107,0}}, +/* 35757 */ {(13<<2)|2,{95,107,0}}, +/* 35758 */ {(13<<2)|2,{95,107,0}}, +/* 35759 */ {(13<<2)|2,{95,107,0}}, +/* 35760 */ {(13<<2)|2,{95,113,0}}, +/* 35761 */ {(13<<2)|2,{95,113,0}}, +/* 35762 */ {(13<<2)|2,{95,113,0}}, +/* 35763 */ {(13<<2)|2,{95,113,0}}, +/* 35764 */ {(13<<2)|2,{95,113,0}}, +/* 35765 */ {(13<<2)|2,{95,113,0}}, +/* 35766 */ {(13<<2)|2,{95,113,0}}, +/* 35767 */ {(13<<2)|2,{95,113,0}}, +/* 35768 */ {(13<<2)|2,{95,118,0}}, +/* 35769 */ {(13<<2)|2,{95,118,0}}, +/* 35770 */ {(13<<2)|2,{95,118,0}}, +/* 35771 */ {(13<<2)|2,{95,118,0}}, +/* 35772 */ {(13<<2)|2,{95,118,0}}, +/* 35773 */ {(13<<2)|2,{95,118,0}}, +/* 35774 */ {(13<<2)|2,{95,118,0}}, +/* 35775 */ {(13<<2)|2,{95,118,0}}, +/* 35776 */ {(13<<2)|2,{95,119,0}}, +/* 35777 */ {(13<<2)|2,{95,119,0}}, +/* 35778 */ {(13<<2)|2,{95,119,0}}, +/* 35779 */ {(13<<2)|2,{95,119,0}}, +/* 35780 */ {(13<<2)|2,{95,119,0}}, +/* 35781 */ {(13<<2)|2,{95,119,0}}, +/* 35782 */ {(13<<2)|2,{95,119,0}}, +/* 35783 */ {(13<<2)|2,{95,119,0}}, +/* 35784 */ {(13<<2)|2,{95,120,0}}, +/* 35785 */ {(13<<2)|2,{95,120,0}}, +/* 35786 */ {(13<<2)|2,{95,120,0}}, +/* 35787 */ {(13<<2)|2,{95,120,0}}, +/* 35788 */ {(13<<2)|2,{95,120,0}}, +/* 35789 */ {(13<<2)|2,{95,120,0}}, +/* 35790 */ {(13<<2)|2,{95,120,0}}, +/* 35791 */ {(13<<2)|2,{95,120,0}}, +/* 35792 */ {(13<<2)|2,{95,121,0}}, +/* 35793 */ {(13<<2)|2,{95,121,0}}, +/* 35794 */ {(13<<2)|2,{95,121,0}}, +/* 35795 */ {(13<<2)|2,{95,121,0}}, +/* 35796 */ {(13<<2)|2,{95,121,0}}, +/* 35797 */ {(13<<2)|2,{95,121,0}}, +/* 35798 */ {(13<<2)|2,{95,121,0}}, +/* 35799 */ {(13<<2)|2,{95,121,0}}, +/* 35800 */ {(13<<2)|2,{95,122,0}}, +/* 35801 */ {(13<<2)|2,{95,122,0}}, +/* 35802 */ {(13<<2)|2,{95,122,0}}, +/* 35803 */ {(13<<2)|2,{95,122,0}}, +/* 35804 */ {(13<<2)|2,{95,122,0}}, +/* 35805 */ {(13<<2)|2,{95,122,0}}, +/* 35806 */ {(13<<2)|2,{95,122,0}}, +/* 35807 */ {(13<<2)|2,{95,122,0}}, +/* 35808 */ {(14<<2)|2,{95,38,0}}, +/* 35809 */ {(14<<2)|2,{95,38,0}}, +/* 35810 */ {(14<<2)|2,{95,38,0}}, +/* 35811 */ {(14<<2)|2,{95,38,0}}, +/* 35812 */ {(14<<2)|2,{95,42,0}}, +/* 35813 */ {(14<<2)|2,{95,42,0}}, +/* 35814 */ {(14<<2)|2,{95,42,0}}, +/* 35815 */ {(14<<2)|2,{95,42,0}}, +/* 35816 */ {(14<<2)|2,{95,44,0}}, +/* 35817 */ {(14<<2)|2,{95,44,0}}, +/* 35818 */ {(14<<2)|2,{95,44,0}}, +/* 35819 */ {(14<<2)|2,{95,44,0}}, +/* 35820 */ {(14<<2)|2,{95,59,0}}, +/* 35821 */ {(14<<2)|2,{95,59,0}}, +/* 35822 */ {(14<<2)|2,{95,59,0}}, +/* 35823 */ {(14<<2)|2,{95,59,0}}, +/* 35824 */ {(14<<2)|2,{95,88,0}}, +/* 35825 */ {(14<<2)|2,{95,88,0}}, +/* 35826 */ {(14<<2)|2,{95,88,0}}, +/* 35827 */ {(14<<2)|2,{95,88,0}}, +/* 35828 */ {(14<<2)|2,{95,90,0}}, +/* 35829 */ {(14<<2)|2,{95,90,0}}, +/* 35830 */ {(14<<2)|2,{95,90,0}}, +/* 35831 */ {(14<<2)|2,{95,90,0}}, +/* 35832 */ {(16<<2)|2,{95,33,0}}, +/* 35833 */ {(16<<2)|2,{95,34,0}}, +/* 35834 */ {(16<<2)|2,{95,40,0}}, +/* 35835 */ {(16<<2)|2,{95,41,0}}, +/* 35836 */ {(16<<2)|2,{95,63,0}}, +/* 35837 */ {(6<<2)|1,{95,0,0}}, +/* 35838 */ {(6<<2)|1,{95,0,0}}, +/* 35839 */ {(6<<2)|1,{95,0,0}}, +/* 35840 */ {(16<<2)|3,{98,48,48}}, +/* 35841 */ {(16<<2)|3,{98,48,49}}, +/* 35842 */ {(16<<2)|3,{98,48,50}}, +/* 35843 */ {(16<<2)|3,{98,48,97}}, +/* 35844 */ {(16<<2)|3,{98,48,99}}, +/* 35845 */ {(16<<2)|3,{98,48,101}}, +/* 35846 */ {(16<<2)|3,{98,48,105}}, +/* 35847 */ {(16<<2)|3,{98,48,111}}, +/* 35848 */ {(16<<2)|3,{98,48,115}}, +/* 35849 */ {(16<<2)|3,{98,48,116}}, +/* 35850 */ {(11<<2)|2,{98,48,0}}, +/* 35851 */ {(11<<2)|2,{98,48,0}}, +/* 35852 */ {(11<<2)|2,{98,48,0}}, +/* 35853 */ {(11<<2)|2,{98,48,0}}, +/* 35854 */ {(11<<2)|2,{98,48,0}}, +/* 35855 */ {(11<<2)|2,{98,48,0}}, +/* 35856 */ {(11<<2)|2,{98,48,0}}, +/* 35857 */ {(11<<2)|2,{98,48,0}}, +/* 35858 */ {(11<<2)|2,{98,48,0}}, +/* 35859 */ {(11<<2)|2,{98,48,0}}, +/* 35860 */ {(11<<2)|2,{98,48,0}}, +/* 35861 */ {(11<<2)|2,{98,48,0}}, +/* 35862 */ {(11<<2)|2,{98,48,0}}, +/* 35863 */ {(11<<2)|2,{98,48,0}}, +/* 35864 */ {(11<<2)|2,{98,48,0}}, +/* 35865 */ {(11<<2)|2,{98,48,0}}, +/* 35866 */ {(11<<2)|2,{98,48,0}}, +/* 35867 */ {(11<<2)|2,{98,48,0}}, +/* 35868 */ {(11<<2)|2,{98,48,0}}, +/* 35869 */ {(11<<2)|2,{98,48,0}}, +/* 35870 */ {(11<<2)|2,{98,48,0}}, +/* 35871 */ {(11<<2)|2,{98,48,0}}, +/* 35872 */ {(16<<2)|3,{98,49,48}}, +/* 35873 */ {(16<<2)|3,{98,49,49}}, +/* 35874 */ {(16<<2)|3,{98,49,50}}, +/* 35875 */ {(16<<2)|3,{98,49,97}}, +/* 35876 */ {(16<<2)|3,{98,49,99}}, +/* 35877 */ {(16<<2)|3,{98,49,101}}, +/* 35878 */ {(16<<2)|3,{98,49,105}}, +/* 35879 */ {(16<<2)|3,{98,49,111}}, +/* 35880 */ {(16<<2)|3,{98,49,115}}, +/* 35881 */ {(16<<2)|3,{98,49,116}}, +/* 35882 */ {(11<<2)|2,{98,49,0}}, +/* 35883 */ {(11<<2)|2,{98,49,0}}, +/* 35884 */ {(11<<2)|2,{98,49,0}}, +/* 35885 */ {(11<<2)|2,{98,49,0}}, +/* 35886 */ {(11<<2)|2,{98,49,0}}, +/* 35887 */ {(11<<2)|2,{98,49,0}}, +/* 35888 */ {(11<<2)|2,{98,49,0}}, +/* 35889 */ {(11<<2)|2,{98,49,0}}, +/* 35890 */ {(11<<2)|2,{98,49,0}}, +/* 35891 */ {(11<<2)|2,{98,49,0}}, +/* 35892 */ {(11<<2)|2,{98,49,0}}, +/* 35893 */ {(11<<2)|2,{98,49,0}}, +/* 35894 */ {(11<<2)|2,{98,49,0}}, +/* 35895 */ {(11<<2)|2,{98,49,0}}, +/* 35896 */ {(11<<2)|2,{98,49,0}}, +/* 35897 */ {(11<<2)|2,{98,49,0}}, +/* 35898 */ {(11<<2)|2,{98,49,0}}, +/* 35899 */ {(11<<2)|2,{98,49,0}}, +/* 35900 */ {(11<<2)|2,{98,49,0}}, +/* 35901 */ {(11<<2)|2,{98,49,0}}, +/* 35902 */ {(11<<2)|2,{98,49,0}}, +/* 35903 */ {(11<<2)|2,{98,49,0}}, +/* 35904 */ {(16<<2)|3,{98,50,48}}, +/* 35905 */ {(16<<2)|3,{98,50,49}}, +/* 35906 */ {(16<<2)|3,{98,50,50}}, +/* 35907 */ {(16<<2)|3,{98,50,97}}, +/* 35908 */ {(16<<2)|3,{98,50,99}}, +/* 35909 */ {(16<<2)|3,{98,50,101}}, +/* 35910 */ {(16<<2)|3,{98,50,105}}, +/* 35911 */ {(16<<2)|3,{98,50,111}}, +/* 35912 */ {(16<<2)|3,{98,50,115}}, +/* 35913 */ {(16<<2)|3,{98,50,116}}, +/* 35914 */ {(11<<2)|2,{98,50,0}}, +/* 35915 */ {(11<<2)|2,{98,50,0}}, +/* 35916 */ {(11<<2)|2,{98,50,0}}, +/* 35917 */ {(11<<2)|2,{98,50,0}}, +/* 35918 */ {(11<<2)|2,{98,50,0}}, +/* 35919 */ {(11<<2)|2,{98,50,0}}, +/* 35920 */ {(11<<2)|2,{98,50,0}}, +/* 35921 */ {(11<<2)|2,{98,50,0}}, +/* 35922 */ {(11<<2)|2,{98,50,0}}, +/* 35923 */ {(11<<2)|2,{98,50,0}}, +/* 35924 */ {(11<<2)|2,{98,50,0}}, +/* 35925 */ {(11<<2)|2,{98,50,0}}, +/* 35926 */ {(11<<2)|2,{98,50,0}}, +/* 35927 */ {(11<<2)|2,{98,50,0}}, +/* 35928 */ {(11<<2)|2,{98,50,0}}, +/* 35929 */ {(11<<2)|2,{98,50,0}}, +/* 35930 */ {(11<<2)|2,{98,50,0}}, +/* 35931 */ {(11<<2)|2,{98,50,0}}, +/* 35932 */ {(11<<2)|2,{98,50,0}}, +/* 35933 */ {(11<<2)|2,{98,50,0}}, +/* 35934 */ {(11<<2)|2,{98,50,0}}, +/* 35935 */ {(11<<2)|2,{98,50,0}}, +/* 35936 */ {(16<<2)|3,{98,97,48}}, +/* 35937 */ {(16<<2)|3,{98,97,49}}, +/* 35938 */ {(16<<2)|3,{98,97,50}}, +/* 35939 */ {(16<<2)|3,{98,97,97}}, +/* 35940 */ {(16<<2)|3,{98,97,99}}, +/* 35941 */ {(16<<2)|3,{98,97,101}}, +/* 35942 */ {(16<<2)|3,{98,97,105}}, +/* 35943 */ {(16<<2)|3,{98,97,111}}, +/* 35944 */ {(16<<2)|3,{98,97,115}}, +/* 35945 */ {(16<<2)|3,{98,97,116}}, +/* 35946 */ {(11<<2)|2,{98,97,0}}, +/* 35947 */ {(11<<2)|2,{98,97,0}}, +/* 35948 */ {(11<<2)|2,{98,97,0}}, +/* 35949 */ {(11<<2)|2,{98,97,0}}, +/* 35950 */ {(11<<2)|2,{98,97,0}}, +/* 35951 */ {(11<<2)|2,{98,97,0}}, +/* 35952 */ {(11<<2)|2,{98,97,0}}, +/* 35953 */ {(11<<2)|2,{98,97,0}}, +/* 35954 */ {(11<<2)|2,{98,97,0}}, +/* 35955 */ {(11<<2)|2,{98,97,0}}, +/* 35956 */ {(11<<2)|2,{98,97,0}}, +/* 35957 */ {(11<<2)|2,{98,97,0}}, +/* 35958 */ {(11<<2)|2,{98,97,0}}, +/* 35959 */ {(11<<2)|2,{98,97,0}}, +/* 35960 */ {(11<<2)|2,{98,97,0}}, +/* 35961 */ {(11<<2)|2,{98,97,0}}, +/* 35962 */ {(11<<2)|2,{98,97,0}}, +/* 35963 */ {(11<<2)|2,{98,97,0}}, +/* 35964 */ {(11<<2)|2,{98,97,0}}, +/* 35965 */ {(11<<2)|2,{98,97,0}}, +/* 35966 */ {(11<<2)|2,{98,97,0}}, +/* 35967 */ {(11<<2)|2,{98,97,0}}, +/* 35968 */ {(16<<2)|3,{98,99,48}}, +/* 35969 */ {(16<<2)|3,{98,99,49}}, +/* 35970 */ {(16<<2)|3,{98,99,50}}, +/* 35971 */ {(16<<2)|3,{98,99,97}}, +/* 35972 */ {(16<<2)|3,{98,99,99}}, +/* 35973 */ {(16<<2)|3,{98,99,101}}, +/* 35974 */ {(16<<2)|3,{98,99,105}}, +/* 35975 */ {(16<<2)|3,{98,99,111}}, +/* 35976 */ {(16<<2)|3,{98,99,115}}, +/* 35977 */ {(16<<2)|3,{98,99,116}}, +/* 35978 */ {(11<<2)|2,{98,99,0}}, +/* 35979 */ {(11<<2)|2,{98,99,0}}, +/* 35980 */ {(11<<2)|2,{98,99,0}}, +/* 35981 */ {(11<<2)|2,{98,99,0}}, +/* 35982 */ {(11<<2)|2,{98,99,0}}, +/* 35983 */ {(11<<2)|2,{98,99,0}}, +/* 35984 */ {(11<<2)|2,{98,99,0}}, +/* 35985 */ {(11<<2)|2,{98,99,0}}, +/* 35986 */ {(11<<2)|2,{98,99,0}}, +/* 35987 */ {(11<<2)|2,{98,99,0}}, +/* 35988 */ {(11<<2)|2,{98,99,0}}, +/* 35989 */ {(11<<2)|2,{98,99,0}}, +/* 35990 */ {(11<<2)|2,{98,99,0}}, +/* 35991 */ {(11<<2)|2,{98,99,0}}, +/* 35992 */ {(11<<2)|2,{98,99,0}}, +/* 35993 */ {(11<<2)|2,{98,99,0}}, +/* 35994 */ {(11<<2)|2,{98,99,0}}, +/* 35995 */ {(11<<2)|2,{98,99,0}}, +/* 35996 */ {(11<<2)|2,{98,99,0}}, +/* 35997 */ {(11<<2)|2,{98,99,0}}, +/* 35998 */ {(11<<2)|2,{98,99,0}}, +/* 35999 */ {(11<<2)|2,{98,99,0}}, +/* 36000 */ {(16<<2)|3,{98,101,48}}, +/* 36001 */ {(16<<2)|3,{98,101,49}}, +/* 36002 */ {(16<<2)|3,{98,101,50}}, +/* 36003 */ {(16<<2)|3,{98,101,97}}, +/* 36004 */ {(16<<2)|3,{98,101,99}}, +/* 36005 */ {(16<<2)|3,{98,101,101}}, +/* 36006 */ {(16<<2)|3,{98,101,105}}, +/* 36007 */ {(16<<2)|3,{98,101,111}}, +/* 36008 */ {(16<<2)|3,{98,101,115}}, +/* 36009 */ {(16<<2)|3,{98,101,116}}, +/* 36010 */ {(11<<2)|2,{98,101,0}}, +/* 36011 */ {(11<<2)|2,{98,101,0}}, +/* 36012 */ {(11<<2)|2,{98,101,0}}, +/* 36013 */ {(11<<2)|2,{98,101,0}}, +/* 36014 */ {(11<<2)|2,{98,101,0}}, +/* 36015 */ {(11<<2)|2,{98,101,0}}, +/* 36016 */ {(11<<2)|2,{98,101,0}}, +/* 36017 */ {(11<<2)|2,{98,101,0}}, +/* 36018 */ {(11<<2)|2,{98,101,0}}, +/* 36019 */ {(11<<2)|2,{98,101,0}}, +/* 36020 */ {(11<<2)|2,{98,101,0}}, +/* 36021 */ {(11<<2)|2,{98,101,0}}, +/* 36022 */ {(11<<2)|2,{98,101,0}}, +/* 36023 */ {(11<<2)|2,{98,101,0}}, +/* 36024 */ {(11<<2)|2,{98,101,0}}, +/* 36025 */ {(11<<2)|2,{98,101,0}}, +/* 36026 */ {(11<<2)|2,{98,101,0}}, +/* 36027 */ {(11<<2)|2,{98,101,0}}, +/* 36028 */ {(11<<2)|2,{98,101,0}}, +/* 36029 */ {(11<<2)|2,{98,101,0}}, +/* 36030 */ {(11<<2)|2,{98,101,0}}, +/* 36031 */ {(11<<2)|2,{98,101,0}}, +/* 36032 */ {(16<<2)|3,{98,105,48}}, +/* 36033 */ {(16<<2)|3,{98,105,49}}, +/* 36034 */ {(16<<2)|3,{98,105,50}}, +/* 36035 */ {(16<<2)|3,{98,105,97}}, +/* 36036 */ {(16<<2)|3,{98,105,99}}, +/* 36037 */ {(16<<2)|3,{98,105,101}}, +/* 36038 */ {(16<<2)|3,{98,105,105}}, +/* 36039 */ {(16<<2)|3,{98,105,111}}, +/* 36040 */ {(16<<2)|3,{98,105,115}}, +/* 36041 */ {(16<<2)|3,{98,105,116}}, +/* 36042 */ {(11<<2)|2,{98,105,0}}, +/* 36043 */ {(11<<2)|2,{98,105,0}}, +/* 36044 */ {(11<<2)|2,{98,105,0}}, +/* 36045 */ {(11<<2)|2,{98,105,0}}, +/* 36046 */ {(11<<2)|2,{98,105,0}}, +/* 36047 */ {(11<<2)|2,{98,105,0}}, +/* 36048 */ {(11<<2)|2,{98,105,0}}, +/* 36049 */ {(11<<2)|2,{98,105,0}}, +/* 36050 */ {(11<<2)|2,{98,105,0}}, +/* 36051 */ {(11<<2)|2,{98,105,0}}, +/* 36052 */ {(11<<2)|2,{98,105,0}}, +/* 36053 */ {(11<<2)|2,{98,105,0}}, +/* 36054 */ {(11<<2)|2,{98,105,0}}, +/* 36055 */ {(11<<2)|2,{98,105,0}}, +/* 36056 */ {(11<<2)|2,{98,105,0}}, +/* 36057 */ {(11<<2)|2,{98,105,0}}, +/* 36058 */ {(11<<2)|2,{98,105,0}}, +/* 36059 */ {(11<<2)|2,{98,105,0}}, +/* 36060 */ {(11<<2)|2,{98,105,0}}, +/* 36061 */ {(11<<2)|2,{98,105,0}}, +/* 36062 */ {(11<<2)|2,{98,105,0}}, +/* 36063 */ {(11<<2)|2,{98,105,0}}, +/* 36064 */ {(16<<2)|3,{98,111,48}}, +/* 36065 */ {(16<<2)|3,{98,111,49}}, +/* 36066 */ {(16<<2)|3,{98,111,50}}, +/* 36067 */ {(16<<2)|3,{98,111,97}}, +/* 36068 */ {(16<<2)|3,{98,111,99}}, +/* 36069 */ {(16<<2)|3,{98,111,101}}, +/* 36070 */ {(16<<2)|3,{98,111,105}}, +/* 36071 */ {(16<<2)|3,{98,111,111}}, +/* 36072 */ {(16<<2)|3,{98,111,115}}, +/* 36073 */ {(16<<2)|3,{98,111,116}}, +/* 36074 */ {(11<<2)|2,{98,111,0}}, +/* 36075 */ {(11<<2)|2,{98,111,0}}, +/* 36076 */ {(11<<2)|2,{98,111,0}}, +/* 36077 */ {(11<<2)|2,{98,111,0}}, +/* 36078 */ {(11<<2)|2,{98,111,0}}, +/* 36079 */ {(11<<2)|2,{98,111,0}}, +/* 36080 */ {(11<<2)|2,{98,111,0}}, +/* 36081 */ {(11<<2)|2,{98,111,0}}, +/* 36082 */ {(11<<2)|2,{98,111,0}}, +/* 36083 */ {(11<<2)|2,{98,111,0}}, +/* 36084 */ {(11<<2)|2,{98,111,0}}, +/* 36085 */ {(11<<2)|2,{98,111,0}}, +/* 36086 */ {(11<<2)|2,{98,111,0}}, +/* 36087 */ {(11<<2)|2,{98,111,0}}, +/* 36088 */ {(11<<2)|2,{98,111,0}}, +/* 36089 */ {(11<<2)|2,{98,111,0}}, +/* 36090 */ {(11<<2)|2,{98,111,0}}, +/* 36091 */ {(11<<2)|2,{98,111,0}}, +/* 36092 */ {(11<<2)|2,{98,111,0}}, +/* 36093 */ {(11<<2)|2,{98,111,0}}, +/* 36094 */ {(11<<2)|2,{98,111,0}}, +/* 36095 */ {(11<<2)|2,{98,111,0}}, +/* 36096 */ {(16<<2)|3,{98,115,48}}, +/* 36097 */ {(16<<2)|3,{98,115,49}}, +/* 36098 */ {(16<<2)|3,{98,115,50}}, +/* 36099 */ {(16<<2)|3,{98,115,97}}, +/* 36100 */ {(16<<2)|3,{98,115,99}}, +/* 36101 */ {(16<<2)|3,{98,115,101}}, +/* 36102 */ {(16<<2)|3,{98,115,105}}, +/* 36103 */ {(16<<2)|3,{98,115,111}}, +/* 36104 */ {(16<<2)|3,{98,115,115}}, +/* 36105 */ {(16<<2)|3,{98,115,116}}, +/* 36106 */ {(11<<2)|2,{98,115,0}}, +/* 36107 */ {(11<<2)|2,{98,115,0}}, +/* 36108 */ {(11<<2)|2,{98,115,0}}, +/* 36109 */ {(11<<2)|2,{98,115,0}}, +/* 36110 */ {(11<<2)|2,{98,115,0}}, +/* 36111 */ {(11<<2)|2,{98,115,0}}, +/* 36112 */ {(11<<2)|2,{98,115,0}}, +/* 36113 */ {(11<<2)|2,{98,115,0}}, +/* 36114 */ {(11<<2)|2,{98,115,0}}, +/* 36115 */ {(11<<2)|2,{98,115,0}}, +/* 36116 */ {(11<<2)|2,{98,115,0}}, +/* 36117 */ {(11<<2)|2,{98,115,0}}, +/* 36118 */ {(11<<2)|2,{98,115,0}}, +/* 36119 */ {(11<<2)|2,{98,115,0}}, +/* 36120 */ {(11<<2)|2,{98,115,0}}, +/* 36121 */ {(11<<2)|2,{98,115,0}}, +/* 36122 */ {(11<<2)|2,{98,115,0}}, +/* 36123 */ {(11<<2)|2,{98,115,0}}, +/* 36124 */ {(11<<2)|2,{98,115,0}}, +/* 36125 */ {(11<<2)|2,{98,115,0}}, +/* 36126 */ {(11<<2)|2,{98,115,0}}, +/* 36127 */ {(11<<2)|2,{98,115,0}}, +/* 36128 */ {(16<<2)|3,{98,116,48}}, +/* 36129 */ {(16<<2)|3,{98,116,49}}, +/* 36130 */ {(16<<2)|3,{98,116,50}}, +/* 36131 */ {(16<<2)|3,{98,116,97}}, +/* 36132 */ {(16<<2)|3,{98,116,99}}, +/* 36133 */ {(16<<2)|3,{98,116,101}}, +/* 36134 */ {(16<<2)|3,{98,116,105}}, +/* 36135 */ {(16<<2)|3,{98,116,111}}, +/* 36136 */ {(16<<2)|3,{98,116,115}}, +/* 36137 */ {(16<<2)|3,{98,116,116}}, +/* 36138 */ {(11<<2)|2,{98,116,0}}, +/* 36139 */ {(11<<2)|2,{98,116,0}}, +/* 36140 */ {(11<<2)|2,{98,116,0}}, +/* 36141 */ {(11<<2)|2,{98,116,0}}, +/* 36142 */ {(11<<2)|2,{98,116,0}}, +/* 36143 */ {(11<<2)|2,{98,116,0}}, +/* 36144 */ {(11<<2)|2,{98,116,0}}, +/* 36145 */ {(11<<2)|2,{98,116,0}}, +/* 36146 */ {(11<<2)|2,{98,116,0}}, +/* 36147 */ {(11<<2)|2,{98,116,0}}, +/* 36148 */ {(11<<2)|2,{98,116,0}}, +/* 36149 */ {(11<<2)|2,{98,116,0}}, +/* 36150 */ {(11<<2)|2,{98,116,0}}, +/* 36151 */ {(11<<2)|2,{98,116,0}}, +/* 36152 */ {(11<<2)|2,{98,116,0}}, +/* 36153 */ {(11<<2)|2,{98,116,0}}, +/* 36154 */ {(11<<2)|2,{98,116,0}}, +/* 36155 */ {(11<<2)|2,{98,116,0}}, +/* 36156 */ {(11<<2)|2,{98,116,0}}, +/* 36157 */ {(11<<2)|2,{98,116,0}}, +/* 36158 */ {(11<<2)|2,{98,116,0}}, +/* 36159 */ {(11<<2)|2,{98,116,0}}, +/* 36160 */ {(12<<2)|2,{98,32,0}}, +/* 36161 */ {(12<<2)|2,{98,32,0}}, +/* 36162 */ {(12<<2)|2,{98,32,0}}, +/* 36163 */ {(12<<2)|2,{98,32,0}}, +/* 36164 */ {(12<<2)|2,{98,32,0}}, +/* 36165 */ {(12<<2)|2,{98,32,0}}, +/* 36166 */ {(12<<2)|2,{98,32,0}}, +/* 36167 */ {(12<<2)|2,{98,32,0}}, +/* 36168 */ {(12<<2)|2,{98,32,0}}, +/* 36169 */ {(12<<2)|2,{98,32,0}}, +/* 36170 */ {(12<<2)|2,{98,32,0}}, +/* 36171 */ {(12<<2)|2,{98,32,0}}, +/* 36172 */ {(12<<2)|2,{98,32,0}}, +/* 36173 */ {(12<<2)|2,{98,32,0}}, +/* 36174 */ {(12<<2)|2,{98,32,0}}, +/* 36175 */ {(12<<2)|2,{98,32,0}}, +/* 36176 */ {(12<<2)|2,{98,37,0}}, +/* 36177 */ {(12<<2)|2,{98,37,0}}, +/* 36178 */ {(12<<2)|2,{98,37,0}}, +/* 36179 */ {(12<<2)|2,{98,37,0}}, +/* 36180 */ {(12<<2)|2,{98,37,0}}, +/* 36181 */ {(12<<2)|2,{98,37,0}}, +/* 36182 */ {(12<<2)|2,{98,37,0}}, +/* 36183 */ {(12<<2)|2,{98,37,0}}, +/* 36184 */ {(12<<2)|2,{98,37,0}}, +/* 36185 */ {(12<<2)|2,{98,37,0}}, +/* 36186 */ {(12<<2)|2,{98,37,0}}, +/* 36187 */ {(12<<2)|2,{98,37,0}}, +/* 36188 */ {(12<<2)|2,{98,37,0}}, +/* 36189 */ {(12<<2)|2,{98,37,0}}, +/* 36190 */ {(12<<2)|2,{98,37,0}}, +/* 36191 */ {(12<<2)|2,{98,37,0}}, +/* 36192 */ {(12<<2)|2,{98,45,0}}, +/* 36193 */ {(12<<2)|2,{98,45,0}}, +/* 36194 */ {(12<<2)|2,{98,45,0}}, +/* 36195 */ {(12<<2)|2,{98,45,0}}, +/* 36196 */ {(12<<2)|2,{98,45,0}}, +/* 36197 */ {(12<<2)|2,{98,45,0}}, +/* 36198 */ {(12<<2)|2,{98,45,0}}, +/* 36199 */ {(12<<2)|2,{98,45,0}}, +/* 36200 */ {(12<<2)|2,{98,45,0}}, +/* 36201 */ {(12<<2)|2,{98,45,0}}, +/* 36202 */ {(12<<2)|2,{98,45,0}}, +/* 36203 */ {(12<<2)|2,{98,45,0}}, +/* 36204 */ {(12<<2)|2,{98,45,0}}, +/* 36205 */ {(12<<2)|2,{98,45,0}}, +/* 36206 */ {(12<<2)|2,{98,45,0}}, +/* 36207 */ {(12<<2)|2,{98,45,0}}, +/* 36208 */ {(12<<2)|2,{98,46,0}}, +/* 36209 */ {(12<<2)|2,{98,46,0}}, +/* 36210 */ {(12<<2)|2,{98,46,0}}, +/* 36211 */ {(12<<2)|2,{98,46,0}}, +/* 36212 */ {(12<<2)|2,{98,46,0}}, +/* 36213 */ {(12<<2)|2,{98,46,0}}, +/* 36214 */ {(12<<2)|2,{98,46,0}}, +/* 36215 */ {(12<<2)|2,{98,46,0}}, +/* 36216 */ {(12<<2)|2,{98,46,0}}, +/* 36217 */ {(12<<2)|2,{98,46,0}}, +/* 36218 */ {(12<<2)|2,{98,46,0}}, +/* 36219 */ {(12<<2)|2,{98,46,0}}, +/* 36220 */ {(12<<2)|2,{98,46,0}}, +/* 36221 */ {(12<<2)|2,{98,46,0}}, +/* 36222 */ {(12<<2)|2,{98,46,0}}, +/* 36223 */ {(12<<2)|2,{98,46,0}}, +/* 36224 */ {(12<<2)|2,{98,47,0}}, +/* 36225 */ {(12<<2)|2,{98,47,0}}, +/* 36226 */ {(12<<2)|2,{98,47,0}}, +/* 36227 */ {(12<<2)|2,{98,47,0}}, +/* 36228 */ {(12<<2)|2,{98,47,0}}, +/* 36229 */ {(12<<2)|2,{98,47,0}}, +/* 36230 */ {(12<<2)|2,{98,47,0}}, +/* 36231 */ {(12<<2)|2,{98,47,0}}, +/* 36232 */ {(12<<2)|2,{98,47,0}}, +/* 36233 */ {(12<<2)|2,{98,47,0}}, +/* 36234 */ {(12<<2)|2,{98,47,0}}, +/* 36235 */ {(12<<2)|2,{98,47,0}}, +/* 36236 */ {(12<<2)|2,{98,47,0}}, +/* 36237 */ {(12<<2)|2,{98,47,0}}, +/* 36238 */ {(12<<2)|2,{98,47,0}}, +/* 36239 */ {(12<<2)|2,{98,47,0}}, +/* 36240 */ {(12<<2)|2,{98,51,0}}, +/* 36241 */ {(12<<2)|2,{98,51,0}}, +/* 36242 */ {(12<<2)|2,{98,51,0}}, +/* 36243 */ {(12<<2)|2,{98,51,0}}, +/* 36244 */ {(12<<2)|2,{98,51,0}}, +/* 36245 */ {(12<<2)|2,{98,51,0}}, +/* 36246 */ {(12<<2)|2,{98,51,0}}, +/* 36247 */ {(12<<2)|2,{98,51,0}}, +/* 36248 */ {(12<<2)|2,{98,51,0}}, +/* 36249 */ {(12<<2)|2,{98,51,0}}, +/* 36250 */ {(12<<2)|2,{98,51,0}}, +/* 36251 */ {(12<<2)|2,{98,51,0}}, +/* 36252 */ {(12<<2)|2,{98,51,0}}, +/* 36253 */ {(12<<2)|2,{98,51,0}}, +/* 36254 */ {(12<<2)|2,{98,51,0}}, +/* 36255 */ {(12<<2)|2,{98,51,0}}, +/* 36256 */ {(12<<2)|2,{98,52,0}}, +/* 36257 */ {(12<<2)|2,{98,52,0}}, +/* 36258 */ {(12<<2)|2,{98,52,0}}, +/* 36259 */ {(12<<2)|2,{98,52,0}}, +/* 36260 */ {(12<<2)|2,{98,52,0}}, +/* 36261 */ {(12<<2)|2,{98,52,0}}, +/* 36262 */ {(12<<2)|2,{98,52,0}}, +/* 36263 */ {(12<<2)|2,{98,52,0}}, +/* 36264 */ {(12<<2)|2,{98,52,0}}, +/* 36265 */ {(12<<2)|2,{98,52,0}}, +/* 36266 */ {(12<<2)|2,{98,52,0}}, +/* 36267 */ {(12<<2)|2,{98,52,0}}, +/* 36268 */ {(12<<2)|2,{98,52,0}}, +/* 36269 */ {(12<<2)|2,{98,52,0}}, +/* 36270 */ {(12<<2)|2,{98,52,0}}, +/* 36271 */ {(12<<2)|2,{98,52,0}}, +/* 36272 */ {(12<<2)|2,{98,53,0}}, +/* 36273 */ {(12<<2)|2,{98,53,0}}, +/* 36274 */ {(12<<2)|2,{98,53,0}}, +/* 36275 */ {(12<<2)|2,{98,53,0}}, +/* 36276 */ {(12<<2)|2,{98,53,0}}, +/* 36277 */ {(12<<2)|2,{98,53,0}}, +/* 36278 */ {(12<<2)|2,{98,53,0}}, +/* 36279 */ {(12<<2)|2,{98,53,0}}, +/* 36280 */ {(12<<2)|2,{98,53,0}}, +/* 36281 */ {(12<<2)|2,{98,53,0}}, +/* 36282 */ {(12<<2)|2,{98,53,0}}, +/* 36283 */ {(12<<2)|2,{98,53,0}}, +/* 36284 */ {(12<<2)|2,{98,53,0}}, +/* 36285 */ {(12<<2)|2,{98,53,0}}, +/* 36286 */ {(12<<2)|2,{98,53,0}}, +/* 36287 */ {(12<<2)|2,{98,53,0}}, +/* 36288 */ {(12<<2)|2,{98,54,0}}, +/* 36289 */ {(12<<2)|2,{98,54,0}}, +/* 36290 */ {(12<<2)|2,{98,54,0}}, +/* 36291 */ {(12<<2)|2,{98,54,0}}, +/* 36292 */ {(12<<2)|2,{98,54,0}}, +/* 36293 */ {(12<<2)|2,{98,54,0}}, +/* 36294 */ {(12<<2)|2,{98,54,0}}, +/* 36295 */ {(12<<2)|2,{98,54,0}}, +/* 36296 */ {(12<<2)|2,{98,54,0}}, +/* 36297 */ {(12<<2)|2,{98,54,0}}, +/* 36298 */ {(12<<2)|2,{98,54,0}}, +/* 36299 */ {(12<<2)|2,{98,54,0}}, +/* 36300 */ {(12<<2)|2,{98,54,0}}, +/* 36301 */ {(12<<2)|2,{98,54,0}}, +/* 36302 */ {(12<<2)|2,{98,54,0}}, +/* 36303 */ {(12<<2)|2,{98,54,0}}, +/* 36304 */ {(12<<2)|2,{98,55,0}}, +/* 36305 */ {(12<<2)|2,{98,55,0}}, +/* 36306 */ {(12<<2)|2,{98,55,0}}, +/* 36307 */ {(12<<2)|2,{98,55,0}}, +/* 36308 */ {(12<<2)|2,{98,55,0}}, +/* 36309 */ {(12<<2)|2,{98,55,0}}, +/* 36310 */ {(12<<2)|2,{98,55,0}}, +/* 36311 */ {(12<<2)|2,{98,55,0}}, +/* 36312 */ {(12<<2)|2,{98,55,0}}, +/* 36313 */ {(12<<2)|2,{98,55,0}}, +/* 36314 */ {(12<<2)|2,{98,55,0}}, +/* 36315 */ {(12<<2)|2,{98,55,0}}, +/* 36316 */ {(12<<2)|2,{98,55,0}}, +/* 36317 */ {(12<<2)|2,{98,55,0}}, +/* 36318 */ {(12<<2)|2,{98,55,0}}, +/* 36319 */ {(12<<2)|2,{98,55,0}}, +/* 36320 */ {(12<<2)|2,{98,56,0}}, +/* 36321 */ {(12<<2)|2,{98,56,0}}, +/* 36322 */ {(12<<2)|2,{98,56,0}}, +/* 36323 */ {(12<<2)|2,{98,56,0}}, +/* 36324 */ {(12<<2)|2,{98,56,0}}, +/* 36325 */ {(12<<2)|2,{98,56,0}}, +/* 36326 */ {(12<<2)|2,{98,56,0}}, +/* 36327 */ {(12<<2)|2,{98,56,0}}, +/* 36328 */ {(12<<2)|2,{98,56,0}}, +/* 36329 */ {(12<<2)|2,{98,56,0}}, +/* 36330 */ {(12<<2)|2,{98,56,0}}, +/* 36331 */ {(12<<2)|2,{98,56,0}}, +/* 36332 */ {(12<<2)|2,{98,56,0}}, +/* 36333 */ {(12<<2)|2,{98,56,0}}, +/* 36334 */ {(12<<2)|2,{98,56,0}}, +/* 36335 */ {(12<<2)|2,{98,56,0}}, +/* 36336 */ {(12<<2)|2,{98,57,0}}, +/* 36337 */ {(12<<2)|2,{98,57,0}}, +/* 36338 */ {(12<<2)|2,{98,57,0}}, +/* 36339 */ {(12<<2)|2,{98,57,0}}, +/* 36340 */ {(12<<2)|2,{98,57,0}}, +/* 36341 */ {(12<<2)|2,{98,57,0}}, +/* 36342 */ {(12<<2)|2,{98,57,0}}, +/* 36343 */ {(12<<2)|2,{98,57,0}}, +/* 36344 */ {(12<<2)|2,{98,57,0}}, +/* 36345 */ {(12<<2)|2,{98,57,0}}, +/* 36346 */ {(12<<2)|2,{98,57,0}}, +/* 36347 */ {(12<<2)|2,{98,57,0}}, +/* 36348 */ {(12<<2)|2,{98,57,0}}, +/* 36349 */ {(12<<2)|2,{98,57,0}}, +/* 36350 */ {(12<<2)|2,{98,57,0}}, +/* 36351 */ {(12<<2)|2,{98,57,0}}, +/* 36352 */ {(12<<2)|2,{98,61,0}}, +/* 36353 */ {(12<<2)|2,{98,61,0}}, +/* 36354 */ {(12<<2)|2,{98,61,0}}, +/* 36355 */ {(12<<2)|2,{98,61,0}}, +/* 36356 */ {(12<<2)|2,{98,61,0}}, +/* 36357 */ {(12<<2)|2,{98,61,0}}, +/* 36358 */ {(12<<2)|2,{98,61,0}}, +/* 36359 */ {(12<<2)|2,{98,61,0}}, +/* 36360 */ {(12<<2)|2,{98,61,0}}, +/* 36361 */ {(12<<2)|2,{98,61,0}}, +/* 36362 */ {(12<<2)|2,{98,61,0}}, +/* 36363 */ {(12<<2)|2,{98,61,0}}, +/* 36364 */ {(12<<2)|2,{98,61,0}}, +/* 36365 */ {(12<<2)|2,{98,61,0}}, +/* 36366 */ {(12<<2)|2,{98,61,0}}, +/* 36367 */ {(12<<2)|2,{98,61,0}}, +/* 36368 */ {(12<<2)|2,{98,65,0}}, +/* 36369 */ {(12<<2)|2,{98,65,0}}, +/* 36370 */ {(12<<2)|2,{98,65,0}}, +/* 36371 */ {(12<<2)|2,{98,65,0}}, +/* 36372 */ {(12<<2)|2,{98,65,0}}, +/* 36373 */ {(12<<2)|2,{98,65,0}}, +/* 36374 */ {(12<<2)|2,{98,65,0}}, +/* 36375 */ {(12<<2)|2,{98,65,0}}, +/* 36376 */ {(12<<2)|2,{98,65,0}}, +/* 36377 */ {(12<<2)|2,{98,65,0}}, +/* 36378 */ {(12<<2)|2,{98,65,0}}, +/* 36379 */ {(12<<2)|2,{98,65,0}}, +/* 36380 */ {(12<<2)|2,{98,65,0}}, +/* 36381 */ {(12<<2)|2,{98,65,0}}, +/* 36382 */ {(12<<2)|2,{98,65,0}}, +/* 36383 */ {(12<<2)|2,{98,65,0}}, +/* 36384 */ {(12<<2)|2,{98,95,0}}, +/* 36385 */ {(12<<2)|2,{98,95,0}}, +/* 36386 */ {(12<<2)|2,{98,95,0}}, +/* 36387 */ {(12<<2)|2,{98,95,0}}, +/* 36388 */ {(12<<2)|2,{98,95,0}}, +/* 36389 */ {(12<<2)|2,{98,95,0}}, +/* 36390 */ {(12<<2)|2,{98,95,0}}, +/* 36391 */ {(12<<2)|2,{98,95,0}}, +/* 36392 */ {(12<<2)|2,{98,95,0}}, +/* 36393 */ {(12<<2)|2,{98,95,0}}, +/* 36394 */ {(12<<2)|2,{98,95,0}}, +/* 36395 */ {(12<<2)|2,{98,95,0}}, +/* 36396 */ {(12<<2)|2,{98,95,0}}, +/* 36397 */ {(12<<2)|2,{98,95,0}}, +/* 36398 */ {(12<<2)|2,{98,95,0}}, +/* 36399 */ {(12<<2)|2,{98,95,0}}, +/* 36400 */ {(12<<2)|2,{98,98,0}}, +/* 36401 */ {(12<<2)|2,{98,98,0}}, +/* 36402 */ {(12<<2)|2,{98,98,0}}, +/* 36403 */ {(12<<2)|2,{98,98,0}}, +/* 36404 */ {(12<<2)|2,{98,98,0}}, +/* 36405 */ {(12<<2)|2,{98,98,0}}, +/* 36406 */ {(12<<2)|2,{98,98,0}}, +/* 36407 */ {(12<<2)|2,{98,98,0}}, +/* 36408 */ {(12<<2)|2,{98,98,0}}, +/* 36409 */ {(12<<2)|2,{98,98,0}}, +/* 36410 */ {(12<<2)|2,{98,98,0}}, +/* 36411 */ {(12<<2)|2,{98,98,0}}, +/* 36412 */ {(12<<2)|2,{98,98,0}}, +/* 36413 */ {(12<<2)|2,{98,98,0}}, +/* 36414 */ {(12<<2)|2,{98,98,0}}, +/* 36415 */ {(12<<2)|2,{98,98,0}}, +/* 36416 */ {(12<<2)|2,{98,100,0}}, +/* 36417 */ {(12<<2)|2,{98,100,0}}, +/* 36418 */ {(12<<2)|2,{98,100,0}}, +/* 36419 */ {(12<<2)|2,{98,100,0}}, +/* 36420 */ {(12<<2)|2,{98,100,0}}, +/* 36421 */ {(12<<2)|2,{98,100,0}}, +/* 36422 */ {(12<<2)|2,{98,100,0}}, +/* 36423 */ {(12<<2)|2,{98,100,0}}, +/* 36424 */ {(12<<2)|2,{98,100,0}}, +/* 36425 */ {(12<<2)|2,{98,100,0}}, +/* 36426 */ {(12<<2)|2,{98,100,0}}, +/* 36427 */ {(12<<2)|2,{98,100,0}}, +/* 36428 */ {(12<<2)|2,{98,100,0}}, +/* 36429 */ {(12<<2)|2,{98,100,0}}, +/* 36430 */ {(12<<2)|2,{98,100,0}}, +/* 36431 */ {(12<<2)|2,{98,100,0}}, +/* 36432 */ {(12<<2)|2,{98,102,0}}, +/* 36433 */ {(12<<2)|2,{98,102,0}}, +/* 36434 */ {(12<<2)|2,{98,102,0}}, +/* 36435 */ {(12<<2)|2,{98,102,0}}, +/* 36436 */ {(12<<2)|2,{98,102,0}}, +/* 36437 */ {(12<<2)|2,{98,102,0}}, +/* 36438 */ {(12<<2)|2,{98,102,0}}, +/* 36439 */ {(12<<2)|2,{98,102,0}}, +/* 36440 */ {(12<<2)|2,{98,102,0}}, +/* 36441 */ {(12<<2)|2,{98,102,0}}, +/* 36442 */ {(12<<2)|2,{98,102,0}}, +/* 36443 */ {(12<<2)|2,{98,102,0}}, +/* 36444 */ {(12<<2)|2,{98,102,0}}, +/* 36445 */ {(12<<2)|2,{98,102,0}}, +/* 36446 */ {(12<<2)|2,{98,102,0}}, +/* 36447 */ {(12<<2)|2,{98,102,0}}, +/* 36448 */ {(12<<2)|2,{98,103,0}}, +/* 36449 */ {(12<<2)|2,{98,103,0}}, +/* 36450 */ {(12<<2)|2,{98,103,0}}, +/* 36451 */ {(12<<2)|2,{98,103,0}}, +/* 36452 */ {(12<<2)|2,{98,103,0}}, +/* 36453 */ {(12<<2)|2,{98,103,0}}, +/* 36454 */ {(12<<2)|2,{98,103,0}}, +/* 36455 */ {(12<<2)|2,{98,103,0}}, +/* 36456 */ {(12<<2)|2,{98,103,0}}, +/* 36457 */ {(12<<2)|2,{98,103,0}}, +/* 36458 */ {(12<<2)|2,{98,103,0}}, +/* 36459 */ {(12<<2)|2,{98,103,0}}, +/* 36460 */ {(12<<2)|2,{98,103,0}}, +/* 36461 */ {(12<<2)|2,{98,103,0}}, +/* 36462 */ {(12<<2)|2,{98,103,0}}, +/* 36463 */ {(12<<2)|2,{98,103,0}}, +/* 36464 */ {(12<<2)|2,{98,104,0}}, +/* 36465 */ {(12<<2)|2,{98,104,0}}, +/* 36466 */ {(12<<2)|2,{98,104,0}}, +/* 36467 */ {(12<<2)|2,{98,104,0}}, +/* 36468 */ {(12<<2)|2,{98,104,0}}, +/* 36469 */ {(12<<2)|2,{98,104,0}}, +/* 36470 */ {(12<<2)|2,{98,104,0}}, +/* 36471 */ {(12<<2)|2,{98,104,0}}, +/* 36472 */ {(12<<2)|2,{98,104,0}}, +/* 36473 */ {(12<<2)|2,{98,104,0}}, +/* 36474 */ {(12<<2)|2,{98,104,0}}, +/* 36475 */ {(12<<2)|2,{98,104,0}}, +/* 36476 */ {(12<<2)|2,{98,104,0}}, +/* 36477 */ {(12<<2)|2,{98,104,0}}, +/* 36478 */ {(12<<2)|2,{98,104,0}}, +/* 36479 */ {(12<<2)|2,{98,104,0}}, +/* 36480 */ {(12<<2)|2,{98,108,0}}, +/* 36481 */ {(12<<2)|2,{98,108,0}}, +/* 36482 */ {(12<<2)|2,{98,108,0}}, +/* 36483 */ {(12<<2)|2,{98,108,0}}, +/* 36484 */ {(12<<2)|2,{98,108,0}}, +/* 36485 */ {(12<<2)|2,{98,108,0}}, +/* 36486 */ {(12<<2)|2,{98,108,0}}, +/* 36487 */ {(12<<2)|2,{98,108,0}}, +/* 36488 */ {(12<<2)|2,{98,108,0}}, +/* 36489 */ {(12<<2)|2,{98,108,0}}, +/* 36490 */ {(12<<2)|2,{98,108,0}}, +/* 36491 */ {(12<<2)|2,{98,108,0}}, +/* 36492 */ {(12<<2)|2,{98,108,0}}, +/* 36493 */ {(12<<2)|2,{98,108,0}}, +/* 36494 */ {(12<<2)|2,{98,108,0}}, +/* 36495 */ {(12<<2)|2,{98,108,0}}, +/* 36496 */ {(12<<2)|2,{98,109,0}}, +/* 36497 */ {(12<<2)|2,{98,109,0}}, +/* 36498 */ {(12<<2)|2,{98,109,0}}, +/* 36499 */ {(12<<2)|2,{98,109,0}}, +/* 36500 */ {(12<<2)|2,{98,109,0}}, +/* 36501 */ {(12<<2)|2,{98,109,0}}, +/* 36502 */ {(12<<2)|2,{98,109,0}}, +/* 36503 */ {(12<<2)|2,{98,109,0}}, +/* 36504 */ {(12<<2)|2,{98,109,0}}, +/* 36505 */ {(12<<2)|2,{98,109,0}}, +/* 36506 */ {(12<<2)|2,{98,109,0}}, +/* 36507 */ {(12<<2)|2,{98,109,0}}, +/* 36508 */ {(12<<2)|2,{98,109,0}}, +/* 36509 */ {(12<<2)|2,{98,109,0}}, +/* 36510 */ {(12<<2)|2,{98,109,0}}, +/* 36511 */ {(12<<2)|2,{98,109,0}}, +/* 36512 */ {(12<<2)|2,{98,110,0}}, +/* 36513 */ {(12<<2)|2,{98,110,0}}, +/* 36514 */ {(12<<2)|2,{98,110,0}}, +/* 36515 */ {(12<<2)|2,{98,110,0}}, +/* 36516 */ {(12<<2)|2,{98,110,0}}, +/* 36517 */ {(12<<2)|2,{98,110,0}}, +/* 36518 */ {(12<<2)|2,{98,110,0}}, +/* 36519 */ {(12<<2)|2,{98,110,0}}, +/* 36520 */ {(12<<2)|2,{98,110,0}}, +/* 36521 */ {(12<<2)|2,{98,110,0}}, +/* 36522 */ {(12<<2)|2,{98,110,0}}, +/* 36523 */ {(12<<2)|2,{98,110,0}}, +/* 36524 */ {(12<<2)|2,{98,110,0}}, +/* 36525 */ {(12<<2)|2,{98,110,0}}, +/* 36526 */ {(12<<2)|2,{98,110,0}}, +/* 36527 */ {(12<<2)|2,{98,110,0}}, +/* 36528 */ {(12<<2)|2,{98,112,0}}, +/* 36529 */ {(12<<2)|2,{98,112,0}}, +/* 36530 */ {(12<<2)|2,{98,112,0}}, +/* 36531 */ {(12<<2)|2,{98,112,0}}, +/* 36532 */ {(12<<2)|2,{98,112,0}}, +/* 36533 */ {(12<<2)|2,{98,112,0}}, +/* 36534 */ {(12<<2)|2,{98,112,0}}, +/* 36535 */ {(12<<2)|2,{98,112,0}}, +/* 36536 */ {(12<<2)|2,{98,112,0}}, +/* 36537 */ {(12<<2)|2,{98,112,0}}, +/* 36538 */ {(12<<2)|2,{98,112,0}}, +/* 36539 */ {(12<<2)|2,{98,112,0}}, +/* 36540 */ {(12<<2)|2,{98,112,0}}, +/* 36541 */ {(12<<2)|2,{98,112,0}}, +/* 36542 */ {(12<<2)|2,{98,112,0}}, +/* 36543 */ {(12<<2)|2,{98,112,0}}, +/* 36544 */ {(12<<2)|2,{98,114,0}}, +/* 36545 */ {(12<<2)|2,{98,114,0}}, +/* 36546 */ {(12<<2)|2,{98,114,0}}, +/* 36547 */ {(12<<2)|2,{98,114,0}}, +/* 36548 */ {(12<<2)|2,{98,114,0}}, +/* 36549 */ {(12<<2)|2,{98,114,0}}, +/* 36550 */ {(12<<2)|2,{98,114,0}}, +/* 36551 */ {(12<<2)|2,{98,114,0}}, +/* 36552 */ {(12<<2)|2,{98,114,0}}, +/* 36553 */ {(12<<2)|2,{98,114,0}}, +/* 36554 */ {(12<<2)|2,{98,114,0}}, +/* 36555 */ {(12<<2)|2,{98,114,0}}, +/* 36556 */ {(12<<2)|2,{98,114,0}}, +/* 36557 */ {(12<<2)|2,{98,114,0}}, +/* 36558 */ {(12<<2)|2,{98,114,0}}, +/* 36559 */ {(12<<2)|2,{98,114,0}}, +/* 36560 */ {(12<<2)|2,{98,117,0}}, +/* 36561 */ {(12<<2)|2,{98,117,0}}, +/* 36562 */ {(12<<2)|2,{98,117,0}}, +/* 36563 */ {(12<<2)|2,{98,117,0}}, +/* 36564 */ {(12<<2)|2,{98,117,0}}, +/* 36565 */ {(12<<2)|2,{98,117,0}}, +/* 36566 */ {(12<<2)|2,{98,117,0}}, +/* 36567 */ {(12<<2)|2,{98,117,0}}, +/* 36568 */ {(12<<2)|2,{98,117,0}}, +/* 36569 */ {(12<<2)|2,{98,117,0}}, +/* 36570 */ {(12<<2)|2,{98,117,0}}, +/* 36571 */ {(12<<2)|2,{98,117,0}}, +/* 36572 */ {(12<<2)|2,{98,117,0}}, +/* 36573 */ {(12<<2)|2,{98,117,0}}, +/* 36574 */ {(12<<2)|2,{98,117,0}}, +/* 36575 */ {(12<<2)|2,{98,117,0}}, +/* 36576 */ {(13<<2)|2,{98,58,0}}, +/* 36577 */ {(13<<2)|2,{98,58,0}}, +/* 36578 */ {(13<<2)|2,{98,58,0}}, +/* 36579 */ {(13<<2)|2,{98,58,0}}, +/* 36580 */ {(13<<2)|2,{98,58,0}}, +/* 36581 */ {(13<<2)|2,{98,58,0}}, +/* 36582 */ {(13<<2)|2,{98,58,0}}, +/* 36583 */ {(13<<2)|2,{98,58,0}}, +/* 36584 */ {(13<<2)|2,{98,66,0}}, +/* 36585 */ {(13<<2)|2,{98,66,0}}, +/* 36586 */ {(13<<2)|2,{98,66,0}}, +/* 36587 */ {(13<<2)|2,{98,66,0}}, +/* 36588 */ {(13<<2)|2,{98,66,0}}, +/* 36589 */ {(13<<2)|2,{98,66,0}}, +/* 36590 */ {(13<<2)|2,{98,66,0}}, +/* 36591 */ {(13<<2)|2,{98,66,0}}, +/* 36592 */ {(13<<2)|2,{98,67,0}}, +/* 36593 */ {(13<<2)|2,{98,67,0}}, +/* 36594 */ {(13<<2)|2,{98,67,0}}, +/* 36595 */ {(13<<2)|2,{98,67,0}}, +/* 36596 */ {(13<<2)|2,{98,67,0}}, +/* 36597 */ {(13<<2)|2,{98,67,0}}, +/* 36598 */ {(13<<2)|2,{98,67,0}}, +/* 36599 */ {(13<<2)|2,{98,67,0}}, +/* 36600 */ {(13<<2)|2,{98,68,0}}, +/* 36601 */ {(13<<2)|2,{98,68,0}}, +/* 36602 */ {(13<<2)|2,{98,68,0}}, +/* 36603 */ {(13<<2)|2,{98,68,0}}, +/* 36604 */ {(13<<2)|2,{98,68,0}}, +/* 36605 */ {(13<<2)|2,{98,68,0}}, +/* 36606 */ {(13<<2)|2,{98,68,0}}, +/* 36607 */ {(13<<2)|2,{98,68,0}}, +/* 36608 */ {(13<<2)|2,{98,69,0}}, +/* 36609 */ {(13<<2)|2,{98,69,0}}, +/* 36610 */ {(13<<2)|2,{98,69,0}}, +/* 36611 */ {(13<<2)|2,{98,69,0}}, +/* 36612 */ {(13<<2)|2,{98,69,0}}, +/* 36613 */ {(13<<2)|2,{98,69,0}}, +/* 36614 */ {(13<<2)|2,{98,69,0}}, +/* 36615 */ {(13<<2)|2,{98,69,0}}, +/* 36616 */ {(13<<2)|2,{98,70,0}}, +/* 36617 */ {(13<<2)|2,{98,70,0}}, +/* 36618 */ {(13<<2)|2,{98,70,0}}, +/* 36619 */ {(13<<2)|2,{98,70,0}}, +/* 36620 */ {(13<<2)|2,{98,70,0}}, +/* 36621 */ {(13<<2)|2,{98,70,0}}, +/* 36622 */ {(13<<2)|2,{98,70,0}}, +/* 36623 */ {(13<<2)|2,{98,70,0}}, +/* 36624 */ {(13<<2)|2,{98,71,0}}, +/* 36625 */ {(13<<2)|2,{98,71,0}}, +/* 36626 */ {(13<<2)|2,{98,71,0}}, +/* 36627 */ {(13<<2)|2,{98,71,0}}, +/* 36628 */ {(13<<2)|2,{98,71,0}}, +/* 36629 */ {(13<<2)|2,{98,71,0}}, +/* 36630 */ {(13<<2)|2,{98,71,0}}, +/* 36631 */ {(13<<2)|2,{98,71,0}}, +/* 36632 */ {(13<<2)|2,{98,72,0}}, +/* 36633 */ {(13<<2)|2,{98,72,0}}, +/* 36634 */ {(13<<2)|2,{98,72,0}}, +/* 36635 */ {(13<<2)|2,{98,72,0}}, +/* 36636 */ {(13<<2)|2,{98,72,0}}, +/* 36637 */ {(13<<2)|2,{98,72,0}}, +/* 36638 */ {(13<<2)|2,{98,72,0}}, +/* 36639 */ {(13<<2)|2,{98,72,0}}, +/* 36640 */ {(13<<2)|2,{98,73,0}}, +/* 36641 */ {(13<<2)|2,{98,73,0}}, +/* 36642 */ {(13<<2)|2,{98,73,0}}, +/* 36643 */ {(13<<2)|2,{98,73,0}}, +/* 36644 */ {(13<<2)|2,{98,73,0}}, +/* 36645 */ {(13<<2)|2,{98,73,0}}, +/* 36646 */ {(13<<2)|2,{98,73,0}}, +/* 36647 */ {(13<<2)|2,{98,73,0}}, +/* 36648 */ {(13<<2)|2,{98,74,0}}, +/* 36649 */ {(13<<2)|2,{98,74,0}}, +/* 36650 */ {(13<<2)|2,{98,74,0}}, +/* 36651 */ {(13<<2)|2,{98,74,0}}, +/* 36652 */ {(13<<2)|2,{98,74,0}}, +/* 36653 */ {(13<<2)|2,{98,74,0}}, +/* 36654 */ {(13<<2)|2,{98,74,0}}, +/* 36655 */ {(13<<2)|2,{98,74,0}}, +/* 36656 */ {(13<<2)|2,{98,75,0}}, +/* 36657 */ {(13<<2)|2,{98,75,0}}, +/* 36658 */ {(13<<2)|2,{98,75,0}}, +/* 36659 */ {(13<<2)|2,{98,75,0}}, +/* 36660 */ {(13<<2)|2,{98,75,0}}, +/* 36661 */ {(13<<2)|2,{98,75,0}}, +/* 36662 */ {(13<<2)|2,{98,75,0}}, +/* 36663 */ {(13<<2)|2,{98,75,0}}, +/* 36664 */ {(13<<2)|2,{98,76,0}}, +/* 36665 */ {(13<<2)|2,{98,76,0}}, +/* 36666 */ {(13<<2)|2,{98,76,0}}, +/* 36667 */ {(13<<2)|2,{98,76,0}}, +/* 36668 */ {(13<<2)|2,{98,76,0}}, +/* 36669 */ {(13<<2)|2,{98,76,0}}, +/* 36670 */ {(13<<2)|2,{98,76,0}}, +/* 36671 */ {(13<<2)|2,{98,76,0}}, +/* 36672 */ {(13<<2)|2,{98,77,0}}, +/* 36673 */ {(13<<2)|2,{98,77,0}}, +/* 36674 */ {(13<<2)|2,{98,77,0}}, +/* 36675 */ {(13<<2)|2,{98,77,0}}, +/* 36676 */ {(13<<2)|2,{98,77,0}}, +/* 36677 */ {(13<<2)|2,{98,77,0}}, +/* 36678 */ {(13<<2)|2,{98,77,0}}, +/* 36679 */ {(13<<2)|2,{98,77,0}}, +/* 36680 */ {(13<<2)|2,{98,78,0}}, +/* 36681 */ {(13<<2)|2,{98,78,0}}, +/* 36682 */ {(13<<2)|2,{98,78,0}}, +/* 36683 */ {(13<<2)|2,{98,78,0}}, +/* 36684 */ {(13<<2)|2,{98,78,0}}, +/* 36685 */ {(13<<2)|2,{98,78,0}}, +/* 36686 */ {(13<<2)|2,{98,78,0}}, +/* 36687 */ {(13<<2)|2,{98,78,0}}, +/* 36688 */ {(13<<2)|2,{98,79,0}}, +/* 36689 */ {(13<<2)|2,{98,79,0}}, +/* 36690 */ {(13<<2)|2,{98,79,0}}, +/* 36691 */ {(13<<2)|2,{98,79,0}}, +/* 36692 */ {(13<<2)|2,{98,79,0}}, +/* 36693 */ {(13<<2)|2,{98,79,0}}, +/* 36694 */ {(13<<2)|2,{98,79,0}}, +/* 36695 */ {(13<<2)|2,{98,79,0}}, +/* 36696 */ {(13<<2)|2,{98,80,0}}, +/* 36697 */ {(13<<2)|2,{98,80,0}}, +/* 36698 */ {(13<<2)|2,{98,80,0}}, +/* 36699 */ {(13<<2)|2,{98,80,0}}, +/* 36700 */ {(13<<2)|2,{98,80,0}}, +/* 36701 */ {(13<<2)|2,{98,80,0}}, +/* 36702 */ {(13<<2)|2,{98,80,0}}, +/* 36703 */ {(13<<2)|2,{98,80,0}}, +/* 36704 */ {(13<<2)|2,{98,81,0}}, +/* 36705 */ {(13<<2)|2,{98,81,0}}, +/* 36706 */ {(13<<2)|2,{98,81,0}}, +/* 36707 */ {(13<<2)|2,{98,81,0}}, +/* 36708 */ {(13<<2)|2,{98,81,0}}, +/* 36709 */ {(13<<2)|2,{98,81,0}}, +/* 36710 */ {(13<<2)|2,{98,81,0}}, +/* 36711 */ {(13<<2)|2,{98,81,0}}, +/* 36712 */ {(13<<2)|2,{98,82,0}}, +/* 36713 */ {(13<<2)|2,{98,82,0}}, +/* 36714 */ {(13<<2)|2,{98,82,0}}, +/* 36715 */ {(13<<2)|2,{98,82,0}}, +/* 36716 */ {(13<<2)|2,{98,82,0}}, +/* 36717 */ {(13<<2)|2,{98,82,0}}, +/* 36718 */ {(13<<2)|2,{98,82,0}}, +/* 36719 */ {(13<<2)|2,{98,82,0}}, +/* 36720 */ {(13<<2)|2,{98,83,0}}, +/* 36721 */ {(13<<2)|2,{98,83,0}}, +/* 36722 */ {(13<<2)|2,{98,83,0}}, +/* 36723 */ {(13<<2)|2,{98,83,0}}, +/* 36724 */ {(13<<2)|2,{98,83,0}}, +/* 36725 */ {(13<<2)|2,{98,83,0}}, +/* 36726 */ {(13<<2)|2,{98,83,0}}, +/* 36727 */ {(13<<2)|2,{98,83,0}}, +/* 36728 */ {(13<<2)|2,{98,84,0}}, +/* 36729 */ {(13<<2)|2,{98,84,0}}, +/* 36730 */ {(13<<2)|2,{98,84,0}}, +/* 36731 */ {(13<<2)|2,{98,84,0}}, +/* 36732 */ {(13<<2)|2,{98,84,0}}, +/* 36733 */ {(13<<2)|2,{98,84,0}}, +/* 36734 */ {(13<<2)|2,{98,84,0}}, +/* 36735 */ {(13<<2)|2,{98,84,0}}, +/* 36736 */ {(13<<2)|2,{98,85,0}}, +/* 36737 */ {(13<<2)|2,{98,85,0}}, +/* 36738 */ {(13<<2)|2,{98,85,0}}, +/* 36739 */ {(13<<2)|2,{98,85,0}}, +/* 36740 */ {(13<<2)|2,{98,85,0}}, +/* 36741 */ {(13<<2)|2,{98,85,0}}, +/* 36742 */ {(13<<2)|2,{98,85,0}}, +/* 36743 */ {(13<<2)|2,{98,85,0}}, +/* 36744 */ {(13<<2)|2,{98,86,0}}, +/* 36745 */ {(13<<2)|2,{98,86,0}}, +/* 36746 */ {(13<<2)|2,{98,86,0}}, +/* 36747 */ {(13<<2)|2,{98,86,0}}, +/* 36748 */ {(13<<2)|2,{98,86,0}}, +/* 36749 */ {(13<<2)|2,{98,86,0}}, +/* 36750 */ {(13<<2)|2,{98,86,0}}, +/* 36751 */ {(13<<2)|2,{98,86,0}}, +/* 36752 */ {(13<<2)|2,{98,87,0}}, +/* 36753 */ {(13<<2)|2,{98,87,0}}, +/* 36754 */ {(13<<2)|2,{98,87,0}}, +/* 36755 */ {(13<<2)|2,{98,87,0}}, +/* 36756 */ {(13<<2)|2,{98,87,0}}, +/* 36757 */ {(13<<2)|2,{98,87,0}}, +/* 36758 */ {(13<<2)|2,{98,87,0}}, +/* 36759 */ {(13<<2)|2,{98,87,0}}, +/* 36760 */ {(13<<2)|2,{98,89,0}}, +/* 36761 */ {(13<<2)|2,{98,89,0}}, +/* 36762 */ {(13<<2)|2,{98,89,0}}, +/* 36763 */ {(13<<2)|2,{98,89,0}}, +/* 36764 */ {(13<<2)|2,{98,89,0}}, +/* 36765 */ {(13<<2)|2,{98,89,0}}, +/* 36766 */ {(13<<2)|2,{98,89,0}}, +/* 36767 */ {(13<<2)|2,{98,89,0}}, +/* 36768 */ {(13<<2)|2,{98,106,0}}, +/* 36769 */ {(13<<2)|2,{98,106,0}}, +/* 36770 */ {(13<<2)|2,{98,106,0}}, +/* 36771 */ {(13<<2)|2,{98,106,0}}, +/* 36772 */ {(13<<2)|2,{98,106,0}}, +/* 36773 */ {(13<<2)|2,{98,106,0}}, +/* 36774 */ {(13<<2)|2,{98,106,0}}, +/* 36775 */ {(13<<2)|2,{98,106,0}}, +/* 36776 */ {(13<<2)|2,{98,107,0}}, +/* 36777 */ {(13<<2)|2,{98,107,0}}, +/* 36778 */ {(13<<2)|2,{98,107,0}}, +/* 36779 */ {(13<<2)|2,{98,107,0}}, +/* 36780 */ {(13<<2)|2,{98,107,0}}, +/* 36781 */ {(13<<2)|2,{98,107,0}}, +/* 36782 */ {(13<<2)|2,{98,107,0}}, +/* 36783 */ {(13<<2)|2,{98,107,0}}, +/* 36784 */ {(13<<2)|2,{98,113,0}}, +/* 36785 */ {(13<<2)|2,{98,113,0}}, +/* 36786 */ {(13<<2)|2,{98,113,0}}, +/* 36787 */ {(13<<2)|2,{98,113,0}}, +/* 36788 */ {(13<<2)|2,{98,113,0}}, +/* 36789 */ {(13<<2)|2,{98,113,0}}, +/* 36790 */ {(13<<2)|2,{98,113,0}}, +/* 36791 */ {(13<<2)|2,{98,113,0}}, +/* 36792 */ {(13<<2)|2,{98,118,0}}, +/* 36793 */ {(13<<2)|2,{98,118,0}}, +/* 36794 */ {(13<<2)|2,{98,118,0}}, +/* 36795 */ {(13<<2)|2,{98,118,0}}, +/* 36796 */ {(13<<2)|2,{98,118,0}}, +/* 36797 */ {(13<<2)|2,{98,118,0}}, +/* 36798 */ {(13<<2)|2,{98,118,0}}, +/* 36799 */ {(13<<2)|2,{98,118,0}}, +/* 36800 */ {(13<<2)|2,{98,119,0}}, +/* 36801 */ {(13<<2)|2,{98,119,0}}, +/* 36802 */ {(13<<2)|2,{98,119,0}}, +/* 36803 */ {(13<<2)|2,{98,119,0}}, +/* 36804 */ {(13<<2)|2,{98,119,0}}, +/* 36805 */ {(13<<2)|2,{98,119,0}}, +/* 36806 */ {(13<<2)|2,{98,119,0}}, +/* 36807 */ {(13<<2)|2,{98,119,0}}, +/* 36808 */ {(13<<2)|2,{98,120,0}}, +/* 36809 */ {(13<<2)|2,{98,120,0}}, +/* 36810 */ {(13<<2)|2,{98,120,0}}, +/* 36811 */ {(13<<2)|2,{98,120,0}}, +/* 36812 */ {(13<<2)|2,{98,120,0}}, +/* 36813 */ {(13<<2)|2,{98,120,0}}, +/* 36814 */ {(13<<2)|2,{98,120,0}}, +/* 36815 */ {(13<<2)|2,{98,120,0}}, +/* 36816 */ {(13<<2)|2,{98,121,0}}, +/* 36817 */ {(13<<2)|2,{98,121,0}}, +/* 36818 */ {(13<<2)|2,{98,121,0}}, +/* 36819 */ {(13<<2)|2,{98,121,0}}, +/* 36820 */ {(13<<2)|2,{98,121,0}}, +/* 36821 */ {(13<<2)|2,{98,121,0}}, +/* 36822 */ {(13<<2)|2,{98,121,0}}, +/* 36823 */ {(13<<2)|2,{98,121,0}}, +/* 36824 */ {(13<<2)|2,{98,122,0}}, +/* 36825 */ {(13<<2)|2,{98,122,0}}, +/* 36826 */ {(13<<2)|2,{98,122,0}}, +/* 36827 */ {(13<<2)|2,{98,122,0}}, +/* 36828 */ {(13<<2)|2,{98,122,0}}, +/* 36829 */ {(13<<2)|2,{98,122,0}}, +/* 36830 */ {(13<<2)|2,{98,122,0}}, +/* 36831 */ {(13<<2)|2,{98,122,0}}, +/* 36832 */ {(14<<2)|2,{98,38,0}}, +/* 36833 */ {(14<<2)|2,{98,38,0}}, +/* 36834 */ {(14<<2)|2,{98,38,0}}, +/* 36835 */ {(14<<2)|2,{98,38,0}}, +/* 36836 */ {(14<<2)|2,{98,42,0}}, +/* 36837 */ {(14<<2)|2,{98,42,0}}, +/* 36838 */ {(14<<2)|2,{98,42,0}}, +/* 36839 */ {(14<<2)|2,{98,42,0}}, +/* 36840 */ {(14<<2)|2,{98,44,0}}, +/* 36841 */ {(14<<2)|2,{98,44,0}}, +/* 36842 */ {(14<<2)|2,{98,44,0}}, +/* 36843 */ {(14<<2)|2,{98,44,0}}, +/* 36844 */ {(14<<2)|2,{98,59,0}}, +/* 36845 */ {(14<<2)|2,{98,59,0}}, +/* 36846 */ {(14<<2)|2,{98,59,0}}, +/* 36847 */ {(14<<2)|2,{98,59,0}}, +/* 36848 */ {(14<<2)|2,{98,88,0}}, +/* 36849 */ {(14<<2)|2,{98,88,0}}, +/* 36850 */ {(14<<2)|2,{98,88,0}}, +/* 36851 */ {(14<<2)|2,{98,88,0}}, +/* 36852 */ {(14<<2)|2,{98,90,0}}, +/* 36853 */ {(14<<2)|2,{98,90,0}}, +/* 36854 */ {(14<<2)|2,{98,90,0}}, +/* 36855 */ {(14<<2)|2,{98,90,0}}, +/* 36856 */ {(16<<2)|2,{98,33,0}}, +/* 36857 */ {(16<<2)|2,{98,34,0}}, +/* 36858 */ {(16<<2)|2,{98,40,0}}, +/* 36859 */ {(16<<2)|2,{98,41,0}}, +/* 36860 */ {(16<<2)|2,{98,63,0}}, +/* 36861 */ {(6<<2)|1,{98,0,0}}, +/* 36862 */ {(6<<2)|1,{98,0,0}}, +/* 36863 */ {(6<<2)|1,{98,0,0}}, +/* 36864 */ {(16<<2)|3,{100,48,48}}, +/* 36865 */ {(16<<2)|3,{100,48,49}}, +/* 36866 */ {(16<<2)|3,{100,48,50}}, +/* 36867 */ {(16<<2)|3,{100,48,97}}, +/* 36868 */ {(16<<2)|3,{100,48,99}}, +/* 36869 */ {(16<<2)|3,{100,48,101}}, +/* 36870 */ {(16<<2)|3,{100,48,105}}, +/* 36871 */ {(16<<2)|3,{100,48,111}}, +/* 36872 */ {(16<<2)|3,{100,48,115}}, +/* 36873 */ {(16<<2)|3,{100,48,116}}, +/* 36874 */ {(11<<2)|2,{100,48,0}}, +/* 36875 */ {(11<<2)|2,{100,48,0}}, +/* 36876 */ {(11<<2)|2,{100,48,0}}, +/* 36877 */ {(11<<2)|2,{100,48,0}}, +/* 36878 */ {(11<<2)|2,{100,48,0}}, +/* 36879 */ {(11<<2)|2,{100,48,0}}, +/* 36880 */ {(11<<2)|2,{100,48,0}}, +/* 36881 */ {(11<<2)|2,{100,48,0}}, +/* 36882 */ {(11<<2)|2,{100,48,0}}, +/* 36883 */ {(11<<2)|2,{100,48,0}}, +/* 36884 */ {(11<<2)|2,{100,48,0}}, +/* 36885 */ {(11<<2)|2,{100,48,0}}, +/* 36886 */ {(11<<2)|2,{100,48,0}}, +/* 36887 */ {(11<<2)|2,{100,48,0}}, +/* 36888 */ {(11<<2)|2,{100,48,0}}, +/* 36889 */ {(11<<2)|2,{100,48,0}}, +/* 36890 */ {(11<<2)|2,{100,48,0}}, +/* 36891 */ {(11<<2)|2,{100,48,0}}, +/* 36892 */ {(11<<2)|2,{100,48,0}}, +/* 36893 */ {(11<<2)|2,{100,48,0}}, +/* 36894 */ {(11<<2)|2,{100,48,0}}, +/* 36895 */ {(11<<2)|2,{100,48,0}}, +/* 36896 */ {(16<<2)|3,{100,49,48}}, +/* 36897 */ {(16<<2)|3,{100,49,49}}, +/* 36898 */ {(16<<2)|3,{100,49,50}}, +/* 36899 */ {(16<<2)|3,{100,49,97}}, +/* 36900 */ {(16<<2)|3,{100,49,99}}, +/* 36901 */ {(16<<2)|3,{100,49,101}}, +/* 36902 */ {(16<<2)|3,{100,49,105}}, +/* 36903 */ {(16<<2)|3,{100,49,111}}, +/* 36904 */ {(16<<2)|3,{100,49,115}}, +/* 36905 */ {(16<<2)|3,{100,49,116}}, +/* 36906 */ {(11<<2)|2,{100,49,0}}, +/* 36907 */ {(11<<2)|2,{100,49,0}}, +/* 36908 */ {(11<<2)|2,{100,49,0}}, +/* 36909 */ {(11<<2)|2,{100,49,0}}, +/* 36910 */ {(11<<2)|2,{100,49,0}}, +/* 36911 */ {(11<<2)|2,{100,49,0}}, +/* 36912 */ {(11<<2)|2,{100,49,0}}, +/* 36913 */ {(11<<2)|2,{100,49,0}}, +/* 36914 */ {(11<<2)|2,{100,49,0}}, +/* 36915 */ {(11<<2)|2,{100,49,0}}, +/* 36916 */ {(11<<2)|2,{100,49,0}}, +/* 36917 */ {(11<<2)|2,{100,49,0}}, +/* 36918 */ {(11<<2)|2,{100,49,0}}, +/* 36919 */ {(11<<2)|2,{100,49,0}}, +/* 36920 */ {(11<<2)|2,{100,49,0}}, +/* 36921 */ {(11<<2)|2,{100,49,0}}, +/* 36922 */ {(11<<2)|2,{100,49,0}}, +/* 36923 */ {(11<<2)|2,{100,49,0}}, +/* 36924 */ {(11<<2)|2,{100,49,0}}, +/* 36925 */ {(11<<2)|2,{100,49,0}}, +/* 36926 */ {(11<<2)|2,{100,49,0}}, +/* 36927 */ {(11<<2)|2,{100,49,0}}, +/* 36928 */ {(16<<2)|3,{100,50,48}}, +/* 36929 */ {(16<<2)|3,{100,50,49}}, +/* 36930 */ {(16<<2)|3,{100,50,50}}, +/* 36931 */ {(16<<2)|3,{100,50,97}}, +/* 36932 */ {(16<<2)|3,{100,50,99}}, +/* 36933 */ {(16<<2)|3,{100,50,101}}, +/* 36934 */ {(16<<2)|3,{100,50,105}}, +/* 36935 */ {(16<<2)|3,{100,50,111}}, +/* 36936 */ {(16<<2)|3,{100,50,115}}, +/* 36937 */ {(16<<2)|3,{100,50,116}}, +/* 36938 */ {(11<<2)|2,{100,50,0}}, +/* 36939 */ {(11<<2)|2,{100,50,0}}, +/* 36940 */ {(11<<2)|2,{100,50,0}}, +/* 36941 */ {(11<<2)|2,{100,50,0}}, +/* 36942 */ {(11<<2)|2,{100,50,0}}, +/* 36943 */ {(11<<2)|2,{100,50,0}}, +/* 36944 */ {(11<<2)|2,{100,50,0}}, +/* 36945 */ {(11<<2)|2,{100,50,0}}, +/* 36946 */ {(11<<2)|2,{100,50,0}}, +/* 36947 */ {(11<<2)|2,{100,50,0}}, +/* 36948 */ {(11<<2)|2,{100,50,0}}, +/* 36949 */ {(11<<2)|2,{100,50,0}}, +/* 36950 */ {(11<<2)|2,{100,50,0}}, +/* 36951 */ {(11<<2)|2,{100,50,0}}, +/* 36952 */ {(11<<2)|2,{100,50,0}}, +/* 36953 */ {(11<<2)|2,{100,50,0}}, +/* 36954 */ {(11<<2)|2,{100,50,0}}, +/* 36955 */ {(11<<2)|2,{100,50,0}}, +/* 36956 */ {(11<<2)|2,{100,50,0}}, +/* 36957 */ {(11<<2)|2,{100,50,0}}, +/* 36958 */ {(11<<2)|2,{100,50,0}}, +/* 36959 */ {(11<<2)|2,{100,50,0}}, +/* 36960 */ {(16<<2)|3,{100,97,48}}, +/* 36961 */ {(16<<2)|3,{100,97,49}}, +/* 36962 */ {(16<<2)|3,{100,97,50}}, +/* 36963 */ {(16<<2)|3,{100,97,97}}, +/* 36964 */ {(16<<2)|3,{100,97,99}}, +/* 36965 */ {(16<<2)|3,{100,97,101}}, +/* 36966 */ {(16<<2)|3,{100,97,105}}, +/* 36967 */ {(16<<2)|3,{100,97,111}}, +/* 36968 */ {(16<<2)|3,{100,97,115}}, +/* 36969 */ {(16<<2)|3,{100,97,116}}, +/* 36970 */ {(11<<2)|2,{100,97,0}}, +/* 36971 */ {(11<<2)|2,{100,97,0}}, +/* 36972 */ {(11<<2)|2,{100,97,0}}, +/* 36973 */ {(11<<2)|2,{100,97,0}}, +/* 36974 */ {(11<<2)|2,{100,97,0}}, +/* 36975 */ {(11<<2)|2,{100,97,0}}, +/* 36976 */ {(11<<2)|2,{100,97,0}}, +/* 36977 */ {(11<<2)|2,{100,97,0}}, +/* 36978 */ {(11<<2)|2,{100,97,0}}, +/* 36979 */ {(11<<2)|2,{100,97,0}}, +/* 36980 */ {(11<<2)|2,{100,97,0}}, +/* 36981 */ {(11<<2)|2,{100,97,0}}, +/* 36982 */ {(11<<2)|2,{100,97,0}}, +/* 36983 */ {(11<<2)|2,{100,97,0}}, +/* 36984 */ {(11<<2)|2,{100,97,0}}, +/* 36985 */ {(11<<2)|2,{100,97,0}}, +/* 36986 */ {(11<<2)|2,{100,97,0}}, +/* 36987 */ {(11<<2)|2,{100,97,0}}, +/* 36988 */ {(11<<2)|2,{100,97,0}}, +/* 36989 */ {(11<<2)|2,{100,97,0}}, +/* 36990 */ {(11<<2)|2,{100,97,0}}, +/* 36991 */ {(11<<2)|2,{100,97,0}}, +/* 36992 */ {(16<<2)|3,{100,99,48}}, +/* 36993 */ {(16<<2)|3,{100,99,49}}, +/* 36994 */ {(16<<2)|3,{100,99,50}}, +/* 36995 */ {(16<<2)|3,{100,99,97}}, +/* 36996 */ {(16<<2)|3,{100,99,99}}, +/* 36997 */ {(16<<2)|3,{100,99,101}}, +/* 36998 */ {(16<<2)|3,{100,99,105}}, +/* 36999 */ {(16<<2)|3,{100,99,111}}, +/* 37000 */ {(16<<2)|3,{100,99,115}}, +/* 37001 */ {(16<<2)|3,{100,99,116}}, +/* 37002 */ {(11<<2)|2,{100,99,0}}, +/* 37003 */ {(11<<2)|2,{100,99,0}}, +/* 37004 */ {(11<<2)|2,{100,99,0}}, +/* 37005 */ {(11<<2)|2,{100,99,0}}, +/* 37006 */ {(11<<2)|2,{100,99,0}}, +/* 37007 */ {(11<<2)|2,{100,99,0}}, +/* 37008 */ {(11<<2)|2,{100,99,0}}, +/* 37009 */ {(11<<2)|2,{100,99,0}}, +/* 37010 */ {(11<<2)|2,{100,99,0}}, +/* 37011 */ {(11<<2)|2,{100,99,0}}, +/* 37012 */ {(11<<2)|2,{100,99,0}}, +/* 37013 */ {(11<<2)|2,{100,99,0}}, +/* 37014 */ {(11<<2)|2,{100,99,0}}, +/* 37015 */ {(11<<2)|2,{100,99,0}}, +/* 37016 */ {(11<<2)|2,{100,99,0}}, +/* 37017 */ {(11<<2)|2,{100,99,0}}, +/* 37018 */ {(11<<2)|2,{100,99,0}}, +/* 37019 */ {(11<<2)|2,{100,99,0}}, +/* 37020 */ {(11<<2)|2,{100,99,0}}, +/* 37021 */ {(11<<2)|2,{100,99,0}}, +/* 37022 */ {(11<<2)|2,{100,99,0}}, +/* 37023 */ {(11<<2)|2,{100,99,0}}, +/* 37024 */ {(16<<2)|3,{100,101,48}}, +/* 37025 */ {(16<<2)|3,{100,101,49}}, +/* 37026 */ {(16<<2)|3,{100,101,50}}, +/* 37027 */ {(16<<2)|3,{100,101,97}}, +/* 37028 */ {(16<<2)|3,{100,101,99}}, +/* 37029 */ {(16<<2)|3,{100,101,101}}, +/* 37030 */ {(16<<2)|3,{100,101,105}}, +/* 37031 */ {(16<<2)|3,{100,101,111}}, +/* 37032 */ {(16<<2)|3,{100,101,115}}, +/* 37033 */ {(16<<2)|3,{100,101,116}}, +/* 37034 */ {(11<<2)|2,{100,101,0}}, +/* 37035 */ {(11<<2)|2,{100,101,0}}, +/* 37036 */ {(11<<2)|2,{100,101,0}}, +/* 37037 */ {(11<<2)|2,{100,101,0}}, +/* 37038 */ {(11<<2)|2,{100,101,0}}, +/* 37039 */ {(11<<2)|2,{100,101,0}}, +/* 37040 */ {(11<<2)|2,{100,101,0}}, +/* 37041 */ {(11<<2)|2,{100,101,0}}, +/* 37042 */ {(11<<2)|2,{100,101,0}}, +/* 37043 */ {(11<<2)|2,{100,101,0}}, +/* 37044 */ {(11<<2)|2,{100,101,0}}, +/* 37045 */ {(11<<2)|2,{100,101,0}}, +/* 37046 */ {(11<<2)|2,{100,101,0}}, +/* 37047 */ {(11<<2)|2,{100,101,0}}, +/* 37048 */ {(11<<2)|2,{100,101,0}}, +/* 37049 */ {(11<<2)|2,{100,101,0}}, +/* 37050 */ {(11<<2)|2,{100,101,0}}, +/* 37051 */ {(11<<2)|2,{100,101,0}}, +/* 37052 */ {(11<<2)|2,{100,101,0}}, +/* 37053 */ {(11<<2)|2,{100,101,0}}, +/* 37054 */ {(11<<2)|2,{100,101,0}}, +/* 37055 */ {(11<<2)|2,{100,101,0}}, +/* 37056 */ {(16<<2)|3,{100,105,48}}, +/* 37057 */ {(16<<2)|3,{100,105,49}}, +/* 37058 */ {(16<<2)|3,{100,105,50}}, +/* 37059 */ {(16<<2)|3,{100,105,97}}, +/* 37060 */ {(16<<2)|3,{100,105,99}}, +/* 37061 */ {(16<<2)|3,{100,105,101}}, +/* 37062 */ {(16<<2)|3,{100,105,105}}, +/* 37063 */ {(16<<2)|3,{100,105,111}}, +/* 37064 */ {(16<<2)|3,{100,105,115}}, +/* 37065 */ {(16<<2)|3,{100,105,116}}, +/* 37066 */ {(11<<2)|2,{100,105,0}}, +/* 37067 */ {(11<<2)|2,{100,105,0}}, +/* 37068 */ {(11<<2)|2,{100,105,0}}, +/* 37069 */ {(11<<2)|2,{100,105,0}}, +/* 37070 */ {(11<<2)|2,{100,105,0}}, +/* 37071 */ {(11<<2)|2,{100,105,0}}, +/* 37072 */ {(11<<2)|2,{100,105,0}}, +/* 37073 */ {(11<<2)|2,{100,105,0}}, +/* 37074 */ {(11<<2)|2,{100,105,0}}, +/* 37075 */ {(11<<2)|2,{100,105,0}}, +/* 37076 */ {(11<<2)|2,{100,105,0}}, +/* 37077 */ {(11<<2)|2,{100,105,0}}, +/* 37078 */ {(11<<2)|2,{100,105,0}}, +/* 37079 */ {(11<<2)|2,{100,105,0}}, +/* 37080 */ {(11<<2)|2,{100,105,0}}, +/* 37081 */ {(11<<2)|2,{100,105,0}}, +/* 37082 */ {(11<<2)|2,{100,105,0}}, +/* 37083 */ {(11<<2)|2,{100,105,0}}, +/* 37084 */ {(11<<2)|2,{100,105,0}}, +/* 37085 */ {(11<<2)|2,{100,105,0}}, +/* 37086 */ {(11<<2)|2,{100,105,0}}, +/* 37087 */ {(11<<2)|2,{100,105,0}}, +/* 37088 */ {(16<<2)|3,{100,111,48}}, +/* 37089 */ {(16<<2)|3,{100,111,49}}, +/* 37090 */ {(16<<2)|3,{100,111,50}}, +/* 37091 */ {(16<<2)|3,{100,111,97}}, +/* 37092 */ {(16<<2)|3,{100,111,99}}, +/* 37093 */ {(16<<2)|3,{100,111,101}}, +/* 37094 */ {(16<<2)|3,{100,111,105}}, +/* 37095 */ {(16<<2)|3,{100,111,111}}, +/* 37096 */ {(16<<2)|3,{100,111,115}}, +/* 37097 */ {(16<<2)|3,{100,111,116}}, +/* 37098 */ {(11<<2)|2,{100,111,0}}, +/* 37099 */ {(11<<2)|2,{100,111,0}}, +/* 37100 */ {(11<<2)|2,{100,111,0}}, +/* 37101 */ {(11<<2)|2,{100,111,0}}, +/* 37102 */ {(11<<2)|2,{100,111,0}}, +/* 37103 */ {(11<<2)|2,{100,111,0}}, +/* 37104 */ {(11<<2)|2,{100,111,0}}, +/* 37105 */ {(11<<2)|2,{100,111,0}}, +/* 37106 */ {(11<<2)|2,{100,111,0}}, +/* 37107 */ {(11<<2)|2,{100,111,0}}, +/* 37108 */ {(11<<2)|2,{100,111,0}}, +/* 37109 */ {(11<<2)|2,{100,111,0}}, +/* 37110 */ {(11<<2)|2,{100,111,0}}, +/* 37111 */ {(11<<2)|2,{100,111,0}}, +/* 37112 */ {(11<<2)|2,{100,111,0}}, +/* 37113 */ {(11<<2)|2,{100,111,0}}, +/* 37114 */ {(11<<2)|2,{100,111,0}}, +/* 37115 */ {(11<<2)|2,{100,111,0}}, +/* 37116 */ {(11<<2)|2,{100,111,0}}, +/* 37117 */ {(11<<2)|2,{100,111,0}}, +/* 37118 */ {(11<<2)|2,{100,111,0}}, +/* 37119 */ {(11<<2)|2,{100,111,0}}, +/* 37120 */ {(16<<2)|3,{100,115,48}}, +/* 37121 */ {(16<<2)|3,{100,115,49}}, +/* 37122 */ {(16<<2)|3,{100,115,50}}, +/* 37123 */ {(16<<2)|3,{100,115,97}}, +/* 37124 */ {(16<<2)|3,{100,115,99}}, +/* 37125 */ {(16<<2)|3,{100,115,101}}, +/* 37126 */ {(16<<2)|3,{100,115,105}}, +/* 37127 */ {(16<<2)|3,{100,115,111}}, +/* 37128 */ {(16<<2)|3,{100,115,115}}, +/* 37129 */ {(16<<2)|3,{100,115,116}}, +/* 37130 */ {(11<<2)|2,{100,115,0}}, +/* 37131 */ {(11<<2)|2,{100,115,0}}, +/* 37132 */ {(11<<2)|2,{100,115,0}}, +/* 37133 */ {(11<<2)|2,{100,115,0}}, +/* 37134 */ {(11<<2)|2,{100,115,0}}, +/* 37135 */ {(11<<2)|2,{100,115,0}}, +/* 37136 */ {(11<<2)|2,{100,115,0}}, +/* 37137 */ {(11<<2)|2,{100,115,0}}, +/* 37138 */ {(11<<2)|2,{100,115,0}}, +/* 37139 */ {(11<<2)|2,{100,115,0}}, +/* 37140 */ {(11<<2)|2,{100,115,0}}, +/* 37141 */ {(11<<2)|2,{100,115,0}}, +/* 37142 */ {(11<<2)|2,{100,115,0}}, +/* 37143 */ {(11<<2)|2,{100,115,0}}, +/* 37144 */ {(11<<2)|2,{100,115,0}}, +/* 37145 */ {(11<<2)|2,{100,115,0}}, +/* 37146 */ {(11<<2)|2,{100,115,0}}, +/* 37147 */ {(11<<2)|2,{100,115,0}}, +/* 37148 */ {(11<<2)|2,{100,115,0}}, +/* 37149 */ {(11<<2)|2,{100,115,0}}, +/* 37150 */ {(11<<2)|2,{100,115,0}}, +/* 37151 */ {(11<<2)|2,{100,115,0}}, +/* 37152 */ {(16<<2)|3,{100,116,48}}, +/* 37153 */ {(16<<2)|3,{100,116,49}}, +/* 37154 */ {(16<<2)|3,{100,116,50}}, +/* 37155 */ {(16<<2)|3,{100,116,97}}, +/* 37156 */ {(16<<2)|3,{100,116,99}}, +/* 37157 */ {(16<<2)|3,{100,116,101}}, +/* 37158 */ {(16<<2)|3,{100,116,105}}, +/* 37159 */ {(16<<2)|3,{100,116,111}}, +/* 37160 */ {(16<<2)|3,{100,116,115}}, +/* 37161 */ {(16<<2)|3,{100,116,116}}, +/* 37162 */ {(11<<2)|2,{100,116,0}}, +/* 37163 */ {(11<<2)|2,{100,116,0}}, +/* 37164 */ {(11<<2)|2,{100,116,0}}, +/* 37165 */ {(11<<2)|2,{100,116,0}}, +/* 37166 */ {(11<<2)|2,{100,116,0}}, +/* 37167 */ {(11<<2)|2,{100,116,0}}, +/* 37168 */ {(11<<2)|2,{100,116,0}}, +/* 37169 */ {(11<<2)|2,{100,116,0}}, +/* 37170 */ {(11<<2)|2,{100,116,0}}, +/* 37171 */ {(11<<2)|2,{100,116,0}}, +/* 37172 */ {(11<<2)|2,{100,116,0}}, +/* 37173 */ {(11<<2)|2,{100,116,0}}, +/* 37174 */ {(11<<2)|2,{100,116,0}}, +/* 37175 */ {(11<<2)|2,{100,116,0}}, +/* 37176 */ {(11<<2)|2,{100,116,0}}, +/* 37177 */ {(11<<2)|2,{100,116,0}}, +/* 37178 */ {(11<<2)|2,{100,116,0}}, +/* 37179 */ {(11<<2)|2,{100,116,0}}, +/* 37180 */ {(11<<2)|2,{100,116,0}}, +/* 37181 */ {(11<<2)|2,{100,116,0}}, +/* 37182 */ {(11<<2)|2,{100,116,0}}, +/* 37183 */ {(11<<2)|2,{100,116,0}}, +/* 37184 */ {(12<<2)|2,{100,32,0}}, +/* 37185 */ {(12<<2)|2,{100,32,0}}, +/* 37186 */ {(12<<2)|2,{100,32,0}}, +/* 37187 */ {(12<<2)|2,{100,32,0}}, +/* 37188 */ {(12<<2)|2,{100,32,0}}, +/* 37189 */ {(12<<2)|2,{100,32,0}}, +/* 37190 */ {(12<<2)|2,{100,32,0}}, +/* 37191 */ {(12<<2)|2,{100,32,0}}, +/* 37192 */ {(12<<2)|2,{100,32,0}}, +/* 37193 */ {(12<<2)|2,{100,32,0}}, +/* 37194 */ {(12<<2)|2,{100,32,0}}, +/* 37195 */ {(12<<2)|2,{100,32,0}}, +/* 37196 */ {(12<<2)|2,{100,32,0}}, +/* 37197 */ {(12<<2)|2,{100,32,0}}, +/* 37198 */ {(12<<2)|2,{100,32,0}}, +/* 37199 */ {(12<<2)|2,{100,32,0}}, +/* 37200 */ {(12<<2)|2,{100,37,0}}, +/* 37201 */ {(12<<2)|2,{100,37,0}}, +/* 37202 */ {(12<<2)|2,{100,37,0}}, +/* 37203 */ {(12<<2)|2,{100,37,0}}, +/* 37204 */ {(12<<2)|2,{100,37,0}}, +/* 37205 */ {(12<<2)|2,{100,37,0}}, +/* 37206 */ {(12<<2)|2,{100,37,0}}, +/* 37207 */ {(12<<2)|2,{100,37,0}}, +/* 37208 */ {(12<<2)|2,{100,37,0}}, +/* 37209 */ {(12<<2)|2,{100,37,0}}, +/* 37210 */ {(12<<2)|2,{100,37,0}}, +/* 37211 */ {(12<<2)|2,{100,37,0}}, +/* 37212 */ {(12<<2)|2,{100,37,0}}, +/* 37213 */ {(12<<2)|2,{100,37,0}}, +/* 37214 */ {(12<<2)|2,{100,37,0}}, +/* 37215 */ {(12<<2)|2,{100,37,0}}, +/* 37216 */ {(12<<2)|2,{100,45,0}}, +/* 37217 */ {(12<<2)|2,{100,45,0}}, +/* 37218 */ {(12<<2)|2,{100,45,0}}, +/* 37219 */ {(12<<2)|2,{100,45,0}}, +/* 37220 */ {(12<<2)|2,{100,45,0}}, +/* 37221 */ {(12<<2)|2,{100,45,0}}, +/* 37222 */ {(12<<2)|2,{100,45,0}}, +/* 37223 */ {(12<<2)|2,{100,45,0}}, +/* 37224 */ {(12<<2)|2,{100,45,0}}, +/* 37225 */ {(12<<2)|2,{100,45,0}}, +/* 37226 */ {(12<<2)|2,{100,45,0}}, +/* 37227 */ {(12<<2)|2,{100,45,0}}, +/* 37228 */ {(12<<2)|2,{100,45,0}}, +/* 37229 */ {(12<<2)|2,{100,45,0}}, +/* 37230 */ {(12<<2)|2,{100,45,0}}, +/* 37231 */ {(12<<2)|2,{100,45,0}}, +/* 37232 */ {(12<<2)|2,{100,46,0}}, +/* 37233 */ {(12<<2)|2,{100,46,0}}, +/* 37234 */ {(12<<2)|2,{100,46,0}}, +/* 37235 */ {(12<<2)|2,{100,46,0}}, +/* 37236 */ {(12<<2)|2,{100,46,0}}, +/* 37237 */ {(12<<2)|2,{100,46,0}}, +/* 37238 */ {(12<<2)|2,{100,46,0}}, +/* 37239 */ {(12<<2)|2,{100,46,0}}, +/* 37240 */ {(12<<2)|2,{100,46,0}}, +/* 37241 */ {(12<<2)|2,{100,46,0}}, +/* 37242 */ {(12<<2)|2,{100,46,0}}, +/* 37243 */ {(12<<2)|2,{100,46,0}}, +/* 37244 */ {(12<<2)|2,{100,46,0}}, +/* 37245 */ {(12<<2)|2,{100,46,0}}, +/* 37246 */ {(12<<2)|2,{100,46,0}}, +/* 37247 */ {(12<<2)|2,{100,46,0}}, +/* 37248 */ {(12<<2)|2,{100,47,0}}, +/* 37249 */ {(12<<2)|2,{100,47,0}}, +/* 37250 */ {(12<<2)|2,{100,47,0}}, +/* 37251 */ {(12<<2)|2,{100,47,0}}, +/* 37252 */ {(12<<2)|2,{100,47,0}}, +/* 37253 */ {(12<<2)|2,{100,47,0}}, +/* 37254 */ {(12<<2)|2,{100,47,0}}, +/* 37255 */ {(12<<2)|2,{100,47,0}}, +/* 37256 */ {(12<<2)|2,{100,47,0}}, +/* 37257 */ {(12<<2)|2,{100,47,0}}, +/* 37258 */ {(12<<2)|2,{100,47,0}}, +/* 37259 */ {(12<<2)|2,{100,47,0}}, +/* 37260 */ {(12<<2)|2,{100,47,0}}, +/* 37261 */ {(12<<2)|2,{100,47,0}}, +/* 37262 */ {(12<<2)|2,{100,47,0}}, +/* 37263 */ {(12<<2)|2,{100,47,0}}, +/* 37264 */ {(12<<2)|2,{100,51,0}}, +/* 37265 */ {(12<<2)|2,{100,51,0}}, +/* 37266 */ {(12<<2)|2,{100,51,0}}, +/* 37267 */ {(12<<2)|2,{100,51,0}}, +/* 37268 */ {(12<<2)|2,{100,51,0}}, +/* 37269 */ {(12<<2)|2,{100,51,0}}, +/* 37270 */ {(12<<2)|2,{100,51,0}}, +/* 37271 */ {(12<<2)|2,{100,51,0}}, +/* 37272 */ {(12<<2)|2,{100,51,0}}, +/* 37273 */ {(12<<2)|2,{100,51,0}}, +/* 37274 */ {(12<<2)|2,{100,51,0}}, +/* 37275 */ {(12<<2)|2,{100,51,0}}, +/* 37276 */ {(12<<2)|2,{100,51,0}}, +/* 37277 */ {(12<<2)|2,{100,51,0}}, +/* 37278 */ {(12<<2)|2,{100,51,0}}, +/* 37279 */ {(12<<2)|2,{100,51,0}}, +/* 37280 */ {(12<<2)|2,{100,52,0}}, +/* 37281 */ {(12<<2)|2,{100,52,0}}, +/* 37282 */ {(12<<2)|2,{100,52,0}}, +/* 37283 */ {(12<<2)|2,{100,52,0}}, +/* 37284 */ {(12<<2)|2,{100,52,0}}, +/* 37285 */ {(12<<2)|2,{100,52,0}}, +/* 37286 */ {(12<<2)|2,{100,52,0}}, +/* 37287 */ {(12<<2)|2,{100,52,0}}, +/* 37288 */ {(12<<2)|2,{100,52,0}}, +/* 37289 */ {(12<<2)|2,{100,52,0}}, +/* 37290 */ {(12<<2)|2,{100,52,0}}, +/* 37291 */ {(12<<2)|2,{100,52,0}}, +/* 37292 */ {(12<<2)|2,{100,52,0}}, +/* 37293 */ {(12<<2)|2,{100,52,0}}, +/* 37294 */ {(12<<2)|2,{100,52,0}}, +/* 37295 */ {(12<<2)|2,{100,52,0}}, +/* 37296 */ {(12<<2)|2,{100,53,0}}, +/* 37297 */ {(12<<2)|2,{100,53,0}}, +/* 37298 */ {(12<<2)|2,{100,53,0}}, +/* 37299 */ {(12<<2)|2,{100,53,0}}, +/* 37300 */ {(12<<2)|2,{100,53,0}}, +/* 37301 */ {(12<<2)|2,{100,53,0}}, +/* 37302 */ {(12<<2)|2,{100,53,0}}, +/* 37303 */ {(12<<2)|2,{100,53,0}}, +/* 37304 */ {(12<<2)|2,{100,53,0}}, +/* 37305 */ {(12<<2)|2,{100,53,0}}, +/* 37306 */ {(12<<2)|2,{100,53,0}}, +/* 37307 */ {(12<<2)|2,{100,53,0}}, +/* 37308 */ {(12<<2)|2,{100,53,0}}, +/* 37309 */ {(12<<2)|2,{100,53,0}}, +/* 37310 */ {(12<<2)|2,{100,53,0}}, +/* 37311 */ {(12<<2)|2,{100,53,0}}, +/* 37312 */ {(12<<2)|2,{100,54,0}}, +/* 37313 */ {(12<<2)|2,{100,54,0}}, +/* 37314 */ {(12<<2)|2,{100,54,0}}, +/* 37315 */ {(12<<2)|2,{100,54,0}}, +/* 37316 */ {(12<<2)|2,{100,54,0}}, +/* 37317 */ {(12<<2)|2,{100,54,0}}, +/* 37318 */ {(12<<2)|2,{100,54,0}}, +/* 37319 */ {(12<<2)|2,{100,54,0}}, +/* 37320 */ {(12<<2)|2,{100,54,0}}, +/* 37321 */ {(12<<2)|2,{100,54,0}}, +/* 37322 */ {(12<<2)|2,{100,54,0}}, +/* 37323 */ {(12<<2)|2,{100,54,0}}, +/* 37324 */ {(12<<2)|2,{100,54,0}}, +/* 37325 */ {(12<<2)|2,{100,54,0}}, +/* 37326 */ {(12<<2)|2,{100,54,0}}, +/* 37327 */ {(12<<2)|2,{100,54,0}}, +/* 37328 */ {(12<<2)|2,{100,55,0}}, +/* 37329 */ {(12<<2)|2,{100,55,0}}, +/* 37330 */ {(12<<2)|2,{100,55,0}}, +/* 37331 */ {(12<<2)|2,{100,55,0}}, +/* 37332 */ {(12<<2)|2,{100,55,0}}, +/* 37333 */ {(12<<2)|2,{100,55,0}}, +/* 37334 */ {(12<<2)|2,{100,55,0}}, +/* 37335 */ {(12<<2)|2,{100,55,0}}, +/* 37336 */ {(12<<2)|2,{100,55,0}}, +/* 37337 */ {(12<<2)|2,{100,55,0}}, +/* 37338 */ {(12<<2)|2,{100,55,0}}, +/* 37339 */ {(12<<2)|2,{100,55,0}}, +/* 37340 */ {(12<<2)|2,{100,55,0}}, +/* 37341 */ {(12<<2)|2,{100,55,0}}, +/* 37342 */ {(12<<2)|2,{100,55,0}}, +/* 37343 */ {(12<<2)|2,{100,55,0}}, +/* 37344 */ {(12<<2)|2,{100,56,0}}, +/* 37345 */ {(12<<2)|2,{100,56,0}}, +/* 37346 */ {(12<<2)|2,{100,56,0}}, +/* 37347 */ {(12<<2)|2,{100,56,0}}, +/* 37348 */ {(12<<2)|2,{100,56,0}}, +/* 37349 */ {(12<<2)|2,{100,56,0}}, +/* 37350 */ {(12<<2)|2,{100,56,0}}, +/* 37351 */ {(12<<2)|2,{100,56,0}}, +/* 37352 */ {(12<<2)|2,{100,56,0}}, +/* 37353 */ {(12<<2)|2,{100,56,0}}, +/* 37354 */ {(12<<2)|2,{100,56,0}}, +/* 37355 */ {(12<<2)|2,{100,56,0}}, +/* 37356 */ {(12<<2)|2,{100,56,0}}, +/* 37357 */ {(12<<2)|2,{100,56,0}}, +/* 37358 */ {(12<<2)|2,{100,56,0}}, +/* 37359 */ {(12<<2)|2,{100,56,0}}, +/* 37360 */ {(12<<2)|2,{100,57,0}}, +/* 37361 */ {(12<<2)|2,{100,57,0}}, +/* 37362 */ {(12<<2)|2,{100,57,0}}, +/* 37363 */ {(12<<2)|2,{100,57,0}}, +/* 37364 */ {(12<<2)|2,{100,57,0}}, +/* 37365 */ {(12<<2)|2,{100,57,0}}, +/* 37366 */ {(12<<2)|2,{100,57,0}}, +/* 37367 */ {(12<<2)|2,{100,57,0}}, +/* 37368 */ {(12<<2)|2,{100,57,0}}, +/* 37369 */ {(12<<2)|2,{100,57,0}}, +/* 37370 */ {(12<<2)|2,{100,57,0}}, +/* 37371 */ {(12<<2)|2,{100,57,0}}, +/* 37372 */ {(12<<2)|2,{100,57,0}}, +/* 37373 */ {(12<<2)|2,{100,57,0}}, +/* 37374 */ {(12<<2)|2,{100,57,0}}, +/* 37375 */ {(12<<2)|2,{100,57,0}}, +/* 37376 */ {(12<<2)|2,{100,61,0}}, +/* 37377 */ {(12<<2)|2,{100,61,0}}, +/* 37378 */ {(12<<2)|2,{100,61,0}}, +/* 37379 */ {(12<<2)|2,{100,61,0}}, +/* 37380 */ {(12<<2)|2,{100,61,0}}, +/* 37381 */ {(12<<2)|2,{100,61,0}}, +/* 37382 */ {(12<<2)|2,{100,61,0}}, +/* 37383 */ {(12<<2)|2,{100,61,0}}, +/* 37384 */ {(12<<2)|2,{100,61,0}}, +/* 37385 */ {(12<<2)|2,{100,61,0}}, +/* 37386 */ {(12<<2)|2,{100,61,0}}, +/* 37387 */ {(12<<2)|2,{100,61,0}}, +/* 37388 */ {(12<<2)|2,{100,61,0}}, +/* 37389 */ {(12<<2)|2,{100,61,0}}, +/* 37390 */ {(12<<2)|2,{100,61,0}}, +/* 37391 */ {(12<<2)|2,{100,61,0}}, +/* 37392 */ {(12<<2)|2,{100,65,0}}, +/* 37393 */ {(12<<2)|2,{100,65,0}}, +/* 37394 */ {(12<<2)|2,{100,65,0}}, +/* 37395 */ {(12<<2)|2,{100,65,0}}, +/* 37396 */ {(12<<2)|2,{100,65,0}}, +/* 37397 */ {(12<<2)|2,{100,65,0}}, +/* 37398 */ {(12<<2)|2,{100,65,0}}, +/* 37399 */ {(12<<2)|2,{100,65,0}}, +/* 37400 */ {(12<<2)|2,{100,65,0}}, +/* 37401 */ {(12<<2)|2,{100,65,0}}, +/* 37402 */ {(12<<2)|2,{100,65,0}}, +/* 37403 */ {(12<<2)|2,{100,65,0}}, +/* 37404 */ {(12<<2)|2,{100,65,0}}, +/* 37405 */ {(12<<2)|2,{100,65,0}}, +/* 37406 */ {(12<<2)|2,{100,65,0}}, +/* 37407 */ {(12<<2)|2,{100,65,0}}, +/* 37408 */ {(12<<2)|2,{100,95,0}}, +/* 37409 */ {(12<<2)|2,{100,95,0}}, +/* 37410 */ {(12<<2)|2,{100,95,0}}, +/* 37411 */ {(12<<2)|2,{100,95,0}}, +/* 37412 */ {(12<<2)|2,{100,95,0}}, +/* 37413 */ {(12<<2)|2,{100,95,0}}, +/* 37414 */ {(12<<2)|2,{100,95,0}}, +/* 37415 */ {(12<<2)|2,{100,95,0}}, +/* 37416 */ {(12<<2)|2,{100,95,0}}, +/* 37417 */ {(12<<2)|2,{100,95,0}}, +/* 37418 */ {(12<<2)|2,{100,95,0}}, +/* 37419 */ {(12<<2)|2,{100,95,0}}, +/* 37420 */ {(12<<2)|2,{100,95,0}}, +/* 37421 */ {(12<<2)|2,{100,95,0}}, +/* 37422 */ {(12<<2)|2,{100,95,0}}, +/* 37423 */ {(12<<2)|2,{100,95,0}}, +/* 37424 */ {(12<<2)|2,{100,98,0}}, +/* 37425 */ {(12<<2)|2,{100,98,0}}, +/* 37426 */ {(12<<2)|2,{100,98,0}}, +/* 37427 */ {(12<<2)|2,{100,98,0}}, +/* 37428 */ {(12<<2)|2,{100,98,0}}, +/* 37429 */ {(12<<2)|2,{100,98,0}}, +/* 37430 */ {(12<<2)|2,{100,98,0}}, +/* 37431 */ {(12<<2)|2,{100,98,0}}, +/* 37432 */ {(12<<2)|2,{100,98,0}}, +/* 37433 */ {(12<<2)|2,{100,98,0}}, +/* 37434 */ {(12<<2)|2,{100,98,0}}, +/* 37435 */ {(12<<2)|2,{100,98,0}}, +/* 37436 */ {(12<<2)|2,{100,98,0}}, +/* 37437 */ {(12<<2)|2,{100,98,0}}, +/* 37438 */ {(12<<2)|2,{100,98,0}}, +/* 37439 */ {(12<<2)|2,{100,98,0}}, +/* 37440 */ {(12<<2)|2,{100,100,0}}, +/* 37441 */ {(12<<2)|2,{100,100,0}}, +/* 37442 */ {(12<<2)|2,{100,100,0}}, +/* 37443 */ {(12<<2)|2,{100,100,0}}, +/* 37444 */ {(12<<2)|2,{100,100,0}}, +/* 37445 */ {(12<<2)|2,{100,100,0}}, +/* 37446 */ {(12<<2)|2,{100,100,0}}, +/* 37447 */ {(12<<2)|2,{100,100,0}}, +/* 37448 */ {(12<<2)|2,{100,100,0}}, +/* 37449 */ {(12<<2)|2,{100,100,0}}, +/* 37450 */ {(12<<2)|2,{100,100,0}}, +/* 37451 */ {(12<<2)|2,{100,100,0}}, +/* 37452 */ {(12<<2)|2,{100,100,0}}, +/* 37453 */ {(12<<2)|2,{100,100,0}}, +/* 37454 */ {(12<<2)|2,{100,100,0}}, +/* 37455 */ {(12<<2)|2,{100,100,0}}, +/* 37456 */ {(12<<2)|2,{100,102,0}}, +/* 37457 */ {(12<<2)|2,{100,102,0}}, +/* 37458 */ {(12<<2)|2,{100,102,0}}, +/* 37459 */ {(12<<2)|2,{100,102,0}}, +/* 37460 */ {(12<<2)|2,{100,102,0}}, +/* 37461 */ {(12<<2)|2,{100,102,0}}, +/* 37462 */ {(12<<2)|2,{100,102,0}}, +/* 37463 */ {(12<<2)|2,{100,102,0}}, +/* 37464 */ {(12<<2)|2,{100,102,0}}, +/* 37465 */ {(12<<2)|2,{100,102,0}}, +/* 37466 */ {(12<<2)|2,{100,102,0}}, +/* 37467 */ {(12<<2)|2,{100,102,0}}, +/* 37468 */ {(12<<2)|2,{100,102,0}}, +/* 37469 */ {(12<<2)|2,{100,102,0}}, +/* 37470 */ {(12<<2)|2,{100,102,0}}, +/* 37471 */ {(12<<2)|2,{100,102,0}}, +/* 37472 */ {(12<<2)|2,{100,103,0}}, +/* 37473 */ {(12<<2)|2,{100,103,0}}, +/* 37474 */ {(12<<2)|2,{100,103,0}}, +/* 37475 */ {(12<<2)|2,{100,103,0}}, +/* 37476 */ {(12<<2)|2,{100,103,0}}, +/* 37477 */ {(12<<2)|2,{100,103,0}}, +/* 37478 */ {(12<<2)|2,{100,103,0}}, +/* 37479 */ {(12<<2)|2,{100,103,0}}, +/* 37480 */ {(12<<2)|2,{100,103,0}}, +/* 37481 */ {(12<<2)|2,{100,103,0}}, +/* 37482 */ {(12<<2)|2,{100,103,0}}, +/* 37483 */ {(12<<2)|2,{100,103,0}}, +/* 37484 */ {(12<<2)|2,{100,103,0}}, +/* 37485 */ {(12<<2)|2,{100,103,0}}, +/* 37486 */ {(12<<2)|2,{100,103,0}}, +/* 37487 */ {(12<<2)|2,{100,103,0}}, +/* 37488 */ {(12<<2)|2,{100,104,0}}, +/* 37489 */ {(12<<2)|2,{100,104,0}}, +/* 37490 */ {(12<<2)|2,{100,104,0}}, +/* 37491 */ {(12<<2)|2,{100,104,0}}, +/* 37492 */ {(12<<2)|2,{100,104,0}}, +/* 37493 */ {(12<<2)|2,{100,104,0}}, +/* 37494 */ {(12<<2)|2,{100,104,0}}, +/* 37495 */ {(12<<2)|2,{100,104,0}}, +/* 37496 */ {(12<<2)|2,{100,104,0}}, +/* 37497 */ {(12<<2)|2,{100,104,0}}, +/* 37498 */ {(12<<2)|2,{100,104,0}}, +/* 37499 */ {(12<<2)|2,{100,104,0}}, +/* 37500 */ {(12<<2)|2,{100,104,0}}, +/* 37501 */ {(12<<2)|2,{100,104,0}}, +/* 37502 */ {(12<<2)|2,{100,104,0}}, +/* 37503 */ {(12<<2)|2,{100,104,0}}, +/* 37504 */ {(12<<2)|2,{100,108,0}}, +/* 37505 */ {(12<<2)|2,{100,108,0}}, +/* 37506 */ {(12<<2)|2,{100,108,0}}, +/* 37507 */ {(12<<2)|2,{100,108,0}}, +/* 37508 */ {(12<<2)|2,{100,108,0}}, +/* 37509 */ {(12<<2)|2,{100,108,0}}, +/* 37510 */ {(12<<2)|2,{100,108,0}}, +/* 37511 */ {(12<<2)|2,{100,108,0}}, +/* 37512 */ {(12<<2)|2,{100,108,0}}, +/* 37513 */ {(12<<2)|2,{100,108,0}}, +/* 37514 */ {(12<<2)|2,{100,108,0}}, +/* 37515 */ {(12<<2)|2,{100,108,0}}, +/* 37516 */ {(12<<2)|2,{100,108,0}}, +/* 37517 */ {(12<<2)|2,{100,108,0}}, +/* 37518 */ {(12<<2)|2,{100,108,0}}, +/* 37519 */ {(12<<2)|2,{100,108,0}}, +/* 37520 */ {(12<<2)|2,{100,109,0}}, +/* 37521 */ {(12<<2)|2,{100,109,0}}, +/* 37522 */ {(12<<2)|2,{100,109,0}}, +/* 37523 */ {(12<<2)|2,{100,109,0}}, +/* 37524 */ {(12<<2)|2,{100,109,0}}, +/* 37525 */ {(12<<2)|2,{100,109,0}}, +/* 37526 */ {(12<<2)|2,{100,109,0}}, +/* 37527 */ {(12<<2)|2,{100,109,0}}, +/* 37528 */ {(12<<2)|2,{100,109,0}}, +/* 37529 */ {(12<<2)|2,{100,109,0}}, +/* 37530 */ {(12<<2)|2,{100,109,0}}, +/* 37531 */ {(12<<2)|2,{100,109,0}}, +/* 37532 */ {(12<<2)|2,{100,109,0}}, +/* 37533 */ {(12<<2)|2,{100,109,0}}, +/* 37534 */ {(12<<2)|2,{100,109,0}}, +/* 37535 */ {(12<<2)|2,{100,109,0}}, +/* 37536 */ {(12<<2)|2,{100,110,0}}, +/* 37537 */ {(12<<2)|2,{100,110,0}}, +/* 37538 */ {(12<<2)|2,{100,110,0}}, +/* 37539 */ {(12<<2)|2,{100,110,0}}, +/* 37540 */ {(12<<2)|2,{100,110,0}}, +/* 37541 */ {(12<<2)|2,{100,110,0}}, +/* 37542 */ {(12<<2)|2,{100,110,0}}, +/* 37543 */ {(12<<2)|2,{100,110,0}}, +/* 37544 */ {(12<<2)|2,{100,110,0}}, +/* 37545 */ {(12<<2)|2,{100,110,0}}, +/* 37546 */ {(12<<2)|2,{100,110,0}}, +/* 37547 */ {(12<<2)|2,{100,110,0}}, +/* 37548 */ {(12<<2)|2,{100,110,0}}, +/* 37549 */ {(12<<2)|2,{100,110,0}}, +/* 37550 */ {(12<<2)|2,{100,110,0}}, +/* 37551 */ {(12<<2)|2,{100,110,0}}, +/* 37552 */ {(12<<2)|2,{100,112,0}}, +/* 37553 */ {(12<<2)|2,{100,112,0}}, +/* 37554 */ {(12<<2)|2,{100,112,0}}, +/* 37555 */ {(12<<2)|2,{100,112,0}}, +/* 37556 */ {(12<<2)|2,{100,112,0}}, +/* 37557 */ {(12<<2)|2,{100,112,0}}, +/* 37558 */ {(12<<2)|2,{100,112,0}}, +/* 37559 */ {(12<<2)|2,{100,112,0}}, +/* 37560 */ {(12<<2)|2,{100,112,0}}, +/* 37561 */ {(12<<2)|2,{100,112,0}}, +/* 37562 */ {(12<<2)|2,{100,112,0}}, +/* 37563 */ {(12<<2)|2,{100,112,0}}, +/* 37564 */ {(12<<2)|2,{100,112,0}}, +/* 37565 */ {(12<<2)|2,{100,112,0}}, +/* 37566 */ {(12<<2)|2,{100,112,0}}, +/* 37567 */ {(12<<2)|2,{100,112,0}}, +/* 37568 */ {(12<<2)|2,{100,114,0}}, +/* 37569 */ {(12<<2)|2,{100,114,0}}, +/* 37570 */ {(12<<2)|2,{100,114,0}}, +/* 37571 */ {(12<<2)|2,{100,114,0}}, +/* 37572 */ {(12<<2)|2,{100,114,0}}, +/* 37573 */ {(12<<2)|2,{100,114,0}}, +/* 37574 */ {(12<<2)|2,{100,114,0}}, +/* 37575 */ {(12<<2)|2,{100,114,0}}, +/* 37576 */ {(12<<2)|2,{100,114,0}}, +/* 37577 */ {(12<<2)|2,{100,114,0}}, +/* 37578 */ {(12<<2)|2,{100,114,0}}, +/* 37579 */ {(12<<2)|2,{100,114,0}}, +/* 37580 */ {(12<<2)|2,{100,114,0}}, +/* 37581 */ {(12<<2)|2,{100,114,0}}, +/* 37582 */ {(12<<2)|2,{100,114,0}}, +/* 37583 */ {(12<<2)|2,{100,114,0}}, +/* 37584 */ {(12<<2)|2,{100,117,0}}, +/* 37585 */ {(12<<2)|2,{100,117,0}}, +/* 37586 */ {(12<<2)|2,{100,117,0}}, +/* 37587 */ {(12<<2)|2,{100,117,0}}, +/* 37588 */ {(12<<2)|2,{100,117,0}}, +/* 37589 */ {(12<<2)|2,{100,117,0}}, +/* 37590 */ {(12<<2)|2,{100,117,0}}, +/* 37591 */ {(12<<2)|2,{100,117,0}}, +/* 37592 */ {(12<<2)|2,{100,117,0}}, +/* 37593 */ {(12<<2)|2,{100,117,0}}, +/* 37594 */ {(12<<2)|2,{100,117,0}}, +/* 37595 */ {(12<<2)|2,{100,117,0}}, +/* 37596 */ {(12<<2)|2,{100,117,0}}, +/* 37597 */ {(12<<2)|2,{100,117,0}}, +/* 37598 */ {(12<<2)|2,{100,117,0}}, +/* 37599 */ {(12<<2)|2,{100,117,0}}, +/* 37600 */ {(13<<2)|2,{100,58,0}}, +/* 37601 */ {(13<<2)|2,{100,58,0}}, +/* 37602 */ {(13<<2)|2,{100,58,0}}, +/* 37603 */ {(13<<2)|2,{100,58,0}}, +/* 37604 */ {(13<<2)|2,{100,58,0}}, +/* 37605 */ {(13<<2)|2,{100,58,0}}, +/* 37606 */ {(13<<2)|2,{100,58,0}}, +/* 37607 */ {(13<<2)|2,{100,58,0}}, +/* 37608 */ {(13<<2)|2,{100,66,0}}, +/* 37609 */ {(13<<2)|2,{100,66,0}}, +/* 37610 */ {(13<<2)|2,{100,66,0}}, +/* 37611 */ {(13<<2)|2,{100,66,0}}, +/* 37612 */ {(13<<2)|2,{100,66,0}}, +/* 37613 */ {(13<<2)|2,{100,66,0}}, +/* 37614 */ {(13<<2)|2,{100,66,0}}, +/* 37615 */ {(13<<2)|2,{100,66,0}}, +/* 37616 */ {(13<<2)|2,{100,67,0}}, +/* 37617 */ {(13<<2)|2,{100,67,0}}, +/* 37618 */ {(13<<2)|2,{100,67,0}}, +/* 37619 */ {(13<<2)|2,{100,67,0}}, +/* 37620 */ {(13<<2)|2,{100,67,0}}, +/* 37621 */ {(13<<2)|2,{100,67,0}}, +/* 37622 */ {(13<<2)|2,{100,67,0}}, +/* 37623 */ {(13<<2)|2,{100,67,0}}, +/* 37624 */ {(13<<2)|2,{100,68,0}}, +/* 37625 */ {(13<<2)|2,{100,68,0}}, +/* 37626 */ {(13<<2)|2,{100,68,0}}, +/* 37627 */ {(13<<2)|2,{100,68,0}}, +/* 37628 */ {(13<<2)|2,{100,68,0}}, +/* 37629 */ {(13<<2)|2,{100,68,0}}, +/* 37630 */ {(13<<2)|2,{100,68,0}}, +/* 37631 */ {(13<<2)|2,{100,68,0}}, +/* 37632 */ {(13<<2)|2,{100,69,0}}, +/* 37633 */ {(13<<2)|2,{100,69,0}}, +/* 37634 */ {(13<<2)|2,{100,69,0}}, +/* 37635 */ {(13<<2)|2,{100,69,0}}, +/* 37636 */ {(13<<2)|2,{100,69,0}}, +/* 37637 */ {(13<<2)|2,{100,69,0}}, +/* 37638 */ {(13<<2)|2,{100,69,0}}, +/* 37639 */ {(13<<2)|2,{100,69,0}}, +/* 37640 */ {(13<<2)|2,{100,70,0}}, +/* 37641 */ {(13<<2)|2,{100,70,0}}, +/* 37642 */ {(13<<2)|2,{100,70,0}}, +/* 37643 */ {(13<<2)|2,{100,70,0}}, +/* 37644 */ {(13<<2)|2,{100,70,0}}, +/* 37645 */ {(13<<2)|2,{100,70,0}}, +/* 37646 */ {(13<<2)|2,{100,70,0}}, +/* 37647 */ {(13<<2)|2,{100,70,0}}, +/* 37648 */ {(13<<2)|2,{100,71,0}}, +/* 37649 */ {(13<<2)|2,{100,71,0}}, +/* 37650 */ {(13<<2)|2,{100,71,0}}, +/* 37651 */ {(13<<2)|2,{100,71,0}}, +/* 37652 */ {(13<<2)|2,{100,71,0}}, +/* 37653 */ {(13<<2)|2,{100,71,0}}, +/* 37654 */ {(13<<2)|2,{100,71,0}}, +/* 37655 */ {(13<<2)|2,{100,71,0}}, +/* 37656 */ {(13<<2)|2,{100,72,0}}, +/* 37657 */ {(13<<2)|2,{100,72,0}}, +/* 37658 */ {(13<<2)|2,{100,72,0}}, +/* 37659 */ {(13<<2)|2,{100,72,0}}, +/* 37660 */ {(13<<2)|2,{100,72,0}}, +/* 37661 */ {(13<<2)|2,{100,72,0}}, +/* 37662 */ {(13<<2)|2,{100,72,0}}, +/* 37663 */ {(13<<2)|2,{100,72,0}}, +/* 37664 */ {(13<<2)|2,{100,73,0}}, +/* 37665 */ {(13<<2)|2,{100,73,0}}, +/* 37666 */ {(13<<2)|2,{100,73,0}}, +/* 37667 */ {(13<<2)|2,{100,73,0}}, +/* 37668 */ {(13<<2)|2,{100,73,0}}, +/* 37669 */ {(13<<2)|2,{100,73,0}}, +/* 37670 */ {(13<<2)|2,{100,73,0}}, +/* 37671 */ {(13<<2)|2,{100,73,0}}, +/* 37672 */ {(13<<2)|2,{100,74,0}}, +/* 37673 */ {(13<<2)|2,{100,74,0}}, +/* 37674 */ {(13<<2)|2,{100,74,0}}, +/* 37675 */ {(13<<2)|2,{100,74,0}}, +/* 37676 */ {(13<<2)|2,{100,74,0}}, +/* 37677 */ {(13<<2)|2,{100,74,0}}, +/* 37678 */ {(13<<2)|2,{100,74,0}}, +/* 37679 */ {(13<<2)|2,{100,74,0}}, +/* 37680 */ {(13<<2)|2,{100,75,0}}, +/* 37681 */ {(13<<2)|2,{100,75,0}}, +/* 37682 */ {(13<<2)|2,{100,75,0}}, +/* 37683 */ {(13<<2)|2,{100,75,0}}, +/* 37684 */ {(13<<2)|2,{100,75,0}}, +/* 37685 */ {(13<<2)|2,{100,75,0}}, +/* 37686 */ {(13<<2)|2,{100,75,0}}, +/* 37687 */ {(13<<2)|2,{100,75,0}}, +/* 37688 */ {(13<<2)|2,{100,76,0}}, +/* 37689 */ {(13<<2)|2,{100,76,0}}, +/* 37690 */ {(13<<2)|2,{100,76,0}}, +/* 37691 */ {(13<<2)|2,{100,76,0}}, +/* 37692 */ {(13<<2)|2,{100,76,0}}, +/* 37693 */ {(13<<2)|2,{100,76,0}}, +/* 37694 */ {(13<<2)|2,{100,76,0}}, +/* 37695 */ {(13<<2)|2,{100,76,0}}, +/* 37696 */ {(13<<2)|2,{100,77,0}}, +/* 37697 */ {(13<<2)|2,{100,77,0}}, +/* 37698 */ {(13<<2)|2,{100,77,0}}, +/* 37699 */ {(13<<2)|2,{100,77,0}}, +/* 37700 */ {(13<<2)|2,{100,77,0}}, +/* 37701 */ {(13<<2)|2,{100,77,0}}, +/* 37702 */ {(13<<2)|2,{100,77,0}}, +/* 37703 */ {(13<<2)|2,{100,77,0}}, +/* 37704 */ {(13<<2)|2,{100,78,0}}, +/* 37705 */ {(13<<2)|2,{100,78,0}}, +/* 37706 */ {(13<<2)|2,{100,78,0}}, +/* 37707 */ {(13<<2)|2,{100,78,0}}, +/* 37708 */ {(13<<2)|2,{100,78,0}}, +/* 37709 */ {(13<<2)|2,{100,78,0}}, +/* 37710 */ {(13<<2)|2,{100,78,0}}, +/* 37711 */ {(13<<2)|2,{100,78,0}}, +/* 37712 */ {(13<<2)|2,{100,79,0}}, +/* 37713 */ {(13<<2)|2,{100,79,0}}, +/* 37714 */ {(13<<2)|2,{100,79,0}}, +/* 37715 */ {(13<<2)|2,{100,79,0}}, +/* 37716 */ {(13<<2)|2,{100,79,0}}, +/* 37717 */ {(13<<2)|2,{100,79,0}}, +/* 37718 */ {(13<<2)|2,{100,79,0}}, +/* 37719 */ {(13<<2)|2,{100,79,0}}, +/* 37720 */ {(13<<2)|2,{100,80,0}}, +/* 37721 */ {(13<<2)|2,{100,80,0}}, +/* 37722 */ {(13<<2)|2,{100,80,0}}, +/* 37723 */ {(13<<2)|2,{100,80,0}}, +/* 37724 */ {(13<<2)|2,{100,80,0}}, +/* 37725 */ {(13<<2)|2,{100,80,0}}, +/* 37726 */ {(13<<2)|2,{100,80,0}}, +/* 37727 */ {(13<<2)|2,{100,80,0}}, +/* 37728 */ {(13<<2)|2,{100,81,0}}, +/* 37729 */ {(13<<2)|2,{100,81,0}}, +/* 37730 */ {(13<<2)|2,{100,81,0}}, +/* 37731 */ {(13<<2)|2,{100,81,0}}, +/* 37732 */ {(13<<2)|2,{100,81,0}}, +/* 37733 */ {(13<<2)|2,{100,81,0}}, +/* 37734 */ {(13<<2)|2,{100,81,0}}, +/* 37735 */ {(13<<2)|2,{100,81,0}}, +/* 37736 */ {(13<<2)|2,{100,82,0}}, +/* 37737 */ {(13<<2)|2,{100,82,0}}, +/* 37738 */ {(13<<2)|2,{100,82,0}}, +/* 37739 */ {(13<<2)|2,{100,82,0}}, +/* 37740 */ {(13<<2)|2,{100,82,0}}, +/* 37741 */ {(13<<2)|2,{100,82,0}}, +/* 37742 */ {(13<<2)|2,{100,82,0}}, +/* 37743 */ {(13<<2)|2,{100,82,0}}, +/* 37744 */ {(13<<2)|2,{100,83,0}}, +/* 37745 */ {(13<<2)|2,{100,83,0}}, +/* 37746 */ {(13<<2)|2,{100,83,0}}, +/* 37747 */ {(13<<2)|2,{100,83,0}}, +/* 37748 */ {(13<<2)|2,{100,83,0}}, +/* 37749 */ {(13<<2)|2,{100,83,0}}, +/* 37750 */ {(13<<2)|2,{100,83,0}}, +/* 37751 */ {(13<<2)|2,{100,83,0}}, +/* 37752 */ {(13<<2)|2,{100,84,0}}, +/* 37753 */ {(13<<2)|2,{100,84,0}}, +/* 37754 */ {(13<<2)|2,{100,84,0}}, +/* 37755 */ {(13<<2)|2,{100,84,0}}, +/* 37756 */ {(13<<2)|2,{100,84,0}}, +/* 37757 */ {(13<<2)|2,{100,84,0}}, +/* 37758 */ {(13<<2)|2,{100,84,0}}, +/* 37759 */ {(13<<2)|2,{100,84,0}}, +/* 37760 */ {(13<<2)|2,{100,85,0}}, +/* 37761 */ {(13<<2)|2,{100,85,0}}, +/* 37762 */ {(13<<2)|2,{100,85,0}}, +/* 37763 */ {(13<<2)|2,{100,85,0}}, +/* 37764 */ {(13<<2)|2,{100,85,0}}, +/* 37765 */ {(13<<2)|2,{100,85,0}}, +/* 37766 */ {(13<<2)|2,{100,85,0}}, +/* 37767 */ {(13<<2)|2,{100,85,0}}, +/* 37768 */ {(13<<2)|2,{100,86,0}}, +/* 37769 */ {(13<<2)|2,{100,86,0}}, +/* 37770 */ {(13<<2)|2,{100,86,0}}, +/* 37771 */ {(13<<2)|2,{100,86,0}}, +/* 37772 */ {(13<<2)|2,{100,86,0}}, +/* 37773 */ {(13<<2)|2,{100,86,0}}, +/* 37774 */ {(13<<2)|2,{100,86,0}}, +/* 37775 */ {(13<<2)|2,{100,86,0}}, +/* 37776 */ {(13<<2)|2,{100,87,0}}, +/* 37777 */ {(13<<2)|2,{100,87,0}}, +/* 37778 */ {(13<<2)|2,{100,87,0}}, +/* 37779 */ {(13<<2)|2,{100,87,0}}, +/* 37780 */ {(13<<2)|2,{100,87,0}}, +/* 37781 */ {(13<<2)|2,{100,87,0}}, +/* 37782 */ {(13<<2)|2,{100,87,0}}, +/* 37783 */ {(13<<2)|2,{100,87,0}}, +/* 37784 */ {(13<<2)|2,{100,89,0}}, +/* 37785 */ {(13<<2)|2,{100,89,0}}, +/* 37786 */ {(13<<2)|2,{100,89,0}}, +/* 37787 */ {(13<<2)|2,{100,89,0}}, +/* 37788 */ {(13<<2)|2,{100,89,0}}, +/* 37789 */ {(13<<2)|2,{100,89,0}}, +/* 37790 */ {(13<<2)|2,{100,89,0}}, +/* 37791 */ {(13<<2)|2,{100,89,0}}, +/* 37792 */ {(13<<2)|2,{100,106,0}}, +/* 37793 */ {(13<<2)|2,{100,106,0}}, +/* 37794 */ {(13<<2)|2,{100,106,0}}, +/* 37795 */ {(13<<2)|2,{100,106,0}}, +/* 37796 */ {(13<<2)|2,{100,106,0}}, +/* 37797 */ {(13<<2)|2,{100,106,0}}, +/* 37798 */ {(13<<2)|2,{100,106,0}}, +/* 37799 */ {(13<<2)|2,{100,106,0}}, +/* 37800 */ {(13<<2)|2,{100,107,0}}, +/* 37801 */ {(13<<2)|2,{100,107,0}}, +/* 37802 */ {(13<<2)|2,{100,107,0}}, +/* 37803 */ {(13<<2)|2,{100,107,0}}, +/* 37804 */ {(13<<2)|2,{100,107,0}}, +/* 37805 */ {(13<<2)|2,{100,107,0}}, +/* 37806 */ {(13<<2)|2,{100,107,0}}, +/* 37807 */ {(13<<2)|2,{100,107,0}}, +/* 37808 */ {(13<<2)|2,{100,113,0}}, +/* 37809 */ {(13<<2)|2,{100,113,0}}, +/* 37810 */ {(13<<2)|2,{100,113,0}}, +/* 37811 */ {(13<<2)|2,{100,113,0}}, +/* 37812 */ {(13<<2)|2,{100,113,0}}, +/* 37813 */ {(13<<2)|2,{100,113,0}}, +/* 37814 */ {(13<<2)|2,{100,113,0}}, +/* 37815 */ {(13<<2)|2,{100,113,0}}, +/* 37816 */ {(13<<2)|2,{100,118,0}}, +/* 37817 */ {(13<<2)|2,{100,118,0}}, +/* 37818 */ {(13<<2)|2,{100,118,0}}, +/* 37819 */ {(13<<2)|2,{100,118,0}}, +/* 37820 */ {(13<<2)|2,{100,118,0}}, +/* 37821 */ {(13<<2)|2,{100,118,0}}, +/* 37822 */ {(13<<2)|2,{100,118,0}}, +/* 37823 */ {(13<<2)|2,{100,118,0}}, +/* 37824 */ {(13<<2)|2,{100,119,0}}, +/* 37825 */ {(13<<2)|2,{100,119,0}}, +/* 37826 */ {(13<<2)|2,{100,119,0}}, +/* 37827 */ {(13<<2)|2,{100,119,0}}, +/* 37828 */ {(13<<2)|2,{100,119,0}}, +/* 37829 */ {(13<<2)|2,{100,119,0}}, +/* 37830 */ {(13<<2)|2,{100,119,0}}, +/* 37831 */ {(13<<2)|2,{100,119,0}}, +/* 37832 */ {(13<<2)|2,{100,120,0}}, +/* 37833 */ {(13<<2)|2,{100,120,0}}, +/* 37834 */ {(13<<2)|2,{100,120,0}}, +/* 37835 */ {(13<<2)|2,{100,120,0}}, +/* 37836 */ {(13<<2)|2,{100,120,0}}, +/* 37837 */ {(13<<2)|2,{100,120,0}}, +/* 37838 */ {(13<<2)|2,{100,120,0}}, +/* 37839 */ {(13<<2)|2,{100,120,0}}, +/* 37840 */ {(13<<2)|2,{100,121,0}}, +/* 37841 */ {(13<<2)|2,{100,121,0}}, +/* 37842 */ {(13<<2)|2,{100,121,0}}, +/* 37843 */ {(13<<2)|2,{100,121,0}}, +/* 37844 */ {(13<<2)|2,{100,121,0}}, +/* 37845 */ {(13<<2)|2,{100,121,0}}, +/* 37846 */ {(13<<2)|2,{100,121,0}}, +/* 37847 */ {(13<<2)|2,{100,121,0}}, +/* 37848 */ {(13<<2)|2,{100,122,0}}, +/* 37849 */ {(13<<2)|2,{100,122,0}}, +/* 37850 */ {(13<<2)|2,{100,122,0}}, +/* 37851 */ {(13<<2)|2,{100,122,0}}, +/* 37852 */ {(13<<2)|2,{100,122,0}}, +/* 37853 */ {(13<<2)|2,{100,122,0}}, +/* 37854 */ {(13<<2)|2,{100,122,0}}, +/* 37855 */ {(13<<2)|2,{100,122,0}}, +/* 37856 */ {(14<<2)|2,{100,38,0}}, +/* 37857 */ {(14<<2)|2,{100,38,0}}, +/* 37858 */ {(14<<2)|2,{100,38,0}}, +/* 37859 */ {(14<<2)|2,{100,38,0}}, +/* 37860 */ {(14<<2)|2,{100,42,0}}, +/* 37861 */ {(14<<2)|2,{100,42,0}}, +/* 37862 */ {(14<<2)|2,{100,42,0}}, +/* 37863 */ {(14<<2)|2,{100,42,0}}, +/* 37864 */ {(14<<2)|2,{100,44,0}}, +/* 37865 */ {(14<<2)|2,{100,44,0}}, +/* 37866 */ {(14<<2)|2,{100,44,0}}, +/* 37867 */ {(14<<2)|2,{100,44,0}}, +/* 37868 */ {(14<<2)|2,{100,59,0}}, +/* 37869 */ {(14<<2)|2,{100,59,0}}, +/* 37870 */ {(14<<2)|2,{100,59,0}}, +/* 37871 */ {(14<<2)|2,{100,59,0}}, +/* 37872 */ {(14<<2)|2,{100,88,0}}, +/* 37873 */ {(14<<2)|2,{100,88,0}}, +/* 37874 */ {(14<<2)|2,{100,88,0}}, +/* 37875 */ {(14<<2)|2,{100,88,0}}, +/* 37876 */ {(14<<2)|2,{100,90,0}}, +/* 37877 */ {(14<<2)|2,{100,90,0}}, +/* 37878 */ {(14<<2)|2,{100,90,0}}, +/* 37879 */ {(14<<2)|2,{100,90,0}}, +/* 37880 */ {(16<<2)|2,{100,33,0}}, +/* 37881 */ {(16<<2)|2,{100,34,0}}, +/* 37882 */ {(16<<2)|2,{100,40,0}}, +/* 37883 */ {(16<<2)|2,{100,41,0}}, +/* 37884 */ {(16<<2)|2,{100,63,0}}, +/* 37885 */ {(6<<2)|1,{100,0,0}}, +/* 37886 */ {(6<<2)|1,{100,0,0}}, +/* 37887 */ {(6<<2)|1,{100,0,0}}, +/* 37888 */ {(16<<2)|3,{102,48,48}}, +/* 37889 */ {(16<<2)|3,{102,48,49}}, +/* 37890 */ {(16<<2)|3,{102,48,50}}, +/* 37891 */ {(16<<2)|3,{102,48,97}}, +/* 37892 */ {(16<<2)|3,{102,48,99}}, +/* 37893 */ {(16<<2)|3,{102,48,101}}, +/* 37894 */ {(16<<2)|3,{102,48,105}}, +/* 37895 */ {(16<<2)|3,{102,48,111}}, +/* 37896 */ {(16<<2)|3,{102,48,115}}, +/* 37897 */ {(16<<2)|3,{102,48,116}}, +/* 37898 */ {(11<<2)|2,{102,48,0}}, +/* 37899 */ {(11<<2)|2,{102,48,0}}, +/* 37900 */ {(11<<2)|2,{102,48,0}}, +/* 37901 */ {(11<<2)|2,{102,48,0}}, +/* 37902 */ {(11<<2)|2,{102,48,0}}, +/* 37903 */ {(11<<2)|2,{102,48,0}}, +/* 37904 */ {(11<<2)|2,{102,48,0}}, +/* 37905 */ {(11<<2)|2,{102,48,0}}, +/* 37906 */ {(11<<2)|2,{102,48,0}}, +/* 37907 */ {(11<<2)|2,{102,48,0}}, +/* 37908 */ {(11<<2)|2,{102,48,0}}, +/* 37909 */ {(11<<2)|2,{102,48,0}}, +/* 37910 */ {(11<<2)|2,{102,48,0}}, +/* 37911 */ {(11<<2)|2,{102,48,0}}, +/* 37912 */ {(11<<2)|2,{102,48,0}}, +/* 37913 */ {(11<<2)|2,{102,48,0}}, +/* 37914 */ {(11<<2)|2,{102,48,0}}, +/* 37915 */ {(11<<2)|2,{102,48,0}}, +/* 37916 */ {(11<<2)|2,{102,48,0}}, +/* 37917 */ {(11<<2)|2,{102,48,0}}, +/* 37918 */ {(11<<2)|2,{102,48,0}}, +/* 37919 */ {(11<<2)|2,{102,48,0}}, +/* 37920 */ {(16<<2)|3,{102,49,48}}, +/* 37921 */ {(16<<2)|3,{102,49,49}}, +/* 37922 */ {(16<<2)|3,{102,49,50}}, +/* 37923 */ {(16<<2)|3,{102,49,97}}, +/* 37924 */ {(16<<2)|3,{102,49,99}}, +/* 37925 */ {(16<<2)|3,{102,49,101}}, +/* 37926 */ {(16<<2)|3,{102,49,105}}, +/* 37927 */ {(16<<2)|3,{102,49,111}}, +/* 37928 */ {(16<<2)|3,{102,49,115}}, +/* 37929 */ {(16<<2)|3,{102,49,116}}, +/* 37930 */ {(11<<2)|2,{102,49,0}}, +/* 37931 */ {(11<<2)|2,{102,49,0}}, +/* 37932 */ {(11<<2)|2,{102,49,0}}, +/* 37933 */ {(11<<2)|2,{102,49,0}}, +/* 37934 */ {(11<<2)|2,{102,49,0}}, +/* 37935 */ {(11<<2)|2,{102,49,0}}, +/* 37936 */ {(11<<2)|2,{102,49,0}}, +/* 37937 */ {(11<<2)|2,{102,49,0}}, +/* 37938 */ {(11<<2)|2,{102,49,0}}, +/* 37939 */ {(11<<2)|2,{102,49,0}}, +/* 37940 */ {(11<<2)|2,{102,49,0}}, +/* 37941 */ {(11<<2)|2,{102,49,0}}, +/* 37942 */ {(11<<2)|2,{102,49,0}}, +/* 37943 */ {(11<<2)|2,{102,49,0}}, +/* 37944 */ {(11<<2)|2,{102,49,0}}, +/* 37945 */ {(11<<2)|2,{102,49,0}}, +/* 37946 */ {(11<<2)|2,{102,49,0}}, +/* 37947 */ {(11<<2)|2,{102,49,0}}, +/* 37948 */ {(11<<2)|2,{102,49,0}}, +/* 37949 */ {(11<<2)|2,{102,49,0}}, +/* 37950 */ {(11<<2)|2,{102,49,0}}, +/* 37951 */ {(11<<2)|2,{102,49,0}}, +/* 37952 */ {(16<<2)|3,{102,50,48}}, +/* 37953 */ {(16<<2)|3,{102,50,49}}, +/* 37954 */ {(16<<2)|3,{102,50,50}}, +/* 37955 */ {(16<<2)|3,{102,50,97}}, +/* 37956 */ {(16<<2)|3,{102,50,99}}, +/* 37957 */ {(16<<2)|3,{102,50,101}}, +/* 37958 */ {(16<<2)|3,{102,50,105}}, +/* 37959 */ {(16<<2)|3,{102,50,111}}, +/* 37960 */ {(16<<2)|3,{102,50,115}}, +/* 37961 */ {(16<<2)|3,{102,50,116}}, +/* 37962 */ {(11<<2)|2,{102,50,0}}, +/* 37963 */ {(11<<2)|2,{102,50,0}}, +/* 37964 */ {(11<<2)|2,{102,50,0}}, +/* 37965 */ {(11<<2)|2,{102,50,0}}, +/* 37966 */ {(11<<2)|2,{102,50,0}}, +/* 37967 */ {(11<<2)|2,{102,50,0}}, +/* 37968 */ {(11<<2)|2,{102,50,0}}, +/* 37969 */ {(11<<2)|2,{102,50,0}}, +/* 37970 */ {(11<<2)|2,{102,50,0}}, +/* 37971 */ {(11<<2)|2,{102,50,0}}, +/* 37972 */ {(11<<2)|2,{102,50,0}}, +/* 37973 */ {(11<<2)|2,{102,50,0}}, +/* 37974 */ {(11<<2)|2,{102,50,0}}, +/* 37975 */ {(11<<2)|2,{102,50,0}}, +/* 37976 */ {(11<<2)|2,{102,50,0}}, +/* 37977 */ {(11<<2)|2,{102,50,0}}, +/* 37978 */ {(11<<2)|2,{102,50,0}}, +/* 37979 */ {(11<<2)|2,{102,50,0}}, +/* 37980 */ {(11<<2)|2,{102,50,0}}, +/* 37981 */ {(11<<2)|2,{102,50,0}}, +/* 37982 */ {(11<<2)|2,{102,50,0}}, +/* 37983 */ {(11<<2)|2,{102,50,0}}, +/* 37984 */ {(16<<2)|3,{102,97,48}}, +/* 37985 */ {(16<<2)|3,{102,97,49}}, +/* 37986 */ {(16<<2)|3,{102,97,50}}, +/* 37987 */ {(16<<2)|3,{102,97,97}}, +/* 37988 */ {(16<<2)|3,{102,97,99}}, +/* 37989 */ {(16<<2)|3,{102,97,101}}, +/* 37990 */ {(16<<2)|3,{102,97,105}}, +/* 37991 */ {(16<<2)|3,{102,97,111}}, +/* 37992 */ {(16<<2)|3,{102,97,115}}, +/* 37993 */ {(16<<2)|3,{102,97,116}}, +/* 37994 */ {(11<<2)|2,{102,97,0}}, +/* 37995 */ {(11<<2)|2,{102,97,0}}, +/* 37996 */ {(11<<2)|2,{102,97,0}}, +/* 37997 */ {(11<<2)|2,{102,97,0}}, +/* 37998 */ {(11<<2)|2,{102,97,0}}, +/* 37999 */ {(11<<2)|2,{102,97,0}}, +/* 38000 */ {(11<<2)|2,{102,97,0}}, +/* 38001 */ {(11<<2)|2,{102,97,0}}, +/* 38002 */ {(11<<2)|2,{102,97,0}}, +/* 38003 */ {(11<<2)|2,{102,97,0}}, +/* 38004 */ {(11<<2)|2,{102,97,0}}, +/* 38005 */ {(11<<2)|2,{102,97,0}}, +/* 38006 */ {(11<<2)|2,{102,97,0}}, +/* 38007 */ {(11<<2)|2,{102,97,0}}, +/* 38008 */ {(11<<2)|2,{102,97,0}}, +/* 38009 */ {(11<<2)|2,{102,97,0}}, +/* 38010 */ {(11<<2)|2,{102,97,0}}, +/* 38011 */ {(11<<2)|2,{102,97,0}}, +/* 38012 */ {(11<<2)|2,{102,97,0}}, +/* 38013 */ {(11<<2)|2,{102,97,0}}, +/* 38014 */ {(11<<2)|2,{102,97,0}}, +/* 38015 */ {(11<<2)|2,{102,97,0}}, +/* 38016 */ {(16<<2)|3,{102,99,48}}, +/* 38017 */ {(16<<2)|3,{102,99,49}}, +/* 38018 */ {(16<<2)|3,{102,99,50}}, +/* 38019 */ {(16<<2)|3,{102,99,97}}, +/* 38020 */ {(16<<2)|3,{102,99,99}}, +/* 38021 */ {(16<<2)|3,{102,99,101}}, +/* 38022 */ {(16<<2)|3,{102,99,105}}, +/* 38023 */ {(16<<2)|3,{102,99,111}}, +/* 38024 */ {(16<<2)|3,{102,99,115}}, +/* 38025 */ {(16<<2)|3,{102,99,116}}, +/* 38026 */ {(11<<2)|2,{102,99,0}}, +/* 38027 */ {(11<<2)|2,{102,99,0}}, +/* 38028 */ {(11<<2)|2,{102,99,0}}, +/* 38029 */ {(11<<2)|2,{102,99,0}}, +/* 38030 */ {(11<<2)|2,{102,99,0}}, +/* 38031 */ {(11<<2)|2,{102,99,0}}, +/* 38032 */ {(11<<2)|2,{102,99,0}}, +/* 38033 */ {(11<<2)|2,{102,99,0}}, +/* 38034 */ {(11<<2)|2,{102,99,0}}, +/* 38035 */ {(11<<2)|2,{102,99,0}}, +/* 38036 */ {(11<<2)|2,{102,99,0}}, +/* 38037 */ {(11<<2)|2,{102,99,0}}, +/* 38038 */ {(11<<2)|2,{102,99,0}}, +/* 38039 */ {(11<<2)|2,{102,99,0}}, +/* 38040 */ {(11<<2)|2,{102,99,0}}, +/* 38041 */ {(11<<2)|2,{102,99,0}}, +/* 38042 */ {(11<<2)|2,{102,99,0}}, +/* 38043 */ {(11<<2)|2,{102,99,0}}, +/* 38044 */ {(11<<2)|2,{102,99,0}}, +/* 38045 */ {(11<<2)|2,{102,99,0}}, +/* 38046 */ {(11<<2)|2,{102,99,0}}, +/* 38047 */ {(11<<2)|2,{102,99,0}}, +/* 38048 */ {(16<<2)|3,{102,101,48}}, +/* 38049 */ {(16<<2)|3,{102,101,49}}, +/* 38050 */ {(16<<2)|3,{102,101,50}}, +/* 38051 */ {(16<<2)|3,{102,101,97}}, +/* 38052 */ {(16<<2)|3,{102,101,99}}, +/* 38053 */ {(16<<2)|3,{102,101,101}}, +/* 38054 */ {(16<<2)|3,{102,101,105}}, +/* 38055 */ {(16<<2)|3,{102,101,111}}, +/* 38056 */ {(16<<2)|3,{102,101,115}}, +/* 38057 */ {(16<<2)|3,{102,101,116}}, +/* 38058 */ {(11<<2)|2,{102,101,0}}, +/* 38059 */ {(11<<2)|2,{102,101,0}}, +/* 38060 */ {(11<<2)|2,{102,101,0}}, +/* 38061 */ {(11<<2)|2,{102,101,0}}, +/* 38062 */ {(11<<2)|2,{102,101,0}}, +/* 38063 */ {(11<<2)|2,{102,101,0}}, +/* 38064 */ {(11<<2)|2,{102,101,0}}, +/* 38065 */ {(11<<2)|2,{102,101,0}}, +/* 38066 */ {(11<<2)|2,{102,101,0}}, +/* 38067 */ {(11<<2)|2,{102,101,0}}, +/* 38068 */ {(11<<2)|2,{102,101,0}}, +/* 38069 */ {(11<<2)|2,{102,101,0}}, +/* 38070 */ {(11<<2)|2,{102,101,0}}, +/* 38071 */ {(11<<2)|2,{102,101,0}}, +/* 38072 */ {(11<<2)|2,{102,101,0}}, +/* 38073 */ {(11<<2)|2,{102,101,0}}, +/* 38074 */ {(11<<2)|2,{102,101,0}}, +/* 38075 */ {(11<<2)|2,{102,101,0}}, +/* 38076 */ {(11<<2)|2,{102,101,0}}, +/* 38077 */ {(11<<2)|2,{102,101,0}}, +/* 38078 */ {(11<<2)|2,{102,101,0}}, +/* 38079 */ {(11<<2)|2,{102,101,0}}, +/* 38080 */ {(16<<2)|3,{102,105,48}}, +/* 38081 */ {(16<<2)|3,{102,105,49}}, +/* 38082 */ {(16<<2)|3,{102,105,50}}, +/* 38083 */ {(16<<2)|3,{102,105,97}}, +/* 38084 */ {(16<<2)|3,{102,105,99}}, +/* 38085 */ {(16<<2)|3,{102,105,101}}, +/* 38086 */ {(16<<2)|3,{102,105,105}}, +/* 38087 */ {(16<<2)|3,{102,105,111}}, +/* 38088 */ {(16<<2)|3,{102,105,115}}, +/* 38089 */ {(16<<2)|3,{102,105,116}}, +/* 38090 */ {(11<<2)|2,{102,105,0}}, +/* 38091 */ {(11<<2)|2,{102,105,0}}, +/* 38092 */ {(11<<2)|2,{102,105,0}}, +/* 38093 */ {(11<<2)|2,{102,105,0}}, +/* 38094 */ {(11<<2)|2,{102,105,0}}, +/* 38095 */ {(11<<2)|2,{102,105,0}}, +/* 38096 */ {(11<<2)|2,{102,105,0}}, +/* 38097 */ {(11<<2)|2,{102,105,0}}, +/* 38098 */ {(11<<2)|2,{102,105,0}}, +/* 38099 */ {(11<<2)|2,{102,105,0}}, +/* 38100 */ {(11<<2)|2,{102,105,0}}, +/* 38101 */ {(11<<2)|2,{102,105,0}}, +/* 38102 */ {(11<<2)|2,{102,105,0}}, +/* 38103 */ {(11<<2)|2,{102,105,0}}, +/* 38104 */ {(11<<2)|2,{102,105,0}}, +/* 38105 */ {(11<<2)|2,{102,105,0}}, +/* 38106 */ {(11<<2)|2,{102,105,0}}, +/* 38107 */ {(11<<2)|2,{102,105,0}}, +/* 38108 */ {(11<<2)|2,{102,105,0}}, +/* 38109 */ {(11<<2)|2,{102,105,0}}, +/* 38110 */ {(11<<2)|2,{102,105,0}}, +/* 38111 */ {(11<<2)|2,{102,105,0}}, +/* 38112 */ {(16<<2)|3,{102,111,48}}, +/* 38113 */ {(16<<2)|3,{102,111,49}}, +/* 38114 */ {(16<<2)|3,{102,111,50}}, +/* 38115 */ {(16<<2)|3,{102,111,97}}, +/* 38116 */ {(16<<2)|3,{102,111,99}}, +/* 38117 */ {(16<<2)|3,{102,111,101}}, +/* 38118 */ {(16<<2)|3,{102,111,105}}, +/* 38119 */ {(16<<2)|3,{102,111,111}}, +/* 38120 */ {(16<<2)|3,{102,111,115}}, +/* 38121 */ {(16<<2)|3,{102,111,116}}, +/* 38122 */ {(11<<2)|2,{102,111,0}}, +/* 38123 */ {(11<<2)|2,{102,111,0}}, +/* 38124 */ {(11<<2)|2,{102,111,0}}, +/* 38125 */ {(11<<2)|2,{102,111,0}}, +/* 38126 */ {(11<<2)|2,{102,111,0}}, +/* 38127 */ {(11<<2)|2,{102,111,0}}, +/* 38128 */ {(11<<2)|2,{102,111,0}}, +/* 38129 */ {(11<<2)|2,{102,111,0}}, +/* 38130 */ {(11<<2)|2,{102,111,0}}, +/* 38131 */ {(11<<2)|2,{102,111,0}}, +/* 38132 */ {(11<<2)|2,{102,111,0}}, +/* 38133 */ {(11<<2)|2,{102,111,0}}, +/* 38134 */ {(11<<2)|2,{102,111,0}}, +/* 38135 */ {(11<<2)|2,{102,111,0}}, +/* 38136 */ {(11<<2)|2,{102,111,0}}, +/* 38137 */ {(11<<2)|2,{102,111,0}}, +/* 38138 */ {(11<<2)|2,{102,111,0}}, +/* 38139 */ {(11<<2)|2,{102,111,0}}, +/* 38140 */ {(11<<2)|2,{102,111,0}}, +/* 38141 */ {(11<<2)|2,{102,111,0}}, +/* 38142 */ {(11<<2)|2,{102,111,0}}, +/* 38143 */ {(11<<2)|2,{102,111,0}}, +/* 38144 */ {(16<<2)|3,{102,115,48}}, +/* 38145 */ {(16<<2)|3,{102,115,49}}, +/* 38146 */ {(16<<2)|3,{102,115,50}}, +/* 38147 */ {(16<<2)|3,{102,115,97}}, +/* 38148 */ {(16<<2)|3,{102,115,99}}, +/* 38149 */ {(16<<2)|3,{102,115,101}}, +/* 38150 */ {(16<<2)|3,{102,115,105}}, +/* 38151 */ {(16<<2)|3,{102,115,111}}, +/* 38152 */ {(16<<2)|3,{102,115,115}}, +/* 38153 */ {(16<<2)|3,{102,115,116}}, +/* 38154 */ {(11<<2)|2,{102,115,0}}, +/* 38155 */ {(11<<2)|2,{102,115,0}}, +/* 38156 */ {(11<<2)|2,{102,115,0}}, +/* 38157 */ {(11<<2)|2,{102,115,0}}, +/* 38158 */ {(11<<2)|2,{102,115,0}}, +/* 38159 */ {(11<<2)|2,{102,115,0}}, +/* 38160 */ {(11<<2)|2,{102,115,0}}, +/* 38161 */ {(11<<2)|2,{102,115,0}}, +/* 38162 */ {(11<<2)|2,{102,115,0}}, +/* 38163 */ {(11<<2)|2,{102,115,0}}, +/* 38164 */ {(11<<2)|2,{102,115,0}}, +/* 38165 */ {(11<<2)|2,{102,115,0}}, +/* 38166 */ {(11<<2)|2,{102,115,0}}, +/* 38167 */ {(11<<2)|2,{102,115,0}}, +/* 38168 */ {(11<<2)|2,{102,115,0}}, +/* 38169 */ {(11<<2)|2,{102,115,0}}, +/* 38170 */ {(11<<2)|2,{102,115,0}}, +/* 38171 */ {(11<<2)|2,{102,115,0}}, +/* 38172 */ {(11<<2)|2,{102,115,0}}, +/* 38173 */ {(11<<2)|2,{102,115,0}}, +/* 38174 */ {(11<<2)|2,{102,115,0}}, +/* 38175 */ {(11<<2)|2,{102,115,0}}, +/* 38176 */ {(16<<2)|3,{102,116,48}}, +/* 38177 */ {(16<<2)|3,{102,116,49}}, +/* 38178 */ {(16<<2)|3,{102,116,50}}, +/* 38179 */ {(16<<2)|3,{102,116,97}}, +/* 38180 */ {(16<<2)|3,{102,116,99}}, +/* 38181 */ {(16<<2)|3,{102,116,101}}, +/* 38182 */ {(16<<2)|3,{102,116,105}}, +/* 38183 */ {(16<<2)|3,{102,116,111}}, +/* 38184 */ {(16<<2)|3,{102,116,115}}, +/* 38185 */ {(16<<2)|3,{102,116,116}}, +/* 38186 */ {(11<<2)|2,{102,116,0}}, +/* 38187 */ {(11<<2)|2,{102,116,0}}, +/* 38188 */ {(11<<2)|2,{102,116,0}}, +/* 38189 */ {(11<<2)|2,{102,116,0}}, +/* 38190 */ {(11<<2)|2,{102,116,0}}, +/* 38191 */ {(11<<2)|2,{102,116,0}}, +/* 38192 */ {(11<<2)|2,{102,116,0}}, +/* 38193 */ {(11<<2)|2,{102,116,0}}, +/* 38194 */ {(11<<2)|2,{102,116,0}}, +/* 38195 */ {(11<<2)|2,{102,116,0}}, +/* 38196 */ {(11<<2)|2,{102,116,0}}, +/* 38197 */ {(11<<2)|2,{102,116,0}}, +/* 38198 */ {(11<<2)|2,{102,116,0}}, +/* 38199 */ {(11<<2)|2,{102,116,0}}, +/* 38200 */ {(11<<2)|2,{102,116,0}}, +/* 38201 */ {(11<<2)|2,{102,116,0}}, +/* 38202 */ {(11<<2)|2,{102,116,0}}, +/* 38203 */ {(11<<2)|2,{102,116,0}}, +/* 38204 */ {(11<<2)|2,{102,116,0}}, +/* 38205 */ {(11<<2)|2,{102,116,0}}, +/* 38206 */ {(11<<2)|2,{102,116,0}}, +/* 38207 */ {(11<<2)|2,{102,116,0}}, +/* 38208 */ {(12<<2)|2,{102,32,0}}, +/* 38209 */ {(12<<2)|2,{102,32,0}}, +/* 38210 */ {(12<<2)|2,{102,32,0}}, +/* 38211 */ {(12<<2)|2,{102,32,0}}, +/* 38212 */ {(12<<2)|2,{102,32,0}}, +/* 38213 */ {(12<<2)|2,{102,32,0}}, +/* 38214 */ {(12<<2)|2,{102,32,0}}, +/* 38215 */ {(12<<2)|2,{102,32,0}}, +/* 38216 */ {(12<<2)|2,{102,32,0}}, +/* 38217 */ {(12<<2)|2,{102,32,0}}, +/* 38218 */ {(12<<2)|2,{102,32,0}}, +/* 38219 */ {(12<<2)|2,{102,32,0}}, +/* 38220 */ {(12<<2)|2,{102,32,0}}, +/* 38221 */ {(12<<2)|2,{102,32,0}}, +/* 38222 */ {(12<<2)|2,{102,32,0}}, +/* 38223 */ {(12<<2)|2,{102,32,0}}, +/* 38224 */ {(12<<2)|2,{102,37,0}}, +/* 38225 */ {(12<<2)|2,{102,37,0}}, +/* 38226 */ {(12<<2)|2,{102,37,0}}, +/* 38227 */ {(12<<2)|2,{102,37,0}}, +/* 38228 */ {(12<<2)|2,{102,37,0}}, +/* 38229 */ {(12<<2)|2,{102,37,0}}, +/* 38230 */ {(12<<2)|2,{102,37,0}}, +/* 38231 */ {(12<<2)|2,{102,37,0}}, +/* 38232 */ {(12<<2)|2,{102,37,0}}, +/* 38233 */ {(12<<2)|2,{102,37,0}}, +/* 38234 */ {(12<<2)|2,{102,37,0}}, +/* 38235 */ {(12<<2)|2,{102,37,0}}, +/* 38236 */ {(12<<2)|2,{102,37,0}}, +/* 38237 */ {(12<<2)|2,{102,37,0}}, +/* 38238 */ {(12<<2)|2,{102,37,0}}, +/* 38239 */ {(12<<2)|2,{102,37,0}}, +/* 38240 */ {(12<<2)|2,{102,45,0}}, +/* 38241 */ {(12<<2)|2,{102,45,0}}, +/* 38242 */ {(12<<2)|2,{102,45,0}}, +/* 38243 */ {(12<<2)|2,{102,45,0}}, +/* 38244 */ {(12<<2)|2,{102,45,0}}, +/* 38245 */ {(12<<2)|2,{102,45,0}}, +/* 38246 */ {(12<<2)|2,{102,45,0}}, +/* 38247 */ {(12<<2)|2,{102,45,0}}, +/* 38248 */ {(12<<2)|2,{102,45,0}}, +/* 38249 */ {(12<<2)|2,{102,45,0}}, +/* 38250 */ {(12<<2)|2,{102,45,0}}, +/* 38251 */ {(12<<2)|2,{102,45,0}}, +/* 38252 */ {(12<<2)|2,{102,45,0}}, +/* 38253 */ {(12<<2)|2,{102,45,0}}, +/* 38254 */ {(12<<2)|2,{102,45,0}}, +/* 38255 */ {(12<<2)|2,{102,45,0}}, +/* 38256 */ {(12<<2)|2,{102,46,0}}, +/* 38257 */ {(12<<2)|2,{102,46,0}}, +/* 38258 */ {(12<<2)|2,{102,46,0}}, +/* 38259 */ {(12<<2)|2,{102,46,0}}, +/* 38260 */ {(12<<2)|2,{102,46,0}}, +/* 38261 */ {(12<<2)|2,{102,46,0}}, +/* 38262 */ {(12<<2)|2,{102,46,0}}, +/* 38263 */ {(12<<2)|2,{102,46,0}}, +/* 38264 */ {(12<<2)|2,{102,46,0}}, +/* 38265 */ {(12<<2)|2,{102,46,0}}, +/* 38266 */ {(12<<2)|2,{102,46,0}}, +/* 38267 */ {(12<<2)|2,{102,46,0}}, +/* 38268 */ {(12<<2)|2,{102,46,0}}, +/* 38269 */ {(12<<2)|2,{102,46,0}}, +/* 38270 */ {(12<<2)|2,{102,46,0}}, +/* 38271 */ {(12<<2)|2,{102,46,0}}, +/* 38272 */ {(12<<2)|2,{102,47,0}}, +/* 38273 */ {(12<<2)|2,{102,47,0}}, +/* 38274 */ {(12<<2)|2,{102,47,0}}, +/* 38275 */ {(12<<2)|2,{102,47,0}}, +/* 38276 */ {(12<<2)|2,{102,47,0}}, +/* 38277 */ {(12<<2)|2,{102,47,0}}, +/* 38278 */ {(12<<2)|2,{102,47,0}}, +/* 38279 */ {(12<<2)|2,{102,47,0}}, +/* 38280 */ {(12<<2)|2,{102,47,0}}, +/* 38281 */ {(12<<2)|2,{102,47,0}}, +/* 38282 */ {(12<<2)|2,{102,47,0}}, +/* 38283 */ {(12<<2)|2,{102,47,0}}, +/* 38284 */ {(12<<2)|2,{102,47,0}}, +/* 38285 */ {(12<<2)|2,{102,47,0}}, +/* 38286 */ {(12<<2)|2,{102,47,0}}, +/* 38287 */ {(12<<2)|2,{102,47,0}}, +/* 38288 */ {(12<<2)|2,{102,51,0}}, +/* 38289 */ {(12<<2)|2,{102,51,0}}, +/* 38290 */ {(12<<2)|2,{102,51,0}}, +/* 38291 */ {(12<<2)|2,{102,51,0}}, +/* 38292 */ {(12<<2)|2,{102,51,0}}, +/* 38293 */ {(12<<2)|2,{102,51,0}}, +/* 38294 */ {(12<<2)|2,{102,51,0}}, +/* 38295 */ {(12<<2)|2,{102,51,0}}, +/* 38296 */ {(12<<2)|2,{102,51,0}}, +/* 38297 */ {(12<<2)|2,{102,51,0}}, +/* 38298 */ {(12<<2)|2,{102,51,0}}, +/* 38299 */ {(12<<2)|2,{102,51,0}}, +/* 38300 */ {(12<<2)|2,{102,51,0}}, +/* 38301 */ {(12<<2)|2,{102,51,0}}, +/* 38302 */ {(12<<2)|2,{102,51,0}}, +/* 38303 */ {(12<<2)|2,{102,51,0}}, +/* 38304 */ {(12<<2)|2,{102,52,0}}, +/* 38305 */ {(12<<2)|2,{102,52,0}}, +/* 38306 */ {(12<<2)|2,{102,52,0}}, +/* 38307 */ {(12<<2)|2,{102,52,0}}, +/* 38308 */ {(12<<2)|2,{102,52,0}}, +/* 38309 */ {(12<<2)|2,{102,52,0}}, +/* 38310 */ {(12<<2)|2,{102,52,0}}, +/* 38311 */ {(12<<2)|2,{102,52,0}}, +/* 38312 */ {(12<<2)|2,{102,52,0}}, +/* 38313 */ {(12<<2)|2,{102,52,0}}, +/* 38314 */ {(12<<2)|2,{102,52,0}}, +/* 38315 */ {(12<<2)|2,{102,52,0}}, +/* 38316 */ {(12<<2)|2,{102,52,0}}, +/* 38317 */ {(12<<2)|2,{102,52,0}}, +/* 38318 */ {(12<<2)|2,{102,52,0}}, +/* 38319 */ {(12<<2)|2,{102,52,0}}, +/* 38320 */ {(12<<2)|2,{102,53,0}}, +/* 38321 */ {(12<<2)|2,{102,53,0}}, +/* 38322 */ {(12<<2)|2,{102,53,0}}, +/* 38323 */ {(12<<2)|2,{102,53,0}}, +/* 38324 */ {(12<<2)|2,{102,53,0}}, +/* 38325 */ {(12<<2)|2,{102,53,0}}, +/* 38326 */ {(12<<2)|2,{102,53,0}}, +/* 38327 */ {(12<<2)|2,{102,53,0}}, +/* 38328 */ {(12<<2)|2,{102,53,0}}, +/* 38329 */ {(12<<2)|2,{102,53,0}}, +/* 38330 */ {(12<<2)|2,{102,53,0}}, +/* 38331 */ {(12<<2)|2,{102,53,0}}, +/* 38332 */ {(12<<2)|2,{102,53,0}}, +/* 38333 */ {(12<<2)|2,{102,53,0}}, +/* 38334 */ {(12<<2)|2,{102,53,0}}, +/* 38335 */ {(12<<2)|2,{102,53,0}}, +/* 38336 */ {(12<<2)|2,{102,54,0}}, +/* 38337 */ {(12<<2)|2,{102,54,0}}, +/* 38338 */ {(12<<2)|2,{102,54,0}}, +/* 38339 */ {(12<<2)|2,{102,54,0}}, +/* 38340 */ {(12<<2)|2,{102,54,0}}, +/* 38341 */ {(12<<2)|2,{102,54,0}}, +/* 38342 */ {(12<<2)|2,{102,54,0}}, +/* 38343 */ {(12<<2)|2,{102,54,0}}, +/* 38344 */ {(12<<2)|2,{102,54,0}}, +/* 38345 */ {(12<<2)|2,{102,54,0}}, +/* 38346 */ {(12<<2)|2,{102,54,0}}, +/* 38347 */ {(12<<2)|2,{102,54,0}}, +/* 38348 */ {(12<<2)|2,{102,54,0}}, +/* 38349 */ {(12<<2)|2,{102,54,0}}, +/* 38350 */ {(12<<2)|2,{102,54,0}}, +/* 38351 */ {(12<<2)|2,{102,54,0}}, +/* 38352 */ {(12<<2)|2,{102,55,0}}, +/* 38353 */ {(12<<2)|2,{102,55,0}}, +/* 38354 */ {(12<<2)|2,{102,55,0}}, +/* 38355 */ {(12<<2)|2,{102,55,0}}, +/* 38356 */ {(12<<2)|2,{102,55,0}}, +/* 38357 */ {(12<<2)|2,{102,55,0}}, +/* 38358 */ {(12<<2)|2,{102,55,0}}, +/* 38359 */ {(12<<2)|2,{102,55,0}}, +/* 38360 */ {(12<<2)|2,{102,55,0}}, +/* 38361 */ {(12<<2)|2,{102,55,0}}, +/* 38362 */ {(12<<2)|2,{102,55,0}}, +/* 38363 */ {(12<<2)|2,{102,55,0}}, +/* 38364 */ {(12<<2)|2,{102,55,0}}, +/* 38365 */ {(12<<2)|2,{102,55,0}}, +/* 38366 */ {(12<<2)|2,{102,55,0}}, +/* 38367 */ {(12<<2)|2,{102,55,0}}, +/* 38368 */ {(12<<2)|2,{102,56,0}}, +/* 38369 */ {(12<<2)|2,{102,56,0}}, +/* 38370 */ {(12<<2)|2,{102,56,0}}, +/* 38371 */ {(12<<2)|2,{102,56,0}}, +/* 38372 */ {(12<<2)|2,{102,56,0}}, +/* 38373 */ {(12<<2)|2,{102,56,0}}, +/* 38374 */ {(12<<2)|2,{102,56,0}}, +/* 38375 */ {(12<<2)|2,{102,56,0}}, +/* 38376 */ {(12<<2)|2,{102,56,0}}, +/* 38377 */ {(12<<2)|2,{102,56,0}}, +/* 38378 */ {(12<<2)|2,{102,56,0}}, +/* 38379 */ {(12<<2)|2,{102,56,0}}, +/* 38380 */ {(12<<2)|2,{102,56,0}}, +/* 38381 */ {(12<<2)|2,{102,56,0}}, +/* 38382 */ {(12<<2)|2,{102,56,0}}, +/* 38383 */ {(12<<2)|2,{102,56,0}}, +/* 38384 */ {(12<<2)|2,{102,57,0}}, +/* 38385 */ {(12<<2)|2,{102,57,0}}, +/* 38386 */ {(12<<2)|2,{102,57,0}}, +/* 38387 */ {(12<<2)|2,{102,57,0}}, +/* 38388 */ {(12<<2)|2,{102,57,0}}, +/* 38389 */ {(12<<2)|2,{102,57,0}}, +/* 38390 */ {(12<<2)|2,{102,57,0}}, +/* 38391 */ {(12<<2)|2,{102,57,0}}, +/* 38392 */ {(12<<2)|2,{102,57,0}}, +/* 38393 */ {(12<<2)|2,{102,57,0}}, +/* 38394 */ {(12<<2)|2,{102,57,0}}, +/* 38395 */ {(12<<2)|2,{102,57,0}}, +/* 38396 */ {(12<<2)|2,{102,57,0}}, +/* 38397 */ {(12<<2)|2,{102,57,0}}, +/* 38398 */ {(12<<2)|2,{102,57,0}}, +/* 38399 */ {(12<<2)|2,{102,57,0}}, +/* 38400 */ {(12<<2)|2,{102,61,0}}, +/* 38401 */ {(12<<2)|2,{102,61,0}}, +/* 38402 */ {(12<<2)|2,{102,61,0}}, +/* 38403 */ {(12<<2)|2,{102,61,0}}, +/* 38404 */ {(12<<2)|2,{102,61,0}}, +/* 38405 */ {(12<<2)|2,{102,61,0}}, +/* 38406 */ {(12<<2)|2,{102,61,0}}, +/* 38407 */ {(12<<2)|2,{102,61,0}}, +/* 38408 */ {(12<<2)|2,{102,61,0}}, +/* 38409 */ {(12<<2)|2,{102,61,0}}, +/* 38410 */ {(12<<2)|2,{102,61,0}}, +/* 38411 */ {(12<<2)|2,{102,61,0}}, +/* 38412 */ {(12<<2)|2,{102,61,0}}, +/* 38413 */ {(12<<2)|2,{102,61,0}}, +/* 38414 */ {(12<<2)|2,{102,61,0}}, +/* 38415 */ {(12<<2)|2,{102,61,0}}, +/* 38416 */ {(12<<2)|2,{102,65,0}}, +/* 38417 */ {(12<<2)|2,{102,65,0}}, +/* 38418 */ {(12<<2)|2,{102,65,0}}, +/* 38419 */ {(12<<2)|2,{102,65,0}}, +/* 38420 */ {(12<<2)|2,{102,65,0}}, +/* 38421 */ {(12<<2)|2,{102,65,0}}, +/* 38422 */ {(12<<2)|2,{102,65,0}}, +/* 38423 */ {(12<<2)|2,{102,65,0}}, +/* 38424 */ {(12<<2)|2,{102,65,0}}, +/* 38425 */ {(12<<2)|2,{102,65,0}}, +/* 38426 */ {(12<<2)|2,{102,65,0}}, +/* 38427 */ {(12<<2)|2,{102,65,0}}, +/* 38428 */ {(12<<2)|2,{102,65,0}}, +/* 38429 */ {(12<<2)|2,{102,65,0}}, +/* 38430 */ {(12<<2)|2,{102,65,0}}, +/* 38431 */ {(12<<2)|2,{102,65,0}}, +/* 38432 */ {(12<<2)|2,{102,95,0}}, +/* 38433 */ {(12<<2)|2,{102,95,0}}, +/* 38434 */ {(12<<2)|2,{102,95,0}}, +/* 38435 */ {(12<<2)|2,{102,95,0}}, +/* 38436 */ {(12<<2)|2,{102,95,0}}, +/* 38437 */ {(12<<2)|2,{102,95,0}}, +/* 38438 */ {(12<<2)|2,{102,95,0}}, +/* 38439 */ {(12<<2)|2,{102,95,0}}, +/* 38440 */ {(12<<2)|2,{102,95,0}}, +/* 38441 */ {(12<<2)|2,{102,95,0}}, +/* 38442 */ {(12<<2)|2,{102,95,0}}, +/* 38443 */ {(12<<2)|2,{102,95,0}}, +/* 38444 */ {(12<<2)|2,{102,95,0}}, +/* 38445 */ {(12<<2)|2,{102,95,0}}, +/* 38446 */ {(12<<2)|2,{102,95,0}}, +/* 38447 */ {(12<<2)|2,{102,95,0}}, +/* 38448 */ {(12<<2)|2,{102,98,0}}, +/* 38449 */ {(12<<2)|2,{102,98,0}}, +/* 38450 */ {(12<<2)|2,{102,98,0}}, +/* 38451 */ {(12<<2)|2,{102,98,0}}, +/* 38452 */ {(12<<2)|2,{102,98,0}}, +/* 38453 */ {(12<<2)|2,{102,98,0}}, +/* 38454 */ {(12<<2)|2,{102,98,0}}, +/* 38455 */ {(12<<2)|2,{102,98,0}}, +/* 38456 */ {(12<<2)|2,{102,98,0}}, +/* 38457 */ {(12<<2)|2,{102,98,0}}, +/* 38458 */ {(12<<2)|2,{102,98,0}}, +/* 38459 */ {(12<<2)|2,{102,98,0}}, +/* 38460 */ {(12<<2)|2,{102,98,0}}, +/* 38461 */ {(12<<2)|2,{102,98,0}}, +/* 38462 */ {(12<<2)|2,{102,98,0}}, +/* 38463 */ {(12<<2)|2,{102,98,0}}, +/* 38464 */ {(12<<2)|2,{102,100,0}}, +/* 38465 */ {(12<<2)|2,{102,100,0}}, +/* 38466 */ {(12<<2)|2,{102,100,0}}, +/* 38467 */ {(12<<2)|2,{102,100,0}}, +/* 38468 */ {(12<<2)|2,{102,100,0}}, +/* 38469 */ {(12<<2)|2,{102,100,0}}, +/* 38470 */ {(12<<2)|2,{102,100,0}}, +/* 38471 */ {(12<<2)|2,{102,100,0}}, +/* 38472 */ {(12<<2)|2,{102,100,0}}, +/* 38473 */ {(12<<2)|2,{102,100,0}}, +/* 38474 */ {(12<<2)|2,{102,100,0}}, +/* 38475 */ {(12<<2)|2,{102,100,0}}, +/* 38476 */ {(12<<2)|2,{102,100,0}}, +/* 38477 */ {(12<<2)|2,{102,100,0}}, +/* 38478 */ {(12<<2)|2,{102,100,0}}, +/* 38479 */ {(12<<2)|2,{102,100,0}}, +/* 38480 */ {(12<<2)|2,{102,102,0}}, +/* 38481 */ {(12<<2)|2,{102,102,0}}, +/* 38482 */ {(12<<2)|2,{102,102,0}}, +/* 38483 */ {(12<<2)|2,{102,102,0}}, +/* 38484 */ {(12<<2)|2,{102,102,0}}, +/* 38485 */ {(12<<2)|2,{102,102,0}}, +/* 38486 */ {(12<<2)|2,{102,102,0}}, +/* 38487 */ {(12<<2)|2,{102,102,0}}, +/* 38488 */ {(12<<2)|2,{102,102,0}}, +/* 38489 */ {(12<<2)|2,{102,102,0}}, +/* 38490 */ {(12<<2)|2,{102,102,0}}, +/* 38491 */ {(12<<2)|2,{102,102,0}}, +/* 38492 */ {(12<<2)|2,{102,102,0}}, +/* 38493 */ {(12<<2)|2,{102,102,0}}, +/* 38494 */ {(12<<2)|2,{102,102,0}}, +/* 38495 */ {(12<<2)|2,{102,102,0}}, +/* 38496 */ {(12<<2)|2,{102,103,0}}, +/* 38497 */ {(12<<2)|2,{102,103,0}}, +/* 38498 */ {(12<<2)|2,{102,103,0}}, +/* 38499 */ {(12<<2)|2,{102,103,0}}, +/* 38500 */ {(12<<2)|2,{102,103,0}}, +/* 38501 */ {(12<<2)|2,{102,103,0}}, +/* 38502 */ {(12<<2)|2,{102,103,0}}, +/* 38503 */ {(12<<2)|2,{102,103,0}}, +/* 38504 */ {(12<<2)|2,{102,103,0}}, +/* 38505 */ {(12<<2)|2,{102,103,0}}, +/* 38506 */ {(12<<2)|2,{102,103,0}}, +/* 38507 */ {(12<<2)|2,{102,103,0}}, +/* 38508 */ {(12<<2)|2,{102,103,0}}, +/* 38509 */ {(12<<2)|2,{102,103,0}}, +/* 38510 */ {(12<<2)|2,{102,103,0}}, +/* 38511 */ {(12<<2)|2,{102,103,0}}, +/* 38512 */ {(12<<2)|2,{102,104,0}}, +/* 38513 */ {(12<<2)|2,{102,104,0}}, +/* 38514 */ {(12<<2)|2,{102,104,0}}, +/* 38515 */ {(12<<2)|2,{102,104,0}}, +/* 38516 */ {(12<<2)|2,{102,104,0}}, +/* 38517 */ {(12<<2)|2,{102,104,0}}, +/* 38518 */ {(12<<2)|2,{102,104,0}}, +/* 38519 */ {(12<<2)|2,{102,104,0}}, +/* 38520 */ {(12<<2)|2,{102,104,0}}, +/* 38521 */ {(12<<2)|2,{102,104,0}}, +/* 38522 */ {(12<<2)|2,{102,104,0}}, +/* 38523 */ {(12<<2)|2,{102,104,0}}, +/* 38524 */ {(12<<2)|2,{102,104,0}}, +/* 38525 */ {(12<<2)|2,{102,104,0}}, +/* 38526 */ {(12<<2)|2,{102,104,0}}, +/* 38527 */ {(12<<2)|2,{102,104,0}}, +/* 38528 */ {(12<<2)|2,{102,108,0}}, +/* 38529 */ {(12<<2)|2,{102,108,0}}, +/* 38530 */ {(12<<2)|2,{102,108,0}}, +/* 38531 */ {(12<<2)|2,{102,108,0}}, +/* 38532 */ {(12<<2)|2,{102,108,0}}, +/* 38533 */ {(12<<2)|2,{102,108,0}}, +/* 38534 */ {(12<<2)|2,{102,108,0}}, +/* 38535 */ {(12<<2)|2,{102,108,0}}, +/* 38536 */ {(12<<2)|2,{102,108,0}}, +/* 38537 */ {(12<<2)|2,{102,108,0}}, +/* 38538 */ {(12<<2)|2,{102,108,0}}, +/* 38539 */ {(12<<2)|2,{102,108,0}}, +/* 38540 */ {(12<<2)|2,{102,108,0}}, +/* 38541 */ {(12<<2)|2,{102,108,0}}, +/* 38542 */ {(12<<2)|2,{102,108,0}}, +/* 38543 */ {(12<<2)|2,{102,108,0}}, +/* 38544 */ {(12<<2)|2,{102,109,0}}, +/* 38545 */ {(12<<2)|2,{102,109,0}}, +/* 38546 */ {(12<<2)|2,{102,109,0}}, +/* 38547 */ {(12<<2)|2,{102,109,0}}, +/* 38548 */ {(12<<2)|2,{102,109,0}}, +/* 38549 */ {(12<<2)|2,{102,109,0}}, +/* 38550 */ {(12<<2)|2,{102,109,0}}, +/* 38551 */ {(12<<2)|2,{102,109,0}}, +/* 38552 */ {(12<<2)|2,{102,109,0}}, +/* 38553 */ {(12<<2)|2,{102,109,0}}, +/* 38554 */ {(12<<2)|2,{102,109,0}}, +/* 38555 */ {(12<<2)|2,{102,109,0}}, +/* 38556 */ {(12<<2)|2,{102,109,0}}, +/* 38557 */ {(12<<2)|2,{102,109,0}}, +/* 38558 */ {(12<<2)|2,{102,109,0}}, +/* 38559 */ {(12<<2)|2,{102,109,0}}, +/* 38560 */ {(12<<2)|2,{102,110,0}}, +/* 38561 */ {(12<<2)|2,{102,110,0}}, +/* 38562 */ {(12<<2)|2,{102,110,0}}, +/* 38563 */ {(12<<2)|2,{102,110,0}}, +/* 38564 */ {(12<<2)|2,{102,110,0}}, +/* 38565 */ {(12<<2)|2,{102,110,0}}, +/* 38566 */ {(12<<2)|2,{102,110,0}}, +/* 38567 */ {(12<<2)|2,{102,110,0}}, +/* 38568 */ {(12<<2)|2,{102,110,0}}, +/* 38569 */ {(12<<2)|2,{102,110,0}}, +/* 38570 */ {(12<<2)|2,{102,110,0}}, +/* 38571 */ {(12<<2)|2,{102,110,0}}, +/* 38572 */ {(12<<2)|2,{102,110,0}}, +/* 38573 */ {(12<<2)|2,{102,110,0}}, +/* 38574 */ {(12<<2)|2,{102,110,0}}, +/* 38575 */ {(12<<2)|2,{102,110,0}}, +/* 38576 */ {(12<<2)|2,{102,112,0}}, +/* 38577 */ {(12<<2)|2,{102,112,0}}, +/* 38578 */ {(12<<2)|2,{102,112,0}}, +/* 38579 */ {(12<<2)|2,{102,112,0}}, +/* 38580 */ {(12<<2)|2,{102,112,0}}, +/* 38581 */ {(12<<2)|2,{102,112,0}}, +/* 38582 */ {(12<<2)|2,{102,112,0}}, +/* 38583 */ {(12<<2)|2,{102,112,0}}, +/* 38584 */ {(12<<2)|2,{102,112,0}}, +/* 38585 */ {(12<<2)|2,{102,112,0}}, +/* 38586 */ {(12<<2)|2,{102,112,0}}, +/* 38587 */ {(12<<2)|2,{102,112,0}}, +/* 38588 */ {(12<<2)|2,{102,112,0}}, +/* 38589 */ {(12<<2)|2,{102,112,0}}, +/* 38590 */ {(12<<2)|2,{102,112,0}}, +/* 38591 */ {(12<<2)|2,{102,112,0}}, +/* 38592 */ {(12<<2)|2,{102,114,0}}, +/* 38593 */ {(12<<2)|2,{102,114,0}}, +/* 38594 */ {(12<<2)|2,{102,114,0}}, +/* 38595 */ {(12<<2)|2,{102,114,0}}, +/* 38596 */ {(12<<2)|2,{102,114,0}}, +/* 38597 */ {(12<<2)|2,{102,114,0}}, +/* 38598 */ {(12<<2)|2,{102,114,0}}, +/* 38599 */ {(12<<2)|2,{102,114,0}}, +/* 38600 */ {(12<<2)|2,{102,114,0}}, +/* 38601 */ {(12<<2)|2,{102,114,0}}, +/* 38602 */ {(12<<2)|2,{102,114,0}}, +/* 38603 */ {(12<<2)|2,{102,114,0}}, +/* 38604 */ {(12<<2)|2,{102,114,0}}, +/* 38605 */ {(12<<2)|2,{102,114,0}}, +/* 38606 */ {(12<<2)|2,{102,114,0}}, +/* 38607 */ {(12<<2)|2,{102,114,0}}, +/* 38608 */ {(12<<2)|2,{102,117,0}}, +/* 38609 */ {(12<<2)|2,{102,117,0}}, +/* 38610 */ {(12<<2)|2,{102,117,0}}, +/* 38611 */ {(12<<2)|2,{102,117,0}}, +/* 38612 */ {(12<<2)|2,{102,117,0}}, +/* 38613 */ {(12<<2)|2,{102,117,0}}, +/* 38614 */ {(12<<2)|2,{102,117,0}}, +/* 38615 */ {(12<<2)|2,{102,117,0}}, +/* 38616 */ {(12<<2)|2,{102,117,0}}, +/* 38617 */ {(12<<2)|2,{102,117,0}}, +/* 38618 */ {(12<<2)|2,{102,117,0}}, +/* 38619 */ {(12<<2)|2,{102,117,0}}, +/* 38620 */ {(12<<2)|2,{102,117,0}}, +/* 38621 */ {(12<<2)|2,{102,117,0}}, +/* 38622 */ {(12<<2)|2,{102,117,0}}, +/* 38623 */ {(12<<2)|2,{102,117,0}}, +/* 38624 */ {(13<<2)|2,{102,58,0}}, +/* 38625 */ {(13<<2)|2,{102,58,0}}, +/* 38626 */ {(13<<2)|2,{102,58,0}}, +/* 38627 */ {(13<<2)|2,{102,58,0}}, +/* 38628 */ {(13<<2)|2,{102,58,0}}, +/* 38629 */ {(13<<2)|2,{102,58,0}}, +/* 38630 */ {(13<<2)|2,{102,58,0}}, +/* 38631 */ {(13<<2)|2,{102,58,0}}, +/* 38632 */ {(13<<2)|2,{102,66,0}}, +/* 38633 */ {(13<<2)|2,{102,66,0}}, +/* 38634 */ {(13<<2)|2,{102,66,0}}, +/* 38635 */ {(13<<2)|2,{102,66,0}}, +/* 38636 */ {(13<<2)|2,{102,66,0}}, +/* 38637 */ {(13<<2)|2,{102,66,0}}, +/* 38638 */ {(13<<2)|2,{102,66,0}}, +/* 38639 */ {(13<<2)|2,{102,66,0}}, +/* 38640 */ {(13<<2)|2,{102,67,0}}, +/* 38641 */ {(13<<2)|2,{102,67,0}}, +/* 38642 */ {(13<<2)|2,{102,67,0}}, +/* 38643 */ {(13<<2)|2,{102,67,0}}, +/* 38644 */ {(13<<2)|2,{102,67,0}}, +/* 38645 */ {(13<<2)|2,{102,67,0}}, +/* 38646 */ {(13<<2)|2,{102,67,0}}, +/* 38647 */ {(13<<2)|2,{102,67,0}}, +/* 38648 */ {(13<<2)|2,{102,68,0}}, +/* 38649 */ {(13<<2)|2,{102,68,0}}, +/* 38650 */ {(13<<2)|2,{102,68,0}}, +/* 38651 */ {(13<<2)|2,{102,68,0}}, +/* 38652 */ {(13<<2)|2,{102,68,0}}, +/* 38653 */ {(13<<2)|2,{102,68,0}}, +/* 38654 */ {(13<<2)|2,{102,68,0}}, +/* 38655 */ {(13<<2)|2,{102,68,0}}, +/* 38656 */ {(13<<2)|2,{102,69,0}}, +/* 38657 */ {(13<<2)|2,{102,69,0}}, +/* 38658 */ {(13<<2)|2,{102,69,0}}, +/* 38659 */ {(13<<2)|2,{102,69,0}}, +/* 38660 */ {(13<<2)|2,{102,69,0}}, +/* 38661 */ {(13<<2)|2,{102,69,0}}, +/* 38662 */ {(13<<2)|2,{102,69,0}}, +/* 38663 */ {(13<<2)|2,{102,69,0}}, +/* 38664 */ {(13<<2)|2,{102,70,0}}, +/* 38665 */ {(13<<2)|2,{102,70,0}}, +/* 38666 */ {(13<<2)|2,{102,70,0}}, +/* 38667 */ {(13<<2)|2,{102,70,0}}, +/* 38668 */ {(13<<2)|2,{102,70,0}}, +/* 38669 */ {(13<<2)|2,{102,70,0}}, +/* 38670 */ {(13<<2)|2,{102,70,0}}, +/* 38671 */ {(13<<2)|2,{102,70,0}}, +/* 38672 */ {(13<<2)|2,{102,71,0}}, +/* 38673 */ {(13<<2)|2,{102,71,0}}, +/* 38674 */ {(13<<2)|2,{102,71,0}}, +/* 38675 */ {(13<<2)|2,{102,71,0}}, +/* 38676 */ {(13<<2)|2,{102,71,0}}, +/* 38677 */ {(13<<2)|2,{102,71,0}}, +/* 38678 */ {(13<<2)|2,{102,71,0}}, +/* 38679 */ {(13<<2)|2,{102,71,0}}, +/* 38680 */ {(13<<2)|2,{102,72,0}}, +/* 38681 */ {(13<<2)|2,{102,72,0}}, +/* 38682 */ {(13<<2)|2,{102,72,0}}, +/* 38683 */ {(13<<2)|2,{102,72,0}}, +/* 38684 */ {(13<<2)|2,{102,72,0}}, +/* 38685 */ {(13<<2)|2,{102,72,0}}, +/* 38686 */ {(13<<2)|2,{102,72,0}}, +/* 38687 */ {(13<<2)|2,{102,72,0}}, +/* 38688 */ {(13<<2)|2,{102,73,0}}, +/* 38689 */ {(13<<2)|2,{102,73,0}}, +/* 38690 */ {(13<<2)|2,{102,73,0}}, +/* 38691 */ {(13<<2)|2,{102,73,0}}, +/* 38692 */ {(13<<2)|2,{102,73,0}}, +/* 38693 */ {(13<<2)|2,{102,73,0}}, +/* 38694 */ {(13<<2)|2,{102,73,0}}, +/* 38695 */ {(13<<2)|2,{102,73,0}}, +/* 38696 */ {(13<<2)|2,{102,74,0}}, +/* 38697 */ {(13<<2)|2,{102,74,0}}, +/* 38698 */ {(13<<2)|2,{102,74,0}}, +/* 38699 */ {(13<<2)|2,{102,74,0}}, +/* 38700 */ {(13<<2)|2,{102,74,0}}, +/* 38701 */ {(13<<2)|2,{102,74,0}}, +/* 38702 */ {(13<<2)|2,{102,74,0}}, +/* 38703 */ {(13<<2)|2,{102,74,0}}, +/* 38704 */ {(13<<2)|2,{102,75,0}}, +/* 38705 */ {(13<<2)|2,{102,75,0}}, +/* 38706 */ {(13<<2)|2,{102,75,0}}, +/* 38707 */ {(13<<2)|2,{102,75,0}}, +/* 38708 */ {(13<<2)|2,{102,75,0}}, +/* 38709 */ {(13<<2)|2,{102,75,0}}, +/* 38710 */ {(13<<2)|2,{102,75,0}}, +/* 38711 */ {(13<<2)|2,{102,75,0}}, +/* 38712 */ {(13<<2)|2,{102,76,0}}, +/* 38713 */ {(13<<2)|2,{102,76,0}}, +/* 38714 */ {(13<<2)|2,{102,76,0}}, +/* 38715 */ {(13<<2)|2,{102,76,0}}, +/* 38716 */ {(13<<2)|2,{102,76,0}}, +/* 38717 */ {(13<<2)|2,{102,76,0}}, +/* 38718 */ {(13<<2)|2,{102,76,0}}, +/* 38719 */ {(13<<2)|2,{102,76,0}}, +/* 38720 */ {(13<<2)|2,{102,77,0}}, +/* 38721 */ {(13<<2)|2,{102,77,0}}, +/* 38722 */ {(13<<2)|2,{102,77,0}}, +/* 38723 */ {(13<<2)|2,{102,77,0}}, +/* 38724 */ {(13<<2)|2,{102,77,0}}, +/* 38725 */ {(13<<2)|2,{102,77,0}}, +/* 38726 */ {(13<<2)|2,{102,77,0}}, +/* 38727 */ {(13<<2)|2,{102,77,0}}, +/* 38728 */ {(13<<2)|2,{102,78,0}}, +/* 38729 */ {(13<<2)|2,{102,78,0}}, +/* 38730 */ {(13<<2)|2,{102,78,0}}, +/* 38731 */ {(13<<2)|2,{102,78,0}}, +/* 38732 */ {(13<<2)|2,{102,78,0}}, +/* 38733 */ {(13<<2)|2,{102,78,0}}, +/* 38734 */ {(13<<2)|2,{102,78,0}}, +/* 38735 */ {(13<<2)|2,{102,78,0}}, +/* 38736 */ {(13<<2)|2,{102,79,0}}, +/* 38737 */ {(13<<2)|2,{102,79,0}}, +/* 38738 */ {(13<<2)|2,{102,79,0}}, +/* 38739 */ {(13<<2)|2,{102,79,0}}, +/* 38740 */ {(13<<2)|2,{102,79,0}}, +/* 38741 */ {(13<<2)|2,{102,79,0}}, +/* 38742 */ {(13<<2)|2,{102,79,0}}, +/* 38743 */ {(13<<2)|2,{102,79,0}}, +/* 38744 */ {(13<<2)|2,{102,80,0}}, +/* 38745 */ {(13<<2)|2,{102,80,0}}, +/* 38746 */ {(13<<2)|2,{102,80,0}}, +/* 38747 */ {(13<<2)|2,{102,80,0}}, +/* 38748 */ {(13<<2)|2,{102,80,0}}, +/* 38749 */ {(13<<2)|2,{102,80,0}}, +/* 38750 */ {(13<<2)|2,{102,80,0}}, +/* 38751 */ {(13<<2)|2,{102,80,0}}, +/* 38752 */ {(13<<2)|2,{102,81,0}}, +/* 38753 */ {(13<<2)|2,{102,81,0}}, +/* 38754 */ {(13<<2)|2,{102,81,0}}, +/* 38755 */ {(13<<2)|2,{102,81,0}}, +/* 38756 */ {(13<<2)|2,{102,81,0}}, +/* 38757 */ {(13<<2)|2,{102,81,0}}, +/* 38758 */ {(13<<2)|2,{102,81,0}}, +/* 38759 */ {(13<<2)|2,{102,81,0}}, +/* 38760 */ {(13<<2)|2,{102,82,0}}, +/* 38761 */ {(13<<2)|2,{102,82,0}}, +/* 38762 */ {(13<<2)|2,{102,82,0}}, +/* 38763 */ {(13<<2)|2,{102,82,0}}, +/* 38764 */ {(13<<2)|2,{102,82,0}}, +/* 38765 */ {(13<<2)|2,{102,82,0}}, +/* 38766 */ {(13<<2)|2,{102,82,0}}, +/* 38767 */ {(13<<2)|2,{102,82,0}}, +/* 38768 */ {(13<<2)|2,{102,83,0}}, +/* 38769 */ {(13<<2)|2,{102,83,0}}, +/* 38770 */ {(13<<2)|2,{102,83,0}}, +/* 38771 */ {(13<<2)|2,{102,83,0}}, +/* 38772 */ {(13<<2)|2,{102,83,0}}, +/* 38773 */ {(13<<2)|2,{102,83,0}}, +/* 38774 */ {(13<<2)|2,{102,83,0}}, +/* 38775 */ {(13<<2)|2,{102,83,0}}, +/* 38776 */ {(13<<2)|2,{102,84,0}}, +/* 38777 */ {(13<<2)|2,{102,84,0}}, +/* 38778 */ {(13<<2)|2,{102,84,0}}, +/* 38779 */ {(13<<2)|2,{102,84,0}}, +/* 38780 */ {(13<<2)|2,{102,84,0}}, +/* 38781 */ {(13<<2)|2,{102,84,0}}, +/* 38782 */ {(13<<2)|2,{102,84,0}}, +/* 38783 */ {(13<<2)|2,{102,84,0}}, +/* 38784 */ {(13<<2)|2,{102,85,0}}, +/* 38785 */ {(13<<2)|2,{102,85,0}}, +/* 38786 */ {(13<<2)|2,{102,85,0}}, +/* 38787 */ {(13<<2)|2,{102,85,0}}, +/* 38788 */ {(13<<2)|2,{102,85,0}}, +/* 38789 */ {(13<<2)|2,{102,85,0}}, +/* 38790 */ {(13<<2)|2,{102,85,0}}, +/* 38791 */ {(13<<2)|2,{102,85,0}}, +/* 38792 */ {(13<<2)|2,{102,86,0}}, +/* 38793 */ {(13<<2)|2,{102,86,0}}, +/* 38794 */ {(13<<2)|2,{102,86,0}}, +/* 38795 */ {(13<<2)|2,{102,86,0}}, +/* 38796 */ {(13<<2)|2,{102,86,0}}, +/* 38797 */ {(13<<2)|2,{102,86,0}}, +/* 38798 */ {(13<<2)|2,{102,86,0}}, +/* 38799 */ {(13<<2)|2,{102,86,0}}, +/* 38800 */ {(13<<2)|2,{102,87,0}}, +/* 38801 */ {(13<<2)|2,{102,87,0}}, +/* 38802 */ {(13<<2)|2,{102,87,0}}, +/* 38803 */ {(13<<2)|2,{102,87,0}}, +/* 38804 */ {(13<<2)|2,{102,87,0}}, +/* 38805 */ {(13<<2)|2,{102,87,0}}, +/* 38806 */ {(13<<2)|2,{102,87,0}}, +/* 38807 */ {(13<<2)|2,{102,87,0}}, +/* 38808 */ {(13<<2)|2,{102,89,0}}, +/* 38809 */ {(13<<2)|2,{102,89,0}}, +/* 38810 */ {(13<<2)|2,{102,89,0}}, +/* 38811 */ {(13<<2)|2,{102,89,0}}, +/* 38812 */ {(13<<2)|2,{102,89,0}}, +/* 38813 */ {(13<<2)|2,{102,89,0}}, +/* 38814 */ {(13<<2)|2,{102,89,0}}, +/* 38815 */ {(13<<2)|2,{102,89,0}}, +/* 38816 */ {(13<<2)|2,{102,106,0}}, +/* 38817 */ {(13<<2)|2,{102,106,0}}, +/* 38818 */ {(13<<2)|2,{102,106,0}}, +/* 38819 */ {(13<<2)|2,{102,106,0}}, +/* 38820 */ {(13<<2)|2,{102,106,0}}, +/* 38821 */ {(13<<2)|2,{102,106,0}}, +/* 38822 */ {(13<<2)|2,{102,106,0}}, +/* 38823 */ {(13<<2)|2,{102,106,0}}, +/* 38824 */ {(13<<2)|2,{102,107,0}}, +/* 38825 */ {(13<<2)|2,{102,107,0}}, +/* 38826 */ {(13<<2)|2,{102,107,0}}, +/* 38827 */ {(13<<2)|2,{102,107,0}}, +/* 38828 */ {(13<<2)|2,{102,107,0}}, +/* 38829 */ {(13<<2)|2,{102,107,0}}, +/* 38830 */ {(13<<2)|2,{102,107,0}}, +/* 38831 */ {(13<<2)|2,{102,107,0}}, +/* 38832 */ {(13<<2)|2,{102,113,0}}, +/* 38833 */ {(13<<2)|2,{102,113,0}}, +/* 38834 */ {(13<<2)|2,{102,113,0}}, +/* 38835 */ {(13<<2)|2,{102,113,0}}, +/* 38836 */ {(13<<2)|2,{102,113,0}}, +/* 38837 */ {(13<<2)|2,{102,113,0}}, +/* 38838 */ {(13<<2)|2,{102,113,0}}, +/* 38839 */ {(13<<2)|2,{102,113,0}}, +/* 38840 */ {(13<<2)|2,{102,118,0}}, +/* 38841 */ {(13<<2)|2,{102,118,0}}, +/* 38842 */ {(13<<2)|2,{102,118,0}}, +/* 38843 */ {(13<<2)|2,{102,118,0}}, +/* 38844 */ {(13<<2)|2,{102,118,0}}, +/* 38845 */ {(13<<2)|2,{102,118,0}}, +/* 38846 */ {(13<<2)|2,{102,118,0}}, +/* 38847 */ {(13<<2)|2,{102,118,0}}, +/* 38848 */ {(13<<2)|2,{102,119,0}}, +/* 38849 */ {(13<<2)|2,{102,119,0}}, +/* 38850 */ {(13<<2)|2,{102,119,0}}, +/* 38851 */ {(13<<2)|2,{102,119,0}}, +/* 38852 */ {(13<<2)|2,{102,119,0}}, +/* 38853 */ {(13<<2)|2,{102,119,0}}, +/* 38854 */ {(13<<2)|2,{102,119,0}}, +/* 38855 */ {(13<<2)|2,{102,119,0}}, +/* 38856 */ {(13<<2)|2,{102,120,0}}, +/* 38857 */ {(13<<2)|2,{102,120,0}}, +/* 38858 */ {(13<<2)|2,{102,120,0}}, +/* 38859 */ {(13<<2)|2,{102,120,0}}, +/* 38860 */ {(13<<2)|2,{102,120,0}}, +/* 38861 */ {(13<<2)|2,{102,120,0}}, +/* 38862 */ {(13<<2)|2,{102,120,0}}, +/* 38863 */ {(13<<2)|2,{102,120,0}}, +/* 38864 */ {(13<<2)|2,{102,121,0}}, +/* 38865 */ {(13<<2)|2,{102,121,0}}, +/* 38866 */ {(13<<2)|2,{102,121,0}}, +/* 38867 */ {(13<<2)|2,{102,121,0}}, +/* 38868 */ {(13<<2)|2,{102,121,0}}, +/* 38869 */ {(13<<2)|2,{102,121,0}}, +/* 38870 */ {(13<<2)|2,{102,121,0}}, +/* 38871 */ {(13<<2)|2,{102,121,0}}, +/* 38872 */ {(13<<2)|2,{102,122,0}}, +/* 38873 */ {(13<<2)|2,{102,122,0}}, +/* 38874 */ {(13<<2)|2,{102,122,0}}, +/* 38875 */ {(13<<2)|2,{102,122,0}}, +/* 38876 */ {(13<<2)|2,{102,122,0}}, +/* 38877 */ {(13<<2)|2,{102,122,0}}, +/* 38878 */ {(13<<2)|2,{102,122,0}}, +/* 38879 */ {(13<<2)|2,{102,122,0}}, +/* 38880 */ {(14<<2)|2,{102,38,0}}, +/* 38881 */ {(14<<2)|2,{102,38,0}}, +/* 38882 */ {(14<<2)|2,{102,38,0}}, +/* 38883 */ {(14<<2)|2,{102,38,0}}, +/* 38884 */ {(14<<2)|2,{102,42,0}}, +/* 38885 */ {(14<<2)|2,{102,42,0}}, +/* 38886 */ {(14<<2)|2,{102,42,0}}, +/* 38887 */ {(14<<2)|2,{102,42,0}}, +/* 38888 */ {(14<<2)|2,{102,44,0}}, +/* 38889 */ {(14<<2)|2,{102,44,0}}, +/* 38890 */ {(14<<2)|2,{102,44,0}}, +/* 38891 */ {(14<<2)|2,{102,44,0}}, +/* 38892 */ {(14<<2)|2,{102,59,0}}, +/* 38893 */ {(14<<2)|2,{102,59,0}}, +/* 38894 */ {(14<<2)|2,{102,59,0}}, +/* 38895 */ {(14<<2)|2,{102,59,0}}, +/* 38896 */ {(14<<2)|2,{102,88,0}}, +/* 38897 */ {(14<<2)|2,{102,88,0}}, +/* 38898 */ {(14<<2)|2,{102,88,0}}, +/* 38899 */ {(14<<2)|2,{102,88,0}}, +/* 38900 */ {(14<<2)|2,{102,90,0}}, +/* 38901 */ {(14<<2)|2,{102,90,0}}, +/* 38902 */ {(14<<2)|2,{102,90,0}}, +/* 38903 */ {(14<<2)|2,{102,90,0}}, +/* 38904 */ {(16<<2)|2,{102,33,0}}, +/* 38905 */ {(16<<2)|2,{102,34,0}}, +/* 38906 */ {(16<<2)|2,{102,40,0}}, +/* 38907 */ {(16<<2)|2,{102,41,0}}, +/* 38908 */ {(16<<2)|2,{102,63,0}}, +/* 38909 */ {(6<<2)|1,{102,0,0}}, +/* 38910 */ {(6<<2)|1,{102,0,0}}, +/* 38911 */ {(6<<2)|1,{102,0,0}}, +/* 38912 */ {(16<<2)|3,{103,48,48}}, +/* 38913 */ {(16<<2)|3,{103,48,49}}, +/* 38914 */ {(16<<2)|3,{103,48,50}}, +/* 38915 */ {(16<<2)|3,{103,48,97}}, +/* 38916 */ {(16<<2)|3,{103,48,99}}, +/* 38917 */ {(16<<2)|3,{103,48,101}}, +/* 38918 */ {(16<<2)|3,{103,48,105}}, +/* 38919 */ {(16<<2)|3,{103,48,111}}, +/* 38920 */ {(16<<2)|3,{103,48,115}}, +/* 38921 */ {(16<<2)|3,{103,48,116}}, +/* 38922 */ {(11<<2)|2,{103,48,0}}, +/* 38923 */ {(11<<2)|2,{103,48,0}}, +/* 38924 */ {(11<<2)|2,{103,48,0}}, +/* 38925 */ {(11<<2)|2,{103,48,0}}, +/* 38926 */ {(11<<2)|2,{103,48,0}}, +/* 38927 */ {(11<<2)|2,{103,48,0}}, +/* 38928 */ {(11<<2)|2,{103,48,0}}, +/* 38929 */ {(11<<2)|2,{103,48,0}}, +/* 38930 */ {(11<<2)|2,{103,48,0}}, +/* 38931 */ {(11<<2)|2,{103,48,0}}, +/* 38932 */ {(11<<2)|2,{103,48,0}}, +/* 38933 */ {(11<<2)|2,{103,48,0}}, +/* 38934 */ {(11<<2)|2,{103,48,0}}, +/* 38935 */ {(11<<2)|2,{103,48,0}}, +/* 38936 */ {(11<<2)|2,{103,48,0}}, +/* 38937 */ {(11<<2)|2,{103,48,0}}, +/* 38938 */ {(11<<2)|2,{103,48,0}}, +/* 38939 */ {(11<<2)|2,{103,48,0}}, +/* 38940 */ {(11<<2)|2,{103,48,0}}, +/* 38941 */ {(11<<2)|2,{103,48,0}}, +/* 38942 */ {(11<<2)|2,{103,48,0}}, +/* 38943 */ {(11<<2)|2,{103,48,0}}, +/* 38944 */ {(16<<2)|3,{103,49,48}}, +/* 38945 */ {(16<<2)|3,{103,49,49}}, +/* 38946 */ {(16<<2)|3,{103,49,50}}, +/* 38947 */ {(16<<2)|3,{103,49,97}}, +/* 38948 */ {(16<<2)|3,{103,49,99}}, +/* 38949 */ {(16<<2)|3,{103,49,101}}, +/* 38950 */ {(16<<2)|3,{103,49,105}}, +/* 38951 */ {(16<<2)|3,{103,49,111}}, +/* 38952 */ {(16<<2)|3,{103,49,115}}, +/* 38953 */ {(16<<2)|3,{103,49,116}}, +/* 38954 */ {(11<<2)|2,{103,49,0}}, +/* 38955 */ {(11<<2)|2,{103,49,0}}, +/* 38956 */ {(11<<2)|2,{103,49,0}}, +/* 38957 */ {(11<<2)|2,{103,49,0}}, +/* 38958 */ {(11<<2)|2,{103,49,0}}, +/* 38959 */ {(11<<2)|2,{103,49,0}}, +/* 38960 */ {(11<<2)|2,{103,49,0}}, +/* 38961 */ {(11<<2)|2,{103,49,0}}, +/* 38962 */ {(11<<2)|2,{103,49,0}}, +/* 38963 */ {(11<<2)|2,{103,49,0}}, +/* 38964 */ {(11<<2)|2,{103,49,0}}, +/* 38965 */ {(11<<2)|2,{103,49,0}}, +/* 38966 */ {(11<<2)|2,{103,49,0}}, +/* 38967 */ {(11<<2)|2,{103,49,0}}, +/* 38968 */ {(11<<2)|2,{103,49,0}}, +/* 38969 */ {(11<<2)|2,{103,49,0}}, +/* 38970 */ {(11<<2)|2,{103,49,0}}, +/* 38971 */ {(11<<2)|2,{103,49,0}}, +/* 38972 */ {(11<<2)|2,{103,49,0}}, +/* 38973 */ {(11<<2)|2,{103,49,0}}, +/* 38974 */ {(11<<2)|2,{103,49,0}}, +/* 38975 */ {(11<<2)|2,{103,49,0}}, +/* 38976 */ {(16<<2)|3,{103,50,48}}, +/* 38977 */ {(16<<2)|3,{103,50,49}}, +/* 38978 */ {(16<<2)|3,{103,50,50}}, +/* 38979 */ {(16<<2)|3,{103,50,97}}, +/* 38980 */ {(16<<2)|3,{103,50,99}}, +/* 38981 */ {(16<<2)|3,{103,50,101}}, +/* 38982 */ {(16<<2)|3,{103,50,105}}, +/* 38983 */ {(16<<2)|3,{103,50,111}}, +/* 38984 */ {(16<<2)|3,{103,50,115}}, +/* 38985 */ {(16<<2)|3,{103,50,116}}, +/* 38986 */ {(11<<2)|2,{103,50,0}}, +/* 38987 */ {(11<<2)|2,{103,50,0}}, +/* 38988 */ {(11<<2)|2,{103,50,0}}, +/* 38989 */ {(11<<2)|2,{103,50,0}}, +/* 38990 */ {(11<<2)|2,{103,50,0}}, +/* 38991 */ {(11<<2)|2,{103,50,0}}, +/* 38992 */ {(11<<2)|2,{103,50,0}}, +/* 38993 */ {(11<<2)|2,{103,50,0}}, +/* 38994 */ {(11<<2)|2,{103,50,0}}, +/* 38995 */ {(11<<2)|2,{103,50,0}}, +/* 38996 */ {(11<<2)|2,{103,50,0}}, +/* 38997 */ {(11<<2)|2,{103,50,0}}, +/* 38998 */ {(11<<2)|2,{103,50,0}}, +/* 38999 */ {(11<<2)|2,{103,50,0}}, +/* 39000 */ {(11<<2)|2,{103,50,0}}, +/* 39001 */ {(11<<2)|2,{103,50,0}}, +/* 39002 */ {(11<<2)|2,{103,50,0}}, +/* 39003 */ {(11<<2)|2,{103,50,0}}, +/* 39004 */ {(11<<2)|2,{103,50,0}}, +/* 39005 */ {(11<<2)|2,{103,50,0}}, +/* 39006 */ {(11<<2)|2,{103,50,0}}, +/* 39007 */ {(11<<2)|2,{103,50,0}}, +/* 39008 */ {(16<<2)|3,{103,97,48}}, +/* 39009 */ {(16<<2)|3,{103,97,49}}, +/* 39010 */ {(16<<2)|3,{103,97,50}}, +/* 39011 */ {(16<<2)|3,{103,97,97}}, +/* 39012 */ {(16<<2)|3,{103,97,99}}, +/* 39013 */ {(16<<2)|3,{103,97,101}}, +/* 39014 */ {(16<<2)|3,{103,97,105}}, +/* 39015 */ {(16<<2)|3,{103,97,111}}, +/* 39016 */ {(16<<2)|3,{103,97,115}}, +/* 39017 */ {(16<<2)|3,{103,97,116}}, +/* 39018 */ {(11<<2)|2,{103,97,0}}, +/* 39019 */ {(11<<2)|2,{103,97,0}}, +/* 39020 */ {(11<<2)|2,{103,97,0}}, +/* 39021 */ {(11<<2)|2,{103,97,0}}, +/* 39022 */ {(11<<2)|2,{103,97,0}}, +/* 39023 */ {(11<<2)|2,{103,97,0}}, +/* 39024 */ {(11<<2)|2,{103,97,0}}, +/* 39025 */ {(11<<2)|2,{103,97,0}}, +/* 39026 */ {(11<<2)|2,{103,97,0}}, +/* 39027 */ {(11<<2)|2,{103,97,0}}, +/* 39028 */ {(11<<2)|2,{103,97,0}}, +/* 39029 */ {(11<<2)|2,{103,97,0}}, +/* 39030 */ {(11<<2)|2,{103,97,0}}, +/* 39031 */ {(11<<2)|2,{103,97,0}}, +/* 39032 */ {(11<<2)|2,{103,97,0}}, +/* 39033 */ {(11<<2)|2,{103,97,0}}, +/* 39034 */ {(11<<2)|2,{103,97,0}}, +/* 39035 */ {(11<<2)|2,{103,97,0}}, +/* 39036 */ {(11<<2)|2,{103,97,0}}, +/* 39037 */ {(11<<2)|2,{103,97,0}}, +/* 39038 */ {(11<<2)|2,{103,97,0}}, +/* 39039 */ {(11<<2)|2,{103,97,0}}, +/* 39040 */ {(16<<2)|3,{103,99,48}}, +/* 39041 */ {(16<<2)|3,{103,99,49}}, +/* 39042 */ {(16<<2)|3,{103,99,50}}, +/* 39043 */ {(16<<2)|3,{103,99,97}}, +/* 39044 */ {(16<<2)|3,{103,99,99}}, +/* 39045 */ {(16<<2)|3,{103,99,101}}, +/* 39046 */ {(16<<2)|3,{103,99,105}}, +/* 39047 */ {(16<<2)|3,{103,99,111}}, +/* 39048 */ {(16<<2)|3,{103,99,115}}, +/* 39049 */ {(16<<2)|3,{103,99,116}}, +/* 39050 */ {(11<<2)|2,{103,99,0}}, +/* 39051 */ {(11<<2)|2,{103,99,0}}, +/* 39052 */ {(11<<2)|2,{103,99,0}}, +/* 39053 */ {(11<<2)|2,{103,99,0}}, +/* 39054 */ {(11<<2)|2,{103,99,0}}, +/* 39055 */ {(11<<2)|2,{103,99,0}}, +/* 39056 */ {(11<<2)|2,{103,99,0}}, +/* 39057 */ {(11<<2)|2,{103,99,0}}, +/* 39058 */ {(11<<2)|2,{103,99,0}}, +/* 39059 */ {(11<<2)|2,{103,99,0}}, +/* 39060 */ {(11<<2)|2,{103,99,0}}, +/* 39061 */ {(11<<2)|2,{103,99,0}}, +/* 39062 */ {(11<<2)|2,{103,99,0}}, +/* 39063 */ {(11<<2)|2,{103,99,0}}, +/* 39064 */ {(11<<2)|2,{103,99,0}}, +/* 39065 */ {(11<<2)|2,{103,99,0}}, +/* 39066 */ {(11<<2)|2,{103,99,0}}, +/* 39067 */ {(11<<2)|2,{103,99,0}}, +/* 39068 */ {(11<<2)|2,{103,99,0}}, +/* 39069 */ {(11<<2)|2,{103,99,0}}, +/* 39070 */ {(11<<2)|2,{103,99,0}}, +/* 39071 */ {(11<<2)|2,{103,99,0}}, +/* 39072 */ {(16<<2)|3,{103,101,48}}, +/* 39073 */ {(16<<2)|3,{103,101,49}}, +/* 39074 */ {(16<<2)|3,{103,101,50}}, +/* 39075 */ {(16<<2)|3,{103,101,97}}, +/* 39076 */ {(16<<2)|3,{103,101,99}}, +/* 39077 */ {(16<<2)|3,{103,101,101}}, +/* 39078 */ {(16<<2)|3,{103,101,105}}, +/* 39079 */ {(16<<2)|3,{103,101,111}}, +/* 39080 */ {(16<<2)|3,{103,101,115}}, +/* 39081 */ {(16<<2)|3,{103,101,116}}, +/* 39082 */ {(11<<2)|2,{103,101,0}}, +/* 39083 */ {(11<<2)|2,{103,101,0}}, +/* 39084 */ {(11<<2)|2,{103,101,0}}, +/* 39085 */ {(11<<2)|2,{103,101,0}}, +/* 39086 */ {(11<<2)|2,{103,101,0}}, +/* 39087 */ {(11<<2)|2,{103,101,0}}, +/* 39088 */ {(11<<2)|2,{103,101,0}}, +/* 39089 */ {(11<<2)|2,{103,101,0}}, +/* 39090 */ {(11<<2)|2,{103,101,0}}, +/* 39091 */ {(11<<2)|2,{103,101,0}}, +/* 39092 */ {(11<<2)|2,{103,101,0}}, +/* 39093 */ {(11<<2)|2,{103,101,0}}, +/* 39094 */ {(11<<2)|2,{103,101,0}}, +/* 39095 */ {(11<<2)|2,{103,101,0}}, +/* 39096 */ {(11<<2)|2,{103,101,0}}, +/* 39097 */ {(11<<2)|2,{103,101,0}}, +/* 39098 */ {(11<<2)|2,{103,101,0}}, +/* 39099 */ {(11<<2)|2,{103,101,0}}, +/* 39100 */ {(11<<2)|2,{103,101,0}}, +/* 39101 */ {(11<<2)|2,{103,101,0}}, +/* 39102 */ {(11<<2)|2,{103,101,0}}, +/* 39103 */ {(11<<2)|2,{103,101,0}}, +/* 39104 */ {(16<<2)|3,{103,105,48}}, +/* 39105 */ {(16<<2)|3,{103,105,49}}, +/* 39106 */ {(16<<2)|3,{103,105,50}}, +/* 39107 */ {(16<<2)|3,{103,105,97}}, +/* 39108 */ {(16<<2)|3,{103,105,99}}, +/* 39109 */ {(16<<2)|3,{103,105,101}}, +/* 39110 */ {(16<<2)|3,{103,105,105}}, +/* 39111 */ {(16<<2)|3,{103,105,111}}, +/* 39112 */ {(16<<2)|3,{103,105,115}}, +/* 39113 */ {(16<<2)|3,{103,105,116}}, +/* 39114 */ {(11<<2)|2,{103,105,0}}, +/* 39115 */ {(11<<2)|2,{103,105,0}}, +/* 39116 */ {(11<<2)|2,{103,105,0}}, +/* 39117 */ {(11<<2)|2,{103,105,0}}, +/* 39118 */ {(11<<2)|2,{103,105,0}}, +/* 39119 */ {(11<<2)|2,{103,105,0}}, +/* 39120 */ {(11<<2)|2,{103,105,0}}, +/* 39121 */ {(11<<2)|2,{103,105,0}}, +/* 39122 */ {(11<<2)|2,{103,105,0}}, +/* 39123 */ {(11<<2)|2,{103,105,0}}, +/* 39124 */ {(11<<2)|2,{103,105,0}}, +/* 39125 */ {(11<<2)|2,{103,105,0}}, +/* 39126 */ {(11<<2)|2,{103,105,0}}, +/* 39127 */ {(11<<2)|2,{103,105,0}}, +/* 39128 */ {(11<<2)|2,{103,105,0}}, +/* 39129 */ {(11<<2)|2,{103,105,0}}, +/* 39130 */ {(11<<2)|2,{103,105,0}}, +/* 39131 */ {(11<<2)|2,{103,105,0}}, +/* 39132 */ {(11<<2)|2,{103,105,0}}, +/* 39133 */ {(11<<2)|2,{103,105,0}}, +/* 39134 */ {(11<<2)|2,{103,105,0}}, +/* 39135 */ {(11<<2)|2,{103,105,0}}, +/* 39136 */ {(16<<2)|3,{103,111,48}}, +/* 39137 */ {(16<<2)|3,{103,111,49}}, +/* 39138 */ {(16<<2)|3,{103,111,50}}, +/* 39139 */ {(16<<2)|3,{103,111,97}}, +/* 39140 */ {(16<<2)|3,{103,111,99}}, +/* 39141 */ {(16<<2)|3,{103,111,101}}, +/* 39142 */ {(16<<2)|3,{103,111,105}}, +/* 39143 */ {(16<<2)|3,{103,111,111}}, +/* 39144 */ {(16<<2)|3,{103,111,115}}, +/* 39145 */ {(16<<2)|3,{103,111,116}}, +/* 39146 */ {(11<<2)|2,{103,111,0}}, +/* 39147 */ {(11<<2)|2,{103,111,0}}, +/* 39148 */ {(11<<2)|2,{103,111,0}}, +/* 39149 */ {(11<<2)|2,{103,111,0}}, +/* 39150 */ {(11<<2)|2,{103,111,0}}, +/* 39151 */ {(11<<2)|2,{103,111,0}}, +/* 39152 */ {(11<<2)|2,{103,111,0}}, +/* 39153 */ {(11<<2)|2,{103,111,0}}, +/* 39154 */ {(11<<2)|2,{103,111,0}}, +/* 39155 */ {(11<<2)|2,{103,111,0}}, +/* 39156 */ {(11<<2)|2,{103,111,0}}, +/* 39157 */ {(11<<2)|2,{103,111,0}}, +/* 39158 */ {(11<<2)|2,{103,111,0}}, +/* 39159 */ {(11<<2)|2,{103,111,0}}, +/* 39160 */ {(11<<2)|2,{103,111,0}}, +/* 39161 */ {(11<<2)|2,{103,111,0}}, +/* 39162 */ {(11<<2)|2,{103,111,0}}, +/* 39163 */ {(11<<2)|2,{103,111,0}}, +/* 39164 */ {(11<<2)|2,{103,111,0}}, +/* 39165 */ {(11<<2)|2,{103,111,0}}, +/* 39166 */ {(11<<2)|2,{103,111,0}}, +/* 39167 */ {(11<<2)|2,{103,111,0}}, +/* 39168 */ {(16<<2)|3,{103,115,48}}, +/* 39169 */ {(16<<2)|3,{103,115,49}}, +/* 39170 */ {(16<<2)|3,{103,115,50}}, +/* 39171 */ {(16<<2)|3,{103,115,97}}, +/* 39172 */ {(16<<2)|3,{103,115,99}}, +/* 39173 */ {(16<<2)|3,{103,115,101}}, +/* 39174 */ {(16<<2)|3,{103,115,105}}, +/* 39175 */ {(16<<2)|3,{103,115,111}}, +/* 39176 */ {(16<<2)|3,{103,115,115}}, +/* 39177 */ {(16<<2)|3,{103,115,116}}, +/* 39178 */ {(11<<2)|2,{103,115,0}}, +/* 39179 */ {(11<<2)|2,{103,115,0}}, +/* 39180 */ {(11<<2)|2,{103,115,0}}, +/* 39181 */ {(11<<2)|2,{103,115,0}}, +/* 39182 */ {(11<<2)|2,{103,115,0}}, +/* 39183 */ {(11<<2)|2,{103,115,0}}, +/* 39184 */ {(11<<2)|2,{103,115,0}}, +/* 39185 */ {(11<<2)|2,{103,115,0}}, +/* 39186 */ {(11<<2)|2,{103,115,0}}, +/* 39187 */ {(11<<2)|2,{103,115,0}}, +/* 39188 */ {(11<<2)|2,{103,115,0}}, +/* 39189 */ {(11<<2)|2,{103,115,0}}, +/* 39190 */ {(11<<2)|2,{103,115,0}}, +/* 39191 */ {(11<<2)|2,{103,115,0}}, +/* 39192 */ {(11<<2)|2,{103,115,0}}, +/* 39193 */ {(11<<2)|2,{103,115,0}}, +/* 39194 */ {(11<<2)|2,{103,115,0}}, +/* 39195 */ {(11<<2)|2,{103,115,0}}, +/* 39196 */ {(11<<2)|2,{103,115,0}}, +/* 39197 */ {(11<<2)|2,{103,115,0}}, +/* 39198 */ {(11<<2)|2,{103,115,0}}, +/* 39199 */ {(11<<2)|2,{103,115,0}}, +/* 39200 */ {(16<<2)|3,{103,116,48}}, +/* 39201 */ {(16<<2)|3,{103,116,49}}, +/* 39202 */ {(16<<2)|3,{103,116,50}}, +/* 39203 */ {(16<<2)|3,{103,116,97}}, +/* 39204 */ {(16<<2)|3,{103,116,99}}, +/* 39205 */ {(16<<2)|3,{103,116,101}}, +/* 39206 */ {(16<<2)|3,{103,116,105}}, +/* 39207 */ {(16<<2)|3,{103,116,111}}, +/* 39208 */ {(16<<2)|3,{103,116,115}}, +/* 39209 */ {(16<<2)|3,{103,116,116}}, +/* 39210 */ {(11<<2)|2,{103,116,0}}, +/* 39211 */ {(11<<2)|2,{103,116,0}}, +/* 39212 */ {(11<<2)|2,{103,116,0}}, +/* 39213 */ {(11<<2)|2,{103,116,0}}, +/* 39214 */ {(11<<2)|2,{103,116,0}}, +/* 39215 */ {(11<<2)|2,{103,116,0}}, +/* 39216 */ {(11<<2)|2,{103,116,0}}, +/* 39217 */ {(11<<2)|2,{103,116,0}}, +/* 39218 */ {(11<<2)|2,{103,116,0}}, +/* 39219 */ {(11<<2)|2,{103,116,0}}, +/* 39220 */ {(11<<2)|2,{103,116,0}}, +/* 39221 */ {(11<<2)|2,{103,116,0}}, +/* 39222 */ {(11<<2)|2,{103,116,0}}, +/* 39223 */ {(11<<2)|2,{103,116,0}}, +/* 39224 */ {(11<<2)|2,{103,116,0}}, +/* 39225 */ {(11<<2)|2,{103,116,0}}, +/* 39226 */ {(11<<2)|2,{103,116,0}}, +/* 39227 */ {(11<<2)|2,{103,116,0}}, +/* 39228 */ {(11<<2)|2,{103,116,0}}, +/* 39229 */ {(11<<2)|2,{103,116,0}}, +/* 39230 */ {(11<<2)|2,{103,116,0}}, +/* 39231 */ {(11<<2)|2,{103,116,0}}, +/* 39232 */ {(12<<2)|2,{103,32,0}}, +/* 39233 */ {(12<<2)|2,{103,32,0}}, +/* 39234 */ {(12<<2)|2,{103,32,0}}, +/* 39235 */ {(12<<2)|2,{103,32,0}}, +/* 39236 */ {(12<<2)|2,{103,32,0}}, +/* 39237 */ {(12<<2)|2,{103,32,0}}, +/* 39238 */ {(12<<2)|2,{103,32,0}}, +/* 39239 */ {(12<<2)|2,{103,32,0}}, +/* 39240 */ {(12<<2)|2,{103,32,0}}, +/* 39241 */ {(12<<2)|2,{103,32,0}}, +/* 39242 */ {(12<<2)|2,{103,32,0}}, +/* 39243 */ {(12<<2)|2,{103,32,0}}, +/* 39244 */ {(12<<2)|2,{103,32,0}}, +/* 39245 */ {(12<<2)|2,{103,32,0}}, +/* 39246 */ {(12<<2)|2,{103,32,0}}, +/* 39247 */ {(12<<2)|2,{103,32,0}}, +/* 39248 */ {(12<<2)|2,{103,37,0}}, +/* 39249 */ {(12<<2)|2,{103,37,0}}, +/* 39250 */ {(12<<2)|2,{103,37,0}}, +/* 39251 */ {(12<<2)|2,{103,37,0}}, +/* 39252 */ {(12<<2)|2,{103,37,0}}, +/* 39253 */ {(12<<2)|2,{103,37,0}}, +/* 39254 */ {(12<<2)|2,{103,37,0}}, +/* 39255 */ {(12<<2)|2,{103,37,0}}, +/* 39256 */ {(12<<2)|2,{103,37,0}}, +/* 39257 */ {(12<<2)|2,{103,37,0}}, +/* 39258 */ {(12<<2)|2,{103,37,0}}, +/* 39259 */ {(12<<2)|2,{103,37,0}}, +/* 39260 */ {(12<<2)|2,{103,37,0}}, +/* 39261 */ {(12<<2)|2,{103,37,0}}, +/* 39262 */ {(12<<2)|2,{103,37,0}}, +/* 39263 */ {(12<<2)|2,{103,37,0}}, +/* 39264 */ {(12<<2)|2,{103,45,0}}, +/* 39265 */ {(12<<2)|2,{103,45,0}}, +/* 39266 */ {(12<<2)|2,{103,45,0}}, +/* 39267 */ {(12<<2)|2,{103,45,0}}, +/* 39268 */ {(12<<2)|2,{103,45,0}}, +/* 39269 */ {(12<<2)|2,{103,45,0}}, +/* 39270 */ {(12<<2)|2,{103,45,0}}, +/* 39271 */ {(12<<2)|2,{103,45,0}}, +/* 39272 */ {(12<<2)|2,{103,45,0}}, +/* 39273 */ {(12<<2)|2,{103,45,0}}, +/* 39274 */ {(12<<2)|2,{103,45,0}}, +/* 39275 */ {(12<<2)|2,{103,45,0}}, +/* 39276 */ {(12<<2)|2,{103,45,0}}, +/* 39277 */ {(12<<2)|2,{103,45,0}}, +/* 39278 */ {(12<<2)|2,{103,45,0}}, +/* 39279 */ {(12<<2)|2,{103,45,0}}, +/* 39280 */ {(12<<2)|2,{103,46,0}}, +/* 39281 */ {(12<<2)|2,{103,46,0}}, +/* 39282 */ {(12<<2)|2,{103,46,0}}, +/* 39283 */ {(12<<2)|2,{103,46,0}}, +/* 39284 */ {(12<<2)|2,{103,46,0}}, +/* 39285 */ {(12<<2)|2,{103,46,0}}, +/* 39286 */ {(12<<2)|2,{103,46,0}}, +/* 39287 */ {(12<<2)|2,{103,46,0}}, +/* 39288 */ {(12<<2)|2,{103,46,0}}, +/* 39289 */ {(12<<2)|2,{103,46,0}}, +/* 39290 */ {(12<<2)|2,{103,46,0}}, +/* 39291 */ {(12<<2)|2,{103,46,0}}, +/* 39292 */ {(12<<2)|2,{103,46,0}}, +/* 39293 */ {(12<<2)|2,{103,46,0}}, +/* 39294 */ {(12<<2)|2,{103,46,0}}, +/* 39295 */ {(12<<2)|2,{103,46,0}}, +/* 39296 */ {(12<<2)|2,{103,47,0}}, +/* 39297 */ {(12<<2)|2,{103,47,0}}, +/* 39298 */ {(12<<2)|2,{103,47,0}}, +/* 39299 */ {(12<<2)|2,{103,47,0}}, +/* 39300 */ {(12<<2)|2,{103,47,0}}, +/* 39301 */ {(12<<2)|2,{103,47,0}}, +/* 39302 */ {(12<<2)|2,{103,47,0}}, +/* 39303 */ {(12<<2)|2,{103,47,0}}, +/* 39304 */ {(12<<2)|2,{103,47,0}}, +/* 39305 */ {(12<<2)|2,{103,47,0}}, +/* 39306 */ {(12<<2)|2,{103,47,0}}, +/* 39307 */ {(12<<2)|2,{103,47,0}}, +/* 39308 */ {(12<<2)|2,{103,47,0}}, +/* 39309 */ {(12<<2)|2,{103,47,0}}, +/* 39310 */ {(12<<2)|2,{103,47,0}}, +/* 39311 */ {(12<<2)|2,{103,47,0}}, +/* 39312 */ {(12<<2)|2,{103,51,0}}, +/* 39313 */ {(12<<2)|2,{103,51,0}}, +/* 39314 */ {(12<<2)|2,{103,51,0}}, +/* 39315 */ {(12<<2)|2,{103,51,0}}, +/* 39316 */ {(12<<2)|2,{103,51,0}}, +/* 39317 */ {(12<<2)|2,{103,51,0}}, +/* 39318 */ {(12<<2)|2,{103,51,0}}, +/* 39319 */ {(12<<2)|2,{103,51,0}}, +/* 39320 */ {(12<<2)|2,{103,51,0}}, +/* 39321 */ {(12<<2)|2,{103,51,0}}, +/* 39322 */ {(12<<2)|2,{103,51,0}}, +/* 39323 */ {(12<<2)|2,{103,51,0}}, +/* 39324 */ {(12<<2)|2,{103,51,0}}, +/* 39325 */ {(12<<2)|2,{103,51,0}}, +/* 39326 */ {(12<<2)|2,{103,51,0}}, +/* 39327 */ {(12<<2)|2,{103,51,0}}, +/* 39328 */ {(12<<2)|2,{103,52,0}}, +/* 39329 */ {(12<<2)|2,{103,52,0}}, +/* 39330 */ {(12<<2)|2,{103,52,0}}, +/* 39331 */ {(12<<2)|2,{103,52,0}}, +/* 39332 */ {(12<<2)|2,{103,52,0}}, +/* 39333 */ {(12<<2)|2,{103,52,0}}, +/* 39334 */ {(12<<2)|2,{103,52,0}}, +/* 39335 */ {(12<<2)|2,{103,52,0}}, +/* 39336 */ {(12<<2)|2,{103,52,0}}, +/* 39337 */ {(12<<2)|2,{103,52,0}}, +/* 39338 */ {(12<<2)|2,{103,52,0}}, +/* 39339 */ {(12<<2)|2,{103,52,0}}, +/* 39340 */ {(12<<2)|2,{103,52,0}}, +/* 39341 */ {(12<<2)|2,{103,52,0}}, +/* 39342 */ {(12<<2)|2,{103,52,0}}, +/* 39343 */ {(12<<2)|2,{103,52,0}}, +/* 39344 */ {(12<<2)|2,{103,53,0}}, +/* 39345 */ {(12<<2)|2,{103,53,0}}, +/* 39346 */ {(12<<2)|2,{103,53,0}}, +/* 39347 */ {(12<<2)|2,{103,53,0}}, +/* 39348 */ {(12<<2)|2,{103,53,0}}, +/* 39349 */ {(12<<2)|2,{103,53,0}}, +/* 39350 */ {(12<<2)|2,{103,53,0}}, +/* 39351 */ {(12<<2)|2,{103,53,0}}, +/* 39352 */ {(12<<2)|2,{103,53,0}}, +/* 39353 */ {(12<<2)|2,{103,53,0}}, +/* 39354 */ {(12<<2)|2,{103,53,0}}, +/* 39355 */ {(12<<2)|2,{103,53,0}}, +/* 39356 */ {(12<<2)|2,{103,53,0}}, +/* 39357 */ {(12<<2)|2,{103,53,0}}, +/* 39358 */ {(12<<2)|2,{103,53,0}}, +/* 39359 */ {(12<<2)|2,{103,53,0}}, +/* 39360 */ {(12<<2)|2,{103,54,0}}, +/* 39361 */ {(12<<2)|2,{103,54,0}}, +/* 39362 */ {(12<<2)|2,{103,54,0}}, +/* 39363 */ {(12<<2)|2,{103,54,0}}, +/* 39364 */ {(12<<2)|2,{103,54,0}}, +/* 39365 */ {(12<<2)|2,{103,54,0}}, +/* 39366 */ {(12<<2)|2,{103,54,0}}, +/* 39367 */ {(12<<2)|2,{103,54,0}}, +/* 39368 */ {(12<<2)|2,{103,54,0}}, +/* 39369 */ {(12<<2)|2,{103,54,0}}, +/* 39370 */ {(12<<2)|2,{103,54,0}}, +/* 39371 */ {(12<<2)|2,{103,54,0}}, +/* 39372 */ {(12<<2)|2,{103,54,0}}, +/* 39373 */ {(12<<2)|2,{103,54,0}}, +/* 39374 */ {(12<<2)|2,{103,54,0}}, +/* 39375 */ {(12<<2)|2,{103,54,0}}, +/* 39376 */ {(12<<2)|2,{103,55,0}}, +/* 39377 */ {(12<<2)|2,{103,55,0}}, +/* 39378 */ {(12<<2)|2,{103,55,0}}, +/* 39379 */ {(12<<2)|2,{103,55,0}}, +/* 39380 */ {(12<<2)|2,{103,55,0}}, +/* 39381 */ {(12<<2)|2,{103,55,0}}, +/* 39382 */ {(12<<2)|2,{103,55,0}}, +/* 39383 */ {(12<<2)|2,{103,55,0}}, +/* 39384 */ {(12<<2)|2,{103,55,0}}, +/* 39385 */ {(12<<2)|2,{103,55,0}}, +/* 39386 */ {(12<<2)|2,{103,55,0}}, +/* 39387 */ {(12<<2)|2,{103,55,0}}, +/* 39388 */ {(12<<2)|2,{103,55,0}}, +/* 39389 */ {(12<<2)|2,{103,55,0}}, +/* 39390 */ {(12<<2)|2,{103,55,0}}, +/* 39391 */ {(12<<2)|2,{103,55,0}}, +/* 39392 */ {(12<<2)|2,{103,56,0}}, +/* 39393 */ {(12<<2)|2,{103,56,0}}, +/* 39394 */ {(12<<2)|2,{103,56,0}}, +/* 39395 */ {(12<<2)|2,{103,56,0}}, +/* 39396 */ {(12<<2)|2,{103,56,0}}, +/* 39397 */ {(12<<2)|2,{103,56,0}}, +/* 39398 */ {(12<<2)|2,{103,56,0}}, +/* 39399 */ {(12<<2)|2,{103,56,0}}, +/* 39400 */ {(12<<2)|2,{103,56,0}}, +/* 39401 */ {(12<<2)|2,{103,56,0}}, +/* 39402 */ {(12<<2)|2,{103,56,0}}, +/* 39403 */ {(12<<2)|2,{103,56,0}}, +/* 39404 */ {(12<<2)|2,{103,56,0}}, +/* 39405 */ {(12<<2)|2,{103,56,0}}, +/* 39406 */ {(12<<2)|2,{103,56,0}}, +/* 39407 */ {(12<<2)|2,{103,56,0}}, +/* 39408 */ {(12<<2)|2,{103,57,0}}, +/* 39409 */ {(12<<2)|2,{103,57,0}}, +/* 39410 */ {(12<<2)|2,{103,57,0}}, +/* 39411 */ {(12<<2)|2,{103,57,0}}, +/* 39412 */ {(12<<2)|2,{103,57,0}}, +/* 39413 */ {(12<<2)|2,{103,57,0}}, +/* 39414 */ {(12<<2)|2,{103,57,0}}, +/* 39415 */ {(12<<2)|2,{103,57,0}}, +/* 39416 */ {(12<<2)|2,{103,57,0}}, +/* 39417 */ {(12<<2)|2,{103,57,0}}, +/* 39418 */ {(12<<2)|2,{103,57,0}}, +/* 39419 */ {(12<<2)|2,{103,57,0}}, +/* 39420 */ {(12<<2)|2,{103,57,0}}, +/* 39421 */ {(12<<2)|2,{103,57,0}}, +/* 39422 */ {(12<<2)|2,{103,57,0}}, +/* 39423 */ {(12<<2)|2,{103,57,0}}, +/* 39424 */ {(12<<2)|2,{103,61,0}}, +/* 39425 */ {(12<<2)|2,{103,61,0}}, +/* 39426 */ {(12<<2)|2,{103,61,0}}, +/* 39427 */ {(12<<2)|2,{103,61,0}}, +/* 39428 */ {(12<<2)|2,{103,61,0}}, +/* 39429 */ {(12<<2)|2,{103,61,0}}, +/* 39430 */ {(12<<2)|2,{103,61,0}}, +/* 39431 */ {(12<<2)|2,{103,61,0}}, +/* 39432 */ {(12<<2)|2,{103,61,0}}, +/* 39433 */ {(12<<2)|2,{103,61,0}}, +/* 39434 */ {(12<<2)|2,{103,61,0}}, +/* 39435 */ {(12<<2)|2,{103,61,0}}, +/* 39436 */ {(12<<2)|2,{103,61,0}}, +/* 39437 */ {(12<<2)|2,{103,61,0}}, +/* 39438 */ {(12<<2)|2,{103,61,0}}, +/* 39439 */ {(12<<2)|2,{103,61,0}}, +/* 39440 */ {(12<<2)|2,{103,65,0}}, +/* 39441 */ {(12<<2)|2,{103,65,0}}, +/* 39442 */ {(12<<2)|2,{103,65,0}}, +/* 39443 */ {(12<<2)|2,{103,65,0}}, +/* 39444 */ {(12<<2)|2,{103,65,0}}, +/* 39445 */ {(12<<2)|2,{103,65,0}}, +/* 39446 */ {(12<<2)|2,{103,65,0}}, +/* 39447 */ {(12<<2)|2,{103,65,0}}, +/* 39448 */ {(12<<2)|2,{103,65,0}}, +/* 39449 */ {(12<<2)|2,{103,65,0}}, +/* 39450 */ {(12<<2)|2,{103,65,0}}, +/* 39451 */ {(12<<2)|2,{103,65,0}}, +/* 39452 */ {(12<<2)|2,{103,65,0}}, +/* 39453 */ {(12<<2)|2,{103,65,0}}, +/* 39454 */ {(12<<2)|2,{103,65,0}}, +/* 39455 */ {(12<<2)|2,{103,65,0}}, +/* 39456 */ {(12<<2)|2,{103,95,0}}, +/* 39457 */ {(12<<2)|2,{103,95,0}}, +/* 39458 */ {(12<<2)|2,{103,95,0}}, +/* 39459 */ {(12<<2)|2,{103,95,0}}, +/* 39460 */ {(12<<2)|2,{103,95,0}}, +/* 39461 */ {(12<<2)|2,{103,95,0}}, +/* 39462 */ {(12<<2)|2,{103,95,0}}, +/* 39463 */ {(12<<2)|2,{103,95,0}}, +/* 39464 */ {(12<<2)|2,{103,95,0}}, +/* 39465 */ {(12<<2)|2,{103,95,0}}, +/* 39466 */ {(12<<2)|2,{103,95,0}}, +/* 39467 */ {(12<<2)|2,{103,95,0}}, +/* 39468 */ {(12<<2)|2,{103,95,0}}, +/* 39469 */ {(12<<2)|2,{103,95,0}}, +/* 39470 */ {(12<<2)|2,{103,95,0}}, +/* 39471 */ {(12<<2)|2,{103,95,0}}, +/* 39472 */ {(12<<2)|2,{103,98,0}}, +/* 39473 */ {(12<<2)|2,{103,98,0}}, +/* 39474 */ {(12<<2)|2,{103,98,0}}, +/* 39475 */ {(12<<2)|2,{103,98,0}}, +/* 39476 */ {(12<<2)|2,{103,98,0}}, +/* 39477 */ {(12<<2)|2,{103,98,0}}, +/* 39478 */ {(12<<2)|2,{103,98,0}}, +/* 39479 */ {(12<<2)|2,{103,98,0}}, +/* 39480 */ {(12<<2)|2,{103,98,0}}, +/* 39481 */ {(12<<2)|2,{103,98,0}}, +/* 39482 */ {(12<<2)|2,{103,98,0}}, +/* 39483 */ {(12<<2)|2,{103,98,0}}, +/* 39484 */ {(12<<2)|2,{103,98,0}}, +/* 39485 */ {(12<<2)|2,{103,98,0}}, +/* 39486 */ {(12<<2)|2,{103,98,0}}, +/* 39487 */ {(12<<2)|2,{103,98,0}}, +/* 39488 */ {(12<<2)|2,{103,100,0}}, +/* 39489 */ {(12<<2)|2,{103,100,0}}, +/* 39490 */ {(12<<2)|2,{103,100,0}}, +/* 39491 */ {(12<<2)|2,{103,100,0}}, +/* 39492 */ {(12<<2)|2,{103,100,0}}, +/* 39493 */ {(12<<2)|2,{103,100,0}}, +/* 39494 */ {(12<<2)|2,{103,100,0}}, +/* 39495 */ {(12<<2)|2,{103,100,0}}, +/* 39496 */ {(12<<2)|2,{103,100,0}}, +/* 39497 */ {(12<<2)|2,{103,100,0}}, +/* 39498 */ {(12<<2)|2,{103,100,0}}, +/* 39499 */ {(12<<2)|2,{103,100,0}}, +/* 39500 */ {(12<<2)|2,{103,100,0}}, +/* 39501 */ {(12<<2)|2,{103,100,0}}, +/* 39502 */ {(12<<2)|2,{103,100,0}}, +/* 39503 */ {(12<<2)|2,{103,100,0}}, +/* 39504 */ {(12<<2)|2,{103,102,0}}, +/* 39505 */ {(12<<2)|2,{103,102,0}}, +/* 39506 */ {(12<<2)|2,{103,102,0}}, +/* 39507 */ {(12<<2)|2,{103,102,0}}, +/* 39508 */ {(12<<2)|2,{103,102,0}}, +/* 39509 */ {(12<<2)|2,{103,102,0}}, +/* 39510 */ {(12<<2)|2,{103,102,0}}, +/* 39511 */ {(12<<2)|2,{103,102,0}}, +/* 39512 */ {(12<<2)|2,{103,102,0}}, +/* 39513 */ {(12<<2)|2,{103,102,0}}, +/* 39514 */ {(12<<2)|2,{103,102,0}}, +/* 39515 */ {(12<<2)|2,{103,102,0}}, +/* 39516 */ {(12<<2)|2,{103,102,0}}, +/* 39517 */ {(12<<2)|2,{103,102,0}}, +/* 39518 */ {(12<<2)|2,{103,102,0}}, +/* 39519 */ {(12<<2)|2,{103,102,0}}, +/* 39520 */ {(12<<2)|2,{103,103,0}}, +/* 39521 */ {(12<<2)|2,{103,103,0}}, +/* 39522 */ {(12<<2)|2,{103,103,0}}, +/* 39523 */ {(12<<2)|2,{103,103,0}}, +/* 39524 */ {(12<<2)|2,{103,103,0}}, +/* 39525 */ {(12<<2)|2,{103,103,0}}, +/* 39526 */ {(12<<2)|2,{103,103,0}}, +/* 39527 */ {(12<<2)|2,{103,103,0}}, +/* 39528 */ {(12<<2)|2,{103,103,0}}, +/* 39529 */ {(12<<2)|2,{103,103,0}}, +/* 39530 */ {(12<<2)|2,{103,103,0}}, +/* 39531 */ {(12<<2)|2,{103,103,0}}, +/* 39532 */ {(12<<2)|2,{103,103,0}}, +/* 39533 */ {(12<<2)|2,{103,103,0}}, +/* 39534 */ {(12<<2)|2,{103,103,0}}, +/* 39535 */ {(12<<2)|2,{103,103,0}}, +/* 39536 */ {(12<<2)|2,{103,104,0}}, +/* 39537 */ {(12<<2)|2,{103,104,0}}, +/* 39538 */ {(12<<2)|2,{103,104,0}}, +/* 39539 */ {(12<<2)|2,{103,104,0}}, +/* 39540 */ {(12<<2)|2,{103,104,0}}, +/* 39541 */ {(12<<2)|2,{103,104,0}}, +/* 39542 */ {(12<<2)|2,{103,104,0}}, +/* 39543 */ {(12<<2)|2,{103,104,0}}, +/* 39544 */ {(12<<2)|2,{103,104,0}}, +/* 39545 */ {(12<<2)|2,{103,104,0}}, +/* 39546 */ {(12<<2)|2,{103,104,0}}, +/* 39547 */ {(12<<2)|2,{103,104,0}}, +/* 39548 */ {(12<<2)|2,{103,104,0}}, +/* 39549 */ {(12<<2)|2,{103,104,0}}, +/* 39550 */ {(12<<2)|2,{103,104,0}}, +/* 39551 */ {(12<<2)|2,{103,104,0}}, +/* 39552 */ {(12<<2)|2,{103,108,0}}, +/* 39553 */ {(12<<2)|2,{103,108,0}}, +/* 39554 */ {(12<<2)|2,{103,108,0}}, +/* 39555 */ {(12<<2)|2,{103,108,0}}, +/* 39556 */ {(12<<2)|2,{103,108,0}}, +/* 39557 */ {(12<<2)|2,{103,108,0}}, +/* 39558 */ {(12<<2)|2,{103,108,0}}, +/* 39559 */ {(12<<2)|2,{103,108,0}}, +/* 39560 */ {(12<<2)|2,{103,108,0}}, +/* 39561 */ {(12<<2)|2,{103,108,0}}, +/* 39562 */ {(12<<2)|2,{103,108,0}}, +/* 39563 */ {(12<<2)|2,{103,108,0}}, +/* 39564 */ {(12<<2)|2,{103,108,0}}, +/* 39565 */ {(12<<2)|2,{103,108,0}}, +/* 39566 */ {(12<<2)|2,{103,108,0}}, +/* 39567 */ {(12<<2)|2,{103,108,0}}, +/* 39568 */ {(12<<2)|2,{103,109,0}}, +/* 39569 */ {(12<<2)|2,{103,109,0}}, +/* 39570 */ {(12<<2)|2,{103,109,0}}, +/* 39571 */ {(12<<2)|2,{103,109,0}}, +/* 39572 */ {(12<<2)|2,{103,109,0}}, +/* 39573 */ {(12<<2)|2,{103,109,0}}, +/* 39574 */ {(12<<2)|2,{103,109,0}}, +/* 39575 */ {(12<<2)|2,{103,109,0}}, +/* 39576 */ {(12<<2)|2,{103,109,0}}, +/* 39577 */ {(12<<2)|2,{103,109,0}}, +/* 39578 */ {(12<<2)|2,{103,109,0}}, +/* 39579 */ {(12<<2)|2,{103,109,0}}, +/* 39580 */ {(12<<2)|2,{103,109,0}}, +/* 39581 */ {(12<<2)|2,{103,109,0}}, +/* 39582 */ {(12<<2)|2,{103,109,0}}, +/* 39583 */ {(12<<2)|2,{103,109,0}}, +/* 39584 */ {(12<<2)|2,{103,110,0}}, +/* 39585 */ {(12<<2)|2,{103,110,0}}, +/* 39586 */ {(12<<2)|2,{103,110,0}}, +/* 39587 */ {(12<<2)|2,{103,110,0}}, +/* 39588 */ {(12<<2)|2,{103,110,0}}, +/* 39589 */ {(12<<2)|2,{103,110,0}}, +/* 39590 */ {(12<<2)|2,{103,110,0}}, +/* 39591 */ {(12<<2)|2,{103,110,0}}, +/* 39592 */ {(12<<2)|2,{103,110,0}}, +/* 39593 */ {(12<<2)|2,{103,110,0}}, +/* 39594 */ {(12<<2)|2,{103,110,0}}, +/* 39595 */ {(12<<2)|2,{103,110,0}}, +/* 39596 */ {(12<<2)|2,{103,110,0}}, +/* 39597 */ {(12<<2)|2,{103,110,0}}, +/* 39598 */ {(12<<2)|2,{103,110,0}}, +/* 39599 */ {(12<<2)|2,{103,110,0}}, +/* 39600 */ {(12<<2)|2,{103,112,0}}, +/* 39601 */ {(12<<2)|2,{103,112,0}}, +/* 39602 */ {(12<<2)|2,{103,112,0}}, +/* 39603 */ {(12<<2)|2,{103,112,0}}, +/* 39604 */ {(12<<2)|2,{103,112,0}}, +/* 39605 */ {(12<<2)|2,{103,112,0}}, +/* 39606 */ {(12<<2)|2,{103,112,0}}, +/* 39607 */ {(12<<2)|2,{103,112,0}}, +/* 39608 */ {(12<<2)|2,{103,112,0}}, +/* 39609 */ {(12<<2)|2,{103,112,0}}, +/* 39610 */ {(12<<2)|2,{103,112,0}}, +/* 39611 */ {(12<<2)|2,{103,112,0}}, +/* 39612 */ {(12<<2)|2,{103,112,0}}, +/* 39613 */ {(12<<2)|2,{103,112,0}}, +/* 39614 */ {(12<<2)|2,{103,112,0}}, +/* 39615 */ {(12<<2)|2,{103,112,0}}, +/* 39616 */ {(12<<2)|2,{103,114,0}}, +/* 39617 */ {(12<<2)|2,{103,114,0}}, +/* 39618 */ {(12<<2)|2,{103,114,0}}, +/* 39619 */ {(12<<2)|2,{103,114,0}}, +/* 39620 */ {(12<<2)|2,{103,114,0}}, +/* 39621 */ {(12<<2)|2,{103,114,0}}, +/* 39622 */ {(12<<2)|2,{103,114,0}}, +/* 39623 */ {(12<<2)|2,{103,114,0}}, +/* 39624 */ {(12<<2)|2,{103,114,0}}, +/* 39625 */ {(12<<2)|2,{103,114,0}}, +/* 39626 */ {(12<<2)|2,{103,114,0}}, +/* 39627 */ {(12<<2)|2,{103,114,0}}, +/* 39628 */ {(12<<2)|2,{103,114,0}}, +/* 39629 */ {(12<<2)|2,{103,114,0}}, +/* 39630 */ {(12<<2)|2,{103,114,0}}, +/* 39631 */ {(12<<2)|2,{103,114,0}}, +/* 39632 */ {(12<<2)|2,{103,117,0}}, +/* 39633 */ {(12<<2)|2,{103,117,0}}, +/* 39634 */ {(12<<2)|2,{103,117,0}}, +/* 39635 */ {(12<<2)|2,{103,117,0}}, +/* 39636 */ {(12<<2)|2,{103,117,0}}, +/* 39637 */ {(12<<2)|2,{103,117,0}}, +/* 39638 */ {(12<<2)|2,{103,117,0}}, +/* 39639 */ {(12<<2)|2,{103,117,0}}, +/* 39640 */ {(12<<2)|2,{103,117,0}}, +/* 39641 */ {(12<<2)|2,{103,117,0}}, +/* 39642 */ {(12<<2)|2,{103,117,0}}, +/* 39643 */ {(12<<2)|2,{103,117,0}}, +/* 39644 */ {(12<<2)|2,{103,117,0}}, +/* 39645 */ {(12<<2)|2,{103,117,0}}, +/* 39646 */ {(12<<2)|2,{103,117,0}}, +/* 39647 */ {(12<<2)|2,{103,117,0}}, +/* 39648 */ {(13<<2)|2,{103,58,0}}, +/* 39649 */ {(13<<2)|2,{103,58,0}}, +/* 39650 */ {(13<<2)|2,{103,58,0}}, +/* 39651 */ {(13<<2)|2,{103,58,0}}, +/* 39652 */ {(13<<2)|2,{103,58,0}}, +/* 39653 */ {(13<<2)|2,{103,58,0}}, +/* 39654 */ {(13<<2)|2,{103,58,0}}, +/* 39655 */ {(13<<2)|2,{103,58,0}}, +/* 39656 */ {(13<<2)|2,{103,66,0}}, +/* 39657 */ {(13<<2)|2,{103,66,0}}, +/* 39658 */ {(13<<2)|2,{103,66,0}}, +/* 39659 */ {(13<<2)|2,{103,66,0}}, +/* 39660 */ {(13<<2)|2,{103,66,0}}, +/* 39661 */ {(13<<2)|2,{103,66,0}}, +/* 39662 */ {(13<<2)|2,{103,66,0}}, +/* 39663 */ {(13<<2)|2,{103,66,0}}, +/* 39664 */ {(13<<2)|2,{103,67,0}}, +/* 39665 */ {(13<<2)|2,{103,67,0}}, +/* 39666 */ {(13<<2)|2,{103,67,0}}, +/* 39667 */ {(13<<2)|2,{103,67,0}}, +/* 39668 */ {(13<<2)|2,{103,67,0}}, +/* 39669 */ {(13<<2)|2,{103,67,0}}, +/* 39670 */ {(13<<2)|2,{103,67,0}}, +/* 39671 */ {(13<<2)|2,{103,67,0}}, +/* 39672 */ {(13<<2)|2,{103,68,0}}, +/* 39673 */ {(13<<2)|2,{103,68,0}}, +/* 39674 */ {(13<<2)|2,{103,68,0}}, +/* 39675 */ {(13<<2)|2,{103,68,0}}, +/* 39676 */ {(13<<2)|2,{103,68,0}}, +/* 39677 */ {(13<<2)|2,{103,68,0}}, +/* 39678 */ {(13<<2)|2,{103,68,0}}, +/* 39679 */ {(13<<2)|2,{103,68,0}}, +/* 39680 */ {(13<<2)|2,{103,69,0}}, +/* 39681 */ {(13<<2)|2,{103,69,0}}, +/* 39682 */ {(13<<2)|2,{103,69,0}}, +/* 39683 */ {(13<<2)|2,{103,69,0}}, +/* 39684 */ {(13<<2)|2,{103,69,0}}, +/* 39685 */ {(13<<2)|2,{103,69,0}}, +/* 39686 */ {(13<<2)|2,{103,69,0}}, +/* 39687 */ {(13<<2)|2,{103,69,0}}, +/* 39688 */ {(13<<2)|2,{103,70,0}}, +/* 39689 */ {(13<<2)|2,{103,70,0}}, +/* 39690 */ {(13<<2)|2,{103,70,0}}, +/* 39691 */ {(13<<2)|2,{103,70,0}}, +/* 39692 */ {(13<<2)|2,{103,70,0}}, +/* 39693 */ {(13<<2)|2,{103,70,0}}, +/* 39694 */ {(13<<2)|2,{103,70,0}}, +/* 39695 */ {(13<<2)|2,{103,70,0}}, +/* 39696 */ {(13<<2)|2,{103,71,0}}, +/* 39697 */ {(13<<2)|2,{103,71,0}}, +/* 39698 */ {(13<<2)|2,{103,71,0}}, +/* 39699 */ {(13<<2)|2,{103,71,0}}, +/* 39700 */ {(13<<2)|2,{103,71,0}}, +/* 39701 */ {(13<<2)|2,{103,71,0}}, +/* 39702 */ {(13<<2)|2,{103,71,0}}, +/* 39703 */ {(13<<2)|2,{103,71,0}}, +/* 39704 */ {(13<<2)|2,{103,72,0}}, +/* 39705 */ {(13<<2)|2,{103,72,0}}, +/* 39706 */ {(13<<2)|2,{103,72,0}}, +/* 39707 */ {(13<<2)|2,{103,72,0}}, +/* 39708 */ {(13<<2)|2,{103,72,0}}, +/* 39709 */ {(13<<2)|2,{103,72,0}}, +/* 39710 */ {(13<<2)|2,{103,72,0}}, +/* 39711 */ {(13<<2)|2,{103,72,0}}, +/* 39712 */ {(13<<2)|2,{103,73,0}}, +/* 39713 */ {(13<<2)|2,{103,73,0}}, +/* 39714 */ {(13<<2)|2,{103,73,0}}, +/* 39715 */ {(13<<2)|2,{103,73,0}}, +/* 39716 */ {(13<<2)|2,{103,73,0}}, +/* 39717 */ {(13<<2)|2,{103,73,0}}, +/* 39718 */ {(13<<2)|2,{103,73,0}}, +/* 39719 */ {(13<<2)|2,{103,73,0}}, +/* 39720 */ {(13<<2)|2,{103,74,0}}, +/* 39721 */ {(13<<2)|2,{103,74,0}}, +/* 39722 */ {(13<<2)|2,{103,74,0}}, +/* 39723 */ {(13<<2)|2,{103,74,0}}, +/* 39724 */ {(13<<2)|2,{103,74,0}}, +/* 39725 */ {(13<<2)|2,{103,74,0}}, +/* 39726 */ {(13<<2)|2,{103,74,0}}, +/* 39727 */ {(13<<2)|2,{103,74,0}}, +/* 39728 */ {(13<<2)|2,{103,75,0}}, +/* 39729 */ {(13<<2)|2,{103,75,0}}, +/* 39730 */ {(13<<2)|2,{103,75,0}}, +/* 39731 */ {(13<<2)|2,{103,75,0}}, +/* 39732 */ {(13<<2)|2,{103,75,0}}, +/* 39733 */ {(13<<2)|2,{103,75,0}}, +/* 39734 */ {(13<<2)|2,{103,75,0}}, +/* 39735 */ {(13<<2)|2,{103,75,0}}, +/* 39736 */ {(13<<2)|2,{103,76,0}}, +/* 39737 */ {(13<<2)|2,{103,76,0}}, +/* 39738 */ {(13<<2)|2,{103,76,0}}, +/* 39739 */ {(13<<2)|2,{103,76,0}}, +/* 39740 */ {(13<<2)|2,{103,76,0}}, +/* 39741 */ {(13<<2)|2,{103,76,0}}, +/* 39742 */ {(13<<2)|2,{103,76,0}}, +/* 39743 */ {(13<<2)|2,{103,76,0}}, +/* 39744 */ {(13<<2)|2,{103,77,0}}, +/* 39745 */ {(13<<2)|2,{103,77,0}}, +/* 39746 */ {(13<<2)|2,{103,77,0}}, +/* 39747 */ {(13<<2)|2,{103,77,0}}, +/* 39748 */ {(13<<2)|2,{103,77,0}}, +/* 39749 */ {(13<<2)|2,{103,77,0}}, +/* 39750 */ {(13<<2)|2,{103,77,0}}, +/* 39751 */ {(13<<2)|2,{103,77,0}}, +/* 39752 */ {(13<<2)|2,{103,78,0}}, +/* 39753 */ {(13<<2)|2,{103,78,0}}, +/* 39754 */ {(13<<2)|2,{103,78,0}}, +/* 39755 */ {(13<<2)|2,{103,78,0}}, +/* 39756 */ {(13<<2)|2,{103,78,0}}, +/* 39757 */ {(13<<2)|2,{103,78,0}}, +/* 39758 */ {(13<<2)|2,{103,78,0}}, +/* 39759 */ {(13<<2)|2,{103,78,0}}, +/* 39760 */ {(13<<2)|2,{103,79,0}}, +/* 39761 */ {(13<<2)|2,{103,79,0}}, +/* 39762 */ {(13<<2)|2,{103,79,0}}, +/* 39763 */ {(13<<2)|2,{103,79,0}}, +/* 39764 */ {(13<<2)|2,{103,79,0}}, +/* 39765 */ {(13<<2)|2,{103,79,0}}, +/* 39766 */ {(13<<2)|2,{103,79,0}}, +/* 39767 */ {(13<<2)|2,{103,79,0}}, +/* 39768 */ {(13<<2)|2,{103,80,0}}, +/* 39769 */ {(13<<2)|2,{103,80,0}}, +/* 39770 */ {(13<<2)|2,{103,80,0}}, +/* 39771 */ {(13<<2)|2,{103,80,0}}, +/* 39772 */ {(13<<2)|2,{103,80,0}}, +/* 39773 */ {(13<<2)|2,{103,80,0}}, +/* 39774 */ {(13<<2)|2,{103,80,0}}, +/* 39775 */ {(13<<2)|2,{103,80,0}}, +/* 39776 */ {(13<<2)|2,{103,81,0}}, +/* 39777 */ {(13<<2)|2,{103,81,0}}, +/* 39778 */ {(13<<2)|2,{103,81,0}}, +/* 39779 */ {(13<<2)|2,{103,81,0}}, +/* 39780 */ {(13<<2)|2,{103,81,0}}, +/* 39781 */ {(13<<2)|2,{103,81,0}}, +/* 39782 */ {(13<<2)|2,{103,81,0}}, +/* 39783 */ {(13<<2)|2,{103,81,0}}, +/* 39784 */ {(13<<2)|2,{103,82,0}}, +/* 39785 */ {(13<<2)|2,{103,82,0}}, +/* 39786 */ {(13<<2)|2,{103,82,0}}, +/* 39787 */ {(13<<2)|2,{103,82,0}}, +/* 39788 */ {(13<<2)|2,{103,82,0}}, +/* 39789 */ {(13<<2)|2,{103,82,0}}, +/* 39790 */ {(13<<2)|2,{103,82,0}}, +/* 39791 */ {(13<<2)|2,{103,82,0}}, +/* 39792 */ {(13<<2)|2,{103,83,0}}, +/* 39793 */ {(13<<2)|2,{103,83,0}}, +/* 39794 */ {(13<<2)|2,{103,83,0}}, +/* 39795 */ {(13<<2)|2,{103,83,0}}, +/* 39796 */ {(13<<2)|2,{103,83,0}}, +/* 39797 */ {(13<<2)|2,{103,83,0}}, +/* 39798 */ {(13<<2)|2,{103,83,0}}, +/* 39799 */ {(13<<2)|2,{103,83,0}}, +/* 39800 */ {(13<<2)|2,{103,84,0}}, +/* 39801 */ {(13<<2)|2,{103,84,0}}, +/* 39802 */ {(13<<2)|2,{103,84,0}}, +/* 39803 */ {(13<<2)|2,{103,84,0}}, +/* 39804 */ {(13<<2)|2,{103,84,0}}, +/* 39805 */ {(13<<2)|2,{103,84,0}}, +/* 39806 */ {(13<<2)|2,{103,84,0}}, +/* 39807 */ {(13<<2)|2,{103,84,0}}, +/* 39808 */ {(13<<2)|2,{103,85,0}}, +/* 39809 */ {(13<<2)|2,{103,85,0}}, +/* 39810 */ {(13<<2)|2,{103,85,0}}, +/* 39811 */ {(13<<2)|2,{103,85,0}}, +/* 39812 */ {(13<<2)|2,{103,85,0}}, +/* 39813 */ {(13<<2)|2,{103,85,0}}, +/* 39814 */ {(13<<2)|2,{103,85,0}}, +/* 39815 */ {(13<<2)|2,{103,85,0}}, +/* 39816 */ {(13<<2)|2,{103,86,0}}, +/* 39817 */ {(13<<2)|2,{103,86,0}}, +/* 39818 */ {(13<<2)|2,{103,86,0}}, +/* 39819 */ {(13<<2)|2,{103,86,0}}, +/* 39820 */ {(13<<2)|2,{103,86,0}}, +/* 39821 */ {(13<<2)|2,{103,86,0}}, +/* 39822 */ {(13<<2)|2,{103,86,0}}, +/* 39823 */ {(13<<2)|2,{103,86,0}}, +/* 39824 */ {(13<<2)|2,{103,87,0}}, +/* 39825 */ {(13<<2)|2,{103,87,0}}, +/* 39826 */ {(13<<2)|2,{103,87,0}}, +/* 39827 */ {(13<<2)|2,{103,87,0}}, +/* 39828 */ {(13<<2)|2,{103,87,0}}, +/* 39829 */ {(13<<2)|2,{103,87,0}}, +/* 39830 */ {(13<<2)|2,{103,87,0}}, +/* 39831 */ {(13<<2)|2,{103,87,0}}, +/* 39832 */ {(13<<2)|2,{103,89,0}}, +/* 39833 */ {(13<<2)|2,{103,89,0}}, +/* 39834 */ {(13<<2)|2,{103,89,0}}, +/* 39835 */ {(13<<2)|2,{103,89,0}}, +/* 39836 */ {(13<<2)|2,{103,89,0}}, +/* 39837 */ {(13<<2)|2,{103,89,0}}, +/* 39838 */ {(13<<2)|2,{103,89,0}}, +/* 39839 */ {(13<<2)|2,{103,89,0}}, +/* 39840 */ {(13<<2)|2,{103,106,0}}, +/* 39841 */ {(13<<2)|2,{103,106,0}}, +/* 39842 */ {(13<<2)|2,{103,106,0}}, +/* 39843 */ {(13<<2)|2,{103,106,0}}, +/* 39844 */ {(13<<2)|2,{103,106,0}}, +/* 39845 */ {(13<<2)|2,{103,106,0}}, +/* 39846 */ {(13<<2)|2,{103,106,0}}, +/* 39847 */ {(13<<2)|2,{103,106,0}}, +/* 39848 */ {(13<<2)|2,{103,107,0}}, +/* 39849 */ {(13<<2)|2,{103,107,0}}, +/* 39850 */ {(13<<2)|2,{103,107,0}}, +/* 39851 */ {(13<<2)|2,{103,107,0}}, +/* 39852 */ {(13<<2)|2,{103,107,0}}, +/* 39853 */ {(13<<2)|2,{103,107,0}}, +/* 39854 */ {(13<<2)|2,{103,107,0}}, +/* 39855 */ {(13<<2)|2,{103,107,0}}, +/* 39856 */ {(13<<2)|2,{103,113,0}}, +/* 39857 */ {(13<<2)|2,{103,113,0}}, +/* 39858 */ {(13<<2)|2,{103,113,0}}, +/* 39859 */ {(13<<2)|2,{103,113,0}}, +/* 39860 */ {(13<<2)|2,{103,113,0}}, +/* 39861 */ {(13<<2)|2,{103,113,0}}, +/* 39862 */ {(13<<2)|2,{103,113,0}}, +/* 39863 */ {(13<<2)|2,{103,113,0}}, +/* 39864 */ {(13<<2)|2,{103,118,0}}, +/* 39865 */ {(13<<2)|2,{103,118,0}}, +/* 39866 */ {(13<<2)|2,{103,118,0}}, +/* 39867 */ {(13<<2)|2,{103,118,0}}, +/* 39868 */ {(13<<2)|2,{103,118,0}}, +/* 39869 */ {(13<<2)|2,{103,118,0}}, +/* 39870 */ {(13<<2)|2,{103,118,0}}, +/* 39871 */ {(13<<2)|2,{103,118,0}}, +/* 39872 */ {(13<<2)|2,{103,119,0}}, +/* 39873 */ {(13<<2)|2,{103,119,0}}, +/* 39874 */ {(13<<2)|2,{103,119,0}}, +/* 39875 */ {(13<<2)|2,{103,119,0}}, +/* 39876 */ {(13<<2)|2,{103,119,0}}, +/* 39877 */ {(13<<2)|2,{103,119,0}}, +/* 39878 */ {(13<<2)|2,{103,119,0}}, +/* 39879 */ {(13<<2)|2,{103,119,0}}, +/* 39880 */ {(13<<2)|2,{103,120,0}}, +/* 39881 */ {(13<<2)|2,{103,120,0}}, +/* 39882 */ {(13<<2)|2,{103,120,0}}, +/* 39883 */ {(13<<2)|2,{103,120,0}}, +/* 39884 */ {(13<<2)|2,{103,120,0}}, +/* 39885 */ {(13<<2)|2,{103,120,0}}, +/* 39886 */ {(13<<2)|2,{103,120,0}}, +/* 39887 */ {(13<<2)|2,{103,120,0}}, +/* 39888 */ {(13<<2)|2,{103,121,0}}, +/* 39889 */ {(13<<2)|2,{103,121,0}}, +/* 39890 */ {(13<<2)|2,{103,121,0}}, +/* 39891 */ {(13<<2)|2,{103,121,0}}, +/* 39892 */ {(13<<2)|2,{103,121,0}}, +/* 39893 */ {(13<<2)|2,{103,121,0}}, +/* 39894 */ {(13<<2)|2,{103,121,0}}, +/* 39895 */ {(13<<2)|2,{103,121,0}}, +/* 39896 */ {(13<<2)|2,{103,122,0}}, +/* 39897 */ {(13<<2)|2,{103,122,0}}, +/* 39898 */ {(13<<2)|2,{103,122,0}}, +/* 39899 */ {(13<<2)|2,{103,122,0}}, +/* 39900 */ {(13<<2)|2,{103,122,0}}, +/* 39901 */ {(13<<2)|2,{103,122,0}}, +/* 39902 */ {(13<<2)|2,{103,122,0}}, +/* 39903 */ {(13<<2)|2,{103,122,0}}, +/* 39904 */ {(14<<2)|2,{103,38,0}}, +/* 39905 */ {(14<<2)|2,{103,38,0}}, +/* 39906 */ {(14<<2)|2,{103,38,0}}, +/* 39907 */ {(14<<2)|2,{103,38,0}}, +/* 39908 */ {(14<<2)|2,{103,42,0}}, +/* 39909 */ {(14<<2)|2,{103,42,0}}, +/* 39910 */ {(14<<2)|2,{103,42,0}}, +/* 39911 */ {(14<<2)|2,{103,42,0}}, +/* 39912 */ {(14<<2)|2,{103,44,0}}, +/* 39913 */ {(14<<2)|2,{103,44,0}}, +/* 39914 */ {(14<<2)|2,{103,44,0}}, +/* 39915 */ {(14<<2)|2,{103,44,0}}, +/* 39916 */ {(14<<2)|2,{103,59,0}}, +/* 39917 */ {(14<<2)|2,{103,59,0}}, +/* 39918 */ {(14<<2)|2,{103,59,0}}, +/* 39919 */ {(14<<2)|2,{103,59,0}}, +/* 39920 */ {(14<<2)|2,{103,88,0}}, +/* 39921 */ {(14<<2)|2,{103,88,0}}, +/* 39922 */ {(14<<2)|2,{103,88,0}}, +/* 39923 */ {(14<<2)|2,{103,88,0}}, +/* 39924 */ {(14<<2)|2,{103,90,0}}, +/* 39925 */ {(14<<2)|2,{103,90,0}}, +/* 39926 */ {(14<<2)|2,{103,90,0}}, +/* 39927 */ {(14<<2)|2,{103,90,0}}, +/* 39928 */ {(16<<2)|2,{103,33,0}}, +/* 39929 */ {(16<<2)|2,{103,34,0}}, +/* 39930 */ {(16<<2)|2,{103,40,0}}, +/* 39931 */ {(16<<2)|2,{103,41,0}}, +/* 39932 */ {(16<<2)|2,{103,63,0}}, +/* 39933 */ {(6<<2)|1,{103,0,0}}, +/* 39934 */ {(6<<2)|1,{103,0,0}}, +/* 39935 */ {(6<<2)|1,{103,0,0}}, +/* 39936 */ {(16<<2)|3,{104,48,48}}, +/* 39937 */ {(16<<2)|3,{104,48,49}}, +/* 39938 */ {(16<<2)|3,{104,48,50}}, +/* 39939 */ {(16<<2)|3,{104,48,97}}, +/* 39940 */ {(16<<2)|3,{104,48,99}}, +/* 39941 */ {(16<<2)|3,{104,48,101}}, +/* 39942 */ {(16<<2)|3,{104,48,105}}, +/* 39943 */ {(16<<2)|3,{104,48,111}}, +/* 39944 */ {(16<<2)|3,{104,48,115}}, +/* 39945 */ {(16<<2)|3,{104,48,116}}, +/* 39946 */ {(11<<2)|2,{104,48,0}}, +/* 39947 */ {(11<<2)|2,{104,48,0}}, +/* 39948 */ {(11<<2)|2,{104,48,0}}, +/* 39949 */ {(11<<2)|2,{104,48,0}}, +/* 39950 */ {(11<<2)|2,{104,48,0}}, +/* 39951 */ {(11<<2)|2,{104,48,0}}, +/* 39952 */ {(11<<2)|2,{104,48,0}}, +/* 39953 */ {(11<<2)|2,{104,48,0}}, +/* 39954 */ {(11<<2)|2,{104,48,0}}, +/* 39955 */ {(11<<2)|2,{104,48,0}}, +/* 39956 */ {(11<<2)|2,{104,48,0}}, +/* 39957 */ {(11<<2)|2,{104,48,0}}, +/* 39958 */ {(11<<2)|2,{104,48,0}}, +/* 39959 */ {(11<<2)|2,{104,48,0}}, +/* 39960 */ {(11<<2)|2,{104,48,0}}, +/* 39961 */ {(11<<2)|2,{104,48,0}}, +/* 39962 */ {(11<<2)|2,{104,48,0}}, +/* 39963 */ {(11<<2)|2,{104,48,0}}, +/* 39964 */ {(11<<2)|2,{104,48,0}}, +/* 39965 */ {(11<<2)|2,{104,48,0}}, +/* 39966 */ {(11<<2)|2,{104,48,0}}, +/* 39967 */ {(11<<2)|2,{104,48,0}}, +/* 39968 */ {(16<<2)|3,{104,49,48}}, +/* 39969 */ {(16<<2)|3,{104,49,49}}, +/* 39970 */ {(16<<2)|3,{104,49,50}}, +/* 39971 */ {(16<<2)|3,{104,49,97}}, +/* 39972 */ {(16<<2)|3,{104,49,99}}, +/* 39973 */ {(16<<2)|3,{104,49,101}}, +/* 39974 */ {(16<<2)|3,{104,49,105}}, +/* 39975 */ {(16<<2)|3,{104,49,111}}, +/* 39976 */ {(16<<2)|3,{104,49,115}}, +/* 39977 */ {(16<<2)|3,{104,49,116}}, +/* 39978 */ {(11<<2)|2,{104,49,0}}, +/* 39979 */ {(11<<2)|2,{104,49,0}}, +/* 39980 */ {(11<<2)|2,{104,49,0}}, +/* 39981 */ {(11<<2)|2,{104,49,0}}, +/* 39982 */ {(11<<2)|2,{104,49,0}}, +/* 39983 */ {(11<<2)|2,{104,49,0}}, +/* 39984 */ {(11<<2)|2,{104,49,0}}, +/* 39985 */ {(11<<2)|2,{104,49,0}}, +/* 39986 */ {(11<<2)|2,{104,49,0}}, +/* 39987 */ {(11<<2)|2,{104,49,0}}, +/* 39988 */ {(11<<2)|2,{104,49,0}}, +/* 39989 */ {(11<<2)|2,{104,49,0}}, +/* 39990 */ {(11<<2)|2,{104,49,0}}, +/* 39991 */ {(11<<2)|2,{104,49,0}}, +/* 39992 */ {(11<<2)|2,{104,49,0}}, +/* 39993 */ {(11<<2)|2,{104,49,0}}, +/* 39994 */ {(11<<2)|2,{104,49,0}}, +/* 39995 */ {(11<<2)|2,{104,49,0}}, +/* 39996 */ {(11<<2)|2,{104,49,0}}, +/* 39997 */ {(11<<2)|2,{104,49,0}}, +/* 39998 */ {(11<<2)|2,{104,49,0}}, +/* 39999 */ {(11<<2)|2,{104,49,0}}, +/* 40000 */ {(16<<2)|3,{104,50,48}}, +/* 40001 */ {(16<<2)|3,{104,50,49}}, +/* 40002 */ {(16<<2)|3,{104,50,50}}, +/* 40003 */ {(16<<2)|3,{104,50,97}}, +/* 40004 */ {(16<<2)|3,{104,50,99}}, +/* 40005 */ {(16<<2)|3,{104,50,101}}, +/* 40006 */ {(16<<2)|3,{104,50,105}}, +/* 40007 */ {(16<<2)|3,{104,50,111}}, +/* 40008 */ {(16<<2)|3,{104,50,115}}, +/* 40009 */ {(16<<2)|3,{104,50,116}}, +/* 40010 */ {(11<<2)|2,{104,50,0}}, +/* 40011 */ {(11<<2)|2,{104,50,0}}, +/* 40012 */ {(11<<2)|2,{104,50,0}}, +/* 40013 */ {(11<<2)|2,{104,50,0}}, +/* 40014 */ {(11<<2)|2,{104,50,0}}, +/* 40015 */ {(11<<2)|2,{104,50,0}}, +/* 40016 */ {(11<<2)|2,{104,50,0}}, +/* 40017 */ {(11<<2)|2,{104,50,0}}, +/* 40018 */ {(11<<2)|2,{104,50,0}}, +/* 40019 */ {(11<<2)|2,{104,50,0}}, +/* 40020 */ {(11<<2)|2,{104,50,0}}, +/* 40021 */ {(11<<2)|2,{104,50,0}}, +/* 40022 */ {(11<<2)|2,{104,50,0}}, +/* 40023 */ {(11<<2)|2,{104,50,0}}, +/* 40024 */ {(11<<2)|2,{104,50,0}}, +/* 40025 */ {(11<<2)|2,{104,50,0}}, +/* 40026 */ {(11<<2)|2,{104,50,0}}, +/* 40027 */ {(11<<2)|2,{104,50,0}}, +/* 40028 */ {(11<<2)|2,{104,50,0}}, +/* 40029 */ {(11<<2)|2,{104,50,0}}, +/* 40030 */ {(11<<2)|2,{104,50,0}}, +/* 40031 */ {(11<<2)|2,{104,50,0}}, +/* 40032 */ {(16<<2)|3,{104,97,48}}, +/* 40033 */ {(16<<2)|3,{104,97,49}}, +/* 40034 */ {(16<<2)|3,{104,97,50}}, +/* 40035 */ {(16<<2)|3,{104,97,97}}, +/* 40036 */ {(16<<2)|3,{104,97,99}}, +/* 40037 */ {(16<<2)|3,{104,97,101}}, +/* 40038 */ {(16<<2)|3,{104,97,105}}, +/* 40039 */ {(16<<2)|3,{104,97,111}}, +/* 40040 */ {(16<<2)|3,{104,97,115}}, +/* 40041 */ {(16<<2)|3,{104,97,116}}, +/* 40042 */ {(11<<2)|2,{104,97,0}}, +/* 40043 */ {(11<<2)|2,{104,97,0}}, +/* 40044 */ {(11<<2)|2,{104,97,0}}, +/* 40045 */ {(11<<2)|2,{104,97,0}}, +/* 40046 */ {(11<<2)|2,{104,97,0}}, +/* 40047 */ {(11<<2)|2,{104,97,0}}, +/* 40048 */ {(11<<2)|2,{104,97,0}}, +/* 40049 */ {(11<<2)|2,{104,97,0}}, +/* 40050 */ {(11<<2)|2,{104,97,0}}, +/* 40051 */ {(11<<2)|2,{104,97,0}}, +/* 40052 */ {(11<<2)|2,{104,97,0}}, +/* 40053 */ {(11<<2)|2,{104,97,0}}, +/* 40054 */ {(11<<2)|2,{104,97,0}}, +/* 40055 */ {(11<<2)|2,{104,97,0}}, +/* 40056 */ {(11<<2)|2,{104,97,0}}, +/* 40057 */ {(11<<2)|2,{104,97,0}}, +/* 40058 */ {(11<<2)|2,{104,97,0}}, +/* 40059 */ {(11<<2)|2,{104,97,0}}, +/* 40060 */ {(11<<2)|2,{104,97,0}}, +/* 40061 */ {(11<<2)|2,{104,97,0}}, +/* 40062 */ {(11<<2)|2,{104,97,0}}, +/* 40063 */ {(11<<2)|2,{104,97,0}}, +/* 40064 */ {(16<<2)|3,{104,99,48}}, +/* 40065 */ {(16<<2)|3,{104,99,49}}, +/* 40066 */ {(16<<2)|3,{104,99,50}}, +/* 40067 */ {(16<<2)|3,{104,99,97}}, +/* 40068 */ {(16<<2)|3,{104,99,99}}, +/* 40069 */ {(16<<2)|3,{104,99,101}}, +/* 40070 */ {(16<<2)|3,{104,99,105}}, +/* 40071 */ {(16<<2)|3,{104,99,111}}, +/* 40072 */ {(16<<2)|3,{104,99,115}}, +/* 40073 */ {(16<<2)|3,{104,99,116}}, +/* 40074 */ {(11<<2)|2,{104,99,0}}, +/* 40075 */ {(11<<2)|2,{104,99,0}}, +/* 40076 */ {(11<<2)|2,{104,99,0}}, +/* 40077 */ {(11<<2)|2,{104,99,0}}, +/* 40078 */ {(11<<2)|2,{104,99,0}}, +/* 40079 */ {(11<<2)|2,{104,99,0}}, +/* 40080 */ {(11<<2)|2,{104,99,0}}, +/* 40081 */ {(11<<2)|2,{104,99,0}}, +/* 40082 */ {(11<<2)|2,{104,99,0}}, +/* 40083 */ {(11<<2)|2,{104,99,0}}, +/* 40084 */ {(11<<2)|2,{104,99,0}}, +/* 40085 */ {(11<<2)|2,{104,99,0}}, +/* 40086 */ {(11<<2)|2,{104,99,0}}, +/* 40087 */ {(11<<2)|2,{104,99,0}}, +/* 40088 */ {(11<<2)|2,{104,99,0}}, +/* 40089 */ {(11<<2)|2,{104,99,0}}, +/* 40090 */ {(11<<2)|2,{104,99,0}}, +/* 40091 */ {(11<<2)|2,{104,99,0}}, +/* 40092 */ {(11<<2)|2,{104,99,0}}, +/* 40093 */ {(11<<2)|2,{104,99,0}}, +/* 40094 */ {(11<<2)|2,{104,99,0}}, +/* 40095 */ {(11<<2)|2,{104,99,0}}, +/* 40096 */ {(16<<2)|3,{104,101,48}}, +/* 40097 */ {(16<<2)|3,{104,101,49}}, +/* 40098 */ {(16<<2)|3,{104,101,50}}, +/* 40099 */ {(16<<2)|3,{104,101,97}}, +/* 40100 */ {(16<<2)|3,{104,101,99}}, +/* 40101 */ {(16<<2)|3,{104,101,101}}, +/* 40102 */ {(16<<2)|3,{104,101,105}}, +/* 40103 */ {(16<<2)|3,{104,101,111}}, +/* 40104 */ {(16<<2)|3,{104,101,115}}, +/* 40105 */ {(16<<2)|3,{104,101,116}}, +/* 40106 */ {(11<<2)|2,{104,101,0}}, +/* 40107 */ {(11<<2)|2,{104,101,0}}, +/* 40108 */ {(11<<2)|2,{104,101,0}}, +/* 40109 */ {(11<<2)|2,{104,101,0}}, +/* 40110 */ {(11<<2)|2,{104,101,0}}, +/* 40111 */ {(11<<2)|2,{104,101,0}}, +/* 40112 */ {(11<<2)|2,{104,101,0}}, +/* 40113 */ {(11<<2)|2,{104,101,0}}, +/* 40114 */ {(11<<2)|2,{104,101,0}}, +/* 40115 */ {(11<<2)|2,{104,101,0}}, +/* 40116 */ {(11<<2)|2,{104,101,0}}, +/* 40117 */ {(11<<2)|2,{104,101,0}}, +/* 40118 */ {(11<<2)|2,{104,101,0}}, +/* 40119 */ {(11<<2)|2,{104,101,0}}, +/* 40120 */ {(11<<2)|2,{104,101,0}}, +/* 40121 */ {(11<<2)|2,{104,101,0}}, +/* 40122 */ {(11<<2)|2,{104,101,0}}, +/* 40123 */ {(11<<2)|2,{104,101,0}}, +/* 40124 */ {(11<<2)|2,{104,101,0}}, +/* 40125 */ {(11<<2)|2,{104,101,0}}, +/* 40126 */ {(11<<2)|2,{104,101,0}}, +/* 40127 */ {(11<<2)|2,{104,101,0}}, +/* 40128 */ {(16<<2)|3,{104,105,48}}, +/* 40129 */ {(16<<2)|3,{104,105,49}}, +/* 40130 */ {(16<<2)|3,{104,105,50}}, +/* 40131 */ {(16<<2)|3,{104,105,97}}, +/* 40132 */ {(16<<2)|3,{104,105,99}}, +/* 40133 */ {(16<<2)|3,{104,105,101}}, +/* 40134 */ {(16<<2)|3,{104,105,105}}, +/* 40135 */ {(16<<2)|3,{104,105,111}}, +/* 40136 */ {(16<<2)|3,{104,105,115}}, +/* 40137 */ {(16<<2)|3,{104,105,116}}, +/* 40138 */ {(11<<2)|2,{104,105,0}}, +/* 40139 */ {(11<<2)|2,{104,105,0}}, +/* 40140 */ {(11<<2)|2,{104,105,0}}, +/* 40141 */ {(11<<2)|2,{104,105,0}}, +/* 40142 */ {(11<<2)|2,{104,105,0}}, +/* 40143 */ {(11<<2)|2,{104,105,0}}, +/* 40144 */ {(11<<2)|2,{104,105,0}}, +/* 40145 */ {(11<<2)|2,{104,105,0}}, +/* 40146 */ {(11<<2)|2,{104,105,0}}, +/* 40147 */ {(11<<2)|2,{104,105,0}}, +/* 40148 */ {(11<<2)|2,{104,105,0}}, +/* 40149 */ {(11<<2)|2,{104,105,0}}, +/* 40150 */ {(11<<2)|2,{104,105,0}}, +/* 40151 */ {(11<<2)|2,{104,105,0}}, +/* 40152 */ {(11<<2)|2,{104,105,0}}, +/* 40153 */ {(11<<2)|2,{104,105,0}}, +/* 40154 */ {(11<<2)|2,{104,105,0}}, +/* 40155 */ {(11<<2)|2,{104,105,0}}, +/* 40156 */ {(11<<2)|2,{104,105,0}}, +/* 40157 */ {(11<<2)|2,{104,105,0}}, +/* 40158 */ {(11<<2)|2,{104,105,0}}, +/* 40159 */ {(11<<2)|2,{104,105,0}}, +/* 40160 */ {(16<<2)|3,{104,111,48}}, +/* 40161 */ {(16<<2)|3,{104,111,49}}, +/* 40162 */ {(16<<2)|3,{104,111,50}}, +/* 40163 */ {(16<<2)|3,{104,111,97}}, +/* 40164 */ {(16<<2)|3,{104,111,99}}, +/* 40165 */ {(16<<2)|3,{104,111,101}}, +/* 40166 */ {(16<<2)|3,{104,111,105}}, +/* 40167 */ {(16<<2)|3,{104,111,111}}, +/* 40168 */ {(16<<2)|3,{104,111,115}}, +/* 40169 */ {(16<<2)|3,{104,111,116}}, +/* 40170 */ {(11<<2)|2,{104,111,0}}, +/* 40171 */ {(11<<2)|2,{104,111,0}}, +/* 40172 */ {(11<<2)|2,{104,111,0}}, +/* 40173 */ {(11<<2)|2,{104,111,0}}, +/* 40174 */ {(11<<2)|2,{104,111,0}}, +/* 40175 */ {(11<<2)|2,{104,111,0}}, +/* 40176 */ {(11<<2)|2,{104,111,0}}, +/* 40177 */ {(11<<2)|2,{104,111,0}}, +/* 40178 */ {(11<<2)|2,{104,111,0}}, +/* 40179 */ {(11<<2)|2,{104,111,0}}, +/* 40180 */ {(11<<2)|2,{104,111,0}}, +/* 40181 */ {(11<<2)|2,{104,111,0}}, +/* 40182 */ {(11<<2)|2,{104,111,0}}, +/* 40183 */ {(11<<2)|2,{104,111,0}}, +/* 40184 */ {(11<<2)|2,{104,111,0}}, +/* 40185 */ {(11<<2)|2,{104,111,0}}, +/* 40186 */ {(11<<2)|2,{104,111,0}}, +/* 40187 */ {(11<<2)|2,{104,111,0}}, +/* 40188 */ {(11<<2)|2,{104,111,0}}, +/* 40189 */ {(11<<2)|2,{104,111,0}}, +/* 40190 */ {(11<<2)|2,{104,111,0}}, +/* 40191 */ {(11<<2)|2,{104,111,0}}, +/* 40192 */ {(16<<2)|3,{104,115,48}}, +/* 40193 */ {(16<<2)|3,{104,115,49}}, +/* 40194 */ {(16<<2)|3,{104,115,50}}, +/* 40195 */ {(16<<2)|3,{104,115,97}}, +/* 40196 */ {(16<<2)|3,{104,115,99}}, +/* 40197 */ {(16<<2)|3,{104,115,101}}, +/* 40198 */ {(16<<2)|3,{104,115,105}}, +/* 40199 */ {(16<<2)|3,{104,115,111}}, +/* 40200 */ {(16<<2)|3,{104,115,115}}, +/* 40201 */ {(16<<2)|3,{104,115,116}}, +/* 40202 */ {(11<<2)|2,{104,115,0}}, +/* 40203 */ {(11<<2)|2,{104,115,0}}, +/* 40204 */ {(11<<2)|2,{104,115,0}}, +/* 40205 */ {(11<<2)|2,{104,115,0}}, +/* 40206 */ {(11<<2)|2,{104,115,0}}, +/* 40207 */ {(11<<2)|2,{104,115,0}}, +/* 40208 */ {(11<<2)|2,{104,115,0}}, +/* 40209 */ {(11<<2)|2,{104,115,0}}, +/* 40210 */ {(11<<2)|2,{104,115,0}}, +/* 40211 */ {(11<<2)|2,{104,115,0}}, +/* 40212 */ {(11<<2)|2,{104,115,0}}, +/* 40213 */ {(11<<2)|2,{104,115,0}}, +/* 40214 */ {(11<<2)|2,{104,115,0}}, +/* 40215 */ {(11<<2)|2,{104,115,0}}, +/* 40216 */ {(11<<2)|2,{104,115,0}}, +/* 40217 */ {(11<<2)|2,{104,115,0}}, +/* 40218 */ {(11<<2)|2,{104,115,0}}, +/* 40219 */ {(11<<2)|2,{104,115,0}}, +/* 40220 */ {(11<<2)|2,{104,115,0}}, +/* 40221 */ {(11<<2)|2,{104,115,0}}, +/* 40222 */ {(11<<2)|2,{104,115,0}}, +/* 40223 */ {(11<<2)|2,{104,115,0}}, +/* 40224 */ {(16<<2)|3,{104,116,48}}, +/* 40225 */ {(16<<2)|3,{104,116,49}}, +/* 40226 */ {(16<<2)|3,{104,116,50}}, +/* 40227 */ {(16<<2)|3,{104,116,97}}, +/* 40228 */ {(16<<2)|3,{104,116,99}}, +/* 40229 */ {(16<<2)|3,{104,116,101}}, +/* 40230 */ {(16<<2)|3,{104,116,105}}, +/* 40231 */ {(16<<2)|3,{104,116,111}}, +/* 40232 */ {(16<<2)|3,{104,116,115}}, +/* 40233 */ {(16<<2)|3,{104,116,116}}, +/* 40234 */ {(11<<2)|2,{104,116,0}}, +/* 40235 */ {(11<<2)|2,{104,116,0}}, +/* 40236 */ {(11<<2)|2,{104,116,0}}, +/* 40237 */ {(11<<2)|2,{104,116,0}}, +/* 40238 */ {(11<<2)|2,{104,116,0}}, +/* 40239 */ {(11<<2)|2,{104,116,0}}, +/* 40240 */ {(11<<2)|2,{104,116,0}}, +/* 40241 */ {(11<<2)|2,{104,116,0}}, +/* 40242 */ {(11<<2)|2,{104,116,0}}, +/* 40243 */ {(11<<2)|2,{104,116,0}}, +/* 40244 */ {(11<<2)|2,{104,116,0}}, +/* 40245 */ {(11<<2)|2,{104,116,0}}, +/* 40246 */ {(11<<2)|2,{104,116,0}}, +/* 40247 */ {(11<<2)|2,{104,116,0}}, +/* 40248 */ {(11<<2)|2,{104,116,0}}, +/* 40249 */ {(11<<2)|2,{104,116,0}}, +/* 40250 */ {(11<<2)|2,{104,116,0}}, +/* 40251 */ {(11<<2)|2,{104,116,0}}, +/* 40252 */ {(11<<2)|2,{104,116,0}}, +/* 40253 */ {(11<<2)|2,{104,116,0}}, +/* 40254 */ {(11<<2)|2,{104,116,0}}, +/* 40255 */ {(11<<2)|2,{104,116,0}}, +/* 40256 */ {(12<<2)|2,{104,32,0}}, +/* 40257 */ {(12<<2)|2,{104,32,0}}, +/* 40258 */ {(12<<2)|2,{104,32,0}}, +/* 40259 */ {(12<<2)|2,{104,32,0}}, +/* 40260 */ {(12<<2)|2,{104,32,0}}, +/* 40261 */ {(12<<2)|2,{104,32,0}}, +/* 40262 */ {(12<<2)|2,{104,32,0}}, +/* 40263 */ {(12<<2)|2,{104,32,0}}, +/* 40264 */ {(12<<2)|2,{104,32,0}}, +/* 40265 */ {(12<<2)|2,{104,32,0}}, +/* 40266 */ {(12<<2)|2,{104,32,0}}, +/* 40267 */ {(12<<2)|2,{104,32,0}}, +/* 40268 */ {(12<<2)|2,{104,32,0}}, +/* 40269 */ {(12<<2)|2,{104,32,0}}, +/* 40270 */ {(12<<2)|2,{104,32,0}}, +/* 40271 */ {(12<<2)|2,{104,32,0}}, +/* 40272 */ {(12<<2)|2,{104,37,0}}, +/* 40273 */ {(12<<2)|2,{104,37,0}}, +/* 40274 */ {(12<<2)|2,{104,37,0}}, +/* 40275 */ {(12<<2)|2,{104,37,0}}, +/* 40276 */ {(12<<2)|2,{104,37,0}}, +/* 40277 */ {(12<<2)|2,{104,37,0}}, +/* 40278 */ {(12<<2)|2,{104,37,0}}, +/* 40279 */ {(12<<2)|2,{104,37,0}}, +/* 40280 */ {(12<<2)|2,{104,37,0}}, +/* 40281 */ {(12<<2)|2,{104,37,0}}, +/* 40282 */ {(12<<2)|2,{104,37,0}}, +/* 40283 */ {(12<<2)|2,{104,37,0}}, +/* 40284 */ {(12<<2)|2,{104,37,0}}, +/* 40285 */ {(12<<2)|2,{104,37,0}}, +/* 40286 */ {(12<<2)|2,{104,37,0}}, +/* 40287 */ {(12<<2)|2,{104,37,0}}, +/* 40288 */ {(12<<2)|2,{104,45,0}}, +/* 40289 */ {(12<<2)|2,{104,45,0}}, +/* 40290 */ {(12<<2)|2,{104,45,0}}, +/* 40291 */ {(12<<2)|2,{104,45,0}}, +/* 40292 */ {(12<<2)|2,{104,45,0}}, +/* 40293 */ {(12<<2)|2,{104,45,0}}, +/* 40294 */ {(12<<2)|2,{104,45,0}}, +/* 40295 */ {(12<<2)|2,{104,45,0}}, +/* 40296 */ {(12<<2)|2,{104,45,0}}, +/* 40297 */ {(12<<2)|2,{104,45,0}}, +/* 40298 */ {(12<<2)|2,{104,45,0}}, +/* 40299 */ {(12<<2)|2,{104,45,0}}, +/* 40300 */ {(12<<2)|2,{104,45,0}}, +/* 40301 */ {(12<<2)|2,{104,45,0}}, +/* 40302 */ {(12<<2)|2,{104,45,0}}, +/* 40303 */ {(12<<2)|2,{104,45,0}}, +/* 40304 */ {(12<<2)|2,{104,46,0}}, +/* 40305 */ {(12<<2)|2,{104,46,0}}, +/* 40306 */ {(12<<2)|2,{104,46,0}}, +/* 40307 */ {(12<<2)|2,{104,46,0}}, +/* 40308 */ {(12<<2)|2,{104,46,0}}, +/* 40309 */ {(12<<2)|2,{104,46,0}}, +/* 40310 */ {(12<<2)|2,{104,46,0}}, +/* 40311 */ {(12<<2)|2,{104,46,0}}, +/* 40312 */ {(12<<2)|2,{104,46,0}}, +/* 40313 */ {(12<<2)|2,{104,46,0}}, +/* 40314 */ {(12<<2)|2,{104,46,0}}, +/* 40315 */ {(12<<2)|2,{104,46,0}}, +/* 40316 */ {(12<<2)|2,{104,46,0}}, +/* 40317 */ {(12<<2)|2,{104,46,0}}, +/* 40318 */ {(12<<2)|2,{104,46,0}}, +/* 40319 */ {(12<<2)|2,{104,46,0}}, +/* 40320 */ {(12<<2)|2,{104,47,0}}, +/* 40321 */ {(12<<2)|2,{104,47,0}}, +/* 40322 */ {(12<<2)|2,{104,47,0}}, +/* 40323 */ {(12<<2)|2,{104,47,0}}, +/* 40324 */ {(12<<2)|2,{104,47,0}}, +/* 40325 */ {(12<<2)|2,{104,47,0}}, +/* 40326 */ {(12<<2)|2,{104,47,0}}, +/* 40327 */ {(12<<2)|2,{104,47,0}}, +/* 40328 */ {(12<<2)|2,{104,47,0}}, +/* 40329 */ {(12<<2)|2,{104,47,0}}, +/* 40330 */ {(12<<2)|2,{104,47,0}}, +/* 40331 */ {(12<<2)|2,{104,47,0}}, +/* 40332 */ {(12<<2)|2,{104,47,0}}, +/* 40333 */ {(12<<2)|2,{104,47,0}}, +/* 40334 */ {(12<<2)|2,{104,47,0}}, +/* 40335 */ {(12<<2)|2,{104,47,0}}, +/* 40336 */ {(12<<2)|2,{104,51,0}}, +/* 40337 */ {(12<<2)|2,{104,51,0}}, +/* 40338 */ {(12<<2)|2,{104,51,0}}, +/* 40339 */ {(12<<2)|2,{104,51,0}}, +/* 40340 */ {(12<<2)|2,{104,51,0}}, +/* 40341 */ {(12<<2)|2,{104,51,0}}, +/* 40342 */ {(12<<2)|2,{104,51,0}}, +/* 40343 */ {(12<<2)|2,{104,51,0}}, +/* 40344 */ {(12<<2)|2,{104,51,0}}, +/* 40345 */ {(12<<2)|2,{104,51,0}}, +/* 40346 */ {(12<<2)|2,{104,51,0}}, +/* 40347 */ {(12<<2)|2,{104,51,0}}, +/* 40348 */ {(12<<2)|2,{104,51,0}}, +/* 40349 */ {(12<<2)|2,{104,51,0}}, +/* 40350 */ {(12<<2)|2,{104,51,0}}, +/* 40351 */ {(12<<2)|2,{104,51,0}}, +/* 40352 */ {(12<<2)|2,{104,52,0}}, +/* 40353 */ {(12<<2)|2,{104,52,0}}, +/* 40354 */ {(12<<2)|2,{104,52,0}}, +/* 40355 */ {(12<<2)|2,{104,52,0}}, +/* 40356 */ {(12<<2)|2,{104,52,0}}, +/* 40357 */ {(12<<2)|2,{104,52,0}}, +/* 40358 */ {(12<<2)|2,{104,52,0}}, +/* 40359 */ {(12<<2)|2,{104,52,0}}, +/* 40360 */ {(12<<2)|2,{104,52,0}}, +/* 40361 */ {(12<<2)|2,{104,52,0}}, +/* 40362 */ {(12<<2)|2,{104,52,0}}, +/* 40363 */ {(12<<2)|2,{104,52,0}}, +/* 40364 */ {(12<<2)|2,{104,52,0}}, +/* 40365 */ {(12<<2)|2,{104,52,0}}, +/* 40366 */ {(12<<2)|2,{104,52,0}}, +/* 40367 */ {(12<<2)|2,{104,52,0}}, +/* 40368 */ {(12<<2)|2,{104,53,0}}, +/* 40369 */ {(12<<2)|2,{104,53,0}}, +/* 40370 */ {(12<<2)|2,{104,53,0}}, +/* 40371 */ {(12<<2)|2,{104,53,0}}, +/* 40372 */ {(12<<2)|2,{104,53,0}}, +/* 40373 */ {(12<<2)|2,{104,53,0}}, +/* 40374 */ {(12<<2)|2,{104,53,0}}, +/* 40375 */ {(12<<2)|2,{104,53,0}}, +/* 40376 */ {(12<<2)|2,{104,53,0}}, +/* 40377 */ {(12<<2)|2,{104,53,0}}, +/* 40378 */ {(12<<2)|2,{104,53,0}}, +/* 40379 */ {(12<<2)|2,{104,53,0}}, +/* 40380 */ {(12<<2)|2,{104,53,0}}, +/* 40381 */ {(12<<2)|2,{104,53,0}}, +/* 40382 */ {(12<<2)|2,{104,53,0}}, +/* 40383 */ {(12<<2)|2,{104,53,0}}, +/* 40384 */ {(12<<2)|2,{104,54,0}}, +/* 40385 */ {(12<<2)|2,{104,54,0}}, +/* 40386 */ {(12<<2)|2,{104,54,0}}, +/* 40387 */ {(12<<2)|2,{104,54,0}}, +/* 40388 */ {(12<<2)|2,{104,54,0}}, +/* 40389 */ {(12<<2)|2,{104,54,0}}, +/* 40390 */ {(12<<2)|2,{104,54,0}}, +/* 40391 */ {(12<<2)|2,{104,54,0}}, +/* 40392 */ {(12<<2)|2,{104,54,0}}, +/* 40393 */ {(12<<2)|2,{104,54,0}}, +/* 40394 */ {(12<<2)|2,{104,54,0}}, +/* 40395 */ {(12<<2)|2,{104,54,0}}, +/* 40396 */ {(12<<2)|2,{104,54,0}}, +/* 40397 */ {(12<<2)|2,{104,54,0}}, +/* 40398 */ {(12<<2)|2,{104,54,0}}, +/* 40399 */ {(12<<2)|2,{104,54,0}}, +/* 40400 */ {(12<<2)|2,{104,55,0}}, +/* 40401 */ {(12<<2)|2,{104,55,0}}, +/* 40402 */ {(12<<2)|2,{104,55,0}}, +/* 40403 */ {(12<<2)|2,{104,55,0}}, +/* 40404 */ {(12<<2)|2,{104,55,0}}, +/* 40405 */ {(12<<2)|2,{104,55,0}}, +/* 40406 */ {(12<<2)|2,{104,55,0}}, +/* 40407 */ {(12<<2)|2,{104,55,0}}, +/* 40408 */ {(12<<2)|2,{104,55,0}}, +/* 40409 */ {(12<<2)|2,{104,55,0}}, +/* 40410 */ {(12<<2)|2,{104,55,0}}, +/* 40411 */ {(12<<2)|2,{104,55,0}}, +/* 40412 */ {(12<<2)|2,{104,55,0}}, +/* 40413 */ {(12<<2)|2,{104,55,0}}, +/* 40414 */ {(12<<2)|2,{104,55,0}}, +/* 40415 */ {(12<<2)|2,{104,55,0}}, +/* 40416 */ {(12<<2)|2,{104,56,0}}, +/* 40417 */ {(12<<2)|2,{104,56,0}}, +/* 40418 */ {(12<<2)|2,{104,56,0}}, +/* 40419 */ {(12<<2)|2,{104,56,0}}, +/* 40420 */ {(12<<2)|2,{104,56,0}}, +/* 40421 */ {(12<<2)|2,{104,56,0}}, +/* 40422 */ {(12<<2)|2,{104,56,0}}, +/* 40423 */ {(12<<2)|2,{104,56,0}}, +/* 40424 */ {(12<<2)|2,{104,56,0}}, +/* 40425 */ {(12<<2)|2,{104,56,0}}, +/* 40426 */ {(12<<2)|2,{104,56,0}}, +/* 40427 */ {(12<<2)|2,{104,56,0}}, +/* 40428 */ {(12<<2)|2,{104,56,0}}, +/* 40429 */ {(12<<2)|2,{104,56,0}}, +/* 40430 */ {(12<<2)|2,{104,56,0}}, +/* 40431 */ {(12<<2)|2,{104,56,0}}, +/* 40432 */ {(12<<2)|2,{104,57,0}}, +/* 40433 */ {(12<<2)|2,{104,57,0}}, +/* 40434 */ {(12<<2)|2,{104,57,0}}, +/* 40435 */ {(12<<2)|2,{104,57,0}}, +/* 40436 */ {(12<<2)|2,{104,57,0}}, +/* 40437 */ {(12<<2)|2,{104,57,0}}, +/* 40438 */ {(12<<2)|2,{104,57,0}}, +/* 40439 */ {(12<<2)|2,{104,57,0}}, +/* 40440 */ {(12<<2)|2,{104,57,0}}, +/* 40441 */ {(12<<2)|2,{104,57,0}}, +/* 40442 */ {(12<<2)|2,{104,57,0}}, +/* 40443 */ {(12<<2)|2,{104,57,0}}, +/* 40444 */ {(12<<2)|2,{104,57,0}}, +/* 40445 */ {(12<<2)|2,{104,57,0}}, +/* 40446 */ {(12<<2)|2,{104,57,0}}, +/* 40447 */ {(12<<2)|2,{104,57,0}}, +/* 40448 */ {(12<<2)|2,{104,61,0}}, +/* 40449 */ {(12<<2)|2,{104,61,0}}, +/* 40450 */ {(12<<2)|2,{104,61,0}}, +/* 40451 */ {(12<<2)|2,{104,61,0}}, +/* 40452 */ {(12<<2)|2,{104,61,0}}, +/* 40453 */ {(12<<2)|2,{104,61,0}}, +/* 40454 */ {(12<<2)|2,{104,61,0}}, +/* 40455 */ {(12<<2)|2,{104,61,0}}, +/* 40456 */ {(12<<2)|2,{104,61,0}}, +/* 40457 */ {(12<<2)|2,{104,61,0}}, +/* 40458 */ {(12<<2)|2,{104,61,0}}, +/* 40459 */ {(12<<2)|2,{104,61,0}}, +/* 40460 */ {(12<<2)|2,{104,61,0}}, +/* 40461 */ {(12<<2)|2,{104,61,0}}, +/* 40462 */ {(12<<2)|2,{104,61,0}}, +/* 40463 */ {(12<<2)|2,{104,61,0}}, +/* 40464 */ {(12<<2)|2,{104,65,0}}, +/* 40465 */ {(12<<2)|2,{104,65,0}}, +/* 40466 */ {(12<<2)|2,{104,65,0}}, +/* 40467 */ {(12<<2)|2,{104,65,0}}, +/* 40468 */ {(12<<2)|2,{104,65,0}}, +/* 40469 */ {(12<<2)|2,{104,65,0}}, +/* 40470 */ {(12<<2)|2,{104,65,0}}, +/* 40471 */ {(12<<2)|2,{104,65,0}}, +/* 40472 */ {(12<<2)|2,{104,65,0}}, +/* 40473 */ {(12<<2)|2,{104,65,0}}, +/* 40474 */ {(12<<2)|2,{104,65,0}}, +/* 40475 */ {(12<<2)|2,{104,65,0}}, +/* 40476 */ {(12<<2)|2,{104,65,0}}, +/* 40477 */ {(12<<2)|2,{104,65,0}}, +/* 40478 */ {(12<<2)|2,{104,65,0}}, +/* 40479 */ {(12<<2)|2,{104,65,0}}, +/* 40480 */ {(12<<2)|2,{104,95,0}}, +/* 40481 */ {(12<<2)|2,{104,95,0}}, +/* 40482 */ {(12<<2)|2,{104,95,0}}, +/* 40483 */ {(12<<2)|2,{104,95,0}}, +/* 40484 */ {(12<<2)|2,{104,95,0}}, +/* 40485 */ {(12<<2)|2,{104,95,0}}, +/* 40486 */ {(12<<2)|2,{104,95,0}}, +/* 40487 */ {(12<<2)|2,{104,95,0}}, +/* 40488 */ {(12<<2)|2,{104,95,0}}, +/* 40489 */ {(12<<2)|2,{104,95,0}}, +/* 40490 */ {(12<<2)|2,{104,95,0}}, +/* 40491 */ {(12<<2)|2,{104,95,0}}, +/* 40492 */ {(12<<2)|2,{104,95,0}}, +/* 40493 */ {(12<<2)|2,{104,95,0}}, +/* 40494 */ {(12<<2)|2,{104,95,0}}, +/* 40495 */ {(12<<2)|2,{104,95,0}}, +/* 40496 */ {(12<<2)|2,{104,98,0}}, +/* 40497 */ {(12<<2)|2,{104,98,0}}, +/* 40498 */ {(12<<2)|2,{104,98,0}}, +/* 40499 */ {(12<<2)|2,{104,98,0}}, +/* 40500 */ {(12<<2)|2,{104,98,0}}, +/* 40501 */ {(12<<2)|2,{104,98,0}}, +/* 40502 */ {(12<<2)|2,{104,98,0}}, +/* 40503 */ {(12<<2)|2,{104,98,0}}, +/* 40504 */ {(12<<2)|2,{104,98,0}}, +/* 40505 */ {(12<<2)|2,{104,98,0}}, +/* 40506 */ {(12<<2)|2,{104,98,0}}, +/* 40507 */ {(12<<2)|2,{104,98,0}}, +/* 40508 */ {(12<<2)|2,{104,98,0}}, +/* 40509 */ {(12<<2)|2,{104,98,0}}, +/* 40510 */ {(12<<2)|2,{104,98,0}}, +/* 40511 */ {(12<<2)|2,{104,98,0}}, +/* 40512 */ {(12<<2)|2,{104,100,0}}, +/* 40513 */ {(12<<2)|2,{104,100,0}}, +/* 40514 */ {(12<<2)|2,{104,100,0}}, +/* 40515 */ {(12<<2)|2,{104,100,0}}, +/* 40516 */ {(12<<2)|2,{104,100,0}}, +/* 40517 */ {(12<<2)|2,{104,100,0}}, +/* 40518 */ {(12<<2)|2,{104,100,0}}, +/* 40519 */ {(12<<2)|2,{104,100,0}}, +/* 40520 */ {(12<<2)|2,{104,100,0}}, +/* 40521 */ {(12<<2)|2,{104,100,0}}, +/* 40522 */ {(12<<2)|2,{104,100,0}}, +/* 40523 */ {(12<<2)|2,{104,100,0}}, +/* 40524 */ {(12<<2)|2,{104,100,0}}, +/* 40525 */ {(12<<2)|2,{104,100,0}}, +/* 40526 */ {(12<<2)|2,{104,100,0}}, +/* 40527 */ {(12<<2)|2,{104,100,0}}, +/* 40528 */ {(12<<2)|2,{104,102,0}}, +/* 40529 */ {(12<<2)|2,{104,102,0}}, +/* 40530 */ {(12<<2)|2,{104,102,0}}, +/* 40531 */ {(12<<2)|2,{104,102,0}}, +/* 40532 */ {(12<<2)|2,{104,102,0}}, +/* 40533 */ {(12<<2)|2,{104,102,0}}, +/* 40534 */ {(12<<2)|2,{104,102,0}}, +/* 40535 */ {(12<<2)|2,{104,102,0}}, +/* 40536 */ {(12<<2)|2,{104,102,0}}, +/* 40537 */ {(12<<2)|2,{104,102,0}}, +/* 40538 */ {(12<<2)|2,{104,102,0}}, +/* 40539 */ {(12<<2)|2,{104,102,0}}, +/* 40540 */ {(12<<2)|2,{104,102,0}}, +/* 40541 */ {(12<<2)|2,{104,102,0}}, +/* 40542 */ {(12<<2)|2,{104,102,0}}, +/* 40543 */ {(12<<2)|2,{104,102,0}}, +/* 40544 */ {(12<<2)|2,{104,103,0}}, +/* 40545 */ {(12<<2)|2,{104,103,0}}, +/* 40546 */ {(12<<2)|2,{104,103,0}}, +/* 40547 */ {(12<<2)|2,{104,103,0}}, +/* 40548 */ {(12<<2)|2,{104,103,0}}, +/* 40549 */ {(12<<2)|2,{104,103,0}}, +/* 40550 */ {(12<<2)|2,{104,103,0}}, +/* 40551 */ {(12<<2)|2,{104,103,0}}, +/* 40552 */ {(12<<2)|2,{104,103,0}}, +/* 40553 */ {(12<<2)|2,{104,103,0}}, +/* 40554 */ {(12<<2)|2,{104,103,0}}, +/* 40555 */ {(12<<2)|2,{104,103,0}}, +/* 40556 */ {(12<<2)|2,{104,103,0}}, +/* 40557 */ {(12<<2)|2,{104,103,0}}, +/* 40558 */ {(12<<2)|2,{104,103,0}}, +/* 40559 */ {(12<<2)|2,{104,103,0}}, +/* 40560 */ {(12<<2)|2,{104,104,0}}, +/* 40561 */ {(12<<2)|2,{104,104,0}}, +/* 40562 */ {(12<<2)|2,{104,104,0}}, +/* 40563 */ {(12<<2)|2,{104,104,0}}, +/* 40564 */ {(12<<2)|2,{104,104,0}}, +/* 40565 */ {(12<<2)|2,{104,104,0}}, +/* 40566 */ {(12<<2)|2,{104,104,0}}, +/* 40567 */ {(12<<2)|2,{104,104,0}}, +/* 40568 */ {(12<<2)|2,{104,104,0}}, +/* 40569 */ {(12<<2)|2,{104,104,0}}, +/* 40570 */ {(12<<2)|2,{104,104,0}}, +/* 40571 */ {(12<<2)|2,{104,104,0}}, +/* 40572 */ {(12<<2)|2,{104,104,0}}, +/* 40573 */ {(12<<2)|2,{104,104,0}}, +/* 40574 */ {(12<<2)|2,{104,104,0}}, +/* 40575 */ {(12<<2)|2,{104,104,0}}, +/* 40576 */ {(12<<2)|2,{104,108,0}}, +/* 40577 */ {(12<<2)|2,{104,108,0}}, +/* 40578 */ {(12<<2)|2,{104,108,0}}, +/* 40579 */ {(12<<2)|2,{104,108,0}}, +/* 40580 */ {(12<<2)|2,{104,108,0}}, +/* 40581 */ {(12<<2)|2,{104,108,0}}, +/* 40582 */ {(12<<2)|2,{104,108,0}}, +/* 40583 */ {(12<<2)|2,{104,108,0}}, +/* 40584 */ {(12<<2)|2,{104,108,0}}, +/* 40585 */ {(12<<2)|2,{104,108,0}}, +/* 40586 */ {(12<<2)|2,{104,108,0}}, +/* 40587 */ {(12<<2)|2,{104,108,0}}, +/* 40588 */ {(12<<2)|2,{104,108,0}}, +/* 40589 */ {(12<<2)|2,{104,108,0}}, +/* 40590 */ {(12<<2)|2,{104,108,0}}, +/* 40591 */ {(12<<2)|2,{104,108,0}}, +/* 40592 */ {(12<<2)|2,{104,109,0}}, +/* 40593 */ {(12<<2)|2,{104,109,0}}, +/* 40594 */ {(12<<2)|2,{104,109,0}}, +/* 40595 */ {(12<<2)|2,{104,109,0}}, +/* 40596 */ {(12<<2)|2,{104,109,0}}, +/* 40597 */ {(12<<2)|2,{104,109,0}}, +/* 40598 */ {(12<<2)|2,{104,109,0}}, +/* 40599 */ {(12<<2)|2,{104,109,0}}, +/* 40600 */ {(12<<2)|2,{104,109,0}}, +/* 40601 */ {(12<<2)|2,{104,109,0}}, +/* 40602 */ {(12<<2)|2,{104,109,0}}, +/* 40603 */ {(12<<2)|2,{104,109,0}}, +/* 40604 */ {(12<<2)|2,{104,109,0}}, +/* 40605 */ {(12<<2)|2,{104,109,0}}, +/* 40606 */ {(12<<2)|2,{104,109,0}}, +/* 40607 */ {(12<<2)|2,{104,109,0}}, +/* 40608 */ {(12<<2)|2,{104,110,0}}, +/* 40609 */ {(12<<2)|2,{104,110,0}}, +/* 40610 */ {(12<<2)|2,{104,110,0}}, +/* 40611 */ {(12<<2)|2,{104,110,0}}, +/* 40612 */ {(12<<2)|2,{104,110,0}}, +/* 40613 */ {(12<<2)|2,{104,110,0}}, +/* 40614 */ {(12<<2)|2,{104,110,0}}, +/* 40615 */ {(12<<2)|2,{104,110,0}}, +/* 40616 */ {(12<<2)|2,{104,110,0}}, +/* 40617 */ {(12<<2)|2,{104,110,0}}, +/* 40618 */ {(12<<2)|2,{104,110,0}}, +/* 40619 */ {(12<<2)|2,{104,110,0}}, +/* 40620 */ {(12<<2)|2,{104,110,0}}, +/* 40621 */ {(12<<2)|2,{104,110,0}}, +/* 40622 */ {(12<<2)|2,{104,110,0}}, +/* 40623 */ {(12<<2)|2,{104,110,0}}, +/* 40624 */ {(12<<2)|2,{104,112,0}}, +/* 40625 */ {(12<<2)|2,{104,112,0}}, +/* 40626 */ {(12<<2)|2,{104,112,0}}, +/* 40627 */ {(12<<2)|2,{104,112,0}}, +/* 40628 */ {(12<<2)|2,{104,112,0}}, +/* 40629 */ {(12<<2)|2,{104,112,0}}, +/* 40630 */ {(12<<2)|2,{104,112,0}}, +/* 40631 */ {(12<<2)|2,{104,112,0}}, +/* 40632 */ {(12<<2)|2,{104,112,0}}, +/* 40633 */ {(12<<2)|2,{104,112,0}}, +/* 40634 */ {(12<<2)|2,{104,112,0}}, +/* 40635 */ {(12<<2)|2,{104,112,0}}, +/* 40636 */ {(12<<2)|2,{104,112,0}}, +/* 40637 */ {(12<<2)|2,{104,112,0}}, +/* 40638 */ {(12<<2)|2,{104,112,0}}, +/* 40639 */ {(12<<2)|2,{104,112,0}}, +/* 40640 */ {(12<<2)|2,{104,114,0}}, +/* 40641 */ {(12<<2)|2,{104,114,0}}, +/* 40642 */ {(12<<2)|2,{104,114,0}}, +/* 40643 */ {(12<<2)|2,{104,114,0}}, +/* 40644 */ {(12<<2)|2,{104,114,0}}, +/* 40645 */ {(12<<2)|2,{104,114,0}}, +/* 40646 */ {(12<<2)|2,{104,114,0}}, +/* 40647 */ {(12<<2)|2,{104,114,0}}, +/* 40648 */ {(12<<2)|2,{104,114,0}}, +/* 40649 */ {(12<<2)|2,{104,114,0}}, +/* 40650 */ {(12<<2)|2,{104,114,0}}, +/* 40651 */ {(12<<2)|2,{104,114,0}}, +/* 40652 */ {(12<<2)|2,{104,114,0}}, +/* 40653 */ {(12<<2)|2,{104,114,0}}, +/* 40654 */ {(12<<2)|2,{104,114,0}}, +/* 40655 */ {(12<<2)|2,{104,114,0}}, +/* 40656 */ {(12<<2)|2,{104,117,0}}, +/* 40657 */ {(12<<2)|2,{104,117,0}}, +/* 40658 */ {(12<<2)|2,{104,117,0}}, +/* 40659 */ {(12<<2)|2,{104,117,0}}, +/* 40660 */ {(12<<2)|2,{104,117,0}}, +/* 40661 */ {(12<<2)|2,{104,117,0}}, +/* 40662 */ {(12<<2)|2,{104,117,0}}, +/* 40663 */ {(12<<2)|2,{104,117,0}}, +/* 40664 */ {(12<<2)|2,{104,117,0}}, +/* 40665 */ {(12<<2)|2,{104,117,0}}, +/* 40666 */ {(12<<2)|2,{104,117,0}}, +/* 40667 */ {(12<<2)|2,{104,117,0}}, +/* 40668 */ {(12<<2)|2,{104,117,0}}, +/* 40669 */ {(12<<2)|2,{104,117,0}}, +/* 40670 */ {(12<<2)|2,{104,117,0}}, +/* 40671 */ {(12<<2)|2,{104,117,0}}, +/* 40672 */ {(13<<2)|2,{104,58,0}}, +/* 40673 */ {(13<<2)|2,{104,58,0}}, +/* 40674 */ {(13<<2)|2,{104,58,0}}, +/* 40675 */ {(13<<2)|2,{104,58,0}}, +/* 40676 */ {(13<<2)|2,{104,58,0}}, +/* 40677 */ {(13<<2)|2,{104,58,0}}, +/* 40678 */ {(13<<2)|2,{104,58,0}}, +/* 40679 */ {(13<<2)|2,{104,58,0}}, +/* 40680 */ {(13<<2)|2,{104,66,0}}, +/* 40681 */ {(13<<2)|2,{104,66,0}}, +/* 40682 */ {(13<<2)|2,{104,66,0}}, +/* 40683 */ {(13<<2)|2,{104,66,0}}, +/* 40684 */ {(13<<2)|2,{104,66,0}}, +/* 40685 */ {(13<<2)|2,{104,66,0}}, +/* 40686 */ {(13<<2)|2,{104,66,0}}, +/* 40687 */ {(13<<2)|2,{104,66,0}}, +/* 40688 */ {(13<<2)|2,{104,67,0}}, +/* 40689 */ {(13<<2)|2,{104,67,0}}, +/* 40690 */ {(13<<2)|2,{104,67,0}}, +/* 40691 */ {(13<<2)|2,{104,67,0}}, +/* 40692 */ {(13<<2)|2,{104,67,0}}, +/* 40693 */ {(13<<2)|2,{104,67,0}}, +/* 40694 */ {(13<<2)|2,{104,67,0}}, +/* 40695 */ {(13<<2)|2,{104,67,0}}, +/* 40696 */ {(13<<2)|2,{104,68,0}}, +/* 40697 */ {(13<<2)|2,{104,68,0}}, +/* 40698 */ {(13<<2)|2,{104,68,0}}, +/* 40699 */ {(13<<2)|2,{104,68,0}}, +/* 40700 */ {(13<<2)|2,{104,68,0}}, +/* 40701 */ {(13<<2)|2,{104,68,0}}, +/* 40702 */ {(13<<2)|2,{104,68,0}}, +/* 40703 */ {(13<<2)|2,{104,68,0}}, +/* 40704 */ {(13<<2)|2,{104,69,0}}, +/* 40705 */ {(13<<2)|2,{104,69,0}}, +/* 40706 */ {(13<<2)|2,{104,69,0}}, +/* 40707 */ {(13<<2)|2,{104,69,0}}, +/* 40708 */ {(13<<2)|2,{104,69,0}}, +/* 40709 */ {(13<<2)|2,{104,69,0}}, +/* 40710 */ {(13<<2)|2,{104,69,0}}, +/* 40711 */ {(13<<2)|2,{104,69,0}}, +/* 40712 */ {(13<<2)|2,{104,70,0}}, +/* 40713 */ {(13<<2)|2,{104,70,0}}, +/* 40714 */ {(13<<2)|2,{104,70,0}}, +/* 40715 */ {(13<<2)|2,{104,70,0}}, +/* 40716 */ {(13<<2)|2,{104,70,0}}, +/* 40717 */ {(13<<2)|2,{104,70,0}}, +/* 40718 */ {(13<<2)|2,{104,70,0}}, +/* 40719 */ {(13<<2)|2,{104,70,0}}, +/* 40720 */ {(13<<2)|2,{104,71,0}}, +/* 40721 */ {(13<<2)|2,{104,71,0}}, +/* 40722 */ {(13<<2)|2,{104,71,0}}, +/* 40723 */ {(13<<2)|2,{104,71,0}}, +/* 40724 */ {(13<<2)|2,{104,71,0}}, +/* 40725 */ {(13<<2)|2,{104,71,0}}, +/* 40726 */ {(13<<2)|2,{104,71,0}}, +/* 40727 */ {(13<<2)|2,{104,71,0}}, +/* 40728 */ {(13<<2)|2,{104,72,0}}, +/* 40729 */ {(13<<2)|2,{104,72,0}}, +/* 40730 */ {(13<<2)|2,{104,72,0}}, +/* 40731 */ {(13<<2)|2,{104,72,0}}, +/* 40732 */ {(13<<2)|2,{104,72,0}}, +/* 40733 */ {(13<<2)|2,{104,72,0}}, +/* 40734 */ {(13<<2)|2,{104,72,0}}, +/* 40735 */ {(13<<2)|2,{104,72,0}}, +/* 40736 */ {(13<<2)|2,{104,73,0}}, +/* 40737 */ {(13<<2)|2,{104,73,0}}, +/* 40738 */ {(13<<2)|2,{104,73,0}}, +/* 40739 */ {(13<<2)|2,{104,73,0}}, +/* 40740 */ {(13<<2)|2,{104,73,0}}, +/* 40741 */ {(13<<2)|2,{104,73,0}}, +/* 40742 */ {(13<<2)|2,{104,73,0}}, +/* 40743 */ {(13<<2)|2,{104,73,0}}, +/* 40744 */ {(13<<2)|2,{104,74,0}}, +/* 40745 */ {(13<<2)|2,{104,74,0}}, +/* 40746 */ {(13<<2)|2,{104,74,0}}, +/* 40747 */ {(13<<2)|2,{104,74,0}}, +/* 40748 */ {(13<<2)|2,{104,74,0}}, +/* 40749 */ {(13<<2)|2,{104,74,0}}, +/* 40750 */ {(13<<2)|2,{104,74,0}}, +/* 40751 */ {(13<<2)|2,{104,74,0}}, +/* 40752 */ {(13<<2)|2,{104,75,0}}, +/* 40753 */ {(13<<2)|2,{104,75,0}}, +/* 40754 */ {(13<<2)|2,{104,75,0}}, +/* 40755 */ {(13<<2)|2,{104,75,0}}, +/* 40756 */ {(13<<2)|2,{104,75,0}}, +/* 40757 */ {(13<<2)|2,{104,75,0}}, +/* 40758 */ {(13<<2)|2,{104,75,0}}, +/* 40759 */ {(13<<2)|2,{104,75,0}}, +/* 40760 */ {(13<<2)|2,{104,76,0}}, +/* 40761 */ {(13<<2)|2,{104,76,0}}, +/* 40762 */ {(13<<2)|2,{104,76,0}}, +/* 40763 */ {(13<<2)|2,{104,76,0}}, +/* 40764 */ {(13<<2)|2,{104,76,0}}, +/* 40765 */ {(13<<2)|2,{104,76,0}}, +/* 40766 */ {(13<<2)|2,{104,76,0}}, +/* 40767 */ {(13<<2)|2,{104,76,0}}, +/* 40768 */ {(13<<2)|2,{104,77,0}}, +/* 40769 */ {(13<<2)|2,{104,77,0}}, +/* 40770 */ {(13<<2)|2,{104,77,0}}, +/* 40771 */ {(13<<2)|2,{104,77,0}}, +/* 40772 */ {(13<<2)|2,{104,77,0}}, +/* 40773 */ {(13<<2)|2,{104,77,0}}, +/* 40774 */ {(13<<2)|2,{104,77,0}}, +/* 40775 */ {(13<<2)|2,{104,77,0}}, +/* 40776 */ {(13<<2)|2,{104,78,0}}, +/* 40777 */ {(13<<2)|2,{104,78,0}}, +/* 40778 */ {(13<<2)|2,{104,78,0}}, +/* 40779 */ {(13<<2)|2,{104,78,0}}, +/* 40780 */ {(13<<2)|2,{104,78,0}}, +/* 40781 */ {(13<<2)|2,{104,78,0}}, +/* 40782 */ {(13<<2)|2,{104,78,0}}, +/* 40783 */ {(13<<2)|2,{104,78,0}}, +/* 40784 */ {(13<<2)|2,{104,79,0}}, +/* 40785 */ {(13<<2)|2,{104,79,0}}, +/* 40786 */ {(13<<2)|2,{104,79,0}}, +/* 40787 */ {(13<<2)|2,{104,79,0}}, +/* 40788 */ {(13<<2)|2,{104,79,0}}, +/* 40789 */ {(13<<2)|2,{104,79,0}}, +/* 40790 */ {(13<<2)|2,{104,79,0}}, +/* 40791 */ {(13<<2)|2,{104,79,0}}, +/* 40792 */ {(13<<2)|2,{104,80,0}}, +/* 40793 */ {(13<<2)|2,{104,80,0}}, +/* 40794 */ {(13<<2)|2,{104,80,0}}, +/* 40795 */ {(13<<2)|2,{104,80,0}}, +/* 40796 */ {(13<<2)|2,{104,80,0}}, +/* 40797 */ {(13<<2)|2,{104,80,0}}, +/* 40798 */ {(13<<2)|2,{104,80,0}}, +/* 40799 */ {(13<<2)|2,{104,80,0}}, +/* 40800 */ {(13<<2)|2,{104,81,0}}, +/* 40801 */ {(13<<2)|2,{104,81,0}}, +/* 40802 */ {(13<<2)|2,{104,81,0}}, +/* 40803 */ {(13<<2)|2,{104,81,0}}, +/* 40804 */ {(13<<2)|2,{104,81,0}}, +/* 40805 */ {(13<<2)|2,{104,81,0}}, +/* 40806 */ {(13<<2)|2,{104,81,0}}, +/* 40807 */ {(13<<2)|2,{104,81,0}}, +/* 40808 */ {(13<<2)|2,{104,82,0}}, +/* 40809 */ {(13<<2)|2,{104,82,0}}, +/* 40810 */ {(13<<2)|2,{104,82,0}}, +/* 40811 */ {(13<<2)|2,{104,82,0}}, +/* 40812 */ {(13<<2)|2,{104,82,0}}, +/* 40813 */ {(13<<2)|2,{104,82,0}}, +/* 40814 */ {(13<<2)|2,{104,82,0}}, +/* 40815 */ {(13<<2)|2,{104,82,0}}, +/* 40816 */ {(13<<2)|2,{104,83,0}}, +/* 40817 */ {(13<<2)|2,{104,83,0}}, +/* 40818 */ {(13<<2)|2,{104,83,0}}, +/* 40819 */ {(13<<2)|2,{104,83,0}}, +/* 40820 */ {(13<<2)|2,{104,83,0}}, +/* 40821 */ {(13<<2)|2,{104,83,0}}, +/* 40822 */ {(13<<2)|2,{104,83,0}}, +/* 40823 */ {(13<<2)|2,{104,83,0}}, +/* 40824 */ {(13<<2)|2,{104,84,0}}, +/* 40825 */ {(13<<2)|2,{104,84,0}}, +/* 40826 */ {(13<<2)|2,{104,84,0}}, +/* 40827 */ {(13<<2)|2,{104,84,0}}, +/* 40828 */ {(13<<2)|2,{104,84,0}}, +/* 40829 */ {(13<<2)|2,{104,84,0}}, +/* 40830 */ {(13<<2)|2,{104,84,0}}, +/* 40831 */ {(13<<2)|2,{104,84,0}}, +/* 40832 */ {(13<<2)|2,{104,85,0}}, +/* 40833 */ {(13<<2)|2,{104,85,0}}, +/* 40834 */ {(13<<2)|2,{104,85,0}}, +/* 40835 */ {(13<<2)|2,{104,85,0}}, +/* 40836 */ {(13<<2)|2,{104,85,0}}, +/* 40837 */ {(13<<2)|2,{104,85,0}}, +/* 40838 */ {(13<<2)|2,{104,85,0}}, +/* 40839 */ {(13<<2)|2,{104,85,0}}, +/* 40840 */ {(13<<2)|2,{104,86,0}}, +/* 40841 */ {(13<<2)|2,{104,86,0}}, +/* 40842 */ {(13<<2)|2,{104,86,0}}, +/* 40843 */ {(13<<2)|2,{104,86,0}}, +/* 40844 */ {(13<<2)|2,{104,86,0}}, +/* 40845 */ {(13<<2)|2,{104,86,0}}, +/* 40846 */ {(13<<2)|2,{104,86,0}}, +/* 40847 */ {(13<<2)|2,{104,86,0}}, +/* 40848 */ {(13<<2)|2,{104,87,0}}, +/* 40849 */ {(13<<2)|2,{104,87,0}}, +/* 40850 */ {(13<<2)|2,{104,87,0}}, +/* 40851 */ {(13<<2)|2,{104,87,0}}, +/* 40852 */ {(13<<2)|2,{104,87,0}}, +/* 40853 */ {(13<<2)|2,{104,87,0}}, +/* 40854 */ {(13<<2)|2,{104,87,0}}, +/* 40855 */ {(13<<2)|2,{104,87,0}}, +/* 40856 */ {(13<<2)|2,{104,89,0}}, +/* 40857 */ {(13<<2)|2,{104,89,0}}, +/* 40858 */ {(13<<2)|2,{104,89,0}}, +/* 40859 */ {(13<<2)|2,{104,89,0}}, +/* 40860 */ {(13<<2)|2,{104,89,0}}, +/* 40861 */ {(13<<2)|2,{104,89,0}}, +/* 40862 */ {(13<<2)|2,{104,89,0}}, +/* 40863 */ {(13<<2)|2,{104,89,0}}, +/* 40864 */ {(13<<2)|2,{104,106,0}}, +/* 40865 */ {(13<<2)|2,{104,106,0}}, +/* 40866 */ {(13<<2)|2,{104,106,0}}, +/* 40867 */ {(13<<2)|2,{104,106,0}}, +/* 40868 */ {(13<<2)|2,{104,106,0}}, +/* 40869 */ {(13<<2)|2,{104,106,0}}, +/* 40870 */ {(13<<2)|2,{104,106,0}}, +/* 40871 */ {(13<<2)|2,{104,106,0}}, +/* 40872 */ {(13<<2)|2,{104,107,0}}, +/* 40873 */ {(13<<2)|2,{104,107,0}}, +/* 40874 */ {(13<<2)|2,{104,107,0}}, +/* 40875 */ {(13<<2)|2,{104,107,0}}, +/* 40876 */ {(13<<2)|2,{104,107,0}}, +/* 40877 */ {(13<<2)|2,{104,107,0}}, +/* 40878 */ {(13<<2)|2,{104,107,0}}, +/* 40879 */ {(13<<2)|2,{104,107,0}}, +/* 40880 */ {(13<<2)|2,{104,113,0}}, +/* 40881 */ {(13<<2)|2,{104,113,0}}, +/* 40882 */ {(13<<2)|2,{104,113,0}}, +/* 40883 */ {(13<<2)|2,{104,113,0}}, +/* 40884 */ {(13<<2)|2,{104,113,0}}, +/* 40885 */ {(13<<2)|2,{104,113,0}}, +/* 40886 */ {(13<<2)|2,{104,113,0}}, +/* 40887 */ {(13<<2)|2,{104,113,0}}, +/* 40888 */ {(13<<2)|2,{104,118,0}}, +/* 40889 */ {(13<<2)|2,{104,118,0}}, +/* 40890 */ {(13<<2)|2,{104,118,0}}, +/* 40891 */ {(13<<2)|2,{104,118,0}}, +/* 40892 */ {(13<<2)|2,{104,118,0}}, +/* 40893 */ {(13<<2)|2,{104,118,0}}, +/* 40894 */ {(13<<2)|2,{104,118,0}}, +/* 40895 */ {(13<<2)|2,{104,118,0}}, +/* 40896 */ {(13<<2)|2,{104,119,0}}, +/* 40897 */ {(13<<2)|2,{104,119,0}}, +/* 40898 */ {(13<<2)|2,{104,119,0}}, +/* 40899 */ {(13<<2)|2,{104,119,0}}, +/* 40900 */ {(13<<2)|2,{104,119,0}}, +/* 40901 */ {(13<<2)|2,{104,119,0}}, +/* 40902 */ {(13<<2)|2,{104,119,0}}, +/* 40903 */ {(13<<2)|2,{104,119,0}}, +/* 40904 */ {(13<<2)|2,{104,120,0}}, +/* 40905 */ {(13<<2)|2,{104,120,0}}, +/* 40906 */ {(13<<2)|2,{104,120,0}}, +/* 40907 */ {(13<<2)|2,{104,120,0}}, +/* 40908 */ {(13<<2)|2,{104,120,0}}, +/* 40909 */ {(13<<2)|2,{104,120,0}}, +/* 40910 */ {(13<<2)|2,{104,120,0}}, +/* 40911 */ {(13<<2)|2,{104,120,0}}, +/* 40912 */ {(13<<2)|2,{104,121,0}}, +/* 40913 */ {(13<<2)|2,{104,121,0}}, +/* 40914 */ {(13<<2)|2,{104,121,0}}, +/* 40915 */ {(13<<2)|2,{104,121,0}}, +/* 40916 */ {(13<<2)|2,{104,121,0}}, +/* 40917 */ {(13<<2)|2,{104,121,0}}, +/* 40918 */ {(13<<2)|2,{104,121,0}}, +/* 40919 */ {(13<<2)|2,{104,121,0}}, +/* 40920 */ {(13<<2)|2,{104,122,0}}, +/* 40921 */ {(13<<2)|2,{104,122,0}}, +/* 40922 */ {(13<<2)|2,{104,122,0}}, +/* 40923 */ {(13<<2)|2,{104,122,0}}, +/* 40924 */ {(13<<2)|2,{104,122,0}}, +/* 40925 */ {(13<<2)|2,{104,122,0}}, +/* 40926 */ {(13<<2)|2,{104,122,0}}, +/* 40927 */ {(13<<2)|2,{104,122,0}}, +/* 40928 */ {(14<<2)|2,{104,38,0}}, +/* 40929 */ {(14<<2)|2,{104,38,0}}, +/* 40930 */ {(14<<2)|2,{104,38,0}}, +/* 40931 */ {(14<<2)|2,{104,38,0}}, +/* 40932 */ {(14<<2)|2,{104,42,0}}, +/* 40933 */ {(14<<2)|2,{104,42,0}}, +/* 40934 */ {(14<<2)|2,{104,42,0}}, +/* 40935 */ {(14<<2)|2,{104,42,0}}, +/* 40936 */ {(14<<2)|2,{104,44,0}}, +/* 40937 */ {(14<<2)|2,{104,44,0}}, +/* 40938 */ {(14<<2)|2,{104,44,0}}, +/* 40939 */ {(14<<2)|2,{104,44,0}}, +/* 40940 */ {(14<<2)|2,{104,59,0}}, +/* 40941 */ {(14<<2)|2,{104,59,0}}, +/* 40942 */ {(14<<2)|2,{104,59,0}}, +/* 40943 */ {(14<<2)|2,{104,59,0}}, +/* 40944 */ {(14<<2)|2,{104,88,0}}, +/* 40945 */ {(14<<2)|2,{104,88,0}}, +/* 40946 */ {(14<<2)|2,{104,88,0}}, +/* 40947 */ {(14<<2)|2,{104,88,0}}, +/* 40948 */ {(14<<2)|2,{104,90,0}}, +/* 40949 */ {(14<<2)|2,{104,90,0}}, +/* 40950 */ {(14<<2)|2,{104,90,0}}, +/* 40951 */ {(14<<2)|2,{104,90,0}}, +/* 40952 */ {(16<<2)|2,{104,33,0}}, +/* 40953 */ {(16<<2)|2,{104,34,0}}, +/* 40954 */ {(16<<2)|2,{104,40,0}}, +/* 40955 */ {(16<<2)|2,{104,41,0}}, +/* 40956 */ {(16<<2)|2,{104,63,0}}, +/* 40957 */ {(6<<2)|1,{104,0,0}}, +/* 40958 */ {(6<<2)|1,{104,0,0}}, +/* 40959 */ {(6<<2)|1,{104,0,0}}, +/* 40960 */ {(16<<2)|3,{108,48,48}}, +/* 40961 */ {(16<<2)|3,{108,48,49}}, +/* 40962 */ {(16<<2)|3,{108,48,50}}, +/* 40963 */ {(16<<2)|3,{108,48,97}}, +/* 40964 */ {(16<<2)|3,{108,48,99}}, +/* 40965 */ {(16<<2)|3,{108,48,101}}, +/* 40966 */ {(16<<2)|3,{108,48,105}}, +/* 40967 */ {(16<<2)|3,{108,48,111}}, +/* 40968 */ {(16<<2)|3,{108,48,115}}, +/* 40969 */ {(16<<2)|3,{108,48,116}}, +/* 40970 */ {(11<<2)|2,{108,48,0}}, +/* 40971 */ {(11<<2)|2,{108,48,0}}, +/* 40972 */ {(11<<2)|2,{108,48,0}}, +/* 40973 */ {(11<<2)|2,{108,48,0}}, +/* 40974 */ {(11<<2)|2,{108,48,0}}, +/* 40975 */ {(11<<2)|2,{108,48,0}}, +/* 40976 */ {(11<<2)|2,{108,48,0}}, +/* 40977 */ {(11<<2)|2,{108,48,0}}, +/* 40978 */ {(11<<2)|2,{108,48,0}}, +/* 40979 */ {(11<<2)|2,{108,48,0}}, +/* 40980 */ {(11<<2)|2,{108,48,0}}, +/* 40981 */ {(11<<2)|2,{108,48,0}}, +/* 40982 */ {(11<<2)|2,{108,48,0}}, +/* 40983 */ {(11<<2)|2,{108,48,0}}, +/* 40984 */ {(11<<2)|2,{108,48,0}}, +/* 40985 */ {(11<<2)|2,{108,48,0}}, +/* 40986 */ {(11<<2)|2,{108,48,0}}, +/* 40987 */ {(11<<2)|2,{108,48,0}}, +/* 40988 */ {(11<<2)|2,{108,48,0}}, +/* 40989 */ {(11<<2)|2,{108,48,0}}, +/* 40990 */ {(11<<2)|2,{108,48,0}}, +/* 40991 */ {(11<<2)|2,{108,48,0}}, +/* 40992 */ {(16<<2)|3,{108,49,48}}, +/* 40993 */ {(16<<2)|3,{108,49,49}}, +/* 40994 */ {(16<<2)|3,{108,49,50}}, +/* 40995 */ {(16<<2)|3,{108,49,97}}, +/* 40996 */ {(16<<2)|3,{108,49,99}}, +/* 40997 */ {(16<<2)|3,{108,49,101}}, +/* 40998 */ {(16<<2)|3,{108,49,105}}, +/* 40999 */ {(16<<2)|3,{108,49,111}}, +/* 41000 */ {(16<<2)|3,{108,49,115}}, +/* 41001 */ {(16<<2)|3,{108,49,116}}, +/* 41002 */ {(11<<2)|2,{108,49,0}}, +/* 41003 */ {(11<<2)|2,{108,49,0}}, +/* 41004 */ {(11<<2)|2,{108,49,0}}, +/* 41005 */ {(11<<2)|2,{108,49,0}}, +/* 41006 */ {(11<<2)|2,{108,49,0}}, +/* 41007 */ {(11<<2)|2,{108,49,0}}, +/* 41008 */ {(11<<2)|2,{108,49,0}}, +/* 41009 */ {(11<<2)|2,{108,49,0}}, +/* 41010 */ {(11<<2)|2,{108,49,0}}, +/* 41011 */ {(11<<2)|2,{108,49,0}}, +/* 41012 */ {(11<<2)|2,{108,49,0}}, +/* 41013 */ {(11<<2)|2,{108,49,0}}, +/* 41014 */ {(11<<2)|2,{108,49,0}}, +/* 41015 */ {(11<<2)|2,{108,49,0}}, +/* 41016 */ {(11<<2)|2,{108,49,0}}, +/* 41017 */ {(11<<2)|2,{108,49,0}}, +/* 41018 */ {(11<<2)|2,{108,49,0}}, +/* 41019 */ {(11<<2)|2,{108,49,0}}, +/* 41020 */ {(11<<2)|2,{108,49,0}}, +/* 41021 */ {(11<<2)|2,{108,49,0}}, +/* 41022 */ {(11<<2)|2,{108,49,0}}, +/* 41023 */ {(11<<2)|2,{108,49,0}}, +/* 41024 */ {(16<<2)|3,{108,50,48}}, +/* 41025 */ {(16<<2)|3,{108,50,49}}, +/* 41026 */ {(16<<2)|3,{108,50,50}}, +/* 41027 */ {(16<<2)|3,{108,50,97}}, +/* 41028 */ {(16<<2)|3,{108,50,99}}, +/* 41029 */ {(16<<2)|3,{108,50,101}}, +/* 41030 */ {(16<<2)|3,{108,50,105}}, +/* 41031 */ {(16<<2)|3,{108,50,111}}, +/* 41032 */ {(16<<2)|3,{108,50,115}}, +/* 41033 */ {(16<<2)|3,{108,50,116}}, +/* 41034 */ {(11<<2)|2,{108,50,0}}, +/* 41035 */ {(11<<2)|2,{108,50,0}}, +/* 41036 */ {(11<<2)|2,{108,50,0}}, +/* 41037 */ {(11<<2)|2,{108,50,0}}, +/* 41038 */ {(11<<2)|2,{108,50,0}}, +/* 41039 */ {(11<<2)|2,{108,50,0}}, +/* 41040 */ {(11<<2)|2,{108,50,0}}, +/* 41041 */ {(11<<2)|2,{108,50,0}}, +/* 41042 */ {(11<<2)|2,{108,50,0}}, +/* 41043 */ {(11<<2)|2,{108,50,0}}, +/* 41044 */ {(11<<2)|2,{108,50,0}}, +/* 41045 */ {(11<<2)|2,{108,50,0}}, +/* 41046 */ {(11<<2)|2,{108,50,0}}, +/* 41047 */ {(11<<2)|2,{108,50,0}}, +/* 41048 */ {(11<<2)|2,{108,50,0}}, +/* 41049 */ {(11<<2)|2,{108,50,0}}, +/* 41050 */ {(11<<2)|2,{108,50,0}}, +/* 41051 */ {(11<<2)|2,{108,50,0}}, +/* 41052 */ {(11<<2)|2,{108,50,0}}, +/* 41053 */ {(11<<2)|2,{108,50,0}}, +/* 41054 */ {(11<<2)|2,{108,50,0}}, +/* 41055 */ {(11<<2)|2,{108,50,0}}, +/* 41056 */ {(16<<2)|3,{108,97,48}}, +/* 41057 */ {(16<<2)|3,{108,97,49}}, +/* 41058 */ {(16<<2)|3,{108,97,50}}, +/* 41059 */ {(16<<2)|3,{108,97,97}}, +/* 41060 */ {(16<<2)|3,{108,97,99}}, +/* 41061 */ {(16<<2)|3,{108,97,101}}, +/* 41062 */ {(16<<2)|3,{108,97,105}}, +/* 41063 */ {(16<<2)|3,{108,97,111}}, +/* 41064 */ {(16<<2)|3,{108,97,115}}, +/* 41065 */ {(16<<2)|3,{108,97,116}}, +/* 41066 */ {(11<<2)|2,{108,97,0}}, +/* 41067 */ {(11<<2)|2,{108,97,0}}, +/* 41068 */ {(11<<2)|2,{108,97,0}}, +/* 41069 */ {(11<<2)|2,{108,97,0}}, +/* 41070 */ {(11<<2)|2,{108,97,0}}, +/* 41071 */ {(11<<2)|2,{108,97,0}}, +/* 41072 */ {(11<<2)|2,{108,97,0}}, +/* 41073 */ {(11<<2)|2,{108,97,0}}, +/* 41074 */ {(11<<2)|2,{108,97,0}}, +/* 41075 */ {(11<<2)|2,{108,97,0}}, +/* 41076 */ {(11<<2)|2,{108,97,0}}, +/* 41077 */ {(11<<2)|2,{108,97,0}}, +/* 41078 */ {(11<<2)|2,{108,97,0}}, +/* 41079 */ {(11<<2)|2,{108,97,0}}, +/* 41080 */ {(11<<2)|2,{108,97,0}}, +/* 41081 */ {(11<<2)|2,{108,97,0}}, +/* 41082 */ {(11<<2)|2,{108,97,0}}, +/* 41083 */ {(11<<2)|2,{108,97,0}}, +/* 41084 */ {(11<<2)|2,{108,97,0}}, +/* 41085 */ {(11<<2)|2,{108,97,0}}, +/* 41086 */ {(11<<2)|2,{108,97,0}}, +/* 41087 */ {(11<<2)|2,{108,97,0}}, +/* 41088 */ {(16<<2)|3,{108,99,48}}, +/* 41089 */ {(16<<2)|3,{108,99,49}}, +/* 41090 */ {(16<<2)|3,{108,99,50}}, +/* 41091 */ {(16<<2)|3,{108,99,97}}, +/* 41092 */ {(16<<2)|3,{108,99,99}}, +/* 41093 */ {(16<<2)|3,{108,99,101}}, +/* 41094 */ {(16<<2)|3,{108,99,105}}, +/* 41095 */ {(16<<2)|3,{108,99,111}}, +/* 41096 */ {(16<<2)|3,{108,99,115}}, +/* 41097 */ {(16<<2)|3,{108,99,116}}, +/* 41098 */ {(11<<2)|2,{108,99,0}}, +/* 41099 */ {(11<<2)|2,{108,99,0}}, +/* 41100 */ {(11<<2)|2,{108,99,0}}, +/* 41101 */ {(11<<2)|2,{108,99,0}}, +/* 41102 */ {(11<<2)|2,{108,99,0}}, +/* 41103 */ {(11<<2)|2,{108,99,0}}, +/* 41104 */ {(11<<2)|2,{108,99,0}}, +/* 41105 */ {(11<<2)|2,{108,99,0}}, +/* 41106 */ {(11<<2)|2,{108,99,0}}, +/* 41107 */ {(11<<2)|2,{108,99,0}}, +/* 41108 */ {(11<<2)|2,{108,99,0}}, +/* 41109 */ {(11<<2)|2,{108,99,0}}, +/* 41110 */ {(11<<2)|2,{108,99,0}}, +/* 41111 */ {(11<<2)|2,{108,99,0}}, +/* 41112 */ {(11<<2)|2,{108,99,0}}, +/* 41113 */ {(11<<2)|2,{108,99,0}}, +/* 41114 */ {(11<<2)|2,{108,99,0}}, +/* 41115 */ {(11<<2)|2,{108,99,0}}, +/* 41116 */ {(11<<2)|2,{108,99,0}}, +/* 41117 */ {(11<<2)|2,{108,99,0}}, +/* 41118 */ {(11<<2)|2,{108,99,0}}, +/* 41119 */ {(11<<2)|2,{108,99,0}}, +/* 41120 */ {(16<<2)|3,{108,101,48}}, +/* 41121 */ {(16<<2)|3,{108,101,49}}, +/* 41122 */ {(16<<2)|3,{108,101,50}}, +/* 41123 */ {(16<<2)|3,{108,101,97}}, +/* 41124 */ {(16<<2)|3,{108,101,99}}, +/* 41125 */ {(16<<2)|3,{108,101,101}}, +/* 41126 */ {(16<<2)|3,{108,101,105}}, +/* 41127 */ {(16<<2)|3,{108,101,111}}, +/* 41128 */ {(16<<2)|3,{108,101,115}}, +/* 41129 */ {(16<<2)|3,{108,101,116}}, +/* 41130 */ {(11<<2)|2,{108,101,0}}, +/* 41131 */ {(11<<2)|2,{108,101,0}}, +/* 41132 */ {(11<<2)|2,{108,101,0}}, +/* 41133 */ {(11<<2)|2,{108,101,0}}, +/* 41134 */ {(11<<2)|2,{108,101,0}}, +/* 41135 */ {(11<<2)|2,{108,101,0}}, +/* 41136 */ {(11<<2)|2,{108,101,0}}, +/* 41137 */ {(11<<2)|2,{108,101,0}}, +/* 41138 */ {(11<<2)|2,{108,101,0}}, +/* 41139 */ {(11<<2)|2,{108,101,0}}, +/* 41140 */ {(11<<2)|2,{108,101,0}}, +/* 41141 */ {(11<<2)|2,{108,101,0}}, +/* 41142 */ {(11<<2)|2,{108,101,0}}, +/* 41143 */ {(11<<2)|2,{108,101,0}}, +/* 41144 */ {(11<<2)|2,{108,101,0}}, +/* 41145 */ {(11<<2)|2,{108,101,0}}, +/* 41146 */ {(11<<2)|2,{108,101,0}}, +/* 41147 */ {(11<<2)|2,{108,101,0}}, +/* 41148 */ {(11<<2)|2,{108,101,0}}, +/* 41149 */ {(11<<2)|2,{108,101,0}}, +/* 41150 */ {(11<<2)|2,{108,101,0}}, +/* 41151 */ {(11<<2)|2,{108,101,0}}, +/* 41152 */ {(16<<2)|3,{108,105,48}}, +/* 41153 */ {(16<<2)|3,{108,105,49}}, +/* 41154 */ {(16<<2)|3,{108,105,50}}, +/* 41155 */ {(16<<2)|3,{108,105,97}}, +/* 41156 */ {(16<<2)|3,{108,105,99}}, +/* 41157 */ {(16<<2)|3,{108,105,101}}, +/* 41158 */ {(16<<2)|3,{108,105,105}}, +/* 41159 */ {(16<<2)|3,{108,105,111}}, +/* 41160 */ {(16<<2)|3,{108,105,115}}, +/* 41161 */ {(16<<2)|3,{108,105,116}}, +/* 41162 */ {(11<<2)|2,{108,105,0}}, +/* 41163 */ {(11<<2)|2,{108,105,0}}, +/* 41164 */ {(11<<2)|2,{108,105,0}}, +/* 41165 */ {(11<<2)|2,{108,105,0}}, +/* 41166 */ {(11<<2)|2,{108,105,0}}, +/* 41167 */ {(11<<2)|2,{108,105,0}}, +/* 41168 */ {(11<<2)|2,{108,105,0}}, +/* 41169 */ {(11<<2)|2,{108,105,0}}, +/* 41170 */ {(11<<2)|2,{108,105,0}}, +/* 41171 */ {(11<<2)|2,{108,105,0}}, +/* 41172 */ {(11<<2)|2,{108,105,0}}, +/* 41173 */ {(11<<2)|2,{108,105,0}}, +/* 41174 */ {(11<<2)|2,{108,105,0}}, +/* 41175 */ {(11<<2)|2,{108,105,0}}, +/* 41176 */ {(11<<2)|2,{108,105,0}}, +/* 41177 */ {(11<<2)|2,{108,105,0}}, +/* 41178 */ {(11<<2)|2,{108,105,0}}, +/* 41179 */ {(11<<2)|2,{108,105,0}}, +/* 41180 */ {(11<<2)|2,{108,105,0}}, +/* 41181 */ {(11<<2)|2,{108,105,0}}, +/* 41182 */ {(11<<2)|2,{108,105,0}}, +/* 41183 */ {(11<<2)|2,{108,105,0}}, +/* 41184 */ {(16<<2)|3,{108,111,48}}, +/* 41185 */ {(16<<2)|3,{108,111,49}}, +/* 41186 */ {(16<<2)|3,{108,111,50}}, +/* 41187 */ {(16<<2)|3,{108,111,97}}, +/* 41188 */ {(16<<2)|3,{108,111,99}}, +/* 41189 */ {(16<<2)|3,{108,111,101}}, +/* 41190 */ {(16<<2)|3,{108,111,105}}, +/* 41191 */ {(16<<2)|3,{108,111,111}}, +/* 41192 */ {(16<<2)|3,{108,111,115}}, +/* 41193 */ {(16<<2)|3,{108,111,116}}, +/* 41194 */ {(11<<2)|2,{108,111,0}}, +/* 41195 */ {(11<<2)|2,{108,111,0}}, +/* 41196 */ {(11<<2)|2,{108,111,0}}, +/* 41197 */ {(11<<2)|2,{108,111,0}}, +/* 41198 */ {(11<<2)|2,{108,111,0}}, +/* 41199 */ {(11<<2)|2,{108,111,0}}, +/* 41200 */ {(11<<2)|2,{108,111,0}}, +/* 41201 */ {(11<<2)|2,{108,111,0}}, +/* 41202 */ {(11<<2)|2,{108,111,0}}, +/* 41203 */ {(11<<2)|2,{108,111,0}}, +/* 41204 */ {(11<<2)|2,{108,111,0}}, +/* 41205 */ {(11<<2)|2,{108,111,0}}, +/* 41206 */ {(11<<2)|2,{108,111,0}}, +/* 41207 */ {(11<<2)|2,{108,111,0}}, +/* 41208 */ {(11<<2)|2,{108,111,0}}, +/* 41209 */ {(11<<2)|2,{108,111,0}}, +/* 41210 */ {(11<<2)|2,{108,111,0}}, +/* 41211 */ {(11<<2)|2,{108,111,0}}, +/* 41212 */ {(11<<2)|2,{108,111,0}}, +/* 41213 */ {(11<<2)|2,{108,111,0}}, +/* 41214 */ {(11<<2)|2,{108,111,0}}, +/* 41215 */ {(11<<2)|2,{108,111,0}}, +/* 41216 */ {(16<<2)|3,{108,115,48}}, +/* 41217 */ {(16<<2)|3,{108,115,49}}, +/* 41218 */ {(16<<2)|3,{108,115,50}}, +/* 41219 */ {(16<<2)|3,{108,115,97}}, +/* 41220 */ {(16<<2)|3,{108,115,99}}, +/* 41221 */ {(16<<2)|3,{108,115,101}}, +/* 41222 */ {(16<<2)|3,{108,115,105}}, +/* 41223 */ {(16<<2)|3,{108,115,111}}, +/* 41224 */ {(16<<2)|3,{108,115,115}}, +/* 41225 */ {(16<<2)|3,{108,115,116}}, +/* 41226 */ {(11<<2)|2,{108,115,0}}, +/* 41227 */ {(11<<2)|2,{108,115,0}}, +/* 41228 */ {(11<<2)|2,{108,115,0}}, +/* 41229 */ {(11<<2)|2,{108,115,0}}, +/* 41230 */ {(11<<2)|2,{108,115,0}}, +/* 41231 */ {(11<<2)|2,{108,115,0}}, +/* 41232 */ {(11<<2)|2,{108,115,0}}, +/* 41233 */ {(11<<2)|2,{108,115,0}}, +/* 41234 */ {(11<<2)|2,{108,115,0}}, +/* 41235 */ {(11<<2)|2,{108,115,0}}, +/* 41236 */ {(11<<2)|2,{108,115,0}}, +/* 41237 */ {(11<<2)|2,{108,115,0}}, +/* 41238 */ {(11<<2)|2,{108,115,0}}, +/* 41239 */ {(11<<2)|2,{108,115,0}}, +/* 41240 */ {(11<<2)|2,{108,115,0}}, +/* 41241 */ {(11<<2)|2,{108,115,0}}, +/* 41242 */ {(11<<2)|2,{108,115,0}}, +/* 41243 */ {(11<<2)|2,{108,115,0}}, +/* 41244 */ {(11<<2)|2,{108,115,0}}, +/* 41245 */ {(11<<2)|2,{108,115,0}}, +/* 41246 */ {(11<<2)|2,{108,115,0}}, +/* 41247 */ {(11<<2)|2,{108,115,0}}, +/* 41248 */ {(16<<2)|3,{108,116,48}}, +/* 41249 */ {(16<<2)|3,{108,116,49}}, +/* 41250 */ {(16<<2)|3,{108,116,50}}, +/* 41251 */ {(16<<2)|3,{108,116,97}}, +/* 41252 */ {(16<<2)|3,{108,116,99}}, +/* 41253 */ {(16<<2)|3,{108,116,101}}, +/* 41254 */ {(16<<2)|3,{108,116,105}}, +/* 41255 */ {(16<<2)|3,{108,116,111}}, +/* 41256 */ {(16<<2)|3,{108,116,115}}, +/* 41257 */ {(16<<2)|3,{108,116,116}}, +/* 41258 */ {(11<<2)|2,{108,116,0}}, +/* 41259 */ {(11<<2)|2,{108,116,0}}, +/* 41260 */ {(11<<2)|2,{108,116,0}}, +/* 41261 */ {(11<<2)|2,{108,116,0}}, +/* 41262 */ {(11<<2)|2,{108,116,0}}, +/* 41263 */ {(11<<2)|2,{108,116,0}}, +/* 41264 */ {(11<<2)|2,{108,116,0}}, +/* 41265 */ {(11<<2)|2,{108,116,0}}, +/* 41266 */ {(11<<2)|2,{108,116,0}}, +/* 41267 */ {(11<<2)|2,{108,116,0}}, +/* 41268 */ {(11<<2)|2,{108,116,0}}, +/* 41269 */ {(11<<2)|2,{108,116,0}}, +/* 41270 */ {(11<<2)|2,{108,116,0}}, +/* 41271 */ {(11<<2)|2,{108,116,0}}, +/* 41272 */ {(11<<2)|2,{108,116,0}}, +/* 41273 */ {(11<<2)|2,{108,116,0}}, +/* 41274 */ {(11<<2)|2,{108,116,0}}, +/* 41275 */ {(11<<2)|2,{108,116,0}}, +/* 41276 */ {(11<<2)|2,{108,116,0}}, +/* 41277 */ {(11<<2)|2,{108,116,0}}, +/* 41278 */ {(11<<2)|2,{108,116,0}}, +/* 41279 */ {(11<<2)|2,{108,116,0}}, +/* 41280 */ {(12<<2)|2,{108,32,0}}, +/* 41281 */ {(12<<2)|2,{108,32,0}}, +/* 41282 */ {(12<<2)|2,{108,32,0}}, +/* 41283 */ {(12<<2)|2,{108,32,0}}, +/* 41284 */ {(12<<2)|2,{108,32,0}}, +/* 41285 */ {(12<<2)|2,{108,32,0}}, +/* 41286 */ {(12<<2)|2,{108,32,0}}, +/* 41287 */ {(12<<2)|2,{108,32,0}}, +/* 41288 */ {(12<<2)|2,{108,32,0}}, +/* 41289 */ {(12<<2)|2,{108,32,0}}, +/* 41290 */ {(12<<2)|2,{108,32,0}}, +/* 41291 */ {(12<<2)|2,{108,32,0}}, +/* 41292 */ {(12<<2)|2,{108,32,0}}, +/* 41293 */ {(12<<2)|2,{108,32,0}}, +/* 41294 */ {(12<<2)|2,{108,32,0}}, +/* 41295 */ {(12<<2)|2,{108,32,0}}, +/* 41296 */ {(12<<2)|2,{108,37,0}}, +/* 41297 */ {(12<<2)|2,{108,37,0}}, +/* 41298 */ {(12<<2)|2,{108,37,0}}, +/* 41299 */ {(12<<2)|2,{108,37,0}}, +/* 41300 */ {(12<<2)|2,{108,37,0}}, +/* 41301 */ {(12<<2)|2,{108,37,0}}, +/* 41302 */ {(12<<2)|2,{108,37,0}}, +/* 41303 */ {(12<<2)|2,{108,37,0}}, +/* 41304 */ {(12<<2)|2,{108,37,0}}, +/* 41305 */ {(12<<2)|2,{108,37,0}}, +/* 41306 */ {(12<<2)|2,{108,37,0}}, +/* 41307 */ {(12<<2)|2,{108,37,0}}, +/* 41308 */ {(12<<2)|2,{108,37,0}}, +/* 41309 */ {(12<<2)|2,{108,37,0}}, +/* 41310 */ {(12<<2)|2,{108,37,0}}, +/* 41311 */ {(12<<2)|2,{108,37,0}}, +/* 41312 */ {(12<<2)|2,{108,45,0}}, +/* 41313 */ {(12<<2)|2,{108,45,0}}, +/* 41314 */ {(12<<2)|2,{108,45,0}}, +/* 41315 */ {(12<<2)|2,{108,45,0}}, +/* 41316 */ {(12<<2)|2,{108,45,0}}, +/* 41317 */ {(12<<2)|2,{108,45,0}}, +/* 41318 */ {(12<<2)|2,{108,45,0}}, +/* 41319 */ {(12<<2)|2,{108,45,0}}, +/* 41320 */ {(12<<2)|2,{108,45,0}}, +/* 41321 */ {(12<<2)|2,{108,45,0}}, +/* 41322 */ {(12<<2)|2,{108,45,0}}, +/* 41323 */ {(12<<2)|2,{108,45,0}}, +/* 41324 */ {(12<<2)|2,{108,45,0}}, +/* 41325 */ {(12<<2)|2,{108,45,0}}, +/* 41326 */ {(12<<2)|2,{108,45,0}}, +/* 41327 */ {(12<<2)|2,{108,45,0}}, +/* 41328 */ {(12<<2)|2,{108,46,0}}, +/* 41329 */ {(12<<2)|2,{108,46,0}}, +/* 41330 */ {(12<<2)|2,{108,46,0}}, +/* 41331 */ {(12<<2)|2,{108,46,0}}, +/* 41332 */ {(12<<2)|2,{108,46,0}}, +/* 41333 */ {(12<<2)|2,{108,46,0}}, +/* 41334 */ {(12<<2)|2,{108,46,0}}, +/* 41335 */ {(12<<2)|2,{108,46,0}}, +/* 41336 */ {(12<<2)|2,{108,46,0}}, +/* 41337 */ {(12<<2)|2,{108,46,0}}, +/* 41338 */ {(12<<2)|2,{108,46,0}}, +/* 41339 */ {(12<<2)|2,{108,46,0}}, +/* 41340 */ {(12<<2)|2,{108,46,0}}, +/* 41341 */ {(12<<2)|2,{108,46,0}}, +/* 41342 */ {(12<<2)|2,{108,46,0}}, +/* 41343 */ {(12<<2)|2,{108,46,0}}, +/* 41344 */ {(12<<2)|2,{108,47,0}}, +/* 41345 */ {(12<<2)|2,{108,47,0}}, +/* 41346 */ {(12<<2)|2,{108,47,0}}, +/* 41347 */ {(12<<2)|2,{108,47,0}}, +/* 41348 */ {(12<<2)|2,{108,47,0}}, +/* 41349 */ {(12<<2)|2,{108,47,0}}, +/* 41350 */ {(12<<2)|2,{108,47,0}}, +/* 41351 */ {(12<<2)|2,{108,47,0}}, +/* 41352 */ {(12<<2)|2,{108,47,0}}, +/* 41353 */ {(12<<2)|2,{108,47,0}}, +/* 41354 */ {(12<<2)|2,{108,47,0}}, +/* 41355 */ {(12<<2)|2,{108,47,0}}, +/* 41356 */ {(12<<2)|2,{108,47,0}}, +/* 41357 */ {(12<<2)|2,{108,47,0}}, +/* 41358 */ {(12<<2)|2,{108,47,0}}, +/* 41359 */ {(12<<2)|2,{108,47,0}}, +/* 41360 */ {(12<<2)|2,{108,51,0}}, +/* 41361 */ {(12<<2)|2,{108,51,0}}, +/* 41362 */ {(12<<2)|2,{108,51,0}}, +/* 41363 */ {(12<<2)|2,{108,51,0}}, +/* 41364 */ {(12<<2)|2,{108,51,0}}, +/* 41365 */ {(12<<2)|2,{108,51,0}}, +/* 41366 */ {(12<<2)|2,{108,51,0}}, +/* 41367 */ {(12<<2)|2,{108,51,0}}, +/* 41368 */ {(12<<2)|2,{108,51,0}}, +/* 41369 */ {(12<<2)|2,{108,51,0}}, +/* 41370 */ {(12<<2)|2,{108,51,0}}, +/* 41371 */ {(12<<2)|2,{108,51,0}}, +/* 41372 */ {(12<<2)|2,{108,51,0}}, +/* 41373 */ {(12<<2)|2,{108,51,0}}, +/* 41374 */ {(12<<2)|2,{108,51,0}}, +/* 41375 */ {(12<<2)|2,{108,51,0}}, +/* 41376 */ {(12<<2)|2,{108,52,0}}, +/* 41377 */ {(12<<2)|2,{108,52,0}}, +/* 41378 */ {(12<<2)|2,{108,52,0}}, +/* 41379 */ {(12<<2)|2,{108,52,0}}, +/* 41380 */ {(12<<2)|2,{108,52,0}}, +/* 41381 */ {(12<<2)|2,{108,52,0}}, +/* 41382 */ {(12<<2)|2,{108,52,0}}, +/* 41383 */ {(12<<2)|2,{108,52,0}}, +/* 41384 */ {(12<<2)|2,{108,52,0}}, +/* 41385 */ {(12<<2)|2,{108,52,0}}, +/* 41386 */ {(12<<2)|2,{108,52,0}}, +/* 41387 */ {(12<<2)|2,{108,52,0}}, +/* 41388 */ {(12<<2)|2,{108,52,0}}, +/* 41389 */ {(12<<2)|2,{108,52,0}}, +/* 41390 */ {(12<<2)|2,{108,52,0}}, +/* 41391 */ {(12<<2)|2,{108,52,0}}, +/* 41392 */ {(12<<2)|2,{108,53,0}}, +/* 41393 */ {(12<<2)|2,{108,53,0}}, +/* 41394 */ {(12<<2)|2,{108,53,0}}, +/* 41395 */ {(12<<2)|2,{108,53,0}}, +/* 41396 */ {(12<<2)|2,{108,53,0}}, +/* 41397 */ {(12<<2)|2,{108,53,0}}, +/* 41398 */ {(12<<2)|2,{108,53,0}}, +/* 41399 */ {(12<<2)|2,{108,53,0}}, +/* 41400 */ {(12<<2)|2,{108,53,0}}, +/* 41401 */ {(12<<2)|2,{108,53,0}}, +/* 41402 */ {(12<<2)|2,{108,53,0}}, +/* 41403 */ {(12<<2)|2,{108,53,0}}, +/* 41404 */ {(12<<2)|2,{108,53,0}}, +/* 41405 */ {(12<<2)|2,{108,53,0}}, +/* 41406 */ {(12<<2)|2,{108,53,0}}, +/* 41407 */ {(12<<2)|2,{108,53,0}}, +/* 41408 */ {(12<<2)|2,{108,54,0}}, +/* 41409 */ {(12<<2)|2,{108,54,0}}, +/* 41410 */ {(12<<2)|2,{108,54,0}}, +/* 41411 */ {(12<<2)|2,{108,54,0}}, +/* 41412 */ {(12<<2)|2,{108,54,0}}, +/* 41413 */ {(12<<2)|2,{108,54,0}}, +/* 41414 */ {(12<<2)|2,{108,54,0}}, +/* 41415 */ {(12<<2)|2,{108,54,0}}, +/* 41416 */ {(12<<2)|2,{108,54,0}}, +/* 41417 */ {(12<<2)|2,{108,54,0}}, +/* 41418 */ {(12<<2)|2,{108,54,0}}, +/* 41419 */ {(12<<2)|2,{108,54,0}}, +/* 41420 */ {(12<<2)|2,{108,54,0}}, +/* 41421 */ {(12<<2)|2,{108,54,0}}, +/* 41422 */ {(12<<2)|2,{108,54,0}}, +/* 41423 */ {(12<<2)|2,{108,54,0}}, +/* 41424 */ {(12<<2)|2,{108,55,0}}, +/* 41425 */ {(12<<2)|2,{108,55,0}}, +/* 41426 */ {(12<<2)|2,{108,55,0}}, +/* 41427 */ {(12<<2)|2,{108,55,0}}, +/* 41428 */ {(12<<2)|2,{108,55,0}}, +/* 41429 */ {(12<<2)|2,{108,55,0}}, +/* 41430 */ {(12<<2)|2,{108,55,0}}, +/* 41431 */ {(12<<2)|2,{108,55,0}}, +/* 41432 */ {(12<<2)|2,{108,55,0}}, +/* 41433 */ {(12<<2)|2,{108,55,0}}, +/* 41434 */ {(12<<2)|2,{108,55,0}}, +/* 41435 */ {(12<<2)|2,{108,55,0}}, +/* 41436 */ {(12<<2)|2,{108,55,0}}, +/* 41437 */ {(12<<2)|2,{108,55,0}}, +/* 41438 */ {(12<<2)|2,{108,55,0}}, +/* 41439 */ {(12<<2)|2,{108,55,0}}, +/* 41440 */ {(12<<2)|2,{108,56,0}}, +/* 41441 */ {(12<<2)|2,{108,56,0}}, +/* 41442 */ {(12<<2)|2,{108,56,0}}, +/* 41443 */ {(12<<2)|2,{108,56,0}}, +/* 41444 */ {(12<<2)|2,{108,56,0}}, +/* 41445 */ {(12<<2)|2,{108,56,0}}, +/* 41446 */ {(12<<2)|2,{108,56,0}}, +/* 41447 */ {(12<<2)|2,{108,56,0}}, +/* 41448 */ {(12<<2)|2,{108,56,0}}, +/* 41449 */ {(12<<2)|2,{108,56,0}}, +/* 41450 */ {(12<<2)|2,{108,56,0}}, +/* 41451 */ {(12<<2)|2,{108,56,0}}, +/* 41452 */ {(12<<2)|2,{108,56,0}}, +/* 41453 */ {(12<<2)|2,{108,56,0}}, +/* 41454 */ {(12<<2)|2,{108,56,0}}, +/* 41455 */ {(12<<2)|2,{108,56,0}}, +/* 41456 */ {(12<<2)|2,{108,57,0}}, +/* 41457 */ {(12<<2)|2,{108,57,0}}, +/* 41458 */ {(12<<2)|2,{108,57,0}}, +/* 41459 */ {(12<<2)|2,{108,57,0}}, +/* 41460 */ {(12<<2)|2,{108,57,0}}, +/* 41461 */ {(12<<2)|2,{108,57,0}}, +/* 41462 */ {(12<<2)|2,{108,57,0}}, +/* 41463 */ {(12<<2)|2,{108,57,0}}, +/* 41464 */ {(12<<2)|2,{108,57,0}}, +/* 41465 */ {(12<<2)|2,{108,57,0}}, +/* 41466 */ {(12<<2)|2,{108,57,0}}, +/* 41467 */ {(12<<2)|2,{108,57,0}}, +/* 41468 */ {(12<<2)|2,{108,57,0}}, +/* 41469 */ {(12<<2)|2,{108,57,0}}, +/* 41470 */ {(12<<2)|2,{108,57,0}}, +/* 41471 */ {(12<<2)|2,{108,57,0}}, +/* 41472 */ {(12<<2)|2,{108,61,0}}, +/* 41473 */ {(12<<2)|2,{108,61,0}}, +/* 41474 */ {(12<<2)|2,{108,61,0}}, +/* 41475 */ {(12<<2)|2,{108,61,0}}, +/* 41476 */ {(12<<2)|2,{108,61,0}}, +/* 41477 */ {(12<<2)|2,{108,61,0}}, +/* 41478 */ {(12<<2)|2,{108,61,0}}, +/* 41479 */ {(12<<2)|2,{108,61,0}}, +/* 41480 */ {(12<<2)|2,{108,61,0}}, +/* 41481 */ {(12<<2)|2,{108,61,0}}, +/* 41482 */ {(12<<2)|2,{108,61,0}}, +/* 41483 */ {(12<<2)|2,{108,61,0}}, +/* 41484 */ {(12<<2)|2,{108,61,0}}, +/* 41485 */ {(12<<2)|2,{108,61,0}}, +/* 41486 */ {(12<<2)|2,{108,61,0}}, +/* 41487 */ {(12<<2)|2,{108,61,0}}, +/* 41488 */ {(12<<2)|2,{108,65,0}}, +/* 41489 */ {(12<<2)|2,{108,65,0}}, +/* 41490 */ {(12<<2)|2,{108,65,0}}, +/* 41491 */ {(12<<2)|2,{108,65,0}}, +/* 41492 */ {(12<<2)|2,{108,65,0}}, +/* 41493 */ {(12<<2)|2,{108,65,0}}, +/* 41494 */ {(12<<2)|2,{108,65,0}}, +/* 41495 */ {(12<<2)|2,{108,65,0}}, +/* 41496 */ {(12<<2)|2,{108,65,0}}, +/* 41497 */ {(12<<2)|2,{108,65,0}}, +/* 41498 */ {(12<<2)|2,{108,65,0}}, +/* 41499 */ {(12<<2)|2,{108,65,0}}, +/* 41500 */ {(12<<2)|2,{108,65,0}}, +/* 41501 */ {(12<<2)|2,{108,65,0}}, +/* 41502 */ {(12<<2)|2,{108,65,0}}, +/* 41503 */ {(12<<2)|2,{108,65,0}}, +/* 41504 */ {(12<<2)|2,{108,95,0}}, +/* 41505 */ {(12<<2)|2,{108,95,0}}, +/* 41506 */ {(12<<2)|2,{108,95,0}}, +/* 41507 */ {(12<<2)|2,{108,95,0}}, +/* 41508 */ {(12<<2)|2,{108,95,0}}, +/* 41509 */ {(12<<2)|2,{108,95,0}}, +/* 41510 */ {(12<<2)|2,{108,95,0}}, +/* 41511 */ {(12<<2)|2,{108,95,0}}, +/* 41512 */ {(12<<2)|2,{108,95,0}}, +/* 41513 */ {(12<<2)|2,{108,95,0}}, +/* 41514 */ {(12<<2)|2,{108,95,0}}, +/* 41515 */ {(12<<2)|2,{108,95,0}}, +/* 41516 */ {(12<<2)|2,{108,95,0}}, +/* 41517 */ {(12<<2)|2,{108,95,0}}, +/* 41518 */ {(12<<2)|2,{108,95,0}}, +/* 41519 */ {(12<<2)|2,{108,95,0}}, +/* 41520 */ {(12<<2)|2,{108,98,0}}, +/* 41521 */ {(12<<2)|2,{108,98,0}}, +/* 41522 */ {(12<<2)|2,{108,98,0}}, +/* 41523 */ {(12<<2)|2,{108,98,0}}, +/* 41524 */ {(12<<2)|2,{108,98,0}}, +/* 41525 */ {(12<<2)|2,{108,98,0}}, +/* 41526 */ {(12<<2)|2,{108,98,0}}, +/* 41527 */ {(12<<2)|2,{108,98,0}}, +/* 41528 */ {(12<<2)|2,{108,98,0}}, +/* 41529 */ {(12<<2)|2,{108,98,0}}, +/* 41530 */ {(12<<2)|2,{108,98,0}}, +/* 41531 */ {(12<<2)|2,{108,98,0}}, +/* 41532 */ {(12<<2)|2,{108,98,0}}, +/* 41533 */ {(12<<2)|2,{108,98,0}}, +/* 41534 */ {(12<<2)|2,{108,98,0}}, +/* 41535 */ {(12<<2)|2,{108,98,0}}, +/* 41536 */ {(12<<2)|2,{108,100,0}}, +/* 41537 */ {(12<<2)|2,{108,100,0}}, +/* 41538 */ {(12<<2)|2,{108,100,0}}, +/* 41539 */ {(12<<2)|2,{108,100,0}}, +/* 41540 */ {(12<<2)|2,{108,100,0}}, +/* 41541 */ {(12<<2)|2,{108,100,0}}, +/* 41542 */ {(12<<2)|2,{108,100,0}}, +/* 41543 */ {(12<<2)|2,{108,100,0}}, +/* 41544 */ {(12<<2)|2,{108,100,0}}, +/* 41545 */ {(12<<2)|2,{108,100,0}}, +/* 41546 */ {(12<<2)|2,{108,100,0}}, +/* 41547 */ {(12<<2)|2,{108,100,0}}, +/* 41548 */ {(12<<2)|2,{108,100,0}}, +/* 41549 */ {(12<<2)|2,{108,100,0}}, +/* 41550 */ {(12<<2)|2,{108,100,0}}, +/* 41551 */ {(12<<2)|2,{108,100,0}}, +/* 41552 */ {(12<<2)|2,{108,102,0}}, +/* 41553 */ {(12<<2)|2,{108,102,0}}, +/* 41554 */ {(12<<2)|2,{108,102,0}}, +/* 41555 */ {(12<<2)|2,{108,102,0}}, +/* 41556 */ {(12<<2)|2,{108,102,0}}, +/* 41557 */ {(12<<2)|2,{108,102,0}}, +/* 41558 */ {(12<<2)|2,{108,102,0}}, +/* 41559 */ {(12<<2)|2,{108,102,0}}, +/* 41560 */ {(12<<2)|2,{108,102,0}}, +/* 41561 */ {(12<<2)|2,{108,102,0}}, +/* 41562 */ {(12<<2)|2,{108,102,0}}, +/* 41563 */ {(12<<2)|2,{108,102,0}}, +/* 41564 */ {(12<<2)|2,{108,102,0}}, +/* 41565 */ {(12<<2)|2,{108,102,0}}, +/* 41566 */ {(12<<2)|2,{108,102,0}}, +/* 41567 */ {(12<<2)|2,{108,102,0}}, +/* 41568 */ {(12<<2)|2,{108,103,0}}, +/* 41569 */ {(12<<2)|2,{108,103,0}}, +/* 41570 */ {(12<<2)|2,{108,103,0}}, +/* 41571 */ {(12<<2)|2,{108,103,0}}, +/* 41572 */ {(12<<2)|2,{108,103,0}}, +/* 41573 */ {(12<<2)|2,{108,103,0}}, +/* 41574 */ {(12<<2)|2,{108,103,0}}, +/* 41575 */ {(12<<2)|2,{108,103,0}}, +/* 41576 */ {(12<<2)|2,{108,103,0}}, +/* 41577 */ {(12<<2)|2,{108,103,0}}, +/* 41578 */ {(12<<2)|2,{108,103,0}}, +/* 41579 */ {(12<<2)|2,{108,103,0}}, +/* 41580 */ {(12<<2)|2,{108,103,0}}, +/* 41581 */ {(12<<2)|2,{108,103,0}}, +/* 41582 */ {(12<<2)|2,{108,103,0}}, +/* 41583 */ {(12<<2)|2,{108,103,0}}, +/* 41584 */ {(12<<2)|2,{108,104,0}}, +/* 41585 */ {(12<<2)|2,{108,104,0}}, +/* 41586 */ {(12<<2)|2,{108,104,0}}, +/* 41587 */ {(12<<2)|2,{108,104,0}}, +/* 41588 */ {(12<<2)|2,{108,104,0}}, +/* 41589 */ {(12<<2)|2,{108,104,0}}, +/* 41590 */ {(12<<2)|2,{108,104,0}}, +/* 41591 */ {(12<<2)|2,{108,104,0}}, +/* 41592 */ {(12<<2)|2,{108,104,0}}, +/* 41593 */ {(12<<2)|2,{108,104,0}}, +/* 41594 */ {(12<<2)|2,{108,104,0}}, +/* 41595 */ {(12<<2)|2,{108,104,0}}, +/* 41596 */ {(12<<2)|2,{108,104,0}}, +/* 41597 */ {(12<<2)|2,{108,104,0}}, +/* 41598 */ {(12<<2)|2,{108,104,0}}, +/* 41599 */ {(12<<2)|2,{108,104,0}}, +/* 41600 */ {(12<<2)|2,{108,108,0}}, +/* 41601 */ {(12<<2)|2,{108,108,0}}, +/* 41602 */ {(12<<2)|2,{108,108,0}}, +/* 41603 */ {(12<<2)|2,{108,108,0}}, +/* 41604 */ {(12<<2)|2,{108,108,0}}, +/* 41605 */ {(12<<2)|2,{108,108,0}}, +/* 41606 */ {(12<<2)|2,{108,108,0}}, +/* 41607 */ {(12<<2)|2,{108,108,0}}, +/* 41608 */ {(12<<2)|2,{108,108,0}}, +/* 41609 */ {(12<<2)|2,{108,108,0}}, +/* 41610 */ {(12<<2)|2,{108,108,0}}, +/* 41611 */ {(12<<2)|2,{108,108,0}}, +/* 41612 */ {(12<<2)|2,{108,108,0}}, +/* 41613 */ {(12<<2)|2,{108,108,0}}, +/* 41614 */ {(12<<2)|2,{108,108,0}}, +/* 41615 */ {(12<<2)|2,{108,108,0}}, +/* 41616 */ {(12<<2)|2,{108,109,0}}, +/* 41617 */ {(12<<2)|2,{108,109,0}}, +/* 41618 */ {(12<<2)|2,{108,109,0}}, +/* 41619 */ {(12<<2)|2,{108,109,0}}, +/* 41620 */ {(12<<2)|2,{108,109,0}}, +/* 41621 */ {(12<<2)|2,{108,109,0}}, +/* 41622 */ {(12<<2)|2,{108,109,0}}, +/* 41623 */ {(12<<2)|2,{108,109,0}}, +/* 41624 */ {(12<<2)|2,{108,109,0}}, +/* 41625 */ {(12<<2)|2,{108,109,0}}, +/* 41626 */ {(12<<2)|2,{108,109,0}}, +/* 41627 */ {(12<<2)|2,{108,109,0}}, +/* 41628 */ {(12<<2)|2,{108,109,0}}, +/* 41629 */ {(12<<2)|2,{108,109,0}}, +/* 41630 */ {(12<<2)|2,{108,109,0}}, +/* 41631 */ {(12<<2)|2,{108,109,0}}, +/* 41632 */ {(12<<2)|2,{108,110,0}}, +/* 41633 */ {(12<<2)|2,{108,110,0}}, +/* 41634 */ {(12<<2)|2,{108,110,0}}, +/* 41635 */ {(12<<2)|2,{108,110,0}}, +/* 41636 */ {(12<<2)|2,{108,110,0}}, +/* 41637 */ {(12<<2)|2,{108,110,0}}, +/* 41638 */ {(12<<2)|2,{108,110,0}}, +/* 41639 */ {(12<<2)|2,{108,110,0}}, +/* 41640 */ {(12<<2)|2,{108,110,0}}, +/* 41641 */ {(12<<2)|2,{108,110,0}}, +/* 41642 */ {(12<<2)|2,{108,110,0}}, +/* 41643 */ {(12<<2)|2,{108,110,0}}, +/* 41644 */ {(12<<2)|2,{108,110,0}}, +/* 41645 */ {(12<<2)|2,{108,110,0}}, +/* 41646 */ {(12<<2)|2,{108,110,0}}, +/* 41647 */ {(12<<2)|2,{108,110,0}}, +/* 41648 */ {(12<<2)|2,{108,112,0}}, +/* 41649 */ {(12<<2)|2,{108,112,0}}, +/* 41650 */ {(12<<2)|2,{108,112,0}}, +/* 41651 */ {(12<<2)|2,{108,112,0}}, +/* 41652 */ {(12<<2)|2,{108,112,0}}, +/* 41653 */ {(12<<2)|2,{108,112,0}}, +/* 41654 */ {(12<<2)|2,{108,112,0}}, +/* 41655 */ {(12<<2)|2,{108,112,0}}, +/* 41656 */ {(12<<2)|2,{108,112,0}}, +/* 41657 */ {(12<<2)|2,{108,112,0}}, +/* 41658 */ {(12<<2)|2,{108,112,0}}, +/* 41659 */ {(12<<2)|2,{108,112,0}}, +/* 41660 */ {(12<<2)|2,{108,112,0}}, +/* 41661 */ {(12<<2)|2,{108,112,0}}, +/* 41662 */ {(12<<2)|2,{108,112,0}}, +/* 41663 */ {(12<<2)|2,{108,112,0}}, +/* 41664 */ {(12<<2)|2,{108,114,0}}, +/* 41665 */ {(12<<2)|2,{108,114,0}}, +/* 41666 */ {(12<<2)|2,{108,114,0}}, +/* 41667 */ {(12<<2)|2,{108,114,0}}, +/* 41668 */ {(12<<2)|2,{108,114,0}}, +/* 41669 */ {(12<<2)|2,{108,114,0}}, +/* 41670 */ {(12<<2)|2,{108,114,0}}, +/* 41671 */ {(12<<2)|2,{108,114,0}}, +/* 41672 */ {(12<<2)|2,{108,114,0}}, +/* 41673 */ {(12<<2)|2,{108,114,0}}, +/* 41674 */ {(12<<2)|2,{108,114,0}}, +/* 41675 */ {(12<<2)|2,{108,114,0}}, +/* 41676 */ {(12<<2)|2,{108,114,0}}, +/* 41677 */ {(12<<2)|2,{108,114,0}}, +/* 41678 */ {(12<<2)|2,{108,114,0}}, +/* 41679 */ {(12<<2)|2,{108,114,0}}, +/* 41680 */ {(12<<2)|2,{108,117,0}}, +/* 41681 */ {(12<<2)|2,{108,117,0}}, +/* 41682 */ {(12<<2)|2,{108,117,0}}, +/* 41683 */ {(12<<2)|2,{108,117,0}}, +/* 41684 */ {(12<<2)|2,{108,117,0}}, +/* 41685 */ {(12<<2)|2,{108,117,0}}, +/* 41686 */ {(12<<2)|2,{108,117,0}}, +/* 41687 */ {(12<<2)|2,{108,117,0}}, +/* 41688 */ {(12<<2)|2,{108,117,0}}, +/* 41689 */ {(12<<2)|2,{108,117,0}}, +/* 41690 */ {(12<<2)|2,{108,117,0}}, +/* 41691 */ {(12<<2)|2,{108,117,0}}, +/* 41692 */ {(12<<2)|2,{108,117,0}}, +/* 41693 */ {(12<<2)|2,{108,117,0}}, +/* 41694 */ {(12<<2)|2,{108,117,0}}, +/* 41695 */ {(12<<2)|2,{108,117,0}}, +/* 41696 */ {(13<<2)|2,{108,58,0}}, +/* 41697 */ {(13<<2)|2,{108,58,0}}, +/* 41698 */ {(13<<2)|2,{108,58,0}}, +/* 41699 */ {(13<<2)|2,{108,58,0}}, +/* 41700 */ {(13<<2)|2,{108,58,0}}, +/* 41701 */ {(13<<2)|2,{108,58,0}}, +/* 41702 */ {(13<<2)|2,{108,58,0}}, +/* 41703 */ {(13<<2)|2,{108,58,0}}, +/* 41704 */ {(13<<2)|2,{108,66,0}}, +/* 41705 */ {(13<<2)|2,{108,66,0}}, +/* 41706 */ {(13<<2)|2,{108,66,0}}, +/* 41707 */ {(13<<2)|2,{108,66,0}}, +/* 41708 */ {(13<<2)|2,{108,66,0}}, +/* 41709 */ {(13<<2)|2,{108,66,0}}, +/* 41710 */ {(13<<2)|2,{108,66,0}}, +/* 41711 */ {(13<<2)|2,{108,66,0}}, +/* 41712 */ {(13<<2)|2,{108,67,0}}, +/* 41713 */ {(13<<2)|2,{108,67,0}}, +/* 41714 */ {(13<<2)|2,{108,67,0}}, +/* 41715 */ {(13<<2)|2,{108,67,0}}, +/* 41716 */ {(13<<2)|2,{108,67,0}}, +/* 41717 */ {(13<<2)|2,{108,67,0}}, +/* 41718 */ {(13<<2)|2,{108,67,0}}, +/* 41719 */ {(13<<2)|2,{108,67,0}}, +/* 41720 */ {(13<<2)|2,{108,68,0}}, +/* 41721 */ {(13<<2)|2,{108,68,0}}, +/* 41722 */ {(13<<2)|2,{108,68,0}}, +/* 41723 */ {(13<<2)|2,{108,68,0}}, +/* 41724 */ {(13<<2)|2,{108,68,0}}, +/* 41725 */ {(13<<2)|2,{108,68,0}}, +/* 41726 */ {(13<<2)|2,{108,68,0}}, +/* 41727 */ {(13<<2)|2,{108,68,0}}, +/* 41728 */ {(13<<2)|2,{108,69,0}}, +/* 41729 */ {(13<<2)|2,{108,69,0}}, +/* 41730 */ {(13<<2)|2,{108,69,0}}, +/* 41731 */ {(13<<2)|2,{108,69,0}}, +/* 41732 */ {(13<<2)|2,{108,69,0}}, +/* 41733 */ {(13<<2)|2,{108,69,0}}, +/* 41734 */ {(13<<2)|2,{108,69,0}}, +/* 41735 */ {(13<<2)|2,{108,69,0}}, +/* 41736 */ {(13<<2)|2,{108,70,0}}, +/* 41737 */ {(13<<2)|2,{108,70,0}}, +/* 41738 */ {(13<<2)|2,{108,70,0}}, +/* 41739 */ {(13<<2)|2,{108,70,0}}, +/* 41740 */ {(13<<2)|2,{108,70,0}}, +/* 41741 */ {(13<<2)|2,{108,70,0}}, +/* 41742 */ {(13<<2)|2,{108,70,0}}, +/* 41743 */ {(13<<2)|2,{108,70,0}}, +/* 41744 */ {(13<<2)|2,{108,71,0}}, +/* 41745 */ {(13<<2)|2,{108,71,0}}, +/* 41746 */ {(13<<2)|2,{108,71,0}}, +/* 41747 */ {(13<<2)|2,{108,71,0}}, +/* 41748 */ {(13<<2)|2,{108,71,0}}, +/* 41749 */ {(13<<2)|2,{108,71,0}}, +/* 41750 */ {(13<<2)|2,{108,71,0}}, +/* 41751 */ {(13<<2)|2,{108,71,0}}, +/* 41752 */ {(13<<2)|2,{108,72,0}}, +/* 41753 */ {(13<<2)|2,{108,72,0}}, +/* 41754 */ {(13<<2)|2,{108,72,0}}, +/* 41755 */ {(13<<2)|2,{108,72,0}}, +/* 41756 */ {(13<<2)|2,{108,72,0}}, +/* 41757 */ {(13<<2)|2,{108,72,0}}, +/* 41758 */ {(13<<2)|2,{108,72,0}}, +/* 41759 */ {(13<<2)|2,{108,72,0}}, +/* 41760 */ {(13<<2)|2,{108,73,0}}, +/* 41761 */ {(13<<2)|2,{108,73,0}}, +/* 41762 */ {(13<<2)|2,{108,73,0}}, +/* 41763 */ {(13<<2)|2,{108,73,0}}, +/* 41764 */ {(13<<2)|2,{108,73,0}}, +/* 41765 */ {(13<<2)|2,{108,73,0}}, +/* 41766 */ {(13<<2)|2,{108,73,0}}, +/* 41767 */ {(13<<2)|2,{108,73,0}}, +/* 41768 */ {(13<<2)|2,{108,74,0}}, +/* 41769 */ {(13<<2)|2,{108,74,0}}, +/* 41770 */ {(13<<2)|2,{108,74,0}}, +/* 41771 */ {(13<<2)|2,{108,74,0}}, +/* 41772 */ {(13<<2)|2,{108,74,0}}, +/* 41773 */ {(13<<2)|2,{108,74,0}}, +/* 41774 */ {(13<<2)|2,{108,74,0}}, +/* 41775 */ {(13<<2)|2,{108,74,0}}, +/* 41776 */ {(13<<2)|2,{108,75,0}}, +/* 41777 */ {(13<<2)|2,{108,75,0}}, +/* 41778 */ {(13<<2)|2,{108,75,0}}, +/* 41779 */ {(13<<2)|2,{108,75,0}}, +/* 41780 */ {(13<<2)|2,{108,75,0}}, +/* 41781 */ {(13<<2)|2,{108,75,0}}, +/* 41782 */ {(13<<2)|2,{108,75,0}}, +/* 41783 */ {(13<<2)|2,{108,75,0}}, +/* 41784 */ {(13<<2)|2,{108,76,0}}, +/* 41785 */ {(13<<2)|2,{108,76,0}}, +/* 41786 */ {(13<<2)|2,{108,76,0}}, +/* 41787 */ {(13<<2)|2,{108,76,0}}, +/* 41788 */ {(13<<2)|2,{108,76,0}}, +/* 41789 */ {(13<<2)|2,{108,76,0}}, +/* 41790 */ {(13<<2)|2,{108,76,0}}, +/* 41791 */ {(13<<2)|2,{108,76,0}}, +/* 41792 */ {(13<<2)|2,{108,77,0}}, +/* 41793 */ {(13<<2)|2,{108,77,0}}, +/* 41794 */ {(13<<2)|2,{108,77,0}}, +/* 41795 */ {(13<<2)|2,{108,77,0}}, +/* 41796 */ {(13<<2)|2,{108,77,0}}, +/* 41797 */ {(13<<2)|2,{108,77,0}}, +/* 41798 */ {(13<<2)|2,{108,77,0}}, +/* 41799 */ {(13<<2)|2,{108,77,0}}, +/* 41800 */ {(13<<2)|2,{108,78,0}}, +/* 41801 */ {(13<<2)|2,{108,78,0}}, +/* 41802 */ {(13<<2)|2,{108,78,0}}, +/* 41803 */ {(13<<2)|2,{108,78,0}}, +/* 41804 */ {(13<<2)|2,{108,78,0}}, +/* 41805 */ {(13<<2)|2,{108,78,0}}, +/* 41806 */ {(13<<2)|2,{108,78,0}}, +/* 41807 */ {(13<<2)|2,{108,78,0}}, +/* 41808 */ {(13<<2)|2,{108,79,0}}, +/* 41809 */ {(13<<2)|2,{108,79,0}}, +/* 41810 */ {(13<<2)|2,{108,79,0}}, +/* 41811 */ {(13<<2)|2,{108,79,0}}, +/* 41812 */ {(13<<2)|2,{108,79,0}}, +/* 41813 */ {(13<<2)|2,{108,79,0}}, +/* 41814 */ {(13<<2)|2,{108,79,0}}, +/* 41815 */ {(13<<2)|2,{108,79,0}}, +/* 41816 */ {(13<<2)|2,{108,80,0}}, +/* 41817 */ {(13<<2)|2,{108,80,0}}, +/* 41818 */ {(13<<2)|2,{108,80,0}}, +/* 41819 */ {(13<<2)|2,{108,80,0}}, +/* 41820 */ {(13<<2)|2,{108,80,0}}, +/* 41821 */ {(13<<2)|2,{108,80,0}}, +/* 41822 */ {(13<<2)|2,{108,80,0}}, +/* 41823 */ {(13<<2)|2,{108,80,0}}, +/* 41824 */ {(13<<2)|2,{108,81,0}}, +/* 41825 */ {(13<<2)|2,{108,81,0}}, +/* 41826 */ {(13<<2)|2,{108,81,0}}, +/* 41827 */ {(13<<2)|2,{108,81,0}}, +/* 41828 */ {(13<<2)|2,{108,81,0}}, +/* 41829 */ {(13<<2)|2,{108,81,0}}, +/* 41830 */ {(13<<2)|2,{108,81,0}}, +/* 41831 */ {(13<<2)|2,{108,81,0}}, +/* 41832 */ {(13<<2)|2,{108,82,0}}, +/* 41833 */ {(13<<2)|2,{108,82,0}}, +/* 41834 */ {(13<<2)|2,{108,82,0}}, +/* 41835 */ {(13<<2)|2,{108,82,0}}, +/* 41836 */ {(13<<2)|2,{108,82,0}}, +/* 41837 */ {(13<<2)|2,{108,82,0}}, +/* 41838 */ {(13<<2)|2,{108,82,0}}, +/* 41839 */ {(13<<2)|2,{108,82,0}}, +/* 41840 */ {(13<<2)|2,{108,83,0}}, +/* 41841 */ {(13<<2)|2,{108,83,0}}, +/* 41842 */ {(13<<2)|2,{108,83,0}}, +/* 41843 */ {(13<<2)|2,{108,83,0}}, +/* 41844 */ {(13<<2)|2,{108,83,0}}, +/* 41845 */ {(13<<2)|2,{108,83,0}}, +/* 41846 */ {(13<<2)|2,{108,83,0}}, +/* 41847 */ {(13<<2)|2,{108,83,0}}, +/* 41848 */ {(13<<2)|2,{108,84,0}}, +/* 41849 */ {(13<<2)|2,{108,84,0}}, +/* 41850 */ {(13<<2)|2,{108,84,0}}, +/* 41851 */ {(13<<2)|2,{108,84,0}}, +/* 41852 */ {(13<<2)|2,{108,84,0}}, +/* 41853 */ {(13<<2)|2,{108,84,0}}, +/* 41854 */ {(13<<2)|2,{108,84,0}}, +/* 41855 */ {(13<<2)|2,{108,84,0}}, +/* 41856 */ {(13<<2)|2,{108,85,0}}, +/* 41857 */ {(13<<2)|2,{108,85,0}}, +/* 41858 */ {(13<<2)|2,{108,85,0}}, +/* 41859 */ {(13<<2)|2,{108,85,0}}, +/* 41860 */ {(13<<2)|2,{108,85,0}}, +/* 41861 */ {(13<<2)|2,{108,85,0}}, +/* 41862 */ {(13<<2)|2,{108,85,0}}, +/* 41863 */ {(13<<2)|2,{108,85,0}}, +/* 41864 */ {(13<<2)|2,{108,86,0}}, +/* 41865 */ {(13<<2)|2,{108,86,0}}, +/* 41866 */ {(13<<2)|2,{108,86,0}}, +/* 41867 */ {(13<<2)|2,{108,86,0}}, +/* 41868 */ {(13<<2)|2,{108,86,0}}, +/* 41869 */ {(13<<2)|2,{108,86,0}}, +/* 41870 */ {(13<<2)|2,{108,86,0}}, +/* 41871 */ {(13<<2)|2,{108,86,0}}, +/* 41872 */ {(13<<2)|2,{108,87,0}}, +/* 41873 */ {(13<<2)|2,{108,87,0}}, +/* 41874 */ {(13<<2)|2,{108,87,0}}, +/* 41875 */ {(13<<2)|2,{108,87,0}}, +/* 41876 */ {(13<<2)|2,{108,87,0}}, +/* 41877 */ {(13<<2)|2,{108,87,0}}, +/* 41878 */ {(13<<2)|2,{108,87,0}}, +/* 41879 */ {(13<<2)|2,{108,87,0}}, +/* 41880 */ {(13<<2)|2,{108,89,0}}, +/* 41881 */ {(13<<2)|2,{108,89,0}}, +/* 41882 */ {(13<<2)|2,{108,89,0}}, +/* 41883 */ {(13<<2)|2,{108,89,0}}, +/* 41884 */ {(13<<2)|2,{108,89,0}}, +/* 41885 */ {(13<<2)|2,{108,89,0}}, +/* 41886 */ {(13<<2)|2,{108,89,0}}, +/* 41887 */ {(13<<2)|2,{108,89,0}}, +/* 41888 */ {(13<<2)|2,{108,106,0}}, +/* 41889 */ {(13<<2)|2,{108,106,0}}, +/* 41890 */ {(13<<2)|2,{108,106,0}}, +/* 41891 */ {(13<<2)|2,{108,106,0}}, +/* 41892 */ {(13<<2)|2,{108,106,0}}, +/* 41893 */ {(13<<2)|2,{108,106,0}}, +/* 41894 */ {(13<<2)|2,{108,106,0}}, +/* 41895 */ {(13<<2)|2,{108,106,0}}, +/* 41896 */ {(13<<2)|2,{108,107,0}}, +/* 41897 */ {(13<<2)|2,{108,107,0}}, +/* 41898 */ {(13<<2)|2,{108,107,0}}, +/* 41899 */ {(13<<2)|2,{108,107,0}}, +/* 41900 */ {(13<<2)|2,{108,107,0}}, +/* 41901 */ {(13<<2)|2,{108,107,0}}, +/* 41902 */ {(13<<2)|2,{108,107,0}}, +/* 41903 */ {(13<<2)|2,{108,107,0}}, +/* 41904 */ {(13<<2)|2,{108,113,0}}, +/* 41905 */ {(13<<2)|2,{108,113,0}}, +/* 41906 */ {(13<<2)|2,{108,113,0}}, +/* 41907 */ {(13<<2)|2,{108,113,0}}, +/* 41908 */ {(13<<2)|2,{108,113,0}}, +/* 41909 */ {(13<<2)|2,{108,113,0}}, +/* 41910 */ {(13<<2)|2,{108,113,0}}, +/* 41911 */ {(13<<2)|2,{108,113,0}}, +/* 41912 */ {(13<<2)|2,{108,118,0}}, +/* 41913 */ {(13<<2)|2,{108,118,0}}, +/* 41914 */ {(13<<2)|2,{108,118,0}}, +/* 41915 */ {(13<<2)|2,{108,118,0}}, +/* 41916 */ {(13<<2)|2,{108,118,0}}, +/* 41917 */ {(13<<2)|2,{108,118,0}}, +/* 41918 */ {(13<<2)|2,{108,118,0}}, +/* 41919 */ {(13<<2)|2,{108,118,0}}, +/* 41920 */ {(13<<2)|2,{108,119,0}}, +/* 41921 */ {(13<<2)|2,{108,119,0}}, +/* 41922 */ {(13<<2)|2,{108,119,0}}, +/* 41923 */ {(13<<2)|2,{108,119,0}}, +/* 41924 */ {(13<<2)|2,{108,119,0}}, +/* 41925 */ {(13<<2)|2,{108,119,0}}, +/* 41926 */ {(13<<2)|2,{108,119,0}}, +/* 41927 */ {(13<<2)|2,{108,119,0}}, +/* 41928 */ {(13<<2)|2,{108,120,0}}, +/* 41929 */ {(13<<2)|2,{108,120,0}}, +/* 41930 */ {(13<<2)|2,{108,120,0}}, +/* 41931 */ {(13<<2)|2,{108,120,0}}, +/* 41932 */ {(13<<2)|2,{108,120,0}}, +/* 41933 */ {(13<<2)|2,{108,120,0}}, +/* 41934 */ {(13<<2)|2,{108,120,0}}, +/* 41935 */ {(13<<2)|2,{108,120,0}}, +/* 41936 */ {(13<<2)|2,{108,121,0}}, +/* 41937 */ {(13<<2)|2,{108,121,0}}, +/* 41938 */ {(13<<2)|2,{108,121,0}}, +/* 41939 */ {(13<<2)|2,{108,121,0}}, +/* 41940 */ {(13<<2)|2,{108,121,0}}, +/* 41941 */ {(13<<2)|2,{108,121,0}}, +/* 41942 */ {(13<<2)|2,{108,121,0}}, +/* 41943 */ {(13<<2)|2,{108,121,0}}, +/* 41944 */ {(13<<2)|2,{108,122,0}}, +/* 41945 */ {(13<<2)|2,{108,122,0}}, +/* 41946 */ {(13<<2)|2,{108,122,0}}, +/* 41947 */ {(13<<2)|2,{108,122,0}}, +/* 41948 */ {(13<<2)|2,{108,122,0}}, +/* 41949 */ {(13<<2)|2,{108,122,0}}, +/* 41950 */ {(13<<2)|2,{108,122,0}}, +/* 41951 */ {(13<<2)|2,{108,122,0}}, +/* 41952 */ {(14<<2)|2,{108,38,0}}, +/* 41953 */ {(14<<2)|2,{108,38,0}}, +/* 41954 */ {(14<<2)|2,{108,38,0}}, +/* 41955 */ {(14<<2)|2,{108,38,0}}, +/* 41956 */ {(14<<2)|2,{108,42,0}}, +/* 41957 */ {(14<<2)|2,{108,42,0}}, +/* 41958 */ {(14<<2)|2,{108,42,0}}, +/* 41959 */ {(14<<2)|2,{108,42,0}}, +/* 41960 */ {(14<<2)|2,{108,44,0}}, +/* 41961 */ {(14<<2)|2,{108,44,0}}, +/* 41962 */ {(14<<2)|2,{108,44,0}}, +/* 41963 */ {(14<<2)|2,{108,44,0}}, +/* 41964 */ {(14<<2)|2,{108,59,0}}, +/* 41965 */ {(14<<2)|2,{108,59,0}}, +/* 41966 */ {(14<<2)|2,{108,59,0}}, +/* 41967 */ {(14<<2)|2,{108,59,0}}, +/* 41968 */ {(14<<2)|2,{108,88,0}}, +/* 41969 */ {(14<<2)|2,{108,88,0}}, +/* 41970 */ {(14<<2)|2,{108,88,0}}, +/* 41971 */ {(14<<2)|2,{108,88,0}}, +/* 41972 */ {(14<<2)|2,{108,90,0}}, +/* 41973 */ {(14<<2)|2,{108,90,0}}, +/* 41974 */ {(14<<2)|2,{108,90,0}}, +/* 41975 */ {(14<<2)|2,{108,90,0}}, +/* 41976 */ {(16<<2)|2,{108,33,0}}, +/* 41977 */ {(16<<2)|2,{108,34,0}}, +/* 41978 */ {(16<<2)|2,{108,40,0}}, +/* 41979 */ {(16<<2)|2,{108,41,0}}, +/* 41980 */ {(16<<2)|2,{108,63,0}}, +/* 41981 */ {(6<<2)|1,{108,0,0}}, +/* 41982 */ {(6<<2)|1,{108,0,0}}, +/* 41983 */ {(6<<2)|1,{108,0,0}}, +/* 41984 */ {(16<<2)|3,{109,48,48}}, +/* 41985 */ {(16<<2)|3,{109,48,49}}, +/* 41986 */ {(16<<2)|3,{109,48,50}}, +/* 41987 */ {(16<<2)|3,{109,48,97}}, +/* 41988 */ {(16<<2)|3,{109,48,99}}, +/* 41989 */ {(16<<2)|3,{109,48,101}}, +/* 41990 */ {(16<<2)|3,{109,48,105}}, +/* 41991 */ {(16<<2)|3,{109,48,111}}, +/* 41992 */ {(16<<2)|3,{109,48,115}}, +/* 41993 */ {(16<<2)|3,{109,48,116}}, +/* 41994 */ {(11<<2)|2,{109,48,0}}, +/* 41995 */ {(11<<2)|2,{109,48,0}}, +/* 41996 */ {(11<<2)|2,{109,48,0}}, +/* 41997 */ {(11<<2)|2,{109,48,0}}, +/* 41998 */ {(11<<2)|2,{109,48,0}}, +/* 41999 */ {(11<<2)|2,{109,48,0}}, +/* 42000 */ {(11<<2)|2,{109,48,0}}, +/* 42001 */ {(11<<2)|2,{109,48,0}}, +/* 42002 */ {(11<<2)|2,{109,48,0}}, +/* 42003 */ {(11<<2)|2,{109,48,0}}, +/* 42004 */ {(11<<2)|2,{109,48,0}}, +/* 42005 */ {(11<<2)|2,{109,48,0}}, +/* 42006 */ {(11<<2)|2,{109,48,0}}, +/* 42007 */ {(11<<2)|2,{109,48,0}}, +/* 42008 */ {(11<<2)|2,{109,48,0}}, +/* 42009 */ {(11<<2)|2,{109,48,0}}, +/* 42010 */ {(11<<2)|2,{109,48,0}}, +/* 42011 */ {(11<<2)|2,{109,48,0}}, +/* 42012 */ {(11<<2)|2,{109,48,0}}, +/* 42013 */ {(11<<2)|2,{109,48,0}}, +/* 42014 */ {(11<<2)|2,{109,48,0}}, +/* 42015 */ {(11<<2)|2,{109,48,0}}, +/* 42016 */ {(16<<2)|3,{109,49,48}}, +/* 42017 */ {(16<<2)|3,{109,49,49}}, +/* 42018 */ {(16<<2)|3,{109,49,50}}, +/* 42019 */ {(16<<2)|3,{109,49,97}}, +/* 42020 */ {(16<<2)|3,{109,49,99}}, +/* 42021 */ {(16<<2)|3,{109,49,101}}, +/* 42022 */ {(16<<2)|3,{109,49,105}}, +/* 42023 */ {(16<<2)|3,{109,49,111}}, +/* 42024 */ {(16<<2)|3,{109,49,115}}, +/* 42025 */ {(16<<2)|3,{109,49,116}}, +/* 42026 */ {(11<<2)|2,{109,49,0}}, +/* 42027 */ {(11<<2)|2,{109,49,0}}, +/* 42028 */ {(11<<2)|2,{109,49,0}}, +/* 42029 */ {(11<<2)|2,{109,49,0}}, +/* 42030 */ {(11<<2)|2,{109,49,0}}, +/* 42031 */ {(11<<2)|2,{109,49,0}}, +/* 42032 */ {(11<<2)|2,{109,49,0}}, +/* 42033 */ {(11<<2)|2,{109,49,0}}, +/* 42034 */ {(11<<2)|2,{109,49,0}}, +/* 42035 */ {(11<<2)|2,{109,49,0}}, +/* 42036 */ {(11<<2)|2,{109,49,0}}, +/* 42037 */ {(11<<2)|2,{109,49,0}}, +/* 42038 */ {(11<<2)|2,{109,49,0}}, +/* 42039 */ {(11<<2)|2,{109,49,0}}, +/* 42040 */ {(11<<2)|2,{109,49,0}}, +/* 42041 */ {(11<<2)|2,{109,49,0}}, +/* 42042 */ {(11<<2)|2,{109,49,0}}, +/* 42043 */ {(11<<2)|2,{109,49,0}}, +/* 42044 */ {(11<<2)|2,{109,49,0}}, +/* 42045 */ {(11<<2)|2,{109,49,0}}, +/* 42046 */ {(11<<2)|2,{109,49,0}}, +/* 42047 */ {(11<<2)|2,{109,49,0}}, +/* 42048 */ {(16<<2)|3,{109,50,48}}, +/* 42049 */ {(16<<2)|3,{109,50,49}}, +/* 42050 */ {(16<<2)|3,{109,50,50}}, +/* 42051 */ {(16<<2)|3,{109,50,97}}, +/* 42052 */ {(16<<2)|3,{109,50,99}}, +/* 42053 */ {(16<<2)|3,{109,50,101}}, +/* 42054 */ {(16<<2)|3,{109,50,105}}, +/* 42055 */ {(16<<2)|3,{109,50,111}}, +/* 42056 */ {(16<<2)|3,{109,50,115}}, +/* 42057 */ {(16<<2)|3,{109,50,116}}, +/* 42058 */ {(11<<2)|2,{109,50,0}}, +/* 42059 */ {(11<<2)|2,{109,50,0}}, +/* 42060 */ {(11<<2)|2,{109,50,0}}, +/* 42061 */ {(11<<2)|2,{109,50,0}}, +/* 42062 */ {(11<<2)|2,{109,50,0}}, +/* 42063 */ {(11<<2)|2,{109,50,0}}, +/* 42064 */ {(11<<2)|2,{109,50,0}}, +/* 42065 */ {(11<<2)|2,{109,50,0}}, +/* 42066 */ {(11<<2)|2,{109,50,0}}, +/* 42067 */ {(11<<2)|2,{109,50,0}}, +/* 42068 */ {(11<<2)|2,{109,50,0}}, +/* 42069 */ {(11<<2)|2,{109,50,0}}, +/* 42070 */ {(11<<2)|2,{109,50,0}}, +/* 42071 */ {(11<<2)|2,{109,50,0}}, +/* 42072 */ {(11<<2)|2,{109,50,0}}, +/* 42073 */ {(11<<2)|2,{109,50,0}}, +/* 42074 */ {(11<<2)|2,{109,50,0}}, +/* 42075 */ {(11<<2)|2,{109,50,0}}, +/* 42076 */ {(11<<2)|2,{109,50,0}}, +/* 42077 */ {(11<<2)|2,{109,50,0}}, +/* 42078 */ {(11<<2)|2,{109,50,0}}, +/* 42079 */ {(11<<2)|2,{109,50,0}}, +/* 42080 */ {(16<<2)|3,{109,97,48}}, +/* 42081 */ {(16<<2)|3,{109,97,49}}, +/* 42082 */ {(16<<2)|3,{109,97,50}}, +/* 42083 */ {(16<<2)|3,{109,97,97}}, +/* 42084 */ {(16<<2)|3,{109,97,99}}, +/* 42085 */ {(16<<2)|3,{109,97,101}}, +/* 42086 */ {(16<<2)|3,{109,97,105}}, +/* 42087 */ {(16<<2)|3,{109,97,111}}, +/* 42088 */ {(16<<2)|3,{109,97,115}}, +/* 42089 */ {(16<<2)|3,{109,97,116}}, +/* 42090 */ {(11<<2)|2,{109,97,0}}, +/* 42091 */ {(11<<2)|2,{109,97,0}}, +/* 42092 */ {(11<<2)|2,{109,97,0}}, +/* 42093 */ {(11<<2)|2,{109,97,0}}, +/* 42094 */ {(11<<2)|2,{109,97,0}}, +/* 42095 */ {(11<<2)|2,{109,97,0}}, +/* 42096 */ {(11<<2)|2,{109,97,0}}, +/* 42097 */ {(11<<2)|2,{109,97,0}}, +/* 42098 */ {(11<<2)|2,{109,97,0}}, +/* 42099 */ {(11<<2)|2,{109,97,0}}, +/* 42100 */ {(11<<2)|2,{109,97,0}}, +/* 42101 */ {(11<<2)|2,{109,97,0}}, +/* 42102 */ {(11<<2)|2,{109,97,0}}, +/* 42103 */ {(11<<2)|2,{109,97,0}}, +/* 42104 */ {(11<<2)|2,{109,97,0}}, +/* 42105 */ {(11<<2)|2,{109,97,0}}, +/* 42106 */ {(11<<2)|2,{109,97,0}}, +/* 42107 */ {(11<<2)|2,{109,97,0}}, +/* 42108 */ {(11<<2)|2,{109,97,0}}, +/* 42109 */ {(11<<2)|2,{109,97,0}}, +/* 42110 */ {(11<<2)|2,{109,97,0}}, +/* 42111 */ {(11<<2)|2,{109,97,0}}, +/* 42112 */ {(16<<2)|3,{109,99,48}}, +/* 42113 */ {(16<<2)|3,{109,99,49}}, +/* 42114 */ {(16<<2)|3,{109,99,50}}, +/* 42115 */ {(16<<2)|3,{109,99,97}}, +/* 42116 */ {(16<<2)|3,{109,99,99}}, +/* 42117 */ {(16<<2)|3,{109,99,101}}, +/* 42118 */ {(16<<2)|3,{109,99,105}}, +/* 42119 */ {(16<<2)|3,{109,99,111}}, +/* 42120 */ {(16<<2)|3,{109,99,115}}, +/* 42121 */ {(16<<2)|3,{109,99,116}}, +/* 42122 */ {(11<<2)|2,{109,99,0}}, +/* 42123 */ {(11<<2)|2,{109,99,0}}, +/* 42124 */ {(11<<2)|2,{109,99,0}}, +/* 42125 */ {(11<<2)|2,{109,99,0}}, +/* 42126 */ {(11<<2)|2,{109,99,0}}, +/* 42127 */ {(11<<2)|2,{109,99,0}}, +/* 42128 */ {(11<<2)|2,{109,99,0}}, +/* 42129 */ {(11<<2)|2,{109,99,0}}, +/* 42130 */ {(11<<2)|2,{109,99,0}}, +/* 42131 */ {(11<<2)|2,{109,99,0}}, +/* 42132 */ {(11<<2)|2,{109,99,0}}, +/* 42133 */ {(11<<2)|2,{109,99,0}}, +/* 42134 */ {(11<<2)|2,{109,99,0}}, +/* 42135 */ {(11<<2)|2,{109,99,0}}, +/* 42136 */ {(11<<2)|2,{109,99,0}}, +/* 42137 */ {(11<<2)|2,{109,99,0}}, +/* 42138 */ {(11<<2)|2,{109,99,0}}, +/* 42139 */ {(11<<2)|2,{109,99,0}}, +/* 42140 */ {(11<<2)|2,{109,99,0}}, +/* 42141 */ {(11<<2)|2,{109,99,0}}, +/* 42142 */ {(11<<2)|2,{109,99,0}}, +/* 42143 */ {(11<<2)|2,{109,99,0}}, +/* 42144 */ {(16<<2)|3,{109,101,48}}, +/* 42145 */ {(16<<2)|3,{109,101,49}}, +/* 42146 */ {(16<<2)|3,{109,101,50}}, +/* 42147 */ {(16<<2)|3,{109,101,97}}, +/* 42148 */ {(16<<2)|3,{109,101,99}}, +/* 42149 */ {(16<<2)|3,{109,101,101}}, +/* 42150 */ {(16<<2)|3,{109,101,105}}, +/* 42151 */ {(16<<2)|3,{109,101,111}}, +/* 42152 */ {(16<<2)|3,{109,101,115}}, +/* 42153 */ {(16<<2)|3,{109,101,116}}, +/* 42154 */ {(11<<2)|2,{109,101,0}}, +/* 42155 */ {(11<<2)|2,{109,101,0}}, +/* 42156 */ {(11<<2)|2,{109,101,0}}, +/* 42157 */ {(11<<2)|2,{109,101,0}}, +/* 42158 */ {(11<<2)|2,{109,101,0}}, +/* 42159 */ {(11<<2)|2,{109,101,0}}, +/* 42160 */ {(11<<2)|2,{109,101,0}}, +/* 42161 */ {(11<<2)|2,{109,101,0}}, +/* 42162 */ {(11<<2)|2,{109,101,0}}, +/* 42163 */ {(11<<2)|2,{109,101,0}}, +/* 42164 */ {(11<<2)|2,{109,101,0}}, +/* 42165 */ {(11<<2)|2,{109,101,0}}, +/* 42166 */ {(11<<2)|2,{109,101,0}}, +/* 42167 */ {(11<<2)|2,{109,101,0}}, +/* 42168 */ {(11<<2)|2,{109,101,0}}, +/* 42169 */ {(11<<2)|2,{109,101,0}}, +/* 42170 */ {(11<<2)|2,{109,101,0}}, +/* 42171 */ {(11<<2)|2,{109,101,0}}, +/* 42172 */ {(11<<2)|2,{109,101,0}}, +/* 42173 */ {(11<<2)|2,{109,101,0}}, +/* 42174 */ {(11<<2)|2,{109,101,0}}, +/* 42175 */ {(11<<2)|2,{109,101,0}}, +/* 42176 */ {(16<<2)|3,{109,105,48}}, +/* 42177 */ {(16<<2)|3,{109,105,49}}, +/* 42178 */ {(16<<2)|3,{109,105,50}}, +/* 42179 */ {(16<<2)|3,{109,105,97}}, +/* 42180 */ {(16<<2)|3,{109,105,99}}, +/* 42181 */ {(16<<2)|3,{109,105,101}}, +/* 42182 */ {(16<<2)|3,{109,105,105}}, +/* 42183 */ {(16<<2)|3,{109,105,111}}, +/* 42184 */ {(16<<2)|3,{109,105,115}}, +/* 42185 */ {(16<<2)|3,{109,105,116}}, +/* 42186 */ {(11<<2)|2,{109,105,0}}, +/* 42187 */ {(11<<2)|2,{109,105,0}}, +/* 42188 */ {(11<<2)|2,{109,105,0}}, +/* 42189 */ {(11<<2)|2,{109,105,0}}, +/* 42190 */ {(11<<2)|2,{109,105,0}}, +/* 42191 */ {(11<<2)|2,{109,105,0}}, +/* 42192 */ {(11<<2)|2,{109,105,0}}, +/* 42193 */ {(11<<2)|2,{109,105,0}}, +/* 42194 */ {(11<<2)|2,{109,105,0}}, +/* 42195 */ {(11<<2)|2,{109,105,0}}, +/* 42196 */ {(11<<2)|2,{109,105,0}}, +/* 42197 */ {(11<<2)|2,{109,105,0}}, +/* 42198 */ {(11<<2)|2,{109,105,0}}, +/* 42199 */ {(11<<2)|2,{109,105,0}}, +/* 42200 */ {(11<<2)|2,{109,105,0}}, +/* 42201 */ {(11<<2)|2,{109,105,0}}, +/* 42202 */ {(11<<2)|2,{109,105,0}}, +/* 42203 */ {(11<<2)|2,{109,105,0}}, +/* 42204 */ {(11<<2)|2,{109,105,0}}, +/* 42205 */ {(11<<2)|2,{109,105,0}}, +/* 42206 */ {(11<<2)|2,{109,105,0}}, +/* 42207 */ {(11<<2)|2,{109,105,0}}, +/* 42208 */ {(16<<2)|3,{109,111,48}}, +/* 42209 */ {(16<<2)|3,{109,111,49}}, +/* 42210 */ {(16<<2)|3,{109,111,50}}, +/* 42211 */ {(16<<2)|3,{109,111,97}}, +/* 42212 */ {(16<<2)|3,{109,111,99}}, +/* 42213 */ {(16<<2)|3,{109,111,101}}, +/* 42214 */ {(16<<2)|3,{109,111,105}}, +/* 42215 */ {(16<<2)|3,{109,111,111}}, +/* 42216 */ {(16<<2)|3,{109,111,115}}, +/* 42217 */ {(16<<2)|3,{109,111,116}}, +/* 42218 */ {(11<<2)|2,{109,111,0}}, +/* 42219 */ {(11<<2)|2,{109,111,0}}, +/* 42220 */ {(11<<2)|2,{109,111,0}}, +/* 42221 */ {(11<<2)|2,{109,111,0}}, +/* 42222 */ {(11<<2)|2,{109,111,0}}, +/* 42223 */ {(11<<2)|2,{109,111,0}}, +/* 42224 */ {(11<<2)|2,{109,111,0}}, +/* 42225 */ {(11<<2)|2,{109,111,0}}, +/* 42226 */ {(11<<2)|2,{109,111,0}}, +/* 42227 */ {(11<<2)|2,{109,111,0}}, +/* 42228 */ {(11<<2)|2,{109,111,0}}, +/* 42229 */ {(11<<2)|2,{109,111,0}}, +/* 42230 */ {(11<<2)|2,{109,111,0}}, +/* 42231 */ {(11<<2)|2,{109,111,0}}, +/* 42232 */ {(11<<2)|2,{109,111,0}}, +/* 42233 */ {(11<<2)|2,{109,111,0}}, +/* 42234 */ {(11<<2)|2,{109,111,0}}, +/* 42235 */ {(11<<2)|2,{109,111,0}}, +/* 42236 */ {(11<<2)|2,{109,111,0}}, +/* 42237 */ {(11<<2)|2,{109,111,0}}, +/* 42238 */ {(11<<2)|2,{109,111,0}}, +/* 42239 */ {(11<<2)|2,{109,111,0}}, +/* 42240 */ {(16<<2)|3,{109,115,48}}, +/* 42241 */ {(16<<2)|3,{109,115,49}}, +/* 42242 */ {(16<<2)|3,{109,115,50}}, +/* 42243 */ {(16<<2)|3,{109,115,97}}, +/* 42244 */ {(16<<2)|3,{109,115,99}}, +/* 42245 */ {(16<<2)|3,{109,115,101}}, +/* 42246 */ {(16<<2)|3,{109,115,105}}, +/* 42247 */ {(16<<2)|3,{109,115,111}}, +/* 42248 */ {(16<<2)|3,{109,115,115}}, +/* 42249 */ {(16<<2)|3,{109,115,116}}, +/* 42250 */ {(11<<2)|2,{109,115,0}}, +/* 42251 */ {(11<<2)|2,{109,115,0}}, +/* 42252 */ {(11<<2)|2,{109,115,0}}, +/* 42253 */ {(11<<2)|2,{109,115,0}}, +/* 42254 */ {(11<<2)|2,{109,115,0}}, +/* 42255 */ {(11<<2)|2,{109,115,0}}, +/* 42256 */ {(11<<2)|2,{109,115,0}}, +/* 42257 */ {(11<<2)|2,{109,115,0}}, +/* 42258 */ {(11<<2)|2,{109,115,0}}, +/* 42259 */ {(11<<2)|2,{109,115,0}}, +/* 42260 */ {(11<<2)|2,{109,115,0}}, +/* 42261 */ {(11<<2)|2,{109,115,0}}, +/* 42262 */ {(11<<2)|2,{109,115,0}}, +/* 42263 */ {(11<<2)|2,{109,115,0}}, +/* 42264 */ {(11<<2)|2,{109,115,0}}, +/* 42265 */ {(11<<2)|2,{109,115,0}}, +/* 42266 */ {(11<<2)|2,{109,115,0}}, +/* 42267 */ {(11<<2)|2,{109,115,0}}, +/* 42268 */ {(11<<2)|2,{109,115,0}}, +/* 42269 */ {(11<<2)|2,{109,115,0}}, +/* 42270 */ {(11<<2)|2,{109,115,0}}, +/* 42271 */ {(11<<2)|2,{109,115,0}}, +/* 42272 */ {(16<<2)|3,{109,116,48}}, +/* 42273 */ {(16<<2)|3,{109,116,49}}, +/* 42274 */ {(16<<2)|3,{109,116,50}}, +/* 42275 */ {(16<<2)|3,{109,116,97}}, +/* 42276 */ {(16<<2)|3,{109,116,99}}, +/* 42277 */ {(16<<2)|3,{109,116,101}}, +/* 42278 */ {(16<<2)|3,{109,116,105}}, +/* 42279 */ {(16<<2)|3,{109,116,111}}, +/* 42280 */ {(16<<2)|3,{109,116,115}}, +/* 42281 */ {(16<<2)|3,{109,116,116}}, +/* 42282 */ {(11<<2)|2,{109,116,0}}, +/* 42283 */ {(11<<2)|2,{109,116,0}}, +/* 42284 */ {(11<<2)|2,{109,116,0}}, +/* 42285 */ {(11<<2)|2,{109,116,0}}, +/* 42286 */ {(11<<2)|2,{109,116,0}}, +/* 42287 */ {(11<<2)|2,{109,116,0}}, +/* 42288 */ {(11<<2)|2,{109,116,0}}, +/* 42289 */ {(11<<2)|2,{109,116,0}}, +/* 42290 */ {(11<<2)|2,{109,116,0}}, +/* 42291 */ {(11<<2)|2,{109,116,0}}, +/* 42292 */ {(11<<2)|2,{109,116,0}}, +/* 42293 */ {(11<<2)|2,{109,116,0}}, +/* 42294 */ {(11<<2)|2,{109,116,0}}, +/* 42295 */ {(11<<2)|2,{109,116,0}}, +/* 42296 */ {(11<<2)|2,{109,116,0}}, +/* 42297 */ {(11<<2)|2,{109,116,0}}, +/* 42298 */ {(11<<2)|2,{109,116,0}}, +/* 42299 */ {(11<<2)|2,{109,116,0}}, +/* 42300 */ {(11<<2)|2,{109,116,0}}, +/* 42301 */ {(11<<2)|2,{109,116,0}}, +/* 42302 */ {(11<<2)|2,{109,116,0}}, +/* 42303 */ {(11<<2)|2,{109,116,0}}, +/* 42304 */ {(12<<2)|2,{109,32,0}}, +/* 42305 */ {(12<<2)|2,{109,32,0}}, +/* 42306 */ {(12<<2)|2,{109,32,0}}, +/* 42307 */ {(12<<2)|2,{109,32,0}}, +/* 42308 */ {(12<<2)|2,{109,32,0}}, +/* 42309 */ {(12<<2)|2,{109,32,0}}, +/* 42310 */ {(12<<2)|2,{109,32,0}}, +/* 42311 */ {(12<<2)|2,{109,32,0}}, +/* 42312 */ {(12<<2)|2,{109,32,0}}, +/* 42313 */ {(12<<2)|2,{109,32,0}}, +/* 42314 */ {(12<<2)|2,{109,32,0}}, +/* 42315 */ {(12<<2)|2,{109,32,0}}, +/* 42316 */ {(12<<2)|2,{109,32,0}}, +/* 42317 */ {(12<<2)|2,{109,32,0}}, +/* 42318 */ {(12<<2)|2,{109,32,0}}, +/* 42319 */ {(12<<2)|2,{109,32,0}}, +/* 42320 */ {(12<<2)|2,{109,37,0}}, +/* 42321 */ {(12<<2)|2,{109,37,0}}, +/* 42322 */ {(12<<2)|2,{109,37,0}}, +/* 42323 */ {(12<<2)|2,{109,37,0}}, +/* 42324 */ {(12<<2)|2,{109,37,0}}, +/* 42325 */ {(12<<2)|2,{109,37,0}}, +/* 42326 */ {(12<<2)|2,{109,37,0}}, +/* 42327 */ {(12<<2)|2,{109,37,0}}, +/* 42328 */ {(12<<2)|2,{109,37,0}}, +/* 42329 */ {(12<<2)|2,{109,37,0}}, +/* 42330 */ {(12<<2)|2,{109,37,0}}, +/* 42331 */ {(12<<2)|2,{109,37,0}}, +/* 42332 */ {(12<<2)|2,{109,37,0}}, +/* 42333 */ {(12<<2)|2,{109,37,0}}, +/* 42334 */ {(12<<2)|2,{109,37,0}}, +/* 42335 */ {(12<<2)|2,{109,37,0}}, +/* 42336 */ {(12<<2)|2,{109,45,0}}, +/* 42337 */ {(12<<2)|2,{109,45,0}}, +/* 42338 */ {(12<<2)|2,{109,45,0}}, +/* 42339 */ {(12<<2)|2,{109,45,0}}, +/* 42340 */ {(12<<2)|2,{109,45,0}}, +/* 42341 */ {(12<<2)|2,{109,45,0}}, +/* 42342 */ {(12<<2)|2,{109,45,0}}, +/* 42343 */ {(12<<2)|2,{109,45,0}}, +/* 42344 */ {(12<<2)|2,{109,45,0}}, +/* 42345 */ {(12<<2)|2,{109,45,0}}, +/* 42346 */ {(12<<2)|2,{109,45,0}}, +/* 42347 */ {(12<<2)|2,{109,45,0}}, +/* 42348 */ {(12<<2)|2,{109,45,0}}, +/* 42349 */ {(12<<2)|2,{109,45,0}}, +/* 42350 */ {(12<<2)|2,{109,45,0}}, +/* 42351 */ {(12<<2)|2,{109,45,0}}, +/* 42352 */ {(12<<2)|2,{109,46,0}}, +/* 42353 */ {(12<<2)|2,{109,46,0}}, +/* 42354 */ {(12<<2)|2,{109,46,0}}, +/* 42355 */ {(12<<2)|2,{109,46,0}}, +/* 42356 */ {(12<<2)|2,{109,46,0}}, +/* 42357 */ {(12<<2)|2,{109,46,0}}, +/* 42358 */ {(12<<2)|2,{109,46,0}}, +/* 42359 */ {(12<<2)|2,{109,46,0}}, +/* 42360 */ {(12<<2)|2,{109,46,0}}, +/* 42361 */ {(12<<2)|2,{109,46,0}}, +/* 42362 */ {(12<<2)|2,{109,46,0}}, +/* 42363 */ {(12<<2)|2,{109,46,0}}, +/* 42364 */ {(12<<2)|2,{109,46,0}}, +/* 42365 */ {(12<<2)|2,{109,46,0}}, +/* 42366 */ {(12<<2)|2,{109,46,0}}, +/* 42367 */ {(12<<2)|2,{109,46,0}}, +/* 42368 */ {(12<<2)|2,{109,47,0}}, +/* 42369 */ {(12<<2)|2,{109,47,0}}, +/* 42370 */ {(12<<2)|2,{109,47,0}}, +/* 42371 */ {(12<<2)|2,{109,47,0}}, +/* 42372 */ {(12<<2)|2,{109,47,0}}, +/* 42373 */ {(12<<2)|2,{109,47,0}}, +/* 42374 */ {(12<<2)|2,{109,47,0}}, +/* 42375 */ {(12<<2)|2,{109,47,0}}, +/* 42376 */ {(12<<2)|2,{109,47,0}}, +/* 42377 */ {(12<<2)|2,{109,47,0}}, +/* 42378 */ {(12<<2)|2,{109,47,0}}, +/* 42379 */ {(12<<2)|2,{109,47,0}}, +/* 42380 */ {(12<<2)|2,{109,47,0}}, +/* 42381 */ {(12<<2)|2,{109,47,0}}, +/* 42382 */ {(12<<2)|2,{109,47,0}}, +/* 42383 */ {(12<<2)|2,{109,47,0}}, +/* 42384 */ {(12<<2)|2,{109,51,0}}, +/* 42385 */ {(12<<2)|2,{109,51,0}}, +/* 42386 */ {(12<<2)|2,{109,51,0}}, +/* 42387 */ {(12<<2)|2,{109,51,0}}, +/* 42388 */ {(12<<2)|2,{109,51,0}}, +/* 42389 */ {(12<<2)|2,{109,51,0}}, +/* 42390 */ {(12<<2)|2,{109,51,0}}, +/* 42391 */ {(12<<2)|2,{109,51,0}}, +/* 42392 */ {(12<<2)|2,{109,51,0}}, +/* 42393 */ {(12<<2)|2,{109,51,0}}, +/* 42394 */ {(12<<2)|2,{109,51,0}}, +/* 42395 */ {(12<<2)|2,{109,51,0}}, +/* 42396 */ {(12<<2)|2,{109,51,0}}, +/* 42397 */ {(12<<2)|2,{109,51,0}}, +/* 42398 */ {(12<<2)|2,{109,51,0}}, +/* 42399 */ {(12<<2)|2,{109,51,0}}, +/* 42400 */ {(12<<2)|2,{109,52,0}}, +/* 42401 */ {(12<<2)|2,{109,52,0}}, +/* 42402 */ {(12<<2)|2,{109,52,0}}, +/* 42403 */ {(12<<2)|2,{109,52,0}}, +/* 42404 */ {(12<<2)|2,{109,52,0}}, +/* 42405 */ {(12<<2)|2,{109,52,0}}, +/* 42406 */ {(12<<2)|2,{109,52,0}}, +/* 42407 */ {(12<<2)|2,{109,52,0}}, +/* 42408 */ {(12<<2)|2,{109,52,0}}, +/* 42409 */ {(12<<2)|2,{109,52,0}}, +/* 42410 */ {(12<<2)|2,{109,52,0}}, +/* 42411 */ {(12<<2)|2,{109,52,0}}, +/* 42412 */ {(12<<2)|2,{109,52,0}}, +/* 42413 */ {(12<<2)|2,{109,52,0}}, +/* 42414 */ {(12<<2)|2,{109,52,0}}, +/* 42415 */ {(12<<2)|2,{109,52,0}}, +/* 42416 */ {(12<<2)|2,{109,53,0}}, +/* 42417 */ {(12<<2)|2,{109,53,0}}, +/* 42418 */ {(12<<2)|2,{109,53,0}}, +/* 42419 */ {(12<<2)|2,{109,53,0}}, +/* 42420 */ {(12<<2)|2,{109,53,0}}, +/* 42421 */ {(12<<2)|2,{109,53,0}}, +/* 42422 */ {(12<<2)|2,{109,53,0}}, +/* 42423 */ {(12<<2)|2,{109,53,0}}, +/* 42424 */ {(12<<2)|2,{109,53,0}}, +/* 42425 */ {(12<<2)|2,{109,53,0}}, +/* 42426 */ {(12<<2)|2,{109,53,0}}, +/* 42427 */ {(12<<2)|2,{109,53,0}}, +/* 42428 */ {(12<<2)|2,{109,53,0}}, +/* 42429 */ {(12<<2)|2,{109,53,0}}, +/* 42430 */ {(12<<2)|2,{109,53,0}}, +/* 42431 */ {(12<<2)|2,{109,53,0}}, +/* 42432 */ {(12<<2)|2,{109,54,0}}, +/* 42433 */ {(12<<2)|2,{109,54,0}}, +/* 42434 */ {(12<<2)|2,{109,54,0}}, +/* 42435 */ {(12<<2)|2,{109,54,0}}, +/* 42436 */ {(12<<2)|2,{109,54,0}}, +/* 42437 */ {(12<<2)|2,{109,54,0}}, +/* 42438 */ {(12<<2)|2,{109,54,0}}, +/* 42439 */ {(12<<2)|2,{109,54,0}}, +/* 42440 */ {(12<<2)|2,{109,54,0}}, +/* 42441 */ {(12<<2)|2,{109,54,0}}, +/* 42442 */ {(12<<2)|2,{109,54,0}}, +/* 42443 */ {(12<<2)|2,{109,54,0}}, +/* 42444 */ {(12<<2)|2,{109,54,0}}, +/* 42445 */ {(12<<2)|2,{109,54,0}}, +/* 42446 */ {(12<<2)|2,{109,54,0}}, +/* 42447 */ {(12<<2)|2,{109,54,0}}, +/* 42448 */ {(12<<2)|2,{109,55,0}}, +/* 42449 */ {(12<<2)|2,{109,55,0}}, +/* 42450 */ {(12<<2)|2,{109,55,0}}, +/* 42451 */ {(12<<2)|2,{109,55,0}}, +/* 42452 */ {(12<<2)|2,{109,55,0}}, +/* 42453 */ {(12<<2)|2,{109,55,0}}, +/* 42454 */ {(12<<2)|2,{109,55,0}}, +/* 42455 */ {(12<<2)|2,{109,55,0}}, +/* 42456 */ {(12<<2)|2,{109,55,0}}, +/* 42457 */ {(12<<2)|2,{109,55,0}}, +/* 42458 */ {(12<<2)|2,{109,55,0}}, +/* 42459 */ {(12<<2)|2,{109,55,0}}, +/* 42460 */ {(12<<2)|2,{109,55,0}}, +/* 42461 */ {(12<<2)|2,{109,55,0}}, +/* 42462 */ {(12<<2)|2,{109,55,0}}, +/* 42463 */ {(12<<2)|2,{109,55,0}}, +/* 42464 */ {(12<<2)|2,{109,56,0}}, +/* 42465 */ {(12<<2)|2,{109,56,0}}, +/* 42466 */ {(12<<2)|2,{109,56,0}}, +/* 42467 */ {(12<<2)|2,{109,56,0}}, +/* 42468 */ {(12<<2)|2,{109,56,0}}, +/* 42469 */ {(12<<2)|2,{109,56,0}}, +/* 42470 */ {(12<<2)|2,{109,56,0}}, +/* 42471 */ {(12<<2)|2,{109,56,0}}, +/* 42472 */ {(12<<2)|2,{109,56,0}}, +/* 42473 */ {(12<<2)|2,{109,56,0}}, +/* 42474 */ {(12<<2)|2,{109,56,0}}, +/* 42475 */ {(12<<2)|2,{109,56,0}}, +/* 42476 */ {(12<<2)|2,{109,56,0}}, +/* 42477 */ {(12<<2)|2,{109,56,0}}, +/* 42478 */ {(12<<2)|2,{109,56,0}}, +/* 42479 */ {(12<<2)|2,{109,56,0}}, +/* 42480 */ {(12<<2)|2,{109,57,0}}, +/* 42481 */ {(12<<2)|2,{109,57,0}}, +/* 42482 */ {(12<<2)|2,{109,57,0}}, +/* 42483 */ {(12<<2)|2,{109,57,0}}, +/* 42484 */ {(12<<2)|2,{109,57,0}}, +/* 42485 */ {(12<<2)|2,{109,57,0}}, +/* 42486 */ {(12<<2)|2,{109,57,0}}, +/* 42487 */ {(12<<2)|2,{109,57,0}}, +/* 42488 */ {(12<<2)|2,{109,57,0}}, +/* 42489 */ {(12<<2)|2,{109,57,0}}, +/* 42490 */ {(12<<2)|2,{109,57,0}}, +/* 42491 */ {(12<<2)|2,{109,57,0}}, +/* 42492 */ {(12<<2)|2,{109,57,0}}, +/* 42493 */ {(12<<2)|2,{109,57,0}}, +/* 42494 */ {(12<<2)|2,{109,57,0}}, +/* 42495 */ {(12<<2)|2,{109,57,0}}, +/* 42496 */ {(12<<2)|2,{109,61,0}}, +/* 42497 */ {(12<<2)|2,{109,61,0}}, +/* 42498 */ {(12<<2)|2,{109,61,0}}, +/* 42499 */ {(12<<2)|2,{109,61,0}}, +/* 42500 */ {(12<<2)|2,{109,61,0}}, +/* 42501 */ {(12<<2)|2,{109,61,0}}, +/* 42502 */ {(12<<2)|2,{109,61,0}}, +/* 42503 */ {(12<<2)|2,{109,61,0}}, +/* 42504 */ {(12<<2)|2,{109,61,0}}, +/* 42505 */ {(12<<2)|2,{109,61,0}}, +/* 42506 */ {(12<<2)|2,{109,61,0}}, +/* 42507 */ {(12<<2)|2,{109,61,0}}, +/* 42508 */ {(12<<2)|2,{109,61,0}}, +/* 42509 */ {(12<<2)|2,{109,61,0}}, +/* 42510 */ {(12<<2)|2,{109,61,0}}, +/* 42511 */ {(12<<2)|2,{109,61,0}}, +/* 42512 */ {(12<<2)|2,{109,65,0}}, +/* 42513 */ {(12<<2)|2,{109,65,0}}, +/* 42514 */ {(12<<2)|2,{109,65,0}}, +/* 42515 */ {(12<<2)|2,{109,65,0}}, +/* 42516 */ {(12<<2)|2,{109,65,0}}, +/* 42517 */ {(12<<2)|2,{109,65,0}}, +/* 42518 */ {(12<<2)|2,{109,65,0}}, +/* 42519 */ {(12<<2)|2,{109,65,0}}, +/* 42520 */ {(12<<2)|2,{109,65,0}}, +/* 42521 */ {(12<<2)|2,{109,65,0}}, +/* 42522 */ {(12<<2)|2,{109,65,0}}, +/* 42523 */ {(12<<2)|2,{109,65,0}}, +/* 42524 */ {(12<<2)|2,{109,65,0}}, +/* 42525 */ {(12<<2)|2,{109,65,0}}, +/* 42526 */ {(12<<2)|2,{109,65,0}}, +/* 42527 */ {(12<<2)|2,{109,65,0}}, +/* 42528 */ {(12<<2)|2,{109,95,0}}, +/* 42529 */ {(12<<2)|2,{109,95,0}}, +/* 42530 */ {(12<<2)|2,{109,95,0}}, +/* 42531 */ {(12<<2)|2,{109,95,0}}, +/* 42532 */ {(12<<2)|2,{109,95,0}}, +/* 42533 */ {(12<<2)|2,{109,95,0}}, +/* 42534 */ {(12<<2)|2,{109,95,0}}, +/* 42535 */ {(12<<2)|2,{109,95,0}}, +/* 42536 */ {(12<<2)|2,{109,95,0}}, +/* 42537 */ {(12<<2)|2,{109,95,0}}, +/* 42538 */ {(12<<2)|2,{109,95,0}}, +/* 42539 */ {(12<<2)|2,{109,95,0}}, +/* 42540 */ {(12<<2)|2,{109,95,0}}, +/* 42541 */ {(12<<2)|2,{109,95,0}}, +/* 42542 */ {(12<<2)|2,{109,95,0}}, +/* 42543 */ {(12<<2)|2,{109,95,0}}, +/* 42544 */ {(12<<2)|2,{109,98,0}}, +/* 42545 */ {(12<<2)|2,{109,98,0}}, +/* 42546 */ {(12<<2)|2,{109,98,0}}, +/* 42547 */ {(12<<2)|2,{109,98,0}}, +/* 42548 */ {(12<<2)|2,{109,98,0}}, +/* 42549 */ {(12<<2)|2,{109,98,0}}, +/* 42550 */ {(12<<2)|2,{109,98,0}}, +/* 42551 */ {(12<<2)|2,{109,98,0}}, +/* 42552 */ {(12<<2)|2,{109,98,0}}, +/* 42553 */ {(12<<2)|2,{109,98,0}}, +/* 42554 */ {(12<<2)|2,{109,98,0}}, +/* 42555 */ {(12<<2)|2,{109,98,0}}, +/* 42556 */ {(12<<2)|2,{109,98,0}}, +/* 42557 */ {(12<<2)|2,{109,98,0}}, +/* 42558 */ {(12<<2)|2,{109,98,0}}, +/* 42559 */ {(12<<2)|2,{109,98,0}}, +/* 42560 */ {(12<<2)|2,{109,100,0}}, +/* 42561 */ {(12<<2)|2,{109,100,0}}, +/* 42562 */ {(12<<2)|2,{109,100,0}}, +/* 42563 */ {(12<<2)|2,{109,100,0}}, +/* 42564 */ {(12<<2)|2,{109,100,0}}, +/* 42565 */ {(12<<2)|2,{109,100,0}}, +/* 42566 */ {(12<<2)|2,{109,100,0}}, +/* 42567 */ {(12<<2)|2,{109,100,0}}, +/* 42568 */ {(12<<2)|2,{109,100,0}}, +/* 42569 */ {(12<<2)|2,{109,100,0}}, +/* 42570 */ {(12<<2)|2,{109,100,0}}, +/* 42571 */ {(12<<2)|2,{109,100,0}}, +/* 42572 */ {(12<<2)|2,{109,100,0}}, +/* 42573 */ {(12<<2)|2,{109,100,0}}, +/* 42574 */ {(12<<2)|2,{109,100,0}}, +/* 42575 */ {(12<<2)|2,{109,100,0}}, +/* 42576 */ {(12<<2)|2,{109,102,0}}, +/* 42577 */ {(12<<2)|2,{109,102,0}}, +/* 42578 */ {(12<<2)|2,{109,102,0}}, +/* 42579 */ {(12<<2)|2,{109,102,0}}, +/* 42580 */ {(12<<2)|2,{109,102,0}}, +/* 42581 */ {(12<<2)|2,{109,102,0}}, +/* 42582 */ {(12<<2)|2,{109,102,0}}, +/* 42583 */ {(12<<2)|2,{109,102,0}}, +/* 42584 */ {(12<<2)|2,{109,102,0}}, +/* 42585 */ {(12<<2)|2,{109,102,0}}, +/* 42586 */ {(12<<2)|2,{109,102,0}}, +/* 42587 */ {(12<<2)|2,{109,102,0}}, +/* 42588 */ {(12<<2)|2,{109,102,0}}, +/* 42589 */ {(12<<2)|2,{109,102,0}}, +/* 42590 */ {(12<<2)|2,{109,102,0}}, +/* 42591 */ {(12<<2)|2,{109,102,0}}, +/* 42592 */ {(12<<2)|2,{109,103,0}}, +/* 42593 */ {(12<<2)|2,{109,103,0}}, +/* 42594 */ {(12<<2)|2,{109,103,0}}, +/* 42595 */ {(12<<2)|2,{109,103,0}}, +/* 42596 */ {(12<<2)|2,{109,103,0}}, +/* 42597 */ {(12<<2)|2,{109,103,0}}, +/* 42598 */ {(12<<2)|2,{109,103,0}}, +/* 42599 */ {(12<<2)|2,{109,103,0}}, +/* 42600 */ {(12<<2)|2,{109,103,0}}, +/* 42601 */ {(12<<2)|2,{109,103,0}}, +/* 42602 */ {(12<<2)|2,{109,103,0}}, +/* 42603 */ {(12<<2)|2,{109,103,0}}, +/* 42604 */ {(12<<2)|2,{109,103,0}}, +/* 42605 */ {(12<<2)|2,{109,103,0}}, +/* 42606 */ {(12<<2)|2,{109,103,0}}, +/* 42607 */ {(12<<2)|2,{109,103,0}}, +/* 42608 */ {(12<<2)|2,{109,104,0}}, +/* 42609 */ {(12<<2)|2,{109,104,0}}, +/* 42610 */ {(12<<2)|2,{109,104,0}}, +/* 42611 */ {(12<<2)|2,{109,104,0}}, +/* 42612 */ {(12<<2)|2,{109,104,0}}, +/* 42613 */ {(12<<2)|2,{109,104,0}}, +/* 42614 */ {(12<<2)|2,{109,104,0}}, +/* 42615 */ {(12<<2)|2,{109,104,0}}, +/* 42616 */ {(12<<2)|2,{109,104,0}}, +/* 42617 */ {(12<<2)|2,{109,104,0}}, +/* 42618 */ {(12<<2)|2,{109,104,0}}, +/* 42619 */ {(12<<2)|2,{109,104,0}}, +/* 42620 */ {(12<<2)|2,{109,104,0}}, +/* 42621 */ {(12<<2)|2,{109,104,0}}, +/* 42622 */ {(12<<2)|2,{109,104,0}}, +/* 42623 */ {(12<<2)|2,{109,104,0}}, +/* 42624 */ {(12<<2)|2,{109,108,0}}, +/* 42625 */ {(12<<2)|2,{109,108,0}}, +/* 42626 */ {(12<<2)|2,{109,108,0}}, +/* 42627 */ {(12<<2)|2,{109,108,0}}, +/* 42628 */ {(12<<2)|2,{109,108,0}}, +/* 42629 */ {(12<<2)|2,{109,108,0}}, +/* 42630 */ {(12<<2)|2,{109,108,0}}, +/* 42631 */ {(12<<2)|2,{109,108,0}}, +/* 42632 */ {(12<<2)|2,{109,108,0}}, +/* 42633 */ {(12<<2)|2,{109,108,0}}, +/* 42634 */ {(12<<2)|2,{109,108,0}}, +/* 42635 */ {(12<<2)|2,{109,108,0}}, +/* 42636 */ {(12<<2)|2,{109,108,0}}, +/* 42637 */ {(12<<2)|2,{109,108,0}}, +/* 42638 */ {(12<<2)|2,{109,108,0}}, +/* 42639 */ {(12<<2)|2,{109,108,0}}, +/* 42640 */ {(12<<2)|2,{109,109,0}}, +/* 42641 */ {(12<<2)|2,{109,109,0}}, +/* 42642 */ {(12<<2)|2,{109,109,0}}, +/* 42643 */ {(12<<2)|2,{109,109,0}}, +/* 42644 */ {(12<<2)|2,{109,109,0}}, +/* 42645 */ {(12<<2)|2,{109,109,0}}, +/* 42646 */ {(12<<2)|2,{109,109,0}}, +/* 42647 */ {(12<<2)|2,{109,109,0}}, +/* 42648 */ {(12<<2)|2,{109,109,0}}, +/* 42649 */ {(12<<2)|2,{109,109,0}}, +/* 42650 */ {(12<<2)|2,{109,109,0}}, +/* 42651 */ {(12<<2)|2,{109,109,0}}, +/* 42652 */ {(12<<2)|2,{109,109,0}}, +/* 42653 */ {(12<<2)|2,{109,109,0}}, +/* 42654 */ {(12<<2)|2,{109,109,0}}, +/* 42655 */ {(12<<2)|2,{109,109,0}}, +/* 42656 */ {(12<<2)|2,{109,110,0}}, +/* 42657 */ {(12<<2)|2,{109,110,0}}, +/* 42658 */ {(12<<2)|2,{109,110,0}}, +/* 42659 */ {(12<<2)|2,{109,110,0}}, +/* 42660 */ {(12<<2)|2,{109,110,0}}, +/* 42661 */ {(12<<2)|2,{109,110,0}}, +/* 42662 */ {(12<<2)|2,{109,110,0}}, +/* 42663 */ {(12<<2)|2,{109,110,0}}, +/* 42664 */ {(12<<2)|2,{109,110,0}}, +/* 42665 */ {(12<<2)|2,{109,110,0}}, +/* 42666 */ {(12<<2)|2,{109,110,0}}, +/* 42667 */ {(12<<2)|2,{109,110,0}}, +/* 42668 */ {(12<<2)|2,{109,110,0}}, +/* 42669 */ {(12<<2)|2,{109,110,0}}, +/* 42670 */ {(12<<2)|2,{109,110,0}}, +/* 42671 */ {(12<<2)|2,{109,110,0}}, +/* 42672 */ {(12<<2)|2,{109,112,0}}, +/* 42673 */ {(12<<2)|2,{109,112,0}}, +/* 42674 */ {(12<<2)|2,{109,112,0}}, +/* 42675 */ {(12<<2)|2,{109,112,0}}, +/* 42676 */ {(12<<2)|2,{109,112,0}}, +/* 42677 */ {(12<<2)|2,{109,112,0}}, +/* 42678 */ {(12<<2)|2,{109,112,0}}, +/* 42679 */ {(12<<2)|2,{109,112,0}}, +/* 42680 */ {(12<<2)|2,{109,112,0}}, +/* 42681 */ {(12<<2)|2,{109,112,0}}, +/* 42682 */ {(12<<2)|2,{109,112,0}}, +/* 42683 */ {(12<<2)|2,{109,112,0}}, +/* 42684 */ {(12<<2)|2,{109,112,0}}, +/* 42685 */ {(12<<2)|2,{109,112,0}}, +/* 42686 */ {(12<<2)|2,{109,112,0}}, +/* 42687 */ {(12<<2)|2,{109,112,0}}, +/* 42688 */ {(12<<2)|2,{109,114,0}}, +/* 42689 */ {(12<<2)|2,{109,114,0}}, +/* 42690 */ {(12<<2)|2,{109,114,0}}, +/* 42691 */ {(12<<2)|2,{109,114,0}}, +/* 42692 */ {(12<<2)|2,{109,114,0}}, +/* 42693 */ {(12<<2)|2,{109,114,0}}, +/* 42694 */ {(12<<2)|2,{109,114,0}}, +/* 42695 */ {(12<<2)|2,{109,114,0}}, +/* 42696 */ {(12<<2)|2,{109,114,0}}, +/* 42697 */ {(12<<2)|2,{109,114,0}}, +/* 42698 */ {(12<<2)|2,{109,114,0}}, +/* 42699 */ {(12<<2)|2,{109,114,0}}, +/* 42700 */ {(12<<2)|2,{109,114,0}}, +/* 42701 */ {(12<<2)|2,{109,114,0}}, +/* 42702 */ {(12<<2)|2,{109,114,0}}, +/* 42703 */ {(12<<2)|2,{109,114,0}}, +/* 42704 */ {(12<<2)|2,{109,117,0}}, +/* 42705 */ {(12<<2)|2,{109,117,0}}, +/* 42706 */ {(12<<2)|2,{109,117,0}}, +/* 42707 */ {(12<<2)|2,{109,117,0}}, +/* 42708 */ {(12<<2)|2,{109,117,0}}, +/* 42709 */ {(12<<2)|2,{109,117,0}}, +/* 42710 */ {(12<<2)|2,{109,117,0}}, +/* 42711 */ {(12<<2)|2,{109,117,0}}, +/* 42712 */ {(12<<2)|2,{109,117,0}}, +/* 42713 */ {(12<<2)|2,{109,117,0}}, +/* 42714 */ {(12<<2)|2,{109,117,0}}, +/* 42715 */ {(12<<2)|2,{109,117,0}}, +/* 42716 */ {(12<<2)|2,{109,117,0}}, +/* 42717 */ {(12<<2)|2,{109,117,0}}, +/* 42718 */ {(12<<2)|2,{109,117,0}}, +/* 42719 */ {(12<<2)|2,{109,117,0}}, +/* 42720 */ {(13<<2)|2,{109,58,0}}, +/* 42721 */ {(13<<2)|2,{109,58,0}}, +/* 42722 */ {(13<<2)|2,{109,58,0}}, +/* 42723 */ {(13<<2)|2,{109,58,0}}, +/* 42724 */ {(13<<2)|2,{109,58,0}}, +/* 42725 */ {(13<<2)|2,{109,58,0}}, +/* 42726 */ {(13<<2)|2,{109,58,0}}, +/* 42727 */ {(13<<2)|2,{109,58,0}}, +/* 42728 */ {(13<<2)|2,{109,66,0}}, +/* 42729 */ {(13<<2)|2,{109,66,0}}, +/* 42730 */ {(13<<2)|2,{109,66,0}}, +/* 42731 */ {(13<<2)|2,{109,66,0}}, +/* 42732 */ {(13<<2)|2,{109,66,0}}, +/* 42733 */ {(13<<2)|2,{109,66,0}}, +/* 42734 */ {(13<<2)|2,{109,66,0}}, +/* 42735 */ {(13<<2)|2,{109,66,0}}, +/* 42736 */ {(13<<2)|2,{109,67,0}}, +/* 42737 */ {(13<<2)|2,{109,67,0}}, +/* 42738 */ {(13<<2)|2,{109,67,0}}, +/* 42739 */ {(13<<2)|2,{109,67,0}}, +/* 42740 */ {(13<<2)|2,{109,67,0}}, +/* 42741 */ {(13<<2)|2,{109,67,0}}, +/* 42742 */ {(13<<2)|2,{109,67,0}}, +/* 42743 */ {(13<<2)|2,{109,67,0}}, +/* 42744 */ {(13<<2)|2,{109,68,0}}, +/* 42745 */ {(13<<2)|2,{109,68,0}}, +/* 42746 */ {(13<<2)|2,{109,68,0}}, +/* 42747 */ {(13<<2)|2,{109,68,0}}, +/* 42748 */ {(13<<2)|2,{109,68,0}}, +/* 42749 */ {(13<<2)|2,{109,68,0}}, +/* 42750 */ {(13<<2)|2,{109,68,0}}, +/* 42751 */ {(13<<2)|2,{109,68,0}}, +/* 42752 */ {(13<<2)|2,{109,69,0}}, +/* 42753 */ {(13<<2)|2,{109,69,0}}, +/* 42754 */ {(13<<2)|2,{109,69,0}}, +/* 42755 */ {(13<<2)|2,{109,69,0}}, +/* 42756 */ {(13<<2)|2,{109,69,0}}, +/* 42757 */ {(13<<2)|2,{109,69,0}}, +/* 42758 */ {(13<<2)|2,{109,69,0}}, +/* 42759 */ {(13<<2)|2,{109,69,0}}, +/* 42760 */ {(13<<2)|2,{109,70,0}}, +/* 42761 */ {(13<<2)|2,{109,70,0}}, +/* 42762 */ {(13<<2)|2,{109,70,0}}, +/* 42763 */ {(13<<2)|2,{109,70,0}}, +/* 42764 */ {(13<<2)|2,{109,70,0}}, +/* 42765 */ {(13<<2)|2,{109,70,0}}, +/* 42766 */ {(13<<2)|2,{109,70,0}}, +/* 42767 */ {(13<<2)|2,{109,70,0}}, +/* 42768 */ {(13<<2)|2,{109,71,0}}, +/* 42769 */ {(13<<2)|2,{109,71,0}}, +/* 42770 */ {(13<<2)|2,{109,71,0}}, +/* 42771 */ {(13<<2)|2,{109,71,0}}, +/* 42772 */ {(13<<2)|2,{109,71,0}}, +/* 42773 */ {(13<<2)|2,{109,71,0}}, +/* 42774 */ {(13<<2)|2,{109,71,0}}, +/* 42775 */ {(13<<2)|2,{109,71,0}}, +/* 42776 */ {(13<<2)|2,{109,72,0}}, +/* 42777 */ {(13<<2)|2,{109,72,0}}, +/* 42778 */ {(13<<2)|2,{109,72,0}}, +/* 42779 */ {(13<<2)|2,{109,72,0}}, +/* 42780 */ {(13<<2)|2,{109,72,0}}, +/* 42781 */ {(13<<2)|2,{109,72,0}}, +/* 42782 */ {(13<<2)|2,{109,72,0}}, +/* 42783 */ {(13<<2)|2,{109,72,0}}, +/* 42784 */ {(13<<2)|2,{109,73,0}}, +/* 42785 */ {(13<<2)|2,{109,73,0}}, +/* 42786 */ {(13<<2)|2,{109,73,0}}, +/* 42787 */ {(13<<2)|2,{109,73,0}}, +/* 42788 */ {(13<<2)|2,{109,73,0}}, +/* 42789 */ {(13<<2)|2,{109,73,0}}, +/* 42790 */ {(13<<2)|2,{109,73,0}}, +/* 42791 */ {(13<<2)|2,{109,73,0}}, +/* 42792 */ {(13<<2)|2,{109,74,0}}, +/* 42793 */ {(13<<2)|2,{109,74,0}}, +/* 42794 */ {(13<<2)|2,{109,74,0}}, +/* 42795 */ {(13<<2)|2,{109,74,0}}, +/* 42796 */ {(13<<2)|2,{109,74,0}}, +/* 42797 */ {(13<<2)|2,{109,74,0}}, +/* 42798 */ {(13<<2)|2,{109,74,0}}, +/* 42799 */ {(13<<2)|2,{109,74,0}}, +/* 42800 */ {(13<<2)|2,{109,75,0}}, +/* 42801 */ {(13<<2)|2,{109,75,0}}, +/* 42802 */ {(13<<2)|2,{109,75,0}}, +/* 42803 */ {(13<<2)|2,{109,75,0}}, +/* 42804 */ {(13<<2)|2,{109,75,0}}, +/* 42805 */ {(13<<2)|2,{109,75,0}}, +/* 42806 */ {(13<<2)|2,{109,75,0}}, +/* 42807 */ {(13<<2)|2,{109,75,0}}, +/* 42808 */ {(13<<2)|2,{109,76,0}}, +/* 42809 */ {(13<<2)|2,{109,76,0}}, +/* 42810 */ {(13<<2)|2,{109,76,0}}, +/* 42811 */ {(13<<2)|2,{109,76,0}}, +/* 42812 */ {(13<<2)|2,{109,76,0}}, +/* 42813 */ {(13<<2)|2,{109,76,0}}, +/* 42814 */ {(13<<2)|2,{109,76,0}}, +/* 42815 */ {(13<<2)|2,{109,76,0}}, +/* 42816 */ {(13<<2)|2,{109,77,0}}, +/* 42817 */ {(13<<2)|2,{109,77,0}}, +/* 42818 */ {(13<<2)|2,{109,77,0}}, +/* 42819 */ {(13<<2)|2,{109,77,0}}, +/* 42820 */ {(13<<2)|2,{109,77,0}}, +/* 42821 */ {(13<<2)|2,{109,77,0}}, +/* 42822 */ {(13<<2)|2,{109,77,0}}, +/* 42823 */ {(13<<2)|2,{109,77,0}}, +/* 42824 */ {(13<<2)|2,{109,78,0}}, +/* 42825 */ {(13<<2)|2,{109,78,0}}, +/* 42826 */ {(13<<2)|2,{109,78,0}}, +/* 42827 */ {(13<<2)|2,{109,78,0}}, +/* 42828 */ {(13<<2)|2,{109,78,0}}, +/* 42829 */ {(13<<2)|2,{109,78,0}}, +/* 42830 */ {(13<<2)|2,{109,78,0}}, +/* 42831 */ {(13<<2)|2,{109,78,0}}, +/* 42832 */ {(13<<2)|2,{109,79,0}}, +/* 42833 */ {(13<<2)|2,{109,79,0}}, +/* 42834 */ {(13<<2)|2,{109,79,0}}, +/* 42835 */ {(13<<2)|2,{109,79,0}}, +/* 42836 */ {(13<<2)|2,{109,79,0}}, +/* 42837 */ {(13<<2)|2,{109,79,0}}, +/* 42838 */ {(13<<2)|2,{109,79,0}}, +/* 42839 */ {(13<<2)|2,{109,79,0}}, +/* 42840 */ {(13<<2)|2,{109,80,0}}, +/* 42841 */ {(13<<2)|2,{109,80,0}}, +/* 42842 */ {(13<<2)|2,{109,80,0}}, +/* 42843 */ {(13<<2)|2,{109,80,0}}, +/* 42844 */ {(13<<2)|2,{109,80,0}}, +/* 42845 */ {(13<<2)|2,{109,80,0}}, +/* 42846 */ {(13<<2)|2,{109,80,0}}, +/* 42847 */ {(13<<2)|2,{109,80,0}}, +/* 42848 */ {(13<<2)|2,{109,81,0}}, +/* 42849 */ {(13<<2)|2,{109,81,0}}, +/* 42850 */ {(13<<2)|2,{109,81,0}}, +/* 42851 */ {(13<<2)|2,{109,81,0}}, +/* 42852 */ {(13<<2)|2,{109,81,0}}, +/* 42853 */ {(13<<2)|2,{109,81,0}}, +/* 42854 */ {(13<<2)|2,{109,81,0}}, +/* 42855 */ {(13<<2)|2,{109,81,0}}, +/* 42856 */ {(13<<2)|2,{109,82,0}}, +/* 42857 */ {(13<<2)|2,{109,82,0}}, +/* 42858 */ {(13<<2)|2,{109,82,0}}, +/* 42859 */ {(13<<2)|2,{109,82,0}}, +/* 42860 */ {(13<<2)|2,{109,82,0}}, +/* 42861 */ {(13<<2)|2,{109,82,0}}, +/* 42862 */ {(13<<2)|2,{109,82,0}}, +/* 42863 */ {(13<<2)|2,{109,82,0}}, +/* 42864 */ {(13<<2)|2,{109,83,0}}, +/* 42865 */ {(13<<2)|2,{109,83,0}}, +/* 42866 */ {(13<<2)|2,{109,83,0}}, +/* 42867 */ {(13<<2)|2,{109,83,0}}, +/* 42868 */ {(13<<2)|2,{109,83,0}}, +/* 42869 */ {(13<<2)|2,{109,83,0}}, +/* 42870 */ {(13<<2)|2,{109,83,0}}, +/* 42871 */ {(13<<2)|2,{109,83,0}}, +/* 42872 */ {(13<<2)|2,{109,84,0}}, +/* 42873 */ {(13<<2)|2,{109,84,0}}, +/* 42874 */ {(13<<2)|2,{109,84,0}}, +/* 42875 */ {(13<<2)|2,{109,84,0}}, +/* 42876 */ {(13<<2)|2,{109,84,0}}, +/* 42877 */ {(13<<2)|2,{109,84,0}}, +/* 42878 */ {(13<<2)|2,{109,84,0}}, +/* 42879 */ {(13<<2)|2,{109,84,0}}, +/* 42880 */ {(13<<2)|2,{109,85,0}}, +/* 42881 */ {(13<<2)|2,{109,85,0}}, +/* 42882 */ {(13<<2)|2,{109,85,0}}, +/* 42883 */ {(13<<2)|2,{109,85,0}}, +/* 42884 */ {(13<<2)|2,{109,85,0}}, +/* 42885 */ {(13<<2)|2,{109,85,0}}, +/* 42886 */ {(13<<2)|2,{109,85,0}}, +/* 42887 */ {(13<<2)|2,{109,85,0}}, +/* 42888 */ {(13<<2)|2,{109,86,0}}, +/* 42889 */ {(13<<2)|2,{109,86,0}}, +/* 42890 */ {(13<<2)|2,{109,86,0}}, +/* 42891 */ {(13<<2)|2,{109,86,0}}, +/* 42892 */ {(13<<2)|2,{109,86,0}}, +/* 42893 */ {(13<<2)|2,{109,86,0}}, +/* 42894 */ {(13<<2)|2,{109,86,0}}, +/* 42895 */ {(13<<2)|2,{109,86,0}}, +/* 42896 */ {(13<<2)|2,{109,87,0}}, +/* 42897 */ {(13<<2)|2,{109,87,0}}, +/* 42898 */ {(13<<2)|2,{109,87,0}}, +/* 42899 */ {(13<<2)|2,{109,87,0}}, +/* 42900 */ {(13<<2)|2,{109,87,0}}, +/* 42901 */ {(13<<2)|2,{109,87,0}}, +/* 42902 */ {(13<<2)|2,{109,87,0}}, +/* 42903 */ {(13<<2)|2,{109,87,0}}, +/* 42904 */ {(13<<2)|2,{109,89,0}}, +/* 42905 */ {(13<<2)|2,{109,89,0}}, +/* 42906 */ {(13<<2)|2,{109,89,0}}, +/* 42907 */ {(13<<2)|2,{109,89,0}}, +/* 42908 */ {(13<<2)|2,{109,89,0}}, +/* 42909 */ {(13<<2)|2,{109,89,0}}, +/* 42910 */ {(13<<2)|2,{109,89,0}}, +/* 42911 */ {(13<<2)|2,{109,89,0}}, +/* 42912 */ {(13<<2)|2,{109,106,0}}, +/* 42913 */ {(13<<2)|2,{109,106,0}}, +/* 42914 */ {(13<<2)|2,{109,106,0}}, +/* 42915 */ {(13<<2)|2,{109,106,0}}, +/* 42916 */ {(13<<2)|2,{109,106,0}}, +/* 42917 */ {(13<<2)|2,{109,106,0}}, +/* 42918 */ {(13<<2)|2,{109,106,0}}, +/* 42919 */ {(13<<2)|2,{109,106,0}}, +/* 42920 */ {(13<<2)|2,{109,107,0}}, +/* 42921 */ {(13<<2)|2,{109,107,0}}, +/* 42922 */ {(13<<2)|2,{109,107,0}}, +/* 42923 */ {(13<<2)|2,{109,107,0}}, +/* 42924 */ {(13<<2)|2,{109,107,0}}, +/* 42925 */ {(13<<2)|2,{109,107,0}}, +/* 42926 */ {(13<<2)|2,{109,107,0}}, +/* 42927 */ {(13<<2)|2,{109,107,0}}, +/* 42928 */ {(13<<2)|2,{109,113,0}}, +/* 42929 */ {(13<<2)|2,{109,113,0}}, +/* 42930 */ {(13<<2)|2,{109,113,0}}, +/* 42931 */ {(13<<2)|2,{109,113,0}}, +/* 42932 */ {(13<<2)|2,{109,113,0}}, +/* 42933 */ {(13<<2)|2,{109,113,0}}, +/* 42934 */ {(13<<2)|2,{109,113,0}}, +/* 42935 */ {(13<<2)|2,{109,113,0}}, +/* 42936 */ {(13<<2)|2,{109,118,0}}, +/* 42937 */ {(13<<2)|2,{109,118,0}}, +/* 42938 */ {(13<<2)|2,{109,118,0}}, +/* 42939 */ {(13<<2)|2,{109,118,0}}, +/* 42940 */ {(13<<2)|2,{109,118,0}}, +/* 42941 */ {(13<<2)|2,{109,118,0}}, +/* 42942 */ {(13<<2)|2,{109,118,0}}, +/* 42943 */ {(13<<2)|2,{109,118,0}}, +/* 42944 */ {(13<<2)|2,{109,119,0}}, +/* 42945 */ {(13<<2)|2,{109,119,0}}, +/* 42946 */ {(13<<2)|2,{109,119,0}}, +/* 42947 */ {(13<<2)|2,{109,119,0}}, +/* 42948 */ {(13<<2)|2,{109,119,0}}, +/* 42949 */ {(13<<2)|2,{109,119,0}}, +/* 42950 */ {(13<<2)|2,{109,119,0}}, +/* 42951 */ {(13<<2)|2,{109,119,0}}, +/* 42952 */ {(13<<2)|2,{109,120,0}}, +/* 42953 */ {(13<<2)|2,{109,120,0}}, +/* 42954 */ {(13<<2)|2,{109,120,0}}, +/* 42955 */ {(13<<2)|2,{109,120,0}}, +/* 42956 */ {(13<<2)|2,{109,120,0}}, +/* 42957 */ {(13<<2)|2,{109,120,0}}, +/* 42958 */ {(13<<2)|2,{109,120,0}}, +/* 42959 */ {(13<<2)|2,{109,120,0}}, +/* 42960 */ {(13<<2)|2,{109,121,0}}, +/* 42961 */ {(13<<2)|2,{109,121,0}}, +/* 42962 */ {(13<<2)|2,{109,121,0}}, +/* 42963 */ {(13<<2)|2,{109,121,0}}, +/* 42964 */ {(13<<2)|2,{109,121,0}}, +/* 42965 */ {(13<<2)|2,{109,121,0}}, +/* 42966 */ {(13<<2)|2,{109,121,0}}, +/* 42967 */ {(13<<2)|2,{109,121,0}}, +/* 42968 */ {(13<<2)|2,{109,122,0}}, +/* 42969 */ {(13<<2)|2,{109,122,0}}, +/* 42970 */ {(13<<2)|2,{109,122,0}}, +/* 42971 */ {(13<<2)|2,{109,122,0}}, +/* 42972 */ {(13<<2)|2,{109,122,0}}, +/* 42973 */ {(13<<2)|2,{109,122,0}}, +/* 42974 */ {(13<<2)|2,{109,122,0}}, +/* 42975 */ {(13<<2)|2,{109,122,0}}, +/* 42976 */ {(14<<2)|2,{109,38,0}}, +/* 42977 */ {(14<<2)|2,{109,38,0}}, +/* 42978 */ {(14<<2)|2,{109,38,0}}, +/* 42979 */ {(14<<2)|2,{109,38,0}}, +/* 42980 */ {(14<<2)|2,{109,42,0}}, +/* 42981 */ {(14<<2)|2,{109,42,0}}, +/* 42982 */ {(14<<2)|2,{109,42,0}}, +/* 42983 */ {(14<<2)|2,{109,42,0}}, +/* 42984 */ {(14<<2)|2,{109,44,0}}, +/* 42985 */ {(14<<2)|2,{109,44,0}}, +/* 42986 */ {(14<<2)|2,{109,44,0}}, +/* 42987 */ {(14<<2)|2,{109,44,0}}, +/* 42988 */ {(14<<2)|2,{109,59,0}}, +/* 42989 */ {(14<<2)|2,{109,59,0}}, +/* 42990 */ {(14<<2)|2,{109,59,0}}, +/* 42991 */ {(14<<2)|2,{109,59,0}}, +/* 42992 */ {(14<<2)|2,{109,88,0}}, +/* 42993 */ {(14<<2)|2,{109,88,0}}, +/* 42994 */ {(14<<2)|2,{109,88,0}}, +/* 42995 */ {(14<<2)|2,{109,88,0}}, +/* 42996 */ {(14<<2)|2,{109,90,0}}, +/* 42997 */ {(14<<2)|2,{109,90,0}}, +/* 42998 */ {(14<<2)|2,{109,90,0}}, +/* 42999 */ {(14<<2)|2,{109,90,0}}, +/* 43000 */ {(16<<2)|2,{109,33,0}}, +/* 43001 */ {(16<<2)|2,{109,34,0}}, +/* 43002 */ {(16<<2)|2,{109,40,0}}, +/* 43003 */ {(16<<2)|2,{109,41,0}}, +/* 43004 */ {(16<<2)|2,{109,63,0}}, +/* 43005 */ {(6<<2)|1,{109,0,0}}, +/* 43006 */ {(6<<2)|1,{109,0,0}}, +/* 43007 */ {(6<<2)|1,{109,0,0}}, +/* 43008 */ {(16<<2)|3,{110,48,48}}, +/* 43009 */ {(16<<2)|3,{110,48,49}}, +/* 43010 */ {(16<<2)|3,{110,48,50}}, +/* 43011 */ {(16<<2)|3,{110,48,97}}, +/* 43012 */ {(16<<2)|3,{110,48,99}}, +/* 43013 */ {(16<<2)|3,{110,48,101}}, +/* 43014 */ {(16<<2)|3,{110,48,105}}, +/* 43015 */ {(16<<2)|3,{110,48,111}}, +/* 43016 */ {(16<<2)|3,{110,48,115}}, +/* 43017 */ {(16<<2)|3,{110,48,116}}, +/* 43018 */ {(11<<2)|2,{110,48,0}}, +/* 43019 */ {(11<<2)|2,{110,48,0}}, +/* 43020 */ {(11<<2)|2,{110,48,0}}, +/* 43021 */ {(11<<2)|2,{110,48,0}}, +/* 43022 */ {(11<<2)|2,{110,48,0}}, +/* 43023 */ {(11<<2)|2,{110,48,0}}, +/* 43024 */ {(11<<2)|2,{110,48,0}}, +/* 43025 */ {(11<<2)|2,{110,48,0}}, +/* 43026 */ {(11<<2)|2,{110,48,0}}, +/* 43027 */ {(11<<2)|2,{110,48,0}}, +/* 43028 */ {(11<<2)|2,{110,48,0}}, +/* 43029 */ {(11<<2)|2,{110,48,0}}, +/* 43030 */ {(11<<2)|2,{110,48,0}}, +/* 43031 */ {(11<<2)|2,{110,48,0}}, +/* 43032 */ {(11<<2)|2,{110,48,0}}, +/* 43033 */ {(11<<2)|2,{110,48,0}}, +/* 43034 */ {(11<<2)|2,{110,48,0}}, +/* 43035 */ {(11<<2)|2,{110,48,0}}, +/* 43036 */ {(11<<2)|2,{110,48,0}}, +/* 43037 */ {(11<<2)|2,{110,48,0}}, +/* 43038 */ {(11<<2)|2,{110,48,0}}, +/* 43039 */ {(11<<2)|2,{110,48,0}}, +/* 43040 */ {(16<<2)|3,{110,49,48}}, +/* 43041 */ {(16<<2)|3,{110,49,49}}, +/* 43042 */ {(16<<2)|3,{110,49,50}}, +/* 43043 */ {(16<<2)|3,{110,49,97}}, +/* 43044 */ {(16<<2)|3,{110,49,99}}, +/* 43045 */ {(16<<2)|3,{110,49,101}}, +/* 43046 */ {(16<<2)|3,{110,49,105}}, +/* 43047 */ {(16<<2)|3,{110,49,111}}, +/* 43048 */ {(16<<2)|3,{110,49,115}}, +/* 43049 */ {(16<<2)|3,{110,49,116}}, +/* 43050 */ {(11<<2)|2,{110,49,0}}, +/* 43051 */ {(11<<2)|2,{110,49,0}}, +/* 43052 */ {(11<<2)|2,{110,49,0}}, +/* 43053 */ {(11<<2)|2,{110,49,0}}, +/* 43054 */ {(11<<2)|2,{110,49,0}}, +/* 43055 */ {(11<<2)|2,{110,49,0}}, +/* 43056 */ {(11<<2)|2,{110,49,0}}, +/* 43057 */ {(11<<2)|2,{110,49,0}}, +/* 43058 */ {(11<<2)|2,{110,49,0}}, +/* 43059 */ {(11<<2)|2,{110,49,0}}, +/* 43060 */ {(11<<2)|2,{110,49,0}}, +/* 43061 */ {(11<<2)|2,{110,49,0}}, +/* 43062 */ {(11<<2)|2,{110,49,0}}, +/* 43063 */ {(11<<2)|2,{110,49,0}}, +/* 43064 */ {(11<<2)|2,{110,49,0}}, +/* 43065 */ {(11<<2)|2,{110,49,0}}, +/* 43066 */ {(11<<2)|2,{110,49,0}}, +/* 43067 */ {(11<<2)|2,{110,49,0}}, +/* 43068 */ {(11<<2)|2,{110,49,0}}, +/* 43069 */ {(11<<2)|2,{110,49,0}}, +/* 43070 */ {(11<<2)|2,{110,49,0}}, +/* 43071 */ {(11<<2)|2,{110,49,0}}, +/* 43072 */ {(16<<2)|3,{110,50,48}}, +/* 43073 */ {(16<<2)|3,{110,50,49}}, +/* 43074 */ {(16<<2)|3,{110,50,50}}, +/* 43075 */ {(16<<2)|3,{110,50,97}}, +/* 43076 */ {(16<<2)|3,{110,50,99}}, +/* 43077 */ {(16<<2)|3,{110,50,101}}, +/* 43078 */ {(16<<2)|3,{110,50,105}}, +/* 43079 */ {(16<<2)|3,{110,50,111}}, +/* 43080 */ {(16<<2)|3,{110,50,115}}, +/* 43081 */ {(16<<2)|3,{110,50,116}}, +/* 43082 */ {(11<<2)|2,{110,50,0}}, +/* 43083 */ {(11<<2)|2,{110,50,0}}, +/* 43084 */ {(11<<2)|2,{110,50,0}}, +/* 43085 */ {(11<<2)|2,{110,50,0}}, +/* 43086 */ {(11<<2)|2,{110,50,0}}, +/* 43087 */ {(11<<2)|2,{110,50,0}}, +/* 43088 */ {(11<<2)|2,{110,50,0}}, +/* 43089 */ {(11<<2)|2,{110,50,0}}, +/* 43090 */ {(11<<2)|2,{110,50,0}}, +/* 43091 */ {(11<<2)|2,{110,50,0}}, +/* 43092 */ {(11<<2)|2,{110,50,0}}, +/* 43093 */ {(11<<2)|2,{110,50,0}}, +/* 43094 */ {(11<<2)|2,{110,50,0}}, +/* 43095 */ {(11<<2)|2,{110,50,0}}, +/* 43096 */ {(11<<2)|2,{110,50,0}}, +/* 43097 */ {(11<<2)|2,{110,50,0}}, +/* 43098 */ {(11<<2)|2,{110,50,0}}, +/* 43099 */ {(11<<2)|2,{110,50,0}}, +/* 43100 */ {(11<<2)|2,{110,50,0}}, +/* 43101 */ {(11<<2)|2,{110,50,0}}, +/* 43102 */ {(11<<2)|2,{110,50,0}}, +/* 43103 */ {(11<<2)|2,{110,50,0}}, +/* 43104 */ {(16<<2)|3,{110,97,48}}, +/* 43105 */ {(16<<2)|3,{110,97,49}}, +/* 43106 */ {(16<<2)|3,{110,97,50}}, +/* 43107 */ {(16<<2)|3,{110,97,97}}, +/* 43108 */ {(16<<2)|3,{110,97,99}}, +/* 43109 */ {(16<<2)|3,{110,97,101}}, +/* 43110 */ {(16<<2)|3,{110,97,105}}, +/* 43111 */ {(16<<2)|3,{110,97,111}}, +/* 43112 */ {(16<<2)|3,{110,97,115}}, +/* 43113 */ {(16<<2)|3,{110,97,116}}, +/* 43114 */ {(11<<2)|2,{110,97,0}}, +/* 43115 */ {(11<<2)|2,{110,97,0}}, +/* 43116 */ {(11<<2)|2,{110,97,0}}, +/* 43117 */ {(11<<2)|2,{110,97,0}}, +/* 43118 */ {(11<<2)|2,{110,97,0}}, +/* 43119 */ {(11<<2)|2,{110,97,0}}, +/* 43120 */ {(11<<2)|2,{110,97,0}}, +/* 43121 */ {(11<<2)|2,{110,97,0}}, +/* 43122 */ {(11<<2)|2,{110,97,0}}, +/* 43123 */ {(11<<2)|2,{110,97,0}}, +/* 43124 */ {(11<<2)|2,{110,97,0}}, +/* 43125 */ {(11<<2)|2,{110,97,0}}, +/* 43126 */ {(11<<2)|2,{110,97,0}}, +/* 43127 */ {(11<<2)|2,{110,97,0}}, +/* 43128 */ {(11<<2)|2,{110,97,0}}, +/* 43129 */ {(11<<2)|2,{110,97,0}}, +/* 43130 */ {(11<<2)|2,{110,97,0}}, +/* 43131 */ {(11<<2)|2,{110,97,0}}, +/* 43132 */ {(11<<2)|2,{110,97,0}}, +/* 43133 */ {(11<<2)|2,{110,97,0}}, +/* 43134 */ {(11<<2)|2,{110,97,0}}, +/* 43135 */ {(11<<2)|2,{110,97,0}}, +/* 43136 */ {(16<<2)|3,{110,99,48}}, +/* 43137 */ {(16<<2)|3,{110,99,49}}, +/* 43138 */ {(16<<2)|3,{110,99,50}}, +/* 43139 */ {(16<<2)|3,{110,99,97}}, +/* 43140 */ {(16<<2)|3,{110,99,99}}, +/* 43141 */ {(16<<2)|3,{110,99,101}}, +/* 43142 */ {(16<<2)|3,{110,99,105}}, +/* 43143 */ {(16<<2)|3,{110,99,111}}, +/* 43144 */ {(16<<2)|3,{110,99,115}}, +/* 43145 */ {(16<<2)|3,{110,99,116}}, +/* 43146 */ {(11<<2)|2,{110,99,0}}, +/* 43147 */ {(11<<2)|2,{110,99,0}}, +/* 43148 */ {(11<<2)|2,{110,99,0}}, +/* 43149 */ {(11<<2)|2,{110,99,0}}, +/* 43150 */ {(11<<2)|2,{110,99,0}}, +/* 43151 */ {(11<<2)|2,{110,99,0}}, +/* 43152 */ {(11<<2)|2,{110,99,0}}, +/* 43153 */ {(11<<2)|2,{110,99,0}}, +/* 43154 */ {(11<<2)|2,{110,99,0}}, +/* 43155 */ {(11<<2)|2,{110,99,0}}, +/* 43156 */ {(11<<2)|2,{110,99,0}}, +/* 43157 */ {(11<<2)|2,{110,99,0}}, +/* 43158 */ {(11<<2)|2,{110,99,0}}, +/* 43159 */ {(11<<2)|2,{110,99,0}}, +/* 43160 */ {(11<<2)|2,{110,99,0}}, +/* 43161 */ {(11<<2)|2,{110,99,0}}, +/* 43162 */ {(11<<2)|2,{110,99,0}}, +/* 43163 */ {(11<<2)|2,{110,99,0}}, +/* 43164 */ {(11<<2)|2,{110,99,0}}, +/* 43165 */ {(11<<2)|2,{110,99,0}}, +/* 43166 */ {(11<<2)|2,{110,99,0}}, +/* 43167 */ {(11<<2)|2,{110,99,0}}, +/* 43168 */ {(16<<2)|3,{110,101,48}}, +/* 43169 */ {(16<<2)|3,{110,101,49}}, +/* 43170 */ {(16<<2)|3,{110,101,50}}, +/* 43171 */ {(16<<2)|3,{110,101,97}}, +/* 43172 */ {(16<<2)|3,{110,101,99}}, +/* 43173 */ {(16<<2)|3,{110,101,101}}, +/* 43174 */ {(16<<2)|3,{110,101,105}}, +/* 43175 */ {(16<<2)|3,{110,101,111}}, +/* 43176 */ {(16<<2)|3,{110,101,115}}, +/* 43177 */ {(16<<2)|3,{110,101,116}}, +/* 43178 */ {(11<<2)|2,{110,101,0}}, +/* 43179 */ {(11<<2)|2,{110,101,0}}, +/* 43180 */ {(11<<2)|2,{110,101,0}}, +/* 43181 */ {(11<<2)|2,{110,101,0}}, +/* 43182 */ {(11<<2)|2,{110,101,0}}, +/* 43183 */ {(11<<2)|2,{110,101,0}}, +/* 43184 */ {(11<<2)|2,{110,101,0}}, +/* 43185 */ {(11<<2)|2,{110,101,0}}, +/* 43186 */ {(11<<2)|2,{110,101,0}}, +/* 43187 */ {(11<<2)|2,{110,101,0}}, +/* 43188 */ {(11<<2)|2,{110,101,0}}, +/* 43189 */ {(11<<2)|2,{110,101,0}}, +/* 43190 */ {(11<<2)|2,{110,101,0}}, +/* 43191 */ {(11<<2)|2,{110,101,0}}, +/* 43192 */ {(11<<2)|2,{110,101,0}}, +/* 43193 */ {(11<<2)|2,{110,101,0}}, +/* 43194 */ {(11<<2)|2,{110,101,0}}, +/* 43195 */ {(11<<2)|2,{110,101,0}}, +/* 43196 */ {(11<<2)|2,{110,101,0}}, +/* 43197 */ {(11<<2)|2,{110,101,0}}, +/* 43198 */ {(11<<2)|2,{110,101,0}}, +/* 43199 */ {(11<<2)|2,{110,101,0}}, +/* 43200 */ {(16<<2)|3,{110,105,48}}, +/* 43201 */ {(16<<2)|3,{110,105,49}}, +/* 43202 */ {(16<<2)|3,{110,105,50}}, +/* 43203 */ {(16<<2)|3,{110,105,97}}, +/* 43204 */ {(16<<2)|3,{110,105,99}}, +/* 43205 */ {(16<<2)|3,{110,105,101}}, +/* 43206 */ {(16<<2)|3,{110,105,105}}, +/* 43207 */ {(16<<2)|3,{110,105,111}}, +/* 43208 */ {(16<<2)|3,{110,105,115}}, +/* 43209 */ {(16<<2)|3,{110,105,116}}, +/* 43210 */ {(11<<2)|2,{110,105,0}}, +/* 43211 */ {(11<<2)|2,{110,105,0}}, +/* 43212 */ {(11<<2)|2,{110,105,0}}, +/* 43213 */ {(11<<2)|2,{110,105,0}}, +/* 43214 */ {(11<<2)|2,{110,105,0}}, +/* 43215 */ {(11<<2)|2,{110,105,0}}, +/* 43216 */ {(11<<2)|2,{110,105,0}}, +/* 43217 */ {(11<<2)|2,{110,105,0}}, +/* 43218 */ {(11<<2)|2,{110,105,0}}, +/* 43219 */ {(11<<2)|2,{110,105,0}}, +/* 43220 */ {(11<<2)|2,{110,105,0}}, +/* 43221 */ {(11<<2)|2,{110,105,0}}, +/* 43222 */ {(11<<2)|2,{110,105,0}}, +/* 43223 */ {(11<<2)|2,{110,105,0}}, +/* 43224 */ {(11<<2)|2,{110,105,0}}, +/* 43225 */ {(11<<2)|2,{110,105,0}}, +/* 43226 */ {(11<<2)|2,{110,105,0}}, +/* 43227 */ {(11<<2)|2,{110,105,0}}, +/* 43228 */ {(11<<2)|2,{110,105,0}}, +/* 43229 */ {(11<<2)|2,{110,105,0}}, +/* 43230 */ {(11<<2)|2,{110,105,0}}, +/* 43231 */ {(11<<2)|2,{110,105,0}}, +/* 43232 */ {(16<<2)|3,{110,111,48}}, +/* 43233 */ {(16<<2)|3,{110,111,49}}, +/* 43234 */ {(16<<2)|3,{110,111,50}}, +/* 43235 */ {(16<<2)|3,{110,111,97}}, +/* 43236 */ {(16<<2)|3,{110,111,99}}, +/* 43237 */ {(16<<2)|3,{110,111,101}}, +/* 43238 */ {(16<<2)|3,{110,111,105}}, +/* 43239 */ {(16<<2)|3,{110,111,111}}, +/* 43240 */ {(16<<2)|3,{110,111,115}}, +/* 43241 */ {(16<<2)|3,{110,111,116}}, +/* 43242 */ {(11<<2)|2,{110,111,0}}, +/* 43243 */ {(11<<2)|2,{110,111,0}}, +/* 43244 */ {(11<<2)|2,{110,111,0}}, +/* 43245 */ {(11<<2)|2,{110,111,0}}, +/* 43246 */ {(11<<2)|2,{110,111,0}}, +/* 43247 */ {(11<<2)|2,{110,111,0}}, +/* 43248 */ {(11<<2)|2,{110,111,0}}, +/* 43249 */ {(11<<2)|2,{110,111,0}}, +/* 43250 */ {(11<<2)|2,{110,111,0}}, +/* 43251 */ {(11<<2)|2,{110,111,0}}, +/* 43252 */ {(11<<2)|2,{110,111,0}}, +/* 43253 */ {(11<<2)|2,{110,111,0}}, +/* 43254 */ {(11<<2)|2,{110,111,0}}, +/* 43255 */ {(11<<2)|2,{110,111,0}}, +/* 43256 */ {(11<<2)|2,{110,111,0}}, +/* 43257 */ {(11<<2)|2,{110,111,0}}, +/* 43258 */ {(11<<2)|2,{110,111,0}}, +/* 43259 */ {(11<<2)|2,{110,111,0}}, +/* 43260 */ {(11<<2)|2,{110,111,0}}, +/* 43261 */ {(11<<2)|2,{110,111,0}}, +/* 43262 */ {(11<<2)|2,{110,111,0}}, +/* 43263 */ {(11<<2)|2,{110,111,0}}, +/* 43264 */ {(16<<2)|3,{110,115,48}}, +/* 43265 */ {(16<<2)|3,{110,115,49}}, +/* 43266 */ {(16<<2)|3,{110,115,50}}, +/* 43267 */ {(16<<2)|3,{110,115,97}}, +/* 43268 */ {(16<<2)|3,{110,115,99}}, +/* 43269 */ {(16<<2)|3,{110,115,101}}, +/* 43270 */ {(16<<2)|3,{110,115,105}}, +/* 43271 */ {(16<<2)|3,{110,115,111}}, +/* 43272 */ {(16<<2)|3,{110,115,115}}, +/* 43273 */ {(16<<2)|3,{110,115,116}}, +/* 43274 */ {(11<<2)|2,{110,115,0}}, +/* 43275 */ {(11<<2)|2,{110,115,0}}, +/* 43276 */ {(11<<2)|2,{110,115,0}}, +/* 43277 */ {(11<<2)|2,{110,115,0}}, +/* 43278 */ {(11<<2)|2,{110,115,0}}, +/* 43279 */ {(11<<2)|2,{110,115,0}}, +/* 43280 */ {(11<<2)|2,{110,115,0}}, +/* 43281 */ {(11<<2)|2,{110,115,0}}, +/* 43282 */ {(11<<2)|2,{110,115,0}}, +/* 43283 */ {(11<<2)|2,{110,115,0}}, +/* 43284 */ {(11<<2)|2,{110,115,0}}, +/* 43285 */ {(11<<2)|2,{110,115,0}}, +/* 43286 */ {(11<<2)|2,{110,115,0}}, +/* 43287 */ {(11<<2)|2,{110,115,0}}, +/* 43288 */ {(11<<2)|2,{110,115,0}}, +/* 43289 */ {(11<<2)|2,{110,115,0}}, +/* 43290 */ {(11<<2)|2,{110,115,0}}, +/* 43291 */ {(11<<2)|2,{110,115,0}}, +/* 43292 */ {(11<<2)|2,{110,115,0}}, +/* 43293 */ {(11<<2)|2,{110,115,0}}, +/* 43294 */ {(11<<2)|2,{110,115,0}}, +/* 43295 */ {(11<<2)|2,{110,115,0}}, +/* 43296 */ {(16<<2)|3,{110,116,48}}, +/* 43297 */ {(16<<2)|3,{110,116,49}}, +/* 43298 */ {(16<<2)|3,{110,116,50}}, +/* 43299 */ {(16<<2)|3,{110,116,97}}, +/* 43300 */ {(16<<2)|3,{110,116,99}}, +/* 43301 */ {(16<<2)|3,{110,116,101}}, +/* 43302 */ {(16<<2)|3,{110,116,105}}, +/* 43303 */ {(16<<2)|3,{110,116,111}}, +/* 43304 */ {(16<<2)|3,{110,116,115}}, +/* 43305 */ {(16<<2)|3,{110,116,116}}, +/* 43306 */ {(11<<2)|2,{110,116,0}}, +/* 43307 */ {(11<<2)|2,{110,116,0}}, +/* 43308 */ {(11<<2)|2,{110,116,0}}, +/* 43309 */ {(11<<2)|2,{110,116,0}}, +/* 43310 */ {(11<<2)|2,{110,116,0}}, +/* 43311 */ {(11<<2)|2,{110,116,0}}, +/* 43312 */ {(11<<2)|2,{110,116,0}}, +/* 43313 */ {(11<<2)|2,{110,116,0}}, +/* 43314 */ {(11<<2)|2,{110,116,0}}, +/* 43315 */ {(11<<2)|2,{110,116,0}}, +/* 43316 */ {(11<<2)|2,{110,116,0}}, +/* 43317 */ {(11<<2)|2,{110,116,0}}, +/* 43318 */ {(11<<2)|2,{110,116,0}}, +/* 43319 */ {(11<<2)|2,{110,116,0}}, +/* 43320 */ {(11<<2)|2,{110,116,0}}, +/* 43321 */ {(11<<2)|2,{110,116,0}}, +/* 43322 */ {(11<<2)|2,{110,116,0}}, +/* 43323 */ {(11<<2)|2,{110,116,0}}, +/* 43324 */ {(11<<2)|2,{110,116,0}}, +/* 43325 */ {(11<<2)|2,{110,116,0}}, +/* 43326 */ {(11<<2)|2,{110,116,0}}, +/* 43327 */ {(11<<2)|2,{110,116,0}}, +/* 43328 */ {(12<<2)|2,{110,32,0}}, +/* 43329 */ {(12<<2)|2,{110,32,0}}, +/* 43330 */ {(12<<2)|2,{110,32,0}}, +/* 43331 */ {(12<<2)|2,{110,32,0}}, +/* 43332 */ {(12<<2)|2,{110,32,0}}, +/* 43333 */ {(12<<2)|2,{110,32,0}}, +/* 43334 */ {(12<<2)|2,{110,32,0}}, +/* 43335 */ {(12<<2)|2,{110,32,0}}, +/* 43336 */ {(12<<2)|2,{110,32,0}}, +/* 43337 */ {(12<<2)|2,{110,32,0}}, +/* 43338 */ {(12<<2)|2,{110,32,0}}, +/* 43339 */ {(12<<2)|2,{110,32,0}}, +/* 43340 */ {(12<<2)|2,{110,32,0}}, +/* 43341 */ {(12<<2)|2,{110,32,0}}, +/* 43342 */ {(12<<2)|2,{110,32,0}}, +/* 43343 */ {(12<<2)|2,{110,32,0}}, +/* 43344 */ {(12<<2)|2,{110,37,0}}, +/* 43345 */ {(12<<2)|2,{110,37,0}}, +/* 43346 */ {(12<<2)|2,{110,37,0}}, +/* 43347 */ {(12<<2)|2,{110,37,0}}, +/* 43348 */ {(12<<2)|2,{110,37,0}}, +/* 43349 */ {(12<<2)|2,{110,37,0}}, +/* 43350 */ {(12<<2)|2,{110,37,0}}, +/* 43351 */ {(12<<2)|2,{110,37,0}}, +/* 43352 */ {(12<<2)|2,{110,37,0}}, +/* 43353 */ {(12<<2)|2,{110,37,0}}, +/* 43354 */ {(12<<2)|2,{110,37,0}}, +/* 43355 */ {(12<<2)|2,{110,37,0}}, +/* 43356 */ {(12<<2)|2,{110,37,0}}, +/* 43357 */ {(12<<2)|2,{110,37,0}}, +/* 43358 */ {(12<<2)|2,{110,37,0}}, +/* 43359 */ {(12<<2)|2,{110,37,0}}, +/* 43360 */ {(12<<2)|2,{110,45,0}}, +/* 43361 */ {(12<<2)|2,{110,45,0}}, +/* 43362 */ {(12<<2)|2,{110,45,0}}, +/* 43363 */ {(12<<2)|2,{110,45,0}}, +/* 43364 */ {(12<<2)|2,{110,45,0}}, +/* 43365 */ {(12<<2)|2,{110,45,0}}, +/* 43366 */ {(12<<2)|2,{110,45,0}}, +/* 43367 */ {(12<<2)|2,{110,45,0}}, +/* 43368 */ {(12<<2)|2,{110,45,0}}, +/* 43369 */ {(12<<2)|2,{110,45,0}}, +/* 43370 */ {(12<<2)|2,{110,45,0}}, +/* 43371 */ {(12<<2)|2,{110,45,0}}, +/* 43372 */ {(12<<2)|2,{110,45,0}}, +/* 43373 */ {(12<<2)|2,{110,45,0}}, +/* 43374 */ {(12<<2)|2,{110,45,0}}, +/* 43375 */ {(12<<2)|2,{110,45,0}}, +/* 43376 */ {(12<<2)|2,{110,46,0}}, +/* 43377 */ {(12<<2)|2,{110,46,0}}, +/* 43378 */ {(12<<2)|2,{110,46,0}}, +/* 43379 */ {(12<<2)|2,{110,46,0}}, +/* 43380 */ {(12<<2)|2,{110,46,0}}, +/* 43381 */ {(12<<2)|2,{110,46,0}}, +/* 43382 */ {(12<<2)|2,{110,46,0}}, +/* 43383 */ {(12<<2)|2,{110,46,0}}, +/* 43384 */ {(12<<2)|2,{110,46,0}}, +/* 43385 */ {(12<<2)|2,{110,46,0}}, +/* 43386 */ {(12<<2)|2,{110,46,0}}, +/* 43387 */ {(12<<2)|2,{110,46,0}}, +/* 43388 */ {(12<<2)|2,{110,46,0}}, +/* 43389 */ {(12<<2)|2,{110,46,0}}, +/* 43390 */ {(12<<2)|2,{110,46,0}}, +/* 43391 */ {(12<<2)|2,{110,46,0}}, +/* 43392 */ {(12<<2)|2,{110,47,0}}, +/* 43393 */ {(12<<2)|2,{110,47,0}}, +/* 43394 */ {(12<<2)|2,{110,47,0}}, +/* 43395 */ {(12<<2)|2,{110,47,0}}, +/* 43396 */ {(12<<2)|2,{110,47,0}}, +/* 43397 */ {(12<<2)|2,{110,47,0}}, +/* 43398 */ {(12<<2)|2,{110,47,0}}, +/* 43399 */ {(12<<2)|2,{110,47,0}}, +/* 43400 */ {(12<<2)|2,{110,47,0}}, +/* 43401 */ {(12<<2)|2,{110,47,0}}, +/* 43402 */ {(12<<2)|2,{110,47,0}}, +/* 43403 */ {(12<<2)|2,{110,47,0}}, +/* 43404 */ {(12<<2)|2,{110,47,0}}, +/* 43405 */ {(12<<2)|2,{110,47,0}}, +/* 43406 */ {(12<<2)|2,{110,47,0}}, +/* 43407 */ {(12<<2)|2,{110,47,0}}, +/* 43408 */ {(12<<2)|2,{110,51,0}}, +/* 43409 */ {(12<<2)|2,{110,51,0}}, +/* 43410 */ {(12<<2)|2,{110,51,0}}, +/* 43411 */ {(12<<2)|2,{110,51,0}}, +/* 43412 */ {(12<<2)|2,{110,51,0}}, +/* 43413 */ {(12<<2)|2,{110,51,0}}, +/* 43414 */ {(12<<2)|2,{110,51,0}}, +/* 43415 */ {(12<<2)|2,{110,51,0}}, +/* 43416 */ {(12<<2)|2,{110,51,0}}, +/* 43417 */ {(12<<2)|2,{110,51,0}}, +/* 43418 */ {(12<<2)|2,{110,51,0}}, +/* 43419 */ {(12<<2)|2,{110,51,0}}, +/* 43420 */ {(12<<2)|2,{110,51,0}}, +/* 43421 */ {(12<<2)|2,{110,51,0}}, +/* 43422 */ {(12<<2)|2,{110,51,0}}, +/* 43423 */ {(12<<2)|2,{110,51,0}}, +/* 43424 */ {(12<<2)|2,{110,52,0}}, +/* 43425 */ {(12<<2)|2,{110,52,0}}, +/* 43426 */ {(12<<2)|2,{110,52,0}}, +/* 43427 */ {(12<<2)|2,{110,52,0}}, +/* 43428 */ {(12<<2)|2,{110,52,0}}, +/* 43429 */ {(12<<2)|2,{110,52,0}}, +/* 43430 */ {(12<<2)|2,{110,52,0}}, +/* 43431 */ {(12<<2)|2,{110,52,0}}, +/* 43432 */ {(12<<2)|2,{110,52,0}}, +/* 43433 */ {(12<<2)|2,{110,52,0}}, +/* 43434 */ {(12<<2)|2,{110,52,0}}, +/* 43435 */ {(12<<2)|2,{110,52,0}}, +/* 43436 */ {(12<<2)|2,{110,52,0}}, +/* 43437 */ {(12<<2)|2,{110,52,0}}, +/* 43438 */ {(12<<2)|2,{110,52,0}}, +/* 43439 */ {(12<<2)|2,{110,52,0}}, +/* 43440 */ {(12<<2)|2,{110,53,0}}, +/* 43441 */ {(12<<2)|2,{110,53,0}}, +/* 43442 */ {(12<<2)|2,{110,53,0}}, +/* 43443 */ {(12<<2)|2,{110,53,0}}, +/* 43444 */ {(12<<2)|2,{110,53,0}}, +/* 43445 */ {(12<<2)|2,{110,53,0}}, +/* 43446 */ {(12<<2)|2,{110,53,0}}, +/* 43447 */ {(12<<2)|2,{110,53,0}}, +/* 43448 */ {(12<<2)|2,{110,53,0}}, +/* 43449 */ {(12<<2)|2,{110,53,0}}, +/* 43450 */ {(12<<2)|2,{110,53,0}}, +/* 43451 */ {(12<<2)|2,{110,53,0}}, +/* 43452 */ {(12<<2)|2,{110,53,0}}, +/* 43453 */ {(12<<2)|2,{110,53,0}}, +/* 43454 */ {(12<<2)|2,{110,53,0}}, +/* 43455 */ {(12<<2)|2,{110,53,0}}, +/* 43456 */ {(12<<2)|2,{110,54,0}}, +/* 43457 */ {(12<<2)|2,{110,54,0}}, +/* 43458 */ {(12<<2)|2,{110,54,0}}, +/* 43459 */ {(12<<2)|2,{110,54,0}}, +/* 43460 */ {(12<<2)|2,{110,54,0}}, +/* 43461 */ {(12<<2)|2,{110,54,0}}, +/* 43462 */ {(12<<2)|2,{110,54,0}}, +/* 43463 */ {(12<<2)|2,{110,54,0}}, +/* 43464 */ {(12<<2)|2,{110,54,0}}, +/* 43465 */ {(12<<2)|2,{110,54,0}}, +/* 43466 */ {(12<<2)|2,{110,54,0}}, +/* 43467 */ {(12<<2)|2,{110,54,0}}, +/* 43468 */ {(12<<2)|2,{110,54,0}}, +/* 43469 */ {(12<<2)|2,{110,54,0}}, +/* 43470 */ {(12<<2)|2,{110,54,0}}, +/* 43471 */ {(12<<2)|2,{110,54,0}}, +/* 43472 */ {(12<<2)|2,{110,55,0}}, +/* 43473 */ {(12<<2)|2,{110,55,0}}, +/* 43474 */ {(12<<2)|2,{110,55,0}}, +/* 43475 */ {(12<<2)|2,{110,55,0}}, +/* 43476 */ {(12<<2)|2,{110,55,0}}, +/* 43477 */ {(12<<2)|2,{110,55,0}}, +/* 43478 */ {(12<<2)|2,{110,55,0}}, +/* 43479 */ {(12<<2)|2,{110,55,0}}, +/* 43480 */ {(12<<2)|2,{110,55,0}}, +/* 43481 */ {(12<<2)|2,{110,55,0}}, +/* 43482 */ {(12<<2)|2,{110,55,0}}, +/* 43483 */ {(12<<2)|2,{110,55,0}}, +/* 43484 */ {(12<<2)|2,{110,55,0}}, +/* 43485 */ {(12<<2)|2,{110,55,0}}, +/* 43486 */ {(12<<2)|2,{110,55,0}}, +/* 43487 */ {(12<<2)|2,{110,55,0}}, +/* 43488 */ {(12<<2)|2,{110,56,0}}, +/* 43489 */ {(12<<2)|2,{110,56,0}}, +/* 43490 */ {(12<<2)|2,{110,56,0}}, +/* 43491 */ {(12<<2)|2,{110,56,0}}, +/* 43492 */ {(12<<2)|2,{110,56,0}}, +/* 43493 */ {(12<<2)|2,{110,56,0}}, +/* 43494 */ {(12<<2)|2,{110,56,0}}, +/* 43495 */ {(12<<2)|2,{110,56,0}}, +/* 43496 */ {(12<<2)|2,{110,56,0}}, +/* 43497 */ {(12<<2)|2,{110,56,0}}, +/* 43498 */ {(12<<2)|2,{110,56,0}}, +/* 43499 */ {(12<<2)|2,{110,56,0}}, +/* 43500 */ {(12<<2)|2,{110,56,0}}, +/* 43501 */ {(12<<2)|2,{110,56,0}}, +/* 43502 */ {(12<<2)|2,{110,56,0}}, +/* 43503 */ {(12<<2)|2,{110,56,0}}, +/* 43504 */ {(12<<2)|2,{110,57,0}}, +/* 43505 */ {(12<<2)|2,{110,57,0}}, +/* 43506 */ {(12<<2)|2,{110,57,0}}, +/* 43507 */ {(12<<2)|2,{110,57,0}}, +/* 43508 */ {(12<<2)|2,{110,57,0}}, +/* 43509 */ {(12<<2)|2,{110,57,0}}, +/* 43510 */ {(12<<2)|2,{110,57,0}}, +/* 43511 */ {(12<<2)|2,{110,57,0}}, +/* 43512 */ {(12<<2)|2,{110,57,0}}, +/* 43513 */ {(12<<2)|2,{110,57,0}}, +/* 43514 */ {(12<<2)|2,{110,57,0}}, +/* 43515 */ {(12<<2)|2,{110,57,0}}, +/* 43516 */ {(12<<2)|2,{110,57,0}}, +/* 43517 */ {(12<<2)|2,{110,57,0}}, +/* 43518 */ {(12<<2)|2,{110,57,0}}, +/* 43519 */ {(12<<2)|2,{110,57,0}}, +/* 43520 */ {(12<<2)|2,{110,61,0}}, +/* 43521 */ {(12<<2)|2,{110,61,0}}, +/* 43522 */ {(12<<2)|2,{110,61,0}}, +/* 43523 */ {(12<<2)|2,{110,61,0}}, +/* 43524 */ {(12<<2)|2,{110,61,0}}, +/* 43525 */ {(12<<2)|2,{110,61,0}}, +/* 43526 */ {(12<<2)|2,{110,61,0}}, +/* 43527 */ {(12<<2)|2,{110,61,0}}, +/* 43528 */ {(12<<2)|2,{110,61,0}}, +/* 43529 */ {(12<<2)|2,{110,61,0}}, +/* 43530 */ {(12<<2)|2,{110,61,0}}, +/* 43531 */ {(12<<2)|2,{110,61,0}}, +/* 43532 */ {(12<<2)|2,{110,61,0}}, +/* 43533 */ {(12<<2)|2,{110,61,0}}, +/* 43534 */ {(12<<2)|2,{110,61,0}}, +/* 43535 */ {(12<<2)|2,{110,61,0}}, +/* 43536 */ {(12<<2)|2,{110,65,0}}, +/* 43537 */ {(12<<2)|2,{110,65,0}}, +/* 43538 */ {(12<<2)|2,{110,65,0}}, +/* 43539 */ {(12<<2)|2,{110,65,0}}, +/* 43540 */ {(12<<2)|2,{110,65,0}}, +/* 43541 */ {(12<<2)|2,{110,65,0}}, +/* 43542 */ {(12<<2)|2,{110,65,0}}, +/* 43543 */ {(12<<2)|2,{110,65,0}}, +/* 43544 */ {(12<<2)|2,{110,65,0}}, +/* 43545 */ {(12<<2)|2,{110,65,0}}, +/* 43546 */ {(12<<2)|2,{110,65,0}}, +/* 43547 */ {(12<<2)|2,{110,65,0}}, +/* 43548 */ {(12<<2)|2,{110,65,0}}, +/* 43549 */ {(12<<2)|2,{110,65,0}}, +/* 43550 */ {(12<<2)|2,{110,65,0}}, +/* 43551 */ {(12<<2)|2,{110,65,0}}, +/* 43552 */ {(12<<2)|2,{110,95,0}}, +/* 43553 */ {(12<<2)|2,{110,95,0}}, +/* 43554 */ {(12<<2)|2,{110,95,0}}, +/* 43555 */ {(12<<2)|2,{110,95,0}}, +/* 43556 */ {(12<<2)|2,{110,95,0}}, +/* 43557 */ {(12<<2)|2,{110,95,0}}, +/* 43558 */ {(12<<2)|2,{110,95,0}}, +/* 43559 */ {(12<<2)|2,{110,95,0}}, +/* 43560 */ {(12<<2)|2,{110,95,0}}, +/* 43561 */ {(12<<2)|2,{110,95,0}}, +/* 43562 */ {(12<<2)|2,{110,95,0}}, +/* 43563 */ {(12<<2)|2,{110,95,0}}, +/* 43564 */ {(12<<2)|2,{110,95,0}}, +/* 43565 */ {(12<<2)|2,{110,95,0}}, +/* 43566 */ {(12<<2)|2,{110,95,0}}, +/* 43567 */ {(12<<2)|2,{110,95,0}}, +/* 43568 */ {(12<<2)|2,{110,98,0}}, +/* 43569 */ {(12<<2)|2,{110,98,0}}, +/* 43570 */ {(12<<2)|2,{110,98,0}}, +/* 43571 */ {(12<<2)|2,{110,98,0}}, +/* 43572 */ {(12<<2)|2,{110,98,0}}, +/* 43573 */ {(12<<2)|2,{110,98,0}}, +/* 43574 */ {(12<<2)|2,{110,98,0}}, +/* 43575 */ {(12<<2)|2,{110,98,0}}, +/* 43576 */ {(12<<2)|2,{110,98,0}}, +/* 43577 */ {(12<<2)|2,{110,98,0}}, +/* 43578 */ {(12<<2)|2,{110,98,0}}, +/* 43579 */ {(12<<2)|2,{110,98,0}}, +/* 43580 */ {(12<<2)|2,{110,98,0}}, +/* 43581 */ {(12<<2)|2,{110,98,0}}, +/* 43582 */ {(12<<2)|2,{110,98,0}}, +/* 43583 */ {(12<<2)|2,{110,98,0}}, +/* 43584 */ {(12<<2)|2,{110,100,0}}, +/* 43585 */ {(12<<2)|2,{110,100,0}}, +/* 43586 */ {(12<<2)|2,{110,100,0}}, +/* 43587 */ {(12<<2)|2,{110,100,0}}, +/* 43588 */ {(12<<2)|2,{110,100,0}}, +/* 43589 */ {(12<<2)|2,{110,100,0}}, +/* 43590 */ {(12<<2)|2,{110,100,0}}, +/* 43591 */ {(12<<2)|2,{110,100,0}}, +/* 43592 */ {(12<<2)|2,{110,100,0}}, +/* 43593 */ {(12<<2)|2,{110,100,0}}, +/* 43594 */ {(12<<2)|2,{110,100,0}}, +/* 43595 */ {(12<<2)|2,{110,100,0}}, +/* 43596 */ {(12<<2)|2,{110,100,0}}, +/* 43597 */ {(12<<2)|2,{110,100,0}}, +/* 43598 */ {(12<<2)|2,{110,100,0}}, +/* 43599 */ {(12<<2)|2,{110,100,0}}, +/* 43600 */ {(12<<2)|2,{110,102,0}}, +/* 43601 */ {(12<<2)|2,{110,102,0}}, +/* 43602 */ {(12<<2)|2,{110,102,0}}, +/* 43603 */ {(12<<2)|2,{110,102,0}}, +/* 43604 */ {(12<<2)|2,{110,102,0}}, +/* 43605 */ {(12<<2)|2,{110,102,0}}, +/* 43606 */ {(12<<2)|2,{110,102,0}}, +/* 43607 */ {(12<<2)|2,{110,102,0}}, +/* 43608 */ {(12<<2)|2,{110,102,0}}, +/* 43609 */ {(12<<2)|2,{110,102,0}}, +/* 43610 */ {(12<<2)|2,{110,102,0}}, +/* 43611 */ {(12<<2)|2,{110,102,0}}, +/* 43612 */ {(12<<2)|2,{110,102,0}}, +/* 43613 */ {(12<<2)|2,{110,102,0}}, +/* 43614 */ {(12<<2)|2,{110,102,0}}, +/* 43615 */ {(12<<2)|2,{110,102,0}}, +/* 43616 */ {(12<<2)|2,{110,103,0}}, +/* 43617 */ {(12<<2)|2,{110,103,0}}, +/* 43618 */ {(12<<2)|2,{110,103,0}}, +/* 43619 */ {(12<<2)|2,{110,103,0}}, +/* 43620 */ {(12<<2)|2,{110,103,0}}, +/* 43621 */ {(12<<2)|2,{110,103,0}}, +/* 43622 */ {(12<<2)|2,{110,103,0}}, +/* 43623 */ {(12<<2)|2,{110,103,0}}, +/* 43624 */ {(12<<2)|2,{110,103,0}}, +/* 43625 */ {(12<<2)|2,{110,103,0}}, +/* 43626 */ {(12<<2)|2,{110,103,0}}, +/* 43627 */ {(12<<2)|2,{110,103,0}}, +/* 43628 */ {(12<<2)|2,{110,103,0}}, +/* 43629 */ {(12<<2)|2,{110,103,0}}, +/* 43630 */ {(12<<2)|2,{110,103,0}}, +/* 43631 */ {(12<<2)|2,{110,103,0}}, +/* 43632 */ {(12<<2)|2,{110,104,0}}, +/* 43633 */ {(12<<2)|2,{110,104,0}}, +/* 43634 */ {(12<<2)|2,{110,104,0}}, +/* 43635 */ {(12<<2)|2,{110,104,0}}, +/* 43636 */ {(12<<2)|2,{110,104,0}}, +/* 43637 */ {(12<<2)|2,{110,104,0}}, +/* 43638 */ {(12<<2)|2,{110,104,0}}, +/* 43639 */ {(12<<2)|2,{110,104,0}}, +/* 43640 */ {(12<<2)|2,{110,104,0}}, +/* 43641 */ {(12<<2)|2,{110,104,0}}, +/* 43642 */ {(12<<2)|2,{110,104,0}}, +/* 43643 */ {(12<<2)|2,{110,104,0}}, +/* 43644 */ {(12<<2)|2,{110,104,0}}, +/* 43645 */ {(12<<2)|2,{110,104,0}}, +/* 43646 */ {(12<<2)|2,{110,104,0}}, +/* 43647 */ {(12<<2)|2,{110,104,0}}, +/* 43648 */ {(12<<2)|2,{110,108,0}}, +/* 43649 */ {(12<<2)|2,{110,108,0}}, +/* 43650 */ {(12<<2)|2,{110,108,0}}, +/* 43651 */ {(12<<2)|2,{110,108,0}}, +/* 43652 */ {(12<<2)|2,{110,108,0}}, +/* 43653 */ {(12<<2)|2,{110,108,0}}, +/* 43654 */ {(12<<2)|2,{110,108,0}}, +/* 43655 */ {(12<<2)|2,{110,108,0}}, +/* 43656 */ {(12<<2)|2,{110,108,0}}, +/* 43657 */ {(12<<2)|2,{110,108,0}}, +/* 43658 */ {(12<<2)|2,{110,108,0}}, +/* 43659 */ {(12<<2)|2,{110,108,0}}, +/* 43660 */ {(12<<2)|2,{110,108,0}}, +/* 43661 */ {(12<<2)|2,{110,108,0}}, +/* 43662 */ {(12<<2)|2,{110,108,0}}, +/* 43663 */ {(12<<2)|2,{110,108,0}}, +/* 43664 */ {(12<<2)|2,{110,109,0}}, +/* 43665 */ {(12<<2)|2,{110,109,0}}, +/* 43666 */ {(12<<2)|2,{110,109,0}}, +/* 43667 */ {(12<<2)|2,{110,109,0}}, +/* 43668 */ {(12<<2)|2,{110,109,0}}, +/* 43669 */ {(12<<2)|2,{110,109,0}}, +/* 43670 */ {(12<<2)|2,{110,109,0}}, +/* 43671 */ {(12<<2)|2,{110,109,0}}, +/* 43672 */ {(12<<2)|2,{110,109,0}}, +/* 43673 */ {(12<<2)|2,{110,109,0}}, +/* 43674 */ {(12<<2)|2,{110,109,0}}, +/* 43675 */ {(12<<2)|2,{110,109,0}}, +/* 43676 */ {(12<<2)|2,{110,109,0}}, +/* 43677 */ {(12<<2)|2,{110,109,0}}, +/* 43678 */ {(12<<2)|2,{110,109,0}}, +/* 43679 */ {(12<<2)|2,{110,109,0}}, +/* 43680 */ {(12<<2)|2,{110,110,0}}, +/* 43681 */ {(12<<2)|2,{110,110,0}}, +/* 43682 */ {(12<<2)|2,{110,110,0}}, +/* 43683 */ {(12<<2)|2,{110,110,0}}, +/* 43684 */ {(12<<2)|2,{110,110,0}}, +/* 43685 */ {(12<<2)|2,{110,110,0}}, +/* 43686 */ {(12<<2)|2,{110,110,0}}, +/* 43687 */ {(12<<2)|2,{110,110,0}}, +/* 43688 */ {(12<<2)|2,{110,110,0}}, +/* 43689 */ {(12<<2)|2,{110,110,0}}, +/* 43690 */ {(12<<2)|2,{110,110,0}}, +/* 43691 */ {(12<<2)|2,{110,110,0}}, +/* 43692 */ {(12<<2)|2,{110,110,0}}, +/* 43693 */ {(12<<2)|2,{110,110,0}}, +/* 43694 */ {(12<<2)|2,{110,110,0}}, +/* 43695 */ {(12<<2)|2,{110,110,0}}, +/* 43696 */ {(12<<2)|2,{110,112,0}}, +/* 43697 */ {(12<<2)|2,{110,112,0}}, +/* 43698 */ {(12<<2)|2,{110,112,0}}, +/* 43699 */ {(12<<2)|2,{110,112,0}}, +/* 43700 */ {(12<<2)|2,{110,112,0}}, +/* 43701 */ {(12<<2)|2,{110,112,0}}, +/* 43702 */ {(12<<2)|2,{110,112,0}}, +/* 43703 */ {(12<<2)|2,{110,112,0}}, +/* 43704 */ {(12<<2)|2,{110,112,0}}, +/* 43705 */ {(12<<2)|2,{110,112,0}}, +/* 43706 */ {(12<<2)|2,{110,112,0}}, +/* 43707 */ {(12<<2)|2,{110,112,0}}, +/* 43708 */ {(12<<2)|2,{110,112,0}}, +/* 43709 */ {(12<<2)|2,{110,112,0}}, +/* 43710 */ {(12<<2)|2,{110,112,0}}, +/* 43711 */ {(12<<2)|2,{110,112,0}}, +/* 43712 */ {(12<<2)|2,{110,114,0}}, +/* 43713 */ {(12<<2)|2,{110,114,0}}, +/* 43714 */ {(12<<2)|2,{110,114,0}}, +/* 43715 */ {(12<<2)|2,{110,114,0}}, +/* 43716 */ {(12<<2)|2,{110,114,0}}, +/* 43717 */ {(12<<2)|2,{110,114,0}}, +/* 43718 */ {(12<<2)|2,{110,114,0}}, +/* 43719 */ {(12<<2)|2,{110,114,0}}, +/* 43720 */ {(12<<2)|2,{110,114,0}}, +/* 43721 */ {(12<<2)|2,{110,114,0}}, +/* 43722 */ {(12<<2)|2,{110,114,0}}, +/* 43723 */ {(12<<2)|2,{110,114,0}}, +/* 43724 */ {(12<<2)|2,{110,114,0}}, +/* 43725 */ {(12<<2)|2,{110,114,0}}, +/* 43726 */ {(12<<2)|2,{110,114,0}}, +/* 43727 */ {(12<<2)|2,{110,114,0}}, +/* 43728 */ {(12<<2)|2,{110,117,0}}, +/* 43729 */ {(12<<2)|2,{110,117,0}}, +/* 43730 */ {(12<<2)|2,{110,117,0}}, +/* 43731 */ {(12<<2)|2,{110,117,0}}, +/* 43732 */ {(12<<2)|2,{110,117,0}}, +/* 43733 */ {(12<<2)|2,{110,117,0}}, +/* 43734 */ {(12<<2)|2,{110,117,0}}, +/* 43735 */ {(12<<2)|2,{110,117,0}}, +/* 43736 */ {(12<<2)|2,{110,117,0}}, +/* 43737 */ {(12<<2)|2,{110,117,0}}, +/* 43738 */ {(12<<2)|2,{110,117,0}}, +/* 43739 */ {(12<<2)|2,{110,117,0}}, +/* 43740 */ {(12<<2)|2,{110,117,0}}, +/* 43741 */ {(12<<2)|2,{110,117,0}}, +/* 43742 */ {(12<<2)|2,{110,117,0}}, +/* 43743 */ {(12<<2)|2,{110,117,0}}, +/* 43744 */ {(13<<2)|2,{110,58,0}}, +/* 43745 */ {(13<<2)|2,{110,58,0}}, +/* 43746 */ {(13<<2)|2,{110,58,0}}, +/* 43747 */ {(13<<2)|2,{110,58,0}}, +/* 43748 */ {(13<<2)|2,{110,58,0}}, +/* 43749 */ {(13<<2)|2,{110,58,0}}, +/* 43750 */ {(13<<2)|2,{110,58,0}}, +/* 43751 */ {(13<<2)|2,{110,58,0}}, +/* 43752 */ {(13<<2)|2,{110,66,0}}, +/* 43753 */ {(13<<2)|2,{110,66,0}}, +/* 43754 */ {(13<<2)|2,{110,66,0}}, +/* 43755 */ {(13<<2)|2,{110,66,0}}, +/* 43756 */ {(13<<2)|2,{110,66,0}}, +/* 43757 */ {(13<<2)|2,{110,66,0}}, +/* 43758 */ {(13<<2)|2,{110,66,0}}, +/* 43759 */ {(13<<2)|2,{110,66,0}}, +/* 43760 */ {(13<<2)|2,{110,67,0}}, +/* 43761 */ {(13<<2)|2,{110,67,0}}, +/* 43762 */ {(13<<2)|2,{110,67,0}}, +/* 43763 */ {(13<<2)|2,{110,67,0}}, +/* 43764 */ {(13<<2)|2,{110,67,0}}, +/* 43765 */ {(13<<2)|2,{110,67,0}}, +/* 43766 */ {(13<<2)|2,{110,67,0}}, +/* 43767 */ {(13<<2)|2,{110,67,0}}, +/* 43768 */ {(13<<2)|2,{110,68,0}}, +/* 43769 */ {(13<<2)|2,{110,68,0}}, +/* 43770 */ {(13<<2)|2,{110,68,0}}, +/* 43771 */ {(13<<2)|2,{110,68,0}}, +/* 43772 */ {(13<<2)|2,{110,68,0}}, +/* 43773 */ {(13<<2)|2,{110,68,0}}, +/* 43774 */ {(13<<2)|2,{110,68,0}}, +/* 43775 */ {(13<<2)|2,{110,68,0}}, +/* 43776 */ {(13<<2)|2,{110,69,0}}, +/* 43777 */ {(13<<2)|2,{110,69,0}}, +/* 43778 */ {(13<<2)|2,{110,69,0}}, +/* 43779 */ {(13<<2)|2,{110,69,0}}, +/* 43780 */ {(13<<2)|2,{110,69,0}}, +/* 43781 */ {(13<<2)|2,{110,69,0}}, +/* 43782 */ {(13<<2)|2,{110,69,0}}, +/* 43783 */ {(13<<2)|2,{110,69,0}}, +/* 43784 */ {(13<<2)|2,{110,70,0}}, +/* 43785 */ {(13<<2)|2,{110,70,0}}, +/* 43786 */ {(13<<2)|2,{110,70,0}}, +/* 43787 */ {(13<<2)|2,{110,70,0}}, +/* 43788 */ {(13<<2)|2,{110,70,0}}, +/* 43789 */ {(13<<2)|2,{110,70,0}}, +/* 43790 */ {(13<<2)|2,{110,70,0}}, +/* 43791 */ {(13<<2)|2,{110,70,0}}, +/* 43792 */ {(13<<2)|2,{110,71,0}}, +/* 43793 */ {(13<<2)|2,{110,71,0}}, +/* 43794 */ {(13<<2)|2,{110,71,0}}, +/* 43795 */ {(13<<2)|2,{110,71,0}}, +/* 43796 */ {(13<<2)|2,{110,71,0}}, +/* 43797 */ {(13<<2)|2,{110,71,0}}, +/* 43798 */ {(13<<2)|2,{110,71,0}}, +/* 43799 */ {(13<<2)|2,{110,71,0}}, +/* 43800 */ {(13<<2)|2,{110,72,0}}, +/* 43801 */ {(13<<2)|2,{110,72,0}}, +/* 43802 */ {(13<<2)|2,{110,72,0}}, +/* 43803 */ {(13<<2)|2,{110,72,0}}, +/* 43804 */ {(13<<2)|2,{110,72,0}}, +/* 43805 */ {(13<<2)|2,{110,72,0}}, +/* 43806 */ {(13<<2)|2,{110,72,0}}, +/* 43807 */ {(13<<2)|2,{110,72,0}}, +/* 43808 */ {(13<<2)|2,{110,73,0}}, +/* 43809 */ {(13<<2)|2,{110,73,0}}, +/* 43810 */ {(13<<2)|2,{110,73,0}}, +/* 43811 */ {(13<<2)|2,{110,73,0}}, +/* 43812 */ {(13<<2)|2,{110,73,0}}, +/* 43813 */ {(13<<2)|2,{110,73,0}}, +/* 43814 */ {(13<<2)|2,{110,73,0}}, +/* 43815 */ {(13<<2)|2,{110,73,0}}, +/* 43816 */ {(13<<2)|2,{110,74,0}}, +/* 43817 */ {(13<<2)|2,{110,74,0}}, +/* 43818 */ {(13<<2)|2,{110,74,0}}, +/* 43819 */ {(13<<2)|2,{110,74,0}}, +/* 43820 */ {(13<<2)|2,{110,74,0}}, +/* 43821 */ {(13<<2)|2,{110,74,0}}, +/* 43822 */ {(13<<2)|2,{110,74,0}}, +/* 43823 */ {(13<<2)|2,{110,74,0}}, +/* 43824 */ {(13<<2)|2,{110,75,0}}, +/* 43825 */ {(13<<2)|2,{110,75,0}}, +/* 43826 */ {(13<<2)|2,{110,75,0}}, +/* 43827 */ {(13<<2)|2,{110,75,0}}, +/* 43828 */ {(13<<2)|2,{110,75,0}}, +/* 43829 */ {(13<<2)|2,{110,75,0}}, +/* 43830 */ {(13<<2)|2,{110,75,0}}, +/* 43831 */ {(13<<2)|2,{110,75,0}}, +/* 43832 */ {(13<<2)|2,{110,76,0}}, +/* 43833 */ {(13<<2)|2,{110,76,0}}, +/* 43834 */ {(13<<2)|2,{110,76,0}}, +/* 43835 */ {(13<<2)|2,{110,76,0}}, +/* 43836 */ {(13<<2)|2,{110,76,0}}, +/* 43837 */ {(13<<2)|2,{110,76,0}}, +/* 43838 */ {(13<<2)|2,{110,76,0}}, +/* 43839 */ {(13<<2)|2,{110,76,0}}, +/* 43840 */ {(13<<2)|2,{110,77,0}}, +/* 43841 */ {(13<<2)|2,{110,77,0}}, +/* 43842 */ {(13<<2)|2,{110,77,0}}, +/* 43843 */ {(13<<2)|2,{110,77,0}}, +/* 43844 */ {(13<<2)|2,{110,77,0}}, +/* 43845 */ {(13<<2)|2,{110,77,0}}, +/* 43846 */ {(13<<2)|2,{110,77,0}}, +/* 43847 */ {(13<<2)|2,{110,77,0}}, +/* 43848 */ {(13<<2)|2,{110,78,0}}, +/* 43849 */ {(13<<2)|2,{110,78,0}}, +/* 43850 */ {(13<<2)|2,{110,78,0}}, +/* 43851 */ {(13<<2)|2,{110,78,0}}, +/* 43852 */ {(13<<2)|2,{110,78,0}}, +/* 43853 */ {(13<<2)|2,{110,78,0}}, +/* 43854 */ {(13<<2)|2,{110,78,0}}, +/* 43855 */ {(13<<2)|2,{110,78,0}}, +/* 43856 */ {(13<<2)|2,{110,79,0}}, +/* 43857 */ {(13<<2)|2,{110,79,0}}, +/* 43858 */ {(13<<2)|2,{110,79,0}}, +/* 43859 */ {(13<<2)|2,{110,79,0}}, +/* 43860 */ {(13<<2)|2,{110,79,0}}, +/* 43861 */ {(13<<2)|2,{110,79,0}}, +/* 43862 */ {(13<<2)|2,{110,79,0}}, +/* 43863 */ {(13<<2)|2,{110,79,0}}, +/* 43864 */ {(13<<2)|2,{110,80,0}}, +/* 43865 */ {(13<<2)|2,{110,80,0}}, +/* 43866 */ {(13<<2)|2,{110,80,0}}, +/* 43867 */ {(13<<2)|2,{110,80,0}}, +/* 43868 */ {(13<<2)|2,{110,80,0}}, +/* 43869 */ {(13<<2)|2,{110,80,0}}, +/* 43870 */ {(13<<2)|2,{110,80,0}}, +/* 43871 */ {(13<<2)|2,{110,80,0}}, +/* 43872 */ {(13<<2)|2,{110,81,0}}, +/* 43873 */ {(13<<2)|2,{110,81,0}}, +/* 43874 */ {(13<<2)|2,{110,81,0}}, +/* 43875 */ {(13<<2)|2,{110,81,0}}, +/* 43876 */ {(13<<2)|2,{110,81,0}}, +/* 43877 */ {(13<<2)|2,{110,81,0}}, +/* 43878 */ {(13<<2)|2,{110,81,0}}, +/* 43879 */ {(13<<2)|2,{110,81,0}}, +/* 43880 */ {(13<<2)|2,{110,82,0}}, +/* 43881 */ {(13<<2)|2,{110,82,0}}, +/* 43882 */ {(13<<2)|2,{110,82,0}}, +/* 43883 */ {(13<<2)|2,{110,82,0}}, +/* 43884 */ {(13<<2)|2,{110,82,0}}, +/* 43885 */ {(13<<2)|2,{110,82,0}}, +/* 43886 */ {(13<<2)|2,{110,82,0}}, +/* 43887 */ {(13<<2)|2,{110,82,0}}, +/* 43888 */ {(13<<2)|2,{110,83,0}}, +/* 43889 */ {(13<<2)|2,{110,83,0}}, +/* 43890 */ {(13<<2)|2,{110,83,0}}, +/* 43891 */ {(13<<2)|2,{110,83,0}}, +/* 43892 */ {(13<<2)|2,{110,83,0}}, +/* 43893 */ {(13<<2)|2,{110,83,0}}, +/* 43894 */ {(13<<2)|2,{110,83,0}}, +/* 43895 */ {(13<<2)|2,{110,83,0}}, +/* 43896 */ {(13<<2)|2,{110,84,0}}, +/* 43897 */ {(13<<2)|2,{110,84,0}}, +/* 43898 */ {(13<<2)|2,{110,84,0}}, +/* 43899 */ {(13<<2)|2,{110,84,0}}, +/* 43900 */ {(13<<2)|2,{110,84,0}}, +/* 43901 */ {(13<<2)|2,{110,84,0}}, +/* 43902 */ {(13<<2)|2,{110,84,0}}, +/* 43903 */ {(13<<2)|2,{110,84,0}}, +/* 43904 */ {(13<<2)|2,{110,85,0}}, +/* 43905 */ {(13<<2)|2,{110,85,0}}, +/* 43906 */ {(13<<2)|2,{110,85,0}}, +/* 43907 */ {(13<<2)|2,{110,85,0}}, +/* 43908 */ {(13<<2)|2,{110,85,0}}, +/* 43909 */ {(13<<2)|2,{110,85,0}}, +/* 43910 */ {(13<<2)|2,{110,85,0}}, +/* 43911 */ {(13<<2)|2,{110,85,0}}, +/* 43912 */ {(13<<2)|2,{110,86,0}}, +/* 43913 */ {(13<<2)|2,{110,86,0}}, +/* 43914 */ {(13<<2)|2,{110,86,0}}, +/* 43915 */ {(13<<2)|2,{110,86,0}}, +/* 43916 */ {(13<<2)|2,{110,86,0}}, +/* 43917 */ {(13<<2)|2,{110,86,0}}, +/* 43918 */ {(13<<2)|2,{110,86,0}}, +/* 43919 */ {(13<<2)|2,{110,86,0}}, +/* 43920 */ {(13<<2)|2,{110,87,0}}, +/* 43921 */ {(13<<2)|2,{110,87,0}}, +/* 43922 */ {(13<<2)|2,{110,87,0}}, +/* 43923 */ {(13<<2)|2,{110,87,0}}, +/* 43924 */ {(13<<2)|2,{110,87,0}}, +/* 43925 */ {(13<<2)|2,{110,87,0}}, +/* 43926 */ {(13<<2)|2,{110,87,0}}, +/* 43927 */ {(13<<2)|2,{110,87,0}}, +/* 43928 */ {(13<<2)|2,{110,89,0}}, +/* 43929 */ {(13<<2)|2,{110,89,0}}, +/* 43930 */ {(13<<2)|2,{110,89,0}}, +/* 43931 */ {(13<<2)|2,{110,89,0}}, +/* 43932 */ {(13<<2)|2,{110,89,0}}, +/* 43933 */ {(13<<2)|2,{110,89,0}}, +/* 43934 */ {(13<<2)|2,{110,89,0}}, +/* 43935 */ {(13<<2)|2,{110,89,0}}, +/* 43936 */ {(13<<2)|2,{110,106,0}}, +/* 43937 */ {(13<<2)|2,{110,106,0}}, +/* 43938 */ {(13<<2)|2,{110,106,0}}, +/* 43939 */ {(13<<2)|2,{110,106,0}}, +/* 43940 */ {(13<<2)|2,{110,106,0}}, +/* 43941 */ {(13<<2)|2,{110,106,0}}, +/* 43942 */ {(13<<2)|2,{110,106,0}}, +/* 43943 */ {(13<<2)|2,{110,106,0}}, +/* 43944 */ {(13<<2)|2,{110,107,0}}, +/* 43945 */ {(13<<2)|2,{110,107,0}}, +/* 43946 */ {(13<<2)|2,{110,107,0}}, +/* 43947 */ {(13<<2)|2,{110,107,0}}, +/* 43948 */ {(13<<2)|2,{110,107,0}}, +/* 43949 */ {(13<<2)|2,{110,107,0}}, +/* 43950 */ {(13<<2)|2,{110,107,0}}, +/* 43951 */ {(13<<2)|2,{110,107,0}}, +/* 43952 */ {(13<<2)|2,{110,113,0}}, +/* 43953 */ {(13<<2)|2,{110,113,0}}, +/* 43954 */ {(13<<2)|2,{110,113,0}}, +/* 43955 */ {(13<<2)|2,{110,113,0}}, +/* 43956 */ {(13<<2)|2,{110,113,0}}, +/* 43957 */ {(13<<2)|2,{110,113,0}}, +/* 43958 */ {(13<<2)|2,{110,113,0}}, +/* 43959 */ {(13<<2)|2,{110,113,0}}, +/* 43960 */ {(13<<2)|2,{110,118,0}}, +/* 43961 */ {(13<<2)|2,{110,118,0}}, +/* 43962 */ {(13<<2)|2,{110,118,0}}, +/* 43963 */ {(13<<2)|2,{110,118,0}}, +/* 43964 */ {(13<<2)|2,{110,118,0}}, +/* 43965 */ {(13<<2)|2,{110,118,0}}, +/* 43966 */ {(13<<2)|2,{110,118,0}}, +/* 43967 */ {(13<<2)|2,{110,118,0}}, +/* 43968 */ {(13<<2)|2,{110,119,0}}, +/* 43969 */ {(13<<2)|2,{110,119,0}}, +/* 43970 */ {(13<<2)|2,{110,119,0}}, +/* 43971 */ {(13<<2)|2,{110,119,0}}, +/* 43972 */ {(13<<2)|2,{110,119,0}}, +/* 43973 */ {(13<<2)|2,{110,119,0}}, +/* 43974 */ {(13<<2)|2,{110,119,0}}, +/* 43975 */ {(13<<2)|2,{110,119,0}}, +/* 43976 */ {(13<<2)|2,{110,120,0}}, +/* 43977 */ {(13<<2)|2,{110,120,0}}, +/* 43978 */ {(13<<2)|2,{110,120,0}}, +/* 43979 */ {(13<<2)|2,{110,120,0}}, +/* 43980 */ {(13<<2)|2,{110,120,0}}, +/* 43981 */ {(13<<2)|2,{110,120,0}}, +/* 43982 */ {(13<<2)|2,{110,120,0}}, +/* 43983 */ {(13<<2)|2,{110,120,0}}, +/* 43984 */ {(13<<2)|2,{110,121,0}}, +/* 43985 */ {(13<<2)|2,{110,121,0}}, +/* 43986 */ {(13<<2)|2,{110,121,0}}, +/* 43987 */ {(13<<2)|2,{110,121,0}}, +/* 43988 */ {(13<<2)|2,{110,121,0}}, +/* 43989 */ {(13<<2)|2,{110,121,0}}, +/* 43990 */ {(13<<2)|2,{110,121,0}}, +/* 43991 */ {(13<<2)|2,{110,121,0}}, +/* 43992 */ {(13<<2)|2,{110,122,0}}, +/* 43993 */ {(13<<2)|2,{110,122,0}}, +/* 43994 */ {(13<<2)|2,{110,122,0}}, +/* 43995 */ {(13<<2)|2,{110,122,0}}, +/* 43996 */ {(13<<2)|2,{110,122,0}}, +/* 43997 */ {(13<<2)|2,{110,122,0}}, +/* 43998 */ {(13<<2)|2,{110,122,0}}, +/* 43999 */ {(13<<2)|2,{110,122,0}}, +/* 44000 */ {(14<<2)|2,{110,38,0}}, +/* 44001 */ {(14<<2)|2,{110,38,0}}, +/* 44002 */ {(14<<2)|2,{110,38,0}}, +/* 44003 */ {(14<<2)|2,{110,38,0}}, +/* 44004 */ {(14<<2)|2,{110,42,0}}, +/* 44005 */ {(14<<2)|2,{110,42,0}}, +/* 44006 */ {(14<<2)|2,{110,42,0}}, +/* 44007 */ {(14<<2)|2,{110,42,0}}, +/* 44008 */ {(14<<2)|2,{110,44,0}}, +/* 44009 */ {(14<<2)|2,{110,44,0}}, +/* 44010 */ {(14<<2)|2,{110,44,0}}, +/* 44011 */ {(14<<2)|2,{110,44,0}}, +/* 44012 */ {(14<<2)|2,{110,59,0}}, +/* 44013 */ {(14<<2)|2,{110,59,0}}, +/* 44014 */ {(14<<2)|2,{110,59,0}}, +/* 44015 */ {(14<<2)|2,{110,59,0}}, +/* 44016 */ {(14<<2)|2,{110,88,0}}, +/* 44017 */ {(14<<2)|2,{110,88,0}}, +/* 44018 */ {(14<<2)|2,{110,88,0}}, +/* 44019 */ {(14<<2)|2,{110,88,0}}, +/* 44020 */ {(14<<2)|2,{110,90,0}}, +/* 44021 */ {(14<<2)|2,{110,90,0}}, +/* 44022 */ {(14<<2)|2,{110,90,0}}, +/* 44023 */ {(14<<2)|2,{110,90,0}}, +/* 44024 */ {(16<<2)|2,{110,33,0}}, +/* 44025 */ {(16<<2)|2,{110,34,0}}, +/* 44026 */ {(16<<2)|2,{110,40,0}}, +/* 44027 */ {(16<<2)|2,{110,41,0}}, +/* 44028 */ {(16<<2)|2,{110,63,0}}, +/* 44029 */ {(6<<2)|1,{110,0,0}}, +/* 44030 */ {(6<<2)|1,{110,0,0}}, +/* 44031 */ {(6<<2)|1,{110,0,0}}, +/* 44032 */ {(16<<2)|3,{112,48,48}}, +/* 44033 */ {(16<<2)|3,{112,48,49}}, +/* 44034 */ {(16<<2)|3,{112,48,50}}, +/* 44035 */ {(16<<2)|3,{112,48,97}}, +/* 44036 */ {(16<<2)|3,{112,48,99}}, +/* 44037 */ {(16<<2)|3,{112,48,101}}, +/* 44038 */ {(16<<2)|3,{112,48,105}}, +/* 44039 */ {(16<<2)|3,{112,48,111}}, +/* 44040 */ {(16<<2)|3,{112,48,115}}, +/* 44041 */ {(16<<2)|3,{112,48,116}}, +/* 44042 */ {(11<<2)|2,{112,48,0}}, +/* 44043 */ {(11<<2)|2,{112,48,0}}, +/* 44044 */ {(11<<2)|2,{112,48,0}}, +/* 44045 */ {(11<<2)|2,{112,48,0}}, +/* 44046 */ {(11<<2)|2,{112,48,0}}, +/* 44047 */ {(11<<2)|2,{112,48,0}}, +/* 44048 */ {(11<<2)|2,{112,48,0}}, +/* 44049 */ {(11<<2)|2,{112,48,0}}, +/* 44050 */ {(11<<2)|2,{112,48,0}}, +/* 44051 */ {(11<<2)|2,{112,48,0}}, +/* 44052 */ {(11<<2)|2,{112,48,0}}, +/* 44053 */ {(11<<2)|2,{112,48,0}}, +/* 44054 */ {(11<<2)|2,{112,48,0}}, +/* 44055 */ {(11<<2)|2,{112,48,0}}, +/* 44056 */ {(11<<2)|2,{112,48,0}}, +/* 44057 */ {(11<<2)|2,{112,48,0}}, +/* 44058 */ {(11<<2)|2,{112,48,0}}, +/* 44059 */ {(11<<2)|2,{112,48,0}}, +/* 44060 */ {(11<<2)|2,{112,48,0}}, +/* 44061 */ {(11<<2)|2,{112,48,0}}, +/* 44062 */ {(11<<2)|2,{112,48,0}}, +/* 44063 */ {(11<<2)|2,{112,48,0}}, +/* 44064 */ {(16<<2)|3,{112,49,48}}, +/* 44065 */ {(16<<2)|3,{112,49,49}}, +/* 44066 */ {(16<<2)|3,{112,49,50}}, +/* 44067 */ {(16<<2)|3,{112,49,97}}, +/* 44068 */ {(16<<2)|3,{112,49,99}}, +/* 44069 */ {(16<<2)|3,{112,49,101}}, +/* 44070 */ {(16<<2)|3,{112,49,105}}, +/* 44071 */ {(16<<2)|3,{112,49,111}}, +/* 44072 */ {(16<<2)|3,{112,49,115}}, +/* 44073 */ {(16<<2)|3,{112,49,116}}, +/* 44074 */ {(11<<2)|2,{112,49,0}}, +/* 44075 */ {(11<<2)|2,{112,49,0}}, +/* 44076 */ {(11<<2)|2,{112,49,0}}, +/* 44077 */ {(11<<2)|2,{112,49,0}}, +/* 44078 */ {(11<<2)|2,{112,49,0}}, +/* 44079 */ {(11<<2)|2,{112,49,0}}, +/* 44080 */ {(11<<2)|2,{112,49,0}}, +/* 44081 */ {(11<<2)|2,{112,49,0}}, +/* 44082 */ {(11<<2)|2,{112,49,0}}, +/* 44083 */ {(11<<2)|2,{112,49,0}}, +/* 44084 */ {(11<<2)|2,{112,49,0}}, +/* 44085 */ {(11<<2)|2,{112,49,0}}, +/* 44086 */ {(11<<2)|2,{112,49,0}}, +/* 44087 */ {(11<<2)|2,{112,49,0}}, +/* 44088 */ {(11<<2)|2,{112,49,0}}, +/* 44089 */ {(11<<2)|2,{112,49,0}}, +/* 44090 */ {(11<<2)|2,{112,49,0}}, +/* 44091 */ {(11<<2)|2,{112,49,0}}, +/* 44092 */ {(11<<2)|2,{112,49,0}}, +/* 44093 */ {(11<<2)|2,{112,49,0}}, +/* 44094 */ {(11<<2)|2,{112,49,0}}, +/* 44095 */ {(11<<2)|2,{112,49,0}}, +/* 44096 */ {(16<<2)|3,{112,50,48}}, +/* 44097 */ {(16<<2)|3,{112,50,49}}, +/* 44098 */ {(16<<2)|3,{112,50,50}}, +/* 44099 */ {(16<<2)|3,{112,50,97}}, +/* 44100 */ {(16<<2)|3,{112,50,99}}, +/* 44101 */ {(16<<2)|3,{112,50,101}}, +/* 44102 */ {(16<<2)|3,{112,50,105}}, +/* 44103 */ {(16<<2)|3,{112,50,111}}, +/* 44104 */ {(16<<2)|3,{112,50,115}}, +/* 44105 */ {(16<<2)|3,{112,50,116}}, +/* 44106 */ {(11<<2)|2,{112,50,0}}, +/* 44107 */ {(11<<2)|2,{112,50,0}}, +/* 44108 */ {(11<<2)|2,{112,50,0}}, +/* 44109 */ {(11<<2)|2,{112,50,0}}, +/* 44110 */ {(11<<2)|2,{112,50,0}}, +/* 44111 */ {(11<<2)|2,{112,50,0}}, +/* 44112 */ {(11<<2)|2,{112,50,0}}, +/* 44113 */ {(11<<2)|2,{112,50,0}}, +/* 44114 */ {(11<<2)|2,{112,50,0}}, +/* 44115 */ {(11<<2)|2,{112,50,0}}, +/* 44116 */ {(11<<2)|2,{112,50,0}}, +/* 44117 */ {(11<<2)|2,{112,50,0}}, +/* 44118 */ {(11<<2)|2,{112,50,0}}, +/* 44119 */ {(11<<2)|2,{112,50,0}}, +/* 44120 */ {(11<<2)|2,{112,50,0}}, +/* 44121 */ {(11<<2)|2,{112,50,0}}, +/* 44122 */ {(11<<2)|2,{112,50,0}}, +/* 44123 */ {(11<<2)|2,{112,50,0}}, +/* 44124 */ {(11<<2)|2,{112,50,0}}, +/* 44125 */ {(11<<2)|2,{112,50,0}}, +/* 44126 */ {(11<<2)|2,{112,50,0}}, +/* 44127 */ {(11<<2)|2,{112,50,0}}, +/* 44128 */ {(16<<2)|3,{112,97,48}}, +/* 44129 */ {(16<<2)|3,{112,97,49}}, +/* 44130 */ {(16<<2)|3,{112,97,50}}, +/* 44131 */ {(16<<2)|3,{112,97,97}}, +/* 44132 */ {(16<<2)|3,{112,97,99}}, +/* 44133 */ {(16<<2)|3,{112,97,101}}, +/* 44134 */ {(16<<2)|3,{112,97,105}}, +/* 44135 */ {(16<<2)|3,{112,97,111}}, +/* 44136 */ {(16<<2)|3,{112,97,115}}, +/* 44137 */ {(16<<2)|3,{112,97,116}}, +/* 44138 */ {(11<<2)|2,{112,97,0}}, +/* 44139 */ {(11<<2)|2,{112,97,0}}, +/* 44140 */ {(11<<2)|2,{112,97,0}}, +/* 44141 */ {(11<<2)|2,{112,97,0}}, +/* 44142 */ {(11<<2)|2,{112,97,0}}, +/* 44143 */ {(11<<2)|2,{112,97,0}}, +/* 44144 */ {(11<<2)|2,{112,97,0}}, +/* 44145 */ {(11<<2)|2,{112,97,0}}, +/* 44146 */ {(11<<2)|2,{112,97,0}}, +/* 44147 */ {(11<<2)|2,{112,97,0}}, +/* 44148 */ {(11<<2)|2,{112,97,0}}, +/* 44149 */ {(11<<2)|2,{112,97,0}}, +/* 44150 */ {(11<<2)|2,{112,97,0}}, +/* 44151 */ {(11<<2)|2,{112,97,0}}, +/* 44152 */ {(11<<2)|2,{112,97,0}}, +/* 44153 */ {(11<<2)|2,{112,97,0}}, +/* 44154 */ {(11<<2)|2,{112,97,0}}, +/* 44155 */ {(11<<2)|2,{112,97,0}}, +/* 44156 */ {(11<<2)|2,{112,97,0}}, +/* 44157 */ {(11<<2)|2,{112,97,0}}, +/* 44158 */ {(11<<2)|2,{112,97,0}}, +/* 44159 */ {(11<<2)|2,{112,97,0}}, +/* 44160 */ {(16<<2)|3,{112,99,48}}, +/* 44161 */ {(16<<2)|3,{112,99,49}}, +/* 44162 */ {(16<<2)|3,{112,99,50}}, +/* 44163 */ {(16<<2)|3,{112,99,97}}, +/* 44164 */ {(16<<2)|3,{112,99,99}}, +/* 44165 */ {(16<<2)|3,{112,99,101}}, +/* 44166 */ {(16<<2)|3,{112,99,105}}, +/* 44167 */ {(16<<2)|3,{112,99,111}}, +/* 44168 */ {(16<<2)|3,{112,99,115}}, +/* 44169 */ {(16<<2)|3,{112,99,116}}, +/* 44170 */ {(11<<2)|2,{112,99,0}}, +/* 44171 */ {(11<<2)|2,{112,99,0}}, +/* 44172 */ {(11<<2)|2,{112,99,0}}, +/* 44173 */ {(11<<2)|2,{112,99,0}}, +/* 44174 */ {(11<<2)|2,{112,99,0}}, +/* 44175 */ {(11<<2)|2,{112,99,0}}, +/* 44176 */ {(11<<2)|2,{112,99,0}}, +/* 44177 */ {(11<<2)|2,{112,99,0}}, +/* 44178 */ {(11<<2)|2,{112,99,0}}, +/* 44179 */ {(11<<2)|2,{112,99,0}}, +/* 44180 */ {(11<<2)|2,{112,99,0}}, +/* 44181 */ {(11<<2)|2,{112,99,0}}, +/* 44182 */ {(11<<2)|2,{112,99,0}}, +/* 44183 */ {(11<<2)|2,{112,99,0}}, +/* 44184 */ {(11<<2)|2,{112,99,0}}, +/* 44185 */ {(11<<2)|2,{112,99,0}}, +/* 44186 */ {(11<<2)|2,{112,99,0}}, +/* 44187 */ {(11<<2)|2,{112,99,0}}, +/* 44188 */ {(11<<2)|2,{112,99,0}}, +/* 44189 */ {(11<<2)|2,{112,99,0}}, +/* 44190 */ {(11<<2)|2,{112,99,0}}, +/* 44191 */ {(11<<2)|2,{112,99,0}}, +/* 44192 */ {(16<<2)|3,{112,101,48}}, +/* 44193 */ {(16<<2)|3,{112,101,49}}, +/* 44194 */ {(16<<2)|3,{112,101,50}}, +/* 44195 */ {(16<<2)|3,{112,101,97}}, +/* 44196 */ {(16<<2)|3,{112,101,99}}, +/* 44197 */ {(16<<2)|3,{112,101,101}}, +/* 44198 */ {(16<<2)|3,{112,101,105}}, +/* 44199 */ {(16<<2)|3,{112,101,111}}, +/* 44200 */ {(16<<2)|3,{112,101,115}}, +/* 44201 */ {(16<<2)|3,{112,101,116}}, +/* 44202 */ {(11<<2)|2,{112,101,0}}, +/* 44203 */ {(11<<2)|2,{112,101,0}}, +/* 44204 */ {(11<<2)|2,{112,101,0}}, +/* 44205 */ {(11<<2)|2,{112,101,0}}, +/* 44206 */ {(11<<2)|2,{112,101,0}}, +/* 44207 */ {(11<<2)|2,{112,101,0}}, +/* 44208 */ {(11<<2)|2,{112,101,0}}, +/* 44209 */ {(11<<2)|2,{112,101,0}}, +/* 44210 */ {(11<<2)|2,{112,101,0}}, +/* 44211 */ {(11<<2)|2,{112,101,0}}, +/* 44212 */ {(11<<2)|2,{112,101,0}}, +/* 44213 */ {(11<<2)|2,{112,101,0}}, +/* 44214 */ {(11<<2)|2,{112,101,0}}, +/* 44215 */ {(11<<2)|2,{112,101,0}}, +/* 44216 */ {(11<<2)|2,{112,101,0}}, +/* 44217 */ {(11<<2)|2,{112,101,0}}, +/* 44218 */ {(11<<2)|2,{112,101,0}}, +/* 44219 */ {(11<<2)|2,{112,101,0}}, +/* 44220 */ {(11<<2)|2,{112,101,0}}, +/* 44221 */ {(11<<2)|2,{112,101,0}}, +/* 44222 */ {(11<<2)|2,{112,101,0}}, +/* 44223 */ {(11<<2)|2,{112,101,0}}, +/* 44224 */ {(16<<2)|3,{112,105,48}}, +/* 44225 */ {(16<<2)|3,{112,105,49}}, +/* 44226 */ {(16<<2)|3,{112,105,50}}, +/* 44227 */ {(16<<2)|3,{112,105,97}}, +/* 44228 */ {(16<<2)|3,{112,105,99}}, +/* 44229 */ {(16<<2)|3,{112,105,101}}, +/* 44230 */ {(16<<2)|3,{112,105,105}}, +/* 44231 */ {(16<<2)|3,{112,105,111}}, +/* 44232 */ {(16<<2)|3,{112,105,115}}, +/* 44233 */ {(16<<2)|3,{112,105,116}}, +/* 44234 */ {(11<<2)|2,{112,105,0}}, +/* 44235 */ {(11<<2)|2,{112,105,0}}, +/* 44236 */ {(11<<2)|2,{112,105,0}}, +/* 44237 */ {(11<<2)|2,{112,105,0}}, +/* 44238 */ {(11<<2)|2,{112,105,0}}, +/* 44239 */ {(11<<2)|2,{112,105,0}}, +/* 44240 */ {(11<<2)|2,{112,105,0}}, +/* 44241 */ {(11<<2)|2,{112,105,0}}, +/* 44242 */ {(11<<2)|2,{112,105,0}}, +/* 44243 */ {(11<<2)|2,{112,105,0}}, +/* 44244 */ {(11<<2)|2,{112,105,0}}, +/* 44245 */ {(11<<2)|2,{112,105,0}}, +/* 44246 */ {(11<<2)|2,{112,105,0}}, +/* 44247 */ {(11<<2)|2,{112,105,0}}, +/* 44248 */ {(11<<2)|2,{112,105,0}}, +/* 44249 */ {(11<<2)|2,{112,105,0}}, +/* 44250 */ {(11<<2)|2,{112,105,0}}, +/* 44251 */ {(11<<2)|2,{112,105,0}}, +/* 44252 */ {(11<<2)|2,{112,105,0}}, +/* 44253 */ {(11<<2)|2,{112,105,0}}, +/* 44254 */ {(11<<2)|2,{112,105,0}}, +/* 44255 */ {(11<<2)|2,{112,105,0}}, +/* 44256 */ {(16<<2)|3,{112,111,48}}, +/* 44257 */ {(16<<2)|3,{112,111,49}}, +/* 44258 */ {(16<<2)|3,{112,111,50}}, +/* 44259 */ {(16<<2)|3,{112,111,97}}, +/* 44260 */ {(16<<2)|3,{112,111,99}}, +/* 44261 */ {(16<<2)|3,{112,111,101}}, +/* 44262 */ {(16<<2)|3,{112,111,105}}, +/* 44263 */ {(16<<2)|3,{112,111,111}}, +/* 44264 */ {(16<<2)|3,{112,111,115}}, +/* 44265 */ {(16<<2)|3,{112,111,116}}, +/* 44266 */ {(11<<2)|2,{112,111,0}}, +/* 44267 */ {(11<<2)|2,{112,111,0}}, +/* 44268 */ {(11<<2)|2,{112,111,0}}, +/* 44269 */ {(11<<2)|2,{112,111,0}}, +/* 44270 */ {(11<<2)|2,{112,111,0}}, +/* 44271 */ {(11<<2)|2,{112,111,0}}, +/* 44272 */ {(11<<2)|2,{112,111,0}}, +/* 44273 */ {(11<<2)|2,{112,111,0}}, +/* 44274 */ {(11<<2)|2,{112,111,0}}, +/* 44275 */ {(11<<2)|2,{112,111,0}}, +/* 44276 */ {(11<<2)|2,{112,111,0}}, +/* 44277 */ {(11<<2)|2,{112,111,0}}, +/* 44278 */ {(11<<2)|2,{112,111,0}}, +/* 44279 */ {(11<<2)|2,{112,111,0}}, +/* 44280 */ {(11<<2)|2,{112,111,0}}, +/* 44281 */ {(11<<2)|2,{112,111,0}}, +/* 44282 */ {(11<<2)|2,{112,111,0}}, +/* 44283 */ {(11<<2)|2,{112,111,0}}, +/* 44284 */ {(11<<2)|2,{112,111,0}}, +/* 44285 */ {(11<<2)|2,{112,111,0}}, +/* 44286 */ {(11<<2)|2,{112,111,0}}, +/* 44287 */ {(11<<2)|2,{112,111,0}}, +/* 44288 */ {(16<<2)|3,{112,115,48}}, +/* 44289 */ {(16<<2)|3,{112,115,49}}, +/* 44290 */ {(16<<2)|3,{112,115,50}}, +/* 44291 */ {(16<<2)|3,{112,115,97}}, +/* 44292 */ {(16<<2)|3,{112,115,99}}, +/* 44293 */ {(16<<2)|3,{112,115,101}}, +/* 44294 */ {(16<<2)|3,{112,115,105}}, +/* 44295 */ {(16<<2)|3,{112,115,111}}, +/* 44296 */ {(16<<2)|3,{112,115,115}}, +/* 44297 */ {(16<<2)|3,{112,115,116}}, +/* 44298 */ {(11<<2)|2,{112,115,0}}, +/* 44299 */ {(11<<2)|2,{112,115,0}}, +/* 44300 */ {(11<<2)|2,{112,115,0}}, +/* 44301 */ {(11<<2)|2,{112,115,0}}, +/* 44302 */ {(11<<2)|2,{112,115,0}}, +/* 44303 */ {(11<<2)|2,{112,115,0}}, +/* 44304 */ {(11<<2)|2,{112,115,0}}, +/* 44305 */ {(11<<2)|2,{112,115,0}}, +/* 44306 */ {(11<<2)|2,{112,115,0}}, +/* 44307 */ {(11<<2)|2,{112,115,0}}, +/* 44308 */ {(11<<2)|2,{112,115,0}}, +/* 44309 */ {(11<<2)|2,{112,115,0}}, +/* 44310 */ {(11<<2)|2,{112,115,0}}, +/* 44311 */ {(11<<2)|2,{112,115,0}}, +/* 44312 */ {(11<<2)|2,{112,115,0}}, +/* 44313 */ {(11<<2)|2,{112,115,0}}, +/* 44314 */ {(11<<2)|2,{112,115,0}}, +/* 44315 */ {(11<<2)|2,{112,115,0}}, +/* 44316 */ {(11<<2)|2,{112,115,0}}, +/* 44317 */ {(11<<2)|2,{112,115,0}}, +/* 44318 */ {(11<<2)|2,{112,115,0}}, +/* 44319 */ {(11<<2)|2,{112,115,0}}, +/* 44320 */ {(16<<2)|3,{112,116,48}}, +/* 44321 */ {(16<<2)|3,{112,116,49}}, +/* 44322 */ {(16<<2)|3,{112,116,50}}, +/* 44323 */ {(16<<2)|3,{112,116,97}}, +/* 44324 */ {(16<<2)|3,{112,116,99}}, +/* 44325 */ {(16<<2)|3,{112,116,101}}, +/* 44326 */ {(16<<2)|3,{112,116,105}}, +/* 44327 */ {(16<<2)|3,{112,116,111}}, +/* 44328 */ {(16<<2)|3,{112,116,115}}, +/* 44329 */ {(16<<2)|3,{112,116,116}}, +/* 44330 */ {(11<<2)|2,{112,116,0}}, +/* 44331 */ {(11<<2)|2,{112,116,0}}, +/* 44332 */ {(11<<2)|2,{112,116,0}}, +/* 44333 */ {(11<<2)|2,{112,116,0}}, +/* 44334 */ {(11<<2)|2,{112,116,0}}, +/* 44335 */ {(11<<2)|2,{112,116,0}}, +/* 44336 */ {(11<<2)|2,{112,116,0}}, +/* 44337 */ {(11<<2)|2,{112,116,0}}, +/* 44338 */ {(11<<2)|2,{112,116,0}}, +/* 44339 */ {(11<<2)|2,{112,116,0}}, +/* 44340 */ {(11<<2)|2,{112,116,0}}, +/* 44341 */ {(11<<2)|2,{112,116,0}}, +/* 44342 */ {(11<<2)|2,{112,116,0}}, +/* 44343 */ {(11<<2)|2,{112,116,0}}, +/* 44344 */ {(11<<2)|2,{112,116,0}}, +/* 44345 */ {(11<<2)|2,{112,116,0}}, +/* 44346 */ {(11<<2)|2,{112,116,0}}, +/* 44347 */ {(11<<2)|2,{112,116,0}}, +/* 44348 */ {(11<<2)|2,{112,116,0}}, +/* 44349 */ {(11<<2)|2,{112,116,0}}, +/* 44350 */ {(11<<2)|2,{112,116,0}}, +/* 44351 */ {(11<<2)|2,{112,116,0}}, +/* 44352 */ {(12<<2)|2,{112,32,0}}, +/* 44353 */ {(12<<2)|2,{112,32,0}}, +/* 44354 */ {(12<<2)|2,{112,32,0}}, +/* 44355 */ {(12<<2)|2,{112,32,0}}, +/* 44356 */ {(12<<2)|2,{112,32,0}}, +/* 44357 */ {(12<<2)|2,{112,32,0}}, +/* 44358 */ {(12<<2)|2,{112,32,0}}, +/* 44359 */ {(12<<2)|2,{112,32,0}}, +/* 44360 */ {(12<<2)|2,{112,32,0}}, +/* 44361 */ {(12<<2)|2,{112,32,0}}, +/* 44362 */ {(12<<2)|2,{112,32,0}}, +/* 44363 */ {(12<<2)|2,{112,32,0}}, +/* 44364 */ {(12<<2)|2,{112,32,0}}, +/* 44365 */ {(12<<2)|2,{112,32,0}}, +/* 44366 */ {(12<<2)|2,{112,32,0}}, +/* 44367 */ {(12<<2)|2,{112,32,0}}, +/* 44368 */ {(12<<2)|2,{112,37,0}}, +/* 44369 */ {(12<<2)|2,{112,37,0}}, +/* 44370 */ {(12<<2)|2,{112,37,0}}, +/* 44371 */ {(12<<2)|2,{112,37,0}}, +/* 44372 */ {(12<<2)|2,{112,37,0}}, +/* 44373 */ {(12<<2)|2,{112,37,0}}, +/* 44374 */ {(12<<2)|2,{112,37,0}}, +/* 44375 */ {(12<<2)|2,{112,37,0}}, +/* 44376 */ {(12<<2)|2,{112,37,0}}, +/* 44377 */ {(12<<2)|2,{112,37,0}}, +/* 44378 */ {(12<<2)|2,{112,37,0}}, +/* 44379 */ {(12<<2)|2,{112,37,0}}, +/* 44380 */ {(12<<2)|2,{112,37,0}}, +/* 44381 */ {(12<<2)|2,{112,37,0}}, +/* 44382 */ {(12<<2)|2,{112,37,0}}, +/* 44383 */ {(12<<2)|2,{112,37,0}}, +/* 44384 */ {(12<<2)|2,{112,45,0}}, +/* 44385 */ {(12<<2)|2,{112,45,0}}, +/* 44386 */ {(12<<2)|2,{112,45,0}}, +/* 44387 */ {(12<<2)|2,{112,45,0}}, +/* 44388 */ {(12<<2)|2,{112,45,0}}, +/* 44389 */ {(12<<2)|2,{112,45,0}}, +/* 44390 */ {(12<<2)|2,{112,45,0}}, +/* 44391 */ {(12<<2)|2,{112,45,0}}, +/* 44392 */ {(12<<2)|2,{112,45,0}}, +/* 44393 */ {(12<<2)|2,{112,45,0}}, +/* 44394 */ {(12<<2)|2,{112,45,0}}, +/* 44395 */ {(12<<2)|2,{112,45,0}}, +/* 44396 */ {(12<<2)|2,{112,45,0}}, +/* 44397 */ {(12<<2)|2,{112,45,0}}, +/* 44398 */ {(12<<2)|2,{112,45,0}}, +/* 44399 */ {(12<<2)|2,{112,45,0}}, +/* 44400 */ {(12<<2)|2,{112,46,0}}, +/* 44401 */ {(12<<2)|2,{112,46,0}}, +/* 44402 */ {(12<<2)|2,{112,46,0}}, +/* 44403 */ {(12<<2)|2,{112,46,0}}, +/* 44404 */ {(12<<2)|2,{112,46,0}}, +/* 44405 */ {(12<<2)|2,{112,46,0}}, +/* 44406 */ {(12<<2)|2,{112,46,0}}, +/* 44407 */ {(12<<2)|2,{112,46,0}}, +/* 44408 */ {(12<<2)|2,{112,46,0}}, +/* 44409 */ {(12<<2)|2,{112,46,0}}, +/* 44410 */ {(12<<2)|2,{112,46,0}}, +/* 44411 */ {(12<<2)|2,{112,46,0}}, +/* 44412 */ {(12<<2)|2,{112,46,0}}, +/* 44413 */ {(12<<2)|2,{112,46,0}}, +/* 44414 */ {(12<<2)|2,{112,46,0}}, +/* 44415 */ {(12<<2)|2,{112,46,0}}, +/* 44416 */ {(12<<2)|2,{112,47,0}}, +/* 44417 */ {(12<<2)|2,{112,47,0}}, +/* 44418 */ {(12<<2)|2,{112,47,0}}, +/* 44419 */ {(12<<2)|2,{112,47,0}}, +/* 44420 */ {(12<<2)|2,{112,47,0}}, +/* 44421 */ {(12<<2)|2,{112,47,0}}, +/* 44422 */ {(12<<2)|2,{112,47,0}}, +/* 44423 */ {(12<<2)|2,{112,47,0}}, +/* 44424 */ {(12<<2)|2,{112,47,0}}, +/* 44425 */ {(12<<2)|2,{112,47,0}}, +/* 44426 */ {(12<<2)|2,{112,47,0}}, +/* 44427 */ {(12<<2)|2,{112,47,0}}, +/* 44428 */ {(12<<2)|2,{112,47,0}}, +/* 44429 */ {(12<<2)|2,{112,47,0}}, +/* 44430 */ {(12<<2)|2,{112,47,0}}, +/* 44431 */ {(12<<2)|2,{112,47,0}}, +/* 44432 */ {(12<<2)|2,{112,51,0}}, +/* 44433 */ {(12<<2)|2,{112,51,0}}, +/* 44434 */ {(12<<2)|2,{112,51,0}}, +/* 44435 */ {(12<<2)|2,{112,51,0}}, +/* 44436 */ {(12<<2)|2,{112,51,0}}, +/* 44437 */ {(12<<2)|2,{112,51,0}}, +/* 44438 */ {(12<<2)|2,{112,51,0}}, +/* 44439 */ {(12<<2)|2,{112,51,0}}, +/* 44440 */ {(12<<2)|2,{112,51,0}}, +/* 44441 */ {(12<<2)|2,{112,51,0}}, +/* 44442 */ {(12<<2)|2,{112,51,0}}, +/* 44443 */ {(12<<2)|2,{112,51,0}}, +/* 44444 */ {(12<<2)|2,{112,51,0}}, +/* 44445 */ {(12<<2)|2,{112,51,0}}, +/* 44446 */ {(12<<2)|2,{112,51,0}}, +/* 44447 */ {(12<<2)|2,{112,51,0}}, +/* 44448 */ {(12<<2)|2,{112,52,0}}, +/* 44449 */ {(12<<2)|2,{112,52,0}}, +/* 44450 */ {(12<<2)|2,{112,52,0}}, +/* 44451 */ {(12<<2)|2,{112,52,0}}, +/* 44452 */ {(12<<2)|2,{112,52,0}}, +/* 44453 */ {(12<<2)|2,{112,52,0}}, +/* 44454 */ {(12<<2)|2,{112,52,0}}, +/* 44455 */ {(12<<2)|2,{112,52,0}}, +/* 44456 */ {(12<<2)|2,{112,52,0}}, +/* 44457 */ {(12<<2)|2,{112,52,0}}, +/* 44458 */ {(12<<2)|2,{112,52,0}}, +/* 44459 */ {(12<<2)|2,{112,52,0}}, +/* 44460 */ {(12<<2)|2,{112,52,0}}, +/* 44461 */ {(12<<2)|2,{112,52,0}}, +/* 44462 */ {(12<<2)|2,{112,52,0}}, +/* 44463 */ {(12<<2)|2,{112,52,0}}, +/* 44464 */ {(12<<2)|2,{112,53,0}}, +/* 44465 */ {(12<<2)|2,{112,53,0}}, +/* 44466 */ {(12<<2)|2,{112,53,0}}, +/* 44467 */ {(12<<2)|2,{112,53,0}}, +/* 44468 */ {(12<<2)|2,{112,53,0}}, +/* 44469 */ {(12<<2)|2,{112,53,0}}, +/* 44470 */ {(12<<2)|2,{112,53,0}}, +/* 44471 */ {(12<<2)|2,{112,53,0}}, +/* 44472 */ {(12<<2)|2,{112,53,0}}, +/* 44473 */ {(12<<2)|2,{112,53,0}}, +/* 44474 */ {(12<<2)|2,{112,53,0}}, +/* 44475 */ {(12<<2)|2,{112,53,0}}, +/* 44476 */ {(12<<2)|2,{112,53,0}}, +/* 44477 */ {(12<<2)|2,{112,53,0}}, +/* 44478 */ {(12<<2)|2,{112,53,0}}, +/* 44479 */ {(12<<2)|2,{112,53,0}}, +/* 44480 */ {(12<<2)|2,{112,54,0}}, +/* 44481 */ {(12<<2)|2,{112,54,0}}, +/* 44482 */ {(12<<2)|2,{112,54,0}}, +/* 44483 */ {(12<<2)|2,{112,54,0}}, +/* 44484 */ {(12<<2)|2,{112,54,0}}, +/* 44485 */ {(12<<2)|2,{112,54,0}}, +/* 44486 */ {(12<<2)|2,{112,54,0}}, +/* 44487 */ {(12<<2)|2,{112,54,0}}, +/* 44488 */ {(12<<2)|2,{112,54,0}}, +/* 44489 */ {(12<<2)|2,{112,54,0}}, +/* 44490 */ {(12<<2)|2,{112,54,0}}, +/* 44491 */ {(12<<2)|2,{112,54,0}}, +/* 44492 */ {(12<<2)|2,{112,54,0}}, +/* 44493 */ {(12<<2)|2,{112,54,0}}, +/* 44494 */ {(12<<2)|2,{112,54,0}}, +/* 44495 */ {(12<<2)|2,{112,54,0}}, +/* 44496 */ {(12<<2)|2,{112,55,0}}, +/* 44497 */ {(12<<2)|2,{112,55,0}}, +/* 44498 */ {(12<<2)|2,{112,55,0}}, +/* 44499 */ {(12<<2)|2,{112,55,0}}, +/* 44500 */ {(12<<2)|2,{112,55,0}}, +/* 44501 */ {(12<<2)|2,{112,55,0}}, +/* 44502 */ {(12<<2)|2,{112,55,0}}, +/* 44503 */ {(12<<2)|2,{112,55,0}}, +/* 44504 */ {(12<<2)|2,{112,55,0}}, +/* 44505 */ {(12<<2)|2,{112,55,0}}, +/* 44506 */ {(12<<2)|2,{112,55,0}}, +/* 44507 */ {(12<<2)|2,{112,55,0}}, +/* 44508 */ {(12<<2)|2,{112,55,0}}, +/* 44509 */ {(12<<2)|2,{112,55,0}}, +/* 44510 */ {(12<<2)|2,{112,55,0}}, +/* 44511 */ {(12<<2)|2,{112,55,0}}, +/* 44512 */ {(12<<2)|2,{112,56,0}}, +/* 44513 */ {(12<<2)|2,{112,56,0}}, +/* 44514 */ {(12<<2)|2,{112,56,0}}, +/* 44515 */ {(12<<2)|2,{112,56,0}}, +/* 44516 */ {(12<<2)|2,{112,56,0}}, +/* 44517 */ {(12<<2)|2,{112,56,0}}, +/* 44518 */ {(12<<2)|2,{112,56,0}}, +/* 44519 */ {(12<<2)|2,{112,56,0}}, +/* 44520 */ {(12<<2)|2,{112,56,0}}, +/* 44521 */ {(12<<2)|2,{112,56,0}}, +/* 44522 */ {(12<<2)|2,{112,56,0}}, +/* 44523 */ {(12<<2)|2,{112,56,0}}, +/* 44524 */ {(12<<2)|2,{112,56,0}}, +/* 44525 */ {(12<<2)|2,{112,56,0}}, +/* 44526 */ {(12<<2)|2,{112,56,0}}, +/* 44527 */ {(12<<2)|2,{112,56,0}}, +/* 44528 */ {(12<<2)|2,{112,57,0}}, +/* 44529 */ {(12<<2)|2,{112,57,0}}, +/* 44530 */ {(12<<2)|2,{112,57,0}}, +/* 44531 */ {(12<<2)|2,{112,57,0}}, +/* 44532 */ {(12<<2)|2,{112,57,0}}, +/* 44533 */ {(12<<2)|2,{112,57,0}}, +/* 44534 */ {(12<<2)|2,{112,57,0}}, +/* 44535 */ {(12<<2)|2,{112,57,0}}, +/* 44536 */ {(12<<2)|2,{112,57,0}}, +/* 44537 */ {(12<<2)|2,{112,57,0}}, +/* 44538 */ {(12<<2)|2,{112,57,0}}, +/* 44539 */ {(12<<2)|2,{112,57,0}}, +/* 44540 */ {(12<<2)|2,{112,57,0}}, +/* 44541 */ {(12<<2)|2,{112,57,0}}, +/* 44542 */ {(12<<2)|2,{112,57,0}}, +/* 44543 */ {(12<<2)|2,{112,57,0}}, +/* 44544 */ {(12<<2)|2,{112,61,0}}, +/* 44545 */ {(12<<2)|2,{112,61,0}}, +/* 44546 */ {(12<<2)|2,{112,61,0}}, +/* 44547 */ {(12<<2)|2,{112,61,0}}, +/* 44548 */ {(12<<2)|2,{112,61,0}}, +/* 44549 */ {(12<<2)|2,{112,61,0}}, +/* 44550 */ {(12<<2)|2,{112,61,0}}, +/* 44551 */ {(12<<2)|2,{112,61,0}}, +/* 44552 */ {(12<<2)|2,{112,61,0}}, +/* 44553 */ {(12<<2)|2,{112,61,0}}, +/* 44554 */ {(12<<2)|2,{112,61,0}}, +/* 44555 */ {(12<<2)|2,{112,61,0}}, +/* 44556 */ {(12<<2)|2,{112,61,0}}, +/* 44557 */ {(12<<2)|2,{112,61,0}}, +/* 44558 */ {(12<<2)|2,{112,61,0}}, +/* 44559 */ {(12<<2)|2,{112,61,0}}, +/* 44560 */ {(12<<2)|2,{112,65,0}}, +/* 44561 */ {(12<<2)|2,{112,65,0}}, +/* 44562 */ {(12<<2)|2,{112,65,0}}, +/* 44563 */ {(12<<2)|2,{112,65,0}}, +/* 44564 */ {(12<<2)|2,{112,65,0}}, +/* 44565 */ {(12<<2)|2,{112,65,0}}, +/* 44566 */ {(12<<2)|2,{112,65,0}}, +/* 44567 */ {(12<<2)|2,{112,65,0}}, +/* 44568 */ {(12<<2)|2,{112,65,0}}, +/* 44569 */ {(12<<2)|2,{112,65,0}}, +/* 44570 */ {(12<<2)|2,{112,65,0}}, +/* 44571 */ {(12<<2)|2,{112,65,0}}, +/* 44572 */ {(12<<2)|2,{112,65,0}}, +/* 44573 */ {(12<<2)|2,{112,65,0}}, +/* 44574 */ {(12<<2)|2,{112,65,0}}, +/* 44575 */ {(12<<2)|2,{112,65,0}}, +/* 44576 */ {(12<<2)|2,{112,95,0}}, +/* 44577 */ {(12<<2)|2,{112,95,0}}, +/* 44578 */ {(12<<2)|2,{112,95,0}}, +/* 44579 */ {(12<<2)|2,{112,95,0}}, +/* 44580 */ {(12<<2)|2,{112,95,0}}, +/* 44581 */ {(12<<2)|2,{112,95,0}}, +/* 44582 */ {(12<<2)|2,{112,95,0}}, +/* 44583 */ {(12<<2)|2,{112,95,0}}, +/* 44584 */ {(12<<2)|2,{112,95,0}}, +/* 44585 */ {(12<<2)|2,{112,95,0}}, +/* 44586 */ {(12<<2)|2,{112,95,0}}, +/* 44587 */ {(12<<2)|2,{112,95,0}}, +/* 44588 */ {(12<<2)|2,{112,95,0}}, +/* 44589 */ {(12<<2)|2,{112,95,0}}, +/* 44590 */ {(12<<2)|2,{112,95,0}}, +/* 44591 */ {(12<<2)|2,{112,95,0}}, +/* 44592 */ {(12<<2)|2,{112,98,0}}, +/* 44593 */ {(12<<2)|2,{112,98,0}}, +/* 44594 */ {(12<<2)|2,{112,98,0}}, +/* 44595 */ {(12<<2)|2,{112,98,0}}, +/* 44596 */ {(12<<2)|2,{112,98,0}}, +/* 44597 */ {(12<<2)|2,{112,98,0}}, +/* 44598 */ {(12<<2)|2,{112,98,0}}, +/* 44599 */ {(12<<2)|2,{112,98,0}}, +/* 44600 */ {(12<<2)|2,{112,98,0}}, +/* 44601 */ {(12<<2)|2,{112,98,0}}, +/* 44602 */ {(12<<2)|2,{112,98,0}}, +/* 44603 */ {(12<<2)|2,{112,98,0}}, +/* 44604 */ {(12<<2)|2,{112,98,0}}, +/* 44605 */ {(12<<2)|2,{112,98,0}}, +/* 44606 */ {(12<<2)|2,{112,98,0}}, +/* 44607 */ {(12<<2)|2,{112,98,0}}, +/* 44608 */ {(12<<2)|2,{112,100,0}}, +/* 44609 */ {(12<<2)|2,{112,100,0}}, +/* 44610 */ {(12<<2)|2,{112,100,0}}, +/* 44611 */ {(12<<2)|2,{112,100,0}}, +/* 44612 */ {(12<<2)|2,{112,100,0}}, +/* 44613 */ {(12<<2)|2,{112,100,0}}, +/* 44614 */ {(12<<2)|2,{112,100,0}}, +/* 44615 */ {(12<<2)|2,{112,100,0}}, +/* 44616 */ {(12<<2)|2,{112,100,0}}, +/* 44617 */ {(12<<2)|2,{112,100,0}}, +/* 44618 */ {(12<<2)|2,{112,100,0}}, +/* 44619 */ {(12<<2)|2,{112,100,0}}, +/* 44620 */ {(12<<2)|2,{112,100,0}}, +/* 44621 */ {(12<<2)|2,{112,100,0}}, +/* 44622 */ {(12<<2)|2,{112,100,0}}, +/* 44623 */ {(12<<2)|2,{112,100,0}}, +/* 44624 */ {(12<<2)|2,{112,102,0}}, +/* 44625 */ {(12<<2)|2,{112,102,0}}, +/* 44626 */ {(12<<2)|2,{112,102,0}}, +/* 44627 */ {(12<<2)|2,{112,102,0}}, +/* 44628 */ {(12<<2)|2,{112,102,0}}, +/* 44629 */ {(12<<2)|2,{112,102,0}}, +/* 44630 */ {(12<<2)|2,{112,102,0}}, +/* 44631 */ {(12<<2)|2,{112,102,0}}, +/* 44632 */ {(12<<2)|2,{112,102,0}}, +/* 44633 */ {(12<<2)|2,{112,102,0}}, +/* 44634 */ {(12<<2)|2,{112,102,0}}, +/* 44635 */ {(12<<2)|2,{112,102,0}}, +/* 44636 */ {(12<<2)|2,{112,102,0}}, +/* 44637 */ {(12<<2)|2,{112,102,0}}, +/* 44638 */ {(12<<2)|2,{112,102,0}}, +/* 44639 */ {(12<<2)|2,{112,102,0}}, +/* 44640 */ {(12<<2)|2,{112,103,0}}, +/* 44641 */ {(12<<2)|2,{112,103,0}}, +/* 44642 */ {(12<<2)|2,{112,103,0}}, +/* 44643 */ {(12<<2)|2,{112,103,0}}, +/* 44644 */ {(12<<2)|2,{112,103,0}}, +/* 44645 */ {(12<<2)|2,{112,103,0}}, +/* 44646 */ {(12<<2)|2,{112,103,0}}, +/* 44647 */ {(12<<2)|2,{112,103,0}}, +/* 44648 */ {(12<<2)|2,{112,103,0}}, +/* 44649 */ {(12<<2)|2,{112,103,0}}, +/* 44650 */ {(12<<2)|2,{112,103,0}}, +/* 44651 */ {(12<<2)|2,{112,103,0}}, +/* 44652 */ {(12<<2)|2,{112,103,0}}, +/* 44653 */ {(12<<2)|2,{112,103,0}}, +/* 44654 */ {(12<<2)|2,{112,103,0}}, +/* 44655 */ {(12<<2)|2,{112,103,0}}, +/* 44656 */ {(12<<2)|2,{112,104,0}}, +/* 44657 */ {(12<<2)|2,{112,104,0}}, +/* 44658 */ {(12<<2)|2,{112,104,0}}, +/* 44659 */ {(12<<2)|2,{112,104,0}}, +/* 44660 */ {(12<<2)|2,{112,104,0}}, +/* 44661 */ {(12<<2)|2,{112,104,0}}, +/* 44662 */ {(12<<2)|2,{112,104,0}}, +/* 44663 */ {(12<<2)|2,{112,104,0}}, +/* 44664 */ {(12<<2)|2,{112,104,0}}, +/* 44665 */ {(12<<2)|2,{112,104,0}}, +/* 44666 */ {(12<<2)|2,{112,104,0}}, +/* 44667 */ {(12<<2)|2,{112,104,0}}, +/* 44668 */ {(12<<2)|2,{112,104,0}}, +/* 44669 */ {(12<<2)|2,{112,104,0}}, +/* 44670 */ {(12<<2)|2,{112,104,0}}, +/* 44671 */ {(12<<2)|2,{112,104,0}}, +/* 44672 */ {(12<<2)|2,{112,108,0}}, +/* 44673 */ {(12<<2)|2,{112,108,0}}, +/* 44674 */ {(12<<2)|2,{112,108,0}}, +/* 44675 */ {(12<<2)|2,{112,108,0}}, +/* 44676 */ {(12<<2)|2,{112,108,0}}, +/* 44677 */ {(12<<2)|2,{112,108,0}}, +/* 44678 */ {(12<<2)|2,{112,108,0}}, +/* 44679 */ {(12<<2)|2,{112,108,0}}, +/* 44680 */ {(12<<2)|2,{112,108,0}}, +/* 44681 */ {(12<<2)|2,{112,108,0}}, +/* 44682 */ {(12<<2)|2,{112,108,0}}, +/* 44683 */ {(12<<2)|2,{112,108,0}}, +/* 44684 */ {(12<<2)|2,{112,108,0}}, +/* 44685 */ {(12<<2)|2,{112,108,0}}, +/* 44686 */ {(12<<2)|2,{112,108,0}}, +/* 44687 */ {(12<<2)|2,{112,108,0}}, +/* 44688 */ {(12<<2)|2,{112,109,0}}, +/* 44689 */ {(12<<2)|2,{112,109,0}}, +/* 44690 */ {(12<<2)|2,{112,109,0}}, +/* 44691 */ {(12<<2)|2,{112,109,0}}, +/* 44692 */ {(12<<2)|2,{112,109,0}}, +/* 44693 */ {(12<<2)|2,{112,109,0}}, +/* 44694 */ {(12<<2)|2,{112,109,0}}, +/* 44695 */ {(12<<2)|2,{112,109,0}}, +/* 44696 */ {(12<<2)|2,{112,109,0}}, +/* 44697 */ {(12<<2)|2,{112,109,0}}, +/* 44698 */ {(12<<2)|2,{112,109,0}}, +/* 44699 */ {(12<<2)|2,{112,109,0}}, +/* 44700 */ {(12<<2)|2,{112,109,0}}, +/* 44701 */ {(12<<2)|2,{112,109,0}}, +/* 44702 */ {(12<<2)|2,{112,109,0}}, +/* 44703 */ {(12<<2)|2,{112,109,0}}, +/* 44704 */ {(12<<2)|2,{112,110,0}}, +/* 44705 */ {(12<<2)|2,{112,110,0}}, +/* 44706 */ {(12<<2)|2,{112,110,0}}, +/* 44707 */ {(12<<2)|2,{112,110,0}}, +/* 44708 */ {(12<<2)|2,{112,110,0}}, +/* 44709 */ {(12<<2)|2,{112,110,0}}, +/* 44710 */ {(12<<2)|2,{112,110,0}}, +/* 44711 */ {(12<<2)|2,{112,110,0}}, +/* 44712 */ {(12<<2)|2,{112,110,0}}, +/* 44713 */ {(12<<2)|2,{112,110,0}}, +/* 44714 */ {(12<<2)|2,{112,110,0}}, +/* 44715 */ {(12<<2)|2,{112,110,0}}, +/* 44716 */ {(12<<2)|2,{112,110,0}}, +/* 44717 */ {(12<<2)|2,{112,110,0}}, +/* 44718 */ {(12<<2)|2,{112,110,0}}, +/* 44719 */ {(12<<2)|2,{112,110,0}}, +/* 44720 */ {(12<<2)|2,{112,112,0}}, +/* 44721 */ {(12<<2)|2,{112,112,0}}, +/* 44722 */ {(12<<2)|2,{112,112,0}}, +/* 44723 */ {(12<<2)|2,{112,112,0}}, +/* 44724 */ {(12<<2)|2,{112,112,0}}, +/* 44725 */ {(12<<2)|2,{112,112,0}}, +/* 44726 */ {(12<<2)|2,{112,112,0}}, +/* 44727 */ {(12<<2)|2,{112,112,0}}, +/* 44728 */ {(12<<2)|2,{112,112,0}}, +/* 44729 */ {(12<<2)|2,{112,112,0}}, +/* 44730 */ {(12<<2)|2,{112,112,0}}, +/* 44731 */ {(12<<2)|2,{112,112,0}}, +/* 44732 */ {(12<<2)|2,{112,112,0}}, +/* 44733 */ {(12<<2)|2,{112,112,0}}, +/* 44734 */ {(12<<2)|2,{112,112,0}}, +/* 44735 */ {(12<<2)|2,{112,112,0}}, +/* 44736 */ {(12<<2)|2,{112,114,0}}, +/* 44737 */ {(12<<2)|2,{112,114,0}}, +/* 44738 */ {(12<<2)|2,{112,114,0}}, +/* 44739 */ {(12<<2)|2,{112,114,0}}, +/* 44740 */ {(12<<2)|2,{112,114,0}}, +/* 44741 */ {(12<<2)|2,{112,114,0}}, +/* 44742 */ {(12<<2)|2,{112,114,0}}, +/* 44743 */ {(12<<2)|2,{112,114,0}}, +/* 44744 */ {(12<<2)|2,{112,114,0}}, +/* 44745 */ {(12<<2)|2,{112,114,0}}, +/* 44746 */ {(12<<2)|2,{112,114,0}}, +/* 44747 */ {(12<<2)|2,{112,114,0}}, +/* 44748 */ {(12<<2)|2,{112,114,0}}, +/* 44749 */ {(12<<2)|2,{112,114,0}}, +/* 44750 */ {(12<<2)|2,{112,114,0}}, +/* 44751 */ {(12<<2)|2,{112,114,0}}, +/* 44752 */ {(12<<2)|2,{112,117,0}}, +/* 44753 */ {(12<<2)|2,{112,117,0}}, +/* 44754 */ {(12<<2)|2,{112,117,0}}, +/* 44755 */ {(12<<2)|2,{112,117,0}}, +/* 44756 */ {(12<<2)|2,{112,117,0}}, +/* 44757 */ {(12<<2)|2,{112,117,0}}, +/* 44758 */ {(12<<2)|2,{112,117,0}}, +/* 44759 */ {(12<<2)|2,{112,117,0}}, +/* 44760 */ {(12<<2)|2,{112,117,0}}, +/* 44761 */ {(12<<2)|2,{112,117,0}}, +/* 44762 */ {(12<<2)|2,{112,117,0}}, +/* 44763 */ {(12<<2)|2,{112,117,0}}, +/* 44764 */ {(12<<2)|2,{112,117,0}}, +/* 44765 */ {(12<<2)|2,{112,117,0}}, +/* 44766 */ {(12<<2)|2,{112,117,0}}, +/* 44767 */ {(12<<2)|2,{112,117,0}}, +/* 44768 */ {(13<<2)|2,{112,58,0}}, +/* 44769 */ {(13<<2)|2,{112,58,0}}, +/* 44770 */ {(13<<2)|2,{112,58,0}}, +/* 44771 */ {(13<<2)|2,{112,58,0}}, +/* 44772 */ {(13<<2)|2,{112,58,0}}, +/* 44773 */ {(13<<2)|2,{112,58,0}}, +/* 44774 */ {(13<<2)|2,{112,58,0}}, +/* 44775 */ {(13<<2)|2,{112,58,0}}, +/* 44776 */ {(13<<2)|2,{112,66,0}}, +/* 44777 */ {(13<<2)|2,{112,66,0}}, +/* 44778 */ {(13<<2)|2,{112,66,0}}, +/* 44779 */ {(13<<2)|2,{112,66,0}}, +/* 44780 */ {(13<<2)|2,{112,66,0}}, +/* 44781 */ {(13<<2)|2,{112,66,0}}, +/* 44782 */ {(13<<2)|2,{112,66,0}}, +/* 44783 */ {(13<<2)|2,{112,66,0}}, +/* 44784 */ {(13<<2)|2,{112,67,0}}, +/* 44785 */ {(13<<2)|2,{112,67,0}}, +/* 44786 */ {(13<<2)|2,{112,67,0}}, +/* 44787 */ {(13<<2)|2,{112,67,0}}, +/* 44788 */ {(13<<2)|2,{112,67,0}}, +/* 44789 */ {(13<<2)|2,{112,67,0}}, +/* 44790 */ {(13<<2)|2,{112,67,0}}, +/* 44791 */ {(13<<2)|2,{112,67,0}}, +/* 44792 */ {(13<<2)|2,{112,68,0}}, +/* 44793 */ {(13<<2)|2,{112,68,0}}, +/* 44794 */ {(13<<2)|2,{112,68,0}}, +/* 44795 */ {(13<<2)|2,{112,68,0}}, +/* 44796 */ {(13<<2)|2,{112,68,0}}, +/* 44797 */ {(13<<2)|2,{112,68,0}}, +/* 44798 */ {(13<<2)|2,{112,68,0}}, +/* 44799 */ {(13<<2)|2,{112,68,0}}, +/* 44800 */ {(13<<2)|2,{112,69,0}}, +/* 44801 */ {(13<<2)|2,{112,69,0}}, +/* 44802 */ {(13<<2)|2,{112,69,0}}, +/* 44803 */ {(13<<2)|2,{112,69,0}}, +/* 44804 */ {(13<<2)|2,{112,69,0}}, +/* 44805 */ {(13<<2)|2,{112,69,0}}, +/* 44806 */ {(13<<2)|2,{112,69,0}}, +/* 44807 */ {(13<<2)|2,{112,69,0}}, +/* 44808 */ {(13<<2)|2,{112,70,0}}, +/* 44809 */ {(13<<2)|2,{112,70,0}}, +/* 44810 */ {(13<<2)|2,{112,70,0}}, +/* 44811 */ {(13<<2)|2,{112,70,0}}, +/* 44812 */ {(13<<2)|2,{112,70,0}}, +/* 44813 */ {(13<<2)|2,{112,70,0}}, +/* 44814 */ {(13<<2)|2,{112,70,0}}, +/* 44815 */ {(13<<2)|2,{112,70,0}}, +/* 44816 */ {(13<<2)|2,{112,71,0}}, +/* 44817 */ {(13<<2)|2,{112,71,0}}, +/* 44818 */ {(13<<2)|2,{112,71,0}}, +/* 44819 */ {(13<<2)|2,{112,71,0}}, +/* 44820 */ {(13<<2)|2,{112,71,0}}, +/* 44821 */ {(13<<2)|2,{112,71,0}}, +/* 44822 */ {(13<<2)|2,{112,71,0}}, +/* 44823 */ {(13<<2)|2,{112,71,0}}, +/* 44824 */ {(13<<2)|2,{112,72,0}}, +/* 44825 */ {(13<<2)|2,{112,72,0}}, +/* 44826 */ {(13<<2)|2,{112,72,0}}, +/* 44827 */ {(13<<2)|2,{112,72,0}}, +/* 44828 */ {(13<<2)|2,{112,72,0}}, +/* 44829 */ {(13<<2)|2,{112,72,0}}, +/* 44830 */ {(13<<2)|2,{112,72,0}}, +/* 44831 */ {(13<<2)|2,{112,72,0}}, +/* 44832 */ {(13<<2)|2,{112,73,0}}, +/* 44833 */ {(13<<2)|2,{112,73,0}}, +/* 44834 */ {(13<<2)|2,{112,73,0}}, +/* 44835 */ {(13<<2)|2,{112,73,0}}, +/* 44836 */ {(13<<2)|2,{112,73,0}}, +/* 44837 */ {(13<<2)|2,{112,73,0}}, +/* 44838 */ {(13<<2)|2,{112,73,0}}, +/* 44839 */ {(13<<2)|2,{112,73,0}}, +/* 44840 */ {(13<<2)|2,{112,74,0}}, +/* 44841 */ {(13<<2)|2,{112,74,0}}, +/* 44842 */ {(13<<2)|2,{112,74,0}}, +/* 44843 */ {(13<<2)|2,{112,74,0}}, +/* 44844 */ {(13<<2)|2,{112,74,0}}, +/* 44845 */ {(13<<2)|2,{112,74,0}}, +/* 44846 */ {(13<<2)|2,{112,74,0}}, +/* 44847 */ {(13<<2)|2,{112,74,0}}, +/* 44848 */ {(13<<2)|2,{112,75,0}}, +/* 44849 */ {(13<<2)|2,{112,75,0}}, +/* 44850 */ {(13<<2)|2,{112,75,0}}, +/* 44851 */ {(13<<2)|2,{112,75,0}}, +/* 44852 */ {(13<<2)|2,{112,75,0}}, +/* 44853 */ {(13<<2)|2,{112,75,0}}, +/* 44854 */ {(13<<2)|2,{112,75,0}}, +/* 44855 */ {(13<<2)|2,{112,75,0}}, +/* 44856 */ {(13<<2)|2,{112,76,0}}, +/* 44857 */ {(13<<2)|2,{112,76,0}}, +/* 44858 */ {(13<<2)|2,{112,76,0}}, +/* 44859 */ {(13<<2)|2,{112,76,0}}, +/* 44860 */ {(13<<2)|2,{112,76,0}}, +/* 44861 */ {(13<<2)|2,{112,76,0}}, +/* 44862 */ {(13<<2)|2,{112,76,0}}, +/* 44863 */ {(13<<2)|2,{112,76,0}}, +/* 44864 */ {(13<<2)|2,{112,77,0}}, +/* 44865 */ {(13<<2)|2,{112,77,0}}, +/* 44866 */ {(13<<2)|2,{112,77,0}}, +/* 44867 */ {(13<<2)|2,{112,77,0}}, +/* 44868 */ {(13<<2)|2,{112,77,0}}, +/* 44869 */ {(13<<2)|2,{112,77,0}}, +/* 44870 */ {(13<<2)|2,{112,77,0}}, +/* 44871 */ {(13<<2)|2,{112,77,0}}, +/* 44872 */ {(13<<2)|2,{112,78,0}}, +/* 44873 */ {(13<<2)|2,{112,78,0}}, +/* 44874 */ {(13<<2)|2,{112,78,0}}, +/* 44875 */ {(13<<2)|2,{112,78,0}}, +/* 44876 */ {(13<<2)|2,{112,78,0}}, +/* 44877 */ {(13<<2)|2,{112,78,0}}, +/* 44878 */ {(13<<2)|2,{112,78,0}}, +/* 44879 */ {(13<<2)|2,{112,78,0}}, +/* 44880 */ {(13<<2)|2,{112,79,0}}, +/* 44881 */ {(13<<2)|2,{112,79,0}}, +/* 44882 */ {(13<<2)|2,{112,79,0}}, +/* 44883 */ {(13<<2)|2,{112,79,0}}, +/* 44884 */ {(13<<2)|2,{112,79,0}}, +/* 44885 */ {(13<<2)|2,{112,79,0}}, +/* 44886 */ {(13<<2)|2,{112,79,0}}, +/* 44887 */ {(13<<2)|2,{112,79,0}}, +/* 44888 */ {(13<<2)|2,{112,80,0}}, +/* 44889 */ {(13<<2)|2,{112,80,0}}, +/* 44890 */ {(13<<2)|2,{112,80,0}}, +/* 44891 */ {(13<<2)|2,{112,80,0}}, +/* 44892 */ {(13<<2)|2,{112,80,0}}, +/* 44893 */ {(13<<2)|2,{112,80,0}}, +/* 44894 */ {(13<<2)|2,{112,80,0}}, +/* 44895 */ {(13<<2)|2,{112,80,0}}, +/* 44896 */ {(13<<2)|2,{112,81,0}}, +/* 44897 */ {(13<<2)|2,{112,81,0}}, +/* 44898 */ {(13<<2)|2,{112,81,0}}, +/* 44899 */ {(13<<2)|2,{112,81,0}}, +/* 44900 */ {(13<<2)|2,{112,81,0}}, +/* 44901 */ {(13<<2)|2,{112,81,0}}, +/* 44902 */ {(13<<2)|2,{112,81,0}}, +/* 44903 */ {(13<<2)|2,{112,81,0}}, +/* 44904 */ {(13<<2)|2,{112,82,0}}, +/* 44905 */ {(13<<2)|2,{112,82,0}}, +/* 44906 */ {(13<<2)|2,{112,82,0}}, +/* 44907 */ {(13<<2)|2,{112,82,0}}, +/* 44908 */ {(13<<2)|2,{112,82,0}}, +/* 44909 */ {(13<<2)|2,{112,82,0}}, +/* 44910 */ {(13<<2)|2,{112,82,0}}, +/* 44911 */ {(13<<2)|2,{112,82,0}}, +/* 44912 */ {(13<<2)|2,{112,83,0}}, +/* 44913 */ {(13<<2)|2,{112,83,0}}, +/* 44914 */ {(13<<2)|2,{112,83,0}}, +/* 44915 */ {(13<<2)|2,{112,83,0}}, +/* 44916 */ {(13<<2)|2,{112,83,0}}, +/* 44917 */ {(13<<2)|2,{112,83,0}}, +/* 44918 */ {(13<<2)|2,{112,83,0}}, +/* 44919 */ {(13<<2)|2,{112,83,0}}, +/* 44920 */ {(13<<2)|2,{112,84,0}}, +/* 44921 */ {(13<<2)|2,{112,84,0}}, +/* 44922 */ {(13<<2)|2,{112,84,0}}, +/* 44923 */ {(13<<2)|2,{112,84,0}}, +/* 44924 */ {(13<<2)|2,{112,84,0}}, +/* 44925 */ {(13<<2)|2,{112,84,0}}, +/* 44926 */ {(13<<2)|2,{112,84,0}}, +/* 44927 */ {(13<<2)|2,{112,84,0}}, +/* 44928 */ {(13<<2)|2,{112,85,0}}, +/* 44929 */ {(13<<2)|2,{112,85,0}}, +/* 44930 */ {(13<<2)|2,{112,85,0}}, +/* 44931 */ {(13<<2)|2,{112,85,0}}, +/* 44932 */ {(13<<2)|2,{112,85,0}}, +/* 44933 */ {(13<<2)|2,{112,85,0}}, +/* 44934 */ {(13<<2)|2,{112,85,0}}, +/* 44935 */ {(13<<2)|2,{112,85,0}}, +/* 44936 */ {(13<<2)|2,{112,86,0}}, +/* 44937 */ {(13<<2)|2,{112,86,0}}, +/* 44938 */ {(13<<2)|2,{112,86,0}}, +/* 44939 */ {(13<<2)|2,{112,86,0}}, +/* 44940 */ {(13<<2)|2,{112,86,0}}, +/* 44941 */ {(13<<2)|2,{112,86,0}}, +/* 44942 */ {(13<<2)|2,{112,86,0}}, +/* 44943 */ {(13<<2)|2,{112,86,0}}, +/* 44944 */ {(13<<2)|2,{112,87,0}}, +/* 44945 */ {(13<<2)|2,{112,87,0}}, +/* 44946 */ {(13<<2)|2,{112,87,0}}, +/* 44947 */ {(13<<2)|2,{112,87,0}}, +/* 44948 */ {(13<<2)|2,{112,87,0}}, +/* 44949 */ {(13<<2)|2,{112,87,0}}, +/* 44950 */ {(13<<2)|2,{112,87,0}}, +/* 44951 */ {(13<<2)|2,{112,87,0}}, +/* 44952 */ {(13<<2)|2,{112,89,0}}, +/* 44953 */ {(13<<2)|2,{112,89,0}}, +/* 44954 */ {(13<<2)|2,{112,89,0}}, +/* 44955 */ {(13<<2)|2,{112,89,0}}, +/* 44956 */ {(13<<2)|2,{112,89,0}}, +/* 44957 */ {(13<<2)|2,{112,89,0}}, +/* 44958 */ {(13<<2)|2,{112,89,0}}, +/* 44959 */ {(13<<2)|2,{112,89,0}}, +/* 44960 */ {(13<<2)|2,{112,106,0}}, +/* 44961 */ {(13<<2)|2,{112,106,0}}, +/* 44962 */ {(13<<2)|2,{112,106,0}}, +/* 44963 */ {(13<<2)|2,{112,106,0}}, +/* 44964 */ {(13<<2)|2,{112,106,0}}, +/* 44965 */ {(13<<2)|2,{112,106,0}}, +/* 44966 */ {(13<<2)|2,{112,106,0}}, +/* 44967 */ {(13<<2)|2,{112,106,0}}, +/* 44968 */ {(13<<2)|2,{112,107,0}}, +/* 44969 */ {(13<<2)|2,{112,107,0}}, +/* 44970 */ {(13<<2)|2,{112,107,0}}, +/* 44971 */ {(13<<2)|2,{112,107,0}}, +/* 44972 */ {(13<<2)|2,{112,107,0}}, +/* 44973 */ {(13<<2)|2,{112,107,0}}, +/* 44974 */ {(13<<2)|2,{112,107,0}}, +/* 44975 */ {(13<<2)|2,{112,107,0}}, +/* 44976 */ {(13<<2)|2,{112,113,0}}, +/* 44977 */ {(13<<2)|2,{112,113,0}}, +/* 44978 */ {(13<<2)|2,{112,113,0}}, +/* 44979 */ {(13<<2)|2,{112,113,0}}, +/* 44980 */ {(13<<2)|2,{112,113,0}}, +/* 44981 */ {(13<<2)|2,{112,113,0}}, +/* 44982 */ {(13<<2)|2,{112,113,0}}, +/* 44983 */ {(13<<2)|2,{112,113,0}}, +/* 44984 */ {(13<<2)|2,{112,118,0}}, +/* 44985 */ {(13<<2)|2,{112,118,0}}, +/* 44986 */ {(13<<2)|2,{112,118,0}}, +/* 44987 */ {(13<<2)|2,{112,118,0}}, +/* 44988 */ {(13<<2)|2,{112,118,0}}, +/* 44989 */ {(13<<2)|2,{112,118,0}}, +/* 44990 */ {(13<<2)|2,{112,118,0}}, +/* 44991 */ {(13<<2)|2,{112,118,0}}, +/* 44992 */ {(13<<2)|2,{112,119,0}}, +/* 44993 */ {(13<<2)|2,{112,119,0}}, +/* 44994 */ {(13<<2)|2,{112,119,0}}, +/* 44995 */ {(13<<2)|2,{112,119,0}}, +/* 44996 */ {(13<<2)|2,{112,119,0}}, +/* 44997 */ {(13<<2)|2,{112,119,0}}, +/* 44998 */ {(13<<2)|2,{112,119,0}}, +/* 44999 */ {(13<<2)|2,{112,119,0}}, +/* 45000 */ {(13<<2)|2,{112,120,0}}, +/* 45001 */ {(13<<2)|2,{112,120,0}}, +/* 45002 */ {(13<<2)|2,{112,120,0}}, +/* 45003 */ {(13<<2)|2,{112,120,0}}, +/* 45004 */ {(13<<2)|2,{112,120,0}}, +/* 45005 */ {(13<<2)|2,{112,120,0}}, +/* 45006 */ {(13<<2)|2,{112,120,0}}, +/* 45007 */ {(13<<2)|2,{112,120,0}}, +/* 45008 */ {(13<<2)|2,{112,121,0}}, +/* 45009 */ {(13<<2)|2,{112,121,0}}, +/* 45010 */ {(13<<2)|2,{112,121,0}}, +/* 45011 */ {(13<<2)|2,{112,121,0}}, +/* 45012 */ {(13<<2)|2,{112,121,0}}, +/* 45013 */ {(13<<2)|2,{112,121,0}}, +/* 45014 */ {(13<<2)|2,{112,121,0}}, +/* 45015 */ {(13<<2)|2,{112,121,0}}, +/* 45016 */ {(13<<2)|2,{112,122,0}}, +/* 45017 */ {(13<<2)|2,{112,122,0}}, +/* 45018 */ {(13<<2)|2,{112,122,0}}, +/* 45019 */ {(13<<2)|2,{112,122,0}}, +/* 45020 */ {(13<<2)|2,{112,122,0}}, +/* 45021 */ {(13<<2)|2,{112,122,0}}, +/* 45022 */ {(13<<2)|2,{112,122,0}}, +/* 45023 */ {(13<<2)|2,{112,122,0}}, +/* 45024 */ {(14<<2)|2,{112,38,0}}, +/* 45025 */ {(14<<2)|2,{112,38,0}}, +/* 45026 */ {(14<<2)|2,{112,38,0}}, +/* 45027 */ {(14<<2)|2,{112,38,0}}, +/* 45028 */ {(14<<2)|2,{112,42,0}}, +/* 45029 */ {(14<<2)|2,{112,42,0}}, +/* 45030 */ {(14<<2)|2,{112,42,0}}, +/* 45031 */ {(14<<2)|2,{112,42,0}}, +/* 45032 */ {(14<<2)|2,{112,44,0}}, +/* 45033 */ {(14<<2)|2,{112,44,0}}, +/* 45034 */ {(14<<2)|2,{112,44,0}}, +/* 45035 */ {(14<<2)|2,{112,44,0}}, +/* 45036 */ {(14<<2)|2,{112,59,0}}, +/* 45037 */ {(14<<2)|2,{112,59,0}}, +/* 45038 */ {(14<<2)|2,{112,59,0}}, +/* 45039 */ {(14<<2)|2,{112,59,0}}, +/* 45040 */ {(14<<2)|2,{112,88,0}}, +/* 45041 */ {(14<<2)|2,{112,88,0}}, +/* 45042 */ {(14<<2)|2,{112,88,0}}, +/* 45043 */ {(14<<2)|2,{112,88,0}}, +/* 45044 */ {(14<<2)|2,{112,90,0}}, +/* 45045 */ {(14<<2)|2,{112,90,0}}, +/* 45046 */ {(14<<2)|2,{112,90,0}}, +/* 45047 */ {(14<<2)|2,{112,90,0}}, +/* 45048 */ {(16<<2)|2,{112,33,0}}, +/* 45049 */ {(16<<2)|2,{112,34,0}}, +/* 45050 */ {(16<<2)|2,{112,40,0}}, +/* 45051 */ {(16<<2)|2,{112,41,0}}, +/* 45052 */ {(16<<2)|2,{112,63,0}}, +/* 45053 */ {(6<<2)|1,{112,0,0}}, +/* 45054 */ {(6<<2)|1,{112,0,0}}, +/* 45055 */ {(6<<2)|1,{112,0,0}}, +/* 45056 */ {(16<<2)|3,{114,48,48}}, +/* 45057 */ {(16<<2)|3,{114,48,49}}, +/* 45058 */ {(16<<2)|3,{114,48,50}}, +/* 45059 */ {(16<<2)|3,{114,48,97}}, +/* 45060 */ {(16<<2)|3,{114,48,99}}, +/* 45061 */ {(16<<2)|3,{114,48,101}}, +/* 45062 */ {(16<<2)|3,{114,48,105}}, +/* 45063 */ {(16<<2)|3,{114,48,111}}, +/* 45064 */ {(16<<2)|3,{114,48,115}}, +/* 45065 */ {(16<<2)|3,{114,48,116}}, +/* 45066 */ {(11<<2)|2,{114,48,0}}, +/* 45067 */ {(11<<2)|2,{114,48,0}}, +/* 45068 */ {(11<<2)|2,{114,48,0}}, +/* 45069 */ {(11<<2)|2,{114,48,0}}, +/* 45070 */ {(11<<2)|2,{114,48,0}}, +/* 45071 */ {(11<<2)|2,{114,48,0}}, +/* 45072 */ {(11<<2)|2,{114,48,0}}, +/* 45073 */ {(11<<2)|2,{114,48,0}}, +/* 45074 */ {(11<<2)|2,{114,48,0}}, +/* 45075 */ {(11<<2)|2,{114,48,0}}, +/* 45076 */ {(11<<2)|2,{114,48,0}}, +/* 45077 */ {(11<<2)|2,{114,48,0}}, +/* 45078 */ {(11<<2)|2,{114,48,0}}, +/* 45079 */ {(11<<2)|2,{114,48,0}}, +/* 45080 */ {(11<<2)|2,{114,48,0}}, +/* 45081 */ {(11<<2)|2,{114,48,0}}, +/* 45082 */ {(11<<2)|2,{114,48,0}}, +/* 45083 */ {(11<<2)|2,{114,48,0}}, +/* 45084 */ {(11<<2)|2,{114,48,0}}, +/* 45085 */ {(11<<2)|2,{114,48,0}}, +/* 45086 */ {(11<<2)|2,{114,48,0}}, +/* 45087 */ {(11<<2)|2,{114,48,0}}, +/* 45088 */ {(16<<2)|3,{114,49,48}}, +/* 45089 */ {(16<<2)|3,{114,49,49}}, +/* 45090 */ {(16<<2)|3,{114,49,50}}, +/* 45091 */ {(16<<2)|3,{114,49,97}}, +/* 45092 */ {(16<<2)|3,{114,49,99}}, +/* 45093 */ {(16<<2)|3,{114,49,101}}, +/* 45094 */ {(16<<2)|3,{114,49,105}}, +/* 45095 */ {(16<<2)|3,{114,49,111}}, +/* 45096 */ {(16<<2)|3,{114,49,115}}, +/* 45097 */ {(16<<2)|3,{114,49,116}}, +/* 45098 */ {(11<<2)|2,{114,49,0}}, +/* 45099 */ {(11<<2)|2,{114,49,0}}, +/* 45100 */ {(11<<2)|2,{114,49,0}}, +/* 45101 */ {(11<<2)|2,{114,49,0}}, +/* 45102 */ {(11<<2)|2,{114,49,0}}, +/* 45103 */ {(11<<2)|2,{114,49,0}}, +/* 45104 */ {(11<<2)|2,{114,49,0}}, +/* 45105 */ {(11<<2)|2,{114,49,0}}, +/* 45106 */ {(11<<2)|2,{114,49,0}}, +/* 45107 */ {(11<<2)|2,{114,49,0}}, +/* 45108 */ {(11<<2)|2,{114,49,0}}, +/* 45109 */ {(11<<2)|2,{114,49,0}}, +/* 45110 */ {(11<<2)|2,{114,49,0}}, +/* 45111 */ {(11<<2)|2,{114,49,0}}, +/* 45112 */ {(11<<2)|2,{114,49,0}}, +/* 45113 */ {(11<<2)|2,{114,49,0}}, +/* 45114 */ {(11<<2)|2,{114,49,0}}, +/* 45115 */ {(11<<2)|2,{114,49,0}}, +/* 45116 */ {(11<<2)|2,{114,49,0}}, +/* 45117 */ {(11<<2)|2,{114,49,0}}, +/* 45118 */ {(11<<2)|2,{114,49,0}}, +/* 45119 */ {(11<<2)|2,{114,49,0}}, +/* 45120 */ {(16<<2)|3,{114,50,48}}, +/* 45121 */ {(16<<2)|3,{114,50,49}}, +/* 45122 */ {(16<<2)|3,{114,50,50}}, +/* 45123 */ {(16<<2)|3,{114,50,97}}, +/* 45124 */ {(16<<2)|3,{114,50,99}}, +/* 45125 */ {(16<<2)|3,{114,50,101}}, +/* 45126 */ {(16<<2)|3,{114,50,105}}, +/* 45127 */ {(16<<2)|3,{114,50,111}}, +/* 45128 */ {(16<<2)|3,{114,50,115}}, +/* 45129 */ {(16<<2)|3,{114,50,116}}, +/* 45130 */ {(11<<2)|2,{114,50,0}}, +/* 45131 */ {(11<<2)|2,{114,50,0}}, +/* 45132 */ {(11<<2)|2,{114,50,0}}, +/* 45133 */ {(11<<2)|2,{114,50,0}}, +/* 45134 */ {(11<<2)|2,{114,50,0}}, +/* 45135 */ {(11<<2)|2,{114,50,0}}, +/* 45136 */ {(11<<2)|2,{114,50,0}}, +/* 45137 */ {(11<<2)|2,{114,50,0}}, +/* 45138 */ {(11<<2)|2,{114,50,0}}, +/* 45139 */ {(11<<2)|2,{114,50,0}}, +/* 45140 */ {(11<<2)|2,{114,50,0}}, +/* 45141 */ {(11<<2)|2,{114,50,0}}, +/* 45142 */ {(11<<2)|2,{114,50,0}}, +/* 45143 */ {(11<<2)|2,{114,50,0}}, +/* 45144 */ {(11<<2)|2,{114,50,0}}, +/* 45145 */ {(11<<2)|2,{114,50,0}}, +/* 45146 */ {(11<<2)|2,{114,50,0}}, +/* 45147 */ {(11<<2)|2,{114,50,0}}, +/* 45148 */ {(11<<2)|2,{114,50,0}}, +/* 45149 */ {(11<<2)|2,{114,50,0}}, +/* 45150 */ {(11<<2)|2,{114,50,0}}, +/* 45151 */ {(11<<2)|2,{114,50,0}}, +/* 45152 */ {(16<<2)|3,{114,97,48}}, +/* 45153 */ {(16<<2)|3,{114,97,49}}, +/* 45154 */ {(16<<2)|3,{114,97,50}}, +/* 45155 */ {(16<<2)|3,{114,97,97}}, +/* 45156 */ {(16<<2)|3,{114,97,99}}, +/* 45157 */ {(16<<2)|3,{114,97,101}}, +/* 45158 */ {(16<<2)|3,{114,97,105}}, +/* 45159 */ {(16<<2)|3,{114,97,111}}, +/* 45160 */ {(16<<2)|3,{114,97,115}}, +/* 45161 */ {(16<<2)|3,{114,97,116}}, +/* 45162 */ {(11<<2)|2,{114,97,0}}, +/* 45163 */ {(11<<2)|2,{114,97,0}}, +/* 45164 */ {(11<<2)|2,{114,97,0}}, +/* 45165 */ {(11<<2)|2,{114,97,0}}, +/* 45166 */ {(11<<2)|2,{114,97,0}}, +/* 45167 */ {(11<<2)|2,{114,97,0}}, +/* 45168 */ {(11<<2)|2,{114,97,0}}, +/* 45169 */ {(11<<2)|2,{114,97,0}}, +/* 45170 */ {(11<<2)|2,{114,97,0}}, +/* 45171 */ {(11<<2)|2,{114,97,0}}, +/* 45172 */ {(11<<2)|2,{114,97,0}}, +/* 45173 */ {(11<<2)|2,{114,97,0}}, +/* 45174 */ {(11<<2)|2,{114,97,0}}, +/* 45175 */ {(11<<2)|2,{114,97,0}}, +/* 45176 */ {(11<<2)|2,{114,97,0}}, +/* 45177 */ {(11<<2)|2,{114,97,0}}, +/* 45178 */ {(11<<2)|2,{114,97,0}}, +/* 45179 */ {(11<<2)|2,{114,97,0}}, +/* 45180 */ {(11<<2)|2,{114,97,0}}, +/* 45181 */ {(11<<2)|2,{114,97,0}}, +/* 45182 */ {(11<<2)|2,{114,97,0}}, +/* 45183 */ {(11<<2)|2,{114,97,0}}, +/* 45184 */ {(16<<2)|3,{114,99,48}}, +/* 45185 */ {(16<<2)|3,{114,99,49}}, +/* 45186 */ {(16<<2)|3,{114,99,50}}, +/* 45187 */ {(16<<2)|3,{114,99,97}}, +/* 45188 */ {(16<<2)|3,{114,99,99}}, +/* 45189 */ {(16<<2)|3,{114,99,101}}, +/* 45190 */ {(16<<2)|3,{114,99,105}}, +/* 45191 */ {(16<<2)|3,{114,99,111}}, +/* 45192 */ {(16<<2)|3,{114,99,115}}, +/* 45193 */ {(16<<2)|3,{114,99,116}}, +/* 45194 */ {(11<<2)|2,{114,99,0}}, +/* 45195 */ {(11<<2)|2,{114,99,0}}, +/* 45196 */ {(11<<2)|2,{114,99,0}}, +/* 45197 */ {(11<<2)|2,{114,99,0}}, +/* 45198 */ {(11<<2)|2,{114,99,0}}, +/* 45199 */ {(11<<2)|2,{114,99,0}}, +/* 45200 */ {(11<<2)|2,{114,99,0}}, +/* 45201 */ {(11<<2)|2,{114,99,0}}, +/* 45202 */ {(11<<2)|2,{114,99,0}}, +/* 45203 */ {(11<<2)|2,{114,99,0}}, +/* 45204 */ {(11<<2)|2,{114,99,0}}, +/* 45205 */ {(11<<2)|2,{114,99,0}}, +/* 45206 */ {(11<<2)|2,{114,99,0}}, +/* 45207 */ {(11<<2)|2,{114,99,0}}, +/* 45208 */ {(11<<2)|2,{114,99,0}}, +/* 45209 */ {(11<<2)|2,{114,99,0}}, +/* 45210 */ {(11<<2)|2,{114,99,0}}, +/* 45211 */ {(11<<2)|2,{114,99,0}}, +/* 45212 */ {(11<<2)|2,{114,99,0}}, +/* 45213 */ {(11<<2)|2,{114,99,0}}, +/* 45214 */ {(11<<2)|2,{114,99,0}}, +/* 45215 */ {(11<<2)|2,{114,99,0}}, +/* 45216 */ {(16<<2)|3,{114,101,48}}, +/* 45217 */ {(16<<2)|3,{114,101,49}}, +/* 45218 */ {(16<<2)|3,{114,101,50}}, +/* 45219 */ {(16<<2)|3,{114,101,97}}, +/* 45220 */ {(16<<2)|3,{114,101,99}}, +/* 45221 */ {(16<<2)|3,{114,101,101}}, +/* 45222 */ {(16<<2)|3,{114,101,105}}, +/* 45223 */ {(16<<2)|3,{114,101,111}}, +/* 45224 */ {(16<<2)|3,{114,101,115}}, +/* 45225 */ {(16<<2)|3,{114,101,116}}, +/* 45226 */ {(11<<2)|2,{114,101,0}}, +/* 45227 */ {(11<<2)|2,{114,101,0}}, +/* 45228 */ {(11<<2)|2,{114,101,0}}, +/* 45229 */ {(11<<2)|2,{114,101,0}}, +/* 45230 */ {(11<<2)|2,{114,101,0}}, +/* 45231 */ {(11<<2)|2,{114,101,0}}, +/* 45232 */ {(11<<2)|2,{114,101,0}}, +/* 45233 */ {(11<<2)|2,{114,101,0}}, +/* 45234 */ {(11<<2)|2,{114,101,0}}, +/* 45235 */ {(11<<2)|2,{114,101,0}}, +/* 45236 */ {(11<<2)|2,{114,101,0}}, +/* 45237 */ {(11<<2)|2,{114,101,0}}, +/* 45238 */ {(11<<2)|2,{114,101,0}}, +/* 45239 */ {(11<<2)|2,{114,101,0}}, +/* 45240 */ {(11<<2)|2,{114,101,0}}, +/* 45241 */ {(11<<2)|2,{114,101,0}}, +/* 45242 */ {(11<<2)|2,{114,101,0}}, +/* 45243 */ {(11<<2)|2,{114,101,0}}, +/* 45244 */ {(11<<2)|2,{114,101,0}}, +/* 45245 */ {(11<<2)|2,{114,101,0}}, +/* 45246 */ {(11<<2)|2,{114,101,0}}, +/* 45247 */ {(11<<2)|2,{114,101,0}}, +/* 45248 */ {(16<<2)|3,{114,105,48}}, +/* 45249 */ {(16<<2)|3,{114,105,49}}, +/* 45250 */ {(16<<2)|3,{114,105,50}}, +/* 45251 */ {(16<<2)|3,{114,105,97}}, +/* 45252 */ {(16<<2)|3,{114,105,99}}, +/* 45253 */ {(16<<2)|3,{114,105,101}}, +/* 45254 */ {(16<<2)|3,{114,105,105}}, +/* 45255 */ {(16<<2)|3,{114,105,111}}, +/* 45256 */ {(16<<2)|3,{114,105,115}}, +/* 45257 */ {(16<<2)|3,{114,105,116}}, +/* 45258 */ {(11<<2)|2,{114,105,0}}, +/* 45259 */ {(11<<2)|2,{114,105,0}}, +/* 45260 */ {(11<<2)|2,{114,105,0}}, +/* 45261 */ {(11<<2)|2,{114,105,0}}, +/* 45262 */ {(11<<2)|2,{114,105,0}}, +/* 45263 */ {(11<<2)|2,{114,105,0}}, +/* 45264 */ {(11<<2)|2,{114,105,0}}, +/* 45265 */ {(11<<2)|2,{114,105,0}}, +/* 45266 */ {(11<<2)|2,{114,105,0}}, +/* 45267 */ {(11<<2)|2,{114,105,0}}, +/* 45268 */ {(11<<2)|2,{114,105,0}}, +/* 45269 */ {(11<<2)|2,{114,105,0}}, +/* 45270 */ {(11<<2)|2,{114,105,0}}, +/* 45271 */ {(11<<2)|2,{114,105,0}}, +/* 45272 */ {(11<<2)|2,{114,105,0}}, +/* 45273 */ {(11<<2)|2,{114,105,0}}, +/* 45274 */ {(11<<2)|2,{114,105,0}}, +/* 45275 */ {(11<<2)|2,{114,105,0}}, +/* 45276 */ {(11<<2)|2,{114,105,0}}, +/* 45277 */ {(11<<2)|2,{114,105,0}}, +/* 45278 */ {(11<<2)|2,{114,105,0}}, +/* 45279 */ {(11<<2)|2,{114,105,0}}, +/* 45280 */ {(16<<2)|3,{114,111,48}}, +/* 45281 */ {(16<<2)|3,{114,111,49}}, +/* 45282 */ {(16<<2)|3,{114,111,50}}, +/* 45283 */ {(16<<2)|3,{114,111,97}}, +/* 45284 */ {(16<<2)|3,{114,111,99}}, +/* 45285 */ {(16<<2)|3,{114,111,101}}, +/* 45286 */ {(16<<2)|3,{114,111,105}}, +/* 45287 */ {(16<<2)|3,{114,111,111}}, +/* 45288 */ {(16<<2)|3,{114,111,115}}, +/* 45289 */ {(16<<2)|3,{114,111,116}}, +/* 45290 */ {(11<<2)|2,{114,111,0}}, +/* 45291 */ {(11<<2)|2,{114,111,0}}, +/* 45292 */ {(11<<2)|2,{114,111,0}}, +/* 45293 */ {(11<<2)|2,{114,111,0}}, +/* 45294 */ {(11<<2)|2,{114,111,0}}, +/* 45295 */ {(11<<2)|2,{114,111,0}}, +/* 45296 */ {(11<<2)|2,{114,111,0}}, +/* 45297 */ {(11<<2)|2,{114,111,0}}, +/* 45298 */ {(11<<2)|2,{114,111,0}}, +/* 45299 */ {(11<<2)|2,{114,111,0}}, +/* 45300 */ {(11<<2)|2,{114,111,0}}, +/* 45301 */ {(11<<2)|2,{114,111,0}}, +/* 45302 */ {(11<<2)|2,{114,111,0}}, +/* 45303 */ {(11<<2)|2,{114,111,0}}, +/* 45304 */ {(11<<2)|2,{114,111,0}}, +/* 45305 */ {(11<<2)|2,{114,111,0}}, +/* 45306 */ {(11<<2)|2,{114,111,0}}, +/* 45307 */ {(11<<2)|2,{114,111,0}}, +/* 45308 */ {(11<<2)|2,{114,111,0}}, +/* 45309 */ {(11<<2)|2,{114,111,0}}, +/* 45310 */ {(11<<2)|2,{114,111,0}}, +/* 45311 */ {(11<<2)|2,{114,111,0}}, +/* 45312 */ {(16<<2)|3,{114,115,48}}, +/* 45313 */ {(16<<2)|3,{114,115,49}}, +/* 45314 */ {(16<<2)|3,{114,115,50}}, +/* 45315 */ {(16<<2)|3,{114,115,97}}, +/* 45316 */ {(16<<2)|3,{114,115,99}}, +/* 45317 */ {(16<<2)|3,{114,115,101}}, +/* 45318 */ {(16<<2)|3,{114,115,105}}, +/* 45319 */ {(16<<2)|3,{114,115,111}}, +/* 45320 */ {(16<<2)|3,{114,115,115}}, +/* 45321 */ {(16<<2)|3,{114,115,116}}, +/* 45322 */ {(11<<2)|2,{114,115,0}}, +/* 45323 */ {(11<<2)|2,{114,115,0}}, +/* 45324 */ {(11<<2)|2,{114,115,0}}, +/* 45325 */ {(11<<2)|2,{114,115,0}}, +/* 45326 */ {(11<<2)|2,{114,115,0}}, +/* 45327 */ {(11<<2)|2,{114,115,0}}, +/* 45328 */ {(11<<2)|2,{114,115,0}}, +/* 45329 */ {(11<<2)|2,{114,115,0}}, +/* 45330 */ {(11<<2)|2,{114,115,0}}, +/* 45331 */ {(11<<2)|2,{114,115,0}}, +/* 45332 */ {(11<<2)|2,{114,115,0}}, +/* 45333 */ {(11<<2)|2,{114,115,0}}, +/* 45334 */ {(11<<2)|2,{114,115,0}}, +/* 45335 */ {(11<<2)|2,{114,115,0}}, +/* 45336 */ {(11<<2)|2,{114,115,0}}, +/* 45337 */ {(11<<2)|2,{114,115,0}}, +/* 45338 */ {(11<<2)|2,{114,115,0}}, +/* 45339 */ {(11<<2)|2,{114,115,0}}, +/* 45340 */ {(11<<2)|2,{114,115,0}}, +/* 45341 */ {(11<<2)|2,{114,115,0}}, +/* 45342 */ {(11<<2)|2,{114,115,0}}, +/* 45343 */ {(11<<2)|2,{114,115,0}}, +/* 45344 */ {(16<<2)|3,{114,116,48}}, +/* 45345 */ {(16<<2)|3,{114,116,49}}, +/* 45346 */ {(16<<2)|3,{114,116,50}}, +/* 45347 */ {(16<<2)|3,{114,116,97}}, +/* 45348 */ {(16<<2)|3,{114,116,99}}, +/* 45349 */ {(16<<2)|3,{114,116,101}}, +/* 45350 */ {(16<<2)|3,{114,116,105}}, +/* 45351 */ {(16<<2)|3,{114,116,111}}, +/* 45352 */ {(16<<2)|3,{114,116,115}}, +/* 45353 */ {(16<<2)|3,{114,116,116}}, +/* 45354 */ {(11<<2)|2,{114,116,0}}, +/* 45355 */ {(11<<2)|2,{114,116,0}}, +/* 45356 */ {(11<<2)|2,{114,116,0}}, +/* 45357 */ {(11<<2)|2,{114,116,0}}, +/* 45358 */ {(11<<2)|2,{114,116,0}}, +/* 45359 */ {(11<<2)|2,{114,116,0}}, +/* 45360 */ {(11<<2)|2,{114,116,0}}, +/* 45361 */ {(11<<2)|2,{114,116,0}}, +/* 45362 */ {(11<<2)|2,{114,116,0}}, +/* 45363 */ {(11<<2)|2,{114,116,0}}, +/* 45364 */ {(11<<2)|2,{114,116,0}}, +/* 45365 */ {(11<<2)|2,{114,116,0}}, +/* 45366 */ {(11<<2)|2,{114,116,0}}, +/* 45367 */ {(11<<2)|2,{114,116,0}}, +/* 45368 */ {(11<<2)|2,{114,116,0}}, +/* 45369 */ {(11<<2)|2,{114,116,0}}, +/* 45370 */ {(11<<2)|2,{114,116,0}}, +/* 45371 */ {(11<<2)|2,{114,116,0}}, +/* 45372 */ {(11<<2)|2,{114,116,0}}, +/* 45373 */ {(11<<2)|2,{114,116,0}}, +/* 45374 */ {(11<<2)|2,{114,116,0}}, +/* 45375 */ {(11<<2)|2,{114,116,0}}, +/* 45376 */ {(12<<2)|2,{114,32,0}}, +/* 45377 */ {(12<<2)|2,{114,32,0}}, +/* 45378 */ {(12<<2)|2,{114,32,0}}, +/* 45379 */ {(12<<2)|2,{114,32,0}}, +/* 45380 */ {(12<<2)|2,{114,32,0}}, +/* 45381 */ {(12<<2)|2,{114,32,0}}, +/* 45382 */ {(12<<2)|2,{114,32,0}}, +/* 45383 */ {(12<<2)|2,{114,32,0}}, +/* 45384 */ {(12<<2)|2,{114,32,0}}, +/* 45385 */ {(12<<2)|2,{114,32,0}}, +/* 45386 */ {(12<<2)|2,{114,32,0}}, +/* 45387 */ {(12<<2)|2,{114,32,0}}, +/* 45388 */ {(12<<2)|2,{114,32,0}}, +/* 45389 */ {(12<<2)|2,{114,32,0}}, +/* 45390 */ {(12<<2)|2,{114,32,0}}, +/* 45391 */ {(12<<2)|2,{114,32,0}}, +/* 45392 */ {(12<<2)|2,{114,37,0}}, +/* 45393 */ {(12<<2)|2,{114,37,0}}, +/* 45394 */ {(12<<2)|2,{114,37,0}}, +/* 45395 */ {(12<<2)|2,{114,37,0}}, +/* 45396 */ {(12<<2)|2,{114,37,0}}, +/* 45397 */ {(12<<2)|2,{114,37,0}}, +/* 45398 */ {(12<<2)|2,{114,37,0}}, +/* 45399 */ {(12<<2)|2,{114,37,0}}, +/* 45400 */ {(12<<2)|2,{114,37,0}}, +/* 45401 */ {(12<<2)|2,{114,37,0}}, +/* 45402 */ {(12<<2)|2,{114,37,0}}, +/* 45403 */ {(12<<2)|2,{114,37,0}}, +/* 45404 */ {(12<<2)|2,{114,37,0}}, +/* 45405 */ {(12<<2)|2,{114,37,0}}, +/* 45406 */ {(12<<2)|2,{114,37,0}}, +/* 45407 */ {(12<<2)|2,{114,37,0}}, +/* 45408 */ {(12<<2)|2,{114,45,0}}, +/* 45409 */ {(12<<2)|2,{114,45,0}}, +/* 45410 */ {(12<<2)|2,{114,45,0}}, +/* 45411 */ {(12<<2)|2,{114,45,0}}, +/* 45412 */ {(12<<2)|2,{114,45,0}}, +/* 45413 */ {(12<<2)|2,{114,45,0}}, +/* 45414 */ {(12<<2)|2,{114,45,0}}, +/* 45415 */ {(12<<2)|2,{114,45,0}}, +/* 45416 */ {(12<<2)|2,{114,45,0}}, +/* 45417 */ {(12<<2)|2,{114,45,0}}, +/* 45418 */ {(12<<2)|2,{114,45,0}}, +/* 45419 */ {(12<<2)|2,{114,45,0}}, +/* 45420 */ {(12<<2)|2,{114,45,0}}, +/* 45421 */ {(12<<2)|2,{114,45,0}}, +/* 45422 */ {(12<<2)|2,{114,45,0}}, +/* 45423 */ {(12<<2)|2,{114,45,0}}, +/* 45424 */ {(12<<2)|2,{114,46,0}}, +/* 45425 */ {(12<<2)|2,{114,46,0}}, +/* 45426 */ {(12<<2)|2,{114,46,0}}, +/* 45427 */ {(12<<2)|2,{114,46,0}}, +/* 45428 */ {(12<<2)|2,{114,46,0}}, +/* 45429 */ {(12<<2)|2,{114,46,0}}, +/* 45430 */ {(12<<2)|2,{114,46,0}}, +/* 45431 */ {(12<<2)|2,{114,46,0}}, +/* 45432 */ {(12<<2)|2,{114,46,0}}, +/* 45433 */ {(12<<2)|2,{114,46,0}}, +/* 45434 */ {(12<<2)|2,{114,46,0}}, +/* 45435 */ {(12<<2)|2,{114,46,0}}, +/* 45436 */ {(12<<2)|2,{114,46,0}}, +/* 45437 */ {(12<<2)|2,{114,46,0}}, +/* 45438 */ {(12<<2)|2,{114,46,0}}, +/* 45439 */ {(12<<2)|2,{114,46,0}}, +/* 45440 */ {(12<<2)|2,{114,47,0}}, +/* 45441 */ {(12<<2)|2,{114,47,0}}, +/* 45442 */ {(12<<2)|2,{114,47,0}}, +/* 45443 */ {(12<<2)|2,{114,47,0}}, +/* 45444 */ {(12<<2)|2,{114,47,0}}, +/* 45445 */ {(12<<2)|2,{114,47,0}}, +/* 45446 */ {(12<<2)|2,{114,47,0}}, +/* 45447 */ {(12<<2)|2,{114,47,0}}, +/* 45448 */ {(12<<2)|2,{114,47,0}}, +/* 45449 */ {(12<<2)|2,{114,47,0}}, +/* 45450 */ {(12<<2)|2,{114,47,0}}, +/* 45451 */ {(12<<2)|2,{114,47,0}}, +/* 45452 */ {(12<<2)|2,{114,47,0}}, +/* 45453 */ {(12<<2)|2,{114,47,0}}, +/* 45454 */ {(12<<2)|2,{114,47,0}}, +/* 45455 */ {(12<<2)|2,{114,47,0}}, +/* 45456 */ {(12<<2)|2,{114,51,0}}, +/* 45457 */ {(12<<2)|2,{114,51,0}}, +/* 45458 */ {(12<<2)|2,{114,51,0}}, +/* 45459 */ {(12<<2)|2,{114,51,0}}, +/* 45460 */ {(12<<2)|2,{114,51,0}}, +/* 45461 */ {(12<<2)|2,{114,51,0}}, +/* 45462 */ {(12<<2)|2,{114,51,0}}, +/* 45463 */ {(12<<2)|2,{114,51,0}}, +/* 45464 */ {(12<<2)|2,{114,51,0}}, +/* 45465 */ {(12<<2)|2,{114,51,0}}, +/* 45466 */ {(12<<2)|2,{114,51,0}}, +/* 45467 */ {(12<<2)|2,{114,51,0}}, +/* 45468 */ {(12<<2)|2,{114,51,0}}, +/* 45469 */ {(12<<2)|2,{114,51,0}}, +/* 45470 */ {(12<<2)|2,{114,51,0}}, +/* 45471 */ {(12<<2)|2,{114,51,0}}, +/* 45472 */ {(12<<2)|2,{114,52,0}}, +/* 45473 */ {(12<<2)|2,{114,52,0}}, +/* 45474 */ {(12<<2)|2,{114,52,0}}, +/* 45475 */ {(12<<2)|2,{114,52,0}}, +/* 45476 */ {(12<<2)|2,{114,52,0}}, +/* 45477 */ {(12<<2)|2,{114,52,0}}, +/* 45478 */ {(12<<2)|2,{114,52,0}}, +/* 45479 */ {(12<<2)|2,{114,52,0}}, +/* 45480 */ {(12<<2)|2,{114,52,0}}, +/* 45481 */ {(12<<2)|2,{114,52,0}}, +/* 45482 */ {(12<<2)|2,{114,52,0}}, +/* 45483 */ {(12<<2)|2,{114,52,0}}, +/* 45484 */ {(12<<2)|2,{114,52,0}}, +/* 45485 */ {(12<<2)|2,{114,52,0}}, +/* 45486 */ {(12<<2)|2,{114,52,0}}, +/* 45487 */ {(12<<2)|2,{114,52,0}}, +/* 45488 */ {(12<<2)|2,{114,53,0}}, +/* 45489 */ {(12<<2)|2,{114,53,0}}, +/* 45490 */ {(12<<2)|2,{114,53,0}}, +/* 45491 */ {(12<<2)|2,{114,53,0}}, +/* 45492 */ {(12<<2)|2,{114,53,0}}, +/* 45493 */ {(12<<2)|2,{114,53,0}}, +/* 45494 */ {(12<<2)|2,{114,53,0}}, +/* 45495 */ {(12<<2)|2,{114,53,0}}, +/* 45496 */ {(12<<2)|2,{114,53,0}}, +/* 45497 */ {(12<<2)|2,{114,53,0}}, +/* 45498 */ {(12<<2)|2,{114,53,0}}, +/* 45499 */ {(12<<2)|2,{114,53,0}}, +/* 45500 */ {(12<<2)|2,{114,53,0}}, +/* 45501 */ {(12<<2)|2,{114,53,0}}, +/* 45502 */ {(12<<2)|2,{114,53,0}}, +/* 45503 */ {(12<<2)|2,{114,53,0}}, +/* 45504 */ {(12<<2)|2,{114,54,0}}, +/* 45505 */ {(12<<2)|2,{114,54,0}}, +/* 45506 */ {(12<<2)|2,{114,54,0}}, +/* 45507 */ {(12<<2)|2,{114,54,0}}, +/* 45508 */ {(12<<2)|2,{114,54,0}}, +/* 45509 */ {(12<<2)|2,{114,54,0}}, +/* 45510 */ {(12<<2)|2,{114,54,0}}, +/* 45511 */ {(12<<2)|2,{114,54,0}}, +/* 45512 */ {(12<<2)|2,{114,54,0}}, +/* 45513 */ {(12<<2)|2,{114,54,0}}, +/* 45514 */ {(12<<2)|2,{114,54,0}}, +/* 45515 */ {(12<<2)|2,{114,54,0}}, +/* 45516 */ {(12<<2)|2,{114,54,0}}, +/* 45517 */ {(12<<2)|2,{114,54,0}}, +/* 45518 */ {(12<<2)|2,{114,54,0}}, +/* 45519 */ {(12<<2)|2,{114,54,0}}, +/* 45520 */ {(12<<2)|2,{114,55,0}}, +/* 45521 */ {(12<<2)|2,{114,55,0}}, +/* 45522 */ {(12<<2)|2,{114,55,0}}, +/* 45523 */ {(12<<2)|2,{114,55,0}}, +/* 45524 */ {(12<<2)|2,{114,55,0}}, +/* 45525 */ {(12<<2)|2,{114,55,0}}, +/* 45526 */ {(12<<2)|2,{114,55,0}}, +/* 45527 */ {(12<<2)|2,{114,55,0}}, +/* 45528 */ {(12<<2)|2,{114,55,0}}, +/* 45529 */ {(12<<2)|2,{114,55,0}}, +/* 45530 */ {(12<<2)|2,{114,55,0}}, +/* 45531 */ {(12<<2)|2,{114,55,0}}, +/* 45532 */ {(12<<2)|2,{114,55,0}}, +/* 45533 */ {(12<<2)|2,{114,55,0}}, +/* 45534 */ {(12<<2)|2,{114,55,0}}, +/* 45535 */ {(12<<2)|2,{114,55,0}}, +/* 45536 */ {(12<<2)|2,{114,56,0}}, +/* 45537 */ {(12<<2)|2,{114,56,0}}, +/* 45538 */ {(12<<2)|2,{114,56,0}}, +/* 45539 */ {(12<<2)|2,{114,56,0}}, +/* 45540 */ {(12<<2)|2,{114,56,0}}, +/* 45541 */ {(12<<2)|2,{114,56,0}}, +/* 45542 */ {(12<<2)|2,{114,56,0}}, +/* 45543 */ {(12<<2)|2,{114,56,0}}, +/* 45544 */ {(12<<2)|2,{114,56,0}}, +/* 45545 */ {(12<<2)|2,{114,56,0}}, +/* 45546 */ {(12<<2)|2,{114,56,0}}, +/* 45547 */ {(12<<2)|2,{114,56,0}}, +/* 45548 */ {(12<<2)|2,{114,56,0}}, +/* 45549 */ {(12<<2)|2,{114,56,0}}, +/* 45550 */ {(12<<2)|2,{114,56,0}}, +/* 45551 */ {(12<<2)|2,{114,56,0}}, +/* 45552 */ {(12<<2)|2,{114,57,0}}, +/* 45553 */ {(12<<2)|2,{114,57,0}}, +/* 45554 */ {(12<<2)|2,{114,57,0}}, +/* 45555 */ {(12<<2)|2,{114,57,0}}, +/* 45556 */ {(12<<2)|2,{114,57,0}}, +/* 45557 */ {(12<<2)|2,{114,57,0}}, +/* 45558 */ {(12<<2)|2,{114,57,0}}, +/* 45559 */ {(12<<2)|2,{114,57,0}}, +/* 45560 */ {(12<<2)|2,{114,57,0}}, +/* 45561 */ {(12<<2)|2,{114,57,0}}, +/* 45562 */ {(12<<2)|2,{114,57,0}}, +/* 45563 */ {(12<<2)|2,{114,57,0}}, +/* 45564 */ {(12<<2)|2,{114,57,0}}, +/* 45565 */ {(12<<2)|2,{114,57,0}}, +/* 45566 */ {(12<<2)|2,{114,57,0}}, +/* 45567 */ {(12<<2)|2,{114,57,0}}, +/* 45568 */ {(12<<2)|2,{114,61,0}}, +/* 45569 */ {(12<<2)|2,{114,61,0}}, +/* 45570 */ {(12<<2)|2,{114,61,0}}, +/* 45571 */ {(12<<2)|2,{114,61,0}}, +/* 45572 */ {(12<<2)|2,{114,61,0}}, +/* 45573 */ {(12<<2)|2,{114,61,0}}, +/* 45574 */ {(12<<2)|2,{114,61,0}}, +/* 45575 */ {(12<<2)|2,{114,61,0}}, +/* 45576 */ {(12<<2)|2,{114,61,0}}, +/* 45577 */ {(12<<2)|2,{114,61,0}}, +/* 45578 */ {(12<<2)|2,{114,61,0}}, +/* 45579 */ {(12<<2)|2,{114,61,0}}, +/* 45580 */ {(12<<2)|2,{114,61,0}}, +/* 45581 */ {(12<<2)|2,{114,61,0}}, +/* 45582 */ {(12<<2)|2,{114,61,0}}, +/* 45583 */ {(12<<2)|2,{114,61,0}}, +/* 45584 */ {(12<<2)|2,{114,65,0}}, +/* 45585 */ {(12<<2)|2,{114,65,0}}, +/* 45586 */ {(12<<2)|2,{114,65,0}}, +/* 45587 */ {(12<<2)|2,{114,65,0}}, +/* 45588 */ {(12<<2)|2,{114,65,0}}, +/* 45589 */ {(12<<2)|2,{114,65,0}}, +/* 45590 */ {(12<<2)|2,{114,65,0}}, +/* 45591 */ {(12<<2)|2,{114,65,0}}, +/* 45592 */ {(12<<2)|2,{114,65,0}}, +/* 45593 */ {(12<<2)|2,{114,65,0}}, +/* 45594 */ {(12<<2)|2,{114,65,0}}, +/* 45595 */ {(12<<2)|2,{114,65,0}}, +/* 45596 */ {(12<<2)|2,{114,65,0}}, +/* 45597 */ {(12<<2)|2,{114,65,0}}, +/* 45598 */ {(12<<2)|2,{114,65,0}}, +/* 45599 */ {(12<<2)|2,{114,65,0}}, +/* 45600 */ {(12<<2)|2,{114,95,0}}, +/* 45601 */ {(12<<2)|2,{114,95,0}}, +/* 45602 */ {(12<<2)|2,{114,95,0}}, +/* 45603 */ {(12<<2)|2,{114,95,0}}, +/* 45604 */ {(12<<2)|2,{114,95,0}}, +/* 45605 */ {(12<<2)|2,{114,95,0}}, +/* 45606 */ {(12<<2)|2,{114,95,0}}, +/* 45607 */ {(12<<2)|2,{114,95,0}}, +/* 45608 */ {(12<<2)|2,{114,95,0}}, +/* 45609 */ {(12<<2)|2,{114,95,0}}, +/* 45610 */ {(12<<2)|2,{114,95,0}}, +/* 45611 */ {(12<<2)|2,{114,95,0}}, +/* 45612 */ {(12<<2)|2,{114,95,0}}, +/* 45613 */ {(12<<2)|2,{114,95,0}}, +/* 45614 */ {(12<<2)|2,{114,95,0}}, +/* 45615 */ {(12<<2)|2,{114,95,0}}, +/* 45616 */ {(12<<2)|2,{114,98,0}}, +/* 45617 */ {(12<<2)|2,{114,98,0}}, +/* 45618 */ {(12<<2)|2,{114,98,0}}, +/* 45619 */ {(12<<2)|2,{114,98,0}}, +/* 45620 */ {(12<<2)|2,{114,98,0}}, +/* 45621 */ {(12<<2)|2,{114,98,0}}, +/* 45622 */ {(12<<2)|2,{114,98,0}}, +/* 45623 */ {(12<<2)|2,{114,98,0}}, +/* 45624 */ {(12<<2)|2,{114,98,0}}, +/* 45625 */ {(12<<2)|2,{114,98,0}}, +/* 45626 */ {(12<<2)|2,{114,98,0}}, +/* 45627 */ {(12<<2)|2,{114,98,0}}, +/* 45628 */ {(12<<2)|2,{114,98,0}}, +/* 45629 */ {(12<<2)|2,{114,98,0}}, +/* 45630 */ {(12<<2)|2,{114,98,0}}, +/* 45631 */ {(12<<2)|2,{114,98,0}}, +/* 45632 */ {(12<<2)|2,{114,100,0}}, +/* 45633 */ {(12<<2)|2,{114,100,0}}, +/* 45634 */ {(12<<2)|2,{114,100,0}}, +/* 45635 */ {(12<<2)|2,{114,100,0}}, +/* 45636 */ {(12<<2)|2,{114,100,0}}, +/* 45637 */ {(12<<2)|2,{114,100,0}}, +/* 45638 */ {(12<<2)|2,{114,100,0}}, +/* 45639 */ {(12<<2)|2,{114,100,0}}, +/* 45640 */ {(12<<2)|2,{114,100,0}}, +/* 45641 */ {(12<<2)|2,{114,100,0}}, +/* 45642 */ {(12<<2)|2,{114,100,0}}, +/* 45643 */ {(12<<2)|2,{114,100,0}}, +/* 45644 */ {(12<<2)|2,{114,100,0}}, +/* 45645 */ {(12<<2)|2,{114,100,0}}, +/* 45646 */ {(12<<2)|2,{114,100,0}}, +/* 45647 */ {(12<<2)|2,{114,100,0}}, +/* 45648 */ {(12<<2)|2,{114,102,0}}, +/* 45649 */ {(12<<2)|2,{114,102,0}}, +/* 45650 */ {(12<<2)|2,{114,102,0}}, +/* 45651 */ {(12<<2)|2,{114,102,0}}, +/* 45652 */ {(12<<2)|2,{114,102,0}}, +/* 45653 */ {(12<<2)|2,{114,102,0}}, +/* 45654 */ {(12<<2)|2,{114,102,0}}, +/* 45655 */ {(12<<2)|2,{114,102,0}}, +/* 45656 */ {(12<<2)|2,{114,102,0}}, +/* 45657 */ {(12<<2)|2,{114,102,0}}, +/* 45658 */ {(12<<2)|2,{114,102,0}}, +/* 45659 */ {(12<<2)|2,{114,102,0}}, +/* 45660 */ {(12<<2)|2,{114,102,0}}, +/* 45661 */ {(12<<2)|2,{114,102,0}}, +/* 45662 */ {(12<<2)|2,{114,102,0}}, +/* 45663 */ {(12<<2)|2,{114,102,0}}, +/* 45664 */ {(12<<2)|2,{114,103,0}}, +/* 45665 */ {(12<<2)|2,{114,103,0}}, +/* 45666 */ {(12<<2)|2,{114,103,0}}, +/* 45667 */ {(12<<2)|2,{114,103,0}}, +/* 45668 */ {(12<<2)|2,{114,103,0}}, +/* 45669 */ {(12<<2)|2,{114,103,0}}, +/* 45670 */ {(12<<2)|2,{114,103,0}}, +/* 45671 */ {(12<<2)|2,{114,103,0}}, +/* 45672 */ {(12<<2)|2,{114,103,0}}, +/* 45673 */ {(12<<2)|2,{114,103,0}}, +/* 45674 */ {(12<<2)|2,{114,103,0}}, +/* 45675 */ {(12<<2)|2,{114,103,0}}, +/* 45676 */ {(12<<2)|2,{114,103,0}}, +/* 45677 */ {(12<<2)|2,{114,103,0}}, +/* 45678 */ {(12<<2)|2,{114,103,0}}, +/* 45679 */ {(12<<2)|2,{114,103,0}}, +/* 45680 */ {(12<<2)|2,{114,104,0}}, +/* 45681 */ {(12<<2)|2,{114,104,0}}, +/* 45682 */ {(12<<2)|2,{114,104,0}}, +/* 45683 */ {(12<<2)|2,{114,104,0}}, +/* 45684 */ {(12<<2)|2,{114,104,0}}, +/* 45685 */ {(12<<2)|2,{114,104,0}}, +/* 45686 */ {(12<<2)|2,{114,104,0}}, +/* 45687 */ {(12<<2)|2,{114,104,0}}, +/* 45688 */ {(12<<2)|2,{114,104,0}}, +/* 45689 */ {(12<<2)|2,{114,104,0}}, +/* 45690 */ {(12<<2)|2,{114,104,0}}, +/* 45691 */ {(12<<2)|2,{114,104,0}}, +/* 45692 */ {(12<<2)|2,{114,104,0}}, +/* 45693 */ {(12<<2)|2,{114,104,0}}, +/* 45694 */ {(12<<2)|2,{114,104,0}}, +/* 45695 */ {(12<<2)|2,{114,104,0}}, +/* 45696 */ {(12<<2)|2,{114,108,0}}, +/* 45697 */ {(12<<2)|2,{114,108,0}}, +/* 45698 */ {(12<<2)|2,{114,108,0}}, +/* 45699 */ {(12<<2)|2,{114,108,0}}, +/* 45700 */ {(12<<2)|2,{114,108,0}}, +/* 45701 */ {(12<<2)|2,{114,108,0}}, +/* 45702 */ {(12<<2)|2,{114,108,0}}, +/* 45703 */ {(12<<2)|2,{114,108,0}}, +/* 45704 */ {(12<<2)|2,{114,108,0}}, +/* 45705 */ {(12<<2)|2,{114,108,0}}, +/* 45706 */ {(12<<2)|2,{114,108,0}}, +/* 45707 */ {(12<<2)|2,{114,108,0}}, +/* 45708 */ {(12<<2)|2,{114,108,0}}, +/* 45709 */ {(12<<2)|2,{114,108,0}}, +/* 45710 */ {(12<<2)|2,{114,108,0}}, +/* 45711 */ {(12<<2)|2,{114,108,0}}, +/* 45712 */ {(12<<2)|2,{114,109,0}}, +/* 45713 */ {(12<<2)|2,{114,109,0}}, +/* 45714 */ {(12<<2)|2,{114,109,0}}, +/* 45715 */ {(12<<2)|2,{114,109,0}}, +/* 45716 */ {(12<<2)|2,{114,109,0}}, +/* 45717 */ {(12<<2)|2,{114,109,0}}, +/* 45718 */ {(12<<2)|2,{114,109,0}}, +/* 45719 */ {(12<<2)|2,{114,109,0}}, +/* 45720 */ {(12<<2)|2,{114,109,0}}, +/* 45721 */ {(12<<2)|2,{114,109,0}}, +/* 45722 */ {(12<<2)|2,{114,109,0}}, +/* 45723 */ {(12<<2)|2,{114,109,0}}, +/* 45724 */ {(12<<2)|2,{114,109,0}}, +/* 45725 */ {(12<<2)|2,{114,109,0}}, +/* 45726 */ {(12<<2)|2,{114,109,0}}, +/* 45727 */ {(12<<2)|2,{114,109,0}}, +/* 45728 */ {(12<<2)|2,{114,110,0}}, +/* 45729 */ {(12<<2)|2,{114,110,0}}, +/* 45730 */ {(12<<2)|2,{114,110,0}}, +/* 45731 */ {(12<<2)|2,{114,110,0}}, +/* 45732 */ {(12<<2)|2,{114,110,0}}, +/* 45733 */ {(12<<2)|2,{114,110,0}}, +/* 45734 */ {(12<<2)|2,{114,110,0}}, +/* 45735 */ {(12<<2)|2,{114,110,0}}, +/* 45736 */ {(12<<2)|2,{114,110,0}}, +/* 45737 */ {(12<<2)|2,{114,110,0}}, +/* 45738 */ {(12<<2)|2,{114,110,0}}, +/* 45739 */ {(12<<2)|2,{114,110,0}}, +/* 45740 */ {(12<<2)|2,{114,110,0}}, +/* 45741 */ {(12<<2)|2,{114,110,0}}, +/* 45742 */ {(12<<2)|2,{114,110,0}}, +/* 45743 */ {(12<<2)|2,{114,110,0}}, +/* 45744 */ {(12<<2)|2,{114,112,0}}, +/* 45745 */ {(12<<2)|2,{114,112,0}}, +/* 45746 */ {(12<<2)|2,{114,112,0}}, +/* 45747 */ {(12<<2)|2,{114,112,0}}, +/* 45748 */ {(12<<2)|2,{114,112,0}}, +/* 45749 */ {(12<<2)|2,{114,112,0}}, +/* 45750 */ {(12<<2)|2,{114,112,0}}, +/* 45751 */ {(12<<2)|2,{114,112,0}}, +/* 45752 */ {(12<<2)|2,{114,112,0}}, +/* 45753 */ {(12<<2)|2,{114,112,0}}, +/* 45754 */ {(12<<2)|2,{114,112,0}}, +/* 45755 */ {(12<<2)|2,{114,112,0}}, +/* 45756 */ {(12<<2)|2,{114,112,0}}, +/* 45757 */ {(12<<2)|2,{114,112,0}}, +/* 45758 */ {(12<<2)|2,{114,112,0}}, +/* 45759 */ {(12<<2)|2,{114,112,0}}, +/* 45760 */ {(12<<2)|2,{114,114,0}}, +/* 45761 */ {(12<<2)|2,{114,114,0}}, +/* 45762 */ {(12<<2)|2,{114,114,0}}, +/* 45763 */ {(12<<2)|2,{114,114,0}}, +/* 45764 */ {(12<<2)|2,{114,114,0}}, +/* 45765 */ {(12<<2)|2,{114,114,0}}, +/* 45766 */ {(12<<2)|2,{114,114,0}}, +/* 45767 */ {(12<<2)|2,{114,114,0}}, +/* 45768 */ {(12<<2)|2,{114,114,0}}, +/* 45769 */ {(12<<2)|2,{114,114,0}}, +/* 45770 */ {(12<<2)|2,{114,114,0}}, +/* 45771 */ {(12<<2)|2,{114,114,0}}, +/* 45772 */ {(12<<2)|2,{114,114,0}}, +/* 45773 */ {(12<<2)|2,{114,114,0}}, +/* 45774 */ {(12<<2)|2,{114,114,0}}, +/* 45775 */ {(12<<2)|2,{114,114,0}}, +/* 45776 */ {(12<<2)|2,{114,117,0}}, +/* 45777 */ {(12<<2)|2,{114,117,0}}, +/* 45778 */ {(12<<2)|2,{114,117,0}}, +/* 45779 */ {(12<<2)|2,{114,117,0}}, +/* 45780 */ {(12<<2)|2,{114,117,0}}, +/* 45781 */ {(12<<2)|2,{114,117,0}}, +/* 45782 */ {(12<<2)|2,{114,117,0}}, +/* 45783 */ {(12<<2)|2,{114,117,0}}, +/* 45784 */ {(12<<2)|2,{114,117,0}}, +/* 45785 */ {(12<<2)|2,{114,117,0}}, +/* 45786 */ {(12<<2)|2,{114,117,0}}, +/* 45787 */ {(12<<2)|2,{114,117,0}}, +/* 45788 */ {(12<<2)|2,{114,117,0}}, +/* 45789 */ {(12<<2)|2,{114,117,0}}, +/* 45790 */ {(12<<2)|2,{114,117,0}}, +/* 45791 */ {(12<<2)|2,{114,117,0}}, +/* 45792 */ {(13<<2)|2,{114,58,0}}, +/* 45793 */ {(13<<2)|2,{114,58,0}}, +/* 45794 */ {(13<<2)|2,{114,58,0}}, +/* 45795 */ {(13<<2)|2,{114,58,0}}, +/* 45796 */ {(13<<2)|2,{114,58,0}}, +/* 45797 */ {(13<<2)|2,{114,58,0}}, +/* 45798 */ {(13<<2)|2,{114,58,0}}, +/* 45799 */ {(13<<2)|2,{114,58,0}}, +/* 45800 */ {(13<<2)|2,{114,66,0}}, +/* 45801 */ {(13<<2)|2,{114,66,0}}, +/* 45802 */ {(13<<2)|2,{114,66,0}}, +/* 45803 */ {(13<<2)|2,{114,66,0}}, +/* 45804 */ {(13<<2)|2,{114,66,0}}, +/* 45805 */ {(13<<2)|2,{114,66,0}}, +/* 45806 */ {(13<<2)|2,{114,66,0}}, +/* 45807 */ {(13<<2)|2,{114,66,0}}, +/* 45808 */ {(13<<2)|2,{114,67,0}}, +/* 45809 */ {(13<<2)|2,{114,67,0}}, +/* 45810 */ {(13<<2)|2,{114,67,0}}, +/* 45811 */ {(13<<2)|2,{114,67,0}}, +/* 45812 */ {(13<<2)|2,{114,67,0}}, +/* 45813 */ {(13<<2)|2,{114,67,0}}, +/* 45814 */ {(13<<2)|2,{114,67,0}}, +/* 45815 */ {(13<<2)|2,{114,67,0}}, +/* 45816 */ {(13<<2)|2,{114,68,0}}, +/* 45817 */ {(13<<2)|2,{114,68,0}}, +/* 45818 */ {(13<<2)|2,{114,68,0}}, +/* 45819 */ {(13<<2)|2,{114,68,0}}, +/* 45820 */ {(13<<2)|2,{114,68,0}}, +/* 45821 */ {(13<<2)|2,{114,68,0}}, +/* 45822 */ {(13<<2)|2,{114,68,0}}, +/* 45823 */ {(13<<2)|2,{114,68,0}}, +/* 45824 */ {(13<<2)|2,{114,69,0}}, +/* 45825 */ {(13<<2)|2,{114,69,0}}, +/* 45826 */ {(13<<2)|2,{114,69,0}}, +/* 45827 */ {(13<<2)|2,{114,69,0}}, +/* 45828 */ {(13<<2)|2,{114,69,0}}, +/* 45829 */ {(13<<2)|2,{114,69,0}}, +/* 45830 */ {(13<<2)|2,{114,69,0}}, +/* 45831 */ {(13<<2)|2,{114,69,0}}, +/* 45832 */ {(13<<2)|2,{114,70,0}}, +/* 45833 */ {(13<<2)|2,{114,70,0}}, +/* 45834 */ {(13<<2)|2,{114,70,0}}, +/* 45835 */ {(13<<2)|2,{114,70,0}}, +/* 45836 */ {(13<<2)|2,{114,70,0}}, +/* 45837 */ {(13<<2)|2,{114,70,0}}, +/* 45838 */ {(13<<2)|2,{114,70,0}}, +/* 45839 */ {(13<<2)|2,{114,70,0}}, +/* 45840 */ {(13<<2)|2,{114,71,0}}, +/* 45841 */ {(13<<2)|2,{114,71,0}}, +/* 45842 */ {(13<<2)|2,{114,71,0}}, +/* 45843 */ {(13<<2)|2,{114,71,0}}, +/* 45844 */ {(13<<2)|2,{114,71,0}}, +/* 45845 */ {(13<<2)|2,{114,71,0}}, +/* 45846 */ {(13<<2)|2,{114,71,0}}, +/* 45847 */ {(13<<2)|2,{114,71,0}}, +/* 45848 */ {(13<<2)|2,{114,72,0}}, +/* 45849 */ {(13<<2)|2,{114,72,0}}, +/* 45850 */ {(13<<2)|2,{114,72,0}}, +/* 45851 */ {(13<<2)|2,{114,72,0}}, +/* 45852 */ {(13<<2)|2,{114,72,0}}, +/* 45853 */ {(13<<2)|2,{114,72,0}}, +/* 45854 */ {(13<<2)|2,{114,72,0}}, +/* 45855 */ {(13<<2)|2,{114,72,0}}, +/* 45856 */ {(13<<2)|2,{114,73,0}}, +/* 45857 */ {(13<<2)|2,{114,73,0}}, +/* 45858 */ {(13<<2)|2,{114,73,0}}, +/* 45859 */ {(13<<2)|2,{114,73,0}}, +/* 45860 */ {(13<<2)|2,{114,73,0}}, +/* 45861 */ {(13<<2)|2,{114,73,0}}, +/* 45862 */ {(13<<2)|2,{114,73,0}}, +/* 45863 */ {(13<<2)|2,{114,73,0}}, +/* 45864 */ {(13<<2)|2,{114,74,0}}, +/* 45865 */ {(13<<2)|2,{114,74,0}}, +/* 45866 */ {(13<<2)|2,{114,74,0}}, +/* 45867 */ {(13<<2)|2,{114,74,0}}, +/* 45868 */ {(13<<2)|2,{114,74,0}}, +/* 45869 */ {(13<<2)|2,{114,74,0}}, +/* 45870 */ {(13<<2)|2,{114,74,0}}, +/* 45871 */ {(13<<2)|2,{114,74,0}}, +/* 45872 */ {(13<<2)|2,{114,75,0}}, +/* 45873 */ {(13<<2)|2,{114,75,0}}, +/* 45874 */ {(13<<2)|2,{114,75,0}}, +/* 45875 */ {(13<<2)|2,{114,75,0}}, +/* 45876 */ {(13<<2)|2,{114,75,0}}, +/* 45877 */ {(13<<2)|2,{114,75,0}}, +/* 45878 */ {(13<<2)|2,{114,75,0}}, +/* 45879 */ {(13<<2)|2,{114,75,0}}, +/* 45880 */ {(13<<2)|2,{114,76,0}}, +/* 45881 */ {(13<<2)|2,{114,76,0}}, +/* 45882 */ {(13<<2)|2,{114,76,0}}, +/* 45883 */ {(13<<2)|2,{114,76,0}}, +/* 45884 */ {(13<<2)|2,{114,76,0}}, +/* 45885 */ {(13<<2)|2,{114,76,0}}, +/* 45886 */ {(13<<2)|2,{114,76,0}}, +/* 45887 */ {(13<<2)|2,{114,76,0}}, +/* 45888 */ {(13<<2)|2,{114,77,0}}, +/* 45889 */ {(13<<2)|2,{114,77,0}}, +/* 45890 */ {(13<<2)|2,{114,77,0}}, +/* 45891 */ {(13<<2)|2,{114,77,0}}, +/* 45892 */ {(13<<2)|2,{114,77,0}}, +/* 45893 */ {(13<<2)|2,{114,77,0}}, +/* 45894 */ {(13<<2)|2,{114,77,0}}, +/* 45895 */ {(13<<2)|2,{114,77,0}}, +/* 45896 */ {(13<<2)|2,{114,78,0}}, +/* 45897 */ {(13<<2)|2,{114,78,0}}, +/* 45898 */ {(13<<2)|2,{114,78,0}}, +/* 45899 */ {(13<<2)|2,{114,78,0}}, +/* 45900 */ {(13<<2)|2,{114,78,0}}, +/* 45901 */ {(13<<2)|2,{114,78,0}}, +/* 45902 */ {(13<<2)|2,{114,78,0}}, +/* 45903 */ {(13<<2)|2,{114,78,0}}, +/* 45904 */ {(13<<2)|2,{114,79,0}}, +/* 45905 */ {(13<<2)|2,{114,79,0}}, +/* 45906 */ {(13<<2)|2,{114,79,0}}, +/* 45907 */ {(13<<2)|2,{114,79,0}}, +/* 45908 */ {(13<<2)|2,{114,79,0}}, +/* 45909 */ {(13<<2)|2,{114,79,0}}, +/* 45910 */ {(13<<2)|2,{114,79,0}}, +/* 45911 */ {(13<<2)|2,{114,79,0}}, +/* 45912 */ {(13<<2)|2,{114,80,0}}, +/* 45913 */ {(13<<2)|2,{114,80,0}}, +/* 45914 */ {(13<<2)|2,{114,80,0}}, +/* 45915 */ {(13<<2)|2,{114,80,0}}, +/* 45916 */ {(13<<2)|2,{114,80,0}}, +/* 45917 */ {(13<<2)|2,{114,80,0}}, +/* 45918 */ {(13<<2)|2,{114,80,0}}, +/* 45919 */ {(13<<2)|2,{114,80,0}}, +/* 45920 */ {(13<<2)|2,{114,81,0}}, +/* 45921 */ {(13<<2)|2,{114,81,0}}, +/* 45922 */ {(13<<2)|2,{114,81,0}}, +/* 45923 */ {(13<<2)|2,{114,81,0}}, +/* 45924 */ {(13<<2)|2,{114,81,0}}, +/* 45925 */ {(13<<2)|2,{114,81,0}}, +/* 45926 */ {(13<<2)|2,{114,81,0}}, +/* 45927 */ {(13<<2)|2,{114,81,0}}, +/* 45928 */ {(13<<2)|2,{114,82,0}}, +/* 45929 */ {(13<<2)|2,{114,82,0}}, +/* 45930 */ {(13<<2)|2,{114,82,0}}, +/* 45931 */ {(13<<2)|2,{114,82,0}}, +/* 45932 */ {(13<<2)|2,{114,82,0}}, +/* 45933 */ {(13<<2)|2,{114,82,0}}, +/* 45934 */ {(13<<2)|2,{114,82,0}}, +/* 45935 */ {(13<<2)|2,{114,82,0}}, +/* 45936 */ {(13<<2)|2,{114,83,0}}, +/* 45937 */ {(13<<2)|2,{114,83,0}}, +/* 45938 */ {(13<<2)|2,{114,83,0}}, +/* 45939 */ {(13<<2)|2,{114,83,0}}, +/* 45940 */ {(13<<2)|2,{114,83,0}}, +/* 45941 */ {(13<<2)|2,{114,83,0}}, +/* 45942 */ {(13<<2)|2,{114,83,0}}, +/* 45943 */ {(13<<2)|2,{114,83,0}}, +/* 45944 */ {(13<<2)|2,{114,84,0}}, +/* 45945 */ {(13<<2)|2,{114,84,0}}, +/* 45946 */ {(13<<2)|2,{114,84,0}}, +/* 45947 */ {(13<<2)|2,{114,84,0}}, +/* 45948 */ {(13<<2)|2,{114,84,0}}, +/* 45949 */ {(13<<2)|2,{114,84,0}}, +/* 45950 */ {(13<<2)|2,{114,84,0}}, +/* 45951 */ {(13<<2)|2,{114,84,0}}, +/* 45952 */ {(13<<2)|2,{114,85,0}}, +/* 45953 */ {(13<<2)|2,{114,85,0}}, +/* 45954 */ {(13<<2)|2,{114,85,0}}, +/* 45955 */ {(13<<2)|2,{114,85,0}}, +/* 45956 */ {(13<<2)|2,{114,85,0}}, +/* 45957 */ {(13<<2)|2,{114,85,0}}, +/* 45958 */ {(13<<2)|2,{114,85,0}}, +/* 45959 */ {(13<<2)|2,{114,85,0}}, +/* 45960 */ {(13<<2)|2,{114,86,0}}, +/* 45961 */ {(13<<2)|2,{114,86,0}}, +/* 45962 */ {(13<<2)|2,{114,86,0}}, +/* 45963 */ {(13<<2)|2,{114,86,0}}, +/* 45964 */ {(13<<2)|2,{114,86,0}}, +/* 45965 */ {(13<<2)|2,{114,86,0}}, +/* 45966 */ {(13<<2)|2,{114,86,0}}, +/* 45967 */ {(13<<2)|2,{114,86,0}}, +/* 45968 */ {(13<<2)|2,{114,87,0}}, +/* 45969 */ {(13<<2)|2,{114,87,0}}, +/* 45970 */ {(13<<2)|2,{114,87,0}}, +/* 45971 */ {(13<<2)|2,{114,87,0}}, +/* 45972 */ {(13<<2)|2,{114,87,0}}, +/* 45973 */ {(13<<2)|2,{114,87,0}}, +/* 45974 */ {(13<<2)|2,{114,87,0}}, +/* 45975 */ {(13<<2)|2,{114,87,0}}, +/* 45976 */ {(13<<2)|2,{114,89,0}}, +/* 45977 */ {(13<<2)|2,{114,89,0}}, +/* 45978 */ {(13<<2)|2,{114,89,0}}, +/* 45979 */ {(13<<2)|2,{114,89,0}}, +/* 45980 */ {(13<<2)|2,{114,89,0}}, +/* 45981 */ {(13<<2)|2,{114,89,0}}, +/* 45982 */ {(13<<2)|2,{114,89,0}}, +/* 45983 */ {(13<<2)|2,{114,89,0}}, +/* 45984 */ {(13<<2)|2,{114,106,0}}, +/* 45985 */ {(13<<2)|2,{114,106,0}}, +/* 45986 */ {(13<<2)|2,{114,106,0}}, +/* 45987 */ {(13<<2)|2,{114,106,0}}, +/* 45988 */ {(13<<2)|2,{114,106,0}}, +/* 45989 */ {(13<<2)|2,{114,106,0}}, +/* 45990 */ {(13<<2)|2,{114,106,0}}, +/* 45991 */ {(13<<2)|2,{114,106,0}}, +/* 45992 */ {(13<<2)|2,{114,107,0}}, +/* 45993 */ {(13<<2)|2,{114,107,0}}, +/* 45994 */ {(13<<2)|2,{114,107,0}}, +/* 45995 */ {(13<<2)|2,{114,107,0}}, +/* 45996 */ {(13<<2)|2,{114,107,0}}, +/* 45997 */ {(13<<2)|2,{114,107,0}}, +/* 45998 */ {(13<<2)|2,{114,107,0}}, +/* 45999 */ {(13<<2)|2,{114,107,0}}, +/* 46000 */ {(13<<2)|2,{114,113,0}}, +/* 46001 */ {(13<<2)|2,{114,113,0}}, +/* 46002 */ {(13<<2)|2,{114,113,0}}, +/* 46003 */ {(13<<2)|2,{114,113,0}}, +/* 46004 */ {(13<<2)|2,{114,113,0}}, +/* 46005 */ {(13<<2)|2,{114,113,0}}, +/* 46006 */ {(13<<2)|2,{114,113,0}}, +/* 46007 */ {(13<<2)|2,{114,113,0}}, +/* 46008 */ {(13<<2)|2,{114,118,0}}, +/* 46009 */ {(13<<2)|2,{114,118,0}}, +/* 46010 */ {(13<<2)|2,{114,118,0}}, +/* 46011 */ {(13<<2)|2,{114,118,0}}, +/* 46012 */ {(13<<2)|2,{114,118,0}}, +/* 46013 */ {(13<<2)|2,{114,118,0}}, +/* 46014 */ {(13<<2)|2,{114,118,0}}, +/* 46015 */ {(13<<2)|2,{114,118,0}}, +/* 46016 */ {(13<<2)|2,{114,119,0}}, +/* 46017 */ {(13<<2)|2,{114,119,0}}, +/* 46018 */ {(13<<2)|2,{114,119,0}}, +/* 46019 */ {(13<<2)|2,{114,119,0}}, +/* 46020 */ {(13<<2)|2,{114,119,0}}, +/* 46021 */ {(13<<2)|2,{114,119,0}}, +/* 46022 */ {(13<<2)|2,{114,119,0}}, +/* 46023 */ {(13<<2)|2,{114,119,0}}, +/* 46024 */ {(13<<2)|2,{114,120,0}}, +/* 46025 */ {(13<<2)|2,{114,120,0}}, +/* 46026 */ {(13<<2)|2,{114,120,0}}, +/* 46027 */ {(13<<2)|2,{114,120,0}}, +/* 46028 */ {(13<<2)|2,{114,120,0}}, +/* 46029 */ {(13<<2)|2,{114,120,0}}, +/* 46030 */ {(13<<2)|2,{114,120,0}}, +/* 46031 */ {(13<<2)|2,{114,120,0}}, +/* 46032 */ {(13<<2)|2,{114,121,0}}, +/* 46033 */ {(13<<2)|2,{114,121,0}}, +/* 46034 */ {(13<<2)|2,{114,121,0}}, +/* 46035 */ {(13<<2)|2,{114,121,0}}, +/* 46036 */ {(13<<2)|2,{114,121,0}}, +/* 46037 */ {(13<<2)|2,{114,121,0}}, +/* 46038 */ {(13<<2)|2,{114,121,0}}, +/* 46039 */ {(13<<2)|2,{114,121,0}}, +/* 46040 */ {(13<<2)|2,{114,122,0}}, +/* 46041 */ {(13<<2)|2,{114,122,0}}, +/* 46042 */ {(13<<2)|2,{114,122,0}}, +/* 46043 */ {(13<<2)|2,{114,122,0}}, +/* 46044 */ {(13<<2)|2,{114,122,0}}, +/* 46045 */ {(13<<2)|2,{114,122,0}}, +/* 46046 */ {(13<<2)|2,{114,122,0}}, +/* 46047 */ {(13<<2)|2,{114,122,0}}, +/* 46048 */ {(14<<2)|2,{114,38,0}}, +/* 46049 */ {(14<<2)|2,{114,38,0}}, +/* 46050 */ {(14<<2)|2,{114,38,0}}, +/* 46051 */ {(14<<2)|2,{114,38,0}}, +/* 46052 */ {(14<<2)|2,{114,42,0}}, +/* 46053 */ {(14<<2)|2,{114,42,0}}, +/* 46054 */ {(14<<2)|2,{114,42,0}}, +/* 46055 */ {(14<<2)|2,{114,42,0}}, +/* 46056 */ {(14<<2)|2,{114,44,0}}, +/* 46057 */ {(14<<2)|2,{114,44,0}}, +/* 46058 */ {(14<<2)|2,{114,44,0}}, +/* 46059 */ {(14<<2)|2,{114,44,0}}, +/* 46060 */ {(14<<2)|2,{114,59,0}}, +/* 46061 */ {(14<<2)|2,{114,59,0}}, +/* 46062 */ {(14<<2)|2,{114,59,0}}, +/* 46063 */ {(14<<2)|2,{114,59,0}}, +/* 46064 */ {(14<<2)|2,{114,88,0}}, +/* 46065 */ {(14<<2)|2,{114,88,0}}, +/* 46066 */ {(14<<2)|2,{114,88,0}}, +/* 46067 */ {(14<<2)|2,{114,88,0}}, +/* 46068 */ {(14<<2)|2,{114,90,0}}, +/* 46069 */ {(14<<2)|2,{114,90,0}}, +/* 46070 */ {(14<<2)|2,{114,90,0}}, +/* 46071 */ {(14<<2)|2,{114,90,0}}, +/* 46072 */ {(16<<2)|2,{114,33,0}}, +/* 46073 */ {(16<<2)|2,{114,34,0}}, +/* 46074 */ {(16<<2)|2,{114,40,0}}, +/* 46075 */ {(16<<2)|2,{114,41,0}}, +/* 46076 */ {(16<<2)|2,{114,63,0}}, +/* 46077 */ {(6<<2)|1,{114,0,0}}, +/* 46078 */ {(6<<2)|1,{114,0,0}}, +/* 46079 */ {(6<<2)|1,{114,0,0}}, +/* 46080 */ {(16<<2)|3,{117,48,48}}, +/* 46081 */ {(16<<2)|3,{117,48,49}}, +/* 46082 */ {(16<<2)|3,{117,48,50}}, +/* 46083 */ {(16<<2)|3,{117,48,97}}, +/* 46084 */ {(16<<2)|3,{117,48,99}}, +/* 46085 */ {(16<<2)|3,{117,48,101}}, +/* 46086 */ {(16<<2)|3,{117,48,105}}, +/* 46087 */ {(16<<2)|3,{117,48,111}}, +/* 46088 */ {(16<<2)|3,{117,48,115}}, +/* 46089 */ {(16<<2)|3,{117,48,116}}, +/* 46090 */ {(11<<2)|2,{117,48,0}}, +/* 46091 */ {(11<<2)|2,{117,48,0}}, +/* 46092 */ {(11<<2)|2,{117,48,0}}, +/* 46093 */ {(11<<2)|2,{117,48,0}}, +/* 46094 */ {(11<<2)|2,{117,48,0}}, +/* 46095 */ {(11<<2)|2,{117,48,0}}, +/* 46096 */ {(11<<2)|2,{117,48,0}}, +/* 46097 */ {(11<<2)|2,{117,48,0}}, +/* 46098 */ {(11<<2)|2,{117,48,0}}, +/* 46099 */ {(11<<2)|2,{117,48,0}}, +/* 46100 */ {(11<<2)|2,{117,48,0}}, +/* 46101 */ {(11<<2)|2,{117,48,0}}, +/* 46102 */ {(11<<2)|2,{117,48,0}}, +/* 46103 */ {(11<<2)|2,{117,48,0}}, +/* 46104 */ {(11<<2)|2,{117,48,0}}, +/* 46105 */ {(11<<2)|2,{117,48,0}}, +/* 46106 */ {(11<<2)|2,{117,48,0}}, +/* 46107 */ {(11<<2)|2,{117,48,0}}, +/* 46108 */ {(11<<2)|2,{117,48,0}}, +/* 46109 */ {(11<<2)|2,{117,48,0}}, +/* 46110 */ {(11<<2)|2,{117,48,0}}, +/* 46111 */ {(11<<2)|2,{117,48,0}}, +/* 46112 */ {(16<<2)|3,{117,49,48}}, +/* 46113 */ {(16<<2)|3,{117,49,49}}, +/* 46114 */ {(16<<2)|3,{117,49,50}}, +/* 46115 */ {(16<<2)|3,{117,49,97}}, +/* 46116 */ {(16<<2)|3,{117,49,99}}, +/* 46117 */ {(16<<2)|3,{117,49,101}}, +/* 46118 */ {(16<<2)|3,{117,49,105}}, +/* 46119 */ {(16<<2)|3,{117,49,111}}, +/* 46120 */ {(16<<2)|3,{117,49,115}}, +/* 46121 */ {(16<<2)|3,{117,49,116}}, +/* 46122 */ {(11<<2)|2,{117,49,0}}, +/* 46123 */ {(11<<2)|2,{117,49,0}}, +/* 46124 */ {(11<<2)|2,{117,49,0}}, +/* 46125 */ {(11<<2)|2,{117,49,0}}, +/* 46126 */ {(11<<2)|2,{117,49,0}}, +/* 46127 */ {(11<<2)|2,{117,49,0}}, +/* 46128 */ {(11<<2)|2,{117,49,0}}, +/* 46129 */ {(11<<2)|2,{117,49,0}}, +/* 46130 */ {(11<<2)|2,{117,49,0}}, +/* 46131 */ {(11<<2)|2,{117,49,0}}, +/* 46132 */ {(11<<2)|2,{117,49,0}}, +/* 46133 */ {(11<<2)|2,{117,49,0}}, +/* 46134 */ {(11<<2)|2,{117,49,0}}, +/* 46135 */ {(11<<2)|2,{117,49,0}}, +/* 46136 */ {(11<<2)|2,{117,49,0}}, +/* 46137 */ {(11<<2)|2,{117,49,0}}, +/* 46138 */ {(11<<2)|2,{117,49,0}}, +/* 46139 */ {(11<<2)|2,{117,49,0}}, +/* 46140 */ {(11<<2)|2,{117,49,0}}, +/* 46141 */ {(11<<2)|2,{117,49,0}}, +/* 46142 */ {(11<<2)|2,{117,49,0}}, +/* 46143 */ {(11<<2)|2,{117,49,0}}, +/* 46144 */ {(16<<2)|3,{117,50,48}}, +/* 46145 */ {(16<<2)|3,{117,50,49}}, +/* 46146 */ {(16<<2)|3,{117,50,50}}, +/* 46147 */ {(16<<2)|3,{117,50,97}}, +/* 46148 */ {(16<<2)|3,{117,50,99}}, +/* 46149 */ {(16<<2)|3,{117,50,101}}, +/* 46150 */ {(16<<2)|3,{117,50,105}}, +/* 46151 */ {(16<<2)|3,{117,50,111}}, +/* 46152 */ {(16<<2)|3,{117,50,115}}, +/* 46153 */ {(16<<2)|3,{117,50,116}}, +/* 46154 */ {(11<<2)|2,{117,50,0}}, +/* 46155 */ {(11<<2)|2,{117,50,0}}, +/* 46156 */ {(11<<2)|2,{117,50,0}}, +/* 46157 */ {(11<<2)|2,{117,50,0}}, +/* 46158 */ {(11<<2)|2,{117,50,0}}, +/* 46159 */ {(11<<2)|2,{117,50,0}}, +/* 46160 */ {(11<<2)|2,{117,50,0}}, +/* 46161 */ {(11<<2)|2,{117,50,0}}, +/* 46162 */ {(11<<2)|2,{117,50,0}}, +/* 46163 */ {(11<<2)|2,{117,50,0}}, +/* 46164 */ {(11<<2)|2,{117,50,0}}, +/* 46165 */ {(11<<2)|2,{117,50,0}}, +/* 46166 */ {(11<<2)|2,{117,50,0}}, +/* 46167 */ {(11<<2)|2,{117,50,0}}, +/* 46168 */ {(11<<2)|2,{117,50,0}}, +/* 46169 */ {(11<<2)|2,{117,50,0}}, +/* 46170 */ {(11<<2)|2,{117,50,0}}, +/* 46171 */ {(11<<2)|2,{117,50,0}}, +/* 46172 */ {(11<<2)|2,{117,50,0}}, +/* 46173 */ {(11<<2)|2,{117,50,0}}, +/* 46174 */ {(11<<2)|2,{117,50,0}}, +/* 46175 */ {(11<<2)|2,{117,50,0}}, +/* 46176 */ {(16<<2)|3,{117,97,48}}, +/* 46177 */ {(16<<2)|3,{117,97,49}}, +/* 46178 */ {(16<<2)|3,{117,97,50}}, +/* 46179 */ {(16<<2)|3,{117,97,97}}, +/* 46180 */ {(16<<2)|3,{117,97,99}}, +/* 46181 */ {(16<<2)|3,{117,97,101}}, +/* 46182 */ {(16<<2)|3,{117,97,105}}, +/* 46183 */ {(16<<2)|3,{117,97,111}}, +/* 46184 */ {(16<<2)|3,{117,97,115}}, +/* 46185 */ {(16<<2)|3,{117,97,116}}, +/* 46186 */ {(11<<2)|2,{117,97,0}}, +/* 46187 */ {(11<<2)|2,{117,97,0}}, +/* 46188 */ {(11<<2)|2,{117,97,0}}, +/* 46189 */ {(11<<2)|2,{117,97,0}}, +/* 46190 */ {(11<<2)|2,{117,97,0}}, +/* 46191 */ {(11<<2)|2,{117,97,0}}, +/* 46192 */ {(11<<2)|2,{117,97,0}}, +/* 46193 */ {(11<<2)|2,{117,97,0}}, +/* 46194 */ {(11<<2)|2,{117,97,0}}, +/* 46195 */ {(11<<2)|2,{117,97,0}}, +/* 46196 */ {(11<<2)|2,{117,97,0}}, +/* 46197 */ {(11<<2)|2,{117,97,0}}, +/* 46198 */ {(11<<2)|2,{117,97,0}}, +/* 46199 */ {(11<<2)|2,{117,97,0}}, +/* 46200 */ {(11<<2)|2,{117,97,0}}, +/* 46201 */ {(11<<2)|2,{117,97,0}}, +/* 46202 */ {(11<<2)|2,{117,97,0}}, +/* 46203 */ {(11<<2)|2,{117,97,0}}, +/* 46204 */ {(11<<2)|2,{117,97,0}}, +/* 46205 */ {(11<<2)|2,{117,97,0}}, +/* 46206 */ {(11<<2)|2,{117,97,0}}, +/* 46207 */ {(11<<2)|2,{117,97,0}}, +/* 46208 */ {(16<<2)|3,{117,99,48}}, +/* 46209 */ {(16<<2)|3,{117,99,49}}, +/* 46210 */ {(16<<2)|3,{117,99,50}}, +/* 46211 */ {(16<<2)|3,{117,99,97}}, +/* 46212 */ {(16<<2)|3,{117,99,99}}, +/* 46213 */ {(16<<2)|3,{117,99,101}}, +/* 46214 */ {(16<<2)|3,{117,99,105}}, +/* 46215 */ {(16<<2)|3,{117,99,111}}, +/* 46216 */ {(16<<2)|3,{117,99,115}}, +/* 46217 */ {(16<<2)|3,{117,99,116}}, +/* 46218 */ {(11<<2)|2,{117,99,0}}, +/* 46219 */ {(11<<2)|2,{117,99,0}}, +/* 46220 */ {(11<<2)|2,{117,99,0}}, +/* 46221 */ {(11<<2)|2,{117,99,0}}, +/* 46222 */ {(11<<2)|2,{117,99,0}}, +/* 46223 */ {(11<<2)|2,{117,99,0}}, +/* 46224 */ {(11<<2)|2,{117,99,0}}, +/* 46225 */ {(11<<2)|2,{117,99,0}}, +/* 46226 */ {(11<<2)|2,{117,99,0}}, +/* 46227 */ {(11<<2)|2,{117,99,0}}, +/* 46228 */ {(11<<2)|2,{117,99,0}}, +/* 46229 */ {(11<<2)|2,{117,99,0}}, +/* 46230 */ {(11<<2)|2,{117,99,0}}, +/* 46231 */ {(11<<2)|2,{117,99,0}}, +/* 46232 */ {(11<<2)|2,{117,99,0}}, +/* 46233 */ {(11<<2)|2,{117,99,0}}, +/* 46234 */ {(11<<2)|2,{117,99,0}}, +/* 46235 */ {(11<<2)|2,{117,99,0}}, +/* 46236 */ {(11<<2)|2,{117,99,0}}, +/* 46237 */ {(11<<2)|2,{117,99,0}}, +/* 46238 */ {(11<<2)|2,{117,99,0}}, +/* 46239 */ {(11<<2)|2,{117,99,0}}, +/* 46240 */ {(16<<2)|3,{117,101,48}}, +/* 46241 */ {(16<<2)|3,{117,101,49}}, +/* 46242 */ {(16<<2)|3,{117,101,50}}, +/* 46243 */ {(16<<2)|3,{117,101,97}}, +/* 46244 */ {(16<<2)|3,{117,101,99}}, +/* 46245 */ {(16<<2)|3,{117,101,101}}, +/* 46246 */ {(16<<2)|3,{117,101,105}}, +/* 46247 */ {(16<<2)|3,{117,101,111}}, +/* 46248 */ {(16<<2)|3,{117,101,115}}, +/* 46249 */ {(16<<2)|3,{117,101,116}}, +/* 46250 */ {(11<<2)|2,{117,101,0}}, +/* 46251 */ {(11<<2)|2,{117,101,0}}, +/* 46252 */ {(11<<2)|2,{117,101,0}}, +/* 46253 */ {(11<<2)|2,{117,101,0}}, +/* 46254 */ {(11<<2)|2,{117,101,0}}, +/* 46255 */ {(11<<2)|2,{117,101,0}}, +/* 46256 */ {(11<<2)|2,{117,101,0}}, +/* 46257 */ {(11<<2)|2,{117,101,0}}, +/* 46258 */ {(11<<2)|2,{117,101,0}}, +/* 46259 */ {(11<<2)|2,{117,101,0}}, +/* 46260 */ {(11<<2)|2,{117,101,0}}, +/* 46261 */ {(11<<2)|2,{117,101,0}}, +/* 46262 */ {(11<<2)|2,{117,101,0}}, +/* 46263 */ {(11<<2)|2,{117,101,0}}, +/* 46264 */ {(11<<2)|2,{117,101,0}}, +/* 46265 */ {(11<<2)|2,{117,101,0}}, +/* 46266 */ {(11<<2)|2,{117,101,0}}, +/* 46267 */ {(11<<2)|2,{117,101,0}}, +/* 46268 */ {(11<<2)|2,{117,101,0}}, +/* 46269 */ {(11<<2)|2,{117,101,0}}, +/* 46270 */ {(11<<2)|2,{117,101,0}}, +/* 46271 */ {(11<<2)|2,{117,101,0}}, +/* 46272 */ {(16<<2)|3,{117,105,48}}, +/* 46273 */ {(16<<2)|3,{117,105,49}}, +/* 46274 */ {(16<<2)|3,{117,105,50}}, +/* 46275 */ {(16<<2)|3,{117,105,97}}, +/* 46276 */ {(16<<2)|3,{117,105,99}}, +/* 46277 */ {(16<<2)|3,{117,105,101}}, +/* 46278 */ {(16<<2)|3,{117,105,105}}, +/* 46279 */ {(16<<2)|3,{117,105,111}}, +/* 46280 */ {(16<<2)|3,{117,105,115}}, +/* 46281 */ {(16<<2)|3,{117,105,116}}, +/* 46282 */ {(11<<2)|2,{117,105,0}}, +/* 46283 */ {(11<<2)|2,{117,105,0}}, +/* 46284 */ {(11<<2)|2,{117,105,0}}, +/* 46285 */ {(11<<2)|2,{117,105,0}}, +/* 46286 */ {(11<<2)|2,{117,105,0}}, +/* 46287 */ {(11<<2)|2,{117,105,0}}, +/* 46288 */ {(11<<2)|2,{117,105,0}}, +/* 46289 */ {(11<<2)|2,{117,105,0}}, +/* 46290 */ {(11<<2)|2,{117,105,0}}, +/* 46291 */ {(11<<2)|2,{117,105,0}}, +/* 46292 */ {(11<<2)|2,{117,105,0}}, +/* 46293 */ {(11<<2)|2,{117,105,0}}, +/* 46294 */ {(11<<2)|2,{117,105,0}}, +/* 46295 */ {(11<<2)|2,{117,105,0}}, +/* 46296 */ {(11<<2)|2,{117,105,0}}, +/* 46297 */ {(11<<2)|2,{117,105,0}}, +/* 46298 */ {(11<<2)|2,{117,105,0}}, +/* 46299 */ {(11<<2)|2,{117,105,0}}, +/* 46300 */ {(11<<2)|2,{117,105,0}}, +/* 46301 */ {(11<<2)|2,{117,105,0}}, +/* 46302 */ {(11<<2)|2,{117,105,0}}, +/* 46303 */ {(11<<2)|2,{117,105,0}}, +/* 46304 */ {(16<<2)|3,{117,111,48}}, +/* 46305 */ {(16<<2)|3,{117,111,49}}, +/* 46306 */ {(16<<2)|3,{117,111,50}}, +/* 46307 */ {(16<<2)|3,{117,111,97}}, +/* 46308 */ {(16<<2)|3,{117,111,99}}, +/* 46309 */ {(16<<2)|3,{117,111,101}}, +/* 46310 */ {(16<<2)|3,{117,111,105}}, +/* 46311 */ {(16<<2)|3,{117,111,111}}, +/* 46312 */ {(16<<2)|3,{117,111,115}}, +/* 46313 */ {(16<<2)|3,{117,111,116}}, +/* 46314 */ {(11<<2)|2,{117,111,0}}, +/* 46315 */ {(11<<2)|2,{117,111,0}}, +/* 46316 */ {(11<<2)|2,{117,111,0}}, +/* 46317 */ {(11<<2)|2,{117,111,0}}, +/* 46318 */ {(11<<2)|2,{117,111,0}}, +/* 46319 */ {(11<<2)|2,{117,111,0}}, +/* 46320 */ {(11<<2)|2,{117,111,0}}, +/* 46321 */ {(11<<2)|2,{117,111,0}}, +/* 46322 */ {(11<<2)|2,{117,111,0}}, +/* 46323 */ {(11<<2)|2,{117,111,0}}, +/* 46324 */ {(11<<2)|2,{117,111,0}}, +/* 46325 */ {(11<<2)|2,{117,111,0}}, +/* 46326 */ {(11<<2)|2,{117,111,0}}, +/* 46327 */ {(11<<2)|2,{117,111,0}}, +/* 46328 */ {(11<<2)|2,{117,111,0}}, +/* 46329 */ {(11<<2)|2,{117,111,0}}, +/* 46330 */ {(11<<2)|2,{117,111,0}}, +/* 46331 */ {(11<<2)|2,{117,111,0}}, +/* 46332 */ {(11<<2)|2,{117,111,0}}, +/* 46333 */ {(11<<2)|2,{117,111,0}}, +/* 46334 */ {(11<<2)|2,{117,111,0}}, +/* 46335 */ {(11<<2)|2,{117,111,0}}, +/* 46336 */ {(16<<2)|3,{117,115,48}}, +/* 46337 */ {(16<<2)|3,{117,115,49}}, +/* 46338 */ {(16<<2)|3,{117,115,50}}, +/* 46339 */ {(16<<2)|3,{117,115,97}}, +/* 46340 */ {(16<<2)|3,{117,115,99}}, +/* 46341 */ {(16<<2)|3,{117,115,101}}, +/* 46342 */ {(16<<2)|3,{117,115,105}}, +/* 46343 */ {(16<<2)|3,{117,115,111}}, +/* 46344 */ {(16<<2)|3,{117,115,115}}, +/* 46345 */ {(16<<2)|3,{117,115,116}}, +/* 46346 */ {(11<<2)|2,{117,115,0}}, +/* 46347 */ {(11<<2)|2,{117,115,0}}, +/* 46348 */ {(11<<2)|2,{117,115,0}}, +/* 46349 */ {(11<<2)|2,{117,115,0}}, +/* 46350 */ {(11<<2)|2,{117,115,0}}, +/* 46351 */ {(11<<2)|2,{117,115,0}}, +/* 46352 */ {(11<<2)|2,{117,115,0}}, +/* 46353 */ {(11<<2)|2,{117,115,0}}, +/* 46354 */ {(11<<2)|2,{117,115,0}}, +/* 46355 */ {(11<<2)|2,{117,115,0}}, +/* 46356 */ {(11<<2)|2,{117,115,0}}, +/* 46357 */ {(11<<2)|2,{117,115,0}}, +/* 46358 */ {(11<<2)|2,{117,115,0}}, +/* 46359 */ {(11<<2)|2,{117,115,0}}, +/* 46360 */ {(11<<2)|2,{117,115,0}}, +/* 46361 */ {(11<<2)|2,{117,115,0}}, +/* 46362 */ {(11<<2)|2,{117,115,0}}, +/* 46363 */ {(11<<2)|2,{117,115,0}}, +/* 46364 */ {(11<<2)|2,{117,115,0}}, +/* 46365 */ {(11<<2)|2,{117,115,0}}, +/* 46366 */ {(11<<2)|2,{117,115,0}}, +/* 46367 */ {(11<<2)|2,{117,115,0}}, +/* 46368 */ {(16<<2)|3,{117,116,48}}, +/* 46369 */ {(16<<2)|3,{117,116,49}}, +/* 46370 */ {(16<<2)|3,{117,116,50}}, +/* 46371 */ {(16<<2)|3,{117,116,97}}, +/* 46372 */ {(16<<2)|3,{117,116,99}}, +/* 46373 */ {(16<<2)|3,{117,116,101}}, +/* 46374 */ {(16<<2)|3,{117,116,105}}, +/* 46375 */ {(16<<2)|3,{117,116,111}}, +/* 46376 */ {(16<<2)|3,{117,116,115}}, +/* 46377 */ {(16<<2)|3,{117,116,116}}, +/* 46378 */ {(11<<2)|2,{117,116,0}}, +/* 46379 */ {(11<<2)|2,{117,116,0}}, +/* 46380 */ {(11<<2)|2,{117,116,0}}, +/* 46381 */ {(11<<2)|2,{117,116,0}}, +/* 46382 */ {(11<<2)|2,{117,116,0}}, +/* 46383 */ {(11<<2)|2,{117,116,0}}, +/* 46384 */ {(11<<2)|2,{117,116,0}}, +/* 46385 */ {(11<<2)|2,{117,116,0}}, +/* 46386 */ {(11<<2)|2,{117,116,0}}, +/* 46387 */ {(11<<2)|2,{117,116,0}}, +/* 46388 */ {(11<<2)|2,{117,116,0}}, +/* 46389 */ {(11<<2)|2,{117,116,0}}, +/* 46390 */ {(11<<2)|2,{117,116,0}}, +/* 46391 */ {(11<<2)|2,{117,116,0}}, +/* 46392 */ {(11<<2)|2,{117,116,0}}, +/* 46393 */ {(11<<2)|2,{117,116,0}}, +/* 46394 */ {(11<<2)|2,{117,116,0}}, +/* 46395 */ {(11<<2)|2,{117,116,0}}, +/* 46396 */ {(11<<2)|2,{117,116,0}}, +/* 46397 */ {(11<<2)|2,{117,116,0}}, +/* 46398 */ {(11<<2)|2,{117,116,0}}, +/* 46399 */ {(11<<2)|2,{117,116,0}}, +/* 46400 */ {(12<<2)|2,{117,32,0}}, +/* 46401 */ {(12<<2)|2,{117,32,0}}, +/* 46402 */ {(12<<2)|2,{117,32,0}}, +/* 46403 */ {(12<<2)|2,{117,32,0}}, +/* 46404 */ {(12<<2)|2,{117,32,0}}, +/* 46405 */ {(12<<2)|2,{117,32,0}}, +/* 46406 */ {(12<<2)|2,{117,32,0}}, +/* 46407 */ {(12<<2)|2,{117,32,0}}, +/* 46408 */ {(12<<2)|2,{117,32,0}}, +/* 46409 */ {(12<<2)|2,{117,32,0}}, +/* 46410 */ {(12<<2)|2,{117,32,0}}, +/* 46411 */ {(12<<2)|2,{117,32,0}}, +/* 46412 */ {(12<<2)|2,{117,32,0}}, +/* 46413 */ {(12<<2)|2,{117,32,0}}, +/* 46414 */ {(12<<2)|2,{117,32,0}}, +/* 46415 */ {(12<<2)|2,{117,32,0}}, +/* 46416 */ {(12<<2)|2,{117,37,0}}, +/* 46417 */ {(12<<2)|2,{117,37,0}}, +/* 46418 */ {(12<<2)|2,{117,37,0}}, +/* 46419 */ {(12<<2)|2,{117,37,0}}, +/* 46420 */ {(12<<2)|2,{117,37,0}}, +/* 46421 */ {(12<<2)|2,{117,37,0}}, +/* 46422 */ {(12<<2)|2,{117,37,0}}, +/* 46423 */ {(12<<2)|2,{117,37,0}}, +/* 46424 */ {(12<<2)|2,{117,37,0}}, +/* 46425 */ {(12<<2)|2,{117,37,0}}, +/* 46426 */ {(12<<2)|2,{117,37,0}}, +/* 46427 */ {(12<<2)|2,{117,37,0}}, +/* 46428 */ {(12<<2)|2,{117,37,0}}, +/* 46429 */ {(12<<2)|2,{117,37,0}}, +/* 46430 */ {(12<<2)|2,{117,37,0}}, +/* 46431 */ {(12<<2)|2,{117,37,0}}, +/* 46432 */ {(12<<2)|2,{117,45,0}}, +/* 46433 */ {(12<<2)|2,{117,45,0}}, +/* 46434 */ {(12<<2)|2,{117,45,0}}, +/* 46435 */ {(12<<2)|2,{117,45,0}}, +/* 46436 */ {(12<<2)|2,{117,45,0}}, +/* 46437 */ {(12<<2)|2,{117,45,0}}, +/* 46438 */ {(12<<2)|2,{117,45,0}}, +/* 46439 */ {(12<<2)|2,{117,45,0}}, +/* 46440 */ {(12<<2)|2,{117,45,0}}, +/* 46441 */ {(12<<2)|2,{117,45,0}}, +/* 46442 */ {(12<<2)|2,{117,45,0}}, +/* 46443 */ {(12<<2)|2,{117,45,0}}, +/* 46444 */ {(12<<2)|2,{117,45,0}}, +/* 46445 */ {(12<<2)|2,{117,45,0}}, +/* 46446 */ {(12<<2)|2,{117,45,0}}, +/* 46447 */ {(12<<2)|2,{117,45,0}}, +/* 46448 */ {(12<<2)|2,{117,46,0}}, +/* 46449 */ {(12<<2)|2,{117,46,0}}, +/* 46450 */ {(12<<2)|2,{117,46,0}}, +/* 46451 */ {(12<<2)|2,{117,46,0}}, +/* 46452 */ {(12<<2)|2,{117,46,0}}, +/* 46453 */ {(12<<2)|2,{117,46,0}}, +/* 46454 */ {(12<<2)|2,{117,46,0}}, +/* 46455 */ {(12<<2)|2,{117,46,0}}, +/* 46456 */ {(12<<2)|2,{117,46,0}}, +/* 46457 */ {(12<<2)|2,{117,46,0}}, +/* 46458 */ {(12<<2)|2,{117,46,0}}, +/* 46459 */ {(12<<2)|2,{117,46,0}}, +/* 46460 */ {(12<<2)|2,{117,46,0}}, +/* 46461 */ {(12<<2)|2,{117,46,0}}, +/* 46462 */ {(12<<2)|2,{117,46,0}}, +/* 46463 */ {(12<<2)|2,{117,46,0}}, +/* 46464 */ {(12<<2)|2,{117,47,0}}, +/* 46465 */ {(12<<2)|2,{117,47,0}}, +/* 46466 */ {(12<<2)|2,{117,47,0}}, +/* 46467 */ {(12<<2)|2,{117,47,0}}, +/* 46468 */ {(12<<2)|2,{117,47,0}}, +/* 46469 */ {(12<<2)|2,{117,47,0}}, +/* 46470 */ {(12<<2)|2,{117,47,0}}, +/* 46471 */ {(12<<2)|2,{117,47,0}}, +/* 46472 */ {(12<<2)|2,{117,47,0}}, +/* 46473 */ {(12<<2)|2,{117,47,0}}, +/* 46474 */ {(12<<2)|2,{117,47,0}}, +/* 46475 */ {(12<<2)|2,{117,47,0}}, +/* 46476 */ {(12<<2)|2,{117,47,0}}, +/* 46477 */ {(12<<2)|2,{117,47,0}}, +/* 46478 */ {(12<<2)|2,{117,47,0}}, +/* 46479 */ {(12<<2)|2,{117,47,0}}, +/* 46480 */ {(12<<2)|2,{117,51,0}}, +/* 46481 */ {(12<<2)|2,{117,51,0}}, +/* 46482 */ {(12<<2)|2,{117,51,0}}, +/* 46483 */ {(12<<2)|2,{117,51,0}}, +/* 46484 */ {(12<<2)|2,{117,51,0}}, +/* 46485 */ {(12<<2)|2,{117,51,0}}, +/* 46486 */ {(12<<2)|2,{117,51,0}}, +/* 46487 */ {(12<<2)|2,{117,51,0}}, +/* 46488 */ {(12<<2)|2,{117,51,0}}, +/* 46489 */ {(12<<2)|2,{117,51,0}}, +/* 46490 */ {(12<<2)|2,{117,51,0}}, +/* 46491 */ {(12<<2)|2,{117,51,0}}, +/* 46492 */ {(12<<2)|2,{117,51,0}}, +/* 46493 */ {(12<<2)|2,{117,51,0}}, +/* 46494 */ {(12<<2)|2,{117,51,0}}, +/* 46495 */ {(12<<2)|2,{117,51,0}}, +/* 46496 */ {(12<<2)|2,{117,52,0}}, +/* 46497 */ {(12<<2)|2,{117,52,0}}, +/* 46498 */ {(12<<2)|2,{117,52,0}}, +/* 46499 */ {(12<<2)|2,{117,52,0}}, +/* 46500 */ {(12<<2)|2,{117,52,0}}, +/* 46501 */ {(12<<2)|2,{117,52,0}}, +/* 46502 */ {(12<<2)|2,{117,52,0}}, +/* 46503 */ {(12<<2)|2,{117,52,0}}, +/* 46504 */ {(12<<2)|2,{117,52,0}}, +/* 46505 */ {(12<<2)|2,{117,52,0}}, +/* 46506 */ {(12<<2)|2,{117,52,0}}, +/* 46507 */ {(12<<2)|2,{117,52,0}}, +/* 46508 */ {(12<<2)|2,{117,52,0}}, +/* 46509 */ {(12<<2)|2,{117,52,0}}, +/* 46510 */ {(12<<2)|2,{117,52,0}}, +/* 46511 */ {(12<<2)|2,{117,52,0}}, +/* 46512 */ {(12<<2)|2,{117,53,0}}, +/* 46513 */ {(12<<2)|2,{117,53,0}}, +/* 46514 */ {(12<<2)|2,{117,53,0}}, +/* 46515 */ {(12<<2)|2,{117,53,0}}, +/* 46516 */ {(12<<2)|2,{117,53,0}}, +/* 46517 */ {(12<<2)|2,{117,53,0}}, +/* 46518 */ {(12<<2)|2,{117,53,0}}, +/* 46519 */ {(12<<2)|2,{117,53,0}}, +/* 46520 */ {(12<<2)|2,{117,53,0}}, +/* 46521 */ {(12<<2)|2,{117,53,0}}, +/* 46522 */ {(12<<2)|2,{117,53,0}}, +/* 46523 */ {(12<<2)|2,{117,53,0}}, +/* 46524 */ {(12<<2)|2,{117,53,0}}, +/* 46525 */ {(12<<2)|2,{117,53,0}}, +/* 46526 */ {(12<<2)|2,{117,53,0}}, +/* 46527 */ {(12<<2)|2,{117,53,0}}, +/* 46528 */ {(12<<2)|2,{117,54,0}}, +/* 46529 */ {(12<<2)|2,{117,54,0}}, +/* 46530 */ {(12<<2)|2,{117,54,0}}, +/* 46531 */ {(12<<2)|2,{117,54,0}}, +/* 46532 */ {(12<<2)|2,{117,54,0}}, +/* 46533 */ {(12<<2)|2,{117,54,0}}, +/* 46534 */ {(12<<2)|2,{117,54,0}}, +/* 46535 */ {(12<<2)|2,{117,54,0}}, +/* 46536 */ {(12<<2)|2,{117,54,0}}, +/* 46537 */ {(12<<2)|2,{117,54,0}}, +/* 46538 */ {(12<<2)|2,{117,54,0}}, +/* 46539 */ {(12<<2)|2,{117,54,0}}, +/* 46540 */ {(12<<2)|2,{117,54,0}}, +/* 46541 */ {(12<<2)|2,{117,54,0}}, +/* 46542 */ {(12<<2)|2,{117,54,0}}, +/* 46543 */ {(12<<2)|2,{117,54,0}}, +/* 46544 */ {(12<<2)|2,{117,55,0}}, +/* 46545 */ {(12<<2)|2,{117,55,0}}, +/* 46546 */ {(12<<2)|2,{117,55,0}}, +/* 46547 */ {(12<<2)|2,{117,55,0}}, +/* 46548 */ {(12<<2)|2,{117,55,0}}, +/* 46549 */ {(12<<2)|2,{117,55,0}}, +/* 46550 */ {(12<<2)|2,{117,55,0}}, +/* 46551 */ {(12<<2)|2,{117,55,0}}, +/* 46552 */ {(12<<2)|2,{117,55,0}}, +/* 46553 */ {(12<<2)|2,{117,55,0}}, +/* 46554 */ {(12<<2)|2,{117,55,0}}, +/* 46555 */ {(12<<2)|2,{117,55,0}}, +/* 46556 */ {(12<<2)|2,{117,55,0}}, +/* 46557 */ {(12<<2)|2,{117,55,0}}, +/* 46558 */ {(12<<2)|2,{117,55,0}}, +/* 46559 */ {(12<<2)|2,{117,55,0}}, +/* 46560 */ {(12<<2)|2,{117,56,0}}, +/* 46561 */ {(12<<2)|2,{117,56,0}}, +/* 46562 */ {(12<<2)|2,{117,56,0}}, +/* 46563 */ {(12<<2)|2,{117,56,0}}, +/* 46564 */ {(12<<2)|2,{117,56,0}}, +/* 46565 */ {(12<<2)|2,{117,56,0}}, +/* 46566 */ {(12<<2)|2,{117,56,0}}, +/* 46567 */ {(12<<2)|2,{117,56,0}}, +/* 46568 */ {(12<<2)|2,{117,56,0}}, +/* 46569 */ {(12<<2)|2,{117,56,0}}, +/* 46570 */ {(12<<2)|2,{117,56,0}}, +/* 46571 */ {(12<<2)|2,{117,56,0}}, +/* 46572 */ {(12<<2)|2,{117,56,0}}, +/* 46573 */ {(12<<2)|2,{117,56,0}}, +/* 46574 */ {(12<<2)|2,{117,56,0}}, +/* 46575 */ {(12<<2)|2,{117,56,0}}, +/* 46576 */ {(12<<2)|2,{117,57,0}}, +/* 46577 */ {(12<<2)|2,{117,57,0}}, +/* 46578 */ {(12<<2)|2,{117,57,0}}, +/* 46579 */ {(12<<2)|2,{117,57,0}}, +/* 46580 */ {(12<<2)|2,{117,57,0}}, +/* 46581 */ {(12<<2)|2,{117,57,0}}, +/* 46582 */ {(12<<2)|2,{117,57,0}}, +/* 46583 */ {(12<<2)|2,{117,57,0}}, +/* 46584 */ {(12<<2)|2,{117,57,0}}, +/* 46585 */ {(12<<2)|2,{117,57,0}}, +/* 46586 */ {(12<<2)|2,{117,57,0}}, +/* 46587 */ {(12<<2)|2,{117,57,0}}, +/* 46588 */ {(12<<2)|2,{117,57,0}}, +/* 46589 */ {(12<<2)|2,{117,57,0}}, +/* 46590 */ {(12<<2)|2,{117,57,0}}, +/* 46591 */ {(12<<2)|2,{117,57,0}}, +/* 46592 */ {(12<<2)|2,{117,61,0}}, +/* 46593 */ {(12<<2)|2,{117,61,0}}, +/* 46594 */ {(12<<2)|2,{117,61,0}}, +/* 46595 */ {(12<<2)|2,{117,61,0}}, +/* 46596 */ {(12<<2)|2,{117,61,0}}, +/* 46597 */ {(12<<2)|2,{117,61,0}}, +/* 46598 */ {(12<<2)|2,{117,61,0}}, +/* 46599 */ {(12<<2)|2,{117,61,0}}, +/* 46600 */ {(12<<2)|2,{117,61,0}}, +/* 46601 */ {(12<<2)|2,{117,61,0}}, +/* 46602 */ {(12<<2)|2,{117,61,0}}, +/* 46603 */ {(12<<2)|2,{117,61,0}}, +/* 46604 */ {(12<<2)|2,{117,61,0}}, +/* 46605 */ {(12<<2)|2,{117,61,0}}, +/* 46606 */ {(12<<2)|2,{117,61,0}}, +/* 46607 */ {(12<<2)|2,{117,61,0}}, +/* 46608 */ {(12<<2)|2,{117,65,0}}, +/* 46609 */ {(12<<2)|2,{117,65,0}}, +/* 46610 */ {(12<<2)|2,{117,65,0}}, +/* 46611 */ {(12<<2)|2,{117,65,0}}, +/* 46612 */ {(12<<2)|2,{117,65,0}}, +/* 46613 */ {(12<<2)|2,{117,65,0}}, +/* 46614 */ {(12<<2)|2,{117,65,0}}, +/* 46615 */ {(12<<2)|2,{117,65,0}}, +/* 46616 */ {(12<<2)|2,{117,65,0}}, +/* 46617 */ {(12<<2)|2,{117,65,0}}, +/* 46618 */ {(12<<2)|2,{117,65,0}}, +/* 46619 */ {(12<<2)|2,{117,65,0}}, +/* 46620 */ {(12<<2)|2,{117,65,0}}, +/* 46621 */ {(12<<2)|2,{117,65,0}}, +/* 46622 */ {(12<<2)|2,{117,65,0}}, +/* 46623 */ {(12<<2)|2,{117,65,0}}, +/* 46624 */ {(12<<2)|2,{117,95,0}}, +/* 46625 */ {(12<<2)|2,{117,95,0}}, +/* 46626 */ {(12<<2)|2,{117,95,0}}, +/* 46627 */ {(12<<2)|2,{117,95,0}}, +/* 46628 */ {(12<<2)|2,{117,95,0}}, +/* 46629 */ {(12<<2)|2,{117,95,0}}, +/* 46630 */ {(12<<2)|2,{117,95,0}}, +/* 46631 */ {(12<<2)|2,{117,95,0}}, +/* 46632 */ {(12<<2)|2,{117,95,0}}, +/* 46633 */ {(12<<2)|2,{117,95,0}}, +/* 46634 */ {(12<<2)|2,{117,95,0}}, +/* 46635 */ {(12<<2)|2,{117,95,0}}, +/* 46636 */ {(12<<2)|2,{117,95,0}}, +/* 46637 */ {(12<<2)|2,{117,95,0}}, +/* 46638 */ {(12<<2)|2,{117,95,0}}, +/* 46639 */ {(12<<2)|2,{117,95,0}}, +/* 46640 */ {(12<<2)|2,{117,98,0}}, +/* 46641 */ {(12<<2)|2,{117,98,0}}, +/* 46642 */ {(12<<2)|2,{117,98,0}}, +/* 46643 */ {(12<<2)|2,{117,98,0}}, +/* 46644 */ {(12<<2)|2,{117,98,0}}, +/* 46645 */ {(12<<2)|2,{117,98,0}}, +/* 46646 */ {(12<<2)|2,{117,98,0}}, +/* 46647 */ {(12<<2)|2,{117,98,0}}, +/* 46648 */ {(12<<2)|2,{117,98,0}}, +/* 46649 */ {(12<<2)|2,{117,98,0}}, +/* 46650 */ {(12<<2)|2,{117,98,0}}, +/* 46651 */ {(12<<2)|2,{117,98,0}}, +/* 46652 */ {(12<<2)|2,{117,98,0}}, +/* 46653 */ {(12<<2)|2,{117,98,0}}, +/* 46654 */ {(12<<2)|2,{117,98,0}}, +/* 46655 */ {(12<<2)|2,{117,98,0}}, +/* 46656 */ {(12<<2)|2,{117,100,0}}, +/* 46657 */ {(12<<2)|2,{117,100,0}}, +/* 46658 */ {(12<<2)|2,{117,100,0}}, +/* 46659 */ {(12<<2)|2,{117,100,0}}, +/* 46660 */ {(12<<2)|2,{117,100,0}}, +/* 46661 */ {(12<<2)|2,{117,100,0}}, +/* 46662 */ {(12<<2)|2,{117,100,0}}, +/* 46663 */ {(12<<2)|2,{117,100,0}}, +/* 46664 */ {(12<<2)|2,{117,100,0}}, +/* 46665 */ {(12<<2)|2,{117,100,0}}, +/* 46666 */ {(12<<2)|2,{117,100,0}}, +/* 46667 */ {(12<<2)|2,{117,100,0}}, +/* 46668 */ {(12<<2)|2,{117,100,0}}, +/* 46669 */ {(12<<2)|2,{117,100,0}}, +/* 46670 */ {(12<<2)|2,{117,100,0}}, +/* 46671 */ {(12<<2)|2,{117,100,0}}, +/* 46672 */ {(12<<2)|2,{117,102,0}}, +/* 46673 */ {(12<<2)|2,{117,102,0}}, +/* 46674 */ {(12<<2)|2,{117,102,0}}, +/* 46675 */ {(12<<2)|2,{117,102,0}}, +/* 46676 */ {(12<<2)|2,{117,102,0}}, +/* 46677 */ {(12<<2)|2,{117,102,0}}, +/* 46678 */ {(12<<2)|2,{117,102,0}}, +/* 46679 */ {(12<<2)|2,{117,102,0}}, +/* 46680 */ {(12<<2)|2,{117,102,0}}, +/* 46681 */ {(12<<2)|2,{117,102,0}}, +/* 46682 */ {(12<<2)|2,{117,102,0}}, +/* 46683 */ {(12<<2)|2,{117,102,0}}, +/* 46684 */ {(12<<2)|2,{117,102,0}}, +/* 46685 */ {(12<<2)|2,{117,102,0}}, +/* 46686 */ {(12<<2)|2,{117,102,0}}, +/* 46687 */ {(12<<2)|2,{117,102,0}}, +/* 46688 */ {(12<<2)|2,{117,103,0}}, +/* 46689 */ {(12<<2)|2,{117,103,0}}, +/* 46690 */ {(12<<2)|2,{117,103,0}}, +/* 46691 */ {(12<<2)|2,{117,103,0}}, +/* 46692 */ {(12<<2)|2,{117,103,0}}, +/* 46693 */ {(12<<2)|2,{117,103,0}}, +/* 46694 */ {(12<<2)|2,{117,103,0}}, +/* 46695 */ {(12<<2)|2,{117,103,0}}, +/* 46696 */ {(12<<2)|2,{117,103,0}}, +/* 46697 */ {(12<<2)|2,{117,103,0}}, +/* 46698 */ {(12<<2)|2,{117,103,0}}, +/* 46699 */ {(12<<2)|2,{117,103,0}}, +/* 46700 */ {(12<<2)|2,{117,103,0}}, +/* 46701 */ {(12<<2)|2,{117,103,0}}, +/* 46702 */ {(12<<2)|2,{117,103,0}}, +/* 46703 */ {(12<<2)|2,{117,103,0}}, +/* 46704 */ {(12<<2)|2,{117,104,0}}, +/* 46705 */ {(12<<2)|2,{117,104,0}}, +/* 46706 */ {(12<<2)|2,{117,104,0}}, +/* 46707 */ {(12<<2)|2,{117,104,0}}, +/* 46708 */ {(12<<2)|2,{117,104,0}}, +/* 46709 */ {(12<<2)|2,{117,104,0}}, +/* 46710 */ {(12<<2)|2,{117,104,0}}, +/* 46711 */ {(12<<2)|2,{117,104,0}}, +/* 46712 */ {(12<<2)|2,{117,104,0}}, +/* 46713 */ {(12<<2)|2,{117,104,0}}, +/* 46714 */ {(12<<2)|2,{117,104,0}}, +/* 46715 */ {(12<<2)|2,{117,104,0}}, +/* 46716 */ {(12<<2)|2,{117,104,0}}, +/* 46717 */ {(12<<2)|2,{117,104,0}}, +/* 46718 */ {(12<<2)|2,{117,104,0}}, +/* 46719 */ {(12<<2)|2,{117,104,0}}, +/* 46720 */ {(12<<2)|2,{117,108,0}}, +/* 46721 */ {(12<<2)|2,{117,108,0}}, +/* 46722 */ {(12<<2)|2,{117,108,0}}, +/* 46723 */ {(12<<2)|2,{117,108,0}}, +/* 46724 */ {(12<<2)|2,{117,108,0}}, +/* 46725 */ {(12<<2)|2,{117,108,0}}, +/* 46726 */ {(12<<2)|2,{117,108,0}}, +/* 46727 */ {(12<<2)|2,{117,108,0}}, +/* 46728 */ {(12<<2)|2,{117,108,0}}, +/* 46729 */ {(12<<2)|2,{117,108,0}}, +/* 46730 */ {(12<<2)|2,{117,108,0}}, +/* 46731 */ {(12<<2)|2,{117,108,0}}, +/* 46732 */ {(12<<2)|2,{117,108,0}}, +/* 46733 */ {(12<<2)|2,{117,108,0}}, +/* 46734 */ {(12<<2)|2,{117,108,0}}, +/* 46735 */ {(12<<2)|2,{117,108,0}}, +/* 46736 */ {(12<<2)|2,{117,109,0}}, +/* 46737 */ {(12<<2)|2,{117,109,0}}, +/* 46738 */ {(12<<2)|2,{117,109,0}}, +/* 46739 */ {(12<<2)|2,{117,109,0}}, +/* 46740 */ {(12<<2)|2,{117,109,0}}, +/* 46741 */ {(12<<2)|2,{117,109,0}}, +/* 46742 */ {(12<<2)|2,{117,109,0}}, +/* 46743 */ {(12<<2)|2,{117,109,0}}, +/* 46744 */ {(12<<2)|2,{117,109,0}}, +/* 46745 */ {(12<<2)|2,{117,109,0}}, +/* 46746 */ {(12<<2)|2,{117,109,0}}, +/* 46747 */ {(12<<2)|2,{117,109,0}}, +/* 46748 */ {(12<<2)|2,{117,109,0}}, +/* 46749 */ {(12<<2)|2,{117,109,0}}, +/* 46750 */ {(12<<2)|2,{117,109,0}}, +/* 46751 */ {(12<<2)|2,{117,109,0}}, +/* 46752 */ {(12<<2)|2,{117,110,0}}, +/* 46753 */ {(12<<2)|2,{117,110,0}}, +/* 46754 */ {(12<<2)|2,{117,110,0}}, +/* 46755 */ {(12<<2)|2,{117,110,0}}, +/* 46756 */ {(12<<2)|2,{117,110,0}}, +/* 46757 */ {(12<<2)|2,{117,110,0}}, +/* 46758 */ {(12<<2)|2,{117,110,0}}, +/* 46759 */ {(12<<2)|2,{117,110,0}}, +/* 46760 */ {(12<<2)|2,{117,110,0}}, +/* 46761 */ {(12<<2)|2,{117,110,0}}, +/* 46762 */ {(12<<2)|2,{117,110,0}}, +/* 46763 */ {(12<<2)|2,{117,110,0}}, +/* 46764 */ {(12<<2)|2,{117,110,0}}, +/* 46765 */ {(12<<2)|2,{117,110,0}}, +/* 46766 */ {(12<<2)|2,{117,110,0}}, +/* 46767 */ {(12<<2)|2,{117,110,0}}, +/* 46768 */ {(12<<2)|2,{117,112,0}}, +/* 46769 */ {(12<<2)|2,{117,112,0}}, +/* 46770 */ {(12<<2)|2,{117,112,0}}, +/* 46771 */ {(12<<2)|2,{117,112,0}}, +/* 46772 */ {(12<<2)|2,{117,112,0}}, +/* 46773 */ {(12<<2)|2,{117,112,0}}, +/* 46774 */ {(12<<2)|2,{117,112,0}}, +/* 46775 */ {(12<<2)|2,{117,112,0}}, +/* 46776 */ {(12<<2)|2,{117,112,0}}, +/* 46777 */ {(12<<2)|2,{117,112,0}}, +/* 46778 */ {(12<<2)|2,{117,112,0}}, +/* 46779 */ {(12<<2)|2,{117,112,0}}, +/* 46780 */ {(12<<2)|2,{117,112,0}}, +/* 46781 */ {(12<<2)|2,{117,112,0}}, +/* 46782 */ {(12<<2)|2,{117,112,0}}, +/* 46783 */ {(12<<2)|2,{117,112,0}}, +/* 46784 */ {(12<<2)|2,{117,114,0}}, +/* 46785 */ {(12<<2)|2,{117,114,0}}, +/* 46786 */ {(12<<2)|2,{117,114,0}}, +/* 46787 */ {(12<<2)|2,{117,114,0}}, +/* 46788 */ {(12<<2)|2,{117,114,0}}, +/* 46789 */ {(12<<2)|2,{117,114,0}}, +/* 46790 */ {(12<<2)|2,{117,114,0}}, +/* 46791 */ {(12<<2)|2,{117,114,0}}, +/* 46792 */ {(12<<2)|2,{117,114,0}}, +/* 46793 */ {(12<<2)|2,{117,114,0}}, +/* 46794 */ {(12<<2)|2,{117,114,0}}, +/* 46795 */ {(12<<2)|2,{117,114,0}}, +/* 46796 */ {(12<<2)|2,{117,114,0}}, +/* 46797 */ {(12<<2)|2,{117,114,0}}, +/* 46798 */ {(12<<2)|2,{117,114,0}}, +/* 46799 */ {(12<<2)|2,{117,114,0}}, +/* 46800 */ {(12<<2)|2,{117,117,0}}, +/* 46801 */ {(12<<2)|2,{117,117,0}}, +/* 46802 */ {(12<<2)|2,{117,117,0}}, +/* 46803 */ {(12<<2)|2,{117,117,0}}, +/* 46804 */ {(12<<2)|2,{117,117,0}}, +/* 46805 */ {(12<<2)|2,{117,117,0}}, +/* 46806 */ {(12<<2)|2,{117,117,0}}, +/* 46807 */ {(12<<2)|2,{117,117,0}}, +/* 46808 */ {(12<<2)|2,{117,117,0}}, +/* 46809 */ {(12<<2)|2,{117,117,0}}, +/* 46810 */ {(12<<2)|2,{117,117,0}}, +/* 46811 */ {(12<<2)|2,{117,117,0}}, +/* 46812 */ {(12<<2)|2,{117,117,0}}, +/* 46813 */ {(12<<2)|2,{117,117,0}}, +/* 46814 */ {(12<<2)|2,{117,117,0}}, +/* 46815 */ {(12<<2)|2,{117,117,0}}, +/* 46816 */ {(13<<2)|2,{117,58,0}}, +/* 46817 */ {(13<<2)|2,{117,58,0}}, +/* 46818 */ {(13<<2)|2,{117,58,0}}, +/* 46819 */ {(13<<2)|2,{117,58,0}}, +/* 46820 */ {(13<<2)|2,{117,58,0}}, +/* 46821 */ {(13<<2)|2,{117,58,0}}, +/* 46822 */ {(13<<2)|2,{117,58,0}}, +/* 46823 */ {(13<<2)|2,{117,58,0}}, +/* 46824 */ {(13<<2)|2,{117,66,0}}, +/* 46825 */ {(13<<2)|2,{117,66,0}}, +/* 46826 */ {(13<<2)|2,{117,66,0}}, +/* 46827 */ {(13<<2)|2,{117,66,0}}, +/* 46828 */ {(13<<2)|2,{117,66,0}}, +/* 46829 */ {(13<<2)|2,{117,66,0}}, +/* 46830 */ {(13<<2)|2,{117,66,0}}, +/* 46831 */ {(13<<2)|2,{117,66,0}}, +/* 46832 */ {(13<<2)|2,{117,67,0}}, +/* 46833 */ {(13<<2)|2,{117,67,0}}, +/* 46834 */ {(13<<2)|2,{117,67,0}}, +/* 46835 */ {(13<<2)|2,{117,67,0}}, +/* 46836 */ {(13<<2)|2,{117,67,0}}, +/* 46837 */ {(13<<2)|2,{117,67,0}}, +/* 46838 */ {(13<<2)|2,{117,67,0}}, +/* 46839 */ {(13<<2)|2,{117,67,0}}, +/* 46840 */ {(13<<2)|2,{117,68,0}}, +/* 46841 */ {(13<<2)|2,{117,68,0}}, +/* 46842 */ {(13<<2)|2,{117,68,0}}, +/* 46843 */ {(13<<2)|2,{117,68,0}}, +/* 46844 */ {(13<<2)|2,{117,68,0}}, +/* 46845 */ {(13<<2)|2,{117,68,0}}, +/* 46846 */ {(13<<2)|2,{117,68,0}}, +/* 46847 */ {(13<<2)|2,{117,68,0}}, +/* 46848 */ {(13<<2)|2,{117,69,0}}, +/* 46849 */ {(13<<2)|2,{117,69,0}}, +/* 46850 */ {(13<<2)|2,{117,69,0}}, +/* 46851 */ {(13<<2)|2,{117,69,0}}, +/* 46852 */ {(13<<2)|2,{117,69,0}}, +/* 46853 */ {(13<<2)|2,{117,69,0}}, +/* 46854 */ {(13<<2)|2,{117,69,0}}, +/* 46855 */ {(13<<2)|2,{117,69,0}}, +/* 46856 */ {(13<<2)|2,{117,70,0}}, +/* 46857 */ {(13<<2)|2,{117,70,0}}, +/* 46858 */ {(13<<2)|2,{117,70,0}}, +/* 46859 */ {(13<<2)|2,{117,70,0}}, +/* 46860 */ {(13<<2)|2,{117,70,0}}, +/* 46861 */ {(13<<2)|2,{117,70,0}}, +/* 46862 */ {(13<<2)|2,{117,70,0}}, +/* 46863 */ {(13<<2)|2,{117,70,0}}, +/* 46864 */ {(13<<2)|2,{117,71,0}}, +/* 46865 */ {(13<<2)|2,{117,71,0}}, +/* 46866 */ {(13<<2)|2,{117,71,0}}, +/* 46867 */ {(13<<2)|2,{117,71,0}}, +/* 46868 */ {(13<<2)|2,{117,71,0}}, +/* 46869 */ {(13<<2)|2,{117,71,0}}, +/* 46870 */ {(13<<2)|2,{117,71,0}}, +/* 46871 */ {(13<<2)|2,{117,71,0}}, +/* 46872 */ {(13<<2)|2,{117,72,0}}, +/* 46873 */ {(13<<2)|2,{117,72,0}}, +/* 46874 */ {(13<<2)|2,{117,72,0}}, +/* 46875 */ {(13<<2)|2,{117,72,0}}, +/* 46876 */ {(13<<2)|2,{117,72,0}}, +/* 46877 */ {(13<<2)|2,{117,72,0}}, +/* 46878 */ {(13<<2)|2,{117,72,0}}, +/* 46879 */ {(13<<2)|2,{117,72,0}}, +/* 46880 */ {(13<<2)|2,{117,73,0}}, +/* 46881 */ {(13<<2)|2,{117,73,0}}, +/* 46882 */ {(13<<2)|2,{117,73,0}}, +/* 46883 */ {(13<<2)|2,{117,73,0}}, +/* 46884 */ {(13<<2)|2,{117,73,0}}, +/* 46885 */ {(13<<2)|2,{117,73,0}}, +/* 46886 */ {(13<<2)|2,{117,73,0}}, +/* 46887 */ {(13<<2)|2,{117,73,0}}, +/* 46888 */ {(13<<2)|2,{117,74,0}}, +/* 46889 */ {(13<<2)|2,{117,74,0}}, +/* 46890 */ {(13<<2)|2,{117,74,0}}, +/* 46891 */ {(13<<2)|2,{117,74,0}}, +/* 46892 */ {(13<<2)|2,{117,74,0}}, +/* 46893 */ {(13<<2)|2,{117,74,0}}, +/* 46894 */ {(13<<2)|2,{117,74,0}}, +/* 46895 */ {(13<<2)|2,{117,74,0}}, +/* 46896 */ {(13<<2)|2,{117,75,0}}, +/* 46897 */ {(13<<2)|2,{117,75,0}}, +/* 46898 */ {(13<<2)|2,{117,75,0}}, +/* 46899 */ {(13<<2)|2,{117,75,0}}, +/* 46900 */ {(13<<2)|2,{117,75,0}}, +/* 46901 */ {(13<<2)|2,{117,75,0}}, +/* 46902 */ {(13<<2)|2,{117,75,0}}, +/* 46903 */ {(13<<2)|2,{117,75,0}}, +/* 46904 */ {(13<<2)|2,{117,76,0}}, +/* 46905 */ {(13<<2)|2,{117,76,0}}, +/* 46906 */ {(13<<2)|2,{117,76,0}}, +/* 46907 */ {(13<<2)|2,{117,76,0}}, +/* 46908 */ {(13<<2)|2,{117,76,0}}, +/* 46909 */ {(13<<2)|2,{117,76,0}}, +/* 46910 */ {(13<<2)|2,{117,76,0}}, +/* 46911 */ {(13<<2)|2,{117,76,0}}, +/* 46912 */ {(13<<2)|2,{117,77,0}}, +/* 46913 */ {(13<<2)|2,{117,77,0}}, +/* 46914 */ {(13<<2)|2,{117,77,0}}, +/* 46915 */ {(13<<2)|2,{117,77,0}}, +/* 46916 */ {(13<<2)|2,{117,77,0}}, +/* 46917 */ {(13<<2)|2,{117,77,0}}, +/* 46918 */ {(13<<2)|2,{117,77,0}}, +/* 46919 */ {(13<<2)|2,{117,77,0}}, +/* 46920 */ {(13<<2)|2,{117,78,0}}, +/* 46921 */ {(13<<2)|2,{117,78,0}}, +/* 46922 */ {(13<<2)|2,{117,78,0}}, +/* 46923 */ {(13<<2)|2,{117,78,0}}, +/* 46924 */ {(13<<2)|2,{117,78,0}}, +/* 46925 */ {(13<<2)|2,{117,78,0}}, +/* 46926 */ {(13<<2)|2,{117,78,0}}, +/* 46927 */ {(13<<2)|2,{117,78,0}}, +/* 46928 */ {(13<<2)|2,{117,79,0}}, +/* 46929 */ {(13<<2)|2,{117,79,0}}, +/* 46930 */ {(13<<2)|2,{117,79,0}}, +/* 46931 */ {(13<<2)|2,{117,79,0}}, +/* 46932 */ {(13<<2)|2,{117,79,0}}, +/* 46933 */ {(13<<2)|2,{117,79,0}}, +/* 46934 */ {(13<<2)|2,{117,79,0}}, +/* 46935 */ {(13<<2)|2,{117,79,0}}, +/* 46936 */ {(13<<2)|2,{117,80,0}}, +/* 46937 */ {(13<<2)|2,{117,80,0}}, +/* 46938 */ {(13<<2)|2,{117,80,0}}, +/* 46939 */ {(13<<2)|2,{117,80,0}}, +/* 46940 */ {(13<<2)|2,{117,80,0}}, +/* 46941 */ {(13<<2)|2,{117,80,0}}, +/* 46942 */ {(13<<2)|2,{117,80,0}}, +/* 46943 */ {(13<<2)|2,{117,80,0}}, +/* 46944 */ {(13<<2)|2,{117,81,0}}, +/* 46945 */ {(13<<2)|2,{117,81,0}}, +/* 46946 */ {(13<<2)|2,{117,81,0}}, +/* 46947 */ {(13<<2)|2,{117,81,0}}, +/* 46948 */ {(13<<2)|2,{117,81,0}}, +/* 46949 */ {(13<<2)|2,{117,81,0}}, +/* 46950 */ {(13<<2)|2,{117,81,0}}, +/* 46951 */ {(13<<2)|2,{117,81,0}}, +/* 46952 */ {(13<<2)|2,{117,82,0}}, +/* 46953 */ {(13<<2)|2,{117,82,0}}, +/* 46954 */ {(13<<2)|2,{117,82,0}}, +/* 46955 */ {(13<<2)|2,{117,82,0}}, +/* 46956 */ {(13<<2)|2,{117,82,0}}, +/* 46957 */ {(13<<2)|2,{117,82,0}}, +/* 46958 */ {(13<<2)|2,{117,82,0}}, +/* 46959 */ {(13<<2)|2,{117,82,0}}, +/* 46960 */ {(13<<2)|2,{117,83,0}}, +/* 46961 */ {(13<<2)|2,{117,83,0}}, +/* 46962 */ {(13<<2)|2,{117,83,0}}, +/* 46963 */ {(13<<2)|2,{117,83,0}}, +/* 46964 */ {(13<<2)|2,{117,83,0}}, +/* 46965 */ {(13<<2)|2,{117,83,0}}, +/* 46966 */ {(13<<2)|2,{117,83,0}}, +/* 46967 */ {(13<<2)|2,{117,83,0}}, +/* 46968 */ {(13<<2)|2,{117,84,0}}, +/* 46969 */ {(13<<2)|2,{117,84,0}}, +/* 46970 */ {(13<<2)|2,{117,84,0}}, +/* 46971 */ {(13<<2)|2,{117,84,0}}, +/* 46972 */ {(13<<2)|2,{117,84,0}}, +/* 46973 */ {(13<<2)|2,{117,84,0}}, +/* 46974 */ {(13<<2)|2,{117,84,0}}, +/* 46975 */ {(13<<2)|2,{117,84,0}}, +/* 46976 */ {(13<<2)|2,{117,85,0}}, +/* 46977 */ {(13<<2)|2,{117,85,0}}, +/* 46978 */ {(13<<2)|2,{117,85,0}}, +/* 46979 */ {(13<<2)|2,{117,85,0}}, +/* 46980 */ {(13<<2)|2,{117,85,0}}, +/* 46981 */ {(13<<2)|2,{117,85,0}}, +/* 46982 */ {(13<<2)|2,{117,85,0}}, +/* 46983 */ {(13<<2)|2,{117,85,0}}, +/* 46984 */ {(13<<2)|2,{117,86,0}}, +/* 46985 */ {(13<<2)|2,{117,86,0}}, +/* 46986 */ {(13<<2)|2,{117,86,0}}, +/* 46987 */ {(13<<2)|2,{117,86,0}}, +/* 46988 */ {(13<<2)|2,{117,86,0}}, +/* 46989 */ {(13<<2)|2,{117,86,0}}, +/* 46990 */ {(13<<2)|2,{117,86,0}}, +/* 46991 */ {(13<<2)|2,{117,86,0}}, +/* 46992 */ {(13<<2)|2,{117,87,0}}, +/* 46993 */ {(13<<2)|2,{117,87,0}}, +/* 46994 */ {(13<<2)|2,{117,87,0}}, +/* 46995 */ {(13<<2)|2,{117,87,0}}, +/* 46996 */ {(13<<2)|2,{117,87,0}}, +/* 46997 */ {(13<<2)|2,{117,87,0}}, +/* 46998 */ {(13<<2)|2,{117,87,0}}, +/* 46999 */ {(13<<2)|2,{117,87,0}}, +/* 47000 */ {(13<<2)|2,{117,89,0}}, +/* 47001 */ {(13<<2)|2,{117,89,0}}, +/* 47002 */ {(13<<2)|2,{117,89,0}}, +/* 47003 */ {(13<<2)|2,{117,89,0}}, +/* 47004 */ {(13<<2)|2,{117,89,0}}, +/* 47005 */ {(13<<2)|2,{117,89,0}}, +/* 47006 */ {(13<<2)|2,{117,89,0}}, +/* 47007 */ {(13<<2)|2,{117,89,0}}, +/* 47008 */ {(13<<2)|2,{117,106,0}}, +/* 47009 */ {(13<<2)|2,{117,106,0}}, +/* 47010 */ {(13<<2)|2,{117,106,0}}, +/* 47011 */ {(13<<2)|2,{117,106,0}}, +/* 47012 */ {(13<<2)|2,{117,106,0}}, +/* 47013 */ {(13<<2)|2,{117,106,0}}, +/* 47014 */ {(13<<2)|2,{117,106,0}}, +/* 47015 */ {(13<<2)|2,{117,106,0}}, +/* 47016 */ {(13<<2)|2,{117,107,0}}, +/* 47017 */ {(13<<2)|2,{117,107,0}}, +/* 47018 */ {(13<<2)|2,{117,107,0}}, +/* 47019 */ {(13<<2)|2,{117,107,0}}, +/* 47020 */ {(13<<2)|2,{117,107,0}}, +/* 47021 */ {(13<<2)|2,{117,107,0}}, +/* 47022 */ {(13<<2)|2,{117,107,0}}, +/* 47023 */ {(13<<2)|2,{117,107,0}}, +/* 47024 */ {(13<<2)|2,{117,113,0}}, +/* 47025 */ {(13<<2)|2,{117,113,0}}, +/* 47026 */ {(13<<2)|2,{117,113,0}}, +/* 47027 */ {(13<<2)|2,{117,113,0}}, +/* 47028 */ {(13<<2)|2,{117,113,0}}, +/* 47029 */ {(13<<2)|2,{117,113,0}}, +/* 47030 */ {(13<<2)|2,{117,113,0}}, +/* 47031 */ {(13<<2)|2,{117,113,0}}, +/* 47032 */ {(13<<2)|2,{117,118,0}}, +/* 47033 */ {(13<<2)|2,{117,118,0}}, +/* 47034 */ {(13<<2)|2,{117,118,0}}, +/* 47035 */ {(13<<2)|2,{117,118,0}}, +/* 47036 */ {(13<<2)|2,{117,118,0}}, +/* 47037 */ {(13<<2)|2,{117,118,0}}, +/* 47038 */ {(13<<2)|2,{117,118,0}}, +/* 47039 */ {(13<<2)|2,{117,118,0}}, +/* 47040 */ {(13<<2)|2,{117,119,0}}, +/* 47041 */ {(13<<2)|2,{117,119,0}}, +/* 47042 */ {(13<<2)|2,{117,119,0}}, +/* 47043 */ {(13<<2)|2,{117,119,0}}, +/* 47044 */ {(13<<2)|2,{117,119,0}}, +/* 47045 */ {(13<<2)|2,{117,119,0}}, +/* 47046 */ {(13<<2)|2,{117,119,0}}, +/* 47047 */ {(13<<2)|2,{117,119,0}}, +/* 47048 */ {(13<<2)|2,{117,120,0}}, +/* 47049 */ {(13<<2)|2,{117,120,0}}, +/* 47050 */ {(13<<2)|2,{117,120,0}}, +/* 47051 */ {(13<<2)|2,{117,120,0}}, +/* 47052 */ {(13<<2)|2,{117,120,0}}, +/* 47053 */ {(13<<2)|2,{117,120,0}}, +/* 47054 */ {(13<<2)|2,{117,120,0}}, +/* 47055 */ {(13<<2)|2,{117,120,0}}, +/* 47056 */ {(13<<2)|2,{117,121,0}}, +/* 47057 */ {(13<<2)|2,{117,121,0}}, +/* 47058 */ {(13<<2)|2,{117,121,0}}, +/* 47059 */ {(13<<2)|2,{117,121,0}}, +/* 47060 */ {(13<<2)|2,{117,121,0}}, +/* 47061 */ {(13<<2)|2,{117,121,0}}, +/* 47062 */ {(13<<2)|2,{117,121,0}}, +/* 47063 */ {(13<<2)|2,{117,121,0}}, +/* 47064 */ {(13<<2)|2,{117,122,0}}, +/* 47065 */ {(13<<2)|2,{117,122,0}}, +/* 47066 */ {(13<<2)|2,{117,122,0}}, +/* 47067 */ {(13<<2)|2,{117,122,0}}, +/* 47068 */ {(13<<2)|2,{117,122,0}}, +/* 47069 */ {(13<<2)|2,{117,122,0}}, +/* 47070 */ {(13<<2)|2,{117,122,0}}, +/* 47071 */ {(13<<2)|2,{117,122,0}}, +/* 47072 */ {(14<<2)|2,{117,38,0}}, +/* 47073 */ {(14<<2)|2,{117,38,0}}, +/* 47074 */ {(14<<2)|2,{117,38,0}}, +/* 47075 */ {(14<<2)|2,{117,38,0}}, +/* 47076 */ {(14<<2)|2,{117,42,0}}, +/* 47077 */ {(14<<2)|2,{117,42,0}}, +/* 47078 */ {(14<<2)|2,{117,42,0}}, +/* 47079 */ {(14<<2)|2,{117,42,0}}, +/* 47080 */ {(14<<2)|2,{117,44,0}}, +/* 47081 */ {(14<<2)|2,{117,44,0}}, +/* 47082 */ {(14<<2)|2,{117,44,0}}, +/* 47083 */ {(14<<2)|2,{117,44,0}}, +/* 47084 */ {(14<<2)|2,{117,59,0}}, +/* 47085 */ {(14<<2)|2,{117,59,0}}, +/* 47086 */ {(14<<2)|2,{117,59,0}}, +/* 47087 */ {(14<<2)|2,{117,59,0}}, +/* 47088 */ {(14<<2)|2,{117,88,0}}, +/* 47089 */ {(14<<2)|2,{117,88,0}}, +/* 47090 */ {(14<<2)|2,{117,88,0}}, +/* 47091 */ {(14<<2)|2,{117,88,0}}, +/* 47092 */ {(14<<2)|2,{117,90,0}}, +/* 47093 */ {(14<<2)|2,{117,90,0}}, +/* 47094 */ {(14<<2)|2,{117,90,0}}, +/* 47095 */ {(14<<2)|2,{117,90,0}}, +/* 47096 */ {(16<<2)|2,{117,33,0}}, +/* 47097 */ {(16<<2)|2,{117,34,0}}, +/* 47098 */ {(16<<2)|2,{117,40,0}}, +/* 47099 */ {(16<<2)|2,{117,41,0}}, +/* 47100 */ {(16<<2)|2,{117,63,0}}, +/* 47101 */ {(6<<2)|1,{117,0,0}}, +/* 47102 */ {(6<<2)|1,{117,0,0}}, +/* 47103 */ {(6<<2)|1,{117,0,0}}, +/* 47104 */ {(12<<2)|2,{58,48,0}}, +/* 47105 */ {(12<<2)|2,{58,48,0}}, +/* 47106 */ {(12<<2)|2,{58,48,0}}, +/* 47107 */ {(12<<2)|2,{58,48,0}}, +/* 47108 */ {(12<<2)|2,{58,48,0}}, +/* 47109 */ {(12<<2)|2,{58,48,0}}, +/* 47110 */ {(12<<2)|2,{58,48,0}}, +/* 47111 */ {(12<<2)|2,{58,48,0}}, +/* 47112 */ {(12<<2)|2,{58,48,0}}, +/* 47113 */ {(12<<2)|2,{58,48,0}}, +/* 47114 */ {(12<<2)|2,{58,48,0}}, +/* 47115 */ {(12<<2)|2,{58,48,0}}, +/* 47116 */ {(12<<2)|2,{58,48,0}}, +/* 47117 */ {(12<<2)|2,{58,48,0}}, +/* 47118 */ {(12<<2)|2,{58,48,0}}, +/* 47119 */ {(12<<2)|2,{58,48,0}}, +/* 47120 */ {(12<<2)|2,{58,49,0}}, +/* 47121 */ {(12<<2)|2,{58,49,0}}, +/* 47122 */ {(12<<2)|2,{58,49,0}}, +/* 47123 */ {(12<<2)|2,{58,49,0}}, +/* 47124 */ {(12<<2)|2,{58,49,0}}, +/* 47125 */ {(12<<2)|2,{58,49,0}}, +/* 47126 */ {(12<<2)|2,{58,49,0}}, +/* 47127 */ {(12<<2)|2,{58,49,0}}, +/* 47128 */ {(12<<2)|2,{58,49,0}}, +/* 47129 */ {(12<<2)|2,{58,49,0}}, +/* 47130 */ {(12<<2)|2,{58,49,0}}, +/* 47131 */ {(12<<2)|2,{58,49,0}}, +/* 47132 */ {(12<<2)|2,{58,49,0}}, +/* 47133 */ {(12<<2)|2,{58,49,0}}, +/* 47134 */ {(12<<2)|2,{58,49,0}}, +/* 47135 */ {(12<<2)|2,{58,49,0}}, +/* 47136 */ {(12<<2)|2,{58,50,0}}, +/* 47137 */ {(12<<2)|2,{58,50,0}}, +/* 47138 */ {(12<<2)|2,{58,50,0}}, +/* 47139 */ {(12<<2)|2,{58,50,0}}, +/* 47140 */ {(12<<2)|2,{58,50,0}}, +/* 47141 */ {(12<<2)|2,{58,50,0}}, +/* 47142 */ {(12<<2)|2,{58,50,0}}, +/* 47143 */ {(12<<2)|2,{58,50,0}}, +/* 47144 */ {(12<<2)|2,{58,50,0}}, +/* 47145 */ {(12<<2)|2,{58,50,0}}, +/* 47146 */ {(12<<2)|2,{58,50,0}}, +/* 47147 */ {(12<<2)|2,{58,50,0}}, +/* 47148 */ {(12<<2)|2,{58,50,0}}, +/* 47149 */ {(12<<2)|2,{58,50,0}}, +/* 47150 */ {(12<<2)|2,{58,50,0}}, +/* 47151 */ {(12<<2)|2,{58,50,0}}, +/* 47152 */ {(12<<2)|2,{58,97,0}}, +/* 47153 */ {(12<<2)|2,{58,97,0}}, +/* 47154 */ {(12<<2)|2,{58,97,0}}, +/* 47155 */ {(12<<2)|2,{58,97,0}}, +/* 47156 */ {(12<<2)|2,{58,97,0}}, +/* 47157 */ {(12<<2)|2,{58,97,0}}, +/* 47158 */ {(12<<2)|2,{58,97,0}}, +/* 47159 */ {(12<<2)|2,{58,97,0}}, +/* 47160 */ {(12<<2)|2,{58,97,0}}, +/* 47161 */ {(12<<2)|2,{58,97,0}}, +/* 47162 */ {(12<<2)|2,{58,97,0}}, +/* 47163 */ {(12<<2)|2,{58,97,0}}, +/* 47164 */ {(12<<2)|2,{58,97,0}}, +/* 47165 */ {(12<<2)|2,{58,97,0}}, +/* 47166 */ {(12<<2)|2,{58,97,0}}, +/* 47167 */ {(12<<2)|2,{58,97,0}}, +/* 47168 */ {(12<<2)|2,{58,99,0}}, +/* 47169 */ {(12<<2)|2,{58,99,0}}, +/* 47170 */ {(12<<2)|2,{58,99,0}}, +/* 47171 */ {(12<<2)|2,{58,99,0}}, +/* 47172 */ {(12<<2)|2,{58,99,0}}, +/* 47173 */ {(12<<2)|2,{58,99,0}}, +/* 47174 */ {(12<<2)|2,{58,99,0}}, +/* 47175 */ {(12<<2)|2,{58,99,0}}, +/* 47176 */ {(12<<2)|2,{58,99,0}}, +/* 47177 */ {(12<<2)|2,{58,99,0}}, +/* 47178 */ {(12<<2)|2,{58,99,0}}, +/* 47179 */ {(12<<2)|2,{58,99,0}}, +/* 47180 */ {(12<<2)|2,{58,99,0}}, +/* 47181 */ {(12<<2)|2,{58,99,0}}, +/* 47182 */ {(12<<2)|2,{58,99,0}}, +/* 47183 */ {(12<<2)|2,{58,99,0}}, +/* 47184 */ {(12<<2)|2,{58,101,0}}, +/* 47185 */ {(12<<2)|2,{58,101,0}}, +/* 47186 */ {(12<<2)|2,{58,101,0}}, +/* 47187 */ {(12<<2)|2,{58,101,0}}, +/* 47188 */ {(12<<2)|2,{58,101,0}}, +/* 47189 */ {(12<<2)|2,{58,101,0}}, +/* 47190 */ {(12<<2)|2,{58,101,0}}, +/* 47191 */ {(12<<2)|2,{58,101,0}}, +/* 47192 */ {(12<<2)|2,{58,101,0}}, +/* 47193 */ {(12<<2)|2,{58,101,0}}, +/* 47194 */ {(12<<2)|2,{58,101,0}}, +/* 47195 */ {(12<<2)|2,{58,101,0}}, +/* 47196 */ {(12<<2)|2,{58,101,0}}, +/* 47197 */ {(12<<2)|2,{58,101,0}}, +/* 47198 */ {(12<<2)|2,{58,101,0}}, +/* 47199 */ {(12<<2)|2,{58,101,0}}, +/* 47200 */ {(12<<2)|2,{58,105,0}}, +/* 47201 */ {(12<<2)|2,{58,105,0}}, +/* 47202 */ {(12<<2)|2,{58,105,0}}, +/* 47203 */ {(12<<2)|2,{58,105,0}}, +/* 47204 */ {(12<<2)|2,{58,105,0}}, +/* 47205 */ {(12<<2)|2,{58,105,0}}, +/* 47206 */ {(12<<2)|2,{58,105,0}}, +/* 47207 */ {(12<<2)|2,{58,105,0}}, +/* 47208 */ {(12<<2)|2,{58,105,0}}, +/* 47209 */ {(12<<2)|2,{58,105,0}}, +/* 47210 */ {(12<<2)|2,{58,105,0}}, +/* 47211 */ {(12<<2)|2,{58,105,0}}, +/* 47212 */ {(12<<2)|2,{58,105,0}}, +/* 47213 */ {(12<<2)|2,{58,105,0}}, +/* 47214 */ {(12<<2)|2,{58,105,0}}, +/* 47215 */ {(12<<2)|2,{58,105,0}}, +/* 47216 */ {(12<<2)|2,{58,111,0}}, +/* 47217 */ {(12<<2)|2,{58,111,0}}, +/* 47218 */ {(12<<2)|2,{58,111,0}}, +/* 47219 */ {(12<<2)|2,{58,111,0}}, +/* 47220 */ {(12<<2)|2,{58,111,0}}, +/* 47221 */ {(12<<2)|2,{58,111,0}}, +/* 47222 */ {(12<<2)|2,{58,111,0}}, +/* 47223 */ {(12<<2)|2,{58,111,0}}, +/* 47224 */ {(12<<2)|2,{58,111,0}}, +/* 47225 */ {(12<<2)|2,{58,111,0}}, +/* 47226 */ {(12<<2)|2,{58,111,0}}, +/* 47227 */ {(12<<2)|2,{58,111,0}}, +/* 47228 */ {(12<<2)|2,{58,111,0}}, +/* 47229 */ {(12<<2)|2,{58,111,0}}, +/* 47230 */ {(12<<2)|2,{58,111,0}}, +/* 47231 */ {(12<<2)|2,{58,111,0}}, +/* 47232 */ {(12<<2)|2,{58,115,0}}, +/* 47233 */ {(12<<2)|2,{58,115,0}}, +/* 47234 */ {(12<<2)|2,{58,115,0}}, +/* 47235 */ {(12<<2)|2,{58,115,0}}, +/* 47236 */ {(12<<2)|2,{58,115,0}}, +/* 47237 */ {(12<<2)|2,{58,115,0}}, +/* 47238 */ {(12<<2)|2,{58,115,0}}, +/* 47239 */ {(12<<2)|2,{58,115,0}}, +/* 47240 */ {(12<<2)|2,{58,115,0}}, +/* 47241 */ {(12<<2)|2,{58,115,0}}, +/* 47242 */ {(12<<2)|2,{58,115,0}}, +/* 47243 */ {(12<<2)|2,{58,115,0}}, +/* 47244 */ {(12<<2)|2,{58,115,0}}, +/* 47245 */ {(12<<2)|2,{58,115,0}}, +/* 47246 */ {(12<<2)|2,{58,115,0}}, +/* 47247 */ {(12<<2)|2,{58,115,0}}, +/* 47248 */ {(12<<2)|2,{58,116,0}}, +/* 47249 */ {(12<<2)|2,{58,116,0}}, +/* 47250 */ {(12<<2)|2,{58,116,0}}, +/* 47251 */ {(12<<2)|2,{58,116,0}}, +/* 47252 */ {(12<<2)|2,{58,116,0}}, +/* 47253 */ {(12<<2)|2,{58,116,0}}, +/* 47254 */ {(12<<2)|2,{58,116,0}}, +/* 47255 */ {(12<<2)|2,{58,116,0}}, +/* 47256 */ {(12<<2)|2,{58,116,0}}, +/* 47257 */ {(12<<2)|2,{58,116,0}}, +/* 47258 */ {(12<<2)|2,{58,116,0}}, +/* 47259 */ {(12<<2)|2,{58,116,0}}, +/* 47260 */ {(12<<2)|2,{58,116,0}}, +/* 47261 */ {(12<<2)|2,{58,116,0}}, +/* 47262 */ {(12<<2)|2,{58,116,0}}, +/* 47263 */ {(12<<2)|2,{58,116,0}}, +/* 47264 */ {(13<<2)|2,{58,32,0}}, +/* 47265 */ {(13<<2)|2,{58,32,0}}, +/* 47266 */ {(13<<2)|2,{58,32,0}}, +/* 47267 */ {(13<<2)|2,{58,32,0}}, +/* 47268 */ {(13<<2)|2,{58,32,0}}, +/* 47269 */ {(13<<2)|2,{58,32,0}}, +/* 47270 */ {(13<<2)|2,{58,32,0}}, +/* 47271 */ {(13<<2)|2,{58,32,0}}, +/* 47272 */ {(13<<2)|2,{58,37,0}}, +/* 47273 */ {(13<<2)|2,{58,37,0}}, +/* 47274 */ {(13<<2)|2,{58,37,0}}, +/* 47275 */ {(13<<2)|2,{58,37,0}}, +/* 47276 */ {(13<<2)|2,{58,37,0}}, +/* 47277 */ {(13<<2)|2,{58,37,0}}, +/* 47278 */ {(13<<2)|2,{58,37,0}}, +/* 47279 */ {(13<<2)|2,{58,37,0}}, +/* 47280 */ {(13<<2)|2,{58,45,0}}, +/* 47281 */ {(13<<2)|2,{58,45,0}}, +/* 47282 */ {(13<<2)|2,{58,45,0}}, +/* 47283 */ {(13<<2)|2,{58,45,0}}, +/* 47284 */ {(13<<2)|2,{58,45,0}}, +/* 47285 */ {(13<<2)|2,{58,45,0}}, +/* 47286 */ {(13<<2)|2,{58,45,0}}, +/* 47287 */ {(13<<2)|2,{58,45,0}}, +/* 47288 */ {(13<<2)|2,{58,46,0}}, +/* 47289 */ {(13<<2)|2,{58,46,0}}, +/* 47290 */ {(13<<2)|2,{58,46,0}}, +/* 47291 */ {(13<<2)|2,{58,46,0}}, +/* 47292 */ {(13<<2)|2,{58,46,0}}, +/* 47293 */ {(13<<2)|2,{58,46,0}}, +/* 47294 */ {(13<<2)|2,{58,46,0}}, +/* 47295 */ {(13<<2)|2,{58,46,0}}, +/* 47296 */ {(13<<2)|2,{58,47,0}}, +/* 47297 */ {(13<<2)|2,{58,47,0}}, +/* 47298 */ {(13<<2)|2,{58,47,0}}, +/* 47299 */ {(13<<2)|2,{58,47,0}}, +/* 47300 */ {(13<<2)|2,{58,47,0}}, +/* 47301 */ {(13<<2)|2,{58,47,0}}, +/* 47302 */ {(13<<2)|2,{58,47,0}}, +/* 47303 */ {(13<<2)|2,{58,47,0}}, +/* 47304 */ {(13<<2)|2,{58,51,0}}, +/* 47305 */ {(13<<2)|2,{58,51,0}}, +/* 47306 */ {(13<<2)|2,{58,51,0}}, +/* 47307 */ {(13<<2)|2,{58,51,0}}, +/* 47308 */ {(13<<2)|2,{58,51,0}}, +/* 47309 */ {(13<<2)|2,{58,51,0}}, +/* 47310 */ {(13<<2)|2,{58,51,0}}, +/* 47311 */ {(13<<2)|2,{58,51,0}}, +/* 47312 */ {(13<<2)|2,{58,52,0}}, +/* 47313 */ {(13<<2)|2,{58,52,0}}, +/* 47314 */ {(13<<2)|2,{58,52,0}}, +/* 47315 */ {(13<<2)|2,{58,52,0}}, +/* 47316 */ {(13<<2)|2,{58,52,0}}, +/* 47317 */ {(13<<2)|2,{58,52,0}}, +/* 47318 */ {(13<<2)|2,{58,52,0}}, +/* 47319 */ {(13<<2)|2,{58,52,0}}, +/* 47320 */ {(13<<2)|2,{58,53,0}}, +/* 47321 */ {(13<<2)|2,{58,53,0}}, +/* 47322 */ {(13<<2)|2,{58,53,0}}, +/* 47323 */ {(13<<2)|2,{58,53,0}}, +/* 47324 */ {(13<<2)|2,{58,53,0}}, +/* 47325 */ {(13<<2)|2,{58,53,0}}, +/* 47326 */ {(13<<2)|2,{58,53,0}}, +/* 47327 */ {(13<<2)|2,{58,53,0}}, +/* 47328 */ {(13<<2)|2,{58,54,0}}, +/* 47329 */ {(13<<2)|2,{58,54,0}}, +/* 47330 */ {(13<<2)|2,{58,54,0}}, +/* 47331 */ {(13<<2)|2,{58,54,0}}, +/* 47332 */ {(13<<2)|2,{58,54,0}}, +/* 47333 */ {(13<<2)|2,{58,54,0}}, +/* 47334 */ {(13<<2)|2,{58,54,0}}, +/* 47335 */ {(13<<2)|2,{58,54,0}}, +/* 47336 */ {(13<<2)|2,{58,55,0}}, +/* 47337 */ {(13<<2)|2,{58,55,0}}, +/* 47338 */ {(13<<2)|2,{58,55,0}}, +/* 47339 */ {(13<<2)|2,{58,55,0}}, +/* 47340 */ {(13<<2)|2,{58,55,0}}, +/* 47341 */ {(13<<2)|2,{58,55,0}}, +/* 47342 */ {(13<<2)|2,{58,55,0}}, +/* 47343 */ {(13<<2)|2,{58,55,0}}, +/* 47344 */ {(13<<2)|2,{58,56,0}}, +/* 47345 */ {(13<<2)|2,{58,56,0}}, +/* 47346 */ {(13<<2)|2,{58,56,0}}, +/* 47347 */ {(13<<2)|2,{58,56,0}}, +/* 47348 */ {(13<<2)|2,{58,56,0}}, +/* 47349 */ {(13<<2)|2,{58,56,0}}, +/* 47350 */ {(13<<2)|2,{58,56,0}}, +/* 47351 */ {(13<<2)|2,{58,56,0}}, +/* 47352 */ {(13<<2)|2,{58,57,0}}, +/* 47353 */ {(13<<2)|2,{58,57,0}}, +/* 47354 */ {(13<<2)|2,{58,57,0}}, +/* 47355 */ {(13<<2)|2,{58,57,0}}, +/* 47356 */ {(13<<2)|2,{58,57,0}}, +/* 47357 */ {(13<<2)|2,{58,57,0}}, +/* 47358 */ {(13<<2)|2,{58,57,0}}, +/* 47359 */ {(13<<2)|2,{58,57,0}}, +/* 47360 */ {(13<<2)|2,{58,61,0}}, +/* 47361 */ {(13<<2)|2,{58,61,0}}, +/* 47362 */ {(13<<2)|2,{58,61,0}}, +/* 47363 */ {(13<<2)|2,{58,61,0}}, +/* 47364 */ {(13<<2)|2,{58,61,0}}, +/* 47365 */ {(13<<2)|2,{58,61,0}}, +/* 47366 */ {(13<<2)|2,{58,61,0}}, +/* 47367 */ {(13<<2)|2,{58,61,0}}, +/* 47368 */ {(13<<2)|2,{58,65,0}}, +/* 47369 */ {(13<<2)|2,{58,65,0}}, +/* 47370 */ {(13<<2)|2,{58,65,0}}, +/* 47371 */ {(13<<2)|2,{58,65,0}}, +/* 47372 */ {(13<<2)|2,{58,65,0}}, +/* 47373 */ {(13<<2)|2,{58,65,0}}, +/* 47374 */ {(13<<2)|2,{58,65,0}}, +/* 47375 */ {(13<<2)|2,{58,65,0}}, +/* 47376 */ {(13<<2)|2,{58,95,0}}, +/* 47377 */ {(13<<2)|2,{58,95,0}}, +/* 47378 */ {(13<<2)|2,{58,95,0}}, +/* 47379 */ {(13<<2)|2,{58,95,0}}, +/* 47380 */ {(13<<2)|2,{58,95,0}}, +/* 47381 */ {(13<<2)|2,{58,95,0}}, +/* 47382 */ {(13<<2)|2,{58,95,0}}, +/* 47383 */ {(13<<2)|2,{58,95,0}}, +/* 47384 */ {(13<<2)|2,{58,98,0}}, +/* 47385 */ {(13<<2)|2,{58,98,0}}, +/* 47386 */ {(13<<2)|2,{58,98,0}}, +/* 47387 */ {(13<<2)|2,{58,98,0}}, +/* 47388 */ {(13<<2)|2,{58,98,0}}, +/* 47389 */ {(13<<2)|2,{58,98,0}}, +/* 47390 */ {(13<<2)|2,{58,98,0}}, +/* 47391 */ {(13<<2)|2,{58,98,0}}, +/* 47392 */ {(13<<2)|2,{58,100,0}}, +/* 47393 */ {(13<<2)|2,{58,100,0}}, +/* 47394 */ {(13<<2)|2,{58,100,0}}, +/* 47395 */ {(13<<2)|2,{58,100,0}}, +/* 47396 */ {(13<<2)|2,{58,100,0}}, +/* 47397 */ {(13<<2)|2,{58,100,0}}, +/* 47398 */ {(13<<2)|2,{58,100,0}}, +/* 47399 */ {(13<<2)|2,{58,100,0}}, +/* 47400 */ {(13<<2)|2,{58,102,0}}, +/* 47401 */ {(13<<2)|2,{58,102,0}}, +/* 47402 */ {(13<<2)|2,{58,102,0}}, +/* 47403 */ {(13<<2)|2,{58,102,0}}, +/* 47404 */ {(13<<2)|2,{58,102,0}}, +/* 47405 */ {(13<<2)|2,{58,102,0}}, +/* 47406 */ {(13<<2)|2,{58,102,0}}, +/* 47407 */ {(13<<2)|2,{58,102,0}}, +/* 47408 */ {(13<<2)|2,{58,103,0}}, +/* 47409 */ {(13<<2)|2,{58,103,0}}, +/* 47410 */ {(13<<2)|2,{58,103,0}}, +/* 47411 */ {(13<<2)|2,{58,103,0}}, +/* 47412 */ {(13<<2)|2,{58,103,0}}, +/* 47413 */ {(13<<2)|2,{58,103,0}}, +/* 47414 */ {(13<<2)|2,{58,103,0}}, +/* 47415 */ {(13<<2)|2,{58,103,0}}, +/* 47416 */ {(13<<2)|2,{58,104,0}}, +/* 47417 */ {(13<<2)|2,{58,104,0}}, +/* 47418 */ {(13<<2)|2,{58,104,0}}, +/* 47419 */ {(13<<2)|2,{58,104,0}}, +/* 47420 */ {(13<<2)|2,{58,104,0}}, +/* 47421 */ {(13<<2)|2,{58,104,0}}, +/* 47422 */ {(13<<2)|2,{58,104,0}}, +/* 47423 */ {(13<<2)|2,{58,104,0}}, +/* 47424 */ {(13<<2)|2,{58,108,0}}, +/* 47425 */ {(13<<2)|2,{58,108,0}}, +/* 47426 */ {(13<<2)|2,{58,108,0}}, +/* 47427 */ {(13<<2)|2,{58,108,0}}, +/* 47428 */ {(13<<2)|2,{58,108,0}}, +/* 47429 */ {(13<<2)|2,{58,108,0}}, +/* 47430 */ {(13<<2)|2,{58,108,0}}, +/* 47431 */ {(13<<2)|2,{58,108,0}}, +/* 47432 */ {(13<<2)|2,{58,109,0}}, +/* 47433 */ {(13<<2)|2,{58,109,0}}, +/* 47434 */ {(13<<2)|2,{58,109,0}}, +/* 47435 */ {(13<<2)|2,{58,109,0}}, +/* 47436 */ {(13<<2)|2,{58,109,0}}, +/* 47437 */ {(13<<2)|2,{58,109,0}}, +/* 47438 */ {(13<<2)|2,{58,109,0}}, +/* 47439 */ {(13<<2)|2,{58,109,0}}, +/* 47440 */ {(13<<2)|2,{58,110,0}}, +/* 47441 */ {(13<<2)|2,{58,110,0}}, +/* 47442 */ {(13<<2)|2,{58,110,0}}, +/* 47443 */ {(13<<2)|2,{58,110,0}}, +/* 47444 */ {(13<<2)|2,{58,110,0}}, +/* 47445 */ {(13<<2)|2,{58,110,0}}, +/* 47446 */ {(13<<2)|2,{58,110,0}}, +/* 47447 */ {(13<<2)|2,{58,110,0}}, +/* 47448 */ {(13<<2)|2,{58,112,0}}, +/* 47449 */ {(13<<2)|2,{58,112,0}}, +/* 47450 */ {(13<<2)|2,{58,112,0}}, +/* 47451 */ {(13<<2)|2,{58,112,0}}, +/* 47452 */ {(13<<2)|2,{58,112,0}}, +/* 47453 */ {(13<<2)|2,{58,112,0}}, +/* 47454 */ {(13<<2)|2,{58,112,0}}, +/* 47455 */ {(13<<2)|2,{58,112,0}}, +/* 47456 */ {(13<<2)|2,{58,114,0}}, +/* 47457 */ {(13<<2)|2,{58,114,0}}, +/* 47458 */ {(13<<2)|2,{58,114,0}}, +/* 47459 */ {(13<<2)|2,{58,114,0}}, +/* 47460 */ {(13<<2)|2,{58,114,0}}, +/* 47461 */ {(13<<2)|2,{58,114,0}}, +/* 47462 */ {(13<<2)|2,{58,114,0}}, +/* 47463 */ {(13<<2)|2,{58,114,0}}, +/* 47464 */ {(13<<2)|2,{58,117,0}}, +/* 47465 */ {(13<<2)|2,{58,117,0}}, +/* 47466 */ {(13<<2)|2,{58,117,0}}, +/* 47467 */ {(13<<2)|2,{58,117,0}}, +/* 47468 */ {(13<<2)|2,{58,117,0}}, +/* 47469 */ {(13<<2)|2,{58,117,0}}, +/* 47470 */ {(13<<2)|2,{58,117,0}}, +/* 47471 */ {(13<<2)|2,{58,117,0}}, +/* 47472 */ {(14<<2)|2,{58,58,0}}, +/* 47473 */ {(14<<2)|2,{58,58,0}}, +/* 47474 */ {(14<<2)|2,{58,58,0}}, +/* 47475 */ {(14<<2)|2,{58,58,0}}, +/* 47476 */ {(14<<2)|2,{58,66,0}}, +/* 47477 */ {(14<<2)|2,{58,66,0}}, +/* 47478 */ {(14<<2)|2,{58,66,0}}, +/* 47479 */ {(14<<2)|2,{58,66,0}}, +/* 47480 */ {(14<<2)|2,{58,67,0}}, +/* 47481 */ {(14<<2)|2,{58,67,0}}, +/* 47482 */ {(14<<2)|2,{58,67,0}}, +/* 47483 */ {(14<<2)|2,{58,67,0}}, +/* 47484 */ {(14<<2)|2,{58,68,0}}, +/* 47485 */ {(14<<2)|2,{58,68,0}}, +/* 47486 */ {(14<<2)|2,{58,68,0}}, +/* 47487 */ {(14<<2)|2,{58,68,0}}, +/* 47488 */ {(14<<2)|2,{58,69,0}}, +/* 47489 */ {(14<<2)|2,{58,69,0}}, +/* 47490 */ {(14<<2)|2,{58,69,0}}, +/* 47491 */ {(14<<2)|2,{58,69,0}}, +/* 47492 */ {(14<<2)|2,{58,70,0}}, +/* 47493 */ {(14<<2)|2,{58,70,0}}, +/* 47494 */ {(14<<2)|2,{58,70,0}}, +/* 47495 */ {(14<<2)|2,{58,70,0}}, +/* 47496 */ {(14<<2)|2,{58,71,0}}, +/* 47497 */ {(14<<2)|2,{58,71,0}}, +/* 47498 */ {(14<<2)|2,{58,71,0}}, +/* 47499 */ {(14<<2)|2,{58,71,0}}, +/* 47500 */ {(14<<2)|2,{58,72,0}}, +/* 47501 */ {(14<<2)|2,{58,72,0}}, +/* 47502 */ {(14<<2)|2,{58,72,0}}, +/* 47503 */ {(14<<2)|2,{58,72,0}}, +/* 47504 */ {(14<<2)|2,{58,73,0}}, +/* 47505 */ {(14<<2)|2,{58,73,0}}, +/* 47506 */ {(14<<2)|2,{58,73,0}}, +/* 47507 */ {(14<<2)|2,{58,73,0}}, +/* 47508 */ {(14<<2)|2,{58,74,0}}, +/* 47509 */ {(14<<2)|2,{58,74,0}}, +/* 47510 */ {(14<<2)|2,{58,74,0}}, +/* 47511 */ {(14<<2)|2,{58,74,0}}, +/* 47512 */ {(14<<2)|2,{58,75,0}}, +/* 47513 */ {(14<<2)|2,{58,75,0}}, +/* 47514 */ {(14<<2)|2,{58,75,0}}, +/* 47515 */ {(14<<2)|2,{58,75,0}}, +/* 47516 */ {(14<<2)|2,{58,76,0}}, +/* 47517 */ {(14<<2)|2,{58,76,0}}, +/* 47518 */ {(14<<2)|2,{58,76,0}}, +/* 47519 */ {(14<<2)|2,{58,76,0}}, +/* 47520 */ {(14<<2)|2,{58,77,0}}, +/* 47521 */ {(14<<2)|2,{58,77,0}}, +/* 47522 */ {(14<<2)|2,{58,77,0}}, +/* 47523 */ {(14<<2)|2,{58,77,0}}, +/* 47524 */ {(14<<2)|2,{58,78,0}}, +/* 47525 */ {(14<<2)|2,{58,78,0}}, +/* 47526 */ {(14<<2)|2,{58,78,0}}, +/* 47527 */ {(14<<2)|2,{58,78,0}}, +/* 47528 */ {(14<<2)|2,{58,79,0}}, +/* 47529 */ {(14<<2)|2,{58,79,0}}, +/* 47530 */ {(14<<2)|2,{58,79,0}}, +/* 47531 */ {(14<<2)|2,{58,79,0}}, +/* 47532 */ {(14<<2)|2,{58,80,0}}, +/* 47533 */ {(14<<2)|2,{58,80,0}}, +/* 47534 */ {(14<<2)|2,{58,80,0}}, +/* 47535 */ {(14<<2)|2,{58,80,0}}, +/* 47536 */ {(14<<2)|2,{58,81,0}}, +/* 47537 */ {(14<<2)|2,{58,81,0}}, +/* 47538 */ {(14<<2)|2,{58,81,0}}, +/* 47539 */ {(14<<2)|2,{58,81,0}}, +/* 47540 */ {(14<<2)|2,{58,82,0}}, +/* 47541 */ {(14<<2)|2,{58,82,0}}, +/* 47542 */ {(14<<2)|2,{58,82,0}}, +/* 47543 */ {(14<<2)|2,{58,82,0}}, +/* 47544 */ {(14<<2)|2,{58,83,0}}, +/* 47545 */ {(14<<2)|2,{58,83,0}}, +/* 47546 */ {(14<<2)|2,{58,83,0}}, +/* 47547 */ {(14<<2)|2,{58,83,0}}, +/* 47548 */ {(14<<2)|2,{58,84,0}}, +/* 47549 */ {(14<<2)|2,{58,84,0}}, +/* 47550 */ {(14<<2)|2,{58,84,0}}, +/* 47551 */ {(14<<2)|2,{58,84,0}}, +/* 47552 */ {(14<<2)|2,{58,85,0}}, +/* 47553 */ {(14<<2)|2,{58,85,0}}, +/* 47554 */ {(14<<2)|2,{58,85,0}}, +/* 47555 */ {(14<<2)|2,{58,85,0}}, +/* 47556 */ {(14<<2)|2,{58,86,0}}, +/* 47557 */ {(14<<2)|2,{58,86,0}}, +/* 47558 */ {(14<<2)|2,{58,86,0}}, +/* 47559 */ {(14<<2)|2,{58,86,0}}, +/* 47560 */ {(14<<2)|2,{58,87,0}}, +/* 47561 */ {(14<<2)|2,{58,87,0}}, +/* 47562 */ {(14<<2)|2,{58,87,0}}, +/* 47563 */ {(14<<2)|2,{58,87,0}}, +/* 47564 */ {(14<<2)|2,{58,89,0}}, +/* 47565 */ {(14<<2)|2,{58,89,0}}, +/* 47566 */ {(14<<2)|2,{58,89,0}}, +/* 47567 */ {(14<<2)|2,{58,89,0}}, +/* 47568 */ {(14<<2)|2,{58,106,0}}, +/* 47569 */ {(14<<2)|2,{58,106,0}}, +/* 47570 */ {(14<<2)|2,{58,106,0}}, +/* 47571 */ {(14<<2)|2,{58,106,0}}, +/* 47572 */ {(14<<2)|2,{58,107,0}}, +/* 47573 */ {(14<<2)|2,{58,107,0}}, +/* 47574 */ {(14<<2)|2,{58,107,0}}, +/* 47575 */ {(14<<2)|2,{58,107,0}}, +/* 47576 */ {(14<<2)|2,{58,113,0}}, +/* 47577 */ {(14<<2)|2,{58,113,0}}, +/* 47578 */ {(14<<2)|2,{58,113,0}}, +/* 47579 */ {(14<<2)|2,{58,113,0}}, +/* 47580 */ {(14<<2)|2,{58,118,0}}, +/* 47581 */ {(14<<2)|2,{58,118,0}}, +/* 47582 */ {(14<<2)|2,{58,118,0}}, +/* 47583 */ {(14<<2)|2,{58,118,0}}, +/* 47584 */ {(14<<2)|2,{58,119,0}}, +/* 47585 */ {(14<<2)|2,{58,119,0}}, +/* 47586 */ {(14<<2)|2,{58,119,0}}, +/* 47587 */ {(14<<2)|2,{58,119,0}}, +/* 47588 */ {(14<<2)|2,{58,120,0}}, +/* 47589 */ {(14<<2)|2,{58,120,0}}, +/* 47590 */ {(14<<2)|2,{58,120,0}}, +/* 47591 */ {(14<<2)|2,{58,120,0}}, +/* 47592 */ {(14<<2)|2,{58,121,0}}, +/* 47593 */ {(14<<2)|2,{58,121,0}}, +/* 47594 */ {(14<<2)|2,{58,121,0}}, +/* 47595 */ {(14<<2)|2,{58,121,0}}, +/* 47596 */ {(14<<2)|2,{58,122,0}}, +/* 47597 */ {(14<<2)|2,{58,122,0}}, +/* 47598 */ {(14<<2)|2,{58,122,0}}, +/* 47599 */ {(14<<2)|2,{58,122,0}}, +/* 47600 */ {(15<<2)|2,{58,38,0}}, +/* 47601 */ {(15<<2)|2,{58,38,0}}, +/* 47602 */ {(15<<2)|2,{58,42,0}}, +/* 47603 */ {(15<<2)|2,{58,42,0}}, +/* 47604 */ {(15<<2)|2,{58,44,0}}, +/* 47605 */ {(15<<2)|2,{58,44,0}}, +/* 47606 */ {(15<<2)|2,{58,59,0}}, +/* 47607 */ {(15<<2)|2,{58,59,0}}, +/* 47608 */ {(15<<2)|2,{58,88,0}}, +/* 47609 */ {(15<<2)|2,{58,88,0}}, +/* 47610 */ {(15<<2)|2,{58,90,0}}, +/* 47611 */ {(15<<2)|2,{58,90,0}}, +/* 47612 */ {(7<<2)|1,{58,0,0}}, +/* 47613 */ {(7<<2)|1,{58,0,0}}, +/* 47614 */ {(7<<2)|1,{58,0,0}}, +/* 47615 */ {(7<<2)|1,{58,0,0}}, +/* 47616 */ {(12<<2)|2,{66,48,0}}, +/* 47617 */ {(12<<2)|2,{66,48,0}}, +/* 47618 */ {(12<<2)|2,{66,48,0}}, +/* 47619 */ {(12<<2)|2,{66,48,0}}, +/* 47620 */ {(12<<2)|2,{66,48,0}}, +/* 47621 */ {(12<<2)|2,{66,48,0}}, +/* 47622 */ {(12<<2)|2,{66,48,0}}, +/* 47623 */ {(12<<2)|2,{66,48,0}}, +/* 47624 */ {(12<<2)|2,{66,48,0}}, +/* 47625 */ {(12<<2)|2,{66,48,0}}, +/* 47626 */ {(12<<2)|2,{66,48,0}}, +/* 47627 */ {(12<<2)|2,{66,48,0}}, +/* 47628 */ {(12<<2)|2,{66,48,0}}, +/* 47629 */ {(12<<2)|2,{66,48,0}}, +/* 47630 */ {(12<<2)|2,{66,48,0}}, +/* 47631 */ {(12<<2)|2,{66,48,0}}, +/* 47632 */ {(12<<2)|2,{66,49,0}}, +/* 47633 */ {(12<<2)|2,{66,49,0}}, +/* 47634 */ {(12<<2)|2,{66,49,0}}, +/* 47635 */ {(12<<2)|2,{66,49,0}}, +/* 47636 */ {(12<<2)|2,{66,49,0}}, +/* 47637 */ {(12<<2)|2,{66,49,0}}, +/* 47638 */ {(12<<2)|2,{66,49,0}}, +/* 47639 */ {(12<<2)|2,{66,49,0}}, +/* 47640 */ {(12<<2)|2,{66,49,0}}, +/* 47641 */ {(12<<2)|2,{66,49,0}}, +/* 47642 */ {(12<<2)|2,{66,49,0}}, +/* 47643 */ {(12<<2)|2,{66,49,0}}, +/* 47644 */ {(12<<2)|2,{66,49,0}}, +/* 47645 */ {(12<<2)|2,{66,49,0}}, +/* 47646 */ {(12<<2)|2,{66,49,0}}, +/* 47647 */ {(12<<2)|2,{66,49,0}}, +/* 47648 */ {(12<<2)|2,{66,50,0}}, +/* 47649 */ {(12<<2)|2,{66,50,0}}, +/* 47650 */ {(12<<2)|2,{66,50,0}}, +/* 47651 */ {(12<<2)|2,{66,50,0}}, +/* 47652 */ {(12<<2)|2,{66,50,0}}, +/* 47653 */ {(12<<2)|2,{66,50,0}}, +/* 47654 */ {(12<<2)|2,{66,50,0}}, +/* 47655 */ {(12<<2)|2,{66,50,0}}, +/* 47656 */ {(12<<2)|2,{66,50,0}}, +/* 47657 */ {(12<<2)|2,{66,50,0}}, +/* 47658 */ {(12<<2)|2,{66,50,0}}, +/* 47659 */ {(12<<2)|2,{66,50,0}}, +/* 47660 */ {(12<<2)|2,{66,50,0}}, +/* 47661 */ {(12<<2)|2,{66,50,0}}, +/* 47662 */ {(12<<2)|2,{66,50,0}}, +/* 47663 */ {(12<<2)|2,{66,50,0}}, +/* 47664 */ {(12<<2)|2,{66,97,0}}, +/* 47665 */ {(12<<2)|2,{66,97,0}}, +/* 47666 */ {(12<<2)|2,{66,97,0}}, +/* 47667 */ {(12<<2)|2,{66,97,0}}, +/* 47668 */ {(12<<2)|2,{66,97,0}}, +/* 47669 */ {(12<<2)|2,{66,97,0}}, +/* 47670 */ {(12<<2)|2,{66,97,0}}, +/* 47671 */ {(12<<2)|2,{66,97,0}}, +/* 47672 */ {(12<<2)|2,{66,97,0}}, +/* 47673 */ {(12<<2)|2,{66,97,0}}, +/* 47674 */ {(12<<2)|2,{66,97,0}}, +/* 47675 */ {(12<<2)|2,{66,97,0}}, +/* 47676 */ {(12<<2)|2,{66,97,0}}, +/* 47677 */ {(12<<2)|2,{66,97,0}}, +/* 47678 */ {(12<<2)|2,{66,97,0}}, +/* 47679 */ {(12<<2)|2,{66,97,0}}, +/* 47680 */ {(12<<2)|2,{66,99,0}}, +/* 47681 */ {(12<<2)|2,{66,99,0}}, +/* 47682 */ {(12<<2)|2,{66,99,0}}, +/* 47683 */ {(12<<2)|2,{66,99,0}}, +/* 47684 */ {(12<<2)|2,{66,99,0}}, +/* 47685 */ {(12<<2)|2,{66,99,0}}, +/* 47686 */ {(12<<2)|2,{66,99,0}}, +/* 47687 */ {(12<<2)|2,{66,99,0}}, +/* 47688 */ {(12<<2)|2,{66,99,0}}, +/* 47689 */ {(12<<2)|2,{66,99,0}}, +/* 47690 */ {(12<<2)|2,{66,99,0}}, +/* 47691 */ {(12<<2)|2,{66,99,0}}, +/* 47692 */ {(12<<2)|2,{66,99,0}}, +/* 47693 */ {(12<<2)|2,{66,99,0}}, +/* 47694 */ {(12<<2)|2,{66,99,0}}, +/* 47695 */ {(12<<2)|2,{66,99,0}}, +/* 47696 */ {(12<<2)|2,{66,101,0}}, +/* 47697 */ {(12<<2)|2,{66,101,0}}, +/* 47698 */ {(12<<2)|2,{66,101,0}}, +/* 47699 */ {(12<<2)|2,{66,101,0}}, +/* 47700 */ {(12<<2)|2,{66,101,0}}, +/* 47701 */ {(12<<2)|2,{66,101,0}}, +/* 47702 */ {(12<<2)|2,{66,101,0}}, +/* 47703 */ {(12<<2)|2,{66,101,0}}, +/* 47704 */ {(12<<2)|2,{66,101,0}}, +/* 47705 */ {(12<<2)|2,{66,101,0}}, +/* 47706 */ {(12<<2)|2,{66,101,0}}, +/* 47707 */ {(12<<2)|2,{66,101,0}}, +/* 47708 */ {(12<<2)|2,{66,101,0}}, +/* 47709 */ {(12<<2)|2,{66,101,0}}, +/* 47710 */ {(12<<2)|2,{66,101,0}}, +/* 47711 */ {(12<<2)|2,{66,101,0}}, +/* 47712 */ {(12<<2)|2,{66,105,0}}, +/* 47713 */ {(12<<2)|2,{66,105,0}}, +/* 47714 */ {(12<<2)|2,{66,105,0}}, +/* 47715 */ {(12<<2)|2,{66,105,0}}, +/* 47716 */ {(12<<2)|2,{66,105,0}}, +/* 47717 */ {(12<<2)|2,{66,105,0}}, +/* 47718 */ {(12<<2)|2,{66,105,0}}, +/* 47719 */ {(12<<2)|2,{66,105,0}}, +/* 47720 */ {(12<<2)|2,{66,105,0}}, +/* 47721 */ {(12<<2)|2,{66,105,0}}, +/* 47722 */ {(12<<2)|2,{66,105,0}}, +/* 47723 */ {(12<<2)|2,{66,105,0}}, +/* 47724 */ {(12<<2)|2,{66,105,0}}, +/* 47725 */ {(12<<2)|2,{66,105,0}}, +/* 47726 */ {(12<<2)|2,{66,105,0}}, +/* 47727 */ {(12<<2)|2,{66,105,0}}, +/* 47728 */ {(12<<2)|2,{66,111,0}}, +/* 47729 */ {(12<<2)|2,{66,111,0}}, +/* 47730 */ {(12<<2)|2,{66,111,0}}, +/* 47731 */ {(12<<2)|2,{66,111,0}}, +/* 47732 */ {(12<<2)|2,{66,111,0}}, +/* 47733 */ {(12<<2)|2,{66,111,0}}, +/* 47734 */ {(12<<2)|2,{66,111,0}}, +/* 47735 */ {(12<<2)|2,{66,111,0}}, +/* 47736 */ {(12<<2)|2,{66,111,0}}, +/* 47737 */ {(12<<2)|2,{66,111,0}}, +/* 47738 */ {(12<<2)|2,{66,111,0}}, +/* 47739 */ {(12<<2)|2,{66,111,0}}, +/* 47740 */ {(12<<2)|2,{66,111,0}}, +/* 47741 */ {(12<<2)|2,{66,111,0}}, +/* 47742 */ {(12<<2)|2,{66,111,0}}, +/* 47743 */ {(12<<2)|2,{66,111,0}}, +/* 47744 */ {(12<<2)|2,{66,115,0}}, +/* 47745 */ {(12<<2)|2,{66,115,0}}, +/* 47746 */ {(12<<2)|2,{66,115,0}}, +/* 47747 */ {(12<<2)|2,{66,115,0}}, +/* 47748 */ {(12<<2)|2,{66,115,0}}, +/* 47749 */ {(12<<2)|2,{66,115,0}}, +/* 47750 */ {(12<<2)|2,{66,115,0}}, +/* 47751 */ {(12<<2)|2,{66,115,0}}, +/* 47752 */ {(12<<2)|2,{66,115,0}}, +/* 47753 */ {(12<<2)|2,{66,115,0}}, +/* 47754 */ {(12<<2)|2,{66,115,0}}, +/* 47755 */ {(12<<2)|2,{66,115,0}}, +/* 47756 */ {(12<<2)|2,{66,115,0}}, +/* 47757 */ {(12<<2)|2,{66,115,0}}, +/* 47758 */ {(12<<2)|2,{66,115,0}}, +/* 47759 */ {(12<<2)|2,{66,115,0}}, +/* 47760 */ {(12<<2)|2,{66,116,0}}, +/* 47761 */ {(12<<2)|2,{66,116,0}}, +/* 47762 */ {(12<<2)|2,{66,116,0}}, +/* 47763 */ {(12<<2)|2,{66,116,0}}, +/* 47764 */ {(12<<2)|2,{66,116,0}}, +/* 47765 */ {(12<<2)|2,{66,116,0}}, +/* 47766 */ {(12<<2)|2,{66,116,0}}, +/* 47767 */ {(12<<2)|2,{66,116,0}}, +/* 47768 */ {(12<<2)|2,{66,116,0}}, +/* 47769 */ {(12<<2)|2,{66,116,0}}, +/* 47770 */ {(12<<2)|2,{66,116,0}}, +/* 47771 */ {(12<<2)|2,{66,116,0}}, +/* 47772 */ {(12<<2)|2,{66,116,0}}, +/* 47773 */ {(12<<2)|2,{66,116,0}}, +/* 47774 */ {(12<<2)|2,{66,116,0}}, +/* 47775 */ {(12<<2)|2,{66,116,0}}, +/* 47776 */ {(13<<2)|2,{66,32,0}}, +/* 47777 */ {(13<<2)|2,{66,32,0}}, +/* 47778 */ {(13<<2)|2,{66,32,0}}, +/* 47779 */ {(13<<2)|2,{66,32,0}}, +/* 47780 */ {(13<<2)|2,{66,32,0}}, +/* 47781 */ {(13<<2)|2,{66,32,0}}, +/* 47782 */ {(13<<2)|2,{66,32,0}}, +/* 47783 */ {(13<<2)|2,{66,32,0}}, +/* 47784 */ {(13<<2)|2,{66,37,0}}, +/* 47785 */ {(13<<2)|2,{66,37,0}}, +/* 47786 */ {(13<<2)|2,{66,37,0}}, +/* 47787 */ {(13<<2)|2,{66,37,0}}, +/* 47788 */ {(13<<2)|2,{66,37,0}}, +/* 47789 */ {(13<<2)|2,{66,37,0}}, +/* 47790 */ {(13<<2)|2,{66,37,0}}, +/* 47791 */ {(13<<2)|2,{66,37,0}}, +/* 47792 */ {(13<<2)|2,{66,45,0}}, +/* 47793 */ {(13<<2)|2,{66,45,0}}, +/* 47794 */ {(13<<2)|2,{66,45,0}}, +/* 47795 */ {(13<<2)|2,{66,45,0}}, +/* 47796 */ {(13<<2)|2,{66,45,0}}, +/* 47797 */ {(13<<2)|2,{66,45,0}}, +/* 47798 */ {(13<<2)|2,{66,45,0}}, +/* 47799 */ {(13<<2)|2,{66,45,0}}, +/* 47800 */ {(13<<2)|2,{66,46,0}}, +/* 47801 */ {(13<<2)|2,{66,46,0}}, +/* 47802 */ {(13<<2)|2,{66,46,0}}, +/* 47803 */ {(13<<2)|2,{66,46,0}}, +/* 47804 */ {(13<<2)|2,{66,46,0}}, +/* 47805 */ {(13<<2)|2,{66,46,0}}, +/* 47806 */ {(13<<2)|2,{66,46,0}}, +/* 47807 */ {(13<<2)|2,{66,46,0}}, +/* 47808 */ {(13<<2)|2,{66,47,0}}, +/* 47809 */ {(13<<2)|2,{66,47,0}}, +/* 47810 */ {(13<<2)|2,{66,47,0}}, +/* 47811 */ {(13<<2)|2,{66,47,0}}, +/* 47812 */ {(13<<2)|2,{66,47,0}}, +/* 47813 */ {(13<<2)|2,{66,47,0}}, +/* 47814 */ {(13<<2)|2,{66,47,0}}, +/* 47815 */ {(13<<2)|2,{66,47,0}}, +/* 47816 */ {(13<<2)|2,{66,51,0}}, +/* 47817 */ {(13<<2)|2,{66,51,0}}, +/* 47818 */ {(13<<2)|2,{66,51,0}}, +/* 47819 */ {(13<<2)|2,{66,51,0}}, +/* 47820 */ {(13<<2)|2,{66,51,0}}, +/* 47821 */ {(13<<2)|2,{66,51,0}}, +/* 47822 */ {(13<<2)|2,{66,51,0}}, +/* 47823 */ {(13<<2)|2,{66,51,0}}, +/* 47824 */ {(13<<2)|2,{66,52,0}}, +/* 47825 */ {(13<<2)|2,{66,52,0}}, +/* 47826 */ {(13<<2)|2,{66,52,0}}, +/* 47827 */ {(13<<2)|2,{66,52,0}}, +/* 47828 */ {(13<<2)|2,{66,52,0}}, +/* 47829 */ {(13<<2)|2,{66,52,0}}, +/* 47830 */ {(13<<2)|2,{66,52,0}}, +/* 47831 */ {(13<<2)|2,{66,52,0}}, +/* 47832 */ {(13<<2)|2,{66,53,0}}, +/* 47833 */ {(13<<2)|2,{66,53,0}}, +/* 47834 */ {(13<<2)|2,{66,53,0}}, +/* 47835 */ {(13<<2)|2,{66,53,0}}, +/* 47836 */ {(13<<2)|2,{66,53,0}}, +/* 47837 */ {(13<<2)|2,{66,53,0}}, +/* 47838 */ {(13<<2)|2,{66,53,0}}, +/* 47839 */ {(13<<2)|2,{66,53,0}}, +/* 47840 */ {(13<<2)|2,{66,54,0}}, +/* 47841 */ {(13<<2)|2,{66,54,0}}, +/* 47842 */ {(13<<2)|2,{66,54,0}}, +/* 47843 */ {(13<<2)|2,{66,54,0}}, +/* 47844 */ {(13<<2)|2,{66,54,0}}, +/* 47845 */ {(13<<2)|2,{66,54,0}}, +/* 47846 */ {(13<<2)|2,{66,54,0}}, +/* 47847 */ {(13<<2)|2,{66,54,0}}, +/* 47848 */ {(13<<2)|2,{66,55,0}}, +/* 47849 */ {(13<<2)|2,{66,55,0}}, +/* 47850 */ {(13<<2)|2,{66,55,0}}, +/* 47851 */ {(13<<2)|2,{66,55,0}}, +/* 47852 */ {(13<<2)|2,{66,55,0}}, +/* 47853 */ {(13<<2)|2,{66,55,0}}, +/* 47854 */ {(13<<2)|2,{66,55,0}}, +/* 47855 */ {(13<<2)|2,{66,55,0}}, +/* 47856 */ {(13<<2)|2,{66,56,0}}, +/* 47857 */ {(13<<2)|2,{66,56,0}}, +/* 47858 */ {(13<<2)|2,{66,56,0}}, +/* 47859 */ {(13<<2)|2,{66,56,0}}, +/* 47860 */ {(13<<2)|2,{66,56,0}}, +/* 47861 */ {(13<<2)|2,{66,56,0}}, +/* 47862 */ {(13<<2)|2,{66,56,0}}, +/* 47863 */ {(13<<2)|2,{66,56,0}}, +/* 47864 */ {(13<<2)|2,{66,57,0}}, +/* 47865 */ {(13<<2)|2,{66,57,0}}, +/* 47866 */ {(13<<2)|2,{66,57,0}}, +/* 47867 */ {(13<<2)|2,{66,57,0}}, +/* 47868 */ {(13<<2)|2,{66,57,0}}, +/* 47869 */ {(13<<2)|2,{66,57,0}}, +/* 47870 */ {(13<<2)|2,{66,57,0}}, +/* 47871 */ {(13<<2)|2,{66,57,0}}, +/* 47872 */ {(13<<2)|2,{66,61,0}}, +/* 47873 */ {(13<<2)|2,{66,61,0}}, +/* 47874 */ {(13<<2)|2,{66,61,0}}, +/* 47875 */ {(13<<2)|2,{66,61,0}}, +/* 47876 */ {(13<<2)|2,{66,61,0}}, +/* 47877 */ {(13<<2)|2,{66,61,0}}, +/* 47878 */ {(13<<2)|2,{66,61,0}}, +/* 47879 */ {(13<<2)|2,{66,61,0}}, +/* 47880 */ {(13<<2)|2,{66,65,0}}, +/* 47881 */ {(13<<2)|2,{66,65,0}}, +/* 47882 */ {(13<<2)|2,{66,65,0}}, +/* 47883 */ {(13<<2)|2,{66,65,0}}, +/* 47884 */ {(13<<2)|2,{66,65,0}}, +/* 47885 */ {(13<<2)|2,{66,65,0}}, +/* 47886 */ {(13<<2)|2,{66,65,0}}, +/* 47887 */ {(13<<2)|2,{66,65,0}}, +/* 47888 */ {(13<<2)|2,{66,95,0}}, +/* 47889 */ {(13<<2)|2,{66,95,0}}, +/* 47890 */ {(13<<2)|2,{66,95,0}}, +/* 47891 */ {(13<<2)|2,{66,95,0}}, +/* 47892 */ {(13<<2)|2,{66,95,0}}, +/* 47893 */ {(13<<2)|2,{66,95,0}}, +/* 47894 */ {(13<<2)|2,{66,95,0}}, +/* 47895 */ {(13<<2)|2,{66,95,0}}, +/* 47896 */ {(13<<2)|2,{66,98,0}}, +/* 47897 */ {(13<<2)|2,{66,98,0}}, +/* 47898 */ {(13<<2)|2,{66,98,0}}, +/* 47899 */ {(13<<2)|2,{66,98,0}}, +/* 47900 */ {(13<<2)|2,{66,98,0}}, +/* 47901 */ {(13<<2)|2,{66,98,0}}, +/* 47902 */ {(13<<2)|2,{66,98,0}}, +/* 47903 */ {(13<<2)|2,{66,98,0}}, +/* 47904 */ {(13<<2)|2,{66,100,0}}, +/* 47905 */ {(13<<2)|2,{66,100,0}}, +/* 47906 */ {(13<<2)|2,{66,100,0}}, +/* 47907 */ {(13<<2)|2,{66,100,0}}, +/* 47908 */ {(13<<2)|2,{66,100,0}}, +/* 47909 */ {(13<<2)|2,{66,100,0}}, +/* 47910 */ {(13<<2)|2,{66,100,0}}, +/* 47911 */ {(13<<2)|2,{66,100,0}}, +/* 47912 */ {(13<<2)|2,{66,102,0}}, +/* 47913 */ {(13<<2)|2,{66,102,0}}, +/* 47914 */ {(13<<2)|2,{66,102,0}}, +/* 47915 */ {(13<<2)|2,{66,102,0}}, +/* 47916 */ {(13<<2)|2,{66,102,0}}, +/* 47917 */ {(13<<2)|2,{66,102,0}}, +/* 47918 */ {(13<<2)|2,{66,102,0}}, +/* 47919 */ {(13<<2)|2,{66,102,0}}, +/* 47920 */ {(13<<2)|2,{66,103,0}}, +/* 47921 */ {(13<<2)|2,{66,103,0}}, +/* 47922 */ {(13<<2)|2,{66,103,0}}, +/* 47923 */ {(13<<2)|2,{66,103,0}}, +/* 47924 */ {(13<<2)|2,{66,103,0}}, +/* 47925 */ {(13<<2)|2,{66,103,0}}, +/* 47926 */ {(13<<2)|2,{66,103,0}}, +/* 47927 */ {(13<<2)|2,{66,103,0}}, +/* 47928 */ {(13<<2)|2,{66,104,0}}, +/* 47929 */ {(13<<2)|2,{66,104,0}}, +/* 47930 */ {(13<<2)|2,{66,104,0}}, +/* 47931 */ {(13<<2)|2,{66,104,0}}, +/* 47932 */ {(13<<2)|2,{66,104,0}}, +/* 47933 */ {(13<<2)|2,{66,104,0}}, +/* 47934 */ {(13<<2)|2,{66,104,0}}, +/* 47935 */ {(13<<2)|2,{66,104,0}}, +/* 47936 */ {(13<<2)|2,{66,108,0}}, +/* 47937 */ {(13<<2)|2,{66,108,0}}, +/* 47938 */ {(13<<2)|2,{66,108,0}}, +/* 47939 */ {(13<<2)|2,{66,108,0}}, +/* 47940 */ {(13<<2)|2,{66,108,0}}, +/* 47941 */ {(13<<2)|2,{66,108,0}}, +/* 47942 */ {(13<<2)|2,{66,108,0}}, +/* 47943 */ {(13<<2)|2,{66,108,0}}, +/* 47944 */ {(13<<2)|2,{66,109,0}}, +/* 47945 */ {(13<<2)|2,{66,109,0}}, +/* 47946 */ {(13<<2)|2,{66,109,0}}, +/* 47947 */ {(13<<2)|2,{66,109,0}}, +/* 47948 */ {(13<<2)|2,{66,109,0}}, +/* 47949 */ {(13<<2)|2,{66,109,0}}, +/* 47950 */ {(13<<2)|2,{66,109,0}}, +/* 47951 */ {(13<<2)|2,{66,109,0}}, +/* 47952 */ {(13<<2)|2,{66,110,0}}, +/* 47953 */ {(13<<2)|2,{66,110,0}}, +/* 47954 */ {(13<<2)|2,{66,110,0}}, +/* 47955 */ {(13<<2)|2,{66,110,0}}, +/* 47956 */ {(13<<2)|2,{66,110,0}}, +/* 47957 */ {(13<<2)|2,{66,110,0}}, +/* 47958 */ {(13<<2)|2,{66,110,0}}, +/* 47959 */ {(13<<2)|2,{66,110,0}}, +/* 47960 */ {(13<<2)|2,{66,112,0}}, +/* 47961 */ {(13<<2)|2,{66,112,0}}, +/* 47962 */ {(13<<2)|2,{66,112,0}}, +/* 47963 */ {(13<<2)|2,{66,112,0}}, +/* 47964 */ {(13<<2)|2,{66,112,0}}, +/* 47965 */ {(13<<2)|2,{66,112,0}}, +/* 47966 */ {(13<<2)|2,{66,112,0}}, +/* 47967 */ {(13<<2)|2,{66,112,0}}, +/* 47968 */ {(13<<2)|2,{66,114,0}}, +/* 47969 */ {(13<<2)|2,{66,114,0}}, +/* 47970 */ {(13<<2)|2,{66,114,0}}, +/* 47971 */ {(13<<2)|2,{66,114,0}}, +/* 47972 */ {(13<<2)|2,{66,114,0}}, +/* 47973 */ {(13<<2)|2,{66,114,0}}, +/* 47974 */ {(13<<2)|2,{66,114,0}}, +/* 47975 */ {(13<<2)|2,{66,114,0}}, +/* 47976 */ {(13<<2)|2,{66,117,0}}, +/* 47977 */ {(13<<2)|2,{66,117,0}}, +/* 47978 */ {(13<<2)|2,{66,117,0}}, +/* 47979 */ {(13<<2)|2,{66,117,0}}, +/* 47980 */ {(13<<2)|2,{66,117,0}}, +/* 47981 */ {(13<<2)|2,{66,117,0}}, +/* 47982 */ {(13<<2)|2,{66,117,0}}, +/* 47983 */ {(13<<2)|2,{66,117,0}}, +/* 47984 */ {(14<<2)|2,{66,58,0}}, +/* 47985 */ {(14<<2)|2,{66,58,0}}, +/* 47986 */ {(14<<2)|2,{66,58,0}}, +/* 47987 */ {(14<<2)|2,{66,58,0}}, +/* 47988 */ {(14<<2)|2,{66,66,0}}, +/* 47989 */ {(14<<2)|2,{66,66,0}}, +/* 47990 */ {(14<<2)|2,{66,66,0}}, +/* 47991 */ {(14<<2)|2,{66,66,0}}, +/* 47992 */ {(14<<2)|2,{66,67,0}}, +/* 47993 */ {(14<<2)|2,{66,67,0}}, +/* 47994 */ {(14<<2)|2,{66,67,0}}, +/* 47995 */ {(14<<2)|2,{66,67,0}}, +/* 47996 */ {(14<<2)|2,{66,68,0}}, +/* 47997 */ {(14<<2)|2,{66,68,0}}, +/* 47998 */ {(14<<2)|2,{66,68,0}}, +/* 47999 */ {(14<<2)|2,{66,68,0}}, +/* 48000 */ {(14<<2)|2,{66,69,0}}, +/* 48001 */ {(14<<2)|2,{66,69,0}}, +/* 48002 */ {(14<<2)|2,{66,69,0}}, +/* 48003 */ {(14<<2)|2,{66,69,0}}, +/* 48004 */ {(14<<2)|2,{66,70,0}}, +/* 48005 */ {(14<<2)|2,{66,70,0}}, +/* 48006 */ {(14<<2)|2,{66,70,0}}, +/* 48007 */ {(14<<2)|2,{66,70,0}}, +/* 48008 */ {(14<<2)|2,{66,71,0}}, +/* 48009 */ {(14<<2)|2,{66,71,0}}, +/* 48010 */ {(14<<2)|2,{66,71,0}}, +/* 48011 */ {(14<<2)|2,{66,71,0}}, +/* 48012 */ {(14<<2)|2,{66,72,0}}, +/* 48013 */ {(14<<2)|2,{66,72,0}}, +/* 48014 */ {(14<<2)|2,{66,72,0}}, +/* 48015 */ {(14<<2)|2,{66,72,0}}, +/* 48016 */ {(14<<2)|2,{66,73,0}}, +/* 48017 */ {(14<<2)|2,{66,73,0}}, +/* 48018 */ {(14<<2)|2,{66,73,0}}, +/* 48019 */ {(14<<2)|2,{66,73,0}}, +/* 48020 */ {(14<<2)|2,{66,74,0}}, +/* 48021 */ {(14<<2)|2,{66,74,0}}, +/* 48022 */ {(14<<2)|2,{66,74,0}}, +/* 48023 */ {(14<<2)|2,{66,74,0}}, +/* 48024 */ {(14<<2)|2,{66,75,0}}, +/* 48025 */ {(14<<2)|2,{66,75,0}}, +/* 48026 */ {(14<<2)|2,{66,75,0}}, +/* 48027 */ {(14<<2)|2,{66,75,0}}, +/* 48028 */ {(14<<2)|2,{66,76,0}}, +/* 48029 */ {(14<<2)|2,{66,76,0}}, +/* 48030 */ {(14<<2)|2,{66,76,0}}, +/* 48031 */ {(14<<2)|2,{66,76,0}}, +/* 48032 */ {(14<<2)|2,{66,77,0}}, +/* 48033 */ {(14<<2)|2,{66,77,0}}, +/* 48034 */ {(14<<2)|2,{66,77,0}}, +/* 48035 */ {(14<<2)|2,{66,77,0}}, +/* 48036 */ {(14<<2)|2,{66,78,0}}, +/* 48037 */ {(14<<2)|2,{66,78,0}}, +/* 48038 */ {(14<<2)|2,{66,78,0}}, +/* 48039 */ {(14<<2)|2,{66,78,0}}, +/* 48040 */ {(14<<2)|2,{66,79,0}}, +/* 48041 */ {(14<<2)|2,{66,79,0}}, +/* 48042 */ {(14<<2)|2,{66,79,0}}, +/* 48043 */ {(14<<2)|2,{66,79,0}}, +/* 48044 */ {(14<<2)|2,{66,80,0}}, +/* 48045 */ {(14<<2)|2,{66,80,0}}, +/* 48046 */ {(14<<2)|2,{66,80,0}}, +/* 48047 */ {(14<<2)|2,{66,80,0}}, +/* 48048 */ {(14<<2)|2,{66,81,0}}, +/* 48049 */ {(14<<2)|2,{66,81,0}}, +/* 48050 */ {(14<<2)|2,{66,81,0}}, +/* 48051 */ {(14<<2)|2,{66,81,0}}, +/* 48052 */ {(14<<2)|2,{66,82,0}}, +/* 48053 */ {(14<<2)|2,{66,82,0}}, +/* 48054 */ {(14<<2)|2,{66,82,0}}, +/* 48055 */ {(14<<2)|2,{66,82,0}}, +/* 48056 */ {(14<<2)|2,{66,83,0}}, +/* 48057 */ {(14<<2)|2,{66,83,0}}, +/* 48058 */ {(14<<2)|2,{66,83,0}}, +/* 48059 */ {(14<<2)|2,{66,83,0}}, +/* 48060 */ {(14<<2)|2,{66,84,0}}, +/* 48061 */ {(14<<2)|2,{66,84,0}}, +/* 48062 */ {(14<<2)|2,{66,84,0}}, +/* 48063 */ {(14<<2)|2,{66,84,0}}, +/* 48064 */ {(14<<2)|2,{66,85,0}}, +/* 48065 */ {(14<<2)|2,{66,85,0}}, +/* 48066 */ {(14<<2)|2,{66,85,0}}, +/* 48067 */ {(14<<2)|2,{66,85,0}}, +/* 48068 */ {(14<<2)|2,{66,86,0}}, +/* 48069 */ {(14<<2)|2,{66,86,0}}, +/* 48070 */ {(14<<2)|2,{66,86,0}}, +/* 48071 */ {(14<<2)|2,{66,86,0}}, +/* 48072 */ {(14<<2)|2,{66,87,0}}, +/* 48073 */ {(14<<2)|2,{66,87,0}}, +/* 48074 */ {(14<<2)|2,{66,87,0}}, +/* 48075 */ {(14<<2)|2,{66,87,0}}, +/* 48076 */ {(14<<2)|2,{66,89,0}}, +/* 48077 */ {(14<<2)|2,{66,89,0}}, +/* 48078 */ {(14<<2)|2,{66,89,0}}, +/* 48079 */ {(14<<2)|2,{66,89,0}}, +/* 48080 */ {(14<<2)|2,{66,106,0}}, +/* 48081 */ {(14<<2)|2,{66,106,0}}, +/* 48082 */ {(14<<2)|2,{66,106,0}}, +/* 48083 */ {(14<<2)|2,{66,106,0}}, +/* 48084 */ {(14<<2)|2,{66,107,0}}, +/* 48085 */ {(14<<2)|2,{66,107,0}}, +/* 48086 */ {(14<<2)|2,{66,107,0}}, +/* 48087 */ {(14<<2)|2,{66,107,0}}, +/* 48088 */ {(14<<2)|2,{66,113,0}}, +/* 48089 */ {(14<<2)|2,{66,113,0}}, +/* 48090 */ {(14<<2)|2,{66,113,0}}, +/* 48091 */ {(14<<2)|2,{66,113,0}}, +/* 48092 */ {(14<<2)|2,{66,118,0}}, +/* 48093 */ {(14<<2)|2,{66,118,0}}, +/* 48094 */ {(14<<2)|2,{66,118,0}}, +/* 48095 */ {(14<<2)|2,{66,118,0}}, +/* 48096 */ {(14<<2)|2,{66,119,0}}, +/* 48097 */ {(14<<2)|2,{66,119,0}}, +/* 48098 */ {(14<<2)|2,{66,119,0}}, +/* 48099 */ {(14<<2)|2,{66,119,0}}, +/* 48100 */ {(14<<2)|2,{66,120,0}}, +/* 48101 */ {(14<<2)|2,{66,120,0}}, +/* 48102 */ {(14<<2)|2,{66,120,0}}, +/* 48103 */ {(14<<2)|2,{66,120,0}}, +/* 48104 */ {(14<<2)|2,{66,121,0}}, +/* 48105 */ {(14<<2)|2,{66,121,0}}, +/* 48106 */ {(14<<2)|2,{66,121,0}}, +/* 48107 */ {(14<<2)|2,{66,121,0}}, +/* 48108 */ {(14<<2)|2,{66,122,0}}, +/* 48109 */ {(14<<2)|2,{66,122,0}}, +/* 48110 */ {(14<<2)|2,{66,122,0}}, +/* 48111 */ {(14<<2)|2,{66,122,0}}, +/* 48112 */ {(15<<2)|2,{66,38,0}}, +/* 48113 */ {(15<<2)|2,{66,38,0}}, +/* 48114 */ {(15<<2)|2,{66,42,0}}, +/* 48115 */ {(15<<2)|2,{66,42,0}}, +/* 48116 */ {(15<<2)|2,{66,44,0}}, +/* 48117 */ {(15<<2)|2,{66,44,0}}, +/* 48118 */ {(15<<2)|2,{66,59,0}}, +/* 48119 */ {(15<<2)|2,{66,59,0}}, +/* 48120 */ {(15<<2)|2,{66,88,0}}, +/* 48121 */ {(15<<2)|2,{66,88,0}}, +/* 48122 */ {(15<<2)|2,{66,90,0}}, +/* 48123 */ {(15<<2)|2,{66,90,0}}, +/* 48124 */ {(7<<2)|1,{66,0,0}}, +/* 48125 */ {(7<<2)|1,{66,0,0}}, +/* 48126 */ {(7<<2)|1,{66,0,0}}, +/* 48127 */ {(7<<2)|1,{66,0,0}}, +/* 48128 */ {(12<<2)|2,{67,48,0}}, +/* 48129 */ {(12<<2)|2,{67,48,0}}, +/* 48130 */ {(12<<2)|2,{67,48,0}}, +/* 48131 */ {(12<<2)|2,{67,48,0}}, +/* 48132 */ {(12<<2)|2,{67,48,0}}, +/* 48133 */ {(12<<2)|2,{67,48,0}}, +/* 48134 */ {(12<<2)|2,{67,48,0}}, +/* 48135 */ {(12<<2)|2,{67,48,0}}, +/* 48136 */ {(12<<2)|2,{67,48,0}}, +/* 48137 */ {(12<<2)|2,{67,48,0}}, +/* 48138 */ {(12<<2)|2,{67,48,0}}, +/* 48139 */ {(12<<2)|2,{67,48,0}}, +/* 48140 */ {(12<<2)|2,{67,48,0}}, +/* 48141 */ {(12<<2)|2,{67,48,0}}, +/* 48142 */ {(12<<2)|2,{67,48,0}}, +/* 48143 */ {(12<<2)|2,{67,48,0}}, +/* 48144 */ {(12<<2)|2,{67,49,0}}, +/* 48145 */ {(12<<2)|2,{67,49,0}}, +/* 48146 */ {(12<<2)|2,{67,49,0}}, +/* 48147 */ {(12<<2)|2,{67,49,0}}, +/* 48148 */ {(12<<2)|2,{67,49,0}}, +/* 48149 */ {(12<<2)|2,{67,49,0}}, +/* 48150 */ {(12<<2)|2,{67,49,0}}, +/* 48151 */ {(12<<2)|2,{67,49,0}}, +/* 48152 */ {(12<<2)|2,{67,49,0}}, +/* 48153 */ {(12<<2)|2,{67,49,0}}, +/* 48154 */ {(12<<2)|2,{67,49,0}}, +/* 48155 */ {(12<<2)|2,{67,49,0}}, +/* 48156 */ {(12<<2)|2,{67,49,0}}, +/* 48157 */ {(12<<2)|2,{67,49,0}}, +/* 48158 */ {(12<<2)|2,{67,49,0}}, +/* 48159 */ {(12<<2)|2,{67,49,0}}, +/* 48160 */ {(12<<2)|2,{67,50,0}}, +/* 48161 */ {(12<<2)|2,{67,50,0}}, +/* 48162 */ {(12<<2)|2,{67,50,0}}, +/* 48163 */ {(12<<2)|2,{67,50,0}}, +/* 48164 */ {(12<<2)|2,{67,50,0}}, +/* 48165 */ {(12<<2)|2,{67,50,0}}, +/* 48166 */ {(12<<2)|2,{67,50,0}}, +/* 48167 */ {(12<<2)|2,{67,50,0}}, +/* 48168 */ {(12<<2)|2,{67,50,0}}, +/* 48169 */ {(12<<2)|2,{67,50,0}}, +/* 48170 */ {(12<<2)|2,{67,50,0}}, +/* 48171 */ {(12<<2)|2,{67,50,0}}, +/* 48172 */ {(12<<2)|2,{67,50,0}}, +/* 48173 */ {(12<<2)|2,{67,50,0}}, +/* 48174 */ {(12<<2)|2,{67,50,0}}, +/* 48175 */ {(12<<2)|2,{67,50,0}}, +/* 48176 */ {(12<<2)|2,{67,97,0}}, +/* 48177 */ {(12<<2)|2,{67,97,0}}, +/* 48178 */ {(12<<2)|2,{67,97,0}}, +/* 48179 */ {(12<<2)|2,{67,97,0}}, +/* 48180 */ {(12<<2)|2,{67,97,0}}, +/* 48181 */ {(12<<2)|2,{67,97,0}}, +/* 48182 */ {(12<<2)|2,{67,97,0}}, +/* 48183 */ {(12<<2)|2,{67,97,0}}, +/* 48184 */ {(12<<2)|2,{67,97,0}}, +/* 48185 */ {(12<<2)|2,{67,97,0}}, +/* 48186 */ {(12<<2)|2,{67,97,0}}, +/* 48187 */ {(12<<2)|2,{67,97,0}}, +/* 48188 */ {(12<<2)|2,{67,97,0}}, +/* 48189 */ {(12<<2)|2,{67,97,0}}, +/* 48190 */ {(12<<2)|2,{67,97,0}}, +/* 48191 */ {(12<<2)|2,{67,97,0}}, +/* 48192 */ {(12<<2)|2,{67,99,0}}, +/* 48193 */ {(12<<2)|2,{67,99,0}}, +/* 48194 */ {(12<<2)|2,{67,99,0}}, +/* 48195 */ {(12<<2)|2,{67,99,0}}, +/* 48196 */ {(12<<2)|2,{67,99,0}}, +/* 48197 */ {(12<<2)|2,{67,99,0}}, +/* 48198 */ {(12<<2)|2,{67,99,0}}, +/* 48199 */ {(12<<2)|2,{67,99,0}}, +/* 48200 */ {(12<<2)|2,{67,99,0}}, +/* 48201 */ {(12<<2)|2,{67,99,0}}, +/* 48202 */ {(12<<2)|2,{67,99,0}}, +/* 48203 */ {(12<<2)|2,{67,99,0}}, +/* 48204 */ {(12<<2)|2,{67,99,0}}, +/* 48205 */ {(12<<2)|2,{67,99,0}}, +/* 48206 */ {(12<<2)|2,{67,99,0}}, +/* 48207 */ {(12<<2)|2,{67,99,0}}, +/* 48208 */ {(12<<2)|2,{67,101,0}}, +/* 48209 */ {(12<<2)|2,{67,101,0}}, +/* 48210 */ {(12<<2)|2,{67,101,0}}, +/* 48211 */ {(12<<2)|2,{67,101,0}}, +/* 48212 */ {(12<<2)|2,{67,101,0}}, +/* 48213 */ {(12<<2)|2,{67,101,0}}, +/* 48214 */ {(12<<2)|2,{67,101,0}}, +/* 48215 */ {(12<<2)|2,{67,101,0}}, +/* 48216 */ {(12<<2)|2,{67,101,0}}, +/* 48217 */ {(12<<2)|2,{67,101,0}}, +/* 48218 */ {(12<<2)|2,{67,101,0}}, +/* 48219 */ {(12<<2)|2,{67,101,0}}, +/* 48220 */ {(12<<2)|2,{67,101,0}}, +/* 48221 */ {(12<<2)|2,{67,101,0}}, +/* 48222 */ {(12<<2)|2,{67,101,0}}, +/* 48223 */ {(12<<2)|2,{67,101,0}}, +/* 48224 */ {(12<<2)|2,{67,105,0}}, +/* 48225 */ {(12<<2)|2,{67,105,0}}, +/* 48226 */ {(12<<2)|2,{67,105,0}}, +/* 48227 */ {(12<<2)|2,{67,105,0}}, +/* 48228 */ {(12<<2)|2,{67,105,0}}, +/* 48229 */ {(12<<2)|2,{67,105,0}}, +/* 48230 */ {(12<<2)|2,{67,105,0}}, +/* 48231 */ {(12<<2)|2,{67,105,0}}, +/* 48232 */ {(12<<2)|2,{67,105,0}}, +/* 48233 */ {(12<<2)|2,{67,105,0}}, +/* 48234 */ {(12<<2)|2,{67,105,0}}, +/* 48235 */ {(12<<2)|2,{67,105,0}}, +/* 48236 */ {(12<<2)|2,{67,105,0}}, +/* 48237 */ {(12<<2)|2,{67,105,0}}, +/* 48238 */ {(12<<2)|2,{67,105,0}}, +/* 48239 */ {(12<<2)|2,{67,105,0}}, +/* 48240 */ {(12<<2)|2,{67,111,0}}, +/* 48241 */ {(12<<2)|2,{67,111,0}}, +/* 48242 */ {(12<<2)|2,{67,111,0}}, +/* 48243 */ {(12<<2)|2,{67,111,0}}, +/* 48244 */ {(12<<2)|2,{67,111,0}}, +/* 48245 */ {(12<<2)|2,{67,111,0}}, +/* 48246 */ {(12<<2)|2,{67,111,0}}, +/* 48247 */ {(12<<2)|2,{67,111,0}}, +/* 48248 */ {(12<<2)|2,{67,111,0}}, +/* 48249 */ {(12<<2)|2,{67,111,0}}, +/* 48250 */ {(12<<2)|2,{67,111,0}}, +/* 48251 */ {(12<<2)|2,{67,111,0}}, +/* 48252 */ {(12<<2)|2,{67,111,0}}, +/* 48253 */ {(12<<2)|2,{67,111,0}}, +/* 48254 */ {(12<<2)|2,{67,111,0}}, +/* 48255 */ {(12<<2)|2,{67,111,0}}, +/* 48256 */ {(12<<2)|2,{67,115,0}}, +/* 48257 */ {(12<<2)|2,{67,115,0}}, +/* 48258 */ {(12<<2)|2,{67,115,0}}, +/* 48259 */ {(12<<2)|2,{67,115,0}}, +/* 48260 */ {(12<<2)|2,{67,115,0}}, +/* 48261 */ {(12<<2)|2,{67,115,0}}, +/* 48262 */ {(12<<2)|2,{67,115,0}}, +/* 48263 */ {(12<<2)|2,{67,115,0}}, +/* 48264 */ {(12<<2)|2,{67,115,0}}, +/* 48265 */ {(12<<2)|2,{67,115,0}}, +/* 48266 */ {(12<<2)|2,{67,115,0}}, +/* 48267 */ {(12<<2)|2,{67,115,0}}, +/* 48268 */ {(12<<2)|2,{67,115,0}}, +/* 48269 */ {(12<<2)|2,{67,115,0}}, +/* 48270 */ {(12<<2)|2,{67,115,0}}, +/* 48271 */ {(12<<2)|2,{67,115,0}}, +/* 48272 */ {(12<<2)|2,{67,116,0}}, +/* 48273 */ {(12<<2)|2,{67,116,0}}, +/* 48274 */ {(12<<2)|2,{67,116,0}}, +/* 48275 */ {(12<<2)|2,{67,116,0}}, +/* 48276 */ {(12<<2)|2,{67,116,0}}, +/* 48277 */ {(12<<2)|2,{67,116,0}}, +/* 48278 */ {(12<<2)|2,{67,116,0}}, +/* 48279 */ {(12<<2)|2,{67,116,0}}, +/* 48280 */ {(12<<2)|2,{67,116,0}}, +/* 48281 */ {(12<<2)|2,{67,116,0}}, +/* 48282 */ {(12<<2)|2,{67,116,0}}, +/* 48283 */ {(12<<2)|2,{67,116,0}}, +/* 48284 */ {(12<<2)|2,{67,116,0}}, +/* 48285 */ {(12<<2)|2,{67,116,0}}, +/* 48286 */ {(12<<2)|2,{67,116,0}}, +/* 48287 */ {(12<<2)|2,{67,116,0}}, +/* 48288 */ {(13<<2)|2,{67,32,0}}, +/* 48289 */ {(13<<2)|2,{67,32,0}}, +/* 48290 */ {(13<<2)|2,{67,32,0}}, +/* 48291 */ {(13<<2)|2,{67,32,0}}, +/* 48292 */ {(13<<2)|2,{67,32,0}}, +/* 48293 */ {(13<<2)|2,{67,32,0}}, +/* 48294 */ {(13<<2)|2,{67,32,0}}, +/* 48295 */ {(13<<2)|2,{67,32,0}}, +/* 48296 */ {(13<<2)|2,{67,37,0}}, +/* 48297 */ {(13<<2)|2,{67,37,0}}, +/* 48298 */ {(13<<2)|2,{67,37,0}}, +/* 48299 */ {(13<<2)|2,{67,37,0}}, +/* 48300 */ {(13<<2)|2,{67,37,0}}, +/* 48301 */ {(13<<2)|2,{67,37,0}}, +/* 48302 */ {(13<<2)|2,{67,37,0}}, +/* 48303 */ {(13<<2)|2,{67,37,0}}, +/* 48304 */ {(13<<2)|2,{67,45,0}}, +/* 48305 */ {(13<<2)|2,{67,45,0}}, +/* 48306 */ {(13<<2)|2,{67,45,0}}, +/* 48307 */ {(13<<2)|2,{67,45,0}}, +/* 48308 */ {(13<<2)|2,{67,45,0}}, +/* 48309 */ {(13<<2)|2,{67,45,0}}, +/* 48310 */ {(13<<2)|2,{67,45,0}}, +/* 48311 */ {(13<<2)|2,{67,45,0}}, +/* 48312 */ {(13<<2)|2,{67,46,0}}, +/* 48313 */ {(13<<2)|2,{67,46,0}}, +/* 48314 */ {(13<<2)|2,{67,46,0}}, +/* 48315 */ {(13<<2)|2,{67,46,0}}, +/* 48316 */ {(13<<2)|2,{67,46,0}}, +/* 48317 */ {(13<<2)|2,{67,46,0}}, +/* 48318 */ {(13<<2)|2,{67,46,0}}, +/* 48319 */ {(13<<2)|2,{67,46,0}}, +/* 48320 */ {(13<<2)|2,{67,47,0}}, +/* 48321 */ {(13<<2)|2,{67,47,0}}, +/* 48322 */ {(13<<2)|2,{67,47,0}}, +/* 48323 */ {(13<<2)|2,{67,47,0}}, +/* 48324 */ {(13<<2)|2,{67,47,0}}, +/* 48325 */ {(13<<2)|2,{67,47,0}}, +/* 48326 */ {(13<<2)|2,{67,47,0}}, +/* 48327 */ {(13<<2)|2,{67,47,0}}, +/* 48328 */ {(13<<2)|2,{67,51,0}}, +/* 48329 */ {(13<<2)|2,{67,51,0}}, +/* 48330 */ {(13<<2)|2,{67,51,0}}, +/* 48331 */ {(13<<2)|2,{67,51,0}}, +/* 48332 */ {(13<<2)|2,{67,51,0}}, +/* 48333 */ {(13<<2)|2,{67,51,0}}, +/* 48334 */ {(13<<2)|2,{67,51,0}}, +/* 48335 */ {(13<<2)|2,{67,51,0}}, +/* 48336 */ {(13<<2)|2,{67,52,0}}, +/* 48337 */ {(13<<2)|2,{67,52,0}}, +/* 48338 */ {(13<<2)|2,{67,52,0}}, +/* 48339 */ {(13<<2)|2,{67,52,0}}, +/* 48340 */ {(13<<2)|2,{67,52,0}}, +/* 48341 */ {(13<<2)|2,{67,52,0}}, +/* 48342 */ {(13<<2)|2,{67,52,0}}, +/* 48343 */ {(13<<2)|2,{67,52,0}}, +/* 48344 */ {(13<<2)|2,{67,53,0}}, +/* 48345 */ {(13<<2)|2,{67,53,0}}, +/* 48346 */ {(13<<2)|2,{67,53,0}}, +/* 48347 */ {(13<<2)|2,{67,53,0}}, +/* 48348 */ {(13<<2)|2,{67,53,0}}, +/* 48349 */ {(13<<2)|2,{67,53,0}}, +/* 48350 */ {(13<<2)|2,{67,53,0}}, +/* 48351 */ {(13<<2)|2,{67,53,0}}, +/* 48352 */ {(13<<2)|2,{67,54,0}}, +/* 48353 */ {(13<<2)|2,{67,54,0}}, +/* 48354 */ {(13<<2)|2,{67,54,0}}, +/* 48355 */ {(13<<2)|2,{67,54,0}}, +/* 48356 */ {(13<<2)|2,{67,54,0}}, +/* 48357 */ {(13<<2)|2,{67,54,0}}, +/* 48358 */ {(13<<2)|2,{67,54,0}}, +/* 48359 */ {(13<<2)|2,{67,54,0}}, +/* 48360 */ {(13<<2)|2,{67,55,0}}, +/* 48361 */ {(13<<2)|2,{67,55,0}}, +/* 48362 */ {(13<<2)|2,{67,55,0}}, +/* 48363 */ {(13<<2)|2,{67,55,0}}, +/* 48364 */ {(13<<2)|2,{67,55,0}}, +/* 48365 */ {(13<<2)|2,{67,55,0}}, +/* 48366 */ {(13<<2)|2,{67,55,0}}, +/* 48367 */ {(13<<2)|2,{67,55,0}}, +/* 48368 */ {(13<<2)|2,{67,56,0}}, +/* 48369 */ {(13<<2)|2,{67,56,0}}, +/* 48370 */ {(13<<2)|2,{67,56,0}}, +/* 48371 */ {(13<<2)|2,{67,56,0}}, +/* 48372 */ {(13<<2)|2,{67,56,0}}, +/* 48373 */ {(13<<2)|2,{67,56,0}}, +/* 48374 */ {(13<<2)|2,{67,56,0}}, +/* 48375 */ {(13<<2)|2,{67,56,0}}, +/* 48376 */ {(13<<2)|2,{67,57,0}}, +/* 48377 */ {(13<<2)|2,{67,57,0}}, +/* 48378 */ {(13<<2)|2,{67,57,0}}, +/* 48379 */ {(13<<2)|2,{67,57,0}}, +/* 48380 */ {(13<<2)|2,{67,57,0}}, +/* 48381 */ {(13<<2)|2,{67,57,0}}, +/* 48382 */ {(13<<2)|2,{67,57,0}}, +/* 48383 */ {(13<<2)|2,{67,57,0}}, +/* 48384 */ {(13<<2)|2,{67,61,0}}, +/* 48385 */ {(13<<2)|2,{67,61,0}}, +/* 48386 */ {(13<<2)|2,{67,61,0}}, +/* 48387 */ {(13<<2)|2,{67,61,0}}, +/* 48388 */ {(13<<2)|2,{67,61,0}}, +/* 48389 */ {(13<<2)|2,{67,61,0}}, +/* 48390 */ {(13<<2)|2,{67,61,0}}, +/* 48391 */ {(13<<2)|2,{67,61,0}}, +/* 48392 */ {(13<<2)|2,{67,65,0}}, +/* 48393 */ {(13<<2)|2,{67,65,0}}, +/* 48394 */ {(13<<2)|2,{67,65,0}}, +/* 48395 */ {(13<<2)|2,{67,65,0}}, +/* 48396 */ {(13<<2)|2,{67,65,0}}, +/* 48397 */ {(13<<2)|2,{67,65,0}}, +/* 48398 */ {(13<<2)|2,{67,65,0}}, +/* 48399 */ {(13<<2)|2,{67,65,0}}, +/* 48400 */ {(13<<2)|2,{67,95,0}}, +/* 48401 */ {(13<<2)|2,{67,95,0}}, +/* 48402 */ {(13<<2)|2,{67,95,0}}, +/* 48403 */ {(13<<2)|2,{67,95,0}}, +/* 48404 */ {(13<<2)|2,{67,95,0}}, +/* 48405 */ {(13<<2)|2,{67,95,0}}, +/* 48406 */ {(13<<2)|2,{67,95,0}}, +/* 48407 */ {(13<<2)|2,{67,95,0}}, +/* 48408 */ {(13<<2)|2,{67,98,0}}, +/* 48409 */ {(13<<2)|2,{67,98,0}}, +/* 48410 */ {(13<<2)|2,{67,98,0}}, +/* 48411 */ {(13<<2)|2,{67,98,0}}, +/* 48412 */ {(13<<2)|2,{67,98,0}}, +/* 48413 */ {(13<<2)|2,{67,98,0}}, +/* 48414 */ {(13<<2)|2,{67,98,0}}, +/* 48415 */ {(13<<2)|2,{67,98,0}}, +/* 48416 */ {(13<<2)|2,{67,100,0}}, +/* 48417 */ {(13<<2)|2,{67,100,0}}, +/* 48418 */ {(13<<2)|2,{67,100,0}}, +/* 48419 */ {(13<<2)|2,{67,100,0}}, +/* 48420 */ {(13<<2)|2,{67,100,0}}, +/* 48421 */ {(13<<2)|2,{67,100,0}}, +/* 48422 */ {(13<<2)|2,{67,100,0}}, +/* 48423 */ {(13<<2)|2,{67,100,0}}, +/* 48424 */ {(13<<2)|2,{67,102,0}}, +/* 48425 */ {(13<<2)|2,{67,102,0}}, +/* 48426 */ {(13<<2)|2,{67,102,0}}, +/* 48427 */ {(13<<2)|2,{67,102,0}}, +/* 48428 */ {(13<<2)|2,{67,102,0}}, +/* 48429 */ {(13<<2)|2,{67,102,0}}, +/* 48430 */ {(13<<2)|2,{67,102,0}}, +/* 48431 */ {(13<<2)|2,{67,102,0}}, +/* 48432 */ {(13<<2)|2,{67,103,0}}, +/* 48433 */ {(13<<2)|2,{67,103,0}}, +/* 48434 */ {(13<<2)|2,{67,103,0}}, +/* 48435 */ {(13<<2)|2,{67,103,0}}, +/* 48436 */ {(13<<2)|2,{67,103,0}}, +/* 48437 */ {(13<<2)|2,{67,103,0}}, +/* 48438 */ {(13<<2)|2,{67,103,0}}, +/* 48439 */ {(13<<2)|2,{67,103,0}}, +/* 48440 */ {(13<<2)|2,{67,104,0}}, +/* 48441 */ {(13<<2)|2,{67,104,0}}, +/* 48442 */ {(13<<2)|2,{67,104,0}}, +/* 48443 */ {(13<<2)|2,{67,104,0}}, +/* 48444 */ {(13<<2)|2,{67,104,0}}, +/* 48445 */ {(13<<2)|2,{67,104,0}}, +/* 48446 */ {(13<<2)|2,{67,104,0}}, +/* 48447 */ {(13<<2)|2,{67,104,0}}, +/* 48448 */ {(13<<2)|2,{67,108,0}}, +/* 48449 */ {(13<<2)|2,{67,108,0}}, +/* 48450 */ {(13<<2)|2,{67,108,0}}, +/* 48451 */ {(13<<2)|2,{67,108,0}}, +/* 48452 */ {(13<<2)|2,{67,108,0}}, +/* 48453 */ {(13<<2)|2,{67,108,0}}, +/* 48454 */ {(13<<2)|2,{67,108,0}}, +/* 48455 */ {(13<<2)|2,{67,108,0}}, +/* 48456 */ {(13<<2)|2,{67,109,0}}, +/* 48457 */ {(13<<2)|2,{67,109,0}}, +/* 48458 */ {(13<<2)|2,{67,109,0}}, +/* 48459 */ {(13<<2)|2,{67,109,0}}, +/* 48460 */ {(13<<2)|2,{67,109,0}}, +/* 48461 */ {(13<<2)|2,{67,109,0}}, +/* 48462 */ {(13<<2)|2,{67,109,0}}, +/* 48463 */ {(13<<2)|2,{67,109,0}}, +/* 48464 */ {(13<<2)|2,{67,110,0}}, +/* 48465 */ {(13<<2)|2,{67,110,0}}, +/* 48466 */ {(13<<2)|2,{67,110,0}}, +/* 48467 */ {(13<<2)|2,{67,110,0}}, +/* 48468 */ {(13<<2)|2,{67,110,0}}, +/* 48469 */ {(13<<2)|2,{67,110,0}}, +/* 48470 */ {(13<<2)|2,{67,110,0}}, +/* 48471 */ {(13<<2)|2,{67,110,0}}, +/* 48472 */ {(13<<2)|2,{67,112,0}}, +/* 48473 */ {(13<<2)|2,{67,112,0}}, +/* 48474 */ {(13<<2)|2,{67,112,0}}, +/* 48475 */ {(13<<2)|2,{67,112,0}}, +/* 48476 */ {(13<<2)|2,{67,112,0}}, +/* 48477 */ {(13<<2)|2,{67,112,0}}, +/* 48478 */ {(13<<2)|2,{67,112,0}}, +/* 48479 */ {(13<<2)|2,{67,112,0}}, +/* 48480 */ {(13<<2)|2,{67,114,0}}, +/* 48481 */ {(13<<2)|2,{67,114,0}}, +/* 48482 */ {(13<<2)|2,{67,114,0}}, +/* 48483 */ {(13<<2)|2,{67,114,0}}, +/* 48484 */ {(13<<2)|2,{67,114,0}}, +/* 48485 */ {(13<<2)|2,{67,114,0}}, +/* 48486 */ {(13<<2)|2,{67,114,0}}, +/* 48487 */ {(13<<2)|2,{67,114,0}}, +/* 48488 */ {(13<<2)|2,{67,117,0}}, +/* 48489 */ {(13<<2)|2,{67,117,0}}, +/* 48490 */ {(13<<2)|2,{67,117,0}}, +/* 48491 */ {(13<<2)|2,{67,117,0}}, +/* 48492 */ {(13<<2)|2,{67,117,0}}, +/* 48493 */ {(13<<2)|2,{67,117,0}}, +/* 48494 */ {(13<<2)|2,{67,117,0}}, +/* 48495 */ {(13<<2)|2,{67,117,0}}, +/* 48496 */ {(14<<2)|2,{67,58,0}}, +/* 48497 */ {(14<<2)|2,{67,58,0}}, +/* 48498 */ {(14<<2)|2,{67,58,0}}, +/* 48499 */ {(14<<2)|2,{67,58,0}}, +/* 48500 */ {(14<<2)|2,{67,66,0}}, +/* 48501 */ {(14<<2)|2,{67,66,0}}, +/* 48502 */ {(14<<2)|2,{67,66,0}}, +/* 48503 */ {(14<<2)|2,{67,66,0}}, +/* 48504 */ {(14<<2)|2,{67,67,0}}, +/* 48505 */ {(14<<2)|2,{67,67,0}}, +/* 48506 */ {(14<<2)|2,{67,67,0}}, +/* 48507 */ {(14<<2)|2,{67,67,0}}, +/* 48508 */ {(14<<2)|2,{67,68,0}}, +/* 48509 */ {(14<<2)|2,{67,68,0}}, +/* 48510 */ {(14<<2)|2,{67,68,0}}, +/* 48511 */ {(14<<2)|2,{67,68,0}}, +/* 48512 */ {(14<<2)|2,{67,69,0}}, +/* 48513 */ {(14<<2)|2,{67,69,0}}, +/* 48514 */ {(14<<2)|2,{67,69,0}}, +/* 48515 */ {(14<<2)|2,{67,69,0}}, +/* 48516 */ {(14<<2)|2,{67,70,0}}, +/* 48517 */ {(14<<2)|2,{67,70,0}}, +/* 48518 */ {(14<<2)|2,{67,70,0}}, +/* 48519 */ {(14<<2)|2,{67,70,0}}, +/* 48520 */ {(14<<2)|2,{67,71,0}}, +/* 48521 */ {(14<<2)|2,{67,71,0}}, +/* 48522 */ {(14<<2)|2,{67,71,0}}, +/* 48523 */ {(14<<2)|2,{67,71,0}}, +/* 48524 */ {(14<<2)|2,{67,72,0}}, +/* 48525 */ {(14<<2)|2,{67,72,0}}, +/* 48526 */ {(14<<2)|2,{67,72,0}}, +/* 48527 */ {(14<<2)|2,{67,72,0}}, +/* 48528 */ {(14<<2)|2,{67,73,0}}, +/* 48529 */ {(14<<2)|2,{67,73,0}}, +/* 48530 */ {(14<<2)|2,{67,73,0}}, +/* 48531 */ {(14<<2)|2,{67,73,0}}, +/* 48532 */ {(14<<2)|2,{67,74,0}}, +/* 48533 */ {(14<<2)|2,{67,74,0}}, +/* 48534 */ {(14<<2)|2,{67,74,0}}, +/* 48535 */ {(14<<2)|2,{67,74,0}}, +/* 48536 */ {(14<<2)|2,{67,75,0}}, +/* 48537 */ {(14<<2)|2,{67,75,0}}, +/* 48538 */ {(14<<2)|2,{67,75,0}}, +/* 48539 */ {(14<<2)|2,{67,75,0}}, +/* 48540 */ {(14<<2)|2,{67,76,0}}, +/* 48541 */ {(14<<2)|2,{67,76,0}}, +/* 48542 */ {(14<<2)|2,{67,76,0}}, +/* 48543 */ {(14<<2)|2,{67,76,0}}, +/* 48544 */ {(14<<2)|2,{67,77,0}}, +/* 48545 */ {(14<<2)|2,{67,77,0}}, +/* 48546 */ {(14<<2)|2,{67,77,0}}, +/* 48547 */ {(14<<2)|2,{67,77,0}}, +/* 48548 */ {(14<<2)|2,{67,78,0}}, +/* 48549 */ {(14<<2)|2,{67,78,0}}, +/* 48550 */ {(14<<2)|2,{67,78,0}}, +/* 48551 */ {(14<<2)|2,{67,78,0}}, +/* 48552 */ {(14<<2)|2,{67,79,0}}, +/* 48553 */ {(14<<2)|2,{67,79,0}}, +/* 48554 */ {(14<<2)|2,{67,79,0}}, +/* 48555 */ {(14<<2)|2,{67,79,0}}, +/* 48556 */ {(14<<2)|2,{67,80,0}}, +/* 48557 */ {(14<<2)|2,{67,80,0}}, +/* 48558 */ {(14<<2)|2,{67,80,0}}, +/* 48559 */ {(14<<2)|2,{67,80,0}}, +/* 48560 */ {(14<<2)|2,{67,81,0}}, +/* 48561 */ {(14<<2)|2,{67,81,0}}, +/* 48562 */ {(14<<2)|2,{67,81,0}}, +/* 48563 */ {(14<<2)|2,{67,81,0}}, +/* 48564 */ {(14<<2)|2,{67,82,0}}, +/* 48565 */ {(14<<2)|2,{67,82,0}}, +/* 48566 */ {(14<<2)|2,{67,82,0}}, +/* 48567 */ {(14<<2)|2,{67,82,0}}, +/* 48568 */ {(14<<2)|2,{67,83,0}}, +/* 48569 */ {(14<<2)|2,{67,83,0}}, +/* 48570 */ {(14<<2)|2,{67,83,0}}, +/* 48571 */ {(14<<2)|2,{67,83,0}}, +/* 48572 */ {(14<<2)|2,{67,84,0}}, +/* 48573 */ {(14<<2)|2,{67,84,0}}, +/* 48574 */ {(14<<2)|2,{67,84,0}}, +/* 48575 */ {(14<<2)|2,{67,84,0}}, +/* 48576 */ {(14<<2)|2,{67,85,0}}, +/* 48577 */ {(14<<2)|2,{67,85,0}}, +/* 48578 */ {(14<<2)|2,{67,85,0}}, +/* 48579 */ {(14<<2)|2,{67,85,0}}, +/* 48580 */ {(14<<2)|2,{67,86,0}}, +/* 48581 */ {(14<<2)|2,{67,86,0}}, +/* 48582 */ {(14<<2)|2,{67,86,0}}, +/* 48583 */ {(14<<2)|2,{67,86,0}}, +/* 48584 */ {(14<<2)|2,{67,87,0}}, +/* 48585 */ {(14<<2)|2,{67,87,0}}, +/* 48586 */ {(14<<2)|2,{67,87,0}}, +/* 48587 */ {(14<<2)|2,{67,87,0}}, +/* 48588 */ {(14<<2)|2,{67,89,0}}, +/* 48589 */ {(14<<2)|2,{67,89,0}}, +/* 48590 */ {(14<<2)|2,{67,89,0}}, +/* 48591 */ {(14<<2)|2,{67,89,0}}, +/* 48592 */ {(14<<2)|2,{67,106,0}}, +/* 48593 */ {(14<<2)|2,{67,106,0}}, +/* 48594 */ {(14<<2)|2,{67,106,0}}, +/* 48595 */ {(14<<2)|2,{67,106,0}}, +/* 48596 */ {(14<<2)|2,{67,107,0}}, +/* 48597 */ {(14<<2)|2,{67,107,0}}, +/* 48598 */ {(14<<2)|2,{67,107,0}}, +/* 48599 */ {(14<<2)|2,{67,107,0}}, +/* 48600 */ {(14<<2)|2,{67,113,0}}, +/* 48601 */ {(14<<2)|2,{67,113,0}}, +/* 48602 */ {(14<<2)|2,{67,113,0}}, +/* 48603 */ {(14<<2)|2,{67,113,0}}, +/* 48604 */ {(14<<2)|2,{67,118,0}}, +/* 48605 */ {(14<<2)|2,{67,118,0}}, +/* 48606 */ {(14<<2)|2,{67,118,0}}, +/* 48607 */ {(14<<2)|2,{67,118,0}}, +/* 48608 */ {(14<<2)|2,{67,119,0}}, +/* 48609 */ {(14<<2)|2,{67,119,0}}, +/* 48610 */ {(14<<2)|2,{67,119,0}}, +/* 48611 */ {(14<<2)|2,{67,119,0}}, +/* 48612 */ {(14<<2)|2,{67,120,0}}, +/* 48613 */ {(14<<2)|2,{67,120,0}}, +/* 48614 */ {(14<<2)|2,{67,120,0}}, +/* 48615 */ {(14<<2)|2,{67,120,0}}, +/* 48616 */ {(14<<2)|2,{67,121,0}}, +/* 48617 */ {(14<<2)|2,{67,121,0}}, +/* 48618 */ {(14<<2)|2,{67,121,0}}, +/* 48619 */ {(14<<2)|2,{67,121,0}}, +/* 48620 */ {(14<<2)|2,{67,122,0}}, +/* 48621 */ {(14<<2)|2,{67,122,0}}, +/* 48622 */ {(14<<2)|2,{67,122,0}}, +/* 48623 */ {(14<<2)|2,{67,122,0}}, +/* 48624 */ {(15<<2)|2,{67,38,0}}, +/* 48625 */ {(15<<2)|2,{67,38,0}}, +/* 48626 */ {(15<<2)|2,{67,42,0}}, +/* 48627 */ {(15<<2)|2,{67,42,0}}, +/* 48628 */ {(15<<2)|2,{67,44,0}}, +/* 48629 */ {(15<<2)|2,{67,44,0}}, +/* 48630 */ {(15<<2)|2,{67,59,0}}, +/* 48631 */ {(15<<2)|2,{67,59,0}}, +/* 48632 */ {(15<<2)|2,{67,88,0}}, +/* 48633 */ {(15<<2)|2,{67,88,0}}, +/* 48634 */ {(15<<2)|2,{67,90,0}}, +/* 48635 */ {(15<<2)|2,{67,90,0}}, +/* 48636 */ {(7<<2)|1,{67,0,0}}, +/* 48637 */ {(7<<2)|1,{67,0,0}}, +/* 48638 */ {(7<<2)|1,{67,0,0}}, +/* 48639 */ {(7<<2)|1,{67,0,0}}, +/* 48640 */ {(12<<2)|2,{68,48,0}}, +/* 48641 */ {(12<<2)|2,{68,48,0}}, +/* 48642 */ {(12<<2)|2,{68,48,0}}, +/* 48643 */ {(12<<2)|2,{68,48,0}}, +/* 48644 */ {(12<<2)|2,{68,48,0}}, +/* 48645 */ {(12<<2)|2,{68,48,0}}, +/* 48646 */ {(12<<2)|2,{68,48,0}}, +/* 48647 */ {(12<<2)|2,{68,48,0}}, +/* 48648 */ {(12<<2)|2,{68,48,0}}, +/* 48649 */ {(12<<2)|2,{68,48,0}}, +/* 48650 */ {(12<<2)|2,{68,48,0}}, +/* 48651 */ {(12<<2)|2,{68,48,0}}, +/* 48652 */ {(12<<2)|2,{68,48,0}}, +/* 48653 */ {(12<<2)|2,{68,48,0}}, +/* 48654 */ {(12<<2)|2,{68,48,0}}, +/* 48655 */ {(12<<2)|2,{68,48,0}}, +/* 48656 */ {(12<<2)|2,{68,49,0}}, +/* 48657 */ {(12<<2)|2,{68,49,0}}, +/* 48658 */ {(12<<2)|2,{68,49,0}}, +/* 48659 */ {(12<<2)|2,{68,49,0}}, +/* 48660 */ {(12<<2)|2,{68,49,0}}, +/* 48661 */ {(12<<2)|2,{68,49,0}}, +/* 48662 */ {(12<<2)|2,{68,49,0}}, +/* 48663 */ {(12<<2)|2,{68,49,0}}, +/* 48664 */ {(12<<2)|2,{68,49,0}}, +/* 48665 */ {(12<<2)|2,{68,49,0}}, +/* 48666 */ {(12<<2)|2,{68,49,0}}, +/* 48667 */ {(12<<2)|2,{68,49,0}}, +/* 48668 */ {(12<<2)|2,{68,49,0}}, +/* 48669 */ {(12<<2)|2,{68,49,0}}, +/* 48670 */ {(12<<2)|2,{68,49,0}}, +/* 48671 */ {(12<<2)|2,{68,49,0}}, +/* 48672 */ {(12<<2)|2,{68,50,0}}, +/* 48673 */ {(12<<2)|2,{68,50,0}}, +/* 48674 */ {(12<<2)|2,{68,50,0}}, +/* 48675 */ {(12<<2)|2,{68,50,0}}, +/* 48676 */ {(12<<2)|2,{68,50,0}}, +/* 48677 */ {(12<<2)|2,{68,50,0}}, +/* 48678 */ {(12<<2)|2,{68,50,0}}, +/* 48679 */ {(12<<2)|2,{68,50,0}}, +/* 48680 */ {(12<<2)|2,{68,50,0}}, +/* 48681 */ {(12<<2)|2,{68,50,0}}, +/* 48682 */ {(12<<2)|2,{68,50,0}}, +/* 48683 */ {(12<<2)|2,{68,50,0}}, +/* 48684 */ {(12<<2)|2,{68,50,0}}, +/* 48685 */ {(12<<2)|2,{68,50,0}}, +/* 48686 */ {(12<<2)|2,{68,50,0}}, +/* 48687 */ {(12<<2)|2,{68,50,0}}, +/* 48688 */ {(12<<2)|2,{68,97,0}}, +/* 48689 */ {(12<<2)|2,{68,97,0}}, +/* 48690 */ {(12<<2)|2,{68,97,0}}, +/* 48691 */ {(12<<2)|2,{68,97,0}}, +/* 48692 */ {(12<<2)|2,{68,97,0}}, +/* 48693 */ {(12<<2)|2,{68,97,0}}, +/* 48694 */ {(12<<2)|2,{68,97,0}}, +/* 48695 */ {(12<<2)|2,{68,97,0}}, +/* 48696 */ {(12<<2)|2,{68,97,0}}, +/* 48697 */ {(12<<2)|2,{68,97,0}}, +/* 48698 */ {(12<<2)|2,{68,97,0}}, +/* 48699 */ {(12<<2)|2,{68,97,0}}, +/* 48700 */ {(12<<2)|2,{68,97,0}}, +/* 48701 */ {(12<<2)|2,{68,97,0}}, +/* 48702 */ {(12<<2)|2,{68,97,0}}, +/* 48703 */ {(12<<2)|2,{68,97,0}}, +/* 48704 */ {(12<<2)|2,{68,99,0}}, +/* 48705 */ {(12<<2)|2,{68,99,0}}, +/* 48706 */ {(12<<2)|2,{68,99,0}}, +/* 48707 */ {(12<<2)|2,{68,99,0}}, +/* 48708 */ {(12<<2)|2,{68,99,0}}, +/* 48709 */ {(12<<2)|2,{68,99,0}}, +/* 48710 */ {(12<<2)|2,{68,99,0}}, +/* 48711 */ {(12<<2)|2,{68,99,0}}, +/* 48712 */ {(12<<2)|2,{68,99,0}}, +/* 48713 */ {(12<<2)|2,{68,99,0}}, +/* 48714 */ {(12<<2)|2,{68,99,0}}, +/* 48715 */ {(12<<2)|2,{68,99,0}}, +/* 48716 */ {(12<<2)|2,{68,99,0}}, +/* 48717 */ {(12<<2)|2,{68,99,0}}, +/* 48718 */ {(12<<2)|2,{68,99,0}}, +/* 48719 */ {(12<<2)|2,{68,99,0}}, +/* 48720 */ {(12<<2)|2,{68,101,0}}, +/* 48721 */ {(12<<2)|2,{68,101,0}}, +/* 48722 */ {(12<<2)|2,{68,101,0}}, +/* 48723 */ {(12<<2)|2,{68,101,0}}, +/* 48724 */ {(12<<2)|2,{68,101,0}}, +/* 48725 */ {(12<<2)|2,{68,101,0}}, +/* 48726 */ {(12<<2)|2,{68,101,0}}, +/* 48727 */ {(12<<2)|2,{68,101,0}}, +/* 48728 */ {(12<<2)|2,{68,101,0}}, +/* 48729 */ {(12<<2)|2,{68,101,0}}, +/* 48730 */ {(12<<2)|2,{68,101,0}}, +/* 48731 */ {(12<<2)|2,{68,101,0}}, +/* 48732 */ {(12<<2)|2,{68,101,0}}, +/* 48733 */ {(12<<2)|2,{68,101,0}}, +/* 48734 */ {(12<<2)|2,{68,101,0}}, +/* 48735 */ {(12<<2)|2,{68,101,0}}, +/* 48736 */ {(12<<2)|2,{68,105,0}}, +/* 48737 */ {(12<<2)|2,{68,105,0}}, +/* 48738 */ {(12<<2)|2,{68,105,0}}, +/* 48739 */ {(12<<2)|2,{68,105,0}}, +/* 48740 */ {(12<<2)|2,{68,105,0}}, +/* 48741 */ {(12<<2)|2,{68,105,0}}, +/* 48742 */ {(12<<2)|2,{68,105,0}}, +/* 48743 */ {(12<<2)|2,{68,105,0}}, +/* 48744 */ {(12<<2)|2,{68,105,0}}, +/* 48745 */ {(12<<2)|2,{68,105,0}}, +/* 48746 */ {(12<<2)|2,{68,105,0}}, +/* 48747 */ {(12<<2)|2,{68,105,0}}, +/* 48748 */ {(12<<2)|2,{68,105,0}}, +/* 48749 */ {(12<<2)|2,{68,105,0}}, +/* 48750 */ {(12<<2)|2,{68,105,0}}, +/* 48751 */ {(12<<2)|2,{68,105,0}}, +/* 48752 */ {(12<<2)|2,{68,111,0}}, +/* 48753 */ {(12<<2)|2,{68,111,0}}, +/* 48754 */ {(12<<2)|2,{68,111,0}}, +/* 48755 */ {(12<<2)|2,{68,111,0}}, +/* 48756 */ {(12<<2)|2,{68,111,0}}, +/* 48757 */ {(12<<2)|2,{68,111,0}}, +/* 48758 */ {(12<<2)|2,{68,111,0}}, +/* 48759 */ {(12<<2)|2,{68,111,0}}, +/* 48760 */ {(12<<2)|2,{68,111,0}}, +/* 48761 */ {(12<<2)|2,{68,111,0}}, +/* 48762 */ {(12<<2)|2,{68,111,0}}, +/* 48763 */ {(12<<2)|2,{68,111,0}}, +/* 48764 */ {(12<<2)|2,{68,111,0}}, +/* 48765 */ {(12<<2)|2,{68,111,0}}, +/* 48766 */ {(12<<2)|2,{68,111,0}}, +/* 48767 */ {(12<<2)|2,{68,111,0}}, +/* 48768 */ {(12<<2)|2,{68,115,0}}, +/* 48769 */ {(12<<2)|2,{68,115,0}}, +/* 48770 */ {(12<<2)|2,{68,115,0}}, +/* 48771 */ {(12<<2)|2,{68,115,0}}, +/* 48772 */ {(12<<2)|2,{68,115,0}}, +/* 48773 */ {(12<<2)|2,{68,115,0}}, +/* 48774 */ {(12<<2)|2,{68,115,0}}, +/* 48775 */ {(12<<2)|2,{68,115,0}}, +/* 48776 */ {(12<<2)|2,{68,115,0}}, +/* 48777 */ {(12<<2)|2,{68,115,0}}, +/* 48778 */ {(12<<2)|2,{68,115,0}}, +/* 48779 */ {(12<<2)|2,{68,115,0}}, +/* 48780 */ {(12<<2)|2,{68,115,0}}, +/* 48781 */ {(12<<2)|2,{68,115,0}}, +/* 48782 */ {(12<<2)|2,{68,115,0}}, +/* 48783 */ {(12<<2)|2,{68,115,0}}, +/* 48784 */ {(12<<2)|2,{68,116,0}}, +/* 48785 */ {(12<<2)|2,{68,116,0}}, +/* 48786 */ {(12<<2)|2,{68,116,0}}, +/* 48787 */ {(12<<2)|2,{68,116,0}}, +/* 48788 */ {(12<<2)|2,{68,116,0}}, +/* 48789 */ {(12<<2)|2,{68,116,0}}, +/* 48790 */ {(12<<2)|2,{68,116,0}}, +/* 48791 */ {(12<<2)|2,{68,116,0}}, +/* 48792 */ {(12<<2)|2,{68,116,0}}, +/* 48793 */ {(12<<2)|2,{68,116,0}}, +/* 48794 */ {(12<<2)|2,{68,116,0}}, +/* 48795 */ {(12<<2)|2,{68,116,0}}, +/* 48796 */ {(12<<2)|2,{68,116,0}}, +/* 48797 */ {(12<<2)|2,{68,116,0}}, +/* 48798 */ {(12<<2)|2,{68,116,0}}, +/* 48799 */ {(12<<2)|2,{68,116,0}}, +/* 48800 */ {(13<<2)|2,{68,32,0}}, +/* 48801 */ {(13<<2)|2,{68,32,0}}, +/* 48802 */ {(13<<2)|2,{68,32,0}}, +/* 48803 */ {(13<<2)|2,{68,32,0}}, +/* 48804 */ {(13<<2)|2,{68,32,0}}, +/* 48805 */ {(13<<2)|2,{68,32,0}}, +/* 48806 */ {(13<<2)|2,{68,32,0}}, +/* 48807 */ {(13<<2)|2,{68,32,0}}, +/* 48808 */ {(13<<2)|2,{68,37,0}}, +/* 48809 */ {(13<<2)|2,{68,37,0}}, +/* 48810 */ {(13<<2)|2,{68,37,0}}, +/* 48811 */ {(13<<2)|2,{68,37,0}}, +/* 48812 */ {(13<<2)|2,{68,37,0}}, +/* 48813 */ {(13<<2)|2,{68,37,0}}, +/* 48814 */ {(13<<2)|2,{68,37,0}}, +/* 48815 */ {(13<<2)|2,{68,37,0}}, +/* 48816 */ {(13<<2)|2,{68,45,0}}, +/* 48817 */ {(13<<2)|2,{68,45,0}}, +/* 48818 */ {(13<<2)|2,{68,45,0}}, +/* 48819 */ {(13<<2)|2,{68,45,0}}, +/* 48820 */ {(13<<2)|2,{68,45,0}}, +/* 48821 */ {(13<<2)|2,{68,45,0}}, +/* 48822 */ {(13<<2)|2,{68,45,0}}, +/* 48823 */ {(13<<2)|2,{68,45,0}}, +/* 48824 */ {(13<<2)|2,{68,46,0}}, +/* 48825 */ {(13<<2)|2,{68,46,0}}, +/* 48826 */ {(13<<2)|2,{68,46,0}}, +/* 48827 */ {(13<<2)|2,{68,46,0}}, +/* 48828 */ {(13<<2)|2,{68,46,0}}, +/* 48829 */ {(13<<2)|2,{68,46,0}}, +/* 48830 */ {(13<<2)|2,{68,46,0}}, +/* 48831 */ {(13<<2)|2,{68,46,0}}, +/* 48832 */ {(13<<2)|2,{68,47,0}}, +/* 48833 */ {(13<<2)|2,{68,47,0}}, +/* 48834 */ {(13<<2)|2,{68,47,0}}, +/* 48835 */ {(13<<2)|2,{68,47,0}}, +/* 48836 */ {(13<<2)|2,{68,47,0}}, +/* 48837 */ {(13<<2)|2,{68,47,0}}, +/* 48838 */ {(13<<2)|2,{68,47,0}}, +/* 48839 */ {(13<<2)|2,{68,47,0}}, +/* 48840 */ {(13<<2)|2,{68,51,0}}, +/* 48841 */ {(13<<2)|2,{68,51,0}}, +/* 48842 */ {(13<<2)|2,{68,51,0}}, +/* 48843 */ {(13<<2)|2,{68,51,0}}, +/* 48844 */ {(13<<2)|2,{68,51,0}}, +/* 48845 */ {(13<<2)|2,{68,51,0}}, +/* 48846 */ {(13<<2)|2,{68,51,0}}, +/* 48847 */ {(13<<2)|2,{68,51,0}}, +/* 48848 */ {(13<<2)|2,{68,52,0}}, +/* 48849 */ {(13<<2)|2,{68,52,0}}, +/* 48850 */ {(13<<2)|2,{68,52,0}}, +/* 48851 */ {(13<<2)|2,{68,52,0}}, +/* 48852 */ {(13<<2)|2,{68,52,0}}, +/* 48853 */ {(13<<2)|2,{68,52,0}}, +/* 48854 */ {(13<<2)|2,{68,52,0}}, +/* 48855 */ {(13<<2)|2,{68,52,0}}, +/* 48856 */ {(13<<2)|2,{68,53,0}}, +/* 48857 */ {(13<<2)|2,{68,53,0}}, +/* 48858 */ {(13<<2)|2,{68,53,0}}, +/* 48859 */ {(13<<2)|2,{68,53,0}}, +/* 48860 */ {(13<<2)|2,{68,53,0}}, +/* 48861 */ {(13<<2)|2,{68,53,0}}, +/* 48862 */ {(13<<2)|2,{68,53,0}}, +/* 48863 */ {(13<<2)|2,{68,53,0}}, +/* 48864 */ {(13<<2)|2,{68,54,0}}, +/* 48865 */ {(13<<2)|2,{68,54,0}}, +/* 48866 */ {(13<<2)|2,{68,54,0}}, +/* 48867 */ {(13<<2)|2,{68,54,0}}, +/* 48868 */ {(13<<2)|2,{68,54,0}}, +/* 48869 */ {(13<<2)|2,{68,54,0}}, +/* 48870 */ {(13<<2)|2,{68,54,0}}, +/* 48871 */ {(13<<2)|2,{68,54,0}}, +/* 48872 */ {(13<<2)|2,{68,55,0}}, +/* 48873 */ {(13<<2)|2,{68,55,0}}, +/* 48874 */ {(13<<2)|2,{68,55,0}}, +/* 48875 */ {(13<<2)|2,{68,55,0}}, +/* 48876 */ {(13<<2)|2,{68,55,0}}, +/* 48877 */ {(13<<2)|2,{68,55,0}}, +/* 48878 */ {(13<<2)|2,{68,55,0}}, +/* 48879 */ {(13<<2)|2,{68,55,0}}, +/* 48880 */ {(13<<2)|2,{68,56,0}}, +/* 48881 */ {(13<<2)|2,{68,56,0}}, +/* 48882 */ {(13<<2)|2,{68,56,0}}, +/* 48883 */ {(13<<2)|2,{68,56,0}}, +/* 48884 */ {(13<<2)|2,{68,56,0}}, +/* 48885 */ {(13<<2)|2,{68,56,0}}, +/* 48886 */ {(13<<2)|2,{68,56,0}}, +/* 48887 */ {(13<<2)|2,{68,56,0}}, +/* 48888 */ {(13<<2)|2,{68,57,0}}, +/* 48889 */ {(13<<2)|2,{68,57,0}}, +/* 48890 */ {(13<<2)|2,{68,57,0}}, +/* 48891 */ {(13<<2)|2,{68,57,0}}, +/* 48892 */ {(13<<2)|2,{68,57,0}}, +/* 48893 */ {(13<<2)|2,{68,57,0}}, +/* 48894 */ {(13<<2)|2,{68,57,0}}, +/* 48895 */ {(13<<2)|2,{68,57,0}}, +/* 48896 */ {(13<<2)|2,{68,61,0}}, +/* 48897 */ {(13<<2)|2,{68,61,0}}, +/* 48898 */ {(13<<2)|2,{68,61,0}}, +/* 48899 */ {(13<<2)|2,{68,61,0}}, +/* 48900 */ {(13<<2)|2,{68,61,0}}, +/* 48901 */ {(13<<2)|2,{68,61,0}}, +/* 48902 */ {(13<<2)|2,{68,61,0}}, +/* 48903 */ {(13<<2)|2,{68,61,0}}, +/* 48904 */ {(13<<2)|2,{68,65,0}}, +/* 48905 */ {(13<<2)|2,{68,65,0}}, +/* 48906 */ {(13<<2)|2,{68,65,0}}, +/* 48907 */ {(13<<2)|2,{68,65,0}}, +/* 48908 */ {(13<<2)|2,{68,65,0}}, +/* 48909 */ {(13<<2)|2,{68,65,0}}, +/* 48910 */ {(13<<2)|2,{68,65,0}}, +/* 48911 */ {(13<<2)|2,{68,65,0}}, +/* 48912 */ {(13<<2)|2,{68,95,0}}, +/* 48913 */ {(13<<2)|2,{68,95,0}}, +/* 48914 */ {(13<<2)|2,{68,95,0}}, +/* 48915 */ {(13<<2)|2,{68,95,0}}, +/* 48916 */ {(13<<2)|2,{68,95,0}}, +/* 48917 */ {(13<<2)|2,{68,95,0}}, +/* 48918 */ {(13<<2)|2,{68,95,0}}, +/* 48919 */ {(13<<2)|2,{68,95,0}}, +/* 48920 */ {(13<<2)|2,{68,98,0}}, +/* 48921 */ {(13<<2)|2,{68,98,0}}, +/* 48922 */ {(13<<2)|2,{68,98,0}}, +/* 48923 */ {(13<<2)|2,{68,98,0}}, +/* 48924 */ {(13<<2)|2,{68,98,0}}, +/* 48925 */ {(13<<2)|2,{68,98,0}}, +/* 48926 */ {(13<<2)|2,{68,98,0}}, +/* 48927 */ {(13<<2)|2,{68,98,0}}, +/* 48928 */ {(13<<2)|2,{68,100,0}}, +/* 48929 */ {(13<<2)|2,{68,100,0}}, +/* 48930 */ {(13<<2)|2,{68,100,0}}, +/* 48931 */ {(13<<2)|2,{68,100,0}}, +/* 48932 */ {(13<<2)|2,{68,100,0}}, +/* 48933 */ {(13<<2)|2,{68,100,0}}, +/* 48934 */ {(13<<2)|2,{68,100,0}}, +/* 48935 */ {(13<<2)|2,{68,100,0}}, +/* 48936 */ {(13<<2)|2,{68,102,0}}, +/* 48937 */ {(13<<2)|2,{68,102,0}}, +/* 48938 */ {(13<<2)|2,{68,102,0}}, +/* 48939 */ {(13<<2)|2,{68,102,0}}, +/* 48940 */ {(13<<2)|2,{68,102,0}}, +/* 48941 */ {(13<<2)|2,{68,102,0}}, +/* 48942 */ {(13<<2)|2,{68,102,0}}, +/* 48943 */ {(13<<2)|2,{68,102,0}}, +/* 48944 */ {(13<<2)|2,{68,103,0}}, +/* 48945 */ {(13<<2)|2,{68,103,0}}, +/* 48946 */ {(13<<2)|2,{68,103,0}}, +/* 48947 */ {(13<<2)|2,{68,103,0}}, +/* 48948 */ {(13<<2)|2,{68,103,0}}, +/* 48949 */ {(13<<2)|2,{68,103,0}}, +/* 48950 */ {(13<<2)|2,{68,103,0}}, +/* 48951 */ {(13<<2)|2,{68,103,0}}, +/* 48952 */ {(13<<2)|2,{68,104,0}}, +/* 48953 */ {(13<<2)|2,{68,104,0}}, +/* 48954 */ {(13<<2)|2,{68,104,0}}, +/* 48955 */ {(13<<2)|2,{68,104,0}}, +/* 48956 */ {(13<<2)|2,{68,104,0}}, +/* 48957 */ {(13<<2)|2,{68,104,0}}, +/* 48958 */ {(13<<2)|2,{68,104,0}}, +/* 48959 */ {(13<<2)|2,{68,104,0}}, +/* 48960 */ {(13<<2)|2,{68,108,0}}, +/* 48961 */ {(13<<2)|2,{68,108,0}}, +/* 48962 */ {(13<<2)|2,{68,108,0}}, +/* 48963 */ {(13<<2)|2,{68,108,0}}, +/* 48964 */ {(13<<2)|2,{68,108,0}}, +/* 48965 */ {(13<<2)|2,{68,108,0}}, +/* 48966 */ {(13<<2)|2,{68,108,0}}, +/* 48967 */ {(13<<2)|2,{68,108,0}}, +/* 48968 */ {(13<<2)|2,{68,109,0}}, +/* 48969 */ {(13<<2)|2,{68,109,0}}, +/* 48970 */ {(13<<2)|2,{68,109,0}}, +/* 48971 */ {(13<<2)|2,{68,109,0}}, +/* 48972 */ {(13<<2)|2,{68,109,0}}, +/* 48973 */ {(13<<2)|2,{68,109,0}}, +/* 48974 */ {(13<<2)|2,{68,109,0}}, +/* 48975 */ {(13<<2)|2,{68,109,0}}, +/* 48976 */ {(13<<2)|2,{68,110,0}}, +/* 48977 */ {(13<<2)|2,{68,110,0}}, +/* 48978 */ {(13<<2)|2,{68,110,0}}, +/* 48979 */ {(13<<2)|2,{68,110,0}}, +/* 48980 */ {(13<<2)|2,{68,110,0}}, +/* 48981 */ {(13<<2)|2,{68,110,0}}, +/* 48982 */ {(13<<2)|2,{68,110,0}}, +/* 48983 */ {(13<<2)|2,{68,110,0}}, +/* 48984 */ {(13<<2)|2,{68,112,0}}, +/* 48985 */ {(13<<2)|2,{68,112,0}}, +/* 48986 */ {(13<<2)|2,{68,112,0}}, +/* 48987 */ {(13<<2)|2,{68,112,0}}, +/* 48988 */ {(13<<2)|2,{68,112,0}}, +/* 48989 */ {(13<<2)|2,{68,112,0}}, +/* 48990 */ {(13<<2)|2,{68,112,0}}, +/* 48991 */ {(13<<2)|2,{68,112,0}}, +/* 48992 */ {(13<<2)|2,{68,114,0}}, +/* 48993 */ {(13<<2)|2,{68,114,0}}, +/* 48994 */ {(13<<2)|2,{68,114,0}}, +/* 48995 */ {(13<<2)|2,{68,114,0}}, +/* 48996 */ {(13<<2)|2,{68,114,0}}, +/* 48997 */ {(13<<2)|2,{68,114,0}}, +/* 48998 */ {(13<<2)|2,{68,114,0}}, +/* 48999 */ {(13<<2)|2,{68,114,0}}, +/* 49000 */ {(13<<2)|2,{68,117,0}}, +/* 49001 */ {(13<<2)|2,{68,117,0}}, +/* 49002 */ {(13<<2)|2,{68,117,0}}, +/* 49003 */ {(13<<2)|2,{68,117,0}}, +/* 49004 */ {(13<<2)|2,{68,117,0}}, +/* 49005 */ {(13<<2)|2,{68,117,0}}, +/* 49006 */ {(13<<2)|2,{68,117,0}}, +/* 49007 */ {(13<<2)|2,{68,117,0}}, +/* 49008 */ {(14<<2)|2,{68,58,0}}, +/* 49009 */ {(14<<2)|2,{68,58,0}}, +/* 49010 */ {(14<<2)|2,{68,58,0}}, +/* 49011 */ {(14<<2)|2,{68,58,0}}, +/* 49012 */ {(14<<2)|2,{68,66,0}}, +/* 49013 */ {(14<<2)|2,{68,66,0}}, +/* 49014 */ {(14<<2)|2,{68,66,0}}, +/* 49015 */ {(14<<2)|2,{68,66,0}}, +/* 49016 */ {(14<<2)|2,{68,67,0}}, +/* 49017 */ {(14<<2)|2,{68,67,0}}, +/* 49018 */ {(14<<2)|2,{68,67,0}}, +/* 49019 */ {(14<<2)|2,{68,67,0}}, +/* 49020 */ {(14<<2)|2,{68,68,0}}, +/* 49021 */ {(14<<2)|2,{68,68,0}}, +/* 49022 */ {(14<<2)|2,{68,68,0}}, +/* 49023 */ {(14<<2)|2,{68,68,0}}, +/* 49024 */ {(14<<2)|2,{68,69,0}}, +/* 49025 */ {(14<<2)|2,{68,69,0}}, +/* 49026 */ {(14<<2)|2,{68,69,0}}, +/* 49027 */ {(14<<2)|2,{68,69,0}}, +/* 49028 */ {(14<<2)|2,{68,70,0}}, +/* 49029 */ {(14<<2)|2,{68,70,0}}, +/* 49030 */ {(14<<2)|2,{68,70,0}}, +/* 49031 */ {(14<<2)|2,{68,70,0}}, +/* 49032 */ {(14<<2)|2,{68,71,0}}, +/* 49033 */ {(14<<2)|2,{68,71,0}}, +/* 49034 */ {(14<<2)|2,{68,71,0}}, +/* 49035 */ {(14<<2)|2,{68,71,0}}, +/* 49036 */ {(14<<2)|2,{68,72,0}}, +/* 49037 */ {(14<<2)|2,{68,72,0}}, +/* 49038 */ {(14<<2)|2,{68,72,0}}, +/* 49039 */ {(14<<2)|2,{68,72,0}}, +/* 49040 */ {(14<<2)|2,{68,73,0}}, +/* 49041 */ {(14<<2)|2,{68,73,0}}, +/* 49042 */ {(14<<2)|2,{68,73,0}}, +/* 49043 */ {(14<<2)|2,{68,73,0}}, +/* 49044 */ {(14<<2)|2,{68,74,0}}, +/* 49045 */ {(14<<2)|2,{68,74,0}}, +/* 49046 */ {(14<<2)|2,{68,74,0}}, +/* 49047 */ {(14<<2)|2,{68,74,0}}, +/* 49048 */ {(14<<2)|2,{68,75,0}}, +/* 49049 */ {(14<<2)|2,{68,75,0}}, +/* 49050 */ {(14<<2)|2,{68,75,0}}, +/* 49051 */ {(14<<2)|2,{68,75,0}}, +/* 49052 */ {(14<<2)|2,{68,76,0}}, +/* 49053 */ {(14<<2)|2,{68,76,0}}, +/* 49054 */ {(14<<2)|2,{68,76,0}}, +/* 49055 */ {(14<<2)|2,{68,76,0}}, +/* 49056 */ {(14<<2)|2,{68,77,0}}, +/* 49057 */ {(14<<2)|2,{68,77,0}}, +/* 49058 */ {(14<<2)|2,{68,77,0}}, +/* 49059 */ {(14<<2)|2,{68,77,0}}, +/* 49060 */ {(14<<2)|2,{68,78,0}}, +/* 49061 */ {(14<<2)|2,{68,78,0}}, +/* 49062 */ {(14<<2)|2,{68,78,0}}, +/* 49063 */ {(14<<2)|2,{68,78,0}}, +/* 49064 */ {(14<<2)|2,{68,79,0}}, +/* 49065 */ {(14<<2)|2,{68,79,0}}, +/* 49066 */ {(14<<2)|2,{68,79,0}}, +/* 49067 */ {(14<<2)|2,{68,79,0}}, +/* 49068 */ {(14<<2)|2,{68,80,0}}, +/* 49069 */ {(14<<2)|2,{68,80,0}}, +/* 49070 */ {(14<<2)|2,{68,80,0}}, +/* 49071 */ {(14<<2)|2,{68,80,0}}, +/* 49072 */ {(14<<2)|2,{68,81,0}}, +/* 49073 */ {(14<<2)|2,{68,81,0}}, +/* 49074 */ {(14<<2)|2,{68,81,0}}, +/* 49075 */ {(14<<2)|2,{68,81,0}}, +/* 49076 */ {(14<<2)|2,{68,82,0}}, +/* 49077 */ {(14<<2)|2,{68,82,0}}, +/* 49078 */ {(14<<2)|2,{68,82,0}}, +/* 49079 */ {(14<<2)|2,{68,82,0}}, +/* 49080 */ {(14<<2)|2,{68,83,0}}, +/* 49081 */ {(14<<2)|2,{68,83,0}}, +/* 49082 */ {(14<<2)|2,{68,83,0}}, +/* 49083 */ {(14<<2)|2,{68,83,0}}, +/* 49084 */ {(14<<2)|2,{68,84,0}}, +/* 49085 */ {(14<<2)|2,{68,84,0}}, +/* 49086 */ {(14<<2)|2,{68,84,0}}, +/* 49087 */ {(14<<2)|2,{68,84,0}}, +/* 49088 */ {(14<<2)|2,{68,85,0}}, +/* 49089 */ {(14<<2)|2,{68,85,0}}, +/* 49090 */ {(14<<2)|2,{68,85,0}}, +/* 49091 */ {(14<<2)|2,{68,85,0}}, +/* 49092 */ {(14<<2)|2,{68,86,0}}, +/* 49093 */ {(14<<2)|2,{68,86,0}}, +/* 49094 */ {(14<<2)|2,{68,86,0}}, +/* 49095 */ {(14<<2)|2,{68,86,0}}, +/* 49096 */ {(14<<2)|2,{68,87,0}}, +/* 49097 */ {(14<<2)|2,{68,87,0}}, +/* 49098 */ {(14<<2)|2,{68,87,0}}, +/* 49099 */ {(14<<2)|2,{68,87,0}}, +/* 49100 */ {(14<<2)|2,{68,89,0}}, +/* 49101 */ {(14<<2)|2,{68,89,0}}, +/* 49102 */ {(14<<2)|2,{68,89,0}}, +/* 49103 */ {(14<<2)|2,{68,89,0}}, +/* 49104 */ {(14<<2)|2,{68,106,0}}, +/* 49105 */ {(14<<2)|2,{68,106,0}}, +/* 49106 */ {(14<<2)|2,{68,106,0}}, +/* 49107 */ {(14<<2)|2,{68,106,0}}, +/* 49108 */ {(14<<2)|2,{68,107,0}}, +/* 49109 */ {(14<<2)|2,{68,107,0}}, +/* 49110 */ {(14<<2)|2,{68,107,0}}, +/* 49111 */ {(14<<2)|2,{68,107,0}}, +/* 49112 */ {(14<<2)|2,{68,113,0}}, +/* 49113 */ {(14<<2)|2,{68,113,0}}, +/* 49114 */ {(14<<2)|2,{68,113,0}}, +/* 49115 */ {(14<<2)|2,{68,113,0}}, +/* 49116 */ {(14<<2)|2,{68,118,0}}, +/* 49117 */ {(14<<2)|2,{68,118,0}}, +/* 49118 */ {(14<<2)|2,{68,118,0}}, +/* 49119 */ {(14<<2)|2,{68,118,0}}, +/* 49120 */ {(14<<2)|2,{68,119,0}}, +/* 49121 */ {(14<<2)|2,{68,119,0}}, +/* 49122 */ {(14<<2)|2,{68,119,0}}, +/* 49123 */ {(14<<2)|2,{68,119,0}}, +/* 49124 */ {(14<<2)|2,{68,120,0}}, +/* 49125 */ {(14<<2)|2,{68,120,0}}, +/* 49126 */ {(14<<2)|2,{68,120,0}}, +/* 49127 */ {(14<<2)|2,{68,120,0}}, +/* 49128 */ {(14<<2)|2,{68,121,0}}, +/* 49129 */ {(14<<2)|2,{68,121,0}}, +/* 49130 */ {(14<<2)|2,{68,121,0}}, +/* 49131 */ {(14<<2)|2,{68,121,0}}, +/* 49132 */ {(14<<2)|2,{68,122,0}}, +/* 49133 */ {(14<<2)|2,{68,122,0}}, +/* 49134 */ {(14<<2)|2,{68,122,0}}, +/* 49135 */ {(14<<2)|2,{68,122,0}}, +/* 49136 */ {(15<<2)|2,{68,38,0}}, +/* 49137 */ {(15<<2)|2,{68,38,0}}, +/* 49138 */ {(15<<2)|2,{68,42,0}}, +/* 49139 */ {(15<<2)|2,{68,42,0}}, +/* 49140 */ {(15<<2)|2,{68,44,0}}, +/* 49141 */ {(15<<2)|2,{68,44,0}}, +/* 49142 */ {(15<<2)|2,{68,59,0}}, +/* 49143 */ {(15<<2)|2,{68,59,0}}, +/* 49144 */ {(15<<2)|2,{68,88,0}}, +/* 49145 */ {(15<<2)|2,{68,88,0}}, +/* 49146 */ {(15<<2)|2,{68,90,0}}, +/* 49147 */ {(15<<2)|2,{68,90,0}}, +/* 49148 */ {(7<<2)|1,{68,0,0}}, +/* 49149 */ {(7<<2)|1,{68,0,0}}, +/* 49150 */ {(7<<2)|1,{68,0,0}}, +/* 49151 */ {(7<<2)|1,{68,0,0}}, +/* 49152 */ {(12<<2)|2,{69,48,0}}, +/* 49153 */ {(12<<2)|2,{69,48,0}}, +/* 49154 */ {(12<<2)|2,{69,48,0}}, +/* 49155 */ {(12<<2)|2,{69,48,0}}, +/* 49156 */ {(12<<2)|2,{69,48,0}}, +/* 49157 */ {(12<<2)|2,{69,48,0}}, +/* 49158 */ {(12<<2)|2,{69,48,0}}, +/* 49159 */ {(12<<2)|2,{69,48,0}}, +/* 49160 */ {(12<<2)|2,{69,48,0}}, +/* 49161 */ {(12<<2)|2,{69,48,0}}, +/* 49162 */ {(12<<2)|2,{69,48,0}}, +/* 49163 */ {(12<<2)|2,{69,48,0}}, +/* 49164 */ {(12<<2)|2,{69,48,0}}, +/* 49165 */ {(12<<2)|2,{69,48,0}}, +/* 49166 */ {(12<<2)|2,{69,48,0}}, +/* 49167 */ {(12<<2)|2,{69,48,0}}, +/* 49168 */ {(12<<2)|2,{69,49,0}}, +/* 49169 */ {(12<<2)|2,{69,49,0}}, +/* 49170 */ {(12<<2)|2,{69,49,0}}, +/* 49171 */ {(12<<2)|2,{69,49,0}}, +/* 49172 */ {(12<<2)|2,{69,49,0}}, +/* 49173 */ {(12<<2)|2,{69,49,0}}, +/* 49174 */ {(12<<2)|2,{69,49,0}}, +/* 49175 */ {(12<<2)|2,{69,49,0}}, +/* 49176 */ {(12<<2)|2,{69,49,0}}, +/* 49177 */ {(12<<2)|2,{69,49,0}}, +/* 49178 */ {(12<<2)|2,{69,49,0}}, +/* 49179 */ {(12<<2)|2,{69,49,0}}, +/* 49180 */ {(12<<2)|2,{69,49,0}}, +/* 49181 */ {(12<<2)|2,{69,49,0}}, +/* 49182 */ {(12<<2)|2,{69,49,0}}, +/* 49183 */ {(12<<2)|2,{69,49,0}}, +/* 49184 */ {(12<<2)|2,{69,50,0}}, +/* 49185 */ {(12<<2)|2,{69,50,0}}, +/* 49186 */ {(12<<2)|2,{69,50,0}}, +/* 49187 */ {(12<<2)|2,{69,50,0}}, +/* 49188 */ {(12<<2)|2,{69,50,0}}, +/* 49189 */ {(12<<2)|2,{69,50,0}}, +/* 49190 */ {(12<<2)|2,{69,50,0}}, +/* 49191 */ {(12<<2)|2,{69,50,0}}, +/* 49192 */ {(12<<2)|2,{69,50,0}}, +/* 49193 */ {(12<<2)|2,{69,50,0}}, +/* 49194 */ {(12<<2)|2,{69,50,0}}, +/* 49195 */ {(12<<2)|2,{69,50,0}}, +/* 49196 */ {(12<<2)|2,{69,50,0}}, +/* 49197 */ {(12<<2)|2,{69,50,0}}, +/* 49198 */ {(12<<2)|2,{69,50,0}}, +/* 49199 */ {(12<<2)|2,{69,50,0}}, +/* 49200 */ {(12<<2)|2,{69,97,0}}, +/* 49201 */ {(12<<2)|2,{69,97,0}}, +/* 49202 */ {(12<<2)|2,{69,97,0}}, +/* 49203 */ {(12<<2)|2,{69,97,0}}, +/* 49204 */ {(12<<2)|2,{69,97,0}}, +/* 49205 */ {(12<<2)|2,{69,97,0}}, +/* 49206 */ {(12<<2)|2,{69,97,0}}, +/* 49207 */ {(12<<2)|2,{69,97,0}}, +/* 49208 */ {(12<<2)|2,{69,97,0}}, +/* 49209 */ {(12<<2)|2,{69,97,0}}, +/* 49210 */ {(12<<2)|2,{69,97,0}}, +/* 49211 */ {(12<<2)|2,{69,97,0}}, +/* 49212 */ {(12<<2)|2,{69,97,0}}, +/* 49213 */ {(12<<2)|2,{69,97,0}}, +/* 49214 */ {(12<<2)|2,{69,97,0}}, +/* 49215 */ {(12<<2)|2,{69,97,0}}, +/* 49216 */ {(12<<2)|2,{69,99,0}}, +/* 49217 */ {(12<<2)|2,{69,99,0}}, +/* 49218 */ {(12<<2)|2,{69,99,0}}, +/* 49219 */ {(12<<2)|2,{69,99,0}}, +/* 49220 */ {(12<<2)|2,{69,99,0}}, +/* 49221 */ {(12<<2)|2,{69,99,0}}, +/* 49222 */ {(12<<2)|2,{69,99,0}}, +/* 49223 */ {(12<<2)|2,{69,99,0}}, +/* 49224 */ {(12<<2)|2,{69,99,0}}, +/* 49225 */ {(12<<2)|2,{69,99,0}}, +/* 49226 */ {(12<<2)|2,{69,99,0}}, +/* 49227 */ {(12<<2)|2,{69,99,0}}, +/* 49228 */ {(12<<2)|2,{69,99,0}}, +/* 49229 */ {(12<<2)|2,{69,99,0}}, +/* 49230 */ {(12<<2)|2,{69,99,0}}, +/* 49231 */ {(12<<2)|2,{69,99,0}}, +/* 49232 */ {(12<<2)|2,{69,101,0}}, +/* 49233 */ {(12<<2)|2,{69,101,0}}, +/* 49234 */ {(12<<2)|2,{69,101,0}}, +/* 49235 */ {(12<<2)|2,{69,101,0}}, +/* 49236 */ {(12<<2)|2,{69,101,0}}, +/* 49237 */ {(12<<2)|2,{69,101,0}}, +/* 49238 */ {(12<<2)|2,{69,101,0}}, +/* 49239 */ {(12<<2)|2,{69,101,0}}, +/* 49240 */ {(12<<2)|2,{69,101,0}}, +/* 49241 */ {(12<<2)|2,{69,101,0}}, +/* 49242 */ {(12<<2)|2,{69,101,0}}, +/* 49243 */ {(12<<2)|2,{69,101,0}}, +/* 49244 */ {(12<<2)|2,{69,101,0}}, +/* 49245 */ {(12<<2)|2,{69,101,0}}, +/* 49246 */ {(12<<2)|2,{69,101,0}}, +/* 49247 */ {(12<<2)|2,{69,101,0}}, +/* 49248 */ {(12<<2)|2,{69,105,0}}, +/* 49249 */ {(12<<2)|2,{69,105,0}}, +/* 49250 */ {(12<<2)|2,{69,105,0}}, +/* 49251 */ {(12<<2)|2,{69,105,0}}, +/* 49252 */ {(12<<2)|2,{69,105,0}}, +/* 49253 */ {(12<<2)|2,{69,105,0}}, +/* 49254 */ {(12<<2)|2,{69,105,0}}, +/* 49255 */ {(12<<2)|2,{69,105,0}}, +/* 49256 */ {(12<<2)|2,{69,105,0}}, +/* 49257 */ {(12<<2)|2,{69,105,0}}, +/* 49258 */ {(12<<2)|2,{69,105,0}}, +/* 49259 */ {(12<<2)|2,{69,105,0}}, +/* 49260 */ {(12<<2)|2,{69,105,0}}, +/* 49261 */ {(12<<2)|2,{69,105,0}}, +/* 49262 */ {(12<<2)|2,{69,105,0}}, +/* 49263 */ {(12<<2)|2,{69,105,0}}, +/* 49264 */ {(12<<2)|2,{69,111,0}}, +/* 49265 */ {(12<<2)|2,{69,111,0}}, +/* 49266 */ {(12<<2)|2,{69,111,0}}, +/* 49267 */ {(12<<2)|2,{69,111,0}}, +/* 49268 */ {(12<<2)|2,{69,111,0}}, +/* 49269 */ {(12<<2)|2,{69,111,0}}, +/* 49270 */ {(12<<2)|2,{69,111,0}}, +/* 49271 */ {(12<<2)|2,{69,111,0}}, +/* 49272 */ {(12<<2)|2,{69,111,0}}, +/* 49273 */ {(12<<2)|2,{69,111,0}}, +/* 49274 */ {(12<<2)|2,{69,111,0}}, +/* 49275 */ {(12<<2)|2,{69,111,0}}, +/* 49276 */ {(12<<2)|2,{69,111,0}}, +/* 49277 */ {(12<<2)|2,{69,111,0}}, +/* 49278 */ {(12<<2)|2,{69,111,0}}, +/* 49279 */ {(12<<2)|2,{69,111,0}}, +/* 49280 */ {(12<<2)|2,{69,115,0}}, +/* 49281 */ {(12<<2)|2,{69,115,0}}, +/* 49282 */ {(12<<2)|2,{69,115,0}}, +/* 49283 */ {(12<<2)|2,{69,115,0}}, +/* 49284 */ {(12<<2)|2,{69,115,0}}, +/* 49285 */ {(12<<2)|2,{69,115,0}}, +/* 49286 */ {(12<<2)|2,{69,115,0}}, +/* 49287 */ {(12<<2)|2,{69,115,0}}, +/* 49288 */ {(12<<2)|2,{69,115,0}}, +/* 49289 */ {(12<<2)|2,{69,115,0}}, +/* 49290 */ {(12<<2)|2,{69,115,0}}, +/* 49291 */ {(12<<2)|2,{69,115,0}}, +/* 49292 */ {(12<<2)|2,{69,115,0}}, +/* 49293 */ {(12<<2)|2,{69,115,0}}, +/* 49294 */ {(12<<2)|2,{69,115,0}}, +/* 49295 */ {(12<<2)|2,{69,115,0}}, +/* 49296 */ {(12<<2)|2,{69,116,0}}, +/* 49297 */ {(12<<2)|2,{69,116,0}}, +/* 49298 */ {(12<<2)|2,{69,116,0}}, +/* 49299 */ {(12<<2)|2,{69,116,0}}, +/* 49300 */ {(12<<2)|2,{69,116,0}}, +/* 49301 */ {(12<<2)|2,{69,116,0}}, +/* 49302 */ {(12<<2)|2,{69,116,0}}, +/* 49303 */ {(12<<2)|2,{69,116,0}}, +/* 49304 */ {(12<<2)|2,{69,116,0}}, +/* 49305 */ {(12<<2)|2,{69,116,0}}, +/* 49306 */ {(12<<2)|2,{69,116,0}}, +/* 49307 */ {(12<<2)|2,{69,116,0}}, +/* 49308 */ {(12<<2)|2,{69,116,0}}, +/* 49309 */ {(12<<2)|2,{69,116,0}}, +/* 49310 */ {(12<<2)|2,{69,116,0}}, +/* 49311 */ {(12<<2)|2,{69,116,0}}, +/* 49312 */ {(13<<2)|2,{69,32,0}}, +/* 49313 */ {(13<<2)|2,{69,32,0}}, +/* 49314 */ {(13<<2)|2,{69,32,0}}, +/* 49315 */ {(13<<2)|2,{69,32,0}}, +/* 49316 */ {(13<<2)|2,{69,32,0}}, +/* 49317 */ {(13<<2)|2,{69,32,0}}, +/* 49318 */ {(13<<2)|2,{69,32,0}}, +/* 49319 */ {(13<<2)|2,{69,32,0}}, +/* 49320 */ {(13<<2)|2,{69,37,0}}, +/* 49321 */ {(13<<2)|2,{69,37,0}}, +/* 49322 */ {(13<<2)|2,{69,37,0}}, +/* 49323 */ {(13<<2)|2,{69,37,0}}, +/* 49324 */ {(13<<2)|2,{69,37,0}}, +/* 49325 */ {(13<<2)|2,{69,37,0}}, +/* 49326 */ {(13<<2)|2,{69,37,0}}, +/* 49327 */ {(13<<2)|2,{69,37,0}}, +/* 49328 */ {(13<<2)|2,{69,45,0}}, +/* 49329 */ {(13<<2)|2,{69,45,0}}, +/* 49330 */ {(13<<2)|2,{69,45,0}}, +/* 49331 */ {(13<<2)|2,{69,45,0}}, +/* 49332 */ {(13<<2)|2,{69,45,0}}, +/* 49333 */ {(13<<2)|2,{69,45,0}}, +/* 49334 */ {(13<<2)|2,{69,45,0}}, +/* 49335 */ {(13<<2)|2,{69,45,0}}, +/* 49336 */ {(13<<2)|2,{69,46,0}}, +/* 49337 */ {(13<<2)|2,{69,46,0}}, +/* 49338 */ {(13<<2)|2,{69,46,0}}, +/* 49339 */ {(13<<2)|2,{69,46,0}}, +/* 49340 */ {(13<<2)|2,{69,46,0}}, +/* 49341 */ {(13<<2)|2,{69,46,0}}, +/* 49342 */ {(13<<2)|2,{69,46,0}}, +/* 49343 */ {(13<<2)|2,{69,46,0}}, +/* 49344 */ {(13<<2)|2,{69,47,0}}, +/* 49345 */ {(13<<2)|2,{69,47,0}}, +/* 49346 */ {(13<<2)|2,{69,47,0}}, +/* 49347 */ {(13<<2)|2,{69,47,0}}, +/* 49348 */ {(13<<2)|2,{69,47,0}}, +/* 49349 */ {(13<<2)|2,{69,47,0}}, +/* 49350 */ {(13<<2)|2,{69,47,0}}, +/* 49351 */ {(13<<2)|2,{69,47,0}}, +/* 49352 */ {(13<<2)|2,{69,51,0}}, +/* 49353 */ {(13<<2)|2,{69,51,0}}, +/* 49354 */ {(13<<2)|2,{69,51,0}}, +/* 49355 */ {(13<<2)|2,{69,51,0}}, +/* 49356 */ {(13<<2)|2,{69,51,0}}, +/* 49357 */ {(13<<2)|2,{69,51,0}}, +/* 49358 */ {(13<<2)|2,{69,51,0}}, +/* 49359 */ {(13<<2)|2,{69,51,0}}, +/* 49360 */ {(13<<2)|2,{69,52,0}}, +/* 49361 */ {(13<<2)|2,{69,52,0}}, +/* 49362 */ {(13<<2)|2,{69,52,0}}, +/* 49363 */ {(13<<2)|2,{69,52,0}}, +/* 49364 */ {(13<<2)|2,{69,52,0}}, +/* 49365 */ {(13<<2)|2,{69,52,0}}, +/* 49366 */ {(13<<2)|2,{69,52,0}}, +/* 49367 */ {(13<<2)|2,{69,52,0}}, +/* 49368 */ {(13<<2)|2,{69,53,0}}, +/* 49369 */ {(13<<2)|2,{69,53,0}}, +/* 49370 */ {(13<<2)|2,{69,53,0}}, +/* 49371 */ {(13<<2)|2,{69,53,0}}, +/* 49372 */ {(13<<2)|2,{69,53,0}}, +/* 49373 */ {(13<<2)|2,{69,53,0}}, +/* 49374 */ {(13<<2)|2,{69,53,0}}, +/* 49375 */ {(13<<2)|2,{69,53,0}}, +/* 49376 */ {(13<<2)|2,{69,54,0}}, +/* 49377 */ {(13<<2)|2,{69,54,0}}, +/* 49378 */ {(13<<2)|2,{69,54,0}}, +/* 49379 */ {(13<<2)|2,{69,54,0}}, +/* 49380 */ {(13<<2)|2,{69,54,0}}, +/* 49381 */ {(13<<2)|2,{69,54,0}}, +/* 49382 */ {(13<<2)|2,{69,54,0}}, +/* 49383 */ {(13<<2)|2,{69,54,0}}, +/* 49384 */ {(13<<2)|2,{69,55,0}}, +/* 49385 */ {(13<<2)|2,{69,55,0}}, +/* 49386 */ {(13<<2)|2,{69,55,0}}, +/* 49387 */ {(13<<2)|2,{69,55,0}}, +/* 49388 */ {(13<<2)|2,{69,55,0}}, +/* 49389 */ {(13<<2)|2,{69,55,0}}, +/* 49390 */ {(13<<2)|2,{69,55,0}}, +/* 49391 */ {(13<<2)|2,{69,55,0}}, +/* 49392 */ {(13<<2)|2,{69,56,0}}, +/* 49393 */ {(13<<2)|2,{69,56,0}}, +/* 49394 */ {(13<<2)|2,{69,56,0}}, +/* 49395 */ {(13<<2)|2,{69,56,0}}, +/* 49396 */ {(13<<2)|2,{69,56,0}}, +/* 49397 */ {(13<<2)|2,{69,56,0}}, +/* 49398 */ {(13<<2)|2,{69,56,0}}, +/* 49399 */ {(13<<2)|2,{69,56,0}}, +/* 49400 */ {(13<<2)|2,{69,57,0}}, +/* 49401 */ {(13<<2)|2,{69,57,0}}, +/* 49402 */ {(13<<2)|2,{69,57,0}}, +/* 49403 */ {(13<<2)|2,{69,57,0}}, +/* 49404 */ {(13<<2)|2,{69,57,0}}, +/* 49405 */ {(13<<2)|2,{69,57,0}}, +/* 49406 */ {(13<<2)|2,{69,57,0}}, +/* 49407 */ {(13<<2)|2,{69,57,0}}, +/* 49408 */ {(13<<2)|2,{69,61,0}}, +/* 49409 */ {(13<<2)|2,{69,61,0}}, +/* 49410 */ {(13<<2)|2,{69,61,0}}, +/* 49411 */ {(13<<2)|2,{69,61,0}}, +/* 49412 */ {(13<<2)|2,{69,61,0}}, +/* 49413 */ {(13<<2)|2,{69,61,0}}, +/* 49414 */ {(13<<2)|2,{69,61,0}}, +/* 49415 */ {(13<<2)|2,{69,61,0}}, +/* 49416 */ {(13<<2)|2,{69,65,0}}, +/* 49417 */ {(13<<2)|2,{69,65,0}}, +/* 49418 */ {(13<<2)|2,{69,65,0}}, +/* 49419 */ {(13<<2)|2,{69,65,0}}, +/* 49420 */ {(13<<2)|2,{69,65,0}}, +/* 49421 */ {(13<<2)|2,{69,65,0}}, +/* 49422 */ {(13<<2)|2,{69,65,0}}, +/* 49423 */ {(13<<2)|2,{69,65,0}}, +/* 49424 */ {(13<<2)|2,{69,95,0}}, +/* 49425 */ {(13<<2)|2,{69,95,0}}, +/* 49426 */ {(13<<2)|2,{69,95,0}}, +/* 49427 */ {(13<<2)|2,{69,95,0}}, +/* 49428 */ {(13<<2)|2,{69,95,0}}, +/* 49429 */ {(13<<2)|2,{69,95,0}}, +/* 49430 */ {(13<<2)|2,{69,95,0}}, +/* 49431 */ {(13<<2)|2,{69,95,0}}, +/* 49432 */ {(13<<2)|2,{69,98,0}}, +/* 49433 */ {(13<<2)|2,{69,98,0}}, +/* 49434 */ {(13<<2)|2,{69,98,0}}, +/* 49435 */ {(13<<2)|2,{69,98,0}}, +/* 49436 */ {(13<<2)|2,{69,98,0}}, +/* 49437 */ {(13<<2)|2,{69,98,0}}, +/* 49438 */ {(13<<2)|2,{69,98,0}}, +/* 49439 */ {(13<<2)|2,{69,98,0}}, +/* 49440 */ {(13<<2)|2,{69,100,0}}, +/* 49441 */ {(13<<2)|2,{69,100,0}}, +/* 49442 */ {(13<<2)|2,{69,100,0}}, +/* 49443 */ {(13<<2)|2,{69,100,0}}, +/* 49444 */ {(13<<2)|2,{69,100,0}}, +/* 49445 */ {(13<<2)|2,{69,100,0}}, +/* 49446 */ {(13<<2)|2,{69,100,0}}, +/* 49447 */ {(13<<2)|2,{69,100,0}}, +/* 49448 */ {(13<<2)|2,{69,102,0}}, +/* 49449 */ {(13<<2)|2,{69,102,0}}, +/* 49450 */ {(13<<2)|2,{69,102,0}}, +/* 49451 */ {(13<<2)|2,{69,102,0}}, +/* 49452 */ {(13<<2)|2,{69,102,0}}, +/* 49453 */ {(13<<2)|2,{69,102,0}}, +/* 49454 */ {(13<<2)|2,{69,102,0}}, +/* 49455 */ {(13<<2)|2,{69,102,0}}, +/* 49456 */ {(13<<2)|2,{69,103,0}}, +/* 49457 */ {(13<<2)|2,{69,103,0}}, +/* 49458 */ {(13<<2)|2,{69,103,0}}, +/* 49459 */ {(13<<2)|2,{69,103,0}}, +/* 49460 */ {(13<<2)|2,{69,103,0}}, +/* 49461 */ {(13<<2)|2,{69,103,0}}, +/* 49462 */ {(13<<2)|2,{69,103,0}}, +/* 49463 */ {(13<<2)|2,{69,103,0}}, +/* 49464 */ {(13<<2)|2,{69,104,0}}, +/* 49465 */ {(13<<2)|2,{69,104,0}}, +/* 49466 */ {(13<<2)|2,{69,104,0}}, +/* 49467 */ {(13<<2)|2,{69,104,0}}, +/* 49468 */ {(13<<2)|2,{69,104,0}}, +/* 49469 */ {(13<<2)|2,{69,104,0}}, +/* 49470 */ {(13<<2)|2,{69,104,0}}, +/* 49471 */ {(13<<2)|2,{69,104,0}}, +/* 49472 */ {(13<<2)|2,{69,108,0}}, +/* 49473 */ {(13<<2)|2,{69,108,0}}, +/* 49474 */ {(13<<2)|2,{69,108,0}}, +/* 49475 */ {(13<<2)|2,{69,108,0}}, +/* 49476 */ {(13<<2)|2,{69,108,0}}, +/* 49477 */ {(13<<2)|2,{69,108,0}}, +/* 49478 */ {(13<<2)|2,{69,108,0}}, +/* 49479 */ {(13<<2)|2,{69,108,0}}, +/* 49480 */ {(13<<2)|2,{69,109,0}}, +/* 49481 */ {(13<<2)|2,{69,109,0}}, +/* 49482 */ {(13<<2)|2,{69,109,0}}, +/* 49483 */ {(13<<2)|2,{69,109,0}}, +/* 49484 */ {(13<<2)|2,{69,109,0}}, +/* 49485 */ {(13<<2)|2,{69,109,0}}, +/* 49486 */ {(13<<2)|2,{69,109,0}}, +/* 49487 */ {(13<<2)|2,{69,109,0}}, +/* 49488 */ {(13<<2)|2,{69,110,0}}, +/* 49489 */ {(13<<2)|2,{69,110,0}}, +/* 49490 */ {(13<<2)|2,{69,110,0}}, +/* 49491 */ {(13<<2)|2,{69,110,0}}, +/* 49492 */ {(13<<2)|2,{69,110,0}}, +/* 49493 */ {(13<<2)|2,{69,110,0}}, +/* 49494 */ {(13<<2)|2,{69,110,0}}, +/* 49495 */ {(13<<2)|2,{69,110,0}}, +/* 49496 */ {(13<<2)|2,{69,112,0}}, +/* 49497 */ {(13<<2)|2,{69,112,0}}, +/* 49498 */ {(13<<2)|2,{69,112,0}}, +/* 49499 */ {(13<<2)|2,{69,112,0}}, +/* 49500 */ {(13<<2)|2,{69,112,0}}, +/* 49501 */ {(13<<2)|2,{69,112,0}}, +/* 49502 */ {(13<<2)|2,{69,112,0}}, +/* 49503 */ {(13<<2)|2,{69,112,0}}, +/* 49504 */ {(13<<2)|2,{69,114,0}}, +/* 49505 */ {(13<<2)|2,{69,114,0}}, +/* 49506 */ {(13<<2)|2,{69,114,0}}, +/* 49507 */ {(13<<2)|2,{69,114,0}}, +/* 49508 */ {(13<<2)|2,{69,114,0}}, +/* 49509 */ {(13<<2)|2,{69,114,0}}, +/* 49510 */ {(13<<2)|2,{69,114,0}}, +/* 49511 */ {(13<<2)|2,{69,114,0}}, +/* 49512 */ {(13<<2)|2,{69,117,0}}, +/* 49513 */ {(13<<2)|2,{69,117,0}}, +/* 49514 */ {(13<<2)|2,{69,117,0}}, +/* 49515 */ {(13<<2)|2,{69,117,0}}, +/* 49516 */ {(13<<2)|2,{69,117,0}}, +/* 49517 */ {(13<<2)|2,{69,117,0}}, +/* 49518 */ {(13<<2)|2,{69,117,0}}, +/* 49519 */ {(13<<2)|2,{69,117,0}}, +/* 49520 */ {(14<<2)|2,{69,58,0}}, +/* 49521 */ {(14<<2)|2,{69,58,0}}, +/* 49522 */ {(14<<2)|2,{69,58,0}}, +/* 49523 */ {(14<<2)|2,{69,58,0}}, +/* 49524 */ {(14<<2)|2,{69,66,0}}, +/* 49525 */ {(14<<2)|2,{69,66,0}}, +/* 49526 */ {(14<<2)|2,{69,66,0}}, +/* 49527 */ {(14<<2)|2,{69,66,0}}, +/* 49528 */ {(14<<2)|2,{69,67,0}}, +/* 49529 */ {(14<<2)|2,{69,67,0}}, +/* 49530 */ {(14<<2)|2,{69,67,0}}, +/* 49531 */ {(14<<2)|2,{69,67,0}}, +/* 49532 */ {(14<<2)|2,{69,68,0}}, +/* 49533 */ {(14<<2)|2,{69,68,0}}, +/* 49534 */ {(14<<2)|2,{69,68,0}}, +/* 49535 */ {(14<<2)|2,{69,68,0}}, +/* 49536 */ {(14<<2)|2,{69,69,0}}, +/* 49537 */ {(14<<2)|2,{69,69,0}}, +/* 49538 */ {(14<<2)|2,{69,69,0}}, +/* 49539 */ {(14<<2)|2,{69,69,0}}, +/* 49540 */ {(14<<2)|2,{69,70,0}}, +/* 49541 */ {(14<<2)|2,{69,70,0}}, +/* 49542 */ {(14<<2)|2,{69,70,0}}, +/* 49543 */ {(14<<2)|2,{69,70,0}}, +/* 49544 */ {(14<<2)|2,{69,71,0}}, +/* 49545 */ {(14<<2)|2,{69,71,0}}, +/* 49546 */ {(14<<2)|2,{69,71,0}}, +/* 49547 */ {(14<<2)|2,{69,71,0}}, +/* 49548 */ {(14<<2)|2,{69,72,0}}, +/* 49549 */ {(14<<2)|2,{69,72,0}}, +/* 49550 */ {(14<<2)|2,{69,72,0}}, +/* 49551 */ {(14<<2)|2,{69,72,0}}, +/* 49552 */ {(14<<2)|2,{69,73,0}}, +/* 49553 */ {(14<<2)|2,{69,73,0}}, +/* 49554 */ {(14<<2)|2,{69,73,0}}, +/* 49555 */ {(14<<2)|2,{69,73,0}}, +/* 49556 */ {(14<<2)|2,{69,74,0}}, +/* 49557 */ {(14<<2)|2,{69,74,0}}, +/* 49558 */ {(14<<2)|2,{69,74,0}}, +/* 49559 */ {(14<<2)|2,{69,74,0}}, +/* 49560 */ {(14<<2)|2,{69,75,0}}, +/* 49561 */ {(14<<2)|2,{69,75,0}}, +/* 49562 */ {(14<<2)|2,{69,75,0}}, +/* 49563 */ {(14<<2)|2,{69,75,0}}, +/* 49564 */ {(14<<2)|2,{69,76,0}}, +/* 49565 */ {(14<<2)|2,{69,76,0}}, +/* 49566 */ {(14<<2)|2,{69,76,0}}, +/* 49567 */ {(14<<2)|2,{69,76,0}}, +/* 49568 */ {(14<<2)|2,{69,77,0}}, +/* 49569 */ {(14<<2)|2,{69,77,0}}, +/* 49570 */ {(14<<2)|2,{69,77,0}}, +/* 49571 */ {(14<<2)|2,{69,77,0}}, +/* 49572 */ {(14<<2)|2,{69,78,0}}, +/* 49573 */ {(14<<2)|2,{69,78,0}}, +/* 49574 */ {(14<<2)|2,{69,78,0}}, +/* 49575 */ {(14<<2)|2,{69,78,0}}, +/* 49576 */ {(14<<2)|2,{69,79,0}}, +/* 49577 */ {(14<<2)|2,{69,79,0}}, +/* 49578 */ {(14<<2)|2,{69,79,0}}, +/* 49579 */ {(14<<2)|2,{69,79,0}}, +/* 49580 */ {(14<<2)|2,{69,80,0}}, +/* 49581 */ {(14<<2)|2,{69,80,0}}, +/* 49582 */ {(14<<2)|2,{69,80,0}}, +/* 49583 */ {(14<<2)|2,{69,80,0}}, +/* 49584 */ {(14<<2)|2,{69,81,0}}, +/* 49585 */ {(14<<2)|2,{69,81,0}}, +/* 49586 */ {(14<<2)|2,{69,81,0}}, +/* 49587 */ {(14<<2)|2,{69,81,0}}, +/* 49588 */ {(14<<2)|2,{69,82,0}}, +/* 49589 */ {(14<<2)|2,{69,82,0}}, +/* 49590 */ {(14<<2)|2,{69,82,0}}, +/* 49591 */ {(14<<2)|2,{69,82,0}}, +/* 49592 */ {(14<<2)|2,{69,83,0}}, +/* 49593 */ {(14<<2)|2,{69,83,0}}, +/* 49594 */ {(14<<2)|2,{69,83,0}}, +/* 49595 */ {(14<<2)|2,{69,83,0}}, +/* 49596 */ {(14<<2)|2,{69,84,0}}, +/* 49597 */ {(14<<2)|2,{69,84,0}}, +/* 49598 */ {(14<<2)|2,{69,84,0}}, +/* 49599 */ {(14<<2)|2,{69,84,0}}, +/* 49600 */ {(14<<2)|2,{69,85,0}}, +/* 49601 */ {(14<<2)|2,{69,85,0}}, +/* 49602 */ {(14<<2)|2,{69,85,0}}, +/* 49603 */ {(14<<2)|2,{69,85,0}}, +/* 49604 */ {(14<<2)|2,{69,86,0}}, +/* 49605 */ {(14<<2)|2,{69,86,0}}, +/* 49606 */ {(14<<2)|2,{69,86,0}}, +/* 49607 */ {(14<<2)|2,{69,86,0}}, +/* 49608 */ {(14<<2)|2,{69,87,0}}, +/* 49609 */ {(14<<2)|2,{69,87,0}}, +/* 49610 */ {(14<<2)|2,{69,87,0}}, +/* 49611 */ {(14<<2)|2,{69,87,0}}, +/* 49612 */ {(14<<2)|2,{69,89,0}}, +/* 49613 */ {(14<<2)|2,{69,89,0}}, +/* 49614 */ {(14<<2)|2,{69,89,0}}, +/* 49615 */ {(14<<2)|2,{69,89,0}}, +/* 49616 */ {(14<<2)|2,{69,106,0}}, +/* 49617 */ {(14<<2)|2,{69,106,0}}, +/* 49618 */ {(14<<2)|2,{69,106,0}}, +/* 49619 */ {(14<<2)|2,{69,106,0}}, +/* 49620 */ {(14<<2)|2,{69,107,0}}, +/* 49621 */ {(14<<2)|2,{69,107,0}}, +/* 49622 */ {(14<<2)|2,{69,107,0}}, +/* 49623 */ {(14<<2)|2,{69,107,0}}, +/* 49624 */ {(14<<2)|2,{69,113,0}}, +/* 49625 */ {(14<<2)|2,{69,113,0}}, +/* 49626 */ {(14<<2)|2,{69,113,0}}, +/* 49627 */ {(14<<2)|2,{69,113,0}}, +/* 49628 */ {(14<<2)|2,{69,118,0}}, +/* 49629 */ {(14<<2)|2,{69,118,0}}, +/* 49630 */ {(14<<2)|2,{69,118,0}}, +/* 49631 */ {(14<<2)|2,{69,118,0}}, +/* 49632 */ {(14<<2)|2,{69,119,0}}, +/* 49633 */ {(14<<2)|2,{69,119,0}}, +/* 49634 */ {(14<<2)|2,{69,119,0}}, +/* 49635 */ {(14<<2)|2,{69,119,0}}, +/* 49636 */ {(14<<2)|2,{69,120,0}}, +/* 49637 */ {(14<<2)|2,{69,120,0}}, +/* 49638 */ {(14<<2)|2,{69,120,0}}, +/* 49639 */ {(14<<2)|2,{69,120,0}}, +/* 49640 */ {(14<<2)|2,{69,121,0}}, +/* 49641 */ {(14<<2)|2,{69,121,0}}, +/* 49642 */ {(14<<2)|2,{69,121,0}}, +/* 49643 */ {(14<<2)|2,{69,121,0}}, +/* 49644 */ {(14<<2)|2,{69,122,0}}, +/* 49645 */ {(14<<2)|2,{69,122,0}}, +/* 49646 */ {(14<<2)|2,{69,122,0}}, +/* 49647 */ {(14<<2)|2,{69,122,0}}, +/* 49648 */ {(15<<2)|2,{69,38,0}}, +/* 49649 */ {(15<<2)|2,{69,38,0}}, +/* 49650 */ {(15<<2)|2,{69,42,0}}, +/* 49651 */ {(15<<2)|2,{69,42,0}}, +/* 49652 */ {(15<<2)|2,{69,44,0}}, +/* 49653 */ {(15<<2)|2,{69,44,0}}, +/* 49654 */ {(15<<2)|2,{69,59,0}}, +/* 49655 */ {(15<<2)|2,{69,59,0}}, +/* 49656 */ {(15<<2)|2,{69,88,0}}, +/* 49657 */ {(15<<2)|2,{69,88,0}}, +/* 49658 */ {(15<<2)|2,{69,90,0}}, +/* 49659 */ {(15<<2)|2,{69,90,0}}, +/* 49660 */ {(7<<2)|1,{69,0,0}}, +/* 49661 */ {(7<<2)|1,{69,0,0}}, +/* 49662 */ {(7<<2)|1,{69,0,0}}, +/* 49663 */ {(7<<2)|1,{69,0,0}}, +/* 49664 */ {(12<<2)|2,{70,48,0}}, +/* 49665 */ {(12<<2)|2,{70,48,0}}, +/* 49666 */ {(12<<2)|2,{70,48,0}}, +/* 49667 */ {(12<<2)|2,{70,48,0}}, +/* 49668 */ {(12<<2)|2,{70,48,0}}, +/* 49669 */ {(12<<2)|2,{70,48,0}}, +/* 49670 */ {(12<<2)|2,{70,48,0}}, +/* 49671 */ {(12<<2)|2,{70,48,0}}, +/* 49672 */ {(12<<2)|2,{70,48,0}}, +/* 49673 */ {(12<<2)|2,{70,48,0}}, +/* 49674 */ {(12<<2)|2,{70,48,0}}, +/* 49675 */ {(12<<2)|2,{70,48,0}}, +/* 49676 */ {(12<<2)|2,{70,48,0}}, +/* 49677 */ {(12<<2)|2,{70,48,0}}, +/* 49678 */ {(12<<2)|2,{70,48,0}}, +/* 49679 */ {(12<<2)|2,{70,48,0}}, +/* 49680 */ {(12<<2)|2,{70,49,0}}, +/* 49681 */ {(12<<2)|2,{70,49,0}}, +/* 49682 */ {(12<<2)|2,{70,49,0}}, +/* 49683 */ {(12<<2)|2,{70,49,0}}, +/* 49684 */ {(12<<2)|2,{70,49,0}}, +/* 49685 */ {(12<<2)|2,{70,49,0}}, +/* 49686 */ {(12<<2)|2,{70,49,0}}, +/* 49687 */ {(12<<2)|2,{70,49,0}}, +/* 49688 */ {(12<<2)|2,{70,49,0}}, +/* 49689 */ {(12<<2)|2,{70,49,0}}, +/* 49690 */ {(12<<2)|2,{70,49,0}}, +/* 49691 */ {(12<<2)|2,{70,49,0}}, +/* 49692 */ {(12<<2)|2,{70,49,0}}, +/* 49693 */ {(12<<2)|2,{70,49,0}}, +/* 49694 */ {(12<<2)|2,{70,49,0}}, +/* 49695 */ {(12<<2)|2,{70,49,0}}, +/* 49696 */ {(12<<2)|2,{70,50,0}}, +/* 49697 */ {(12<<2)|2,{70,50,0}}, +/* 49698 */ {(12<<2)|2,{70,50,0}}, +/* 49699 */ {(12<<2)|2,{70,50,0}}, +/* 49700 */ {(12<<2)|2,{70,50,0}}, +/* 49701 */ {(12<<2)|2,{70,50,0}}, +/* 49702 */ {(12<<2)|2,{70,50,0}}, +/* 49703 */ {(12<<2)|2,{70,50,0}}, +/* 49704 */ {(12<<2)|2,{70,50,0}}, +/* 49705 */ {(12<<2)|2,{70,50,0}}, +/* 49706 */ {(12<<2)|2,{70,50,0}}, +/* 49707 */ {(12<<2)|2,{70,50,0}}, +/* 49708 */ {(12<<2)|2,{70,50,0}}, +/* 49709 */ {(12<<2)|2,{70,50,0}}, +/* 49710 */ {(12<<2)|2,{70,50,0}}, +/* 49711 */ {(12<<2)|2,{70,50,0}}, +/* 49712 */ {(12<<2)|2,{70,97,0}}, +/* 49713 */ {(12<<2)|2,{70,97,0}}, +/* 49714 */ {(12<<2)|2,{70,97,0}}, +/* 49715 */ {(12<<2)|2,{70,97,0}}, +/* 49716 */ {(12<<2)|2,{70,97,0}}, +/* 49717 */ {(12<<2)|2,{70,97,0}}, +/* 49718 */ {(12<<2)|2,{70,97,0}}, +/* 49719 */ {(12<<2)|2,{70,97,0}}, +/* 49720 */ {(12<<2)|2,{70,97,0}}, +/* 49721 */ {(12<<2)|2,{70,97,0}}, +/* 49722 */ {(12<<2)|2,{70,97,0}}, +/* 49723 */ {(12<<2)|2,{70,97,0}}, +/* 49724 */ {(12<<2)|2,{70,97,0}}, +/* 49725 */ {(12<<2)|2,{70,97,0}}, +/* 49726 */ {(12<<2)|2,{70,97,0}}, +/* 49727 */ {(12<<2)|2,{70,97,0}}, +/* 49728 */ {(12<<2)|2,{70,99,0}}, +/* 49729 */ {(12<<2)|2,{70,99,0}}, +/* 49730 */ {(12<<2)|2,{70,99,0}}, +/* 49731 */ {(12<<2)|2,{70,99,0}}, +/* 49732 */ {(12<<2)|2,{70,99,0}}, +/* 49733 */ {(12<<2)|2,{70,99,0}}, +/* 49734 */ {(12<<2)|2,{70,99,0}}, +/* 49735 */ {(12<<2)|2,{70,99,0}}, +/* 49736 */ {(12<<2)|2,{70,99,0}}, +/* 49737 */ {(12<<2)|2,{70,99,0}}, +/* 49738 */ {(12<<2)|2,{70,99,0}}, +/* 49739 */ {(12<<2)|2,{70,99,0}}, +/* 49740 */ {(12<<2)|2,{70,99,0}}, +/* 49741 */ {(12<<2)|2,{70,99,0}}, +/* 49742 */ {(12<<2)|2,{70,99,0}}, +/* 49743 */ {(12<<2)|2,{70,99,0}}, +/* 49744 */ {(12<<2)|2,{70,101,0}}, +/* 49745 */ {(12<<2)|2,{70,101,0}}, +/* 49746 */ {(12<<2)|2,{70,101,0}}, +/* 49747 */ {(12<<2)|2,{70,101,0}}, +/* 49748 */ {(12<<2)|2,{70,101,0}}, +/* 49749 */ {(12<<2)|2,{70,101,0}}, +/* 49750 */ {(12<<2)|2,{70,101,0}}, +/* 49751 */ {(12<<2)|2,{70,101,0}}, +/* 49752 */ {(12<<2)|2,{70,101,0}}, +/* 49753 */ {(12<<2)|2,{70,101,0}}, +/* 49754 */ {(12<<2)|2,{70,101,0}}, +/* 49755 */ {(12<<2)|2,{70,101,0}}, +/* 49756 */ {(12<<2)|2,{70,101,0}}, +/* 49757 */ {(12<<2)|2,{70,101,0}}, +/* 49758 */ {(12<<2)|2,{70,101,0}}, +/* 49759 */ {(12<<2)|2,{70,101,0}}, +/* 49760 */ {(12<<2)|2,{70,105,0}}, +/* 49761 */ {(12<<2)|2,{70,105,0}}, +/* 49762 */ {(12<<2)|2,{70,105,0}}, +/* 49763 */ {(12<<2)|2,{70,105,0}}, +/* 49764 */ {(12<<2)|2,{70,105,0}}, +/* 49765 */ {(12<<2)|2,{70,105,0}}, +/* 49766 */ {(12<<2)|2,{70,105,0}}, +/* 49767 */ {(12<<2)|2,{70,105,0}}, +/* 49768 */ {(12<<2)|2,{70,105,0}}, +/* 49769 */ {(12<<2)|2,{70,105,0}}, +/* 49770 */ {(12<<2)|2,{70,105,0}}, +/* 49771 */ {(12<<2)|2,{70,105,0}}, +/* 49772 */ {(12<<2)|2,{70,105,0}}, +/* 49773 */ {(12<<2)|2,{70,105,0}}, +/* 49774 */ {(12<<2)|2,{70,105,0}}, +/* 49775 */ {(12<<2)|2,{70,105,0}}, +/* 49776 */ {(12<<2)|2,{70,111,0}}, +/* 49777 */ {(12<<2)|2,{70,111,0}}, +/* 49778 */ {(12<<2)|2,{70,111,0}}, +/* 49779 */ {(12<<2)|2,{70,111,0}}, +/* 49780 */ {(12<<2)|2,{70,111,0}}, +/* 49781 */ {(12<<2)|2,{70,111,0}}, +/* 49782 */ {(12<<2)|2,{70,111,0}}, +/* 49783 */ {(12<<2)|2,{70,111,0}}, +/* 49784 */ {(12<<2)|2,{70,111,0}}, +/* 49785 */ {(12<<2)|2,{70,111,0}}, +/* 49786 */ {(12<<2)|2,{70,111,0}}, +/* 49787 */ {(12<<2)|2,{70,111,0}}, +/* 49788 */ {(12<<2)|2,{70,111,0}}, +/* 49789 */ {(12<<2)|2,{70,111,0}}, +/* 49790 */ {(12<<2)|2,{70,111,0}}, +/* 49791 */ {(12<<2)|2,{70,111,0}}, +/* 49792 */ {(12<<2)|2,{70,115,0}}, +/* 49793 */ {(12<<2)|2,{70,115,0}}, +/* 49794 */ {(12<<2)|2,{70,115,0}}, +/* 49795 */ {(12<<2)|2,{70,115,0}}, +/* 49796 */ {(12<<2)|2,{70,115,0}}, +/* 49797 */ {(12<<2)|2,{70,115,0}}, +/* 49798 */ {(12<<2)|2,{70,115,0}}, +/* 49799 */ {(12<<2)|2,{70,115,0}}, +/* 49800 */ {(12<<2)|2,{70,115,0}}, +/* 49801 */ {(12<<2)|2,{70,115,0}}, +/* 49802 */ {(12<<2)|2,{70,115,0}}, +/* 49803 */ {(12<<2)|2,{70,115,0}}, +/* 49804 */ {(12<<2)|2,{70,115,0}}, +/* 49805 */ {(12<<2)|2,{70,115,0}}, +/* 49806 */ {(12<<2)|2,{70,115,0}}, +/* 49807 */ {(12<<2)|2,{70,115,0}}, +/* 49808 */ {(12<<2)|2,{70,116,0}}, +/* 49809 */ {(12<<2)|2,{70,116,0}}, +/* 49810 */ {(12<<2)|2,{70,116,0}}, +/* 49811 */ {(12<<2)|2,{70,116,0}}, +/* 49812 */ {(12<<2)|2,{70,116,0}}, +/* 49813 */ {(12<<2)|2,{70,116,0}}, +/* 49814 */ {(12<<2)|2,{70,116,0}}, +/* 49815 */ {(12<<2)|2,{70,116,0}}, +/* 49816 */ {(12<<2)|2,{70,116,0}}, +/* 49817 */ {(12<<2)|2,{70,116,0}}, +/* 49818 */ {(12<<2)|2,{70,116,0}}, +/* 49819 */ {(12<<2)|2,{70,116,0}}, +/* 49820 */ {(12<<2)|2,{70,116,0}}, +/* 49821 */ {(12<<2)|2,{70,116,0}}, +/* 49822 */ {(12<<2)|2,{70,116,0}}, +/* 49823 */ {(12<<2)|2,{70,116,0}}, +/* 49824 */ {(13<<2)|2,{70,32,0}}, +/* 49825 */ {(13<<2)|2,{70,32,0}}, +/* 49826 */ {(13<<2)|2,{70,32,0}}, +/* 49827 */ {(13<<2)|2,{70,32,0}}, +/* 49828 */ {(13<<2)|2,{70,32,0}}, +/* 49829 */ {(13<<2)|2,{70,32,0}}, +/* 49830 */ {(13<<2)|2,{70,32,0}}, +/* 49831 */ {(13<<2)|2,{70,32,0}}, +/* 49832 */ {(13<<2)|2,{70,37,0}}, +/* 49833 */ {(13<<2)|2,{70,37,0}}, +/* 49834 */ {(13<<2)|2,{70,37,0}}, +/* 49835 */ {(13<<2)|2,{70,37,0}}, +/* 49836 */ {(13<<2)|2,{70,37,0}}, +/* 49837 */ {(13<<2)|2,{70,37,0}}, +/* 49838 */ {(13<<2)|2,{70,37,0}}, +/* 49839 */ {(13<<2)|2,{70,37,0}}, +/* 49840 */ {(13<<2)|2,{70,45,0}}, +/* 49841 */ {(13<<2)|2,{70,45,0}}, +/* 49842 */ {(13<<2)|2,{70,45,0}}, +/* 49843 */ {(13<<2)|2,{70,45,0}}, +/* 49844 */ {(13<<2)|2,{70,45,0}}, +/* 49845 */ {(13<<2)|2,{70,45,0}}, +/* 49846 */ {(13<<2)|2,{70,45,0}}, +/* 49847 */ {(13<<2)|2,{70,45,0}}, +/* 49848 */ {(13<<2)|2,{70,46,0}}, +/* 49849 */ {(13<<2)|2,{70,46,0}}, +/* 49850 */ {(13<<2)|2,{70,46,0}}, +/* 49851 */ {(13<<2)|2,{70,46,0}}, +/* 49852 */ {(13<<2)|2,{70,46,0}}, +/* 49853 */ {(13<<2)|2,{70,46,0}}, +/* 49854 */ {(13<<2)|2,{70,46,0}}, +/* 49855 */ {(13<<2)|2,{70,46,0}}, +/* 49856 */ {(13<<2)|2,{70,47,0}}, +/* 49857 */ {(13<<2)|2,{70,47,0}}, +/* 49858 */ {(13<<2)|2,{70,47,0}}, +/* 49859 */ {(13<<2)|2,{70,47,0}}, +/* 49860 */ {(13<<2)|2,{70,47,0}}, +/* 49861 */ {(13<<2)|2,{70,47,0}}, +/* 49862 */ {(13<<2)|2,{70,47,0}}, +/* 49863 */ {(13<<2)|2,{70,47,0}}, +/* 49864 */ {(13<<2)|2,{70,51,0}}, +/* 49865 */ {(13<<2)|2,{70,51,0}}, +/* 49866 */ {(13<<2)|2,{70,51,0}}, +/* 49867 */ {(13<<2)|2,{70,51,0}}, +/* 49868 */ {(13<<2)|2,{70,51,0}}, +/* 49869 */ {(13<<2)|2,{70,51,0}}, +/* 49870 */ {(13<<2)|2,{70,51,0}}, +/* 49871 */ {(13<<2)|2,{70,51,0}}, +/* 49872 */ {(13<<2)|2,{70,52,0}}, +/* 49873 */ {(13<<2)|2,{70,52,0}}, +/* 49874 */ {(13<<2)|2,{70,52,0}}, +/* 49875 */ {(13<<2)|2,{70,52,0}}, +/* 49876 */ {(13<<2)|2,{70,52,0}}, +/* 49877 */ {(13<<2)|2,{70,52,0}}, +/* 49878 */ {(13<<2)|2,{70,52,0}}, +/* 49879 */ {(13<<2)|2,{70,52,0}}, +/* 49880 */ {(13<<2)|2,{70,53,0}}, +/* 49881 */ {(13<<2)|2,{70,53,0}}, +/* 49882 */ {(13<<2)|2,{70,53,0}}, +/* 49883 */ {(13<<2)|2,{70,53,0}}, +/* 49884 */ {(13<<2)|2,{70,53,0}}, +/* 49885 */ {(13<<2)|2,{70,53,0}}, +/* 49886 */ {(13<<2)|2,{70,53,0}}, +/* 49887 */ {(13<<2)|2,{70,53,0}}, +/* 49888 */ {(13<<2)|2,{70,54,0}}, +/* 49889 */ {(13<<2)|2,{70,54,0}}, +/* 49890 */ {(13<<2)|2,{70,54,0}}, +/* 49891 */ {(13<<2)|2,{70,54,0}}, +/* 49892 */ {(13<<2)|2,{70,54,0}}, +/* 49893 */ {(13<<2)|2,{70,54,0}}, +/* 49894 */ {(13<<2)|2,{70,54,0}}, +/* 49895 */ {(13<<2)|2,{70,54,0}}, +/* 49896 */ {(13<<2)|2,{70,55,0}}, +/* 49897 */ {(13<<2)|2,{70,55,0}}, +/* 49898 */ {(13<<2)|2,{70,55,0}}, +/* 49899 */ {(13<<2)|2,{70,55,0}}, +/* 49900 */ {(13<<2)|2,{70,55,0}}, +/* 49901 */ {(13<<2)|2,{70,55,0}}, +/* 49902 */ {(13<<2)|2,{70,55,0}}, +/* 49903 */ {(13<<2)|2,{70,55,0}}, +/* 49904 */ {(13<<2)|2,{70,56,0}}, +/* 49905 */ {(13<<2)|2,{70,56,0}}, +/* 49906 */ {(13<<2)|2,{70,56,0}}, +/* 49907 */ {(13<<2)|2,{70,56,0}}, +/* 49908 */ {(13<<2)|2,{70,56,0}}, +/* 49909 */ {(13<<2)|2,{70,56,0}}, +/* 49910 */ {(13<<2)|2,{70,56,0}}, +/* 49911 */ {(13<<2)|2,{70,56,0}}, +/* 49912 */ {(13<<2)|2,{70,57,0}}, +/* 49913 */ {(13<<2)|2,{70,57,0}}, +/* 49914 */ {(13<<2)|2,{70,57,0}}, +/* 49915 */ {(13<<2)|2,{70,57,0}}, +/* 49916 */ {(13<<2)|2,{70,57,0}}, +/* 49917 */ {(13<<2)|2,{70,57,0}}, +/* 49918 */ {(13<<2)|2,{70,57,0}}, +/* 49919 */ {(13<<2)|2,{70,57,0}}, +/* 49920 */ {(13<<2)|2,{70,61,0}}, +/* 49921 */ {(13<<2)|2,{70,61,0}}, +/* 49922 */ {(13<<2)|2,{70,61,0}}, +/* 49923 */ {(13<<2)|2,{70,61,0}}, +/* 49924 */ {(13<<2)|2,{70,61,0}}, +/* 49925 */ {(13<<2)|2,{70,61,0}}, +/* 49926 */ {(13<<2)|2,{70,61,0}}, +/* 49927 */ {(13<<2)|2,{70,61,0}}, +/* 49928 */ {(13<<2)|2,{70,65,0}}, +/* 49929 */ {(13<<2)|2,{70,65,0}}, +/* 49930 */ {(13<<2)|2,{70,65,0}}, +/* 49931 */ {(13<<2)|2,{70,65,0}}, +/* 49932 */ {(13<<2)|2,{70,65,0}}, +/* 49933 */ {(13<<2)|2,{70,65,0}}, +/* 49934 */ {(13<<2)|2,{70,65,0}}, +/* 49935 */ {(13<<2)|2,{70,65,0}}, +/* 49936 */ {(13<<2)|2,{70,95,0}}, +/* 49937 */ {(13<<2)|2,{70,95,0}}, +/* 49938 */ {(13<<2)|2,{70,95,0}}, +/* 49939 */ {(13<<2)|2,{70,95,0}}, +/* 49940 */ {(13<<2)|2,{70,95,0}}, +/* 49941 */ {(13<<2)|2,{70,95,0}}, +/* 49942 */ {(13<<2)|2,{70,95,0}}, +/* 49943 */ {(13<<2)|2,{70,95,0}}, +/* 49944 */ {(13<<2)|2,{70,98,0}}, +/* 49945 */ {(13<<2)|2,{70,98,0}}, +/* 49946 */ {(13<<2)|2,{70,98,0}}, +/* 49947 */ {(13<<2)|2,{70,98,0}}, +/* 49948 */ {(13<<2)|2,{70,98,0}}, +/* 49949 */ {(13<<2)|2,{70,98,0}}, +/* 49950 */ {(13<<2)|2,{70,98,0}}, +/* 49951 */ {(13<<2)|2,{70,98,0}}, +/* 49952 */ {(13<<2)|2,{70,100,0}}, +/* 49953 */ {(13<<2)|2,{70,100,0}}, +/* 49954 */ {(13<<2)|2,{70,100,0}}, +/* 49955 */ {(13<<2)|2,{70,100,0}}, +/* 49956 */ {(13<<2)|2,{70,100,0}}, +/* 49957 */ {(13<<2)|2,{70,100,0}}, +/* 49958 */ {(13<<2)|2,{70,100,0}}, +/* 49959 */ {(13<<2)|2,{70,100,0}}, +/* 49960 */ {(13<<2)|2,{70,102,0}}, +/* 49961 */ {(13<<2)|2,{70,102,0}}, +/* 49962 */ {(13<<2)|2,{70,102,0}}, +/* 49963 */ {(13<<2)|2,{70,102,0}}, +/* 49964 */ {(13<<2)|2,{70,102,0}}, +/* 49965 */ {(13<<2)|2,{70,102,0}}, +/* 49966 */ {(13<<2)|2,{70,102,0}}, +/* 49967 */ {(13<<2)|2,{70,102,0}}, +/* 49968 */ {(13<<2)|2,{70,103,0}}, +/* 49969 */ {(13<<2)|2,{70,103,0}}, +/* 49970 */ {(13<<2)|2,{70,103,0}}, +/* 49971 */ {(13<<2)|2,{70,103,0}}, +/* 49972 */ {(13<<2)|2,{70,103,0}}, +/* 49973 */ {(13<<2)|2,{70,103,0}}, +/* 49974 */ {(13<<2)|2,{70,103,0}}, +/* 49975 */ {(13<<2)|2,{70,103,0}}, +/* 49976 */ {(13<<2)|2,{70,104,0}}, +/* 49977 */ {(13<<2)|2,{70,104,0}}, +/* 49978 */ {(13<<2)|2,{70,104,0}}, +/* 49979 */ {(13<<2)|2,{70,104,0}}, +/* 49980 */ {(13<<2)|2,{70,104,0}}, +/* 49981 */ {(13<<2)|2,{70,104,0}}, +/* 49982 */ {(13<<2)|2,{70,104,0}}, +/* 49983 */ {(13<<2)|2,{70,104,0}}, +/* 49984 */ {(13<<2)|2,{70,108,0}}, +/* 49985 */ {(13<<2)|2,{70,108,0}}, +/* 49986 */ {(13<<2)|2,{70,108,0}}, +/* 49987 */ {(13<<2)|2,{70,108,0}}, +/* 49988 */ {(13<<2)|2,{70,108,0}}, +/* 49989 */ {(13<<2)|2,{70,108,0}}, +/* 49990 */ {(13<<2)|2,{70,108,0}}, +/* 49991 */ {(13<<2)|2,{70,108,0}}, +/* 49992 */ {(13<<2)|2,{70,109,0}}, +/* 49993 */ {(13<<2)|2,{70,109,0}}, +/* 49994 */ {(13<<2)|2,{70,109,0}}, +/* 49995 */ {(13<<2)|2,{70,109,0}}, +/* 49996 */ {(13<<2)|2,{70,109,0}}, +/* 49997 */ {(13<<2)|2,{70,109,0}}, +/* 49998 */ {(13<<2)|2,{70,109,0}}, +/* 49999 */ {(13<<2)|2,{70,109,0}}, +/* 50000 */ {(13<<2)|2,{70,110,0}}, +/* 50001 */ {(13<<2)|2,{70,110,0}}, +/* 50002 */ {(13<<2)|2,{70,110,0}}, +/* 50003 */ {(13<<2)|2,{70,110,0}}, +/* 50004 */ {(13<<2)|2,{70,110,0}}, +/* 50005 */ {(13<<2)|2,{70,110,0}}, +/* 50006 */ {(13<<2)|2,{70,110,0}}, +/* 50007 */ {(13<<2)|2,{70,110,0}}, +/* 50008 */ {(13<<2)|2,{70,112,0}}, +/* 50009 */ {(13<<2)|2,{70,112,0}}, +/* 50010 */ {(13<<2)|2,{70,112,0}}, +/* 50011 */ {(13<<2)|2,{70,112,0}}, +/* 50012 */ {(13<<2)|2,{70,112,0}}, +/* 50013 */ {(13<<2)|2,{70,112,0}}, +/* 50014 */ {(13<<2)|2,{70,112,0}}, +/* 50015 */ {(13<<2)|2,{70,112,0}}, +/* 50016 */ {(13<<2)|2,{70,114,0}}, +/* 50017 */ {(13<<2)|2,{70,114,0}}, +/* 50018 */ {(13<<2)|2,{70,114,0}}, +/* 50019 */ {(13<<2)|2,{70,114,0}}, +/* 50020 */ {(13<<2)|2,{70,114,0}}, +/* 50021 */ {(13<<2)|2,{70,114,0}}, +/* 50022 */ {(13<<2)|2,{70,114,0}}, +/* 50023 */ {(13<<2)|2,{70,114,0}}, +/* 50024 */ {(13<<2)|2,{70,117,0}}, +/* 50025 */ {(13<<2)|2,{70,117,0}}, +/* 50026 */ {(13<<2)|2,{70,117,0}}, +/* 50027 */ {(13<<2)|2,{70,117,0}}, +/* 50028 */ {(13<<2)|2,{70,117,0}}, +/* 50029 */ {(13<<2)|2,{70,117,0}}, +/* 50030 */ {(13<<2)|2,{70,117,0}}, +/* 50031 */ {(13<<2)|2,{70,117,0}}, +/* 50032 */ {(14<<2)|2,{70,58,0}}, +/* 50033 */ {(14<<2)|2,{70,58,0}}, +/* 50034 */ {(14<<2)|2,{70,58,0}}, +/* 50035 */ {(14<<2)|2,{70,58,0}}, +/* 50036 */ {(14<<2)|2,{70,66,0}}, +/* 50037 */ {(14<<2)|2,{70,66,0}}, +/* 50038 */ {(14<<2)|2,{70,66,0}}, +/* 50039 */ {(14<<2)|2,{70,66,0}}, +/* 50040 */ {(14<<2)|2,{70,67,0}}, +/* 50041 */ {(14<<2)|2,{70,67,0}}, +/* 50042 */ {(14<<2)|2,{70,67,0}}, +/* 50043 */ {(14<<2)|2,{70,67,0}}, +/* 50044 */ {(14<<2)|2,{70,68,0}}, +/* 50045 */ {(14<<2)|2,{70,68,0}}, +/* 50046 */ {(14<<2)|2,{70,68,0}}, +/* 50047 */ {(14<<2)|2,{70,68,0}}, +/* 50048 */ {(14<<2)|2,{70,69,0}}, +/* 50049 */ {(14<<2)|2,{70,69,0}}, +/* 50050 */ {(14<<2)|2,{70,69,0}}, +/* 50051 */ {(14<<2)|2,{70,69,0}}, +/* 50052 */ {(14<<2)|2,{70,70,0}}, +/* 50053 */ {(14<<2)|2,{70,70,0}}, +/* 50054 */ {(14<<2)|2,{70,70,0}}, +/* 50055 */ {(14<<2)|2,{70,70,0}}, +/* 50056 */ {(14<<2)|2,{70,71,0}}, +/* 50057 */ {(14<<2)|2,{70,71,0}}, +/* 50058 */ {(14<<2)|2,{70,71,0}}, +/* 50059 */ {(14<<2)|2,{70,71,0}}, +/* 50060 */ {(14<<2)|2,{70,72,0}}, +/* 50061 */ {(14<<2)|2,{70,72,0}}, +/* 50062 */ {(14<<2)|2,{70,72,0}}, +/* 50063 */ {(14<<2)|2,{70,72,0}}, +/* 50064 */ {(14<<2)|2,{70,73,0}}, +/* 50065 */ {(14<<2)|2,{70,73,0}}, +/* 50066 */ {(14<<2)|2,{70,73,0}}, +/* 50067 */ {(14<<2)|2,{70,73,0}}, +/* 50068 */ {(14<<2)|2,{70,74,0}}, +/* 50069 */ {(14<<2)|2,{70,74,0}}, +/* 50070 */ {(14<<2)|2,{70,74,0}}, +/* 50071 */ {(14<<2)|2,{70,74,0}}, +/* 50072 */ {(14<<2)|2,{70,75,0}}, +/* 50073 */ {(14<<2)|2,{70,75,0}}, +/* 50074 */ {(14<<2)|2,{70,75,0}}, +/* 50075 */ {(14<<2)|2,{70,75,0}}, +/* 50076 */ {(14<<2)|2,{70,76,0}}, +/* 50077 */ {(14<<2)|2,{70,76,0}}, +/* 50078 */ {(14<<2)|2,{70,76,0}}, +/* 50079 */ {(14<<2)|2,{70,76,0}}, +/* 50080 */ {(14<<2)|2,{70,77,0}}, +/* 50081 */ {(14<<2)|2,{70,77,0}}, +/* 50082 */ {(14<<2)|2,{70,77,0}}, +/* 50083 */ {(14<<2)|2,{70,77,0}}, +/* 50084 */ {(14<<2)|2,{70,78,0}}, +/* 50085 */ {(14<<2)|2,{70,78,0}}, +/* 50086 */ {(14<<2)|2,{70,78,0}}, +/* 50087 */ {(14<<2)|2,{70,78,0}}, +/* 50088 */ {(14<<2)|2,{70,79,0}}, +/* 50089 */ {(14<<2)|2,{70,79,0}}, +/* 50090 */ {(14<<2)|2,{70,79,0}}, +/* 50091 */ {(14<<2)|2,{70,79,0}}, +/* 50092 */ {(14<<2)|2,{70,80,0}}, +/* 50093 */ {(14<<2)|2,{70,80,0}}, +/* 50094 */ {(14<<2)|2,{70,80,0}}, +/* 50095 */ {(14<<2)|2,{70,80,0}}, +/* 50096 */ {(14<<2)|2,{70,81,0}}, +/* 50097 */ {(14<<2)|2,{70,81,0}}, +/* 50098 */ {(14<<2)|2,{70,81,0}}, +/* 50099 */ {(14<<2)|2,{70,81,0}}, +/* 50100 */ {(14<<2)|2,{70,82,0}}, +/* 50101 */ {(14<<2)|2,{70,82,0}}, +/* 50102 */ {(14<<2)|2,{70,82,0}}, +/* 50103 */ {(14<<2)|2,{70,82,0}}, +/* 50104 */ {(14<<2)|2,{70,83,0}}, +/* 50105 */ {(14<<2)|2,{70,83,0}}, +/* 50106 */ {(14<<2)|2,{70,83,0}}, +/* 50107 */ {(14<<2)|2,{70,83,0}}, +/* 50108 */ {(14<<2)|2,{70,84,0}}, +/* 50109 */ {(14<<2)|2,{70,84,0}}, +/* 50110 */ {(14<<2)|2,{70,84,0}}, +/* 50111 */ {(14<<2)|2,{70,84,0}}, +/* 50112 */ {(14<<2)|2,{70,85,0}}, +/* 50113 */ {(14<<2)|2,{70,85,0}}, +/* 50114 */ {(14<<2)|2,{70,85,0}}, +/* 50115 */ {(14<<2)|2,{70,85,0}}, +/* 50116 */ {(14<<2)|2,{70,86,0}}, +/* 50117 */ {(14<<2)|2,{70,86,0}}, +/* 50118 */ {(14<<2)|2,{70,86,0}}, +/* 50119 */ {(14<<2)|2,{70,86,0}}, +/* 50120 */ {(14<<2)|2,{70,87,0}}, +/* 50121 */ {(14<<2)|2,{70,87,0}}, +/* 50122 */ {(14<<2)|2,{70,87,0}}, +/* 50123 */ {(14<<2)|2,{70,87,0}}, +/* 50124 */ {(14<<2)|2,{70,89,0}}, +/* 50125 */ {(14<<2)|2,{70,89,0}}, +/* 50126 */ {(14<<2)|2,{70,89,0}}, +/* 50127 */ {(14<<2)|2,{70,89,0}}, +/* 50128 */ {(14<<2)|2,{70,106,0}}, +/* 50129 */ {(14<<2)|2,{70,106,0}}, +/* 50130 */ {(14<<2)|2,{70,106,0}}, +/* 50131 */ {(14<<2)|2,{70,106,0}}, +/* 50132 */ {(14<<2)|2,{70,107,0}}, +/* 50133 */ {(14<<2)|2,{70,107,0}}, +/* 50134 */ {(14<<2)|2,{70,107,0}}, +/* 50135 */ {(14<<2)|2,{70,107,0}}, +/* 50136 */ {(14<<2)|2,{70,113,0}}, +/* 50137 */ {(14<<2)|2,{70,113,0}}, +/* 50138 */ {(14<<2)|2,{70,113,0}}, +/* 50139 */ {(14<<2)|2,{70,113,0}}, +/* 50140 */ {(14<<2)|2,{70,118,0}}, +/* 50141 */ {(14<<2)|2,{70,118,0}}, +/* 50142 */ {(14<<2)|2,{70,118,0}}, +/* 50143 */ {(14<<2)|2,{70,118,0}}, +/* 50144 */ {(14<<2)|2,{70,119,0}}, +/* 50145 */ {(14<<2)|2,{70,119,0}}, +/* 50146 */ {(14<<2)|2,{70,119,0}}, +/* 50147 */ {(14<<2)|2,{70,119,0}}, +/* 50148 */ {(14<<2)|2,{70,120,0}}, +/* 50149 */ {(14<<2)|2,{70,120,0}}, +/* 50150 */ {(14<<2)|2,{70,120,0}}, +/* 50151 */ {(14<<2)|2,{70,120,0}}, +/* 50152 */ {(14<<2)|2,{70,121,0}}, +/* 50153 */ {(14<<2)|2,{70,121,0}}, +/* 50154 */ {(14<<2)|2,{70,121,0}}, +/* 50155 */ {(14<<2)|2,{70,121,0}}, +/* 50156 */ {(14<<2)|2,{70,122,0}}, +/* 50157 */ {(14<<2)|2,{70,122,0}}, +/* 50158 */ {(14<<2)|2,{70,122,0}}, +/* 50159 */ {(14<<2)|2,{70,122,0}}, +/* 50160 */ {(15<<2)|2,{70,38,0}}, +/* 50161 */ {(15<<2)|2,{70,38,0}}, +/* 50162 */ {(15<<2)|2,{70,42,0}}, +/* 50163 */ {(15<<2)|2,{70,42,0}}, +/* 50164 */ {(15<<2)|2,{70,44,0}}, +/* 50165 */ {(15<<2)|2,{70,44,0}}, +/* 50166 */ {(15<<2)|2,{70,59,0}}, +/* 50167 */ {(15<<2)|2,{70,59,0}}, +/* 50168 */ {(15<<2)|2,{70,88,0}}, +/* 50169 */ {(15<<2)|2,{70,88,0}}, +/* 50170 */ {(15<<2)|2,{70,90,0}}, +/* 50171 */ {(15<<2)|2,{70,90,0}}, +/* 50172 */ {(7<<2)|1,{70,0,0}}, +/* 50173 */ {(7<<2)|1,{70,0,0}}, +/* 50174 */ {(7<<2)|1,{70,0,0}}, +/* 50175 */ {(7<<2)|1,{70,0,0}}, +/* 50176 */ {(12<<2)|2,{71,48,0}}, +/* 50177 */ {(12<<2)|2,{71,48,0}}, +/* 50178 */ {(12<<2)|2,{71,48,0}}, +/* 50179 */ {(12<<2)|2,{71,48,0}}, +/* 50180 */ {(12<<2)|2,{71,48,0}}, +/* 50181 */ {(12<<2)|2,{71,48,0}}, +/* 50182 */ {(12<<2)|2,{71,48,0}}, +/* 50183 */ {(12<<2)|2,{71,48,0}}, +/* 50184 */ {(12<<2)|2,{71,48,0}}, +/* 50185 */ {(12<<2)|2,{71,48,0}}, +/* 50186 */ {(12<<2)|2,{71,48,0}}, +/* 50187 */ {(12<<2)|2,{71,48,0}}, +/* 50188 */ {(12<<2)|2,{71,48,0}}, +/* 50189 */ {(12<<2)|2,{71,48,0}}, +/* 50190 */ {(12<<2)|2,{71,48,0}}, +/* 50191 */ {(12<<2)|2,{71,48,0}}, +/* 50192 */ {(12<<2)|2,{71,49,0}}, +/* 50193 */ {(12<<2)|2,{71,49,0}}, +/* 50194 */ {(12<<2)|2,{71,49,0}}, +/* 50195 */ {(12<<2)|2,{71,49,0}}, +/* 50196 */ {(12<<2)|2,{71,49,0}}, +/* 50197 */ {(12<<2)|2,{71,49,0}}, +/* 50198 */ {(12<<2)|2,{71,49,0}}, +/* 50199 */ {(12<<2)|2,{71,49,0}}, +/* 50200 */ {(12<<2)|2,{71,49,0}}, +/* 50201 */ {(12<<2)|2,{71,49,0}}, +/* 50202 */ {(12<<2)|2,{71,49,0}}, +/* 50203 */ {(12<<2)|2,{71,49,0}}, +/* 50204 */ {(12<<2)|2,{71,49,0}}, +/* 50205 */ {(12<<2)|2,{71,49,0}}, +/* 50206 */ {(12<<2)|2,{71,49,0}}, +/* 50207 */ {(12<<2)|2,{71,49,0}}, +/* 50208 */ {(12<<2)|2,{71,50,0}}, +/* 50209 */ {(12<<2)|2,{71,50,0}}, +/* 50210 */ {(12<<2)|2,{71,50,0}}, +/* 50211 */ {(12<<2)|2,{71,50,0}}, +/* 50212 */ {(12<<2)|2,{71,50,0}}, +/* 50213 */ {(12<<2)|2,{71,50,0}}, +/* 50214 */ {(12<<2)|2,{71,50,0}}, +/* 50215 */ {(12<<2)|2,{71,50,0}}, +/* 50216 */ {(12<<2)|2,{71,50,0}}, +/* 50217 */ {(12<<2)|2,{71,50,0}}, +/* 50218 */ {(12<<2)|2,{71,50,0}}, +/* 50219 */ {(12<<2)|2,{71,50,0}}, +/* 50220 */ {(12<<2)|2,{71,50,0}}, +/* 50221 */ {(12<<2)|2,{71,50,0}}, +/* 50222 */ {(12<<2)|2,{71,50,0}}, +/* 50223 */ {(12<<2)|2,{71,50,0}}, +/* 50224 */ {(12<<2)|2,{71,97,0}}, +/* 50225 */ {(12<<2)|2,{71,97,0}}, +/* 50226 */ {(12<<2)|2,{71,97,0}}, +/* 50227 */ {(12<<2)|2,{71,97,0}}, +/* 50228 */ {(12<<2)|2,{71,97,0}}, +/* 50229 */ {(12<<2)|2,{71,97,0}}, +/* 50230 */ {(12<<2)|2,{71,97,0}}, +/* 50231 */ {(12<<2)|2,{71,97,0}}, +/* 50232 */ {(12<<2)|2,{71,97,0}}, +/* 50233 */ {(12<<2)|2,{71,97,0}}, +/* 50234 */ {(12<<2)|2,{71,97,0}}, +/* 50235 */ {(12<<2)|2,{71,97,0}}, +/* 50236 */ {(12<<2)|2,{71,97,0}}, +/* 50237 */ {(12<<2)|2,{71,97,0}}, +/* 50238 */ {(12<<2)|2,{71,97,0}}, +/* 50239 */ {(12<<2)|2,{71,97,0}}, +/* 50240 */ {(12<<2)|2,{71,99,0}}, +/* 50241 */ {(12<<2)|2,{71,99,0}}, +/* 50242 */ {(12<<2)|2,{71,99,0}}, +/* 50243 */ {(12<<2)|2,{71,99,0}}, +/* 50244 */ {(12<<2)|2,{71,99,0}}, +/* 50245 */ {(12<<2)|2,{71,99,0}}, +/* 50246 */ {(12<<2)|2,{71,99,0}}, +/* 50247 */ {(12<<2)|2,{71,99,0}}, +/* 50248 */ {(12<<2)|2,{71,99,0}}, +/* 50249 */ {(12<<2)|2,{71,99,0}}, +/* 50250 */ {(12<<2)|2,{71,99,0}}, +/* 50251 */ {(12<<2)|2,{71,99,0}}, +/* 50252 */ {(12<<2)|2,{71,99,0}}, +/* 50253 */ {(12<<2)|2,{71,99,0}}, +/* 50254 */ {(12<<2)|2,{71,99,0}}, +/* 50255 */ {(12<<2)|2,{71,99,0}}, +/* 50256 */ {(12<<2)|2,{71,101,0}}, +/* 50257 */ {(12<<2)|2,{71,101,0}}, +/* 50258 */ {(12<<2)|2,{71,101,0}}, +/* 50259 */ {(12<<2)|2,{71,101,0}}, +/* 50260 */ {(12<<2)|2,{71,101,0}}, +/* 50261 */ {(12<<2)|2,{71,101,0}}, +/* 50262 */ {(12<<2)|2,{71,101,0}}, +/* 50263 */ {(12<<2)|2,{71,101,0}}, +/* 50264 */ {(12<<2)|2,{71,101,0}}, +/* 50265 */ {(12<<2)|2,{71,101,0}}, +/* 50266 */ {(12<<2)|2,{71,101,0}}, +/* 50267 */ {(12<<2)|2,{71,101,0}}, +/* 50268 */ {(12<<2)|2,{71,101,0}}, +/* 50269 */ {(12<<2)|2,{71,101,0}}, +/* 50270 */ {(12<<2)|2,{71,101,0}}, +/* 50271 */ {(12<<2)|2,{71,101,0}}, +/* 50272 */ {(12<<2)|2,{71,105,0}}, +/* 50273 */ {(12<<2)|2,{71,105,0}}, +/* 50274 */ {(12<<2)|2,{71,105,0}}, +/* 50275 */ {(12<<2)|2,{71,105,0}}, +/* 50276 */ {(12<<2)|2,{71,105,0}}, +/* 50277 */ {(12<<2)|2,{71,105,0}}, +/* 50278 */ {(12<<2)|2,{71,105,0}}, +/* 50279 */ {(12<<2)|2,{71,105,0}}, +/* 50280 */ {(12<<2)|2,{71,105,0}}, +/* 50281 */ {(12<<2)|2,{71,105,0}}, +/* 50282 */ {(12<<2)|2,{71,105,0}}, +/* 50283 */ {(12<<2)|2,{71,105,0}}, +/* 50284 */ {(12<<2)|2,{71,105,0}}, +/* 50285 */ {(12<<2)|2,{71,105,0}}, +/* 50286 */ {(12<<2)|2,{71,105,0}}, +/* 50287 */ {(12<<2)|2,{71,105,0}}, +/* 50288 */ {(12<<2)|2,{71,111,0}}, +/* 50289 */ {(12<<2)|2,{71,111,0}}, +/* 50290 */ {(12<<2)|2,{71,111,0}}, +/* 50291 */ {(12<<2)|2,{71,111,0}}, +/* 50292 */ {(12<<2)|2,{71,111,0}}, +/* 50293 */ {(12<<2)|2,{71,111,0}}, +/* 50294 */ {(12<<2)|2,{71,111,0}}, +/* 50295 */ {(12<<2)|2,{71,111,0}}, +/* 50296 */ {(12<<2)|2,{71,111,0}}, +/* 50297 */ {(12<<2)|2,{71,111,0}}, +/* 50298 */ {(12<<2)|2,{71,111,0}}, +/* 50299 */ {(12<<2)|2,{71,111,0}}, +/* 50300 */ {(12<<2)|2,{71,111,0}}, +/* 50301 */ {(12<<2)|2,{71,111,0}}, +/* 50302 */ {(12<<2)|2,{71,111,0}}, +/* 50303 */ {(12<<2)|2,{71,111,0}}, +/* 50304 */ {(12<<2)|2,{71,115,0}}, +/* 50305 */ {(12<<2)|2,{71,115,0}}, +/* 50306 */ {(12<<2)|2,{71,115,0}}, +/* 50307 */ {(12<<2)|2,{71,115,0}}, +/* 50308 */ {(12<<2)|2,{71,115,0}}, +/* 50309 */ {(12<<2)|2,{71,115,0}}, +/* 50310 */ {(12<<2)|2,{71,115,0}}, +/* 50311 */ {(12<<2)|2,{71,115,0}}, +/* 50312 */ {(12<<2)|2,{71,115,0}}, +/* 50313 */ {(12<<2)|2,{71,115,0}}, +/* 50314 */ {(12<<2)|2,{71,115,0}}, +/* 50315 */ {(12<<2)|2,{71,115,0}}, +/* 50316 */ {(12<<2)|2,{71,115,0}}, +/* 50317 */ {(12<<2)|2,{71,115,0}}, +/* 50318 */ {(12<<2)|2,{71,115,0}}, +/* 50319 */ {(12<<2)|2,{71,115,0}}, +/* 50320 */ {(12<<2)|2,{71,116,0}}, +/* 50321 */ {(12<<2)|2,{71,116,0}}, +/* 50322 */ {(12<<2)|2,{71,116,0}}, +/* 50323 */ {(12<<2)|2,{71,116,0}}, +/* 50324 */ {(12<<2)|2,{71,116,0}}, +/* 50325 */ {(12<<2)|2,{71,116,0}}, +/* 50326 */ {(12<<2)|2,{71,116,0}}, +/* 50327 */ {(12<<2)|2,{71,116,0}}, +/* 50328 */ {(12<<2)|2,{71,116,0}}, +/* 50329 */ {(12<<2)|2,{71,116,0}}, +/* 50330 */ {(12<<2)|2,{71,116,0}}, +/* 50331 */ {(12<<2)|2,{71,116,0}}, +/* 50332 */ {(12<<2)|2,{71,116,0}}, +/* 50333 */ {(12<<2)|2,{71,116,0}}, +/* 50334 */ {(12<<2)|2,{71,116,0}}, +/* 50335 */ {(12<<2)|2,{71,116,0}}, +/* 50336 */ {(13<<2)|2,{71,32,0}}, +/* 50337 */ {(13<<2)|2,{71,32,0}}, +/* 50338 */ {(13<<2)|2,{71,32,0}}, +/* 50339 */ {(13<<2)|2,{71,32,0}}, +/* 50340 */ {(13<<2)|2,{71,32,0}}, +/* 50341 */ {(13<<2)|2,{71,32,0}}, +/* 50342 */ {(13<<2)|2,{71,32,0}}, +/* 50343 */ {(13<<2)|2,{71,32,0}}, +/* 50344 */ {(13<<2)|2,{71,37,0}}, +/* 50345 */ {(13<<2)|2,{71,37,0}}, +/* 50346 */ {(13<<2)|2,{71,37,0}}, +/* 50347 */ {(13<<2)|2,{71,37,0}}, +/* 50348 */ {(13<<2)|2,{71,37,0}}, +/* 50349 */ {(13<<2)|2,{71,37,0}}, +/* 50350 */ {(13<<2)|2,{71,37,0}}, +/* 50351 */ {(13<<2)|2,{71,37,0}}, +/* 50352 */ {(13<<2)|2,{71,45,0}}, +/* 50353 */ {(13<<2)|2,{71,45,0}}, +/* 50354 */ {(13<<2)|2,{71,45,0}}, +/* 50355 */ {(13<<2)|2,{71,45,0}}, +/* 50356 */ {(13<<2)|2,{71,45,0}}, +/* 50357 */ {(13<<2)|2,{71,45,0}}, +/* 50358 */ {(13<<2)|2,{71,45,0}}, +/* 50359 */ {(13<<2)|2,{71,45,0}}, +/* 50360 */ {(13<<2)|2,{71,46,0}}, +/* 50361 */ {(13<<2)|2,{71,46,0}}, +/* 50362 */ {(13<<2)|2,{71,46,0}}, +/* 50363 */ {(13<<2)|2,{71,46,0}}, +/* 50364 */ {(13<<2)|2,{71,46,0}}, +/* 50365 */ {(13<<2)|2,{71,46,0}}, +/* 50366 */ {(13<<2)|2,{71,46,0}}, +/* 50367 */ {(13<<2)|2,{71,46,0}}, +/* 50368 */ {(13<<2)|2,{71,47,0}}, +/* 50369 */ {(13<<2)|2,{71,47,0}}, +/* 50370 */ {(13<<2)|2,{71,47,0}}, +/* 50371 */ {(13<<2)|2,{71,47,0}}, +/* 50372 */ {(13<<2)|2,{71,47,0}}, +/* 50373 */ {(13<<2)|2,{71,47,0}}, +/* 50374 */ {(13<<2)|2,{71,47,0}}, +/* 50375 */ {(13<<2)|2,{71,47,0}}, +/* 50376 */ {(13<<2)|2,{71,51,0}}, +/* 50377 */ {(13<<2)|2,{71,51,0}}, +/* 50378 */ {(13<<2)|2,{71,51,0}}, +/* 50379 */ {(13<<2)|2,{71,51,0}}, +/* 50380 */ {(13<<2)|2,{71,51,0}}, +/* 50381 */ {(13<<2)|2,{71,51,0}}, +/* 50382 */ {(13<<2)|2,{71,51,0}}, +/* 50383 */ {(13<<2)|2,{71,51,0}}, +/* 50384 */ {(13<<2)|2,{71,52,0}}, +/* 50385 */ {(13<<2)|2,{71,52,0}}, +/* 50386 */ {(13<<2)|2,{71,52,0}}, +/* 50387 */ {(13<<2)|2,{71,52,0}}, +/* 50388 */ {(13<<2)|2,{71,52,0}}, +/* 50389 */ {(13<<2)|2,{71,52,0}}, +/* 50390 */ {(13<<2)|2,{71,52,0}}, +/* 50391 */ {(13<<2)|2,{71,52,0}}, +/* 50392 */ {(13<<2)|2,{71,53,0}}, +/* 50393 */ {(13<<2)|2,{71,53,0}}, +/* 50394 */ {(13<<2)|2,{71,53,0}}, +/* 50395 */ {(13<<2)|2,{71,53,0}}, +/* 50396 */ {(13<<2)|2,{71,53,0}}, +/* 50397 */ {(13<<2)|2,{71,53,0}}, +/* 50398 */ {(13<<2)|2,{71,53,0}}, +/* 50399 */ {(13<<2)|2,{71,53,0}}, +/* 50400 */ {(13<<2)|2,{71,54,0}}, +/* 50401 */ {(13<<2)|2,{71,54,0}}, +/* 50402 */ {(13<<2)|2,{71,54,0}}, +/* 50403 */ {(13<<2)|2,{71,54,0}}, +/* 50404 */ {(13<<2)|2,{71,54,0}}, +/* 50405 */ {(13<<2)|2,{71,54,0}}, +/* 50406 */ {(13<<2)|2,{71,54,0}}, +/* 50407 */ {(13<<2)|2,{71,54,0}}, +/* 50408 */ {(13<<2)|2,{71,55,0}}, +/* 50409 */ {(13<<2)|2,{71,55,0}}, +/* 50410 */ {(13<<2)|2,{71,55,0}}, +/* 50411 */ {(13<<2)|2,{71,55,0}}, +/* 50412 */ {(13<<2)|2,{71,55,0}}, +/* 50413 */ {(13<<2)|2,{71,55,0}}, +/* 50414 */ {(13<<2)|2,{71,55,0}}, +/* 50415 */ {(13<<2)|2,{71,55,0}}, +/* 50416 */ {(13<<2)|2,{71,56,0}}, +/* 50417 */ {(13<<2)|2,{71,56,0}}, +/* 50418 */ {(13<<2)|2,{71,56,0}}, +/* 50419 */ {(13<<2)|2,{71,56,0}}, +/* 50420 */ {(13<<2)|2,{71,56,0}}, +/* 50421 */ {(13<<2)|2,{71,56,0}}, +/* 50422 */ {(13<<2)|2,{71,56,0}}, +/* 50423 */ {(13<<2)|2,{71,56,0}}, +/* 50424 */ {(13<<2)|2,{71,57,0}}, +/* 50425 */ {(13<<2)|2,{71,57,0}}, +/* 50426 */ {(13<<2)|2,{71,57,0}}, +/* 50427 */ {(13<<2)|2,{71,57,0}}, +/* 50428 */ {(13<<2)|2,{71,57,0}}, +/* 50429 */ {(13<<2)|2,{71,57,0}}, +/* 50430 */ {(13<<2)|2,{71,57,0}}, +/* 50431 */ {(13<<2)|2,{71,57,0}}, +/* 50432 */ {(13<<2)|2,{71,61,0}}, +/* 50433 */ {(13<<2)|2,{71,61,0}}, +/* 50434 */ {(13<<2)|2,{71,61,0}}, +/* 50435 */ {(13<<2)|2,{71,61,0}}, +/* 50436 */ {(13<<2)|2,{71,61,0}}, +/* 50437 */ {(13<<2)|2,{71,61,0}}, +/* 50438 */ {(13<<2)|2,{71,61,0}}, +/* 50439 */ {(13<<2)|2,{71,61,0}}, +/* 50440 */ {(13<<2)|2,{71,65,0}}, +/* 50441 */ {(13<<2)|2,{71,65,0}}, +/* 50442 */ {(13<<2)|2,{71,65,0}}, +/* 50443 */ {(13<<2)|2,{71,65,0}}, +/* 50444 */ {(13<<2)|2,{71,65,0}}, +/* 50445 */ {(13<<2)|2,{71,65,0}}, +/* 50446 */ {(13<<2)|2,{71,65,0}}, +/* 50447 */ {(13<<2)|2,{71,65,0}}, +/* 50448 */ {(13<<2)|2,{71,95,0}}, +/* 50449 */ {(13<<2)|2,{71,95,0}}, +/* 50450 */ {(13<<2)|2,{71,95,0}}, +/* 50451 */ {(13<<2)|2,{71,95,0}}, +/* 50452 */ {(13<<2)|2,{71,95,0}}, +/* 50453 */ {(13<<2)|2,{71,95,0}}, +/* 50454 */ {(13<<2)|2,{71,95,0}}, +/* 50455 */ {(13<<2)|2,{71,95,0}}, +/* 50456 */ {(13<<2)|2,{71,98,0}}, +/* 50457 */ {(13<<2)|2,{71,98,0}}, +/* 50458 */ {(13<<2)|2,{71,98,0}}, +/* 50459 */ {(13<<2)|2,{71,98,0}}, +/* 50460 */ {(13<<2)|2,{71,98,0}}, +/* 50461 */ {(13<<2)|2,{71,98,0}}, +/* 50462 */ {(13<<2)|2,{71,98,0}}, +/* 50463 */ {(13<<2)|2,{71,98,0}}, +/* 50464 */ {(13<<2)|2,{71,100,0}}, +/* 50465 */ {(13<<2)|2,{71,100,0}}, +/* 50466 */ {(13<<2)|2,{71,100,0}}, +/* 50467 */ {(13<<2)|2,{71,100,0}}, +/* 50468 */ {(13<<2)|2,{71,100,0}}, +/* 50469 */ {(13<<2)|2,{71,100,0}}, +/* 50470 */ {(13<<2)|2,{71,100,0}}, +/* 50471 */ {(13<<2)|2,{71,100,0}}, +/* 50472 */ {(13<<2)|2,{71,102,0}}, +/* 50473 */ {(13<<2)|2,{71,102,0}}, +/* 50474 */ {(13<<2)|2,{71,102,0}}, +/* 50475 */ {(13<<2)|2,{71,102,0}}, +/* 50476 */ {(13<<2)|2,{71,102,0}}, +/* 50477 */ {(13<<2)|2,{71,102,0}}, +/* 50478 */ {(13<<2)|2,{71,102,0}}, +/* 50479 */ {(13<<2)|2,{71,102,0}}, +/* 50480 */ {(13<<2)|2,{71,103,0}}, +/* 50481 */ {(13<<2)|2,{71,103,0}}, +/* 50482 */ {(13<<2)|2,{71,103,0}}, +/* 50483 */ {(13<<2)|2,{71,103,0}}, +/* 50484 */ {(13<<2)|2,{71,103,0}}, +/* 50485 */ {(13<<2)|2,{71,103,0}}, +/* 50486 */ {(13<<2)|2,{71,103,0}}, +/* 50487 */ {(13<<2)|2,{71,103,0}}, +/* 50488 */ {(13<<2)|2,{71,104,0}}, +/* 50489 */ {(13<<2)|2,{71,104,0}}, +/* 50490 */ {(13<<2)|2,{71,104,0}}, +/* 50491 */ {(13<<2)|2,{71,104,0}}, +/* 50492 */ {(13<<2)|2,{71,104,0}}, +/* 50493 */ {(13<<2)|2,{71,104,0}}, +/* 50494 */ {(13<<2)|2,{71,104,0}}, +/* 50495 */ {(13<<2)|2,{71,104,0}}, +/* 50496 */ {(13<<2)|2,{71,108,0}}, +/* 50497 */ {(13<<2)|2,{71,108,0}}, +/* 50498 */ {(13<<2)|2,{71,108,0}}, +/* 50499 */ {(13<<2)|2,{71,108,0}}, +/* 50500 */ {(13<<2)|2,{71,108,0}}, +/* 50501 */ {(13<<2)|2,{71,108,0}}, +/* 50502 */ {(13<<2)|2,{71,108,0}}, +/* 50503 */ {(13<<2)|2,{71,108,0}}, +/* 50504 */ {(13<<2)|2,{71,109,0}}, +/* 50505 */ {(13<<2)|2,{71,109,0}}, +/* 50506 */ {(13<<2)|2,{71,109,0}}, +/* 50507 */ {(13<<2)|2,{71,109,0}}, +/* 50508 */ {(13<<2)|2,{71,109,0}}, +/* 50509 */ {(13<<2)|2,{71,109,0}}, +/* 50510 */ {(13<<2)|2,{71,109,0}}, +/* 50511 */ {(13<<2)|2,{71,109,0}}, +/* 50512 */ {(13<<2)|2,{71,110,0}}, +/* 50513 */ {(13<<2)|2,{71,110,0}}, +/* 50514 */ {(13<<2)|2,{71,110,0}}, +/* 50515 */ {(13<<2)|2,{71,110,0}}, +/* 50516 */ {(13<<2)|2,{71,110,0}}, +/* 50517 */ {(13<<2)|2,{71,110,0}}, +/* 50518 */ {(13<<2)|2,{71,110,0}}, +/* 50519 */ {(13<<2)|2,{71,110,0}}, +/* 50520 */ {(13<<2)|2,{71,112,0}}, +/* 50521 */ {(13<<2)|2,{71,112,0}}, +/* 50522 */ {(13<<2)|2,{71,112,0}}, +/* 50523 */ {(13<<2)|2,{71,112,0}}, +/* 50524 */ {(13<<2)|2,{71,112,0}}, +/* 50525 */ {(13<<2)|2,{71,112,0}}, +/* 50526 */ {(13<<2)|2,{71,112,0}}, +/* 50527 */ {(13<<2)|2,{71,112,0}}, +/* 50528 */ {(13<<2)|2,{71,114,0}}, +/* 50529 */ {(13<<2)|2,{71,114,0}}, +/* 50530 */ {(13<<2)|2,{71,114,0}}, +/* 50531 */ {(13<<2)|2,{71,114,0}}, +/* 50532 */ {(13<<2)|2,{71,114,0}}, +/* 50533 */ {(13<<2)|2,{71,114,0}}, +/* 50534 */ {(13<<2)|2,{71,114,0}}, +/* 50535 */ {(13<<2)|2,{71,114,0}}, +/* 50536 */ {(13<<2)|2,{71,117,0}}, +/* 50537 */ {(13<<2)|2,{71,117,0}}, +/* 50538 */ {(13<<2)|2,{71,117,0}}, +/* 50539 */ {(13<<2)|2,{71,117,0}}, +/* 50540 */ {(13<<2)|2,{71,117,0}}, +/* 50541 */ {(13<<2)|2,{71,117,0}}, +/* 50542 */ {(13<<2)|2,{71,117,0}}, +/* 50543 */ {(13<<2)|2,{71,117,0}}, +/* 50544 */ {(14<<2)|2,{71,58,0}}, +/* 50545 */ {(14<<2)|2,{71,58,0}}, +/* 50546 */ {(14<<2)|2,{71,58,0}}, +/* 50547 */ {(14<<2)|2,{71,58,0}}, +/* 50548 */ {(14<<2)|2,{71,66,0}}, +/* 50549 */ {(14<<2)|2,{71,66,0}}, +/* 50550 */ {(14<<2)|2,{71,66,0}}, +/* 50551 */ {(14<<2)|2,{71,66,0}}, +/* 50552 */ {(14<<2)|2,{71,67,0}}, +/* 50553 */ {(14<<2)|2,{71,67,0}}, +/* 50554 */ {(14<<2)|2,{71,67,0}}, +/* 50555 */ {(14<<2)|2,{71,67,0}}, +/* 50556 */ {(14<<2)|2,{71,68,0}}, +/* 50557 */ {(14<<2)|2,{71,68,0}}, +/* 50558 */ {(14<<2)|2,{71,68,0}}, +/* 50559 */ {(14<<2)|2,{71,68,0}}, +/* 50560 */ {(14<<2)|2,{71,69,0}}, +/* 50561 */ {(14<<2)|2,{71,69,0}}, +/* 50562 */ {(14<<2)|2,{71,69,0}}, +/* 50563 */ {(14<<2)|2,{71,69,0}}, +/* 50564 */ {(14<<2)|2,{71,70,0}}, +/* 50565 */ {(14<<2)|2,{71,70,0}}, +/* 50566 */ {(14<<2)|2,{71,70,0}}, +/* 50567 */ {(14<<2)|2,{71,70,0}}, +/* 50568 */ {(14<<2)|2,{71,71,0}}, +/* 50569 */ {(14<<2)|2,{71,71,0}}, +/* 50570 */ {(14<<2)|2,{71,71,0}}, +/* 50571 */ {(14<<2)|2,{71,71,0}}, +/* 50572 */ {(14<<2)|2,{71,72,0}}, +/* 50573 */ {(14<<2)|2,{71,72,0}}, +/* 50574 */ {(14<<2)|2,{71,72,0}}, +/* 50575 */ {(14<<2)|2,{71,72,0}}, +/* 50576 */ {(14<<2)|2,{71,73,0}}, +/* 50577 */ {(14<<2)|2,{71,73,0}}, +/* 50578 */ {(14<<2)|2,{71,73,0}}, +/* 50579 */ {(14<<2)|2,{71,73,0}}, +/* 50580 */ {(14<<2)|2,{71,74,0}}, +/* 50581 */ {(14<<2)|2,{71,74,0}}, +/* 50582 */ {(14<<2)|2,{71,74,0}}, +/* 50583 */ {(14<<2)|2,{71,74,0}}, +/* 50584 */ {(14<<2)|2,{71,75,0}}, +/* 50585 */ {(14<<2)|2,{71,75,0}}, +/* 50586 */ {(14<<2)|2,{71,75,0}}, +/* 50587 */ {(14<<2)|2,{71,75,0}}, +/* 50588 */ {(14<<2)|2,{71,76,0}}, +/* 50589 */ {(14<<2)|2,{71,76,0}}, +/* 50590 */ {(14<<2)|2,{71,76,0}}, +/* 50591 */ {(14<<2)|2,{71,76,0}}, +/* 50592 */ {(14<<2)|2,{71,77,0}}, +/* 50593 */ {(14<<2)|2,{71,77,0}}, +/* 50594 */ {(14<<2)|2,{71,77,0}}, +/* 50595 */ {(14<<2)|2,{71,77,0}}, +/* 50596 */ {(14<<2)|2,{71,78,0}}, +/* 50597 */ {(14<<2)|2,{71,78,0}}, +/* 50598 */ {(14<<2)|2,{71,78,0}}, +/* 50599 */ {(14<<2)|2,{71,78,0}}, +/* 50600 */ {(14<<2)|2,{71,79,0}}, +/* 50601 */ {(14<<2)|2,{71,79,0}}, +/* 50602 */ {(14<<2)|2,{71,79,0}}, +/* 50603 */ {(14<<2)|2,{71,79,0}}, +/* 50604 */ {(14<<2)|2,{71,80,0}}, +/* 50605 */ {(14<<2)|2,{71,80,0}}, +/* 50606 */ {(14<<2)|2,{71,80,0}}, +/* 50607 */ {(14<<2)|2,{71,80,0}}, +/* 50608 */ {(14<<2)|2,{71,81,0}}, +/* 50609 */ {(14<<2)|2,{71,81,0}}, +/* 50610 */ {(14<<2)|2,{71,81,0}}, +/* 50611 */ {(14<<2)|2,{71,81,0}}, +/* 50612 */ {(14<<2)|2,{71,82,0}}, +/* 50613 */ {(14<<2)|2,{71,82,0}}, +/* 50614 */ {(14<<2)|2,{71,82,0}}, +/* 50615 */ {(14<<2)|2,{71,82,0}}, +/* 50616 */ {(14<<2)|2,{71,83,0}}, +/* 50617 */ {(14<<2)|2,{71,83,0}}, +/* 50618 */ {(14<<2)|2,{71,83,0}}, +/* 50619 */ {(14<<2)|2,{71,83,0}}, +/* 50620 */ {(14<<2)|2,{71,84,0}}, +/* 50621 */ {(14<<2)|2,{71,84,0}}, +/* 50622 */ {(14<<2)|2,{71,84,0}}, +/* 50623 */ {(14<<2)|2,{71,84,0}}, +/* 50624 */ {(14<<2)|2,{71,85,0}}, +/* 50625 */ {(14<<2)|2,{71,85,0}}, +/* 50626 */ {(14<<2)|2,{71,85,0}}, +/* 50627 */ {(14<<2)|2,{71,85,0}}, +/* 50628 */ {(14<<2)|2,{71,86,0}}, +/* 50629 */ {(14<<2)|2,{71,86,0}}, +/* 50630 */ {(14<<2)|2,{71,86,0}}, +/* 50631 */ {(14<<2)|2,{71,86,0}}, +/* 50632 */ {(14<<2)|2,{71,87,0}}, +/* 50633 */ {(14<<2)|2,{71,87,0}}, +/* 50634 */ {(14<<2)|2,{71,87,0}}, +/* 50635 */ {(14<<2)|2,{71,87,0}}, +/* 50636 */ {(14<<2)|2,{71,89,0}}, +/* 50637 */ {(14<<2)|2,{71,89,0}}, +/* 50638 */ {(14<<2)|2,{71,89,0}}, +/* 50639 */ {(14<<2)|2,{71,89,0}}, +/* 50640 */ {(14<<2)|2,{71,106,0}}, +/* 50641 */ {(14<<2)|2,{71,106,0}}, +/* 50642 */ {(14<<2)|2,{71,106,0}}, +/* 50643 */ {(14<<2)|2,{71,106,0}}, +/* 50644 */ {(14<<2)|2,{71,107,0}}, +/* 50645 */ {(14<<2)|2,{71,107,0}}, +/* 50646 */ {(14<<2)|2,{71,107,0}}, +/* 50647 */ {(14<<2)|2,{71,107,0}}, +/* 50648 */ {(14<<2)|2,{71,113,0}}, +/* 50649 */ {(14<<2)|2,{71,113,0}}, +/* 50650 */ {(14<<2)|2,{71,113,0}}, +/* 50651 */ {(14<<2)|2,{71,113,0}}, +/* 50652 */ {(14<<2)|2,{71,118,0}}, +/* 50653 */ {(14<<2)|2,{71,118,0}}, +/* 50654 */ {(14<<2)|2,{71,118,0}}, +/* 50655 */ {(14<<2)|2,{71,118,0}}, +/* 50656 */ {(14<<2)|2,{71,119,0}}, +/* 50657 */ {(14<<2)|2,{71,119,0}}, +/* 50658 */ {(14<<2)|2,{71,119,0}}, +/* 50659 */ {(14<<2)|2,{71,119,0}}, +/* 50660 */ {(14<<2)|2,{71,120,0}}, +/* 50661 */ {(14<<2)|2,{71,120,0}}, +/* 50662 */ {(14<<2)|2,{71,120,0}}, +/* 50663 */ {(14<<2)|2,{71,120,0}}, +/* 50664 */ {(14<<2)|2,{71,121,0}}, +/* 50665 */ {(14<<2)|2,{71,121,0}}, +/* 50666 */ {(14<<2)|2,{71,121,0}}, +/* 50667 */ {(14<<2)|2,{71,121,0}}, +/* 50668 */ {(14<<2)|2,{71,122,0}}, +/* 50669 */ {(14<<2)|2,{71,122,0}}, +/* 50670 */ {(14<<2)|2,{71,122,0}}, +/* 50671 */ {(14<<2)|2,{71,122,0}}, +/* 50672 */ {(15<<2)|2,{71,38,0}}, +/* 50673 */ {(15<<2)|2,{71,38,0}}, +/* 50674 */ {(15<<2)|2,{71,42,0}}, +/* 50675 */ {(15<<2)|2,{71,42,0}}, +/* 50676 */ {(15<<2)|2,{71,44,0}}, +/* 50677 */ {(15<<2)|2,{71,44,0}}, +/* 50678 */ {(15<<2)|2,{71,59,0}}, +/* 50679 */ {(15<<2)|2,{71,59,0}}, +/* 50680 */ {(15<<2)|2,{71,88,0}}, +/* 50681 */ {(15<<2)|2,{71,88,0}}, +/* 50682 */ {(15<<2)|2,{71,90,0}}, +/* 50683 */ {(15<<2)|2,{71,90,0}}, +/* 50684 */ {(7<<2)|1,{71,0,0}}, +/* 50685 */ {(7<<2)|1,{71,0,0}}, +/* 50686 */ {(7<<2)|1,{71,0,0}}, +/* 50687 */ {(7<<2)|1,{71,0,0}}, +/* 50688 */ {(12<<2)|2,{72,48,0}}, +/* 50689 */ {(12<<2)|2,{72,48,0}}, +/* 50690 */ {(12<<2)|2,{72,48,0}}, +/* 50691 */ {(12<<2)|2,{72,48,0}}, +/* 50692 */ {(12<<2)|2,{72,48,0}}, +/* 50693 */ {(12<<2)|2,{72,48,0}}, +/* 50694 */ {(12<<2)|2,{72,48,0}}, +/* 50695 */ {(12<<2)|2,{72,48,0}}, +/* 50696 */ {(12<<2)|2,{72,48,0}}, +/* 50697 */ {(12<<2)|2,{72,48,0}}, +/* 50698 */ {(12<<2)|2,{72,48,0}}, +/* 50699 */ {(12<<2)|2,{72,48,0}}, +/* 50700 */ {(12<<2)|2,{72,48,0}}, +/* 50701 */ {(12<<2)|2,{72,48,0}}, +/* 50702 */ {(12<<2)|2,{72,48,0}}, +/* 50703 */ {(12<<2)|2,{72,48,0}}, +/* 50704 */ {(12<<2)|2,{72,49,0}}, +/* 50705 */ {(12<<2)|2,{72,49,0}}, +/* 50706 */ {(12<<2)|2,{72,49,0}}, +/* 50707 */ {(12<<2)|2,{72,49,0}}, +/* 50708 */ {(12<<2)|2,{72,49,0}}, +/* 50709 */ {(12<<2)|2,{72,49,0}}, +/* 50710 */ {(12<<2)|2,{72,49,0}}, +/* 50711 */ {(12<<2)|2,{72,49,0}}, +/* 50712 */ {(12<<2)|2,{72,49,0}}, +/* 50713 */ {(12<<2)|2,{72,49,0}}, +/* 50714 */ {(12<<2)|2,{72,49,0}}, +/* 50715 */ {(12<<2)|2,{72,49,0}}, +/* 50716 */ {(12<<2)|2,{72,49,0}}, +/* 50717 */ {(12<<2)|2,{72,49,0}}, +/* 50718 */ {(12<<2)|2,{72,49,0}}, +/* 50719 */ {(12<<2)|2,{72,49,0}}, +/* 50720 */ {(12<<2)|2,{72,50,0}}, +/* 50721 */ {(12<<2)|2,{72,50,0}}, +/* 50722 */ {(12<<2)|2,{72,50,0}}, +/* 50723 */ {(12<<2)|2,{72,50,0}}, +/* 50724 */ {(12<<2)|2,{72,50,0}}, +/* 50725 */ {(12<<2)|2,{72,50,0}}, +/* 50726 */ {(12<<2)|2,{72,50,0}}, +/* 50727 */ {(12<<2)|2,{72,50,0}}, +/* 50728 */ {(12<<2)|2,{72,50,0}}, +/* 50729 */ {(12<<2)|2,{72,50,0}}, +/* 50730 */ {(12<<2)|2,{72,50,0}}, +/* 50731 */ {(12<<2)|2,{72,50,0}}, +/* 50732 */ {(12<<2)|2,{72,50,0}}, +/* 50733 */ {(12<<2)|2,{72,50,0}}, +/* 50734 */ {(12<<2)|2,{72,50,0}}, +/* 50735 */ {(12<<2)|2,{72,50,0}}, +/* 50736 */ {(12<<2)|2,{72,97,0}}, +/* 50737 */ {(12<<2)|2,{72,97,0}}, +/* 50738 */ {(12<<2)|2,{72,97,0}}, +/* 50739 */ {(12<<2)|2,{72,97,0}}, +/* 50740 */ {(12<<2)|2,{72,97,0}}, +/* 50741 */ {(12<<2)|2,{72,97,0}}, +/* 50742 */ {(12<<2)|2,{72,97,0}}, +/* 50743 */ {(12<<2)|2,{72,97,0}}, +/* 50744 */ {(12<<2)|2,{72,97,0}}, +/* 50745 */ {(12<<2)|2,{72,97,0}}, +/* 50746 */ {(12<<2)|2,{72,97,0}}, +/* 50747 */ {(12<<2)|2,{72,97,0}}, +/* 50748 */ {(12<<2)|2,{72,97,0}}, +/* 50749 */ {(12<<2)|2,{72,97,0}}, +/* 50750 */ {(12<<2)|2,{72,97,0}}, +/* 50751 */ {(12<<2)|2,{72,97,0}}, +/* 50752 */ {(12<<2)|2,{72,99,0}}, +/* 50753 */ {(12<<2)|2,{72,99,0}}, +/* 50754 */ {(12<<2)|2,{72,99,0}}, +/* 50755 */ {(12<<2)|2,{72,99,0}}, +/* 50756 */ {(12<<2)|2,{72,99,0}}, +/* 50757 */ {(12<<2)|2,{72,99,0}}, +/* 50758 */ {(12<<2)|2,{72,99,0}}, +/* 50759 */ {(12<<2)|2,{72,99,0}}, +/* 50760 */ {(12<<2)|2,{72,99,0}}, +/* 50761 */ {(12<<2)|2,{72,99,0}}, +/* 50762 */ {(12<<2)|2,{72,99,0}}, +/* 50763 */ {(12<<2)|2,{72,99,0}}, +/* 50764 */ {(12<<2)|2,{72,99,0}}, +/* 50765 */ {(12<<2)|2,{72,99,0}}, +/* 50766 */ {(12<<2)|2,{72,99,0}}, +/* 50767 */ {(12<<2)|2,{72,99,0}}, +/* 50768 */ {(12<<2)|2,{72,101,0}}, +/* 50769 */ {(12<<2)|2,{72,101,0}}, +/* 50770 */ {(12<<2)|2,{72,101,0}}, +/* 50771 */ {(12<<2)|2,{72,101,0}}, +/* 50772 */ {(12<<2)|2,{72,101,0}}, +/* 50773 */ {(12<<2)|2,{72,101,0}}, +/* 50774 */ {(12<<2)|2,{72,101,0}}, +/* 50775 */ {(12<<2)|2,{72,101,0}}, +/* 50776 */ {(12<<2)|2,{72,101,0}}, +/* 50777 */ {(12<<2)|2,{72,101,0}}, +/* 50778 */ {(12<<2)|2,{72,101,0}}, +/* 50779 */ {(12<<2)|2,{72,101,0}}, +/* 50780 */ {(12<<2)|2,{72,101,0}}, +/* 50781 */ {(12<<2)|2,{72,101,0}}, +/* 50782 */ {(12<<2)|2,{72,101,0}}, +/* 50783 */ {(12<<2)|2,{72,101,0}}, +/* 50784 */ {(12<<2)|2,{72,105,0}}, +/* 50785 */ {(12<<2)|2,{72,105,0}}, +/* 50786 */ {(12<<2)|2,{72,105,0}}, +/* 50787 */ {(12<<2)|2,{72,105,0}}, +/* 50788 */ {(12<<2)|2,{72,105,0}}, +/* 50789 */ {(12<<2)|2,{72,105,0}}, +/* 50790 */ {(12<<2)|2,{72,105,0}}, +/* 50791 */ {(12<<2)|2,{72,105,0}}, +/* 50792 */ {(12<<2)|2,{72,105,0}}, +/* 50793 */ {(12<<2)|2,{72,105,0}}, +/* 50794 */ {(12<<2)|2,{72,105,0}}, +/* 50795 */ {(12<<2)|2,{72,105,0}}, +/* 50796 */ {(12<<2)|2,{72,105,0}}, +/* 50797 */ {(12<<2)|2,{72,105,0}}, +/* 50798 */ {(12<<2)|2,{72,105,0}}, +/* 50799 */ {(12<<2)|2,{72,105,0}}, +/* 50800 */ {(12<<2)|2,{72,111,0}}, +/* 50801 */ {(12<<2)|2,{72,111,0}}, +/* 50802 */ {(12<<2)|2,{72,111,0}}, +/* 50803 */ {(12<<2)|2,{72,111,0}}, +/* 50804 */ {(12<<2)|2,{72,111,0}}, +/* 50805 */ {(12<<2)|2,{72,111,0}}, +/* 50806 */ {(12<<2)|2,{72,111,0}}, +/* 50807 */ {(12<<2)|2,{72,111,0}}, +/* 50808 */ {(12<<2)|2,{72,111,0}}, +/* 50809 */ {(12<<2)|2,{72,111,0}}, +/* 50810 */ {(12<<2)|2,{72,111,0}}, +/* 50811 */ {(12<<2)|2,{72,111,0}}, +/* 50812 */ {(12<<2)|2,{72,111,0}}, +/* 50813 */ {(12<<2)|2,{72,111,0}}, +/* 50814 */ {(12<<2)|2,{72,111,0}}, +/* 50815 */ {(12<<2)|2,{72,111,0}}, +/* 50816 */ {(12<<2)|2,{72,115,0}}, +/* 50817 */ {(12<<2)|2,{72,115,0}}, +/* 50818 */ {(12<<2)|2,{72,115,0}}, +/* 50819 */ {(12<<2)|2,{72,115,0}}, +/* 50820 */ {(12<<2)|2,{72,115,0}}, +/* 50821 */ {(12<<2)|2,{72,115,0}}, +/* 50822 */ {(12<<2)|2,{72,115,0}}, +/* 50823 */ {(12<<2)|2,{72,115,0}}, +/* 50824 */ {(12<<2)|2,{72,115,0}}, +/* 50825 */ {(12<<2)|2,{72,115,0}}, +/* 50826 */ {(12<<2)|2,{72,115,0}}, +/* 50827 */ {(12<<2)|2,{72,115,0}}, +/* 50828 */ {(12<<2)|2,{72,115,0}}, +/* 50829 */ {(12<<2)|2,{72,115,0}}, +/* 50830 */ {(12<<2)|2,{72,115,0}}, +/* 50831 */ {(12<<2)|2,{72,115,0}}, +/* 50832 */ {(12<<2)|2,{72,116,0}}, +/* 50833 */ {(12<<2)|2,{72,116,0}}, +/* 50834 */ {(12<<2)|2,{72,116,0}}, +/* 50835 */ {(12<<2)|2,{72,116,0}}, +/* 50836 */ {(12<<2)|2,{72,116,0}}, +/* 50837 */ {(12<<2)|2,{72,116,0}}, +/* 50838 */ {(12<<2)|2,{72,116,0}}, +/* 50839 */ {(12<<2)|2,{72,116,0}}, +/* 50840 */ {(12<<2)|2,{72,116,0}}, +/* 50841 */ {(12<<2)|2,{72,116,0}}, +/* 50842 */ {(12<<2)|2,{72,116,0}}, +/* 50843 */ {(12<<2)|2,{72,116,0}}, +/* 50844 */ {(12<<2)|2,{72,116,0}}, +/* 50845 */ {(12<<2)|2,{72,116,0}}, +/* 50846 */ {(12<<2)|2,{72,116,0}}, +/* 50847 */ {(12<<2)|2,{72,116,0}}, +/* 50848 */ {(13<<2)|2,{72,32,0}}, +/* 50849 */ {(13<<2)|2,{72,32,0}}, +/* 50850 */ {(13<<2)|2,{72,32,0}}, +/* 50851 */ {(13<<2)|2,{72,32,0}}, +/* 50852 */ {(13<<2)|2,{72,32,0}}, +/* 50853 */ {(13<<2)|2,{72,32,0}}, +/* 50854 */ {(13<<2)|2,{72,32,0}}, +/* 50855 */ {(13<<2)|2,{72,32,0}}, +/* 50856 */ {(13<<2)|2,{72,37,0}}, +/* 50857 */ {(13<<2)|2,{72,37,0}}, +/* 50858 */ {(13<<2)|2,{72,37,0}}, +/* 50859 */ {(13<<2)|2,{72,37,0}}, +/* 50860 */ {(13<<2)|2,{72,37,0}}, +/* 50861 */ {(13<<2)|2,{72,37,0}}, +/* 50862 */ {(13<<2)|2,{72,37,0}}, +/* 50863 */ {(13<<2)|2,{72,37,0}}, +/* 50864 */ {(13<<2)|2,{72,45,0}}, +/* 50865 */ {(13<<2)|2,{72,45,0}}, +/* 50866 */ {(13<<2)|2,{72,45,0}}, +/* 50867 */ {(13<<2)|2,{72,45,0}}, +/* 50868 */ {(13<<2)|2,{72,45,0}}, +/* 50869 */ {(13<<2)|2,{72,45,0}}, +/* 50870 */ {(13<<2)|2,{72,45,0}}, +/* 50871 */ {(13<<2)|2,{72,45,0}}, +/* 50872 */ {(13<<2)|2,{72,46,0}}, +/* 50873 */ {(13<<2)|2,{72,46,0}}, +/* 50874 */ {(13<<2)|2,{72,46,0}}, +/* 50875 */ {(13<<2)|2,{72,46,0}}, +/* 50876 */ {(13<<2)|2,{72,46,0}}, +/* 50877 */ {(13<<2)|2,{72,46,0}}, +/* 50878 */ {(13<<2)|2,{72,46,0}}, +/* 50879 */ {(13<<2)|2,{72,46,0}}, +/* 50880 */ {(13<<2)|2,{72,47,0}}, +/* 50881 */ {(13<<2)|2,{72,47,0}}, +/* 50882 */ {(13<<2)|2,{72,47,0}}, +/* 50883 */ {(13<<2)|2,{72,47,0}}, +/* 50884 */ {(13<<2)|2,{72,47,0}}, +/* 50885 */ {(13<<2)|2,{72,47,0}}, +/* 50886 */ {(13<<2)|2,{72,47,0}}, +/* 50887 */ {(13<<2)|2,{72,47,0}}, +/* 50888 */ {(13<<2)|2,{72,51,0}}, +/* 50889 */ {(13<<2)|2,{72,51,0}}, +/* 50890 */ {(13<<2)|2,{72,51,0}}, +/* 50891 */ {(13<<2)|2,{72,51,0}}, +/* 50892 */ {(13<<2)|2,{72,51,0}}, +/* 50893 */ {(13<<2)|2,{72,51,0}}, +/* 50894 */ {(13<<2)|2,{72,51,0}}, +/* 50895 */ {(13<<2)|2,{72,51,0}}, +/* 50896 */ {(13<<2)|2,{72,52,0}}, +/* 50897 */ {(13<<2)|2,{72,52,0}}, +/* 50898 */ {(13<<2)|2,{72,52,0}}, +/* 50899 */ {(13<<2)|2,{72,52,0}}, +/* 50900 */ {(13<<2)|2,{72,52,0}}, +/* 50901 */ {(13<<2)|2,{72,52,0}}, +/* 50902 */ {(13<<2)|2,{72,52,0}}, +/* 50903 */ {(13<<2)|2,{72,52,0}}, +/* 50904 */ {(13<<2)|2,{72,53,0}}, +/* 50905 */ {(13<<2)|2,{72,53,0}}, +/* 50906 */ {(13<<2)|2,{72,53,0}}, +/* 50907 */ {(13<<2)|2,{72,53,0}}, +/* 50908 */ {(13<<2)|2,{72,53,0}}, +/* 50909 */ {(13<<2)|2,{72,53,0}}, +/* 50910 */ {(13<<2)|2,{72,53,0}}, +/* 50911 */ {(13<<2)|2,{72,53,0}}, +/* 50912 */ {(13<<2)|2,{72,54,0}}, +/* 50913 */ {(13<<2)|2,{72,54,0}}, +/* 50914 */ {(13<<2)|2,{72,54,0}}, +/* 50915 */ {(13<<2)|2,{72,54,0}}, +/* 50916 */ {(13<<2)|2,{72,54,0}}, +/* 50917 */ {(13<<2)|2,{72,54,0}}, +/* 50918 */ {(13<<2)|2,{72,54,0}}, +/* 50919 */ {(13<<2)|2,{72,54,0}}, +/* 50920 */ {(13<<2)|2,{72,55,0}}, +/* 50921 */ {(13<<2)|2,{72,55,0}}, +/* 50922 */ {(13<<2)|2,{72,55,0}}, +/* 50923 */ {(13<<2)|2,{72,55,0}}, +/* 50924 */ {(13<<2)|2,{72,55,0}}, +/* 50925 */ {(13<<2)|2,{72,55,0}}, +/* 50926 */ {(13<<2)|2,{72,55,0}}, +/* 50927 */ {(13<<2)|2,{72,55,0}}, +/* 50928 */ {(13<<2)|2,{72,56,0}}, +/* 50929 */ {(13<<2)|2,{72,56,0}}, +/* 50930 */ {(13<<2)|2,{72,56,0}}, +/* 50931 */ {(13<<2)|2,{72,56,0}}, +/* 50932 */ {(13<<2)|2,{72,56,0}}, +/* 50933 */ {(13<<2)|2,{72,56,0}}, +/* 50934 */ {(13<<2)|2,{72,56,0}}, +/* 50935 */ {(13<<2)|2,{72,56,0}}, +/* 50936 */ {(13<<2)|2,{72,57,0}}, +/* 50937 */ {(13<<2)|2,{72,57,0}}, +/* 50938 */ {(13<<2)|2,{72,57,0}}, +/* 50939 */ {(13<<2)|2,{72,57,0}}, +/* 50940 */ {(13<<2)|2,{72,57,0}}, +/* 50941 */ {(13<<2)|2,{72,57,0}}, +/* 50942 */ {(13<<2)|2,{72,57,0}}, +/* 50943 */ {(13<<2)|2,{72,57,0}}, +/* 50944 */ {(13<<2)|2,{72,61,0}}, +/* 50945 */ {(13<<2)|2,{72,61,0}}, +/* 50946 */ {(13<<2)|2,{72,61,0}}, +/* 50947 */ {(13<<2)|2,{72,61,0}}, +/* 50948 */ {(13<<2)|2,{72,61,0}}, +/* 50949 */ {(13<<2)|2,{72,61,0}}, +/* 50950 */ {(13<<2)|2,{72,61,0}}, +/* 50951 */ {(13<<2)|2,{72,61,0}}, +/* 50952 */ {(13<<2)|2,{72,65,0}}, +/* 50953 */ {(13<<2)|2,{72,65,0}}, +/* 50954 */ {(13<<2)|2,{72,65,0}}, +/* 50955 */ {(13<<2)|2,{72,65,0}}, +/* 50956 */ {(13<<2)|2,{72,65,0}}, +/* 50957 */ {(13<<2)|2,{72,65,0}}, +/* 50958 */ {(13<<2)|2,{72,65,0}}, +/* 50959 */ {(13<<2)|2,{72,65,0}}, +/* 50960 */ {(13<<2)|2,{72,95,0}}, +/* 50961 */ {(13<<2)|2,{72,95,0}}, +/* 50962 */ {(13<<2)|2,{72,95,0}}, +/* 50963 */ {(13<<2)|2,{72,95,0}}, +/* 50964 */ {(13<<2)|2,{72,95,0}}, +/* 50965 */ {(13<<2)|2,{72,95,0}}, +/* 50966 */ {(13<<2)|2,{72,95,0}}, +/* 50967 */ {(13<<2)|2,{72,95,0}}, +/* 50968 */ {(13<<2)|2,{72,98,0}}, +/* 50969 */ {(13<<2)|2,{72,98,0}}, +/* 50970 */ {(13<<2)|2,{72,98,0}}, +/* 50971 */ {(13<<2)|2,{72,98,0}}, +/* 50972 */ {(13<<2)|2,{72,98,0}}, +/* 50973 */ {(13<<2)|2,{72,98,0}}, +/* 50974 */ {(13<<2)|2,{72,98,0}}, +/* 50975 */ {(13<<2)|2,{72,98,0}}, +/* 50976 */ {(13<<2)|2,{72,100,0}}, +/* 50977 */ {(13<<2)|2,{72,100,0}}, +/* 50978 */ {(13<<2)|2,{72,100,0}}, +/* 50979 */ {(13<<2)|2,{72,100,0}}, +/* 50980 */ {(13<<2)|2,{72,100,0}}, +/* 50981 */ {(13<<2)|2,{72,100,0}}, +/* 50982 */ {(13<<2)|2,{72,100,0}}, +/* 50983 */ {(13<<2)|2,{72,100,0}}, +/* 50984 */ {(13<<2)|2,{72,102,0}}, +/* 50985 */ {(13<<2)|2,{72,102,0}}, +/* 50986 */ {(13<<2)|2,{72,102,0}}, +/* 50987 */ {(13<<2)|2,{72,102,0}}, +/* 50988 */ {(13<<2)|2,{72,102,0}}, +/* 50989 */ {(13<<2)|2,{72,102,0}}, +/* 50990 */ {(13<<2)|2,{72,102,0}}, +/* 50991 */ {(13<<2)|2,{72,102,0}}, +/* 50992 */ {(13<<2)|2,{72,103,0}}, +/* 50993 */ {(13<<2)|2,{72,103,0}}, +/* 50994 */ {(13<<2)|2,{72,103,0}}, +/* 50995 */ {(13<<2)|2,{72,103,0}}, +/* 50996 */ {(13<<2)|2,{72,103,0}}, +/* 50997 */ {(13<<2)|2,{72,103,0}}, +/* 50998 */ {(13<<2)|2,{72,103,0}}, +/* 50999 */ {(13<<2)|2,{72,103,0}}, +/* 51000 */ {(13<<2)|2,{72,104,0}}, +/* 51001 */ {(13<<2)|2,{72,104,0}}, +/* 51002 */ {(13<<2)|2,{72,104,0}}, +/* 51003 */ {(13<<2)|2,{72,104,0}}, +/* 51004 */ {(13<<2)|2,{72,104,0}}, +/* 51005 */ {(13<<2)|2,{72,104,0}}, +/* 51006 */ {(13<<2)|2,{72,104,0}}, +/* 51007 */ {(13<<2)|2,{72,104,0}}, +/* 51008 */ {(13<<2)|2,{72,108,0}}, +/* 51009 */ {(13<<2)|2,{72,108,0}}, +/* 51010 */ {(13<<2)|2,{72,108,0}}, +/* 51011 */ {(13<<2)|2,{72,108,0}}, +/* 51012 */ {(13<<2)|2,{72,108,0}}, +/* 51013 */ {(13<<2)|2,{72,108,0}}, +/* 51014 */ {(13<<2)|2,{72,108,0}}, +/* 51015 */ {(13<<2)|2,{72,108,0}}, +/* 51016 */ {(13<<2)|2,{72,109,0}}, +/* 51017 */ {(13<<2)|2,{72,109,0}}, +/* 51018 */ {(13<<2)|2,{72,109,0}}, +/* 51019 */ {(13<<2)|2,{72,109,0}}, +/* 51020 */ {(13<<2)|2,{72,109,0}}, +/* 51021 */ {(13<<2)|2,{72,109,0}}, +/* 51022 */ {(13<<2)|2,{72,109,0}}, +/* 51023 */ {(13<<2)|2,{72,109,0}}, +/* 51024 */ {(13<<2)|2,{72,110,0}}, +/* 51025 */ {(13<<2)|2,{72,110,0}}, +/* 51026 */ {(13<<2)|2,{72,110,0}}, +/* 51027 */ {(13<<2)|2,{72,110,0}}, +/* 51028 */ {(13<<2)|2,{72,110,0}}, +/* 51029 */ {(13<<2)|2,{72,110,0}}, +/* 51030 */ {(13<<2)|2,{72,110,0}}, +/* 51031 */ {(13<<2)|2,{72,110,0}}, +/* 51032 */ {(13<<2)|2,{72,112,0}}, +/* 51033 */ {(13<<2)|2,{72,112,0}}, +/* 51034 */ {(13<<2)|2,{72,112,0}}, +/* 51035 */ {(13<<2)|2,{72,112,0}}, +/* 51036 */ {(13<<2)|2,{72,112,0}}, +/* 51037 */ {(13<<2)|2,{72,112,0}}, +/* 51038 */ {(13<<2)|2,{72,112,0}}, +/* 51039 */ {(13<<2)|2,{72,112,0}}, +/* 51040 */ {(13<<2)|2,{72,114,0}}, +/* 51041 */ {(13<<2)|2,{72,114,0}}, +/* 51042 */ {(13<<2)|2,{72,114,0}}, +/* 51043 */ {(13<<2)|2,{72,114,0}}, +/* 51044 */ {(13<<2)|2,{72,114,0}}, +/* 51045 */ {(13<<2)|2,{72,114,0}}, +/* 51046 */ {(13<<2)|2,{72,114,0}}, +/* 51047 */ {(13<<2)|2,{72,114,0}}, +/* 51048 */ {(13<<2)|2,{72,117,0}}, +/* 51049 */ {(13<<2)|2,{72,117,0}}, +/* 51050 */ {(13<<2)|2,{72,117,0}}, +/* 51051 */ {(13<<2)|2,{72,117,0}}, +/* 51052 */ {(13<<2)|2,{72,117,0}}, +/* 51053 */ {(13<<2)|2,{72,117,0}}, +/* 51054 */ {(13<<2)|2,{72,117,0}}, +/* 51055 */ {(13<<2)|2,{72,117,0}}, +/* 51056 */ {(14<<2)|2,{72,58,0}}, +/* 51057 */ {(14<<2)|2,{72,58,0}}, +/* 51058 */ {(14<<2)|2,{72,58,0}}, +/* 51059 */ {(14<<2)|2,{72,58,0}}, +/* 51060 */ {(14<<2)|2,{72,66,0}}, +/* 51061 */ {(14<<2)|2,{72,66,0}}, +/* 51062 */ {(14<<2)|2,{72,66,0}}, +/* 51063 */ {(14<<2)|2,{72,66,0}}, +/* 51064 */ {(14<<2)|2,{72,67,0}}, +/* 51065 */ {(14<<2)|2,{72,67,0}}, +/* 51066 */ {(14<<2)|2,{72,67,0}}, +/* 51067 */ {(14<<2)|2,{72,67,0}}, +/* 51068 */ {(14<<2)|2,{72,68,0}}, +/* 51069 */ {(14<<2)|2,{72,68,0}}, +/* 51070 */ {(14<<2)|2,{72,68,0}}, +/* 51071 */ {(14<<2)|2,{72,68,0}}, +/* 51072 */ {(14<<2)|2,{72,69,0}}, +/* 51073 */ {(14<<2)|2,{72,69,0}}, +/* 51074 */ {(14<<2)|2,{72,69,0}}, +/* 51075 */ {(14<<2)|2,{72,69,0}}, +/* 51076 */ {(14<<2)|2,{72,70,0}}, +/* 51077 */ {(14<<2)|2,{72,70,0}}, +/* 51078 */ {(14<<2)|2,{72,70,0}}, +/* 51079 */ {(14<<2)|2,{72,70,0}}, +/* 51080 */ {(14<<2)|2,{72,71,0}}, +/* 51081 */ {(14<<2)|2,{72,71,0}}, +/* 51082 */ {(14<<2)|2,{72,71,0}}, +/* 51083 */ {(14<<2)|2,{72,71,0}}, +/* 51084 */ {(14<<2)|2,{72,72,0}}, +/* 51085 */ {(14<<2)|2,{72,72,0}}, +/* 51086 */ {(14<<2)|2,{72,72,0}}, +/* 51087 */ {(14<<2)|2,{72,72,0}}, +/* 51088 */ {(14<<2)|2,{72,73,0}}, +/* 51089 */ {(14<<2)|2,{72,73,0}}, +/* 51090 */ {(14<<2)|2,{72,73,0}}, +/* 51091 */ {(14<<2)|2,{72,73,0}}, +/* 51092 */ {(14<<2)|2,{72,74,0}}, +/* 51093 */ {(14<<2)|2,{72,74,0}}, +/* 51094 */ {(14<<2)|2,{72,74,0}}, +/* 51095 */ {(14<<2)|2,{72,74,0}}, +/* 51096 */ {(14<<2)|2,{72,75,0}}, +/* 51097 */ {(14<<2)|2,{72,75,0}}, +/* 51098 */ {(14<<2)|2,{72,75,0}}, +/* 51099 */ {(14<<2)|2,{72,75,0}}, +/* 51100 */ {(14<<2)|2,{72,76,0}}, +/* 51101 */ {(14<<2)|2,{72,76,0}}, +/* 51102 */ {(14<<2)|2,{72,76,0}}, +/* 51103 */ {(14<<2)|2,{72,76,0}}, +/* 51104 */ {(14<<2)|2,{72,77,0}}, +/* 51105 */ {(14<<2)|2,{72,77,0}}, +/* 51106 */ {(14<<2)|2,{72,77,0}}, +/* 51107 */ {(14<<2)|2,{72,77,0}}, +/* 51108 */ {(14<<2)|2,{72,78,0}}, +/* 51109 */ {(14<<2)|2,{72,78,0}}, +/* 51110 */ {(14<<2)|2,{72,78,0}}, +/* 51111 */ {(14<<2)|2,{72,78,0}}, +/* 51112 */ {(14<<2)|2,{72,79,0}}, +/* 51113 */ {(14<<2)|2,{72,79,0}}, +/* 51114 */ {(14<<2)|2,{72,79,0}}, +/* 51115 */ {(14<<2)|2,{72,79,0}}, +/* 51116 */ {(14<<2)|2,{72,80,0}}, +/* 51117 */ {(14<<2)|2,{72,80,0}}, +/* 51118 */ {(14<<2)|2,{72,80,0}}, +/* 51119 */ {(14<<2)|2,{72,80,0}}, +/* 51120 */ {(14<<2)|2,{72,81,0}}, +/* 51121 */ {(14<<2)|2,{72,81,0}}, +/* 51122 */ {(14<<2)|2,{72,81,0}}, +/* 51123 */ {(14<<2)|2,{72,81,0}}, +/* 51124 */ {(14<<2)|2,{72,82,0}}, +/* 51125 */ {(14<<2)|2,{72,82,0}}, +/* 51126 */ {(14<<2)|2,{72,82,0}}, +/* 51127 */ {(14<<2)|2,{72,82,0}}, +/* 51128 */ {(14<<2)|2,{72,83,0}}, +/* 51129 */ {(14<<2)|2,{72,83,0}}, +/* 51130 */ {(14<<2)|2,{72,83,0}}, +/* 51131 */ {(14<<2)|2,{72,83,0}}, +/* 51132 */ {(14<<2)|2,{72,84,0}}, +/* 51133 */ {(14<<2)|2,{72,84,0}}, +/* 51134 */ {(14<<2)|2,{72,84,0}}, +/* 51135 */ {(14<<2)|2,{72,84,0}}, +/* 51136 */ {(14<<2)|2,{72,85,0}}, +/* 51137 */ {(14<<2)|2,{72,85,0}}, +/* 51138 */ {(14<<2)|2,{72,85,0}}, +/* 51139 */ {(14<<2)|2,{72,85,0}}, +/* 51140 */ {(14<<2)|2,{72,86,0}}, +/* 51141 */ {(14<<2)|2,{72,86,0}}, +/* 51142 */ {(14<<2)|2,{72,86,0}}, +/* 51143 */ {(14<<2)|2,{72,86,0}}, +/* 51144 */ {(14<<2)|2,{72,87,0}}, +/* 51145 */ {(14<<2)|2,{72,87,0}}, +/* 51146 */ {(14<<2)|2,{72,87,0}}, +/* 51147 */ {(14<<2)|2,{72,87,0}}, +/* 51148 */ {(14<<2)|2,{72,89,0}}, +/* 51149 */ {(14<<2)|2,{72,89,0}}, +/* 51150 */ {(14<<2)|2,{72,89,0}}, +/* 51151 */ {(14<<2)|2,{72,89,0}}, +/* 51152 */ {(14<<2)|2,{72,106,0}}, +/* 51153 */ {(14<<2)|2,{72,106,0}}, +/* 51154 */ {(14<<2)|2,{72,106,0}}, +/* 51155 */ {(14<<2)|2,{72,106,0}}, +/* 51156 */ {(14<<2)|2,{72,107,0}}, +/* 51157 */ {(14<<2)|2,{72,107,0}}, +/* 51158 */ {(14<<2)|2,{72,107,0}}, +/* 51159 */ {(14<<2)|2,{72,107,0}}, +/* 51160 */ {(14<<2)|2,{72,113,0}}, +/* 51161 */ {(14<<2)|2,{72,113,0}}, +/* 51162 */ {(14<<2)|2,{72,113,0}}, +/* 51163 */ {(14<<2)|2,{72,113,0}}, +/* 51164 */ {(14<<2)|2,{72,118,0}}, +/* 51165 */ {(14<<2)|2,{72,118,0}}, +/* 51166 */ {(14<<2)|2,{72,118,0}}, +/* 51167 */ {(14<<2)|2,{72,118,0}}, +/* 51168 */ {(14<<2)|2,{72,119,0}}, +/* 51169 */ {(14<<2)|2,{72,119,0}}, +/* 51170 */ {(14<<2)|2,{72,119,0}}, +/* 51171 */ {(14<<2)|2,{72,119,0}}, +/* 51172 */ {(14<<2)|2,{72,120,0}}, +/* 51173 */ {(14<<2)|2,{72,120,0}}, +/* 51174 */ {(14<<2)|2,{72,120,0}}, +/* 51175 */ {(14<<2)|2,{72,120,0}}, +/* 51176 */ {(14<<2)|2,{72,121,0}}, +/* 51177 */ {(14<<2)|2,{72,121,0}}, +/* 51178 */ {(14<<2)|2,{72,121,0}}, +/* 51179 */ {(14<<2)|2,{72,121,0}}, +/* 51180 */ {(14<<2)|2,{72,122,0}}, +/* 51181 */ {(14<<2)|2,{72,122,0}}, +/* 51182 */ {(14<<2)|2,{72,122,0}}, +/* 51183 */ {(14<<2)|2,{72,122,0}}, +/* 51184 */ {(15<<2)|2,{72,38,0}}, +/* 51185 */ {(15<<2)|2,{72,38,0}}, +/* 51186 */ {(15<<2)|2,{72,42,0}}, +/* 51187 */ {(15<<2)|2,{72,42,0}}, +/* 51188 */ {(15<<2)|2,{72,44,0}}, +/* 51189 */ {(15<<2)|2,{72,44,0}}, +/* 51190 */ {(15<<2)|2,{72,59,0}}, +/* 51191 */ {(15<<2)|2,{72,59,0}}, +/* 51192 */ {(15<<2)|2,{72,88,0}}, +/* 51193 */ {(15<<2)|2,{72,88,0}}, +/* 51194 */ {(15<<2)|2,{72,90,0}}, +/* 51195 */ {(15<<2)|2,{72,90,0}}, +/* 51196 */ {(7<<2)|1,{72,0,0}}, +/* 51197 */ {(7<<2)|1,{72,0,0}}, +/* 51198 */ {(7<<2)|1,{72,0,0}}, +/* 51199 */ {(7<<2)|1,{72,0,0}}, +/* 51200 */ {(12<<2)|2,{73,48,0}}, +/* 51201 */ {(12<<2)|2,{73,48,0}}, +/* 51202 */ {(12<<2)|2,{73,48,0}}, +/* 51203 */ {(12<<2)|2,{73,48,0}}, +/* 51204 */ {(12<<2)|2,{73,48,0}}, +/* 51205 */ {(12<<2)|2,{73,48,0}}, +/* 51206 */ {(12<<2)|2,{73,48,0}}, +/* 51207 */ {(12<<2)|2,{73,48,0}}, +/* 51208 */ {(12<<2)|2,{73,48,0}}, +/* 51209 */ {(12<<2)|2,{73,48,0}}, +/* 51210 */ {(12<<2)|2,{73,48,0}}, +/* 51211 */ {(12<<2)|2,{73,48,0}}, +/* 51212 */ {(12<<2)|2,{73,48,0}}, +/* 51213 */ {(12<<2)|2,{73,48,0}}, +/* 51214 */ {(12<<2)|2,{73,48,0}}, +/* 51215 */ {(12<<2)|2,{73,48,0}}, +/* 51216 */ {(12<<2)|2,{73,49,0}}, +/* 51217 */ {(12<<2)|2,{73,49,0}}, +/* 51218 */ {(12<<2)|2,{73,49,0}}, +/* 51219 */ {(12<<2)|2,{73,49,0}}, +/* 51220 */ {(12<<2)|2,{73,49,0}}, +/* 51221 */ {(12<<2)|2,{73,49,0}}, +/* 51222 */ {(12<<2)|2,{73,49,0}}, +/* 51223 */ {(12<<2)|2,{73,49,0}}, +/* 51224 */ {(12<<2)|2,{73,49,0}}, +/* 51225 */ {(12<<2)|2,{73,49,0}}, +/* 51226 */ {(12<<2)|2,{73,49,0}}, +/* 51227 */ {(12<<2)|2,{73,49,0}}, +/* 51228 */ {(12<<2)|2,{73,49,0}}, +/* 51229 */ {(12<<2)|2,{73,49,0}}, +/* 51230 */ {(12<<2)|2,{73,49,0}}, +/* 51231 */ {(12<<2)|2,{73,49,0}}, +/* 51232 */ {(12<<2)|2,{73,50,0}}, +/* 51233 */ {(12<<2)|2,{73,50,0}}, +/* 51234 */ {(12<<2)|2,{73,50,0}}, +/* 51235 */ {(12<<2)|2,{73,50,0}}, +/* 51236 */ {(12<<2)|2,{73,50,0}}, +/* 51237 */ {(12<<2)|2,{73,50,0}}, +/* 51238 */ {(12<<2)|2,{73,50,0}}, +/* 51239 */ {(12<<2)|2,{73,50,0}}, +/* 51240 */ {(12<<2)|2,{73,50,0}}, +/* 51241 */ {(12<<2)|2,{73,50,0}}, +/* 51242 */ {(12<<2)|2,{73,50,0}}, +/* 51243 */ {(12<<2)|2,{73,50,0}}, +/* 51244 */ {(12<<2)|2,{73,50,0}}, +/* 51245 */ {(12<<2)|2,{73,50,0}}, +/* 51246 */ {(12<<2)|2,{73,50,0}}, +/* 51247 */ {(12<<2)|2,{73,50,0}}, +/* 51248 */ {(12<<2)|2,{73,97,0}}, +/* 51249 */ {(12<<2)|2,{73,97,0}}, +/* 51250 */ {(12<<2)|2,{73,97,0}}, +/* 51251 */ {(12<<2)|2,{73,97,0}}, +/* 51252 */ {(12<<2)|2,{73,97,0}}, +/* 51253 */ {(12<<2)|2,{73,97,0}}, +/* 51254 */ {(12<<2)|2,{73,97,0}}, +/* 51255 */ {(12<<2)|2,{73,97,0}}, +/* 51256 */ {(12<<2)|2,{73,97,0}}, +/* 51257 */ {(12<<2)|2,{73,97,0}}, +/* 51258 */ {(12<<2)|2,{73,97,0}}, +/* 51259 */ {(12<<2)|2,{73,97,0}}, +/* 51260 */ {(12<<2)|2,{73,97,0}}, +/* 51261 */ {(12<<2)|2,{73,97,0}}, +/* 51262 */ {(12<<2)|2,{73,97,0}}, +/* 51263 */ {(12<<2)|2,{73,97,0}}, +/* 51264 */ {(12<<2)|2,{73,99,0}}, +/* 51265 */ {(12<<2)|2,{73,99,0}}, +/* 51266 */ {(12<<2)|2,{73,99,0}}, +/* 51267 */ {(12<<2)|2,{73,99,0}}, +/* 51268 */ {(12<<2)|2,{73,99,0}}, +/* 51269 */ {(12<<2)|2,{73,99,0}}, +/* 51270 */ {(12<<2)|2,{73,99,0}}, +/* 51271 */ {(12<<2)|2,{73,99,0}}, +/* 51272 */ {(12<<2)|2,{73,99,0}}, +/* 51273 */ {(12<<2)|2,{73,99,0}}, +/* 51274 */ {(12<<2)|2,{73,99,0}}, +/* 51275 */ {(12<<2)|2,{73,99,0}}, +/* 51276 */ {(12<<2)|2,{73,99,0}}, +/* 51277 */ {(12<<2)|2,{73,99,0}}, +/* 51278 */ {(12<<2)|2,{73,99,0}}, +/* 51279 */ {(12<<2)|2,{73,99,0}}, +/* 51280 */ {(12<<2)|2,{73,101,0}}, +/* 51281 */ {(12<<2)|2,{73,101,0}}, +/* 51282 */ {(12<<2)|2,{73,101,0}}, +/* 51283 */ {(12<<2)|2,{73,101,0}}, +/* 51284 */ {(12<<2)|2,{73,101,0}}, +/* 51285 */ {(12<<2)|2,{73,101,0}}, +/* 51286 */ {(12<<2)|2,{73,101,0}}, +/* 51287 */ {(12<<2)|2,{73,101,0}}, +/* 51288 */ {(12<<2)|2,{73,101,0}}, +/* 51289 */ {(12<<2)|2,{73,101,0}}, +/* 51290 */ {(12<<2)|2,{73,101,0}}, +/* 51291 */ {(12<<2)|2,{73,101,0}}, +/* 51292 */ {(12<<2)|2,{73,101,0}}, +/* 51293 */ {(12<<2)|2,{73,101,0}}, +/* 51294 */ {(12<<2)|2,{73,101,0}}, +/* 51295 */ {(12<<2)|2,{73,101,0}}, +/* 51296 */ {(12<<2)|2,{73,105,0}}, +/* 51297 */ {(12<<2)|2,{73,105,0}}, +/* 51298 */ {(12<<2)|2,{73,105,0}}, +/* 51299 */ {(12<<2)|2,{73,105,0}}, +/* 51300 */ {(12<<2)|2,{73,105,0}}, +/* 51301 */ {(12<<2)|2,{73,105,0}}, +/* 51302 */ {(12<<2)|2,{73,105,0}}, +/* 51303 */ {(12<<2)|2,{73,105,0}}, +/* 51304 */ {(12<<2)|2,{73,105,0}}, +/* 51305 */ {(12<<2)|2,{73,105,0}}, +/* 51306 */ {(12<<2)|2,{73,105,0}}, +/* 51307 */ {(12<<2)|2,{73,105,0}}, +/* 51308 */ {(12<<2)|2,{73,105,0}}, +/* 51309 */ {(12<<2)|2,{73,105,0}}, +/* 51310 */ {(12<<2)|2,{73,105,0}}, +/* 51311 */ {(12<<2)|2,{73,105,0}}, +/* 51312 */ {(12<<2)|2,{73,111,0}}, +/* 51313 */ {(12<<2)|2,{73,111,0}}, +/* 51314 */ {(12<<2)|2,{73,111,0}}, +/* 51315 */ {(12<<2)|2,{73,111,0}}, +/* 51316 */ {(12<<2)|2,{73,111,0}}, +/* 51317 */ {(12<<2)|2,{73,111,0}}, +/* 51318 */ {(12<<2)|2,{73,111,0}}, +/* 51319 */ {(12<<2)|2,{73,111,0}}, +/* 51320 */ {(12<<2)|2,{73,111,0}}, +/* 51321 */ {(12<<2)|2,{73,111,0}}, +/* 51322 */ {(12<<2)|2,{73,111,0}}, +/* 51323 */ {(12<<2)|2,{73,111,0}}, +/* 51324 */ {(12<<2)|2,{73,111,0}}, +/* 51325 */ {(12<<2)|2,{73,111,0}}, +/* 51326 */ {(12<<2)|2,{73,111,0}}, +/* 51327 */ {(12<<2)|2,{73,111,0}}, +/* 51328 */ {(12<<2)|2,{73,115,0}}, +/* 51329 */ {(12<<2)|2,{73,115,0}}, +/* 51330 */ {(12<<2)|2,{73,115,0}}, +/* 51331 */ {(12<<2)|2,{73,115,0}}, +/* 51332 */ {(12<<2)|2,{73,115,0}}, +/* 51333 */ {(12<<2)|2,{73,115,0}}, +/* 51334 */ {(12<<2)|2,{73,115,0}}, +/* 51335 */ {(12<<2)|2,{73,115,0}}, +/* 51336 */ {(12<<2)|2,{73,115,0}}, +/* 51337 */ {(12<<2)|2,{73,115,0}}, +/* 51338 */ {(12<<2)|2,{73,115,0}}, +/* 51339 */ {(12<<2)|2,{73,115,0}}, +/* 51340 */ {(12<<2)|2,{73,115,0}}, +/* 51341 */ {(12<<2)|2,{73,115,0}}, +/* 51342 */ {(12<<2)|2,{73,115,0}}, +/* 51343 */ {(12<<2)|2,{73,115,0}}, +/* 51344 */ {(12<<2)|2,{73,116,0}}, +/* 51345 */ {(12<<2)|2,{73,116,0}}, +/* 51346 */ {(12<<2)|2,{73,116,0}}, +/* 51347 */ {(12<<2)|2,{73,116,0}}, +/* 51348 */ {(12<<2)|2,{73,116,0}}, +/* 51349 */ {(12<<2)|2,{73,116,0}}, +/* 51350 */ {(12<<2)|2,{73,116,0}}, +/* 51351 */ {(12<<2)|2,{73,116,0}}, +/* 51352 */ {(12<<2)|2,{73,116,0}}, +/* 51353 */ {(12<<2)|2,{73,116,0}}, +/* 51354 */ {(12<<2)|2,{73,116,0}}, +/* 51355 */ {(12<<2)|2,{73,116,0}}, +/* 51356 */ {(12<<2)|2,{73,116,0}}, +/* 51357 */ {(12<<2)|2,{73,116,0}}, +/* 51358 */ {(12<<2)|2,{73,116,0}}, +/* 51359 */ {(12<<2)|2,{73,116,0}}, +/* 51360 */ {(13<<2)|2,{73,32,0}}, +/* 51361 */ {(13<<2)|2,{73,32,0}}, +/* 51362 */ {(13<<2)|2,{73,32,0}}, +/* 51363 */ {(13<<2)|2,{73,32,0}}, +/* 51364 */ {(13<<2)|2,{73,32,0}}, +/* 51365 */ {(13<<2)|2,{73,32,0}}, +/* 51366 */ {(13<<2)|2,{73,32,0}}, +/* 51367 */ {(13<<2)|2,{73,32,0}}, +/* 51368 */ {(13<<2)|2,{73,37,0}}, +/* 51369 */ {(13<<2)|2,{73,37,0}}, +/* 51370 */ {(13<<2)|2,{73,37,0}}, +/* 51371 */ {(13<<2)|2,{73,37,0}}, +/* 51372 */ {(13<<2)|2,{73,37,0}}, +/* 51373 */ {(13<<2)|2,{73,37,0}}, +/* 51374 */ {(13<<2)|2,{73,37,0}}, +/* 51375 */ {(13<<2)|2,{73,37,0}}, +/* 51376 */ {(13<<2)|2,{73,45,0}}, +/* 51377 */ {(13<<2)|2,{73,45,0}}, +/* 51378 */ {(13<<2)|2,{73,45,0}}, +/* 51379 */ {(13<<2)|2,{73,45,0}}, +/* 51380 */ {(13<<2)|2,{73,45,0}}, +/* 51381 */ {(13<<2)|2,{73,45,0}}, +/* 51382 */ {(13<<2)|2,{73,45,0}}, +/* 51383 */ {(13<<2)|2,{73,45,0}}, +/* 51384 */ {(13<<2)|2,{73,46,0}}, +/* 51385 */ {(13<<2)|2,{73,46,0}}, +/* 51386 */ {(13<<2)|2,{73,46,0}}, +/* 51387 */ {(13<<2)|2,{73,46,0}}, +/* 51388 */ {(13<<2)|2,{73,46,0}}, +/* 51389 */ {(13<<2)|2,{73,46,0}}, +/* 51390 */ {(13<<2)|2,{73,46,0}}, +/* 51391 */ {(13<<2)|2,{73,46,0}}, +/* 51392 */ {(13<<2)|2,{73,47,0}}, +/* 51393 */ {(13<<2)|2,{73,47,0}}, +/* 51394 */ {(13<<2)|2,{73,47,0}}, +/* 51395 */ {(13<<2)|2,{73,47,0}}, +/* 51396 */ {(13<<2)|2,{73,47,0}}, +/* 51397 */ {(13<<2)|2,{73,47,0}}, +/* 51398 */ {(13<<2)|2,{73,47,0}}, +/* 51399 */ {(13<<2)|2,{73,47,0}}, +/* 51400 */ {(13<<2)|2,{73,51,0}}, +/* 51401 */ {(13<<2)|2,{73,51,0}}, +/* 51402 */ {(13<<2)|2,{73,51,0}}, +/* 51403 */ {(13<<2)|2,{73,51,0}}, +/* 51404 */ {(13<<2)|2,{73,51,0}}, +/* 51405 */ {(13<<2)|2,{73,51,0}}, +/* 51406 */ {(13<<2)|2,{73,51,0}}, +/* 51407 */ {(13<<2)|2,{73,51,0}}, +/* 51408 */ {(13<<2)|2,{73,52,0}}, +/* 51409 */ {(13<<2)|2,{73,52,0}}, +/* 51410 */ {(13<<2)|2,{73,52,0}}, +/* 51411 */ {(13<<2)|2,{73,52,0}}, +/* 51412 */ {(13<<2)|2,{73,52,0}}, +/* 51413 */ {(13<<2)|2,{73,52,0}}, +/* 51414 */ {(13<<2)|2,{73,52,0}}, +/* 51415 */ {(13<<2)|2,{73,52,0}}, +/* 51416 */ {(13<<2)|2,{73,53,0}}, +/* 51417 */ {(13<<2)|2,{73,53,0}}, +/* 51418 */ {(13<<2)|2,{73,53,0}}, +/* 51419 */ {(13<<2)|2,{73,53,0}}, +/* 51420 */ {(13<<2)|2,{73,53,0}}, +/* 51421 */ {(13<<2)|2,{73,53,0}}, +/* 51422 */ {(13<<2)|2,{73,53,0}}, +/* 51423 */ {(13<<2)|2,{73,53,0}}, +/* 51424 */ {(13<<2)|2,{73,54,0}}, +/* 51425 */ {(13<<2)|2,{73,54,0}}, +/* 51426 */ {(13<<2)|2,{73,54,0}}, +/* 51427 */ {(13<<2)|2,{73,54,0}}, +/* 51428 */ {(13<<2)|2,{73,54,0}}, +/* 51429 */ {(13<<2)|2,{73,54,0}}, +/* 51430 */ {(13<<2)|2,{73,54,0}}, +/* 51431 */ {(13<<2)|2,{73,54,0}}, +/* 51432 */ {(13<<2)|2,{73,55,0}}, +/* 51433 */ {(13<<2)|2,{73,55,0}}, +/* 51434 */ {(13<<2)|2,{73,55,0}}, +/* 51435 */ {(13<<2)|2,{73,55,0}}, +/* 51436 */ {(13<<2)|2,{73,55,0}}, +/* 51437 */ {(13<<2)|2,{73,55,0}}, +/* 51438 */ {(13<<2)|2,{73,55,0}}, +/* 51439 */ {(13<<2)|2,{73,55,0}}, +/* 51440 */ {(13<<2)|2,{73,56,0}}, +/* 51441 */ {(13<<2)|2,{73,56,0}}, +/* 51442 */ {(13<<2)|2,{73,56,0}}, +/* 51443 */ {(13<<2)|2,{73,56,0}}, +/* 51444 */ {(13<<2)|2,{73,56,0}}, +/* 51445 */ {(13<<2)|2,{73,56,0}}, +/* 51446 */ {(13<<2)|2,{73,56,0}}, +/* 51447 */ {(13<<2)|2,{73,56,0}}, +/* 51448 */ {(13<<2)|2,{73,57,0}}, +/* 51449 */ {(13<<2)|2,{73,57,0}}, +/* 51450 */ {(13<<2)|2,{73,57,0}}, +/* 51451 */ {(13<<2)|2,{73,57,0}}, +/* 51452 */ {(13<<2)|2,{73,57,0}}, +/* 51453 */ {(13<<2)|2,{73,57,0}}, +/* 51454 */ {(13<<2)|2,{73,57,0}}, +/* 51455 */ {(13<<2)|2,{73,57,0}}, +/* 51456 */ {(13<<2)|2,{73,61,0}}, +/* 51457 */ {(13<<2)|2,{73,61,0}}, +/* 51458 */ {(13<<2)|2,{73,61,0}}, +/* 51459 */ {(13<<2)|2,{73,61,0}}, +/* 51460 */ {(13<<2)|2,{73,61,0}}, +/* 51461 */ {(13<<2)|2,{73,61,0}}, +/* 51462 */ {(13<<2)|2,{73,61,0}}, +/* 51463 */ {(13<<2)|2,{73,61,0}}, +/* 51464 */ {(13<<2)|2,{73,65,0}}, +/* 51465 */ {(13<<2)|2,{73,65,0}}, +/* 51466 */ {(13<<2)|2,{73,65,0}}, +/* 51467 */ {(13<<2)|2,{73,65,0}}, +/* 51468 */ {(13<<2)|2,{73,65,0}}, +/* 51469 */ {(13<<2)|2,{73,65,0}}, +/* 51470 */ {(13<<2)|2,{73,65,0}}, +/* 51471 */ {(13<<2)|2,{73,65,0}}, +/* 51472 */ {(13<<2)|2,{73,95,0}}, +/* 51473 */ {(13<<2)|2,{73,95,0}}, +/* 51474 */ {(13<<2)|2,{73,95,0}}, +/* 51475 */ {(13<<2)|2,{73,95,0}}, +/* 51476 */ {(13<<2)|2,{73,95,0}}, +/* 51477 */ {(13<<2)|2,{73,95,0}}, +/* 51478 */ {(13<<2)|2,{73,95,0}}, +/* 51479 */ {(13<<2)|2,{73,95,0}}, +/* 51480 */ {(13<<2)|2,{73,98,0}}, +/* 51481 */ {(13<<2)|2,{73,98,0}}, +/* 51482 */ {(13<<2)|2,{73,98,0}}, +/* 51483 */ {(13<<2)|2,{73,98,0}}, +/* 51484 */ {(13<<2)|2,{73,98,0}}, +/* 51485 */ {(13<<2)|2,{73,98,0}}, +/* 51486 */ {(13<<2)|2,{73,98,0}}, +/* 51487 */ {(13<<2)|2,{73,98,0}}, +/* 51488 */ {(13<<2)|2,{73,100,0}}, +/* 51489 */ {(13<<2)|2,{73,100,0}}, +/* 51490 */ {(13<<2)|2,{73,100,0}}, +/* 51491 */ {(13<<2)|2,{73,100,0}}, +/* 51492 */ {(13<<2)|2,{73,100,0}}, +/* 51493 */ {(13<<2)|2,{73,100,0}}, +/* 51494 */ {(13<<2)|2,{73,100,0}}, +/* 51495 */ {(13<<2)|2,{73,100,0}}, +/* 51496 */ {(13<<2)|2,{73,102,0}}, +/* 51497 */ {(13<<2)|2,{73,102,0}}, +/* 51498 */ {(13<<2)|2,{73,102,0}}, +/* 51499 */ {(13<<2)|2,{73,102,0}}, +/* 51500 */ {(13<<2)|2,{73,102,0}}, +/* 51501 */ {(13<<2)|2,{73,102,0}}, +/* 51502 */ {(13<<2)|2,{73,102,0}}, +/* 51503 */ {(13<<2)|2,{73,102,0}}, +/* 51504 */ {(13<<2)|2,{73,103,0}}, +/* 51505 */ {(13<<2)|2,{73,103,0}}, +/* 51506 */ {(13<<2)|2,{73,103,0}}, +/* 51507 */ {(13<<2)|2,{73,103,0}}, +/* 51508 */ {(13<<2)|2,{73,103,0}}, +/* 51509 */ {(13<<2)|2,{73,103,0}}, +/* 51510 */ {(13<<2)|2,{73,103,0}}, +/* 51511 */ {(13<<2)|2,{73,103,0}}, +/* 51512 */ {(13<<2)|2,{73,104,0}}, +/* 51513 */ {(13<<2)|2,{73,104,0}}, +/* 51514 */ {(13<<2)|2,{73,104,0}}, +/* 51515 */ {(13<<2)|2,{73,104,0}}, +/* 51516 */ {(13<<2)|2,{73,104,0}}, +/* 51517 */ {(13<<2)|2,{73,104,0}}, +/* 51518 */ {(13<<2)|2,{73,104,0}}, +/* 51519 */ {(13<<2)|2,{73,104,0}}, +/* 51520 */ {(13<<2)|2,{73,108,0}}, +/* 51521 */ {(13<<2)|2,{73,108,0}}, +/* 51522 */ {(13<<2)|2,{73,108,0}}, +/* 51523 */ {(13<<2)|2,{73,108,0}}, +/* 51524 */ {(13<<2)|2,{73,108,0}}, +/* 51525 */ {(13<<2)|2,{73,108,0}}, +/* 51526 */ {(13<<2)|2,{73,108,0}}, +/* 51527 */ {(13<<2)|2,{73,108,0}}, +/* 51528 */ {(13<<2)|2,{73,109,0}}, +/* 51529 */ {(13<<2)|2,{73,109,0}}, +/* 51530 */ {(13<<2)|2,{73,109,0}}, +/* 51531 */ {(13<<2)|2,{73,109,0}}, +/* 51532 */ {(13<<2)|2,{73,109,0}}, +/* 51533 */ {(13<<2)|2,{73,109,0}}, +/* 51534 */ {(13<<2)|2,{73,109,0}}, +/* 51535 */ {(13<<2)|2,{73,109,0}}, +/* 51536 */ {(13<<2)|2,{73,110,0}}, +/* 51537 */ {(13<<2)|2,{73,110,0}}, +/* 51538 */ {(13<<2)|2,{73,110,0}}, +/* 51539 */ {(13<<2)|2,{73,110,0}}, +/* 51540 */ {(13<<2)|2,{73,110,0}}, +/* 51541 */ {(13<<2)|2,{73,110,0}}, +/* 51542 */ {(13<<2)|2,{73,110,0}}, +/* 51543 */ {(13<<2)|2,{73,110,0}}, +/* 51544 */ {(13<<2)|2,{73,112,0}}, +/* 51545 */ {(13<<2)|2,{73,112,0}}, +/* 51546 */ {(13<<2)|2,{73,112,0}}, +/* 51547 */ {(13<<2)|2,{73,112,0}}, +/* 51548 */ {(13<<2)|2,{73,112,0}}, +/* 51549 */ {(13<<2)|2,{73,112,0}}, +/* 51550 */ {(13<<2)|2,{73,112,0}}, +/* 51551 */ {(13<<2)|2,{73,112,0}}, +/* 51552 */ {(13<<2)|2,{73,114,0}}, +/* 51553 */ {(13<<2)|2,{73,114,0}}, +/* 51554 */ {(13<<2)|2,{73,114,0}}, +/* 51555 */ {(13<<2)|2,{73,114,0}}, +/* 51556 */ {(13<<2)|2,{73,114,0}}, +/* 51557 */ {(13<<2)|2,{73,114,0}}, +/* 51558 */ {(13<<2)|2,{73,114,0}}, +/* 51559 */ {(13<<2)|2,{73,114,0}}, +/* 51560 */ {(13<<2)|2,{73,117,0}}, +/* 51561 */ {(13<<2)|2,{73,117,0}}, +/* 51562 */ {(13<<2)|2,{73,117,0}}, +/* 51563 */ {(13<<2)|2,{73,117,0}}, +/* 51564 */ {(13<<2)|2,{73,117,0}}, +/* 51565 */ {(13<<2)|2,{73,117,0}}, +/* 51566 */ {(13<<2)|2,{73,117,0}}, +/* 51567 */ {(13<<2)|2,{73,117,0}}, +/* 51568 */ {(14<<2)|2,{73,58,0}}, +/* 51569 */ {(14<<2)|2,{73,58,0}}, +/* 51570 */ {(14<<2)|2,{73,58,0}}, +/* 51571 */ {(14<<2)|2,{73,58,0}}, +/* 51572 */ {(14<<2)|2,{73,66,0}}, +/* 51573 */ {(14<<2)|2,{73,66,0}}, +/* 51574 */ {(14<<2)|2,{73,66,0}}, +/* 51575 */ {(14<<2)|2,{73,66,0}}, +/* 51576 */ {(14<<2)|2,{73,67,0}}, +/* 51577 */ {(14<<2)|2,{73,67,0}}, +/* 51578 */ {(14<<2)|2,{73,67,0}}, +/* 51579 */ {(14<<2)|2,{73,67,0}}, +/* 51580 */ {(14<<2)|2,{73,68,0}}, +/* 51581 */ {(14<<2)|2,{73,68,0}}, +/* 51582 */ {(14<<2)|2,{73,68,0}}, +/* 51583 */ {(14<<2)|2,{73,68,0}}, +/* 51584 */ {(14<<2)|2,{73,69,0}}, +/* 51585 */ {(14<<2)|2,{73,69,0}}, +/* 51586 */ {(14<<2)|2,{73,69,0}}, +/* 51587 */ {(14<<2)|2,{73,69,0}}, +/* 51588 */ {(14<<2)|2,{73,70,0}}, +/* 51589 */ {(14<<2)|2,{73,70,0}}, +/* 51590 */ {(14<<2)|2,{73,70,0}}, +/* 51591 */ {(14<<2)|2,{73,70,0}}, +/* 51592 */ {(14<<2)|2,{73,71,0}}, +/* 51593 */ {(14<<2)|2,{73,71,0}}, +/* 51594 */ {(14<<2)|2,{73,71,0}}, +/* 51595 */ {(14<<2)|2,{73,71,0}}, +/* 51596 */ {(14<<2)|2,{73,72,0}}, +/* 51597 */ {(14<<2)|2,{73,72,0}}, +/* 51598 */ {(14<<2)|2,{73,72,0}}, +/* 51599 */ {(14<<2)|2,{73,72,0}}, +/* 51600 */ {(14<<2)|2,{73,73,0}}, +/* 51601 */ {(14<<2)|2,{73,73,0}}, +/* 51602 */ {(14<<2)|2,{73,73,0}}, +/* 51603 */ {(14<<2)|2,{73,73,0}}, +/* 51604 */ {(14<<2)|2,{73,74,0}}, +/* 51605 */ {(14<<2)|2,{73,74,0}}, +/* 51606 */ {(14<<2)|2,{73,74,0}}, +/* 51607 */ {(14<<2)|2,{73,74,0}}, +/* 51608 */ {(14<<2)|2,{73,75,0}}, +/* 51609 */ {(14<<2)|2,{73,75,0}}, +/* 51610 */ {(14<<2)|2,{73,75,0}}, +/* 51611 */ {(14<<2)|2,{73,75,0}}, +/* 51612 */ {(14<<2)|2,{73,76,0}}, +/* 51613 */ {(14<<2)|2,{73,76,0}}, +/* 51614 */ {(14<<2)|2,{73,76,0}}, +/* 51615 */ {(14<<2)|2,{73,76,0}}, +/* 51616 */ {(14<<2)|2,{73,77,0}}, +/* 51617 */ {(14<<2)|2,{73,77,0}}, +/* 51618 */ {(14<<2)|2,{73,77,0}}, +/* 51619 */ {(14<<2)|2,{73,77,0}}, +/* 51620 */ {(14<<2)|2,{73,78,0}}, +/* 51621 */ {(14<<2)|2,{73,78,0}}, +/* 51622 */ {(14<<2)|2,{73,78,0}}, +/* 51623 */ {(14<<2)|2,{73,78,0}}, +/* 51624 */ {(14<<2)|2,{73,79,0}}, +/* 51625 */ {(14<<2)|2,{73,79,0}}, +/* 51626 */ {(14<<2)|2,{73,79,0}}, +/* 51627 */ {(14<<2)|2,{73,79,0}}, +/* 51628 */ {(14<<2)|2,{73,80,0}}, +/* 51629 */ {(14<<2)|2,{73,80,0}}, +/* 51630 */ {(14<<2)|2,{73,80,0}}, +/* 51631 */ {(14<<2)|2,{73,80,0}}, +/* 51632 */ {(14<<2)|2,{73,81,0}}, +/* 51633 */ {(14<<2)|2,{73,81,0}}, +/* 51634 */ {(14<<2)|2,{73,81,0}}, +/* 51635 */ {(14<<2)|2,{73,81,0}}, +/* 51636 */ {(14<<2)|2,{73,82,0}}, +/* 51637 */ {(14<<2)|2,{73,82,0}}, +/* 51638 */ {(14<<2)|2,{73,82,0}}, +/* 51639 */ {(14<<2)|2,{73,82,0}}, +/* 51640 */ {(14<<2)|2,{73,83,0}}, +/* 51641 */ {(14<<2)|2,{73,83,0}}, +/* 51642 */ {(14<<2)|2,{73,83,0}}, +/* 51643 */ {(14<<2)|2,{73,83,0}}, +/* 51644 */ {(14<<2)|2,{73,84,0}}, +/* 51645 */ {(14<<2)|2,{73,84,0}}, +/* 51646 */ {(14<<2)|2,{73,84,0}}, +/* 51647 */ {(14<<2)|2,{73,84,0}}, +/* 51648 */ {(14<<2)|2,{73,85,0}}, +/* 51649 */ {(14<<2)|2,{73,85,0}}, +/* 51650 */ {(14<<2)|2,{73,85,0}}, +/* 51651 */ {(14<<2)|2,{73,85,0}}, +/* 51652 */ {(14<<2)|2,{73,86,0}}, +/* 51653 */ {(14<<2)|2,{73,86,0}}, +/* 51654 */ {(14<<2)|2,{73,86,0}}, +/* 51655 */ {(14<<2)|2,{73,86,0}}, +/* 51656 */ {(14<<2)|2,{73,87,0}}, +/* 51657 */ {(14<<2)|2,{73,87,0}}, +/* 51658 */ {(14<<2)|2,{73,87,0}}, +/* 51659 */ {(14<<2)|2,{73,87,0}}, +/* 51660 */ {(14<<2)|2,{73,89,0}}, +/* 51661 */ {(14<<2)|2,{73,89,0}}, +/* 51662 */ {(14<<2)|2,{73,89,0}}, +/* 51663 */ {(14<<2)|2,{73,89,0}}, +/* 51664 */ {(14<<2)|2,{73,106,0}}, +/* 51665 */ {(14<<2)|2,{73,106,0}}, +/* 51666 */ {(14<<2)|2,{73,106,0}}, +/* 51667 */ {(14<<2)|2,{73,106,0}}, +/* 51668 */ {(14<<2)|2,{73,107,0}}, +/* 51669 */ {(14<<2)|2,{73,107,0}}, +/* 51670 */ {(14<<2)|2,{73,107,0}}, +/* 51671 */ {(14<<2)|2,{73,107,0}}, +/* 51672 */ {(14<<2)|2,{73,113,0}}, +/* 51673 */ {(14<<2)|2,{73,113,0}}, +/* 51674 */ {(14<<2)|2,{73,113,0}}, +/* 51675 */ {(14<<2)|2,{73,113,0}}, +/* 51676 */ {(14<<2)|2,{73,118,0}}, +/* 51677 */ {(14<<2)|2,{73,118,0}}, +/* 51678 */ {(14<<2)|2,{73,118,0}}, +/* 51679 */ {(14<<2)|2,{73,118,0}}, +/* 51680 */ {(14<<2)|2,{73,119,0}}, +/* 51681 */ {(14<<2)|2,{73,119,0}}, +/* 51682 */ {(14<<2)|2,{73,119,0}}, +/* 51683 */ {(14<<2)|2,{73,119,0}}, +/* 51684 */ {(14<<2)|2,{73,120,0}}, +/* 51685 */ {(14<<2)|2,{73,120,0}}, +/* 51686 */ {(14<<2)|2,{73,120,0}}, +/* 51687 */ {(14<<2)|2,{73,120,0}}, +/* 51688 */ {(14<<2)|2,{73,121,0}}, +/* 51689 */ {(14<<2)|2,{73,121,0}}, +/* 51690 */ {(14<<2)|2,{73,121,0}}, +/* 51691 */ {(14<<2)|2,{73,121,0}}, +/* 51692 */ {(14<<2)|2,{73,122,0}}, +/* 51693 */ {(14<<2)|2,{73,122,0}}, +/* 51694 */ {(14<<2)|2,{73,122,0}}, +/* 51695 */ {(14<<2)|2,{73,122,0}}, +/* 51696 */ {(15<<2)|2,{73,38,0}}, +/* 51697 */ {(15<<2)|2,{73,38,0}}, +/* 51698 */ {(15<<2)|2,{73,42,0}}, +/* 51699 */ {(15<<2)|2,{73,42,0}}, +/* 51700 */ {(15<<2)|2,{73,44,0}}, +/* 51701 */ {(15<<2)|2,{73,44,0}}, +/* 51702 */ {(15<<2)|2,{73,59,0}}, +/* 51703 */ {(15<<2)|2,{73,59,0}}, +/* 51704 */ {(15<<2)|2,{73,88,0}}, +/* 51705 */ {(15<<2)|2,{73,88,0}}, +/* 51706 */ {(15<<2)|2,{73,90,0}}, +/* 51707 */ {(15<<2)|2,{73,90,0}}, +/* 51708 */ {(7<<2)|1,{73,0,0}}, +/* 51709 */ {(7<<2)|1,{73,0,0}}, +/* 51710 */ {(7<<2)|1,{73,0,0}}, +/* 51711 */ {(7<<2)|1,{73,0,0}}, +/* 51712 */ {(12<<2)|2,{74,48,0}}, +/* 51713 */ {(12<<2)|2,{74,48,0}}, +/* 51714 */ {(12<<2)|2,{74,48,0}}, +/* 51715 */ {(12<<2)|2,{74,48,0}}, +/* 51716 */ {(12<<2)|2,{74,48,0}}, +/* 51717 */ {(12<<2)|2,{74,48,0}}, +/* 51718 */ {(12<<2)|2,{74,48,0}}, +/* 51719 */ {(12<<2)|2,{74,48,0}}, +/* 51720 */ {(12<<2)|2,{74,48,0}}, +/* 51721 */ {(12<<2)|2,{74,48,0}}, +/* 51722 */ {(12<<2)|2,{74,48,0}}, +/* 51723 */ {(12<<2)|2,{74,48,0}}, +/* 51724 */ {(12<<2)|2,{74,48,0}}, +/* 51725 */ {(12<<2)|2,{74,48,0}}, +/* 51726 */ {(12<<2)|2,{74,48,0}}, +/* 51727 */ {(12<<2)|2,{74,48,0}}, +/* 51728 */ {(12<<2)|2,{74,49,0}}, +/* 51729 */ {(12<<2)|2,{74,49,0}}, +/* 51730 */ {(12<<2)|2,{74,49,0}}, +/* 51731 */ {(12<<2)|2,{74,49,0}}, +/* 51732 */ {(12<<2)|2,{74,49,0}}, +/* 51733 */ {(12<<2)|2,{74,49,0}}, +/* 51734 */ {(12<<2)|2,{74,49,0}}, +/* 51735 */ {(12<<2)|2,{74,49,0}}, +/* 51736 */ {(12<<2)|2,{74,49,0}}, +/* 51737 */ {(12<<2)|2,{74,49,0}}, +/* 51738 */ {(12<<2)|2,{74,49,0}}, +/* 51739 */ {(12<<2)|2,{74,49,0}}, +/* 51740 */ {(12<<2)|2,{74,49,0}}, +/* 51741 */ {(12<<2)|2,{74,49,0}}, +/* 51742 */ {(12<<2)|2,{74,49,0}}, +/* 51743 */ {(12<<2)|2,{74,49,0}}, +/* 51744 */ {(12<<2)|2,{74,50,0}}, +/* 51745 */ {(12<<2)|2,{74,50,0}}, +/* 51746 */ {(12<<2)|2,{74,50,0}}, +/* 51747 */ {(12<<2)|2,{74,50,0}}, +/* 51748 */ {(12<<2)|2,{74,50,0}}, +/* 51749 */ {(12<<2)|2,{74,50,0}}, +/* 51750 */ {(12<<2)|2,{74,50,0}}, +/* 51751 */ {(12<<2)|2,{74,50,0}}, +/* 51752 */ {(12<<2)|2,{74,50,0}}, +/* 51753 */ {(12<<2)|2,{74,50,0}}, +/* 51754 */ {(12<<2)|2,{74,50,0}}, +/* 51755 */ {(12<<2)|2,{74,50,0}}, +/* 51756 */ {(12<<2)|2,{74,50,0}}, +/* 51757 */ {(12<<2)|2,{74,50,0}}, +/* 51758 */ {(12<<2)|2,{74,50,0}}, +/* 51759 */ {(12<<2)|2,{74,50,0}}, +/* 51760 */ {(12<<2)|2,{74,97,0}}, +/* 51761 */ {(12<<2)|2,{74,97,0}}, +/* 51762 */ {(12<<2)|2,{74,97,0}}, +/* 51763 */ {(12<<2)|2,{74,97,0}}, +/* 51764 */ {(12<<2)|2,{74,97,0}}, +/* 51765 */ {(12<<2)|2,{74,97,0}}, +/* 51766 */ {(12<<2)|2,{74,97,0}}, +/* 51767 */ {(12<<2)|2,{74,97,0}}, +/* 51768 */ {(12<<2)|2,{74,97,0}}, +/* 51769 */ {(12<<2)|2,{74,97,0}}, +/* 51770 */ {(12<<2)|2,{74,97,0}}, +/* 51771 */ {(12<<2)|2,{74,97,0}}, +/* 51772 */ {(12<<2)|2,{74,97,0}}, +/* 51773 */ {(12<<2)|2,{74,97,0}}, +/* 51774 */ {(12<<2)|2,{74,97,0}}, +/* 51775 */ {(12<<2)|2,{74,97,0}}, +/* 51776 */ {(12<<2)|2,{74,99,0}}, +/* 51777 */ {(12<<2)|2,{74,99,0}}, +/* 51778 */ {(12<<2)|2,{74,99,0}}, +/* 51779 */ {(12<<2)|2,{74,99,0}}, +/* 51780 */ {(12<<2)|2,{74,99,0}}, +/* 51781 */ {(12<<2)|2,{74,99,0}}, +/* 51782 */ {(12<<2)|2,{74,99,0}}, +/* 51783 */ {(12<<2)|2,{74,99,0}}, +/* 51784 */ {(12<<2)|2,{74,99,0}}, +/* 51785 */ {(12<<2)|2,{74,99,0}}, +/* 51786 */ {(12<<2)|2,{74,99,0}}, +/* 51787 */ {(12<<2)|2,{74,99,0}}, +/* 51788 */ {(12<<2)|2,{74,99,0}}, +/* 51789 */ {(12<<2)|2,{74,99,0}}, +/* 51790 */ {(12<<2)|2,{74,99,0}}, +/* 51791 */ {(12<<2)|2,{74,99,0}}, +/* 51792 */ {(12<<2)|2,{74,101,0}}, +/* 51793 */ {(12<<2)|2,{74,101,0}}, +/* 51794 */ {(12<<2)|2,{74,101,0}}, +/* 51795 */ {(12<<2)|2,{74,101,0}}, +/* 51796 */ {(12<<2)|2,{74,101,0}}, +/* 51797 */ {(12<<2)|2,{74,101,0}}, +/* 51798 */ {(12<<2)|2,{74,101,0}}, +/* 51799 */ {(12<<2)|2,{74,101,0}}, +/* 51800 */ {(12<<2)|2,{74,101,0}}, +/* 51801 */ {(12<<2)|2,{74,101,0}}, +/* 51802 */ {(12<<2)|2,{74,101,0}}, +/* 51803 */ {(12<<2)|2,{74,101,0}}, +/* 51804 */ {(12<<2)|2,{74,101,0}}, +/* 51805 */ {(12<<2)|2,{74,101,0}}, +/* 51806 */ {(12<<2)|2,{74,101,0}}, +/* 51807 */ {(12<<2)|2,{74,101,0}}, +/* 51808 */ {(12<<2)|2,{74,105,0}}, +/* 51809 */ {(12<<2)|2,{74,105,0}}, +/* 51810 */ {(12<<2)|2,{74,105,0}}, +/* 51811 */ {(12<<2)|2,{74,105,0}}, +/* 51812 */ {(12<<2)|2,{74,105,0}}, +/* 51813 */ {(12<<2)|2,{74,105,0}}, +/* 51814 */ {(12<<2)|2,{74,105,0}}, +/* 51815 */ {(12<<2)|2,{74,105,0}}, +/* 51816 */ {(12<<2)|2,{74,105,0}}, +/* 51817 */ {(12<<2)|2,{74,105,0}}, +/* 51818 */ {(12<<2)|2,{74,105,0}}, +/* 51819 */ {(12<<2)|2,{74,105,0}}, +/* 51820 */ {(12<<2)|2,{74,105,0}}, +/* 51821 */ {(12<<2)|2,{74,105,0}}, +/* 51822 */ {(12<<2)|2,{74,105,0}}, +/* 51823 */ {(12<<2)|2,{74,105,0}}, +/* 51824 */ {(12<<2)|2,{74,111,0}}, +/* 51825 */ {(12<<2)|2,{74,111,0}}, +/* 51826 */ {(12<<2)|2,{74,111,0}}, +/* 51827 */ {(12<<2)|2,{74,111,0}}, +/* 51828 */ {(12<<2)|2,{74,111,0}}, +/* 51829 */ {(12<<2)|2,{74,111,0}}, +/* 51830 */ {(12<<2)|2,{74,111,0}}, +/* 51831 */ {(12<<2)|2,{74,111,0}}, +/* 51832 */ {(12<<2)|2,{74,111,0}}, +/* 51833 */ {(12<<2)|2,{74,111,0}}, +/* 51834 */ {(12<<2)|2,{74,111,0}}, +/* 51835 */ {(12<<2)|2,{74,111,0}}, +/* 51836 */ {(12<<2)|2,{74,111,0}}, +/* 51837 */ {(12<<2)|2,{74,111,0}}, +/* 51838 */ {(12<<2)|2,{74,111,0}}, +/* 51839 */ {(12<<2)|2,{74,111,0}}, +/* 51840 */ {(12<<2)|2,{74,115,0}}, +/* 51841 */ {(12<<2)|2,{74,115,0}}, +/* 51842 */ {(12<<2)|2,{74,115,0}}, +/* 51843 */ {(12<<2)|2,{74,115,0}}, +/* 51844 */ {(12<<2)|2,{74,115,0}}, +/* 51845 */ {(12<<2)|2,{74,115,0}}, +/* 51846 */ {(12<<2)|2,{74,115,0}}, +/* 51847 */ {(12<<2)|2,{74,115,0}}, +/* 51848 */ {(12<<2)|2,{74,115,0}}, +/* 51849 */ {(12<<2)|2,{74,115,0}}, +/* 51850 */ {(12<<2)|2,{74,115,0}}, +/* 51851 */ {(12<<2)|2,{74,115,0}}, +/* 51852 */ {(12<<2)|2,{74,115,0}}, +/* 51853 */ {(12<<2)|2,{74,115,0}}, +/* 51854 */ {(12<<2)|2,{74,115,0}}, +/* 51855 */ {(12<<2)|2,{74,115,0}}, +/* 51856 */ {(12<<2)|2,{74,116,0}}, +/* 51857 */ {(12<<2)|2,{74,116,0}}, +/* 51858 */ {(12<<2)|2,{74,116,0}}, +/* 51859 */ {(12<<2)|2,{74,116,0}}, +/* 51860 */ {(12<<2)|2,{74,116,0}}, +/* 51861 */ {(12<<2)|2,{74,116,0}}, +/* 51862 */ {(12<<2)|2,{74,116,0}}, +/* 51863 */ {(12<<2)|2,{74,116,0}}, +/* 51864 */ {(12<<2)|2,{74,116,0}}, +/* 51865 */ {(12<<2)|2,{74,116,0}}, +/* 51866 */ {(12<<2)|2,{74,116,0}}, +/* 51867 */ {(12<<2)|2,{74,116,0}}, +/* 51868 */ {(12<<2)|2,{74,116,0}}, +/* 51869 */ {(12<<2)|2,{74,116,0}}, +/* 51870 */ {(12<<2)|2,{74,116,0}}, +/* 51871 */ {(12<<2)|2,{74,116,0}}, +/* 51872 */ {(13<<2)|2,{74,32,0}}, +/* 51873 */ {(13<<2)|2,{74,32,0}}, +/* 51874 */ {(13<<2)|2,{74,32,0}}, +/* 51875 */ {(13<<2)|2,{74,32,0}}, +/* 51876 */ {(13<<2)|2,{74,32,0}}, +/* 51877 */ {(13<<2)|2,{74,32,0}}, +/* 51878 */ {(13<<2)|2,{74,32,0}}, +/* 51879 */ {(13<<2)|2,{74,32,0}}, +/* 51880 */ {(13<<2)|2,{74,37,0}}, +/* 51881 */ {(13<<2)|2,{74,37,0}}, +/* 51882 */ {(13<<2)|2,{74,37,0}}, +/* 51883 */ {(13<<2)|2,{74,37,0}}, +/* 51884 */ {(13<<2)|2,{74,37,0}}, +/* 51885 */ {(13<<2)|2,{74,37,0}}, +/* 51886 */ {(13<<2)|2,{74,37,0}}, +/* 51887 */ {(13<<2)|2,{74,37,0}}, +/* 51888 */ {(13<<2)|2,{74,45,0}}, +/* 51889 */ {(13<<2)|2,{74,45,0}}, +/* 51890 */ {(13<<2)|2,{74,45,0}}, +/* 51891 */ {(13<<2)|2,{74,45,0}}, +/* 51892 */ {(13<<2)|2,{74,45,0}}, +/* 51893 */ {(13<<2)|2,{74,45,0}}, +/* 51894 */ {(13<<2)|2,{74,45,0}}, +/* 51895 */ {(13<<2)|2,{74,45,0}}, +/* 51896 */ {(13<<2)|2,{74,46,0}}, +/* 51897 */ {(13<<2)|2,{74,46,0}}, +/* 51898 */ {(13<<2)|2,{74,46,0}}, +/* 51899 */ {(13<<2)|2,{74,46,0}}, +/* 51900 */ {(13<<2)|2,{74,46,0}}, +/* 51901 */ {(13<<2)|2,{74,46,0}}, +/* 51902 */ {(13<<2)|2,{74,46,0}}, +/* 51903 */ {(13<<2)|2,{74,46,0}}, +/* 51904 */ {(13<<2)|2,{74,47,0}}, +/* 51905 */ {(13<<2)|2,{74,47,0}}, +/* 51906 */ {(13<<2)|2,{74,47,0}}, +/* 51907 */ {(13<<2)|2,{74,47,0}}, +/* 51908 */ {(13<<2)|2,{74,47,0}}, +/* 51909 */ {(13<<2)|2,{74,47,0}}, +/* 51910 */ {(13<<2)|2,{74,47,0}}, +/* 51911 */ {(13<<2)|2,{74,47,0}}, +/* 51912 */ {(13<<2)|2,{74,51,0}}, +/* 51913 */ {(13<<2)|2,{74,51,0}}, +/* 51914 */ {(13<<2)|2,{74,51,0}}, +/* 51915 */ {(13<<2)|2,{74,51,0}}, +/* 51916 */ {(13<<2)|2,{74,51,0}}, +/* 51917 */ {(13<<2)|2,{74,51,0}}, +/* 51918 */ {(13<<2)|2,{74,51,0}}, +/* 51919 */ {(13<<2)|2,{74,51,0}}, +/* 51920 */ {(13<<2)|2,{74,52,0}}, +/* 51921 */ {(13<<2)|2,{74,52,0}}, +/* 51922 */ {(13<<2)|2,{74,52,0}}, +/* 51923 */ {(13<<2)|2,{74,52,0}}, +/* 51924 */ {(13<<2)|2,{74,52,0}}, +/* 51925 */ {(13<<2)|2,{74,52,0}}, +/* 51926 */ {(13<<2)|2,{74,52,0}}, +/* 51927 */ {(13<<2)|2,{74,52,0}}, +/* 51928 */ {(13<<2)|2,{74,53,0}}, +/* 51929 */ {(13<<2)|2,{74,53,0}}, +/* 51930 */ {(13<<2)|2,{74,53,0}}, +/* 51931 */ {(13<<2)|2,{74,53,0}}, +/* 51932 */ {(13<<2)|2,{74,53,0}}, +/* 51933 */ {(13<<2)|2,{74,53,0}}, +/* 51934 */ {(13<<2)|2,{74,53,0}}, +/* 51935 */ {(13<<2)|2,{74,53,0}}, +/* 51936 */ {(13<<2)|2,{74,54,0}}, +/* 51937 */ {(13<<2)|2,{74,54,0}}, +/* 51938 */ {(13<<2)|2,{74,54,0}}, +/* 51939 */ {(13<<2)|2,{74,54,0}}, +/* 51940 */ {(13<<2)|2,{74,54,0}}, +/* 51941 */ {(13<<2)|2,{74,54,0}}, +/* 51942 */ {(13<<2)|2,{74,54,0}}, +/* 51943 */ {(13<<2)|2,{74,54,0}}, +/* 51944 */ {(13<<2)|2,{74,55,0}}, +/* 51945 */ {(13<<2)|2,{74,55,0}}, +/* 51946 */ {(13<<2)|2,{74,55,0}}, +/* 51947 */ {(13<<2)|2,{74,55,0}}, +/* 51948 */ {(13<<2)|2,{74,55,0}}, +/* 51949 */ {(13<<2)|2,{74,55,0}}, +/* 51950 */ {(13<<2)|2,{74,55,0}}, +/* 51951 */ {(13<<2)|2,{74,55,0}}, +/* 51952 */ {(13<<2)|2,{74,56,0}}, +/* 51953 */ {(13<<2)|2,{74,56,0}}, +/* 51954 */ {(13<<2)|2,{74,56,0}}, +/* 51955 */ {(13<<2)|2,{74,56,0}}, +/* 51956 */ {(13<<2)|2,{74,56,0}}, +/* 51957 */ {(13<<2)|2,{74,56,0}}, +/* 51958 */ {(13<<2)|2,{74,56,0}}, +/* 51959 */ {(13<<2)|2,{74,56,0}}, +/* 51960 */ {(13<<2)|2,{74,57,0}}, +/* 51961 */ {(13<<2)|2,{74,57,0}}, +/* 51962 */ {(13<<2)|2,{74,57,0}}, +/* 51963 */ {(13<<2)|2,{74,57,0}}, +/* 51964 */ {(13<<2)|2,{74,57,0}}, +/* 51965 */ {(13<<2)|2,{74,57,0}}, +/* 51966 */ {(13<<2)|2,{74,57,0}}, +/* 51967 */ {(13<<2)|2,{74,57,0}}, +/* 51968 */ {(13<<2)|2,{74,61,0}}, +/* 51969 */ {(13<<2)|2,{74,61,0}}, +/* 51970 */ {(13<<2)|2,{74,61,0}}, +/* 51971 */ {(13<<2)|2,{74,61,0}}, +/* 51972 */ {(13<<2)|2,{74,61,0}}, +/* 51973 */ {(13<<2)|2,{74,61,0}}, +/* 51974 */ {(13<<2)|2,{74,61,0}}, +/* 51975 */ {(13<<2)|2,{74,61,0}}, +/* 51976 */ {(13<<2)|2,{74,65,0}}, +/* 51977 */ {(13<<2)|2,{74,65,0}}, +/* 51978 */ {(13<<2)|2,{74,65,0}}, +/* 51979 */ {(13<<2)|2,{74,65,0}}, +/* 51980 */ {(13<<2)|2,{74,65,0}}, +/* 51981 */ {(13<<2)|2,{74,65,0}}, +/* 51982 */ {(13<<2)|2,{74,65,0}}, +/* 51983 */ {(13<<2)|2,{74,65,0}}, +/* 51984 */ {(13<<2)|2,{74,95,0}}, +/* 51985 */ {(13<<2)|2,{74,95,0}}, +/* 51986 */ {(13<<2)|2,{74,95,0}}, +/* 51987 */ {(13<<2)|2,{74,95,0}}, +/* 51988 */ {(13<<2)|2,{74,95,0}}, +/* 51989 */ {(13<<2)|2,{74,95,0}}, +/* 51990 */ {(13<<2)|2,{74,95,0}}, +/* 51991 */ {(13<<2)|2,{74,95,0}}, +/* 51992 */ {(13<<2)|2,{74,98,0}}, +/* 51993 */ {(13<<2)|2,{74,98,0}}, +/* 51994 */ {(13<<2)|2,{74,98,0}}, +/* 51995 */ {(13<<2)|2,{74,98,0}}, +/* 51996 */ {(13<<2)|2,{74,98,0}}, +/* 51997 */ {(13<<2)|2,{74,98,0}}, +/* 51998 */ {(13<<2)|2,{74,98,0}}, +/* 51999 */ {(13<<2)|2,{74,98,0}}, +/* 52000 */ {(13<<2)|2,{74,100,0}}, +/* 52001 */ {(13<<2)|2,{74,100,0}}, +/* 52002 */ {(13<<2)|2,{74,100,0}}, +/* 52003 */ {(13<<2)|2,{74,100,0}}, +/* 52004 */ {(13<<2)|2,{74,100,0}}, +/* 52005 */ {(13<<2)|2,{74,100,0}}, +/* 52006 */ {(13<<2)|2,{74,100,0}}, +/* 52007 */ {(13<<2)|2,{74,100,0}}, +/* 52008 */ {(13<<2)|2,{74,102,0}}, +/* 52009 */ {(13<<2)|2,{74,102,0}}, +/* 52010 */ {(13<<2)|2,{74,102,0}}, +/* 52011 */ {(13<<2)|2,{74,102,0}}, +/* 52012 */ {(13<<2)|2,{74,102,0}}, +/* 52013 */ {(13<<2)|2,{74,102,0}}, +/* 52014 */ {(13<<2)|2,{74,102,0}}, +/* 52015 */ {(13<<2)|2,{74,102,0}}, +/* 52016 */ {(13<<2)|2,{74,103,0}}, +/* 52017 */ {(13<<2)|2,{74,103,0}}, +/* 52018 */ {(13<<2)|2,{74,103,0}}, +/* 52019 */ {(13<<2)|2,{74,103,0}}, +/* 52020 */ {(13<<2)|2,{74,103,0}}, +/* 52021 */ {(13<<2)|2,{74,103,0}}, +/* 52022 */ {(13<<2)|2,{74,103,0}}, +/* 52023 */ {(13<<2)|2,{74,103,0}}, +/* 52024 */ {(13<<2)|2,{74,104,0}}, +/* 52025 */ {(13<<2)|2,{74,104,0}}, +/* 52026 */ {(13<<2)|2,{74,104,0}}, +/* 52027 */ {(13<<2)|2,{74,104,0}}, +/* 52028 */ {(13<<2)|2,{74,104,0}}, +/* 52029 */ {(13<<2)|2,{74,104,0}}, +/* 52030 */ {(13<<2)|2,{74,104,0}}, +/* 52031 */ {(13<<2)|2,{74,104,0}}, +/* 52032 */ {(13<<2)|2,{74,108,0}}, +/* 52033 */ {(13<<2)|2,{74,108,0}}, +/* 52034 */ {(13<<2)|2,{74,108,0}}, +/* 52035 */ {(13<<2)|2,{74,108,0}}, +/* 52036 */ {(13<<2)|2,{74,108,0}}, +/* 52037 */ {(13<<2)|2,{74,108,0}}, +/* 52038 */ {(13<<2)|2,{74,108,0}}, +/* 52039 */ {(13<<2)|2,{74,108,0}}, +/* 52040 */ {(13<<2)|2,{74,109,0}}, +/* 52041 */ {(13<<2)|2,{74,109,0}}, +/* 52042 */ {(13<<2)|2,{74,109,0}}, +/* 52043 */ {(13<<2)|2,{74,109,0}}, +/* 52044 */ {(13<<2)|2,{74,109,0}}, +/* 52045 */ {(13<<2)|2,{74,109,0}}, +/* 52046 */ {(13<<2)|2,{74,109,0}}, +/* 52047 */ {(13<<2)|2,{74,109,0}}, +/* 52048 */ {(13<<2)|2,{74,110,0}}, +/* 52049 */ {(13<<2)|2,{74,110,0}}, +/* 52050 */ {(13<<2)|2,{74,110,0}}, +/* 52051 */ {(13<<2)|2,{74,110,0}}, +/* 52052 */ {(13<<2)|2,{74,110,0}}, +/* 52053 */ {(13<<2)|2,{74,110,0}}, +/* 52054 */ {(13<<2)|2,{74,110,0}}, +/* 52055 */ {(13<<2)|2,{74,110,0}}, +/* 52056 */ {(13<<2)|2,{74,112,0}}, +/* 52057 */ {(13<<2)|2,{74,112,0}}, +/* 52058 */ {(13<<2)|2,{74,112,0}}, +/* 52059 */ {(13<<2)|2,{74,112,0}}, +/* 52060 */ {(13<<2)|2,{74,112,0}}, +/* 52061 */ {(13<<2)|2,{74,112,0}}, +/* 52062 */ {(13<<2)|2,{74,112,0}}, +/* 52063 */ {(13<<2)|2,{74,112,0}}, +/* 52064 */ {(13<<2)|2,{74,114,0}}, +/* 52065 */ {(13<<2)|2,{74,114,0}}, +/* 52066 */ {(13<<2)|2,{74,114,0}}, +/* 52067 */ {(13<<2)|2,{74,114,0}}, +/* 52068 */ {(13<<2)|2,{74,114,0}}, +/* 52069 */ {(13<<2)|2,{74,114,0}}, +/* 52070 */ {(13<<2)|2,{74,114,0}}, +/* 52071 */ {(13<<2)|2,{74,114,0}}, +/* 52072 */ {(13<<2)|2,{74,117,0}}, +/* 52073 */ {(13<<2)|2,{74,117,0}}, +/* 52074 */ {(13<<2)|2,{74,117,0}}, +/* 52075 */ {(13<<2)|2,{74,117,0}}, +/* 52076 */ {(13<<2)|2,{74,117,0}}, +/* 52077 */ {(13<<2)|2,{74,117,0}}, +/* 52078 */ {(13<<2)|2,{74,117,0}}, +/* 52079 */ {(13<<2)|2,{74,117,0}}, +/* 52080 */ {(14<<2)|2,{74,58,0}}, +/* 52081 */ {(14<<2)|2,{74,58,0}}, +/* 52082 */ {(14<<2)|2,{74,58,0}}, +/* 52083 */ {(14<<2)|2,{74,58,0}}, +/* 52084 */ {(14<<2)|2,{74,66,0}}, +/* 52085 */ {(14<<2)|2,{74,66,0}}, +/* 52086 */ {(14<<2)|2,{74,66,0}}, +/* 52087 */ {(14<<2)|2,{74,66,0}}, +/* 52088 */ {(14<<2)|2,{74,67,0}}, +/* 52089 */ {(14<<2)|2,{74,67,0}}, +/* 52090 */ {(14<<2)|2,{74,67,0}}, +/* 52091 */ {(14<<2)|2,{74,67,0}}, +/* 52092 */ {(14<<2)|2,{74,68,0}}, +/* 52093 */ {(14<<2)|2,{74,68,0}}, +/* 52094 */ {(14<<2)|2,{74,68,0}}, +/* 52095 */ {(14<<2)|2,{74,68,0}}, +/* 52096 */ {(14<<2)|2,{74,69,0}}, +/* 52097 */ {(14<<2)|2,{74,69,0}}, +/* 52098 */ {(14<<2)|2,{74,69,0}}, +/* 52099 */ {(14<<2)|2,{74,69,0}}, +/* 52100 */ {(14<<2)|2,{74,70,0}}, +/* 52101 */ {(14<<2)|2,{74,70,0}}, +/* 52102 */ {(14<<2)|2,{74,70,0}}, +/* 52103 */ {(14<<2)|2,{74,70,0}}, +/* 52104 */ {(14<<2)|2,{74,71,0}}, +/* 52105 */ {(14<<2)|2,{74,71,0}}, +/* 52106 */ {(14<<2)|2,{74,71,0}}, +/* 52107 */ {(14<<2)|2,{74,71,0}}, +/* 52108 */ {(14<<2)|2,{74,72,0}}, +/* 52109 */ {(14<<2)|2,{74,72,0}}, +/* 52110 */ {(14<<2)|2,{74,72,0}}, +/* 52111 */ {(14<<2)|2,{74,72,0}}, +/* 52112 */ {(14<<2)|2,{74,73,0}}, +/* 52113 */ {(14<<2)|2,{74,73,0}}, +/* 52114 */ {(14<<2)|2,{74,73,0}}, +/* 52115 */ {(14<<2)|2,{74,73,0}}, +/* 52116 */ {(14<<2)|2,{74,74,0}}, +/* 52117 */ {(14<<2)|2,{74,74,0}}, +/* 52118 */ {(14<<2)|2,{74,74,0}}, +/* 52119 */ {(14<<2)|2,{74,74,0}}, +/* 52120 */ {(14<<2)|2,{74,75,0}}, +/* 52121 */ {(14<<2)|2,{74,75,0}}, +/* 52122 */ {(14<<2)|2,{74,75,0}}, +/* 52123 */ {(14<<2)|2,{74,75,0}}, +/* 52124 */ {(14<<2)|2,{74,76,0}}, +/* 52125 */ {(14<<2)|2,{74,76,0}}, +/* 52126 */ {(14<<2)|2,{74,76,0}}, +/* 52127 */ {(14<<2)|2,{74,76,0}}, +/* 52128 */ {(14<<2)|2,{74,77,0}}, +/* 52129 */ {(14<<2)|2,{74,77,0}}, +/* 52130 */ {(14<<2)|2,{74,77,0}}, +/* 52131 */ {(14<<2)|2,{74,77,0}}, +/* 52132 */ {(14<<2)|2,{74,78,0}}, +/* 52133 */ {(14<<2)|2,{74,78,0}}, +/* 52134 */ {(14<<2)|2,{74,78,0}}, +/* 52135 */ {(14<<2)|2,{74,78,0}}, +/* 52136 */ {(14<<2)|2,{74,79,0}}, +/* 52137 */ {(14<<2)|2,{74,79,0}}, +/* 52138 */ {(14<<2)|2,{74,79,0}}, +/* 52139 */ {(14<<2)|2,{74,79,0}}, +/* 52140 */ {(14<<2)|2,{74,80,0}}, +/* 52141 */ {(14<<2)|2,{74,80,0}}, +/* 52142 */ {(14<<2)|2,{74,80,0}}, +/* 52143 */ {(14<<2)|2,{74,80,0}}, +/* 52144 */ {(14<<2)|2,{74,81,0}}, +/* 52145 */ {(14<<2)|2,{74,81,0}}, +/* 52146 */ {(14<<2)|2,{74,81,0}}, +/* 52147 */ {(14<<2)|2,{74,81,0}}, +/* 52148 */ {(14<<2)|2,{74,82,0}}, +/* 52149 */ {(14<<2)|2,{74,82,0}}, +/* 52150 */ {(14<<2)|2,{74,82,0}}, +/* 52151 */ {(14<<2)|2,{74,82,0}}, +/* 52152 */ {(14<<2)|2,{74,83,0}}, +/* 52153 */ {(14<<2)|2,{74,83,0}}, +/* 52154 */ {(14<<2)|2,{74,83,0}}, +/* 52155 */ {(14<<2)|2,{74,83,0}}, +/* 52156 */ {(14<<2)|2,{74,84,0}}, +/* 52157 */ {(14<<2)|2,{74,84,0}}, +/* 52158 */ {(14<<2)|2,{74,84,0}}, +/* 52159 */ {(14<<2)|2,{74,84,0}}, +/* 52160 */ {(14<<2)|2,{74,85,0}}, +/* 52161 */ {(14<<2)|2,{74,85,0}}, +/* 52162 */ {(14<<2)|2,{74,85,0}}, +/* 52163 */ {(14<<2)|2,{74,85,0}}, +/* 52164 */ {(14<<2)|2,{74,86,0}}, +/* 52165 */ {(14<<2)|2,{74,86,0}}, +/* 52166 */ {(14<<2)|2,{74,86,0}}, +/* 52167 */ {(14<<2)|2,{74,86,0}}, +/* 52168 */ {(14<<2)|2,{74,87,0}}, +/* 52169 */ {(14<<2)|2,{74,87,0}}, +/* 52170 */ {(14<<2)|2,{74,87,0}}, +/* 52171 */ {(14<<2)|2,{74,87,0}}, +/* 52172 */ {(14<<2)|2,{74,89,0}}, +/* 52173 */ {(14<<2)|2,{74,89,0}}, +/* 52174 */ {(14<<2)|2,{74,89,0}}, +/* 52175 */ {(14<<2)|2,{74,89,0}}, +/* 52176 */ {(14<<2)|2,{74,106,0}}, +/* 52177 */ {(14<<2)|2,{74,106,0}}, +/* 52178 */ {(14<<2)|2,{74,106,0}}, +/* 52179 */ {(14<<2)|2,{74,106,0}}, +/* 52180 */ {(14<<2)|2,{74,107,0}}, +/* 52181 */ {(14<<2)|2,{74,107,0}}, +/* 52182 */ {(14<<2)|2,{74,107,0}}, +/* 52183 */ {(14<<2)|2,{74,107,0}}, +/* 52184 */ {(14<<2)|2,{74,113,0}}, +/* 52185 */ {(14<<2)|2,{74,113,0}}, +/* 52186 */ {(14<<2)|2,{74,113,0}}, +/* 52187 */ {(14<<2)|2,{74,113,0}}, +/* 52188 */ {(14<<2)|2,{74,118,0}}, +/* 52189 */ {(14<<2)|2,{74,118,0}}, +/* 52190 */ {(14<<2)|2,{74,118,0}}, +/* 52191 */ {(14<<2)|2,{74,118,0}}, +/* 52192 */ {(14<<2)|2,{74,119,0}}, +/* 52193 */ {(14<<2)|2,{74,119,0}}, +/* 52194 */ {(14<<2)|2,{74,119,0}}, +/* 52195 */ {(14<<2)|2,{74,119,0}}, +/* 52196 */ {(14<<2)|2,{74,120,0}}, +/* 52197 */ {(14<<2)|2,{74,120,0}}, +/* 52198 */ {(14<<2)|2,{74,120,0}}, +/* 52199 */ {(14<<2)|2,{74,120,0}}, +/* 52200 */ {(14<<2)|2,{74,121,0}}, +/* 52201 */ {(14<<2)|2,{74,121,0}}, +/* 52202 */ {(14<<2)|2,{74,121,0}}, +/* 52203 */ {(14<<2)|2,{74,121,0}}, +/* 52204 */ {(14<<2)|2,{74,122,0}}, +/* 52205 */ {(14<<2)|2,{74,122,0}}, +/* 52206 */ {(14<<2)|2,{74,122,0}}, +/* 52207 */ {(14<<2)|2,{74,122,0}}, +/* 52208 */ {(15<<2)|2,{74,38,0}}, +/* 52209 */ {(15<<2)|2,{74,38,0}}, +/* 52210 */ {(15<<2)|2,{74,42,0}}, +/* 52211 */ {(15<<2)|2,{74,42,0}}, +/* 52212 */ {(15<<2)|2,{74,44,0}}, +/* 52213 */ {(15<<2)|2,{74,44,0}}, +/* 52214 */ {(15<<2)|2,{74,59,0}}, +/* 52215 */ {(15<<2)|2,{74,59,0}}, +/* 52216 */ {(15<<2)|2,{74,88,0}}, +/* 52217 */ {(15<<2)|2,{74,88,0}}, +/* 52218 */ {(15<<2)|2,{74,90,0}}, +/* 52219 */ {(15<<2)|2,{74,90,0}}, +/* 52220 */ {(7<<2)|1,{74,0,0}}, +/* 52221 */ {(7<<2)|1,{74,0,0}}, +/* 52222 */ {(7<<2)|1,{74,0,0}}, +/* 52223 */ {(7<<2)|1,{74,0,0}}, +/* 52224 */ {(12<<2)|2,{75,48,0}}, +/* 52225 */ {(12<<2)|2,{75,48,0}}, +/* 52226 */ {(12<<2)|2,{75,48,0}}, +/* 52227 */ {(12<<2)|2,{75,48,0}}, +/* 52228 */ {(12<<2)|2,{75,48,0}}, +/* 52229 */ {(12<<2)|2,{75,48,0}}, +/* 52230 */ {(12<<2)|2,{75,48,0}}, +/* 52231 */ {(12<<2)|2,{75,48,0}}, +/* 52232 */ {(12<<2)|2,{75,48,0}}, +/* 52233 */ {(12<<2)|2,{75,48,0}}, +/* 52234 */ {(12<<2)|2,{75,48,0}}, +/* 52235 */ {(12<<2)|2,{75,48,0}}, +/* 52236 */ {(12<<2)|2,{75,48,0}}, +/* 52237 */ {(12<<2)|2,{75,48,0}}, +/* 52238 */ {(12<<2)|2,{75,48,0}}, +/* 52239 */ {(12<<2)|2,{75,48,0}}, +/* 52240 */ {(12<<2)|2,{75,49,0}}, +/* 52241 */ {(12<<2)|2,{75,49,0}}, +/* 52242 */ {(12<<2)|2,{75,49,0}}, +/* 52243 */ {(12<<2)|2,{75,49,0}}, +/* 52244 */ {(12<<2)|2,{75,49,0}}, +/* 52245 */ {(12<<2)|2,{75,49,0}}, +/* 52246 */ {(12<<2)|2,{75,49,0}}, +/* 52247 */ {(12<<2)|2,{75,49,0}}, +/* 52248 */ {(12<<2)|2,{75,49,0}}, +/* 52249 */ {(12<<2)|2,{75,49,0}}, +/* 52250 */ {(12<<2)|2,{75,49,0}}, +/* 52251 */ {(12<<2)|2,{75,49,0}}, +/* 52252 */ {(12<<2)|2,{75,49,0}}, +/* 52253 */ {(12<<2)|2,{75,49,0}}, +/* 52254 */ {(12<<2)|2,{75,49,0}}, +/* 52255 */ {(12<<2)|2,{75,49,0}}, +/* 52256 */ {(12<<2)|2,{75,50,0}}, +/* 52257 */ {(12<<2)|2,{75,50,0}}, +/* 52258 */ {(12<<2)|2,{75,50,0}}, +/* 52259 */ {(12<<2)|2,{75,50,0}}, +/* 52260 */ {(12<<2)|2,{75,50,0}}, +/* 52261 */ {(12<<2)|2,{75,50,0}}, +/* 52262 */ {(12<<2)|2,{75,50,0}}, +/* 52263 */ {(12<<2)|2,{75,50,0}}, +/* 52264 */ {(12<<2)|2,{75,50,0}}, +/* 52265 */ {(12<<2)|2,{75,50,0}}, +/* 52266 */ {(12<<2)|2,{75,50,0}}, +/* 52267 */ {(12<<2)|2,{75,50,0}}, +/* 52268 */ {(12<<2)|2,{75,50,0}}, +/* 52269 */ {(12<<2)|2,{75,50,0}}, +/* 52270 */ {(12<<2)|2,{75,50,0}}, +/* 52271 */ {(12<<2)|2,{75,50,0}}, +/* 52272 */ {(12<<2)|2,{75,97,0}}, +/* 52273 */ {(12<<2)|2,{75,97,0}}, +/* 52274 */ {(12<<2)|2,{75,97,0}}, +/* 52275 */ {(12<<2)|2,{75,97,0}}, +/* 52276 */ {(12<<2)|2,{75,97,0}}, +/* 52277 */ {(12<<2)|2,{75,97,0}}, +/* 52278 */ {(12<<2)|2,{75,97,0}}, +/* 52279 */ {(12<<2)|2,{75,97,0}}, +/* 52280 */ {(12<<2)|2,{75,97,0}}, +/* 52281 */ {(12<<2)|2,{75,97,0}}, +/* 52282 */ {(12<<2)|2,{75,97,0}}, +/* 52283 */ {(12<<2)|2,{75,97,0}}, +/* 52284 */ {(12<<2)|2,{75,97,0}}, +/* 52285 */ {(12<<2)|2,{75,97,0}}, +/* 52286 */ {(12<<2)|2,{75,97,0}}, +/* 52287 */ {(12<<2)|2,{75,97,0}}, +/* 52288 */ {(12<<2)|2,{75,99,0}}, +/* 52289 */ {(12<<2)|2,{75,99,0}}, +/* 52290 */ {(12<<2)|2,{75,99,0}}, +/* 52291 */ {(12<<2)|2,{75,99,0}}, +/* 52292 */ {(12<<2)|2,{75,99,0}}, +/* 52293 */ {(12<<2)|2,{75,99,0}}, +/* 52294 */ {(12<<2)|2,{75,99,0}}, +/* 52295 */ {(12<<2)|2,{75,99,0}}, +/* 52296 */ {(12<<2)|2,{75,99,0}}, +/* 52297 */ {(12<<2)|2,{75,99,0}}, +/* 52298 */ {(12<<2)|2,{75,99,0}}, +/* 52299 */ {(12<<2)|2,{75,99,0}}, +/* 52300 */ {(12<<2)|2,{75,99,0}}, +/* 52301 */ {(12<<2)|2,{75,99,0}}, +/* 52302 */ {(12<<2)|2,{75,99,0}}, +/* 52303 */ {(12<<2)|2,{75,99,0}}, +/* 52304 */ {(12<<2)|2,{75,101,0}}, +/* 52305 */ {(12<<2)|2,{75,101,0}}, +/* 52306 */ {(12<<2)|2,{75,101,0}}, +/* 52307 */ {(12<<2)|2,{75,101,0}}, +/* 52308 */ {(12<<2)|2,{75,101,0}}, +/* 52309 */ {(12<<2)|2,{75,101,0}}, +/* 52310 */ {(12<<2)|2,{75,101,0}}, +/* 52311 */ {(12<<2)|2,{75,101,0}}, +/* 52312 */ {(12<<2)|2,{75,101,0}}, +/* 52313 */ {(12<<2)|2,{75,101,0}}, +/* 52314 */ {(12<<2)|2,{75,101,0}}, +/* 52315 */ {(12<<2)|2,{75,101,0}}, +/* 52316 */ {(12<<2)|2,{75,101,0}}, +/* 52317 */ {(12<<2)|2,{75,101,0}}, +/* 52318 */ {(12<<2)|2,{75,101,0}}, +/* 52319 */ {(12<<2)|2,{75,101,0}}, +/* 52320 */ {(12<<2)|2,{75,105,0}}, +/* 52321 */ {(12<<2)|2,{75,105,0}}, +/* 52322 */ {(12<<2)|2,{75,105,0}}, +/* 52323 */ {(12<<2)|2,{75,105,0}}, +/* 52324 */ {(12<<2)|2,{75,105,0}}, +/* 52325 */ {(12<<2)|2,{75,105,0}}, +/* 52326 */ {(12<<2)|2,{75,105,0}}, +/* 52327 */ {(12<<2)|2,{75,105,0}}, +/* 52328 */ {(12<<2)|2,{75,105,0}}, +/* 52329 */ {(12<<2)|2,{75,105,0}}, +/* 52330 */ {(12<<2)|2,{75,105,0}}, +/* 52331 */ {(12<<2)|2,{75,105,0}}, +/* 52332 */ {(12<<2)|2,{75,105,0}}, +/* 52333 */ {(12<<2)|2,{75,105,0}}, +/* 52334 */ {(12<<2)|2,{75,105,0}}, +/* 52335 */ {(12<<2)|2,{75,105,0}}, +/* 52336 */ {(12<<2)|2,{75,111,0}}, +/* 52337 */ {(12<<2)|2,{75,111,0}}, +/* 52338 */ {(12<<2)|2,{75,111,0}}, +/* 52339 */ {(12<<2)|2,{75,111,0}}, +/* 52340 */ {(12<<2)|2,{75,111,0}}, +/* 52341 */ {(12<<2)|2,{75,111,0}}, +/* 52342 */ {(12<<2)|2,{75,111,0}}, +/* 52343 */ {(12<<2)|2,{75,111,0}}, +/* 52344 */ {(12<<2)|2,{75,111,0}}, +/* 52345 */ {(12<<2)|2,{75,111,0}}, +/* 52346 */ {(12<<2)|2,{75,111,0}}, +/* 52347 */ {(12<<2)|2,{75,111,0}}, +/* 52348 */ {(12<<2)|2,{75,111,0}}, +/* 52349 */ {(12<<2)|2,{75,111,0}}, +/* 52350 */ {(12<<2)|2,{75,111,0}}, +/* 52351 */ {(12<<2)|2,{75,111,0}}, +/* 52352 */ {(12<<2)|2,{75,115,0}}, +/* 52353 */ {(12<<2)|2,{75,115,0}}, +/* 52354 */ {(12<<2)|2,{75,115,0}}, +/* 52355 */ {(12<<2)|2,{75,115,0}}, +/* 52356 */ {(12<<2)|2,{75,115,0}}, +/* 52357 */ {(12<<2)|2,{75,115,0}}, +/* 52358 */ {(12<<2)|2,{75,115,0}}, +/* 52359 */ {(12<<2)|2,{75,115,0}}, +/* 52360 */ {(12<<2)|2,{75,115,0}}, +/* 52361 */ {(12<<2)|2,{75,115,0}}, +/* 52362 */ {(12<<2)|2,{75,115,0}}, +/* 52363 */ {(12<<2)|2,{75,115,0}}, +/* 52364 */ {(12<<2)|2,{75,115,0}}, +/* 52365 */ {(12<<2)|2,{75,115,0}}, +/* 52366 */ {(12<<2)|2,{75,115,0}}, +/* 52367 */ {(12<<2)|2,{75,115,0}}, +/* 52368 */ {(12<<2)|2,{75,116,0}}, +/* 52369 */ {(12<<2)|2,{75,116,0}}, +/* 52370 */ {(12<<2)|2,{75,116,0}}, +/* 52371 */ {(12<<2)|2,{75,116,0}}, +/* 52372 */ {(12<<2)|2,{75,116,0}}, +/* 52373 */ {(12<<2)|2,{75,116,0}}, +/* 52374 */ {(12<<2)|2,{75,116,0}}, +/* 52375 */ {(12<<2)|2,{75,116,0}}, +/* 52376 */ {(12<<2)|2,{75,116,0}}, +/* 52377 */ {(12<<2)|2,{75,116,0}}, +/* 52378 */ {(12<<2)|2,{75,116,0}}, +/* 52379 */ {(12<<2)|2,{75,116,0}}, +/* 52380 */ {(12<<2)|2,{75,116,0}}, +/* 52381 */ {(12<<2)|2,{75,116,0}}, +/* 52382 */ {(12<<2)|2,{75,116,0}}, +/* 52383 */ {(12<<2)|2,{75,116,0}}, +/* 52384 */ {(13<<2)|2,{75,32,0}}, +/* 52385 */ {(13<<2)|2,{75,32,0}}, +/* 52386 */ {(13<<2)|2,{75,32,0}}, +/* 52387 */ {(13<<2)|2,{75,32,0}}, +/* 52388 */ {(13<<2)|2,{75,32,0}}, +/* 52389 */ {(13<<2)|2,{75,32,0}}, +/* 52390 */ {(13<<2)|2,{75,32,0}}, +/* 52391 */ {(13<<2)|2,{75,32,0}}, +/* 52392 */ {(13<<2)|2,{75,37,0}}, +/* 52393 */ {(13<<2)|2,{75,37,0}}, +/* 52394 */ {(13<<2)|2,{75,37,0}}, +/* 52395 */ {(13<<2)|2,{75,37,0}}, +/* 52396 */ {(13<<2)|2,{75,37,0}}, +/* 52397 */ {(13<<2)|2,{75,37,0}}, +/* 52398 */ {(13<<2)|2,{75,37,0}}, +/* 52399 */ {(13<<2)|2,{75,37,0}}, +/* 52400 */ {(13<<2)|2,{75,45,0}}, +/* 52401 */ {(13<<2)|2,{75,45,0}}, +/* 52402 */ {(13<<2)|2,{75,45,0}}, +/* 52403 */ {(13<<2)|2,{75,45,0}}, +/* 52404 */ {(13<<2)|2,{75,45,0}}, +/* 52405 */ {(13<<2)|2,{75,45,0}}, +/* 52406 */ {(13<<2)|2,{75,45,0}}, +/* 52407 */ {(13<<2)|2,{75,45,0}}, +/* 52408 */ {(13<<2)|2,{75,46,0}}, +/* 52409 */ {(13<<2)|2,{75,46,0}}, +/* 52410 */ {(13<<2)|2,{75,46,0}}, +/* 52411 */ {(13<<2)|2,{75,46,0}}, +/* 52412 */ {(13<<2)|2,{75,46,0}}, +/* 52413 */ {(13<<2)|2,{75,46,0}}, +/* 52414 */ {(13<<2)|2,{75,46,0}}, +/* 52415 */ {(13<<2)|2,{75,46,0}}, +/* 52416 */ {(13<<2)|2,{75,47,0}}, +/* 52417 */ {(13<<2)|2,{75,47,0}}, +/* 52418 */ {(13<<2)|2,{75,47,0}}, +/* 52419 */ {(13<<2)|2,{75,47,0}}, +/* 52420 */ {(13<<2)|2,{75,47,0}}, +/* 52421 */ {(13<<2)|2,{75,47,0}}, +/* 52422 */ {(13<<2)|2,{75,47,0}}, +/* 52423 */ {(13<<2)|2,{75,47,0}}, +/* 52424 */ {(13<<2)|2,{75,51,0}}, +/* 52425 */ {(13<<2)|2,{75,51,0}}, +/* 52426 */ {(13<<2)|2,{75,51,0}}, +/* 52427 */ {(13<<2)|2,{75,51,0}}, +/* 52428 */ {(13<<2)|2,{75,51,0}}, +/* 52429 */ {(13<<2)|2,{75,51,0}}, +/* 52430 */ {(13<<2)|2,{75,51,0}}, +/* 52431 */ {(13<<2)|2,{75,51,0}}, +/* 52432 */ {(13<<2)|2,{75,52,0}}, +/* 52433 */ {(13<<2)|2,{75,52,0}}, +/* 52434 */ {(13<<2)|2,{75,52,0}}, +/* 52435 */ {(13<<2)|2,{75,52,0}}, +/* 52436 */ {(13<<2)|2,{75,52,0}}, +/* 52437 */ {(13<<2)|2,{75,52,0}}, +/* 52438 */ {(13<<2)|2,{75,52,0}}, +/* 52439 */ {(13<<2)|2,{75,52,0}}, +/* 52440 */ {(13<<2)|2,{75,53,0}}, +/* 52441 */ {(13<<2)|2,{75,53,0}}, +/* 52442 */ {(13<<2)|2,{75,53,0}}, +/* 52443 */ {(13<<2)|2,{75,53,0}}, +/* 52444 */ {(13<<2)|2,{75,53,0}}, +/* 52445 */ {(13<<2)|2,{75,53,0}}, +/* 52446 */ {(13<<2)|2,{75,53,0}}, +/* 52447 */ {(13<<2)|2,{75,53,0}}, +/* 52448 */ {(13<<2)|2,{75,54,0}}, +/* 52449 */ {(13<<2)|2,{75,54,0}}, +/* 52450 */ {(13<<2)|2,{75,54,0}}, +/* 52451 */ {(13<<2)|2,{75,54,0}}, +/* 52452 */ {(13<<2)|2,{75,54,0}}, +/* 52453 */ {(13<<2)|2,{75,54,0}}, +/* 52454 */ {(13<<2)|2,{75,54,0}}, +/* 52455 */ {(13<<2)|2,{75,54,0}}, +/* 52456 */ {(13<<2)|2,{75,55,0}}, +/* 52457 */ {(13<<2)|2,{75,55,0}}, +/* 52458 */ {(13<<2)|2,{75,55,0}}, +/* 52459 */ {(13<<2)|2,{75,55,0}}, +/* 52460 */ {(13<<2)|2,{75,55,0}}, +/* 52461 */ {(13<<2)|2,{75,55,0}}, +/* 52462 */ {(13<<2)|2,{75,55,0}}, +/* 52463 */ {(13<<2)|2,{75,55,0}}, +/* 52464 */ {(13<<2)|2,{75,56,0}}, +/* 52465 */ {(13<<2)|2,{75,56,0}}, +/* 52466 */ {(13<<2)|2,{75,56,0}}, +/* 52467 */ {(13<<2)|2,{75,56,0}}, +/* 52468 */ {(13<<2)|2,{75,56,0}}, +/* 52469 */ {(13<<2)|2,{75,56,0}}, +/* 52470 */ {(13<<2)|2,{75,56,0}}, +/* 52471 */ {(13<<2)|2,{75,56,0}}, +/* 52472 */ {(13<<2)|2,{75,57,0}}, +/* 52473 */ {(13<<2)|2,{75,57,0}}, +/* 52474 */ {(13<<2)|2,{75,57,0}}, +/* 52475 */ {(13<<2)|2,{75,57,0}}, +/* 52476 */ {(13<<2)|2,{75,57,0}}, +/* 52477 */ {(13<<2)|2,{75,57,0}}, +/* 52478 */ {(13<<2)|2,{75,57,0}}, +/* 52479 */ {(13<<2)|2,{75,57,0}}, +/* 52480 */ {(13<<2)|2,{75,61,0}}, +/* 52481 */ {(13<<2)|2,{75,61,0}}, +/* 52482 */ {(13<<2)|2,{75,61,0}}, +/* 52483 */ {(13<<2)|2,{75,61,0}}, +/* 52484 */ {(13<<2)|2,{75,61,0}}, +/* 52485 */ {(13<<2)|2,{75,61,0}}, +/* 52486 */ {(13<<2)|2,{75,61,0}}, +/* 52487 */ {(13<<2)|2,{75,61,0}}, +/* 52488 */ {(13<<2)|2,{75,65,0}}, +/* 52489 */ {(13<<2)|2,{75,65,0}}, +/* 52490 */ {(13<<2)|2,{75,65,0}}, +/* 52491 */ {(13<<2)|2,{75,65,0}}, +/* 52492 */ {(13<<2)|2,{75,65,0}}, +/* 52493 */ {(13<<2)|2,{75,65,0}}, +/* 52494 */ {(13<<2)|2,{75,65,0}}, +/* 52495 */ {(13<<2)|2,{75,65,0}}, +/* 52496 */ {(13<<2)|2,{75,95,0}}, +/* 52497 */ {(13<<2)|2,{75,95,0}}, +/* 52498 */ {(13<<2)|2,{75,95,0}}, +/* 52499 */ {(13<<2)|2,{75,95,0}}, +/* 52500 */ {(13<<2)|2,{75,95,0}}, +/* 52501 */ {(13<<2)|2,{75,95,0}}, +/* 52502 */ {(13<<2)|2,{75,95,0}}, +/* 52503 */ {(13<<2)|2,{75,95,0}}, +/* 52504 */ {(13<<2)|2,{75,98,0}}, +/* 52505 */ {(13<<2)|2,{75,98,0}}, +/* 52506 */ {(13<<2)|2,{75,98,0}}, +/* 52507 */ {(13<<2)|2,{75,98,0}}, +/* 52508 */ {(13<<2)|2,{75,98,0}}, +/* 52509 */ {(13<<2)|2,{75,98,0}}, +/* 52510 */ {(13<<2)|2,{75,98,0}}, +/* 52511 */ {(13<<2)|2,{75,98,0}}, +/* 52512 */ {(13<<2)|2,{75,100,0}}, +/* 52513 */ {(13<<2)|2,{75,100,0}}, +/* 52514 */ {(13<<2)|2,{75,100,0}}, +/* 52515 */ {(13<<2)|2,{75,100,0}}, +/* 52516 */ {(13<<2)|2,{75,100,0}}, +/* 52517 */ {(13<<2)|2,{75,100,0}}, +/* 52518 */ {(13<<2)|2,{75,100,0}}, +/* 52519 */ {(13<<2)|2,{75,100,0}}, +/* 52520 */ {(13<<2)|2,{75,102,0}}, +/* 52521 */ {(13<<2)|2,{75,102,0}}, +/* 52522 */ {(13<<2)|2,{75,102,0}}, +/* 52523 */ {(13<<2)|2,{75,102,0}}, +/* 52524 */ {(13<<2)|2,{75,102,0}}, +/* 52525 */ {(13<<2)|2,{75,102,0}}, +/* 52526 */ {(13<<2)|2,{75,102,0}}, +/* 52527 */ {(13<<2)|2,{75,102,0}}, +/* 52528 */ {(13<<2)|2,{75,103,0}}, +/* 52529 */ {(13<<2)|2,{75,103,0}}, +/* 52530 */ {(13<<2)|2,{75,103,0}}, +/* 52531 */ {(13<<2)|2,{75,103,0}}, +/* 52532 */ {(13<<2)|2,{75,103,0}}, +/* 52533 */ {(13<<2)|2,{75,103,0}}, +/* 52534 */ {(13<<2)|2,{75,103,0}}, +/* 52535 */ {(13<<2)|2,{75,103,0}}, +/* 52536 */ {(13<<2)|2,{75,104,0}}, +/* 52537 */ {(13<<2)|2,{75,104,0}}, +/* 52538 */ {(13<<2)|2,{75,104,0}}, +/* 52539 */ {(13<<2)|2,{75,104,0}}, +/* 52540 */ {(13<<2)|2,{75,104,0}}, +/* 52541 */ {(13<<2)|2,{75,104,0}}, +/* 52542 */ {(13<<2)|2,{75,104,0}}, +/* 52543 */ {(13<<2)|2,{75,104,0}}, +/* 52544 */ {(13<<2)|2,{75,108,0}}, +/* 52545 */ {(13<<2)|2,{75,108,0}}, +/* 52546 */ {(13<<2)|2,{75,108,0}}, +/* 52547 */ {(13<<2)|2,{75,108,0}}, +/* 52548 */ {(13<<2)|2,{75,108,0}}, +/* 52549 */ {(13<<2)|2,{75,108,0}}, +/* 52550 */ {(13<<2)|2,{75,108,0}}, +/* 52551 */ {(13<<2)|2,{75,108,0}}, +/* 52552 */ {(13<<2)|2,{75,109,0}}, +/* 52553 */ {(13<<2)|2,{75,109,0}}, +/* 52554 */ {(13<<2)|2,{75,109,0}}, +/* 52555 */ {(13<<2)|2,{75,109,0}}, +/* 52556 */ {(13<<2)|2,{75,109,0}}, +/* 52557 */ {(13<<2)|2,{75,109,0}}, +/* 52558 */ {(13<<2)|2,{75,109,0}}, +/* 52559 */ {(13<<2)|2,{75,109,0}}, +/* 52560 */ {(13<<2)|2,{75,110,0}}, +/* 52561 */ {(13<<2)|2,{75,110,0}}, +/* 52562 */ {(13<<2)|2,{75,110,0}}, +/* 52563 */ {(13<<2)|2,{75,110,0}}, +/* 52564 */ {(13<<2)|2,{75,110,0}}, +/* 52565 */ {(13<<2)|2,{75,110,0}}, +/* 52566 */ {(13<<2)|2,{75,110,0}}, +/* 52567 */ {(13<<2)|2,{75,110,0}}, +/* 52568 */ {(13<<2)|2,{75,112,0}}, +/* 52569 */ {(13<<2)|2,{75,112,0}}, +/* 52570 */ {(13<<2)|2,{75,112,0}}, +/* 52571 */ {(13<<2)|2,{75,112,0}}, +/* 52572 */ {(13<<2)|2,{75,112,0}}, +/* 52573 */ {(13<<2)|2,{75,112,0}}, +/* 52574 */ {(13<<2)|2,{75,112,0}}, +/* 52575 */ {(13<<2)|2,{75,112,0}}, +/* 52576 */ {(13<<2)|2,{75,114,0}}, +/* 52577 */ {(13<<2)|2,{75,114,0}}, +/* 52578 */ {(13<<2)|2,{75,114,0}}, +/* 52579 */ {(13<<2)|2,{75,114,0}}, +/* 52580 */ {(13<<2)|2,{75,114,0}}, +/* 52581 */ {(13<<2)|2,{75,114,0}}, +/* 52582 */ {(13<<2)|2,{75,114,0}}, +/* 52583 */ {(13<<2)|2,{75,114,0}}, +/* 52584 */ {(13<<2)|2,{75,117,0}}, +/* 52585 */ {(13<<2)|2,{75,117,0}}, +/* 52586 */ {(13<<2)|2,{75,117,0}}, +/* 52587 */ {(13<<2)|2,{75,117,0}}, +/* 52588 */ {(13<<2)|2,{75,117,0}}, +/* 52589 */ {(13<<2)|2,{75,117,0}}, +/* 52590 */ {(13<<2)|2,{75,117,0}}, +/* 52591 */ {(13<<2)|2,{75,117,0}}, +/* 52592 */ {(14<<2)|2,{75,58,0}}, +/* 52593 */ {(14<<2)|2,{75,58,0}}, +/* 52594 */ {(14<<2)|2,{75,58,0}}, +/* 52595 */ {(14<<2)|2,{75,58,0}}, +/* 52596 */ {(14<<2)|2,{75,66,0}}, +/* 52597 */ {(14<<2)|2,{75,66,0}}, +/* 52598 */ {(14<<2)|2,{75,66,0}}, +/* 52599 */ {(14<<2)|2,{75,66,0}}, +/* 52600 */ {(14<<2)|2,{75,67,0}}, +/* 52601 */ {(14<<2)|2,{75,67,0}}, +/* 52602 */ {(14<<2)|2,{75,67,0}}, +/* 52603 */ {(14<<2)|2,{75,67,0}}, +/* 52604 */ {(14<<2)|2,{75,68,0}}, +/* 52605 */ {(14<<2)|2,{75,68,0}}, +/* 52606 */ {(14<<2)|2,{75,68,0}}, +/* 52607 */ {(14<<2)|2,{75,68,0}}, +/* 52608 */ {(14<<2)|2,{75,69,0}}, +/* 52609 */ {(14<<2)|2,{75,69,0}}, +/* 52610 */ {(14<<2)|2,{75,69,0}}, +/* 52611 */ {(14<<2)|2,{75,69,0}}, +/* 52612 */ {(14<<2)|2,{75,70,0}}, +/* 52613 */ {(14<<2)|2,{75,70,0}}, +/* 52614 */ {(14<<2)|2,{75,70,0}}, +/* 52615 */ {(14<<2)|2,{75,70,0}}, +/* 52616 */ {(14<<2)|2,{75,71,0}}, +/* 52617 */ {(14<<2)|2,{75,71,0}}, +/* 52618 */ {(14<<2)|2,{75,71,0}}, +/* 52619 */ {(14<<2)|2,{75,71,0}}, +/* 52620 */ {(14<<2)|2,{75,72,0}}, +/* 52621 */ {(14<<2)|2,{75,72,0}}, +/* 52622 */ {(14<<2)|2,{75,72,0}}, +/* 52623 */ {(14<<2)|2,{75,72,0}}, +/* 52624 */ {(14<<2)|2,{75,73,0}}, +/* 52625 */ {(14<<2)|2,{75,73,0}}, +/* 52626 */ {(14<<2)|2,{75,73,0}}, +/* 52627 */ {(14<<2)|2,{75,73,0}}, +/* 52628 */ {(14<<2)|2,{75,74,0}}, +/* 52629 */ {(14<<2)|2,{75,74,0}}, +/* 52630 */ {(14<<2)|2,{75,74,0}}, +/* 52631 */ {(14<<2)|2,{75,74,0}}, +/* 52632 */ {(14<<2)|2,{75,75,0}}, +/* 52633 */ {(14<<2)|2,{75,75,0}}, +/* 52634 */ {(14<<2)|2,{75,75,0}}, +/* 52635 */ {(14<<2)|2,{75,75,0}}, +/* 52636 */ {(14<<2)|2,{75,76,0}}, +/* 52637 */ {(14<<2)|2,{75,76,0}}, +/* 52638 */ {(14<<2)|2,{75,76,0}}, +/* 52639 */ {(14<<2)|2,{75,76,0}}, +/* 52640 */ {(14<<2)|2,{75,77,0}}, +/* 52641 */ {(14<<2)|2,{75,77,0}}, +/* 52642 */ {(14<<2)|2,{75,77,0}}, +/* 52643 */ {(14<<2)|2,{75,77,0}}, +/* 52644 */ {(14<<2)|2,{75,78,0}}, +/* 52645 */ {(14<<2)|2,{75,78,0}}, +/* 52646 */ {(14<<2)|2,{75,78,0}}, +/* 52647 */ {(14<<2)|2,{75,78,0}}, +/* 52648 */ {(14<<2)|2,{75,79,0}}, +/* 52649 */ {(14<<2)|2,{75,79,0}}, +/* 52650 */ {(14<<2)|2,{75,79,0}}, +/* 52651 */ {(14<<2)|2,{75,79,0}}, +/* 52652 */ {(14<<2)|2,{75,80,0}}, +/* 52653 */ {(14<<2)|2,{75,80,0}}, +/* 52654 */ {(14<<2)|2,{75,80,0}}, +/* 52655 */ {(14<<2)|2,{75,80,0}}, +/* 52656 */ {(14<<2)|2,{75,81,0}}, +/* 52657 */ {(14<<2)|2,{75,81,0}}, +/* 52658 */ {(14<<2)|2,{75,81,0}}, +/* 52659 */ {(14<<2)|2,{75,81,0}}, +/* 52660 */ {(14<<2)|2,{75,82,0}}, +/* 52661 */ {(14<<2)|2,{75,82,0}}, +/* 52662 */ {(14<<2)|2,{75,82,0}}, +/* 52663 */ {(14<<2)|2,{75,82,0}}, +/* 52664 */ {(14<<2)|2,{75,83,0}}, +/* 52665 */ {(14<<2)|2,{75,83,0}}, +/* 52666 */ {(14<<2)|2,{75,83,0}}, +/* 52667 */ {(14<<2)|2,{75,83,0}}, +/* 52668 */ {(14<<2)|2,{75,84,0}}, +/* 52669 */ {(14<<2)|2,{75,84,0}}, +/* 52670 */ {(14<<2)|2,{75,84,0}}, +/* 52671 */ {(14<<2)|2,{75,84,0}}, +/* 52672 */ {(14<<2)|2,{75,85,0}}, +/* 52673 */ {(14<<2)|2,{75,85,0}}, +/* 52674 */ {(14<<2)|2,{75,85,0}}, +/* 52675 */ {(14<<2)|2,{75,85,0}}, +/* 52676 */ {(14<<2)|2,{75,86,0}}, +/* 52677 */ {(14<<2)|2,{75,86,0}}, +/* 52678 */ {(14<<2)|2,{75,86,0}}, +/* 52679 */ {(14<<2)|2,{75,86,0}}, +/* 52680 */ {(14<<2)|2,{75,87,0}}, +/* 52681 */ {(14<<2)|2,{75,87,0}}, +/* 52682 */ {(14<<2)|2,{75,87,0}}, +/* 52683 */ {(14<<2)|2,{75,87,0}}, +/* 52684 */ {(14<<2)|2,{75,89,0}}, +/* 52685 */ {(14<<2)|2,{75,89,0}}, +/* 52686 */ {(14<<2)|2,{75,89,0}}, +/* 52687 */ {(14<<2)|2,{75,89,0}}, +/* 52688 */ {(14<<2)|2,{75,106,0}}, +/* 52689 */ {(14<<2)|2,{75,106,0}}, +/* 52690 */ {(14<<2)|2,{75,106,0}}, +/* 52691 */ {(14<<2)|2,{75,106,0}}, +/* 52692 */ {(14<<2)|2,{75,107,0}}, +/* 52693 */ {(14<<2)|2,{75,107,0}}, +/* 52694 */ {(14<<2)|2,{75,107,0}}, +/* 52695 */ {(14<<2)|2,{75,107,0}}, +/* 52696 */ {(14<<2)|2,{75,113,0}}, +/* 52697 */ {(14<<2)|2,{75,113,0}}, +/* 52698 */ {(14<<2)|2,{75,113,0}}, +/* 52699 */ {(14<<2)|2,{75,113,0}}, +/* 52700 */ {(14<<2)|2,{75,118,0}}, +/* 52701 */ {(14<<2)|2,{75,118,0}}, +/* 52702 */ {(14<<2)|2,{75,118,0}}, +/* 52703 */ {(14<<2)|2,{75,118,0}}, +/* 52704 */ {(14<<2)|2,{75,119,0}}, +/* 52705 */ {(14<<2)|2,{75,119,0}}, +/* 52706 */ {(14<<2)|2,{75,119,0}}, +/* 52707 */ {(14<<2)|2,{75,119,0}}, +/* 52708 */ {(14<<2)|2,{75,120,0}}, +/* 52709 */ {(14<<2)|2,{75,120,0}}, +/* 52710 */ {(14<<2)|2,{75,120,0}}, +/* 52711 */ {(14<<2)|2,{75,120,0}}, +/* 52712 */ {(14<<2)|2,{75,121,0}}, +/* 52713 */ {(14<<2)|2,{75,121,0}}, +/* 52714 */ {(14<<2)|2,{75,121,0}}, +/* 52715 */ {(14<<2)|2,{75,121,0}}, +/* 52716 */ {(14<<2)|2,{75,122,0}}, +/* 52717 */ {(14<<2)|2,{75,122,0}}, +/* 52718 */ {(14<<2)|2,{75,122,0}}, +/* 52719 */ {(14<<2)|2,{75,122,0}}, +/* 52720 */ {(15<<2)|2,{75,38,0}}, +/* 52721 */ {(15<<2)|2,{75,38,0}}, +/* 52722 */ {(15<<2)|2,{75,42,0}}, +/* 52723 */ {(15<<2)|2,{75,42,0}}, +/* 52724 */ {(15<<2)|2,{75,44,0}}, +/* 52725 */ {(15<<2)|2,{75,44,0}}, +/* 52726 */ {(15<<2)|2,{75,59,0}}, +/* 52727 */ {(15<<2)|2,{75,59,0}}, +/* 52728 */ {(15<<2)|2,{75,88,0}}, +/* 52729 */ {(15<<2)|2,{75,88,0}}, +/* 52730 */ {(15<<2)|2,{75,90,0}}, +/* 52731 */ {(15<<2)|2,{75,90,0}}, +/* 52732 */ {(7<<2)|1,{75,0,0}}, +/* 52733 */ {(7<<2)|1,{75,0,0}}, +/* 52734 */ {(7<<2)|1,{75,0,0}}, +/* 52735 */ {(7<<2)|1,{75,0,0}}, +/* 52736 */ {(12<<2)|2,{76,48,0}}, +/* 52737 */ {(12<<2)|2,{76,48,0}}, +/* 52738 */ {(12<<2)|2,{76,48,0}}, +/* 52739 */ {(12<<2)|2,{76,48,0}}, +/* 52740 */ {(12<<2)|2,{76,48,0}}, +/* 52741 */ {(12<<2)|2,{76,48,0}}, +/* 52742 */ {(12<<2)|2,{76,48,0}}, +/* 52743 */ {(12<<2)|2,{76,48,0}}, +/* 52744 */ {(12<<2)|2,{76,48,0}}, +/* 52745 */ {(12<<2)|2,{76,48,0}}, +/* 52746 */ {(12<<2)|2,{76,48,0}}, +/* 52747 */ {(12<<2)|2,{76,48,0}}, +/* 52748 */ {(12<<2)|2,{76,48,0}}, +/* 52749 */ {(12<<2)|2,{76,48,0}}, +/* 52750 */ {(12<<2)|2,{76,48,0}}, +/* 52751 */ {(12<<2)|2,{76,48,0}}, +/* 52752 */ {(12<<2)|2,{76,49,0}}, +/* 52753 */ {(12<<2)|2,{76,49,0}}, +/* 52754 */ {(12<<2)|2,{76,49,0}}, +/* 52755 */ {(12<<2)|2,{76,49,0}}, +/* 52756 */ {(12<<2)|2,{76,49,0}}, +/* 52757 */ {(12<<2)|2,{76,49,0}}, +/* 52758 */ {(12<<2)|2,{76,49,0}}, +/* 52759 */ {(12<<2)|2,{76,49,0}}, +/* 52760 */ {(12<<2)|2,{76,49,0}}, +/* 52761 */ {(12<<2)|2,{76,49,0}}, +/* 52762 */ {(12<<2)|2,{76,49,0}}, +/* 52763 */ {(12<<2)|2,{76,49,0}}, +/* 52764 */ {(12<<2)|2,{76,49,0}}, +/* 52765 */ {(12<<2)|2,{76,49,0}}, +/* 52766 */ {(12<<2)|2,{76,49,0}}, +/* 52767 */ {(12<<2)|2,{76,49,0}}, +/* 52768 */ {(12<<2)|2,{76,50,0}}, +/* 52769 */ {(12<<2)|2,{76,50,0}}, +/* 52770 */ {(12<<2)|2,{76,50,0}}, +/* 52771 */ {(12<<2)|2,{76,50,0}}, +/* 52772 */ {(12<<2)|2,{76,50,0}}, +/* 52773 */ {(12<<2)|2,{76,50,0}}, +/* 52774 */ {(12<<2)|2,{76,50,0}}, +/* 52775 */ {(12<<2)|2,{76,50,0}}, +/* 52776 */ {(12<<2)|2,{76,50,0}}, +/* 52777 */ {(12<<2)|2,{76,50,0}}, +/* 52778 */ {(12<<2)|2,{76,50,0}}, +/* 52779 */ {(12<<2)|2,{76,50,0}}, +/* 52780 */ {(12<<2)|2,{76,50,0}}, +/* 52781 */ {(12<<2)|2,{76,50,0}}, +/* 52782 */ {(12<<2)|2,{76,50,0}}, +/* 52783 */ {(12<<2)|2,{76,50,0}}, +/* 52784 */ {(12<<2)|2,{76,97,0}}, +/* 52785 */ {(12<<2)|2,{76,97,0}}, +/* 52786 */ {(12<<2)|2,{76,97,0}}, +/* 52787 */ {(12<<2)|2,{76,97,0}}, +/* 52788 */ {(12<<2)|2,{76,97,0}}, +/* 52789 */ {(12<<2)|2,{76,97,0}}, +/* 52790 */ {(12<<2)|2,{76,97,0}}, +/* 52791 */ {(12<<2)|2,{76,97,0}}, +/* 52792 */ {(12<<2)|2,{76,97,0}}, +/* 52793 */ {(12<<2)|2,{76,97,0}}, +/* 52794 */ {(12<<2)|2,{76,97,0}}, +/* 52795 */ {(12<<2)|2,{76,97,0}}, +/* 52796 */ {(12<<2)|2,{76,97,0}}, +/* 52797 */ {(12<<2)|2,{76,97,0}}, +/* 52798 */ {(12<<2)|2,{76,97,0}}, +/* 52799 */ {(12<<2)|2,{76,97,0}}, +/* 52800 */ {(12<<2)|2,{76,99,0}}, +/* 52801 */ {(12<<2)|2,{76,99,0}}, +/* 52802 */ {(12<<2)|2,{76,99,0}}, +/* 52803 */ {(12<<2)|2,{76,99,0}}, +/* 52804 */ {(12<<2)|2,{76,99,0}}, +/* 52805 */ {(12<<2)|2,{76,99,0}}, +/* 52806 */ {(12<<2)|2,{76,99,0}}, +/* 52807 */ {(12<<2)|2,{76,99,0}}, +/* 52808 */ {(12<<2)|2,{76,99,0}}, +/* 52809 */ {(12<<2)|2,{76,99,0}}, +/* 52810 */ {(12<<2)|2,{76,99,0}}, +/* 52811 */ {(12<<2)|2,{76,99,0}}, +/* 52812 */ {(12<<2)|2,{76,99,0}}, +/* 52813 */ {(12<<2)|2,{76,99,0}}, +/* 52814 */ {(12<<2)|2,{76,99,0}}, +/* 52815 */ {(12<<2)|2,{76,99,0}}, +/* 52816 */ {(12<<2)|2,{76,101,0}}, +/* 52817 */ {(12<<2)|2,{76,101,0}}, +/* 52818 */ {(12<<2)|2,{76,101,0}}, +/* 52819 */ {(12<<2)|2,{76,101,0}}, +/* 52820 */ {(12<<2)|2,{76,101,0}}, +/* 52821 */ {(12<<2)|2,{76,101,0}}, +/* 52822 */ {(12<<2)|2,{76,101,0}}, +/* 52823 */ {(12<<2)|2,{76,101,0}}, +/* 52824 */ {(12<<2)|2,{76,101,0}}, +/* 52825 */ {(12<<2)|2,{76,101,0}}, +/* 52826 */ {(12<<2)|2,{76,101,0}}, +/* 52827 */ {(12<<2)|2,{76,101,0}}, +/* 52828 */ {(12<<2)|2,{76,101,0}}, +/* 52829 */ {(12<<2)|2,{76,101,0}}, +/* 52830 */ {(12<<2)|2,{76,101,0}}, +/* 52831 */ {(12<<2)|2,{76,101,0}}, +/* 52832 */ {(12<<2)|2,{76,105,0}}, +/* 52833 */ {(12<<2)|2,{76,105,0}}, +/* 52834 */ {(12<<2)|2,{76,105,0}}, +/* 52835 */ {(12<<2)|2,{76,105,0}}, +/* 52836 */ {(12<<2)|2,{76,105,0}}, +/* 52837 */ {(12<<2)|2,{76,105,0}}, +/* 52838 */ {(12<<2)|2,{76,105,0}}, +/* 52839 */ {(12<<2)|2,{76,105,0}}, +/* 52840 */ {(12<<2)|2,{76,105,0}}, +/* 52841 */ {(12<<2)|2,{76,105,0}}, +/* 52842 */ {(12<<2)|2,{76,105,0}}, +/* 52843 */ {(12<<2)|2,{76,105,0}}, +/* 52844 */ {(12<<2)|2,{76,105,0}}, +/* 52845 */ {(12<<2)|2,{76,105,0}}, +/* 52846 */ {(12<<2)|2,{76,105,0}}, +/* 52847 */ {(12<<2)|2,{76,105,0}}, +/* 52848 */ {(12<<2)|2,{76,111,0}}, +/* 52849 */ {(12<<2)|2,{76,111,0}}, +/* 52850 */ {(12<<2)|2,{76,111,0}}, +/* 52851 */ {(12<<2)|2,{76,111,0}}, +/* 52852 */ {(12<<2)|2,{76,111,0}}, +/* 52853 */ {(12<<2)|2,{76,111,0}}, +/* 52854 */ {(12<<2)|2,{76,111,0}}, +/* 52855 */ {(12<<2)|2,{76,111,0}}, +/* 52856 */ {(12<<2)|2,{76,111,0}}, +/* 52857 */ {(12<<2)|2,{76,111,0}}, +/* 52858 */ {(12<<2)|2,{76,111,0}}, +/* 52859 */ {(12<<2)|2,{76,111,0}}, +/* 52860 */ {(12<<2)|2,{76,111,0}}, +/* 52861 */ {(12<<2)|2,{76,111,0}}, +/* 52862 */ {(12<<2)|2,{76,111,0}}, +/* 52863 */ {(12<<2)|2,{76,111,0}}, +/* 52864 */ {(12<<2)|2,{76,115,0}}, +/* 52865 */ {(12<<2)|2,{76,115,0}}, +/* 52866 */ {(12<<2)|2,{76,115,0}}, +/* 52867 */ {(12<<2)|2,{76,115,0}}, +/* 52868 */ {(12<<2)|2,{76,115,0}}, +/* 52869 */ {(12<<2)|2,{76,115,0}}, +/* 52870 */ {(12<<2)|2,{76,115,0}}, +/* 52871 */ {(12<<2)|2,{76,115,0}}, +/* 52872 */ {(12<<2)|2,{76,115,0}}, +/* 52873 */ {(12<<2)|2,{76,115,0}}, +/* 52874 */ {(12<<2)|2,{76,115,0}}, +/* 52875 */ {(12<<2)|2,{76,115,0}}, +/* 52876 */ {(12<<2)|2,{76,115,0}}, +/* 52877 */ {(12<<2)|2,{76,115,0}}, +/* 52878 */ {(12<<2)|2,{76,115,0}}, +/* 52879 */ {(12<<2)|2,{76,115,0}}, +/* 52880 */ {(12<<2)|2,{76,116,0}}, +/* 52881 */ {(12<<2)|2,{76,116,0}}, +/* 52882 */ {(12<<2)|2,{76,116,0}}, +/* 52883 */ {(12<<2)|2,{76,116,0}}, +/* 52884 */ {(12<<2)|2,{76,116,0}}, +/* 52885 */ {(12<<2)|2,{76,116,0}}, +/* 52886 */ {(12<<2)|2,{76,116,0}}, +/* 52887 */ {(12<<2)|2,{76,116,0}}, +/* 52888 */ {(12<<2)|2,{76,116,0}}, +/* 52889 */ {(12<<2)|2,{76,116,0}}, +/* 52890 */ {(12<<2)|2,{76,116,0}}, +/* 52891 */ {(12<<2)|2,{76,116,0}}, +/* 52892 */ {(12<<2)|2,{76,116,0}}, +/* 52893 */ {(12<<2)|2,{76,116,0}}, +/* 52894 */ {(12<<2)|2,{76,116,0}}, +/* 52895 */ {(12<<2)|2,{76,116,0}}, +/* 52896 */ {(13<<2)|2,{76,32,0}}, +/* 52897 */ {(13<<2)|2,{76,32,0}}, +/* 52898 */ {(13<<2)|2,{76,32,0}}, +/* 52899 */ {(13<<2)|2,{76,32,0}}, +/* 52900 */ {(13<<2)|2,{76,32,0}}, +/* 52901 */ {(13<<2)|2,{76,32,0}}, +/* 52902 */ {(13<<2)|2,{76,32,0}}, +/* 52903 */ {(13<<2)|2,{76,32,0}}, +/* 52904 */ {(13<<2)|2,{76,37,0}}, +/* 52905 */ {(13<<2)|2,{76,37,0}}, +/* 52906 */ {(13<<2)|2,{76,37,0}}, +/* 52907 */ {(13<<2)|2,{76,37,0}}, +/* 52908 */ {(13<<2)|2,{76,37,0}}, +/* 52909 */ {(13<<2)|2,{76,37,0}}, +/* 52910 */ {(13<<2)|2,{76,37,0}}, +/* 52911 */ {(13<<2)|2,{76,37,0}}, +/* 52912 */ {(13<<2)|2,{76,45,0}}, +/* 52913 */ {(13<<2)|2,{76,45,0}}, +/* 52914 */ {(13<<2)|2,{76,45,0}}, +/* 52915 */ {(13<<2)|2,{76,45,0}}, +/* 52916 */ {(13<<2)|2,{76,45,0}}, +/* 52917 */ {(13<<2)|2,{76,45,0}}, +/* 52918 */ {(13<<2)|2,{76,45,0}}, +/* 52919 */ {(13<<2)|2,{76,45,0}}, +/* 52920 */ {(13<<2)|2,{76,46,0}}, +/* 52921 */ {(13<<2)|2,{76,46,0}}, +/* 52922 */ {(13<<2)|2,{76,46,0}}, +/* 52923 */ {(13<<2)|2,{76,46,0}}, +/* 52924 */ {(13<<2)|2,{76,46,0}}, +/* 52925 */ {(13<<2)|2,{76,46,0}}, +/* 52926 */ {(13<<2)|2,{76,46,0}}, +/* 52927 */ {(13<<2)|2,{76,46,0}}, +/* 52928 */ {(13<<2)|2,{76,47,0}}, +/* 52929 */ {(13<<2)|2,{76,47,0}}, +/* 52930 */ {(13<<2)|2,{76,47,0}}, +/* 52931 */ {(13<<2)|2,{76,47,0}}, +/* 52932 */ {(13<<2)|2,{76,47,0}}, +/* 52933 */ {(13<<2)|2,{76,47,0}}, +/* 52934 */ {(13<<2)|2,{76,47,0}}, +/* 52935 */ {(13<<2)|2,{76,47,0}}, +/* 52936 */ {(13<<2)|2,{76,51,0}}, +/* 52937 */ {(13<<2)|2,{76,51,0}}, +/* 52938 */ {(13<<2)|2,{76,51,0}}, +/* 52939 */ {(13<<2)|2,{76,51,0}}, +/* 52940 */ {(13<<2)|2,{76,51,0}}, +/* 52941 */ {(13<<2)|2,{76,51,0}}, +/* 52942 */ {(13<<2)|2,{76,51,0}}, +/* 52943 */ {(13<<2)|2,{76,51,0}}, +/* 52944 */ {(13<<2)|2,{76,52,0}}, +/* 52945 */ {(13<<2)|2,{76,52,0}}, +/* 52946 */ {(13<<2)|2,{76,52,0}}, +/* 52947 */ {(13<<2)|2,{76,52,0}}, +/* 52948 */ {(13<<2)|2,{76,52,0}}, +/* 52949 */ {(13<<2)|2,{76,52,0}}, +/* 52950 */ {(13<<2)|2,{76,52,0}}, +/* 52951 */ {(13<<2)|2,{76,52,0}}, +/* 52952 */ {(13<<2)|2,{76,53,0}}, +/* 52953 */ {(13<<2)|2,{76,53,0}}, +/* 52954 */ {(13<<2)|2,{76,53,0}}, +/* 52955 */ {(13<<2)|2,{76,53,0}}, +/* 52956 */ {(13<<2)|2,{76,53,0}}, +/* 52957 */ {(13<<2)|2,{76,53,0}}, +/* 52958 */ {(13<<2)|2,{76,53,0}}, +/* 52959 */ {(13<<2)|2,{76,53,0}}, +/* 52960 */ {(13<<2)|2,{76,54,0}}, +/* 52961 */ {(13<<2)|2,{76,54,0}}, +/* 52962 */ {(13<<2)|2,{76,54,0}}, +/* 52963 */ {(13<<2)|2,{76,54,0}}, +/* 52964 */ {(13<<2)|2,{76,54,0}}, +/* 52965 */ {(13<<2)|2,{76,54,0}}, +/* 52966 */ {(13<<2)|2,{76,54,0}}, +/* 52967 */ {(13<<2)|2,{76,54,0}}, +/* 52968 */ {(13<<2)|2,{76,55,0}}, +/* 52969 */ {(13<<2)|2,{76,55,0}}, +/* 52970 */ {(13<<2)|2,{76,55,0}}, +/* 52971 */ {(13<<2)|2,{76,55,0}}, +/* 52972 */ {(13<<2)|2,{76,55,0}}, +/* 52973 */ {(13<<2)|2,{76,55,0}}, +/* 52974 */ {(13<<2)|2,{76,55,0}}, +/* 52975 */ {(13<<2)|2,{76,55,0}}, +/* 52976 */ {(13<<2)|2,{76,56,0}}, +/* 52977 */ {(13<<2)|2,{76,56,0}}, +/* 52978 */ {(13<<2)|2,{76,56,0}}, +/* 52979 */ {(13<<2)|2,{76,56,0}}, +/* 52980 */ {(13<<2)|2,{76,56,0}}, +/* 52981 */ {(13<<2)|2,{76,56,0}}, +/* 52982 */ {(13<<2)|2,{76,56,0}}, +/* 52983 */ {(13<<2)|2,{76,56,0}}, +/* 52984 */ {(13<<2)|2,{76,57,0}}, +/* 52985 */ {(13<<2)|2,{76,57,0}}, +/* 52986 */ {(13<<2)|2,{76,57,0}}, +/* 52987 */ {(13<<2)|2,{76,57,0}}, +/* 52988 */ {(13<<2)|2,{76,57,0}}, +/* 52989 */ {(13<<2)|2,{76,57,0}}, +/* 52990 */ {(13<<2)|2,{76,57,0}}, +/* 52991 */ {(13<<2)|2,{76,57,0}}, +/* 52992 */ {(13<<2)|2,{76,61,0}}, +/* 52993 */ {(13<<2)|2,{76,61,0}}, +/* 52994 */ {(13<<2)|2,{76,61,0}}, +/* 52995 */ {(13<<2)|2,{76,61,0}}, +/* 52996 */ {(13<<2)|2,{76,61,0}}, +/* 52997 */ {(13<<2)|2,{76,61,0}}, +/* 52998 */ {(13<<2)|2,{76,61,0}}, +/* 52999 */ {(13<<2)|2,{76,61,0}}, +/* 53000 */ {(13<<2)|2,{76,65,0}}, +/* 53001 */ {(13<<2)|2,{76,65,0}}, +/* 53002 */ {(13<<2)|2,{76,65,0}}, +/* 53003 */ {(13<<2)|2,{76,65,0}}, +/* 53004 */ {(13<<2)|2,{76,65,0}}, +/* 53005 */ {(13<<2)|2,{76,65,0}}, +/* 53006 */ {(13<<2)|2,{76,65,0}}, +/* 53007 */ {(13<<2)|2,{76,65,0}}, +/* 53008 */ {(13<<2)|2,{76,95,0}}, +/* 53009 */ {(13<<2)|2,{76,95,0}}, +/* 53010 */ {(13<<2)|2,{76,95,0}}, +/* 53011 */ {(13<<2)|2,{76,95,0}}, +/* 53012 */ {(13<<2)|2,{76,95,0}}, +/* 53013 */ {(13<<2)|2,{76,95,0}}, +/* 53014 */ {(13<<2)|2,{76,95,0}}, +/* 53015 */ {(13<<2)|2,{76,95,0}}, +/* 53016 */ {(13<<2)|2,{76,98,0}}, +/* 53017 */ {(13<<2)|2,{76,98,0}}, +/* 53018 */ {(13<<2)|2,{76,98,0}}, +/* 53019 */ {(13<<2)|2,{76,98,0}}, +/* 53020 */ {(13<<2)|2,{76,98,0}}, +/* 53021 */ {(13<<2)|2,{76,98,0}}, +/* 53022 */ {(13<<2)|2,{76,98,0}}, +/* 53023 */ {(13<<2)|2,{76,98,0}}, +/* 53024 */ {(13<<2)|2,{76,100,0}}, +/* 53025 */ {(13<<2)|2,{76,100,0}}, +/* 53026 */ {(13<<2)|2,{76,100,0}}, +/* 53027 */ {(13<<2)|2,{76,100,0}}, +/* 53028 */ {(13<<2)|2,{76,100,0}}, +/* 53029 */ {(13<<2)|2,{76,100,0}}, +/* 53030 */ {(13<<2)|2,{76,100,0}}, +/* 53031 */ {(13<<2)|2,{76,100,0}}, +/* 53032 */ {(13<<2)|2,{76,102,0}}, +/* 53033 */ {(13<<2)|2,{76,102,0}}, +/* 53034 */ {(13<<2)|2,{76,102,0}}, +/* 53035 */ {(13<<2)|2,{76,102,0}}, +/* 53036 */ {(13<<2)|2,{76,102,0}}, +/* 53037 */ {(13<<2)|2,{76,102,0}}, +/* 53038 */ {(13<<2)|2,{76,102,0}}, +/* 53039 */ {(13<<2)|2,{76,102,0}}, +/* 53040 */ {(13<<2)|2,{76,103,0}}, +/* 53041 */ {(13<<2)|2,{76,103,0}}, +/* 53042 */ {(13<<2)|2,{76,103,0}}, +/* 53043 */ {(13<<2)|2,{76,103,0}}, +/* 53044 */ {(13<<2)|2,{76,103,0}}, +/* 53045 */ {(13<<2)|2,{76,103,0}}, +/* 53046 */ {(13<<2)|2,{76,103,0}}, +/* 53047 */ {(13<<2)|2,{76,103,0}}, +/* 53048 */ {(13<<2)|2,{76,104,0}}, +/* 53049 */ {(13<<2)|2,{76,104,0}}, +/* 53050 */ {(13<<2)|2,{76,104,0}}, +/* 53051 */ {(13<<2)|2,{76,104,0}}, +/* 53052 */ {(13<<2)|2,{76,104,0}}, +/* 53053 */ {(13<<2)|2,{76,104,0}}, +/* 53054 */ {(13<<2)|2,{76,104,0}}, +/* 53055 */ {(13<<2)|2,{76,104,0}}, +/* 53056 */ {(13<<2)|2,{76,108,0}}, +/* 53057 */ {(13<<2)|2,{76,108,0}}, +/* 53058 */ {(13<<2)|2,{76,108,0}}, +/* 53059 */ {(13<<2)|2,{76,108,0}}, +/* 53060 */ {(13<<2)|2,{76,108,0}}, +/* 53061 */ {(13<<2)|2,{76,108,0}}, +/* 53062 */ {(13<<2)|2,{76,108,0}}, +/* 53063 */ {(13<<2)|2,{76,108,0}}, +/* 53064 */ {(13<<2)|2,{76,109,0}}, +/* 53065 */ {(13<<2)|2,{76,109,0}}, +/* 53066 */ {(13<<2)|2,{76,109,0}}, +/* 53067 */ {(13<<2)|2,{76,109,0}}, +/* 53068 */ {(13<<2)|2,{76,109,0}}, +/* 53069 */ {(13<<2)|2,{76,109,0}}, +/* 53070 */ {(13<<2)|2,{76,109,0}}, +/* 53071 */ {(13<<2)|2,{76,109,0}}, +/* 53072 */ {(13<<2)|2,{76,110,0}}, +/* 53073 */ {(13<<2)|2,{76,110,0}}, +/* 53074 */ {(13<<2)|2,{76,110,0}}, +/* 53075 */ {(13<<2)|2,{76,110,0}}, +/* 53076 */ {(13<<2)|2,{76,110,0}}, +/* 53077 */ {(13<<2)|2,{76,110,0}}, +/* 53078 */ {(13<<2)|2,{76,110,0}}, +/* 53079 */ {(13<<2)|2,{76,110,0}}, +/* 53080 */ {(13<<2)|2,{76,112,0}}, +/* 53081 */ {(13<<2)|2,{76,112,0}}, +/* 53082 */ {(13<<2)|2,{76,112,0}}, +/* 53083 */ {(13<<2)|2,{76,112,0}}, +/* 53084 */ {(13<<2)|2,{76,112,0}}, +/* 53085 */ {(13<<2)|2,{76,112,0}}, +/* 53086 */ {(13<<2)|2,{76,112,0}}, +/* 53087 */ {(13<<2)|2,{76,112,0}}, +/* 53088 */ {(13<<2)|2,{76,114,0}}, +/* 53089 */ {(13<<2)|2,{76,114,0}}, +/* 53090 */ {(13<<2)|2,{76,114,0}}, +/* 53091 */ {(13<<2)|2,{76,114,0}}, +/* 53092 */ {(13<<2)|2,{76,114,0}}, +/* 53093 */ {(13<<2)|2,{76,114,0}}, +/* 53094 */ {(13<<2)|2,{76,114,0}}, +/* 53095 */ {(13<<2)|2,{76,114,0}}, +/* 53096 */ {(13<<2)|2,{76,117,0}}, +/* 53097 */ {(13<<2)|2,{76,117,0}}, +/* 53098 */ {(13<<2)|2,{76,117,0}}, +/* 53099 */ {(13<<2)|2,{76,117,0}}, +/* 53100 */ {(13<<2)|2,{76,117,0}}, +/* 53101 */ {(13<<2)|2,{76,117,0}}, +/* 53102 */ {(13<<2)|2,{76,117,0}}, +/* 53103 */ {(13<<2)|2,{76,117,0}}, +/* 53104 */ {(14<<2)|2,{76,58,0}}, +/* 53105 */ {(14<<2)|2,{76,58,0}}, +/* 53106 */ {(14<<2)|2,{76,58,0}}, +/* 53107 */ {(14<<2)|2,{76,58,0}}, +/* 53108 */ {(14<<2)|2,{76,66,0}}, +/* 53109 */ {(14<<2)|2,{76,66,0}}, +/* 53110 */ {(14<<2)|2,{76,66,0}}, +/* 53111 */ {(14<<2)|2,{76,66,0}}, +/* 53112 */ {(14<<2)|2,{76,67,0}}, +/* 53113 */ {(14<<2)|2,{76,67,0}}, +/* 53114 */ {(14<<2)|2,{76,67,0}}, +/* 53115 */ {(14<<2)|2,{76,67,0}}, +/* 53116 */ {(14<<2)|2,{76,68,0}}, +/* 53117 */ {(14<<2)|2,{76,68,0}}, +/* 53118 */ {(14<<2)|2,{76,68,0}}, +/* 53119 */ {(14<<2)|2,{76,68,0}}, +/* 53120 */ {(14<<2)|2,{76,69,0}}, +/* 53121 */ {(14<<2)|2,{76,69,0}}, +/* 53122 */ {(14<<2)|2,{76,69,0}}, +/* 53123 */ {(14<<2)|2,{76,69,0}}, +/* 53124 */ {(14<<2)|2,{76,70,0}}, +/* 53125 */ {(14<<2)|2,{76,70,0}}, +/* 53126 */ {(14<<2)|2,{76,70,0}}, +/* 53127 */ {(14<<2)|2,{76,70,0}}, +/* 53128 */ {(14<<2)|2,{76,71,0}}, +/* 53129 */ {(14<<2)|2,{76,71,0}}, +/* 53130 */ {(14<<2)|2,{76,71,0}}, +/* 53131 */ {(14<<2)|2,{76,71,0}}, +/* 53132 */ {(14<<2)|2,{76,72,0}}, +/* 53133 */ {(14<<2)|2,{76,72,0}}, +/* 53134 */ {(14<<2)|2,{76,72,0}}, +/* 53135 */ {(14<<2)|2,{76,72,0}}, +/* 53136 */ {(14<<2)|2,{76,73,0}}, +/* 53137 */ {(14<<2)|2,{76,73,0}}, +/* 53138 */ {(14<<2)|2,{76,73,0}}, +/* 53139 */ {(14<<2)|2,{76,73,0}}, +/* 53140 */ {(14<<2)|2,{76,74,0}}, +/* 53141 */ {(14<<2)|2,{76,74,0}}, +/* 53142 */ {(14<<2)|2,{76,74,0}}, +/* 53143 */ {(14<<2)|2,{76,74,0}}, +/* 53144 */ {(14<<2)|2,{76,75,0}}, +/* 53145 */ {(14<<2)|2,{76,75,0}}, +/* 53146 */ {(14<<2)|2,{76,75,0}}, +/* 53147 */ {(14<<2)|2,{76,75,0}}, +/* 53148 */ {(14<<2)|2,{76,76,0}}, +/* 53149 */ {(14<<2)|2,{76,76,0}}, +/* 53150 */ {(14<<2)|2,{76,76,0}}, +/* 53151 */ {(14<<2)|2,{76,76,0}}, +/* 53152 */ {(14<<2)|2,{76,77,0}}, +/* 53153 */ {(14<<2)|2,{76,77,0}}, +/* 53154 */ {(14<<2)|2,{76,77,0}}, +/* 53155 */ {(14<<2)|2,{76,77,0}}, +/* 53156 */ {(14<<2)|2,{76,78,0}}, +/* 53157 */ {(14<<2)|2,{76,78,0}}, +/* 53158 */ {(14<<2)|2,{76,78,0}}, +/* 53159 */ {(14<<2)|2,{76,78,0}}, +/* 53160 */ {(14<<2)|2,{76,79,0}}, +/* 53161 */ {(14<<2)|2,{76,79,0}}, +/* 53162 */ {(14<<2)|2,{76,79,0}}, +/* 53163 */ {(14<<2)|2,{76,79,0}}, +/* 53164 */ {(14<<2)|2,{76,80,0}}, +/* 53165 */ {(14<<2)|2,{76,80,0}}, +/* 53166 */ {(14<<2)|2,{76,80,0}}, +/* 53167 */ {(14<<2)|2,{76,80,0}}, +/* 53168 */ {(14<<2)|2,{76,81,0}}, +/* 53169 */ {(14<<2)|2,{76,81,0}}, +/* 53170 */ {(14<<2)|2,{76,81,0}}, +/* 53171 */ {(14<<2)|2,{76,81,0}}, +/* 53172 */ {(14<<2)|2,{76,82,0}}, +/* 53173 */ {(14<<2)|2,{76,82,0}}, +/* 53174 */ {(14<<2)|2,{76,82,0}}, +/* 53175 */ {(14<<2)|2,{76,82,0}}, +/* 53176 */ {(14<<2)|2,{76,83,0}}, +/* 53177 */ {(14<<2)|2,{76,83,0}}, +/* 53178 */ {(14<<2)|2,{76,83,0}}, +/* 53179 */ {(14<<2)|2,{76,83,0}}, +/* 53180 */ {(14<<2)|2,{76,84,0}}, +/* 53181 */ {(14<<2)|2,{76,84,0}}, +/* 53182 */ {(14<<2)|2,{76,84,0}}, +/* 53183 */ {(14<<2)|2,{76,84,0}}, +/* 53184 */ {(14<<2)|2,{76,85,0}}, +/* 53185 */ {(14<<2)|2,{76,85,0}}, +/* 53186 */ {(14<<2)|2,{76,85,0}}, +/* 53187 */ {(14<<2)|2,{76,85,0}}, +/* 53188 */ {(14<<2)|2,{76,86,0}}, +/* 53189 */ {(14<<2)|2,{76,86,0}}, +/* 53190 */ {(14<<2)|2,{76,86,0}}, +/* 53191 */ {(14<<2)|2,{76,86,0}}, +/* 53192 */ {(14<<2)|2,{76,87,0}}, +/* 53193 */ {(14<<2)|2,{76,87,0}}, +/* 53194 */ {(14<<2)|2,{76,87,0}}, +/* 53195 */ {(14<<2)|2,{76,87,0}}, +/* 53196 */ {(14<<2)|2,{76,89,0}}, +/* 53197 */ {(14<<2)|2,{76,89,0}}, +/* 53198 */ {(14<<2)|2,{76,89,0}}, +/* 53199 */ {(14<<2)|2,{76,89,0}}, +/* 53200 */ {(14<<2)|2,{76,106,0}}, +/* 53201 */ {(14<<2)|2,{76,106,0}}, +/* 53202 */ {(14<<2)|2,{76,106,0}}, +/* 53203 */ {(14<<2)|2,{76,106,0}}, +/* 53204 */ {(14<<2)|2,{76,107,0}}, +/* 53205 */ {(14<<2)|2,{76,107,0}}, +/* 53206 */ {(14<<2)|2,{76,107,0}}, +/* 53207 */ {(14<<2)|2,{76,107,0}}, +/* 53208 */ {(14<<2)|2,{76,113,0}}, +/* 53209 */ {(14<<2)|2,{76,113,0}}, +/* 53210 */ {(14<<2)|2,{76,113,0}}, +/* 53211 */ {(14<<2)|2,{76,113,0}}, +/* 53212 */ {(14<<2)|2,{76,118,0}}, +/* 53213 */ {(14<<2)|2,{76,118,0}}, +/* 53214 */ {(14<<2)|2,{76,118,0}}, +/* 53215 */ {(14<<2)|2,{76,118,0}}, +/* 53216 */ {(14<<2)|2,{76,119,0}}, +/* 53217 */ {(14<<2)|2,{76,119,0}}, +/* 53218 */ {(14<<2)|2,{76,119,0}}, +/* 53219 */ {(14<<2)|2,{76,119,0}}, +/* 53220 */ {(14<<2)|2,{76,120,0}}, +/* 53221 */ {(14<<2)|2,{76,120,0}}, +/* 53222 */ {(14<<2)|2,{76,120,0}}, +/* 53223 */ {(14<<2)|2,{76,120,0}}, +/* 53224 */ {(14<<2)|2,{76,121,0}}, +/* 53225 */ {(14<<2)|2,{76,121,0}}, +/* 53226 */ {(14<<2)|2,{76,121,0}}, +/* 53227 */ {(14<<2)|2,{76,121,0}}, +/* 53228 */ {(14<<2)|2,{76,122,0}}, +/* 53229 */ {(14<<2)|2,{76,122,0}}, +/* 53230 */ {(14<<2)|2,{76,122,0}}, +/* 53231 */ {(14<<2)|2,{76,122,0}}, +/* 53232 */ {(15<<2)|2,{76,38,0}}, +/* 53233 */ {(15<<2)|2,{76,38,0}}, +/* 53234 */ {(15<<2)|2,{76,42,0}}, +/* 53235 */ {(15<<2)|2,{76,42,0}}, +/* 53236 */ {(15<<2)|2,{76,44,0}}, +/* 53237 */ {(15<<2)|2,{76,44,0}}, +/* 53238 */ {(15<<2)|2,{76,59,0}}, +/* 53239 */ {(15<<2)|2,{76,59,0}}, +/* 53240 */ {(15<<2)|2,{76,88,0}}, +/* 53241 */ {(15<<2)|2,{76,88,0}}, +/* 53242 */ {(15<<2)|2,{76,90,0}}, +/* 53243 */ {(15<<2)|2,{76,90,0}}, +/* 53244 */ {(7<<2)|1,{76,0,0}}, +/* 53245 */ {(7<<2)|1,{76,0,0}}, +/* 53246 */ {(7<<2)|1,{76,0,0}}, +/* 53247 */ {(7<<2)|1,{76,0,0}}, +/* 53248 */ {(12<<2)|2,{77,48,0}}, +/* 53249 */ {(12<<2)|2,{77,48,0}}, +/* 53250 */ {(12<<2)|2,{77,48,0}}, +/* 53251 */ {(12<<2)|2,{77,48,0}}, +/* 53252 */ {(12<<2)|2,{77,48,0}}, +/* 53253 */ {(12<<2)|2,{77,48,0}}, +/* 53254 */ {(12<<2)|2,{77,48,0}}, +/* 53255 */ {(12<<2)|2,{77,48,0}}, +/* 53256 */ {(12<<2)|2,{77,48,0}}, +/* 53257 */ {(12<<2)|2,{77,48,0}}, +/* 53258 */ {(12<<2)|2,{77,48,0}}, +/* 53259 */ {(12<<2)|2,{77,48,0}}, +/* 53260 */ {(12<<2)|2,{77,48,0}}, +/* 53261 */ {(12<<2)|2,{77,48,0}}, +/* 53262 */ {(12<<2)|2,{77,48,0}}, +/* 53263 */ {(12<<2)|2,{77,48,0}}, +/* 53264 */ {(12<<2)|2,{77,49,0}}, +/* 53265 */ {(12<<2)|2,{77,49,0}}, +/* 53266 */ {(12<<2)|2,{77,49,0}}, +/* 53267 */ {(12<<2)|2,{77,49,0}}, +/* 53268 */ {(12<<2)|2,{77,49,0}}, +/* 53269 */ {(12<<2)|2,{77,49,0}}, +/* 53270 */ {(12<<2)|2,{77,49,0}}, +/* 53271 */ {(12<<2)|2,{77,49,0}}, +/* 53272 */ {(12<<2)|2,{77,49,0}}, +/* 53273 */ {(12<<2)|2,{77,49,0}}, +/* 53274 */ {(12<<2)|2,{77,49,0}}, +/* 53275 */ {(12<<2)|2,{77,49,0}}, +/* 53276 */ {(12<<2)|2,{77,49,0}}, +/* 53277 */ {(12<<2)|2,{77,49,0}}, +/* 53278 */ {(12<<2)|2,{77,49,0}}, +/* 53279 */ {(12<<2)|2,{77,49,0}}, +/* 53280 */ {(12<<2)|2,{77,50,0}}, +/* 53281 */ {(12<<2)|2,{77,50,0}}, +/* 53282 */ {(12<<2)|2,{77,50,0}}, +/* 53283 */ {(12<<2)|2,{77,50,0}}, +/* 53284 */ {(12<<2)|2,{77,50,0}}, +/* 53285 */ {(12<<2)|2,{77,50,0}}, +/* 53286 */ {(12<<2)|2,{77,50,0}}, +/* 53287 */ {(12<<2)|2,{77,50,0}}, +/* 53288 */ {(12<<2)|2,{77,50,0}}, +/* 53289 */ {(12<<2)|2,{77,50,0}}, +/* 53290 */ {(12<<2)|2,{77,50,0}}, +/* 53291 */ {(12<<2)|2,{77,50,0}}, +/* 53292 */ {(12<<2)|2,{77,50,0}}, +/* 53293 */ {(12<<2)|2,{77,50,0}}, +/* 53294 */ {(12<<2)|2,{77,50,0}}, +/* 53295 */ {(12<<2)|2,{77,50,0}}, +/* 53296 */ {(12<<2)|2,{77,97,0}}, +/* 53297 */ {(12<<2)|2,{77,97,0}}, +/* 53298 */ {(12<<2)|2,{77,97,0}}, +/* 53299 */ {(12<<2)|2,{77,97,0}}, +/* 53300 */ {(12<<2)|2,{77,97,0}}, +/* 53301 */ {(12<<2)|2,{77,97,0}}, +/* 53302 */ {(12<<2)|2,{77,97,0}}, +/* 53303 */ {(12<<2)|2,{77,97,0}}, +/* 53304 */ {(12<<2)|2,{77,97,0}}, +/* 53305 */ {(12<<2)|2,{77,97,0}}, +/* 53306 */ {(12<<2)|2,{77,97,0}}, +/* 53307 */ {(12<<2)|2,{77,97,0}}, +/* 53308 */ {(12<<2)|2,{77,97,0}}, +/* 53309 */ {(12<<2)|2,{77,97,0}}, +/* 53310 */ {(12<<2)|2,{77,97,0}}, +/* 53311 */ {(12<<2)|2,{77,97,0}}, +/* 53312 */ {(12<<2)|2,{77,99,0}}, +/* 53313 */ {(12<<2)|2,{77,99,0}}, +/* 53314 */ {(12<<2)|2,{77,99,0}}, +/* 53315 */ {(12<<2)|2,{77,99,0}}, +/* 53316 */ {(12<<2)|2,{77,99,0}}, +/* 53317 */ {(12<<2)|2,{77,99,0}}, +/* 53318 */ {(12<<2)|2,{77,99,0}}, +/* 53319 */ {(12<<2)|2,{77,99,0}}, +/* 53320 */ {(12<<2)|2,{77,99,0}}, +/* 53321 */ {(12<<2)|2,{77,99,0}}, +/* 53322 */ {(12<<2)|2,{77,99,0}}, +/* 53323 */ {(12<<2)|2,{77,99,0}}, +/* 53324 */ {(12<<2)|2,{77,99,0}}, +/* 53325 */ {(12<<2)|2,{77,99,0}}, +/* 53326 */ {(12<<2)|2,{77,99,0}}, +/* 53327 */ {(12<<2)|2,{77,99,0}}, +/* 53328 */ {(12<<2)|2,{77,101,0}}, +/* 53329 */ {(12<<2)|2,{77,101,0}}, +/* 53330 */ {(12<<2)|2,{77,101,0}}, +/* 53331 */ {(12<<2)|2,{77,101,0}}, +/* 53332 */ {(12<<2)|2,{77,101,0}}, +/* 53333 */ {(12<<2)|2,{77,101,0}}, +/* 53334 */ {(12<<2)|2,{77,101,0}}, +/* 53335 */ {(12<<2)|2,{77,101,0}}, +/* 53336 */ {(12<<2)|2,{77,101,0}}, +/* 53337 */ {(12<<2)|2,{77,101,0}}, +/* 53338 */ {(12<<2)|2,{77,101,0}}, +/* 53339 */ {(12<<2)|2,{77,101,0}}, +/* 53340 */ {(12<<2)|2,{77,101,0}}, +/* 53341 */ {(12<<2)|2,{77,101,0}}, +/* 53342 */ {(12<<2)|2,{77,101,0}}, +/* 53343 */ {(12<<2)|2,{77,101,0}}, +/* 53344 */ {(12<<2)|2,{77,105,0}}, +/* 53345 */ {(12<<2)|2,{77,105,0}}, +/* 53346 */ {(12<<2)|2,{77,105,0}}, +/* 53347 */ {(12<<2)|2,{77,105,0}}, +/* 53348 */ {(12<<2)|2,{77,105,0}}, +/* 53349 */ {(12<<2)|2,{77,105,0}}, +/* 53350 */ {(12<<2)|2,{77,105,0}}, +/* 53351 */ {(12<<2)|2,{77,105,0}}, +/* 53352 */ {(12<<2)|2,{77,105,0}}, +/* 53353 */ {(12<<2)|2,{77,105,0}}, +/* 53354 */ {(12<<2)|2,{77,105,0}}, +/* 53355 */ {(12<<2)|2,{77,105,0}}, +/* 53356 */ {(12<<2)|2,{77,105,0}}, +/* 53357 */ {(12<<2)|2,{77,105,0}}, +/* 53358 */ {(12<<2)|2,{77,105,0}}, +/* 53359 */ {(12<<2)|2,{77,105,0}}, +/* 53360 */ {(12<<2)|2,{77,111,0}}, +/* 53361 */ {(12<<2)|2,{77,111,0}}, +/* 53362 */ {(12<<2)|2,{77,111,0}}, +/* 53363 */ {(12<<2)|2,{77,111,0}}, +/* 53364 */ {(12<<2)|2,{77,111,0}}, +/* 53365 */ {(12<<2)|2,{77,111,0}}, +/* 53366 */ {(12<<2)|2,{77,111,0}}, +/* 53367 */ {(12<<2)|2,{77,111,0}}, +/* 53368 */ {(12<<2)|2,{77,111,0}}, +/* 53369 */ {(12<<2)|2,{77,111,0}}, +/* 53370 */ {(12<<2)|2,{77,111,0}}, +/* 53371 */ {(12<<2)|2,{77,111,0}}, +/* 53372 */ {(12<<2)|2,{77,111,0}}, +/* 53373 */ {(12<<2)|2,{77,111,0}}, +/* 53374 */ {(12<<2)|2,{77,111,0}}, +/* 53375 */ {(12<<2)|2,{77,111,0}}, +/* 53376 */ {(12<<2)|2,{77,115,0}}, +/* 53377 */ {(12<<2)|2,{77,115,0}}, +/* 53378 */ {(12<<2)|2,{77,115,0}}, +/* 53379 */ {(12<<2)|2,{77,115,0}}, +/* 53380 */ {(12<<2)|2,{77,115,0}}, +/* 53381 */ {(12<<2)|2,{77,115,0}}, +/* 53382 */ {(12<<2)|2,{77,115,0}}, +/* 53383 */ {(12<<2)|2,{77,115,0}}, +/* 53384 */ {(12<<2)|2,{77,115,0}}, +/* 53385 */ {(12<<2)|2,{77,115,0}}, +/* 53386 */ {(12<<2)|2,{77,115,0}}, +/* 53387 */ {(12<<2)|2,{77,115,0}}, +/* 53388 */ {(12<<2)|2,{77,115,0}}, +/* 53389 */ {(12<<2)|2,{77,115,0}}, +/* 53390 */ {(12<<2)|2,{77,115,0}}, +/* 53391 */ {(12<<2)|2,{77,115,0}}, +/* 53392 */ {(12<<2)|2,{77,116,0}}, +/* 53393 */ {(12<<2)|2,{77,116,0}}, +/* 53394 */ {(12<<2)|2,{77,116,0}}, +/* 53395 */ {(12<<2)|2,{77,116,0}}, +/* 53396 */ {(12<<2)|2,{77,116,0}}, +/* 53397 */ {(12<<2)|2,{77,116,0}}, +/* 53398 */ {(12<<2)|2,{77,116,0}}, +/* 53399 */ {(12<<2)|2,{77,116,0}}, +/* 53400 */ {(12<<2)|2,{77,116,0}}, +/* 53401 */ {(12<<2)|2,{77,116,0}}, +/* 53402 */ {(12<<2)|2,{77,116,0}}, +/* 53403 */ {(12<<2)|2,{77,116,0}}, +/* 53404 */ {(12<<2)|2,{77,116,0}}, +/* 53405 */ {(12<<2)|2,{77,116,0}}, +/* 53406 */ {(12<<2)|2,{77,116,0}}, +/* 53407 */ {(12<<2)|2,{77,116,0}}, +/* 53408 */ {(13<<2)|2,{77,32,0}}, +/* 53409 */ {(13<<2)|2,{77,32,0}}, +/* 53410 */ {(13<<2)|2,{77,32,0}}, +/* 53411 */ {(13<<2)|2,{77,32,0}}, +/* 53412 */ {(13<<2)|2,{77,32,0}}, +/* 53413 */ {(13<<2)|2,{77,32,0}}, +/* 53414 */ {(13<<2)|2,{77,32,0}}, +/* 53415 */ {(13<<2)|2,{77,32,0}}, +/* 53416 */ {(13<<2)|2,{77,37,0}}, +/* 53417 */ {(13<<2)|2,{77,37,0}}, +/* 53418 */ {(13<<2)|2,{77,37,0}}, +/* 53419 */ {(13<<2)|2,{77,37,0}}, +/* 53420 */ {(13<<2)|2,{77,37,0}}, +/* 53421 */ {(13<<2)|2,{77,37,0}}, +/* 53422 */ {(13<<2)|2,{77,37,0}}, +/* 53423 */ {(13<<2)|2,{77,37,0}}, +/* 53424 */ {(13<<2)|2,{77,45,0}}, +/* 53425 */ {(13<<2)|2,{77,45,0}}, +/* 53426 */ {(13<<2)|2,{77,45,0}}, +/* 53427 */ {(13<<2)|2,{77,45,0}}, +/* 53428 */ {(13<<2)|2,{77,45,0}}, +/* 53429 */ {(13<<2)|2,{77,45,0}}, +/* 53430 */ {(13<<2)|2,{77,45,0}}, +/* 53431 */ {(13<<2)|2,{77,45,0}}, +/* 53432 */ {(13<<2)|2,{77,46,0}}, +/* 53433 */ {(13<<2)|2,{77,46,0}}, +/* 53434 */ {(13<<2)|2,{77,46,0}}, +/* 53435 */ {(13<<2)|2,{77,46,0}}, +/* 53436 */ {(13<<2)|2,{77,46,0}}, +/* 53437 */ {(13<<2)|2,{77,46,0}}, +/* 53438 */ {(13<<2)|2,{77,46,0}}, +/* 53439 */ {(13<<2)|2,{77,46,0}}, +/* 53440 */ {(13<<2)|2,{77,47,0}}, +/* 53441 */ {(13<<2)|2,{77,47,0}}, +/* 53442 */ {(13<<2)|2,{77,47,0}}, +/* 53443 */ {(13<<2)|2,{77,47,0}}, +/* 53444 */ {(13<<2)|2,{77,47,0}}, +/* 53445 */ {(13<<2)|2,{77,47,0}}, +/* 53446 */ {(13<<2)|2,{77,47,0}}, +/* 53447 */ {(13<<2)|2,{77,47,0}}, +/* 53448 */ {(13<<2)|2,{77,51,0}}, +/* 53449 */ {(13<<2)|2,{77,51,0}}, +/* 53450 */ {(13<<2)|2,{77,51,0}}, +/* 53451 */ {(13<<2)|2,{77,51,0}}, +/* 53452 */ {(13<<2)|2,{77,51,0}}, +/* 53453 */ {(13<<2)|2,{77,51,0}}, +/* 53454 */ {(13<<2)|2,{77,51,0}}, +/* 53455 */ {(13<<2)|2,{77,51,0}}, +/* 53456 */ {(13<<2)|2,{77,52,0}}, +/* 53457 */ {(13<<2)|2,{77,52,0}}, +/* 53458 */ {(13<<2)|2,{77,52,0}}, +/* 53459 */ {(13<<2)|2,{77,52,0}}, +/* 53460 */ {(13<<2)|2,{77,52,0}}, +/* 53461 */ {(13<<2)|2,{77,52,0}}, +/* 53462 */ {(13<<2)|2,{77,52,0}}, +/* 53463 */ {(13<<2)|2,{77,52,0}}, +/* 53464 */ {(13<<2)|2,{77,53,0}}, +/* 53465 */ {(13<<2)|2,{77,53,0}}, +/* 53466 */ {(13<<2)|2,{77,53,0}}, +/* 53467 */ {(13<<2)|2,{77,53,0}}, +/* 53468 */ {(13<<2)|2,{77,53,0}}, +/* 53469 */ {(13<<2)|2,{77,53,0}}, +/* 53470 */ {(13<<2)|2,{77,53,0}}, +/* 53471 */ {(13<<2)|2,{77,53,0}}, +/* 53472 */ {(13<<2)|2,{77,54,0}}, +/* 53473 */ {(13<<2)|2,{77,54,0}}, +/* 53474 */ {(13<<2)|2,{77,54,0}}, +/* 53475 */ {(13<<2)|2,{77,54,0}}, +/* 53476 */ {(13<<2)|2,{77,54,0}}, +/* 53477 */ {(13<<2)|2,{77,54,0}}, +/* 53478 */ {(13<<2)|2,{77,54,0}}, +/* 53479 */ {(13<<2)|2,{77,54,0}}, +/* 53480 */ {(13<<2)|2,{77,55,0}}, +/* 53481 */ {(13<<2)|2,{77,55,0}}, +/* 53482 */ {(13<<2)|2,{77,55,0}}, +/* 53483 */ {(13<<2)|2,{77,55,0}}, +/* 53484 */ {(13<<2)|2,{77,55,0}}, +/* 53485 */ {(13<<2)|2,{77,55,0}}, +/* 53486 */ {(13<<2)|2,{77,55,0}}, +/* 53487 */ {(13<<2)|2,{77,55,0}}, +/* 53488 */ {(13<<2)|2,{77,56,0}}, +/* 53489 */ {(13<<2)|2,{77,56,0}}, +/* 53490 */ {(13<<2)|2,{77,56,0}}, +/* 53491 */ {(13<<2)|2,{77,56,0}}, +/* 53492 */ {(13<<2)|2,{77,56,0}}, +/* 53493 */ {(13<<2)|2,{77,56,0}}, +/* 53494 */ {(13<<2)|2,{77,56,0}}, +/* 53495 */ {(13<<2)|2,{77,56,0}}, +/* 53496 */ {(13<<2)|2,{77,57,0}}, +/* 53497 */ {(13<<2)|2,{77,57,0}}, +/* 53498 */ {(13<<2)|2,{77,57,0}}, +/* 53499 */ {(13<<2)|2,{77,57,0}}, +/* 53500 */ {(13<<2)|2,{77,57,0}}, +/* 53501 */ {(13<<2)|2,{77,57,0}}, +/* 53502 */ {(13<<2)|2,{77,57,0}}, +/* 53503 */ {(13<<2)|2,{77,57,0}}, +/* 53504 */ {(13<<2)|2,{77,61,0}}, +/* 53505 */ {(13<<2)|2,{77,61,0}}, +/* 53506 */ {(13<<2)|2,{77,61,0}}, +/* 53507 */ {(13<<2)|2,{77,61,0}}, +/* 53508 */ {(13<<2)|2,{77,61,0}}, +/* 53509 */ {(13<<2)|2,{77,61,0}}, +/* 53510 */ {(13<<2)|2,{77,61,0}}, +/* 53511 */ {(13<<2)|2,{77,61,0}}, +/* 53512 */ {(13<<2)|2,{77,65,0}}, +/* 53513 */ {(13<<2)|2,{77,65,0}}, +/* 53514 */ {(13<<2)|2,{77,65,0}}, +/* 53515 */ {(13<<2)|2,{77,65,0}}, +/* 53516 */ {(13<<2)|2,{77,65,0}}, +/* 53517 */ {(13<<2)|2,{77,65,0}}, +/* 53518 */ {(13<<2)|2,{77,65,0}}, +/* 53519 */ {(13<<2)|2,{77,65,0}}, +/* 53520 */ {(13<<2)|2,{77,95,0}}, +/* 53521 */ {(13<<2)|2,{77,95,0}}, +/* 53522 */ {(13<<2)|2,{77,95,0}}, +/* 53523 */ {(13<<2)|2,{77,95,0}}, +/* 53524 */ {(13<<2)|2,{77,95,0}}, +/* 53525 */ {(13<<2)|2,{77,95,0}}, +/* 53526 */ {(13<<2)|2,{77,95,0}}, +/* 53527 */ {(13<<2)|2,{77,95,0}}, +/* 53528 */ {(13<<2)|2,{77,98,0}}, +/* 53529 */ {(13<<2)|2,{77,98,0}}, +/* 53530 */ {(13<<2)|2,{77,98,0}}, +/* 53531 */ {(13<<2)|2,{77,98,0}}, +/* 53532 */ {(13<<2)|2,{77,98,0}}, +/* 53533 */ {(13<<2)|2,{77,98,0}}, +/* 53534 */ {(13<<2)|2,{77,98,0}}, +/* 53535 */ {(13<<2)|2,{77,98,0}}, +/* 53536 */ {(13<<2)|2,{77,100,0}}, +/* 53537 */ {(13<<2)|2,{77,100,0}}, +/* 53538 */ {(13<<2)|2,{77,100,0}}, +/* 53539 */ {(13<<2)|2,{77,100,0}}, +/* 53540 */ {(13<<2)|2,{77,100,0}}, +/* 53541 */ {(13<<2)|2,{77,100,0}}, +/* 53542 */ {(13<<2)|2,{77,100,0}}, +/* 53543 */ {(13<<2)|2,{77,100,0}}, +/* 53544 */ {(13<<2)|2,{77,102,0}}, +/* 53545 */ {(13<<2)|2,{77,102,0}}, +/* 53546 */ {(13<<2)|2,{77,102,0}}, +/* 53547 */ {(13<<2)|2,{77,102,0}}, +/* 53548 */ {(13<<2)|2,{77,102,0}}, +/* 53549 */ {(13<<2)|2,{77,102,0}}, +/* 53550 */ {(13<<2)|2,{77,102,0}}, +/* 53551 */ {(13<<2)|2,{77,102,0}}, +/* 53552 */ {(13<<2)|2,{77,103,0}}, +/* 53553 */ {(13<<2)|2,{77,103,0}}, +/* 53554 */ {(13<<2)|2,{77,103,0}}, +/* 53555 */ {(13<<2)|2,{77,103,0}}, +/* 53556 */ {(13<<2)|2,{77,103,0}}, +/* 53557 */ {(13<<2)|2,{77,103,0}}, +/* 53558 */ {(13<<2)|2,{77,103,0}}, +/* 53559 */ {(13<<2)|2,{77,103,0}}, +/* 53560 */ {(13<<2)|2,{77,104,0}}, +/* 53561 */ {(13<<2)|2,{77,104,0}}, +/* 53562 */ {(13<<2)|2,{77,104,0}}, +/* 53563 */ {(13<<2)|2,{77,104,0}}, +/* 53564 */ {(13<<2)|2,{77,104,0}}, +/* 53565 */ {(13<<2)|2,{77,104,0}}, +/* 53566 */ {(13<<2)|2,{77,104,0}}, +/* 53567 */ {(13<<2)|2,{77,104,0}}, +/* 53568 */ {(13<<2)|2,{77,108,0}}, +/* 53569 */ {(13<<2)|2,{77,108,0}}, +/* 53570 */ {(13<<2)|2,{77,108,0}}, +/* 53571 */ {(13<<2)|2,{77,108,0}}, +/* 53572 */ {(13<<2)|2,{77,108,0}}, +/* 53573 */ {(13<<2)|2,{77,108,0}}, +/* 53574 */ {(13<<2)|2,{77,108,0}}, +/* 53575 */ {(13<<2)|2,{77,108,0}}, +/* 53576 */ {(13<<2)|2,{77,109,0}}, +/* 53577 */ {(13<<2)|2,{77,109,0}}, +/* 53578 */ {(13<<2)|2,{77,109,0}}, +/* 53579 */ {(13<<2)|2,{77,109,0}}, +/* 53580 */ {(13<<2)|2,{77,109,0}}, +/* 53581 */ {(13<<2)|2,{77,109,0}}, +/* 53582 */ {(13<<2)|2,{77,109,0}}, +/* 53583 */ {(13<<2)|2,{77,109,0}}, +/* 53584 */ {(13<<2)|2,{77,110,0}}, +/* 53585 */ {(13<<2)|2,{77,110,0}}, +/* 53586 */ {(13<<2)|2,{77,110,0}}, +/* 53587 */ {(13<<2)|2,{77,110,0}}, +/* 53588 */ {(13<<2)|2,{77,110,0}}, +/* 53589 */ {(13<<2)|2,{77,110,0}}, +/* 53590 */ {(13<<2)|2,{77,110,0}}, +/* 53591 */ {(13<<2)|2,{77,110,0}}, +/* 53592 */ {(13<<2)|2,{77,112,0}}, +/* 53593 */ {(13<<2)|2,{77,112,0}}, +/* 53594 */ {(13<<2)|2,{77,112,0}}, +/* 53595 */ {(13<<2)|2,{77,112,0}}, +/* 53596 */ {(13<<2)|2,{77,112,0}}, +/* 53597 */ {(13<<2)|2,{77,112,0}}, +/* 53598 */ {(13<<2)|2,{77,112,0}}, +/* 53599 */ {(13<<2)|2,{77,112,0}}, +/* 53600 */ {(13<<2)|2,{77,114,0}}, +/* 53601 */ {(13<<2)|2,{77,114,0}}, +/* 53602 */ {(13<<2)|2,{77,114,0}}, +/* 53603 */ {(13<<2)|2,{77,114,0}}, +/* 53604 */ {(13<<2)|2,{77,114,0}}, +/* 53605 */ {(13<<2)|2,{77,114,0}}, +/* 53606 */ {(13<<2)|2,{77,114,0}}, +/* 53607 */ {(13<<2)|2,{77,114,0}}, +/* 53608 */ {(13<<2)|2,{77,117,0}}, +/* 53609 */ {(13<<2)|2,{77,117,0}}, +/* 53610 */ {(13<<2)|2,{77,117,0}}, +/* 53611 */ {(13<<2)|2,{77,117,0}}, +/* 53612 */ {(13<<2)|2,{77,117,0}}, +/* 53613 */ {(13<<2)|2,{77,117,0}}, +/* 53614 */ {(13<<2)|2,{77,117,0}}, +/* 53615 */ {(13<<2)|2,{77,117,0}}, +/* 53616 */ {(14<<2)|2,{77,58,0}}, +/* 53617 */ {(14<<2)|2,{77,58,0}}, +/* 53618 */ {(14<<2)|2,{77,58,0}}, +/* 53619 */ {(14<<2)|2,{77,58,0}}, +/* 53620 */ {(14<<2)|2,{77,66,0}}, +/* 53621 */ {(14<<2)|2,{77,66,0}}, +/* 53622 */ {(14<<2)|2,{77,66,0}}, +/* 53623 */ {(14<<2)|2,{77,66,0}}, +/* 53624 */ {(14<<2)|2,{77,67,0}}, +/* 53625 */ {(14<<2)|2,{77,67,0}}, +/* 53626 */ {(14<<2)|2,{77,67,0}}, +/* 53627 */ {(14<<2)|2,{77,67,0}}, +/* 53628 */ {(14<<2)|2,{77,68,0}}, +/* 53629 */ {(14<<2)|2,{77,68,0}}, +/* 53630 */ {(14<<2)|2,{77,68,0}}, +/* 53631 */ {(14<<2)|2,{77,68,0}}, +/* 53632 */ {(14<<2)|2,{77,69,0}}, +/* 53633 */ {(14<<2)|2,{77,69,0}}, +/* 53634 */ {(14<<2)|2,{77,69,0}}, +/* 53635 */ {(14<<2)|2,{77,69,0}}, +/* 53636 */ {(14<<2)|2,{77,70,0}}, +/* 53637 */ {(14<<2)|2,{77,70,0}}, +/* 53638 */ {(14<<2)|2,{77,70,0}}, +/* 53639 */ {(14<<2)|2,{77,70,0}}, +/* 53640 */ {(14<<2)|2,{77,71,0}}, +/* 53641 */ {(14<<2)|2,{77,71,0}}, +/* 53642 */ {(14<<2)|2,{77,71,0}}, +/* 53643 */ {(14<<2)|2,{77,71,0}}, +/* 53644 */ {(14<<2)|2,{77,72,0}}, +/* 53645 */ {(14<<2)|2,{77,72,0}}, +/* 53646 */ {(14<<2)|2,{77,72,0}}, +/* 53647 */ {(14<<2)|2,{77,72,0}}, +/* 53648 */ {(14<<2)|2,{77,73,0}}, +/* 53649 */ {(14<<2)|2,{77,73,0}}, +/* 53650 */ {(14<<2)|2,{77,73,0}}, +/* 53651 */ {(14<<2)|2,{77,73,0}}, +/* 53652 */ {(14<<2)|2,{77,74,0}}, +/* 53653 */ {(14<<2)|2,{77,74,0}}, +/* 53654 */ {(14<<2)|2,{77,74,0}}, +/* 53655 */ {(14<<2)|2,{77,74,0}}, +/* 53656 */ {(14<<2)|2,{77,75,0}}, +/* 53657 */ {(14<<2)|2,{77,75,0}}, +/* 53658 */ {(14<<2)|2,{77,75,0}}, +/* 53659 */ {(14<<2)|2,{77,75,0}}, +/* 53660 */ {(14<<2)|2,{77,76,0}}, +/* 53661 */ {(14<<2)|2,{77,76,0}}, +/* 53662 */ {(14<<2)|2,{77,76,0}}, +/* 53663 */ {(14<<2)|2,{77,76,0}}, +/* 53664 */ {(14<<2)|2,{77,77,0}}, +/* 53665 */ {(14<<2)|2,{77,77,0}}, +/* 53666 */ {(14<<2)|2,{77,77,0}}, +/* 53667 */ {(14<<2)|2,{77,77,0}}, +/* 53668 */ {(14<<2)|2,{77,78,0}}, +/* 53669 */ {(14<<2)|2,{77,78,0}}, +/* 53670 */ {(14<<2)|2,{77,78,0}}, +/* 53671 */ {(14<<2)|2,{77,78,0}}, +/* 53672 */ {(14<<2)|2,{77,79,0}}, +/* 53673 */ {(14<<2)|2,{77,79,0}}, +/* 53674 */ {(14<<2)|2,{77,79,0}}, +/* 53675 */ {(14<<2)|2,{77,79,0}}, +/* 53676 */ {(14<<2)|2,{77,80,0}}, +/* 53677 */ {(14<<2)|2,{77,80,0}}, +/* 53678 */ {(14<<2)|2,{77,80,0}}, +/* 53679 */ {(14<<2)|2,{77,80,0}}, +/* 53680 */ {(14<<2)|2,{77,81,0}}, +/* 53681 */ {(14<<2)|2,{77,81,0}}, +/* 53682 */ {(14<<2)|2,{77,81,0}}, +/* 53683 */ {(14<<2)|2,{77,81,0}}, +/* 53684 */ {(14<<2)|2,{77,82,0}}, +/* 53685 */ {(14<<2)|2,{77,82,0}}, +/* 53686 */ {(14<<2)|2,{77,82,0}}, +/* 53687 */ {(14<<2)|2,{77,82,0}}, +/* 53688 */ {(14<<2)|2,{77,83,0}}, +/* 53689 */ {(14<<2)|2,{77,83,0}}, +/* 53690 */ {(14<<2)|2,{77,83,0}}, +/* 53691 */ {(14<<2)|2,{77,83,0}}, +/* 53692 */ {(14<<2)|2,{77,84,0}}, +/* 53693 */ {(14<<2)|2,{77,84,0}}, +/* 53694 */ {(14<<2)|2,{77,84,0}}, +/* 53695 */ {(14<<2)|2,{77,84,0}}, +/* 53696 */ {(14<<2)|2,{77,85,0}}, +/* 53697 */ {(14<<2)|2,{77,85,0}}, +/* 53698 */ {(14<<2)|2,{77,85,0}}, +/* 53699 */ {(14<<2)|2,{77,85,0}}, +/* 53700 */ {(14<<2)|2,{77,86,0}}, +/* 53701 */ {(14<<2)|2,{77,86,0}}, +/* 53702 */ {(14<<2)|2,{77,86,0}}, +/* 53703 */ {(14<<2)|2,{77,86,0}}, +/* 53704 */ {(14<<2)|2,{77,87,0}}, +/* 53705 */ {(14<<2)|2,{77,87,0}}, +/* 53706 */ {(14<<2)|2,{77,87,0}}, +/* 53707 */ {(14<<2)|2,{77,87,0}}, +/* 53708 */ {(14<<2)|2,{77,89,0}}, +/* 53709 */ {(14<<2)|2,{77,89,0}}, +/* 53710 */ {(14<<2)|2,{77,89,0}}, +/* 53711 */ {(14<<2)|2,{77,89,0}}, +/* 53712 */ {(14<<2)|2,{77,106,0}}, +/* 53713 */ {(14<<2)|2,{77,106,0}}, +/* 53714 */ {(14<<2)|2,{77,106,0}}, +/* 53715 */ {(14<<2)|2,{77,106,0}}, +/* 53716 */ {(14<<2)|2,{77,107,0}}, +/* 53717 */ {(14<<2)|2,{77,107,0}}, +/* 53718 */ {(14<<2)|2,{77,107,0}}, +/* 53719 */ {(14<<2)|2,{77,107,0}}, +/* 53720 */ {(14<<2)|2,{77,113,0}}, +/* 53721 */ {(14<<2)|2,{77,113,0}}, +/* 53722 */ {(14<<2)|2,{77,113,0}}, +/* 53723 */ {(14<<2)|2,{77,113,0}}, +/* 53724 */ {(14<<2)|2,{77,118,0}}, +/* 53725 */ {(14<<2)|2,{77,118,0}}, +/* 53726 */ {(14<<2)|2,{77,118,0}}, +/* 53727 */ {(14<<2)|2,{77,118,0}}, +/* 53728 */ {(14<<2)|2,{77,119,0}}, +/* 53729 */ {(14<<2)|2,{77,119,0}}, +/* 53730 */ {(14<<2)|2,{77,119,0}}, +/* 53731 */ {(14<<2)|2,{77,119,0}}, +/* 53732 */ {(14<<2)|2,{77,120,0}}, +/* 53733 */ {(14<<2)|2,{77,120,0}}, +/* 53734 */ {(14<<2)|2,{77,120,0}}, +/* 53735 */ {(14<<2)|2,{77,120,0}}, +/* 53736 */ {(14<<2)|2,{77,121,0}}, +/* 53737 */ {(14<<2)|2,{77,121,0}}, +/* 53738 */ {(14<<2)|2,{77,121,0}}, +/* 53739 */ {(14<<2)|2,{77,121,0}}, +/* 53740 */ {(14<<2)|2,{77,122,0}}, +/* 53741 */ {(14<<2)|2,{77,122,0}}, +/* 53742 */ {(14<<2)|2,{77,122,0}}, +/* 53743 */ {(14<<2)|2,{77,122,0}}, +/* 53744 */ {(15<<2)|2,{77,38,0}}, +/* 53745 */ {(15<<2)|2,{77,38,0}}, +/* 53746 */ {(15<<2)|2,{77,42,0}}, +/* 53747 */ {(15<<2)|2,{77,42,0}}, +/* 53748 */ {(15<<2)|2,{77,44,0}}, +/* 53749 */ {(15<<2)|2,{77,44,0}}, +/* 53750 */ {(15<<2)|2,{77,59,0}}, +/* 53751 */ {(15<<2)|2,{77,59,0}}, +/* 53752 */ {(15<<2)|2,{77,88,0}}, +/* 53753 */ {(15<<2)|2,{77,88,0}}, +/* 53754 */ {(15<<2)|2,{77,90,0}}, +/* 53755 */ {(15<<2)|2,{77,90,0}}, +/* 53756 */ {(7<<2)|1,{77,0,0}}, +/* 53757 */ {(7<<2)|1,{77,0,0}}, +/* 53758 */ {(7<<2)|1,{77,0,0}}, +/* 53759 */ {(7<<2)|1,{77,0,0}}, +/* 53760 */ {(12<<2)|2,{78,48,0}}, +/* 53761 */ {(12<<2)|2,{78,48,0}}, +/* 53762 */ {(12<<2)|2,{78,48,0}}, +/* 53763 */ {(12<<2)|2,{78,48,0}}, +/* 53764 */ {(12<<2)|2,{78,48,0}}, +/* 53765 */ {(12<<2)|2,{78,48,0}}, +/* 53766 */ {(12<<2)|2,{78,48,0}}, +/* 53767 */ {(12<<2)|2,{78,48,0}}, +/* 53768 */ {(12<<2)|2,{78,48,0}}, +/* 53769 */ {(12<<2)|2,{78,48,0}}, +/* 53770 */ {(12<<2)|2,{78,48,0}}, +/* 53771 */ {(12<<2)|2,{78,48,0}}, +/* 53772 */ {(12<<2)|2,{78,48,0}}, +/* 53773 */ {(12<<2)|2,{78,48,0}}, +/* 53774 */ {(12<<2)|2,{78,48,0}}, +/* 53775 */ {(12<<2)|2,{78,48,0}}, +/* 53776 */ {(12<<2)|2,{78,49,0}}, +/* 53777 */ {(12<<2)|2,{78,49,0}}, +/* 53778 */ {(12<<2)|2,{78,49,0}}, +/* 53779 */ {(12<<2)|2,{78,49,0}}, +/* 53780 */ {(12<<2)|2,{78,49,0}}, +/* 53781 */ {(12<<2)|2,{78,49,0}}, +/* 53782 */ {(12<<2)|2,{78,49,0}}, +/* 53783 */ {(12<<2)|2,{78,49,0}}, +/* 53784 */ {(12<<2)|2,{78,49,0}}, +/* 53785 */ {(12<<2)|2,{78,49,0}}, +/* 53786 */ {(12<<2)|2,{78,49,0}}, +/* 53787 */ {(12<<2)|2,{78,49,0}}, +/* 53788 */ {(12<<2)|2,{78,49,0}}, +/* 53789 */ {(12<<2)|2,{78,49,0}}, +/* 53790 */ {(12<<2)|2,{78,49,0}}, +/* 53791 */ {(12<<2)|2,{78,49,0}}, +/* 53792 */ {(12<<2)|2,{78,50,0}}, +/* 53793 */ {(12<<2)|2,{78,50,0}}, +/* 53794 */ {(12<<2)|2,{78,50,0}}, +/* 53795 */ {(12<<2)|2,{78,50,0}}, +/* 53796 */ {(12<<2)|2,{78,50,0}}, +/* 53797 */ {(12<<2)|2,{78,50,0}}, +/* 53798 */ {(12<<2)|2,{78,50,0}}, +/* 53799 */ {(12<<2)|2,{78,50,0}}, +/* 53800 */ {(12<<2)|2,{78,50,0}}, +/* 53801 */ {(12<<2)|2,{78,50,0}}, +/* 53802 */ {(12<<2)|2,{78,50,0}}, +/* 53803 */ {(12<<2)|2,{78,50,0}}, +/* 53804 */ {(12<<2)|2,{78,50,0}}, +/* 53805 */ {(12<<2)|2,{78,50,0}}, +/* 53806 */ {(12<<2)|2,{78,50,0}}, +/* 53807 */ {(12<<2)|2,{78,50,0}}, +/* 53808 */ {(12<<2)|2,{78,97,0}}, +/* 53809 */ {(12<<2)|2,{78,97,0}}, +/* 53810 */ {(12<<2)|2,{78,97,0}}, +/* 53811 */ {(12<<2)|2,{78,97,0}}, +/* 53812 */ {(12<<2)|2,{78,97,0}}, +/* 53813 */ {(12<<2)|2,{78,97,0}}, +/* 53814 */ {(12<<2)|2,{78,97,0}}, +/* 53815 */ {(12<<2)|2,{78,97,0}}, +/* 53816 */ {(12<<2)|2,{78,97,0}}, +/* 53817 */ {(12<<2)|2,{78,97,0}}, +/* 53818 */ {(12<<2)|2,{78,97,0}}, +/* 53819 */ {(12<<2)|2,{78,97,0}}, +/* 53820 */ {(12<<2)|2,{78,97,0}}, +/* 53821 */ {(12<<2)|2,{78,97,0}}, +/* 53822 */ {(12<<2)|2,{78,97,0}}, +/* 53823 */ {(12<<2)|2,{78,97,0}}, +/* 53824 */ {(12<<2)|2,{78,99,0}}, +/* 53825 */ {(12<<2)|2,{78,99,0}}, +/* 53826 */ {(12<<2)|2,{78,99,0}}, +/* 53827 */ {(12<<2)|2,{78,99,0}}, +/* 53828 */ {(12<<2)|2,{78,99,0}}, +/* 53829 */ {(12<<2)|2,{78,99,0}}, +/* 53830 */ {(12<<2)|2,{78,99,0}}, +/* 53831 */ {(12<<2)|2,{78,99,0}}, +/* 53832 */ {(12<<2)|2,{78,99,0}}, +/* 53833 */ {(12<<2)|2,{78,99,0}}, +/* 53834 */ {(12<<2)|2,{78,99,0}}, +/* 53835 */ {(12<<2)|2,{78,99,0}}, +/* 53836 */ {(12<<2)|2,{78,99,0}}, +/* 53837 */ {(12<<2)|2,{78,99,0}}, +/* 53838 */ {(12<<2)|2,{78,99,0}}, +/* 53839 */ {(12<<2)|2,{78,99,0}}, +/* 53840 */ {(12<<2)|2,{78,101,0}}, +/* 53841 */ {(12<<2)|2,{78,101,0}}, +/* 53842 */ {(12<<2)|2,{78,101,0}}, +/* 53843 */ {(12<<2)|2,{78,101,0}}, +/* 53844 */ {(12<<2)|2,{78,101,0}}, +/* 53845 */ {(12<<2)|2,{78,101,0}}, +/* 53846 */ {(12<<2)|2,{78,101,0}}, +/* 53847 */ {(12<<2)|2,{78,101,0}}, +/* 53848 */ {(12<<2)|2,{78,101,0}}, +/* 53849 */ {(12<<2)|2,{78,101,0}}, +/* 53850 */ {(12<<2)|2,{78,101,0}}, +/* 53851 */ {(12<<2)|2,{78,101,0}}, +/* 53852 */ {(12<<2)|2,{78,101,0}}, +/* 53853 */ {(12<<2)|2,{78,101,0}}, +/* 53854 */ {(12<<2)|2,{78,101,0}}, +/* 53855 */ {(12<<2)|2,{78,101,0}}, +/* 53856 */ {(12<<2)|2,{78,105,0}}, +/* 53857 */ {(12<<2)|2,{78,105,0}}, +/* 53858 */ {(12<<2)|2,{78,105,0}}, +/* 53859 */ {(12<<2)|2,{78,105,0}}, +/* 53860 */ {(12<<2)|2,{78,105,0}}, +/* 53861 */ {(12<<2)|2,{78,105,0}}, +/* 53862 */ {(12<<2)|2,{78,105,0}}, +/* 53863 */ {(12<<2)|2,{78,105,0}}, +/* 53864 */ {(12<<2)|2,{78,105,0}}, +/* 53865 */ {(12<<2)|2,{78,105,0}}, +/* 53866 */ {(12<<2)|2,{78,105,0}}, +/* 53867 */ {(12<<2)|2,{78,105,0}}, +/* 53868 */ {(12<<2)|2,{78,105,0}}, +/* 53869 */ {(12<<2)|2,{78,105,0}}, +/* 53870 */ {(12<<2)|2,{78,105,0}}, +/* 53871 */ {(12<<2)|2,{78,105,0}}, +/* 53872 */ {(12<<2)|2,{78,111,0}}, +/* 53873 */ {(12<<2)|2,{78,111,0}}, +/* 53874 */ {(12<<2)|2,{78,111,0}}, +/* 53875 */ {(12<<2)|2,{78,111,0}}, +/* 53876 */ {(12<<2)|2,{78,111,0}}, +/* 53877 */ {(12<<2)|2,{78,111,0}}, +/* 53878 */ {(12<<2)|2,{78,111,0}}, +/* 53879 */ {(12<<2)|2,{78,111,0}}, +/* 53880 */ {(12<<2)|2,{78,111,0}}, +/* 53881 */ {(12<<2)|2,{78,111,0}}, +/* 53882 */ {(12<<2)|2,{78,111,0}}, +/* 53883 */ {(12<<2)|2,{78,111,0}}, +/* 53884 */ {(12<<2)|2,{78,111,0}}, +/* 53885 */ {(12<<2)|2,{78,111,0}}, +/* 53886 */ {(12<<2)|2,{78,111,0}}, +/* 53887 */ {(12<<2)|2,{78,111,0}}, +/* 53888 */ {(12<<2)|2,{78,115,0}}, +/* 53889 */ {(12<<2)|2,{78,115,0}}, +/* 53890 */ {(12<<2)|2,{78,115,0}}, +/* 53891 */ {(12<<2)|2,{78,115,0}}, +/* 53892 */ {(12<<2)|2,{78,115,0}}, +/* 53893 */ {(12<<2)|2,{78,115,0}}, +/* 53894 */ {(12<<2)|2,{78,115,0}}, +/* 53895 */ {(12<<2)|2,{78,115,0}}, +/* 53896 */ {(12<<2)|2,{78,115,0}}, +/* 53897 */ {(12<<2)|2,{78,115,0}}, +/* 53898 */ {(12<<2)|2,{78,115,0}}, +/* 53899 */ {(12<<2)|2,{78,115,0}}, +/* 53900 */ {(12<<2)|2,{78,115,0}}, +/* 53901 */ {(12<<2)|2,{78,115,0}}, +/* 53902 */ {(12<<2)|2,{78,115,0}}, +/* 53903 */ {(12<<2)|2,{78,115,0}}, +/* 53904 */ {(12<<2)|2,{78,116,0}}, +/* 53905 */ {(12<<2)|2,{78,116,0}}, +/* 53906 */ {(12<<2)|2,{78,116,0}}, +/* 53907 */ {(12<<2)|2,{78,116,0}}, +/* 53908 */ {(12<<2)|2,{78,116,0}}, +/* 53909 */ {(12<<2)|2,{78,116,0}}, +/* 53910 */ {(12<<2)|2,{78,116,0}}, +/* 53911 */ {(12<<2)|2,{78,116,0}}, +/* 53912 */ {(12<<2)|2,{78,116,0}}, +/* 53913 */ {(12<<2)|2,{78,116,0}}, +/* 53914 */ {(12<<2)|2,{78,116,0}}, +/* 53915 */ {(12<<2)|2,{78,116,0}}, +/* 53916 */ {(12<<2)|2,{78,116,0}}, +/* 53917 */ {(12<<2)|2,{78,116,0}}, +/* 53918 */ {(12<<2)|2,{78,116,0}}, +/* 53919 */ {(12<<2)|2,{78,116,0}}, +/* 53920 */ {(13<<2)|2,{78,32,0}}, +/* 53921 */ {(13<<2)|2,{78,32,0}}, +/* 53922 */ {(13<<2)|2,{78,32,0}}, +/* 53923 */ {(13<<2)|2,{78,32,0}}, +/* 53924 */ {(13<<2)|2,{78,32,0}}, +/* 53925 */ {(13<<2)|2,{78,32,0}}, +/* 53926 */ {(13<<2)|2,{78,32,0}}, +/* 53927 */ {(13<<2)|2,{78,32,0}}, +/* 53928 */ {(13<<2)|2,{78,37,0}}, +/* 53929 */ {(13<<2)|2,{78,37,0}}, +/* 53930 */ {(13<<2)|2,{78,37,0}}, +/* 53931 */ {(13<<2)|2,{78,37,0}}, +/* 53932 */ {(13<<2)|2,{78,37,0}}, +/* 53933 */ {(13<<2)|2,{78,37,0}}, +/* 53934 */ {(13<<2)|2,{78,37,0}}, +/* 53935 */ {(13<<2)|2,{78,37,0}}, +/* 53936 */ {(13<<2)|2,{78,45,0}}, +/* 53937 */ {(13<<2)|2,{78,45,0}}, +/* 53938 */ {(13<<2)|2,{78,45,0}}, +/* 53939 */ {(13<<2)|2,{78,45,0}}, +/* 53940 */ {(13<<2)|2,{78,45,0}}, +/* 53941 */ {(13<<2)|2,{78,45,0}}, +/* 53942 */ {(13<<2)|2,{78,45,0}}, +/* 53943 */ {(13<<2)|2,{78,45,0}}, +/* 53944 */ {(13<<2)|2,{78,46,0}}, +/* 53945 */ {(13<<2)|2,{78,46,0}}, +/* 53946 */ {(13<<2)|2,{78,46,0}}, +/* 53947 */ {(13<<2)|2,{78,46,0}}, +/* 53948 */ {(13<<2)|2,{78,46,0}}, +/* 53949 */ {(13<<2)|2,{78,46,0}}, +/* 53950 */ {(13<<2)|2,{78,46,0}}, +/* 53951 */ {(13<<2)|2,{78,46,0}}, +/* 53952 */ {(13<<2)|2,{78,47,0}}, +/* 53953 */ {(13<<2)|2,{78,47,0}}, +/* 53954 */ {(13<<2)|2,{78,47,0}}, +/* 53955 */ {(13<<2)|2,{78,47,0}}, +/* 53956 */ {(13<<2)|2,{78,47,0}}, +/* 53957 */ {(13<<2)|2,{78,47,0}}, +/* 53958 */ {(13<<2)|2,{78,47,0}}, +/* 53959 */ {(13<<2)|2,{78,47,0}}, +/* 53960 */ {(13<<2)|2,{78,51,0}}, +/* 53961 */ {(13<<2)|2,{78,51,0}}, +/* 53962 */ {(13<<2)|2,{78,51,0}}, +/* 53963 */ {(13<<2)|2,{78,51,0}}, +/* 53964 */ {(13<<2)|2,{78,51,0}}, +/* 53965 */ {(13<<2)|2,{78,51,0}}, +/* 53966 */ {(13<<2)|2,{78,51,0}}, +/* 53967 */ {(13<<2)|2,{78,51,0}}, +/* 53968 */ {(13<<2)|2,{78,52,0}}, +/* 53969 */ {(13<<2)|2,{78,52,0}}, +/* 53970 */ {(13<<2)|2,{78,52,0}}, +/* 53971 */ {(13<<2)|2,{78,52,0}}, +/* 53972 */ {(13<<2)|2,{78,52,0}}, +/* 53973 */ {(13<<2)|2,{78,52,0}}, +/* 53974 */ {(13<<2)|2,{78,52,0}}, +/* 53975 */ {(13<<2)|2,{78,52,0}}, +/* 53976 */ {(13<<2)|2,{78,53,0}}, +/* 53977 */ {(13<<2)|2,{78,53,0}}, +/* 53978 */ {(13<<2)|2,{78,53,0}}, +/* 53979 */ {(13<<2)|2,{78,53,0}}, +/* 53980 */ {(13<<2)|2,{78,53,0}}, +/* 53981 */ {(13<<2)|2,{78,53,0}}, +/* 53982 */ {(13<<2)|2,{78,53,0}}, +/* 53983 */ {(13<<2)|2,{78,53,0}}, +/* 53984 */ {(13<<2)|2,{78,54,0}}, +/* 53985 */ {(13<<2)|2,{78,54,0}}, +/* 53986 */ {(13<<2)|2,{78,54,0}}, +/* 53987 */ {(13<<2)|2,{78,54,0}}, +/* 53988 */ {(13<<2)|2,{78,54,0}}, +/* 53989 */ {(13<<2)|2,{78,54,0}}, +/* 53990 */ {(13<<2)|2,{78,54,0}}, +/* 53991 */ {(13<<2)|2,{78,54,0}}, +/* 53992 */ {(13<<2)|2,{78,55,0}}, +/* 53993 */ {(13<<2)|2,{78,55,0}}, +/* 53994 */ {(13<<2)|2,{78,55,0}}, +/* 53995 */ {(13<<2)|2,{78,55,0}}, +/* 53996 */ {(13<<2)|2,{78,55,0}}, +/* 53997 */ {(13<<2)|2,{78,55,0}}, +/* 53998 */ {(13<<2)|2,{78,55,0}}, +/* 53999 */ {(13<<2)|2,{78,55,0}}, +/* 54000 */ {(13<<2)|2,{78,56,0}}, +/* 54001 */ {(13<<2)|2,{78,56,0}}, +/* 54002 */ {(13<<2)|2,{78,56,0}}, +/* 54003 */ {(13<<2)|2,{78,56,0}}, +/* 54004 */ {(13<<2)|2,{78,56,0}}, +/* 54005 */ {(13<<2)|2,{78,56,0}}, +/* 54006 */ {(13<<2)|2,{78,56,0}}, +/* 54007 */ {(13<<2)|2,{78,56,0}}, +/* 54008 */ {(13<<2)|2,{78,57,0}}, +/* 54009 */ {(13<<2)|2,{78,57,0}}, +/* 54010 */ {(13<<2)|2,{78,57,0}}, +/* 54011 */ {(13<<2)|2,{78,57,0}}, +/* 54012 */ {(13<<2)|2,{78,57,0}}, +/* 54013 */ {(13<<2)|2,{78,57,0}}, +/* 54014 */ {(13<<2)|2,{78,57,0}}, +/* 54015 */ {(13<<2)|2,{78,57,0}}, +/* 54016 */ {(13<<2)|2,{78,61,0}}, +/* 54017 */ {(13<<2)|2,{78,61,0}}, +/* 54018 */ {(13<<2)|2,{78,61,0}}, +/* 54019 */ {(13<<2)|2,{78,61,0}}, +/* 54020 */ {(13<<2)|2,{78,61,0}}, +/* 54021 */ {(13<<2)|2,{78,61,0}}, +/* 54022 */ {(13<<2)|2,{78,61,0}}, +/* 54023 */ {(13<<2)|2,{78,61,0}}, +/* 54024 */ {(13<<2)|2,{78,65,0}}, +/* 54025 */ {(13<<2)|2,{78,65,0}}, +/* 54026 */ {(13<<2)|2,{78,65,0}}, +/* 54027 */ {(13<<2)|2,{78,65,0}}, +/* 54028 */ {(13<<2)|2,{78,65,0}}, +/* 54029 */ {(13<<2)|2,{78,65,0}}, +/* 54030 */ {(13<<2)|2,{78,65,0}}, +/* 54031 */ {(13<<2)|2,{78,65,0}}, +/* 54032 */ {(13<<2)|2,{78,95,0}}, +/* 54033 */ {(13<<2)|2,{78,95,0}}, +/* 54034 */ {(13<<2)|2,{78,95,0}}, +/* 54035 */ {(13<<2)|2,{78,95,0}}, +/* 54036 */ {(13<<2)|2,{78,95,0}}, +/* 54037 */ {(13<<2)|2,{78,95,0}}, +/* 54038 */ {(13<<2)|2,{78,95,0}}, +/* 54039 */ {(13<<2)|2,{78,95,0}}, +/* 54040 */ {(13<<2)|2,{78,98,0}}, +/* 54041 */ {(13<<2)|2,{78,98,0}}, +/* 54042 */ {(13<<2)|2,{78,98,0}}, +/* 54043 */ {(13<<2)|2,{78,98,0}}, +/* 54044 */ {(13<<2)|2,{78,98,0}}, +/* 54045 */ {(13<<2)|2,{78,98,0}}, +/* 54046 */ {(13<<2)|2,{78,98,0}}, +/* 54047 */ {(13<<2)|2,{78,98,0}}, +/* 54048 */ {(13<<2)|2,{78,100,0}}, +/* 54049 */ {(13<<2)|2,{78,100,0}}, +/* 54050 */ {(13<<2)|2,{78,100,0}}, +/* 54051 */ {(13<<2)|2,{78,100,0}}, +/* 54052 */ {(13<<2)|2,{78,100,0}}, +/* 54053 */ {(13<<2)|2,{78,100,0}}, +/* 54054 */ {(13<<2)|2,{78,100,0}}, +/* 54055 */ {(13<<2)|2,{78,100,0}}, +/* 54056 */ {(13<<2)|2,{78,102,0}}, +/* 54057 */ {(13<<2)|2,{78,102,0}}, +/* 54058 */ {(13<<2)|2,{78,102,0}}, +/* 54059 */ {(13<<2)|2,{78,102,0}}, +/* 54060 */ {(13<<2)|2,{78,102,0}}, +/* 54061 */ {(13<<2)|2,{78,102,0}}, +/* 54062 */ {(13<<2)|2,{78,102,0}}, +/* 54063 */ {(13<<2)|2,{78,102,0}}, +/* 54064 */ {(13<<2)|2,{78,103,0}}, +/* 54065 */ {(13<<2)|2,{78,103,0}}, +/* 54066 */ {(13<<2)|2,{78,103,0}}, +/* 54067 */ {(13<<2)|2,{78,103,0}}, +/* 54068 */ {(13<<2)|2,{78,103,0}}, +/* 54069 */ {(13<<2)|2,{78,103,0}}, +/* 54070 */ {(13<<2)|2,{78,103,0}}, +/* 54071 */ {(13<<2)|2,{78,103,0}}, +/* 54072 */ {(13<<2)|2,{78,104,0}}, +/* 54073 */ {(13<<2)|2,{78,104,0}}, +/* 54074 */ {(13<<2)|2,{78,104,0}}, +/* 54075 */ {(13<<2)|2,{78,104,0}}, +/* 54076 */ {(13<<2)|2,{78,104,0}}, +/* 54077 */ {(13<<2)|2,{78,104,0}}, +/* 54078 */ {(13<<2)|2,{78,104,0}}, +/* 54079 */ {(13<<2)|2,{78,104,0}}, +/* 54080 */ {(13<<2)|2,{78,108,0}}, +/* 54081 */ {(13<<2)|2,{78,108,0}}, +/* 54082 */ {(13<<2)|2,{78,108,0}}, +/* 54083 */ {(13<<2)|2,{78,108,0}}, +/* 54084 */ {(13<<2)|2,{78,108,0}}, +/* 54085 */ {(13<<2)|2,{78,108,0}}, +/* 54086 */ {(13<<2)|2,{78,108,0}}, +/* 54087 */ {(13<<2)|2,{78,108,0}}, +/* 54088 */ {(13<<2)|2,{78,109,0}}, +/* 54089 */ {(13<<2)|2,{78,109,0}}, +/* 54090 */ {(13<<2)|2,{78,109,0}}, +/* 54091 */ {(13<<2)|2,{78,109,0}}, +/* 54092 */ {(13<<2)|2,{78,109,0}}, +/* 54093 */ {(13<<2)|2,{78,109,0}}, +/* 54094 */ {(13<<2)|2,{78,109,0}}, +/* 54095 */ {(13<<2)|2,{78,109,0}}, +/* 54096 */ {(13<<2)|2,{78,110,0}}, +/* 54097 */ {(13<<2)|2,{78,110,0}}, +/* 54098 */ {(13<<2)|2,{78,110,0}}, +/* 54099 */ {(13<<2)|2,{78,110,0}}, +/* 54100 */ {(13<<2)|2,{78,110,0}}, +/* 54101 */ {(13<<2)|2,{78,110,0}}, +/* 54102 */ {(13<<2)|2,{78,110,0}}, +/* 54103 */ {(13<<2)|2,{78,110,0}}, +/* 54104 */ {(13<<2)|2,{78,112,0}}, +/* 54105 */ {(13<<2)|2,{78,112,0}}, +/* 54106 */ {(13<<2)|2,{78,112,0}}, +/* 54107 */ {(13<<2)|2,{78,112,0}}, +/* 54108 */ {(13<<2)|2,{78,112,0}}, +/* 54109 */ {(13<<2)|2,{78,112,0}}, +/* 54110 */ {(13<<2)|2,{78,112,0}}, +/* 54111 */ {(13<<2)|2,{78,112,0}}, +/* 54112 */ {(13<<2)|2,{78,114,0}}, +/* 54113 */ {(13<<2)|2,{78,114,0}}, +/* 54114 */ {(13<<2)|2,{78,114,0}}, +/* 54115 */ {(13<<2)|2,{78,114,0}}, +/* 54116 */ {(13<<2)|2,{78,114,0}}, +/* 54117 */ {(13<<2)|2,{78,114,0}}, +/* 54118 */ {(13<<2)|2,{78,114,0}}, +/* 54119 */ {(13<<2)|2,{78,114,0}}, +/* 54120 */ {(13<<2)|2,{78,117,0}}, +/* 54121 */ {(13<<2)|2,{78,117,0}}, +/* 54122 */ {(13<<2)|2,{78,117,0}}, +/* 54123 */ {(13<<2)|2,{78,117,0}}, +/* 54124 */ {(13<<2)|2,{78,117,0}}, +/* 54125 */ {(13<<2)|2,{78,117,0}}, +/* 54126 */ {(13<<2)|2,{78,117,0}}, +/* 54127 */ {(13<<2)|2,{78,117,0}}, +/* 54128 */ {(14<<2)|2,{78,58,0}}, +/* 54129 */ {(14<<2)|2,{78,58,0}}, +/* 54130 */ {(14<<2)|2,{78,58,0}}, +/* 54131 */ {(14<<2)|2,{78,58,0}}, +/* 54132 */ {(14<<2)|2,{78,66,0}}, +/* 54133 */ {(14<<2)|2,{78,66,0}}, +/* 54134 */ {(14<<2)|2,{78,66,0}}, +/* 54135 */ {(14<<2)|2,{78,66,0}}, +/* 54136 */ {(14<<2)|2,{78,67,0}}, +/* 54137 */ {(14<<2)|2,{78,67,0}}, +/* 54138 */ {(14<<2)|2,{78,67,0}}, +/* 54139 */ {(14<<2)|2,{78,67,0}}, +/* 54140 */ {(14<<2)|2,{78,68,0}}, +/* 54141 */ {(14<<2)|2,{78,68,0}}, +/* 54142 */ {(14<<2)|2,{78,68,0}}, +/* 54143 */ {(14<<2)|2,{78,68,0}}, +/* 54144 */ {(14<<2)|2,{78,69,0}}, +/* 54145 */ {(14<<2)|2,{78,69,0}}, +/* 54146 */ {(14<<2)|2,{78,69,0}}, +/* 54147 */ {(14<<2)|2,{78,69,0}}, +/* 54148 */ {(14<<2)|2,{78,70,0}}, +/* 54149 */ {(14<<2)|2,{78,70,0}}, +/* 54150 */ {(14<<2)|2,{78,70,0}}, +/* 54151 */ {(14<<2)|2,{78,70,0}}, +/* 54152 */ {(14<<2)|2,{78,71,0}}, +/* 54153 */ {(14<<2)|2,{78,71,0}}, +/* 54154 */ {(14<<2)|2,{78,71,0}}, +/* 54155 */ {(14<<2)|2,{78,71,0}}, +/* 54156 */ {(14<<2)|2,{78,72,0}}, +/* 54157 */ {(14<<2)|2,{78,72,0}}, +/* 54158 */ {(14<<2)|2,{78,72,0}}, +/* 54159 */ {(14<<2)|2,{78,72,0}}, +/* 54160 */ {(14<<2)|2,{78,73,0}}, +/* 54161 */ {(14<<2)|2,{78,73,0}}, +/* 54162 */ {(14<<2)|2,{78,73,0}}, +/* 54163 */ {(14<<2)|2,{78,73,0}}, +/* 54164 */ {(14<<2)|2,{78,74,0}}, +/* 54165 */ {(14<<2)|2,{78,74,0}}, +/* 54166 */ {(14<<2)|2,{78,74,0}}, +/* 54167 */ {(14<<2)|2,{78,74,0}}, +/* 54168 */ {(14<<2)|2,{78,75,0}}, +/* 54169 */ {(14<<2)|2,{78,75,0}}, +/* 54170 */ {(14<<2)|2,{78,75,0}}, +/* 54171 */ {(14<<2)|2,{78,75,0}}, +/* 54172 */ {(14<<2)|2,{78,76,0}}, +/* 54173 */ {(14<<2)|2,{78,76,0}}, +/* 54174 */ {(14<<2)|2,{78,76,0}}, +/* 54175 */ {(14<<2)|2,{78,76,0}}, +/* 54176 */ {(14<<2)|2,{78,77,0}}, +/* 54177 */ {(14<<2)|2,{78,77,0}}, +/* 54178 */ {(14<<2)|2,{78,77,0}}, +/* 54179 */ {(14<<2)|2,{78,77,0}}, +/* 54180 */ {(14<<2)|2,{78,78,0}}, +/* 54181 */ {(14<<2)|2,{78,78,0}}, +/* 54182 */ {(14<<2)|2,{78,78,0}}, +/* 54183 */ {(14<<2)|2,{78,78,0}}, +/* 54184 */ {(14<<2)|2,{78,79,0}}, +/* 54185 */ {(14<<2)|2,{78,79,0}}, +/* 54186 */ {(14<<2)|2,{78,79,0}}, +/* 54187 */ {(14<<2)|2,{78,79,0}}, +/* 54188 */ {(14<<2)|2,{78,80,0}}, +/* 54189 */ {(14<<2)|2,{78,80,0}}, +/* 54190 */ {(14<<2)|2,{78,80,0}}, +/* 54191 */ {(14<<2)|2,{78,80,0}}, +/* 54192 */ {(14<<2)|2,{78,81,0}}, +/* 54193 */ {(14<<2)|2,{78,81,0}}, +/* 54194 */ {(14<<2)|2,{78,81,0}}, +/* 54195 */ {(14<<2)|2,{78,81,0}}, +/* 54196 */ {(14<<2)|2,{78,82,0}}, +/* 54197 */ {(14<<2)|2,{78,82,0}}, +/* 54198 */ {(14<<2)|2,{78,82,0}}, +/* 54199 */ {(14<<2)|2,{78,82,0}}, +/* 54200 */ {(14<<2)|2,{78,83,0}}, +/* 54201 */ {(14<<2)|2,{78,83,0}}, +/* 54202 */ {(14<<2)|2,{78,83,0}}, +/* 54203 */ {(14<<2)|2,{78,83,0}}, +/* 54204 */ {(14<<2)|2,{78,84,0}}, +/* 54205 */ {(14<<2)|2,{78,84,0}}, +/* 54206 */ {(14<<2)|2,{78,84,0}}, +/* 54207 */ {(14<<2)|2,{78,84,0}}, +/* 54208 */ {(14<<2)|2,{78,85,0}}, +/* 54209 */ {(14<<2)|2,{78,85,0}}, +/* 54210 */ {(14<<2)|2,{78,85,0}}, +/* 54211 */ {(14<<2)|2,{78,85,0}}, +/* 54212 */ {(14<<2)|2,{78,86,0}}, +/* 54213 */ {(14<<2)|2,{78,86,0}}, +/* 54214 */ {(14<<2)|2,{78,86,0}}, +/* 54215 */ {(14<<2)|2,{78,86,0}}, +/* 54216 */ {(14<<2)|2,{78,87,0}}, +/* 54217 */ {(14<<2)|2,{78,87,0}}, +/* 54218 */ {(14<<2)|2,{78,87,0}}, +/* 54219 */ {(14<<2)|2,{78,87,0}}, +/* 54220 */ {(14<<2)|2,{78,89,0}}, +/* 54221 */ {(14<<2)|2,{78,89,0}}, +/* 54222 */ {(14<<2)|2,{78,89,0}}, +/* 54223 */ {(14<<2)|2,{78,89,0}}, +/* 54224 */ {(14<<2)|2,{78,106,0}}, +/* 54225 */ {(14<<2)|2,{78,106,0}}, +/* 54226 */ {(14<<2)|2,{78,106,0}}, +/* 54227 */ {(14<<2)|2,{78,106,0}}, +/* 54228 */ {(14<<2)|2,{78,107,0}}, +/* 54229 */ {(14<<2)|2,{78,107,0}}, +/* 54230 */ {(14<<2)|2,{78,107,0}}, +/* 54231 */ {(14<<2)|2,{78,107,0}}, +/* 54232 */ {(14<<2)|2,{78,113,0}}, +/* 54233 */ {(14<<2)|2,{78,113,0}}, +/* 54234 */ {(14<<2)|2,{78,113,0}}, +/* 54235 */ {(14<<2)|2,{78,113,0}}, +/* 54236 */ {(14<<2)|2,{78,118,0}}, +/* 54237 */ {(14<<2)|2,{78,118,0}}, +/* 54238 */ {(14<<2)|2,{78,118,0}}, +/* 54239 */ {(14<<2)|2,{78,118,0}}, +/* 54240 */ {(14<<2)|2,{78,119,0}}, +/* 54241 */ {(14<<2)|2,{78,119,0}}, +/* 54242 */ {(14<<2)|2,{78,119,0}}, +/* 54243 */ {(14<<2)|2,{78,119,0}}, +/* 54244 */ {(14<<2)|2,{78,120,0}}, +/* 54245 */ {(14<<2)|2,{78,120,0}}, +/* 54246 */ {(14<<2)|2,{78,120,0}}, +/* 54247 */ {(14<<2)|2,{78,120,0}}, +/* 54248 */ {(14<<2)|2,{78,121,0}}, +/* 54249 */ {(14<<2)|2,{78,121,0}}, +/* 54250 */ {(14<<2)|2,{78,121,0}}, +/* 54251 */ {(14<<2)|2,{78,121,0}}, +/* 54252 */ {(14<<2)|2,{78,122,0}}, +/* 54253 */ {(14<<2)|2,{78,122,0}}, +/* 54254 */ {(14<<2)|2,{78,122,0}}, +/* 54255 */ {(14<<2)|2,{78,122,0}}, +/* 54256 */ {(15<<2)|2,{78,38,0}}, +/* 54257 */ {(15<<2)|2,{78,38,0}}, +/* 54258 */ {(15<<2)|2,{78,42,0}}, +/* 54259 */ {(15<<2)|2,{78,42,0}}, +/* 54260 */ {(15<<2)|2,{78,44,0}}, +/* 54261 */ {(15<<2)|2,{78,44,0}}, +/* 54262 */ {(15<<2)|2,{78,59,0}}, +/* 54263 */ {(15<<2)|2,{78,59,0}}, +/* 54264 */ {(15<<2)|2,{78,88,0}}, +/* 54265 */ {(15<<2)|2,{78,88,0}}, +/* 54266 */ {(15<<2)|2,{78,90,0}}, +/* 54267 */ {(15<<2)|2,{78,90,0}}, +/* 54268 */ {(7<<2)|1,{78,0,0}}, +/* 54269 */ {(7<<2)|1,{78,0,0}}, +/* 54270 */ {(7<<2)|1,{78,0,0}}, +/* 54271 */ {(7<<2)|1,{78,0,0}}, +/* 54272 */ {(12<<2)|2,{79,48,0}}, +/* 54273 */ {(12<<2)|2,{79,48,0}}, +/* 54274 */ {(12<<2)|2,{79,48,0}}, +/* 54275 */ {(12<<2)|2,{79,48,0}}, +/* 54276 */ {(12<<2)|2,{79,48,0}}, +/* 54277 */ {(12<<2)|2,{79,48,0}}, +/* 54278 */ {(12<<2)|2,{79,48,0}}, +/* 54279 */ {(12<<2)|2,{79,48,0}}, +/* 54280 */ {(12<<2)|2,{79,48,0}}, +/* 54281 */ {(12<<2)|2,{79,48,0}}, +/* 54282 */ {(12<<2)|2,{79,48,0}}, +/* 54283 */ {(12<<2)|2,{79,48,0}}, +/* 54284 */ {(12<<2)|2,{79,48,0}}, +/* 54285 */ {(12<<2)|2,{79,48,0}}, +/* 54286 */ {(12<<2)|2,{79,48,0}}, +/* 54287 */ {(12<<2)|2,{79,48,0}}, +/* 54288 */ {(12<<2)|2,{79,49,0}}, +/* 54289 */ {(12<<2)|2,{79,49,0}}, +/* 54290 */ {(12<<2)|2,{79,49,0}}, +/* 54291 */ {(12<<2)|2,{79,49,0}}, +/* 54292 */ {(12<<2)|2,{79,49,0}}, +/* 54293 */ {(12<<2)|2,{79,49,0}}, +/* 54294 */ {(12<<2)|2,{79,49,0}}, +/* 54295 */ {(12<<2)|2,{79,49,0}}, +/* 54296 */ {(12<<2)|2,{79,49,0}}, +/* 54297 */ {(12<<2)|2,{79,49,0}}, +/* 54298 */ {(12<<2)|2,{79,49,0}}, +/* 54299 */ {(12<<2)|2,{79,49,0}}, +/* 54300 */ {(12<<2)|2,{79,49,0}}, +/* 54301 */ {(12<<2)|2,{79,49,0}}, +/* 54302 */ {(12<<2)|2,{79,49,0}}, +/* 54303 */ {(12<<2)|2,{79,49,0}}, +/* 54304 */ {(12<<2)|2,{79,50,0}}, +/* 54305 */ {(12<<2)|2,{79,50,0}}, +/* 54306 */ {(12<<2)|2,{79,50,0}}, +/* 54307 */ {(12<<2)|2,{79,50,0}}, +/* 54308 */ {(12<<2)|2,{79,50,0}}, +/* 54309 */ {(12<<2)|2,{79,50,0}}, +/* 54310 */ {(12<<2)|2,{79,50,0}}, +/* 54311 */ {(12<<2)|2,{79,50,0}}, +/* 54312 */ {(12<<2)|2,{79,50,0}}, +/* 54313 */ {(12<<2)|2,{79,50,0}}, +/* 54314 */ {(12<<2)|2,{79,50,0}}, +/* 54315 */ {(12<<2)|2,{79,50,0}}, +/* 54316 */ {(12<<2)|2,{79,50,0}}, +/* 54317 */ {(12<<2)|2,{79,50,0}}, +/* 54318 */ {(12<<2)|2,{79,50,0}}, +/* 54319 */ {(12<<2)|2,{79,50,0}}, +/* 54320 */ {(12<<2)|2,{79,97,0}}, +/* 54321 */ {(12<<2)|2,{79,97,0}}, +/* 54322 */ {(12<<2)|2,{79,97,0}}, +/* 54323 */ {(12<<2)|2,{79,97,0}}, +/* 54324 */ {(12<<2)|2,{79,97,0}}, +/* 54325 */ {(12<<2)|2,{79,97,0}}, +/* 54326 */ {(12<<2)|2,{79,97,0}}, +/* 54327 */ {(12<<2)|2,{79,97,0}}, +/* 54328 */ {(12<<2)|2,{79,97,0}}, +/* 54329 */ {(12<<2)|2,{79,97,0}}, +/* 54330 */ {(12<<2)|2,{79,97,0}}, +/* 54331 */ {(12<<2)|2,{79,97,0}}, +/* 54332 */ {(12<<2)|2,{79,97,0}}, +/* 54333 */ {(12<<2)|2,{79,97,0}}, +/* 54334 */ {(12<<2)|2,{79,97,0}}, +/* 54335 */ {(12<<2)|2,{79,97,0}}, +/* 54336 */ {(12<<2)|2,{79,99,0}}, +/* 54337 */ {(12<<2)|2,{79,99,0}}, +/* 54338 */ {(12<<2)|2,{79,99,0}}, +/* 54339 */ {(12<<2)|2,{79,99,0}}, +/* 54340 */ {(12<<2)|2,{79,99,0}}, +/* 54341 */ {(12<<2)|2,{79,99,0}}, +/* 54342 */ {(12<<2)|2,{79,99,0}}, +/* 54343 */ {(12<<2)|2,{79,99,0}}, +/* 54344 */ {(12<<2)|2,{79,99,0}}, +/* 54345 */ {(12<<2)|2,{79,99,0}}, +/* 54346 */ {(12<<2)|2,{79,99,0}}, +/* 54347 */ {(12<<2)|2,{79,99,0}}, +/* 54348 */ {(12<<2)|2,{79,99,0}}, +/* 54349 */ {(12<<2)|2,{79,99,0}}, +/* 54350 */ {(12<<2)|2,{79,99,0}}, +/* 54351 */ {(12<<2)|2,{79,99,0}}, +/* 54352 */ {(12<<2)|2,{79,101,0}}, +/* 54353 */ {(12<<2)|2,{79,101,0}}, +/* 54354 */ {(12<<2)|2,{79,101,0}}, +/* 54355 */ {(12<<2)|2,{79,101,0}}, +/* 54356 */ {(12<<2)|2,{79,101,0}}, +/* 54357 */ {(12<<2)|2,{79,101,0}}, +/* 54358 */ {(12<<2)|2,{79,101,0}}, +/* 54359 */ {(12<<2)|2,{79,101,0}}, +/* 54360 */ {(12<<2)|2,{79,101,0}}, +/* 54361 */ {(12<<2)|2,{79,101,0}}, +/* 54362 */ {(12<<2)|2,{79,101,0}}, +/* 54363 */ {(12<<2)|2,{79,101,0}}, +/* 54364 */ {(12<<2)|2,{79,101,0}}, +/* 54365 */ {(12<<2)|2,{79,101,0}}, +/* 54366 */ {(12<<2)|2,{79,101,0}}, +/* 54367 */ {(12<<2)|2,{79,101,0}}, +/* 54368 */ {(12<<2)|2,{79,105,0}}, +/* 54369 */ {(12<<2)|2,{79,105,0}}, +/* 54370 */ {(12<<2)|2,{79,105,0}}, +/* 54371 */ {(12<<2)|2,{79,105,0}}, +/* 54372 */ {(12<<2)|2,{79,105,0}}, +/* 54373 */ {(12<<2)|2,{79,105,0}}, +/* 54374 */ {(12<<2)|2,{79,105,0}}, +/* 54375 */ {(12<<2)|2,{79,105,0}}, +/* 54376 */ {(12<<2)|2,{79,105,0}}, +/* 54377 */ {(12<<2)|2,{79,105,0}}, +/* 54378 */ {(12<<2)|2,{79,105,0}}, +/* 54379 */ {(12<<2)|2,{79,105,0}}, +/* 54380 */ {(12<<2)|2,{79,105,0}}, +/* 54381 */ {(12<<2)|2,{79,105,0}}, +/* 54382 */ {(12<<2)|2,{79,105,0}}, +/* 54383 */ {(12<<2)|2,{79,105,0}}, +/* 54384 */ {(12<<2)|2,{79,111,0}}, +/* 54385 */ {(12<<2)|2,{79,111,0}}, +/* 54386 */ {(12<<2)|2,{79,111,0}}, +/* 54387 */ {(12<<2)|2,{79,111,0}}, +/* 54388 */ {(12<<2)|2,{79,111,0}}, +/* 54389 */ {(12<<2)|2,{79,111,0}}, +/* 54390 */ {(12<<2)|2,{79,111,0}}, +/* 54391 */ {(12<<2)|2,{79,111,0}}, +/* 54392 */ {(12<<2)|2,{79,111,0}}, +/* 54393 */ {(12<<2)|2,{79,111,0}}, +/* 54394 */ {(12<<2)|2,{79,111,0}}, +/* 54395 */ {(12<<2)|2,{79,111,0}}, +/* 54396 */ {(12<<2)|2,{79,111,0}}, +/* 54397 */ {(12<<2)|2,{79,111,0}}, +/* 54398 */ {(12<<2)|2,{79,111,0}}, +/* 54399 */ {(12<<2)|2,{79,111,0}}, +/* 54400 */ {(12<<2)|2,{79,115,0}}, +/* 54401 */ {(12<<2)|2,{79,115,0}}, +/* 54402 */ {(12<<2)|2,{79,115,0}}, +/* 54403 */ {(12<<2)|2,{79,115,0}}, +/* 54404 */ {(12<<2)|2,{79,115,0}}, +/* 54405 */ {(12<<2)|2,{79,115,0}}, +/* 54406 */ {(12<<2)|2,{79,115,0}}, +/* 54407 */ {(12<<2)|2,{79,115,0}}, +/* 54408 */ {(12<<2)|2,{79,115,0}}, +/* 54409 */ {(12<<2)|2,{79,115,0}}, +/* 54410 */ {(12<<2)|2,{79,115,0}}, +/* 54411 */ {(12<<2)|2,{79,115,0}}, +/* 54412 */ {(12<<2)|2,{79,115,0}}, +/* 54413 */ {(12<<2)|2,{79,115,0}}, +/* 54414 */ {(12<<2)|2,{79,115,0}}, +/* 54415 */ {(12<<2)|2,{79,115,0}}, +/* 54416 */ {(12<<2)|2,{79,116,0}}, +/* 54417 */ {(12<<2)|2,{79,116,0}}, +/* 54418 */ {(12<<2)|2,{79,116,0}}, +/* 54419 */ {(12<<2)|2,{79,116,0}}, +/* 54420 */ {(12<<2)|2,{79,116,0}}, +/* 54421 */ {(12<<2)|2,{79,116,0}}, +/* 54422 */ {(12<<2)|2,{79,116,0}}, +/* 54423 */ {(12<<2)|2,{79,116,0}}, +/* 54424 */ {(12<<2)|2,{79,116,0}}, +/* 54425 */ {(12<<2)|2,{79,116,0}}, +/* 54426 */ {(12<<2)|2,{79,116,0}}, +/* 54427 */ {(12<<2)|2,{79,116,0}}, +/* 54428 */ {(12<<2)|2,{79,116,0}}, +/* 54429 */ {(12<<2)|2,{79,116,0}}, +/* 54430 */ {(12<<2)|2,{79,116,0}}, +/* 54431 */ {(12<<2)|2,{79,116,0}}, +/* 54432 */ {(13<<2)|2,{79,32,0}}, +/* 54433 */ {(13<<2)|2,{79,32,0}}, +/* 54434 */ {(13<<2)|2,{79,32,0}}, +/* 54435 */ {(13<<2)|2,{79,32,0}}, +/* 54436 */ {(13<<2)|2,{79,32,0}}, +/* 54437 */ {(13<<2)|2,{79,32,0}}, +/* 54438 */ {(13<<2)|2,{79,32,0}}, +/* 54439 */ {(13<<2)|2,{79,32,0}}, +/* 54440 */ {(13<<2)|2,{79,37,0}}, +/* 54441 */ {(13<<2)|2,{79,37,0}}, +/* 54442 */ {(13<<2)|2,{79,37,0}}, +/* 54443 */ {(13<<2)|2,{79,37,0}}, +/* 54444 */ {(13<<2)|2,{79,37,0}}, +/* 54445 */ {(13<<2)|2,{79,37,0}}, +/* 54446 */ {(13<<2)|2,{79,37,0}}, +/* 54447 */ {(13<<2)|2,{79,37,0}}, +/* 54448 */ {(13<<2)|2,{79,45,0}}, +/* 54449 */ {(13<<2)|2,{79,45,0}}, +/* 54450 */ {(13<<2)|2,{79,45,0}}, +/* 54451 */ {(13<<2)|2,{79,45,0}}, +/* 54452 */ {(13<<2)|2,{79,45,0}}, +/* 54453 */ {(13<<2)|2,{79,45,0}}, +/* 54454 */ {(13<<2)|2,{79,45,0}}, +/* 54455 */ {(13<<2)|2,{79,45,0}}, +/* 54456 */ {(13<<2)|2,{79,46,0}}, +/* 54457 */ {(13<<2)|2,{79,46,0}}, +/* 54458 */ {(13<<2)|2,{79,46,0}}, +/* 54459 */ {(13<<2)|2,{79,46,0}}, +/* 54460 */ {(13<<2)|2,{79,46,0}}, +/* 54461 */ {(13<<2)|2,{79,46,0}}, +/* 54462 */ {(13<<2)|2,{79,46,0}}, +/* 54463 */ {(13<<2)|2,{79,46,0}}, +/* 54464 */ {(13<<2)|2,{79,47,0}}, +/* 54465 */ {(13<<2)|2,{79,47,0}}, +/* 54466 */ {(13<<2)|2,{79,47,0}}, +/* 54467 */ {(13<<2)|2,{79,47,0}}, +/* 54468 */ {(13<<2)|2,{79,47,0}}, +/* 54469 */ {(13<<2)|2,{79,47,0}}, +/* 54470 */ {(13<<2)|2,{79,47,0}}, +/* 54471 */ {(13<<2)|2,{79,47,0}}, +/* 54472 */ {(13<<2)|2,{79,51,0}}, +/* 54473 */ {(13<<2)|2,{79,51,0}}, +/* 54474 */ {(13<<2)|2,{79,51,0}}, +/* 54475 */ {(13<<2)|2,{79,51,0}}, +/* 54476 */ {(13<<2)|2,{79,51,0}}, +/* 54477 */ {(13<<2)|2,{79,51,0}}, +/* 54478 */ {(13<<2)|2,{79,51,0}}, +/* 54479 */ {(13<<2)|2,{79,51,0}}, +/* 54480 */ {(13<<2)|2,{79,52,0}}, +/* 54481 */ {(13<<2)|2,{79,52,0}}, +/* 54482 */ {(13<<2)|2,{79,52,0}}, +/* 54483 */ {(13<<2)|2,{79,52,0}}, +/* 54484 */ {(13<<2)|2,{79,52,0}}, +/* 54485 */ {(13<<2)|2,{79,52,0}}, +/* 54486 */ {(13<<2)|2,{79,52,0}}, +/* 54487 */ {(13<<2)|2,{79,52,0}}, +/* 54488 */ {(13<<2)|2,{79,53,0}}, +/* 54489 */ {(13<<2)|2,{79,53,0}}, +/* 54490 */ {(13<<2)|2,{79,53,0}}, +/* 54491 */ {(13<<2)|2,{79,53,0}}, +/* 54492 */ {(13<<2)|2,{79,53,0}}, +/* 54493 */ {(13<<2)|2,{79,53,0}}, +/* 54494 */ {(13<<2)|2,{79,53,0}}, +/* 54495 */ {(13<<2)|2,{79,53,0}}, +/* 54496 */ {(13<<2)|2,{79,54,0}}, +/* 54497 */ {(13<<2)|2,{79,54,0}}, +/* 54498 */ {(13<<2)|2,{79,54,0}}, +/* 54499 */ {(13<<2)|2,{79,54,0}}, +/* 54500 */ {(13<<2)|2,{79,54,0}}, +/* 54501 */ {(13<<2)|2,{79,54,0}}, +/* 54502 */ {(13<<2)|2,{79,54,0}}, +/* 54503 */ {(13<<2)|2,{79,54,0}}, +/* 54504 */ {(13<<2)|2,{79,55,0}}, +/* 54505 */ {(13<<2)|2,{79,55,0}}, +/* 54506 */ {(13<<2)|2,{79,55,0}}, +/* 54507 */ {(13<<2)|2,{79,55,0}}, +/* 54508 */ {(13<<2)|2,{79,55,0}}, +/* 54509 */ {(13<<2)|2,{79,55,0}}, +/* 54510 */ {(13<<2)|2,{79,55,0}}, +/* 54511 */ {(13<<2)|2,{79,55,0}}, +/* 54512 */ {(13<<2)|2,{79,56,0}}, +/* 54513 */ {(13<<2)|2,{79,56,0}}, +/* 54514 */ {(13<<2)|2,{79,56,0}}, +/* 54515 */ {(13<<2)|2,{79,56,0}}, +/* 54516 */ {(13<<2)|2,{79,56,0}}, +/* 54517 */ {(13<<2)|2,{79,56,0}}, +/* 54518 */ {(13<<2)|2,{79,56,0}}, +/* 54519 */ {(13<<2)|2,{79,56,0}}, +/* 54520 */ {(13<<2)|2,{79,57,0}}, +/* 54521 */ {(13<<2)|2,{79,57,0}}, +/* 54522 */ {(13<<2)|2,{79,57,0}}, +/* 54523 */ {(13<<2)|2,{79,57,0}}, +/* 54524 */ {(13<<2)|2,{79,57,0}}, +/* 54525 */ {(13<<2)|2,{79,57,0}}, +/* 54526 */ {(13<<2)|2,{79,57,0}}, +/* 54527 */ {(13<<2)|2,{79,57,0}}, +/* 54528 */ {(13<<2)|2,{79,61,0}}, +/* 54529 */ {(13<<2)|2,{79,61,0}}, +/* 54530 */ {(13<<2)|2,{79,61,0}}, +/* 54531 */ {(13<<2)|2,{79,61,0}}, +/* 54532 */ {(13<<2)|2,{79,61,0}}, +/* 54533 */ {(13<<2)|2,{79,61,0}}, +/* 54534 */ {(13<<2)|2,{79,61,0}}, +/* 54535 */ {(13<<2)|2,{79,61,0}}, +/* 54536 */ {(13<<2)|2,{79,65,0}}, +/* 54537 */ {(13<<2)|2,{79,65,0}}, +/* 54538 */ {(13<<2)|2,{79,65,0}}, +/* 54539 */ {(13<<2)|2,{79,65,0}}, +/* 54540 */ {(13<<2)|2,{79,65,0}}, +/* 54541 */ {(13<<2)|2,{79,65,0}}, +/* 54542 */ {(13<<2)|2,{79,65,0}}, +/* 54543 */ {(13<<2)|2,{79,65,0}}, +/* 54544 */ {(13<<2)|2,{79,95,0}}, +/* 54545 */ {(13<<2)|2,{79,95,0}}, +/* 54546 */ {(13<<2)|2,{79,95,0}}, +/* 54547 */ {(13<<2)|2,{79,95,0}}, +/* 54548 */ {(13<<2)|2,{79,95,0}}, +/* 54549 */ {(13<<2)|2,{79,95,0}}, +/* 54550 */ {(13<<2)|2,{79,95,0}}, +/* 54551 */ {(13<<2)|2,{79,95,0}}, +/* 54552 */ {(13<<2)|2,{79,98,0}}, +/* 54553 */ {(13<<2)|2,{79,98,0}}, +/* 54554 */ {(13<<2)|2,{79,98,0}}, +/* 54555 */ {(13<<2)|2,{79,98,0}}, +/* 54556 */ {(13<<2)|2,{79,98,0}}, +/* 54557 */ {(13<<2)|2,{79,98,0}}, +/* 54558 */ {(13<<2)|2,{79,98,0}}, +/* 54559 */ {(13<<2)|2,{79,98,0}}, +/* 54560 */ {(13<<2)|2,{79,100,0}}, +/* 54561 */ {(13<<2)|2,{79,100,0}}, +/* 54562 */ {(13<<2)|2,{79,100,0}}, +/* 54563 */ {(13<<2)|2,{79,100,0}}, +/* 54564 */ {(13<<2)|2,{79,100,0}}, +/* 54565 */ {(13<<2)|2,{79,100,0}}, +/* 54566 */ {(13<<2)|2,{79,100,0}}, +/* 54567 */ {(13<<2)|2,{79,100,0}}, +/* 54568 */ {(13<<2)|2,{79,102,0}}, +/* 54569 */ {(13<<2)|2,{79,102,0}}, +/* 54570 */ {(13<<2)|2,{79,102,0}}, +/* 54571 */ {(13<<2)|2,{79,102,0}}, +/* 54572 */ {(13<<2)|2,{79,102,0}}, +/* 54573 */ {(13<<2)|2,{79,102,0}}, +/* 54574 */ {(13<<2)|2,{79,102,0}}, +/* 54575 */ {(13<<2)|2,{79,102,0}}, +/* 54576 */ {(13<<2)|2,{79,103,0}}, +/* 54577 */ {(13<<2)|2,{79,103,0}}, +/* 54578 */ {(13<<2)|2,{79,103,0}}, +/* 54579 */ {(13<<2)|2,{79,103,0}}, +/* 54580 */ {(13<<2)|2,{79,103,0}}, +/* 54581 */ {(13<<2)|2,{79,103,0}}, +/* 54582 */ {(13<<2)|2,{79,103,0}}, +/* 54583 */ {(13<<2)|2,{79,103,0}}, +/* 54584 */ {(13<<2)|2,{79,104,0}}, +/* 54585 */ {(13<<2)|2,{79,104,0}}, +/* 54586 */ {(13<<2)|2,{79,104,0}}, +/* 54587 */ {(13<<2)|2,{79,104,0}}, +/* 54588 */ {(13<<2)|2,{79,104,0}}, +/* 54589 */ {(13<<2)|2,{79,104,0}}, +/* 54590 */ {(13<<2)|2,{79,104,0}}, +/* 54591 */ {(13<<2)|2,{79,104,0}}, +/* 54592 */ {(13<<2)|2,{79,108,0}}, +/* 54593 */ {(13<<2)|2,{79,108,0}}, +/* 54594 */ {(13<<2)|2,{79,108,0}}, +/* 54595 */ {(13<<2)|2,{79,108,0}}, +/* 54596 */ {(13<<2)|2,{79,108,0}}, +/* 54597 */ {(13<<2)|2,{79,108,0}}, +/* 54598 */ {(13<<2)|2,{79,108,0}}, +/* 54599 */ {(13<<2)|2,{79,108,0}}, +/* 54600 */ {(13<<2)|2,{79,109,0}}, +/* 54601 */ {(13<<2)|2,{79,109,0}}, +/* 54602 */ {(13<<2)|2,{79,109,0}}, +/* 54603 */ {(13<<2)|2,{79,109,0}}, +/* 54604 */ {(13<<2)|2,{79,109,0}}, +/* 54605 */ {(13<<2)|2,{79,109,0}}, +/* 54606 */ {(13<<2)|2,{79,109,0}}, +/* 54607 */ {(13<<2)|2,{79,109,0}}, +/* 54608 */ {(13<<2)|2,{79,110,0}}, +/* 54609 */ {(13<<2)|2,{79,110,0}}, +/* 54610 */ {(13<<2)|2,{79,110,0}}, +/* 54611 */ {(13<<2)|2,{79,110,0}}, +/* 54612 */ {(13<<2)|2,{79,110,0}}, +/* 54613 */ {(13<<2)|2,{79,110,0}}, +/* 54614 */ {(13<<2)|2,{79,110,0}}, +/* 54615 */ {(13<<2)|2,{79,110,0}}, +/* 54616 */ {(13<<2)|2,{79,112,0}}, +/* 54617 */ {(13<<2)|2,{79,112,0}}, +/* 54618 */ {(13<<2)|2,{79,112,0}}, +/* 54619 */ {(13<<2)|2,{79,112,0}}, +/* 54620 */ {(13<<2)|2,{79,112,0}}, +/* 54621 */ {(13<<2)|2,{79,112,0}}, +/* 54622 */ {(13<<2)|2,{79,112,0}}, +/* 54623 */ {(13<<2)|2,{79,112,0}}, +/* 54624 */ {(13<<2)|2,{79,114,0}}, +/* 54625 */ {(13<<2)|2,{79,114,0}}, +/* 54626 */ {(13<<2)|2,{79,114,0}}, +/* 54627 */ {(13<<2)|2,{79,114,0}}, +/* 54628 */ {(13<<2)|2,{79,114,0}}, +/* 54629 */ {(13<<2)|2,{79,114,0}}, +/* 54630 */ {(13<<2)|2,{79,114,0}}, +/* 54631 */ {(13<<2)|2,{79,114,0}}, +/* 54632 */ {(13<<2)|2,{79,117,0}}, +/* 54633 */ {(13<<2)|2,{79,117,0}}, +/* 54634 */ {(13<<2)|2,{79,117,0}}, +/* 54635 */ {(13<<2)|2,{79,117,0}}, +/* 54636 */ {(13<<2)|2,{79,117,0}}, +/* 54637 */ {(13<<2)|2,{79,117,0}}, +/* 54638 */ {(13<<2)|2,{79,117,0}}, +/* 54639 */ {(13<<2)|2,{79,117,0}}, +/* 54640 */ {(14<<2)|2,{79,58,0}}, +/* 54641 */ {(14<<2)|2,{79,58,0}}, +/* 54642 */ {(14<<2)|2,{79,58,0}}, +/* 54643 */ {(14<<2)|2,{79,58,0}}, +/* 54644 */ {(14<<2)|2,{79,66,0}}, +/* 54645 */ {(14<<2)|2,{79,66,0}}, +/* 54646 */ {(14<<2)|2,{79,66,0}}, +/* 54647 */ {(14<<2)|2,{79,66,0}}, +/* 54648 */ {(14<<2)|2,{79,67,0}}, +/* 54649 */ {(14<<2)|2,{79,67,0}}, +/* 54650 */ {(14<<2)|2,{79,67,0}}, +/* 54651 */ {(14<<2)|2,{79,67,0}}, +/* 54652 */ {(14<<2)|2,{79,68,0}}, +/* 54653 */ {(14<<2)|2,{79,68,0}}, +/* 54654 */ {(14<<2)|2,{79,68,0}}, +/* 54655 */ {(14<<2)|2,{79,68,0}}, +/* 54656 */ {(14<<2)|2,{79,69,0}}, +/* 54657 */ {(14<<2)|2,{79,69,0}}, +/* 54658 */ {(14<<2)|2,{79,69,0}}, +/* 54659 */ {(14<<2)|2,{79,69,0}}, +/* 54660 */ {(14<<2)|2,{79,70,0}}, +/* 54661 */ {(14<<2)|2,{79,70,0}}, +/* 54662 */ {(14<<2)|2,{79,70,0}}, +/* 54663 */ {(14<<2)|2,{79,70,0}}, +/* 54664 */ {(14<<2)|2,{79,71,0}}, +/* 54665 */ {(14<<2)|2,{79,71,0}}, +/* 54666 */ {(14<<2)|2,{79,71,0}}, +/* 54667 */ {(14<<2)|2,{79,71,0}}, +/* 54668 */ {(14<<2)|2,{79,72,0}}, +/* 54669 */ {(14<<2)|2,{79,72,0}}, +/* 54670 */ {(14<<2)|2,{79,72,0}}, +/* 54671 */ {(14<<2)|2,{79,72,0}}, +/* 54672 */ {(14<<2)|2,{79,73,0}}, +/* 54673 */ {(14<<2)|2,{79,73,0}}, +/* 54674 */ {(14<<2)|2,{79,73,0}}, +/* 54675 */ {(14<<2)|2,{79,73,0}}, +/* 54676 */ {(14<<2)|2,{79,74,0}}, +/* 54677 */ {(14<<2)|2,{79,74,0}}, +/* 54678 */ {(14<<2)|2,{79,74,0}}, +/* 54679 */ {(14<<2)|2,{79,74,0}}, +/* 54680 */ {(14<<2)|2,{79,75,0}}, +/* 54681 */ {(14<<2)|2,{79,75,0}}, +/* 54682 */ {(14<<2)|2,{79,75,0}}, +/* 54683 */ {(14<<2)|2,{79,75,0}}, +/* 54684 */ {(14<<2)|2,{79,76,0}}, +/* 54685 */ {(14<<2)|2,{79,76,0}}, +/* 54686 */ {(14<<2)|2,{79,76,0}}, +/* 54687 */ {(14<<2)|2,{79,76,0}}, +/* 54688 */ {(14<<2)|2,{79,77,0}}, +/* 54689 */ {(14<<2)|2,{79,77,0}}, +/* 54690 */ {(14<<2)|2,{79,77,0}}, +/* 54691 */ {(14<<2)|2,{79,77,0}}, +/* 54692 */ {(14<<2)|2,{79,78,0}}, +/* 54693 */ {(14<<2)|2,{79,78,0}}, +/* 54694 */ {(14<<2)|2,{79,78,0}}, +/* 54695 */ {(14<<2)|2,{79,78,0}}, +/* 54696 */ {(14<<2)|2,{79,79,0}}, +/* 54697 */ {(14<<2)|2,{79,79,0}}, +/* 54698 */ {(14<<2)|2,{79,79,0}}, +/* 54699 */ {(14<<2)|2,{79,79,0}}, +/* 54700 */ {(14<<2)|2,{79,80,0}}, +/* 54701 */ {(14<<2)|2,{79,80,0}}, +/* 54702 */ {(14<<2)|2,{79,80,0}}, +/* 54703 */ {(14<<2)|2,{79,80,0}}, +/* 54704 */ {(14<<2)|2,{79,81,0}}, +/* 54705 */ {(14<<2)|2,{79,81,0}}, +/* 54706 */ {(14<<2)|2,{79,81,0}}, +/* 54707 */ {(14<<2)|2,{79,81,0}}, +/* 54708 */ {(14<<2)|2,{79,82,0}}, +/* 54709 */ {(14<<2)|2,{79,82,0}}, +/* 54710 */ {(14<<2)|2,{79,82,0}}, +/* 54711 */ {(14<<2)|2,{79,82,0}}, +/* 54712 */ {(14<<2)|2,{79,83,0}}, +/* 54713 */ {(14<<2)|2,{79,83,0}}, +/* 54714 */ {(14<<2)|2,{79,83,0}}, +/* 54715 */ {(14<<2)|2,{79,83,0}}, +/* 54716 */ {(14<<2)|2,{79,84,0}}, +/* 54717 */ {(14<<2)|2,{79,84,0}}, +/* 54718 */ {(14<<2)|2,{79,84,0}}, +/* 54719 */ {(14<<2)|2,{79,84,0}}, +/* 54720 */ {(14<<2)|2,{79,85,0}}, +/* 54721 */ {(14<<2)|2,{79,85,0}}, +/* 54722 */ {(14<<2)|2,{79,85,0}}, +/* 54723 */ {(14<<2)|2,{79,85,0}}, +/* 54724 */ {(14<<2)|2,{79,86,0}}, +/* 54725 */ {(14<<2)|2,{79,86,0}}, +/* 54726 */ {(14<<2)|2,{79,86,0}}, +/* 54727 */ {(14<<2)|2,{79,86,0}}, +/* 54728 */ {(14<<2)|2,{79,87,0}}, +/* 54729 */ {(14<<2)|2,{79,87,0}}, +/* 54730 */ {(14<<2)|2,{79,87,0}}, +/* 54731 */ {(14<<2)|2,{79,87,0}}, +/* 54732 */ {(14<<2)|2,{79,89,0}}, +/* 54733 */ {(14<<2)|2,{79,89,0}}, +/* 54734 */ {(14<<2)|2,{79,89,0}}, +/* 54735 */ {(14<<2)|2,{79,89,0}}, +/* 54736 */ {(14<<2)|2,{79,106,0}}, +/* 54737 */ {(14<<2)|2,{79,106,0}}, +/* 54738 */ {(14<<2)|2,{79,106,0}}, +/* 54739 */ {(14<<2)|2,{79,106,0}}, +/* 54740 */ {(14<<2)|2,{79,107,0}}, +/* 54741 */ {(14<<2)|2,{79,107,0}}, +/* 54742 */ {(14<<2)|2,{79,107,0}}, +/* 54743 */ {(14<<2)|2,{79,107,0}}, +/* 54744 */ {(14<<2)|2,{79,113,0}}, +/* 54745 */ {(14<<2)|2,{79,113,0}}, +/* 54746 */ {(14<<2)|2,{79,113,0}}, +/* 54747 */ {(14<<2)|2,{79,113,0}}, +/* 54748 */ {(14<<2)|2,{79,118,0}}, +/* 54749 */ {(14<<2)|2,{79,118,0}}, +/* 54750 */ {(14<<2)|2,{79,118,0}}, +/* 54751 */ {(14<<2)|2,{79,118,0}}, +/* 54752 */ {(14<<2)|2,{79,119,0}}, +/* 54753 */ {(14<<2)|2,{79,119,0}}, +/* 54754 */ {(14<<2)|2,{79,119,0}}, +/* 54755 */ {(14<<2)|2,{79,119,0}}, +/* 54756 */ {(14<<2)|2,{79,120,0}}, +/* 54757 */ {(14<<2)|2,{79,120,0}}, +/* 54758 */ {(14<<2)|2,{79,120,0}}, +/* 54759 */ {(14<<2)|2,{79,120,0}}, +/* 54760 */ {(14<<2)|2,{79,121,0}}, +/* 54761 */ {(14<<2)|2,{79,121,0}}, +/* 54762 */ {(14<<2)|2,{79,121,0}}, +/* 54763 */ {(14<<2)|2,{79,121,0}}, +/* 54764 */ {(14<<2)|2,{79,122,0}}, +/* 54765 */ {(14<<2)|2,{79,122,0}}, +/* 54766 */ {(14<<2)|2,{79,122,0}}, +/* 54767 */ {(14<<2)|2,{79,122,0}}, +/* 54768 */ {(15<<2)|2,{79,38,0}}, +/* 54769 */ {(15<<2)|2,{79,38,0}}, +/* 54770 */ {(15<<2)|2,{79,42,0}}, +/* 54771 */ {(15<<2)|2,{79,42,0}}, +/* 54772 */ {(15<<2)|2,{79,44,0}}, +/* 54773 */ {(15<<2)|2,{79,44,0}}, +/* 54774 */ {(15<<2)|2,{79,59,0}}, +/* 54775 */ {(15<<2)|2,{79,59,0}}, +/* 54776 */ {(15<<2)|2,{79,88,0}}, +/* 54777 */ {(15<<2)|2,{79,88,0}}, +/* 54778 */ {(15<<2)|2,{79,90,0}}, +/* 54779 */ {(15<<2)|2,{79,90,0}}, +/* 54780 */ {(7<<2)|1,{79,0,0}}, +/* 54781 */ {(7<<2)|1,{79,0,0}}, +/* 54782 */ {(7<<2)|1,{79,0,0}}, +/* 54783 */ {(7<<2)|1,{79,0,0}}, +/* 54784 */ {(12<<2)|2,{80,48,0}}, +/* 54785 */ {(12<<2)|2,{80,48,0}}, +/* 54786 */ {(12<<2)|2,{80,48,0}}, +/* 54787 */ {(12<<2)|2,{80,48,0}}, +/* 54788 */ {(12<<2)|2,{80,48,0}}, +/* 54789 */ {(12<<2)|2,{80,48,0}}, +/* 54790 */ {(12<<2)|2,{80,48,0}}, +/* 54791 */ {(12<<2)|2,{80,48,0}}, +/* 54792 */ {(12<<2)|2,{80,48,0}}, +/* 54793 */ {(12<<2)|2,{80,48,0}}, +/* 54794 */ {(12<<2)|2,{80,48,0}}, +/* 54795 */ {(12<<2)|2,{80,48,0}}, +/* 54796 */ {(12<<2)|2,{80,48,0}}, +/* 54797 */ {(12<<2)|2,{80,48,0}}, +/* 54798 */ {(12<<2)|2,{80,48,0}}, +/* 54799 */ {(12<<2)|2,{80,48,0}}, +/* 54800 */ {(12<<2)|2,{80,49,0}}, +/* 54801 */ {(12<<2)|2,{80,49,0}}, +/* 54802 */ {(12<<2)|2,{80,49,0}}, +/* 54803 */ {(12<<2)|2,{80,49,0}}, +/* 54804 */ {(12<<2)|2,{80,49,0}}, +/* 54805 */ {(12<<2)|2,{80,49,0}}, +/* 54806 */ {(12<<2)|2,{80,49,0}}, +/* 54807 */ {(12<<2)|2,{80,49,0}}, +/* 54808 */ {(12<<2)|2,{80,49,0}}, +/* 54809 */ {(12<<2)|2,{80,49,0}}, +/* 54810 */ {(12<<2)|2,{80,49,0}}, +/* 54811 */ {(12<<2)|2,{80,49,0}}, +/* 54812 */ {(12<<2)|2,{80,49,0}}, +/* 54813 */ {(12<<2)|2,{80,49,0}}, +/* 54814 */ {(12<<2)|2,{80,49,0}}, +/* 54815 */ {(12<<2)|2,{80,49,0}}, +/* 54816 */ {(12<<2)|2,{80,50,0}}, +/* 54817 */ {(12<<2)|2,{80,50,0}}, +/* 54818 */ {(12<<2)|2,{80,50,0}}, +/* 54819 */ {(12<<2)|2,{80,50,0}}, +/* 54820 */ {(12<<2)|2,{80,50,0}}, +/* 54821 */ {(12<<2)|2,{80,50,0}}, +/* 54822 */ {(12<<2)|2,{80,50,0}}, +/* 54823 */ {(12<<2)|2,{80,50,0}}, +/* 54824 */ {(12<<2)|2,{80,50,0}}, +/* 54825 */ {(12<<2)|2,{80,50,0}}, +/* 54826 */ {(12<<2)|2,{80,50,0}}, +/* 54827 */ {(12<<2)|2,{80,50,0}}, +/* 54828 */ {(12<<2)|2,{80,50,0}}, +/* 54829 */ {(12<<2)|2,{80,50,0}}, +/* 54830 */ {(12<<2)|2,{80,50,0}}, +/* 54831 */ {(12<<2)|2,{80,50,0}}, +/* 54832 */ {(12<<2)|2,{80,97,0}}, +/* 54833 */ {(12<<2)|2,{80,97,0}}, +/* 54834 */ {(12<<2)|2,{80,97,0}}, +/* 54835 */ {(12<<2)|2,{80,97,0}}, +/* 54836 */ {(12<<2)|2,{80,97,0}}, +/* 54837 */ {(12<<2)|2,{80,97,0}}, +/* 54838 */ {(12<<2)|2,{80,97,0}}, +/* 54839 */ {(12<<2)|2,{80,97,0}}, +/* 54840 */ {(12<<2)|2,{80,97,0}}, +/* 54841 */ {(12<<2)|2,{80,97,0}}, +/* 54842 */ {(12<<2)|2,{80,97,0}}, +/* 54843 */ {(12<<2)|2,{80,97,0}}, +/* 54844 */ {(12<<2)|2,{80,97,0}}, +/* 54845 */ {(12<<2)|2,{80,97,0}}, +/* 54846 */ {(12<<2)|2,{80,97,0}}, +/* 54847 */ {(12<<2)|2,{80,97,0}}, +/* 54848 */ {(12<<2)|2,{80,99,0}}, +/* 54849 */ {(12<<2)|2,{80,99,0}}, +/* 54850 */ {(12<<2)|2,{80,99,0}}, +/* 54851 */ {(12<<2)|2,{80,99,0}}, +/* 54852 */ {(12<<2)|2,{80,99,0}}, +/* 54853 */ {(12<<2)|2,{80,99,0}}, +/* 54854 */ {(12<<2)|2,{80,99,0}}, +/* 54855 */ {(12<<2)|2,{80,99,0}}, +/* 54856 */ {(12<<2)|2,{80,99,0}}, +/* 54857 */ {(12<<2)|2,{80,99,0}}, +/* 54858 */ {(12<<2)|2,{80,99,0}}, +/* 54859 */ {(12<<2)|2,{80,99,0}}, +/* 54860 */ {(12<<2)|2,{80,99,0}}, +/* 54861 */ {(12<<2)|2,{80,99,0}}, +/* 54862 */ {(12<<2)|2,{80,99,0}}, +/* 54863 */ {(12<<2)|2,{80,99,0}}, +/* 54864 */ {(12<<2)|2,{80,101,0}}, +/* 54865 */ {(12<<2)|2,{80,101,0}}, +/* 54866 */ {(12<<2)|2,{80,101,0}}, +/* 54867 */ {(12<<2)|2,{80,101,0}}, +/* 54868 */ {(12<<2)|2,{80,101,0}}, +/* 54869 */ {(12<<2)|2,{80,101,0}}, +/* 54870 */ {(12<<2)|2,{80,101,0}}, +/* 54871 */ {(12<<2)|2,{80,101,0}}, +/* 54872 */ {(12<<2)|2,{80,101,0}}, +/* 54873 */ {(12<<2)|2,{80,101,0}}, +/* 54874 */ {(12<<2)|2,{80,101,0}}, +/* 54875 */ {(12<<2)|2,{80,101,0}}, +/* 54876 */ {(12<<2)|2,{80,101,0}}, +/* 54877 */ {(12<<2)|2,{80,101,0}}, +/* 54878 */ {(12<<2)|2,{80,101,0}}, +/* 54879 */ {(12<<2)|2,{80,101,0}}, +/* 54880 */ {(12<<2)|2,{80,105,0}}, +/* 54881 */ {(12<<2)|2,{80,105,0}}, +/* 54882 */ {(12<<2)|2,{80,105,0}}, +/* 54883 */ {(12<<2)|2,{80,105,0}}, +/* 54884 */ {(12<<2)|2,{80,105,0}}, +/* 54885 */ {(12<<2)|2,{80,105,0}}, +/* 54886 */ {(12<<2)|2,{80,105,0}}, +/* 54887 */ {(12<<2)|2,{80,105,0}}, +/* 54888 */ {(12<<2)|2,{80,105,0}}, +/* 54889 */ {(12<<2)|2,{80,105,0}}, +/* 54890 */ {(12<<2)|2,{80,105,0}}, +/* 54891 */ {(12<<2)|2,{80,105,0}}, +/* 54892 */ {(12<<2)|2,{80,105,0}}, +/* 54893 */ {(12<<2)|2,{80,105,0}}, +/* 54894 */ {(12<<2)|2,{80,105,0}}, +/* 54895 */ {(12<<2)|2,{80,105,0}}, +/* 54896 */ {(12<<2)|2,{80,111,0}}, +/* 54897 */ {(12<<2)|2,{80,111,0}}, +/* 54898 */ {(12<<2)|2,{80,111,0}}, +/* 54899 */ {(12<<2)|2,{80,111,0}}, +/* 54900 */ {(12<<2)|2,{80,111,0}}, +/* 54901 */ {(12<<2)|2,{80,111,0}}, +/* 54902 */ {(12<<2)|2,{80,111,0}}, +/* 54903 */ {(12<<2)|2,{80,111,0}}, +/* 54904 */ {(12<<2)|2,{80,111,0}}, +/* 54905 */ {(12<<2)|2,{80,111,0}}, +/* 54906 */ {(12<<2)|2,{80,111,0}}, +/* 54907 */ {(12<<2)|2,{80,111,0}}, +/* 54908 */ {(12<<2)|2,{80,111,0}}, +/* 54909 */ {(12<<2)|2,{80,111,0}}, +/* 54910 */ {(12<<2)|2,{80,111,0}}, +/* 54911 */ {(12<<2)|2,{80,111,0}}, +/* 54912 */ {(12<<2)|2,{80,115,0}}, +/* 54913 */ {(12<<2)|2,{80,115,0}}, +/* 54914 */ {(12<<2)|2,{80,115,0}}, +/* 54915 */ {(12<<2)|2,{80,115,0}}, +/* 54916 */ {(12<<2)|2,{80,115,0}}, +/* 54917 */ {(12<<2)|2,{80,115,0}}, +/* 54918 */ {(12<<2)|2,{80,115,0}}, +/* 54919 */ {(12<<2)|2,{80,115,0}}, +/* 54920 */ {(12<<2)|2,{80,115,0}}, +/* 54921 */ {(12<<2)|2,{80,115,0}}, +/* 54922 */ {(12<<2)|2,{80,115,0}}, +/* 54923 */ {(12<<2)|2,{80,115,0}}, +/* 54924 */ {(12<<2)|2,{80,115,0}}, +/* 54925 */ {(12<<2)|2,{80,115,0}}, +/* 54926 */ {(12<<2)|2,{80,115,0}}, +/* 54927 */ {(12<<2)|2,{80,115,0}}, +/* 54928 */ {(12<<2)|2,{80,116,0}}, +/* 54929 */ {(12<<2)|2,{80,116,0}}, +/* 54930 */ {(12<<2)|2,{80,116,0}}, +/* 54931 */ {(12<<2)|2,{80,116,0}}, +/* 54932 */ {(12<<2)|2,{80,116,0}}, +/* 54933 */ {(12<<2)|2,{80,116,0}}, +/* 54934 */ {(12<<2)|2,{80,116,0}}, +/* 54935 */ {(12<<2)|2,{80,116,0}}, +/* 54936 */ {(12<<2)|2,{80,116,0}}, +/* 54937 */ {(12<<2)|2,{80,116,0}}, +/* 54938 */ {(12<<2)|2,{80,116,0}}, +/* 54939 */ {(12<<2)|2,{80,116,0}}, +/* 54940 */ {(12<<2)|2,{80,116,0}}, +/* 54941 */ {(12<<2)|2,{80,116,0}}, +/* 54942 */ {(12<<2)|2,{80,116,0}}, +/* 54943 */ {(12<<2)|2,{80,116,0}}, +/* 54944 */ {(13<<2)|2,{80,32,0}}, +/* 54945 */ {(13<<2)|2,{80,32,0}}, +/* 54946 */ {(13<<2)|2,{80,32,0}}, +/* 54947 */ {(13<<2)|2,{80,32,0}}, +/* 54948 */ {(13<<2)|2,{80,32,0}}, +/* 54949 */ {(13<<2)|2,{80,32,0}}, +/* 54950 */ {(13<<2)|2,{80,32,0}}, +/* 54951 */ {(13<<2)|2,{80,32,0}}, +/* 54952 */ {(13<<2)|2,{80,37,0}}, +/* 54953 */ {(13<<2)|2,{80,37,0}}, +/* 54954 */ {(13<<2)|2,{80,37,0}}, +/* 54955 */ {(13<<2)|2,{80,37,0}}, +/* 54956 */ {(13<<2)|2,{80,37,0}}, +/* 54957 */ {(13<<2)|2,{80,37,0}}, +/* 54958 */ {(13<<2)|2,{80,37,0}}, +/* 54959 */ {(13<<2)|2,{80,37,0}}, +/* 54960 */ {(13<<2)|2,{80,45,0}}, +/* 54961 */ {(13<<2)|2,{80,45,0}}, +/* 54962 */ {(13<<2)|2,{80,45,0}}, +/* 54963 */ {(13<<2)|2,{80,45,0}}, +/* 54964 */ {(13<<2)|2,{80,45,0}}, +/* 54965 */ {(13<<2)|2,{80,45,0}}, +/* 54966 */ {(13<<2)|2,{80,45,0}}, +/* 54967 */ {(13<<2)|2,{80,45,0}}, +/* 54968 */ {(13<<2)|2,{80,46,0}}, +/* 54969 */ {(13<<2)|2,{80,46,0}}, +/* 54970 */ {(13<<2)|2,{80,46,0}}, +/* 54971 */ {(13<<2)|2,{80,46,0}}, +/* 54972 */ {(13<<2)|2,{80,46,0}}, +/* 54973 */ {(13<<2)|2,{80,46,0}}, +/* 54974 */ {(13<<2)|2,{80,46,0}}, +/* 54975 */ {(13<<2)|2,{80,46,0}}, +/* 54976 */ {(13<<2)|2,{80,47,0}}, +/* 54977 */ {(13<<2)|2,{80,47,0}}, +/* 54978 */ {(13<<2)|2,{80,47,0}}, +/* 54979 */ {(13<<2)|2,{80,47,0}}, +/* 54980 */ {(13<<2)|2,{80,47,0}}, +/* 54981 */ {(13<<2)|2,{80,47,0}}, +/* 54982 */ {(13<<2)|2,{80,47,0}}, +/* 54983 */ {(13<<2)|2,{80,47,0}}, +/* 54984 */ {(13<<2)|2,{80,51,0}}, +/* 54985 */ {(13<<2)|2,{80,51,0}}, +/* 54986 */ {(13<<2)|2,{80,51,0}}, +/* 54987 */ {(13<<2)|2,{80,51,0}}, +/* 54988 */ {(13<<2)|2,{80,51,0}}, +/* 54989 */ {(13<<2)|2,{80,51,0}}, +/* 54990 */ {(13<<2)|2,{80,51,0}}, +/* 54991 */ {(13<<2)|2,{80,51,0}}, +/* 54992 */ {(13<<2)|2,{80,52,0}}, +/* 54993 */ {(13<<2)|2,{80,52,0}}, +/* 54994 */ {(13<<2)|2,{80,52,0}}, +/* 54995 */ {(13<<2)|2,{80,52,0}}, +/* 54996 */ {(13<<2)|2,{80,52,0}}, +/* 54997 */ {(13<<2)|2,{80,52,0}}, +/* 54998 */ {(13<<2)|2,{80,52,0}}, +/* 54999 */ {(13<<2)|2,{80,52,0}}, +/* 55000 */ {(13<<2)|2,{80,53,0}}, +/* 55001 */ {(13<<2)|2,{80,53,0}}, +/* 55002 */ {(13<<2)|2,{80,53,0}}, +/* 55003 */ {(13<<2)|2,{80,53,0}}, +/* 55004 */ {(13<<2)|2,{80,53,0}}, +/* 55005 */ {(13<<2)|2,{80,53,0}}, +/* 55006 */ {(13<<2)|2,{80,53,0}}, +/* 55007 */ {(13<<2)|2,{80,53,0}}, +/* 55008 */ {(13<<2)|2,{80,54,0}}, +/* 55009 */ {(13<<2)|2,{80,54,0}}, +/* 55010 */ {(13<<2)|2,{80,54,0}}, +/* 55011 */ {(13<<2)|2,{80,54,0}}, +/* 55012 */ {(13<<2)|2,{80,54,0}}, +/* 55013 */ {(13<<2)|2,{80,54,0}}, +/* 55014 */ {(13<<2)|2,{80,54,0}}, +/* 55015 */ {(13<<2)|2,{80,54,0}}, +/* 55016 */ {(13<<2)|2,{80,55,0}}, +/* 55017 */ {(13<<2)|2,{80,55,0}}, +/* 55018 */ {(13<<2)|2,{80,55,0}}, +/* 55019 */ {(13<<2)|2,{80,55,0}}, +/* 55020 */ {(13<<2)|2,{80,55,0}}, +/* 55021 */ {(13<<2)|2,{80,55,0}}, +/* 55022 */ {(13<<2)|2,{80,55,0}}, +/* 55023 */ {(13<<2)|2,{80,55,0}}, +/* 55024 */ {(13<<2)|2,{80,56,0}}, +/* 55025 */ {(13<<2)|2,{80,56,0}}, +/* 55026 */ {(13<<2)|2,{80,56,0}}, +/* 55027 */ {(13<<2)|2,{80,56,0}}, +/* 55028 */ {(13<<2)|2,{80,56,0}}, +/* 55029 */ {(13<<2)|2,{80,56,0}}, +/* 55030 */ {(13<<2)|2,{80,56,0}}, +/* 55031 */ {(13<<2)|2,{80,56,0}}, +/* 55032 */ {(13<<2)|2,{80,57,0}}, +/* 55033 */ {(13<<2)|2,{80,57,0}}, +/* 55034 */ {(13<<2)|2,{80,57,0}}, +/* 55035 */ {(13<<2)|2,{80,57,0}}, +/* 55036 */ {(13<<2)|2,{80,57,0}}, +/* 55037 */ {(13<<2)|2,{80,57,0}}, +/* 55038 */ {(13<<2)|2,{80,57,0}}, +/* 55039 */ {(13<<2)|2,{80,57,0}}, +/* 55040 */ {(13<<2)|2,{80,61,0}}, +/* 55041 */ {(13<<2)|2,{80,61,0}}, +/* 55042 */ {(13<<2)|2,{80,61,0}}, +/* 55043 */ {(13<<2)|2,{80,61,0}}, +/* 55044 */ {(13<<2)|2,{80,61,0}}, +/* 55045 */ {(13<<2)|2,{80,61,0}}, +/* 55046 */ {(13<<2)|2,{80,61,0}}, +/* 55047 */ {(13<<2)|2,{80,61,0}}, +/* 55048 */ {(13<<2)|2,{80,65,0}}, +/* 55049 */ {(13<<2)|2,{80,65,0}}, +/* 55050 */ {(13<<2)|2,{80,65,0}}, +/* 55051 */ {(13<<2)|2,{80,65,0}}, +/* 55052 */ {(13<<2)|2,{80,65,0}}, +/* 55053 */ {(13<<2)|2,{80,65,0}}, +/* 55054 */ {(13<<2)|2,{80,65,0}}, +/* 55055 */ {(13<<2)|2,{80,65,0}}, +/* 55056 */ {(13<<2)|2,{80,95,0}}, +/* 55057 */ {(13<<2)|2,{80,95,0}}, +/* 55058 */ {(13<<2)|2,{80,95,0}}, +/* 55059 */ {(13<<2)|2,{80,95,0}}, +/* 55060 */ {(13<<2)|2,{80,95,0}}, +/* 55061 */ {(13<<2)|2,{80,95,0}}, +/* 55062 */ {(13<<2)|2,{80,95,0}}, +/* 55063 */ {(13<<2)|2,{80,95,0}}, +/* 55064 */ {(13<<2)|2,{80,98,0}}, +/* 55065 */ {(13<<2)|2,{80,98,0}}, +/* 55066 */ {(13<<2)|2,{80,98,0}}, +/* 55067 */ {(13<<2)|2,{80,98,0}}, +/* 55068 */ {(13<<2)|2,{80,98,0}}, +/* 55069 */ {(13<<2)|2,{80,98,0}}, +/* 55070 */ {(13<<2)|2,{80,98,0}}, +/* 55071 */ {(13<<2)|2,{80,98,0}}, +/* 55072 */ {(13<<2)|2,{80,100,0}}, +/* 55073 */ {(13<<2)|2,{80,100,0}}, +/* 55074 */ {(13<<2)|2,{80,100,0}}, +/* 55075 */ {(13<<2)|2,{80,100,0}}, +/* 55076 */ {(13<<2)|2,{80,100,0}}, +/* 55077 */ {(13<<2)|2,{80,100,0}}, +/* 55078 */ {(13<<2)|2,{80,100,0}}, +/* 55079 */ {(13<<2)|2,{80,100,0}}, +/* 55080 */ {(13<<2)|2,{80,102,0}}, +/* 55081 */ {(13<<2)|2,{80,102,0}}, +/* 55082 */ {(13<<2)|2,{80,102,0}}, +/* 55083 */ {(13<<2)|2,{80,102,0}}, +/* 55084 */ {(13<<2)|2,{80,102,0}}, +/* 55085 */ {(13<<2)|2,{80,102,0}}, +/* 55086 */ {(13<<2)|2,{80,102,0}}, +/* 55087 */ {(13<<2)|2,{80,102,0}}, +/* 55088 */ {(13<<2)|2,{80,103,0}}, +/* 55089 */ {(13<<2)|2,{80,103,0}}, +/* 55090 */ {(13<<2)|2,{80,103,0}}, +/* 55091 */ {(13<<2)|2,{80,103,0}}, +/* 55092 */ {(13<<2)|2,{80,103,0}}, +/* 55093 */ {(13<<2)|2,{80,103,0}}, +/* 55094 */ {(13<<2)|2,{80,103,0}}, +/* 55095 */ {(13<<2)|2,{80,103,0}}, +/* 55096 */ {(13<<2)|2,{80,104,0}}, +/* 55097 */ {(13<<2)|2,{80,104,0}}, +/* 55098 */ {(13<<2)|2,{80,104,0}}, +/* 55099 */ {(13<<2)|2,{80,104,0}}, +/* 55100 */ {(13<<2)|2,{80,104,0}}, +/* 55101 */ {(13<<2)|2,{80,104,0}}, +/* 55102 */ {(13<<2)|2,{80,104,0}}, +/* 55103 */ {(13<<2)|2,{80,104,0}}, +/* 55104 */ {(13<<2)|2,{80,108,0}}, +/* 55105 */ {(13<<2)|2,{80,108,0}}, +/* 55106 */ {(13<<2)|2,{80,108,0}}, +/* 55107 */ {(13<<2)|2,{80,108,0}}, +/* 55108 */ {(13<<2)|2,{80,108,0}}, +/* 55109 */ {(13<<2)|2,{80,108,0}}, +/* 55110 */ {(13<<2)|2,{80,108,0}}, +/* 55111 */ {(13<<2)|2,{80,108,0}}, +/* 55112 */ {(13<<2)|2,{80,109,0}}, +/* 55113 */ {(13<<2)|2,{80,109,0}}, +/* 55114 */ {(13<<2)|2,{80,109,0}}, +/* 55115 */ {(13<<2)|2,{80,109,0}}, +/* 55116 */ {(13<<2)|2,{80,109,0}}, +/* 55117 */ {(13<<2)|2,{80,109,0}}, +/* 55118 */ {(13<<2)|2,{80,109,0}}, +/* 55119 */ {(13<<2)|2,{80,109,0}}, +/* 55120 */ {(13<<2)|2,{80,110,0}}, +/* 55121 */ {(13<<2)|2,{80,110,0}}, +/* 55122 */ {(13<<2)|2,{80,110,0}}, +/* 55123 */ {(13<<2)|2,{80,110,0}}, +/* 55124 */ {(13<<2)|2,{80,110,0}}, +/* 55125 */ {(13<<2)|2,{80,110,0}}, +/* 55126 */ {(13<<2)|2,{80,110,0}}, +/* 55127 */ {(13<<2)|2,{80,110,0}}, +/* 55128 */ {(13<<2)|2,{80,112,0}}, +/* 55129 */ {(13<<2)|2,{80,112,0}}, +/* 55130 */ {(13<<2)|2,{80,112,0}}, +/* 55131 */ {(13<<2)|2,{80,112,0}}, +/* 55132 */ {(13<<2)|2,{80,112,0}}, +/* 55133 */ {(13<<2)|2,{80,112,0}}, +/* 55134 */ {(13<<2)|2,{80,112,0}}, +/* 55135 */ {(13<<2)|2,{80,112,0}}, +/* 55136 */ {(13<<2)|2,{80,114,0}}, +/* 55137 */ {(13<<2)|2,{80,114,0}}, +/* 55138 */ {(13<<2)|2,{80,114,0}}, +/* 55139 */ {(13<<2)|2,{80,114,0}}, +/* 55140 */ {(13<<2)|2,{80,114,0}}, +/* 55141 */ {(13<<2)|2,{80,114,0}}, +/* 55142 */ {(13<<2)|2,{80,114,0}}, +/* 55143 */ {(13<<2)|2,{80,114,0}}, +/* 55144 */ {(13<<2)|2,{80,117,0}}, +/* 55145 */ {(13<<2)|2,{80,117,0}}, +/* 55146 */ {(13<<2)|2,{80,117,0}}, +/* 55147 */ {(13<<2)|2,{80,117,0}}, +/* 55148 */ {(13<<2)|2,{80,117,0}}, +/* 55149 */ {(13<<2)|2,{80,117,0}}, +/* 55150 */ {(13<<2)|2,{80,117,0}}, +/* 55151 */ {(13<<2)|2,{80,117,0}}, +/* 55152 */ {(14<<2)|2,{80,58,0}}, +/* 55153 */ {(14<<2)|2,{80,58,0}}, +/* 55154 */ {(14<<2)|2,{80,58,0}}, +/* 55155 */ {(14<<2)|2,{80,58,0}}, +/* 55156 */ {(14<<2)|2,{80,66,0}}, +/* 55157 */ {(14<<2)|2,{80,66,0}}, +/* 55158 */ {(14<<2)|2,{80,66,0}}, +/* 55159 */ {(14<<2)|2,{80,66,0}}, +/* 55160 */ {(14<<2)|2,{80,67,0}}, +/* 55161 */ {(14<<2)|2,{80,67,0}}, +/* 55162 */ {(14<<2)|2,{80,67,0}}, +/* 55163 */ {(14<<2)|2,{80,67,0}}, +/* 55164 */ {(14<<2)|2,{80,68,0}}, +/* 55165 */ {(14<<2)|2,{80,68,0}}, +/* 55166 */ {(14<<2)|2,{80,68,0}}, +/* 55167 */ {(14<<2)|2,{80,68,0}}, +/* 55168 */ {(14<<2)|2,{80,69,0}}, +/* 55169 */ {(14<<2)|2,{80,69,0}}, +/* 55170 */ {(14<<2)|2,{80,69,0}}, +/* 55171 */ {(14<<2)|2,{80,69,0}}, +/* 55172 */ {(14<<2)|2,{80,70,0}}, +/* 55173 */ {(14<<2)|2,{80,70,0}}, +/* 55174 */ {(14<<2)|2,{80,70,0}}, +/* 55175 */ {(14<<2)|2,{80,70,0}}, +/* 55176 */ {(14<<2)|2,{80,71,0}}, +/* 55177 */ {(14<<2)|2,{80,71,0}}, +/* 55178 */ {(14<<2)|2,{80,71,0}}, +/* 55179 */ {(14<<2)|2,{80,71,0}}, +/* 55180 */ {(14<<2)|2,{80,72,0}}, +/* 55181 */ {(14<<2)|2,{80,72,0}}, +/* 55182 */ {(14<<2)|2,{80,72,0}}, +/* 55183 */ {(14<<2)|2,{80,72,0}}, +/* 55184 */ {(14<<2)|2,{80,73,0}}, +/* 55185 */ {(14<<2)|2,{80,73,0}}, +/* 55186 */ {(14<<2)|2,{80,73,0}}, +/* 55187 */ {(14<<2)|2,{80,73,0}}, +/* 55188 */ {(14<<2)|2,{80,74,0}}, +/* 55189 */ {(14<<2)|2,{80,74,0}}, +/* 55190 */ {(14<<2)|2,{80,74,0}}, +/* 55191 */ {(14<<2)|2,{80,74,0}}, +/* 55192 */ {(14<<2)|2,{80,75,0}}, +/* 55193 */ {(14<<2)|2,{80,75,0}}, +/* 55194 */ {(14<<2)|2,{80,75,0}}, +/* 55195 */ {(14<<2)|2,{80,75,0}}, +/* 55196 */ {(14<<2)|2,{80,76,0}}, +/* 55197 */ {(14<<2)|2,{80,76,0}}, +/* 55198 */ {(14<<2)|2,{80,76,0}}, +/* 55199 */ {(14<<2)|2,{80,76,0}}, +/* 55200 */ {(14<<2)|2,{80,77,0}}, +/* 55201 */ {(14<<2)|2,{80,77,0}}, +/* 55202 */ {(14<<2)|2,{80,77,0}}, +/* 55203 */ {(14<<2)|2,{80,77,0}}, +/* 55204 */ {(14<<2)|2,{80,78,0}}, +/* 55205 */ {(14<<2)|2,{80,78,0}}, +/* 55206 */ {(14<<2)|2,{80,78,0}}, +/* 55207 */ {(14<<2)|2,{80,78,0}}, +/* 55208 */ {(14<<2)|2,{80,79,0}}, +/* 55209 */ {(14<<2)|2,{80,79,0}}, +/* 55210 */ {(14<<2)|2,{80,79,0}}, +/* 55211 */ {(14<<2)|2,{80,79,0}}, +/* 55212 */ {(14<<2)|2,{80,80,0}}, +/* 55213 */ {(14<<2)|2,{80,80,0}}, +/* 55214 */ {(14<<2)|2,{80,80,0}}, +/* 55215 */ {(14<<2)|2,{80,80,0}}, +/* 55216 */ {(14<<2)|2,{80,81,0}}, +/* 55217 */ {(14<<2)|2,{80,81,0}}, +/* 55218 */ {(14<<2)|2,{80,81,0}}, +/* 55219 */ {(14<<2)|2,{80,81,0}}, +/* 55220 */ {(14<<2)|2,{80,82,0}}, +/* 55221 */ {(14<<2)|2,{80,82,0}}, +/* 55222 */ {(14<<2)|2,{80,82,0}}, +/* 55223 */ {(14<<2)|2,{80,82,0}}, +/* 55224 */ {(14<<2)|2,{80,83,0}}, +/* 55225 */ {(14<<2)|2,{80,83,0}}, +/* 55226 */ {(14<<2)|2,{80,83,0}}, +/* 55227 */ {(14<<2)|2,{80,83,0}}, +/* 55228 */ {(14<<2)|2,{80,84,0}}, +/* 55229 */ {(14<<2)|2,{80,84,0}}, +/* 55230 */ {(14<<2)|2,{80,84,0}}, +/* 55231 */ {(14<<2)|2,{80,84,0}}, +/* 55232 */ {(14<<2)|2,{80,85,0}}, +/* 55233 */ {(14<<2)|2,{80,85,0}}, +/* 55234 */ {(14<<2)|2,{80,85,0}}, +/* 55235 */ {(14<<2)|2,{80,85,0}}, +/* 55236 */ {(14<<2)|2,{80,86,0}}, +/* 55237 */ {(14<<2)|2,{80,86,0}}, +/* 55238 */ {(14<<2)|2,{80,86,0}}, +/* 55239 */ {(14<<2)|2,{80,86,0}}, +/* 55240 */ {(14<<2)|2,{80,87,0}}, +/* 55241 */ {(14<<2)|2,{80,87,0}}, +/* 55242 */ {(14<<2)|2,{80,87,0}}, +/* 55243 */ {(14<<2)|2,{80,87,0}}, +/* 55244 */ {(14<<2)|2,{80,89,0}}, +/* 55245 */ {(14<<2)|2,{80,89,0}}, +/* 55246 */ {(14<<2)|2,{80,89,0}}, +/* 55247 */ {(14<<2)|2,{80,89,0}}, +/* 55248 */ {(14<<2)|2,{80,106,0}}, +/* 55249 */ {(14<<2)|2,{80,106,0}}, +/* 55250 */ {(14<<2)|2,{80,106,0}}, +/* 55251 */ {(14<<2)|2,{80,106,0}}, +/* 55252 */ {(14<<2)|2,{80,107,0}}, +/* 55253 */ {(14<<2)|2,{80,107,0}}, +/* 55254 */ {(14<<2)|2,{80,107,0}}, +/* 55255 */ {(14<<2)|2,{80,107,0}}, +/* 55256 */ {(14<<2)|2,{80,113,0}}, +/* 55257 */ {(14<<2)|2,{80,113,0}}, +/* 55258 */ {(14<<2)|2,{80,113,0}}, +/* 55259 */ {(14<<2)|2,{80,113,0}}, +/* 55260 */ {(14<<2)|2,{80,118,0}}, +/* 55261 */ {(14<<2)|2,{80,118,0}}, +/* 55262 */ {(14<<2)|2,{80,118,0}}, +/* 55263 */ {(14<<2)|2,{80,118,0}}, +/* 55264 */ {(14<<2)|2,{80,119,0}}, +/* 55265 */ {(14<<2)|2,{80,119,0}}, +/* 55266 */ {(14<<2)|2,{80,119,0}}, +/* 55267 */ {(14<<2)|2,{80,119,0}}, +/* 55268 */ {(14<<2)|2,{80,120,0}}, +/* 55269 */ {(14<<2)|2,{80,120,0}}, +/* 55270 */ {(14<<2)|2,{80,120,0}}, +/* 55271 */ {(14<<2)|2,{80,120,0}}, +/* 55272 */ {(14<<2)|2,{80,121,0}}, +/* 55273 */ {(14<<2)|2,{80,121,0}}, +/* 55274 */ {(14<<2)|2,{80,121,0}}, +/* 55275 */ {(14<<2)|2,{80,121,0}}, +/* 55276 */ {(14<<2)|2,{80,122,0}}, +/* 55277 */ {(14<<2)|2,{80,122,0}}, +/* 55278 */ {(14<<2)|2,{80,122,0}}, +/* 55279 */ {(14<<2)|2,{80,122,0}}, +/* 55280 */ {(15<<2)|2,{80,38,0}}, +/* 55281 */ {(15<<2)|2,{80,38,0}}, +/* 55282 */ {(15<<2)|2,{80,42,0}}, +/* 55283 */ {(15<<2)|2,{80,42,0}}, +/* 55284 */ {(15<<2)|2,{80,44,0}}, +/* 55285 */ {(15<<2)|2,{80,44,0}}, +/* 55286 */ {(15<<2)|2,{80,59,0}}, +/* 55287 */ {(15<<2)|2,{80,59,0}}, +/* 55288 */ {(15<<2)|2,{80,88,0}}, +/* 55289 */ {(15<<2)|2,{80,88,0}}, +/* 55290 */ {(15<<2)|2,{80,90,0}}, +/* 55291 */ {(15<<2)|2,{80,90,0}}, +/* 55292 */ {(7<<2)|1,{80,0,0}}, +/* 55293 */ {(7<<2)|1,{80,0,0}}, +/* 55294 */ {(7<<2)|1,{80,0,0}}, +/* 55295 */ {(7<<2)|1,{80,0,0}}, +/* 55296 */ {(12<<2)|2,{81,48,0}}, +/* 55297 */ {(12<<2)|2,{81,48,0}}, +/* 55298 */ {(12<<2)|2,{81,48,0}}, +/* 55299 */ {(12<<2)|2,{81,48,0}}, +/* 55300 */ {(12<<2)|2,{81,48,0}}, +/* 55301 */ {(12<<2)|2,{81,48,0}}, +/* 55302 */ {(12<<2)|2,{81,48,0}}, +/* 55303 */ {(12<<2)|2,{81,48,0}}, +/* 55304 */ {(12<<2)|2,{81,48,0}}, +/* 55305 */ {(12<<2)|2,{81,48,0}}, +/* 55306 */ {(12<<2)|2,{81,48,0}}, +/* 55307 */ {(12<<2)|2,{81,48,0}}, +/* 55308 */ {(12<<2)|2,{81,48,0}}, +/* 55309 */ {(12<<2)|2,{81,48,0}}, +/* 55310 */ {(12<<2)|2,{81,48,0}}, +/* 55311 */ {(12<<2)|2,{81,48,0}}, +/* 55312 */ {(12<<2)|2,{81,49,0}}, +/* 55313 */ {(12<<2)|2,{81,49,0}}, +/* 55314 */ {(12<<2)|2,{81,49,0}}, +/* 55315 */ {(12<<2)|2,{81,49,0}}, +/* 55316 */ {(12<<2)|2,{81,49,0}}, +/* 55317 */ {(12<<2)|2,{81,49,0}}, +/* 55318 */ {(12<<2)|2,{81,49,0}}, +/* 55319 */ {(12<<2)|2,{81,49,0}}, +/* 55320 */ {(12<<2)|2,{81,49,0}}, +/* 55321 */ {(12<<2)|2,{81,49,0}}, +/* 55322 */ {(12<<2)|2,{81,49,0}}, +/* 55323 */ {(12<<2)|2,{81,49,0}}, +/* 55324 */ {(12<<2)|2,{81,49,0}}, +/* 55325 */ {(12<<2)|2,{81,49,0}}, +/* 55326 */ {(12<<2)|2,{81,49,0}}, +/* 55327 */ {(12<<2)|2,{81,49,0}}, +/* 55328 */ {(12<<2)|2,{81,50,0}}, +/* 55329 */ {(12<<2)|2,{81,50,0}}, +/* 55330 */ {(12<<2)|2,{81,50,0}}, +/* 55331 */ {(12<<2)|2,{81,50,0}}, +/* 55332 */ {(12<<2)|2,{81,50,0}}, +/* 55333 */ {(12<<2)|2,{81,50,0}}, +/* 55334 */ {(12<<2)|2,{81,50,0}}, +/* 55335 */ {(12<<2)|2,{81,50,0}}, +/* 55336 */ {(12<<2)|2,{81,50,0}}, +/* 55337 */ {(12<<2)|2,{81,50,0}}, +/* 55338 */ {(12<<2)|2,{81,50,0}}, +/* 55339 */ {(12<<2)|2,{81,50,0}}, +/* 55340 */ {(12<<2)|2,{81,50,0}}, +/* 55341 */ {(12<<2)|2,{81,50,0}}, +/* 55342 */ {(12<<2)|2,{81,50,0}}, +/* 55343 */ {(12<<2)|2,{81,50,0}}, +/* 55344 */ {(12<<2)|2,{81,97,0}}, +/* 55345 */ {(12<<2)|2,{81,97,0}}, +/* 55346 */ {(12<<2)|2,{81,97,0}}, +/* 55347 */ {(12<<2)|2,{81,97,0}}, +/* 55348 */ {(12<<2)|2,{81,97,0}}, +/* 55349 */ {(12<<2)|2,{81,97,0}}, +/* 55350 */ {(12<<2)|2,{81,97,0}}, +/* 55351 */ {(12<<2)|2,{81,97,0}}, +/* 55352 */ {(12<<2)|2,{81,97,0}}, +/* 55353 */ {(12<<2)|2,{81,97,0}}, +/* 55354 */ {(12<<2)|2,{81,97,0}}, +/* 55355 */ {(12<<2)|2,{81,97,0}}, +/* 55356 */ {(12<<2)|2,{81,97,0}}, +/* 55357 */ {(12<<2)|2,{81,97,0}}, +/* 55358 */ {(12<<2)|2,{81,97,0}}, +/* 55359 */ {(12<<2)|2,{81,97,0}}, +/* 55360 */ {(12<<2)|2,{81,99,0}}, +/* 55361 */ {(12<<2)|2,{81,99,0}}, +/* 55362 */ {(12<<2)|2,{81,99,0}}, +/* 55363 */ {(12<<2)|2,{81,99,0}}, +/* 55364 */ {(12<<2)|2,{81,99,0}}, +/* 55365 */ {(12<<2)|2,{81,99,0}}, +/* 55366 */ {(12<<2)|2,{81,99,0}}, +/* 55367 */ {(12<<2)|2,{81,99,0}}, +/* 55368 */ {(12<<2)|2,{81,99,0}}, +/* 55369 */ {(12<<2)|2,{81,99,0}}, +/* 55370 */ {(12<<2)|2,{81,99,0}}, +/* 55371 */ {(12<<2)|2,{81,99,0}}, +/* 55372 */ {(12<<2)|2,{81,99,0}}, +/* 55373 */ {(12<<2)|2,{81,99,0}}, +/* 55374 */ {(12<<2)|2,{81,99,0}}, +/* 55375 */ {(12<<2)|2,{81,99,0}}, +/* 55376 */ {(12<<2)|2,{81,101,0}}, +/* 55377 */ {(12<<2)|2,{81,101,0}}, +/* 55378 */ {(12<<2)|2,{81,101,0}}, +/* 55379 */ {(12<<2)|2,{81,101,0}}, +/* 55380 */ {(12<<2)|2,{81,101,0}}, +/* 55381 */ {(12<<2)|2,{81,101,0}}, +/* 55382 */ {(12<<2)|2,{81,101,0}}, +/* 55383 */ {(12<<2)|2,{81,101,0}}, +/* 55384 */ {(12<<2)|2,{81,101,0}}, +/* 55385 */ {(12<<2)|2,{81,101,0}}, +/* 55386 */ {(12<<2)|2,{81,101,0}}, +/* 55387 */ {(12<<2)|2,{81,101,0}}, +/* 55388 */ {(12<<2)|2,{81,101,0}}, +/* 55389 */ {(12<<2)|2,{81,101,0}}, +/* 55390 */ {(12<<2)|2,{81,101,0}}, +/* 55391 */ {(12<<2)|2,{81,101,0}}, +/* 55392 */ {(12<<2)|2,{81,105,0}}, +/* 55393 */ {(12<<2)|2,{81,105,0}}, +/* 55394 */ {(12<<2)|2,{81,105,0}}, +/* 55395 */ {(12<<2)|2,{81,105,0}}, +/* 55396 */ {(12<<2)|2,{81,105,0}}, +/* 55397 */ {(12<<2)|2,{81,105,0}}, +/* 55398 */ {(12<<2)|2,{81,105,0}}, +/* 55399 */ {(12<<2)|2,{81,105,0}}, +/* 55400 */ {(12<<2)|2,{81,105,0}}, +/* 55401 */ {(12<<2)|2,{81,105,0}}, +/* 55402 */ {(12<<2)|2,{81,105,0}}, +/* 55403 */ {(12<<2)|2,{81,105,0}}, +/* 55404 */ {(12<<2)|2,{81,105,0}}, +/* 55405 */ {(12<<2)|2,{81,105,0}}, +/* 55406 */ {(12<<2)|2,{81,105,0}}, +/* 55407 */ {(12<<2)|2,{81,105,0}}, +/* 55408 */ {(12<<2)|2,{81,111,0}}, +/* 55409 */ {(12<<2)|2,{81,111,0}}, +/* 55410 */ {(12<<2)|2,{81,111,0}}, +/* 55411 */ {(12<<2)|2,{81,111,0}}, +/* 55412 */ {(12<<2)|2,{81,111,0}}, +/* 55413 */ {(12<<2)|2,{81,111,0}}, +/* 55414 */ {(12<<2)|2,{81,111,0}}, +/* 55415 */ {(12<<2)|2,{81,111,0}}, +/* 55416 */ {(12<<2)|2,{81,111,0}}, +/* 55417 */ {(12<<2)|2,{81,111,0}}, +/* 55418 */ {(12<<2)|2,{81,111,0}}, +/* 55419 */ {(12<<2)|2,{81,111,0}}, +/* 55420 */ {(12<<2)|2,{81,111,0}}, +/* 55421 */ {(12<<2)|2,{81,111,0}}, +/* 55422 */ {(12<<2)|2,{81,111,0}}, +/* 55423 */ {(12<<2)|2,{81,111,0}}, +/* 55424 */ {(12<<2)|2,{81,115,0}}, +/* 55425 */ {(12<<2)|2,{81,115,0}}, +/* 55426 */ {(12<<2)|2,{81,115,0}}, +/* 55427 */ {(12<<2)|2,{81,115,0}}, +/* 55428 */ {(12<<2)|2,{81,115,0}}, +/* 55429 */ {(12<<2)|2,{81,115,0}}, +/* 55430 */ {(12<<2)|2,{81,115,0}}, +/* 55431 */ {(12<<2)|2,{81,115,0}}, +/* 55432 */ {(12<<2)|2,{81,115,0}}, +/* 55433 */ {(12<<2)|2,{81,115,0}}, +/* 55434 */ {(12<<2)|2,{81,115,0}}, +/* 55435 */ {(12<<2)|2,{81,115,0}}, +/* 55436 */ {(12<<2)|2,{81,115,0}}, +/* 55437 */ {(12<<2)|2,{81,115,0}}, +/* 55438 */ {(12<<2)|2,{81,115,0}}, +/* 55439 */ {(12<<2)|2,{81,115,0}}, +/* 55440 */ {(12<<2)|2,{81,116,0}}, +/* 55441 */ {(12<<2)|2,{81,116,0}}, +/* 55442 */ {(12<<2)|2,{81,116,0}}, +/* 55443 */ {(12<<2)|2,{81,116,0}}, +/* 55444 */ {(12<<2)|2,{81,116,0}}, +/* 55445 */ {(12<<2)|2,{81,116,0}}, +/* 55446 */ {(12<<2)|2,{81,116,0}}, +/* 55447 */ {(12<<2)|2,{81,116,0}}, +/* 55448 */ {(12<<2)|2,{81,116,0}}, +/* 55449 */ {(12<<2)|2,{81,116,0}}, +/* 55450 */ {(12<<2)|2,{81,116,0}}, +/* 55451 */ {(12<<2)|2,{81,116,0}}, +/* 55452 */ {(12<<2)|2,{81,116,0}}, +/* 55453 */ {(12<<2)|2,{81,116,0}}, +/* 55454 */ {(12<<2)|2,{81,116,0}}, +/* 55455 */ {(12<<2)|2,{81,116,0}}, +/* 55456 */ {(13<<2)|2,{81,32,0}}, +/* 55457 */ {(13<<2)|2,{81,32,0}}, +/* 55458 */ {(13<<2)|2,{81,32,0}}, +/* 55459 */ {(13<<2)|2,{81,32,0}}, +/* 55460 */ {(13<<2)|2,{81,32,0}}, +/* 55461 */ {(13<<2)|2,{81,32,0}}, +/* 55462 */ {(13<<2)|2,{81,32,0}}, +/* 55463 */ {(13<<2)|2,{81,32,0}}, +/* 55464 */ {(13<<2)|2,{81,37,0}}, +/* 55465 */ {(13<<2)|2,{81,37,0}}, +/* 55466 */ {(13<<2)|2,{81,37,0}}, +/* 55467 */ {(13<<2)|2,{81,37,0}}, +/* 55468 */ {(13<<2)|2,{81,37,0}}, +/* 55469 */ {(13<<2)|2,{81,37,0}}, +/* 55470 */ {(13<<2)|2,{81,37,0}}, +/* 55471 */ {(13<<2)|2,{81,37,0}}, +/* 55472 */ {(13<<2)|2,{81,45,0}}, +/* 55473 */ {(13<<2)|2,{81,45,0}}, +/* 55474 */ {(13<<2)|2,{81,45,0}}, +/* 55475 */ {(13<<2)|2,{81,45,0}}, +/* 55476 */ {(13<<2)|2,{81,45,0}}, +/* 55477 */ {(13<<2)|2,{81,45,0}}, +/* 55478 */ {(13<<2)|2,{81,45,0}}, +/* 55479 */ {(13<<2)|2,{81,45,0}}, +/* 55480 */ {(13<<2)|2,{81,46,0}}, +/* 55481 */ {(13<<2)|2,{81,46,0}}, +/* 55482 */ {(13<<2)|2,{81,46,0}}, +/* 55483 */ {(13<<2)|2,{81,46,0}}, +/* 55484 */ {(13<<2)|2,{81,46,0}}, +/* 55485 */ {(13<<2)|2,{81,46,0}}, +/* 55486 */ {(13<<2)|2,{81,46,0}}, +/* 55487 */ {(13<<2)|2,{81,46,0}}, +/* 55488 */ {(13<<2)|2,{81,47,0}}, +/* 55489 */ {(13<<2)|2,{81,47,0}}, +/* 55490 */ {(13<<2)|2,{81,47,0}}, +/* 55491 */ {(13<<2)|2,{81,47,0}}, +/* 55492 */ {(13<<2)|2,{81,47,0}}, +/* 55493 */ {(13<<2)|2,{81,47,0}}, +/* 55494 */ {(13<<2)|2,{81,47,0}}, +/* 55495 */ {(13<<2)|2,{81,47,0}}, +/* 55496 */ {(13<<2)|2,{81,51,0}}, +/* 55497 */ {(13<<2)|2,{81,51,0}}, +/* 55498 */ {(13<<2)|2,{81,51,0}}, +/* 55499 */ {(13<<2)|2,{81,51,0}}, +/* 55500 */ {(13<<2)|2,{81,51,0}}, +/* 55501 */ {(13<<2)|2,{81,51,0}}, +/* 55502 */ {(13<<2)|2,{81,51,0}}, +/* 55503 */ {(13<<2)|2,{81,51,0}}, +/* 55504 */ {(13<<2)|2,{81,52,0}}, +/* 55505 */ {(13<<2)|2,{81,52,0}}, +/* 55506 */ {(13<<2)|2,{81,52,0}}, +/* 55507 */ {(13<<2)|2,{81,52,0}}, +/* 55508 */ {(13<<2)|2,{81,52,0}}, +/* 55509 */ {(13<<2)|2,{81,52,0}}, +/* 55510 */ {(13<<2)|2,{81,52,0}}, +/* 55511 */ {(13<<2)|2,{81,52,0}}, +/* 55512 */ {(13<<2)|2,{81,53,0}}, +/* 55513 */ {(13<<2)|2,{81,53,0}}, +/* 55514 */ {(13<<2)|2,{81,53,0}}, +/* 55515 */ {(13<<2)|2,{81,53,0}}, +/* 55516 */ {(13<<2)|2,{81,53,0}}, +/* 55517 */ {(13<<2)|2,{81,53,0}}, +/* 55518 */ {(13<<2)|2,{81,53,0}}, +/* 55519 */ {(13<<2)|2,{81,53,0}}, +/* 55520 */ {(13<<2)|2,{81,54,0}}, +/* 55521 */ {(13<<2)|2,{81,54,0}}, +/* 55522 */ {(13<<2)|2,{81,54,0}}, +/* 55523 */ {(13<<2)|2,{81,54,0}}, +/* 55524 */ {(13<<2)|2,{81,54,0}}, +/* 55525 */ {(13<<2)|2,{81,54,0}}, +/* 55526 */ {(13<<2)|2,{81,54,0}}, +/* 55527 */ {(13<<2)|2,{81,54,0}}, +/* 55528 */ {(13<<2)|2,{81,55,0}}, +/* 55529 */ {(13<<2)|2,{81,55,0}}, +/* 55530 */ {(13<<2)|2,{81,55,0}}, +/* 55531 */ {(13<<2)|2,{81,55,0}}, +/* 55532 */ {(13<<2)|2,{81,55,0}}, +/* 55533 */ {(13<<2)|2,{81,55,0}}, +/* 55534 */ {(13<<2)|2,{81,55,0}}, +/* 55535 */ {(13<<2)|2,{81,55,0}}, +/* 55536 */ {(13<<2)|2,{81,56,0}}, +/* 55537 */ {(13<<2)|2,{81,56,0}}, +/* 55538 */ {(13<<2)|2,{81,56,0}}, +/* 55539 */ {(13<<2)|2,{81,56,0}}, +/* 55540 */ {(13<<2)|2,{81,56,0}}, +/* 55541 */ {(13<<2)|2,{81,56,0}}, +/* 55542 */ {(13<<2)|2,{81,56,0}}, +/* 55543 */ {(13<<2)|2,{81,56,0}}, +/* 55544 */ {(13<<2)|2,{81,57,0}}, +/* 55545 */ {(13<<2)|2,{81,57,0}}, +/* 55546 */ {(13<<2)|2,{81,57,0}}, +/* 55547 */ {(13<<2)|2,{81,57,0}}, +/* 55548 */ {(13<<2)|2,{81,57,0}}, +/* 55549 */ {(13<<2)|2,{81,57,0}}, +/* 55550 */ {(13<<2)|2,{81,57,0}}, +/* 55551 */ {(13<<2)|2,{81,57,0}}, +/* 55552 */ {(13<<2)|2,{81,61,0}}, +/* 55553 */ {(13<<2)|2,{81,61,0}}, +/* 55554 */ {(13<<2)|2,{81,61,0}}, +/* 55555 */ {(13<<2)|2,{81,61,0}}, +/* 55556 */ {(13<<2)|2,{81,61,0}}, +/* 55557 */ {(13<<2)|2,{81,61,0}}, +/* 55558 */ {(13<<2)|2,{81,61,0}}, +/* 55559 */ {(13<<2)|2,{81,61,0}}, +/* 55560 */ {(13<<2)|2,{81,65,0}}, +/* 55561 */ {(13<<2)|2,{81,65,0}}, +/* 55562 */ {(13<<2)|2,{81,65,0}}, +/* 55563 */ {(13<<2)|2,{81,65,0}}, +/* 55564 */ {(13<<2)|2,{81,65,0}}, +/* 55565 */ {(13<<2)|2,{81,65,0}}, +/* 55566 */ {(13<<2)|2,{81,65,0}}, +/* 55567 */ {(13<<2)|2,{81,65,0}}, +/* 55568 */ {(13<<2)|2,{81,95,0}}, +/* 55569 */ {(13<<2)|2,{81,95,0}}, +/* 55570 */ {(13<<2)|2,{81,95,0}}, +/* 55571 */ {(13<<2)|2,{81,95,0}}, +/* 55572 */ {(13<<2)|2,{81,95,0}}, +/* 55573 */ {(13<<2)|2,{81,95,0}}, +/* 55574 */ {(13<<2)|2,{81,95,0}}, +/* 55575 */ {(13<<2)|2,{81,95,0}}, +/* 55576 */ {(13<<2)|2,{81,98,0}}, +/* 55577 */ {(13<<2)|2,{81,98,0}}, +/* 55578 */ {(13<<2)|2,{81,98,0}}, +/* 55579 */ {(13<<2)|2,{81,98,0}}, +/* 55580 */ {(13<<2)|2,{81,98,0}}, +/* 55581 */ {(13<<2)|2,{81,98,0}}, +/* 55582 */ {(13<<2)|2,{81,98,0}}, +/* 55583 */ {(13<<2)|2,{81,98,0}}, +/* 55584 */ {(13<<2)|2,{81,100,0}}, +/* 55585 */ {(13<<2)|2,{81,100,0}}, +/* 55586 */ {(13<<2)|2,{81,100,0}}, +/* 55587 */ {(13<<2)|2,{81,100,0}}, +/* 55588 */ {(13<<2)|2,{81,100,0}}, +/* 55589 */ {(13<<2)|2,{81,100,0}}, +/* 55590 */ {(13<<2)|2,{81,100,0}}, +/* 55591 */ {(13<<2)|2,{81,100,0}}, +/* 55592 */ {(13<<2)|2,{81,102,0}}, +/* 55593 */ {(13<<2)|2,{81,102,0}}, +/* 55594 */ {(13<<2)|2,{81,102,0}}, +/* 55595 */ {(13<<2)|2,{81,102,0}}, +/* 55596 */ {(13<<2)|2,{81,102,0}}, +/* 55597 */ {(13<<2)|2,{81,102,0}}, +/* 55598 */ {(13<<2)|2,{81,102,0}}, +/* 55599 */ {(13<<2)|2,{81,102,0}}, +/* 55600 */ {(13<<2)|2,{81,103,0}}, +/* 55601 */ {(13<<2)|2,{81,103,0}}, +/* 55602 */ {(13<<2)|2,{81,103,0}}, +/* 55603 */ {(13<<2)|2,{81,103,0}}, +/* 55604 */ {(13<<2)|2,{81,103,0}}, +/* 55605 */ {(13<<2)|2,{81,103,0}}, +/* 55606 */ {(13<<2)|2,{81,103,0}}, +/* 55607 */ {(13<<2)|2,{81,103,0}}, +/* 55608 */ {(13<<2)|2,{81,104,0}}, +/* 55609 */ {(13<<2)|2,{81,104,0}}, +/* 55610 */ {(13<<2)|2,{81,104,0}}, +/* 55611 */ {(13<<2)|2,{81,104,0}}, +/* 55612 */ {(13<<2)|2,{81,104,0}}, +/* 55613 */ {(13<<2)|2,{81,104,0}}, +/* 55614 */ {(13<<2)|2,{81,104,0}}, +/* 55615 */ {(13<<2)|2,{81,104,0}}, +/* 55616 */ {(13<<2)|2,{81,108,0}}, +/* 55617 */ {(13<<2)|2,{81,108,0}}, +/* 55618 */ {(13<<2)|2,{81,108,0}}, +/* 55619 */ {(13<<2)|2,{81,108,0}}, +/* 55620 */ {(13<<2)|2,{81,108,0}}, +/* 55621 */ {(13<<2)|2,{81,108,0}}, +/* 55622 */ {(13<<2)|2,{81,108,0}}, +/* 55623 */ {(13<<2)|2,{81,108,0}}, +/* 55624 */ {(13<<2)|2,{81,109,0}}, +/* 55625 */ {(13<<2)|2,{81,109,0}}, +/* 55626 */ {(13<<2)|2,{81,109,0}}, +/* 55627 */ {(13<<2)|2,{81,109,0}}, +/* 55628 */ {(13<<2)|2,{81,109,0}}, +/* 55629 */ {(13<<2)|2,{81,109,0}}, +/* 55630 */ {(13<<2)|2,{81,109,0}}, +/* 55631 */ {(13<<2)|2,{81,109,0}}, +/* 55632 */ {(13<<2)|2,{81,110,0}}, +/* 55633 */ {(13<<2)|2,{81,110,0}}, +/* 55634 */ {(13<<2)|2,{81,110,0}}, +/* 55635 */ {(13<<2)|2,{81,110,0}}, +/* 55636 */ {(13<<2)|2,{81,110,0}}, +/* 55637 */ {(13<<2)|2,{81,110,0}}, +/* 55638 */ {(13<<2)|2,{81,110,0}}, +/* 55639 */ {(13<<2)|2,{81,110,0}}, +/* 55640 */ {(13<<2)|2,{81,112,0}}, +/* 55641 */ {(13<<2)|2,{81,112,0}}, +/* 55642 */ {(13<<2)|2,{81,112,0}}, +/* 55643 */ {(13<<2)|2,{81,112,0}}, +/* 55644 */ {(13<<2)|2,{81,112,0}}, +/* 55645 */ {(13<<2)|2,{81,112,0}}, +/* 55646 */ {(13<<2)|2,{81,112,0}}, +/* 55647 */ {(13<<2)|2,{81,112,0}}, +/* 55648 */ {(13<<2)|2,{81,114,0}}, +/* 55649 */ {(13<<2)|2,{81,114,0}}, +/* 55650 */ {(13<<2)|2,{81,114,0}}, +/* 55651 */ {(13<<2)|2,{81,114,0}}, +/* 55652 */ {(13<<2)|2,{81,114,0}}, +/* 55653 */ {(13<<2)|2,{81,114,0}}, +/* 55654 */ {(13<<2)|2,{81,114,0}}, +/* 55655 */ {(13<<2)|2,{81,114,0}}, +/* 55656 */ {(13<<2)|2,{81,117,0}}, +/* 55657 */ {(13<<2)|2,{81,117,0}}, +/* 55658 */ {(13<<2)|2,{81,117,0}}, +/* 55659 */ {(13<<2)|2,{81,117,0}}, +/* 55660 */ {(13<<2)|2,{81,117,0}}, +/* 55661 */ {(13<<2)|2,{81,117,0}}, +/* 55662 */ {(13<<2)|2,{81,117,0}}, +/* 55663 */ {(13<<2)|2,{81,117,0}}, +/* 55664 */ {(14<<2)|2,{81,58,0}}, +/* 55665 */ {(14<<2)|2,{81,58,0}}, +/* 55666 */ {(14<<2)|2,{81,58,0}}, +/* 55667 */ {(14<<2)|2,{81,58,0}}, +/* 55668 */ {(14<<2)|2,{81,66,0}}, +/* 55669 */ {(14<<2)|2,{81,66,0}}, +/* 55670 */ {(14<<2)|2,{81,66,0}}, +/* 55671 */ {(14<<2)|2,{81,66,0}}, +/* 55672 */ {(14<<2)|2,{81,67,0}}, +/* 55673 */ {(14<<2)|2,{81,67,0}}, +/* 55674 */ {(14<<2)|2,{81,67,0}}, +/* 55675 */ {(14<<2)|2,{81,67,0}}, +/* 55676 */ {(14<<2)|2,{81,68,0}}, +/* 55677 */ {(14<<2)|2,{81,68,0}}, +/* 55678 */ {(14<<2)|2,{81,68,0}}, +/* 55679 */ {(14<<2)|2,{81,68,0}}, +/* 55680 */ {(14<<2)|2,{81,69,0}}, +/* 55681 */ {(14<<2)|2,{81,69,0}}, +/* 55682 */ {(14<<2)|2,{81,69,0}}, +/* 55683 */ {(14<<2)|2,{81,69,0}}, +/* 55684 */ {(14<<2)|2,{81,70,0}}, +/* 55685 */ {(14<<2)|2,{81,70,0}}, +/* 55686 */ {(14<<2)|2,{81,70,0}}, +/* 55687 */ {(14<<2)|2,{81,70,0}}, +/* 55688 */ {(14<<2)|2,{81,71,0}}, +/* 55689 */ {(14<<2)|2,{81,71,0}}, +/* 55690 */ {(14<<2)|2,{81,71,0}}, +/* 55691 */ {(14<<2)|2,{81,71,0}}, +/* 55692 */ {(14<<2)|2,{81,72,0}}, +/* 55693 */ {(14<<2)|2,{81,72,0}}, +/* 55694 */ {(14<<2)|2,{81,72,0}}, +/* 55695 */ {(14<<2)|2,{81,72,0}}, +/* 55696 */ {(14<<2)|2,{81,73,0}}, +/* 55697 */ {(14<<2)|2,{81,73,0}}, +/* 55698 */ {(14<<2)|2,{81,73,0}}, +/* 55699 */ {(14<<2)|2,{81,73,0}}, +/* 55700 */ {(14<<2)|2,{81,74,0}}, +/* 55701 */ {(14<<2)|2,{81,74,0}}, +/* 55702 */ {(14<<2)|2,{81,74,0}}, +/* 55703 */ {(14<<2)|2,{81,74,0}}, +/* 55704 */ {(14<<2)|2,{81,75,0}}, +/* 55705 */ {(14<<2)|2,{81,75,0}}, +/* 55706 */ {(14<<2)|2,{81,75,0}}, +/* 55707 */ {(14<<2)|2,{81,75,0}}, +/* 55708 */ {(14<<2)|2,{81,76,0}}, +/* 55709 */ {(14<<2)|2,{81,76,0}}, +/* 55710 */ {(14<<2)|2,{81,76,0}}, +/* 55711 */ {(14<<2)|2,{81,76,0}}, +/* 55712 */ {(14<<2)|2,{81,77,0}}, +/* 55713 */ {(14<<2)|2,{81,77,0}}, +/* 55714 */ {(14<<2)|2,{81,77,0}}, +/* 55715 */ {(14<<2)|2,{81,77,0}}, +/* 55716 */ {(14<<2)|2,{81,78,0}}, +/* 55717 */ {(14<<2)|2,{81,78,0}}, +/* 55718 */ {(14<<2)|2,{81,78,0}}, +/* 55719 */ {(14<<2)|2,{81,78,0}}, +/* 55720 */ {(14<<2)|2,{81,79,0}}, +/* 55721 */ {(14<<2)|2,{81,79,0}}, +/* 55722 */ {(14<<2)|2,{81,79,0}}, +/* 55723 */ {(14<<2)|2,{81,79,0}}, +/* 55724 */ {(14<<2)|2,{81,80,0}}, +/* 55725 */ {(14<<2)|2,{81,80,0}}, +/* 55726 */ {(14<<2)|2,{81,80,0}}, +/* 55727 */ {(14<<2)|2,{81,80,0}}, +/* 55728 */ {(14<<2)|2,{81,81,0}}, +/* 55729 */ {(14<<2)|2,{81,81,0}}, +/* 55730 */ {(14<<2)|2,{81,81,0}}, +/* 55731 */ {(14<<2)|2,{81,81,0}}, +/* 55732 */ {(14<<2)|2,{81,82,0}}, +/* 55733 */ {(14<<2)|2,{81,82,0}}, +/* 55734 */ {(14<<2)|2,{81,82,0}}, +/* 55735 */ {(14<<2)|2,{81,82,0}}, +/* 55736 */ {(14<<2)|2,{81,83,0}}, +/* 55737 */ {(14<<2)|2,{81,83,0}}, +/* 55738 */ {(14<<2)|2,{81,83,0}}, +/* 55739 */ {(14<<2)|2,{81,83,0}}, +/* 55740 */ {(14<<2)|2,{81,84,0}}, +/* 55741 */ {(14<<2)|2,{81,84,0}}, +/* 55742 */ {(14<<2)|2,{81,84,0}}, +/* 55743 */ {(14<<2)|2,{81,84,0}}, +/* 55744 */ {(14<<2)|2,{81,85,0}}, +/* 55745 */ {(14<<2)|2,{81,85,0}}, +/* 55746 */ {(14<<2)|2,{81,85,0}}, +/* 55747 */ {(14<<2)|2,{81,85,0}}, +/* 55748 */ {(14<<2)|2,{81,86,0}}, +/* 55749 */ {(14<<2)|2,{81,86,0}}, +/* 55750 */ {(14<<2)|2,{81,86,0}}, +/* 55751 */ {(14<<2)|2,{81,86,0}}, +/* 55752 */ {(14<<2)|2,{81,87,0}}, +/* 55753 */ {(14<<2)|2,{81,87,0}}, +/* 55754 */ {(14<<2)|2,{81,87,0}}, +/* 55755 */ {(14<<2)|2,{81,87,0}}, +/* 55756 */ {(14<<2)|2,{81,89,0}}, +/* 55757 */ {(14<<2)|2,{81,89,0}}, +/* 55758 */ {(14<<2)|2,{81,89,0}}, +/* 55759 */ {(14<<2)|2,{81,89,0}}, +/* 55760 */ {(14<<2)|2,{81,106,0}}, +/* 55761 */ {(14<<2)|2,{81,106,0}}, +/* 55762 */ {(14<<2)|2,{81,106,0}}, +/* 55763 */ {(14<<2)|2,{81,106,0}}, +/* 55764 */ {(14<<2)|2,{81,107,0}}, +/* 55765 */ {(14<<2)|2,{81,107,0}}, +/* 55766 */ {(14<<2)|2,{81,107,0}}, +/* 55767 */ {(14<<2)|2,{81,107,0}}, +/* 55768 */ {(14<<2)|2,{81,113,0}}, +/* 55769 */ {(14<<2)|2,{81,113,0}}, +/* 55770 */ {(14<<2)|2,{81,113,0}}, +/* 55771 */ {(14<<2)|2,{81,113,0}}, +/* 55772 */ {(14<<2)|2,{81,118,0}}, +/* 55773 */ {(14<<2)|2,{81,118,0}}, +/* 55774 */ {(14<<2)|2,{81,118,0}}, +/* 55775 */ {(14<<2)|2,{81,118,0}}, +/* 55776 */ {(14<<2)|2,{81,119,0}}, +/* 55777 */ {(14<<2)|2,{81,119,0}}, +/* 55778 */ {(14<<2)|2,{81,119,0}}, +/* 55779 */ {(14<<2)|2,{81,119,0}}, +/* 55780 */ {(14<<2)|2,{81,120,0}}, +/* 55781 */ {(14<<2)|2,{81,120,0}}, +/* 55782 */ {(14<<2)|2,{81,120,0}}, +/* 55783 */ {(14<<2)|2,{81,120,0}}, +/* 55784 */ {(14<<2)|2,{81,121,0}}, +/* 55785 */ {(14<<2)|2,{81,121,0}}, +/* 55786 */ {(14<<2)|2,{81,121,0}}, +/* 55787 */ {(14<<2)|2,{81,121,0}}, +/* 55788 */ {(14<<2)|2,{81,122,0}}, +/* 55789 */ {(14<<2)|2,{81,122,0}}, +/* 55790 */ {(14<<2)|2,{81,122,0}}, +/* 55791 */ {(14<<2)|2,{81,122,0}}, +/* 55792 */ {(15<<2)|2,{81,38,0}}, +/* 55793 */ {(15<<2)|2,{81,38,0}}, +/* 55794 */ {(15<<2)|2,{81,42,0}}, +/* 55795 */ {(15<<2)|2,{81,42,0}}, +/* 55796 */ {(15<<2)|2,{81,44,0}}, +/* 55797 */ {(15<<2)|2,{81,44,0}}, +/* 55798 */ {(15<<2)|2,{81,59,0}}, +/* 55799 */ {(15<<2)|2,{81,59,0}}, +/* 55800 */ {(15<<2)|2,{81,88,0}}, +/* 55801 */ {(15<<2)|2,{81,88,0}}, +/* 55802 */ {(15<<2)|2,{81,90,0}}, +/* 55803 */ {(15<<2)|2,{81,90,0}}, +/* 55804 */ {(7<<2)|1,{81,0,0}}, +/* 55805 */ {(7<<2)|1,{81,0,0}}, +/* 55806 */ {(7<<2)|1,{81,0,0}}, +/* 55807 */ {(7<<2)|1,{81,0,0}}, +/* 55808 */ {(12<<2)|2,{82,48,0}}, +/* 55809 */ {(12<<2)|2,{82,48,0}}, +/* 55810 */ {(12<<2)|2,{82,48,0}}, +/* 55811 */ {(12<<2)|2,{82,48,0}}, +/* 55812 */ {(12<<2)|2,{82,48,0}}, +/* 55813 */ {(12<<2)|2,{82,48,0}}, +/* 55814 */ {(12<<2)|2,{82,48,0}}, +/* 55815 */ {(12<<2)|2,{82,48,0}}, +/* 55816 */ {(12<<2)|2,{82,48,0}}, +/* 55817 */ {(12<<2)|2,{82,48,0}}, +/* 55818 */ {(12<<2)|2,{82,48,0}}, +/* 55819 */ {(12<<2)|2,{82,48,0}}, +/* 55820 */ {(12<<2)|2,{82,48,0}}, +/* 55821 */ {(12<<2)|2,{82,48,0}}, +/* 55822 */ {(12<<2)|2,{82,48,0}}, +/* 55823 */ {(12<<2)|2,{82,48,0}}, +/* 55824 */ {(12<<2)|2,{82,49,0}}, +/* 55825 */ {(12<<2)|2,{82,49,0}}, +/* 55826 */ {(12<<2)|2,{82,49,0}}, +/* 55827 */ {(12<<2)|2,{82,49,0}}, +/* 55828 */ {(12<<2)|2,{82,49,0}}, +/* 55829 */ {(12<<2)|2,{82,49,0}}, +/* 55830 */ {(12<<2)|2,{82,49,0}}, +/* 55831 */ {(12<<2)|2,{82,49,0}}, +/* 55832 */ {(12<<2)|2,{82,49,0}}, +/* 55833 */ {(12<<2)|2,{82,49,0}}, +/* 55834 */ {(12<<2)|2,{82,49,0}}, +/* 55835 */ {(12<<2)|2,{82,49,0}}, +/* 55836 */ {(12<<2)|2,{82,49,0}}, +/* 55837 */ {(12<<2)|2,{82,49,0}}, +/* 55838 */ {(12<<2)|2,{82,49,0}}, +/* 55839 */ {(12<<2)|2,{82,49,0}}, +/* 55840 */ {(12<<2)|2,{82,50,0}}, +/* 55841 */ {(12<<2)|2,{82,50,0}}, +/* 55842 */ {(12<<2)|2,{82,50,0}}, +/* 55843 */ {(12<<2)|2,{82,50,0}}, +/* 55844 */ {(12<<2)|2,{82,50,0}}, +/* 55845 */ {(12<<2)|2,{82,50,0}}, +/* 55846 */ {(12<<2)|2,{82,50,0}}, +/* 55847 */ {(12<<2)|2,{82,50,0}}, +/* 55848 */ {(12<<2)|2,{82,50,0}}, +/* 55849 */ {(12<<2)|2,{82,50,0}}, +/* 55850 */ {(12<<2)|2,{82,50,0}}, +/* 55851 */ {(12<<2)|2,{82,50,0}}, +/* 55852 */ {(12<<2)|2,{82,50,0}}, +/* 55853 */ {(12<<2)|2,{82,50,0}}, +/* 55854 */ {(12<<2)|2,{82,50,0}}, +/* 55855 */ {(12<<2)|2,{82,50,0}}, +/* 55856 */ {(12<<2)|2,{82,97,0}}, +/* 55857 */ {(12<<2)|2,{82,97,0}}, +/* 55858 */ {(12<<2)|2,{82,97,0}}, +/* 55859 */ {(12<<2)|2,{82,97,0}}, +/* 55860 */ {(12<<2)|2,{82,97,0}}, +/* 55861 */ {(12<<2)|2,{82,97,0}}, +/* 55862 */ {(12<<2)|2,{82,97,0}}, +/* 55863 */ {(12<<2)|2,{82,97,0}}, +/* 55864 */ {(12<<2)|2,{82,97,0}}, +/* 55865 */ {(12<<2)|2,{82,97,0}}, +/* 55866 */ {(12<<2)|2,{82,97,0}}, +/* 55867 */ {(12<<2)|2,{82,97,0}}, +/* 55868 */ {(12<<2)|2,{82,97,0}}, +/* 55869 */ {(12<<2)|2,{82,97,0}}, +/* 55870 */ {(12<<2)|2,{82,97,0}}, +/* 55871 */ {(12<<2)|2,{82,97,0}}, +/* 55872 */ {(12<<2)|2,{82,99,0}}, +/* 55873 */ {(12<<2)|2,{82,99,0}}, +/* 55874 */ {(12<<2)|2,{82,99,0}}, +/* 55875 */ {(12<<2)|2,{82,99,0}}, +/* 55876 */ {(12<<2)|2,{82,99,0}}, +/* 55877 */ {(12<<2)|2,{82,99,0}}, +/* 55878 */ {(12<<2)|2,{82,99,0}}, +/* 55879 */ {(12<<2)|2,{82,99,0}}, +/* 55880 */ {(12<<2)|2,{82,99,0}}, +/* 55881 */ {(12<<2)|2,{82,99,0}}, +/* 55882 */ {(12<<2)|2,{82,99,0}}, +/* 55883 */ {(12<<2)|2,{82,99,0}}, +/* 55884 */ {(12<<2)|2,{82,99,0}}, +/* 55885 */ {(12<<2)|2,{82,99,0}}, +/* 55886 */ {(12<<2)|2,{82,99,0}}, +/* 55887 */ {(12<<2)|2,{82,99,0}}, +/* 55888 */ {(12<<2)|2,{82,101,0}}, +/* 55889 */ {(12<<2)|2,{82,101,0}}, +/* 55890 */ {(12<<2)|2,{82,101,0}}, +/* 55891 */ {(12<<2)|2,{82,101,0}}, +/* 55892 */ {(12<<2)|2,{82,101,0}}, +/* 55893 */ {(12<<2)|2,{82,101,0}}, +/* 55894 */ {(12<<2)|2,{82,101,0}}, +/* 55895 */ {(12<<2)|2,{82,101,0}}, +/* 55896 */ {(12<<2)|2,{82,101,0}}, +/* 55897 */ {(12<<2)|2,{82,101,0}}, +/* 55898 */ {(12<<2)|2,{82,101,0}}, +/* 55899 */ {(12<<2)|2,{82,101,0}}, +/* 55900 */ {(12<<2)|2,{82,101,0}}, +/* 55901 */ {(12<<2)|2,{82,101,0}}, +/* 55902 */ {(12<<2)|2,{82,101,0}}, +/* 55903 */ {(12<<2)|2,{82,101,0}}, +/* 55904 */ {(12<<2)|2,{82,105,0}}, +/* 55905 */ {(12<<2)|2,{82,105,0}}, +/* 55906 */ {(12<<2)|2,{82,105,0}}, +/* 55907 */ {(12<<2)|2,{82,105,0}}, +/* 55908 */ {(12<<2)|2,{82,105,0}}, +/* 55909 */ {(12<<2)|2,{82,105,0}}, +/* 55910 */ {(12<<2)|2,{82,105,0}}, +/* 55911 */ {(12<<2)|2,{82,105,0}}, +/* 55912 */ {(12<<2)|2,{82,105,0}}, +/* 55913 */ {(12<<2)|2,{82,105,0}}, +/* 55914 */ {(12<<2)|2,{82,105,0}}, +/* 55915 */ {(12<<2)|2,{82,105,0}}, +/* 55916 */ {(12<<2)|2,{82,105,0}}, +/* 55917 */ {(12<<2)|2,{82,105,0}}, +/* 55918 */ {(12<<2)|2,{82,105,0}}, +/* 55919 */ {(12<<2)|2,{82,105,0}}, +/* 55920 */ {(12<<2)|2,{82,111,0}}, +/* 55921 */ {(12<<2)|2,{82,111,0}}, +/* 55922 */ {(12<<2)|2,{82,111,0}}, +/* 55923 */ {(12<<2)|2,{82,111,0}}, +/* 55924 */ {(12<<2)|2,{82,111,0}}, +/* 55925 */ {(12<<2)|2,{82,111,0}}, +/* 55926 */ {(12<<2)|2,{82,111,0}}, +/* 55927 */ {(12<<2)|2,{82,111,0}}, +/* 55928 */ {(12<<2)|2,{82,111,0}}, +/* 55929 */ {(12<<2)|2,{82,111,0}}, +/* 55930 */ {(12<<2)|2,{82,111,0}}, +/* 55931 */ {(12<<2)|2,{82,111,0}}, +/* 55932 */ {(12<<2)|2,{82,111,0}}, +/* 55933 */ {(12<<2)|2,{82,111,0}}, +/* 55934 */ {(12<<2)|2,{82,111,0}}, +/* 55935 */ {(12<<2)|2,{82,111,0}}, +/* 55936 */ {(12<<2)|2,{82,115,0}}, +/* 55937 */ {(12<<2)|2,{82,115,0}}, +/* 55938 */ {(12<<2)|2,{82,115,0}}, +/* 55939 */ {(12<<2)|2,{82,115,0}}, +/* 55940 */ {(12<<2)|2,{82,115,0}}, +/* 55941 */ {(12<<2)|2,{82,115,0}}, +/* 55942 */ {(12<<2)|2,{82,115,0}}, +/* 55943 */ {(12<<2)|2,{82,115,0}}, +/* 55944 */ {(12<<2)|2,{82,115,0}}, +/* 55945 */ {(12<<2)|2,{82,115,0}}, +/* 55946 */ {(12<<2)|2,{82,115,0}}, +/* 55947 */ {(12<<2)|2,{82,115,0}}, +/* 55948 */ {(12<<2)|2,{82,115,0}}, +/* 55949 */ {(12<<2)|2,{82,115,0}}, +/* 55950 */ {(12<<2)|2,{82,115,0}}, +/* 55951 */ {(12<<2)|2,{82,115,0}}, +/* 55952 */ {(12<<2)|2,{82,116,0}}, +/* 55953 */ {(12<<2)|2,{82,116,0}}, +/* 55954 */ {(12<<2)|2,{82,116,0}}, +/* 55955 */ {(12<<2)|2,{82,116,0}}, +/* 55956 */ {(12<<2)|2,{82,116,0}}, +/* 55957 */ {(12<<2)|2,{82,116,0}}, +/* 55958 */ {(12<<2)|2,{82,116,0}}, +/* 55959 */ {(12<<2)|2,{82,116,0}}, +/* 55960 */ {(12<<2)|2,{82,116,0}}, +/* 55961 */ {(12<<2)|2,{82,116,0}}, +/* 55962 */ {(12<<2)|2,{82,116,0}}, +/* 55963 */ {(12<<2)|2,{82,116,0}}, +/* 55964 */ {(12<<2)|2,{82,116,0}}, +/* 55965 */ {(12<<2)|2,{82,116,0}}, +/* 55966 */ {(12<<2)|2,{82,116,0}}, +/* 55967 */ {(12<<2)|2,{82,116,0}}, +/* 55968 */ {(13<<2)|2,{82,32,0}}, +/* 55969 */ {(13<<2)|2,{82,32,0}}, +/* 55970 */ {(13<<2)|2,{82,32,0}}, +/* 55971 */ {(13<<2)|2,{82,32,0}}, +/* 55972 */ {(13<<2)|2,{82,32,0}}, +/* 55973 */ {(13<<2)|2,{82,32,0}}, +/* 55974 */ {(13<<2)|2,{82,32,0}}, +/* 55975 */ {(13<<2)|2,{82,32,0}}, +/* 55976 */ {(13<<2)|2,{82,37,0}}, +/* 55977 */ {(13<<2)|2,{82,37,0}}, +/* 55978 */ {(13<<2)|2,{82,37,0}}, +/* 55979 */ {(13<<2)|2,{82,37,0}}, +/* 55980 */ {(13<<2)|2,{82,37,0}}, +/* 55981 */ {(13<<2)|2,{82,37,0}}, +/* 55982 */ {(13<<2)|2,{82,37,0}}, +/* 55983 */ {(13<<2)|2,{82,37,0}}, +/* 55984 */ {(13<<2)|2,{82,45,0}}, +/* 55985 */ {(13<<2)|2,{82,45,0}}, +/* 55986 */ {(13<<2)|2,{82,45,0}}, +/* 55987 */ {(13<<2)|2,{82,45,0}}, +/* 55988 */ {(13<<2)|2,{82,45,0}}, +/* 55989 */ {(13<<2)|2,{82,45,0}}, +/* 55990 */ {(13<<2)|2,{82,45,0}}, +/* 55991 */ {(13<<2)|2,{82,45,0}}, +/* 55992 */ {(13<<2)|2,{82,46,0}}, +/* 55993 */ {(13<<2)|2,{82,46,0}}, +/* 55994 */ {(13<<2)|2,{82,46,0}}, +/* 55995 */ {(13<<2)|2,{82,46,0}}, +/* 55996 */ {(13<<2)|2,{82,46,0}}, +/* 55997 */ {(13<<2)|2,{82,46,0}}, +/* 55998 */ {(13<<2)|2,{82,46,0}}, +/* 55999 */ {(13<<2)|2,{82,46,0}}, +/* 56000 */ {(13<<2)|2,{82,47,0}}, +/* 56001 */ {(13<<2)|2,{82,47,0}}, +/* 56002 */ {(13<<2)|2,{82,47,0}}, +/* 56003 */ {(13<<2)|2,{82,47,0}}, +/* 56004 */ {(13<<2)|2,{82,47,0}}, +/* 56005 */ {(13<<2)|2,{82,47,0}}, +/* 56006 */ {(13<<2)|2,{82,47,0}}, +/* 56007 */ {(13<<2)|2,{82,47,0}}, +/* 56008 */ {(13<<2)|2,{82,51,0}}, +/* 56009 */ {(13<<2)|2,{82,51,0}}, +/* 56010 */ {(13<<2)|2,{82,51,0}}, +/* 56011 */ {(13<<2)|2,{82,51,0}}, +/* 56012 */ {(13<<2)|2,{82,51,0}}, +/* 56013 */ {(13<<2)|2,{82,51,0}}, +/* 56014 */ {(13<<2)|2,{82,51,0}}, +/* 56015 */ {(13<<2)|2,{82,51,0}}, +/* 56016 */ {(13<<2)|2,{82,52,0}}, +/* 56017 */ {(13<<2)|2,{82,52,0}}, +/* 56018 */ {(13<<2)|2,{82,52,0}}, +/* 56019 */ {(13<<2)|2,{82,52,0}}, +/* 56020 */ {(13<<2)|2,{82,52,0}}, +/* 56021 */ {(13<<2)|2,{82,52,0}}, +/* 56022 */ {(13<<2)|2,{82,52,0}}, +/* 56023 */ {(13<<2)|2,{82,52,0}}, +/* 56024 */ {(13<<2)|2,{82,53,0}}, +/* 56025 */ {(13<<2)|2,{82,53,0}}, +/* 56026 */ {(13<<2)|2,{82,53,0}}, +/* 56027 */ {(13<<2)|2,{82,53,0}}, +/* 56028 */ {(13<<2)|2,{82,53,0}}, +/* 56029 */ {(13<<2)|2,{82,53,0}}, +/* 56030 */ {(13<<2)|2,{82,53,0}}, +/* 56031 */ {(13<<2)|2,{82,53,0}}, +/* 56032 */ {(13<<2)|2,{82,54,0}}, +/* 56033 */ {(13<<2)|2,{82,54,0}}, +/* 56034 */ {(13<<2)|2,{82,54,0}}, +/* 56035 */ {(13<<2)|2,{82,54,0}}, +/* 56036 */ {(13<<2)|2,{82,54,0}}, +/* 56037 */ {(13<<2)|2,{82,54,0}}, +/* 56038 */ {(13<<2)|2,{82,54,0}}, +/* 56039 */ {(13<<2)|2,{82,54,0}}, +/* 56040 */ {(13<<2)|2,{82,55,0}}, +/* 56041 */ {(13<<2)|2,{82,55,0}}, +/* 56042 */ {(13<<2)|2,{82,55,0}}, +/* 56043 */ {(13<<2)|2,{82,55,0}}, +/* 56044 */ {(13<<2)|2,{82,55,0}}, +/* 56045 */ {(13<<2)|2,{82,55,0}}, +/* 56046 */ {(13<<2)|2,{82,55,0}}, +/* 56047 */ {(13<<2)|2,{82,55,0}}, +/* 56048 */ {(13<<2)|2,{82,56,0}}, +/* 56049 */ {(13<<2)|2,{82,56,0}}, +/* 56050 */ {(13<<2)|2,{82,56,0}}, +/* 56051 */ {(13<<2)|2,{82,56,0}}, +/* 56052 */ {(13<<2)|2,{82,56,0}}, +/* 56053 */ {(13<<2)|2,{82,56,0}}, +/* 56054 */ {(13<<2)|2,{82,56,0}}, +/* 56055 */ {(13<<2)|2,{82,56,0}}, +/* 56056 */ {(13<<2)|2,{82,57,0}}, +/* 56057 */ {(13<<2)|2,{82,57,0}}, +/* 56058 */ {(13<<2)|2,{82,57,0}}, +/* 56059 */ {(13<<2)|2,{82,57,0}}, +/* 56060 */ {(13<<2)|2,{82,57,0}}, +/* 56061 */ {(13<<2)|2,{82,57,0}}, +/* 56062 */ {(13<<2)|2,{82,57,0}}, +/* 56063 */ {(13<<2)|2,{82,57,0}}, +/* 56064 */ {(13<<2)|2,{82,61,0}}, +/* 56065 */ {(13<<2)|2,{82,61,0}}, +/* 56066 */ {(13<<2)|2,{82,61,0}}, +/* 56067 */ {(13<<2)|2,{82,61,0}}, +/* 56068 */ {(13<<2)|2,{82,61,0}}, +/* 56069 */ {(13<<2)|2,{82,61,0}}, +/* 56070 */ {(13<<2)|2,{82,61,0}}, +/* 56071 */ {(13<<2)|2,{82,61,0}}, +/* 56072 */ {(13<<2)|2,{82,65,0}}, +/* 56073 */ {(13<<2)|2,{82,65,0}}, +/* 56074 */ {(13<<2)|2,{82,65,0}}, +/* 56075 */ {(13<<2)|2,{82,65,0}}, +/* 56076 */ {(13<<2)|2,{82,65,0}}, +/* 56077 */ {(13<<2)|2,{82,65,0}}, +/* 56078 */ {(13<<2)|2,{82,65,0}}, +/* 56079 */ {(13<<2)|2,{82,65,0}}, +/* 56080 */ {(13<<2)|2,{82,95,0}}, +/* 56081 */ {(13<<2)|2,{82,95,0}}, +/* 56082 */ {(13<<2)|2,{82,95,0}}, +/* 56083 */ {(13<<2)|2,{82,95,0}}, +/* 56084 */ {(13<<2)|2,{82,95,0}}, +/* 56085 */ {(13<<2)|2,{82,95,0}}, +/* 56086 */ {(13<<2)|2,{82,95,0}}, +/* 56087 */ {(13<<2)|2,{82,95,0}}, +/* 56088 */ {(13<<2)|2,{82,98,0}}, +/* 56089 */ {(13<<2)|2,{82,98,0}}, +/* 56090 */ {(13<<2)|2,{82,98,0}}, +/* 56091 */ {(13<<2)|2,{82,98,0}}, +/* 56092 */ {(13<<2)|2,{82,98,0}}, +/* 56093 */ {(13<<2)|2,{82,98,0}}, +/* 56094 */ {(13<<2)|2,{82,98,0}}, +/* 56095 */ {(13<<2)|2,{82,98,0}}, +/* 56096 */ {(13<<2)|2,{82,100,0}}, +/* 56097 */ {(13<<2)|2,{82,100,0}}, +/* 56098 */ {(13<<2)|2,{82,100,0}}, +/* 56099 */ {(13<<2)|2,{82,100,0}}, +/* 56100 */ {(13<<2)|2,{82,100,0}}, +/* 56101 */ {(13<<2)|2,{82,100,0}}, +/* 56102 */ {(13<<2)|2,{82,100,0}}, +/* 56103 */ {(13<<2)|2,{82,100,0}}, +/* 56104 */ {(13<<2)|2,{82,102,0}}, +/* 56105 */ {(13<<2)|2,{82,102,0}}, +/* 56106 */ {(13<<2)|2,{82,102,0}}, +/* 56107 */ {(13<<2)|2,{82,102,0}}, +/* 56108 */ {(13<<2)|2,{82,102,0}}, +/* 56109 */ {(13<<2)|2,{82,102,0}}, +/* 56110 */ {(13<<2)|2,{82,102,0}}, +/* 56111 */ {(13<<2)|2,{82,102,0}}, +/* 56112 */ {(13<<2)|2,{82,103,0}}, +/* 56113 */ {(13<<2)|2,{82,103,0}}, +/* 56114 */ {(13<<2)|2,{82,103,0}}, +/* 56115 */ {(13<<2)|2,{82,103,0}}, +/* 56116 */ {(13<<2)|2,{82,103,0}}, +/* 56117 */ {(13<<2)|2,{82,103,0}}, +/* 56118 */ {(13<<2)|2,{82,103,0}}, +/* 56119 */ {(13<<2)|2,{82,103,0}}, +/* 56120 */ {(13<<2)|2,{82,104,0}}, +/* 56121 */ {(13<<2)|2,{82,104,0}}, +/* 56122 */ {(13<<2)|2,{82,104,0}}, +/* 56123 */ {(13<<2)|2,{82,104,0}}, +/* 56124 */ {(13<<2)|2,{82,104,0}}, +/* 56125 */ {(13<<2)|2,{82,104,0}}, +/* 56126 */ {(13<<2)|2,{82,104,0}}, +/* 56127 */ {(13<<2)|2,{82,104,0}}, +/* 56128 */ {(13<<2)|2,{82,108,0}}, +/* 56129 */ {(13<<2)|2,{82,108,0}}, +/* 56130 */ {(13<<2)|2,{82,108,0}}, +/* 56131 */ {(13<<2)|2,{82,108,0}}, +/* 56132 */ {(13<<2)|2,{82,108,0}}, +/* 56133 */ {(13<<2)|2,{82,108,0}}, +/* 56134 */ {(13<<2)|2,{82,108,0}}, +/* 56135 */ {(13<<2)|2,{82,108,0}}, +/* 56136 */ {(13<<2)|2,{82,109,0}}, +/* 56137 */ {(13<<2)|2,{82,109,0}}, +/* 56138 */ {(13<<2)|2,{82,109,0}}, +/* 56139 */ {(13<<2)|2,{82,109,0}}, +/* 56140 */ {(13<<2)|2,{82,109,0}}, +/* 56141 */ {(13<<2)|2,{82,109,0}}, +/* 56142 */ {(13<<2)|2,{82,109,0}}, +/* 56143 */ {(13<<2)|2,{82,109,0}}, +/* 56144 */ {(13<<2)|2,{82,110,0}}, +/* 56145 */ {(13<<2)|2,{82,110,0}}, +/* 56146 */ {(13<<2)|2,{82,110,0}}, +/* 56147 */ {(13<<2)|2,{82,110,0}}, +/* 56148 */ {(13<<2)|2,{82,110,0}}, +/* 56149 */ {(13<<2)|2,{82,110,0}}, +/* 56150 */ {(13<<2)|2,{82,110,0}}, +/* 56151 */ {(13<<2)|2,{82,110,0}}, +/* 56152 */ {(13<<2)|2,{82,112,0}}, +/* 56153 */ {(13<<2)|2,{82,112,0}}, +/* 56154 */ {(13<<2)|2,{82,112,0}}, +/* 56155 */ {(13<<2)|2,{82,112,0}}, +/* 56156 */ {(13<<2)|2,{82,112,0}}, +/* 56157 */ {(13<<2)|2,{82,112,0}}, +/* 56158 */ {(13<<2)|2,{82,112,0}}, +/* 56159 */ {(13<<2)|2,{82,112,0}}, +/* 56160 */ {(13<<2)|2,{82,114,0}}, +/* 56161 */ {(13<<2)|2,{82,114,0}}, +/* 56162 */ {(13<<2)|2,{82,114,0}}, +/* 56163 */ {(13<<2)|2,{82,114,0}}, +/* 56164 */ {(13<<2)|2,{82,114,0}}, +/* 56165 */ {(13<<2)|2,{82,114,0}}, +/* 56166 */ {(13<<2)|2,{82,114,0}}, +/* 56167 */ {(13<<2)|2,{82,114,0}}, +/* 56168 */ {(13<<2)|2,{82,117,0}}, +/* 56169 */ {(13<<2)|2,{82,117,0}}, +/* 56170 */ {(13<<2)|2,{82,117,0}}, +/* 56171 */ {(13<<2)|2,{82,117,0}}, +/* 56172 */ {(13<<2)|2,{82,117,0}}, +/* 56173 */ {(13<<2)|2,{82,117,0}}, +/* 56174 */ {(13<<2)|2,{82,117,0}}, +/* 56175 */ {(13<<2)|2,{82,117,0}}, +/* 56176 */ {(14<<2)|2,{82,58,0}}, +/* 56177 */ {(14<<2)|2,{82,58,0}}, +/* 56178 */ {(14<<2)|2,{82,58,0}}, +/* 56179 */ {(14<<2)|2,{82,58,0}}, +/* 56180 */ {(14<<2)|2,{82,66,0}}, +/* 56181 */ {(14<<2)|2,{82,66,0}}, +/* 56182 */ {(14<<2)|2,{82,66,0}}, +/* 56183 */ {(14<<2)|2,{82,66,0}}, +/* 56184 */ {(14<<2)|2,{82,67,0}}, +/* 56185 */ {(14<<2)|2,{82,67,0}}, +/* 56186 */ {(14<<2)|2,{82,67,0}}, +/* 56187 */ {(14<<2)|2,{82,67,0}}, +/* 56188 */ {(14<<2)|2,{82,68,0}}, +/* 56189 */ {(14<<2)|2,{82,68,0}}, +/* 56190 */ {(14<<2)|2,{82,68,0}}, +/* 56191 */ {(14<<2)|2,{82,68,0}}, +/* 56192 */ {(14<<2)|2,{82,69,0}}, +/* 56193 */ {(14<<2)|2,{82,69,0}}, +/* 56194 */ {(14<<2)|2,{82,69,0}}, +/* 56195 */ {(14<<2)|2,{82,69,0}}, +/* 56196 */ {(14<<2)|2,{82,70,0}}, +/* 56197 */ {(14<<2)|2,{82,70,0}}, +/* 56198 */ {(14<<2)|2,{82,70,0}}, +/* 56199 */ {(14<<2)|2,{82,70,0}}, +/* 56200 */ {(14<<2)|2,{82,71,0}}, +/* 56201 */ {(14<<2)|2,{82,71,0}}, +/* 56202 */ {(14<<2)|2,{82,71,0}}, +/* 56203 */ {(14<<2)|2,{82,71,0}}, +/* 56204 */ {(14<<2)|2,{82,72,0}}, +/* 56205 */ {(14<<2)|2,{82,72,0}}, +/* 56206 */ {(14<<2)|2,{82,72,0}}, +/* 56207 */ {(14<<2)|2,{82,72,0}}, +/* 56208 */ {(14<<2)|2,{82,73,0}}, +/* 56209 */ {(14<<2)|2,{82,73,0}}, +/* 56210 */ {(14<<2)|2,{82,73,0}}, +/* 56211 */ {(14<<2)|2,{82,73,0}}, +/* 56212 */ {(14<<2)|2,{82,74,0}}, +/* 56213 */ {(14<<2)|2,{82,74,0}}, +/* 56214 */ {(14<<2)|2,{82,74,0}}, +/* 56215 */ {(14<<2)|2,{82,74,0}}, +/* 56216 */ {(14<<2)|2,{82,75,0}}, +/* 56217 */ {(14<<2)|2,{82,75,0}}, +/* 56218 */ {(14<<2)|2,{82,75,0}}, +/* 56219 */ {(14<<2)|2,{82,75,0}}, +/* 56220 */ {(14<<2)|2,{82,76,0}}, +/* 56221 */ {(14<<2)|2,{82,76,0}}, +/* 56222 */ {(14<<2)|2,{82,76,0}}, +/* 56223 */ {(14<<2)|2,{82,76,0}}, +/* 56224 */ {(14<<2)|2,{82,77,0}}, +/* 56225 */ {(14<<2)|2,{82,77,0}}, +/* 56226 */ {(14<<2)|2,{82,77,0}}, +/* 56227 */ {(14<<2)|2,{82,77,0}}, +/* 56228 */ {(14<<2)|2,{82,78,0}}, +/* 56229 */ {(14<<2)|2,{82,78,0}}, +/* 56230 */ {(14<<2)|2,{82,78,0}}, +/* 56231 */ {(14<<2)|2,{82,78,0}}, +/* 56232 */ {(14<<2)|2,{82,79,0}}, +/* 56233 */ {(14<<2)|2,{82,79,0}}, +/* 56234 */ {(14<<2)|2,{82,79,0}}, +/* 56235 */ {(14<<2)|2,{82,79,0}}, +/* 56236 */ {(14<<2)|2,{82,80,0}}, +/* 56237 */ {(14<<2)|2,{82,80,0}}, +/* 56238 */ {(14<<2)|2,{82,80,0}}, +/* 56239 */ {(14<<2)|2,{82,80,0}}, +/* 56240 */ {(14<<2)|2,{82,81,0}}, +/* 56241 */ {(14<<2)|2,{82,81,0}}, +/* 56242 */ {(14<<2)|2,{82,81,0}}, +/* 56243 */ {(14<<2)|2,{82,81,0}}, +/* 56244 */ {(14<<2)|2,{82,82,0}}, +/* 56245 */ {(14<<2)|2,{82,82,0}}, +/* 56246 */ {(14<<2)|2,{82,82,0}}, +/* 56247 */ {(14<<2)|2,{82,82,0}}, +/* 56248 */ {(14<<2)|2,{82,83,0}}, +/* 56249 */ {(14<<2)|2,{82,83,0}}, +/* 56250 */ {(14<<2)|2,{82,83,0}}, +/* 56251 */ {(14<<2)|2,{82,83,0}}, +/* 56252 */ {(14<<2)|2,{82,84,0}}, +/* 56253 */ {(14<<2)|2,{82,84,0}}, +/* 56254 */ {(14<<2)|2,{82,84,0}}, +/* 56255 */ {(14<<2)|2,{82,84,0}}, +/* 56256 */ {(14<<2)|2,{82,85,0}}, +/* 56257 */ {(14<<2)|2,{82,85,0}}, +/* 56258 */ {(14<<2)|2,{82,85,0}}, +/* 56259 */ {(14<<2)|2,{82,85,0}}, +/* 56260 */ {(14<<2)|2,{82,86,0}}, +/* 56261 */ {(14<<2)|2,{82,86,0}}, +/* 56262 */ {(14<<2)|2,{82,86,0}}, +/* 56263 */ {(14<<2)|2,{82,86,0}}, +/* 56264 */ {(14<<2)|2,{82,87,0}}, +/* 56265 */ {(14<<2)|2,{82,87,0}}, +/* 56266 */ {(14<<2)|2,{82,87,0}}, +/* 56267 */ {(14<<2)|2,{82,87,0}}, +/* 56268 */ {(14<<2)|2,{82,89,0}}, +/* 56269 */ {(14<<2)|2,{82,89,0}}, +/* 56270 */ {(14<<2)|2,{82,89,0}}, +/* 56271 */ {(14<<2)|2,{82,89,0}}, +/* 56272 */ {(14<<2)|2,{82,106,0}}, +/* 56273 */ {(14<<2)|2,{82,106,0}}, +/* 56274 */ {(14<<2)|2,{82,106,0}}, +/* 56275 */ {(14<<2)|2,{82,106,0}}, +/* 56276 */ {(14<<2)|2,{82,107,0}}, +/* 56277 */ {(14<<2)|2,{82,107,0}}, +/* 56278 */ {(14<<2)|2,{82,107,0}}, +/* 56279 */ {(14<<2)|2,{82,107,0}}, +/* 56280 */ {(14<<2)|2,{82,113,0}}, +/* 56281 */ {(14<<2)|2,{82,113,0}}, +/* 56282 */ {(14<<2)|2,{82,113,0}}, +/* 56283 */ {(14<<2)|2,{82,113,0}}, +/* 56284 */ {(14<<2)|2,{82,118,0}}, +/* 56285 */ {(14<<2)|2,{82,118,0}}, +/* 56286 */ {(14<<2)|2,{82,118,0}}, +/* 56287 */ {(14<<2)|2,{82,118,0}}, +/* 56288 */ {(14<<2)|2,{82,119,0}}, +/* 56289 */ {(14<<2)|2,{82,119,0}}, +/* 56290 */ {(14<<2)|2,{82,119,0}}, +/* 56291 */ {(14<<2)|2,{82,119,0}}, +/* 56292 */ {(14<<2)|2,{82,120,0}}, +/* 56293 */ {(14<<2)|2,{82,120,0}}, +/* 56294 */ {(14<<2)|2,{82,120,0}}, +/* 56295 */ {(14<<2)|2,{82,120,0}}, +/* 56296 */ {(14<<2)|2,{82,121,0}}, +/* 56297 */ {(14<<2)|2,{82,121,0}}, +/* 56298 */ {(14<<2)|2,{82,121,0}}, +/* 56299 */ {(14<<2)|2,{82,121,0}}, +/* 56300 */ {(14<<2)|2,{82,122,0}}, +/* 56301 */ {(14<<2)|2,{82,122,0}}, +/* 56302 */ {(14<<2)|2,{82,122,0}}, +/* 56303 */ {(14<<2)|2,{82,122,0}}, +/* 56304 */ {(15<<2)|2,{82,38,0}}, +/* 56305 */ {(15<<2)|2,{82,38,0}}, +/* 56306 */ {(15<<2)|2,{82,42,0}}, +/* 56307 */ {(15<<2)|2,{82,42,0}}, +/* 56308 */ {(15<<2)|2,{82,44,0}}, +/* 56309 */ {(15<<2)|2,{82,44,0}}, +/* 56310 */ {(15<<2)|2,{82,59,0}}, +/* 56311 */ {(15<<2)|2,{82,59,0}}, +/* 56312 */ {(15<<2)|2,{82,88,0}}, +/* 56313 */ {(15<<2)|2,{82,88,0}}, +/* 56314 */ {(15<<2)|2,{82,90,0}}, +/* 56315 */ {(15<<2)|2,{82,90,0}}, +/* 56316 */ {(7<<2)|1,{82,0,0}}, +/* 56317 */ {(7<<2)|1,{82,0,0}}, +/* 56318 */ {(7<<2)|1,{82,0,0}}, +/* 56319 */ {(7<<2)|1,{82,0,0}}, +/* 56320 */ {(12<<2)|2,{83,48,0}}, +/* 56321 */ {(12<<2)|2,{83,48,0}}, +/* 56322 */ {(12<<2)|2,{83,48,0}}, +/* 56323 */ {(12<<2)|2,{83,48,0}}, +/* 56324 */ {(12<<2)|2,{83,48,0}}, +/* 56325 */ {(12<<2)|2,{83,48,0}}, +/* 56326 */ {(12<<2)|2,{83,48,0}}, +/* 56327 */ {(12<<2)|2,{83,48,0}}, +/* 56328 */ {(12<<2)|2,{83,48,0}}, +/* 56329 */ {(12<<2)|2,{83,48,0}}, +/* 56330 */ {(12<<2)|2,{83,48,0}}, +/* 56331 */ {(12<<2)|2,{83,48,0}}, +/* 56332 */ {(12<<2)|2,{83,48,0}}, +/* 56333 */ {(12<<2)|2,{83,48,0}}, +/* 56334 */ {(12<<2)|2,{83,48,0}}, +/* 56335 */ {(12<<2)|2,{83,48,0}}, +/* 56336 */ {(12<<2)|2,{83,49,0}}, +/* 56337 */ {(12<<2)|2,{83,49,0}}, +/* 56338 */ {(12<<2)|2,{83,49,0}}, +/* 56339 */ {(12<<2)|2,{83,49,0}}, +/* 56340 */ {(12<<2)|2,{83,49,0}}, +/* 56341 */ {(12<<2)|2,{83,49,0}}, +/* 56342 */ {(12<<2)|2,{83,49,0}}, +/* 56343 */ {(12<<2)|2,{83,49,0}}, +/* 56344 */ {(12<<2)|2,{83,49,0}}, +/* 56345 */ {(12<<2)|2,{83,49,0}}, +/* 56346 */ {(12<<2)|2,{83,49,0}}, +/* 56347 */ {(12<<2)|2,{83,49,0}}, +/* 56348 */ {(12<<2)|2,{83,49,0}}, +/* 56349 */ {(12<<2)|2,{83,49,0}}, +/* 56350 */ {(12<<2)|2,{83,49,0}}, +/* 56351 */ {(12<<2)|2,{83,49,0}}, +/* 56352 */ {(12<<2)|2,{83,50,0}}, +/* 56353 */ {(12<<2)|2,{83,50,0}}, +/* 56354 */ {(12<<2)|2,{83,50,0}}, +/* 56355 */ {(12<<2)|2,{83,50,0}}, +/* 56356 */ {(12<<2)|2,{83,50,0}}, +/* 56357 */ {(12<<2)|2,{83,50,0}}, +/* 56358 */ {(12<<2)|2,{83,50,0}}, +/* 56359 */ {(12<<2)|2,{83,50,0}}, +/* 56360 */ {(12<<2)|2,{83,50,0}}, +/* 56361 */ {(12<<2)|2,{83,50,0}}, +/* 56362 */ {(12<<2)|2,{83,50,0}}, +/* 56363 */ {(12<<2)|2,{83,50,0}}, +/* 56364 */ {(12<<2)|2,{83,50,0}}, +/* 56365 */ {(12<<2)|2,{83,50,0}}, +/* 56366 */ {(12<<2)|2,{83,50,0}}, +/* 56367 */ {(12<<2)|2,{83,50,0}}, +/* 56368 */ {(12<<2)|2,{83,97,0}}, +/* 56369 */ {(12<<2)|2,{83,97,0}}, +/* 56370 */ {(12<<2)|2,{83,97,0}}, +/* 56371 */ {(12<<2)|2,{83,97,0}}, +/* 56372 */ {(12<<2)|2,{83,97,0}}, +/* 56373 */ {(12<<2)|2,{83,97,0}}, +/* 56374 */ {(12<<2)|2,{83,97,0}}, +/* 56375 */ {(12<<2)|2,{83,97,0}}, +/* 56376 */ {(12<<2)|2,{83,97,0}}, +/* 56377 */ {(12<<2)|2,{83,97,0}}, +/* 56378 */ {(12<<2)|2,{83,97,0}}, +/* 56379 */ {(12<<2)|2,{83,97,0}}, +/* 56380 */ {(12<<2)|2,{83,97,0}}, +/* 56381 */ {(12<<2)|2,{83,97,0}}, +/* 56382 */ {(12<<2)|2,{83,97,0}}, +/* 56383 */ {(12<<2)|2,{83,97,0}}, +/* 56384 */ {(12<<2)|2,{83,99,0}}, +/* 56385 */ {(12<<2)|2,{83,99,0}}, +/* 56386 */ {(12<<2)|2,{83,99,0}}, +/* 56387 */ {(12<<2)|2,{83,99,0}}, +/* 56388 */ {(12<<2)|2,{83,99,0}}, +/* 56389 */ {(12<<2)|2,{83,99,0}}, +/* 56390 */ {(12<<2)|2,{83,99,0}}, +/* 56391 */ {(12<<2)|2,{83,99,0}}, +/* 56392 */ {(12<<2)|2,{83,99,0}}, +/* 56393 */ {(12<<2)|2,{83,99,0}}, +/* 56394 */ {(12<<2)|2,{83,99,0}}, +/* 56395 */ {(12<<2)|2,{83,99,0}}, +/* 56396 */ {(12<<2)|2,{83,99,0}}, +/* 56397 */ {(12<<2)|2,{83,99,0}}, +/* 56398 */ {(12<<2)|2,{83,99,0}}, +/* 56399 */ {(12<<2)|2,{83,99,0}}, +/* 56400 */ {(12<<2)|2,{83,101,0}}, +/* 56401 */ {(12<<2)|2,{83,101,0}}, +/* 56402 */ {(12<<2)|2,{83,101,0}}, +/* 56403 */ {(12<<2)|2,{83,101,0}}, +/* 56404 */ {(12<<2)|2,{83,101,0}}, +/* 56405 */ {(12<<2)|2,{83,101,0}}, +/* 56406 */ {(12<<2)|2,{83,101,0}}, +/* 56407 */ {(12<<2)|2,{83,101,0}}, +/* 56408 */ {(12<<2)|2,{83,101,0}}, +/* 56409 */ {(12<<2)|2,{83,101,0}}, +/* 56410 */ {(12<<2)|2,{83,101,0}}, +/* 56411 */ {(12<<2)|2,{83,101,0}}, +/* 56412 */ {(12<<2)|2,{83,101,0}}, +/* 56413 */ {(12<<2)|2,{83,101,0}}, +/* 56414 */ {(12<<2)|2,{83,101,0}}, +/* 56415 */ {(12<<2)|2,{83,101,0}}, +/* 56416 */ {(12<<2)|2,{83,105,0}}, +/* 56417 */ {(12<<2)|2,{83,105,0}}, +/* 56418 */ {(12<<2)|2,{83,105,0}}, +/* 56419 */ {(12<<2)|2,{83,105,0}}, +/* 56420 */ {(12<<2)|2,{83,105,0}}, +/* 56421 */ {(12<<2)|2,{83,105,0}}, +/* 56422 */ {(12<<2)|2,{83,105,0}}, +/* 56423 */ {(12<<2)|2,{83,105,0}}, +/* 56424 */ {(12<<2)|2,{83,105,0}}, +/* 56425 */ {(12<<2)|2,{83,105,0}}, +/* 56426 */ {(12<<2)|2,{83,105,0}}, +/* 56427 */ {(12<<2)|2,{83,105,0}}, +/* 56428 */ {(12<<2)|2,{83,105,0}}, +/* 56429 */ {(12<<2)|2,{83,105,0}}, +/* 56430 */ {(12<<2)|2,{83,105,0}}, +/* 56431 */ {(12<<2)|2,{83,105,0}}, +/* 56432 */ {(12<<2)|2,{83,111,0}}, +/* 56433 */ {(12<<2)|2,{83,111,0}}, +/* 56434 */ {(12<<2)|2,{83,111,0}}, +/* 56435 */ {(12<<2)|2,{83,111,0}}, +/* 56436 */ {(12<<2)|2,{83,111,0}}, +/* 56437 */ {(12<<2)|2,{83,111,0}}, +/* 56438 */ {(12<<2)|2,{83,111,0}}, +/* 56439 */ {(12<<2)|2,{83,111,0}}, +/* 56440 */ {(12<<2)|2,{83,111,0}}, +/* 56441 */ {(12<<2)|2,{83,111,0}}, +/* 56442 */ {(12<<2)|2,{83,111,0}}, +/* 56443 */ {(12<<2)|2,{83,111,0}}, +/* 56444 */ {(12<<2)|2,{83,111,0}}, +/* 56445 */ {(12<<2)|2,{83,111,0}}, +/* 56446 */ {(12<<2)|2,{83,111,0}}, +/* 56447 */ {(12<<2)|2,{83,111,0}}, +/* 56448 */ {(12<<2)|2,{83,115,0}}, +/* 56449 */ {(12<<2)|2,{83,115,0}}, +/* 56450 */ {(12<<2)|2,{83,115,0}}, +/* 56451 */ {(12<<2)|2,{83,115,0}}, +/* 56452 */ {(12<<2)|2,{83,115,0}}, +/* 56453 */ {(12<<2)|2,{83,115,0}}, +/* 56454 */ {(12<<2)|2,{83,115,0}}, +/* 56455 */ {(12<<2)|2,{83,115,0}}, +/* 56456 */ {(12<<2)|2,{83,115,0}}, +/* 56457 */ {(12<<2)|2,{83,115,0}}, +/* 56458 */ {(12<<2)|2,{83,115,0}}, +/* 56459 */ {(12<<2)|2,{83,115,0}}, +/* 56460 */ {(12<<2)|2,{83,115,0}}, +/* 56461 */ {(12<<2)|2,{83,115,0}}, +/* 56462 */ {(12<<2)|2,{83,115,0}}, +/* 56463 */ {(12<<2)|2,{83,115,0}}, +/* 56464 */ {(12<<2)|2,{83,116,0}}, +/* 56465 */ {(12<<2)|2,{83,116,0}}, +/* 56466 */ {(12<<2)|2,{83,116,0}}, +/* 56467 */ {(12<<2)|2,{83,116,0}}, +/* 56468 */ {(12<<2)|2,{83,116,0}}, +/* 56469 */ {(12<<2)|2,{83,116,0}}, +/* 56470 */ {(12<<2)|2,{83,116,0}}, +/* 56471 */ {(12<<2)|2,{83,116,0}}, +/* 56472 */ {(12<<2)|2,{83,116,0}}, +/* 56473 */ {(12<<2)|2,{83,116,0}}, +/* 56474 */ {(12<<2)|2,{83,116,0}}, +/* 56475 */ {(12<<2)|2,{83,116,0}}, +/* 56476 */ {(12<<2)|2,{83,116,0}}, +/* 56477 */ {(12<<2)|2,{83,116,0}}, +/* 56478 */ {(12<<2)|2,{83,116,0}}, +/* 56479 */ {(12<<2)|2,{83,116,0}}, +/* 56480 */ {(13<<2)|2,{83,32,0}}, +/* 56481 */ {(13<<2)|2,{83,32,0}}, +/* 56482 */ {(13<<2)|2,{83,32,0}}, +/* 56483 */ {(13<<2)|2,{83,32,0}}, +/* 56484 */ {(13<<2)|2,{83,32,0}}, +/* 56485 */ {(13<<2)|2,{83,32,0}}, +/* 56486 */ {(13<<2)|2,{83,32,0}}, +/* 56487 */ {(13<<2)|2,{83,32,0}}, +/* 56488 */ {(13<<2)|2,{83,37,0}}, +/* 56489 */ {(13<<2)|2,{83,37,0}}, +/* 56490 */ {(13<<2)|2,{83,37,0}}, +/* 56491 */ {(13<<2)|2,{83,37,0}}, +/* 56492 */ {(13<<2)|2,{83,37,0}}, +/* 56493 */ {(13<<2)|2,{83,37,0}}, +/* 56494 */ {(13<<2)|2,{83,37,0}}, +/* 56495 */ {(13<<2)|2,{83,37,0}}, +/* 56496 */ {(13<<2)|2,{83,45,0}}, +/* 56497 */ {(13<<2)|2,{83,45,0}}, +/* 56498 */ {(13<<2)|2,{83,45,0}}, +/* 56499 */ {(13<<2)|2,{83,45,0}}, +/* 56500 */ {(13<<2)|2,{83,45,0}}, +/* 56501 */ {(13<<2)|2,{83,45,0}}, +/* 56502 */ {(13<<2)|2,{83,45,0}}, +/* 56503 */ {(13<<2)|2,{83,45,0}}, +/* 56504 */ {(13<<2)|2,{83,46,0}}, +/* 56505 */ {(13<<2)|2,{83,46,0}}, +/* 56506 */ {(13<<2)|2,{83,46,0}}, +/* 56507 */ {(13<<2)|2,{83,46,0}}, +/* 56508 */ {(13<<2)|2,{83,46,0}}, +/* 56509 */ {(13<<2)|2,{83,46,0}}, +/* 56510 */ {(13<<2)|2,{83,46,0}}, +/* 56511 */ {(13<<2)|2,{83,46,0}}, +/* 56512 */ {(13<<2)|2,{83,47,0}}, +/* 56513 */ {(13<<2)|2,{83,47,0}}, +/* 56514 */ {(13<<2)|2,{83,47,0}}, +/* 56515 */ {(13<<2)|2,{83,47,0}}, +/* 56516 */ {(13<<2)|2,{83,47,0}}, +/* 56517 */ {(13<<2)|2,{83,47,0}}, +/* 56518 */ {(13<<2)|2,{83,47,0}}, +/* 56519 */ {(13<<2)|2,{83,47,0}}, +/* 56520 */ {(13<<2)|2,{83,51,0}}, +/* 56521 */ {(13<<2)|2,{83,51,0}}, +/* 56522 */ {(13<<2)|2,{83,51,0}}, +/* 56523 */ {(13<<2)|2,{83,51,0}}, +/* 56524 */ {(13<<2)|2,{83,51,0}}, +/* 56525 */ {(13<<2)|2,{83,51,0}}, +/* 56526 */ {(13<<2)|2,{83,51,0}}, +/* 56527 */ {(13<<2)|2,{83,51,0}}, +/* 56528 */ {(13<<2)|2,{83,52,0}}, +/* 56529 */ {(13<<2)|2,{83,52,0}}, +/* 56530 */ {(13<<2)|2,{83,52,0}}, +/* 56531 */ {(13<<2)|2,{83,52,0}}, +/* 56532 */ {(13<<2)|2,{83,52,0}}, +/* 56533 */ {(13<<2)|2,{83,52,0}}, +/* 56534 */ {(13<<2)|2,{83,52,0}}, +/* 56535 */ {(13<<2)|2,{83,52,0}}, +/* 56536 */ {(13<<2)|2,{83,53,0}}, +/* 56537 */ {(13<<2)|2,{83,53,0}}, +/* 56538 */ {(13<<2)|2,{83,53,0}}, +/* 56539 */ {(13<<2)|2,{83,53,0}}, +/* 56540 */ {(13<<2)|2,{83,53,0}}, +/* 56541 */ {(13<<2)|2,{83,53,0}}, +/* 56542 */ {(13<<2)|2,{83,53,0}}, +/* 56543 */ {(13<<2)|2,{83,53,0}}, +/* 56544 */ {(13<<2)|2,{83,54,0}}, +/* 56545 */ {(13<<2)|2,{83,54,0}}, +/* 56546 */ {(13<<2)|2,{83,54,0}}, +/* 56547 */ {(13<<2)|2,{83,54,0}}, +/* 56548 */ {(13<<2)|2,{83,54,0}}, +/* 56549 */ {(13<<2)|2,{83,54,0}}, +/* 56550 */ {(13<<2)|2,{83,54,0}}, +/* 56551 */ {(13<<2)|2,{83,54,0}}, +/* 56552 */ {(13<<2)|2,{83,55,0}}, +/* 56553 */ {(13<<2)|2,{83,55,0}}, +/* 56554 */ {(13<<2)|2,{83,55,0}}, +/* 56555 */ {(13<<2)|2,{83,55,0}}, +/* 56556 */ {(13<<2)|2,{83,55,0}}, +/* 56557 */ {(13<<2)|2,{83,55,0}}, +/* 56558 */ {(13<<2)|2,{83,55,0}}, +/* 56559 */ {(13<<2)|2,{83,55,0}}, +/* 56560 */ {(13<<2)|2,{83,56,0}}, +/* 56561 */ {(13<<2)|2,{83,56,0}}, +/* 56562 */ {(13<<2)|2,{83,56,0}}, +/* 56563 */ {(13<<2)|2,{83,56,0}}, +/* 56564 */ {(13<<2)|2,{83,56,0}}, +/* 56565 */ {(13<<2)|2,{83,56,0}}, +/* 56566 */ {(13<<2)|2,{83,56,0}}, +/* 56567 */ {(13<<2)|2,{83,56,0}}, +/* 56568 */ {(13<<2)|2,{83,57,0}}, +/* 56569 */ {(13<<2)|2,{83,57,0}}, +/* 56570 */ {(13<<2)|2,{83,57,0}}, +/* 56571 */ {(13<<2)|2,{83,57,0}}, +/* 56572 */ {(13<<2)|2,{83,57,0}}, +/* 56573 */ {(13<<2)|2,{83,57,0}}, +/* 56574 */ {(13<<2)|2,{83,57,0}}, +/* 56575 */ {(13<<2)|2,{83,57,0}}, +/* 56576 */ {(13<<2)|2,{83,61,0}}, +/* 56577 */ {(13<<2)|2,{83,61,0}}, +/* 56578 */ {(13<<2)|2,{83,61,0}}, +/* 56579 */ {(13<<2)|2,{83,61,0}}, +/* 56580 */ {(13<<2)|2,{83,61,0}}, +/* 56581 */ {(13<<2)|2,{83,61,0}}, +/* 56582 */ {(13<<2)|2,{83,61,0}}, +/* 56583 */ {(13<<2)|2,{83,61,0}}, +/* 56584 */ {(13<<2)|2,{83,65,0}}, +/* 56585 */ {(13<<2)|2,{83,65,0}}, +/* 56586 */ {(13<<2)|2,{83,65,0}}, +/* 56587 */ {(13<<2)|2,{83,65,0}}, +/* 56588 */ {(13<<2)|2,{83,65,0}}, +/* 56589 */ {(13<<2)|2,{83,65,0}}, +/* 56590 */ {(13<<2)|2,{83,65,0}}, +/* 56591 */ {(13<<2)|2,{83,65,0}}, +/* 56592 */ {(13<<2)|2,{83,95,0}}, +/* 56593 */ {(13<<2)|2,{83,95,0}}, +/* 56594 */ {(13<<2)|2,{83,95,0}}, +/* 56595 */ {(13<<2)|2,{83,95,0}}, +/* 56596 */ {(13<<2)|2,{83,95,0}}, +/* 56597 */ {(13<<2)|2,{83,95,0}}, +/* 56598 */ {(13<<2)|2,{83,95,0}}, +/* 56599 */ {(13<<2)|2,{83,95,0}}, +/* 56600 */ {(13<<2)|2,{83,98,0}}, +/* 56601 */ {(13<<2)|2,{83,98,0}}, +/* 56602 */ {(13<<2)|2,{83,98,0}}, +/* 56603 */ {(13<<2)|2,{83,98,0}}, +/* 56604 */ {(13<<2)|2,{83,98,0}}, +/* 56605 */ {(13<<2)|2,{83,98,0}}, +/* 56606 */ {(13<<2)|2,{83,98,0}}, +/* 56607 */ {(13<<2)|2,{83,98,0}}, +/* 56608 */ {(13<<2)|2,{83,100,0}}, +/* 56609 */ {(13<<2)|2,{83,100,0}}, +/* 56610 */ {(13<<2)|2,{83,100,0}}, +/* 56611 */ {(13<<2)|2,{83,100,0}}, +/* 56612 */ {(13<<2)|2,{83,100,0}}, +/* 56613 */ {(13<<2)|2,{83,100,0}}, +/* 56614 */ {(13<<2)|2,{83,100,0}}, +/* 56615 */ {(13<<2)|2,{83,100,0}}, +/* 56616 */ {(13<<2)|2,{83,102,0}}, +/* 56617 */ {(13<<2)|2,{83,102,0}}, +/* 56618 */ {(13<<2)|2,{83,102,0}}, +/* 56619 */ {(13<<2)|2,{83,102,0}}, +/* 56620 */ {(13<<2)|2,{83,102,0}}, +/* 56621 */ {(13<<2)|2,{83,102,0}}, +/* 56622 */ {(13<<2)|2,{83,102,0}}, +/* 56623 */ {(13<<2)|2,{83,102,0}}, +/* 56624 */ {(13<<2)|2,{83,103,0}}, +/* 56625 */ {(13<<2)|2,{83,103,0}}, +/* 56626 */ {(13<<2)|2,{83,103,0}}, +/* 56627 */ {(13<<2)|2,{83,103,0}}, +/* 56628 */ {(13<<2)|2,{83,103,0}}, +/* 56629 */ {(13<<2)|2,{83,103,0}}, +/* 56630 */ {(13<<2)|2,{83,103,0}}, +/* 56631 */ {(13<<2)|2,{83,103,0}}, +/* 56632 */ {(13<<2)|2,{83,104,0}}, +/* 56633 */ {(13<<2)|2,{83,104,0}}, +/* 56634 */ {(13<<2)|2,{83,104,0}}, +/* 56635 */ {(13<<2)|2,{83,104,0}}, +/* 56636 */ {(13<<2)|2,{83,104,0}}, +/* 56637 */ {(13<<2)|2,{83,104,0}}, +/* 56638 */ {(13<<2)|2,{83,104,0}}, +/* 56639 */ {(13<<2)|2,{83,104,0}}, +/* 56640 */ {(13<<2)|2,{83,108,0}}, +/* 56641 */ {(13<<2)|2,{83,108,0}}, +/* 56642 */ {(13<<2)|2,{83,108,0}}, +/* 56643 */ {(13<<2)|2,{83,108,0}}, +/* 56644 */ {(13<<2)|2,{83,108,0}}, +/* 56645 */ {(13<<2)|2,{83,108,0}}, +/* 56646 */ {(13<<2)|2,{83,108,0}}, +/* 56647 */ {(13<<2)|2,{83,108,0}}, +/* 56648 */ {(13<<2)|2,{83,109,0}}, +/* 56649 */ {(13<<2)|2,{83,109,0}}, +/* 56650 */ {(13<<2)|2,{83,109,0}}, +/* 56651 */ {(13<<2)|2,{83,109,0}}, +/* 56652 */ {(13<<2)|2,{83,109,0}}, +/* 56653 */ {(13<<2)|2,{83,109,0}}, +/* 56654 */ {(13<<2)|2,{83,109,0}}, +/* 56655 */ {(13<<2)|2,{83,109,0}}, +/* 56656 */ {(13<<2)|2,{83,110,0}}, +/* 56657 */ {(13<<2)|2,{83,110,0}}, +/* 56658 */ {(13<<2)|2,{83,110,0}}, +/* 56659 */ {(13<<2)|2,{83,110,0}}, +/* 56660 */ {(13<<2)|2,{83,110,0}}, +/* 56661 */ {(13<<2)|2,{83,110,0}}, +/* 56662 */ {(13<<2)|2,{83,110,0}}, +/* 56663 */ {(13<<2)|2,{83,110,0}}, +/* 56664 */ {(13<<2)|2,{83,112,0}}, +/* 56665 */ {(13<<2)|2,{83,112,0}}, +/* 56666 */ {(13<<2)|2,{83,112,0}}, +/* 56667 */ {(13<<2)|2,{83,112,0}}, +/* 56668 */ {(13<<2)|2,{83,112,0}}, +/* 56669 */ {(13<<2)|2,{83,112,0}}, +/* 56670 */ {(13<<2)|2,{83,112,0}}, +/* 56671 */ {(13<<2)|2,{83,112,0}}, +/* 56672 */ {(13<<2)|2,{83,114,0}}, +/* 56673 */ {(13<<2)|2,{83,114,0}}, +/* 56674 */ {(13<<2)|2,{83,114,0}}, +/* 56675 */ {(13<<2)|2,{83,114,0}}, +/* 56676 */ {(13<<2)|2,{83,114,0}}, +/* 56677 */ {(13<<2)|2,{83,114,0}}, +/* 56678 */ {(13<<2)|2,{83,114,0}}, +/* 56679 */ {(13<<2)|2,{83,114,0}}, +/* 56680 */ {(13<<2)|2,{83,117,0}}, +/* 56681 */ {(13<<2)|2,{83,117,0}}, +/* 56682 */ {(13<<2)|2,{83,117,0}}, +/* 56683 */ {(13<<2)|2,{83,117,0}}, +/* 56684 */ {(13<<2)|2,{83,117,0}}, +/* 56685 */ {(13<<2)|2,{83,117,0}}, +/* 56686 */ {(13<<2)|2,{83,117,0}}, +/* 56687 */ {(13<<2)|2,{83,117,0}}, +/* 56688 */ {(14<<2)|2,{83,58,0}}, +/* 56689 */ {(14<<2)|2,{83,58,0}}, +/* 56690 */ {(14<<2)|2,{83,58,0}}, +/* 56691 */ {(14<<2)|2,{83,58,0}}, +/* 56692 */ {(14<<2)|2,{83,66,0}}, +/* 56693 */ {(14<<2)|2,{83,66,0}}, +/* 56694 */ {(14<<2)|2,{83,66,0}}, +/* 56695 */ {(14<<2)|2,{83,66,0}}, +/* 56696 */ {(14<<2)|2,{83,67,0}}, +/* 56697 */ {(14<<2)|2,{83,67,0}}, +/* 56698 */ {(14<<2)|2,{83,67,0}}, +/* 56699 */ {(14<<2)|2,{83,67,0}}, +/* 56700 */ {(14<<2)|2,{83,68,0}}, +/* 56701 */ {(14<<2)|2,{83,68,0}}, +/* 56702 */ {(14<<2)|2,{83,68,0}}, +/* 56703 */ {(14<<2)|2,{83,68,0}}, +/* 56704 */ {(14<<2)|2,{83,69,0}}, +/* 56705 */ {(14<<2)|2,{83,69,0}}, +/* 56706 */ {(14<<2)|2,{83,69,0}}, +/* 56707 */ {(14<<2)|2,{83,69,0}}, +/* 56708 */ {(14<<2)|2,{83,70,0}}, +/* 56709 */ {(14<<2)|2,{83,70,0}}, +/* 56710 */ {(14<<2)|2,{83,70,0}}, +/* 56711 */ {(14<<2)|2,{83,70,0}}, +/* 56712 */ {(14<<2)|2,{83,71,0}}, +/* 56713 */ {(14<<2)|2,{83,71,0}}, +/* 56714 */ {(14<<2)|2,{83,71,0}}, +/* 56715 */ {(14<<2)|2,{83,71,0}}, +/* 56716 */ {(14<<2)|2,{83,72,0}}, +/* 56717 */ {(14<<2)|2,{83,72,0}}, +/* 56718 */ {(14<<2)|2,{83,72,0}}, +/* 56719 */ {(14<<2)|2,{83,72,0}}, +/* 56720 */ {(14<<2)|2,{83,73,0}}, +/* 56721 */ {(14<<2)|2,{83,73,0}}, +/* 56722 */ {(14<<2)|2,{83,73,0}}, +/* 56723 */ {(14<<2)|2,{83,73,0}}, +/* 56724 */ {(14<<2)|2,{83,74,0}}, +/* 56725 */ {(14<<2)|2,{83,74,0}}, +/* 56726 */ {(14<<2)|2,{83,74,0}}, +/* 56727 */ {(14<<2)|2,{83,74,0}}, +/* 56728 */ {(14<<2)|2,{83,75,0}}, +/* 56729 */ {(14<<2)|2,{83,75,0}}, +/* 56730 */ {(14<<2)|2,{83,75,0}}, +/* 56731 */ {(14<<2)|2,{83,75,0}}, +/* 56732 */ {(14<<2)|2,{83,76,0}}, +/* 56733 */ {(14<<2)|2,{83,76,0}}, +/* 56734 */ {(14<<2)|2,{83,76,0}}, +/* 56735 */ {(14<<2)|2,{83,76,0}}, +/* 56736 */ {(14<<2)|2,{83,77,0}}, +/* 56737 */ {(14<<2)|2,{83,77,0}}, +/* 56738 */ {(14<<2)|2,{83,77,0}}, +/* 56739 */ {(14<<2)|2,{83,77,0}}, +/* 56740 */ {(14<<2)|2,{83,78,0}}, +/* 56741 */ {(14<<2)|2,{83,78,0}}, +/* 56742 */ {(14<<2)|2,{83,78,0}}, +/* 56743 */ {(14<<2)|2,{83,78,0}}, +/* 56744 */ {(14<<2)|2,{83,79,0}}, +/* 56745 */ {(14<<2)|2,{83,79,0}}, +/* 56746 */ {(14<<2)|2,{83,79,0}}, +/* 56747 */ {(14<<2)|2,{83,79,0}}, +/* 56748 */ {(14<<2)|2,{83,80,0}}, +/* 56749 */ {(14<<2)|2,{83,80,0}}, +/* 56750 */ {(14<<2)|2,{83,80,0}}, +/* 56751 */ {(14<<2)|2,{83,80,0}}, +/* 56752 */ {(14<<2)|2,{83,81,0}}, +/* 56753 */ {(14<<2)|2,{83,81,0}}, +/* 56754 */ {(14<<2)|2,{83,81,0}}, +/* 56755 */ {(14<<2)|2,{83,81,0}}, +/* 56756 */ {(14<<2)|2,{83,82,0}}, +/* 56757 */ {(14<<2)|2,{83,82,0}}, +/* 56758 */ {(14<<2)|2,{83,82,0}}, +/* 56759 */ {(14<<2)|2,{83,82,0}}, +/* 56760 */ {(14<<2)|2,{83,83,0}}, +/* 56761 */ {(14<<2)|2,{83,83,0}}, +/* 56762 */ {(14<<2)|2,{83,83,0}}, +/* 56763 */ {(14<<2)|2,{83,83,0}}, +/* 56764 */ {(14<<2)|2,{83,84,0}}, +/* 56765 */ {(14<<2)|2,{83,84,0}}, +/* 56766 */ {(14<<2)|2,{83,84,0}}, +/* 56767 */ {(14<<2)|2,{83,84,0}}, +/* 56768 */ {(14<<2)|2,{83,85,0}}, +/* 56769 */ {(14<<2)|2,{83,85,0}}, +/* 56770 */ {(14<<2)|2,{83,85,0}}, +/* 56771 */ {(14<<2)|2,{83,85,0}}, +/* 56772 */ {(14<<2)|2,{83,86,0}}, +/* 56773 */ {(14<<2)|2,{83,86,0}}, +/* 56774 */ {(14<<2)|2,{83,86,0}}, +/* 56775 */ {(14<<2)|2,{83,86,0}}, +/* 56776 */ {(14<<2)|2,{83,87,0}}, +/* 56777 */ {(14<<2)|2,{83,87,0}}, +/* 56778 */ {(14<<2)|2,{83,87,0}}, +/* 56779 */ {(14<<2)|2,{83,87,0}}, +/* 56780 */ {(14<<2)|2,{83,89,0}}, +/* 56781 */ {(14<<2)|2,{83,89,0}}, +/* 56782 */ {(14<<2)|2,{83,89,0}}, +/* 56783 */ {(14<<2)|2,{83,89,0}}, +/* 56784 */ {(14<<2)|2,{83,106,0}}, +/* 56785 */ {(14<<2)|2,{83,106,0}}, +/* 56786 */ {(14<<2)|2,{83,106,0}}, +/* 56787 */ {(14<<2)|2,{83,106,0}}, +/* 56788 */ {(14<<2)|2,{83,107,0}}, +/* 56789 */ {(14<<2)|2,{83,107,0}}, +/* 56790 */ {(14<<2)|2,{83,107,0}}, +/* 56791 */ {(14<<2)|2,{83,107,0}}, +/* 56792 */ {(14<<2)|2,{83,113,0}}, +/* 56793 */ {(14<<2)|2,{83,113,0}}, +/* 56794 */ {(14<<2)|2,{83,113,0}}, +/* 56795 */ {(14<<2)|2,{83,113,0}}, +/* 56796 */ {(14<<2)|2,{83,118,0}}, +/* 56797 */ {(14<<2)|2,{83,118,0}}, +/* 56798 */ {(14<<2)|2,{83,118,0}}, +/* 56799 */ {(14<<2)|2,{83,118,0}}, +/* 56800 */ {(14<<2)|2,{83,119,0}}, +/* 56801 */ {(14<<2)|2,{83,119,0}}, +/* 56802 */ {(14<<2)|2,{83,119,0}}, +/* 56803 */ {(14<<2)|2,{83,119,0}}, +/* 56804 */ {(14<<2)|2,{83,120,0}}, +/* 56805 */ {(14<<2)|2,{83,120,0}}, +/* 56806 */ {(14<<2)|2,{83,120,0}}, +/* 56807 */ {(14<<2)|2,{83,120,0}}, +/* 56808 */ {(14<<2)|2,{83,121,0}}, +/* 56809 */ {(14<<2)|2,{83,121,0}}, +/* 56810 */ {(14<<2)|2,{83,121,0}}, +/* 56811 */ {(14<<2)|2,{83,121,0}}, +/* 56812 */ {(14<<2)|2,{83,122,0}}, +/* 56813 */ {(14<<2)|2,{83,122,0}}, +/* 56814 */ {(14<<2)|2,{83,122,0}}, +/* 56815 */ {(14<<2)|2,{83,122,0}}, +/* 56816 */ {(15<<2)|2,{83,38,0}}, +/* 56817 */ {(15<<2)|2,{83,38,0}}, +/* 56818 */ {(15<<2)|2,{83,42,0}}, +/* 56819 */ {(15<<2)|2,{83,42,0}}, +/* 56820 */ {(15<<2)|2,{83,44,0}}, +/* 56821 */ {(15<<2)|2,{83,44,0}}, +/* 56822 */ {(15<<2)|2,{83,59,0}}, +/* 56823 */ {(15<<2)|2,{83,59,0}}, +/* 56824 */ {(15<<2)|2,{83,88,0}}, +/* 56825 */ {(15<<2)|2,{83,88,0}}, +/* 56826 */ {(15<<2)|2,{83,90,0}}, +/* 56827 */ {(15<<2)|2,{83,90,0}}, +/* 56828 */ {(7<<2)|1,{83,0,0}}, +/* 56829 */ {(7<<2)|1,{83,0,0}}, +/* 56830 */ {(7<<2)|1,{83,0,0}}, +/* 56831 */ {(7<<2)|1,{83,0,0}}, +/* 56832 */ {(12<<2)|2,{84,48,0}}, +/* 56833 */ {(12<<2)|2,{84,48,0}}, +/* 56834 */ {(12<<2)|2,{84,48,0}}, +/* 56835 */ {(12<<2)|2,{84,48,0}}, +/* 56836 */ {(12<<2)|2,{84,48,0}}, +/* 56837 */ {(12<<2)|2,{84,48,0}}, +/* 56838 */ {(12<<2)|2,{84,48,0}}, +/* 56839 */ {(12<<2)|2,{84,48,0}}, +/* 56840 */ {(12<<2)|2,{84,48,0}}, +/* 56841 */ {(12<<2)|2,{84,48,0}}, +/* 56842 */ {(12<<2)|2,{84,48,0}}, +/* 56843 */ {(12<<2)|2,{84,48,0}}, +/* 56844 */ {(12<<2)|2,{84,48,0}}, +/* 56845 */ {(12<<2)|2,{84,48,0}}, +/* 56846 */ {(12<<2)|2,{84,48,0}}, +/* 56847 */ {(12<<2)|2,{84,48,0}}, +/* 56848 */ {(12<<2)|2,{84,49,0}}, +/* 56849 */ {(12<<2)|2,{84,49,0}}, +/* 56850 */ {(12<<2)|2,{84,49,0}}, +/* 56851 */ {(12<<2)|2,{84,49,0}}, +/* 56852 */ {(12<<2)|2,{84,49,0}}, +/* 56853 */ {(12<<2)|2,{84,49,0}}, +/* 56854 */ {(12<<2)|2,{84,49,0}}, +/* 56855 */ {(12<<2)|2,{84,49,0}}, +/* 56856 */ {(12<<2)|2,{84,49,0}}, +/* 56857 */ {(12<<2)|2,{84,49,0}}, +/* 56858 */ {(12<<2)|2,{84,49,0}}, +/* 56859 */ {(12<<2)|2,{84,49,0}}, +/* 56860 */ {(12<<2)|2,{84,49,0}}, +/* 56861 */ {(12<<2)|2,{84,49,0}}, +/* 56862 */ {(12<<2)|2,{84,49,0}}, +/* 56863 */ {(12<<2)|2,{84,49,0}}, +/* 56864 */ {(12<<2)|2,{84,50,0}}, +/* 56865 */ {(12<<2)|2,{84,50,0}}, +/* 56866 */ {(12<<2)|2,{84,50,0}}, +/* 56867 */ {(12<<2)|2,{84,50,0}}, +/* 56868 */ {(12<<2)|2,{84,50,0}}, +/* 56869 */ {(12<<2)|2,{84,50,0}}, +/* 56870 */ {(12<<2)|2,{84,50,0}}, +/* 56871 */ {(12<<2)|2,{84,50,0}}, +/* 56872 */ {(12<<2)|2,{84,50,0}}, +/* 56873 */ {(12<<2)|2,{84,50,0}}, +/* 56874 */ {(12<<2)|2,{84,50,0}}, +/* 56875 */ {(12<<2)|2,{84,50,0}}, +/* 56876 */ {(12<<2)|2,{84,50,0}}, +/* 56877 */ {(12<<2)|2,{84,50,0}}, +/* 56878 */ {(12<<2)|2,{84,50,0}}, +/* 56879 */ {(12<<2)|2,{84,50,0}}, +/* 56880 */ {(12<<2)|2,{84,97,0}}, +/* 56881 */ {(12<<2)|2,{84,97,0}}, +/* 56882 */ {(12<<2)|2,{84,97,0}}, +/* 56883 */ {(12<<2)|2,{84,97,0}}, +/* 56884 */ {(12<<2)|2,{84,97,0}}, +/* 56885 */ {(12<<2)|2,{84,97,0}}, +/* 56886 */ {(12<<2)|2,{84,97,0}}, +/* 56887 */ {(12<<2)|2,{84,97,0}}, +/* 56888 */ {(12<<2)|2,{84,97,0}}, +/* 56889 */ {(12<<2)|2,{84,97,0}}, +/* 56890 */ {(12<<2)|2,{84,97,0}}, +/* 56891 */ {(12<<2)|2,{84,97,0}}, +/* 56892 */ {(12<<2)|2,{84,97,0}}, +/* 56893 */ {(12<<2)|2,{84,97,0}}, +/* 56894 */ {(12<<2)|2,{84,97,0}}, +/* 56895 */ {(12<<2)|2,{84,97,0}}, +/* 56896 */ {(12<<2)|2,{84,99,0}}, +/* 56897 */ {(12<<2)|2,{84,99,0}}, +/* 56898 */ {(12<<2)|2,{84,99,0}}, +/* 56899 */ {(12<<2)|2,{84,99,0}}, +/* 56900 */ {(12<<2)|2,{84,99,0}}, +/* 56901 */ {(12<<2)|2,{84,99,0}}, +/* 56902 */ {(12<<2)|2,{84,99,0}}, +/* 56903 */ {(12<<2)|2,{84,99,0}}, +/* 56904 */ {(12<<2)|2,{84,99,0}}, +/* 56905 */ {(12<<2)|2,{84,99,0}}, +/* 56906 */ {(12<<2)|2,{84,99,0}}, +/* 56907 */ {(12<<2)|2,{84,99,0}}, +/* 56908 */ {(12<<2)|2,{84,99,0}}, +/* 56909 */ {(12<<2)|2,{84,99,0}}, +/* 56910 */ {(12<<2)|2,{84,99,0}}, +/* 56911 */ {(12<<2)|2,{84,99,0}}, +/* 56912 */ {(12<<2)|2,{84,101,0}}, +/* 56913 */ {(12<<2)|2,{84,101,0}}, +/* 56914 */ {(12<<2)|2,{84,101,0}}, +/* 56915 */ {(12<<2)|2,{84,101,0}}, +/* 56916 */ {(12<<2)|2,{84,101,0}}, +/* 56917 */ {(12<<2)|2,{84,101,0}}, +/* 56918 */ {(12<<2)|2,{84,101,0}}, +/* 56919 */ {(12<<2)|2,{84,101,0}}, +/* 56920 */ {(12<<2)|2,{84,101,0}}, +/* 56921 */ {(12<<2)|2,{84,101,0}}, +/* 56922 */ {(12<<2)|2,{84,101,0}}, +/* 56923 */ {(12<<2)|2,{84,101,0}}, +/* 56924 */ {(12<<2)|2,{84,101,0}}, +/* 56925 */ {(12<<2)|2,{84,101,0}}, +/* 56926 */ {(12<<2)|2,{84,101,0}}, +/* 56927 */ {(12<<2)|2,{84,101,0}}, +/* 56928 */ {(12<<2)|2,{84,105,0}}, +/* 56929 */ {(12<<2)|2,{84,105,0}}, +/* 56930 */ {(12<<2)|2,{84,105,0}}, +/* 56931 */ {(12<<2)|2,{84,105,0}}, +/* 56932 */ {(12<<2)|2,{84,105,0}}, +/* 56933 */ {(12<<2)|2,{84,105,0}}, +/* 56934 */ {(12<<2)|2,{84,105,0}}, +/* 56935 */ {(12<<2)|2,{84,105,0}}, +/* 56936 */ {(12<<2)|2,{84,105,0}}, +/* 56937 */ {(12<<2)|2,{84,105,0}}, +/* 56938 */ {(12<<2)|2,{84,105,0}}, +/* 56939 */ {(12<<2)|2,{84,105,0}}, +/* 56940 */ {(12<<2)|2,{84,105,0}}, +/* 56941 */ {(12<<2)|2,{84,105,0}}, +/* 56942 */ {(12<<2)|2,{84,105,0}}, +/* 56943 */ {(12<<2)|2,{84,105,0}}, +/* 56944 */ {(12<<2)|2,{84,111,0}}, +/* 56945 */ {(12<<2)|2,{84,111,0}}, +/* 56946 */ {(12<<2)|2,{84,111,0}}, +/* 56947 */ {(12<<2)|2,{84,111,0}}, +/* 56948 */ {(12<<2)|2,{84,111,0}}, +/* 56949 */ {(12<<2)|2,{84,111,0}}, +/* 56950 */ {(12<<2)|2,{84,111,0}}, +/* 56951 */ {(12<<2)|2,{84,111,0}}, +/* 56952 */ {(12<<2)|2,{84,111,0}}, +/* 56953 */ {(12<<2)|2,{84,111,0}}, +/* 56954 */ {(12<<2)|2,{84,111,0}}, +/* 56955 */ {(12<<2)|2,{84,111,0}}, +/* 56956 */ {(12<<2)|2,{84,111,0}}, +/* 56957 */ {(12<<2)|2,{84,111,0}}, +/* 56958 */ {(12<<2)|2,{84,111,0}}, +/* 56959 */ {(12<<2)|2,{84,111,0}}, +/* 56960 */ {(12<<2)|2,{84,115,0}}, +/* 56961 */ {(12<<2)|2,{84,115,0}}, +/* 56962 */ {(12<<2)|2,{84,115,0}}, +/* 56963 */ {(12<<2)|2,{84,115,0}}, +/* 56964 */ {(12<<2)|2,{84,115,0}}, +/* 56965 */ {(12<<2)|2,{84,115,0}}, +/* 56966 */ {(12<<2)|2,{84,115,0}}, +/* 56967 */ {(12<<2)|2,{84,115,0}}, +/* 56968 */ {(12<<2)|2,{84,115,0}}, +/* 56969 */ {(12<<2)|2,{84,115,0}}, +/* 56970 */ {(12<<2)|2,{84,115,0}}, +/* 56971 */ {(12<<2)|2,{84,115,0}}, +/* 56972 */ {(12<<2)|2,{84,115,0}}, +/* 56973 */ {(12<<2)|2,{84,115,0}}, +/* 56974 */ {(12<<2)|2,{84,115,0}}, +/* 56975 */ {(12<<2)|2,{84,115,0}}, +/* 56976 */ {(12<<2)|2,{84,116,0}}, +/* 56977 */ {(12<<2)|2,{84,116,0}}, +/* 56978 */ {(12<<2)|2,{84,116,0}}, +/* 56979 */ {(12<<2)|2,{84,116,0}}, +/* 56980 */ {(12<<2)|2,{84,116,0}}, +/* 56981 */ {(12<<2)|2,{84,116,0}}, +/* 56982 */ {(12<<2)|2,{84,116,0}}, +/* 56983 */ {(12<<2)|2,{84,116,0}}, +/* 56984 */ {(12<<2)|2,{84,116,0}}, +/* 56985 */ {(12<<2)|2,{84,116,0}}, +/* 56986 */ {(12<<2)|2,{84,116,0}}, +/* 56987 */ {(12<<2)|2,{84,116,0}}, +/* 56988 */ {(12<<2)|2,{84,116,0}}, +/* 56989 */ {(12<<2)|2,{84,116,0}}, +/* 56990 */ {(12<<2)|2,{84,116,0}}, +/* 56991 */ {(12<<2)|2,{84,116,0}}, +/* 56992 */ {(13<<2)|2,{84,32,0}}, +/* 56993 */ {(13<<2)|2,{84,32,0}}, +/* 56994 */ {(13<<2)|2,{84,32,0}}, +/* 56995 */ {(13<<2)|2,{84,32,0}}, +/* 56996 */ {(13<<2)|2,{84,32,0}}, +/* 56997 */ {(13<<2)|2,{84,32,0}}, +/* 56998 */ {(13<<2)|2,{84,32,0}}, +/* 56999 */ {(13<<2)|2,{84,32,0}}, +/* 57000 */ {(13<<2)|2,{84,37,0}}, +/* 57001 */ {(13<<2)|2,{84,37,0}}, +/* 57002 */ {(13<<2)|2,{84,37,0}}, +/* 57003 */ {(13<<2)|2,{84,37,0}}, +/* 57004 */ {(13<<2)|2,{84,37,0}}, +/* 57005 */ {(13<<2)|2,{84,37,0}}, +/* 57006 */ {(13<<2)|2,{84,37,0}}, +/* 57007 */ {(13<<2)|2,{84,37,0}}, +/* 57008 */ {(13<<2)|2,{84,45,0}}, +/* 57009 */ {(13<<2)|2,{84,45,0}}, +/* 57010 */ {(13<<2)|2,{84,45,0}}, +/* 57011 */ {(13<<2)|2,{84,45,0}}, +/* 57012 */ {(13<<2)|2,{84,45,0}}, +/* 57013 */ {(13<<2)|2,{84,45,0}}, +/* 57014 */ {(13<<2)|2,{84,45,0}}, +/* 57015 */ {(13<<2)|2,{84,45,0}}, +/* 57016 */ {(13<<2)|2,{84,46,0}}, +/* 57017 */ {(13<<2)|2,{84,46,0}}, +/* 57018 */ {(13<<2)|2,{84,46,0}}, +/* 57019 */ {(13<<2)|2,{84,46,0}}, +/* 57020 */ {(13<<2)|2,{84,46,0}}, +/* 57021 */ {(13<<2)|2,{84,46,0}}, +/* 57022 */ {(13<<2)|2,{84,46,0}}, +/* 57023 */ {(13<<2)|2,{84,46,0}}, +/* 57024 */ {(13<<2)|2,{84,47,0}}, +/* 57025 */ {(13<<2)|2,{84,47,0}}, +/* 57026 */ {(13<<2)|2,{84,47,0}}, +/* 57027 */ {(13<<2)|2,{84,47,0}}, +/* 57028 */ {(13<<2)|2,{84,47,0}}, +/* 57029 */ {(13<<2)|2,{84,47,0}}, +/* 57030 */ {(13<<2)|2,{84,47,0}}, +/* 57031 */ {(13<<2)|2,{84,47,0}}, +/* 57032 */ {(13<<2)|2,{84,51,0}}, +/* 57033 */ {(13<<2)|2,{84,51,0}}, +/* 57034 */ {(13<<2)|2,{84,51,0}}, +/* 57035 */ {(13<<2)|2,{84,51,0}}, +/* 57036 */ {(13<<2)|2,{84,51,0}}, +/* 57037 */ {(13<<2)|2,{84,51,0}}, +/* 57038 */ {(13<<2)|2,{84,51,0}}, +/* 57039 */ {(13<<2)|2,{84,51,0}}, +/* 57040 */ {(13<<2)|2,{84,52,0}}, +/* 57041 */ {(13<<2)|2,{84,52,0}}, +/* 57042 */ {(13<<2)|2,{84,52,0}}, +/* 57043 */ {(13<<2)|2,{84,52,0}}, +/* 57044 */ {(13<<2)|2,{84,52,0}}, +/* 57045 */ {(13<<2)|2,{84,52,0}}, +/* 57046 */ {(13<<2)|2,{84,52,0}}, +/* 57047 */ {(13<<2)|2,{84,52,0}}, +/* 57048 */ {(13<<2)|2,{84,53,0}}, +/* 57049 */ {(13<<2)|2,{84,53,0}}, +/* 57050 */ {(13<<2)|2,{84,53,0}}, +/* 57051 */ {(13<<2)|2,{84,53,0}}, +/* 57052 */ {(13<<2)|2,{84,53,0}}, +/* 57053 */ {(13<<2)|2,{84,53,0}}, +/* 57054 */ {(13<<2)|2,{84,53,0}}, +/* 57055 */ {(13<<2)|2,{84,53,0}}, +/* 57056 */ {(13<<2)|2,{84,54,0}}, +/* 57057 */ {(13<<2)|2,{84,54,0}}, +/* 57058 */ {(13<<2)|2,{84,54,0}}, +/* 57059 */ {(13<<2)|2,{84,54,0}}, +/* 57060 */ {(13<<2)|2,{84,54,0}}, +/* 57061 */ {(13<<2)|2,{84,54,0}}, +/* 57062 */ {(13<<2)|2,{84,54,0}}, +/* 57063 */ {(13<<2)|2,{84,54,0}}, +/* 57064 */ {(13<<2)|2,{84,55,0}}, +/* 57065 */ {(13<<2)|2,{84,55,0}}, +/* 57066 */ {(13<<2)|2,{84,55,0}}, +/* 57067 */ {(13<<2)|2,{84,55,0}}, +/* 57068 */ {(13<<2)|2,{84,55,0}}, +/* 57069 */ {(13<<2)|2,{84,55,0}}, +/* 57070 */ {(13<<2)|2,{84,55,0}}, +/* 57071 */ {(13<<2)|2,{84,55,0}}, +/* 57072 */ {(13<<2)|2,{84,56,0}}, +/* 57073 */ {(13<<2)|2,{84,56,0}}, +/* 57074 */ {(13<<2)|2,{84,56,0}}, +/* 57075 */ {(13<<2)|2,{84,56,0}}, +/* 57076 */ {(13<<2)|2,{84,56,0}}, +/* 57077 */ {(13<<2)|2,{84,56,0}}, +/* 57078 */ {(13<<2)|2,{84,56,0}}, +/* 57079 */ {(13<<2)|2,{84,56,0}}, +/* 57080 */ {(13<<2)|2,{84,57,0}}, +/* 57081 */ {(13<<2)|2,{84,57,0}}, +/* 57082 */ {(13<<2)|2,{84,57,0}}, +/* 57083 */ {(13<<2)|2,{84,57,0}}, +/* 57084 */ {(13<<2)|2,{84,57,0}}, +/* 57085 */ {(13<<2)|2,{84,57,0}}, +/* 57086 */ {(13<<2)|2,{84,57,0}}, +/* 57087 */ {(13<<2)|2,{84,57,0}}, +/* 57088 */ {(13<<2)|2,{84,61,0}}, +/* 57089 */ {(13<<2)|2,{84,61,0}}, +/* 57090 */ {(13<<2)|2,{84,61,0}}, +/* 57091 */ {(13<<2)|2,{84,61,0}}, +/* 57092 */ {(13<<2)|2,{84,61,0}}, +/* 57093 */ {(13<<2)|2,{84,61,0}}, +/* 57094 */ {(13<<2)|2,{84,61,0}}, +/* 57095 */ {(13<<2)|2,{84,61,0}}, +/* 57096 */ {(13<<2)|2,{84,65,0}}, +/* 57097 */ {(13<<2)|2,{84,65,0}}, +/* 57098 */ {(13<<2)|2,{84,65,0}}, +/* 57099 */ {(13<<2)|2,{84,65,0}}, +/* 57100 */ {(13<<2)|2,{84,65,0}}, +/* 57101 */ {(13<<2)|2,{84,65,0}}, +/* 57102 */ {(13<<2)|2,{84,65,0}}, +/* 57103 */ {(13<<2)|2,{84,65,0}}, +/* 57104 */ {(13<<2)|2,{84,95,0}}, +/* 57105 */ {(13<<2)|2,{84,95,0}}, +/* 57106 */ {(13<<2)|2,{84,95,0}}, +/* 57107 */ {(13<<2)|2,{84,95,0}}, +/* 57108 */ {(13<<2)|2,{84,95,0}}, +/* 57109 */ {(13<<2)|2,{84,95,0}}, +/* 57110 */ {(13<<2)|2,{84,95,0}}, +/* 57111 */ {(13<<2)|2,{84,95,0}}, +/* 57112 */ {(13<<2)|2,{84,98,0}}, +/* 57113 */ {(13<<2)|2,{84,98,0}}, +/* 57114 */ {(13<<2)|2,{84,98,0}}, +/* 57115 */ {(13<<2)|2,{84,98,0}}, +/* 57116 */ {(13<<2)|2,{84,98,0}}, +/* 57117 */ {(13<<2)|2,{84,98,0}}, +/* 57118 */ {(13<<2)|2,{84,98,0}}, +/* 57119 */ {(13<<2)|2,{84,98,0}}, +/* 57120 */ {(13<<2)|2,{84,100,0}}, +/* 57121 */ {(13<<2)|2,{84,100,0}}, +/* 57122 */ {(13<<2)|2,{84,100,0}}, +/* 57123 */ {(13<<2)|2,{84,100,0}}, +/* 57124 */ {(13<<2)|2,{84,100,0}}, +/* 57125 */ {(13<<2)|2,{84,100,0}}, +/* 57126 */ {(13<<2)|2,{84,100,0}}, +/* 57127 */ {(13<<2)|2,{84,100,0}}, +/* 57128 */ {(13<<2)|2,{84,102,0}}, +/* 57129 */ {(13<<2)|2,{84,102,0}}, +/* 57130 */ {(13<<2)|2,{84,102,0}}, +/* 57131 */ {(13<<2)|2,{84,102,0}}, +/* 57132 */ {(13<<2)|2,{84,102,0}}, +/* 57133 */ {(13<<2)|2,{84,102,0}}, +/* 57134 */ {(13<<2)|2,{84,102,0}}, +/* 57135 */ {(13<<2)|2,{84,102,0}}, +/* 57136 */ {(13<<2)|2,{84,103,0}}, +/* 57137 */ {(13<<2)|2,{84,103,0}}, +/* 57138 */ {(13<<2)|2,{84,103,0}}, +/* 57139 */ {(13<<2)|2,{84,103,0}}, +/* 57140 */ {(13<<2)|2,{84,103,0}}, +/* 57141 */ {(13<<2)|2,{84,103,0}}, +/* 57142 */ {(13<<2)|2,{84,103,0}}, +/* 57143 */ {(13<<2)|2,{84,103,0}}, +/* 57144 */ {(13<<2)|2,{84,104,0}}, +/* 57145 */ {(13<<2)|2,{84,104,0}}, +/* 57146 */ {(13<<2)|2,{84,104,0}}, +/* 57147 */ {(13<<2)|2,{84,104,0}}, +/* 57148 */ {(13<<2)|2,{84,104,0}}, +/* 57149 */ {(13<<2)|2,{84,104,0}}, +/* 57150 */ {(13<<2)|2,{84,104,0}}, +/* 57151 */ {(13<<2)|2,{84,104,0}}, +/* 57152 */ {(13<<2)|2,{84,108,0}}, +/* 57153 */ {(13<<2)|2,{84,108,0}}, +/* 57154 */ {(13<<2)|2,{84,108,0}}, +/* 57155 */ {(13<<2)|2,{84,108,0}}, +/* 57156 */ {(13<<2)|2,{84,108,0}}, +/* 57157 */ {(13<<2)|2,{84,108,0}}, +/* 57158 */ {(13<<2)|2,{84,108,0}}, +/* 57159 */ {(13<<2)|2,{84,108,0}}, +/* 57160 */ {(13<<2)|2,{84,109,0}}, +/* 57161 */ {(13<<2)|2,{84,109,0}}, +/* 57162 */ {(13<<2)|2,{84,109,0}}, +/* 57163 */ {(13<<2)|2,{84,109,0}}, +/* 57164 */ {(13<<2)|2,{84,109,0}}, +/* 57165 */ {(13<<2)|2,{84,109,0}}, +/* 57166 */ {(13<<2)|2,{84,109,0}}, +/* 57167 */ {(13<<2)|2,{84,109,0}}, +/* 57168 */ {(13<<2)|2,{84,110,0}}, +/* 57169 */ {(13<<2)|2,{84,110,0}}, +/* 57170 */ {(13<<2)|2,{84,110,0}}, +/* 57171 */ {(13<<2)|2,{84,110,0}}, +/* 57172 */ {(13<<2)|2,{84,110,0}}, +/* 57173 */ {(13<<2)|2,{84,110,0}}, +/* 57174 */ {(13<<2)|2,{84,110,0}}, +/* 57175 */ {(13<<2)|2,{84,110,0}}, +/* 57176 */ {(13<<2)|2,{84,112,0}}, +/* 57177 */ {(13<<2)|2,{84,112,0}}, +/* 57178 */ {(13<<2)|2,{84,112,0}}, +/* 57179 */ {(13<<2)|2,{84,112,0}}, +/* 57180 */ {(13<<2)|2,{84,112,0}}, +/* 57181 */ {(13<<2)|2,{84,112,0}}, +/* 57182 */ {(13<<2)|2,{84,112,0}}, +/* 57183 */ {(13<<2)|2,{84,112,0}}, +/* 57184 */ {(13<<2)|2,{84,114,0}}, +/* 57185 */ {(13<<2)|2,{84,114,0}}, +/* 57186 */ {(13<<2)|2,{84,114,0}}, +/* 57187 */ {(13<<2)|2,{84,114,0}}, +/* 57188 */ {(13<<2)|2,{84,114,0}}, +/* 57189 */ {(13<<2)|2,{84,114,0}}, +/* 57190 */ {(13<<2)|2,{84,114,0}}, +/* 57191 */ {(13<<2)|2,{84,114,0}}, +/* 57192 */ {(13<<2)|2,{84,117,0}}, +/* 57193 */ {(13<<2)|2,{84,117,0}}, +/* 57194 */ {(13<<2)|2,{84,117,0}}, +/* 57195 */ {(13<<2)|2,{84,117,0}}, +/* 57196 */ {(13<<2)|2,{84,117,0}}, +/* 57197 */ {(13<<2)|2,{84,117,0}}, +/* 57198 */ {(13<<2)|2,{84,117,0}}, +/* 57199 */ {(13<<2)|2,{84,117,0}}, +/* 57200 */ {(14<<2)|2,{84,58,0}}, +/* 57201 */ {(14<<2)|2,{84,58,0}}, +/* 57202 */ {(14<<2)|2,{84,58,0}}, +/* 57203 */ {(14<<2)|2,{84,58,0}}, +/* 57204 */ {(14<<2)|2,{84,66,0}}, +/* 57205 */ {(14<<2)|2,{84,66,0}}, +/* 57206 */ {(14<<2)|2,{84,66,0}}, +/* 57207 */ {(14<<2)|2,{84,66,0}}, +/* 57208 */ {(14<<2)|2,{84,67,0}}, +/* 57209 */ {(14<<2)|2,{84,67,0}}, +/* 57210 */ {(14<<2)|2,{84,67,0}}, +/* 57211 */ {(14<<2)|2,{84,67,0}}, +/* 57212 */ {(14<<2)|2,{84,68,0}}, +/* 57213 */ {(14<<2)|2,{84,68,0}}, +/* 57214 */ {(14<<2)|2,{84,68,0}}, +/* 57215 */ {(14<<2)|2,{84,68,0}}, +/* 57216 */ {(14<<2)|2,{84,69,0}}, +/* 57217 */ {(14<<2)|2,{84,69,0}}, +/* 57218 */ {(14<<2)|2,{84,69,0}}, +/* 57219 */ {(14<<2)|2,{84,69,0}}, +/* 57220 */ {(14<<2)|2,{84,70,0}}, +/* 57221 */ {(14<<2)|2,{84,70,0}}, +/* 57222 */ {(14<<2)|2,{84,70,0}}, +/* 57223 */ {(14<<2)|2,{84,70,0}}, +/* 57224 */ {(14<<2)|2,{84,71,0}}, +/* 57225 */ {(14<<2)|2,{84,71,0}}, +/* 57226 */ {(14<<2)|2,{84,71,0}}, +/* 57227 */ {(14<<2)|2,{84,71,0}}, +/* 57228 */ {(14<<2)|2,{84,72,0}}, +/* 57229 */ {(14<<2)|2,{84,72,0}}, +/* 57230 */ {(14<<2)|2,{84,72,0}}, +/* 57231 */ {(14<<2)|2,{84,72,0}}, +/* 57232 */ {(14<<2)|2,{84,73,0}}, +/* 57233 */ {(14<<2)|2,{84,73,0}}, +/* 57234 */ {(14<<2)|2,{84,73,0}}, +/* 57235 */ {(14<<2)|2,{84,73,0}}, +/* 57236 */ {(14<<2)|2,{84,74,0}}, +/* 57237 */ {(14<<2)|2,{84,74,0}}, +/* 57238 */ {(14<<2)|2,{84,74,0}}, +/* 57239 */ {(14<<2)|2,{84,74,0}}, +/* 57240 */ {(14<<2)|2,{84,75,0}}, +/* 57241 */ {(14<<2)|2,{84,75,0}}, +/* 57242 */ {(14<<2)|2,{84,75,0}}, +/* 57243 */ {(14<<2)|2,{84,75,0}}, +/* 57244 */ {(14<<2)|2,{84,76,0}}, +/* 57245 */ {(14<<2)|2,{84,76,0}}, +/* 57246 */ {(14<<2)|2,{84,76,0}}, +/* 57247 */ {(14<<2)|2,{84,76,0}}, +/* 57248 */ {(14<<2)|2,{84,77,0}}, +/* 57249 */ {(14<<2)|2,{84,77,0}}, +/* 57250 */ {(14<<2)|2,{84,77,0}}, +/* 57251 */ {(14<<2)|2,{84,77,0}}, +/* 57252 */ {(14<<2)|2,{84,78,0}}, +/* 57253 */ {(14<<2)|2,{84,78,0}}, +/* 57254 */ {(14<<2)|2,{84,78,0}}, +/* 57255 */ {(14<<2)|2,{84,78,0}}, +/* 57256 */ {(14<<2)|2,{84,79,0}}, +/* 57257 */ {(14<<2)|2,{84,79,0}}, +/* 57258 */ {(14<<2)|2,{84,79,0}}, +/* 57259 */ {(14<<2)|2,{84,79,0}}, +/* 57260 */ {(14<<2)|2,{84,80,0}}, +/* 57261 */ {(14<<2)|2,{84,80,0}}, +/* 57262 */ {(14<<2)|2,{84,80,0}}, +/* 57263 */ {(14<<2)|2,{84,80,0}}, +/* 57264 */ {(14<<2)|2,{84,81,0}}, +/* 57265 */ {(14<<2)|2,{84,81,0}}, +/* 57266 */ {(14<<2)|2,{84,81,0}}, +/* 57267 */ {(14<<2)|2,{84,81,0}}, +/* 57268 */ {(14<<2)|2,{84,82,0}}, +/* 57269 */ {(14<<2)|2,{84,82,0}}, +/* 57270 */ {(14<<2)|2,{84,82,0}}, +/* 57271 */ {(14<<2)|2,{84,82,0}}, +/* 57272 */ {(14<<2)|2,{84,83,0}}, +/* 57273 */ {(14<<2)|2,{84,83,0}}, +/* 57274 */ {(14<<2)|2,{84,83,0}}, +/* 57275 */ {(14<<2)|2,{84,83,0}}, +/* 57276 */ {(14<<2)|2,{84,84,0}}, +/* 57277 */ {(14<<2)|2,{84,84,0}}, +/* 57278 */ {(14<<2)|2,{84,84,0}}, +/* 57279 */ {(14<<2)|2,{84,84,0}}, +/* 57280 */ {(14<<2)|2,{84,85,0}}, +/* 57281 */ {(14<<2)|2,{84,85,0}}, +/* 57282 */ {(14<<2)|2,{84,85,0}}, +/* 57283 */ {(14<<2)|2,{84,85,0}}, +/* 57284 */ {(14<<2)|2,{84,86,0}}, +/* 57285 */ {(14<<2)|2,{84,86,0}}, +/* 57286 */ {(14<<2)|2,{84,86,0}}, +/* 57287 */ {(14<<2)|2,{84,86,0}}, +/* 57288 */ {(14<<2)|2,{84,87,0}}, +/* 57289 */ {(14<<2)|2,{84,87,0}}, +/* 57290 */ {(14<<2)|2,{84,87,0}}, +/* 57291 */ {(14<<2)|2,{84,87,0}}, +/* 57292 */ {(14<<2)|2,{84,89,0}}, +/* 57293 */ {(14<<2)|2,{84,89,0}}, +/* 57294 */ {(14<<2)|2,{84,89,0}}, +/* 57295 */ {(14<<2)|2,{84,89,0}}, +/* 57296 */ {(14<<2)|2,{84,106,0}}, +/* 57297 */ {(14<<2)|2,{84,106,0}}, +/* 57298 */ {(14<<2)|2,{84,106,0}}, +/* 57299 */ {(14<<2)|2,{84,106,0}}, +/* 57300 */ {(14<<2)|2,{84,107,0}}, +/* 57301 */ {(14<<2)|2,{84,107,0}}, +/* 57302 */ {(14<<2)|2,{84,107,0}}, +/* 57303 */ {(14<<2)|2,{84,107,0}}, +/* 57304 */ {(14<<2)|2,{84,113,0}}, +/* 57305 */ {(14<<2)|2,{84,113,0}}, +/* 57306 */ {(14<<2)|2,{84,113,0}}, +/* 57307 */ {(14<<2)|2,{84,113,0}}, +/* 57308 */ {(14<<2)|2,{84,118,0}}, +/* 57309 */ {(14<<2)|2,{84,118,0}}, +/* 57310 */ {(14<<2)|2,{84,118,0}}, +/* 57311 */ {(14<<2)|2,{84,118,0}}, +/* 57312 */ {(14<<2)|2,{84,119,0}}, +/* 57313 */ {(14<<2)|2,{84,119,0}}, +/* 57314 */ {(14<<2)|2,{84,119,0}}, +/* 57315 */ {(14<<2)|2,{84,119,0}}, +/* 57316 */ {(14<<2)|2,{84,120,0}}, +/* 57317 */ {(14<<2)|2,{84,120,0}}, +/* 57318 */ {(14<<2)|2,{84,120,0}}, +/* 57319 */ {(14<<2)|2,{84,120,0}}, +/* 57320 */ {(14<<2)|2,{84,121,0}}, +/* 57321 */ {(14<<2)|2,{84,121,0}}, +/* 57322 */ {(14<<2)|2,{84,121,0}}, +/* 57323 */ {(14<<2)|2,{84,121,0}}, +/* 57324 */ {(14<<2)|2,{84,122,0}}, +/* 57325 */ {(14<<2)|2,{84,122,0}}, +/* 57326 */ {(14<<2)|2,{84,122,0}}, +/* 57327 */ {(14<<2)|2,{84,122,0}}, +/* 57328 */ {(15<<2)|2,{84,38,0}}, +/* 57329 */ {(15<<2)|2,{84,38,0}}, +/* 57330 */ {(15<<2)|2,{84,42,0}}, +/* 57331 */ {(15<<2)|2,{84,42,0}}, +/* 57332 */ {(15<<2)|2,{84,44,0}}, +/* 57333 */ {(15<<2)|2,{84,44,0}}, +/* 57334 */ {(15<<2)|2,{84,59,0}}, +/* 57335 */ {(15<<2)|2,{84,59,0}}, +/* 57336 */ {(15<<2)|2,{84,88,0}}, +/* 57337 */ {(15<<2)|2,{84,88,0}}, +/* 57338 */ {(15<<2)|2,{84,90,0}}, +/* 57339 */ {(15<<2)|2,{84,90,0}}, +/* 57340 */ {(7<<2)|1,{84,0,0}}, +/* 57341 */ {(7<<2)|1,{84,0,0}}, +/* 57342 */ {(7<<2)|1,{84,0,0}}, +/* 57343 */ {(7<<2)|1,{84,0,0}}, +/* 57344 */ {(12<<2)|2,{85,48,0}}, +/* 57345 */ {(12<<2)|2,{85,48,0}}, +/* 57346 */ {(12<<2)|2,{85,48,0}}, +/* 57347 */ {(12<<2)|2,{85,48,0}}, +/* 57348 */ {(12<<2)|2,{85,48,0}}, +/* 57349 */ {(12<<2)|2,{85,48,0}}, +/* 57350 */ {(12<<2)|2,{85,48,0}}, +/* 57351 */ {(12<<2)|2,{85,48,0}}, +/* 57352 */ {(12<<2)|2,{85,48,0}}, +/* 57353 */ {(12<<2)|2,{85,48,0}}, +/* 57354 */ {(12<<2)|2,{85,48,0}}, +/* 57355 */ {(12<<2)|2,{85,48,0}}, +/* 57356 */ {(12<<2)|2,{85,48,0}}, +/* 57357 */ {(12<<2)|2,{85,48,0}}, +/* 57358 */ {(12<<2)|2,{85,48,0}}, +/* 57359 */ {(12<<2)|2,{85,48,0}}, +/* 57360 */ {(12<<2)|2,{85,49,0}}, +/* 57361 */ {(12<<2)|2,{85,49,0}}, +/* 57362 */ {(12<<2)|2,{85,49,0}}, +/* 57363 */ {(12<<2)|2,{85,49,0}}, +/* 57364 */ {(12<<2)|2,{85,49,0}}, +/* 57365 */ {(12<<2)|2,{85,49,0}}, +/* 57366 */ {(12<<2)|2,{85,49,0}}, +/* 57367 */ {(12<<2)|2,{85,49,0}}, +/* 57368 */ {(12<<2)|2,{85,49,0}}, +/* 57369 */ {(12<<2)|2,{85,49,0}}, +/* 57370 */ {(12<<2)|2,{85,49,0}}, +/* 57371 */ {(12<<2)|2,{85,49,0}}, +/* 57372 */ {(12<<2)|2,{85,49,0}}, +/* 57373 */ {(12<<2)|2,{85,49,0}}, +/* 57374 */ {(12<<2)|2,{85,49,0}}, +/* 57375 */ {(12<<2)|2,{85,49,0}}, +/* 57376 */ {(12<<2)|2,{85,50,0}}, +/* 57377 */ {(12<<2)|2,{85,50,0}}, +/* 57378 */ {(12<<2)|2,{85,50,0}}, +/* 57379 */ {(12<<2)|2,{85,50,0}}, +/* 57380 */ {(12<<2)|2,{85,50,0}}, +/* 57381 */ {(12<<2)|2,{85,50,0}}, +/* 57382 */ {(12<<2)|2,{85,50,0}}, +/* 57383 */ {(12<<2)|2,{85,50,0}}, +/* 57384 */ {(12<<2)|2,{85,50,0}}, +/* 57385 */ {(12<<2)|2,{85,50,0}}, +/* 57386 */ {(12<<2)|2,{85,50,0}}, +/* 57387 */ {(12<<2)|2,{85,50,0}}, +/* 57388 */ {(12<<2)|2,{85,50,0}}, +/* 57389 */ {(12<<2)|2,{85,50,0}}, +/* 57390 */ {(12<<2)|2,{85,50,0}}, +/* 57391 */ {(12<<2)|2,{85,50,0}}, +/* 57392 */ {(12<<2)|2,{85,97,0}}, +/* 57393 */ {(12<<2)|2,{85,97,0}}, +/* 57394 */ {(12<<2)|2,{85,97,0}}, +/* 57395 */ {(12<<2)|2,{85,97,0}}, +/* 57396 */ {(12<<2)|2,{85,97,0}}, +/* 57397 */ {(12<<2)|2,{85,97,0}}, +/* 57398 */ {(12<<2)|2,{85,97,0}}, +/* 57399 */ {(12<<2)|2,{85,97,0}}, +/* 57400 */ {(12<<2)|2,{85,97,0}}, +/* 57401 */ {(12<<2)|2,{85,97,0}}, +/* 57402 */ {(12<<2)|2,{85,97,0}}, +/* 57403 */ {(12<<2)|2,{85,97,0}}, +/* 57404 */ {(12<<2)|2,{85,97,0}}, +/* 57405 */ {(12<<2)|2,{85,97,0}}, +/* 57406 */ {(12<<2)|2,{85,97,0}}, +/* 57407 */ {(12<<2)|2,{85,97,0}}, +/* 57408 */ {(12<<2)|2,{85,99,0}}, +/* 57409 */ {(12<<2)|2,{85,99,0}}, +/* 57410 */ {(12<<2)|2,{85,99,0}}, +/* 57411 */ {(12<<2)|2,{85,99,0}}, +/* 57412 */ {(12<<2)|2,{85,99,0}}, +/* 57413 */ {(12<<2)|2,{85,99,0}}, +/* 57414 */ {(12<<2)|2,{85,99,0}}, +/* 57415 */ {(12<<2)|2,{85,99,0}}, +/* 57416 */ {(12<<2)|2,{85,99,0}}, +/* 57417 */ {(12<<2)|2,{85,99,0}}, +/* 57418 */ {(12<<2)|2,{85,99,0}}, +/* 57419 */ {(12<<2)|2,{85,99,0}}, +/* 57420 */ {(12<<2)|2,{85,99,0}}, +/* 57421 */ {(12<<2)|2,{85,99,0}}, +/* 57422 */ {(12<<2)|2,{85,99,0}}, +/* 57423 */ {(12<<2)|2,{85,99,0}}, +/* 57424 */ {(12<<2)|2,{85,101,0}}, +/* 57425 */ {(12<<2)|2,{85,101,0}}, +/* 57426 */ {(12<<2)|2,{85,101,0}}, +/* 57427 */ {(12<<2)|2,{85,101,0}}, +/* 57428 */ {(12<<2)|2,{85,101,0}}, +/* 57429 */ {(12<<2)|2,{85,101,0}}, +/* 57430 */ {(12<<2)|2,{85,101,0}}, +/* 57431 */ {(12<<2)|2,{85,101,0}}, +/* 57432 */ {(12<<2)|2,{85,101,0}}, +/* 57433 */ {(12<<2)|2,{85,101,0}}, +/* 57434 */ {(12<<2)|2,{85,101,0}}, +/* 57435 */ {(12<<2)|2,{85,101,0}}, +/* 57436 */ {(12<<2)|2,{85,101,0}}, +/* 57437 */ {(12<<2)|2,{85,101,0}}, +/* 57438 */ {(12<<2)|2,{85,101,0}}, +/* 57439 */ {(12<<2)|2,{85,101,0}}, +/* 57440 */ {(12<<2)|2,{85,105,0}}, +/* 57441 */ {(12<<2)|2,{85,105,0}}, +/* 57442 */ {(12<<2)|2,{85,105,0}}, +/* 57443 */ {(12<<2)|2,{85,105,0}}, +/* 57444 */ {(12<<2)|2,{85,105,0}}, +/* 57445 */ {(12<<2)|2,{85,105,0}}, +/* 57446 */ {(12<<2)|2,{85,105,0}}, +/* 57447 */ {(12<<2)|2,{85,105,0}}, +/* 57448 */ {(12<<2)|2,{85,105,0}}, +/* 57449 */ {(12<<2)|2,{85,105,0}}, +/* 57450 */ {(12<<2)|2,{85,105,0}}, +/* 57451 */ {(12<<2)|2,{85,105,0}}, +/* 57452 */ {(12<<2)|2,{85,105,0}}, +/* 57453 */ {(12<<2)|2,{85,105,0}}, +/* 57454 */ {(12<<2)|2,{85,105,0}}, +/* 57455 */ {(12<<2)|2,{85,105,0}}, +/* 57456 */ {(12<<2)|2,{85,111,0}}, +/* 57457 */ {(12<<2)|2,{85,111,0}}, +/* 57458 */ {(12<<2)|2,{85,111,0}}, +/* 57459 */ {(12<<2)|2,{85,111,0}}, +/* 57460 */ {(12<<2)|2,{85,111,0}}, +/* 57461 */ {(12<<2)|2,{85,111,0}}, +/* 57462 */ {(12<<2)|2,{85,111,0}}, +/* 57463 */ {(12<<2)|2,{85,111,0}}, +/* 57464 */ {(12<<2)|2,{85,111,0}}, +/* 57465 */ {(12<<2)|2,{85,111,0}}, +/* 57466 */ {(12<<2)|2,{85,111,0}}, +/* 57467 */ {(12<<2)|2,{85,111,0}}, +/* 57468 */ {(12<<2)|2,{85,111,0}}, +/* 57469 */ {(12<<2)|2,{85,111,0}}, +/* 57470 */ {(12<<2)|2,{85,111,0}}, +/* 57471 */ {(12<<2)|2,{85,111,0}}, +/* 57472 */ {(12<<2)|2,{85,115,0}}, +/* 57473 */ {(12<<2)|2,{85,115,0}}, +/* 57474 */ {(12<<2)|2,{85,115,0}}, +/* 57475 */ {(12<<2)|2,{85,115,0}}, +/* 57476 */ {(12<<2)|2,{85,115,0}}, +/* 57477 */ {(12<<2)|2,{85,115,0}}, +/* 57478 */ {(12<<2)|2,{85,115,0}}, +/* 57479 */ {(12<<2)|2,{85,115,0}}, +/* 57480 */ {(12<<2)|2,{85,115,0}}, +/* 57481 */ {(12<<2)|2,{85,115,0}}, +/* 57482 */ {(12<<2)|2,{85,115,0}}, +/* 57483 */ {(12<<2)|2,{85,115,0}}, +/* 57484 */ {(12<<2)|2,{85,115,0}}, +/* 57485 */ {(12<<2)|2,{85,115,0}}, +/* 57486 */ {(12<<2)|2,{85,115,0}}, +/* 57487 */ {(12<<2)|2,{85,115,0}}, +/* 57488 */ {(12<<2)|2,{85,116,0}}, +/* 57489 */ {(12<<2)|2,{85,116,0}}, +/* 57490 */ {(12<<2)|2,{85,116,0}}, +/* 57491 */ {(12<<2)|2,{85,116,0}}, +/* 57492 */ {(12<<2)|2,{85,116,0}}, +/* 57493 */ {(12<<2)|2,{85,116,0}}, +/* 57494 */ {(12<<2)|2,{85,116,0}}, +/* 57495 */ {(12<<2)|2,{85,116,0}}, +/* 57496 */ {(12<<2)|2,{85,116,0}}, +/* 57497 */ {(12<<2)|2,{85,116,0}}, +/* 57498 */ {(12<<2)|2,{85,116,0}}, +/* 57499 */ {(12<<2)|2,{85,116,0}}, +/* 57500 */ {(12<<2)|2,{85,116,0}}, +/* 57501 */ {(12<<2)|2,{85,116,0}}, +/* 57502 */ {(12<<2)|2,{85,116,0}}, +/* 57503 */ {(12<<2)|2,{85,116,0}}, +/* 57504 */ {(13<<2)|2,{85,32,0}}, +/* 57505 */ {(13<<2)|2,{85,32,0}}, +/* 57506 */ {(13<<2)|2,{85,32,0}}, +/* 57507 */ {(13<<2)|2,{85,32,0}}, +/* 57508 */ {(13<<2)|2,{85,32,0}}, +/* 57509 */ {(13<<2)|2,{85,32,0}}, +/* 57510 */ {(13<<2)|2,{85,32,0}}, +/* 57511 */ {(13<<2)|2,{85,32,0}}, +/* 57512 */ {(13<<2)|2,{85,37,0}}, +/* 57513 */ {(13<<2)|2,{85,37,0}}, +/* 57514 */ {(13<<2)|2,{85,37,0}}, +/* 57515 */ {(13<<2)|2,{85,37,0}}, +/* 57516 */ {(13<<2)|2,{85,37,0}}, +/* 57517 */ {(13<<2)|2,{85,37,0}}, +/* 57518 */ {(13<<2)|2,{85,37,0}}, +/* 57519 */ {(13<<2)|2,{85,37,0}}, +/* 57520 */ {(13<<2)|2,{85,45,0}}, +/* 57521 */ {(13<<2)|2,{85,45,0}}, +/* 57522 */ {(13<<2)|2,{85,45,0}}, +/* 57523 */ {(13<<2)|2,{85,45,0}}, +/* 57524 */ {(13<<2)|2,{85,45,0}}, +/* 57525 */ {(13<<2)|2,{85,45,0}}, +/* 57526 */ {(13<<2)|2,{85,45,0}}, +/* 57527 */ {(13<<2)|2,{85,45,0}}, +/* 57528 */ {(13<<2)|2,{85,46,0}}, +/* 57529 */ {(13<<2)|2,{85,46,0}}, +/* 57530 */ {(13<<2)|2,{85,46,0}}, +/* 57531 */ {(13<<2)|2,{85,46,0}}, +/* 57532 */ {(13<<2)|2,{85,46,0}}, +/* 57533 */ {(13<<2)|2,{85,46,0}}, +/* 57534 */ {(13<<2)|2,{85,46,0}}, +/* 57535 */ {(13<<2)|2,{85,46,0}}, +/* 57536 */ {(13<<2)|2,{85,47,0}}, +/* 57537 */ {(13<<2)|2,{85,47,0}}, +/* 57538 */ {(13<<2)|2,{85,47,0}}, +/* 57539 */ {(13<<2)|2,{85,47,0}}, +/* 57540 */ {(13<<2)|2,{85,47,0}}, +/* 57541 */ {(13<<2)|2,{85,47,0}}, +/* 57542 */ {(13<<2)|2,{85,47,0}}, +/* 57543 */ {(13<<2)|2,{85,47,0}}, +/* 57544 */ {(13<<2)|2,{85,51,0}}, +/* 57545 */ {(13<<2)|2,{85,51,0}}, +/* 57546 */ {(13<<2)|2,{85,51,0}}, +/* 57547 */ {(13<<2)|2,{85,51,0}}, +/* 57548 */ {(13<<2)|2,{85,51,0}}, +/* 57549 */ {(13<<2)|2,{85,51,0}}, +/* 57550 */ {(13<<2)|2,{85,51,0}}, +/* 57551 */ {(13<<2)|2,{85,51,0}}, +/* 57552 */ {(13<<2)|2,{85,52,0}}, +/* 57553 */ {(13<<2)|2,{85,52,0}}, +/* 57554 */ {(13<<2)|2,{85,52,0}}, +/* 57555 */ {(13<<2)|2,{85,52,0}}, +/* 57556 */ {(13<<2)|2,{85,52,0}}, +/* 57557 */ {(13<<2)|2,{85,52,0}}, +/* 57558 */ {(13<<2)|2,{85,52,0}}, +/* 57559 */ {(13<<2)|2,{85,52,0}}, +/* 57560 */ {(13<<2)|2,{85,53,0}}, +/* 57561 */ {(13<<2)|2,{85,53,0}}, +/* 57562 */ {(13<<2)|2,{85,53,0}}, +/* 57563 */ {(13<<2)|2,{85,53,0}}, +/* 57564 */ {(13<<2)|2,{85,53,0}}, +/* 57565 */ {(13<<2)|2,{85,53,0}}, +/* 57566 */ {(13<<2)|2,{85,53,0}}, +/* 57567 */ {(13<<2)|2,{85,53,0}}, +/* 57568 */ {(13<<2)|2,{85,54,0}}, +/* 57569 */ {(13<<2)|2,{85,54,0}}, +/* 57570 */ {(13<<2)|2,{85,54,0}}, +/* 57571 */ {(13<<2)|2,{85,54,0}}, +/* 57572 */ {(13<<2)|2,{85,54,0}}, +/* 57573 */ {(13<<2)|2,{85,54,0}}, +/* 57574 */ {(13<<2)|2,{85,54,0}}, +/* 57575 */ {(13<<2)|2,{85,54,0}}, +/* 57576 */ {(13<<2)|2,{85,55,0}}, +/* 57577 */ {(13<<2)|2,{85,55,0}}, +/* 57578 */ {(13<<2)|2,{85,55,0}}, +/* 57579 */ {(13<<2)|2,{85,55,0}}, +/* 57580 */ {(13<<2)|2,{85,55,0}}, +/* 57581 */ {(13<<2)|2,{85,55,0}}, +/* 57582 */ {(13<<2)|2,{85,55,0}}, +/* 57583 */ {(13<<2)|2,{85,55,0}}, +/* 57584 */ {(13<<2)|2,{85,56,0}}, +/* 57585 */ {(13<<2)|2,{85,56,0}}, +/* 57586 */ {(13<<2)|2,{85,56,0}}, +/* 57587 */ {(13<<2)|2,{85,56,0}}, +/* 57588 */ {(13<<2)|2,{85,56,0}}, +/* 57589 */ {(13<<2)|2,{85,56,0}}, +/* 57590 */ {(13<<2)|2,{85,56,0}}, +/* 57591 */ {(13<<2)|2,{85,56,0}}, +/* 57592 */ {(13<<2)|2,{85,57,0}}, +/* 57593 */ {(13<<2)|2,{85,57,0}}, +/* 57594 */ {(13<<2)|2,{85,57,0}}, +/* 57595 */ {(13<<2)|2,{85,57,0}}, +/* 57596 */ {(13<<2)|2,{85,57,0}}, +/* 57597 */ {(13<<2)|2,{85,57,0}}, +/* 57598 */ {(13<<2)|2,{85,57,0}}, +/* 57599 */ {(13<<2)|2,{85,57,0}}, +/* 57600 */ {(13<<2)|2,{85,61,0}}, +/* 57601 */ {(13<<2)|2,{85,61,0}}, +/* 57602 */ {(13<<2)|2,{85,61,0}}, +/* 57603 */ {(13<<2)|2,{85,61,0}}, +/* 57604 */ {(13<<2)|2,{85,61,0}}, +/* 57605 */ {(13<<2)|2,{85,61,0}}, +/* 57606 */ {(13<<2)|2,{85,61,0}}, +/* 57607 */ {(13<<2)|2,{85,61,0}}, +/* 57608 */ {(13<<2)|2,{85,65,0}}, +/* 57609 */ {(13<<2)|2,{85,65,0}}, +/* 57610 */ {(13<<2)|2,{85,65,0}}, +/* 57611 */ {(13<<2)|2,{85,65,0}}, +/* 57612 */ {(13<<2)|2,{85,65,0}}, +/* 57613 */ {(13<<2)|2,{85,65,0}}, +/* 57614 */ {(13<<2)|2,{85,65,0}}, +/* 57615 */ {(13<<2)|2,{85,65,0}}, +/* 57616 */ {(13<<2)|2,{85,95,0}}, +/* 57617 */ {(13<<2)|2,{85,95,0}}, +/* 57618 */ {(13<<2)|2,{85,95,0}}, +/* 57619 */ {(13<<2)|2,{85,95,0}}, +/* 57620 */ {(13<<2)|2,{85,95,0}}, +/* 57621 */ {(13<<2)|2,{85,95,0}}, +/* 57622 */ {(13<<2)|2,{85,95,0}}, +/* 57623 */ {(13<<2)|2,{85,95,0}}, +/* 57624 */ {(13<<2)|2,{85,98,0}}, +/* 57625 */ {(13<<2)|2,{85,98,0}}, +/* 57626 */ {(13<<2)|2,{85,98,0}}, +/* 57627 */ {(13<<2)|2,{85,98,0}}, +/* 57628 */ {(13<<2)|2,{85,98,0}}, +/* 57629 */ {(13<<2)|2,{85,98,0}}, +/* 57630 */ {(13<<2)|2,{85,98,0}}, +/* 57631 */ {(13<<2)|2,{85,98,0}}, +/* 57632 */ {(13<<2)|2,{85,100,0}}, +/* 57633 */ {(13<<2)|2,{85,100,0}}, +/* 57634 */ {(13<<2)|2,{85,100,0}}, +/* 57635 */ {(13<<2)|2,{85,100,0}}, +/* 57636 */ {(13<<2)|2,{85,100,0}}, +/* 57637 */ {(13<<2)|2,{85,100,0}}, +/* 57638 */ {(13<<2)|2,{85,100,0}}, +/* 57639 */ {(13<<2)|2,{85,100,0}}, +/* 57640 */ {(13<<2)|2,{85,102,0}}, +/* 57641 */ {(13<<2)|2,{85,102,0}}, +/* 57642 */ {(13<<2)|2,{85,102,0}}, +/* 57643 */ {(13<<2)|2,{85,102,0}}, +/* 57644 */ {(13<<2)|2,{85,102,0}}, +/* 57645 */ {(13<<2)|2,{85,102,0}}, +/* 57646 */ {(13<<2)|2,{85,102,0}}, +/* 57647 */ {(13<<2)|2,{85,102,0}}, +/* 57648 */ {(13<<2)|2,{85,103,0}}, +/* 57649 */ {(13<<2)|2,{85,103,0}}, +/* 57650 */ {(13<<2)|2,{85,103,0}}, +/* 57651 */ {(13<<2)|2,{85,103,0}}, +/* 57652 */ {(13<<2)|2,{85,103,0}}, +/* 57653 */ {(13<<2)|2,{85,103,0}}, +/* 57654 */ {(13<<2)|2,{85,103,0}}, +/* 57655 */ {(13<<2)|2,{85,103,0}}, +/* 57656 */ {(13<<2)|2,{85,104,0}}, +/* 57657 */ {(13<<2)|2,{85,104,0}}, +/* 57658 */ {(13<<2)|2,{85,104,0}}, +/* 57659 */ {(13<<2)|2,{85,104,0}}, +/* 57660 */ {(13<<2)|2,{85,104,0}}, +/* 57661 */ {(13<<2)|2,{85,104,0}}, +/* 57662 */ {(13<<2)|2,{85,104,0}}, +/* 57663 */ {(13<<2)|2,{85,104,0}}, +/* 57664 */ {(13<<2)|2,{85,108,0}}, +/* 57665 */ {(13<<2)|2,{85,108,0}}, +/* 57666 */ {(13<<2)|2,{85,108,0}}, +/* 57667 */ {(13<<2)|2,{85,108,0}}, +/* 57668 */ {(13<<2)|2,{85,108,0}}, +/* 57669 */ {(13<<2)|2,{85,108,0}}, +/* 57670 */ {(13<<2)|2,{85,108,0}}, +/* 57671 */ {(13<<2)|2,{85,108,0}}, +/* 57672 */ {(13<<2)|2,{85,109,0}}, +/* 57673 */ {(13<<2)|2,{85,109,0}}, +/* 57674 */ {(13<<2)|2,{85,109,0}}, +/* 57675 */ {(13<<2)|2,{85,109,0}}, +/* 57676 */ {(13<<2)|2,{85,109,0}}, +/* 57677 */ {(13<<2)|2,{85,109,0}}, +/* 57678 */ {(13<<2)|2,{85,109,0}}, +/* 57679 */ {(13<<2)|2,{85,109,0}}, +/* 57680 */ {(13<<2)|2,{85,110,0}}, +/* 57681 */ {(13<<2)|2,{85,110,0}}, +/* 57682 */ {(13<<2)|2,{85,110,0}}, +/* 57683 */ {(13<<2)|2,{85,110,0}}, +/* 57684 */ {(13<<2)|2,{85,110,0}}, +/* 57685 */ {(13<<2)|2,{85,110,0}}, +/* 57686 */ {(13<<2)|2,{85,110,0}}, +/* 57687 */ {(13<<2)|2,{85,110,0}}, +/* 57688 */ {(13<<2)|2,{85,112,0}}, +/* 57689 */ {(13<<2)|2,{85,112,0}}, +/* 57690 */ {(13<<2)|2,{85,112,0}}, +/* 57691 */ {(13<<2)|2,{85,112,0}}, +/* 57692 */ {(13<<2)|2,{85,112,0}}, +/* 57693 */ {(13<<2)|2,{85,112,0}}, +/* 57694 */ {(13<<2)|2,{85,112,0}}, +/* 57695 */ {(13<<2)|2,{85,112,0}}, +/* 57696 */ {(13<<2)|2,{85,114,0}}, +/* 57697 */ {(13<<2)|2,{85,114,0}}, +/* 57698 */ {(13<<2)|2,{85,114,0}}, +/* 57699 */ {(13<<2)|2,{85,114,0}}, +/* 57700 */ {(13<<2)|2,{85,114,0}}, +/* 57701 */ {(13<<2)|2,{85,114,0}}, +/* 57702 */ {(13<<2)|2,{85,114,0}}, +/* 57703 */ {(13<<2)|2,{85,114,0}}, +/* 57704 */ {(13<<2)|2,{85,117,0}}, +/* 57705 */ {(13<<2)|2,{85,117,0}}, +/* 57706 */ {(13<<2)|2,{85,117,0}}, +/* 57707 */ {(13<<2)|2,{85,117,0}}, +/* 57708 */ {(13<<2)|2,{85,117,0}}, +/* 57709 */ {(13<<2)|2,{85,117,0}}, +/* 57710 */ {(13<<2)|2,{85,117,0}}, +/* 57711 */ {(13<<2)|2,{85,117,0}}, +/* 57712 */ {(14<<2)|2,{85,58,0}}, +/* 57713 */ {(14<<2)|2,{85,58,0}}, +/* 57714 */ {(14<<2)|2,{85,58,0}}, +/* 57715 */ {(14<<2)|2,{85,58,0}}, +/* 57716 */ {(14<<2)|2,{85,66,0}}, +/* 57717 */ {(14<<2)|2,{85,66,0}}, +/* 57718 */ {(14<<2)|2,{85,66,0}}, +/* 57719 */ {(14<<2)|2,{85,66,0}}, +/* 57720 */ {(14<<2)|2,{85,67,0}}, +/* 57721 */ {(14<<2)|2,{85,67,0}}, +/* 57722 */ {(14<<2)|2,{85,67,0}}, +/* 57723 */ {(14<<2)|2,{85,67,0}}, +/* 57724 */ {(14<<2)|2,{85,68,0}}, +/* 57725 */ {(14<<2)|2,{85,68,0}}, +/* 57726 */ {(14<<2)|2,{85,68,0}}, +/* 57727 */ {(14<<2)|2,{85,68,0}}, +/* 57728 */ {(14<<2)|2,{85,69,0}}, +/* 57729 */ {(14<<2)|2,{85,69,0}}, +/* 57730 */ {(14<<2)|2,{85,69,0}}, +/* 57731 */ {(14<<2)|2,{85,69,0}}, +/* 57732 */ {(14<<2)|2,{85,70,0}}, +/* 57733 */ {(14<<2)|2,{85,70,0}}, +/* 57734 */ {(14<<2)|2,{85,70,0}}, +/* 57735 */ {(14<<2)|2,{85,70,0}}, +/* 57736 */ {(14<<2)|2,{85,71,0}}, +/* 57737 */ {(14<<2)|2,{85,71,0}}, +/* 57738 */ {(14<<2)|2,{85,71,0}}, +/* 57739 */ {(14<<2)|2,{85,71,0}}, +/* 57740 */ {(14<<2)|2,{85,72,0}}, +/* 57741 */ {(14<<2)|2,{85,72,0}}, +/* 57742 */ {(14<<2)|2,{85,72,0}}, +/* 57743 */ {(14<<2)|2,{85,72,0}}, +/* 57744 */ {(14<<2)|2,{85,73,0}}, +/* 57745 */ {(14<<2)|2,{85,73,0}}, +/* 57746 */ {(14<<2)|2,{85,73,0}}, +/* 57747 */ {(14<<2)|2,{85,73,0}}, +/* 57748 */ {(14<<2)|2,{85,74,0}}, +/* 57749 */ {(14<<2)|2,{85,74,0}}, +/* 57750 */ {(14<<2)|2,{85,74,0}}, +/* 57751 */ {(14<<2)|2,{85,74,0}}, +/* 57752 */ {(14<<2)|2,{85,75,0}}, +/* 57753 */ {(14<<2)|2,{85,75,0}}, +/* 57754 */ {(14<<2)|2,{85,75,0}}, +/* 57755 */ {(14<<2)|2,{85,75,0}}, +/* 57756 */ {(14<<2)|2,{85,76,0}}, +/* 57757 */ {(14<<2)|2,{85,76,0}}, +/* 57758 */ {(14<<2)|2,{85,76,0}}, +/* 57759 */ {(14<<2)|2,{85,76,0}}, +/* 57760 */ {(14<<2)|2,{85,77,0}}, +/* 57761 */ {(14<<2)|2,{85,77,0}}, +/* 57762 */ {(14<<2)|2,{85,77,0}}, +/* 57763 */ {(14<<2)|2,{85,77,0}}, +/* 57764 */ {(14<<2)|2,{85,78,0}}, +/* 57765 */ {(14<<2)|2,{85,78,0}}, +/* 57766 */ {(14<<2)|2,{85,78,0}}, +/* 57767 */ {(14<<2)|2,{85,78,0}}, +/* 57768 */ {(14<<2)|2,{85,79,0}}, +/* 57769 */ {(14<<2)|2,{85,79,0}}, +/* 57770 */ {(14<<2)|2,{85,79,0}}, +/* 57771 */ {(14<<2)|2,{85,79,0}}, +/* 57772 */ {(14<<2)|2,{85,80,0}}, +/* 57773 */ {(14<<2)|2,{85,80,0}}, +/* 57774 */ {(14<<2)|2,{85,80,0}}, +/* 57775 */ {(14<<2)|2,{85,80,0}}, +/* 57776 */ {(14<<2)|2,{85,81,0}}, +/* 57777 */ {(14<<2)|2,{85,81,0}}, +/* 57778 */ {(14<<2)|2,{85,81,0}}, +/* 57779 */ {(14<<2)|2,{85,81,0}}, +/* 57780 */ {(14<<2)|2,{85,82,0}}, +/* 57781 */ {(14<<2)|2,{85,82,0}}, +/* 57782 */ {(14<<2)|2,{85,82,0}}, +/* 57783 */ {(14<<2)|2,{85,82,0}}, +/* 57784 */ {(14<<2)|2,{85,83,0}}, +/* 57785 */ {(14<<2)|2,{85,83,0}}, +/* 57786 */ {(14<<2)|2,{85,83,0}}, +/* 57787 */ {(14<<2)|2,{85,83,0}}, +/* 57788 */ {(14<<2)|2,{85,84,0}}, +/* 57789 */ {(14<<2)|2,{85,84,0}}, +/* 57790 */ {(14<<2)|2,{85,84,0}}, +/* 57791 */ {(14<<2)|2,{85,84,0}}, +/* 57792 */ {(14<<2)|2,{85,85,0}}, +/* 57793 */ {(14<<2)|2,{85,85,0}}, +/* 57794 */ {(14<<2)|2,{85,85,0}}, +/* 57795 */ {(14<<2)|2,{85,85,0}}, +/* 57796 */ {(14<<2)|2,{85,86,0}}, +/* 57797 */ {(14<<2)|2,{85,86,0}}, +/* 57798 */ {(14<<2)|2,{85,86,0}}, +/* 57799 */ {(14<<2)|2,{85,86,0}}, +/* 57800 */ {(14<<2)|2,{85,87,0}}, +/* 57801 */ {(14<<2)|2,{85,87,0}}, +/* 57802 */ {(14<<2)|2,{85,87,0}}, +/* 57803 */ {(14<<2)|2,{85,87,0}}, +/* 57804 */ {(14<<2)|2,{85,89,0}}, +/* 57805 */ {(14<<2)|2,{85,89,0}}, +/* 57806 */ {(14<<2)|2,{85,89,0}}, +/* 57807 */ {(14<<2)|2,{85,89,0}}, +/* 57808 */ {(14<<2)|2,{85,106,0}}, +/* 57809 */ {(14<<2)|2,{85,106,0}}, +/* 57810 */ {(14<<2)|2,{85,106,0}}, +/* 57811 */ {(14<<2)|2,{85,106,0}}, +/* 57812 */ {(14<<2)|2,{85,107,0}}, +/* 57813 */ {(14<<2)|2,{85,107,0}}, +/* 57814 */ {(14<<2)|2,{85,107,0}}, +/* 57815 */ {(14<<2)|2,{85,107,0}}, +/* 57816 */ {(14<<2)|2,{85,113,0}}, +/* 57817 */ {(14<<2)|2,{85,113,0}}, +/* 57818 */ {(14<<2)|2,{85,113,0}}, +/* 57819 */ {(14<<2)|2,{85,113,0}}, +/* 57820 */ {(14<<2)|2,{85,118,0}}, +/* 57821 */ {(14<<2)|2,{85,118,0}}, +/* 57822 */ {(14<<2)|2,{85,118,0}}, +/* 57823 */ {(14<<2)|2,{85,118,0}}, +/* 57824 */ {(14<<2)|2,{85,119,0}}, +/* 57825 */ {(14<<2)|2,{85,119,0}}, +/* 57826 */ {(14<<2)|2,{85,119,0}}, +/* 57827 */ {(14<<2)|2,{85,119,0}}, +/* 57828 */ {(14<<2)|2,{85,120,0}}, +/* 57829 */ {(14<<2)|2,{85,120,0}}, +/* 57830 */ {(14<<2)|2,{85,120,0}}, +/* 57831 */ {(14<<2)|2,{85,120,0}}, +/* 57832 */ {(14<<2)|2,{85,121,0}}, +/* 57833 */ {(14<<2)|2,{85,121,0}}, +/* 57834 */ {(14<<2)|2,{85,121,0}}, +/* 57835 */ {(14<<2)|2,{85,121,0}}, +/* 57836 */ {(14<<2)|2,{85,122,0}}, +/* 57837 */ {(14<<2)|2,{85,122,0}}, +/* 57838 */ {(14<<2)|2,{85,122,0}}, +/* 57839 */ {(14<<2)|2,{85,122,0}}, +/* 57840 */ {(15<<2)|2,{85,38,0}}, +/* 57841 */ {(15<<2)|2,{85,38,0}}, +/* 57842 */ {(15<<2)|2,{85,42,0}}, +/* 57843 */ {(15<<2)|2,{85,42,0}}, +/* 57844 */ {(15<<2)|2,{85,44,0}}, +/* 57845 */ {(15<<2)|2,{85,44,0}}, +/* 57846 */ {(15<<2)|2,{85,59,0}}, +/* 57847 */ {(15<<2)|2,{85,59,0}}, +/* 57848 */ {(15<<2)|2,{85,88,0}}, +/* 57849 */ {(15<<2)|2,{85,88,0}}, +/* 57850 */ {(15<<2)|2,{85,90,0}}, +/* 57851 */ {(15<<2)|2,{85,90,0}}, +/* 57852 */ {(7<<2)|1,{85,0,0}}, +/* 57853 */ {(7<<2)|1,{85,0,0}}, +/* 57854 */ {(7<<2)|1,{85,0,0}}, +/* 57855 */ {(7<<2)|1,{85,0,0}}, +/* 57856 */ {(12<<2)|2,{86,48,0}}, +/* 57857 */ {(12<<2)|2,{86,48,0}}, +/* 57858 */ {(12<<2)|2,{86,48,0}}, +/* 57859 */ {(12<<2)|2,{86,48,0}}, +/* 57860 */ {(12<<2)|2,{86,48,0}}, +/* 57861 */ {(12<<2)|2,{86,48,0}}, +/* 57862 */ {(12<<2)|2,{86,48,0}}, +/* 57863 */ {(12<<2)|2,{86,48,0}}, +/* 57864 */ {(12<<2)|2,{86,48,0}}, +/* 57865 */ {(12<<2)|2,{86,48,0}}, +/* 57866 */ {(12<<2)|2,{86,48,0}}, +/* 57867 */ {(12<<2)|2,{86,48,0}}, +/* 57868 */ {(12<<2)|2,{86,48,0}}, +/* 57869 */ {(12<<2)|2,{86,48,0}}, +/* 57870 */ {(12<<2)|2,{86,48,0}}, +/* 57871 */ {(12<<2)|2,{86,48,0}}, +/* 57872 */ {(12<<2)|2,{86,49,0}}, +/* 57873 */ {(12<<2)|2,{86,49,0}}, +/* 57874 */ {(12<<2)|2,{86,49,0}}, +/* 57875 */ {(12<<2)|2,{86,49,0}}, +/* 57876 */ {(12<<2)|2,{86,49,0}}, +/* 57877 */ {(12<<2)|2,{86,49,0}}, +/* 57878 */ {(12<<2)|2,{86,49,0}}, +/* 57879 */ {(12<<2)|2,{86,49,0}}, +/* 57880 */ {(12<<2)|2,{86,49,0}}, +/* 57881 */ {(12<<2)|2,{86,49,0}}, +/* 57882 */ {(12<<2)|2,{86,49,0}}, +/* 57883 */ {(12<<2)|2,{86,49,0}}, +/* 57884 */ {(12<<2)|2,{86,49,0}}, +/* 57885 */ {(12<<2)|2,{86,49,0}}, +/* 57886 */ {(12<<2)|2,{86,49,0}}, +/* 57887 */ {(12<<2)|2,{86,49,0}}, +/* 57888 */ {(12<<2)|2,{86,50,0}}, +/* 57889 */ {(12<<2)|2,{86,50,0}}, +/* 57890 */ {(12<<2)|2,{86,50,0}}, +/* 57891 */ {(12<<2)|2,{86,50,0}}, +/* 57892 */ {(12<<2)|2,{86,50,0}}, +/* 57893 */ {(12<<2)|2,{86,50,0}}, +/* 57894 */ {(12<<2)|2,{86,50,0}}, +/* 57895 */ {(12<<2)|2,{86,50,0}}, +/* 57896 */ {(12<<2)|2,{86,50,0}}, +/* 57897 */ {(12<<2)|2,{86,50,0}}, +/* 57898 */ {(12<<2)|2,{86,50,0}}, +/* 57899 */ {(12<<2)|2,{86,50,0}}, +/* 57900 */ {(12<<2)|2,{86,50,0}}, +/* 57901 */ {(12<<2)|2,{86,50,0}}, +/* 57902 */ {(12<<2)|2,{86,50,0}}, +/* 57903 */ {(12<<2)|2,{86,50,0}}, +/* 57904 */ {(12<<2)|2,{86,97,0}}, +/* 57905 */ {(12<<2)|2,{86,97,0}}, +/* 57906 */ {(12<<2)|2,{86,97,0}}, +/* 57907 */ {(12<<2)|2,{86,97,0}}, +/* 57908 */ {(12<<2)|2,{86,97,0}}, +/* 57909 */ {(12<<2)|2,{86,97,0}}, +/* 57910 */ {(12<<2)|2,{86,97,0}}, +/* 57911 */ {(12<<2)|2,{86,97,0}}, +/* 57912 */ {(12<<2)|2,{86,97,0}}, +/* 57913 */ {(12<<2)|2,{86,97,0}}, +/* 57914 */ {(12<<2)|2,{86,97,0}}, +/* 57915 */ {(12<<2)|2,{86,97,0}}, +/* 57916 */ {(12<<2)|2,{86,97,0}}, +/* 57917 */ {(12<<2)|2,{86,97,0}}, +/* 57918 */ {(12<<2)|2,{86,97,0}}, +/* 57919 */ {(12<<2)|2,{86,97,0}}, +/* 57920 */ {(12<<2)|2,{86,99,0}}, +/* 57921 */ {(12<<2)|2,{86,99,0}}, +/* 57922 */ {(12<<2)|2,{86,99,0}}, +/* 57923 */ {(12<<2)|2,{86,99,0}}, +/* 57924 */ {(12<<2)|2,{86,99,0}}, +/* 57925 */ {(12<<2)|2,{86,99,0}}, +/* 57926 */ {(12<<2)|2,{86,99,0}}, +/* 57927 */ {(12<<2)|2,{86,99,0}}, +/* 57928 */ {(12<<2)|2,{86,99,0}}, +/* 57929 */ {(12<<2)|2,{86,99,0}}, +/* 57930 */ {(12<<2)|2,{86,99,0}}, +/* 57931 */ {(12<<2)|2,{86,99,0}}, +/* 57932 */ {(12<<2)|2,{86,99,0}}, +/* 57933 */ {(12<<2)|2,{86,99,0}}, +/* 57934 */ {(12<<2)|2,{86,99,0}}, +/* 57935 */ {(12<<2)|2,{86,99,0}}, +/* 57936 */ {(12<<2)|2,{86,101,0}}, +/* 57937 */ {(12<<2)|2,{86,101,0}}, +/* 57938 */ {(12<<2)|2,{86,101,0}}, +/* 57939 */ {(12<<2)|2,{86,101,0}}, +/* 57940 */ {(12<<2)|2,{86,101,0}}, +/* 57941 */ {(12<<2)|2,{86,101,0}}, +/* 57942 */ {(12<<2)|2,{86,101,0}}, +/* 57943 */ {(12<<2)|2,{86,101,0}}, +/* 57944 */ {(12<<2)|2,{86,101,0}}, +/* 57945 */ {(12<<2)|2,{86,101,0}}, +/* 57946 */ {(12<<2)|2,{86,101,0}}, +/* 57947 */ {(12<<2)|2,{86,101,0}}, +/* 57948 */ {(12<<2)|2,{86,101,0}}, +/* 57949 */ {(12<<2)|2,{86,101,0}}, +/* 57950 */ {(12<<2)|2,{86,101,0}}, +/* 57951 */ {(12<<2)|2,{86,101,0}}, +/* 57952 */ {(12<<2)|2,{86,105,0}}, +/* 57953 */ {(12<<2)|2,{86,105,0}}, +/* 57954 */ {(12<<2)|2,{86,105,0}}, +/* 57955 */ {(12<<2)|2,{86,105,0}}, +/* 57956 */ {(12<<2)|2,{86,105,0}}, +/* 57957 */ {(12<<2)|2,{86,105,0}}, +/* 57958 */ {(12<<2)|2,{86,105,0}}, +/* 57959 */ {(12<<2)|2,{86,105,0}}, +/* 57960 */ {(12<<2)|2,{86,105,0}}, +/* 57961 */ {(12<<2)|2,{86,105,0}}, +/* 57962 */ {(12<<2)|2,{86,105,0}}, +/* 57963 */ {(12<<2)|2,{86,105,0}}, +/* 57964 */ {(12<<2)|2,{86,105,0}}, +/* 57965 */ {(12<<2)|2,{86,105,0}}, +/* 57966 */ {(12<<2)|2,{86,105,0}}, +/* 57967 */ {(12<<2)|2,{86,105,0}}, +/* 57968 */ {(12<<2)|2,{86,111,0}}, +/* 57969 */ {(12<<2)|2,{86,111,0}}, +/* 57970 */ {(12<<2)|2,{86,111,0}}, +/* 57971 */ {(12<<2)|2,{86,111,0}}, +/* 57972 */ {(12<<2)|2,{86,111,0}}, +/* 57973 */ {(12<<2)|2,{86,111,0}}, +/* 57974 */ {(12<<2)|2,{86,111,0}}, +/* 57975 */ {(12<<2)|2,{86,111,0}}, +/* 57976 */ {(12<<2)|2,{86,111,0}}, +/* 57977 */ {(12<<2)|2,{86,111,0}}, +/* 57978 */ {(12<<2)|2,{86,111,0}}, +/* 57979 */ {(12<<2)|2,{86,111,0}}, +/* 57980 */ {(12<<2)|2,{86,111,0}}, +/* 57981 */ {(12<<2)|2,{86,111,0}}, +/* 57982 */ {(12<<2)|2,{86,111,0}}, +/* 57983 */ {(12<<2)|2,{86,111,0}}, +/* 57984 */ {(12<<2)|2,{86,115,0}}, +/* 57985 */ {(12<<2)|2,{86,115,0}}, +/* 57986 */ {(12<<2)|2,{86,115,0}}, +/* 57987 */ {(12<<2)|2,{86,115,0}}, +/* 57988 */ {(12<<2)|2,{86,115,0}}, +/* 57989 */ {(12<<2)|2,{86,115,0}}, +/* 57990 */ {(12<<2)|2,{86,115,0}}, +/* 57991 */ {(12<<2)|2,{86,115,0}}, +/* 57992 */ {(12<<2)|2,{86,115,0}}, +/* 57993 */ {(12<<2)|2,{86,115,0}}, +/* 57994 */ {(12<<2)|2,{86,115,0}}, +/* 57995 */ {(12<<2)|2,{86,115,0}}, +/* 57996 */ {(12<<2)|2,{86,115,0}}, +/* 57997 */ {(12<<2)|2,{86,115,0}}, +/* 57998 */ {(12<<2)|2,{86,115,0}}, +/* 57999 */ {(12<<2)|2,{86,115,0}}, +/* 58000 */ {(12<<2)|2,{86,116,0}}, +/* 58001 */ {(12<<2)|2,{86,116,0}}, +/* 58002 */ {(12<<2)|2,{86,116,0}}, +/* 58003 */ {(12<<2)|2,{86,116,0}}, +/* 58004 */ {(12<<2)|2,{86,116,0}}, +/* 58005 */ {(12<<2)|2,{86,116,0}}, +/* 58006 */ {(12<<2)|2,{86,116,0}}, +/* 58007 */ {(12<<2)|2,{86,116,0}}, +/* 58008 */ {(12<<2)|2,{86,116,0}}, +/* 58009 */ {(12<<2)|2,{86,116,0}}, +/* 58010 */ {(12<<2)|2,{86,116,0}}, +/* 58011 */ {(12<<2)|2,{86,116,0}}, +/* 58012 */ {(12<<2)|2,{86,116,0}}, +/* 58013 */ {(12<<2)|2,{86,116,0}}, +/* 58014 */ {(12<<2)|2,{86,116,0}}, +/* 58015 */ {(12<<2)|2,{86,116,0}}, +/* 58016 */ {(13<<2)|2,{86,32,0}}, +/* 58017 */ {(13<<2)|2,{86,32,0}}, +/* 58018 */ {(13<<2)|2,{86,32,0}}, +/* 58019 */ {(13<<2)|2,{86,32,0}}, +/* 58020 */ {(13<<2)|2,{86,32,0}}, +/* 58021 */ {(13<<2)|2,{86,32,0}}, +/* 58022 */ {(13<<2)|2,{86,32,0}}, +/* 58023 */ {(13<<2)|2,{86,32,0}}, +/* 58024 */ {(13<<2)|2,{86,37,0}}, +/* 58025 */ {(13<<2)|2,{86,37,0}}, +/* 58026 */ {(13<<2)|2,{86,37,0}}, +/* 58027 */ {(13<<2)|2,{86,37,0}}, +/* 58028 */ {(13<<2)|2,{86,37,0}}, +/* 58029 */ {(13<<2)|2,{86,37,0}}, +/* 58030 */ {(13<<2)|2,{86,37,0}}, +/* 58031 */ {(13<<2)|2,{86,37,0}}, +/* 58032 */ {(13<<2)|2,{86,45,0}}, +/* 58033 */ {(13<<2)|2,{86,45,0}}, +/* 58034 */ {(13<<2)|2,{86,45,0}}, +/* 58035 */ {(13<<2)|2,{86,45,0}}, +/* 58036 */ {(13<<2)|2,{86,45,0}}, +/* 58037 */ {(13<<2)|2,{86,45,0}}, +/* 58038 */ {(13<<2)|2,{86,45,0}}, +/* 58039 */ {(13<<2)|2,{86,45,0}}, +/* 58040 */ {(13<<2)|2,{86,46,0}}, +/* 58041 */ {(13<<2)|2,{86,46,0}}, +/* 58042 */ {(13<<2)|2,{86,46,0}}, +/* 58043 */ {(13<<2)|2,{86,46,0}}, +/* 58044 */ {(13<<2)|2,{86,46,0}}, +/* 58045 */ {(13<<2)|2,{86,46,0}}, +/* 58046 */ {(13<<2)|2,{86,46,0}}, +/* 58047 */ {(13<<2)|2,{86,46,0}}, +/* 58048 */ {(13<<2)|2,{86,47,0}}, +/* 58049 */ {(13<<2)|2,{86,47,0}}, +/* 58050 */ {(13<<2)|2,{86,47,0}}, +/* 58051 */ {(13<<2)|2,{86,47,0}}, +/* 58052 */ {(13<<2)|2,{86,47,0}}, +/* 58053 */ {(13<<2)|2,{86,47,0}}, +/* 58054 */ {(13<<2)|2,{86,47,0}}, +/* 58055 */ {(13<<2)|2,{86,47,0}}, +/* 58056 */ {(13<<2)|2,{86,51,0}}, +/* 58057 */ {(13<<2)|2,{86,51,0}}, +/* 58058 */ {(13<<2)|2,{86,51,0}}, +/* 58059 */ {(13<<2)|2,{86,51,0}}, +/* 58060 */ {(13<<2)|2,{86,51,0}}, +/* 58061 */ {(13<<2)|2,{86,51,0}}, +/* 58062 */ {(13<<2)|2,{86,51,0}}, +/* 58063 */ {(13<<2)|2,{86,51,0}}, +/* 58064 */ {(13<<2)|2,{86,52,0}}, +/* 58065 */ {(13<<2)|2,{86,52,0}}, +/* 58066 */ {(13<<2)|2,{86,52,0}}, +/* 58067 */ {(13<<2)|2,{86,52,0}}, +/* 58068 */ {(13<<2)|2,{86,52,0}}, +/* 58069 */ {(13<<2)|2,{86,52,0}}, +/* 58070 */ {(13<<2)|2,{86,52,0}}, +/* 58071 */ {(13<<2)|2,{86,52,0}}, +/* 58072 */ {(13<<2)|2,{86,53,0}}, +/* 58073 */ {(13<<2)|2,{86,53,0}}, +/* 58074 */ {(13<<2)|2,{86,53,0}}, +/* 58075 */ {(13<<2)|2,{86,53,0}}, +/* 58076 */ {(13<<2)|2,{86,53,0}}, +/* 58077 */ {(13<<2)|2,{86,53,0}}, +/* 58078 */ {(13<<2)|2,{86,53,0}}, +/* 58079 */ {(13<<2)|2,{86,53,0}}, +/* 58080 */ {(13<<2)|2,{86,54,0}}, +/* 58081 */ {(13<<2)|2,{86,54,0}}, +/* 58082 */ {(13<<2)|2,{86,54,0}}, +/* 58083 */ {(13<<2)|2,{86,54,0}}, +/* 58084 */ {(13<<2)|2,{86,54,0}}, +/* 58085 */ {(13<<2)|2,{86,54,0}}, +/* 58086 */ {(13<<2)|2,{86,54,0}}, +/* 58087 */ {(13<<2)|2,{86,54,0}}, +/* 58088 */ {(13<<2)|2,{86,55,0}}, +/* 58089 */ {(13<<2)|2,{86,55,0}}, +/* 58090 */ {(13<<2)|2,{86,55,0}}, +/* 58091 */ {(13<<2)|2,{86,55,0}}, +/* 58092 */ {(13<<2)|2,{86,55,0}}, +/* 58093 */ {(13<<2)|2,{86,55,0}}, +/* 58094 */ {(13<<2)|2,{86,55,0}}, +/* 58095 */ {(13<<2)|2,{86,55,0}}, +/* 58096 */ {(13<<2)|2,{86,56,0}}, +/* 58097 */ {(13<<2)|2,{86,56,0}}, +/* 58098 */ {(13<<2)|2,{86,56,0}}, +/* 58099 */ {(13<<2)|2,{86,56,0}}, +/* 58100 */ {(13<<2)|2,{86,56,0}}, +/* 58101 */ {(13<<2)|2,{86,56,0}}, +/* 58102 */ {(13<<2)|2,{86,56,0}}, +/* 58103 */ {(13<<2)|2,{86,56,0}}, +/* 58104 */ {(13<<2)|2,{86,57,0}}, +/* 58105 */ {(13<<2)|2,{86,57,0}}, +/* 58106 */ {(13<<2)|2,{86,57,0}}, +/* 58107 */ {(13<<2)|2,{86,57,0}}, +/* 58108 */ {(13<<2)|2,{86,57,0}}, +/* 58109 */ {(13<<2)|2,{86,57,0}}, +/* 58110 */ {(13<<2)|2,{86,57,0}}, +/* 58111 */ {(13<<2)|2,{86,57,0}}, +/* 58112 */ {(13<<2)|2,{86,61,0}}, +/* 58113 */ {(13<<2)|2,{86,61,0}}, +/* 58114 */ {(13<<2)|2,{86,61,0}}, +/* 58115 */ {(13<<2)|2,{86,61,0}}, +/* 58116 */ {(13<<2)|2,{86,61,0}}, +/* 58117 */ {(13<<2)|2,{86,61,0}}, +/* 58118 */ {(13<<2)|2,{86,61,0}}, +/* 58119 */ {(13<<2)|2,{86,61,0}}, +/* 58120 */ {(13<<2)|2,{86,65,0}}, +/* 58121 */ {(13<<2)|2,{86,65,0}}, +/* 58122 */ {(13<<2)|2,{86,65,0}}, +/* 58123 */ {(13<<2)|2,{86,65,0}}, +/* 58124 */ {(13<<2)|2,{86,65,0}}, +/* 58125 */ {(13<<2)|2,{86,65,0}}, +/* 58126 */ {(13<<2)|2,{86,65,0}}, +/* 58127 */ {(13<<2)|2,{86,65,0}}, +/* 58128 */ {(13<<2)|2,{86,95,0}}, +/* 58129 */ {(13<<2)|2,{86,95,0}}, +/* 58130 */ {(13<<2)|2,{86,95,0}}, +/* 58131 */ {(13<<2)|2,{86,95,0}}, +/* 58132 */ {(13<<2)|2,{86,95,0}}, +/* 58133 */ {(13<<2)|2,{86,95,0}}, +/* 58134 */ {(13<<2)|2,{86,95,0}}, +/* 58135 */ {(13<<2)|2,{86,95,0}}, +/* 58136 */ {(13<<2)|2,{86,98,0}}, +/* 58137 */ {(13<<2)|2,{86,98,0}}, +/* 58138 */ {(13<<2)|2,{86,98,0}}, +/* 58139 */ {(13<<2)|2,{86,98,0}}, +/* 58140 */ {(13<<2)|2,{86,98,0}}, +/* 58141 */ {(13<<2)|2,{86,98,0}}, +/* 58142 */ {(13<<2)|2,{86,98,0}}, +/* 58143 */ {(13<<2)|2,{86,98,0}}, +/* 58144 */ {(13<<2)|2,{86,100,0}}, +/* 58145 */ {(13<<2)|2,{86,100,0}}, +/* 58146 */ {(13<<2)|2,{86,100,0}}, +/* 58147 */ {(13<<2)|2,{86,100,0}}, +/* 58148 */ {(13<<2)|2,{86,100,0}}, +/* 58149 */ {(13<<2)|2,{86,100,0}}, +/* 58150 */ {(13<<2)|2,{86,100,0}}, +/* 58151 */ {(13<<2)|2,{86,100,0}}, +/* 58152 */ {(13<<2)|2,{86,102,0}}, +/* 58153 */ {(13<<2)|2,{86,102,0}}, +/* 58154 */ {(13<<2)|2,{86,102,0}}, +/* 58155 */ {(13<<2)|2,{86,102,0}}, +/* 58156 */ {(13<<2)|2,{86,102,0}}, +/* 58157 */ {(13<<2)|2,{86,102,0}}, +/* 58158 */ {(13<<2)|2,{86,102,0}}, +/* 58159 */ {(13<<2)|2,{86,102,0}}, +/* 58160 */ {(13<<2)|2,{86,103,0}}, +/* 58161 */ {(13<<2)|2,{86,103,0}}, +/* 58162 */ {(13<<2)|2,{86,103,0}}, +/* 58163 */ {(13<<2)|2,{86,103,0}}, +/* 58164 */ {(13<<2)|2,{86,103,0}}, +/* 58165 */ {(13<<2)|2,{86,103,0}}, +/* 58166 */ {(13<<2)|2,{86,103,0}}, +/* 58167 */ {(13<<2)|2,{86,103,0}}, +/* 58168 */ {(13<<2)|2,{86,104,0}}, +/* 58169 */ {(13<<2)|2,{86,104,0}}, +/* 58170 */ {(13<<2)|2,{86,104,0}}, +/* 58171 */ {(13<<2)|2,{86,104,0}}, +/* 58172 */ {(13<<2)|2,{86,104,0}}, +/* 58173 */ {(13<<2)|2,{86,104,0}}, +/* 58174 */ {(13<<2)|2,{86,104,0}}, +/* 58175 */ {(13<<2)|2,{86,104,0}}, +/* 58176 */ {(13<<2)|2,{86,108,0}}, +/* 58177 */ {(13<<2)|2,{86,108,0}}, +/* 58178 */ {(13<<2)|2,{86,108,0}}, +/* 58179 */ {(13<<2)|2,{86,108,0}}, +/* 58180 */ {(13<<2)|2,{86,108,0}}, +/* 58181 */ {(13<<2)|2,{86,108,0}}, +/* 58182 */ {(13<<2)|2,{86,108,0}}, +/* 58183 */ {(13<<2)|2,{86,108,0}}, +/* 58184 */ {(13<<2)|2,{86,109,0}}, +/* 58185 */ {(13<<2)|2,{86,109,0}}, +/* 58186 */ {(13<<2)|2,{86,109,0}}, +/* 58187 */ {(13<<2)|2,{86,109,0}}, +/* 58188 */ {(13<<2)|2,{86,109,0}}, +/* 58189 */ {(13<<2)|2,{86,109,0}}, +/* 58190 */ {(13<<2)|2,{86,109,0}}, +/* 58191 */ {(13<<2)|2,{86,109,0}}, +/* 58192 */ {(13<<2)|2,{86,110,0}}, +/* 58193 */ {(13<<2)|2,{86,110,0}}, +/* 58194 */ {(13<<2)|2,{86,110,0}}, +/* 58195 */ {(13<<2)|2,{86,110,0}}, +/* 58196 */ {(13<<2)|2,{86,110,0}}, +/* 58197 */ {(13<<2)|2,{86,110,0}}, +/* 58198 */ {(13<<2)|2,{86,110,0}}, +/* 58199 */ {(13<<2)|2,{86,110,0}}, +/* 58200 */ {(13<<2)|2,{86,112,0}}, +/* 58201 */ {(13<<2)|2,{86,112,0}}, +/* 58202 */ {(13<<2)|2,{86,112,0}}, +/* 58203 */ {(13<<2)|2,{86,112,0}}, +/* 58204 */ {(13<<2)|2,{86,112,0}}, +/* 58205 */ {(13<<2)|2,{86,112,0}}, +/* 58206 */ {(13<<2)|2,{86,112,0}}, +/* 58207 */ {(13<<2)|2,{86,112,0}}, +/* 58208 */ {(13<<2)|2,{86,114,0}}, +/* 58209 */ {(13<<2)|2,{86,114,0}}, +/* 58210 */ {(13<<2)|2,{86,114,0}}, +/* 58211 */ {(13<<2)|2,{86,114,0}}, +/* 58212 */ {(13<<2)|2,{86,114,0}}, +/* 58213 */ {(13<<2)|2,{86,114,0}}, +/* 58214 */ {(13<<2)|2,{86,114,0}}, +/* 58215 */ {(13<<2)|2,{86,114,0}}, +/* 58216 */ {(13<<2)|2,{86,117,0}}, +/* 58217 */ {(13<<2)|2,{86,117,0}}, +/* 58218 */ {(13<<2)|2,{86,117,0}}, +/* 58219 */ {(13<<2)|2,{86,117,0}}, +/* 58220 */ {(13<<2)|2,{86,117,0}}, +/* 58221 */ {(13<<2)|2,{86,117,0}}, +/* 58222 */ {(13<<2)|2,{86,117,0}}, +/* 58223 */ {(13<<2)|2,{86,117,0}}, +/* 58224 */ {(14<<2)|2,{86,58,0}}, +/* 58225 */ {(14<<2)|2,{86,58,0}}, +/* 58226 */ {(14<<2)|2,{86,58,0}}, +/* 58227 */ {(14<<2)|2,{86,58,0}}, +/* 58228 */ {(14<<2)|2,{86,66,0}}, +/* 58229 */ {(14<<2)|2,{86,66,0}}, +/* 58230 */ {(14<<2)|2,{86,66,0}}, +/* 58231 */ {(14<<2)|2,{86,66,0}}, +/* 58232 */ {(14<<2)|2,{86,67,0}}, +/* 58233 */ {(14<<2)|2,{86,67,0}}, +/* 58234 */ {(14<<2)|2,{86,67,0}}, +/* 58235 */ {(14<<2)|2,{86,67,0}}, +/* 58236 */ {(14<<2)|2,{86,68,0}}, +/* 58237 */ {(14<<2)|2,{86,68,0}}, +/* 58238 */ {(14<<2)|2,{86,68,0}}, +/* 58239 */ {(14<<2)|2,{86,68,0}}, +/* 58240 */ {(14<<2)|2,{86,69,0}}, +/* 58241 */ {(14<<2)|2,{86,69,0}}, +/* 58242 */ {(14<<2)|2,{86,69,0}}, +/* 58243 */ {(14<<2)|2,{86,69,0}}, +/* 58244 */ {(14<<2)|2,{86,70,0}}, +/* 58245 */ {(14<<2)|2,{86,70,0}}, +/* 58246 */ {(14<<2)|2,{86,70,0}}, +/* 58247 */ {(14<<2)|2,{86,70,0}}, +/* 58248 */ {(14<<2)|2,{86,71,0}}, +/* 58249 */ {(14<<2)|2,{86,71,0}}, +/* 58250 */ {(14<<2)|2,{86,71,0}}, +/* 58251 */ {(14<<2)|2,{86,71,0}}, +/* 58252 */ {(14<<2)|2,{86,72,0}}, +/* 58253 */ {(14<<2)|2,{86,72,0}}, +/* 58254 */ {(14<<2)|2,{86,72,0}}, +/* 58255 */ {(14<<2)|2,{86,72,0}}, +/* 58256 */ {(14<<2)|2,{86,73,0}}, +/* 58257 */ {(14<<2)|2,{86,73,0}}, +/* 58258 */ {(14<<2)|2,{86,73,0}}, +/* 58259 */ {(14<<2)|2,{86,73,0}}, +/* 58260 */ {(14<<2)|2,{86,74,0}}, +/* 58261 */ {(14<<2)|2,{86,74,0}}, +/* 58262 */ {(14<<2)|2,{86,74,0}}, +/* 58263 */ {(14<<2)|2,{86,74,0}}, +/* 58264 */ {(14<<2)|2,{86,75,0}}, +/* 58265 */ {(14<<2)|2,{86,75,0}}, +/* 58266 */ {(14<<2)|2,{86,75,0}}, +/* 58267 */ {(14<<2)|2,{86,75,0}}, +/* 58268 */ {(14<<2)|2,{86,76,0}}, +/* 58269 */ {(14<<2)|2,{86,76,0}}, +/* 58270 */ {(14<<2)|2,{86,76,0}}, +/* 58271 */ {(14<<2)|2,{86,76,0}}, +/* 58272 */ {(14<<2)|2,{86,77,0}}, +/* 58273 */ {(14<<2)|2,{86,77,0}}, +/* 58274 */ {(14<<2)|2,{86,77,0}}, +/* 58275 */ {(14<<2)|2,{86,77,0}}, +/* 58276 */ {(14<<2)|2,{86,78,0}}, +/* 58277 */ {(14<<2)|2,{86,78,0}}, +/* 58278 */ {(14<<2)|2,{86,78,0}}, +/* 58279 */ {(14<<2)|2,{86,78,0}}, +/* 58280 */ {(14<<2)|2,{86,79,0}}, +/* 58281 */ {(14<<2)|2,{86,79,0}}, +/* 58282 */ {(14<<2)|2,{86,79,0}}, +/* 58283 */ {(14<<2)|2,{86,79,0}}, +/* 58284 */ {(14<<2)|2,{86,80,0}}, +/* 58285 */ {(14<<2)|2,{86,80,0}}, +/* 58286 */ {(14<<2)|2,{86,80,0}}, +/* 58287 */ {(14<<2)|2,{86,80,0}}, +/* 58288 */ {(14<<2)|2,{86,81,0}}, +/* 58289 */ {(14<<2)|2,{86,81,0}}, +/* 58290 */ {(14<<2)|2,{86,81,0}}, +/* 58291 */ {(14<<2)|2,{86,81,0}}, +/* 58292 */ {(14<<2)|2,{86,82,0}}, +/* 58293 */ {(14<<2)|2,{86,82,0}}, +/* 58294 */ {(14<<2)|2,{86,82,0}}, +/* 58295 */ {(14<<2)|2,{86,82,0}}, +/* 58296 */ {(14<<2)|2,{86,83,0}}, +/* 58297 */ {(14<<2)|2,{86,83,0}}, +/* 58298 */ {(14<<2)|2,{86,83,0}}, +/* 58299 */ {(14<<2)|2,{86,83,0}}, +/* 58300 */ {(14<<2)|2,{86,84,0}}, +/* 58301 */ {(14<<2)|2,{86,84,0}}, +/* 58302 */ {(14<<2)|2,{86,84,0}}, +/* 58303 */ {(14<<2)|2,{86,84,0}}, +/* 58304 */ {(14<<2)|2,{86,85,0}}, +/* 58305 */ {(14<<2)|2,{86,85,0}}, +/* 58306 */ {(14<<2)|2,{86,85,0}}, +/* 58307 */ {(14<<2)|2,{86,85,0}}, +/* 58308 */ {(14<<2)|2,{86,86,0}}, +/* 58309 */ {(14<<2)|2,{86,86,0}}, +/* 58310 */ {(14<<2)|2,{86,86,0}}, +/* 58311 */ {(14<<2)|2,{86,86,0}}, +/* 58312 */ {(14<<2)|2,{86,87,0}}, +/* 58313 */ {(14<<2)|2,{86,87,0}}, +/* 58314 */ {(14<<2)|2,{86,87,0}}, +/* 58315 */ {(14<<2)|2,{86,87,0}}, +/* 58316 */ {(14<<2)|2,{86,89,0}}, +/* 58317 */ {(14<<2)|2,{86,89,0}}, +/* 58318 */ {(14<<2)|2,{86,89,0}}, +/* 58319 */ {(14<<2)|2,{86,89,0}}, +/* 58320 */ {(14<<2)|2,{86,106,0}}, +/* 58321 */ {(14<<2)|2,{86,106,0}}, +/* 58322 */ {(14<<2)|2,{86,106,0}}, +/* 58323 */ {(14<<2)|2,{86,106,0}}, +/* 58324 */ {(14<<2)|2,{86,107,0}}, +/* 58325 */ {(14<<2)|2,{86,107,0}}, +/* 58326 */ {(14<<2)|2,{86,107,0}}, +/* 58327 */ {(14<<2)|2,{86,107,0}}, +/* 58328 */ {(14<<2)|2,{86,113,0}}, +/* 58329 */ {(14<<2)|2,{86,113,0}}, +/* 58330 */ {(14<<2)|2,{86,113,0}}, +/* 58331 */ {(14<<2)|2,{86,113,0}}, +/* 58332 */ {(14<<2)|2,{86,118,0}}, +/* 58333 */ {(14<<2)|2,{86,118,0}}, +/* 58334 */ {(14<<2)|2,{86,118,0}}, +/* 58335 */ {(14<<2)|2,{86,118,0}}, +/* 58336 */ {(14<<2)|2,{86,119,0}}, +/* 58337 */ {(14<<2)|2,{86,119,0}}, +/* 58338 */ {(14<<2)|2,{86,119,0}}, +/* 58339 */ {(14<<2)|2,{86,119,0}}, +/* 58340 */ {(14<<2)|2,{86,120,0}}, +/* 58341 */ {(14<<2)|2,{86,120,0}}, +/* 58342 */ {(14<<2)|2,{86,120,0}}, +/* 58343 */ {(14<<2)|2,{86,120,0}}, +/* 58344 */ {(14<<2)|2,{86,121,0}}, +/* 58345 */ {(14<<2)|2,{86,121,0}}, +/* 58346 */ {(14<<2)|2,{86,121,0}}, +/* 58347 */ {(14<<2)|2,{86,121,0}}, +/* 58348 */ {(14<<2)|2,{86,122,0}}, +/* 58349 */ {(14<<2)|2,{86,122,0}}, +/* 58350 */ {(14<<2)|2,{86,122,0}}, +/* 58351 */ {(14<<2)|2,{86,122,0}}, +/* 58352 */ {(15<<2)|2,{86,38,0}}, +/* 58353 */ {(15<<2)|2,{86,38,0}}, +/* 58354 */ {(15<<2)|2,{86,42,0}}, +/* 58355 */ {(15<<2)|2,{86,42,0}}, +/* 58356 */ {(15<<2)|2,{86,44,0}}, +/* 58357 */ {(15<<2)|2,{86,44,0}}, +/* 58358 */ {(15<<2)|2,{86,59,0}}, +/* 58359 */ {(15<<2)|2,{86,59,0}}, +/* 58360 */ {(15<<2)|2,{86,88,0}}, +/* 58361 */ {(15<<2)|2,{86,88,0}}, +/* 58362 */ {(15<<2)|2,{86,90,0}}, +/* 58363 */ {(15<<2)|2,{86,90,0}}, +/* 58364 */ {(7<<2)|1,{86,0,0}}, +/* 58365 */ {(7<<2)|1,{86,0,0}}, +/* 58366 */ {(7<<2)|1,{86,0,0}}, +/* 58367 */ {(7<<2)|1,{86,0,0}}, +/* 58368 */ {(12<<2)|2,{87,48,0}}, +/* 58369 */ {(12<<2)|2,{87,48,0}}, +/* 58370 */ {(12<<2)|2,{87,48,0}}, +/* 58371 */ {(12<<2)|2,{87,48,0}}, +/* 58372 */ {(12<<2)|2,{87,48,0}}, +/* 58373 */ {(12<<2)|2,{87,48,0}}, +/* 58374 */ {(12<<2)|2,{87,48,0}}, +/* 58375 */ {(12<<2)|2,{87,48,0}}, +/* 58376 */ {(12<<2)|2,{87,48,0}}, +/* 58377 */ {(12<<2)|2,{87,48,0}}, +/* 58378 */ {(12<<2)|2,{87,48,0}}, +/* 58379 */ {(12<<2)|2,{87,48,0}}, +/* 58380 */ {(12<<2)|2,{87,48,0}}, +/* 58381 */ {(12<<2)|2,{87,48,0}}, +/* 58382 */ {(12<<2)|2,{87,48,0}}, +/* 58383 */ {(12<<2)|2,{87,48,0}}, +/* 58384 */ {(12<<2)|2,{87,49,0}}, +/* 58385 */ {(12<<2)|2,{87,49,0}}, +/* 58386 */ {(12<<2)|2,{87,49,0}}, +/* 58387 */ {(12<<2)|2,{87,49,0}}, +/* 58388 */ {(12<<2)|2,{87,49,0}}, +/* 58389 */ {(12<<2)|2,{87,49,0}}, +/* 58390 */ {(12<<2)|2,{87,49,0}}, +/* 58391 */ {(12<<2)|2,{87,49,0}}, +/* 58392 */ {(12<<2)|2,{87,49,0}}, +/* 58393 */ {(12<<2)|2,{87,49,0}}, +/* 58394 */ {(12<<2)|2,{87,49,0}}, +/* 58395 */ {(12<<2)|2,{87,49,0}}, +/* 58396 */ {(12<<2)|2,{87,49,0}}, +/* 58397 */ {(12<<2)|2,{87,49,0}}, +/* 58398 */ {(12<<2)|2,{87,49,0}}, +/* 58399 */ {(12<<2)|2,{87,49,0}}, +/* 58400 */ {(12<<2)|2,{87,50,0}}, +/* 58401 */ {(12<<2)|2,{87,50,0}}, +/* 58402 */ {(12<<2)|2,{87,50,0}}, +/* 58403 */ {(12<<2)|2,{87,50,0}}, +/* 58404 */ {(12<<2)|2,{87,50,0}}, +/* 58405 */ {(12<<2)|2,{87,50,0}}, +/* 58406 */ {(12<<2)|2,{87,50,0}}, +/* 58407 */ {(12<<2)|2,{87,50,0}}, +/* 58408 */ {(12<<2)|2,{87,50,0}}, +/* 58409 */ {(12<<2)|2,{87,50,0}}, +/* 58410 */ {(12<<2)|2,{87,50,0}}, +/* 58411 */ {(12<<2)|2,{87,50,0}}, +/* 58412 */ {(12<<2)|2,{87,50,0}}, +/* 58413 */ {(12<<2)|2,{87,50,0}}, +/* 58414 */ {(12<<2)|2,{87,50,0}}, +/* 58415 */ {(12<<2)|2,{87,50,0}}, +/* 58416 */ {(12<<2)|2,{87,97,0}}, +/* 58417 */ {(12<<2)|2,{87,97,0}}, +/* 58418 */ {(12<<2)|2,{87,97,0}}, +/* 58419 */ {(12<<2)|2,{87,97,0}}, +/* 58420 */ {(12<<2)|2,{87,97,0}}, +/* 58421 */ {(12<<2)|2,{87,97,0}}, +/* 58422 */ {(12<<2)|2,{87,97,0}}, +/* 58423 */ {(12<<2)|2,{87,97,0}}, +/* 58424 */ {(12<<2)|2,{87,97,0}}, +/* 58425 */ {(12<<2)|2,{87,97,0}}, +/* 58426 */ {(12<<2)|2,{87,97,0}}, +/* 58427 */ {(12<<2)|2,{87,97,0}}, +/* 58428 */ {(12<<2)|2,{87,97,0}}, +/* 58429 */ {(12<<2)|2,{87,97,0}}, +/* 58430 */ {(12<<2)|2,{87,97,0}}, +/* 58431 */ {(12<<2)|2,{87,97,0}}, +/* 58432 */ {(12<<2)|2,{87,99,0}}, +/* 58433 */ {(12<<2)|2,{87,99,0}}, +/* 58434 */ {(12<<2)|2,{87,99,0}}, +/* 58435 */ {(12<<2)|2,{87,99,0}}, +/* 58436 */ {(12<<2)|2,{87,99,0}}, +/* 58437 */ {(12<<2)|2,{87,99,0}}, +/* 58438 */ {(12<<2)|2,{87,99,0}}, +/* 58439 */ {(12<<2)|2,{87,99,0}}, +/* 58440 */ {(12<<2)|2,{87,99,0}}, +/* 58441 */ {(12<<2)|2,{87,99,0}}, +/* 58442 */ {(12<<2)|2,{87,99,0}}, +/* 58443 */ {(12<<2)|2,{87,99,0}}, +/* 58444 */ {(12<<2)|2,{87,99,0}}, +/* 58445 */ {(12<<2)|2,{87,99,0}}, +/* 58446 */ {(12<<2)|2,{87,99,0}}, +/* 58447 */ {(12<<2)|2,{87,99,0}}, +/* 58448 */ {(12<<2)|2,{87,101,0}}, +/* 58449 */ {(12<<2)|2,{87,101,0}}, +/* 58450 */ {(12<<2)|2,{87,101,0}}, +/* 58451 */ {(12<<2)|2,{87,101,0}}, +/* 58452 */ {(12<<2)|2,{87,101,0}}, +/* 58453 */ {(12<<2)|2,{87,101,0}}, +/* 58454 */ {(12<<2)|2,{87,101,0}}, +/* 58455 */ {(12<<2)|2,{87,101,0}}, +/* 58456 */ {(12<<2)|2,{87,101,0}}, +/* 58457 */ {(12<<2)|2,{87,101,0}}, +/* 58458 */ {(12<<2)|2,{87,101,0}}, +/* 58459 */ {(12<<2)|2,{87,101,0}}, +/* 58460 */ {(12<<2)|2,{87,101,0}}, +/* 58461 */ {(12<<2)|2,{87,101,0}}, +/* 58462 */ {(12<<2)|2,{87,101,0}}, +/* 58463 */ {(12<<2)|2,{87,101,0}}, +/* 58464 */ {(12<<2)|2,{87,105,0}}, +/* 58465 */ {(12<<2)|2,{87,105,0}}, +/* 58466 */ {(12<<2)|2,{87,105,0}}, +/* 58467 */ {(12<<2)|2,{87,105,0}}, +/* 58468 */ {(12<<2)|2,{87,105,0}}, +/* 58469 */ {(12<<2)|2,{87,105,0}}, +/* 58470 */ {(12<<2)|2,{87,105,0}}, +/* 58471 */ {(12<<2)|2,{87,105,0}}, +/* 58472 */ {(12<<2)|2,{87,105,0}}, +/* 58473 */ {(12<<2)|2,{87,105,0}}, +/* 58474 */ {(12<<2)|2,{87,105,0}}, +/* 58475 */ {(12<<2)|2,{87,105,0}}, +/* 58476 */ {(12<<2)|2,{87,105,0}}, +/* 58477 */ {(12<<2)|2,{87,105,0}}, +/* 58478 */ {(12<<2)|2,{87,105,0}}, +/* 58479 */ {(12<<2)|2,{87,105,0}}, +/* 58480 */ {(12<<2)|2,{87,111,0}}, +/* 58481 */ {(12<<2)|2,{87,111,0}}, +/* 58482 */ {(12<<2)|2,{87,111,0}}, +/* 58483 */ {(12<<2)|2,{87,111,0}}, +/* 58484 */ {(12<<2)|2,{87,111,0}}, +/* 58485 */ {(12<<2)|2,{87,111,0}}, +/* 58486 */ {(12<<2)|2,{87,111,0}}, +/* 58487 */ {(12<<2)|2,{87,111,0}}, +/* 58488 */ {(12<<2)|2,{87,111,0}}, +/* 58489 */ {(12<<2)|2,{87,111,0}}, +/* 58490 */ {(12<<2)|2,{87,111,0}}, +/* 58491 */ {(12<<2)|2,{87,111,0}}, +/* 58492 */ {(12<<2)|2,{87,111,0}}, +/* 58493 */ {(12<<2)|2,{87,111,0}}, +/* 58494 */ {(12<<2)|2,{87,111,0}}, +/* 58495 */ {(12<<2)|2,{87,111,0}}, +/* 58496 */ {(12<<2)|2,{87,115,0}}, +/* 58497 */ {(12<<2)|2,{87,115,0}}, +/* 58498 */ {(12<<2)|2,{87,115,0}}, +/* 58499 */ {(12<<2)|2,{87,115,0}}, +/* 58500 */ {(12<<2)|2,{87,115,0}}, +/* 58501 */ {(12<<2)|2,{87,115,0}}, +/* 58502 */ {(12<<2)|2,{87,115,0}}, +/* 58503 */ {(12<<2)|2,{87,115,0}}, +/* 58504 */ {(12<<2)|2,{87,115,0}}, +/* 58505 */ {(12<<2)|2,{87,115,0}}, +/* 58506 */ {(12<<2)|2,{87,115,0}}, +/* 58507 */ {(12<<2)|2,{87,115,0}}, +/* 58508 */ {(12<<2)|2,{87,115,0}}, +/* 58509 */ {(12<<2)|2,{87,115,0}}, +/* 58510 */ {(12<<2)|2,{87,115,0}}, +/* 58511 */ {(12<<2)|2,{87,115,0}}, +/* 58512 */ {(12<<2)|2,{87,116,0}}, +/* 58513 */ {(12<<2)|2,{87,116,0}}, +/* 58514 */ {(12<<2)|2,{87,116,0}}, +/* 58515 */ {(12<<2)|2,{87,116,0}}, +/* 58516 */ {(12<<2)|2,{87,116,0}}, +/* 58517 */ {(12<<2)|2,{87,116,0}}, +/* 58518 */ {(12<<2)|2,{87,116,0}}, +/* 58519 */ {(12<<2)|2,{87,116,0}}, +/* 58520 */ {(12<<2)|2,{87,116,0}}, +/* 58521 */ {(12<<2)|2,{87,116,0}}, +/* 58522 */ {(12<<2)|2,{87,116,0}}, +/* 58523 */ {(12<<2)|2,{87,116,0}}, +/* 58524 */ {(12<<2)|2,{87,116,0}}, +/* 58525 */ {(12<<2)|2,{87,116,0}}, +/* 58526 */ {(12<<2)|2,{87,116,0}}, +/* 58527 */ {(12<<2)|2,{87,116,0}}, +/* 58528 */ {(13<<2)|2,{87,32,0}}, +/* 58529 */ {(13<<2)|2,{87,32,0}}, +/* 58530 */ {(13<<2)|2,{87,32,0}}, +/* 58531 */ {(13<<2)|2,{87,32,0}}, +/* 58532 */ {(13<<2)|2,{87,32,0}}, +/* 58533 */ {(13<<2)|2,{87,32,0}}, +/* 58534 */ {(13<<2)|2,{87,32,0}}, +/* 58535 */ {(13<<2)|2,{87,32,0}}, +/* 58536 */ {(13<<2)|2,{87,37,0}}, +/* 58537 */ {(13<<2)|2,{87,37,0}}, +/* 58538 */ {(13<<2)|2,{87,37,0}}, +/* 58539 */ {(13<<2)|2,{87,37,0}}, +/* 58540 */ {(13<<2)|2,{87,37,0}}, +/* 58541 */ {(13<<2)|2,{87,37,0}}, +/* 58542 */ {(13<<2)|2,{87,37,0}}, +/* 58543 */ {(13<<2)|2,{87,37,0}}, +/* 58544 */ {(13<<2)|2,{87,45,0}}, +/* 58545 */ {(13<<2)|2,{87,45,0}}, +/* 58546 */ {(13<<2)|2,{87,45,0}}, +/* 58547 */ {(13<<2)|2,{87,45,0}}, +/* 58548 */ {(13<<2)|2,{87,45,0}}, +/* 58549 */ {(13<<2)|2,{87,45,0}}, +/* 58550 */ {(13<<2)|2,{87,45,0}}, +/* 58551 */ {(13<<2)|2,{87,45,0}}, +/* 58552 */ {(13<<2)|2,{87,46,0}}, +/* 58553 */ {(13<<2)|2,{87,46,0}}, +/* 58554 */ {(13<<2)|2,{87,46,0}}, +/* 58555 */ {(13<<2)|2,{87,46,0}}, +/* 58556 */ {(13<<2)|2,{87,46,0}}, +/* 58557 */ {(13<<2)|2,{87,46,0}}, +/* 58558 */ {(13<<2)|2,{87,46,0}}, +/* 58559 */ {(13<<2)|2,{87,46,0}}, +/* 58560 */ {(13<<2)|2,{87,47,0}}, +/* 58561 */ {(13<<2)|2,{87,47,0}}, +/* 58562 */ {(13<<2)|2,{87,47,0}}, +/* 58563 */ {(13<<2)|2,{87,47,0}}, +/* 58564 */ {(13<<2)|2,{87,47,0}}, +/* 58565 */ {(13<<2)|2,{87,47,0}}, +/* 58566 */ {(13<<2)|2,{87,47,0}}, +/* 58567 */ {(13<<2)|2,{87,47,0}}, +/* 58568 */ {(13<<2)|2,{87,51,0}}, +/* 58569 */ {(13<<2)|2,{87,51,0}}, +/* 58570 */ {(13<<2)|2,{87,51,0}}, +/* 58571 */ {(13<<2)|2,{87,51,0}}, +/* 58572 */ {(13<<2)|2,{87,51,0}}, +/* 58573 */ {(13<<2)|2,{87,51,0}}, +/* 58574 */ {(13<<2)|2,{87,51,0}}, +/* 58575 */ {(13<<2)|2,{87,51,0}}, +/* 58576 */ {(13<<2)|2,{87,52,0}}, +/* 58577 */ {(13<<2)|2,{87,52,0}}, +/* 58578 */ {(13<<2)|2,{87,52,0}}, +/* 58579 */ {(13<<2)|2,{87,52,0}}, +/* 58580 */ {(13<<2)|2,{87,52,0}}, +/* 58581 */ {(13<<2)|2,{87,52,0}}, +/* 58582 */ {(13<<2)|2,{87,52,0}}, +/* 58583 */ {(13<<2)|2,{87,52,0}}, +/* 58584 */ {(13<<2)|2,{87,53,0}}, +/* 58585 */ {(13<<2)|2,{87,53,0}}, +/* 58586 */ {(13<<2)|2,{87,53,0}}, +/* 58587 */ {(13<<2)|2,{87,53,0}}, +/* 58588 */ {(13<<2)|2,{87,53,0}}, +/* 58589 */ {(13<<2)|2,{87,53,0}}, +/* 58590 */ {(13<<2)|2,{87,53,0}}, +/* 58591 */ {(13<<2)|2,{87,53,0}}, +/* 58592 */ {(13<<2)|2,{87,54,0}}, +/* 58593 */ {(13<<2)|2,{87,54,0}}, +/* 58594 */ {(13<<2)|2,{87,54,0}}, +/* 58595 */ {(13<<2)|2,{87,54,0}}, +/* 58596 */ {(13<<2)|2,{87,54,0}}, +/* 58597 */ {(13<<2)|2,{87,54,0}}, +/* 58598 */ {(13<<2)|2,{87,54,0}}, +/* 58599 */ {(13<<2)|2,{87,54,0}}, +/* 58600 */ {(13<<2)|2,{87,55,0}}, +/* 58601 */ {(13<<2)|2,{87,55,0}}, +/* 58602 */ {(13<<2)|2,{87,55,0}}, +/* 58603 */ {(13<<2)|2,{87,55,0}}, +/* 58604 */ {(13<<2)|2,{87,55,0}}, +/* 58605 */ {(13<<2)|2,{87,55,0}}, +/* 58606 */ {(13<<2)|2,{87,55,0}}, +/* 58607 */ {(13<<2)|2,{87,55,0}}, +/* 58608 */ {(13<<2)|2,{87,56,0}}, +/* 58609 */ {(13<<2)|2,{87,56,0}}, +/* 58610 */ {(13<<2)|2,{87,56,0}}, +/* 58611 */ {(13<<2)|2,{87,56,0}}, +/* 58612 */ {(13<<2)|2,{87,56,0}}, +/* 58613 */ {(13<<2)|2,{87,56,0}}, +/* 58614 */ {(13<<2)|2,{87,56,0}}, +/* 58615 */ {(13<<2)|2,{87,56,0}}, +/* 58616 */ {(13<<2)|2,{87,57,0}}, +/* 58617 */ {(13<<2)|2,{87,57,0}}, +/* 58618 */ {(13<<2)|2,{87,57,0}}, +/* 58619 */ {(13<<2)|2,{87,57,0}}, +/* 58620 */ {(13<<2)|2,{87,57,0}}, +/* 58621 */ {(13<<2)|2,{87,57,0}}, +/* 58622 */ {(13<<2)|2,{87,57,0}}, +/* 58623 */ {(13<<2)|2,{87,57,0}}, +/* 58624 */ {(13<<2)|2,{87,61,0}}, +/* 58625 */ {(13<<2)|2,{87,61,0}}, +/* 58626 */ {(13<<2)|2,{87,61,0}}, +/* 58627 */ {(13<<2)|2,{87,61,0}}, +/* 58628 */ {(13<<2)|2,{87,61,0}}, +/* 58629 */ {(13<<2)|2,{87,61,0}}, +/* 58630 */ {(13<<2)|2,{87,61,0}}, +/* 58631 */ {(13<<2)|2,{87,61,0}}, +/* 58632 */ {(13<<2)|2,{87,65,0}}, +/* 58633 */ {(13<<2)|2,{87,65,0}}, +/* 58634 */ {(13<<2)|2,{87,65,0}}, +/* 58635 */ {(13<<2)|2,{87,65,0}}, +/* 58636 */ {(13<<2)|2,{87,65,0}}, +/* 58637 */ {(13<<2)|2,{87,65,0}}, +/* 58638 */ {(13<<2)|2,{87,65,0}}, +/* 58639 */ {(13<<2)|2,{87,65,0}}, +/* 58640 */ {(13<<2)|2,{87,95,0}}, +/* 58641 */ {(13<<2)|2,{87,95,0}}, +/* 58642 */ {(13<<2)|2,{87,95,0}}, +/* 58643 */ {(13<<2)|2,{87,95,0}}, +/* 58644 */ {(13<<2)|2,{87,95,0}}, +/* 58645 */ {(13<<2)|2,{87,95,0}}, +/* 58646 */ {(13<<2)|2,{87,95,0}}, +/* 58647 */ {(13<<2)|2,{87,95,0}}, +/* 58648 */ {(13<<2)|2,{87,98,0}}, +/* 58649 */ {(13<<2)|2,{87,98,0}}, +/* 58650 */ {(13<<2)|2,{87,98,0}}, +/* 58651 */ {(13<<2)|2,{87,98,0}}, +/* 58652 */ {(13<<2)|2,{87,98,0}}, +/* 58653 */ {(13<<2)|2,{87,98,0}}, +/* 58654 */ {(13<<2)|2,{87,98,0}}, +/* 58655 */ {(13<<2)|2,{87,98,0}}, +/* 58656 */ {(13<<2)|2,{87,100,0}}, +/* 58657 */ {(13<<2)|2,{87,100,0}}, +/* 58658 */ {(13<<2)|2,{87,100,0}}, +/* 58659 */ {(13<<2)|2,{87,100,0}}, +/* 58660 */ {(13<<2)|2,{87,100,0}}, +/* 58661 */ {(13<<2)|2,{87,100,0}}, +/* 58662 */ {(13<<2)|2,{87,100,0}}, +/* 58663 */ {(13<<2)|2,{87,100,0}}, +/* 58664 */ {(13<<2)|2,{87,102,0}}, +/* 58665 */ {(13<<2)|2,{87,102,0}}, +/* 58666 */ {(13<<2)|2,{87,102,0}}, +/* 58667 */ {(13<<2)|2,{87,102,0}}, +/* 58668 */ {(13<<2)|2,{87,102,0}}, +/* 58669 */ {(13<<2)|2,{87,102,0}}, +/* 58670 */ {(13<<2)|2,{87,102,0}}, +/* 58671 */ {(13<<2)|2,{87,102,0}}, +/* 58672 */ {(13<<2)|2,{87,103,0}}, +/* 58673 */ {(13<<2)|2,{87,103,0}}, +/* 58674 */ {(13<<2)|2,{87,103,0}}, +/* 58675 */ {(13<<2)|2,{87,103,0}}, +/* 58676 */ {(13<<2)|2,{87,103,0}}, +/* 58677 */ {(13<<2)|2,{87,103,0}}, +/* 58678 */ {(13<<2)|2,{87,103,0}}, +/* 58679 */ {(13<<2)|2,{87,103,0}}, +/* 58680 */ {(13<<2)|2,{87,104,0}}, +/* 58681 */ {(13<<2)|2,{87,104,0}}, +/* 58682 */ {(13<<2)|2,{87,104,0}}, +/* 58683 */ {(13<<2)|2,{87,104,0}}, +/* 58684 */ {(13<<2)|2,{87,104,0}}, +/* 58685 */ {(13<<2)|2,{87,104,0}}, +/* 58686 */ {(13<<2)|2,{87,104,0}}, +/* 58687 */ {(13<<2)|2,{87,104,0}}, +/* 58688 */ {(13<<2)|2,{87,108,0}}, +/* 58689 */ {(13<<2)|2,{87,108,0}}, +/* 58690 */ {(13<<2)|2,{87,108,0}}, +/* 58691 */ {(13<<2)|2,{87,108,0}}, +/* 58692 */ {(13<<2)|2,{87,108,0}}, +/* 58693 */ {(13<<2)|2,{87,108,0}}, +/* 58694 */ {(13<<2)|2,{87,108,0}}, +/* 58695 */ {(13<<2)|2,{87,108,0}}, +/* 58696 */ {(13<<2)|2,{87,109,0}}, +/* 58697 */ {(13<<2)|2,{87,109,0}}, +/* 58698 */ {(13<<2)|2,{87,109,0}}, +/* 58699 */ {(13<<2)|2,{87,109,0}}, +/* 58700 */ {(13<<2)|2,{87,109,0}}, +/* 58701 */ {(13<<2)|2,{87,109,0}}, +/* 58702 */ {(13<<2)|2,{87,109,0}}, +/* 58703 */ {(13<<2)|2,{87,109,0}}, +/* 58704 */ {(13<<2)|2,{87,110,0}}, +/* 58705 */ {(13<<2)|2,{87,110,0}}, +/* 58706 */ {(13<<2)|2,{87,110,0}}, +/* 58707 */ {(13<<2)|2,{87,110,0}}, +/* 58708 */ {(13<<2)|2,{87,110,0}}, +/* 58709 */ {(13<<2)|2,{87,110,0}}, +/* 58710 */ {(13<<2)|2,{87,110,0}}, +/* 58711 */ {(13<<2)|2,{87,110,0}}, +/* 58712 */ {(13<<2)|2,{87,112,0}}, +/* 58713 */ {(13<<2)|2,{87,112,0}}, +/* 58714 */ {(13<<2)|2,{87,112,0}}, +/* 58715 */ {(13<<2)|2,{87,112,0}}, +/* 58716 */ {(13<<2)|2,{87,112,0}}, +/* 58717 */ {(13<<2)|2,{87,112,0}}, +/* 58718 */ {(13<<2)|2,{87,112,0}}, +/* 58719 */ {(13<<2)|2,{87,112,0}}, +/* 58720 */ {(13<<2)|2,{87,114,0}}, +/* 58721 */ {(13<<2)|2,{87,114,0}}, +/* 58722 */ {(13<<2)|2,{87,114,0}}, +/* 58723 */ {(13<<2)|2,{87,114,0}}, +/* 58724 */ {(13<<2)|2,{87,114,0}}, +/* 58725 */ {(13<<2)|2,{87,114,0}}, +/* 58726 */ {(13<<2)|2,{87,114,0}}, +/* 58727 */ {(13<<2)|2,{87,114,0}}, +/* 58728 */ {(13<<2)|2,{87,117,0}}, +/* 58729 */ {(13<<2)|2,{87,117,0}}, +/* 58730 */ {(13<<2)|2,{87,117,0}}, +/* 58731 */ {(13<<2)|2,{87,117,0}}, +/* 58732 */ {(13<<2)|2,{87,117,0}}, +/* 58733 */ {(13<<2)|2,{87,117,0}}, +/* 58734 */ {(13<<2)|2,{87,117,0}}, +/* 58735 */ {(13<<2)|2,{87,117,0}}, +/* 58736 */ {(14<<2)|2,{87,58,0}}, +/* 58737 */ {(14<<2)|2,{87,58,0}}, +/* 58738 */ {(14<<2)|2,{87,58,0}}, +/* 58739 */ {(14<<2)|2,{87,58,0}}, +/* 58740 */ {(14<<2)|2,{87,66,0}}, +/* 58741 */ {(14<<2)|2,{87,66,0}}, +/* 58742 */ {(14<<2)|2,{87,66,0}}, +/* 58743 */ {(14<<2)|2,{87,66,0}}, +/* 58744 */ {(14<<2)|2,{87,67,0}}, +/* 58745 */ {(14<<2)|2,{87,67,0}}, +/* 58746 */ {(14<<2)|2,{87,67,0}}, +/* 58747 */ {(14<<2)|2,{87,67,0}}, +/* 58748 */ {(14<<2)|2,{87,68,0}}, +/* 58749 */ {(14<<2)|2,{87,68,0}}, +/* 58750 */ {(14<<2)|2,{87,68,0}}, +/* 58751 */ {(14<<2)|2,{87,68,0}}, +/* 58752 */ {(14<<2)|2,{87,69,0}}, +/* 58753 */ {(14<<2)|2,{87,69,0}}, +/* 58754 */ {(14<<2)|2,{87,69,0}}, +/* 58755 */ {(14<<2)|2,{87,69,0}}, +/* 58756 */ {(14<<2)|2,{87,70,0}}, +/* 58757 */ {(14<<2)|2,{87,70,0}}, +/* 58758 */ {(14<<2)|2,{87,70,0}}, +/* 58759 */ {(14<<2)|2,{87,70,0}}, +/* 58760 */ {(14<<2)|2,{87,71,0}}, +/* 58761 */ {(14<<2)|2,{87,71,0}}, +/* 58762 */ {(14<<2)|2,{87,71,0}}, +/* 58763 */ {(14<<2)|2,{87,71,0}}, +/* 58764 */ {(14<<2)|2,{87,72,0}}, +/* 58765 */ {(14<<2)|2,{87,72,0}}, +/* 58766 */ {(14<<2)|2,{87,72,0}}, +/* 58767 */ {(14<<2)|2,{87,72,0}}, +/* 58768 */ {(14<<2)|2,{87,73,0}}, +/* 58769 */ {(14<<2)|2,{87,73,0}}, +/* 58770 */ {(14<<2)|2,{87,73,0}}, +/* 58771 */ {(14<<2)|2,{87,73,0}}, +/* 58772 */ {(14<<2)|2,{87,74,0}}, +/* 58773 */ {(14<<2)|2,{87,74,0}}, +/* 58774 */ {(14<<2)|2,{87,74,0}}, +/* 58775 */ {(14<<2)|2,{87,74,0}}, +/* 58776 */ {(14<<2)|2,{87,75,0}}, +/* 58777 */ {(14<<2)|2,{87,75,0}}, +/* 58778 */ {(14<<2)|2,{87,75,0}}, +/* 58779 */ {(14<<2)|2,{87,75,0}}, +/* 58780 */ {(14<<2)|2,{87,76,0}}, +/* 58781 */ {(14<<2)|2,{87,76,0}}, +/* 58782 */ {(14<<2)|2,{87,76,0}}, +/* 58783 */ {(14<<2)|2,{87,76,0}}, +/* 58784 */ {(14<<2)|2,{87,77,0}}, +/* 58785 */ {(14<<2)|2,{87,77,0}}, +/* 58786 */ {(14<<2)|2,{87,77,0}}, +/* 58787 */ {(14<<2)|2,{87,77,0}}, +/* 58788 */ {(14<<2)|2,{87,78,0}}, +/* 58789 */ {(14<<2)|2,{87,78,0}}, +/* 58790 */ {(14<<2)|2,{87,78,0}}, +/* 58791 */ {(14<<2)|2,{87,78,0}}, +/* 58792 */ {(14<<2)|2,{87,79,0}}, +/* 58793 */ {(14<<2)|2,{87,79,0}}, +/* 58794 */ {(14<<2)|2,{87,79,0}}, +/* 58795 */ {(14<<2)|2,{87,79,0}}, +/* 58796 */ {(14<<2)|2,{87,80,0}}, +/* 58797 */ {(14<<2)|2,{87,80,0}}, +/* 58798 */ {(14<<2)|2,{87,80,0}}, +/* 58799 */ {(14<<2)|2,{87,80,0}}, +/* 58800 */ {(14<<2)|2,{87,81,0}}, +/* 58801 */ {(14<<2)|2,{87,81,0}}, +/* 58802 */ {(14<<2)|2,{87,81,0}}, +/* 58803 */ {(14<<2)|2,{87,81,0}}, +/* 58804 */ {(14<<2)|2,{87,82,0}}, +/* 58805 */ {(14<<2)|2,{87,82,0}}, +/* 58806 */ {(14<<2)|2,{87,82,0}}, +/* 58807 */ {(14<<2)|2,{87,82,0}}, +/* 58808 */ {(14<<2)|2,{87,83,0}}, +/* 58809 */ {(14<<2)|2,{87,83,0}}, +/* 58810 */ {(14<<2)|2,{87,83,0}}, +/* 58811 */ {(14<<2)|2,{87,83,0}}, +/* 58812 */ {(14<<2)|2,{87,84,0}}, +/* 58813 */ {(14<<2)|2,{87,84,0}}, +/* 58814 */ {(14<<2)|2,{87,84,0}}, +/* 58815 */ {(14<<2)|2,{87,84,0}}, +/* 58816 */ {(14<<2)|2,{87,85,0}}, +/* 58817 */ {(14<<2)|2,{87,85,0}}, +/* 58818 */ {(14<<2)|2,{87,85,0}}, +/* 58819 */ {(14<<2)|2,{87,85,0}}, +/* 58820 */ {(14<<2)|2,{87,86,0}}, +/* 58821 */ {(14<<2)|2,{87,86,0}}, +/* 58822 */ {(14<<2)|2,{87,86,0}}, +/* 58823 */ {(14<<2)|2,{87,86,0}}, +/* 58824 */ {(14<<2)|2,{87,87,0}}, +/* 58825 */ {(14<<2)|2,{87,87,0}}, +/* 58826 */ {(14<<2)|2,{87,87,0}}, +/* 58827 */ {(14<<2)|2,{87,87,0}}, +/* 58828 */ {(14<<2)|2,{87,89,0}}, +/* 58829 */ {(14<<2)|2,{87,89,0}}, +/* 58830 */ {(14<<2)|2,{87,89,0}}, +/* 58831 */ {(14<<2)|2,{87,89,0}}, +/* 58832 */ {(14<<2)|2,{87,106,0}}, +/* 58833 */ {(14<<2)|2,{87,106,0}}, +/* 58834 */ {(14<<2)|2,{87,106,0}}, +/* 58835 */ {(14<<2)|2,{87,106,0}}, +/* 58836 */ {(14<<2)|2,{87,107,0}}, +/* 58837 */ {(14<<2)|2,{87,107,0}}, +/* 58838 */ {(14<<2)|2,{87,107,0}}, +/* 58839 */ {(14<<2)|2,{87,107,0}}, +/* 58840 */ {(14<<2)|2,{87,113,0}}, +/* 58841 */ {(14<<2)|2,{87,113,0}}, +/* 58842 */ {(14<<2)|2,{87,113,0}}, +/* 58843 */ {(14<<2)|2,{87,113,0}}, +/* 58844 */ {(14<<2)|2,{87,118,0}}, +/* 58845 */ {(14<<2)|2,{87,118,0}}, +/* 58846 */ {(14<<2)|2,{87,118,0}}, +/* 58847 */ {(14<<2)|2,{87,118,0}}, +/* 58848 */ {(14<<2)|2,{87,119,0}}, +/* 58849 */ {(14<<2)|2,{87,119,0}}, +/* 58850 */ {(14<<2)|2,{87,119,0}}, +/* 58851 */ {(14<<2)|2,{87,119,0}}, +/* 58852 */ {(14<<2)|2,{87,120,0}}, +/* 58853 */ {(14<<2)|2,{87,120,0}}, +/* 58854 */ {(14<<2)|2,{87,120,0}}, +/* 58855 */ {(14<<2)|2,{87,120,0}}, +/* 58856 */ {(14<<2)|2,{87,121,0}}, +/* 58857 */ {(14<<2)|2,{87,121,0}}, +/* 58858 */ {(14<<2)|2,{87,121,0}}, +/* 58859 */ {(14<<2)|2,{87,121,0}}, +/* 58860 */ {(14<<2)|2,{87,122,0}}, +/* 58861 */ {(14<<2)|2,{87,122,0}}, +/* 58862 */ {(14<<2)|2,{87,122,0}}, +/* 58863 */ {(14<<2)|2,{87,122,0}}, +/* 58864 */ {(15<<2)|2,{87,38,0}}, +/* 58865 */ {(15<<2)|2,{87,38,0}}, +/* 58866 */ {(15<<2)|2,{87,42,0}}, +/* 58867 */ {(15<<2)|2,{87,42,0}}, +/* 58868 */ {(15<<2)|2,{87,44,0}}, +/* 58869 */ {(15<<2)|2,{87,44,0}}, +/* 58870 */ {(15<<2)|2,{87,59,0}}, +/* 58871 */ {(15<<2)|2,{87,59,0}}, +/* 58872 */ {(15<<2)|2,{87,88,0}}, +/* 58873 */ {(15<<2)|2,{87,88,0}}, +/* 58874 */ {(15<<2)|2,{87,90,0}}, +/* 58875 */ {(15<<2)|2,{87,90,0}}, +/* 58876 */ {(7<<2)|1,{87,0,0}}, +/* 58877 */ {(7<<2)|1,{87,0,0}}, +/* 58878 */ {(7<<2)|1,{87,0,0}}, +/* 58879 */ {(7<<2)|1,{87,0,0}}, +/* 58880 */ {(12<<2)|2,{89,48,0}}, +/* 58881 */ {(12<<2)|2,{89,48,0}}, +/* 58882 */ {(12<<2)|2,{89,48,0}}, +/* 58883 */ {(12<<2)|2,{89,48,0}}, +/* 58884 */ {(12<<2)|2,{89,48,0}}, +/* 58885 */ {(12<<2)|2,{89,48,0}}, +/* 58886 */ {(12<<2)|2,{89,48,0}}, +/* 58887 */ {(12<<2)|2,{89,48,0}}, +/* 58888 */ {(12<<2)|2,{89,48,0}}, +/* 58889 */ {(12<<2)|2,{89,48,0}}, +/* 58890 */ {(12<<2)|2,{89,48,0}}, +/* 58891 */ {(12<<2)|2,{89,48,0}}, +/* 58892 */ {(12<<2)|2,{89,48,0}}, +/* 58893 */ {(12<<2)|2,{89,48,0}}, +/* 58894 */ {(12<<2)|2,{89,48,0}}, +/* 58895 */ {(12<<2)|2,{89,48,0}}, +/* 58896 */ {(12<<2)|2,{89,49,0}}, +/* 58897 */ {(12<<2)|2,{89,49,0}}, +/* 58898 */ {(12<<2)|2,{89,49,0}}, +/* 58899 */ {(12<<2)|2,{89,49,0}}, +/* 58900 */ {(12<<2)|2,{89,49,0}}, +/* 58901 */ {(12<<2)|2,{89,49,0}}, +/* 58902 */ {(12<<2)|2,{89,49,0}}, +/* 58903 */ {(12<<2)|2,{89,49,0}}, +/* 58904 */ {(12<<2)|2,{89,49,0}}, +/* 58905 */ {(12<<2)|2,{89,49,0}}, +/* 58906 */ {(12<<2)|2,{89,49,0}}, +/* 58907 */ {(12<<2)|2,{89,49,0}}, +/* 58908 */ {(12<<2)|2,{89,49,0}}, +/* 58909 */ {(12<<2)|2,{89,49,0}}, +/* 58910 */ {(12<<2)|2,{89,49,0}}, +/* 58911 */ {(12<<2)|2,{89,49,0}}, +/* 58912 */ {(12<<2)|2,{89,50,0}}, +/* 58913 */ {(12<<2)|2,{89,50,0}}, +/* 58914 */ {(12<<2)|2,{89,50,0}}, +/* 58915 */ {(12<<2)|2,{89,50,0}}, +/* 58916 */ {(12<<2)|2,{89,50,0}}, +/* 58917 */ {(12<<2)|2,{89,50,0}}, +/* 58918 */ {(12<<2)|2,{89,50,0}}, +/* 58919 */ {(12<<2)|2,{89,50,0}}, +/* 58920 */ {(12<<2)|2,{89,50,0}}, +/* 58921 */ {(12<<2)|2,{89,50,0}}, +/* 58922 */ {(12<<2)|2,{89,50,0}}, +/* 58923 */ {(12<<2)|2,{89,50,0}}, +/* 58924 */ {(12<<2)|2,{89,50,0}}, +/* 58925 */ {(12<<2)|2,{89,50,0}}, +/* 58926 */ {(12<<2)|2,{89,50,0}}, +/* 58927 */ {(12<<2)|2,{89,50,0}}, +/* 58928 */ {(12<<2)|2,{89,97,0}}, +/* 58929 */ {(12<<2)|2,{89,97,0}}, +/* 58930 */ {(12<<2)|2,{89,97,0}}, +/* 58931 */ {(12<<2)|2,{89,97,0}}, +/* 58932 */ {(12<<2)|2,{89,97,0}}, +/* 58933 */ {(12<<2)|2,{89,97,0}}, +/* 58934 */ {(12<<2)|2,{89,97,0}}, +/* 58935 */ {(12<<2)|2,{89,97,0}}, +/* 58936 */ {(12<<2)|2,{89,97,0}}, +/* 58937 */ {(12<<2)|2,{89,97,0}}, +/* 58938 */ {(12<<2)|2,{89,97,0}}, +/* 58939 */ {(12<<2)|2,{89,97,0}}, +/* 58940 */ {(12<<2)|2,{89,97,0}}, +/* 58941 */ {(12<<2)|2,{89,97,0}}, +/* 58942 */ {(12<<2)|2,{89,97,0}}, +/* 58943 */ {(12<<2)|2,{89,97,0}}, +/* 58944 */ {(12<<2)|2,{89,99,0}}, +/* 58945 */ {(12<<2)|2,{89,99,0}}, +/* 58946 */ {(12<<2)|2,{89,99,0}}, +/* 58947 */ {(12<<2)|2,{89,99,0}}, +/* 58948 */ {(12<<2)|2,{89,99,0}}, +/* 58949 */ {(12<<2)|2,{89,99,0}}, +/* 58950 */ {(12<<2)|2,{89,99,0}}, +/* 58951 */ {(12<<2)|2,{89,99,0}}, +/* 58952 */ {(12<<2)|2,{89,99,0}}, +/* 58953 */ {(12<<2)|2,{89,99,0}}, +/* 58954 */ {(12<<2)|2,{89,99,0}}, +/* 58955 */ {(12<<2)|2,{89,99,0}}, +/* 58956 */ {(12<<2)|2,{89,99,0}}, +/* 58957 */ {(12<<2)|2,{89,99,0}}, +/* 58958 */ {(12<<2)|2,{89,99,0}}, +/* 58959 */ {(12<<2)|2,{89,99,0}}, +/* 58960 */ {(12<<2)|2,{89,101,0}}, +/* 58961 */ {(12<<2)|2,{89,101,0}}, +/* 58962 */ {(12<<2)|2,{89,101,0}}, +/* 58963 */ {(12<<2)|2,{89,101,0}}, +/* 58964 */ {(12<<2)|2,{89,101,0}}, +/* 58965 */ {(12<<2)|2,{89,101,0}}, +/* 58966 */ {(12<<2)|2,{89,101,0}}, +/* 58967 */ {(12<<2)|2,{89,101,0}}, +/* 58968 */ {(12<<2)|2,{89,101,0}}, +/* 58969 */ {(12<<2)|2,{89,101,0}}, +/* 58970 */ {(12<<2)|2,{89,101,0}}, +/* 58971 */ {(12<<2)|2,{89,101,0}}, +/* 58972 */ {(12<<2)|2,{89,101,0}}, +/* 58973 */ {(12<<2)|2,{89,101,0}}, +/* 58974 */ {(12<<2)|2,{89,101,0}}, +/* 58975 */ {(12<<2)|2,{89,101,0}}, +/* 58976 */ {(12<<2)|2,{89,105,0}}, +/* 58977 */ {(12<<2)|2,{89,105,0}}, +/* 58978 */ {(12<<2)|2,{89,105,0}}, +/* 58979 */ {(12<<2)|2,{89,105,0}}, +/* 58980 */ {(12<<2)|2,{89,105,0}}, +/* 58981 */ {(12<<2)|2,{89,105,0}}, +/* 58982 */ {(12<<2)|2,{89,105,0}}, +/* 58983 */ {(12<<2)|2,{89,105,0}}, +/* 58984 */ {(12<<2)|2,{89,105,0}}, +/* 58985 */ {(12<<2)|2,{89,105,0}}, +/* 58986 */ {(12<<2)|2,{89,105,0}}, +/* 58987 */ {(12<<2)|2,{89,105,0}}, +/* 58988 */ {(12<<2)|2,{89,105,0}}, +/* 58989 */ {(12<<2)|2,{89,105,0}}, +/* 58990 */ {(12<<2)|2,{89,105,0}}, +/* 58991 */ {(12<<2)|2,{89,105,0}}, +/* 58992 */ {(12<<2)|2,{89,111,0}}, +/* 58993 */ {(12<<2)|2,{89,111,0}}, +/* 58994 */ {(12<<2)|2,{89,111,0}}, +/* 58995 */ {(12<<2)|2,{89,111,0}}, +/* 58996 */ {(12<<2)|2,{89,111,0}}, +/* 58997 */ {(12<<2)|2,{89,111,0}}, +/* 58998 */ {(12<<2)|2,{89,111,0}}, +/* 58999 */ {(12<<2)|2,{89,111,0}}, +/* 59000 */ {(12<<2)|2,{89,111,0}}, +/* 59001 */ {(12<<2)|2,{89,111,0}}, +/* 59002 */ {(12<<2)|2,{89,111,0}}, +/* 59003 */ {(12<<2)|2,{89,111,0}}, +/* 59004 */ {(12<<2)|2,{89,111,0}}, +/* 59005 */ {(12<<2)|2,{89,111,0}}, +/* 59006 */ {(12<<2)|2,{89,111,0}}, +/* 59007 */ {(12<<2)|2,{89,111,0}}, +/* 59008 */ {(12<<2)|2,{89,115,0}}, +/* 59009 */ {(12<<2)|2,{89,115,0}}, +/* 59010 */ {(12<<2)|2,{89,115,0}}, +/* 59011 */ {(12<<2)|2,{89,115,0}}, +/* 59012 */ {(12<<2)|2,{89,115,0}}, +/* 59013 */ {(12<<2)|2,{89,115,0}}, +/* 59014 */ {(12<<2)|2,{89,115,0}}, +/* 59015 */ {(12<<2)|2,{89,115,0}}, +/* 59016 */ {(12<<2)|2,{89,115,0}}, +/* 59017 */ {(12<<2)|2,{89,115,0}}, +/* 59018 */ {(12<<2)|2,{89,115,0}}, +/* 59019 */ {(12<<2)|2,{89,115,0}}, +/* 59020 */ {(12<<2)|2,{89,115,0}}, +/* 59021 */ {(12<<2)|2,{89,115,0}}, +/* 59022 */ {(12<<2)|2,{89,115,0}}, +/* 59023 */ {(12<<2)|2,{89,115,0}}, +/* 59024 */ {(12<<2)|2,{89,116,0}}, +/* 59025 */ {(12<<2)|2,{89,116,0}}, +/* 59026 */ {(12<<2)|2,{89,116,0}}, +/* 59027 */ {(12<<2)|2,{89,116,0}}, +/* 59028 */ {(12<<2)|2,{89,116,0}}, +/* 59029 */ {(12<<2)|2,{89,116,0}}, +/* 59030 */ {(12<<2)|2,{89,116,0}}, +/* 59031 */ {(12<<2)|2,{89,116,0}}, +/* 59032 */ {(12<<2)|2,{89,116,0}}, +/* 59033 */ {(12<<2)|2,{89,116,0}}, +/* 59034 */ {(12<<2)|2,{89,116,0}}, +/* 59035 */ {(12<<2)|2,{89,116,0}}, +/* 59036 */ {(12<<2)|2,{89,116,0}}, +/* 59037 */ {(12<<2)|2,{89,116,0}}, +/* 59038 */ {(12<<2)|2,{89,116,0}}, +/* 59039 */ {(12<<2)|2,{89,116,0}}, +/* 59040 */ {(13<<2)|2,{89,32,0}}, +/* 59041 */ {(13<<2)|2,{89,32,0}}, +/* 59042 */ {(13<<2)|2,{89,32,0}}, +/* 59043 */ {(13<<2)|2,{89,32,0}}, +/* 59044 */ {(13<<2)|2,{89,32,0}}, +/* 59045 */ {(13<<2)|2,{89,32,0}}, +/* 59046 */ {(13<<2)|2,{89,32,0}}, +/* 59047 */ {(13<<2)|2,{89,32,0}}, +/* 59048 */ {(13<<2)|2,{89,37,0}}, +/* 59049 */ {(13<<2)|2,{89,37,0}}, +/* 59050 */ {(13<<2)|2,{89,37,0}}, +/* 59051 */ {(13<<2)|2,{89,37,0}}, +/* 59052 */ {(13<<2)|2,{89,37,0}}, +/* 59053 */ {(13<<2)|2,{89,37,0}}, +/* 59054 */ {(13<<2)|2,{89,37,0}}, +/* 59055 */ {(13<<2)|2,{89,37,0}}, +/* 59056 */ {(13<<2)|2,{89,45,0}}, +/* 59057 */ {(13<<2)|2,{89,45,0}}, +/* 59058 */ {(13<<2)|2,{89,45,0}}, +/* 59059 */ {(13<<2)|2,{89,45,0}}, +/* 59060 */ {(13<<2)|2,{89,45,0}}, +/* 59061 */ {(13<<2)|2,{89,45,0}}, +/* 59062 */ {(13<<2)|2,{89,45,0}}, +/* 59063 */ {(13<<2)|2,{89,45,0}}, +/* 59064 */ {(13<<2)|2,{89,46,0}}, +/* 59065 */ {(13<<2)|2,{89,46,0}}, +/* 59066 */ {(13<<2)|2,{89,46,0}}, +/* 59067 */ {(13<<2)|2,{89,46,0}}, +/* 59068 */ {(13<<2)|2,{89,46,0}}, +/* 59069 */ {(13<<2)|2,{89,46,0}}, +/* 59070 */ {(13<<2)|2,{89,46,0}}, +/* 59071 */ {(13<<2)|2,{89,46,0}}, +/* 59072 */ {(13<<2)|2,{89,47,0}}, +/* 59073 */ {(13<<2)|2,{89,47,0}}, +/* 59074 */ {(13<<2)|2,{89,47,0}}, +/* 59075 */ {(13<<2)|2,{89,47,0}}, +/* 59076 */ {(13<<2)|2,{89,47,0}}, +/* 59077 */ {(13<<2)|2,{89,47,0}}, +/* 59078 */ {(13<<2)|2,{89,47,0}}, +/* 59079 */ {(13<<2)|2,{89,47,0}}, +/* 59080 */ {(13<<2)|2,{89,51,0}}, +/* 59081 */ {(13<<2)|2,{89,51,0}}, +/* 59082 */ {(13<<2)|2,{89,51,0}}, +/* 59083 */ {(13<<2)|2,{89,51,0}}, +/* 59084 */ {(13<<2)|2,{89,51,0}}, +/* 59085 */ {(13<<2)|2,{89,51,0}}, +/* 59086 */ {(13<<2)|2,{89,51,0}}, +/* 59087 */ {(13<<2)|2,{89,51,0}}, +/* 59088 */ {(13<<2)|2,{89,52,0}}, +/* 59089 */ {(13<<2)|2,{89,52,0}}, +/* 59090 */ {(13<<2)|2,{89,52,0}}, +/* 59091 */ {(13<<2)|2,{89,52,0}}, +/* 59092 */ {(13<<2)|2,{89,52,0}}, +/* 59093 */ {(13<<2)|2,{89,52,0}}, +/* 59094 */ {(13<<2)|2,{89,52,0}}, +/* 59095 */ {(13<<2)|2,{89,52,0}}, +/* 59096 */ {(13<<2)|2,{89,53,0}}, +/* 59097 */ {(13<<2)|2,{89,53,0}}, +/* 59098 */ {(13<<2)|2,{89,53,0}}, +/* 59099 */ {(13<<2)|2,{89,53,0}}, +/* 59100 */ {(13<<2)|2,{89,53,0}}, +/* 59101 */ {(13<<2)|2,{89,53,0}}, +/* 59102 */ {(13<<2)|2,{89,53,0}}, +/* 59103 */ {(13<<2)|2,{89,53,0}}, +/* 59104 */ {(13<<2)|2,{89,54,0}}, +/* 59105 */ {(13<<2)|2,{89,54,0}}, +/* 59106 */ {(13<<2)|2,{89,54,0}}, +/* 59107 */ {(13<<2)|2,{89,54,0}}, +/* 59108 */ {(13<<2)|2,{89,54,0}}, +/* 59109 */ {(13<<2)|2,{89,54,0}}, +/* 59110 */ {(13<<2)|2,{89,54,0}}, +/* 59111 */ {(13<<2)|2,{89,54,0}}, +/* 59112 */ {(13<<2)|2,{89,55,0}}, +/* 59113 */ {(13<<2)|2,{89,55,0}}, +/* 59114 */ {(13<<2)|2,{89,55,0}}, +/* 59115 */ {(13<<2)|2,{89,55,0}}, +/* 59116 */ {(13<<2)|2,{89,55,0}}, +/* 59117 */ {(13<<2)|2,{89,55,0}}, +/* 59118 */ {(13<<2)|2,{89,55,0}}, +/* 59119 */ {(13<<2)|2,{89,55,0}}, +/* 59120 */ {(13<<2)|2,{89,56,0}}, +/* 59121 */ {(13<<2)|2,{89,56,0}}, +/* 59122 */ {(13<<2)|2,{89,56,0}}, +/* 59123 */ {(13<<2)|2,{89,56,0}}, +/* 59124 */ {(13<<2)|2,{89,56,0}}, +/* 59125 */ {(13<<2)|2,{89,56,0}}, +/* 59126 */ {(13<<2)|2,{89,56,0}}, +/* 59127 */ {(13<<2)|2,{89,56,0}}, +/* 59128 */ {(13<<2)|2,{89,57,0}}, +/* 59129 */ {(13<<2)|2,{89,57,0}}, +/* 59130 */ {(13<<2)|2,{89,57,0}}, +/* 59131 */ {(13<<2)|2,{89,57,0}}, +/* 59132 */ {(13<<2)|2,{89,57,0}}, +/* 59133 */ {(13<<2)|2,{89,57,0}}, +/* 59134 */ {(13<<2)|2,{89,57,0}}, +/* 59135 */ {(13<<2)|2,{89,57,0}}, +/* 59136 */ {(13<<2)|2,{89,61,0}}, +/* 59137 */ {(13<<2)|2,{89,61,0}}, +/* 59138 */ {(13<<2)|2,{89,61,0}}, +/* 59139 */ {(13<<2)|2,{89,61,0}}, +/* 59140 */ {(13<<2)|2,{89,61,0}}, +/* 59141 */ {(13<<2)|2,{89,61,0}}, +/* 59142 */ {(13<<2)|2,{89,61,0}}, +/* 59143 */ {(13<<2)|2,{89,61,0}}, +/* 59144 */ {(13<<2)|2,{89,65,0}}, +/* 59145 */ {(13<<2)|2,{89,65,0}}, +/* 59146 */ {(13<<2)|2,{89,65,0}}, +/* 59147 */ {(13<<2)|2,{89,65,0}}, +/* 59148 */ {(13<<2)|2,{89,65,0}}, +/* 59149 */ {(13<<2)|2,{89,65,0}}, +/* 59150 */ {(13<<2)|2,{89,65,0}}, +/* 59151 */ {(13<<2)|2,{89,65,0}}, +/* 59152 */ {(13<<2)|2,{89,95,0}}, +/* 59153 */ {(13<<2)|2,{89,95,0}}, +/* 59154 */ {(13<<2)|2,{89,95,0}}, +/* 59155 */ {(13<<2)|2,{89,95,0}}, +/* 59156 */ {(13<<2)|2,{89,95,0}}, +/* 59157 */ {(13<<2)|2,{89,95,0}}, +/* 59158 */ {(13<<2)|2,{89,95,0}}, +/* 59159 */ {(13<<2)|2,{89,95,0}}, +/* 59160 */ {(13<<2)|2,{89,98,0}}, +/* 59161 */ {(13<<2)|2,{89,98,0}}, +/* 59162 */ {(13<<2)|2,{89,98,0}}, +/* 59163 */ {(13<<2)|2,{89,98,0}}, +/* 59164 */ {(13<<2)|2,{89,98,0}}, +/* 59165 */ {(13<<2)|2,{89,98,0}}, +/* 59166 */ {(13<<2)|2,{89,98,0}}, +/* 59167 */ {(13<<2)|2,{89,98,0}}, +/* 59168 */ {(13<<2)|2,{89,100,0}}, +/* 59169 */ {(13<<2)|2,{89,100,0}}, +/* 59170 */ {(13<<2)|2,{89,100,0}}, +/* 59171 */ {(13<<2)|2,{89,100,0}}, +/* 59172 */ {(13<<2)|2,{89,100,0}}, +/* 59173 */ {(13<<2)|2,{89,100,0}}, +/* 59174 */ {(13<<2)|2,{89,100,0}}, +/* 59175 */ {(13<<2)|2,{89,100,0}}, +/* 59176 */ {(13<<2)|2,{89,102,0}}, +/* 59177 */ {(13<<2)|2,{89,102,0}}, +/* 59178 */ {(13<<2)|2,{89,102,0}}, +/* 59179 */ {(13<<2)|2,{89,102,0}}, +/* 59180 */ {(13<<2)|2,{89,102,0}}, +/* 59181 */ {(13<<2)|2,{89,102,0}}, +/* 59182 */ {(13<<2)|2,{89,102,0}}, +/* 59183 */ {(13<<2)|2,{89,102,0}}, +/* 59184 */ {(13<<2)|2,{89,103,0}}, +/* 59185 */ {(13<<2)|2,{89,103,0}}, +/* 59186 */ {(13<<2)|2,{89,103,0}}, +/* 59187 */ {(13<<2)|2,{89,103,0}}, +/* 59188 */ {(13<<2)|2,{89,103,0}}, +/* 59189 */ {(13<<2)|2,{89,103,0}}, +/* 59190 */ {(13<<2)|2,{89,103,0}}, +/* 59191 */ {(13<<2)|2,{89,103,0}}, +/* 59192 */ {(13<<2)|2,{89,104,0}}, +/* 59193 */ {(13<<2)|2,{89,104,0}}, +/* 59194 */ {(13<<2)|2,{89,104,0}}, +/* 59195 */ {(13<<2)|2,{89,104,0}}, +/* 59196 */ {(13<<2)|2,{89,104,0}}, +/* 59197 */ {(13<<2)|2,{89,104,0}}, +/* 59198 */ {(13<<2)|2,{89,104,0}}, +/* 59199 */ {(13<<2)|2,{89,104,0}}, +/* 59200 */ {(13<<2)|2,{89,108,0}}, +/* 59201 */ {(13<<2)|2,{89,108,0}}, +/* 59202 */ {(13<<2)|2,{89,108,0}}, +/* 59203 */ {(13<<2)|2,{89,108,0}}, +/* 59204 */ {(13<<2)|2,{89,108,0}}, +/* 59205 */ {(13<<2)|2,{89,108,0}}, +/* 59206 */ {(13<<2)|2,{89,108,0}}, +/* 59207 */ {(13<<2)|2,{89,108,0}}, +/* 59208 */ {(13<<2)|2,{89,109,0}}, +/* 59209 */ {(13<<2)|2,{89,109,0}}, +/* 59210 */ {(13<<2)|2,{89,109,0}}, +/* 59211 */ {(13<<2)|2,{89,109,0}}, +/* 59212 */ {(13<<2)|2,{89,109,0}}, +/* 59213 */ {(13<<2)|2,{89,109,0}}, +/* 59214 */ {(13<<2)|2,{89,109,0}}, +/* 59215 */ {(13<<2)|2,{89,109,0}}, +/* 59216 */ {(13<<2)|2,{89,110,0}}, +/* 59217 */ {(13<<2)|2,{89,110,0}}, +/* 59218 */ {(13<<2)|2,{89,110,0}}, +/* 59219 */ {(13<<2)|2,{89,110,0}}, +/* 59220 */ {(13<<2)|2,{89,110,0}}, +/* 59221 */ {(13<<2)|2,{89,110,0}}, +/* 59222 */ {(13<<2)|2,{89,110,0}}, +/* 59223 */ {(13<<2)|2,{89,110,0}}, +/* 59224 */ {(13<<2)|2,{89,112,0}}, +/* 59225 */ {(13<<2)|2,{89,112,0}}, +/* 59226 */ {(13<<2)|2,{89,112,0}}, +/* 59227 */ {(13<<2)|2,{89,112,0}}, +/* 59228 */ {(13<<2)|2,{89,112,0}}, +/* 59229 */ {(13<<2)|2,{89,112,0}}, +/* 59230 */ {(13<<2)|2,{89,112,0}}, +/* 59231 */ {(13<<2)|2,{89,112,0}}, +/* 59232 */ {(13<<2)|2,{89,114,0}}, +/* 59233 */ {(13<<2)|2,{89,114,0}}, +/* 59234 */ {(13<<2)|2,{89,114,0}}, +/* 59235 */ {(13<<2)|2,{89,114,0}}, +/* 59236 */ {(13<<2)|2,{89,114,0}}, +/* 59237 */ {(13<<2)|2,{89,114,0}}, +/* 59238 */ {(13<<2)|2,{89,114,0}}, +/* 59239 */ {(13<<2)|2,{89,114,0}}, +/* 59240 */ {(13<<2)|2,{89,117,0}}, +/* 59241 */ {(13<<2)|2,{89,117,0}}, +/* 59242 */ {(13<<2)|2,{89,117,0}}, +/* 59243 */ {(13<<2)|2,{89,117,0}}, +/* 59244 */ {(13<<2)|2,{89,117,0}}, +/* 59245 */ {(13<<2)|2,{89,117,0}}, +/* 59246 */ {(13<<2)|2,{89,117,0}}, +/* 59247 */ {(13<<2)|2,{89,117,0}}, +/* 59248 */ {(14<<2)|2,{89,58,0}}, +/* 59249 */ {(14<<2)|2,{89,58,0}}, +/* 59250 */ {(14<<2)|2,{89,58,0}}, +/* 59251 */ {(14<<2)|2,{89,58,0}}, +/* 59252 */ {(14<<2)|2,{89,66,0}}, +/* 59253 */ {(14<<2)|2,{89,66,0}}, +/* 59254 */ {(14<<2)|2,{89,66,0}}, +/* 59255 */ {(14<<2)|2,{89,66,0}}, +/* 59256 */ {(14<<2)|2,{89,67,0}}, +/* 59257 */ {(14<<2)|2,{89,67,0}}, +/* 59258 */ {(14<<2)|2,{89,67,0}}, +/* 59259 */ {(14<<2)|2,{89,67,0}}, +/* 59260 */ {(14<<2)|2,{89,68,0}}, +/* 59261 */ {(14<<2)|2,{89,68,0}}, +/* 59262 */ {(14<<2)|2,{89,68,0}}, +/* 59263 */ {(14<<2)|2,{89,68,0}}, +/* 59264 */ {(14<<2)|2,{89,69,0}}, +/* 59265 */ {(14<<2)|2,{89,69,0}}, +/* 59266 */ {(14<<2)|2,{89,69,0}}, +/* 59267 */ {(14<<2)|2,{89,69,0}}, +/* 59268 */ {(14<<2)|2,{89,70,0}}, +/* 59269 */ {(14<<2)|2,{89,70,0}}, +/* 59270 */ {(14<<2)|2,{89,70,0}}, +/* 59271 */ {(14<<2)|2,{89,70,0}}, +/* 59272 */ {(14<<2)|2,{89,71,0}}, +/* 59273 */ {(14<<2)|2,{89,71,0}}, +/* 59274 */ {(14<<2)|2,{89,71,0}}, +/* 59275 */ {(14<<2)|2,{89,71,0}}, +/* 59276 */ {(14<<2)|2,{89,72,0}}, +/* 59277 */ {(14<<2)|2,{89,72,0}}, +/* 59278 */ {(14<<2)|2,{89,72,0}}, +/* 59279 */ {(14<<2)|2,{89,72,0}}, +/* 59280 */ {(14<<2)|2,{89,73,0}}, +/* 59281 */ {(14<<2)|2,{89,73,0}}, +/* 59282 */ {(14<<2)|2,{89,73,0}}, +/* 59283 */ {(14<<2)|2,{89,73,0}}, +/* 59284 */ {(14<<2)|2,{89,74,0}}, +/* 59285 */ {(14<<2)|2,{89,74,0}}, +/* 59286 */ {(14<<2)|2,{89,74,0}}, +/* 59287 */ {(14<<2)|2,{89,74,0}}, +/* 59288 */ {(14<<2)|2,{89,75,0}}, +/* 59289 */ {(14<<2)|2,{89,75,0}}, +/* 59290 */ {(14<<2)|2,{89,75,0}}, +/* 59291 */ {(14<<2)|2,{89,75,0}}, +/* 59292 */ {(14<<2)|2,{89,76,0}}, +/* 59293 */ {(14<<2)|2,{89,76,0}}, +/* 59294 */ {(14<<2)|2,{89,76,0}}, +/* 59295 */ {(14<<2)|2,{89,76,0}}, +/* 59296 */ {(14<<2)|2,{89,77,0}}, +/* 59297 */ {(14<<2)|2,{89,77,0}}, +/* 59298 */ {(14<<2)|2,{89,77,0}}, +/* 59299 */ {(14<<2)|2,{89,77,0}}, +/* 59300 */ {(14<<2)|2,{89,78,0}}, +/* 59301 */ {(14<<2)|2,{89,78,0}}, +/* 59302 */ {(14<<2)|2,{89,78,0}}, +/* 59303 */ {(14<<2)|2,{89,78,0}}, +/* 59304 */ {(14<<2)|2,{89,79,0}}, +/* 59305 */ {(14<<2)|2,{89,79,0}}, +/* 59306 */ {(14<<2)|2,{89,79,0}}, +/* 59307 */ {(14<<2)|2,{89,79,0}}, +/* 59308 */ {(14<<2)|2,{89,80,0}}, +/* 59309 */ {(14<<2)|2,{89,80,0}}, +/* 59310 */ {(14<<2)|2,{89,80,0}}, +/* 59311 */ {(14<<2)|2,{89,80,0}}, +/* 59312 */ {(14<<2)|2,{89,81,0}}, +/* 59313 */ {(14<<2)|2,{89,81,0}}, +/* 59314 */ {(14<<2)|2,{89,81,0}}, +/* 59315 */ {(14<<2)|2,{89,81,0}}, +/* 59316 */ {(14<<2)|2,{89,82,0}}, +/* 59317 */ {(14<<2)|2,{89,82,0}}, +/* 59318 */ {(14<<2)|2,{89,82,0}}, +/* 59319 */ {(14<<2)|2,{89,82,0}}, +/* 59320 */ {(14<<2)|2,{89,83,0}}, +/* 59321 */ {(14<<2)|2,{89,83,0}}, +/* 59322 */ {(14<<2)|2,{89,83,0}}, +/* 59323 */ {(14<<2)|2,{89,83,0}}, +/* 59324 */ {(14<<2)|2,{89,84,0}}, +/* 59325 */ {(14<<2)|2,{89,84,0}}, +/* 59326 */ {(14<<2)|2,{89,84,0}}, +/* 59327 */ {(14<<2)|2,{89,84,0}}, +/* 59328 */ {(14<<2)|2,{89,85,0}}, +/* 59329 */ {(14<<2)|2,{89,85,0}}, +/* 59330 */ {(14<<2)|2,{89,85,0}}, +/* 59331 */ {(14<<2)|2,{89,85,0}}, +/* 59332 */ {(14<<2)|2,{89,86,0}}, +/* 59333 */ {(14<<2)|2,{89,86,0}}, +/* 59334 */ {(14<<2)|2,{89,86,0}}, +/* 59335 */ {(14<<2)|2,{89,86,0}}, +/* 59336 */ {(14<<2)|2,{89,87,0}}, +/* 59337 */ {(14<<2)|2,{89,87,0}}, +/* 59338 */ {(14<<2)|2,{89,87,0}}, +/* 59339 */ {(14<<2)|2,{89,87,0}}, +/* 59340 */ {(14<<2)|2,{89,89,0}}, +/* 59341 */ {(14<<2)|2,{89,89,0}}, +/* 59342 */ {(14<<2)|2,{89,89,0}}, +/* 59343 */ {(14<<2)|2,{89,89,0}}, +/* 59344 */ {(14<<2)|2,{89,106,0}}, +/* 59345 */ {(14<<2)|2,{89,106,0}}, +/* 59346 */ {(14<<2)|2,{89,106,0}}, +/* 59347 */ {(14<<2)|2,{89,106,0}}, +/* 59348 */ {(14<<2)|2,{89,107,0}}, +/* 59349 */ {(14<<2)|2,{89,107,0}}, +/* 59350 */ {(14<<2)|2,{89,107,0}}, +/* 59351 */ {(14<<2)|2,{89,107,0}}, +/* 59352 */ {(14<<2)|2,{89,113,0}}, +/* 59353 */ {(14<<2)|2,{89,113,0}}, +/* 59354 */ {(14<<2)|2,{89,113,0}}, +/* 59355 */ {(14<<2)|2,{89,113,0}}, +/* 59356 */ {(14<<2)|2,{89,118,0}}, +/* 59357 */ {(14<<2)|2,{89,118,0}}, +/* 59358 */ {(14<<2)|2,{89,118,0}}, +/* 59359 */ {(14<<2)|2,{89,118,0}}, +/* 59360 */ {(14<<2)|2,{89,119,0}}, +/* 59361 */ {(14<<2)|2,{89,119,0}}, +/* 59362 */ {(14<<2)|2,{89,119,0}}, +/* 59363 */ {(14<<2)|2,{89,119,0}}, +/* 59364 */ {(14<<2)|2,{89,120,0}}, +/* 59365 */ {(14<<2)|2,{89,120,0}}, +/* 59366 */ {(14<<2)|2,{89,120,0}}, +/* 59367 */ {(14<<2)|2,{89,120,0}}, +/* 59368 */ {(14<<2)|2,{89,121,0}}, +/* 59369 */ {(14<<2)|2,{89,121,0}}, +/* 59370 */ {(14<<2)|2,{89,121,0}}, +/* 59371 */ {(14<<2)|2,{89,121,0}}, +/* 59372 */ {(14<<2)|2,{89,122,0}}, +/* 59373 */ {(14<<2)|2,{89,122,0}}, +/* 59374 */ {(14<<2)|2,{89,122,0}}, +/* 59375 */ {(14<<2)|2,{89,122,0}}, +/* 59376 */ {(15<<2)|2,{89,38,0}}, +/* 59377 */ {(15<<2)|2,{89,38,0}}, +/* 59378 */ {(15<<2)|2,{89,42,0}}, +/* 59379 */ {(15<<2)|2,{89,42,0}}, +/* 59380 */ {(15<<2)|2,{89,44,0}}, +/* 59381 */ {(15<<2)|2,{89,44,0}}, +/* 59382 */ {(15<<2)|2,{89,59,0}}, +/* 59383 */ {(15<<2)|2,{89,59,0}}, +/* 59384 */ {(15<<2)|2,{89,88,0}}, +/* 59385 */ {(15<<2)|2,{89,88,0}}, +/* 59386 */ {(15<<2)|2,{89,90,0}}, +/* 59387 */ {(15<<2)|2,{89,90,0}}, +/* 59388 */ {(7<<2)|1,{89,0,0}}, +/* 59389 */ {(7<<2)|1,{89,0,0}}, +/* 59390 */ {(7<<2)|1,{89,0,0}}, +/* 59391 */ {(7<<2)|1,{89,0,0}}, +/* 59392 */ {(12<<2)|2,{106,48,0}}, +/* 59393 */ {(12<<2)|2,{106,48,0}}, +/* 59394 */ {(12<<2)|2,{106,48,0}}, +/* 59395 */ {(12<<2)|2,{106,48,0}}, +/* 59396 */ {(12<<2)|2,{106,48,0}}, +/* 59397 */ {(12<<2)|2,{106,48,0}}, +/* 59398 */ {(12<<2)|2,{106,48,0}}, +/* 59399 */ {(12<<2)|2,{106,48,0}}, +/* 59400 */ {(12<<2)|2,{106,48,0}}, +/* 59401 */ {(12<<2)|2,{106,48,0}}, +/* 59402 */ {(12<<2)|2,{106,48,0}}, +/* 59403 */ {(12<<2)|2,{106,48,0}}, +/* 59404 */ {(12<<2)|2,{106,48,0}}, +/* 59405 */ {(12<<2)|2,{106,48,0}}, +/* 59406 */ {(12<<2)|2,{106,48,0}}, +/* 59407 */ {(12<<2)|2,{106,48,0}}, +/* 59408 */ {(12<<2)|2,{106,49,0}}, +/* 59409 */ {(12<<2)|2,{106,49,0}}, +/* 59410 */ {(12<<2)|2,{106,49,0}}, +/* 59411 */ {(12<<2)|2,{106,49,0}}, +/* 59412 */ {(12<<2)|2,{106,49,0}}, +/* 59413 */ {(12<<2)|2,{106,49,0}}, +/* 59414 */ {(12<<2)|2,{106,49,0}}, +/* 59415 */ {(12<<2)|2,{106,49,0}}, +/* 59416 */ {(12<<2)|2,{106,49,0}}, +/* 59417 */ {(12<<2)|2,{106,49,0}}, +/* 59418 */ {(12<<2)|2,{106,49,0}}, +/* 59419 */ {(12<<2)|2,{106,49,0}}, +/* 59420 */ {(12<<2)|2,{106,49,0}}, +/* 59421 */ {(12<<2)|2,{106,49,0}}, +/* 59422 */ {(12<<2)|2,{106,49,0}}, +/* 59423 */ {(12<<2)|2,{106,49,0}}, +/* 59424 */ {(12<<2)|2,{106,50,0}}, +/* 59425 */ {(12<<2)|2,{106,50,0}}, +/* 59426 */ {(12<<2)|2,{106,50,0}}, +/* 59427 */ {(12<<2)|2,{106,50,0}}, +/* 59428 */ {(12<<2)|2,{106,50,0}}, +/* 59429 */ {(12<<2)|2,{106,50,0}}, +/* 59430 */ {(12<<2)|2,{106,50,0}}, +/* 59431 */ {(12<<2)|2,{106,50,0}}, +/* 59432 */ {(12<<2)|2,{106,50,0}}, +/* 59433 */ {(12<<2)|2,{106,50,0}}, +/* 59434 */ {(12<<2)|2,{106,50,0}}, +/* 59435 */ {(12<<2)|2,{106,50,0}}, +/* 59436 */ {(12<<2)|2,{106,50,0}}, +/* 59437 */ {(12<<2)|2,{106,50,0}}, +/* 59438 */ {(12<<2)|2,{106,50,0}}, +/* 59439 */ {(12<<2)|2,{106,50,0}}, +/* 59440 */ {(12<<2)|2,{106,97,0}}, +/* 59441 */ {(12<<2)|2,{106,97,0}}, +/* 59442 */ {(12<<2)|2,{106,97,0}}, +/* 59443 */ {(12<<2)|2,{106,97,0}}, +/* 59444 */ {(12<<2)|2,{106,97,0}}, +/* 59445 */ {(12<<2)|2,{106,97,0}}, +/* 59446 */ {(12<<2)|2,{106,97,0}}, +/* 59447 */ {(12<<2)|2,{106,97,0}}, +/* 59448 */ {(12<<2)|2,{106,97,0}}, +/* 59449 */ {(12<<2)|2,{106,97,0}}, +/* 59450 */ {(12<<2)|2,{106,97,0}}, +/* 59451 */ {(12<<2)|2,{106,97,0}}, +/* 59452 */ {(12<<2)|2,{106,97,0}}, +/* 59453 */ {(12<<2)|2,{106,97,0}}, +/* 59454 */ {(12<<2)|2,{106,97,0}}, +/* 59455 */ {(12<<2)|2,{106,97,0}}, +/* 59456 */ {(12<<2)|2,{106,99,0}}, +/* 59457 */ {(12<<2)|2,{106,99,0}}, +/* 59458 */ {(12<<2)|2,{106,99,0}}, +/* 59459 */ {(12<<2)|2,{106,99,0}}, +/* 59460 */ {(12<<2)|2,{106,99,0}}, +/* 59461 */ {(12<<2)|2,{106,99,0}}, +/* 59462 */ {(12<<2)|2,{106,99,0}}, +/* 59463 */ {(12<<2)|2,{106,99,0}}, +/* 59464 */ {(12<<2)|2,{106,99,0}}, +/* 59465 */ {(12<<2)|2,{106,99,0}}, +/* 59466 */ {(12<<2)|2,{106,99,0}}, +/* 59467 */ {(12<<2)|2,{106,99,0}}, +/* 59468 */ {(12<<2)|2,{106,99,0}}, +/* 59469 */ {(12<<2)|2,{106,99,0}}, +/* 59470 */ {(12<<2)|2,{106,99,0}}, +/* 59471 */ {(12<<2)|2,{106,99,0}}, +/* 59472 */ {(12<<2)|2,{106,101,0}}, +/* 59473 */ {(12<<2)|2,{106,101,0}}, +/* 59474 */ {(12<<2)|2,{106,101,0}}, +/* 59475 */ {(12<<2)|2,{106,101,0}}, +/* 59476 */ {(12<<2)|2,{106,101,0}}, +/* 59477 */ {(12<<2)|2,{106,101,0}}, +/* 59478 */ {(12<<2)|2,{106,101,0}}, +/* 59479 */ {(12<<2)|2,{106,101,0}}, +/* 59480 */ {(12<<2)|2,{106,101,0}}, +/* 59481 */ {(12<<2)|2,{106,101,0}}, +/* 59482 */ {(12<<2)|2,{106,101,0}}, +/* 59483 */ {(12<<2)|2,{106,101,0}}, +/* 59484 */ {(12<<2)|2,{106,101,0}}, +/* 59485 */ {(12<<2)|2,{106,101,0}}, +/* 59486 */ {(12<<2)|2,{106,101,0}}, +/* 59487 */ {(12<<2)|2,{106,101,0}}, +/* 59488 */ {(12<<2)|2,{106,105,0}}, +/* 59489 */ {(12<<2)|2,{106,105,0}}, +/* 59490 */ {(12<<2)|2,{106,105,0}}, +/* 59491 */ {(12<<2)|2,{106,105,0}}, +/* 59492 */ {(12<<2)|2,{106,105,0}}, +/* 59493 */ {(12<<2)|2,{106,105,0}}, +/* 59494 */ {(12<<2)|2,{106,105,0}}, +/* 59495 */ {(12<<2)|2,{106,105,0}}, +/* 59496 */ {(12<<2)|2,{106,105,0}}, +/* 59497 */ {(12<<2)|2,{106,105,0}}, +/* 59498 */ {(12<<2)|2,{106,105,0}}, +/* 59499 */ {(12<<2)|2,{106,105,0}}, +/* 59500 */ {(12<<2)|2,{106,105,0}}, +/* 59501 */ {(12<<2)|2,{106,105,0}}, +/* 59502 */ {(12<<2)|2,{106,105,0}}, +/* 59503 */ {(12<<2)|2,{106,105,0}}, +/* 59504 */ {(12<<2)|2,{106,111,0}}, +/* 59505 */ {(12<<2)|2,{106,111,0}}, +/* 59506 */ {(12<<2)|2,{106,111,0}}, +/* 59507 */ {(12<<2)|2,{106,111,0}}, +/* 59508 */ {(12<<2)|2,{106,111,0}}, +/* 59509 */ {(12<<2)|2,{106,111,0}}, +/* 59510 */ {(12<<2)|2,{106,111,0}}, +/* 59511 */ {(12<<2)|2,{106,111,0}}, +/* 59512 */ {(12<<2)|2,{106,111,0}}, +/* 59513 */ {(12<<2)|2,{106,111,0}}, +/* 59514 */ {(12<<2)|2,{106,111,0}}, +/* 59515 */ {(12<<2)|2,{106,111,0}}, +/* 59516 */ {(12<<2)|2,{106,111,0}}, +/* 59517 */ {(12<<2)|2,{106,111,0}}, +/* 59518 */ {(12<<2)|2,{106,111,0}}, +/* 59519 */ {(12<<2)|2,{106,111,0}}, +/* 59520 */ {(12<<2)|2,{106,115,0}}, +/* 59521 */ {(12<<2)|2,{106,115,0}}, +/* 59522 */ {(12<<2)|2,{106,115,0}}, +/* 59523 */ {(12<<2)|2,{106,115,0}}, +/* 59524 */ {(12<<2)|2,{106,115,0}}, +/* 59525 */ {(12<<2)|2,{106,115,0}}, +/* 59526 */ {(12<<2)|2,{106,115,0}}, +/* 59527 */ {(12<<2)|2,{106,115,0}}, +/* 59528 */ {(12<<2)|2,{106,115,0}}, +/* 59529 */ {(12<<2)|2,{106,115,0}}, +/* 59530 */ {(12<<2)|2,{106,115,0}}, +/* 59531 */ {(12<<2)|2,{106,115,0}}, +/* 59532 */ {(12<<2)|2,{106,115,0}}, +/* 59533 */ {(12<<2)|2,{106,115,0}}, +/* 59534 */ {(12<<2)|2,{106,115,0}}, +/* 59535 */ {(12<<2)|2,{106,115,0}}, +/* 59536 */ {(12<<2)|2,{106,116,0}}, +/* 59537 */ {(12<<2)|2,{106,116,0}}, +/* 59538 */ {(12<<2)|2,{106,116,0}}, +/* 59539 */ {(12<<2)|2,{106,116,0}}, +/* 59540 */ {(12<<2)|2,{106,116,0}}, +/* 59541 */ {(12<<2)|2,{106,116,0}}, +/* 59542 */ {(12<<2)|2,{106,116,0}}, +/* 59543 */ {(12<<2)|2,{106,116,0}}, +/* 59544 */ {(12<<2)|2,{106,116,0}}, +/* 59545 */ {(12<<2)|2,{106,116,0}}, +/* 59546 */ {(12<<2)|2,{106,116,0}}, +/* 59547 */ {(12<<2)|2,{106,116,0}}, +/* 59548 */ {(12<<2)|2,{106,116,0}}, +/* 59549 */ {(12<<2)|2,{106,116,0}}, +/* 59550 */ {(12<<2)|2,{106,116,0}}, +/* 59551 */ {(12<<2)|2,{106,116,0}}, +/* 59552 */ {(13<<2)|2,{106,32,0}}, +/* 59553 */ {(13<<2)|2,{106,32,0}}, +/* 59554 */ {(13<<2)|2,{106,32,0}}, +/* 59555 */ {(13<<2)|2,{106,32,0}}, +/* 59556 */ {(13<<2)|2,{106,32,0}}, +/* 59557 */ {(13<<2)|2,{106,32,0}}, +/* 59558 */ {(13<<2)|2,{106,32,0}}, +/* 59559 */ {(13<<2)|2,{106,32,0}}, +/* 59560 */ {(13<<2)|2,{106,37,0}}, +/* 59561 */ {(13<<2)|2,{106,37,0}}, +/* 59562 */ {(13<<2)|2,{106,37,0}}, +/* 59563 */ {(13<<2)|2,{106,37,0}}, +/* 59564 */ {(13<<2)|2,{106,37,0}}, +/* 59565 */ {(13<<2)|2,{106,37,0}}, +/* 59566 */ {(13<<2)|2,{106,37,0}}, +/* 59567 */ {(13<<2)|2,{106,37,0}}, +/* 59568 */ {(13<<2)|2,{106,45,0}}, +/* 59569 */ {(13<<2)|2,{106,45,0}}, +/* 59570 */ {(13<<2)|2,{106,45,0}}, +/* 59571 */ {(13<<2)|2,{106,45,0}}, +/* 59572 */ {(13<<2)|2,{106,45,0}}, +/* 59573 */ {(13<<2)|2,{106,45,0}}, +/* 59574 */ {(13<<2)|2,{106,45,0}}, +/* 59575 */ {(13<<2)|2,{106,45,0}}, +/* 59576 */ {(13<<2)|2,{106,46,0}}, +/* 59577 */ {(13<<2)|2,{106,46,0}}, +/* 59578 */ {(13<<2)|2,{106,46,0}}, +/* 59579 */ {(13<<2)|2,{106,46,0}}, +/* 59580 */ {(13<<2)|2,{106,46,0}}, +/* 59581 */ {(13<<2)|2,{106,46,0}}, +/* 59582 */ {(13<<2)|2,{106,46,0}}, +/* 59583 */ {(13<<2)|2,{106,46,0}}, +/* 59584 */ {(13<<2)|2,{106,47,0}}, +/* 59585 */ {(13<<2)|2,{106,47,0}}, +/* 59586 */ {(13<<2)|2,{106,47,0}}, +/* 59587 */ {(13<<2)|2,{106,47,0}}, +/* 59588 */ {(13<<2)|2,{106,47,0}}, +/* 59589 */ {(13<<2)|2,{106,47,0}}, +/* 59590 */ {(13<<2)|2,{106,47,0}}, +/* 59591 */ {(13<<2)|2,{106,47,0}}, +/* 59592 */ {(13<<2)|2,{106,51,0}}, +/* 59593 */ {(13<<2)|2,{106,51,0}}, +/* 59594 */ {(13<<2)|2,{106,51,0}}, +/* 59595 */ {(13<<2)|2,{106,51,0}}, +/* 59596 */ {(13<<2)|2,{106,51,0}}, +/* 59597 */ {(13<<2)|2,{106,51,0}}, +/* 59598 */ {(13<<2)|2,{106,51,0}}, +/* 59599 */ {(13<<2)|2,{106,51,0}}, +/* 59600 */ {(13<<2)|2,{106,52,0}}, +/* 59601 */ {(13<<2)|2,{106,52,0}}, +/* 59602 */ {(13<<2)|2,{106,52,0}}, +/* 59603 */ {(13<<2)|2,{106,52,0}}, +/* 59604 */ {(13<<2)|2,{106,52,0}}, +/* 59605 */ {(13<<2)|2,{106,52,0}}, +/* 59606 */ {(13<<2)|2,{106,52,0}}, +/* 59607 */ {(13<<2)|2,{106,52,0}}, +/* 59608 */ {(13<<2)|2,{106,53,0}}, +/* 59609 */ {(13<<2)|2,{106,53,0}}, +/* 59610 */ {(13<<2)|2,{106,53,0}}, +/* 59611 */ {(13<<2)|2,{106,53,0}}, +/* 59612 */ {(13<<2)|2,{106,53,0}}, +/* 59613 */ {(13<<2)|2,{106,53,0}}, +/* 59614 */ {(13<<2)|2,{106,53,0}}, +/* 59615 */ {(13<<2)|2,{106,53,0}}, +/* 59616 */ {(13<<2)|2,{106,54,0}}, +/* 59617 */ {(13<<2)|2,{106,54,0}}, +/* 59618 */ {(13<<2)|2,{106,54,0}}, +/* 59619 */ {(13<<2)|2,{106,54,0}}, +/* 59620 */ {(13<<2)|2,{106,54,0}}, +/* 59621 */ {(13<<2)|2,{106,54,0}}, +/* 59622 */ {(13<<2)|2,{106,54,0}}, +/* 59623 */ {(13<<2)|2,{106,54,0}}, +/* 59624 */ {(13<<2)|2,{106,55,0}}, +/* 59625 */ {(13<<2)|2,{106,55,0}}, +/* 59626 */ {(13<<2)|2,{106,55,0}}, +/* 59627 */ {(13<<2)|2,{106,55,0}}, +/* 59628 */ {(13<<2)|2,{106,55,0}}, +/* 59629 */ {(13<<2)|2,{106,55,0}}, +/* 59630 */ {(13<<2)|2,{106,55,0}}, +/* 59631 */ {(13<<2)|2,{106,55,0}}, +/* 59632 */ {(13<<2)|2,{106,56,0}}, +/* 59633 */ {(13<<2)|2,{106,56,0}}, +/* 59634 */ {(13<<2)|2,{106,56,0}}, +/* 59635 */ {(13<<2)|2,{106,56,0}}, +/* 59636 */ {(13<<2)|2,{106,56,0}}, +/* 59637 */ {(13<<2)|2,{106,56,0}}, +/* 59638 */ {(13<<2)|2,{106,56,0}}, +/* 59639 */ {(13<<2)|2,{106,56,0}}, +/* 59640 */ {(13<<2)|2,{106,57,0}}, +/* 59641 */ {(13<<2)|2,{106,57,0}}, +/* 59642 */ {(13<<2)|2,{106,57,0}}, +/* 59643 */ {(13<<2)|2,{106,57,0}}, +/* 59644 */ {(13<<2)|2,{106,57,0}}, +/* 59645 */ {(13<<2)|2,{106,57,0}}, +/* 59646 */ {(13<<2)|2,{106,57,0}}, +/* 59647 */ {(13<<2)|2,{106,57,0}}, +/* 59648 */ {(13<<2)|2,{106,61,0}}, +/* 59649 */ {(13<<2)|2,{106,61,0}}, +/* 59650 */ {(13<<2)|2,{106,61,0}}, +/* 59651 */ {(13<<2)|2,{106,61,0}}, +/* 59652 */ {(13<<2)|2,{106,61,0}}, +/* 59653 */ {(13<<2)|2,{106,61,0}}, +/* 59654 */ {(13<<2)|2,{106,61,0}}, +/* 59655 */ {(13<<2)|2,{106,61,0}}, +/* 59656 */ {(13<<2)|2,{106,65,0}}, +/* 59657 */ {(13<<2)|2,{106,65,0}}, +/* 59658 */ {(13<<2)|2,{106,65,0}}, +/* 59659 */ {(13<<2)|2,{106,65,0}}, +/* 59660 */ {(13<<2)|2,{106,65,0}}, +/* 59661 */ {(13<<2)|2,{106,65,0}}, +/* 59662 */ {(13<<2)|2,{106,65,0}}, +/* 59663 */ {(13<<2)|2,{106,65,0}}, +/* 59664 */ {(13<<2)|2,{106,95,0}}, +/* 59665 */ {(13<<2)|2,{106,95,0}}, +/* 59666 */ {(13<<2)|2,{106,95,0}}, +/* 59667 */ {(13<<2)|2,{106,95,0}}, +/* 59668 */ {(13<<2)|2,{106,95,0}}, +/* 59669 */ {(13<<2)|2,{106,95,0}}, +/* 59670 */ {(13<<2)|2,{106,95,0}}, +/* 59671 */ {(13<<2)|2,{106,95,0}}, +/* 59672 */ {(13<<2)|2,{106,98,0}}, +/* 59673 */ {(13<<2)|2,{106,98,0}}, +/* 59674 */ {(13<<2)|2,{106,98,0}}, +/* 59675 */ {(13<<2)|2,{106,98,0}}, +/* 59676 */ {(13<<2)|2,{106,98,0}}, +/* 59677 */ {(13<<2)|2,{106,98,0}}, +/* 59678 */ {(13<<2)|2,{106,98,0}}, +/* 59679 */ {(13<<2)|2,{106,98,0}}, +/* 59680 */ {(13<<2)|2,{106,100,0}}, +/* 59681 */ {(13<<2)|2,{106,100,0}}, +/* 59682 */ {(13<<2)|2,{106,100,0}}, +/* 59683 */ {(13<<2)|2,{106,100,0}}, +/* 59684 */ {(13<<2)|2,{106,100,0}}, +/* 59685 */ {(13<<2)|2,{106,100,0}}, +/* 59686 */ {(13<<2)|2,{106,100,0}}, +/* 59687 */ {(13<<2)|2,{106,100,0}}, +/* 59688 */ {(13<<2)|2,{106,102,0}}, +/* 59689 */ {(13<<2)|2,{106,102,0}}, +/* 59690 */ {(13<<2)|2,{106,102,0}}, +/* 59691 */ {(13<<2)|2,{106,102,0}}, +/* 59692 */ {(13<<2)|2,{106,102,0}}, +/* 59693 */ {(13<<2)|2,{106,102,0}}, +/* 59694 */ {(13<<2)|2,{106,102,0}}, +/* 59695 */ {(13<<2)|2,{106,102,0}}, +/* 59696 */ {(13<<2)|2,{106,103,0}}, +/* 59697 */ {(13<<2)|2,{106,103,0}}, +/* 59698 */ {(13<<2)|2,{106,103,0}}, +/* 59699 */ {(13<<2)|2,{106,103,0}}, +/* 59700 */ {(13<<2)|2,{106,103,0}}, +/* 59701 */ {(13<<2)|2,{106,103,0}}, +/* 59702 */ {(13<<2)|2,{106,103,0}}, +/* 59703 */ {(13<<2)|2,{106,103,0}}, +/* 59704 */ {(13<<2)|2,{106,104,0}}, +/* 59705 */ {(13<<2)|2,{106,104,0}}, +/* 59706 */ {(13<<2)|2,{106,104,0}}, +/* 59707 */ {(13<<2)|2,{106,104,0}}, +/* 59708 */ {(13<<2)|2,{106,104,0}}, +/* 59709 */ {(13<<2)|2,{106,104,0}}, +/* 59710 */ {(13<<2)|2,{106,104,0}}, +/* 59711 */ {(13<<2)|2,{106,104,0}}, +/* 59712 */ {(13<<2)|2,{106,108,0}}, +/* 59713 */ {(13<<2)|2,{106,108,0}}, +/* 59714 */ {(13<<2)|2,{106,108,0}}, +/* 59715 */ {(13<<2)|2,{106,108,0}}, +/* 59716 */ {(13<<2)|2,{106,108,0}}, +/* 59717 */ {(13<<2)|2,{106,108,0}}, +/* 59718 */ {(13<<2)|2,{106,108,0}}, +/* 59719 */ {(13<<2)|2,{106,108,0}}, +/* 59720 */ {(13<<2)|2,{106,109,0}}, +/* 59721 */ {(13<<2)|2,{106,109,0}}, +/* 59722 */ {(13<<2)|2,{106,109,0}}, +/* 59723 */ {(13<<2)|2,{106,109,0}}, +/* 59724 */ {(13<<2)|2,{106,109,0}}, +/* 59725 */ {(13<<2)|2,{106,109,0}}, +/* 59726 */ {(13<<2)|2,{106,109,0}}, +/* 59727 */ {(13<<2)|2,{106,109,0}}, +/* 59728 */ {(13<<2)|2,{106,110,0}}, +/* 59729 */ {(13<<2)|2,{106,110,0}}, +/* 59730 */ {(13<<2)|2,{106,110,0}}, +/* 59731 */ {(13<<2)|2,{106,110,0}}, +/* 59732 */ {(13<<2)|2,{106,110,0}}, +/* 59733 */ {(13<<2)|2,{106,110,0}}, +/* 59734 */ {(13<<2)|2,{106,110,0}}, +/* 59735 */ {(13<<2)|2,{106,110,0}}, +/* 59736 */ {(13<<2)|2,{106,112,0}}, +/* 59737 */ {(13<<2)|2,{106,112,0}}, +/* 59738 */ {(13<<2)|2,{106,112,0}}, +/* 59739 */ {(13<<2)|2,{106,112,0}}, +/* 59740 */ {(13<<2)|2,{106,112,0}}, +/* 59741 */ {(13<<2)|2,{106,112,0}}, +/* 59742 */ {(13<<2)|2,{106,112,0}}, +/* 59743 */ {(13<<2)|2,{106,112,0}}, +/* 59744 */ {(13<<2)|2,{106,114,0}}, +/* 59745 */ {(13<<2)|2,{106,114,0}}, +/* 59746 */ {(13<<2)|2,{106,114,0}}, +/* 59747 */ {(13<<2)|2,{106,114,0}}, +/* 59748 */ {(13<<2)|2,{106,114,0}}, +/* 59749 */ {(13<<2)|2,{106,114,0}}, +/* 59750 */ {(13<<2)|2,{106,114,0}}, +/* 59751 */ {(13<<2)|2,{106,114,0}}, +/* 59752 */ {(13<<2)|2,{106,117,0}}, +/* 59753 */ {(13<<2)|2,{106,117,0}}, +/* 59754 */ {(13<<2)|2,{106,117,0}}, +/* 59755 */ {(13<<2)|2,{106,117,0}}, +/* 59756 */ {(13<<2)|2,{106,117,0}}, +/* 59757 */ {(13<<2)|2,{106,117,0}}, +/* 59758 */ {(13<<2)|2,{106,117,0}}, +/* 59759 */ {(13<<2)|2,{106,117,0}}, +/* 59760 */ {(14<<2)|2,{106,58,0}}, +/* 59761 */ {(14<<2)|2,{106,58,0}}, +/* 59762 */ {(14<<2)|2,{106,58,0}}, +/* 59763 */ {(14<<2)|2,{106,58,0}}, +/* 59764 */ {(14<<2)|2,{106,66,0}}, +/* 59765 */ {(14<<2)|2,{106,66,0}}, +/* 59766 */ {(14<<2)|2,{106,66,0}}, +/* 59767 */ {(14<<2)|2,{106,66,0}}, +/* 59768 */ {(14<<2)|2,{106,67,0}}, +/* 59769 */ {(14<<2)|2,{106,67,0}}, +/* 59770 */ {(14<<2)|2,{106,67,0}}, +/* 59771 */ {(14<<2)|2,{106,67,0}}, +/* 59772 */ {(14<<2)|2,{106,68,0}}, +/* 59773 */ {(14<<2)|2,{106,68,0}}, +/* 59774 */ {(14<<2)|2,{106,68,0}}, +/* 59775 */ {(14<<2)|2,{106,68,0}}, +/* 59776 */ {(14<<2)|2,{106,69,0}}, +/* 59777 */ {(14<<2)|2,{106,69,0}}, +/* 59778 */ {(14<<2)|2,{106,69,0}}, +/* 59779 */ {(14<<2)|2,{106,69,0}}, +/* 59780 */ {(14<<2)|2,{106,70,0}}, +/* 59781 */ {(14<<2)|2,{106,70,0}}, +/* 59782 */ {(14<<2)|2,{106,70,0}}, +/* 59783 */ {(14<<2)|2,{106,70,0}}, +/* 59784 */ {(14<<2)|2,{106,71,0}}, +/* 59785 */ {(14<<2)|2,{106,71,0}}, +/* 59786 */ {(14<<2)|2,{106,71,0}}, +/* 59787 */ {(14<<2)|2,{106,71,0}}, +/* 59788 */ {(14<<2)|2,{106,72,0}}, +/* 59789 */ {(14<<2)|2,{106,72,0}}, +/* 59790 */ {(14<<2)|2,{106,72,0}}, +/* 59791 */ {(14<<2)|2,{106,72,0}}, +/* 59792 */ {(14<<2)|2,{106,73,0}}, +/* 59793 */ {(14<<2)|2,{106,73,0}}, +/* 59794 */ {(14<<2)|2,{106,73,0}}, +/* 59795 */ {(14<<2)|2,{106,73,0}}, +/* 59796 */ {(14<<2)|2,{106,74,0}}, +/* 59797 */ {(14<<2)|2,{106,74,0}}, +/* 59798 */ {(14<<2)|2,{106,74,0}}, +/* 59799 */ {(14<<2)|2,{106,74,0}}, +/* 59800 */ {(14<<2)|2,{106,75,0}}, +/* 59801 */ {(14<<2)|2,{106,75,0}}, +/* 59802 */ {(14<<2)|2,{106,75,0}}, +/* 59803 */ {(14<<2)|2,{106,75,0}}, +/* 59804 */ {(14<<2)|2,{106,76,0}}, +/* 59805 */ {(14<<2)|2,{106,76,0}}, +/* 59806 */ {(14<<2)|2,{106,76,0}}, +/* 59807 */ {(14<<2)|2,{106,76,0}}, +/* 59808 */ {(14<<2)|2,{106,77,0}}, +/* 59809 */ {(14<<2)|2,{106,77,0}}, +/* 59810 */ {(14<<2)|2,{106,77,0}}, +/* 59811 */ {(14<<2)|2,{106,77,0}}, +/* 59812 */ {(14<<2)|2,{106,78,0}}, +/* 59813 */ {(14<<2)|2,{106,78,0}}, +/* 59814 */ {(14<<2)|2,{106,78,0}}, +/* 59815 */ {(14<<2)|2,{106,78,0}}, +/* 59816 */ {(14<<2)|2,{106,79,0}}, +/* 59817 */ {(14<<2)|2,{106,79,0}}, +/* 59818 */ {(14<<2)|2,{106,79,0}}, +/* 59819 */ {(14<<2)|2,{106,79,0}}, +/* 59820 */ {(14<<2)|2,{106,80,0}}, +/* 59821 */ {(14<<2)|2,{106,80,0}}, +/* 59822 */ {(14<<2)|2,{106,80,0}}, +/* 59823 */ {(14<<2)|2,{106,80,0}}, +/* 59824 */ {(14<<2)|2,{106,81,0}}, +/* 59825 */ {(14<<2)|2,{106,81,0}}, +/* 59826 */ {(14<<2)|2,{106,81,0}}, +/* 59827 */ {(14<<2)|2,{106,81,0}}, +/* 59828 */ {(14<<2)|2,{106,82,0}}, +/* 59829 */ {(14<<2)|2,{106,82,0}}, +/* 59830 */ {(14<<2)|2,{106,82,0}}, +/* 59831 */ {(14<<2)|2,{106,82,0}}, +/* 59832 */ {(14<<2)|2,{106,83,0}}, +/* 59833 */ {(14<<2)|2,{106,83,0}}, +/* 59834 */ {(14<<2)|2,{106,83,0}}, +/* 59835 */ {(14<<2)|2,{106,83,0}}, +/* 59836 */ {(14<<2)|2,{106,84,0}}, +/* 59837 */ {(14<<2)|2,{106,84,0}}, +/* 59838 */ {(14<<2)|2,{106,84,0}}, +/* 59839 */ {(14<<2)|2,{106,84,0}}, +/* 59840 */ {(14<<2)|2,{106,85,0}}, +/* 59841 */ {(14<<2)|2,{106,85,0}}, +/* 59842 */ {(14<<2)|2,{106,85,0}}, +/* 59843 */ {(14<<2)|2,{106,85,0}}, +/* 59844 */ {(14<<2)|2,{106,86,0}}, +/* 59845 */ {(14<<2)|2,{106,86,0}}, +/* 59846 */ {(14<<2)|2,{106,86,0}}, +/* 59847 */ {(14<<2)|2,{106,86,0}}, +/* 59848 */ {(14<<2)|2,{106,87,0}}, +/* 59849 */ {(14<<2)|2,{106,87,0}}, +/* 59850 */ {(14<<2)|2,{106,87,0}}, +/* 59851 */ {(14<<2)|2,{106,87,0}}, +/* 59852 */ {(14<<2)|2,{106,89,0}}, +/* 59853 */ {(14<<2)|2,{106,89,0}}, +/* 59854 */ {(14<<2)|2,{106,89,0}}, +/* 59855 */ {(14<<2)|2,{106,89,0}}, +/* 59856 */ {(14<<2)|2,{106,106,0}}, +/* 59857 */ {(14<<2)|2,{106,106,0}}, +/* 59858 */ {(14<<2)|2,{106,106,0}}, +/* 59859 */ {(14<<2)|2,{106,106,0}}, +/* 59860 */ {(14<<2)|2,{106,107,0}}, +/* 59861 */ {(14<<2)|2,{106,107,0}}, +/* 59862 */ {(14<<2)|2,{106,107,0}}, +/* 59863 */ {(14<<2)|2,{106,107,0}}, +/* 59864 */ {(14<<2)|2,{106,113,0}}, +/* 59865 */ {(14<<2)|2,{106,113,0}}, +/* 59866 */ {(14<<2)|2,{106,113,0}}, +/* 59867 */ {(14<<2)|2,{106,113,0}}, +/* 59868 */ {(14<<2)|2,{106,118,0}}, +/* 59869 */ {(14<<2)|2,{106,118,0}}, +/* 59870 */ {(14<<2)|2,{106,118,0}}, +/* 59871 */ {(14<<2)|2,{106,118,0}}, +/* 59872 */ {(14<<2)|2,{106,119,0}}, +/* 59873 */ {(14<<2)|2,{106,119,0}}, +/* 59874 */ {(14<<2)|2,{106,119,0}}, +/* 59875 */ {(14<<2)|2,{106,119,0}}, +/* 59876 */ {(14<<2)|2,{106,120,0}}, +/* 59877 */ {(14<<2)|2,{106,120,0}}, +/* 59878 */ {(14<<2)|2,{106,120,0}}, +/* 59879 */ {(14<<2)|2,{106,120,0}}, +/* 59880 */ {(14<<2)|2,{106,121,0}}, +/* 59881 */ {(14<<2)|2,{106,121,0}}, +/* 59882 */ {(14<<2)|2,{106,121,0}}, +/* 59883 */ {(14<<2)|2,{106,121,0}}, +/* 59884 */ {(14<<2)|2,{106,122,0}}, +/* 59885 */ {(14<<2)|2,{106,122,0}}, +/* 59886 */ {(14<<2)|2,{106,122,0}}, +/* 59887 */ {(14<<2)|2,{106,122,0}}, +/* 59888 */ {(15<<2)|2,{106,38,0}}, +/* 59889 */ {(15<<2)|2,{106,38,0}}, +/* 59890 */ {(15<<2)|2,{106,42,0}}, +/* 59891 */ {(15<<2)|2,{106,42,0}}, +/* 59892 */ {(15<<2)|2,{106,44,0}}, +/* 59893 */ {(15<<2)|2,{106,44,0}}, +/* 59894 */ {(15<<2)|2,{106,59,0}}, +/* 59895 */ {(15<<2)|2,{106,59,0}}, +/* 59896 */ {(15<<2)|2,{106,88,0}}, +/* 59897 */ {(15<<2)|2,{106,88,0}}, +/* 59898 */ {(15<<2)|2,{106,90,0}}, +/* 59899 */ {(15<<2)|2,{106,90,0}}, +/* 59900 */ {(7<<2)|1,{106,0,0}}, +/* 59901 */ {(7<<2)|1,{106,0,0}}, +/* 59902 */ {(7<<2)|1,{106,0,0}}, +/* 59903 */ {(7<<2)|1,{106,0,0}}, +/* 59904 */ {(12<<2)|2,{107,48,0}}, +/* 59905 */ {(12<<2)|2,{107,48,0}}, +/* 59906 */ {(12<<2)|2,{107,48,0}}, +/* 59907 */ {(12<<2)|2,{107,48,0}}, +/* 59908 */ {(12<<2)|2,{107,48,0}}, +/* 59909 */ {(12<<2)|2,{107,48,0}}, +/* 59910 */ {(12<<2)|2,{107,48,0}}, +/* 59911 */ {(12<<2)|2,{107,48,0}}, +/* 59912 */ {(12<<2)|2,{107,48,0}}, +/* 59913 */ {(12<<2)|2,{107,48,0}}, +/* 59914 */ {(12<<2)|2,{107,48,0}}, +/* 59915 */ {(12<<2)|2,{107,48,0}}, +/* 59916 */ {(12<<2)|2,{107,48,0}}, +/* 59917 */ {(12<<2)|2,{107,48,0}}, +/* 59918 */ {(12<<2)|2,{107,48,0}}, +/* 59919 */ {(12<<2)|2,{107,48,0}}, +/* 59920 */ {(12<<2)|2,{107,49,0}}, +/* 59921 */ {(12<<2)|2,{107,49,0}}, +/* 59922 */ {(12<<2)|2,{107,49,0}}, +/* 59923 */ {(12<<2)|2,{107,49,0}}, +/* 59924 */ {(12<<2)|2,{107,49,0}}, +/* 59925 */ {(12<<2)|2,{107,49,0}}, +/* 59926 */ {(12<<2)|2,{107,49,0}}, +/* 59927 */ {(12<<2)|2,{107,49,0}}, +/* 59928 */ {(12<<2)|2,{107,49,0}}, +/* 59929 */ {(12<<2)|2,{107,49,0}}, +/* 59930 */ {(12<<2)|2,{107,49,0}}, +/* 59931 */ {(12<<2)|2,{107,49,0}}, +/* 59932 */ {(12<<2)|2,{107,49,0}}, +/* 59933 */ {(12<<2)|2,{107,49,0}}, +/* 59934 */ {(12<<2)|2,{107,49,0}}, +/* 59935 */ {(12<<2)|2,{107,49,0}}, +/* 59936 */ {(12<<2)|2,{107,50,0}}, +/* 59937 */ {(12<<2)|2,{107,50,0}}, +/* 59938 */ {(12<<2)|2,{107,50,0}}, +/* 59939 */ {(12<<2)|2,{107,50,0}}, +/* 59940 */ {(12<<2)|2,{107,50,0}}, +/* 59941 */ {(12<<2)|2,{107,50,0}}, +/* 59942 */ {(12<<2)|2,{107,50,0}}, +/* 59943 */ {(12<<2)|2,{107,50,0}}, +/* 59944 */ {(12<<2)|2,{107,50,0}}, +/* 59945 */ {(12<<2)|2,{107,50,0}}, +/* 59946 */ {(12<<2)|2,{107,50,0}}, +/* 59947 */ {(12<<2)|2,{107,50,0}}, +/* 59948 */ {(12<<2)|2,{107,50,0}}, +/* 59949 */ {(12<<2)|2,{107,50,0}}, +/* 59950 */ {(12<<2)|2,{107,50,0}}, +/* 59951 */ {(12<<2)|2,{107,50,0}}, +/* 59952 */ {(12<<2)|2,{107,97,0}}, +/* 59953 */ {(12<<2)|2,{107,97,0}}, +/* 59954 */ {(12<<2)|2,{107,97,0}}, +/* 59955 */ {(12<<2)|2,{107,97,0}}, +/* 59956 */ {(12<<2)|2,{107,97,0}}, +/* 59957 */ {(12<<2)|2,{107,97,0}}, +/* 59958 */ {(12<<2)|2,{107,97,0}}, +/* 59959 */ {(12<<2)|2,{107,97,0}}, +/* 59960 */ {(12<<2)|2,{107,97,0}}, +/* 59961 */ {(12<<2)|2,{107,97,0}}, +/* 59962 */ {(12<<2)|2,{107,97,0}}, +/* 59963 */ {(12<<2)|2,{107,97,0}}, +/* 59964 */ {(12<<2)|2,{107,97,0}}, +/* 59965 */ {(12<<2)|2,{107,97,0}}, +/* 59966 */ {(12<<2)|2,{107,97,0}}, +/* 59967 */ {(12<<2)|2,{107,97,0}}, +/* 59968 */ {(12<<2)|2,{107,99,0}}, +/* 59969 */ {(12<<2)|2,{107,99,0}}, +/* 59970 */ {(12<<2)|2,{107,99,0}}, +/* 59971 */ {(12<<2)|2,{107,99,0}}, +/* 59972 */ {(12<<2)|2,{107,99,0}}, +/* 59973 */ {(12<<2)|2,{107,99,0}}, +/* 59974 */ {(12<<2)|2,{107,99,0}}, +/* 59975 */ {(12<<2)|2,{107,99,0}}, +/* 59976 */ {(12<<2)|2,{107,99,0}}, +/* 59977 */ {(12<<2)|2,{107,99,0}}, +/* 59978 */ {(12<<2)|2,{107,99,0}}, +/* 59979 */ {(12<<2)|2,{107,99,0}}, +/* 59980 */ {(12<<2)|2,{107,99,0}}, +/* 59981 */ {(12<<2)|2,{107,99,0}}, +/* 59982 */ {(12<<2)|2,{107,99,0}}, +/* 59983 */ {(12<<2)|2,{107,99,0}}, +/* 59984 */ {(12<<2)|2,{107,101,0}}, +/* 59985 */ {(12<<2)|2,{107,101,0}}, +/* 59986 */ {(12<<2)|2,{107,101,0}}, +/* 59987 */ {(12<<2)|2,{107,101,0}}, +/* 59988 */ {(12<<2)|2,{107,101,0}}, +/* 59989 */ {(12<<2)|2,{107,101,0}}, +/* 59990 */ {(12<<2)|2,{107,101,0}}, +/* 59991 */ {(12<<2)|2,{107,101,0}}, +/* 59992 */ {(12<<2)|2,{107,101,0}}, +/* 59993 */ {(12<<2)|2,{107,101,0}}, +/* 59994 */ {(12<<2)|2,{107,101,0}}, +/* 59995 */ {(12<<2)|2,{107,101,0}}, +/* 59996 */ {(12<<2)|2,{107,101,0}}, +/* 59997 */ {(12<<2)|2,{107,101,0}}, +/* 59998 */ {(12<<2)|2,{107,101,0}}, +/* 59999 */ {(12<<2)|2,{107,101,0}}, +/* 60000 */ {(12<<2)|2,{107,105,0}}, +/* 60001 */ {(12<<2)|2,{107,105,0}}, +/* 60002 */ {(12<<2)|2,{107,105,0}}, +/* 60003 */ {(12<<2)|2,{107,105,0}}, +/* 60004 */ {(12<<2)|2,{107,105,0}}, +/* 60005 */ {(12<<2)|2,{107,105,0}}, +/* 60006 */ {(12<<2)|2,{107,105,0}}, +/* 60007 */ {(12<<2)|2,{107,105,0}}, +/* 60008 */ {(12<<2)|2,{107,105,0}}, +/* 60009 */ {(12<<2)|2,{107,105,0}}, +/* 60010 */ {(12<<2)|2,{107,105,0}}, +/* 60011 */ {(12<<2)|2,{107,105,0}}, +/* 60012 */ {(12<<2)|2,{107,105,0}}, +/* 60013 */ {(12<<2)|2,{107,105,0}}, +/* 60014 */ {(12<<2)|2,{107,105,0}}, +/* 60015 */ {(12<<2)|2,{107,105,0}}, +/* 60016 */ {(12<<2)|2,{107,111,0}}, +/* 60017 */ {(12<<2)|2,{107,111,0}}, +/* 60018 */ {(12<<2)|2,{107,111,0}}, +/* 60019 */ {(12<<2)|2,{107,111,0}}, +/* 60020 */ {(12<<2)|2,{107,111,0}}, +/* 60021 */ {(12<<2)|2,{107,111,0}}, +/* 60022 */ {(12<<2)|2,{107,111,0}}, +/* 60023 */ {(12<<2)|2,{107,111,0}}, +/* 60024 */ {(12<<2)|2,{107,111,0}}, +/* 60025 */ {(12<<2)|2,{107,111,0}}, +/* 60026 */ {(12<<2)|2,{107,111,0}}, +/* 60027 */ {(12<<2)|2,{107,111,0}}, +/* 60028 */ {(12<<2)|2,{107,111,0}}, +/* 60029 */ {(12<<2)|2,{107,111,0}}, +/* 60030 */ {(12<<2)|2,{107,111,0}}, +/* 60031 */ {(12<<2)|2,{107,111,0}}, +/* 60032 */ {(12<<2)|2,{107,115,0}}, +/* 60033 */ {(12<<2)|2,{107,115,0}}, +/* 60034 */ {(12<<2)|2,{107,115,0}}, +/* 60035 */ {(12<<2)|2,{107,115,0}}, +/* 60036 */ {(12<<2)|2,{107,115,0}}, +/* 60037 */ {(12<<2)|2,{107,115,0}}, +/* 60038 */ {(12<<2)|2,{107,115,0}}, +/* 60039 */ {(12<<2)|2,{107,115,0}}, +/* 60040 */ {(12<<2)|2,{107,115,0}}, +/* 60041 */ {(12<<2)|2,{107,115,0}}, +/* 60042 */ {(12<<2)|2,{107,115,0}}, +/* 60043 */ {(12<<2)|2,{107,115,0}}, +/* 60044 */ {(12<<2)|2,{107,115,0}}, +/* 60045 */ {(12<<2)|2,{107,115,0}}, +/* 60046 */ {(12<<2)|2,{107,115,0}}, +/* 60047 */ {(12<<2)|2,{107,115,0}}, +/* 60048 */ {(12<<2)|2,{107,116,0}}, +/* 60049 */ {(12<<2)|2,{107,116,0}}, +/* 60050 */ {(12<<2)|2,{107,116,0}}, +/* 60051 */ {(12<<2)|2,{107,116,0}}, +/* 60052 */ {(12<<2)|2,{107,116,0}}, +/* 60053 */ {(12<<2)|2,{107,116,0}}, +/* 60054 */ {(12<<2)|2,{107,116,0}}, +/* 60055 */ {(12<<2)|2,{107,116,0}}, +/* 60056 */ {(12<<2)|2,{107,116,0}}, +/* 60057 */ {(12<<2)|2,{107,116,0}}, +/* 60058 */ {(12<<2)|2,{107,116,0}}, +/* 60059 */ {(12<<2)|2,{107,116,0}}, +/* 60060 */ {(12<<2)|2,{107,116,0}}, +/* 60061 */ {(12<<2)|2,{107,116,0}}, +/* 60062 */ {(12<<2)|2,{107,116,0}}, +/* 60063 */ {(12<<2)|2,{107,116,0}}, +/* 60064 */ {(13<<2)|2,{107,32,0}}, +/* 60065 */ {(13<<2)|2,{107,32,0}}, +/* 60066 */ {(13<<2)|2,{107,32,0}}, +/* 60067 */ {(13<<2)|2,{107,32,0}}, +/* 60068 */ {(13<<2)|2,{107,32,0}}, +/* 60069 */ {(13<<2)|2,{107,32,0}}, +/* 60070 */ {(13<<2)|2,{107,32,0}}, +/* 60071 */ {(13<<2)|2,{107,32,0}}, +/* 60072 */ {(13<<2)|2,{107,37,0}}, +/* 60073 */ {(13<<2)|2,{107,37,0}}, +/* 60074 */ {(13<<2)|2,{107,37,0}}, +/* 60075 */ {(13<<2)|2,{107,37,0}}, +/* 60076 */ {(13<<2)|2,{107,37,0}}, +/* 60077 */ {(13<<2)|2,{107,37,0}}, +/* 60078 */ {(13<<2)|2,{107,37,0}}, +/* 60079 */ {(13<<2)|2,{107,37,0}}, +/* 60080 */ {(13<<2)|2,{107,45,0}}, +/* 60081 */ {(13<<2)|2,{107,45,0}}, +/* 60082 */ {(13<<2)|2,{107,45,0}}, +/* 60083 */ {(13<<2)|2,{107,45,0}}, +/* 60084 */ {(13<<2)|2,{107,45,0}}, +/* 60085 */ {(13<<2)|2,{107,45,0}}, +/* 60086 */ {(13<<2)|2,{107,45,0}}, +/* 60087 */ {(13<<2)|2,{107,45,0}}, +/* 60088 */ {(13<<2)|2,{107,46,0}}, +/* 60089 */ {(13<<2)|2,{107,46,0}}, +/* 60090 */ {(13<<2)|2,{107,46,0}}, +/* 60091 */ {(13<<2)|2,{107,46,0}}, +/* 60092 */ {(13<<2)|2,{107,46,0}}, +/* 60093 */ {(13<<2)|2,{107,46,0}}, +/* 60094 */ {(13<<2)|2,{107,46,0}}, +/* 60095 */ {(13<<2)|2,{107,46,0}}, +/* 60096 */ {(13<<2)|2,{107,47,0}}, +/* 60097 */ {(13<<2)|2,{107,47,0}}, +/* 60098 */ {(13<<2)|2,{107,47,0}}, +/* 60099 */ {(13<<2)|2,{107,47,0}}, +/* 60100 */ {(13<<2)|2,{107,47,0}}, +/* 60101 */ {(13<<2)|2,{107,47,0}}, +/* 60102 */ {(13<<2)|2,{107,47,0}}, +/* 60103 */ {(13<<2)|2,{107,47,0}}, +/* 60104 */ {(13<<2)|2,{107,51,0}}, +/* 60105 */ {(13<<2)|2,{107,51,0}}, +/* 60106 */ {(13<<2)|2,{107,51,0}}, +/* 60107 */ {(13<<2)|2,{107,51,0}}, +/* 60108 */ {(13<<2)|2,{107,51,0}}, +/* 60109 */ {(13<<2)|2,{107,51,0}}, +/* 60110 */ {(13<<2)|2,{107,51,0}}, +/* 60111 */ {(13<<2)|2,{107,51,0}}, +/* 60112 */ {(13<<2)|2,{107,52,0}}, +/* 60113 */ {(13<<2)|2,{107,52,0}}, +/* 60114 */ {(13<<2)|2,{107,52,0}}, +/* 60115 */ {(13<<2)|2,{107,52,0}}, +/* 60116 */ {(13<<2)|2,{107,52,0}}, +/* 60117 */ {(13<<2)|2,{107,52,0}}, +/* 60118 */ {(13<<2)|2,{107,52,0}}, +/* 60119 */ {(13<<2)|2,{107,52,0}}, +/* 60120 */ {(13<<2)|2,{107,53,0}}, +/* 60121 */ {(13<<2)|2,{107,53,0}}, +/* 60122 */ {(13<<2)|2,{107,53,0}}, +/* 60123 */ {(13<<2)|2,{107,53,0}}, +/* 60124 */ {(13<<2)|2,{107,53,0}}, +/* 60125 */ {(13<<2)|2,{107,53,0}}, +/* 60126 */ {(13<<2)|2,{107,53,0}}, +/* 60127 */ {(13<<2)|2,{107,53,0}}, +/* 60128 */ {(13<<2)|2,{107,54,0}}, +/* 60129 */ {(13<<2)|2,{107,54,0}}, +/* 60130 */ {(13<<2)|2,{107,54,0}}, +/* 60131 */ {(13<<2)|2,{107,54,0}}, +/* 60132 */ {(13<<2)|2,{107,54,0}}, +/* 60133 */ {(13<<2)|2,{107,54,0}}, +/* 60134 */ {(13<<2)|2,{107,54,0}}, +/* 60135 */ {(13<<2)|2,{107,54,0}}, +/* 60136 */ {(13<<2)|2,{107,55,0}}, +/* 60137 */ {(13<<2)|2,{107,55,0}}, +/* 60138 */ {(13<<2)|2,{107,55,0}}, +/* 60139 */ {(13<<2)|2,{107,55,0}}, +/* 60140 */ {(13<<2)|2,{107,55,0}}, +/* 60141 */ {(13<<2)|2,{107,55,0}}, +/* 60142 */ {(13<<2)|2,{107,55,0}}, +/* 60143 */ {(13<<2)|2,{107,55,0}}, +/* 60144 */ {(13<<2)|2,{107,56,0}}, +/* 60145 */ {(13<<2)|2,{107,56,0}}, +/* 60146 */ {(13<<2)|2,{107,56,0}}, +/* 60147 */ {(13<<2)|2,{107,56,0}}, +/* 60148 */ {(13<<2)|2,{107,56,0}}, +/* 60149 */ {(13<<2)|2,{107,56,0}}, +/* 60150 */ {(13<<2)|2,{107,56,0}}, +/* 60151 */ {(13<<2)|2,{107,56,0}}, +/* 60152 */ {(13<<2)|2,{107,57,0}}, +/* 60153 */ {(13<<2)|2,{107,57,0}}, +/* 60154 */ {(13<<2)|2,{107,57,0}}, +/* 60155 */ {(13<<2)|2,{107,57,0}}, +/* 60156 */ {(13<<2)|2,{107,57,0}}, +/* 60157 */ {(13<<2)|2,{107,57,0}}, +/* 60158 */ {(13<<2)|2,{107,57,0}}, +/* 60159 */ {(13<<2)|2,{107,57,0}}, +/* 60160 */ {(13<<2)|2,{107,61,0}}, +/* 60161 */ {(13<<2)|2,{107,61,0}}, +/* 60162 */ {(13<<2)|2,{107,61,0}}, +/* 60163 */ {(13<<2)|2,{107,61,0}}, +/* 60164 */ {(13<<2)|2,{107,61,0}}, +/* 60165 */ {(13<<2)|2,{107,61,0}}, +/* 60166 */ {(13<<2)|2,{107,61,0}}, +/* 60167 */ {(13<<2)|2,{107,61,0}}, +/* 60168 */ {(13<<2)|2,{107,65,0}}, +/* 60169 */ {(13<<2)|2,{107,65,0}}, +/* 60170 */ {(13<<2)|2,{107,65,0}}, +/* 60171 */ {(13<<2)|2,{107,65,0}}, +/* 60172 */ {(13<<2)|2,{107,65,0}}, +/* 60173 */ {(13<<2)|2,{107,65,0}}, +/* 60174 */ {(13<<2)|2,{107,65,0}}, +/* 60175 */ {(13<<2)|2,{107,65,0}}, +/* 60176 */ {(13<<2)|2,{107,95,0}}, +/* 60177 */ {(13<<2)|2,{107,95,0}}, +/* 60178 */ {(13<<2)|2,{107,95,0}}, +/* 60179 */ {(13<<2)|2,{107,95,0}}, +/* 60180 */ {(13<<2)|2,{107,95,0}}, +/* 60181 */ {(13<<2)|2,{107,95,0}}, +/* 60182 */ {(13<<2)|2,{107,95,0}}, +/* 60183 */ {(13<<2)|2,{107,95,0}}, +/* 60184 */ {(13<<2)|2,{107,98,0}}, +/* 60185 */ {(13<<2)|2,{107,98,0}}, +/* 60186 */ {(13<<2)|2,{107,98,0}}, +/* 60187 */ {(13<<2)|2,{107,98,0}}, +/* 60188 */ {(13<<2)|2,{107,98,0}}, +/* 60189 */ {(13<<2)|2,{107,98,0}}, +/* 60190 */ {(13<<2)|2,{107,98,0}}, +/* 60191 */ {(13<<2)|2,{107,98,0}}, +/* 60192 */ {(13<<2)|2,{107,100,0}}, +/* 60193 */ {(13<<2)|2,{107,100,0}}, +/* 60194 */ {(13<<2)|2,{107,100,0}}, +/* 60195 */ {(13<<2)|2,{107,100,0}}, +/* 60196 */ {(13<<2)|2,{107,100,0}}, +/* 60197 */ {(13<<2)|2,{107,100,0}}, +/* 60198 */ {(13<<2)|2,{107,100,0}}, +/* 60199 */ {(13<<2)|2,{107,100,0}}, +/* 60200 */ {(13<<2)|2,{107,102,0}}, +/* 60201 */ {(13<<2)|2,{107,102,0}}, +/* 60202 */ {(13<<2)|2,{107,102,0}}, +/* 60203 */ {(13<<2)|2,{107,102,0}}, +/* 60204 */ {(13<<2)|2,{107,102,0}}, +/* 60205 */ {(13<<2)|2,{107,102,0}}, +/* 60206 */ {(13<<2)|2,{107,102,0}}, +/* 60207 */ {(13<<2)|2,{107,102,0}}, +/* 60208 */ {(13<<2)|2,{107,103,0}}, +/* 60209 */ {(13<<2)|2,{107,103,0}}, +/* 60210 */ {(13<<2)|2,{107,103,0}}, +/* 60211 */ {(13<<2)|2,{107,103,0}}, +/* 60212 */ {(13<<2)|2,{107,103,0}}, +/* 60213 */ {(13<<2)|2,{107,103,0}}, +/* 60214 */ {(13<<2)|2,{107,103,0}}, +/* 60215 */ {(13<<2)|2,{107,103,0}}, +/* 60216 */ {(13<<2)|2,{107,104,0}}, +/* 60217 */ {(13<<2)|2,{107,104,0}}, +/* 60218 */ {(13<<2)|2,{107,104,0}}, +/* 60219 */ {(13<<2)|2,{107,104,0}}, +/* 60220 */ {(13<<2)|2,{107,104,0}}, +/* 60221 */ {(13<<2)|2,{107,104,0}}, +/* 60222 */ {(13<<2)|2,{107,104,0}}, +/* 60223 */ {(13<<2)|2,{107,104,0}}, +/* 60224 */ {(13<<2)|2,{107,108,0}}, +/* 60225 */ {(13<<2)|2,{107,108,0}}, +/* 60226 */ {(13<<2)|2,{107,108,0}}, +/* 60227 */ {(13<<2)|2,{107,108,0}}, +/* 60228 */ {(13<<2)|2,{107,108,0}}, +/* 60229 */ {(13<<2)|2,{107,108,0}}, +/* 60230 */ {(13<<2)|2,{107,108,0}}, +/* 60231 */ {(13<<2)|2,{107,108,0}}, +/* 60232 */ {(13<<2)|2,{107,109,0}}, +/* 60233 */ {(13<<2)|2,{107,109,0}}, +/* 60234 */ {(13<<2)|2,{107,109,0}}, +/* 60235 */ {(13<<2)|2,{107,109,0}}, +/* 60236 */ {(13<<2)|2,{107,109,0}}, +/* 60237 */ {(13<<2)|2,{107,109,0}}, +/* 60238 */ {(13<<2)|2,{107,109,0}}, +/* 60239 */ {(13<<2)|2,{107,109,0}}, +/* 60240 */ {(13<<2)|2,{107,110,0}}, +/* 60241 */ {(13<<2)|2,{107,110,0}}, +/* 60242 */ {(13<<2)|2,{107,110,0}}, +/* 60243 */ {(13<<2)|2,{107,110,0}}, +/* 60244 */ {(13<<2)|2,{107,110,0}}, +/* 60245 */ {(13<<2)|2,{107,110,0}}, +/* 60246 */ {(13<<2)|2,{107,110,0}}, +/* 60247 */ {(13<<2)|2,{107,110,0}}, +/* 60248 */ {(13<<2)|2,{107,112,0}}, +/* 60249 */ {(13<<2)|2,{107,112,0}}, +/* 60250 */ {(13<<2)|2,{107,112,0}}, +/* 60251 */ {(13<<2)|2,{107,112,0}}, +/* 60252 */ {(13<<2)|2,{107,112,0}}, +/* 60253 */ {(13<<2)|2,{107,112,0}}, +/* 60254 */ {(13<<2)|2,{107,112,0}}, +/* 60255 */ {(13<<2)|2,{107,112,0}}, +/* 60256 */ {(13<<2)|2,{107,114,0}}, +/* 60257 */ {(13<<2)|2,{107,114,0}}, +/* 60258 */ {(13<<2)|2,{107,114,0}}, +/* 60259 */ {(13<<2)|2,{107,114,0}}, +/* 60260 */ {(13<<2)|2,{107,114,0}}, +/* 60261 */ {(13<<2)|2,{107,114,0}}, +/* 60262 */ {(13<<2)|2,{107,114,0}}, +/* 60263 */ {(13<<2)|2,{107,114,0}}, +/* 60264 */ {(13<<2)|2,{107,117,0}}, +/* 60265 */ {(13<<2)|2,{107,117,0}}, +/* 60266 */ {(13<<2)|2,{107,117,0}}, +/* 60267 */ {(13<<2)|2,{107,117,0}}, +/* 60268 */ {(13<<2)|2,{107,117,0}}, +/* 60269 */ {(13<<2)|2,{107,117,0}}, +/* 60270 */ {(13<<2)|2,{107,117,0}}, +/* 60271 */ {(13<<2)|2,{107,117,0}}, +/* 60272 */ {(14<<2)|2,{107,58,0}}, +/* 60273 */ {(14<<2)|2,{107,58,0}}, +/* 60274 */ {(14<<2)|2,{107,58,0}}, +/* 60275 */ {(14<<2)|2,{107,58,0}}, +/* 60276 */ {(14<<2)|2,{107,66,0}}, +/* 60277 */ {(14<<2)|2,{107,66,0}}, +/* 60278 */ {(14<<2)|2,{107,66,0}}, +/* 60279 */ {(14<<2)|2,{107,66,0}}, +/* 60280 */ {(14<<2)|2,{107,67,0}}, +/* 60281 */ {(14<<2)|2,{107,67,0}}, +/* 60282 */ {(14<<2)|2,{107,67,0}}, +/* 60283 */ {(14<<2)|2,{107,67,0}}, +/* 60284 */ {(14<<2)|2,{107,68,0}}, +/* 60285 */ {(14<<2)|2,{107,68,0}}, +/* 60286 */ {(14<<2)|2,{107,68,0}}, +/* 60287 */ {(14<<2)|2,{107,68,0}}, +/* 60288 */ {(14<<2)|2,{107,69,0}}, +/* 60289 */ {(14<<2)|2,{107,69,0}}, +/* 60290 */ {(14<<2)|2,{107,69,0}}, +/* 60291 */ {(14<<2)|2,{107,69,0}}, +/* 60292 */ {(14<<2)|2,{107,70,0}}, +/* 60293 */ {(14<<2)|2,{107,70,0}}, +/* 60294 */ {(14<<2)|2,{107,70,0}}, +/* 60295 */ {(14<<2)|2,{107,70,0}}, +/* 60296 */ {(14<<2)|2,{107,71,0}}, +/* 60297 */ {(14<<2)|2,{107,71,0}}, +/* 60298 */ {(14<<2)|2,{107,71,0}}, +/* 60299 */ {(14<<2)|2,{107,71,0}}, +/* 60300 */ {(14<<2)|2,{107,72,0}}, +/* 60301 */ {(14<<2)|2,{107,72,0}}, +/* 60302 */ {(14<<2)|2,{107,72,0}}, +/* 60303 */ {(14<<2)|2,{107,72,0}}, +/* 60304 */ {(14<<2)|2,{107,73,0}}, +/* 60305 */ {(14<<2)|2,{107,73,0}}, +/* 60306 */ {(14<<2)|2,{107,73,0}}, +/* 60307 */ {(14<<2)|2,{107,73,0}}, +/* 60308 */ {(14<<2)|2,{107,74,0}}, +/* 60309 */ {(14<<2)|2,{107,74,0}}, +/* 60310 */ {(14<<2)|2,{107,74,0}}, +/* 60311 */ {(14<<2)|2,{107,74,0}}, +/* 60312 */ {(14<<2)|2,{107,75,0}}, +/* 60313 */ {(14<<2)|2,{107,75,0}}, +/* 60314 */ {(14<<2)|2,{107,75,0}}, +/* 60315 */ {(14<<2)|2,{107,75,0}}, +/* 60316 */ {(14<<2)|2,{107,76,0}}, +/* 60317 */ {(14<<2)|2,{107,76,0}}, +/* 60318 */ {(14<<2)|2,{107,76,0}}, +/* 60319 */ {(14<<2)|2,{107,76,0}}, +/* 60320 */ {(14<<2)|2,{107,77,0}}, +/* 60321 */ {(14<<2)|2,{107,77,0}}, +/* 60322 */ {(14<<2)|2,{107,77,0}}, +/* 60323 */ {(14<<2)|2,{107,77,0}}, +/* 60324 */ {(14<<2)|2,{107,78,0}}, +/* 60325 */ {(14<<2)|2,{107,78,0}}, +/* 60326 */ {(14<<2)|2,{107,78,0}}, +/* 60327 */ {(14<<2)|2,{107,78,0}}, +/* 60328 */ {(14<<2)|2,{107,79,0}}, +/* 60329 */ {(14<<2)|2,{107,79,0}}, +/* 60330 */ {(14<<2)|2,{107,79,0}}, +/* 60331 */ {(14<<2)|2,{107,79,0}}, +/* 60332 */ {(14<<2)|2,{107,80,0}}, +/* 60333 */ {(14<<2)|2,{107,80,0}}, +/* 60334 */ {(14<<2)|2,{107,80,0}}, +/* 60335 */ {(14<<2)|2,{107,80,0}}, +/* 60336 */ {(14<<2)|2,{107,81,0}}, +/* 60337 */ {(14<<2)|2,{107,81,0}}, +/* 60338 */ {(14<<2)|2,{107,81,0}}, +/* 60339 */ {(14<<2)|2,{107,81,0}}, +/* 60340 */ {(14<<2)|2,{107,82,0}}, +/* 60341 */ {(14<<2)|2,{107,82,0}}, +/* 60342 */ {(14<<2)|2,{107,82,0}}, +/* 60343 */ {(14<<2)|2,{107,82,0}}, +/* 60344 */ {(14<<2)|2,{107,83,0}}, +/* 60345 */ {(14<<2)|2,{107,83,0}}, +/* 60346 */ {(14<<2)|2,{107,83,0}}, +/* 60347 */ {(14<<2)|2,{107,83,0}}, +/* 60348 */ {(14<<2)|2,{107,84,0}}, +/* 60349 */ {(14<<2)|2,{107,84,0}}, +/* 60350 */ {(14<<2)|2,{107,84,0}}, +/* 60351 */ {(14<<2)|2,{107,84,0}}, +/* 60352 */ {(14<<2)|2,{107,85,0}}, +/* 60353 */ {(14<<2)|2,{107,85,0}}, +/* 60354 */ {(14<<2)|2,{107,85,0}}, +/* 60355 */ {(14<<2)|2,{107,85,0}}, +/* 60356 */ {(14<<2)|2,{107,86,0}}, +/* 60357 */ {(14<<2)|2,{107,86,0}}, +/* 60358 */ {(14<<2)|2,{107,86,0}}, +/* 60359 */ {(14<<2)|2,{107,86,0}}, +/* 60360 */ {(14<<2)|2,{107,87,0}}, +/* 60361 */ {(14<<2)|2,{107,87,0}}, +/* 60362 */ {(14<<2)|2,{107,87,0}}, +/* 60363 */ {(14<<2)|2,{107,87,0}}, +/* 60364 */ {(14<<2)|2,{107,89,0}}, +/* 60365 */ {(14<<2)|2,{107,89,0}}, +/* 60366 */ {(14<<2)|2,{107,89,0}}, +/* 60367 */ {(14<<2)|2,{107,89,0}}, +/* 60368 */ {(14<<2)|2,{107,106,0}}, +/* 60369 */ {(14<<2)|2,{107,106,0}}, +/* 60370 */ {(14<<2)|2,{107,106,0}}, +/* 60371 */ {(14<<2)|2,{107,106,0}}, +/* 60372 */ {(14<<2)|2,{107,107,0}}, +/* 60373 */ {(14<<2)|2,{107,107,0}}, +/* 60374 */ {(14<<2)|2,{107,107,0}}, +/* 60375 */ {(14<<2)|2,{107,107,0}}, +/* 60376 */ {(14<<2)|2,{107,113,0}}, +/* 60377 */ {(14<<2)|2,{107,113,0}}, +/* 60378 */ {(14<<2)|2,{107,113,0}}, +/* 60379 */ {(14<<2)|2,{107,113,0}}, +/* 60380 */ {(14<<2)|2,{107,118,0}}, +/* 60381 */ {(14<<2)|2,{107,118,0}}, +/* 60382 */ {(14<<2)|2,{107,118,0}}, +/* 60383 */ {(14<<2)|2,{107,118,0}}, +/* 60384 */ {(14<<2)|2,{107,119,0}}, +/* 60385 */ {(14<<2)|2,{107,119,0}}, +/* 60386 */ {(14<<2)|2,{107,119,0}}, +/* 60387 */ {(14<<2)|2,{107,119,0}}, +/* 60388 */ {(14<<2)|2,{107,120,0}}, +/* 60389 */ {(14<<2)|2,{107,120,0}}, +/* 60390 */ {(14<<2)|2,{107,120,0}}, +/* 60391 */ {(14<<2)|2,{107,120,0}}, +/* 60392 */ {(14<<2)|2,{107,121,0}}, +/* 60393 */ {(14<<2)|2,{107,121,0}}, +/* 60394 */ {(14<<2)|2,{107,121,0}}, +/* 60395 */ {(14<<2)|2,{107,121,0}}, +/* 60396 */ {(14<<2)|2,{107,122,0}}, +/* 60397 */ {(14<<2)|2,{107,122,0}}, +/* 60398 */ {(14<<2)|2,{107,122,0}}, +/* 60399 */ {(14<<2)|2,{107,122,0}}, +/* 60400 */ {(15<<2)|2,{107,38,0}}, +/* 60401 */ {(15<<2)|2,{107,38,0}}, +/* 60402 */ {(15<<2)|2,{107,42,0}}, +/* 60403 */ {(15<<2)|2,{107,42,0}}, +/* 60404 */ {(15<<2)|2,{107,44,0}}, +/* 60405 */ {(15<<2)|2,{107,44,0}}, +/* 60406 */ {(15<<2)|2,{107,59,0}}, +/* 60407 */ {(15<<2)|2,{107,59,0}}, +/* 60408 */ {(15<<2)|2,{107,88,0}}, +/* 60409 */ {(15<<2)|2,{107,88,0}}, +/* 60410 */ {(15<<2)|2,{107,90,0}}, +/* 60411 */ {(15<<2)|2,{107,90,0}}, +/* 60412 */ {(7<<2)|1,{107,0,0}}, +/* 60413 */ {(7<<2)|1,{107,0,0}}, +/* 60414 */ {(7<<2)|1,{107,0,0}}, +/* 60415 */ {(7<<2)|1,{107,0,0}}, +/* 60416 */ {(12<<2)|2,{113,48,0}}, +/* 60417 */ {(12<<2)|2,{113,48,0}}, +/* 60418 */ {(12<<2)|2,{113,48,0}}, +/* 60419 */ {(12<<2)|2,{113,48,0}}, +/* 60420 */ {(12<<2)|2,{113,48,0}}, +/* 60421 */ {(12<<2)|2,{113,48,0}}, +/* 60422 */ {(12<<2)|2,{113,48,0}}, +/* 60423 */ {(12<<2)|2,{113,48,0}}, +/* 60424 */ {(12<<2)|2,{113,48,0}}, +/* 60425 */ {(12<<2)|2,{113,48,0}}, +/* 60426 */ {(12<<2)|2,{113,48,0}}, +/* 60427 */ {(12<<2)|2,{113,48,0}}, +/* 60428 */ {(12<<2)|2,{113,48,0}}, +/* 60429 */ {(12<<2)|2,{113,48,0}}, +/* 60430 */ {(12<<2)|2,{113,48,0}}, +/* 60431 */ {(12<<2)|2,{113,48,0}}, +/* 60432 */ {(12<<2)|2,{113,49,0}}, +/* 60433 */ {(12<<2)|2,{113,49,0}}, +/* 60434 */ {(12<<2)|2,{113,49,0}}, +/* 60435 */ {(12<<2)|2,{113,49,0}}, +/* 60436 */ {(12<<2)|2,{113,49,0}}, +/* 60437 */ {(12<<2)|2,{113,49,0}}, +/* 60438 */ {(12<<2)|2,{113,49,0}}, +/* 60439 */ {(12<<2)|2,{113,49,0}}, +/* 60440 */ {(12<<2)|2,{113,49,0}}, +/* 60441 */ {(12<<2)|2,{113,49,0}}, +/* 60442 */ {(12<<2)|2,{113,49,0}}, +/* 60443 */ {(12<<2)|2,{113,49,0}}, +/* 60444 */ {(12<<2)|2,{113,49,0}}, +/* 60445 */ {(12<<2)|2,{113,49,0}}, +/* 60446 */ {(12<<2)|2,{113,49,0}}, +/* 60447 */ {(12<<2)|2,{113,49,0}}, +/* 60448 */ {(12<<2)|2,{113,50,0}}, +/* 60449 */ {(12<<2)|2,{113,50,0}}, +/* 60450 */ {(12<<2)|2,{113,50,0}}, +/* 60451 */ {(12<<2)|2,{113,50,0}}, +/* 60452 */ {(12<<2)|2,{113,50,0}}, +/* 60453 */ {(12<<2)|2,{113,50,0}}, +/* 60454 */ {(12<<2)|2,{113,50,0}}, +/* 60455 */ {(12<<2)|2,{113,50,0}}, +/* 60456 */ {(12<<2)|2,{113,50,0}}, +/* 60457 */ {(12<<2)|2,{113,50,0}}, +/* 60458 */ {(12<<2)|2,{113,50,0}}, +/* 60459 */ {(12<<2)|2,{113,50,0}}, +/* 60460 */ {(12<<2)|2,{113,50,0}}, +/* 60461 */ {(12<<2)|2,{113,50,0}}, +/* 60462 */ {(12<<2)|2,{113,50,0}}, +/* 60463 */ {(12<<2)|2,{113,50,0}}, +/* 60464 */ {(12<<2)|2,{113,97,0}}, +/* 60465 */ {(12<<2)|2,{113,97,0}}, +/* 60466 */ {(12<<2)|2,{113,97,0}}, +/* 60467 */ {(12<<2)|2,{113,97,0}}, +/* 60468 */ {(12<<2)|2,{113,97,0}}, +/* 60469 */ {(12<<2)|2,{113,97,0}}, +/* 60470 */ {(12<<2)|2,{113,97,0}}, +/* 60471 */ {(12<<2)|2,{113,97,0}}, +/* 60472 */ {(12<<2)|2,{113,97,0}}, +/* 60473 */ {(12<<2)|2,{113,97,0}}, +/* 60474 */ {(12<<2)|2,{113,97,0}}, +/* 60475 */ {(12<<2)|2,{113,97,0}}, +/* 60476 */ {(12<<2)|2,{113,97,0}}, +/* 60477 */ {(12<<2)|2,{113,97,0}}, +/* 60478 */ {(12<<2)|2,{113,97,0}}, +/* 60479 */ {(12<<2)|2,{113,97,0}}, +/* 60480 */ {(12<<2)|2,{113,99,0}}, +/* 60481 */ {(12<<2)|2,{113,99,0}}, +/* 60482 */ {(12<<2)|2,{113,99,0}}, +/* 60483 */ {(12<<2)|2,{113,99,0}}, +/* 60484 */ {(12<<2)|2,{113,99,0}}, +/* 60485 */ {(12<<2)|2,{113,99,0}}, +/* 60486 */ {(12<<2)|2,{113,99,0}}, +/* 60487 */ {(12<<2)|2,{113,99,0}}, +/* 60488 */ {(12<<2)|2,{113,99,0}}, +/* 60489 */ {(12<<2)|2,{113,99,0}}, +/* 60490 */ {(12<<2)|2,{113,99,0}}, +/* 60491 */ {(12<<2)|2,{113,99,0}}, +/* 60492 */ {(12<<2)|2,{113,99,0}}, +/* 60493 */ {(12<<2)|2,{113,99,0}}, +/* 60494 */ {(12<<2)|2,{113,99,0}}, +/* 60495 */ {(12<<2)|2,{113,99,0}}, +/* 60496 */ {(12<<2)|2,{113,101,0}}, +/* 60497 */ {(12<<2)|2,{113,101,0}}, +/* 60498 */ {(12<<2)|2,{113,101,0}}, +/* 60499 */ {(12<<2)|2,{113,101,0}}, +/* 60500 */ {(12<<2)|2,{113,101,0}}, +/* 60501 */ {(12<<2)|2,{113,101,0}}, +/* 60502 */ {(12<<2)|2,{113,101,0}}, +/* 60503 */ {(12<<2)|2,{113,101,0}}, +/* 60504 */ {(12<<2)|2,{113,101,0}}, +/* 60505 */ {(12<<2)|2,{113,101,0}}, +/* 60506 */ {(12<<2)|2,{113,101,0}}, +/* 60507 */ {(12<<2)|2,{113,101,0}}, +/* 60508 */ {(12<<2)|2,{113,101,0}}, +/* 60509 */ {(12<<2)|2,{113,101,0}}, +/* 60510 */ {(12<<2)|2,{113,101,0}}, +/* 60511 */ {(12<<2)|2,{113,101,0}}, +/* 60512 */ {(12<<2)|2,{113,105,0}}, +/* 60513 */ {(12<<2)|2,{113,105,0}}, +/* 60514 */ {(12<<2)|2,{113,105,0}}, +/* 60515 */ {(12<<2)|2,{113,105,0}}, +/* 60516 */ {(12<<2)|2,{113,105,0}}, +/* 60517 */ {(12<<2)|2,{113,105,0}}, +/* 60518 */ {(12<<2)|2,{113,105,0}}, +/* 60519 */ {(12<<2)|2,{113,105,0}}, +/* 60520 */ {(12<<2)|2,{113,105,0}}, +/* 60521 */ {(12<<2)|2,{113,105,0}}, +/* 60522 */ {(12<<2)|2,{113,105,0}}, +/* 60523 */ {(12<<2)|2,{113,105,0}}, +/* 60524 */ {(12<<2)|2,{113,105,0}}, +/* 60525 */ {(12<<2)|2,{113,105,0}}, +/* 60526 */ {(12<<2)|2,{113,105,0}}, +/* 60527 */ {(12<<2)|2,{113,105,0}}, +/* 60528 */ {(12<<2)|2,{113,111,0}}, +/* 60529 */ {(12<<2)|2,{113,111,0}}, +/* 60530 */ {(12<<2)|2,{113,111,0}}, +/* 60531 */ {(12<<2)|2,{113,111,0}}, +/* 60532 */ {(12<<2)|2,{113,111,0}}, +/* 60533 */ {(12<<2)|2,{113,111,0}}, +/* 60534 */ {(12<<2)|2,{113,111,0}}, +/* 60535 */ {(12<<2)|2,{113,111,0}}, +/* 60536 */ {(12<<2)|2,{113,111,0}}, +/* 60537 */ {(12<<2)|2,{113,111,0}}, +/* 60538 */ {(12<<2)|2,{113,111,0}}, +/* 60539 */ {(12<<2)|2,{113,111,0}}, +/* 60540 */ {(12<<2)|2,{113,111,0}}, +/* 60541 */ {(12<<2)|2,{113,111,0}}, +/* 60542 */ {(12<<2)|2,{113,111,0}}, +/* 60543 */ {(12<<2)|2,{113,111,0}}, +/* 60544 */ {(12<<2)|2,{113,115,0}}, +/* 60545 */ {(12<<2)|2,{113,115,0}}, +/* 60546 */ {(12<<2)|2,{113,115,0}}, +/* 60547 */ {(12<<2)|2,{113,115,0}}, +/* 60548 */ {(12<<2)|2,{113,115,0}}, +/* 60549 */ {(12<<2)|2,{113,115,0}}, +/* 60550 */ {(12<<2)|2,{113,115,0}}, +/* 60551 */ {(12<<2)|2,{113,115,0}}, +/* 60552 */ {(12<<2)|2,{113,115,0}}, +/* 60553 */ {(12<<2)|2,{113,115,0}}, +/* 60554 */ {(12<<2)|2,{113,115,0}}, +/* 60555 */ {(12<<2)|2,{113,115,0}}, +/* 60556 */ {(12<<2)|2,{113,115,0}}, +/* 60557 */ {(12<<2)|2,{113,115,0}}, +/* 60558 */ {(12<<2)|2,{113,115,0}}, +/* 60559 */ {(12<<2)|2,{113,115,0}}, +/* 60560 */ {(12<<2)|2,{113,116,0}}, +/* 60561 */ {(12<<2)|2,{113,116,0}}, +/* 60562 */ {(12<<2)|2,{113,116,0}}, +/* 60563 */ {(12<<2)|2,{113,116,0}}, +/* 60564 */ {(12<<2)|2,{113,116,0}}, +/* 60565 */ {(12<<2)|2,{113,116,0}}, +/* 60566 */ {(12<<2)|2,{113,116,0}}, +/* 60567 */ {(12<<2)|2,{113,116,0}}, +/* 60568 */ {(12<<2)|2,{113,116,0}}, +/* 60569 */ {(12<<2)|2,{113,116,0}}, +/* 60570 */ {(12<<2)|2,{113,116,0}}, +/* 60571 */ {(12<<2)|2,{113,116,0}}, +/* 60572 */ {(12<<2)|2,{113,116,0}}, +/* 60573 */ {(12<<2)|2,{113,116,0}}, +/* 60574 */ {(12<<2)|2,{113,116,0}}, +/* 60575 */ {(12<<2)|2,{113,116,0}}, +/* 60576 */ {(13<<2)|2,{113,32,0}}, +/* 60577 */ {(13<<2)|2,{113,32,0}}, +/* 60578 */ {(13<<2)|2,{113,32,0}}, +/* 60579 */ {(13<<2)|2,{113,32,0}}, +/* 60580 */ {(13<<2)|2,{113,32,0}}, +/* 60581 */ {(13<<2)|2,{113,32,0}}, +/* 60582 */ {(13<<2)|2,{113,32,0}}, +/* 60583 */ {(13<<2)|2,{113,32,0}}, +/* 60584 */ {(13<<2)|2,{113,37,0}}, +/* 60585 */ {(13<<2)|2,{113,37,0}}, +/* 60586 */ {(13<<2)|2,{113,37,0}}, +/* 60587 */ {(13<<2)|2,{113,37,0}}, +/* 60588 */ {(13<<2)|2,{113,37,0}}, +/* 60589 */ {(13<<2)|2,{113,37,0}}, +/* 60590 */ {(13<<2)|2,{113,37,0}}, +/* 60591 */ {(13<<2)|2,{113,37,0}}, +/* 60592 */ {(13<<2)|2,{113,45,0}}, +/* 60593 */ {(13<<2)|2,{113,45,0}}, +/* 60594 */ {(13<<2)|2,{113,45,0}}, +/* 60595 */ {(13<<2)|2,{113,45,0}}, +/* 60596 */ {(13<<2)|2,{113,45,0}}, +/* 60597 */ {(13<<2)|2,{113,45,0}}, +/* 60598 */ {(13<<2)|2,{113,45,0}}, +/* 60599 */ {(13<<2)|2,{113,45,0}}, +/* 60600 */ {(13<<2)|2,{113,46,0}}, +/* 60601 */ {(13<<2)|2,{113,46,0}}, +/* 60602 */ {(13<<2)|2,{113,46,0}}, +/* 60603 */ {(13<<2)|2,{113,46,0}}, +/* 60604 */ {(13<<2)|2,{113,46,0}}, +/* 60605 */ {(13<<2)|2,{113,46,0}}, +/* 60606 */ {(13<<2)|2,{113,46,0}}, +/* 60607 */ {(13<<2)|2,{113,46,0}}, +/* 60608 */ {(13<<2)|2,{113,47,0}}, +/* 60609 */ {(13<<2)|2,{113,47,0}}, +/* 60610 */ {(13<<2)|2,{113,47,0}}, +/* 60611 */ {(13<<2)|2,{113,47,0}}, +/* 60612 */ {(13<<2)|2,{113,47,0}}, +/* 60613 */ {(13<<2)|2,{113,47,0}}, +/* 60614 */ {(13<<2)|2,{113,47,0}}, +/* 60615 */ {(13<<2)|2,{113,47,0}}, +/* 60616 */ {(13<<2)|2,{113,51,0}}, +/* 60617 */ {(13<<2)|2,{113,51,0}}, +/* 60618 */ {(13<<2)|2,{113,51,0}}, +/* 60619 */ {(13<<2)|2,{113,51,0}}, +/* 60620 */ {(13<<2)|2,{113,51,0}}, +/* 60621 */ {(13<<2)|2,{113,51,0}}, +/* 60622 */ {(13<<2)|2,{113,51,0}}, +/* 60623 */ {(13<<2)|2,{113,51,0}}, +/* 60624 */ {(13<<2)|2,{113,52,0}}, +/* 60625 */ {(13<<2)|2,{113,52,0}}, +/* 60626 */ {(13<<2)|2,{113,52,0}}, +/* 60627 */ {(13<<2)|2,{113,52,0}}, +/* 60628 */ {(13<<2)|2,{113,52,0}}, +/* 60629 */ {(13<<2)|2,{113,52,0}}, +/* 60630 */ {(13<<2)|2,{113,52,0}}, +/* 60631 */ {(13<<2)|2,{113,52,0}}, +/* 60632 */ {(13<<2)|2,{113,53,0}}, +/* 60633 */ {(13<<2)|2,{113,53,0}}, +/* 60634 */ {(13<<2)|2,{113,53,0}}, +/* 60635 */ {(13<<2)|2,{113,53,0}}, +/* 60636 */ {(13<<2)|2,{113,53,0}}, +/* 60637 */ {(13<<2)|2,{113,53,0}}, +/* 60638 */ {(13<<2)|2,{113,53,0}}, +/* 60639 */ {(13<<2)|2,{113,53,0}}, +/* 60640 */ {(13<<2)|2,{113,54,0}}, +/* 60641 */ {(13<<2)|2,{113,54,0}}, +/* 60642 */ {(13<<2)|2,{113,54,0}}, +/* 60643 */ {(13<<2)|2,{113,54,0}}, +/* 60644 */ {(13<<2)|2,{113,54,0}}, +/* 60645 */ {(13<<2)|2,{113,54,0}}, +/* 60646 */ {(13<<2)|2,{113,54,0}}, +/* 60647 */ {(13<<2)|2,{113,54,0}}, +/* 60648 */ {(13<<2)|2,{113,55,0}}, +/* 60649 */ {(13<<2)|2,{113,55,0}}, +/* 60650 */ {(13<<2)|2,{113,55,0}}, +/* 60651 */ {(13<<2)|2,{113,55,0}}, +/* 60652 */ {(13<<2)|2,{113,55,0}}, +/* 60653 */ {(13<<2)|2,{113,55,0}}, +/* 60654 */ {(13<<2)|2,{113,55,0}}, +/* 60655 */ {(13<<2)|2,{113,55,0}}, +/* 60656 */ {(13<<2)|2,{113,56,0}}, +/* 60657 */ {(13<<2)|2,{113,56,0}}, +/* 60658 */ {(13<<2)|2,{113,56,0}}, +/* 60659 */ {(13<<2)|2,{113,56,0}}, +/* 60660 */ {(13<<2)|2,{113,56,0}}, +/* 60661 */ {(13<<2)|2,{113,56,0}}, +/* 60662 */ {(13<<2)|2,{113,56,0}}, +/* 60663 */ {(13<<2)|2,{113,56,0}}, +/* 60664 */ {(13<<2)|2,{113,57,0}}, +/* 60665 */ {(13<<2)|2,{113,57,0}}, +/* 60666 */ {(13<<2)|2,{113,57,0}}, +/* 60667 */ {(13<<2)|2,{113,57,0}}, +/* 60668 */ {(13<<2)|2,{113,57,0}}, +/* 60669 */ {(13<<2)|2,{113,57,0}}, +/* 60670 */ {(13<<2)|2,{113,57,0}}, +/* 60671 */ {(13<<2)|2,{113,57,0}}, +/* 60672 */ {(13<<2)|2,{113,61,0}}, +/* 60673 */ {(13<<2)|2,{113,61,0}}, +/* 60674 */ {(13<<2)|2,{113,61,0}}, +/* 60675 */ {(13<<2)|2,{113,61,0}}, +/* 60676 */ {(13<<2)|2,{113,61,0}}, +/* 60677 */ {(13<<2)|2,{113,61,0}}, +/* 60678 */ {(13<<2)|2,{113,61,0}}, +/* 60679 */ {(13<<2)|2,{113,61,0}}, +/* 60680 */ {(13<<2)|2,{113,65,0}}, +/* 60681 */ {(13<<2)|2,{113,65,0}}, +/* 60682 */ {(13<<2)|2,{113,65,0}}, +/* 60683 */ {(13<<2)|2,{113,65,0}}, +/* 60684 */ {(13<<2)|2,{113,65,0}}, +/* 60685 */ {(13<<2)|2,{113,65,0}}, +/* 60686 */ {(13<<2)|2,{113,65,0}}, +/* 60687 */ {(13<<2)|2,{113,65,0}}, +/* 60688 */ {(13<<2)|2,{113,95,0}}, +/* 60689 */ {(13<<2)|2,{113,95,0}}, +/* 60690 */ {(13<<2)|2,{113,95,0}}, +/* 60691 */ {(13<<2)|2,{113,95,0}}, +/* 60692 */ {(13<<2)|2,{113,95,0}}, +/* 60693 */ {(13<<2)|2,{113,95,0}}, +/* 60694 */ {(13<<2)|2,{113,95,0}}, +/* 60695 */ {(13<<2)|2,{113,95,0}}, +/* 60696 */ {(13<<2)|2,{113,98,0}}, +/* 60697 */ {(13<<2)|2,{113,98,0}}, +/* 60698 */ {(13<<2)|2,{113,98,0}}, +/* 60699 */ {(13<<2)|2,{113,98,0}}, +/* 60700 */ {(13<<2)|2,{113,98,0}}, +/* 60701 */ {(13<<2)|2,{113,98,0}}, +/* 60702 */ {(13<<2)|2,{113,98,0}}, +/* 60703 */ {(13<<2)|2,{113,98,0}}, +/* 60704 */ {(13<<2)|2,{113,100,0}}, +/* 60705 */ {(13<<2)|2,{113,100,0}}, +/* 60706 */ {(13<<2)|2,{113,100,0}}, +/* 60707 */ {(13<<2)|2,{113,100,0}}, +/* 60708 */ {(13<<2)|2,{113,100,0}}, +/* 60709 */ {(13<<2)|2,{113,100,0}}, +/* 60710 */ {(13<<2)|2,{113,100,0}}, +/* 60711 */ {(13<<2)|2,{113,100,0}}, +/* 60712 */ {(13<<2)|2,{113,102,0}}, +/* 60713 */ {(13<<2)|2,{113,102,0}}, +/* 60714 */ {(13<<2)|2,{113,102,0}}, +/* 60715 */ {(13<<2)|2,{113,102,0}}, +/* 60716 */ {(13<<2)|2,{113,102,0}}, +/* 60717 */ {(13<<2)|2,{113,102,0}}, +/* 60718 */ {(13<<2)|2,{113,102,0}}, +/* 60719 */ {(13<<2)|2,{113,102,0}}, +/* 60720 */ {(13<<2)|2,{113,103,0}}, +/* 60721 */ {(13<<2)|2,{113,103,0}}, +/* 60722 */ {(13<<2)|2,{113,103,0}}, +/* 60723 */ {(13<<2)|2,{113,103,0}}, +/* 60724 */ {(13<<2)|2,{113,103,0}}, +/* 60725 */ {(13<<2)|2,{113,103,0}}, +/* 60726 */ {(13<<2)|2,{113,103,0}}, +/* 60727 */ {(13<<2)|2,{113,103,0}}, +/* 60728 */ {(13<<2)|2,{113,104,0}}, +/* 60729 */ {(13<<2)|2,{113,104,0}}, +/* 60730 */ {(13<<2)|2,{113,104,0}}, +/* 60731 */ {(13<<2)|2,{113,104,0}}, +/* 60732 */ {(13<<2)|2,{113,104,0}}, +/* 60733 */ {(13<<2)|2,{113,104,0}}, +/* 60734 */ {(13<<2)|2,{113,104,0}}, +/* 60735 */ {(13<<2)|2,{113,104,0}}, +/* 60736 */ {(13<<2)|2,{113,108,0}}, +/* 60737 */ {(13<<2)|2,{113,108,0}}, +/* 60738 */ {(13<<2)|2,{113,108,0}}, +/* 60739 */ {(13<<2)|2,{113,108,0}}, +/* 60740 */ {(13<<2)|2,{113,108,0}}, +/* 60741 */ {(13<<2)|2,{113,108,0}}, +/* 60742 */ {(13<<2)|2,{113,108,0}}, +/* 60743 */ {(13<<2)|2,{113,108,0}}, +/* 60744 */ {(13<<2)|2,{113,109,0}}, +/* 60745 */ {(13<<2)|2,{113,109,0}}, +/* 60746 */ {(13<<2)|2,{113,109,0}}, +/* 60747 */ {(13<<2)|2,{113,109,0}}, +/* 60748 */ {(13<<2)|2,{113,109,0}}, +/* 60749 */ {(13<<2)|2,{113,109,0}}, +/* 60750 */ {(13<<2)|2,{113,109,0}}, +/* 60751 */ {(13<<2)|2,{113,109,0}}, +/* 60752 */ {(13<<2)|2,{113,110,0}}, +/* 60753 */ {(13<<2)|2,{113,110,0}}, +/* 60754 */ {(13<<2)|2,{113,110,0}}, +/* 60755 */ {(13<<2)|2,{113,110,0}}, +/* 60756 */ {(13<<2)|2,{113,110,0}}, +/* 60757 */ {(13<<2)|2,{113,110,0}}, +/* 60758 */ {(13<<2)|2,{113,110,0}}, +/* 60759 */ {(13<<2)|2,{113,110,0}}, +/* 60760 */ {(13<<2)|2,{113,112,0}}, +/* 60761 */ {(13<<2)|2,{113,112,0}}, +/* 60762 */ {(13<<2)|2,{113,112,0}}, +/* 60763 */ {(13<<2)|2,{113,112,0}}, +/* 60764 */ {(13<<2)|2,{113,112,0}}, +/* 60765 */ {(13<<2)|2,{113,112,0}}, +/* 60766 */ {(13<<2)|2,{113,112,0}}, +/* 60767 */ {(13<<2)|2,{113,112,0}}, +/* 60768 */ {(13<<2)|2,{113,114,0}}, +/* 60769 */ {(13<<2)|2,{113,114,0}}, +/* 60770 */ {(13<<2)|2,{113,114,0}}, +/* 60771 */ {(13<<2)|2,{113,114,0}}, +/* 60772 */ {(13<<2)|2,{113,114,0}}, +/* 60773 */ {(13<<2)|2,{113,114,0}}, +/* 60774 */ {(13<<2)|2,{113,114,0}}, +/* 60775 */ {(13<<2)|2,{113,114,0}}, +/* 60776 */ {(13<<2)|2,{113,117,0}}, +/* 60777 */ {(13<<2)|2,{113,117,0}}, +/* 60778 */ {(13<<2)|2,{113,117,0}}, +/* 60779 */ {(13<<2)|2,{113,117,0}}, +/* 60780 */ {(13<<2)|2,{113,117,0}}, +/* 60781 */ {(13<<2)|2,{113,117,0}}, +/* 60782 */ {(13<<2)|2,{113,117,0}}, +/* 60783 */ {(13<<2)|2,{113,117,0}}, +/* 60784 */ {(14<<2)|2,{113,58,0}}, +/* 60785 */ {(14<<2)|2,{113,58,0}}, +/* 60786 */ {(14<<2)|2,{113,58,0}}, +/* 60787 */ {(14<<2)|2,{113,58,0}}, +/* 60788 */ {(14<<2)|2,{113,66,0}}, +/* 60789 */ {(14<<2)|2,{113,66,0}}, +/* 60790 */ {(14<<2)|2,{113,66,0}}, +/* 60791 */ {(14<<2)|2,{113,66,0}}, +/* 60792 */ {(14<<2)|2,{113,67,0}}, +/* 60793 */ {(14<<2)|2,{113,67,0}}, +/* 60794 */ {(14<<2)|2,{113,67,0}}, +/* 60795 */ {(14<<2)|2,{113,67,0}}, +/* 60796 */ {(14<<2)|2,{113,68,0}}, +/* 60797 */ {(14<<2)|2,{113,68,0}}, +/* 60798 */ {(14<<2)|2,{113,68,0}}, +/* 60799 */ {(14<<2)|2,{113,68,0}}, +/* 60800 */ {(14<<2)|2,{113,69,0}}, +/* 60801 */ {(14<<2)|2,{113,69,0}}, +/* 60802 */ {(14<<2)|2,{113,69,0}}, +/* 60803 */ {(14<<2)|2,{113,69,0}}, +/* 60804 */ {(14<<2)|2,{113,70,0}}, +/* 60805 */ {(14<<2)|2,{113,70,0}}, +/* 60806 */ {(14<<2)|2,{113,70,0}}, +/* 60807 */ {(14<<2)|2,{113,70,0}}, +/* 60808 */ {(14<<2)|2,{113,71,0}}, +/* 60809 */ {(14<<2)|2,{113,71,0}}, +/* 60810 */ {(14<<2)|2,{113,71,0}}, +/* 60811 */ {(14<<2)|2,{113,71,0}}, +/* 60812 */ {(14<<2)|2,{113,72,0}}, +/* 60813 */ {(14<<2)|2,{113,72,0}}, +/* 60814 */ {(14<<2)|2,{113,72,0}}, +/* 60815 */ {(14<<2)|2,{113,72,0}}, +/* 60816 */ {(14<<2)|2,{113,73,0}}, +/* 60817 */ {(14<<2)|2,{113,73,0}}, +/* 60818 */ {(14<<2)|2,{113,73,0}}, +/* 60819 */ {(14<<2)|2,{113,73,0}}, +/* 60820 */ {(14<<2)|2,{113,74,0}}, +/* 60821 */ {(14<<2)|2,{113,74,0}}, +/* 60822 */ {(14<<2)|2,{113,74,0}}, +/* 60823 */ {(14<<2)|2,{113,74,0}}, +/* 60824 */ {(14<<2)|2,{113,75,0}}, +/* 60825 */ {(14<<2)|2,{113,75,0}}, +/* 60826 */ {(14<<2)|2,{113,75,0}}, +/* 60827 */ {(14<<2)|2,{113,75,0}}, +/* 60828 */ {(14<<2)|2,{113,76,0}}, +/* 60829 */ {(14<<2)|2,{113,76,0}}, +/* 60830 */ {(14<<2)|2,{113,76,0}}, +/* 60831 */ {(14<<2)|2,{113,76,0}}, +/* 60832 */ {(14<<2)|2,{113,77,0}}, +/* 60833 */ {(14<<2)|2,{113,77,0}}, +/* 60834 */ {(14<<2)|2,{113,77,0}}, +/* 60835 */ {(14<<2)|2,{113,77,0}}, +/* 60836 */ {(14<<2)|2,{113,78,0}}, +/* 60837 */ {(14<<2)|2,{113,78,0}}, +/* 60838 */ {(14<<2)|2,{113,78,0}}, +/* 60839 */ {(14<<2)|2,{113,78,0}}, +/* 60840 */ {(14<<2)|2,{113,79,0}}, +/* 60841 */ {(14<<2)|2,{113,79,0}}, +/* 60842 */ {(14<<2)|2,{113,79,0}}, +/* 60843 */ {(14<<2)|2,{113,79,0}}, +/* 60844 */ {(14<<2)|2,{113,80,0}}, +/* 60845 */ {(14<<2)|2,{113,80,0}}, +/* 60846 */ {(14<<2)|2,{113,80,0}}, +/* 60847 */ {(14<<2)|2,{113,80,0}}, +/* 60848 */ {(14<<2)|2,{113,81,0}}, +/* 60849 */ {(14<<2)|2,{113,81,0}}, +/* 60850 */ {(14<<2)|2,{113,81,0}}, +/* 60851 */ {(14<<2)|2,{113,81,0}}, +/* 60852 */ {(14<<2)|2,{113,82,0}}, +/* 60853 */ {(14<<2)|2,{113,82,0}}, +/* 60854 */ {(14<<2)|2,{113,82,0}}, +/* 60855 */ {(14<<2)|2,{113,82,0}}, +/* 60856 */ {(14<<2)|2,{113,83,0}}, +/* 60857 */ {(14<<2)|2,{113,83,0}}, +/* 60858 */ {(14<<2)|2,{113,83,0}}, +/* 60859 */ {(14<<2)|2,{113,83,0}}, +/* 60860 */ {(14<<2)|2,{113,84,0}}, +/* 60861 */ {(14<<2)|2,{113,84,0}}, +/* 60862 */ {(14<<2)|2,{113,84,0}}, +/* 60863 */ {(14<<2)|2,{113,84,0}}, +/* 60864 */ {(14<<2)|2,{113,85,0}}, +/* 60865 */ {(14<<2)|2,{113,85,0}}, +/* 60866 */ {(14<<2)|2,{113,85,0}}, +/* 60867 */ {(14<<2)|2,{113,85,0}}, +/* 60868 */ {(14<<2)|2,{113,86,0}}, +/* 60869 */ {(14<<2)|2,{113,86,0}}, +/* 60870 */ {(14<<2)|2,{113,86,0}}, +/* 60871 */ {(14<<2)|2,{113,86,0}}, +/* 60872 */ {(14<<2)|2,{113,87,0}}, +/* 60873 */ {(14<<2)|2,{113,87,0}}, +/* 60874 */ {(14<<2)|2,{113,87,0}}, +/* 60875 */ {(14<<2)|2,{113,87,0}}, +/* 60876 */ {(14<<2)|2,{113,89,0}}, +/* 60877 */ {(14<<2)|2,{113,89,0}}, +/* 60878 */ {(14<<2)|2,{113,89,0}}, +/* 60879 */ {(14<<2)|2,{113,89,0}}, +/* 60880 */ {(14<<2)|2,{113,106,0}}, +/* 60881 */ {(14<<2)|2,{113,106,0}}, +/* 60882 */ {(14<<2)|2,{113,106,0}}, +/* 60883 */ {(14<<2)|2,{113,106,0}}, +/* 60884 */ {(14<<2)|2,{113,107,0}}, +/* 60885 */ {(14<<2)|2,{113,107,0}}, +/* 60886 */ {(14<<2)|2,{113,107,0}}, +/* 60887 */ {(14<<2)|2,{113,107,0}}, +/* 60888 */ {(14<<2)|2,{113,113,0}}, +/* 60889 */ {(14<<2)|2,{113,113,0}}, +/* 60890 */ {(14<<2)|2,{113,113,0}}, +/* 60891 */ {(14<<2)|2,{113,113,0}}, +/* 60892 */ {(14<<2)|2,{113,118,0}}, +/* 60893 */ {(14<<2)|2,{113,118,0}}, +/* 60894 */ {(14<<2)|2,{113,118,0}}, +/* 60895 */ {(14<<2)|2,{113,118,0}}, +/* 60896 */ {(14<<2)|2,{113,119,0}}, +/* 60897 */ {(14<<2)|2,{113,119,0}}, +/* 60898 */ {(14<<2)|2,{113,119,0}}, +/* 60899 */ {(14<<2)|2,{113,119,0}}, +/* 60900 */ {(14<<2)|2,{113,120,0}}, +/* 60901 */ {(14<<2)|2,{113,120,0}}, +/* 60902 */ {(14<<2)|2,{113,120,0}}, +/* 60903 */ {(14<<2)|2,{113,120,0}}, +/* 60904 */ {(14<<2)|2,{113,121,0}}, +/* 60905 */ {(14<<2)|2,{113,121,0}}, +/* 60906 */ {(14<<2)|2,{113,121,0}}, +/* 60907 */ {(14<<2)|2,{113,121,0}}, +/* 60908 */ {(14<<2)|2,{113,122,0}}, +/* 60909 */ {(14<<2)|2,{113,122,0}}, +/* 60910 */ {(14<<2)|2,{113,122,0}}, +/* 60911 */ {(14<<2)|2,{113,122,0}}, +/* 60912 */ {(15<<2)|2,{113,38,0}}, +/* 60913 */ {(15<<2)|2,{113,38,0}}, +/* 60914 */ {(15<<2)|2,{113,42,0}}, +/* 60915 */ {(15<<2)|2,{113,42,0}}, +/* 60916 */ {(15<<2)|2,{113,44,0}}, +/* 60917 */ {(15<<2)|2,{113,44,0}}, +/* 60918 */ {(15<<2)|2,{113,59,0}}, +/* 60919 */ {(15<<2)|2,{113,59,0}}, +/* 60920 */ {(15<<2)|2,{113,88,0}}, +/* 60921 */ {(15<<2)|2,{113,88,0}}, +/* 60922 */ {(15<<2)|2,{113,90,0}}, +/* 60923 */ {(15<<2)|2,{113,90,0}}, +/* 60924 */ {(7<<2)|1,{113,0,0}}, +/* 60925 */ {(7<<2)|1,{113,0,0}}, +/* 60926 */ {(7<<2)|1,{113,0,0}}, +/* 60927 */ {(7<<2)|1,{113,0,0}}, +/* 60928 */ {(12<<2)|2,{118,48,0}}, +/* 60929 */ {(12<<2)|2,{118,48,0}}, +/* 60930 */ {(12<<2)|2,{118,48,0}}, +/* 60931 */ {(12<<2)|2,{118,48,0}}, +/* 60932 */ {(12<<2)|2,{118,48,0}}, +/* 60933 */ {(12<<2)|2,{118,48,0}}, +/* 60934 */ {(12<<2)|2,{118,48,0}}, +/* 60935 */ {(12<<2)|2,{118,48,0}}, +/* 60936 */ {(12<<2)|2,{118,48,0}}, +/* 60937 */ {(12<<2)|2,{118,48,0}}, +/* 60938 */ {(12<<2)|2,{118,48,0}}, +/* 60939 */ {(12<<2)|2,{118,48,0}}, +/* 60940 */ {(12<<2)|2,{118,48,0}}, +/* 60941 */ {(12<<2)|2,{118,48,0}}, +/* 60942 */ {(12<<2)|2,{118,48,0}}, +/* 60943 */ {(12<<2)|2,{118,48,0}}, +/* 60944 */ {(12<<2)|2,{118,49,0}}, +/* 60945 */ {(12<<2)|2,{118,49,0}}, +/* 60946 */ {(12<<2)|2,{118,49,0}}, +/* 60947 */ {(12<<2)|2,{118,49,0}}, +/* 60948 */ {(12<<2)|2,{118,49,0}}, +/* 60949 */ {(12<<2)|2,{118,49,0}}, +/* 60950 */ {(12<<2)|2,{118,49,0}}, +/* 60951 */ {(12<<2)|2,{118,49,0}}, +/* 60952 */ {(12<<2)|2,{118,49,0}}, +/* 60953 */ {(12<<2)|2,{118,49,0}}, +/* 60954 */ {(12<<2)|2,{118,49,0}}, +/* 60955 */ {(12<<2)|2,{118,49,0}}, +/* 60956 */ {(12<<2)|2,{118,49,0}}, +/* 60957 */ {(12<<2)|2,{118,49,0}}, +/* 60958 */ {(12<<2)|2,{118,49,0}}, +/* 60959 */ {(12<<2)|2,{118,49,0}}, +/* 60960 */ {(12<<2)|2,{118,50,0}}, +/* 60961 */ {(12<<2)|2,{118,50,0}}, +/* 60962 */ {(12<<2)|2,{118,50,0}}, +/* 60963 */ {(12<<2)|2,{118,50,0}}, +/* 60964 */ {(12<<2)|2,{118,50,0}}, +/* 60965 */ {(12<<2)|2,{118,50,0}}, +/* 60966 */ {(12<<2)|2,{118,50,0}}, +/* 60967 */ {(12<<2)|2,{118,50,0}}, +/* 60968 */ {(12<<2)|2,{118,50,0}}, +/* 60969 */ {(12<<2)|2,{118,50,0}}, +/* 60970 */ {(12<<2)|2,{118,50,0}}, +/* 60971 */ {(12<<2)|2,{118,50,0}}, +/* 60972 */ {(12<<2)|2,{118,50,0}}, +/* 60973 */ {(12<<2)|2,{118,50,0}}, +/* 60974 */ {(12<<2)|2,{118,50,0}}, +/* 60975 */ {(12<<2)|2,{118,50,0}}, +/* 60976 */ {(12<<2)|2,{118,97,0}}, +/* 60977 */ {(12<<2)|2,{118,97,0}}, +/* 60978 */ {(12<<2)|2,{118,97,0}}, +/* 60979 */ {(12<<2)|2,{118,97,0}}, +/* 60980 */ {(12<<2)|2,{118,97,0}}, +/* 60981 */ {(12<<2)|2,{118,97,0}}, +/* 60982 */ {(12<<2)|2,{118,97,0}}, +/* 60983 */ {(12<<2)|2,{118,97,0}}, +/* 60984 */ {(12<<2)|2,{118,97,0}}, +/* 60985 */ {(12<<2)|2,{118,97,0}}, +/* 60986 */ {(12<<2)|2,{118,97,0}}, +/* 60987 */ {(12<<2)|2,{118,97,0}}, +/* 60988 */ {(12<<2)|2,{118,97,0}}, +/* 60989 */ {(12<<2)|2,{118,97,0}}, +/* 60990 */ {(12<<2)|2,{118,97,0}}, +/* 60991 */ {(12<<2)|2,{118,97,0}}, +/* 60992 */ {(12<<2)|2,{118,99,0}}, +/* 60993 */ {(12<<2)|2,{118,99,0}}, +/* 60994 */ {(12<<2)|2,{118,99,0}}, +/* 60995 */ {(12<<2)|2,{118,99,0}}, +/* 60996 */ {(12<<2)|2,{118,99,0}}, +/* 60997 */ {(12<<2)|2,{118,99,0}}, +/* 60998 */ {(12<<2)|2,{118,99,0}}, +/* 60999 */ {(12<<2)|2,{118,99,0}}, +/* 61000 */ {(12<<2)|2,{118,99,0}}, +/* 61001 */ {(12<<2)|2,{118,99,0}}, +/* 61002 */ {(12<<2)|2,{118,99,0}}, +/* 61003 */ {(12<<2)|2,{118,99,0}}, +/* 61004 */ {(12<<2)|2,{118,99,0}}, +/* 61005 */ {(12<<2)|2,{118,99,0}}, +/* 61006 */ {(12<<2)|2,{118,99,0}}, +/* 61007 */ {(12<<2)|2,{118,99,0}}, +/* 61008 */ {(12<<2)|2,{118,101,0}}, +/* 61009 */ {(12<<2)|2,{118,101,0}}, +/* 61010 */ {(12<<2)|2,{118,101,0}}, +/* 61011 */ {(12<<2)|2,{118,101,0}}, +/* 61012 */ {(12<<2)|2,{118,101,0}}, +/* 61013 */ {(12<<2)|2,{118,101,0}}, +/* 61014 */ {(12<<2)|2,{118,101,0}}, +/* 61015 */ {(12<<2)|2,{118,101,0}}, +/* 61016 */ {(12<<2)|2,{118,101,0}}, +/* 61017 */ {(12<<2)|2,{118,101,0}}, +/* 61018 */ {(12<<2)|2,{118,101,0}}, +/* 61019 */ {(12<<2)|2,{118,101,0}}, +/* 61020 */ {(12<<2)|2,{118,101,0}}, +/* 61021 */ {(12<<2)|2,{118,101,0}}, +/* 61022 */ {(12<<2)|2,{118,101,0}}, +/* 61023 */ {(12<<2)|2,{118,101,0}}, +/* 61024 */ {(12<<2)|2,{118,105,0}}, +/* 61025 */ {(12<<2)|2,{118,105,0}}, +/* 61026 */ {(12<<2)|2,{118,105,0}}, +/* 61027 */ {(12<<2)|2,{118,105,0}}, +/* 61028 */ {(12<<2)|2,{118,105,0}}, +/* 61029 */ {(12<<2)|2,{118,105,0}}, +/* 61030 */ {(12<<2)|2,{118,105,0}}, +/* 61031 */ {(12<<2)|2,{118,105,0}}, +/* 61032 */ {(12<<2)|2,{118,105,0}}, +/* 61033 */ {(12<<2)|2,{118,105,0}}, +/* 61034 */ {(12<<2)|2,{118,105,0}}, +/* 61035 */ {(12<<2)|2,{118,105,0}}, +/* 61036 */ {(12<<2)|2,{118,105,0}}, +/* 61037 */ {(12<<2)|2,{118,105,0}}, +/* 61038 */ {(12<<2)|2,{118,105,0}}, +/* 61039 */ {(12<<2)|2,{118,105,0}}, +/* 61040 */ {(12<<2)|2,{118,111,0}}, +/* 61041 */ {(12<<2)|2,{118,111,0}}, +/* 61042 */ {(12<<2)|2,{118,111,0}}, +/* 61043 */ {(12<<2)|2,{118,111,0}}, +/* 61044 */ {(12<<2)|2,{118,111,0}}, +/* 61045 */ {(12<<2)|2,{118,111,0}}, +/* 61046 */ {(12<<2)|2,{118,111,0}}, +/* 61047 */ {(12<<2)|2,{118,111,0}}, +/* 61048 */ {(12<<2)|2,{118,111,0}}, +/* 61049 */ {(12<<2)|2,{118,111,0}}, +/* 61050 */ {(12<<2)|2,{118,111,0}}, +/* 61051 */ {(12<<2)|2,{118,111,0}}, +/* 61052 */ {(12<<2)|2,{118,111,0}}, +/* 61053 */ {(12<<2)|2,{118,111,0}}, +/* 61054 */ {(12<<2)|2,{118,111,0}}, +/* 61055 */ {(12<<2)|2,{118,111,0}}, +/* 61056 */ {(12<<2)|2,{118,115,0}}, +/* 61057 */ {(12<<2)|2,{118,115,0}}, +/* 61058 */ {(12<<2)|2,{118,115,0}}, +/* 61059 */ {(12<<2)|2,{118,115,0}}, +/* 61060 */ {(12<<2)|2,{118,115,0}}, +/* 61061 */ {(12<<2)|2,{118,115,0}}, +/* 61062 */ {(12<<2)|2,{118,115,0}}, +/* 61063 */ {(12<<2)|2,{118,115,0}}, +/* 61064 */ {(12<<2)|2,{118,115,0}}, +/* 61065 */ {(12<<2)|2,{118,115,0}}, +/* 61066 */ {(12<<2)|2,{118,115,0}}, +/* 61067 */ {(12<<2)|2,{118,115,0}}, +/* 61068 */ {(12<<2)|2,{118,115,0}}, +/* 61069 */ {(12<<2)|2,{118,115,0}}, +/* 61070 */ {(12<<2)|2,{118,115,0}}, +/* 61071 */ {(12<<2)|2,{118,115,0}}, +/* 61072 */ {(12<<2)|2,{118,116,0}}, +/* 61073 */ {(12<<2)|2,{118,116,0}}, +/* 61074 */ {(12<<2)|2,{118,116,0}}, +/* 61075 */ {(12<<2)|2,{118,116,0}}, +/* 61076 */ {(12<<2)|2,{118,116,0}}, +/* 61077 */ {(12<<2)|2,{118,116,0}}, +/* 61078 */ {(12<<2)|2,{118,116,0}}, +/* 61079 */ {(12<<2)|2,{118,116,0}}, +/* 61080 */ {(12<<2)|2,{118,116,0}}, +/* 61081 */ {(12<<2)|2,{118,116,0}}, +/* 61082 */ {(12<<2)|2,{118,116,0}}, +/* 61083 */ {(12<<2)|2,{118,116,0}}, +/* 61084 */ {(12<<2)|2,{118,116,0}}, +/* 61085 */ {(12<<2)|2,{118,116,0}}, +/* 61086 */ {(12<<2)|2,{118,116,0}}, +/* 61087 */ {(12<<2)|2,{118,116,0}}, +/* 61088 */ {(13<<2)|2,{118,32,0}}, +/* 61089 */ {(13<<2)|2,{118,32,0}}, +/* 61090 */ {(13<<2)|2,{118,32,0}}, +/* 61091 */ {(13<<2)|2,{118,32,0}}, +/* 61092 */ {(13<<2)|2,{118,32,0}}, +/* 61093 */ {(13<<2)|2,{118,32,0}}, +/* 61094 */ {(13<<2)|2,{118,32,0}}, +/* 61095 */ {(13<<2)|2,{118,32,0}}, +/* 61096 */ {(13<<2)|2,{118,37,0}}, +/* 61097 */ {(13<<2)|2,{118,37,0}}, +/* 61098 */ {(13<<2)|2,{118,37,0}}, +/* 61099 */ {(13<<2)|2,{118,37,0}}, +/* 61100 */ {(13<<2)|2,{118,37,0}}, +/* 61101 */ {(13<<2)|2,{118,37,0}}, +/* 61102 */ {(13<<2)|2,{118,37,0}}, +/* 61103 */ {(13<<2)|2,{118,37,0}}, +/* 61104 */ {(13<<2)|2,{118,45,0}}, +/* 61105 */ {(13<<2)|2,{118,45,0}}, +/* 61106 */ {(13<<2)|2,{118,45,0}}, +/* 61107 */ {(13<<2)|2,{118,45,0}}, +/* 61108 */ {(13<<2)|2,{118,45,0}}, +/* 61109 */ {(13<<2)|2,{118,45,0}}, +/* 61110 */ {(13<<2)|2,{118,45,0}}, +/* 61111 */ {(13<<2)|2,{118,45,0}}, +/* 61112 */ {(13<<2)|2,{118,46,0}}, +/* 61113 */ {(13<<2)|2,{118,46,0}}, +/* 61114 */ {(13<<2)|2,{118,46,0}}, +/* 61115 */ {(13<<2)|2,{118,46,0}}, +/* 61116 */ {(13<<2)|2,{118,46,0}}, +/* 61117 */ {(13<<2)|2,{118,46,0}}, +/* 61118 */ {(13<<2)|2,{118,46,0}}, +/* 61119 */ {(13<<2)|2,{118,46,0}}, +/* 61120 */ {(13<<2)|2,{118,47,0}}, +/* 61121 */ {(13<<2)|2,{118,47,0}}, +/* 61122 */ {(13<<2)|2,{118,47,0}}, +/* 61123 */ {(13<<2)|2,{118,47,0}}, +/* 61124 */ {(13<<2)|2,{118,47,0}}, +/* 61125 */ {(13<<2)|2,{118,47,0}}, +/* 61126 */ {(13<<2)|2,{118,47,0}}, +/* 61127 */ {(13<<2)|2,{118,47,0}}, +/* 61128 */ {(13<<2)|2,{118,51,0}}, +/* 61129 */ {(13<<2)|2,{118,51,0}}, +/* 61130 */ {(13<<2)|2,{118,51,0}}, +/* 61131 */ {(13<<2)|2,{118,51,0}}, +/* 61132 */ {(13<<2)|2,{118,51,0}}, +/* 61133 */ {(13<<2)|2,{118,51,0}}, +/* 61134 */ {(13<<2)|2,{118,51,0}}, +/* 61135 */ {(13<<2)|2,{118,51,0}}, +/* 61136 */ {(13<<2)|2,{118,52,0}}, +/* 61137 */ {(13<<2)|2,{118,52,0}}, +/* 61138 */ {(13<<2)|2,{118,52,0}}, +/* 61139 */ {(13<<2)|2,{118,52,0}}, +/* 61140 */ {(13<<2)|2,{118,52,0}}, +/* 61141 */ {(13<<2)|2,{118,52,0}}, +/* 61142 */ {(13<<2)|2,{118,52,0}}, +/* 61143 */ {(13<<2)|2,{118,52,0}}, +/* 61144 */ {(13<<2)|2,{118,53,0}}, +/* 61145 */ {(13<<2)|2,{118,53,0}}, +/* 61146 */ {(13<<2)|2,{118,53,0}}, +/* 61147 */ {(13<<2)|2,{118,53,0}}, +/* 61148 */ {(13<<2)|2,{118,53,0}}, +/* 61149 */ {(13<<2)|2,{118,53,0}}, +/* 61150 */ {(13<<2)|2,{118,53,0}}, +/* 61151 */ {(13<<2)|2,{118,53,0}}, +/* 61152 */ {(13<<2)|2,{118,54,0}}, +/* 61153 */ {(13<<2)|2,{118,54,0}}, +/* 61154 */ {(13<<2)|2,{118,54,0}}, +/* 61155 */ {(13<<2)|2,{118,54,0}}, +/* 61156 */ {(13<<2)|2,{118,54,0}}, +/* 61157 */ {(13<<2)|2,{118,54,0}}, +/* 61158 */ {(13<<2)|2,{118,54,0}}, +/* 61159 */ {(13<<2)|2,{118,54,0}}, +/* 61160 */ {(13<<2)|2,{118,55,0}}, +/* 61161 */ {(13<<2)|2,{118,55,0}}, +/* 61162 */ {(13<<2)|2,{118,55,0}}, +/* 61163 */ {(13<<2)|2,{118,55,0}}, +/* 61164 */ {(13<<2)|2,{118,55,0}}, +/* 61165 */ {(13<<2)|2,{118,55,0}}, +/* 61166 */ {(13<<2)|2,{118,55,0}}, +/* 61167 */ {(13<<2)|2,{118,55,0}}, +/* 61168 */ {(13<<2)|2,{118,56,0}}, +/* 61169 */ {(13<<2)|2,{118,56,0}}, +/* 61170 */ {(13<<2)|2,{118,56,0}}, +/* 61171 */ {(13<<2)|2,{118,56,0}}, +/* 61172 */ {(13<<2)|2,{118,56,0}}, +/* 61173 */ {(13<<2)|2,{118,56,0}}, +/* 61174 */ {(13<<2)|2,{118,56,0}}, +/* 61175 */ {(13<<2)|2,{118,56,0}}, +/* 61176 */ {(13<<2)|2,{118,57,0}}, +/* 61177 */ {(13<<2)|2,{118,57,0}}, +/* 61178 */ {(13<<2)|2,{118,57,0}}, +/* 61179 */ {(13<<2)|2,{118,57,0}}, +/* 61180 */ {(13<<2)|2,{118,57,0}}, +/* 61181 */ {(13<<2)|2,{118,57,0}}, +/* 61182 */ {(13<<2)|2,{118,57,0}}, +/* 61183 */ {(13<<2)|2,{118,57,0}}, +/* 61184 */ {(13<<2)|2,{118,61,0}}, +/* 61185 */ {(13<<2)|2,{118,61,0}}, +/* 61186 */ {(13<<2)|2,{118,61,0}}, +/* 61187 */ {(13<<2)|2,{118,61,0}}, +/* 61188 */ {(13<<2)|2,{118,61,0}}, +/* 61189 */ {(13<<2)|2,{118,61,0}}, +/* 61190 */ {(13<<2)|2,{118,61,0}}, +/* 61191 */ {(13<<2)|2,{118,61,0}}, +/* 61192 */ {(13<<2)|2,{118,65,0}}, +/* 61193 */ {(13<<2)|2,{118,65,0}}, +/* 61194 */ {(13<<2)|2,{118,65,0}}, +/* 61195 */ {(13<<2)|2,{118,65,0}}, +/* 61196 */ {(13<<2)|2,{118,65,0}}, +/* 61197 */ {(13<<2)|2,{118,65,0}}, +/* 61198 */ {(13<<2)|2,{118,65,0}}, +/* 61199 */ {(13<<2)|2,{118,65,0}}, +/* 61200 */ {(13<<2)|2,{118,95,0}}, +/* 61201 */ {(13<<2)|2,{118,95,0}}, +/* 61202 */ {(13<<2)|2,{118,95,0}}, +/* 61203 */ {(13<<2)|2,{118,95,0}}, +/* 61204 */ {(13<<2)|2,{118,95,0}}, +/* 61205 */ {(13<<2)|2,{118,95,0}}, +/* 61206 */ {(13<<2)|2,{118,95,0}}, +/* 61207 */ {(13<<2)|2,{118,95,0}}, +/* 61208 */ {(13<<2)|2,{118,98,0}}, +/* 61209 */ {(13<<2)|2,{118,98,0}}, +/* 61210 */ {(13<<2)|2,{118,98,0}}, +/* 61211 */ {(13<<2)|2,{118,98,0}}, +/* 61212 */ {(13<<2)|2,{118,98,0}}, +/* 61213 */ {(13<<2)|2,{118,98,0}}, +/* 61214 */ {(13<<2)|2,{118,98,0}}, +/* 61215 */ {(13<<2)|2,{118,98,0}}, +/* 61216 */ {(13<<2)|2,{118,100,0}}, +/* 61217 */ {(13<<2)|2,{118,100,0}}, +/* 61218 */ {(13<<2)|2,{118,100,0}}, +/* 61219 */ {(13<<2)|2,{118,100,0}}, +/* 61220 */ {(13<<2)|2,{118,100,0}}, +/* 61221 */ {(13<<2)|2,{118,100,0}}, +/* 61222 */ {(13<<2)|2,{118,100,0}}, +/* 61223 */ {(13<<2)|2,{118,100,0}}, +/* 61224 */ {(13<<2)|2,{118,102,0}}, +/* 61225 */ {(13<<2)|2,{118,102,0}}, +/* 61226 */ {(13<<2)|2,{118,102,0}}, +/* 61227 */ {(13<<2)|2,{118,102,0}}, +/* 61228 */ {(13<<2)|2,{118,102,0}}, +/* 61229 */ {(13<<2)|2,{118,102,0}}, +/* 61230 */ {(13<<2)|2,{118,102,0}}, +/* 61231 */ {(13<<2)|2,{118,102,0}}, +/* 61232 */ {(13<<2)|2,{118,103,0}}, +/* 61233 */ {(13<<2)|2,{118,103,0}}, +/* 61234 */ {(13<<2)|2,{118,103,0}}, +/* 61235 */ {(13<<2)|2,{118,103,0}}, +/* 61236 */ {(13<<2)|2,{118,103,0}}, +/* 61237 */ {(13<<2)|2,{118,103,0}}, +/* 61238 */ {(13<<2)|2,{118,103,0}}, +/* 61239 */ {(13<<2)|2,{118,103,0}}, +/* 61240 */ {(13<<2)|2,{118,104,0}}, +/* 61241 */ {(13<<2)|2,{118,104,0}}, +/* 61242 */ {(13<<2)|2,{118,104,0}}, +/* 61243 */ {(13<<2)|2,{118,104,0}}, +/* 61244 */ {(13<<2)|2,{118,104,0}}, +/* 61245 */ {(13<<2)|2,{118,104,0}}, +/* 61246 */ {(13<<2)|2,{118,104,0}}, +/* 61247 */ {(13<<2)|2,{118,104,0}}, +/* 61248 */ {(13<<2)|2,{118,108,0}}, +/* 61249 */ {(13<<2)|2,{118,108,0}}, +/* 61250 */ {(13<<2)|2,{118,108,0}}, +/* 61251 */ {(13<<2)|2,{118,108,0}}, +/* 61252 */ {(13<<2)|2,{118,108,0}}, +/* 61253 */ {(13<<2)|2,{118,108,0}}, +/* 61254 */ {(13<<2)|2,{118,108,0}}, +/* 61255 */ {(13<<2)|2,{118,108,0}}, +/* 61256 */ {(13<<2)|2,{118,109,0}}, +/* 61257 */ {(13<<2)|2,{118,109,0}}, +/* 61258 */ {(13<<2)|2,{118,109,0}}, +/* 61259 */ {(13<<2)|2,{118,109,0}}, +/* 61260 */ {(13<<2)|2,{118,109,0}}, +/* 61261 */ {(13<<2)|2,{118,109,0}}, +/* 61262 */ {(13<<2)|2,{118,109,0}}, +/* 61263 */ {(13<<2)|2,{118,109,0}}, +/* 61264 */ {(13<<2)|2,{118,110,0}}, +/* 61265 */ {(13<<2)|2,{118,110,0}}, +/* 61266 */ {(13<<2)|2,{118,110,0}}, +/* 61267 */ {(13<<2)|2,{118,110,0}}, +/* 61268 */ {(13<<2)|2,{118,110,0}}, +/* 61269 */ {(13<<2)|2,{118,110,0}}, +/* 61270 */ {(13<<2)|2,{118,110,0}}, +/* 61271 */ {(13<<2)|2,{118,110,0}}, +/* 61272 */ {(13<<2)|2,{118,112,0}}, +/* 61273 */ {(13<<2)|2,{118,112,0}}, +/* 61274 */ {(13<<2)|2,{118,112,0}}, +/* 61275 */ {(13<<2)|2,{118,112,0}}, +/* 61276 */ {(13<<2)|2,{118,112,0}}, +/* 61277 */ {(13<<2)|2,{118,112,0}}, +/* 61278 */ {(13<<2)|2,{118,112,0}}, +/* 61279 */ {(13<<2)|2,{118,112,0}}, +/* 61280 */ {(13<<2)|2,{118,114,0}}, +/* 61281 */ {(13<<2)|2,{118,114,0}}, +/* 61282 */ {(13<<2)|2,{118,114,0}}, +/* 61283 */ {(13<<2)|2,{118,114,0}}, +/* 61284 */ {(13<<2)|2,{118,114,0}}, +/* 61285 */ {(13<<2)|2,{118,114,0}}, +/* 61286 */ {(13<<2)|2,{118,114,0}}, +/* 61287 */ {(13<<2)|2,{118,114,0}}, +/* 61288 */ {(13<<2)|2,{118,117,0}}, +/* 61289 */ {(13<<2)|2,{118,117,0}}, +/* 61290 */ {(13<<2)|2,{118,117,0}}, +/* 61291 */ {(13<<2)|2,{118,117,0}}, +/* 61292 */ {(13<<2)|2,{118,117,0}}, +/* 61293 */ {(13<<2)|2,{118,117,0}}, +/* 61294 */ {(13<<2)|2,{118,117,0}}, +/* 61295 */ {(13<<2)|2,{118,117,0}}, +/* 61296 */ {(14<<2)|2,{118,58,0}}, +/* 61297 */ {(14<<2)|2,{118,58,0}}, +/* 61298 */ {(14<<2)|2,{118,58,0}}, +/* 61299 */ {(14<<2)|2,{118,58,0}}, +/* 61300 */ {(14<<2)|2,{118,66,0}}, +/* 61301 */ {(14<<2)|2,{118,66,0}}, +/* 61302 */ {(14<<2)|2,{118,66,0}}, +/* 61303 */ {(14<<2)|2,{118,66,0}}, +/* 61304 */ {(14<<2)|2,{118,67,0}}, +/* 61305 */ {(14<<2)|2,{118,67,0}}, +/* 61306 */ {(14<<2)|2,{118,67,0}}, +/* 61307 */ {(14<<2)|2,{118,67,0}}, +/* 61308 */ {(14<<2)|2,{118,68,0}}, +/* 61309 */ {(14<<2)|2,{118,68,0}}, +/* 61310 */ {(14<<2)|2,{118,68,0}}, +/* 61311 */ {(14<<2)|2,{118,68,0}}, +/* 61312 */ {(14<<2)|2,{118,69,0}}, +/* 61313 */ {(14<<2)|2,{118,69,0}}, +/* 61314 */ {(14<<2)|2,{118,69,0}}, +/* 61315 */ {(14<<2)|2,{118,69,0}}, +/* 61316 */ {(14<<2)|2,{118,70,0}}, +/* 61317 */ {(14<<2)|2,{118,70,0}}, +/* 61318 */ {(14<<2)|2,{118,70,0}}, +/* 61319 */ {(14<<2)|2,{118,70,0}}, +/* 61320 */ {(14<<2)|2,{118,71,0}}, +/* 61321 */ {(14<<2)|2,{118,71,0}}, +/* 61322 */ {(14<<2)|2,{118,71,0}}, +/* 61323 */ {(14<<2)|2,{118,71,0}}, +/* 61324 */ {(14<<2)|2,{118,72,0}}, +/* 61325 */ {(14<<2)|2,{118,72,0}}, +/* 61326 */ {(14<<2)|2,{118,72,0}}, +/* 61327 */ {(14<<2)|2,{118,72,0}}, +/* 61328 */ {(14<<2)|2,{118,73,0}}, +/* 61329 */ {(14<<2)|2,{118,73,0}}, +/* 61330 */ {(14<<2)|2,{118,73,0}}, +/* 61331 */ {(14<<2)|2,{118,73,0}}, +/* 61332 */ {(14<<2)|2,{118,74,0}}, +/* 61333 */ {(14<<2)|2,{118,74,0}}, +/* 61334 */ {(14<<2)|2,{118,74,0}}, +/* 61335 */ {(14<<2)|2,{118,74,0}}, +/* 61336 */ {(14<<2)|2,{118,75,0}}, +/* 61337 */ {(14<<2)|2,{118,75,0}}, +/* 61338 */ {(14<<2)|2,{118,75,0}}, +/* 61339 */ {(14<<2)|2,{118,75,0}}, +/* 61340 */ {(14<<2)|2,{118,76,0}}, +/* 61341 */ {(14<<2)|2,{118,76,0}}, +/* 61342 */ {(14<<2)|2,{118,76,0}}, +/* 61343 */ {(14<<2)|2,{118,76,0}}, +/* 61344 */ {(14<<2)|2,{118,77,0}}, +/* 61345 */ {(14<<2)|2,{118,77,0}}, +/* 61346 */ {(14<<2)|2,{118,77,0}}, +/* 61347 */ {(14<<2)|2,{118,77,0}}, +/* 61348 */ {(14<<2)|2,{118,78,0}}, +/* 61349 */ {(14<<2)|2,{118,78,0}}, +/* 61350 */ {(14<<2)|2,{118,78,0}}, +/* 61351 */ {(14<<2)|2,{118,78,0}}, +/* 61352 */ {(14<<2)|2,{118,79,0}}, +/* 61353 */ {(14<<2)|2,{118,79,0}}, +/* 61354 */ {(14<<2)|2,{118,79,0}}, +/* 61355 */ {(14<<2)|2,{118,79,0}}, +/* 61356 */ {(14<<2)|2,{118,80,0}}, +/* 61357 */ {(14<<2)|2,{118,80,0}}, +/* 61358 */ {(14<<2)|2,{118,80,0}}, +/* 61359 */ {(14<<2)|2,{118,80,0}}, +/* 61360 */ {(14<<2)|2,{118,81,0}}, +/* 61361 */ {(14<<2)|2,{118,81,0}}, +/* 61362 */ {(14<<2)|2,{118,81,0}}, +/* 61363 */ {(14<<2)|2,{118,81,0}}, +/* 61364 */ {(14<<2)|2,{118,82,0}}, +/* 61365 */ {(14<<2)|2,{118,82,0}}, +/* 61366 */ {(14<<2)|2,{118,82,0}}, +/* 61367 */ {(14<<2)|2,{118,82,0}}, +/* 61368 */ {(14<<2)|2,{118,83,0}}, +/* 61369 */ {(14<<2)|2,{118,83,0}}, +/* 61370 */ {(14<<2)|2,{118,83,0}}, +/* 61371 */ {(14<<2)|2,{118,83,0}}, +/* 61372 */ {(14<<2)|2,{118,84,0}}, +/* 61373 */ {(14<<2)|2,{118,84,0}}, +/* 61374 */ {(14<<2)|2,{118,84,0}}, +/* 61375 */ {(14<<2)|2,{118,84,0}}, +/* 61376 */ {(14<<2)|2,{118,85,0}}, +/* 61377 */ {(14<<2)|2,{118,85,0}}, +/* 61378 */ {(14<<2)|2,{118,85,0}}, +/* 61379 */ {(14<<2)|2,{118,85,0}}, +/* 61380 */ {(14<<2)|2,{118,86,0}}, +/* 61381 */ {(14<<2)|2,{118,86,0}}, +/* 61382 */ {(14<<2)|2,{118,86,0}}, +/* 61383 */ {(14<<2)|2,{118,86,0}}, +/* 61384 */ {(14<<2)|2,{118,87,0}}, +/* 61385 */ {(14<<2)|2,{118,87,0}}, +/* 61386 */ {(14<<2)|2,{118,87,0}}, +/* 61387 */ {(14<<2)|2,{118,87,0}}, +/* 61388 */ {(14<<2)|2,{118,89,0}}, +/* 61389 */ {(14<<2)|2,{118,89,0}}, +/* 61390 */ {(14<<2)|2,{118,89,0}}, +/* 61391 */ {(14<<2)|2,{118,89,0}}, +/* 61392 */ {(14<<2)|2,{118,106,0}}, +/* 61393 */ {(14<<2)|2,{118,106,0}}, +/* 61394 */ {(14<<2)|2,{118,106,0}}, +/* 61395 */ {(14<<2)|2,{118,106,0}}, +/* 61396 */ {(14<<2)|2,{118,107,0}}, +/* 61397 */ {(14<<2)|2,{118,107,0}}, +/* 61398 */ {(14<<2)|2,{118,107,0}}, +/* 61399 */ {(14<<2)|2,{118,107,0}}, +/* 61400 */ {(14<<2)|2,{118,113,0}}, +/* 61401 */ {(14<<2)|2,{118,113,0}}, +/* 61402 */ {(14<<2)|2,{118,113,0}}, +/* 61403 */ {(14<<2)|2,{118,113,0}}, +/* 61404 */ {(14<<2)|2,{118,118,0}}, +/* 61405 */ {(14<<2)|2,{118,118,0}}, +/* 61406 */ {(14<<2)|2,{118,118,0}}, +/* 61407 */ {(14<<2)|2,{118,118,0}}, +/* 61408 */ {(14<<2)|2,{118,119,0}}, +/* 61409 */ {(14<<2)|2,{118,119,0}}, +/* 61410 */ {(14<<2)|2,{118,119,0}}, +/* 61411 */ {(14<<2)|2,{118,119,0}}, +/* 61412 */ {(14<<2)|2,{118,120,0}}, +/* 61413 */ {(14<<2)|2,{118,120,0}}, +/* 61414 */ {(14<<2)|2,{118,120,0}}, +/* 61415 */ {(14<<2)|2,{118,120,0}}, +/* 61416 */ {(14<<2)|2,{118,121,0}}, +/* 61417 */ {(14<<2)|2,{118,121,0}}, +/* 61418 */ {(14<<2)|2,{118,121,0}}, +/* 61419 */ {(14<<2)|2,{118,121,0}}, +/* 61420 */ {(14<<2)|2,{118,122,0}}, +/* 61421 */ {(14<<2)|2,{118,122,0}}, +/* 61422 */ {(14<<2)|2,{118,122,0}}, +/* 61423 */ {(14<<2)|2,{118,122,0}}, +/* 61424 */ {(15<<2)|2,{118,38,0}}, +/* 61425 */ {(15<<2)|2,{118,38,0}}, +/* 61426 */ {(15<<2)|2,{118,42,0}}, +/* 61427 */ {(15<<2)|2,{118,42,0}}, +/* 61428 */ {(15<<2)|2,{118,44,0}}, +/* 61429 */ {(15<<2)|2,{118,44,0}}, +/* 61430 */ {(15<<2)|2,{118,59,0}}, +/* 61431 */ {(15<<2)|2,{118,59,0}}, +/* 61432 */ {(15<<2)|2,{118,88,0}}, +/* 61433 */ {(15<<2)|2,{118,88,0}}, +/* 61434 */ {(15<<2)|2,{118,90,0}}, +/* 61435 */ {(15<<2)|2,{118,90,0}}, +/* 61436 */ {(7<<2)|1,{118,0,0}}, +/* 61437 */ {(7<<2)|1,{118,0,0}}, +/* 61438 */ {(7<<2)|1,{118,0,0}}, +/* 61439 */ {(7<<2)|1,{118,0,0}}, +/* 61440 */ {(12<<2)|2,{119,48,0}}, +/* 61441 */ {(12<<2)|2,{119,48,0}}, +/* 61442 */ {(12<<2)|2,{119,48,0}}, +/* 61443 */ {(12<<2)|2,{119,48,0}}, +/* 61444 */ {(12<<2)|2,{119,48,0}}, +/* 61445 */ {(12<<2)|2,{119,48,0}}, +/* 61446 */ {(12<<2)|2,{119,48,0}}, +/* 61447 */ {(12<<2)|2,{119,48,0}}, +/* 61448 */ {(12<<2)|2,{119,48,0}}, +/* 61449 */ {(12<<2)|2,{119,48,0}}, +/* 61450 */ {(12<<2)|2,{119,48,0}}, +/* 61451 */ {(12<<2)|2,{119,48,0}}, +/* 61452 */ {(12<<2)|2,{119,48,0}}, +/* 61453 */ {(12<<2)|2,{119,48,0}}, +/* 61454 */ {(12<<2)|2,{119,48,0}}, +/* 61455 */ {(12<<2)|2,{119,48,0}}, +/* 61456 */ {(12<<2)|2,{119,49,0}}, +/* 61457 */ {(12<<2)|2,{119,49,0}}, +/* 61458 */ {(12<<2)|2,{119,49,0}}, +/* 61459 */ {(12<<2)|2,{119,49,0}}, +/* 61460 */ {(12<<2)|2,{119,49,0}}, +/* 61461 */ {(12<<2)|2,{119,49,0}}, +/* 61462 */ {(12<<2)|2,{119,49,0}}, +/* 61463 */ {(12<<2)|2,{119,49,0}}, +/* 61464 */ {(12<<2)|2,{119,49,0}}, +/* 61465 */ {(12<<2)|2,{119,49,0}}, +/* 61466 */ {(12<<2)|2,{119,49,0}}, +/* 61467 */ {(12<<2)|2,{119,49,0}}, +/* 61468 */ {(12<<2)|2,{119,49,0}}, +/* 61469 */ {(12<<2)|2,{119,49,0}}, +/* 61470 */ {(12<<2)|2,{119,49,0}}, +/* 61471 */ {(12<<2)|2,{119,49,0}}, +/* 61472 */ {(12<<2)|2,{119,50,0}}, +/* 61473 */ {(12<<2)|2,{119,50,0}}, +/* 61474 */ {(12<<2)|2,{119,50,0}}, +/* 61475 */ {(12<<2)|2,{119,50,0}}, +/* 61476 */ {(12<<2)|2,{119,50,0}}, +/* 61477 */ {(12<<2)|2,{119,50,0}}, +/* 61478 */ {(12<<2)|2,{119,50,0}}, +/* 61479 */ {(12<<2)|2,{119,50,0}}, +/* 61480 */ {(12<<2)|2,{119,50,0}}, +/* 61481 */ {(12<<2)|2,{119,50,0}}, +/* 61482 */ {(12<<2)|2,{119,50,0}}, +/* 61483 */ {(12<<2)|2,{119,50,0}}, +/* 61484 */ {(12<<2)|2,{119,50,0}}, +/* 61485 */ {(12<<2)|2,{119,50,0}}, +/* 61486 */ {(12<<2)|2,{119,50,0}}, +/* 61487 */ {(12<<2)|2,{119,50,0}}, +/* 61488 */ {(12<<2)|2,{119,97,0}}, +/* 61489 */ {(12<<2)|2,{119,97,0}}, +/* 61490 */ {(12<<2)|2,{119,97,0}}, +/* 61491 */ {(12<<2)|2,{119,97,0}}, +/* 61492 */ {(12<<2)|2,{119,97,0}}, +/* 61493 */ {(12<<2)|2,{119,97,0}}, +/* 61494 */ {(12<<2)|2,{119,97,0}}, +/* 61495 */ {(12<<2)|2,{119,97,0}}, +/* 61496 */ {(12<<2)|2,{119,97,0}}, +/* 61497 */ {(12<<2)|2,{119,97,0}}, +/* 61498 */ {(12<<2)|2,{119,97,0}}, +/* 61499 */ {(12<<2)|2,{119,97,0}}, +/* 61500 */ {(12<<2)|2,{119,97,0}}, +/* 61501 */ {(12<<2)|2,{119,97,0}}, +/* 61502 */ {(12<<2)|2,{119,97,0}}, +/* 61503 */ {(12<<2)|2,{119,97,0}}, +/* 61504 */ {(12<<2)|2,{119,99,0}}, +/* 61505 */ {(12<<2)|2,{119,99,0}}, +/* 61506 */ {(12<<2)|2,{119,99,0}}, +/* 61507 */ {(12<<2)|2,{119,99,0}}, +/* 61508 */ {(12<<2)|2,{119,99,0}}, +/* 61509 */ {(12<<2)|2,{119,99,0}}, +/* 61510 */ {(12<<2)|2,{119,99,0}}, +/* 61511 */ {(12<<2)|2,{119,99,0}}, +/* 61512 */ {(12<<2)|2,{119,99,0}}, +/* 61513 */ {(12<<2)|2,{119,99,0}}, +/* 61514 */ {(12<<2)|2,{119,99,0}}, +/* 61515 */ {(12<<2)|2,{119,99,0}}, +/* 61516 */ {(12<<2)|2,{119,99,0}}, +/* 61517 */ {(12<<2)|2,{119,99,0}}, +/* 61518 */ {(12<<2)|2,{119,99,0}}, +/* 61519 */ {(12<<2)|2,{119,99,0}}, +/* 61520 */ {(12<<2)|2,{119,101,0}}, +/* 61521 */ {(12<<2)|2,{119,101,0}}, +/* 61522 */ {(12<<2)|2,{119,101,0}}, +/* 61523 */ {(12<<2)|2,{119,101,0}}, +/* 61524 */ {(12<<2)|2,{119,101,0}}, +/* 61525 */ {(12<<2)|2,{119,101,0}}, +/* 61526 */ {(12<<2)|2,{119,101,0}}, +/* 61527 */ {(12<<2)|2,{119,101,0}}, +/* 61528 */ {(12<<2)|2,{119,101,0}}, +/* 61529 */ {(12<<2)|2,{119,101,0}}, +/* 61530 */ {(12<<2)|2,{119,101,0}}, +/* 61531 */ {(12<<2)|2,{119,101,0}}, +/* 61532 */ {(12<<2)|2,{119,101,0}}, +/* 61533 */ {(12<<2)|2,{119,101,0}}, +/* 61534 */ {(12<<2)|2,{119,101,0}}, +/* 61535 */ {(12<<2)|2,{119,101,0}}, +/* 61536 */ {(12<<2)|2,{119,105,0}}, +/* 61537 */ {(12<<2)|2,{119,105,0}}, +/* 61538 */ {(12<<2)|2,{119,105,0}}, +/* 61539 */ {(12<<2)|2,{119,105,0}}, +/* 61540 */ {(12<<2)|2,{119,105,0}}, +/* 61541 */ {(12<<2)|2,{119,105,0}}, +/* 61542 */ {(12<<2)|2,{119,105,0}}, +/* 61543 */ {(12<<2)|2,{119,105,0}}, +/* 61544 */ {(12<<2)|2,{119,105,0}}, +/* 61545 */ {(12<<2)|2,{119,105,0}}, +/* 61546 */ {(12<<2)|2,{119,105,0}}, +/* 61547 */ {(12<<2)|2,{119,105,0}}, +/* 61548 */ {(12<<2)|2,{119,105,0}}, +/* 61549 */ {(12<<2)|2,{119,105,0}}, +/* 61550 */ {(12<<2)|2,{119,105,0}}, +/* 61551 */ {(12<<2)|2,{119,105,0}}, +/* 61552 */ {(12<<2)|2,{119,111,0}}, +/* 61553 */ {(12<<2)|2,{119,111,0}}, +/* 61554 */ {(12<<2)|2,{119,111,0}}, +/* 61555 */ {(12<<2)|2,{119,111,0}}, +/* 61556 */ {(12<<2)|2,{119,111,0}}, +/* 61557 */ {(12<<2)|2,{119,111,0}}, +/* 61558 */ {(12<<2)|2,{119,111,0}}, +/* 61559 */ {(12<<2)|2,{119,111,0}}, +/* 61560 */ {(12<<2)|2,{119,111,0}}, +/* 61561 */ {(12<<2)|2,{119,111,0}}, +/* 61562 */ {(12<<2)|2,{119,111,0}}, +/* 61563 */ {(12<<2)|2,{119,111,0}}, +/* 61564 */ {(12<<2)|2,{119,111,0}}, +/* 61565 */ {(12<<2)|2,{119,111,0}}, +/* 61566 */ {(12<<2)|2,{119,111,0}}, +/* 61567 */ {(12<<2)|2,{119,111,0}}, +/* 61568 */ {(12<<2)|2,{119,115,0}}, +/* 61569 */ {(12<<2)|2,{119,115,0}}, +/* 61570 */ {(12<<2)|2,{119,115,0}}, +/* 61571 */ {(12<<2)|2,{119,115,0}}, +/* 61572 */ {(12<<2)|2,{119,115,0}}, +/* 61573 */ {(12<<2)|2,{119,115,0}}, +/* 61574 */ {(12<<2)|2,{119,115,0}}, +/* 61575 */ {(12<<2)|2,{119,115,0}}, +/* 61576 */ {(12<<2)|2,{119,115,0}}, +/* 61577 */ {(12<<2)|2,{119,115,0}}, +/* 61578 */ {(12<<2)|2,{119,115,0}}, +/* 61579 */ {(12<<2)|2,{119,115,0}}, +/* 61580 */ {(12<<2)|2,{119,115,0}}, +/* 61581 */ {(12<<2)|2,{119,115,0}}, +/* 61582 */ {(12<<2)|2,{119,115,0}}, +/* 61583 */ {(12<<2)|2,{119,115,0}}, +/* 61584 */ {(12<<2)|2,{119,116,0}}, +/* 61585 */ {(12<<2)|2,{119,116,0}}, +/* 61586 */ {(12<<2)|2,{119,116,0}}, +/* 61587 */ {(12<<2)|2,{119,116,0}}, +/* 61588 */ {(12<<2)|2,{119,116,0}}, +/* 61589 */ {(12<<2)|2,{119,116,0}}, +/* 61590 */ {(12<<2)|2,{119,116,0}}, +/* 61591 */ {(12<<2)|2,{119,116,0}}, +/* 61592 */ {(12<<2)|2,{119,116,0}}, +/* 61593 */ {(12<<2)|2,{119,116,0}}, +/* 61594 */ {(12<<2)|2,{119,116,0}}, +/* 61595 */ {(12<<2)|2,{119,116,0}}, +/* 61596 */ {(12<<2)|2,{119,116,0}}, +/* 61597 */ {(12<<2)|2,{119,116,0}}, +/* 61598 */ {(12<<2)|2,{119,116,0}}, +/* 61599 */ {(12<<2)|2,{119,116,0}}, +/* 61600 */ {(13<<2)|2,{119,32,0}}, +/* 61601 */ {(13<<2)|2,{119,32,0}}, +/* 61602 */ {(13<<2)|2,{119,32,0}}, +/* 61603 */ {(13<<2)|2,{119,32,0}}, +/* 61604 */ {(13<<2)|2,{119,32,0}}, +/* 61605 */ {(13<<2)|2,{119,32,0}}, +/* 61606 */ {(13<<2)|2,{119,32,0}}, +/* 61607 */ {(13<<2)|2,{119,32,0}}, +/* 61608 */ {(13<<2)|2,{119,37,0}}, +/* 61609 */ {(13<<2)|2,{119,37,0}}, +/* 61610 */ {(13<<2)|2,{119,37,0}}, +/* 61611 */ {(13<<2)|2,{119,37,0}}, +/* 61612 */ {(13<<2)|2,{119,37,0}}, +/* 61613 */ {(13<<2)|2,{119,37,0}}, +/* 61614 */ {(13<<2)|2,{119,37,0}}, +/* 61615 */ {(13<<2)|2,{119,37,0}}, +/* 61616 */ {(13<<2)|2,{119,45,0}}, +/* 61617 */ {(13<<2)|2,{119,45,0}}, +/* 61618 */ {(13<<2)|2,{119,45,0}}, +/* 61619 */ {(13<<2)|2,{119,45,0}}, +/* 61620 */ {(13<<2)|2,{119,45,0}}, +/* 61621 */ {(13<<2)|2,{119,45,0}}, +/* 61622 */ {(13<<2)|2,{119,45,0}}, +/* 61623 */ {(13<<2)|2,{119,45,0}}, +/* 61624 */ {(13<<2)|2,{119,46,0}}, +/* 61625 */ {(13<<2)|2,{119,46,0}}, +/* 61626 */ {(13<<2)|2,{119,46,0}}, +/* 61627 */ {(13<<2)|2,{119,46,0}}, +/* 61628 */ {(13<<2)|2,{119,46,0}}, +/* 61629 */ {(13<<2)|2,{119,46,0}}, +/* 61630 */ {(13<<2)|2,{119,46,0}}, +/* 61631 */ {(13<<2)|2,{119,46,0}}, +/* 61632 */ {(13<<2)|2,{119,47,0}}, +/* 61633 */ {(13<<2)|2,{119,47,0}}, +/* 61634 */ {(13<<2)|2,{119,47,0}}, +/* 61635 */ {(13<<2)|2,{119,47,0}}, +/* 61636 */ {(13<<2)|2,{119,47,0}}, +/* 61637 */ {(13<<2)|2,{119,47,0}}, +/* 61638 */ {(13<<2)|2,{119,47,0}}, +/* 61639 */ {(13<<2)|2,{119,47,0}}, +/* 61640 */ {(13<<2)|2,{119,51,0}}, +/* 61641 */ {(13<<2)|2,{119,51,0}}, +/* 61642 */ {(13<<2)|2,{119,51,0}}, +/* 61643 */ {(13<<2)|2,{119,51,0}}, +/* 61644 */ {(13<<2)|2,{119,51,0}}, +/* 61645 */ {(13<<2)|2,{119,51,0}}, +/* 61646 */ {(13<<2)|2,{119,51,0}}, +/* 61647 */ {(13<<2)|2,{119,51,0}}, +/* 61648 */ {(13<<2)|2,{119,52,0}}, +/* 61649 */ {(13<<2)|2,{119,52,0}}, +/* 61650 */ {(13<<2)|2,{119,52,0}}, +/* 61651 */ {(13<<2)|2,{119,52,0}}, +/* 61652 */ {(13<<2)|2,{119,52,0}}, +/* 61653 */ {(13<<2)|2,{119,52,0}}, +/* 61654 */ {(13<<2)|2,{119,52,0}}, +/* 61655 */ {(13<<2)|2,{119,52,0}}, +/* 61656 */ {(13<<2)|2,{119,53,0}}, +/* 61657 */ {(13<<2)|2,{119,53,0}}, +/* 61658 */ {(13<<2)|2,{119,53,0}}, +/* 61659 */ {(13<<2)|2,{119,53,0}}, +/* 61660 */ {(13<<2)|2,{119,53,0}}, +/* 61661 */ {(13<<2)|2,{119,53,0}}, +/* 61662 */ {(13<<2)|2,{119,53,0}}, +/* 61663 */ {(13<<2)|2,{119,53,0}}, +/* 61664 */ {(13<<2)|2,{119,54,0}}, +/* 61665 */ {(13<<2)|2,{119,54,0}}, +/* 61666 */ {(13<<2)|2,{119,54,0}}, +/* 61667 */ {(13<<2)|2,{119,54,0}}, +/* 61668 */ {(13<<2)|2,{119,54,0}}, +/* 61669 */ {(13<<2)|2,{119,54,0}}, +/* 61670 */ {(13<<2)|2,{119,54,0}}, +/* 61671 */ {(13<<2)|2,{119,54,0}}, +/* 61672 */ {(13<<2)|2,{119,55,0}}, +/* 61673 */ {(13<<2)|2,{119,55,0}}, +/* 61674 */ {(13<<2)|2,{119,55,0}}, +/* 61675 */ {(13<<2)|2,{119,55,0}}, +/* 61676 */ {(13<<2)|2,{119,55,0}}, +/* 61677 */ {(13<<2)|2,{119,55,0}}, +/* 61678 */ {(13<<2)|2,{119,55,0}}, +/* 61679 */ {(13<<2)|2,{119,55,0}}, +/* 61680 */ {(13<<2)|2,{119,56,0}}, +/* 61681 */ {(13<<2)|2,{119,56,0}}, +/* 61682 */ {(13<<2)|2,{119,56,0}}, +/* 61683 */ {(13<<2)|2,{119,56,0}}, +/* 61684 */ {(13<<2)|2,{119,56,0}}, +/* 61685 */ {(13<<2)|2,{119,56,0}}, +/* 61686 */ {(13<<2)|2,{119,56,0}}, +/* 61687 */ {(13<<2)|2,{119,56,0}}, +/* 61688 */ {(13<<2)|2,{119,57,0}}, +/* 61689 */ {(13<<2)|2,{119,57,0}}, +/* 61690 */ {(13<<2)|2,{119,57,0}}, +/* 61691 */ {(13<<2)|2,{119,57,0}}, +/* 61692 */ {(13<<2)|2,{119,57,0}}, +/* 61693 */ {(13<<2)|2,{119,57,0}}, +/* 61694 */ {(13<<2)|2,{119,57,0}}, +/* 61695 */ {(13<<2)|2,{119,57,0}}, +/* 61696 */ {(13<<2)|2,{119,61,0}}, +/* 61697 */ {(13<<2)|2,{119,61,0}}, +/* 61698 */ {(13<<2)|2,{119,61,0}}, +/* 61699 */ {(13<<2)|2,{119,61,0}}, +/* 61700 */ {(13<<2)|2,{119,61,0}}, +/* 61701 */ {(13<<2)|2,{119,61,0}}, +/* 61702 */ {(13<<2)|2,{119,61,0}}, +/* 61703 */ {(13<<2)|2,{119,61,0}}, +/* 61704 */ {(13<<2)|2,{119,65,0}}, +/* 61705 */ {(13<<2)|2,{119,65,0}}, +/* 61706 */ {(13<<2)|2,{119,65,0}}, +/* 61707 */ {(13<<2)|2,{119,65,0}}, +/* 61708 */ {(13<<2)|2,{119,65,0}}, +/* 61709 */ {(13<<2)|2,{119,65,0}}, +/* 61710 */ {(13<<2)|2,{119,65,0}}, +/* 61711 */ {(13<<2)|2,{119,65,0}}, +/* 61712 */ {(13<<2)|2,{119,95,0}}, +/* 61713 */ {(13<<2)|2,{119,95,0}}, +/* 61714 */ {(13<<2)|2,{119,95,0}}, +/* 61715 */ {(13<<2)|2,{119,95,0}}, +/* 61716 */ {(13<<2)|2,{119,95,0}}, +/* 61717 */ {(13<<2)|2,{119,95,0}}, +/* 61718 */ {(13<<2)|2,{119,95,0}}, +/* 61719 */ {(13<<2)|2,{119,95,0}}, +/* 61720 */ {(13<<2)|2,{119,98,0}}, +/* 61721 */ {(13<<2)|2,{119,98,0}}, +/* 61722 */ {(13<<2)|2,{119,98,0}}, +/* 61723 */ {(13<<2)|2,{119,98,0}}, +/* 61724 */ {(13<<2)|2,{119,98,0}}, +/* 61725 */ {(13<<2)|2,{119,98,0}}, +/* 61726 */ {(13<<2)|2,{119,98,0}}, +/* 61727 */ {(13<<2)|2,{119,98,0}}, +/* 61728 */ {(13<<2)|2,{119,100,0}}, +/* 61729 */ {(13<<2)|2,{119,100,0}}, +/* 61730 */ {(13<<2)|2,{119,100,0}}, +/* 61731 */ {(13<<2)|2,{119,100,0}}, +/* 61732 */ {(13<<2)|2,{119,100,0}}, +/* 61733 */ {(13<<2)|2,{119,100,0}}, +/* 61734 */ {(13<<2)|2,{119,100,0}}, +/* 61735 */ {(13<<2)|2,{119,100,0}}, +/* 61736 */ {(13<<2)|2,{119,102,0}}, +/* 61737 */ {(13<<2)|2,{119,102,0}}, +/* 61738 */ {(13<<2)|2,{119,102,0}}, +/* 61739 */ {(13<<2)|2,{119,102,0}}, +/* 61740 */ {(13<<2)|2,{119,102,0}}, +/* 61741 */ {(13<<2)|2,{119,102,0}}, +/* 61742 */ {(13<<2)|2,{119,102,0}}, +/* 61743 */ {(13<<2)|2,{119,102,0}}, +/* 61744 */ {(13<<2)|2,{119,103,0}}, +/* 61745 */ {(13<<2)|2,{119,103,0}}, +/* 61746 */ {(13<<2)|2,{119,103,0}}, +/* 61747 */ {(13<<2)|2,{119,103,0}}, +/* 61748 */ {(13<<2)|2,{119,103,0}}, +/* 61749 */ {(13<<2)|2,{119,103,0}}, +/* 61750 */ {(13<<2)|2,{119,103,0}}, +/* 61751 */ {(13<<2)|2,{119,103,0}}, +/* 61752 */ {(13<<2)|2,{119,104,0}}, +/* 61753 */ {(13<<2)|2,{119,104,0}}, +/* 61754 */ {(13<<2)|2,{119,104,0}}, +/* 61755 */ {(13<<2)|2,{119,104,0}}, +/* 61756 */ {(13<<2)|2,{119,104,0}}, +/* 61757 */ {(13<<2)|2,{119,104,0}}, +/* 61758 */ {(13<<2)|2,{119,104,0}}, +/* 61759 */ {(13<<2)|2,{119,104,0}}, +/* 61760 */ {(13<<2)|2,{119,108,0}}, +/* 61761 */ {(13<<2)|2,{119,108,0}}, +/* 61762 */ {(13<<2)|2,{119,108,0}}, +/* 61763 */ {(13<<2)|2,{119,108,0}}, +/* 61764 */ {(13<<2)|2,{119,108,0}}, +/* 61765 */ {(13<<2)|2,{119,108,0}}, +/* 61766 */ {(13<<2)|2,{119,108,0}}, +/* 61767 */ {(13<<2)|2,{119,108,0}}, +/* 61768 */ {(13<<2)|2,{119,109,0}}, +/* 61769 */ {(13<<2)|2,{119,109,0}}, +/* 61770 */ {(13<<2)|2,{119,109,0}}, +/* 61771 */ {(13<<2)|2,{119,109,0}}, +/* 61772 */ {(13<<2)|2,{119,109,0}}, +/* 61773 */ {(13<<2)|2,{119,109,0}}, +/* 61774 */ {(13<<2)|2,{119,109,0}}, +/* 61775 */ {(13<<2)|2,{119,109,0}}, +/* 61776 */ {(13<<2)|2,{119,110,0}}, +/* 61777 */ {(13<<2)|2,{119,110,0}}, +/* 61778 */ {(13<<2)|2,{119,110,0}}, +/* 61779 */ {(13<<2)|2,{119,110,0}}, +/* 61780 */ {(13<<2)|2,{119,110,0}}, +/* 61781 */ {(13<<2)|2,{119,110,0}}, +/* 61782 */ {(13<<2)|2,{119,110,0}}, +/* 61783 */ {(13<<2)|2,{119,110,0}}, +/* 61784 */ {(13<<2)|2,{119,112,0}}, +/* 61785 */ {(13<<2)|2,{119,112,0}}, +/* 61786 */ {(13<<2)|2,{119,112,0}}, +/* 61787 */ {(13<<2)|2,{119,112,0}}, +/* 61788 */ {(13<<2)|2,{119,112,0}}, +/* 61789 */ {(13<<2)|2,{119,112,0}}, +/* 61790 */ {(13<<2)|2,{119,112,0}}, +/* 61791 */ {(13<<2)|2,{119,112,0}}, +/* 61792 */ {(13<<2)|2,{119,114,0}}, +/* 61793 */ {(13<<2)|2,{119,114,0}}, +/* 61794 */ {(13<<2)|2,{119,114,0}}, +/* 61795 */ {(13<<2)|2,{119,114,0}}, +/* 61796 */ {(13<<2)|2,{119,114,0}}, +/* 61797 */ {(13<<2)|2,{119,114,0}}, +/* 61798 */ {(13<<2)|2,{119,114,0}}, +/* 61799 */ {(13<<2)|2,{119,114,0}}, +/* 61800 */ {(13<<2)|2,{119,117,0}}, +/* 61801 */ {(13<<2)|2,{119,117,0}}, +/* 61802 */ {(13<<2)|2,{119,117,0}}, +/* 61803 */ {(13<<2)|2,{119,117,0}}, +/* 61804 */ {(13<<2)|2,{119,117,0}}, +/* 61805 */ {(13<<2)|2,{119,117,0}}, +/* 61806 */ {(13<<2)|2,{119,117,0}}, +/* 61807 */ {(13<<2)|2,{119,117,0}}, +/* 61808 */ {(14<<2)|2,{119,58,0}}, +/* 61809 */ {(14<<2)|2,{119,58,0}}, +/* 61810 */ {(14<<2)|2,{119,58,0}}, +/* 61811 */ {(14<<2)|2,{119,58,0}}, +/* 61812 */ {(14<<2)|2,{119,66,0}}, +/* 61813 */ {(14<<2)|2,{119,66,0}}, +/* 61814 */ {(14<<2)|2,{119,66,0}}, +/* 61815 */ {(14<<2)|2,{119,66,0}}, +/* 61816 */ {(14<<2)|2,{119,67,0}}, +/* 61817 */ {(14<<2)|2,{119,67,0}}, +/* 61818 */ {(14<<2)|2,{119,67,0}}, +/* 61819 */ {(14<<2)|2,{119,67,0}}, +/* 61820 */ {(14<<2)|2,{119,68,0}}, +/* 61821 */ {(14<<2)|2,{119,68,0}}, +/* 61822 */ {(14<<2)|2,{119,68,0}}, +/* 61823 */ {(14<<2)|2,{119,68,0}}, +/* 61824 */ {(14<<2)|2,{119,69,0}}, +/* 61825 */ {(14<<2)|2,{119,69,0}}, +/* 61826 */ {(14<<2)|2,{119,69,0}}, +/* 61827 */ {(14<<2)|2,{119,69,0}}, +/* 61828 */ {(14<<2)|2,{119,70,0}}, +/* 61829 */ {(14<<2)|2,{119,70,0}}, +/* 61830 */ {(14<<2)|2,{119,70,0}}, +/* 61831 */ {(14<<2)|2,{119,70,0}}, +/* 61832 */ {(14<<2)|2,{119,71,0}}, +/* 61833 */ {(14<<2)|2,{119,71,0}}, +/* 61834 */ {(14<<2)|2,{119,71,0}}, +/* 61835 */ {(14<<2)|2,{119,71,0}}, +/* 61836 */ {(14<<2)|2,{119,72,0}}, +/* 61837 */ {(14<<2)|2,{119,72,0}}, +/* 61838 */ {(14<<2)|2,{119,72,0}}, +/* 61839 */ {(14<<2)|2,{119,72,0}}, +/* 61840 */ {(14<<2)|2,{119,73,0}}, +/* 61841 */ {(14<<2)|2,{119,73,0}}, +/* 61842 */ {(14<<2)|2,{119,73,0}}, +/* 61843 */ {(14<<2)|2,{119,73,0}}, +/* 61844 */ {(14<<2)|2,{119,74,0}}, +/* 61845 */ {(14<<2)|2,{119,74,0}}, +/* 61846 */ {(14<<2)|2,{119,74,0}}, +/* 61847 */ {(14<<2)|2,{119,74,0}}, +/* 61848 */ {(14<<2)|2,{119,75,0}}, +/* 61849 */ {(14<<2)|2,{119,75,0}}, +/* 61850 */ {(14<<2)|2,{119,75,0}}, +/* 61851 */ {(14<<2)|2,{119,75,0}}, +/* 61852 */ {(14<<2)|2,{119,76,0}}, +/* 61853 */ {(14<<2)|2,{119,76,0}}, +/* 61854 */ {(14<<2)|2,{119,76,0}}, +/* 61855 */ {(14<<2)|2,{119,76,0}}, +/* 61856 */ {(14<<2)|2,{119,77,0}}, +/* 61857 */ {(14<<2)|2,{119,77,0}}, +/* 61858 */ {(14<<2)|2,{119,77,0}}, +/* 61859 */ {(14<<2)|2,{119,77,0}}, +/* 61860 */ {(14<<2)|2,{119,78,0}}, +/* 61861 */ {(14<<2)|2,{119,78,0}}, +/* 61862 */ {(14<<2)|2,{119,78,0}}, +/* 61863 */ {(14<<2)|2,{119,78,0}}, +/* 61864 */ {(14<<2)|2,{119,79,0}}, +/* 61865 */ {(14<<2)|2,{119,79,0}}, +/* 61866 */ {(14<<2)|2,{119,79,0}}, +/* 61867 */ {(14<<2)|2,{119,79,0}}, +/* 61868 */ {(14<<2)|2,{119,80,0}}, +/* 61869 */ {(14<<2)|2,{119,80,0}}, +/* 61870 */ {(14<<2)|2,{119,80,0}}, +/* 61871 */ {(14<<2)|2,{119,80,0}}, +/* 61872 */ {(14<<2)|2,{119,81,0}}, +/* 61873 */ {(14<<2)|2,{119,81,0}}, +/* 61874 */ {(14<<2)|2,{119,81,0}}, +/* 61875 */ {(14<<2)|2,{119,81,0}}, +/* 61876 */ {(14<<2)|2,{119,82,0}}, +/* 61877 */ {(14<<2)|2,{119,82,0}}, +/* 61878 */ {(14<<2)|2,{119,82,0}}, +/* 61879 */ {(14<<2)|2,{119,82,0}}, +/* 61880 */ {(14<<2)|2,{119,83,0}}, +/* 61881 */ {(14<<2)|2,{119,83,0}}, +/* 61882 */ {(14<<2)|2,{119,83,0}}, +/* 61883 */ {(14<<2)|2,{119,83,0}}, +/* 61884 */ {(14<<2)|2,{119,84,0}}, +/* 61885 */ {(14<<2)|2,{119,84,0}}, +/* 61886 */ {(14<<2)|2,{119,84,0}}, +/* 61887 */ {(14<<2)|2,{119,84,0}}, +/* 61888 */ {(14<<2)|2,{119,85,0}}, +/* 61889 */ {(14<<2)|2,{119,85,0}}, +/* 61890 */ {(14<<2)|2,{119,85,0}}, +/* 61891 */ {(14<<2)|2,{119,85,0}}, +/* 61892 */ {(14<<2)|2,{119,86,0}}, +/* 61893 */ {(14<<2)|2,{119,86,0}}, +/* 61894 */ {(14<<2)|2,{119,86,0}}, +/* 61895 */ {(14<<2)|2,{119,86,0}}, +/* 61896 */ {(14<<2)|2,{119,87,0}}, +/* 61897 */ {(14<<2)|2,{119,87,0}}, +/* 61898 */ {(14<<2)|2,{119,87,0}}, +/* 61899 */ {(14<<2)|2,{119,87,0}}, +/* 61900 */ {(14<<2)|2,{119,89,0}}, +/* 61901 */ {(14<<2)|2,{119,89,0}}, +/* 61902 */ {(14<<2)|2,{119,89,0}}, +/* 61903 */ {(14<<2)|2,{119,89,0}}, +/* 61904 */ {(14<<2)|2,{119,106,0}}, +/* 61905 */ {(14<<2)|2,{119,106,0}}, +/* 61906 */ {(14<<2)|2,{119,106,0}}, +/* 61907 */ {(14<<2)|2,{119,106,0}}, +/* 61908 */ {(14<<2)|2,{119,107,0}}, +/* 61909 */ {(14<<2)|2,{119,107,0}}, +/* 61910 */ {(14<<2)|2,{119,107,0}}, +/* 61911 */ {(14<<2)|2,{119,107,0}}, +/* 61912 */ {(14<<2)|2,{119,113,0}}, +/* 61913 */ {(14<<2)|2,{119,113,0}}, +/* 61914 */ {(14<<2)|2,{119,113,0}}, +/* 61915 */ {(14<<2)|2,{119,113,0}}, +/* 61916 */ {(14<<2)|2,{119,118,0}}, +/* 61917 */ {(14<<2)|2,{119,118,0}}, +/* 61918 */ {(14<<2)|2,{119,118,0}}, +/* 61919 */ {(14<<2)|2,{119,118,0}}, +/* 61920 */ {(14<<2)|2,{119,119,0}}, +/* 61921 */ {(14<<2)|2,{119,119,0}}, +/* 61922 */ {(14<<2)|2,{119,119,0}}, +/* 61923 */ {(14<<2)|2,{119,119,0}}, +/* 61924 */ {(14<<2)|2,{119,120,0}}, +/* 61925 */ {(14<<2)|2,{119,120,0}}, +/* 61926 */ {(14<<2)|2,{119,120,0}}, +/* 61927 */ {(14<<2)|2,{119,120,0}}, +/* 61928 */ {(14<<2)|2,{119,121,0}}, +/* 61929 */ {(14<<2)|2,{119,121,0}}, +/* 61930 */ {(14<<2)|2,{119,121,0}}, +/* 61931 */ {(14<<2)|2,{119,121,0}}, +/* 61932 */ {(14<<2)|2,{119,122,0}}, +/* 61933 */ {(14<<2)|2,{119,122,0}}, +/* 61934 */ {(14<<2)|2,{119,122,0}}, +/* 61935 */ {(14<<2)|2,{119,122,0}}, +/* 61936 */ {(15<<2)|2,{119,38,0}}, +/* 61937 */ {(15<<2)|2,{119,38,0}}, +/* 61938 */ {(15<<2)|2,{119,42,0}}, +/* 61939 */ {(15<<2)|2,{119,42,0}}, +/* 61940 */ {(15<<2)|2,{119,44,0}}, +/* 61941 */ {(15<<2)|2,{119,44,0}}, +/* 61942 */ {(15<<2)|2,{119,59,0}}, +/* 61943 */ {(15<<2)|2,{119,59,0}}, +/* 61944 */ {(15<<2)|2,{119,88,0}}, +/* 61945 */ {(15<<2)|2,{119,88,0}}, +/* 61946 */ {(15<<2)|2,{119,90,0}}, +/* 61947 */ {(15<<2)|2,{119,90,0}}, +/* 61948 */ {(7<<2)|1,{119,0,0}}, +/* 61949 */ {(7<<2)|1,{119,0,0}}, +/* 61950 */ {(7<<2)|1,{119,0,0}}, +/* 61951 */ {(7<<2)|1,{119,0,0}}, +/* 61952 */ {(12<<2)|2,{120,48,0}}, +/* 61953 */ {(12<<2)|2,{120,48,0}}, +/* 61954 */ {(12<<2)|2,{120,48,0}}, +/* 61955 */ {(12<<2)|2,{120,48,0}}, +/* 61956 */ {(12<<2)|2,{120,48,0}}, +/* 61957 */ {(12<<2)|2,{120,48,0}}, +/* 61958 */ {(12<<2)|2,{120,48,0}}, +/* 61959 */ {(12<<2)|2,{120,48,0}}, +/* 61960 */ {(12<<2)|2,{120,48,0}}, +/* 61961 */ {(12<<2)|2,{120,48,0}}, +/* 61962 */ {(12<<2)|2,{120,48,0}}, +/* 61963 */ {(12<<2)|2,{120,48,0}}, +/* 61964 */ {(12<<2)|2,{120,48,0}}, +/* 61965 */ {(12<<2)|2,{120,48,0}}, +/* 61966 */ {(12<<2)|2,{120,48,0}}, +/* 61967 */ {(12<<2)|2,{120,48,0}}, +/* 61968 */ {(12<<2)|2,{120,49,0}}, +/* 61969 */ {(12<<2)|2,{120,49,0}}, +/* 61970 */ {(12<<2)|2,{120,49,0}}, +/* 61971 */ {(12<<2)|2,{120,49,0}}, +/* 61972 */ {(12<<2)|2,{120,49,0}}, +/* 61973 */ {(12<<2)|2,{120,49,0}}, +/* 61974 */ {(12<<2)|2,{120,49,0}}, +/* 61975 */ {(12<<2)|2,{120,49,0}}, +/* 61976 */ {(12<<2)|2,{120,49,0}}, +/* 61977 */ {(12<<2)|2,{120,49,0}}, +/* 61978 */ {(12<<2)|2,{120,49,0}}, +/* 61979 */ {(12<<2)|2,{120,49,0}}, +/* 61980 */ {(12<<2)|2,{120,49,0}}, +/* 61981 */ {(12<<2)|2,{120,49,0}}, +/* 61982 */ {(12<<2)|2,{120,49,0}}, +/* 61983 */ {(12<<2)|2,{120,49,0}}, +/* 61984 */ {(12<<2)|2,{120,50,0}}, +/* 61985 */ {(12<<2)|2,{120,50,0}}, +/* 61986 */ {(12<<2)|2,{120,50,0}}, +/* 61987 */ {(12<<2)|2,{120,50,0}}, +/* 61988 */ {(12<<2)|2,{120,50,0}}, +/* 61989 */ {(12<<2)|2,{120,50,0}}, +/* 61990 */ {(12<<2)|2,{120,50,0}}, +/* 61991 */ {(12<<2)|2,{120,50,0}}, +/* 61992 */ {(12<<2)|2,{120,50,0}}, +/* 61993 */ {(12<<2)|2,{120,50,0}}, +/* 61994 */ {(12<<2)|2,{120,50,0}}, +/* 61995 */ {(12<<2)|2,{120,50,0}}, +/* 61996 */ {(12<<2)|2,{120,50,0}}, +/* 61997 */ {(12<<2)|2,{120,50,0}}, +/* 61998 */ {(12<<2)|2,{120,50,0}}, +/* 61999 */ {(12<<2)|2,{120,50,0}}, +/* 62000 */ {(12<<2)|2,{120,97,0}}, +/* 62001 */ {(12<<2)|2,{120,97,0}}, +/* 62002 */ {(12<<2)|2,{120,97,0}}, +/* 62003 */ {(12<<2)|2,{120,97,0}}, +/* 62004 */ {(12<<2)|2,{120,97,0}}, +/* 62005 */ {(12<<2)|2,{120,97,0}}, +/* 62006 */ {(12<<2)|2,{120,97,0}}, +/* 62007 */ {(12<<2)|2,{120,97,0}}, +/* 62008 */ {(12<<2)|2,{120,97,0}}, +/* 62009 */ {(12<<2)|2,{120,97,0}}, +/* 62010 */ {(12<<2)|2,{120,97,0}}, +/* 62011 */ {(12<<2)|2,{120,97,0}}, +/* 62012 */ {(12<<2)|2,{120,97,0}}, +/* 62013 */ {(12<<2)|2,{120,97,0}}, +/* 62014 */ {(12<<2)|2,{120,97,0}}, +/* 62015 */ {(12<<2)|2,{120,97,0}}, +/* 62016 */ {(12<<2)|2,{120,99,0}}, +/* 62017 */ {(12<<2)|2,{120,99,0}}, +/* 62018 */ {(12<<2)|2,{120,99,0}}, +/* 62019 */ {(12<<2)|2,{120,99,0}}, +/* 62020 */ {(12<<2)|2,{120,99,0}}, +/* 62021 */ {(12<<2)|2,{120,99,0}}, +/* 62022 */ {(12<<2)|2,{120,99,0}}, +/* 62023 */ {(12<<2)|2,{120,99,0}}, +/* 62024 */ {(12<<2)|2,{120,99,0}}, +/* 62025 */ {(12<<2)|2,{120,99,0}}, +/* 62026 */ {(12<<2)|2,{120,99,0}}, +/* 62027 */ {(12<<2)|2,{120,99,0}}, +/* 62028 */ {(12<<2)|2,{120,99,0}}, +/* 62029 */ {(12<<2)|2,{120,99,0}}, +/* 62030 */ {(12<<2)|2,{120,99,0}}, +/* 62031 */ {(12<<2)|2,{120,99,0}}, +/* 62032 */ {(12<<2)|2,{120,101,0}}, +/* 62033 */ {(12<<2)|2,{120,101,0}}, +/* 62034 */ {(12<<2)|2,{120,101,0}}, +/* 62035 */ {(12<<2)|2,{120,101,0}}, +/* 62036 */ {(12<<2)|2,{120,101,0}}, +/* 62037 */ {(12<<2)|2,{120,101,0}}, +/* 62038 */ {(12<<2)|2,{120,101,0}}, +/* 62039 */ {(12<<2)|2,{120,101,0}}, +/* 62040 */ {(12<<2)|2,{120,101,0}}, +/* 62041 */ {(12<<2)|2,{120,101,0}}, +/* 62042 */ {(12<<2)|2,{120,101,0}}, +/* 62043 */ {(12<<2)|2,{120,101,0}}, +/* 62044 */ {(12<<2)|2,{120,101,0}}, +/* 62045 */ {(12<<2)|2,{120,101,0}}, +/* 62046 */ {(12<<2)|2,{120,101,0}}, +/* 62047 */ {(12<<2)|2,{120,101,0}}, +/* 62048 */ {(12<<2)|2,{120,105,0}}, +/* 62049 */ {(12<<2)|2,{120,105,0}}, +/* 62050 */ {(12<<2)|2,{120,105,0}}, +/* 62051 */ {(12<<2)|2,{120,105,0}}, +/* 62052 */ {(12<<2)|2,{120,105,0}}, +/* 62053 */ {(12<<2)|2,{120,105,0}}, +/* 62054 */ {(12<<2)|2,{120,105,0}}, +/* 62055 */ {(12<<2)|2,{120,105,0}}, +/* 62056 */ {(12<<2)|2,{120,105,0}}, +/* 62057 */ {(12<<2)|2,{120,105,0}}, +/* 62058 */ {(12<<2)|2,{120,105,0}}, +/* 62059 */ {(12<<2)|2,{120,105,0}}, +/* 62060 */ {(12<<2)|2,{120,105,0}}, +/* 62061 */ {(12<<2)|2,{120,105,0}}, +/* 62062 */ {(12<<2)|2,{120,105,0}}, +/* 62063 */ {(12<<2)|2,{120,105,0}}, +/* 62064 */ {(12<<2)|2,{120,111,0}}, +/* 62065 */ {(12<<2)|2,{120,111,0}}, +/* 62066 */ {(12<<2)|2,{120,111,0}}, +/* 62067 */ {(12<<2)|2,{120,111,0}}, +/* 62068 */ {(12<<2)|2,{120,111,0}}, +/* 62069 */ {(12<<2)|2,{120,111,0}}, +/* 62070 */ {(12<<2)|2,{120,111,0}}, +/* 62071 */ {(12<<2)|2,{120,111,0}}, +/* 62072 */ {(12<<2)|2,{120,111,0}}, +/* 62073 */ {(12<<2)|2,{120,111,0}}, +/* 62074 */ {(12<<2)|2,{120,111,0}}, +/* 62075 */ {(12<<2)|2,{120,111,0}}, +/* 62076 */ {(12<<2)|2,{120,111,0}}, +/* 62077 */ {(12<<2)|2,{120,111,0}}, +/* 62078 */ {(12<<2)|2,{120,111,0}}, +/* 62079 */ {(12<<2)|2,{120,111,0}}, +/* 62080 */ {(12<<2)|2,{120,115,0}}, +/* 62081 */ {(12<<2)|2,{120,115,0}}, +/* 62082 */ {(12<<2)|2,{120,115,0}}, +/* 62083 */ {(12<<2)|2,{120,115,0}}, +/* 62084 */ {(12<<2)|2,{120,115,0}}, +/* 62085 */ {(12<<2)|2,{120,115,0}}, +/* 62086 */ {(12<<2)|2,{120,115,0}}, +/* 62087 */ {(12<<2)|2,{120,115,0}}, +/* 62088 */ {(12<<2)|2,{120,115,0}}, +/* 62089 */ {(12<<2)|2,{120,115,0}}, +/* 62090 */ {(12<<2)|2,{120,115,0}}, +/* 62091 */ {(12<<2)|2,{120,115,0}}, +/* 62092 */ {(12<<2)|2,{120,115,0}}, +/* 62093 */ {(12<<2)|2,{120,115,0}}, +/* 62094 */ {(12<<2)|2,{120,115,0}}, +/* 62095 */ {(12<<2)|2,{120,115,0}}, +/* 62096 */ {(12<<2)|2,{120,116,0}}, +/* 62097 */ {(12<<2)|2,{120,116,0}}, +/* 62098 */ {(12<<2)|2,{120,116,0}}, +/* 62099 */ {(12<<2)|2,{120,116,0}}, +/* 62100 */ {(12<<2)|2,{120,116,0}}, +/* 62101 */ {(12<<2)|2,{120,116,0}}, +/* 62102 */ {(12<<2)|2,{120,116,0}}, +/* 62103 */ {(12<<2)|2,{120,116,0}}, +/* 62104 */ {(12<<2)|2,{120,116,0}}, +/* 62105 */ {(12<<2)|2,{120,116,0}}, +/* 62106 */ {(12<<2)|2,{120,116,0}}, +/* 62107 */ {(12<<2)|2,{120,116,0}}, +/* 62108 */ {(12<<2)|2,{120,116,0}}, +/* 62109 */ {(12<<2)|2,{120,116,0}}, +/* 62110 */ {(12<<2)|2,{120,116,0}}, +/* 62111 */ {(12<<2)|2,{120,116,0}}, +/* 62112 */ {(13<<2)|2,{120,32,0}}, +/* 62113 */ {(13<<2)|2,{120,32,0}}, +/* 62114 */ {(13<<2)|2,{120,32,0}}, +/* 62115 */ {(13<<2)|2,{120,32,0}}, +/* 62116 */ {(13<<2)|2,{120,32,0}}, +/* 62117 */ {(13<<2)|2,{120,32,0}}, +/* 62118 */ {(13<<2)|2,{120,32,0}}, +/* 62119 */ {(13<<2)|2,{120,32,0}}, +/* 62120 */ {(13<<2)|2,{120,37,0}}, +/* 62121 */ {(13<<2)|2,{120,37,0}}, +/* 62122 */ {(13<<2)|2,{120,37,0}}, +/* 62123 */ {(13<<2)|2,{120,37,0}}, +/* 62124 */ {(13<<2)|2,{120,37,0}}, +/* 62125 */ {(13<<2)|2,{120,37,0}}, +/* 62126 */ {(13<<2)|2,{120,37,0}}, +/* 62127 */ {(13<<2)|2,{120,37,0}}, +/* 62128 */ {(13<<2)|2,{120,45,0}}, +/* 62129 */ {(13<<2)|2,{120,45,0}}, +/* 62130 */ {(13<<2)|2,{120,45,0}}, +/* 62131 */ {(13<<2)|2,{120,45,0}}, +/* 62132 */ {(13<<2)|2,{120,45,0}}, +/* 62133 */ {(13<<2)|2,{120,45,0}}, +/* 62134 */ {(13<<2)|2,{120,45,0}}, +/* 62135 */ {(13<<2)|2,{120,45,0}}, +/* 62136 */ {(13<<2)|2,{120,46,0}}, +/* 62137 */ {(13<<2)|2,{120,46,0}}, +/* 62138 */ {(13<<2)|2,{120,46,0}}, +/* 62139 */ {(13<<2)|2,{120,46,0}}, +/* 62140 */ {(13<<2)|2,{120,46,0}}, +/* 62141 */ {(13<<2)|2,{120,46,0}}, +/* 62142 */ {(13<<2)|2,{120,46,0}}, +/* 62143 */ {(13<<2)|2,{120,46,0}}, +/* 62144 */ {(13<<2)|2,{120,47,0}}, +/* 62145 */ {(13<<2)|2,{120,47,0}}, +/* 62146 */ {(13<<2)|2,{120,47,0}}, +/* 62147 */ {(13<<2)|2,{120,47,0}}, +/* 62148 */ {(13<<2)|2,{120,47,0}}, +/* 62149 */ {(13<<2)|2,{120,47,0}}, +/* 62150 */ {(13<<2)|2,{120,47,0}}, +/* 62151 */ {(13<<2)|2,{120,47,0}}, +/* 62152 */ {(13<<2)|2,{120,51,0}}, +/* 62153 */ {(13<<2)|2,{120,51,0}}, +/* 62154 */ {(13<<2)|2,{120,51,0}}, +/* 62155 */ {(13<<2)|2,{120,51,0}}, +/* 62156 */ {(13<<2)|2,{120,51,0}}, +/* 62157 */ {(13<<2)|2,{120,51,0}}, +/* 62158 */ {(13<<2)|2,{120,51,0}}, +/* 62159 */ {(13<<2)|2,{120,51,0}}, +/* 62160 */ {(13<<2)|2,{120,52,0}}, +/* 62161 */ {(13<<2)|2,{120,52,0}}, +/* 62162 */ {(13<<2)|2,{120,52,0}}, +/* 62163 */ {(13<<2)|2,{120,52,0}}, +/* 62164 */ {(13<<2)|2,{120,52,0}}, +/* 62165 */ {(13<<2)|2,{120,52,0}}, +/* 62166 */ {(13<<2)|2,{120,52,0}}, +/* 62167 */ {(13<<2)|2,{120,52,0}}, +/* 62168 */ {(13<<2)|2,{120,53,0}}, +/* 62169 */ {(13<<2)|2,{120,53,0}}, +/* 62170 */ {(13<<2)|2,{120,53,0}}, +/* 62171 */ {(13<<2)|2,{120,53,0}}, +/* 62172 */ {(13<<2)|2,{120,53,0}}, +/* 62173 */ {(13<<2)|2,{120,53,0}}, +/* 62174 */ {(13<<2)|2,{120,53,0}}, +/* 62175 */ {(13<<2)|2,{120,53,0}}, +/* 62176 */ {(13<<2)|2,{120,54,0}}, +/* 62177 */ {(13<<2)|2,{120,54,0}}, +/* 62178 */ {(13<<2)|2,{120,54,0}}, +/* 62179 */ {(13<<2)|2,{120,54,0}}, +/* 62180 */ {(13<<2)|2,{120,54,0}}, +/* 62181 */ {(13<<2)|2,{120,54,0}}, +/* 62182 */ {(13<<2)|2,{120,54,0}}, +/* 62183 */ {(13<<2)|2,{120,54,0}}, +/* 62184 */ {(13<<2)|2,{120,55,0}}, +/* 62185 */ {(13<<2)|2,{120,55,0}}, +/* 62186 */ {(13<<2)|2,{120,55,0}}, +/* 62187 */ {(13<<2)|2,{120,55,0}}, +/* 62188 */ {(13<<2)|2,{120,55,0}}, +/* 62189 */ {(13<<2)|2,{120,55,0}}, +/* 62190 */ {(13<<2)|2,{120,55,0}}, +/* 62191 */ {(13<<2)|2,{120,55,0}}, +/* 62192 */ {(13<<2)|2,{120,56,0}}, +/* 62193 */ {(13<<2)|2,{120,56,0}}, +/* 62194 */ {(13<<2)|2,{120,56,0}}, +/* 62195 */ {(13<<2)|2,{120,56,0}}, +/* 62196 */ {(13<<2)|2,{120,56,0}}, +/* 62197 */ {(13<<2)|2,{120,56,0}}, +/* 62198 */ {(13<<2)|2,{120,56,0}}, +/* 62199 */ {(13<<2)|2,{120,56,0}}, +/* 62200 */ {(13<<2)|2,{120,57,0}}, +/* 62201 */ {(13<<2)|2,{120,57,0}}, +/* 62202 */ {(13<<2)|2,{120,57,0}}, +/* 62203 */ {(13<<2)|2,{120,57,0}}, +/* 62204 */ {(13<<2)|2,{120,57,0}}, +/* 62205 */ {(13<<2)|2,{120,57,0}}, +/* 62206 */ {(13<<2)|2,{120,57,0}}, +/* 62207 */ {(13<<2)|2,{120,57,0}}, +/* 62208 */ {(13<<2)|2,{120,61,0}}, +/* 62209 */ {(13<<2)|2,{120,61,0}}, +/* 62210 */ {(13<<2)|2,{120,61,0}}, +/* 62211 */ {(13<<2)|2,{120,61,0}}, +/* 62212 */ {(13<<2)|2,{120,61,0}}, +/* 62213 */ {(13<<2)|2,{120,61,0}}, +/* 62214 */ {(13<<2)|2,{120,61,0}}, +/* 62215 */ {(13<<2)|2,{120,61,0}}, +/* 62216 */ {(13<<2)|2,{120,65,0}}, +/* 62217 */ {(13<<2)|2,{120,65,0}}, +/* 62218 */ {(13<<2)|2,{120,65,0}}, +/* 62219 */ {(13<<2)|2,{120,65,0}}, +/* 62220 */ {(13<<2)|2,{120,65,0}}, +/* 62221 */ {(13<<2)|2,{120,65,0}}, +/* 62222 */ {(13<<2)|2,{120,65,0}}, +/* 62223 */ {(13<<2)|2,{120,65,0}}, +/* 62224 */ {(13<<2)|2,{120,95,0}}, +/* 62225 */ {(13<<2)|2,{120,95,0}}, +/* 62226 */ {(13<<2)|2,{120,95,0}}, +/* 62227 */ {(13<<2)|2,{120,95,0}}, +/* 62228 */ {(13<<2)|2,{120,95,0}}, +/* 62229 */ {(13<<2)|2,{120,95,0}}, +/* 62230 */ {(13<<2)|2,{120,95,0}}, +/* 62231 */ {(13<<2)|2,{120,95,0}}, +/* 62232 */ {(13<<2)|2,{120,98,0}}, +/* 62233 */ {(13<<2)|2,{120,98,0}}, +/* 62234 */ {(13<<2)|2,{120,98,0}}, +/* 62235 */ {(13<<2)|2,{120,98,0}}, +/* 62236 */ {(13<<2)|2,{120,98,0}}, +/* 62237 */ {(13<<2)|2,{120,98,0}}, +/* 62238 */ {(13<<2)|2,{120,98,0}}, +/* 62239 */ {(13<<2)|2,{120,98,0}}, +/* 62240 */ {(13<<2)|2,{120,100,0}}, +/* 62241 */ {(13<<2)|2,{120,100,0}}, +/* 62242 */ {(13<<2)|2,{120,100,0}}, +/* 62243 */ {(13<<2)|2,{120,100,0}}, +/* 62244 */ {(13<<2)|2,{120,100,0}}, +/* 62245 */ {(13<<2)|2,{120,100,0}}, +/* 62246 */ {(13<<2)|2,{120,100,0}}, +/* 62247 */ {(13<<2)|2,{120,100,0}}, +/* 62248 */ {(13<<2)|2,{120,102,0}}, +/* 62249 */ {(13<<2)|2,{120,102,0}}, +/* 62250 */ {(13<<2)|2,{120,102,0}}, +/* 62251 */ {(13<<2)|2,{120,102,0}}, +/* 62252 */ {(13<<2)|2,{120,102,0}}, +/* 62253 */ {(13<<2)|2,{120,102,0}}, +/* 62254 */ {(13<<2)|2,{120,102,0}}, +/* 62255 */ {(13<<2)|2,{120,102,0}}, +/* 62256 */ {(13<<2)|2,{120,103,0}}, +/* 62257 */ {(13<<2)|2,{120,103,0}}, +/* 62258 */ {(13<<2)|2,{120,103,0}}, +/* 62259 */ {(13<<2)|2,{120,103,0}}, +/* 62260 */ {(13<<2)|2,{120,103,0}}, +/* 62261 */ {(13<<2)|2,{120,103,0}}, +/* 62262 */ {(13<<2)|2,{120,103,0}}, +/* 62263 */ {(13<<2)|2,{120,103,0}}, +/* 62264 */ {(13<<2)|2,{120,104,0}}, +/* 62265 */ {(13<<2)|2,{120,104,0}}, +/* 62266 */ {(13<<2)|2,{120,104,0}}, +/* 62267 */ {(13<<2)|2,{120,104,0}}, +/* 62268 */ {(13<<2)|2,{120,104,0}}, +/* 62269 */ {(13<<2)|2,{120,104,0}}, +/* 62270 */ {(13<<2)|2,{120,104,0}}, +/* 62271 */ {(13<<2)|2,{120,104,0}}, +/* 62272 */ {(13<<2)|2,{120,108,0}}, +/* 62273 */ {(13<<2)|2,{120,108,0}}, +/* 62274 */ {(13<<2)|2,{120,108,0}}, +/* 62275 */ {(13<<2)|2,{120,108,0}}, +/* 62276 */ {(13<<2)|2,{120,108,0}}, +/* 62277 */ {(13<<2)|2,{120,108,0}}, +/* 62278 */ {(13<<2)|2,{120,108,0}}, +/* 62279 */ {(13<<2)|2,{120,108,0}}, +/* 62280 */ {(13<<2)|2,{120,109,0}}, +/* 62281 */ {(13<<2)|2,{120,109,0}}, +/* 62282 */ {(13<<2)|2,{120,109,0}}, +/* 62283 */ {(13<<2)|2,{120,109,0}}, +/* 62284 */ {(13<<2)|2,{120,109,0}}, +/* 62285 */ {(13<<2)|2,{120,109,0}}, +/* 62286 */ {(13<<2)|2,{120,109,0}}, +/* 62287 */ {(13<<2)|2,{120,109,0}}, +/* 62288 */ {(13<<2)|2,{120,110,0}}, +/* 62289 */ {(13<<2)|2,{120,110,0}}, +/* 62290 */ {(13<<2)|2,{120,110,0}}, +/* 62291 */ {(13<<2)|2,{120,110,0}}, +/* 62292 */ {(13<<2)|2,{120,110,0}}, +/* 62293 */ {(13<<2)|2,{120,110,0}}, +/* 62294 */ {(13<<2)|2,{120,110,0}}, +/* 62295 */ {(13<<2)|2,{120,110,0}}, +/* 62296 */ {(13<<2)|2,{120,112,0}}, +/* 62297 */ {(13<<2)|2,{120,112,0}}, +/* 62298 */ {(13<<2)|2,{120,112,0}}, +/* 62299 */ {(13<<2)|2,{120,112,0}}, +/* 62300 */ {(13<<2)|2,{120,112,0}}, +/* 62301 */ {(13<<2)|2,{120,112,0}}, +/* 62302 */ {(13<<2)|2,{120,112,0}}, +/* 62303 */ {(13<<2)|2,{120,112,0}}, +/* 62304 */ {(13<<2)|2,{120,114,0}}, +/* 62305 */ {(13<<2)|2,{120,114,0}}, +/* 62306 */ {(13<<2)|2,{120,114,0}}, +/* 62307 */ {(13<<2)|2,{120,114,0}}, +/* 62308 */ {(13<<2)|2,{120,114,0}}, +/* 62309 */ {(13<<2)|2,{120,114,0}}, +/* 62310 */ {(13<<2)|2,{120,114,0}}, +/* 62311 */ {(13<<2)|2,{120,114,0}}, +/* 62312 */ {(13<<2)|2,{120,117,0}}, +/* 62313 */ {(13<<2)|2,{120,117,0}}, +/* 62314 */ {(13<<2)|2,{120,117,0}}, +/* 62315 */ {(13<<2)|2,{120,117,0}}, +/* 62316 */ {(13<<2)|2,{120,117,0}}, +/* 62317 */ {(13<<2)|2,{120,117,0}}, +/* 62318 */ {(13<<2)|2,{120,117,0}}, +/* 62319 */ {(13<<2)|2,{120,117,0}}, +/* 62320 */ {(14<<2)|2,{120,58,0}}, +/* 62321 */ {(14<<2)|2,{120,58,0}}, +/* 62322 */ {(14<<2)|2,{120,58,0}}, +/* 62323 */ {(14<<2)|2,{120,58,0}}, +/* 62324 */ {(14<<2)|2,{120,66,0}}, +/* 62325 */ {(14<<2)|2,{120,66,0}}, +/* 62326 */ {(14<<2)|2,{120,66,0}}, +/* 62327 */ {(14<<2)|2,{120,66,0}}, +/* 62328 */ {(14<<2)|2,{120,67,0}}, +/* 62329 */ {(14<<2)|2,{120,67,0}}, +/* 62330 */ {(14<<2)|2,{120,67,0}}, +/* 62331 */ {(14<<2)|2,{120,67,0}}, +/* 62332 */ {(14<<2)|2,{120,68,0}}, +/* 62333 */ {(14<<2)|2,{120,68,0}}, +/* 62334 */ {(14<<2)|2,{120,68,0}}, +/* 62335 */ {(14<<2)|2,{120,68,0}}, +/* 62336 */ {(14<<2)|2,{120,69,0}}, +/* 62337 */ {(14<<2)|2,{120,69,0}}, +/* 62338 */ {(14<<2)|2,{120,69,0}}, +/* 62339 */ {(14<<2)|2,{120,69,0}}, +/* 62340 */ {(14<<2)|2,{120,70,0}}, +/* 62341 */ {(14<<2)|2,{120,70,0}}, +/* 62342 */ {(14<<2)|2,{120,70,0}}, +/* 62343 */ {(14<<2)|2,{120,70,0}}, +/* 62344 */ {(14<<2)|2,{120,71,0}}, +/* 62345 */ {(14<<2)|2,{120,71,0}}, +/* 62346 */ {(14<<2)|2,{120,71,0}}, +/* 62347 */ {(14<<2)|2,{120,71,0}}, +/* 62348 */ {(14<<2)|2,{120,72,0}}, +/* 62349 */ {(14<<2)|2,{120,72,0}}, +/* 62350 */ {(14<<2)|2,{120,72,0}}, +/* 62351 */ {(14<<2)|2,{120,72,0}}, +/* 62352 */ {(14<<2)|2,{120,73,0}}, +/* 62353 */ {(14<<2)|2,{120,73,0}}, +/* 62354 */ {(14<<2)|2,{120,73,0}}, +/* 62355 */ {(14<<2)|2,{120,73,0}}, +/* 62356 */ {(14<<2)|2,{120,74,0}}, +/* 62357 */ {(14<<2)|2,{120,74,0}}, +/* 62358 */ {(14<<2)|2,{120,74,0}}, +/* 62359 */ {(14<<2)|2,{120,74,0}}, +/* 62360 */ {(14<<2)|2,{120,75,0}}, +/* 62361 */ {(14<<2)|2,{120,75,0}}, +/* 62362 */ {(14<<2)|2,{120,75,0}}, +/* 62363 */ {(14<<2)|2,{120,75,0}}, +/* 62364 */ {(14<<2)|2,{120,76,0}}, +/* 62365 */ {(14<<2)|2,{120,76,0}}, +/* 62366 */ {(14<<2)|2,{120,76,0}}, +/* 62367 */ {(14<<2)|2,{120,76,0}}, +/* 62368 */ {(14<<2)|2,{120,77,0}}, +/* 62369 */ {(14<<2)|2,{120,77,0}}, +/* 62370 */ {(14<<2)|2,{120,77,0}}, +/* 62371 */ {(14<<2)|2,{120,77,0}}, +/* 62372 */ {(14<<2)|2,{120,78,0}}, +/* 62373 */ {(14<<2)|2,{120,78,0}}, +/* 62374 */ {(14<<2)|2,{120,78,0}}, +/* 62375 */ {(14<<2)|2,{120,78,0}}, +/* 62376 */ {(14<<2)|2,{120,79,0}}, +/* 62377 */ {(14<<2)|2,{120,79,0}}, +/* 62378 */ {(14<<2)|2,{120,79,0}}, +/* 62379 */ {(14<<2)|2,{120,79,0}}, +/* 62380 */ {(14<<2)|2,{120,80,0}}, +/* 62381 */ {(14<<2)|2,{120,80,0}}, +/* 62382 */ {(14<<2)|2,{120,80,0}}, +/* 62383 */ {(14<<2)|2,{120,80,0}}, +/* 62384 */ {(14<<2)|2,{120,81,0}}, +/* 62385 */ {(14<<2)|2,{120,81,0}}, +/* 62386 */ {(14<<2)|2,{120,81,0}}, +/* 62387 */ {(14<<2)|2,{120,81,0}}, +/* 62388 */ {(14<<2)|2,{120,82,0}}, +/* 62389 */ {(14<<2)|2,{120,82,0}}, +/* 62390 */ {(14<<2)|2,{120,82,0}}, +/* 62391 */ {(14<<2)|2,{120,82,0}}, +/* 62392 */ {(14<<2)|2,{120,83,0}}, +/* 62393 */ {(14<<2)|2,{120,83,0}}, +/* 62394 */ {(14<<2)|2,{120,83,0}}, +/* 62395 */ {(14<<2)|2,{120,83,0}}, +/* 62396 */ {(14<<2)|2,{120,84,0}}, +/* 62397 */ {(14<<2)|2,{120,84,0}}, +/* 62398 */ {(14<<2)|2,{120,84,0}}, +/* 62399 */ {(14<<2)|2,{120,84,0}}, +/* 62400 */ {(14<<2)|2,{120,85,0}}, +/* 62401 */ {(14<<2)|2,{120,85,0}}, +/* 62402 */ {(14<<2)|2,{120,85,0}}, +/* 62403 */ {(14<<2)|2,{120,85,0}}, +/* 62404 */ {(14<<2)|2,{120,86,0}}, +/* 62405 */ {(14<<2)|2,{120,86,0}}, +/* 62406 */ {(14<<2)|2,{120,86,0}}, +/* 62407 */ {(14<<2)|2,{120,86,0}}, +/* 62408 */ {(14<<2)|2,{120,87,0}}, +/* 62409 */ {(14<<2)|2,{120,87,0}}, +/* 62410 */ {(14<<2)|2,{120,87,0}}, +/* 62411 */ {(14<<2)|2,{120,87,0}}, +/* 62412 */ {(14<<2)|2,{120,89,0}}, +/* 62413 */ {(14<<2)|2,{120,89,0}}, +/* 62414 */ {(14<<2)|2,{120,89,0}}, +/* 62415 */ {(14<<2)|2,{120,89,0}}, +/* 62416 */ {(14<<2)|2,{120,106,0}}, +/* 62417 */ {(14<<2)|2,{120,106,0}}, +/* 62418 */ {(14<<2)|2,{120,106,0}}, +/* 62419 */ {(14<<2)|2,{120,106,0}}, +/* 62420 */ {(14<<2)|2,{120,107,0}}, +/* 62421 */ {(14<<2)|2,{120,107,0}}, +/* 62422 */ {(14<<2)|2,{120,107,0}}, +/* 62423 */ {(14<<2)|2,{120,107,0}}, +/* 62424 */ {(14<<2)|2,{120,113,0}}, +/* 62425 */ {(14<<2)|2,{120,113,0}}, +/* 62426 */ {(14<<2)|2,{120,113,0}}, +/* 62427 */ {(14<<2)|2,{120,113,0}}, +/* 62428 */ {(14<<2)|2,{120,118,0}}, +/* 62429 */ {(14<<2)|2,{120,118,0}}, +/* 62430 */ {(14<<2)|2,{120,118,0}}, +/* 62431 */ {(14<<2)|2,{120,118,0}}, +/* 62432 */ {(14<<2)|2,{120,119,0}}, +/* 62433 */ {(14<<2)|2,{120,119,0}}, +/* 62434 */ {(14<<2)|2,{120,119,0}}, +/* 62435 */ {(14<<2)|2,{120,119,0}}, +/* 62436 */ {(14<<2)|2,{120,120,0}}, +/* 62437 */ {(14<<2)|2,{120,120,0}}, +/* 62438 */ {(14<<2)|2,{120,120,0}}, +/* 62439 */ {(14<<2)|2,{120,120,0}}, +/* 62440 */ {(14<<2)|2,{120,121,0}}, +/* 62441 */ {(14<<2)|2,{120,121,0}}, +/* 62442 */ {(14<<2)|2,{120,121,0}}, +/* 62443 */ {(14<<2)|2,{120,121,0}}, +/* 62444 */ {(14<<2)|2,{120,122,0}}, +/* 62445 */ {(14<<2)|2,{120,122,0}}, +/* 62446 */ {(14<<2)|2,{120,122,0}}, +/* 62447 */ {(14<<2)|2,{120,122,0}}, +/* 62448 */ {(15<<2)|2,{120,38,0}}, +/* 62449 */ {(15<<2)|2,{120,38,0}}, +/* 62450 */ {(15<<2)|2,{120,42,0}}, +/* 62451 */ {(15<<2)|2,{120,42,0}}, +/* 62452 */ {(15<<2)|2,{120,44,0}}, +/* 62453 */ {(15<<2)|2,{120,44,0}}, +/* 62454 */ {(15<<2)|2,{120,59,0}}, +/* 62455 */ {(15<<2)|2,{120,59,0}}, +/* 62456 */ {(15<<2)|2,{120,88,0}}, +/* 62457 */ {(15<<2)|2,{120,88,0}}, +/* 62458 */ {(15<<2)|2,{120,90,0}}, +/* 62459 */ {(15<<2)|2,{120,90,0}}, +/* 62460 */ {(7<<2)|1,{120,0,0}}, +/* 62461 */ {(7<<2)|1,{120,0,0}}, +/* 62462 */ {(7<<2)|1,{120,0,0}}, +/* 62463 */ {(7<<2)|1,{120,0,0}}, +/* 62464 */ {(12<<2)|2,{121,48,0}}, +/* 62465 */ {(12<<2)|2,{121,48,0}}, +/* 62466 */ {(12<<2)|2,{121,48,0}}, +/* 62467 */ {(12<<2)|2,{121,48,0}}, +/* 62468 */ {(12<<2)|2,{121,48,0}}, +/* 62469 */ {(12<<2)|2,{121,48,0}}, +/* 62470 */ {(12<<2)|2,{121,48,0}}, +/* 62471 */ {(12<<2)|2,{121,48,0}}, +/* 62472 */ {(12<<2)|2,{121,48,0}}, +/* 62473 */ {(12<<2)|2,{121,48,0}}, +/* 62474 */ {(12<<2)|2,{121,48,0}}, +/* 62475 */ {(12<<2)|2,{121,48,0}}, +/* 62476 */ {(12<<2)|2,{121,48,0}}, +/* 62477 */ {(12<<2)|2,{121,48,0}}, +/* 62478 */ {(12<<2)|2,{121,48,0}}, +/* 62479 */ {(12<<2)|2,{121,48,0}}, +/* 62480 */ {(12<<2)|2,{121,49,0}}, +/* 62481 */ {(12<<2)|2,{121,49,0}}, +/* 62482 */ {(12<<2)|2,{121,49,0}}, +/* 62483 */ {(12<<2)|2,{121,49,0}}, +/* 62484 */ {(12<<2)|2,{121,49,0}}, +/* 62485 */ {(12<<2)|2,{121,49,0}}, +/* 62486 */ {(12<<2)|2,{121,49,0}}, +/* 62487 */ {(12<<2)|2,{121,49,0}}, +/* 62488 */ {(12<<2)|2,{121,49,0}}, +/* 62489 */ {(12<<2)|2,{121,49,0}}, +/* 62490 */ {(12<<2)|2,{121,49,0}}, +/* 62491 */ {(12<<2)|2,{121,49,0}}, +/* 62492 */ {(12<<2)|2,{121,49,0}}, +/* 62493 */ {(12<<2)|2,{121,49,0}}, +/* 62494 */ {(12<<2)|2,{121,49,0}}, +/* 62495 */ {(12<<2)|2,{121,49,0}}, +/* 62496 */ {(12<<2)|2,{121,50,0}}, +/* 62497 */ {(12<<2)|2,{121,50,0}}, +/* 62498 */ {(12<<2)|2,{121,50,0}}, +/* 62499 */ {(12<<2)|2,{121,50,0}}, +/* 62500 */ {(12<<2)|2,{121,50,0}}, +/* 62501 */ {(12<<2)|2,{121,50,0}}, +/* 62502 */ {(12<<2)|2,{121,50,0}}, +/* 62503 */ {(12<<2)|2,{121,50,0}}, +/* 62504 */ {(12<<2)|2,{121,50,0}}, +/* 62505 */ {(12<<2)|2,{121,50,0}}, +/* 62506 */ {(12<<2)|2,{121,50,0}}, +/* 62507 */ {(12<<2)|2,{121,50,0}}, +/* 62508 */ {(12<<2)|2,{121,50,0}}, +/* 62509 */ {(12<<2)|2,{121,50,0}}, +/* 62510 */ {(12<<2)|2,{121,50,0}}, +/* 62511 */ {(12<<2)|2,{121,50,0}}, +/* 62512 */ {(12<<2)|2,{121,97,0}}, +/* 62513 */ {(12<<2)|2,{121,97,0}}, +/* 62514 */ {(12<<2)|2,{121,97,0}}, +/* 62515 */ {(12<<2)|2,{121,97,0}}, +/* 62516 */ {(12<<2)|2,{121,97,0}}, +/* 62517 */ {(12<<2)|2,{121,97,0}}, +/* 62518 */ {(12<<2)|2,{121,97,0}}, +/* 62519 */ {(12<<2)|2,{121,97,0}}, +/* 62520 */ {(12<<2)|2,{121,97,0}}, +/* 62521 */ {(12<<2)|2,{121,97,0}}, +/* 62522 */ {(12<<2)|2,{121,97,0}}, +/* 62523 */ {(12<<2)|2,{121,97,0}}, +/* 62524 */ {(12<<2)|2,{121,97,0}}, +/* 62525 */ {(12<<2)|2,{121,97,0}}, +/* 62526 */ {(12<<2)|2,{121,97,0}}, +/* 62527 */ {(12<<2)|2,{121,97,0}}, +/* 62528 */ {(12<<2)|2,{121,99,0}}, +/* 62529 */ {(12<<2)|2,{121,99,0}}, +/* 62530 */ {(12<<2)|2,{121,99,0}}, +/* 62531 */ {(12<<2)|2,{121,99,0}}, +/* 62532 */ {(12<<2)|2,{121,99,0}}, +/* 62533 */ {(12<<2)|2,{121,99,0}}, +/* 62534 */ {(12<<2)|2,{121,99,0}}, +/* 62535 */ {(12<<2)|2,{121,99,0}}, +/* 62536 */ {(12<<2)|2,{121,99,0}}, +/* 62537 */ {(12<<2)|2,{121,99,0}}, +/* 62538 */ {(12<<2)|2,{121,99,0}}, +/* 62539 */ {(12<<2)|2,{121,99,0}}, +/* 62540 */ {(12<<2)|2,{121,99,0}}, +/* 62541 */ {(12<<2)|2,{121,99,0}}, +/* 62542 */ {(12<<2)|2,{121,99,0}}, +/* 62543 */ {(12<<2)|2,{121,99,0}}, +/* 62544 */ {(12<<2)|2,{121,101,0}}, +/* 62545 */ {(12<<2)|2,{121,101,0}}, +/* 62546 */ {(12<<2)|2,{121,101,0}}, +/* 62547 */ {(12<<2)|2,{121,101,0}}, +/* 62548 */ {(12<<2)|2,{121,101,0}}, +/* 62549 */ {(12<<2)|2,{121,101,0}}, +/* 62550 */ {(12<<2)|2,{121,101,0}}, +/* 62551 */ {(12<<2)|2,{121,101,0}}, +/* 62552 */ {(12<<2)|2,{121,101,0}}, +/* 62553 */ {(12<<2)|2,{121,101,0}}, +/* 62554 */ {(12<<2)|2,{121,101,0}}, +/* 62555 */ {(12<<2)|2,{121,101,0}}, +/* 62556 */ {(12<<2)|2,{121,101,0}}, +/* 62557 */ {(12<<2)|2,{121,101,0}}, +/* 62558 */ {(12<<2)|2,{121,101,0}}, +/* 62559 */ {(12<<2)|2,{121,101,0}}, +/* 62560 */ {(12<<2)|2,{121,105,0}}, +/* 62561 */ {(12<<2)|2,{121,105,0}}, +/* 62562 */ {(12<<2)|2,{121,105,0}}, +/* 62563 */ {(12<<2)|2,{121,105,0}}, +/* 62564 */ {(12<<2)|2,{121,105,0}}, +/* 62565 */ {(12<<2)|2,{121,105,0}}, +/* 62566 */ {(12<<2)|2,{121,105,0}}, +/* 62567 */ {(12<<2)|2,{121,105,0}}, +/* 62568 */ {(12<<2)|2,{121,105,0}}, +/* 62569 */ {(12<<2)|2,{121,105,0}}, +/* 62570 */ {(12<<2)|2,{121,105,0}}, +/* 62571 */ {(12<<2)|2,{121,105,0}}, +/* 62572 */ {(12<<2)|2,{121,105,0}}, +/* 62573 */ {(12<<2)|2,{121,105,0}}, +/* 62574 */ {(12<<2)|2,{121,105,0}}, +/* 62575 */ {(12<<2)|2,{121,105,0}}, +/* 62576 */ {(12<<2)|2,{121,111,0}}, +/* 62577 */ {(12<<2)|2,{121,111,0}}, +/* 62578 */ {(12<<2)|2,{121,111,0}}, +/* 62579 */ {(12<<2)|2,{121,111,0}}, +/* 62580 */ {(12<<2)|2,{121,111,0}}, +/* 62581 */ {(12<<2)|2,{121,111,0}}, +/* 62582 */ {(12<<2)|2,{121,111,0}}, +/* 62583 */ {(12<<2)|2,{121,111,0}}, +/* 62584 */ {(12<<2)|2,{121,111,0}}, +/* 62585 */ {(12<<2)|2,{121,111,0}}, +/* 62586 */ {(12<<2)|2,{121,111,0}}, +/* 62587 */ {(12<<2)|2,{121,111,0}}, +/* 62588 */ {(12<<2)|2,{121,111,0}}, +/* 62589 */ {(12<<2)|2,{121,111,0}}, +/* 62590 */ {(12<<2)|2,{121,111,0}}, +/* 62591 */ {(12<<2)|2,{121,111,0}}, +/* 62592 */ {(12<<2)|2,{121,115,0}}, +/* 62593 */ {(12<<2)|2,{121,115,0}}, +/* 62594 */ {(12<<2)|2,{121,115,0}}, +/* 62595 */ {(12<<2)|2,{121,115,0}}, +/* 62596 */ {(12<<2)|2,{121,115,0}}, +/* 62597 */ {(12<<2)|2,{121,115,0}}, +/* 62598 */ {(12<<2)|2,{121,115,0}}, +/* 62599 */ {(12<<2)|2,{121,115,0}}, +/* 62600 */ {(12<<2)|2,{121,115,0}}, +/* 62601 */ {(12<<2)|2,{121,115,0}}, +/* 62602 */ {(12<<2)|2,{121,115,0}}, +/* 62603 */ {(12<<2)|2,{121,115,0}}, +/* 62604 */ {(12<<2)|2,{121,115,0}}, +/* 62605 */ {(12<<2)|2,{121,115,0}}, +/* 62606 */ {(12<<2)|2,{121,115,0}}, +/* 62607 */ {(12<<2)|2,{121,115,0}}, +/* 62608 */ {(12<<2)|2,{121,116,0}}, +/* 62609 */ {(12<<2)|2,{121,116,0}}, +/* 62610 */ {(12<<2)|2,{121,116,0}}, +/* 62611 */ {(12<<2)|2,{121,116,0}}, +/* 62612 */ {(12<<2)|2,{121,116,0}}, +/* 62613 */ {(12<<2)|2,{121,116,0}}, +/* 62614 */ {(12<<2)|2,{121,116,0}}, +/* 62615 */ {(12<<2)|2,{121,116,0}}, +/* 62616 */ {(12<<2)|2,{121,116,0}}, +/* 62617 */ {(12<<2)|2,{121,116,0}}, +/* 62618 */ {(12<<2)|2,{121,116,0}}, +/* 62619 */ {(12<<2)|2,{121,116,0}}, +/* 62620 */ {(12<<2)|2,{121,116,0}}, +/* 62621 */ {(12<<2)|2,{121,116,0}}, +/* 62622 */ {(12<<2)|2,{121,116,0}}, +/* 62623 */ {(12<<2)|2,{121,116,0}}, +/* 62624 */ {(13<<2)|2,{121,32,0}}, +/* 62625 */ {(13<<2)|2,{121,32,0}}, +/* 62626 */ {(13<<2)|2,{121,32,0}}, +/* 62627 */ {(13<<2)|2,{121,32,0}}, +/* 62628 */ {(13<<2)|2,{121,32,0}}, +/* 62629 */ {(13<<2)|2,{121,32,0}}, +/* 62630 */ {(13<<2)|2,{121,32,0}}, +/* 62631 */ {(13<<2)|2,{121,32,0}}, +/* 62632 */ {(13<<2)|2,{121,37,0}}, +/* 62633 */ {(13<<2)|2,{121,37,0}}, +/* 62634 */ {(13<<2)|2,{121,37,0}}, +/* 62635 */ {(13<<2)|2,{121,37,0}}, +/* 62636 */ {(13<<2)|2,{121,37,0}}, +/* 62637 */ {(13<<2)|2,{121,37,0}}, +/* 62638 */ {(13<<2)|2,{121,37,0}}, +/* 62639 */ {(13<<2)|2,{121,37,0}}, +/* 62640 */ {(13<<2)|2,{121,45,0}}, +/* 62641 */ {(13<<2)|2,{121,45,0}}, +/* 62642 */ {(13<<2)|2,{121,45,0}}, +/* 62643 */ {(13<<2)|2,{121,45,0}}, +/* 62644 */ {(13<<2)|2,{121,45,0}}, +/* 62645 */ {(13<<2)|2,{121,45,0}}, +/* 62646 */ {(13<<2)|2,{121,45,0}}, +/* 62647 */ {(13<<2)|2,{121,45,0}}, +/* 62648 */ {(13<<2)|2,{121,46,0}}, +/* 62649 */ {(13<<2)|2,{121,46,0}}, +/* 62650 */ {(13<<2)|2,{121,46,0}}, +/* 62651 */ {(13<<2)|2,{121,46,0}}, +/* 62652 */ {(13<<2)|2,{121,46,0}}, +/* 62653 */ {(13<<2)|2,{121,46,0}}, +/* 62654 */ {(13<<2)|2,{121,46,0}}, +/* 62655 */ {(13<<2)|2,{121,46,0}}, +/* 62656 */ {(13<<2)|2,{121,47,0}}, +/* 62657 */ {(13<<2)|2,{121,47,0}}, +/* 62658 */ {(13<<2)|2,{121,47,0}}, +/* 62659 */ {(13<<2)|2,{121,47,0}}, +/* 62660 */ {(13<<2)|2,{121,47,0}}, +/* 62661 */ {(13<<2)|2,{121,47,0}}, +/* 62662 */ {(13<<2)|2,{121,47,0}}, +/* 62663 */ {(13<<2)|2,{121,47,0}}, +/* 62664 */ {(13<<2)|2,{121,51,0}}, +/* 62665 */ {(13<<2)|2,{121,51,0}}, +/* 62666 */ {(13<<2)|2,{121,51,0}}, +/* 62667 */ {(13<<2)|2,{121,51,0}}, +/* 62668 */ {(13<<2)|2,{121,51,0}}, +/* 62669 */ {(13<<2)|2,{121,51,0}}, +/* 62670 */ {(13<<2)|2,{121,51,0}}, +/* 62671 */ {(13<<2)|2,{121,51,0}}, +/* 62672 */ {(13<<2)|2,{121,52,0}}, +/* 62673 */ {(13<<2)|2,{121,52,0}}, +/* 62674 */ {(13<<2)|2,{121,52,0}}, +/* 62675 */ {(13<<2)|2,{121,52,0}}, +/* 62676 */ {(13<<2)|2,{121,52,0}}, +/* 62677 */ {(13<<2)|2,{121,52,0}}, +/* 62678 */ {(13<<2)|2,{121,52,0}}, +/* 62679 */ {(13<<2)|2,{121,52,0}}, +/* 62680 */ {(13<<2)|2,{121,53,0}}, +/* 62681 */ {(13<<2)|2,{121,53,0}}, +/* 62682 */ {(13<<2)|2,{121,53,0}}, +/* 62683 */ {(13<<2)|2,{121,53,0}}, +/* 62684 */ {(13<<2)|2,{121,53,0}}, +/* 62685 */ {(13<<2)|2,{121,53,0}}, +/* 62686 */ {(13<<2)|2,{121,53,0}}, +/* 62687 */ {(13<<2)|2,{121,53,0}}, +/* 62688 */ {(13<<2)|2,{121,54,0}}, +/* 62689 */ {(13<<2)|2,{121,54,0}}, +/* 62690 */ {(13<<2)|2,{121,54,0}}, +/* 62691 */ {(13<<2)|2,{121,54,0}}, +/* 62692 */ {(13<<2)|2,{121,54,0}}, +/* 62693 */ {(13<<2)|2,{121,54,0}}, +/* 62694 */ {(13<<2)|2,{121,54,0}}, +/* 62695 */ {(13<<2)|2,{121,54,0}}, +/* 62696 */ {(13<<2)|2,{121,55,0}}, +/* 62697 */ {(13<<2)|2,{121,55,0}}, +/* 62698 */ {(13<<2)|2,{121,55,0}}, +/* 62699 */ {(13<<2)|2,{121,55,0}}, +/* 62700 */ {(13<<2)|2,{121,55,0}}, +/* 62701 */ {(13<<2)|2,{121,55,0}}, +/* 62702 */ {(13<<2)|2,{121,55,0}}, +/* 62703 */ {(13<<2)|2,{121,55,0}}, +/* 62704 */ {(13<<2)|2,{121,56,0}}, +/* 62705 */ {(13<<2)|2,{121,56,0}}, +/* 62706 */ {(13<<2)|2,{121,56,0}}, +/* 62707 */ {(13<<2)|2,{121,56,0}}, +/* 62708 */ {(13<<2)|2,{121,56,0}}, +/* 62709 */ {(13<<2)|2,{121,56,0}}, +/* 62710 */ {(13<<2)|2,{121,56,0}}, +/* 62711 */ {(13<<2)|2,{121,56,0}}, +/* 62712 */ {(13<<2)|2,{121,57,0}}, +/* 62713 */ {(13<<2)|2,{121,57,0}}, +/* 62714 */ {(13<<2)|2,{121,57,0}}, +/* 62715 */ {(13<<2)|2,{121,57,0}}, +/* 62716 */ {(13<<2)|2,{121,57,0}}, +/* 62717 */ {(13<<2)|2,{121,57,0}}, +/* 62718 */ {(13<<2)|2,{121,57,0}}, +/* 62719 */ {(13<<2)|2,{121,57,0}}, +/* 62720 */ {(13<<2)|2,{121,61,0}}, +/* 62721 */ {(13<<2)|2,{121,61,0}}, +/* 62722 */ {(13<<2)|2,{121,61,0}}, +/* 62723 */ {(13<<2)|2,{121,61,0}}, +/* 62724 */ {(13<<2)|2,{121,61,0}}, +/* 62725 */ {(13<<2)|2,{121,61,0}}, +/* 62726 */ {(13<<2)|2,{121,61,0}}, +/* 62727 */ {(13<<2)|2,{121,61,0}}, +/* 62728 */ {(13<<2)|2,{121,65,0}}, +/* 62729 */ {(13<<2)|2,{121,65,0}}, +/* 62730 */ {(13<<2)|2,{121,65,0}}, +/* 62731 */ {(13<<2)|2,{121,65,0}}, +/* 62732 */ {(13<<2)|2,{121,65,0}}, +/* 62733 */ {(13<<2)|2,{121,65,0}}, +/* 62734 */ {(13<<2)|2,{121,65,0}}, +/* 62735 */ {(13<<2)|2,{121,65,0}}, +/* 62736 */ {(13<<2)|2,{121,95,0}}, +/* 62737 */ {(13<<2)|2,{121,95,0}}, +/* 62738 */ {(13<<2)|2,{121,95,0}}, +/* 62739 */ {(13<<2)|2,{121,95,0}}, +/* 62740 */ {(13<<2)|2,{121,95,0}}, +/* 62741 */ {(13<<2)|2,{121,95,0}}, +/* 62742 */ {(13<<2)|2,{121,95,0}}, +/* 62743 */ {(13<<2)|2,{121,95,0}}, +/* 62744 */ {(13<<2)|2,{121,98,0}}, +/* 62745 */ {(13<<2)|2,{121,98,0}}, +/* 62746 */ {(13<<2)|2,{121,98,0}}, +/* 62747 */ {(13<<2)|2,{121,98,0}}, +/* 62748 */ {(13<<2)|2,{121,98,0}}, +/* 62749 */ {(13<<2)|2,{121,98,0}}, +/* 62750 */ {(13<<2)|2,{121,98,0}}, +/* 62751 */ {(13<<2)|2,{121,98,0}}, +/* 62752 */ {(13<<2)|2,{121,100,0}}, +/* 62753 */ {(13<<2)|2,{121,100,0}}, +/* 62754 */ {(13<<2)|2,{121,100,0}}, +/* 62755 */ {(13<<2)|2,{121,100,0}}, +/* 62756 */ {(13<<2)|2,{121,100,0}}, +/* 62757 */ {(13<<2)|2,{121,100,0}}, +/* 62758 */ {(13<<2)|2,{121,100,0}}, +/* 62759 */ {(13<<2)|2,{121,100,0}}, +/* 62760 */ {(13<<2)|2,{121,102,0}}, +/* 62761 */ {(13<<2)|2,{121,102,0}}, +/* 62762 */ {(13<<2)|2,{121,102,0}}, +/* 62763 */ {(13<<2)|2,{121,102,0}}, +/* 62764 */ {(13<<2)|2,{121,102,0}}, +/* 62765 */ {(13<<2)|2,{121,102,0}}, +/* 62766 */ {(13<<2)|2,{121,102,0}}, +/* 62767 */ {(13<<2)|2,{121,102,0}}, +/* 62768 */ {(13<<2)|2,{121,103,0}}, +/* 62769 */ {(13<<2)|2,{121,103,0}}, +/* 62770 */ {(13<<2)|2,{121,103,0}}, +/* 62771 */ {(13<<2)|2,{121,103,0}}, +/* 62772 */ {(13<<2)|2,{121,103,0}}, +/* 62773 */ {(13<<2)|2,{121,103,0}}, +/* 62774 */ {(13<<2)|2,{121,103,0}}, +/* 62775 */ {(13<<2)|2,{121,103,0}}, +/* 62776 */ {(13<<2)|2,{121,104,0}}, +/* 62777 */ {(13<<2)|2,{121,104,0}}, +/* 62778 */ {(13<<2)|2,{121,104,0}}, +/* 62779 */ {(13<<2)|2,{121,104,0}}, +/* 62780 */ {(13<<2)|2,{121,104,0}}, +/* 62781 */ {(13<<2)|2,{121,104,0}}, +/* 62782 */ {(13<<2)|2,{121,104,0}}, +/* 62783 */ {(13<<2)|2,{121,104,0}}, +/* 62784 */ {(13<<2)|2,{121,108,0}}, +/* 62785 */ {(13<<2)|2,{121,108,0}}, +/* 62786 */ {(13<<2)|2,{121,108,0}}, +/* 62787 */ {(13<<2)|2,{121,108,0}}, +/* 62788 */ {(13<<2)|2,{121,108,0}}, +/* 62789 */ {(13<<2)|2,{121,108,0}}, +/* 62790 */ {(13<<2)|2,{121,108,0}}, +/* 62791 */ {(13<<2)|2,{121,108,0}}, +/* 62792 */ {(13<<2)|2,{121,109,0}}, +/* 62793 */ {(13<<2)|2,{121,109,0}}, +/* 62794 */ {(13<<2)|2,{121,109,0}}, +/* 62795 */ {(13<<2)|2,{121,109,0}}, +/* 62796 */ {(13<<2)|2,{121,109,0}}, +/* 62797 */ {(13<<2)|2,{121,109,0}}, +/* 62798 */ {(13<<2)|2,{121,109,0}}, +/* 62799 */ {(13<<2)|2,{121,109,0}}, +/* 62800 */ {(13<<2)|2,{121,110,0}}, +/* 62801 */ {(13<<2)|2,{121,110,0}}, +/* 62802 */ {(13<<2)|2,{121,110,0}}, +/* 62803 */ {(13<<2)|2,{121,110,0}}, +/* 62804 */ {(13<<2)|2,{121,110,0}}, +/* 62805 */ {(13<<2)|2,{121,110,0}}, +/* 62806 */ {(13<<2)|2,{121,110,0}}, +/* 62807 */ {(13<<2)|2,{121,110,0}}, +/* 62808 */ {(13<<2)|2,{121,112,0}}, +/* 62809 */ {(13<<2)|2,{121,112,0}}, +/* 62810 */ {(13<<2)|2,{121,112,0}}, +/* 62811 */ {(13<<2)|2,{121,112,0}}, +/* 62812 */ {(13<<2)|2,{121,112,0}}, +/* 62813 */ {(13<<2)|2,{121,112,0}}, +/* 62814 */ {(13<<2)|2,{121,112,0}}, +/* 62815 */ {(13<<2)|2,{121,112,0}}, +/* 62816 */ {(13<<2)|2,{121,114,0}}, +/* 62817 */ {(13<<2)|2,{121,114,0}}, +/* 62818 */ {(13<<2)|2,{121,114,0}}, +/* 62819 */ {(13<<2)|2,{121,114,0}}, +/* 62820 */ {(13<<2)|2,{121,114,0}}, +/* 62821 */ {(13<<2)|2,{121,114,0}}, +/* 62822 */ {(13<<2)|2,{121,114,0}}, +/* 62823 */ {(13<<2)|2,{121,114,0}}, +/* 62824 */ {(13<<2)|2,{121,117,0}}, +/* 62825 */ {(13<<2)|2,{121,117,0}}, +/* 62826 */ {(13<<2)|2,{121,117,0}}, +/* 62827 */ {(13<<2)|2,{121,117,0}}, +/* 62828 */ {(13<<2)|2,{121,117,0}}, +/* 62829 */ {(13<<2)|2,{121,117,0}}, +/* 62830 */ {(13<<2)|2,{121,117,0}}, +/* 62831 */ {(13<<2)|2,{121,117,0}}, +/* 62832 */ {(14<<2)|2,{121,58,0}}, +/* 62833 */ {(14<<2)|2,{121,58,0}}, +/* 62834 */ {(14<<2)|2,{121,58,0}}, +/* 62835 */ {(14<<2)|2,{121,58,0}}, +/* 62836 */ {(14<<2)|2,{121,66,0}}, +/* 62837 */ {(14<<2)|2,{121,66,0}}, +/* 62838 */ {(14<<2)|2,{121,66,0}}, +/* 62839 */ {(14<<2)|2,{121,66,0}}, +/* 62840 */ {(14<<2)|2,{121,67,0}}, +/* 62841 */ {(14<<2)|2,{121,67,0}}, +/* 62842 */ {(14<<2)|2,{121,67,0}}, +/* 62843 */ {(14<<2)|2,{121,67,0}}, +/* 62844 */ {(14<<2)|2,{121,68,0}}, +/* 62845 */ {(14<<2)|2,{121,68,0}}, +/* 62846 */ {(14<<2)|2,{121,68,0}}, +/* 62847 */ {(14<<2)|2,{121,68,0}}, +/* 62848 */ {(14<<2)|2,{121,69,0}}, +/* 62849 */ {(14<<2)|2,{121,69,0}}, +/* 62850 */ {(14<<2)|2,{121,69,0}}, +/* 62851 */ {(14<<2)|2,{121,69,0}}, +/* 62852 */ {(14<<2)|2,{121,70,0}}, +/* 62853 */ {(14<<2)|2,{121,70,0}}, +/* 62854 */ {(14<<2)|2,{121,70,0}}, +/* 62855 */ {(14<<2)|2,{121,70,0}}, +/* 62856 */ {(14<<2)|2,{121,71,0}}, +/* 62857 */ {(14<<2)|2,{121,71,0}}, +/* 62858 */ {(14<<2)|2,{121,71,0}}, +/* 62859 */ {(14<<2)|2,{121,71,0}}, +/* 62860 */ {(14<<2)|2,{121,72,0}}, +/* 62861 */ {(14<<2)|2,{121,72,0}}, +/* 62862 */ {(14<<2)|2,{121,72,0}}, +/* 62863 */ {(14<<2)|2,{121,72,0}}, +/* 62864 */ {(14<<2)|2,{121,73,0}}, +/* 62865 */ {(14<<2)|2,{121,73,0}}, +/* 62866 */ {(14<<2)|2,{121,73,0}}, +/* 62867 */ {(14<<2)|2,{121,73,0}}, +/* 62868 */ {(14<<2)|2,{121,74,0}}, +/* 62869 */ {(14<<2)|2,{121,74,0}}, +/* 62870 */ {(14<<2)|2,{121,74,0}}, +/* 62871 */ {(14<<2)|2,{121,74,0}}, +/* 62872 */ {(14<<2)|2,{121,75,0}}, +/* 62873 */ {(14<<2)|2,{121,75,0}}, +/* 62874 */ {(14<<2)|2,{121,75,0}}, +/* 62875 */ {(14<<2)|2,{121,75,0}}, +/* 62876 */ {(14<<2)|2,{121,76,0}}, +/* 62877 */ {(14<<2)|2,{121,76,0}}, +/* 62878 */ {(14<<2)|2,{121,76,0}}, +/* 62879 */ {(14<<2)|2,{121,76,0}}, +/* 62880 */ {(14<<2)|2,{121,77,0}}, +/* 62881 */ {(14<<2)|2,{121,77,0}}, +/* 62882 */ {(14<<2)|2,{121,77,0}}, +/* 62883 */ {(14<<2)|2,{121,77,0}}, +/* 62884 */ {(14<<2)|2,{121,78,0}}, +/* 62885 */ {(14<<2)|2,{121,78,0}}, +/* 62886 */ {(14<<2)|2,{121,78,0}}, +/* 62887 */ {(14<<2)|2,{121,78,0}}, +/* 62888 */ {(14<<2)|2,{121,79,0}}, +/* 62889 */ {(14<<2)|2,{121,79,0}}, +/* 62890 */ {(14<<2)|2,{121,79,0}}, +/* 62891 */ {(14<<2)|2,{121,79,0}}, +/* 62892 */ {(14<<2)|2,{121,80,0}}, +/* 62893 */ {(14<<2)|2,{121,80,0}}, +/* 62894 */ {(14<<2)|2,{121,80,0}}, +/* 62895 */ {(14<<2)|2,{121,80,0}}, +/* 62896 */ {(14<<2)|2,{121,81,0}}, +/* 62897 */ {(14<<2)|2,{121,81,0}}, +/* 62898 */ {(14<<2)|2,{121,81,0}}, +/* 62899 */ {(14<<2)|2,{121,81,0}}, +/* 62900 */ {(14<<2)|2,{121,82,0}}, +/* 62901 */ {(14<<2)|2,{121,82,0}}, +/* 62902 */ {(14<<2)|2,{121,82,0}}, +/* 62903 */ {(14<<2)|2,{121,82,0}}, +/* 62904 */ {(14<<2)|2,{121,83,0}}, +/* 62905 */ {(14<<2)|2,{121,83,0}}, +/* 62906 */ {(14<<2)|2,{121,83,0}}, +/* 62907 */ {(14<<2)|2,{121,83,0}}, +/* 62908 */ {(14<<2)|2,{121,84,0}}, +/* 62909 */ {(14<<2)|2,{121,84,0}}, +/* 62910 */ {(14<<2)|2,{121,84,0}}, +/* 62911 */ {(14<<2)|2,{121,84,0}}, +/* 62912 */ {(14<<2)|2,{121,85,0}}, +/* 62913 */ {(14<<2)|2,{121,85,0}}, +/* 62914 */ {(14<<2)|2,{121,85,0}}, +/* 62915 */ {(14<<2)|2,{121,85,0}}, +/* 62916 */ {(14<<2)|2,{121,86,0}}, +/* 62917 */ {(14<<2)|2,{121,86,0}}, +/* 62918 */ {(14<<2)|2,{121,86,0}}, +/* 62919 */ {(14<<2)|2,{121,86,0}}, +/* 62920 */ {(14<<2)|2,{121,87,0}}, +/* 62921 */ {(14<<2)|2,{121,87,0}}, +/* 62922 */ {(14<<2)|2,{121,87,0}}, +/* 62923 */ {(14<<2)|2,{121,87,0}}, +/* 62924 */ {(14<<2)|2,{121,89,0}}, +/* 62925 */ {(14<<2)|2,{121,89,0}}, +/* 62926 */ {(14<<2)|2,{121,89,0}}, +/* 62927 */ {(14<<2)|2,{121,89,0}}, +/* 62928 */ {(14<<2)|2,{121,106,0}}, +/* 62929 */ {(14<<2)|2,{121,106,0}}, +/* 62930 */ {(14<<2)|2,{121,106,0}}, +/* 62931 */ {(14<<2)|2,{121,106,0}}, +/* 62932 */ {(14<<2)|2,{121,107,0}}, +/* 62933 */ {(14<<2)|2,{121,107,0}}, +/* 62934 */ {(14<<2)|2,{121,107,0}}, +/* 62935 */ {(14<<2)|2,{121,107,0}}, +/* 62936 */ {(14<<2)|2,{121,113,0}}, +/* 62937 */ {(14<<2)|2,{121,113,0}}, +/* 62938 */ {(14<<2)|2,{121,113,0}}, +/* 62939 */ {(14<<2)|2,{121,113,0}}, +/* 62940 */ {(14<<2)|2,{121,118,0}}, +/* 62941 */ {(14<<2)|2,{121,118,0}}, +/* 62942 */ {(14<<2)|2,{121,118,0}}, +/* 62943 */ {(14<<2)|2,{121,118,0}}, +/* 62944 */ {(14<<2)|2,{121,119,0}}, +/* 62945 */ {(14<<2)|2,{121,119,0}}, +/* 62946 */ {(14<<2)|2,{121,119,0}}, +/* 62947 */ {(14<<2)|2,{121,119,0}}, +/* 62948 */ {(14<<2)|2,{121,120,0}}, +/* 62949 */ {(14<<2)|2,{121,120,0}}, +/* 62950 */ {(14<<2)|2,{121,120,0}}, +/* 62951 */ {(14<<2)|2,{121,120,0}}, +/* 62952 */ {(14<<2)|2,{121,121,0}}, +/* 62953 */ {(14<<2)|2,{121,121,0}}, +/* 62954 */ {(14<<2)|2,{121,121,0}}, +/* 62955 */ {(14<<2)|2,{121,121,0}}, +/* 62956 */ {(14<<2)|2,{121,122,0}}, +/* 62957 */ {(14<<2)|2,{121,122,0}}, +/* 62958 */ {(14<<2)|2,{121,122,0}}, +/* 62959 */ {(14<<2)|2,{121,122,0}}, +/* 62960 */ {(15<<2)|2,{121,38,0}}, +/* 62961 */ {(15<<2)|2,{121,38,0}}, +/* 62962 */ {(15<<2)|2,{121,42,0}}, +/* 62963 */ {(15<<2)|2,{121,42,0}}, +/* 62964 */ {(15<<2)|2,{121,44,0}}, +/* 62965 */ {(15<<2)|2,{121,44,0}}, +/* 62966 */ {(15<<2)|2,{121,59,0}}, +/* 62967 */ {(15<<2)|2,{121,59,0}}, +/* 62968 */ {(15<<2)|2,{121,88,0}}, +/* 62969 */ {(15<<2)|2,{121,88,0}}, +/* 62970 */ {(15<<2)|2,{121,90,0}}, +/* 62971 */ {(15<<2)|2,{121,90,0}}, +/* 62972 */ {(7<<2)|1,{121,0,0}}, +/* 62973 */ {(7<<2)|1,{121,0,0}}, +/* 62974 */ {(7<<2)|1,{121,0,0}}, +/* 62975 */ {(7<<2)|1,{121,0,0}}, +/* 62976 */ {(12<<2)|2,{122,48,0}}, +/* 62977 */ {(12<<2)|2,{122,48,0}}, +/* 62978 */ {(12<<2)|2,{122,48,0}}, +/* 62979 */ {(12<<2)|2,{122,48,0}}, +/* 62980 */ {(12<<2)|2,{122,48,0}}, +/* 62981 */ {(12<<2)|2,{122,48,0}}, +/* 62982 */ {(12<<2)|2,{122,48,0}}, +/* 62983 */ {(12<<2)|2,{122,48,0}}, +/* 62984 */ {(12<<2)|2,{122,48,0}}, +/* 62985 */ {(12<<2)|2,{122,48,0}}, +/* 62986 */ {(12<<2)|2,{122,48,0}}, +/* 62987 */ {(12<<2)|2,{122,48,0}}, +/* 62988 */ {(12<<2)|2,{122,48,0}}, +/* 62989 */ {(12<<2)|2,{122,48,0}}, +/* 62990 */ {(12<<2)|2,{122,48,0}}, +/* 62991 */ {(12<<2)|2,{122,48,0}}, +/* 62992 */ {(12<<2)|2,{122,49,0}}, +/* 62993 */ {(12<<2)|2,{122,49,0}}, +/* 62994 */ {(12<<2)|2,{122,49,0}}, +/* 62995 */ {(12<<2)|2,{122,49,0}}, +/* 62996 */ {(12<<2)|2,{122,49,0}}, +/* 62997 */ {(12<<2)|2,{122,49,0}}, +/* 62998 */ {(12<<2)|2,{122,49,0}}, +/* 62999 */ {(12<<2)|2,{122,49,0}}, +/* 63000 */ {(12<<2)|2,{122,49,0}}, +/* 63001 */ {(12<<2)|2,{122,49,0}}, +/* 63002 */ {(12<<2)|2,{122,49,0}}, +/* 63003 */ {(12<<2)|2,{122,49,0}}, +/* 63004 */ {(12<<2)|2,{122,49,0}}, +/* 63005 */ {(12<<2)|2,{122,49,0}}, +/* 63006 */ {(12<<2)|2,{122,49,0}}, +/* 63007 */ {(12<<2)|2,{122,49,0}}, +/* 63008 */ {(12<<2)|2,{122,50,0}}, +/* 63009 */ {(12<<2)|2,{122,50,0}}, +/* 63010 */ {(12<<2)|2,{122,50,0}}, +/* 63011 */ {(12<<2)|2,{122,50,0}}, +/* 63012 */ {(12<<2)|2,{122,50,0}}, +/* 63013 */ {(12<<2)|2,{122,50,0}}, +/* 63014 */ {(12<<2)|2,{122,50,0}}, +/* 63015 */ {(12<<2)|2,{122,50,0}}, +/* 63016 */ {(12<<2)|2,{122,50,0}}, +/* 63017 */ {(12<<2)|2,{122,50,0}}, +/* 63018 */ {(12<<2)|2,{122,50,0}}, +/* 63019 */ {(12<<2)|2,{122,50,0}}, +/* 63020 */ {(12<<2)|2,{122,50,0}}, +/* 63021 */ {(12<<2)|2,{122,50,0}}, +/* 63022 */ {(12<<2)|2,{122,50,0}}, +/* 63023 */ {(12<<2)|2,{122,50,0}}, +/* 63024 */ {(12<<2)|2,{122,97,0}}, +/* 63025 */ {(12<<2)|2,{122,97,0}}, +/* 63026 */ {(12<<2)|2,{122,97,0}}, +/* 63027 */ {(12<<2)|2,{122,97,0}}, +/* 63028 */ {(12<<2)|2,{122,97,0}}, +/* 63029 */ {(12<<2)|2,{122,97,0}}, +/* 63030 */ {(12<<2)|2,{122,97,0}}, +/* 63031 */ {(12<<2)|2,{122,97,0}}, +/* 63032 */ {(12<<2)|2,{122,97,0}}, +/* 63033 */ {(12<<2)|2,{122,97,0}}, +/* 63034 */ {(12<<2)|2,{122,97,0}}, +/* 63035 */ {(12<<2)|2,{122,97,0}}, +/* 63036 */ {(12<<2)|2,{122,97,0}}, +/* 63037 */ {(12<<2)|2,{122,97,0}}, +/* 63038 */ {(12<<2)|2,{122,97,0}}, +/* 63039 */ {(12<<2)|2,{122,97,0}}, +/* 63040 */ {(12<<2)|2,{122,99,0}}, +/* 63041 */ {(12<<2)|2,{122,99,0}}, +/* 63042 */ {(12<<2)|2,{122,99,0}}, +/* 63043 */ {(12<<2)|2,{122,99,0}}, +/* 63044 */ {(12<<2)|2,{122,99,0}}, +/* 63045 */ {(12<<2)|2,{122,99,0}}, +/* 63046 */ {(12<<2)|2,{122,99,0}}, +/* 63047 */ {(12<<2)|2,{122,99,0}}, +/* 63048 */ {(12<<2)|2,{122,99,0}}, +/* 63049 */ {(12<<2)|2,{122,99,0}}, +/* 63050 */ {(12<<2)|2,{122,99,0}}, +/* 63051 */ {(12<<2)|2,{122,99,0}}, +/* 63052 */ {(12<<2)|2,{122,99,0}}, +/* 63053 */ {(12<<2)|2,{122,99,0}}, +/* 63054 */ {(12<<2)|2,{122,99,0}}, +/* 63055 */ {(12<<2)|2,{122,99,0}}, +/* 63056 */ {(12<<2)|2,{122,101,0}}, +/* 63057 */ {(12<<2)|2,{122,101,0}}, +/* 63058 */ {(12<<2)|2,{122,101,0}}, +/* 63059 */ {(12<<2)|2,{122,101,0}}, +/* 63060 */ {(12<<2)|2,{122,101,0}}, +/* 63061 */ {(12<<2)|2,{122,101,0}}, +/* 63062 */ {(12<<2)|2,{122,101,0}}, +/* 63063 */ {(12<<2)|2,{122,101,0}}, +/* 63064 */ {(12<<2)|2,{122,101,0}}, +/* 63065 */ {(12<<2)|2,{122,101,0}}, +/* 63066 */ {(12<<2)|2,{122,101,0}}, +/* 63067 */ {(12<<2)|2,{122,101,0}}, +/* 63068 */ {(12<<2)|2,{122,101,0}}, +/* 63069 */ {(12<<2)|2,{122,101,0}}, +/* 63070 */ {(12<<2)|2,{122,101,0}}, +/* 63071 */ {(12<<2)|2,{122,101,0}}, +/* 63072 */ {(12<<2)|2,{122,105,0}}, +/* 63073 */ {(12<<2)|2,{122,105,0}}, +/* 63074 */ {(12<<2)|2,{122,105,0}}, +/* 63075 */ {(12<<2)|2,{122,105,0}}, +/* 63076 */ {(12<<2)|2,{122,105,0}}, +/* 63077 */ {(12<<2)|2,{122,105,0}}, +/* 63078 */ {(12<<2)|2,{122,105,0}}, +/* 63079 */ {(12<<2)|2,{122,105,0}}, +/* 63080 */ {(12<<2)|2,{122,105,0}}, +/* 63081 */ {(12<<2)|2,{122,105,0}}, +/* 63082 */ {(12<<2)|2,{122,105,0}}, +/* 63083 */ {(12<<2)|2,{122,105,0}}, +/* 63084 */ {(12<<2)|2,{122,105,0}}, +/* 63085 */ {(12<<2)|2,{122,105,0}}, +/* 63086 */ {(12<<2)|2,{122,105,0}}, +/* 63087 */ {(12<<2)|2,{122,105,0}}, +/* 63088 */ {(12<<2)|2,{122,111,0}}, +/* 63089 */ {(12<<2)|2,{122,111,0}}, +/* 63090 */ {(12<<2)|2,{122,111,0}}, +/* 63091 */ {(12<<2)|2,{122,111,0}}, +/* 63092 */ {(12<<2)|2,{122,111,0}}, +/* 63093 */ {(12<<2)|2,{122,111,0}}, +/* 63094 */ {(12<<2)|2,{122,111,0}}, +/* 63095 */ {(12<<2)|2,{122,111,0}}, +/* 63096 */ {(12<<2)|2,{122,111,0}}, +/* 63097 */ {(12<<2)|2,{122,111,0}}, +/* 63098 */ {(12<<2)|2,{122,111,0}}, +/* 63099 */ {(12<<2)|2,{122,111,0}}, +/* 63100 */ {(12<<2)|2,{122,111,0}}, +/* 63101 */ {(12<<2)|2,{122,111,0}}, +/* 63102 */ {(12<<2)|2,{122,111,0}}, +/* 63103 */ {(12<<2)|2,{122,111,0}}, +/* 63104 */ {(12<<2)|2,{122,115,0}}, +/* 63105 */ {(12<<2)|2,{122,115,0}}, +/* 63106 */ {(12<<2)|2,{122,115,0}}, +/* 63107 */ {(12<<2)|2,{122,115,0}}, +/* 63108 */ {(12<<2)|2,{122,115,0}}, +/* 63109 */ {(12<<2)|2,{122,115,0}}, +/* 63110 */ {(12<<2)|2,{122,115,0}}, +/* 63111 */ {(12<<2)|2,{122,115,0}}, +/* 63112 */ {(12<<2)|2,{122,115,0}}, +/* 63113 */ {(12<<2)|2,{122,115,0}}, +/* 63114 */ {(12<<2)|2,{122,115,0}}, +/* 63115 */ {(12<<2)|2,{122,115,0}}, +/* 63116 */ {(12<<2)|2,{122,115,0}}, +/* 63117 */ {(12<<2)|2,{122,115,0}}, +/* 63118 */ {(12<<2)|2,{122,115,0}}, +/* 63119 */ {(12<<2)|2,{122,115,0}}, +/* 63120 */ {(12<<2)|2,{122,116,0}}, +/* 63121 */ {(12<<2)|2,{122,116,0}}, +/* 63122 */ {(12<<2)|2,{122,116,0}}, +/* 63123 */ {(12<<2)|2,{122,116,0}}, +/* 63124 */ {(12<<2)|2,{122,116,0}}, +/* 63125 */ {(12<<2)|2,{122,116,0}}, +/* 63126 */ {(12<<2)|2,{122,116,0}}, +/* 63127 */ {(12<<2)|2,{122,116,0}}, +/* 63128 */ {(12<<2)|2,{122,116,0}}, +/* 63129 */ {(12<<2)|2,{122,116,0}}, +/* 63130 */ {(12<<2)|2,{122,116,0}}, +/* 63131 */ {(12<<2)|2,{122,116,0}}, +/* 63132 */ {(12<<2)|2,{122,116,0}}, +/* 63133 */ {(12<<2)|2,{122,116,0}}, +/* 63134 */ {(12<<2)|2,{122,116,0}}, +/* 63135 */ {(12<<2)|2,{122,116,0}}, +/* 63136 */ {(13<<2)|2,{122,32,0}}, +/* 63137 */ {(13<<2)|2,{122,32,0}}, +/* 63138 */ {(13<<2)|2,{122,32,0}}, +/* 63139 */ {(13<<2)|2,{122,32,0}}, +/* 63140 */ {(13<<2)|2,{122,32,0}}, +/* 63141 */ {(13<<2)|2,{122,32,0}}, +/* 63142 */ {(13<<2)|2,{122,32,0}}, +/* 63143 */ {(13<<2)|2,{122,32,0}}, +/* 63144 */ {(13<<2)|2,{122,37,0}}, +/* 63145 */ {(13<<2)|2,{122,37,0}}, +/* 63146 */ {(13<<2)|2,{122,37,0}}, +/* 63147 */ {(13<<2)|2,{122,37,0}}, +/* 63148 */ {(13<<2)|2,{122,37,0}}, +/* 63149 */ {(13<<2)|2,{122,37,0}}, +/* 63150 */ {(13<<2)|2,{122,37,0}}, +/* 63151 */ {(13<<2)|2,{122,37,0}}, +/* 63152 */ {(13<<2)|2,{122,45,0}}, +/* 63153 */ {(13<<2)|2,{122,45,0}}, +/* 63154 */ {(13<<2)|2,{122,45,0}}, +/* 63155 */ {(13<<2)|2,{122,45,0}}, +/* 63156 */ {(13<<2)|2,{122,45,0}}, +/* 63157 */ {(13<<2)|2,{122,45,0}}, +/* 63158 */ {(13<<2)|2,{122,45,0}}, +/* 63159 */ {(13<<2)|2,{122,45,0}}, +/* 63160 */ {(13<<2)|2,{122,46,0}}, +/* 63161 */ {(13<<2)|2,{122,46,0}}, +/* 63162 */ {(13<<2)|2,{122,46,0}}, +/* 63163 */ {(13<<2)|2,{122,46,0}}, +/* 63164 */ {(13<<2)|2,{122,46,0}}, +/* 63165 */ {(13<<2)|2,{122,46,0}}, +/* 63166 */ {(13<<2)|2,{122,46,0}}, +/* 63167 */ {(13<<2)|2,{122,46,0}}, +/* 63168 */ {(13<<2)|2,{122,47,0}}, +/* 63169 */ {(13<<2)|2,{122,47,0}}, +/* 63170 */ {(13<<2)|2,{122,47,0}}, +/* 63171 */ {(13<<2)|2,{122,47,0}}, +/* 63172 */ {(13<<2)|2,{122,47,0}}, +/* 63173 */ {(13<<2)|2,{122,47,0}}, +/* 63174 */ {(13<<2)|2,{122,47,0}}, +/* 63175 */ {(13<<2)|2,{122,47,0}}, +/* 63176 */ {(13<<2)|2,{122,51,0}}, +/* 63177 */ {(13<<2)|2,{122,51,0}}, +/* 63178 */ {(13<<2)|2,{122,51,0}}, +/* 63179 */ {(13<<2)|2,{122,51,0}}, +/* 63180 */ {(13<<2)|2,{122,51,0}}, +/* 63181 */ {(13<<2)|2,{122,51,0}}, +/* 63182 */ {(13<<2)|2,{122,51,0}}, +/* 63183 */ {(13<<2)|2,{122,51,0}}, +/* 63184 */ {(13<<2)|2,{122,52,0}}, +/* 63185 */ {(13<<2)|2,{122,52,0}}, +/* 63186 */ {(13<<2)|2,{122,52,0}}, +/* 63187 */ {(13<<2)|2,{122,52,0}}, +/* 63188 */ {(13<<2)|2,{122,52,0}}, +/* 63189 */ {(13<<2)|2,{122,52,0}}, +/* 63190 */ {(13<<2)|2,{122,52,0}}, +/* 63191 */ {(13<<2)|2,{122,52,0}}, +/* 63192 */ {(13<<2)|2,{122,53,0}}, +/* 63193 */ {(13<<2)|2,{122,53,0}}, +/* 63194 */ {(13<<2)|2,{122,53,0}}, +/* 63195 */ {(13<<2)|2,{122,53,0}}, +/* 63196 */ {(13<<2)|2,{122,53,0}}, +/* 63197 */ {(13<<2)|2,{122,53,0}}, +/* 63198 */ {(13<<2)|2,{122,53,0}}, +/* 63199 */ {(13<<2)|2,{122,53,0}}, +/* 63200 */ {(13<<2)|2,{122,54,0}}, +/* 63201 */ {(13<<2)|2,{122,54,0}}, +/* 63202 */ {(13<<2)|2,{122,54,0}}, +/* 63203 */ {(13<<2)|2,{122,54,0}}, +/* 63204 */ {(13<<2)|2,{122,54,0}}, +/* 63205 */ {(13<<2)|2,{122,54,0}}, +/* 63206 */ {(13<<2)|2,{122,54,0}}, +/* 63207 */ {(13<<2)|2,{122,54,0}}, +/* 63208 */ {(13<<2)|2,{122,55,0}}, +/* 63209 */ {(13<<2)|2,{122,55,0}}, +/* 63210 */ {(13<<2)|2,{122,55,0}}, +/* 63211 */ {(13<<2)|2,{122,55,0}}, +/* 63212 */ {(13<<2)|2,{122,55,0}}, +/* 63213 */ {(13<<2)|2,{122,55,0}}, +/* 63214 */ {(13<<2)|2,{122,55,0}}, +/* 63215 */ {(13<<2)|2,{122,55,0}}, +/* 63216 */ {(13<<2)|2,{122,56,0}}, +/* 63217 */ {(13<<2)|2,{122,56,0}}, +/* 63218 */ {(13<<2)|2,{122,56,0}}, +/* 63219 */ {(13<<2)|2,{122,56,0}}, +/* 63220 */ {(13<<2)|2,{122,56,0}}, +/* 63221 */ {(13<<2)|2,{122,56,0}}, +/* 63222 */ {(13<<2)|2,{122,56,0}}, +/* 63223 */ {(13<<2)|2,{122,56,0}}, +/* 63224 */ {(13<<2)|2,{122,57,0}}, +/* 63225 */ {(13<<2)|2,{122,57,0}}, +/* 63226 */ {(13<<2)|2,{122,57,0}}, +/* 63227 */ {(13<<2)|2,{122,57,0}}, +/* 63228 */ {(13<<2)|2,{122,57,0}}, +/* 63229 */ {(13<<2)|2,{122,57,0}}, +/* 63230 */ {(13<<2)|2,{122,57,0}}, +/* 63231 */ {(13<<2)|2,{122,57,0}}, +/* 63232 */ {(13<<2)|2,{122,61,0}}, +/* 63233 */ {(13<<2)|2,{122,61,0}}, +/* 63234 */ {(13<<2)|2,{122,61,0}}, +/* 63235 */ {(13<<2)|2,{122,61,0}}, +/* 63236 */ {(13<<2)|2,{122,61,0}}, +/* 63237 */ {(13<<2)|2,{122,61,0}}, +/* 63238 */ {(13<<2)|2,{122,61,0}}, +/* 63239 */ {(13<<2)|2,{122,61,0}}, +/* 63240 */ {(13<<2)|2,{122,65,0}}, +/* 63241 */ {(13<<2)|2,{122,65,0}}, +/* 63242 */ {(13<<2)|2,{122,65,0}}, +/* 63243 */ {(13<<2)|2,{122,65,0}}, +/* 63244 */ {(13<<2)|2,{122,65,0}}, +/* 63245 */ {(13<<2)|2,{122,65,0}}, +/* 63246 */ {(13<<2)|2,{122,65,0}}, +/* 63247 */ {(13<<2)|2,{122,65,0}}, +/* 63248 */ {(13<<2)|2,{122,95,0}}, +/* 63249 */ {(13<<2)|2,{122,95,0}}, +/* 63250 */ {(13<<2)|2,{122,95,0}}, +/* 63251 */ {(13<<2)|2,{122,95,0}}, +/* 63252 */ {(13<<2)|2,{122,95,0}}, +/* 63253 */ {(13<<2)|2,{122,95,0}}, +/* 63254 */ {(13<<2)|2,{122,95,0}}, +/* 63255 */ {(13<<2)|2,{122,95,0}}, +/* 63256 */ {(13<<2)|2,{122,98,0}}, +/* 63257 */ {(13<<2)|2,{122,98,0}}, +/* 63258 */ {(13<<2)|2,{122,98,0}}, +/* 63259 */ {(13<<2)|2,{122,98,0}}, +/* 63260 */ {(13<<2)|2,{122,98,0}}, +/* 63261 */ {(13<<2)|2,{122,98,0}}, +/* 63262 */ {(13<<2)|2,{122,98,0}}, +/* 63263 */ {(13<<2)|2,{122,98,0}}, +/* 63264 */ {(13<<2)|2,{122,100,0}}, +/* 63265 */ {(13<<2)|2,{122,100,0}}, +/* 63266 */ {(13<<2)|2,{122,100,0}}, +/* 63267 */ {(13<<2)|2,{122,100,0}}, +/* 63268 */ {(13<<2)|2,{122,100,0}}, +/* 63269 */ {(13<<2)|2,{122,100,0}}, +/* 63270 */ {(13<<2)|2,{122,100,0}}, +/* 63271 */ {(13<<2)|2,{122,100,0}}, +/* 63272 */ {(13<<2)|2,{122,102,0}}, +/* 63273 */ {(13<<2)|2,{122,102,0}}, +/* 63274 */ {(13<<2)|2,{122,102,0}}, +/* 63275 */ {(13<<2)|2,{122,102,0}}, +/* 63276 */ {(13<<2)|2,{122,102,0}}, +/* 63277 */ {(13<<2)|2,{122,102,0}}, +/* 63278 */ {(13<<2)|2,{122,102,0}}, +/* 63279 */ {(13<<2)|2,{122,102,0}}, +/* 63280 */ {(13<<2)|2,{122,103,0}}, +/* 63281 */ {(13<<2)|2,{122,103,0}}, +/* 63282 */ {(13<<2)|2,{122,103,0}}, +/* 63283 */ {(13<<2)|2,{122,103,0}}, +/* 63284 */ {(13<<2)|2,{122,103,0}}, +/* 63285 */ {(13<<2)|2,{122,103,0}}, +/* 63286 */ {(13<<2)|2,{122,103,0}}, +/* 63287 */ {(13<<2)|2,{122,103,0}}, +/* 63288 */ {(13<<2)|2,{122,104,0}}, +/* 63289 */ {(13<<2)|2,{122,104,0}}, +/* 63290 */ {(13<<2)|2,{122,104,0}}, +/* 63291 */ {(13<<2)|2,{122,104,0}}, +/* 63292 */ {(13<<2)|2,{122,104,0}}, +/* 63293 */ {(13<<2)|2,{122,104,0}}, +/* 63294 */ {(13<<2)|2,{122,104,0}}, +/* 63295 */ {(13<<2)|2,{122,104,0}}, +/* 63296 */ {(13<<2)|2,{122,108,0}}, +/* 63297 */ {(13<<2)|2,{122,108,0}}, +/* 63298 */ {(13<<2)|2,{122,108,0}}, +/* 63299 */ {(13<<2)|2,{122,108,0}}, +/* 63300 */ {(13<<2)|2,{122,108,0}}, +/* 63301 */ {(13<<2)|2,{122,108,0}}, +/* 63302 */ {(13<<2)|2,{122,108,0}}, +/* 63303 */ {(13<<2)|2,{122,108,0}}, +/* 63304 */ {(13<<2)|2,{122,109,0}}, +/* 63305 */ {(13<<2)|2,{122,109,0}}, +/* 63306 */ {(13<<2)|2,{122,109,0}}, +/* 63307 */ {(13<<2)|2,{122,109,0}}, +/* 63308 */ {(13<<2)|2,{122,109,0}}, +/* 63309 */ {(13<<2)|2,{122,109,0}}, +/* 63310 */ {(13<<2)|2,{122,109,0}}, +/* 63311 */ {(13<<2)|2,{122,109,0}}, +/* 63312 */ {(13<<2)|2,{122,110,0}}, +/* 63313 */ {(13<<2)|2,{122,110,0}}, +/* 63314 */ {(13<<2)|2,{122,110,0}}, +/* 63315 */ {(13<<2)|2,{122,110,0}}, +/* 63316 */ {(13<<2)|2,{122,110,0}}, +/* 63317 */ {(13<<2)|2,{122,110,0}}, +/* 63318 */ {(13<<2)|2,{122,110,0}}, +/* 63319 */ {(13<<2)|2,{122,110,0}}, +/* 63320 */ {(13<<2)|2,{122,112,0}}, +/* 63321 */ {(13<<2)|2,{122,112,0}}, +/* 63322 */ {(13<<2)|2,{122,112,0}}, +/* 63323 */ {(13<<2)|2,{122,112,0}}, +/* 63324 */ {(13<<2)|2,{122,112,0}}, +/* 63325 */ {(13<<2)|2,{122,112,0}}, +/* 63326 */ {(13<<2)|2,{122,112,0}}, +/* 63327 */ {(13<<2)|2,{122,112,0}}, +/* 63328 */ {(13<<2)|2,{122,114,0}}, +/* 63329 */ {(13<<2)|2,{122,114,0}}, +/* 63330 */ {(13<<2)|2,{122,114,0}}, +/* 63331 */ {(13<<2)|2,{122,114,0}}, +/* 63332 */ {(13<<2)|2,{122,114,0}}, +/* 63333 */ {(13<<2)|2,{122,114,0}}, +/* 63334 */ {(13<<2)|2,{122,114,0}}, +/* 63335 */ {(13<<2)|2,{122,114,0}}, +/* 63336 */ {(13<<2)|2,{122,117,0}}, +/* 63337 */ {(13<<2)|2,{122,117,0}}, +/* 63338 */ {(13<<2)|2,{122,117,0}}, +/* 63339 */ {(13<<2)|2,{122,117,0}}, +/* 63340 */ {(13<<2)|2,{122,117,0}}, +/* 63341 */ {(13<<2)|2,{122,117,0}}, +/* 63342 */ {(13<<2)|2,{122,117,0}}, +/* 63343 */ {(13<<2)|2,{122,117,0}}, +/* 63344 */ {(14<<2)|2,{122,58,0}}, +/* 63345 */ {(14<<2)|2,{122,58,0}}, +/* 63346 */ {(14<<2)|2,{122,58,0}}, +/* 63347 */ {(14<<2)|2,{122,58,0}}, +/* 63348 */ {(14<<2)|2,{122,66,0}}, +/* 63349 */ {(14<<2)|2,{122,66,0}}, +/* 63350 */ {(14<<2)|2,{122,66,0}}, +/* 63351 */ {(14<<2)|2,{122,66,0}}, +/* 63352 */ {(14<<2)|2,{122,67,0}}, +/* 63353 */ {(14<<2)|2,{122,67,0}}, +/* 63354 */ {(14<<2)|2,{122,67,0}}, +/* 63355 */ {(14<<2)|2,{122,67,0}}, +/* 63356 */ {(14<<2)|2,{122,68,0}}, +/* 63357 */ {(14<<2)|2,{122,68,0}}, +/* 63358 */ {(14<<2)|2,{122,68,0}}, +/* 63359 */ {(14<<2)|2,{122,68,0}}, +/* 63360 */ {(14<<2)|2,{122,69,0}}, +/* 63361 */ {(14<<2)|2,{122,69,0}}, +/* 63362 */ {(14<<2)|2,{122,69,0}}, +/* 63363 */ {(14<<2)|2,{122,69,0}}, +/* 63364 */ {(14<<2)|2,{122,70,0}}, +/* 63365 */ {(14<<2)|2,{122,70,0}}, +/* 63366 */ {(14<<2)|2,{122,70,0}}, +/* 63367 */ {(14<<2)|2,{122,70,0}}, +/* 63368 */ {(14<<2)|2,{122,71,0}}, +/* 63369 */ {(14<<2)|2,{122,71,0}}, +/* 63370 */ {(14<<2)|2,{122,71,0}}, +/* 63371 */ {(14<<2)|2,{122,71,0}}, +/* 63372 */ {(14<<2)|2,{122,72,0}}, +/* 63373 */ {(14<<2)|2,{122,72,0}}, +/* 63374 */ {(14<<2)|2,{122,72,0}}, +/* 63375 */ {(14<<2)|2,{122,72,0}}, +/* 63376 */ {(14<<2)|2,{122,73,0}}, +/* 63377 */ {(14<<2)|2,{122,73,0}}, +/* 63378 */ {(14<<2)|2,{122,73,0}}, +/* 63379 */ {(14<<2)|2,{122,73,0}}, +/* 63380 */ {(14<<2)|2,{122,74,0}}, +/* 63381 */ {(14<<2)|2,{122,74,0}}, +/* 63382 */ {(14<<2)|2,{122,74,0}}, +/* 63383 */ {(14<<2)|2,{122,74,0}}, +/* 63384 */ {(14<<2)|2,{122,75,0}}, +/* 63385 */ {(14<<2)|2,{122,75,0}}, +/* 63386 */ {(14<<2)|2,{122,75,0}}, +/* 63387 */ {(14<<2)|2,{122,75,0}}, +/* 63388 */ {(14<<2)|2,{122,76,0}}, +/* 63389 */ {(14<<2)|2,{122,76,0}}, +/* 63390 */ {(14<<2)|2,{122,76,0}}, +/* 63391 */ {(14<<2)|2,{122,76,0}}, +/* 63392 */ {(14<<2)|2,{122,77,0}}, +/* 63393 */ {(14<<2)|2,{122,77,0}}, +/* 63394 */ {(14<<2)|2,{122,77,0}}, +/* 63395 */ {(14<<2)|2,{122,77,0}}, +/* 63396 */ {(14<<2)|2,{122,78,0}}, +/* 63397 */ {(14<<2)|2,{122,78,0}}, +/* 63398 */ {(14<<2)|2,{122,78,0}}, +/* 63399 */ {(14<<2)|2,{122,78,0}}, +/* 63400 */ {(14<<2)|2,{122,79,0}}, +/* 63401 */ {(14<<2)|2,{122,79,0}}, +/* 63402 */ {(14<<2)|2,{122,79,0}}, +/* 63403 */ {(14<<2)|2,{122,79,0}}, +/* 63404 */ {(14<<2)|2,{122,80,0}}, +/* 63405 */ {(14<<2)|2,{122,80,0}}, +/* 63406 */ {(14<<2)|2,{122,80,0}}, +/* 63407 */ {(14<<2)|2,{122,80,0}}, +/* 63408 */ {(14<<2)|2,{122,81,0}}, +/* 63409 */ {(14<<2)|2,{122,81,0}}, +/* 63410 */ {(14<<2)|2,{122,81,0}}, +/* 63411 */ {(14<<2)|2,{122,81,0}}, +/* 63412 */ {(14<<2)|2,{122,82,0}}, +/* 63413 */ {(14<<2)|2,{122,82,0}}, +/* 63414 */ {(14<<2)|2,{122,82,0}}, +/* 63415 */ {(14<<2)|2,{122,82,0}}, +/* 63416 */ {(14<<2)|2,{122,83,0}}, +/* 63417 */ {(14<<2)|2,{122,83,0}}, +/* 63418 */ {(14<<2)|2,{122,83,0}}, +/* 63419 */ {(14<<2)|2,{122,83,0}}, +/* 63420 */ {(14<<2)|2,{122,84,0}}, +/* 63421 */ {(14<<2)|2,{122,84,0}}, +/* 63422 */ {(14<<2)|2,{122,84,0}}, +/* 63423 */ {(14<<2)|2,{122,84,0}}, +/* 63424 */ {(14<<2)|2,{122,85,0}}, +/* 63425 */ {(14<<2)|2,{122,85,0}}, +/* 63426 */ {(14<<2)|2,{122,85,0}}, +/* 63427 */ {(14<<2)|2,{122,85,0}}, +/* 63428 */ {(14<<2)|2,{122,86,0}}, +/* 63429 */ {(14<<2)|2,{122,86,0}}, +/* 63430 */ {(14<<2)|2,{122,86,0}}, +/* 63431 */ {(14<<2)|2,{122,86,0}}, +/* 63432 */ {(14<<2)|2,{122,87,0}}, +/* 63433 */ {(14<<2)|2,{122,87,0}}, +/* 63434 */ {(14<<2)|2,{122,87,0}}, +/* 63435 */ {(14<<2)|2,{122,87,0}}, +/* 63436 */ {(14<<2)|2,{122,89,0}}, +/* 63437 */ {(14<<2)|2,{122,89,0}}, +/* 63438 */ {(14<<2)|2,{122,89,0}}, +/* 63439 */ {(14<<2)|2,{122,89,0}}, +/* 63440 */ {(14<<2)|2,{122,106,0}}, +/* 63441 */ {(14<<2)|2,{122,106,0}}, +/* 63442 */ {(14<<2)|2,{122,106,0}}, +/* 63443 */ {(14<<2)|2,{122,106,0}}, +/* 63444 */ {(14<<2)|2,{122,107,0}}, +/* 63445 */ {(14<<2)|2,{122,107,0}}, +/* 63446 */ {(14<<2)|2,{122,107,0}}, +/* 63447 */ {(14<<2)|2,{122,107,0}}, +/* 63448 */ {(14<<2)|2,{122,113,0}}, +/* 63449 */ {(14<<2)|2,{122,113,0}}, +/* 63450 */ {(14<<2)|2,{122,113,0}}, +/* 63451 */ {(14<<2)|2,{122,113,0}}, +/* 63452 */ {(14<<2)|2,{122,118,0}}, +/* 63453 */ {(14<<2)|2,{122,118,0}}, +/* 63454 */ {(14<<2)|2,{122,118,0}}, +/* 63455 */ {(14<<2)|2,{122,118,0}}, +/* 63456 */ {(14<<2)|2,{122,119,0}}, +/* 63457 */ {(14<<2)|2,{122,119,0}}, +/* 63458 */ {(14<<2)|2,{122,119,0}}, +/* 63459 */ {(14<<2)|2,{122,119,0}}, +/* 63460 */ {(14<<2)|2,{122,120,0}}, +/* 63461 */ {(14<<2)|2,{122,120,0}}, +/* 63462 */ {(14<<2)|2,{122,120,0}}, +/* 63463 */ {(14<<2)|2,{122,120,0}}, +/* 63464 */ {(14<<2)|2,{122,121,0}}, +/* 63465 */ {(14<<2)|2,{122,121,0}}, +/* 63466 */ {(14<<2)|2,{122,121,0}}, +/* 63467 */ {(14<<2)|2,{122,121,0}}, +/* 63468 */ {(14<<2)|2,{122,122,0}}, +/* 63469 */ {(14<<2)|2,{122,122,0}}, +/* 63470 */ {(14<<2)|2,{122,122,0}}, +/* 63471 */ {(14<<2)|2,{122,122,0}}, +/* 63472 */ {(15<<2)|2,{122,38,0}}, +/* 63473 */ {(15<<2)|2,{122,38,0}}, +/* 63474 */ {(15<<2)|2,{122,42,0}}, +/* 63475 */ {(15<<2)|2,{122,42,0}}, +/* 63476 */ {(15<<2)|2,{122,44,0}}, +/* 63477 */ {(15<<2)|2,{122,44,0}}, +/* 63478 */ {(15<<2)|2,{122,59,0}}, +/* 63479 */ {(15<<2)|2,{122,59,0}}, +/* 63480 */ {(15<<2)|2,{122,88,0}}, +/* 63481 */ {(15<<2)|2,{122,88,0}}, +/* 63482 */ {(15<<2)|2,{122,90,0}}, +/* 63483 */ {(15<<2)|2,{122,90,0}}, +/* 63484 */ {(7<<2)|1,{122,0,0}}, +/* 63485 */ {(7<<2)|1,{122,0,0}}, +/* 63486 */ {(7<<2)|1,{122,0,0}}, +/* 63487 */ {(7<<2)|1,{122,0,0}}, +/* 63488 */ {(13<<2)|2,{38,48,0}}, +/* 63489 */ {(13<<2)|2,{38,48,0}}, +/* 63490 */ {(13<<2)|2,{38,48,0}}, +/* 63491 */ {(13<<2)|2,{38,48,0}}, +/* 63492 */ {(13<<2)|2,{38,48,0}}, +/* 63493 */ {(13<<2)|2,{38,48,0}}, +/* 63494 */ {(13<<2)|2,{38,48,0}}, +/* 63495 */ {(13<<2)|2,{38,48,0}}, +/* 63496 */ {(13<<2)|2,{38,49,0}}, +/* 63497 */ {(13<<2)|2,{38,49,0}}, +/* 63498 */ {(13<<2)|2,{38,49,0}}, +/* 63499 */ {(13<<2)|2,{38,49,0}}, +/* 63500 */ {(13<<2)|2,{38,49,0}}, +/* 63501 */ {(13<<2)|2,{38,49,0}}, +/* 63502 */ {(13<<2)|2,{38,49,0}}, +/* 63503 */ {(13<<2)|2,{38,49,0}}, +/* 63504 */ {(13<<2)|2,{38,50,0}}, +/* 63505 */ {(13<<2)|2,{38,50,0}}, +/* 63506 */ {(13<<2)|2,{38,50,0}}, +/* 63507 */ {(13<<2)|2,{38,50,0}}, +/* 63508 */ {(13<<2)|2,{38,50,0}}, +/* 63509 */ {(13<<2)|2,{38,50,0}}, +/* 63510 */ {(13<<2)|2,{38,50,0}}, +/* 63511 */ {(13<<2)|2,{38,50,0}}, +/* 63512 */ {(13<<2)|2,{38,97,0}}, +/* 63513 */ {(13<<2)|2,{38,97,0}}, +/* 63514 */ {(13<<2)|2,{38,97,0}}, +/* 63515 */ {(13<<2)|2,{38,97,0}}, +/* 63516 */ {(13<<2)|2,{38,97,0}}, +/* 63517 */ {(13<<2)|2,{38,97,0}}, +/* 63518 */ {(13<<2)|2,{38,97,0}}, +/* 63519 */ {(13<<2)|2,{38,97,0}}, +/* 63520 */ {(13<<2)|2,{38,99,0}}, +/* 63521 */ {(13<<2)|2,{38,99,0}}, +/* 63522 */ {(13<<2)|2,{38,99,0}}, +/* 63523 */ {(13<<2)|2,{38,99,0}}, +/* 63524 */ {(13<<2)|2,{38,99,0}}, +/* 63525 */ {(13<<2)|2,{38,99,0}}, +/* 63526 */ {(13<<2)|2,{38,99,0}}, +/* 63527 */ {(13<<2)|2,{38,99,0}}, +/* 63528 */ {(13<<2)|2,{38,101,0}}, +/* 63529 */ {(13<<2)|2,{38,101,0}}, +/* 63530 */ {(13<<2)|2,{38,101,0}}, +/* 63531 */ {(13<<2)|2,{38,101,0}}, +/* 63532 */ {(13<<2)|2,{38,101,0}}, +/* 63533 */ {(13<<2)|2,{38,101,0}}, +/* 63534 */ {(13<<2)|2,{38,101,0}}, +/* 63535 */ {(13<<2)|2,{38,101,0}}, +/* 63536 */ {(13<<2)|2,{38,105,0}}, +/* 63537 */ {(13<<2)|2,{38,105,0}}, +/* 63538 */ {(13<<2)|2,{38,105,0}}, +/* 63539 */ {(13<<2)|2,{38,105,0}}, +/* 63540 */ {(13<<2)|2,{38,105,0}}, +/* 63541 */ {(13<<2)|2,{38,105,0}}, +/* 63542 */ {(13<<2)|2,{38,105,0}}, +/* 63543 */ {(13<<2)|2,{38,105,0}}, +/* 63544 */ {(13<<2)|2,{38,111,0}}, +/* 63545 */ {(13<<2)|2,{38,111,0}}, +/* 63546 */ {(13<<2)|2,{38,111,0}}, +/* 63547 */ {(13<<2)|2,{38,111,0}}, +/* 63548 */ {(13<<2)|2,{38,111,0}}, +/* 63549 */ {(13<<2)|2,{38,111,0}}, +/* 63550 */ {(13<<2)|2,{38,111,0}}, +/* 63551 */ {(13<<2)|2,{38,111,0}}, +/* 63552 */ {(13<<2)|2,{38,115,0}}, +/* 63553 */ {(13<<2)|2,{38,115,0}}, +/* 63554 */ {(13<<2)|2,{38,115,0}}, +/* 63555 */ {(13<<2)|2,{38,115,0}}, +/* 63556 */ {(13<<2)|2,{38,115,0}}, +/* 63557 */ {(13<<2)|2,{38,115,0}}, +/* 63558 */ {(13<<2)|2,{38,115,0}}, +/* 63559 */ {(13<<2)|2,{38,115,0}}, +/* 63560 */ {(13<<2)|2,{38,116,0}}, +/* 63561 */ {(13<<2)|2,{38,116,0}}, +/* 63562 */ {(13<<2)|2,{38,116,0}}, +/* 63563 */ {(13<<2)|2,{38,116,0}}, +/* 63564 */ {(13<<2)|2,{38,116,0}}, +/* 63565 */ {(13<<2)|2,{38,116,0}}, +/* 63566 */ {(13<<2)|2,{38,116,0}}, +/* 63567 */ {(13<<2)|2,{38,116,0}}, +/* 63568 */ {(14<<2)|2,{38,32,0}}, +/* 63569 */ {(14<<2)|2,{38,32,0}}, +/* 63570 */ {(14<<2)|2,{38,32,0}}, +/* 63571 */ {(14<<2)|2,{38,32,0}}, +/* 63572 */ {(14<<2)|2,{38,37,0}}, +/* 63573 */ {(14<<2)|2,{38,37,0}}, +/* 63574 */ {(14<<2)|2,{38,37,0}}, +/* 63575 */ {(14<<2)|2,{38,37,0}}, +/* 63576 */ {(14<<2)|2,{38,45,0}}, +/* 63577 */ {(14<<2)|2,{38,45,0}}, +/* 63578 */ {(14<<2)|2,{38,45,0}}, +/* 63579 */ {(14<<2)|2,{38,45,0}}, +/* 63580 */ {(14<<2)|2,{38,46,0}}, +/* 63581 */ {(14<<2)|2,{38,46,0}}, +/* 63582 */ {(14<<2)|2,{38,46,0}}, +/* 63583 */ {(14<<2)|2,{38,46,0}}, +/* 63584 */ {(14<<2)|2,{38,47,0}}, +/* 63585 */ {(14<<2)|2,{38,47,0}}, +/* 63586 */ {(14<<2)|2,{38,47,0}}, +/* 63587 */ {(14<<2)|2,{38,47,0}}, +/* 63588 */ {(14<<2)|2,{38,51,0}}, +/* 63589 */ {(14<<2)|2,{38,51,0}}, +/* 63590 */ {(14<<2)|2,{38,51,0}}, +/* 63591 */ {(14<<2)|2,{38,51,0}}, +/* 63592 */ {(14<<2)|2,{38,52,0}}, +/* 63593 */ {(14<<2)|2,{38,52,0}}, +/* 63594 */ {(14<<2)|2,{38,52,0}}, +/* 63595 */ {(14<<2)|2,{38,52,0}}, +/* 63596 */ {(14<<2)|2,{38,53,0}}, +/* 63597 */ {(14<<2)|2,{38,53,0}}, +/* 63598 */ {(14<<2)|2,{38,53,0}}, +/* 63599 */ {(14<<2)|2,{38,53,0}}, +/* 63600 */ {(14<<2)|2,{38,54,0}}, +/* 63601 */ {(14<<2)|2,{38,54,0}}, +/* 63602 */ {(14<<2)|2,{38,54,0}}, +/* 63603 */ {(14<<2)|2,{38,54,0}}, +/* 63604 */ {(14<<2)|2,{38,55,0}}, +/* 63605 */ {(14<<2)|2,{38,55,0}}, +/* 63606 */ {(14<<2)|2,{38,55,0}}, +/* 63607 */ {(14<<2)|2,{38,55,0}}, +/* 63608 */ {(14<<2)|2,{38,56,0}}, +/* 63609 */ {(14<<2)|2,{38,56,0}}, +/* 63610 */ {(14<<2)|2,{38,56,0}}, +/* 63611 */ {(14<<2)|2,{38,56,0}}, +/* 63612 */ {(14<<2)|2,{38,57,0}}, +/* 63613 */ {(14<<2)|2,{38,57,0}}, +/* 63614 */ {(14<<2)|2,{38,57,0}}, +/* 63615 */ {(14<<2)|2,{38,57,0}}, +/* 63616 */ {(14<<2)|2,{38,61,0}}, +/* 63617 */ {(14<<2)|2,{38,61,0}}, +/* 63618 */ {(14<<2)|2,{38,61,0}}, +/* 63619 */ {(14<<2)|2,{38,61,0}}, +/* 63620 */ {(14<<2)|2,{38,65,0}}, +/* 63621 */ {(14<<2)|2,{38,65,0}}, +/* 63622 */ {(14<<2)|2,{38,65,0}}, +/* 63623 */ {(14<<2)|2,{38,65,0}}, +/* 63624 */ {(14<<2)|2,{38,95,0}}, +/* 63625 */ {(14<<2)|2,{38,95,0}}, +/* 63626 */ {(14<<2)|2,{38,95,0}}, +/* 63627 */ {(14<<2)|2,{38,95,0}}, +/* 63628 */ {(14<<2)|2,{38,98,0}}, +/* 63629 */ {(14<<2)|2,{38,98,0}}, +/* 63630 */ {(14<<2)|2,{38,98,0}}, +/* 63631 */ {(14<<2)|2,{38,98,0}}, +/* 63632 */ {(14<<2)|2,{38,100,0}}, +/* 63633 */ {(14<<2)|2,{38,100,0}}, +/* 63634 */ {(14<<2)|2,{38,100,0}}, +/* 63635 */ {(14<<2)|2,{38,100,0}}, +/* 63636 */ {(14<<2)|2,{38,102,0}}, +/* 63637 */ {(14<<2)|2,{38,102,0}}, +/* 63638 */ {(14<<2)|2,{38,102,0}}, +/* 63639 */ {(14<<2)|2,{38,102,0}}, +/* 63640 */ {(14<<2)|2,{38,103,0}}, +/* 63641 */ {(14<<2)|2,{38,103,0}}, +/* 63642 */ {(14<<2)|2,{38,103,0}}, +/* 63643 */ {(14<<2)|2,{38,103,0}}, +/* 63644 */ {(14<<2)|2,{38,104,0}}, +/* 63645 */ {(14<<2)|2,{38,104,0}}, +/* 63646 */ {(14<<2)|2,{38,104,0}}, +/* 63647 */ {(14<<2)|2,{38,104,0}}, +/* 63648 */ {(14<<2)|2,{38,108,0}}, +/* 63649 */ {(14<<2)|2,{38,108,0}}, +/* 63650 */ {(14<<2)|2,{38,108,0}}, +/* 63651 */ {(14<<2)|2,{38,108,0}}, +/* 63652 */ {(14<<2)|2,{38,109,0}}, +/* 63653 */ {(14<<2)|2,{38,109,0}}, +/* 63654 */ {(14<<2)|2,{38,109,0}}, +/* 63655 */ {(14<<2)|2,{38,109,0}}, +/* 63656 */ {(14<<2)|2,{38,110,0}}, +/* 63657 */ {(14<<2)|2,{38,110,0}}, +/* 63658 */ {(14<<2)|2,{38,110,0}}, +/* 63659 */ {(14<<2)|2,{38,110,0}}, +/* 63660 */ {(14<<2)|2,{38,112,0}}, +/* 63661 */ {(14<<2)|2,{38,112,0}}, +/* 63662 */ {(14<<2)|2,{38,112,0}}, +/* 63663 */ {(14<<2)|2,{38,112,0}}, +/* 63664 */ {(14<<2)|2,{38,114,0}}, +/* 63665 */ {(14<<2)|2,{38,114,0}}, +/* 63666 */ {(14<<2)|2,{38,114,0}}, +/* 63667 */ {(14<<2)|2,{38,114,0}}, +/* 63668 */ {(14<<2)|2,{38,117,0}}, +/* 63669 */ {(14<<2)|2,{38,117,0}}, +/* 63670 */ {(14<<2)|2,{38,117,0}}, +/* 63671 */ {(14<<2)|2,{38,117,0}}, +/* 63672 */ {(15<<2)|2,{38,58,0}}, +/* 63673 */ {(15<<2)|2,{38,58,0}}, +/* 63674 */ {(15<<2)|2,{38,66,0}}, +/* 63675 */ {(15<<2)|2,{38,66,0}}, +/* 63676 */ {(15<<2)|2,{38,67,0}}, +/* 63677 */ {(15<<2)|2,{38,67,0}}, +/* 63678 */ {(15<<2)|2,{38,68,0}}, +/* 63679 */ {(15<<2)|2,{38,68,0}}, +/* 63680 */ {(15<<2)|2,{38,69,0}}, +/* 63681 */ {(15<<2)|2,{38,69,0}}, +/* 63682 */ {(15<<2)|2,{38,70,0}}, +/* 63683 */ {(15<<2)|2,{38,70,0}}, +/* 63684 */ {(15<<2)|2,{38,71,0}}, +/* 63685 */ {(15<<2)|2,{38,71,0}}, +/* 63686 */ {(15<<2)|2,{38,72,0}}, +/* 63687 */ {(15<<2)|2,{38,72,0}}, +/* 63688 */ {(15<<2)|2,{38,73,0}}, +/* 63689 */ {(15<<2)|2,{38,73,0}}, +/* 63690 */ {(15<<2)|2,{38,74,0}}, +/* 63691 */ {(15<<2)|2,{38,74,0}}, +/* 63692 */ {(15<<2)|2,{38,75,0}}, +/* 63693 */ {(15<<2)|2,{38,75,0}}, +/* 63694 */ {(15<<2)|2,{38,76,0}}, +/* 63695 */ {(15<<2)|2,{38,76,0}}, +/* 63696 */ {(15<<2)|2,{38,77,0}}, +/* 63697 */ {(15<<2)|2,{38,77,0}}, +/* 63698 */ {(15<<2)|2,{38,78,0}}, +/* 63699 */ {(15<<2)|2,{38,78,0}}, +/* 63700 */ {(15<<2)|2,{38,79,0}}, +/* 63701 */ {(15<<2)|2,{38,79,0}}, +/* 63702 */ {(15<<2)|2,{38,80,0}}, +/* 63703 */ {(15<<2)|2,{38,80,0}}, +/* 63704 */ {(15<<2)|2,{38,81,0}}, +/* 63705 */ {(15<<2)|2,{38,81,0}}, +/* 63706 */ {(15<<2)|2,{38,82,0}}, +/* 63707 */ {(15<<2)|2,{38,82,0}}, +/* 63708 */ {(15<<2)|2,{38,83,0}}, +/* 63709 */ {(15<<2)|2,{38,83,0}}, +/* 63710 */ {(15<<2)|2,{38,84,0}}, +/* 63711 */ {(15<<2)|2,{38,84,0}}, +/* 63712 */ {(15<<2)|2,{38,85,0}}, +/* 63713 */ {(15<<2)|2,{38,85,0}}, +/* 63714 */ {(15<<2)|2,{38,86,0}}, +/* 63715 */ {(15<<2)|2,{38,86,0}}, +/* 63716 */ {(15<<2)|2,{38,87,0}}, +/* 63717 */ {(15<<2)|2,{38,87,0}}, +/* 63718 */ {(15<<2)|2,{38,89,0}}, +/* 63719 */ {(15<<2)|2,{38,89,0}}, +/* 63720 */ {(15<<2)|2,{38,106,0}}, +/* 63721 */ {(15<<2)|2,{38,106,0}}, +/* 63722 */ {(15<<2)|2,{38,107,0}}, +/* 63723 */ {(15<<2)|2,{38,107,0}}, +/* 63724 */ {(15<<2)|2,{38,113,0}}, +/* 63725 */ {(15<<2)|2,{38,113,0}}, +/* 63726 */ {(15<<2)|2,{38,118,0}}, +/* 63727 */ {(15<<2)|2,{38,118,0}}, +/* 63728 */ {(15<<2)|2,{38,119,0}}, +/* 63729 */ {(15<<2)|2,{38,119,0}}, +/* 63730 */ {(15<<2)|2,{38,120,0}}, +/* 63731 */ {(15<<2)|2,{38,120,0}}, +/* 63732 */ {(15<<2)|2,{38,121,0}}, +/* 63733 */ {(15<<2)|2,{38,121,0}}, +/* 63734 */ {(15<<2)|2,{38,122,0}}, +/* 63735 */ {(15<<2)|2,{38,122,0}}, +/* 63736 */ {(16<<2)|2,{38,38,0}}, +/* 63737 */ {(16<<2)|2,{38,42,0}}, +/* 63738 */ {(16<<2)|2,{38,44,0}}, +/* 63739 */ {(16<<2)|2,{38,59,0}}, +/* 63740 */ {(16<<2)|2,{38,88,0}}, +/* 63741 */ {(16<<2)|2,{38,90,0}}, +/* 63742 */ {(8<<2)|1,{38,0,0}}, +/* 63743 */ {(8<<2)|1,{38,0,0}}, +/* 63744 */ {(13<<2)|2,{42,48,0}}, +/* 63745 */ {(13<<2)|2,{42,48,0}}, +/* 63746 */ {(13<<2)|2,{42,48,0}}, +/* 63747 */ {(13<<2)|2,{42,48,0}}, +/* 63748 */ {(13<<2)|2,{42,48,0}}, +/* 63749 */ {(13<<2)|2,{42,48,0}}, +/* 63750 */ {(13<<2)|2,{42,48,0}}, +/* 63751 */ {(13<<2)|2,{42,48,0}}, +/* 63752 */ {(13<<2)|2,{42,49,0}}, +/* 63753 */ {(13<<2)|2,{42,49,0}}, +/* 63754 */ {(13<<2)|2,{42,49,0}}, +/* 63755 */ {(13<<2)|2,{42,49,0}}, +/* 63756 */ {(13<<2)|2,{42,49,0}}, +/* 63757 */ {(13<<2)|2,{42,49,0}}, +/* 63758 */ {(13<<2)|2,{42,49,0}}, +/* 63759 */ {(13<<2)|2,{42,49,0}}, +/* 63760 */ {(13<<2)|2,{42,50,0}}, +/* 63761 */ {(13<<2)|2,{42,50,0}}, +/* 63762 */ {(13<<2)|2,{42,50,0}}, +/* 63763 */ {(13<<2)|2,{42,50,0}}, +/* 63764 */ {(13<<2)|2,{42,50,0}}, +/* 63765 */ {(13<<2)|2,{42,50,0}}, +/* 63766 */ {(13<<2)|2,{42,50,0}}, +/* 63767 */ {(13<<2)|2,{42,50,0}}, +/* 63768 */ {(13<<2)|2,{42,97,0}}, +/* 63769 */ {(13<<2)|2,{42,97,0}}, +/* 63770 */ {(13<<2)|2,{42,97,0}}, +/* 63771 */ {(13<<2)|2,{42,97,0}}, +/* 63772 */ {(13<<2)|2,{42,97,0}}, +/* 63773 */ {(13<<2)|2,{42,97,0}}, +/* 63774 */ {(13<<2)|2,{42,97,0}}, +/* 63775 */ {(13<<2)|2,{42,97,0}}, +/* 63776 */ {(13<<2)|2,{42,99,0}}, +/* 63777 */ {(13<<2)|2,{42,99,0}}, +/* 63778 */ {(13<<2)|2,{42,99,0}}, +/* 63779 */ {(13<<2)|2,{42,99,0}}, +/* 63780 */ {(13<<2)|2,{42,99,0}}, +/* 63781 */ {(13<<2)|2,{42,99,0}}, +/* 63782 */ {(13<<2)|2,{42,99,0}}, +/* 63783 */ {(13<<2)|2,{42,99,0}}, +/* 63784 */ {(13<<2)|2,{42,101,0}}, +/* 63785 */ {(13<<2)|2,{42,101,0}}, +/* 63786 */ {(13<<2)|2,{42,101,0}}, +/* 63787 */ {(13<<2)|2,{42,101,0}}, +/* 63788 */ {(13<<2)|2,{42,101,0}}, +/* 63789 */ {(13<<2)|2,{42,101,0}}, +/* 63790 */ {(13<<2)|2,{42,101,0}}, +/* 63791 */ {(13<<2)|2,{42,101,0}}, +/* 63792 */ {(13<<2)|2,{42,105,0}}, +/* 63793 */ {(13<<2)|2,{42,105,0}}, +/* 63794 */ {(13<<2)|2,{42,105,0}}, +/* 63795 */ {(13<<2)|2,{42,105,0}}, +/* 63796 */ {(13<<2)|2,{42,105,0}}, +/* 63797 */ {(13<<2)|2,{42,105,0}}, +/* 63798 */ {(13<<2)|2,{42,105,0}}, +/* 63799 */ {(13<<2)|2,{42,105,0}}, +/* 63800 */ {(13<<2)|2,{42,111,0}}, +/* 63801 */ {(13<<2)|2,{42,111,0}}, +/* 63802 */ {(13<<2)|2,{42,111,0}}, +/* 63803 */ {(13<<2)|2,{42,111,0}}, +/* 63804 */ {(13<<2)|2,{42,111,0}}, +/* 63805 */ {(13<<2)|2,{42,111,0}}, +/* 63806 */ {(13<<2)|2,{42,111,0}}, +/* 63807 */ {(13<<2)|2,{42,111,0}}, +/* 63808 */ {(13<<2)|2,{42,115,0}}, +/* 63809 */ {(13<<2)|2,{42,115,0}}, +/* 63810 */ {(13<<2)|2,{42,115,0}}, +/* 63811 */ {(13<<2)|2,{42,115,0}}, +/* 63812 */ {(13<<2)|2,{42,115,0}}, +/* 63813 */ {(13<<2)|2,{42,115,0}}, +/* 63814 */ {(13<<2)|2,{42,115,0}}, +/* 63815 */ {(13<<2)|2,{42,115,0}}, +/* 63816 */ {(13<<2)|2,{42,116,0}}, +/* 63817 */ {(13<<2)|2,{42,116,0}}, +/* 63818 */ {(13<<2)|2,{42,116,0}}, +/* 63819 */ {(13<<2)|2,{42,116,0}}, +/* 63820 */ {(13<<2)|2,{42,116,0}}, +/* 63821 */ {(13<<2)|2,{42,116,0}}, +/* 63822 */ {(13<<2)|2,{42,116,0}}, +/* 63823 */ {(13<<2)|2,{42,116,0}}, +/* 63824 */ {(14<<2)|2,{42,32,0}}, +/* 63825 */ {(14<<2)|2,{42,32,0}}, +/* 63826 */ {(14<<2)|2,{42,32,0}}, +/* 63827 */ {(14<<2)|2,{42,32,0}}, +/* 63828 */ {(14<<2)|2,{42,37,0}}, +/* 63829 */ {(14<<2)|2,{42,37,0}}, +/* 63830 */ {(14<<2)|2,{42,37,0}}, +/* 63831 */ {(14<<2)|2,{42,37,0}}, +/* 63832 */ {(14<<2)|2,{42,45,0}}, +/* 63833 */ {(14<<2)|2,{42,45,0}}, +/* 63834 */ {(14<<2)|2,{42,45,0}}, +/* 63835 */ {(14<<2)|2,{42,45,0}}, +/* 63836 */ {(14<<2)|2,{42,46,0}}, +/* 63837 */ {(14<<2)|2,{42,46,0}}, +/* 63838 */ {(14<<2)|2,{42,46,0}}, +/* 63839 */ {(14<<2)|2,{42,46,0}}, +/* 63840 */ {(14<<2)|2,{42,47,0}}, +/* 63841 */ {(14<<2)|2,{42,47,0}}, +/* 63842 */ {(14<<2)|2,{42,47,0}}, +/* 63843 */ {(14<<2)|2,{42,47,0}}, +/* 63844 */ {(14<<2)|2,{42,51,0}}, +/* 63845 */ {(14<<2)|2,{42,51,0}}, +/* 63846 */ {(14<<2)|2,{42,51,0}}, +/* 63847 */ {(14<<2)|2,{42,51,0}}, +/* 63848 */ {(14<<2)|2,{42,52,0}}, +/* 63849 */ {(14<<2)|2,{42,52,0}}, +/* 63850 */ {(14<<2)|2,{42,52,0}}, +/* 63851 */ {(14<<2)|2,{42,52,0}}, +/* 63852 */ {(14<<2)|2,{42,53,0}}, +/* 63853 */ {(14<<2)|2,{42,53,0}}, +/* 63854 */ {(14<<2)|2,{42,53,0}}, +/* 63855 */ {(14<<2)|2,{42,53,0}}, +/* 63856 */ {(14<<2)|2,{42,54,0}}, +/* 63857 */ {(14<<2)|2,{42,54,0}}, +/* 63858 */ {(14<<2)|2,{42,54,0}}, +/* 63859 */ {(14<<2)|2,{42,54,0}}, +/* 63860 */ {(14<<2)|2,{42,55,0}}, +/* 63861 */ {(14<<2)|2,{42,55,0}}, +/* 63862 */ {(14<<2)|2,{42,55,0}}, +/* 63863 */ {(14<<2)|2,{42,55,0}}, +/* 63864 */ {(14<<2)|2,{42,56,0}}, +/* 63865 */ {(14<<2)|2,{42,56,0}}, +/* 63866 */ {(14<<2)|2,{42,56,0}}, +/* 63867 */ {(14<<2)|2,{42,56,0}}, +/* 63868 */ {(14<<2)|2,{42,57,0}}, +/* 63869 */ {(14<<2)|2,{42,57,0}}, +/* 63870 */ {(14<<2)|2,{42,57,0}}, +/* 63871 */ {(14<<2)|2,{42,57,0}}, +/* 63872 */ {(14<<2)|2,{42,61,0}}, +/* 63873 */ {(14<<2)|2,{42,61,0}}, +/* 63874 */ {(14<<2)|2,{42,61,0}}, +/* 63875 */ {(14<<2)|2,{42,61,0}}, +/* 63876 */ {(14<<2)|2,{42,65,0}}, +/* 63877 */ {(14<<2)|2,{42,65,0}}, +/* 63878 */ {(14<<2)|2,{42,65,0}}, +/* 63879 */ {(14<<2)|2,{42,65,0}}, +/* 63880 */ {(14<<2)|2,{42,95,0}}, +/* 63881 */ {(14<<2)|2,{42,95,0}}, +/* 63882 */ {(14<<2)|2,{42,95,0}}, +/* 63883 */ {(14<<2)|2,{42,95,0}}, +/* 63884 */ {(14<<2)|2,{42,98,0}}, +/* 63885 */ {(14<<2)|2,{42,98,0}}, +/* 63886 */ {(14<<2)|2,{42,98,0}}, +/* 63887 */ {(14<<2)|2,{42,98,0}}, +/* 63888 */ {(14<<2)|2,{42,100,0}}, +/* 63889 */ {(14<<2)|2,{42,100,0}}, +/* 63890 */ {(14<<2)|2,{42,100,0}}, +/* 63891 */ {(14<<2)|2,{42,100,0}}, +/* 63892 */ {(14<<2)|2,{42,102,0}}, +/* 63893 */ {(14<<2)|2,{42,102,0}}, +/* 63894 */ {(14<<2)|2,{42,102,0}}, +/* 63895 */ {(14<<2)|2,{42,102,0}}, +/* 63896 */ {(14<<2)|2,{42,103,0}}, +/* 63897 */ {(14<<2)|2,{42,103,0}}, +/* 63898 */ {(14<<2)|2,{42,103,0}}, +/* 63899 */ {(14<<2)|2,{42,103,0}}, +/* 63900 */ {(14<<2)|2,{42,104,0}}, +/* 63901 */ {(14<<2)|2,{42,104,0}}, +/* 63902 */ {(14<<2)|2,{42,104,0}}, +/* 63903 */ {(14<<2)|2,{42,104,0}}, +/* 63904 */ {(14<<2)|2,{42,108,0}}, +/* 63905 */ {(14<<2)|2,{42,108,0}}, +/* 63906 */ {(14<<2)|2,{42,108,0}}, +/* 63907 */ {(14<<2)|2,{42,108,0}}, +/* 63908 */ {(14<<2)|2,{42,109,0}}, +/* 63909 */ {(14<<2)|2,{42,109,0}}, +/* 63910 */ {(14<<2)|2,{42,109,0}}, +/* 63911 */ {(14<<2)|2,{42,109,0}}, +/* 63912 */ {(14<<2)|2,{42,110,0}}, +/* 63913 */ {(14<<2)|2,{42,110,0}}, +/* 63914 */ {(14<<2)|2,{42,110,0}}, +/* 63915 */ {(14<<2)|2,{42,110,0}}, +/* 63916 */ {(14<<2)|2,{42,112,0}}, +/* 63917 */ {(14<<2)|2,{42,112,0}}, +/* 63918 */ {(14<<2)|2,{42,112,0}}, +/* 63919 */ {(14<<2)|2,{42,112,0}}, +/* 63920 */ {(14<<2)|2,{42,114,0}}, +/* 63921 */ {(14<<2)|2,{42,114,0}}, +/* 63922 */ {(14<<2)|2,{42,114,0}}, +/* 63923 */ {(14<<2)|2,{42,114,0}}, +/* 63924 */ {(14<<2)|2,{42,117,0}}, +/* 63925 */ {(14<<2)|2,{42,117,0}}, +/* 63926 */ {(14<<2)|2,{42,117,0}}, +/* 63927 */ {(14<<2)|2,{42,117,0}}, +/* 63928 */ {(15<<2)|2,{42,58,0}}, +/* 63929 */ {(15<<2)|2,{42,58,0}}, +/* 63930 */ {(15<<2)|2,{42,66,0}}, +/* 63931 */ {(15<<2)|2,{42,66,0}}, +/* 63932 */ {(15<<2)|2,{42,67,0}}, +/* 63933 */ {(15<<2)|2,{42,67,0}}, +/* 63934 */ {(15<<2)|2,{42,68,0}}, +/* 63935 */ {(15<<2)|2,{42,68,0}}, +/* 63936 */ {(15<<2)|2,{42,69,0}}, +/* 63937 */ {(15<<2)|2,{42,69,0}}, +/* 63938 */ {(15<<2)|2,{42,70,0}}, +/* 63939 */ {(15<<2)|2,{42,70,0}}, +/* 63940 */ {(15<<2)|2,{42,71,0}}, +/* 63941 */ {(15<<2)|2,{42,71,0}}, +/* 63942 */ {(15<<2)|2,{42,72,0}}, +/* 63943 */ {(15<<2)|2,{42,72,0}}, +/* 63944 */ {(15<<2)|2,{42,73,0}}, +/* 63945 */ {(15<<2)|2,{42,73,0}}, +/* 63946 */ {(15<<2)|2,{42,74,0}}, +/* 63947 */ {(15<<2)|2,{42,74,0}}, +/* 63948 */ {(15<<2)|2,{42,75,0}}, +/* 63949 */ {(15<<2)|2,{42,75,0}}, +/* 63950 */ {(15<<2)|2,{42,76,0}}, +/* 63951 */ {(15<<2)|2,{42,76,0}}, +/* 63952 */ {(15<<2)|2,{42,77,0}}, +/* 63953 */ {(15<<2)|2,{42,77,0}}, +/* 63954 */ {(15<<2)|2,{42,78,0}}, +/* 63955 */ {(15<<2)|2,{42,78,0}}, +/* 63956 */ {(15<<2)|2,{42,79,0}}, +/* 63957 */ {(15<<2)|2,{42,79,0}}, +/* 63958 */ {(15<<2)|2,{42,80,0}}, +/* 63959 */ {(15<<2)|2,{42,80,0}}, +/* 63960 */ {(15<<2)|2,{42,81,0}}, +/* 63961 */ {(15<<2)|2,{42,81,0}}, +/* 63962 */ {(15<<2)|2,{42,82,0}}, +/* 63963 */ {(15<<2)|2,{42,82,0}}, +/* 63964 */ {(15<<2)|2,{42,83,0}}, +/* 63965 */ {(15<<2)|2,{42,83,0}}, +/* 63966 */ {(15<<2)|2,{42,84,0}}, +/* 63967 */ {(15<<2)|2,{42,84,0}}, +/* 63968 */ {(15<<2)|2,{42,85,0}}, +/* 63969 */ {(15<<2)|2,{42,85,0}}, +/* 63970 */ {(15<<2)|2,{42,86,0}}, +/* 63971 */ {(15<<2)|2,{42,86,0}}, +/* 63972 */ {(15<<2)|2,{42,87,0}}, +/* 63973 */ {(15<<2)|2,{42,87,0}}, +/* 63974 */ {(15<<2)|2,{42,89,0}}, +/* 63975 */ {(15<<2)|2,{42,89,0}}, +/* 63976 */ {(15<<2)|2,{42,106,0}}, +/* 63977 */ {(15<<2)|2,{42,106,0}}, +/* 63978 */ {(15<<2)|2,{42,107,0}}, +/* 63979 */ {(15<<2)|2,{42,107,0}}, +/* 63980 */ {(15<<2)|2,{42,113,0}}, +/* 63981 */ {(15<<2)|2,{42,113,0}}, +/* 63982 */ {(15<<2)|2,{42,118,0}}, +/* 63983 */ {(15<<2)|2,{42,118,0}}, +/* 63984 */ {(15<<2)|2,{42,119,0}}, +/* 63985 */ {(15<<2)|2,{42,119,0}}, +/* 63986 */ {(15<<2)|2,{42,120,0}}, +/* 63987 */ {(15<<2)|2,{42,120,0}}, +/* 63988 */ {(15<<2)|2,{42,121,0}}, +/* 63989 */ {(15<<2)|2,{42,121,0}}, +/* 63990 */ {(15<<2)|2,{42,122,0}}, +/* 63991 */ {(15<<2)|2,{42,122,0}}, +/* 63992 */ {(16<<2)|2,{42,38,0}}, +/* 63993 */ {(16<<2)|2,{42,42,0}}, +/* 63994 */ {(16<<2)|2,{42,44,0}}, +/* 63995 */ {(16<<2)|2,{42,59,0}}, +/* 63996 */ {(16<<2)|2,{42,88,0}}, +/* 63997 */ {(16<<2)|2,{42,90,0}}, +/* 63998 */ {(8<<2)|1,{42,0,0}}, +/* 63999 */ {(8<<2)|1,{42,0,0}}, +/* 64000 */ {(13<<2)|2,{44,48,0}}, +/* 64001 */ {(13<<2)|2,{44,48,0}}, +/* 64002 */ {(13<<2)|2,{44,48,0}}, +/* 64003 */ {(13<<2)|2,{44,48,0}}, +/* 64004 */ {(13<<2)|2,{44,48,0}}, +/* 64005 */ {(13<<2)|2,{44,48,0}}, +/* 64006 */ {(13<<2)|2,{44,48,0}}, +/* 64007 */ {(13<<2)|2,{44,48,0}}, +/* 64008 */ {(13<<2)|2,{44,49,0}}, +/* 64009 */ {(13<<2)|2,{44,49,0}}, +/* 64010 */ {(13<<2)|2,{44,49,0}}, +/* 64011 */ {(13<<2)|2,{44,49,0}}, +/* 64012 */ {(13<<2)|2,{44,49,0}}, +/* 64013 */ {(13<<2)|2,{44,49,0}}, +/* 64014 */ {(13<<2)|2,{44,49,0}}, +/* 64015 */ {(13<<2)|2,{44,49,0}}, +/* 64016 */ {(13<<2)|2,{44,50,0}}, +/* 64017 */ {(13<<2)|2,{44,50,0}}, +/* 64018 */ {(13<<2)|2,{44,50,0}}, +/* 64019 */ {(13<<2)|2,{44,50,0}}, +/* 64020 */ {(13<<2)|2,{44,50,0}}, +/* 64021 */ {(13<<2)|2,{44,50,0}}, +/* 64022 */ {(13<<2)|2,{44,50,0}}, +/* 64023 */ {(13<<2)|2,{44,50,0}}, +/* 64024 */ {(13<<2)|2,{44,97,0}}, +/* 64025 */ {(13<<2)|2,{44,97,0}}, +/* 64026 */ {(13<<2)|2,{44,97,0}}, +/* 64027 */ {(13<<2)|2,{44,97,0}}, +/* 64028 */ {(13<<2)|2,{44,97,0}}, +/* 64029 */ {(13<<2)|2,{44,97,0}}, +/* 64030 */ {(13<<2)|2,{44,97,0}}, +/* 64031 */ {(13<<2)|2,{44,97,0}}, +/* 64032 */ {(13<<2)|2,{44,99,0}}, +/* 64033 */ {(13<<2)|2,{44,99,0}}, +/* 64034 */ {(13<<2)|2,{44,99,0}}, +/* 64035 */ {(13<<2)|2,{44,99,0}}, +/* 64036 */ {(13<<2)|2,{44,99,0}}, +/* 64037 */ {(13<<2)|2,{44,99,0}}, +/* 64038 */ {(13<<2)|2,{44,99,0}}, +/* 64039 */ {(13<<2)|2,{44,99,0}}, +/* 64040 */ {(13<<2)|2,{44,101,0}}, +/* 64041 */ {(13<<2)|2,{44,101,0}}, +/* 64042 */ {(13<<2)|2,{44,101,0}}, +/* 64043 */ {(13<<2)|2,{44,101,0}}, +/* 64044 */ {(13<<2)|2,{44,101,0}}, +/* 64045 */ {(13<<2)|2,{44,101,0}}, +/* 64046 */ {(13<<2)|2,{44,101,0}}, +/* 64047 */ {(13<<2)|2,{44,101,0}}, +/* 64048 */ {(13<<2)|2,{44,105,0}}, +/* 64049 */ {(13<<2)|2,{44,105,0}}, +/* 64050 */ {(13<<2)|2,{44,105,0}}, +/* 64051 */ {(13<<2)|2,{44,105,0}}, +/* 64052 */ {(13<<2)|2,{44,105,0}}, +/* 64053 */ {(13<<2)|2,{44,105,0}}, +/* 64054 */ {(13<<2)|2,{44,105,0}}, +/* 64055 */ {(13<<2)|2,{44,105,0}}, +/* 64056 */ {(13<<2)|2,{44,111,0}}, +/* 64057 */ {(13<<2)|2,{44,111,0}}, +/* 64058 */ {(13<<2)|2,{44,111,0}}, +/* 64059 */ {(13<<2)|2,{44,111,0}}, +/* 64060 */ {(13<<2)|2,{44,111,0}}, +/* 64061 */ {(13<<2)|2,{44,111,0}}, +/* 64062 */ {(13<<2)|2,{44,111,0}}, +/* 64063 */ {(13<<2)|2,{44,111,0}}, +/* 64064 */ {(13<<2)|2,{44,115,0}}, +/* 64065 */ {(13<<2)|2,{44,115,0}}, +/* 64066 */ {(13<<2)|2,{44,115,0}}, +/* 64067 */ {(13<<2)|2,{44,115,0}}, +/* 64068 */ {(13<<2)|2,{44,115,0}}, +/* 64069 */ {(13<<2)|2,{44,115,0}}, +/* 64070 */ {(13<<2)|2,{44,115,0}}, +/* 64071 */ {(13<<2)|2,{44,115,0}}, +/* 64072 */ {(13<<2)|2,{44,116,0}}, +/* 64073 */ {(13<<2)|2,{44,116,0}}, +/* 64074 */ {(13<<2)|2,{44,116,0}}, +/* 64075 */ {(13<<2)|2,{44,116,0}}, +/* 64076 */ {(13<<2)|2,{44,116,0}}, +/* 64077 */ {(13<<2)|2,{44,116,0}}, +/* 64078 */ {(13<<2)|2,{44,116,0}}, +/* 64079 */ {(13<<2)|2,{44,116,0}}, +/* 64080 */ {(14<<2)|2,{44,32,0}}, +/* 64081 */ {(14<<2)|2,{44,32,0}}, +/* 64082 */ {(14<<2)|2,{44,32,0}}, +/* 64083 */ {(14<<2)|2,{44,32,0}}, +/* 64084 */ {(14<<2)|2,{44,37,0}}, +/* 64085 */ {(14<<2)|2,{44,37,0}}, +/* 64086 */ {(14<<2)|2,{44,37,0}}, +/* 64087 */ {(14<<2)|2,{44,37,0}}, +/* 64088 */ {(14<<2)|2,{44,45,0}}, +/* 64089 */ {(14<<2)|2,{44,45,0}}, +/* 64090 */ {(14<<2)|2,{44,45,0}}, +/* 64091 */ {(14<<2)|2,{44,45,0}}, +/* 64092 */ {(14<<2)|2,{44,46,0}}, +/* 64093 */ {(14<<2)|2,{44,46,0}}, +/* 64094 */ {(14<<2)|2,{44,46,0}}, +/* 64095 */ {(14<<2)|2,{44,46,0}}, +/* 64096 */ {(14<<2)|2,{44,47,0}}, +/* 64097 */ {(14<<2)|2,{44,47,0}}, +/* 64098 */ {(14<<2)|2,{44,47,0}}, +/* 64099 */ {(14<<2)|2,{44,47,0}}, +/* 64100 */ {(14<<2)|2,{44,51,0}}, +/* 64101 */ {(14<<2)|2,{44,51,0}}, +/* 64102 */ {(14<<2)|2,{44,51,0}}, +/* 64103 */ {(14<<2)|2,{44,51,0}}, +/* 64104 */ {(14<<2)|2,{44,52,0}}, +/* 64105 */ {(14<<2)|2,{44,52,0}}, +/* 64106 */ {(14<<2)|2,{44,52,0}}, +/* 64107 */ {(14<<2)|2,{44,52,0}}, +/* 64108 */ {(14<<2)|2,{44,53,0}}, +/* 64109 */ {(14<<2)|2,{44,53,0}}, +/* 64110 */ {(14<<2)|2,{44,53,0}}, +/* 64111 */ {(14<<2)|2,{44,53,0}}, +/* 64112 */ {(14<<2)|2,{44,54,0}}, +/* 64113 */ {(14<<2)|2,{44,54,0}}, +/* 64114 */ {(14<<2)|2,{44,54,0}}, +/* 64115 */ {(14<<2)|2,{44,54,0}}, +/* 64116 */ {(14<<2)|2,{44,55,0}}, +/* 64117 */ {(14<<2)|2,{44,55,0}}, +/* 64118 */ {(14<<2)|2,{44,55,0}}, +/* 64119 */ {(14<<2)|2,{44,55,0}}, +/* 64120 */ {(14<<2)|2,{44,56,0}}, +/* 64121 */ {(14<<2)|2,{44,56,0}}, +/* 64122 */ {(14<<2)|2,{44,56,0}}, +/* 64123 */ {(14<<2)|2,{44,56,0}}, +/* 64124 */ {(14<<2)|2,{44,57,0}}, +/* 64125 */ {(14<<2)|2,{44,57,0}}, +/* 64126 */ {(14<<2)|2,{44,57,0}}, +/* 64127 */ {(14<<2)|2,{44,57,0}}, +/* 64128 */ {(14<<2)|2,{44,61,0}}, +/* 64129 */ {(14<<2)|2,{44,61,0}}, +/* 64130 */ {(14<<2)|2,{44,61,0}}, +/* 64131 */ {(14<<2)|2,{44,61,0}}, +/* 64132 */ {(14<<2)|2,{44,65,0}}, +/* 64133 */ {(14<<2)|2,{44,65,0}}, +/* 64134 */ {(14<<2)|2,{44,65,0}}, +/* 64135 */ {(14<<2)|2,{44,65,0}}, +/* 64136 */ {(14<<2)|2,{44,95,0}}, +/* 64137 */ {(14<<2)|2,{44,95,0}}, +/* 64138 */ {(14<<2)|2,{44,95,0}}, +/* 64139 */ {(14<<2)|2,{44,95,0}}, +/* 64140 */ {(14<<2)|2,{44,98,0}}, +/* 64141 */ {(14<<2)|2,{44,98,0}}, +/* 64142 */ {(14<<2)|2,{44,98,0}}, +/* 64143 */ {(14<<2)|2,{44,98,0}}, +/* 64144 */ {(14<<2)|2,{44,100,0}}, +/* 64145 */ {(14<<2)|2,{44,100,0}}, +/* 64146 */ {(14<<2)|2,{44,100,0}}, +/* 64147 */ {(14<<2)|2,{44,100,0}}, +/* 64148 */ {(14<<2)|2,{44,102,0}}, +/* 64149 */ {(14<<2)|2,{44,102,0}}, +/* 64150 */ {(14<<2)|2,{44,102,0}}, +/* 64151 */ {(14<<2)|2,{44,102,0}}, +/* 64152 */ {(14<<2)|2,{44,103,0}}, +/* 64153 */ {(14<<2)|2,{44,103,0}}, +/* 64154 */ {(14<<2)|2,{44,103,0}}, +/* 64155 */ {(14<<2)|2,{44,103,0}}, +/* 64156 */ {(14<<2)|2,{44,104,0}}, +/* 64157 */ {(14<<2)|2,{44,104,0}}, +/* 64158 */ {(14<<2)|2,{44,104,0}}, +/* 64159 */ {(14<<2)|2,{44,104,0}}, +/* 64160 */ {(14<<2)|2,{44,108,0}}, +/* 64161 */ {(14<<2)|2,{44,108,0}}, +/* 64162 */ {(14<<2)|2,{44,108,0}}, +/* 64163 */ {(14<<2)|2,{44,108,0}}, +/* 64164 */ {(14<<2)|2,{44,109,0}}, +/* 64165 */ {(14<<2)|2,{44,109,0}}, +/* 64166 */ {(14<<2)|2,{44,109,0}}, +/* 64167 */ {(14<<2)|2,{44,109,0}}, +/* 64168 */ {(14<<2)|2,{44,110,0}}, +/* 64169 */ {(14<<2)|2,{44,110,0}}, +/* 64170 */ {(14<<2)|2,{44,110,0}}, +/* 64171 */ {(14<<2)|2,{44,110,0}}, +/* 64172 */ {(14<<2)|2,{44,112,0}}, +/* 64173 */ {(14<<2)|2,{44,112,0}}, +/* 64174 */ {(14<<2)|2,{44,112,0}}, +/* 64175 */ {(14<<2)|2,{44,112,0}}, +/* 64176 */ {(14<<2)|2,{44,114,0}}, +/* 64177 */ {(14<<2)|2,{44,114,0}}, +/* 64178 */ {(14<<2)|2,{44,114,0}}, +/* 64179 */ {(14<<2)|2,{44,114,0}}, +/* 64180 */ {(14<<2)|2,{44,117,0}}, +/* 64181 */ {(14<<2)|2,{44,117,0}}, +/* 64182 */ {(14<<2)|2,{44,117,0}}, +/* 64183 */ {(14<<2)|2,{44,117,0}}, +/* 64184 */ {(15<<2)|2,{44,58,0}}, +/* 64185 */ {(15<<2)|2,{44,58,0}}, +/* 64186 */ {(15<<2)|2,{44,66,0}}, +/* 64187 */ {(15<<2)|2,{44,66,0}}, +/* 64188 */ {(15<<2)|2,{44,67,0}}, +/* 64189 */ {(15<<2)|2,{44,67,0}}, +/* 64190 */ {(15<<2)|2,{44,68,0}}, +/* 64191 */ {(15<<2)|2,{44,68,0}}, +/* 64192 */ {(15<<2)|2,{44,69,0}}, +/* 64193 */ {(15<<2)|2,{44,69,0}}, +/* 64194 */ {(15<<2)|2,{44,70,0}}, +/* 64195 */ {(15<<2)|2,{44,70,0}}, +/* 64196 */ {(15<<2)|2,{44,71,0}}, +/* 64197 */ {(15<<2)|2,{44,71,0}}, +/* 64198 */ {(15<<2)|2,{44,72,0}}, +/* 64199 */ {(15<<2)|2,{44,72,0}}, +/* 64200 */ {(15<<2)|2,{44,73,0}}, +/* 64201 */ {(15<<2)|2,{44,73,0}}, +/* 64202 */ {(15<<2)|2,{44,74,0}}, +/* 64203 */ {(15<<2)|2,{44,74,0}}, +/* 64204 */ {(15<<2)|2,{44,75,0}}, +/* 64205 */ {(15<<2)|2,{44,75,0}}, +/* 64206 */ {(15<<2)|2,{44,76,0}}, +/* 64207 */ {(15<<2)|2,{44,76,0}}, +/* 64208 */ {(15<<2)|2,{44,77,0}}, +/* 64209 */ {(15<<2)|2,{44,77,0}}, +/* 64210 */ {(15<<2)|2,{44,78,0}}, +/* 64211 */ {(15<<2)|2,{44,78,0}}, +/* 64212 */ {(15<<2)|2,{44,79,0}}, +/* 64213 */ {(15<<2)|2,{44,79,0}}, +/* 64214 */ {(15<<2)|2,{44,80,0}}, +/* 64215 */ {(15<<2)|2,{44,80,0}}, +/* 64216 */ {(15<<2)|2,{44,81,0}}, +/* 64217 */ {(15<<2)|2,{44,81,0}}, +/* 64218 */ {(15<<2)|2,{44,82,0}}, +/* 64219 */ {(15<<2)|2,{44,82,0}}, +/* 64220 */ {(15<<2)|2,{44,83,0}}, +/* 64221 */ {(15<<2)|2,{44,83,0}}, +/* 64222 */ {(15<<2)|2,{44,84,0}}, +/* 64223 */ {(15<<2)|2,{44,84,0}}, +/* 64224 */ {(15<<2)|2,{44,85,0}}, +/* 64225 */ {(15<<2)|2,{44,85,0}}, +/* 64226 */ {(15<<2)|2,{44,86,0}}, +/* 64227 */ {(15<<2)|2,{44,86,0}}, +/* 64228 */ {(15<<2)|2,{44,87,0}}, +/* 64229 */ {(15<<2)|2,{44,87,0}}, +/* 64230 */ {(15<<2)|2,{44,89,0}}, +/* 64231 */ {(15<<2)|2,{44,89,0}}, +/* 64232 */ {(15<<2)|2,{44,106,0}}, +/* 64233 */ {(15<<2)|2,{44,106,0}}, +/* 64234 */ {(15<<2)|2,{44,107,0}}, +/* 64235 */ {(15<<2)|2,{44,107,0}}, +/* 64236 */ {(15<<2)|2,{44,113,0}}, +/* 64237 */ {(15<<2)|2,{44,113,0}}, +/* 64238 */ {(15<<2)|2,{44,118,0}}, +/* 64239 */ {(15<<2)|2,{44,118,0}}, +/* 64240 */ {(15<<2)|2,{44,119,0}}, +/* 64241 */ {(15<<2)|2,{44,119,0}}, +/* 64242 */ {(15<<2)|2,{44,120,0}}, +/* 64243 */ {(15<<2)|2,{44,120,0}}, +/* 64244 */ {(15<<2)|2,{44,121,0}}, +/* 64245 */ {(15<<2)|2,{44,121,0}}, +/* 64246 */ {(15<<2)|2,{44,122,0}}, +/* 64247 */ {(15<<2)|2,{44,122,0}}, +/* 64248 */ {(16<<2)|2,{44,38,0}}, +/* 64249 */ {(16<<2)|2,{44,42,0}}, +/* 64250 */ {(16<<2)|2,{44,44,0}}, +/* 64251 */ {(16<<2)|2,{44,59,0}}, +/* 64252 */ {(16<<2)|2,{44,88,0}}, +/* 64253 */ {(16<<2)|2,{44,90,0}}, +/* 64254 */ {(8<<2)|1,{44,0,0}}, +/* 64255 */ {(8<<2)|1,{44,0,0}}, +/* 64256 */ {(13<<2)|2,{59,48,0}}, +/* 64257 */ {(13<<2)|2,{59,48,0}}, +/* 64258 */ {(13<<2)|2,{59,48,0}}, +/* 64259 */ {(13<<2)|2,{59,48,0}}, +/* 64260 */ {(13<<2)|2,{59,48,0}}, +/* 64261 */ {(13<<2)|2,{59,48,0}}, +/* 64262 */ {(13<<2)|2,{59,48,0}}, +/* 64263 */ {(13<<2)|2,{59,48,0}}, +/* 64264 */ {(13<<2)|2,{59,49,0}}, +/* 64265 */ {(13<<2)|2,{59,49,0}}, +/* 64266 */ {(13<<2)|2,{59,49,0}}, +/* 64267 */ {(13<<2)|2,{59,49,0}}, +/* 64268 */ {(13<<2)|2,{59,49,0}}, +/* 64269 */ {(13<<2)|2,{59,49,0}}, +/* 64270 */ {(13<<2)|2,{59,49,0}}, +/* 64271 */ {(13<<2)|2,{59,49,0}}, +/* 64272 */ {(13<<2)|2,{59,50,0}}, +/* 64273 */ {(13<<2)|2,{59,50,0}}, +/* 64274 */ {(13<<2)|2,{59,50,0}}, +/* 64275 */ {(13<<2)|2,{59,50,0}}, +/* 64276 */ {(13<<2)|2,{59,50,0}}, +/* 64277 */ {(13<<2)|2,{59,50,0}}, +/* 64278 */ {(13<<2)|2,{59,50,0}}, +/* 64279 */ {(13<<2)|2,{59,50,0}}, +/* 64280 */ {(13<<2)|2,{59,97,0}}, +/* 64281 */ {(13<<2)|2,{59,97,0}}, +/* 64282 */ {(13<<2)|2,{59,97,0}}, +/* 64283 */ {(13<<2)|2,{59,97,0}}, +/* 64284 */ {(13<<2)|2,{59,97,0}}, +/* 64285 */ {(13<<2)|2,{59,97,0}}, +/* 64286 */ {(13<<2)|2,{59,97,0}}, +/* 64287 */ {(13<<2)|2,{59,97,0}}, +/* 64288 */ {(13<<2)|2,{59,99,0}}, +/* 64289 */ {(13<<2)|2,{59,99,0}}, +/* 64290 */ {(13<<2)|2,{59,99,0}}, +/* 64291 */ {(13<<2)|2,{59,99,0}}, +/* 64292 */ {(13<<2)|2,{59,99,0}}, +/* 64293 */ {(13<<2)|2,{59,99,0}}, +/* 64294 */ {(13<<2)|2,{59,99,0}}, +/* 64295 */ {(13<<2)|2,{59,99,0}}, +/* 64296 */ {(13<<2)|2,{59,101,0}}, +/* 64297 */ {(13<<2)|2,{59,101,0}}, +/* 64298 */ {(13<<2)|2,{59,101,0}}, +/* 64299 */ {(13<<2)|2,{59,101,0}}, +/* 64300 */ {(13<<2)|2,{59,101,0}}, +/* 64301 */ {(13<<2)|2,{59,101,0}}, +/* 64302 */ {(13<<2)|2,{59,101,0}}, +/* 64303 */ {(13<<2)|2,{59,101,0}}, +/* 64304 */ {(13<<2)|2,{59,105,0}}, +/* 64305 */ {(13<<2)|2,{59,105,0}}, +/* 64306 */ {(13<<2)|2,{59,105,0}}, +/* 64307 */ {(13<<2)|2,{59,105,0}}, +/* 64308 */ {(13<<2)|2,{59,105,0}}, +/* 64309 */ {(13<<2)|2,{59,105,0}}, +/* 64310 */ {(13<<2)|2,{59,105,0}}, +/* 64311 */ {(13<<2)|2,{59,105,0}}, +/* 64312 */ {(13<<2)|2,{59,111,0}}, +/* 64313 */ {(13<<2)|2,{59,111,0}}, +/* 64314 */ {(13<<2)|2,{59,111,0}}, +/* 64315 */ {(13<<2)|2,{59,111,0}}, +/* 64316 */ {(13<<2)|2,{59,111,0}}, +/* 64317 */ {(13<<2)|2,{59,111,0}}, +/* 64318 */ {(13<<2)|2,{59,111,0}}, +/* 64319 */ {(13<<2)|2,{59,111,0}}, +/* 64320 */ {(13<<2)|2,{59,115,0}}, +/* 64321 */ {(13<<2)|2,{59,115,0}}, +/* 64322 */ {(13<<2)|2,{59,115,0}}, +/* 64323 */ {(13<<2)|2,{59,115,0}}, +/* 64324 */ {(13<<2)|2,{59,115,0}}, +/* 64325 */ {(13<<2)|2,{59,115,0}}, +/* 64326 */ {(13<<2)|2,{59,115,0}}, +/* 64327 */ {(13<<2)|2,{59,115,0}}, +/* 64328 */ {(13<<2)|2,{59,116,0}}, +/* 64329 */ {(13<<2)|2,{59,116,0}}, +/* 64330 */ {(13<<2)|2,{59,116,0}}, +/* 64331 */ {(13<<2)|2,{59,116,0}}, +/* 64332 */ {(13<<2)|2,{59,116,0}}, +/* 64333 */ {(13<<2)|2,{59,116,0}}, +/* 64334 */ {(13<<2)|2,{59,116,0}}, +/* 64335 */ {(13<<2)|2,{59,116,0}}, +/* 64336 */ {(14<<2)|2,{59,32,0}}, +/* 64337 */ {(14<<2)|2,{59,32,0}}, +/* 64338 */ {(14<<2)|2,{59,32,0}}, +/* 64339 */ {(14<<2)|2,{59,32,0}}, +/* 64340 */ {(14<<2)|2,{59,37,0}}, +/* 64341 */ {(14<<2)|2,{59,37,0}}, +/* 64342 */ {(14<<2)|2,{59,37,0}}, +/* 64343 */ {(14<<2)|2,{59,37,0}}, +/* 64344 */ {(14<<2)|2,{59,45,0}}, +/* 64345 */ {(14<<2)|2,{59,45,0}}, +/* 64346 */ {(14<<2)|2,{59,45,0}}, +/* 64347 */ {(14<<2)|2,{59,45,0}}, +/* 64348 */ {(14<<2)|2,{59,46,0}}, +/* 64349 */ {(14<<2)|2,{59,46,0}}, +/* 64350 */ {(14<<2)|2,{59,46,0}}, +/* 64351 */ {(14<<2)|2,{59,46,0}}, +/* 64352 */ {(14<<2)|2,{59,47,0}}, +/* 64353 */ {(14<<2)|2,{59,47,0}}, +/* 64354 */ {(14<<2)|2,{59,47,0}}, +/* 64355 */ {(14<<2)|2,{59,47,0}}, +/* 64356 */ {(14<<2)|2,{59,51,0}}, +/* 64357 */ {(14<<2)|2,{59,51,0}}, +/* 64358 */ {(14<<2)|2,{59,51,0}}, +/* 64359 */ {(14<<2)|2,{59,51,0}}, +/* 64360 */ {(14<<2)|2,{59,52,0}}, +/* 64361 */ {(14<<2)|2,{59,52,0}}, +/* 64362 */ {(14<<2)|2,{59,52,0}}, +/* 64363 */ {(14<<2)|2,{59,52,0}}, +/* 64364 */ {(14<<2)|2,{59,53,0}}, +/* 64365 */ {(14<<2)|2,{59,53,0}}, +/* 64366 */ {(14<<2)|2,{59,53,0}}, +/* 64367 */ {(14<<2)|2,{59,53,0}}, +/* 64368 */ {(14<<2)|2,{59,54,0}}, +/* 64369 */ {(14<<2)|2,{59,54,0}}, +/* 64370 */ {(14<<2)|2,{59,54,0}}, +/* 64371 */ {(14<<2)|2,{59,54,0}}, +/* 64372 */ {(14<<2)|2,{59,55,0}}, +/* 64373 */ {(14<<2)|2,{59,55,0}}, +/* 64374 */ {(14<<2)|2,{59,55,0}}, +/* 64375 */ {(14<<2)|2,{59,55,0}}, +/* 64376 */ {(14<<2)|2,{59,56,0}}, +/* 64377 */ {(14<<2)|2,{59,56,0}}, +/* 64378 */ {(14<<2)|2,{59,56,0}}, +/* 64379 */ {(14<<2)|2,{59,56,0}}, +/* 64380 */ {(14<<2)|2,{59,57,0}}, +/* 64381 */ {(14<<2)|2,{59,57,0}}, +/* 64382 */ {(14<<2)|2,{59,57,0}}, +/* 64383 */ {(14<<2)|2,{59,57,0}}, +/* 64384 */ {(14<<2)|2,{59,61,0}}, +/* 64385 */ {(14<<2)|2,{59,61,0}}, +/* 64386 */ {(14<<2)|2,{59,61,0}}, +/* 64387 */ {(14<<2)|2,{59,61,0}}, +/* 64388 */ {(14<<2)|2,{59,65,0}}, +/* 64389 */ {(14<<2)|2,{59,65,0}}, +/* 64390 */ {(14<<2)|2,{59,65,0}}, +/* 64391 */ {(14<<2)|2,{59,65,0}}, +/* 64392 */ {(14<<2)|2,{59,95,0}}, +/* 64393 */ {(14<<2)|2,{59,95,0}}, +/* 64394 */ {(14<<2)|2,{59,95,0}}, +/* 64395 */ {(14<<2)|2,{59,95,0}}, +/* 64396 */ {(14<<2)|2,{59,98,0}}, +/* 64397 */ {(14<<2)|2,{59,98,0}}, +/* 64398 */ {(14<<2)|2,{59,98,0}}, +/* 64399 */ {(14<<2)|2,{59,98,0}}, +/* 64400 */ {(14<<2)|2,{59,100,0}}, +/* 64401 */ {(14<<2)|2,{59,100,0}}, +/* 64402 */ {(14<<2)|2,{59,100,0}}, +/* 64403 */ {(14<<2)|2,{59,100,0}}, +/* 64404 */ {(14<<2)|2,{59,102,0}}, +/* 64405 */ {(14<<2)|2,{59,102,0}}, +/* 64406 */ {(14<<2)|2,{59,102,0}}, +/* 64407 */ {(14<<2)|2,{59,102,0}}, +/* 64408 */ {(14<<2)|2,{59,103,0}}, +/* 64409 */ {(14<<2)|2,{59,103,0}}, +/* 64410 */ {(14<<2)|2,{59,103,0}}, +/* 64411 */ {(14<<2)|2,{59,103,0}}, +/* 64412 */ {(14<<2)|2,{59,104,0}}, +/* 64413 */ {(14<<2)|2,{59,104,0}}, +/* 64414 */ {(14<<2)|2,{59,104,0}}, +/* 64415 */ {(14<<2)|2,{59,104,0}}, +/* 64416 */ {(14<<2)|2,{59,108,0}}, +/* 64417 */ {(14<<2)|2,{59,108,0}}, +/* 64418 */ {(14<<2)|2,{59,108,0}}, +/* 64419 */ {(14<<2)|2,{59,108,0}}, +/* 64420 */ {(14<<2)|2,{59,109,0}}, +/* 64421 */ {(14<<2)|2,{59,109,0}}, +/* 64422 */ {(14<<2)|2,{59,109,0}}, +/* 64423 */ {(14<<2)|2,{59,109,0}}, +/* 64424 */ {(14<<2)|2,{59,110,0}}, +/* 64425 */ {(14<<2)|2,{59,110,0}}, +/* 64426 */ {(14<<2)|2,{59,110,0}}, +/* 64427 */ {(14<<2)|2,{59,110,0}}, +/* 64428 */ {(14<<2)|2,{59,112,0}}, +/* 64429 */ {(14<<2)|2,{59,112,0}}, +/* 64430 */ {(14<<2)|2,{59,112,0}}, +/* 64431 */ {(14<<2)|2,{59,112,0}}, +/* 64432 */ {(14<<2)|2,{59,114,0}}, +/* 64433 */ {(14<<2)|2,{59,114,0}}, +/* 64434 */ {(14<<2)|2,{59,114,0}}, +/* 64435 */ {(14<<2)|2,{59,114,0}}, +/* 64436 */ {(14<<2)|2,{59,117,0}}, +/* 64437 */ {(14<<2)|2,{59,117,0}}, +/* 64438 */ {(14<<2)|2,{59,117,0}}, +/* 64439 */ {(14<<2)|2,{59,117,0}}, +/* 64440 */ {(15<<2)|2,{59,58,0}}, +/* 64441 */ {(15<<2)|2,{59,58,0}}, +/* 64442 */ {(15<<2)|2,{59,66,0}}, +/* 64443 */ {(15<<2)|2,{59,66,0}}, +/* 64444 */ {(15<<2)|2,{59,67,0}}, +/* 64445 */ {(15<<2)|2,{59,67,0}}, +/* 64446 */ {(15<<2)|2,{59,68,0}}, +/* 64447 */ {(15<<2)|2,{59,68,0}}, +/* 64448 */ {(15<<2)|2,{59,69,0}}, +/* 64449 */ {(15<<2)|2,{59,69,0}}, +/* 64450 */ {(15<<2)|2,{59,70,0}}, +/* 64451 */ {(15<<2)|2,{59,70,0}}, +/* 64452 */ {(15<<2)|2,{59,71,0}}, +/* 64453 */ {(15<<2)|2,{59,71,0}}, +/* 64454 */ {(15<<2)|2,{59,72,0}}, +/* 64455 */ {(15<<2)|2,{59,72,0}}, +/* 64456 */ {(15<<2)|2,{59,73,0}}, +/* 64457 */ {(15<<2)|2,{59,73,0}}, +/* 64458 */ {(15<<2)|2,{59,74,0}}, +/* 64459 */ {(15<<2)|2,{59,74,0}}, +/* 64460 */ {(15<<2)|2,{59,75,0}}, +/* 64461 */ {(15<<2)|2,{59,75,0}}, +/* 64462 */ {(15<<2)|2,{59,76,0}}, +/* 64463 */ {(15<<2)|2,{59,76,0}}, +/* 64464 */ {(15<<2)|2,{59,77,0}}, +/* 64465 */ {(15<<2)|2,{59,77,0}}, +/* 64466 */ {(15<<2)|2,{59,78,0}}, +/* 64467 */ {(15<<2)|2,{59,78,0}}, +/* 64468 */ {(15<<2)|2,{59,79,0}}, +/* 64469 */ {(15<<2)|2,{59,79,0}}, +/* 64470 */ {(15<<2)|2,{59,80,0}}, +/* 64471 */ {(15<<2)|2,{59,80,0}}, +/* 64472 */ {(15<<2)|2,{59,81,0}}, +/* 64473 */ {(15<<2)|2,{59,81,0}}, +/* 64474 */ {(15<<2)|2,{59,82,0}}, +/* 64475 */ {(15<<2)|2,{59,82,0}}, +/* 64476 */ {(15<<2)|2,{59,83,0}}, +/* 64477 */ {(15<<2)|2,{59,83,0}}, +/* 64478 */ {(15<<2)|2,{59,84,0}}, +/* 64479 */ {(15<<2)|2,{59,84,0}}, +/* 64480 */ {(15<<2)|2,{59,85,0}}, +/* 64481 */ {(15<<2)|2,{59,85,0}}, +/* 64482 */ {(15<<2)|2,{59,86,0}}, +/* 64483 */ {(15<<2)|2,{59,86,0}}, +/* 64484 */ {(15<<2)|2,{59,87,0}}, +/* 64485 */ {(15<<2)|2,{59,87,0}}, +/* 64486 */ {(15<<2)|2,{59,89,0}}, +/* 64487 */ {(15<<2)|2,{59,89,0}}, +/* 64488 */ {(15<<2)|2,{59,106,0}}, +/* 64489 */ {(15<<2)|2,{59,106,0}}, +/* 64490 */ {(15<<2)|2,{59,107,0}}, +/* 64491 */ {(15<<2)|2,{59,107,0}}, +/* 64492 */ {(15<<2)|2,{59,113,0}}, +/* 64493 */ {(15<<2)|2,{59,113,0}}, +/* 64494 */ {(15<<2)|2,{59,118,0}}, +/* 64495 */ {(15<<2)|2,{59,118,0}}, +/* 64496 */ {(15<<2)|2,{59,119,0}}, +/* 64497 */ {(15<<2)|2,{59,119,0}}, +/* 64498 */ {(15<<2)|2,{59,120,0}}, +/* 64499 */ {(15<<2)|2,{59,120,0}}, +/* 64500 */ {(15<<2)|2,{59,121,0}}, +/* 64501 */ {(15<<2)|2,{59,121,0}}, +/* 64502 */ {(15<<2)|2,{59,122,0}}, +/* 64503 */ {(15<<2)|2,{59,122,0}}, +/* 64504 */ {(16<<2)|2,{59,38,0}}, +/* 64505 */ {(16<<2)|2,{59,42,0}}, +/* 64506 */ {(16<<2)|2,{59,44,0}}, +/* 64507 */ {(16<<2)|2,{59,59,0}}, +/* 64508 */ {(16<<2)|2,{59,88,0}}, +/* 64509 */ {(16<<2)|2,{59,90,0}}, +/* 64510 */ {(8<<2)|1,{59,0,0}}, +/* 64511 */ {(8<<2)|1,{59,0,0}}, +/* 64512 */ {(13<<2)|2,{88,48,0}}, +/* 64513 */ {(13<<2)|2,{88,48,0}}, +/* 64514 */ {(13<<2)|2,{88,48,0}}, +/* 64515 */ {(13<<2)|2,{88,48,0}}, +/* 64516 */ {(13<<2)|2,{88,48,0}}, +/* 64517 */ {(13<<2)|2,{88,48,0}}, +/* 64518 */ {(13<<2)|2,{88,48,0}}, +/* 64519 */ {(13<<2)|2,{88,48,0}}, +/* 64520 */ {(13<<2)|2,{88,49,0}}, +/* 64521 */ {(13<<2)|2,{88,49,0}}, +/* 64522 */ {(13<<2)|2,{88,49,0}}, +/* 64523 */ {(13<<2)|2,{88,49,0}}, +/* 64524 */ {(13<<2)|2,{88,49,0}}, +/* 64525 */ {(13<<2)|2,{88,49,0}}, +/* 64526 */ {(13<<2)|2,{88,49,0}}, +/* 64527 */ {(13<<2)|2,{88,49,0}}, +/* 64528 */ {(13<<2)|2,{88,50,0}}, +/* 64529 */ {(13<<2)|2,{88,50,0}}, +/* 64530 */ {(13<<2)|2,{88,50,0}}, +/* 64531 */ {(13<<2)|2,{88,50,0}}, +/* 64532 */ {(13<<2)|2,{88,50,0}}, +/* 64533 */ {(13<<2)|2,{88,50,0}}, +/* 64534 */ {(13<<2)|2,{88,50,0}}, +/* 64535 */ {(13<<2)|2,{88,50,0}}, +/* 64536 */ {(13<<2)|2,{88,97,0}}, +/* 64537 */ {(13<<2)|2,{88,97,0}}, +/* 64538 */ {(13<<2)|2,{88,97,0}}, +/* 64539 */ {(13<<2)|2,{88,97,0}}, +/* 64540 */ {(13<<2)|2,{88,97,0}}, +/* 64541 */ {(13<<2)|2,{88,97,0}}, +/* 64542 */ {(13<<2)|2,{88,97,0}}, +/* 64543 */ {(13<<2)|2,{88,97,0}}, +/* 64544 */ {(13<<2)|2,{88,99,0}}, +/* 64545 */ {(13<<2)|2,{88,99,0}}, +/* 64546 */ {(13<<2)|2,{88,99,0}}, +/* 64547 */ {(13<<2)|2,{88,99,0}}, +/* 64548 */ {(13<<2)|2,{88,99,0}}, +/* 64549 */ {(13<<2)|2,{88,99,0}}, +/* 64550 */ {(13<<2)|2,{88,99,0}}, +/* 64551 */ {(13<<2)|2,{88,99,0}}, +/* 64552 */ {(13<<2)|2,{88,101,0}}, +/* 64553 */ {(13<<2)|2,{88,101,0}}, +/* 64554 */ {(13<<2)|2,{88,101,0}}, +/* 64555 */ {(13<<2)|2,{88,101,0}}, +/* 64556 */ {(13<<2)|2,{88,101,0}}, +/* 64557 */ {(13<<2)|2,{88,101,0}}, +/* 64558 */ {(13<<2)|2,{88,101,0}}, +/* 64559 */ {(13<<2)|2,{88,101,0}}, +/* 64560 */ {(13<<2)|2,{88,105,0}}, +/* 64561 */ {(13<<2)|2,{88,105,0}}, +/* 64562 */ {(13<<2)|2,{88,105,0}}, +/* 64563 */ {(13<<2)|2,{88,105,0}}, +/* 64564 */ {(13<<2)|2,{88,105,0}}, +/* 64565 */ {(13<<2)|2,{88,105,0}}, +/* 64566 */ {(13<<2)|2,{88,105,0}}, +/* 64567 */ {(13<<2)|2,{88,105,0}}, +/* 64568 */ {(13<<2)|2,{88,111,0}}, +/* 64569 */ {(13<<2)|2,{88,111,0}}, +/* 64570 */ {(13<<2)|2,{88,111,0}}, +/* 64571 */ {(13<<2)|2,{88,111,0}}, +/* 64572 */ {(13<<2)|2,{88,111,0}}, +/* 64573 */ {(13<<2)|2,{88,111,0}}, +/* 64574 */ {(13<<2)|2,{88,111,0}}, +/* 64575 */ {(13<<2)|2,{88,111,0}}, +/* 64576 */ {(13<<2)|2,{88,115,0}}, +/* 64577 */ {(13<<2)|2,{88,115,0}}, +/* 64578 */ {(13<<2)|2,{88,115,0}}, +/* 64579 */ {(13<<2)|2,{88,115,0}}, +/* 64580 */ {(13<<2)|2,{88,115,0}}, +/* 64581 */ {(13<<2)|2,{88,115,0}}, +/* 64582 */ {(13<<2)|2,{88,115,0}}, +/* 64583 */ {(13<<2)|2,{88,115,0}}, +/* 64584 */ {(13<<2)|2,{88,116,0}}, +/* 64585 */ {(13<<2)|2,{88,116,0}}, +/* 64586 */ {(13<<2)|2,{88,116,0}}, +/* 64587 */ {(13<<2)|2,{88,116,0}}, +/* 64588 */ {(13<<2)|2,{88,116,0}}, +/* 64589 */ {(13<<2)|2,{88,116,0}}, +/* 64590 */ {(13<<2)|2,{88,116,0}}, +/* 64591 */ {(13<<2)|2,{88,116,0}}, +/* 64592 */ {(14<<2)|2,{88,32,0}}, +/* 64593 */ {(14<<2)|2,{88,32,0}}, +/* 64594 */ {(14<<2)|2,{88,32,0}}, +/* 64595 */ {(14<<2)|2,{88,32,0}}, +/* 64596 */ {(14<<2)|2,{88,37,0}}, +/* 64597 */ {(14<<2)|2,{88,37,0}}, +/* 64598 */ {(14<<2)|2,{88,37,0}}, +/* 64599 */ {(14<<2)|2,{88,37,0}}, +/* 64600 */ {(14<<2)|2,{88,45,0}}, +/* 64601 */ {(14<<2)|2,{88,45,0}}, +/* 64602 */ {(14<<2)|2,{88,45,0}}, +/* 64603 */ {(14<<2)|2,{88,45,0}}, +/* 64604 */ {(14<<2)|2,{88,46,0}}, +/* 64605 */ {(14<<2)|2,{88,46,0}}, +/* 64606 */ {(14<<2)|2,{88,46,0}}, +/* 64607 */ {(14<<2)|2,{88,46,0}}, +/* 64608 */ {(14<<2)|2,{88,47,0}}, +/* 64609 */ {(14<<2)|2,{88,47,0}}, +/* 64610 */ {(14<<2)|2,{88,47,0}}, +/* 64611 */ {(14<<2)|2,{88,47,0}}, +/* 64612 */ {(14<<2)|2,{88,51,0}}, +/* 64613 */ {(14<<2)|2,{88,51,0}}, +/* 64614 */ {(14<<2)|2,{88,51,0}}, +/* 64615 */ {(14<<2)|2,{88,51,0}}, +/* 64616 */ {(14<<2)|2,{88,52,0}}, +/* 64617 */ {(14<<2)|2,{88,52,0}}, +/* 64618 */ {(14<<2)|2,{88,52,0}}, +/* 64619 */ {(14<<2)|2,{88,52,0}}, +/* 64620 */ {(14<<2)|2,{88,53,0}}, +/* 64621 */ {(14<<2)|2,{88,53,0}}, +/* 64622 */ {(14<<2)|2,{88,53,0}}, +/* 64623 */ {(14<<2)|2,{88,53,0}}, +/* 64624 */ {(14<<2)|2,{88,54,0}}, +/* 64625 */ {(14<<2)|2,{88,54,0}}, +/* 64626 */ {(14<<2)|2,{88,54,0}}, +/* 64627 */ {(14<<2)|2,{88,54,0}}, +/* 64628 */ {(14<<2)|2,{88,55,0}}, +/* 64629 */ {(14<<2)|2,{88,55,0}}, +/* 64630 */ {(14<<2)|2,{88,55,0}}, +/* 64631 */ {(14<<2)|2,{88,55,0}}, +/* 64632 */ {(14<<2)|2,{88,56,0}}, +/* 64633 */ {(14<<2)|2,{88,56,0}}, +/* 64634 */ {(14<<2)|2,{88,56,0}}, +/* 64635 */ {(14<<2)|2,{88,56,0}}, +/* 64636 */ {(14<<2)|2,{88,57,0}}, +/* 64637 */ {(14<<2)|2,{88,57,0}}, +/* 64638 */ {(14<<2)|2,{88,57,0}}, +/* 64639 */ {(14<<2)|2,{88,57,0}}, +/* 64640 */ {(14<<2)|2,{88,61,0}}, +/* 64641 */ {(14<<2)|2,{88,61,0}}, +/* 64642 */ {(14<<2)|2,{88,61,0}}, +/* 64643 */ {(14<<2)|2,{88,61,0}}, +/* 64644 */ {(14<<2)|2,{88,65,0}}, +/* 64645 */ {(14<<2)|2,{88,65,0}}, +/* 64646 */ {(14<<2)|2,{88,65,0}}, +/* 64647 */ {(14<<2)|2,{88,65,0}}, +/* 64648 */ {(14<<2)|2,{88,95,0}}, +/* 64649 */ {(14<<2)|2,{88,95,0}}, +/* 64650 */ {(14<<2)|2,{88,95,0}}, +/* 64651 */ {(14<<2)|2,{88,95,0}}, +/* 64652 */ {(14<<2)|2,{88,98,0}}, +/* 64653 */ {(14<<2)|2,{88,98,0}}, +/* 64654 */ {(14<<2)|2,{88,98,0}}, +/* 64655 */ {(14<<2)|2,{88,98,0}}, +/* 64656 */ {(14<<2)|2,{88,100,0}}, +/* 64657 */ {(14<<2)|2,{88,100,0}}, +/* 64658 */ {(14<<2)|2,{88,100,0}}, +/* 64659 */ {(14<<2)|2,{88,100,0}}, +/* 64660 */ {(14<<2)|2,{88,102,0}}, +/* 64661 */ {(14<<2)|2,{88,102,0}}, +/* 64662 */ {(14<<2)|2,{88,102,0}}, +/* 64663 */ {(14<<2)|2,{88,102,0}}, +/* 64664 */ {(14<<2)|2,{88,103,0}}, +/* 64665 */ {(14<<2)|2,{88,103,0}}, +/* 64666 */ {(14<<2)|2,{88,103,0}}, +/* 64667 */ {(14<<2)|2,{88,103,0}}, +/* 64668 */ {(14<<2)|2,{88,104,0}}, +/* 64669 */ {(14<<2)|2,{88,104,0}}, +/* 64670 */ {(14<<2)|2,{88,104,0}}, +/* 64671 */ {(14<<2)|2,{88,104,0}}, +/* 64672 */ {(14<<2)|2,{88,108,0}}, +/* 64673 */ {(14<<2)|2,{88,108,0}}, +/* 64674 */ {(14<<2)|2,{88,108,0}}, +/* 64675 */ {(14<<2)|2,{88,108,0}}, +/* 64676 */ {(14<<2)|2,{88,109,0}}, +/* 64677 */ {(14<<2)|2,{88,109,0}}, +/* 64678 */ {(14<<2)|2,{88,109,0}}, +/* 64679 */ {(14<<2)|2,{88,109,0}}, +/* 64680 */ {(14<<2)|2,{88,110,0}}, +/* 64681 */ {(14<<2)|2,{88,110,0}}, +/* 64682 */ {(14<<2)|2,{88,110,0}}, +/* 64683 */ {(14<<2)|2,{88,110,0}}, +/* 64684 */ {(14<<2)|2,{88,112,0}}, +/* 64685 */ {(14<<2)|2,{88,112,0}}, +/* 64686 */ {(14<<2)|2,{88,112,0}}, +/* 64687 */ {(14<<2)|2,{88,112,0}}, +/* 64688 */ {(14<<2)|2,{88,114,0}}, +/* 64689 */ {(14<<2)|2,{88,114,0}}, +/* 64690 */ {(14<<2)|2,{88,114,0}}, +/* 64691 */ {(14<<2)|2,{88,114,0}}, +/* 64692 */ {(14<<2)|2,{88,117,0}}, +/* 64693 */ {(14<<2)|2,{88,117,0}}, +/* 64694 */ {(14<<2)|2,{88,117,0}}, +/* 64695 */ {(14<<2)|2,{88,117,0}}, +/* 64696 */ {(15<<2)|2,{88,58,0}}, +/* 64697 */ {(15<<2)|2,{88,58,0}}, +/* 64698 */ {(15<<2)|2,{88,66,0}}, +/* 64699 */ {(15<<2)|2,{88,66,0}}, +/* 64700 */ {(15<<2)|2,{88,67,0}}, +/* 64701 */ {(15<<2)|2,{88,67,0}}, +/* 64702 */ {(15<<2)|2,{88,68,0}}, +/* 64703 */ {(15<<2)|2,{88,68,0}}, +/* 64704 */ {(15<<2)|2,{88,69,0}}, +/* 64705 */ {(15<<2)|2,{88,69,0}}, +/* 64706 */ {(15<<2)|2,{88,70,0}}, +/* 64707 */ {(15<<2)|2,{88,70,0}}, +/* 64708 */ {(15<<2)|2,{88,71,0}}, +/* 64709 */ {(15<<2)|2,{88,71,0}}, +/* 64710 */ {(15<<2)|2,{88,72,0}}, +/* 64711 */ {(15<<2)|2,{88,72,0}}, +/* 64712 */ {(15<<2)|2,{88,73,0}}, +/* 64713 */ {(15<<2)|2,{88,73,0}}, +/* 64714 */ {(15<<2)|2,{88,74,0}}, +/* 64715 */ {(15<<2)|2,{88,74,0}}, +/* 64716 */ {(15<<2)|2,{88,75,0}}, +/* 64717 */ {(15<<2)|2,{88,75,0}}, +/* 64718 */ {(15<<2)|2,{88,76,0}}, +/* 64719 */ {(15<<2)|2,{88,76,0}}, +/* 64720 */ {(15<<2)|2,{88,77,0}}, +/* 64721 */ {(15<<2)|2,{88,77,0}}, +/* 64722 */ {(15<<2)|2,{88,78,0}}, +/* 64723 */ {(15<<2)|2,{88,78,0}}, +/* 64724 */ {(15<<2)|2,{88,79,0}}, +/* 64725 */ {(15<<2)|2,{88,79,0}}, +/* 64726 */ {(15<<2)|2,{88,80,0}}, +/* 64727 */ {(15<<2)|2,{88,80,0}}, +/* 64728 */ {(15<<2)|2,{88,81,0}}, +/* 64729 */ {(15<<2)|2,{88,81,0}}, +/* 64730 */ {(15<<2)|2,{88,82,0}}, +/* 64731 */ {(15<<2)|2,{88,82,0}}, +/* 64732 */ {(15<<2)|2,{88,83,0}}, +/* 64733 */ {(15<<2)|2,{88,83,0}}, +/* 64734 */ {(15<<2)|2,{88,84,0}}, +/* 64735 */ {(15<<2)|2,{88,84,0}}, +/* 64736 */ {(15<<2)|2,{88,85,0}}, +/* 64737 */ {(15<<2)|2,{88,85,0}}, +/* 64738 */ {(15<<2)|2,{88,86,0}}, +/* 64739 */ {(15<<2)|2,{88,86,0}}, +/* 64740 */ {(15<<2)|2,{88,87,0}}, +/* 64741 */ {(15<<2)|2,{88,87,0}}, +/* 64742 */ {(15<<2)|2,{88,89,0}}, +/* 64743 */ {(15<<2)|2,{88,89,0}}, +/* 64744 */ {(15<<2)|2,{88,106,0}}, +/* 64745 */ {(15<<2)|2,{88,106,0}}, +/* 64746 */ {(15<<2)|2,{88,107,0}}, +/* 64747 */ {(15<<2)|2,{88,107,0}}, +/* 64748 */ {(15<<2)|2,{88,113,0}}, +/* 64749 */ {(15<<2)|2,{88,113,0}}, +/* 64750 */ {(15<<2)|2,{88,118,0}}, +/* 64751 */ {(15<<2)|2,{88,118,0}}, +/* 64752 */ {(15<<2)|2,{88,119,0}}, +/* 64753 */ {(15<<2)|2,{88,119,0}}, +/* 64754 */ {(15<<2)|2,{88,120,0}}, +/* 64755 */ {(15<<2)|2,{88,120,0}}, +/* 64756 */ {(15<<2)|2,{88,121,0}}, +/* 64757 */ {(15<<2)|2,{88,121,0}}, +/* 64758 */ {(15<<2)|2,{88,122,0}}, +/* 64759 */ {(15<<2)|2,{88,122,0}}, +/* 64760 */ {(16<<2)|2,{88,38,0}}, +/* 64761 */ {(16<<2)|2,{88,42,0}}, +/* 64762 */ {(16<<2)|2,{88,44,0}}, +/* 64763 */ {(16<<2)|2,{88,59,0}}, +/* 64764 */ {(16<<2)|2,{88,88,0}}, +/* 64765 */ {(16<<2)|2,{88,90,0}}, +/* 64766 */ {(8<<2)|1,{88,0,0}}, +/* 64767 */ {(8<<2)|1,{88,0,0}}, +/* 64768 */ {(13<<2)|2,{90,48,0}}, +/* 64769 */ {(13<<2)|2,{90,48,0}}, +/* 64770 */ {(13<<2)|2,{90,48,0}}, +/* 64771 */ {(13<<2)|2,{90,48,0}}, +/* 64772 */ {(13<<2)|2,{90,48,0}}, +/* 64773 */ {(13<<2)|2,{90,48,0}}, +/* 64774 */ {(13<<2)|2,{90,48,0}}, +/* 64775 */ {(13<<2)|2,{90,48,0}}, +/* 64776 */ {(13<<2)|2,{90,49,0}}, +/* 64777 */ {(13<<2)|2,{90,49,0}}, +/* 64778 */ {(13<<2)|2,{90,49,0}}, +/* 64779 */ {(13<<2)|2,{90,49,0}}, +/* 64780 */ {(13<<2)|2,{90,49,0}}, +/* 64781 */ {(13<<2)|2,{90,49,0}}, +/* 64782 */ {(13<<2)|2,{90,49,0}}, +/* 64783 */ {(13<<2)|2,{90,49,0}}, +/* 64784 */ {(13<<2)|2,{90,50,0}}, +/* 64785 */ {(13<<2)|2,{90,50,0}}, +/* 64786 */ {(13<<2)|2,{90,50,0}}, +/* 64787 */ {(13<<2)|2,{90,50,0}}, +/* 64788 */ {(13<<2)|2,{90,50,0}}, +/* 64789 */ {(13<<2)|2,{90,50,0}}, +/* 64790 */ {(13<<2)|2,{90,50,0}}, +/* 64791 */ {(13<<2)|2,{90,50,0}}, +/* 64792 */ {(13<<2)|2,{90,97,0}}, +/* 64793 */ {(13<<2)|2,{90,97,0}}, +/* 64794 */ {(13<<2)|2,{90,97,0}}, +/* 64795 */ {(13<<2)|2,{90,97,0}}, +/* 64796 */ {(13<<2)|2,{90,97,0}}, +/* 64797 */ {(13<<2)|2,{90,97,0}}, +/* 64798 */ {(13<<2)|2,{90,97,0}}, +/* 64799 */ {(13<<2)|2,{90,97,0}}, +/* 64800 */ {(13<<2)|2,{90,99,0}}, +/* 64801 */ {(13<<2)|2,{90,99,0}}, +/* 64802 */ {(13<<2)|2,{90,99,0}}, +/* 64803 */ {(13<<2)|2,{90,99,0}}, +/* 64804 */ {(13<<2)|2,{90,99,0}}, +/* 64805 */ {(13<<2)|2,{90,99,0}}, +/* 64806 */ {(13<<2)|2,{90,99,0}}, +/* 64807 */ {(13<<2)|2,{90,99,0}}, +/* 64808 */ {(13<<2)|2,{90,101,0}}, +/* 64809 */ {(13<<2)|2,{90,101,0}}, +/* 64810 */ {(13<<2)|2,{90,101,0}}, +/* 64811 */ {(13<<2)|2,{90,101,0}}, +/* 64812 */ {(13<<2)|2,{90,101,0}}, +/* 64813 */ {(13<<2)|2,{90,101,0}}, +/* 64814 */ {(13<<2)|2,{90,101,0}}, +/* 64815 */ {(13<<2)|2,{90,101,0}}, +/* 64816 */ {(13<<2)|2,{90,105,0}}, +/* 64817 */ {(13<<2)|2,{90,105,0}}, +/* 64818 */ {(13<<2)|2,{90,105,0}}, +/* 64819 */ {(13<<2)|2,{90,105,0}}, +/* 64820 */ {(13<<2)|2,{90,105,0}}, +/* 64821 */ {(13<<2)|2,{90,105,0}}, +/* 64822 */ {(13<<2)|2,{90,105,0}}, +/* 64823 */ {(13<<2)|2,{90,105,0}}, +/* 64824 */ {(13<<2)|2,{90,111,0}}, +/* 64825 */ {(13<<2)|2,{90,111,0}}, +/* 64826 */ {(13<<2)|2,{90,111,0}}, +/* 64827 */ {(13<<2)|2,{90,111,0}}, +/* 64828 */ {(13<<2)|2,{90,111,0}}, +/* 64829 */ {(13<<2)|2,{90,111,0}}, +/* 64830 */ {(13<<2)|2,{90,111,0}}, +/* 64831 */ {(13<<2)|2,{90,111,0}}, +/* 64832 */ {(13<<2)|2,{90,115,0}}, +/* 64833 */ {(13<<2)|2,{90,115,0}}, +/* 64834 */ {(13<<2)|2,{90,115,0}}, +/* 64835 */ {(13<<2)|2,{90,115,0}}, +/* 64836 */ {(13<<2)|2,{90,115,0}}, +/* 64837 */ {(13<<2)|2,{90,115,0}}, +/* 64838 */ {(13<<2)|2,{90,115,0}}, +/* 64839 */ {(13<<2)|2,{90,115,0}}, +/* 64840 */ {(13<<2)|2,{90,116,0}}, +/* 64841 */ {(13<<2)|2,{90,116,0}}, +/* 64842 */ {(13<<2)|2,{90,116,0}}, +/* 64843 */ {(13<<2)|2,{90,116,0}}, +/* 64844 */ {(13<<2)|2,{90,116,0}}, +/* 64845 */ {(13<<2)|2,{90,116,0}}, +/* 64846 */ {(13<<2)|2,{90,116,0}}, +/* 64847 */ {(13<<2)|2,{90,116,0}}, +/* 64848 */ {(14<<2)|2,{90,32,0}}, +/* 64849 */ {(14<<2)|2,{90,32,0}}, +/* 64850 */ {(14<<2)|2,{90,32,0}}, +/* 64851 */ {(14<<2)|2,{90,32,0}}, +/* 64852 */ {(14<<2)|2,{90,37,0}}, +/* 64853 */ {(14<<2)|2,{90,37,0}}, +/* 64854 */ {(14<<2)|2,{90,37,0}}, +/* 64855 */ {(14<<2)|2,{90,37,0}}, +/* 64856 */ {(14<<2)|2,{90,45,0}}, +/* 64857 */ {(14<<2)|2,{90,45,0}}, +/* 64858 */ {(14<<2)|2,{90,45,0}}, +/* 64859 */ {(14<<2)|2,{90,45,0}}, +/* 64860 */ {(14<<2)|2,{90,46,0}}, +/* 64861 */ {(14<<2)|2,{90,46,0}}, +/* 64862 */ {(14<<2)|2,{90,46,0}}, +/* 64863 */ {(14<<2)|2,{90,46,0}}, +/* 64864 */ {(14<<2)|2,{90,47,0}}, +/* 64865 */ {(14<<2)|2,{90,47,0}}, +/* 64866 */ {(14<<2)|2,{90,47,0}}, +/* 64867 */ {(14<<2)|2,{90,47,0}}, +/* 64868 */ {(14<<2)|2,{90,51,0}}, +/* 64869 */ {(14<<2)|2,{90,51,0}}, +/* 64870 */ {(14<<2)|2,{90,51,0}}, +/* 64871 */ {(14<<2)|2,{90,51,0}}, +/* 64872 */ {(14<<2)|2,{90,52,0}}, +/* 64873 */ {(14<<2)|2,{90,52,0}}, +/* 64874 */ {(14<<2)|2,{90,52,0}}, +/* 64875 */ {(14<<2)|2,{90,52,0}}, +/* 64876 */ {(14<<2)|2,{90,53,0}}, +/* 64877 */ {(14<<2)|2,{90,53,0}}, +/* 64878 */ {(14<<2)|2,{90,53,0}}, +/* 64879 */ {(14<<2)|2,{90,53,0}}, +/* 64880 */ {(14<<2)|2,{90,54,0}}, +/* 64881 */ {(14<<2)|2,{90,54,0}}, +/* 64882 */ {(14<<2)|2,{90,54,0}}, +/* 64883 */ {(14<<2)|2,{90,54,0}}, +/* 64884 */ {(14<<2)|2,{90,55,0}}, +/* 64885 */ {(14<<2)|2,{90,55,0}}, +/* 64886 */ {(14<<2)|2,{90,55,0}}, +/* 64887 */ {(14<<2)|2,{90,55,0}}, +/* 64888 */ {(14<<2)|2,{90,56,0}}, +/* 64889 */ {(14<<2)|2,{90,56,0}}, +/* 64890 */ {(14<<2)|2,{90,56,0}}, +/* 64891 */ {(14<<2)|2,{90,56,0}}, +/* 64892 */ {(14<<2)|2,{90,57,0}}, +/* 64893 */ {(14<<2)|2,{90,57,0}}, +/* 64894 */ {(14<<2)|2,{90,57,0}}, +/* 64895 */ {(14<<2)|2,{90,57,0}}, +/* 64896 */ {(14<<2)|2,{90,61,0}}, +/* 64897 */ {(14<<2)|2,{90,61,0}}, +/* 64898 */ {(14<<2)|2,{90,61,0}}, +/* 64899 */ {(14<<2)|2,{90,61,0}}, +/* 64900 */ {(14<<2)|2,{90,65,0}}, +/* 64901 */ {(14<<2)|2,{90,65,0}}, +/* 64902 */ {(14<<2)|2,{90,65,0}}, +/* 64903 */ {(14<<2)|2,{90,65,0}}, +/* 64904 */ {(14<<2)|2,{90,95,0}}, +/* 64905 */ {(14<<2)|2,{90,95,0}}, +/* 64906 */ {(14<<2)|2,{90,95,0}}, +/* 64907 */ {(14<<2)|2,{90,95,0}}, +/* 64908 */ {(14<<2)|2,{90,98,0}}, +/* 64909 */ {(14<<2)|2,{90,98,0}}, +/* 64910 */ {(14<<2)|2,{90,98,0}}, +/* 64911 */ {(14<<2)|2,{90,98,0}}, +/* 64912 */ {(14<<2)|2,{90,100,0}}, +/* 64913 */ {(14<<2)|2,{90,100,0}}, +/* 64914 */ {(14<<2)|2,{90,100,0}}, +/* 64915 */ {(14<<2)|2,{90,100,0}}, +/* 64916 */ {(14<<2)|2,{90,102,0}}, +/* 64917 */ {(14<<2)|2,{90,102,0}}, +/* 64918 */ {(14<<2)|2,{90,102,0}}, +/* 64919 */ {(14<<2)|2,{90,102,0}}, +/* 64920 */ {(14<<2)|2,{90,103,0}}, +/* 64921 */ {(14<<2)|2,{90,103,0}}, +/* 64922 */ {(14<<2)|2,{90,103,0}}, +/* 64923 */ {(14<<2)|2,{90,103,0}}, +/* 64924 */ {(14<<2)|2,{90,104,0}}, +/* 64925 */ {(14<<2)|2,{90,104,0}}, +/* 64926 */ {(14<<2)|2,{90,104,0}}, +/* 64927 */ {(14<<2)|2,{90,104,0}}, +/* 64928 */ {(14<<2)|2,{90,108,0}}, +/* 64929 */ {(14<<2)|2,{90,108,0}}, +/* 64930 */ {(14<<2)|2,{90,108,0}}, +/* 64931 */ {(14<<2)|2,{90,108,0}}, +/* 64932 */ {(14<<2)|2,{90,109,0}}, +/* 64933 */ {(14<<2)|2,{90,109,0}}, +/* 64934 */ {(14<<2)|2,{90,109,0}}, +/* 64935 */ {(14<<2)|2,{90,109,0}}, +/* 64936 */ {(14<<2)|2,{90,110,0}}, +/* 64937 */ {(14<<2)|2,{90,110,0}}, +/* 64938 */ {(14<<2)|2,{90,110,0}}, +/* 64939 */ {(14<<2)|2,{90,110,0}}, +/* 64940 */ {(14<<2)|2,{90,112,0}}, +/* 64941 */ {(14<<2)|2,{90,112,0}}, +/* 64942 */ {(14<<2)|2,{90,112,0}}, +/* 64943 */ {(14<<2)|2,{90,112,0}}, +/* 64944 */ {(14<<2)|2,{90,114,0}}, +/* 64945 */ {(14<<2)|2,{90,114,0}}, +/* 64946 */ {(14<<2)|2,{90,114,0}}, +/* 64947 */ {(14<<2)|2,{90,114,0}}, +/* 64948 */ {(14<<2)|2,{90,117,0}}, +/* 64949 */ {(14<<2)|2,{90,117,0}}, +/* 64950 */ {(14<<2)|2,{90,117,0}}, +/* 64951 */ {(14<<2)|2,{90,117,0}}, +/* 64952 */ {(15<<2)|2,{90,58,0}}, +/* 64953 */ {(15<<2)|2,{90,58,0}}, +/* 64954 */ {(15<<2)|2,{90,66,0}}, +/* 64955 */ {(15<<2)|2,{90,66,0}}, +/* 64956 */ {(15<<2)|2,{90,67,0}}, +/* 64957 */ {(15<<2)|2,{90,67,0}}, +/* 64958 */ {(15<<2)|2,{90,68,0}}, +/* 64959 */ {(15<<2)|2,{90,68,0}}, +/* 64960 */ {(15<<2)|2,{90,69,0}}, +/* 64961 */ {(15<<2)|2,{90,69,0}}, +/* 64962 */ {(15<<2)|2,{90,70,0}}, +/* 64963 */ {(15<<2)|2,{90,70,0}}, +/* 64964 */ {(15<<2)|2,{90,71,0}}, +/* 64965 */ {(15<<2)|2,{90,71,0}}, +/* 64966 */ {(15<<2)|2,{90,72,0}}, +/* 64967 */ {(15<<2)|2,{90,72,0}}, +/* 64968 */ {(15<<2)|2,{90,73,0}}, +/* 64969 */ {(15<<2)|2,{90,73,0}}, +/* 64970 */ {(15<<2)|2,{90,74,0}}, +/* 64971 */ {(15<<2)|2,{90,74,0}}, +/* 64972 */ {(15<<2)|2,{90,75,0}}, +/* 64973 */ {(15<<2)|2,{90,75,0}}, +/* 64974 */ {(15<<2)|2,{90,76,0}}, +/* 64975 */ {(15<<2)|2,{90,76,0}}, +/* 64976 */ {(15<<2)|2,{90,77,0}}, +/* 64977 */ {(15<<2)|2,{90,77,0}}, +/* 64978 */ {(15<<2)|2,{90,78,0}}, +/* 64979 */ {(15<<2)|2,{90,78,0}}, +/* 64980 */ {(15<<2)|2,{90,79,0}}, +/* 64981 */ {(15<<2)|2,{90,79,0}}, +/* 64982 */ {(15<<2)|2,{90,80,0}}, +/* 64983 */ {(15<<2)|2,{90,80,0}}, +/* 64984 */ {(15<<2)|2,{90,81,0}}, +/* 64985 */ {(15<<2)|2,{90,81,0}}, +/* 64986 */ {(15<<2)|2,{90,82,0}}, +/* 64987 */ {(15<<2)|2,{90,82,0}}, +/* 64988 */ {(15<<2)|2,{90,83,0}}, +/* 64989 */ {(15<<2)|2,{90,83,0}}, +/* 64990 */ {(15<<2)|2,{90,84,0}}, +/* 64991 */ {(15<<2)|2,{90,84,0}}, +/* 64992 */ {(15<<2)|2,{90,85,0}}, +/* 64993 */ {(15<<2)|2,{90,85,0}}, +/* 64994 */ {(15<<2)|2,{90,86,0}}, +/* 64995 */ {(15<<2)|2,{90,86,0}}, +/* 64996 */ {(15<<2)|2,{90,87,0}}, +/* 64997 */ {(15<<2)|2,{90,87,0}}, +/* 64998 */ {(15<<2)|2,{90,89,0}}, +/* 64999 */ {(15<<2)|2,{90,89,0}}, +/* 65000 */ {(15<<2)|2,{90,106,0}}, +/* 65001 */ {(15<<2)|2,{90,106,0}}, +/* 65002 */ {(15<<2)|2,{90,107,0}}, +/* 65003 */ {(15<<2)|2,{90,107,0}}, +/* 65004 */ {(15<<2)|2,{90,113,0}}, +/* 65005 */ {(15<<2)|2,{90,113,0}}, +/* 65006 */ {(15<<2)|2,{90,118,0}}, +/* 65007 */ {(15<<2)|2,{90,118,0}}, +/* 65008 */ {(15<<2)|2,{90,119,0}}, +/* 65009 */ {(15<<2)|2,{90,119,0}}, +/* 65010 */ {(15<<2)|2,{90,120,0}}, +/* 65011 */ {(15<<2)|2,{90,120,0}}, +/* 65012 */ {(15<<2)|2,{90,121,0}}, +/* 65013 */ {(15<<2)|2,{90,121,0}}, +/* 65014 */ {(15<<2)|2,{90,122,0}}, +/* 65015 */ {(15<<2)|2,{90,122,0}}, +/* 65016 */ {(16<<2)|2,{90,38,0}}, +/* 65017 */ {(16<<2)|2,{90,42,0}}, +/* 65018 */ {(16<<2)|2,{90,44,0}}, +/* 65019 */ {(16<<2)|2,{90,59,0}}, +/* 65020 */ {(16<<2)|2,{90,88,0}}, +/* 65021 */ {(16<<2)|2,{90,90,0}}, +/* 65022 */ {(8<<2)|1,{90,0,0}}, +/* 65023 */ {(8<<2)|1,{90,0,0}}, +/* 65024 */ {(15<<2)|2,{33,48,0}}, +/* 65025 */ {(15<<2)|2,{33,48,0}}, +/* 65026 */ {(15<<2)|2,{33,49,0}}, +/* 65027 */ {(15<<2)|2,{33,49,0}}, +/* 65028 */ {(15<<2)|2,{33,50,0}}, +/* 65029 */ {(15<<2)|2,{33,50,0}}, +/* 65030 */ {(15<<2)|2,{33,97,0}}, +/* 65031 */ {(15<<2)|2,{33,97,0}}, +/* 65032 */ {(15<<2)|2,{33,99,0}}, +/* 65033 */ {(15<<2)|2,{33,99,0}}, +/* 65034 */ {(15<<2)|2,{33,101,0}}, +/* 65035 */ {(15<<2)|2,{33,101,0}}, +/* 65036 */ {(15<<2)|2,{33,105,0}}, +/* 65037 */ {(15<<2)|2,{33,105,0}}, +/* 65038 */ {(15<<2)|2,{33,111,0}}, +/* 65039 */ {(15<<2)|2,{33,111,0}}, +/* 65040 */ {(15<<2)|2,{33,115,0}}, +/* 65041 */ {(15<<2)|2,{33,115,0}}, +/* 65042 */ {(15<<2)|2,{33,116,0}}, +/* 65043 */ {(15<<2)|2,{33,116,0}}, +/* 65044 */ {(16<<2)|2,{33,32,0}}, +/* 65045 */ {(16<<2)|2,{33,37,0}}, +/* 65046 */ {(16<<2)|2,{33,45,0}}, +/* 65047 */ {(16<<2)|2,{33,46,0}}, +/* 65048 */ {(16<<2)|2,{33,47,0}}, +/* 65049 */ {(16<<2)|2,{33,51,0}}, +/* 65050 */ {(16<<2)|2,{33,52,0}}, +/* 65051 */ {(16<<2)|2,{33,53,0}}, +/* 65052 */ {(16<<2)|2,{33,54,0}}, +/* 65053 */ {(16<<2)|2,{33,55,0}}, +/* 65054 */ {(16<<2)|2,{33,56,0}}, +/* 65055 */ {(16<<2)|2,{33,57,0}}, +/* 65056 */ {(16<<2)|2,{33,61,0}}, +/* 65057 */ {(16<<2)|2,{33,65,0}}, +/* 65058 */ {(16<<2)|2,{33,95,0}}, +/* 65059 */ {(16<<2)|2,{33,98,0}}, +/* 65060 */ {(16<<2)|2,{33,100,0}}, +/* 65061 */ {(16<<2)|2,{33,102,0}}, +/* 65062 */ {(16<<2)|2,{33,103,0}}, +/* 65063 */ {(16<<2)|2,{33,104,0}}, +/* 65064 */ {(16<<2)|2,{33,108,0}}, +/* 65065 */ {(16<<2)|2,{33,109,0}}, +/* 65066 */ {(16<<2)|2,{33,110,0}}, +/* 65067 */ {(16<<2)|2,{33,112,0}}, +/* 65068 */ {(16<<2)|2,{33,114,0}}, +/* 65069 */ {(16<<2)|2,{33,117,0}}, +/* 65070 */ {(10<<2)|1,{33,0,0}}, +/* 65071 */ {(10<<2)|1,{33,0,0}}, +/* 65072 */ {(10<<2)|1,{33,0,0}}, +/* 65073 */ {(10<<2)|1,{33,0,0}}, +/* 65074 */ {(10<<2)|1,{33,0,0}}, +/* 65075 */ {(10<<2)|1,{33,0,0}}, +/* 65076 */ {(10<<2)|1,{33,0,0}}, +/* 65077 */ {(10<<2)|1,{33,0,0}}, +/* 65078 */ {(10<<2)|1,{33,0,0}}, +/* 65079 */ {(10<<2)|1,{33,0,0}}, +/* 65080 */ {(10<<2)|1,{33,0,0}}, +/* 65081 */ {(10<<2)|1,{33,0,0}}, +/* 65082 */ {(10<<2)|1,{33,0,0}}, +/* 65083 */ {(10<<2)|1,{33,0,0}}, +/* 65084 */ {(10<<2)|1,{33,0,0}}, +/* 65085 */ {(10<<2)|1,{33,0,0}}, +/* 65086 */ {(10<<2)|1,{33,0,0}}, +/* 65087 */ {(10<<2)|1,{33,0,0}}, +/* 65088 */ {(15<<2)|2,{34,48,0}}, +/* 65089 */ {(15<<2)|2,{34,48,0}}, +/* 65090 */ {(15<<2)|2,{34,49,0}}, +/* 65091 */ {(15<<2)|2,{34,49,0}}, +/* 65092 */ {(15<<2)|2,{34,50,0}}, +/* 65093 */ {(15<<2)|2,{34,50,0}}, +/* 65094 */ {(15<<2)|2,{34,97,0}}, +/* 65095 */ {(15<<2)|2,{34,97,0}}, +/* 65096 */ {(15<<2)|2,{34,99,0}}, +/* 65097 */ {(15<<2)|2,{34,99,0}}, +/* 65098 */ {(15<<2)|2,{34,101,0}}, +/* 65099 */ {(15<<2)|2,{34,101,0}}, +/* 65100 */ {(15<<2)|2,{34,105,0}}, +/* 65101 */ {(15<<2)|2,{34,105,0}}, +/* 65102 */ {(15<<2)|2,{34,111,0}}, +/* 65103 */ {(15<<2)|2,{34,111,0}}, +/* 65104 */ {(15<<2)|2,{34,115,0}}, +/* 65105 */ {(15<<2)|2,{34,115,0}}, +/* 65106 */ {(15<<2)|2,{34,116,0}}, +/* 65107 */ {(15<<2)|2,{34,116,0}}, +/* 65108 */ {(16<<2)|2,{34,32,0}}, +/* 65109 */ {(16<<2)|2,{34,37,0}}, +/* 65110 */ {(16<<2)|2,{34,45,0}}, +/* 65111 */ {(16<<2)|2,{34,46,0}}, +/* 65112 */ {(16<<2)|2,{34,47,0}}, +/* 65113 */ {(16<<2)|2,{34,51,0}}, +/* 65114 */ {(16<<2)|2,{34,52,0}}, +/* 65115 */ {(16<<2)|2,{34,53,0}}, +/* 65116 */ {(16<<2)|2,{34,54,0}}, +/* 65117 */ {(16<<2)|2,{34,55,0}}, +/* 65118 */ {(16<<2)|2,{34,56,0}}, +/* 65119 */ {(16<<2)|2,{34,57,0}}, +/* 65120 */ {(16<<2)|2,{34,61,0}}, +/* 65121 */ {(16<<2)|2,{34,65,0}}, +/* 65122 */ {(16<<2)|2,{34,95,0}}, +/* 65123 */ {(16<<2)|2,{34,98,0}}, +/* 65124 */ {(16<<2)|2,{34,100,0}}, +/* 65125 */ {(16<<2)|2,{34,102,0}}, +/* 65126 */ {(16<<2)|2,{34,103,0}}, +/* 65127 */ {(16<<2)|2,{34,104,0}}, +/* 65128 */ {(16<<2)|2,{34,108,0}}, +/* 65129 */ {(16<<2)|2,{34,109,0}}, +/* 65130 */ {(16<<2)|2,{34,110,0}}, +/* 65131 */ {(16<<2)|2,{34,112,0}}, +/* 65132 */ {(16<<2)|2,{34,114,0}}, +/* 65133 */ {(16<<2)|2,{34,117,0}}, +/* 65134 */ {(10<<2)|1,{34,0,0}}, +/* 65135 */ {(10<<2)|1,{34,0,0}}, +/* 65136 */ {(10<<2)|1,{34,0,0}}, +/* 65137 */ {(10<<2)|1,{34,0,0}}, +/* 65138 */ {(10<<2)|1,{34,0,0}}, +/* 65139 */ {(10<<2)|1,{34,0,0}}, +/* 65140 */ {(10<<2)|1,{34,0,0}}, +/* 65141 */ {(10<<2)|1,{34,0,0}}, +/* 65142 */ {(10<<2)|1,{34,0,0}}, +/* 65143 */ {(10<<2)|1,{34,0,0}}, +/* 65144 */ {(10<<2)|1,{34,0,0}}, +/* 65145 */ {(10<<2)|1,{34,0,0}}, +/* 65146 */ {(10<<2)|1,{34,0,0}}, +/* 65147 */ {(10<<2)|1,{34,0,0}}, +/* 65148 */ {(10<<2)|1,{34,0,0}}, +/* 65149 */ {(10<<2)|1,{34,0,0}}, +/* 65150 */ {(10<<2)|1,{34,0,0}}, +/* 65151 */ {(10<<2)|1,{34,0,0}}, +/* 65152 */ {(15<<2)|2,{40,48,0}}, +/* 65153 */ {(15<<2)|2,{40,48,0}}, +/* 65154 */ {(15<<2)|2,{40,49,0}}, +/* 65155 */ {(15<<2)|2,{40,49,0}}, +/* 65156 */ {(15<<2)|2,{40,50,0}}, +/* 65157 */ {(15<<2)|2,{40,50,0}}, +/* 65158 */ {(15<<2)|2,{40,97,0}}, +/* 65159 */ {(15<<2)|2,{40,97,0}}, +/* 65160 */ {(15<<2)|2,{40,99,0}}, +/* 65161 */ {(15<<2)|2,{40,99,0}}, +/* 65162 */ {(15<<2)|2,{40,101,0}}, +/* 65163 */ {(15<<2)|2,{40,101,0}}, +/* 65164 */ {(15<<2)|2,{40,105,0}}, +/* 65165 */ {(15<<2)|2,{40,105,0}}, +/* 65166 */ {(15<<2)|2,{40,111,0}}, +/* 65167 */ {(15<<2)|2,{40,111,0}}, +/* 65168 */ {(15<<2)|2,{40,115,0}}, +/* 65169 */ {(15<<2)|2,{40,115,0}}, +/* 65170 */ {(15<<2)|2,{40,116,0}}, +/* 65171 */ {(15<<2)|2,{40,116,0}}, +/* 65172 */ {(16<<2)|2,{40,32,0}}, +/* 65173 */ {(16<<2)|2,{40,37,0}}, +/* 65174 */ {(16<<2)|2,{40,45,0}}, +/* 65175 */ {(16<<2)|2,{40,46,0}}, +/* 65176 */ {(16<<2)|2,{40,47,0}}, +/* 65177 */ {(16<<2)|2,{40,51,0}}, +/* 65178 */ {(16<<2)|2,{40,52,0}}, +/* 65179 */ {(16<<2)|2,{40,53,0}}, +/* 65180 */ {(16<<2)|2,{40,54,0}}, +/* 65181 */ {(16<<2)|2,{40,55,0}}, +/* 65182 */ {(16<<2)|2,{40,56,0}}, +/* 65183 */ {(16<<2)|2,{40,57,0}}, +/* 65184 */ {(16<<2)|2,{40,61,0}}, +/* 65185 */ {(16<<2)|2,{40,65,0}}, +/* 65186 */ {(16<<2)|2,{40,95,0}}, +/* 65187 */ {(16<<2)|2,{40,98,0}}, +/* 65188 */ {(16<<2)|2,{40,100,0}}, +/* 65189 */ {(16<<2)|2,{40,102,0}}, +/* 65190 */ {(16<<2)|2,{40,103,0}}, +/* 65191 */ {(16<<2)|2,{40,104,0}}, +/* 65192 */ {(16<<2)|2,{40,108,0}}, +/* 65193 */ {(16<<2)|2,{40,109,0}}, +/* 65194 */ {(16<<2)|2,{40,110,0}}, +/* 65195 */ {(16<<2)|2,{40,112,0}}, +/* 65196 */ {(16<<2)|2,{40,114,0}}, +/* 65197 */ {(16<<2)|2,{40,117,0}}, +/* 65198 */ {(10<<2)|1,{40,0,0}}, +/* 65199 */ {(10<<2)|1,{40,0,0}}, +/* 65200 */ {(10<<2)|1,{40,0,0}}, +/* 65201 */ {(10<<2)|1,{40,0,0}}, +/* 65202 */ {(10<<2)|1,{40,0,0}}, +/* 65203 */ {(10<<2)|1,{40,0,0}}, +/* 65204 */ {(10<<2)|1,{40,0,0}}, +/* 65205 */ {(10<<2)|1,{40,0,0}}, +/* 65206 */ {(10<<2)|1,{40,0,0}}, +/* 65207 */ {(10<<2)|1,{40,0,0}}, +/* 65208 */ {(10<<2)|1,{40,0,0}}, +/* 65209 */ {(10<<2)|1,{40,0,0}}, +/* 65210 */ {(10<<2)|1,{40,0,0}}, +/* 65211 */ {(10<<2)|1,{40,0,0}}, +/* 65212 */ {(10<<2)|1,{40,0,0}}, +/* 65213 */ {(10<<2)|1,{40,0,0}}, +/* 65214 */ {(10<<2)|1,{40,0,0}}, +/* 65215 */ {(10<<2)|1,{40,0,0}}, +/* 65216 */ {(15<<2)|2,{41,48,0}}, +/* 65217 */ {(15<<2)|2,{41,48,0}}, +/* 65218 */ {(15<<2)|2,{41,49,0}}, +/* 65219 */ {(15<<2)|2,{41,49,0}}, +/* 65220 */ {(15<<2)|2,{41,50,0}}, +/* 65221 */ {(15<<2)|2,{41,50,0}}, +/* 65222 */ {(15<<2)|2,{41,97,0}}, +/* 65223 */ {(15<<2)|2,{41,97,0}}, +/* 65224 */ {(15<<2)|2,{41,99,0}}, +/* 65225 */ {(15<<2)|2,{41,99,0}}, +/* 65226 */ {(15<<2)|2,{41,101,0}}, +/* 65227 */ {(15<<2)|2,{41,101,0}}, +/* 65228 */ {(15<<2)|2,{41,105,0}}, +/* 65229 */ {(15<<2)|2,{41,105,0}}, +/* 65230 */ {(15<<2)|2,{41,111,0}}, +/* 65231 */ {(15<<2)|2,{41,111,0}}, +/* 65232 */ {(15<<2)|2,{41,115,0}}, +/* 65233 */ {(15<<2)|2,{41,115,0}}, +/* 65234 */ {(15<<2)|2,{41,116,0}}, +/* 65235 */ {(15<<2)|2,{41,116,0}}, +/* 65236 */ {(16<<2)|2,{41,32,0}}, +/* 65237 */ {(16<<2)|2,{41,37,0}}, +/* 65238 */ {(16<<2)|2,{41,45,0}}, +/* 65239 */ {(16<<2)|2,{41,46,0}}, +/* 65240 */ {(16<<2)|2,{41,47,0}}, +/* 65241 */ {(16<<2)|2,{41,51,0}}, +/* 65242 */ {(16<<2)|2,{41,52,0}}, +/* 65243 */ {(16<<2)|2,{41,53,0}}, +/* 65244 */ {(16<<2)|2,{41,54,0}}, +/* 65245 */ {(16<<2)|2,{41,55,0}}, +/* 65246 */ {(16<<2)|2,{41,56,0}}, +/* 65247 */ {(16<<2)|2,{41,57,0}}, +/* 65248 */ {(16<<2)|2,{41,61,0}}, +/* 65249 */ {(16<<2)|2,{41,65,0}}, +/* 65250 */ {(16<<2)|2,{41,95,0}}, +/* 65251 */ {(16<<2)|2,{41,98,0}}, +/* 65252 */ {(16<<2)|2,{41,100,0}}, +/* 65253 */ {(16<<2)|2,{41,102,0}}, +/* 65254 */ {(16<<2)|2,{41,103,0}}, +/* 65255 */ {(16<<2)|2,{41,104,0}}, +/* 65256 */ {(16<<2)|2,{41,108,0}}, +/* 65257 */ {(16<<2)|2,{41,109,0}}, +/* 65258 */ {(16<<2)|2,{41,110,0}}, +/* 65259 */ {(16<<2)|2,{41,112,0}}, +/* 65260 */ {(16<<2)|2,{41,114,0}}, +/* 65261 */ {(16<<2)|2,{41,117,0}}, +/* 65262 */ {(10<<2)|1,{41,0,0}}, +/* 65263 */ {(10<<2)|1,{41,0,0}}, +/* 65264 */ {(10<<2)|1,{41,0,0}}, +/* 65265 */ {(10<<2)|1,{41,0,0}}, +/* 65266 */ {(10<<2)|1,{41,0,0}}, +/* 65267 */ {(10<<2)|1,{41,0,0}}, +/* 65268 */ {(10<<2)|1,{41,0,0}}, +/* 65269 */ {(10<<2)|1,{41,0,0}}, +/* 65270 */ {(10<<2)|1,{41,0,0}}, +/* 65271 */ {(10<<2)|1,{41,0,0}}, +/* 65272 */ {(10<<2)|1,{41,0,0}}, +/* 65273 */ {(10<<2)|1,{41,0,0}}, +/* 65274 */ {(10<<2)|1,{41,0,0}}, +/* 65275 */ {(10<<2)|1,{41,0,0}}, +/* 65276 */ {(10<<2)|1,{41,0,0}}, +/* 65277 */ {(10<<2)|1,{41,0,0}}, +/* 65278 */ {(10<<2)|1,{41,0,0}}, +/* 65279 */ {(10<<2)|1,{41,0,0}}, +/* 65280 */ {(15<<2)|2,{63,48,0}}, +/* 65281 */ {(15<<2)|2,{63,48,0}}, +/* 65282 */ {(15<<2)|2,{63,49,0}}, +/* 65283 */ {(15<<2)|2,{63,49,0}}, +/* 65284 */ {(15<<2)|2,{63,50,0}}, +/* 65285 */ {(15<<2)|2,{63,50,0}}, +/* 65286 */ {(15<<2)|2,{63,97,0}}, +/* 65287 */ {(15<<2)|2,{63,97,0}}, +/* 65288 */ {(15<<2)|2,{63,99,0}}, +/* 65289 */ {(15<<2)|2,{63,99,0}}, +/* 65290 */ {(15<<2)|2,{63,101,0}}, +/* 65291 */ {(15<<2)|2,{63,101,0}}, +/* 65292 */ {(15<<2)|2,{63,105,0}}, +/* 65293 */ {(15<<2)|2,{63,105,0}}, +/* 65294 */ {(15<<2)|2,{63,111,0}}, +/* 65295 */ {(15<<2)|2,{63,111,0}}, +/* 65296 */ {(15<<2)|2,{63,115,0}}, +/* 65297 */ {(15<<2)|2,{63,115,0}}, +/* 65298 */ {(15<<2)|2,{63,116,0}}, +/* 65299 */ {(15<<2)|2,{63,116,0}}, +/* 65300 */ {(16<<2)|2,{63,32,0}}, +/* 65301 */ {(16<<2)|2,{63,37,0}}, +/* 65302 */ {(16<<2)|2,{63,45,0}}, +/* 65303 */ {(16<<2)|2,{63,46,0}}, +/* 65304 */ {(16<<2)|2,{63,47,0}}, +/* 65305 */ {(16<<2)|2,{63,51,0}}, +/* 65306 */ {(16<<2)|2,{63,52,0}}, +/* 65307 */ {(16<<2)|2,{63,53,0}}, +/* 65308 */ {(16<<2)|2,{63,54,0}}, +/* 65309 */ {(16<<2)|2,{63,55,0}}, +/* 65310 */ {(16<<2)|2,{63,56,0}}, +/* 65311 */ {(16<<2)|2,{63,57,0}}, +/* 65312 */ {(16<<2)|2,{63,61,0}}, +/* 65313 */ {(16<<2)|2,{63,65,0}}, +/* 65314 */ {(16<<2)|2,{63,95,0}}, +/* 65315 */ {(16<<2)|2,{63,98,0}}, +/* 65316 */ {(16<<2)|2,{63,100,0}}, +/* 65317 */ {(16<<2)|2,{63,102,0}}, +/* 65318 */ {(16<<2)|2,{63,103,0}}, +/* 65319 */ {(16<<2)|2,{63,104,0}}, +/* 65320 */ {(16<<2)|2,{63,108,0}}, +/* 65321 */ {(16<<2)|2,{63,109,0}}, +/* 65322 */ {(16<<2)|2,{63,110,0}}, +/* 65323 */ {(16<<2)|2,{63,112,0}}, +/* 65324 */ {(16<<2)|2,{63,114,0}}, +/* 65325 */ {(16<<2)|2,{63,117,0}}, +/* 65326 */ {(10<<2)|1,{63,0,0}}, +/* 65327 */ {(10<<2)|1,{63,0,0}}, +/* 65328 */ {(10<<2)|1,{63,0,0}}, +/* 65329 */ {(10<<2)|1,{63,0,0}}, +/* 65330 */ {(10<<2)|1,{63,0,0}}, +/* 65331 */ {(10<<2)|1,{63,0,0}}, +/* 65332 */ {(10<<2)|1,{63,0,0}}, +/* 65333 */ {(10<<2)|1,{63,0,0}}, +/* 65334 */ {(10<<2)|1,{63,0,0}}, +/* 65335 */ {(10<<2)|1,{63,0,0}}, +/* 65336 */ {(10<<2)|1,{63,0,0}}, +/* 65337 */ {(10<<2)|1,{63,0,0}}, +/* 65338 */ {(10<<2)|1,{63,0,0}}, +/* 65339 */ {(10<<2)|1,{63,0,0}}, +/* 65340 */ {(10<<2)|1,{63,0,0}}, +/* 65341 */ {(10<<2)|1,{63,0,0}}, +/* 65342 */ {(10<<2)|1,{63,0,0}}, +/* 65343 */ {(10<<2)|1,{63,0,0}}, +/* 65344 */ {(16<<2)|2,{39,48,0}}, +/* 65345 */ {(16<<2)|2,{39,49,0}}, +/* 65346 */ {(16<<2)|2,{39,50,0}}, +/* 65347 */ {(16<<2)|2,{39,97,0}}, +/* 65348 */ {(16<<2)|2,{39,99,0}}, +/* 65349 */ {(16<<2)|2,{39,101,0}}, +/* 65350 */ {(16<<2)|2,{39,105,0}}, +/* 65351 */ {(16<<2)|2,{39,111,0}}, +/* 65352 */ {(16<<2)|2,{39,115,0}}, +/* 65353 */ {(16<<2)|2,{39,116,0}}, +/* 65354 */ {(11<<2)|1,{39,0,0}}, +/* 65355 */ {(11<<2)|1,{39,0,0}}, +/* 65356 */ {(11<<2)|1,{39,0,0}}, +/* 65357 */ {(11<<2)|1,{39,0,0}}, +/* 65358 */ {(11<<2)|1,{39,0,0}}, +/* 65359 */ {(11<<2)|1,{39,0,0}}, +/* 65360 */ {(11<<2)|1,{39,0,0}}, +/* 65361 */ {(11<<2)|1,{39,0,0}}, +/* 65362 */ {(11<<2)|1,{39,0,0}}, +/* 65363 */ {(11<<2)|1,{39,0,0}}, +/* 65364 */ {(11<<2)|1,{39,0,0}}, +/* 65365 */ {(11<<2)|1,{39,0,0}}, +/* 65366 */ {(11<<2)|1,{39,0,0}}, +/* 65367 */ {(11<<2)|1,{39,0,0}}, +/* 65368 */ {(11<<2)|1,{39,0,0}}, +/* 65369 */ {(11<<2)|1,{39,0,0}}, +/* 65370 */ {(11<<2)|1,{39,0,0}}, +/* 65371 */ {(11<<2)|1,{39,0,0}}, +/* 65372 */ {(11<<2)|1,{39,0,0}}, +/* 65373 */ {(11<<2)|1,{39,0,0}}, +/* 65374 */ {(11<<2)|1,{39,0,0}}, +/* 65375 */ {(11<<2)|1,{39,0,0}}, +/* 65376 */ {(16<<2)|2,{43,48,0}}, +/* 65377 */ {(16<<2)|2,{43,49,0}}, +/* 65378 */ {(16<<2)|2,{43,50,0}}, +/* 65379 */ {(16<<2)|2,{43,97,0}}, +/* 65380 */ {(16<<2)|2,{43,99,0}}, +/* 65381 */ {(16<<2)|2,{43,101,0}}, +/* 65382 */ {(16<<2)|2,{43,105,0}}, +/* 65383 */ {(16<<2)|2,{43,111,0}}, +/* 65384 */ {(16<<2)|2,{43,115,0}}, +/* 65385 */ {(16<<2)|2,{43,116,0}}, +/* 65386 */ {(11<<2)|1,{43,0,0}}, +/* 65387 */ {(11<<2)|1,{43,0,0}}, +/* 65388 */ {(11<<2)|1,{43,0,0}}, +/* 65389 */ {(11<<2)|1,{43,0,0}}, +/* 65390 */ {(11<<2)|1,{43,0,0}}, +/* 65391 */ {(11<<2)|1,{43,0,0}}, +/* 65392 */ {(11<<2)|1,{43,0,0}}, +/* 65393 */ {(11<<2)|1,{43,0,0}}, +/* 65394 */ {(11<<2)|1,{43,0,0}}, +/* 65395 */ {(11<<2)|1,{43,0,0}}, +/* 65396 */ {(11<<2)|1,{43,0,0}}, +/* 65397 */ {(11<<2)|1,{43,0,0}}, +/* 65398 */ {(11<<2)|1,{43,0,0}}, +/* 65399 */ {(11<<2)|1,{43,0,0}}, +/* 65400 */ {(11<<2)|1,{43,0,0}}, +/* 65401 */ {(11<<2)|1,{43,0,0}}, +/* 65402 */ {(11<<2)|1,{43,0,0}}, +/* 65403 */ {(11<<2)|1,{43,0,0}}, +/* 65404 */ {(11<<2)|1,{43,0,0}}, +/* 65405 */ {(11<<2)|1,{43,0,0}}, +/* 65406 */ {(11<<2)|1,{43,0,0}}, +/* 65407 */ {(11<<2)|1,{43,0,0}}, +/* 65408 */ {(16<<2)|2,{124,48,0}}, +/* 65409 */ {(16<<2)|2,{124,49,0}}, +/* 65410 */ {(16<<2)|2,{124,50,0}}, +/* 65411 */ {(16<<2)|2,{124,97,0}}, +/* 65412 */ {(16<<2)|2,{124,99,0}}, +/* 65413 */ {(16<<2)|2,{124,101,0}}, +/* 65414 */ {(16<<2)|2,{124,105,0}}, +/* 65415 */ {(16<<2)|2,{124,111,0}}, +/* 65416 */ {(16<<2)|2,{124,115,0}}, +/* 65417 */ {(16<<2)|2,{124,116,0}}, +/* 65418 */ {(11<<2)|1,{124,0,0}}, +/* 65419 */ {(11<<2)|1,{124,0,0}}, +/* 65420 */ {(11<<2)|1,{124,0,0}}, +/* 65421 */ {(11<<2)|1,{124,0,0}}, +/* 65422 */ {(11<<2)|1,{124,0,0}}, +/* 65423 */ {(11<<2)|1,{124,0,0}}, +/* 65424 */ {(11<<2)|1,{124,0,0}}, +/* 65425 */ {(11<<2)|1,{124,0,0}}, +/* 65426 */ {(11<<2)|1,{124,0,0}}, +/* 65427 */ {(11<<2)|1,{124,0,0}}, +/* 65428 */ {(11<<2)|1,{124,0,0}}, +/* 65429 */ {(11<<2)|1,{124,0,0}}, +/* 65430 */ {(11<<2)|1,{124,0,0}}, +/* 65431 */ {(11<<2)|1,{124,0,0}}, +/* 65432 */ {(11<<2)|1,{124,0,0}}, +/* 65433 */ {(11<<2)|1,{124,0,0}}, +/* 65434 */ {(11<<2)|1,{124,0,0}}, +/* 65435 */ {(11<<2)|1,{124,0,0}}, +/* 65436 */ {(11<<2)|1,{124,0,0}}, +/* 65437 */ {(11<<2)|1,{124,0,0}}, +/* 65438 */ {(11<<2)|1,{124,0,0}}, +/* 65439 */ {(11<<2)|1,{124,0,0}}, +/* 65440 */ {(12<<2)|1,{35,0,0}}, +/* 65441 */ {(12<<2)|1,{35,0,0}}, +/* 65442 */ {(12<<2)|1,{35,0,0}}, +/* 65443 */ {(12<<2)|1,{35,0,0}}, +/* 65444 */ {(12<<2)|1,{35,0,0}}, +/* 65445 */ {(12<<2)|1,{35,0,0}}, +/* 65446 */ {(12<<2)|1,{35,0,0}}, +/* 65447 */ {(12<<2)|1,{35,0,0}}, +/* 65448 */ {(12<<2)|1,{35,0,0}}, +/* 65449 */ {(12<<2)|1,{35,0,0}}, +/* 65450 */ {(12<<2)|1,{35,0,0}}, +/* 65451 */ {(12<<2)|1,{35,0,0}}, +/* 65452 */ {(12<<2)|1,{35,0,0}}, +/* 65453 */ {(12<<2)|1,{35,0,0}}, +/* 65454 */ {(12<<2)|1,{35,0,0}}, +/* 65455 */ {(12<<2)|1,{35,0,0}}, +/* 65456 */ {(12<<2)|1,{62,0,0}}, +/* 65457 */ {(12<<2)|1,{62,0,0}}, +/* 65458 */ {(12<<2)|1,{62,0,0}}, +/* 65459 */ {(12<<2)|1,{62,0,0}}, +/* 65460 */ {(12<<2)|1,{62,0,0}}, +/* 65461 */ {(12<<2)|1,{62,0,0}}, +/* 65462 */ {(12<<2)|1,{62,0,0}}, +/* 65463 */ {(12<<2)|1,{62,0,0}}, +/* 65464 */ {(12<<2)|1,{62,0,0}}, +/* 65465 */ {(12<<2)|1,{62,0,0}}, +/* 65466 */ {(12<<2)|1,{62,0,0}}, +/* 65467 */ {(12<<2)|1,{62,0,0}}, +/* 65468 */ {(12<<2)|1,{62,0,0}}, +/* 65469 */ {(12<<2)|1,{62,0,0}}, +/* 65470 */ {(12<<2)|1,{62,0,0}}, +/* 65471 */ {(12<<2)|1,{62,0,0}}, +/* 65472 */ {(13<<2)|1,{0,0,0}}, +/* 65473 */ {(13<<2)|1,{0,0,0}}, +/* 65474 */ {(13<<2)|1,{0,0,0}}, +/* 65475 */ {(13<<2)|1,{0,0,0}}, +/* 65476 */ {(13<<2)|1,{0,0,0}}, +/* 65477 */ {(13<<2)|1,{0,0,0}}, +/* 65478 */ {(13<<2)|1,{0,0,0}}, +/* 65479 */ {(13<<2)|1,{0,0,0}}, +/* 65480 */ {(13<<2)|1,{36,0,0}}, +/* 65481 */ {(13<<2)|1,{36,0,0}}, +/* 65482 */ {(13<<2)|1,{36,0,0}}, +/* 65483 */ {(13<<2)|1,{36,0,0}}, +/* 65484 */ {(13<<2)|1,{36,0,0}}, +/* 65485 */ {(13<<2)|1,{36,0,0}}, +/* 65486 */ {(13<<2)|1,{36,0,0}}, +/* 65487 */ {(13<<2)|1,{36,0,0}}, +/* 65488 */ {(13<<2)|1,{64,0,0}}, +/* 65489 */ {(13<<2)|1,{64,0,0}}, +/* 65490 */ {(13<<2)|1,{64,0,0}}, +/* 65491 */ {(13<<2)|1,{64,0,0}}, +/* 65492 */ {(13<<2)|1,{64,0,0}}, +/* 65493 */ {(13<<2)|1,{64,0,0}}, +/* 65494 */ {(13<<2)|1,{64,0,0}}, +/* 65495 */ {(13<<2)|1,{64,0,0}}, +/* 65496 */ {(13<<2)|1,{91,0,0}}, +/* 65497 */ {(13<<2)|1,{91,0,0}}, +/* 65498 */ {(13<<2)|1,{91,0,0}}, +/* 65499 */ {(13<<2)|1,{91,0,0}}, +/* 65500 */ {(13<<2)|1,{91,0,0}}, +/* 65501 */ {(13<<2)|1,{91,0,0}}, +/* 65502 */ {(13<<2)|1,{91,0,0}}, +/* 65503 */ {(13<<2)|1,{91,0,0}}, +/* 65504 */ {(13<<2)|1,{93,0,0}}, +/* 65505 */ {(13<<2)|1,{93,0,0}}, +/* 65506 */ {(13<<2)|1,{93,0,0}}, +/* 65507 */ {(13<<2)|1,{93,0,0}}, +/* 65508 */ {(13<<2)|1,{93,0,0}}, +/* 65509 */ {(13<<2)|1,{93,0,0}}, +/* 65510 */ {(13<<2)|1,{93,0,0}}, +/* 65511 */ {(13<<2)|1,{93,0,0}}, +/* 65512 */ {(13<<2)|1,{126,0,0}}, +/* 65513 */ {(13<<2)|1,{126,0,0}}, +/* 65514 */ {(13<<2)|1,{126,0,0}}, +/* 65515 */ {(13<<2)|1,{126,0,0}}, +/* 65516 */ {(13<<2)|1,{126,0,0}}, +/* 65517 */ {(13<<2)|1,{126,0,0}}, +/* 65518 */ {(13<<2)|1,{126,0,0}}, +/* 65519 */ {(13<<2)|1,{126,0,0}}, +/* 65520 */ {(14<<2)|1,{94,0,0}}, +/* 65521 */ {(14<<2)|1,{94,0,0}}, +/* 65522 */ {(14<<2)|1,{94,0,0}}, +/* 65523 */ {(14<<2)|1,{94,0,0}}, +/* 65524 */ {(14<<2)|1,{125,0,0}}, +/* 65525 */ {(14<<2)|1,{125,0,0}}, +/* 65526 */ {(14<<2)|1,{125,0,0}}, +/* 65527 */ {(14<<2)|1,{125,0,0}}, +/* 65528 */ {(15<<2)|1,{60,0,0}}, +/* 65529 */ {(15<<2)|1,{60,0,0}}, +/* 65530 */ {(15<<2)|1,{96,0,0}}, +/* 65531 */ {(15<<2)|1,{96,0,0}}, +/* 65532 */ {(15<<2)|1,{123,0,0}}, +/* 65533 */ {(15<<2)|1,{123,0,0}}, +/* 65534 */ {0,{0,0,0,}}, +/* 65535 */ {0,{0,0,0,}}, +}; + + +#define SHORTEST_CODE 5 + + +/* The decoder is optimized for the common case. Most of the time, we decode + * data whose encoding is 16 bits or shorter. This allows us to use a 64 KB + * table indexed by two bytes of input which outputs, 1, 2, or 3 bytes at a + * time. + * + * In the case a longer code is encoutered, we fall back to the original + * Huffman decoder that supports all code lengths. + */ +int +lshpack_dec_huff_decode (const unsigned char *src, int src_len, + unsigned char *dst, int dst_len) +{ + unsigned char *const orig_dst = dst; + const unsigned char *const src_end = src + src_len; + unsigned char *const dst_end = dst + dst_len; + uint64_t buf; + unsigned avail_bits, len; + struct hdec hdec; + uint16_t idx; + int r; + + buf = 0; + avail_bits = 0; + if (src + 8 <= src_end) + { + goto first_fill; + fill_fast: + switch ((64 - avail_bits) >> 3) + { + case 8: + buf <<= 8; + first_fill: + buf |= (uint64_t) *src++; + case 7: + buf <<= 8; + buf |= (uint64_t) *src++; + default: + buf <<= 48; + buf |= (uint64_t) *src++ << 40; + buf |= (uint64_t) *src++ << 32; + buf |= (uint64_t) *src++ << 24; + buf |= (uint64_t) *src++ << 16; + buf |= (uint64_t) *src++ << 8; + buf |= (uint64_t) *src++ << 0; + } + avail_bits += (64 - avail_bits) >> 3 << 3; + } + else if (src < src_end) + { + do + { + fill_slow: + buf <<= 8; + buf |= (uint64_t) *src++; + avail_bits += 8; + } + while (src < src_end && avail_bits < 57); + } + else + return 0; + + if (dst_end - dst >= (ptrdiff_t) (8 * sizeof(buf) / SHORTEST_CODE) + && avail_bits >= 16) + { + /* Fast loop: don't check destination bounds; use the fact that all + * table entries below 0xFFFE are valid. + */ + do + { + idx = buf >> (avail_bits - 16); + if (idx < 0xFFFE) + { + hdec = hdecs[idx]; + dst[0] = hdec.out[0]; + dst[1] = hdec.out[1]; + dst[2] = hdec.out[2]; + dst += hdec.lens & 3; + avail_bits -= hdec.lens >> 2; + } + else + goto slow_pass; + } + while (avail_bits >= 16); + } + else + while (avail_bits >= 16) + { + idx = buf >> (avail_bits - 16); + hdec = hdecs[idx]; + len = hdec.lens & 3; + if (len && dst + len <= dst_end) + { + switch (len) + { + case 3: + *dst++ = hdec.out[0]; + *dst++ = hdec.out[1]; + *dst++ = hdec.out[2]; + break; + case 2: + *dst++ = hdec.out[0]; + *dst++ = hdec.out[1]; + break; + default: + *dst++ = hdec.out[0]; + break; + } + avail_bits -= hdec.lens >> 2; + } + else if (dst + len > dst_end) + return -2; + else + goto slow_pass; + } + + if (src + 8 <= src_end) + goto fill_fast; + if (src < src_end) + goto fill_slow; + + if (avail_bits >= SHORTEST_CODE) + { + idx = buf << (16 - avail_bits); + idx |= (1 << (16 - avail_bits)) - 1; /* EOF */ + if (idx == 0xFFFF && avail_bits < 8) + goto end; + /* If a byte or more of input is left, this mean there is a valid + * encoding, not just EOF. + */ + hdec = hdecs[idx]; + len = hdec.lens & 3; + if (len && dst + len <= dst_end) + { + switch (len) + { + case 3: + *dst++ = hdec.out[0]; + *dst++ = hdec.out[1]; + *dst++ = hdec.out[2]; + break; + case 2: + *dst++ = hdec.out[0]; + *dst++ = hdec.out[1]; + break; + default: + *dst++ = hdec.out[0]; + break; + } + avail_bits -= hdec.lens >> 2; + } + else if (dst + len > dst_end) + return -2; + else + /* This must be an invalid code, otherwise it would have fit */ + return -1; + } + + if (avail_bits > 0) + { + if (((1u << avail_bits) - 1) != (buf & ((1u << avail_bits) - 1))) + return -1; /* Not EOF as expected */ + } + + end: + return dst - orig_dst; + + slow_pass: + /* Find previous byte boundary and finish decoding thence. */ + while ((avail_bits & 7) && dst > orig_dst) + avail_bits += encode_table[ *--dst ].bits; + assert((avail_bits & 7) == 0); + src -= avail_bits >> 3; + r = lshpack_dec_huff_decode_full(src, src_end - src, dst, dst_end - dst); + if (r >= 0) + return dst - orig_dst + r; + else + return r; +} diff --git a/src/lshpack/lshpack.h b/src/lshpack/lshpack.h index e53240758..41e1a360a 100644 --- a/src/lshpack/lshpack.h +++ b/src/lshpack/lshpack.h @@ -281,6 +281,8 @@ unsigned lshpack_enc_get_stx_tab_id (const char *name, unsigned name_len, const char *val, unsigned val_len); +typedef unsigned lshpack_strlen_t; /* Compatibility */ + #ifdef __cplusplus } #endif diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 531d36939..c5614adac 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,4 +1,9 @@ # Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. +INCLUDE(CheckFunctionExists) +CHECK_FUNCTION_EXISTS(sendmmsg HAVE_SENDMMSG) +CHECK_FUNCTION_EXISTS(recvmmsg HAVE_RECVMMSG) +CHECK_FUNCTION_EXISTS(open_memstream HAVE_OPEN_MEMSTREAM) + INCLUDE(CheckSymbolExists) @@ -20,8 +25,7 @@ CHECK_INCLUDE_FILES(regex.h HAVE_REGEX) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/test_config.h.in ${CMAKE_CURRENT_SOURCE_DIR}/test_config.h) - -IF(NOT (CMAKE_C_FLAGS MATCHES "-DNDEBUG")) +IF(CMAKE_BUILD_TYPE STREQUAL "Debug") # Our test framework relies on assertions, only compile if assertions are # enabled. # diff --git a/test/http_client.c b/test/http_client.c index cdb3343e3..7153b7741 100644 --- a/test/http_client.c +++ b/test/http_client.c @@ -18,6 +18,7 @@ #endif #include #include +#include #include #include #include @@ -44,6 +45,14 @@ #include "../src/liblsquic/lsquic_logger.h" #include "../src/liblsquic/lsquic_int_types.h" #include "../src/liblsquic/lsquic_util.h" +/* include directly for reset_stream testing */ +#include "../src/liblsquic/lsquic_varint.h" +#include "../src/liblsquic/lsquic_hq.h" +#include "../src/liblsquic/lsquic_sfcw.h" +#include "../src/liblsquic/lsquic_hash.h" +#include "../src/liblsquic/lsquic_stream.h" +/* include directly for retire_cid testing */ +#include "../src/liblsquic/lsquic_conn.h" #define MIN(a, b) ((a) < (b) ? (a) : (b)) @@ -173,19 +182,19 @@ struct http_client_ctx { unsigned hcc_concurrency; unsigned hcc_cc_reqs_per_conn; unsigned hcc_n_open_conns; + unsigned hcc_reset_after_nbytes; + unsigned hcc_retire_cid_after_nbytes; - unsigned char *hcc_zero_rtt; - size_t hcc_zero_rtt_len; - size_t hcc_zero_rtt_max_len; - FILE *hcc_zero_rtt_file; char *hcc_zero_rtt_file_name; enum { + HCC_SKIP_0RTT = (1 << 0), HCC_SEEN_FIN = (1 << 1), HCC_ABORT_ON_INCOMPLETE = (1 << 2), - HCC_RTT_INFO = (1 << 3), } hcc_flags; struct prog *prog; + const char *qif_file; + FILE *qif_fh; }; struct lsquic_conn_ctx { @@ -200,6 +209,9 @@ struct lsquic_conn_ctx { * and decremented as streams are closed. It should * never exceed hcc_cc_reqs_per_conn in client_ctx. */ + enum { + CH_ZERO_RTT_SAVED = 1 << 0, + } ch_flags; }; @@ -225,18 +237,33 @@ display_cert_chain (lsquic_conn_t *); static void create_connections (struct http_client_ctx *client_ctx) { - unsigned char *zero_rtt = NULL; - size_t zero_rtt_len = 0; - if (client_ctx->hcc_flags & HCC_RTT_INFO) + size_t len; + FILE *file; + unsigned char zero_rtt[0x2000]; + + if (0 == (client_ctx->hcc_flags & HCC_SKIP_0RTT) + && client_ctx->hcc_zero_rtt_file_name) { - zero_rtt = client_ctx->hcc_zero_rtt; - zero_rtt_len = client_ctx->hcc_zero_rtt_len; - LSQ_INFO("create connection zero_rtt %zu bytes", zero_rtt_len); + file = fopen(client_ctx->hcc_zero_rtt_file_name, "rb"); + if (!file) + { + LSQ_DEBUG("cannot open %s for reading: %s", + client_ctx->hcc_zero_rtt_file_name, strerror(errno)); + goto no_file; + } + len = fread(zero_rtt, 1, sizeof(zero_rtt), file); + if (0 == len && !feof(file)) + LSQ_WARN("error reading %s: %s", + client_ctx->hcc_zero_rtt_file_name, strerror(errno)); + fclose(file); + LSQ_INFO("create connection zero_rtt %zu bytes", len); } + else no_file: + len = 0; while (client_ctx->hcc_n_open_conns < client_ctx->hcc_concurrency && client_ctx->hcc_total_n_reqs > 0) - if (0 != prog_connect(client_ctx->prog, zero_rtt, zero_rtt_len)) + if (0 != prog_connect(client_ctx->prog, len ? zero_rtt : NULL, len)) { LSQ_ERROR("connection failed"); exit(EXIT_FAILURE); @@ -346,74 +373,38 @@ http_client_on_conn_closed (lsquic_conn_t *conn) } +static int +hsk_status_ok (enum lsquic_hsk_status status) +{ + return status == LSQ_HSK_OK || status == LSQ_HSK_0RTT_OK; +} + + static void http_client_on_hsk_done (lsquic_conn_t *conn, enum lsquic_hsk_status status) { - lsquic_conn_ctx_t *conn_h; - lsquic_conn_ctx_t *conn_ctx = lsquic_conn_get_ctx(conn); - struct http_client_ctx *client_ctx = conn_ctx->client_ctx; - ssize_t ret; - if (status == LSQ_HSK_FAIL) - LSQ_INFO("handshake failed"); - else + lsquic_conn_ctx_t *conn_h = lsquic_conn_get_ctx(conn); + struct http_client_ctx *client_ctx = conn_h->client_ctx; + + if (hsk_status_ok(status)) LSQ_INFO("handshake success %s", status == LSQ_HSK_0RTT_OK ? "with 0-RTT" : ""); - if (status == LSQ_HSK_OK) + else if (status == LSQ_HSK_FAIL) + LSQ_INFO("handshake failed"); + else if (status == LSQ_HSK_0RTT_FAIL) { - ret = lsquic_conn_get_zero_rtt(conn, client_ctx->hcc_zero_rtt, - client_ctx->hcc_zero_rtt_max_len); - if (ret > 0) - { - client_ctx->hcc_zero_rtt_len = ret; - LSQ_INFO("get zero_rtt %zu bytes", client_ctx->hcc_zero_rtt_len); - client_ctx->hcc_flags |= HCC_RTT_INFO; - /* clear file and prepare to write */ - if (client_ctx->hcc_zero_rtt_file) - { - client_ctx->hcc_zero_rtt_file = freopen( - client_ctx->hcc_zero_rtt_file_name, - "wb", client_ctx->hcc_zero_rtt_file); - LSQ_DEBUG("reopen and clear zero_rtt file"); - } - /* open file for the first time */ - if (client_ctx->hcc_zero_rtt_file_name && - !client_ctx->hcc_zero_rtt_file) - { - client_ctx->hcc_zero_rtt_file = fopen( - client_ctx->hcc_zero_rtt_file_name, "wb+"); - if (client_ctx->hcc_zero_rtt_file) - LSQ_DEBUG("opened zero_rtt file"); - else - LSQ_DEBUG("zero_rtt file cannot be created"); - } - /* write to file */ - if (client_ctx->hcc_zero_rtt_file) - { - size_t ret2 = fwrite(client_ctx->hcc_zero_rtt, 1, - client_ctx->hcc_zero_rtt_len, - client_ctx->hcc_zero_rtt_file); - LSQ_DEBUG("wrote %zu bytes to zero_rtt file", ret2); - if (ret2 == client_ctx->hcc_zero_rtt_len) - { - fclose(client_ctx->hcc_zero_rtt_file); - client_ctx->hcc_zero_rtt_file = NULL; - LSQ_DEBUG("close zero_rtt file"); - } - else - LSQ_ERROR("did not write full blob to zero_rtt file"); - } - } - else if (ret == 0) - { - LSQ_INFO("zero_rtt not available"); - } else - LSQ_INFO("get_zero_rtt failed %s", strerror(errno)); + LSQ_INFO("handshake failed because of 0-RTT, will retry without it"); + client_ctx->hcc_flags |= HCC_SKIP_0RTT; + ++client_ctx->hcc_concurrency; + ++client_ctx->hcc_total_n_reqs; } + else + assert(0); - if ((status != LSQ_HSK_FAIL) && s_display_cert_chain) + if (hsk_status_ok(status) && s_display_cert_chain) display_cert_chain(conn); - if (status != LSQ_HSK_FAIL) + if (hsk_status_ok(status)) { conn_h = lsquic_conn_get_ctx(conn); ++s_stat_conns_ok; @@ -430,6 +421,49 @@ http_client_on_hsk_done (lsquic_conn_t *conn, enum lsquic_hsk_status status) } +static void +http_client_on_zero_rtt_info (lsquic_conn_t *conn, const unsigned char *buf, + size_t bufsz) +{ + lsquic_conn_ctx_t *const conn_h = lsquic_conn_get_ctx(conn); + struct http_client_ctx *const client_ctx = conn_h->client_ctx; + FILE *file; + size_t nw; + + assert(client_ctx->hcc_zero_rtt_file_name); + + /* Our client is rather limited: only one file and only one ticket per + * connection can be saved. + */ + if (conn_h->ch_flags & CH_ZERO_RTT_SAVED) + { + LSQ_DEBUG("zero-rtt already saved for this connection"); + return; + } + + file = fopen(client_ctx->hcc_zero_rtt_file_name, "wb"); + if (!file) + { + LSQ_WARN("cannot open %s for writing: %s", + client_ctx->hcc_zero_rtt_file_name, strerror(errno)); + return; + } + + nw = fwrite(buf, 1, bufsz, file); + if (nw == bufsz) + { + LSQ_DEBUG("wrote %zd bytes of zero-rtt information to %s", + nw, client_ctx->hcc_zero_rtt_file_name); + conn_h->ch_flags |= CH_ZERO_RTT_SAVED; + } + else + LSQ_WARN("error: fwrite(%s) returns %zd instead of %zd: %s", + client_ctx->hcc_zero_rtt_file_name, nw, bufsz, strerror(errno)); + + fclose(file); +} + + struct lsquic_stream_ctx { lsquic_stream_t *stream; struct http_client_ctx *client_ctx; @@ -660,6 +694,20 @@ http_client_on_read (lsquic_stream_t *stream, lsquic_stream_ctx_t *st_h) else if (nread = lsquic_stream_read(stream, buf, sizeof(buf)), nread > 0) { s_stat_downloaded_bytes += nread; + /* test stream_reset after some number of read bytes */ + if (client_ctx->hcc_reset_after_nbytes && + s_stat_downloaded_bytes > client_ctx->hcc_reset_after_nbytes) + { + lsquic_stream_reset(stream, 0x1); + break; + } + /* test retire_cid after some number of read bytes */ + if (client_ctx->hcc_retire_cid_after_nbytes && + s_stat_downloaded_bytes > client_ctx->hcc_retire_cid_after_nbytes) + { + lsquic_conn_retire_cid(lsquic_stream_conn(stream)); + break; + } if (!g_header_bypass && !(st_h->sh_flags & PROCESSED_HEADERS)) { /* First read is assumed to be the first byte */ @@ -669,7 +717,7 @@ http_client_on_read (lsquic_stream_t *stream, lsquic_stream_ctx_t *st_h) st_h->sh_flags |= PROCESSED_HEADERS; } if (!s_discard_response) - write(STDOUT_FILENO, buf, nread); + fwrite(buf, 1, nread, stdout); if (randomly_reprioritize_streams && (st_h->count++ & 0x3F) == 0) { old_prio = lsquic_stream_priority(stream); @@ -679,7 +727,7 @@ http_client_on_read (lsquic_stream_t *stream, lsquic_stream_ctx_t *st_h) #endif lsquic_stream_set_priority(stream, new_prio); assert(s == 0); - LSQ_DEBUG("changed stream %u priority from %u to %u", + LSQ_DEBUG("changed stream %"PRIu64" priority from %u to %u", lsquic_stream_id(stream), old_prio, new_prio); } } @@ -695,6 +743,12 @@ http_client_on_read (lsquic_stream_t *stream, lsquic_stream_ctx_t *st_h) LSQ_NOTICE("emptied the buffer in 'once' mode"); break; } + else if (lsquic_stream_is_rejected(stream)) + { + LSQ_NOTICE("stream was rejected"); + lsquic_stream_close(stream); + break; + } else { LSQ_ERROR("could not read: %s", strerror(errno)); @@ -746,7 +800,7 @@ http_client_on_close (lsquic_stream_t *stream, lsquic_stream_ctx_t *st_h) } -const struct lsquic_stream_if http_client_if = { +static struct lsquic_stream_if http_client_if = { .on_new_conn = http_client_on_new_conn, .on_conn_closed = http_client_on_conn_closed, .on_new_stream = http_client_on_new_stream, @@ -776,7 +830,7 @@ usage (const char *prog) " connections will have fewer requests than this.\n" " -w CONCUR Number of concurrent requests per single connection.\n" " Defaults to 1.\n" -" -m METHOD Method. Defaults to GET.\n" +" -M METHOD Method. Defaults to GET.\n" " -P PAYLOAD Name of the file that contains payload to be used in the\n" " request. This adds two more headers to the request:\n" " content-type: application/octet-stream and\n" @@ -791,8 +845,11 @@ usage (const char *prog) " be verified.\n" #endif " -a Display server certificate chain after successful handshake.\n" +" -b N_BYTES Send RESET_STREAM frame after the client has read n bytes.\n" " -t Print stats to stdout.\n" " -T FILE Print stats to FILE. If FILE is -, print stats to stdout.\n" +" -q FILE QIF mode: issue requests from the QIF file and validate\n" +" server responses.\n" , prog); } @@ -1028,10 +1085,298 @@ display_stat (FILE *out, const struct sample_stats *stats, const char *name) } +static lsquic_conn_ctx_t * +qif_client_on_new_conn (void *stream_if_ctx, lsquic_conn_t *conn) +{ + lsquic_conn_make_stream(conn); + return stream_if_ctx; +} + + +static void +qif_client_on_conn_closed (lsquic_conn_t *conn) +{ + struct http_client_ctx *client_ctx = (void *) lsquic_conn_get_ctx(conn); + LSQ_INFO("connection is closed: stop engine"); + prog_stop(client_ctx->prog); +} + + +struct qif_stream_ctx +{ + int reqno; + struct lsquic_http_headers headers; + char *qif_str; + size_t qif_sz; + size_t qif_off; + char *resp_str; /* qif_sz allocated */ + size_t resp_off; /* Read so far */ + enum { + QSC_HEADERS_SENT = 1 << 0, + QSC_GOT_HEADERS = 1 << 1, + } flags; +}; + +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + +lsquic_stream_ctx_t * +qif_client_on_new_stream (void *stream_if_ctx, lsquic_stream_t *stream) +{ + struct http_client_ctx *const client_ctx = stream_if_ctx; + FILE *const fh = client_ctx->qif_fh; + struct qif_stream_ctx *ctx; + struct lsquic_http_header *header; + static int reqno; + size_t nalloc; + int i; + char *end, *tab, *line; + char line_buf[0x1000]; + + ctx = calloc(1, sizeof(*ctx)); + if (!ctx) + { + perror("calloc"); + exit(1); + } + ctx->reqno = reqno++; + + nalloc = 0; + while ((line = fgets(line_buf, sizeof(line_buf), fh))) + { + end = strchr(line, '\n'); + if (!end) + { + fprintf(stderr, "no newline\n"); + exit(1); + } + + if (end == line) + break; + + if (*line == '#') + continue; + + tab = strchr(line, '\t'); + if (!tab) + { + fprintf(stderr, "no TAB\n"); + exit(1); + } + + if (nalloc + (end + 1 - line) > ctx->qif_sz) + { + if (nalloc) + nalloc = MAX(nalloc * 2, nalloc + (end + 1 - line)); + else + nalloc = end + 1 - line; + ctx->qif_str = realloc(ctx->qif_str, nalloc); + if (!ctx->qif_str) + { + perror("realloc"); + exit(1); + } + } + memcpy(ctx->qif_str + ctx->qif_sz, line, end + 1 - line); + + ctx->headers.headers = realloc(ctx->headers.headers, + sizeof(ctx->headers.headers[0]) * (ctx->headers.count + 1)); + if (!ctx->headers.headers) + { + perror("realloc"); + exit(1); + } + header = &ctx->headers.headers[ctx->headers.count++]; + header->name.iov_base = (void *) ctx->qif_sz; + header->name.iov_len = tab - line; + header->value.iov_base = (void *) (ctx->qif_sz + (tab - line + 1)); + header->value.iov_len = end - tab - 1; + + ctx->qif_sz += end + 1 - line; + } + + for (i = 0; i < ctx->headers.count; ++i) + { + ctx->headers.headers[i].name.iov_base = ctx->qif_str + + (uintptr_t) ctx->headers.headers[i].name.iov_base; + ctx->headers.headers[i].value.iov_base = ctx->qif_str + + (uintptr_t) ctx->headers.headers[i].value.iov_base; + } + + lsquic_stream_wantwrite(stream, 1); + + if (!line) + { + LSQ_DEBUG("Input QIF file ends; close file handle"); + fclose(client_ctx->qif_fh); + client_ctx->qif_fh = NULL; + } + + return (void *) ctx; +} + + +static void +qif_client_on_write (struct lsquic_stream *stream, lsquic_stream_ctx_t *h) +{ + struct qif_stream_ctx *const ctx = (void *) h; + size_t towrite; + ssize_t nw; + + if (ctx->flags & QSC_HEADERS_SENT) + { + towrite = ctx->qif_sz - ctx->qif_off; + nw = lsquic_stream_write(stream, ctx->qif_str + ctx->qif_off, towrite); + if (nw >= 0) + { + LSQ_DEBUG("wrote %zd bytes to stream", nw); + ctx->qif_off += nw; + if (ctx->qif_off == (size_t) nw) + { + lsquic_stream_shutdown(stream, 1); + lsquic_stream_wantread(stream, 1); + LSQ_DEBUG("finished writing request %d", ctx->reqno); + } + } + else + { + LSQ_ERROR("cannot write to stream: %s", strerror(errno)); + lsquic_stream_wantwrite(stream, 0); + lsquic_conn_abort(lsquic_stream_conn(stream)); + } + } + else + { + if (0 == lsquic_stream_send_headers(stream, &ctx->headers, 0)) + { + ctx->flags |= QSC_HEADERS_SENT; + LSQ_DEBUG("sent headers"); + } + else + { + LSQ_ERROR("cannot send headers: %s", strerror(errno)); + lsquic_stream_wantwrite(stream, 0); + lsquic_conn_abort(lsquic_stream_conn(stream)); + } + } +} + + +static void +qif_client_on_read (struct lsquic_stream *stream, lsquic_stream_ctx_t *h) +{ + struct qif_stream_ctx *const ctx = (void *) h; + struct hset *hset; + ssize_t nr; + unsigned char buf[1]; + + LSQ_DEBUG("reading response to request %d", ctx->reqno); + + if (!(ctx->flags & QSC_GOT_HEADERS)) + { + hset = lsquic_stream_get_hset(stream); + if (!hset) + { + LSQ_ERROR("could not get header set from stream"); + exit(2); + } + LSQ_DEBUG("got header set for response %d", ctx->reqno); + hset_dump(hset, stdout); + hset_destroy(hset); + ctx->flags |= QSC_GOT_HEADERS; + } + else + { + if (!ctx->resp_str) + { + ctx->resp_str = malloc(ctx->qif_sz); + if (!ctx->resp_str) + { + perror("malloc"); + exit(1); + } + } + if (ctx->resp_off < ctx->qif_sz) + { + nr = lsquic_stream_read(stream, ctx->resp_str + ctx->resp_off, + ctx->qif_sz - ctx->resp_off); + if (nr > 0) + { + ctx->resp_off += nr; + LSQ_DEBUG("read %zd bytes of reponse %d", nr, ctx->reqno); + } + else if (nr == 0) + { + LSQ_INFO("response %d too short", ctx->reqno); + LSQ_WARN("response %d FAIL", ctx->reqno); + lsquic_stream_shutdown(stream, 0); + } + else + { + LSQ_ERROR("error reading from stream"); + lsquic_stream_wantread(stream, 0); + lsquic_conn_abort(lsquic_stream_conn(stream)); + } + } + else + { + /* Collect EOF */ + nr = lsquic_stream_read(stream, buf, sizeof(buf)); + if (nr == 0) + { + if (0 == memcmp(ctx->qif_str, ctx->resp_str, ctx->qif_sz)) + LSQ_INFO("response %d OK", ctx->reqno); + else + LSQ_WARN("response %d FAIL", ctx->reqno); + lsquic_stream_shutdown(stream, 0); + } + else if (nr > 0) + { + LSQ_INFO("response %d too long", ctx->reqno); + LSQ_WARN("response %d FAIL", ctx->reqno); + lsquic_stream_shutdown(stream, 0); + } + else + { + LSQ_ERROR("error reading from stream"); + lsquic_stream_shutdown(stream, 0); + lsquic_conn_abort(lsquic_stream_conn(stream)); + } + } + } +} + + +static void +qif_client_on_close (struct lsquic_stream *stream, lsquic_stream_ctx_t *h) +{ + struct lsquic_conn *conn = lsquic_stream_conn(stream); + struct http_client_ctx *client_ctx = (void *) lsquic_conn_get_ctx(conn); + struct qif_stream_ctx *const ctx = (void *) h; + free(ctx->qif_str); + free(ctx->resp_str); + free(ctx->headers.headers); + free(ctx); + if (client_ctx->qif_fh) + lsquic_conn_make_stream(conn); + else + lsquic_conn_close(conn); +} + + +const struct lsquic_stream_if qif_client_if = { + .on_new_conn = qif_client_on_new_conn, + .on_conn_closed = qif_client_on_conn_closed, + .on_new_stream = qif_client_on_new_stream, + .on_read = qif_client_on_read, + .on_write = qif_client_on_write, + .on_close = qif_client_on_close, +}; + + int main (int argc, char **argv) { - int opt, s; + int opt, s, was_empty; lsquic_time_t start_time; FILE *stats_fh = NULL; long double elapsed; @@ -1040,7 +1385,7 @@ main (int argc, char **argv) struct path_elem *pe; struct sport_head sports; struct prog prog; - unsigned char zero_rtt[8192]; + const char *token = NULL; TAILQ_INIT(&sports); memset(&client_ctx, 0, sizeof(client_ctx)); @@ -1051,9 +1396,8 @@ main (int argc, char **argv) client_ctx.hcc_cc_reqs_per_conn = 1; client_ctx.hcc_reqs_per_conn = 1; client_ctx.hcc_total_n_reqs = 1; - client_ctx.hcc_zero_rtt = (unsigned char *)zero_rtt; - client_ctx.hcc_zero_rtt_len = sizeof(zero_rtt); - client_ctx.hcc_zero_rtt_max_len = sizeof(zero_rtt); + client_ctx.hcc_reset_after_nbytes = 0; + client_ctx.hcc_retire_cid_after_nbytes = 0; client_ctx.prog = &prog; #ifdef WIN32 WSADATA wsd; @@ -1062,9 +1406,10 @@ main (int argc, char **argv) prog_init(&prog, LSENG_HTTP, &sports, &http_client_if, &client_ctx); - while (-1 != (opt = getopt(argc, argv, PROG_OPTS "46Br:R:IKu:EP:M:n:w:H:p:0:h" + while (-1 != (opt = getopt(argc, argv, PROG_OPTS + "46Br:R:IKu:EP:M:n:w:H:p:0:q:e:hatT:b:d:" #ifndef WIN32 - "C:atT:" + "C:" #endif ))) { @@ -1138,6 +1483,15 @@ main (int argc, char **argv) usage(argv[0]); prog_print_common_options(&prog, stdout); exit(0); + case 'q': + client_ctx.qif_file = optarg; + break; + case 'e': + if (TAILQ_EMPTY(&sports)) + token = optarg; + else + sport_set_token(TAILQ_LAST(&sports, sport_head), optarg); + break; #ifndef WIN32 case 'C': prog.prog_api.ea_verify_cert = verify_server_cert; @@ -1160,13 +1514,15 @@ main (int argc, char **argv) } } break; + case 'b': + client_ctx.hcc_reset_after_nbytes = atoi(optarg); + break; + case 'd': + client_ctx.hcc_retire_cid_after_nbytes = atoi(optarg); + break; case '0': + http_client_if.on_zero_rtt_info = http_client_on_zero_rtt_info; client_ctx.hcc_zero_rtt_file_name = optarg; - client_ctx.hcc_zero_rtt_file = fopen(optarg, "rb+"); - if (client_ctx.hcc_zero_rtt_file) - LSQ_DEBUG("opened zero_rtt file"); - else - LSQ_DEBUG("zero_rtt file is empty, opening later"); break; default: if (0 != prog_set_opt(&prog, opt, optarg)) @@ -1178,41 +1534,52 @@ main (int argc, char **argv) prog.prog_api.ea_stats_fh = stats_fh; #endif - if (client_ctx.hcc_zero_rtt_file) + if (client_ctx.qif_file) { - size_t ret = fread(client_ctx.hcc_zero_rtt, 1, - client_ctx.hcc_zero_rtt_max_len, - client_ctx.hcc_zero_rtt_file); - if (ret) + client_ctx.qif_fh = fopen(client_ctx.qif_file, "r"); + if (!client_ctx.qif_fh) { - client_ctx.hcc_flags |= HCC_RTT_INFO; - client_ctx.hcc_zero_rtt_len = ret; - LSQ_DEBUG("read %zu bytes from zero_rtt file", ret); + fprintf(stderr, "Cannot open %s for reading: %s\n", + client_ctx.qif_file, strerror(errno)); + exit(1); } - else - LSQ_DEBUG("zero_rtt file is empty"); + LSQ_NOTICE("opened QIF file %s for reading\n", client_ctx.qif_file); + prog.prog_api.ea_stream_if = &qif_client_if; + g_header_bypass = 1; + prog.prog_api.ea_hsi_if = &header_bypass_api; + prog.prog_api.ea_hsi_ctx = NULL; + } + else if (TAILQ_EMPTY(&client_ctx.hcc_path_elems)) + { + fprintf(stderr, "Specify at least one path using -p option\n"); + exit(1); } start_time = lsquic_time_now(); + was_empty = TAILQ_EMPTY(&sports); if (0 != prog_prep(&prog)) { LSQ_ERROR("could not prep"); exit(EXIT_FAILURE); } + if (was_empty && token) + sport_set_token(TAILQ_LAST(&sports, sport_head), token); - create_connections(&client_ctx); + if (client_ctx.qif_file) + { + if (0 != prog_connect(&prog, NULL, 0)) + { + LSQ_ERROR("connection failed"); + exit(EXIT_FAILURE); + } + } + else + create_connections(&client_ctx); LSQ_DEBUG("entering event loop"); s = prog_run(&prog); - if (client_ctx.hcc_zero_rtt_file) - { - fclose(client_ctx.hcc_zero_rtt_file); - client_ctx.hcc_zero_rtt_file = NULL; - LSQ_DEBUG("close zero_rtt file"); - } - if (stats_fh) { elapsed = (long double) (lsquic_time_now() - start_time) / 1000000; @@ -1238,5 +1605,8 @@ main (int argc, char **argv) free(pe); } + if (client_ctx.qif_fh) + (void) fclose(client_ctx.qif_fh); + exit(0 == s ? EXIT_SUCCESS : EXIT_FAILURE); } diff --git a/test/http_server.c b/test/http_server.c new file mode 100644 index 000000000..d99422808 --- /dev/null +++ b/test/http_server.c @@ -0,0 +1,1528 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * http_server.c -- A simple HTTP/QUIC server + * + * It serves up files from the filesystem. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include "lsquic.h" +#include "test_config.h" +#include "test_common.h" +#include "prog.h" + +#include "../src/liblsquic/lsquic_logger.h" +#include "../src/liblsquic/lsquic_int_types.h" +#include "../src/liblsquic/lsquic_util.h" + +static const char on_being_idle[]; +static const size_t IDLE_SIZE; + +/* This is the "LSWS" mode: first write is performed immediately, outside + * of the on_write() callback. This makes it possible to play with buffered + * packet queues. + */ +static int s_immediate_write; + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) + +struct lsquic_conn_ctx; + +static void interop_server_hset_destroy (void *); + +struct server_ctx { + struct lsquic_conn_ctx *conn_h; + lsquic_engine_t *engine; + const char *document_root; + const char *push_path; + struct sport_head sports; + struct prog *prog; + unsigned max_conn; + unsigned n_conn; + unsigned n_current_conns; + unsigned delay_resp_sec; +}; + +struct lsquic_conn_ctx { + lsquic_conn_t *conn; + struct server_ctx *server_ctx; + enum { + RECEIVED_GOAWAY = 1 << 0, + } flags; +}; + + +static lsquic_conn_ctx_t * +http_server_on_new_conn (void *stream_if_ctx, lsquic_conn_t *conn) +{ + struct server_ctx *server_ctx = stream_if_ctx; + lsquic_conn_ctx_t *conn_h = malloc(sizeof(*conn_h)); + conn_h->conn = conn; + conn_h->server_ctx = server_ctx; + server_ctx->conn_h = conn_h; + ++server_ctx->n_current_conns; + return conn_h; +} + + +static void +http_server_on_goaway (lsquic_conn_t *conn) +{ + lsquic_conn_ctx_t *conn_h = lsquic_conn_get_ctx(conn); + conn_h->flags |= RECEIVED_GOAWAY; + LSQ_INFO("received GOAWAY"); +} + + +static void +http_server_on_conn_closed (lsquic_conn_t *conn) +{ + static int stopped; + lsquic_conn_ctx_t *conn_h = lsquic_conn_get_ctx(conn); + LSQ_INFO("Connection closed"); + --conn_h->server_ctx->n_current_conns; + if ((conn_h->server_ctx->prog->prog_flags & PROG_FLAG_COOLDOWN) + && 0 == conn_h->server_ctx->n_current_conns) + { + if (!stopped) + { + stopped = 1; + prog_stop(conn_h->server_ctx->prog); + } + } + if (conn_h->server_ctx->max_conn > 0) + { + ++conn_h->server_ctx->n_conn; + LSQ_NOTICE("Connection closed, remaining: %d", + conn_h->server_ctx->max_conn - conn_h->server_ctx->n_conn); + if (conn_h->server_ctx->n_conn >= conn_h->server_ctx->max_conn) + { + if (!stopped) + { + stopped = 1; + prog_stop(conn_h->server_ctx->prog); + } + } + } + /* No provision is made to stop HTTP server */ + free(conn_h); +} + + +struct resp +{ + const char *buf; + size_t sz; + size_t off; +}; + + +struct index_html_ctx +{ + struct resp resp; +}; + + +struct ver_head_ctx +{ + struct resp resp; + unsigned char *req_body; + size_t req_sz; /* Expect it to be the same as qif_sz */ +}; + + +struct md5sum_ctx +{ + char resp_buf[0x100]; + MD5_CTX md5ctx; + struct resp resp; + int done; +}; + + +struct req +{ + enum method { + UNSET, GET, POST, UNSUPPORTED, + } method; + char *path; + char *method_str; + char *authority_str; + char *qif_str; + size_t qif_sz; +}; + + +struct interop_push_path +{ + STAILQ_ENTRY(interop_push_path) next; + char path[0]; +}; + + +struct gen_file_ctx +{ + STAILQ_HEAD(, interop_push_path) push_paths; + size_t remain; + unsigned idle_off; +}; + + +struct lsquic_stream_ctx { + lsquic_stream_t *stream; + struct server_ctx *server_ctx; + FILE *req_fh; + char *req_buf; + char *req_filename; + char *req_path; + size_t req_sz; + enum { + SH_HEADERS_SENT = (1 << 0), + SH_DELAYED = (1 << 1), + SH_HEADERS_READ = (1 << 2), + } flags; + struct lsquic_reader reader; + + /* Fields below are used by interop callbacks: */ + enum interop_handler { + IOH_ERROR, + IOH_INDEX_HTML, + IOH_MD5SUM, + IOH_VER_HEAD, + IOH_GEN_FILE, + IOH_ECHO, + } interop_handler; + struct req *req; + const char *resp_status; + union { + struct index_html_ctx ihc; + struct ver_head_ctx vhc; + struct md5sum_ctx md5c; + struct gen_file_ctx gfc; + struct { + char buf[0x100]; + struct resp resp; + } err; + } interop_u; + struct event *resume_resp; + size_t written; +}; + + +static lsquic_stream_ctx_t * +http_server_on_new_stream (void *stream_if_ctx, lsquic_stream_t *stream) +{ + lsquic_stream_ctx_t *st_h = calloc(1, sizeof(*st_h)); + st_h->stream = stream; + st_h->server_ctx = stream_if_ctx; + lsquic_stream_wantread(stream, 1); + return st_h; +} + + +static int +ends_with (const char *filename, const char *ext) +{ + const char *where; + + where = strstr(filename, ext); + return where + && strlen(where) == strlen(ext); +} + + +static const char * +select_content_type (lsquic_stream_ctx_t *st_h) +{ + if ( ends_with(st_h->req_filename, ".html")) + return "text/html"; + else if (ends_with(st_h->req_filename, ".png")) + return "image/png"; + else if (ends_with(st_h->req_filename, ".css")) + return "text/css"; + else if (ends_with(st_h->req_filename, ".gif")) + return "image/gif"; + else if (ends_with(st_h->req_filename, ".txt")) + return "text/plain"; + else + return "application/octet-stream"; +} + + +static int +send_headers (struct lsquic_stream *stream, lsquic_stream_ctx_t *st_h) +{ + const char *content_type; + + content_type = select_content_type(st_h); + lsquic_http_header_t headers_arr[] = { + { + .name = { .iov_base = ":status", .iov_len = 7, }, + .value = { .iov_base = "200", .iov_len = 3, } + }, + { + .name = { .iov_base = "content-type", .iov_len = 12, }, + .value = { .iov_base = (void *) content_type, + .iov_len = strlen(content_type), }, + }, + }; + lsquic_http_headers_t headers = { + .count = sizeof(headers_arr) / sizeof(headers_arr[0]), + .headers = headers_arr, + }; + if (0 != lsquic_stream_send_headers(stream, &headers, 0)) + { + LSQ_ERROR("cannot send headers: %s", strerror(errno)); + return -1; + } + + st_h->flags |= SH_HEADERS_SENT; + return 0; +} + + +static void +resume_response (int fd, short what, void *arg) +{ + struct lsquic_stream_ctx *const st_h = arg; + + lsquic_stream_wantwrite(st_h->stream, 1); + event_del(st_h->resume_resp); + event_free(st_h->resume_resp); + st_h->resume_resp = NULL; + + LSQ_NOTICE("resume response to stream %"PRIu64, + lsquic_stream_id(st_h->stream)); + prog_process_conns(st_h->server_ctx->prog); +} + + +static void +http_server_on_write (lsquic_stream_t *stream, lsquic_stream_ctx_t *st_h) +{ + if (st_h->flags & SH_HEADERS_SENT) + { + ssize_t nw; + if (test_reader_size(st_h->reader.lsqr_ctx) > 0) + { + if (st_h->server_ctx->delay_resp_sec + && !(st_h->flags & SH_DELAYED) + && st_h->written > 10000000 + && test_reader_size(st_h->reader.lsqr_ctx) > 0) + { + struct timeval delay = { + .tv_sec = st_h->server_ctx->delay_resp_sec, }; + st_h->resume_resp = event_new(st_h->server_ctx->prog->prog_eb, + -1, EV_TIMEOUT, resume_response, st_h); + if (st_h->resume_resp) + { + event_add(st_h->resume_resp, &delay); + lsquic_stream_wantwrite(stream, 0); + st_h->flags |= SH_DELAYED; + LSQ_NOTICE("delay response of stream %"PRIu64" for %u seconds", + lsquic_stream_id(stream), st_h->server_ctx->delay_resp_sec); + return; + } + else + LSQ_ERROR("cannot allocate event"); + } + nw = lsquic_stream_writef(stream, &st_h->reader); + if (nw < 0) + { + struct lsquic_conn *conn = lsquic_stream_conn(stream); + lsquic_conn_ctx_t *conn_h = lsquic_conn_get_ctx(conn); + if (conn_h->flags & RECEIVED_GOAWAY) + { + LSQ_NOTICE("cannot write: goaway received"); + lsquic_stream_close(stream); + } + else + { + LSQ_ERROR("write error: %s", strerror(errno)); + exit(1); + } + } + if (test_reader_size(st_h->reader.lsqr_ctx) > 0) + { + st_h->written += (size_t) nw; + lsquic_stream_wantwrite(stream, 1); + } + else + { + lsquic_stream_shutdown(stream, 1); + lsquic_stream_wantread(stream, 1); + } + } + else + { + lsquic_stream_shutdown(stream, 1); + lsquic_stream_wantread(stream, 1); + } + } + else + { + if (0 != send_headers(stream, st_h)) + exit(1); + } +} + + +struct capped_reader_ctx +{ + struct lsquic_reader *inner_reader; + size_t nread; +}; + + +static size_t +capped_reader_size (void *void_ctx) +{ + struct capped_reader_ctx *const capped_reader_ctx = void_ctx; + struct lsquic_reader *const inner_reader = capped_reader_ctx->inner_reader; + size_t size; + + size = inner_reader->lsqr_size(inner_reader->lsqr_ctx); + return MIN((size_t) (s_immediate_write - capped_reader_ctx->nread), size); +} + + +static size_t +capped_reader_read (void *void_ctx, void *buf, size_t count) +{ + struct capped_reader_ctx *const capped_reader_ctx = void_ctx; + struct lsquic_reader *const inner_reader = capped_reader_ctx->inner_reader; + size_t size; + + count = MIN(count, (size_t) (s_immediate_write - capped_reader_ctx->nread)); + size = inner_reader->lsqr_read(inner_reader->lsqr_ctx, buf, count); + capped_reader_ctx->nread += size; + return size; +} + + +#if HAVE_OPEN_MEMSTREAM +static void +parse_request (struct lsquic_stream *stream, lsquic_stream_ctx_t *st_h) +{ + char *filename; + int s; + regex_t re; + regmatch_t matches[2]; + + s = regcomp(&re, "GET (.*) HTTP/1.[01]\r\n", REG_EXTENDED); + if (0 != s) + { + perror("regcomp"); + exit(3); + } + + s = regexec(&re, st_h->req_buf, 2, matches, 0); + if (0 != s) + { + LSQ_WARN("GET request could not be parsed: `%s'", st_h->req_buf); + regfree(&re); + return; + } + + regfree(&re); + + filename = malloc(strlen(st_h->server_ctx->document_root) + 1 + + matches[1].rm_eo - matches[1].rm_so + 1); + strcpy(filename, st_h->server_ctx->document_root); + strcat(filename, "/"); + strncat(filename, st_h->req_buf + matches[1].rm_so, + matches[1].rm_eo - matches[1].rm_so); + + LSQ_INFO("filename to fetch: %s", filename); + + st_h->req_filename = filename; + st_h->req_path = strdup(filename); +} + + +static void +process_request (struct lsquic_stream *stream, lsquic_stream_ctx_t *st_h) +{ + st_h->reader.lsqr_read = test_reader_read; + st_h->reader.lsqr_size = test_reader_size; + st_h->reader.lsqr_ctx = create_lsquic_reader_ctx(st_h->req_path); + if (!st_h->reader.lsqr_ctx) + exit(1); + + if (s_immediate_write) + { + if (0 != send_headers(stream, st_h)) + exit(1); + + if (test_reader_size(st_h->reader.lsqr_ctx) > 0) + { + struct capped_reader_ctx capped_reader_ctx = + { + .inner_reader = &st_h->reader, + }; + struct lsquic_reader capped_reader = + { + .lsqr_read = capped_reader_read, + .lsqr_size = capped_reader_size, + .lsqr_ctx = &capped_reader_ctx, + }; + ssize_t nw; + nw = lsquic_stream_writef(stream, &capped_reader); + if (nw < 0) + { + LSQ_ERROR("write error: %s", strerror(errno)); + exit(1); + } + } + + if (test_reader_size(st_h->reader.lsqr_ctx) > 0) + { + lsquic_stream_flush(stream); + lsquic_stream_wantwrite(stream, 1); + } + else + { + lsquic_stream_shutdown(stream, 1); + lsquic_stream_wantread(stream, 1); + } + } + else + lsquic_stream_wantwrite(st_h->stream, 1); +} + + +static int +push_promise (lsquic_stream_ctx_t *st_h, lsquic_stream_t *stream) +{ + lsquic_conn_t *conn; + struct iovec path, host; + int s; + regex_t re; + regmatch_t matches[2]; + + s = regcomp(&re, "\r\nHost: *([[:alnum:].][[:alnum:].]*)\r\n", + REG_EXTENDED|REG_ICASE); + if (0 != s) + { + perror("regcomp"); + exit(3); + } + + s = regexec(&re, st_h->req_buf, 2, matches, 0); + if (0 != s) + { + LSQ_WARN("Could not find host header in request `%s'", st_h->req_buf); + regfree(&re); + return -1; + } + regfree(&re); + + host.iov_len = matches[1].rm_eo - matches[1].rm_so; + host.iov_base = st_h->req_buf + matches[1].rm_so; + path.iov_len = strlen(st_h->server_ctx->push_path); + path.iov_base = (void *) st_h->server_ctx->push_path; + +#define IOV(v) { .iov_base = (v), .iov_len = sizeof(v) - 1, } + lsquic_http_header_t headers_arr[] = { + { + .name = IOV("x-some-header"), + .value = IOV("x-some-value"), + }, + { + .name = IOV("x-kenny-status"), + .value = IOV("Oh my God! They killed Kenny!!! You bastards!"), + }, + }; + lsquic_http_headers_t extra_headers = { + .count = sizeof(headers_arr) / sizeof(headers_arr[0]), + .headers = headers_arr, + }; + + conn = lsquic_stream_conn(stream); + s = lsquic_conn_push_stream(conn, NULL, stream, &path, &host, + &extra_headers); + if (0 == s) + LSQ_NOTICE("pushed stream successfully"); + else + LSQ_ERROR("could not push stream: %s", strerror(errno)); + + return 0; +} +#endif + + +static void +http_server_on_read (lsquic_stream_t *stream, lsquic_stream_ctx_t *st_h) +{ +#if HAVE_OPEN_MEMSTREAM + unsigned char buf[0x400]; + ssize_t nread; + int s; + + if (!st_h->req_fh) + st_h->req_fh = open_memstream(&st_h->req_buf, &st_h->req_sz); + + nread = lsquic_stream_read(stream, buf, sizeof(buf)); + if (nread > 0) + fwrite(buf, 1, nread, st_h->req_fh); + else if (0 == nread) + { + fwrite("", 1, 1, st_h->req_fh); /* NUL-terminate so that we can regex the string */ + fclose(st_h->req_fh); + LSQ_INFO("got request: `%.*s'", (int) st_h->req_sz, st_h->req_buf); + parse_request(stream, st_h); + if (st_h->server_ctx->push_path && + !lsquic_stream_is_pushed(stream) && + 0 != strcmp(st_h->req_path, st_h->server_ctx->push_path)) + { + s = push_promise(st_h, stream); + if (s != 0) + exit(1); + } + process_request(stream, st_h); + free(st_h->req_buf); + lsquic_stream_shutdown(stream, 0); + } + else + { + LSQ_ERROR("error reading: %s", strerror(errno)); + lsquic_stream_close(stream); + } +#else + LSQ_ERROR("%s: open_memstream not supported\n", __func__); + exit(1); +#endif +} + + +static void +http_server_on_close (lsquic_stream_t *stream, lsquic_stream_ctx_t *st_h) +{ + free(st_h->req_filename); + free(st_h->req_path); + if (st_h->reader.lsqr_ctx) + destroy_lsquic_reader_ctx(st_h->reader.lsqr_ctx); + if (st_h->req) + interop_server_hset_destroy(st_h->req); + free(st_h); + LSQ_INFO("%s called", __func__); +} + + +const struct lsquic_stream_if http_server_if = { + .on_new_conn = http_server_on_new_conn, + .on_conn_closed = http_server_on_conn_closed, + .on_new_stream = http_server_on_new_stream, + .on_read = http_server_on_read, + .on_write = http_server_on_write, + .on_close = http_server_on_close, + .on_goaway_received = http_server_on_goaway, +}; + + +struct req_map +{ + enum method method; + const char *path; + enum interop_handler handler; + const char *status; + enum { + RM_WANTBODY = 1 << 0, + RM_REGEX = 1 << 1, + } flags; +}; + + +static const struct req_map req_maps[] = +{ + { GET, "/", IOH_INDEX_HTML, "200", 0, }, + { GET, "/index.html", IOH_INDEX_HTML, "200", 0, }, + { POST, "/cgi-bin/md5sum.cgi", IOH_MD5SUM, "200", RM_WANTBODY, }, + { POST, "/cgi-bin/verify-headers.cgi", IOH_VER_HEAD, "200", RM_WANTBODY, }, + { GET, "^/([0-9][0-9]*)([KMG]?)$", IOH_GEN_FILE, "200", RM_REGEX, }, + { GET, "^/([0-9][0-9]*)([KMG]?)\\?push=([^&]*)$", IOH_GEN_FILE, "200", RM_REGEX, }, + { GET, "^/([0-9][0-9]*)([KMG]?)\\?push=([^&]*)&push=([^&]*)$", IOH_GEN_FILE, "200", RM_REGEX, }, + { GET, "^/([0-9][0-9]*)([KMG]?)\\?push=([^&]*)&push=([^&]*)&push=([^&]*)$", IOH_GEN_FILE, "200", RM_REGEX, }, + { GET, "^/file-([0-9][0-9]*)([KMG]?)$", IOH_GEN_FILE, "200", RM_REGEX, }, + { GET, "^/file-([0-9][0-9]*)([KMG]?)\\?push=([^&]*)$", IOH_GEN_FILE, "200", RM_REGEX, }, + { GET, "^/file-([0-9][0-9]*)([KMG]?)\\?push=([^&]*)&push=([^&]*)$", IOH_GEN_FILE, "200", RM_REGEX, }, + { GET, "^/file-([0-9][0-9]*)([KMG]?)\\?push=([^&]*)&push=([^&]*)&push=([^&]*)$", IOH_GEN_FILE, "200", RM_REGEX, }, +}; + + +#define MAX_MATCHES 5 + + +static const struct req_map * +find_handler (enum method method, const char *path, regmatch_t *matches) +{ + const struct req_map *map; + regex_t re; + + for (map = req_maps; map < req_maps + sizeof(req_maps) + / sizeof(req_maps[0]); ++map) + if (method == map->method) + { + if (map->flags & RM_REGEX) + { +#ifndef NDEBUG + int s; + s = +#endif + regcomp(&re, map->path, REG_EXTENDED|REG_ICASE); + assert(0 == s); + if (0 == regexec(&re, path, MAX_MATCHES + 1, matches, 0)) + { + regfree(&re); + return map; + } + regfree(&re); + } + else if (0 == strcasecmp(path, map->path)) + return map; + } + + return NULL; +} + + +static const char INDEX_HTML[] = +"\n" +" \n" +" LiteSpeed IETF QUIC Server Index Page\n" +" \n" +" \n" +"

LiteSpeed IETF QUIC Server Index Page

\n" +"

Hello! Welcome to the interop. Available services:\n" +"

    \n" +"
  • POST to /cgi-bin/md5sum.cgi. This will return\n" +" MD5 checksum of the request body.\n" +"
  • GET /123K or GET /file-123K. This will return\n" +" requested number of payload in the form of repeating text\n" +" by Jerome K. Jerome. The size specification must match\n" +" (\\d+)[KMG]? and the total size request must not exceed\n" +" 2 gigabytes. Then, you will get back that many bytes\n" +" of the beloved classic.\n" +"
\n" +" \n" +"\n" +; + + +static size_t +read_md5 (void *ctx, const unsigned char *buf, size_t sz, int fin) +{ + struct lsquic_stream_ctx *st_h = ctx; + + if (sz) + MD5_Update(&st_h->interop_u.md5c.md5ctx, buf, sz); + + if (fin) + st_h->interop_u.md5c.done = 1; + + return sz; +} + + +static void +http_server_interop_on_read (lsquic_stream_t *stream, lsquic_stream_ctx_t *st_h) +{ +#define ERROR_RESP(code, args...) do { \ + LSQ_WARN(args); \ + st_h->interop_handler = IOH_ERROR; \ + st_h->resp_status = #code; \ + st_h->interop_u.err.resp.sz = snprintf(st_h->interop_u.err.buf, \ + sizeof(st_h->interop_u.err.buf), args); \ + if (st_h->interop_u.err.resp.sz >= sizeof(st_h->interop_u.err.buf)) \ + st_h->interop_u.err.resp.sz = sizeof(st_h->interop_u.err.buf) - 1; \ + st_h->interop_u.err.resp.buf = st_h->interop_u.err.buf; \ + st_h->interop_u.err.resp.off = 0; \ + goto err; \ +} while (0) + + const struct req_map *map; + ssize_t nw; + size_t need; + unsigned len, i; + struct interop_push_path *push_path; + regmatch_t matches[MAX_MATCHES + 1]; + unsigned char md5sum[MD5_DIGEST_LENGTH]; + char md5str[ sizeof(md5sum) * 2 + 1 ]; + char byte[1]; + + if (!(st_h->flags & SH_HEADERS_READ)) + { + st_h->flags |= SH_HEADERS_READ; + st_h->req = lsquic_stream_get_hset(stream); + if (!st_h->req) + ERROR_RESP(500, "Internal error: cannot fetch header set from stream"); + else if (st_h->req->method == UNSET) + ERROR_RESP(400, "Method is not speicified"); + else if (!st_h->req->path) + ERROR_RESP(400, "Path is not speicified"); + else if (st_h->req->method == UNSUPPORTED) + ERROR_RESP(501, "Method %s is not supported", st_h->req->method_str); + else if (!(map = find_handler(st_h->req->method, st_h->req->path, matches))) + ERROR_RESP(404, "No handler found for method: %s; path: %s", + st_h->req->method_str, st_h->req->path); + else + { + LSQ_INFO("found handler for %s %s", st_h->req->method_str, st_h->req->path); + st_h->resp_status = map->status; + st_h->interop_handler = map->handler; + switch (map->handler) + { + case IOH_INDEX_HTML: + st_h->interop_u.ihc.resp = (struct resp) { INDEX_HTML, sizeof(INDEX_HTML) - 1, 0, }; + break; + case IOH_VER_HEAD: + st_h->interop_u.vhc.resp = (struct resp) { + st_h->req->qif_str, st_h->req->qif_sz, 0, }; + break; + case IOH_MD5SUM: + MD5_Init(&st_h->interop_u.md5c.md5ctx); + st_h->interop_u.md5c.done = 0; + break; + case IOH_GEN_FILE: + STAILQ_INIT(&st_h->interop_u.gfc.push_paths); + st_h->interop_u.gfc.remain = strtol(st_h->req->path + matches[1].rm_so, NULL, 10); + if (matches[2].rm_so >= 0 + && matches[2].rm_so < matches[2].rm_eo) + { + switch (st_h->req->path[ matches[2].rm_so ]) + { + case 'G': + case 'g': + st_h->interop_u.gfc.remain <<= 30; + break; + case 'M': + case 'm': + st_h->interop_u.gfc.remain <<= 20; + break; + case 'K': + case 'k': + st_h->interop_u.gfc.remain <<= 10; + break; + } + } + if (st_h->interop_u.gfc.remain > 2 * (1u << 30)) + ERROR_RESP(406, "Response of %zd bytes is too long to generate", + st_h->interop_u.gfc.remain); + st_h->interop_u.gfc.idle_off = 0; + for (i = 3; i <= MAX_MATCHES; ++i) + if (matches[i].rm_so >= 0) + { + len = matches[i].rm_eo - matches[i].rm_so; + push_path = malloc(sizeof(*push_path) + len + 1); + memcpy(push_path->path, st_h->req->path + + matches[i].rm_so, len); + push_path->path[len] ='\0'; + STAILQ_INSERT_TAIL(&st_h->interop_u.gfc.push_paths, + push_path, next); + } + else + break; + break; + default: + /* TODO: implement this */ + assert(0); + break; + } + } + + if (!(map->flags & RM_WANTBODY)) + { + err: + lsquic_stream_shutdown(stream, 0); + lsquic_stream_wantwrite(stream, 1); + } + } + else + { + switch (st_h->interop_handler) + { + case IOH_MD5SUM: + assert(!st_h->interop_u.md5c.done); + nw = lsquic_stream_readf(stream, read_md5, st_h); + if (nw < 0) + { + LSQ_ERROR("could not read from stream for MD5: %s", strerror(errno)); + exit(1); + } + if (st_h->interop_u.md5c.done) + { + MD5_Final(md5sum, &st_h->interop_u.md5c.md5ctx); + lsquic_hexstr(md5sum, sizeof(md5sum), md5str, sizeof(md5str)); + snprintf(st_h->interop_u.md5c.resp_buf, sizeof(st_h->interop_u.md5c.resp_buf), + "MD5 Checksum Result\n" + "

MD5 Checksum Result

\n

" + "MD5 Checksum: %s\n\n", + md5str); + st_h->interop_u.md5c.resp.buf = st_h->interop_u.md5c.resp_buf; + st_h->interop_u.md5c.resp.sz = strlen(st_h->interop_u.md5c.resp_buf); + st_h->interop_u.md5c.resp.off = 0; + lsquic_stream_shutdown(stream, 0); + lsquic_stream_wantwrite(stream, 1); + } + break; + case IOH_VER_HEAD: + if (!st_h->interop_u.vhc.req_body) + { + st_h->interop_u.vhc.req_body = malloc(st_h->req->qif_sz); + if (!st_h->interop_u.vhc.req_body) + { + perror("malloc"); + exit(1); + } + } + need = st_h->req->qif_sz - st_h->interop_u.vhc.req_sz; + if (need > 0) + { + nw = lsquic_stream_read(stream, + st_h->interop_u.vhc.req_body + + st_h->interop_u.vhc.req_sz, need); + if (nw > 0) + st_h->interop_u.vhc.req_sz += need; + else if (nw == 0) + { + LSQ_WARN("request body too short (does not match headers)"); + lsquic_stream_shutdown(stream, 0); + lsquic_stream_wantwrite(stream, 1); + } + else + { + LSQ_ERROR("error reading from stream"); + exit(1); + } + } + else + { + nw = lsquic_stream_read(stream, byte, sizeof(byte)); + if (nw == 0) + { + if (0 == memcmp(st_h->req->qif_str, + st_h->interop_u.vhc.req_body, st_h->req->qif_sz)) + LSQ_INFO("request headers and payload check out"); + else + LSQ_WARN("request headers and payload are different"); + } + else + LSQ_WARN("request body too long (does not match headers)"); + lsquic_stream_shutdown(stream, 0); + lsquic_stream_wantwrite(stream, 1); + } + break; + default: + assert(0); + } + } +} + + +static int +send_headers2 (struct lsquic_stream *stream, struct lsquic_stream_ctx *st_h, + size_t content_len) +{ + char clbuf[0x20]; + + snprintf(clbuf, sizeof(clbuf), "%zd", content_len); + + lsquic_http_header_t headers_arr[] = { + { + .name = { .iov_base = ":status", .iov_len = 7, }, + .value = { .iov_base = (char *) st_h->resp_status, + .iov_len = strlen(st_h->resp_status), }, + }, + { + .name = { .iov_base = "server", .iov_len = 6, }, + .value = { .iov_base = "LiteSpeed", .iov_len = 9, }, + }, + { + .name = { .iov_base = "content-type", .iov_len = 12, }, + .value = { .iov_base = "application/html", .iov_len = 16, }, + }, + { + .name = { .iov_base = "content-length", .iov_len = 14, }, + .value = { .iov_base = clbuf, .iov_len = strlen(clbuf), }, + }, + }; + lsquic_http_headers_t headers = { + .count = sizeof(headers_arr) / sizeof(headers_arr[0]), + .headers = headers_arr, + }; + + return lsquic_stream_send_headers(st_h->stream, &headers, 0); +} + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) + +static size_t +idle_read (void *lsqr_ctx, void *buf, size_t count) +{ + struct gen_file_ctx *const gfc = lsqr_ctx; + unsigned char *p = buf; + unsigned char *const end = buf + count; + size_t towrite; + + while (p < end && gfc->remain > 0) + { + towrite = MIN((unsigned) (end - p), IDLE_SIZE - gfc->idle_off); + if (towrite > gfc->remain) + towrite = gfc->remain; + memcpy(p, on_being_idle + gfc->idle_off, towrite); + gfc->idle_off += towrite; + if (gfc->idle_off == IDLE_SIZE) + gfc->idle_off = 0; + p += towrite; + gfc->remain -= towrite; + } + + return p - (unsigned char *) buf; +} + + +static size_t +idle_size (void *lsqr_ctx) +{ + struct gen_file_ctx *const gfc = lsqr_ctx; + + return gfc->remain; +} + + +static void +idle_on_write (lsquic_stream_t *stream, lsquic_stream_ctx_t *st_h) +{ + struct gen_file_ctx *const gfc = &st_h->interop_u.gfc; + struct interop_push_path *push_path; + struct iovec headers[2]; + ssize_t nw; + + if (st_h->flags & SH_HEADERS_SENT) + { + struct lsquic_reader reader = + { + .lsqr_read = idle_read, + .lsqr_size = idle_size, + .lsqr_ctx = gfc, + }; + nw = lsquic_stream_writef(stream, &reader); + if (nw < 0) + { + LSQ_ERROR("error writing idle thoughts: %s", strerror(errno)); + exit(1); + } + if (gfc->remain == 0) + lsquic_stream_shutdown(stream, 1); + } + else + { + if (st_h->req->authority_str) + while ((push_path = STAILQ_FIRST(&gfc->push_paths))) + { + STAILQ_REMOVE_HEAD(&gfc->push_paths, next); + LSQ_DEBUG("pushing promise for %s", push_path->path); + headers[0] = (struct iovec) { push_path->path, strlen(push_path->path), }; + headers[1] = (struct iovec) { st_h->req->authority_str, strlen(st_h->req->authority_str), }; + (void) lsquic_conn_push_stream(lsquic_stream_conn(stream), + NULL, stream, &headers[0], &headers[1], NULL); + free(push_path); + } + if (0 == send_headers2(stream, st_h, gfc->remain)) + st_h->flags |= SH_HEADERS_SENT; + else + { + LSQ_ERROR("cannot send headers: %s", strerror(errno)); + lsquic_stream_close(stream); + } + } +} + + +static void +http_server_interop_on_write (lsquic_stream_t *stream, lsquic_stream_ctx_t *st_h) +{ + struct resp *resp; + ssize_t nw; + + switch (st_h->interop_handler) + { + case IOH_ERROR: + resp = &st_h->interop_u.err.resp; + goto reply; + case IOH_INDEX_HTML: + resp = &st_h->interop_u.ihc.resp; + goto reply; + case IOH_VER_HEAD: + resp = &st_h->interop_u.vhc.resp; + goto reply; + case IOH_MD5SUM: + resp = &st_h->interop_u.md5c.resp; + goto reply; + case IOH_GEN_FILE: + idle_on_write(stream, st_h); + return; + default: + assert(0); + return; + } + + reply: + assert(resp->sz); /* We always need to send body */ + if (!(st_h->flags & SH_HEADERS_SENT)) + { + send_headers2(stream, st_h, resp->sz); + st_h->flags |= SH_HEADERS_SENT; + return; + } + + nw = lsquic_stream_write(stream, resp->buf + resp->off, resp->sz - resp->off); + if (nw < 0) + { + LSQ_ERROR("error writing to stream: %s", strerror(errno)); + lsquic_conn_abort(lsquic_stream_conn(stream)); + return; + } + + resp->off += nw; + lsquic_stream_flush(stream); + if (resp->off == resp->sz) + lsquic_stream_shutdown(stream, 1); +} + + +const struct lsquic_stream_if interop_http_server_if = { + .on_new_conn = http_server_on_new_conn, + .on_conn_closed = http_server_on_conn_closed, + .on_new_stream = http_server_on_new_stream, + .on_read = http_server_interop_on_read, + .on_write = http_server_interop_on_write, + .on_close = http_server_on_close, +}; + + +static void +usage (const char *prog) +{ + const char *const slash = strrchr(prog, '/'); + if (slash) + prog = slash + 1; + printf( +"Usage: %s [opts]\n" +"\n" +"Options:\n" +" -r ROOT Document root\n" +" -p FILE Push request with this path\n" +" -w SIZE Write immediately (LSWS mode). Argument specifies maximum\n" +" size of the immediate write.\n" +" -y DELAY Delay response for this many seconds -- use for debugging\n" + , prog); +} + + +static void * +interop_server_hset_create (void *hsi_ctx, int is_push_promise) +{ + return calloc(1, sizeof(struct req)); +} + + +static enum lsquic_header_status +interop_server_hset_add_header (void *hset_p, unsigned name_idx, + const char *name, unsigned name_len, + const char *value, unsigned value_len) +{ + struct req *req = hset_p; + + if (name) + { + req->qif_str = realloc(req->qif_str, + req->qif_sz + name_len + value_len + 2); + if (!req->qif_str) + { + LSQ_ERROR("malloc failed"); + return LSQUIC_HDR_ERR_NOMEM; + } + memcpy(req->qif_str + req->qif_sz, name, name_len); + req->qif_str[req->qif_sz + name_len] = '\t'; + memcpy(req->qif_str + req->qif_sz + name_len + 1, value, value_len); + req->qif_str[req->qif_sz + name_len + 1 + value_len] = '\n'; + req->qif_sz += name_len + value_len + 2; + } + + if (5 == name_len && 0 == strncmp(name, ":path", 5)) + { + if (req->path) + return LSQUIC_HDR_ERR_DUPLICATE_PSDO_HDR; + req->path = strndup(value, value_len); + if (!req->path) + return LSQUIC_HDR_ERR_NOMEM; + return LSQUIC_HDR_OK; + } + + if (7 == name_len && 0 == strncmp(name, ":method", 7)) + { + if (req->method != UNSET) + return LSQUIC_HDR_ERR_DUPLICATE_PSDO_HDR; + req->method_str = strndup(value, value_len); + if (!req->method_str) + return LSQUIC_HDR_ERR_NOMEM; + if (0 == strcmp(req->method_str, "GET")) + req->method = GET; + else if (0 == strcmp(req->method_str, "POST")) + req->method = POST; + else + req->method = UNSUPPORTED; + return LSQUIC_HDR_OK; + } + + if (10 == name_len && 0 == strncmp(name, ":authority", 10)) + { + req->authority_str = strndup(value, value_len); + if (!req->authority_str) + return LSQUIC_HDR_ERR_NOMEM; + return LSQUIC_HDR_OK; + } + + return LSQUIC_HDR_OK; +} + + +static void +interop_server_hset_destroy (void *hset_p) +{ + struct req *req = hset_p; + free(req->qif_str); + free(req->path); + free(req->method_str); + free(req->authority_str); + free(req); +} + + +static const struct lsquic_hset_if header_bypass_api = +{ + .hsi_create_header_set = interop_server_hset_create, + .hsi_process_header = interop_server_hset_add_header, + .hsi_discard_header_set = interop_server_hset_destroy, +}; + + +int +main (int argc, char **argv) +{ + int opt, s; + struct stat st; + struct server_ctx server_ctx; + struct prog prog; + + memset(&server_ctx, 0, sizeof(server_ctx)); + TAILQ_INIT(&server_ctx.sports); + server_ctx.prog = &prog; + + prog_init(&prog, LSENG_SERVER|LSENG_HTTP, &server_ctx.sports, + &http_server_if, &server_ctx); + + while (-1 != (opt = getopt(argc, argv, PROG_OPTS "y:Y:n:p:r:w:h"))) + { + switch (opt) { + case 'n': + server_ctx.max_conn = atoi(optarg); + break; + case 'p': + server_ctx.push_path = optarg; + break; + case 'r': + if (-1 == stat(optarg, &st)) + { + perror("stat"); + exit(2); + } + if (!S_ISDIR(st.st_mode)) + { + fprintf(stderr, "`%s' is not a directory\n", optarg); + exit(2); + } + server_ctx.document_root = optarg; + break; + case 'w': + s_immediate_write = atoi(optarg); + break; + case 'y': + server_ctx.delay_resp_sec = atoi(optarg); + break; + case 'h': + usage(argv[0]); + prog_print_common_options(&prog, stdout); + exit(0); + default: + if (0 != prog_set_opt(&prog, opt, optarg)) + exit(1); + } + } + + if (!server_ctx.document_root) + { + LSQ_NOTICE("Document root is not set: start in Interop Mode"); + prog.prog_api.ea_stream_if = &interop_http_server_if; + prog.prog_api.ea_hsi_if = &header_bypass_api; + prog.prog_api.ea_hsi_ctx = NULL; + } + + if (0 != prog_prep(&prog)) + { + LSQ_ERROR("could not prep"); + exit(EXIT_FAILURE); + } + + LSQ_DEBUG("entering event loop"); + + s = prog_run(&prog); + prog_cleanup(&prog); + + exit(0 == s ? EXIT_SUCCESS : EXIT_FAILURE); +} + + +static const char on_being_idle[] = +"ON BEING IDLE.\n" +"\n" +"Now, this is a subject on which I flatter myself I really am _au fait_.\n" +"The gentleman who, when I was young, bathed me at wisdom's font for nine\n" +"guineas a term--no extras--used to say he never knew a boy who could\n" +"do less work in more time; and I remember my poor grandmother once\n" +"incidentally observing, in the course of an instruction upon the use\n" +"of the Prayer-book, that it was highly improbable that I should ever do\n" +"much that I ought not to do, but that she felt convinced beyond a doubt\n" +"that I should leave undone pretty well everything that I ought to do.\n" +"\n" +"I am afraid I have somewhat belied half the dear old lady's prophecy.\n" +"Heaven help me! I have done a good many things that I ought not to have\n" +"done, in spite of my laziness. But I have fully confirmed the accuracy\n" +"of her judgment so far as neglecting much that I ought not to have\n" +"neglected is concerned. Idling always has been my strong point. I take\n" +"no credit to myself in the matter--it is a gift. Few possess it. There\n" +"are plenty of lazy people and plenty of slow-coaches, but a genuine\n" +"idler is a rarity. He is not a man who slouches about with his hands in\n" +"his pockets. On the contrary, his most startling characteristic is that\n" +"he is always intensely busy.\n" +"\n" +"It is impossible to enjoy idling thoroughly unless one has plenty of\n" +"work to do. There is no fun in doing nothing when you have nothing to\n" +"do. Wasting time is merely an occupation then, and a most exhausting\n" +"one. Idleness, like kisses, to be sweet must be stolen.\n" +"\n" +"Many years ago, when I was a young man, I was taken very ill--I never\n" +"could see myself that much was the matter with me, except that I had\n" +"a beastly cold. But I suppose it was something very serious, for the\n" +"doctor said that I ought to have come to him a month before, and that\n" +"if it (whatever it was) had gone on for another week he would not have\n" +"answered for the consequences. It is an extraordinary thing, but I\n" +"never knew a doctor called into any case yet but what it transpired\n" +"that another day's delay would have rendered cure hopeless. Our medical\n" +"guide, philosopher, and friend is like the hero in a melodrama--he\n" +"always comes upon the scene just, and only just, in the nick of time. It\n" +"is Providence, that is what it is.\n" +"\n" +"Well, as I was saying, I was very ill and was ordered to Buxton for a\n" +"month, with strict injunctions to do nothing whatever all the while\n" +"that I was there. \"Rest is what you require,\" said the doctor, \"perfect\n" +"rest.\"\n" +"\n" +"It seemed a delightful prospect. \"This man evidently understands my\n" +"complaint,\" said I, and I pictured to myself a glorious time--a four\n" +"weeks' _dolce far niente_ with a dash of illness in it. Not too much\n" +"illness, but just illness enough--just sufficient to give it the flavor\n" +"of suffering and make it poetical. I should get up late, sip chocolate,\n" +"and have my breakfast in slippers and a dressing-gown. I should lie out\n" +"in the garden in a hammock and read sentimental novels with a melancholy\n" +"ending, until the books should fall from my listless hand, and I should\n" +"recline there, dreamily gazing into the deep blue of the firmament,\n" +"watching the fleecy clouds floating like white-sailed ships across\n" +"its depths, and listening to the joyous song of the birds and the low\n" +"rustling of the trees. Or, on becoming too weak to go out of doors,\n" +"I should sit propped up with pillows at the open window of the\n" +"ground-floor front, and look wasted and interesting, so that all the\n" +"pretty girls would sigh as they passed by.\n" +"\n" +"And twice a day I should go down in a Bath chair to the Colonnade to\n" +"drink the waters. Oh, those waters! I knew nothing about them then,\n" +"and was rather taken with the idea. \"Drinking the waters\" sounded\n" +"fashionable and Queen Anne-fied, and I thought I should like them. But,\n" +"ugh! after the first three or four mornings! Sam Weller's description of\n" +"them as \"having a taste of warm flat-irons\" conveys only a faint idea of\n" +"their hideous nauseousness. If anything could make a sick man get well\n" +"quickly, it would be the knowledge that he must drink a glassful of them\n" +"every day until he was recovered. I drank them neat for six consecutive\n" +"days, and they nearly killed me; but after then I adopted the plan of\n" +"taking a stiff glass of brandy-and-water immediately on the top of them,\n" +"and found much relief thereby. I have been informed since, by various\n" +"eminent medical gentlemen, that the alcohol must have entirely\n" +"counteracted the effects of the chalybeate properties contained in the\n" +"water. I am glad I was lucky enough to hit upon the right thing.\n" +"\n" +"But \"drinking the waters\" was only a small portion of the torture I\n" +"experienced during that memorable month--a month which was, without\n" +"exception, the most miserable I have ever spent. During the best part of\n" +"it I religiously followed the doctor's mandate and did nothing whatever,\n" +"except moon about the house and garden and go out for two hours a day in\n" +"a Bath chair. That did break the monotony to a certain extent. There is\n" +"more excitement about Bath-chairing--especially if you are not used to\n" +"the exhilarating exercise--than might appear to the casual observer. A\n" +"sense of danger, such as a mere outsider might not understand, is ever\n" +"present to the mind of the occupant. He feels convinced every minute\n" +"that the whole concern is going over, a conviction which becomes\n" +"especially lively whenever a ditch or a stretch of newly macadamized\n" +"road comes in sight. Every vehicle that passes he expects is going to\n" +"run into him; and he never finds himself ascending or descending a\n" +"hill without immediately beginning to speculate upon his chances,\n" +"supposing--as seems extremely probable--that the weak-kneed controller\n" +"of his destiny should let go.\n" +"\n" +"But even this diversion failed to enliven after awhile, and the _ennui_\n" +"became perfectly unbearable. I felt my mind giving way under it. It is\n" +"not a strong mind, and I thought it would be unwise to tax it too far.\n" +"So somewhere about the twentieth morning I got up early, had a good\n" +"breakfast, and walked straight off to Hayfield, at the foot of the\n" +"Kinder Scout--a pleasant, busy little town, reached through a lovely\n" +"valley, and with two sweetly pretty women in it. At least they were\n" +"sweetly pretty then; one passed me on the bridge and, I think, smiled;\n" +"and the other was standing at an open door, making an unremunerative\n" +"investment of kisses upon a red-faced baby. But it is years ago, and I\n" +"dare say they have both grown stout and snappish since that time.\n" +"Coming back, I saw an old man breaking stones, and it roused such strong\n" +"longing in me to use my arms that I offered him a drink to let me take\n" +"his place. He was a kindly old man and he humored me. I went for those\n" +"stones with the accumulated energy of three weeks, and did more work in\n" +"half an hour than he had done all day. But it did not make him jealous.\n" +"\n" +"Having taken the plunge, I went further and further into dissipation,\n" +"going out for a long walk every morning and listening to the band in\n" +"the pavilion every evening. But the days still passed slowly\n" +"notwithstanding, and I was heartily glad when the last one came and I\n" +"was being whirled away from gouty, consumptive Buxton to London with its\n" +"stern work and life. I looked out of the carriage as we rushed through\n" +"Hendon in the evening. The lurid glare overhanging the mighty city\n" +"seemed to warm my heart, and when, later on, my cab rattled out of St.\n" +"Pancras' station, the old familiar roar that came swelling up around me\n" +"sounded the sweetest music I had heard for many a long day.\n" +"\n" +"I certainly did not enjoy that month's idling. I like idling when I\n" +"ought not to be idling; not when it is the only thing I have to do. That\n" +"is my pig-headed nature. The time when I like best to stand with my\n" +"back to the fire, calculating how much I owe, is when my desk is heaped\n" +"highest with letters that must be answered by the next post. When I like\n" +"to dawdle longest over my dinner is when I have a heavy evening's work\n" +"before me. And if, for some urgent reason, I ought to be up particularly\n" +"early in the morning, it is then, more than at any other time, that I\n" +"love to lie an extra half-hour in bed.\n" +"\n" +"Ah! how delicious it is to turn over and go to sleep again: \"just for\n" +"five minutes.\" Is there any human being, I wonder, besides the hero of\n" +"a Sunday-school \"tale for boys,\" who ever gets up willingly? There\n" +"are some men to whom getting up at the proper time is an utter\n" +"impossibility. If eight o'clock happens to be the time that they should\n" +"turn out, then they lie till half-past. If circumstances change and\n" +"half-past eight becomes early enough for them, then it is nine before\n" +"they can rise. They are like the statesman of whom it was said that he\n" +"was always punctually half an hour late. They try all manner of schemes.\n" +"They buy alarm-clocks (artful contrivances that go off at the wrong time\n" +"and alarm the wrong people). They tell Sarah Jane to knock at the door\n" +"and call them, and Sarah Jane does knock at the door and does call them,\n" +"and they grunt back \"awri\" and then go comfortably to sleep again. I\n" +"knew one man who would actually get out and have a cold bath; and even\n" +"that was of no use, for afterward he would jump into bed again to warm\n" +"himself.\n" +"\n" +"I think myself that I could keep out of bed all right if I once got\n" +"out. It is the wrenching away of the head from the pillow that I find so\n" +"hard, and no amount of over-night determination makes it easier. I say\n" +"to myself, after having wasted the whole evening, \"Well, I won't do\n" +"any more work to-night; I'll get up early to-morrow morning;\" and I am\n" +"thoroughly resolved to do so--then. In the morning, however, I feel less\n" +"enthusiastic about the idea, and reflect that it would have been much\n" +"better if I had stopped up last night. And then there is the trouble of\n" +"dressing, and the more one thinks about that the more one wants to put\n" +"it off.\n" +"\n" +"It is a strange thing this bed, this mimic grave, where we stretch our\n" +"tired limbs and sink away so quietly into the silence and rest. \"O bed,\n" +"O bed, delicious bed, that heaven on earth to the weary head,\" as sang\n" +"poor Hood, you are a kind old nurse to us fretful boys and girls. Clever\n" +"and foolish, naughty and good, you take us all in your motherly lap and\n" +"hush our wayward crying. The strong man full of care--the sick man\n" +"full of pain--the little maiden sobbing for her faithless lover--like\n" +"children we lay our aching heads on your white bosom, and you gently\n" +"soothe us off to by-by.\n" +"\n" +"Our trouble is sore indeed when you turn away and will not comfort us.\n" +"How long the dawn seems coming when we cannot sleep! Oh! those hideous\n" +"nights when we toss and turn in fever and pain, when we lie, like living\n" +"men among the dead, staring out into the dark hours that drift so slowly\n" +"between us and the light. And oh! those still more hideous nights when\n" +"we sit by another in pain, when the low fire startles us every now and\n" +"then with a falling cinder, and the tick of the clock seems a hammer\n" +"beating out the life that we are watching.\n" +"\n" +"But enough of beds and bedrooms. I have kept to them too long, even for\n" +"an idle fellow. Let us come out and have a smoke. That wastes time just\n" +"as well and does not look so bad. Tobacco has been a blessing to us\n" +"idlers. What the civil-service clerk before Sir Walter's time found\n" +"to occupy their minds with it is hard to imagine. I attribute the\n" +"quarrelsome nature of the Middle Ages young men entirely to the want of\n" +"the soothing weed. They had no work to do and could not smoke, and\n" +"the consequence was they were forever fighting and rowing. If, by any\n" +"extraordinary chance, there was no war going, then they got up a deadly\n" +"family feud with the next-door neighbor, and if, in spite of this, they\n" +"still had a few spare moments on their hands, they occupied them with\n" +"discussions as to whose sweetheart was the best looking, the arguments\n" +"employed on both sides being battle-axes, clubs, etc. Questions of taste\n" +"were soon decided in those days. When a twelfth-century youth fell in\n" +"love he did not take three paces backward, gaze into her eyes, and tell\n" +"her she was too beautiful to live. He said he would step outside and see\n" +"about it. And if, when he got out, he met a man and broke his head--the\n" +"other man's head, I mean--then that proved that his--the first\n" +"fellow's--girl was a pretty girl. But if the other fellow broke _his_\n" +"head--not his own, you know, but the other fellow's--the other fellow\n" +"to the second fellow, that is, because of course the other fellow would\n" +"only be the other fellow to him, not the first fellow who--well, if he\n" +"broke his head, then _his_ girl--not the other fellow's, but the fellow\n" +"who _was_ the--Look here, if A broke B's head, then A's girl was a\n" +"pretty girl; but if B broke A's head, then A's girl wasn't a pretty\n" +"girl, but B's girl was. That was their method of conducting art\n" +"criticism.\n" +"\n" +"Nowadays we light a pipe and let the girls fight it out among\n" +"themselves.\n" +"\n" +"They do it very well. They are getting to do all our work. They are\n" +"doctors, and barristers, and artists. They manage theaters, and promote\n" +"swindles, and edit newspapers. I am looking forward to the time when we\n" +"men shall have nothing to do but lie in bed till twelve, read two novels\n" +"a day, have nice little five-o'clock teas all to ourselves, and tax\n" +"our brains with nothing more trying than discussions upon the latest\n" +"patterns in trousers and arguments as to what Mr. Jones' coat was\n" +"made of and whether it fitted him. It is a glorious prospect--for idle\n" +"fellows.\n" +"\n\n\n" +; +static const size_t IDLE_SIZE = sizeof(on_being_idle) - 1; diff --git a/test/prog.c b/test/prog.c index 1a9006540..d623aabd4 100644 --- a/test/prog.c +++ b/test/prog.c @@ -5,9 +5,13 @@ #include #include #endif +#include +#include #include #include #include +#include +#include #include #ifndef WIN32 #include @@ -20,15 +24,22 @@ #include +#include + #include "../src/liblsquic/lsquic_hash.h" +#include "../src/liblsquic/lsquic_int_types.h" +#include "../src/liblsquic/lsquic_util.h" #include "../src/liblsquic/lsquic_logger.h" #include "test_config.h" +#include "test_cert.h" #include "test_common.h" #include "prog.h" static int prog_stopped; +static SSL_CTX * get_ssl_ctx (void *); + static const struct lsquic_packout_mem_if pmi = { .pmi_allocate = pba_allocate, .pmi_release = pba_release, @@ -46,6 +57,11 @@ prog_init (struct prog *prog, unsigned flags, prog->prog_engine_flags = flags; prog->prog_sports = sports; lsquic_engine_init_settings(&prog->prog_settings, flags); +#if ECN_SUPPORTED + prog->prog_settings.es_ecn = LSQUIC_DF_ECN; +#else + prog->prog_settings.es_ecn = 0; +#endif prog->prog_api.ea_settings = &prog->prog_settings; prog->prog_api.ea_stream_if = stream_if; @@ -55,6 +71,11 @@ prog_init (struct prog *prog, unsigned flags, = prog; prog->prog_api.ea_pmi = &pmi; prog->prog_api.ea_pmi_ctx = &prog->prog_pba; + prog->prog_api.ea_get_ssl_ctx = get_ssl_ctx; +#if LSQUIC_PREFERRED_ADDR + if (getenv("LSQUIC_PREFERRED_ADDR4") || getenv("LSQUIC_PREFERRED_ADDR6")) + prog->prog_flags |= PROG_SEARCH_ADDRS; +#endif /* Non prog-specific initialization: */ lsquic_global_init(flags & LSENG_SERVER ? LSQUIC_GLOBAL_SERVER : @@ -85,13 +106,13 @@ prog_print_common_options (const struct prog *prog, FILE *out) { fprintf(out, #if HAVE_REGEX -" -s SERVER Server address. Takes on the form of host:port, host,\n" +" -s SVCPORT Service port. Takes on the form of host:port, host,\n" " or port. If host is not an IPv4 or IPv6 address, it is\n" " resolved. If host is not set, the value of SNI is\n" " used (see the -H flag). If port is not set, the default\n" " is 443.\n" #else -" -s SERVER Server address. Takes on the form of host:port or host.\n" +" -s SVCPORT Service port. Takes on the form of host:port or host.\n" " If host is not an IPv4 or IPv6 address, it is resolved.\n" " If port is not set, the default is 443.\n" #endif @@ -103,8 +124,8 @@ prog_print_common_options (const struct prog *prog, FILE *out) #if HAVE_REGEX " 8443\n" #endif -" If -s is not specified, the value of SNI is used (see\n" -" the -H flag).\n" +" If no -s option is given, 0.0.0.0:12345 address\n" +" is used.\n" #if LSQUIC_DONTFRAG_SUPPORTED " -D Set `do not fragment' flag on outgoing UDP packets\n" #endif @@ -134,9 +155,31 @@ prog_print_common_options (const struct prog *prog, FILE *out) " -S opt=val Socket options. Supported options:\n" " sndbuf=12345 # Sets SO_SNDBUF\n" " rcvbuf=12345 # Sets SO_RCVBUF\n" +" -W Use stock PMI (malloc & free)\n" ); +#if HAVE_SENDMMSG + fprintf(out, +" -g Use sendmmsg() to send packets.\n" + ); +#endif +#if HAVE_RECVMMSG + fprintf(out, +" -j Use recvmmsg() to receive packets.\n" + ); +#endif + if (prog->prog_engine_flags & LSENG_SERVER) + fprintf(out, +" -c CERTSPEC Service specification. The specification is three values\n" +" separated by commas. The values are:\n" +" * Domain name\n" +" * File containing cert in PEM format\n" +" * File containing private key in DER or PEM format\n" +" Example:\n" +" -c www.example.com,/tmp/cert.pem,/tmp/key.pkcs8\n" + ); + else { if (prog->prog_engine_flags & LSENG_HTTP) fprintf(out, @@ -150,6 +193,12 @@ prog_print_common_options (const struct prog *prog, FILE *out) ); } +#ifndef WIN32 + fprintf(out, +" -G dir SSL keys will be logged to files in this directory.\n" + ); +#endif + fprintf(out, " -k Connect UDP socket. Only meant to be used with clients\n" @@ -166,6 +215,9 @@ prog_print_common_options (const struct prog *prog, FILE *out) int prog_set_opt (struct prog *prog, int opt, const char *arg) { + struct stat st; + int s; + switch (opt) { #if LSQUIC_DONTFRAG_SUPPORTED @@ -177,6 +229,16 @@ prog_set_opt (struct prog *prog, int opt, const char *arg) sport->sp_flags |= SPORT_DONT_FRAGMENT; } return 0; +#endif +#if HAVE_SENDMMSG + case 'g': + prog->prog_use_sendmmsg = 1; + return 0; +#endif +#if HAVE_RECVMMSG + case 'j': + prog->prog_use_recvmmsg = 1; + return 0; #endif case 'm': prog->prog_packout_max = atoi(arg); @@ -184,6 +246,18 @@ prog_set_opt (struct prog *prog, int opt, const char *arg) case 'z': prog->prog_max_packet_size = atoi(arg); return 0; + case 'W': + prog->prog_use_stock_pmi = 1; + return 0; + case 'c': + if (prog->prog_engine_flags & LSENG_SERVER) + { + if (!prog->prog_certs) + prog->prog_certs = lsquic_hash_create(); + return load_cert(prog->prog_certs, arg); + } + else + return -1; case 'H': if (prog->prog_engine_flags & LSENG_SERVER) return -1; @@ -249,6 +323,32 @@ prog_set_opt (struct prog *prog, int opt, const char *arg) sport->sp_flags |= SPORT_CONNECT; } return 0; + case 'G': +#ifndef WIN32 + if (0 == stat(optarg, &st)) + { + if (!S_ISDIR(st.st_mode)) + { + LSQ_ERROR("%s is not a directory", optarg); + return -1; + } + } + else + { + s = mkdir(optarg, 0700); + if (s != 0) + { + LSQ_ERROR("cannot create directory %s: %s", optarg, + strerror(errno)); + return -1; + } + } + prog->prog_keylog_dir = optarg; + return 0; +#else + LSQ_ERROR("key logging is not supported on Windows"); + return -1; +#endif default: return 1; } @@ -272,7 +372,8 @@ prog_connect (struct prog *prog, unsigned char *zero_rtt, size_t zero_rtt_len) (struct sockaddr *) &sport->sp_local_addr, (struct sockaddr *) &sport->sas, sport, NULL, prog->prog_hostname ? prog->prog_hostname : sport->host, - prog->prog_max_packet_size, zero_rtt, zero_rtt_len)) + prog->prog_max_packet_size, zero_rtt, zero_rtt_len, + sport->sp_token_buf, sport->sp_token_sz)) return -1; prog_process_conns(prog); @@ -293,6 +394,47 @@ prog_init_client (struct prog *prog) } +static SSL_CTX * +get_ssl_ctx (void *peer_ctx) +{ + const struct service_port *const sport = peer_ctx; + return sport->sp_prog->prog_ssl_ctx; +} + + +static int +prog_init_server (struct prog *prog) +{ + struct service_port *sport; + unsigned char ticket_keys[48]; + + prog->prog_ssl_ctx = SSL_CTX_new(TLS_method()); + if (prog->prog_ssl_ctx) + { + SSL_CTX_set_min_proto_version(prog->prog_ssl_ctx, TLS1_3_VERSION); + SSL_CTX_set_max_proto_version(prog->prog_ssl_ctx, TLS1_3_VERSION); + SSL_CTX_set_default_verify_paths(prog->prog_ssl_ctx); + + /* This is obviously test code: the key is just an array of NUL bytes */ + memset(ticket_keys, 0, sizeof(ticket_keys)); + if (1 != SSL_CTX_set_tlsext_ticket_keys(prog->prog_ssl_ctx, + ticket_keys, sizeof(ticket_keys))) + { + LSQ_ERROR("SSL_CTX_set_tlsext_ticket_keys failed"); + return -1; + } + } + else + LSQ_WARN("cannot create SSL context"); + + TAILQ_FOREACH(sport, prog->prog_sports, next_sport) + if (0 != sport_init_server(sport, prog->prog_engine, prog->prog_eb)) + return -1; + + return 0; +} + + void prog_process_conns (struct prog *prog) { @@ -338,6 +480,17 @@ prog_usr1_handler (int fd, short what, void *arg) } +static void +prog_usr2_handler (int fd, short what, void *arg) +{ + struct prog *const prog = arg; + + LSQ_NOTICE("Got SIGUSR2, cool down engine"); + prog->prog_flags |= PROG_FLAG_COOLDOWN; + lsquic_engine_cooldown(prog->prog_engine); +} + + int prog_run (struct prog *prog) { @@ -345,6 +498,9 @@ prog_run (struct prog *prog) prog->prog_usr1 = evsignal_new(prog->prog_eb, SIGUSR1, prog_usr1_handler, prog); evsignal_add(prog->prog_usr1, NULL); + prog->prog_usr2 = evsignal_new(prog->prog_eb, SIGUSR2, + prog_usr2_handler, prog); + evsignal_add(prog->prog_usr2, NULL); #endif event_base_loop(prog->prog_eb, 0); @@ -358,7 +514,12 @@ prog_cleanup (struct prog *prog) { lsquic_engine_destroy(prog->prog_engine); event_base_free(prog->prog_eb); - pba_cleanup(&prog->prog_pba); + if (!prog->prog_use_stock_pmi) + pba_cleanup(&prog->prog_pba); + if (prog->prog_ssl_ctx) + SSL_CTX_free(prog->prog_ssl_ctx); + if (prog->prog_certs) + delete_certs(prog->prog_certs); lsquic_global_cleanup(); } @@ -388,15 +549,83 @@ prog_stop (struct prog *prog) event_free(prog->prog_usr1); prog->prog_usr1 = NULL; } + if (prog->prog_usr2) + { + event_del(prog->prog_usr2); + event_free(prog->prog_usr2); + prog->prog_usr2 = NULL; + } } +static void * +keylog_open (void *ctx, lsquic_conn_t *conn) +{ + const struct prog *const prog = ctx; + const lsquic_cid_t *cid; + FILE *fh; + int sz; + char id_str[MAX_CID_LEN * 2 + 1]; + char path[PATH_MAX]; + + cid = lsquic_conn_id(conn); + lsquic_hexstr(cid->idbuf, cid->len, id_str, sizeof(id_str)); + sz = snprintf(path, sizeof(path), "%s/%s.keys", prog->prog_keylog_dir, + id_str); + if ((size_t) sz >= sizeof(path)) + { + LSQ_WARN("%s: file too long", __func__); + return NULL; + } + fh = fopen(path, "w"); + if (!fh) + LSQ_WARN("could not open %s for writing: %s", path, strerror(errno)); + return fh; +} + + +static void +keylog_log_line (void *handle, const char *line) +{ + size_t len; + + len = strlen(line); + if (len < sizeof("QUIC_") - 1 || strncmp(line, "QUIC_", 5)) + fputs("QUIC_", handle); + fputs(line, handle); + fputs("\n", handle); + fflush(handle); +} + + +static void +keylog_close (void *handle) +{ + fclose(handle); +} + + +static const struct lsquic_keylog_if keylog_if = +{ + .kli_open = keylog_open, + .kli_log_line = keylog_log_line, + .kli_close = keylog_close, +}; + + + int prog_prep (struct prog *prog) { int s; char err_buf[100]; + if (prog->prog_keylog_dir) + { + prog->prog_api.ea_keylog_if = &keylog_if; + prog->prog_api.ea_keylog_ctx = prog; + } + if (0 != lsquic_engine_check_settings(prog->prog_api.ea_settings, prog->prog_engine_flags, err_buf, sizeof(err_buf))) { @@ -404,17 +633,29 @@ prog_prep (struct prog *prog) return -1; } - pba_init(&prog->prog_pba, prog->prog_packout_max); + if (!prog->prog_use_stock_pmi) + pba_init(&prog->prog_pba, prog->prog_packout_max); + else + { + prog->prog_api.ea_pmi = NULL; + prog->prog_api.ea_pmi_ctx = NULL; + } if (TAILQ_EMPTY(prog->prog_sports)) { - if (!prog->prog_hostname) - return -1; - s = prog_add_sport(prog, prog->prog_hostname); + if (prog->prog_hostname) + s = prog_add_sport(prog, prog->prog_hostname); + else + s = prog_add_sport(prog, "0.0.0.0:12345"); if (0 != s) return -1; } + if (prog->prog_certs) + { + prog->prog_api.ea_lookup_cert = lookup_cert; + prog->prog_api.ea_cert_lu_ctx = prog->prog_certs; + } prog->prog_eb = event_base_new(); prog->prog_engine = lsquic_engine_new(prog->prog_engine_flags, @@ -425,7 +666,10 @@ prog_prep (struct prog *prog) prog->prog_timer = event_new(prog->prog_eb, -1, 0, prog_timer_handler, prog); - s = prog_init_client(prog); + if (prog->prog_engine_flags & LSENG_SERVER) + s = prog_init_server(prog); + else + s = prog_init_client(prog); if (s != 0) return -1; diff --git a/test/prog.h b/test/prog.h index 97fccc20e..6e2f93b9c 100644 --- a/test/prog.h +++ b/test/prog.h @@ -6,10 +6,13 @@ #ifndef PROG_H #define PROG_H 1 +#include "test_config.h" + struct event; struct event_base; struct lsquic_hash; struct sport_head; +struct ssl_ctx_st; struct prog { @@ -22,27 +25,58 @@ struct prog unsigned short prog_max_packet_size; int prog_version_cleared; unsigned long prog_read_count; +#if HAVE_SENDMMSG + int prog_use_sendmmsg; +#endif +#if HAVE_RECVMMSG + int prog_use_recvmmsg; +#endif + int prog_use_stock_pmi; struct event_base *prog_eb; struct event *prog_timer, *prog_send, *prog_usr1; + struct event *prog_usr2; + struct ssl_ctx_st *prog_ssl_ctx; + struct lsquic_hash *prog_certs; + struct event *prog_event_sni; + char *prog_susp_sni; struct sport_head *prog_sports; struct lsquic_engine *prog_engine; const char *prog_hostname; int prog_ipver; /* 0, 4, or 6 */ + const char *prog_keylog_dir; + enum { + PROG_FLAG_COOLDOWN = 1 << 0, +#if LSQUIC_PREFERRED_ADDR + PROG_SEARCH_ADDRS = 1 << 1, +#endif + } prog_flags; }; void prog_init (struct prog *, unsigned lsquic_engine_flags, struct sport_head *, const struct lsquic_stream_if *, void *stream_if_ctx); +#if HAVE_SENDMMSG +# define SENDMMSG_FLAG "g" +#else +# define SENDMMSG_FLAG "" +#endif +#if HAVE_RECVMMSG +# define RECVMMSG_FLAG "j" +#else +# define RECVMMSG_FLAG "" +#endif + #if LSQUIC_DONTFRAG_SUPPORTED # define IP_DONTFRAG_FLAG "D" #else # define IP_DONTFRAG_FLAG "" #endif -#define PROG_OPTS "i:km:c:y:L:l:o:H:s:S:Y:z:" IP_DONTFRAG_FLAG +#define PROG_OPTS "i:km:c:y:L:l:o:H:s:S:Y:z:G:W" RECVMMSG_FLAG SENDMMSG_FLAG \ + IP_DONTFRAG_FLAG /* Returns: * 0 Applied diff --git a/test/test_cert.c b/test/test_cert.c new file mode 100644 index 000000000..2ed231643 --- /dev/null +++ b/test/test_cert.c @@ -0,0 +1,170 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "lsquic_types.h" +#include "lsquic.h" +#include "../src/liblsquic/lsquic_logger.h" +#include "../src/liblsquic/lsquic_hash.h" + +#include "test_cert.h" + + +static int +select_alpn (SSL *ssl, const unsigned char **out, unsigned char *outlen, + const unsigned char *in, unsigned int inlen, void *arg) +{ + const unsigned char alpn[] = "\x5h3-22"; + int r; + + r = SSL_select_next_proto((unsigned char **) out, outlen, in, inlen, + alpn, sizeof(alpn)); + if (r == OPENSSL_NPN_NEGOTIATED) + return SSL_TLSEXT_ERR_OK; + else + { + LSQ_WARN("no supported protocol can be selected from %.*s", + (int) inlen, (char *) in); + return SSL_TLSEXT_ERR_ALERT_FATAL; + } +} + + + +int +load_cert (struct lsquic_hash *certs, const char *optarg) +{ + int rv = -1; + char *sni, *cert_file, *key_file; + struct server_cert *cert = NULL; + EVP_PKEY *pkey = NULL; + FILE *f = NULL; + + sni = strdup(optarg); + cert_file = strchr(sni, ','); + if (!cert_file) + goto end; + *cert_file = '\0'; + ++cert_file; + key_file = strchr(cert_file, ','); + if (!key_file) + goto end; + *key_file = '\0'; + ++key_file; + + cert = calloc(1, sizeof(*cert)); + cert->ce_sni = strdup(sni); + + cert->ce_ssl_ctx = SSL_CTX_new(TLS_method()); + if (!cert->ce_ssl_ctx) + { + LSQ_ERROR("SSL_CTX_new failed"); + goto end; + } + SSL_CTX_set_min_proto_version(cert->ce_ssl_ctx, TLS1_3_VERSION); + SSL_CTX_set_max_proto_version(cert->ce_ssl_ctx, TLS1_3_VERSION); + SSL_CTX_set_default_verify_paths(cert->ce_ssl_ctx); + SSL_CTX_set_alpn_select_cb(cert->ce_ssl_ctx, select_alpn, NULL); + SSL_CTX_set_early_data_enabled(cert->ce_ssl_ctx, 1); /* XXX */ + if (1 != SSL_CTX_use_certificate_chain_file(cert->ce_ssl_ctx, cert_file)) + { + LSQ_ERROR("SSL_CTX_use_certificate_chain_file failed: %s", cert_file); + goto end; + } + + if (strstr(key_file, ".pkcs8")) + { + f = fopen(key_file, "r"); + if (!f) + { + LSQ_ERROR("fopen(%s) failed: %s", cert_file, strerror(errno)); + goto end; + } + pkey = d2i_PrivateKey_fp(f, NULL); + fclose(f); + f = NULL; + if (!pkey) + { + LSQ_ERROR("Reading private key from %s failed", key_file); + goto end; + } + if (!SSL_CTX_use_PrivateKey(cert->ce_ssl_ctx, pkey)) + { + LSQ_ERROR("SSL_CTX_use_PrivateKey failed"); + goto end; + } + } + else if (1 != SSL_CTX_use_PrivateKey_file(cert->ce_ssl_ctx, key_file, + SSL_FILETYPE_PEM)) + { + LSQ_ERROR("SSL_CTX_use_PrivateKey_file failed"); + goto end; + } + + const int was = SSL_CTX_set_session_cache_mode(cert->ce_ssl_ctx, 1); + LSQ_DEBUG("set SSL session cache mode to 1 (was: %d)", was); + + lsquic_hash_insert(certs, cert->ce_sni, strlen(cert->ce_sni), cert, + &cert->ce_hash_el); + rv = 0; + + end: + free(sni); + if (f) + fclose(f); + if (rv != 0) + { /* Error: free cert and its components */ + if (cert) + { + free(cert->ce_sni); + free(cert); + } + } + return rv; +} + +struct ssl_ctx_st * +lookup_cert (void *cert_lu_ctx, const struct sockaddr *sa_UNUSED, + const char *sni) +{ + if (!cert_lu_ctx) + return NULL; + if (!sni) + { + LSQ_INFO("SNI is not set"); + return NULL; + } + struct lsquic_hash_elem *el = lsquic_hash_find(cert_lu_ctx, sni, strlen(sni)); + struct server_cert *server_cert = NULL; + if (el) + { + server_cert = lsquic_hashelem_getdata(el); + if (server_cert) + return server_cert->ce_ssl_ctx; + } + return NULL; +} + + +void +delete_certs (struct lsquic_hash *certs) +{ + struct lsquic_hash_elem *el; + struct server_cert *cert; + + for (el = lsquic_hash_first(certs); el; el = lsquic_hash_next(certs)) + { + cert = lsquic_hashelem_getdata(el); + SSL_CTX_free(cert->ce_ssl_ctx); + free(cert->ce_sni); + free(cert); + } + lsquic_hash_destroy(certs); +} diff --git a/test/test_cert.h b/test/test_cert.h new file mode 100644 index 000000000..eb45290a1 --- /dev/null +++ b/test/test_cert.h @@ -0,0 +1,28 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#ifndef TEST_CERT_H +#define TEST_CERT_H + +struct lsquic_hash; +struct ssl_ctx_st; +struct sockaddr; + +struct server_cert +{ + char *ce_sni; + struct ssl_ctx_st *ce_ssl_ctx; + struct lsquic_hash_elem ce_hash_el; +}; + + +int +load_cert (struct lsquic_hash *, const char *optarg); + +struct ssl_ctx_st * +lookup_cert (void *cert_lu_ctx, const struct sockaddr * /*unused */, + const char *sni); + +void +delete_certs (struct lsquic_hash *); + + +#endif diff --git a/test/test_common.c b/test/test_common.c index 2dca223d1..3be8910ac 100644 --- a/test/test_common.c +++ b/test/test_common.c @@ -7,14 +7,15 @@ #include #include #include +#include #if defined(__APPLE__) # define __APPLE_USE_RFC_3542 1 #endif #ifndef WIN32 #include +#include #include #include -#include #include #else #include @@ -27,7 +28,6 @@ #include #include #include -#include #include "test_config.h" #if HAVE_REGEX @@ -45,6 +45,10 @@ #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b)) +#ifndef LSQUIC_USE_POOLS +#define LSQUIC_USE_POOLS 1 +#endif + #ifndef WIN32 # define SOCKET_TYPE int # define CLOSE_SOCKET close @@ -71,10 +75,16 @@ # define DST_MSG_SZ sizeof(struct sockaddr_in) #endif -#define MAX_PACKET_SZ 1370 +#if ECN_SUPPORTED +#define ECN_SZ CMSG_SPACE(sizeof(int)) +#else +#define ECN_SZ 0 +#endif + +#define MAX_PACKET_SZ 0xffff #define CTL_SZ (CMSG_SPACE(MAX(DST_MSG_SZ, \ - sizeof(struct in6_pktinfo))) + NDROPPED_SZ) + sizeof(struct in6_pktinfo))) + NDROPPED_SZ + ECN_SZ) /* There are `n_alloc' elements in `vecs', `local_addresses', and * `peer_addresses' arrays. `ctlmsg_data' is n_alloc * CTL_SZ. Each packets @@ -91,6 +101,9 @@ struct packets_in struct iovec *vecs; #else WSABUF *vecs; +#endif +#if ECN_SUPPORTED + int *ecn; #endif struct sockaddr_storage *local_addresses, *peer_addresses; @@ -144,8 +157,6 @@ static void getExtensionPtrs() } LeaveCriticalSection(&initLock); } - - #endif @@ -176,6 +187,9 @@ allocate_packets_in (SOCKET_TYPE fd) packs_in->vecs = malloc(n_alloc * sizeof(packs_in->vecs[0])); packs_in->local_addresses = malloc(n_alloc * sizeof(packs_in->local_addresses[0])); packs_in->peer_addresses = malloc(n_alloc * sizeof(packs_in->peer_addresses[0])); +#if ECN_SUPPORTED + packs_in->ecn = malloc(n_alloc * sizeof(packs_in->ecn[0])); +#endif return packs_in; } @@ -184,6 +198,9 @@ allocate_packets_in (SOCKET_TYPE fd) static void free_packets_in (struct packets_in *packs_in) { +#if ECN_SUPPORTED + free(packs_in->ecn); +#endif free(packs_in->peer_addresses); free(packs_in->local_addresses); free(packs_in->ctlmsg_data); @@ -205,6 +222,7 @@ sport_destroy (struct service_port *sport) (void) CLOSE_SOCKET(sport->fd); if (sport->packs_in) free_packets_in(sport->packs_in); + free(sport->sp_token_buf); free(sport); } @@ -212,7 +230,7 @@ sport_destroy (struct service_port *sport) struct service_port * sport_new (const char *optarg, struct prog *prog) { - struct service_port *const sport = malloc(sizeof(*sport)); + struct service_port *const sport = calloc(1, sizeof(*sport)); #if HAVE_REGEX regex_t re; regmatch_t matches[5]; @@ -380,6 +398,9 @@ proc_ancillary ( *msg, struct sockaddr_storage *storage #if __linux__ , uint32_t *n_dropped +#endif +#if ECN_SUPPORTED + , int *ecn #endif ) { @@ -392,7 +413,7 @@ proc_ancillary ( cmsg->cmsg_type == #if __linux__ && defined(IP_RECVORIGDSTADDR) IP_ORIGDSTADDR -#elif __linux__ || WIN32 +#elif __linux__ || WIN32 || __APPLE__ IP_PKTINFO #else IP_RECVDSTADDR @@ -405,7 +426,7 @@ proc_ancillary ( const struct in_pktinfo *in_pkt; in_pkt = (void *) WSA_CMSG_DATA(cmsg); ((struct sockaddr_in *) storage)->sin_addr = in_pkt->ipi_addr; -#elif __linux__ +#elif __linux__ || __APPLE__ const struct in_pktinfo *in_pkt; in_pkt = (void *) CMSG_DATA(cmsg); ((struct sockaddr_in *) storage)->sin_addr = in_pkt->ipi_addr; @@ -429,6 +450,24 @@ proc_ancillary ( else if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SO_RXQ_OVFL) memcpy(n_dropped, CMSG_DATA(cmsg), sizeof(*n_dropped)); +#endif +#if ECN_SUPPORTED + else if ((cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_TOS) + || (cmsg->cmsg_level == IPPROTO_IPV6 + && cmsg->cmsg_type == IPV6_TCLASS)) + { + memcpy(ecn, CMSG_DATA(cmsg), sizeof(*ecn)); + *ecn &= IPTOS_ECN_MASK; + } +#ifdef __FreeBSD__ + else if (cmsg->cmsg_level == IPPROTO_IP + && cmsg->cmsg_type == IP_RECVTOS) + { + unsigned char tos; + memcpy(&tos, CMSG_DATA(cmsg), sizeof(tos)); + *ecn = tos & IPTOS_ECN_MASK; + } +#endif #endif } } @@ -479,6 +518,7 @@ read_one_packet (struct read_iter *iter) packs_in->vecs[iter->ri_idx].len = MAX_PACKET_SZ; #endif + top: ctl_buf = packs_in->ctlmsg_data + iter->ri_idx * CTL_SZ; #ifndef WIN32 @@ -496,6 +536,14 @@ read_one_packet (struct read_iter *iter) LSQ_ERROR("recvmsg: %s", strerror(errno)); return ROP_ERROR; } + if (msg.msg_flags & (MSG_TRUNC|MSG_CTRUNC)) + { + if (msg.msg_flags & MSG_TRUNC) + LSQ_INFO("packet truncated - drop it"); + if (msg.msg_flags & MSG_CTRUNC) + LSQ_WARN("packet's auxilicary data truncated - drop it"); + goto top; + } #else WSAMSG msg = { .name = (LPSOCKADDR)&packs_in->peer_addresses[iter->ri_idx], @@ -516,10 +564,16 @@ read_one_packet (struct read_iter *iter) memcpy(local_addr, &sport->sp_local_addr, sizeof(*local_addr)); #if __linux__ n_dropped = 0; +#endif +#if ECN_SUPPORTED + packs_in->ecn[iter->ri_idx] = 0; #endif proc_ancillary(&msg, local_addr #if __linux__ , &n_dropped +#endif +#if ECN_SUPPORTED + , &packs_in->ecn[iter->ri_idx] #endif ); #if __linux__ @@ -545,6 +599,92 @@ read_one_packet (struct read_iter *iter) } +#if HAVE_RECVMMSG +static enum rop +read_using_recvmmsg (struct read_iter *iter) +{ +#if __linux__ + uint32_t n_dropped; +#endif + int s; + unsigned n; + struct sockaddr_storage *local_addr; + struct service_port *const sport = iter->ri_sport; + struct packets_in *const packs_in = sport->packs_in; + /* XXX TODO We allocate this array on the stack and initialize the + * headers each time the function is invoked. This is suboptimal. + * What we should really be doing is allocate mmsghdrs as part of + * packs_in and initialize it there. While we are at it, we should + * make packs_in shared between all service ports. + */ + struct mmsghdr mmsghdrs[ packs_in->n_alloc ]; + + /* Sanity check: we assume that the iterator is reset */ + assert(iter->ri_off == 0 && iter->ri_idx == 0); + + /* Initialize mmsghdrs */ + for (n = 0; n < sizeof(mmsghdrs) / sizeof(mmsghdrs[0]); ++n) + { + packs_in->vecs[n].iov_base = packs_in->packet_data + MAX_PACKET_SZ * n; + packs_in->vecs[n].iov_len = MAX_PACKET_SZ; + mmsghdrs[n].msg_hdr = (struct msghdr) { + .msg_name = &packs_in->peer_addresses[n], + .msg_namelen = sizeof(packs_in->peer_addresses[n]), + .msg_iov = &packs_in->vecs[n], + .msg_iovlen = 1, + .msg_control = packs_in->ctlmsg_data + CTL_SZ * n, + .msg_controllen = CTL_SZ, + }; + } + + /* Read packets */ + s = recvmmsg(sport->fd, mmsghdrs, n, 0, NULL); + if (s < 0) + { + if (!(EAGAIN == errno || EWOULDBLOCK == errno)) + LSQ_ERROR("recvmmsg: %s", strerror(errno)); + return ROP_ERROR; + } + + /* Process ancillary data and update vecs */ + for (n = 0; n < (unsigned) s; ++n) + { + local_addr = &packs_in->local_addresses[n]; + memcpy(local_addr, &sport->sp_local_addr, sizeof(*local_addr)); +#if __linux__ + n_dropped = 0; +#endif +#if ECN_SUPPORTED + packs_in->ecn[n] = 0; +#endif + proc_ancillary(&mmsghdrs[n].msg_hdr, local_addr +#if __linux__ + , &n_dropped +#endif +#if ECN_SUPPORTED + , &packs_in->ecn[n] +#endif + ); +#if __linux__ + if (sport->drop_init) + { + if (sport->n_dropped < n_dropped) + LSQ_INFO("dropped %u packets", n_dropped - sport->n_dropped); + } + else + sport->drop_init = 1; + sport->n_dropped = n_dropped; +#endif + packs_in->vecs[n].iov_len = mmsghdrs[n].msg_len; + } + + iter->ri_idx = n; + + return n == sizeof(mmsghdrs) / sizeof(mmsghdrs[0]) ? ROP_NOROOM : ROP_OK; +} +#endif + + #if __GNUC__ # define UNLIKELY(cond) __builtin_expect(cond, 0) #else @@ -573,9 +713,14 @@ read_handler (evutil_socket_t fd, short flags, void *ctx) iter.ri_off = 0; iter.ri_idx = 0; - do - rop = read_one_packet(&iter); - while (ROP_OK == rop); +#if HAVE_RECVMMSG + if (sport->sp_prog->prog_use_recvmmsg) + rop = read_using_recvmmsg(&iter); + else +#endif + do + rop = read_one_packet(&iter); + while (ROP_OK == rop); if (UNLIKELY(ROP_ERROR == rop && (sport->sp_flags & SPORT_CONNECT) && errno == ECONNREFUSED)) @@ -598,7 +743,13 @@ read_handler (evutil_socket_t fd, short flags, void *ctx) #endif (struct sockaddr *) &packs_in->local_addresses[n], (struct sockaddr *) &packs_in->peer_addresses[n], - sport)) + sport, +#if ECN_SUPPORTED + packs_in->ecn[n] +#else + 0 +#endif + )) break; if (n > 0) @@ -628,6 +779,235 @@ add_to_event_loop (struct service_port *sport, struct event_base *eb) } +int +sport_init_server (struct service_port *sport, struct lsquic_engine *engine, + struct event_base *eb) +{ + const struct sockaddr *sa_local = (struct sockaddr *) &sport->sas; + int sockfd, saved_errno, flags, s, on; + socklen_t socklen; + char addr_str[0x20]; + + switch (sa_local->sa_family) + { + case AF_INET: + socklen = sizeof(struct sockaddr_in); + break; + case AF_INET6: + socklen = sizeof(struct sockaddr_in6); + break; + default: + errno = EINVAL; + return -1; + } + + sockfd = socket(sa_local->sa_family, SOCK_DGRAM, 0); + if (-1 == sockfd) + return -1; + + if (0 != bind(sockfd, sa_local, socklen)) { + saved_errno = errno; + LSQ_WARN("bind failed: %s", strerror(errno)); + close(sockfd); + errno = saved_errno; + return -1; + } + + /* Make socket non-blocking */ + flags = fcntl(sockfd, F_GETFL); + if (-1 == flags) { + saved_errno = errno; + close(sockfd); + errno = saved_errno; + return -1; + } + flags |= O_NONBLOCK; + if (0 != fcntl(sockfd, F_SETFL, flags)) { + saved_errno = errno; + close(sockfd); + errno = saved_errno; + return -1; + } + + on = 1; + if (AF_INET == sa_local->sa_family) + s = setsockopt(sockfd, IPPROTO_IP, +#if __linux__ && defined(IP_RECVORIGDSTADDR) + IP_RECVORIGDSTADDR, +#elif __linux__ || __APPLE__ + IP_PKTINFO, +#else + IP_RECVDSTADDR, +#endif + &on, sizeof(on)); + else + s = setsockopt(sockfd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &on, sizeof(on)); + if (0 != s) + { + saved_errno = errno; + close(sockfd); + errno = saved_errno; + return -1; + } + +#if (__linux__ && !defined(IP_RECVORIGDSTADDR)) || __APPLE__ + /* Need to set IP_PKTINFO for sending */ + if (AF_INET == sa_local->sa_family) + { + on = 1; + s = setsockopt(sockfd, IPPROTO_IP, IP_PKTINFO, &on, sizeof(on)); + if (0 != s) + { + saved_errno = errno; + close(sockfd); + errno = saved_errno; + return -1; + } + } +#elif IP_RECVDSTADDR != IP_SENDSRCADDR + /* On FreeBSD, IP_RECVDSTADDR is the same as IP_SENDSRCADDR, but I do not + * know about other BSD systems. + */ + if (AF_INET == sa_local->sa_family) + { + on = 1; + s = setsockopt(sockfd, IPPROTO_IP, IP_SENDSRCADDR, &on, sizeof(on)); + if (0 != s) + { + saved_errno = errno; + close(sockfd); + errno = saved_errno; + return -1; + } + } +#endif + +#if __linux__ && defined(SO_RXQ_OVFL) + on = 1; + s = setsockopt(sockfd, SOL_SOCKET, SO_RXQ_OVFL, &on, sizeof(on)); + if (0 != s) + { + saved_errno = errno; + close(sockfd); + errno = saved_errno; + return -1; + } +#endif + +#if __linux__ + if (sport->if_name[0] && + 0 != setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, sport->if_name, + IFNAMSIZ)) + { + saved_errno = errno; + close(sockfd); + errno = saved_errno; + return -1; + } +#endif + +#if LSQUIC_DONTFRAG_SUPPORTED + if (sport->sp_flags & SPORT_DONT_FRAGMENT) + { + if (AF_INET == sa_local->sa_family) + { +#if __linux__ + on = IP_PMTUDISC_DO; + s = setsockopt(sockfd, IPPROTO_IP, IP_MTU_DISCOVER, &on, + sizeof(on)); +#else + on = 1; + s = setsockopt(sockfd, IPPROTO_IP, IP_DONTFRAG, &on, sizeof(on)); +#endif + if (0 != s) + { + saved_errno = errno; + close(sockfd); + errno = saved_errno; + return -1; + } + } + } +#endif + +#if ECN_SUPPORTED + on = 1; + if (AF_INET == sa_local->sa_family) + s = setsockopt(sockfd, IPPROTO_IP, IP_RECVTOS, &on, sizeof(on)); + else + s = setsockopt(sockfd, IPPROTO_IPV6, IPV6_RECVTCLASS, &on, sizeof(on)); + if (0 != s) + { + saved_errno = errno; + close(sockfd); + errno = saved_errno; + return -1; + } +#endif + + if (sport->sp_flags & SPORT_SET_SNDBUF) + { + s = setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sport->sp_sndbuf, + sizeof(sport->sp_sndbuf)); + if (0 != s) + { + saved_errno = errno; + close(sockfd); + errno = saved_errno; + return -1; + } + } + + if (sport->sp_flags & SPORT_SET_RCVBUF) + { + s = setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &sport->sp_rcvbuf, + sizeof(sport->sp_rcvbuf)); + if (0 != s) + { + saved_errno = errno; + close(sockfd); + errno = saved_errno; + return -1; + } + } + + if (0 != getsockname(sockfd, (struct sockaddr *) sa_local, &socklen)) + { + saved_errno = errno; + close(sockfd); + errno = saved_errno; + return -1; + } + + sport->packs_in = allocate_packets_in(sockfd); + if (!sport->packs_in) + { + saved_errno = errno; + close(sockfd); + errno = saved_errno; + return -1; + } + + memcpy((void *) &sport->sp_local_addr, sa_local, + sa_local->sa_family == AF_INET ? + sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6)); + switch (sa_local->sa_family) { + case AF_INET: + LSQ_DEBUG("local address: %s:%d", + inet_ntop(AF_INET, &((struct sockaddr_in *) sa_local)->sin_addr, + addr_str, sizeof(addr_str)), + ntohs(((struct sockaddr_in *) sa_local)->sin_port)); + break; + } + + sport->engine = engine; + sport->fd = sockfd; + sport->sp_flags |= SPORT_SERVER; + + return add_to_event_loop(sport, eb); +} + + int sport_init_client (struct service_port *sport, struct lsquic_engine *engine, struct event_base *eb) @@ -742,6 +1122,24 @@ sport_init_client (struct service_port *sport, struct lsquic_engine *engine, } #endif +#if ECN_SUPPORTED + { + int on = 1; + if (AF_INET == sa_local->sa_family) + s = setsockopt(sockfd, IPPROTO_IP, IP_RECVTOS, &on, sizeof(on)); + else + s = setsockopt(sockfd, IPPROTO_IPV6, IPV6_RECVTCLASS, &on, + sizeof(on)); + if (0 != s) + { + saved_errno = errno; + close(sockfd); + errno = saved_errno; + return -1; + } + } +#endif + if (sport->sp_flags & SPORT_SET_SNDBUF) { s = setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, @@ -803,6 +1201,25 @@ sport_init_client (struct service_port *sport, struct lsquic_engine *engine, } +/* Sometimes it is useful to impose an artificial limit for testing */ +static unsigned +packet_out_limit (void) +{ + const char *env = getenv("LSQUIC_PACKET_OUT_LIMIT"); + if (env) + return atoi(env); + else + return 0; +} + +enum ctl_what +{ + CW_SENDADDR = 1 << 0, +#if ECN_SUPPORTED + CW_ECN = 1 << 1, +#endif +}; + static void setup_control_msg ( #ifndef WIN32 @@ -810,8 +1227,8 @@ setup_control_msg ( #else WSAMSG #endif - *msg, const struct lsquic_out_spec *spec, - unsigned char *buf, size_t bufsz) + *msg, enum ctl_what cw, + const struct lsquic_out_spec *spec, unsigned char *buf, size_t bufsz) { struct cmsghdr *cmsg; struct sockaddr_in *local_sa; @@ -820,6 +1237,7 @@ setup_control_msg ( struct in_pktinfo info; #endif struct in6_pktinfo info6; + size_t ctl_len; #ifndef WIN32 msg->msg_control = buf; @@ -828,60 +1246,223 @@ setup_control_msg ( msg->Control.buf = (char*)buf; msg->Control.len = bufsz; #endif - cmsg = CMSG_FIRSTHDR(msg); - if (AF_INET == spec->dest_sa->sa_family) + /* Need to zero the buffer due to a bug(?) in CMSG_NXTHDR. See + * https://stackoverflow.com/questions/27601849/cmsg-nxthdr-returns-null-even-though-there-are-more-cmsghdr-objects + */ + memset(buf, 0, bufsz); + + ctl_len = 0; + for (cmsg = CMSG_FIRSTHDR(msg); cw && cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) { - local_sa = (struct sockaddr_in *) spec->local_sa; + if (cw & CW_SENDADDR) + { + if (AF_INET == spec->dest_sa->sa_family) + { + local_sa = (struct sockaddr_in *) spec->local_sa; #if __linux__ || __APPLE__ - memset(&info, 0, sizeof(info)); - info.ipi_spec_dst = local_sa->sin_addr; - cmsg->cmsg_level = IPPROTO_IP; - cmsg->cmsg_type = IP_PKTINFO; - cmsg->cmsg_len = CMSG_LEN(sizeof(info)); - memcpy(CMSG_DATA(cmsg), &info, sizeof(info)); + memset(&info, 0, sizeof(info)); + info.ipi_spec_dst = local_sa->sin_addr; + cmsg->cmsg_level = IPPROTO_IP; + cmsg->cmsg_type = IP_PKTINFO; + cmsg->cmsg_len = CMSG_LEN(sizeof(info)); + ctl_len += CMSG_SPACE(sizeof(info)); + memcpy(CMSG_DATA(cmsg), &info, sizeof(info)); #elif WIN32 - memset(&info, 0, sizeof(info)); - info.ipi_addr = local_sa->sin_addr; - cmsg->cmsg_level = IPPROTO_IP; - cmsg->cmsg_type = IP_PKTINFO; - cmsg->cmsg_len = CMSG_LEN(sizeof(info)); - memcpy(WSA_CMSG_DATA(cmsg), &info, sizeof(info)); + memset(&info, 0, sizeof(info)); + info.ipi_addr = local_sa->sin_addr; + cmsg->cmsg_level = IPPROTO_IP; + cmsg->cmsg_type = IP_PKTINFO; + cmsg->cmsg_len = CMSG_LEN(sizeof(info)); + ctl_len += CMSG_SPACE(sizeof(info)); + memcpy(WSA_CMSG_DATA(cmsg), &info, sizeof(info)); #else - cmsg->cmsg_level = IPPROTO_IP; - cmsg->cmsg_type = IP_SENDSRCADDR; - cmsg->cmsg_len = CMSG_LEN(sizeof(local_sa->sin_addr)); - memcpy(CMSG_DATA(cmsg), &local_sa->sin_addr, - sizeof(local_sa->sin_addr)); + cmsg->cmsg_level = IPPROTO_IP; + cmsg->cmsg_type = IP_SENDSRCADDR; + cmsg->cmsg_len = CMSG_LEN(sizeof(local_sa->sin_addr)); + ctl_len += CMSG_SPACE(sizeof(local_sa->sin_addr)); + memcpy(CMSG_DATA(cmsg), &local_sa->sin_addr, + sizeof(local_sa->sin_addr)); #endif - } - else - { - local_sa6 = (struct sockaddr_in6 *) spec->local_sa; - memset(&info6, 0, sizeof(info6)); - info6.ipi6_addr = local_sa6->sin6_addr; - cmsg->cmsg_level = IPPROTO_IPV6; - cmsg->cmsg_type = IPV6_PKTINFO; - cmsg->cmsg_len = CMSG_LEN(sizeof(info6)); + } + else + { + local_sa6 = (struct sockaddr_in6 *) spec->local_sa; + memset(&info6, 0, sizeof(info6)); + info6.ipi6_addr = local_sa6->sin6_addr; + cmsg->cmsg_level = IPPROTO_IPV6; + cmsg->cmsg_type = IPV6_PKTINFO; + cmsg->cmsg_len = CMSG_LEN(sizeof(info6)); #ifndef WIN32 - memcpy(CMSG_DATA(cmsg), &info6, sizeof(info6)); + memcpy(CMSG_DATA(cmsg), &info6, sizeof(info6)); #else - memcpy(WSA_CMSG_DATA(cmsg), &info6, sizeof(info6)); + memcpy(WSA_CMSG_DATA(cmsg), &info6, sizeof(info6)); +#endif + ctl_len += CMSG_SPACE(sizeof(info6)); + } + cw &= ~CW_SENDADDR; + } +#if ECN_SUPPORTED + else if (cw & CW_ECN) + { + if (AF_INET == spec->dest_sa->sa_family) + { + const +#if defined(__FreeBSD__) + unsigned char +#else + int +#endif + tos = spec->ecn; + cmsg->cmsg_level = IPPROTO_IP; + cmsg->cmsg_type = IP_TOS; + cmsg->cmsg_len = CMSG_LEN(sizeof(tos)); + memcpy(CMSG_DATA(cmsg), &tos, sizeof(tos)); + ctl_len += CMSG_SPACE(sizeof(tos)); + } + else + { + const int tos = spec->ecn; + cmsg->cmsg_level = IPPROTO_IPV6; + cmsg->cmsg_type = IPV6_TCLASS; + cmsg->cmsg_len = CMSG_LEN(sizeof(tos)); + memcpy(CMSG_DATA(cmsg), &tos, sizeof(tos)); + ctl_len += CMSG_SPACE(sizeof(tos)); + } + cw &= ~CW_ECN; + } #endif + else + assert(0); } #ifndef WIN32 - msg->msg_controllen = cmsg->cmsg_len; + msg->msg_controllen = ctl_len; #else - msg->Control.len = cmsg->cmsg_len; + msg->Control.len = ctl_len; #endif } +#if HAVE_SENDMMSG +static int +send_packets_using_sendmmsg (const struct lsquic_out_spec *specs, + unsigned count) +{ +#ifndef NDEBUG + { + /* This only works for a single port! If the specs contain more + * than one socket, this function does *NOT* work. We check it + * here just in case: + */ + void *ctx; + unsigned i; + for (i = 1, ctx = specs[i].peer_ctx; + i < count; + ctx = specs[i].peer_ctx, ++i) + assert(ctx == specs[i - 1].peer_ctx); + } +#endif + + const struct service_port *const sport = specs[0].peer_ctx; + const int fd = sport->fd; + enum ctl_what cw; + unsigned i; + int s, saved_errno; + struct mmsghdr mmsgs[1024]; + union { + /* cmsg(3) recommends union for proper alignment */ + unsigned char buf[ CMSG_SPACE( + MAX( +#if __linux__ + sizeof(struct in_pktinfo) +#else + sizeof(struct in_addr) +#endif + , sizeof(struct in6_pktinfo)) + ) +#if ECN_SUPPORTED + + CMSG_SPACE(sizeof(int)) +#endif + ]; + struct cmsghdr cmsg; + } ancil [ sizeof(mmsgs) / sizeof(mmsgs[0]) ]; + + for (i = 0; i < count && i < sizeof(mmsgs) / sizeof(mmsgs[0]); ++i) + { + mmsgs[i].msg_hdr.msg_name = (void *) specs[i].dest_sa; + mmsgs[i].msg_hdr.msg_namelen = (AF_INET == specs[i].dest_sa->sa_family ? + sizeof(struct sockaddr_in) : + sizeof(struct sockaddr_in6)), + mmsgs[i].msg_hdr.msg_iov = specs[i].iov; + mmsgs[i].msg_hdr.msg_iovlen = specs[i].iovlen; + mmsgs[i].msg_hdr.msg_flags = 0; + if ((sport->sp_flags & SPORT_SERVER) && specs[i].local_sa->sa_family) + cw = CW_SENDADDR; + else + cw = 0; +#if ECN_SUPPORTED + if (sport->sp_prog->prog_api.ea_settings->es_ecn && specs[i].ecn) + cw |= CW_ECN; +#endif + if (cw) + setup_control_msg(&mmsgs[i].msg_hdr, cw, &specs[i], ancil[i].buf, + sizeof(ancil[i].buf)); + else + { + mmsgs[i].msg_hdr.msg_control = NULL; + mmsgs[i].msg_hdr.msg_controllen = 0; + } + } + + s = sendmmsg(fd, mmsgs, count, 0); + if (s < (int) count) + { + saved_errno = errno; + prog_sport_cant_send(sport->sp_prog, sport->fd); + if (s < 0) + { + LSQ_WARN("sendmmsg failed: %s", strerror(saved_errno)); + errno = saved_errno; + } + } + + return s; +} +#endif + + +#if LSQUIC_PREFERRED_ADDR +static const struct service_port * +find_sport (struct prog *prog, const struct sockaddr *local_sa) +{ + const struct service_port *sport; + const struct sockaddr *addr; + size_t len; + + TAILQ_FOREACH(sport, prog->prog_sports, next_sport) + { + addr = (struct sockaddr *) &sport->sp_local_addr; + if (addr->sa_family == local_sa->sa_family) + { + len = addr->sa_family == AF_INET ? sizeof(struct sockaddr_in) + : sizeof(struct sockaddr_in6); + if (0 == memcmp(addr, local_sa, len)) + return sport; + } + } + + assert(0); + return NULL; +} +#endif + + static int send_packets_one_by_one (const struct lsquic_out_spec *specs, unsigned count) { const struct service_port *sport; + enum ctl_what cw; unsigned n; int s = 0; #ifndef WIN32 @@ -898,18 +1479,21 @@ send_packets_one_by_one (const struct lsquic_out_spec *specs, unsigned count) # define SIZE1 sizeof(struct in_addr) #endif unsigned char buf[ - CMSG_SPACE(MAX(SIZE1, sizeof(struct in6_pktinfo)))]; + CMSG_SPACE(MAX(SIZE1, sizeof(struct in6_pktinfo))) +#if ECN_SUPPORTED + + CMSG_SPACE(sizeof(int)) +#endif + ]; struct cmsghdr cmsg; } ancil; -#ifndef WIN32 - struct iovec iov; -#else - WSABUF iov; -#endif if (0 == count) return 0; + const unsigned orig_count = count; + const unsigned out_limit = packet_out_limit(); + if (out_limit && count > out_limit) + count = out_limit; #if LSQUIC_RANDOM_SEND_FAILURE { const char *freq_str = getenv("LSQUIC_RANDOM_SEND_FAILURE"); @@ -933,29 +1517,37 @@ send_packets_one_by_one (const struct lsquic_out_spec *specs, unsigned count) do { sport = specs[n].peer_ctx; +#if LSQUIC_PREFERRED_ADDR + if (sport->sp_prog->prog_flags & PROG_SEARCH_ADDRS) + sport = find_sport(sport->sp_prog, specs[n].local_sa); +#endif #ifndef WIN32 - iov.iov_base = (void *) specs[n].buf; - iov.iov_len = specs[n].sz; msg.msg_name = (void *) specs[n].dest_sa; msg.msg_namelen = (AF_INET == specs[n].dest_sa->sa_family ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6)), - msg.msg_iov = &iov; - msg.msg_iovlen = 1; + msg.msg_iov = specs[n].iov; + msg.msg_iovlen = specs[n].iovlen; msg.msg_flags = 0; #else - iov.buf = (void *) specs[n].buf; - iov.len = specs[n].sz; msg.name = (void *) specs[n].dest_sa; msg.namelen = (AF_INET == specs[n].dest_sa->sa_family ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6)), - msg.lpBuffers = &iov; - msg.dwBufferCount = 1; + msg.lpBuffers = specs[n].iov; + msg.dwBufferCount = specs[n].iovlen; msg.dwFlags = 0; #endif if ((sport->sp_flags & SPORT_SERVER) && specs[n].local_sa->sa_family) - setup_control_msg(&msg, &specs[n], ancil.buf, sizeof(ancil.buf)); + cw = CW_SENDADDR; + else + cw = 0; +#if ECN_SUPPORTED + if (sport->sp_prog->prog_api.ea_settings->es_ecn && specs[n].ecn) + cw |= CW_ECN; +#endif + if (cw) + setup_control_msg(&msg, cw, &specs[n], ancil.buf, sizeof(ancil.buf)); else { #ifndef WIN32 @@ -984,7 +1576,7 @@ send_packets_one_by_one (const struct lsquic_out_spec *specs, unsigned count) } while (n < count); - if (n < count) + if (n < orig_count) prog_sport_cant_send(sport->sp_prog, sport->fd); if (n > 0) @@ -1005,6 +1597,12 @@ int sport_packets_out (void *ctx, const struct lsquic_out_spec *specs, unsigned count) { +#if HAVE_SENDMMSG + const struct prog *prog = ctx; + if (prog->prog_use_sendmmsg) + return send_packets_using_sendmmsg(specs, count); + else +#endif return send_packets_one_by_one(specs, count); } @@ -1029,6 +1627,20 @@ set_engine_option (struct lsquic_engine_settings *settings, return 0; } break; + case 3: + if (0 == strncmp(name, "ecn", 1)) + { + settings->es_ecn = atoi(val); +#if !ECN_SUPPORTED + if (settings->es_ecn) + { + LSQ_ERROR("ECN is not supported on this platform"); + break; + } +#endif + return 0; + } + break; case 4: if (0 == strncmp(name, "cfcw", 4)) { @@ -1066,6 +1678,11 @@ set_engine_option (struct lsquic_engine_settings *settings, settings->es_rw_once = atoi(val); return 0; } + else if (0 == strncmp(name, "cc_algo", 7)) + { + settings->es_cc_algo = atoi(val); + return 0; + } break; case 8: if (0 == strncmp(name, "max_cfcw", 8)) @@ -1078,6 +1695,18 @@ set_engine_option (struct lsquic_engine_settings *settings, settings->es_max_sfcw = atoi(val); return 0; } + if (0 == strncmp(name, "scid_len", 8)) + { + settings->es_scid_len = atoi(val); + return 0; + } + break; + case 9: + if (0 == strncmp(name, "send_prst", 9)) + { + settings->es_send_prst = atoi(val); + return 0; + } break; case 10: if (0 == strncmp(name, "honor_prst", 10)) @@ -1086,6 +1715,13 @@ set_engine_option (struct lsquic_engine_settings *settings, return 0; } break; + case 11: + if (0 == strncmp(name, "ping_period", 11)) + { + settings->es_ping_period = atoi(val); + return 0; + } + break; case 12: if (0 == strncmp(name, "idle_conn_to", 12)) { @@ -1097,6 +1733,11 @@ set_engine_option (struct lsquic_engine_settings *settings, settings->es_silent_close = atoi(val); return 0; } + if (0 == strncmp(name, "support_push", 12)) + { + settings->es_support_push = atoi(val); + return 0; + } if (0 == strncmp(name, "support_nstp", 12)) { settings->es_support_nstp = atoi(val); @@ -1112,6 +1753,11 @@ set_engine_option (struct lsquic_engine_settings *settings, settings->es_handshake_to = atoi(val); return 0; } + if (0 == strncmp(name, "support_srej", 12)) + { + settings->es_support_srej = atoi(val); + return 0; + } break; case 13: if (0 == strncmp(name, "support_tcid0", 13)) @@ -1119,6 +1765,16 @@ set_engine_option (struct lsquic_engine_settings *settings, settings->es_support_tcid0 = atoi(val); return 0; } + if (0 == strncmp(name, "init_max_data", 13)) + { + settings->es_init_max_data = atoi(val); + return 0; + } + if (0 == strncmp(name, "scid_iss_rate", 13)) + { + settings->es_scid_iss_rate = atoi(val); + return 0; + } break; case 14: if (0 == strncmp(name, "max_streams_in", 14)) @@ -1132,6 +1788,18 @@ set_engine_option (struct lsquic_engine_settings *settings, return 0; } break; + case 15: + if (0 == strncmp(name, "h3_placeholders", 15)) + { + settings->es_h3_placeholders = atoi(val); + return 0; + } + if (0 == strncmp(name, "allow_migration", 15)) + { + settings->es_allow_migration = atoi(val); + return 0; + } + break; case 16: if (0 == strncmp(name, "proc_time_thresh", 16)) { @@ -1139,12 +1807,62 @@ set_engine_option (struct lsquic_engine_settings *settings, return 0; } break; + case 18: + if (0 == strncmp(name, "qpack_enc_max_size", 18)) + { + settings->es_qpack_enc_max_size = atoi(val); + return 0; + } + if (0 == strncmp(name, "qpack_dec_max_size", 18)) + { + settings->es_qpack_dec_max_size = atoi(val); + return 0; + } + break; case 20: if (0 == strncmp(name, "max_header_list_size", 20)) { settings->es_max_header_list_size = atoi(val); return 0; } + if (0 == strncmp(name, "init_max_streams_uni", 20)) + { + settings->es_init_max_streams_uni = atoi(val); + return 0; + } + break; + case 21: + if (0 == strncmp(name, "qpack_enc_max_blocked", 21)) + { + settings->es_qpack_enc_max_blocked = atoi(val); + return 0; + } + if (0 == strncmp(name, "qpack_dec_max_blocked", 21)) + { + settings->es_qpack_dec_max_blocked = atoi(val); + return 0; + } + break; + case 24: + if (0 == strncmp(name, "init_max_stream_data_uni", 24)) + { + settings->es_init_max_stream_data_uni = atoi(val); + return 0; + } + break; + case 31: + if (0 == strncmp(name, "init_max_stream_data_bidi_local", 31)) + { + settings->es_init_max_stream_data_bidi_local = atoi(val); + return 0; + } + break; + case 32: + if (0 == strncmp(name, "init_max_stream_data_bidi_remote", 32)) + { + settings->es_init_max_stream_data_bidi_remote = atoi(val); + return 0; + } break; } @@ -1152,7 +1870,7 @@ set_engine_option (struct lsquic_engine_settings *settings, } -#define MAX_PACKOUT_BUF_SZ MAX_PACKET_SZ +#define MAX_PACKOUT_BUF_SZ 1370 struct packout_buf { @@ -1189,10 +1907,12 @@ pba_allocate (void *packout_buf_allocator, void *peer_ctx, unsigned short size, return NULL; } +#if LSQUIC_USE_POOLS pb = SLIST_FIRST(&pba->free_packout_bufs); if (pb) SLIST_REMOVE_HEAD(&pba->free_packout_bufs, next_free_pb); else +#endif pb = malloc(MAX_PACKOUT_BUF_SZ); if (pb) @@ -1201,26 +1921,31 @@ pba_allocate (void *packout_buf_allocator, void *peer_ctx, unsigned short size, return pb; } - void pba_release (void *packout_buf_allocator, void *peer_ctx, void *obj, char ipv6) { struct packout_buf_allocator *const pba = packout_buf_allocator; +#if LSQUIC_USE_POOLS struct packout_buf *const pb = obj; SLIST_INSERT_HEAD(&pba->free_packout_bufs, pb, next_free_pb); +#else + free(obj); +#endif --pba->n_out; } - void pba_cleanup (struct packout_buf_allocator *pba) { +#if LSQUIC_USE_POOLS unsigned n = 0; struct packout_buf *pb; +#endif if (pba->n_out) LSQ_WARN("%u packout bufs outstanding at deinit", pba->n_out); +#if LSQUIC_USE_POOLS while ((pb = SLIST_FIRST(&pba->free_packout_bufs))) { SLIST_REMOVE_HEAD(&pba->free_packout_bufs, next_free_pb); @@ -1229,9 +1954,25 @@ pba_cleanup (struct packout_buf_allocator *pba) } LSQ_INFO("pba deinitialized, freed %u packout bufs", n); +#endif } +void +print_conn_info (const lsquic_conn_t *conn) +{ + const char *cipher; + + cipher = lsquic_conn_crypto_cipher(conn); + + LSQ_INFO("Connection info: version: %u; cipher: %s; key size: %d, alg key size: %d", + lsquic_conn_quic_version(conn), + cipher ? cipher : "", + lsquic_conn_crypto_keysize(conn), + lsquic_conn_crypto_alg_keysize(conn) + ); +} + struct reader_ctx { size_t file_size; @@ -1313,3 +2054,49 @@ destroy_lsquic_reader_ctx (struct reader_ctx *ctx) (void) close(ctx->fd); free(ctx); } + + +int +sport_set_token (struct service_port *sport, const char *token_str) +{ + static const unsigned char c2b[0x100] = + { + [(int)'0'] = 0, + [(int)'1'] = 1, + [(int)'2'] = 2, + [(int)'3'] = 3, + [(int)'4'] = 4, + [(int)'5'] = 5, + [(int)'6'] = 6, + [(int)'7'] = 7, + [(int)'8'] = 8, + [(int)'9'] = 9, + [(int)'A'] = 0xA, + [(int)'B'] = 0xB, + [(int)'C'] = 0xC, + [(int)'D'] = 0xD, + [(int)'E'] = 0xE, + [(int)'F'] = 0xF, + [(int)'a'] = 0xA, + [(int)'b'] = 0xB, + [(int)'c'] = 0xC, + [(int)'d'] = 0xD, + [(int)'e'] = 0xE, + [(int)'f'] = 0xF, + }; + unsigned char *token; + int len, i; + + len = strlen(token_str); + token = malloc(len / 2); + if (!token) + return -1; + for (i = 0; i < len / 2; ++i) + token[i] = (c2b[ (int) token_str[i * 2] ] << 4) + | c2b[ (int) token_str[i * 2 + 1] ]; + + free(sport->sp_token_buf); + sport->sp_token_buf = token; + sport->sp_token_sz = len / 2; + return 0; +} diff --git a/test/test_common.h b/test/test_common.h index c6c9219d2..6ae93e09b 100644 --- a/test/test_common.h +++ b/test/test_common.h @@ -7,7 +7,7 @@ #define TEST_COMMON_H 1 #if __linux__ -# include /* For IFNAMSIZ */ +# include /* For IFNAMSIZ */ #endif struct lsquic_engine; @@ -54,6 +54,8 @@ struct service_port { int sp_sndbuf; /* If SPORT_SET_SNDBUF is set */ int sp_rcvbuf; /* If SPORT_SET_RCVBUF is set */ struct prog *sp_prog; + unsigned char *sp_token_buf; + size_t sp_token_sz; }; TAILQ_HEAD(sport_head, service_port); @@ -64,6 +66,10 @@ sport_new (const char *optarg, struct prog *); void sport_destroy (struct service_port *); +int +sport_init_server (struct service_port *, struct lsquic_engine *, + struct event_base *); + int sport_init_client (struct service_port *, struct lsquic_engine *, struct event_base *); @@ -71,6 +77,9 @@ sport_init_client (struct service_port *, struct lsquic_engine *, int sport_packets_out (void *ctx, const struct lsquic_out_spec *, unsigned count); +int +sport_set_token (struct service_port *, const char *); + int set_engine_option (struct lsquic_engine_settings *, int *version_cleared, const char *name_value); @@ -96,6 +105,9 @@ pba_release (void *packout_buf_allocator, void *, void *obj, char); void pba_cleanup (struct packout_buf_allocator *); +void +print_conn_info (const struct lsquic_conn *conn); + size_t test_reader_size (void *void_ctx); diff --git a/test/test_config.h.in b/test/test_config.h.in index 0d2868aa4..22d742168 100644 --- a/test/test_config.h.in +++ b/test/test_config.h.in @@ -1,10 +1,22 @@ #ifndef LSQUIC_CONFIG_H #define LSQUIC_CONFIG_H +#cmakedefine HAVE_SENDMMSG 1 +#cmakedefine HAVE_RECVMMSG 1 +#cmakedefine HAVE_OPEN_MEMSTREAM 1 #cmakedefine HAVE_IP_DONTFRAG 1 #cmakedefine HAVE_IP_MTU_DISCOVER 1 #cmakedefine HAVE_REGEX 1 #define LSQUIC_DONTFRAG_SUPPORTED (HAVE_IP_DONTFRAG || HAVE_IP_MTU_DISCOVER) +/* TODO: presumably it's the same on FreeBSD, test it. + * See https://github.com/quicwg/base-drafts/wiki/ECN-in-QUIC + */ +#if __linux__ || defined(__FreeBSD__) +#define ECN_SUPPORTED 1 +#else +#define ECN_SUPPORTED 0 +#endif + #endif diff --git a/test/unittests/CMakeLists.txt b/test/unittests/CMakeLists.txt index d80d79466..c9c46190e 100644 --- a/test/unittests/CMakeLists.txt +++ b/test/unittests/CMakeLists.txt @@ -3,27 +3,36 @@ INCLUDE_DIRECTORIES(../../src/liblsquic) ENABLE_TESTING() +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DLSQUIC_TEST=1") + IF (MSVC) SET(ADDL_SOURCES ../../wincompat/getopt.c ../../wincompat/getopt1.c) SET(LIB_FLAGS "-FORCE:MULTIPLE") ELSE() SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-value") + IF (CMAKE_C_COMPILER_ID STREQUAL GNU) + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-override-init") + ENDIF() + IF (CMAKE_C_COMPILER_ID STREQUAL Clang) + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-initializer-overrides") + ENDIF() ENDIF() +include_directories(../../src/liblsquic/ls-qpack) + SET(TESTS + ack ackgen_gquic_be - ackgen_gquic_le ackparse_gquic_be - ackparse_gquic_le alarmset + alt_svc_ver arr attq blocked_gquic_be - blocked_gquic_le buf + bw_sampler conn_close_gquic_be - conn_close_gquic_le - conn_hash + crypto_gen cubic dec di_nocopy @@ -34,32 +43,36 @@ SET(TESTS frame_reader frame_writer goaway_gquic_be - goaway_gquic_le + h3_framing + h3_prio + hcsi_reader hkdf lsquic_hash - malo packet_out packno_len + parse parse_packet_in + parse_prio + purga + qlog quic_be_floats - quic_le_floats rechist reg_pkt_headergen rst_stream_gquic_be - rst_stream_gquic_le rtt + send_headers senhist set sfcw - some_packets + shi spi stop_waiting_gquic_be - stop_waiting_gquic_le streamgen streamparse + trapa + varint ver_nego wuf_gquic_be - wuf_gquic_le ) IF (CMAKE_SYSTEM_NAME STREQUAL "Linux") @@ -67,11 +80,6 @@ IF (CMAKE_SYSTEM_NAME STREQUAL "Linux") SET(TESTS ${TESTS} frame_rw) ENDIF() -IF (NOT CMAKE_SYSTEM_NAME STREQUAL "Windows") - # Linux has fmemopen - SET(TESTS ${TESTS} qlog) -ENDIF() - FOREACH(TEST_NAME ${TESTS}) ADD_EXECUTABLE(test_${TEST_NAME} test_${TEST_NAME}.c ${ADDL_SOURCES}) @@ -89,3 +97,18 @@ ADD_TEST(stream_hash_A test_stream -A -h) ADD_EXECUTABLE(graph_cubic graph_cubic.c ${ADDL_SOURCES}) TARGET_LINK_LIBRARIES(graph_cubic ${LIBS}) +ADD_EXECUTABLE(mini_parse mini_parse.c ${ADDL_SOURCES}) +TARGET_LINK_LIBRARIES(mini_parse ${LIBS}) + +ADD_EXECUTABLE(test_malo_pooled test_malo.c ../../src/liblsquic/lsquic_malo.c) +SET_TARGET_PROPERTIES(test_malo_pooled + PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -DLSQUIC_USE_POOLS=1") +ADD_TEST(malo_pooled test_malo_pooled) + +ADD_EXECUTABLE(test_malo_nopool test_malo.c ../../src/liblsquic/lsquic_malo.c) +SET_TARGET_PROPERTIES(test_malo_nopool + PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -DLSQUIC_USE_POOLS=0") +ADD_TEST(malo_nopool test_malo_nopool) + +ADD_EXECUTABLE(test_minmax test_minmax.c ../../src/liblsquic/lsquic_minmax.c) +ADD_TEST(minmax test_minmax) diff --git a/test/unittests/graph_cubic.c b/test/unittests/graph_cubic.c index 22da9d5bc..a20a653b8 100644 --- a/test/unittests/graph_cubic.c +++ b/test/unittests/graph_cubic.c @@ -17,8 +17,12 @@ #include "lsquic_types.h" #include "lsquic_int_types.h" +#include "lsquic_cong_ctl.h" +#include "lsquic_packet_common.h" +#include "lsquic_packet_out.h" #include "lsquic_cubic.h" +static const struct cong_ctl_if *const cci = &lsquic_cong_cubic_if; #define MS(n) ((n) * 1000) /* MS: Milliseconds */ @@ -47,7 +51,7 @@ struct rec sizeof(recs[0])); \ } \ recs[i].event = ev; \ - recs[i].cwnd = lsquic_cubic_get_cwnd(&cubic); \ + recs[i].cwnd = cci->cci_get_cwnd(&cubic); \ if (max_cwnd < recs[i].cwnd) \ max_cwnd = recs[i].cwnd; \ } while (0) @@ -68,10 +72,12 @@ main (int argc, char **argv) struct winsize winsize; #endif enum cubic_flags flags; + struct lsquic_packet_out packet_out; - lsquic_cubic_init(&cubic, 0); + cci->cci_init(&cubic, 0, 0); max_cwnd = 0; i = 0; + memset(&packet_out, 0, sizeof(packet_out)); while (-1 != (opt = getopt(argc, argv, "s:u:r:f:l:A:L:T:"))) { @@ -85,7 +91,7 @@ main (int argc, char **argv) break; case 'f': flags = atoi(optarg); - lsquic_cubic_init_ext(&cubic, 0, flags); + lsquic_cubic_set_flags(&cubic, flags); break; case 'l': app_limited = atoi(optarg); @@ -94,7 +100,8 @@ main (int argc, char **argv) n = i + atoi(optarg); for ( ; i < n; ++i) { - lsquic_cubic_ack(&cubic, MS(unit * i), MS(rtt_ms), app_limited, 1370); + packet_out.po_sent = MS(unit * i) - MS(rtt_ms); + cci->cci_ack(&cubic, &packet_out, 1370, MS(unit * i), app_limited); REC(EV_ACK); } break; @@ -102,7 +109,7 @@ main (int argc, char **argv) n = i + atoi(optarg); for ( ; i < n; ++i) { - lsquic_cubic_loss(&cubic); + cci->cci_loss(&cubic); REC(EV_LOSS); } break; @@ -110,7 +117,7 @@ main (int argc, char **argv) n = i + atoi(optarg); for ( ; i < n; ++i) { - lsquic_cubic_timeout(&cubic); + cci->cci_timeout(&cubic); REC(EV_TIMEOUT); } break; diff --git a/test/unittests/mini_parse.c b/test/unittests/mini_parse.c new file mode 100644 index 000000000..0a09f90d2 --- /dev/null +++ b/test/unittests/mini_parse.c @@ -0,0 +1,111 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * Convert from our hexdump format to binary: + * + * perl -p -ne 's/^[[:xdigit:]]+\s+//;s~ \|.*~~;s/\s+//g;s/([[:xdigit:]]{2})/chr hex$1/ge' + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "lsquic.h" +#include "lsquic_types.h" +#include "lsquic_int_types.h" +#include "lsquic_packet_common.h" +#include "lsquic_packet_gquic.h" +#include "lsquic_packet_in.h" +#include "lsquic_packet_out.h" +#include "lsquic_mm.h" +#include "lsquic_hash.h" +#include "lsquic_conn.h" +#include "lsquic_rtt.h" +#include "lsquic_mini_conn.h" +#include "lsquic_engine_public.h" +#include "lsquic_util.h" +#include "lsquic_logger.h" +#include "lsquic_str.h" + + +int +lsquic_enc_session_decrypt (void *enc_session_p, enum lsquic_version version, + uint8_t path_id, uint64_t pack_num, + unsigned char *buf, size_t *header_len, size_t data_len, + unsigned char *diversification_nonce, + unsigned char *buf_out, size_t max_out_len, size_t *out_len) +{ + memcpy(buf_out, buf, *header_len + data_len); + *out_len = data_len; + return 0; +} + + +int +main (int argc, char **argv) +{ + int opt; + int fd = STDIN_FILENO; + struct lsquic_engine_public enpub; + struct lsquic_conn *lconn; + lsquic_packet_in_t packet_in; + unsigned char buf[0x1000]; + ssize_t packet_sz; + enum lsquic_version ver = LSQVER_039; + + memset(&enpub, 0, sizeof(enpub)); + lsquic_mm_init(&enpub.enp_mm); + + lsquic_log_to_fstream(stderr, 0); + lsq_log_levels[LSQLM_MINI_CONN] = LSQ_LOG_DEBUG; + lsq_log_levels[LSQLM_NOMODULE] = LSQ_LOG_DEBUG; + + while (-1 != (opt = getopt(argc, argv, "v:f:h"))) + { + switch (opt) + { + case 'v': + ver = atoi(optarg); + break; + case 'f': + fd = open(optarg, O_RDONLY); + if (fd < 0) + { + perror("open"); + exit(EXIT_FAILURE); + } + break; + case 'h': + fprintf(stderr, "usage: %s [-v version] [-f input-file]\n", argv[0]); + exit(EXIT_SUCCESS); + default: + exit(EXIT_FAILURE); + } + } + + packet_sz = read(fd, buf, sizeof(buf)); + if (packet_sz < 0) + { + perror("read"); + exit(EXIT_FAILURE); + } + + memset(&packet_in, 0, sizeof(packet_in)); + packet_in.pi_packno = 1; + packet_in.pi_header_sz = 0; + packet_in.pi_data_sz = packet_sz; + packet_in.pi_data = buf; + packet_in.pi_refcnt = 1; + + lconn = mini_conn_new(&enpub, &packet_in, ver); + lconn->cn_if->ci_packet_in(lconn, &packet_in); + + exit(EXIT_SUCCESS); +} diff --git a/test/unittests/test_ack.c b/test/unittests/test_ack.c new file mode 100644 index 000000000..52b293e13 --- /dev/null +++ b/test/unittests/test_ack.c @@ -0,0 +1,220 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* Test both generation and parsing of IETF ACK frames */ + +#include +#include + +#include "lsquic.h" +#include "lsquic_types.h" +#include "lsquic_int_types.h" +#include "lsquic_sizes.h" +#include "lsquic_parse.h" +#include "lsquic_trans_params.h" + +struct test +{ + int lineno; + int skip_gen; + + struct ack_info acki; + + size_t encoded_sz; + unsigned char encoded[0x1000]; +}; + +static const lsquic_time_t now = 0x12345676890; + +static const struct test tests[] = +{ + { + .lineno = __LINE__, + .acki = + { + .n_ranges = 2, + .lack_delta = 0xFEDCB0, + .ranges = + { + [0] = { 7, 7, }, + [1] = { 0, 0, }, + }, + }, + .encoded = + { + /* Type */ 0x02, + /* Largest acked */ 0x07, + /* ACK delay */ 0x80, 0x1F, 0xDB, 0x96, + /* Addl block count */ 0x01, + /* First ACK block */ 0x00, + /* Gap */ 0x05, + /* ACK block */ 0x00, + }, + .encoded_sz = 10, + }, + + { + .lineno = __LINE__, + .acki = + { + .n_ranges = 3, + .lack_delta = 0xFEDCB0, + .ranges = + { + [0] = { 10, 10, }, + [1] = { 7, 7, }, + [2] = { 0, 0, }, + }, + }, + .encoded = + { + /* Type */ 0x02, + /* Largest acked */ 10, + /* ACK delay */ 0x80, 0x1F, 0xDB, 0x96, + /* Addl block count */ 2, + /* First ACK block */ 0x00, + /* Gap */ 0x01, + /* ACK block */ 0x00, + /* Gap */ 0x05, + /* ACK block */ 0x00, + }, + .encoded_sz = 12, + }, + + { + .lineno = __LINE__, + .acki = + { + .flags = AI_ECN, + .n_ranges = 3, + .lack_delta = 0xFEDCB0, + .ecn_counts = { 0, 0x010203, 1, 0x49, }, + .ranges = + { + [0] = { 10, 10, }, + [1] = { 7, 7, }, + [2] = { 0, 0, }, + }, + }, + .encoded = + { + /* Type */ 0x03, + /* Largest acked */ 10, + /* ACK delay */ 0x80, 0x1F, 0xDB, 0x96, + /* Addl block count */ 2, + /* First ACK block */ 0x00, + /* Gap */ 0x01, + /* ACK block */ 0x00, + /* Gap */ 0x05, + /* ACK block */ 0x00, + /* ECT(1) count */ 0x01, + /* ECT(0) count */ 0x80, 0x01, 0x02, 0x03, + /* ECN-CE count */ 0x40, 0x49, + }, + .encoded_sz = 19, + }, + +}; + +struct rechist +{ + const struct ack_info *acki; + unsigned next_range; +}; + + +static const struct lsquic_packno_range * +rechist_next (void *ctx) +{ + struct rechist *rechist = ctx; + if (rechist->next_range < rechist->acki->n_ranges) + return rechist->acki->ranges + rechist->next_range++; + else + return NULL; +} + +static const struct lsquic_packno_range * +rechist_first (void *ctx) +{ + struct rechist *rechist = ctx; + rechist->next_range = 0; + return rechist_next(rechist); +} + +static lsquic_time_t +rechist_largest_recv (void *ctx) +{ + struct rechist *rechist = ctx; + return now - rechist->acki->lack_delta; +} + + +static void +compare_ackis (const struct ack_info *exp, const struct ack_info *got) +{ + unsigned i; + + assert(exp->flags == got->flags); + assert(exp->n_ranges == got->n_ranges); + assert(exp->lack_delta == got->lack_delta); + assert(exp->n_timestamps == got->n_timestamps); + + for (i = 0; i < exp->n_ranges; ++i) + { + assert(exp->ranges[i].high == got->ranges[i].high); + assert(exp->ranges[i].low == got->ranges[i].low); + } + + if (exp->flags & AI_ECN) + for (i = 1; i <= 3; ++i) + assert(exp->ecn_counts[i] == got->ecn_counts[i]); +} + + +static void +run_test (const struct test *test) +{ + int len, has_missing; + lsquic_packno_t largest_received; + const struct parse_funcs *pf; + struct rechist rechist; + struct ack_info acki; + size_t sz; + unsigned char buf[0x1000]; + + pf = select_pf_by_ver(LSQVER_ID22); + if (!test->skip_gen) + { + rechist.acki = &test->acki; + len = pf->pf_gen_ack_frame(buf, sizeof(buf), rechist_first, rechist_next, + rechist_largest_recv, &rechist, now, &has_missing, &largest_received, + test->acki.flags & AI_ECN ? rechist.acki->ecn_counts : NULL); + assert(len > 0); + assert(largest_received == largest_acked(&test->acki)); + assert((size_t) len == test->encoded_sz); + assert(0 == memcmp(test->encoded, buf, test->encoded_sz)); + } + + /* Test that shorter buffers cannot get parsed */ + for (sz = 1; sz < test->encoded_sz; ++sz) + { + len = pf->pf_parse_ack_frame(test->encoded, sz, &acki, + TP_DEF_ACK_DELAY_EXP); + assert(len < 0); + } + + len = pf->pf_parse_ack_frame(test->encoded, sizeof(test->encoded), &acki, + TP_DEF_ACK_DELAY_EXP); + assert(len > 0); + assert((size_t) len == test->encoded_sz); + compare_ackis(&test->acki, &acki); +} + +int +main (void) +{ + const struct test *test; + + for (test = tests; test < tests + sizeof(tests) / sizeof(tests[0]); ++test) + run_test(test); + + return 0; +} diff --git a/test/unittests/test_ackgen_gquic_be.c b/test/unittests/test_ackgen_gquic_be.c index 94cf49852..5bd24df3b 100644 --- a/test/unittests/test_ackgen_gquic_be.c +++ b/test/unittests/test_ackgen_gquic_be.c @@ -26,7 +26,7 @@ test1 (void) /* Inverse of quic_framer_test.cc -- NewAckFrameOneAckBlock */ lsquic_time_t now = lsquic_time_now(); lsquic_packno_t largest = 0; - lsquic_rechist_init(&rechist, 0); + lsquic_rechist_init(&rechist, 0, 0); unsigned i; for (i = 1; i <= 0x1234; ++i) @@ -46,7 +46,7 @@ test1 (void) /* Inverse of quic_framer_test.cc -- NewAckFrameOneAckBlock */ (gaf_rechist_first_f) lsquic_rechist_first, (gaf_rechist_next_f) lsquic_rechist_next, (gaf_rechist_largest_recv_f) lsquic_rechist_largest_recv, - &rechist, now + 0x7FF8000, &has_missing, &largest); + &rechist, now + 0x7FF8000, &has_missing, &largest, NULL); assert(("ACK frame generation successful", w > 0)); assert(("ACK frame length is correct", w == sizeof(expected_ack_frame))); assert(("ACK frame contents are as expected", @@ -65,7 +65,7 @@ test2 (void) /* Inverse of quic_framer_test.cc -- NewAckFrameOneAckBlock, minus lsquic_rechist_t rechist; lsquic_time_t now = lsquic_time_now(); - lsquic_rechist_init(&rechist, 0); + lsquic_rechist_init(&rechist, 0, 0); /* Encode the following ranges: * high low @@ -107,7 +107,7 @@ test2 (void) /* Inverse of quic_framer_test.cc -- NewAckFrameOneAckBlock, minus (gaf_rechist_first_f) lsquic_rechist_first, (gaf_rechist_next_f) lsquic_rechist_next, (gaf_rechist_largest_recv_f) lsquic_rechist_largest_recv, - &rechist, now, &has_missing, &largest); + &rechist, now, &has_missing, &largest, NULL); assert(("ACK frame generation successful", w > 0)); assert(("ACK frame length is correct", w == sizeof(expected_ack_frame))); assert(("ACK frame contents are as expected", @@ -124,7 +124,7 @@ test3 (void) lsquic_rechist_t rechist; lsquic_time_t now = lsquic_time_now(); - lsquic_rechist_init(&rechist, 0); + lsquic_rechist_init(&rechist, 0, 0); /* Encode the following ranges: * high low @@ -152,7 +152,7 @@ test3 (void) (gaf_rechist_first_f) lsquic_rechist_first, (gaf_rechist_next_f) lsquic_rechist_next, (gaf_rechist_largest_recv_f) lsquic_rechist_largest_recv, - &rechist, now, &has_missing, &largest); + &rechist, now, &has_missing, &largest, NULL); assert(("ACK frame generation successful", w > 0)); assert(("ACK frame length is correct", w == sizeof(expected_ack_frame))); assert(("ACK frame contents are as expected", @@ -170,7 +170,7 @@ test4 (void) lsquic_rechist_t rechist; int i; - lsquic_rechist_init(&rechist, 0); + lsquic_rechist_init(&rechist, 0, 0); lsquic_time_t now = lsquic_time_now(); lsquic_rechist_received(&rechist, 1, now); @@ -190,7 +190,7 @@ test4 (void) (gaf_rechist_first_f) lsquic_rechist_first, (gaf_rechist_next_f) lsquic_rechist_next, (gaf_rechist_largest_recv_f) lsquic_rechist_largest_recv, - &rechist, now, &has_missing, &largest); + &rechist, now, &has_missing, &largest, NULL); assert(("ACK frame generation successful", w > 0)); assert(("ACK frame length is correct", w == sizeof(expected_ack_frame))); assert(("ACK frame contents are as expected", @@ -220,7 +220,7 @@ test4 (void) (gaf_rechist_first_f) lsquic_rechist_first, (gaf_rechist_next_f) lsquic_rechist_next, (gaf_rechist_largest_recv_f) lsquic_rechist_largest_recv, - &rechist, now, &has_missing, &largest); + &rechist, now, &has_missing, &largest, NULL); assert(("ACK frame generation successful", w > 0)); assert(("ACK frame length is correct", w == sizeof(expected_ack_frame))); assert(("ACK frame contents are as expected", @@ -241,7 +241,7 @@ test_4byte_packnos (void) struct packet_interval *pint; lsquic_time_t now = lsquic_time_now(); - lsquic_rechist_init(&rechist, 0); + lsquic_rechist_init(&rechist, 0, 0); packno = 0x23456789; (void) lsquic_rechist_received(&rechist, packno - 33, now); @@ -272,7 +272,7 @@ test_4byte_packnos (void) (gaf_rechist_first_f) lsquic_rechist_first, (gaf_rechist_next_f) lsquic_rechist_next, (gaf_rechist_largest_recv_f) lsquic_rechist_largest_recv, - &rechist, now, &has_missing, &largest); + &rechist, now, &has_missing, &largest, NULL); assert(("ACK frame generation successful", w > 0)); assert(("ACK frame length is correct", w == sizeof(expected_ack_frame))); assert(("ACK frame contents are as expected", @@ -292,7 +292,7 @@ test_6byte_packnos (void) struct packet_interval *pint; lsquic_time_t now = lsquic_time_now(); - lsquic_rechist_init(&rechist, 0); + lsquic_rechist_init(&rechist, 0, 0); packno = 0xABCD23456789; (void) lsquic_rechist_received(&rechist, packno - 33, now); @@ -323,7 +323,7 @@ test_6byte_packnos (void) (gaf_rechist_first_f) lsquic_rechist_first, (gaf_rechist_next_f) lsquic_rechist_next, (gaf_rechist_largest_recv_f) lsquic_rechist_largest_recv, - &rechist, now, &has_missing, &largest); + &rechist, now, &has_missing, &largest, NULL); assert(("ACK frame generation successful", w > 0)); assert(("ACK frame length is correct", w == sizeof(expected_ack_frame))); assert(("ACK frame contents are as expected", diff --git a/test/unittests/test_ackparse_gquic_be.c b/test/unittests/test_ackparse_gquic_be.c index 3efd411a8..235323e1b 100644 --- a/test/unittests/test_ackparse_gquic_be.c +++ b/test/unittests/test_ackparse_gquic_be.c @@ -12,12 +12,16 @@ #include "lsquic_rechist.h" #include "lsquic_util.h" #include "lsquic.h" +#include "lsquic_hash.h" +#include "lsquic_conn.h" + +static struct lsquic_conn lconn = LSCONN_INITIALIZER_CIDLEN(lconn, 0); static const struct parse_funcs *const pf = select_pf_by_ver(LSQVER_039); static lsquic_packno_t -n_acked (const ack_info_t *acki) +n_acked (const struct ack_info *acki) { lsquic_packno_t n = 0; unsigned i; @@ -39,10 +43,10 @@ test1 (void) 0x00, /* Number of timestamps */ }; - ack_info_t acki; + struct ack_info acki; memset(&acki, 0xF1, sizeof(acki)); - int len = pf->pf_parse_ack_frame(ack_buf, sizeof(ack_buf), &acki); + int len = pf->pf_parse_ack_frame(ack_buf, sizeof(ack_buf), &acki, 0); assert(("Parsed length is correct (8)", len == sizeof(ack_buf))); assert(("Number of ranges is 1", acki.n_ranges == 1)); assert(("Largest acked is 0x1234", acki.ranges[0].high == 0x1234)); @@ -55,7 +59,7 @@ test1 (void) size_t sz; for (sz = 1; sz < sizeof(ack_buf); ++sz) { - len = pf->pf_parse_ack_frame(ack_buf, sz, &acki); + len = pf->pf_parse_ack_frame(ack_buf, sz, &acki, 0); assert(("Parsing truncated frame failed", len < 0)); } } @@ -101,10 +105,10 @@ test2 (void) { 0x4, 0x1 }, }; - ack_info_t acki; + struct ack_info acki; memset(&acki, 0xF1, sizeof(acki)); - int len = pf->pf_parse_ack_frame(ack_buf, sizeof(ack_buf), &acki); + int len = pf->pf_parse_ack_frame(ack_buf, sizeof(ack_buf), &acki, 0); assert(("Parsed length is correct (29)", len == sizeof(ack_buf))); assert(("Number of ranges is 4", acki.n_ranges == 4)); assert(("Largest acked is 0x1234", acki.ranges[0].high == 0x1234)); @@ -120,7 +124,7 @@ test2 (void) size_t sz; for (sz = 1; sz < sizeof(ack_buf); ++sz) { - len = pf->pf_parse_ack_frame(ack_buf, sz, &acki); + len = pf->pf_parse_ack_frame(ack_buf, sz, &acki, 0); assert(("Parsing truncated frame failed", len < 0)); } } @@ -152,10 +156,10 @@ test3 (void) { 3, 1, }, }; - ack_info_t acki; + struct ack_info acki; memset(&acki, 0xF1, sizeof(acki)); - int len = pf->pf_parse_ack_frame(ack_buf, sizeof(ack_buf), &acki); + int len = pf->pf_parse_ack_frame(ack_buf, sizeof(ack_buf), &acki, 0); assert(("Parsed length is correct (9)", len == sizeof(ack_buf))); assert(("Number of ranges is 2", acki.n_ranges == 2)); assert(("Largest acked is 6", acki.ranges[0].high == 6)); @@ -171,7 +175,7 @@ test3 (void) size_t sz; for (sz = 1; sz < sizeof(ack_buf); ++sz) { - len = pf->pf_parse_ack_frame(ack_buf, sz, &acki); + len = pf->pf_parse_ack_frame(ack_buf, sz, &acki, 0); assert(("Parsing truncated frame failed", len < 0)); } } @@ -202,10 +206,10 @@ test4 (void) { 1, 1, }, }; - ack_info_t acki; + struct ack_info acki; memset(&acki, 0xF1, sizeof(acki)); - int len = pf->pf_parse_ack_frame(ack_buf, sizeof(ack_buf), &acki); + int len = pf->pf_parse_ack_frame(ack_buf, sizeof(ack_buf), &acki, 0); assert(("Parsed length is correct (9)", len == sizeof(ack_buf))); assert(("Number of ranges is 2", acki.n_ranges == 2)); assert(("Largest acked is 3", acki.ranges[0].high == 3)); @@ -221,7 +225,7 @@ test4 (void) size_t sz; for (sz = 1; sz < sizeof(ack_buf); ++sz) { - len = pf->pf_parse_ack_frame(ack_buf, sz, &acki); + len = pf->pf_parse_ack_frame(ack_buf, sz, &acki, 0); assert(("Parsing truncated frame failed", len < 0)); } } @@ -256,10 +260,10 @@ test5 (void) { 0x23456768, 1, }, }; - ack_info_t acki; + struct ack_info acki; memset(&acki, 0xF1, sizeof(acki)); - int len = pf->pf_parse_ack_frame(ack_buf, sizeof(ack_buf), &acki); + int len = pf->pf_parse_ack_frame(ack_buf, sizeof(ack_buf), &acki, 0); assert(("Parsed length is correct (9)", len == sizeof(ack_buf))); assert(("Number of ranges is 2", acki.n_ranges == 2)); assert(("Largest acked is 0x23456789", acki.ranges[0].high == 0x23456789)); @@ -275,7 +279,7 @@ test5 (void) size_t sz; for (sz = 1; sz < sizeof(ack_buf); ++sz) { - len = pf->pf_parse_ack_frame(ack_buf, sz, &acki); + len = pf->pf_parse_ack_frame(ack_buf, sz, &acki, 0); assert(("Parsing truncated frame failed", len < 0)); } } @@ -305,10 +309,10 @@ test6 (void) { 0xABCD23456768, 1, }, }; - ack_info_t acki; + struct ack_info acki; memset(&acki, 0xF1, sizeof(acki)); - int len = pf->pf_parse_ack_frame(ack_buf, sizeof(ack_buf), &acki); + int len = pf->pf_parse_ack_frame(ack_buf, sizeof(ack_buf), &acki, 0); assert(("Parsed length is correct", len == sizeof(ack_buf))); assert(("Number of ranges is 2", acki.n_ranges == 2)); assert(("Largest acked is 0xABCD23456789", acki.ranges[0].high == 0xABCD23456789)); @@ -324,7 +328,7 @@ test6 (void) size_t sz; for (sz = 1; sz < sizeof(ack_buf); ++sz) { - len = pf->pf_parse_ack_frame(ack_buf, sz, &acki); + len = pf->pf_parse_ack_frame(ack_buf, sz, &acki, 0); assert(("Parsing truncated frame failed", len < 0)); } } @@ -342,7 +346,7 @@ test_max_ack (void) unsigned char buf[1500]; struct ack_info acki; - lsquic_rechist_init(&rechist, 12345); + lsquic_rechist_init(&rechist, &lconn, 0); now = lsquic_time_now(); for (i = 1; i <= 300; ++i) @@ -358,7 +362,7 @@ test_max_ack (void) (gaf_rechist_first_f) lsquic_rechist_first, (gaf_rechist_next_f) lsquic_rechist_next, (gaf_rechist_largest_recv_f) lsquic_rechist_largest_recv, - &rechist, now, &has_missing, &largest); + &rechist, now, &has_missing, &largest, NULL); assert(sz[0] > 0); assert(sz[0] <= (int) sizeof(buf)); assert(has_missing); @@ -366,7 +370,7 @@ test_max_ack (void) assert(0 == buf[ sz[0] - 1 ]); /* Number of timestamps */ assert(0xAA == buf[ sz[0] ]); - sz[1] = pf->pf_parse_ack_frame(buf, sizeof(buf), &acki); + sz[1] = pf->pf_parse_ack_frame(buf, sizeof(buf), &acki, 0); assert(sz[1] == sz[0]); assert(256 == acki.n_ranges); @@ -395,7 +399,7 @@ test_ack_truncation (void) struct ack_info acki; size_t bufsz; - lsquic_rechist_init(&rechist, 12345); + lsquic_rechist_init(&rechist, &lconn, 0); now = lsquic_time_now(); for (i = 1; i <= 300; ++i) @@ -412,7 +416,7 @@ test_ack_truncation (void) (gaf_rechist_first_f) lsquic_rechist_first, (gaf_rechist_next_f) lsquic_rechist_next, (gaf_rechist_largest_recv_f) lsquic_rechist_largest_recv, - &rechist, now, &has_missing, &largest); + &rechist, now, &has_missing, &largest, NULL); assert(sz[0] > 0); assert(sz[0] <= (int) bufsz); assert(has_missing); @@ -420,7 +424,7 @@ test_ack_truncation (void) assert(0 == buf[ sz[0] - 1 ]); /* Number of timestamps */ assert(0xAA == buf[ sz[0] ]); - sz[1] = pf->pf_parse_ack_frame(buf, sizeof(buf), &acki); + sz[1] = pf->pf_parse_ack_frame(buf, sizeof(buf), &acki, 0); assert(sz[1] == sz[0]); assert(acki.n_ranges < 256); @@ -437,6 +441,20 @@ test_ack_truncation (void) } +static void +test_empty_ack (void) +{ + int len; + unsigned char buf[] = { 0x40, 0x00, 0xFF, 0xFF, 0x00, 0x00, + /* fluff: */ 0x12, 0x23, 0x34, 0x45, }; + struct ack_info acki; + + len = pf->pf_parse_ack_frame(buf, sizeof(buf), &acki, 0); + assert(6 == len); + assert(empty_ack_frame(&acki)); +} + + int main (void) { @@ -449,5 +467,6 @@ main (void) test6(); test_max_ack(); test_ack_truncation(); + test_empty_ack(); return 0; } diff --git a/test/unittests/test_ackparse_gquic_ietf.c b/test/unittests/test_ackparse_gquic_ietf.c new file mode 100644 index 000000000..4b832350c --- /dev/null +++ b/test/unittests/test_ackparse_gquic_ietf.c @@ -0,0 +1,455 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#include +#include +#include +#include +#ifndef WIN32 +#include +#endif + +#include "lsquic_types.h" +#include "lsquic_parse.h" +#include "lsquic_rechist.h" +#include "lsquic_util.h" +#include "lsquic.h" + +static const struct parse_funcs *const pf = select_pf_by_ver(LSQVER_041); + + +static lsquic_packno_t +n_acked (const ack_info_t *acki) +{ + lsquic_packno_t n = 0; + unsigned i; + for (i = 0; i < acki->n_ranges; ++i) + n += acki->ranges[i].high - acki->ranges[i].low + 1; + return n; +} + + +static void +test1 (void) +{ + /* Test taken from quic_framer_test.cc -- NewAckFrameOneAckBlock */ + unsigned char ack_buf[] = { + /* TYPE N LL MM */ + 0xA0 | 0 << 4 | 1 << 2 | 1, + 0x00, /* Number of timestamps */ + 0x12, 0x34, /* Largest acked */ + 0x00, 0x00, /* Zero delta time */ + 0x12, 0x34, /* first ack block length */ + }; + + ack_info_t acki; + memset(&acki, 0xF1, sizeof(acki)); + + int len = pf->pf_parse_ack_frame(ack_buf, sizeof(ack_buf), &acki); + assert(("Parsed length is correct (8)", len == sizeof(ack_buf))); + assert(("Number of ranges is 1", acki.n_ranges == 1)); + assert(("Largest acked is 0x1234", acki.ranges[0].high == 0x1234)); + assert(("Lowest acked is 1", acki.ranges[0].low == 1)); + assert(("Number of timestamps is 0", acki.n_timestamps == 0)); + unsigned n = n_acked(&acki); + assert(("Number of acked packets is 0x1234", n == 0x1234)); + + { + size_t sz; + for (sz = 1; sz < sizeof(ack_buf); ++sz) + { + len = pf->pf_parse_ack_frame(ack_buf, sz, &acki); + assert(("Parsing truncated frame failed", len < 0)); + } + } +} + + +static void +test2 (void) +{ + /* Test taken from quic_framer_test.cc -- NewAckFrameOneAckBlock */ + unsigned char ack_buf[] = { + /* TYPE N LL MM */ + 0xA0 | 1 << 4 | 1 << 2 | 1, + 0x04, /* Num Blocks */ + 0x02, /* Num TS */ + 0x12, 0x34, /* Largest acked */ + 0x00, 0x00, /* Zero delta time. */ + 0x00, 0x01, /* First ack block length. */ + 0x01, /* Gap to next block. */ + 0x0e, 0xaf, /* Ack block length. */ + 0xff, /* Gap to next block. */ + 0x00, 0x00, /* Ack block length. */ + 0x91, /* Gap to next block. */ + 0x01, 0xea, /* Ack block length. */ + 0x05, /* Gap to next block. */ + 0x00, 0x04, /* Ack block length. */ + 0x01, /* Delta from largest observed. */ + 0x10, 0x32, 0x54, 0x76, /* Delta time. */ /* XXX do we use this at all? */ + 0x02, /* Delta from largest observed. */ + 0x10, 0x32, /* Delta time. */ + }; + + /* We should get the following array of ranges: + * high low + * 0x1234 0x1234 + * 0x1232 0x384 + * 0x1F3 0xA + * 0x4 0x1 + */ + static const struct { unsigned high, low; } ranges[] = { + { 0x1234, 0x1234 }, + { 0x1232, 0x384 }, + { 0x1F3, 0xA }, + { 0x4, 0x1 }, + }; + + ack_info_t acki; + memset(&acki, 0xF1, sizeof(acki)); + + int len = pf->pf_parse_ack_frame(ack_buf, sizeof(ack_buf), &acki); + assert(("Parsed length is correct (29)", len == sizeof(ack_buf))); + assert(("Number of ranges is 4", acki.n_ranges == 4)); + assert(("Largest acked is 0x1234", acki.ranges[0].high == 0x1234)); + assert(("Number of timestamps is 2", acki.n_timestamps == 2)); + unsigned n = n_acked(&acki); + assert(("Number of acked packets is 4254", n == 4254)); + + for (n = 0; n < 4; ++n) + assert(("Range checks out", ranges[n].high == acki.ranges[n].high + && ranges[n].low == acki.ranges[n].low)); + + { + size_t sz; + for (sz = 1; sz < sizeof(ack_buf); ++sz) + { + len = pf->pf_parse_ack_frame(ack_buf, sz, &acki); + assert(("Parsing truncated frame failed", len < 0)); + } + } +} + + +static void +test3 (void) +{ + /* Generated by our own code, but failed to parse... */ + unsigned char ack_buf[] = { + /* TYPE N LL MM */ + 0xA0 | 1 << 4 | 0 << 2 | 0, + 0x01, /* Num ACK block ranges */ + 0x00, /* Number of timestamps */ + 0x06, /* Largest ACKed */ + 0x00, 0x00, /* Delta time */ + 0x01, /* First ACK block length */ + 0x02, /* Gap to next block */ + 0x03, /* Ack block length */ + }; + + /* We should get the following array of ranges: + * high low + * 6 6 + * 3 1 + */ + static const struct { unsigned high, low; } ranges[] = { + { 6, 6, }, + { 3, 1, }, + }; + + ack_info_t acki; + memset(&acki, 0xF1, sizeof(acki)); + + int len = pf->pf_parse_ack_frame(ack_buf, sizeof(ack_buf), &acki); + assert(("Parsed length is correct (9)", len == sizeof(ack_buf))); + assert(("Number of ranges is 2", acki.n_ranges == 2)); + assert(("Largest acked is 6", acki.ranges[0].high == 6)); + assert(("Number of timestamps is 0", acki.n_timestamps == 0)); + unsigned n = n_acked(&acki); + assert(("Number of acked packets is 4", n == 4)); + + for (n = 0; n < 2; ++n) + assert(("Range checks out", ranges[n].high == acki.ranges[n].high + && ranges[n].low == acki.ranges[n].low)); + + { + size_t sz; + for (sz = 1; sz < sizeof(ack_buf); ++sz) + { + len = pf->pf_parse_ack_frame(ack_buf, sz, &acki); + assert(("Parsing truncated frame failed", len < 0)); + } + } +} + + +static void +test4 (void) +{ + unsigned char ack_buf[] = { + /* TYPE N LL MM */ + 0xA0 | 1 << 4 | 0 << 2 | 0, + 0x01, /* Num ACK block ranges */ + 0x00, /* Number of timestamps */ + 0x03, /* Largest ACKed */ + 0x23, 0x00, /* Delta time */ + 0x01, /* First ack block length */ + 0x01, /* Gap */ + 0x01, /* Ack block length */ + }; + + /* We should get the following array of ranges: + * high low + * 6 6 + * 3 1 + */ + static const struct { unsigned high, low; } ranges[] = { + { 3, 3, }, + { 1, 1, }, + }; + + ack_info_t acki; + memset(&acki, 0xF1, sizeof(acki)); + + int len = pf->pf_parse_ack_frame(ack_buf, sizeof(ack_buf), &acki); + assert(("Parsed length is correct (9)", len == sizeof(ack_buf))); + assert(("Number of ranges is 2", acki.n_ranges == 2)); + assert(("Largest acked is 3", acki.ranges[0].high == 3)); + assert(("Number of timestamps is 0", acki.n_timestamps == 0)); + unsigned n = n_acked(&acki); + assert(("Number of acked packets is 2", n == 2)); + + for (n = 0; n < 2; ++n) + assert(("Range checks out", ranges[n].high == acki.ranges[n].high + && ranges[n].low == acki.ranges[n].low)); + + { + size_t sz; + for (sz = 1; sz < sizeof(ack_buf); ++sz) + { + len = pf->pf_parse_ack_frame(ack_buf, sz, &acki); + assert(("Parsing truncated frame failed", len < 0)); + } + } +} + + +/* Four-byte packet numbers */ +static void +test5 (void) +{ + unsigned char ack_buf[] = { + /* TYPE N LL MM */ + 0xA0 | 1 << 4 | 2 << 2 | 2, + 0x01, /* Num ack blocks ranges. */ + 0x00, /* Number of timestamps. */ + 0x23, 0x45, 0x67, 0x89, + 0x00, 0x00, /* Zero delta time. */ + 0x00, 0x00, 0x00, 0x01, /* First ack block length. */ + 33 - 1, /* Gap to next block. */ + 0x23, 0x45, 0x67, 0x68, /* Ack block length. */ + }; + + /* We should get the following array of ranges: + * high low + * 6 6 + * 3 1 + */ + static const struct { unsigned high, low; } ranges[] = { + { 0x23456789, 0x23456789, }, + { 0x23456768, 1, }, + }; + + ack_info_t acki; + memset(&acki, 0xF1, sizeof(acki)); + + int len = pf->pf_parse_ack_frame(ack_buf, sizeof(ack_buf), &acki); + assert(("Parsed length is correct (9)", len == sizeof(ack_buf))); + assert(("Number of ranges is 2", acki.n_ranges == 2)); + assert(("Largest acked is 0x23456789", acki.ranges[0].high == 0x23456789)); + assert(("Number of timestamps is 0", acki.n_timestamps == 0)); + lsquic_packno_t n = n_acked(&acki); + assert(("Number of acked packets is correct", n == 0x23456768 + 1)); + + for (n = 0; n < 2; ++n) + assert(("Range checks out", ranges[n].high == acki.ranges[n].high + && ranges[n].low == acki.ranges[n].low)); + + { + size_t sz; + for (sz = 1; sz < sizeof(ack_buf); ++sz) + { + len = pf->pf_parse_ack_frame(ack_buf, sz, &acki); + assert(("Parsing truncated frame failed", len < 0)); + } + } +} + + +/* Six-byte packet numbers */ +static void +test6 (void) +{ + unsigned char ack_buf[] = { + /* TYPE N LL MM */ + 0xA0 | 1 << 4 | 3 << 2 | 3, + 0x01, /* Num ack blocks ranges. */ + 0x00, /* Number of timestamps. */ + 0x00, 0x00, 0xAB, 0xCD, 0x23, 0x45, 0x67, 0x89, + 0x00, 0x00, /* Zero delta time. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, /* First ack block length. */ + 33 - 1, /* Gap to next block. */ + 0x00, 0x00, 0xAB, 0xCD, 0x23, 0x45, 0x67, 0x68, /* Ack block length. */ + }; + + static const struct { lsquic_packno_t high, low; } ranges[] = { + { 0xABCD23456789, 0xABCD23456789, }, + { 0xABCD23456768, 1, }, + }; + + ack_info_t acki; + memset(&acki, 0xF1, sizeof(acki)); + + int len = pf->pf_parse_ack_frame(ack_buf, sizeof(ack_buf), &acki); + assert(("Parsed length is correct", len == sizeof(ack_buf))); + assert(("Number of ranges is 2", acki.n_ranges == 2)); + assert(("Largest acked is 0xABCD23456789", acki.ranges[0].high == 0xABCD23456789)); + assert(("Number of timestamps is 0", acki.n_timestamps == 0)); + lsquic_packno_t n = n_acked(&acki); + assert(("Number of acked packets is correct", n == 0xABCD23456768 + 1)); + + for (n = 0; n < 2; ++n) + assert(("Range checks out", ranges[n].high == acki.ranges[n].high + && ranges[n].low == acki.ranges[n].low)); + + { + size_t sz; + for (sz = 1; sz < sizeof(ack_buf); ++sz) + { + len = pf->pf_parse_ack_frame(ack_buf, sz, &acki); + assert(("Parsing truncated frame failed", len < 0)); + } + } +} + + +static void +test_max_ack (void) +{ + lsquic_rechist_t rechist; + lsquic_time_t now; + unsigned i; + int has_missing, sz[2]; + const struct lsquic_packno_range *range; + unsigned char buf[1500]; + struct ack_info acki; + lsquic_cid_t cid = { .len = 0, }; + + lsquic_rechist_init(&rechist, &cid); + now = lsquic_time_now(); + + for (i = 1; i <= 300; ++i) + { + lsquic_rechist_received(&rechist, i * 10, now); + now += i * 1000; + } + + memset(buf, 0xAA, sizeof(buf)); + + lsquic_packno_t largest = 0; + sz[0] = pf->pf_gen_ack_frame(buf, sizeof(buf), + (gaf_rechist_first_f) lsquic_rechist_first, + (gaf_rechist_next_f) lsquic_rechist_next, + (gaf_rechist_largest_recv_f) lsquic_rechist_largest_recv, + &rechist, now, &has_missing, &largest); + assert(sz[0] > 0); + assert(sz[0] <= (int) sizeof(buf)); + assert(has_missing); + + assert(0 == buf[ 2 ]); /* Number of timestamps */ + assert(0xAA == buf[ sz[0] ]); + + sz[1] = pf->pf_parse_ack_frame(buf, sizeof(buf), &acki); + assert(sz[1] == sz[0]); + assert(256 == acki.n_ranges); + + for (range = lsquic_rechist_first(&rechist), i = 0; + range && i < acki.n_ranges; + range = lsquic_rechist_next(&rechist), ++i) + { + assert(range->high == acki.ranges[i].high); + assert(range->low == acki.ranges[i].low); + } + assert(i == 256); + + lsquic_rechist_cleanup(&rechist); +} + + +static void +test_ack_truncation (void) +{ + lsquic_rechist_t rechist; + lsquic_time_t now; + unsigned i; + int has_missing, sz[2]; + const struct lsquic_packno_range *range; + unsigned char buf[1500]; + struct ack_info acki; + size_t bufsz; + lsquic_cid_t cid = { .len = 0, }; + + lsquic_rechist_init(&rechist, &cid); + now = lsquic_time_now(); + + for (i = 1; i <= 300; ++i) + { + lsquic_rechist_received(&rechist, i * 10, now); + now += i * 1000; + } + + for (bufsz = 200; bufsz < 210; ++bufsz) + { + memset(buf, 0xAA, sizeof(buf)); + lsquic_packno_t largest = 0; + sz[0] = pf->pf_gen_ack_frame(buf, bufsz, + (gaf_rechist_first_f) lsquic_rechist_first, + (gaf_rechist_next_f) lsquic_rechist_next, + (gaf_rechist_largest_recv_f) lsquic_rechist_largest_recv, + &rechist, now, &has_missing, &largest); + assert(sz[0] > 0); + assert(sz[0] <= (int) bufsz); + assert(has_missing); + + assert(0 == buf[ 2 ]); /* Number of timestamps */ + assert(0xAA == buf[ sz[0] ]); + + sz[1] = pf->pf_parse_ack_frame(buf, sizeof(buf), &acki); + assert(sz[1] == sz[0]); + assert(acki.n_ranges < 256); + + for (range = lsquic_rechist_first(&rechist), i = 0; + range && i < acki.n_ranges; + range = lsquic_rechist_next(&rechist), ++i) + { + assert(range->high == acki.ranges[i].high); + assert(range->low == acki.ranges[i].low); + } + } + + lsquic_rechist_cleanup(&rechist); +} + + +int +main (void) +{ + lsquic_global_init(LSQUIC_GLOBAL_SERVER); + test1(); + test2(); + test3(); + test4(); + test5(); + test6(); + test_max_ack(); + test_ack_truncation(); + return 0; +} diff --git a/test/unittests/test_alarmset.c b/test/unittests/test_alarmset.c index a041f73e7..d5460c0f4 100644 --- a/test/unittests/test_alarmset.c +++ b/test/unittests/test_alarmset.c @@ -7,6 +7,7 @@ #include "lsquic.h" +#include "lsquic_packet_common.h" #include "lsquic_alarmset.h" @@ -19,7 +20,8 @@ static struct cb_ctx { static void -alarm_cb (void *ctx, lsquic_time_t expiry, lsquic_time_t now) +alarm_cb (enum alarm_id al_id, void *ctx, lsquic_time_t expiry, + lsquic_time_t now) { struct cb_ctx *cb_ctx = ctx; assert(cb_ctx == &global_ctx); diff --git a/test/unittests/test_alt_svc_ver.c b/test/unittests/test_alt_svc_ver.c new file mode 100644 index 000000000..bbc92ddc0 --- /dev/null +++ b/test/unittests/test_alt_svc_ver.c @@ -0,0 +1,17 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#include +#include + +#include "lsquic.h" + +#define B(x) (1<<(x)) + +int +main (void) +{ + assert(0 == strcmp("", lsquic_get_alt_svc_versions(0xF000))); /* Invalid bits ignored and no crash */ + assert(0 == strcmp("39", lsquic_get_alt_svc_versions(B(LSQVER_039)))); + assert(0 == strcmp("39,43", lsquic_get_alt_svc_versions(B(LSQVER_039)|B(LSQVER_043)))); + assert(0 == strcmp("39,43", lsquic_get_alt_svc_versions(0xFF0000|B(LSQVER_039)|B(LSQVER_043)))); + return 0; +} diff --git a/test/unittests/test_attq.c b/test/unittests/test_attq.c index 6b00c1157..90098d4fe 100644 --- a/test/unittests/test_attq.c +++ b/test/unittests/test_attq.c @@ -1,11 +1,13 @@ /* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ #include #include +#include #include "lsquic.h" #include "lsquic_types.h" #include "lsquic_int_types.h" #include "lsquic_attq.h" +#include "lsquic_hash.h" #include "lsquic_conn.h" diff --git a/test/unittests/test_blocked_gquic_be.c b/test/unittests/test_blocked_gquic_be.c index b7aa66a8b..1a97cc53a 100644 --- a/test/unittests/test_blocked_gquic_be.c +++ b/test/unittests/test_blocked_gquic_be.c @@ -9,7 +9,6 @@ #include "lsquic.h" #include "lsquic_types.h" -#include "lsquic_alarmset.h" #include "lsquic_parse.h" static const struct parse_funcs *const pf = select_pf_by_ver(LSQVER_039); @@ -19,13 +18,13 @@ static const struct parse_funcs *const pf = select_pf_by_ver(LSQVER_039); struct wuf_test { unsigned char buf[0x10]; size_t buf_len; - uint32_t stream_id; + lsquic_stream_id_t stream_id; }; static const struct wuf_test wuf_tests[] = { { .buf = { 0x05, 0x00, 0x67, 0x45, 0x34, }, - .buf_len = QUIC_BLOCKED_FRAME_SZ, + .buf_len = GQUIC_BLOCKED_FRAME_SZ, .stream_id = 0x674534, }, @@ -39,9 +38,9 @@ run_parse_tests (void) const struct wuf_test *test; for (test = wuf_tests; test->buf[0]; ++test) { - uint32_t stream_id = ~0; + lsquic_stream_id_t stream_id = ~0; int sz = pf->pf_parse_blocked_frame(test->buf, test->buf_len, &stream_id); - assert(sz == QUIC_BLOCKED_FRAME_SZ); + assert(sz == GQUIC_BLOCKED_FRAME_SZ); assert(stream_id == test->stream_id); } } @@ -55,7 +54,7 @@ run_gen_tests (void) { unsigned char buf[0x100]; int sz = pf->pf_gen_blocked_frame(buf, test->buf_len, test->stream_id); - assert(sz == QUIC_BLOCKED_FRAME_SZ); + assert(sz == GQUIC_BLOCKED_FRAME_SZ); assert(0 == memcmp(buf, test->buf, sz)); } } diff --git a/test/unittests/test_bw_sampler.c b/test/unittests/test_bw_sampler.c new file mode 100644 index 000000000..3275a3f53 --- /dev/null +++ b/test/unittests/test_bw_sampler.c @@ -0,0 +1,641 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* Test adapted from Chromium bandwidth_sampler_test.cc */ +// Copyright 2016 The Chromium Authors. All rights reserved. + +#include +#include +#include +#include +#include + +#include "lsquic.h" +#include "lsquic_int_types.h" +#include "lsquic_hash.h" +#include "lsquic_packet_common.h" +#include "lsquic_packet_out.h" +#include "lsquic_bw_sampler.h" +#include "lsquic_conn.h" +#include "lsquic_malo.h" + + +/* Convert seconds to microseconds */ +#define sec(val) ((val) * 1000 * 1000) + +/* Convert milliseconds to lsquic_time_t, which is microseconds */ +#define ms(val) ((val) * 1000) + +/* Microseconds */ +#define us(val) (val) + +#define kRegularPacketSize 1280 + +#define PacketsToBytes(count_) ((count_) * kRegularPacketSize) + +#define FromKBytesPerSecond(size_) (size_ * 8000) + +// Enforce divisibility for some of the tests: +// "kRegularPacketSize has to be five times divisible by 2" +typedef char packet_size_has_to_be_five_times_divisible_by_2[ + (kRegularPacketSize & 31) == 0 ? 1 : -1]; + +struct sampler_test +{ + struct bw_sampler sampler; + lsquic_time_t time; + uint64_t bytes_in_flight; + struct lsquic_conn conn; + struct malo *malo_po; +}; + + +static void +sampler_test_init (struct sampler_test *stest) +{ + memset(stest, 0, sizeof(*stest)); + stest->time = ms(1000); /* Time must not be zero, or test breaks */ + LSCONN_INITIALIZE(&stest->conn); + lsquic_bw_sampler_init(&stest->sampler, &stest->conn, QUIC_FTBIT_STREAM); + stest->malo_po = lsquic_malo_create(sizeof(struct lsquic_packet_out)); + assert(stest->malo_po); +} + + +static void +sampler_test_cleanup (struct sampler_test *stest) +{ + lsquic_bw_sampler_cleanup(&stest->sampler); + lsquic_malo_destroy(stest->malo_po); +} + + +static struct lsquic_packet_out * +sampler_test_send_packet (struct sampler_test *stest, lsquic_packno_t packno, + bool retx) +{ + struct lsquic_packet_out *packet_out; + + packet_out = lsquic_malo_get(stest->malo_po); + assert(packet_out); + memset(packet_out, 0, sizeof(*packet_out)); + packet_out->po_packno = packno; + packet_out->po_flags |= PO_SENT_SZ; + packet_out->po_sent_sz = kRegularPacketSize; + packet_out->po_sent = stest->time; + if (retx) + packet_out->po_frame_types |= QUIC_FTBIT_STREAM; + lsquic_bw_sampler_packet_sent(&stest->sampler, packet_out, + stest->bytes_in_flight); + if (retx) + stest->bytes_in_flight += packet_out->po_sent_sz; + return packet_out; +} + + +static struct bw_sample * +sampler_test_ack_packet (struct sampler_test *stest, + struct lsquic_packet_out *packet_out) +{ + if (packet_out->po_frame_types & QUIC_FTBIT_STREAM) + stest->bytes_in_flight -= packet_out->po_sent_sz; + return lsquic_bw_sampler_packet_acked(&stest->sampler, packet_out, + stest->time); +} + + +static void +sampler_test_lose_packet (struct sampler_test *stest, + struct lsquic_packet_out *packet_out) +{ + if (packet_out->po_frame_types & QUIC_FTBIT_STREAM) + stest->bytes_in_flight -= packet_out->po_sent_sz; + lsquic_bw_sampler_packet_lost(&stest->sampler, packet_out); +} + + +static void +sampler_test_send_40_packets_and_ack_first_20 (struct sampler_test *stest, + lsquic_time_t time_between_packets, struct lsquic_packet_out *packets[]) +{ + struct bw_sample *sample; + unsigned i; + + // Send 20 packets at a constant inter-packet time. + for (i = 1; i <= 20; i++) + { + packets[i] = sampler_test_send_packet(stest, i, true); + stest->time += time_between_packets; + } + + // Ack packets 1 to 20, while sending new packets at the same rate as + // before. + for (i = 1; i <= 20; i++) + { + sample = sampler_test_ack_packet(stest, packets[i]); + assert(sample); + lsquic_malo_put(sample); + packets[i + 20] = sampler_test_send_packet(stest, i + 20, true); + stest->time += time_between_packets; + } +} + + +// Test the sampler in a simple stop-and-wait sender setting. +static void +test_send_and_wait (void) +{ + struct sampler_test stest; + lsquic_time_t time_between_packets = ms(10); + uint64_t expected_bandwidth = kRegularPacketSize * 100 * 8; + unsigned i; + struct bw_sample *sample; + struct lsquic_packet_out *packet; + + sampler_test_init(&stest); + + // Send packets at the constant bandwidth. + for (i = 1; i < 20; ++i) + { + packet = sampler_test_send_packet(&stest, i, true); + stest.time += time_between_packets; + sample = sampler_test_ack_packet(&stest, packet); + assert(sample); + assert(expected_bandwidth == BW_VALUE(&sample->bandwidth)); + lsquic_malo_put(sample); + } + + // Send packets at the exponentially decreasing bandwidth. + for (i = 20; i < 25; i++) + { + time_between_packets = time_between_packets * 2; + expected_bandwidth = expected_bandwidth / 2; + packet = sampler_test_send_packet(&stest, i, true); + stest.time += time_between_packets; + sample = sampler_test_ack_packet(&stest, packet); + assert(sample); + assert(expected_bandwidth == BW_VALUE(&sample->bandwidth)); + lsquic_malo_put(sample); + } + + assert(lsquic_bw_sampler_entry_count(&stest.sampler) == 0); + assert(stest.bytes_in_flight == 0); + + sampler_test_cleanup(&stest); +} + + +static void +test_send_time_state (void) +{ + struct sampler_test stest; + lsquic_time_t time_between_packets = ms(10); + struct bw_sample *sample; + unsigned i; + struct lsquic_packet_out *packets[11]; + + sampler_test_init(&stest); + + // Send packets 1-5. + for (i = 1; i <= 5; i++) { + packets[i] = sampler_test_send_packet(&stest, i, true); + assert(PacketsToBytes(i) == stest.sampler.bws_total_sent); + stest.time += time_between_packets; + } + + /* The order of tests here is different. Because the send state is + * deleted when packet is acked, we have to check its values first. + */ +#define SEND_STATE(idx_) (&packets[idx_]->po_bwp_state->bwps_send_state) + + // Ack packet 1. + assert(PacketsToBytes(1) == SEND_STATE(1)->total_bytes_sent); + assert(0 == SEND_STATE(1)->total_bytes_acked); + assert(0 == SEND_STATE(1)->total_bytes_lost); + sample = sampler_test_ack_packet(&stest, packets[1]); + assert(sample); + lsquic_malo_put(sample); + assert(PacketsToBytes(1) == stest.sampler.bws_total_acked); + + // Lose packet 2. + assert(PacketsToBytes(2) == SEND_STATE(2)->total_bytes_sent); + assert(0 == SEND_STATE(2)->total_bytes_acked); + assert(0 == SEND_STATE(2)->total_bytes_lost); + sampler_test_lose_packet(&stest, packets[2]); + assert(PacketsToBytes(1) == stest.sampler.bws_total_lost); + + // Lose packet 3. + assert(PacketsToBytes(3) == SEND_STATE(3)->total_bytes_sent); + assert(0 == SEND_STATE(3)->total_bytes_acked); + assert(0 == SEND_STATE(3)->total_bytes_lost); + sampler_test_lose_packet(&stest, packets[3]); + assert(PacketsToBytes(2) == stest.sampler.bws_total_lost); + + // Send packets 6-10. + for (i = 6; i <= 10; i++) + { + packets[i] = sampler_test_send_packet(&stest, i, true); + assert(PacketsToBytes(i) == stest.sampler.bws_total_sent); + stest.time += time_between_packets; + } + + // Ack all inflight packets. + unsigned acked_packet_count = 1; + assert(PacketsToBytes(acked_packet_count) == + stest.sampler.bws_total_acked); + for (i = 4; i <= 10; i++) + { + assert(PacketsToBytes(i) == SEND_STATE(i)->total_bytes_sent); + if (i <= 5) + { + assert(0 == SEND_STATE(i)->total_bytes_acked); + assert(0 == SEND_STATE(i)->total_bytes_lost); + } + else + { + assert(PacketsToBytes(1) == SEND_STATE(i)->total_bytes_acked); + assert(PacketsToBytes(2) == SEND_STATE(i)->total_bytes_lost); + } + sample = sampler_test_ack_packet(&stest, packets[i]); + assert(sample); + lsquic_malo_put(sample); + ++acked_packet_count; + assert(PacketsToBytes(acked_packet_count) == + stest.sampler.bws_total_acked); + stest.time += time_between_packets; + } + + assert(lsquic_bw_sampler_entry_count(&stest.sampler) == 0); + + sampler_test_cleanup(&stest); +} + + +// Test the sampler during regular windowed sender scenario with fixed +// CWND of 20. +static void +test_send_paced (void) +{ + struct sampler_test stest; + const lsquic_time_t time_between_packets = ms(1); + uint64_t expected_bw = FromKBytesPerSecond(kRegularPacketSize); + unsigned i; + struct bw_sample *sample; + struct lsquic_packet_out *packets[41]; + + sampler_test_init(&stest); + sampler_test_send_40_packets_and_ack_first_20(&stest, + time_between_packets, packets); + + // Ack the packets 21 to 40, arriving at the correct bandwidth. + for (i = 21; i <= 40; ++i) + { + sample = sampler_test_ack_packet(&stest, packets[i]); + assert(sample); + assert(expected_bw == BW_VALUE(&sample->bandwidth)); + stest.time += time_between_packets; + lsquic_malo_put(sample); + } + + assert(lsquic_bw_sampler_entry_count(&stest.sampler) == 0); + assert(stest.bytes_in_flight == 0); + + sampler_test_cleanup(&stest); +} + + +// Test the sampler in a scenario where 50% of packets is consistently lost. +static void +test_send_with_losses (void) +{ + struct sampler_test stest; + const lsquic_time_t time_between_packets = ms(1); + uint64_t expected_bw = FromKBytesPerSecond(kRegularPacketSize) / 2; + unsigned i; + struct bw_sample *sample; + struct lsquic_packet_out *packets[41]; + + sampler_test_init(&stest); + + // Send 20 packets, each 1 ms apart. + for (i = 1; i <= 20; i++) + { + packets[i] = sampler_test_send_packet(&stest, i, true); + stest.time += time_between_packets; + } + + // Ack packets 1 to 20, losing every even-numbered packet, while sending new + // packets at the same rate as before. + for (i = 1; i <= 20; i++) + { + if (i % 2 == 0) + { + sample = sampler_test_ack_packet(&stest, packets[i]); + assert(sample); + lsquic_malo_put(sample); + } + else + sampler_test_lose_packet(&stest, packets[i]); + packets[i + 20] = sampler_test_send_packet(&stest, i + 20, true); + stest.time += time_between_packets; + } + + // Ack the packets 21 to 40 with the same loss pattern. + for (i = 21; i <= 40; i++) + { + if (i % 2 == 0) + { + sample = sampler_test_ack_packet(&stest, packets[i]); + assert(sample); + assert(expected_bw == BW_VALUE(&sample->bandwidth)); + lsquic_malo_put(sample); + } + else + sampler_test_lose_packet(&stest, packets[i]); + stest.time += time_between_packets; + } + + assert(lsquic_bw_sampler_entry_count(&stest.sampler) == 0); + assert(stest.bytes_in_flight == 0); + + sampler_test_cleanup(&stest); +} + + +// Test the sampler in a scenario where the 50% of packets are not +// congestion controlled (specifically, non-retransmittable data is not +// congestion controlled). Should be functionally consistent in behavior with +// the SendWithLosses test. +static void +test_not_congestion_controlled (void) +{ + struct sampler_test stest; + const lsquic_time_t time_between_packets = ms(1); + uint64_t expected_bw = FromKBytesPerSecond(kRegularPacketSize) / 2; + unsigned i; + struct bw_sample *sample; + struct lsquic_packet_out *packets[41]; + + sampler_test_init(&stest); + + /* Note the mismatch between the comment and the code. This is + * inherited from the original code. + */ + // Send 20 packets, each 1 ms apart. Every even packet is not congestion + // controlled. + for (i = 1; i <= 20; i++) + { + packets[i] = sampler_test_send_packet(&stest, i, + i % 2 == 0 ? true : false); + stest.time += time_between_packets; + } + + assert(lsquic_bw_sampler_entry_count(&stest.sampler) == 10); + + // Ack packets 2 to 21, ignoring every even-numbered packet, while sending new + // packets at the same rate as before. + for (i = 1; i <= 20; i++) + { + if (i % 2 == 0) + { + sample = sampler_test_ack_packet(&stest, packets[i]); + assert(sample); + lsquic_malo_put(sample); + } + packets[i + 20] = sampler_test_send_packet(&stest, i + 20, + i % 2 == 0 ? true : false); + stest.time += time_between_packets; + } + + // Ack the packets 22 to 41 with the same congestion controlled pattern. + for (i = 21; i <= 40; i++) + { + if (i % 2 == 0) + { + sample = sampler_test_ack_packet(&stest, packets[i]); + assert(sample); + lsquic_malo_put(sample); + assert(expected_bw == BW_VALUE(&sample->bandwidth)); + } + stest.time += time_between_packets; + } + + // Since only congestion controlled packets are entered into the map, it has + // to be empty at this point. + assert(lsquic_bw_sampler_entry_count(&stest.sampler) == 0); + assert(stest.bytes_in_flight == 0); + + sampler_test_cleanup(&stest); +} + + +// Simulate a situation where ACKs arrive in burst and earlier than usual, thus +// producing an ACK rate which is higher than the original send rate. +static void +test_compressed_ack (void) +{ + struct sampler_test stest; + const lsquic_time_t time_between_packets = ms(1), + ridiculously_small_time_delta = us(20); + uint64_t expected_bw = FromKBytesPerSecond(kRegularPacketSize); + unsigned i; + struct bw_sample *sample; + struct lsquic_packet_out *packets[41]; + + sampler_test_init(&stest); + sampler_test_send_40_packets_and_ack_first_20(&stest, + time_between_packets, packets); + + // Simulate an RTT somewhat lower than the one for 1-to-21 transmission. + stest.time += time_between_packets * 15; + + // Ack the packets 21 to 40 almost immediately at once. + for (i = 21; i <= 40; i++) + { + sample = sampler_test_ack_packet(&stest, packets[i]); + assert(sample); + stest.time += ridiculously_small_time_delta; + lsquic_malo_put(sample); + } + + assert(BW_VALUE(&sample->bandwidth) == expected_bw); + assert(lsquic_bw_sampler_entry_count(&stest.sampler) == 0); + assert(stest.bytes_in_flight == 0); + + sampler_test_cleanup(&stest); +} + + +// Tests receiving ACK packets in the reverse order. +static void +test_reordered_ack (void) +{ + struct sampler_test stest; + const lsquic_time_t time_between_packets = ms(1); + uint64_t expected_bw = FromKBytesPerSecond(kRegularPacketSize); + unsigned i; + struct bw_sample *sample; + struct lsquic_packet_out *packets[61]; + + sampler_test_init(&stest); + sampler_test_send_40_packets_and_ack_first_20(&stest, + time_between_packets, packets); + + // Ack the packets 21 to 40 in the reverse order, while sending packets 41 to + // 60. + for (i = 0; i < 20; i++) + { + sample = sampler_test_ack_packet(&stest, packets[40 - i]); + assert(sample); + assert(expected_bw == BW_VALUE(&sample->bandwidth)); + packets[41 + i] = sampler_test_send_packet(&stest, 41 + i, true); + stest.time += time_between_packets; + lsquic_malo_put(sample); + } + + // Ack the packets 41 to 60, now in the regular order. + for (i = 41; i <= 60; i++) + { + sample = sampler_test_ack_packet(&stest, packets[i]); + assert(sample); + assert(expected_bw == BW_VALUE(&sample->bandwidth)); + stest.time += time_between_packets; + lsquic_malo_put(sample); + } + + assert(lsquic_bw_sampler_entry_count(&stest.sampler) == 0); + assert(stest.bytes_in_flight == 0); + + sampler_test_cleanup(&stest); +} + + +// Test the app-limited logic. +static void +test_app_limited (void) +{ + struct sampler_test stest; + const lsquic_time_t time_between_packets = ms(1); + uint64_t expected_bw = FromKBytesPerSecond(kRegularPacketSize); + unsigned i; + struct bw_sample *sample; + struct lsquic_packet_out *packets[81]; + + sampler_test_init(&stest); + sampler_test_send_40_packets_and_ack_first_20(&stest, + time_between_packets, packets); + + // We are now app-limited. Ack 21 to 40 as usual, but do not send anything for + // now. + lsquic_bw_sampler_app_limited(&stest.sampler); + for (i = 21; i <= 40; i++) + { + sample = sampler_test_ack_packet(&stest, packets[i]); + assert(sample); + assert(expected_bw == BW_VALUE(&sample->bandwidth)); + stest.time += time_between_packets; + lsquic_malo_put(sample); + } + + stest.time += sec(1); + + // Send packets 41 to 60, all of which would be marked as app-limited. + for (i = 41; i <= 60; i++) + { + packets[i] = sampler_test_send_packet(&stest, i, true); + stest.time += time_between_packets; + } + + // Ack packets 41 to 60, while sending packets 61 to 80. 41 to 60 should be + // app-limited and underestimate the bandwidth due to that. + for (i = 41; i <= 60; i++) + { + sample = sampler_test_ack_packet(&stest, packets[i]); + assert(sample); + assert(sample->is_app_limited); + assert(BW_VALUE(&sample->bandwidth) < 0.7 * expected_bw); + packets[i + 20] = sampler_test_send_packet(&stest, i + 20, true); + stest.time += time_between_packets; + lsquic_malo_put(sample); + } + + // Run out of packets, and then ack packet 61 to 80, all of which should have + // correct non-app-limited samples. + for (i = 61; i <= 80; i++) + { + sample = sampler_test_ack_packet(&stest, packets[i]); + assert(sample); + assert(BW_VALUE(&sample->bandwidth) == expected_bw); + stest.time += time_between_packets; + lsquic_malo_put(sample); + } + + assert(lsquic_bw_sampler_entry_count(&stest.sampler) == 0); + assert(stest.bytes_in_flight == 0); + + sampler_test_cleanup(&stest); +} + + +// Test the samples taken at the first flight of packets sent. +static void +test_first_round_trip (void) +{ + struct sampler_test stest; + const lsquic_time_t time_between_packets = ms(1), + rtt = ms(800); + const unsigned num_packets = 10; + const uint64_t num_bytes = num_packets * kRegularPacketSize; + struct bandwidth real_bandwidth = BW_FROM_BYTES_AND_DELTA(num_bytes, rtt); + uint64_t last_bw; + unsigned i; + struct bw_sample *sample; + struct lsquic_packet_out *packets[11]; + + sampler_test_init(&stest); + + for (i = 1; i <= 10; i++) + { + packets[i] = sampler_test_send_packet(&stest, i, true); + stest.time += time_between_packets; + } + + stest.time += rtt - num_packets * time_between_packets; + + last_bw = 0; + for (i = 1; i <= 10; i++) + { + sample = sampler_test_ack_packet(&stest, packets[i]); + assert(sample); + assert(BW_VALUE(&sample->bandwidth) > last_bw); + last_bw = BW_VALUE(&sample->bandwidth); + stest.time += time_between_packets; + lsquic_malo_put(sample); + } + + // The final measured sample for the first flight of sample is expected to be + // smaller than the real bandwidth, yet it should not lose more than 10%. The + // specific value of the error depends on the difference between the RTT and + // the time it takes to exhaust the congestion window (i.e. in the limit when + // all packets are sent simultaneously, last sample would indicate the real + // bandwidth). + assert(last_bw < real_bandwidth.value); + assert(last_bw > 0.9f * real_bandwidth.value); + + sampler_test_cleanup(&stest); +} + + +int +main (void) +{ + test_send_and_wait(); + test_send_time_state(); + test_send_paced(); + test_send_with_losses(); + test_not_congestion_controlled(); + test_compressed_ack(); + test_reordered_ack(); + test_app_limited(); + test_first_round_trip(); + + return 0; +} diff --git a/test/unittests/test_chlo_gen.c b/test/unittests/test_chlo_gen.c new file mode 100644 index 000000000..109adad55 --- /dev/null +++ b/test/unittests/test_chlo_gen.c @@ -0,0 +1,72 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * test_chlo_gen.c -- Test Client Hello generation. + */ + +#include +#include +#include + +#include + +#include "lsquic.h" +#include "lsquic_hsk_cli_ietf.h" +#include "lsquic_logger.h" + + +static int +my_bwrite (BIO *bio, const char *buf, int len) +{ + return 0; +} + +static int +my_bread (BIO *bio, char *buf, int len) +{ + return 0; +} + +static const BIO_METHOD bio_method = { + .type = 0, /* XXX ? */ + .name = __FILE__, + .bwrite = my_bwrite, + .bread = my_bread, +}; + +int +main (int argc, char **argv) +{ + int opt, s; + + lsquic_log_to_fstream(stderr, LLTS_NONE); + + while (-1 != (opt = getopt(argc, argv, "l:L:"))) + { + switch (opt) + { + case 'l': + lsquic_logger_lopt(optarg); + break; + case 'L': + lsquic_set_log_level(optarg); + break; + default: + exit(EXIT_FAILURE); + } + } + + const lsquic_cid_t dcid = { .len = 10, .idbuf = "wild thing", }; + struct hsk_cli *cli = lsquic_hsk_cli_new(&dcid, &bio_method, NULL, + (unsigned char *) "some params", 11); + + assert(cli); + s = lsquic_hsk_cli_write(cli); + assert(0 == s); + + (void) + lsquic_hsk_cli_write(cli); + + lsquic_hsk_cli_destroy(cli); + + exit(EXIT_SUCCESS); +} diff --git a/test/unittests/test_clear_aead.c b/test/unittests/test_clear_aead.c new file mode 100644 index 000000000..f1b336b09 --- /dev/null +++ b/test/unittests/test_clear_aead.c @@ -0,0 +1,120 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * See + * https://github.com/quicwg/base-drafts/wiki/Test-Vector-for-the-Clear-Text-AEAD-key-derivation + */ + +#include +#include + +#include +#include + +#include "lsquic_types.h" +#include "lsquic_hkdf.h" + +int +main (void) +{ + const EVP_MD *const md = EVP_sha256(); + + const lsquic_cid_t dcid = { + .idbuf = "\xc6\x54\xef\xd8\xa3\x1b\x47\x92", + .len = 8, + }; + unsigned char secret[100]; + size_t secret_len; + + const unsigned char expected_secret[] = { + 0x5f, 0x8d, 0xa5, 0x94, 0xfe, 0xca, 0x72, 0xc1, + 0x0f, 0x9e, 0xc8, 0x78, 0x81, 0x11, 0x05, 0x57, + 0x81, 0xa9, 0x6f, 0x6a, 0x06, 0x53, 0x58, 0xbf, + 0xb4, 0x5a, 0xba, 0x4b, 0xc0, 0x37, 0xf3, 0xb2, + }; + + HKDF_extract(secret, &secret_len, md, dcid.idbuf, dcid.len, + HSK_SALT, HSK_SALT_SZ); + + assert(sizeof(expected_secret) == secret_len); + assert(0 == memcmp(secret, expected_secret, sizeof(expected_secret))); + + unsigned char client_secret[32]; + const unsigned char expected_client_secret[] = { + 0x0c, 0x74, 0xbb, 0x95, 0xa1, 0x04, 0x8e, 0x52, + 0xef, 0x3b, 0x72, 0xe1, 0x28, 0x89, 0x35, 0x1c, + 0xd7, 0x3a, 0x55, 0x0f, 0xb6, 0x2c, 0x4b, 0xb0, + 0x87, 0xe9, 0x15, 0xcc, 0xe9, 0x6c, 0xe3, 0xa0, + }; + lsquic_qhkdf_expand(md, secret, secret_len, CLIENT_LABEL, CLIENT_LABEL_SZ, + client_secret, sizeof(client_secret)); + assert(0 == memcmp(client_secret, expected_client_secret, + sizeof(client_secret))); + const unsigned char expected_client_key[] = { + 0x86, 0xd1, 0x83, 0x04, 0x80, 0xb4, 0x0f, 0x86, + 0xcf, 0x9d, 0x68, 0xdc, 0xad, 0xf3, 0x5d, 0xfe, + }; + const unsigned char expected_client_iv[] = { + 0x12, 0xf3, 0x93, 0x8a, 0xca, 0x34, 0xaa, 0x02, + 0x54, 0x31, 0x63, 0xd4, + }; + const unsigned char expected_client_hp[] = { + 0xcd, 0x25, 0x3a, 0x36, 0xff, 0x93, 0x93, 0x7c, + 0x46, 0x93, 0x84, 0xa8, 0x23, 0xaf, 0x6c, 0x56, + }; + unsigned char client_key[sizeof(expected_client_key)], + client_iv[sizeof(expected_client_iv)], + client_hp[sizeof(expected_client_hp)]; + lsquic_qhkdf_expand(md, client_secret, sizeof(client_secret), "quic key", 8, + client_key, sizeof(client_key)); + assert(0 == memcmp(client_key, expected_client_key, + sizeof(expected_client_key))); + lsquic_qhkdf_expand(md, client_secret, sizeof(client_secret), "quic iv", 7, + client_iv, sizeof(client_iv)); + assert(0 == memcmp(client_iv, expected_client_iv, + sizeof(expected_client_iv))); + lsquic_qhkdf_expand(md, client_secret, sizeof(client_secret), "quic hp", 7, + client_hp, sizeof(client_hp)); + assert(0 == memcmp(client_hp, expected_client_hp, + sizeof(expected_client_hp))); + + unsigned char server_secret[32]; + const unsigned char expected_server_secret[] = { + 0x4c, 0x9e, 0xdf, 0x24, 0xb0, 0xe5, 0xe5, 0x06, + 0xdd, 0x3b, 0xfa, 0x4e, 0x0a, 0x03, 0x11, 0xe8, + 0xc4, 0x1f, 0x35, 0x42, 0x73, 0xd8, 0xcb, 0x49, + 0xdd, 0xd8, 0x46, 0x41, 0x38, 0xd4, 0x7e, 0xc6, + }; + lsquic_qhkdf_expand(md, secret, secret_len, SERVER_LABEL, SERVER_LABEL_SZ, + server_secret, sizeof(server_secret)); + assert(0 == memcmp(server_secret, expected_server_secret, + sizeof(server_secret))); + const unsigned char expected_server_key[] = { + 0x2c, 0x78, 0x63, 0x3e, 0x20, 0x6e, 0x99, 0xad, + 0x25, 0x19, 0x64, 0xf1, 0x9f, 0x6d, 0xcd, 0x6d, + }; + const unsigned char expected_server_iv[] = { + 0x7b, 0x50, 0xbf, 0x36, 0x98, 0xa0, 0x6d, 0xfa, + 0xbf, 0x75, 0xf2, 0x87, + }; + const unsigned char expected_server_hp[] = { + 0x25, 0x79, 0xd8, 0x69, 0x6f, 0x85, 0xed, 0xa6, + 0x8d, 0x35, 0x02, 0xb6, 0x55, 0x96, 0x58, 0x6b, + }; + unsigned char server_key[sizeof(expected_server_key)], + server_iv[sizeof(expected_server_iv)], + server_hp[sizeof(expected_server_hp)]; + lsquic_qhkdf_expand(md, server_secret, sizeof(server_secret), "quic key", 8, + server_key, sizeof(server_key)); + assert(0 == memcmp(server_key, expected_server_key, + sizeof(expected_server_key))); + lsquic_qhkdf_expand(md, server_secret, sizeof(server_secret), "quic iv", 7, + server_iv, sizeof(server_iv)); + assert(0 == memcmp(server_iv, expected_server_iv, + sizeof(expected_server_iv))); + lsquic_qhkdf_expand(md, server_secret, sizeof(server_secret), "quic hp", 7, + server_hp, sizeof(server_hp)); + assert(0 == memcmp(server_hp, expected_server_hp, + sizeof(expected_server_hp))); + + return 0; +} diff --git a/test/unittests/test_conn_close_gquic_be.c b/test/unittests/test_conn_close_gquic_be.c index 5f106fdba..7413be1cb 100644 --- a/test/unittests/test_conn_close_gquic_be.c +++ b/test/unittests/test_conn_close_gquic_be.c @@ -9,7 +9,6 @@ #include "lsquic.h" #include "lsquic_types.h" -#include "lsquic_alarmset.h" #include "lsquic_parse.h" static const struct parse_funcs *const pf = select_pf_by_ver(LSQVER_039); @@ -119,11 +118,11 @@ run_parse_tests (void) const struct conn_close_parse_test *test; for (test = parse_tests; test->buf[0]; ++test) { - uint32_t error_code = ~0; + uint64_t error_code = ~0; uint16_t reason_len = ~0; uint8_t reason_off = ~0; int sz = pf->pf_parse_connect_close_frame(test->buf, test->buf_len, - &error_code, &reason_len, &reason_off); + NULL, &error_code, &reason_len, &reason_off); assert(sz == test->retval); if (0 == sz) { @@ -143,7 +142,7 @@ run_gen_tests (void) { unsigned char buf[0x100]; int sz = pf->pf_gen_connect_close_frame(buf, sizeof(buf), - test->error_code, test->reason, + 0, test->error_code, test->reason, test->reason ? strlen(test->reason) : 0); assert(sz == test->retval); if (0 == sz) diff --git a/test/unittests/test_conn_hash.c b/test/unittests/test_conn_hash.c index 2b27adb34..203417141 100644 --- a/test/unittests/test_conn_hash.c +++ b/test/unittests/test_conn_hash.c @@ -12,6 +12,7 @@ #include "lsquic.h" #include "lsquic_int_types.h" #include "lsquic_types.h" +#include "lsquic_hash.h" #include "lsquic_conn.h" #include "lsquic_conn_hash.h" #include "lsquic_mm.h" @@ -25,7 +26,8 @@ get_new_lsquic_conn (struct malo *malo) { struct lsquic_conn *lconn = lsquic_malo_get(malo); memset(lconn, 0, sizeof(*lconn)); - lconn->cn_cid = (uintptr_t) lconn; + memcpy(lconn->cn_cid.idbuf, &lconn, sizeof(lconn)); + lconn->cn_cid.len = sizeof(lconn); return lconn; } @@ -55,7 +57,7 @@ main (int argc, char **argv) { lconn = get_new_lsquic_conn(malo); lconn->cn_if = (void *) (uintptr_t) n; /* This will be used for verification later the test */ - find_lsconn = conn_hash_find_by_cid(&conn_hash, lconn->cn_cid); + find_lsconn = conn_hash_find_by_cid(&conn_hash, &lconn->cn_cid); assert(!find_lsconn); s = conn_hash_add(&conn_hash, lconn); assert(0 == s); @@ -68,11 +70,11 @@ main (int argc, char **argv) lconn = lsquic_malo_next(malo)) { assert(lconn->cn_flags == 1); - find_lsconn = conn_hash_find_by_cid(&conn_hash, lconn->cn_cid); + find_lsconn = conn_hash_find_by_cid(&conn_hash, &lconn->cn_cid); assert(find_lsconn == lconn); conn_hash_remove(&conn_hash, lconn); lconn->cn_flags = 0; - find_lsconn = conn_hash_find_by_cid(&conn_hash, lconn->cn_cid); + find_lsconn = conn_hash_find_by_cid(&conn_hash, &lconn->cn_cid); assert(!find_lsconn); } diff --git a/test/unittests/test_crypto_gen.c b/test/unittests/test_crypto_gen.c new file mode 100644 index 000000000..2633b69f2 --- /dev/null +++ b/test/unittests/test_crypto_gen.c @@ -0,0 +1,146 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#include +#include +#include +#include +#include + +#include "lsquic.h" +#include "lsquic_types.h" +#include "lsquic_parse.h" + + +struct test { + int lineno; + const struct parse_funcs * + pf; + uint64_t offset; + size_t avail; /* Space to write stream frame to */ + size_t min_sz; /* Minimum size needed to generate CRYPTO + * frame. Any sizes smaller than this + * should fail. + */ + size_t data_sz; + char data[0x100]; + + /* Output. This is how we expect the resulting frame to look. + */ + int len; /* Return value of pf_gen_crypto_frame() */ + char out[0x100]; +}; + + +static const struct test tests[] = { + + { .lineno = __LINE__, + .pf = select_pf_by_ver(LSQVER_ID22), + .offset = 0, + .data_sz = 10, + .data = "0123456789", + .avail = 0x100, + .out = + { /* Type */ 0x06, + /* Offset */ 0x00, + /* Size */ 0x0A, + /* Data */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + }, + .len = 1 + 1 + 1 + 10, + .min_sz = 1 + 1 + 1 + 1, + }, + + { .lineno = __LINE__, + .pf = select_pf_by_ver(LSQVER_ID22), + .offset = 500, + .data_sz = 10, + .data = "0123456789", + .avail = 0x100, + .out = + { /* Type */ 0x06, + /* Offset */ 0x41, 0xF4, + /* Size */ 0x0A, + /* Data */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + }, + .len = 1 + 2 + 1 + 10, + .min_sz = 1 + 2 + 1 + 1, + }, + +}; + + +struct test_ctx { + const struct test *test; + unsigned off; +}; + + +static size_t +crypto_read (void *ctx, void *buf, size_t len) +{ + struct test_ctx *test_ctx = ctx; + if (test_ctx->test->data_sz - test_ctx->off < len) + len = test_ctx->test->data_sz - test_ctx->off; + memcpy(buf, test_ctx->test->data, len); + test_ctx->off += len; + return len; +} + + +static void +init_ctx (struct test_ctx *test_ctx, const struct test *test) +{ + test_ctx->test = test; + test_ctx->off = 0; +} + + +static void +run_test (int i) +{ + const struct test *const test = &tests[i]; + + int len; + size_t min; + struct test_ctx test_ctx; + unsigned char out[0x100]; + + if (test->len > 0) + { + /* Test that all sizes under specified min fail to produce a frame */ + for (min = 0; min < test->min_sz; ++min) + { + init_ctx(&test_ctx, test); + len = test->pf->pf_gen_crypto_frame(out, min, test->offset, + test->data_sz, crypto_read, &test_ctx); + assert(-1 == len); + } + + /* Test that it succeeds now: */ + init_ctx(&test_ctx, test); + len = test->pf->pf_gen_crypto_frame(out, min, test->offset, + test->data_sz, crypto_read, &test_ctx); + assert(len == (int) min); + } + + init_ctx(&test_ctx, test); + len = test->pf->pf_gen_crypto_frame(out, test->avail, test->offset, + test->data_sz, crypto_read, &test_ctx); + + if (test->len > 0) { + assert(test->len == len); + assert(0 == memcmp(test->out, out, test->len)); + } + else + { + assert(len < 0); + } +} + + +int +main (void) +{ + unsigned i; + for (i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i) + run_test(i); + return 0; +} diff --git a/test/unittests/test_cubic.c b/test/unittests/test_cubic.c index 9caa1c21c..67655b11c 100644 --- a/test/unittests/test_cubic.c +++ b/test/unittests/test_cubic.c @@ -3,6 +3,7 @@ #include #include #include +#include #ifndef WIN32 #include #else @@ -11,9 +12,22 @@ #include "lsquic.h" #include "lsquic_int_types.h" +#include "lsquic_cong_ctl.h" #include "lsquic_cubic.h" #include "lsquic_logger.h" - +#include "lsquic_hash.h" +#include "lsquic_conn.h" +#include "lsquic_sfcw.h" +#include "lsquic_conn_flow.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_stream.h" +#include "lsquic_rtt.h" +#include "lsquic_conn_public.h" +#include "lsquic_packet_common.h" +#include "lsquic_packet_out.h" + +static const struct cong_ctl_if *const cci = &lsquic_cong_cubic_if; static void test_post_quiescence_explosion (void) @@ -21,23 +35,31 @@ test_post_quiescence_explosion (void) struct lsquic_cubic cubic; lsquic_time_t const rtt = 10000; lsquic_time_t t = 12345600; + struct lsquic_conn lconn = LSCONN_INITIALIZER_CIDLEN(lconn, 8); + struct lsquic_conn_public conn_pub = { .lconn = &lconn, }; int i; + struct lsquic_packet_out packet_out = {}; - lsquic_cubic_init(&cubic, __LINE__); + cci->cci_init(&cubic, &conn_pub, 0); cubic.cu_ssthresh = cubic.cu_cwnd = 32 * 1370; for (i = 0; i < 10; ++i) - lsquic_cubic_ack(&cubic, t, rtt, 0, 1370); + { + packet_out.po_sent = t - rtt; + cci->cci_ack(&cubic, &packet_out, 1370, t, 0); + } - assert(lsquic_cubic_get_cwnd(&cubic) == 47026); + assert(cci->cci_get_cwnd(&cubic) == 47026); t += 25 * 1000 * 1000; - lsquic_cubic_was_quiet(&cubic, t); - lsquic_cubic_ack(&cubic, t, rtt, 0, 1370); - assert(lsquic_cubic_get_cwnd(&cubic) == 47060); + cci->cci_was_quiet(&cubic, t, 0 /* bytes in flight (unused) */); + packet_out.po_sent = t - rtt; + cci->cci_ack(&cubic, &packet_out, 1370, t, 0); + assert(cci->cci_get_cwnd(&cubic) == 47060); t += 2 * 1000 * 1000; - lsquic_cubic_ack(&cubic, t, rtt, 0, 1370); + packet_out.po_sent = t - rtt; + cci->cci_ack(&cubic, &packet_out, 1370, t, 0); } @@ -47,23 +69,31 @@ test_post_quiescence_explosion2 (void) struct lsquic_cubic cubic; lsquic_time_t const rtt = 10000; lsquic_time_t t = 12345600; + struct lsquic_conn lconn = LSCONN_INITIALIZER_CIDLEN(lconn, 8); + struct lsquic_conn_public conn_pub = { .lconn = &lconn, }; int i; + struct lsquic_packet_out packet_out = {}; - lsquic_cubic_init(&cubic, __LINE__); + cci->cci_init(&cubic, &conn_pub, 0); cubic.cu_ssthresh = cubic.cu_cwnd = 32 * 1370; for (i = 0; i < 10; ++i) - lsquic_cubic_ack(&cubic, t, rtt, 1, 1370); + { + packet_out.po_sent = t - rtt; + cci->cci_ack(&cubic, &packet_out, 1370, t, 1); + } - assert(lsquic_cubic_get_cwnd(&cubic) == 45300); + assert(cci->cci_get_cwnd(&cubic) == 45300); t += 25 * 1000 * 1000; - lsquic_cubic_was_quiet(&cubic, t); - lsquic_cubic_ack(&cubic, t, rtt, 0, 1370); - assert(lsquic_cubic_get_cwnd(&cubic) == 46754); + cci->cci_was_quiet(&cubic, t, 0 /* bytes in flight (unused) */); + packet_out.po_sent = t - rtt; + cci->cci_ack(&cubic, &packet_out, 1370, t, 0); + assert(cci->cci_get_cwnd(&cubic) == 46754); t += 2 * 1000 * 1000; - lsquic_cubic_ack(&cubic, t, rtt, 1, 1370); + packet_out.po_sent = t - rtt; + cci->cci_ack(&cubic, &packet_out, 1370, t, 1); } diff --git a/test/unittests/test_di_nocopy.c b/test/unittests/test_di_nocopy.c index e8d4ae395..57e9cb83c 100644 --- a/test/unittests/test_di_nocopy.c +++ b/test/unittests/test_di_nocopy.c @@ -18,6 +18,9 @@ #include "lsquic_sfcw.h" #include "lsquic_rtt.h" #include "lsquic_conn_flow.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" #include "lsquic_stream.h" #include "lsquic_conn.h" #include "lsquic_conn_public.h" @@ -245,6 +248,22 @@ static const struct nocopy_test tests[] = .ins = INS_FRAME_OK, /* Ignore another error */ }, + { .lineno = __LINE__, + .n_init_frames = 2, + .initial_frames = { F(0, 60, 0), F(60, 60, 0), }, + .read_until = 120, + .data_frame = F(0, 180, 0), + .ins = INS_FRAME_OVERLAP, + }, + + { .lineno = __LINE__, + .n_init_frames = 3, + .initial_frames = { F(0, 60, 0), F(60, 60, 0), F(180, 60, 0), }, + .read_until = 120, + .data_frame = F(0, 180, 0), + .ins = INS_FRAME_OVERLAP, + }, + }; diff --git a/test/unittests/test_elision.c b/test/unittests/test_elision.c index 08042df08..16e05ecf1 100644 --- a/test/unittests/test_elision.c +++ b/test/unittests/test_elision.c @@ -10,10 +10,14 @@ #include "lsquic_int_types.h" #include "lsquic_packet_common.h" +#include "lsquic_packet_gquic.h" #include "lsquic_packet_out.h" #include "lsquic_parse.h" #include "lsquic_conn_flow.h" #include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" #include "lsquic_stream.h" #include "lsquic_types.h" #include "lsquic_malo.h" @@ -22,7 +26,7 @@ #include "lsquic_logger.h" -static const struct parse_funcs *const pf = select_pf_by_ver(LSQVER_035); +static const struct parse_funcs *const pf = select_pf_by_ver(LSQVER_039); static struct { unsigned char buf[0x1000]; @@ -83,7 +87,7 @@ lsquic_stream_tosend_sz (const lsquic_stream_t *stream) void -lsquic_stream_acked (lsquic_stream_t *stream) +lsquic_stream_acked (lsquic_stream_t *stream, enum quic_frame_type frame_type) { --stream->n_unacked; } @@ -101,7 +105,7 @@ elide_single_stream_frame (void) memset(streams, 0, sizeof(streams)); memset(&enpub, 0, sizeof(enpub)); lsquic_mm_init(&enpub.enp_mm); - packet_out = lsquic_mm_get_packet_out(&enpub.enp_mm, NULL, QUIC_MAX_PAYLOAD_SZ); + packet_out = lsquic_mm_get_packet_out(&enpub.enp_mm, NULL, GQUIC_MAX_PAYLOAD_SZ); setup_stream_contents(123, "Dude, where is my car?"); len = pf->pf_gen_stream_frame(packet_out->po_data + packet_out->po_data_sz, @@ -150,7 +154,7 @@ shrink_packet_post_elision (void) memset(streams, 0, sizeof(streams)); memset(&enpub, 0, sizeof(enpub)); lsquic_mm_init(&enpub.enp_mm); - packet_out = lsquic_mm_get_packet_out(&enpub.enp_mm, NULL, QUIC_MAX_PAYLOAD_SZ); + packet_out = lsquic_mm_get_packet_out(&enpub.enp_mm, NULL, GQUIC_MAX_PAYLOAD_SZ); setup_stream_contents(123, "Dude, where is my car?"); len = pf->pf_gen_stream_frame(packet_out->po_data + packet_out->po_data_sz, @@ -234,7 +238,7 @@ elide_three_stream_frames (int chop_regen) * compare payload and sizes: */ { - ref_out = lsquic_mm_get_packet_out(&enpub.enp_mm, NULL, QUIC_MAX_PAYLOAD_SZ); + ref_out = lsquic_mm_get_packet_out(&enpub.enp_mm, NULL, GQUIC_MAX_PAYLOAD_SZ); /* This is fake data for regeneration */ strcpy((char *) ref_out->po_data, "REGEN"); ref_out->po_data_sz = ref_out->po_regen_sz = 5; @@ -271,7 +275,7 @@ elide_three_stream_frames (int chop_regen) * stream objects to the packet. */ { - packet_out = lsquic_mm_get_packet_out(&enpub.enp_mm, NULL, QUIC_MAX_PAYLOAD_SZ); + packet_out = lsquic_mm_get_packet_out(&enpub.enp_mm, NULL, GQUIC_MAX_PAYLOAD_SZ); /* This is fake data for regeneration */ strcpy((char *) packet_out->po_data, "REGEN"); packet_out->po_data_sz = packet_out->po_regen_sz = 5; diff --git a/test/unittests/test_frame_chop.c b/test/unittests/test_frame_chop.c index 18d2635ee..153f72881 100644 --- a/test/unittests/test_frame_chop.c +++ b/test/unittests/test_frame_chop.c @@ -70,8 +70,11 @@ stream_destroy (struct lsquic_stream *stream) static ssize_t -stream_write (struct lsquic_stream *stream, const void *buf, size_t sz) +stream_write (struct lsquic_stream *stream, struct lsquic_reader *reader) { + size_t sz; + + sz = reader->lsqr_size(reader->lsqr_ctx); if (sz > stream->sm_max_write) sz = stream->sm_max_write; if (stream->sm_write_off + sz > stream->sm_buf_sz) @@ -83,7 +86,8 @@ stream_write (struct lsquic_stream *stream, const void *buf, size_t sz) stream->sm_buf = realloc(stream->sm_buf, stream->sm_buf_sz); } - memcpy(stream->sm_buf + stream->sm_write_off, buf, sz); + sz = reader->lsqr_read(reader->lsqr_ctx, + stream->sm_buf + stream->sm_write_off, sz); stream->sm_write_off += sz; return sz; diff --git a/test/unittests/test_frame_reader.c b/test/unittests/test_frame_reader.c index b0657d2ca..5d6b7a76d 100644 --- a/test/unittests/test_frame_reader.c +++ b/test/unittests/test_frame_reader.c @@ -19,7 +19,10 @@ #include "lsquic_conn_flow.h" #include "lsquic_sfcw.h" #include "lsquic_rtt.h" +#include "lsquic_hash.h" #include "lsquic_conn.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" #include "lsquic_stream.h" #include "lsquic_conn_public.h" #include "lsquic_logger.h" @@ -61,12 +64,12 @@ struct callback_value /* What callback returns */ void *push_promise; struct cv_error { enum frame_reader_error code; - uint32_t stream_id; + lsquic_stream_id_t stream_id; } error; struct cv_priority { - uint32_t stream_id; + lsquic_stream_id_t stream_id; int exclusive; - uint32_t dep_stream_id; + lsquic_stream_id_t dep_stream_id; unsigned weight; } priority; } u; @@ -221,7 +224,7 @@ on_push_promise (void *ctx, struct uncompressed_headers *uh) static void -on_error (void *ctx, uint32_t stream_id, enum frame_reader_error error) +on_error (void *ctx, lsquic_stream_id_t stream_id, enum frame_reader_error error) { struct cb_ctx *cb_ctx = ctx; assert(cb_ctx == &g_cb_ctx); @@ -249,8 +252,8 @@ on_settings (void *ctx, uint16_t id, uint32_t value) static void -on_priority (void *ctx, uint32_t stream_id, int exclusive, - uint32_t dep_stream_id, unsigned weight) +on_priority (void *ctx, lsquic_stream_id_t stream_id, int exclusive, + lsquic_stream_id_t dep_stream_id, unsigned weight) { struct cb_ctx *cb_ctx = ctx; assert(cb_ctx == &g_cb_ctx); diff --git a/test/unittests/test_frame_rw.c b/test/unittests/test_frame_rw.c index 65ed15912..3ef71ceb9 100644 --- a/test/unittests/test_frame_rw.c +++ b/test/unittests/test_frame_rw.c @@ -48,13 +48,21 @@ struct lsquic_stream }; -lsquic_cid_t +static const lsquic_cid_t my_cid = { .len = 8, }; + +#if !defined(NDEBUG) && __GNUC__ +__attribute__((weak)) +#endif +const lsquic_cid_t * lsquic_conn_id (const lsquic_conn_t *lconn) { - return 0; + return &my_cid; } +#if !defined(NDEBUG) && __GNUC__ +__attribute__((weak)) +#endif lsquic_conn_t * lsquic_stream_conn (const lsquic_stream_t *stream) { @@ -88,8 +96,11 @@ stream_destroy (struct lsquic_stream *stream) static ssize_t -stream_write (struct lsquic_stream *stream, const void *buf, size_t sz) +stream_write (struct lsquic_stream *stream, struct lsquic_reader *reader) { + size_t sz; + + sz = reader->lsqr_size(reader->lsqr_ctx); if (stream->sm_sz + sz > stream->sm_buf_sz) { if (stream->sm_sz + sz < stream->sm_buf_sz * 2) @@ -99,7 +110,8 @@ stream_write (struct lsquic_stream *stream, const void *buf, size_t sz) stream->sm_buf = realloc(stream->sm_buf, stream->sm_buf_sz); } - memcpy(stream->sm_buf + stream->sm_sz, buf, sz); + sz = reader->lsqr_read(reader->lsqr_ctx, + stream->sm_buf + stream->sm_sz, sz); stream->sm_sz += sz; return sz; @@ -130,7 +142,8 @@ on_incoming_headers (void *ctx, struct uncompressed_headers *uh) static void -on_error (void *ctx, uint32_t stream_id, enum frame_reader_error error) +on_error (void *ctx, lsquic_stream_id_t stream_id, + enum frame_reader_error error) { assert(0); } diff --git a/test/unittests/test_frame_writer.c b/test/unittests/test_frame_writer.c index 9830181de..9c02d8f80 100644 --- a/test/unittests/test_frame_writer.c +++ b/test/unittests/test_frame_writer.c @@ -12,6 +12,9 @@ #include "lsquic.h" #include "lshpack.h" #include "lsquic_mm.h" +#include "lsquic_int_types.h" +#include "lsquic_hash.h" +#include "lsquic_conn.h" #include "lsquic_frame_common.h" #include "lsquic_frame_writer.h" #if LSQUIC_CONN_STATS @@ -41,15 +44,18 @@ static struct { static ssize_t -output_write (struct lsquic_stream *stream, const void *buf, size_t sz) +output_write (struct lsquic_stream *stream, struct lsquic_reader *reader) { + size_t sz; + + sz = reader->lsqr_size(reader->lsqr_ctx); if (output.max - output.sz < sz) { errno = ENOBUFS; return -1; } - memcpy(output.buf + output.sz, buf, sz); + sz = reader->lsqr_read(reader->lsqr_ctx, output.buf + output.sz, sz); output.sz += sz; return sz; @@ -384,20 +390,16 @@ test_settings_normal (void) } -/* Gotta override these so that LSQUIC_LOG_CONN_ID in lsquic_frame_writer.c - * works. - */ -lsquic_cid_t -lsquic_conn_id (const lsquic_conn_t *lconn) -{ - return 0; -} +static struct lsquic_conn my_conn = LSCONN_INITIALIZER_CIDLEN(my_conn, 8); +#if !defined(NDEBUG) && __GNUC__ +__attribute__((weak)) +#endif lsquic_conn_t * lsquic_stream_conn (const lsquic_stream_t *stream) { - return NULL; + return &my_conn; } @@ -461,6 +463,7 @@ test_priority (void) } + static void test_errors (void) { @@ -505,8 +508,8 @@ test_errors (void) }; lsquic_frame_writer_max_header_list_size(fw, 40); s = lsquic_frame_writer_write_headers(fw, 12345, &headers, 0, 80); - assert(-1 == s); - assert(EMSGSIZE == errno); + /* Server ignores SETTINGS_MAX_HEADER_LIST_SIZE setting */ + assert(s == 0); } lsquic_frame_writer_destroy(fw); @@ -596,6 +599,7 @@ perl tools/hpack.pl :method GET :path /index.html :authority www.example.com :sc } + int main (void) { diff --git a/test/unittests/test_goaway_gquic_be.c b/test/unittests/test_goaway_gquic_be.c index 35fec5628..acfe91064 100644 --- a/test/unittests/test_goaway_gquic_be.c +++ b/test/unittests/test_goaway_gquic_be.c @@ -9,7 +9,6 @@ #include "lsquic.h" #include "lsquic_types.h" -#include "lsquic_alarmset.h" #include "lsquic_parse.h" static const struct parse_funcs *const pf = select_pf_by_ver(LSQVER_039); @@ -20,7 +19,7 @@ struct goaway_parse_test { unsigned char buf[0x100]; size_t buf_len; uint32_t error_code; - uint32_t last_stream_id; + lsquic_stream_id_t last_stream_id; uint16_t reason_len; const char *reason; int retval; @@ -68,7 +67,7 @@ static const struct goaway_parse_test parse_tests[] = { struct goaway_gen_test { int lineno; uint32_t error_code; - uint32_t last_stream_id; + lsquic_stream_id_t last_stream_id; const char *reason; int retval; unsigned char buf[0x100]; @@ -130,7 +129,7 @@ run_parse_tests (void) for (test = parse_tests; test->buf[0]; ++test) { uint32_t error_code = ~0; - uint32_t last_stream_id = ~0; + lsquic_stream_id_t last_stream_id = ~0; uint16_t reason_len = ~0; const char *reason; int sz = pf->pf_parse_goaway_frame(test->buf, test->buf_len, diff --git a/test/unittests/test_h3_framing.c b/test/unittests/test_h3_framing.c new file mode 100644 index 000000000..4f511ea4d --- /dev/null +++ b/test/unittests/test_h3_framing.c @@ -0,0 +1,752 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * test_h3_framing.c -- test generation of H3 frames + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef WIN32 +#include +#else +#include +#endif + +#include "lsquic.h" + +#include "lsquic_packet_common.h" +#include "lsquic_packet_ietf.h" +#include "lsquic_alarmset.h" +#include "lsquic_packet_in.h" +#include "lsquic_conn_flow.h" +#include "lsquic_rtt.h" +#include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" +#include "lsquic_stream.h" +#include "lsquic_types.h" +#include "lsquic_malo.h" +#include "lsquic_mm.h" +#include "lsquic_conn_public.h" +#include "lsquic_logger.h" +#include "lsquic_parse.h" +#include "lsquic_conn.h" +#include "lsquic_engine_public.h" +#include "lsquic_cubic.h" +#include "lsquic_pacer.h" +#include "lsquic_senhist.h" +#include "lsquic_bw_sampler.h" +#include "lsquic_minmax.h" +#include "lsquic_bbr.h" +#include "lsquic_send_ctl.h" +#include "lsquic_ver_neg.h" +#include "lsquic_packet_out.h" +#include "lsquic_enc_sess.h" +#include "lsqpack.h" +#include "lsquic_frab_list.h" +#include "lsquic_qenc_hdl.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_data_in_if.h" +#include "lsquic_h3_prio.h" + +static const struct parse_funcs *g_pf = select_pf_by_ver(LSQVER_ID22); + +struct test_ctl_settings +{ + int tcs_schedule_stream_packets_immediately; + int tcs_have_delayed_packets; + unsigned tcs_can_send; + enum buf_packet_type + tcs_bp_type; + enum packno_bits + tcs_guess_packno_bits, + tcs_calc_packno_bits; +}; + + +static struct test_ctl_settings g_ctl_settings; + + +static void +init_buf (void *buf, size_t sz); + + +/* Set values to default */ +static void +init_test_ctl_settings (struct test_ctl_settings *settings) +{ + settings->tcs_schedule_stream_packets_immediately = 1; + settings->tcs_have_delayed_packets = 0; + settings->tcs_can_send = UINT_MAX; + settings->tcs_bp_type = BPT_HIGHEST_PRIO; + settings->tcs_guess_packno_bits = PACKNO_BITS_1; + settings->tcs_calc_packno_bits = PACKNO_BITS_1; +} + + +enum packno_bits +lsquic_send_ctl_calc_packno_bits (struct lsquic_send_ctl *ctl) +{ + return g_ctl_settings.tcs_calc_packno_bits; +} + + +int +lsquic_send_ctl_schedule_stream_packets_immediately (struct lsquic_send_ctl *ctl) +{ + return g_ctl_settings.tcs_schedule_stream_packets_immediately; +} + + +int +lsquic_send_ctl_have_delayed_packets (const struct lsquic_send_ctl *ctl) +{ + return g_ctl_settings.tcs_have_delayed_packets; +} + + +int +lsquic_send_ctl_can_send (struct lsquic_send_ctl *ctl) +{ + return ctl->sc_n_scheduled < g_ctl_settings.tcs_can_send; +} + + +enum packno_bits +lsquic_send_ctl_guess_packno_bits (struct lsquic_send_ctl *ctl) +{ + return g_ctl_settings.tcs_guess_packno_bits; +} + + +enum buf_packet_type +lsquic_send_ctl_determine_bpt (struct lsquic_send_ctl *ctl, + const struct lsquic_stream *stream) +{ + return g_ctl_settings.tcs_bp_type; +} + + +/* This function is only here to avoid crash in the test: */ +void +lsquic_engine_add_conn_to_tickable (struct lsquic_engine_public *enpub, + lsquic_conn_t *conn) +{ +} + + +static unsigned n_closed; +static enum stream_ctor_flags stream_ctor_flags = + SCF_CALL_ON_NEW|SCF_DI_AUTOSWITCH; + +struct test_ctx { + lsquic_stream_t *stream; +}; + + +static lsquic_stream_ctx_t * +on_new_stream (void *stream_if_ctx, lsquic_stream_t *stream) +{ + struct test_ctx *test_ctx = stream_if_ctx; + test_ctx->stream = stream; + return NULL; +} + + +static void +on_close (lsquic_stream_t *stream, lsquic_stream_ctx_t *st_h) +{ + ++n_closed; +} + + +const struct lsquic_stream_if stream_if = { + .on_new_stream = on_new_stream, + .on_close = on_close, +}; + + +static size_t +read_from_scheduled_packets (lsquic_send_ctl_t *send_ctl, lsquic_stream_id_t stream_id, + unsigned char *const begin, size_t bufsz, uint64_t first_offset, int *p_fin, + int fullcheck) +{ + const struct parse_funcs *const pf_local = send_ctl->sc_conn_pub->lconn->cn_pf; + unsigned char *p = begin; + unsigned char *const end = p + bufsz; + const struct stream_rec *srec; + struct packet_out_srec_iter posi; + struct lsquic_packet_out *packet_out; + struct stream_frame frame; + enum quic_frame_type expected_type; + int len, fin = 0; + + expected_type = QUIC_FRAME_STREAM; + + TAILQ_FOREACH(packet_out, &send_ctl->sc_scheduled_packets, po_next) + for (srec = posi_first(&posi, packet_out); srec; + srec = posi_next(&posi)) + { + if (fullcheck) + { + assert(srec->sr_frame_type == expected_type); + if (0 && packet_out->po_packno != 1) + { + /* First packet may contain two stream frames, do not + * check it. + */ + assert(!posi_next(&posi)); + if (TAILQ_NEXT(packet_out, po_next)) + { + assert(packet_out->po_data_sz == packet_out->po_n_alloc); + assert(srec->sr_len == packet_out->po_data_sz); + } + } + } + if (srec->sr_frame_type == expected_type && + srec->sr_stream->id == stream_id) + { + assert(!fin); + if (QUIC_FRAME_STREAM == expected_type) + len = pf_local->pf_parse_stream_frame(packet_out->po_data + srec->sr_off, + packet_out->po_data_sz - srec->sr_off, &frame); + else + len = pf_local->pf_parse_crypto_frame(packet_out->po_data + srec->sr_off, + packet_out->po_data_sz - srec->sr_off, &frame); + assert(len > 0); + if (QUIC_FRAME_STREAM == expected_type) + assert(frame.stream_id == srec->sr_stream->id); + else + assert(frame.stream_id == ~0ULL); + /* Otherwise not enough to copy to: */ + assert(end - p >= frame.data_frame.df_size); + /* Checks offset ordering: */ + assert(frame.data_frame.df_offset == + first_offset + (uintptr_t) (p - begin)); + if (frame.data_frame.df_fin) + { + assert(!fin); + fin = 1; + } + memcpy(p, packet_out->po_data + srec->sr_off + len - + frame.data_frame.df_size, frame.data_frame.df_size); + p += frame.data_frame.df_size; + } + } + + if (p_fin) + *p_fin = fin; + return p + bufsz - end; +} + + +static struct test_ctx test_ctx; + + +struct test_objs { + struct lsquic_engine_public eng_pub; + struct lsquic_conn lconn; + struct lsquic_conn_public conn_pub; + struct lsquic_send_ctl send_ctl; + struct lsquic_alarmset alset; + void *stream_if_ctx; + struct ver_neg ver_neg; + const struct lsquic_stream_if * + stream_if; + unsigned initial_stream_window; + enum stream_ctor_flags ctor_flags; + struct qpack_enc_hdl qeh; +}; + + +static int +unit_test_doesnt_write_ack (struct lsquic_conn *lconn) +{ + return 0; +} + + +static struct network_path network_path; + +static struct network_path * +get_network_path (struct lsquic_conn *lconn, const struct sockaddr *sa) +{ + return &network_path; +} + + +static const struct conn_iface our_conn_if = +{ + .ci_can_write_ack = unit_test_doesnt_write_ack, + .ci_get_path = get_network_path, +}; + + +static void +init_test_objs (struct test_objs *tobjs, unsigned initial_conn_window, + unsigned initial_stream_window, unsigned short packet_sz) +{ + int s; + memset(tobjs, 0, sizeof(*tobjs)); + LSCONN_INITIALIZE(&tobjs->lconn); + tobjs->lconn.cn_pf = g_pf; + tobjs->lconn.cn_version = LSQVER_ID22; + tobjs->lconn.cn_esf_c = &lsquic_enc_session_common_ietf_v1; + network_path.np_pack_size = packet_sz; + tobjs->lconn.cn_if = &our_conn_if; + lsquic_mm_init(&tobjs->eng_pub.enp_mm); + TAILQ_INIT(&tobjs->conn_pub.sending_streams); + TAILQ_INIT(&tobjs->conn_pub.read_streams); + TAILQ_INIT(&tobjs->conn_pub.write_streams); + TAILQ_INIT(&tobjs->conn_pub.service_streams); + lsquic_cfcw_init(&tobjs->conn_pub.cfcw, &tobjs->conn_pub, + initial_conn_window); + lsquic_conn_cap_init(&tobjs->conn_pub.conn_cap, initial_conn_window); + lsquic_alarmset_init(&tobjs->alset, 0); + tobjs->conn_pub.mm = &tobjs->eng_pub.enp_mm; + tobjs->conn_pub.lconn = &tobjs->lconn; + tobjs->conn_pub.enpub = &tobjs->eng_pub; + tobjs->conn_pub.send_ctl = &tobjs->send_ctl; + tobjs->conn_pub.packet_out_malo = + lsquic_malo_create(sizeof(struct lsquic_packet_out)); + tobjs->conn_pub.path = &network_path; + tobjs->initial_stream_window = initial_stream_window; + lsquic_send_ctl_init(&tobjs->send_ctl, &tobjs->alset, &tobjs->eng_pub, + &tobjs->ver_neg, &tobjs->conn_pub, 0); + tobjs->stream_if = &stream_if; + tobjs->stream_if_ctx = &test_ctx; + tobjs->ctor_flags = stream_ctor_flags; + if ((1 << tobjs->lconn.cn_version) & LSQUIC_IETF_VERSIONS) + { + lsquic_qeh_init(&tobjs->qeh, &tobjs->lconn); + s = lsquic_qeh_settings(&tobjs->qeh, 0, 0, 0, 0); + assert(0 == s); + tobjs->conn_pub.u.ietf.qeh = &tobjs->qeh; + } + if (tobjs->ctor_flags & SCF_IETF) + tobjs->conn_pub.u.ietf.prio_tree + = lsquic_prio_tree_new(&tobjs->lconn, 0); +} + + +static void +deinit_test_objs (struct test_objs *tobjs) +{ + assert(!lsquic_malo_first(tobjs->eng_pub.enp_mm.malo.stream_frame)); + lsquic_send_ctl_cleanup(&tobjs->send_ctl); + lsquic_malo_destroy(tobjs->conn_pub.packet_out_malo); + lsquic_mm_cleanup(&tobjs->eng_pub.enp_mm); + if ((1 << tobjs->lconn.cn_version) & LSQUIC_IETF_VERSIONS) + lsquic_qeh_cleanup(&tobjs->qeh); + if (tobjs->ctor_flags & SCF_IETF) + lsquic_prio_tree_destroy(tobjs->conn_pub.u.ietf.prio_tree); +} + + +static struct lsquic_stream * +new_stream (struct test_objs *tobjs, unsigned stream_id, uint64_t send_off) +{ + return lsquic_stream_new(stream_id, &tobjs->conn_pub, tobjs->stream_if, + tobjs->stream_if_ctx, tobjs->initial_stream_window, send_off, + tobjs->ctor_flags); +} + + +struct packetization_test_stream_ctx +{ + const unsigned char *buf; + unsigned len, off, write_size; + int flush_after_each_write; +}; + + +static lsquic_stream_ctx_t * +packetization_on_new_stream (void *stream_if_ctx, lsquic_stream_t *stream) +{ + lsquic_stream_wantwrite(stream, 1); + return stream_if_ctx; +} + + +static void +packetization_on_close (lsquic_stream_t *stream, lsquic_stream_ctx_t *st_h) +{ +} + + +#define RANDOM_WRITE_SIZE ~0U + +static unsigned +calc_n_to_write (unsigned write_size) +{ + if (write_size == RANDOM_WRITE_SIZE) + return rand() % 1000 + 1; + else + return write_size; +} + + +static void +packetization_write_as_much_as_you_can (lsquic_stream_t *stream, + lsquic_stream_ctx_t *ctx) +{ + struct packetization_test_stream_ctx *const pack_ctx = (void *) ctx; + unsigned n_to_write; + ssize_t n_written; + int s; + + while (pack_ctx->off < pack_ctx->len) + { + n_to_write = calc_n_to_write(pack_ctx->write_size); + if (n_to_write > pack_ctx->len - pack_ctx->off) + n_to_write = pack_ctx->len - pack_ctx->off; + n_written = lsquic_stream_write(stream, pack_ctx->buf + pack_ctx->off, + n_to_write); + if (n_written == 0) + break; + pack_ctx->off += n_written; + if (pack_ctx->flush_after_each_write) + { + s = lsquic_stream_flush(stream); + assert(s == 0); + } + } + + s = lsquic_stream_flush(stream); + assert(s == 0); + lsquic_stream_wantwrite(stream, 0); +} + + +static void +packetization_perform_one_write (lsquic_stream_t *stream, + lsquic_stream_ctx_t *ctx) +{ + struct packetization_test_stream_ctx *const pack_ctx = (void *) ctx; + unsigned n_to_write; + ssize_t n_written; + int s; + + n_to_write = calc_n_to_write(pack_ctx->write_size); + if (n_to_write > pack_ctx->len - pack_ctx->off) + n_to_write = pack_ctx->len - pack_ctx->off; + n_written = lsquic_stream_write(stream, pack_ctx->buf + pack_ctx->off, + n_to_write); + assert(n_written >= 0); + pack_ctx->off += n_written; + if (pack_ctx->flush_after_each_write) + { + s = lsquic_stream_flush(stream); + assert(s == 0); + } + if (n_written == 0) + lsquic_stream_wantwrite(stream, 0); +} + + +static const struct lsquic_stream_if packetization_inside_once_stream_if = { + .on_new_stream = packetization_on_new_stream, + .on_close = packetization_on_close, + .on_write = packetization_write_as_much_as_you_can, +}; + + +static const struct lsquic_stream_if packetization_inside_many_stream_if = { + .on_new_stream = packetization_on_new_stream, + .on_close = packetization_on_close, + .on_write = packetization_perform_one_write, +}; + + +static void +test_hq_framing (int sched_immed, int dispatch_once, unsigned wsize, + int flush_after_each_write, size_t conn_limit, + unsigned n_packets, unsigned short packet_sz) +{ + struct test_objs tobjs; + struct lsquic_stream *stream; + size_t nw; + int fin, s; + unsigned char *buf_in, *buf_out; + const size_t buf_in_sz = 0x40000, buf_out_sz = 0x500000; + + /* We'll write headers first after which stream will switch to using + * data-framing writer. This is simply so that we don't have to + * expose more stream things only for testing. + */ + struct lsquic_http_header header = { + .name = { ":method", 7, }, + .value = { "GET", 3, }, + }; + struct lsquic_http_headers headers = { 1, &header, }; + + buf_in = malloc(buf_in_sz); + buf_out = malloc(buf_out_sz); + assert(buf_in && buf_out); + + struct packetization_test_stream_ctx packet_stream_ctx = + { + .buf = buf_in, + .off = 0, + .len = buf_in_sz, + .write_size = wsize, + .flush_after_each_write = flush_after_each_write, + }; + + init_buf(buf_in, buf_in_sz); + + init_test_ctl_settings(&g_ctl_settings); + g_ctl_settings.tcs_schedule_stream_packets_immediately = sched_immed; + + stream_ctor_flags |= SCF_IETF; + init_test_objs(&tobjs, conn_limit ? conn_limit : buf_out_sz, buf_out_sz, packet_sz); + tobjs.stream_if_ctx = &packet_stream_ctx; + tobjs.ctor_flags |= SCF_HTTP|SCF_IETF; + if (sched_immed) + { + g_ctl_settings.tcs_can_send = n_packets; + if (dispatch_once) + { + tobjs.stream_if = &packetization_inside_once_stream_if; + tobjs.ctor_flags |= SCF_DISP_RW_ONCE; + } + else + tobjs.stream_if = &packetization_inside_many_stream_if; + } + else + { + lsquic_send_ctl_set_max_bpq_count(n_packets); + g_ctl_settings.tcs_can_send = INT_MAX; + /* Need this for on_new_stream() callback not to mess with + * the context, otherwise this is not used. + */ + tobjs.stream_if = &packetization_inside_many_stream_if; + } + + stream = new_stream(&tobjs, 0, buf_out_sz); + + s = lsquic_stream_send_headers(stream, &headers, 0); + assert(0 == s); + + if (sched_immed) + { + lsquic_stream_dispatch_write_events(stream); + lsquic_stream_flush(stream); + } + else + { + packetization_write_as_much_as_you_can(stream, + (void *) &packet_stream_ctx); + g_ctl_settings.tcs_schedule_stream_packets_immediately = 1; + lsquic_send_ctl_schedule_buffered(&tobjs.send_ctl, BPT_HIGHEST_PRIO); + g_ctl_settings.tcs_schedule_stream_packets_immediately = 0; + } + lsquic_send_ctl_set_max_bpq_count(10); + + /* Verify written data: */ + nw = read_from_scheduled_packets(&tobjs.send_ctl, 0, buf_out, buf_out_sz, + 0, &fin, 1); + if (!conn_limit) + assert(nw > buf_in_sz); + { /* Remove framing and verify contents */ + const unsigned char *src; + unsigned char *dst; + uint64_t sz; + unsigned frame_type; + int s; + + src = buf_out; + dst = buf_out; + while (src < buf_out + nw) + { + frame_type = *src++; + s = vint_read(src, buf_out + buf_out_sz, &sz); + assert(s > 0); + assert(sz > 0); + assert(sz < (1 << 14)); + src += s; + if (src == buf_out + s + 1) + { + /* Ignore headers */ + assert(frame_type == HQFT_HEADERS); + src += sz; + } + else + { + assert(frame_type == HQFT_DATA); + if (src + sz > buf_out + nw) /* Chopped DATA frame (last) */ + sz = buf_out + nw - src; + memmove(dst, src, sz); + dst += sz; + src += sz; + } + } + if (!conn_limit) + assert(buf_in_sz == (uintptr_t) dst - (uintptr_t) buf_out); + assert(0 == memcmp(buf_in, buf_out, (uintptr_t) dst - (uintptr_t) buf_out)); + } + + lsquic_stream_destroy(stream); + deinit_test_objs(&tobjs); + free(buf_in); + free(buf_out); + + stream_ctor_flags &= ~SCF_IETF; +} + + +static void +main_test_hq_framing (void) +{ + const unsigned wsizes[] = { 1, 2, 3, 7, 10, 50, 100, 201, 211, 1000, 2003, 20000, }; + const size_t conn_limits[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 30, 31, 32, 33, 63, 64, 128, 200, 255, + 256, 512, 1024, 2045, 2048, 2049, 3000, 4091, 4096, 4097, 5000, 8192, + 16 * 1024 - 1, 16 * 1024, 32 * 1024, 33 * 1024, }; + const unsigned n_packets[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100, UINT_MAX, }; + const unsigned short packet_sz[] = { 1252, 1370, 0x1000, 0xFF00, }; + unsigned i, j, k, l; + int sched_immed, dispatch_once, flush_after_each_write; + + for (sched_immed = 0; sched_immed <= 1; ++sched_immed) + for (dispatch_once = 0; dispatch_once <= 1; ++dispatch_once) + for (i = 0; i < sizeof(wsizes) / sizeof(wsizes[i]); ++i) + for (j = 0; j < sizeof(conn_limits) / sizeof(conn_limits[j]); ++j) + for (flush_after_each_write = 0; flush_after_each_write < 2; ++flush_after_each_write) + for (k = 0; k < sizeof(n_packets) / sizeof(n_packets[0]); ++k) + for (l = 0; l < sizeof(packet_sz) / sizeof(packet_sz[0]); ++l) + test_hq_framing(sched_immed, dispatch_once, wsizes[i], flush_after_each_write, conn_limits[j], n_packets[k], packet_sz[l]); +} + + +int +main (int argc, char **argv) +{ + int opt; + + lsquic_global_init(LSQUIC_GLOBAL_SERVER); + + while (-1 != (opt = getopt(argc, argv, "l:"))) + { + switch (opt) + { + case 'l': + lsquic_log_to_fstream(stderr, 0); + lsquic_logger_lopt(optarg); + break; + default: + exit(1); + } + } + + init_test_ctl_settings(&g_ctl_settings); + + main_test_hq_framing(); + + return 0; +} + +static const char on_being_idle[] = +"ON BEING IDLE." +"" +"Now, this is a subject on which I flatter myself I really am _au fait_." +"The gentleman who, when I was young, bathed me at wisdom's font for nine" +"guineas a term--no extras--used to say he never knew a boy who could" +"do less work in more time; and I remember my poor grandmother once" +"incidentally observing, in the course of an instruction upon the use" +"of the Prayer-book, that it was highly improbable that I should ever do" +"much that I ought not to do, but that she felt convinced beyond a doubt" +"that I should leave undone pretty well everything that I ought to do." +"" +"I am afraid I have somewhat belied half the dear old lady's prophecy." +"Heaven help me! I have done a good many things that I ought not to have" +"done, in spite of my laziness. But I have fully confirmed the accuracy" +"of her judgment so far as neglecting much that I ought not to have" +"neglected is concerned. Idling always has been my strong point. I take" +"no credit to myself in the matter--it is a gift. Few possess it. There" +"are plenty of lazy people and plenty of slow-coaches, but a genuine" +"idler is a rarity. He is not a man who slouches about with his hands in" +"his pockets. On the contrary, his most startling characteristic is that" +"he is always intensely busy." +"" +"It is impossible to enjoy idling thoroughly unless one has plenty of" +"work to do. There is no fun in doing nothing when you have nothing to" +"do. Wasting time is merely an occupation then, and a most exhausting" +"one. Idleness, like kisses, to be sweet must be stolen." +"" +"Many years ago, when I was a young man, I was taken very ill--I never" +"could see myself that much was the matter with me, except that I had" +"a beastly cold. But I suppose it was something very serious, for the" +"doctor said that I ought to have come to him a month before, and that" +"if it (whatever it was) had gone on for another week he would not have" +"answered for the consequences. It is an extraordinary thing, but I" +"never knew a doctor called into any case yet but what it transpired" +"that another day's delay would have rendered cure hopeless. Our medical" +"guide, philosopher, and friend is like the hero in a melodrama--he" +"always comes upon the scene just, and only just, in the nick of time. It" +"is Providence, that is what it is." +"" +"Well, as I was saying, I was very ill and was ordered to Buxton for a" +"month, with strict injunctions to do nothing whatever all the while" +"that I was there. \"Rest is what you require,\" said the doctor, \"perfect" +"rest.\"" +"" +"It seemed a delightful prospect. \"This man evidently understands my" +"complaint,\" said I, and I pictured to myself a glorious time--a four" +"weeks' _dolce far niente_ with a dash of illness in it. Not too much" +"illness, but just illness enough--just sufficient to give it the flavor" +"of suffering and make it poetical. I should get up late, sip chocolate," +"and have my breakfast in slippers and a dressing-gown. I should lie out" +"in the garden in a hammock and read sentimental novels with a melancholy" +"ending, until the books should fall from my listless hand, and I should" +"recline there, dreamily gazing into the deep blue of the firmament," +"watching the fleecy clouds floating like white-sailed ships across" +"its depths, and listening to the joyous song of the birds and the low" +"rustling of the trees. Or, on becoming too weak to go out of doors," +"I should sit propped up with pillows at the open window of the" +"ground-floor front, and look wasted and interesting, so that all the" +"pretty girls would sigh as they passed by." +"" +"And twice a day I should go down in a Bath chair to the Colonnade to" +"drink the waters. Oh, those waters! I knew nothing about them then," +"and was rather taken with the idea. \"Drinking the waters\" sounded" +"fashionable and Queen Anne-fied, and I thought I should like them. But," +"ugh! after the first three or four mornings! Sam Weller's description of" +"them as \"having a taste of warm flat-irons\" conveys only a faint idea of" +"their hideous nauseousness. If anything could make a sick man get well" +"quickly, it would be the knowledge that he must drink a glassful of them" +"every day until he was recovered. I drank them neat for six consecutive" +"days, and they nearly killed me; but after then I adopted the plan of" +"taking a stiff glass of brandy-and-water immediately on the top of them," +"and found much relief thereby. I have been informed since, by various" +"eminent medical gentlemen, that the alcohol must have entirely" +"counteracted the effects of the chalybeate properties contained in the" +"water. I am glad I was lucky enough to hit upon the right thing." +; + +static void +init_buf (void *buf, size_t sz) +{ + unsigned char *p = buf; + unsigned char *const end = (unsigned char*)buf + sz; + size_t n; + + while (p < end) + { + n = end - p; + if (sizeof(on_being_idle) - 1 < n) + n = sizeof(on_being_idle) - 1; + memcpy(p, on_being_idle, n); + p +=n; + } + + assert(p == end); +} diff --git a/test/unittests/test_h3_prio.c b/test/unittests/test_h3_prio.c new file mode 100644 index 000000000..2264aebc4 --- /dev/null +++ b/test/unittests/test_h3_prio.c @@ -0,0 +1,977 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#include +#include +#include + +#include "lsquic.h" +#include "lsquic_types.h" +#include "lsquic_int_types.h" +#include "lsquic_hash.h" +#include "lsquic_conn.h" +#include "lsquic_h3_prio.h" +#include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" +#include "lsquic_stream.h" + + +static struct conn_cid_elem cces[1] = {{ .cce_cid = { .len = 8, }, }}; +static struct lsquic_conn s_conn = { .cn_cces = cces, .cn_cces_mask = 1, }; + +static struct lsquic_stream s_streams[20]; +static struct lsquic_stream *s_next_stream; + +struct set_rel_args +{ + enum h3_elem_type parent_type; + uint64_t parent_id; + enum h3_elem_type child_type; + uint64_t child_id; + h3_weight_t child_weight; +}; + +#define EXP_ARGS(ra) (ra)->child_type, (ra)->child_id, (ra)->child_weight, \ + (ra)->parent_type, (ra)->parent_id + +struct add_stream_args +{ + enum h3_elem_type parent_type; + uint64_t parent_id; + h3_weight_t weight; +}; + +#define EXP_ADD_STREAM_ARGS(a) stream, (a)->parent_type, (a)->parent_id, \ + (a)->weight + +struct remove_stream_args +{ + struct lsquic_stream *stream; + lsquic_time_t now; +}; + +#define EXP_REMOVE_STREAM_ARGS(a) stream, (a)->now + +struct prune_args +{ + lsquic_time_t cutoff; +}; + +#define EXP_PRUNE_ARGS(a) (a)->cutoff + +enum tree_test_id { + TEST_ID_UNSPECIFIED, + TEST_ID_RFC7540_EXAMPLE, + TEST_ID_PRE_PRUNE, + TEST_ID_SIMPLE_TREE_1, + TEST_ID_PRUNE, + TEST_ID_TOP_LEVEL_PLACEHOLDERS, +}; + +struct step +{ + enum { + LAST_STEP = 0, + REPLAY_TEST, + CALL_SET_REL, + CALL_ADD_STREAM, + CALL_REMOVE_STREAM, + CALL_PRUNE, + } call; + int retval; + union { + struct set_rel_args set_rel; + struct add_stream_args add_stream; + struct remove_stream_args remove_stream; + struct prune_args prune; + enum tree_test_id test_id; + } args; + union { + struct { + lsquic_stream_id_t stream_id; + } add_stream; + struct { + lsquic_stream_id_t stream_id; + } remove_stream; + } ctx; + const char *result; /* Optional */ +}; + +struct tree_test +{ + int lineno; + enum tree_test_id test_id; + unsigned n_placeholders; + struct step steps[20]; + const char *result; /* Optional */ +}; + +static const struct tree_test tree_tests[] = +{ + { + .lineno = __LINE__, + .result = "(t: R; id: 0; w: 0)", + }, + + { + .lineno = __LINE__, + .test_id = TEST_ID_SIMPLE_TREE_1, + .n_placeholders = 20, + .steps = { + { + .call = CALL_SET_REL, + .args.set_rel = { H3ET_ROOT, 0, H3ET_REQ_STREAM, 1, 22, }, + .result = "(t: R; id: 0; w: 0; c: [(t: Q; id: 1; w: 22)])", + }, + { + .call = CALL_ADD_STREAM, + .args.add_stream = { .parent_type = H3ET_ROOT, .parent_id = 0, .weight = 77, }, + .ctx.add_stream.stream_id = 1, + .result = "(t: R; id: 0; w: 0; c: [(t: Q; id: 1; w: 22)])", + }, + { + .call = CALL_ADD_STREAM, + .args.add_stream = { .parent_type = H3ET_ROOT, .parent_id = 0, .weight = 77, }, + .ctx.add_stream.stream_id = 1, + .retval = -1, + }, + { + .call = CALL_SET_REL, + .args.set_rel = { H3ET_ROOT, 0, H3ET_REQ_STREAM, 1, 23, }, + .result = "(t: R; id: 0; w: 0; c: [(t: Q; id: 1; w: 23)])", + }, + { + .call = CALL_SET_REL, + .args.set_rel = { H3ET_PLACEHOLDER, 0, H3ET_REQ_STREAM, 1, 23, }, + .result = "(t: R; id: 0; w: 0; c: [" + "(t: H; id: 0; w: 240; c: [" + "(t: Q; id: 1; w: 23)" + "])" + "])", + }, + { + .call = CALL_ADD_STREAM, + .args.add_stream = { .parent_type = H3ET_PLACEHOLDER, .parent_id = 0, .weight = 77, }, + .ctx.add_stream.stream_id = 2, + .result = "(t: R; id: 0; w: 0; c: [" + "(t: H; id: 0; w: 240; c: [" + "(t: P; id: 2; w: 77)," + "(t: Q; id: 1; w: 23)" + "])" + "])", + }, + { + .call = CALL_SET_REL, + .args.set_rel = { H3ET_REQ_STREAM, 1, H3ET_PUSH_STREAM, 2, 77, }, + .result = "(t: R; id: 0; w: 0; c: [" + "(t: H; id: 0; w: 240; c: [" + "(t: Q; id: 1; w: 23; c: [" + "(t: P; id: 2; w: 77)" + "])" + "])" + "])", + }, + { + .call = CALL_SET_REL, + .args.set_rel = { H3ET_REQ_STREAM, 1, H3ET_PLACEHOLDER, 2, 77, }, + .result = "(t: R; id: 0; w: 0; c: [" + "(t: H; id: 0; w: 240; c: [" + "(t: Q; id: 1; w: 23; c: [" + "(t: H; id: 2; w: 77)," + "(t: P; id: 2; w: 77)" + "])" + "])" + "])", + }, + { + .call = CALL_SET_REL, + .args.set_rel = { H3ET_PLACEHOLDER, 0, H3ET_PUSH_STREAM, 3, 100, }, + .result = "(t: R; id: 0; w: 0; c: [" + "(t: H; id: 0; w: 240; c: [" + "(t: P; id: 3; w: 100)," + "(t: Q; id: 1; w: 23; c: [" + "(t: H; id: 2; w: 77)," + "(t: P; id: 2; w: 77)" + "])" + "])" + "])", + }, + }, + }, + + { + .lineno = __LINE__, + .n_placeholders = 20, + .steps = { + { + .call = REPLAY_TEST, + .args.test_id = TEST_ID_SIMPLE_TREE_1, + }, + { + .call = CALL_REMOVE_STREAM, + .args.remove_stream = { .now = 100, }, + .ctx.remove_stream.stream_id = 2, + }, + { + .call = CALL_REMOVE_STREAM, + .args.remove_stream = { .now = 100, }, + .ctx.remove_stream.stream_id = 2, + .retval = -1, + }, + { + .call = CALL_PRUNE, + .args.prune = { .cutoff = 101, }, + .result = "(t: R; id: 0; w: 0; c: [" + "(t: H; id: 0; w: 240; c: [" + "(t: P; id: 3; w: 100)," + "(t: Q; id: 1; w: 23; c: [" + "(t: H; id: 2; w: 77)" + "])" + "])" + "])", + }, + }, + }, + +/* From RFC 7540, Section 5.3.3: + * + * If a stream is made dependent on one of its own dependencies, the + * formerly dependent stream is first moved to be dependent on the + * reprioritized stream's previous parent. The moved dependency retains + * its weight. + * + * For example, consider an original dependency tree where B and C + * depend on A, D and E depend on C, and F depends on D. If A is made + * dependent on D, then D takes the place of A. All other dependency + * relationships stay the same, except for F, which becomes dependent on + * A if the reprioritization is exclusive. + * + * x x x x + * | / \ | | + * A D A D D + * / \ / / \ / \ | + * B C ==> F B C ==> F A OR A + * / \ | / \ /|\ + * D E E B C B C F + * | | | + * F E E + * (intermediate) (non-exclusive) (exclusive) + * + * Figure 5: Example of Dependency Reordering + */ + { + .lineno = __LINE__, + .test_id = TEST_ID_RFC7540_EXAMPLE, + .steps = { + { + .call = CALL_SET_REL, + .args.set_rel = { H3ET_ROOT, 0, H3ET_REQ_STREAM, 'A', 0, }, + .result = "(t: R; id: 0; w: 0; c: [(t: Q; id: 65; w: 0)])", + }, + { + .call = CALL_SET_REL, + .args.set_rel = { H3ET_REQ_STREAM, 'A', H3ET_PUSH_STREAM, 'C', 0, }, + }, + { + .call = CALL_SET_REL, + .args.set_rel = { H3ET_REQ_STREAM, 'A', H3ET_PUSH_STREAM, 'B', 0, }, + .result = "(t: R; id: 0; w: 0; c: [" + "(t: Q; id: 65; w: 0; c: [" + "(t: P; id: 66; w: 0)," + "(t: P; id: 67; w: 0)" + "])" + "])", + }, + { + .call = CALL_SET_REL, + .args.set_rel = { H3ET_PUSH_STREAM, 'C', H3ET_REQ_STREAM, 'E', 0, }, + }, + { + .call = CALL_SET_REL, + .args.set_rel = { H3ET_PUSH_STREAM, 'C', H3ET_REQ_STREAM, 'D', 0, }, + }, + { + .call = CALL_SET_REL, + .args.set_rel = { H3ET_REQ_STREAM, 'D', H3ET_PUSH_STREAM, 'F', 0, }, + .result = "(t: R; id: 0; w: 0; c: [" + "(t: Q; id: 65; w: 0; c: [" + "(t: P; id: 66; w: 0)," + "(t: P; id: 67; w: 0; c: [" + "(t: Q; id: 68; w: 0; c: [" + "(t: P; id: 70; w: 0)" + "])," + "(t: Q; id: 69; w: 0)" + "])" + "])" + "])", + }, + /* + * Now that the state corresponds to the picture on the left, + * flip A and D. We want to have same structure as picture #3 + * (non-exclusive). The order of A and F is flipped, however, + * as new elements are inserted at the head of the child list. + */ + { + .call = CALL_SET_REL, + .args.set_rel = { H3ET_REQ_STREAM, 'D', H3ET_REQ_STREAM, 'A', 0, }, + .result = "(t: R; id: 0; w: 0; c: [" + "(t: Q; id: 68; w: 0; c: [" /* D */ + "(t: Q; id: 65; w: 0; c: [" /* A */ + "(t: P; id: 66; w: 0)," /* B */ + "(t: P; id: 67; w: 0; c: [" /* C */ + "(t: Q; id: 69; w: 0)" /* E */ + "])" + "])," + "(t: P; id: 70; w: 0)" /* F */ + "])" + "])", + }, + }, + }, + + { + .lineno = __LINE__, + .test_id = TEST_ID_PRE_PRUNE, + .steps = { + { + .call = REPLAY_TEST, + .args.test_id = TEST_ID_RFC7540_EXAMPLE, + .result = "(t: R; id: 0; w: 0; c: [" + "(t: Q; id: 68; w: 0; c: [" /* D */ + "(t: Q; id: 65; w: 0; c: [" /* A */ + "(t: P; id: 66; w: 0)," /* B */ + "(t: P; id: 67; w: 0; c: [" /* C */ + "(t: Q; id: 69; w: 0)" /* E */ + "])" + "])," + "(t: P; id: 70; w: 0)" /* F */ + "])" + "])", + }, + { + .call = CALL_ADD_STREAM, + .args.add_stream = { .parent_type = H3ET_ROOT, .parent_id = 0, .weight = 123, }, + .ctx.add_stream.stream_id = 71, + .result = "(t: R; id: 0; w: 0; c: [" + "(t: P; id: 71; w: 123)," + "(t: Q; id: 68; w: 0; c: [" /* D */ + "(t: Q; id: 65; w: 0; c: [" /* A */ + "(t: P; id: 66; w: 0)," /* B */ + "(t: P; id: 67; w: 0; c: [" /* C */ + "(t: Q; id: 69; w: 0)" /* E */ + "])" + "])," + "(t: P; id: 70; w: 0)" /* F */ + "])" + "])", + }, + { + .call = CALL_ADD_STREAM, + .args.add_stream = { .parent_type = H3ET_REQ_STREAM, .parent_id = 65, .weight = 29, }, + .ctx.add_stream.stream_id = 72, + }, + { + .call = CALL_ADD_STREAM, + .args.add_stream = { .parent_type = H3ET_REQ_STREAM, .parent_id = 68, .weight = 6, }, + .ctx.add_stream.stream_id = 73, + .result = "(t: R; id: 0; w: 0; c: [" + "(t: P; id: 71; w: 123)," + "(t: Q; id: 68; w: 0; c: [" /* D */ + "(t: Q; id: 73; w: 6)," + "(t: Q; id: 65; w: 0; c: [" /* A */ + "(t: Q; id: 72; w: 29)," + "(t: P; id: 66; w: 0)," /* B */ + "(t: P; id: 67; w: 0; c: [" /* C */ + "(t: Q; id: 69; w: 0)" /* E */ + "])" + "])," + "(t: P; id: 70; w: 0)" /* F */ + "])" + "])", + }, + { + .call = CALL_ADD_STREAM, + .args.add_stream = { .weight = 123, }, + .ctx.add_stream.stream_id = 65, + }, + { + .call = CALL_ADD_STREAM, + .args.add_stream = { .weight = 123, }, + .ctx.add_stream.stream_id = 66, + }, + { + .call = CALL_ADD_STREAM, + .args.add_stream = { .weight = 123, }, + .ctx.add_stream.stream_id = 67, + }, + { + .call = CALL_ADD_STREAM, + .args.add_stream = { .weight = 123, }, + .ctx.add_stream.stream_id = 68, + }, + { + .call = CALL_ADD_STREAM, + .args.add_stream = { .weight = 123, }, + .ctx.add_stream.stream_id = 69, + }, + { + .call = CALL_ADD_STREAM, + .args.add_stream = { .weight = 123, }, + .ctx.add_stream.stream_id = 70, + }, + }, + }, + + { + .lineno = __LINE__, + .test_id = TEST_ID_PRUNE, + .steps = { + { + .call = REPLAY_TEST, + .args.test_id = TEST_ID_PRE_PRUNE, + }, + { + .call = CALL_REMOVE_STREAM, + .args.remove_stream = { .now = 100, }, + .ctx.remove_stream.stream_id = 65, + }, + { + .call = CALL_PRUNE, + .args.prune = { .cutoff = 101, }, + .result = "(t: R; id: 0; w: 0; c: [" + "(t: P; id: 71; w: 123)," + "(t: Q; id: 68; w: 0; c: [" + "(t: Q; id: 73; w: 6)," + "(t: Q; id: 72; w: 29)," + "(t: P; id: 66; w: 0)," + "(t: P; id: 67; w: 0; c: [" + "(t: Q; id: 69; w: 0)" + "])," + "(t: P; id: 70; w: 0)" + "])" + "])", + }, + { + .call = CALL_REMOVE_STREAM, + .args.remove_stream = { .now = 200, }, + .ctx.remove_stream.stream_id = 66, + }, + { + .call = CALL_REMOVE_STREAM, + .args.remove_stream = { .now = 210, }, + .ctx.remove_stream.stream_id = 67, + }, + { + .call = CALL_REMOVE_STREAM, + .args.remove_stream = { .now = 220, }, + .ctx.remove_stream.stream_id = 73, + .result = "(t: R; id: 0; w: 0; c: [" + "(t: P; id: 71; w: 123)," + "(t: Q; id: 68; w: 0; c: [" + "(t: Q; id: 73; w: 6)," + "(t: Q; id: 72; w: 29)," + "(t: P; id: 66; w: 0)," + "(t: P; id: 67; w: 0; c: [" + "(t: Q; id: 69; w: 0)" + "])," + "(t: P; id: 70; w: 0)" + "])" + "])", + }, + { + .call = CALL_PRUNE, + .args.prune = { .cutoff = 201, }, + .result = "(t: R; id: 0; w: 0; c: [" + "(t: P; id: 71; w: 123)," + "(t: Q; id: 68; w: 0; c: [" + "(t: Q; id: 73; w: 6)," + "(t: Q; id: 72; w: 29)," + "(t: P; id: 67; w: 0; c: [" + "(t: Q; id: 69; w: 0)" + "])," + "(t: P; id: 70; w: 0)" + "])" + "])", + }, + { + .call = CALL_PRUNE, + .args.prune = { .cutoff = 211, }, + .result = "(t: R; id: 0; w: 0; c: [" + "(t: P; id: 71; w: 123)," + "(t: Q; id: 68; w: 0; c: [" + "(t: Q; id: 73; w: 6)," + "(t: Q; id: 72; w: 29)," + "(t: Q; id: 69; w: 0)," + "(t: P; id: 70; w: 0)" + "])" + "])", + }, + { + .call = CALL_PRUNE, + .args.prune = { .cutoff = 225, }, + .result = "(t: R; id: 0; w: 0; c: [" + "(t: P; id: 71; w: 123)," + "(t: Q; id: 68; w: 0; c: [" + "(t: Q; id: 72; w: 29)," + "(t: Q; id: 69; w: 0)," + "(t: P; id: 70; w: 0)" + "])" + "])", + }, + { + .call = CALL_REMOVE_STREAM, + .args.remove_stream = { .now = 230, }, + .ctx.remove_stream.stream_id = 71, + }, + { + .call = CALL_PRUNE, + .args.prune = { .cutoff = 235, }, + .result = "(t: R; id: 0; w: 0; c: [" + "(t: Q; id: 68; w: 0; c: [" + "(t: Q; id: 72; w: 29)," + "(t: Q; id: 69; w: 0)," + "(t: P; id: 70; w: 0)" + "])" + "])", + }, + { + .call = CALL_REMOVE_STREAM, + .args.remove_stream = { .now = 240, }, + .ctx.remove_stream.stream_id = 68, + }, + { + .call = CALL_PRUNE, + .args.prune = { .cutoff = 245, }, + .result = "(t: R; id: 0; w: 0; c: [" + "(t: Q; id: 72; w: 29)," + "(t: Q; id: 69; w: 0)," + "(t: P; id: 70; w: 0)" + "])", + }, + }, + }, + + { + .lineno = __LINE__, + .n_placeholders = 20, + .steps = { + { + .call = REPLAY_TEST, + .args.test_id = TEST_ID_RFC7540_EXAMPLE, + }, + { + /* Test adding stream that depends on an non-existent + * placeholder + */ + .call = CALL_ADD_STREAM, + .args.add_stream = { .parent_type = H3ET_PLACEHOLDER, .parent_id = 9, .weight = 33, }, + .ctx.add_stream.stream_id = 71, + .result = "(t: R; id: 0; w: 0; c: [" + "(t: H; id: 9; w: 240; c: [" + "(t: P; id: 71; w: 33)" + "])," + "(t: Q; id: 68; w: 0; c: [" /* D */ + "(t: Q; id: 65; w: 0; c: [" /* A */ + "(t: P; id: 66; w: 0)," /* B */ + "(t: P; id: 67; w: 0; c: [" /* C */ + "(t: Q; id: 69; w: 0)" /* E */ + "])" + "])," + "(t: P; id: 70; w: 0)" /* F */ + "])" + "])", + }, + }, + }, + + { + .lineno = __LINE__, + .n_placeholders = 20, + .test_id = TEST_ID_TOP_LEVEL_PLACEHOLDERS, + .steps = { + { + .call = REPLAY_TEST, + .args.test_id = TEST_ID_RFC7540_EXAMPLE, + }, + { + .call = CALL_SET_REL, + .args.set_rel = { H3ET_PLACEHOLDER, 1, H3ET_REQ_STREAM, 68, 0, }, + .result = "(t: R; id: 0; w: 0; c: [" + "(t: H; id: 1; w: 240; c: [" + "(t: Q; id: 68; w: 0; c: [" /* D */ + "(t: Q; id: 65; w: 0; c: [" /* A */ + "(t: P; id: 66; w: 0)," /* B */ + "(t: P; id: 67; w: 0; c: [" /* C */ + "(t: Q; id: 69; w: 0)" /* E */ + "])" + "])," + "(t: P; id: 70; w: 0)" /* F */ + "])" + "])" + "])", + }, + { + .call = CALL_SET_REL, + .args.set_rel = { H3ET_PLACEHOLDER, 2, H3ET_PUSH_STREAM, 70, 0, }, + .result = "(t: R; id: 0; w: 0; c: [" + "(t: H; id: 2; w: 240; c: [" + "(t: P; id: 70; w: 0)" /* F */ + "])," + "(t: H; id: 1; w: 240; c: [" + "(t: Q; id: 68; w: 0; c: [" /* D */ + "(t: Q; id: 65; w: 0; c: [" /* A */ + "(t: P; id: 66; w: 0)," /* B */ + "(t: P; id: 67; w: 0; c: [" /* C */ + "(t: Q; id: 69; w: 0)" /* E */ + "])" + "])" + "])" + "])" + "])", + }, + }, + }, +}; + +struct iter_test +{ + int lineno; + enum tree_test_id tree_test_id; + unsigned n_streams; + lsquic_stream_id_t in[20], out[20]; +}; + +static const struct iter_test iter_tests[] = +{ + + { + .lineno = __LINE__, + .tree_test_id = TEST_ID_RFC7540_EXAMPLE, + .n_streams = 1, + .in = { 70, }, + .out = { 70, }, + }, + + /* 65 and 70 have the same parent and weight: so the iterator should + * return them in the order in which they were added to the iterator. + */ + { + .lineno = __LINE__, + .tree_test_id = TEST_ID_RFC7540_EXAMPLE, + .n_streams = 2, + .in = { 70, 65, }, + .out = { 70, 65, }, + }, + + { + .lineno = __LINE__, + .tree_test_id = TEST_ID_RFC7540_EXAMPLE, + .n_streams = 2, + .in = { 65, 70, }, + .out = { 65, 70, }, + }, + + { + .lineno = __LINE__, + .tree_test_id = TEST_ID_RFC7540_EXAMPLE, + .n_streams = 6, + .in = { 65, 66, 67, 68, 69, 70, }, + .out = { 68, 65, 70, 66, 67, 69, }, + }, + + { + .lineno = __LINE__, + .tree_test_id = TEST_ID_RFC7540_EXAMPLE, + .n_streams = 2, + .in = { 69, 68, }, + .out = { 68, 69, }, + }, + + /* Streams 1 and 3 are on the same level, but have different weight. + * Order of interator insertion should not matter. + */ + { + .lineno = __LINE__, + .tree_test_id = TEST_ID_SIMPLE_TREE_1, + .n_streams = 3, + .in = { 1, 2, 3, }, + .out = { 1, 3, 2, }, + }, + + { + .lineno = __LINE__, + .tree_test_id = TEST_ID_SIMPLE_TREE_1, + .n_streams = 3, + .in = { 3, 2, 1, }, + .out = { 1, 3, 2, }, + }, + +}; + +struct crit_test +{ + int lineno; + enum tree_test_id tree_test_id; + lsquic_stream_id_t add_streams[10]; /* 0 means last */ + lsquic_stream_id_t expected; +}; + +static const struct crit_test crit_tests[] = +{ + + { + .lineno = __LINE__, + .tree_test_id = TEST_ID_RFC7540_EXAMPLE, + .add_streams = { 65, 66, 67, 68, 69, 70, }, + .expected = 68, + }, + + { + .lineno = __LINE__, + .tree_test_id = TEST_ID_PRUNE, + .expected = 69, + }, + + { + .lineno = __LINE__, + .tree_test_id = TEST_ID_TOP_LEVEL_PLACEHOLDERS, + .expected = ~0ull, + }, + + { + .lineno = __LINE__, + .tree_test_id = TEST_ID_TOP_LEVEL_PLACEHOLDERS, + .add_streams = { 69, }, + .expected = 69, + }, + + { + .lineno = __LINE__, + .tree_test_id = TEST_ID_TOP_LEVEL_PLACEHOLDERS, + .add_streams = { 69, 70, }, + .expected = 70, + }, + + { + .lineno = __LINE__, + .tree_test_id = TEST_ID_TOP_LEVEL_PLACEHOLDERS, + .add_streams = { 69, 68, }, + .expected = 68, + }, + +}; + +enum run_step_flags +{ + RUN_STEP_CHECK_RES = 1 << 0, +}; + +static void +replay_test (struct h3_prio_tree *tree, enum tree_test_id test_id); + +static void +run_step (struct h3_prio_tree *tree, const struct step *step, + enum run_step_flags flags) +{ + int s; + struct lsquic_stream *stream; + char buf[0x1000]; + + switch (step->call) + { + case CALL_SET_REL: + s = lsquic_prio_tree_set_rel(tree, EXP_ARGS(&step->args.set_rel)); + break; + case CALL_ADD_STREAM: + stream = s_next_stream++; + assert(stream < s_streams + sizeof(s_streams) / sizeof(s_streams[0])); + memset(stream, 0, sizeof(*stream)); + stream->id = step->ctx.add_stream.stream_id; + s = lsquic_prio_tree_add_stream(tree, + EXP_ADD_STREAM_ARGS(&step->args.add_stream)); + break; + case CALL_REMOVE_STREAM: + for (stream = s_streams; stream < s_next_stream; ++stream) + if (stream->id == step->ctx.remove_stream.stream_id) + break; + assert(stream); + s = lsquic_prio_tree_remove_stream(tree, + EXP_REMOVE_STREAM_ARGS(&step->args.remove_stream)); + break; + case CALL_PRUNE: + lsquic_prio_tree_prune(tree, EXP_PRUNE_ARGS(&step->args.prune)); + s = 0; /* prune is a void function call */ + break; + case REPLAY_TEST: + replay_test(tree, step->args.test_id); + s = 0; + break; + default: + assert(0); + break; + } + assert(step->retval == s); + if ((flags & RUN_STEP_CHECK_RES) && step->result) + { + memset(buf, 0, sizeof(buf)); + (void) lsquic_prio_tree_to_str(tree, buf, sizeof(buf)); + assert(0 == strcmp(step->result, buf)); + } +} + + +static void +replay_test (struct h3_prio_tree *tree, enum tree_test_id test_id) +{ + const struct tree_test *test; + const struct step *step; + + for (test = tree_tests; test < tree_tests + sizeof(tree_tests) / sizeof(tree_tests[0]); ++test) + if (test->test_id == test_id) + break; + + assert(test); + + for (step = test->steps; step->call != LAST_STEP; ++step) + run_step(tree, step, 0); +} + + +static void +run_test (const struct tree_test *test) +{ + struct h3_prio_tree *tree; + const struct step *step; + s_next_stream = s_streams; + char buf[0x1000]; + + tree = lsquic_prio_tree_new(&s_conn, test->n_placeholders); + + for (step = test->steps; step->call != LAST_STEP; ++step) + run_step(tree, step, RUN_STEP_CHECK_RES); + + if (test->result) + { + memset(buf, 0, sizeof(buf)); + (void) lsquic_prio_tree_to_str(tree, buf, sizeof(buf)); + assert(0 == strcmp(test->result, buf)); + } + + lsquic_prio_tree_destroy(tree); +} + + +static void +run_iter_test (const struct iter_test *test) +{ + struct h3_prio_tree *tree; + const struct tree_test *tree_test; + const struct step *step; + struct lsquic_stream *stream; + unsigned n; + int s; + + for (tree_test = tree_tests; tree_test < tree_tests + sizeof(tree_tests) + / sizeof(tree_tests[0]); ++tree_test) + if (tree_test->test_id == test->tree_test_id) + break; + + assert(tree_test); + + s_next_stream = s_streams; + tree = lsquic_prio_tree_new(&s_conn, tree_test->n_placeholders); + for (step = tree_test->steps; step->call != LAST_STEP; ++step) + run_step(tree, step, RUN_STEP_CHECK_RES); + + lsquic_prio_tree_iter_reset(tree, "test"); + for (n = 0; n < test->n_streams; ++n) + { + for (stream = s_streams; stream < s_next_stream; ++stream) + if (stream->id == test->in[n]) + break; + if (stream >= s_next_stream) + { + stream = s_next_stream++; + memset(stream, 0, sizeof(*stream)); + stream->id = test->in[n]; + /* We assume the relationship is already in there */ + s = lsquic_prio_tree_add_stream(tree, stream, 0, 0, 0); + assert(0 == s); + } + lsquic_prio_tree_iter_add(tree, stream); + } + + for (n = 0; n < test->n_streams; ++n) + { + stream = lsquic_prio_tree_iter_next(tree); + assert(stream); + assert(stream->id == test->out[n]); + } + stream = lsquic_prio_tree_iter_next(tree); + assert(NULL == stream); + + lsquic_prio_tree_destroy(tree); +} + + +static void +run_crit_test (const struct crit_test *test) +{ + struct h3_prio_tree *tree; + const struct tree_test *tree_test; + const struct step *step; + struct lsquic_stream *stream; + const lsquic_stream_id_t *stream_id; + int s; + + for (tree_test = tree_tests; tree_test < tree_tests + sizeof(tree_tests) + / sizeof(tree_tests[0]); ++tree_test) + if (tree_test->test_id == test->tree_test_id) + break; + + assert(tree_test); + + s_next_stream = s_streams; + tree = lsquic_prio_tree_new(&s_conn, tree_test->n_placeholders); + for (step = tree_test->steps; step->call != LAST_STEP; ++step) + run_step(tree, step, RUN_STEP_CHECK_RES); + + for (stream_id = test->add_streams; *stream_id; ++stream_id) + { + stream = s_next_stream++; + memset(stream, 0, sizeof(*stream)); + stream->id = *stream_id; + /* We assume the relationship is already in there */ + s = lsquic_prio_tree_add_stream(tree, stream, 0, 0, 0); + assert(0 == s); + } + + stream = lsquic_prio_tree_highest_non_crit(tree); + if (test->expected != ~0ull) + assert(stream->id == test->expected); + else + assert(!stream); + + lsquic_prio_tree_destroy(tree); +} + + +int +main (void) +{ + const struct tree_test *tree_test; + const struct iter_test *iter_test; + const struct crit_test *crit_test; + + for (tree_test = tree_tests; tree_test < tree_tests + sizeof(tree_tests) + / sizeof(tree_tests[0]); ++tree_test) + run_test(tree_test); + for (iter_test = iter_tests; iter_test < iter_tests + sizeof(iter_tests) + / sizeof(iter_tests[0]); ++iter_test) + run_iter_test(iter_test); + for (crit_test = crit_tests; crit_test < crit_tests + sizeof(crit_tests) + / sizeof(crit_tests[0]); ++crit_test) + run_crit_test(crit_test); + + return 0; +} diff --git a/test/unittests/test_hcsi_reader.c b/test/unittests/test_hcsi_reader.c new file mode 100644 index 000000000..cac29ea67 --- /dev/null +++ b/test/unittests/test_hcsi_reader.c @@ -0,0 +1,318 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#include +#include +#include +#include +#include +#include + +#include "lsquic.h" +#include "lsquic_int_types.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hcsi_reader.h" +#include "lsquic_hash.h" +#include "lsquic_conn.h" + +struct test +{ + int lineno; + + unsigned char input[0x100]; + size_t input_sz; + + int retval; + char output[0x1000]; +}; + + +static const struct test tests[] = +{ + { + __LINE__, + { + 0x02, + 0x05, + /* The `1' used to be the `exclusive' flag. It is left here to + * test that the frame reader ignores these Emtpy bits. + */ + (H3PET_REQ_STREAM << HQ_PT_SHIFT) | (H3DET_PLACEHOLDER << HQ_DT_SHIFT) | 1, + 0x03, + 0x40, 0x33, + 0x77, + }, + 7, + 0, + "on_priority: request stream #3 depends on placeholder #51; weight: 120\n", + }, + + { + __LINE__, + { + 0x02, + 0x03, + (H3PET_REQ_STREAM << HQ_PT_SHIFT) | (H3DET_ROOT << HQ_DT_SHIFT), + 0x03, + 0x77, + }, + 5, + 0, + "on_priority: request stream #3 depends on root; weight: 120\n", + }, + + { + __LINE__, + { + 0x02, + 0x04, + /* The `1' used to be the `exclusive' flag. It is left here to + * test that the frame reader ignores these Emtpy bits. + */ + (H3PET_CUR_STREAM << HQ_PT_SHIFT) | (H3DET_PLACEHOLDER << HQ_DT_SHIFT), + 0x40, 0x33, + 0x77, + }, + 6, + 0, + "on_priority: current stream depends on placeholder #51; weight: 120\n", + }, + + { + __LINE__, + { + 0x02, + 0x02, + /* The `1' used to be the `exclusive' flag. It is left here to + * test that the frame reader ignores these Emtpy bits. + */ + (H3PET_CUR_STREAM << HQ_PT_SHIFT) | (H3DET_ROOT << HQ_DT_SHIFT), + 0x77, + }, + 4, + 0, + "on_priority: current stream depends on root; weight: 120\n", + }, + + { + __LINE__, + { + 0x03, + 0x04, + 0x80, 0x12, 0x34, 0x45, + }, + 6, + 0, + "on_cancel_push: 1193029\n", + }, + + { + __LINE__, + { + HQFT_MAX_PUSH_ID, + 0x02, + 0x41, 0x23, + }, + 4, + 0, + "on_max_push_id: 291\n", + }, + + { + __LINE__, + { + HQFT_SETTINGS, + 0x00, + }, + 2, + 0, + "have SETTINGS frame\n", + }, + + { /* Frame contents do not match frame length */ + __LINE__, + { + HQFT_MAX_PUSH_ID, + 0x03, + 0x41, 0x23, + }, + 4, + -1, + "", + }, + + { + __LINE__, + { + HQFT_SETTINGS, + 13, + 0x52, 0x34, + 0xC0, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78, + 0x52, 0x35, + 0x00, + }, + 15, + 0, + "on_setting: 0x1234=0x12233445566778\n" + "on_setting: 0x1235=0x0\n" + "have SETTINGS frame\n" + , + }, + +}; + + +static void +on_priority (void *ctx, const struct hq_priority *priority) +{ + switch (((priority->hqp_prio_type == H3PET_CUR_STREAM) << 1) + | (priority->hqp_dep_type == H3DET_ROOT)) + { + case 0: + fprintf(ctx, "%s: %s #%"PRIu64" depends on %s #%"PRIu64"; " + "weight: %u\n", __func__, + lsquic_h3pet2str[priority->hqp_prio_type], priority->hqp_prio_id, + lsquic_h3det2str[priority->hqp_dep_type], priority->hqp_dep_id, + HQP_WEIGHT(priority)); + break; + case 1: + fprintf(ctx, "%s: %s #%"PRIu64" depends on root; " + "weight: %u\n", __func__, + lsquic_h3pet2str[priority->hqp_prio_type], priority->hqp_prio_id, + HQP_WEIGHT(priority)); + break; + case 2: + fprintf(ctx, "%s: current stream depends on %s #%"PRIu64"; " + "weight: %u\n", __func__, + lsquic_h3det2str[priority->hqp_dep_type], priority->hqp_dep_id, + HQP_WEIGHT(priority)); + break; + default: + assert(0); + case 3: + fprintf(ctx, "%s: current stream depends on root; " + "weight: %u\n", __func__, + HQP_WEIGHT(priority)); + break; + } +} + +static void +on_cancel_push (void *ctx, uint64_t push_id) +{ + fprintf(ctx, "%s: %"PRIu64"\n", __func__, push_id); +} + +static void +on_max_push_id (void *ctx, uint64_t push_id) +{ + fprintf(ctx, "%s: %"PRIu64"\n", __func__, push_id); +} + +static void +on_settings_frame (void *ctx) +{ + fprintf(ctx, "have SETTINGS frame\n"); +} + +static void +on_setting (void *ctx, uint64_t setting_id, uint64_t value) +{ + fprintf(ctx, "%s: 0x%"PRIX64"=0x%"PRIX64"\n", __func__, setting_id, value); +} + +static void +on_goaway (void *ctx, uint64_t stream_id) +{ + fprintf(ctx, "%s: %"PRIu64"\n", __func__, stream_id); +} + +static void +on_unexpected_frame (void *ctx, uint64_t frame_type) +{ + fprintf(ctx, "%s: %"PRIu64"\n", __func__, frame_type); +} + +static const struct hcsi_callbacks callbacks = +{ + .on_priority = on_priority, + .on_cancel_push = on_cancel_push, + .on_max_push_id = on_max_push_id, + .on_settings_frame = on_settings_frame, + .on_setting = on_setting, + .on_goaway = on_goaway, + .on_unexpected_frame = on_unexpected_frame, +}; + + +static void +abort_error (struct lsquic_conn *conn, int is_app, unsigned error_code, + const char *format, ...) +{ +} + + +static const struct conn_iface conn_iface = { + .ci_abort_error = abort_error, +}; + + +static void +run_test (const struct test *test) +{ + struct hcsi_reader reader; + size_t read_sz, out_sz, toread; + FILE *out_f; + char *output; + const unsigned char *p; + int s; + struct lsquic_conn lconn = LSCONN_INITIALIZER_CIDLEN(lconn, 0); + lconn.cn_if = &conn_iface; + + for (read_sz = 1; read_sz < test->input_sz; ++read_sz) + { + out_f = open_memstream(&output, &out_sz); + lsquic_hcsi_reader_init(&reader, &lconn, &callbacks, out_f); + + p = test->input; + do + { + toread = test->input + test->input_sz - p; + if (toread > read_sz) + toread = read_sz; + s = lsquic_hcsi_reader_feed(&reader, p, toread); + if (s != 0) + break; + p += toread; + } + while (p < test->input + test->input_sz); + + assert(s == test->retval); + + fclose(out_f); + assert(0 == strcmp(test->output, output)); + free(output); + } +} + +int +main (void) +{ + const struct test *test; + struct test coalesced_test; + + for (test = tests; test < tests + sizeof(tests) / sizeof(tests[0]); ++test) + run_test(test); + + memset(&coalesced_test, 0, sizeof(coalesced_test)); + for (test = tests; test < tests + sizeof(tests) / sizeof(tests[0]); ++test) + if (test->retval == 0) + { + memcpy(coalesced_test.input + coalesced_test.input_sz, + test->input, test->input_sz); + coalesced_test.input_sz += test->input_sz; + strcat(coalesced_test.output, test->output); + } + run_test(&coalesced_test); + + return 0; +} diff --git a/test/unittests/test_lsquic_hash.c b/test/unittests/test_lsquic_hash.c index fcef77844..45e58898a 100644 --- a/test/unittests/test_lsquic_hash.c +++ b/test/unittests/test_lsquic_hash.c @@ -15,6 +15,7 @@ struct widget { unsigned long key; + struct lsquic_hash_elem hash_el; char data[30]; }; @@ -43,7 +44,7 @@ main (int argc, char **argv) sprintf(widget->data, "%lu", widget->key); el = lsquic_hash_find(hash, &widget->key, sizeof(widget->key)); assert(!el); - el = lsquic_hash_insert(hash, &widget->key, sizeof(widget->key), widget); + el = lsquic_hash_insert(hash, &widget->key, sizeof(widget->key), widget, &widget->hash_el); assert(el); } diff --git a/test/unittests/test_minmax.c b/test/unittests/test_minmax.c new file mode 100644 index 000000000..748c7ba9b --- /dev/null +++ b/test/unittests/test_minmax.c @@ -0,0 +1,453 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* Tests adopted from Chromium windowed_filter_test.cc */ +// Copyright (c) 2016 The Chromium Authors. All rights reserved. + +#include +#include +#include + +#include "lsquic_minmax.h" + +/* Convert milliseconds to lsquic_time_t, which is microseconds */ +#define ms(val) ((val) * 1000) + +static void +init_minmax (struct minmax *minmax) +{ + minmax_init(minmax, ms(99)); +} + + +// Sets up windowed_min_rtt_ to have the following values: +// Best = 20ms, recorded at 25ms +// Second best = 30ms, recorded at 50ms +// Third best = 50ms, recorded at 100ms +static void +init_min_filter (struct minmax *minmax) +{ + uint64_t now, rtt; + unsigned i; + + now = 0; + rtt = ms(10); + for (i = 0; i < 5; ++i) + { + minmax_upmin(minmax, now, rtt); + now += ms(25); + rtt += ms(10); + } + assert(ms(20) == minmax_get_idx(minmax, 0)); + assert(ms(30) == minmax_get_idx(minmax, 1)); + assert(ms(50) == minmax_get_idx(minmax, 2)); +} + + +// Sets up windowed_max_bw_ to have the following values: +// Best = 900 bps, recorded at 25ms +// Second best = 800 bps, recorded at 50ms +// Third best = 600 bps, recorded at 100ms +static void +init_max_filter (struct minmax *minmax) +{ + uint64_t now, bw; + unsigned i; + + now = 0; + bw = 1000; + for (i = 0; i < 5; ++i) + { + minmax_upmax(minmax, now, bw); + now += ms(25); + bw -= 100; + } + assert(900 == minmax_get_idx(minmax, 0)); + assert(800 == minmax_get_idx(minmax, 1)); + assert(600 == minmax_get_idx(minmax, 2)); +} + + +// Test helper function: updates the filter with a lot of small values in order +// to ensure that it is not susceptible to noise. +static void +update_with_irrelevant_samples (struct minmax *minmax, uint64_t max_value, + uint64_t time) +{ + uint64_t i; + + for (i = 0; i < 1000; ++i) + minmax_upmax(minmax, time, i % max_value); +} + + +static void +test_uninitialized_estimates (void) +{ + struct minmax minmax; + + init_minmax(&minmax); + assert(0 == minmax_get_idx(&minmax, 0)); + assert(0 == minmax_get_idx(&minmax, 1)); + assert(0 == minmax_get_idx(&minmax, 2)); +} + + +static void +test_monotonically_increasing_min (void) +{ + struct minmax minmax; + uint64_t rtt, now; + unsigned i; + + rtt = ms(10); + now = 0; + + init_minmax(&minmax); + minmax_upmin(&minmax, now, rtt); + + assert(ms(10) == minmax_get(&minmax)); + // Gradually increase the rtt samples and ensure the windowed min rtt starts + // rising. + for (i = 0; i < 6; ++i) + { + now += ms(25); + rtt += ms(10); + minmax_upmin(&minmax, now, rtt); + if (i < 3) + assert(minmax_get(&minmax) == ms(10)); + else if (i == 3) + assert(minmax_get(&minmax) == ms(20)); + else if (i == 4) + assert(minmax_get(&minmax) == ms(30)); + else + assert(minmax_get(&minmax) == ms(50)); + } +} + + +static void +test_monotonically_decreasing_max (void) +{ + struct minmax minmax; + uint64_t bw, now; + unsigned i; + + bw = 1000; + now = 0; + + init_minmax(&minmax); + minmax_upmax(&minmax, now, bw); + + assert(1000 == minmax_get(&minmax)); + // Gradually decrease the bw samples and ensure the windowed max bw starts + // decreasing. + for (i = 0; i < 6; ++i) + { + now += ms(25); + bw -= 100; + minmax_upmax(&minmax, now, bw); + if (i < 3) + assert(minmax_get(&minmax) == 1000); + else if (i == 3) + assert(minmax_get(&minmax) == 900); + else if (i == 4) + assert(minmax_get(&minmax) == 800); + else + assert(minmax_get(&minmax) == 600); + } +} + + +static void +sample_changes_third_best_min (void) +{ + struct minmax minmax; + uint64_t rtt, now; + + init_minmax(&minmax); + init_min_filter(&minmax); + rtt = minmax_get_idx(&minmax, 2); + rtt -= ms(5); + now = ms(101); + minmax_upmin(&minmax, now, rtt); + assert(rtt == minmax_get_idx(&minmax, 2)); + assert(ms(30) == minmax_get_idx(&minmax, 1)); + assert(ms(20) == minmax_get_idx(&minmax, 0)); +} + + +static void +sample_changes_third_best_max (void) +{ + struct minmax minmax; + uint64_t bw, now; + + init_minmax(&minmax); + init_max_filter(&minmax); + bw = minmax_get_idx(&minmax, 2); + bw += 50; + now = ms(101); + minmax_upmax(&minmax, now, bw); + assert(bw == minmax_get_idx(&minmax, 2)); + assert(800 == minmax_get_idx(&minmax, 1)); + assert(900 == minmax_get_idx(&minmax, 0)); +} + + +// RTT sample lower than the second-choice min sets that and also +// the third-choice min. +static void +sample_changes_second_best_min (void) +{ + struct minmax minmax; + uint64_t rtt, now; + + init_minmax(&minmax); + init_min_filter(&minmax); + rtt = minmax_get_idx(&minmax, 1); + rtt -= ms(5); + now = ms(101); + minmax_upmin(&minmax, now, rtt); + assert(rtt == minmax_get_idx(&minmax, 2)); + assert(rtt == minmax_get_idx(&minmax, 1)); + assert(ms(20) == minmax_get_idx(&minmax, 0)); +} + + +// BW sample higher than the second-choice max sets that and also +// the third-choice max. +static void +sample_changes_second_best_max (void) +{ + struct minmax minmax; + uint64_t bw, now; + + init_minmax(&minmax); + init_max_filter(&minmax); + bw = minmax_get_idx(&minmax, 1); + bw += 50; + now = ms(101); + minmax_upmax(&minmax, now, bw); + assert(bw == minmax_get_idx(&minmax, 2)); + assert(bw == minmax_get_idx(&minmax, 1)); + assert(900 == minmax_get_idx(&minmax, 0)); +} + + +// RTT sample lower than the first-choice min-rtt sets that and also +// the second and third-choice mins. +static void +sample_changes_all_mins (void) +{ + struct minmax minmax; + uint64_t rtt, now; + + init_minmax(&minmax); + init_min_filter(&minmax); + rtt = minmax_get(&minmax); + rtt -= ms(5); + now = ms(101); + minmax_upmin(&minmax, now, rtt); + assert(rtt == minmax_get_idx(&minmax, 2)); + assert(rtt == minmax_get_idx(&minmax, 1)); + assert(rtt == minmax_get_idx(&minmax, 0)); +} + + +// BW sample higher than the first-choice max sets that and also +// the second and third-choice maxs. +static void +sample_changes_all_maxs (void) +{ + struct minmax minmax; + uint64_t bw, now; + + init_minmax(&minmax); + init_max_filter(&minmax); + bw = minmax_get(&minmax); + bw += 50; + now = ms(101); + minmax_upmax(&minmax, now, bw); + assert(bw == minmax_get_idx(&minmax, 2)); + assert(bw == minmax_get_idx(&minmax, 1)); + assert(bw == minmax_get_idx(&minmax, 0)); +} + + +// Best min sample was recorded at 25ms, so expiry time is 124ms. +static void +expire_best_min (void) +{ + struct minmax minmax; + uint64_t rtt, now, old_2nd, old_3rd; + + init_minmax(&minmax); + init_min_filter(&minmax); + old_3rd = minmax_get_idx(&minmax, 2); + old_2nd = minmax_get_idx(&minmax, 1); + rtt = old_3rd + ms(5); + now = ms(125); + minmax_upmin(&minmax, now, rtt); + assert(rtt == minmax_get_idx(&minmax, 2)); + assert(old_3rd == minmax_get_idx(&minmax, 1)); + assert(old_2nd == minmax_get(&minmax)); +} + + +// Best max sample was recorded at 25ms, so expiry time is 124ms. +static void +expire_best_max (void) +{ + struct minmax minmax; + uint64_t bw, now, old_2nd, old_3rd; + + init_minmax(&minmax); + init_max_filter(&minmax); + old_3rd = minmax_get_idx(&minmax, 2); + old_2nd = minmax_get_idx(&minmax, 1); + bw = old_3rd - 50; + now = ms(125); + minmax_upmax(&minmax, now, bw); + assert(bw == minmax_get_idx(&minmax, 2)); + assert(old_3rd == minmax_get_idx(&minmax, 1)); + assert(old_2nd == minmax_get(&minmax)); +} + + +// Second best min sample was recorded at 75ms, so expiry time is 174ms. +static void +expire_second_best_min (void) +{ + struct minmax minmax; + uint64_t rtt, now, old_3rd; + + init_minmax(&minmax); + init_min_filter(&minmax); + old_3rd = minmax_get_idx(&minmax, 2); + rtt = old_3rd + ms(5); + now = ms(175); + minmax_upmin(&minmax, now, rtt); + assert(rtt == minmax_get_idx(&minmax, 2)); + assert(rtt == minmax_get_idx(&minmax, 1)); + assert(old_3rd == minmax_get(&minmax)); +} + + +// Second best max sample was recorded at 75ms, so expiry time is 174ms. +static void +expire_second_best_max (void) +{ + struct minmax minmax; + uint64_t bw, now, old_3rd; + + init_minmax(&minmax); + init_max_filter(&minmax); + old_3rd = minmax_get_idx(&minmax, 2); + bw = old_3rd - 50; + now = ms(175); + minmax_upmax(&minmax, now, bw); + assert(bw == minmax_get_idx(&minmax, 2)); + assert(bw == minmax_get_idx(&minmax, 1)); + assert(old_3rd == minmax_get(&minmax)); +} + + +// Third best min sample was recorded at 100ms, so expiry time is 199ms. +static void +expire_all_mins (void) +{ + struct minmax minmax; + uint64_t rtt, now, old_3rd; + + init_minmax(&minmax); + init_min_filter(&minmax); + old_3rd = minmax_get_idx(&minmax, 2); + rtt = old_3rd + ms(5); + now = ms(200); + minmax_upmin(&minmax, now, rtt); + assert(rtt == minmax_get_idx(&minmax, 2)); + assert(rtt == minmax_get_idx(&minmax, 1)); + assert(rtt == minmax_get(&minmax)); +} + + +// Third best max sample was recorded at 100ms, so expiry time is 199ms. +static void +expire_all_maxs (void) +{ + struct minmax minmax; + uint64_t bw, now, old_3rd; + + init_minmax(&minmax); + init_max_filter(&minmax); + old_3rd = minmax_get_idx(&minmax, 2); + bw = old_3rd - 50; + now = ms(200); + minmax_upmax(&minmax, now, bw); + assert(bw == minmax_get_idx(&minmax, 2)); + assert(bw == minmax_get_idx(&minmax, 1)); + assert(bw == minmax_get(&minmax)); +} + + +// Test the windowed filter where the time used is an exact counter instead of a +// timestamp. This is useful if, for example, the time is measured in round +// trips. +static void +expire_counter_based_max (void) +{ + struct minmax minmax; + + // Create a window which starts at t = 0 and expires after two cycles. + minmax_init(&minmax, 2); + + const uint64_t kBest = 50000; + // Insert 50000 at t = 1. + minmax_upmax(&minmax, 1, 50000); + assert(kBest == minmax_get(&minmax)); + update_with_irrelevant_samples(&minmax, 20, 1); + assert(kBest == minmax_get(&minmax)); + + // Insert 40000 at t = 2. Nothing is expected to expire. + minmax_upmax(&minmax, 2, 40000); + assert(kBest == minmax_get(&minmax)); + update_with_irrelevant_samples(&minmax, 20, 2); + assert(kBest == minmax_get(&minmax)); + + // Insert 30000 at t = 3. Nothing is expected to expire yet. + minmax_upmax(&minmax, 3, 30000); + assert(kBest == minmax_get(&minmax)); + update_with_irrelevant_samples(&minmax, 20, 3); + assert(kBest == minmax_get(&minmax)); + + // Insert 20000 at t = 4. 50000 at t = 1 expires, so 40000 becomes the new + // maximum. + const uint64_t kNewBest = 40000; + minmax_upmax(&minmax, 4, 20000); + assert(kNewBest == minmax_get(&minmax)); + update_with_irrelevant_samples(&minmax, 20, 4); + assert(kNewBest == minmax_get(&minmax)); +} + + +int +main (void) +{ + test_uninitialized_estimates(); + test_monotonically_increasing_min(); + test_monotonically_decreasing_max(); + sample_changes_third_best_min(); + sample_changes_third_best_max(); + sample_changes_second_best_min(); + sample_changes_second_best_max(); + sample_changes_all_mins(); + sample_changes_all_maxs(); + expire_best_min(); + expire_best_max(); + expire_second_best_min(); + expire_second_best_max(); + expire_all_mins(); + expire_all_maxs(); + expire_counter_based_max(); + + return 0; +} diff --git a/test/unittests/test_packet_out.c b/test/unittests/test_packet_out.c index 3fa6fbe2a..4bfd30a97 100644 --- a/test/unittests/test_packet_out.c +++ b/test/unittests/test_packet_out.c @@ -18,9 +18,13 @@ #include "lsquic_int_types.h" #include "lsquic_packet_common.h" +#include "lsquic_packet_gquic.h" #include "lsquic_packet_out.h" #include "lsquic_conn_flow.h" #include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" #include "lsquic_stream.h" #include "lsquic_types.h" #include "lsquic_malo.h" @@ -41,7 +45,7 @@ main (void) memset(&enpub, 0, sizeof(enpub)); memset(&streams, 0, sizeof(streams)); lsquic_mm_init(&enpub.enp_mm); - packet_out = lsquic_mm_get_packet_out(&enpub.enp_mm, NULL, QUIC_MAX_PAYLOAD_SZ); + packet_out = lsquic_mm_get_packet_out(&enpub.enp_mm, NULL, GQUIC_MAX_PAYLOAD_SZ); lsquic_packet_out_add_stream(packet_out, &enpub.enp_mm, &streams[0], QUIC_FRAME_STREAM, 7, 1); lsquic_packet_out_add_stream(packet_out, &enpub.enp_mm, &streams[1], QUIC_FRAME_STREAM, 8, 1); diff --git a/test/unittests/test_packno_len.c b/test/unittests/test_packno_len.c index 0bf90af9a..a37805719 100644 --- a/test/unittests/test_packno_len.c +++ b/test/unittests/test_packno_len.c @@ -10,7 +10,6 @@ #include "lsquic.h" #include "lsquic_types.h" -#include "lsquic_alarmset.h" #include "lsquic_packet_common.h" #include "lsquic_parse.h" @@ -21,7 +20,7 @@ static const struct parse_funcs *const pf = select_pf_by_ver(LSQVER_039); struct packno_bits_test { int pbt_lineno; /* Inputs: */ - lsquic_cid_t pbt_packno, + lsquic_packno_t pbt_packno, pbt_least_unacked; uint64_t pbt_n_in_flight; /* Output: */ @@ -206,6 +205,7 @@ static const struct packno_bits_test pb_tests[] = { static void run_pbt (int i) { + const struct parse_funcs *pf = select_pf_by_ver(LSQVER_043); const struct packno_bits_test *const pbt = &pb_tests[i]; enum packno_bits packno_bits = pf->pf_calc_packno_bits(pbt->pbt_packno, pbt->pbt_least_unacked, pbt->pbt_n_in_flight); diff --git a/test/unittests/test_parse.c b/test/unittests/test_parse.c new file mode 100644 index 000000000..998fb5781 --- /dev/null +++ b/test/unittests/test_parse.c @@ -0,0 +1,6 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +int +main (void) +{ + return 0; +} diff --git a/test/unittests/test_parse_packet_in.c b/test/unittests/test_parse_packet_in.c index e97843145..b955c1063 100644 --- a/test/unittests/test_parse_packet_in.c +++ b/test/unittests/test_parse_packet_in.c @@ -28,7 +28,7 @@ struct parse_packet_in_test /* Output */ int ppit_retval; int ppit_pi_flags; - lsquic_cid_t ppit_conn_id; + uint64_t ppit_conn_id; lsquic_packno_t ppit_packno; unsigned short ppit_header_sz; unsigned short ppit_data_sz; @@ -38,295 +38,6 @@ struct parse_packet_in_test static const struct parse_packet_in_test tests[] = { - /* Little-endian tests */ - { .ppit_lineno = __LINE__, - .ppit_buf = { - /* Flags: */ PACKET_PUBLIC_FLAGS_VERSION| - PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID, - /* CID: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, - /* Version: */ 'Q', '0', '3', '5', - /* Packet #: */ 0x73, - /* Payload: */ 'P', 'A', 'Y', 'L', 'O', 'A', 'D', - }, - .ppit_bufsz = 1 + 8 + 4 + 1 + 7, - .ppit_is_server = 1, - .ppit_version = LSQVER_035, - .ppit_retval = 0, - .ppit_pi_flags = PI_CONN_ID, - .ppit_conn_id = 0x5500000000000000, - .ppit_packno = 0x73, - .ppit_header_sz = 1 + 8 + 4 + 1, - .ppit_data_sz = 1 + 8 + 4 + 1 + 7, - .ppit_quic_ver = 1 + 8, - .ppit_nonce = 0, - }, - - { .ppit_lineno = __LINE__, - .ppit_buf = { - /* Flags: */ PACKET_PUBLIC_FLAGS_VERSION| - 0x10 /* 2-byte packet number */| - PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID, - /* CID: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, - /* Version: */ 'Q', '0', '3', '5', - /* Packet #: */ 0x73, 0x64, - /* Payload: */ 'P', 'A', 'Y', 'L', 'O', 'A', 'D', - }, - .ppit_bufsz = 1 + 8 + 4 + 2 + 7, - .ppit_is_server = 1, - .ppit_version = LSQVER_035, - .ppit_retval = 0, - .ppit_pi_flags = PI_CONN_ID, - .ppit_conn_id = 0x5500000000000000, - .ppit_packno = 0x6473, - .ppit_header_sz = 1 + 8 + 4 + 2, - .ppit_data_sz = 1 + 8 + 4 + 2 + 7, - .ppit_quic_ver = 1 + 8, - .ppit_nonce = 0, - }, - - { .ppit_lineno = __LINE__, - .ppit_buf = { - /* Flags: */ PACKET_PUBLIC_FLAGS_VERSION| - 0x20 /* 4-byte packet number */| - PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID, - /* CID: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, - /* Version: */ 'Q', '0', '3', '5', - /* Packet #: */ 0x73, 0x64, 0x55, 0x46, - /* Payload: */ 'P', 'A', 'Y', 'L', 'O', 'A', 'D', - }, - .ppit_bufsz = 1 + 8 + 4 + 4 + 7, - .ppit_is_server = 1, - .ppit_version = LSQVER_035, - .ppit_retval = 0, - .ppit_pi_flags = PI_CONN_ID, - .ppit_conn_id = 0x5500000000000000, - .ppit_packno = 0x46556473, - .ppit_header_sz = 1 + 8 + 4 + 4, - .ppit_data_sz = 1 + 8 + 4 + 4 + 7, - .ppit_quic_ver = 1 + 8, - .ppit_nonce = 0, - }, - - { .ppit_lineno = __LINE__, - .ppit_buf = { - /* Flags: */ PACKET_PUBLIC_FLAGS_VERSION| - 0x30 /* 6-byte packet number */| - PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID, - /* CID: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, - /* Version: */ 'Q', '0', '3', '5', - /* Packet #: */ 0x73, 0x64, 0x55, 0x46, 0x37, 0x28, - /* Payload: */ 'P', 'A', 'Y', 'L', 'O', 'A', 'D', - }, - .ppit_bufsz = 1 + 8 + 4 + 6 + 7, - .ppit_is_server = 1, - .ppit_version = LSQVER_035, - .ppit_retval = 0, - .ppit_pi_flags = PI_CONN_ID, - .ppit_conn_id = 0x5500000000000000, - .ppit_packno = 0x283746556473, - .ppit_header_sz = 1 + 8 + 4 + 6, - .ppit_data_sz = 1 + 8 + 4 + 6 + 7, - .ppit_quic_ver = 1 + 8, - .ppit_nonce = 0, - }, - - { .ppit_lineno = __LINE__, /* Same as above minus connection ID */ - .ppit_buf = { - /* Flags: */ PACKET_PUBLIC_FLAGS_VERSION, - /* Version: */ 'Q', '0', '3', '5', - /* Packet #: */ 0x73, - /* Payload: */ 'P', 'A', 'Y', 'L', 'O', 'A', 'D', - }, - .ppit_bufsz = 1 + 0 + 4 + 1 + 7, - .ppit_is_server = 1, - .ppit_version = LSQVER_035, - .ppit_retval = 0, - .ppit_pi_flags = 0, - .ppit_conn_id = 0, - .ppit_packno = 0x73, - .ppit_header_sz = 1 + 0 + 4 + 1, - .ppit_data_sz = 1 + 0 + 4 + 1 + 7, - .ppit_quic_ver = 1 + 0, - .ppit_nonce = 0, - }, - - { .ppit_lineno = __LINE__, /* Same as above minus version */ - .ppit_buf = { - /* Flags: */ 0, - /* Packet #: */ 0x73, - /* Payload: */ 'P', 'A', 'Y', 'L', 'O', 'A', 'D', - }, - .ppit_bufsz = 1 + 0 + 0 + 1 + 7, - .ppit_is_server = 1, - .ppit_version = LSQVER_035, - .ppit_retval = 0, - .ppit_pi_flags = 0, - .ppit_conn_id = 0, - .ppit_packno = 0x73, - .ppit_header_sz = 1 + 0 + 0 + 1, - .ppit_data_sz = 1 + 0 + 0 + 1 + 7, - .ppit_quic_ver = 0, - .ppit_nonce = 0, - }, - - { .ppit_lineno = __LINE__, - .ppit_buf = { - /* Flags: */ PACKET_PUBLIC_FLAGS_VERSION| - PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID, - /* CID: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, - /* Version: */ 'Q', '0', '3', '5', - /* Packet #: */ 0x73, - /* Payload: */ 'P', 'A', 'Y', 'L', 'O', 'A', 'D', - }, - .ppit_bufsz = 1 + 8 + 4, - .ppit_is_server = 1, - .ppit_version = LSQVER_035, - .ppit_retval = -1, - }, - - { .ppit_lineno = __LINE__, - .ppit_buf = { - /* Flags: */ PACKET_PUBLIC_FLAGS_NONCE| - 0x10 /* 2-byte packet number */| - PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID, - /* CID: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, - /* Nonce: */ 000, 001, 002, 003, 004, 005, 006, 007, - 010, 011, 012, 013, 014, 015, 016, 017, - 020, 021, 022, 023, 024, 025, 026, 027, - 030, 031, 032, 033, 034, 035, 036, 037, - /* Packet #: */ 0x73, 0x64, - /* Payload: */ 'P', 'A', 'Y', 'L', 'O', 'A', 'D', - }, - .ppit_bufsz = 1 + 8 + 32+ 2 + 7, - .ppit_is_server = 0, - .ppit_version = LSQVER_035, - .ppit_retval = 0, - .ppit_pi_flags = PI_CONN_ID, - .ppit_conn_id = 0x5500000000000000, - .ppit_packno = 0x6473, - .ppit_header_sz = 1 + 8 + 32+ 2, - .ppit_data_sz = 1 + 8 + 32+ 2 + 7, - .ppit_quic_ver = 0, - .ppit_nonce = 1 + 8, - }, - - { .ppit_lineno = __LINE__, - .ppit_buf = { - /* Flags: */ PACKET_PUBLIC_FLAGS_NONCE| - PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID, - /* CID: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, - /* Nonce: */ 000, 001, 002, 003, 004, 005, 006, 007, - 010, 011, 012, 013, 014, 015, 016, 017, - 020, 021, 022, 023, 024, 025, 026, 027, - 030, 031, 032, 033, 034, 035, 036, 037, - /* Packet #: */ 0x73, - /* Payload: */ 'P', 'A', 'Y', 'L', 'O', 'A', 'D', - }, - .ppit_bufsz = 1 + 8 + 32+ 1 + 7, - .ppit_is_server = 0, - .ppit_version = LSQVER_035, - .ppit_retval = 0, - .ppit_pi_flags = PI_CONN_ID, - .ppit_conn_id = 0x5500000000000000, - .ppit_packno = 0x73, - .ppit_header_sz = 1 + 8 + 32+ 1, - .ppit_data_sz = 1 + 8 + 32+ 1 + 7, - .ppit_quic_ver = 0, - .ppit_nonce = 1 + 8, - }, - - { .ppit_lineno = __LINE__, - .ppit_buf = { - /* Flags: */ PACKET_PUBLIC_FLAGS_VERSION| - 0x20 /* 4-byte packet number */| - PACKET_PUBLIC_FLAGS_NONCE| /* Nonce flag is ignored by server */ - PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID, - /* CID: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, - /* Version: */ 'Q', '0', '3', '5', - /* Packet #: */ 0x73, 0x64, 0x55, 0x46, - /* Payload: */ 'P', 'A', 'Y', 'L', 'O', 'A', 'D', - }, - .ppit_bufsz = 1 + 8 + 4 + 4 + 7, - .ppit_is_server = 1, - .ppit_version = LSQVER_035, - .ppit_retval = 0, - .ppit_pi_flags = PI_CONN_ID, - .ppit_conn_id = 0x5500000000000000, - .ppit_packno = 0x46556473, - .ppit_header_sz = 1 + 8 + 4 + 4, - .ppit_data_sz = 1 + 8 + 4 + 4 + 7, - .ppit_quic_ver = 1 + 8, - .ppit_nonce = 0, - }, - - { .ppit_lineno = __LINE__, - .ppit_buf = { - /* Flags: */ PACKET_PUBLIC_FLAGS_VERSION| - PACKET_PUBLIC_FLAGS_NONCE| /* Nonce flag is ignored by server */ - PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID, - /* CID: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, - /* Version: */ 'Q', '0', '3', '5', - /* Packet #: */ 0x73, - /* Payload: */ 'P', 'A', 'Y', 'L', 'O', 'A', 'D', - }, - .ppit_bufsz = 1 + 8 + 4 + 1 + 7, - .ppit_is_server = 1, - .ppit_version = LSQVER_035, - .ppit_retval = 0, - .ppit_pi_flags = PI_CONN_ID, - .ppit_conn_id = 0x5500000000000000, - .ppit_packno = 0x73, - .ppit_header_sz = 1 + 8 + 4 + 1, - .ppit_data_sz = 1 + 8 + 4 + 1 + 7, - .ppit_quic_ver = 1 + 8, - .ppit_nonce = 0, - }, - - { .ppit_lineno = __LINE__, - .ppit_buf = { - /* Flags: */ PACKET_PUBLIC_FLAGS_VERSION| - 0x30 /* 6-byte packet number */| - PACKET_PUBLIC_FLAGS_NONCE| /* Nonce flag is ignored by server */ - PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID, - /* CID: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, - /* Version: */ 'Q', '0', '3', '5', - /* Packet #: */ 0x73, 0x64, 0x55, 0x46, 0x37, 0x28, - /* Payload: */ 'P', 'A', 'Y', 'L', 'O', 'A', 'D', - }, - .ppit_bufsz = 1 + 8 + 4 + 6 + 7, - .ppit_is_server = 1, - .ppit_version = LSQVER_035, - .ppit_retval = 0, - .ppit_pi_flags = PI_CONN_ID, - .ppit_conn_id = 0x5500000000000000, - .ppit_packno = 0x283746556473, - .ppit_header_sz = 1 + 8 + 4 + 6, - .ppit_data_sz = 1 + 8 + 4 + 6 + 7, - .ppit_quic_ver = 1 + 8, - .ppit_nonce = 0, - }, - - { .ppit_lineno = __LINE__, - .ppit_buf = { - /* Flags: */ PACKET_PUBLIC_FLAGS_VERSION| - PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID, - /* CID: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, - /* Versions: */ 'Q', '0', '3', '5', - 'Q', '0', '3', '4', - }, - .ppit_bufsz = 1 + 8 + 8, - .ppit_is_server = 0, - .ppit_version = LSQVER_035, - .ppit_retval = 0, - .ppit_pi_flags = PI_CONN_ID, - .ppit_conn_id = 0x5500000000000000, - .ppit_packno = 0, - .ppit_header_sz = 1 + 8 + 8, - .ppit_data_sz = 1 + 8 + 8, - .ppit_quic_ver = 1 + 8, - .ppit_nonce = 0, - }, - /* * BIG-ENDIAN TESTS: */ @@ -620,44 +331,48 @@ static const struct parse_packet_in_test tests[] = { { .ppit_lineno = __LINE__, .ppit_buf = { - /* Flags: */ 0x30, + /* Flags: */ 0x40, /* CID: */ 0x01, 0x02, 0x03, 0x04, 0x50, 0x60, 0x70, 0x80, /* Packet number: */0x9B, /* Payload: */ 'P', 'A', 'Y', 'L', 'O', 'A', 'D', }, - .ppit_bufsz = 1 + 8 + 1 + 7, - .ppit_is_server = 1, - .ppit_version = LSQVER_044, + .ppit_version = LSQVER_046, .ppit_retval = 0, + .ppit_is_server = 1, .ppit_pi_flags = PI_CONN_ID, .ppit_conn_id = 0x8070605004030201, .ppit_packno = 0x9B, .ppit_header_sz = 1 + 8 + 1, .ppit_data_sz = 1 + 8 + 1 + 7, + .ppit_bufsz = 1 + 8 + 1 + 7, .ppit_quic_ver = 0, .ppit_nonce = 0, }, { .ppit_lineno = __LINE__, .ppit_buf = { - /* Flags: */ 0x32, + /* Flags: */ 0x43, /* CID: */ 0x01, 0x02, 0x03, 0x04, 0x50, 0x60, 0x70, 0x80, /* Packet number: */0x9B, 0x03, 0x02, 0x01, /* Payload: */ 'P', 'A', 'Y', 'L', 'O', 'A', 'D', }, - .ppit_bufsz = 1 + 8 + 4 + 7, - .ppit_is_server = 1, - .ppit_version = LSQVER_044, + .ppit_version = LSQVER_046, .ppit_retval = 0, - .ppit_pi_flags = PI_CONN_ID, - .ppit_conn_id = 0x8070605004030201, .ppit_packno = 0x9B030201, + .ppit_is_server = 1, .ppit_header_sz = 1 + 8 + 4, + .ppit_bufsz = 1 + 8 + 4 + 7, .ppit_data_sz = 1 + 8 + 4 + 7, + .ppit_pi_flags = PI_CONN_ID, + .ppit_conn_id = 0x8070605004030201, .ppit_quic_ver = 0, .ppit_nonce = 0, }, + /* TODO: check invalid type in finish() -- convert the latter to return + * status instead of being void function. + */ +#if 0 { .ppit_lineno = __LINE__, .ppit_buf = { /* Flags: */ 0x30 @@ -671,11 +386,12 @@ static const struct parse_packet_in_test tests[] = { .ppit_version = LSQVER_044, .ppit_retval = -1, }, +#endif { .ppit_lineno = __LINE__, .ppit_buf = { - /* Type: */ 0xFF /* Initial */, - /* Version: */ 'Q', '0', '4', '4', + /* Type: */ 0x83 /* Initial */, + /* Version: */ 'Q', '0', '4', '6', /* DCIL/SCIL: */ 0x5 /* DCIL */ << 4 | 0x0 /* SCIL */, /* CID: */ 0x01, 0x02, 0x03, 0x04, 0x50, 0x60, 0x70, 0x80, /* Packet number: */0x21, 0x22, 0x23, 0x34, @@ -683,7 +399,7 @@ static const struct parse_packet_in_test tests[] = { }, .ppit_bufsz = 1 + 4 + 1 + 8 + 4 + 7, .ppit_is_server = 1, - .ppit_version = LSQVER_044, + .ppit_version = LSQVER_046, .ppit_retval = 0, .ppit_pi_flags = PI_CONN_ID, .ppit_conn_id = 0x8070605004030201, @@ -705,7 +421,7 @@ run_ppi_test (struct lsquic_mm *mm, const struct parse_packet_in_test *ppit) struct packin_parse_state ppstate; packet_in = lsquic_mm_get_packet_in(mm); - packet_in->pi_data = lsquic_mm_get_1370(mm); + packet_in->pi_data = lsquic_mm_get_packet_in_buf(mm, 1370); packet_in->pi_flags |= PI_OWN_DATA; memcpy(packet_in->pi_data, ppit->ppit_buf, ppit->ppit_bufsz); @@ -721,15 +437,19 @@ run_ppi_test (struct lsquic_mm *mm, const struct parse_packet_in_test *ppit) * connection ID. */ !(!(ppit->ppit_pi_flags & PI_CONN_ID) - && ppit->ppit_version < LSQVER_044)) - s = lsquic_parse_packet_in_begin(packet_in, ppit->ppit_bufsz, - ppit->ppit_is_server, &ppstate); - else if (ppit->ppit_version < LSQVER_044) + && ppit->ppit_version < LSQVER_046)) + s = lsquic_parse_packet_in_server_begin(packet_in, ppit->ppit_bufsz, + ppit->ppit_is_server, 8, &ppstate); + else + if (ppit->ppit_version < LSQVER_046) s = lsquic_gquic_parse_packet_in_begin(packet_in, ppit->ppit_bufsz, - ppit->ppit_is_server, &ppstate); + ppit->ppit_is_server, -1 /* GQUIC does not use it */, &ppstate); + else if (ppit->ppit_version == LSQVER_046) + s = lsquic_Q046_parse_packet_in_begin(packet_in, ppit->ppit_bufsz, + ppit->ppit_is_server, 8, &ppstate); else - s = lsquic_iquic_parse_packet_in_begin(packet_in, ppit->ppit_bufsz, - ppit->ppit_is_server, &ppstate); + s = lsquic_ietf_v1_parse_packet_in_begin(packet_in, ppit->ppit_bufsz, + ppit->ppit_is_server, 8, &ppstate); assert(s == ppit->ppit_retval); if (0 == s) @@ -752,8 +472,16 @@ run_ppi_test (struct lsquic_mm *mm, const struct parse_packet_in_test *ppit) if (0 == s) { + if (ppit->ppit_conn_id) + { + lsquic_cid_t cid; + memset(&cid, 0, sizeof(cid)); + cid.len = sizeof(ppit->ppit_conn_id);; + memcpy(cid.idbuf, &ppit->ppit_conn_id, sizeof(ppit->ppit_conn_id)); + assert(LSQUIC_CIDS_EQ(&packet_in->pi_conn_id, &cid)); + } + assert((packet_in->pi_flags & PI_CONN_ID) == (ppit->ppit_pi_flags & PI_CONN_ID)); - assert(packet_in->pi_conn_id == ppit->ppit_conn_id); assert(packet_in->pi_packno == ppit->ppit_packno); assert(packet_in->pi_header_sz == ppit->ppit_header_sz); assert(packet_in->pi_data_sz == ppit->ppit_data_sz); diff --git a/test/unittests/test_parse_prio.c b/test/unittests/test_parse_prio.c new file mode 100644 index 000000000..84c176c3e --- /dev/null +++ b/test/unittests/test_parse_prio.c @@ -0,0 +1,56 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#include +#include +#include + +#include "lsquic.h" +#include "lsquic_types.h" +#include "lsquic_int_types.h" +#include "lsquic_hash.h" +#include "lsquic_conn.h" +#include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" + + +struct test +{ + int lineno; + unsigned char buf[0x100]; + size_t buf_sz; +}; + + +static const struct test tests[] = +{ + { .lineno = __LINE__, + .buf = "\xb0\x00\x01", + .buf_sz = 3, + }, +}; + + +static void +run_test (const struct test *test) +{ + enum h3_prio_frame_read_status status; + struct h3_prio_frame_read_state state; + const unsigned char *p; + + p = test->buf; + state.h3pfrs_state = 0; + status = lsquic_h3_prio_frame_read(&p, test->buf_sz, &state); + assert(H3PFR_STATUS_DONE == status); +} + + +int +main (void) +{ + const struct test *test; + + for (test = tests; test < tests + sizeof(tests) / sizeof(tests[0]); ++test) + run_test(test); + + return 0; +} diff --git a/test/unittests/test_purga.c b/test/unittests/test_purga.c new file mode 100644 index 000000000..87287e309 --- /dev/null +++ b/test/unittests/test_purga.c @@ -0,0 +1,174 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#include +#include +#include +#include + +#include + +#include "lsquic.h" +#include "lsquic_int_types.h" +#include "lsquic_logger.h" +#include "lsquic_purga.h" + +#define MIN_CID_LEN 4 + +static int s_eight; + +static void +bloom_test (unsigned count, unsigned miss_searches, unsigned hit_searches) +{ + struct lsquic_purga *purga; + struct purga_bloom_stats *stats; + struct purga_el *puel; + lsquic_cid_t *cids, cid; + unsigned i, j; + + cids = malloc(count * sizeof(cids[0])); + assert(cids); + + for (i = 0; i < count; ++i) + { + cids[i].len = s_eight ? 8 : MIN_CID_LEN + rand() % (MAX_CID_LEN - MIN_CID_LEN); + RAND_bytes(cids[i].idbuf, cids[i].len); + } + + purga = lsquic_purga_new(~0, NULL, NULL); + + /* Add CIDs */ + for (i = 0; i < count; ++i) + lsquic_purga_add(purga, &cids[i], NULL, 0, 0); + + /* Check that they are all there */ + for (i = 0; i < count; ++i) + { + puel = lsquic_purga_contains(purga, &cids[i]); + assert(puel); + } + + /* Run hit searches */ + for (i = 0; i < hit_searches; ++i) + { + j = rand() % count; + puel = lsquic_purga_contains(purga, &cids[j]); + assert(puel); + } + + /* Generate random CIDs and check that they are not found: */ + for (i = 0; i < miss_searches; ++i) + { + cid.len = s_eight ? 8 : MIN_CID_LEN + rand() % (MAX_CID_LEN - MIN_CID_LEN); + RAND_bytes(cid.idbuf, cid.len); + puel = lsquic_purga_contains(purga, &cid); + if (puel) + { + for (j = 0; j < count; ++j) + if (LSQUIC_CIDS_EQ(&cids[j], &cid)) + break; + assert(j < count); + } + } + + stats = lsquic_purga_get_bloom_stats(purga); + LSQ_NOTICE("searches: %lu, false hits: %lu, false hit ratio: %lf", + stats->searches, stats->false_hits, + (double) stats->false_hits / (double) stats->searches); + + lsquic_purga_destroy(purga); + free(cids); +} + + +int +main (int argc, char **argv) +{ + int opt; + unsigned i, per_page, bloom_ins = 0, bloom_miss_sea = 0, bloom_hit_sea = 0; + lsquic_cid_t cid; + struct lsquic_purga *purga; + struct purga_el *puel; + + while (-1 != (opt = getopt(argc, argv, "b:h:l:s:v8"))) + { + switch (opt) + { + case '8': + s_eight = 1; + break; + case 'b': + bloom_ins = atoi(optarg); + break; + case 's': + bloom_miss_sea = atoi(optarg); + break; + case 'h': + bloom_hit_sea = atoi(optarg); + break; + case 'l': + lsquic_log_to_fstream(stderr, 0); + lsquic_logger_lopt(optarg); + break; + case 'v': + lsquic_log_to_fstream(stderr, 0); + lsquic_logger_lopt("purga=debug"); + break; + default: + exit(EXIT_FAILURE); + } + } + + if (bloom_ins) + { + LSQ_NOTICE("bloom test: will insert %u and search for %u missing " + "and %u extant CIDs", bloom_ins, bloom_miss_sea, bloom_hit_sea); + bloom_test(bloom_ins, bloom_miss_sea, bloom_hit_sea); + exit(EXIT_SUCCESS); + } + + per_page = lsquic_purga_cids_per_page(); + purga = lsquic_purga_new(10, NULL, NULL); + assert(purga); + + cid.len = 3; + for (i = 0; i < per_page; ++i) + { + cid.idbuf[0] = i >> 16; + cid.idbuf[1] = i >> 8; + cid.idbuf[2] = i; + puel = lsquic_purga_add(purga, &cid, NULL, PUTY_CONN_DELETED, 20); + assert(puel); + puel->puel_time = ~i; + } + + for (i = 0; i < per_page; ++i) + { + cid.idbuf[0] = i >> 16; + cid.idbuf[1] = i >> 8; + cid.idbuf[2] = i; + puel = lsquic_purga_contains(purga, &cid); + assert(puel && PUTY_CONN_DELETED == puel->puel_type); + ~i == puel->puel_time; + } + + ++cid.idbuf[1]; + lsquic_purga_add(purga, &cid, NULL, PUTY_CONN_DELETED, 31); + + for (i = 0; i < per_page; ++i) + { + cid.idbuf[0] = i >> 16; + cid.idbuf[1] = i >> 8; + cid.idbuf[2] = i; + puel = lsquic_purga_contains(purga, &cid); + assert(!puel); + } + + ++cid.idbuf[1]; + puel = lsquic_purga_contains(purga, &cid); + assert(puel && PUTY_CONN_DELETED == puel->puel_type); + + lsquic_purga_destroy(purga); + + bloom_test(20000, 200000, 2000); + + exit(EXIT_SUCCESS); +} diff --git a/test/unittests/test_qlog.c b/test/unittests/test_qlog.c index 82541eecb..68816986b 100644 --- a/test/unittests/test_qlog.c +++ b/test/unittests/test_qlog.c @@ -3,9 +3,11 @@ #include #include #include +#include #include "lsquic.h" #include "lsquic_int_types.h" +#include "lsquic_hash.h" #include "lsquic_conn.h" #include "lsquic_qlog.h" @@ -36,20 +38,21 @@ main (void) .sin_port = htons(443), .sin_addr = peer_addr, }; - lsquic_qlog_create_connection(0, (const struct sockaddr *)&local, + lsquic_cid_t cid = {}; + lsquic_qlog_create_connection(&cid, (const struct sockaddr *)&local, (const struct sockaddr *)&peer); - lsquic_qlog_packet_rx(0, NULL, NULL, 0); - lsquic_qlog_hsk_completed(0); - lsquic_qlog_zero_rtt(0); - lsquic_qlog_check_certs(0, NULL, 0); - - lsquic_qlog_version_negotiation(0, NULL, NULL); - lsquic_qlog_version_negotiation(0, "proposed", NULL); - lsquic_qlog_version_negotiation(0, "proposed", "Q035"); - lsquic_qlog_version_negotiation(0, "proposed", "Q046"); - lsquic_qlog_version_negotiation(0, "agreed", "Q044"); - lsquic_qlog_version_negotiation(0, "agreed", "Q098"); - lsquic_qlog_version_negotiation(0, "something else", "Q098"); + lsquic_qlog_packet_rx(&cid, NULL, NULL, 0); + lsquic_qlog_hsk_completed(&cid); + lsquic_qlog_zero_rtt(&cid); + lsquic_qlog_check_certs(&cid, NULL, 0); + + lsquic_qlog_version_negotiation(&cid, NULL, NULL); + lsquic_qlog_version_negotiation(&cid, "proposed", NULL); + lsquic_qlog_version_negotiation(&cid, "proposed", "Q035"); + lsquic_qlog_version_negotiation(&cid, "proposed", "Q046"); + lsquic_qlog_version_negotiation(&cid, "agreed", "Q044"); + lsquic_qlog_version_negotiation(&cid, "agreed", "Q098"); + lsquic_qlog_version_negotiation(&cid, "something else", "Q098"); return 0; } diff --git a/test/unittests/test_quic_be_floats.c b/test/unittests/test_quic_be_floats.c index e4b6e01ec..68f4e85bd 100644 --- a/test/unittests/test_quic_be_floats.c +++ b/test/unittests/test_quic_be_floats.c @@ -9,7 +9,6 @@ #include "lsquic.h" #include "lsquic_types.h" -#include "lsquic_alarmset.h" #include "lsquic_parse.h" diff --git a/test/unittests/test_rechist.c b/test/unittests/test_rechist.c index fffe35e11..d9853e852 100644 --- a/test/unittests/test_rechist.c +++ b/test/unittests/test_rechist.c @@ -12,6 +12,11 @@ #include "lsquic_util.h" #include "lsquic_logger.h" #include "lsquic.h" +#include "lsquic_hash.h" +#include "lsquic_conn.h" + + +static struct lsquic_conn lconn = LSCONN_INITIALIZER_CIDLEN(lconn, 0); static void @@ -21,7 +26,7 @@ test4 (void) const struct lsquic_packno_range *range; lsquic_packno_t packno; - lsquic_rechist_init(&rechist, 0); + lsquic_rechist_init(&rechist, &lconn, 0); for (packno = 11917; packno <= 11941; ++packno) lsquic_rechist_received(&rechist, packno, 0); @@ -122,7 +127,7 @@ test5 (void) lsquic_rechist_t rechist; char buf[100]; - lsquic_rechist_init(&rechist, 0); + lsquic_rechist_init(&rechist, &lconn, 0); lsquic_rechist_received(&rechist, 1, 0); /* Packet 2 omitted because it could not be decrypted */ @@ -178,7 +183,7 @@ main (void) lsq_log_levels[LSQLM_PARSE] = LSQ_LOG_DEBUG; lsq_log_levels[LSQLM_RECHIST] = LSQ_LOG_DEBUG; - lsquic_rechist_init(&rechist, 0); + lsquic_rechist_init(&rechist, &lconn, 0); lsquic_time_t now = lsquic_time_now(); st = lsquic_rechist_received(&rechist, 0, now); diff --git a/test/unittests/test_reg_pkt_headergen.c b/test/unittests/test_reg_pkt_headergen.c index 5091f1010..4aaebc902 100644 --- a/test/unittests/test_reg_pkt_headergen.c +++ b/test/unittests/test_reg_pkt_headergen.c @@ -6,12 +6,14 @@ #ifndef WIN32 #include #endif +#include #include "lsquic_types.h" #include "lsquic.h" -#include "lsquic_alarmset.h" +#include "lsquic_int_types.h" #include "lsquic_packet_common.h" #include "lsquic_packet_out.h" +#include "lsquic_hash.h" #include "lsquic_conn.h" #include "lsquic_parse.h" @@ -20,7 +22,7 @@ struct test { const struct parse_funcs *pf; size_t bufsz; - lsquic_cid_t cid; /* Zero means connection ID is not specified */ + uint64_t cid; /* Zero means connection ID is not specified */ const char *nonce; lsquic_packno_t packno; enum packno_bits @@ -41,26 +43,9 @@ struct test { static const struct test tests[] = { - { - .pf = select_pf_by_ver(LSQVER_035), - .bufsz = QUIC_MAX_PUBHDR_SZ, - .cid = 0x0102030405060708UL, - .nonce = NULL, - .packno = 0x01020304, - .bits = GQUIC_PACKNO_LEN_4, - .len = 1 + 8 + 0 + 4, - .out = { (0 << 2) /* Nonce present */ - | 0x08 /* Connection ID present */ - | 0x20 /* Packet number length */ - , - 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Connection ID */ - 0x04, 0x03, 0x02, 0x01, /* Packet number */ - }, - }, - { .pf = select_pf_by_ver(LSQVER_039), - .bufsz = QUIC_MAX_PUBHDR_SZ, + .bufsz = GQUIC_MAX_PUBHDR_SZ, .cid = 0x0102030405060708UL, .nonce = NULL, .packno = 0x01020304, @@ -76,8 +61,8 @@ static const struct test tests[] = { }, { - .pf = select_pf_by_ver(LSQVER_035), - .bufsz = QUIC_MAX_PUBHDR_SZ, + .pf = select_pf_by_ver(LSQVER_039), + .bufsz = GQUIC_MAX_PUBHDR_SZ, .cid = 0x0102030405060708UL, .nonce = NULL, .packno = 0x00, @@ -92,29 +77,9 @@ static const struct test tests[] = { }, }, - { - .pf = select_pf_by_ver(LSQVER_035), - .bufsz = QUIC_MAX_PUBHDR_SZ, - .cid = 0x0102030405060708UL, - .nonce = NULL, - .packno = 0x00, - .bits = GQUIC_PACKNO_LEN_1, - .ver.buf= { 'Q', '0', '3', '5', }, - .len = 1 + 8 + 4 + 0 + 1, - .out = { (0 << 2) /* Nonce present */ - | 0x01 /* Version present */ - | 0x08 /* Connection ID present */ - | 0x00 /* Packet number length */ - , - 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Connection ID */ - 'Q', '0', '3', '5', - 0x00, /* Packet number */ - }, - }, - { .pf = select_pf_by_ver(LSQVER_039), - .bufsz = QUIC_MAX_PUBHDR_SZ, + .bufsz = GQUIC_MAX_PUBHDR_SZ, .cid = 0x0102030405060708UL, .nonce = NULL, .packno = 0x09, @@ -136,8 +101,8 @@ static const struct test tests[] = { #define NONCENSE_BYTES '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v' { - .pf = select_pf_by_ver(LSQVER_035), - .bufsz = QUIC_MAX_PUBHDR_SZ, + .pf = select_pf_by_ver(LSQVER_039), + .bufsz = GQUIC_MAX_PUBHDR_SZ, .cid = 0x0102030405060708UL, .nonce = NONCENSE, .packno = 0x00, @@ -154,8 +119,8 @@ static const struct test tests[] = { }, { - .pf = select_pf_by_ver(LSQVER_035), - .bufsz = QUIC_MAX_PUBHDR_SZ, + .pf = select_pf_by_ver(LSQVER_039), + .bufsz = GQUIC_MAX_PUBHDR_SZ, .cid = 0, /* Do not set connection ID */ .nonce = NONCENSE, .packno = 0x00, @@ -170,13 +135,13 @@ static const struct test tests[] = { }, { - .pf = select_pf_by_ver(LSQVER_035), - .bufsz = QUIC_MAX_PUBHDR_SZ, + .pf = select_pf_by_ver(LSQVER_039), + .bufsz = GQUIC_MAX_PUBHDR_SZ, .cid = 0x0102030405060708UL, .nonce = NONCENSE, .packno = 0x00, .bits = GQUIC_PACKNO_LEN_1, - .ver.buf= { 'Q', '0', '3', '5', }, + .ver.buf= { 'Q', '0', '3', '9', }, .len = 1 + 8 + 4 + 32 + 1, .out = { (1 << 2) /* Nonce present */ | 0x01 /* Version present */ @@ -184,15 +149,15 @@ static const struct test tests[] = { | 0x00 /* Packet number length */ , 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Connection ID */ - 'Q', '0', '3', '5', + 'Q', '0', '3', '9', NONCENSE_BYTES, 0x00, /* Packet number */ }, }, { - .pf = select_pf_by_ver(LSQVER_035), - .bufsz = QUIC_MAX_PUBHDR_SZ, + .pf = select_pf_by_ver(LSQVER_039), + .bufsz = GQUIC_MAX_PUBHDR_SZ, .cid = 0x0102030405060708UL, .nonce = NONCENSE, .packno = 0xA0A1A2A3A4A5A6A7UL, @@ -204,13 +169,13 @@ static const struct test tests[] = { , 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Connection ID */ NONCENSE_BYTES, - 0xA7, 0xA6, 0xA5, 0xA4, 0xA3, 0xA2, + 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, }, }, { .pf = select_pf_by_ver(LSQVER_039), - .bufsz = QUIC_MAX_PUBHDR_SZ, + .bufsz = GQUIC_MAX_PUBHDR_SZ, .cid = 0x0102030405060708UL, .nonce = NONCENSE, .packno = 0xA0A1A2A3A4A5A6A7UL, @@ -246,9 +211,14 @@ run_test (int i) }; lsquic_packet_out_set_packno_bits(&packet_out, test->bits); - struct lsquic_conn lconn = { .cn_cid = test->cid, }; + lsquic_cid_t cid; + memset(&cid, 0, sizeof(cid)); + cid.len = sizeof(test->cid); + memcpy(cid.idbuf, &test->cid, sizeof(test->cid)); + + struct lsquic_conn lconn = LSCONN_INITIALIZER_CID(lconn, cid); - unsigned char out[QUIC_MAX_PUBHDR_SZ]; + unsigned char out[GQUIC_MAX_PUBHDR_SZ]; int len = test->pf->pf_gen_reg_pkt_header(&lconn, &packet_out, out, sizeof(out)); diff --git a/test/unittests/test_rst_stream_gquic_be.c b/test/unittests/test_rst_stream_gquic_be.c index 2f09aab3f..2e03ee54b 100644 --- a/test/unittests/test_rst_stream_gquic_be.c +++ b/test/unittests/test_rst_stream_gquic_be.c @@ -9,7 +9,6 @@ #include "lsquic.h" #include "lsquic_types.h" -#include "lsquic_alarmset.h" #include "lsquic_parse.h" static const struct parse_funcs *const pf = select_pf_by_ver(LSQVER_039); @@ -19,15 +18,15 @@ static const struct parse_funcs *const pf = select_pf_by_ver(LSQVER_039); struct wuf_test { unsigned char buf[0x20]; size_t buf_len; - uint32_t stream_id; + lsquic_stream_id_t stream_id; uint64_t offset; - uint32_t error_code; + uint64_t error_code; }; static const struct wuf_test wuf_tests[] = { { .buf = { 0x01, 0x00, 0x67, 0x45, 0x34, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x00, 0x00, 0x03, }, - .buf_len = QUIC_RST_STREAM_SZ, + .buf_len = GQUIC_RST_STREAM_SZ, .stream_id = 0x674534, .offset = 0x0102030405, .error_code = 0x03, @@ -43,11 +42,10 @@ run_parse_tests (void) const struct wuf_test *test; for (test = wuf_tests; test->buf[0]; ++test) { - uint32_t stream_id = ~0; - uint64_t offset = ~0; - uint32_t error_code = ~0; + lsquic_stream_id_t stream_id = ~0; + uint64_t offset = ~0, error_code = ~0; int sz = pf->pf_parse_rst_frame(test->buf, test->buf_len, &stream_id, &offset, &error_code); - assert(sz == QUIC_RST_STREAM_SZ); + assert(sz == GQUIC_RST_STREAM_SZ); assert(stream_id == test->stream_id); assert(offset == test->offset); assert(error_code == test->error_code); @@ -63,7 +61,7 @@ run_gen_tests (void) { unsigned char buf[0x100]; int sz = pf->pf_gen_rst_frame(buf, test->buf_len, test->stream_id, test->offset, test->error_code); - assert(sz == QUIC_RST_STREAM_SZ); + assert(sz == GQUIC_RST_STREAM_SZ); assert(0 == memcmp(buf, test->buf, sz)); } } diff --git a/test/unittests/test_rst_stream_ietf.c b/test/unittests/test_rst_stream_ietf.c new file mode 100644 index 000000000..64a67d908 --- /dev/null +++ b/test/unittests/test_rst_stream_ietf.c @@ -0,0 +1,81 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#include +#include +#include +#include +#ifndef WIN32 +#include +#endif + +#include "lsquic.h" +#include "lsquic_types.h" +#include "lsquic_parse.h" + +static const struct parse_funcs *const pf = select_pf_by_ver(LSQVER_041); + + +/* The test is both for generation and parsing: */ +struct rst_stream_test { + unsigned char buf[0x20]; + size_t buf_len; + lsquic_stream_id_t stream_id; + uint64_t offset; + uint32_t error_code; +}; + +static const struct rst_stream_test rst_stream_tests[] = { + { + .buf = { 0x01, + 0x00, 0x67, 0x45, 0x34, + 0x00, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + }, + .buf_len = GQUIC_RST_STREAM_SZ, + .stream_id = 0x674534, + .offset = 0x0102030405, + .error_code = 0x03, + }, + + { .buf = { 0 }, } +}; + + +static void +run_parse_tests (void) +{ + const struct rst_stream_test *test; + for (test = rst_stream_tests; test->buf[0]; ++test) + { + lsquic_stream_id_t stream_id = ~0; + uint64_t offset = ~0; + uint32_t error_code = ~0; + int sz = pf->pf_parse_rst_frame(test->buf, test->buf_len, &stream_id, &offset, &error_code); + assert(sz == GQUIC_RST_STREAM_SZ); + assert(stream_id == test->stream_id); + assert(offset == test->offset); + assert(error_code == test->error_code); + } +} + + +static void +run_gen_tests (void) +{ + const struct rst_stream_test *test; + for (test = rst_stream_tests; test->buf[0]; ++test) + { + unsigned char buf[0x100]; + int sz = pf->pf_gen_rst_frame(buf, test->buf_len, test->stream_id, test->offset, test->error_code); + assert(sz == GQUIC_RST_STREAM_SZ); + assert(0 == memcmp(buf, test->buf, sz)); + } +} + + +int +main (void) +{ + run_parse_tests(); + run_gen_tests(); + return 0; +} diff --git a/test/unittests/test_send_headers.c b/test/unittests/test_send_headers.c new file mode 100644 index 000000000..74a090af4 --- /dev/null +++ b/test/unittests/test_send_headers.c @@ -0,0 +1,621 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * test_send_headers.c -- Test what happens when lsquic_stream_send_headers() + * is called. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef WIN32 +#include +#else +#include +#endif + +#include "lsquic.h" + +#include "lsquic_packet_common.h" +#include "lsquic_packet_ietf.h" +#include "lsquic_alarmset.h" +#include "lsquic_packet_in.h" +#include "lsquic_conn_flow.h" +#include "lsquic_rtt.h" +#include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" +#include "lsquic_stream.h" +#include "lsquic_types.h" +#include "lsquic_malo.h" +#include "lsquic_mm.h" +#include "lsquic_conn_public.h" +#include "lsquic_logger.h" +#include "lsquic_parse.h" +#include "lsquic_conn.h" +#include "lsquic_engine_public.h" +#include "lsquic_cubic.h" +#include "lsquic_pacer.h" +#include "lsquic_senhist.h" +#include "lsquic_bw_sampler.h" +#include "lsquic_minmax.h" +#include "lsquic_bbr.h" +#include "lsquic_send_ctl.h" +#include "lsquic_ver_neg.h" +#include "lsquic_packet_out.h" +#include "lsquic_enc_sess.h" +#include "lsqpack.h" +#include "lsquic_frab_list.h" +#include "lsquic_qenc_hdl.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_data_in_if.h" +#include "lsquic_h3_prio.h" +#include "lsquic_headers.h" +#include "lsquic_push_promise.h" + +static int s_call_wantwrite_in_ctor; +static int s_wantwrite_arg; +static int s_onwrite_called; + +static lsquic_stream_ctx_t * +on_new_stream (void *stream_if_ctx, lsquic_stream_t *stream) +{ + if (s_call_wantwrite_in_ctor) + lsquic_stream_wantwrite(stream, s_wantwrite_arg); + return NULL; +} + + +static void +on_close (lsquic_stream_t *stream, lsquic_stream_ctx_t *st_h) +{ +} + + +static void +on_write (lsquic_stream_t *stream, lsquic_stream_ctx_t *h) +{ + s_onwrite_called = 1; + lsquic_stream_wantwrite(stream, 0); +} + + +const struct lsquic_stream_if stream_if = { + .on_new_stream = on_new_stream, + .on_write = on_write, + .on_close = on_close, +}; + + +enum buf_packet_type +lsquic_send_ctl_determine_bpt (struct lsquic_send_ctl *ctl, + const struct lsquic_stream *stream) +{ + return BPT_HIGHEST_PRIO; +} + + +/* This function is only here to avoid crash in the test: */ +void +lsquic_engine_add_conn_to_tickable (struct lsquic_engine_public *enpub, + lsquic_conn_t *conn) +{ +} + + +struct test_objs { + struct lsquic_engine_public eng_pub; + struct lsquic_conn lconn; + struct lsquic_conn_public conn_pub; + struct lsquic_send_ctl send_ctl; + struct lsquic_alarmset alset; + void *stream_if_ctx; + struct ver_neg ver_neg; + const struct lsquic_stream_if * + stream_if; + unsigned initial_stream_window; + enum stream_ctor_flags ctor_flags; + struct qpack_enc_hdl qeh; +}; + + +static int +unit_test_doesnt_write_ack (struct lsquic_conn *lconn) +{ + return 0; +} + + +static struct network_path network_path; + +static struct network_path * +get_network_path (struct lsquic_conn *lconn, const struct sockaddr *sa) +{ + return &network_path; +} + + +static const struct conn_iface our_conn_if = +{ + .ci_can_write_ack = unit_test_doesnt_write_ack, + .ci_get_path = get_network_path, +}; + + +static void +init_test_objs (struct test_objs *tobjs, unsigned initial_conn_window, + unsigned initial_stream_window) +{ + int s; + memset(tobjs, 0, sizeof(*tobjs)); + LSCONN_INITIALIZE(&tobjs->lconn); + tobjs->lconn.cn_pf = select_pf_by_ver(LSQVER_ID22); + tobjs->lconn.cn_version = LSQVER_ID22; + tobjs->lconn.cn_esf_c = &lsquic_enc_session_common_ietf_v1; + network_path.np_pack_size = IQUIC_MAX_IPv4_PACKET_SZ; + tobjs->lconn.cn_if = &our_conn_if; + lsquic_mm_init(&tobjs->eng_pub.enp_mm); + TAILQ_INIT(&tobjs->conn_pub.sending_streams); + TAILQ_INIT(&tobjs->conn_pub.read_streams); + TAILQ_INIT(&tobjs->conn_pub.write_streams); + TAILQ_INIT(&tobjs->conn_pub.service_streams); + lsquic_cfcw_init(&tobjs->conn_pub.cfcw, &tobjs->conn_pub, + initial_conn_window); + lsquic_conn_cap_init(&tobjs->conn_pub.conn_cap, initial_conn_window); + lsquic_alarmset_init(&tobjs->alset, 0); + tobjs->conn_pub.mm = &tobjs->eng_pub.enp_mm; + tobjs->conn_pub.lconn = &tobjs->lconn; + tobjs->conn_pub.enpub = &tobjs->eng_pub; + tobjs->conn_pub.send_ctl = &tobjs->send_ctl; + tobjs->conn_pub.packet_out_malo = + lsquic_malo_create(sizeof(struct lsquic_packet_out)); + tobjs->conn_pub.path = &network_path; + tobjs->initial_stream_window = initial_stream_window; + lsquic_send_ctl_init(&tobjs->send_ctl, &tobjs->alset, &tobjs->eng_pub, + &tobjs->ver_neg, &tobjs->conn_pub, 0); + tobjs->stream_if = &stream_if; + tobjs->stream_if_ctx = NULL; + tobjs->ctor_flags = SCF_CALL_ON_NEW|SCF_DI_AUTOSWITCH|SCF_IETF|SCF_HTTP; + if ((1 << tobjs->lconn.cn_version) & LSQUIC_IETF_VERSIONS) + { + lsquic_qeh_init(&tobjs->qeh, &tobjs->lconn); + s = lsquic_qeh_settings(&tobjs->qeh, 0, 0, 0, 0); + assert(0 == s); + tobjs->conn_pub.u.ietf.qeh = &tobjs->qeh; + } + if (tobjs->ctor_flags & SCF_IETF) + tobjs->conn_pub.u.ietf.prio_tree + = lsquic_prio_tree_new(&tobjs->lconn, 0); +} + + +static void +deinit_test_objs (struct test_objs *tobjs) +{ + assert(!lsquic_malo_first(tobjs->eng_pub.enp_mm.malo.stream_frame)); + lsquic_send_ctl_cleanup(&tobjs->send_ctl); + lsquic_malo_destroy(tobjs->conn_pub.packet_out_malo); + lsquic_mm_cleanup(&tobjs->eng_pub.enp_mm); + if ((1 << tobjs->lconn.cn_version) & LSQUIC_IETF_VERSIONS) + lsquic_qeh_cleanup(&tobjs->qeh); + if (tobjs->ctor_flags & SCF_IETF) + lsquic_prio_tree_destroy(tobjs->conn_pub.u.ietf.prio_tree); +} + + +static struct lsquic_stream * +new_stream (struct test_objs *tobjs, unsigned stream_id, uint64_t send_off) +{ + return lsquic_stream_new(stream_id, &tobjs->conn_pub, tobjs->stream_if, + tobjs->stream_if_ctx, tobjs->initial_stream_window, send_off, + tobjs->ctor_flags); +} + +static struct test_vals { + /* What lsquic_qeh_write_headers() returns or sets */ + enum qwh_status status; + size_t prefix_sz; + size_t headers_sz; + uint64_t completion_offset; +} test_vals; + + +enum qwh_status +lsquic_qeh_write_headers (struct qpack_enc_hdl *qeh, + lsquic_stream_id_t stream_id, unsigned seqno, + const struct lsquic_http_headers *headers, unsigned char *buf, + size_t *prefix_sz, size_t *headers_sz, uint64_t *completion_offset) +{ + memset(buf, 0xC5, *prefix_sz + *headers_sz); + *prefix_sz = test_vals.prefix_sz; + *headers_sz = test_vals.headers_sz; + *completion_offset = test_vals.completion_offset; + return test_vals.status; +} + + +static uint64_t s_enc_off; + +uint64_t +lsquic_qeh_enc_off (struct qpack_enc_hdl *qeh) +{ + return s_enc_off; +} + + +static void +test_flushes_and_closes (void) +{ + struct test_objs tobjs; + struct lsquic_stream *stream; + ssize_t nw; + int s; + struct uncompressed_headers *uh; + void *hset; + + /* For our tests purposes, we treat headers as an opaque object */ + struct lsquic_http_headers *headers = (void *) 1; + + init_test_objs(&tobjs, 0x1000, 0x1000); + + stream = new_stream(&tobjs, 0, 0x1000); + test_vals.status = QWH_FULL; + test_vals.prefix_sz = 2; + test_vals.headers_sz = 40; + test_vals.completion_offset = 0; + s = lsquic_stream_send_headers(stream, headers, 0); + assert(0 == s); + assert(stream->sm_n_buffered == test_vals.prefix_sz + test_vals.headers_sz); + assert(0 == stream->sm_hblock_sz); + lsquic_stream_destroy(stream); + + stream = new_stream(&tobjs, 4, 0x1000); + test_vals.status = QWH_PARTIAL; + test_vals.prefix_sz = 2; + test_vals.headers_sz = 40; + test_vals.completion_offset = 10; + s = lsquic_stream_send_headers(stream, headers, 0); + assert(0 == s); + assert(stream->sm_hblock_sz == test_vals.prefix_sz + test_vals.headers_sz); + assert(0 == stream->sm_n_buffered); + nw = lsquic_stream_write(stream, "hello", 5); + assert(0 == nw); + s = lsquic_stream_flush(stream); + assert(s == 0); + lsquic_stream_destroy(stream); + + /* Mock server side stream cycle */ + stream = new_stream(&tobjs, 8, 0x1000); + uh = calloc(1, sizeof(*uh)); + *uh = (struct uncompressed_headers) { + .uh_stream_id = stream->id, + .uh_weight = 127, + .uh_hset = (void *) 12345, + }; + s = lsquic_stream_uh_in(stream, uh); + assert(s == 0); + hset = lsquic_stream_get_hset(stream); + assert(hset == (void *) 12345); + s = lsquic_stream_shutdown(stream, 0); + assert(0 == s); + test_vals.status = QWH_PARTIAL; + test_vals.prefix_sz = 2; + test_vals.headers_sz = 40; + test_vals.completion_offset = 10; + assert(!(stream->sm_qflags & SMQF_WANT_WRITE)); /* Begin with them off */ + s = lsquic_stream_send_headers(stream, headers, 0); + assert(0 == s); + assert(stream->sm_hblock_sz == test_vals.prefix_sz + test_vals.headers_sz); + assert(0 == stream->sm_n_buffered); + assert(stream->sm_qflags & SMQF_WANT_WRITE); /* Want write is now set */ + nw = lsquic_stream_write(stream, "hello", 5); + assert(0 == nw); + s = lsquic_stream_flush(stream); + assert(s == 0); + s = lsquic_stream_close(stream); + assert(s == 0); + assert(stream->sm_hblock_sz == test_vals.prefix_sz + test_vals.headers_sz); + assert(0 == stream->sm_n_buffered); + assert(stream->sm_qflags & SMQF_WANT_WRITE); /* Still set */ + s_enc_off = 10; /* Encoder is done writing */ + lsquic_stream_dispatch_write_events(stream); + assert(stream->sm_qflags & SMQF_CALL_ONCLOSE); + lsquic_stream_acked(stream, QUIC_FRAME_STREAM); + lsquic_stream_call_on_close(stream); + assert(stream->sm_qflags & SMQF_FREE_STREAM); + lsquic_stream_destroy(stream); + + deinit_test_objs(&tobjs); +} + + +static void +test_headers_wantwrite_restoration (const int want_write) +{ + struct test_objs tobjs; + struct lsquic_stream *stream; + ssize_t nw; + int s; + struct uncompressed_headers *uh; + void *hset; + + s_call_wantwrite_in_ctor = 1; + s_wantwrite_arg = want_write; + + /* For our tests purposes, we treat headers as an opaque object */ + struct lsquic_http_headers *headers = (void *) 1; + + init_test_objs(&tobjs, 0x1000, 0x1000); + + /* Mock server side stream cycle */ + + stream = new_stream(&tobjs, 4 * __LINE__, 0x1000); + uh = calloc(1, sizeof(*uh)); + *uh = (struct uncompressed_headers) { + .uh_stream_id = stream->id, + .uh_weight = 127, + .uh_hset = (void *) 12345, + }; + s = lsquic_stream_uh_in(stream, uh); + assert(s == 0); + hset = lsquic_stream_get_hset(stream); + assert(hset == (void *) 12345); + s = lsquic_stream_shutdown(stream, 0); + assert(0 == s); + test_vals.status = QWH_PARTIAL; + test_vals.prefix_sz = 2; + test_vals.headers_sz = 40; + test_vals.completion_offset = 10; + assert(want_write == !!(stream->sm_qflags & SMQF_WANT_WRITE)); + s = lsquic_stream_send_headers(stream, headers, 0); + assert(0 == s); + assert(stream->sm_hblock_sz == test_vals.prefix_sz + test_vals.headers_sz); + assert(0 == stream->sm_n_buffered); + assert(stream->sm_qflags & SMQF_WANT_WRITE); /* Want write is now set */ + nw = lsquic_stream_write(stream, "hello", 5); + assert(0 == nw); + s = lsquic_stream_flush(stream); + assert(s == 0); + s = lsquic_stream_close(stream); + assert(s == 0); + assert(stream->sm_hblock_sz == test_vals.prefix_sz + test_vals.headers_sz); + assert(0 == stream->sm_n_buffered); + assert(stream->sm_qflags & SMQF_WANT_WRITE); /* Still set */ + s_enc_off = 10; /* Encoder is done writing */ + lsquic_stream_dispatch_write_events(stream); + assert(stream->sm_qflags & SMQF_CALL_ONCLOSE); + lsquic_stream_acked(stream, QUIC_FRAME_STREAM); + lsquic_stream_call_on_close(stream); + assert(stream->sm_qflags & SMQF_FREE_STREAM); + lsquic_stream_destroy(stream); + + stream = new_stream(&tobjs, 4 * __LINE__, 0x1000); + uh = calloc(1, sizeof(*uh)); + *uh = (struct uncompressed_headers) { + .uh_stream_id = stream->id, + .uh_weight = 127, + .uh_hset = (void *) 12345, + }; + s = lsquic_stream_uh_in(stream, uh); + assert(s == 0); + hset = lsquic_stream_get_hset(stream); + assert(hset == (void *) 12345); + s = lsquic_stream_shutdown(stream, 0); + assert(0 == s); + test_vals.status = QWH_PARTIAL; + test_vals.prefix_sz = 2; + test_vals.headers_sz = 40; + test_vals.completion_offset = 10; + assert(want_write == !!(stream->sm_qflags & SMQF_WANT_WRITE)); + s = lsquic_stream_send_headers(stream, headers, 0); + assert(0 == s); + assert(stream->sm_hblock_sz == test_vals.prefix_sz + test_vals.headers_sz); + assert(0 == stream->sm_n_buffered); + assert(stream->sm_qflags & SMQF_WANT_WRITE); /* Want write is now set */ + s_enc_off = 10; /* Encoder is done writing */ + lsquic_stream_dispatch_write_events(stream); + assert(0 == stream->sm_hblock_sz); /* Wrote header */ + assert(want_write == s_onwrite_called); + lsquic_stream_destroy(stream); + + deinit_test_objs(&tobjs); + s_call_wantwrite_in_ctor = 0; + s_wantwrite_arg = 0; + s_onwrite_called = 0; +} + + +static void +test_pp_wantwrite_restoration (const int want_write) +{ + struct test_objs tobjs; + struct lsquic_stream *stream; + int s; + struct uncompressed_headers *uh; + struct push_promise *promise; + void *hset; + + s_call_wantwrite_in_ctor = 1; + s_wantwrite_arg = want_write; + + init_test_objs(&tobjs, 0x1000, 0x1000); + + /* Mock server side stream cycle */ + + stream = new_stream(&tobjs, 4 * __LINE__, 10); + uh = calloc(1, sizeof(*uh)); + *uh = (struct uncompressed_headers) { + .uh_stream_id = stream->id, + .uh_weight = 127, + .uh_hset = (void *) 12345, + }; + s = lsquic_stream_uh_in(stream, uh); + assert(s == 0); + hset = lsquic_stream_get_hset(stream); + assert(hset == (void *) 12345); + s = lsquic_stream_shutdown(stream, 0); + assert(0 == s); + promise = calloc(1, sizeof(*promise) + 20); + promise->pp_id = 0; + promise->pp_content_len = 20; + assert(want_write == !!(stream->sm_qflags & SMQF_WANT_WRITE)); + s = lsquic_stream_push_promise(stream, promise); + assert(s == 0); + assert((stream->stream_flags & (STREAM_NOPUSH|STREAM_PUSHING)) + == (STREAM_NOPUSH|STREAM_PUSHING)); + assert(stream->sm_qflags & SMQF_WANT_WRITE); /* Want write is now set */ + /* Dispatch: there should be no progress made */ + lsquic_stream_dispatch_write_events(stream); + assert((stream->stream_flags & (STREAM_NOPUSH|STREAM_PUSHING)) + == (STREAM_NOPUSH|STREAM_PUSHING)); + assert(stream->sm_qflags & SMQF_WANT_WRITE); + assert(SLIST_FIRST(&stream->sm_promises)->pp_write_state != PPWS_DONE); + /* Now update window and dispatch again */ + lsquic_stream_window_update(stream, 100); + lsquic_stream_dispatch_write_events(stream); + assert((stream->stream_flags & (STREAM_NOPUSH|STREAM_PUSHING)) + == (STREAM_NOPUSH|STREAM_PUSHING)); + assert(SLIST_FIRST(&stream->sm_promises)->pp_write_state == PPWS_DONE); /* Done! */ + assert(want_write == s_onwrite_called); /* Restored: and on_write called */ + + deinit_test_objs(&tobjs); + s_call_wantwrite_in_ctor = 0; + s_wantwrite_arg = 0; + s_onwrite_called = 0; +} + + +/* Create a new stream frame. Each stream frame has a real packet_in to + * back it up, just like in real code. The contents of the packet do + * not matter. + */ +static stream_frame_t * +new_frame_in_ext (struct test_objs *tobjs, size_t off, size_t sz, int fin, + const void *data) +{ + lsquic_packet_in_t *packet_in; + stream_frame_t *frame; + + assert(sz <= 1370); + + packet_in = lsquic_mm_get_packet_in(&tobjs->eng_pub.enp_mm); + if (data) + packet_in->pi_data = (void *) data; + else + { + packet_in->pi_data = lsquic_mm_get_packet_in_buf(&tobjs->eng_pub.enp_mm, 1370); + packet_in->pi_flags |= PI_OWN_DATA; + memset(packet_in->pi_data, 'A', sz); + } + /* This is not how stream frame looks in the packet: we have no + * header. In our test case it does not matter, as we only care + * about stream frame. + */ + packet_in->pi_data_sz = sz; + packet_in->pi_refcnt = 1; + + frame = lsquic_malo_get(tobjs->eng_pub.enp_mm.malo.stream_frame); + memset(frame, 0, sizeof(*frame)); + frame->packet_in = packet_in; + frame->data_frame.df_offset = off; + frame->data_frame.df_size = sz; + frame->data_frame.df_data = &packet_in->pi_data[0]; + frame->data_frame.df_fin = fin; + + return frame; +} + + +static stream_frame_t * +new_frame_in (struct test_objs *tobjs, size_t off, size_t sz, int fin) +{ + return new_frame_in_ext(tobjs, off, sz, fin, NULL); +} + + +/* Test that reading from stream returns -1/EWOULDBLOCK if no headers are + * available. + */ +static void +test_read_headers (int ietf, int use_hset) +{ + struct test_objs tobjs; + struct lsquic_stream *stream; + struct stream_frame *frame; + ssize_t nr; + int s; + void *hset; + unsigned char buf[1]; + + init_test_objs(&tobjs, 0x1000, 0x1000); + tobjs.ctor_flags &= ~SCF_IETF; + if (ietf) + tobjs.ctor_flags |= SCF_IETF; + + stream = new_stream(&tobjs, 0, 0x1000); + frame = new_frame_in(&tobjs, 0, 35, 1); + s = lsquic_stream_frame_in(stream, frame); + assert(s == 0); + + if (use_hset) + { + hset = lsquic_stream_get_hset(stream); + assert(NULL == hset); + } + else + { + nr = lsquic_stream_read(stream, buf, sizeof(buf)); + assert(-1 == nr); + /* In GQUIC mode, the error is that the headers are no available yet. + * In IETF mode, the error is that we hit EOF unexpectedly -- as headers + * are sent on the same stream in HEADERS frame. + */ + if (!ietf) + assert(EWOULDBLOCK == errno); + } + + lsquic_stream_destroy(stream); + + deinit_test_objs(&tobjs); +} + + +int +main (int argc, char **argv) +{ + int opt; + + lsquic_global_init(LSQUIC_GLOBAL_SERVER); + + while (-1 != (opt = getopt(argc, argv, "l:"))) + { + switch (opt) + { + case 'l': + lsquic_log_to_fstream(stderr, 0); + lsquic_logger_lopt(optarg); + break; + default: + exit(1); + } + } + + test_flushes_and_closes(); + test_headers_wantwrite_restoration(0); + test_headers_wantwrite_restoration(1); + test_pp_wantwrite_restoration(0); + test_pp_wantwrite_restoration(1); + test_read_headers(0, 0); + test_read_headers(0, 1); + test_read_headers(1, 0); + test_read_headers(1, 1); + + return 0; +} diff --git a/test/unittests/test_senhist.c b/test/unittests/test_senhist.c index e86451980..2c8363a64 100644 --- a/test/unittests/test_senhist.c +++ b/test/unittests/test_senhist.c @@ -7,6 +7,7 @@ #include "lsquic_int_types.h" #include "lsquic_senhist.h" +#include "lsquic_types.h" #include "lsquic_logger.h" @@ -20,7 +21,7 @@ main (void) }; lsquic_packno_t packno; - lsquic_senhist_init(&hist); + lsquic_senhist_init(&hist, 0); assert(0 == lsquic_senhist_largest(&hist)); diff --git a/test/unittests/test_sfcw.c b/test/unittests/test_sfcw.c index 866e5f1bf..300b20a35 100644 --- a/test/unittests/test_sfcw.c +++ b/test/unittests/test_sfcw.c @@ -11,6 +11,9 @@ #include "lsquic_conn_flow.h" #include "lsquic_rtt.h" #include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" #include "lsquic_stream.h" #include "lsquic_conn_public.h" #include "lsquic_conn.h" @@ -28,6 +31,7 @@ main (void) int s; memset(&lconn, 0, sizeof(lconn)); + LSCONN_INITIALIZE(&lconn); memset(&conn_pub, 0, sizeof(conn_pub)); conn_pub.lconn = &lconn; lsquic_sfcw_init(&fc, INIT_WINDOW_SIZE, NULL, &conn_pub, 123); diff --git a/test/unittests/test_shi.c b/test/unittests/test_shi.c new file mode 100644 index 000000000..d5746a81c --- /dev/null +++ b/test/unittests/test_shi.c @@ -0,0 +1,138 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#include +#include +#include +#include +#include + +#include "lsquic.h" +#include "lsquic_stock_shi.h" + +static const struct pair { + const char *key, *value; +} pairs[] = { + { "Dude,", "where is my car?", }, + { "Balls of fur", "y", }, + { "Grand", "piano", }, + { "sWeet", "Potato", }, + { "Mac ", "and CHEESE!", }, +}; + + +struct data { + size_t size; /* Overall size including the payload */ + char *key; + char *value; + char data[0]; /* key followed by value */ +}; + + +static struct data * +new_data (const char *key, const char *value) +{ + size_t klen = strlen(key); + size_t vlen = strlen(value); + size_t size = klen + vlen + 2 + sizeof(struct data); + struct data *data = malloc(size); + data->size = size; + data->key = data->data; + data->value = data->data + klen + 1; + memcpy(data->data, key, klen); + data->key[klen] = '\0'; + memcpy(data->value, value, vlen); + data->value[vlen] = '\0'; + return data; +} + + +#define N_PAIRS (sizeof(pairs) / sizeof(pairs[0])) + +static const struct order { + int order[N_PAIRS]; + int expire; +} orderings[] = { + {{ 0, 1, 2, 3, 4, }, 1, }, + {{ 0, 2, 3, 1, 4, }, 2, }, + {{ 2, 1, 0, 4, 3, }, 3, }, +}; + + +static void +test_shi (const struct order *order) +{ + unsigned i; + int s; + struct stock_shared_hash *hash; + const struct pair *pair; + unsigned data_sz; + const time_t now = time(NULL); + time_t expiry; + void *datap; + struct data *data; + + hash = stock_shared_hash_new(); + + for (i = 0; i < N_PAIRS; ++i) + { + pair = &pairs[ order->order[i] ]; + if (order->order[i] == order->expire) + expiry = now + 1; + else + expiry = 0; + data = new_data(pair->key, pair->value); + s = stock_shi.shi_insert(hash, strdup(data->key), strlen(data->key), + data, data->size, expiry); + assert(0 == s); + } + + sleep(2); /* Let the thing expire */ + + for (i = 0; i < N_PAIRS; ++i) + { + pair = &pairs[ order->order[i] ]; + s = stock_shi.shi_lookup(hash, pair->key, strlen(pair->key), + &datap, &data_sz); + if (order->order[i] == order->expire) + { + assert(0 == s); + } + else + { + data = datap; + assert(1 == s); + assert(data_sz == data->size); + assert(0 == strcmp(pair->key, data->key)); + assert(0 == strcmp(pair->value, data->value)); + } + } + + for (i = 0; i < N_PAIRS; ++i) + { + pair = &pairs[ order->order[i] ]; + s = stock_shi.shi_delete(hash, pair->key, strlen(pair->key)); + if (order->order[i] == order->expire) + assert(0 != s); + else + assert(0 == s); + } + + for (i = 0; i < N_PAIRS; ++i) + { + pair = &pairs[ order->order[i] ]; + s = stock_shi.shi_lookup(hash, pair->key, strlen(pair->key), + &datap, &data_sz); + assert(0 == s); + } + + stock_shared_hash_destroy(hash); +} + + +int +main (void) +{ + unsigned i; + for (i = 0; i < sizeof(orderings) / sizeof(orderings[0]); ++i) + test_shi(&orderings[i]); + return 0; +} diff --git a/test/unittests/test_some_packets.c b/test/unittests/test_some_packets.c index d7993c6c5..dec8fdbd4 100644 --- a/test/unittests/test_some_packets.c +++ b/test/unittests/test_some_packets.c @@ -10,9 +10,11 @@ #include "lsquic.h" #include "lsquic_types.h" -#include "lsquic_alarmset.h" #include "lsquic_parse.h" #include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" #include "lsquic_stream.h" #include "lsquic_packet_common.h" #include "lsquic_packet_in.h" diff --git a/test/unittests/test_spi.c b/test/unittests/test_spi.c index 87a0e39ef..432842cee 100644 --- a/test/unittests/test_spi.c +++ b/test/unittests/test_spi.c @@ -11,11 +11,15 @@ #include "lsquic.h" -#include "lsquic_alarmset.h" +#include "lsquic_int_types.h" #include "lsquic_packet_common.h" #include "lsquic_packet_in.h" #include "lsquic_conn_flow.h" #include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" +#include "lsquic_conn.h" #include "lsquic_stream.h" #include "lsquic_types.h" #include "lsquic_spi.h" @@ -27,6 +31,8 @@ */ static struct stream_prio_iter spi; +static struct lsquic_conn lconn = LSCONN_INITIALIZER_CIDLEN(lconn, 0); + static lsquic_stream_t * new_stream (unsigned priority) @@ -61,18 +67,18 @@ test_same_priority (unsigned priority) TAILQ_INIT(&streams); TAILQ_INSERT_TAIL(&streams, stream_arr[0], next_write_stream); - stream_arr[0]->stream_flags |= flags; + stream_arr[0]->sm_qflags |= flags; TAILQ_INSERT_TAIL(&streams, stream_arr[1], next_write_stream); - stream_arr[1]->stream_flags |= flags; + stream_arr[1]->sm_qflags |= flags; TAILQ_INSERT_TAIL(&streams, stream_arr[2], next_write_stream); - stream_arr[2]->stream_flags |= flags; + stream_arr[2]->sm_qflags |= flags; TAILQ_INSERT_TAIL(&streams, stream_arr[3], next_write_stream); - stream_arr[3]->stream_flags |= flags; + stream_arr[3]->sm_qflags |= flags; lsquic_spi_init(&spi, TAILQ_FIRST(&streams), TAILQ_LAST(&streams, lsquic_streams_tailq), (uintptr_t) &TAILQ_NEXT((lsquic_stream_t *) NULL, next_write_stream), - flags, 0, __func__, NULL, NULL); + flags, &lconn, __func__, NULL, NULL); stream = lsquic_spi_first(&spi); assert(stream == stream_arr[0]); @@ -88,7 +94,7 @@ test_same_priority (unsigned priority) /* Test reinitialization: */ lsquic_spi_init(&spi, stream_arr[0], stream_arr[1], (uintptr_t) &TAILQ_NEXT((lsquic_stream_t *) NULL, next_write_stream), - flags, 0, __func__, NULL, NULL); + flags, &lconn, __func__, NULL, NULL); stream = lsquic_spi_first(&spi); assert(stream == stream_arr[0]); stream = lsquic_spi_next(&spi); @@ -115,14 +121,14 @@ test_different_priorities (int *priority) assert(*priority < 256); stream = new_stream(*priority); TAILQ_INSERT_TAIL(&streams, stream, next_send_stream); - stream->stream_flags |= flags; + stream->sm_qflags |= flags; ++n_streams; } lsquic_spi_init(&spi, TAILQ_FIRST(&streams), TAILQ_LAST(&streams, lsquic_streams_tailq), (uintptr_t) &TAILQ_NEXT((lsquic_stream_t *) NULL, next_send_stream), - flags, 0, __func__, NULL, NULL); + flags, &lconn, __func__, NULL, NULL); for (prev_prio = -1, count = 0, stream = lsquic_spi_first(&spi); stream; stream = lsquic_spi_next(&spi), ++count) @@ -151,8 +157,8 @@ struct stream_info const struct stream_info infos1[] = { - { LSQUIC_STREAM_HANDSHAKE, 0, }, - { LSQUIC_STREAM_HEADERS, 0, }, + { LSQUIC_GQUIC_STREAM_HANDSHAKE, 0, }, + { LSQUIC_GQUIC_STREAM_HEADERS, 0, }, { 5, 0, }, { 7, 1, }, { 127, 200, }, @@ -160,8 +166,8 @@ const struct stream_info infos1[] = { const struct stream_info infos2[] = { - { LSQUIC_STREAM_HANDSHAKE, 0, }, - { LSQUIC_STREAM_HEADERS, 0, }, + { LSQUIC_GQUIC_STREAM_HANDSHAKE, 0, }, + { LSQUIC_GQUIC_STREAM_HEADERS, 0, }, { 5, 4, }, { 7, 1, }, { 127, 200, }, @@ -197,7 +203,7 @@ test_drop (const struct drop_test *test) { stream_arr[n].sm_priority = test->infos[n].prio; stream_arr[n].id = test->infos[n].stream_id; - stream_arr[n].stream_flags = STREAM_USE_HEADERS; + stream_arr[n].sm_bflags = SMBF_USE_HEADERS; } for (drop_high = 0; drop_high < 2; ++drop_high) @@ -209,7 +215,7 @@ test_drop (const struct drop_test *test) lsquic_spi_init(&spi, TAILQ_FIRST(&streams), TAILQ_LAST(&streams, lsquic_streams_tailq), (uintptr_t) &TAILQ_NEXT((lsquic_stream_t *) NULL, next_write_stream), - STREAM_WRITE_Q_FLAGS, 0, __func__, NULL, NULL); + SMQF_WRITE_Q_FLAGS, &lconn, __func__, NULL, NULL); if (drop_high) lsquic_spi_drop_high(&spi); @@ -270,7 +276,7 @@ test_different_priorities_filter_odd (int *priority) lsquic_spi_init(&spi, TAILQ_FIRST(&streams), TAILQ_LAST(&streams, lsquic_streams_tailq), (uintptr_t) &TAILQ_NEXT((lsquic_stream_t *) NULL, next_send_stream), - flags, 0, NULL, filter_out_odd_priorities, &my_filter_ctx); + flags, &lconn, __func__, filter_out_odd_priorities, &my_filter_ctx); for (prev_prio = -1, count = 0, stream = lsquic_spi_first(&spi); stream; stream = lsquic_spi_next(&spi), ++count) diff --git a/test/unittests/test_stop_waiting_gquic_be.c b/test/unittests/test_stop_waiting_gquic_be.c index 1746f70ba..fd6c50205 100644 --- a/test/unittests/test_stop_waiting_gquic_be.c +++ b/test/unittests/test_stop_waiting_gquic_be.c @@ -9,7 +9,6 @@ #include "lsquic.h" #include "lsquic_types.h" -#include "lsquic_alarmset.h" #include "lsquic_parse.h" static const struct parse_funcs *const pf = select_pf_by_ver(LSQVER_039); diff --git a/test/unittests/test_stream.c b/test/unittests/test_stream.c index fd1f6af0a..3a9019255 100644 --- a/test/unittests/test_stream.c +++ b/test/unittests/test_stream.c @@ -16,12 +16,15 @@ #include "lsquic.h" -#include "lsquic_alarmset.h" #include "lsquic_packet_common.h" +#include "lsquic_alarmset.h" #include "lsquic_packet_in.h" #include "lsquic_conn_flow.h" #include "lsquic_rtt.h" #include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" #include "lsquic_stream.h" #include "lsquic_types.h" #include "lsquic_malo.h" @@ -34,11 +37,24 @@ #include "lsquic_cubic.h" #include "lsquic_pacer.h" #include "lsquic_senhist.h" +#include "lsquic_bw_sampler.h" +#include "lsquic_minmax.h" +#include "lsquic_bbr.h" #include "lsquic_send_ctl.h" #include "lsquic_ver_neg.h" #include "lsquic_packet_out.h" +#include "lsquic_enc_sess.h" +#include "lsqpack.h" +#include "lsquic_frab_list.h" +#include "lsquic_qenc_hdl.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_data_in_if.h" +#include "lsquic_h3_prio.h" + +static const struct parse_funcs *g_pf = select_pf_by_ver(LSQVER_039); -static const struct parse_funcs *const g_pf = select_pf_by_ver(LSQVER_035); +static int g_use_crypto_ctor; struct test_ctl_settings { @@ -172,7 +188,7 @@ static void ack_packet (lsquic_send_ctl_t *send_ctl, lsquic_packno_t packno) { struct lsquic_packet_out *packet_out; - TAILQ_FOREACH(packet_out, &send_ctl->sc_unacked_packets, po_next) + TAILQ_FOREACH(packet_out, &send_ctl->sc_unacked_packets[PNS_APP], po_next) if (packet_out->po_packno == packno) { lsquic_packet_out_ack_streams(packet_out); @@ -183,7 +199,7 @@ ack_packet (lsquic_send_ctl_t *send_ctl, lsquic_packno_t packno) static size_t -read_from_scheduled_packets (lsquic_send_ctl_t *send_ctl, uint32_t stream_id, +read_from_scheduled_packets (lsquic_send_ctl_t *send_ctl, lsquic_stream_id_t stream_id, unsigned char *const begin, size_t bufsz, uint64_t first_offset, int *p_fin, int fullcheck) { @@ -194,15 +210,21 @@ read_from_scheduled_packets (lsquic_send_ctl_t *send_ctl, uint32_t stream_id, struct packet_out_srec_iter posi; struct lsquic_packet_out *packet_out; struct stream_frame frame; + enum quic_frame_type expected_type; int len, fin = 0; + if (g_use_crypto_ctor) + expected_type = QUIC_FRAME_CRYPTO; + else + expected_type = QUIC_FRAME_STREAM; + TAILQ_FOREACH(packet_out, &send_ctl->sc_scheduled_packets, po_next) for (srec = posi_first(&posi, packet_out); srec; srec = posi_next(&posi)) { if (fullcheck) { - assert(srec->sr_frame_type == QUIC_FRAME_STREAM); + assert(srec->sr_frame_type == expected_type); if (packet_out->po_packno != 1) { /* First packet may contain two stream frames, do not @@ -216,14 +238,21 @@ read_from_scheduled_packets (lsquic_send_ctl_t *send_ctl, uint32_t stream_id, } } } - if (srec->sr_frame_type == QUIC_FRAME_STREAM && + if (srec->sr_frame_type == expected_type && srec->sr_stream->id == stream_id) { assert(!fin); - len = pf_local->pf_parse_stream_frame(packet_out->po_data + srec->sr_off, - packet_out->po_data_sz - srec->sr_off, &frame); + if (QUIC_FRAME_STREAM == expected_type) + len = pf_local->pf_parse_stream_frame(packet_out->po_data + srec->sr_off, + packet_out->po_data_sz - srec->sr_off, &frame); + else + len = pf_local->pf_parse_crypto_frame(packet_out->po_data + srec->sr_off, + packet_out->po_data_sz - srec->sr_off, &frame); assert(len > 0); - assert(frame.stream_id == srec->sr_stream->id); + if (QUIC_FRAME_STREAM == expected_type) + assert(frame.stream_id == srec->sr_stream->id); + else + assert(frame.stream_id == ~0ULL); /* Otherwise not enough to copy to: */ assert(end - p >= frame.data_frame.df_size); /* Checks offset ordering: */ @@ -261,6 +290,7 @@ struct test_objs { stream_if; unsigned initial_stream_window; enum stream_ctor_flags ctor_flags; + struct qpack_enc_hdl qeh; }; @@ -271,9 +301,19 @@ unit_test_doesnt_write_ack (struct lsquic_conn *lconn) } +static struct network_path network_path; + +static struct network_path * +get_network_path (struct lsquic_conn *lconn, const struct sockaddr *sa) +{ + return &network_path; +} + + static const struct conn_iface our_conn_if = { .ci_can_write_ack = unit_test_doesnt_write_ack, + .ci_get_path = get_network_path, }; @@ -281,9 +321,14 @@ static void init_test_objs (struct test_objs *tobjs, unsigned initial_conn_window, unsigned initial_stream_window, const struct parse_funcs *pf) { + int s; memset(tobjs, 0, sizeof(*tobjs)); + LSCONN_INITIALIZE(&tobjs->lconn); tobjs->lconn.cn_pf = pf ? pf : g_pf; - tobjs->lconn.cn_pack_size = 1370; + tobjs->lconn.cn_version = tobjs->lconn.cn_pf == &lsquic_parse_funcs_ietf_v1 ? + LSQVER_ID22 : LSQVER_043; + tobjs->lconn.cn_esf_c = &lsquic_enc_session_common_gquic_1; + network_path.np_pack_size = 1370; tobjs->lconn.cn_if = &our_conn_if; lsquic_mm_init(&tobjs->eng_pub.enp_mm); TAILQ_INIT(&tobjs->conn_pub.sending_streams); @@ -300,12 +345,22 @@ init_test_objs (struct test_objs *tobjs, unsigned initial_conn_window, tobjs->conn_pub.send_ctl = &tobjs->send_ctl; tobjs->conn_pub.packet_out_malo = lsquic_malo_create(sizeof(struct lsquic_packet_out)); + tobjs->conn_pub.path = &network_path; tobjs->initial_stream_window = initial_stream_window; lsquic_send_ctl_init(&tobjs->send_ctl, &tobjs->alset, &tobjs->eng_pub, - &tobjs->ver_neg, &tobjs->conn_pub, tobjs->lconn.cn_pack_size); + &tobjs->ver_neg, &tobjs->conn_pub, 0); tobjs->stream_if = &stream_if; tobjs->stream_if_ctx = &test_ctx; tobjs->ctor_flags = stream_ctor_flags; + if ((1 << tobjs->lconn.cn_version) & LSQUIC_IETF_VERSIONS) + { + lsquic_qeh_init(&tobjs->qeh, &tobjs->lconn); + s = lsquic_qeh_settings(&tobjs->qeh, 0, 0, 0, 0); + assert(0 == s); + tobjs->conn_pub.u.ietf.qeh = &tobjs->qeh; + tobjs->conn_pub.u.ietf.prio_tree + = lsquic_prio_tree_new(&tobjs->lconn, 0); + } } @@ -316,6 +371,10 @@ deinit_test_objs (struct test_objs *tobjs) lsquic_send_ctl_cleanup(&tobjs->send_ctl); lsquic_malo_destroy(tobjs->conn_pub.packet_out_malo); lsquic_mm_cleanup(&tobjs->eng_pub.enp_mm); + if ((1 << tobjs->lconn.cn_version) & LSQUIC_IETF_VERSIONS) + lsquic_qeh_cleanup(&tobjs->qeh); + if (tobjs->ctor_flags & SCF_IETF) + lsquic_prio_tree_destroy(tobjs->conn_pub.u.ietf.prio_tree); } @@ -337,7 +396,7 @@ new_frame_in_ext (struct test_objs *tobjs, size_t off, size_t sz, int fin, packet_in->pi_data = (void *) data; else { - packet_in->pi_data = lsquic_mm_get_1370(&tobjs->eng_pub.enp_mm); + packet_in->pi_data = lsquic_mm_get_packet_in_buf(&tobjs->eng_pub.enp_mm, 1370); packet_in->pi_flags |= PI_OWN_DATA; memset(packet_in->pi_data, 'A', sz); } @@ -370,16 +429,21 @@ new_frame_in (struct test_objs *tobjs, size_t off, size_t sz, int fin) static lsquic_stream_t * new_stream_ext (struct test_objs *tobjs, unsigned stream_id, uint64_t send_off) { - return lsquic_stream_new_ext(stream_id, &tobjs->conn_pub, tobjs->stream_if, - tobjs->stream_if_ctx, tobjs->initial_stream_window, send_off, - tobjs->ctor_flags); + if (g_use_crypto_ctor) + return lsquic_stream_new_crypto(stream_id, &tobjs->conn_pub, + tobjs->stream_if, tobjs->stream_if_ctx, + tobjs->ctor_flags | SCF_CRITICAL); + else + return lsquic_stream_new(stream_id, &tobjs->conn_pub, tobjs->stream_if, + tobjs->stream_if_ctx, tobjs->initial_stream_window, send_off, + tobjs->ctor_flags); } static lsquic_stream_t * new_stream (struct test_objs *tobjs, unsigned stream_id) { - return new_stream_ext(tobjs, stream_id, 0); + return new_stream_ext(tobjs, stream_id, 16 * 1024); } @@ -400,7 +464,7 @@ run_frame_ordering_test (uint64_t run_id /* This is used to make it easier to se struct malo *const frame_malo = mm->malo.stream_frame; lsquic_packet_in_t *packet_in = lsquic_mm_get_packet_in(mm); - packet_in->pi_data = lsquic_mm_get_1370(mm); + packet_in->pi_data = lsquic_mm_get_packet_in_buf(mm, 1370); packet_in->pi_flags |= PI_OWN_DATA; assert(idx_sz <= 10); memcpy(packet_in->pi_data, "0123456789", 10); @@ -493,7 +557,8 @@ test_loc_FIN_rem_FIN (struct test_objs *tobjs) char buf_out[0x100]; unsigned char buf[0x100]; ssize_t n; - int s, fin;; + int s, fin; + enum stream_state_sending sss; init_buf(buf_out, sizeof(buf_out)); @@ -512,8 +577,8 @@ test_loc_FIN_rem_FIN (struct test_objs *tobjs) assert(!fin); /* Pretend we sent out a packet: */ - packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl); - lsquic_send_ctl_sent_packet(&tobjs->send_ctl, packet_out, 1); + packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl, 0); + lsquic_send_ctl_sent_packet(&tobjs->send_ctl, packet_out); s = lsquic_stream_shutdown(stream, 1); assert(s == 0); @@ -524,10 +589,12 @@ test_loc_FIN_rem_FIN (struct test_objs *tobjs) sizeof(buf), 100, &fin, 0); assert(0 == n); assert(fin); + sss = lsquic_stream_sending_state(stream); + assert(SSS_DATA_SENT == sss); /* Pretend we sent out this packet as well: */ - packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl); - lsquic_send_ctl_sent_packet(&tobjs->send_ctl, packet_out, 1); + packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl, 0); + lsquic_send_ctl_sent_packet(&tobjs->send_ctl, packet_out); assert(TAILQ_EMPTY(&tobjs->conn_pub.service_streams)); /* No need to close stream yet */ @@ -548,12 +615,12 @@ test_loc_FIN_rem_FIN (struct test_objs *tobjs) s = lsquic_stream_shutdown(stream, 0); assert(0 == s); assert(!TAILQ_EMPTY(&tobjs->conn_pub.service_streams)); - assert((stream->stream_flags & (STREAM_SERVICE_FLAGS)) - == (STREAM_CALL_ONCLOSE)); + assert((stream->sm_qflags & (SMQF_SERVICE_FLAGS)) == (SMQF_CALL_ONCLOSE)); ack_packet(&tobjs->send_ctl, 1); ack_packet(&tobjs->send_ctl, 2); - assert((stream->stream_flags & (STREAM_SERVICE_FLAGS)) - == (STREAM_CALL_ONCLOSE|STREAM_FREE_STREAM)); + assert((stream->sm_qflags & (SMQF_SERVICE_FLAGS)) == (SMQF_CALL_ONCLOSE|SMQF_FREE_STREAM)); + sss = lsquic_stream_sending_state(stream); + assert(SSS_DATA_RECVD == sss); lsquic_stream_destroy(stream); assert(TAILQ_EMPTY(&tobjs->conn_pub.service_streams)); @@ -610,8 +677,8 @@ test_rem_FIN_loc_FIN (struct test_objs *tobjs) assert(!fin); /* Pretend we sent out a packet: */ - packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl); - lsquic_send_ctl_sent_packet(&tobjs->send_ctl, packet_out, 1); + packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl, 0); + lsquic_send_ctl_sent_packet(&tobjs->send_ctl, packet_out); assert(TAILQ_EMPTY(&tobjs->conn_pub.service_streams)); /* No need to close stream yet */ @@ -621,8 +688,7 @@ test_rem_FIN_loc_FIN (struct test_objs *tobjs) /* Now we can call on_close: */ assert(!TAILQ_EMPTY(&tobjs->conn_pub.service_streams)); - assert((stream->stream_flags & (STREAM_SERVICE_FLAGS)) - == STREAM_CALL_ONCLOSE); + assert((stream->sm_qflags & (SMQF_SERVICE_FLAGS)) == SMQF_CALL_ONCLOSE); n = read_from_scheduled_packets(&tobjs->send_ctl, stream->id, buf, sizeof(buf), 100, &fin, 0); @@ -630,21 +696,19 @@ test_rem_FIN_loc_FIN (struct test_objs *tobjs) assert(fin); /* Pretend we sent out this packet as well: */ - packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl); - lsquic_send_ctl_sent_packet(&tobjs->send_ctl, packet_out, 1); + packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl, 0); + lsquic_send_ctl_sent_packet(&tobjs->send_ctl, packet_out); /* Cannot free stream yet: packets have not been acked */ assert(!TAILQ_EMPTY(&tobjs->conn_pub.service_streams)); - assert((stream->stream_flags & (STREAM_SERVICE_FLAGS)) - == STREAM_CALL_ONCLOSE); + assert((stream->sm_qflags & (SMQF_SERVICE_FLAGS)) == SMQF_CALL_ONCLOSE); ack_packet(&tobjs->send_ctl, 1); ack_packet(&tobjs->send_ctl, 2); /* Now we can free the stream: */ assert(!TAILQ_EMPTY(&tobjs->conn_pub.service_streams)); - assert((stream->stream_flags & (STREAM_SERVICE_FLAGS)) - == (STREAM_CALL_ONCLOSE|STREAM_FREE_STREAM)); + assert((stream->sm_qflags & (SMQF_SERVICE_FLAGS)) == (SMQF_CALL_ONCLOSE|SMQF_FREE_STREAM)); lsquic_stream_destroy(stream); assert(TAILQ_EMPTY(&tobjs->conn_pub.service_streams)); @@ -676,8 +740,7 @@ test_rem_data_loc_close_and_rst_in (struct test_objs *tobjs) s = lsquic_stream_shutdown(stream, 0); assert(0 == s); assert(TAILQ_EMPTY(&tobjs->conn_pub.service_streams)); - assert(!((stream->stream_flags & (STREAM_SERVICE_FLAGS)) - == STREAM_CALL_ONCLOSE)); + assert(!((stream->sm_qflags & (SMQF_SERVICE_FLAGS)) == SMQF_CALL_ONCLOSE)); n = lsquic_stream_read(stream, buf, 60); assert(n == -1); /* Cannot read from closed stream */ @@ -689,13 +752,12 @@ test_rem_data_loc_close_and_rst_in (struct test_objs *tobjs) assert(1 == lsquic_send_ctl_n_scheduled(&tobjs->send_ctl)); /* Shutdown performs a flush */ assert(!TAILQ_EMPTY(&tobjs->conn_pub.service_streams)); - assert((stream->stream_flags & (STREAM_SERVICE_FLAGS)) - == STREAM_CALL_ONCLOSE); + assert((stream->sm_qflags & (SMQF_SERVICE_FLAGS)) == SMQF_CALL_ONCLOSE); s = lsquic_stream_rst_in(stream, 100, 1); assert(0 == s); - assert(stream->stream_flags & STREAM_FREE_STREAM); + assert(stream->sm_qflags & SMQF_FREE_STREAM); lsquic_stream_destroy(stream); /* This simply checks that the stream got removed from the queue: */ @@ -729,8 +791,7 @@ test_rem_data_loc_close (struct test_objs *tobjs) s = lsquic_stream_shutdown(stream, 0); assert(0 == s); assert(TAILQ_EMPTY(&tobjs->conn_pub.service_streams)); - assert(!((stream->stream_flags & (STREAM_SERVICE_FLAGS)) - == STREAM_CALL_ONCLOSE)); + assert(!(stream->sm_qflags & SMQF_CALL_ONCLOSE)); n = lsquic_stream_read(stream, buf, 60); assert(n == -1); /* Cannot read from closed stream */ @@ -742,12 +803,11 @@ test_rem_data_loc_close (struct test_objs *tobjs) assert(1 == lsquic_send_ctl_n_scheduled(&tobjs->send_ctl)); /* Shutdown performs a flush */ assert(!TAILQ_EMPTY(&tobjs->conn_pub.service_streams)); - assert((stream->stream_flags & (STREAM_SERVICE_FLAGS)) - == STREAM_CALL_ONCLOSE); + assert(stream->sm_qflags & SMQF_CALL_ONCLOSE); - assert(!(stream->stream_flags & STREAM_FREE_STREAM)); - lsquic_stream_acked(stream); - assert(stream->stream_flags & STREAM_FREE_STREAM); + assert(!(stream->sm_qflags & SMQF_FREE_STREAM)); + lsquic_stream_acked(stream, QUIC_FRAME_STREAM); + assert(stream->sm_qflags & SMQF_FREE_STREAM); lsquic_stream_destroy(stream); /* This simply checks that the stream got removed from the queue: */ @@ -789,8 +849,8 @@ test_loc_FIN_rem_RST (struct test_objs *tobjs) assert(!fin); /* Pretend we sent out a packet: */ - packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl); - lsquic_send_ctl_sent_packet(&tobjs->send_ctl, packet_out, 1); + packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl, 0); + lsquic_send_ctl_sent_packet(&tobjs->send_ctl, packet_out); s = lsquic_stream_shutdown(stream, 1); assert(s == 0); @@ -803,8 +863,8 @@ test_loc_FIN_rem_RST (struct test_objs *tobjs) assert(fin); /* Pretend we sent out this packet as well: */ - packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl); - lsquic_send_ctl_sent_packet(&tobjs->send_ctl, packet_out, 1); + packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl, 0); + lsquic_send_ctl_sent_packet(&tobjs->send_ctl, packet_out); assert(TAILQ_EMPTY(&tobjs->conn_pub.service_streams)); /* No need to close stream yet */ @@ -818,7 +878,7 @@ test_loc_FIN_rem_RST (struct test_objs *tobjs) /* The stream is not yet done: the user code has not closed it yet */ assert(TAILQ_EMPTY(&tobjs->conn_pub.service_streams)); - assert(0 == (stream->stream_flags & (STREAM_SERVICE_FLAGS))); + assert(0 == (stream->sm_qflags & (SMQF_SERVICE_FLAGS))); assert(0 == (stream->stream_flags & STREAM_U_READ_DONE)); s = lsquic_stream_read(stream, buf, sizeof(buf)); @@ -827,15 +887,13 @@ test_loc_FIN_rem_RST (struct test_objs *tobjs) assert(0 == s); /* Stream closed successfully */ assert(!TAILQ_EMPTY(&tobjs->conn_pub.service_streams)); - assert((stream->stream_flags & (STREAM_SERVICE_FLAGS)) - == (STREAM_CALL_ONCLOSE)); + assert((stream->sm_qflags & (SMQF_SERVICE_FLAGS)) == (SMQF_CALL_ONCLOSE)); ack_packet(&tobjs->send_ctl, 1); ack_packet(&tobjs->send_ctl, 2); assert(!TAILQ_EMPTY(&tobjs->conn_pub.service_streams)); - assert((stream->stream_flags & (STREAM_SERVICE_FLAGS)) - == (STREAM_CALL_ONCLOSE|STREAM_FREE_STREAM)); + assert((stream->sm_qflags & (SMQF_SERVICE_FLAGS)) == (SMQF_CALL_ONCLOSE|SMQF_FREE_STREAM)); lsquic_stream_destroy(stream); assert(TAILQ_EMPTY(&tobjs->conn_pub.service_streams)); @@ -875,8 +933,8 @@ test_loc_data_rem_RST (struct test_objs *tobjs) assert(!fin); /* Pretend we sent out a packet: */ - packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl); - lsquic_send_ctl_sent_packet(&tobjs->send_ctl, packet_out, 1); + packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl, 0); + lsquic_send_ctl_sent_packet(&tobjs->send_ctl, packet_out); s = lsquic_stream_frame_in(stream, new_frame_in(tobjs, 0, 100, 0)); assert(0 == s); @@ -886,12 +944,11 @@ test_loc_data_rem_RST (struct test_objs *tobjs) ack_packet(&tobjs->send_ctl, 1); assert(!TAILQ_EMPTY(&tobjs->conn_pub.sending_streams)); - assert((stream->stream_flags & STREAM_SENDING_FLAGS) - == STREAM_SEND_RST); + assert((stream->sm_qflags & SMQF_SENDING_FLAGS) == SMQF_SEND_RST); /* Not yet closed: error needs to be collected */ assert(TAILQ_EMPTY(&tobjs->conn_pub.service_streams)); - assert(0 == (stream->stream_flags & STREAM_SERVICE_FLAGS)); + assert(0 == (stream->sm_qflags & SMQF_SERVICE_FLAGS)); n = lsquic_stream_write(stream, buf, 100); assert(-1 == n); /* Error collected */ @@ -899,16 +956,14 @@ test_loc_data_rem_RST (struct test_objs *tobjs) assert(0 == s); /* Stream successfully closed */ assert(!TAILQ_EMPTY(&tobjs->conn_pub.service_streams)); - assert((stream->stream_flags & STREAM_SERVICE_FLAGS) - == STREAM_CALL_ONCLOSE); + assert((stream->sm_qflags & SMQF_SERVICE_FLAGS) == SMQF_CALL_ONCLOSE); lsquic_stream_rst_frame_sent(stream); lsquic_stream_call_on_close(stream); assert(TAILQ_EMPTY(&tobjs->conn_pub.sending_streams)); assert(!TAILQ_EMPTY(&tobjs->conn_pub.service_streams)); - assert((stream->stream_flags & STREAM_SERVICE_FLAGS) - == STREAM_FREE_STREAM); + assert((stream->sm_qflags & SMQF_SERVICE_FLAGS) == SMQF_FREE_STREAM); lsquic_stream_destroy(stream); assert(TAILQ_EMPTY(&tobjs->conn_pub.service_streams)); @@ -929,6 +984,7 @@ test_loc_RST_rem_FIN (struct test_objs *tobjs) unsigned char buf[0x100]; size_t n; int s, fin; + enum stream_state_sending sss; init_buf(buf_out, sizeof(buf_out)); @@ -948,31 +1004,42 @@ test_loc_RST_rem_FIN (struct test_objs *tobjs) assert(!fin); /* Pretend we sent out a packet: */ - packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl); - lsquic_send_ctl_sent_packet(&tobjs->send_ctl, packet_out, 1); + packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl, 0); + lsquic_send_ctl_sent_packet(&tobjs->send_ctl, packet_out); assert(1 == stream->n_unacked); ack_packet(&tobjs->send_ctl, 1); assert(0 == stream->n_unacked); + sss = lsquic_stream_sending_state(stream); + assert(SSS_SEND == sss); lsquic_stream_reset(stream, 0); + ++stream->n_unacked; /* Fake sending of packet with RST_STREAM */ assert(!TAILQ_EMPTY(&tobjs->conn_pub.sending_streams)); - assert((stream->stream_flags & STREAM_SENDING_FLAGS) - == STREAM_SEND_RST); + assert((stream->sm_qflags & SMQF_SENDING_FLAGS) == SMQF_SEND_RST); + sss = lsquic_stream_sending_state(stream); + assert(SSS_SEND == sss); /* Reset hasn't been packetized yet */ s = lsquic_stream_frame_in(stream, new_frame_in(tobjs, 0, 90, 1)); assert(s == 0); assert(!TAILQ_EMPTY(&tobjs->conn_pub.service_streams)); - assert((stream->stream_flags & STREAM_SERVICE_FLAGS) - == STREAM_CALL_ONCLOSE); + assert((stream->sm_qflags & SMQF_SERVICE_FLAGS) == SMQF_CALL_ONCLOSE); lsquic_stream_rst_frame_sent(stream); + sss = lsquic_stream_sending_state(stream); + assert(SSS_RESET_SENT == sss); + + sss = lsquic_stream_sending_state(stream); + assert(SSS_RESET_SENT == sss); + lsquic_stream_acked(stream, QUIC_FRAME_RST_STREAM); /* Fake ack of RST_STREAM packet */ + sss = lsquic_stream_sending_state(stream); + assert(SSS_RESET_RECVD == sss); + lsquic_stream_call_on_close(stream); assert(TAILQ_EMPTY(&tobjs->conn_pub.sending_streams)); assert(!TAILQ_EMPTY(&tobjs->conn_pub.service_streams)); - assert((stream->stream_flags & STREAM_SERVICE_FLAGS) - == STREAM_FREE_STREAM); + assert((stream->sm_qflags & SMQF_SERVICE_FLAGS) == SMQF_FREE_STREAM); lsquic_stream_destroy(stream); assert(TAILQ_EMPTY(&tobjs->conn_pub.service_streams)); @@ -1002,18 +1069,18 @@ test_gapless_elision_middle (struct test_objs *tobjs) streamB = new_stream(tobjs, 347); init_buf(buf_out, sizeof(buf_out)); - thresh = lsquic_stream_flush_threshold(streamA); + thresh = lsquic_stream_flush_threshold(streamA, 0); n = lsquic_stream_write(streamA, buf_out, thresh); assert(n == thresh); assert(1 == lsquic_send_ctl_n_scheduled(&tobjs->send_ctl)); written_to_A += n; - thresh = lsquic_stream_flush_threshold(streamB); + thresh = lsquic_stream_flush_threshold(streamB, 0); n = lsquic_stream_write(streamB, buf_out, thresh); assert(n == thresh); assert(2 == lsquic_send_ctl_n_scheduled(&tobjs->send_ctl)); - thresh = lsquic_stream_flush_threshold(streamA); + thresh = lsquic_stream_flush_threshold(streamA, 0); n = lsquic_stream_write(streamA, buf_out + written_to_A, thresh); assert(n == thresh); assert(3 == lsquic_send_ctl_n_scheduled(&tobjs->send_ctl)); @@ -1035,15 +1102,15 @@ test_gapless_elision_middle (struct test_objs *tobjs) assert(n == written_to_A); assert(0 == memcmp(buf, buf_out, written_to_A)); - packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl); + packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl, 0); assert(packet_out->po_packno == 1); - lsquic_send_ctl_sent_packet(&tobjs->send_ctl, packet_out, 1); + lsquic_send_ctl_sent_packet(&tobjs->send_ctl, packet_out); - packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl); + packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl, 0); assert(packet_out->po_packno == 2); - lsquic_send_ctl_sent_packet(&tobjs->send_ctl, packet_out, 1); + lsquic_send_ctl_sent_packet(&tobjs->send_ctl, packet_out); - packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl); + packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl, 0); assert(!packet_out); /* Now we can call on_close: */ @@ -1073,18 +1140,18 @@ test_gapless_elision_beginning (struct test_objs *tobjs) init_buf(buf_out, sizeof(buf_out)); - thresh = lsquic_stream_flush_threshold(streamB); + thresh = lsquic_stream_flush_threshold(streamB, 0); n = lsquic_stream_write(streamB, buf_out, thresh); assert(n == thresh); assert(1 == lsquic_send_ctl_n_scheduled(&tobjs->send_ctl)); - thresh = lsquic_stream_flush_threshold(streamA); + thresh = lsquic_stream_flush_threshold(streamA, 0); n = lsquic_stream_write(streamA, buf_out, thresh); assert(n == thresh); assert(2 == lsquic_send_ctl_n_scheduled(&tobjs->send_ctl)); written_to_A += n; - thresh = lsquic_stream_flush_threshold(streamA); + thresh = lsquic_stream_flush_threshold(streamA, 0); n = lsquic_stream_write(streamA, buf_out + written_to_A, thresh); assert(n == thresh); assert(3 == lsquic_send_ctl_n_scheduled(&tobjs->send_ctl)); @@ -1106,15 +1173,15 @@ test_gapless_elision_beginning (struct test_objs *tobjs) assert(n == written_to_A); assert(0 == memcmp(buf, buf_out, written_to_A)); - packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl); + packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl, 0); assert(packet_out->po_packno == 1); - lsquic_send_ctl_sent_packet(&tobjs->send_ctl, packet_out, 1); + lsquic_send_ctl_sent_packet(&tobjs->send_ctl, packet_out); - packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl); + packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl, 0); assert(packet_out->po_packno == 2); - lsquic_send_ctl_sent_packet(&tobjs->send_ctl, packet_out, 1); + lsquic_send_ctl_sent_packet(&tobjs->send_ctl, packet_out); - packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl); + packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs->send_ctl, 0); assert(!packet_out); /* Now we can call on_close: */ @@ -1192,7 +1259,7 @@ test_unlimited_stream_flush_data (struct test_objs *tobjs) const struct lsquic_conn_cap *const cap = &tobjs->conn_pub.conn_cap; assert(0x4000 == lsquic_conn_cap_avail(cap)); /* Self-check */ - stream = new_stream(tobjs, LSQUIC_STREAM_HANDSHAKE); + stream = new_stream(tobjs, LSQUIC_GQUIC_STREAM_HANDSHAKE); n = lsquic_stream_write(stream, buf, 100); assert(n == 100); @@ -1416,6 +1483,7 @@ test_read_in_middle (void) const char data[] = "AAABBBCCC"; struct test_objs tobjs; stream_frame_t *frame; + uint64_t n_readable; init_test_objs(&tobjs, 0x4000, 0x4000, NULL); @@ -1424,26 +1492,36 @@ test_read_in_middle (void) frame = new_frame_in_ext(&tobjs, 0, 3, 0, &data[0]); s = lsquic_stream_frame_in(stream, frame); assert(0 == s); + n_readable = stream->data_in->di_if->di_readable_bytes(stream->data_in, 0); + assert(3 == n_readable); /* Hole */ frame = new_frame_in_ext(&tobjs, 6, 3, 0, &data[6]); s = lsquic_stream_frame_in(stream, frame); assert(0 == s); + n_readable = stream->data_in->di_if->di_readable_bytes(stream->data_in, 0); + assert(3 == n_readable); /* Read up to hole */ nw = lsquic_stream_read(stream, buf, sizeof(buf)); assert(3 == nw); assert(0 == memcmp(buf, "AAA", 3)); + n_readable = stream->data_in->di_if->di_readable_bytes(stream->data_in, 3); + assert(0 == n_readable); frame = new_frame_in_ext(&tobjs, 3, 3, 0, &data[3]); s = lsquic_stream_frame_in(stream, frame); assert(0 == s); + n_readable = stream->data_in->di_if->di_readable_bytes(stream->data_in, 3); + assert(6 == n_readable); nw = lsquic_stream_read(stream, buf, sizeof(buf)); assert(6 == nw); assert(0 == memcmp(buf, "BBBCCC", 6)); + n_readable = stream->data_in->di_if->di_readable_bytes(stream->data_in, 9); + assert(0 == n_readable); lsquic_stream_destroy(stream); deinit_test_objs(&tobjs); @@ -1465,7 +1543,7 @@ test_conn_unlimited (void) unsigned char *const data = calloc(1, 0x4000); /* Test 1: first write headers, then data stream */ - header_stream = new_stream(&tobjs, LSQUIC_STREAM_HANDSHAKE); + header_stream = new_stream(&tobjs, LSQUIC_GQUIC_STREAM_HANDSHAKE); data_stream = new_stream(&tobjs, 123); nw = lsquic_stream_write(header_stream, data, 98); assert(98 == nw); @@ -1477,7 +1555,7 @@ test_conn_unlimited (void) lsquic_stream_destroy(data_stream); /* Test 2: first write data, then headers stream */ - header_stream = new_stream(&tobjs, LSQUIC_STREAM_HANDSHAKE); + header_stream = new_stream(&tobjs, LSQUIC_GQUIC_STREAM_HANDSHAKE); data_stream = new_stream(&tobjs, 123); lsquic_conn_cap_init(&tobjs.conn_pub.conn_cap, 0x4000); nw = lsquic_stream_write(data_stream, data, 0x4000); @@ -1506,10 +1584,13 @@ test_reading_from_stream2 (void) stream_frame_t *frame; ssize_t nw; int s; + enum stream_state_receiving ssr; const char data[] = "1234567890"; init_test_objs(&tobjs, 0x4000, 0x4000, NULL); stream = new_stream(&tobjs, 123); + ssr = lsquic_stream_receiving_state(stream); + assert(SSR_RECV == ssr); frame = new_frame_in_ext(&tobjs, 0, 6, 0, &data[0]); s = lsquic_stream_frame_in(stream, frame); @@ -1545,6 +1626,14 @@ test_reading_from_stream2 (void) } } + { + uint64_t n_readable; + + n_readable = stream->data_in->di_if + ->di_readable_bytes(stream->data_in, 0); + assert(10 == n_readable); + } + nw = lsquic_stream_read(stream, buf, 8); assert(("Read 8 bytes", nw == 8)); assert(("Expected 8 bytes", 0 == memcmp(buf, "12345678", nw))); @@ -1597,6 +1686,8 @@ test_reading_from_stream2 (void) */); s = lsquic_stream_frame_in(stream, frame); assert(("Inserted frame #3", 0 == s)); + ssr = lsquic_stream_receiving_state(stream); + assert(SSR_DATA_RECVD == ssr); /* Invalid frame: writing after FIN */ frame = new_frame_in(&tobjs, 10, 2, 0); @@ -1613,6 +1704,8 @@ test_reading_from_stream2 (void) nw = lsquic_stream_read(stream, buf, 1); assert(("Read 0 bytes (at EOR)", 0 == nw)); + ssr = lsquic_stream_receiving_state(stream); + assert(SSR_DATA_READ == ssr); lsquic_stream_destroy(stream); deinit_test_objs(&tobjs); @@ -1840,6 +1933,7 @@ test_insert_edge_cases (void) int s; ssize_t nread; const char data[] = "1234567890"; + enum stream_state_receiving ssr; unsigned buf[0x1000]; init_test_objs(&tobjs, 0x4000, 0x4000, NULL); @@ -1849,6 +1943,8 @@ test_insert_edge_cases (void) frame = new_frame_in_ext(&tobjs, 0, 6, 1, &data[0]); s = lsquic_stream_frame_in(stream, frame); assert(("Inserted frame #1", 0 == s)); + ssr = lsquic_stream_receiving_state(stream); + assert(SSR_DATA_RECVD == ssr); /* Invalid frame: different FIN location */ frame = new_frame_in_ext(&tobjs, 3, 2, 1, &data[3]); s = lsquic_stream_frame_in(stream, frame); @@ -1879,6 +1975,29 @@ test_insert_edge_cases (void) lsquic_stream_destroy(stream); } + { + stream = new_stream(&tobjs, 123); + frame = new_frame_in_ext(&tobjs, 6, 0, 1, &data[6]); + s = lsquic_stream_frame_in(stream, frame); + assert(("Frame OK", 0 == s)); + ssr = lsquic_stream_receiving_state(stream); + assert(SSR_SIZE_KNOWN == ssr); + frame = new_frame_in_ext(&tobjs, 0, 6, 0, &data[0]); + s = lsquic_stream_frame_in(stream, frame); + assert(("Inserted frame #1", 0 == s)); + nread = lsquic_stream_read(stream, buf, sizeof(buf)); + assert(6 == nread); + frame = new_frame_in_ext(&tobjs, 6, 0, 0, &data[6]); + s = lsquic_stream_frame_in(stream, frame); + assert(("Duplicate frame", 0 == s)); + nread = lsquic_stream_read(stream, buf, sizeof(buf)); + assert(nread == 0); /* Hit EOF */ + frame = new_frame_in_ext(&tobjs, 6, 0, 1, &data[6]); + s = lsquic_stream_frame_in(stream, frame); + assert(("Duplicate FIN frame", 0 == s)); + lsquic_stream_destroy(stream); + } + { stream = new_stream(&tobjs, 123); frame = new_frame_in_ext(&tobjs, 0, 6, 1, &data[0]); @@ -2032,6 +2151,92 @@ test_writing_to_stream_outside_callback (void) } +static void +test_changing_pack_size (void) +{ + ssize_t nw; + struct test_objs tobjs; + struct lsquic_conn *lconn = &tobjs.lconn; + struct lsquic_stream *stream; + int s, i; + unsigned char buf[0x2000]; + size_t len; + + init_buf(buf, sizeof(buf)); + + enum lsquic_version versions_to_test[3] = + { + LSQVER_046, + LSQVER_ID22, + }; + + for (i = 0; i < 3; i++) + { + g_pf = select_pf_by_ver(versions_to_test[i]); + + init_test_ctl_settings(&g_ctl_settings); + g_ctl_settings.tcs_schedule_stream_packets_immediately = 0; + g_ctl_settings.tcs_bp_type = BPT_OTHER_PRIO; + const struct buf_packet_q *const bpq = + &tobjs.send_ctl.sc_buffered_packets[g_ctl_settings.tcs_bp_type]; + init_test_objs(&tobjs, 0x4000, 0x4000, NULL); + n_closed = 0; + if ((1 << versions_to_test[i]) & LSQUIC_IETF_VERSIONS) + { + tobjs.ctor_flags |= SCF_IETF; + lconn->cn_flags |= LSCONN_IETF; + network_path.np_pack_size = 4096; + } + stream = new_stream(&tobjs, 5); + assert(("Stream initialized", stream)); + const struct test_ctx *const test_ctx_local = tobjs.stream_if_ctx; + assert(("on_new_stream called correctly", stream == test_ctx_local->stream)); + + len = ((1 << versions_to_test[i]) & LSQUIC_IETF_VERSIONS) ? 2048 : 1024; + nw = lsquic_stream_write(stream, buf, len); + assert(("n bytes written correctly", (size_t)nw == len)); + + assert(("not packetized", 0 == bpq->bpq_count)); + + /* IETF: shrink packet size before a flush */ + if ((1 << versions_to_test[i]) & LSQUIC_IETF_VERSIONS) + network_path.np_pack_size = 1370; + + s = lsquic_stream_flush(stream); + assert(0 == s); + + if ((1 << versions_to_test[i]) & LSQUIC_IETF_VERSIONS) + assert(("packetized -- 2 packets", 2 == bpq->bpq_count)); + else + assert(("packetized -- 1 packets", 1 == bpq->bpq_count)); + + /* IETF: expand packet size before a write */ + if ((1 << versions_to_test[i]) & LSQUIC_IETF_VERSIONS) + network_path.np_pack_size = 4096; + + len = ((1 << versions_to_test[i]) & LSQUIC_IETF_VERSIONS) ? 2048 : 1024; + nw = lsquic_stream_write(stream, buf, len); + assert(("n bytes written correctly", (size_t)nw == len)); + if ((1 << versions_to_test[i]) & LSQUIC_IETF_VERSIONS) + assert(("packetized -- 3 packets", 3 == bpq->bpq_count)); + else + assert(("packetized -- 1 packets", 1 == bpq->bpq_count)); + + s = lsquic_stream_flush(stream); + assert(0 == s); + if ((1 << versions_to_test[i]) & LSQUIC_IETF_VERSIONS) + assert(("packetized -- 3 packets", 3 == bpq->bpq_count)); + else + assert(("packetized -- 2 packets", 2 == bpq->bpq_count)); + + lsquic_stream_destroy(stream); + assert(("on_close called", 1 == n_closed)); + deinit_test_objs(&tobjs); + } + g_pf = select_pf_by_ver(LSQVER_039); +} + + /* Test window update logic, connection-limited */ static void test_window_update1 (void) @@ -2064,8 +2269,8 @@ test_window_update1 (void) assert(0 == memcmp(buf, "123", 3)); /* Pretend we sent out a packet: */ - packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs.send_ctl); - lsquic_send_ctl_sent_packet(&tobjs.send_ctl, packet_out, 1); + packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs.send_ctl, 0); + lsquic_send_ctl_sent_packet(&tobjs.send_ctl, packet_out); lsquic_stream_window_update(stream, 20); nw = lsquic_stream_write(stream, "4567890", 7); @@ -2158,16 +2363,16 @@ test_bad_packbits_guess_2 (void) assert(0 == memcmp(buf + 1337, buf_out, 1)); /* Verify packets */ - packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs.send_ctl); + packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs.send_ctl, 0); assert(lsquic_packet_out_packno_bits(packet_out) == GQUIC_PACKNO_LEN_6); assert(1 == packet_out->po_packno); assert(packet_out->po_frame_types & (1 << QUIC_FRAME_STREAM)); - lsquic_send_ctl_sent_packet(&tobjs.send_ctl, packet_out, 1); - packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs.send_ctl); + lsquic_send_ctl_sent_packet(&tobjs.send_ctl, packet_out); + packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs.send_ctl, 0); assert(lsquic_packet_out_packno_bits(packet_out) == GQUIC_PACKNO_LEN_6); assert(2 == packet_out->po_packno); assert(packet_out->po_frame_types & (1 << QUIC_FRAME_STREAM)); - lsquic_send_ctl_sent_packet(&tobjs.send_ctl, packet_out, 1); + lsquic_send_ctl_sent_packet(&tobjs.send_ctl, packet_out); assert(1 == streams[0]->n_unacked); assert(1 == streams[1]->n_unacked); @@ -2240,16 +2445,16 @@ test_bad_packbits_guess_3 (void) assert(0 == memcmp(buf, buf_out, 1343)); /* Verify packets */ - packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs.send_ctl); + packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs.send_ctl, 0); assert(lsquic_packet_out_packno_bits(packet_out) == GQUIC_PACKNO_LEN_4); assert(1 == packet_out->po_packno); assert(packet_out->po_frame_types & (1 << QUIC_FRAME_STREAM)); - lsquic_send_ctl_sent_packet(&tobjs.send_ctl, packet_out, 1); - packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs.send_ctl); + lsquic_send_ctl_sent_packet(&tobjs.send_ctl, packet_out); + packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs.send_ctl, 0); assert(lsquic_packet_out_packno_bits(packet_out) == GQUIC_PACKNO_LEN_4); assert(2 == packet_out->po_packno); assert(packet_out->po_frame_types & (1 << QUIC_FRAME_STREAM)); - lsquic_send_ctl_sent_packet(&tobjs.send_ctl, packet_out, 1); + lsquic_send_ctl_sent_packet(&tobjs.send_ctl, packet_out); assert(2 == streams[0]->n_unacked); ack_packet(&tobjs.send_ctl, 1); @@ -2302,6 +2507,7 @@ packetization_write_as_much_as_you_can (lsquic_stream_t *stream, struct packetization_test_stream_ctx *const pack_ctx = (void *) ctx; unsigned n_to_write; ssize_t n_written; + int s; while (pack_ctx->off < pack_ctx->len) { @@ -2316,6 +2522,8 @@ packetization_write_as_much_as_you_can (lsquic_stream_t *stream, pack_ctx->off += n_written; } + s = lsquic_stream_flush(stream); + assert(s == 0); lsquic_stream_wantwrite(stream, 0); } @@ -2362,6 +2570,7 @@ test_packetization (int schedule_stream_packets_immediately, int dispatch_once, struct lsquic_stream *streams[2]; size_t nw; int fin; + unsigned stream_ids[2]; unsigned char buf[0x8000]; unsigned char buf_out[0x8000]; @@ -2399,8 +2608,19 @@ test_packetization (int schedule_stream_packets_immediately, int dispatch_once, */ tobjs.stream_if = &packetization_inside_many_stream_if; - streams[0] = new_stream(&tobjs, 7); - streams[1] = new_stream_ext(&tobjs, 5, sizeof(buf) - 1); + if (g_use_crypto_ctor) + { + stream_ids[0] = ENC_LEV_CLEAR; + stream_ids[1] = ENC_LEV_INIT; + } + else + { + stream_ids[0] = 7; + stream_ids[1] = 5; + } + + streams[0] = new_stream(&tobjs, stream_ids[0]); + streams[1] = new_stream_ext(&tobjs, stream_ids[1], sizeof(buf) - 1); if (first_stream_sz) { @@ -2409,7 +2629,10 @@ test_packetization (int schedule_stream_packets_immediately, int dispatch_once, } if (schedule_stream_packets_immediately) + { lsquic_stream_dispatch_write_events(streams[1]); + lsquic_stream_flush(streams[1]); + } else { packetization_write_as_much_as_you_can(streams[1], @@ -2419,14 +2642,23 @@ test_packetization (int schedule_stream_packets_immediately, int dispatch_once, g_ctl_settings.tcs_schedule_stream_packets_immediately = 0; } - assert(packet_stream_ctx.off == packet_stream_ctx.len - first_stream_sz - 1); + if (!g_use_crypto_ctor) + assert(packet_stream_ctx.off == packet_stream_ctx.len - first_stream_sz - 1); /* Verify written data: */ nw = read_from_scheduled_packets(&tobjs.send_ctl, streams[1]->id, buf_out, sizeof(buf_out), 0, &fin, 1); - assert(nw == sizeof(buf) - first_stream_sz - 1); - assert(!fin); - assert(0 == memcmp(buf, buf_out, sizeof(buf) - first_stream_sz - 1)); + if (!g_use_crypto_ctor) + { + assert(nw == sizeof(buf) - first_stream_sz - 1); + assert(!fin); + assert(0 == memcmp(buf, buf_out, sizeof(buf) - first_stream_sz - 1)); + } + else + { + assert(0x4000 == nw); + assert(0 == memcmp(buf, buf_out, nw)); + } lsquic_stream_destroy(streams[0]); lsquic_stream_destroy(streams[1]); @@ -2436,6 +2668,10 @@ test_packetization (int schedule_stream_packets_immediately, int dispatch_once, /* Test condition when the room necessary to write a STREAM frame to a packet * is miscalculated and a brand-new packet has to be allocated. + * + * This does not affect IETF QUIC because the STREAM frame uses varint data + * length representation and thus uses just a single byte to represent the + * length of a 1-byte stream data chunk. */ static void test_cant_fit_frame (const struct parse_funcs *pf) @@ -2462,7 +2698,7 @@ test_cant_fit_frame (const struct parse_funcs *pf) lsquic_stream_write(streams[0], dude, sizeof(dude) - 1); lsquic_stream_flush(streams[0]); - rem = pf->pf_calc_stream_frame_header_sz(streams[1]->id, 0) + rem = pf->pf_calc_stream_frame_header_sz(streams[1]->id, 0, 1) + 1 /* We'll write one byte */ + 1 /* This triggers the refit condition */ ; @@ -2515,7 +2751,7 @@ test_window_update2 (void) init_test_objs(&tobjs, 0x4000, 0x4000, NULL); n_closed = 0; - stream = new_stream_ext(&tobjs, LSQUIC_STREAM_HANDSHAKE, 3); + stream = new_stream_ext(&tobjs, LSQUIC_GQUIC_STREAM_HANDSHAKE, 3); nw = lsquic_stream_write(stream, "1234567890", 10); lsquic_stream_flush(stream); assert(("lsquic_stream_write is limited by the send window", 3 == nw)); @@ -2523,15 +2759,15 @@ test_window_update2 (void) assert(0 == s); assert(("cc_tosend is not updated when not limited by connection", 0 == conn_cap->cc_sent)); - assert(stream->stream_flags & STREAM_SEND_BLOCKED); + assert(stream->sm_qflags & SMQF_SEND_BLOCKED); nw = read_from_scheduled_packets(&tobjs.send_ctl, stream->id, buf, sizeof(buf), 0, NULL, 0); assert(nw == 3); assert(0 == memcmp(buf, "123", 3)); /* Pretend we sent out a packet: */ - packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs.send_ctl); - lsquic_send_ctl_sent_packet(&tobjs.send_ctl, packet_out, 1); + packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs.send_ctl, 0); + lsquic_send_ctl_sent_packet(&tobjs.send_ctl, packet_out); lsquic_stream_window_update(stream, 20); nw = lsquic_stream_write(stream, "4567890", 7); @@ -2576,7 +2812,7 @@ test_blocked_flags (void) assert(0 == s); assert(("cc_tosend is updated when limited by connection", 3 == conn_cap->cc_sent)); - assert(stream->stream_flags & STREAM_SEND_BLOCKED); + assert(stream->sm_qflags & SMQF_SEND_BLOCKED); assert(3 == stream->blocked_off); assert(tobjs.lconn.cn_flags & LSCONN_SEND_BLOCKED); assert(3 == conn_cap->cc_blocked); @@ -2593,17 +2829,22 @@ test_forced_flush_when_conn_blocked (void) struct test_objs tobjs; struct lsquic_stream *stream; struct lsquic_conn_cap *const conn_cap = &tobjs.conn_pub.conn_cap; + enum stream_state_sending sss; init_test_ctl_settings(&g_ctl_settings); g_ctl_settings.tcs_schedule_stream_packets_immediately = 1; init_test_objs(&tobjs, 3, 0x1000, NULL); stream = new_stream(&tobjs, 123); + sss = lsquic_stream_sending_state(stream); + assert(SSS_READY == sss); nw = lsquic_stream_write(stream, "1234567890", 10); assert(("lsquic_stream_write is limited by the send window", 3 == nw)); assert(("cc_tosend is updated immediately", 3 == conn_cap->cc_sent)); assert(1 == lsquic_send_ctl_n_scheduled(&tobjs.send_ctl)); /* Flush occurred */ + sss = lsquic_stream_sending_state(stream); + assert(SSS_SEND == sss); assert(tobjs.lconn.cn_flags & LSCONN_SEND_BLOCKED); assert(3 == conn_cap->cc_blocked); @@ -2614,7 +2855,7 @@ test_forced_flush_when_conn_blocked (void) static int my_gen_stream_frame_err (unsigned char *buf, size_t bufsz, - uint32_t stream_id, uint64_t offset, + lsquic_stream_id_t stream_id, uint64_t offset, int fin, size_t size, gsf_read_f read, void *stream) { @@ -2644,7 +2885,7 @@ test_conn_abort (void) assert(10 == nw); /* No error yet */ s = lsquic_stream_flush(stream); assert(s < 0); - assert(stream->stream_flags & STREAM_ABORT_CONN); + assert(stream->sm_qflags & SMQF_ABORT_CONN); assert(!TAILQ_EMPTY(&tobjs.conn_pub.service_streams)); lsquic_stream_destroy(stream); @@ -2725,16 +2966,16 @@ test_bad_packbits_guess_1 (void) assert(0 == memcmp(buf + 1337, buf_out, 1)); /* Verify packets */ - packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs.send_ctl); + packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs.send_ctl, 0); assert(lsquic_packet_out_packno_bits(packet_out) == GQUIC_PACKNO_LEN_6); assert(1 == packet_out->po_packno); assert(packet_out->po_frame_types & (1 << QUIC_FRAME_STREAM)); - lsquic_send_ctl_sent_packet(&tobjs.send_ctl, packet_out, 1); - packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs.send_ctl); + lsquic_send_ctl_sent_packet(&tobjs.send_ctl, packet_out); + packet_out = lsquic_send_ctl_next_packet_to_send(&tobjs.send_ctl, 0); assert(lsquic_packet_out_packno_bits(packet_out) == GQUIC_PACKNO_LEN_6); assert(2 == packet_out->po_packno); assert(packet_out->po_frame_types & (1 << QUIC_FRAME_STREAM)); - lsquic_send_ctl_sent_packet(&tobjs.send_ctl, packet_out, 1); + lsquic_send_ctl_sent_packet(&tobjs.send_ctl, packet_out); assert(1 == streams[0]->n_unacked); assert(1 == streams[1]->n_unacked); @@ -2755,6 +2996,35 @@ test_bad_packbits_guess_1 (void) } +static void +main_test_packetization (void) +{ + const unsigned fp_sizes[] = { 0, 10, 100, 501, 1290, }; + unsigned i; + for (i = 0; i < sizeof(fp_sizes) / sizeof(fp_sizes[0]); ++i) + { + int once; + unsigned write_size; + if (!g_use_crypto_ctor) /* No buffered packets for CRYPTO frames */ + { + for (write_size = 1; write_size < GQUIC_MAX_PACKET_SZ; ++write_size) + test_packetization(0, 0, write_size, fp_sizes[i]); + srand(7891); + for (write_size = 1; write_size < GQUIC_MAX_PACKET_SZ * 10; ++write_size) + test_packetization(0, 0, RANDOM_WRITE_SIZE, fp_sizes[i]); + } + for (once = 0; once < 2; ++once) + { + for (write_size = 1; write_size < GQUIC_MAX_PACKET_SZ; ++write_size) + test_packetization(1, once, write_size, fp_sizes[i]); + srand(7891); + for (write_size = 1; write_size < GQUIC_MAX_PACKET_SZ * 10; ++write_size) + test_packetization(1, once, RANDOM_WRITE_SIZE, fp_sizes[i]); + } + } +} + + int main (int argc, char **argv) { @@ -2785,6 +3055,7 @@ main (int argc, char **argv) test_writing_to_stream_schedule_stream_packets_immediately(); test_writing_to_stream_outside_callback(); + test_changing_pack_size(); test_window_update1(); test_window_update2(); test_forced_flush_when_conn_blocked(); @@ -2816,30 +3087,17 @@ main (int argc, char **argv) test_bad_packbits_guess_2(); test_bad_packbits_guess_3(); - const unsigned fp_sizes[] = { 0, 10, 100, 501, 1290, }; - unsigned i; - for (i = 0; i < sizeof(fp_sizes) / sizeof(fp_sizes[0]); ++i) - { - int once; - unsigned write_size; - for (write_size = 1; write_size < QUIC_MAX_PACKET_SZ; ++write_size) - test_packetization(0, 0, write_size, fp_sizes[i]); - srand(7891); - for (write_size = 1; write_size < QUIC_MAX_PACKET_SZ * 10; ++write_size) - test_packetization(0, 0, RANDOM_WRITE_SIZE, fp_sizes[i]); - for (once = 0; once < 2; ++once) - { - for (write_size = 1; write_size < QUIC_MAX_PACKET_SZ; ++write_size) - test_packetization(1, once, write_size, fp_sizes[i]); - srand(7891); - for (write_size = 1; write_size < QUIC_MAX_PACKET_SZ * 10; ++write_size) - test_packetization(1, once, RANDOM_WRITE_SIZE, fp_sizes[i]); - } - } + main_test_packetization(); enum lsquic_version ver; for (ver = 0; ver < N_LSQVER; ++ver) - test_cant_fit_frame(select_pf_by_ver(ver)); + if (!((1 << ver) & LSQUIC_IETF_VERSIONS)) + test_cant_fit_frame(select_pf_by_ver(ver)); + + /* Redo some tests using crypto streams and frames */ + g_use_crypto_ctor = 1; + g_pf = select_pf_by_ver(LSQVER_ID22); + main_test_packetization(); return 0; } diff --git a/test/unittests/test_streamgen.c b/test/unittests/test_streamgen.c index d1305006b..280297abc 100644 --- a/test/unittests/test_streamgen.c +++ b/test/unittests/test_streamgen.c @@ -10,9 +10,11 @@ #include "lsquic.h" #include "lsquic_types.h" -#include "lsquic_alarmset.h" #include "lsquic_parse.h" #include "lsquic_sfcw.h" +#include "lsquic_varint.h" +#include "lsquic_hq.h" +#include "lsquic_hash.h" #include "lsquic_stream.h" struct test { @@ -41,10 +43,10 @@ struct test { static const struct test tests[] = { /* - * Little-endian: + * Big-endian: */ { .lineno = __LINE__, - .pf = select_pf_by_ver(LSQVER_035), + .pf = select_pf_by_ver(LSQVER_039), .fin = { 0, 1, }, .offset = 0x0807060504030201UL, .stream_id = 0x210, @@ -55,9 +57,9 @@ static const struct test tests[] = { /* 1 f d ooo ss 1fdoooss */ /* TYPE FIN DLEN OLEN SLEN */ { 0x80 | 0x40 | 0x20 | 0x1C | 0x01, - 0x10, 0x02, /* Stream ID */ - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, /* Offset */ - 0x0A, 0x00, /* Data length */ + 0x02, 0x10, /* Stream ID */ + 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */ + 0x00, 0x0A, /* Data length */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', }, .len = 1 + 2 + 8 + 2 + 10, @@ -65,7 +67,7 @@ static const struct test tests[] = { }, { .lineno = __LINE__, - .pf = select_pf_by_ver(LSQVER_035), + .pf = select_pf_by_ver(LSQVER_039), .fin = { 0, 0, }, .offset = 0x0807060504030201UL, .stream_id = 0x210, @@ -76,9 +78,9 @@ static const struct test tests[] = { /* 1 f d ooo ss 1fdoooss */ /* TYPE FIN DLEN OLEN SLEN */ { 0x80 | 0x00 | 0x20 | 0x1C | 0x01, - 0x10, 0x02, /* Stream ID */ - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, /* Offset */ - 0x0A, 0x00, /* Data length */ + 0x02, 0x10, /* Stream ID */ + 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */ + 0x00, 0x0A, /* Data length */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', }, .len = 1 + 2 + 8 + 2 + 10, @@ -86,7 +88,7 @@ static const struct test tests[] = { }, { .lineno = __LINE__, - .pf = select_pf_by_ver(LSQVER_035), + .pf = select_pf_by_ver(LSQVER_039), .fin = { 1, 0, }, .offset = 0x0807060504030201UL, .stream_id = 0x210, @@ -97,8 +99,8 @@ static const struct test tests[] = { /* 1 f d ooo ss 1fdoooss */ /* TYPE FIN DLEN OLEN SLEN */ { 0x80 | 0x40 | 0x20 | 0x1C | 0x01, - 0x10, 0x02, /* Stream ID */ - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, /* Offset */ + 0x02, 0x10, /* Stream ID */ + 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */ 0x00, 0x00, /* Data length */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', }, @@ -107,7 +109,7 @@ static const struct test tests[] = { }, { .lineno = __LINE__, - .pf = select_pf_by_ver(LSQVER_035), + .pf = select_pf_by_ver(LSQVER_039), .fin = { 1, 0, }, .offset = 0x0807060504030201UL, .stream_id = 0x21, @@ -119,7 +121,7 @@ static const struct test tests[] = { /* TYPE FIN DLEN OLEN SLEN */ { 0x80 | 0x40 | 0x20 | 0x1C | 0x00, 0x21, /* Stream ID */ - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, /* Offset */ + 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */ 0x00, 0x00, /* Data length */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', }, @@ -128,7 +130,7 @@ static const struct test tests[] = { }, { .lineno = __LINE__, - .pf = select_pf_by_ver(LSQVER_035), + .pf = select_pf_by_ver(LSQVER_039), .fin = { 0, 0, }, .offset = 0x77, .stream_id = 0x210, @@ -139,9 +141,9 @@ static const struct test tests[] = { /* 1 f d ooo ss 1fdoooss */ /* TYPE FIN DLEN OLEN SLEN */ { 0x80 | 0x00 | 0x20 | 0x04 | 0x01, - 0x10, 0x02, /* Stream ID */ - 0x77, 0x00, /* Offset */ - 0x0A, 0x00, /* Data length */ + 0x02, 0x10, /* Stream ID */ + 0x00, 0x77, /* Offset */ + 0x00, 0x0A, /* Data length */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', }, .len = 1 + 2 + 2 + 2 + 10, @@ -149,7 +151,7 @@ static const struct test tests[] = { }, { .lineno = __LINE__, - .pf = select_pf_by_ver(LSQVER_035), + .pf = select_pf_by_ver(LSQVER_039), .fin = { 0, 0, }, .offset = 0x0, .stream_id = 0x210, @@ -160,9 +162,9 @@ static const struct test tests[] = { /* 1 f d ooo ss 1fdoooss */ /* TYPE FIN DLEN OLEN SLEN */ { 0x80 | 0x00 | 0x20 | 0x00 | 0x01, - 0x10, 0x02, /* Stream ID */ + 0x02, 0x10, /* Stream ID */ /* Offset */ - 0x0A, 0x00, /* Data length */ + 0x00, 0x0A, /* Data length */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', }, .len = 1 + 2 + 0 + 2 + 10, @@ -170,7 +172,7 @@ static const struct test tests[] = { }, { .lineno = __LINE__, - .pf = select_pf_by_ver(LSQVER_035), + .pf = select_pf_by_ver(LSQVER_039), .fin = { 0, 1, }, .offset = 0x0, .stream_id = 0x210, @@ -181,9 +183,9 @@ static const struct test tests[] = { /* 1 f d ooo ss 1fdoooss */ /* TYPE FIN DLEN OLEN SLEN */ { 0x80 | 0x40 | 0x20 | 0x00 | 0x01, - 0x10, 0x02, /* Stream ID */ + 0x02, 0x10, /* Stream ID */ /* Offset */ - 0x01, 0x00, /* Data length */ + 0x00, 0x01, /* Data length */ '0', }, .len = 1 + 2 + 0 + 2 + 1, @@ -191,7 +193,7 @@ static const struct test tests[] = { }, { .lineno = __LINE__, - .pf = select_pf_by_ver(LSQVER_035), + .pf = select_pf_by_ver(LSQVER_039), .fin = { 0, 0, }, .offset = 0xFFFFFF, .stream_id = 0x210, @@ -202,9 +204,9 @@ static const struct test tests[] = { /* 1 f d ooo ss 1fdoooss */ /* TYPE FIN DLEN OLEN SLEN */ { 0x80 | 0x00 | 0x20 | 0x08 | 0x01, - 0x10, 0x02, /* Stream ID */ + 0x02, 0x10, /* Stream ID */ 0xFF, 0xFF, 0xFF, /* Offset */ - 0x0A, 0x00, /* Data length */ + 0x00, 0x0A, /* Data length */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', }, .len = 1 + 2 + 3 + 2 + 10, @@ -212,7 +214,7 @@ static const struct test tests[] = { }, { .lineno = __LINE__, - .pf = select_pf_by_ver(LSQVER_035), + .pf = select_pf_by_ver(LSQVER_039), .fin = { 0, 0, }, .offset = 0xFFFFFF + 1, .stream_id = 0x210, @@ -223,9 +225,9 @@ static const struct test tests[] = { /* 1 f d ooo ss 1fdoooss */ /* TYPE FIN DLEN OLEN SLEN */ { 0x80 | 0x00 | 0x20 | 0x0C | 0x01, - 0x10, 0x02, /* Stream ID */ - 0x00, 0x00, 0x00, 0x01, /* Offset */ - 0x0A, 0x00, /* Data length */ + 0x02, 0x10, /* Stream ID */ + 0x01, 0x00, 0x00, 0x00, /* Offset */ + 0x00, 0x0A, /* Data length */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', }, .len = 1 + 2 + 4 + 2 + 10, @@ -233,7 +235,7 @@ static const struct test tests[] = { }, { .lineno = __LINE__, - .pf = select_pf_by_ver(LSQVER_035), + .pf = select_pf_by_ver(LSQVER_039), .fin = { 0, 0, }, .offset = 0xFFFFFF + 1, .stream_id = 0x210, @@ -244,8 +246,8 @@ static const struct test tests[] = { /* 1 f d ooo ss 1fdoooss */ /* TYPE FIN DLEN OLEN SLEN */ { 0x80 | 0x00 | 0x00 | 0x0C | 0x01, - 0x10, 0x02, /* Stream ID */ - 0x00, 0x00, 0x00, 0x01, /* Offset */ + 0x02, 0x10, /* Stream ID */ + 0x01, 0x00, 0x00, 0x00, /* Offset */ '0', '1', '2', }, .len = 1 + 2 + 4 + 0 + 3, @@ -253,7 +255,7 @@ static const struct test tests[] = { }, { .lineno = __LINE__, - .pf = select_pf_by_ver(LSQVER_035), + .pf = select_pf_by_ver(LSQVER_039), .fin = { 1, 0, }, .offset = 0xB4, .stream_id = 0x01, @@ -265,7 +267,7 @@ static const struct test tests[] = { /* TYPE FIN DLEN OLEN SLEN */ { 0x80 | 0x40 | 0x20 | 0x04 | 0x00, 0x01, /* Stream ID */ - 0xB4, 0x00, /* Offset */ + 0x00, 0xB4, /* Offset */ 0x00, 0x00, /* Data length */ }, .len = 6, @@ -273,10 +275,11 @@ static const struct test tests[] = { }, /* - * Big-endian: + * IETF QUIC Internet-Draft 17: */ + { .lineno = __LINE__, - .pf = select_pf_by_ver(LSQVER_039), + .pf = select_pf_by_ver(LSQVER_ID22), .fin = { 0, 1, }, .offset = 0x0807060504030201UL, .stream_id = 0x210, @@ -284,224 +287,109 @@ static const struct test tests[] = { .data = "0123456789", .avail = 0x100, .out = - /* 1 f d ooo ss 1fdoooss */ - /* TYPE FIN DLEN OLEN SLEN */ - { 0x80 | 0x40 | 0x20 | 0x1C | 0x01, - 0x02, 0x10, /* Stream ID */ - 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */ - 0x00, 0x0A, /* Data length */ + /* TYPE OFF DLEN FIN */ + { 0x08 | 1<<2 | 1<<1 | 1<<0, + 0x42, 0x10, /* Stream ID */ + 0xC8, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */ + 0x0A, /* Data length */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', }, - .len = 1 + 2 + 8 + 2 + 10, + .len = 1 + 2 + 8 + 1 + 10, .min_sz = 1 + 2 + 8 + 0 + 1, }, { .lineno = __LINE__, - .pf = select_pf_by_ver(LSQVER_039), + .pf = select_pf_by_ver(LSQVER_ID22), .fin = { 0, 0, }, - .offset = 0x0807060504030201UL, - .stream_id = 0x210, - .data_sz = 10, - .data = "0123456789", - .avail = 0x100, - .out = - /* 1 f d ooo ss 1fdoooss */ - /* TYPE FIN DLEN OLEN SLEN */ - { 0x80 | 0x00 | 0x20 | 0x1C | 0x01, - 0x02, 0x10, /* Stream ID */ - 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */ - 0x00, 0x0A, /* Data length */ - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - }, - .len = 1 + 2 + 8 + 2 + 10, - .min_sz = 1 + 2 + 8 + 0 + 1, - }, - - { .lineno = __LINE__, - .pf = select_pf_by_ver(LSQVER_039), - .fin = { 1, 0, }, - .offset = 0x0807060504030201UL, + .offset = 0, .stream_id = 0x210, .data_sz = 10, .data = "0123456789", .avail = 0x100, .out = - /* 1 f d ooo ss 1fdoooss */ - /* TYPE FIN DLEN OLEN SLEN */ - { 0x80 | 0x40 | 0x20 | 0x1C | 0x01, - 0x02, 0x10, /* Stream ID */ - 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */ - 0x00, 0x00, /* Data length */ - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - }, - .len = 1 + 2 + 8 + 2, - .min_sz = 1 + 2 + 8 + 2, - }, - - { .lineno = __LINE__, - .pf = select_pf_by_ver(LSQVER_039), - .fin = { 1, 0, }, - .offset = 0x0807060504030201UL, - .stream_id = 0x21, - .data_sz = 10, - .data = "0123456789", - .avail = 0x100, - .out = - /* 1 f d ooo ss 1fdoooss */ - /* TYPE FIN DLEN OLEN SLEN */ - { 0x80 | 0x40 | 0x20 | 0x1C | 0x00, - 0x21, /* Stream ID */ - 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */ - 0x00, 0x00, /* Data length */ + /* TYPE OFF DLEN FIN */ + { 0x08 | 0<<2 | 1<<1 | 0<<0, + 0x42, 0x10, /* Stream ID */ + 0x0A, /* Data length */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', }, - .len = 1 + 1 + 8 + 2, - .min_sz = 1 + 1 + 8 + 2, - }, - - { .lineno = __LINE__, - .pf = select_pf_by_ver(LSQVER_039), - .fin = { 0, 0, }, - .offset = 0x77, - .stream_id = 0x210, - .data_sz = 10, - .data = "0123456789", - .avail = 0x100, - .out = - /* 1 f d ooo ss 1fdoooss */ - /* TYPE FIN DLEN OLEN SLEN */ - { 0x80 | 0x00 | 0x20 | 0x04 | 0x01, - 0x02, 0x10, /* Stream ID */ - 0x00, 0x77, /* Offset */ - 0x00, 0x0A, /* Data length */ - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - }, - .len = 1 + 2 + 2 + 2 + 10, - .min_sz = 1 + 2 + 2 + 0 + 1, - }, - - { .lineno = __LINE__, - .pf = select_pf_by_ver(LSQVER_039), - .fin = { 0, 0, }, - .offset = 0x0, - .stream_id = 0x210, - .data_sz = 10, - .data = "0123456789", - .avail = 0x100, - .out = - /* 1 f d ooo ss 1fdoooss */ - /* TYPE FIN DLEN OLEN SLEN */ - { 0x80 | 0x00 | 0x20 | 0x00 | 0x01, - 0x02, 0x10, /* Stream ID */ - /* Offset */ - 0x00, 0x0A, /* Data length */ - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - }, - .len = 1 + 2 + 0 + 2 + 10, + .len = 1 + 2 + 0 + 1 + 10, .min_sz = 1 + 2 + 0 + 0 + 1, }, { .lineno = __LINE__, - .pf = select_pf_by_ver(LSQVER_039), - .fin = { 0, 1, }, - .offset = 0x0, - .stream_id = 0x210, - .data_sz = 1, - .data = "0123456789", - .avail = 0x100, - .out = - /* 1 f d ooo ss 1fdoooss */ - /* TYPE FIN DLEN OLEN SLEN */ - { 0x80 | 0x40 | 0x20 | 0x00 | 0x01, - 0x02, 0x10, /* Stream ID */ - /* Offset */ - 0x00, 0x01, /* Data length */ - '0', - }, - .len = 1 + 2 + 0 + 2 + 1, - .min_sz = 1 + 2 + 0 + 0 + 1, - }, - - { .lineno = __LINE__, - .pf = select_pf_by_ver(LSQVER_039), + .pf = select_pf_by_ver(LSQVER_ID22), .fin = { 0, 0, }, - .offset = 0xFFFFFF, - .stream_id = 0x210, + .offset = 0, + .stream_id = 0x21, .data_sz = 10, .data = "0123456789", - .avail = 0x100, + .avail = 12, .out = - /* 1 f d ooo ss 1fdoooss */ - /* TYPE FIN DLEN OLEN SLEN */ - { 0x80 | 0x00 | 0x20 | 0x08 | 0x01, - 0x02, 0x10, /* Stream ID */ - 0xFF, 0xFF, 0xFF, /* Offset */ - 0x00, 0x0A, /* Data length */ + /* TYPE OFF DLEN FIN */ + { 0x08 | 0<<2 | 0<<1 | 0<<0, + 0x21, /* Stream ID */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', }, - .len = 1 + 2 + 3 + 2 + 10, - .min_sz = 1 + 2 + 3 + 0 + 1, + .len = 1 + 1 + 0 + 0 + 10, + .min_sz = 1 + 1 + 0 + 0 + 1, }, { .lineno = __LINE__, - .pf = select_pf_by_ver(LSQVER_039), + .pf = select_pf_by_ver(LSQVER_ID22), .fin = { 0, 0, }, - .offset = 0xFFFFFF + 1, + .offset = 0x0807060504030201UL, .stream_id = 0x210, .data_sz = 10, .data = "0123456789", .avail = 0x100, .out = - /* 1 f d ooo ss 1fdoooss */ - /* TYPE FIN DLEN OLEN SLEN */ - { 0x80 | 0x00 | 0x20 | 0x0C | 0x01, - 0x02, 0x10, /* Stream ID */ - 0x01, 0x00, 0x00, 0x00, /* Offset */ - 0x00, 0x0A, /* Data length */ + /* TYPE OFF DLEN FIN */ + { 0x08 | 1<<2 | 1<<1 | 0<<0, + 0x42, 0x10, /* Stream ID */ + 0xC8, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */ + 0x0A, /* Data length */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', }, - .len = 1 + 2 + 4 + 2 + 10, - .min_sz = 1 + 2 + 4 + 0 + 1, + .len = 1 + 2 + 8 + 1 + 10, + .min_sz = 1 + 2 + 8 + 0 + 1, }, { .lineno = __LINE__, - .pf = select_pf_by_ver(LSQVER_039), - .fin = { 0, 0, }, - .offset = 0xFFFFFF + 1, + .pf = select_pf_by_ver(LSQVER_ID22), + .fin = { 1, 0, }, + .offset = 0x0807060504030201UL, .stream_id = 0x210, - .data_sz = 10, + .data_sz = 0, .data = "0123456789", - .avail = 10, + .avail = 11, .out = - /* 1 f d ooo ss 1fdoooss */ - /* TYPE FIN DLEN OLEN SLEN */ - { 0x80 | 0x00 | 0x00 | 0x0C | 0x01, - 0x02, 0x10, /* Stream ID */ - 0x01, 0x00, 0x00, 0x00, /* Offset */ - '0', '1', '2', + /* TYPE OFF DLEN FIN */ + { 0x08 | 1<<2 | 0<<1 | 1<<0, + 0x42, 0x10, /* Stream ID */ + 0xC8, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */ }, - .len = 1 + 2 + 4 + 0 + 3, - .min_sz = 1 + 2 + 4 + 0 + 1, + .len = 1 + 2 + 8, + .min_sz = 1 + 2 + 8, }, { .lineno = __LINE__, - .pf = select_pf_by_ver(LSQVER_039), + .pf = select_pf_by_ver(LSQVER_ID22), .fin = { 1, 0, }, - .offset = 0xB4, - .stream_id = 0x01, + .offset = 0x0807060504030201UL, + .stream_id = 0x210, .data_sz = 0, .data = "0123456789", .avail = 0x100, .out = - /* 1 f d ooo ss 1fdoooss */ - /* TYPE FIN DLEN OLEN SLEN */ - { 0x80 | 0x40 | 0x20 | 0x04 | 0x00, - 0x01, /* Stream ID */ - 0x00, 0xB4, /* Offset */ - 0x00, 0x00, /* Data length */ + /* TYPE OFF DLEN FIN */ + { 0x08 | 1<<2 | 1<<1 | 1<<0, + 0x42, 0x10, /* Stream ID */ + 0xC8, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */ + 0x00, /* Data length */ }, - .len = 6, - .min_sz = 6, + .len = 1 + 2 + 8 + 1, + .min_sz = 1 + 2 + 8, }, }; diff --git a/test/unittests/test_streamparse.c b/test/unittests/test_streamparse.c index 096116d20..afcd90aba 100644 --- a/test/unittests/test_streamparse.c +++ b/test/unittests/test_streamparse.c @@ -10,7 +10,6 @@ #include "lsquic.h" #include "lsquic_types.h" -#include "lsquic_alarmset.h" #include "lsquic_parse.h" #include "lsquic_packet_common.h" #include "lsquic_packet_in.h" @@ -34,17 +33,17 @@ struct test { static const struct test tests[] = { /* - * Litte-endian tests; + * Big-endian tests */ { "Balls to the wall: every possible bit is set", __LINE__, - select_pf_by_ver(LSQVER_035), + select_pf_by_ver(LSQVER_039), /* 1 f d ooo ss 1fdoooss */ /* TYPE FIN DLEN OLEN SLEN */ { 0x80 | 0x40 | 0x20 | 0x1C | 0x3, - 0x10, 0x02, 0x00, 0x00, /* Stream ID */ - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, /* Offset */ - 0xC4, 0x01, /* Data length */ + 0x00, 0x00, 0x02, 0x10, /* Stream ID */ + 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */ + 0x01, 0xC4, /* Data length */ }, 1 + 2 + 8 + 4, 0x200, @@ -58,13 +57,13 @@ static const struct test tests[] = { { "Balls to the wall #2: every possible bit is set, except FIN", __LINE__, - select_pf_by_ver(LSQVER_035), + select_pf_by_ver(LSQVER_039), /* 1 f d ooo ss 1fdoooss */ /* TYPE FIN DLEN OLEN SLEN */ { 0x80 | 0x00 | 0x20 | 0x1C | 0x3, - 0x10, 0x02, 0x00, 0x00, /* Stream ID */ - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, /* Offset */ - 0xC4, 0x01, /* Data length */ + 0x00, 0x00, 0x02, 0x10, /* Stream ID */ + 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */ + 0x01, 0xC4, /* Data length */ }, 1 + 2 + 8 + 4, 0x200, @@ -78,13 +77,13 @@ static const struct test tests[] = { { "Data length is zero", __LINE__, - select_pf_by_ver(LSQVER_035), + select_pf_by_ver(LSQVER_039), /* 1 f d ooo ss 1fdoooss */ /* TYPE FIN DLEN OLEN SLEN */ { 0x80 | 0x40 | 0x00 | 0x1C | 0x3, - 0x10, 0x02, 0x00, 0x00, /* Stream ID */ - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, /* Offset */ - 0xC4, 0x01, /* Data length */ + 0x00, 0x00, 0x02, 0x10, /* Stream ID */ + 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */ + 0xC4, 0x01, /* Data length: note this does not matter */ }, 1 + 0 + 8 + 4, 0x200, @@ -98,13 +97,13 @@ static const struct test tests[] = { { "Stream ID length is 1", __LINE__, - select_pf_by_ver(LSQVER_035), + select_pf_by_ver(LSQVER_039), /* 1 f d ooo ss 1fdoooss */ /* TYPE FIN DLEN OLEN SLEN */ { 0x80 | 0x40 | 0x20 | 0x1C | 0x0, 0xF0, /* Stream ID */ - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, /* Offset */ - 0xC4, 0x01, /* Data length */ + 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */ + 0x01, 0xC4, /* Data length */ }, 1 + 2 + 8 + 1, 0x200, @@ -118,12 +117,12 @@ static const struct test tests[] = { { "All bits are zero save offset length", __LINE__, - select_pf_by_ver(LSQVER_035), + select_pf_by_ver(LSQVER_039), /* 1 f d ooo ss 1fdoooss */ /* TYPE FIN DLEN OLEN SLEN */ { 0x80 | 0x00 | 0x00 | 0x04 | 0x0, 0xF0, /* Stream ID */ - 0x55, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, /* Offset */ + 0x02, 0x55, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, /* Offset */ 0xC4, 0x01, /* Data length */ }, 1 + 0 + 2 + 1, @@ -138,12 +137,12 @@ static const struct test tests[] = { { "Sanity check: either FIN must be set or data length is not zero #1", __LINE__, - select_pf_by_ver(LSQVER_035), + select_pf_by_ver(LSQVER_039), /* 1 f d ooo ss 1fdoooss */ /* TYPE FIN DLEN OLEN SLEN */ { 0x80 | 0x00 | 0x00 | 0x04 | 0x0, 0xF0, /* Stream ID */ - 0x55, 0x02, /* Offset */ + 0x02, 0x55, /* Offset */ }, 1 + 0 + 2 + 1, 4, /* Same as buffer size: in the absense of explicit data @@ -160,12 +159,12 @@ static const struct test tests[] = { { "Sanity check: either FIN must be set or data length is not zero #2", __LINE__, - select_pf_by_ver(LSQVER_035), + select_pf_by_ver(LSQVER_039), /* 1 f d ooo ss 1fdoooss */ /* TYPE FIN DLEN OLEN SLEN */ { 0x80 | 0x00 | 0x20 | 0x04 | 0x0, 0xF0, /* Stream ID */ - 0x55, 0x02, /* Offset */ + 0x02, 0x55, /* Offset */ 0x00, 0x00, }, 1 + 2 + 2 + 1, @@ -180,12 +179,12 @@ static const struct test tests[] = { { "Sanity check: either FIN must be set or data length is not zero #3", __LINE__, - select_pf_by_ver(LSQVER_035), + select_pf_by_ver(LSQVER_039), /* 1 f d ooo ss 1fdoooss */ /* TYPE FIN DLEN OLEN SLEN */ { 0x80 | 0x40 | 0x20 | 0x04 | 0x0, 0xF0, /* Stream ID */ - 0x55, 0x02, /* Offset */ + 0x02, 0x55, /* Offset */ 0x00, 0x00, }, 1 + 2 + 2 + 1, @@ -200,13 +199,13 @@ static const struct test tests[] = { { "Check data bounds #1", __LINE__, - select_pf_by_ver(LSQVER_035), + select_pf_by_ver(LSQVER_039), /* 1 f d ooo ss 1fdoooss */ /* TYPE FIN DLEN OLEN SLEN */ { 0x80 | 0x00 | 0x20 | 0x04 | 0x0, 0xF0, /* Stream ID */ - 0x55, 0x02, /* Offset */ - 0xFA, 0x01, /* Data length */ + 0x02, 0x55, /* Offset */ + 0x01, 0xFA, /* Data length */ }, 1 + 2 + 2 + 1, 0x200, @@ -220,13 +219,13 @@ static const struct test tests[] = { { "Check data bounds #2", __LINE__, - select_pf_by_ver(LSQVER_035), + select_pf_by_ver(LSQVER_039), /* 1 f d ooo ss 1fdoooss */ /* TYPE FIN DLEN OLEN SLEN */ { 0x80 | 0x00 | 0x20 | 0x04 | 0x0, 0xF0, /* Stream ID */ - 0x55, 0x02, /* Offset */ - 0xFB, 0x01, /* <--- One byte too many */ + 0x02, 0x55, /* Offset */ + 0x01, 0xFB, /* <--- One byte too many */ }, 1 + 2 + 2 + 1, 0x200, @@ -239,206 +238,174 @@ static const struct test tests[] = { }, /* - * Big-endian tests + * IETF QUIC Internet-Draft 14 Tests. */ + { "Balls to the wall: every possible bit is set", __LINE__, - select_pf_by_ver(LSQVER_039), - /* 1 f d ooo ss 1fdoooss */ - /* TYPE FIN DLEN OLEN SLEN */ - { 0x80 | 0x40 | 0x20 | 0x1C | 0x3, - 0x00, 0x00, 0x02, 0x10, /* Stream ID */ - 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */ - 0x01, 0xC4, /* Data length */ - }, - 1 + 2 + 8 + 4, + select_pf_by_ver(LSQVER_ID22), + /* TYPE OFF DLEN FIN */ + { 0x10 | 1<<2 | 1<<1 | 1<<0, + 0x41, 0x23, /* Stream ID */ + 0x08, /* Offset */ + 0x41, 0xC4, /* Data length */ + }, + 1 + 2 + 1 + 2, 0x200, - { .data_frame.df_offset = 0x0807060504030201UL, - .stream_id = 0x210, - .data_frame.df_size = 0x1C4, - .data_frame.df_fin = 1, + { .data_frame.df_offset = 0x08, + .stream_id = 0x123, + .data_frame.df_size = 0x1C4, + .data_frame.df_fin = 1, }, 1, }, - { "Balls to the wall #2: every possible bit is set, except FIN", + { "Balls to the wall #2: every possible bit is set except FIN", __LINE__, - select_pf_by_ver(LSQVER_039), - /* 1 f d ooo ss 1fdoooss */ - /* TYPE FIN DLEN OLEN SLEN */ - { 0x80 | 0x00 | 0x20 | 0x1C | 0x3, - 0x00, 0x00, 0x02, 0x10, /* Stream ID */ - 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */ - 0x01, 0xC4, /* Data length */ - }, - 1 + 2 + 8 + 4, + select_pf_by_ver(LSQVER_ID22), + /* TYPE OFF DLEN FIN */ + { 0x10 | 1<<2 | 1<<1 | 0<<0, + 0x81, 0x23, 0x00, 0xE4, /* Stream ID */ + 0xF0, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, /* Offset */ + 0x41, 0xC4, /* Data length */ + }, + 1 + 4 + 8 + 2, 0x200, - { .data_frame.df_offset = 0x0807060504030201UL, - .stream_id = 0x210, - .data_frame.df_size = 0x1C4, - .data_frame.df_fin = 0, + { .data_frame.df_offset = 0x301234567890ABCDull, + .stream_id = 0x12300E4, + .data_frame.df_size = 0x1C4, + .data_frame.df_fin = 0, }, 1, }, { "Data length is zero", __LINE__, - select_pf_by_ver(LSQVER_039), - /* 1 f d ooo ss 1fdoooss */ - /* TYPE FIN DLEN OLEN SLEN */ - { 0x80 | 0x40 | 0x00 | 0x1C | 0x3, - 0x00, 0x00, 0x02, 0x10, /* Stream ID */ - 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */ - 0xC4, 0x01, /* Data length: note this does not matter */ + select_pf_by_ver(LSQVER_ID22), + /* TYPE OFF DLEN FIN */ + { 0x10 | 1<<2 | 0<<1 | 0<<0, + 0x81, 0x23, 0x00, 0xE4, /* Stream ID */ + 0xF0, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, /* Offset */ }, - 1 + 0 + 8 + 4, + 1 + 4 + 8 + 0, 0x200, - { .data_frame.df_offset = 0x0807060504030201UL, - .stream_id = 0x210, - .data_frame.df_size = 0x200 - (1 + 8 + 4), - .data_frame.df_fin = 1, + { .data_frame.df_offset = 0x301234567890ABCDull, + .stream_id = 0x12300E4, + .data_frame.df_size = 0x200 - 1 - 4 - 8, + .data_frame.df_fin = 0, }, 1, }, - { "Stream ID length is 1", + { "Sanity check: what happens when data length is zero #1", __LINE__, - select_pf_by_ver(LSQVER_039), - /* 1 f d ooo ss 1fdoooss */ - /* TYPE FIN DLEN OLEN SLEN */ - { 0x80 | 0x40 | 0x20 | 0x1C | 0x0, - 0xF0, /* Stream ID */ - 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */ - 0x01, 0xC4, /* Data length */ - }, - 1 + 2 + 8 + 1, + select_pf_by_ver(LSQVER_ID22), + /* TYPE OFF DLEN FIN */ + { 0x10 | 1<<2 | 1<<1 | 0<<0, + 0x81, 0x23, 0x00, 0xE4, /* Stream ID */ + 0xF0, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, /* Offset */ + 0x40, 0x00, /* Data length */ + }, + 1 + 4 + 8 + 2, 0x200, - { .data_frame.df_offset = 0x0807060504030201UL, - .stream_id = 0xF0, - .data_frame.df_size = 0x1C4, - .data_frame.df_fin = 1, + { .data_frame.df_offset = 0x301234567890ABCDull, + .stream_id = 0x12300E4, + .data_frame.df_size = 0, + .data_frame.df_fin = 0, }, 1, }, - { "All bits are zero save offset length", + { "Sanity check: what happens when data length is zero #2", __LINE__, - select_pf_by_ver(LSQVER_039), - /* 1 f d ooo ss 1fdoooss */ - /* TYPE FIN DLEN OLEN SLEN */ - { 0x80 | 0x00 | 0x00 | 0x04 | 0x0, - 0xF0, /* Stream ID */ - 0x02, 0x55, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, /* Offset */ - 0xC4, 0x01, /* Data length */ - }, - 1 + 0 + 2 + 1, + select_pf_by_ver(LSQVER_ID22), + /* TYPE OFF DLEN FIN */ + { 0x10 | 1<<2 | 1<<1 | 0<<0, + 0x81, 0x23, 0x00, 0xE4, /* Stream ID */ + 0x00, /* Offset */ + 0x40, 0x00, /* Data length */ + }, + 1 + 4 + 1 + 2, 0x200, - { .data_frame.df_offset = 0x255, - .stream_id = 0xF0, - .data_frame.df_size = 0x200 - 4, - .data_frame.df_fin = 0, + { .data_frame.df_offset = 0, + .stream_id = 0x12300E4, + .data_frame.df_size = 0, + .data_frame.df_fin = 0, }, 1, }, - { "Sanity check: either FIN must be set or data length is not zero #1", + { "Sanity check: what happens when data length is zero #3", __LINE__, - select_pf_by_ver(LSQVER_039), - /* 1 f d ooo ss 1fdoooss */ - /* TYPE FIN DLEN OLEN SLEN */ - { 0x80 | 0x00 | 0x00 | 0x04 | 0x0, - 0xF0, /* Stream ID */ - 0x02, 0x55, /* Offset */ + select_pf_by_ver(LSQVER_ID22), + /* TYPE OFF DLEN FIN */ + { 0x10 | 0<<2 | 1<<1 | 0<<0, + 0x81, 0x23, 0x00, 0xE4, /* Stream ID */ + 0x40, 0x00, /* Data length */ }, - 1 + 0 + 2 + 1, - 4, /* Same as buffer size: in the absense of explicit data - * length in the header, this would mean that data - * length is zero. - */ - { .data_frame.df_offset = 0x255, - .stream_id = 0xF0, - .data_frame.df_size = 0x200 - 4, - .data_frame.df_fin = 0, - }, - 0, - }, - - { "Sanity check: either FIN must be set or data length is not zero #2", - __LINE__, - select_pf_by_ver(LSQVER_039), - /* 1 f d ooo ss 1fdoooss */ - /* TYPE FIN DLEN OLEN SLEN */ - { 0x80 | 0x00 | 0x20 | 0x04 | 0x0, - 0xF0, /* Stream ID */ - 0x02, 0x55, /* Offset */ - 0x00, 0x00, - }, - 1 + 2 + 2 + 1, - 200, - { .data_frame.df_offset = 0x255, - .stream_id = 0xF0, - .data_frame.df_size = 0x200 - 4, - .data_frame.df_fin = 0, + 1 + 4 + 0 + 2, + 0x200, + { .data_frame.df_offset = 0, + .stream_id = 0x12300E4, + .data_frame.df_size = 0, + .data_frame.df_fin = 0, }, - 0, + 1, }, - { "Sanity check: either FIN must be set or data length is not zero #3", + { "Sanity check: what happens when data length is zero #3", __LINE__, - select_pf_by_ver(LSQVER_039), - /* 1 f d ooo ss 1fdoooss */ - /* TYPE FIN DLEN OLEN SLEN */ - { 0x80 | 0x40 | 0x20 | 0x04 | 0x0, - 0xF0, /* Stream ID */ - 0x02, 0x55, /* Offset */ - 0x00, 0x00, - }, - 1 + 2 + 2 + 1, - 200, - { .data_frame.df_offset = 0x255, - .stream_id = 0xF0, - .data_frame.df_size = 0x0, - .data_frame.df_fin = 1, + select_pf_by_ver(LSQVER_ID22), + /* TYPE OFF DLEN FIN */ + { 0x10 | 1<<2 | 1<<1 | 1<<0, + 0x81, 0x23, 0x00, 0xE4, /* Stream ID */ + 0x12, /* Offset */ + 0x00, /* Data length */ + }, + 1 + 4 + 1 + 1, + 0x200, + { .data_frame.df_offset = 0x12, + .stream_id = 0x12300E4, + .data_frame.df_size = 0, + .data_frame.df_fin = 1, }, 1, }, { "Check data bounds #1", __LINE__, - select_pf_by_ver(LSQVER_039), - /* 1 f d ooo ss 1fdoooss */ - /* TYPE FIN DLEN OLEN SLEN */ - { 0x80 | 0x00 | 0x20 | 0x04 | 0x0, - 0xF0, /* Stream ID */ - 0x02, 0x55, /* Offset */ - 0x01, 0xFA, /* Data length */ - }, - 1 + 2 + 2 + 1, - 0x200, - { .data_frame.df_offset = 0x255, - .stream_id = 0xF0, - .data_frame.df_size = 0x1FA, - .data_frame.df_fin = 0, + select_pf_by_ver(LSQVER_ID22), + /* TYPE OFF DLEN FIN */ + { 0x10 | 1<<2 | 1<<1 | 1<<0, + 0x81, 0x23, 0x00, 0xE4, /* Stream ID */ + 0x12, /* Offset */ + 0x41, 0xF8, /* Data length */ + }, + 1 + 4 + 1 + 2, + 0x200, + { .data_frame.df_offset = 0x12, + .stream_id = 0x12300E4, + .data_frame.df_size = 0x200 - 1 - 4 - 1 - 2, + .data_frame.df_fin = 1, }, 1, }, { "Check data bounds #2", __LINE__, - select_pf_by_ver(LSQVER_039), - /* 1 f d ooo ss 1fdoooss */ - /* TYPE FIN DLEN OLEN SLEN */ - { 0x80 | 0x00 | 0x20 | 0x04 | 0x0, - 0xF0, /* Stream ID */ - 0x02, 0x55, /* Offset */ - 0x01, 0xFB, /* <--- One byte too many */ - }, - 1 + 2 + 2 + 1, - 0x200, - { .data_frame.df_offset = 0x255, - .stream_id = 0xF0, - .data_frame.df_size = 0x1FA, - .data_frame.df_fin = 0, + select_pf_by_ver(LSQVER_ID22), + /* TYPE OFF DLEN FIN */ + { 0x10 | 1<<2 | 1<<1 | 1<<0, + 0x81, 0x23, 0x00, 0xE4, /* Stream ID */ + 0x12, /* Offset */ + 0x41, 0xF9, /* Data length */ + }, + 1 + 4 + 1 + 2, + 0x200, + { .data_frame.df_offset = 0x12, + .stream_id = 0x12300E4, + .data_frame.df_size = 0x200 - 1 - 4 - 1 - 2, + .data_frame.df_fin = 1, }, 0, }, diff --git a/test/unittests/test_trapa.c b/test/unittests/test_trapa.c new file mode 100644 index 000000000..732bdb9c8 --- /dev/null +++ b/test/unittests/test_trapa.c @@ -0,0 +1,264 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +/* + * test_trapa.c -- Test transport parameters. + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include "lsquic.h" +#include "lsquic_types.h" +#include "lsquic_sizes.h" +#include "lsquic_logger.h" +#include "lsquic_trans_params.h" + +#define ENC_BUF_SZ 0x1000 + +struct trapa_test +{ + int line; + enum { + TEST_ENCODE = 1 << 0, + TEST_DECODE = 1 << 1, + } flags; + struct transport_params params; + size_t enc_len, dec_len; + int expect_decode_err; + unsigned char encoded[ENC_BUF_SZ]; +}; + +static const struct trapa_test tests[] = +{ + + { + .line = __LINE__, + .flags = TEST_ENCODE | TEST_DECODE, + .params = { + TP_DEFAULT_VALUES, + }, + .enc_len = 2, + .encoded = + /* Overall length */ "\x00\x00" + /* Trailer to make the end easily visible in gdb: */ + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" + }, + + { + .line = __LINE__, + .flags = TEST_ENCODE | TEST_DECODE, + .params = { + .tp_flags = 0, + .tp_init_max_stream_data_bidi_local = 0x12348877, + .tp_init_max_data = 0xAABB, + .tp_idle_timeout = 10 * 1000, + .tp_max_ack_delay = TP_DEF_MAX_ACK_DELAY, + .tp_active_connection_id_limit = 7, + }, + .enc_len = 39, + .encoded = + /* Overall length */ "\x00\x25" + /* Idle timeout */ "\x00\x01\x00\x02\x67\x10" + /* Packet size */ "\x00\x03\x00\x01\x00" + /* Max data */ "\x00\x04\x00\x04\x80\x00\xAA\xBB" + /* Bidi local */ "\x00\x05\x00\x04\x92\x34\x88\x77" + /* Ack delay exp */ "\x00\x0A\x00\x01\x00" + /* Active CID limit */ "\x00\x0E\x00\x01\x07" + /* Trailer to make the end easily visible in gdb: */ + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" + }, + + { + .line = __LINE__, + .flags = TEST_DECODE, + .dec_len = 1, + .expect_decode_err = 1, + }, + + { + .line = __LINE__, + .flags = TEST_DECODE, + .dec_len = 3, + .expect_decode_err = 1, + .encoded = "\x00\x04", + }, + + + { + .line = __LINE__, + .flags = TEST_ENCODE | TEST_DECODE, + .params = { + TP_DEFAULT_VALUES, + .tp_flags = TRAPA_SERVER, + .tp_init_max_data = 0x123456, + .tp_init_max_stream_data_bidi_local = 0xABCDEF88, + .tp_disable_migration = 1, + .tp_max_packet_size = 0x333, + }, + .enc_len = 32, + .encoded = + /* Overall length */ "\x00\x1E" + /* Packet size */ "\x00\x03\x00\x02\x43\x33" + /* Max data */ "\x00\x04\x00\x04\x80\x12\x34\x56" + /* Bidi local */ "\x00\x05\x00\x08\xC0\x00\x00\x00\xAB\xCD\xEF\x88" + /* Migration */ "\x00\x0C\x00\x00" + /* Trailer to make the end easily visible in gdb: */ + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" + }, + + /* Test server preferred address. */ + { + .line = __LINE__, + .flags = TEST_DECODE, + .params = { + TP_DEFAULT_VALUES, + .tp_flags = TRAPA_SERVER | TRAPA_PREFADDR_IPv4 | TRAPA_PREFADDR_IPv6, + .tp_max_ack_delay = 25, + .tp_max_packet_size = 0x333, + .tp_preferred_address = { + .ipv4_addr = "\x01\x02\x03\x04", + .ipv4_port = 0x1234, + .ipv6_addr = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", + .ipv6_port = 0x9001, + .cid = { .len = 11, .idbuf = "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A", }, + .srst = "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3B\x3C\x3D\x3E\x3F", + }, + }, + .enc_len = 0x3E + 2, + .encoded = + /* Overall length */ "\x00\x3E" + /* Preferred Address */"\x00\x0D" + "\x00\x34" + "\x01\x02\x03\x04" + "\x12\x34" + "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" + "\x90\x01" + "\x0B" /* CID len */ + "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A" + "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3B\x3C\x3D\x3E\x3F" + /* Packet size */ "\x00\x03\x00\x02\x43\x33" + /* Trailer to make the end easily visible in gdb: */ + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" + }, + +}; + + +static int +params_are_equal (const struct transport_params *a, + const struct transport_params *b) +{ +#define MCMP(f) 0 == memcmp(&a->f, &b->f, sizeof(a->f)) + return a->tp_flags == b->tp_flags + && MCMP(tp_numerics_u) + && a->tp_disable_migration == b->tp_disable_migration + && MCMP(tp_stateless_reset_token) + && MCMP(tp_preferred_address.ipv4_addr) + && MCMP(tp_preferred_address.ipv6_addr) + && MCMP(tp_preferred_address.srst) + && MCMP(tp_preferred_address.cid.idbuf) + && a->tp_preferred_address.ipv4_port == b->tp_preferred_address.ipv4_port + && a->tp_preferred_address.ipv6_port == b->tp_preferred_address.ipv6_port + && a->tp_preferred_address.cid.len == b->tp_preferred_address.cid.len + && MCMP(tp_original_cid.idbuf) + && a->tp_original_cid.len == b->tp_original_cid.len + ; +#undef MCMP +} + + +static void +run_test (const struct trapa_test *test) +{ + struct transport_params decoded_params; + size_t dec_len; + int s; + unsigned char buf[ENC_BUF_SZ]; + + if (test->flags & TEST_ENCODE) + { + s = lsquic_tp_encode(&test->params, buf, sizeof(buf)); + assert(s > 0); + assert((size_t) s == test->enc_len); + assert(0 == memcmp(test->encoded, buf, s)); + } + + if (test->flags & TEST_DECODE) + { + if (test->dec_len) + dec_len = test->dec_len; + else + dec_len = sizeof(buf); + s = lsquic_tp_decode(test->encoded, dec_len, + test->params.tp_flags & TRAPA_SERVER, &decoded_params); + if (!test->expect_decode_err) + { + assert(s > 0); + assert((size_t) s == test->enc_len); + s = params_are_equal(&test->params, &decoded_params); + assert(s); + } + else + assert(s < 0); + } +} + + +static void +decode_file (const char *name) +{ + FILE *file; + size_t nread; + int s; + struct transport_params params; + unsigned char buf[0x1000]; + + file = fopen(name, "rb"); + if (!file) + { + perror("fopen"); + exit(1); + } + + nread = fread(buf, 1, sizeof(buf), file); + + s = lsquic_tp_decode(buf, nread, 0, ¶ms); + + fclose(file); + + printf("decoded params from %s: %d (%s)\n", name, s, s > 0 ? "OK" : "FAIL"); +} + + +int +main (int argc, char **argv) +{ + unsigned i; + int opt; + + while (-1 != (opt = getopt(argc, argv, "d:l:"))) + { + switch (opt) + { + case 'd': + decode_file(optarg); + return 0; + case 'l': + lsquic_log_to_fstream(stderr, 0); + lsquic_logger_lopt(optarg); + break; + default: + exit(1); + } + } + + for (i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i) + run_test(&tests[i]); + + return 0; +} diff --git a/test/unittests/test_varint.c b/test/unittests/test_varint.c new file mode 100644 index 000000000..b08e656ec --- /dev/null +++ b/test/unittests/test_varint.c @@ -0,0 +1,120 @@ +/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ +#include +#include +#include + +#include "lsquic_varint.h" + +#define MAX_INPUT_SZ 8 + +struct test_read_varint +{ + /* Input: */ + unsigned char input[MAX_INPUT_SZ]; + size_t in_sz; + /* Output: */ + int rv; + uint64_t val; +}; + +static const struct test_read_varint read_tests[] = +{ + { + .input = "\x25", + .in_sz = 0, + .rv = -1, + }, + { + .input = "\x25", + .in_sz = 2, + .rv = 1, + .val = 0x25, + }, + { + .input = "\x40\x25", + .in_sz = 1, + .rv = -1, + }, + { + .input = "\x40\x25", + .in_sz = 2, + .rv = 2, + .val = 0x25, + }, + { + .input = "\x9d\x7f\x3e\x7d", + .in_sz = 2, + .rv = -1, + }, + { + .input = "\x9d\x7f\x3e\x7d", + .in_sz = 4, + .rv = 4, + .val = 494878333, + }, + { + .input = "\xc2\x19\x7c\x5e\xff\x14\xe8\x8c", + .in_sz = 7, + .rv = -1, + }, + { + .input = "\xc2\x19\x7c\x5e\xff\x14\xe8\x8c", + .in_sz = 8, + .rv = 8, + .val = 151288809941952652ull, + }, +}; + + +int +main (void) +{ + const struct test_read_varint *test; + const struct test_read_varint *const end + = read_tests + sizeof(read_tests) / sizeof(read_tests[0]); + size_t input_sz, avail; + struct varint_read_state state; + const unsigned char *p, *endp; + int s; + + for (test = read_tests; test < end; ++test) + { + uint64_t val; + const int rv = vint_read(test->input, test->input + test->in_sz, &val); + assert(rv == test->rv); + if (test->rv > 0) + assert(val == test->val); + + /* Test non-blocking read */ + for (input_sz = MAX_INPUT_SZ; input_sz > 0; --input_sz) + { + state.pos = 0; + p = test->input; + endp = p + test->in_sz; + while (p < endp) + { + avail = (uintptr_t) (endp - p); + if (avail > input_sz) + avail = input_sz; + s = lsquic_varint_read_nb(&p, p + avail, &state); + if (0 == s) + { + assert(state.val == test->val); + assert(p <= endp); + break; + } + else if (p == endp) + { + assert(test->rv == -1); + break; + } + else + { + assert(p < endp); + } + } + } + } + + return 0; +} diff --git a/test/unittests/test_ver_nego.c b/test/unittests/test_ver_nego.c index 0bb32d86b..d98f033c2 100644 --- a/test/unittests/test_ver_nego.c +++ b/test/unittests/test_ver_nego.c @@ -10,7 +10,6 @@ #include "lsquic.h" #include "lsquic_types.h" -#include "lsquic_alarmset.h" #include "lsquic_packet_common.h" #include "lsquic_parse.h" #include "lsquic_parse_common.h" @@ -26,7 +25,9 @@ struct gen_ver_nego_test { int gvnt_lineno; /* Generate: inputs; parse: outputs */ - lsquic_cid_t gvnt_cid; + enum lsquic_version + gvnt_gen_ver; + uint64_t gvnt_cid; unsigned gvnt_versions; size_t gvnt_bufsz; /* Generate: outputs; parse: inputs */ @@ -39,60 +40,49 @@ static const struct gen_ver_nego_test tests[] = { { .gvnt_lineno = __LINE__, .gvnt_cid = 0x0102030405060708UL, - .gvnt_versions = (1 << LSQVER_035), + .gvnt_versions = (1 << LSQVER_039), + .gvnt_gen_ver = LSQVER_039, .gvnt_bufsz = 13, .gvnt_len = 13, .gvnt_buf = { PACKET_PUBLIC_FLAGS_VERSION| PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Connection ID */ - 'Q', '0', '3', '5', + 'Q', '0', '3', '9', }, }, { .gvnt_lineno = __LINE__, .gvnt_cid = 0x0102030405060708UL, - .gvnt_versions = (1 << LSQVER_035), + .gvnt_versions = (1 << LSQVER_039), + .gvnt_gen_ver = LSQVER_039, .gvnt_bufsz = 12, .gvnt_len = -1, /* Buffer size is too small */ }, { .gvnt_lineno = __LINE__, .gvnt_cid = 0x0102030405060708UL, - .gvnt_versions = (1 << LSQVER_035) | (1 << N_LSQVER), + .gvnt_versions = (1 << LSQVER_039) | (1 << N_LSQVER), + .gvnt_gen_ver = LSQVER_039, .gvnt_bufsz = 20, .gvnt_len = -1, /* Invalid version specified in the bitmask */ }, { .gvnt_lineno = __LINE__, .gvnt_cid = 0x0102030405060708UL, - .gvnt_versions = (1 << LSQVER_035) | (1 << LSQVER_039) | (1 << LSQVER_043), - .gvnt_bufsz = 21, - .gvnt_len = 21, + .gvnt_versions = (1 << LSQVER_039) | (1 << LSQVER_043), + .gvnt_gen_ver = LSQVER_039, + .gvnt_bufsz = 17, + .gvnt_len = 17, .gvnt_buf = { PACKET_PUBLIC_FLAGS_VERSION| PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Connection ID */ - 'Q', '0', '3', '5', 'Q', '0', '3', '9', 'Q', '0', '4', '3', }, }, - { .gvnt_lineno = __LINE__, - .gvnt_cid = 0x0102030405060708UL, - .gvnt_versions = (1 << LSQVER_044), - .gvnt_bufsz = 18, - .gvnt_len = 18, - .gvnt_buf = { - 0x80, - 0x00, 0x00, 0x00, 0x00, /* Version negotiation indicator */ - 0x05, /* SCIL */ - 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Connection ID */ - 'Q', '0', '4', '4', - }, - }, - }; @@ -110,10 +100,10 @@ test_parsing_ver_nego (const struct gen_ver_nego_test *gvnt) lsquic_mm_init(&mm); packet_in = lsquic_mm_get_packet_in(&mm); - packet_in->pi_data = lsquic_mm_get_1370(&mm); + packet_in->pi_data = lsquic_mm_get_packet_in_buf(&mm, 1370); packet_in->pi_flags |= PI_OWN_DATA; memcpy(packet_in->pi_data, gvnt->gvnt_buf, gvnt->gvnt_len); - s = lsquic_parse_packet_in_begin(packet_in, gvnt->gvnt_len, 0, &ppstate); + s = lsquic_parse_packet_in_begin(packet_in, gvnt->gvnt_len, 0, GQUIC_CID_LEN, &ppstate); assert(s == 0); for (s = packet_in_ver_first(packet_in, &vi, &ver_tag); s; @@ -132,12 +122,53 @@ test_parsing_ver_nego (const struct gen_ver_nego_test *gvnt) } +static void +run_gvnt (int i) +{ + const struct gen_ver_nego_test *const gvnt = &tests[i]; + lsquic_cid_t scid, dcid; + int len; + + memset(&dcid, 0, sizeof(dcid)); + dcid.len = sizeof(gvnt->gvnt_cid); + memcpy(dcid.idbuf, &gvnt->gvnt_cid, sizeof(gvnt->gvnt_cid)); + + unsigned char out[0x40]; + assert(sizeof(out) <= sizeof(gvnt->gvnt_buf)); /* Internal sanity check */ + + if ((1 << gvnt->gvnt_gen_ver) & LSQUIC_GQUIC_HEADER_VERSIONS) + len = lsquic_gquic_gen_ver_nego_pkt(out, gvnt->gvnt_bufsz, &dcid, + gvnt->gvnt_versions); + else + { + /* XXX this is never executed, as there is no test case for this */ + scid = (lsquic_cid_t) { .len = 0, }; + len = lsquic_Q046_gen_ver_nego_pkt(out, gvnt->gvnt_bufsz, &dcid, + &scid, gvnt->gvnt_versions); + } + assert(("Packet length is correct", len == gvnt->gvnt_len)); + + if (gvnt->gvnt_len > 0) + { + if ((1 << gvnt->gvnt_gen_ver) & LSQUIC_GQUIC_HEADER_VERSIONS) + assert(("Packet contents are correct", + 0 == memcmp(out, gvnt->gvnt_buf, gvnt->gvnt_len))); + else + { + assert(("Packet contents are correct", + 0 == memcmp(out + 1, gvnt->gvnt_buf + 1, gvnt->gvnt_len - 1))); + assert(out[0] & 0x80); /* Other 7 bits are random */ + } + test_parsing_ver_nego(gvnt); + } +} + + int main (void) { unsigned i; for (i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i) - if (tests[i].gvnt_len > 0) - test_parsing_ver_nego(&tests[i]); + run_gvnt(i); return 0; } diff --git a/test/unittests/test_wuf_gquic_be.c b/test/unittests/test_wuf_gquic_be.c index 4928af232..2646e499d 100644 --- a/test/unittests/test_wuf_gquic_be.c +++ b/test/unittests/test_wuf_gquic_be.c @@ -9,7 +9,6 @@ #include "lsquic.h" #include "lsquic_types.h" -#include "lsquic_alarmset.h" #include "lsquic_parse.h" static const struct parse_funcs *const pf = select_pf_by_ver(LSQVER_039); @@ -19,14 +18,14 @@ static const struct parse_funcs *const pf = select_pf_by_ver(LSQVER_039); struct wuf_test { unsigned char buf[0x10]; size_t buf_len; - uint32_t stream_id; + lsquic_stream_id_t stream_id; uint64_t offset; }; static const struct wuf_test wuf_tests[] = { { .buf = { 0x04, 0x00, 0x67, 0x45, 0x34, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, }, - .buf_len = QUIC_WUF_SZ, + .buf_len = GQUIC_WUF_SZ, .stream_id = 0x674534, .offset = 0x0102030405, }, @@ -41,10 +40,10 @@ run_parse_tests (void) const struct wuf_test *test; for (test = wuf_tests; test->buf[0]; ++test) { - uint32_t stream_id = ~0; + lsquic_stream_id_t stream_id = ~0; uint64_t offset = ~0; int sz = pf->pf_parse_window_update_frame(test->buf, test->buf_len, &stream_id, &offset); - assert(sz == QUIC_WUF_SZ); + assert(sz == GQUIC_WUF_SZ); assert(stream_id == test->stream_id); assert(offset == test->offset); } @@ -59,7 +58,7 @@ run_gen_tests (void) { unsigned char buf[0x100]; int sz = pf->pf_gen_window_update_frame(buf, test->buf_len, test->stream_id, test->offset); - assert(sz == QUIC_WUF_SZ); + assert(sz == GQUIC_WUF_SZ); assert(0 == memcmp(buf, test->buf, sz)); } }