1
0
Fork 0
mirror of https://github.com/warmcat/libwebsockets.git synced 2025-03-09 00:00:04 +01:00

http2 able to send test.html to nghttp2

Signed-off-by: Andy Green <andy.green@linaro.org>
This commit is contained in:
Andy Green 2014-10-12 14:31:47 +08:00
parent 2add6340d5
commit 917f43ab82
9 changed files with 930 additions and 611 deletions

View file

@ -27,6 +27,55 @@ the same writeable callback. If set, you can't do any more writes until the
writeable callback is called again. If you only do one write per writeable callback,
you can ignore this.
HTTP2-related: HTTP2 changes how headers are handled, lws now has new version-
agnositic header creation APIs. These do the right thing depending on each
connection's HTTP version without the user code having to know or care, except
to make sure to use the new APIs for headers (test-server is updated to use
them already, so look there for examples)
The APIs "render" the headers into a user-provided buffer and bump *p as it
is used. If *p reaches end, then the APIs return nonzero for error.
LWS_VISIBLE LWS_EXTERN int
lws_add_http_header_status(struct libwebsocket_context *context,
struct libwebsocket *wsi,
unsigned int code,
unsigned char **p,
unsigned char *end);
Start a response header reporting status like 200, 500, etc
LWS_VISIBLE LWS_EXTERN int
lws_add_http_header_by_name(struct libwebsocket_context *context,
struct libwebsocket *wsi,
const unsigned char *name,
const unsigned char *value,
int length,
unsigned char **p,
unsigned char *end);
Add a header like name: value in HTTP1.x
LWS_VISIBLE LWS_EXTERN int
lws_finalize_http_header(struct libwebsocket_context *context,
struct libwebsocket *wsi,
unsigned char **p,
unsigned char *end);
Finish off the headers, like add the extra \r\n in HTTP1.x
LWS_VISIBLE LWS_EXTERN int
lws_add_http_header_by_token(struct libwebsocket_context *context,
struct libwebsocket *wsi,
enum lws_token_indexes token,
const unsigned char *value,
int length,
unsigned char **p,
unsigned char *end);
Add a header by using a lws token as the name part. In HTTP2, this can be
compressed to one or two bytes.
User api removal
----------------
@ -37,6 +86,18 @@ partial send buffering is the only way to deal with the problem, so turning
it off is deprecated.
User api changes
----------------
HTTP2-related: API libwebsockets_serve_http_file() takes an extra parameter at
the end now
int other_headers_len)
If you are providing other headers, they must be generated using the new
HTTP-version-agnostic APIs, and you must provide the length of them using this
additional parameter.
v1.3-chrome37-firefox30
=======================

View file

@ -468,3 +468,98 @@ pre_data:
return 0;
}
static int lws_http2_num(int starting_bits, unsigned long num, unsigned char **p, unsigned char *end)
{
int mask = (1 << starting_bits) - 1;
if (num < mask) {
*((*p)++) |= num;
return *p >= end;
}
*((*p)++) |= mask;
if (*p >= end)
return 1;
num -= mask;
while (num >= 128) {
*((*p)++) = 0x80 | (num & 0x7f);
if (*p >= end)
return 1;
num >>= 7;
}
return 0;
}
int lws_add_http2_header_by_name(struct libwebsocket_context *context,
struct libwebsocket *wsi,
const unsigned char *name,
const unsigned char *value,
int length,
unsigned char **p,
unsigned char *end)
{
int len;
lwsl_info("%s: %p %s:%s\n", __func__, *p, name, value);
len = strlen((char *)name);
if (len)
if (name[len - 1] == ':')
len--;
if (end - *p < len + length + 8)
return 1;
*((*p)++) = 0; /* not indexed, literal name */
**p = 0; /* non-HUF */
if (lws_http2_num(7, len, p, end))
return 1;
memcpy(*p, name, len);
*p += len;
*(*p) = 0; /* non-HUF */
if (lws_http2_num(7, length, p, end))
return 1;
memcpy(*p, value, length);
*p += length;
return 0;
}
int lws_add_http2_header_by_token(struct libwebsocket_context *context,
struct libwebsocket *wsi,
enum lws_token_indexes token,
const unsigned char *value,
int length,
unsigned char **p,
unsigned char *end)
{
const unsigned char *name;
name = lws_token_to_string(token);
if (!name)
return 1;
return lws_add_http2_header_by_name(context, wsi, name, value, length, p, end);
}
int lws_add_http2_header_status(struct libwebsocket_context *context,
struct libwebsocket *wsi,
unsigned int code,
unsigned char **p,
unsigned char *end)
{
unsigned char status[10];
int n;
n = sprintf((char *)status, "%u", code);
if (lws_add_http2_header_by_token(context, wsi, WSI_TOKEN_HTTP_COLON_STATUS, status, n, p, end))
return 1;
return 0;
}

85
lib/lextable-strings.h Normal file
View file

@ -0,0 +1,85 @@
/* set of parsable strings -- ALL LOWER CASE */
static const char *set[] = {
"get ",
"post ",
"options ",
"host:",
"connection:",
"upgrade:",
"origin:",
"sec-websocket-draft:",
"\x0d\x0a",
"sec-websocket-extensions:",
"sec-websocket-key1:",
"sec-websocket-key2:",
"sec-websocket-protocol:",
"sec-websocket-accept:",
"sec-websocket-nonce:",
"http/1.1 ",
"http2-settings:",
"accept:",
"access-control-request-headers:",
"if-modified-since:",
"if-none-match:",
"accept-encoding:",
"accept-language:",
"pragma:",
"cache-control:",
"authorization:",
"cookie:",
"content-length:",
"content-type:",
"date:",
"range:",
"referer:",
"sec-websocket-key:",
"sec-websocket-version:",
"sec-websocket-origin:",
":authority:",
":method:",
":path:",
":scheme:",
":status:",
"accept-charset:",
"accept-ranges:",
"access-control-allow-origin:",
"age:",
"allow:",
"content-disposition:",
"content-encoding:",
"content-language:",
"content-location:",
"content-range:",
"etag:",
"expect:",
"expires:",
"from:",
"if-match:",
"if-range:",
"if-unmodified-since:",
"last-modified:",
"link:",
"location:",
"max-forwards:",
"proxy-authenticate:",
"proxy-authorization:",
"refresh:",
"retry-after:",
"server:",
"set-cookie:",
"strict-transport-security:",
"transfer-encoding:",
"user-agent:",
"vary:",
"via:",
"www-authenticate:",
"", /* not matchable */
};

View file

