diff --git a/deps/ngtcp2/nghttp3/lib/includes/nghttp3/nghttp3.h b/deps/ngtcp2/nghttp3/lib/includes/nghttp3/nghttp3.h index db001e15369119..b08ab60061e1b8 100644 --- a/deps/ngtcp2/nghttp3/lib/includes/nghttp3/nghttp3.h +++ b/deps/ngtcp2/nghttp3/lib/includes/nghttp3/nghttp3.h @@ -335,6 +335,27 @@ typedef uint64_t nghttp3_duration; * that might generating excessive load. */ #define NGHTTP3_ERR_H3_EXCESSIVE_LOAD -610 +/** + * @macro + * + * :macro:`NGHTTP3_ERR_H3_MESSAGE_ERROR` indicates that HTTP message + * was malformed. + */ +#define NGHTTP3_ERR_H3_MESSAGE_ERROR -611 +/** + * @macro + * + * :macro:`NGHTTP3_ERR_WT_SESSION_GONE` indicates that WebTransport + * session was terminated or rejected. + */ +#define NGHTTP3_ERR_WT_SESSION_GONE -612 +/** + * @macro + * + * :macro:`NGHTTP3_ERR_WT_BUFFERED_STREAM_REJECTED` indicates that + * buffering WebTransport data stream was rejected. + */ +#define NGHTTP3_ERR_WT_BUFFERED_STREAM_REJECTED -613 /** * @macro * @@ -503,6 +524,38 @@ typedef uint64_t nghttp3_duration; * error code ``QPACK_DECODER_STREAM_ERROR``. */ #define NGHTTP3_QPACK_DECODER_STREAM_ERROR 0x0202 +/** + * @macro + * + * :macro:`NGHTTP3_WT_BUFFERED_STREAM_REJECTED` is WebTransport error + * code ``WT_BUFFERED_STREAM_REJECTED``. + */ +#define NGHTTP3_WT_BUFFERED_STREAM_REJECTED 0x3994BD84 +/** + * @macro + * + * :macro:`NGHTTP3_WT_SESSION_GONE` is WebTransport error code + * ``WT_SESSION_GONE``. + */ +#define NGHTTP3_WT_SESSION_GONE 0x170D7B68 +/** + * @macro + * + * :macro:`NGHTTP3_WT_ALPN_ERROR` is WebTransport error code + * ``WT_ALPN_ERROR``. + * + * https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-http3-15 + */ +#define NGHTTP3_WT_ALPN_ERROR 0x0817B3DD +/** + * @macro + * + * :macro:`NGHTTP3_WT_REQUIREMENTS_NOT_MET` is WebTransport error code + * ``WT_REQUIREMENTS_NOT_MET``. + * + * https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-http3-15 + */ +#define NGHTTP3_WT_REQUIREMENTS_NOT_MET 0x212C0D48 /** * @functypedef @@ -1899,6 +1952,16 @@ typedef struct nghttp3_settings { * .. version-added:: 1.13.0 */ nghttp3_qpack_indexing_strat qpack_indexing_strat; + /** + * :member:`wt_enabled`, if set to nonzero, enables WebTransport. + * + * https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-http3-15 + * + * TODO For client, it might be better to always enable + * WebTransport. Only draft version of client needs to send + * SETTINGS_WT_ENABLED. + */ + uint8_t wt_enabled; } nghttp3_settings; #define NGHTTP3_PROTO_SETTINGS_V1 1 @@ -1939,6 +2002,12 @@ typedef struct nghttp3_proto_settings { * Datagrams (see :rfc:`9297`). */ uint8_t h3_datagram; + /** + * :member:`wt_enabled`, if set to nonzero, enables WebTransport. + * + * https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-http3-15 + */ + uint8_t wt_enabled; } nghttp3_proto_settings; /** @@ -2240,6 +2309,69 @@ typedef int (*nghttp3_recv_settings2)(nghttp3_conn *conn, const nghttp3_proto_settings *settings, void *conn_user_data); +/** + * @functypedef + * + * :type:`nghttp3_recv_wt_data` is a callback function which is + * invoked when data is received on WebTransport data stream. + * |session_id| is the WebTransport session ID. |stream_id| is the + * stream ID of the WebTransport data stream. |data| points to the + * received data, and its length is |datalen|. + * + * The application is responsible for increasing flow control credit + * (say, increasing by |datalen| bytes). + * + * The implementation of this callback must return 0 if it succeeds. + * Returning :macro:`NGHTTP3_ERR_CALLBACK_FAILURE` will return to the + * caller immediately. Any values other than 0 is treated as + * :macro:`NGHTTP3_ERR_CALLBACK_FAILURE`. + */ +typedef int (*nghttp3_recv_wt_data)(nghttp3_conn *conn, int64_t session_id, + int64_t stream_id, const uint8_t *data, + size_t datalen, void *conn_user_data, + void *stream_user_data); + +/** + * @functypedef + * + * :type:`nghttp3_wt_data_stream_open` is a callback function which is + * invoked when a remote stream denoted by |stream_id| is identified + * as WebTransport data stream that belongs to WebTransport session + * identified by |session_id|. This callback function is called after + * WebTransport session is confirmed. + * + * The implementation of this callback must return 0 if it succeeds. + * Returning :macro:`NGHTTP3_ERR_CALLBACK_FAILURE` will return to the + * caller immediately. Any values other than 0 is treated as + * :macro:`NGHTTP3_ERR_CALLBACK_FAILURE`. + */ +typedef int (*nghttp3_wt_data_stream_open)(nghttp3_conn *conn, + int64_t session_id, + int64_t stream_id, + void *conn_user_data, + void *stream_user_data); + +/** + * @functypedef + * + * :type:`nghttp3_recv_wt_close_session` is a callback function which + * is invoked when WT_CLOSE_SESSION Capsule is received. The + * WebTransport session is identified by |session_id|. + * |wt_error_code| is Application Error Code. The buffer pointed by + * |msg| of length |msglen| contains Application Error Message. + * + * The implementation of this callback must return 0 if it succeeds. + * Returning :macro:`NGHTTP3_ERR_CALLBACK_FAILURE` will return to the + * caller immediately. Any values other than 0 is treated as + * :macro:`NGHTTP3_ERR_CALLBACK_FAILURE`. + */ +typedef int (*nghttp3_recv_wt_close_session)(nghttp3_conn *conn, + int64_t session_id, + uint32_t wt_error_code, + const uint8_t *msg, size_t msglen, + void *conn_user_data, + void *stream_user_data); + #define NGHTTP3_CALLBACKS_V1 1 #define NGHTTP3_CALLBACKS_V2 2 #define NGHTTP3_CALLBACKS_V3 3 @@ -2375,6 +2507,22 @@ typedef struct nghttp3_callbacks { * .. version-added:: 1.14.0 */ nghttp3_recv_settings2 recv_settings2; + /** + * :member:`recv_wt_data` is a callback function which is invoked + * when data on WebTransport data stream is received. + */ + nghttp3_recv_wt_data recv_wt_data; + /** + * :member:`wt_data_stream_open` is a callback function which is + * invoked when a remote stream is identified as WebTransport data + * stream. + */ + nghttp3_wt_data_stream_open wt_data_stream_open; + /** + * :member:`recv_wt_close_session` is a callback function which is + * invoked when WT_CLOSE_SESSION Capsule is received. + */ + nghttp3_recv_wt_close_session recv_wt_close_session; } nghttp3_callbacks; /** @@ -2625,6 +2773,25 @@ NGHTTP3_EXTERN nghttp3_ssize nghttp3_conn_writev_stream(nghttp3_conn *conn, NGHTTP3_EXTERN int nghttp3_conn_add_write_offset(nghttp3_conn *conn, int64_t stream_id, size_t n); +/** + * @function + * + * `nghttp3_conn_is_stream_flushed` returns nonzero if all stream data + * for a stream identified by |stream_id| so far have been accepted by + * QUIC stack. This means that the cumulative number of bytes that + * `nghttp3_conn_add_write_offset` notified covers all stream data + * currently held. This does not mean more stream data cannot be + * submitted to this stream via :type:`nghttp3_read_data_callback` and + * all stream data have been acknowledged. + * + * If there is no stream identified by |stream_id|, this function + * returns nonzero. + * + * .. version-added:: 1.17.0 + */ +NGHTTP3_EXTERN int nghttp3_conn_is_stream_flushed(const nghttp3_conn *conn, + int64_t stream_id); + /** * @function * @@ -3334,6 +3501,165 @@ NGHTTP3_EXTERN int nghttp3_conn_is_drained(nghttp3_conn *conn); */ NGHTTP3_EXTERN int nghttp3_conn_is_drained2(const nghttp3_conn *conn); +/** + * @function + * + * `nghttp3_conn_submit_wt_request` works like + * `nghttp3_conn_submit_request`, but it is specifically tailored for + * WebTransport session establishment. |nva| of length |nvlen| + * specifies HTTP request header fields. They must contain at least + * the following fields: + * + * - :method = "CONNECT" + * - :scheme = "https" + * - :protocol = "webtransport" + * - :authority + * - :path + * + * The application must also set the following settings: + * + * - :member:`nghttp3_settings.h3_datagram` = 1 + * - :member:`nghttp3_settings.wt_enabled` = 1 + * + * It also must send the following QUIC transport parameters: + * + * - max_datagram_frame_size > 0 + * - reset_stream_at + * + * The application should wait for SETTINGS frame from server and make + * sure that it satisfies server-side requirements for WebTransport. + * + * After receiving 2xx response from server, WebTransport session is + * established. `nghttp3_conn_open_wt_data_stream` is used to open + * WebTransport data streams. + * + * This function returns 0 if it succeeds, or one of the following + * negative error codes: + * + * TBD + */ +NGHTTP3_EXTERN int nghttp3_conn_submit_wt_request(nghttp3_conn *conn, + int64_t stream_id, + const nghttp3_nv *nva, + size_t nvlen, + void *stream_user_data); + +/** + * @function + * + * `nghttp3_conn_submit_wt_response` works like + * `nghttp3_conn_submit_response`, but it is specifically tailored for + * WebTransport session establishment. |nva| of length |nvlen| + * specifies HTTP response header fields. It must contain 2xx status + * code in :status field. + * + * The application should make sure that the stream denoted by + * |stream_id| is a request stream that requests WebTransport session + * establishment. If this function is called inside + * :member:`nghttp3_callbacks.end_headers` callback, + * `nghttp3_conn_server_confirm_wt_session` is called internally, and + * it establishes WebTransport session. If this function is called + * outside of the callback, the application must call + * `nghttp3_conn_server_confirm_wt_session` after calling this + * function. + * + * If `nghttp3_conn_submit_response` is used against the WebTransport + * upgrade request, it means refusal of the request regardless of HTTP + * status code. The application is responsible to set non-2xx status + * code when `nghttp3_conn_submit_response` is used. If + * `nghttp3_conn_submit_response` is called from + * :member:`nghttp3_callbacks.end_headers` callback, + * :member:`nghttp3_callbacks.stop_sending` callback is automatically + * called. If `nghttp3_conn_submit_response` is called outside of the + * :member:`nghttp3_callbacks.end_headers` callback, + * :member:`nghttp3_callbacks.stop_sending` is not called + * automatically. The application should tell QUIC stack to send + * STOP_SENDING frame to this stream. + * + * This function returns 0 if it succeeds, or one of the following + * negative error codes: + * + * TBD + */ +NGHTTP3_EXTERN int nghttp3_conn_submit_wt_response(nghttp3_conn *conn, + int64_t stream_id, + const nghttp3_nv *nva, + size_t nvlen); + +/** + * @function + * + * `nghttp3_conn_server_confirm_wt_session` establishes WebTransport + * session. This should be called after + * `nghttp3_conn_submit_wt_response` call if it is not called inside + * `nghttp3_callbacks.end_headers` callback. + * + * Only server can call this function. + * + * This function returns 0 if it succeeds, or one of the following + * negative error codes: + * + * TBD + */ +NGHTTP3_EXTERN int nghttp3_conn_server_confirm_wt_session(nghttp3_conn *conn, + int64_t session_id, + nghttp3_tstamp ts); + +/** + * @function + * + * `nghttp3_conn_open_wt_data_stream` opens WebTransport data stream. + * |session_id| is the stream ID that established WebTransport + * session. |stream_id| is the stream ID to write data, and it can be + * both bidirectional and unidirectional. |dr| must not be NULL, and + * it must have non-NULL callback. + * + * This function can be also used to start writing to the + * bidirectional stream initiated by the remote endpoint. + * + * This function returns 0 if it succeeds, or one of the following + * negative error codes: + * + * TBD + */ +NGHTTP3_EXTERN int nghttp3_conn_open_wt_data_stream( + nghttp3_conn *conn, int64_t session_id, int64_t stream_id, + const nghttp3_data_reader *dr, void *stream_user_data); + +/** + * @function + * + * `nghttp3_conn_close_wt_session` closes WebTransport session denoted + * by |session_id| which is the stream ID that established + * WebTransport session. |wt_error_code| is WebTransport error code. + * Upon calling this function, all existing WebTransport data streams + * are shutdown. |msg| of |msglen| bytes is the application error + * message, which is optional. |msglen| must be less than or equal to + * 1024. + * + * This function returns 0 if it succeeds, or one of the following + * negative error codes: + * + * TBD + */ +NGHTTP3_EXTERN int nghttp3_conn_close_wt_session(nghttp3_conn *conn, + int64_t session_id, + uint32_t wt_error_code, + const uint8_t *msg, + size_t msglen); + +/** + * @function + * + * `nghttp3_conn_get_stream_wt_session_id` returns the WebTransport + * session ID of a stream denoted by |stream_id| if it is WebTransport + * data stream. If the stream is not found, it is not a WebTransport + * data stream, or it is unable to get session ID, this function + * returns -1. + */ +NGHTTP3_EXTERN int64_t nghttp3_conn_get_stream_wt_session_id( + const nghttp3_conn *conn, int64_t stream_id); + /** * @function * @@ -3418,6 +3744,65 @@ NGHTTP3_EXTERN const nghttp3_info *nghttp3_version(int least_version); */ NGHTTP3_EXTERN int nghttp3_err_is_fatal(int liberr); +/** + * @function + * + * `nghttp3_get_uvarint` reads variable-length unsigned integer from + * the buffer pointed by |p|, and stores it in the object pointed by + * |dest| in host byte order. It returns |p| plus the number of bytes + * read from |p|. This function assumes that |p| points to the buffer + * that contains a valid variable-length unsigned integer. Use + * `nghttp3_get_uvarintlen` to get the number of bytes to successfully + * decode an integer. + */ +NGHTTP3_EXTERN const uint8_t *nghttp3_get_uvarint(uint64_t *dest, + const uint8_t *p); + +/** + * @function + * + * `nghttp3_get_uvarintlen` returns the required number of bytes to + * read variable-length unsigned integer starting at |p|. |p| must + * not be NULL. This function only reads the single byte from the + * buffer pointed by |p|, and determines the number of bytes to read. + */ +NGHTTP3_EXTERN size_t nghttp3_get_uvarintlen(const uint8_t *p); + +/** + * @function + * + * `nghttp3_get_varint` reads variable-length unsigned integer from + * the buffer pointed by |p|, and stores it in the object pointed by + * |dest| in host byte order. It returns |p| plus the number of bytes + * read from |p|. This function assumes that |p| points to the buffer + * that contains a valid variable-length unsigned integer. Use + * `nghttp3_get_uvarintlen` to get the number of bytes to successfully + * decode an integer. + */ +NGHTTP3_EXTERN const uint8_t *nghttp3_get_varint(int64_t *dest, + const uint8_t *p); + +/** + * @function + * + * `nghttp3_put_uvarint` writes |n| to the buffer pointed by |p| using + * variable-length unsigned integer encoding. It returns the one + * beyond of the last written position. This function assumes that + * the buffer pointed by |p| has sufficient capacity to encode |n|. + * To know the required capacity, use `nghttp3_put_uvarintlen`. |n| + * must be less than or equal to (1 << 62) - 1. + */ +NGHTTP3_EXTERN uint8_t *nghttp3_put_uvarint(uint8_t *p, uint64_t n); + +/** + * @function + * + * `nghttp3_put_uvarintlen` returns the required number of bytes to + * encode |n| in variable-length unsigned integer encoding. |n| must + * be less than or equal to (1 << 62) - 1. + */ +NGHTTP3_EXTERN size_t nghttp3_put_uvarintlen(uint64_t n); + /* * Versioned function wrappers */ diff --git a/deps/ngtcp2/nghttp3/lib/includes/nghttp3/version.h b/deps/ngtcp2/nghttp3/lib/includes/nghttp3/version.h index a0b397f05a8275..f846051ac9966f 100644 --- a/deps/ngtcp2/nghttp3/lib/includes/nghttp3/version.h +++ b/deps/ngtcp2/nghttp3/lib/includes/nghttp3/version.h @@ -31,7 +31,7 @@ * * Version number of the nghttp3 library release. */ -#define NGHTTP3_VERSION "1.16.0" +#define NGHTTP3_VERSION "1.17.0-DEV" /** * @macro @@ -41,6 +41,6 @@ * number, 8 bits for minor and 8 bits for patch. Version 1.2.3 * becomes 0x010203. */ -#define NGHTTP3_VERSION_NUM 0x011000 +#define NGHTTP3_VERSION_NUM 0x011100 #endif /* !defined(NGHTTP3_VERSION_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_conn.c b/deps/ngtcp2/nghttp3/lib/nghttp3_conn.c index 05f6973bcafb26..dc68ce2fb0db21 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_conn.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_conn.c @@ -36,9 +36,22 @@ #include "nghttp3_unreachable.h" #include "nghttp3_settings.h" #include "nghttp3_callbacks.h" +#include "nghttp3_wt.h" nghttp3_objalloc_def(chunk, nghttp3_chunk, oplent) +/* + * conn_remote_stream returns nonzero if |stream_id| is a remote + * stream ID. + */ +static int conn_remote_stream(const nghttp3_conn *conn, int64_t stream_id) { + if (conn->server) { + return !(stream_id & 0x1); + } + + return stream_id & 0x1; +} + /* * conn_remote_stream_uni returns nonzero if |stream_id| is remote * unidirectional stream ID. @@ -50,6 +63,30 @@ static int conn_remote_stream_uni(const nghttp3_conn *conn, int64_t stream_id) { return (stream_id & 0x03) == 0x03; } +static int conn_wt_enabled(const nghttp3_conn *conn) { + const nghttp3_settings *local_settings = &conn->local.settings; + const nghttp3_proto_settings *remote_settings = &conn->remote.settings; + + if (!local_settings->wt_enabled || !local_settings->h3_datagram) { + return 0; + } + + if (conn->server) { + return (!(conn->flags & NGHTTP3_CONN_FLAG_SETTINGS_RECVED) || + /* TODO client sends SETTINGS_WT_ENABLED for draft + versions only. But some client implementations do not + send it. For interop purpose, do not require this + remote setting for now. */ + (/* remote_settings->wt_enabled && */ remote_settings + ->h3_datagram)) && + local_settings->enable_connect_protocol; + } + + return remote_settings->wt_enabled && + remote_settings->enable_connect_protocol && + remote_settings->h3_datagram; +} + static int conn_call_begin_headers(nghttp3_conn *conn, nghttp3_stream *stream) { int rv; @@ -251,6 +288,70 @@ static int conn_call_end_origin(nghttp3_conn *conn) { return 0; } +static int conn_call_recv_data(nghttp3_conn *conn, const nghttp3_stream *stream, + const uint8_t *data, size_t datalen) { + int rv; + + if (!conn->callbacks.recv_data) { + return 0; + } + + rv = conn->callbacks.recv_data(conn, stream->node.id, data, datalen, + conn->user_data, stream->user_data); + if (rv != 0) { + return NGHTTP3_ERR_CALLBACK_FAILURE; + } + + return 0; +} + +static int conn_call_recv_wt_data(nghttp3_conn *conn, + const nghttp3_stream *stream, + const uint8_t *data, size_t datalen) { + nghttp3_wt_session *wt_session; + int rv; + + if (!conn->callbacks.recv_wt_data) { + return 0; + } + + wt_session = stream->wt.session; + + assert(wt_session); + + rv = conn->callbacks.recv_wt_data(conn, wt_session->session_id, + stream->node.id, data, datalen, + conn->user_data, stream->user_data); + if (rv != 0) { + return NGHTTP3_ERR_CALLBACK_FAILURE; + } + + return 0; +} + +static int conn_call_wt_data_stream_open(nghttp3_conn *conn, + const nghttp3_stream *stream) { + nghttp3_wt_session *wt_session; + int rv; + + if (!conn->callbacks.wt_data_stream_open) { + return 0; + } + + wt_session = stream->wt.session; + + assert(wt_session); + + rv = conn->callbacks.wt_data_stream_open(conn, wt_session->session_id, + stream->node.id, conn->user_data, + stream->user_data); + if (rv != 0) { + return NGHTTP3_ERR_CALLBACK_FAILURE; + } + + return 0; +} + static int conn_glitch_ratelim_drain(nghttp3_conn *conn, uint64_t n, nghttp3_tstamp ts) { if (ts == UINT64_MAX) { @@ -401,11 +502,25 @@ int nghttp3_conn_server_new_versioned(nghttp3_conn **pconn, return 0; } +static void remove_wt_session_ref(nghttp3_wt_session *wt_session) { + nghttp3_stream *stream; + + for (stream = wt_session->head; stream; stream = stream->wt.next) { + assert(stream->wt.session == wt_session); + + stream->wt.session = NULL; + } +} + static int free_stream(void *data, void *ptr) { nghttp3_stream *stream = data; (void)ptr; + if (nghttp3_stream_wt_ctrl(stream)) { + remove_wt_session_ref(stream->wt.session); + } + nghttp3_stream_del(stream); return 0; @@ -501,6 +616,10 @@ nghttp3_ssize nghttp3_conn_read_stream2(nghttp3_conn *conn, int64_t stream_id, return rv; } + if (conn_wt_enabled(conn)) { + stream->flags |= NGHTTP3_STREAM_FLAG_MAYBE_WT_DATA; + } + if ((conn->flags & NGHTTP3_CONN_FLAG_GOAWAY_QUEUED) && conn->tx.goaway_id <= stream_id) { stream->rstate.state = NGHTTP3_REQ_STREAM_STATE_IGN_REST; @@ -527,7 +646,9 @@ nghttp3_ssize nghttp3_conn_read_stream2(nghttp3_conn *conn, int64_t stream_id, } stream->rx.hstate = NGHTTP3_HTTP_STATE_REQ_INITIAL; - } else if (nghttp3_server_stream_uni(stream_id)) { + } else if (nghttp3_server_stream_uni(stream_id) || + (conn_wt_enabled(conn) && + nghttp3_server_stream_bidi(stream_id))) { if (srclen == 0 && fin) { return 0; } @@ -537,6 +658,10 @@ nghttp3_ssize nghttp3_conn_read_stream2(nghttp3_conn *conn, int64_t stream_id, return rv; } + if (!(stream_id & 0x2) && conn_wt_enabled(conn)) { + stream->flags |= NGHTTP3_STREAM_FLAG_MAYBE_WT_DATA; + } + stream->rx.hstate = NGHTTP3_HTTP_STATE_RESP_INITIAL; } else { /* client doesn't expect to receive new bidirectional stream or @@ -545,10 +670,12 @@ nghttp3_ssize nghttp3_conn_read_stream2(nghttp3_conn *conn, int64_t stream_id, } } else if (conn->server) { assert(nghttp3_client_stream_bidi(stream_id) || - nghttp3_client_stream_uni(stream_id)); + nghttp3_client_stream_uni(stream_id) || + (conn_wt_enabled(conn) && nghttp3_server_stream_bidi(stream_id))); } else { assert(nghttp3_client_stream_bidi(stream_id) || - nghttp3_server_stream_uni(stream_id)); + nghttp3_server_stream_uni(stream_id) || + (conn_wt_enabled(conn) && nghttp3_server_stream_bidi(stream_id))); } if (srclen == 0 && !fin) { @@ -613,6 +740,12 @@ static nghttp3_ssize conn_read_type(nghttp3_conn *conn, nghttp3_stream *stream, conn->flags |= NGHTTP3_CONN_FLAG_QPACK_DECODER_OPENED; stream->type = NGHTTP3_STREAM_TYPE_QPACK_DECODER; break; + case NGHTTP3_STREAM_TYPE_WT_STREAM: + if (!conn_wt_enabled(conn)) { + return NGHTTP3_ERR_H3_STREAM_CREATION_ERROR; + } + stream->type = NGHTTP3_STREAM_TYPE_WT_STREAM; + break; default: stream->type = NGHTTP3_STREAM_TYPE_UNKNOWN; break; @@ -702,6 +835,10 @@ nghttp3_ssize nghttp3_conn_read_uni(nghttp3_conn *conn, nghttp3_stream *stream, } nconsumed = nghttp3_conn_read_qpack_decoder(conn, src, srclen); break; + case NGHTTP3_STREAM_TYPE_WT_STREAM: + nconsumed = + nghttp3_conn_read_wt_stream_uni(conn, stream, src, srclen, fin, ts); + break; case NGHTTP3_STREAM_TYPE_UNKNOWN: nconsumed = (nghttp3_ssize)srclen; break; @@ -794,7 +931,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, case NGHTTP3_FRAME_SETTINGS: /* SETTINGS frame might be empty. */ if (rstate->left == 0) { - rv = conn_call_recv_settings(conn); + rv = nghttp3_conn_on_settings_received(conn); if (rv != 0) { return rv; } @@ -892,7 +1029,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, case NGHTTP3_CTRL_STREAM_STATE_SETTINGS: for (;;) { if (rstate->left == 0) { - rv = conn_call_recv_settings(conn); + rv = nghttp3_conn_on_settings_received(conn); if (rv != 0) { return rv; } @@ -1010,7 +1147,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, break; } - rv = conn_call_recv_settings(conn); + rv = nghttp3_conn_on_settings_received(conn); if (rv != 0) { return rv; } @@ -1335,6 +1472,35 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, return (nghttp3_ssize)nconsumed; } +static int conn_unlink_wt_session(nghttp3_conn *conn, + nghttp3_stream *wt_ctrl_stream) { + nghttp3_wt_session *wt_session = wt_ctrl_stream->wt.session; + nghttp3_stream *stream, *next; + int rv; + (void)rv; + + for (stream = wt_session->head; stream;) { + next = stream->wt.next; + + assert(stream->wt.session); + + stream->wt.session = NULL; + stream->wt.prev = stream->wt.next = NULL; + + rv = nghttp3_conn_shutdown_wt_data_stream(conn, stream, + NGHTTP3_WT_SESSION_GONE); + if (rv != 0) { + return rv; + } + + stream = next; + } + + wt_session->head = NULL; + + return 0; +} + static int conn_delete_stream(nghttp3_conn *conn, nghttp3_stream *stream) { int rv; @@ -1361,6 +1527,15 @@ static int conn_delete_stream(nghttp3_conn *conn, nghttp3_stream *stream) { } } + if (nghttp3_stream_wt_ctrl(stream)) { + rv = conn_unlink_wt_session(conn, stream); + if (rv != 0) { + return rv; + } + } else if (nghttp3_stream_wt_data(stream)) { + nghttp3_wt_session_remove_stream(stream->wt.session, stream); + } + if (conn->server && nghttp3_client_stream_bidi(stream->node.id)) { assert(conn->remote.bidi.num_streams > 0); @@ -1494,6 +1669,7 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, int rv; nghttp3_stream_read_state *rstate = &stream->rstate; nghttp3_varint_read_state *rvint = &rstate->rvint; + nghttp3_stream *wt_ctrl_stream; nghttp3_ssize nread; size_t nconsumed = 0; int busy = 0; @@ -1505,7 +1681,8 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, return (nghttp3_ssize)srclen; } - if (stream->flags & NGHTTP3_STREAM_FLAG_QPACK_DECODE_BLOCKED) { + if (stream->flags & (NGHTTP3_STREAM_FLAG_QPACK_DECODE_BLOCKED | + NGHTTP3_STREAM_FLAG_WT_SESSION_BLOCKED)) { *pnproc = 0; if (srclen == 0) { @@ -1614,6 +1791,42 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, } rstate->state = NGHTTP3_REQ_STREAM_STATE_HEADERS; + break; + case NGHTTP3_EXFR_WT_STREAM_BIDI: + if (!nghttp3_stream_wt_data(stream) && + !(stream->flags & NGHTTP3_STREAM_FLAG_MAYBE_WT_DATA)) { + return NGHTTP3_ERR_H3_FRAME_ERROR; + } + + stream->flags &= (uint16_t)~NGHTTP3_STREAM_FLAG_MAYBE_WT_DATA; + + if (conn->server) { + if (stream->rx.hstate != NGHTTP3_HTTP_STATE_REQ_INITIAL) { + return NGHTTP3_ERR_H3_FRAME_ERROR; + } + } else if (stream->rx.hstate != NGHTTP3_HTTP_STATE_RESP_INITIAL) { + return NGHTTP3_ERR_H3_FRAME_ERROR; + } + + /* rstate->left is Session ID */ + rv = nghttp3_conn_on_wt_stream(conn, stream, (int64_t)rstate->left); + if (rv != 0) { + if (rv != NGHTTP3_ERR_WT_SESSION_GONE) { + return rv; + } + + stream->rstate.state = NGHTTP3_REQ_STREAM_STATE_IGN_REST; + + rv = nghttp3_conn_abort_stream(conn, stream, NGHTTP3_WT_SESSION_GONE); + if (rv != 0) { + return rv; + } + + break; + } + + rstate->state = NGHTTP3_REQ_STREAM_STATE_BEFORE_WT_DATA; + break; case NGHTTP3_FRAME_PUSH_PROMISE: /* We do not support push */ case NGHTTP3_FRAME_CANCEL_PUSH: @@ -1633,6 +1846,8 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, return NGHTTP3_ERR_H3_EXCESSIVE_LOAD; } + stream->flags &= (uint16_t)~NGHTTP3_STREAM_FLAG_MAYBE_WT_DATA; + /* TODO Handle reserved frame type */ busy = 1; rstate->state = NGHTTP3_REQ_STREAM_STATE_IGN_FRAME; @@ -1641,11 +1856,29 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, break; case NGHTTP3_REQ_STREAM_STATE_DATA: len = (size_t)nghttp3_min(rstate->left, (uint64_t)(end - p)); - rv = nghttp3_conn_on_data(conn, stream, p, len); - if (rv != 0) { - return rv; + nread = nghttp3_conn_on_data(conn, stream, p, len); + if (nread < 0) { + if (nread != NGHTTP3_ERR_WT_SESSION_GONE) { + return nread; + } + + rv = nghttp3_conn_shutdown_wt_session(conn, stream, + NGHTTP3_WT_SESSION_GONE); + if (rv != 0) { + return rv; + } + + /* Now that the stream is in + NGHTTP3_REQ_STREAM_STATE_IGN_REST, end_stream callback is + not called. */ + + /* Pretend that all stream data have been consumed */ + nconsumed += len; + + goto almost_done; } p += len; + nconsumed += (size_t)nread; rstate->left -= len; if (rstate->left) { @@ -1717,7 +1950,9 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, return rv; } } - /* fall through */ + + rv = conn_call_end_headers(conn, stream, p == end && fin); + break; case NGHTTP3_HTTP_STATE_RESP_HEADERS_BEGIN: rv = conn_call_end_headers(conn, stream, p == end && fin); break; @@ -1739,6 +1974,62 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, nghttp3_stream_read_state_reset(rstate); + if (conn->server) { + if (stream->rx.hstate == NGHTTP3_HTTP_STATE_REQ_HEADERS_END) { + if (stream->wt.session && (stream->wt.session->flags & + NGHTTP3_WT_SESSION_FLAG_RESP_SUBMITTED)) { + /* Server has submitted WebTransport session. */ + rv = nghttp3_conn_on_wt_session_confirmed(conn, stream, ts); + if (rv != 0) { + return rv; + } + } else if (stream->rx.http.flags & NGHTTP3_HTTP_FLAG_WEBTRANSPORT) { + if (stream->flags & NGHTTP3_STREAM_FLAG_RESP_SUBMITTED) { + /* Server refused WebTransport upgrade request */ + stream->rstate.state = NGHTTP3_REQ_STREAM_STATE_IGN_REST; + + rv = conn_call_stop_sending(conn, stream, NGHTTP3_H3_NO_ERROR); + if (rv != 0) { + return rv; + } + } else { + /* Server has not submitted response */ + stream->flags |= NGHTTP3_STREAM_FLAG_WT_SESSION_BLOCKED; + if (p != end) { + rv = nghttp3_stream_buffer_data(stream, p, (size_t)(end - p)); + if (rv != 0) { + return rv; + } + } + + *pnproc = (size_t)(p - src); + + return (nghttp3_ssize)nconsumed; + } + } + } + } else if (stream->rx.hstate == NGHTTP3_HTTP_STATE_RESP_HEADERS_END && + stream->wt.session) { + if (stream->rx.http.status_code / 100 == 2) { + rv = nghttp3_conn_on_wt_session_confirmed(conn, stream, ts); + if (rv != 0) { + return rv; + } + } else { + /* Server refused WebTransport negotiation. Reset the session + stream. This could be a redirect, but client is instructed + not to follow the redirect automatically. Most of the + case, we cannot do anything but just close the stream. */ + stream->rstate.state = NGHTTP3_REQ_STREAM_STATE_IGN_REST; + + rv = nghttp3_conn_abort_stream(conn, stream, + NGHTTP3_H3_REQUEST_CANCELLED); + if (rv != 0) { + return rv; + } + } + } + break; case NGHTTP3_REQ_STREAM_STATE_IGN_FRAME: len = (size_t)nghttp3_min(rstate->left, (uint64_t)(end - p)); @@ -1752,6 +2043,40 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, nghttp3_stream_read_state_reset(rstate); break; + case NGHTTP3_REQ_STREAM_STATE_BEFORE_WT_DATA: + rstate->state = NGHTTP3_REQ_STREAM_STATE_WT_DATA; + + assert(stream->wt.session); + + wt_ctrl_stream = + nghttp3_conn_find_stream(conn, stream->wt.session->session_id); + + if (!(wt_ctrl_stream->wt.session->flags & + NGHTTP3_WT_SESSION_FLAG_CONFIRMED)) { + stream->flags |= NGHTTP3_STREAM_FLAG_WT_SESSION_BLOCKED; + + if (p != end) { + rv = nghttp3_stream_buffer_data(stream, p, (size_t)(end - p)); + if (rv != 0) { + return rv; + } + } + + *pnproc = (size_t)(p - src); + + return (nghttp3_ssize)nconsumed; + } + + break; + case NGHTTP3_REQ_STREAM_STATE_WT_DATA: + rv = conn_call_recv_wt_data(conn, stream, p, (size_t)(end - p)); + if (rv != 0) { + return rv; + } + + p = end; + + goto almost_done; case NGHTTP3_REQ_STREAM_STATE_IGN_REST: nconsumed += (size_t)(end - p); *pnproc = (size_t)(end - src); @@ -1771,10 +2096,16 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, if (rv != 0) { return rv; } + + /* Fall through */ + /* When a stream is closed without any data */ + case NGHTTP3_REQ_STREAM_STATE_BEFORE_WT_DATA: + case NGHTTP3_REQ_STREAM_STATE_WT_DATA: rv = conn_call_end_stream(conn, stream); if (rv != 0) { return rv; } + break; case NGHTTP3_REQ_STREAM_STATE_IGN_REST: break; @@ -1787,8 +2118,8 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, return (nghttp3_ssize)nconsumed; } -int nghttp3_conn_on_data(nghttp3_conn *conn, nghttp3_stream *stream, - const uint8_t *data, size_t datalen) { +nghttp3_ssize nghttp3_conn_on_data(nghttp3_conn *conn, nghttp3_stream *stream, + const uint8_t *data, size_t datalen) { int rv; rv = nghttp3_http_on_data_chunk(stream, datalen); @@ -1796,17 +2127,21 @@ int nghttp3_conn_on_data(nghttp3_conn *conn, nghttp3_stream *stream, return rv; } - if (!conn->callbacks.recv_data) { - return 0; + if (!stream->wt.session) { + return conn_call_recv_data(conn, stream, data, datalen); } - rv = conn->callbacks.recv_data(conn, stream->node.id, data, datalen, - conn->user_data, stream->user_data); + /* The stream data must be buffered until WebTransport session has + been confirmed. */ + assert(stream->wt.session->flags & NGHTTP3_WT_SESSION_FLAG_CONFIRMED); + + rv = nghttp3_conn_read_wt_ctrl_stream(conn, stream, data, datalen); if (rv != 0) { - return NGHTTP3_ERR_CALLBACK_FAILURE; + return rv; } - return 0; + /* WebTransport control stream has consumed all data */ + return (nghttp3_ssize)datalen; } static nghttp3_pq *conn_get_sched_pq(nghttp3_conn *conn, nghttp3_tnode *tnode) { @@ -2001,6 +2336,14 @@ int nghttp3_conn_on_settings_entry_received(nghttp3_conn *conn, dest->h3_datagram = (uint8_t)ent->value; break; + case NGHTTP3_SETTINGS_ID_WT_ENABLED: + /* compat for pre draft-15 */ + case NGHTTP3_SETTINGS_ID_WT_MAX_SESSIONS: + case NGHTTP3_SETTINGS_ID_WT_MAX_SESSIONS_DRAFT7: + /* compat for ancient draft */ + case NGHTTP3_SETTINGS_ID_ENABLE_WEBTRANSPORT_DRAFT2: + dest->wt_enabled = ent->value != 0; + break; case NGHTTP3_H2_SETTINGS_ID_ENABLE_PUSH: case NGHTTP3_H2_SETTINGS_ID_MAX_CONCURRENT_STREAMS: case NGHTTP3_H2_SETTINGS_ID_INITIAL_WINDOW_SIZE: @@ -2014,6 +2357,37 @@ int nghttp3_conn_on_settings_entry_received(nghttp3_conn *conn, return 0; } +static int abort_wt_session(void *data, void *ptr) { + nghttp3_conn *conn = ptr; + nghttp3_stream *stream = data; + + if (!nghttp3_stream_wt_ctrl(stream)) { + return 0; + } + + stream->rstate.state = NGHTTP3_REQ_STREAM_STATE_IGN_REST; + + return nghttp3_conn_abort_stream(conn, stream, + NGHTTP3_H3_GENERAL_PROTOCOL_ERROR); +} + +int nghttp3_conn_on_settings_received(nghttp3_conn *conn) { + int rv; + + conn->flags |= NGHTTP3_CONN_FLAG_SETTINGS_RECVED; + + rv = conn_call_recv_settings(conn); + if (rv != 0) { + return rv; + } + + if (!conn->local.settings.wt_enabled || conn_wt_enabled(conn)) { + return 0; + } + + return nghttp3_map_each(&conn->streams, abort_wt_session, conn); +} + static int conn_on_priority_update_stream(nghttp3_conn *conn, const nghttp3_frame_priority_update *fr) { @@ -2055,6 +2429,11 @@ conn_on_priority_update_stream(nghttp3_conn *conn, stream->node.pri = fr->pri; stream->flags |= NGHTTP3_STREAM_FLAG_PRIORITY_UPDATE_RECVED; + + if (conn_wt_enabled(conn)) { + stream->flags |= NGHTTP3_STREAM_FLAG_MAYBE_WT_DATA; + } + stream->rx.hstate = NGHTTP3_HTTP_STATE_REQ_INITIAL; return 0; @@ -2323,7 +2702,7 @@ nghttp3_ssize nghttp3_conn_writev_stream(nghttp3_conn *conn, return ncnt; } - if (nghttp3_client_stream_bidi(stream->node.id) && + if (nghttp3_stream_schedulable(stream) && !nghttp3_stream_require_schedule(stream)) { nghttp3_conn_unschedule_stream(conn, stream); } @@ -2362,7 +2741,7 @@ int nghttp3_conn_add_write_offset(nghttp3_conn *conn, int64_t stream_id, stream->unscheduled_nwrite += n; - if (!nghttp3_client_stream_bidi(stream->node.id)) { + if (!nghttp3_stream_schedulable(stream)) { return 0; } @@ -2404,6 +2783,22 @@ int nghttp3_conn_update_ack_offset(nghttp3_conn *conn, int64_t stream_id, return nghttp3_stream_update_ack_offset(stream, offset); } +static nghttp3_ssize wt_session_read_data(nghttp3_conn *conn, int64_t stream_id, + nghttp3_vec *vec, size_t veccnt, + uint32_t *pflags, + void *conn_user_data, + void *stream_user_data) { + (void)conn; + (void)stream_id; + (void)vec; + (void)veccnt; + (void)pflags; + (void)conn_user_data; + (void)stream_user_data; + + return NGHTTP3_ERR_WOULDBLOCK; +} + static int conn_submit_headers_data(nghttp3_conn *conn, nghttp3_stream *stream, const nghttp3_nv *nva, size_t nvlen, const nghttp3_data_reader *dr) { @@ -2428,7 +2823,7 @@ static int conn_submit_headers_data(nghttp3_conn *conn, nghttp3_stream *stream, .nvlen = nvlen, }; - if (dr) { + if (dr && dr->read_data != wt_session_read_data) { rv = nghttp3_stream_frq_emplace(stream, &fr); if (rv != 0) { return rv; @@ -2555,6 +2950,8 @@ int nghttp3_conn_submit_response(nghttp3_conn *conn, int64_t stream_id, stream->flags |= NGHTTP3_STREAM_FLAG_WRITE_END_STREAM; } + stream->flags |= NGHTTP3_STREAM_FLAG_RESP_SUBMITTED; + return conn_submit_headers_data(conn, stream, nva, nvlen, dr); } @@ -2632,14 +3029,27 @@ int nghttp3_conn_shutdown(nghttp3_conn *conn) { } int nghttp3_conn_reject_stream(nghttp3_conn *conn, nghttp3_stream *stream) { + return nghttp3_conn_abort_stream(conn, stream, NGHTTP3_H3_REQUEST_REJECTED); +} + +int nghttp3_conn_abort_stream(nghttp3_conn *conn, nghttp3_stream *stream, + uint64_t error_code) { int rv; + int remote_uni = conn_remote_stream_uni(conn, stream->node.id); + int bidi = !nghttp3_stream_uni(stream->node.id); - rv = conn_call_stop_sending(conn, stream, NGHTTP3_H3_REQUEST_REJECTED); - if (rv != 0) { - return rv; + if (remote_uni || bidi) { + rv = conn_call_stop_sending(conn, stream, error_code); + if (rv != 0) { + return rv; + } + } + + if (remote_uni) { + return 0; } - return conn_call_reset_stream(conn, stream, NGHTTP3_H3_REQUEST_REJECTED); + return conn_call_reset_stream(conn, stream, error_code); } void nghttp3_conn_block_stream(nghttp3_conn *conn, int64_t stream_id) { @@ -2681,7 +3091,7 @@ int nghttp3_conn_unblock_stream(nghttp3_conn *conn, int64_t stream_id) { stream->flags &= (uint16_t)~NGHTTP3_STREAM_FLAG_FC_BLOCKED; - if (nghttp3_client_stream_bidi(stream->node.id) && + if (nghttp3_stream_schedulable(stream) && nghttp3_stream_require_schedule(stream)) { return nghttp3_conn_ensure_stream_scheduled(conn, stream); } @@ -2715,7 +3125,7 @@ int nghttp3_conn_resume_stream(nghttp3_conn *conn, int64_t stream_id) { stream->flags &= (uint16_t)~NGHTTP3_STREAM_FLAG_READ_DATA_BLOCKED; - if (nghttp3_client_stream_bidi(stream->node.id) && + if (nghttp3_stream_schedulable(stream) && nghttp3_stream_require_schedule(stream)) { return nghttp3_conn_ensure_stream_scheduled(conn, stream); } @@ -2731,8 +3141,7 @@ int nghttp3_conn_close_stream(nghttp3_conn *conn, int64_t stream_id, return NGHTTP3_ERR_STREAM_NOT_FOUND; } - if (nghttp3_stream_uni(stream_id) && - stream->type != NGHTTP3_STREAM_TYPE_UNKNOWN) { + if (nghttp3_stream_critical(stream)) { return NGHTTP3_ERR_H3_CLOSED_CRITICAL_STREAM; } @@ -2760,6 +3169,13 @@ int nghttp3_conn_shutdown_stream_read(nghttp3_conn *conn, int64_t stream_id) { } stream->flags |= NGHTTP3_STREAM_FLAG_SHUT_RD; + + /* If stream is WebTransport data stream, do not send QPACK Stream + Cancellation. */ + if (nghttp3_stream_wt_data(stream) || + (stream->flags & NGHTTP3_STREAM_FLAG_WT_DATA)) { + return 0; + } } return nghttp3_qpack_decoder_cancel_stream(&conn->qdec, stream_id); @@ -2979,3 +3395,794 @@ int nghttp3_conn_is_drained2(const nghttp3_conn *conn) { nghttp3_stream_outq_write_done(conn->tx.ctrl) && nghttp3_ringbuf_len(&conn->tx.ctrl->frq) == 0; } + +int nghttp3_conn_is_stream_flushed(const nghttp3_conn *conn, + int64_t stream_id) { + nghttp3_stream *stream = nghttp3_conn_find_stream(conn, stream_id); + const nghttp3_frame *fr; + + if (!stream) { + return 1; + } + + if (!nghttp3_stream_outq_write_done(stream)) { + return 0; + } + + if (nghttp3_ringbuf_len(&stream->frq) == 0) { + return 1; + } + + fr = nghttp3_ringbuf_get(&stream->frq, 0); + + return fr->hd.type == NGHTTP3_FRAME_DATA || + (fr->hd.type == NGHTTP3_FRAME_EX_WT && + fr->wt.fr.hd.type == NGHTTP3_EXFR_WT_STREAM_DATA); +} + +int nghttp3_conn_submit_wt_request(nghttp3_conn *conn, int64_t stream_id, + const nghttp3_nv *nva, size_t nvlen, + void *stream_user_data) { + int rv; + nghttp3_stream *stream; + + if (!conn_wt_enabled(conn)) { + return NGHTTP3_ERR_INVALID_STATE; + } + + rv = nghttp3_conn_submit_request( + conn, stream_id, nva, nvlen, + &(nghttp3_data_reader){.read_data = wt_session_read_data}, + stream_user_data); + if (rv != 0) { + return rv; + } + + stream = nghttp3_conn_find_stream(conn, stream_id); + + assert(stream); + + return nghttp3_conn_open_wt_session(conn, stream); +} + +int nghttp3_conn_submit_wt_response(nghttp3_conn *conn, int64_t stream_id, + const nghttp3_nv *nva, size_t nvlen) { + int rv; + nghttp3_stream *stream; + + if (!conn_wt_enabled(conn)) { + return NGHTTP3_ERR_INVALID_STATE; + } + + rv = nghttp3_conn_submit_response( + conn, stream_id, nva, nvlen, + &(nghttp3_data_reader){.read_data = wt_session_read_data}); + if (rv != 0) { + return rv; + } + + stream = nghttp3_conn_find_stream(conn, stream_id); + + if (!stream->wt.session) { + rv = nghttp3_conn_open_wt_session(conn, stream); + if (rv != 0) { + return rv; + } + } + + stream->wt.session->flags |= NGHTTP3_WT_SESSION_FLAG_RESP_SUBMITTED; + + return 0; +} + +int nghttp3_conn_server_confirm_wt_session(nghttp3_conn *conn, + int64_t session_id, + nghttp3_tstamp ts) { + nghttp3_stream *wt_ctrl_stream; + + wt_ctrl_stream = nghttp3_conn_find_stream(conn, session_id); + if (!wt_ctrl_stream) { + return NGHTTP3_ERR_STREAM_NOT_FOUND; + } + + assert(wt_ctrl_stream->wt.session); + assert(wt_ctrl_stream->wt.session->flags & + NGHTTP3_WT_SESSION_FLAG_RESP_SUBMITTED); + + wt_ctrl_stream->flags &= (uint16_t)~NGHTTP3_STREAM_FLAG_WT_SESSION_BLOCKED; + + return nghttp3_conn_on_wt_session_confirmed(conn, wt_ctrl_stream, ts); +} + +int nghttp3_conn_open_wt_session(nghttp3_conn *conn, nghttp3_stream *stream) { + int rv; + + rv = nghttp3_wt_session_new(&stream->wt.session, stream->node.id, conn->mem); + if (rv != 0) { + return rv; + } + + return 0; +} + +int nghttp3_conn_open_wt_data_stream(nghttp3_conn *conn, int64_t session_id, + int64_t stream_id, + const nghttp3_data_reader *dr, + void *stream_user_data) { + nghttp3_stream *stream, *wt_ctrl_stream; + nghttp3_wt_session *wt_session; + nghttp3_frame *fr; + uint64_t type; + int rv; + int remote_bidi = 0; + + if (conn->server) { + assert(nghttp3_client_stream_bidi(stream_id) || + nghttp3_server_stream_bidi(stream_id) || + nghttp3_server_stream_uni(stream_id)); + } else { + assert(nghttp3_client_stream_bidi(stream_id) || + nghttp3_server_stream_bidi(stream_id) || + nghttp3_client_stream_uni(stream_id)); + } + + /* TODO Check session flow control */ + + assert(dr); + + if (conn->flags & NGHTTP3_CONN_FLAG_GOAWAY_RECVED) { + return NGHTTP3_ERR_CONN_CLOSING; + } + + wt_ctrl_stream = nghttp3_conn_find_stream(conn, session_id); + if (!wt_ctrl_stream || !wt_ctrl_stream->wt.session) { + return NGHTTP3_ERR_INVALID_ARGUMENT; + } + + wt_session = wt_ctrl_stream->wt.session; + + stream = nghttp3_conn_find_stream(conn, stream_id); + if (stream) { + if (conn->server) { + assert(nghttp3_client_stream_bidi(stream_id)); + } else { + assert(nghttp3_server_stream_bidi(stream_id)); + } + + /* TODO verify that we do not start writing more than once. */ + + /* Normally, stream->wt.session is not NULL because we must + identify WT stream header first. The only exception is a + stream create by priority update on server side. But it must + be client initiated bidi stream, and we must wait for its WT + header. */ + if (!stream->wt.session) { + return NGHTTP3_ERR_INVALID_ARGUMENT; + } + + if (stream->flags & NGHTTP3_STREAM_FLAG_WRITE_END_STREAM) { + return NGHTTP3_ERR_INVALID_STATE; + } + + remote_bidi = 1; + + if (stream_user_data) { + stream->user_data = stream_user_data; + } + + if (conn->server) { + stream->flags |= NGHTTP3_STREAM_FLAG_SERVER_PRIORITY_SET; + } + + assert(!nghttp3_tnode_is_scheduled(&stream->node)); + } else { + if (conn->server) { + assert(nghttp3_server_stream_bidi(stream_id) || + nghttp3_server_stream_uni(stream_id)); + } else { + assert(nghttp3_client_stream_bidi(stream_id) || + nghttp3_client_stream_uni(stream_id)); + } + + rv = nghttp3_conn_create_stream(conn, &stream, stream_id); + if (rv != 0) { + return rv; + } + + nghttp3_wt_session_add_stream(wt_session, stream); + + if (conn->server) { + stream->rx.hstate = NGHTTP3_HTTP_STATE_REQ_INITIAL; + } else { + stream->rx.hstate = NGHTTP3_HTTP_STATE_RESP_INITIAL; + } + + stream->user_data = stream_user_data; + + if (stream_id & 0x2) { + stream->flags |= NGHTTP3_STREAM_FLAG_SHUT_RD; + stream->type = NGHTTP3_STREAM_TYPE_WT_STREAM; + } + } + + stream->node.pri = (nghttp3_pri){ + .urgency = NGHTTP3_DEFAULT_URGENCY, + .inc = 1, + }; + + if (stream_id & 0x2) { + type = NGHTTP3_EXFR_WT_STREAM_UNI; + } else if (remote_bidi) { + type = NGHTTP3_EXFR_WT_STREAM_DATA; + } else { + type = NGHTTP3_EXFR_WT_STREAM_BIDI; + stream->rstate.state = NGHTTP3_REQ_STREAM_STATE_BEFORE_WT_DATA; + } + + rv = nghttp3_stream_frq_emplace(stream, &fr); + if (rv != 0) { + return rv; + } + + fr->wt = (nghttp3_frame_ex_wt){ + .type = NGHTTP3_FRAME_EX_WT, + .fr.wt_stream = + { + .type = type, + .session_id = session_id, + .dr = *dr, + }, + }; + + if (nghttp3_stream_require_schedule(stream)) { + return nghttp3_conn_ensure_stream_scheduled(conn, stream); + } + + return 0; +} + +int nghttp3_conn_close_wt_session(nghttp3_conn *conn, int64_t session_id, + uint32_t wt_error_code, const uint8_t *msg, + size_t msglen) { + nghttp3_stream *stream; + nghttp3_wt_session *wt_session; + nghttp3_frame *fr; + int rv; + + stream = nghttp3_conn_find_stream(conn, session_id); + if (stream == NULL) { + return NGHTTP3_ERR_STREAM_NOT_FOUND; + } + + if (!nghttp3_stream_wt_ctrl(stream)) { + return NGHTTP3_ERR_INVALID_ARGUMENT; + } + + if (stream->flags & NGHTTP3_STREAM_FLAG_WRITE_END_STREAM) { + return NGHTTP3_ERR_INVALID_STATE; + } + + stream->flags |= NGHTTP3_STREAM_FLAG_WRITE_END_STREAM; + + wt_session = stream->wt.session; + + assert(!wt_session->tx.error_msg.base); + + if (msglen) { + wt_session->tx.error_msg.base = nghttp3_mem_malloc(conn->mem, msglen); + if (!wt_session->tx.error_msg.base) { + return NGHTTP3_ERR_NOMEM; + } + + memcpy(wt_session->tx.error_msg.base, msg, msglen); + wt_session->tx.error_msg.len = msglen; + } + + rv = nghttp3_stream_frq_emplace(stream, &fr); + if (rv != 0) { + return rv; + } + + fr->cpsl = (nghttp3_frame_ex_cpsl){ + .type = NGHTTP3_FRAME_EX_CPSL, + .fr.wt_close_session = + { + .type = NGHTTP3_EXFR_CPSL_WT_CLOSE_SESSION, + .error_code = wt_error_code, + .error_msg = wt_session->tx.error_msg, + }, + }; + + if (nghttp3_stream_require_schedule(stream)) { + rv = nghttp3_conn_schedule_stream(conn, stream); + if (rv != 0) { + return rv; + } + } + + rv = nghttp3_conn_shutdown_all_wt_data_streams(conn, stream, + NGHTTP3_WT_SESSION_GONE); + if (rv != 0) { + return rv; + } + + stream->rstate.state = NGHTTP3_REQ_STREAM_STATE_IGN_REST; + + return conn_call_stop_sending(conn, stream, NGHTTP3_WT_SESSION_GONE); +} + +int nghttp3_conn_on_wt_stream(nghttp3_conn *conn, nghttp3_stream *stream, + int64_t session_id) { + nghttp3_stream *wt_ctrl_stream; + nghttp3_wt_session *wt_session; + int rv; + + if (!nghttp3_client_stream_bidi(session_id)) { + return NGHTTP3_ERR_WT_BUFFERED_STREAM_REJECTED; + } + + if (stream->wt.session) { + assert(stream->wt.session->session_id != stream->node.id); + + if (stream->wt.session->session_id != session_id) { + return NGHTTP3_ERR_WT_BUFFERED_STREAM_REJECTED; + } + + return 0; + } + + wt_ctrl_stream = nghttp3_conn_find_stream(conn, session_id); + if (!wt_ctrl_stream) { + if (!conn->server) { + /* On client's perspective, if session stream is not found, we are + sure that session is gone. */ + return NGHTTP3_ERR_WT_SESSION_GONE; + } + + if (nghttp3_ord_stream_id(session_id) > + conn->remote.bidi.max_client_streams) { + return NGHTTP3_ERR_WT_BUFFERED_STREAM_REJECTED; + } + + if ((conn->flags & NGHTTP3_CONN_FLAG_GOAWAY_QUEUED) && + conn->tx.goaway_id <= session_id) { + return NGHTTP3_ERR_WT_BUFFERED_STREAM_REJECTED; + } + + rv = conn_bidi_idtr_open(conn, session_id); + if (rv != 0) { + if (nghttp3_err_is_fatal(rv)) { + return rv; + } + + return NGHTTP3_ERR_WT_SESSION_GONE; + } + + conn->rx.max_stream_id_bidi = + nghttp3_max(conn->rx.max_stream_id_bidi, session_id); + rv = nghttp3_conn_create_stream(conn, &wt_ctrl_stream, session_id); + if (rv != 0) { + return rv; + } + + wt_ctrl_stream->rx.hstate = NGHTTP3_HTTP_STATE_REQ_INITIAL; + } + + if (!wt_ctrl_stream->wt.session) { + rv = nghttp3_conn_open_wt_session(conn, wt_ctrl_stream); + if (rv != 0) { + return rv; + } + } + + wt_session = wt_ctrl_stream->wt.session; + + assert(wt_session); + + nghttp3_wt_session_add_stream(wt_session, stream); + + if (wt_ctrl_stream->wt.session->flags & NGHTTP3_WT_SESSION_FLAG_CONFIRMED) { + return conn_call_wt_data_stream_open(conn, stream); + } + + return 0; +} + +int nghttp3_conn_on_wt_session_confirmed(nghttp3_conn *conn, + nghttp3_stream *wt_ctrl_stream, + nghttp3_tstamp ts) { + nghttp3_stream *stream; + nghttp3_wt_session *wt_session = wt_ctrl_stream->wt.session; + int rv; + + wt_session->flags |= NGHTTP3_WT_SESSION_FLAG_CONFIRMED; + + /* TODO Is stream gone during iteration? */ + for (stream = wt_session->head; stream; stream = stream->wt.next) { + stream->flags &= (uint16_t)~NGHTTP3_STREAM_FLAG_WT_SESSION_BLOCKED; + + if (conn_remote_stream(conn, stream->node.id)) { + rv = conn_call_wt_data_stream_open(conn, stream); + if (rv != 0) { + return rv; + } + } + + rv = nghttp3_conn_process_blocked_wt_stream_data(conn, stream, ts); + if (rv != 0) { + return rv; + } + } + + return nghttp3_conn_process_blocked_wt_stream_data(conn, wt_ctrl_stream, ts); +} + +nghttp3_ssize nghttp3_conn_read_wt_stream_uni(nghttp3_conn *conn, + nghttp3_stream *stream, + const uint8_t *src, size_t srclen, + int fin, nghttp3_tstamp ts) { + const uint8_t *p = src, *end = src ? src + srclen : src; + int rv; + nghttp3_stream_read_state *rstate = &stream->rstate; + nghttp3_varint_read_state *rvint = &rstate->rvint; + nghttp3_ssize nread; + size_t nconsumed = 0; + nghttp3_stream *wt_ctrl_stream; + (void)ts; + + if ((stream->flags & NGHTTP3_STREAM_FLAG_SHUT_RD)) { + return (nghttp3_ssize)srclen; + } + + if (srclen == 0) { + goto almost_done; + } + + if (stream->flags & NGHTTP3_STREAM_FLAG_WT_SESSION_BLOCKED) { + if (srclen == 0) { + return 0; + } + + rv = nghttp3_stream_buffer_data(stream, p, srclen); + if (rv != 0) { + return rv; + } + + return 0; + } + + switch (rstate->state) { + case NGHTTP3_WT_STREAM_STATE_SESSION_ID: + assert(end - p > 0); + nread = nghttp3_read_varint(rvint, p, end, fin); + if (nread < 0) { + return NGHTTP3_ERR_H3_FRAME_ERROR; + } + + p += nread; + nconsumed += (size_t)nread; + if (rvint->left) { + /* TODO What should we do if unidirectional stream is closed + before reading Session ID? */ + break; + } + + rstate->left = rvint->acc; + nghttp3_varint_read_state_reset(rvint); + + /* rstate->left is Session ID */ + rv = nghttp3_conn_on_wt_stream(conn, stream, (int64_t)rstate->left); + if (rv != 0) { + if (rv != NGHTTP3_ERR_WT_SESSION_GONE) { + return rv; + } + + stream->rstate.state = NGHTTP3_WT_STREAM_STATE_IGN_REST; + + rv = nghttp3_conn_abort_stream(conn, stream, NGHTTP3_WT_SESSION_GONE); + if (rv != 0) { + return rv; + } + + nconsumed += (size_t)(end - p); + + return (nghttp3_ssize)nconsumed; + } + + rstate->state = NGHTTP3_WT_STREAM_STATE_DATA; + + wt_ctrl_stream = + nghttp3_conn_find_stream(conn, stream->wt.session->session_id); + + if (!(wt_ctrl_stream->wt.session->flags & + NGHTTP3_WT_SESSION_FLAG_CONFIRMED)) { + stream->flags |= NGHTTP3_STREAM_FLAG_WT_SESSION_BLOCKED; + + if (p != end) { + rv = nghttp3_stream_buffer_data(stream, p, (size_t)(end - p)); + if (rv != 0) { + return rv; + } + } + + return (nghttp3_ssize)nconsumed; + } + + if (p == end) { + break; + } + + /* Fall through */ + case NGHTTP3_WT_STREAM_STATE_DATA: + rv = conn_call_recv_wt_data(conn, stream, p, (size_t)(end - p)); + if (rv != 0) { + return rv; + } + + break; + case NGHTTP3_WT_STREAM_STATE_IGN_REST: + nconsumed += (size_t)(end - p); + + return (nghttp3_ssize)nconsumed; + } + +almost_done: + if (fin) { + rv = conn_call_end_stream(conn, stream); + if (rv != 0) { + return rv; + } + } + + return (nghttp3_ssize)nconsumed; +} + +int nghttp3_conn_process_blocked_wt_stream_data(nghttp3_conn *conn, + nghttp3_stream *stream, + nghttp3_tstamp ts) { + nghttp3_buf *buf; + nghttp3_ssize nconsumed; + size_t nproc; + int rv; + size_t len; + + for (;;) { + len = nghttp3_ringbuf_len(&stream->inq); + if (len == 0) { + break; + } + + buf = nghttp3_ringbuf_get(&stream->inq, 0); + + if (nghttp3_stream_uni(stream->node.id)) { + nconsumed = nghttp3_conn_read_wt_stream_uni( + conn, stream, buf->pos, nghttp3_buf_len(buf), + len == 1 && (stream->flags & NGHTTP3_STREAM_FLAG_READ_EOF), ts); + } else { + nconsumed = nghttp3_conn_read_bidi( + conn, &nproc, stream, buf->pos, nghttp3_buf_len(buf), + len == 1 && (stream->flags & NGHTTP3_STREAM_FLAG_READ_EOF), ts); + } + + if (nconsumed < 0) { + return (int)nconsumed; + } + + rv = conn_call_deferred_consume(conn, stream, (size_t)nconsumed); + if (rv != 0) { + return rv; + } + + nghttp3_buf_free(buf, stream->mem); + nghttp3_ringbuf_pop_front(&stream->inq); + } + + return 0; +} + +int nghttp3_conn_shutdown_wt_session(nghttp3_conn *conn, + nghttp3_stream *wt_ctrl_stream, + uint64_t error_code) { + int rv; + + rv = + nghttp3_conn_shutdown_all_wt_data_streams(conn, wt_ctrl_stream, error_code); + if (rv != 0) { + return rv; + } + + wt_ctrl_stream->rstate.state = NGHTTP3_REQ_STREAM_STATE_IGN_REST; + + return nghttp3_conn_abort_stream(conn, wt_ctrl_stream, error_code); +} + +int nghttp3_conn_shutdown_all_wt_data_streams(nghttp3_conn *conn, + nghttp3_stream *wt_ctrl_stream, + uint64_t error_code) { + nghttp3_wt_session *wt_session = wt_ctrl_stream->wt.session; + nghttp3_stream *stream; + int rv; + + for (stream = wt_session->head; stream; stream = stream->wt.next) { + rv = nghttp3_conn_shutdown_wt_data_stream(conn, stream, error_code); + if (rv != 0) { + return rv; + } + } + + return 0; +} + +int nghttp3_conn_shutdown_wt_data_stream(nghttp3_conn *conn, + nghttp3_stream *stream, + uint64_t error_code) { + if (stream->node.id & 0x2) { + stream->rstate.state = NGHTTP3_WT_STREAM_STATE_IGN_REST; + } else { + stream->rstate.state = NGHTTP3_REQ_STREAM_STATE_IGN_REST; + } + + return nghttp3_conn_abort_stream(conn, stream, error_code); +} + +int64_t nghttp3_conn_get_stream_wt_session_id(const nghttp3_conn *conn, + int64_t stream_id) { + const nghttp3_stream *stream = nghttp3_conn_find_stream(conn, stream_id); + + if (!stream || !nghttp3_stream_wt_data(stream)) { + return -1; + } + + return stream->wt.session->session_id; +} + +int nghttp3_conn_read_wt_ctrl_stream(nghttp3_conn *conn, + const nghttp3_stream *stream, + const uint8_t *src, size_t srclen) { + const uint8_t *p, *end; + nghttp3_wt_session *wts = stream->wt.session; + nghttp3_wt_ctrl_read_state *rstate = &wts->rstate; + nghttp3_varint_read_state *rvint = &rstate->rvint; + nghttp3_ssize nread; + nghttp3_exfr_cpsl *cpsl = &rstate->cpsl; + size_t len; + size_t i; + int rv; + + if (srclen == 0) { + return 0; + } + + p = src; + end = src + srclen; + + for (; p != end;) { + switch (rstate->state) { + case NGHTTP3_WT_CTRL_STREAM_STATE_TYPE: + assert(end - p > 0); + nread = nghttp3_read_varint(rvint, p, end, /* fin = */ 0); + + assert(nread > 0); + + p += nread; + if (rvint->left) { + return 0; + } + + rstate->cpsl.hd.type = rvint->acc; + + nghttp3_varint_read_state_reset(rvint); + rstate->state = NGHTTP3_WT_CTRL_STREAM_STATE_LENGTH; + if (p == end) { + return 0; + } + /* Fall through */ + case NGHTTP3_WT_CTRL_STREAM_STATE_LENGTH: + assert(end - p > 0); + nread = nghttp3_read_varint(rvint, p, end, /* fin = */ 0); + assert(nread > 0); + + p += nread; + if (rvint->left) { + return 0; + } + + rstate->left = rvint->acc; + nghttp3_varint_read_state_reset(rvint); + + switch (rstate->cpsl.hd.type) { + case NGHTTP3_EXFR_CPSL_WT_CLOSE_SESSION: + if (rstate->left < sizeof(uint32_t) || + rstate->left > sizeof(uint32_t) + /* largest message size */ 1024) { + /* TODO Find better error code */ + return NGHTTP3_ERR_H3_MESSAGE_ERROR; + } + + rstate->field_left = sizeof(uint32_t); + rstate->state = + NGHTTP3_WT_CTRL_STREAM_STATE_WT_CLOSE_SESSION_ERROR_CODE; + + break; + default: + /* TODO Add rate limit after we implement all supported + capsules. */ + if (rstate->left == 0) { + nghttp3_wt_ctrl_read_state_reset(rstate); + break; + } + + rstate->state = NGHTTP3_WT_CTRL_STREAM_STATE_IGN; + } + + break; + case NGHTTP3_WT_CTRL_STREAM_STATE_WT_CLOSE_SESSION_ERROR_CODE: + len = nghttp3_min(rstate->field_left, (size_t)(end - p)); + + for (i = 0; i < len; ++i) { + cpsl->wt_close_session.error_code <<= 8; + cpsl->wt_close_session.error_code += *p++; + } + + rstate->left -= len; + rstate->field_left -= len; + if (rstate->field_left) { + break; + } + + wts->rx.error_code = cpsl->wt_close_session.error_code; + + rstate->state = NGHTTP3_WT_CTRL_STREAM_STATE_WT_CLOSE_SESSION_ERROR_MSG; + + if (rstate->left) { + wts->rx.error_msg.base = + nghttp3_mem_malloc(conn->mem, (size_t)rstate->left); + if (!wts->rx.error_msg.base) { + return NGHTTP3_ERR_NOMEM; + } + } + + /* Fall through */ + case NGHTTP3_WT_CTRL_STREAM_STATE_WT_CLOSE_SESSION_ERROR_MSG: + len = (size_t)nghttp3_min(rstate->left, (uint64_t)(end - p)); + + if (len) { + memcpy(wts->rx.error_msg.base + wts->rx.error_msg.len, p, len); + wts->rx.error_msg.len += len; + + p += len; + rstate->left -= len; + } + + if (rstate->left) { + break; + } + + if (conn->callbacks.recv_wt_close_session) { + rv = conn->callbacks.recv_wt_close_session( + conn, wts->session_id, wts->rx.error_code, wts->rx.error_msg.base, + wts->rx.error_msg.len, conn->user_data, stream->user_data); + if (rv != 0) { + return NGHTTP3_ERR_CALLBACK_FAILURE; + } + } + + nghttp3_wt_ctrl_read_state_reset(rstate); + + return NGHTTP3_ERR_WT_SESSION_GONE; + case NGHTTP3_WT_CTRL_STREAM_STATE_IGN: + len = (size_t)nghttp3_min(rstate->left, (uint64_t)(end - p)); + p += len; + rstate->left -= len; + + if (rstate->left) { + return 0; + } + + nghttp3_wt_ctrl_read_state_reset(rstate); + + break; + } + } + + return 0; +} diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_conn.h b/deps/ngtcp2/nghttp3/lib/nghttp3_conn.h index 6841b1c343a305..101def930b75e8 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_conn.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_conn.h @@ -202,8 +202,8 @@ nghttp3_ssize nghttp3_conn_read_qpack_decoder(nghttp3_conn *conn, const uint8_t *src, size_t srclen); -int nghttp3_conn_on_data(nghttp3_conn *conn, nghttp3_stream *stream, - const uint8_t *data, size_t datalen); +nghttp3_ssize nghttp3_conn_on_data(nghttp3_conn *conn, nghttp3_stream *stream, + const uint8_t *data, size_t datalen); int nghttp3_conn_on_priority_update(nghttp3_conn *conn, const nghttp3_frame_priority_update *fr); @@ -216,6 +216,8 @@ nghttp3_ssize nghttp3_conn_on_headers(nghttp3_conn *conn, int nghttp3_conn_on_settings_entry_received(nghttp3_conn *conn, const nghttp3_frame_settings *fr); +int nghttp3_conn_on_settings_received(nghttp3_conn *conn); + int nghttp3_conn_qpack_blocked_streams_push(nghttp3_conn *conn, nghttp3_stream *stream); @@ -233,10 +235,47 @@ void nghttp3_conn_unschedule_stream(nghttp3_conn *conn, nghttp3_stream *stream); int nghttp3_conn_reject_stream(nghttp3_conn *conn, nghttp3_stream *stream); +int nghttp3_conn_abort_stream(nghttp3_conn *conn, nghttp3_stream *stream, + uint64_t error_code); + /* * nghttp3_conn_get_next_tx_stream returns next stream to send. It * returns NULL if there is no such stream. */ nghttp3_stream *nghttp3_conn_get_next_tx_stream(nghttp3_conn *conn); +int nghttp3_conn_open_wt_session(nghttp3_conn *conn, nghttp3_stream *stream); + +int nghttp3_conn_on_wt_stream(nghttp3_conn *conn, nghttp3_stream *stream, + int64_t session_id); + +nghttp3_ssize nghttp3_conn_read_wt_stream_uni(nghttp3_conn *conn, + nghttp3_stream *stream, + const uint8_t *src, size_t srclen, + int fin, nghttp3_tstamp ts); + +int nghttp3_conn_on_wt_session_confirmed(nghttp3_conn *conn, + nghttp3_stream *wt_ctrl_stream, + nghttp3_tstamp ts); + +int nghttp3_conn_process_blocked_wt_stream_data(nghttp3_conn *conn, + nghttp3_stream *stream, + nghttp3_tstamp ts); + +int nghttp3_conn_shutdown_wt_session(nghttp3_conn *conn, + nghttp3_stream *wt_ctrl_stream, + uint64_t error_code); + +int nghttp3_conn_shutdown_all_wt_data_streams(nghttp3_conn *conn, + nghttp3_stream *wt_ctrl_stream, + uint64_t error_code); + +int nghttp3_conn_shutdown_wt_data_stream(nghttp3_conn *conn, + nghttp3_stream *stream, + uint64_t error_code); + +int nghttp3_conn_read_wt_ctrl_stream(nghttp3_conn *conn, + const nghttp3_stream *stream, + const uint8_t *src, size_t srclen); + #endif /* !defined(NGHTTP3_CONN_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_conv.c b/deps/ngtcp2/nghttp3/lib/nghttp3_conv.c index 2a89a3c76e6c13..a90e1d25b70eab 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_conv.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_conv.c @@ -70,6 +70,21 @@ size_t nghttp3_get_uvarintlen(const uint8_t *p) { return (size_t)(1U << (*p >> 6)); } +const uint8_t *nghttp3_get_varint(int64_t *dest, const uint8_t *p) { + uint64_t n; + + p = nghttp3_get_uvarint(&n, p); + *dest = (int64_t)n; + + return p; +} + +const uint8_t *nghttp3_get_uint32be(uint32_t *dest, const uint8_t *p) { + memcpy(dest, p, sizeof(*dest)); + *dest = ntohl(*dest); + return p + sizeof(*dest); +} + uint8_t *nghttp3_put_uint64be(uint8_t *p, uint64_t n) { n = nghttp3_htonl64(n); return nghttp3_cpymem(p, (const uint8_t *)&n, sizeof(n)); diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_conv.h b/deps/ngtcp2/nghttp3/lib/nghttp3_conv.h index 47856131049945..bd6f29a55db569 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_conv.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_conv.h @@ -93,32 +93,11 @@ #endif /* defined(WIN32) */ /* - * nghttp3_get_uvarint reads variable-length unsigned integer from - * |p|, and stores it in the buffer pointed by |dest| in host byte - * order. It returns |p| plus the number of bytes read from |p|. + * nghttp3_get_uint32be reads 4 bytes from |p| as 32 bits unsigned + * integer encoded as network byte order, and stores it in the buffer + * pointed by |dest| in host byte order. It returns |p| + 4. */ -const uint8_t *nghttp3_get_uvarint(uint64_t *dest, const uint8_t *p); - -/* - * nghttp3_get_uvarintlen returns the required number of bytes to read - * variable-length integer starting at |p|. - */ -size_t nghttp3_get_uvarintlen(const uint8_t *p); - -/* - * nghttp3_get_varint reads variable-length unsigned integer from |p|, - * and stores it in the buffer pointed by |dest| in host byte order. - * It returns |p| plus the number of bytes read from |p|. - */ -static inline const uint8_t *nghttp3_get_varint(int64_t *dest, - const uint8_t *p) { - uint64_t n; - - p = nghttp3_get_uvarint(&n, p); - *dest = (int64_t)n; - - return p; -} +const uint8_t *nghttp3_get_uint32be(uint32_t *dest, const uint8_t *p); /* * nghttp3_put_uint64be writes |n| in host byte order in |p| in @@ -141,18 +120,6 @@ uint8_t *nghttp3_put_uint32be(uint8_t *p, uint32_t n); */ uint8_t *nghttp3_put_uint16be(uint8_t *p, uint16_t n); -/* - * nghttp3_put_uvarint writes |n| in |p| using variable-length integer - * encoding. It returns the one beyond of the last written position. - */ -uint8_t *nghttp3_put_uvarint(uint8_t *p, uint64_t n); - -/* - * nghttp3_put_uvarintlen returns the required number of bytes to - * encode |n|. - */ -size_t nghttp3_put_uvarintlen(uint64_t n); - /* * nghttp3_ord_stream_id returns the ordinal number of |stream_id|. */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_err.c b/deps/ngtcp2/nghttp3/lib/nghttp3_err.c index eff6ea6a63a2f7..e6603c00f041f5 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_err.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_err.c @@ -76,6 +76,10 @@ const char *nghttp3_strerror(int liberr) { return "ERR_H3_STREAM_CREATION_ERROR"; case NGHTTP3_ERR_H3_EXCESSIVE_LOAD: return "ERR_H3_EXCESSIVE_LOAD"; + case NGHTTP3_ERR_WT_SESSION_GONE: + return "ERR_WT_SESSION_GONE"; + case NGHTTP3_ERR_WT_BUFFERED_STREAM_REJECTED: + return "ERR_WT_BUFFERED_STREAM_REJECTED"; case NGHTTP3_ERR_NOMEM: return "ERR_NOMEM"; case NGHTTP3_ERR_CALLBACK_FAILURE: @@ -122,7 +126,12 @@ uint64_t nghttp3_err_infer_quic_app_error_code(int liberr) { return NGHTTP3_H3_EXCESSIVE_LOAD; case NGHTTP3_ERR_MALFORMED_HTTP_HEADER: case NGHTTP3_ERR_MALFORMED_HTTP_MESSAGING: + case NGHTTP3_ERR_H3_MESSAGE_ERROR: return NGHTTP3_H3_MESSAGE_ERROR; + case NGHTTP3_ERR_WT_SESSION_GONE: + return NGHTTP3_WT_SESSION_GONE; + case NGHTTP3_ERR_WT_BUFFERED_STREAM_REJECTED: + return NGHTTP3_WT_BUFFERED_STREAM_REJECTED; default: return NGHTTP3_H3_GENERAL_PROTOCOL_ERROR; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_frame.c b/deps/ngtcp2/nghttp3/lib/nghttp3_frame.c index 2efba7472c251f..1742e0756fc665 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_frame.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_frame.c @@ -133,6 +133,44 @@ size_t nghttp3_frame_write_origin_len(uint64_t *ppayloadlen, payloadlen; } +uint8_t *nghttp3_frame_write_wt_stream(uint8_t *p, + const nghttp3_exfr_wt_stream *fr) { + p = nghttp3_put_uvarint(p, fr->type); + return nghttp3_put_uvarint(p, (uint64_t)fr->session_id); +} + +size_t nghttp3_frame_write_wt_stream_len(const nghttp3_exfr_wt_stream *fr) { + return nghttp3_put_uvarintlen(fr->type) + + nghttp3_put_uvarintlen((uint64_t)fr->session_id); +} + +uint8_t *nghttp3_frame_write_cpsl_wt_close_session( + uint8_t *p, const nghttp3_exfr_cpsl_wt_close_session *fr, + uint64_t payloadlen) { + p = nghttp3_frame_write_hd(p, NGHTTP3_FRAME_DATA, payloadlen); + p = nghttp3_frame_write_hd(p, fr->type, + sizeof(fr->error_code) + fr->error_msg.len); + p = nghttp3_put_uint32be(p, fr->error_code); + + if (fr->error_msg.len) { + p = nghttp3_cpymem(p, fr->error_msg.base, fr->error_msg.len); + } + + return p; +} + +size_t nghttp3_frame_write_cpsl_wt_close_session_len( + uint64_t *ppayloadlen, const nghttp3_exfr_cpsl_wt_close_session *fr) { + size_t cpsl_payloadlen = sizeof(fr->error_code) + fr->error_msg.len; + size_t payloadlen = nghttp3_put_uvarintlen(fr->type) + + nghttp3_put_uvarintlen(cpsl_payloadlen) + cpsl_payloadlen; + + *ppayloadlen = payloadlen; + + return nghttp3_put_uvarintlen(NGHTTP3_FRAME_DATA) + + nghttp3_put_uvarintlen(payloadlen) + payloadlen; +} + int nghttp3_nva_copy(nghttp3_nv **pnva, const nghttp3_nv *nva, size_t nvlen, const nghttp3_mem *mem) { size_t i; diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_frame.h b/deps/ngtcp2/nghttp3/lib/nghttp3_frame.h index 7806cadbcf5f5a..77b4d37b8fb293 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_frame.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_frame.h @@ -46,6 +46,24 @@ #define NGHTTP3_FRAME_PRIORITY_UPDATE_PUSH_ID 0x0F0701U /* ORIGIN: https://datatracker.ietf.org/doc/html/rfc9412 */ #define NGHTTP3_FRAME_ORIGIN 0x0CU +/* WebTransport extended frame type */ +#define NGHTTP3_FRAME_EX_WT 0x4000000000000001ULL +/* WT_STREAM: + https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-http3-14 */ +#define NGHTTP3_EXFR_WT_STREAM_BIDI 0x41U +#define NGHTTP3_EXFR_WT_STREAM_UNI 0x54U +#define NGHTTP3_EXFR_WT_STREAM_DATA 0x00U + +/* HTTP Capsule extended frame type */ +#define NGHTTP3_FRAME_EX_CPSL 0x4000000000000002ULL +#define NGHTTP3_EXFR_CPSL_WT_CLOSE_SESSION 0x2843U +#define NGHTTP3_EXFR_CPSL_WT_DRAIN_SESSION 0x78AEU +#define NGHTTP3_EXFR_CPSL_WT_MAX_STREAMS_BIDI 0x190B4D3FU +#define NGHTTP3_EXFR_CPSL_WT_MAX_STREAMS_UNI 0x190B4D40U +#define NGHTTP3_EXFR_CPSL_WT_STREAMS_BLOCKED_BIDI 0x190B4D43U +#define NGHTTP3_EXFR_CPSL_WT_STREAMS_BLOCKED_UNI 0x190B4D44U +#define NGHTTP3_EXFR_CPSL_WT_MAX_DATA 0x190B4D3DU +#define NGHTTP3_EXFR_CPSL_WT_DATA_BLOCKED 0x190B4D41U /* Frame types that are reserved for HTTP/2, and must not be used in HTTP/3. */ @@ -76,6 +94,14 @@ typedef struct nghttp3_frame_headers { #define NGHTTP3_SETTINGS_ID_QPACK_BLOCKED_STREAMS 0x07U #define NGHTTP3_SETTINGS_ID_ENABLE_CONNECT_PROTOCOL 0x08U #define NGHTTP3_SETTINGS_ID_H3_DATAGRAM 0x33U +/* https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-http3-15 */ +#define NGHTTP3_SETTINGS_ID_WT_ENABLED 0x2C7CF000U +/* https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-http3-14 */ +#define NGHTTP3_SETTINGS_ID_WT_MAX_SESSIONS 0x14E9CD29U +/* https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-http3-07 */ +#define NGHTTP3_SETTINGS_ID_WT_MAX_SESSIONS_DRAFT7 0xC671706AU +/* https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-http3-02 */ +#define NGHTTP3_SETTINGS_ID_ENABLE_WEBTRANSPORT_DRAFT2 0x2B603742U #define NGHTTP3_H2_SETTINGS_ID_ENABLE_PUSH 0x2U #define NGHTTP3_H2_SETTINGS_ID_MAX_CONCURRENT_STREAMS 0x3U @@ -132,6 +158,42 @@ typedef struct nghttp3_frame_origin { nghttp3_vec origin_list; } nghttp3_frame_origin; +typedef struct nghttp3_exfr_hd { + uint64_t type; +} nghttp3_exfr_hd; + +typedef struct nghttp3_exfr_wt_stream { + uint64_t type; + int64_t session_id; + nghttp3_data_reader dr; +} nghttp3_exfr_wt_stream; + +typedef union nghttp3_exfr_wt { + nghttp3_exfr_hd hd; + nghttp3_exfr_wt_stream wt_stream; +} nghttp3_exfr_wt; + +typedef struct nghttp3_frame_ex_wt { + uint64_t type; + nghttp3_exfr_wt fr; +} nghttp3_frame_ex_wt; + +typedef struct nghttp3_exfr_cpsl_wt_close_session { + uint64_t type; + nghttp3_vec error_msg; + uint32_t error_code; +} nghttp3_exfr_cpsl_wt_close_session; + +typedef union nghttp3_exfr_cpsl { + nghttp3_exfr_hd hd; + nghttp3_exfr_cpsl_wt_close_session wt_close_session; +} nghttp3_exfr_cpsl; + +typedef struct nghttp3_frame_ex_cpsl { + uint64_t type; + nghttp3_exfr_cpsl fr; +} nghttp3_frame_ex_cpsl; + typedef union nghttp3_frame { nghttp3_frame_hd hd; nghttp3_frame_data data; @@ -140,6 +202,8 @@ typedef union nghttp3_frame { nghttp3_frame_goaway goaway; nghttp3_frame_priority_update priority_update; nghttp3_frame_origin origin; + nghttp3_frame_ex_wt wt; + nghttp3_frame_ex_cpsl cpsl; } nghttp3_frame; /* @@ -233,6 +297,18 @@ uint8_t *nghttp3_frame_write_origin(uint8_t *dest, size_t nghttp3_frame_write_origin_len(uint64_t *ppayloadlen, const nghttp3_frame_origin *fr); +uint8_t *nghttp3_frame_write_wt_stream(uint8_t *dest, + const nghttp3_exfr_wt_stream *fr); + +size_t nghttp3_frame_write_wt_stream_len(const nghttp3_exfr_wt_stream *fr); + +uint8_t *nghttp3_frame_write_cpsl_wt_close_session( + uint8_t *dest, const nghttp3_exfr_cpsl_wt_close_session *fr, + uint64_t payloadlen); + +size_t nghttp3_frame_write_cpsl_wt_close_session_len( + uint64_t *ppayloadlen, const nghttp3_exfr_cpsl_wt_close_session *fr); + /* * nghttp3_nva_copy copies name/value pairs from |nva|, which contains * |nvlen| pairs, to |*nva_ptr|, which is dynamically allocated so diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_http.c b/deps/ngtcp2/nghttp3/lib/nghttp3_http.c index 95e1474f9aef5e..9f7a16ac2e4849 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_http.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_http.c @@ -36,12 +36,9 @@ #include "nghttp3_macro.h" #include "nghttp3_conv.h" #include "nghttp3_unreachable.h" +#include "nghttp3_str.h" #include "sfparse/sfparse.h" -static uint8_t downcase(uint8_t c) { - return 'A' <= c && c <= 'Z' ? (uint8_t)(c - 'A' + 'a') : c; -} - /* * memieq returns 1 if the data pointed by |a| of length |n| equals to * |b| of the same length in case-insensitive manner. The data @@ -52,7 +49,7 @@ static int memieq(const void *a, const void *b, size_t n) { const uint8_t *aa = a, *bb = b; for (i = 0; i < n; ++i) { - if (aa[i] != downcase(bb[i])) { + if (aa[i] != nghttp3_downcase_byte(bb[i])) { return 0; } } @@ -387,6 +384,11 @@ static int http_request_on_header(nghttp3_http_state *http, !check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__PROTOCOL)) { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } + + if (lstrieq("webtransport", nv->value->base, nv->value->len)) { + http->flags |= NGHTTP3_HTTP_FLAG_WEBTRANSPORT; + } + break; case NGHTTP3_QPACK_TOKEN_HOST: if (!check_authority(nv->value->base, nv->value->len)) { @@ -704,7 +706,7 @@ int nghttp3_check_header_name(const uint8_t *name, size_t len) { --len; } for (last = name + len; name != last; ++name) { - if (!VALID_HD_NAME_CHARS[*name]) { + if (VALID_HD_NAME_CHARS[*name] != 1) { return 0; } } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_http.h b/deps/ngtcp2/nghttp3/lib/nghttp3_http.h index 2bdf3110027c15..ec32414c1d1d5a 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_http.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_http.h @@ -82,6 +82,8 @@ typedef struct nghttp3_http_state nghttp3_http_state; while parsing priority header field. */ #define NGHTTP3_HTTP_FLAG_BAD_PRIORITY 0x010000U +#define NGHTTP3_HTTP_FLAG_WEBTRANSPORT 0x020000U + /* * This function is called when HTTP header field |nv| received for * |http|. This function will validate |nv| against the current state diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.c b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.c index b784ca9970c0b4..618e95cc4ee235 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.c @@ -80,7 +80,7 @@ uint8_t *nghttp3_qpack_huffman_encode(uint8_t *dest, const uint8_t *src, void nghttp3_qpack_huffman_decode_context_init( nghttp3_qpack_huffman_decode_context *ctx) { *ctx = (nghttp3_qpack_huffman_decode_context){ - .flags = NGHTTP3_QPACK_HUFFMAN_ACCEPTED, + .flags = NGHTTP3_QPACK_HUFFMAN_FLAG_ACCEPTED, }; } @@ -103,12 +103,12 @@ nghttp3_qpack_huffman_decode(nghttp3_qpack_huffman_decode_context *ctx, for (; src != end;) { c = *src++; t = qpack_huffman_decode_table[t.fstate][c >> 4]; - if (t.flags & NGHTTP3_QPACK_HUFFMAN_SYM) { + if (t.flags & NGHTTP3_QPACK_HUFFMAN_FLAG_SYM) { *p++ = t.sym; } t = qpack_huffman_decode_table[t.fstate][c & 0xFU]; - if (t.flags & NGHTTP3_QPACK_HUFFMAN_SYM) { + if (t.flags & NGHTTP3_QPACK_HUFFMAN_FLAG_SYM) { *p++ = t.sym; } } @@ -116,7 +116,7 @@ nghttp3_qpack_huffman_decode(nghttp3_qpack_huffman_decode_context *ctx, ctx->fstate = t.fstate; ctx->flags = t.flags; - if (fin && !(ctx->flags & NGHTTP3_QPACK_HUFFMAN_ACCEPTED)) { + if (fin && !(ctx->flags & NGHTTP3_QPACK_HUFFMAN_FLAG_ACCEPTED)) { return NGHTTP3_ERR_QPACK_FATAL; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.h b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.h index 2fce4de6f011ec..a7d788dcb964be 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.h @@ -46,25 +46,24 @@ size_t nghttp3_qpack_huffman_encode_count(const uint8_t *src, size_t len); uint8_t *nghttp3_qpack_huffman_encode(uint8_t *dest, const uint8_t *src, size_t srclen); -typedef enum nghttp3_qpack_huffman_decode_flag { - /* FSA accepts this state as the end of huffman encoding - sequence. */ - NGHTTP3_QPACK_HUFFMAN_ACCEPTED = 1, - /* This state emits symbol */ - NGHTTP3_QPACK_HUFFMAN_SYM = 1 << 1, -} nghttp3_qpack_huffman_decode_flag; +/* NGHTTP3_QPACK_HUFFMAN_FLAG_ACCEPTED indicates that FSA accepts this + state as the end of huffman encoding sequence. */ +#define NGHTTP3_QPACK_HUFFMAN_FLAG_ACCEPTED 0x01U +/* NGHTTP3_QPACK_HUFFMAN_FLAG_SYM indicates that this state emits + symbol */ +#define NGHTTP3_QPACK_HUFFMAN_FLAG_SYM 0x02U typedef struct nghttp3_qpack_huffman_decode_node { /* fstate is the current huffman decoding state, which is actually the node ID of internal huffman tree with - nghttp3_qpack_huffman_decode_flag OR-ed. We have 257 leaf nodes, - but they are identical to root node other than emitting a symbol, - so we have 256 internal nodes [1..256], inclusive. The node ID - 256 is a special node and it is a terminal state that means - decoding failed. */ + NGHTTP3_QPACK_HUFFMAN_FLAG_* flags OR-ed. We have 257 leaf + nodes, but they are identical to root node other than emitting a + symbol, so we have 256 internal nodes [1..256], inclusive. The + node ID 256 is a special node and it is a terminal state that + means decoding failed. */ uint16_t fstate; uint8_t flags; - /* symbol if NGHTTP3_QPACK_HUFFMAN_SYM flag set */ + /* symbol if NGHTTP3_QPACK_HUFFMAN_FLAG_SYM flag set */ uint8_t sym; } nghttp3_qpack_huffman_decode_node; diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman_data.c b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman_data.c index ffe8fcafadb667..9a6614a1539783 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman_data.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman_data.c @@ -92,4890 +92,4891 @@ const nghttp3_qpack_huffman_sym huffman_sym_table[] = { {27, 0xFFFFFCE0U}, {27, 0xFFFFFD00U}, {27, 0xFFFFFD20U}, {27, 0xFFFFFD40U}, {27, 0xFFFFFD60U}, {28, 0xFFFFFFE0U}, {27, 0xFFFFFD80U}, {27, 0xFFFFFDA0U}, {27, 0xFFFFFDC0U}, {27, 0xFFFFFDE0U}, {27, 0xFFFFFE00U}, {26, 0xFFFFFB80U}, - {30, 0xFFFFFFFCU}}; + {30, 0xFFFFFFFCU}, +}; const nghttp3_qpack_huffman_decode_node qpack_huffman_decode_table[][16] = { /* 0 */ { - {0x04, 0, 0}, - {0x05, 0, 0}, - {0x07, 0, 0}, - {0x08, 0, 0}, - {0x0B, 0, 0}, - {0x0C, 0, 0}, - {0x10, 0, 0}, - {0x13, 0, 0}, - {0x19, 0, 0}, - {0x1C, 0, 0}, - {0x20, 0, 0}, - {0x23, 0, 0}, - {0x2A, 0, 0}, - {0x31, 0, 0}, - {0x39, 0, 0}, - {0x40, 1, 0}, + {0x04, 0x00, 0x00}, + {0x05, 0x00, 0x00}, + {0x07, 0x00, 0x00}, + {0x08, 0x00, 0x00}, + {0x0B, 0x00, 0x00}, + {0x0C, 0x00, 0x00}, + {0x10, 0x00, 0x00}, + {0x13, 0x00, 0x00}, + {0x19, 0x00, 0x00}, + {0x1C, 0x00, 0x00}, + {0x20, 0x00, 0x00}, + {0x23, 0x00, 0x00}, + {0x2A, 0x00, 0x00}, + {0x31, 0x00, 0x00}, + {0x39, 0x00, 0x00}, + {0x40, 0x01, 0x00}, }, /* 1 */ { - {0x00, 3, 48}, - {0x00, 3, 49}, - {0x00, 3, 50}, - {0x00, 3, 97}, - {0x00, 3, 99}, - {0x00, 3, 101}, - {0x00, 3, 105}, - {0x00, 3, 111}, - {0x00, 3, 115}, - {0x00, 3, 116}, - {0x0D, 0, 0}, - {0x0E, 0, 0}, - {0x11, 0, 0}, - {0x12, 0, 0}, - {0x14, 0, 0}, - {0x15, 0, 0}, + {0x00, 0x03, 0x30}, + {0x00, 0x03, 0x31}, + {0x00, 0x03, 0x32}, + {0x00, 0x03, 0x61}, + {0x00, 0x03, 0x63}, + {0x00, 0x03, 0x65}, + {0x00, 0x03, 0x69}, + {0x00, 0x03, 0x6F}, + {0x00, 0x03, 0x73}, + {0x00, 0x03, 0x74}, + {0x0D, 0x00, 0x00}, + {0x0E, 0x00, 0x00}, + {0x11, 0x00, 0x00}, + {0x12, 0x00, 0x00}, + {0x14, 0x00, 0x00}, + {0x15, 0x00, 0x00}, }, /* 2 */ { - {0x01, 2, 48}, - {0x16, 3, 48}, - {0x01, 2, 49}, - {0x16, 3, 49}, - {0x01, 2, 50}, - {0x16, 3, 50}, - {0x01, 2, 97}, - {0x16, 3, 97}, - {0x01, 2, 99}, - {0x16, 3, 99}, - {0x01, 2, 101}, - {0x16, 3, 101}, - {0x01, 2, 105}, - {0x16, 3, 105}, - {0x01, 2, 111}, - {0x16, 3, 111}, + {0x01, 0x02, 0x30}, + {0x16, 0x03, 0x30}, + {0x01, 0x02, 0x31}, + {0x16, 0x03, 0x31}, + {0x01, 0x02, 0x32}, + {0x16, 0x03, 0x32}, + {0x01, 0x02, 0x61}, + {0x16, 0x03, 0x61}, + {0x01, 0x02, 0x63}, + {0x16, 0x03, 0x63}, + {0x01, 0x02, 0x65}, + {0x16, 0x03, 0x65}, + {0x01, 0x02, 0x69}, + {0x16, 0x03, 0x69}, + {0x01, 0x02, 0x6F}, + {0x16, 0x03, 0x6F}, }, /* 3 */ { - {0x02, 2, 48}, - {0x09, 2, 48}, - {0x17, 2, 48}, - {0x28, 3, 48}, - {0x02, 2, 49}, - {0x09, 2, 49}, - {0x17, 2, 49}, - {0x28, 3, 49}, - {0x02, 2, 50}, - {0x09, 2, 50}, - {0x17, 2, 50}, - {0x28, 3, 50}, - {0x02, 2, 97}, - {0x09, 2, 97}, - {0x17, 2, 97}, - {0x28, 3, 97}, + {0x02, 0x02, 0x30}, + {0x09, 0x02, 0x30}, + {0x17, 0x02, 0x30}, + {0x28, 0x03, 0x30}, + {0x02, 0x02, 0x31}, + {0x09, 0x02, 0x31}, + {0x17, 0x02, 0x31}, + {0x28, 0x03, 0x31}, + {0x02, 0x02, 0x32}, + {0x09, 0x02, 0x32}, + {0x17, 0x02, 0x32}, + {0x28, 0x03, 0x32}, + {0x02, 0x02, 0x61}, + {0x09, 0x02, 0x61}, + {0x17, 0x02, 0x61}, + {0x28, 0x03, 0x61}, }, /* 4 */ { - {0x03, 2, 48}, - {0x06, 2, 48}, - {0x0A, 2, 48}, - {0x0F, 2, 48}, - {0x18, 2, 48}, - {0x1F, 2, 48}, - {0x29, 2, 48}, - {0x38, 3, 48}, - {0x03, 2, 49}, - {0x06, 2, 49}, - {0x0A, 2, 49}, - {0x0F, 2, 49}, - {0x18, 2, 49}, - {0x1F, 2, 49}, - {0x29, 2, 49}, - {0x38, 3, 49}, + {0x03, 0x02, 0x30}, + {0x06, 0x02, 0x30}, + {0x0A, 0x02, 0x30}, + {0x0F, 0x02, 0x30}, + {0x18, 0x02, 0x30}, + {0x1F, 0x02, 0x30}, + {0x29, 0x02, 0x30}, + {0x38, 0x03, 0x30}, + {0x03, 0x02, 0x31}, + {0x06, 0x02, 0x31}, + {0x0A, 0x02, 0x31}, + {0x0F, 0x02, 0x31}, + {0x18, 0x02, 0x31}, + {0x1F, 0x02, 0x31}, + {0x29, 0x02, 0x31}, + {0x38, 0x03, 0x31}, }, /* 5 */ { - {0x03, 2, 50}, - {0x06, 2, 50}, - {0x0A, 2, 50}, - {0x0F, 2, 50}, - {0x18, 2, 50}, - {0x1F, 2, 50}, - {0x29, 2, 50}, - {0x38, 3, 50}, - {0x03, 2, 97}, - {0x06, 2, 97}, - {0x0A, 2, 97}, - {0x0F, 2, 97}, - {0x18, 2, 97}, - {0x1F, 2, 97}, - {0x29, 2, 97}, - {0x38, 3, 97}, + {0x03, 0x02, 0x32}, + {0x06, 0x02, 0x32}, + {0x0A, 0x02, 0x32}, + {0x0F, 0x02, 0x32}, + {0x18, 0x02, 0x32}, + {0x1F, 0x02, 0x32}, + {0x29, 0x02, 0x32}, + {0x38, 0x03, 0x32}, + {0x03, 0x02, 0x61}, + {0x06, 0x02, 0x61}, + {0x0A, 0x02, 0x61}, + {0x0F, 0x02, 0x61}, + {0x18, 0x02, 0x61}, + {0x1F, 0x02, 0x61}, + {0x29, 0x02, 0x61}, + {0x38, 0x03, 0x61}, }, /* 6 */ { - {0x02, 2, 99}, - {0x09, 2, 99}, - {0x17, 2, 99}, - {0x28, 3, 99}, - {0x02, 2, 101}, - {0x09, 2, 101}, - {0x17, 2, 101}, - {0x28, 3, 101}, - {0x02, 2, 105}, - {0x09, 2, 105}, - {0x17, 2, 105}, - {0x28, 3, 105}, - {0x02, 2, 111}, - {0x09, 2, 111}, - {0x17, 2, 111}, - {0x28, 3, 111}, + {0x02, 0x02, 0x63}, + {0x09, 0x02, 0x63}, + {0x17, 0x02, 0x63}, + {0x28, 0x03, 0x63}, + {0x02, 0x02, 0x65}, + {0x09, 0x02, 0x65}, + {0x17, 0x02, 0x65}, + {0x28, 0x03, 0x65}, + {0x02, 0x02, 0x69}, + {0x09, 0x02, 0x69}, + {0x17, 0x02, 0x69}, + {0x28, 0x03, 0x69}, + {0x02, 0x02, 0x6F}, + {0x09, 0x02, 0x6F}, + {0x17, 0x02, 0x6F}, + {0x28, 0x03, 0x6F}, }, /* 7 */ { - {0x03, 2, 99}, - {0x06, 2, 99}, - {0x0A, 2, 99}, - {0x0F, 2, 99}, - {0x18, 2, 99}, - {0x1F, 2, 99}, - {0x29, 2, 99}, - {0x38, 3, 99}, - {0x03, 2, 101}, - {0x06, 2, 101}, - {0x0A, 2, 101}, - {0x0F, 2, 101}, - {0x18, 2, 101}, - {0x1F, 2, 101}, - {0x29, 2, 101}, - {0x38, 3, 101}, + {0x03, 0x02, 0x63}, + {0x06, 0x02, 0x63}, + {0x0A, 0x02, 0x63}, + {0x0F, 0x02, 0x63}, + {0x18, 0x02, 0x63}, + {0x1F, 0x02, 0x63}, + {0x29, 0x02, 0x63}, + {0x38, 0x03, 0x63}, + {0x03, 0x02, 0x65}, + {0x06, 0x02, 0x65}, + {0x0A, 0x02, 0x65}, + {0x0F, 0x02, 0x65}, + {0x18, 0x02, 0x65}, + {0x1F, 0x02, 0x65}, + {0x29, 0x02, 0x65}, + {0x38, 0x03, 0x65}, }, /* 8 */ { - {0x03, 2, 105}, - {0x06, 2, 105}, - {0x0A, 2, 105}, - {0x0F, 2, 105}, - {0x18, 2, 105}, - {0x1F, 2, 105}, - {0x29, 2, 105}, - {0x38, 3, 105}, - {0x03, 2, 111}, - {0x06, 2, 111}, - {0x0A, 2, 111}, - {0x0F, 2, 111}, - {0x18, 2, 111}, - {0x1F, 2, 111}, - {0x29, 2, 111}, - {0x38, 3, 111}, + {0x03, 0x02, 0x69}, + {0x06, 0x02, 0x69}, + {0x0A, 0x02, 0x69}, + {0x0F, 0x02, 0x69}, + {0x18, 0x02, 0x69}, + {0x1F, 0x02, 0x69}, + {0x29, 0x02, 0x69}, + {0x38, 0x03, 0x69}, + {0x03, 0x02, 0x6F}, + {0x06, 0x02, 0x6F}, + {0x0A, 0x02, 0x6F}, + {0x0F, 0x02, 0x6F}, + {0x18, 0x02, 0x6F}, + {0x1F, 0x02, 0x6F}, + {0x29, 0x02, 0x6F}, + {0x38, 0x03, 0x6F}, }, /* 9 */ { - {0x01, 2, 115}, - {0x16, 3, 115}, - {0x01, 2, 116}, - {0x16, 3, 116}, - {0x00, 3, 32}, - {0x00, 3, 37}, - {0x00, 3, 45}, - {0x00, 3, 46}, - {0x00, 3, 47}, - {0x00, 3, 51}, - {0x00, 3, 52}, - {0x00, 3, 53}, - {0x00, 3, 54}, - {0x00, 3, 55}, - {0x00, 3, 56}, - {0x00, 3, 57}, + {0x01, 0x02, 0x73}, + {0x16, 0x03, 0x73}, + {0x01, 0x02, 0x74}, + {0x16, 0x03, 0x74}, + {0x00, 0x03, 0x20}, + {0x00, 0x03, 0x25}, + {0x00, 0x03, 0x2D}, + {0x00, 0x03, 0x2E}, + {0x00, 0x03, 0x2F}, + {0x00, 0x03, 0x33}, + {0x00, 0x03, 0x34}, + {0x00, 0x03, 0x35}, + {0x00, 0x03, 0x36}, + {0x00, 0x03, 0x37}, + {0x00, 0x03, 0x38}, + {0x00, 0x03, 0x39}, }, /* 10 */ { - {0x02, 2, 115}, - {0x09, 2, 115}, - {0x17, 2, 115}, - {0x28, 3, 115}, - {0x02, 2, 116}, - {0x09, 2, 116}, - {0x17, 2, 116}, - {0x28, 3, 116}, - {0x01, 2, 32}, - {0x16, 3, 32}, - {0x01, 2, 37}, - {0x16, 3, 37}, - {0x01, 2, 45}, - {0x16, 3, 45}, - {0x01, 2, 46}, - {0x16, 3, 46}, + {0x02, 0x02, 0x73}, + {0x09, 0x02, 0x73}, + {0x17, 0x02, 0x73}, + {0x28, 0x03, 0x73}, + {0x02, 0x02, 0x74}, + {0x09, 0x02, 0x74}, + {0x17, 0x02, 0x74}, + {0x28, 0x03, 0x74}, + {0x01, 0x02, 0x20}, + {0x16, 0x03, 0x20}, + {0x01, 0x02, 0x25}, + {0x16, 0x03, 0x25}, + {0x01, 0x02, 0x2D}, + {0x16, 0x03, 0x2D}, + {0x01, 0x02, 0x2E}, + {0x16, 0x03, 0x2E}, }, /* 11 */ { - {0x03, 2, 115}, - {0x06, 2, 115}, - {0x0A, 2, 115}, - {0x0F, 2, 115}, - {0x18, 2, 115}, - {0x1F, 2, 115}, - {0x29, 2, 115}, - {0x38, 3, 115}, - {0x03, 2, 116}, - {0x06, 2, 116}, - {0x0A, 2, 116}, - {0x0F, 2, 116}, - {0x18, 2, 116}, - {0x1F, 2, 116}, - {0x29, 2, 116}, - {0x38, 3, 116}, + {0x03, 0x02, 0x73}, + {0x06, 0x02, 0x73}, + {0x0A, 0x02, 0x73}, + {0x0F, 0x02, 0x73}, + {0x18, 0x02, 0x73}, + {0x1F, 0x02, 0x73}, + {0x29, 0x02, 0x73}, + {0x38, 0x03, 0x73}, + {0x03, 0x02, 0x74}, + {0x06, 0x02, 0x74}, + {0x0A, 0x02, 0x74}, + {0x0F, 0x02, 0x74}, + {0x18, 0x02, 0x74}, + {0x1F, 0x02, 0x74}, + {0x29, 0x02, 0x74}, + {0x38, 0x03, 0x74}, }, /* 12 */ { - {0x02, 2, 32}, - {0x09, 2, 32}, - {0x17, 2, 32}, - {0x28, 3, 32}, - {0x02, 2, 37}, - {0x09, 2, 37}, - {0x17, 2, 37}, - {0x28, 3, 37}, - {0x02, 2, 45}, - {0x09, 2, 45}, - {0x17, 2, 45}, - {0x28, 3, 45}, - {0x02, 2, 46}, - {0x09, 2, 46}, - {0x17, 2, 46}, - {0x28, 3, 46}, + {0x02, 0x02, 0x20}, + {0x09, 0x02, 0x20}, + {0x17, 0x02, 0x20}, + {0x28, 0x03, 0x20}, + {0x02, 0x02, 0x25}, + {0x09, 0x02, 0x25}, + {0x17, 0x02, 0x25}, + {0x28, 0x03, 0x25}, + {0x02, 0x02, 0x2D}, + {0x09, 0x02, 0x2D}, + {0x17, 0x02, 0x2D}, + {0x28, 0x03, 0x2D}, + {0x02, 0x02, 0x2E}, + {0x09, 0x02, 0x2E}, + {0x17, 0x02, 0x2E}, + {0x28, 0x03, 0x2E}, }, /* 13 */ { - {0x03, 2, 32}, - {0x06, 2, 32}, - {0x0A, 2, 32}, - {0x0F, 2, 32}, - {0x18, 2, 32}, - {0x1F, 2, 32}, - {0x29, 2, 32}, - {0x38, 3, 32}, - {0x03, 2, 37}, - {0x06, 2, 37}, - {0x0A, 2, 37}, - {0x0F, 2, 37}, - {0x18, 2, 37}, - {0x1F, 2, 37}, - {0x29, 2, 37}, - {0x38, 3, 37}, + {0x03, 0x02, 0x20}, + {0x06, 0x02, 0x20}, + {0x0A, 0x02, 0x20}, + {0x0F, 0x02, 0x20}, + {0x18, 0x02, 0x20}, + {0x1F, 0x02, 0x20}, + {0x29, 0x02, 0x20}, + {0x38, 0x03, 0x20}, + {0x03, 0x02, 0x25}, + {0x06, 0x02, 0x25}, + {0x0A, 0x02, 0x25}, + {0x0F, 0x02, 0x25}, + {0x18, 0x02, 0x25}, + {0x1F, 0x02, 0x25}, + {0x29, 0x02, 0x25}, + {0x38, 0x03, 0x25}, }, /* 14 */ { - {0x03, 2, 45}, - {0x06, 2, 45}, - {0x0A, 2, 45}, - {0x0F, 2, 45}, - {0x18, 2, 45}, - {0x1F, 2, 45}, - {0x29, 2, 45}, - {0x38, 3, 45}, - {0x03, 2, 46}, - {0x06, 2, 46}, - {0x0A, 2, 46}, - {0x0F, 2, 46}, - {0x18, 2, 46}, - {0x1F, 2, 46}, - {0x29, 2, 46}, - {0x38, 3, 46}, + {0x03, 0x02, 0x2D}, + {0x06, 0x02, 0x2D}, + {0x0A, 0x02, 0x2D}, + {0x0F, 0x02, 0x2D}, + {0x18, 0x02, 0x2D}, + {0x1F, 0x02, 0x2D}, + {0x29, 0x02, 0x2D}, + {0x38, 0x03, 0x2D}, + {0x03, 0x02, 0x2E}, + {0x06, 0x02, 0x2E}, + {0x0A, 0x02, 0x2E}, + {0x0F, 0x02, 0x2E}, + {0x18, 0x02, 0x2E}, + {0x1F, 0x02, 0x2E}, + {0x29, 0x02, 0x2E}, + {0x38, 0x03, 0x2E}, }, /* 15 */ { - {0x01, 2, 47}, - {0x16, 3, 47}, - {0x01, 2, 51}, - {0x16, 3, 51}, - {0x01, 2, 52}, - {0x16, 3, 52}, - {0x01, 2, 53}, - {0x16, 3, 53}, - {0x01, 2, 54}, - {0x16, 3, 54}, - {0x01, 2, 55}, - {0x16, 3, 55}, - {0x01, 2, 56}, - {0x16, 3, 56}, - {0x01, 2, 57}, - {0x16, 3, 57}, + {0x01, 0x02, 0x2F}, + {0x16, 0x03, 0x2F}, + {0x01, 0x02, 0x33}, + {0x16, 0x03, 0x33}, + {0x01, 0x02, 0x34}, + {0x16, 0x03, 0x34}, + {0x01, 0x02, 0x35}, + {0x16, 0x03, 0x35}, + {0x01, 0x02, 0x36}, + {0x16, 0x03, 0x36}, + {0x01, 0x02, 0x37}, + {0x16, 0x03, 0x37}, + {0x01, 0x02, 0x38}, + {0x16, 0x03, 0x38}, + {0x01, 0x02, 0x39}, + {0x16, 0x03, 0x39}, }, /* 16 */ { - {0x02, 2, 47}, - {0x09, 2, 47}, - {0x17, 2, 47}, - {0x28, 3, 47}, - {0x02, 2, 51}, - {0x09, 2, 51}, - {0x17, 2, 51}, - {0x28, 3, 51}, - {0x02, 2, 52}, - {0x09, 2, 52}, - {0x17, 2, 52}, - {0x28, 3, 52}, - {0x02, 2, 53}, - {0x09, 2, 53}, - {0x17, 2, 53}, - {0x28, 3, 53}, + {0x02, 0x02, 0x2F}, + {0x09, 0x02, 0x2F}, + {0x17, 0x02, 0x2F}, + {0x28, 0x03, 0x2F}, + {0x02, 0x02, 0x33}, + {0x09, 0x02, 0x33}, + {0x17, 0x02, 0x33}, + {0x28, 0x03, 0x33}, + {0x02, 0x02, 0x34}, + {0x09, 0x02, 0x34}, + {0x17, 0x02, 0x34}, + {0x28, 0x03, 0x34}, + {0x02, 0x02, 0x35}, + {0x09, 0x02, 0x35}, + {0x17, 0x02, 0x35}, + {0x28, 0x03, 0x35}, }, /* 17 */ { - {0x03, 2, 47}, - {0x06, 2, 47}, - {0x0A, 2, 47}, - {0x0F, 2, 47}, - {0x18, 2, 47}, - {0x1F, 2, 47}, - {0x29, 2, 47}, - {0x38, 3, 47}, - {0x03, 2, 51}, - {0x06, 2, 51}, - {0x0A, 2, 51}, - {0x0F, 2, 51}, - {0x18, 2, 51}, - {0x1F, 2, 51}, - {0x29, 2, 51}, - {0x38, 3, 51}, + {0x03, 0x02, 0x2F}, + {0x06, 0x02, 0x2F}, + {0x0A, 0x02, 0x2F}, + {0x0F, 0x02, 0x2F}, + {0x18, 0x02, 0x2F}, + {0x1F, 0x02, 0x2F}, + {0x29, 0x02, 0x2F}, + {0x38, 0x03, 0x2F}, + {0x03, 0x02, 0x33}, + {0x06, 0x02, 0x33}, + {0x0A, 0x02, 0x33}, + {0x0F, 0x02, 0x33}, + {0x18, 0x02, 0x33}, + {0x1F, 0x02, 0x33}, + {0x29, 0x02, 0x33}, + {0x38, 0x03, 0x33}, }, /* 18 */ { - {0x03, 2, 52}, - {0x06, 2, 52}, - {0x0A, 2, 52}, - {0x0F, 2, 52}, - {0x18, 2, 52}, - {0x1F, 2, 52}, - {0x29, 2, 52}, - {0x38, 3, 52}, - {0x03, 2, 53}, - {0x06, 2, 53}, - {0x0A, 2, 53}, - {0x0F, 2, 53}, - {0x18, 2, 53}, - {0x1F, 2, 53}, - {0x29, 2, 53}, - {0x38, 3, 53}, + {0x03, 0x02, 0x34}, + {0x06, 0x02, 0x34}, + {0x0A, 0x02, 0x34}, + {0x0F, 0x02, 0x34}, + {0x18, 0x02, 0x34}, + {0x1F, 0x02, 0x34}, + {0x29, 0x02, 0x34}, + {0x38, 0x03, 0x34}, + {0x03, 0x02, 0x35}, + {0x06, 0x02, 0x35}, + {0x0A, 0x02, 0x35}, + {0x0F, 0x02, 0x35}, + {0x18, 0x02, 0x35}, + {0x1F, 0x02, 0x35}, + {0x29, 0x02, 0x35}, + {0x38, 0x03, 0x35}, }, /* 19 */ { - {0x02, 2, 54}, - {0x09, 2, 54}, - {0x17, 2, 54}, - {0x28, 3, 54}, - {0x02, 2, 55}, - {0x09, 2, 55}, - {0x17, 2, 55}, - {0x28, 3, 55}, - {0x02, 2, 56}, - {0x09, 2, 56}, - {0x17, 2, 56}, - {0x28, 3, 56}, - {0x02, 2, 57}, - {0x09, 2, 57}, - {0x17, 2, 57}, - {0x28, 3, 57}, + {0x02, 0x02, 0x36}, + {0x09, 0x02, 0x36}, + {0x17, 0x02, 0x36}, + {0x28, 0x03, 0x36}, + {0x02, 0x02, 0x37}, + {0x09, 0x02, 0x37}, + {0x17, 0x02, 0x37}, + {0x28, 0x03, 0x37}, + {0x02, 0x02, 0x38}, + {0x09, 0x02, 0x38}, + {0x17, 0x02, 0x38}, + {0x28, 0x03, 0x38}, + {0x02, 0x02, 0x39}, + {0x09, 0x02, 0x39}, + {0x17, 0x02, 0x39}, + {0x28, 0x03, 0x39}, }, /* 20 */ { - {0x03, 2, 54}, - {0x06, 2, 54}, - {0x0A, 2, 54}, - {0x0F, 2, 54}, - {0x18, 2, 54}, - {0x1F, 2, 54}, - {0x29, 2, 54}, - {0x38, 3, 54}, - {0x03, 2, 55}, - {0x06, 2, 55}, - {0x0A, 2, 55}, - {0x0F, 2, 55}, - {0x18, 2, 55}, - {0x1F, 2, 55}, - {0x29, 2, 55}, - {0x38, 3, 55}, + {0x03, 0x02, 0x36}, + {0x06, 0x02, 0x36}, + {0x0A, 0x02, 0x36}, + {0x0F, 0x02, 0x36}, + {0x18, 0x02, 0x36}, + {0x1F, 0x02, 0x36}, + {0x29, 0x02, 0x36}, + {0x38, 0x03, 0x36}, + {0x03, 0x02, 0x37}, + {0x06, 0x02, 0x37}, + {0x0A, 0x02, 0x37}, + {0x0F, 0x02, 0x37}, + {0x18, 0x02, 0x37}, + {0x1F, 0x02, 0x37}, + {0x29, 0x02, 0x37}, + {0x38, 0x03, 0x37}, }, /* 21 */ { - {0x03, 2, 56}, - {0x06, 2, 56}, - {0x0A, 2, 56}, - {0x0F, 2, 56}, - {0x18, 2, 56}, - {0x1F, 2, 56}, - {0x29, 2, 56}, - {0x38, 3, 56}, - {0x03, 2, 57}, - {0x06, 2, 57}, - {0x0A, 2, 57}, - {0x0F, 2, 57}, - {0x18, 2, 57}, - {0x1F, 2, 57}, - {0x29, 2, 57}, - {0x38, 3, 57}, + {0x03, 0x02, 0x38}, + {0x06, 0x02, 0x38}, + {0x0A, 0x02, 0x38}, + {0x0F, 0x02, 0x38}, + {0x18, 0x02, 0x38}, + {0x1F, 0x02, 0x38}, + {0x29, 0x02, 0x38}, + {0x38, 0x03, 0x38}, + {0x03, 0x02, 0x39}, + {0x06, 0x02, 0x39}, + {0x0A, 0x02, 0x39}, + {0x0F, 0x02, 0x39}, + {0x18, 0x02, 0x39}, + {0x1F, 0x02, 0x39}, + {0x29, 0x02, 0x39}, + {0x38, 0x03, 0x39}, }, /* 22 */ { - {0x1A, 0, 0}, - {0x1B, 0, 0}, - {0x1D, 0, 0}, - {0x1E, 0, 0}, - {0x21, 0, 0}, - {0x22, 0, 0}, - {0x24, 0, 0}, - {0x25, 0, 0}, - {0x2B, 0, 0}, - {0x2E, 0, 0}, - {0x32, 0, 0}, - {0x35, 0, 0}, - {0x3A, 0, 0}, - {0x3D, 0, 0}, - {0x41, 0, 0}, - {0x44, 1, 0}, + {0x1A, 0x00, 0x00}, + {0x1B, 0x00, 0x00}, + {0x1D, 0x00, 0x00}, + {0x1E, 0x00, 0x00}, + {0x21, 0x00, 0x00}, + {0x22, 0x00, 0x00}, + {0x24, 0x00, 0x00}, + {0x25, 0x00, 0x00}, + {0x2B, 0x00, 0x00}, + {0x2E, 0x00, 0x00}, + {0x32, 0x00, 0x00}, + {0x35, 0x00, 0x00}, + {0x3A, 0x00, 0x00}, + {0x3D, 0x00, 0x00}, + {0x41, 0x00, 0x00}, + {0x44, 0x01, 0x00}, }, /* 23 */ { - {0x00, 3, 61}, - {0x00, 3, 65}, - {0x00, 3, 95}, - {0x00, 3, 98}, - {0x00, 3, 100}, - {0x00, 3, 102}, - {0x00, 3, 103}, - {0x00, 3, 104}, - {0x00, 3, 108}, - {0x00, 3, 109}, - {0x00, 3, 110}, - {0x00, 3, 112}, - {0x00, 3, 114}, - {0x00, 3, 117}, - {0x26, 0, 0}, - {0x27, 0, 0}, + {0x00, 0x03, 0x3D}, + {0x00, 0x03, 0x41}, + {0x00, 0x03, 0x5F}, + {0x00, 0x03, 0x62}, + {0x00, 0x03, 0x64}, + {0x00, 0x03, 0x66}, + {0x00, 0x03, 0x67}, + {0x00, 0x03, 0x68}, + {0x00, 0x03, 0x6C}, + {0x00, 0x03, 0x6D}, + {0x00, 0x03, 0x6E}, + {0x00, 0x03, 0x70}, + {0x00, 0x03, 0x72}, + {0x00, 0x03, 0x75}, + {0x26, 0x00, 0x00}, + {0x27, 0x00, 0x00}, }, /* 24 */ { - {0x01, 2, 61}, - {0x16, 3, 61}, - {0x01, 2, 65}, - {0x16, 3, 65}, - {0x01, 2, 95}, - {0x16, 3, 95}, - {0x01, 2, 98}, - {0x16, 3, 98}, - {0x01, 2, 100}, - {0x16, 3, 100}, - {0x01, 2, 102}, - {0x16, 3, 102}, - {0x01, 2, 103}, - {0x16, 3, 103}, - {0x01, 2, 104}, - {0x16, 3, 104}, + {0x01, 0x02, 0x3D}, + {0x16, 0x03, 0x3D}, + {0x01, 0x02, 0x41}, + {0x16, 0x03, 0x41}, + {0x01, 0x02, 0x5F}, + {0x16, 0x03, 0x5F}, + {0x01, 0x02, 0x62}, + {0x16, 0x03, 0x62}, + {0x01, 0x02, 0x64}, + {0x16, 0x03, 0x64}, + {0x01, 0x02, 0x66}, + {0x16, 0x03, 0x66}, + {0x01, 0x02, 0x67}, + {0x16, 0x03, 0x67}, + {0x01, 0x02, 0x68}, + {0x16, 0x03, 0x68}, }, /* 25 */ { - {0x02, 2, 61}, - {0x09, 2, 61}, - {0x17, 2, 61}, - {0x28, 3, 61}, - {0x02, 2, 65}, - {0x09, 2, 65}, - {0x17, 2, 65}, - {0x28, 3, 65}, - {0x02, 2, 95}, - {0x09, 2, 95}, - {0x17, 2, 95}, - {0x28, 3, 95}, - {0x02, 2, 98}, - {0x09, 2, 98}, - {0x17, 2, 98}, - {0x28, 3, 98}, + {0x02, 0x02, 0x3D}, + {0x09, 0x02, 0x3D}, + {0x17, 0x02, 0x3D}, + {0x28, 0x03, 0x3D}, + {0x02, 0x02, 0x41}, + {0x09, 0x02, 0x41}, + {0x17, 0x02, 0x41}, + {0x28, 0x03, 0x41}, + {0x02, 0x02, 0x5F}, + {0x09, 0x02, 0x5F}, + {0x17, 0x02, 0x5F}, + {0x28, 0x03, 0x5F}, + {0x02, 0x02, 0x62}, + {0x09, 0x02, 0x62}, + {0x17, 0x02, 0x62}, + {0x28, 0x03, 0x62}, }, /* 26 */ { - {0x03, 2, 61}, - {0x06, 2, 61}, - {0x0A, 2, 61}, - {0x0F, 2, 61}, - {0x18, 2, 61}, - {0x1F, 2, 61}, - {0x29, 2, 61}, - {0x38, 3, 61}, - {0x03, 2, 65}, - {0x06, 2, 65}, - {0x0A, 2, 65}, - {0x0F, 2, 65}, - {0x18, 2, 65}, - {0x1F, 2, 65}, - {0x29, 2, 65}, - {0x38, 3, 65}, + {0x03, 0x02, 0x3D}, + {0x06, 0x02, 0x3D}, + {0x0A, 0x02, 0x3D}, + {0x0F, 0x02, 0x3D}, + {0x18, 0x02, 0x3D}, + {0x1F, 0x02, 0x3D}, + {0x29, 0x02, 0x3D}, + {0x38, 0x03, 0x3D}, + {0x03, 0x02, 0x41}, + {0x06, 0x02, 0x41}, + {0x0A, 0x02, 0x41}, + {0x0F, 0x02, 0x41}, + {0x18, 0x02, 0x41}, + {0x1F, 0x02, 0x41}, + {0x29, 0x02, 0x41}, + {0x38, 0x03, 0x41}, }, /* 27 */ { - {0x03, 2, 95}, - {0x06, 2, 95}, - {0x0A, 2, 95}, - {0x0F, 2, 95}, - {0x18, 2, 95}, - {0x1F, 2, 95}, - {0x29, 2, 95}, - {0x38, 3, 95}, - {0x03, 2, 98}, - {0x06, 2, 98}, - {0x0A, 2, 98}, - {0x0F, 2, 98}, - {0x18, 2, 98}, - {0x1F, 2, 98}, - {0x29, 2, 98}, - {0x38, 3, 98}, + {0x03, 0x02, 0x5F}, + {0x06, 0x02, 0x5F}, + {0x0A, 0x02, 0x5F}, + {0x0F, 0x02, 0x5F}, + {0x18, 0x02, 0x5F}, + {0x1F, 0x02, 0x5F}, + {0x29, 0x02, 0x5F}, + {0x38, 0x03, 0x5F}, + {0x03, 0x02, 0x62}, + {0x06, 0x02, 0x62}, + {0x0A, 0x02, 0x62}, + {0x0F, 0x02, 0x62}, + {0x18, 0x02, 0x62}, + {0x1F, 0x02, 0x62}, + {0x29, 0x02, 0x62}, + {0x38, 0x03, 0x62}, }, /* 28 */ { - {0x02, 2, 100}, - {0x09, 2, 100}, - {0x17, 2, 100}, - {0x28, 3, 100}, - {0x02, 2, 102}, - {0x09, 2, 102}, - {0x17, 2, 102}, - {0x28, 3, 102}, - {0x02, 2, 103}, - {0x09, 2, 103}, - {0x17, 2, 103}, - {0x28, 3, 103}, - {0x02, 2, 104}, - {0x09, 2, 104}, - {0x17, 2, 104}, - {0x28, 3, 104}, + {0x02, 0x02, 0x64}, + {0x09, 0x02, 0x64}, + {0x17, 0x02, 0x64}, + {0x28, 0x03, 0x64}, + {0x02, 0x02, 0x66}, + {0x09, 0x02, 0x66}, + {0x17, 0x02, 0x66}, + {0x28, 0x03, 0x66}, + {0x02, 0x02, 0x67}, + {0x09, 0x02, 0x67}, + {0x17, 0x02, 0x67}, + {0x28, 0x03, 0x67}, + {0x02, 0x02, 0x68}, + {0x09, 0x02, 0x68}, + {0x17, 0x02, 0x68}, + {0x28, 0x03, 0x68}, }, /* 29 */ { - {0x03, 2, 100}, - {0x06, 2, 100}, - {0x0A, 2, 100}, - {0x0F, 2, 100}, - {0x18, 2, 100}, - {0x1F, 2, 100}, - {0x29, 2, 100}, - {0x38, 3, 100}, - {0x03, 2, 102}, - {0x06, 2, 102}, - {0x0A, 2, 102}, - {0x0F, 2, 102}, - {0x18, 2, 102}, - {0x1F, 2, 102}, - {0x29, 2, 102}, - {0x38, 3, 102}, + {0x03, 0x02, 0x64}, + {0x06, 0x02, 0x64}, + {0x0A, 0x02, 0x64}, + {0x0F, 0x02, 0x64}, + {0x18, 0x02, 0x64}, + {0x1F, 0x02, 0x64}, + {0x29, 0x02, 0x64}, + {0x38, 0x03, 0x64}, + {0x03, 0x02, 0x66}, + {0x06, 0x02, 0x66}, + {0x0A, 0x02, 0x66}, + {0x0F, 0x02, 0x66}, + {0x18, 0x02, 0x66}, + {0x1F, 0x02, 0x66}, + {0x29, 0x02, 0x66}, + {0x38, 0x03, 0x66}, }, /* 30 */ { - {0x03, 2, 103}, - {0x06, 2, 103}, - {0x0A, 2, 103}, - {0x0F, 2, 103}, - {0x18, 2, 103}, - {0x1F, 2, 103}, - {0x29, 2, 103}, - {0x38, 3, 103}, - {0x03, 2, 104}, - {0x06, 2, 104}, - {0x0A, 2, 104}, - {0x0F, 2, 104}, - {0x18, 2, 104}, - {0x1F, 2, 104}, - {0x29, 2, 104}, - {0x38, 3, 104}, + {0x03, 0x02, 0x67}, + {0x06, 0x02, 0x67}, + {0x0A, 0x02, 0x67}, + {0x0F, 0x02, 0x67}, + {0x18, 0x02, 0x67}, + {0x1F, 0x02, 0x67}, + {0x29, 0x02, 0x67}, + {0x38, 0x03, 0x67}, + {0x03, 0x02, 0x68}, + {0x06, 0x02, 0x68}, + {0x0A, 0x02, 0x68}, + {0x0F, 0x02, 0x68}, + {0x18, 0x02, 0x68}, + {0x1F, 0x02, 0x68}, + {0x29, 0x02, 0x68}, + {0x38, 0x03, 0x68}, }, /* 31 */ { - {0x01, 2, 108}, - {0x16, 3, 108}, - {0x01, 2, 109}, - {0x16, 3, 109}, - {0x01, 2, 110}, - {0x16, 3, 110}, - {0x01, 2, 112}, - {0x16, 3, 112}, - {0x01, 2, 114}, - {0x16, 3, 114}, - {0x01, 2, 117}, - {0x16, 3, 117}, - {0x00, 3, 58}, - {0x00, 3, 66}, - {0x00, 3, 67}, - {0x00, 3, 68}, + {0x01, 0x02, 0x6C}, + {0x16, 0x03, 0x6C}, + {0x01, 0x02, 0x6D}, + {0x16, 0x03, 0x6D}, + {0x01, 0x02, 0x6E}, + {0x16, 0x03, 0x6E}, + {0x01, 0x02, 0x70}, + {0x16, 0x03, 0x70}, + {0x01, 0x02, 0x72}, + {0x16, 0x03, 0x72}, + {0x01, 0x02, 0x75}, + {0x16, 0x03, 0x75}, + {0x00, 0x03, 0x3A}, + {0x00, 0x03, 0x42}, + {0x00, 0x03, 0x43}, + {0x00, 0x03, 0x44}, }, /* 32 */ { - {0x02, 2, 108}, - {0x09, 2, 108}, - {0x17, 2, 108}, - {0x28, 3, 108}, - {0x02, 2, 109}, - {0x09, 2, 109}, - {0x17, 2, 109}, - {0x28, 3, 109}, - {0x02, 2, 110}, - {0x09, 2, 110}, - {0x17, 2, 110}, - {0x28, 3, 110}, - {0x02, 2, 112}, - {0x09, 2, 112}, - {0x17, 2, 112}, - {0x28, 3, 112}, + {0x02, 0x02, 0x6C}, + {0x09, 0x02, 0x6C}, + {0x17, 0x02, 0x6C}, + {0x28, 0x03, 0x6C}, + {0x02, 0x02, 0x6D}, + {0x09, 0x02, 0x6D}, + {0x17, 0x02, 0x6D}, + {0x28, 0x03, 0x6D}, + {0x02, 0x02, 0x6E}, + {0x09, 0x02, 0x6E}, + {0x17, 0x02, 0x6E}, + {0x28, 0x03, 0x6E}, + {0x02, 0x02, 0x70}, + {0x09, 0x02, 0x70}, + {0x17, 0x02, 0x70}, + {0x28, 0x03, 0x70}, }, /* 33 */ { - {0x03, 2, 108}, - {0x06, 2, 108}, - {0x0A, 2, 108}, - {0x0F, 2, 108}, - {0x18, 2, 108}, - {0x1F, 2, 108}, - {0x29, 2, 108}, - {0x38, 3, 108}, - {0x03, 2, 109}, - {0x06, 2, 109}, - {0x0A, 2, 109}, - {0x0F, 2, 109}, - {0x18, 2, 109}, - {0x1F, 2, 109}, - {0x29, 2, 109}, - {0x38, 3, 109}, + {0x03, 0x02, 0x6C}, + {0x06, 0x02, 0x6C}, + {0x0A, 0x02, 0x6C}, + {0x0F, 0x02, 0x6C}, + {0x18, 0x02, 0x6C}, + {0x1F, 0x02, 0x6C}, + {0x29, 0x02, 0x6C}, + {0x38, 0x03, 0x6C}, + {0x03, 0x02, 0x6D}, + {0x06, 0x02, 0x6D}, + {0x0A, 0x02, 0x6D}, + {0x0F, 0x02, 0x6D}, + {0x18, 0x02, 0x6D}, + {0x1F, 0x02, 0x6D}, + {0x29, 0x02, 0x6D}, + {0x38, 0x03, 0x6D}, }, /* 34 */ { - {0x03, 2, 110}, - {0x06, 2, 110}, - {0x0A, 2, 110}, - {0x0F, 2, 110}, - {0x18, 2, 110}, - {0x1F, 2, 110}, - {0x29, 2, 110}, - {0x38, 3, 110}, - {0x03, 2, 112}, - {0x06, 2, 112}, - {0x0A, 2, 112}, - {0x0F, 2, 112}, - {0x18, 2, 112}, - {0x1F, 2, 112}, - {0x29, 2, 112}, - {0x38, 3, 112}, + {0x03, 0x02, 0x6E}, + {0x06, 0x02, 0x6E}, + {0x0A, 0x02, 0x6E}, + {0x0F, 0x02, 0x6E}, + {0x18, 0x02, 0x6E}, + {0x1F, 0x02, 0x6E}, + {0x29, 0x02, 0x6E}, + {0x38, 0x03, 0x6E}, + {0x03, 0x02, 0x70}, + {0x06, 0x02, 0x70}, + {0x0A, 0x02, 0x70}, + {0x0F, 0x02, 0x70}, + {0x18, 0x02, 0x70}, + {0x1F, 0x02, 0x70}, + {0x29, 0x02, 0x70}, + {0x38, 0x03, 0x70}, }, /* 35 */ { - {0x02, 2, 114}, - {0x09, 2, 114}, - {0x17, 2, 114}, - {0x28, 3, 114}, - {0x02, 2, 117}, - {0x09, 2, 117}, - {0x17, 2, 117}, - {0x28, 3, 117}, - {0x01, 2, 58}, - {0x16, 3, 58}, - {0x01, 2, 66}, - {0x16, 3, 66}, - {0x01, 2, 67}, - {0x16, 3, 67}, - {0x01, 2, 68}, - {0x16, 3, 68}, + {0x02, 0x02, 0x72}, + {0x09, 0x02, 0x72}, + {0x17, 0x02, 0x72}, + {0x28, 0x03, 0x72}, + {0x02, 0x02, 0x75}, + {0x09, 0x02, 0x75}, + {0x17, 0x02, 0x75}, + {0x28, 0x03, 0x75}, + {0x01, 0x02, 0x3A}, + {0x16, 0x03, 0x3A}, + {0x01, 0x02, 0x42}, + {0x16, 0x03, 0x42}, + {0x01, 0x02, 0x43}, + {0x16, 0x03, 0x43}, + {0x01, 0x02, 0x44}, + {0x16, 0x03, 0x44}, }, /* 36 */ { - {0x03, 2, 114}, - {0x06, 2, 114}, - {0x0A, 2, 114}, - {0x0F, 2, 114}, - {0x18, 2, 114}, - {0x1F, 2, 114}, - {0x29, 2, 114}, - {0x38, 3, 114}, - {0x03, 2, 117}, - {0x06, 2, 117}, - {0x0A, 2, 117}, - {0x0F, 2, 117}, - {0x18, 2, 117}, - {0x1F, 2, 117}, - {0x29, 2, 117}, - {0x38, 3, 117}, + {0x03, 0x02, 0x72}, + {0x06, 0x02, 0x72}, + {0x0A, 0x02, 0x72}, + {0x0F, 0x02, 0x72}, + {0x18, 0x02, 0x72}, + {0x1F, 0x02, 0x72}, + {0x29, 0x02, 0x72}, + {0x38, 0x03, 0x72}, + {0x03, 0x02, 0x75}, + {0x06, 0x02, 0x75}, + {0x0A, 0x02, 0x75}, + {0x0F, 0x02, 0x75}, + {0x18, 0x02, 0x75}, + {0x1F, 0x02, 0x75}, + {0x29, 0x02, 0x75}, + {0x38, 0x03, 0x75}, }, /* 37 */ { - {0x02, 2, 58}, - {0x09, 2, 58}, - {0x17, 2, 58}, - {0x28, 3, 58}, - {0x02, 2, 66}, - {0x09, 2, 66}, - {0x17, 2, 66}, - {0x28, 3, 66}, - {0x02, 2, 67}, - {0x09, 2, 67}, - {0x17, 2, 67}, - {0x28, 3, 67}, - {0x02, 2, 68}, - {0x09, 2, 68}, - {0x17, 2, 68}, - {0x28, 3, 68}, + {0x02, 0x02, 0x3A}, + {0x09, 0x02, 0x3A}, + {0x17, 0x02, 0x3A}, + {0x28, 0x03, 0x3A}, + {0x02, 0x02, 0x42}, + {0x09, 0x02, 0x42}, + {0x17, 0x02, 0x42}, + {0x28, 0x03, 0x42}, + {0x02, 0x02, 0x43}, + {0x09, 0x02, 0x43}, + {0x17, 0x02, 0x43}, + {0x28, 0x03, 0x43}, + {0x02, 0x02, 0x44}, + {0x09, 0x02, 0x44}, + {0x17, 0x02, 0x44}, + {0x28, 0x03, 0x44}, }, /* 38 */ { - {0x03, 2, 58}, - {0x06, 2, 58}, - {0x0A, 2, 58}, - {0x0F, 2, 58}, - {0x18, 2, 58}, - {0x1F, 2, 58}, - {0x29, 2, 58}, - {0x38, 3, 58}, - {0x03, 2, 66}, - {0x06, 2, 66}, - {0x0A, 2, 66}, - {0x0F, 2, 66}, - {0x18, 2, 66}, - {0x1F, 2, 66}, - {0x29, 2, 66}, - {0x38, 3, 66}, + {0x03, 0x02, 0x3A}, + {0x06, 0x02, 0x3A}, + {0x0A, 0x02, 0x3A}, + {0x0F, 0x02, 0x3A}, + {0x18, 0x02, 0x3A}, + {0x1F, 0x02, 0x3A}, + {0x29, 0x02, 0x3A}, + {0x38, 0x03, 0x3A}, + {0x03, 0x02, 0x42}, + {0x06, 0x02, 0x42}, + {0x0A, 0x02, 0x42}, + {0x0F, 0x02, 0x42}, + {0x18, 0x02, 0x42}, + {0x1F, 0x02, 0x42}, + {0x29, 0x02, 0x42}, + {0x38, 0x03, 0x42}, }, /* 39 */ { - {0x03, 2, 67}, - {0x06, 2, 67}, - {0x0A, 2, 67}, - {0x0F, 2, 67}, - {0x18, 2, 67}, - {0x1F, 2, 67}, - {0x29, 2, 67}, - {0x38, 3, 67}, - {0x03, 2, 68}, - {0x06, 2, 68}, - {0x0A, 2, 68}, - {0x0F, 2, 68}, - {0x18, 2, 68}, - {0x1F, 2, 68}, - {0x29, 2, 68}, - {0x38, 3, 68}, + {0x03, 0x02, 0x43}, + {0x06, 0x02, 0x43}, + {0x0A, 0x02, 0x43}, + {0x0F, 0x02, 0x43}, + {0x18, 0x02, 0x43}, + {0x1F, 0x02, 0x43}, + {0x29, 0x02, 0x43}, + {0x38, 0x03, 0x43}, + {0x03, 0x02, 0x44}, + {0x06, 0x02, 0x44}, + {0x0A, 0x02, 0x44}, + {0x0F, 0x02, 0x44}, + {0x18, 0x02, 0x44}, + {0x1F, 0x02, 0x44}, + {0x29, 0x02, 0x44}, + {0x38, 0x03, 0x44}, }, /* 40 */ { - {0x2C, 0, 0}, - {0x2D, 0, 0}, - {0x2F, 0, 0}, - {0x30, 0, 0}, - {0x33, 0, 0}, - {0x34, 0, 0}, - {0x36, 0, 0}, - {0x37, 0, 0}, - {0x3B, 0, 0}, - {0x3C, 0, 0}, - {0x3E, 0, 0}, - {0x3F, 0, 0}, - {0x42, 0, 0}, - {0x43, 0, 0}, - {0x45, 0, 0}, - {0x48, 1, 0}, + {0x2C, 0x00, 0x00}, + {0x2D, 0x00, 0x00}, + {0x2F, 0x00, 0x00}, + {0x30, 0x00, 0x00}, + {0x33, 0x00, 0x00}, + {0x34, 0x00, 0x00}, + {0x36, 0x00, 0x00}, + {0x37, 0x00, 0x00}, + {0x3B, 0x00, 0x00}, + {0x3C, 0x00, 0x00}, + {0x3E, 0x00, 0x00}, + {0x3F, 0x00, 0x00}, + {0x42, 0x00, 0x00}, + {0x43, 0x00, 0x00}, + {0x45, 0x00, 0x00}, + {0x48, 0x01, 0x00}, }, /* 41 */ { - {0x00, 3, 69}, - {0x00, 3, 70}, - {0x00, 3, 71}, - {0x00, 3, 72}, - {0x00, 3, 73}, - {0x00, 3, 74}, - {0x00, 3, 75}, - {0x00, 3, 76}, - {0x00, 3, 77}, - {0x00, 3, 78}, - {0x00, 3, 79}, - {0x00, 3, 80}, - {0x00, 3, 81}, - {0x00, 3, 82}, - {0x00, 3, 83}, - {0x00, 3, 84}, + {0x00, 0x03, 0x45}, + {0x00, 0x03, 0x46}, + {0x00, 0x03, 0x47}, + {0x00, 0x03, 0x48}, + {0x00, 0x03, 0x49}, + {0x00, 0x03, 0x4A}, + {0x00, 0x03, 0x4B}, + {0x00, 0x03, 0x4C}, + {0x00, 0x03, 0x4D}, + {0x00, 0x03, 0x4E}, + {0x00, 0x03, 0x4F}, + {0x00, 0x03, 0x50}, + {0x00, 0x03, 0x51}, + {0x00, 0x03, 0x52}, + {0x00, 0x03, 0x53}, + {0x00, 0x03, 0x54}, }, /* 42 */ { - {0x01, 2, 69}, - {0x16, 3, 69}, - {0x01, 2, 70}, - {0x16, 3, 70}, - {0x01, 2, 71}, - {0x16, 3, 71}, - {0x01, 2, 72}, - {0x16, 3, 72}, - {0x01, 2, 73}, - {0x16, 3, 73}, - {0x01, 2, 74}, - {0x16, 3, 74}, - {0x01, 2, 75}, - {0x16, 3, 75}, - {0x01, 2, 76}, - {0x16, 3, 76}, + {0x01, 0x02, 0x45}, + {0x16, 0x03, 0x45}, + {0x01, 0x02, 0x46}, + {0x16, 0x03, 0x46}, + {0x01, 0x02, 0x47}, + {0x16, 0x03, 0x47}, + {0x01, 0x02, 0x48}, + {0x16, 0x03, 0x48}, + {0x01, 0x02, 0x49}, + {0x16, 0x03, 0x49}, + {0x01, 0x02, 0x4A}, + {0x16, 0x03, 0x4A}, + {0x01, 0x02, 0x4B}, + {0x16, 0x03, 0x4B}, + {0x01, 0x02, 0x4C}, + {0x16, 0x03, 0x4C}, }, /* 43 */ { - {0x02, 2, 69}, - {0x09, 2, 69}, - {0x17, 2, 69}, - {0x28, 3, 69}, - {0x02, 2, 70}, - {0x09, 2, 70}, - {0x17, 2, 70}, - {0x28, 3, 70}, - {0x02, 2, 71}, - {0x09, 2, 71}, - {0x17, 2, 71}, - {0x28, 3, 71}, - {0x02, 2, 72}, - {0x09, 2, 72}, - {0x17, 2, 72}, - {0x28, 3, 72}, + {0x02, 0x02, 0x45}, + {0x09, 0x02, 0x45}, + {0x17, 0x02, 0x45}, + {0x28, 0x03, 0x45}, + {0x02, 0x02, 0x46}, + {0x09, 0x02, 0x46}, + {0x17, 0x02, 0x46}, + {0x28, 0x03, 0x46}, + {0x02, 0x02, 0x47}, + {0x09, 0x02, 0x47}, + {0x17, 0x02, 0x47}, + {0x28, 0x03, 0x47}, + {0x02, 0x02, 0x48}, + {0x09, 0x02, 0x48}, + {0x17, 0x02, 0x48}, + {0x28, 0x03, 0x48}, }, /* 44 */ { - {0x03, 2, 69}, - {0x06, 2, 69}, - {0x0A, 2, 69}, - {0x0F, 2, 69}, - {0x18, 2, 69}, - {0x1F, 2, 69}, - {0x29, 2, 69}, - {0x38, 3, 69}, - {0x03, 2, 70}, - {0x06, 2, 70}, - {0x0A, 2, 70}, - {0x0F, 2, 70}, - {0x18, 2, 70}, - {0x1F, 2, 70}, - {0x29, 2, 70}, - {0x38, 3, 70}, + {0x03, 0x02, 0x45}, + {0x06, 0x02, 0x45}, + {0x0A, 0x02, 0x45}, + {0x0F, 0x02, 0x45}, + {0x18, 0x02, 0x45}, + {0x1F, 0x02, 0x45}, + {0x29, 0x02, 0x45}, + {0x38, 0x03, 0x45}, + {0x03, 0x02, 0x46}, + {0x06, 0x02, 0x46}, + {0x0A, 0x02, 0x46}, + {0x0F, 0x02, 0x46}, + {0x18, 0x02, 0x46}, + {0x1F, 0x02, 0x46}, + {0x29, 0x02, 0x46}, + {0x38, 0x03, 0x46}, }, /* 45 */ { - {0x03, 2, 71}, - {0x06, 2, 71}, - {0x0A, 2, 71}, - {0x0F, 2, 71}, - {0x18, 2, 71}, - {0x1F, 2, 71}, - {0x29, 2, 71}, - {0x38, 3, 71}, - {0x03, 2, 72}, - {0x06, 2, 72}, - {0x0A, 2, 72}, - {0x0F, 2, 72}, - {0x18, 2, 72}, - {0x1F, 2, 72}, - {0x29, 2, 72}, - {0x38, 3, 72}, + {0x03, 0x02, 0x47}, + {0x06, 0x02, 0x47}, + {0x0A, 0x02, 0x47}, + {0x0F, 0x02, 0x47}, + {0x18, 0x02, 0x47}, + {0x1F, 0x02, 0x47}, + {0x29, 0x02, 0x47}, + {0x38, 0x03, 0x47}, + {0x03, 0x02, 0x48}, + {0x06, 0x02, 0x48}, + {0x0A, 0x02, 0x48}, + {0x0F, 0x02, 0x48}, + {0x18, 0x02, 0x48}, + {0x1F, 0x02, 0x48}, + {0x29, 0x02, 0x48}, + {0x38, 0x03, 0x48}, }, /* 46 */ { - {0x02, 2, 73}, - {0x09, 2, 73}, - {0x17, 2, 73}, - {0x28, 3, 73}, - {0x02, 2, 74}, - {0x09, 2, 74}, - {0x17, 2, 74}, - {0x28, 3, 74}, - {0x02, 2, 75}, - {0x09, 2, 75}, - {0x17, 2, 75}, - {0x28, 3, 75}, - {0x02, 2, 76}, - {0x09, 2, 76}, - {0x17, 2, 76}, - {0x28, 3, 76}, + {0x02, 0x02, 0x49}, + {0x09, 0x02, 0x49}, + {0x17, 0x02, 0x49}, + {0x28, 0x03, 0x49}, + {0x02, 0x02, 0x4A}, + {0x09, 0x02, 0x4A}, + {0x17, 0x02, 0x4A}, + {0x28, 0x03, 0x4A}, + {0x02, 0x02, 0x4B}, + {0x09, 0x02, 0x4B}, + {0x17, 0x02, 0x4B}, + {0x28, 0x03, 0x4B}, + {0x02, 0x02, 0x4C}, + {0x09, 0x02, 0x4C}, + {0x17, 0x02, 0x4C}, + {0x28, 0x03, 0x4C}, }, /* 47 */ { - {0x03, 2, 73}, - {0x06, 2, 73}, - {0x0A, 2, 73}, - {0x0F, 2, 73}, - {0x18, 2, 73}, - {0x1F, 2, 73}, - {0x29, 2, 73}, - {0x38, 3, 73}, - {0x03, 2, 74}, - {0x06, 2, 74}, - {0x0A, 2, 74}, - {0x0F, 2, 74}, - {0x18, 2, 74}, - {0x1F, 2, 74}, - {0x29, 2, 74}, - {0x38, 3, 74}, + {0x03, 0x02, 0x49}, + {0x06, 0x02, 0x49}, + {0x0A, 0x02, 0x49}, + {0x0F, 0x02, 0x49}, + {0x18, 0x02, 0x49}, + {0x1F, 0x02, 0x49}, + {0x29, 0x02, 0x49}, + {0x38, 0x03, 0x49}, + {0x03, 0x02, 0x4A}, + {0x06, 0x02, 0x4A}, + {0x0A, 0x02, 0x4A}, + {0x0F, 0x02, 0x4A}, + {0x18, 0x02, 0x4A}, + {0x1F, 0x02, 0x4A}, + {0x29, 0x02, 0x4A}, + {0x38, 0x03, 0x4A}, }, /* 48 */ { - {0x03, 2, 75}, - {0x06, 2, 75}, - {0x0A, 2, 75}, - {0x0F, 2, 75}, - {0x18, 2, 75}, - {0x1F, 2, 75}, - {0x29, 2, 75}, - {0x38, 3, 75}, - {0x03, 2, 76}, - {0x06, 2, 76}, - {0x0A, 2, 76}, - {0x0F, 2, 76}, - {0x18, 2, 76}, - {0x1F, 2, 76}, - {0x29, 2, 76}, - {0x38, 3, 76}, + {0x03, 0x02, 0x4B}, + {0x06, 0x02, 0x4B}, + {0x0A, 0x02, 0x4B}, + {0x0F, 0x02, 0x4B}, + {0x18, 0x02, 0x4B}, + {0x1F, 0x02, 0x4B}, + {0x29, 0x02, 0x4B}, + {0x38, 0x03, 0x4B}, + {0x03, 0x02, 0x4C}, + {0x06, 0x02, 0x4C}, + {0x0A, 0x02, 0x4C}, + {0x0F, 0x02, 0x4C}, + {0x18, 0x02, 0x4C}, + {0x1F, 0x02, 0x4C}, + {0x29, 0x02, 0x4C}, + {0x38, 0x03, 0x4C}, }, /* 49 */ { - {0x01, 2, 77}, - {0x16, 3, 77}, - {0x01, 2, 78}, - {0x16, 3, 78}, - {0x01, 2, 79}, - {0x16, 3, 79}, - {0x01, 2, 80}, - {0x16, 3, 80}, - {0x01, 2, 81}, - {0x16, 3, 81}, - {0x01, 2, 82}, - {0x16, 3, 82}, - {0x01, 2, 83}, - {0x16, 3, 83}, - {0x01, 2, 84}, - {0x16, 3, 84}, + {0x01, 0x02, 0x4D}, + {0x16, 0x03, 0x4D}, + {0x01, 0x02, 0x4E}, + {0x16, 0x03, 0x4E}, + {0x01, 0x02, 0x4F}, + {0x16, 0x03, 0x4F}, + {0x01, 0x02, 0x50}, + {0x16, 0x03, 0x50}, + {0x01, 0x02, 0x51}, + {0x16, 0x03, 0x51}, + {0x01, 0x02, 0x52}, + {0x16, 0x03, 0x52}, + {0x01, 0x02, 0x53}, + {0x16, 0x03, 0x53}, + {0x01, 0x02, 0x54}, + {0x16, 0x03, 0x54}, }, /* 50 */ { - {0x02, 2, 77}, - {0x09, 2, 77}, - {0x17, 2, 77}, - {0x28, 3, 77}, - {0x02, 2, 78}, - {0x09, 2, 78}, - {0x17, 2, 78}, - {0x28, 3, 78}, - {0x02, 2, 79}, - {0x09, 2, 79}, - {0x17, 2, 79}, - {0x28, 3, 79}, - {0x02, 2, 80}, - {0x09, 2, 80}, - {0x17, 2, 80}, - {0x28, 3, 80}, + {0x02, 0x02, 0x4D}, + {0x09, 0x02, 0x4D}, + {0x17, 0x02, 0x4D}, + {0x28, 0x03, 0x4D}, + {0x02, 0x02, 0x4E}, + {0x09, 0x02, 0x4E}, + {0x17, 0x02, 0x4E}, + {0x28, 0x03, 0x4E}, + {0x02, 0x02, 0x4F}, + {0x09, 0x02, 0x4F}, + {0x17, 0x02, 0x4F}, + {0x28, 0x03, 0x4F}, + {0x02, 0x02, 0x50}, + {0x09, 0x02, 0x50}, + {0x17, 0x02, 0x50}, + {0x28, 0x03, 0x50}, }, /* 51 */ { - {0x03, 2, 77}, - {0x06, 2, 77}, - {0x0A, 2, 77}, - {0x0F, 2, 77}, - {0x18, 2, 77}, - {0x1F, 2, 77}, - {0x29, 2, 77}, - {0x38, 3, 77}, - {0x03, 2, 78}, - {0x06, 2, 78}, - {0x0A, 2, 78}, - {0x0F, 2, 78}, - {0x18, 2, 78}, - {0x1F, 2, 78}, - {0x29, 2, 78}, - {0x38, 3, 78}, + {0x03, 0x02, 0x4D}, + {0x06, 0x02, 0x4D}, + {0x0A, 0x02, 0x4D}, + {0x0F, 0x02, 0x4D}, + {0x18, 0x02, 0x4D}, + {0x1F, 0x02, 0x4D}, + {0x29, 0x02, 0x4D}, + {0x38, 0x03, 0x4D}, + {0x03, 0x02, 0x4E}, + {0x06, 0x02, 0x4E}, + {0x0A, 0x02, 0x4E}, + {0x0F, 0x02, 0x4E}, + {0x18, 0x02, 0x4E}, + {0x1F, 0x02, 0x4E}, + {0x29, 0x02, 0x4E}, + {0x38, 0x03, 0x4E}, }, /* 52 */ { - {0x03, 2, 79}, - {0x06, 2, 79}, - {0x0A, 2, 79}, - {0x0F, 2, 79}, - {0x18, 2, 79}, - {0x1F, 2, 79}, - {0x29, 2, 79}, - {0x38, 3, 79}, - {0x03, 2, 80}, - {0x06, 2, 80}, - {0x0A, 2, 80}, - {0x0F, 2, 80}, - {0x18, 2, 80}, - {0x1F, 2, 80}, - {0x29, 2, 80}, - {0x38, 3, 80}, + {0x03, 0x02, 0x4F}, + {0x06, 0x02, 0x4F}, + {0x0A, 0x02, 0x4F}, + {0x0F, 0x02, 0x4F}, + {0x18, 0x02, 0x4F}, + {0x1F, 0x02, 0x4F}, + {0x29, 0x02, 0x4F}, + {0x38, 0x03, 0x4F}, + {0x03, 0x02, 0x50}, + {0x06, 0x02, 0x50}, + {0x0A, 0x02, 0x50}, + {0x0F, 0x02, 0x50}, + {0x18, 0x02, 0x50}, + {0x1F, 0x02, 0x50}, + {0x29, 0x02, 0x50}, + {0x38, 0x03, 0x50}, }, /* 53 */ { - {0x02, 2, 81}, - {0x09, 2, 81}, - {0x17, 2, 81}, - {0x28, 3, 81}, - {0x02, 2, 82}, - {0x09, 2, 82}, - {0x17, 2, 82}, - {0x28, 3, 82}, - {0x02, 2, 83}, - {0x09, 2, 83}, - {0x17, 2, 83}, - {0x28, 3, 83}, - {0x02, 2, 84}, - {0x09, 2, 84}, - {0x17, 2, 84}, - {0x28, 3, 84}, + {0x02, 0x02, 0x51}, + {0x09, 0x02, 0x51}, + {0x17, 0x02, 0x51}, + {0x28, 0x03, 0x51}, + {0x02, 0x02, 0x52}, + {0x09, 0x02, 0x52}, + {0x17, 0x02, 0x52}, + {0x28, 0x03, 0x52}, + {0x02, 0x02, 0x53}, + {0x09, 0x02, 0x53}, + {0x17, 0x02, 0x53}, + {0x28, 0x03, 0x53}, + {0x02, 0x02, 0x54}, + {0x09, 0x02, 0x54}, + {0x17, 0x02, 0x54}, + {0x28, 0x03, 0x54}, }, /* 54 */ { - {0x03, 2, 81}, - {0x06, 2, 81}, - {0x0A, 2, 81}, - {0x0F, 2, 81}, - {0x18, 2, 81}, - {0x1F, 2, 81}, - {0x29, 2, 81}, - {0x38, 3, 81}, - {0x03, 2, 82}, - {0x06, 2, 82}, - {0x0A, 2, 82}, - {0x0F, 2, 82}, - {0x18, 2, 82}, - {0x1F, 2, 82}, - {0x29, 2, 82}, - {0x38, 3, 82}, + {0x03, 0x02, 0x51}, + {0x06, 0x02, 0x51}, + {0x0A, 0x02, 0x51}, + {0x0F, 0x02, 0x51}, + {0x18, 0x02, 0x51}, + {0x1F, 0x02, 0x51}, + {0x29, 0x02, 0x51}, + {0x38, 0x03, 0x51}, + {0x03, 0x02, 0x52}, + {0x06, 0x02, 0x52}, + {0x0A, 0x02, 0x52}, + {0x0F, 0x02, 0x52}, + {0x18, 0x02, 0x52}, + {0x1F, 0x02, 0x52}, + {0x29, 0x02, 0x52}, + {0x38, 0x03, 0x52}, }, /* 55 */ { - {0x03, 2, 83}, - {0x06, 2, 83}, - {0x0A, 2, 83}, - {0x0F, 2, 83}, - {0x18, 2, 83}, - {0x1F, 2, 83}, - {0x29, 2, 83}, - {0x38, 3, 83}, - {0x03, 2, 84}, - {0x06, 2, 84}, - {0x0A, 2, 84}, - {0x0F, 2, 84}, - {0x18, 2, 84}, - {0x1F, 2, 84}, - {0x29, 2, 84}, - {0x38, 3, 84}, + {0x03, 0x02, 0x53}, + {0x06, 0x02, 0x53}, + {0x0A, 0x02, 0x53}, + {0x0F, 0x02, 0x53}, + {0x18, 0x02, 0x53}, + {0x1F, 0x02, 0x53}, + {0x29, 0x02, 0x53}, + {0x38, 0x03, 0x53}, + {0x03, 0x02, 0x54}, + {0x06, 0x02, 0x54}, + {0x0A, 0x02, 0x54}, + {0x0F, 0x02, 0x54}, + {0x18, 0x02, 0x54}, + {0x1F, 0x02, 0x54}, + {0x29, 0x02, 0x54}, + {0x38, 0x03, 0x54}, }, /* 56 */ { - {0x00, 3, 85}, - {0x00, 3, 86}, - {0x00, 3, 87}, - {0x00, 3, 89}, - {0x00, 3, 106}, - {0x00, 3, 107}, - {0x00, 3, 113}, - {0x00, 3, 118}, - {0x00, 3, 119}, - {0x00, 3, 120}, - {0x00, 3, 121}, - {0x00, 3, 122}, - {0x46, 0, 0}, - {0x47, 0, 0}, - {0x49, 0, 0}, - {0x4A, 1, 0}, + {0x00, 0x03, 0x55}, + {0x00, 0x03, 0x56}, + {0x00, 0x03, 0x57}, + {0x00, 0x03, 0x59}, + {0x00, 0x03, 0x6A}, + {0x00, 0x03, 0x6B}, + {0x00, 0x03, 0x71}, + {0x00, 0x03, 0x76}, + {0x00, 0x03, 0x77}, + {0x00, 0x03, 0x78}, + {0x00, 0x03, 0x79}, + {0x00, 0x03, 0x7A}, + {0x46, 0x00, 0x00}, + {0x47, 0x00, 0x00}, + {0x49, 0x00, 0x00}, + {0x4A, 0x01, 0x00}, }, /* 57 */ { - {0x01, 2, 85}, - {0x16, 3, 85}, - {0x01, 2, 86}, - {0x16, 3, 86}, - {0x01, 2, 87}, - {0x16, 3, 87}, - {0x01, 2, 89}, - {0x16, 3, 89}, - {0x01, 2, 106}, - {0x16, 3, 106}, - {0x01, 2, 107}, - {0x16, 3, 107}, - {0x01, 2, 113}, - {0x16, 3, 113}, - {0x01, 2, 118}, - {0x16, 3, 118}, + {0x01, 0x02, 0x55}, + {0x16, 0x03, 0x55}, + {0x01, 0x02, 0x56}, + {0x16, 0x03, 0x56}, + {0x01, 0x02, 0x57}, + {0x16, 0x03, 0x57}, + {0x01, 0x02, 0x59}, + {0x16, 0x03, 0x59}, + {0x01, 0x02, 0x6A}, + {0x16, 0x03, 0x6A}, + {0x01, 0x02, 0x6B}, + {0x16, 0x03, 0x6B}, + {0x01, 0x02, 0x71}, + {0x16, 0x03, 0x71}, + {0x01, 0x02, 0x76}, + {0x16, 0x03, 0x76}, }, /* 58 */ { - {0x02, 2, 85}, - {0x09, 2, 85}, - {0x17, 2, 85}, - {0x28, 3, 85}, - {0x02, 2, 86}, - {0x09, 2, 86}, - {0x17, 2, 86}, - {0x28, 3, 86}, - {0x02, 2, 87}, - {0x09, 2, 87}, - {0x17, 2, 87}, - {0x28, 3, 87}, - {0x02, 2, 89}, - {0x09, 2, 89}, - {0x17, 2, 89}, - {0x28, 3, 89}, + {0x02, 0x02, 0x55}, + {0x09, 0x02, 0x55}, + {0x17, 0x02, 0x55}, + {0x28, 0x03, 0x55}, + {0x02, 0x02, 0x56}, + {0x09, 0x02, 0x56}, + {0x17, 0x02, 0x56}, + {0x28, 0x03, 0x56}, + {0x02, 0x02, 0x57}, + {0x09, 0x02, 0x57}, + {0x17, 0x02, 0x57}, + {0x28, 0x03, 0x57}, + {0x02, 0x02, 0x59}, + {0x09, 0x02, 0x59}, + {0x17, 0x02, 0x59}, + {0x28, 0x03, 0x59}, }, /* 59 */ { - {0x03, 2, 85}, - {0x06, 2, 85}, - {0x0A, 2, 85}, - {0x0F, 2, 85}, - {0x18, 2, 85}, - {0x1F, 2, 85}, - {0x29, 2, 85}, - {0x38, 3, 85}, - {0x03, 2, 86}, - {0x06, 2, 86}, - {0x0A, 2, 86}, - {0x0F, 2, 86}, - {0x18, 2, 86}, - {0x1F, 2, 86}, - {0x29, 2, 86}, - {0x38, 3, 86}, + {0x03, 0x02, 0x55}, + {0x06, 0x02, 0x55}, + {0x0A, 0x02, 0x55}, + {0x0F, 0x02, 0x55}, + {0x18, 0x02, 0x55}, + {0x1F, 0x02, 0x55}, + {0x29, 0x02, 0x55}, + {0x38, 0x03, 0x55}, + {0x03, 0x02, 0x56}, + {0x06, 0x02, 0x56}, + {0x0A, 0x02, 0x56}, + {0x0F, 0x02, 0x56}, + {0x18, 0x02, 0x56}, + {0x1F, 0x02, 0x56}, + {0x29, 0x02, 0x56}, + {0x38, 0x03, 0x56}, }, /* 60 */ { - {0x03, 2, 87}, - {0x06, 2, 87}, - {0x0A, 2, 87}, - {0x0F, 2, 87}, - {0x18, 2, 87}, - {0x1F, 2, 87}, - {0x29, 2, 87}, - {0x38, 3, 87}, - {0x03, 2, 89}, - {0x06, 2, 89}, - {0x0A, 2, 89}, - {0x0F, 2, 89}, - {0x18, 2, 89}, - {0x1F, 2, 89}, - {0x29, 2, 89}, - {0x38, 3, 89}, + {0x03, 0x02, 0x57}, + {0x06, 0x02, 0x57}, + {0x0A, 0x02, 0x57}, + {0x0F, 0x02, 0x57}, + {0x18, 0x02, 0x57}, + {0x1F, 0x02, 0x57}, + {0x29, 0x02, 0x57}, + {0x38, 0x03, 0x57}, + {0x03, 0x02, 0x59}, + {0x06, 0x02, 0x59}, + {0x0A, 0x02, 0x59}, + {0x0F, 0x02, 0x59}, + {0x18, 0x02, 0x59}, + {0x1F, 0x02, 0x59}, + {0x29, 0x02, 0x59}, + {0x38, 0x03, 0x59}, }, /* 61 */ { - {0x02, 2, 106}, - {0x09, 2, 106}, - {0x17, 2, 106}, - {0x28, 3, 106}, - {0x02, 2, 107}, - {0x09, 2, 107}, - {0x17, 2, 107}, - {0x28, 3, 107}, - {0x02, 2, 113}, - {0x09, 2, 113}, - {0x17, 2, 113}, - {0x28, 3, 113}, - {0x02, 2, 118}, - {0x09, 2, 118}, - {0x17, 2, 118}, - {0x28, 3, 118}, + {0x02, 0x02, 0x6A}, + {0x09, 0x02, 0x6A}, + {0x17, 0x02, 0x6A}, + {0x28, 0x03, 0x6A}, + {0x02, 0x02, 0x6B}, + {0x09, 0x02, 0x6B}, + {0x17, 0x02, 0x6B}, + {0x28, 0x03, 0x6B}, + {0x02, 0x02, 0x71}, + {0x09, 0x02, 0x71}, + {0x17, 0x02, 0x71}, + {0x28, 0x03, 0x71}, + {0x02, 0x02, 0x76}, + {0x09, 0x02, 0x76}, + {0x17, 0x02, 0x76}, + {0x28, 0x03, 0x76}, }, /* 62 */ { - {0x03, 2, 106}, - {0x06, 2, 106}, - {0x0A, 2, 106}, - {0x0F, 2, 106}, - {0x18, 2, 106}, - {0x1F, 2, 106}, - {0x29, 2, 106}, - {0x38, 3, 106}, - {0x03, 2, 107}, - {0x06, 2, 107}, - {0x0A, 2, 107}, - {0x0F, 2, 107}, - {0x18, 2, 107}, - {0x1F, 2, 107}, - {0x29, 2, 107}, - {0x38, 3, 107}, + {0x03, 0x02, 0x6A}, + {0x06, 0x02, 0x6A}, + {0x0A, 0x02, 0x6A}, + {0x0F, 0x02, 0x6A}, + {0x18, 0x02, 0x6A}, + {0x1F, 0x02, 0x6A}, + {0x29, 0x02, 0x6A}, + {0x38, 0x03, 0x6A}, + {0x03, 0x02, 0x6B}, + {0x06, 0x02, 0x6B}, + {0x0A, 0x02, 0x6B}, + {0x0F, 0x02, 0x6B}, + {0x18, 0x02, 0x6B}, + {0x1F, 0x02, 0x6B}, + {0x29, 0x02, 0x6B}, + {0x38, 0x03, 0x6B}, }, /* 63 */ { - {0x03, 2, 113}, - {0x06, 2, 113}, - {0x0A, 2, 113}, - {0x0F, 2, 113}, - {0x18, 2, 113}, - {0x1F, 2, 113}, - {0x29, 2, 113}, - {0x38, 3, 113}, - {0x03, 2, 118}, - {0x06, 2, 118}, - {0x0A, 2, 118}, - {0x0F, 2, 118}, - {0x18, 2, 118}, - {0x1F, 2, 118}, - {0x29, 2, 118}, - {0x38, 3, 118}, + {0x03, 0x02, 0x71}, + {0x06, 0x02, 0x71}, + {0x0A, 0x02, 0x71}, + {0x0F, 0x02, 0x71}, + {0x18, 0x02, 0x71}, + {0x1F, 0x02, 0x71}, + {0x29, 0x02, 0x71}, + {0x38, 0x03, 0x71}, + {0x03, 0x02, 0x76}, + {0x06, 0x02, 0x76}, + {0x0A, 0x02, 0x76}, + {0x0F, 0x02, 0x76}, + {0x18, 0x02, 0x76}, + {0x1F, 0x02, 0x76}, + {0x29, 0x02, 0x76}, + {0x38, 0x03, 0x76}, }, /* 64 */ { - {0x01, 2, 119}, - {0x16, 3, 119}, - {0x01, 2, 120}, - {0x16, 3, 120}, - {0x01, 2, 121}, - {0x16, 3, 121}, - {0x01, 2, 122}, - {0x16, 3, 122}, - {0x00, 3, 38}, - {0x00, 3, 42}, - {0x00, 3, 44}, - {0x00, 3, 59}, - {0x00, 3, 88}, - {0x00, 3, 90}, - {0x4B, 0, 0}, - {0x4E, 0, 0}, + {0x01, 0x02, 0x77}, + {0x16, 0x03, 0x77}, + {0x01, 0x02, 0x78}, + {0x16, 0x03, 0x78}, + {0x01, 0x02, 0x79}, + {0x16, 0x03, 0x79}, + {0x01, 0x02, 0x7A}, + {0x16, 0x03, 0x7A}, + {0x00, 0x03, 0x26}, + {0x00, 0x03, 0x2A}, + {0x00, 0x03, 0x2C}, + {0x00, 0x03, 0x3B}, + {0x00, 0x03, 0x58}, + {0x00, 0x03, 0x5A}, + {0x4B, 0x00, 0x00}, + {0x4E, 0x00, 0x00}, }, /* 65 */ { - {0x02, 2, 119}, - {0x09, 2, 119}, - {0x17, 2, 119}, - {0x28, 3, 119}, - {0x02, 2, 120}, - {0x09, 2, 120}, - {0x17, 2, 120}, - {0x28, 3, 120}, - {0x02, 2, 121}, - {0x09, 2, 121}, - {0x17, 2, 121}, - {0x28, 3, 121}, - {0x02, 2, 122}, - {0x09, 2, 122}, - {0x17, 2, 122}, - {0x28, 3, 122}, + {0x02, 0x02, 0x77}, + {0x09, 0x02, 0x77}, + {0x17, 0x02, 0x77}, + {0x28, 0x03, 0x77}, + {0x02, 0x02, 0x78}, + {0x09, 0x02, 0x78}, + {0x17, 0x02, 0x78}, + {0x28, 0x03, 0x78}, + {0x02, 0x02, 0x79}, + {0x09, 0x02, 0x79}, + {0x17, 0x02, 0x79}, + {0x28, 0x03, 0x79}, + {0x02, 0x02, 0x7A}, + {0x09, 0x02, 0x7A}, + {0x17, 0x02, 0x7A}, + {0x28, 0x03, 0x7A}, }, /* 66 */ { - {0x03, 2, 119}, - {0x06, 2, 119}, - {0x0A, 2, 119}, - {0x0F, 2, 119}, - {0x18, 2, 119}, - {0x1F, 2, 119}, - {0x29, 2, 119}, - {0x38, 3, 119}, - {0x03, 2, 120}, - {0x06, 2, 120}, - {0x0A, 2, 120}, - {0x0F, 2, 120}, - {0x18, 2, 120}, - {0x1F, 2, 120}, - {0x29, 2, 120}, - {0x38, 3, 120}, + {0x03, 0x02, 0x77}, + {0x06, 0x02, 0x77}, + {0x0A, 0x02, 0x77}, + {0x0F, 0x02, 0x77}, + {0x18, 0x02, 0x77}, + {0x1F, 0x02, 0x77}, + {0x29, 0x02, 0x77}, + {0x38, 0x03, 0x77}, + {0x03, 0x02, 0x78}, + {0x06, 0x02, 0x78}, + {0x0A, 0x02, 0x78}, + {0x0F, 0x02, 0x78}, + {0x18, 0x02, 0x78}, + {0x1F, 0x02, 0x78}, + {0x29, 0x02, 0x78}, + {0x38, 0x03, 0x78}, }, /* 67 */ { - {0x03, 2, 121}, - {0x06, 2, 121}, - {0x0A, 2, 121}, - {0x0F, 2, 121}, - {0x18, 2, 121}, - {0x1F, 2, 121}, - {0x29, 2, 121}, - {0x38, 3, 121}, - {0x03, 2, 122}, - {0x06, 2, 122}, - {0x0A, 2, 122}, - {0x0F, 2, 122}, - {0x18, 2, 122}, - {0x1F, 2, 122}, - {0x29, 2, 122}, - {0x38, 3, 122}, + {0x03, 0x02, 0x79}, + {0x06, 0x02, 0x79}, + {0x0A, 0x02, 0x79}, + {0x0F, 0x02, 0x79}, + {0x18, 0x02, 0x79}, + {0x1F, 0x02, 0x79}, + {0x29, 0x02, 0x79}, + {0x38, 0x03, 0x79}, + {0x03, 0x02, 0x7A}, + {0x06, 0x02, 0x7A}, + {0x0A, 0x02, 0x7A}, + {0x0F, 0x02, 0x7A}, + {0x18, 0x02, 0x7A}, + {0x1F, 0x02, 0x7A}, + {0x29, 0x02, 0x7A}, + {0x38, 0x03, 0x7A}, }, /* 68 */ { - {0x01, 2, 38}, - {0x16, 3, 38}, - {0x01, 2, 42}, - {0x16, 3, 42}, - {0x01, 2, 44}, - {0x16, 3, 44}, - {0x01, 2, 59}, - {0x16, 3, 59}, - {0x01, 2, 88}, - {0x16, 3, 88}, - {0x01, 2, 90}, - {0x16, 3, 90}, - {0x4C, 0, 0}, - {0x4D, 0, 0}, - {0x4F, 0, 0}, - {0x51, 0, 0}, + {0x01, 0x02, 0x26}, + {0x16, 0x03, 0x26}, + {0x01, 0x02, 0x2A}, + {0x16, 0x03, 0x2A}, + {0x01, 0x02, 0x2C}, + {0x16, 0x03, 0x2C}, + {0x01, 0x02, 0x3B}, + {0x16, 0x03, 0x3B}, + {0x01, 0x02, 0x58}, + {0x16, 0x03, 0x58}, + {0x01, 0x02, 0x5A}, + {0x16, 0x03, 0x5A}, + {0x4C, 0x00, 0x00}, + {0x4D, 0x00, 0x00}, + {0x4F, 0x00, 0x00}, + {0x51, 0x00, 0x00}, }, /* 69 */ { - {0x02, 2, 38}, - {0x09, 2, 38}, - {0x17, 2, 38}, - {0x28, 3, 38}, - {0x02, 2, 42}, - {0x09, 2, 42}, - {0x17, 2, 42}, - {0x28, 3, 42}, - {0x02, 2, 44}, - {0x09, 2, 44}, - {0x17, 2, 44}, - {0x28, 3, 44}, - {0x02, 2, 59}, - {0x09, 2, 59}, - {0x17, 2, 59}, - {0x28, 3, 59}, + {0x02, 0x02, 0x26}, + {0x09, 0x02, 0x26}, + {0x17, 0x02, 0x26}, + {0x28, 0x03, 0x26}, + {0x02, 0x02, 0x2A}, + {0x09, 0x02, 0x2A}, + {0x17, 0x02, 0x2A}, + {0x28, 0x03, 0x2A}, + {0x02, 0x02, 0x2C}, + {0x09, 0x02, 0x2C}, + {0x17, 0x02, 0x2C}, + {0x28, 0x03, 0x2C}, + {0x02, 0x02, 0x3B}, + {0x09, 0x02, 0x3B}, + {0x17, 0x02, 0x3B}, + {0x28, 0x03, 0x3B}, }, /* 70 */ { - {0x03, 2, 38}, - {0x06, 2, 38}, - {0x0A, 2, 38}, - {0x0F, 2, 38}, - {0x18, 2, 38}, - {0x1F, 2, 38}, - {0x29, 2, 38}, - {0x38, 3, 38}, - {0x03, 2, 42}, - {0x06, 2, 42}, - {0x0A, 2, 42}, - {0x0F, 2, 42}, - {0x18, 2, 42}, - {0x1F, 2, 42}, - {0x29, 2, 42}, - {0x38, 3, 42}, + {0x03, 0x02, 0x26}, + {0x06, 0x02, 0x26}, + {0x0A, 0x02, 0x26}, + {0x0F, 0x02, 0x26}, + {0x18, 0x02, 0x26}, + {0x1F, 0x02, 0x26}, + {0x29, 0x02, 0x26}, + {0x38, 0x03, 0x26}, + {0x03, 0x02, 0x2A}, + {0x06, 0x02, 0x2A}, + {0x0A, 0x02, 0x2A}, + {0x0F, 0x02, 0x2A}, + {0x18, 0x02, 0x2A}, + {0x1F, 0x02, 0x2A}, + {0x29, 0x02, 0x2A}, + {0x38, 0x03, 0x2A}, }, /* 71 */ { - {0x03, 2, 44}, - {0x06, 2, 44}, - {0x0A, 2, 44}, - {0x0F, 2, 44}, - {0x18, 2, 44}, - {0x1F, 2, 44}, - {0x29, 2, 44}, - {0x38, 3, 44}, - {0x03, 2, 59}, - {0x06, 2, 59}, - {0x0A, 2, 59}, - {0x0F, 2, 59}, - {0x18, 2, 59}, - {0x1F, 2, 59}, - {0x29, 2, 59}, - {0x38, 3, 59}, + {0x03, 0x02, 0x2C}, + {0x06, 0x02, 0x2C}, + {0x0A, 0x02, 0x2C}, + {0x0F, 0x02, 0x2C}, + {0x18, 0x02, 0x2C}, + {0x1F, 0x02, 0x2C}, + {0x29, 0x02, 0x2C}, + {0x38, 0x03, 0x2C}, + {0x03, 0x02, 0x3B}, + {0x06, 0x02, 0x3B}, + {0x0A, 0x02, 0x3B}, + {0x0F, 0x02, 0x3B}, + {0x18, 0x02, 0x3B}, + {0x1F, 0x02, 0x3B}, + {0x29, 0x02, 0x3B}, + {0x38, 0x03, 0x3B}, }, /* 72 */ { - {0x02, 2, 88}, - {0x09, 2, 88}, - {0x17, 2, 88}, - {0x28, 3, 88}, - {0x02, 2, 90}, - {0x09, 2, 90}, - {0x17, 2, 90}, - {0x28, 3, 90}, - {0x00, 3, 33}, - {0x00, 3, 34}, - {0x00, 3, 40}, - {0x00, 3, 41}, - {0x00, 3, 63}, - {0x50, 0, 0}, - {0x52, 0, 0}, - {0x54, 0, 0}, + {0x02, 0x02, 0x58}, + {0x09, 0x02, 0x58}, + {0x17, 0x02, 0x58}, + {0x28, 0x03, 0x58}, + {0x02, 0x02, 0x5A}, + {0x09, 0x02, 0x5A}, + {0x17, 0x02, 0x5A}, + {0x28, 0x03, 0x5A}, + {0x00, 0x03, 0x21}, + {0x00, 0x03, 0x22}, + {0x00, 0x03, 0x28}, + {0x00, 0x03, 0x29}, + {0x00, 0x03, 0x3F}, + {0x50, 0x00, 0x00}, + {0x52, 0x00, 0x00}, + {0x54, 0x00, 0x00}, }, /* 73 */ { - {0x03, 2, 88}, - {0x06, 2, 88}, - {0x0A, 2, 88}, - {0x0F, 2, 88}, - {0x18, 2, 88}, - {0x1F, 2, 88}, - {0x29, 2, 88}, - {0x38, 3, 88}, - {0x03, 2, 90}, - {0x06, 2, 90}, - {0x0A, 2, 90}, - {0x0F, 2, 90}, - {0x18, 2, 90}, - {0x1F, 2, 90}, - {0x29, 2, 90}, - {0x38, 3, 90}, + {0x03, 0x02, 0x58}, + {0x06, 0x02, 0x58}, + {0x0A, 0x02, 0x58}, + {0x0F, 0x02, 0x58}, + {0x18, 0x02, 0x58}, + {0x1F, 0x02, 0x58}, + {0x29, 0x02, 0x58}, + {0x38, 0x03, 0x58}, + {0x03, 0x02, 0x5A}, + {0x06, 0x02, 0x5A}, + {0x0A, 0x02, 0x5A}, + {0x0F, 0x02, 0x5A}, + {0x18, 0x02, 0x5A}, + {0x1F, 0x02, 0x5A}, + {0x29, 0x02, 0x5A}, + {0x38, 0x03, 0x5A}, }, /* 74 */ { - {0x01, 2, 33}, - {0x16, 3, 33}, - {0x01, 2, 34}, - {0x16, 3, 34}, - {0x01, 2, 40}, - {0x16, 3, 40}, - {0x01, 2, 41}, - {0x16, 3, 41}, - {0x01, 2, 63}, - {0x16, 3, 63}, - {0x00, 3, 39}, - {0x00, 3, 43}, - {0x00, 3, 124}, - {0x53, 0, 0}, - {0x55, 0, 0}, - {0x58, 0, 0}, + {0x01, 0x02, 0x21}, + {0x16, 0x03, 0x21}, + {0x01, 0x02, 0x22}, + {0x16, 0x03, 0x22}, + {0x01, 0x02, 0x28}, + {0x16, 0x03, 0x28}, + {0x01, 0x02, 0x29}, + {0x16, 0x03, 0x29}, + {0x01, 0x02, 0x3F}, + {0x16, 0x03, 0x3F}, + {0x00, 0x03, 0x27}, + {0x00, 0x03, 0x2B}, + {0x00, 0x03, 0x7C}, + {0x53, 0x00, 0x00}, + {0x55, 0x00, 0x00}, + {0x58, 0x00, 0x00}, }, /* 75 */ { - {0x02, 2, 33}, - {0x09, 2, 33}, - {0x17, 2, 33}, - {0x28, 3, 33}, - {0x02, 2, 34}, - {0x09, 2, 34}, - {0x17, 2, 34}, - {0x28, 3, 34}, - {0x02, 2, 40}, - {0x09, 2, 40}, - {0x17, 2, 40}, - {0x28, 3, 40}, - {0x02, 2, 41}, - {0x09, 2, 41}, - {0x17, 2, 41}, - {0x28, 3, 41}, + {0x02, 0x02, 0x21}, + {0x09, 0x02, 0x21}, + {0x17, 0x02, 0x21}, + {0x28, 0x03, 0x21}, + {0x02, 0x02, 0x22}, + {0x09, 0x02, 0x22}, + {0x17, 0x02, 0x22}, + {0x28, 0x03, 0x22}, + {0x02, 0x02, 0x28}, + {0x09, 0x02, 0x28}, + {0x17, 0x02, 0x28}, + {0x28, 0x03, 0x28}, + {0x02, 0x02, 0x29}, + {0x09, 0x02, 0x29}, + {0x17, 0x02, 0x29}, + {0x28, 0x03, 0x29}, }, /* 76 */ { - {0x03, 2, 33}, - {0x06, 2, 33}, - {0x0A, 2, 33}, - {0x0F, 2, 33}, - {0x18, 2, 33}, - {0x1F, 2, 33}, - {0x29, 2, 33}, - {0x38, 3, 33}, - {0x03, 2, 34}, - {0x06, 2, 34}, - {0x0A, 2, 34}, - {0x0F, 2, 34}, - {0x18, 2, 34}, - {0x1F, 2, 34}, - {0x29, 2, 34}, - {0x38, 3, 34}, + {0x03, 0x02, 0x21}, + {0x06, 0x02, 0x21}, + {0x0A, 0x02, 0x21}, + {0x0F, 0x02, 0x21}, + {0x18, 0x02, 0x21}, + {0x1F, 0x02, 0x21}, + {0x29, 0x02, 0x21}, + {0x38, 0x03, 0x21}, + {0x03, 0x02, 0x22}, + {0x06, 0x02, 0x22}, + {0x0A, 0x02, 0x22}, + {0x0F, 0x02, 0x22}, + {0x18, 0x02, 0x22}, + {0x1F, 0x02, 0x22}, + {0x29, 0x02, 0x22}, + {0x38, 0x03, 0x22}, }, /* 77 */ { - {0x03, 2, 40}, - {0x06, 2, 40}, - {0x0A, 2, 40}, - {0x0F, 2, 40}, - {0x18, 2, 40}, - {0x1F, 2, 40}, - {0x29, 2, 40}, - {0x38, 3, 40}, - {0x03, 2, 41}, - {0x06, 2, 41}, - {0x0A, 2, 41}, - {0x0F, 2, 41}, - {0x18, 2, 41}, - {0x1F, 2, 41}, - {0x29, 2, 41}, - {0x38, 3, 41}, + {0x03, 0x02, 0x28}, + {0x06, 0x02, 0x28}, + {0x0A, 0x02, 0x28}, + {0x0F, 0x02, 0x28}, + {0x18, 0x02, 0x28}, + {0x1F, 0x02, 0x28}, + {0x29, 0x02, 0x28}, + {0x38, 0x03, 0x28}, + {0x03, 0x02, 0x29}, + {0x06, 0x02, 0x29}, + {0x0A, 0x02, 0x29}, + {0x0F, 0x02, 0x29}, + {0x18, 0x02, 0x29}, + {0x1F, 0x02, 0x29}, + {0x29, 0x02, 0x29}, + {0x38, 0x03, 0x29}, }, /* 78 */ { - {0x02, 2, 63}, - {0x09, 2, 63}, - {0x17, 2, 63}, - {0x28, 3, 63}, - {0x01, 2, 39}, - {0x16, 3, 39}, - {0x01, 2, 43}, - {0x16, 3, 43}, - {0x01, 2, 124}, - {0x16, 3, 124}, - {0x00, 3, 35}, - {0x00, 3, 62}, - {0x56, 0, 0}, - {0x57, 0, 0}, - {0x59, 0, 0}, - {0x5A, 0, 0}, + {0x02, 0x02, 0x3F}, + {0x09, 0x02, 0x3F}, + {0x17, 0x02, 0x3F}, + {0x28, 0x03, 0x3F}, + {0x01, 0x02, 0x27}, + {0x16, 0x03, 0x27}, + {0x01, 0x02, 0x2B}, + {0x16, 0x03, 0x2B}, + {0x01, 0x02, 0x7C}, + {0x16, 0x03, 0x7C}, + {0x00, 0x03, 0x23}, + {0x00, 0x03, 0x3E}, + {0x56, 0x00, 0x00}, + {0x57, 0x00, 0x00}, + {0x59, 0x00, 0x00}, + {0x5A, 0x00, 0x00}, }, /* 79 */ { - {0x03, 2, 63}, - {0x06, 2, 63}, - {0x0A, 2, 63}, - {0x0F, 2, 63}, - {0x18, 2, 63}, - {0x1F, 2, 63}, - {0x29, 2, 63}, - {0x38, 3, 63}, - {0x02, 2, 39}, - {0x09, 2, 39}, - {0x17, 2, 39}, - {0x28, 3, 39}, - {0x02, 2, 43}, - {0x09, 2, 43}, - {0x17, 2, 43}, - {0x28, 3, 43}, + {0x03, 0x02, 0x3F}, + {0x06, 0x02, 0x3F}, + {0x0A, 0x02, 0x3F}, + {0x0F, 0x02, 0x3F}, + {0x18, 0x02, 0x3F}, + {0x1F, 0x02, 0x3F}, + {0x29, 0x02, 0x3F}, + {0x38, 0x03, 0x3F}, + {0x02, 0x02, 0x27}, + {0x09, 0x02, 0x27}, + {0x17, 0x02, 0x27}, + {0x28, 0x03, 0x27}, + {0x02, 0x02, 0x2B}, + {0x09, 0x02, 0x2B}, + {0x17, 0x02, 0x2B}, + {0x28, 0x03, 0x2B}, }, /* 80 */ { - {0x03, 2, 39}, - {0x06, 2, 39}, - {0x0A, 2, 39}, - {0x0F, 2, 39}, - {0x18, 2, 39}, - {0x1F, 2, 39}, - {0x29, 2, 39}, - {0x38, 3, 39}, - {0x03, 2, 43}, - {0x06, 2, 43}, - {0x0A, 2, 43}, - {0x0F, 2, 43}, - {0x18, 2, 43}, - {0x1F, 2, 43}, - {0x29, 2, 43}, - {0x38, 3, 43}, + {0x03, 0x02, 0x27}, + {0x06, 0x02, 0x27}, + {0x0A, 0x02, 0x27}, + {0x0F, 0x02, 0x27}, + {0x18, 0x02, 0x27}, + {0x1F, 0x02, 0x27}, + {0x29, 0x02, 0x27}, + {0x38, 0x03, 0x27}, + {0x03, 0x02, 0x2B}, + {0x06, 0x02, 0x2B}, + {0x0A, 0x02, 0x2B}, + {0x0F, 0x02, 0x2B}, + {0x18, 0x02, 0x2B}, + {0x1F, 0x02, 0x2B}, + {0x29, 0x02, 0x2B}, + {0x38, 0x03, 0x2B}, }, /* 81 */ { - {0x02, 2, 124}, - {0x09, 2, 124}, - {0x17, 2, 124}, - {0x28, 3, 124}, - {0x01, 2, 35}, - {0x16, 3, 35}, - {0x01, 2, 62}, - {0x16, 3, 62}, - {0x00, 3, 0}, - {0x00, 3, 36}, - {0x00, 3, 64}, - {0x00, 3, 91}, - {0x00, 3, 93}, - {0x00, 3, 126}, - {0x5B, 0, 0}, - {0x5C, 0, 0}, + {0x02, 0x02, 0x7C}, + {0x09, 0x02, 0x7C}, + {0x17, 0x02, 0x7C}, + {0x28, 0x03, 0x7C}, + {0x01, 0x02, 0x23}, + {0x16, 0x03, 0x23}, + {0x01, 0x02, 0x3E}, + {0x16, 0x03, 0x3E}, + {0x00, 0x03, 0x00}, + {0x00, 0x03, 0x24}, + {0x00, 0x03, 0x40}, + {0x00, 0x03, 0x5B}, + {0x00, 0x03, 0x5D}, + {0x00, 0x03, 0x7E}, + {0x5B, 0x00, 0x00}, + {0x5C, 0x00, 0x00}, }, /* 82 */ { - {0x03, 2, 124}, - {0x06, 2, 124}, - {0x0A, 2, 124}, - {0x0F, 2, 124}, - {0x18, 2, 124}, - {0x1F, 2, 124}, - {0x29, 2, 124}, - {0x38, 3, 124}, - {0x02, 2, 35}, - {0x09, 2, 35}, - {0x17, 2, 35}, - {0x28, 3, 35}, - {0x02, 2, 62}, - {0x09, 2, 62}, - {0x17, 2, 62}, - {0x28, 3, 62}, + {0x03, 0x02, 0x7C}, + {0x06, 0x02, 0x7C}, + {0x0A, 0x02, 0x7C}, + {0x0F, 0x02, 0x7C}, + {0x18, 0x02, 0x7C}, + {0x1F, 0x02, 0x7C}, + {0x29, 0x02, 0x7C}, + {0x38, 0x03, 0x7C}, + {0x02, 0x02, 0x23}, + {0x09, 0x02, 0x23}, + {0x17, 0x02, 0x23}, + {0x28, 0x03, 0x23}, + {0x02, 0x02, 0x3E}, + {0x09, 0x02, 0x3E}, + {0x17, 0x02, 0x3E}, + {0x28, 0x03, 0x3E}, }, /* 83 */ { - {0x03, 2, 35}, - {0x06, 2, 35}, - {0x0A, 2, 35}, - {0x0F, 2, 35}, - {0x18, 2, 35}, - {0x1F, 2, 35}, - {0x29, 2, 35}, - {0x38, 3, 35}, - {0x03, 2, 62}, - {0x06, 2, 62}, - {0x0A, 2, 62}, - {0x0F, 2, 62}, - {0x18, 2, 62}, - {0x1F, 2, 62}, - {0x29, 2, 62}, - {0x38, 3, 62}, + {0x03, 0x02, 0x23}, + {0x06, 0x02, 0x23}, + {0x0A, 0x02, 0x23}, + {0x0F, 0x02, 0x23}, + {0x18, 0x02, 0x23}, + {0x1F, 0x02, 0x23}, + {0x29, 0x02, 0x23}, + {0x38, 0x03, 0x23}, + {0x03, 0x02, 0x3E}, + {0x06, 0x02, 0x3E}, + {0x0A, 0x02, 0x3E}, + {0x0F, 0x02, 0x3E}, + {0x18, 0x02, 0x3E}, + {0x1F, 0x02, 0x3E}, + {0x29, 0x02, 0x3E}, + {0x38, 0x03, 0x3E}, }, /* 84 */ { - {0x01, 2, 0}, - {0x16, 3, 0}, - {0x01, 2, 36}, - {0x16, 3, 36}, - {0x01, 2, 64}, - {0x16, 3, 64}, - {0x01, 2, 91}, - {0x16, 3, 91}, - {0x01, 2, 93}, - {0x16, 3, 93}, - {0x01, 2, 126}, - {0x16, 3, 126}, - {0x00, 3, 94}, - {0x00, 3, 125}, - {0x5D, 0, 0}, - {0x5E, 0, 0}, + {0x01, 0x02, 0x00}, + {0x16, 0x03, 0x00}, + {0x01, 0x02, 0x24}, + {0x16, 0x03, 0x24}, + {0x01, 0x02, 0x40}, + {0x16, 0x03, 0x40}, + {0x01, 0x02, 0x5B}, + {0x16, 0x03, 0x5B}, + {0x01, 0x02, 0x5D}, + {0x16, 0x03, 0x5D}, + {0x01, 0x02, 0x7E}, + {0x16, 0x03, 0x7E}, + {0x00, 0x03, 0x5E}, + {0x00, 0x03, 0x7D}, + {0x5D, 0x00, 0x00}, + {0x5E, 0x00, 0x00}, }, /* 85 */ { - {0x02, 2, 0}, - {0x09, 2, 0}, - {0x17, 2, 0}, - {0x28, 3, 0}, - {0x02, 2, 36}, - {0x09, 2, 36}, - {0x17, 2, 36}, - {0x28, 3, 36}, - {0x02, 2, 64}, - {0x09, 2, 64}, - {0x17, 2, 64}, - {0x28, 3, 64}, - {0x02, 2, 91}, - {0x09, 2, 91}, - {0x17, 2, 91}, - {0x28, 3, 91}, + {0x02, 0x02, 0x00}, + {0x09, 0x02, 0x00}, + {0x17, 0x02, 0x00}, + {0x28, 0x03, 0x00}, + {0x02, 0x02, 0x24}, + {0x09, 0x02, 0x24}, + {0x17, 0x02, 0x24}, + {0x28, 0x03, 0x24}, + {0x02, 0x02, 0x40}, + {0x09, 0x02, 0x40}, + {0x17, 0x02, 0x40}, + {0x28, 0x03, 0x40}, + {0x02, 0x02, 0x5B}, + {0x09, 0x02, 0x5B}, + {0x17, 0x02, 0x5B}, + {0x28, 0x03, 0x5B}, }, /* 86 */ { - {0x03, 2, 0}, - {0x06, 2, 0}, - {0x0A, 2, 0}, - {0x0F, 2, 0}, - {0x18, 2, 0}, - {0x1F, 2, 0}, - {0x29, 2, 0}, - {0x38, 3, 0}, - {0x03, 2, 36}, - {0x06, 2, 36}, - {0x0A, 2, 36}, - {0x0F, 2, 36}, - {0x18, 2, 36}, - {0x1F, 2, 36}, - {0x29, 2, 36}, - {0x38, 3, 36}, + {0x03, 0x02, 0x00}, + {0x06, 0x02, 0x00}, + {0x0A, 0x02, 0x00}, + {0x0F, 0x02, 0x00}, + {0x18, 0x02, 0x00}, + {0x1F, 0x02, 0x00}, + {0x29, 0x02, 0x00}, + {0x38, 0x03, 0x00}, + {0x03, 0x02, 0x24}, + {0x06, 0x02, 0x24}, + {0x0A, 0x02, 0x24}, + {0x0F, 0x02, 0x24}, + {0x18, 0x02, 0x24}, + {0x1F, 0x02, 0x24}, + {0x29, 0x02, 0x24}, + {0x38, 0x03, 0x24}, }, /* 87 */ { - {0x03, 2, 64}, - {0x06, 2, 64}, - {0x0A, 2, 64}, - {0x0F, 2, 64}, - {0x18, 2, 64}, - {0x1F, 2, 64}, - {0x29, 2, 64}, - {0x38, 3, 64}, - {0x03, 2, 91}, - {0x06, 2, 91}, - {0x0A, 2, 91}, - {0x0F, 2, 91}, - {0x18, 2, 91}, - {0x1F, 2, 91}, - {0x29, 2, 91}, - {0x38, 3, 91}, + {0x03, 0x02, 0x40}, + {0x06, 0x02, 0x40}, + {0x0A, 0x02, 0x40}, + {0x0F, 0x02, 0x40}, + {0x18, 0x02, 0x40}, + {0x1F, 0x02, 0x40}, + {0x29, 0x02, 0x40}, + {0x38, 0x03, 0x40}, + {0x03, 0x02, 0x5B}, + {0x06, 0x02, 0x5B}, + {0x0A, 0x02, 0x5B}, + {0x0F, 0x02, 0x5B}, + {0x18, 0x02, 0x5B}, + {0x1F, 0x02, 0x5B}, + {0x29, 0x02, 0x5B}, + {0x38, 0x03, 0x5B}, }, /* 88 */ { - {0x02, 2, 93}, - {0x09, 2, 93}, - {0x17, 2, 93}, - {0x28, 3, 93}, - {0x02, 2, 126}, - {0x09, 2, 126}, - {0x17, 2, 126}, - {0x28, 3, 126}, - {0x01, 2, 94}, - {0x16, 3, 94}, - {0x01, 2, 125}, - {0x16, 3, 125}, - {0x00, 3, 60}, - {0x00, 3, 96}, - {0x00, 3, 123}, - {0x5F, 0, 0}, + {0x02, 0x02, 0x5D}, + {0x09, 0x02, 0x5D}, + {0x17, 0x02, 0x5D}, + {0x28, 0x03, 0x5D}, + {0x02, 0x02, 0x7E}, + {0x09, 0x02, 0x7E}, + {0x17, 0x02, 0x7E}, + {0x28, 0x03, 0x7E}, + {0x01, 0x02, 0x5E}, + {0x16, 0x03, 0x5E}, + {0x01, 0x02, 0x7D}, + {0x16, 0x03, 0x7D}, + {0x00, 0x03, 0x3C}, + {0x00, 0x03, 0x60}, + {0x00, 0x03, 0x7B}, + {0x5F, 0x00, 0x00}, }, /* 89 */ { - {0x03, 2, 93}, - {0x06, 2, 93}, - {0x0A, 2, 93}, - {0x0F, 2, 93}, - {0x18, 2, 93}, - {0x1F, 2, 93}, - {0x29, 2, 93}, - {0x38, 3, 93}, - {0x03, 2, 126}, - {0x06, 2, 126}, - {0x0A, 2, 126}, - {0x0F, 2, 126}, - {0x18, 2, 126}, - {0x1F, 2, 126}, - {0x29, 2, 126}, - {0x38, 3, 126}, + {0x03, 0x02, 0x5D}, + {0x06, 0x02, 0x5D}, + {0x0A, 0x02, 0x5D}, + {0x0F, 0x02, 0x5D}, + {0x18, 0x02, 0x5D}, + {0x1F, 0x02, 0x5D}, + {0x29, 0x02, 0x5D}, + {0x38, 0x03, 0x5D}, + {0x03, 0x02, 0x7E}, + {0x06, 0x02, 0x7E}, + {0x0A, 0x02, 0x7E}, + {0x0F, 0x02, 0x7E}, + {0x18, 0x02, 0x7E}, + {0x1F, 0x02, 0x7E}, + {0x29, 0x02, 0x7E}, + {0x38, 0x03, 0x7E}, }, /* 90 */ { - {0x02, 2, 94}, - {0x09, 2, 94}, - {0x17, 2, 94}, - {0x28, 3, 94}, - {0x02, 2, 125}, - {0x09, 2, 125}, - {0x17, 2, 125}, - {0x28, 3, 125}, - {0x01, 2, 60}, - {0x16, 3, 60}, - {0x01, 2, 96}, - {0x16, 3, 96}, - {0x01, 2, 123}, - {0x16, 3, 123}, - {0x60, 0, 0}, - {0x6E, 0, 0}, + {0x02, 0x02, 0x5E}, + {0x09, 0x02, 0x5E}, + {0x17, 0x02, 0x5E}, + {0x28, 0x03, 0x5E}, + {0x02, 0x02, 0x7D}, + {0x09, 0x02, 0x7D}, + {0x17, 0x02, 0x7D}, + {0x28, 0x03, 0x7D}, + {0x01, 0x02, 0x3C}, + {0x16, 0x03, 0x3C}, + {0x01, 0x02, 0x60}, + {0x16, 0x03, 0x60}, + {0x01, 0x02, 0x7B}, + {0x16, 0x03, 0x7B}, + {0x60, 0x00, 0x00}, + {0x6E, 0x00, 0x00}, }, /* 91 */ { - {0x03, 2, 94}, - {0x06, 2, 94}, - {0x0A, 2, 94}, - {0x0F, 2, 94}, - {0x18, 2, 94}, - {0x1F, 2, 94}, - {0x29, 2, 94}, - {0x38, 3, 94}, - {0x03, 2, 125}, - {0x06, 2, 125}, - {0x0A, 2, 125}, - {0x0F, 2, 125}, - {0x18, 2, 125}, - {0x1F, 2, 125}, - {0x29, 2, 125}, - {0x38, 3, 125}, + {0x03, 0x02, 0x5E}, + {0x06, 0x02, 0x5E}, + {0x0A, 0x02, 0x5E}, + {0x0F, 0x02, 0x5E}, + {0x18, 0x02, 0x5E}, + {0x1F, 0x02, 0x5E}, + {0x29, 0x02, 0x5E}, + {0x38, 0x03, 0x5E}, + {0x03, 0x02, 0x7D}, + {0x06, 0x02, 0x7D}, + {0x0A, 0x02, 0x7D}, + {0x0F, 0x02, 0x7D}, + {0x18, 0x02, 0x7D}, + {0x1F, 0x02, 0x7D}, + {0x29, 0x02, 0x7D}, + {0x38, 0x03, 0x7D}, }, /* 92 */ { - {0x02, 2, 60}, - {0x09, 2, 60}, - {0x17, 2, 60}, - {0x28, 3, 60}, - {0x02, 2, 96}, - {0x09, 2, 96}, - {0x17, 2, 96}, - {0x28, 3, 96}, - {0x02, 2, 123}, - {0x09, 2, 123}, - {0x17, 2, 123}, - {0x28, 3, 123}, - {0x61, 0, 0}, - {0x65, 0, 0}, - {0x6F, 0, 0}, - {0x85, 0, 0}, + {0x02, 0x02, 0x3C}, + {0x09, 0x02, 0x3C}, + {0x17, 0x02, 0x3C}, + {0x28, 0x03, 0x3C}, + {0x02, 0x02, 0x60}, + {0x09, 0x02, 0x60}, + {0x17, 0x02, 0x60}, + {0x28, 0x03, 0x60}, + {0x02, 0x02, 0x7B}, + {0x09, 0x02, 0x7B}, + {0x17, 0x02, 0x7B}, + {0x28, 0x03, 0x7B}, + {0x61, 0x00, 0x00}, + {0x65, 0x00, 0x00}, + {0x6F, 0x00, 0x00}, + {0x85, 0x00, 0x00}, }, /* 93 */ { - {0x03, 2, 60}, - {0x06, 2, 60}, - {0x0A, 2, 60}, - {0x0F, 2, 60}, - {0x18, 2, 60}, - {0x1F, 2, 60}, - {0x29, 2, 60}, - {0x38, 3, 60}, - {0x03, 2, 96}, - {0x06, 2, 96}, - {0x0A, 2, 96}, - {0x0F, 2, 96}, - {0x18, 2, 96}, - {0x1F, 2, 96}, - {0x29, 2, 96}, - {0x38, 3, 96}, + {0x03, 0x02, 0x3C}, + {0x06, 0x02, 0x3C}, + {0x0A, 0x02, 0x3C}, + {0x0F, 0x02, 0x3C}, + {0x18, 0x02, 0x3C}, + {0x1F, 0x02, 0x3C}, + {0x29, 0x02, 0x3C}, + {0x38, 0x03, 0x3C}, + {0x03, 0x02, 0x60}, + {0x06, 0x02, 0x60}, + {0x0A, 0x02, 0x60}, + {0x0F, 0x02, 0x60}, + {0x18, 0x02, 0x60}, + {0x1F, 0x02, 0x60}, + {0x29, 0x02, 0x60}, + {0x38, 0x03, 0x60}, }, /* 94 */ { - {0x03, 2, 123}, - {0x06, 2, 123}, - {0x0A, 2, 123}, - {0x0F, 2, 123}, - {0x18, 2, 123}, - {0x1F, 2, 123}, - {0x29, 2, 123}, - {0x38, 3, 123}, - {0x62, 0, 0}, - {0x63, 0, 0}, - {0x66, 0, 0}, - {0x69, 0, 0}, - {0x70, 0, 0}, - {0x77, 0, 0}, - {0x86, 0, 0}, - {0x99, 0, 0}, + {0x03, 0x02, 0x7B}, + {0x06, 0x02, 0x7B}, + {0x0A, 0x02, 0x7B}, + {0x0F, 0x02, 0x7B}, + {0x18, 0x02, 0x7B}, + {0x1F, 0x02, 0x7B}, + {0x29, 0x02, 0x7B}, + {0x38, 0x03, 0x7B}, + {0x62, 0x00, 0x00}, + {0x63, 0x00, 0x00}, + {0x66, 0x00, 0x00}, + {0x69, 0x00, 0x00}, + {0x70, 0x00, 0x00}, + {0x77, 0x00, 0x00}, + {0x86, 0x00, 0x00}, + {0x99, 0x00, 0x00}, }, /* 95 */ { - {0x00, 3, 92}, - {0x00, 3, 195}, - {0x00, 3, 208}, - {0x64, 0, 0}, - {0x67, 0, 0}, - {0x68, 0, 0}, - {0x6A, 0, 0}, - {0x6B, 0, 0}, - {0x71, 0, 0}, - {0x74, 0, 0}, - {0x78, 0, 0}, - {0x7E, 0, 0}, - {0x87, 0, 0}, - {0x8E, 0, 0}, - {0x9A, 0, 0}, - {0xA9, 0, 0}, + {0x00, 0x03, 0x5C}, + {0x00, 0x03, 0xC3}, + {0x00, 0x03, 0xD0}, + {0x64, 0x00, 0x00}, + {0x67, 0x00, 0x00}, + {0x68, 0x00, 0x00}, + {0x6A, 0x00, 0x00}, + {0x6B, 0x00, 0x00}, + {0x71, 0x00, 0x00}, + {0x74, 0x00, 0x00}, + {0x78, 0x00, 0x00}, + {0x7E, 0x00, 0x00}, + {0x87, 0x00, 0x00}, + {0x8E, 0x00, 0x00}, + {0x9A, 0x00, 0x00}, + {0xA9, 0x00, 0x00}, }, /* 96 */ { - {0x01, 2, 92}, - {0x16, 3, 92}, - {0x01, 2, 195}, - {0x16, 3, 195}, - {0x01, 2, 208}, - {0x16, 3, 208}, - {0x00, 3, 128}, - {0x00, 3, 130}, - {0x00, 3, 131}, - {0x00, 3, 162}, - {0x00, 3, 184}, - {0x00, 3, 194}, - {0x00, 3, 224}, - {0x00, 3, 226}, - {0x6C, 0, 0}, - {0x6D, 0, 0}, + {0x01, 0x02, 0x5C}, + {0x16, 0x03, 0x5C}, + {0x01, 0x02, 0xC3}, + {0x16, 0x03, 0xC3}, + {0x01, 0x02, 0xD0}, + {0x16, 0x03, 0xD0}, + {0x00, 0x03, 0x80}, + {0x00, 0x03, 0x82}, + {0x00, 0x03, 0x83}, + {0x00, 0x03, 0xA2}, + {0x00, 0x03, 0xB8}, + {0x00, 0x03, 0xC2}, + {0x00, 0x03, 0xE0}, + {0x00, 0x03, 0xE2}, + {0x6C, 0x00, 0x00}, + {0x6D, 0x00, 0x00}, }, /* 97 */ { - {0x02, 2, 92}, - {0x09, 2, 92}, - {0x17, 2, 92}, - {0x28, 3, 92}, - {0x02, 2, 195}, - {0x09, 2, 195}, - {0x17, 2, 195}, - {0x28, 3, 195}, - {0x02, 2, 208}, - {0x09, 2, 208}, - {0x17, 2, 208}, - {0x28, 3, 208}, - {0x01, 2, 128}, - {0x16, 3, 128}, - {0x01, 2, 130}, - {0x16, 3, 130}, + {0x02, 0x02, 0x5C}, + {0x09, 0x02, 0x5C}, + {0x17, 0x02, 0x5C}, + {0x28, 0x03, 0x5C}, + {0x02, 0x02, 0xC3}, + {0x09, 0x02, 0xC3}, + {0x17, 0x02, 0xC3}, + {0x28, 0x03, 0xC3}, + {0x02, 0x02, 0xD0}, + {0x09, 0x02, 0xD0}, + {0x17, 0x02, 0xD0}, + {0x28, 0x03, 0xD0}, + {0x01, 0x02, 0x80}, + {0x16, 0x03, 0x80}, + {0x01, 0x02, 0x82}, + {0x16, 0x03, 0x82}, }, /* 98 */ { - {0x03, 2, 92}, - {0x06, 2, 92}, - {0x0A, 2, 92}, - {0x0F, 2, 92}, - {0x18, 2, 92}, - {0x1F, 2, 92}, - {0x29, 2, 92}, - {0x38, 3, 92}, - {0x03, 2, 195}, - {0x06, 2, 195}, - {0x0A, 2, 195}, - {0x0F, 2, 195}, - {0x18, 2, 195}, - {0x1F, 2, 195}, - {0x29, 2, 195}, - {0x38, 3, 195}, + {0x03, 0x02, 0x5C}, + {0x06, 0x02, 0x5C}, + {0x0A, 0x02, 0x5C}, + {0x0F, 0x02, 0x5C}, + {0x18, 0x02, 0x5C}, + {0x1F, 0x02, 0x5C}, + {0x29, 0x02, 0x5C}, + {0x38, 0x03, 0x5C}, + {0x03, 0x02, 0xC3}, + {0x06, 0x02, 0xC3}, + {0x0A, 0x02, 0xC3}, + {0x0F, 0x02, 0xC3}, + {0x18, 0x02, 0xC3}, + {0x1F, 0x02, 0xC3}, + {0x29, 0x02, 0xC3}, + {0x38, 0x03, 0xC3}, }, /* 99 */ { - {0x03, 2, 208}, - {0x06, 2, 208}, - {0x0A, 2, 208}, - {0x0F, 2, 208}, - {0x18, 2, 208}, - {0x1F, 2, 208}, - {0x29, 2, 208}, - {0x38, 3, 208}, - {0x02, 2, 128}, - {0x09, 2, 128}, - {0x17, 2, 128}, - {0x28, 3, 128}, - {0x02, 2, 130}, - {0x09, 2, 130}, - {0x17, 2, 130}, - {0x28, 3, 130}, + {0x03, 0x02, 0xD0}, + {0x06, 0x02, 0xD0}, + {0x0A, 0x02, 0xD0}, + {0x0F, 0x02, 0xD0}, + {0x18, 0x02, 0xD0}, + {0x1F, 0x02, 0xD0}, + {0x29, 0x02, 0xD0}, + {0x38, 0x03, 0xD0}, + {0x02, 0x02, 0x80}, + {0x09, 0x02, 0x80}, + {0x17, 0x02, 0x80}, + {0x28, 0x03, 0x80}, + {0x02, 0x02, 0x82}, + {0x09, 0x02, 0x82}, + {0x17, 0x02, 0x82}, + {0x28, 0x03, 0x82}, }, /* 100 */ { - {0x03, 2, 128}, - {0x06, 2, 128}, - {0x0A, 2, 128}, - {0x0F, 2, 128}, - {0x18, 2, 128}, - {0x1F, 2, 128}, - {0x29, 2, 128}, - {0x38, 3, 128}, - {0x03, 2, 130}, - {0x06, 2, 130}, - {0x0A, 2, 130}, - {0x0F, 2, 130}, - {0x18, 2, 130}, - {0x1F, 2, 130}, - {0x29, 2, 130}, - {0x38, 3, 130}, + {0x03, 0x02, 0x80}, + {0x06, 0x02, 0x80}, + {0x0A, 0x02, 0x80}, + {0x0F, 0x02, 0x80}, + {0x18, 0x02, 0x80}, + {0x1F, 0x02, 0x80}, + {0x29, 0x02, 0x80}, + {0x38, 0x03, 0x80}, + {0x03, 0x02, 0x82}, + {0x06, 0x02, 0x82}, + {0x0A, 0x02, 0x82}, + {0x0F, 0x02, 0x82}, + {0x18, 0x02, 0x82}, + {0x1F, 0x02, 0x82}, + {0x29, 0x02, 0x82}, + {0x38, 0x03, 0x82}, }, /* 101 */ { - {0x01, 2, 131}, - {0x16, 3, 131}, - {0x01, 2, 162}, - {0x16, 3, 162}, - {0x01, 2, 184}, - {0x16, 3, 184}, - {0x01, 2, 194}, - {0x16, 3, 194}, - {0x01, 2, 224}, - {0x16, 3, 224}, - {0x01, 2, 226}, - {0x16, 3, 226}, - {0x00, 3, 153}, - {0x00, 3, 161}, - {0x00, 3, 167}, - {0x00, 3, 172}, + {0x01, 0x02, 0x83}, + {0x16, 0x03, 0x83}, + {0x01, 0x02, 0xA2}, + {0x16, 0x03, 0xA2}, + {0x01, 0x02, 0xB8}, + {0x16, 0x03, 0xB8}, + {0x01, 0x02, 0xC2}, + {0x16, 0x03, 0xC2}, + {0x01, 0x02, 0xE0}, + {0x16, 0x03, 0xE0}, + {0x01, 0x02, 0xE2}, + {0x16, 0x03, 0xE2}, + {0x00, 0x03, 0x99}, + {0x00, 0x03, 0xA1}, + {0x00, 0x03, 0xA7}, + {0x00, 0x03, 0xAC}, }, /* 102 */ { - {0x02, 2, 131}, - {0x09, 2, 131}, - {0x17, 2, 131}, - {0x28, 3, 131}, - {0x02, 2, 162}, - {0x09, 2, 162}, - {0x17, 2, 162}, - {0x28, 3, 162}, - {0x02, 2, 184}, - {0x09, 2, 184}, - {0x17, 2, 184}, - {0x28, 3, 184}, - {0x02, 2, 194}, - {0x09, 2, 194}, - {0x17, 2, 194}, - {0x28, 3, 194}, + {0x02, 0x02, 0x83}, + {0x09, 0x02, 0x83}, + {0x17, 0x02, 0x83}, + {0x28, 0x03, 0x83}, + {0x02, 0x02, 0xA2}, + {0x09, 0x02, 0xA2}, + {0x17, 0x02, 0xA2}, + {0x28, 0x03, 0xA2}, + {0x02, 0x02, 0xB8}, + {0x09, 0x02, 0xB8}, + {0x17, 0x02, 0xB8}, + {0x28, 0x03, 0xB8}, + {0x02, 0x02, 0xC2}, + {0x09, 0x02, 0xC2}, + {0x17, 0x02, 0xC2}, + {0x28, 0x03, 0xC2}, }, /* 103 */ { - {0x03, 2, 131}, - {0x06, 2, 131}, - {0x0A, 2, 131}, - {0x0F, 2, 131}, - {0x18, 2, 131}, - {0x1F, 2, 131}, - {0x29, 2, 131}, - {0x38, 3, 131}, - {0x03, 2, 162}, - {0x06, 2, 162}, - {0x0A, 2, 162}, - {0x0F, 2, 162}, - {0x18, 2, 162}, - {0x1F, 2, 162}, - {0x29, 2, 162}, - {0x38, 3, 162}, + {0x03, 0x02, 0x83}, + {0x06, 0x02, 0x83}, + {0x0A, 0x02, 0x83}, + {0x0F, 0x02, 0x83}, + {0x18, 0x02, 0x83}, + {0x1F, 0x02, 0x83}, + {0x29, 0x02, 0x83}, + {0x38, 0x03, 0x83}, + {0x03, 0x02, 0xA2}, + {0x06, 0x02, 0xA2}, + {0x0A, 0x02, 0xA2}, + {0x0F, 0x02, 0xA2}, + {0x18, 0x02, 0xA2}, + {0x1F, 0x02, 0xA2}, + {0x29, 0x02, 0xA2}, + {0x38, 0x03, 0xA2}, }, /* 104 */ { - {0x03, 2, 184}, - {0x06, 2, 184}, - {0x0A, 2, 184}, - {0x0F, 2, 184}, - {0x18, 2, 184}, - {0x1F, 2, 184}, - {0x29, 2, 184}, - {0x38, 3, 184}, - {0x03, 2, 194}, - {0x06, 2, 194}, - {0x0A, 2, 194}, - {0x0F, 2, 194}, - {0x18, 2, 194}, - {0x1F, 2, 194}, - {0x29, 2, 194}, - {0x38, 3, 194}, + {0x03, 0x02, 0xB8}, + {0x06, 0x02, 0xB8}, + {0x0A, 0x02, 0xB8}, + {0x0F, 0x02, 0xB8}, + {0x18, 0x02, 0xB8}, + {0x1F, 0x02, 0xB8}, + {0x29, 0x02, 0xB8}, + {0x38, 0x03, 0xB8}, + {0x03, 0x02, 0xC2}, + {0x06, 0x02, 0xC2}, + {0x0A, 0x02, 0xC2}, + {0x0F, 0x02, 0xC2}, + {0x18, 0x02, 0xC2}, + {0x1F, 0x02, 0xC2}, + {0x29, 0x02, 0xC2}, + {0x38, 0x03, 0xC2}, }, /* 105 */ { - {0x02, 2, 224}, - {0x09, 2, 224}, - {0x17, 2, 224}, - {0x28, 3, 224}, - {0x02, 2, 226}, - {0x09, 2, 226}, - {0x17, 2, 226}, - {0x28, 3, 226}, - {0x01, 2, 153}, - {0x16, 3, 153}, - {0x01, 2, 161}, - {0x16, 3, 161}, - {0x01, 2, 167}, - {0x16, 3, 167}, - {0x01, 2, 172}, - {0x16, 3, 172}, + {0x02, 0x02, 0xE0}, + {0x09, 0x02, 0xE0}, + {0x17, 0x02, 0xE0}, + {0x28, 0x03, 0xE0}, + {0x02, 0x02, 0xE2}, + {0x09, 0x02, 0xE2}, + {0x17, 0x02, 0xE2}, + {0x28, 0x03, 0xE2}, + {0x01, 0x02, 0x99}, + {0x16, 0x03, 0x99}, + {0x01, 0x02, 0xA1}, + {0x16, 0x03, 0xA1}, + {0x01, 0x02, 0xA7}, + {0x16, 0x03, 0xA7}, + {0x01, 0x02, 0xAC}, + {0x16, 0x03, 0xAC}, }, /* 106 */ { - {0x03, 2, 224}, - {0x06, 2, 224}, - {0x0A, 2, 224}, - {0x0F, 2, 224}, - {0x18, 2, 224}, - {0x1F, 2, 224}, - {0x29, 2, 224}, - {0x38, 3, 224}, - {0x03, 2, 226}, - {0x06, 2, 226}, - {0x0A, 2, 226}, - {0x0F, 2, 226}, - {0x18, 2, 226}, - {0x1F, 2, 226}, - {0x29, 2, 226}, - {0x38, 3, 226}, + {0x03, 0x02, 0xE0}, + {0x06, 0x02, 0xE0}, + {0x0A, 0x02, 0xE0}, + {0x0F, 0x02, 0xE0}, + {0x18, 0x02, 0xE0}, + {0x1F, 0x02, 0xE0}, + {0x29, 0x02, 0xE0}, + {0x38, 0x03, 0xE0}, + {0x03, 0x02, 0xE2}, + {0x06, 0x02, 0xE2}, + {0x0A, 0x02, 0xE2}, + {0x0F, 0x02, 0xE2}, + {0x18, 0x02, 0xE2}, + {0x1F, 0x02, 0xE2}, + {0x29, 0x02, 0xE2}, + {0x38, 0x03, 0xE2}, }, /* 107 */ { - {0x02, 2, 153}, - {0x09, 2, 153}, - {0x17, 2, 153}, - {0x28, 3, 153}, - {0x02, 2, 161}, - {0x09, 2, 161}, - {0x17, 2, 161}, - {0x28, 3, 161}, - {0x02, 2, 167}, - {0x09, 2, 167}, - {0x17, 2, 167}, - {0x28, 3, 167}, - {0x02, 2, 172}, - {0x09, 2, 172}, - {0x17, 2, 172}, - {0x28, 3, 172}, + {0x02, 0x02, 0x99}, + {0x09, 0x02, 0x99}, + {0x17, 0x02, 0x99}, + {0x28, 0x03, 0x99}, + {0x02, 0x02, 0xA1}, + {0x09, 0x02, 0xA1}, + {0x17, 0x02, 0xA1}, + {0x28, 0x03, 0xA1}, + {0x02, 0x02, 0xA7}, + {0x09, 0x02, 0xA7}, + {0x17, 0x02, 0xA7}, + {0x28, 0x03, 0xA7}, + {0x02, 0x02, 0xAC}, + {0x09, 0x02, 0xAC}, + {0x17, 0x02, 0xAC}, + {0x28, 0x03, 0xAC}, }, /* 108 */ { - {0x03, 2, 153}, - {0x06, 2, 153}, - {0x0A, 2, 153}, - {0x0F, 2, 153}, - {0x18, 2, 153}, - {0x1F, 2, 153}, - {0x29, 2, 153}, - {0x38, 3, 153}, - {0x03, 2, 161}, - {0x06, 2, 161}, - {0x0A, 2, 161}, - {0x0F, 2, 161}, - {0x18, 2, 161}, - {0x1F, 2, 161}, - {0x29, 2, 161}, - {0x38, 3, 161}, + {0x03, 0x02, 0x99}, + {0x06, 0x02, 0x99}, + {0x0A, 0x02, 0x99}, + {0x0F, 0x02, 0x99}, + {0x18, 0x02, 0x99}, + {0x1F, 0x02, 0x99}, + {0x29, 0x02, 0x99}, + {0x38, 0x03, 0x99}, + {0x03, 0x02, 0xA1}, + {0x06, 0x02, 0xA1}, + {0x0A, 0x02, 0xA1}, + {0x0F, 0x02, 0xA1}, + {0x18, 0x02, 0xA1}, + {0x1F, 0x02, 0xA1}, + {0x29, 0x02, 0xA1}, + {0x38, 0x03, 0xA1}, }, /* 109 */ { - {0x03, 2, 167}, - {0x06, 2, 167}, - {0x0A, 2, 167}, - {0x0F, 2, 167}, - {0x18, 2, 167}, - {0x1F, 2, 167}, - {0x29, 2, 167}, - {0x38, 3, 167}, - {0x03, 2, 172}, - {0x06, 2, 172}, - {0x0A, 2, 172}, - {0x0F, 2, 172}, - {0x18, 2, 172}, - {0x1F, 2, 172}, - {0x29, 2, 172}, - {0x38, 3, 172}, + {0x03, 0x02, 0xA7}, + {0x06, 0x02, 0xA7}, + {0x0A, 0x02, 0xA7}, + {0x0F, 0x02, 0xA7}, + {0x18, 0x02, 0xA7}, + {0x1F, 0x02, 0xA7}, + {0x29, 0x02, 0xA7}, + {0x38, 0x03, 0xA7}, + {0x03, 0x02, 0xAC}, + {0x06, 0x02, 0xAC}, + {0x0A, 0x02, 0xAC}, + {0x0F, 0x02, 0xAC}, + {0x18, 0x02, 0xAC}, + {0x1F, 0x02, 0xAC}, + {0x29, 0x02, 0xAC}, + {0x38, 0x03, 0xAC}, }, /* 110 */ { - {0x72, 0, 0}, - {0x73, 0, 0}, - {0x75, 0, 0}, - {0x76, 0, 0}, - {0x79, 0, 0}, - {0x7B, 0, 0}, - {0x7F, 0, 0}, - {0x82, 0, 0}, - {0x88, 0, 0}, - {0x8B, 0, 0}, - {0x8F, 0, 0}, - {0x92, 0, 0}, - {0x9B, 0, 0}, - {0xA2, 0, 0}, - {0xAA, 0, 0}, - {0xB4, 0, 0}, + {0x72, 0x00, 0x00}, + {0x73, 0x00, 0x00}, + {0x75, 0x00, 0x00}, + {0x76, 0x00, 0x00}, + {0x79, 0x00, 0x00}, + {0x7B, 0x00, 0x00}, + {0x7F, 0x00, 0x00}, + {0x82, 0x00, 0x00}, + {0x88, 0x00, 0x00}, + {0x8B, 0x00, 0x00}, + {0x8F, 0x00, 0x00}, + {0x92, 0x00, 0x00}, + {0x9B, 0x00, 0x00}, + {0xA2, 0x00, 0x00}, + {0xAA, 0x00, 0x00}, + {0xB4, 0x00, 0x00}, }, /* 111 */ { - {0x00, 3, 176}, - {0x00, 3, 177}, - {0x00, 3, 179}, - {0x00, 3, 209}, - {0x00, 3, 216}, - {0x00, 3, 217}, - {0x00, 3, 227}, - {0x00, 3, 229}, - {0x00, 3, 230}, - {0x7A, 0, 0}, - {0x7C, 0, 0}, - {0x7D, 0, 0}, - {0x80, 0, 0}, - {0x81, 0, 0}, - {0x83, 0, 0}, - {0x84, 0, 0}, + {0x00, 0x03, 0xB0}, + {0x00, 0x03, 0xB1}, + {0x00, 0x03, 0xB3}, + {0x00, 0x03, 0xD1}, + {0x00, 0x03, 0xD8}, + {0x00, 0x03, 0xD9}, + {0x00, 0x03, 0xE3}, + {0x00, 0x03, 0xE5}, + {0x00, 0x03, 0xE6}, + {0x7A, 0x00, 0x00}, + {0x7C, 0x00, 0x00}, + {0x7D, 0x00, 0x00}, + {0x80, 0x00, 0x00}, + {0x81, 0x00, 0x00}, + {0x83, 0x00, 0x00}, + {0x84, 0x00, 0x00}, }, /* 112 */ { - {0x01, 2, 176}, - {0x16, 3, 176}, - {0x01, 2, 177}, - {0x16, 3, 177}, - {0x01, 2, 179}, - {0x16, 3, 179}, - {0x01, 2, 209}, - {0x16, 3, 209}, - {0x01, 2, 216}, - {0x16, 3, 216}, - {0x01, 2, 217}, - {0x16, 3, 217}, - {0x01, 2, 227}, - {0x16, 3, 227}, - {0x01, 2, 229}, - {0x16, 3, 229}, + {0x01, 0x02, 0xB0}, + {0x16, 0x03, 0xB0}, + {0x01, 0x02, 0xB1}, + {0x16, 0x03, 0xB1}, + {0x01, 0x02, 0xB3}, + {0x16, 0x03, 0xB3}, + {0x01, 0x02, 0xD1}, + {0x16, 0x03, 0xD1}, + {0x01, 0x02, 0xD8}, + {0x16, 0x03, 0xD8}, + {0x01, 0x02, 0xD9}, + {0x16, 0x03, 0xD9}, + {0x01, 0x02, 0xE3}, + {0x16, 0x03, 0xE3}, + {0x01, 0x02, 0xE5}, + {0x16, 0x03, 0xE5}, }, /* 113 */ { - {0x02, 2, 176}, - {0x09, 2, 176}, - {0x17, 2, 176}, - {0x28, 3, 176}, - {0x02, 2, 177}, - {0x09, 2, 177}, - {0x17, 2, 177}, - {0x28, 3, 177}, - {0x02, 2, 179}, - {0x09, 2, 179}, - {0x17, 2, 179}, - {0x28, 3, 179}, - {0x02, 2, 209}, - {0x09, 2, 209}, - {0x17, 2, 209}, - {0x28, 3, 209}, + {0x02, 0x02, 0xB0}, + {0x09, 0x02, 0xB0}, + {0x17, 0x02, 0xB0}, + {0x28, 0x03, 0xB0}, + {0x02, 0x02, 0xB1}, + {0x09, 0x02, 0xB1}, + {0x17, 0x02, 0xB1}, + {0x28, 0x03, 0xB1}, + {0x02, 0x02, 0xB3}, + {0x09, 0x02, 0xB3}, + {0x17, 0x02, 0xB3}, + {0x28, 0x03, 0xB3}, + {0x02, 0x02, 0xD1}, + {0x09, 0x02, 0xD1}, + {0x17, 0x02, 0xD1}, + {0x28, 0x03, 0xD1}, }, /* 114 */ { - {0x03, 2, 176}, - {0x06, 2, 176}, - {0x0A, 2, 176}, - {0x0F, 2, 176}, - {0x18, 2, 176}, - {0x1F, 2, 176}, - {0x29, 2, 176}, - {0x38, 3, 176}, - {0x03, 2, 177}, - {0x06, 2, 177}, - {0x0A, 2, 177}, - {0x0F, 2, 177}, - {0x18, 2, 177}, - {0x1F, 2, 177}, - {0x29, 2, 177}, - {0x38, 3, 177}, + {0x03, 0x02, 0xB0}, + {0x06, 0x02, 0xB0}, + {0x0A, 0x02, 0xB0}, + {0x0F, 0x02, 0xB0}, + {0x18, 0x02, 0xB0}, + {0x1F, 0x02, 0xB0}, + {0x29, 0x02, 0xB0}, + {0x38, 0x03, 0xB0}, + {0x03, 0x02, 0xB1}, + {0x06, 0x02, 0xB1}, + {0x0A, 0x02, 0xB1}, + {0x0F, 0x02, 0xB1}, + {0x18, 0x02, 0xB1}, + {0x1F, 0x02, 0xB1}, + {0x29, 0x02, 0xB1}, + {0x38, 0x03, 0xB1}, }, /* 115 */ { - {0x03, 2, 179}, - {0x06, 2, 179}, - {0x0A, 2, 179}, - {0x0F, 2, 179}, - {0x18, 2, 179}, - {0x1F, 2, 179}, - {0x29, 2, 179}, - {0x38, 3, 179}, - {0x03, 2, 209}, - {0x06, 2, 209}, - {0x0A, 2, 209}, - {0x0F, 2, 209}, - {0x18, 2, 209}, - {0x1F, 2, 209}, - {0x29, 2, 209}, - {0x38, 3, 209}, + {0x03, 0x02, 0xB3}, + {0x06, 0x02, 0xB3}, + {0x0A, 0x02, 0xB3}, + {0x0F, 0x02, 0xB3}, + {0x18, 0x02, 0xB3}, + {0x1F, 0x02, 0xB3}, + {0x29, 0x02, 0xB3}, + {0x38, 0x03, 0xB3}, + {0x03, 0x02, 0xD1}, + {0x06, 0x02, 0xD1}, + {0x0A, 0x02, 0xD1}, + {0x0F, 0x02, 0xD1}, + {0x18, 0x02, 0xD1}, + {0x1F, 0x02, 0xD1}, + {0x29, 0x02, 0xD1}, + {0x38, 0x03, 0xD1}, }, /* 116 */ { - {0x02, 2, 216}, - {0x09, 2, 216}, - {0x17, 2, 216}, - {0x28, 3, 216}, - {0x02, 2, 217}, - {0x09, 2, 217}, - {0x17, 2, 217}, - {0x28, 3, 217}, - {0x02, 2, 227}, - {0x09, 2, 227}, - {0x17, 2, 227}, - {0x28, 3, 227}, - {0x02, 2, 229}, - {0x09, 2, 229}, - {0x17, 2, 229}, - {0x28, 3, 229}, + {0x02, 0x02, 0xD8}, + {0x09, 0x02, 0xD8}, + {0x17, 0x02, 0xD8}, + {0x28, 0x03, 0xD8}, + {0x02, 0x02, 0xD9}, + {0x09, 0x02, 0xD9}, + {0x17, 0x02, 0xD9}, + {0x28, 0x03, 0xD9}, + {0x02, 0x02, 0xE3}, + {0x09, 0x02, 0xE3}, + {0x17, 0x02, 0xE3}, + {0x28, 0x03, 0xE3}, + {0x02, 0x02, 0xE5}, + {0x09, 0x02, 0xE5}, + {0x17, 0x02, 0xE5}, + {0x28, 0x03, 0xE5}, }, /* 117 */ { - {0x03, 2, 216}, - {0x06, 2, 216}, - {0x0A, 2, 216}, - {0x0F, 2, 216}, - {0x18, 2, 216}, - {0x1F, 2, 216}, - {0x29, 2, 216}, - {0x38, 3, 216}, - {0x03, 2, 217}, - {0x06, 2, 217}, - {0x0A, 2, 217}, - {0x0F, 2, 217}, - {0x18, 2, 217}, - {0x1F, 2, 217}, - {0x29, 2, 217}, - {0x38, 3, 217}, + {0x03, 0x02, 0xD8}, + {0x06, 0x02, 0xD8}, + {0x0A, 0x02, 0xD8}, + {0x0F, 0x02, 0xD8}, + {0x18, 0x02, 0xD8}, + {0x1F, 0x02, 0xD8}, + {0x29, 0x02, 0xD8}, + {0x38, 0x03, 0xD8}, + {0x03, 0x02, 0xD9}, + {0x06, 0x02, 0xD9}, + {0x0A, 0x02, 0xD9}, + {0x0F, 0x02, 0xD9}, + {0x18, 0x02, 0xD9}, + {0x1F, 0x02, 0xD9}, + {0x29, 0x02, 0xD9}, + {0x38, 0x03, 0xD9}, }, /* 118 */ { - {0x03, 2, 227}, - {0x06, 2, 227}, - {0x0A, 2, 227}, - {0x0F, 2, 227}, - {0x18, 2, 227}, - {0x1F, 2, 227}, - {0x29, 2, 227}, - {0x38, 3, 227}, - {0x03, 2, 229}, - {0x06, 2, 229}, - {0x0A, 2, 229}, - {0x0F, 2, 229}, - {0x18, 2, 229}, - {0x1F, 2, 229}, - {0x29, 2, 229}, - {0x38, 3, 229}, + {0x03, 0x02, 0xE3}, + {0x06, 0x02, 0xE3}, + {0x0A, 0x02, 0xE3}, + {0x0F, 0x02, 0xE3}, + {0x18, 0x02, 0xE3}, + {0x1F, 0x02, 0xE3}, + {0x29, 0x02, 0xE3}, + {0x38, 0x03, 0xE3}, + {0x03, 0x02, 0xE5}, + {0x06, 0x02, 0xE5}, + {0x0A, 0x02, 0xE5}, + {0x0F, 0x02, 0xE5}, + {0x18, 0x02, 0xE5}, + {0x1F, 0x02, 0xE5}, + {0x29, 0x02, 0xE5}, + {0x38, 0x03, 0xE5}, }, /* 119 */ { - {0x01, 2, 230}, - {0x16, 3, 230}, - {0x00, 3, 129}, - {0x00, 3, 132}, - {0x00, 3, 133}, - {0x00, 3, 134}, - {0x00, 3, 136}, - {0x00, 3, 146}, - {0x00, 3, 154}, - {0x00, 3, 156}, - {0x00, 3, 160}, - {0x00, 3, 163}, - {0x00, 3, 164}, - {0x00, 3, 169}, - {0x00, 3, 170}, - {0x00, 3, 173}, + {0x01, 0x02, 0xE6}, + {0x16, 0x03, 0xE6}, + {0x00, 0x03, 0x81}, + {0x00, 0x03, 0x84}, + {0x00, 0x03, 0x85}, + {0x00, 0x03, 0x86}, + {0x00, 0x03, 0x88}, + {0x00, 0x03, 0x92}, + {0x00, 0x03, 0x9A}, + {0x00, 0x03, 0x9C}, + {0x00, 0x03, 0xA0}, + {0x00, 0x03, 0xA3}, + {0x00, 0x03, 0xA4}, + {0x00, 0x03, 0xA9}, + {0x00, 0x03, 0xAA}, + {0x00, 0x03, 0xAD}, }, /* 120 */ { - {0x02, 2, 230}, - {0x09, 2, 230}, - {0x17, 2, 230}, - {0x28, 3, 230}, - {0x01, 2, 129}, - {0x16, 3, 129}, - {0x01, 2, 132}, - {0x16, 3, 132}, - {0x01, 2, 133}, - {0x16, 3, 133}, - {0x01, 2, 134}, - {0x16, 3, 134}, - {0x01, 2, 136}, - {0x16, 3, 136}, - {0x01, 2, 146}, - {0x16, 3, 146}, + {0x02, 0x02, 0xE6}, + {0x09, 0x02, 0xE6}, + {0x17, 0x02, 0xE6}, + {0x28, 0x03, 0xE6}, + {0x01, 0x02, 0x81}, + {0x16, 0x03, 0x81}, + {0x01, 0x02, 0x84}, + {0x16, 0x03, 0x84}, + {0x01, 0x02, 0x85}, + {0x16, 0x03, 0x85}, + {0x01, 0x02, 0x86}, + {0x16, 0x03, 0x86}, + {0x01, 0x02, 0x88}, + {0x16, 0x03, 0x88}, + {0x01, 0x02, 0x92}, + {0x16, 0x03, 0x92}, }, /* 121 */ { - {0x03, 2, 230}, - {0x06, 2, 230}, - {0x0A, 2, 230}, - {0x0F, 2, 230}, - {0x18, 2, 230}, - {0x1F, 2, 230}, - {0x29, 2, 230}, - {0x38, 3, 230}, - {0x02, 2, 129}, - {0x09, 2, 129}, - {0x17, 2, 129}, - {0x28, 3, 129}, - {0x02, 2, 132}, - {0x09, 2, 132}, - {0x17, 2, 132}, - {0x28, 3, 132}, + {0x03, 0x02, 0xE6}, + {0x06, 0x02, 0xE6}, + {0x0A, 0x02, 0xE6}, + {0x0F, 0x02, 0xE6}, + {0x18, 0x02, 0xE6}, + {0x1F, 0x02, 0xE6}, + {0x29, 0x02, 0xE6}, + {0x38, 0x03, 0xE6}, + {0x02, 0x02, 0x81}, + {0x09, 0x02, 0x81}, + {0x17, 0x02, 0x81}, + {0x28, 0x03, 0x81}, + {0x02, 0x02, 0x84}, + {0x09, 0x02, 0x84}, + {0x17, 0x02, 0x84}, + {0x28, 0x03, 0x84}, }, /* 122 */ { - {0x03, 2, 129}, - {0x06, 2, 129}, - {0x0A, 2, 129}, - {0x0F, 2, 129}, - {0x18, 2, 129}, - {0x1F, 2, 129}, - {0x29, 2, 129}, - {0x38, 3, 129}, - {0x03, 2, 132}, - {0x06, 2, 132}, - {0x0A, 2, 132}, - {0x0F, 2, 132}, - {0x18, 2, 132}, - {0x1F, 2, 132}, - {0x29, 2, 132}, - {0x38, 3, 132}, + {0x03, 0x02, 0x81}, + {0x06, 0x02, 0x81}, + {0x0A, 0x02, 0x81}, + {0x0F, 0x02, 0x81}, + {0x18, 0x02, 0x81}, + {0x1F, 0x02, 0x81}, + {0x29, 0x02, 0x81}, + {0x38, 0x03, 0x81}, + {0x03, 0x02, 0x84}, + {0x06, 0x02, 0x84}, + {0x0A, 0x02, 0x84}, + {0x0F, 0x02, 0x84}, + {0x18, 0x02, 0x84}, + {0x1F, 0x02, 0x84}, + {0x29, 0x02, 0x84}, + {0x38, 0x03, 0x84}, }, /* 123 */ { - {0x02, 2, 133}, - {0x09, 2, 133}, - {0x17, 2, 133}, - {0x28, 3, 133}, - {0x02, 2, 134}, - {0x09, 2, 134}, - {0x17, 2, 134}, - {0x28, 3, 134}, - {0x02, 2, 136}, - {0x09, 2, 136}, - {0x17, 2, 136}, - {0x28, 3, 136}, - {0x02, 2, 146}, - {0x09, 2, 146}, - {0x17, 2, 146}, - {0x28, 3, 146}, + {0x02, 0x02, 0x85}, + {0x09, 0x02, 0x85}, + {0x17, 0x02, 0x85}, + {0x28, 0x03, 0x85}, + {0x02, 0x02, 0x86}, + {0x09, 0x02, 0x86}, + {0x17, 0x02, 0x86}, + {0x28, 0x03, 0x86}, + {0x02, 0x02, 0x88}, + {0x09, 0x02, 0x88}, + {0x17, 0x02, 0x88}, + {0x28, 0x03, 0x88}, + {0x02, 0x02, 0x92}, + {0x09, 0x02, 0x92}, + {0x17, 0x02, 0x92}, + {0x28, 0x03, 0x92}, }, /* 124 */ { - {0x03, 2, 133}, - {0x06, 2, 133}, - {0x0A, 2, 133}, - {0x0F, 2, 133}, - {0x18, 2, 133}, - {0x1F, 2, 133}, - {0x29, 2, 133}, - {0x38, 3, 133}, - {0x03, 2, 134}, - {0x06, 2, 134}, - {0x0A, 2, 134}, - {0x0F, 2, 134}, - {0x18, 2, 134}, - {0x1F, 2, 134}, - {0x29, 2, 134}, - {0x38, 3, 134}, + {0x03, 0x02, 0x85}, + {0x06, 0x02, 0x85}, + {0x0A, 0x02, 0x85}, + {0x0F, 0x02, 0x85}, + {0x18, 0x02, 0x85}, + {0x1F, 0x02, 0x85}, + {0x29, 0x02, 0x85}, + {0x38, 0x03, 0x85}, + {0x03, 0x02, 0x86}, + {0x06, 0x02, 0x86}, + {0x0A, 0x02, 0x86}, + {0x0F, 0x02, 0x86}, + {0x18, 0x02, 0x86}, + {0x1F, 0x02, 0x86}, + {0x29, 0x02, 0x86}, + {0x38, 0x03, 0x86}, }, /* 125 */ { - {0x03, 2, 136}, - {0x06, 2, 136}, - {0x0A, 2, 136}, - {0x0F, 2, 136}, - {0x18, 2, 136}, - {0x1F, 2, 136}, - {0x29, 2, 136}, - {0x38, 3, 136}, - {0x03, 2, 146}, - {0x06, 2, 146}, - {0x0A, 2, 146}, - {0x0F, 2, 146}, - {0x18, 2, 146}, - {0x1F, 2, 146}, - {0x29, 2, 146}, - {0x38, 3, 146}, + {0x03, 0x02, 0x88}, + {0x06, 0x02, 0x88}, + {0x0A, 0x02, 0x88}, + {0x0F, 0x02, 0x88}, + {0x18, 0x02, 0x88}, + {0x1F, 0x02, 0x88}, + {0x29, 0x02, 0x88}, + {0x38, 0x03, 0x88}, + {0x03, 0x02, 0x92}, + {0x06, 0x02, 0x92}, + {0x0A, 0x02, 0x92}, + {0x0F, 0x02, 0x92}, + {0x18, 0x02, 0x92}, + {0x1F, 0x02, 0x92}, + {0x29, 0x02, 0x92}, + {0x38, 0x03, 0x92}, }, /* 126 */ { - {0x01, 2, 154}, - {0x16, 3, 154}, - {0x01, 2, 156}, - {0x16, 3, 156}, - {0x01, 2, 160}, - {0x16, 3, 160}, - {0x01, 2, 163}, - {0x16, 3, 163}, - {0x01, 2, 164}, - {0x16, 3, 164}, - {0x01, 2, 169}, - {0x16, 3, 169}, - {0x01, 2, 170}, - {0x16, 3, 170}, - {0x01, 2, 173}, - {0x16, 3, 173}, + {0x01, 0x02, 0x9A}, + {0x16, 0x03, 0x9A}, + {0x01, 0x02, 0x9C}, + {0x16, 0x03, 0x9C}, + {0x01, 0x02, 0xA0}, + {0x16, 0x03, 0xA0}, + {0x01, 0x02, 0xA3}, + {0x16, 0x03, 0xA3}, + {0x01, 0x02, 0xA4}, + {0x16, 0x03, 0xA4}, + {0x01, 0x02, 0xA9}, + {0x16, 0x03, 0xA9}, + {0x01, 0x02, 0xAA}, + {0x16, 0x03, 0xAA}, + {0x01, 0x02, 0xAD}, + {0x16, 0x03, 0xAD}, }, /* 127 */ { - {0x02, 2, 154}, - {0x09, 2, 154}, - {0x17, 2, 154}, - {0x28, 3, 154}, - {0x02, 2, 156}, - {0x09, 2, 156}, - {0x17, 2, 156}, - {0x28, 3, 156}, - {0x02, 2, 160}, - {0x09, 2, 160}, - {0x17, 2, 160}, - {0x28, 3, 160}, - {0x02, 2, 163}, - {0x09, 2, 163}, - {0x17, 2, 163}, - {0x28, 3, 163}, + {0x02, 0x02, 0x9A}, + {0x09, 0x02, 0x9A}, + {0x17, 0x02, 0x9A}, + {0x28, 0x03, 0x9A}, + {0x02, 0x02, 0x9C}, + {0x09, 0x02, 0x9C}, + {0x17, 0x02, 0x9C}, + {0x28, 0x03, 0x9C}, + {0x02, 0x02, 0xA0}, + {0x09, 0x02, 0xA0}, + {0x17, 0x02, 0xA0}, + {0x28, 0x03, 0xA0}, + {0x02, 0x02, 0xA3}, + {0x09, 0x02, 0xA3}, + {0x17, 0x02, 0xA3}, + {0x28, 0x03, 0xA3}, }, /* 128 */ { - {0x03, 2, 154}, - {0x06, 2, 154}, - {0x0A, 2, 154}, - {0x0F, 2, 154}, - {0x18, 2, 154}, - {0x1F, 2, 154}, - {0x29, 2, 154}, - {0x38, 3, 154}, - {0x03, 2, 156}, - {0x06, 2, 156}, - {0x0A, 2, 156}, - {0x0F, 2, 156}, - {0x18, 2, 156}, - {0x1F, 2, 156}, - {0x29, 2, 156}, - {0x38, 3, 156}, + {0x03, 0x02, 0x9A}, + {0x06, 0x02, 0x9A}, + {0x0A, 0x02, 0x9A}, + {0x0F, 0x02, 0x9A}, + {0x18, 0x02, 0x9A}, + {0x1F, 0x02, 0x9A}, + {0x29, 0x02, 0x9A}, + {0x38, 0x03, 0x9A}, + {0x03, 0x02, 0x9C}, + {0x06, 0x02, 0x9C}, + {0x0A, 0x02, 0x9C}, + {0x0F, 0x02, 0x9C}, + {0x18, 0x02, 0x9C}, + {0x1F, 0x02, 0x9C}, + {0x29, 0x02, 0x9C}, + {0x38, 0x03, 0x9C}, }, /* 129 */ { - {0x03, 2, 160}, - {0x06, 2, 160}, - {0x0A, 2, 160}, - {0x0F, 2, 160}, - {0x18, 2, 160}, - {0x1F, 2, 160}, - {0x29, 2, 160}, - {0x38, 3, 160}, - {0x03, 2, 163}, - {0x06, 2, 163}, - {0x0A, 2, 163}, - {0x0F, 2, 163}, - {0x18, 2, 163}, - {0x1F, 2, 163}, - {0x29, 2, 163}, - {0x38, 3, 163}, + {0x03, 0x02, 0xA0}, + {0x06, 0x02, 0xA0}, + {0x0A, 0x02, 0xA0}, + {0x0F, 0x02, 0xA0}, + {0x18, 0x02, 0xA0}, + {0x1F, 0x02, 0xA0}, + {0x29, 0x02, 0xA0}, + {0x38, 0x03, 0xA0}, + {0x03, 0x02, 0xA3}, + {0x06, 0x02, 0xA3}, + {0x0A, 0x02, 0xA3}, + {0x0F, 0x02, 0xA3}, + {0x18, 0x02, 0xA3}, + {0x1F, 0x02, 0xA3}, + {0x29, 0x02, 0xA3}, + {0x38, 0x03, 0xA3}, }, /* 130 */ { - {0x02, 2, 164}, - {0x09, 2, 164}, - {0x17, 2, 164}, - {0x28, 3, 164}, - {0x02, 2, 169}, - {0x09, 2, 169}, - {0x17, 2, 169}, - {0x28, 3, 169}, - {0x02, 2, 170}, - {0x09, 2, 170}, - {0x17, 2, 170}, - {0x28, 3, 170}, - {0x02, 2, 173}, - {0x09, 2, 173}, - {0x17, 2, 173}, - {0x28, 3, 173}, + {0x02, 0x02, 0xA4}, + {0x09, 0x02, 0xA4}, + {0x17, 0x02, 0xA4}, + {0x28, 0x03, 0xA4}, + {0x02, 0x02, 0xA9}, + {0x09, 0x02, 0xA9}, + {0x17, 0x02, 0xA9}, + {0x28, 0x03, 0xA9}, + {0x02, 0x02, 0xAA}, + {0x09, 0x02, 0xAA}, + {0x17, 0x02, 0xAA}, + {0x28, 0x03, 0xAA}, + {0x02, 0x02, 0xAD}, + {0x09, 0x02, 0xAD}, + {0x17, 0x02, 0xAD}, + {0x28, 0x03, 0xAD}, }, /* 131 */ { - {0x03, 2, 164}, - {0x06, 2, 164}, - {0x0A, 2, 164}, - {0x0F, 2, 164}, - {0x18, 2, 164}, - {0x1F, 2, 164}, - {0x29, 2, 164}, - {0x38, 3, 164}, - {0x03, 2, 169}, - {0x06, 2, 169}, - {0x0A, 2, 169}, - {0x0F, 2, 169}, - {0x18, 2, 169}, - {0x1F, 2, 169}, - {0x29, 2, 169}, - {0x38, 3, 169}, + {0x03, 0x02, 0xA4}, + {0x06, 0x02, 0xA4}, + {0x0A, 0x02, 0xA4}, + {0x0F, 0x02, 0xA4}, + {0x18, 0x02, 0xA4}, + {0x1F, 0x02, 0xA4}, + {0x29, 0x02, 0xA4}, + {0x38, 0x03, 0xA4}, + {0x03, 0x02, 0xA9}, + {0x06, 0x02, 0xA9}, + {0x0A, 0x02, 0xA9}, + {0x0F, 0x02, 0xA9}, + {0x18, 0x02, 0xA9}, + {0x1F, 0x02, 0xA9}, + {0x29, 0x02, 0xA9}, + {0x38, 0x03, 0xA9}, }, /* 132 */ { - {0x03, 2, 170}, - {0x06, 2, 170}, - {0x0A, 2, 170}, - {0x0F, 2, 170}, - {0x18, 2, 170}, - {0x1F, 2, 170}, - {0x29, 2, 170}, - {0x38, 3, 170}, - {0x03, 2, 173}, - {0x06, 2, 173}, - {0x0A, 2, 173}, - {0x0F, 2, 173}, - {0x18, 2, 173}, - {0x1F, 2, 173}, - {0x29, 2, 173}, - {0x38, 3, 173}, + {0x03, 0x02, 0xAA}, + {0x06, 0x02, 0xAA}, + {0x0A, 0x02, 0xAA}, + {0x0F, 0x02, 0xAA}, + {0x18, 0x02, 0xAA}, + {0x1F, 0x02, 0xAA}, + {0x29, 0x02, 0xAA}, + {0x38, 0x03, 0xAA}, + {0x03, 0x02, 0xAD}, + {0x06, 0x02, 0xAD}, + {0x0A, 0x02, 0xAD}, + {0x0F, 0x02, 0xAD}, + {0x18, 0x02, 0xAD}, + {0x1F, 0x02, 0xAD}, + {0x29, 0x02, 0xAD}, + {0x38, 0x03, 0xAD}, }, /* 133 */ { - {0x89, 0, 0}, - {0x8A, 0, 0}, - {0x8C, 0, 0}, - {0x8D, 0, 0}, - {0x90, 0, 0}, - {0x91, 0, 0}, - {0x93, 0, 0}, - {0x96, 0, 0}, - {0x9C, 0, 0}, - {0x9F, 0, 0}, - {0xA3, 0, 0}, - {0xA6, 0, 0}, - {0xAB, 0, 0}, - {0xAE, 0, 0}, - {0xB5, 0, 0}, - {0xBE, 0, 0}, + {0x89, 0x00, 0x00}, + {0x8A, 0x00, 0x00}, + {0x8C, 0x00, 0x00}, + {0x8D, 0x00, 0x00}, + {0x90, 0x00, 0x00}, + {0x91, 0x00, 0x00}, + {0x93, 0x00, 0x00}, + {0x96, 0x00, 0x00}, + {0x9C, 0x00, 0x00}, + {0x9F, 0x00, 0x00}, + {0xA3, 0x00, 0x00}, + {0xA6, 0x00, 0x00}, + {0xAB, 0x00, 0x00}, + {0xAE, 0x00, 0x00}, + {0xB5, 0x00, 0x00}, + {0xBE, 0x00, 0x00}, }, /* 134 */ { - {0x00, 3, 178}, - {0x00, 3, 181}, - {0x00, 3, 185}, - {0x00, 3, 186}, - {0x00, 3, 187}, - {0x00, 3, 189}, - {0x00, 3, 190}, - {0x00, 3, 196}, - {0x00, 3, 198}, - {0x00, 3, 228}, - {0x00, 3, 232}, - {0x00, 3, 233}, - {0x94, 0, 0}, - {0x95, 0, 0}, - {0x97, 0, 0}, - {0x98, 0, 0}, + {0x00, 0x03, 0xB2}, + {0x00, 0x03, 0xB5}, + {0x00, 0x03, 0xB9}, + {0x00, 0x03, 0xBA}, + {0x00, 0x03, 0xBB}, + {0x00, 0x03, 0xBD}, + {0x00, 0x03, 0xBE}, + {0x00, 0x03, 0xC4}, + {0x00, 0x03, 0xC6}, + {0x00, 0x03, 0xE4}, + {0x00, 0x03, 0xE8}, + {0x00, 0x03, 0xE9}, + {0x94, 0x00, 0x00}, + {0x95, 0x00, 0x00}, + {0x97, 0x00, 0x00}, + {0x98, 0x00, 0x00}, }, /* 135 */ { - {0x01, 2, 178}, - {0x16, 3, 178}, - {0x01, 2, 181}, - {0x16, 3, 181}, - {0x01, 2, 185}, - {0x16, 3, 185}, - {0x01, 2, 186}, - {0x16, 3, 186}, - {0x01, 2, 187}, - {0x16, 3, 187}, - {0x01, 2, 189}, - {0x16, 3, 189}, - {0x01, 2, 190}, - {0x16, 3, 190}, - {0x01, 2, 196}, - {0x16, 3, 196}, + {0x01, 0x02, 0xB2}, + {0x16, 0x03, 0xB2}, + {0x01, 0x02, 0xB5}, + {0x16, 0x03, 0xB5}, + {0x01, 0x02, 0xB9}, + {0x16, 0x03, 0xB9}, + {0x01, 0x02, 0xBA}, + {0x16, 0x03, 0xBA}, + {0x01, 0x02, 0xBB}, + {0x16, 0x03, 0xBB}, + {0x01, 0x02, 0xBD}, + {0x16, 0x03, 0xBD}, + {0x01, 0x02, 0xBE}, + {0x16, 0x03, 0xBE}, + {0x01, 0x02, 0xC4}, + {0x16, 0x03, 0xC4}, }, /* 136 */ { - {0x02, 2, 178}, - {0x09, 2, 178}, - {0x17, 2, 178}, - {0x28, 3, 178}, - {0x02, 2, 181}, - {0x09, 2, 181}, - {0x17, 2, 181}, - {0x28, 3, 181}, - {0x02, 2, 185}, - {0x09, 2, 185}, - {0x17, 2, 185}, - {0x28, 3, 185}, - {0x02, 2, 186}, - {0x09, 2, 186}, - {0x17, 2, 186}, - {0x28, 3, 186}, + {0x02, 0x02, 0xB2}, + {0x09, 0x02, 0xB2}, + {0x17, 0x02, 0xB2}, + {0x28, 0x03, 0xB2}, + {0x02, 0x02, 0xB5}, + {0x09, 0x02, 0xB5}, + {0x17, 0x02, 0xB5}, + {0x28, 0x03, 0xB5}, + {0x02, 0x02, 0xB9}, + {0x09, 0x02, 0xB9}, + {0x17, 0x02, 0xB9}, + {0x28, 0x03, 0xB9}, + {0x02, 0x02, 0xBA}, + {0x09, 0x02, 0xBA}, + {0x17, 0x02, 0xBA}, + {0x28, 0x03, 0xBA}, }, /* 137 */ { - {0x03, 2, 178}, - {0x06, 2, 178}, - {0x0A, 2, 178}, - {0x0F, 2, 178}, - {0x18, 2, 178}, - {0x1F, 2, 178}, - {0x29, 2, 178}, - {0x38, 3, 178}, - {0x03, 2, 181}, - {0x06, 2, 181}, - {0x0A, 2, 181}, - {0x0F, 2, 181}, - {0x18, 2, 181}, - {0x1F, 2, 181}, - {0x29, 2, 181}, - {0x38, 3, 181}, + {0x03, 0x02, 0xB2}, + {0x06, 0x02, 0xB2}, + {0x0A, 0x02, 0xB2}, + {0x0F, 0x02, 0xB2}, + {0x18, 0x02, 0xB2}, + {0x1F, 0x02, 0xB2}, + {0x29, 0x02, 0xB2}, + {0x38, 0x03, 0xB2}, + {0x03, 0x02, 0xB5}, + {0x06, 0x02, 0xB5}, + {0x0A, 0x02, 0xB5}, + {0x0F, 0x02, 0xB5}, + {0x18, 0x02, 0xB5}, + {0x1F, 0x02, 0xB5}, + {0x29, 0x02, 0xB5}, + {0x38, 0x03, 0xB5}, }, /* 138 */ { - {0x03, 2, 185}, - {0x06, 2, 185}, - {0x0A, 2, 185}, - {0x0F, 2, 185}, - {0x18, 2, 185}, - {0x1F, 2, 185}, - {0x29, 2, 185}, - {0x38, 3, 185}, - {0x03, 2, 186}, - {0x06, 2, 186}, - {0x0A, 2, 186}, - {0x0F, 2, 186}, - {0x18, 2, 186}, - {0x1F, 2, 186}, - {0x29, 2, 186}, - {0x38, 3, 186}, + {0x03, 0x02, 0xB9}, + {0x06, 0x02, 0xB9}, + {0x0A, 0x02, 0xB9}, + {0x0F, 0x02, 0xB9}, + {0x18, 0x02, 0xB9}, + {0x1F, 0x02, 0xB9}, + {0x29, 0x02, 0xB9}, + {0x38, 0x03, 0xB9}, + {0x03, 0x02, 0xBA}, + {0x06, 0x02, 0xBA}, + {0x0A, 0x02, 0xBA}, + {0x0F, 0x02, 0xBA}, + {0x18, 0x02, 0xBA}, + {0x1F, 0x02, 0xBA}, + {0x29, 0x02, 0xBA}, + {0x38, 0x03, 0xBA}, }, /* 139 */ { - {0x02, 2, 187}, - {0x09, 2, 187}, - {0x17, 2, 187}, - {0x28, 3, 187}, - {0x02, 2, 189}, - {0x09, 2, 189}, - {0x17, 2, 189}, - {0x28, 3, 189}, - {0x02, 2, 190}, - {0x09, 2, 190}, - {0x17, 2, 190}, - {0x28, 3, 190}, - {0x02, 2, 196}, - {0x09, 2, 196}, - {0x17, 2, 196}, - {0x28, 3, 196}, + {0x02, 0x02, 0xBB}, + {0x09, 0x02, 0xBB}, + {0x17, 0x02, 0xBB}, + {0x28, 0x03, 0xBB}, + {0x02, 0x02, 0xBD}, + {0x09, 0x02, 0xBD}, + {0x17, 0x02, 0xBD}, + {0x28, 0x03, 0xBD}, + {0x02, 0x02, 0xBE}, + {0x09, 0x02, 0xBE}, + {0x17, 0x02, 0xBE}, + {0x28, 0x03, 0xBE}, + {0x02, 0x02, 0xC4}, + {0x09, 0x02, 0xC4}, + {0x17, 0x02, 0xC4}, + {0x28, 0x03, 0xC4}, }, /* 140 */ { - {0x03, 2, 187}, - {0x06, 2, 187}, - {0x0A, 2, 187}, - {0x0F, 2, 187}, - {0x18, 2, 187}, - {0x1F, 2, 187}, - {0x29, 2, 187}, - {0x38, 3, 187}, - {0x03, 2, 189}, - {0x06, 2, 189}, - {0x0A, 2, 189}, - {0x0F, 2, 189}, - {0x18, 2, 189}, - {0x1F, 2, 189}, - {0x29, 2, 189}, - {0x38, 3, 189}, + {0x03, 0x02, 0xBB}, + {0x06, 0x02, 0xBB}, + {0x0A, 0x02, 0xBB}, + {0x0F, 0x02, 0xBB}, + {0x18, 0x02, 0xBB}, + {0x1F, 0x02, 0xBB}, + {0x29, 0x02, 0xBB}, + {0x38, 0x03, 0xBB}, + {0x03, 0x02, 0xBD}, + {0x06, 0x02, 0xBD}, + {0x0A, 0x02, 0xBD}, + {0x0F, 0x02, 0xBD}, + {0x18, 0x02, 0xBD}, + {0x1F, 0x02, 0xBD}, + {0x29, 0x02, 0xBD}, + {0x38, 0x03, 0xBD}, }, /* 141 */ { - {0x03, 2, 190}, - {0x06, 2, 190}, - {0x0A, 2, 190}, - {0x0F, 2, 190}, - {0x18, 2, 190}, - {0x1F, 2, 190}, - {0x29, 2, 190}, - {0x38, 3, 190}, - {0x03, 2, 196}, - {0x06, 2, 196}, - {0x0A, 2, 196}, - {0x0F, 2, 196}, - {0x18, 2, 196}, - {0x1F, 2, 196}, - {0x29, 2, 196}, - {0x38, 3, 196}, + {0x03, 0x02, 0xBE}, + {0x06, 0x02, 0xBE}, + {0x0A, 0x02, 0xBE}, + {0x0F, 0x02, 0xBE}, + {0x18, 0x02, 0xBE}, + {0x1F, 0x02, 0xBE}, + {0x29, 0x02, 0xBE}, + {0x38, 0x03, 0xBE}, + {0x03, 0x02, 0xC4}, + {0x06, 0x02, 0xC4}, + {0x0A, 0x02, 0xC4}, + {0x0F, 0x02, 0xC4}, + {0x18, 0x02, 0xC4}, + {0x1F, 0x02, 0xC4}, + {0x29, 0x02, 0xC4}, + {0x38, 0x03, 0xC4}, }, /* 142 */ { - {0x01, 2, 198}, - {0x16, 3, 198}, - {0x01, 2, 228}, - {0x16, 3, 228}, - {0x01, 2, 232}, - {0x16, 3, 232}, - {0x01, 2, 233}, - {0x16, 3, 233}, - {0x00, 3, 1}, - {0x00, 3, 135}, - {0x00, 3, 137}, - {0x00, 3, 138}, - {0x00, 3, 139}, - {0x00, 3, 140}, - {0x00, 3, 141}, - {0x00, 3, 143}, + {0x01, 0x02, 0xC6}, + {0x16, 0x03, 0xC6}, + {0x01, 0x02, 0xE4}, + {0x16, 0x03, 0xE4}, + {0x01, 0x02, 0xE8}, + {0x16, 0x03, 0xE8}, + {0x01, 0x02, 0xE9}, + {0x16, 0x03, 0xE9}, + {0x00, 0x03, 0x01}, + {0x00, 0x03, 0x87}, + {0x00, 0x03, 0x89}, + {0x00, 0x03, 0x8A}, + {0x00, 0x03, 0x8B}, + {0x00, 0x03, 0x8C}, + {0x00, 0x03, 0x8D}, + {0x00, 0x03, 0x8F}, }, /* 143 */ { - {0x02, 2, 198}, - {0x09, 2, 198}, - {0x17, 2, 198}, - {0x28, 3, 198}, - {0x02, 2, 228}, - {0x09, 2, 228}, - {0x17, 2, 228}, - {0x28, 3, 228}, - {0x02, 2, 232}, - {0x09, 2, 232}, - {0x17, 2, 232}, - {0x28, 3, 232}, - {0x02, 2, 233}, - {0x09, 2, 233}, - {0x17, 2, 233}, - {0x28, 3, 233}, + {0x02, 0x02, 0xC6}, + {0x09, 0x02, 0xC6}, + {0x17, 0x02, 0xC6}, + {0x28, 0x03, 0xC6}, + {0x02, 0x02, 0xE4}, + {0x09, 0x02, 0xE4}, + {0x17, 0x02, 0xE4}, + {0x28, 0x03, 0xE4}, + {0x02, 0x02, 0xE8}, + {0x09, 0x02, 0xE8}, + {0x17, 0x02, 0xE8}, + {0x28, 0x03, 0xE8}, + {0x02, 0x02, 0xE9}, + {0x09, 0x02, 0xE9}, + {0x17, 0x02, 0xE9}, + {0x28, 0x03, 0xE9}, }, /* 144 */ { - {0x03, 2, 198}, - {0x06, 2, 198}, - {0x0A, 2, 198}, - {0x0F, 2, 198}, - {0x18, 2, 198}, - {0x1F, 2, 198}, - {0x29, 2, 198}, - {0x38, 3, 198}, - {0x03, 2, 228}, - {0x06, 2, 228}, - {0x0A, 2, 228}, - {0x0F, 2, 228}, - {0x18, 2, 228}, - {0x1F, 2, 228}, - {0x29, 2, 228}, - {0x38, 3, 228}, + {0x03, 0x02, 0xC6}, + {0x06, 0x02, 0xC6}, + {0x0A, 0x02, 0xC6}, + {0x0F, 0x02, 0xC6}, + {0x18, 0x02, 0xC6}, + {0x1F, 0x02, 0xC6}, + {0x29, 0x02, 0xC6}, + {0x38, 0x03, 0xC6}, + {0x03, 0x02, 0xE4}, + {0x06, 0x02, 0xE4}, + {0x0A, 0x02, 0xE4}, + {0x0F, 0x02, 0xE4}, + {0x18, 0x02, 0xE4}, + {0x1F, 0x02, 0xE4}, + {0x29, 0x02, 0xE4}, + {0x38, 0x03, 0xE4}, }, /* 145 */ { - {0x03, 2, 232}, - {0x06, 2, 232}, - {0x0A, 2, 232}, - {0x0F, 2, 232}, - {0x18, 2, 232}, - {0x1F, 2, 232}, - {0x29, 2, 232}, - {0x38, 3, 232}, - {0x03, 2, 233}, - {0x06, 2, 233}, - {0x0A, 2, 233}, - {0x0F, 2, 233}, - {0x18, 2, 233}, - {0x1F, 2, 233}, - {0x29, 2, 233}, - {0x38, 3, 233}, + {0x03, 0x02, 0xE8}, + {0x06, 0x02, 0xE8}, + {0x0A, 0x02, 0xE8}, + {0x0F, 0x02, 0xE8}, + {0x18, 0x02, 0xE8}, + {0x1F, 0x02, 0xE8}, + {0x29, 0x02, 0xE8}, + {0x38, 0x03, 0xE8}, + {0x03, 0x02, 0xE9}, + {0x06, 0x02, 0xE9}, + {0x0A, 0x02, 0xE9}, + {0x0F, 0x02, 0xE9}, + {0x18, 0x02, 0xE9}, + {0x1F, 0x02, 0xE9}, + {0x29, 0x02, 0xE9}, + {0x38, 0x03, 0xE9}, }, /* 146 */ { - {0x01, 2, 1}, - {0x16, 3, 1}, - {0x01, 2, 135}, - {0x16, 3, 135}, - {0x01, 2, 137}, - {0x16, 3, 137}, - {0x01, 2, 138}, - {0x16, 3, 138}, - {0x01, 2, 139}, - {0x16, 3, 139}, - {0x01, 2, 140}, - {0x16, 3, 140}, - {0x01, 2, 141}, - {0x16, 3, 141}, - {0x01, 2, 143}, - {0x16, 3, 143}, + {0x01, 0x02, 0x01}, + {0x16, 0x03, 0x01}, + {0x01, 0x02, 0x87}, + {0x16, 0x03, 0x87}, + {0x01, 0x02, 0x89}, + {0x16, 0x03, 0x89}, + {0x01, 0x02, 0x8A}, + {0x16, 0x03, 0x8A}, + {0x01, 0x02, 0x8B}, + {0x16, 0x03, 0x8B}, + {0x01, 0x02, 0x8C}, + {0x16, 0x03, 0x8C}, + {0x01, 0x02, 0x8D}, + {0x16, 0x03, 0x8D}, + {0x01, 0x02, 0x8F}, + {0x16, 0x03, 0x8F}, }, /* 147 */ { - {0x02, 2, 1}, - {0x09, 2, 1}, - {0x17, 2, 1}, - {0x28, 3, 1}, - {0x02, 2, 135}, - {0x09, 2, 135}, - {0x17, 2, 135}, - {0x28, 3, 135}, - {0x02, 2, 137}, - {0x09, 2, 137}, - {0x17, 2, 137}, - {0x28, 3, 137}, - {0x02, 2, 138}, - {0x09, 2, 138}, - {0x17, 2, 138}, - {0x28, 3, 138}, + {0x02, 0x02, 0x01}, + {0x09, 0x02, 0x01}, + {0x17, 0x02, 0x01}, + {0x28, 0x03, 0x01}, + {0x02, 0x02, 0x87}, + {0x09, 0x02, 0x87}, + {0x17, 0x02, 0x87}, + {0x28, 0x03, 0x87}, + {0x02, 0x02, 0x89}, + {0x09, 0x02, 0x89}, + {0x17, 0x02, 0x89}, + {0x28, 0x03, 0x89}, + {0x02, 0x02, 0x8A}, + {0x09, 0x02, 0x8A}, + {0x17, 0x02, 0x8A}, + {0x28, 0x03, 0x8A}, }, /* 148 */ { - {0x03, 2, 1}, - {0x06, 2, 1}, - {0x0A, 2, 1}, - {0x0F, 2, 1}, - {0x18, 2, 1}, - {0x1F, 2, 1}, - {0x29, 2, 1}, - {0x38, 3, 1}, - {0x03, 2, 135}, - {0x06, 2, 135}, - {0x0A, 2, 135}, - {0x0F, 2, 135}, - {0x18, 2, 135}, - {0x1F, 2, 135}, - {0x29, 2, 135}, - {0x38, 3, 135}, + {0x03, 0x02, 0x01}, + {0x06, 0x02, 0x01}, + {0x0A, 0x02, 0x01}, + {0x0F, 0x02, 0x01}, + {0x18, 0x02, 0x01}, + {0x1F, 0x02, 0x01}, + {0x29, 0x02, 0x01}, + {0x38, 0x03, 0x01}, + {0x03, 0x02, 0x87}, + {0x06, 0x02, 0x87}, + {0x0A, 0x02, 0x87}, + {0x0F, 0x02, 0x87}, + {0x18, 0x02, 0x87}, + {0x1F, 0x02, 0x87}, + {0x29, 0x02, 0x87}, + {0x38, 0x03, 0x87}, }, /* 149 */ { - {0x03, 2, 137}, - {0x06, 2, 137}, - {0x0A, 2, 137}, - {0x0F, 2, 137}, - {0x18, 2, 137}, - {0x1F, 2, 137}, - {0x29, 2, 137}, - {0x38, 3, 137}, - {0x03, 2, 138}, - {0x06, 2, 138}, - {0x0A, 2, 138}, - {0x0F, 2, 138}, - {0x18, 2, 138}, - {0x1F, 2, 138}, - {0x29, 2, 138}, - {0x38, 3, 138}, + {0x03, 0x02, 0x89}, + {0x06, 0x02, 0x89}, + {0x0A, 0x02, 0x89}, + {0x0F, 0x02, 0x89}, + {0x18, 0x02, 0x89}, + {0x1F, 0x02, 0x89}, + {0x29, 0x02, 0x89}, + {0x38, 0x03, 0x89}, + {0x03, 0x02, 0x8A}, + {0x06, 0x02, 0x8A}, + {0x0A, 0x02, 0x8A}, + {0x0F, 0x02, 0x8A}, + {0x18, 0x02, 0x8A}, + {0x1F, 0x02, 0x8A}, + {0x29, 0x02, 0x8A}, + {0x38, 0x03, 0x8A}, }, /* 150 */ { - {0x02, 2, 139}, - {0x09, 2, 139}, - {0x17, 2, 139}, - {0x28, 3, 139}, - {0x02, 2, 140}, - {0x09, 2, 140}, - {0x17, 2, 140}, - {0x28, 3, 140}, - {0x02, 2, 141}, - {0x09, 2, 141}, - {0x17, 2, 141}, - {0x28, 3, 141}, - {0x02, 2, 143}, - {0x09, 2, 143}, - {0x17, 2, 143}, - {0x28, 3, 143}, + {0x02, 0x02, 0x8B}, + {0x09, 0x02, 0x8B}, + {0x17, 0x02, 0x8B}, + {0x28, 0x03, 0x8B}, + {0x02, 0x02, 0x8C}, + {0x09, 0x02, 0x8C}, + {0x17, 0x02, 0x8C}, + {0x28, 0x03, 0x8C}, + {0x02, 0x02, 0x8D}, + {0x09, 0x02, 0x8D}, + {0x17, 0x02, 0x8D}, + {0x28, 0x03, 0x8D}, + {0x02, 0x02, 0x8F}, + {0x09, 0x02, 0x8F}, + {0x17, 0x02, 0x8F}, + {0x28, 0x03, 0x8F}, }, /* 151 */ { - {0x03, 2, 139}, - {0x06, 2, 139}, - {0x0A, 2, 139}, - {0x0F, 2, 139}, - {0x18, 2, 139}, - {0x1F, 2, 139}, - {0x29, 2, 139}, - {0x38, 3, 139}, - {0x03, 2, 140}, - {0x06, 2, 140}, - {0x0A, 2, 140}, - {0x0F, 2, 140}, - {0x18, 2, 140}, - {0x1F, 2, 140}, - {0x29, 2, 140}, - {0x38, 3, 140}, + {0x03, 0x02, 0x8B}, + {0x06, 0x02, 0x8B}, + {0x0A, 0x02, 0x8B}, + {0x0F, 0x02, 0x8B}, + {0x18, 0x02, 0x8B}, + {0x1F, 0x02, 0x8B}, + {0x29, 0x02, 0x8B}, + {0x38, 0x03, 0x8B}, + {0x03, 0x02, 0x8C}, + {0x06, 0x02, 0x8C}, + {0x0A, 0x02, 0x8C}, + {0x0F, 0x02, 0x8C}, + {0x18, 0x02, 0x8C}, + {0x1F, 0x02, 0x8C}, + {0x29, 0x02, 0x8C}, + {0x38, 0x03, 0x8C}, }, /* 152 */ { - {0x03, 2, 141}, - {0x06, 2, 141}, - {0x0A, 2, 141}, - {0x0F, 2, 141}, - {0x18, 2, 141}, - {0x1F, 2, 141}, - {0x29, 2, 141}, - {0x38, 3, 141}, - {0x03, 2, 143}, - {0x06, 2, 143}, - {0x0A, 2, 143}, - {0x0F, 2, 143}, - {0x18, 2, 143}, - {0x1F, 2, 143}, - {0x29, 2, 143}, - {0x38, 3, 143}, + {0x03, 0x02, 0x8D}, + {0x06, 0x02, 0x8D}, + {0x0A, 0x02, 0x8D}, + {0x0F, 0x02, 0x8D}, + {0x18, 0x02, 0x8D}, + {0x1F, 0x02, 0x8D}, + {0x29, 0x02, 0x8D}, + {0x38, 0x03, 0x8D}, + {0x03, 0x02, 0x8F}, + {0x06, 0x02, 0x8F}, + {0x0A, 0x02, 0x8F}, + {0x0F, 0x02, 0x8F}, + {0x18, 0x02, 0x8F}, + {0x1F, 0x02, 0x8F}, + {0x29, 0x02, 0x8F}, + {0x38, 0x03, 0x8F}, }, /* 153 */ { - {0x9D, 0, 0}, - {0x9E, 0, 0}, - {0xA0, 0, 0}, - {0xA1, 0, 0}, - {0xA4, 0, 0}, - {0xA5, 0, 0}, - {0xA7, 0, 0}, - {0xA8, 0, 0}, - {0xAC, 0, 0}, - {0xAD, 0, 0}, - {0xAF, 0, 0}, - {0xB1, 0, 0}, - {0xB6, 0, 0}, - {0xB9, 0, 0}, - {0xBF, 0, 0}, - {0xCF, 0, 0}, + {0x9D, 0x00, 0x00}, + {0x9E, 0x00, 0x00}, + {0xA0, 0x00, 0x00}, + {0xA1, 0x00, 0x00}, + {0xA4, 0x00, 0x00}, + {0xA5, 0x00, 0x00}, + {0xA7, 0x00, 0x00}, + {0xA8, 0x00, 0x00}, + {0xAC, 0x00, 0x00}, + {0xAD, 0x00, 0x00}, + {0xAF, 0x00, 0x00}, + {0xB1, 0x00, 0x00}, + {0xB6, 0x00, 0x00}, + {0xB9, 0x00, 0x00}, + {0xBF, 0x00, 0x00}, + {0xCF, 0x00, 0x00}, }, /* 154 */ { - {0x00, 3, 147}, - {0x00, 3, 149}, - {0x00, 3, 150}, - {0x00, 3, 151}, - {0x00, 3, 152}, - {0x00, 3, 155}, - {0x00, 3, 157}, - {0x00, 3, 158}, - {0x00, 3, 165}, - {0x00, 3, 166}, - {0x00, 3, 168}, - {0x00, 3, 174}, - {0x00, 3, 175}, - {0x00, 3, 180}, - {0x00, 3, 182}, - {0x00, 3, 183}, + {0x00, 0x03, 0x93}, + {0x00, 0x03, 0x95}, + {0x00, 0x03, 0x96}, + {0x00, 0x03, 0x97}, + {0x00, 0x03, 0x98}, + {0x00, 0x03, 0x9B}, + {0x00, 0x03, 0x9D}, + {0x00, 0x03, 0x9E}, + {0x00, 0x03, 0xA5}, + {0x00, 0x03, 0xA6}, + {0x00, 0x03, 0xA8}, + {0x00, 0x03, 0xAE}, + {0x00, 0x03, 0xAF}, + {0x00, 0x03, 0xB4}, + {0x00, 0x03, 0xB6}, + {0x00, 0x03, 0xB7}, }, /* 155 */ { - {0x01, 2, 147}, - {0x16, 3, 147}, - {0x01, 2, 149}, - {0x16, 3, 149}, - {0x01, 2, 150}, - {0x16, 3, 150}, - {0x01, 2, 151}, - {0x16, 3, 151}, - {0x01, 2, 152}, - {0x16, 3, 152}, - {0x01, 2, 155}, - {0x16, 3, 155}, - {0x01, 2, 157}, - {0x16, 3, 157}, - {0x01, 2, 158}, - {0x16, 3, 158}, + {0x01, 0x02, 0x93}, + {0x16, 0x03, 0x93}, + {0x01, 0x02, 0x95}, + {0x16, 0x03, 0x95}, + {0x01, 0x02, 0x96}, + {0x16, 0x03, 0x96}, + {0x01, 0x02, 0x97}, + {0x16, 0x03, 0x97}, + {0x01, 0x02, 0x98}, + {0x16, 0x03, 0x98}, + {0x01, 0x02, 0x9B}, + {0x16, 0x03, 0x9B}, + {0x01, 0x02, 0x9D}, + {0x16, 0x03, 0x9D}, + {0x01, 0x02, 0x9E}, + {0x16, 0x03, 0x9E}, }, /* 156 */ { - {0x02, 2, 147}, - {0x09, 2, 147}, - {0x17, 2, 147}, - {0x28, 3, 147}, - {0x02, 2, 149}, - {0x09, 2, 149}, - {0x17, 2, 149}, - {0x28, 3, 149}, - {0x02, 2, 150}, - {0x09, 2, 150}, - {0x17, 2, 150}, - {0x28, 3, 150}, - {0x02, 2, 151}, - {0x09, 2, 151}, - {0x17, 2, 151}, - {0x28, 3, 151}, + {0x02, 0x02, 0x93}, + {0x09, 0x02, 0x93}, + {0x17, 0x02, 0x93}, + {0x28, 0x03, 0x93}, + {0x02, 0x02, 0x95}, + {0x09, 0x02, 0x95}, + {0x17, 0x02, 0x95}, + {0x28, 0x03, 0x95}, + {0x02, 0x02, 0x96}, + {0x09, 0x02, 0x96}, + {0x17, 0x02, 0x96}, + {0x28, 0x03, 0x96}, + {0x02, 0x02, 0x97}, + {0x09, 0x02, 0x97}, + {0x17, 0x02, 0x97}, + {0x28, 0x03, 0x97}, }, /* 157 */ { - {0x03, 2, 147}, - {0x06, 2, 147}, - {0x0A, 2, 147}, - {0x0F, 2, 147}, - {0x18, 2, 147}, - {0x1F, 2, 147}, - {0x29, 2, 147}, - {0x38, 3, 147}, - {0x03, 2, 149}, - {0x06, 2, 149}, - {0x0A, 2, 149}, - {0x0F, 2, 149}, - {0x18, 2, 149}, - {0x1F, 2, 149}, - {0x29, 2, 149}, - {0x38, 3, 149}, + {0x03, 0x02, 0x93}, + {0x06, 0x02, 0x93}, + {0x0A, 0x02, 0x93}, + {0x0F, 0x02, 0x93}, + {0x18, 0x02, 0x93}, + {0x1F, 0x02, 0x93}, + {0x29, 0x02, 0x93}, + {0x38, 0x03, 0x93}, + {0x03, 0x02, 0x95}, + {0x06, 0x02, 0x95}, + {0x0A, 0x02, 0x95}, + {0x0F, 0x02, 0x95}, + {0x18, 0x02, 0x95}, + {0x1F, 0x02, 0x95}, + {0x29, 0x02, 0x95}, + {0x38, 0x03, 0x95}, }, /* 158 */ { - {0x03, 2, 150}, - {0x06, 2, 150}, - {0x0A, 2, 150}, - {0x0F, 2, 150}, - {0x18, 2, 150}, - {0x1F, 2, 150}, - {0x29, 2, 150}, - {0x38, 3, 150}, - {0x03, 2, 151}, - {0x06, 2, 151}, - {0x0A, 2, 151}, - {0x0F, 2, 151}, - {0x18, 2, 151}, - {0x1F, 2, 151}, - {0x29, 2, 151}, - {0x38, 3, 151}, + {0x03, 0x02, 0x96}, + {0x06, 0x02, 0x96}, + {0x0A, 0x02, 0x96}, + {0x0F, 0x02, 0x96}, + {0x18, 0x02, 0x96}, + {0x1F, 0x02, 0x96}, + {0x29, 0x02, 0x96}, + {0x38, 0x03, 0x96}, + {0x03, 0x02, 0x97}, + {0x06, 0x02, 0x97}, + {0x0A, 0x02, 0x97}, + {0x0F, 0x02, 0x97}, + {0x18, 0x02, 0x97}, + {0x1F, 0x02, 0x97}, + {0x29, 0x02, 0x97}, + {0x38, 0x03, 0x97}, }, /* 159 */ { - {0x02, 2, 152}, - {0x09, 2, 152}, - {0x17, 2, 152}, - {0x28, 3, 152}, - {0x02, 2, 155}, - {0x09, 2, 155}, - {0x17, 2, 155}, - {0x28, 3, 155}, - {0x02, 2, 157}, - {0x09, 2, 157}, - {0x17, 2, 157}, - {0x28, 3, 157}, - {0x02, 2, 158}, - {0x09, 2, 158}, - {0x17, 2, 158}, - {0x28, 3, 158}, + {0x02, 0x02, 0x98}, + {0x09, 0x02, 0x98}, + {0x17, 0x02, 0x98}, + {0x28, 0x03, 0x98}, + {0x02, 0x02, 0x9B}, + {0x09, 0x02, 0x9B}, + {0x17, 0x02, 0x9B}, + {0x28, 0x03, 0x9B}, + {0x02, 0x02, 0x9D}, + {0x09, 0x02, 0x9D}, + {0x17, 0x02, 0x9D}, + {0x28, 0x03, 0x9D}, + {0x02, 0x02, 0x9E}, + {0x09, 0x02, 0x9E}, + {0x17, 0x02, 0x9E}, + {0x28, 0x03, 0x9E}, }, /* 160 */ { - {0x03, 2, 152}, - {0x06, 2, 152}, - {0x0A, 2, 152}, - {0x0F, 2, 152}, - {0x18, 2, 152}, - {0x1F, 2, 152}, - {0x29, 2, 152}, - {0x38, 3, 152}, - {0x03, 2, 155}, - {0x06, 2, 155}, - {0x0A, 2, 155}, - {0x0F, 2, 155}, - {0x18, 2, 155}, - {0x1F, 2, 155}, - {0x29, 2, 155}, - {0x38, 3, 155}, + {0x03, 0x02, 0x98}, + {0x06, 0x02, 0x98}, + {0x0A, 0x02, 0x98}, + {0x0F, 0x02, 0x98}, + {0x18, 0x02, 0x98}, + {0x1F, 0x02, 0x98}, + {0x29, 0x02, 0x98}, + {0x38, 0x03, 0x98}, + {0x03, 0x02, 0x9B}, + {0x06, 0x02, 0x9B}, + {0x0A, 0x02, 0x9B}, + {0x0F, 0x02, 0x9B}, + {0x18, 0x02, 0x9B}, + {0x1F, 0x02, 0x9B}, + {0x29, 0x02, 0x9B}, + {0x38, 0x03, 0x9B}, }, /* 161 */ { - {0x03, 2, 157}, - {0x06, 2, 157}, - {0x0A, 2, 157}, - {0x0F, 2, 157}, - {0x18, 2, 157}, - {0x1F, 2, 157}, - {0x29, 2, 157}, - {0x38, 3, 157}, - {0x03, 2, 158}, - {0x06, 2, 158}, - {0x0A, 2, 158}, - {0x0F, 2, 158}, - {0x18, 2, 158}, - {0x1F, 2, 158}, - {0x29, 2, 158}, - {0x38, 3, 158}, + {0x03, 0x02, 0x9D}, + {0x06, 0x02, 0x9D}, + {0x0A, 0x02, 0x9D}, + {0x0F, 0x02, 0x9D}, + {0x18, 0x02, 0x9D}, + {0x1F, 0x02, 0x9D}, + {0x29, 0x02, 0x9D}, + {0x38, 0x03, 0x9D}, + {0x03, 0x02, 0x9E}, + {0x06, 0x02, 0x9E}, + {0x0A, 0x02, 0x9E}, + {0x0F, 0x02, 0x9E}, + {0x18, 0x02, 0x9E}, + {0x1F, 0x02, 0x9E}, + {0x29, 0x02, 0x9E}, + {0x38, 0x03, 0x9E}, }, /* 162 */ { - {0x01, 2, 165}, - {0x16, 3, 165}, - {0x01, 2, 166}, - {0x16, 3, 166}, - {0x01, 2, 168}, - {0x16, 3, 168}, - {0x01, 2, 174}, - {0x16, 3, 174}, - {0x01, 2, 175}, - {0x16, 3, 175}, - {0x01, 2, 180}, - {0x16, 3, 180}, - {0x01, 2, 182}, - {0x16, 3, 182}, - {0x01, 2, 183}, - {0x16, 3, 183}, + {0x01, 0x02, 0xA5}, + {0x16, 0x03, 0xA5}, + {0x01, 0x02, 0xA6}, + {0x16, 0x03, 0xA6}, + {0x01, 0x02, 0xA8}, + {0x16, 0x03, 0xA8}, + {0x01, 0x02, 0xAE}, + {0x16, 0x03, 0xAE}, + {0x01, 0x02, 0xAF}, + {0x16, 0x03, 0xAF}, + {0x01, 0x02, 0xB4}, + {0x16, 0x03, 0xB4}, + {0x01, 0x02, 0xB6}, + {0x16, 0x03, 0xB6}, + {0x01, 0x02, 0xB7}, + {0x16, 0x03, 0xB7}, }, /* 163 */ { - {0x02, 2, 165}, - {0x09, 2, 165}, - {0x17, 2, 165}, - {0x28, 3, 165}, - {0x02, 2, 166}, - {0x09, 2, 166}, - {0x17, 2, 166}, - {0x28, 3, 166}, - {0x02, 2, 168}, - {0x09, 2, 168}, - {0x17, 2, 168}, - {0x28, 3, 168}, - {0x02, 2, 174}, - {0x09, 2, 174}, - {0x17, 2, 174}, - {0x28, 3, 174}, + {0x02, 0x02, 0xA5}, + {0x09, 0x02, 0xA5}, + {0x17, 0x02, 0xA5}, + {0x28, 0x03, 0xA5}, + {0x02, 0x02, 0xA6}, + {0x09, 0x02, 0xA6}, + {0x17, 0x02, 0xA6}, + {0x28, 0x03, 0xA6}, + {0x02, 0x02, 0xA8}, + {0x09, 0x02, 0xA8}, + {0x17, 0x02, 0xA8}, + {0x28, 0x03, 0xA8}, + {0x02, 0x02, 0xAE}, + {0x09, 0x02, 0xAE}, + {0x17, 0x02, 0xAE}, + {0x28, 0x03, 0xAE}, }, /* 164 */ { - {0x03, 2, 165}, - {0x06, 2, 165}, - {0x0A, 2, 165}, - {0x0F, 2, 165}, - {0x18, 2, 165}, - {0x1F, 2, 165}, - {0x29, 2, 165}, - {0x38, 3, 165}, - {0x03, 2, 166}, - {0x06, 2, 166}, - {0x0A, 2, 166}, - {0x0F, 2, 166}, - {0x18, 2, 166}, - {0x1F, 2, 166}, - {0x29, 2, 166}, - {0x38, 3, 166}, + {0x03, 0x02, 0xA5}, + {0x06, 0x02, 0xA5}, + {0x0A, 0x02, 0xA5}, + {0x0F, 0x02, 0xA5}, + {0x18, 0x02, 0xA5}, + {0x1F, 0x02, 0xA5}, + {0x29, 0x02, 0xA5}, + {0x38, 0x03, 0xA5}, + {0x03, 0x02, 0xA6}, + {0x06, 0x02, 0xA6}, + {0x0A, 0x02, 0xA6}, + {0x0F, 0x02, 0xA6}, + {0x18, 0x02, 0xA6}, + {0x1F, 0x02, 0xA6}, + {0x29, 0x02, 0xA6}, + {0x38, 0x03, 0xA6}, }, /* 165 */ { - {0x03, 2, 168}, - {0x06, 2, 168}, - {0x0A, 2, 168}, - {0x0F, 2, 168}, - {0x18, 2, 168}, - {0x1F, 2, 168}, - {0x29, 2, 168}, - {0x38, 3, 168}, - {0x03, 2, 174}, - {0x06, 2, 174}, - {0x0A, 2, 174}, - {0x0F, 2, 174}, - {0x18, 2, 174}, - {0x1F, 2, 174}, - {0x29, 2, 174}, - {0x38, 3, 174}, + {0x03, 0x02, 0xA8}, + {0x06, 0x02, 0xA8}, + {0x0A, 0x02, 0xA8}, + {0x0F, 0x02, 0xA8}, + {0x18, 0x02, 0xA8}, + {0x1F, 0x02, 0xA8}, + {0x29, 0x02, 0xA8}, + {0x38, 0x03, 0xA8}, + {0x03, 0x02, 0xAE}, + {0x06, 0x02, 0xAE}, + {0x0A, 0x02, 0xAE}, + {0x0F, 0x02, 0xAE}, + {0x18, 0x02, 0xAE}, + {0x1F, 0x02, 0xAE}, + {0x29, 0x02, 0xAE}, + {0x38, 0x03, 0xAE}, }, /* 166 */ { - {0x02, 2, 175}, - {0x09, 2, 175}, - {0x17, 2, 175}, - {0x28, 3, 175}, - {0x02, 2, 180}, - {0x09, 2, 180}, - {0x17, 2, 180}, - {0x28, 3, 180}, - {0x02, 2, 182}, - {0x09, 2, 182}, - {0x17, 2, 182}, - {0x28, 3, 182}, - {0x02, 2, 183}, - {0x09, 2, 183}, - {0x17, 2, 183}, - {0x28, 3, 183}, + {0x02, 0x02, 0xAF}, + {0x09, 0x02, 0xAF}, + {0x17, 0x02, 0xAF}, + {0x28, 0x03, 0xAF}, + {0x02, 0x02, 0xB4}, + {0x09, 0x02, 0xB4}, + {0x17, 0x02, 0xB4}, + {0x28, 0x03, 0xB4}, + {0x02, 0x02, 0xB6}, + {0x09, 0x02, 0xB6}, + {0x17, 0x02, 0xB6}, + {0x28, 0x03, 0xB6}, + {0x02, 0x02, 0xB7}, + {0x09, 0x02, 0xB7}, + {0x17, 0x02, 0xB7}, + {0x28, 0x03, 0xB7}, }, /* 167 */ { - {0x03, 2, 175}, - {0x06, 2, 175}, - {0x0A, 2, 175}, - {0x0F, 2, 175}, - {0x18, 2, 175}, - {0x1F, 2, 175}, - {0x29, 2, 175}, - {0x38, 3, 175}, - {0x03, 2, 180}, - {0x06, 2, 180}, - {0x0A, 2, 180}, - {0x0F, 2, 180}, - {0x18, 2, 180}, - {0x1F, 2, 180}, - {0x29, 2, 180}, - {0x38, 3, 180}, + {0x03, 0x02, 0xAF}, + {0x06, 0x02, 0xAF}, + {0x0A, 0x02, 0xAF}, + {0x0F, 0x02, 0xAF}, + {0x18, 0x02, 0xAF}, + {0x1F, 0x02, 0xAF}, + {0x29, 0x02, 0xAF}, + {0x38, 0x03, 0xAF}, + {0x03, 0x02, 0xB4}, + {0x06, 0x02, 0xB4}, + {0x0A, 0x02, 0xB4}, + {0x0F, 0x02, 0xB4}, + {0x18, 0x02, 0xB4}, + {0x1F, 0x02, 0xB4}, + {0x29, 0x02, 0xB4}, + {0x38, 0x03, 0xB4}, }, /* 168 */ { - {0x03, 2, 182}, - {0x06, 2, 182}, - {0x0A, 2, 182}, - {0x0F, 2, 182}, - {0x18, 2, 182}, - {0x1F, 2, 182}, - {0x29, 2, 182}, - {0x38, 3, 182}, - {0x03, 2, 183}, - {0x06, 2, 183}, - {0x0A, 2, 183}, - {0x0F, 2, 183}, - {0x18, 2, 183}, - {0x1F, 2, 183}, - {0x29, 2, 183}, - {0x38, 3, 183}, + {0x03, 0x02, 0xB6}, + {0x06, 0x02, 0xB6}, + {0x0A, 0x02, 0xB6}, + {0x0F, 0x02, 0xB6}, + {0x18, 0x02, 0xB6}, + {0x1F, 0x02, 0xB6}, + {0x29, 0x02, 0xB6}, + {0x38, 0x03, 0xB6}, + {0x03, 0x02, 0xB7}, + {0x06, 0x02, 0xB7}, + {0x0A, 0x02, 0xB7}, + {0x0F, 0x02, 0xB7}, + {0x18, 0x02, 0xB7}, + {0x1F, 0x02, 0xB7}, + {0x29, 0x02, 0xB7}, + {0x38, 0x03, 0xB7}, }, /* 169 */ { - {0x00, 3, 188}, - {0x00, 3, 191}, - {0x00, 3, 197}, - {0x00, 3, 231}, - {0x00, 3, 239}, - {0xB0, 0, 0}, - {0xB2, 0, 0}, - {0xB3, 0, 0}, - {0xB7, 0, 0}, - {0xB8, 0, 0}, - {0xBA, 0, 0}, - {0xBB, 0, 0}, - {0xC0, 0, 0}, - {0xC7, 0, 0}, - {0xD0, 0, 0}, - {0xDF, 0, 0}, + {0x00, 0x03, 0xBC}, + {0x00, 0x03, 0xBF}, + {0x00, 0x03, 0xC5}, + {0x00, 0x03, 0xE7}, + {0x00, 0x03, 0xEF}, + {0xB0, 0x00, 0x00}, + {0xB2, 0x00, 0x00}, + {0xB3, 0x00, 0x00}, + {0xB7, 0x00, 0x00}, + {0xB8, 0x00, 0x00}, + {0xBA, 0x00, 0x00}, + {0xBB, 0x00, 0x00}, + {0xC0, 0x00, 0x00}, + {0xC7, 0x00, 0x00}, + {0xD0, 0x00, 0x00}, + {0xDF, 0x00, 0x00}, }, /* 170 */ { - {0x01, 2, 188}, - {0x16, 3, 188}, - {0x01, 2, 191}, - {0x16, 3, 191}, - {0x01, 2, 197}, - {0x16, 3, 197}, - {0x01, 2, 231}, - {0x16, 3, 231}, - {0x01, 2, 239}, - {0x16, 3, 239}, - {0x00, 3, 9}, - {0x00, 3, 142}, - {0x00, 3, 144}, - {0x00, 3, 145}, - {0x00, 3, 148}, - {0x00, 3, 159}, + {0x01, 0x02, 0xBC}, + {0x16, 0x03, 0xBC}, + {0x01, 0x02, 0xBF}, + {0x16, 0x03, 0xBF}, + {0x01, 0x02, 0xC5}, + {0x16, 0x03, 0xC5}, + {0x01, 0x02, 0xE7}, + {0x16, 0x03, 0xE7}, + {0x01, 0x02, 0xEF}, + {0x16, 0x03, 0xEF}, + {0x00, 0x03, 0x09}, + {0x00, 0x03, 0x8E}, + {0x00, 0x03, 0x90}, + {0x00, 0x03, 0x91}, + {0x00, 0x03, 0x94}, + {0x00, 0x03, 0x9F}, }, /* 171 */ { - {0x02, 2, 188}, - {0x09, 2, 188}, - {0x17, 2, 188}, - {0x28, 3, 188}, - {0x02, 2, 191}, - {0x09, 2, 191}, - {0x17, 2, 191}, - {0x28, 3, 191}, - {0x02, 2, 197}, - {0x09, 2, 197}, - {0x17, 2, 197}, - {0x28, 3, 197}, - {0x02, 2, 231}, - {0x09, 2, 231}, - {0x17, 2, 231}, - {0x28, 3, 231}, + {0x02, 0x02, 0xBC}, + {0x09, 0x02, 0xBC}, + {0x17, 0x02, 0xBC}, + {0x28, 0x03, 0xBC}, + {0x02, 0x02, 0xBF}, + {0x09, 0x02, 0xBF}, + {0x17, 0x02, 0xBF}, + {0x28, 0x03, 0xBF}, + {0x02, 0x02, 0xC5}, + {0x09, 0x02, 0xC5}, + {0x17, 0x02, 0xC5}, + {0x28, 0x03, 0xC5}, + {0x02, 0x02, 0xE7}, + {0x09, 0x02, 0xE7}, + {0x17, 0x02, 0xE7}, + {0x28, 0x03, 0xE7}, }, /* 172 */ { - {0x03, 2, 188}, - {0x06, 2, 188}, - {0x0A, 2, 188}, - {0x0F, 2, 188}, - {0x18, 2, 188}, - {0x1F, 2, 188}, - {0x29, 2, 188}, - {0x38, 3, 188}, - {0x03, 2, 191}, - {0x06, 2, 191}, - {0x0A, 2, 191}, - {0x0F, 2, 191}, - {0x18, 2, 191}, - {0x1F, 2, 191}, - {0x29, 2, 191}, - {0x38, 3, 191}, + {0x03, 0x02, 0xBC}, + {0x06, 0x02, 0xBC}, + {0x0A, 0x02, 0xBC}, + {0x0F, 0x02, 0xBC}, + {0x18, 0x02, 0xBC}, + {0x1F, 0x02, 0xBC}, + {0x29, 0x02, 0xBC}, + {0x38, 0x03, 0xBC}, + {0x03, 0x02, 0xBF}, + {0x06, 0x02, 0xBF}, + {0x0A, 0x02, 0xBF}, + {0x0F, 0x02, 0xBF}, + {0x18, 0x02, 0xBF}, + {0x1F, 0x02, 0xBF}, + {0x29, 0x02, 0xBF}, + {0x38, 0x03, 0xBF}, }, /* 173 */ { - {0x03, 2, 197}, - {0x06, 2, 197}, - {0x0A, 2, 197}, - {0x0F, 2, 197}, - {0x18, 2, 197}, - {0x1F, 2, 197}, - {0x29, 2, 197}, - {0x38, 3, 197}, - {0x03, 2, 231}, - {0x06, 2, 231}, - {0x0A, 2, 231}, - {0x0F, 2, 231}, - {0x18, 2, 231}, - {0x1F, 2, 231}, - {0x29, 2, 231}, - {0x38, 3, 231}, + {0x03, 0x02, 0xC5}, + {0x06, 0x02, 0xC5}, + {0x0A, 0x02, 0xC5}, + {0x0F, 0x02, 0xC5}, + {0x18, 0x02, 0xC5}, + {0x1F, 0x02, 0xC5}, + {0x29, 0x02, 0xC5}, + {0x38, 0x03, 0xC5}, + {0x03, 0x02, 0xE7}, + {0x06, 0x02, 0xE7}, + {0x0A, 0x02, 0xE7}, + {0x0F, 0x02, 0xE7}, + {0x18, 0x02, 0xE7}, + {0x1F, 0x02, 0xE7}, + {0x29, 0x02, 0xE7}, + {0x38, 0x03, 0xE7}, }, /* 174 */ { - {0x02, 2, 239}, - {0x09, 2, 239}, - {0x17, 2, 239}, - {0x28, 3, 239}, - {0x01, 2, 9}, - {0x16, 3, 9}, - {0x01, 2, 142}, - {0x16, 3, 142}, - {0x01, 2, 144}, - {0x16, 3, 144}, - {0x01, 2, 145}, - {0x16, 3, 145}, - {0x01, 2, 148}, - {0x16, 3, 148}, - {0x01, 2, 159}, - {0x16, 3, 159}, + {0x02, 0x02, 0xEF}, + {0x09, 0x02, 0xEF}, + {0x17, 0x02, 0xEF}, + {0x28, 0x03, 0xEF}, + {0x01, 0x02, 0x09}, + {0x16, 0x03, 0x09}, + {0x01, 0x02, 0x8E}, + {0x16, 0x03, 0x8E}, + {0x01, 0x02, 0x90}, + {0x16, 0x03, 0x90}, + {0x01, 0x02, 0x91}, + {0x16, 0x03, 0x91}, + {0x01, 0x02, 0x94}, + {0x16, 0x03, 0x94}, + {0x01, 0x02, 0x9F}, + {0x16, 0x03, 0x9F}, }, /* 175 */ { - {0x03, 2, 239}, - {0x06, 2, 239}, - {0x0A, 2, 239}, - {0x0F, 2, 239}, - {0x18, 2, 239}, - {0x1F, 2, 239}, - {0x29, 2, 239}, - {0x38, 3, 239}, - {0x02, 2, 9}, - {0x09, 2, 9}, - {0x17, 2, 9}, - {0x28, 3, 9}, - {0x02, 2, 142}, - {0x09, 2, 142}, - {0x17, 2, 142}, - {0x28, 3, 142}, + {0x03, 0x02, 0xEF}, + {0x06, 0x02, 0xEF}, + {0x0A, 0x02, 0xEF}, + {0x0F, 0x02, 0xEF}, + {0x18, 0x02, 0xEF}, + {0x1F, 0x02, 0xEF}, + {0x29, 0x02, 0xEF}, + {0x38, 0x03, 0xEF}, + {0x02, 0x02, 0x09}, + {0x09, 0x02, 0x09}, + {0x17, 0x02, 0x09}, + {0x28, 0x03, 0x09}, + {0x02, 0x02, 0x8E}, + {0x09, 0x02, 0x8E}, + {0x17, 0x02, 0x8E}, + {0x28, 0x03, 0x8E}, }, /* 176 */ { - {0x03, 2, 9}, - {0x06, 2, 9}, - {0x0A, 2, 9}, - {0x0F, 2, 9}, - {0x18, 2, 9}, - {0x1F, 2, 9}, - {0x29, 2, 9}, - {0x38, 3, 9}, - {0x03, 2, 142}, - {0x06, 2, 142}, - {0x0A, 2, 142}, - {0x0F, 2, 142}, - {0x18, 2, 142}, - {0x1F, 2, 142}, - {0x29, 2, 142}, - {0x38, 3, 142}, + {0x03, 0x02, 0x09}, + {0x06, 0x02, 0x09}, + {0x0A, 0x02, 0x09}, + {0x0F, 0x02, 0x09}, + {0x18, 0x02, 0x09}, + {0x1F, 0x02, 0x09}, + {0x29, 0x02, 0x09}, + {0x38, 0x03, 0x09}, + {0x03, 0x02, 0x8E}, + {0x06, 0x02, 0x8E}, + {0x0A, 0x02, 0x8E}, + {0x0F, 0x02, 0x8E}, + {0x18, 0x02, 0x8E}, + {0x1F, 0x02, 0x8E}, + {0x29, 0x02, 0x8E}, + {0x38, 0x03, 0x8E}, }, /* 177 */ { - {0x02, 2, 144}, - {0x09, 2, 144}, - {0x17, 2, 144}, - {0x28, 3, 144}, - {0x02, 2, 145}, - {0x09, 2, 145}, - {0x17, 2, 145}, - {0x28, 3, 145}, - {0x02, 2, 148}, - {0x09, 2, 148}, - {0x17, 2, 148}, - {0x28, 3, 148}, - {0x02, 2, 159}, - {0x09, 2, 159}, - {0x17, 2, 159}, - {0x28, 3, 159}, + {0x02, 0x02, 0x90}, + {0x09, 0x02, 0x90}, + {0x17, 0x02, 0x90}, + {0x28, 0x03, 0x90}, + {0x02, 0x02, 0x91}, + {0x09, 0x02, 0x91}, + {0x17, 0x02, 0x91}, + {0x28, 0x03, 0x91}, + {0x02, 0x02, 0x94}, + {0x09, 0x02, 0x94}, + {0x17, 0x02, 0x94}, + {0x28, 0x03, 0x94}, + {0x02, 0x02, 0x9F}, + {0x09, 0x02, 0x9F}, + {0x17, 0x02, 0x9F}, + {0x28, 0x03, 0x9F}, }, /* 178 */ { - {0x03, 2, 144}, - {0x06, 2, 144}, - {0x0A, 2, 144}, - {0x0F, 2, 144}, - {0x18, 2, 144}, - {0x1F, 2, 144}, - {0x29, 2, 144}, - {0x38, 3, 144}, - {0x03, 2, 145}, - {0x06, 2, 145}, - {0x0A, 2, 145}, - {0x0F, 2, 145}, - {0x18, 2, 145}, - {0x1F, 2, 145}, - {0x29, 2, 145}, - {0x38, 3, 145}, + {0x03, 0x02, 0x90}, + {0x06, 0x02, 0x90}, + {0x0A, 0x02, 0x90}, + {0x0F, 0x02, 0x90}, + {0x18, 0x02, 0x90}, + {0x1F, 0x02, 0x90}, + {0x29, 0x02, 0x90}, + {0x38, 0x03, 0x90}, + {0x03, 0x02, 0x91}, + {0x06, 0x02, 0x91}, + {0x0A, 0x02, 0x91}, + {0x0F, 0x02, 0x91}, + {0x18, 0x02, 0x91}, + {0x1F, 0x02, 0x91}, + {0x29, 0x02, 0x91}, + {0x38, 0x03, 0x91}, }, /* 179 */ { - {0x03, 2, 148}, - {0x06, 2, 148}, - {0x0A, 2, 148}, - {0x0F, 2, 148}, - {0x18, 2, 148}, - {0x1F, 2, 148}, - {0x29, 2, 148}, - {0x38, 3, 148}, - {0x03, 2, 159}, - {0x06, 2, 159}, - {0x0A, 2, 159}, - {0x0F, 2, 159}, - {0x18, 2, 159}, - {0x1F, 2, 159}, - {0x29, 2, 159}, - {0x38, 3, 159}, + {0x03, 0x02, 0x94}, + {0x06, 0x02, 0x94}, + {0x0A, 0x02, 0x94}, + {0x0F, 0x02, 0x94}, + {0x18, 0x02, 0x94}, + {0x1F, 0x02, 0x94}, + {0x29, 0x02, 0x94}, + {0x38, 0x03, 0x94}, + {0x03, 0x02, 0x9F}, + {0x06, 0x02, 0x9F}, + {0x0A, 0x02, 0x9F}, + {0x0F, 0x02, 0x9F}, + {0x18, 0x02, 0x9F}, + {0x1F, 0x02, 0x9F}, + {0x29, 0x02, 0x9F}, + {0x38, 0x03, 0x9F}, }, /* 180 */ { - {0x00, 3, 171}, - {0x00, 3, 206}, - {0x00, 3, 215}, - {0x00, 3, 225}, - {0x00, 3, 236}, - {0x00, 3, 237}, - {0xBC, 0, 0}, - {0xBD, 0, 0}, - {0xC1, 0, 0}, - {0xC4, 0, 0}, - {0xC8, 0, 0}, - {0xCB, 0, 0}, - {0xD1, 0, 0}, - {0xD8, 0, 0}, - {0xE0, 0, 0}, - {0xEE, 0, 0}, + {0x00, 0x03, 0xAB}, + {0x00, 0x03, 0xCE}, + {0x00, 0x03, 0xD7}, + {0x00, 0x03, 0xE1}, + {0x00, 0x03, 0xEC}, + {0x00, 0x03, 0xED}, + {0xBC, 0x00, 0x00}, + {0xBD, 0x00, 0x00}, + {0xC1, 0x00, 0x00}, + {0xC4, 0x00, 0x00}, + {0xC8, 0x00, 0x00}, + {0xCB, 0x00, 0x00}, + {0xD1, 0x00, 0x00}, + {0xD8, 0x00, 0x00}, + {0xE0, 0x00, 0x00}, + {0xEE, 0x00, 0x00}, }, /* 181 */ { - {0x01, 2, 171}, - {0x16, 3, 171}, - {0x01, 2, 206}, - {0x16, 3, 206}, - {0x01, 2, 215}, - {0x16, 3, 215}, - {0x01, 2, 225}, - {0x16, 3, 225}, - {0x01, 2, 236}, - {0x16, 3, 236}, - {0x01, 2, 237}, - {0x16, 3, 237}, - {0x00, 3, 199}, - {0x00, 3, 207}, - {0x00, 3, 234}, - {0x00, 3, 235}, + {0x01, 0x02, 0xAB}, + {0x16, 0x03, 0xAB}, + {0x01, 0x02, 0xCE}, + {0x16, 0x03, 0xCE}, + {0x01, 0x02, 0xD7}, + {0x16, 0x03, 0xD7}, + {0x01, 0x02, 0xE1}, + {0x16, 0x03, 0xE1}, + {0x01, 0x02, 0xEC}, + {0x16, 0x03, 0xEC}, + {0x01, 0x02, 0xED}, + {0x16, 0x03, 0xED}, + {0x00, 0x03, 0xC7}, + {0x00, 0x03, 0xCF}, + {0x00, 0x03, 0xEA}, + {0x00, 0x03, 0xEB}, }, /* 182 */ { - {0x02, 2, 171}, - {0x09, 2, 171}, - {0x17, 2, 171}, - {0x28, 3, 171}, - {0x02, 2, 206}, - {0x09, 2, 206}, - {0x17, 2, 206}, - {0x28, 3, 206}, - {0x02, 2, 215}, - {0x09, 2, 215}, - {0x17, 2, 215}, - {0x28, 3, 215}, - {0x02, 2, 225}, - {0x09, 2, 225}, - {0x17, 2, 225}, - {0x28, 3, 225}, + {0x02, 0x02, 0xAB}, + {0x09, 0x02, 0xAB}, + {0x17, 0x02, 0xAB}, + {0x28, 0x03, 0xAB}, + {0x02, 0x02, 0xCE}, + {0x09, 0x02, 0xCE}, + {0x17, 0x02, 0xCE}, + {0x28, 0x03, 0xCE}, + {0x02, 0x02, 0xD7}, + {0x09, 0x02, 0xD7}, + {0x17, 0x02, 0xD7}, + {0x28, 0x03, 0xD7}, + {0x02, 0x02, 0xE1}, + {0x09, 0x02, 0xE1}, + {0x17, 0x02, 0xE1}, + {0x28, 0x03, 0xE1}, }, /* 183 */ { - {0x03, 2, 171}, - {0x06, 2, 171}, - {0x0A, 2, 171}, - {0x0F, 2, 171}, - {0x18, 2, 171}, - {0x1F, 2, 171}, - {0x29, 2, 171}, - {0x38, 3, 171}, - {0x03, 2, 206}, - {0x06, 2, 206}, - {0x0A, 2, 206}, - {0x0F, 2, 206}, - {0x18, 2, 206}, - {0x1F, 2, 206}, - {0x29, 2, 206}, - {0x38, 3, 206}, + {0x03, 0x02, 0xAB}, + {0x06, 0x02, 0xAB}, + {0x0A, 0x02, 0xAB}, + {0x0F, 0x02, 0xAB}, + {0x18, 0x02, 0xAB}, + {0x1F, 0x02, 0xAB}, + {0x29, 0x02, 0xAB}, + {0x38, 0x03, 0xAB}, + {0x03, 0x02, 0xCE}, + {0x06, 0x02, 0xCE}, + {0x0A, 0x02, 0xCE}, + {0x0F, 0x02, 0xCE}, + {0x18, 0x02, 0xCE}, + {0x1F, 0x02, 0xCE}, + {0x29, 0x02, 0xCE}, + {0x38, 0x03, 0xCE}, }, /* 184 */ { - {0x03, 2, 215}, - {0x06, 2, 215}, - {0x0A, 2, 215}, - {0x0F, 2, 215}, - {0x18, 2, 215}, - {0x1F, 2, 215}, - {0x29, 2, 215}, - {0x38, 3, 215}, - {0x03, 2, 225}, - {0x06, 2, 225}, - {0x0A, 2, 225}, - {0x0F, 2, 225}, - {0x18, 2, 225}, - {0x1F, 2, 225}, - {0x29, 2, 225}, - {0x38, 3, 225}, + {0x03, 0x02, 0xD7}, + {0x06, 0x02, 0xD7}, + {0x0A, 0x02, 0xD7}, + {0x0F, 0x02, 0xD7}, + {0x18, 0x02, 0xD7}, + {0x1F, 0x02, 0xD7}, + {0x29, 0x02, 0xD7}, + {0x38, 0x03, 0xD7}, + {0x03, 0x02, 0xE1}, + {0x06, 0x02, 0xE1}, + {0x0A, 0x02, 0xE1}, + {0x0F, 0x02, 0xE1}, + {0x18, 0x02, 0xE1}, + {0x1F, 0x02, 0xE1}, + {0x29, 0x02, 0xE1}, + {0x38, 0x03, 0xE1}, }, /* 185 */ { - {0x02, 2, 236}, - {0x09, 2, 236}, - {0x17, 2, 236}, - {0x28, 3, 236}, - {0x02, 2, 237}, - {0x09, 2, 237}, - {0x17, 2, 237}, - {0x28, 3, 237}, - {0x01, 2, 199}, - {0x16, 3, 199}, - {0x01, 2, 207}, - {0x16, 3, 207}, - {0x01, 2, 234}, - {0x16, 3, 234}, - {0x01, 2, 235}, - {0x16, 3, 235}, + {0x02, 0x02, 0xEC}, + {0x09, 0x02, 0xEC}, + {0x17, 0x02, 0xEC}, + {0x28, 0x03, 0xEC}, + {0x02, 0x02, 0xED}, + {0x09, 0x02, 0xED}, + {0x17, 0x02, 0xED}, + {0x28, 0x03, 0xED}, + {0x01, 0x02, 0xC7}, + {0x16, 0x03, 0xC7}, + {0x01, 0x02, 0xCF}, + {0x16, 0x03, 0xCF}, + {0x01, 0x02, 0xEA}, + {0x16, 0x03, 0xEA}, + {0x01, 0x02, 0xEB}, + {0x16, 0x03, 0xEB}, }, /* 186 */ { - {0x03, 2, 236}, - {0x06, 2, 236}, - {0x0A, 2, 236}, - {0x0F, 2, 236}, - {0x18, 2, 236}, - {0x1F, 2, 236}, - {0x29, 2, 236}, - {0x38, 3, 236}, - {0x03, 2, 237}, - {0x06, 2, 237}, - {0x0A, 2, 237}, - {0x0F, 2, 237}, - {0x18, 2, 237}, - {0x1F, 2, 237}, - {0x29, 2, 237}, - {0x38, 3, 237}, + {0x03, 0x02, 0xEC}, + {0x06, 0x02, 0xEC}, + {0x0A, 0x02, 0xEC}, + {0x0F, 0x02, 0xEC}, + {0x18, 0x02, 0xEC}, + {0x1F, 0x02, 0xEC}, + {0x29, 0x02, 0xEC}, + {0x38, 0x03, 0xEC}, + {0x03, 0x02, 0xED}, + {0x06, 0x02, 0xED}, + {0x0A, 0x02, 0xED}, + {0x0F, 0x02, 0xED}, + {0x18, 0x02, 0xED}, + {0x1F, 0x02, 0xED}, + {0x29, 0x02, 0xED}, + {0x38, 0x03, 0xED}, }, /* 187 */ { - {0x02, 2, 199}, - {0x09, 2, 199}, - {0x17, 2, 199}, - {0x28, 3, 199}, - {0x02, 2, 207}, - {0x09, 2, 207}, - {0x17, 2, 207}, - {0x28, 3, 207}, - {0x02, 2, 234}, - {0x09, 2, 234}, - {0x17, 2, 234}, - {0x28, 3, 234}, - {0x02, 2, 235}, - {0x09, 2, 235}, - {0x17, 2, 235}, - {0x28, 3, 235}, + {0x02, 0x02, 0xC7}, + {0x09, 0x02, 0xC7}, + {0x17, 0x02, 0xC7}, + {0x28, 0x03, 0xC7}, + {0x02, 0x02, 0xCF}, + {0x09, 0x02, 0xCF}, + {0x17, 0x02, 0xCF}, + {0x28, 0x03, 0xCF}, + {0x02, 0x02, 0xEA}, + {0x09, 0x02, 0xEA}, + {0x17, 0x02, 0xEA}, + {0x28, 0x03, 0xEA}, + {0x02, 0x02, 0xEB}, + {0x09, 0x02, 0xEB}, + {0x17, 0x02, 0xEB}, + {0x28, 0x03, 0xEB}, }, /* 188 */ { - {0x03, 2, 199}, - {0x06, 2, 199}, - {0x0A, 2, 199}, - {0x0F, 2, 199}, - {0x18, 2, 199}, - {0x1F, 2, 199}, - {0x29, 2, 199}, - {0x38, 3, 199}, - {0x03, 2, 207}, - {0x06, 2, 207}, - {0x0A, 2, 207}, - {0x0F, 2, 207}, - {0x18, 2, 207}, - {0x1F, 2, 207}, - {0x29, 2, 207}, - {0x38, 3, 207}, + {0x03, 0x02, 0xC7}, + {0x06, 0x02, 0xC7}, + {0x0A, 0x02, 0xC7}, + {0x0F, 0x02, 0xC7}, + {0x18, 0x02, 0xC7}, + {0x1F, 0x02, 0xC7}, + {0x29, 0x02, 0xC7}, + {0x38, 0x03, 0xC7}, + {0x03, 0x02, 0xCF}, + {0x06, 0x02, 0xCF}, + {0x0A, 0x02, 0xCF}, + {0x0F, 0x02, 0xCF}, + {0x18, 0x02, 0xCF}, + {0x1F, 0x02, 0xCF}, + {0x29, 0x02, 0xCF}, + {0x38, 0x03, 0xCF}, }, /* 189 */ { - {0x03, 2, 234}, - {0x06, 2, 234}, - {0x0A, 2, 234}, - {0x0F, 2, 234}, - {0x18, 2, 234}, - {0x1F, 2, 234}, - {0x29, 2, 234}, - {0x38, 3, 234}, - {0x03, 2, 235}, - {0x06, 2, 235}, - {0x0A, 2, 235}, - {0x0F, 2, 235}, - {0x18, 2, 235}, - {0x1F, 2, 235}, - {0x29, 2, 235}, - {0x38, 3, 235}, + {0x03, 0x02, 0xEA}, + {0x06, 0x02, 0xEA}, + {0x0A, 0x02, 0xEA}, + {0x0F, 0x02, 0xEA}, + {0x18, 0x02, 0xEA}, + {0x1F, 0x02, 0xEA}, + {0x29, 0x02, 0xEA}, + {0x38, 0x03, 0xEA}, + {0x03, 0x02, 0xEB}, + {0x06, 0x02, 0xEB}, + {0x0A, 0x02, 0xEB}, + {0x0F, 0x02, 0xEB}, + {0x18, 0x02, 0xEB}, + {0x1F, 0x02, 0xEB}, + {0x29, 0x02, 0xEB}, + {0x38, 0x03, 0xEB}, }, /* 190 */ { - {0xC2, 0, 0}, - {0xC3, 0, 0}, - {0xC5, 0, 0}, - {0xC6, 0, 0}, - {0xC9, 0, 0}, - {0xCA, 0, 0}, - {0xCC, 0, 0}, - {0xCD, 0, 0}, - {0xD2, 0, 0}, - {0xD5, 0, 0}, - {0xD9, 0, 0}, - {0xDC, 0, 0}, - {0xE1, 0, 0}, - {0xE7, 0, 0}, - {0xEF, 0, 0}, - {0xF6, 0, 0}, + {0xC2, 0x00, 0x00}, + {0xC3, 0x00, 0x00}, + {0xC5, 0x00, 0x00}, + {0xC6, 0x00, 0x00}, + {0xC9, 0x00, 0x00}, + {0xCA, 0x00, 0x00}, + {0xCC, 0x00, 0x00}, + {0xCD, 0x00, 0x00}, + {0xD2, 0x00, 0x00}, + {0xD5, 0x00, 0x00}, + {0xD9, 0x00, 0x00}, + {0xDC, 0x00, 0x00}, + {0xE1, 0x00, 0x00}, + {0xE7, 0x00, 0x00}, + {0xEF, 0x00, 0x00}, + {0xF6, 0x00, 0x00}, }, /* 191 */ { - {0x00, 3, 192}, - {0x00, 3, 193}, - {0x00, 3, 200}, - {0x00, 3, 201}, - {0x00, 3, 202}, - {0x00, 3, 205}, - {0x00, 3, 210}, - {0x00, 3, 213}, - {0x00, 3, 218}, - {0x00, 3, 219}, - {0x00, 3, 238}, - {0x00, 3, 240}, - {0x00, 3, 242}, - {0x00, 3, 243}, - {0x00, 3, 255}, - {0xCE, 0, 0}, + {0x00, 0x03, 0xC0}, + {0x00, 0x03, 0xC1}, + {0x00, 0x03, 0xC8}, + {0x00, 0x03, 0xC9}, + {0x00, 0x03, 0xCA}, + {0x00, 0x03, 0xCD}, + {0x00, 0x03, 0xD2}, + {0x00, 0x03, 0xD5}, + {0x00, 0x03, 0xDA}, + {0x00, 0x03, 0xDB}, + {0x00, 0x03, 0xEE}, + {0x00, 0x03, 0xF0}, + {0x00, 0x03, 0xF2}, + {0x00, 0x03, 0xF3}, + {0x00, 0x03, 0xFF}, + {0xCE, 0x00, 0x00}, }, /* 192 */ { - {0x01, 2, 192}, - {0x16, 3, 192}, - {0x01, 2, 193}, - {0x16, 3, 193}, - {0x01, 2, 200}, - {0x16, 3, 200}, - {0x01, 2, 201}, - {0x16, 3, 201}, - {0x01, 2, 202}, - {0x16, 3, 202}, - {0x01, 2, 205}, - {0x16, 3, 205}, - {0x01, 2, 210}, - {0x16, 3, 210}, - {0x01, 2, 213}, - {0x16, 3, 213}, + {0x01, 0x02, 0xC0}, + {0x16, 0x03, 0xC0}, + {0x01, 0x02, 0xC1}, + {0x16, 0x03, 0xC1}, + {0x01, 0x02, 0xC8}, + {0x16, 0x03, 0xC8}, + {0x01, 0x02, 0xC9}, + {0x16, 0x03, 0xC9}, + {0x01, 0x02, 0xCA}, + {0x16, 0x03, 0xCA}, + {0x01, 0x02, 0xCD}, + {0x16, 0x03, 0xCD}, + {0x01, 0x02, 0xD2}, + {0x16, 0x03, 0xD2}, + {0x01, 0x02, 0xD5}, + {0x16, 0x03, 0xD5}, }, /* 193 */ { - {0x02, 2, 192}, - {0x09, 2, 192}, - {0x17, 2, 192}, - {0x28, 3, 192}, - {0x02, 2, 193}, - {0x09, 2, 193}, - {0x17, 2, 193}, - {0x28, 3, 193}, - {0x02, 2, 200}, - {0x09, 2, 200}, - {0x17, 2, 200}, - {0x28, 3, 200}, - {0x02, 2, 201}, - {0x09, 2, 201}, - {0x17, 2, 201}, - {0x28, 3, 201}, + {0x02, 0x02, 0xC0}, + {0x09, 0x02, 0xC0}, + {0x17, 0x02, 0xC0}, + {0x28, 0x03, 0xC0}, + {0x02, 0x02, 0xC1}, + {0x09, 0x02, 0xC1}, + {0x17, 0x02, 0xC1}, + {0x28, 0x03, 0xC1}, + {0x02, 0x02, 0xC8}, + {0x09, 0x02, 0xC8}, + {0x17, 0x02, 0xC8}, + {0x28, 0x03, 0xC8}, + {0x02, 0x02, 0xC9}, + {0x09, 0x02, 0xC9}, + {0x17, 0x02, 0xC9}, + {0x28, 0x03, 0xC9}, }, /* 194 */ { - {0x03, 2, 192}, - {0x06, 2, 192}, - {0x0A, 2, 192}, - {0x0F, 2, 192}, - {0x18, 2, 192}, - {0x1F, 2, 192}, - {0x29, 2, 192}, - {0x38, 3, 192}, - {0x03, 2, 193}, - {0x06, 2, 193}, - {0x0A, 2, 193}, - {0x0F, 2, 193}, - {0x18, 2, 193}, - {0x1F, 2, 193}, - {0x29, 2, 193}, - {0x38, 3, 193}, + {0x03, 0x02, 0xC0}, + {0x06, 0x02, 0xC0}, + {0x0A, 0x02, 0xC0}, + {0x0F, 0x02, 0xC0}, + {0x18, 0x02, 0xC0}, + {0x1F, 0x02, 0xC0}, + {0x29, 0x02, 0xC0}, + {0x38, 0x03, 0xC0}, + {0x03, 0x02, 0xC1}, + {0x06, 0x02, 0xC1}, + {0x0A, 0x02, 0xC1}, + {0x0F, 0x02, 0xC1}, + {0x18, 0x02, 0xC1}, + {0x1F, 0x02, 0xC1}, + {0x29, 0x02, 0xC1}, + {0x38, 0x03, 0xC1}, }, /* 195 */ { - {0x03, 2, 200}, - {0x06, 2, 200}, - {0x0A, 2, 200}, - {0x0F, 2, 200}, - {0x18, 2, 200}, - {0x1F, 2, 200}, - {0x29, 2, 200}, - {0x38, 3, 200}, - {0x03, 2, 201}, - {0x06, 2, 201}, - {0x0A, 2, 201}, - {0x0F, 2, 201}, - {0x18, 2, 201}, - {0x1F, 2, 201}, - {0x29, 2, 201}, - {0x38, 3, 201}, + {0x03, 0x02, 0xC8}, + {0x06, 0x02, 0xC8}, + {0x0A, 0x02, 0xC8}, + {0x0F, 0x02, 0xC8}, + {0x18, 0x02, 0xC8}, + {0x1F, 0x02, 0xC8}, + {0x29, 0x02, 0xC8}, + {0x38, 0x03, 0xC8}, + {0x03, 0x02, 0xC9}, + {0x06, 0x02, 0xC9}, + {0x0A, 0x02, 0xC9}, + {0x0F, 0x02, 0xC9}, + {0x18, 0x02, 0xC9}, + {0x1F, 0x02, 0xC9}, + {0x29, 0x02, 0xC9}, + {0x38, 0x03, 0xC9}, }, /* 196 */ { - {0x02, 2, 202}, - {0x09, 2, 202}, - {0x17, 2, 202}, - {0x28, 3, 202}, - {0x02, 2, 205}, - {0x09, 2, 205}, - {0x17, 2, 205}, - {0x28, 3, 205}, - {0x02, 2, 210}, - {0x09, 2, 210}, - {0x17, 2, 210}, - {0x28, 3, 210}, - {0x02, 2, 213}, - {0x09, 2, 213}, - {0x17, 2, 213}, - {0x28, 3, 213}, + {0x02, 0x02, 0xCA}, + {0x09, 0x02, 0xCA}, + {0x17, 0x02, 0xCA}, + {0x28, 0x03, 0xCA}, + {0x02, 0x02, 0xCD}, + {0x09, 0x02, 0xCD}, + {0x17, 0x02, 0xCD}, + {0x28, 0x03, 0xCD}, + {0x02, 0x02, 0xD2}, + {0x09, 0x02, 0xD2}, + {0x17, 0x02, 0xD2}, + {0x28, 0x03, 0xD2}, + {0x02, 0x02, 0xD5}, + {0x09, 0x02, 0xD5}, + {0x17, 0x02, 0xD5}, + {0x28, 0x03, 0xD5}, }, /* 197 */ { - {0x03, 2, 202}, - {0x06, 2, 202}, - {0x0A, 2, 202}, - {0x0F, 2, 202}, - {0x18, 2, 202}, - {0x1F, 2, 202}, - {0x29, 2, 202}, - {0x38, 3, 202}, - {0x03, 2, 205}, - {0x06, 2, 205}, - {0x0A, 2, 205}, - {0x0F, 2, 205}, - {0x18, 2, 205}, - {0x1F, 2, 205}, - {0x29, 2, 205}, - {0x38, 3, 205}, + {0x03, 0x02, 0xCA}, + {0x06, 0x02, 0xCA}, + {0x0A, 0x02, 0xCA}, + {0x0F, 0x02, 0xCA}, + {0x18, 0x02, 0xCA}, + {0x1F, 0x02, 0xCA}, + {0x29, 0x02, 0xCA}, + {0x38, 0x03, 0xCA}, + {0x03, 0x02, 0xCD}, + {0x06, 0x02, 0xCD}, + {0x0A, 0x02, 0xCD}, + {0x0F, 0x02, 0xCD}, + {0x18, 0x02, 0xCD}, + {0x1F, 0x02, 0xCD}, + {0x29, 0x02, 0xCD}, + {0x38, 0x03, 0xCD}, }, /* 198 */ { - {0x03, 2, 210}, - {0x06, 2, 210}, - {0x0A, 2, 210}, - {0x0F, 2, 210}, - {0x18, 2, 210}, - {0x1F, 2, 210}, - {0x29, 2, 210}, - {0x38, 3, 210}, - {0x03, 2, 213}, - {0x06, 2, 213}, - {0x0A, 2, 213}, - {0x0F, 2, 213}, - {0x18, 2, 213}, - {0x1F, 2, 213}, - {0x29, 2, 213}, - {0x38, 3, 213}, + {0x03, 0x02, 0xD2}, + {0x06, 0x02, 0xD2}, + {0x0A, 0x02, 0xD2}, + {0x0F, 0x02, 0xD2}, + {0x18, 0x02, 0xD2}, + {0x1F, 0x02, 0xD2}, + {0x29, 0x02, 0xD2}, + {0x38, 0x03, 0xD2}, + {0x03, 0x02, 0xD5}, + {0x06, 0x02, 0xD5}, + {0x0A, 0x02, 0xD5}, + {0x0F, 0x02, 0xD5}, + {0x18, 0x02, 0xD5}, + {0x1F, 0x02, 0xD5}, + {0x29, 0x02, 0xD5}, + {0x38, 0x03, 0xD5}, }, /* 199 */ { - {0x01, 2, 218}, - {0x16, 3, 218}, - {0x01, 2, 219}, - {0x16, 3, 219}, - {0x01, 2, 238}, - {0x16, 3, 238}, - {0x01, 2, 240}, - {0x16, 3, 240}, - {0x01, 2, 242}, - {0x16, 3, 242}, - {0x01, 2, 243}, - {0x16, 3, 243}, - {0x01, 2, 255}, - {0x16, 3, 255}, - {0x00, 3, 203}, - {0x00, 3, 204}, + {0x01, 0x02, 0xDA}, + {0x16, 0x03, 0xDA}, + {0x01, 0x02, 0xDB}, + {0x16, 0x03, 0xDB}, + {0x01, 0x02, 0xEE}, + {0x16, 0x03, 0xEE}, + {0x01, 0x02, 0xF0}, + {0x16, 0x03, 0xF0}, + {0x01, 0x02, 0xF2}, + {0x16, 0x03, 0xF2}, + {0x01, 0x02, 0xF3}, + {0x16, 0x03, 0xF3}, + {0x01, 0x02, 0xFF}, + {0x16, 0x03, 0xFF}, + {0x00, 0x03, 0xCB}, + {0x00, 0x03, 0xCC}, }, /* 200 */ { - {0x02, 2, 218}, - {0x09, 2, 218}, - {0x17, 2, 218}, - {0x28, 3, 218}, - {0x02, 2, 219}, - {0x09, 2, 219}, - {0x17, 2, 219}, - {0x28, 3, 219}, - {0x02, 2, 238}, - {0x09, 2, 238}, - {0x17, 2, 238}, - {0x28, 3, 238}, - {0x02, 2, 240}, - {0x09, 2, 240}, - {0x17, 2, 240}, - {0x28, 3, 240}, + {0x02, 0x02, 0xDA}, + {0x09, 0x02, 0xDA}, + {0x17, 0x02, 0xDA}, + {0x28, 0x03, 0xDA}, + {0x02, 0x02, 0xDB}, + {0x09, 0x02, 0xDB}, + {0x17, 0x02, 0xDB}, + {0x28, 0x03, 0xDB}, + {0x02, 0x02, 0xEE}, + {0x09, 0x02, 0xEE}, + {0x17, 0x02, 0xEE}, + {0x28, 0x03, 0xEE}, + {0x02, 0x02, 0xF0}, + {0x09, 0x02, 0xF0}, + {0x17, 0x02, 0xF0}, + {0x28, 0x03, 0xF0}, }, /* 201 */ { - {0x03, 2, 218}, - {0x06, 2, 218}, - {0x0A, 2, 218}, - {0x0F, 2, 218}, - {0x18, 2, 218}, - {0x1F, 2, 218}, - {0x29, 2, 218}, - {0x38, 3, 218}, - {0x03, 2, 219}, - {0x06, 2, 219}, - {0x0A, 2, 219}, - {0x0F, 2, 219}, - {0x18, 2, 219}, - {0x1F, 2, 219}, - {0x29, 2, 219}, - {0x38, 3, 219}, + {0x03, 0x02, 0xDA}, + {0x06, 0x02, 0xDA}, + {0x0A, 0x02, 0xDA}, + {0x0F, 0x02, 0xDA}, + {0x18, 0x02, 0xDA}, + {0x1F, 0x02, 0xDA}, + {0x29, 0x02, 0xDA}, + {0x38, 0x03, 0xDA}, + {0x03, 0x02, 0xDB}, + {0x06, 0x02, 0xDB}, + {0x0A, 0x02, 0xDB}, + {0x0F, 0x02, 0xDB}, + {0x18, 0x02, 0xDB}, + {0x1F, 0x02, 0xDB}, + {0x29, 0x02, 0xDB}, + {0x38, 0x03, 0xDB}, }, /* 202 */ { - {0x03, 2, 238}, - {0x06, 2, 238}, - {0x0A, 2, 238}, - {0x0F, 2, 238}, - {0x18, 2, 238}, - {0x1F, 2, 238}, - {0x29, 2, 238}, - {0x38, 3, 238}, - {0x03, 2, 240}, - {0x06, 2, 240}, - {0x0A, 2, 240}, - {0x0F, 2, 240}, - {0x18, 2, 240}, - {0x1F, 2, 240}, - {0x29, 2, 240}, - {0x38, 3, 240}, + {0x03, 0x02, 0xEE}, + {0x06, 0x02, 0xEE}, + {0x0A, 0x02, 0xEE}, + {0x0F, 0x02, 0xEE}, + {0x18, 0x02, 0xEE}, + {0x1F, 0x02, 0xEE}, + {0x29, 0x02, 0xEE}, + {0x38, 0x03, 0xEE}, + {0x03, 0x02, 0xF0}, + {0x06, 0x02, 0xF0}, + {0x0A, 0x02, 0xF0}, + {0x0F, 0x02, 0xF0}, + {0x18, 0x02, 0xF0}, + {0x1F, 0x02, 0xF0}, + {0x29, 0x02, 0xF0}, + {0x38, 0x03, 0xF0}, }, /* 203 */ { - {0x02, 2, 242}, - {0x09, 2, 242}, - {0x17, 2, 242}, - {0x28, 3, 242}, - {0x02, 2, 243}, - {0x09, 2, 243}, - {0x17, 2, 243}, - {0x28, 3, 243}, - {0x02, 2, 255}, - {0x09, 2, 255}, - {0x17, 2, 255}, - {0x28, 3, 255}, - {0x01, 2, 203}, - {0x16, 3, 203}, - {0x01, 2, 204}, - {0x16, 3, 204}, + {0x02, 0x02, 0xF2}, + {0x09, 0x02, 0xF2}, + {0x17, 0x02, 0xF2}, + {0x28, 0x03, 0xF2}, + {0x02, 0x02, 0xF3}, + {0x09, 0x02, 0xF3}, + {0x17, 0x02, 0xF3}, + {0x28, 0x03, 0xF3}, + {0x02, 0x02, 0xFF}, + {0x09, 0x02, 0xFF}, + {0x17, 0x02, 0xFF}, + {0x28, 0x03, 0xFF}, + {0x01, 0x02, 0xCB}, + {0x16, 0x03, 0xCB}, + {0x01, 0x02, 0xCC}, + {0x16, 0x03, 0xCC}, }, /* 204 */ { - {0x03, 2, 242}, - {0x06, 2, 242}, - {0x0A, 2, 242}, - {0x0F, 2, 242}, - {0x18, 2, 242}, - {0x1F, 2, 242}, - {0x29, 2, 242}, - {0x38, 3, 242}, - {0x03, 2, 243}, - {0x06, 2, 243}, - {0x0A, 2, 243}, - {0x0F, 2, 243}, - {0x18, 2, 243}, - {0x1F, 2, 243}, - {0x29, 2, 243}, - {0x38, 3, 243}, + {0x03, 0x02, 0xF2}, + {0x06, 0x02, 0xF2}, + {0x0A, 0x02, 0xF2}, + {0x0F, 0x02, 0xF2}, + {0x18, 0x02, 0xF2}, + {0x1F, 0x02, 0xF2}, + {0x29, 0x02, 0xF2}, + {0x38, 0x03, 0xF2}, + {0x03, 0x02, 0xF3}, + {0x06, 0x02, 0xF3}, + {0x0A, 0x02, 0xF3}, + {0x0F, 0x02, 0xF3}, + {0x18, 0x02, 0xF3}, + {0x1F, 0x02, 0xF3}, + {0x29, 0x02, 0xF3}, + {0x38, 0x03, 0xF3}, }, /* 205 */ { - {0x03, 2, 255}, - {0x06, 2, 255}, - {0x0A, 2, 255}, - {0x0F, 2, 255}, - {0x18, 2, 255}, - {0x1F, 2, 255}, - {0x29, 2, 255}, - {0x38, 3, 255}, - {0x02, 2, 203}, - {0x09, 2, 203}, - {0x17, 2, 203}, - {0x28, 3, 203}, - {0x02, 2, 204}, - {0x09, 2, 204}, - {0x17, 2, 204}, - {0x28, 3, 204}, + {0x03, 0x02, 0xFF}, + {0x06, 0x02, 0xFF}, + {0x0A, 0x02, 0xFF}, + {0x0F, 0x02, 0xFF}, + {0x18, 0x02, 0xFF}, + {0x1F, 0x02, 0xFF}, + {0x29, 0x02, 0xFF}, + {0x38, 0x03, 0xFF}, + {0x02, 0x02, 0xCB}, + {0x09, 0x02, 0xCB}, + {0x17, 0x02, 0xCB}, + {0x28, 0x03, 0xCB}, + {0x02, 0x02, 0xCC}, + {0x09, 0x02, 0xCC}, + {0x17, 0x02, 0xCC}, + {0x28, 0x03, 0xCC}, }, /* 206 */ { - {0x03, 2, 203}, - {0x06, 2, 203}, - {0x0A, 2, 203}, - {0x0F, 2, 203}, - {0x18, 2, 203}, - {0x1F, 2, 203}, - {0x29, 2, 203}, - {0x38, 3, 203}, - {0x03, 2, 204}, - {0x06, 2, 204}, - {0x0A, 2, 204}, - {0x0F, 2, 204}, - {0x18, 2, 204}, - {0x1F, 2, 204}, - {0x29, 2, 204}, - {0x38, 3, 204}, + {0x03, 0x02, 0xCB}, + {0x06, 0x02, 0xCB}, + {0x0A, 0x02, 0xCB}, + {0x0F, 0x02, 0xCB}, + {0x18, 0x02, 0xCB}, + {0x1F, 0x02, 0xCB}, + {0x29, 0x02, 0xCB}, + {0x38, 0x03, 0xCB}, + {0x03, 0x02, 0xCC}, + {0x06, 0x02, 0xCC}, + {0x0A, 0x02, 0xCC}, + {0x0F, 0x02, 0xCC}, + {0x18, 0x02, 0xCC}, + {0x1F, 0x02, 0xCC}, + {0x29, 0x02, 0xCC}, + {0x38, 0x03, 0xCC}, }, /* 207 */ { - {0xD3, 0, 0}, - {0xD4, 0, 0}, - {0xD6, 0, 0}, - {0xD7, 0, 0}, - {0xDA, 0, 0}, - {0xDB, 0, 0}, - {0xDD, 0, 0}, - {0xDE, 0, 0}, - {0xE2, 0, 0}, - {0xE4, 0, 0}, - {0xE8, 0, 0}, - {0xEB, 0, 0}, - {0xF0, 0, 0}, - {0xF3, 0, 0}, - {0xF7, 0, 0}, - {0xFA, 0, 0}, + {0xD3, 0x00, 0x00}, + {0xD4, 0x00, 0x00}, + {0xD6, 0x00, 0x00}, + {0xD7, 0x00, 0x00}, + {0xDA, 0x00, 0x00}, + {0xDB, 0x00, 0x00}, + {0xDD, 0x00, 0x00}, + {0xDE, 0x00, 0x00}, + {0xE2, 0x00, 0x00}, + {0xE4, 0x00, 0x00}, + {0xE8, 0x00, 0x00}, + {0xEB, 0x00, 0x00}, + {0xF0, 0x00, 0x00}, + {0xF3, 0x00, 0x00}, + {0xF7, 0x00, 0x00}, + {0xFA, 0x00, 0x00}, }, /* 208 */ { - {0x00, 3, 211}, - {0x00, 3, 212}, - {0x00, 3, 214}, - {0x00, 3, 221}, - {0x00, 3, 222}, - {0x00, 3, 223}, - {0x00, 3, 241}, - {0x00, 3, 244}, - {0x00, 3, 245}, - {0x00, 3, 246}, - {0x00, 3, 247}, - {0x00, 3, 248}, - {0x00, 3, 250}, - {0x00, 3, 251}, - {0x00, 3, 252}, - {0x00, 3, 253}, + {0x00, 0x03, 0xD3}, + {0x00, 0x03, 0xD4}, + {0x00, 0x03, 0xD6}, + {0x00, 0x03, 0xDD}, + {0x00, 0x03, 0xDE}, + {0x00, 0x03, 0xDF}, + {0x00, 0x03, 0xF1}, + {0x00, 0x03, 0xF4}, + {0x00, 0x03, 0xF5}, + {0x00, 0x03, 0xF6}, + {0x00, 0x03, 0xF7}, + {0x00, 0x03, 0xF8}, + {0x00, 0x03, 0xFA}, + {0x00, 0x03, 0xFB}, + {0x00, 0x03, 0xFC}, + {0x00, 0x03, 0xFD}, }, /* 209 */ { - {0x01, 2, 211}, - {0x16, 3, 211}, - {0x01, 2, 212}, - {0x16, 3, 212}, - {0x01, 2, 214}, - {0x16, 3, 214}, - {0x01, 2, 221}, - {0x16, 3, 221}, - {0x01, 2, 222}, - {0x16, 3, 222}, - {0x01, 2, 223}, - {0x16, 3, 223}, - {0x01, 2, 241}, - {0x16, 3, 241}, - {0x01, 2, 244}, - {0x16, 3, 244}, + {0x01, 0x02, 0xD3}, + {0x16, 0x03, 0xD3}, + {0x01, 0x02, 0xD4}, + {0x16, 0x03, 0xD4}, + {0x01, 0x02, 0xD6}, + {0x16, 0x03, 0xD6}, + {0x01, 0x02, 0xDD}, + {0x16, 0x03, 0xDD}, + {0x01, 0x02, 0xDE}, + {0x16, 0x03, 0xDE}, + {0x01, 0x02, 0xDF}, + {0x16, 0x03, 0xDF}, + {0x01, 0x02, 0xF1}, + {0x16, 0x03, 0xF1}, + {0x01, 0x02, 0xF4}, + {0x16, 0x03, 0xF4}, }, /* 210 */ { - {0x02, 2, 211}, - {0x09, 2, 211}, - {0x17, 2, 211}, - {0x28, 3, 211}, - {0x02, 2, 212}, - {0x09, 2, 212}, - {0x17, 2, 212}, - {0x28, 3, 212}, - {0x02, 2, 214}, - {0x09, 2, 214}, - {0x17, 2, 214}, - {0x28, 3, 214}, - {0x02, 2, 221}, - {0x09, 2, 221}, - {0x17, 2, 221}, - {0x28, 3, 221}, + {0x02, 0x02, 0xD3}, + {0x09, 0x02, 0xD3}, + {0x17, 0x02, 0xD3}, + {0x28, 0x03, 0xD3}, + {0x02, 0x02, 0xD4}, + {0x09, 0x02, 0xD4}, + {0x17, 0x02, 0xD4}, + {0x28, 0x03, 0xD4}, + {0x02, 0x02, 0xD6}, + {0x09, 0x02, 0xD6}, + {0x17, 0x02, 0xD6}, + {0x28, 0x03, 0xD6}, + {0x02, 0x02, 0xDD}, + {0x09, 0x02, 0xDD}, + {0x17, 0x02, 0xDD}, + {0x28, 0x03, 0xDD}, }, /* 211 */ { - {0x03, 2, 211}, - {0x06, 2, 211}, - {0x0A, 2, 211}, - {0x0F, 2, 211}, - {0x18, 2, 211}, - {0x1F, 2, 211}, - {0x29, 2, 211}, - {0x38, 3, 211}, - {0x03, 2, 212}, - {0x06, 2, 212}, - {0x0A, 2, 212}, - {0x0F, 2, 212}, - {0x18, 2, 212}, - {0x1F, 2, 212}, - {0x29, 2, 212}, - {0x38, 3, 212}, + {0x03, 0x02, 0xD3}, + {0x06, 0x02, 0xD3}, + {0x0A, 0x02, 0xD3}, + {0x0F, 0x02, 0xD3}, + {0x18, 0x02, 0xD3}, + {0x1F, 0x02, 0xD3}, + {0x29, 0x02, 0xD3}, + {0x38, 0x03, 0xD3}, + {0x03, 0x02, 0xD4}, + {0x06, 0x02, 0xD4}, + {0x0A, 0x02, 0xD4}, + {0x0F, 0x02, 0xD4}, + {0x18, 0x02, 0xD4}, + {0x1F, 0x02, 0xD4}, + {0x29, 0x02, 0xD4}, + {0x38, 0x03, 0xD4}, }, /* 212 */ { - {0x03, 2, 214}, - {0x06, 2, 214}, - {0x0A, 2, 214}, - {0x0F, 2, 214}, - {0x18, 2, 214}, - {0x1F, 2, 214}, - {0x29, 2, 214}, - {0x38, 3, 214}, - {0x03, 2, 221}, - {0x06, 2, 221}, - {0x0A, 2, 221}, - {0x0F, 2, 221}, - {0x18, 2, 221}, - {0x1F, 2, 221}, - {0x29, 2, 221}, - {0x38, 3, 221}, + {0x03, 0x02, 0xD6}, + {0x06, 0x02, 0xD6}, + {0x0A, 0x02, 0xD6}, + {0x0F, 0x02, 0xD6}, + {0x18, 0x02, 0xD6}, + {0x1F, 0x02, 0xD6}, + {0x29, 0x02, 0xD6}, + {0x38, 0x03, 0xD6}, + {0x03, 0x02, 0xDD}, + {0x06, 0x02, 0xDD}, + {0x0A, 0x02, 0xDD}, + {0x0F, 0x02, 0xDD}, + {0x18, 0x02, 0xDD}, + {0x1F, 0x02, 0xDD}, + {0x29, 0x02, 0xDD}, + {0x38, 0x03, 0xDD}, }, /* 213 */ { - {0x02, 2, 222}, - {0x09, 2, 222}, - {0x17, 2, 222}, - {0x28, 3, 222}, - {0x02, 2, 223}, - {0x09, 2, 223}, - {0x17, 2, 223}, - {0x28, 3, 223}, - {0x02, 2, 241}, - {0x09, 2, 241}, - {0x17, 2, 241}, - {0x28, 3, 241}, - {0x02, 2, 244}, - {0x09, 2, 244}, - {0x17, 2, 244}, - {0x28, 3, 244}, + {0x02, 0x02, 0xDE}, + {0x09, 0x02, 0xDE}, + {0x17, 0x02, 0xDE}, + {0x28, 0x03, 0xDE}, + {0x02, 0x02, 0xDF}, + {0x09, 0x02, 0xDF}, + {0x17, 0x02, 0xDF}, + {0x28, 0x03, 0xDF}, + {0x02, 0x02, 0xF1}, + {0x09, 0x02, 0xF1}, + {0x17, 0x02, 0xF1}, + {0x28, 0x03, 0xF1}, + {0x02, 0x02, 0xF4}, + {0x09, 0x02, 0xF4}, + {0x17, 0x02, 0xF4}, + {0x28, 0x03, 0xF4}, }, /* 214 */ { - {0x03, 2, 222}, - {0x06, 2, 222}, - {0x0A, 2, 222}, - {0x0F, 2, 222}, - {0x18, 2, 222}, - {0x1F, 2, 222}, - {0x29, 2, 222}, - {0x38, 3, 222}, - {0x03, 2, 223}, - {0x06, 2, 223}, - {0x0A, 2, 223}, - {0x0F, 2, 223}, - {0x18, 2, 223}, - {0x1F, 2, 223}, - {0x29, 2, 223}, - {0x38, 3, 223}, + {0x03, 0x02, 0xDE}, + {0x06, 0x02, 0xDE}, + {0x0A, 0x02, 0xDE}, + {0x0F, 0x02, 0xDE}, + {0x18, 0x02, 0xDE}, + {0x1F, 0x02, 0xDE}, + {0x29, 0x02, 0xDE}, + {0x38, 0x03, 0xDE}, + {0x03, 0x02, 0xDF}, + {0x06, 0x02, 0xDF}, + {0x0A, 0x02, 0xDF}, + {0x0F, 0x02, 0xDF}, + {0x18, 0x02, 0xDF}, + {0x1F, 0x02, 0xDF}, + {0x29, 0x02, 0xDF}, + {0x38, 0x03, 0xDF}, }, /* 215 */ { - {0x03, 2, 241}, - {0x06, 2, 241}, - {0x0A, 2, 241}, - {0x0F, 2, 241}, - {0x18, 2, 241}, - {0x1F, 2, 241}, - {0x29, 2, 241}, - {0x38, 3, 241}, - {0x03, 2, 244}, - {0x06, 2, 244}, - {0x0A, 2, 244}, - {0x0F, 2, 244}, - {0x18, 2, 244}, - {0x1F, 2, 244}, - {0x29, 2, 244}, - {0x38, 3, 244}, + {0x03, 0x02, 0xF1}, + {0x06, 0x02, 0xF1}, + {0x0A, 0x02, 0xF1}, + {0x0F, 0x02, 0xF1}, + {0x18, 0x02, 0xF1}, + {0x1F, 0x02, 0xF1}, + {0x29, 0x02, 0xF1}, + {0x38, 0x03, 0xF1}, + {0x03, 0x02, 0xF4}, + {0x06, 0x02, 0xF4}, + {0x0A, 0x02, 0xF4}, + {0x0F, 0x02, 0xF4}, + {0x18, 0x02, 0xF4}, + {0x1F, 0x02, 0xF4}, + {0x29, 0x02, 0xF4}, + {0x38, 0x03, 0xF4}, }, /* 216 */ { - {0x01, 2, 245}, - {0x16, 3, 245}, - {0x01, 2, 246}, - {0x16, 3, 246}, - {0x01, 2, 247}, - {0x16, 3, 247}, - {0x01, 2, 248}, - {0x16, 3, 248}, - {0x01, 2, 250}, - {0x16, 3, 250}, - {0x01, 2, 251}, - {0x16, 3, 251}, - {0x01, 2, 252}, - {0x16, 3, 252}, - {0x01, 2, 253}, - {0x16, 3, 253}, + {0x01, 0x02, 0xF5}, + {0x16, 0x03, 0xF5}, + {0x01, 0x02, 0xF6}, + {0x16, 0x03, 0xF6}, + {0x01, 0x02, 0xF7}, + {0x16, 0x03, 0xF7}, + {0x01, 0x02, 0xF8}, + {0x16, 0x03, 0xF8}, + {0x01, 0x02, 0xFA}, + {0x16, 0x03, 0xFA}, + {0x01, 0x02, 0xFB}, + {0x16, 0x03, 0xFB}, + {0x01, 0x02, 0xFC}, + {0x16, 0x03, 0xFC}, + {0x01, 0x02, 0xFD}, + {0x16, 0x03, 0xFD}, }, /* 217 */ { - {0x02, 2, 245}, - {0x09, 2, 245}, - {0x17, 2, 245}, - {0x28, 3, 245}, - {0x02, 2, 246}, - {0x09, 2, 246}, - {0x17, 2, 246}, - {0x28, 3, 246}, - {0x02, 2, 247}, - {0x09, 2, 247}, - {0x17, 2, 247}, - {0x28, 3, 247}, - {0x02, 2, 248}, - {0x09, 2, 248}, - {0x17, 2, 248}, - {0x28, 3, 248}, + {0x02, 0x02, 0xF5}, + {0x09, 0x02, 0xF5}, + {0x17, 0x02, 0xF5}, + {0x28, 0x03, 0xF5}, + {0x02, 0x02, 0xF6}, + {0x09, 0x02, 0xF6}, + {0x17, 0x02, 0xF6}, + {0x28, 0x03, 0xF6}, + {0x02, 0x02, 0xF7}, + {0x09, 0x02, 0xF7}, + {0x17, 0x02, 0xF7}, + {0x28, 0x03, 0xF7}, + {0x02, 0x02, 0xF8}, + {0x09, 0x02, 0xF8}, + {0x17, 0x02, 0xF8}, + {0x28, 0x03, 0xF8}, }, /* 218 */ { - {0x03, 2, 245}, - {0x06, 2, 245}, - {0x0A, 2, 245}, - {0x0F, 2, 245}, - {0x18, 2, 245}, - {0x1F, 2, 245}, - {0x29, 2, 245}, - {0x38, 3, 245}, - {0x03, 2, 246}, - {0x06, 2, 246}, - {0x0A, 2, 246}, - {0x0F, 2, 246}, - {0x18, 2, 246}, - {0x1F, 2, 246}, - {0x29, 2, 246}, - {0x38, 3, 246}, + {0x03, 0x02, 0xF5}, + {0x06, 0x02, 0xF5}, + {0x0A, 0x02, 0xF5}, + {0x0F, 0x02, 0xF5}, + {0x18, 0x02, 0xF5}, + {0x1F, 0x02, 0xF5}, + {0x29, 0x02, 0xF5}, + {0x38, 0x03, 0xF5}, + {0x03, 0x02, 0xF6}, + {0x06, 0x02, 0xF6}, + {0x0A, 0x02, 0xF6}, + {0x0F, 0x02, 0xF6}, + {0x18, 0x02, 0xF6}, + {0x1F, 0x02, 0xF6}, + {0x29, 0x02, 0xF6}, + {0x38, 0x03, 0xF6}, }, /* 219 */ { - {0x03, 2, 247}, - {0x06, 2, 247}, - {0x0A, 2, 247}, - {0x0F, 2, 247}, - {0x18, 2, 247}, - {0x1F, 2, 247}, - {0x29, 2, 247}, - {0x38, 3, 247}, - {0x03, 2, 248}, - {0x06, 2, 248}, - {0x0A, 2, 248}, - {0x0F, 2, 248}, - {0x18, 2, 248}, - {0x1F, 2, 248}, - {0x29, 2, 248}, - {0x38, 3, 248}, + {0x03, 0x02, 0xF7}, + {0x06, 0x02, 0xF7}, + {0x0A, 0x02, 0xF7}, + {0x0F, 0x02, 0xF7}, + {0x18, 0x02, 0xF7}, + {0x1F, 0x02, 0xF7}, + {0x29, 0x02, 0xF7}, + {0x38, 0x03, 0xF7}, + {0x03, 0x02, 0xF8}, + {0x06, 0x02, 0xF8}, + {0x0A, 0x02, 0xF8}, + {0x0F, 0x02, 0xF8}, + {0x18, 0x02, 0xF8}, + {0x1F, 0x02, 0xF8}, + {0x29, 0x02, 0xF8}, + {0x38, 0x03, 0xF8}, }, /* 220 */ { - {0x02, 2, 250}, - {0x09, 2, 250}, - {0x17, 2, 250}, - {0x28, 3, 250}, - {0x02, 2, 251}, - {0x09, 2, 251}, - {0x17, 2, 251}, - {0x28, 3, 251}, - {0x02, 2, 252}, - {0x09, 2, 252}, - {0x17, 2, 252}, - {0x28, 3, 252}, - {0x02, 2, 253}, - {0x09, 2, 253}, - {0x17, 2, 253}, - {0x28, 3, 253}, + {0x02, 0x02, 0xFA}, + {0x09, 0x02, 0xFA}, + {0x17, 0x02, 0xFA}, + {0x28, 0x03, 0xFA}, + {0x02, 0x02, 0xFB}, + {0x09, 0x02, 0xFB}, + {0x17, 0x02, 0xFB}, + {0x28, 0x03, 0xFB}, + {0x02, 0x02, 0xFC}, + {0x09, 0x02, 0xFC}, + {0x17, 0x02, 0xFC}, + {0x28, 0x03, 0xFC}, + {0x02, 0x02, 0xFD}, + {0x09, 0x02, 0xFD}, + {0x17, 0x02, 0xFD}, + {0x28, 0x03, 0xFD}, }, /* 221 */ { - {0x03, 2, 250}, - {0x06, 2, 250}, - {0x0A, 2, 250}, - {0x0F, 2, 250}, - {0x18, 2, 250}, - {0x1F, 2, 250}, - {0x29, 2, 250}, - {0x38, 3, 250}, - {0x03, 2, 251}, - {0x06, 2, 251}, - {0x0A, 2, 251}, - {0x0F, 2, 251}, - {0x18, 2, 251}, - {0x1F, 2, 251}, - {0x29, 2, 251}, - {0x38, 3, 251}, + {0x03, 0x02, 0xFA}, + {0x06, 0x02, 0xFA}, + {0x0A, 0x02, 0xFA}, + {0x0F, 0x02, 0xFA}, + {0x18, 0x02, 0xFA}, + {0x1F, 0x02, 0xFA}, + {0x29, 0x02, 0xFA}, + {0x38, 0x03, 0xFA}, + {0x03, 0x02, 0xFB}, + {0x06, 0x02, 0xFB}, + {0x0A, 0x02, 0xFB}, + {0x0F, 0x02, 0xFB}, + {0x18, 0x02, 0xFB}, + {0x1F, 0x02, 0xFB}, + {0x29, 0x02, 0xFB}, + {0x38, 0x03, 0xFB}, }, /* 222 */ { - {0x03, 2, 252}, - {0x06, 2, 252}, - {0x0A, 2, 252}, - {0x0F, 2, 252}, - {0x18, 2, 252}, - {0x1F, 2, 252}, - {0x29, 2, 252}, - {0x38, 3, 252}, - {0x03, 2, 253}, - {0x06, 2, 253}, - {0x0A, 2, 253}, - {0x0F, 2, 253}, - {0x18, 2, 253}, - {0x1F, 2, 253}, - {0x29, 2, 253}, - {0x38, 3, 253}, + {0x03, 0x02, 0xFC}, + {0x06, 0x02, 0xFC}, + {0x0A, 0x02, 0xFC}, + {0x0F, 0x02, 0xFC}, + {0x18, 0x02, 0xFC}, + {0x1F, 0x02, 0xFC}, + {0x29, 0x02, 0xFC}, + {0x38, 0x03, 0xFC}, + {0x03, 0x02, 0xFD}, + {0x06, 0x02, 0xFD}, + {0x0A, 0x02, 0xFD}, + {0x0F, 0x02, 0xFD}, + {0x18, 0x02, 0xFD}, + {0x1F, 0x02, 0xFD}, + {0x29, 0x02, 0xFD}, + {0x38, 0x03, 0xFD}, }, /* 223 */ { - {0x00, 3, 254}, - {0xE3, 0, 0}, - {0xE5, 0, 0}, - {0xE6, 0, 0}, - {0xE9, 0, 0}, - {0xEA, 0, 0}, - {0xEC, 0, 0}, - {0xED, 0, 0}, - {0xF1, 0, 0}, - {0xF2, 0, 0}, - {0xF4, 0, 0}, - {0xF5, 0, 0}, - {0xF8, 0, 0}, - {0xF9, 0, 0}, - {0xFB, 0, 0}, - {0xFC, 0, 0}, + {0x00, 0x03, 0xFE}, + {0xE3, 0x00, 0x00}, + {0xE5, 0x00, 0x00}, + {0xE6, 0x00, 0x00}, + {0xE9, 0x00, 0x00}, + {0xEA, 0x00, 0x00}, + {0xEC, 0x00, 0x00}, + {0xED, 0x00, 0x00}, + {0xF1, 0x00, 0x00}, + {0xF2, 0x00, 0x00}, + {0xF4, 0x00, 0x00}, + {0xF5, 0x00, 0x00}, + {0xF8, 0x00, 0x00}, + {0xF9, 0x00, 0x00}, + {0xFB, 0x00, 0x00}, + {0xFC, 0x00, 0x00}, }, /* 224 */ { - {0x01, 2, 254}, - {0x16, 3, 254}, - {0x00, 3, 2}, - {0x00, 3, 3}, - {0x00, 3, 4}, - {0x00, 3, 5}, - {0x00, 3, 6}, - {0x00, 3, 7}, - {0x00, 3, 8}, - {0x00, 3, 11}, - {0x00, 3, 12}, - {0x00, 3, 14}, - {0x00, 3, 15}, - {0x00, 3, 16}, - {0x00, 3, 17}, - {0x00, 3, 18}, + {0x01, 0x02, 0xFE}, + {0x16, 0x03, 0xFE}, + {0x00, 0x03, 0x02}, + {0x00, 0x03, 0x03}, + {0x00, 0x03, 0x04}, + {0x00, 0x03, 0x05}, + {0x00, 0x03, 0x06}, + {0x00, 0x03, 0x07}, + {0x00, 0x03, 0x08}, + {0x00, 0x03, 0x0B}, + {0x00, 0x03, 0x0C}, + {0x00, 0x03, 0x0E}, + {0x00, 0x03, 0x0F}, + {0x00, 0x03, 0x10}, + {0x00, 0x03, 0x11}, + {0x00, 0x03, 0x12}, }, /* 225 */ { - {0x02, 2, 254}, - {0x09, 2, 254}, - {0x17, 2, 254}, - {0x28, 3, 254}, - {0x01, 2, 2}, - {0x16, 3, 2}, - {0x01, 2, 3}, - {0x16, 3, 3}, - {0x01, 2, 4}, - {0x16, 3, 4}, - {0x01, 2, 5}, - {0x16, 3, 5}, - {0x01, 2, 6}, - {0x16, 3, 6}, - {0x01, 2, 7}, - {0x16, 3, 7}, + {0x02, 0x02, 0xFE}, + {0x09, 0x02, 0xFE}, + {0x17, 0x02, 0xFE}, + {0x28, 0x03, 0xFE}, + {0x01, 0x02, 0x02}, + {0x16, 0x03, 0x02}, + {0x01, 0x02, 0x03}, + {0x16, 0x03, 0x03}, + {0x01, 0x02, 0x04}, + {0x16, 0x03, 0x04}, + {0x01, 0x02, 0x05}, + {0x16, 0x03, 0x05}, + {0x01, 0x02, 0x06}, + {0x16, 0x03, 0x06}, + {0x01, 0x02, 0x07}, + {0x16, 0x03, 0x07}, }, /* 226 */ { - {0x03, 2, 254}, - {0x06, 2, 254}, - {0x0A, 2, 254}, - {0x0F, 2, 254}, - {0x18, 2, 254}, - {0x1F, 2, 254}, - {0x29, 2, 254}, - {0x38, 3, 254}, - {0x02, 2, 2}, - {0x09, 2, 2}, - {0x17, 2, 2}, - {0x28, 3, 2}, - {0x02, 2, 3}, - {0x09, 2, 3}, - {0x17, 2, 3}, - {0x28, 3, 3}, + {0x03, 0x02, 0xFE}, + {0x06, 0x02, 0xFE}, + {0x0A, 0x02, 0xFE}, + {0x0F, 0x02, 0xFE}, + {0x18, 0x02, 0xFE}, + {0x1F, 0x02, 0xFE}, + {0x29, 0x02, 0xFE}, + {0x38, 0x03, 0xFE}, + {0x02, 0x02, 0x02}, + {0x09, 0x02, 0x02}, + {0x17, 0x02, 0x02}, + {0x28, 0x03, 0x02}, + {0x02, 0x02, 0x03}, + {0x09, 0x02, 0x03}, + {0x17, 0x02, 0x03}, + {0x28, 0x03, 0x03}, }, /* 227 */ { - {0x03, 2, 2}, - {0x06, 2, 2}, - {0x0A, 2, 2}, - {0x0F, 2, 2}, - {0x18, 2, 2}, - {0x1F, 2, 2}, - {0x29, 2, 2}, - {0x38, 3, 2}, - {0x03, 2, 3}, - {0x06, 2, 3}, - {0x0A, 2, 3}, - {0x0F, 2, 3}, - {0x18, 2, 3}, - {0x1F, 2, 3}, - {0x29, 2, 3}, - {0x38, 3, 3}, + {0x03, 0x02, 0x02}, + {0x06, 0x02, 0x02}, + {0x0A, 0x02, 0x02}, + {0x0F, 0x02, 0x02}, + {0x18, 0x02, 0x02}, + {0x1F, 0x02, 0x02}, + {0x29, 0x02, 0x02}, + {0x38, 0x03, 0x02}, + {0x03, 0x02, 0x03}, + {0x06, 0x02, 0x03}, + {0x0A, 0x02, 0x03}, + {0x0F, 0x02, 0x03}, + {0x18, 0x02, 0x03}, + {0x1F, 0x02, 0x03}, + {0x29, 0x02, 0x03}, + {0x38, 0x03, 0x03}, }, /* 228 */ { - {0x02, 2, 4}, - {0x09, 2, 4}, - {0x17, 2, 4}, - {0x28, 3, 4}, - {0x02, 2, 5}, - {0x09, 2, 5}, - {0x17, 2, 5}, - {0x28, 3, 5}, - {0x02, 2, 6}, - {0x09, 2, 6}, - {0x17, 2, 6}, - {0x28, 3, 6}, - {0x02, 2, 7}, - {0x09, 2, 7}, - {0x17, 2, 7}, - {0x28, 3, 7}, + {0x02, 0x02, 0x04}, + {0x09, 0x02, 0x04}, + {0x17, 0x02, 0x04}, + {0x28, 0x03, 0x04}, + {0x02, 0x02, 0x05}, + {0x09, 0x02, 0x05}, + {0x17, 0x02, 0x05}, + {0x28, 0x03, 0x05}, + {0x02, 0x02, 0x06}, + {0x09, 0x02, 0x06}, + {0x17, 0x02, 0x06}, + {0x28, 0x03, 0x06}, + {0x02, 0x02, 0x07}, + {0x09, 0x02, 0x07}, + {0x17, 0x02, 0x07}, + {0x28, 0x03, 0x07}, }, /* 229 */ { - {0x03, 2, 4}, - {0x06, 2, 4}, - {0x0A, 2, 4}, - {0x0F, 2, 4}, - {0x18, 2, 4}, - {0x1F, 2, 4}, - {0x29, 2, 4}, - {0x38, 3, 4}, - {0x03, 2, 5}, - {0x06, 2, 5}, - {0x0A, 2, 5}, - {0x0F, 2, 5}, - {0x18, 2, 5}, - {0x1F, 2, 5}, - {0x29, 2, 5}, - {0x38, 3, 5}, + {0x03, 0x02, 0x04}, + {0x06, 0x02, 0x04}, + {0x0A, 0x02, 0x04}, + {0x0F, 0x02, 0x04}, + {0x18, 0x02, 0x04}, + {0x1F, 0x02, 0x04}, + {0x29, 0x02, 0x04}, + {0x38, 0x03, 0x04}, + {0x03, 0x02, 0x05}, + {0x06, 0x02, 0x05}, + {0x0A, 0x02, 0x05}, + {0x0F, 0x02, 0x05}, + {0x18, 0x02, 0x05}, + {0x1F, 0x02, 0x05}, + {0x29, 0x02, 0x05}, + {0x38, 0x03, 0x05}, }, /* 230 */ { - {0x03, 2, 6}, - {0x06, 2, 6}, - {0x0A, 2, 6}, - {0x0F, 2, 6}, - {0x18, 2, 6}, - {0x1F, 2, 6}, - {0x29, 2, 6}, - {0x38, 3, 6}, - {0x03, 2, 7}, - {0x06, 2, 7}, - {0x0A, 2, 7}, - {0x0F, 2, 7}, - {0x18, 2, 7}, - {0x1F, 2, 7}, - {0x29, 2, 7}, - {0x38, 3, 7}, + {0x03, 0x02, 0x06}, + {0x06, 0x02, 0x06}, + {0x0A, 0x02, 0x06}, + {0x0F, 0x02, 0x06}, + {0x18, 0x02, 0x06}, + {0x1F, 0x02, 0x06}, + {0x29, 0x02, 0x06}, + {0x38, 0x03, 0x06}, + {0x03, 0x02, 0x07}, + {0x06, 0x02, 0x07}, + {0x0A, 0x02, 0x07}, + {0x0F, 0x02, 0x07}, + {0x18, 0x02, 0x07}, + {0x1F, 0x02, 0x07}, + {0x29, 0x02, 0x07}, + {0x38, 0x03, 0x07}, }, /* 231 */ { - {0x01, 2, 8}, - {0x16, 3, 8}, - {0x01, 2, 11}, - {0x16, 3, 11}, - {0x01, 2, 12}, - {0x16, 3, 12}, - {0x01, 2, 14}, - {0x16, 3, 14}, - {0x01, 2, 15}, - {0x16, 3, 15}, - {0x01, 2, 16}, - {0x16, 3, 16}, - {0x01, 2, 17}, - {0x16, 3, 17}, - {0x01, 2, 18}, - {0x16, 3, 18}, + {0x01, 0x02, 0x08}, + {0x16, 0x03, 0x08}, + {0x01, 0x02, 0x0B}, + {0x16, 0x03, 0x0B}, + {0x01, 0x02, 0x0C}, + {0x16, 0x03, 0x0C}, + {0x01, 0x02, 0x0E}, + {0x16, 0x03, 0x0E}, + {0x01, 0x02, 0x0F}, + {0x16, 0x03, 0x0F}, + {0x01, 0x02, 0x10}, + {0x16, 0x03, 0x10}, + {0x01, 0x02, 0x11}, + {0x16, 0x03, 0x11}, + {0x01, 0x02, 0x12}, + {0x16, 0x03, 0x12}, }, /* 232 */ { - {0x02, 2, 8}, - {0x09, 2, 8}, - {0x17, 2, 8}, - {0x28, 3, 8}, - {0x02, 2, 11}, - {0x09, 2, 11}, - {0x17, 2, 11}, - {0x28, 3, 11}, - {0x02, 2, 12}, - {0x09, 2, 12}, - {0x17, 2, 12}, - {0x28, 3, 12}, - {0x02, 2, 14}, - {0x09, 2, 14}, - {0x17, 2, 14}, - {0x28, 3, 14}, + {0x02, 0x02, 0x08}, + {0x09, 0x02, 0x08}, + {0x17, 0x02, 0x08}, + {0x28, 0x03, 0x08}, + {0x02, 0x02, 0x0B}, + {0x09, 0x02, 0x0B}, + {0x17, 0x02, 0x0B}, + {0x28, 0x03, 0x0B}, + {0x02, 0x02, 0x0C}, + {0x09, 0x02, 0x0C}, + {0x17, 0x02, 0x0C}, + {0x28, 0x03, 0x0C}, + {0x02, 0x02, 0x0E}, + {0x09, 0x02, 0x0E}, + {0x17, 0x02, 0x0E}, + {0x28, 0x03, 0x0E}, }, /* 233 */ { - {0x03, 2, 8}, - {0x06, 2, 8}, - {0x0A, 2, 8}, - {0x0F, 2, 8}, - {0x18, 2, 8}, - {0x1F, 2, 8}, - {0x29, 2, 8}, - {0x38, 3, 8}, - {0x03, 2, 11}, - {0x06, 2, 11}, - {0x0A, 2, 11}, - {0x0F, 2, 11}, - {0x18, 2, 11}, - {0x1F, 2, 11}, - {0x29, 2, 11}, - {0x38, 3, 11}, + {0x03, 0x02, 0x08}, + {0x06, 0x02, 0x08}, + {0x0A, 0x02, 0x08}, + {0x0F, 0x02, 0x08}, + {0x18, 0x02, 0x08}, + {0x1F, 0x02, 0x08}, + {0x29, 0x02, 0x08}, + {0x38, 0x03, 0x08}, + {0x03, 0x02, 0x0B}, + {0x06, 0x02, 0x0B}, + {0x0A, 0x02, 0x0B}, + {0x0F, 0x02, 0x0B}, + {0x18, 0x02, 0x0B}, + {0x1F, 0x02, 0x0B}, + {0x29, 0x02, 0x0B}, + {0x38, 0x03, 0x0B}, }, /* 234 */ { - {0x03, 2, 12}, - {0x06, 2, 12}, - {0x0A, 2, 12}, - {0x0F, 2, 12}, - {0x18, 2, 12}, - {0x1F, 2, 12}, - {0x29, 2, 12}, - {0x38, 3, 12}, - {0x03, 2, 14}, - {0x06, 2, 14}, - {0x0A, 2, 14}, - {0x0F, 2, 14}, - {0x18, 2, 14}, - {0x1F, 2, 14}, - {0x29, 2, 14}, - {0x38, 3, 14}, + {0x03, 0x02, 0x0C}, + {0x06, 0x02, 0x0C}, + {0x0A, 0x02, 0x0C}, + {0x0F, 0x02, 0x0C}, + {0x18, 0x02, 0x0C}, + {0x1F, 0x02, 0x0C}, + {0x29, 0x02, 0x0C}, + {0x38, 0x03, 0x0C}, + {0x03, 0x02, 0x0E}, + {0x06, 0x02, 0x0E}, + {0x0A, 0x02, 0x0E}, + {0x0F, 0x02, 0x0E}, + {0x18, 0x02, 0x0E}, + {0x1F, 0x02, 0x0E}, + {0x29, 0x02, 0x0E}, + {0x38, 0x03, 0x0E}, }, /* 235 */ { - {0x02, 2, 15}, - {0x09, 2, 15}, - {0x17, 2, 15}, - {0x28, 3, 15}, - {0x02, 2, 16}, - {0x09, 2, 16}, - {0x17, 2, 16}, - {0x28, 3, 16}, - {0x02, 2, 17}, - {0x09, 2, 17}, - {0x17, 2, 17}, - {0x28, 3, 17}, - {0x02, 2, 18}, - {0x09, 2, 18}, - {0x17, 2, 18}, - {0x28, 3, 18}, + {0x02, 0x02, 0x0F}, + {0x09, 0x02, 0x0F}, + {0x17, 0x02, 0x0F}, + {0x28, 0x03, 0x0F}, + {0x02, 0x02, 0x10}, + {0x09, 0x02, 0x10}, + {0x17, 0x02, 0x10}, + {0x28, 0x03, 0x10}, + {0x02, 0x02, 0x11}, + {0x09, 0x02, 0x11}, + {0x17, 0x02, 0x11}, + {0x28, 0x03, 0x11}, + {0x02, 0x02, 0x12}, + {0x09, 0x02, 0x12}, + {0x17, 0x02, 0x12}, + {0x28, 0x03, 0x12}, }, /* 236 */ { - {0x03, 2, 15}, - {0x06, 2, 15}, - {0x0A, 2, 15}, - {0x0F, 2, 15}, - {0x18, 2, 15}, - {0x1F, 2, 15}, - {0x29, 2, 15}, - {0x38, 3, 15}, - {0x03, 2, 16}, - {0x06, 2, 16}, - {0x0A, 2, 16}, - {0x0F, 2, 16}, - {0x18, 2, 16}, - {0x1F, 2, 16}, - {0x29, 2, 16}, - {0x38, 3, 16}, + {0x03, 0x02, 0x0F}, + {0x06, 0x02, 0x0F}, + {0x0A, 0x02, 0x0F}, + {0x0F, 0x02, 0x0F}, + {0x18, 0x02, 0x0F}, + {0x1F, 0x02, 0x0F}, + {0x29, 0x02, 0x0F}, + {0x38, 0x03, 0x0F}, + {0x03, 0x02, 0x10}, + {0x06, 0x02, 0x10}, + {0x0A, 0x02, 0x10}, + {0x0F, 0x02, 0x10}, + {0x18, 0x02, 0x10}, + {0x1F, 0x02, 0x10}, + {0x29, 0x02, 0x10}, + {0x38, 0x03, 0x10}, }, /* 237 */ { - {0x03, 2, 17}, - {0x06, 2, 17}, - {0x0A, 2, 17}, - {0x0F, 2, 17}, - {0x18, 2, 17}, - {0x1F, 2, 17}, - {0x29, 2, 17}, - {0x38, 3, 17}, - {0x03, 2, 18}, - {0x06, 2, 18}, - {0x0A, 2, 18}, - {0x0F, 2, 18}, - {0x18, 2, 18}, - {0x1F, 2, 18}, - {0x29, 2, 18}, - {0x38, 3, 18}, + {0x03, 0x02, 0x11}, + {0x06, 0x02, 0x11}, + {0x0A, 0x02, 0x11}, + {0x0F, 0x02, 0x11}, + {0x18, 0x02, 0x11}, + {0x1F, 0x02, 0x11}, + {0x29, 0x02, 0x11}, + {0x38, 0x03, 0x11}, + {0x03, 0x02, 0x12}, + {0x06, 0x02, 0x12}, + {0x0A, 0x02, 0x12}, + {0x0F, 0x02, 0x12}, + {0x18, 0x02, 0x12}, + {0x1F, 0x02, 0x12}, + {0x29, 0x02, 0x12}, + {0x38, 0x03, 0x12}, }, /* 238 */ { - {0x00, 3, 19}, - {0x00, 3, 20}, - {0x00, 3, 21}, - {0x00, 3, 23}, - {0x00, 3, 24}, - {0x00, 3, 25}, - {0x00, 3, 26}, - {0x00, 3, 27}, - {0x00, 3, 28}, - {0x00, 3, 29}, - {0x00, 3, 30}, - {0x00, 3, 31}, - {0x00, 3, 127}, - {0x00, 3, 220}, - {0x00, 3, 249}, - {0xFD, 0, 0}, + {0x00, 0x03, 0x13}, + {0x00, 0x03, 0x14}, + {0x00, 0x03, 0x15}, + {0x00, 0x03, 0x17}, + {0x00, 0x03, 0x18}, + {0x00, 0x03, 0x19}, + {0x00, 0x03, 0x1A}, + {0x00, 0x03, 0x1B}, + {0x00, 0x03, 0x1C}, + {0x00, 0x03, 0x1D}, + {0x00, 0x03, 0x1E}, + {0x00, 0x03, 0x1F}, + {0x00, 0x03, 0x7F}, + {0x00, 0x03, 0xDC}, + {0x00, 0x03, 0xF9}, + {0xFD, 0x00, 0x00}, }, /* 239 */ { - {0x01, 2, 19}, - {0x16, 3, 19}, - {0x01, 2, 20}, - {0x16, 3, 20}, - {0x01, 2, 21}, - {0x16, 3, 21}, - {0x01, 2, 23}, - {0x16, 3, 23}, - {0x01, 2, 24}, - {0x16, 3, 24}, - {0x01, 2, 25}, - {0x16, 3, 25}, - {0x01, 2, 26}, - {0x16, 3, 26}, - {0x01, 2, 27}, - {0x16, 3, 27}, + {0x01, 0x02, 0x13}, + {0x16, 0x03, 0x13}, + {0x01, 0x02, 0x14}, + {0x16, 0x03, 0x14}, + {0x01, 0x02, 0x15}, + {0x16, 0x03, 0x15}, + {0x01, 0x02, 0x17}, + {0x16, 0x03, 0x17}, + {0x01, 0x02, 0x18}, + {0x16, 0x03, 0x18}, + {0x01, 0x02, 0x19}, + {0x16, 0x03, 0x19}, + {0x01, 0x02, 0x1A}, + {0x16, 0x03, 0x1A}, + {0x01, 0x02, 0x1B}, + {0x16, 0x03, 0x1B}, }, /* 240 */ { - {0x02, 2, 19}, - {0x09, 2, 19}, - {0x17, 2, 19}, - {0x28, 3, 19}, - {0x02, 2, 20}, - {0x09, 2, 20}, - {0x17, 2, 20}, - {0x28, 3, 20}, - {0x02, 2, 21}, - {0x09, 2, 21}, - {0x17, 2, 21}, - {0x28, 3, 21}, - {0x02, 2, 23}, - {0x09, 2, 23}, - {0x17, 2, 23}, - {0x28, 3, 23}, + {0x02, 0x02, 0x13}, + {0x09, 0x02, 0x13}, + {0x17, 0x02, 0x13}, + {0x28, 0x03, 0x13}, + {0x02, 0x02, 0x14}, + {0x09, 0x02, 0x14}, + {0x17, 0x02, 0x14}, + {0x28, 0x03, 0x14}, + {0x02, 0x02, 0x15}, + {0x09, 0x02, 0x15}, + {0x17, 0x02, 0x15}, + {0x28, 0x03, 0x15}, + {0x02, 0x02, 0x17}, + {0x09, 0x02, 0x17}, + {0x17, 0x02, 0x17}, + {0x28, 0x03, 0x17}, }, /* 241 */ { - {0x03, 2, 19}, - {0x06, 2, 19}, - {0x0A, 2, 19}, - {0x0F, 2, 19}, - {0x18, 2, 19}, - {0x1F, 2, 19}, - {0x29, 2, 19}, - {0x38, 3, 19}, - {0x03, 2, 20}, - {0x06, 2, 20}, - {0x0A, 2, 20}, - {0x0F, 2, 20}, - {0x18, 2, 20}, - {0x1F, 2, 20}, - {0x29, 2, 20}, - {0x38, 3, 20}, + {0x03, 0x02, 0x13}, + {0x06, 0x02, 0x13}, + {0x0A, 0x02, 0x13}, + {0x0F, 0x02, 0x13}, + {0x18, 0x02, 0x13}, + {0x1F, 0x02, 0x13}, + {0x29, 0x02, 0x13}, + {0x38, 0x03, 0x13}, + {0x03, 0x02, 0x14}, + {0x06, 0x02, 0x14}, + {0x0A, 0x02, 0x14}, + {0x0F, 0x02, 0x14}, + {0x18, 0x02, 0x14}, + {0x1F, 0x02, 0x14}, + {0x29, 0x02, 0x14}, + {0x38, 0x03, 0x14}, }, /* 242 */ { - {0x03, 2, 21}, - {0x06, 2, 21}, - {0x0A, 2, 21}, - {0x0F, 2, 21}, - {0x18, 2, 21}, - {0x1F, 2, 21}, - {0x29, 2, 21}, - {0x38, 3, 21}, - {0x03, 2, 23}, - {0x06, 2, 23}, - {0x0A, 2, 23}, - {0x0F, 2, 23}, - {0x18, 2, 23}, - {0x1F, 2, 23}, - {0x29, 2, 23}, - {0x38, 3, 23}, + {0x03, 0x02, 0x15}, + {0x06, 0x02, 0x15}, + {0x0A, 0x02, 0x15}, + {0x0F, 0x02, 0x15}, + {0x18, 0x02, 0x15}, + {0x1F, 0x02, 0x15}, + {0x29, 0x02, 0x15}, + {0x38, 0x03, 0x15}, + {0x03, 0x02, 0x17}, + {0x06, 0x02, 0x17}, + {0x0A, 0x02, 0x17}, + {0x0F, 0x02, 0x17}, + {0x18, 0x02, 0x17}, + {0x1F, 0x02, 0x17}, + {0x29, 0x02, 0x17}, + {0x38, 0x03, 0x17}, }, /* 243 */ { - {0x02, 2, 24}, - {0x09, 2, 24}, - {0x17, 2, 24}, - {0x28, 3, 24}, - {0x02, 2, 25}, - {0x09, 2, 25}, - {0x17, 2, 25}, - {0x28, 3, 25}, - {0x02, 2, 26}, - {0x09, 2, 26}, - {0x17, 2, 26}, - {0x28, 3, 26}, - {0x02, 2, 27}, - {0x09, 2, 27}, - {0x17, 2, 27}, - {0x28, 3, 27}, + {0x02, 0x02, 0x18}, + {0x09, 0x02, 0x18}, + {0x17, 0x02, 0x18}, + {0x28, 0x03, 0x18}, + {0x02, 0x02, 0x19}, + {0x09, 0x02, 0x19}, + {0x17, 0x02, 0x19}, + {0x28, 0x03, 0x19}, + {0x02, 0x02, 0x1A}, + {0x09, 0x02, 0x1A}, + {0x17, 0x02, 0x1A}, + {0x28, 0x03, 0x1A}, + {0x02, 0x02, 0x1B}, + {0x09, 0x02, 0x1B}, + {0x17, 0x02, 0x1B}, + {0x28, 0x03, 0x1B}, }, /* 244 */ { - {0x03, 2, 24}, - {0x06, 2, 24}, - {0x0A, 2, 24}, - {0x0F, 2, 24}, - {0x18, 2, 24}, - {0x1F, 2, 24}, - {0x29, 2, 24}, - {0x38, 3, 24}, - {0x03, 2, 25}, - {0x06, 2, 25}, - {0x0A, 2, 25}, - {0x0F, 2, 25}, - {0x18, 2, 25}, - {0x1F, 2, 25}, - {0x29, 2, 25}, - {0x38, 3, 25}, + {0x03, 0x02, 0x18}, + {0x06, 0x02, 0x18}, + {0x0A, 0x02, 0x18}, + {0x0F, 0x02, 0x18}, + {0x18, 0x02, 0x18}, + {0x1F, 0x02, 0x18}, + {0x29, 0x02, 0x18}, + {0x38, 0x03, 0x18}, + {0x03, 0x02, 0x19}, + {0x06, 0x02, 0x19}, + {0x0A, 0x02, 0x19}, + {0x0F, 0x02, 0x19}, + {0x18, 0x02, 0x19}, + {0x1F, 0x02, 0x19}, + {0x29, 0x02, 0x19}, + {0x38, 0x03, 0x19}, }, /* 245 */ { - {0x03, 2, 26}, - {0x06, 2, 26}, - {0x0A, 2, 26}, - {0x0F, 2, 26}, - {0x18, 2, 26}, - {0x1F, 2, 26}, - {0x29, 2, 26}, - {0x38, 3, 26}, - {0x03, 2, 27}, - {0x06, 2, 27}, - {0x0A, 2, 27}, - {0x0F, 2, 27}, - {0x18, 2, 27}, - {0x1F, 2, 27}, - {0x29, 2, 27}, - {0x38, 3, 27}, + {0x03, 0x02, 0x1A}, + {0x06, 0x02, 0x1A}, + {0x0A, 0x02, 0x1A}, + {0x0F, 0x02, 0x1A}, + {0x18, 0x02, 0x1A}, + {0x1F, 0x02, 0x1A}, + {0x29, 0x02, 0x1A}, + {0x38, 0x03, 0x1A}, + {0x03, 0x02, 0x1B}, + {0x06, 0x02, 0x1B}, + {0x0A, 0x02, 0x1B}, + {0x0F, 0x02, 0x1B}, + {0x18, 0x02, 0x1B}, + {0x1F, 0x02, 0x1B}, + {0x29, 0x02, 0x1B}, + {0x38, 0x03, 0x1B}, }, /* 246 */ { - {0x01, 2, 28}, - {0x16, 3, 28}, - {0x01, 2, 29}, - {0x16, 3, 29}, - {0x01, 2, 30}, - {0x16, 3, 30}, - {0x01, 2, 31}, - {0x16, 3, 31}, - {0x01, 2, 127}, - {0x16, 3, 127}, - {0x01, 2, 220}, - {0x16, 3, 220}, - {0x01, 2, 249}, - {0x16, 3, 249}, - {0xFE, 0, 0}, - {0xFF, 0, 0}, + {0x01, 0x02, 0x1C}, + {0x16, 0x03, 0x1C}, + {0x01, 0x02, 0x1D}, + {0x16, 0x03, 0x1D}, + {0x01, 0x02, 0x1E}, + {0x16, 0x03, 0x1E}, + {0x01, 0x02, 0x1F}, + {0x16, 0x03, 0x1F}, + {0x01, 0x02, 0x7F}, + {0x16, 0x03, 0x7F}, + {0x01, 0x02, 0xDC}, + {0x16, 0x03, 0xDC}, + {0x01, 0x02, 0xF9}, + {0x16, 0x03, 0xF9}, + {0xFE, 0x00, 0x00}, + {0xFF, 0x00, 0x00}, }, /* 247 */ { - {0x02, 2, 28}, - {0x09, 2, 28}, - {0x17, 2, 28}, - {0x28, 3, 28}, - {0x02, 2, 29}, - {0x09, 2, 29}, - {0x17, 2, 29}, - {0x28, 3, 29}, - {0x02, 2, 30}, - {0x09, 2, 30}, - {0x17, 2, 30}, - {0x28, 3, 30}, - {0x02, 2, 31}, - {0x09, 2, 31}, - {0x17, 2, 31}, - {0x28, 3, 31}, + {0x02, 0x02, 0x1C}, + {0x09, 0x02, 0x1C}, + {0x17, 0x02, 0x1C}, + {0x28, 0x03, 0x1C}, + {0x02, 0x02, 0x1D}, + {0x09, 0x02, 0x1D}, + {0x17, 0x02, 0x1D}, + {0x28, 0x03, 0x1D}, + {0x02, 0x02, 0x1E}, + {0x09, 0x02, 0x1E}, + {0x17, 0x02, 0x1E}, + {0x28, 0x03, 0x1E}, + {0x02, 0x02, 0x1F}, + {0x09, 0x02, 0x1F}, + {0x17, 0x02, 0x1F}, + {0x28, 0x03, 0x1F}, }, /* 248 */ { - {0x03, 2, 28}, - {0x06, 2, 28}, - {0x0A, 2, 28}, - {0x0F, 2, 28}, - {0x18, 2, 28}, - {0x1F, 2, 28}, - {0x29, 2, 28}, - {0x38, 3, 28}, - {0x03, 2, 29}, - {0x06, 2, 29}, - {0x0A, 2, 29}, - {0x0F, 2, 29}, - {0x18, 2, 29}, - {0x1F, 2, 29}, - {0x29, 2, 29}, - {0x38, 3, 29}, + {0x03, 0x02, 0x1C}, + {0x06, 0x02, 0x1C}, + {0x0A, 0x02, 0x1C}, + {0x0F, 0x02, 0x1C}, + {0x18, 0x02, 0x1C}, + {0x1F, 0x02, 0x1C}, + {0x29, 0x02, 0x1C}, + {0x38, 0x03, 0x1C}, + {0x03, 0x02, 0x1D}, + {0x06, 0x02, 0x1D}, + {0x0A, 0x02, 0x1D}, + {0x0F, 0x02, 0x1D}, + {0x18, 0x02, 0x1D}, + {0x1F, 0x02, 0x1D}, + {0x29, 0x02, 0x1D}, + {0x38, 0x03, 0x1D}, }, /* 249 */ { - {0x03, 2, 30}, - {0x06, 2, 30}, - {0x0A, 2, 30}, - {0x0F, 2, 30}, - {0x18, 2, 30}, - {0x1F, 2, 30}, - {0x29, 2, 30}, - {0x38, 3, 30}, - {0x03, 2, 31}, - {0x06, 2, 31}, - {0x0A, 2, 31}, - {0x0F, 2, 31}, - {0x18, 2, 31}, - {0x1F, 2, 31}, - {0x29, 2, 31}, - {0x38, 3, 31}, + {0x03, 0x02, 0x1E}, + {0x06, 0x02, 0x1E}, + {0x0A, 0x02, 0x1E}, + {0x0F, 0x02, 0x1E}, + {0x18, 0x02, 0x1E}, + {0x1F, 0x02, 0x1E}, + {0x29, 0x02, 0x1E}, + {0x38, 0x03, 0x1E}, + {0x03, 0x02, 0x1F}, + {0x06, 0x02, 0x1F}, + {0x0A, 0x02, 0x1F}, + {0x0F, 0x02, 0x1F}, + {0x18, 0x02, 0x1F}, + {0x1F, 0x02, 0x1F}, + {0x29, 0x02, 0x1F}, + {0x38, 0x03, 0x1F}, }, /* 250 */ { - {0x02, 2, 127}, - {0x09, 2, 127}, - {0x17, 2, 127}, - {0x28, 3, 127}, - {0x02, 2, 220}, - {0x09, 2, 220}, - {0x17, 2, 220}, - {0x28, 3, 220}, - {0x02, 2, 249}, - {0x09, 2, 249}, - {0x17, 2, 249}, - {0x28, 3, 249}, - {0x00, 3, 10}, - {0x00, 3, 13}, - {0x00, 3, 22}, - {0x100, 0, 0}, + {0x02, 0x02, 0x7F}, + {0x09, 0x02, 0x7F}, + {0x17, 0x02, 0x7F}, + {0x28, 0x03, 0x7F}, + {0x02, 0x02, 0xDC}, + {0x09, 0x02, 0xDC}, + {0x17, 0x02, 0xDC}, + {0x28, 0x03, 0xDC}, + {0x02, 0x02, 0xF9}, + {0x09, 0x02, 0xF9}, + {0x17, 0x02, 0xF9}, + {0x28, 0x03, 0xF9}, + {0x00, 0x03, 0x0A}, + {0x00, 0x03, 0x0D}, + {0x00, 0x03, 0x16}, + {0x100, 0x00, 0x00}, }, /* 251 */ { - {0x03, 2, 127}, - {0x06, 2, 127}, - {0x0A, 2, 127}, - {0x0F, 2, 127}, - {0x18, 2, 127}, - {0x1F, 2, 127}, - {0x29, 2, 127}, - {0x38, 3, 127}, - {0x03, 2, 220}, - {0x06, 2, 220}, - {0x0A, 2, 220}, - {0x0F, 2, 220}, - {0x18, 2, 220}, - {0x1F, 2, 220}, - {0x29, 2, 220}, - {0x38, 3, 220}, + {0x03, 0x02, 0x7F}, + {0x06, 0x02, 0x7F}, + {0x0A, 0x02, 0x7F}, + {0x0F, 0x02, 0x7F}, + {0x18, 0x02, 0x7F}, + {0x1F, 0x02, 0x7F}, + {0x29, 0x02, 0x7F}, + {0x38, 0x03, 0x7F}, + {0x03, 0x02, 0xDC}, + {0x06, 0x02, 0xDC}, + {0x0A, 0x02, 0xDC}, + {0x0F, 0x02, 0xDC}, + {0x18, 0x02, 0xDC}, + {0x1F, 0x02, 0xDC}, + {0x29, 0x02, 0xDC}, + {0x38, 0x03, 0xDC}, }, /* 252 */ { - {0x03, 2, 249}, - {0x06, 2, 249}, - {0x0A, 2, 249}, - {0x0F, 2, 249}, - {0x18, 2, 249}, - {0x1F, 2, 249}, - {0x29, 2, 249}, - {0x38, 3, 249}, - {0x01, 2, 10}, - {0x16, 3, 10}, - {0x01, 2, 13}, - {0x16, 3, 13}, - {0x01, 2, 22}, - {0x16, 3, 22}, - {0x100, 0, 0}, - {0x100, 0, 0}, + {0x03, 0x02, 0xF9}, + {0x06, 0x02, 0xF9}, + {0x0A, 0x02, 0xF9}, + {0x0F, 0x02, 0xF9}, + {0x18, 0x02, 0xF9}, + {0x1F, 0x02, 0xF9}, + {0x29, 0x02, 0xF9}, + {0x38, 0x03, 0xF9}, + {0x01, 0x02, 0x0A}, + {0x16, 0x03, 0x0A}, + {0x01, 0x02, 0x0D}, + {0x16, 0x03, 0x0D}, + {0x01, 0x02, 0x16}, + {0x16, 0x03, 0x16}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, }, /* 253 */ { - {0x02, 2, 10}, - {0x09, 2, 10}, - {0x17, 2, 10}, - {0x28, 3, 10}, - {0x02, 2, 13}, - {0x09, 2, 13}, - {0x17, 2, 13}, - {0x28, 3, 13}, - {0x02, 2, 22}, - {0x09, 2, 22}, - {0x17, 2, 22}, - {0x28, 3, 22}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, + {0x02, 0x02, 0x0A}, + {0x09, 0x02, 0x0A}, + {0x17, 0x02, 0x0A}, + {0x28, 0x03, 0x0A}, + {0x02, 0x02, 0x0D}, + {0x09, 0x02, 0x0D}, + {0x17, 0x02, 0x0D}, + {0x28, 0x03, 0x0D}, + {0x02, 0x02, 0x16}, + {0x09, 0x02, 0x16}, + {0x17, 0x02, 0x16}, + {0x28, 0x03, 0x16}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, }, /* 254 */ { - {0x03, 2, 10}, - {0x06, 2, 10}, - {0x0A, 2, 10}, - {0x0F, 2, 10}, - {0x18, 2, 10}, - {0x1F, 2, 10}, - {0x29, 2, 10}, - {0x38, 3, 10}, - {0x03, 2, 13}, - {0x06, 2, 13}, - {0x0A, 2, 13}, - {0x0F, 2, 13}, - {0x18, 2, 13}, - {0x1F, 2, 13}, - {0x29, 2, 13}, - {0x38, 3, 13}, + {0x03, 0x02, 0x0A}, + {0x06, 0x02, 0x0A}, + {0x0A, 0x02, 0x0A}, + {0x0F, 0x02, 0x0A}, + {0x18, 0x02, 0x0A}, + {0x1F, 0x02, 0x0A}, + {0x29, 0x02, 0x0A}, + {0x38, 0x03, 0x0A}, + {0x03, 0x02, 0x0D}, + {0x06, 0x02, 0x0D}, + {0x0A, 0x02, 0x0D}, + {0x0F, 0x02, 0x0D}, + {0x18, 0x02, 0x0D}, + {0x1F, 0x02, 0x0D}, + {0x29, 0x02, 0x0D}, + {0x38, 0x03, 0x0D}, }, /* 255 */ { - {0x03, 2, 22}, - {0x06, 2, 22}, - {0x0A, 2, 22}, - {0x0F, 2, 22}, - {0x18, 2, 22}, - {0x1F, 2, 22}, - {0x29, 2, 22}, - {0x38, 3, 22}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, + {0x03, 0x02, 0x16}, + {0x06, 0x02, 0x16}, + {0x0A, 0x02, 0x16}, + {0x0F, 0x02, 0x16}, + {0x18, 0x02, 0x16}, + {0x1F, 0x02, 0x16}, + {0x29, 0x02, 0x16}, + {0x38, 0x03, 0x16}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, }, /* 256 */ { - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, }, }; diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_str.c b/deps/ngtcp2/nghttp3/lib/nghttp3_str.c index 4fcda6658f8b55..7564125cfdb3e8 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_str.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_str.c @@ -35,76 +35,76 @@ uint8_t *nghttp3_cpymem(uint8_t *dest, const uint8_t *src, size_t n) { } /* Generated by gendowncasetbl.py */ -static const uint8_t DOWNCASE_TBL[] = { - 0 /* NUL */, 1 /* SOH */, 2 /* STX */, 3 /* ETX */, - 4 /* EOT */, 5 /* ENQ */, 6 /* ACK */, 7 /* BEL */, - 8 /* BS */, 9 /* HT */, 10 /* LF */, 11 /* VT */, - 12 /* FF */, 13 /* CR */, 14 /* SO */, 15 /* SI */, - 16 /* DLE */, 17 /* DC1 */, 18 /* DC2 */, 19 /* DC3 */, - 20 /* DC4 */, 21 /* NAK */, 22 /* SYN */, 23 /* ETB */, - 24 /* CAN */, 25 /* EM */, 26 /* SUB */, 27 /* ESC */, - 28 /* FS */, 29 /* GS */, 30 /* RS */, 31 /* US */, - 32 /* SPC */, 33 /* ! */, 34 /* " */, 35 /* # */, - 36 /* $ */, 37 /* % */, 38 /* & */, 39 /* ' */, - 40 /* ( */, 41 /* ) */, 42 /* * */, 43 /* + */, - 44 /* , */, 45 /* - */, 46 /* . */, 47 /* / */, - 48 /* 0 */, 49 /* 1 */, 50 /* 2 */, 51 /* 3 */, - 52 /* 4 */, 53 /* 5 */, 54 /* 6 */, 55 /* 7 */, - 56 /* 8 */, 57 /* 9 */, 58 /* : */, 59 /* ; */, - 60 /* < */, 61 /* = */, 62 /* > */, 63 /* ? */, - 64 /* @ */, 97 /* A */, 98 /* B */, 99 /* C */, - 100 /* D */, 101 /* E */, 102 /* F */, 103 /* G */, - 104 /* H */, 105 /* I */, 106 /* J */, 107 /* K */, - 108 /* L */, 109 /* M */, 110 /* N */, 111 /* O */, - 112 /* P */, 113 /* Q */, 114 /* R */, 115 /* S */, - 116 /* T */, 117 /* U */, 118 /* V */, 119 /* W */, - 120 /* X */, 121 /* Y */, 122 /* Z */, 91 /* [ */, - 92 /* \ */, 93 /* ] */, 94 /* ^ */, 95 /* _ */, - 96 /* ` */, 97 /* a */, 98 /* b */, 99 /* c */, - 100 /* d */, 101 /* e */, 102 /* f */, 103 /* g */, - 104 /* h */, 105 /* i */, 106 /* j */, 107 /* k */, - 108 /* l */, 109 /* m */, 110 /* n */, 111 /* o */, - 112 /* p */, 113 /* q */, 114 /* r */, 115 /* s */, - 116 /* t */, 117 /* u */, 118 /* v */, 119 /* w */, - 120 /* x */, 121 /* y */, 122 /* z */, 123 /* { */, - 124 /* | */, 125 /* } */, 126 /* ~ */, 127 /* DEL */, - 128 /* 0x80 */, 129 /* 0x81 */, 130 /* 0x82 */, 131 /* 0x83 */, - 132 /* 0x84 */, 133 /* 0x85 */, 134 /* 0x86 */, 135 /* 0x87 */, - 136 /* 0x88 */, 137 /* 0x89 */, 138 /* 0x8A */, 139 /* 0x8B */, - 140 /* 0x8C */, 141 /* 0x8D */, 142 /* 0x8E */, 143 /* 0x8F */, - 144 /* 0x90 */, 145 /* 0x91 */, 146 /* 0x92 */, 147 /* 0x93 */, - 148 /* 0x94 */, 149 /* 0x95 */, 150 /* 0x96 */, 151 /* 0x97 */, - 152 /* 0x98 */, 153 /* 0x99 */, 154 /* 0x9A */, 155 /* 0x9B */, - 156 /* 0x9C */, 157 /* 0x9D */, 158 /* 0x9E */, 159 /* 0x9F */, - 160 /* 0xA0 */, 161 /* 0xA1 */, 162 /* 0xA2 */, 163 /* 0xA3 */, - 164 /* 0xA4 */, 165 /* 0xA5 */, 166 /* 0xA6 */, 167 /* 0xA7 */, - 168 /* 0xA8 */, 169 /* 0xA9 */, 170 /* 0xAA */, 171 /* 0xAB */, - 172 /* 0xAC */, 173 /* 0xAD */, 174 /* 0xAE */, 175 /* 0xAF */, - 176 /* 0xB0 */, 177 /* 0xB1 */, 178 /* 0xB2 */, 179 /* 0xB3 */, - 180 /* 0xB4 */, 181 /* 0xB5 */, 182 /* 0xB6 */, 183 /* 0xB7 */, - 184 /* 0xB8 */, 185 /* 0xB9 */, 186 /* 0xBA */, 187 /* 0xBB */, - 188 /* 0xBC */, 189 /* 0xBD */, 190 /* 0xBE */, 191 /* 0xBF */, - 192 /* 0xC0 */, 193 /* 0xC1 */, 194 /* 0xC2 */, 195 /* 0xC3 */, - 196 /* 0xC4 */, 197 /* 0xC5 */, 198 /* 0xC6 */, 199 /* 0xC7 */, - 200 /* 0xC8 */, 201 /* 0xC9 */, 202 /* 0xCA */, 203 /* 0xCB */, - 204 /* 0xCC */, 205 /* 0xCD */, 206 /* 0xCE */, 207 /* 0xCF */, - 208 /* 0xD0 */, 209 /* 0xD1 */, 210 /* 0xD2 */, 211 /* 0xD3 */, - 212 /* 0xD4 */, 213 /* 0xD5 */, 214 /* 0xD6 */, 215 /* 0xD7 */, - 216 /* 0xD8 */, 217 /* 0xD9 */, 218 /* 0xDA */, 219 /* 0xDB */, - 220 /* 0xDC */, 221 /* 0xDD */, 222 /* 0xDE */, 223 /* 0xDF */, - 224 /* 0xE0 */, 225 /* 0xE1 */, 226 /* 0xE2 */, 227 /* 0xE3 */, - 228 /* 0xE4 */, 229 /* 0xE5 */, 230 /* 0xE6 */, 231 /* 0xE7 */, - 232 /* 0xE8 */, 233 /* 0xE9 */, 234 /* 0xEA */, 235 /* 0xEB */, - 236 /* 0xEC */, 237 /* 0xED */, 238 /* 0xEE */, 239 /* 0xEF */, - 240 /* 0xF0 */, 241 /* 0xF1 */, 242 /* 0xF2 */, 243 /* 0xF3 */, - 244 /* 0xF4 */, 245 /* 0xF5 */, 246 /* 0xF6 */, 247 /* 0xF7 */, - 248 /* 0xF8 */, 249 /* 0xF9 */, 250 /* 0xFA */, 251 /* 0xFB */, - 252 /* 0xFC */, 253 /* 0xFD */, 254 /* 0xFE */, 255 /* 0xFF */, +const uint8_t nghttp3_downcase_tbl[] = { + 0x00 /* NUL */, 0x01 /* SOH */, 0x02 /* STX */, 0x03 /* ETX */, + 0x04 /* EOT */, 0x05 /* ENQ */, 0x06 /* ACK */, 0x07 /* BEL */, + 0x08 /* BS */, 0x09 /* HT */, 0x0A /* LF */, 0x0B /* VT */, + 0x0C /* FF */, 0x0D /* CR */, 0x0E /* SO */, 0x0F /* SI */, + 0x10 /* DLE */, 0x11 /* DC1 */, 0x12 /* DC2 */, 0x13 /* DC3 */, + 0x14 /* DC4 */, 0x15 /* NAK */, 0x16 /* SYN */, 0x17 /* ETB */, + 0x18 /* CAN */, 0x19 /* EM */, 0x1A /* SUB */, 0x1B /* ESC */, + 0x1C /* FS */, 0x1D /* GS */, 0x1E /* RS */, 0x1F /* US */, + 0x20 /* SPC */, 0x21 /* ! */, 0x22 /* " */, 0x23 /* # */, + 0x24 /* $ */, 0x25 /* % */, 0x26 /* & */, 0x27 /* ' */, + 0x28 /* ( */, 0x29 /* ) */, 0x2A /* * */, 0x2B /* + */, + 0x2C /* , */, 0x2D /* - */, 0x2E /* . */, 0x2F /* / */, + 0x30 /* 0 */, 0x31 /* 1 */, 0x32 /* 2 */, 0x33 /* 3 */, + 0x34 /* 4 */, 0x35 /* 5 */, 0x36 /* 6 */, 0x37 /* 7 */, + 0x38 /* 8 */, 0x39 /* 9 */, 0x3A /* : */, 0x3B /* ; */, + 0x3C /* < */, 0x3D /* = */, 0x3E /* > */, 0x3F /* ? */, + 0x40 /* @ */, 0x61 /* A */, 0x62 /* B */, 0x63 /* C */, + 0x64 /* D */, 0x65 /* E */, 0x66 /* F */, 0x67 /* G */, + 0x68 /* H */, 0x69 /* I */, 0x6A /* J */, 0x6B /* K */, + 0x6C /* L */, 0x6D /* M */, 0x6E /* N */, 0x6F /* O */, + 0x70 /* P */, 0x71 /* Q */, 0x72 /* R */, 0x73 /* S */, + 0x74 /* T */, 0x75 /* U */, 0x76 /* V */, 0x77 /* W */, + 0x78 /* X */, 0x79 /* Y */, 0x7A /* Z */, 0x5B /* [ */, + 0x5C /* \ */, 0x5D /* ] */, 0x5E /* ^ */, 0x5F /* _ */, + 0x60 /* ` */, 0x61 /* a */, 0x62 /* b */, 0x63 /* c */, + 0x64 /* d */, 0x65 /* e */, 0x66 /* f */, 0x67 /* g */, + 0x68 /* h */, 0x69 /* i */, 0x6A /* j */, 0x6B /* k */, + 0x6C /* l */, 0x6D /* m */, 0x6E /* n */, 0x6F /* o */, + 0x70 /* p */, 0x71 /* q */, 0x72 /* r */, 0x73 /* s */, + 0x74 /* t */, 0x75 /* u */, 0x76 /* v */, 0x77 /* w */, + 0x78 /* x */, 0x79 /* y */, 0x7A /* z */, 0x7B /* { */, + 0x7C /* | */, 0x7D /* } */, 0x7E /* ~ */, 0x7F /* DEL */, + 0x80 /* 0x80 */, 0x81 /* 0x81 */, 0x82 /* 0x82 */, 0x83 /* 0x83 */, + 0x84 /* 0x84 */, 0x85 /* 0x85 */, 0x86 /* 0x86 */, 0x87 /* 0x87 */, + 0x88 /* 0x88 */, 0x89 /* 0x89 */, 0x8A /* 0x8A */, 0x8B /* 0x8B */, + 0x8C /* 0x8C */, 0x8D /* 0x8D */, 0x8E /* 0x8E */, 0x8F /* 0x8F */, + 0x90 /* 0x90 */, 0x91 /* 0x91 */, 0x92 /* 0x92 */, 0x93 /* 0x93 */, + 0x94 /* 0x94 */, 0x95 /* 0x95 */, 0x96 /* 0x96 */, 0x97 /* 0x97 */, + 0x98 /* 0x98 */, 0x99 /* 0x99 */, 0x9A /* 0x9A */, 0x9B /* 0x9B */, + 0x9C /* 0x9C */, 0x9D /* 0x9D */, 0x9E /* 0x9E */, 0x9F /* 0x9F */, + 0xA0 /* 0xA0 */, 0xA1 /* 0xA1 */, 0xA2 /* 0xA2 */, 0xA3 /* 0xA3 */, + 0xA4 /* 0xA4 */, 0xA5 /* 0xA5 */, 0xA6 /* 0xA6 */, 0xA7 /* 0xA7 */, + 0xA8 /* 0xA8 */, 0xA9 /* 0xA9 */, 0xAA /* 0xAA */, 0xAB /* 0xAB */, + 0xAC /* 0xAC */, 0xAD /* 0xAD */, 0xAE /* 0xAE */, 0xAF /* 0xAF */, + 0xB0 /* 0xB0 */, 0xB1 /* 0xB1 */, 0xB2 /* 0xB2 */, 0xB3 /* 0xB3 */, + 0xB4 /* 0xB4 */, 0xB5 /* 0xB5 */, 0xB6 /* 0xB6 */, 0xB7 /* 0xB7 */, + 0xB8 /* 0xB8 */, 0xB9 /* 0xB9 */, 0xBA /* 0xBA */, 0xBB /* 0xBB */, + 0xBC /* 0xBC */, 0xBD /* 0xBD */, 0xBE /* 0xBE */, 0xBF /* 0xBF */, + 0xC0 /* 0xC0 */, 0xC1 /* 0xC1 */, 0xC2 /* 0xC2 */, 0xC3 /* 0xC3 */, + 0xC4 /* 0xC4 */, 0xC5 /* 0xC5 */, 0xC6 /* 0xC6 */, 0xC7 /* 0xC7 */, + 0xC8 /* 0xC8 */, 0xC9 /* 0xC9 */, 0xCA /* 0xCA */, 0xCB /* 0xCB */, + 0xCC /* 0xCC */, 0xCD /* 0xCD */, 0xCE /* 0xCE */, 0xCF /* 0xCF */, + 0xD0 /* 0xD0 */, 0xD1 /* 0xD1 */, 0xD2 /* 0xD2 */, 0xD3 /* 0xD3 */, + 0xD4 /* 0xD4 */, 0xD5 /* 0xD5 */, 0xD6 /* 0xD6 */, 0xD7 /* 0xD7 */, + 0xD8 /* 0xD8 */, 0xD9 /* 0xD9 */, 0xDA /* 0xDA */, 0xDB /* 0xDB */, + 0xDC /* 0xDC */, 0xDD /* 0xDD */, 0xDE /* 0xDE */, 0xDF /* 0xDF */, + 0xE0 /* 0xE0 */, 0xE1 /* 0xE1 */, 0xE2 /* 0xE2 */, 0xE3 /* 0xE3 */, + 0xE4 /* 0xE4 */, 0xE5 /* 0xE5 */, 0xE6 /* 0xE6 */, 0xE7 /* 0xE7 */, + 0xE8 /* 0xE8 */, 0xE9 /* 0xE9 */, 0xEA /* 0xEA */, 0xEB /* 0xEB */, + 0xEC /* 0xEC */, 0xED /* 0xED */, 0xEE /* 0xEE */, 0xEF /* 0xEF */, + 0xF0 /* 0xF0 */, 0xF1 /* 0xF1 */, 0xF2 /* 0xF2 */, 0xF3 /* 0xF3 */, + 0xF4 /* 0xF4 */, 0xF5 /* 0xF5 */, 0xF6 /* 0xF6 */, 0xF7 /* 0xF7 */, + 0xF8 /* 0xF8 */, 0xF9 /* 0xF9 */, 0xFA /* 0xFA */, 0xFB /* 0xFB */, + 0xFC /* 0xFC */, 0xFD /* 0xFD */, 0xFE /* 0xFE */, 0xFF /* 0xFF */, }; void nghttp3_downcase(uint8_t *s, size_t len) { size_t i; for (i = 0; i < len; ++i) { - s[i] = DOWNCASE_TBL[s[i]]; + s[i] = nghttp3_downcase_byte(s[i]); } } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_str.h b/deps/ngtcp2/nghttp3/lib/nghttp3_str.h index 280749a3a9a3d9..ee0562f26a3b0d 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_str.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_str.h @@ -37,4 +37,14 @@ uint8_t *nghttp3_cpymem(uint8_t *dest, const uint8_t *src, size_t n); void nghttp3_downcase(uint8_t *s, size_t len); +extern const uint8_t nghttp3_downcase_tbl[]; + +/* + * nghttp3_downcase_byte returns the lower case version of |c| if 'A' + * <= |c| && |c| <= 'Z'. Otherwise, it returns |c|. + */ +static inline uint8_t nghttp3_downcase_byte(uint8_t c) { + return nghttp3_downcase_tbl[c]; +} + #endif /* !defined(NGHTTP3_STR_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_stream.c b/deps/ngtcp2/nghttp3/lib/nghttp3_stream.c index 76db6fe303da6c..8acf0da817b54a 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_stream.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_stream.c @@ -36,6 +36,7 @@ #include "nghttp3_http.h" #include "nghttp3_vec.h" #include "nghttp3_unreachable.h" +#include "nghttp3_wt.h" /* NGHTTP3_STREAM_MAX_COPY_THRES is the maximum size of buffer which makes a copy to outq. */ @@ -168,6 +169,10 @@ void nghttp3_stream_del(nghttp3_stream *stream) { delete_frq(&stream->frq, stream->mem); nghttp3_tnode_free(&stream->node); + if (nghttp3_stream_wt_ctrl(stream)) { + nghttp3_wt_session_del(stream->wt.session, stream->mem); + } + nghttp3_objalloc_stream_release(stream->stream_objalloc, stream); } @@ -295,6 +300,47 @@ int nghttp3_stream_fill_outq(nghttp3_stream *stream) { return rv; } + break; + case NGHTTP3_FRAME_EX_WT: + switch (fr->wt.fr.hd.type) { + case NGHTTP3_EXFR_WT_STREAM_BIDI: + case NGHTTP3_EXFR_WT_STREAM_UNI: + rv = nghttp3_stream_write_wt_stream(stream, &fr->wt.fr.wt_stream); + if (rv != 0) { + return rv; + } + + fr->wt.fr.wt_stream.type = NGHTTP3_EXFR_WT_STREAM_DATA; + + /* fall through */ + case NGHTTP3_EXFR_WT_STREAM_DATA: + rv = nghttp3_stream_write_wt_stream_data(stream, &data_eof, + &fr->wt.fr.wt_stream); + if (rv != 0) { + return rv; + } + + if ((stream->flags & NGHTTP3_STREAM_FLAG_READ_DATA_BLOCKED) || + !data_eof) { + return 0; + } + + break; + } + + break; + case NGHTTP3_FRAME_EX_CPSL: + switch (fr->cpsl.fr.hd.type) { + case NGHTTP3_EXFR_CPSL_WT_CLOSE_SESSION: + rv = nghttp3_stream_write_cpsl_wt_close_session( + stream, &fr->cpsl.fr.wt_close_session); + if (rv != 0) { + return rv; + } + + break; + } + break; default: /* TODO Not implemented */ @@ -373,6 +419,31 @@ int nghttp3_stream_write_settings(nghttp3_stream *stream, ++fr.niv; } + if (local_settings->wt_enabled) { + /* For client, only draft version sends SETTINGS_WT_ENABLED. */ + ents[fr.niv++] = (nghttp3_settings_entry){ + .id = NGHTTP3_SETTINGS_ID_WT_ENABLED, + .value = 1, + }; + + /* compat for pre draft-15 */ + ents[fr.niv++] = (nghttp3_settings_entry){ + .id = NGHTTP3_SETTINGS_ID_WT_MAX_SESSIONS, + .value = 1, + }; + + ents[fr.niv++] = (nghttp3_settings_entry){ + .id = NGHTTP3_SETTINGS_ID_WT_MAX_SESSIONS_DRAFT7, + .value = 1, + }; + + /* compat for ancient draft */ + ents[fr.niv++] = (nghttp3_settings_entry){ + .id = NGHTTP3_SETTINGS_ID_ENABLE_WEBTRANSPORT_DRAFT2, + .value = 1, + }; + } + len = nghttp3_frame_write_settings_len(&payloadlen, &fr); rv = nghttp3_stream_ensure_chunk(stream, len); @@ -479,6 +550,150 @@ int nghttp3_stream_write_origin(nghttp3_stream *stream, return nghttp3_stream_outq_add(stream, &tbuf); } +int nghttp3_stream_write_wt_stream(nghttp3_stream *stream, + const nghttp3_exfr_wt_stream *fr) { + size_t len; + int rv; + nghttp3_buf *chunk; + nghttp3_typed_buf tbuf; + + len = nghttp3_frame_write_wt_stream_len(fr); + + rv = nghttp3_stream_ensure_chunk(stream, len); + if (rv != 0) { + return rv; + } + + chunk = nghttp3_stream_get_chunk(stream); + nghttp3_typed_buf_shared_init(&tbuf, chunk); + + chunk->last = nghttp3_frame_write_wt_stream(chunk->last, fr); + + tbuf.buf.last = chunk->last; + + return nghttp3_stream_outq_add(stream, &tbuf); +} + +int nghttp3_stream_write_wt_stream_data(nghttp3_stream *stream, int *peof, + const nghttp3_exfr_wt_stream *fr) { + int rv; + nghttp3_typed_buf tbuf; + nghttp3_buf buf; + nghttp3_read_data_callback read_data = fr->dr.read_data; + nghttp3_conn *conn = stream->conn; + uint64_t datalen; + uint32_t flags = 0; + nghttp3_vec vec[8]; + nghttp3_vec *v; + nghttp3_ssize sveccnt; + size_t i; + + assert(!(stream->flags & NGHTTP3_STREAM_FLAG_READ_DATA_BLOCKED)); + assert(read_data); + assert(conn); + + *peof = 0; + + sveccnt = read_data(conn, stream->node.id, vec, nghttp3_arraylen(vec), &flags, + conn->user_data, stream->user_data); + if (sveccnt < 0) { + if (sveccnt == NGHTTP3_ERR_WOULDBLOCK) { + stream->flags |= NGHTTP3_STREAM_FLAG_READ_DATA_BLOCKED; + return 0; + } + return NGHTTP3_ERR_CALLBACK_FAILURE; + } + + rv = nghttp3_vec_len_uvarint(&datalen, vec, (size_t)sveccnt); + if (rv != 0) { + return NGHTTP3_ERR_STREAM_DATA_OVERFLOW; + } + + assert(datalen || flags & NGHTTP3_DATA_FLAG_EOF); + + if (flags & NGHTTP3_DATA_FLAG_EOF) { + *peof = 1; + + stream->flags |= NGHTTP3_STREAM_FLAG_WRITE_END_STREAM; + if (datalen == 0) { + if (nghttp3_stream_outq_write_done(stream)) { + /* If this is the last data and its is 0 length, we don't need + send data. We rely on the non-emptiness of outq to + schedule stream, so add empty tbuf to outq to just send + fin. */ + nghttp3_buf_init(&buf); + nghttp3_typed_buf_init(&tbuf, &buf, NGHTTP3_BUF_TYPE_PRIVATE); + return nghttp3_stream_outq_add(stream, &tbuf); + } + + /* We are going to send data, but nothing to send this time. */ + + return 0; + } + } + + assert(datalen); + + for (i = 0; i < (size_t)sveccnt; ++i) { + v = &vec[i]; + if (v->len == 0) { + continue; + } + nghttp3_buf_wrap_init(&buf, v->base, v->len); + buf.last = buf.end; + nghttp3_typed_buf_init(&tbuf, &buf, NGHTTP3_BUF_TYPE_ALIEN); + rv = nghttp3_stream_outq_add(stream, &tbuf); + if (rv != 0) { + return rv; + } + } + + return 0; +} + +int nghttp3_stream_write_cpsl_wt_close_session( + nghttp3_stream *stream, const nghttp3_exfr_cpsl_wt_close_session *fr) { + int rv; + nghttp3_buf *chunk; + nghttp3_buf buf; + nghttp3_typed_buf tbuf; + size_t cpsl_payloadlen = sizeof(fr->error_code) + fr->error_msg.len; + size_t fr_hdlen = nghttp3_frame_write_hd_len(fr->type, cpsl_payloadlen); + uint64_t payloadlen = fr_hdlen + cpsl_payloadlen; + + rv = nghttp3_stream_ensure_chunk( + stream, nghttp3_frame_write_hd_len(NGHTTP3_FRAME_DATA, payloadlen) + + fr_hdlen + sizeof(fr->error_code)); + if (rv != 0) { + return rv; + } + + chunk = nghttp3_stream_get_chunk(stream); + nghttp3_typed_buf_shared_init(&tbuf, chunk); + + chunk->last = + nghttp3_frame_write_hd(chunk->last, NGHTTP3_FRAME_DATA, payloadlen); + chunk->last = nghttp3_frame_write_hd(chunk->last, fr->type, cpsl_payloadlen); + chunk->last = nghttp3_put_uint32be(chunk->last, fr->error_code); + + tbuf.buf.last = chunk->last; + + rv = nghttp3_stream_outq_add(stream, &tbuf); + if (rv != 0) { + return rv; + } + + if (fr->error_msg.len == 0) { + return 0; + } + + nghttp3_buf_wrap_init(&buf, fr->error_msg.base, fr->error_msg.len); + buf.last = buf.end; + nghttp3_typed_buf_init(&tbuf, &buf, NGHTTP3_BUF_TYPE_ALIEN_NO_ACK); + + return nghttp3_stream_outq_add(stream, &tbuf); +} + int nghttp3_stream_write_headers(nghttp3_stream *stream, const nghttp3_frame_headers *fr) { nghttp3_conn *conn = stream->conn; @@ -849,6 +1064,11 @@ int nghttp3_stream_require_schedule(const nghttp3_stream *stream) { !(stream->flags & NGHTTP3_STREAM_FLAG_READ_DATA_BLOCKED)); } +int nghttp3_stream_schedulable(const nghttp3_stream *stream) { + return !nghttp3_stream_uni(stream->node.id) || + stream->type == NGHTTP3_STREAM_TYPE_WT_STREAM; +} + size_t nghttp3_stream_writev(nghttp3_stream *stream, int *pfin, nghttp3_vec *vec, size_t veccnt) { nghttp3_ringbuf *outq = &stream->outq; @@ -1236,8 +1456,25 @@ int nghttp3_stream_empty_headers_allowed(const nghttp3_stream *stream) { } } +int nghttp3_stream_critical(const nghttp3_stream *stream) { + return nghttp3_stream_uni(stream->node.id) && + (stream->type == NGHTTP3_STREAM_TYPE_CONTROL || + stream->type == NGHTTP3_STREAM_TYPE_QPACK_ENCODER || + stream->type == NGHTTP3_STREAM_TYPE_QPACK_DECODER); +} + int nghttp3_stream_uni(int64_t stream_id) { return (stream_id & 0x2) != 0; } +int nghttp3_stream_wt_ctrl(const nghttp3_stream *stream) { + return stream->wt.session && + stream->wt.session->session_id == stream->node.id; +} + +int nghttp3_stream_wt_data(const nghttp3_stream *stream) { + return stream->wt.session && + stream->wt.session->session_id != stream->node.id; +} + int nghttp3_client_stream_bidi(int64_t stream_id) { return (stream_id & 0x3) == 0; } @@ -1249,3 +1486,7 @@ int nghttp3_client_stream_uni(int64_t stream_id) { int nghttp3_server_stream_uni(int64_t stream_id) { return (stream_id & 0x3) == 0x3; } + +int nghttp3_server_stream_bidi(int64_t stream_id) { + return (stream_id & 0x3) == 0x1; +} diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_stream.h b/deps/ngtcp2/nghttp3/lib/nghttp3_stream.h index 61a1f085ac8709..59ff74866267ef 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_stream.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_stream.h @@ -56,6 +56,7 @@ typedef uint64_t nghttp3_stream_type; #define NGHTTP3_STREAM_TYPE_PUSH 0x01U #define NGHTTP3_STREAM_TYPE_QPACK_ENCODER 0x02U #define NGHTTP3_STREAM_TYPE_QPACK_DECODER 0x03U +#define NGHTTP3_STREAM_TYPE_WT_STREAM 0x54U #define NGHTTP3_STREAM_TYPE_UNKNOWN UINT64_MAX typedef enum nghttp3_ctrl_stream_state { @@ -78,10 +79,19 @@ typedef enum nghttp3_req_stream_state { NGHTTP3_REQ_STREAM_STATE_FRAME_LENGTH, NGHTTP3_REQ_STREAM_STATE_DATA, NGHTTP3_REQ_STREAM_STATE_HEADERS, + NGHTTP3_REQ_STREAM_STATE_BEFORE_WT_DATA, + NGHTTP3_REQ_STREAM_STATE_WT_DATA, NGHTTP3_REQ_STREAM_STATE_IGN_FRAME, NGHTTP3_REQ_STREAM_STATE_IGN_REST, } nghttp3_req_stream_state; +/* stream state for WebTransport unidirectional data stream */ +typedef enum nghttp3_wt_stream_state { + NGHTTP3_WT_STREAM_STATE_SESSION_ID, + NGHTTP3_WT_STREAM_STATE_DATA, + NGHTTP3_WT_STREAM_STATE_IGN_REST, +} nghttp3_wt_stream_state; + typedef struct nghttp3_varint_read_state { uint64_t acc; size_t left; @@ -95,6 +105,8 @@ typedef struct nghttp3_stream_read_state { int state; } nghttp3_stream_read_state; +typedef struct nghttp3_wt_session nghttp3_wt_session; + /* NGHTTP3_STREAM_FLAG_NONE indicates that no flag is set. */ #define NGHTTP3_STREAM_FLAG_NONE 0x0000U /* NGHTTP3_STREAM_FLAG_TYPE_IDENTIFIED is set when a unidirectional @@ -128,6 +140,18 @@ typedef struct nghttp3_stream_read_state { /* NGHTTP3_STREAM_FLAG_PRIORITY_UPDATE_RECVED indicates that server received PRIORITY_UPDATE frame for this stream. */ #define NGHTTP3_STREAM_FLAG_PRIORITY_UPDATE_RECVED 0x0800U +/* NGHTTP3_STREAM_FLAG_MAYBE_WT_DATA indicates that the stream may be + WebTransport data stream. */ +#define NGHTTP3_STREAM_FLAG_MAYBE_WT_DATA 0x1000U +/* NGHTTP3_STREAM_FLAG_WT_DATA indicates that the stream is + WebTransport data stream. */ +#define NGHTTP3_STREAM_FLAG_WT_DATA 0x2000U +/* NGHTTP3_STREAM_FLAG_WT_SESSION_BLOCKED indicates that the stream is + blocked because WebTransport session has not been established. */ +#define NGHTTP3_STREAM_FLAG_WT_SESSION_BLOCKED 0x4000U +/* NGHTTP3_STREAM_FLAG_RESP_SUBMITTED indicates that HTTP/3 response + has been submitted via nghttp3_conn_submit_response. */ +#define NGHTTP3_STREAM_FLAG_RESP_SUBMITTED 0x8000U typedef enum nghttp3_stream_http_state { NGHTTP3_HTTP_STATE_NONE, @@ -237,6 +261,12 @@ struct nghttp3_stream { nghttp3_http_state http; } rx; + struct { + nghttp3_wt_session *session; + nghttp3_stream *prev; + nghttp3_stream *next; + } wt; + uint16_t flags; }; @@ -312,6 +342,15 @@ int nghttp3_stream_write_priority_update( int nghttp3_stream_write_origin(nghttp3_stream *stream, const nghttp3_frame_origin *fr); +int nghttp3_stream_write_wt_stream(nghttp3_stream *stream, + const nghttp3_exfr_wt_stream *fr); + +int nghttp3_stream_write_wt_stream_data(nghttp3_stream *stream, int *peof, + const nghttp3_exfr_wt_stream *fr); + +int nghttp3_stream_write_cpsl_wt_close_session( + nghttp3_stream *stream, const nghttp3_exfr_cpsl_wt_close_session *frent); + int nghttp3_stream_ensure_chunk(nghttp3_stream *stream, size_t need); nghttp3_buf *nghttp3_stream_get_chunk(nghttp3_stream *stream); @@ -346,6 +385,8 @@ int nghttp3_stream_is_active(nghttp3_stream *stream); */ int nghttp3_stream_require_schedule(const nghttp3_stream *stream); +int nghttp3_stream_schedulable(const nghttp3_stream *stream); + int nghttp3_stream_buffer_data(nghttp3_stream *stream, const uint8_t *src, size_t srclen); @@ -360,6 +401,12 @@ int nghttp3_stream_transit_rx_http_state(nghttp3_stream *stream, int nghttp3_stream_empty_headers_allowed(const nghttp3_stream *stream); +int nghttp3_stream_wt_ctrl(const nghttp3_stream *stream); + +int nghttp3_stream_wt_data(const nghttp3_stream *stream); + +int nghttp3_stream_critical(const nghttp3_stream *stream); + /* * nghttp3_stream_uni returns nonzero if stream identified by * |stream_id| is unidirectional. @@ -384,4 +431,6 @@ int nghttp3_client_stream_uni(int64_t stream_id); */ int nghttp3_server_stream_uni(int64_t stream_id); +int nghttp3_server_stream_bidi(int64_t stream_id); + #endif /* !defined(NGHTTP3_STREAM_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_wt.c b/deps/ngtcp2/nghttp3/lib/nghttp3_wt.c new file mode 100644 index 00000000000000..df2d1614e48643 --- /dev/null +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_wt.c @@ -0,0 +1,93 @@ +/* + * nghttp3 + * + * Copyright (c) 2025 nghttp3 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "nghttp3_wt.h" + +#include + +#include "nghttp3_mem.h" + +int nghttp3_wt_session_new(nghttp3_wt_session **pwts, int64_t session_id, + const nghttp3_mem *mem) { + *pwts = nghttp3_mem_calloc(mem, 1, sizeof(**pwts)); + if (*pwts == NULL) { + return NGHTTP3_ERR_NOMEM; + } + + (*pwts)->session_id = session_id; + + return 0; +} + +void nghttp3_wt_session_del(nghttp3_wt_session *wts, const nghttp3_mem *mem) { + if (!wts) { + return; + } + + nghttp3_mem_free(mem, wts->rx.error_msg.base); + nghttp3_mem_free(mem, wts->tx.error_msg.base); + + nghttp3_mem_free(mem, wts); +} + +void nghttp3_wt_session_add_stream(nghttp3_wt_session *wts, + nghttp3_stream *stream) { + assert(!stream->wt.session); + assert(!stream->wt.prev); + assert(!stream->wt.next); + + stream->wt.session = wts; + stream->flags |= NGHTTP3_STREAM_FLAG_WT_DATA; + + if (wts->head) { + stream->wt.next = wts->head; + wts->head->wt.prev = stream; + } + + wts->head = stream; +} + +void nghttp3_wt_session_remove_stream(nghttp3_wt_session *wts, + nghttp3_stream *stream) { + assert(stream->wt.session); + + if (stream->wt.prev) { + stream->wt.prev->wt.next = stream->wt.next; + } + + if (stream->wt.next) { + stream->wt.next->wt.prev = stream->wt.prev; + } + + if (wts->head == stream) { + wts->head = stream->wt.next; + } + + stream->wt.session = NULL; + stream->wt.prev = stream->wt.next = NULL; +} + +void nghttp3_wt_ctrl_read_state_reset(nghttp3_wt_ctrl_read_state *rstate) { + *rstate = (nghttp3_wt_ctrl_read_state){0}; +} diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_wt.h b/deps/ngtcp2/nghttp3/lib/nghttp3_wt.h new file mode 100644 index 00000000000000..eb4b2df13fc823 --- /dev/null +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_wt.h @@ -0,0 +1,86 @@ +/* + * nghttp3 + * + * Copyright (c) 2025 nghttp3 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef NGHTTP3_WT_H +#define NGHTTP3_WT_H + +#ifdef HAVE_CONFIG_H +# include +#endif /* defined(HAVE_CONFIG_H) */ + +#include + +#include "nghttp3_stream.h" + +/* NGHTTP3_WT_SESSION_FLAG_CONFIRMED indicates that WebTransport + session has been established. */ +#define NGHTTP3_WT_SESSION_FLAG_CONFIRMED 0x1 +/* NGHTTP3_WT_SESSION_FLAG_RESP_SUBMITTED indicates that HTTP/3 + response has been submitted via nghttp3_conn_submit_wt_response. */ +#define NGHTTP3_WT_SESSION_FLAG_RESP_SUBMITTED 0x2 + +typedef enum nghttp3_wt_ctrl_stream_state { + NGHTTP3_WT_CTRL_STREAM_STATE_TYPE, + NGHTTP3_WT_CTRL_STREAM_STATE_LENGTH, + NGHTTP3_WT_CTRL_STREAM_STATE_WT_CLOSE_SESSION_ERROR_CODE, + NGHTTP3_WT_CTRL_STREAM_STATE_WT_CLOSE_SESSION_ERROR_MSG, + NGHTTP3_WT_CTRL_STREAM_STATE_IGN, +} nghttp3_wt_ctrl_stream_state; + +typedef struct nghttp3_wt_ctrl_read_state { + nghttp3_varint_read_state rvint; + nghttp3_exfr_cpsl cpsl; + uint64_t left; + size_t field_left; + int state; +} nghttp3_wt_ctrl_read_state; + +typedef struct nghttp3_wt_session { + nghttp3_wt_ctrl_read_state rstate; + struct { + nghttp3_vec error_msg; + } tx; + struct { + nghttp3_vec error_msg; + uint32_t error_code; + } rx; + int64_t session_id; + nghttp3_stream *head; + uint32_t flags; +} nghttp3_wt_session; + +void nghttp3_wt_session_add_stream(nghttp3_wt_session *wts, + nghttp3_stream *stream); + +void nghttp3_wt_session_remove_stream(nghttp3_wt_session *wts, + nghttp3_stream *stream); + +int nghttp3_wt_session_new(nghttp3_wt_session **pwts, int64_t stream_id, + const nghttp3_mem *mem); + +void nghttp3_wt_session_del(nghttp3_wt_session *wts, const nghttp3_mem *mem); + +void nghttp3_wt_ctrl_read_state_reset(nghttp3_wt_ctrl_read_state *rstate); + +#endif /* !defined(NGHTTP3_WT_H) */ diff --git a/deps/ngtcp2/ngtcp2.gyp b/deps/ngtcp2/ngtcp2.gyp index dd0a64d5852b1b..043b6e442fcf64 100644 --- a/deps/ngtcp2/ngtcp2.gyp +++ b/deps/ngtcp2/ngtcp2.gyp @@ -90,6 +90,7 @@ 'nghttp3/lib/nghttp3_unreachable.c', 'nghttp3/lib/nghttp3_vec.c', 'nghttp3/lib/nghttp3_version.c', + 'nghttp3/lib/nghttp3_wt.c', ], 'ngtcp2_test_server_sources': [ 'ngtcp2/examples/tls_server_session_ossl.cc', diff --git a/lib/internal/blob.js b/lib/internal/blob.js index 20f7078d1d0915..8ad349d9407ff8 100644 --- a/lib/internal/blob.js +++ b/lib/internal/blob.js @@ -455,9 +455,15 @@ function createBlobReaderStream(reader) { this.pendingPulls = []; // Register a wakeup callback that the C++ side can invoke // when new data is available after a STATUS_BLOCK. + let immediate; reader.setWakeup(() => { - if (this.pendingPulls.length > 0) { - this.readNext(c); + if (this.pendingPulls.length > 0 && + typeof immediate === 'undefined') { + // Postpone the execution to the next steps of the event loop + immediate = setImmediate(() => { + immediate = undefined; + this.readNext(c); + }); } }); }, @@ -544,7 +550,16 @@ const kMaxBatchChunks = 16; async function* createBlobReaderIterable(reader, options = kEmptyObject) { const { getReadError } = options; let wakeup = PromiseWithResolvers(); - reader.setWakeup(wakeup.resolve); + let immediate; + reader.setWakeup(() => { + if (typeof immediate === 'undefined') { + // Postpone the execution to the next steps of the event loop + immediate = setImmediate(() => { + immediate = undefined; + wakeup.resolve?.(); + }); + } + }); try { while (true) { @@ -591,7 +606,6 @@ async function* createBlobReaderIterable(reader, options = kEmptyObject) { if (blocked) { const fin = await wakeup.promise; wakeup = PromiseWithResolvers(); - reader.setWakeup(wakeup.resolve); // If the wakeup was triggered by FIN (EndReadable), the DataQueue // is capped. Continue the loop to pull again -- the next pull will // return EOS. Without this, a race between the data notification diff --git a/lib/internal/quic/diagnostics.js b/lib/internal/quic/diagnostics.js index 7180f719bc09d3..f21a61f44c92c6 100644 --- a/lib/internal/quic/diagnostics.js +++ b/lib/internal/quic/diagnostics.js @@ -33,6 +33,8 @@ const onSessionGoawayChannel = dc.channel('quic.session.goaway'); const onSessionEarlyRejectedChannel = dc.channel('quic.session.early.rejected'); const onStreamClosedChannel = dc.channel('quic.stream.closed'); const onStreamHeadersChannel = dc.channel('quic.stream.headers'); +const onStreamSessionIdChannel = dc.channel('quic.stream.sessionid'); +const onStreamWTSessionCloseChannel = dc.channel('quic.stream.wtsessionclose') const onStreamTrailersChannel = dc.channel('quic.stream.trailers'); const onStreamInfoChannel = dc.channel('quic.stream.info'); const onStreamResetChannel = dc.channel('quic.stream.reset'); @@ -68,6 +70,8 @@ module.exports = { onSessionEarlyRejectedChannel, onStreamClosedChannel, onStreamHeadersChannel, + onStreamSessionIdChannel, + onStreamWTSessionCloseChannel, onStreamTrailersChannel, onStreamInfoChannel, onStreamResetChannel, diff --git a/lib/internal/quic/quic.js b/lib/internal/quic/quic.js index 99eeccc3c51d23..c6254f842fa0d7 100644 --- a/lib/internal/quic/quic.js +++ b/lib/internal/quic/quic.js @@ -76,6 +76,7 @@ const { QUIC_STREAM_HEADERS_KIND_TRAILING: kHeadersKindTrailing, QUIC_STREAM_HEADERS_FLAGS_NONE: kHeadersFlagsNone, QUIC_STREAM_HEADERS_FLAGS_TERMINAL: kHeadersFlagsTerminal, + QUIC_STREAM_HEADERS_FLAGS_WEBTRANSPORT: kHeadersFlagsWebtransport, } = internalBinding('quic'); // Maps the numeric HeadersKind constants from C++ to user-facing strings. @@ -193,6 +194,8 @@ const { kHandshakeCompleted, kVerifyPeer, kHeaders, + kSessionId, + kWTSessionClose, kOwner, kRemoveSession, kKeylog, @@ -208,6 +211,7 @@ const { kPrivateConstructor, kReset, kSendHeaders, + kMakeWebtransportStream, kSessionApplication, kSessionTicket, kTrailers, @@ -266,6 +270,8 @@ const { onSessionEarlyRejectedChannel, onStreamClosedChannel, onStreamHeadersChannel, + onStreamSessionIdChannel, + onStreamWTSessionCloseChannel, onStreamTrailersChannel, onStreamInfoChannel, onStreamResetChannel, @@ -291,7 +297,9 @@ const endpointRegistry = new SafeSet(); * @property {string|ArrayBuffer|SharedArrayBuffer|ArrayBufferView|Blob| * FileHandle|AsyncIterable|Iterable|Promise|null} [body] The outbound * body source. See the public docs for `stream.setBody()` for details - * on supported types. When omitted, the stream is closed immediately. + * on supported types. When omitted, the stream is closed immediately, + * except if the stream is a webtransport stream. For a webtransport + * stream setting body is illegal. * @property {object} [headers] Initial request or response headers to * send. Only used when the negotiated application supports headers * (e.g. HTTP/3). @@ -299,7 +307,12 @@ const endpointRegistry = new SafeSet(); * @property {boolean} [incremental] Whether to interleave data with same-priority streams. * @property {number} [highWaterMark] The high water mark for write * backpressure, in bytes. **Default:** `65536`. + * @property {QuicStream} [webtransportSession] The webtransport session control stream. + * @property {boolean} [webtransport] Indicates that the headers to send signal + * webtransport support. If no headers are provided, it has no effect. * @property {OnHeadersCallback} [onheaders] Callback for incoming initial headers + * @property {OnSessionIdCallback} [onsessionid] Callback for incoming sessionid + * @property {OnWTSessionCloseCallback} [onwtsessionclose] Callback for incoming close capsules * @property {OnTrailersCallback} [ontrailers] Callback for incoming trailing headers * @property {OnInfoCallback} [oninfo] Callback for informational (1xx) headers * @property {OnWantTrailersCallback} [onwanttrailers] Callback fired when the @@ -369,6 +382,7 @@ const endpointRegistry = new SafeSet(); * @property {bigint|number} [qpackBlockedStreams] The qpack blocked streams * @property {boolean} [enableConnectProtocol] Enable the connect protocol * @property {boolean} [enableDatagrams] Enable datagrams + * @property {boolean} [enableWebtransport] Enable webtransport */ /** @@ -461,6 +475,8 @@ const endpointRegistry = new SafeSet(); * @property {OnQlogCallback} [onqlog] qlog data callback. * @property {OnApplicationCallback} [onapplication] application options callback. * @property {OnHeadersCallback} [onheaders] Default per-stream initial-headers callback. + * @property {OnSessionIdCallback} [onsessionid] Default perstream initial callback for incoming sessionid. + * @property {OnWTSessionCloseCallback} [onwtsessionclose] Default perstream initial callback for incoming close capsules * @property {OnTrailersCallback} [ontrailers] Default per-stream trailing-headers callback. * @property {OnInfoCallback} [oninfo] Default per-stream informational-headers callback. * @property {OnWantTrailersCallback} [onwanttrailers] Default per-stream @@ -508,6 +524,10 @@ const endpointRegistry = new SafeSet(); * @typedef {object} SendHeadersOptions * @property {boolean} [terminal] When true, indicates that no body data will be * sent after these headers. + * @property {boolean} [webtransport] When true, indicates that this is a header + * for a webtransport connection. Note, on the response, if you deny a + * webtransport connection, set it to false. A webtransport header can not be + * terminal. So we throw an error, if webtransport and terminal are both true. */ /** @@ -704,6 +724,26 @@ const endpointRegistry = new SafeSet(); * @returns {void} */ +/** + * Called when session id (e.g. for Webtransport streams) is determined + * @callback OnSessionIdCallback + * @this {QuicStream} + * @param {bigint|undefined} sessionid Id of the session stream or undefined + * if no session stream is determined. + * @returns {void} + */ + +/** + * Called when session id (e.g. for Webtransport streams) is determined + * @callback OnWTSessionCloseCallback + * @this {QuicStream} + * @param {number} error code from the webtransport session + * @param {string|undefined} error message from the webtransport session + * @returns {void} + */ + + + /** * Called when trailing headers are received from the peer. * @callback OnTrailersCallback @@ -992,6 +1032,18 @@ setCallbacks({ this[kOwner][kHeaders](headers, kind); }, + onStreamSessionId(sessionId) { + // Called when the stream C++ handle has determined the sessionId + debug(`stream ${this[kOwner].id} sessionid callback`, sessionId); + this[kOwner][kSessionId](sessionId); + }, + + onStreamWTSessionClose(errorcode, errormessage) { + // Called when the stream C++ handle has received a close capsule + debug(`stream ${this[kOwner].id} wtsessionclose callback`, errorcode, errormessage); + this[kOwner][kWTSessionClose](errorcode, errormessage); + }, + onStreamTrailers() { // Called when the stream C++ handle is ready to receive trailing headers. debug('stream want trailers callback', this[kOwner]); @@ -1313,6 +1365,8 @@ function applyCallbacks(session, cbs) { onwanttrailers: cbs.onwanttrailers, }; } + if (cbs.onsessionid) session.onsessionid = cbs.onsessionid; + if (cbs.onwtsessionclose) session.onwtsessionclose = cbs.onwtsessionclose; } /** @@ -1572,6 +1626,8 @@ class QuicStream { onblocked: undefined, onreset: undefined, onheaders: undefined, + onsessionid: undefined, + onwtsessionclose: undefined, ontrailers: undefined, oninfo: undefined, onwanttrailers: undefined, @@ -1796,6 +1852,44 @@ class QuicStream { } } + /** @type {OnSessionIdCallback} */ + get onsessionid() { + assertIsQuicStream(this); + return this.#inner.onsessionid; + } + + set onsessionid(fn) { + assertIsQuicStream(this); + const inner = this.#inner; + if (fn === undefined) { + inner.onsessionid = undefined; + inner.state.wantsSessionId = false; + } else { + validateFunction(fn, 'onsessionid'); + inner.onsessionid = FunctionPrototypeBind(fn, this); + inner.state.wantsSessionId = true; + } + } + + /** @type {OnWTSessionCloseCallback} */ + get onwtsessionclose() { + assertIsQuicStream(this); + return this.#inner.onwtsessionclose; + } + + set onwtsessionclose(fn) { + assertIsQuicStream(this); + const inner = this.#inner; + if (fn === undefined) { + inner.onwtsessionclose = undefined; + inner.state.wantsWTSessionClose = false; + } else { + validateFunction(fn, 'onwtsessionclose'); + inner.onwtsessionclose = FunctionPrototypeBind(fn, this); + inner.state.wantsWTSessionClose = true; + } + } + /** @type {Function|undefined} */ get oninfo() { assertIsQuicStream(this); @@ -2060,10 +2154,16 @@ class QuicStream { 'The negotiated QUIC application protocol does not support headers'); } validateObject(headers, 'headers'); - const { terminal = false } = options; + const { terminal = false, webtransport = false } = options; + if (terminal && webtransport) { + throw new ERR_INVALID_ARG_VALUE( + 'webtransport and terminal can not be set simultaenously.', + { terminal, webtransport }); + } const headerString = buildNgHeaderString( headers, assertValidPseudoHeader, true /* strictSingleValueFields */); - const flags = terminal ? kHeadersFlagsTerminal : kHeadersFlagsNone; + const flags = terminal ? kHeadersFlagsTerminal : + (webtransport ? kHeadersFlagsWebtransport : kHeadersFlagsNone); return this.#handle.sendHeaders(kHeadersKindInitial, headerString, flags); } @@ -2500,6 +2600,20 @@ class QuicStream { return this.#handle.sendHeaders(kind, headerString, flags); } + /** + * Attaches a webtransport session to the stream and sends initial bytes + * indicating webtransport stream and the session id + * @returns {boolean} true if it succeeded. + */ + [kMakeWebtransportStream](session) { + if (this.pending) { + debug('pending stream enqueuing makeWebtransportStream for session', session.id); + } else { + debug(`stream ${this.id} makeWebtransportStream for session`, session.id); + } + return this.#handle.makeWebtransportStream(session.#handle); + } + [kFinishClose](error) { const inner = this.#inner; inner.pendingClose ??= PromiseWithResolvers(); @@ -2539,6 +2653,8 @@ class QuicStream { inner.onblocked = undefined; inner.onreset = undefined; inner.onheaders = undefined; + inner.onsessionid = undefined; + inner.onwtsessionclose = undefined; inner.onerror = undefined; inner.ontrailers = undefined; inner.oninfo = undefined; @@ -2637,6 +2753,39 @@ class QuicStream { } } + [kSessionId](sessionId) { + if (this.destroyed) return; + const inner = this.#inner; + if (onStreamSessionIdChannel.hasSubscribers) { + onStreamSessionIdChannel.publish({ + __proto__: null, + stream: this, + session: inner.session, + sessionid, + }); + } + if (typeof inner.onsessionid === 'function') { + safeCallbackInvoke(inner.onsessionid, this, sessionId); + } + } + + [kWTSessionClose](errorcode, errormessage) { + if (this.destroyed) return; + const inner = this.#inner; + if (onStreamWTSessionCloseChannel.hasSubscribers) { + onStreamWTSessionCloseChannel.publish({ + __proto__: null, + stream: this, + session: inner.session, + errorcode, + errormessage + }); + } + if (typeof inner.onwtsessionclose === 'function') { + safeCallbackInvoke(inner.onwtsessionclose, this, errorcode, errormessage); + } + } + [kTrailers]() { if (this.destroyed) return; const inner = this.#inner; @@ -3251,9 +3400,13 @@ class QuicSession { body, priority = 'default', incremental = false, + webtransport = false, + webtransportSession = undefined, highWaterMark = kDefaultHighWaterMark, headers, onheaders, + onsessionid, + onwtsessionclose, ontrailers, oninfo, onwanttrailers, @@ -3261,9 +3414,27 @@ class QuicSession { validateOneOf(priority, 'options.priority', ['default', 'low', 'high']); validateBoolean(incremental, 'options.incremental'); + validateBoolean(webtransport, 'options.webtransport'); const validatedBody = validateBody(body); + if (typeof body !== 'undefined' && webtransport) { + throw new ERR_INVALID_ARG_TYPE('options.body', 'A body can not be provided in webtransport mode'); + } + + if (webtransportSession) { + if (webtransport && webtransportSession) { + throw new ERR_INVALID_ARG_TYPE('options.webtransport', 'webtransport can not be set for creating a webtransport stream associated with a webtransport session'); + } + + if (headers && webtransportSession) { + throw new ERR_INVALID_ARG_TYPE('options.headers', 'headers can not be set for creating a webtransport stream associated with a webtransport session'); + } + if (!isQuicStream(webtransportSession)) { + throw new ERR_INVALID_ARG_TYPE('options.webtransportSession', 'webtransportSession was to be of type QuicStream'); + } + } + const handle = this.#handle.openStream(direction, validatedBody); if (handle === undefined) { throw new ERR_QUIC_OPEN_STREAM_FAILED(); @@ -3292,12 +3463,24 @@ class QuicSession { // Set stream callbacks before sending headers to avoid missing events. if (onheaders) stream.onheaders = onheaders; + if (onsessionid) stream.onsessionid = onsessionid; + if (onwtsessionclose) stream.onwtsessionclose = onwtsessionclose; if (ontrailers) stream.ontrailers = ontrailers; if (oninfo) stream.oninfo = oninfo; if (onwanttrailers) stream.onwanttrailers = onwanttrailers; if (headers !== undefined) { - stream.sendHeaders(headers, { terminal: validatedBody === undefined }); + stream.sendHeaders(headers, + { terminal: validatedBody === undefined && !webtransport, + webtransport }); + } else if (webtransport) { + throw new ERR_INVALID_ARG_VALUE('options.webtransport', + 'Specifying webtransport without a header has no effect'); + } + if (webtransportSession) { + if (!stream[kMakeWebtransportStream](webtransportSession)) { + throw new ERR_QUIC_OPEN_STREAM_FAILED(); + } } if (onSessionOpenStreamChannel.hasSubscribers) { @@ -4065,6 +4248,8 @@ class QuicSession { const scbs = this[kStreamCallbacks]; if (scbs) { if (scbs.onheaders) stream.onheaders = scbs.onheaders; + if (scbs.onsessionid) stream.onsessionid = scbs.onsessionid; + if (scbs.onwtsessionclose) stream.onwtsessionclose = scbs.onwtsessionclose; if (scbs.ontrailers) stream.ontrailers = scbs.ontrailers; if (scbs.oninfo) stream.oninfo = scbs.oninfo; if (scbs.onwanttrailers) stream.onwanttrailers = scbs.onwanttrailers; @@ -4442,6 +4627,8 @@ class QuicEndpoint { onapplication, // Stream-level callbacks applied to each incoming stream. onheaders, + onsessionid, + onwtsessionclose, ontrailers, oninfo, onwanttrailers, @@ -4467,6 +4654,8 @@ class QuicEndpoint { onqlog, onapplication, onheaders, + onsessionid, + onwtsessionclose, ontrailers, oninfo, onwanttrailers, @@ -5202,6 +5391,8 @@ function processSessionOptions(options, config = kEmptyObject) { // Application level options changed, e.g. HTTP/3 settings related // Stream-level callbacks. onheaders, + onsessionid, + onwtsessionclose, ontrailers, oninfo, onwanttrailers, @@ -5323,6 +5514,8 @@ function processSessionOptions(options, config = kEmptyObject) { onqlog, onapplication, onheaders, + onsessionid, + onwtsessionclose, ontrailers, oninfo, onwanttrailers, diff --git a/lib/internal/quic/state.js b/lib/internal/quic/state.js index 22763c1df31b68..bf4254e9e6d3c8 100644 --- a/lib/internal/quic/state.js +++ b/lib/internal/quic/state.js @@ -100,6 +100,8 @@ const { IDX_STATE_STREAM_HAS_READER, IDX_STATE_STREAM_WANTS_BLOCK, IDX_STATE_STREAM_WANTS_HEADERS, + IDX_STATE_STREAM_WANTS_SESSIONID, + IDX_STATE_STREAM_WANTS_WTSESSIONCLOSE, IDX_STATE_STREAM_WANTS_RESET, IDX_STATE_STREAM_WANTS_TRAILERS, IDX_STATE_STREAM_RECEIVED_EARLY_DATA, @@ -141,6 +143,7 @@ assert(IDX_STATE_STREAM_HAS_OUTBOUND !== undefined); assert(IDX_STATE_STREAM_HAS_READER !== undefined); assert(IDX_STATE_STREAM_WANTS_BLOCK !== undefined); assert(IDX_STATE_STREAM_WANTS_HEADERS !== undefined); +assert(IDX_STATE_STREAM_WANTS_SESSIONID !== undefined); assert(IDX_STATE_STREAM_WANTS_RESET !== undefined); assert(IDX_STATE_STREAM_WANTS_TRAILERS !== undefined); assert(IDX_STATE_STREAM_WRITE_DESIRED_SIZE !== undefined); @@ -812,6 +815,35 @@ class QuicStreamState { DataViewPrototypeSetUint8(handle, this.#offset + IDX_STATE_STREAM_WANTS_HEADERS, val ? 1 : 0); } + /** @type {boolean} */ + get wantsSessionId() { + const handle = this.#handle; + if (handle === undefined) return undefined; + return DataViewPrototypeGetUint8(handle, this.#offset + IDX_STATE_STREAM_WANTS_SESSIONID) !== 0; + } + + /** @type {boolean} */ + set wantsSessionId(val) { + const handle = this.#handle; + if (handle === undefined) return; + DataViewPrototypeSetUint8(handle, this.#offset + IDX_STATE_STREAM_WANTS_SESSIONID, val ? 1 : 0); + } + + /** @type {boolean} */ + get wantsWTSessionClose() { + const handle = this.#handle; + if (handle === undefined) return undefined; + return DataViewPrototypeGetUint8(handle, this.#offset + IDX_STATE_STREAM_WANTS_WTSESSIONCLOSE) !== 0; + } + + /** @type {boolean} */ + set wantsWTSessionClose(val) { + const handle = this.#handle; + if (handle === undefined) return; + DataViewPrototypeSetUint8(handle, this.#offset + IDX_STATE_STREAM_WANTS_WTSESSIONCLOSE, val ? 1 : 0); + } + + /** @type {boolean} */ get wantsReset() { const handle = this.#handle; @@ -904,6 +936,8 @@ class QuicStreamState { wantsBlock, wantsReset, wantsHeaders, + wantsSessionId, + wantsWTSessionClose, wantsTrailers, early, resetCode, @@ -924,6 +958,8 @@ class QuicStreamState { wantsBlock, wantsReset, wantsHeaders, + wantsSessionId, + wantsWTSessionClose, wantsTrailers, early, resetCode, @@ -960,6 +996,8 @@ class QuicStreamState { wantsBlock, wantsReset, wantsHeaders, + wantsSessionId, + wantsWTSessionClose, wantsTrailers, early, resetCode, @@ -980,6 +1018,8 @@ class QuicStreamState { wantsBlock, wantsReset, wantsHeaders, + wantsSessionId, + wantsWTSessionClose, wantsTrailers, early, resetCode, diff --git a/lib/internal/quic/symbols.js b/lib/internal/quic/symbols.js index 665ab7ca1911c2..8d7037f102ce09 100644 --- a/lib/internal/quic/symbols.js +++ b/lib/internal/quic/symbols.js @@ -40,6 +40,8 @@ const kHandshake = Symbol('kHandshake'); const kHandshakeCompleted = Symbol('kHandshakeCompleted'); const kVerifyPeer = Symbol('kVerifyPeer'); const kHeaders = Symbol('kHeaders'); +const kSessionId = Symbol('kSessionId'); +const kWTSessionClose = Symbol('kWTSessionClose'); const kKeylog = Symbol('kKeylog'); const kListen = Symbol('kListen'); const kQlog = Symbol('kQlog'); @@ -55,6 +57,7 @@ const kRemoveSession = Symbol('kRemoveSession'); const kRemoveStream = Symbol('kRemoveStream'); const kReset = Symbol('kReset'); const kSendHeaders = Symbol('kSendHeaders'); +const kMakeWebtransportStream = Symbol('kMakeWebtransportStream'); const kSessionApplication = Symbol('kSessionApplication'); const kSessionTicket = Symbol('kSessionTicket'); const kTrailers = Symbol('kTrailers'); @@ -74,6 +77,7 @@ module.exports = { kHandshakeCompleted, kVerifyPeer, kHeaders, + kSessionId, kInspect, kKeylog, kKeyObjectHandle, @@ -91,6 +95,7 @@ module.exports = { kRemoveStream, kReset, kSendHeaders, + kMakeWebtransportStream, kSessionApplication, kSessionTicket, kTrailers, diff --git a/src/quic/application.cc b/src/quic/application.cc index ce5d5e12154d8a..4952b3b71b04a5 100644 --- a/src/quic/application.cc +++ b/src/quic/application.cc @@ -57,6 +57,7 @@ Session::Application_Options::operator const nghttp3_settings() const { .glitch_ratelim_burst = 1000, .glitch_ratelim_rate = 33, .qpack_indexing_strat = NGHTTP3_QPACK_INDEXING_STRAT_EAGER, + .wt_enabled = enable_webtransport }; } @@ -78,6 +79,8 @@ std::string Session::Application_Options::ToString() const { (enable_connect_protocol ? std::string("yes") : std::string("no")); res += prefix + "enable datagrams: " + (enable_datagrams ? std::string("yes") : std::string("no")); + res += prefix + "webtransport enabled: " + + (enable_webtransport ? std::string("yes") : std::string("no")); res += indent.Close(); return res; } @@ -107,7 +110,7 @@ Maybe Session::Application_Options::From( !SET(max_field_section_size) || !SET(qpack_max_dtable_capacity) || !SET(qpack_encoder_max_dtable_capacity) || !SET(qpack_blocked_streams) || !SET(enable_connect_protocol) || - !SET(enable_datagrams)) { + !SET(enable_datagrams) || !SET(enable_webtransport)) { // The call to SetOption should have scheduled an exception to be thrown. return Nothing(); } @@ -138,6 +141,7 @@ MaybeLocal Session::Application_Options::ToObject( "qpackBlockedStreams", "enableConnectProtocol", "enableDatagrams", + "enableWebtransport" }; if (tmpl.IsEmpty()) { tmpl = DictionaryTemplate::New(env->isolate(), names); @@ -153,6 +157,7 @@ MaybeLocal Session::Application_Options::ToObject( BigInt::NewFromUnsigned(env->isolate(), qpack_blocked_streams), Boolean::New(env->isolate(), enable_connect_protocol), Boolean::New(env->isolate(), enable_datagrams), + Boolean::New(env->isolate(), enable_webtransport), }; static_assert(std::size(values) == std::size(names)); @@ -248,7 +253,8 @@ bool Session::Application::ValidateTicketData( options.qpack_blocked_streams >= ticket.qpack_blocked_streams && (!ticket.enable_connect_protocol || options.enable_connect_protocol) && - (!ticket.enable_datagrams || options.enable_datagrams); + (!ticket.enable_datagrams || options.enable_datagrams) && + (!ticket.enable_webtransport || options.enable_webtransport); } // DefaultTicketData always validates. return true; diff --git a/src/quic/application.h b/src/quic/application.h index 0df9b9f0a0e68d..a68020a4138ece 100644 --- a/src/quic/application.h +++ b/src/quic/application.h @@ -25,6 +25,7 @@ struct Http3TicketData { uint64_t qpack_blocked_streams; bool enable_connect_protocol; bool enable_datagrams; + bool enable_webtransport; }; using PendingTicketAppData = std::variant; @@ -205,6 +206,16 @@ class Session::Application : public MemoryRetainer { return false; } + // connects the webtransport session stream to stream object, + // it also sends some initial bytes to the wire to signal + // the other side, that this is a webtransport stream + // it is a noop, if we can not send on this stream incoming + // unidirectional stream + virtual bool MakeWebtransportStream(const Stream& stream, + int64_t sessionid) { + return false; + } + // Signals to the Application that it should serialize and transmit any // pending session and stream packets it has accumulated. void SendPendingData(); diff --git a/src/quic/bindingdata.h b/src/quic/bindingdata.h index 7879220e02b482..64497dac5aaf72 100644 --- a/src/quic/bindingdata.h +++ b/src/quic/bindingdata.h @@ -60,6 +60,8 @@ class SessionManager; V(stream_created, StreamCreated) \ V(stream_drain, StreamDrain) \ V(stream_headers, StreamHeaders) \ + V(stream_sessionid, StreamSessionId) \ + V(stream_wtsessionclose, StreamWTSessionClose) \ V(stream_reset, StreamReset) \ V(stream_trailers, StreamTrailers) @@ -89,6 +91,7 @@ class SessionManager; V(enable_connect_protocol, "enableConnectProtocol") \ V(enable_early_data, "enableEarlyData") \ V(enable_datagrams, "enableDatagrams") \ + V(enable_webtransport, "enableWebtransport") \ V(enable_tls_trace, "tlsTrace") \ V(endpoint, "Endpoint") \ V(endpoint_udp, "Endpoint::UDP") \ diff --git a/src/quic/defs.h b/src/quic/defs.h index 75ae915335be93..a9607bba497517 100644 --- a/src/quic/defs.h +++ b/src/quic/defs.h @@ -300,6 +300,11 @@ enum class Direction : uint8_t { UNIDIRECTIONAL, }; +enum class StreamType : uint8_t { + QUICSTREAM, // standard quic stream + WTSTREAM, // quic stream associated with webtransport session +}; + enum class HeadersKind : uint8_t { HINTS, INITIAL, @@ -309,6 +314,7 @@ enum class HeadersKind : uint8_t { enum class HeadersFlags : uint8_t { NONE, TERMINAL, + WEBTRANSPORT }; enum class StreamPriority : uint8_t { diff --git a/src/quic/http3.cc b/src/quic/http3.cc index bc479f96990577..17d77c42ec1395 100644 --- a/src/quic/http3.cc +++ b/src/quic/http3.cc @@ -28,8 +28,8 @@ namespace quic { namespace { constexpr uint8_t kSessionTicketAppDataVersion = 1; -// Layout: [type(1)][version(1)][crc(4)][payload(34)] = 40 bytes -constexpr size_t kSessionTicketAppDataSize = 40; +// Layout: [type(1)][version(1)][crc(4)][payload(35)] = 41 bytes +constexpr size_t kSessionTicketAppDataSize = 41; constexpr size_t kSessionTicketAppDataHeaderSize = 6; // type + version + crc constexpr size_t kSessionTicketAppDataPayloadSize = kSessionTicketAppDataSize - kSessionTicketAppDataHeaderSize; @@ -406,7 +406,9 @@ class Http3ApplicationImpl final : public Session::Application { WriteBE64(payload + 16, options_.qpack_encoder_max_dtable_capacity); WriteBE64(payload + 24, options_.qpack_blocked_streams); payload[32] = options_.enable_connect_protocol ? 1 : 0; + // May be bitfield should be used! payload[33] = options_.enable_datagrams ? 1 : 0; + payload[34] = options_.enable_webtransport ? 1 : 0; uLong crc = crc32(0L, Z_NULL, 0); crc = crc32(crc, payload, kSessionTicketAppDataPayloadSize); @@ -459,32 +461,36 @@ class Http3ApplicationImpl final : public Session::Application { uint64_t stored_qpack_blocked_streams = ReadBE64(payload + 24); bool stored_enable_connect_protocol = payload[32] != 0; bool stored_enable_datagrams = payload[33] != 0; + bool stored_enable_webtransport = payload[34] != 0; Debug(&session(), "Ticket app data: stored mfss=%" PRIu64 " qmdc=%" PRIu64 - " qemdc=%" PRIu64 " qbs=%" PRIu64 " ecp=%d ed=%d", + " qemdc=%" PRIu64 " qbs=%" PRIu64 " ecp=%d ed=%d ew=%d", stored_max_field_section_size, stored_qpack_max_dtable_capacity, stored_qpack_encoder_max_dtable_capacity, stored_qpack_blocked_streams, stored_enable_connect_protocol, - stored_enable_datagrams); + stored_enable_datagrams, + stored_enable_webtransport); Debug(&session(), "Current opts: mfss=%" PRIu64 " qmdc=%" PRIu64 " qemdc=%" PRIu64 - " qbs=%" PRIu64 " ecp=%d ed=%d", + " qbs=%" PRIu64 " ecp=%d ed=%d ew %d", options_.max_field_section_size, options_.qpack_max_dtable_capacity, options_.qpack_encoder_max_dtable_capacity, options_.qpack_blocked_streams, options_.enable_connect_protocol, - options_.enable_datagrams); + options_.enable_datagrams, + options_.enable_webtransport); if (options_.max_field_section_size < stored_max_field_section_size || options_.qpack_max_dtable_capacity < stored_qpack_max_dtable_capacity || options_.qpack_encoder_max_dtable_capacity < stored_qpack_encoder_max_dtable_capacity || options_.qpack_blocked_streams < stored_qpack_blocked_streams || (stored_enable_connect_protocol && !options_.enable_connect_protocol) || - (stored_enable_datagrams && !options_.enable_datagrams)) { + (stored_enable_datagrams && !options_.enable_datagrams) || + (stored_enable_webtransport && !options_.enable_webtransport)) { Debug(&session(), "Ticket app data REJECTED"); return SessionTicket::AppData::Status::TICKET_IGNORE_RENEW; } @@ -507,7 +513,8 @@ class Http3ApplicationImpl final : public Session::Application { options_.qpack_blocked_streams >= ticket.qpack_blocked_streams && (!ticket.enable_connect_protocol || options_.enable_connect_protocol) && - (!ticket.enable_datagrams || options_.enable_datagrams); + (!ticket.enable_datagrams || options_.enable_datagrams) && + (!ticket.enable_webtransport || options_.enable_webtransport); } void ReceiveStreamClose(Stream* stream, @@ -585,33 +592,63 @@ class Http3ApplicationImpl final : public Session::Application { // If the terminal flag is set, that means that we know we're only // sending headers and no body and the stream writable side should be // closed immediately because there is no nghttp3_data_reader provided. - if (flags != HeadersFlags::TERMINAL) { + if (flags != HeadersFlags::TERMINAL + && flags != HeadersFlags::WEBTRANSPORT) { reader_ptr = &reader; } if (session().is_server()) { // If this is a server, we're submitting a response... - Debug(&session(), - "Submitting %" PRIu64 " response headers for stream %" PRIu64, - nva.length(), - stream.id()); - return nghttp3_conn_submit_response(*this, - stream.id(), - nva.data(), - nva.length(), - reader_ptr) == 0; + if (flags != HeadersFlags::WEBTRANSPORT) { + Debug(&session(), + "Submitting %" PRIu64 " response headers for stream %" PRIu64, + nva.length(), + stream.id()); + return nghttp3_conn_submit_response(*this, + stream.id(), + nva.data(), + nva.length(), + reader_ptr) == 0; + } else { + Debug(&session(), + "Submitting %" PRIu64 " wt resp. headers for stream %" PRIu64, + nva.length(), + stream.id()); + if (nghttp3_conn_submit_wt_response(*this, + stream.id(), + nva.data(), + nva.length()) != 0) + return false; + return nghttp3_conn_server_confirm_wt_session(*this, + stream.id(), + 0) == 0; + } } else { // Otherwise we're submitting a request... - Debug(&session(), - "Submitting %" PRIu64 " request headers for stream %" PRIu64, - nva.length(), - stream.id()); - return nghttp3_conn_submit_request(*this, - stream.id(), - nva.data(), - nva.length(), - reader_ptr, - const_cast(&stream)) == 0; + if (flags != HeadersFlags::WEBTRANSPORT) { + Debug(&session(), + "Submitting %" PRIu64 " request headers for stream %" PRIu64, + nva.length(), + stream.id()); + return nghttp3_conn_submit_request(*this, + stream.id(), + nva.data(), + nva.length(), + reader_ptr, + const_cast(&stream)) + == 0; + } else { + Debug(&session(), + "Submitting %" PRIu64 " wt req. headers for stream %" PRIu64, + nva.length(), + stream.id()); + return nghttp3_conn_submit_wt_request(*this, + stream.id(), + nva.data(), + nva.length(), + const_cast(&stream)) + == 0; + } } break; } @@ -629,6 +666,26 @@ class Http3ApplicationImpl final : public Session::Application { return false; } + bool MakeWebtransportStream(const Stream& stream, int64_t sessionid) override { + Session::SendPendingDataScope send_scope(&session()); + static constexpr nghttp3_data_reader reader = {on_read_data_callback}; + const nghttp3_data_reader* reader_ptr = &reader; // can use the same reader + + Debug(&session(), + "Make stream %" PRIu64 " webtransport stream of session %" PRIu64, + stream.id(), + sessionid); + // we only need to do this, if we can send data + if (stream.is_remote_unidirectional()) + return true; // so bail out for remote unidirectional streams + return nghttp3_conn_open_wt_data_stream(*this, + sessionid, + stream.id(), + reader_ptr, + const_cast(&stream)) + == 0; + } + void SetStreamPriority(const Stream& stream, StreamPriority priority, StreamPriorityFlags flags) override { @@ -999,6 +1056,7 @@ class Http3ApplicationImpl final : public Session::Application { void OnReceiveSettings(const nghttp3_proto_settings* settings) { options_.enable_connect_protocol = settings->enable_connect_protocol; options_.enable_datagrams = settings->h3_datagram; + options_.enable_webtransport = settings->wt_enabled; options_.max_field_section_size = settings->max_field_section_size; options_.qpack_blocked_streams = settings->qpack_blocked_streams; options_.qpack_max_dtable_capacity = settings->qpack_max_dtable_capacity; @@ -1205,6 +1263,56 @@ class Http3ApplicationImpl final : public Session::Application { return NGHTTP3_ERR_CALLBACK_FAILURE; } + static int on_receive_wt_data(nghttp3_conn *conn, + int64_t session_id, + int64_t stream_id, + const uint8_t *data, + size_t datalen, + void *conn_user_data, + void *stream_user_data) { + NGHTTP3_CALLBACK_SCOPE(app); + auto& session = app.session(); + if (auto stream = FindOrCreateStream(conn, &session, stream_id)) [[likely]] { + stream->ReceiveData(data, datalen, Stream::ReceiveDataFlags{}); + return NGTCP2_SUCCESS; + } + return NGHTTP3_ERR_CALLBACK_FAILURE; + } + + static int on_wt_data_stream_open(nghttp3_conn *conn, + int64_t session_id, + int64_t stream_id, + void *conn_user_data, + void *stream_user_data) { + NGHTTP3_CALLBACK_SCOPE(app); + auto& session = app.session(); + if (auto stream = FindOrCreateStream(conn, &session, stream_id)) [[likely]] { + if (!app.MakeWebtransportStream(*stream.get(), session_id)) { + stream->Destroy(); // close stream forcefully, TODO may be use an assert instead? + return NGHTTP3_ERR_CALLBACK_FAILURE; + } + stream->NotifyWTSession(session_id); + return NGTCP2_SUCCESS; + } + return NGHTTP3_ERR_CALLBACK_FAILURE; + } + + static int on_recv_wt_close_session(nghttp3_conn *conn, + int64_t session_id, + uint32_t wt_error_code, + const uint8_t *msg, + size_t msglen, + void *conn_user_data, + void *stream_user_data) { + NGHTTP3_CALLBACK_SCOPE(app); + auto& session = app.session(); + if (auto stream = FindOrCreateStream(conn, &session, session_id)) [[likely]] { + stream->NotifyWTSessionClose(wt_error_code, msg, msglen); + return NGTCP2_SUCCESS; + } + return NGHTTP3_ERR_CALLBACK_FAILURE; + } + static int on_deferred_consume(nghttp3_conn* conn, stream_id id, size_t consumed, @@ -1402,7 +1510,10 @@ class Http3ApplicationImpl final : public Session::Application { on_receive_origin, on_end_origin, on_rand, - on_receive_settings}; + on_receive_settings, + on_receive_wt_data, + on_wt_data_stream_open, + on_recv_wt_close_session}; }; std::optional ParseHttp3TicketData(const uv_buf_t& data) { diff --git a/src/quic/session.h b/src/quic/session.h index 0caeb764ba56c8..b258e09bae76fa 100644 --- a/src/quic/session.h +++ b/src/quic/session.h @@ -83,6 +83,8 @@ class Session final : public AsyncWrap, private SessionTicket::AppData::Source { bool enable_connect_protocol = true; bool enable_datagrams = true; + // for a client always enabling wt, may be good + bool enable_webtransport = false; operator const nghttp3_settings() const; diff --git a/src/quic/streams.cc b/src/quic/streams.cc index e838392361f946..bdde2a3e2bc217 100644 --- a/src/quic/streams.cc +++ b/src/quic/streams.cc @@ -46,6 +46,7 @@ namespace quic { #define STREAM_STATE(V) \ V(ID, id, stream_id) \ + V(SESSION_ID, session_id, stream_id) \ V(PENDING, pending, uint8_t) \ V(FIN_SENT, fin_sent, uint8_t) \ V(FIN_RECEIVED, fin_received, uint8_t) \ @@ -59,6 +60,10 @@ namespace quic { V(WANTS_BLOCK, wants_block, uint8_t) \ /* Set when the stream has a headers event handler */ \ V(WANTS_HEADERS, wants_headers, uint8_t) \ + /* Set when the stream has a sessionid event handler */ \ + V(WANTS_SESSIONID, wants_sessionid, uint8_t) \ + /* Set when the stream has a event handler for closing a WT session */ \ + V(WANTS_WTSESSIONCLOSE, wants_wtsessionclose, uint8_t) \ /* Set when the stream has a reset event handler */ \ V(WANTS_RESET, wants_reset, uint8_t) \ /* Set when the stream has a trailers event handler */ \ @@ -97,6 +102,7 @@ namespace quic { V(AttachSource, attachSource, false) \ V(Destroy, destroy, false) \ V(SendHeaders, sendHeaders, false) \ + V(MakeWebtransportStream, makeWebtransportStream, false) \ V(StopSending, stopSending, false) \ V(ResetStream, resetStream, false) \ V(SetPriority, setPriority, false) \ @@ -474,6 +480,26 @@ struct Stream::Impl { *stream, kind, headers, flags)); } + // Connects a stream to a webtransport session stream, + // also sends the initial bytes of a stream to signel the wt stream + // also connects the readers + JS_METHOD(MakeWebtransportStream) { + Stream* stream; + ASSIGN_OR_RETURN_UNWRAP(&stream, args.This()); + CHECK(args.Length() > 0); + CHECK(args[0]->IsObject()); + Stream* session; + ASSIGN_OR_RETURN_UNWRAP(&session, args[0].As()); + if (stream->is_pending()) { + stream->EnqueuePendingWebtransportStream(session->id()); + return args.GetReturnValue().Set(true); + } + args.GetReturnValue().Set(stream->session().application().MakeWebtransportStream( + *stream, + session->id() + )); + } + // Tells the peer to stop sending data for this stream. This has the effect // of shutting down the readable side of the stream for this peer. Any data // that has already been received is still readable. @@ -892,7 +918,6 @@ class Stream::Outbound final : public MemoryRetainer { PullUncommitted(std::move(next)); return bob::Status::STATUS_CONTINUE; } - std::move(next)(bob::Status::STATUS_BLOCK, nullptr, 0, [](int) {}); return bob::Status::STATUS_BLOCK; } @@ -1089,6 +1114,8 @@ void Stream::InitPerContext(Realm* realm, Local target) { static_cast(HeadersFlags::NONE); constexpr int QUIC_STREAM_HEADERS_FLAGS_TERMINAL = static_cast(HeadersFlags::TERMINAL); + constexpr int QUIC_STREAM_HEADERS_FLAGS_WEBTRANSPORT = + static_cast(HeadersFlags::WEBTRANSPORT); NODE_DEFINE_CONSTANT(target, QUIC_STREAM_HEADERS_KIND_HINTS); NODE_DEFINE_CONSTANT(target, QUIC_STREAM_HEADERS_KIND_INITIAL); @@ -1096,6 +1123,7 @@ void Stream::InitPerContext(Realm* realm, Local target) { NODE_DEFINE_CONSTANT(target, QUIC_STREAM_HEADERS_FLAGS_NONE); NODE_DEFINE_CONSTANT(target, QUIC_STREAM_HEADERS_FLAGS_TERMINAL); + NODE_DEFINE_CONSTANT(target, QUIC_STREAM_HEADERS_FLAGS_WEBTRANSPORT); } Stream* Stream::From(void* stream_user_data) { @@ -1134,6 +1162,7 @@ Stream::Stream(BaseObjectWeakPtr session, MakeWeak(); DCHECK(id < kMaxStreamId); state()->id = id; + state()->session_id = kMaxStreamId; state()->pending = 0; // Allows us to be notified when data is actually read from the // inbound queue so that we can update the stream flow control. @@ -1191,6 +1220,7 @@ Stream::Stream(BaseObjectWeakPtr session, state_slot_ = GetStreamStateArena(binding).Allocate(env()->isolate()); MakeWeak(); state()->id = kMaxStreamId; + state()->session_id = kMaxStreamId; state()->pending = 1; // Allows us to be notified when data is actually read from the @@ -1251,6 +1281,7 @@ void Stream::NotifyStreamOpened(stream_id id) { Debug(this, "Pending stream opened with id %" PRIi64, id); state()->pending = 0; state()->id = id; + state()->session_id = kMaxStreamId; STAT_RECORD_TIMESTAMP(Stats, opened_at); // Now that the stream is actually opened, add it to the sessions // list of known open streams. @@ -1284,6 +1315,11 @@ void Stream::NotifyStreamOpened(stream_id id) { headers->flags); } } + if (pending_webtransport_session_ >= 0) { + session().application().MakeWebtransportStream(*this, + pending_webtransport_session_); + pending_webtransport_session_ = 0; + } // If the stream is not a local undirectional stream and is_readable is // false, then we should shutdown the streams readable side now. if (!is_local_unidirectional() && !is_readable()) { @@ -1321,6 +1357,11 @@ void Stream::EnqueuePendingHeaders(HeadersKind kind, kind, Global(env()->isolate(), headers), flags)); } +void Stream::EnqueuePendingWebtransportStream(int64_t sessionid) { + Debug(this, "Enqueing Webtransport Session strean for pending stream"); + pending_webtransport_session_ = sessionid; +} + bool Stream::is_pending() const { return state()->pending; } @@ -1329,6 +1370,10 @@ stream_id Stream::id() const { return state()->id; } +stream_id Stream::session_id() const { + return state()->session_id; +} + Side Stream::origin() const { CHECK(!is_pending()); return (state()->id & 0b01) ? Side::SERVER : Side::CLIENT; @@ -1574,6 +1619,7 @@ void Stream::BeginHeaders(HeadersKind kind) { headers_length_ = 0; headers_.clear(); set_headers_kind(kind); + state()->session_id = -1; // we know we are not a wt stream } void Stream::set_headers_kind(HeadersKind kind) { @@ -1592,6 +1638,19 @@ bool Stream::AddHeader(std::unique_ptr
header) { return true; } +void Stream::NotifyWTSession(stream_id session_id) { + if (state()->session_id != session_id) { + state()->session_id = session_id; + EmitSessionid(session_id); + } +} + +void Stream::NotifyWTSessionClose(uint32_t wt_error_code, + const uint8_t *msg, + size_t msglen) { + EmitWTSessionClose(wt_error_code, msg, msglen); +} + void Stream::Acknowledge(size_t datalen) { if (outbound_ == nullptr) return; @@ -1934,6 +1993,29 @@ void Stream::EmitHeaders() { MakeCallback(binding.stream_headers_callback(), arraysize(argv), argv); } +void Stream::EmitSessionid(stream_id session_id) { + if (!env()->can_call_into_js() || !state()->wants_sessionid) return; + CallbackScope cb_scope(this); + Local sid = BigInt::New(env()->isolate(), session_id); + MakeCallback(BindingData::Get(env()).stream_sessionid_callback(), 1, &sid); +} + + +void Stream::EmitWTSessionClose(uint32_t wt_error_code, + const uint8_t *msg, + size_t msglen) { + if (!env()->can_call_into_js() || !state()->wants_wtsessionclose) return; + CallbackScope cb_scope(this); + Local argv[] = { + Integer::NewFromUnsigned(env()->isolate(), + wt_error_code), + String::NewFromUtf8(env()->isolate(), reinterpret_cast(msg), + v8::NewStringType::kNormal, msglen).ToLocalChecked() + }; + MakeCallback(BindingData::Get(env()).stream_wtsessionclose_callback(), + arraysize(argv), argv); +} + void Stream::EmitReset(const QuicError& error) { // state()->wants_reset will be set from the javascript side if the // stream object has a handler for the reset event. @@ -1962,7 +2044,9 @@ void Stream::EmitWantTrailers() { void Stream::Schedule(Queue* queue) { // If this stream is not already in the queue to send data, add it. Debug(this, "Scheduled"); - if (outbound_ && stream_queue_.IsEmpty()) queue->PushBack(this); + if (outbound_ && stream_queue_.IsEmpty()) { + queue->PushBack(this); + } } void Stream::Unschedule() { diff --git a/src/quic/streams.h b/src/quic/streams.h index 86cb36b2668985..24866fdaa55b4c 100644 --- a/src/quic/streams.h +++ b/src/quic/streams.h @@ -248,9 +248,14 @@ class Stream final : public AsyncWrap, ~Stream() override; // While the stream is still pending, the id will be kMaxStreamId, - // inidicating the maximum possible stream id is kMaxStreamId - 1. + // indicating the maximum possible stream id is kMaxStreamId - 1. stream_id id() const; + // Until is is clear, that this has a session stream, it is kMaxStreamId + // after this it is -1, if it is not a webtransport stream + // and >= 0 it is a webtransport stream. + stream_id session_id() const; + // While the stream is still pending, the origin will be invalid. Side origin() const; @@ -351,6 +356,14 @@ class Stream final : public AsyncWrap, // have already been added, or the maximum total header length is reached. bool AddHeader(std::unique_ptr
header); + // Currently only http/3 can have a session stream in WebTransport + void NotifyWTSession(stream_id session_id); + + // Currently only http/3 can have a session stream that receives a close capsule + void NotifyWTSessionClose(uint32_t wt_error_code, + const uint8_t *msg, + size_t msglen); + // TODO(@jasnell): Implement MemoryInfo to track outbound_, inbound_, // reader_, headers_, and pending_headers_queue_. SET_NO_MEMORY_INFO() @@ -423,15 +436,27 @@ class Stream final : public AsyncWrap, // Delivers the set of inbound headers that have been collected. void EmitHeaders(); + // Delivers the session_id aka the stream that holds e.g. the WT session. + void EmitSessionid(stream_id session_id); + + // delivers the content of the close capsule + void EmitWTSessionClose(uint32_t wt_error_code, + const uint8_t *msg, + size_t msglen); + void NotifyReadableEnded(error_code code); void NotifyWritableEnded(error_code code); // When a pending stream is finally opened, the NotifyStreamOpened method // will be called and the id will be assigned. void NotifyStreamOpened(stream_id id); + + // The session id can arrive later + void NotifySessionStream(stream_id session_id); void EnqueuePendingHeaders(HeadersKind kind, v8::Local headers, HeadersFlags flags); + void EnqueuePendingWebtransportStream(int64_t session_id); ArenaSlotBase stats_slot_; ArenaSlotBase state_slot_; @@ -447,6 +472,7 @@ class Stream final : public AsyncWrap, std::optional> maybe_pending_stream_ = std::nullopt; std::vector> pending_headers_queue_; + int64_t pending_webtransport_session_ = -1; error_code pending_close_read_code_ = 0; error_code pending_close_write_code_ = 0; diff --git a/test/parallel/test-quic-h3-settings.mjs b/test/parallel/test-quic-h3-settings.mjs index d954813c9c2564..ec5a29c116f961 100644 --- a/test/parallel/test-quic-h3-settings.mjs +++ b/test/parallel/test-quic-h3-settings.mjs @@ -5,6 +5,7 @@ // maxHeaderLength enforcement - reject headers exceeding byte length // enableConnectProtocol setting (accepted without error) // enableDatagrams setting (accepted without error) +// enableWebtransport setting (accepted without error) import { hasQuic, skip, mustCall } from '../common/index.mjs'; import assert from 'node:assert'; diff --git a/test/parallel/test-quic-internal-setcallbacks.mjs b/test/parallel/test-quic-internal-setcallbacks.mjs index b485b5e9b43457..376a152ecdc456 100644 --- a/test/parallel/test-quic-internal-setcallbacks.mjs +++ b/test/parallel/test-quic-internal-setcallbacks.mjs @@ -34,6 +34,8 @@ const callbacks = { onStreamDrain() {}, onStreamReset() {}, onStreamHeaders() {}, + onStreamSessionId() {}, + onStreamWTSessionClose() {}, onStreamTrailers() {}, }; // Fail if any callback is missing diff --git a/test/parallel/test-quic-session-application-options.mjs b/test/parallel/test-quic-session-application-options.mjs index 1f5c9c0926808c..055983ea10864e 100644 --- a/test/parallel/test-quic-session-application-options.mjs +++ b/test/parallel/test-quic-session-application-options.mjs @@ -25,6 +25,7 @@ const customAppOptions = { qpackBlockedStreams: 50n, enableConnectProtocol: false, enableDatagrams: false, + enableWebtransport: false, }; const serverDone = Promise.withResolvers(); @@ -53,6 +54,7 @@ const serverEndpoint = await listen(mustCall((serverSession) => { strictEqual(opts.enableConnectProtocol, customAppOptions.enableConnectProtocol); strictEqual(opts.enableDatagrams, customAppOptions.enableDatagrams); + strictEqual(opts.enableWebtransport, customAppOptions.enableWebtransport); stream.writer.endSync(); await stream.closed;