@ -8,16 +8,16 @@
0x0D /* '.' */, 0xC4, 0x00 /* (to 0x00D9 state 68) */,
0x61 /* 'a' */, 0x16, 0x01 /* (to 0x012E state 129) */,
0x69 /* 'i' */, 0x55, 0x01 /* (to 0x0170 state 163) */,
0x64 /* 'd' */, 0xFB, 0x01 /* (to 0x0219 state 265) */,
0x72 /* 'r' */, 0xFE, 0x01 /* (to 0x021F state 270) */,
0x3A /* ':' */, 0x2F, 0x02 /* (to 0x0253 state 299) */,
0x65 /* 'e' */, 0xB6, 0x02 /* (to 0x02DD state 405) */,
0x66 /* 'f' */, 0xD2, 0x02 /* (to 0x02FC state 421) */,
0x6C /* 'l' */, 0xF4, 0x02 /* (to 0x0321 state 454) */,
0x6D /* 'm' */, 0x17, 0x03 /* (to 0x0347 state 480) */,
0x74 /* 't' */, 0x80, 0x03 /* (to 0x03B3 state 574) */,
0x76 /* 'v' */, 0x9B, 0x03 /* (to 0x03D1 state 602) */,
0x77 /* 'w' */, 0xA8, 0x03 /* (to 0x03E1 state 610) */,
0x64 /* 'd' */, 0xFE, 0x01 /* (to 0x021C state 265) */,
0x72 /* 'r' */, 0x01, 0x02 /* (to 0x0222 state 270) */,
0x3A /* ':' */, 0x32, 0x02 /* (to 0x0256 state 299) */,
0x65 /* 'e' */, 0xC3, 0x02 /* (to 0x02EA state 414) */,
0x66 /* 'f' */, 0xDF, 0x02 /* (to 0x0309 state 430) */,
0x6C /* 'l' */, 0x01, 0x03 /* (to 0x032E state 463) */,
0x6D /* 'm' */, 0x24, 0x03 /* (to 0x0354 state 489) */,
0x74 /* 't' */, 0x8D, 0x03 /* (to 0x03C0 state 583) */,
0x76 /* 'v' */, 0xA8, 0x03 /* (to 0x03DE state 611) */,
0x77 /* 'w' */, 0xB5, 0x03 /* (to 0x03EE state 619) */,
0x08, /* fail */
/* pos 003d: 1 */ 0xE5 /* 'e' -> */,
/* pos 003e: 2 */ 0xF4 /* 't' -> */,
@ -65,7 +65,7 @@
/* pos 0084: 32 */ 0xBA /* ':' -> */,
/* pos 0085: 33 */ 0x00, 0x04 /* - terminal marker 4 - */,
/* pos 0087: 34 */ 0x70 /* 'p' */, 0x07, 0x00 /* (to 0x008E state 35) */,
0x73 /* 's' */, 0x3C, 0x03 /* (to 0x03C6 state 592) */,
0x73 /* 's' */, 0x49, 0x03 /* (to 0x03D3 state 601) */,
0x08, /* fail */
/* pos 008e: 35 */ 0xE7 /* 'g' -> */,
/* pos 008f: 36 */ 0xF2 /* 'r' -> */,
@ -81,11 +81,11 @@
/* pos 009a: 46 */ 0xBA /* ':' -> */,
/* pos 009b: 47 */ 0x00, 0x06 /* - terminal marker 6 - */,
/* pos 009d: 48 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x00A4 state 49) */,
0x74 /* 't' */, 0xF9, 0x02 /* (to 0x0399 state 549) */,
0x74 /* 't' */, 0x06, 0x03 /* (to 0x03A6 state 558) */,
0x08, /* fail */
/* pos 00a4: 49 */ 0x63 /* 'c' */, 0x0A, 0x00 /* (to 0x00AE state 50) */,
0x72 /* 'r' */, 0xE2, 0x02 /* (to 0x0389 state 535) */,
0x74 /* 't' */, 0xE5, 0x02 /* (to 0x038F state 540) */,
0x72 /* 'r' */, 0xEF, 0x02 /* (to 0x0396 state 544) */,
0x74 /* 't' */, 0xF2, 0x02 /* (to 0x039C state 549) */,
0x08, /* fail */
/* pos 00ae: 50 */ 0xAD /* '-' -> */,
/* pos 00af: 51 */ 0xF7 /* 'w' -> */,
@ -104,8 +104,8 @@
0x70 /* 'p' */, 0x38, 0x00 /* (to 0x00FA state 88) */,
0x61 /* 'a' */, 0x3F, 0x00 /* (to 0x0104 state 97) */,
0x6E /* 'n' */, 0x44, 0x00 /* (to 0x010C state 104) */,
0x76 /* 'v' */, 0x77, 0x01 /* (to 0x0242 state 284) */,
0x6F /* 'o' */, 0x7D, 0x01 /* (to 0x024B state 292) */,
0x76 /* 'v' */, 0x7A, 0x01 /* (to 0x0245 state 284) */,
0x6F /* 'o' */, 0x80, 0x01 /* (to 0x024E state 292) */,
0x08, /* fail */
/* pos 00d2: 62 */ 0xF2 /* 'r' -> */,
/* pos 00d3: 63 */ 0xE1 /* 'a' -> */,
@ -130,7 +130,7 @@
/* pos 00e9: 82 */ 0xF9 /* 'y' -> */,
/* pos 00ea: 83 */ 0x31 /* '1' */, 0x0A, 0x00 /* (to 0x00F4 state 84) */,
0x32 /* '2' */, 0x0A, 0x00 /* (to 0x00F7 state 86) */,
0x3A /* ':' */, 0x50, 0x01 /* (to 0x0240 state 283) */,
0x3A /* ':' */, 0x53, 0x01 /* (to 0x0243 state 283) */,
0x08, /* fail */
/* pos 00f4: 84 */ 0xBA /* ':' -> */,
/* pos 00f5: 85 */ 0x00, 0x0A /* - terminal marker 10 - */,
@ -181,8 +181,8 @@
/* pos 012c: 128 */ 0x00, 0x10 /* - terminal marker 16 - */,
/* pos 012e: 129 */ 0x63 /* 'c' */, 0x0D, 0x00 /* (to 0x013B state 130) */,
0x75 /* 'u' */, 0xAC, 0x00 /* (to 0x01DD state 230) */,
0x67 /* 'g' */, 0x79, 0x01 /* (to 0x02AD state 363) */,
0x6C /* 'l' */, 0x7A, 0x01 /* (to 0x02B1 state 366) */,
0x67 /* 'g' */, 0x7C, 0x01 /* (to 0x02B0 state 363) */,
0x6C /* 'l' */, 0x7D, 0x01 /* (to 0x02B4 state 366) */,
0x08, /* fail */
/* pos 013b: 130 */ 0xE3 /* 'c' -> */,
/* pos 013c: 131 */ 0xE5 /* 'e' -> */,
@ -205,7 +205,7 @@
/* pos 0156: 144 */ 0xEC /* 'l' -> */,
/* pos 0157: 145 */ 0xAD /* '-' -> */,
/* pos 0158: 146 */ 0x72 /* 'r' */, 0x07, 0x00 /* (to 0x015F state 147) */,
0x61 /* 'a' */, 0x44, 0x01 /* (to 0x029F state 350) */,
0x61 /* 'a' */, 0x47, 0x01 /* (to 0x02A2 state 350) */,
0x08, /* fail */
/* pos 015f: 147 */ 0xE5 /* 'e' -> */,
/* pos 0160: 148 */ 0xF1 /* 'q' -> */,
@ -227,11 +227,11 @@
/* pos 0171: 164 */ 0xAD /* '-' -> */,
/* pos 0172: 165 */ 0x6D /* 'm' */, 0x0D, 0x00 /* (to 0x017F state 166) */,
0x6E /* 'n' */, 0x20, 0x00 /* (to 0x0195 state 181) */,
0x72 /* 'r' */, 0x90, 0x01 /* (to 0x0308 state 431) */,
0x75 /* 'u' */, 0x94, 0x01 /* (to 0x030F state 437) */,
0x72 /* 'r' */, 0x9D, 0x01 /* (to 0x0315 state 440) */,
0x75 /* 'u' */, 0xA1, 0x01 /* (to 0x031C state 446) */,
0x08, /* fail */
/* pos 017f: 166 */ 0x6F /* 'o' */, 0x07, 0x00 /* (to 0x0186 state 167) */,
0x61 /* 'a' */, 0x80, 0x01 /* (to 0x0302 state 426) */,
0x61 /* 'a' */, 0x8D, 0x01 /* (to 0x030F state 435) */,
0x08, /* fail */
/* pos 0186: 167 */ 0xE4 /* 'd' -> */,
/* pos 0187: 168 */ 0xE9 /* 'i' -> */,
@ -260,8 +260,8 @@
/* pos 019f: 191 */ 0x00, 0x14 /* - terminal marker 20 - */,
/* pos 01a1: 192 */ 0x65 /* 'e' */, 0x0D, 0x00 /* (to 0x01AE state 193) */,
0x6C /* 'l' */, 0x14, 0x00 /* (to 0x01B8 state 202) */,
0x63 /* 'c' */, 0xE7, 0x00 /* (to 0x028E state 335) */,
0x72 /* 'r' */, 0xED, 0x00 /* (to 0x0297 state 343) */,
0x63 /* 'c' */, 0xEA, 0x00 /* (to 0x0291 state 335) */,
0x72 /* 'r' */, 0xF0, 0x00 /* (to 0x029A state 343) */,
0x08, /* fail */
/* pos 01ae: 193 */ 0xEE /* 'n' -> */,
/* pos 01af: 194 */ 0xE3 /* 'c' -> */,
@ -282,7 +282,7 @@
/* pos 01bf: 209 */ 0xBA /* ':' -> */,
/* pos 01c0: 210 */ 0x00, 0x16 /* - terminal marker 22 - */,
/* pos 01c2: 211 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x01C9 state 212) */,
0x6F /* 'o' */, 0x90, 0x01 /* (to 0x0355 state 493) */,
0x6F /* 'o' */, 0x9D, 0x01 /* (to 0x0362 state 502) */,
0x08, /* fail */
/* pos 01c9: 212 */ 0xE7 /* 'g' -> */,
/* pos 01ca: 213 */ 0xED /* 'm' -> */,
@ -324,409 +324,419 @@
/* pos 01f2: 249 */ 0xEE /* 'n' -> */,
/* pos 01f3: 250 */ 0xF4 /* 't' -> */,
/* pos 01f4: 251 */ 0xAD /* '-' -> */,
/* pos 01f5: 252 */ 0x6C /* 'l' */, 0x0D, 0x00 /* (to 0x0202 state 253) */,
0x74 /* 't' */, 0x1B, 0x00 /* (to 0x0213 state 260) */,
0x64 /* 'd' */, 0xBC, 0x00 /* (to 0x02B7 state 371) */,
0x72 /* 'r' */, 0xD8, 0x00 /* (to 0x02D6 state 399) */,
/* pos 01f5: 252 */ 0x6C /* 'l' */, 0x10, 0x00 /* (to 0x0205 state 253) */,
0x74 /* 't' */, 0x1E, 0x00 /* (to 0x0216 state 260) */,
0x64 /* 'd' */, 0xBF, 0x00 /* (to 0x02BA state 371) */,
0x65 /* 'e' */, 0xC9, 0x00 /* (to 0x02C7 state 383) */,
0x72 /* 'r' */, 0xE2, 0x00 /* (to 0x02E3 state 408) */,
0x08, /* fail */
/* pos 0202: 253 */ 0x65 /* 'e' */, 0x0A, 0x00 /* (to 0x020C state 254) */,
0x61 /* 'a' */, 0xBF, 0x00 /* (to 0x02C4 state 383) */,
0x6F /* 'o' */, 0xC5, 0x00 /* (to 0x02CD state 391) */,
/* pos 0205: 253 */ 0x65 /* 'e' */, 0x0A, 0x00 /* (to 0x020F state 254) */,
0x61 /* 'a' */, 0xC9, 0x00 /* (to 0x02D1 state 392) */,
0x6F /* 'o' */, 0xCF, 0x00 /* (to 0x02DA state 400) */,
0x08, /* fail */
/* pos 020c: 254 */ 0xEE /* 'n' -> */,
/* pos 020d: 255 */ 0xE7 /* 'g' -> */,
/* pos 020e: 256 */ 0xF4 /* 't' -> */,
/* pos 020f: 257 */ 0xE8 /* 'h' -> */,
/* pos 0210: 258 */ 0xBA /* ':' -> */,
/* pos 0211: 259 */ 0x00, 0x1B /* - terminal marker 27 - */,
/* pos 0213: 260 */ 0xF9 /* 'y' -> */,
/* pos 0214: 261 */ 0xF0 /* 'p' -> */,
/* pos 0215: 262 */ 0xE5 /* 'e' -> */,
/* pos 0216: 263 */ 0xBA /* ':' -> */,
/* pos 0217: 264 */ 0x00, 0x1C /* - terminal marker 28 - */,
/* pos 0219: 265 */ 0xE1 /* 'a' -> */,
/* pos 021a: 266 */ 0xF4 /* 't' -> */,
/* pos 021b: 267 */ 0xE5 /* 'e' -> */,
/* pos 021c: 268 */ 0xBA /* ':' -> */,
/* pos 021d: 269 */ 0x00, 0x1D /* - terminal marker 29 - */,
/* pos 021f: 270 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x0226 state 271) */,
0x65 /* 'e' */, 0x0A, 0x00 /* (to 0x022C state 276) */,
/* pos 020f: 254 */ 0xEE /* 'n' -> */,
/* pos 0210: 255 */ 0xE7 /* 'g' -> */,
/* pos 0211: 256 */ 0xF4 /* 't' -> */,
/* pos 0212: 257 */ 0xE8 /* 'h' -> */,
/* pos 0213: 258 */ 0xBA /* ':' -> */,
/* pos 0214: 259 */ 0x00, 0x1B /* - terminal marker 27 - */,
/* pos 0216: 260 */ 0xF9 /* 'y' -> */,
/* pos 0217: 261 */ 0xF0 /* 'p' -> */,
/* pos 0218: 262 */ 0xE5 /* 'e' -> */,
/* pos 0219: 263 */ 0xBA /* ':' -> */,
/* pos 021a: 264 */ 0x00, 0x1C /* - terminal marker 28 - */,
/* pos 021c: 265 */ 0xE1 /* 'a' -> */,
/* pos 021d: 266 */ 0xF4 /* 't' -> */,
/* pos 021e: 267 */ 0xE5 /* 'e' -> */,
/* pos 021f: 268 */ 0xBA /* ':' -> */,
/* pos 0220: 269 */ 0x00, 0x1D /* - terminal marker 29 - */,
/* pos 0222: 270 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x0229 state 271) */,
0x65 /* 'e' */, 0x0A, 0x00 /* (to 0x022F state 276) */,
0x08, /* fail */
/* pos 0226: 271 */ 0xEE /* 'n' -> */,
/* pos 0227: 272 */ 0xE7 /* 'g' -> */,
/* pos 0228: 273 */ 0xE5 /* 'e' -> */,
/* pos 0229: 274 */ 0xBA /* ':' -> */,
/* pos 022a: 275 */ 0x00, 0x1E /* - terminal marker 30 - */,
/* pos 022c: 276 */ 0x66 /* 'f' */, 0x07, 0x00 /* (to 0x0233 state 277) */,
0x74 /* 't' */, 0x4F, 0x01 /* (to 0x037E state 525) */,
/* pos 0229: 271 */ 0xEE /* 'n' -> */,
/* pos 022a: 272 */ 0xE7 /* 'g' -> */,
/* pos 022b: 273 */ 0xE5 /* 'e' -> */,
/* pos 022c: 274 */ 0xBA /* ':' -> */,
/* pos 022d: 275 */ 0x00, 0x1E /* - terminal marker 30 - */,
/* pos 022f: 276 */ 0x66 /* 'f' */, 0x07, 0x00 /* (to 0x0236 state 277) */,
0x74 /* 't' */, 0x59, 0x01 /* (to 0x038B state 534) */,
0x08, /* fail */
/* pos 0233: 277 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x023A state 278) */,
0x72 /* 'r' */, 0x42, 0x01 /* (to 0x0378 state 520) */,
/* pos 0236: 277 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x023D state 278) */,
0x72 /* 'r' */, 0x4C, 0x01 /* (to 0x0385 state 529) */,
0x08, /* fail */
/* pos 023a: 278 */ 0xF2 /* 'r' -> */,
/* pos 023b: 279 */ 0xE5 /* 'e' -> */,
/* pos 023c: 280 */ 0xF2 /* 'r' -> */,
/* pos 023d: 281 */ 0xBA /* ':' -> */,
/* pos 023e: 282 */ 0x00, 0x1F /* - terminal marker 31 - */,
/* pos 0240: 283 */ 0x00, 0x20 /* - terminal marker 32 - */,
/* pos 0242: 284 */ 0xE5 /* 'e' -> */,
/* pos 0243: 285 */ 0xF2 /* 'r' -> */,
/* pos 0244: 286 */ 0xF3 /* 's' -> */,
/* pos 0245: 287 */ 0xE9 /* 'i' -> */,
/* pos 0246: 288 */ 0xEF /* 'o' -> */,
/* pos 0247: 289 */ 0xEE /* 'n' -> */,
/* pos 0248: 290 */ 0xBA /* ':' -> */,
/* pos 0249: 291 */ 0x00, 0x21 /* - terminal marker 33 - */,
/* pos 024b: 292 */ 0xF2 /* 'r' -> */,
/* pos 024c: 293 */ 0xE9 /* 'i' -> */,
/* pos 024d: 294 */ 0xE7 /* 'g' -> */,
/* pos 024e: 295 */ 0xE9 /* 'i' -> */,
/* pos 024f: 296 */ 0xEE /* 'n' -> */,
/* pos 0250: 297 */ 0xBA /* ':' -> */,
/* pos 0251: 298 */ 0x00, 0x22 /* - terminal marker 34 - */,
/* pos 0253: 299 */ 0x61 /* 'a' */, 0x0D, 0x00 /* (to 0x0260 state 300) */,
0x6D /* 'm' */, 0x15, 0x00 /* (to 0x026B state 310) */,
0x70 /* 'p' */, 0x1A, 0x00 /* (to 0x0273 state 317) */,
0x73 /* 's' */, 0x1D, 0x00 /* (to 0x0279 state 322) */,
/* pos 023d: 278 */ 0xF2 /* 'r' -> */,
/* pos 023e: 279 */ 0xE5 /* 'e' -> */,
/* pos 023f: 280 */ 0xF2 /* 'r' -> */,
/* pos 0240: 281 */ 0xBA /* ':' -> */,
/* pos 0241: 282 */ 0x00, 0x1F /* - terminal marker 31 - */,
/* pos 0243: 283 */ 0x00, 0x20 /* - terminal marker 32 - */,
/* pos 0245: 284 */ 0xE5 /* 'e' -> */,
/* pos 0246: 285 */ 0xF2 /* 'r' -> */,
/* pos 0247: 286 */ 0xF3 /* 's' -> */,
/* pos 0248: 287 */ 0xE9 /* 'i' -> */,
/* pos 0249: 288 */ 0xEF /* 'o' -> */,
/* pos 024a: 289 */ 0xEE /* 'n' -> */,
/* pos 024b: 290 */ 0xBA /* ':' -> */,
/* pos 024c: 291 */ 0x00, 0x21 /* - terminal marker 33 - */,
/* pos 024e: 292 */ 0xF2 /* 'r' -> */,
/* pos 024f: 293 */ 0xE9 /* 'i' -> */,
/* pos 0250: 294 */ 0xE7 /* 'g' -> */,
/* pos 0251: 295 */ 0xE9 /* 'i' -> */,
/* pos 0252: 296 */ 0xEE /* 'n' -> */,
/* pos 0253: 297 */ 0xBA /* ':' -> */,
/* pos 0254: 298 */ 0x00, 0x22 /* - terminal marker 34 - */,
/* pos 0256: 299 */ 0x61 /* 'a' */, 0x0D, 0x00 /* (to 0x0263 state 300) */,
0x6D /* 'm' */, 0x15, 0x00 /* (to 0x026E state 310) */,
0x70 /* 'p' */, 0x1A, 0x00 /* (to 0x0276 state 317) */,
0x73 /* 's' */, 0x1D, 0x00 /* (to 0x027C state 322) */,
0x08, /* fail */
/* pos 0260: 300 */ 0xF5 /* 'u' -> */,
/* pos 0261: 301 */ 0xF4 /* 't' -> */,
/* pos 0262: 302 */ 0xE8 /* 'h' -> */,
/* pos 0263: 303 */ 0xEF /* 'o' -> */,
/* pos 0264: 304 */ 0xF2 /* 'r' -> */,
/* pos 0265: 305 */ 0xE9 /* 'i' -> */,
/* pos 0266: 306 */ 0xF4 /* 't' -> */,
/* pos 0267: 307 */ 0xF9 /* 'y' -> */,
/* pos 0268: 308 */ 0xBA /* ':' -> */,
/* pos 0269: 309 */ 0x00, 0x23 /* - terminal marker 35 - */,
/* pos 026b: 310 */ 0xE5 /* 'e' -> */,
/* pos 026c: 311 */ 0xF4 /* 't' -> */,
/* pos 026d: 312 */ 0xE8 /* 'h' -> */,
/* pos 026e: 313 */ 0xEF /* 'o' -> */,
/* pos 026f: 314 */ 0xE4 /* 'd' -> */,
/* pos 0270: 315 */ 0xBA /* ':' -> */,
/* pos 0271: 316 */ 0x00, 0x24 /* - terminal marker 36 - */,
/* pos 0273: 317 */ 0xE1 /* 'a' -> */,
/* pos 0274: 318 */ 0xF4 /* 't' -> */,
/* pos 0275: 319 */ 0xE8 /* 'h' -> */,
/* pos 0276: 320 */ 0xBA /* ':' -> */,
/* pos 0277: 321 */ 0x00, 0x25 /* - terminal marker 37 - */,
/* pos 0279: 322 */ 0x63 /* 'c' */, 0x07, 0x00 /* (to 0x0280 state 323) */,
0x74 /* 't' */, 0x0B, 0x00 /* (to 0x0287 state 329) */,
/* pos 0263: 300 */ 0xF5 /* 'u' -> */,
/* pos 0264: 301 */ 0xF4 /* 't' -> */,
/* pos 0265: 302 */ 0xE8 /* 'h' -> */,
/* pos 0266: 303 */ 0xEF /* 'o' -> */,
/* pos 0267: 304 */ 0xF2 /* 'r' -> */,
/* pos 0268: 305 */ 0xE9 /* 'i' -> */,
/* pos 0269: 306 */ 0xF4 /* 't' -> */,
/* pos 026a: 307 */ 0xF9 /* 'y' -> */,
/* pos 026b: 308 */ 0xBA /* ':' -> */,
/* pos 026c: 309 */ 0x00, 0x23 /* - terminal marker 35 - */,
/* pos 026e: 310 */ 0xE5 /* 'e' -> */,
/* pos 026f: 311 */ 0xF4 /* 't' -> */,
/* pos 0270: 312 */ 0xE8 /* 'h' -> */,
/* pos 0271: 313 */ 0xEF /* 'o' -> */,
/* pos 0272: 314 */ 0xE4 /* 'd' -> */,
/* pos 0273: 315 */ 0xBA /* ':' -> */,
/* pos 0274: 316 */ 0x00, 0x24 /* - terminal marker 36 - */,
/* pos 0276: 317 */ 0xE1 /* 'a' -> */,
/* pos 0277: 318 */ 0xF4 /* 't' -> */,
/* pos 0278: 319 */ 0xE8 /* 'h' -> */,
/* pos 0279: 320 */ 0xBA /* ':' -> */,
/* pos 027a: 321 */ 0x00, 0x25 /* - terminal marker 37 - */,
/* pos 027c: 322 */ 0x63 /* 'c' */, 0x07, 0x00 /* (to 0x0283 state 323) */,
0x74 /* 't' */, 0x0B, 0x00 /* (to 0x028A state 329) */,
0x08, /* fail */
/* pos 0280: 323 */ 0xE8 /* 'h' -> */,
/* pos 0281: 324 */ 0xE5 /* 'e' -> */,
/* pos 0282: 325 */ 0xED /* 'm' -> */,
/* pos 0283: 326 */ 0xE5 /* 'e' -> */,
/* pos 0284: 327 */ 0xBA /* ':' -> */,
/* pos 0285: 328 */ 0x00, 0x26 /* - terminal marker 38 - */,
/* pos 0287: 329 */ 0xE1 /* 'a' -> */,
/* pos 0288: 330 */ 0xF4 /* 't' -> */,
/* pos 0289: 331 */ 0xF5 /* 'u' -> */,
/* pos 028a: 332 */ 0xF3 /* 's' -> */,
/* pos 028b: 333 */ 0xBA /* ':' -> */,
/* pos 028c: 334 */ 0x00, 0x27 /* - terminal marker 39 - */,
/* pos 028e: 335 */ 0xE8 /* 'h' -> */,
/* pos 028f: 336 */ 0xE1 /* 'a' -> */,
/* pos 0290: 337 */ 0xF2 /* 'r' -> */,
/* pos 0291: 338 */ 0xF3 /* 's' -> */,
/* pos 0292: 339 */ 0xE5 /* 'e' -> */,
/* pos 0293: 340 */ 0xF4 /* 't' -> */,
/* pos 0294: 341 */ 0xBA /* ':' -> */,
/* pos 0295: 342 */ 0x00, 0x28 /* - terminal marker 40 - */,
/* pos 0297: 343 */ 0xE1 /* 'a' -> */,
/* pos 0298: 344 */ 0xEE /* 'n' -> */,
/* pos 0299: 345 */ 0xE7 /* 'g' -> */,
/* pos 029a: 346 */ 0xE5 /* 'e' -> */,
/* pos 029b: 347 */ 0xF3 /* 's' -> */,
/* pos 029c: 348 */ 0xBA /* ':' -> */,
/* pos 029d: 349 */ 0x00, 0x29 /* - terminal marker 41 - */,
/* pos 029f: 350 */ 0xEC /* 'l' -> */,
/* pos 02a0: 351 */ 0xEC /* 'l' -> */,
/* pos 02a1: 352 */ 0xEF /* 'o' -> */,
/* pos 02a2: 353 */ 0xF7 /* 'w' -> */,
/* pos 02a3: 354 */ 0xAD /* '-' -> */,
/* pos 02a4: 355 */ 0xEF /* 'o' -> */,
/* pos 02a5: 356 */ 0xF2 /* 'r' -> */,
/* pos 02a6: 357 */ 0xE9 /* 'i' -> */,
/* pos 02a7: 358 */ 0xE7 /* 'g' -> */,
/* pos 02a8: 359 */ 0xE9 /* 'i' -> */,
/* pos 02a9: 360 */ 0xEE /* 'n' -> */,
/* pos 02aa: 361 */ 0xBA /* ':' -> */,
/* pos 02ab: 362 */ 0x00, 0x2A /* - terminal marker 42 - */,
/* pos 02ad: 363 */ 0xE5 /* 'e' -> */,
/* pos 02ae: 364 */ 0xBA /* ':' -> */,
/* pos 02af: 365 */ 0x00, 0x2B /* - terminal marker 43 - */,
/* pos 02b1: 366 */ 0xEC /* 'l' -> */,
/* pos 02b2: 367 */ 0xEF /* 'o' -> */,
/* pos 02b3: 368 */ 0xF7 /* 'w' -> */,
/* pos 02b4: 369 */ 0xBA /* ':' -> */,
/* pos 02b5: 370 */ 0x00, 0x2C /* - terminal marker 44 - */,
/* pos 02b7: 371 */ 0xE9 /* 'i' -> */,
/* pos 02b8: 372 */ 0xF3 /* 's' -> */,
/* pos 02b9: 373 */ 0xF0 /* 'p' -> */,
/* pos 02ba: 374 */ 0xEF /* 'o' -> */,
/* pos 02bb: 375 */ 0xF3 /* 's' -> */,
/* pos 02bc: 376 */ 0xE9 /* 'i' -> */,
/* pos 02bd: 377 */ 0xF4 /* 't' -> */,
/* pos 02be: 378 */ 0xE9 /* 'i' -> */,
/* pos 02bf: 379 */ 0xEF /* 'o' -> */,
/* pos 02c0: 380 */ 0xEE /* 'n' -> */,
/* pos 02c1: 381 */ 0xBA /* ':' -> */,
/* pos 02c2: 382 */ 0x00, 0x2D /* - terminal marker 45 - */,
/* pos 02c4: 383 */ 0xEE /* 'n' -> */,
/* pos 02c5: 384 */ 0xE7 /* 'g' -> */,
/* pos 02c6: 385 */ 0xF5 /* 'u' -> */,
/* pos 02c7: 386 */ 0xE1 /* 'a' -> */,
/* pos 02c8: 387 */ 0xE7 /* 'g' -> */,
/* pos 02c9: 388 */ 0xE5 /* 'e' -> */,
/* pos 02ca: 389 */ 0xBA /* ':' -> */,
/* pos 02cb: 390 */ 0x00, 0x2E /* - terminal marker 46 - */,
/* pos 02cd: 391 */ 0xE3 /* 'c' -> */,
/* pos 02ce: 392 */ 0xE1 /* 'a' -> */,
/* pos 02cf: 393 */ 0xF4 /* 't' -> */,
/* pos 02d0: 394 */ 0xE9 /* 'i' -> */,
/* pos 02d1: 395 */ 0xEF /* 'o' -> */,
/* pos 02d2: 396 */ 0xEE /* 'n' -> */,
/* pos 02d3: 397 */ 0xBA /* ':' -> */,
/* pos 02d4: 398 */ 0x00, 0x2F /* - terminal marker 47 - */,
/* pos 02d6: 399 */ 0xE1 /* 'a' -> */,
/* pos 02d7: 400 */ 0xEE /* 'n' -> */,
/* pos 02d8: 401 */ 0xE7 /* 'g' -> */,
/* pos 02d9: 402 */ 0xE5 /* 'e' -> */,
/* pos 02da: 403 */ 0xBA /* ':' -> */,
/* pos 02db: 404 */ 0x00, 0x30 /* - terminal marker 48 - */,
/* pos 02dd: 405 */ 0x74 /* 't' */, 0x07, 0x00 /* (to 0x02E4 state 406) */,
0x78 /* 'x' */, 0x09, 0x00 /* (to 0x02E9 state 410) */,
/* pos 0283: 323 */ 0xE8 /* 'h' -> */,
/* pos 0284: 324 */ 0xE5 /* 'e' -> */,
/* pos 0285: 325 */ 0xED /* 'm' -> */,
/* pos 0286: 326 */ 0xE5 /* 'e' -> */,
/* pos 0287: 327 */ 0xBA /* ':' -> */,
/* pos 0288: 328 */ 0x00, 0x26 /* - terminal marker 38 - */,
/* pos 028a: 329 */ 0xE1 /* 'a' -> */,
/* pos 028b: 330 */ 0xF4 /* 't' -> */,
/* pos 028c: 331 */ 0xF5 /* 'u' -> */,
/* pos 028d: 332 */ 0xF3 /* 's' -> */,
/* pos 028e: 333 */ 0xBA /* ':' -> */,
/* pos 028f: 334 */ 0x00, 0x27 /* - terminal marker 39 - */,
/* pos 0291: 335 */ 0xE8 /* 'h' -> */,
/* pos 0292: 336 */ 0xE1 /* 'a' -> */,
/* pos 0293: 337 */ 0xF2 /* 'r' -> */,
/* pos 0294: 338 */ 0xF3 /* 's' -> */,
/* pos 0295: 339 */ 0xE5 /* 'e' -> */,
/* pos 0296: 340 */ 0xF4 /* 't' -> */,
/* pos 0297: 341 */ 0xBA /* ':' -> */,
/* pos 0298: 342 */ 0x00, 0x28 /* - terminal marker 40 - */,
/* pos 029a: 343 */ 0xE1 /* 'a' -> */,
/* pos 029b: 344 */ 0xEE /* 'n' -> */,
/* pos 029c: 345 */ 0xE7 /* 'g' -> */,
/* pos 029d: 346 */ 0xE5 /* 'e' -> */,
/* pos 029e: 347 */ 0xF3 /* 's' -> */,
/* pos 029f: 348 */ 0xBA /* ':' -> */,
/* pos 02a0: 349 */ 0x00, 0x29 /* - terminal marker 41 - */,
/* pos 02a2: 350 */ 0xEC /* 'l' -> */,
/* pos 02a3: 351 */ 0xEC /* 'l' -> */,
/* pos 02a4: 352 */ 0xEF /* 'o' -> */,
/* pos 02a5: 353 */ 0xF7 /* 'w' -> */,
/* pos 02a6: 354 */ 0xAD /* '-' -> */,
/* pos 02a7: 355 */ 0xEF /* 'o' -> */,
/* pos 02a8: 356 */ 0xF2 /* 'r' -> */,
/* pos 02a9: 357 */ 0xE9 /* 'i' -> */,
/* pos 02aa: 358 */ 0xE7 /* 'g' -> */,
/* pos 02ab: 359 */ 0xE9 /* 'i' -> */,
/* pos 02ac: 360 */ 0xEE /* 'n' -> */,
/* pos 02ad: 361 */ 0xBA /* ':' -> */,
/* pos 02ae: 362 */ 0x00, 0x2A /* - terminal marker 42 - */,
/* pos 02b0: 363 */ 0xE5 /* 'e' -> */,
/* pos 02b1: 364 */ 0xBA /* ':' -> */,
/* pos 02b2: 365 */ 0x00, 0x2B /* - terminal marker 43 - */,
/* pos 02b4: 366 */ 0xEC /* 'l' -> */,
/* pos 02b5: 367 */ 0xEF /* 'o' -> */,
/* pos 02b6: 368 */ 0xF7 /* 'w' -> */,
/* pos 02b7: 369 */ 0xBA /* ':' -> */,
/* pos 02b8: 370 */ 0x00, 0x2C /* - terminal marker 44 - */,
/* pos 02ba: 371 */ 0xE9 /* 'i' -> */,
/* pos 02bb: 372 */ 0xF3 /* 's' -> */,
/* pos 02bc: 373 */ 0xF0 /* 'p' -> */,
/* pos 02bd: 374 */ 0xEF /* 'o' -> */,
/* pos 02be: 375 */ 0xF3 /* 's' -> */,
/* pos 02bf: 376 */ 0xE9 /* 'i' -> */,
/* pos 02c0: 377 */ 0xF4 /* 't' -> */,
/* pos 02c1: 378 */ 0xE9 /* 'i' -> */,
/* pos 02c2: 379 */ 0xEF /* 'o' -> */,
/* pos 02c3: 380 */ 0xEE /* 'n' -> */,
/* pos 02c4: 381 */ 0xBA /* ':' -> */,
/* pos 02c5: 382 */ 0x00, 0x2D /* - terminal marker 45 - */,
/* pos 02c7: 383 */ 0xEE /* 'n' -> */,
/* pos 02c8: 384 */ 0xE3 /* 'c' -> */,
/* pos 02c9: 385 */ 0xEF /* 'o' -> */,
/* pos 02ca: 386 */ 0xE4 /* 'd' -> */,
/* pos 02cb: 387 */ 0xE9 /* 'i' -> */,
/* pos 02cc: 388 */ 0xEE /* 'n' -> */,
/* pos 02cd: 389 */ 0xE7 /* 'g' -> */,
/* pos 02ce: 390 */ 0xBA /* ':' -> */,
/* pos 02cf: 391 */ 0x00, 0x2E /* - terminal marker 46 - */,
/* pos 02d1: 392 */ 0xEE /* 'n' -> */,
/* pos 02d2: 393 */ 0xE7 /* 'g' -> */,
/* pos 02d3: 394 */ 0xF5 /* 'u' -> */,
/* pos 02d4: 395 */ 0xE1 /* 'a' -> */,
/* pos 02d5: 396 */ 0xE7 /* 'g' -> */,
/* pos 02d6: 397 */ 0xE5 /* 'e' -> */,
/* pos 02d7: 398 */ 0xBA /* ':' -> */,
/* pos 02d8: 399 */ 0x00, 0x2F /* - terminal marker 47 - */,
/* pos 02da: 400 */ 0xE3 /* 'c' -> */,
/* pos 02db: 401 */ 0xE1 /* 'a' -> */,
/* pos 02dc: 402 */ 0xF4 /* 't' -> */,
/* pos 02dd: 403 */ 0xE9 /* 'i' -> */,
/* pos 02de: 404 */ 0xEF /* 'o' -> */,
/* pos 02df: 405 */ 0xEE /* 'n' -> */,
/* pos 02e0: 406 */ 0xBA /* ':' -> */,
/* pos 02e1: 407 */ 0x00, 0x30 /* - terminal marker 48 - */,
/* pos 02e3: 408 */ 0xE1 /* 'a' -> */,
/* pos 02e4: 409 */ 0xEE /* 'n' -> */,
/* pos 02e5: 410 */ 0xE7 /* 'g' -> */,
/* pos 02e6: 411 */ 0xE5 /* 'e' -> */,
/* pos 02e7: 412 */ 0xBA /* ':' -> */,
/* pos 02e8: 413 */ 0x00, 0x31 /* - terminal marker 49 - */,
/* pos 02ea: 414 */ 0x74 /* 't' */, 0x07, 0x00 /* (to 0x02F1 state 415) */,
0x78 /* 'x' */, 0x09, 0x00 /* (to 0x02F6 state 419) */,
0x08, /* fail */
/* pos 02e4: 406 */ 0xE1 /* 'a' -> */,
/* pos 02e5: 407 */ 0xE7 /* 'g' -> */,
/* pos 02e6: 408 */ 0xBA /* ':' -> */,
/* pos 02e7: 409 */ 0x00, 0x31 /* - terminal marker 49 - */,
/* pos 02e9: 410 */ 0xF0 /* 'p' -> */,
/* pos 02ea: 411 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x02F1 state 412) */,
0x69 /* 'i' */, 0x09, 0x00 /* (to 0x02F6 state 416) */,
/* pos 02f1: 415 */ 0xE1 /* 'a' -> */,
/* pos 02f2: 416 */ 0xE7 /* 'g' -> */,
/* pos 02f3: 417 */ 0xBA /* ':' -> */,
/* pos 02f4: 418 */ 0x00, 0x32 /* - terminal marker 50 - */,
/* pos 02f6: 419 */ 0xF0 /* 'p' -> */,
/* pos 02f7: 420 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x02FE state 421) */,
0x69 /* 'i' */, 0x09, 0x00 /* (to 0x0303 state 425) */,
0x08, /* fail */
/* pos 02f1: 412 */ 0xE3 /* 'c' -> */,
/* pos 02f2: 413 */ 0xF4 /* 't' -> */,
/* pos 02f3: 414 */ 0xBA /* ':' -> */,
/* pos 02f4: 415 */ 0x00, 0x32 /* - terminal marker 50 - */,
/* pos 02f6: 416 */ 0xF2 /* 'r' -> */,
/* pos 02f7: 417 */ 0xE5 /* 'e' -> */,
/* pos 02f8: 418 */ 0xF3 /* 's' -> */,
/* pos 02f9: 419 */ 0xBA /* ':' -> */,
/* pos 02fa: 420 */ 0x00, 0x33 /* - terminal marker 51 - */,
/* pos 02fc: 421 */ 0xF2 /* 'r' -> */,
/* pos 02fd: 422 */ 0xEF /* 'o' -> */,
/* pos 02fe: 423 */ 0xED /* 'm' -> */,
/* pos 02ff: 424 */ 0xBA /* ':' -> */,
/* pos 0300: 425 */ 0x00, 0x34 /* - terminal marker 52 - */,
/* pos 0302: 426 */ 0xF4 /* 't' -> */,
/* pos 0303: 427 */ 0xE3 /* 'c' -> */,
/* pos 0304: 428 */ 0xE8 /* 'h' -> */,
/* pos 0305: 429 */ 0xBA /* ':' -> */,
/* pos 0306: 430 */ 0x00, 0x35 /* - terminal marker 53 - */,
/* pos 0308: 431 */ 0xE1 /* 'a' -> */,
/* pos 0309: 432 */ 0xEE /* 'n' -> */,
/* pos 030a: 433 */ 0xE7 /* 'g' -> */,
/* pos 030b: 434 */ 0xE5 /* 'e' -> */,
/* pos 030c: 435 */ 0xBA /* ':' -> */,
/* pos 030d: 436 */ 0x00, 0x36 /* - terminal marker 54 - */,
/* pos 030f: 437 */ 0xEE /* 'n' -> */,
/* pos 0310: 438 */ 0xED /* 'm' -> */,
/* pos 0311: 439 */ 0xEF /* 'o' -> */,
/* pos 0312: 440 */ 0xE4 /* 'd' -> */,
/* pos 0313: 441 */ 0xE9 /* 'i' -> */,
/* pos 0314: 442 */ 0xE6 /* 'f' -> */,
/* pos 0315: 443 */ 0xE9 /* 'i' -> */,
/* pos 0316: 444 */ 0xE5 /* 'e' -> */,
/* pos 0317: 445 */ 0xE4 /* 'd' -> */,
/* pos 0318: 446 */ 0xAD /* '-' -> */,
/* pos 0319: 447 */ 0xF3 /* 's' -> */,
/* pos 031a: 448 */ 0xE9 /* 'i' -> */,
/* pos 031b: 449 */ 0xEE /* 'n' -> */,
/* pos 031c: 450 */ 0xE3 /* 'c' -> */,
/* pos 031d: 451 */ 0xE5 /* 'e' -> */,
/* pos 031e: 452 */ 0xBA /* ':' -> */,
/* pos 031f: 453 */ 0x00, 0x37 /* - terminal marker 55 - */,
/* pos 0321: 454 */ 0x61 /* 'a' */, 0x0A, 0x00 /* (to 0x032B state 455) */,
0x69 /* 'i' */, 0x15, 0x00 /* (to 0x0339 state 468) */,
0x6F /* 'o' */, 0x17, 0x00 /* (to 0x033E state 472) */,
/* pos 02fe: 421 */ 0xE3 /* 'c' -> */,
/* pos 02ff: 422 */ 0xF4 /* 't' -> */,
/* pos 0300: 423 */ 0xBA /* ':' -> */,
/* pos 0301: 424 */ 0x00, 0x33 /* - terminal marker 51 - */,
/* pos 0303: 425 */ 0xF2 /* 'r' -> */,
/* pos 0304: 426 */ 0xE5 /* 'e' -> */,
/* pos 0305: 427 */ 0xF3 /* 's' -> */,
/* pos 0306: 428 */ 0xBA /* ':' -> */,
/* pos 0307: 429 */ 0x00, 0x34 /* - terminal marker 52 - */,
/* pos 0309: 430 */ 0xF2 /* 'r' -> */,
/* pos 030a: 431 */ 0xEF /* 'o' -> */,
/* pos 030b: 432 */ 0xED /* 'm' -> */,
/* pos 030c: 433 */ 0xBA /* ':' -> */,
/* pos 030d: 434 */ 0x00, 0x35 /* - terminal marker 53 - */,
/* pos 030f: 435 */ 0xF4 /* 't' -> */,
/* pos 0310: 436 */ 0xE3 /* 'c' -> */,
/* pos 0311: 437 */ 0xE8 /* 'h' -> */,
/* pos 0312: 438 */ 0xBA /* ':' -> */,
/* pos 0313: 439 */ 0x00, 0x36 /* - terminal marker 54 - */,
/* pos 0315: 440 */ 0xE1 /* 'a' -> */,
/* pos 0316: 441 */ 0xEE /* 'n' -> */,
/* pos 0317: 442 */ 0xE7 /* 'g' -> */,
/* pos 0318: 443 */ 0xE5 /* 'e' -> */,
/* pos 0319: 444 */ 0xBA /* ':' -> */,
/* pos 031a: 445 */ 0x00, 0x37 /* - terminal marker 55 - */,
/* pos 031c: 446 */ 0xEE /* 'n' -> */,
/* pos 031d: 447 */ 0xED /* 'm' -> */,
/* pos 031e: 448 */ 0xEF /* 'o' -> */,
/* pos 031f: 449 */ 0xE4 /* 'd' -> */,
/* pos 0320: 450 */ 0xE9 /* 'i' -> */,
/* pos 0321: 451 */ 0xE6 /* 'f' -> */,
/* pos 0322: 452 */ 0xE9 /* 'i' -> */,
/* pos 0323: 453 */ 0xE5 /* 'e' -> */,
/* pos 0324: 454 */ 0xE4 /* 'd' -> */,
/* pos 0325: 455 */ 0xAD /* '-' -> */,
/* pos 0326: 456 */ 0xF3 /* 's' -> */,
/* pos 0327: 457 */ 0xE9 /* 'i' -> */,
/* pos 0328: 458 */ 0xEE /* 'n' -> */,
/* pos 0329: 459 */ 0xE3 /* 'c' -> */,
/* pos 032a: 460 */ 0xE5 /* 'e' -> */,
/* pos 032b: 461 */ 0xBA /* ':' -> */,
/* pos 032c: 462 */ 0x00, 0x38 /* - terminal marker 56 - */,
/* pos 032e: 463 */ 0x61 /* 'a' */, 0x0A, 0x00 /* (to 0x0338 state 464) */,
0x69 /* 'i' */, 0x15, 0x00 /* (to 0x0346 state 477) */,
0x6F /* 'o' */, 0x17, 0x00 /* (to 0x034B state 481) */,
0x08, /* fail */
/* pos 032b: 455 */ 0xF3 /* 's' -> */,
/* pos 032c: 456 */ 0xF4 /* 't' -> */,
/* pos 032d: 457 */ 0xAD /* '-' -> */,
/* pos 032e: 458 */ 0xED /* 'm' -> */,
/* pos 032f: 459 */ 0xEF /* 'o' -> */,
/* pos 0330: 460 */ 0xE4 /* 'd' -> */,
/* pos 0331: 461 */ 0xE9 /* 'i' -> */,
/* pos 0332: 462 */ 0xE6 /* 'f' -> */,
/* pos 0333: 463 */ 0xE9 /* 'i' -> */,
/* pos 0334: 464 */ 0xE5 /* 'e' -> */,
/* pos 0335: 465 */ 0xE4 /* 'd' -> */,
/* pos 0336: 466 */ 0xBA /* ':' -> */,
/* pos 0337: 467 */ 0x00, 0x38 /* - terminal marker 56 - */,
/* pos 0339: 468 */ 0xEE /* 'n' -> */,
/* pos 033a: 469 */ 0xEB /* 'k' -> */,
/* pos 033b: 470 */ 0xBA /* ':' -> */,
/* pos 033c: 471 */ 0x00, 0x39 /* - terminal marker 57 - */,
/* pos 033e: 472 */ 0xE3 /* 'c' -> */,
/* pos 033f: 473 */ 0xE1 /* 'a' -> */,
/* pos 0340: 474 */ 0xF4 /* 't' -> */,
/* pos 0341: 475 */ 0xE9 /* 'i' -> */,
/* pos 0342: 476 */ 0xEF /* 'o' -> */,
/* pos 0343: 477 */ 0xEE /* 'n' -> */,
/* pos 0344: 478 */ 0xBA /* ':' -> */,
/* pos 0345: 479 */ 0x00, 0x3A /* - terminal marker 58 - */,
/* pos 0347: 480 */ 0xE1 /* 'a' -> */,
/* pos 0348: 481 */ 0xF8 /* 'x' -> */,
/* pos 0349: 482 */ 0xAD /* '-' -> */,
/* pos 034a: 483 */ 0xE6 /* 'f' -> */,
/* pos 034b: 484 */ 0xEF /* 'o' -> */,
/* pos 034c: 485 */ 0xF2 /* 'r' -> */,
/* pos 034d: 486 */ 0xF7 /* 'w' -> */,
/* pos 034e: 487 */ 0xE1 /* 'a' -> */,
/* pos 034f: 488 */ 0xF2 /* 'r' -> */,
/* pos 0350: 489 */ 0xE4 /* 'd' -> */,
/* pos 0351: 490 */ 0xF3 /* 's' -> */,
/* pos 0352: 491 */ 0xBA /* ':' -> */,
/* pos 0353: 492 */ 0x00, 0x3B /* - terminal marker 59 - */,
/* pos 0355: 493 */ 0xF8 /* 'x' -> */,
/* pos 0356: 494 */ 0xF9 /* 'y' -> */,
/* pos 0357: 495 */ 0xAD /* '-' -> */,
/* pos 0358: 496 */ 0xE1 /* 'a' -> */,
/* pos 0359: 497 */ 0xF5 /* 'u' -> */,
/* pos 035a: 498 */ 0xF4 /* 't' -> */,
/* pos 035b: 499 */ 0xE8 /* 'h' -> */,
/* pos 035c: 500 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x0363 state 501) */,
0x6F /* 'o' */, 0x0E, 0x00 /* (to 0x036D state 510) */,
/* pos 0338: 464 */ 0xF3 /* 's' -> */,
/* pos 0339: 465 */ 0xF4 /* 't' -> */,
/* pos 033a: 466 */ 0xAD /* '-' -> */,
/* pos 033b: 467 */ 0xED /* 'm' -> */,
/* pos 033c: 468 */ 0xEF /* 'o' -> */,
/* pos 033d: 469 */ 0xE4 /* 'd' -> */,
/* pos 033e: 470 */ 0xE9 /* 'i' -> */,
/* pos 033f: 471 */ 0xE6 /* 'f' -> */,
/* pos 0340: 472 */ 0xE9 /* 'i' -> */,
/* pos 0341: 473 */ 0xE5 /* 'e' -> */,
/* pos 0342: 474 */ 0xE4 /* 'd' -> */,
/* pos 0343: 475 */ 0xBA /* ':' -> */,
/* pos 0344: 476 */ 0x00, 0x39 /* - terminal marker 57 - */,
/* pos 0346: 477 */ 0xEE /* 'n' -> */,
/* pos 0347: 478 */ 0xEB /* 'k' -> */,
/* pos 0348: 479 */ 0xBA /* ':' -> */,
/* pos 0349: 480 */ 0x00, 0x3A /* - terminal marker 58 - */,
/* pos 034b: 481 */ 0xE3 /* 'c' -> */,
/* pos 034c: 482 */ 0xE1 /* 'a' -> */,
/* pos 034d: 483 */ 0xF4 /* 't' -> */,
/* pos 034e: 484 */ 0xE9 /* 'i' -> */,
/* pos 034f: 485 */ 0xEF /* 'o' -> */,
/* pos 0350: 486 */ 0xEE /* 'n' -> */,
/* pos 0351: 487 */ 0xBA /* ':' -> */,
/* pos 0352: 488 */ 0x00, 0x3B /* - terminal marker 59 - */,
/* pos 0354: 489 */ 0xE1 /* 'a' -> */,
/* pos 0355: 490 */ 0xF8 /* 'x' -> */,
/* pos 0356: 491 */ 0xAD /* '-' -> */,
/* pos 0357: 492 */ 0xE6 /* 'f' -> */,
/* pos 0358: 493 */ 0xEF /* 'o' -> */,
/* pos 0359: 494 */ 0xF2 /* 'r' -> */,
/* pos 035a: 495 */ 0xF7 /* 'w' -> */,
/* pos 035b: 496 */ 0xE1 /* 'a' -> */,
/* pos 035c: 497 */ 0xF2 /* 'r' -> */,
/* pos 035d: 498 */ 0xE4 /* 'd' -> */,
/* pos 035e: 499 */ 0xF3 /* 's' -> */,
/* pos 035f: 500 */ 0xBA /* ':' -> */,
/* pos 0360: 501 */ 0x00, 0x3C /* - terminal marker 60 - */,
/* pos 0362: 502 */ 0xF8 /* 'x' -> */,
/* pos 0363: 503 */ 0xF9 /* 'y' -> */,
/* pos 0364: 504 */ 0xAD /* '-' -> */,
/* pos 0365: 505 */ 0xE1 /* 'a' -> */,
/* pos 0366: 506 */ 0xF5 /* 'u' -> */,
/* pos 0367: 507 */ 0xF4 /* 't' -> */,
/* pos 0368: 508 */ 0xE8 /* 'h' -> */,
/* pos 0369: 509 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x0370 state 510) */,
0x6F /* 'o' */, 0x0E, 0x00 /* (to 0x037A state 519) */,
0x08, /* fail */
/* pos 0363: 501 */ 0xEE /* 'n' -> */,
/* pos 0364: 502 */ 0xF4 /* 't' -> */,
/* pos 0365: 503 */ 0xE9 /* 'i' -> */,
/* pos 0366: 504 */ 0xE3 /* 'c' -> */,
/* pos 0367: 505 */ 0xE1 /* 'a' -> */,
/* pos 0368: 506 */ 0xF4 /* 't' -> */,
/* pos 0369: 507 */ 0xE5 /* 'e' -> */,
/* pos 036a: 508 */ 0xBA /* ':' -> */,
/* pos 036b: 509 */ 0x00, 0x3C /* - terminal marker 60 - */,
/* pos 036d: 510 */ 0xF2 /* 'r' -> */,
/* pos 036e: 511 */ 0xE9 /* 'i' -> */,
/* pos 036f: 512 */ 0xFA /* 'z' -> */,
/* pos 0370: 513 */ 0xE1 /* 'a' -> */,
/* pos 0371: 514 */ 0xF4 /* 't' -> */,
/* pos 0372: 515 */ 0xE9 /* 'i' -> */,
/* pos 0373: 516 */ 0xEF /* 'o' -> */,
/* pos 0374: 517 */ 0xEE /* 'n' -> */,
/* pos 0375: 518 */ 0xBA /* ':' -> */,
/* pos 0376: 519 */ 0x00, 0x3D /* - terminal marker 61 - */,
/* pos 0378: 520 */ 0xE5 /* 'e' -> */,
/* pos 0379: 521 */ 0xF3 /* 's' -> */,
/* pos 037a: 522 */ 0xE8 /* 'h' -> */,
/* pos 037b: 523 */ 0xBA /* ':' -> */,
/* pos 037c: 524 */ 0x00, 0x3E /* - terminal marker 62 - */,
/* pos 037e: 525 */ 0xF2 /* 'r' -> */,
/* pos 037f: 526 */ 0xF9 /* 'y' -> */,
/* pos 0380: 527 */ 0xAD /* '-' -> */,
/* pos 0381: 528 */ 0xE1 /* 'a' -> */,
/* pos 0382: 529 */ 0xE6 /* 'f' -> */,
/* pos 0383: 530 */ 0xF4 /* 't' -> */,
/* pos 0384: 531 */ 0xE5 /* 'e' -> */,
/* pos 0385: 532 */ 0xF2 /* 'r' -> */,
/* pos 0386: 533 */ 0xBA /* ':' -> */,
/* pos 0387: 534 */ 0x00, 0x3F /* - terminal marker 63 - */,
/* pos 0389: 535 */ 0xF6 /* 'v' -> */,
/* pos 038a: 536 */ 0xE5 /* 'e' -> */,
/* pos 038b: 537 */ 0xF2 /* 'r' -> */,
/* pos 038c: 538 */ 0xBA /* ':' -> */,
/* pos 038d: 539 */ 0x00, 0x40 /* - terminal marker 64 - */,
/* pos 038f: 540 */ 0xAD /* '-' -> */,
/* pos 0390: 541 */ 0xE3 /* 'c' -> */,
/* pos 0391: 542 */ 0xEF /* 'o' -> */,
/* pos 0392: 543 */ 0xEF /* 'o' -> */,
/* pos 0393: 544 */ 0xEB /* 'k' -> */,
/* pos 0394: 545 */ 0xE9 /* 'i' -> */,
/* pos 0395: 546 */ 0xE5 /* 'e' -> */,
/* pos 0396: 547 */ 0xBA /* ':' -> */,
/* pos 0397: 548 */ 0x00, 0x41 /* - terminal marker 65 - */,
/* pos 0399: 549 */ 0xF2 /* 'r' -> */,
/* pos 039a: 550 */ 0xE9 /* 'i' -> */,
/* pos 039b: 551 */ 0xE3 /* 'c' -> */,
/* pos 039c: 552 */ 0xF4 /* 't' -> */,
/* pos 039d: 553 */ 0xAD /* '-' -> */,
/* pos 039e: 554 */ 0xF4 /* 't' -> */,
/* pos 039f: 555 */ 0xF2 /* 'r' -> */,
/* pos 03a0: 556 */ 0xE1 /* 'a' -> */,
/* pos 03a1: 557 */ 0xEE /* 'n' -> */,
/* pos 03a2: 558 */ 0xF3 /* 's' -> */,
/* pos 03a3: 559 */ 0xF0 /* 'p' -> */,
/* pos 03a4: 560 */ 0xEF /* 'o' -> */,
/* pos 03a5: 561 */ 0xF2 /* 'r' -> */,
/* pos 03a6: 562 */ 0xF4 /* 't' -> */,
/* pos 03a7: 563 */ 0xAD /* '-' -> */,
/* pos 03a8: 564 */ 0xF3 /* 's' -> */,
/* pos 03a9: 565 */ 0xE5 /* 'e' -> */,
/* pos 03aa: 566 */ 0xE3 /* 'c' -> */,
/* pos 03ab: 567 */ 0xF5 /* 'u' -> */,
/* pos 03ac: 568 */ 0xF2 /* 'r' -> */,
/* pos 03ad: 569 */ 0xE9 /* 'i' -> */,
/* pos 03ae: 570 */ 0xF4 /* 't' -> */,
/* pos 03af: 571 */ 0xF9 /* 'y' -> */,
/* pos 03b0: 572 */ 0xBA /* ':' -> */,
/* pos 03b1: 573 */ 0x00, 0x42 /* - terminal marker 66 - */,
/* pos 03b3: 574 */ 0xF2 /* 'r' -> */,
/* pos 03b4: 575 */ 0xE1 /* 'a' -> */,
/* pos 03b5: 576 */ 0xEE /* 'n' -> */,
/* pos 03b6: 577 */ 0xF3 /* 's' -> */,
/* pos 03b7: 578 */ 0xE6 /* 'f' -> */,
/* pos 03b8: 579 */ 0xE5 /* 'e' -> */,
/* pos 03b9: 580 */ 0xF2 /* 'r' -> */,
/* pos 03ba: 581 */ 0xAD /* '-' -> */,
/* pos 03bb: 582 */ 0xE5 /* 'e' -> */,
/* pos 03bc: 583 */ 0xEE /* 'n' -> */,
/* pos 03bd: 584 */ 0xE3 /* 'c' -> */,
/* pos 03be: 585 */ 0xEF /* 'o' -> */,
/* pos 03bf: 586 */ 0xE4 /* 'd' -> */,
/* pos 03c0: 587 */ 0xE9 /* 'i' -> */,
/* pos 03c1: 588 */ 0xEE /* 'n' -> */,
/* pos 03c2: 589 */ 0xE7 /* 'g' -> */,
/* pos 03c3: 590 */ 0xBA /* ':' -> */,
/* pos 03c4: 591 */ 0x00, 0x43 /* - terminal marker 67 - */,
/* pos 03c6: 592 */ 0xE5 /* 'e' -> */,
/* pos 03c7: 593 */ 0xF2 /* 'r' -> */,
/* pos 03c8: 594 */ 0xAD /* '-' -> */,
/* pos 03c9: 595 */ 0xE1 /* 'a' -> */,
/* pos 03ca: 596 */ 0xE7 /* 'g' -> */,
/* pos 03cb: 597 */ 0xE5 /* 'e' -> */,
/* pos 03cc: 598 */ 0xEE /* 'n' -> */,
/* pos 03cd: 599 */ 0xF4 /* 't' -> */,
/* pos 03ce: 600 */ 0xBA /* ':' -> */,
/* pos 03cf: 601 */ 0x00, 0x44 /* - terminal marker 68 - */,
/* pos 03d1: 602 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x03D8 state 603) */,
0x69 /* 'i' */, 0x09, 0x00 /* (to 0x03DD state 607) */,
/* pos 0370: 510 */ 0xEE /* 'n' -> */,
/* pos 0371: 511 */ 0xF4 /* 't' -> */,
/* pos 0372: 512 */ 0xE9 /* 'i' -> */,
/* pos 0373: 513 */ 0xE3 /* 'c' -> */,
/* pos 0374: 514 */ 0xE1 /* 'a' -> */,
/* pos 0375: 515 */ 0xF4 /* 't' -> */,
/* pos 0376: 516 */ 0xE5 /* 'e' -> */,
/* pos 0377: 517 */ 0xBA /* ':' -> */,
/* pos 0378: 518 */ 0x00, 0x3D /* - terminal marker 61 - */,
/* pos 037a: 519 */ 0xF2 /* 'r' -> */,
/* pos 037b: 520 */ 0xE9 /* 'i' -> */,
/* pos 037c: 521 */ 0xFA /* 'z' -> */,
/* pos 037d: 522 */ 0xE1 /* 'a' -> */,
/* pos 037e: 523 */ 0xF4 /* 't' -> */,
/* pos 037f: 524 */ 0xE9 /* 'i' -> */,
/* pos 0380: 525 */ 0xEF /* 'o' -> */,
/* pos 0381: 526 */ 0xEE /* 'n' -> */,
/* pos 0382: 527 */ 0xBA /* ':' -> */,
/* pos 0383: 528 */ 0x00, 0x3E /* - terminal marker 62 - */,
/* pos 0385: 529 */ 0xE5 /* 'e' -> */,
/* pos 0386: 530 */ 0xF3 /* 's' -> */,
/* pos 0387: 531 */ 0xE8 /* 'h' -> */,
/* pos 0388: 532 */ 0xBA /* ':' -> */,
/* pos 0389: 533 */ 0x00, 0x3F /* - terminal marker 63 - */,
/* pos 038b: 534 */ 0xF2 /* 'r' -> */,
/* pos 038c: 535 */ 0xF9 /* 'y' -> */,
/* pos 038d: 536 */ 0xAD /* '-' -> */,
/* pos 038e: 537 */ 0xE1 /* 'a' -> */,
/* pos 038f: 538 */ 0xE6 /* 'f' -> */,
/* pos 0390: 539 */ 0xF4 /* 't' -> */,
/* pos 0391: 540 */ 0xE5 /* 'e' -> */,
/* pos 0392: 541 */ 0xF2 /* 'r' -> */,
/* pos 0393: 542 */ 0xBA /* ':' -> */,
/* pos 0394: 543 */ 0x00, 0x40 /* - terminal marker 64 - */,
/* pos 0396: 544 */ 0xF6 /* 'v' -> */,
/* pos 0397: 545 */ 0xE5 /* 'e' -> */,
/* pos 0398: 546 */ 0xF2 /* 'r' -> */,
/* pos 0399: 547 */ 0xBA /* ':' -> */,
/* pos 039a: 548 */ 0x00, 0x41 /* - terminal marker 65 - */,
/* pos 039c: 549 */ 0xAD /* '-' -> */,
/* pos 039d: 550 */ 0xE3 /* 'c' -> */,
/* pos 039e: 551 */ 0xEF /* 'o' -> */,
/* pos 039f: 552 */ 0xEF /* 'o' -> */,
/* pos 03a0: 553 */ 0xEB /* 'k' -> */,
/* pos 03a1: 554 */ 0xE9 /* 'i' -> */,
/* pos 03a2: 555 */ 0xE5 /* 'e' -> */,
/* pos 03a3: 556 */ 0xBA /* ':' -> */,
/* pos 03a4: 557 */ 0x00, 0x42 /* - terminal marker 66 - */,
/* pos 03a6: 558 */ 0xF2 /* 'r' -> */,
/* pos 03a7: 559 */ 0xE9 /* 'i' -> */,
/* pos 03a8: 560 */ 0xE3 /* 'c' -> */,
/* pos 03a9: 561 */ 0xF4 /* 't' -> */,
/* pos 03aa: 562 */ 0xAD /* '-' -> */,
/* pos 03ab: 563 */ 0xF4 /* 't' -> */,
/* pos 03ac: 564 */ 0xF2 /* 'r' -> */,
/* pos 03ad: 565 */ 0xE1 /* 'a' -> */,
/* pos 03ae: 566 */ 0xEE /* 'n' -> */,
/* pos 03af: 567 */ 0xF3 /* 's' -> */,
/* pos 03b0: 568 */ 0xF0 /* 'p' -> */,
/* pos 03b1: 569 */ 0xEF /* 'o' -> */,
/* pos 03b2: 570 */ 0xF2 /* 'r' -> */,
/* pos 03b3: 571 */ 0xF4 /* 't' -> */,
/* pos 03b4: 572 */ 0xAD /* '-' -> */,
/* pos 03b5: 573 */ 0xF3 /* 's' -> */,
/* pos 03b6: 574 */ 0xE5 /* 'e' -> */,
/* pos 03b7: 575 */ 0xE3 /* 'c' -> */,
/* pos 03b8: 576 */ 0xF5 /* 'u' -> */,
/* pos 03b9: 577 */ 0xF2 /* 'r' -> */,
/* pos 03ba: 578 */ 0xE9 /* 'i' -> */,
/* pos 03bb: 579 */ 0xF4 /* 't' -> */,
/* pos 03bc: 580 */ 0xF9 /* 'y' -> */,
/* pos 03bd: 581 */ 0xBA /* ':' -> */,
/* pos 03be: 582 */ 0x00, 0x43 /* - terminal marker 67 - */,
/* pos 03c0: 583 */ 0xF2 /* 'r' -> */,
/* pos 03c1: 584 */ 0xE1 /* 'a' -> */,
/* pos 03c2: 585 */ 0xEE /* 'n' -> */,
/* pos 03c3: 586 */ 0xF3 /* 's' -> */,
/* pos 03c4: 587 */ 0xE6 /* 'f' -> */,
/* pos 03c5: 588 */ 0xE5 /* 'e' -> */,
/* pos 03c6: 589 */ 0xF2 /* 'r' -> */,
/* pos 03c7: 590 */ 0xAD /* '-' -> */,
/* pos 03c8: 591 */ 0xE5 /* 'e' -> */,
/* pos 03c9: 592 */ 0xEE /* 'n' -> */,
/* pos 03ca: 593 */ 0xE3 /* 'c' -> */,
/* pos 03cb: 594 */ 0xEF /* 'o' -> */,
/* pos 03cc: 595 */ 0xE4 /* 'd' -> */,
/* pos 03cd: 596 */ 0xE9 /* 'i' -> */,
/* pos 03ce: 597 */ 0xEE /* 'n' -> */,
/* pos 03cf: 598 */ 0xE7 /* 'g' -> */,
/* pos 03d0: 599 */ 0xBA /* ':' -> */,
/* pos 03d1: 600 */ 0x00, 0x44 /* - terminal marker 68 - */,
/* pos 03d3: 601 */ 0xE5 /* 'e' -> */,
/* pos 03d4: 602 */ 0xF2 /* 'r' -> */,
/* pos 03d5: 603 */ 0xAD /* '-' -> */,
/* pos 03d6: 604 */ 0xE1 /* 'a' -> */,
/* pos 03d7: 605 */ 0xE7 /* 'g' -> */,
/* pos 03d8: 606 */ 0xE5 /* 'e' -> */,
/* pos 03d9: 607 */ 0xEE /* 'n' -> */,
/* pos 03da: 608 */ 0xF4 /* 't' -> */,
/* pos 03db: 609 */ 0xBA /* ':' -> */,
/* pos 03dc: 610 */ 0x00, 0x45 /* - terminal marker 69 - */,
/* pos 03de: 611 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x03E5 state 612) */,
0x69 /* 'i' */, 0x09, 0x00 /* (to 0x03EA state 616) */,
0x08, /* fail */
/* pos 03d8: 603 */ 0xF2 /* 'r' -> */,
/* pos 03d9: 604 */ 0xF9 /* 'y' -> */,
/* pos 03da: 605 */ 0xBA /* ':' -> */,
/* pos 03db: 606 */ 0x00, 0x45 /* - terminal marker 69 - */,
/* pos 03dd: 607 */ 0xE1 /* 'a' -> */,
/* pos 03de: 608 */ 0xBA /* ':' -> */,
/* pos 03df: 609 */ 0x00, 0x46 /* - terminal marker 70 - */,
/* pos 03e1: 610 */ 0xF7 /* 'w' -> */,
/* pos 03e2: 611 */ 0xF7 /* 'w' -> */,
/* pos 03e3: 612 */ 0xAD /* '-' -> */,
/* pos 03e4: 613 */ 0xE1 /* 'a' -> */,
/* pos 03e5: 614 */ 0xF5 /* 'u' -> */,
/* pos 03e6: 615 */ 0xF4 /* 't' -> */,
/* pos 03e7: 616 */ 0xE8 /* 'h' -> */,
/* pos 03e8: 617 */ 0xE5 /* 'e' -> */,
/* pos 03e9: 618 */ 0xEE /* 'n' -> */,
/* pos 03ea: 619 */ 0xF4 /* 't' -> */,
/* pos 03eb: 620 */ 0xE9 /* 'i' -> */,
/* pos 03ec: 621 */ 0xE3 /* 'c' -> */,
/* pos 03ed: 622 */ 0xE1 /* 'a' -> */,
/* pos 03ee: 623 */ 0xF4 /* 't' -> */,
/* pos 03ef: 624 */ 0xE5 /* 'e' -> */,
/* pos 03f0: 625 */ 0xBA /* ':' -> */,
/* pos 03f1: 626 */ 0x00, 0x47 /* - terminal marker 71 - */,
/* total size 1011 bytes */
/* pos 03e5: 612 */ 0xF2 /* 'r' -> */,
/* pos 03e6: 613 */ 0xF9 /* 'y' -> */,
/* pos 03e7: 614 */ 0xBA /* ':' -> */,
/* pos 03e8: 615 */ 0x00, 0x46 /* - terminal marker 70 - */,
/* pos 03ea: 616 */ 0xE1 /* 'a' -> */,
/* pos 03eb: 617 */ 0xBA /* ':' -> */,
/* pos 03ec: 618 */ 0x00, 0x47 /* - terminal marker 71 - */,
/* pos 03ee: 619 */ 0xF7 /* 'w' -> */,
/* pos 03ef: 620 */ 0xF7 /* 'w' -> */,
/* pos 03f0: 621 */ 0xAD /* '-' -> */,
/* pos 03f1: 622 */ 0xE1 /* 'a' -> */,
/* pos 03f2: 623 */ 0xF5 /* 'u' -> */,
/* pos 03f3: 624 */ 0xF4 /* 't' -> */,
/* pos 03f4: 625 */ 0xE8 /* 'h' -> */,
/* pos 03f5: 626 */ 0xE5 /* 'e' -> */,
/* pos 03f6: 627 */ 0xEE /* 'n' -> */,
/* pos 03f7: 628 */ 0xF4 /* 't' -> */,
/* pos 03f8: 629 */ 0xE9 /* 'i' -> */,
/* pos 03f9: 630 */ 0xE3 /* 'c' -> */,
/* pos 03fa: 631 */ 0xE1 /* 'a' -> */,
/* pos 03fb: 632 */ 0xF4 /* 't' -> */,
/* pos 03fc: 633 */ 0xE5 /* 'e' -> */,
/* pos 03fd: 634 */ 0xBA /* ':' -> */,
/* pos 03fe: 635 */ 0x00, 0x48 /* - terminal marker 72 - */,
/* total size 1024 bytes */

View file

@ -326,18 +326,7 @@ enum lws_token_indexes {
WSI_TOKEN_KEY,
WSI_TOKEN_VERSION,
WSI_TOKEN_SWORIGIN,
WSI_TOKEN_HTTP_URI_ARGS,
/* use token storage to stash these */
_WSI_TOKEN_CLIENT_SENT_PROTOCOLS,
_WSI_TOKEN_CLIENT_PEER_ADDRESS,
_WSI_TOKEN_CLIENT_URI,
_WSI_TOKEN_CLIENT_HOST,
_WSI_TOKEN_CLIENT_ORIGIN,
#ifdef LWS_USE_HTTP2
WSI_TOKEN_HTTP_COLON_AUTHORITY,
WSI_TOKEN_HTTP_COLON_METHOD,
WSI_TOKEN_HTTP_COLON_PATH,
@ -377,7 +366,16 @@ enum lws_token_indexes {
WSI_TOKEN_HTTP_VARY,
WSI_TOKEN_HTTP_VIA,
WSI_TOKEN_HTTP_WWW_AUTHENTICATE,
#endif
WSI_TOKEN_HTTP_URI_ARGS,
/* use token storage to stash these */
_WSI_TOKEN_CLIENT_SENT_PROTOCOLS,
_WSI_TOKEN_CLIENT_PEER_ADDRESS,
_WSI_TOKEN_CLIENT_URI,
_WSI_TOKEN_CLIENT_HOST,
_WSI_TOKEN_CLIENT_ORIGIN,
/* always last real token index*/
WSI_TOKEN_COUNT,
@ -1044,6 +1042,37 @@ libwebsocket_service(struct libwebsocket_context *context, int timeout_ms);
LWS_VISIBLE LWS_EXTERN void
libwebsocket_cancel_service(struct libwebsocket_context *context);
LWS_VISIBLE LWS_EXTERN const unsigned char *
lws_token_to_string(enum lws_token_indexes token);
LWS_VISIBLE LWS_EXTERN int
lws_add_http_header_by_name(struct libwebsocket_context *context,
struct libwebsocket *wsi,
const unsigned char *name,
const unsigned char *value,
int length,
unsigned char **p,
unsigned char *end);
LWS_VISIBLE LWS_EXTERN int
lws_finalize_http_header(struct libwebsocket_context *context,
struct libwebsocket *wsi,
unsigned char **p,
unsigned char *end);
LWS_VISIBLE LWS_EXTERN int
lws_add_http_header_by_token(struct libwebsocket_context *context,
struct libwebsocket *wsi,
enum lws_token_indexes token,
const unsigned char *value,
int length,
unsigned char **p,
unsigned char *end);
LWS_VISIBLE LWS_EXTERN int
lws_add_http_header_status(struct libwebsocket_context *context,
struct libwebsocket *wsi,
unsigned int code,
unsigned char **p,
unsigned char *end);
#ifdef LWS_USE_LIBEV
LWS_VISIBLE LWS_EXTERN int
libwebsocket_initloop(
@ -1126,7 +1155,8 @@ libwebsocket_write(struct libwebsocket *wsi, unsigned char *buf, size_t len,
LWS_VISIBLE LWS_EXTERN int
libwebsockets_serve_http_file(struct libwebsocket_context *context,
struct libwebsocket *wsi, const char *file,
const char *content_type, const char *other_headers);
const char *content_type, const char *other_headers,
int other_headers_len);
LWS_VISIBLE LWS_EXTERN int
libwebsockets_serve_http_file_fragment(struct libwebsocket_context *context,
struct libwebsocket *wsi);

View file

@ -16,90 +16,7 @@
#include <stdlib.h>
#include <string.h>
/* set of parsable strings -- ALL LOWER CASE */
const char *set[] = {
"get ",
"post ",
"options ",
"host:",
"connection:",
"upgrade:",
"origin:",
"sec-websocket-draft:",
"\x0d\x0a",
"sec-websocket-extensions:",
"sec-websocket-key1:",
"sec-websocket-key2:",
"sec-websocket-protocol:",
"sec-websocket-accept:",
"sec-websocket-nonce:",
"http/1.1 ",
"http2-settings:",
"accept:",
"access-control-request-headers:",
"if-modified-since:",
"if-none-match:",
"accept-encoding:",
"accept-language:",
"pragma:",
"cache-control:",
"authorization:",
"cookie:",
"content-length:",
"content-type:",
"date:",
"range:",
"referer:",
"sec-websocket-key:",
"sec-websocket-version:",
"sec-websocket-origin:",
":authority:",
":method:",
":path:",
":scheme:",
":status:",
"accept-charset:",
"accept-ranges:",
"access-control-allow-origin:",
"age:",
"allow:",
"content-disposition:",
"content-language:",
"content-location:",
"content-range:",
"etag:",
"expect:",
"expires:",
"from:",
"if-match:",
"if-range:",
"if-unmodified-since:",
"last-modified:",
"link:",
"location:",
"max-forwards:",
"proxy-authenticate:",
"proxy-authorization:",
"refresh:",
"retry-after:",
"server:",
"set-cookie:",
"strict-transport-security:",
"transfer-encoding:",
"user-agent:",
"vary:",
"via:",
"www-authenticate:",
"", /* not matchable */
};
#include "lextable-strings.h"
/*
* b7 = 0 = 1-byte seq

View file

@ -923,6 +923,28 @@ lws_http2_wsi_from_id(struct libwebsocket *wsi, unsigned int sid);
LWS_EXTERN int lws_hpack_interpret(struct libwebsocket_context *context,
struct libwebsocket *wsi,
unsigned char c);
LWS_EXTERN int
lws_add_http2_header_by_name(struct libwebsocket_context *context,
struct libwebsocket *wsi,
const unsigned char *name,
const unsigned char *value,
int length,
unsigned char **p,
unsigned char *end);
LWS_EXTERN int
lws_add_http2_header_by_token(struct libwebsocket_context *context,
struct libwebsocket *wsi,
enum lws_token_indexes token,
const unsigned char *value,
int length,
unsigned char **p,
unsigned char *end);
LWS_EXTERN int
lws_add_http2_header_status(struct libwebsocket_context *context,
struct libwebsocket *wsi,
unsigned int code,
unsigned char **p,
unsigned char *end);
#endif
LWS_EXTERN int

View file

@ -834,6 +834,87 @@ fail:
return 1;
}
#include "lextable-strings.h"
const unsigned char *lws_token_to_string(enum lws_token_indexes token)
{
if ((unsigned int)token >= ARRAY_SIZE(set))
return NULL;
return (unsigned char *)set[token];
}
int lws_add_http_header_by_name(struct libwebsocket_context *context,
struct libwebsocket *wsi,
const unsigned char *name,
const unsigned char *value,
int length,
unsigned char **p,
unsigned char *end)
{
#ifdef LWS_USE_HTTP2
if (wsi->mode == LWS_CONNMODE_HTTP2_SERVING)
return lws_add_http2_header_by_name(context, wsi, name, value, length, p, end);
#endif
if (name) {
while (*p < end && *name)
*((*p)++) = *name++;
if (*p == end)
return 1;
*((*p)++) = ' ';
}
if (*p + length + 3 >= end)
return 1;
memcpy(*p, value, length);
*p += length;
*((*p)++) = '\x0d';
*((*p)++) = '\x0a';
return 0;
}
int lws_finalize_http_header(struct libwebsocket_context *context,
struct libwebsocket *wsi,
unsigned char **p,
unsigned char *end)
{
#ifdef LWS_USE_HTTP2
if (wsi->mode == LWS_CONNMODE_HTTP2_SERVING)
return 0;
#endif
if ((long)(end - *p) < 3)
return 1;
*((*p)++) = '\x0d';
*((*p)++) = '\x0a';
return 0;
}
int lws_add_http_header_by_token(struct libwebsocket_context *context,
struct libwebsocket *wsi,
enum lws_token_indexes token,
const unsigned char *value,
int length,
unsigned char **p,
unsigned char *end)
{
const unsigned char *name;
#ifdef LWS_USE_HTTP2
if (wsi->mode == LWS_CONNMODE_HTTP2_SERVING)
return lws_add_http2_header_by_token(context, wsi, token, value, length, p, end);
#endif
name = lws_token_to_string(token);
if (!name)
return 1;
return lws_add_http_header_by_name(context, wsi, name, value, length, p, end);
}
static const char *err400[] = {
"Bad Request",
@ -865,12 +946,36 @@ static const char *err500[] = {
"HTTP Version Not Supported"
};
int lws_add_http_header_status(struct libwebsocket_context *context,
struct libwebsocket *wsi,
unsigned int code,
unsigned char **p,
unsigned char *end)
{
unsigned char code_and_desc[60];
const char *description = "";
int n;
#ifdef LWS_USE_HTTP2
if (wsi->mode == LWS_CONNMODE_HTTP2_SERVING)
return lws_add_http2_header_status(context, wsi, code, p, end);
#endif
if (code >= 400 && code < (400 + ARRAY_SIZE(err400)))
description = err400[code - 400];
if (code >= 500 && code < (500 + ARRAY_SIZE(err500)))
description = err500[code - 500];
n = sprintf((char *)code_and_desc, "HTTP/1.0 %u %s", code, description);
return lws_add_http_header_by_name(context, wsi, NULL, code_and_desc, n, p, end);
}
/**
* libwebsockets_return_http_status() - Return simple http status
* @context: libwebsockets context
* @wsi: Websocket instance (available from user callback)
* @code: Status index, eg, 404
* @html_body: User-readable HTML description, or NULL
* @html_body: User-readable HTML description < 1KB, or NULL
*
* Helper to report HTTP errors back to the client cleanly and
* consistently
@ -880,30 +985,30 @@ LWS_VISIBLE int libwebsockets_return_http_status(
unsigned int code, const char *html_body)
{
int n, m;
const char *description = "";
unsigned char *p = context->service_buffer + LWS_SEND_BUFFER_PRE_PADDING;
unsigned char *start = p;
unsigned char *end = p + sizeof(context->service_buffer) -
LWS_SEND_BUFFER_PRE_PADDING;
if (!html_body)
html_body = "";
if (code >= 400 && code < (400 + ARRAY_SIZE(err400)))
description = err400[code - 400];
if (code >= 500 && code < (500 + ARRAY_SIZE(err500)))
description = err500[code - 500];
if (lws_add_http_header_status(context, wsi, code, &p, end))
return 1;
if (lws_add_http_header_by_token(context, wsi, WSI_TOKEN_HTTP_SERVER, (unsigned char *)"libwebsockets", 13, &p, end))
return 1;
if (lws_add_http_header_by_token(context, wsi, WSI_TOKEN_HTTP_CONTENT_TYPE, (unsigned char *)"text/html", 9, &p, end))
return 1;
if (lws_finalize_http_header(context, wsi, &p, end))
return 1;
n = sprintf((char *)context->service_buffer +
LWS_SEND_BUFFER_PRE_PADDING,
"HTTP/1.0 %u %s\x0d\x0a"
"Server: libwebsockets\x0d\x0a"
"Content-Type: text/html\x0d\x0a\x0d\x0a"
"<h1>%u %s</h1>%s",
code, description, code, description, html_body);
m = libwebsocket_write(wsi, start, p - start, LWS_WRITE_HTTP_HEADERS);
if (m)
return m;
lwsl_info((const char *)context->service_buffer +
LWS_SEND_BUFFER_PRE_PADDING);
m = libwebsocket_write(wsi, context->service_buffer +
LWS_SEND_BUFFER_PRE_PADDING, n,
LWS_WRITE_HTTP_HEADERS);
n = sprintf((char *)start, "<html><body><h1>%u</h1>%s</body></html>", code, html_body);
m = libwebsocket_write(wsi, start, n, LWS_WRITE_HTTP);
return m;
}
@ -929,10 +1034,14 @@ LWS_VISIBLE int libwebsockets_return_http_status(
LWS_VISIBLE int libwebsockets_serve_http_file(
struct libwebsocket_context *context,
struct libwebsocket *wsi, const char *file,
const char *content_type, const char *other_headers)
const char *content_type, const char *other_headers,
int other_headers_len)
{
unsigned char *response = context->service_buffer + LWS_SEND_BUFFER_PRE_PADDING;
unsigned char *p = response;
unsigned char *end = p + sizeof(context->service_buffer) -
LWS_SEND_BUFFER_PRE_PADDING;
unsigned char clen[10];
int ret = 0;
int n;
@ -945,17 +1054,26 @@ LWS_VISIBLE int libwebsockets_serve_http_file(
return -1;
}
p += sprintf((char *)p, "HTTP/1.0 200 OK\x0d\x0a"
"Server: libwebsockets\x0d\x0a"
"Content-Type: %s\x0d\x0a", content_type);
if (other_headers) {
n = strlen(other_headers);
memcpy(p, other_headers, n);
p += n;
}
p += sprintf((char *)p,
"Content-Length: %lu\x0d\x0a\x0d\x0a", wsi->u.http.filelen);
if (lws_add_http_header_status(context, wsi, 200, &p, end))
return 1;
if (lws_add_http_header_by_token(context, wsi, WSI_TOKEN_HTTP_SERVER, (unsigned char *)"libwebsockets", 13, &p, end))
return 1;
if (lws_add_http_header_by_token(context, wsi, WSI_TOKEN_HTTP_CONTENT_TYPE, (unsigned char *)content_type, strlen(content_type), &p, end))
return 1;
n = sprintf((char *)clen, "%lu", (unsigned long)wsi->u.http.filelen);
if (lws_add_http_header_by_token(context, wsi, WSI_TOKEN_HTTP_CONTENT_LENGTH, clen, n, &p, end))
return 1;
if (other_headers) {
if ((end - p) < other_headers_len)
return -1;
memcpy(p, other_headers, other_headers_len);
p += other_headers_len;
}
if (lws_finalize_http_header(context, wsi, &p, end))
return 1;
ret = libwebsocket_write(wsi, response,
p - response, LWS_WRITE_HTTP_HEADERS);
if (ret != (p - response)) {

View file

@ -105,61 +105,27 @@ struct per_session_data__http {
static void
dump_handshake_info(struct libwebsocket *wsi)
{
int n;
static const char *token_names[] = {
/*[WSI_TOKEN_GET_URI] =*/ "GET URI",
/*[WSI_TOKEN_POST_URI] =*/ "POST URI",
/*[WSI_TOKEN_OPTIONS_URI] =*/ "options uri",
/*[WSI_TOKEN_HOST] =*/ "Host",
/*[WSI_TOKEN_CONNECTION] =*/ "Connection",
/*[WSI_TOKEN_UPGRADE] =*/ "Upgrade",
/*[WSI_TOKEN_ORIGIN] =*/ "Origin",
/*[WSI_TOKEN_DRAFT] =*/ "Draft",
/*[WSI_TOKEN_CHALLENGE] =*/ "Challenge",
/* new for 05 */
/*[WSI_TOKEN_EXTENSIONS] =*/ "Extensions",
/*[WSI_TOKEN_KEY1] =*/ "key 1",
/*[WSI_TOKEN_KEY2] =*/ "key 2",
/*[WSI_TOKEN_PROTOCOL] =*/ "Protocol",
/* client receives these */
/*[WSI_TOKEN_ACCEPT] =*/ "Accept",
/*[WSI_TOKEN_NONCE] =*/ "Nonce",
/*[WSI_TOKEN_HTTP] =*/ "Http",
"http2-settings",
"Accept:",
"a-c-request-headers:",
"If-Modified-Since:",
"if-none-match:",
"Accept-Encoding:",
"Accept-Language:",
"Pragma:",
"Cache-Control:",
"Authorization:",
"Cookie:",
"Content-Length:",
"Content-Type:",
"Date:",
"Range:",
"Referer:",
/* new for 04 */
/*[WSI_TOKEN_KEY] =*/ "Key",
/*[WSI_TOKEN_VERSION] =*/ "Version",
/*[WSI_TOKEN_SWORIGIN] =*/ "Sworigin",
"Uri-Args:",
};
int n = 0;
char buf[256];
const unsigned char *c;
for (n = 0; n < sizeof(token_names) / sizeof(token_names[0]); n++) {
if (!lws_hdr_total_length(wsi, n))
do {
c = lws_token_to_string(n);
if (!c) {
n++;
continue;
}
if (!lws_hdr_total_length(wsi, n)) {
n++;
continue;
}
lws_hdr_copy(wsi, buf, sizeof buf, n);
fprintf(stderr, " %s = %s\n", token_names[n], buf);
}
fprintf(stderr, " %s = %s\n", (char *)c, buf);
n++;
} while (c);
}
const char * get_mimetype(const char *file)
@ -207,7 +173,7 @@ static int callback_http(struct libwebsocket_context *context,
#ifdef EXTERNAL_POLL
struct libwebsocket_pollargs *pa = (struct libwebsocket_pollargs *)in;
#endif
unsigned char *end;
switch (reason) {
case LWS_CALLBACK_HTTP:
@ -240,7 +206,7 @@ static int callback_http(struct libwebsocket_context *context,
/* well, let's demonstrate how to send the hard way */
p = buffer + LWS_SEND_BUFFER_PRE_PADDING;
end = p + sizeof(buffer) - LWS_SEND_BUFFER_PRE_PADDING;
#ifdef WIN32
pss->fd = open(leaf_path, O_RDONLY | _O_BINARY);
#else
@ -256,20 +222,33 @@ static int callback_http(struct libwebsocket_context *context,
* we will send a big jpeg file, but it could be
* anything. Set the Content-Type: appropriately
* so the browser knows what to do with it.
*
* Notice we use the APIs to build the header, which
* will do the right thing for HTTP 1/1.1 and HTTP2
* depending on what connection it happens to be working
* on
*/
p += sprintf((char *)p,
"HTTP/1.0 200 OK\x0d\x0a"
"Server: libwebsockets\x0d\x0a"
"Content-Type: image/jpeg\x0d\x0a"
"Content-Length: %u\x0d\x0a\x0d\x0a",
(unsigned int)stat_buf.st_size);
if (lws_add_http_header_status(context, wsi, 200, &p, end))
return 1;
if (lws_add_http_header_by_token(context, wsi, WSI_TOKEN_HTTP_SERVER, (unsigned char *)"libwebsockets", 13, &p, end))
return 1;
if (lws_add_http_header_by_token(context, wsi, WSI_TOKEN_HTTP_CONTENT_TYPE, (unsigned char *)"image/jpeg", 10, &p, end))
return 1;
n = sprintf(b64, "%u", (unsigned int)stat_buf.st_size);
if (lws_add_http_header_by_token(context, wsi, WSI_TOKEN_HTTP_CONTENT_LENGTH, (unsigned char *)b64, n, &p, end))
return 1;
if (lws_finalize_http_header(context, wsi, &p, end))
return 1;
/*
* send the http headers...
* this won't block since it's the first payload sent
* on the connection since it was established
* (too small for partial)
*
* Notice they are sent using LWS_WRITE_HTTP_HEADERS
* which also means you can't send body too in one step,
* this is mandated by changes in HTTP2
*/
n = libwebsocket_write(wsi,
@ -310,23 +289,25 @@ static int callback_http(struct libwebsocket_context *context,
/* demostrates how to set a cookie on / */
other_headers = NULL;
n = 0;
if (!strcmp((const char *)in, "/") &&
!lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_COOKIE)) {
/* this isn't very unguessable but it'll do for us */
gettimeofday(&tv, NULL);
sprintf(b64, "LWS_%u_%u_COOKIE",
n = sprintf(b64, "test=LWS_%u_%u_COOKIE;Max-Age=360000",
(unsigned int)tv.tv_sec,
(unsigned int)tv.tv_usec);
sprintf(leaf_path,
"Set-Cookie: test=LWS_%u_%u_COOKIE;Max-Age=360000\x0d\x0a",
(unsigned int)tv.tv_sec, (unsigned int)tv.tv_usec);
p = (unsigned char *)leaf_path;
if (lws_add_http_header_by_name(context, wsi, (unsigned char *)"set-cookie:", (unsigned char *)b64, n, &p, (unsigned char *)leaf_path + sizeof(leaf_path)))
return 1;
n = (char *)p - leaf_path;
other_headers = leaf_path;
lwsl_err(other_headers);
}
if (libwebsockets_serve_http_file(context, wsi, buf,
mimetype, other_headers))
mimetype, other_headers, n))
return -1; /* through completion or error, close the socket */
/*