idnits 2.17.1 draft-snell-httpbis-bohe-05.txt: Checking boilerplate required by RFC 5378 and the IETF Trust (see https://trustee.ietf.org/license-info): ---------------------------------------------------------------------------- No issues found here. Checking nits according to https://www.ietf.org/id-info/1id-guidelines.txt: ---------------------------------------------------------------------------- No issues found here. Checking nits according to https://www.ietf.org/id-info/checklist : ---------------------------------------------------------------------------- ** The document seems to lack an Introduction section. ** The document seems to lack an IANA Considerations section. (See Section 2.2 of https://www.ietf.org/id-info/checklist for how to handle the case when there are no actions for IANA.) Miscellaneous warnings: ---------------------------------------------------------------------------- == The copyright year in the IETF Trust and authors Copyright Line does not match the current year == Line 185 has weird spacing: '... bit coun...' == Line 187 has weird spacing: '... bit coun...' == The document seems to lack the recommended RFC 2119 boilerplate, even if it appears to use RFC 2119 keywords. (The document does seem to have the reference to RFC 2119 which the ID-Checklist requires). -- The document date (April 20, 2013) is 4017 days in the past. Is this intentional? Checking references for intended status: Informational ---------------------------------------------------------------------------- -- Looks like a reference, but probably isn't: '25' on line 723 -- Looks like a reference, but probably isn't: '24' on line 814 -- Looks like a reference, but probably isn't: '12' on line 848 -- Looks like a reference, but probably isn't: '14' on line 816 -- Looks like a reference, but probably isn't: '15' on line 761 -- Looks like a reference, but probably isn't: '6' on line 849 -- Looks like a reference, but probably isn't: '7' on line 820 -- Looks like a reference, but probably isn't: '10' on line 812 -- Looks like a reference, but probably isn't: '5' on line 838 -- Looks like a reference, but probably isn't: '18' on line 782 -- Looks like a reference, but probably isn't: '17' on line 847 -- Looks like a reference, but probably isn't: '9' on line 844 -- Looks like a reference, but probably isn't: '13' on line 786 -- Looks like a reference, but probably isn't: '8' on line 900 -- Looks like a reference, but probably isn't: '11' on line 797 -- Looks like a reference, but probably isn't: '19' on line 818 -- Looks like a reference, but probably isn't: '4' on line 823 == Unused Reference: 'RFC2119' is defined on line 533, but no explicit reference was found in the text Summary: 2 errors (**), 0 flaws (~~), 5 warnings (==), 18 comments (--). Run idnits with the --verbose option for more detailed information about the items above. -------------------------------------------------------------------------------- 2 Network Working Group J.M. Snell 3 Internet-Draft April 20, 2013 4 Intended status: Informational 5 Expires: October 22, 2013 7 HTTP/2.0 Discussion: Stored Header Encoding 8 draft-snell-httpbis-bohe-05 10 Abstract 12 This memo describes a proposed alternative encoding for headers that 13 combines the best concepts from the proposed Delta and HeaderDiff 14 options with the typed value codecs introduced by previous versions 15 of this draft. 17 Status of This Memo 19 This Internet-Draft is submitted to IETF in full conformance with the 20 provisions of BCP 78 and BCP 79. 22 Internet-Drafts are working documents of the Internet Engineering 23 Task Force (IETF). Note that other groups may also distribute 24 working documents as Internet-Drafts. The list of current Internet- 25 Drafts is at http://datatracker.ietf.org/drafts/current/. 27 Internet-Drafts are draft documents valid for a maximum of six months 28 and may be updated, replaced, or obsoleted by other documents at any 29 time. It is inappropriate to use Internet-Drafts as reference 30 material or to cite them other than as "work in progress." 32 This Internet-Draft will expire on October 22, 2013. 34 Copyright Notice 36 Copyright (c) 2013 IETF Trust and the persons identified as the 37 document authors. All rights reserved. 39 This document is subject to BCP 78 and the IETF Trust's Legal 40 Provisions Relating to IETF Documents 41 (http://trustee.ietf.org/license-info) in effect on the date of 42 publication of this document. Please review these documents 43 carefully, as they describe your rights and restrictions with respect 44 to this document. 46 Table of Contents 48 1. Stored Header Encoding . . . . . . . . . . . . . . . . . . . 2 49 2. State Model . . . . . . . . . . . . . . . . . . . . . . . . . 2 50 3. Header Serialization . . . . . . . . . . . . . . . . . . . . 3 51 3.1. Header Group Prefix . . . . . . . . . . . . . . . . . . . 6 52 3.2. Index Header Group . . . . . . . . . . . . . . . . . . . 6 53 3.3. Index Range Header Group . . . . . . . . . . . . . . . . 7 54 3.4. Cloned Index Header Group . . . . . . . . . . . . . . . . 8 55 3.5. Literal Header Group . . . . . . . . . . . . . . . . . . 8 56 4. Header Values . . . . . . . . . . . . . . . . . . . . . . . . 9 57 4.1. UTF-8 Text Values . . . . . . . . . . . . . . . . . . . . 10 58 4.2. Numeric Values . . . . . . . . . . . . . . . . . . . . . 10 59 4.3. Timestamp Values . . . . . . . . . . . . . . . . . . . . 10 60 4.4. Raw Binary Octet Values . . . . . . . . . . . . . . . . . 10 61 4.5. Unsigned Variable Length Integer Syntax . . . . . . . . . 10 62 4.6. Huffman Coding . . . . . . . . . . . . . . . . . . . . . 11 63 5. Security Considerations . . . . . . . . . . . . . . . . . . . 12 64 6. Normative References . . . . . . . . . . . . . . . . . . . . 12 65 Appendix A. Huffman Tables . . . . . . . . . . . . . . . . . . . 12 66 Appendix B. Static Storage Cache . . . . . . . . . . . . . . . . 20 67 Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 23 69 1. Stored Header Encoding 71 The Stored Header Encoding is an alternative "binary header encoding" 72 for HTTP/2.0 that combines the best elements from three other 73 proposed encodings, including: 75 o The "Header Delta Compression" scheme proposed by Roberto Peon in 76 http://tools.ietf.org/html/draft-rpeon-httpbis-header- 77 compression-03 79 o The "Header Diff" encoding proposed by Herve Reullan, Jun 80 Fujisawa, Romain Bellessort, and Youenn Fablet in http:// 81 tools.ietf.org/html/draft-ruellan-headerdiff-00 83 o The "Binary Optimized Header Encoding" proposed by James Snell 84 (me) in http://tools.ietf.org/html/draft-snell-httpbis-bohe-03 86 The Stored Header Encoding seeks to find an elegant, efficient and 87 simple marriage of the best concepts from each of these separate 88 proposals. 90 2. State Model 92 The compressor and decompressor each maintain a cache of header value 93 pairs. There is a static cache, prepopulated by the specification, 94 and a dynamic cache, populated through the compression and 95 decompression process. Each cache contains a maximum of 128 96 individual key+value pairs. 98 Each item in the index is referenced by an 8-bit identifier. The 99 most significant bit identifies whether an item from the static or 100 dynamic cache is being referenced. Note: the Nil byte (0x00) is a 101 valid identifier for the dynamic cache. 103 0xxxxxxx -- Dynamic Cache 104 1xxxxxxx -- Static Cache 106 The dynamic cache is managed in a "least recently written" style, 107 that is, as the cache fills to capacity in both number of entries and 108 maximum stored byte size, the least recently written items are 109 dropped and those index positions are reused. 111 Index positions from the dynamic cache are assigned in "encounter 112 order", beginning from 0x00 and increasing monotonically to 0x7F. 113 That is to say, the positions are assigned in precisely the same 114 order that they are serialized, and thereby encountered by the 115 decompressor upon reading and processing the block. 117 Each item in the store consists of a Header Name and a Value. The 118 Name is a lower-case ISO-8859-1 character sequence. The Value is 119 either a UTF-8 string, a number, a Timestamp or an arbitrary sequence 120 of binary octets. 122 The available size of the stored compression state can be capped by 123 the decompressor. Each stored value contributes to the accumulated 124 size of the storage state. As new key+value pairs are assigned 125 positions in the dynamic cache, the least-recently assigned items 126 must be removed if necessary to free up the required space. 128 The size of string values is measured by the number of UTF-8 bytes 129 required for the character sequence. 131 The size of number and timestamp values are measured by the number of 132 unsigned variable length integer (uvarint) encoded bytes it takes to 133 represent the value (see the section of value types below). 135 The size of raw binary values is measured by the number of octets. 137 Header names DO NOT contribute to the stored state size of the 138 compressor; only the size of the value is considered. Duplicate 139 values MUST be counted individually. 141 3. Header Serialization 143 Headers are serialized into four typed header groups, each 144 represented by a two-bit identifier. These groups are serialized 145 sequentially. A serialized header block can contain, at most 256 146 header groups. The first byte of the serialized block is an 147 unsigned, 0-based counter indicating the number of groups. A 148 serialized block MUST contain at least one header group. 150 00 -- Index Header Group 151 01 -- Index Range Header Group 152 10 -- Cloned Index Header Group 153 11 -- Literal Header Group 155 The Cloned Index (10) and Literal (11) header group types have an 156 additional "ephemeral" property that indicates whether or not the 157 group affects the compression state. 159 Each header group contains a single 8-bit prefix and up to 32 160 distinct header instances. 162 Wire Format 164 header-block = OCTET *(index-header-group / 165 index-range-header-group / 166 cloned-index-header-group / 167 literal-header-group) 169 ; Header Group Prefix = 8 bits ... 170 ; First two bits = header-group-type 171 ; Third bit = ephemeral flag 172 ; Final five bits = instance counter 173 ; 174 index-header-group-type = 00 175 index-range-group-type = 01 176 cloned-index-group-type = 10 177 literal-group-type = 11 178 count = 5bit 180 index-header-prefix = index-header-group-type 181 unset count ; 000xxxxx 182 index-range-header-prefix = index-header-group-type 183 unset count ; 010xxxxx 184 cloned-index-header-prefix = cloned-index-group-type 185 bit count ; 10?xxxxx 186 literal-header-prefix = literal-group-type 187 bit count ; 11?xxxxx 189 ; Cache Index Identifier = 8 bits ... 190 ; 0xxxxxxx = Dynamic Cache Identifier 191 ; 1xxxxxxx = Static Cache Identifier 192 cache-index = %x00-FF 194 ; Index Header Group 195 index-header-group = index-header-prefix 196 1*32cache-index 198 ; Index-Range Header Group 199 ; Contains a pair of cache-index values, second MUST 200 ; me strictly higher in value than the first... 201 index-range-header-group = index-range-header-prefix 202 1*32(cache-index cache-index) 204 ; Cloned-Index Header Group 205 cloned-index-header-group = cloned-index-header-prefix 206 1*32(cache-index value) 208 ; Literal Header Group 209 literal-header-group = literal-header-prefix 210 1*32(name value) 212 value = text-value / 213 number-value / 214 timestamp-value / 215 binary-value 217 text-value-type = 00 ; two bits 218 number-value-type = 01 219 timestamp-value-type = 10 220 binary-value-type = 11 222 text-value-prefix = text-value-type 223 unset count ; 000xxxxx 224 number-value-prefix = number-value-type 225 unset count ; 010xxxxx 226 timestamp-value-prefix = timestamp-value-type 227 unset count ; 100xxxxx 228 binary-value-prefix = binary-value-type 229 unset count ; 110xxxxx 231 text-value = text-value-prefix *32string 232 number-value = number-value-type *32uvarint 233 timestamp-value = timestamp-value-prefix *32uvarint 234 binary-value = binary-value-prefix uvarint *OCTET 236 uvarint = *uvarint-continuation uvarint-final 237 uvarint-continuation = %x80-FF 238 uvarint-final = %x00-7F 239 name = 1*tchar 240 tchar = "!" / "#" / "$" / "%" / "&" / 241 "'" / "*" / "+" / "-" / "." / 242 "^" / "_" / "`" / "|" / "~" 243 / DIGIT / ALPHA 245 string = uvarint *(HUFFMAN-ENCODED-CHAR) 246 HUFFMAN-EOF 247 padding-to-nearest-byte; 248 padding-to-nearest-byte = *7unset 250 bit = set / unset 251 unset = 0 252 set = 1 254 3.1. Header Group Prefix 256 The Header Group Prefix is a single octet that provides three 257 distinct pieces of information: 259 00 0 00000 261 The first two most significant bits of the header group prefix 262 identify the group type. 264 The next bit is the "ephemeral flag" and is used only for Cloned and 265 Literal group types. This bit indicates whether or not the group 266 alters the stored compression state. 268 The remaining five bits specify the number of header instances in the 269 group, with 00000 indicating that the group contains 1 instance and 270 11111 contains 32. A header group MUST contain at least one 271 instance. 273 The remaining serialization of the header group depends entirely on 274 the group type. 276 3.2. Index Header Group 278 The serialization of the Index Header Group consists of the Header 279 Group Prefix and up to 32 additional octets, each referencing a 280 single 8-bit storage index identifier for items in either the Static 281 or Dynamic Cache. 283 For instance 284 00000000 00000000 = References item #0 from 285 the dynamic cache 287 00000001 00000000 10000000 = References item #0 from the 288 dynamic cache and item #0 289 from the static cache 291 Index Header Groups do not affect the stored compression state. If 292 an Index Header Group references a header index that has not yet been 293 allocated, the deserialization MUST terminate with an error. This 294 likely means that the compression state has become out of sync and 295 needs to be reestablished. 297 3.3. Index Range Header Group 299 The serialization of the Index Range Header Group consists of the 300 Header Group Prefix and up to 32 additional 2-octet (16 bits) pairs 301 of 8-bit storage index identifiers. Each pair specifies a sequential 302 range of adjacent ranges. 304 For instance: 306 01000000 00000000 00000100 = References items #0-#4 from 307 the dynamic cache. 308 (five distinct items total) 310 A range MAY span dynamic and static index values. Index values are 311 treated as unsigned byte values, so indices from the static cache are 312 numerically greater than dynamic cache values.. e.g. 314 01000000 01111111 10000001 = References item #127 from the 315 dynamic cache, and items #0 316 and #1 from the static cache. 318 Index Range Header Groups do not affect the stored compression state. 319 If a range references a header index that has not yet been allocated, 320 the deserialization MUST terminate with an error. This likely means 321 that the compression state has become out of sync and needs to be 322 reestablished. 324 3.4. Cloned Index Header Group 326 The serialization of the Cloned Index Header Group consists of the 327 Header Group Prefix and up to 32 Index+Value pairs. Each Index+Value 328 pair consists of a leading 8-bit storage index of an existing stored 329 header followed by a new serialized value. The serialization of the 330 value depends on the value type (see discussion of Value 331 serialization below). 333 The Cloned Header Group affects the stored compression state if, and 334 only if, the "ephemeral" flag in the Header Group Prefix is NOT set. 335 If the header group is not marked as being ephemeral, then the 336 specified value is stored in the next available storage index using 337 the key name from the referenced storage index. 339 For instance, assume the dynamic cache currently contains an item at 340 index #1 with key name "foo" and value "bar", the following causes a 341 new item to be added to the storage with key name "foo" and value 342 "baz": 344 10000000 00000001 00000000 00000100 345 10111000 01001111 10110101 00100000 347 An explanation of the value syntax is given a bit later. 349 If a Cloned Header Group references a header index that has not yet 350 been allocated, the deserialization MUST terminate with an error. 351 This likely means that the compression state has become out of sync 352 and needs to be reestablished. 354 3.5. Literal Header Group 356 The serialization of the Literal Header Group consists of the Header 357 Group Prefix and up to 32 Name+Value pairs. Each Name+Value pair 358 consists of a length-prefixed sequence of ASCII bytes specifying the 359 Header Name followed by the serialized value. The serialization of 360 the value depends on the value type. The length prefix is encoded as 361 an unsigned variable length integer (uvarint). The length prefix 362 SHOULD NOT be longer than five octets and SHOULD NOT specify a value 363 larger than 0xFFFF. 365 The Literal Heaer Group affects the stored compression state if, and 366 only if, the "ephemeral" flag in the Header Group Prefix is NOT set. 367 If the header group is not marked as being ephemeral, then the 368 specified key name and value is stored in the next available storage 369 index. 371 For instance: 373 11000000 00000011 01100110 01101111 374 01101111 00000000 00000010 10111000 375 01000100 11010010 377 Stores a new header with name "foo" and value "baz" in the dynamic 378 cache. 380 Each Header Group consists of up to 32 distinct Header Instances. If 381 a particular serialization block contains more than 32 intances of a 382 given type, then multiple instances of the Header Group Type can be 383 included in the serialized block. For instance, if a given message 384 contains 33 index references, the serialized block may contain two 385 separate Index Header Groups. While this is allowed, it is expected 386 to be rare. 388 4. Header Values 390 Header Values can be one of four types, each identified by a two-bit 391 identifier. 393 o 00 -- UTF-8 Text 395 o 01 -- Numeric 397 o 10 -- Timetamp 399 o 11 -- Raw Binary Octets 401 An individual value MAY consist of up to 32 distinct discreet "value 402 instances". A value with multiple instances is considered, for all 403 intensive purposes, to be a single value. 405 Each serialized value is preceded by an 8-bit Value Prefix. 407 00 0 00000 409 The first two most significant bits specifies the value type. 411 The third significant bit is a reserved flag. Future iterations of 412 this specification might make use of this bit. 414 The final five least-significant bits specify the number of discreet 415 instances in the value. 00000 indicates that one instance is 416 included, 11111 indicates that 32 instances are included. The value 417 MUST contain at least one instance. 419 The remaining serialization depends entirely on the type. 421 4.1. UTF-8 Text Values 423 UTF-8 Text is encoded as a length-prefixed sequence of Huffman- 424 encoded UTF-8 octets. The length prefix is encoded as an unsigned 425 variable-length integer specifying the number of octets after 426 applying the Huffman-encoding. 428 4.2. Numeric Values 430 Numeric values are encoded as unsigned variable-length integers 431 (uvarint) of up to a maximum of 10-octets. Unsigned values larger 432 than 64-bits (0xFFFFFFFF) MUST NOT be used. Negative values cannot 433 be represented using this syntax. The uvarint syntax is described 434 below. 436 4.3. Timestamp Values 438 Timestamp values are encoded as unsigned variable-length integers 439 specifying the number of seconds that have passed since the standard 440 Epoch. The syntax is identical that used for Numeric Values. Dates 441 prior to the epoch cannot be represented using this syntax. 443 4.4. Raw Binary Octet Values 445 Binary values are encoded as a length prefixed sequence of arbitrary 446 octets. The length prefix is encoded as an unsigned variable length 447 integer. 449 4.5. Unsigned Variable Length Integer Syntax 451 The uvarint syntax is identical to that used by Google's protobufs. 452 They are serialized with the least-significant bytes first in batches 453 of 7-bits, with the most significant bit per byte reserved as a 454 continuation bit. Values less than or equal to 127 are serialized 455 using at most one byte; values less than or equal to 16383 are 456 serialized using at most two bytes; values less than or equal to 457 2097151 are serialized using at most three bytes. 459 def uvarint(num): 460 return [] if num = 0 461 ret = [] 462 while(num != 0): 463 m = num >>> 7 ; unsigned shift left 7 bits 464 ret.push (byte)((num & ~0x80) | ( m > 0 ? 0x80 : 0x00 )); 465 num = m; 466 return ret; 468 For example, the binary representation of the 32-bit integer 217 is: 470 00000000 00000000 00000000 11011001 472 The variable length encoding is: 474 11011001 00000001 476 The binary representation of the 32-bit integer 1386210052 is: 478 01010010 10011111 11100011 00000100 480 The variable length encoding is: 482 10000100 11000110 11111111 10010100 00000101 484 4.6. Huffman Coding 486 All UTF-8 text values are compressed using a modified static huffman 487 code. "Modified" because the encoded version may contain compact- 488 representations of raw, arbitrary UTF-8 bytes that are not covered by 489 the static huffman code table. 491 There are two huffman tables in use, one for HTTP Requests and 492 another for HTTP Responses, each covers UTF-8 codepoints strictly 493 less than 128 as well the fifty possible UTF-8 leading octets. 495 The encoded result MUST end with a specific terminal sequence of bits 496 called the "HUFFMAN_EOF". Currently, the HUFFMAN_EOF is the same for 497 both the Request and Response tables, but that could change if the 498 tables are regenerated. Currently, the HUFFMAN_EOF sequence is 499 101001. 501 Codepoints >= 128 are handled by first taking the leading octet of 502 the UTF-8 representation and serializing it's associated huffman code 503 from the table to the output stream, then, depending on the octets 504 value, serializing the six least significant bits from each of the 505 remaining trailing octets. 507 For instance, the UTF-8 character U+00D4 (LATIN CAPITAL LETTER O WITH 508 CIRCUMFLEX), with UTF-8 representation of C394 (hex) is encoded as: 510 11000100 01010010 10010000 512 The first 8-bits represents the huffman-table prefix, the first six 513 most significant bytes of the second octet are taken directly from 514 the six least significant bits of the second UTF-8 byte (0x94). 515 Following those six bits are the six bits of the HUFFMAN_EOF 101001, 516 followed by four unset padding bits. 518 The number of raw UTF-8 bits to write depends on the value of the 519 leading octet. If the value is between 0xC2 and 0xDF (inclusive), 520 six bits from the second continuation byte is encoded. If the value 521 is between 0xE0 and 0xEF (inclusive), six bits from the second and 522 third continuation bytes are encoded. If the value is between 0xF0 523 and 0xF4 (inclusive), six bits from the second, third and fourth 524 continuation bytes are encoded. UTF-8 codepoints that require 525 greater than four bytes to encode cannot be represented. 527 5. Security Considerations 529 TBD 531 6. Normative References 533 [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate 534 Requirement Levels", BCP 14, RFC 2119, March 1997. 536 Appendix A. Huffman Tables 538 Request Table 540 ( 0) |11111111|11111111|11111111|0 [25] 1fffffe [25] 541 ( 1) |11111111|11111111|11111111|1 [25] 1ffffff [25] 542 ( 2) |11111111|11111111|11100000 [24] ffffe0 [24] 543 ( 3) |11111111|11111111|11100001 [24] ffffe1 [24] 544 ( 4) |11111111|11111111|11100010 [24] ffffe2 [24] 545 ( 5) |11111111|11111111|11100011 [24] ffffe3 [24] 546 ( 6) |11111111|11111111|11100100 [24] ffffe4 [24] 547 ( 7) |11111111|11111111|11100101 [24] ffffe5 [24] 548 ( 8) |11111111|11111111|11100110 [24] ffffe6 [24] 549 ( 9) |11111111|11111111|11100111 [24] ffffe7 [24] 550 ( 10) |11111111|11111111|11101000 [24] ffffe8 [24] 551 ( 11) |11111111|11111111|11101001 [24] ffffe9 [24] 552 ( 12) |11111111|11111111|11101010 [24] ffffea [24] 553 ( 13) |11111111|11111111|11101011 [24] ffffeb [24] 554 ( 14) |11111111|11111111|11101100 [24] ffffec [24] 555 ( 15) |11111111|11111111|11101101 [24] ffffed [24] 556 ( 16) |11111111|11111111|11101110 [24] ffffee [24] 557 ( 17) |11111111|11111111|11101111 [24] ffffef [24] 558 ( 18) |11111111|11111111|11110000 [24] fffff0 [24] 559 ( 19) |11111111|11111111|11110001 [24] fffff1 [24] 560 ( 20) |11111111|11111111|11110010 [24] fffff2 [24] 561 ( 21) |11111111|11111111|11110011 [24] fffff3 [24] 562 ( 22) |11111111|11111111|11110100 [24] fffff4 [24] 563 ( 23) |11111111|11111111|11110101 [24] fffff5 [24] 564 ( 24) |11111111|11111111|11110110 [24] fffff6 [24] 565 ( 25) |11111111|11111111|11110111 [24] fffff7 [24] 566 ( 26) |11111111|11111111|11111000 [24] fffff8 [24] 567 ( 27) |11111111|11111111|11111001 [24] fffff9 [24] 568 ( 28) |11111111|11111111|11111010 [24] fffffa [24] 569 ( 29) |11111111|11111111|11111011 [24] fffffb [24] 570 ( 30) |11111111|11111111|11111100 [24] fffffc [24] 571 ( 31) |11111111|11111111|11111101 [24] fffffd [24] 572 ' ' ( 32) |11111111|0110 [12] ff6 [12] 573 '!' ( 33) |11111111|0111 [12] ff7 [12] 574 '"' ( 34) |11111111|111010 [14] 3ffa [14] 575 '#' ( 35) |11111111|1111100 [15] 7ffc [15] 576 '$' ( 36) |11111111|1111101 [15] 7ffd [15] 577 '%' ( 37) |011000 [6] 18 [6] 578 '&' ( 38) |1010100 [7] 54 [7] 579 ''' ( 39) |11111111|1111110 [15] 7ffe [15] 580 '(' ( 40) |11111111|1000 [12] ff8 [12] 581 ')' ( 41) |11111111|1001 [12] ff9 [12] 582 '*' ( 42) |11111111|1010 [12] ffa [12] 583 '+' ( 43) |11111111|1011 [12] ffb [12] 584 ',' ( 44) |11111011|10 [10] 3ee [10] 585 '-' ( 45) |011001 [6] 19 [6] 586 '.' ( 46) |00010 [5] 2 [5] 587 '/' ( 47) |00011 [5] 3 [5] 588 '0' ( 48) |011010 [6] 1a [6] 589 '1' ( 49) |011011 [6] 1b [6] 590 '2' ( 50) |011100 [6] 1c [6] 591 '3' ( 51) |011101 [6] 1d [6] 592 '4' ( 52) |1010101 [7] 55 [7] 593 '5' ( 53) |1010110 [7] 56 [7] 594 '6' ( 54) |1010111 [7] 57 [7] 595 '7' ( 55) |1011000 [7] 58 [7] 596 '8' ( 56) |1011001 [7] 59 [7] 597 '9' ( 57) |1011010 [7] 5a [7] 598 ':' ( 58) |011110 [6] 1e [6] 599 ';' ( 59) |11111011|11 [10] 3ef [10] 600 '<' ( 60) |11111111|11111111|10 [18] 3fffe [18] 601 '=' ( 61) |011111 [6] 1f [6] 602 '>' ( 62) |11111111|11111110|0 [17] 1fffc [17] 603 '?' ( 63) |11110110|0 [9] 1ec [9] 604 '@' ( 64) |11111111|11100 [13] 1ffc [13] 605 'A' ( 65) |10111010 [8] ba [8] 606 'B' ( 66) |11110110|1 [9] 1ed [9] 607 'C' ( 67) |10111011 [8] bb [8] 608 'D' ( 68) |10111100 [8] bc [8] 609 'E' ( 69) |11110111|0 [9] 1ee [9] 610 'F' ( 70) |10111101 [8] bd [8] 611 'G' ( 71) |11111100|00 [10] 3f0 [10] 612 'H' ( 72) |11111100|01 [10] 3f1 [10] 613 'I' ( 73) |11110111|1 [9] 1ef [9] 614 'J' ( 74) |11111100|10 [10] 3f2 [10] 615 'K' ( 75) |11111111|010 [11] 7fa [11] 616 'L' ( 76) |11111100|11 [10] 3f3 [10] 617 'M' ( 77) |11111000|0 [9] 1f0 [9] 618 'N' ( 78) |11111101|00 [10] 3f4 [10] 619 'O' ( 79) |11111101|01 [10] 3f5 [10] 620 'P' ( 80) |11111000|1 [9] 1f1 [9] 621 'Q' ( 81) |11111101|10 [10] 3f6 [10] 622 'R' ( 82) |11111001|0 [9] 1f2 [9] 623 'S' ( 83) |11111001|1 [9] 1f3 [9] 624 'T' ( 84) |11111010|0 [9] 1f4 [9] 625 'U' ( 85) |11111101|11 [10] 3f7 [10] 626 'V' ( 86) |11111110|00 [10] 3f8 [10] 627 'W' ( 87) |11111110|01 [10] 3f9 [10] 628 'X' ( 88) |11111110|10 [10] 3fa [10] 629 'Y' ( 89) |11111110|11 [10] 3fb [10] 630 'Z' ( 90) |11111111|00 [10] 3fc [10] 631 '[' ( 91) |11111111|111011 [14] 3ffb [14] 632 '\' ( 92) |11111111|11111111|11111110 [24] fffffe [24] 633 ']' ( 93) |11111111|111100 [14] 3ffc [14] 634 '^' ( 94) |11111111|111101 [14] 3ffd [14] 635 '_' ( 95) |1011011 [7] 5b [7] 636 '`' ( 96) |11111111|11111111|110 [19] 7fffe [19] 637 'a' ( 97) |00100 [5] 4 [5] 638 'b' ( 98) |1011100 [7] 5c [7] 639 'c' ( 99) |00101 [5] 5 [5] 640 'd' (100) |100000 [6] 20 [6] 641 'e' (101) |0000 [4] 0 [4] 642 'f' (102) |100001 [6] 21 [6] 643 'g' (103) |100010 [6] 22 [6] 644 'h' (104) |100011 [6] 23 [6] 645 'i' (105) |00110 [5] 6 [5] 646 'j' (106) |10111110 [8] be [8] 647 'k' (107) |10111111 [8] bf [8] 648 'l' (108) |100100 [6] 24 [6] 649 'm' (109) |100101 [6] 25 [6] 650 'n' (110) |100110 [6] 26 [6] 651 'o' (111) |00111 [5] 7 [5] 652 'p' (112) |01000 [5] 8 [5] 653 'q' (113) |11111010|1 [9] 1f5 [9] 654 'r' (114) |01001 [5] 9 [5] 655 's' (115) |01010 [5] a [5] 656 't' (116) |01011 [5] b [5] 657 'u' (117) |100111 [6] 27 [6] 658 'v' (118) |11000000 [8] c0 [8] 659 'w' (119) |101000 [6] 28 [6] 660 'x' (120) |11000001 [8] c1 [8] 661 'y' (121) |11000010 [8] c2 [8] 662 'z' (122) |11111011|0 [9] 1f6 [9] 663 '{' (123) |11111111|11111110|1 [17] 1fffd [17] 664 '|' (124) |11111111|1100 [12] ffc [12] 665 '}' (125) |11111111|11111111|0 [17] 1fffe [17] 666 '~' (126) |11111111|1101 [12] ffd [12] 667 (127) |101001 [6] 29 [6] 668 (0xC2) |11000011 [8] c3 [8] 669 (0xC3) |11000100 [8] c4 [8] 670 (0xC4) |11000101 [8] c5 [8] 671 (0xC5) |11000110 [8] c6 [8] 672 (0xC6) |11000111 [8] c7 [8] 673 (0xC7) |11001000 [8] c8 [8] 674 (0xC8) |11001001 [8] c9 [8] 675 (0xC9) |11001010 [8] ca [8] 676 (0xCA) |11001011 [8] cb [8] 677 (0xCB) |11001100 [8] cc [8] 678 (0xCC) |11001101 [8] cd [8] 679 (0xCD) |11001110 [8] ce [8] 680 (0xCE) |11001111 [8] cf [8] 681 (0xCF) |11010000 [8] d0 [8] 682 (0xD0) |11010001 [8] d1 [8] 683 (0xD1) |11010010 [8] d2 [8] 684 (0xD2) |11010011 [8] d3 [8] 685 (0xD3) |11010100 [8] d4 [8] 686 (0xD4) |11010101 [8] d5 [8] 687 (0xD5) |11010110 [8] d6 [8] 688 (0xD6) |11010111 [8] d7 [8] 689 (0xD7) |11011000 [8] d8 [8] 690 (0xD8) |11011001 [8] d9 [8] 691 (0xD9) |11011010 [8] da [8] 692 (0xDA) |11011011 [8] db [8] 693 (0xDB) |11011100 [8] dc [8] 694 (0xDC) |11011101 [8] dd [8] 695 (0xDD) |11011110 [8] de [8] 696 (0xDE) |11011111 [8] df [8] 697 (0xDF) |11100000 [8] e0 [8] 698 (0xE0) |11100001 [8] e1 [8] 699 (0xE1) |11100010 [8] e2 [8] 700 (0xE2) |11100011 [8] e3 [8] 701 (0xE3) |11100100 [8] e4 [8] 702 (0xE4) |11100101 [8] e5 [8] 703 (0xE5) |11100110 [8] e6 [8] 704 (0xE6) |11100111 [8] e7 [8] 705 (0xE7) |11101000 [8] e8 [8] 706 (0xE8) |11101001 [8] e9 [8] 707 (0xE9) |11101010 [8] ea [8] 708 (0xEA) |11101011 [8] eb [8] 709 (0xEB) |11101100 [8] ec [8] 710 (0xEC) |11101101 [8] ed [8] 711 (0xED) |11101110 [8] ee [8] 712 (0xEE) |11101111 [8] ef [8] 713 (0xEF) |11110000 [8] f0 [8] 714 (0xF0) |11110001 [8] f1 [8] 715 (0xF1) |11110010 [8] f2 [8] 716 (0xF2) |11110011 [8] f3 [8] 717 (0xF3) |11110100 [8] f4 [8] 718 (0xF4) |11110101 [8] f5 [8] 720 Response Table: 722 ( 0) |11111111|11111111|11111111|0 [25] 1fffffe [25] 723 ( 1) |11111111|11111111|11111111|1 [25] 1ffffff [25] 724 ( 2) |11111111|11111111|11100000 [24] ffffe0 [24] 725 ( 3) |11111111|11111111|11100001 [24] ffffe1 [24] 726 ( 4) |11111111|11111111|11100010 [24] ffffe2 [24] 727 ( 5) |11111111|11111111|11100011 [24] ffffe3 [24] 728 ( 6) |11111111|11111111|11100100 [24] ffffe4 [24] 729 ( 7) |11111111|11111111|11100101 [24] ffffe5 [24] 730 ( 8) |11111111|11111111|11100110 [24] ffffe6 [24] 731 ( 9) |11111111|11111111|11100111 [24] ffffe7 [24] 732 ( 10) |11111111|11111111|11101000 [24] ffffe8 [24] 733 ( 11) |11111111|11111111|11101001 [24] ffffe9 [24] 734 ( 12) |11111111|11111111|11101010 [24] ffffea [24] 735 ( 13) |11111111|11111111|11101011 [24] ffffeb [24] 736 ( 14) |11111111|11111111|11101100 [24] ffffec [24] 737 ( 15) |11111111|11111111|11101101 [24] ffffed [24] 738 ( 16) |11111111|11111111|11101110 [24] ffffee [24] 739 ( 17) |11111111|11111111|11101111 [24] ffffef [24] 740 ( 18) |11111111|11111111|11110000 [24] fffff0 [24] 741 ( 19) |11111111|11111111|11110001 [24] fffff1 [24] 742 ( 20) |11111111|11111111|11110010 [24] fffff2 [24] 743 ( 21) |11111111|11111111|11110011 [24] fffff3 [24] 744 ( 22) |11111111|11111111|11110100 [24] fffff4 [24] 745 ( 23) |11111111|11111111|11110101 [24] fffff5 [24] 746 ( 24) |11111111|11111111|11110110 [24] fffff6 [24] 747 ( 25) |11111111|11111111|11110111 [24] fffff7 [24] 748 ( 26) |11111111|11111111|11111000 [24] fffff8 [24] 749 ( 27) |11111111|11111111|11111001 [24] fffff9 [24] 750 ( 28) |11111111|11111111|11111010 [24] fffffa [24] 751 ( 29) |11111111|11111111|11111011 [24] fffffb [24] 752 ( 30) |11111111|11111111|11111100 [24] fffffc [24] 753 ( 31) |11111111|11111111|11111101 [24] fffffd [24] 754 ' ' ( 32) |11111111|0110 [12] ff6 [12] 755 '!' ( 33) |11111111|0111 [12] ff7 [12] 756 '"' ( 34) |11111111|111010 [14] 3ffa [14] 757 '#' ( 35) |11111111|1111100 [15] 7ffc [15] 758 '$' ( 36) |11111111|1111101 [15] 7ffd [15] 759 '%' ( 37) |011000 [6] 18 [6] 760 '&' ( 38) |1010100 [7] 54 [7] 761 ''' ( 39) |11111111|1111110 [15] 7ffe [15] 762 '(' ( 40) |11111111|1000 [12] ff8 [12] 763 ')' ( 41) |11111111|1001 [12] ff9 [12] 764 '*' ( 42) |11111111|1010 [12] ffa [12] 765 '+' ( 43) |11111111|1011 [12] ffb [12] 766 ',' ( 44) |11111011|10 [10] 3ee [10] 767 '-' ( 45) |011001 [6] 19 [6] 768 '.' ( 46) |00010 [5] 2 [5] 769 '/' ( 47) |00011 [5] 3 [5] 770 '0' ( 48) |011010 [6] 1a [6] 771 '1' ( 49) |011011 [6] 1b [6] 772 '2' ( 50) |011100 [6] 1c [6] 773 '3' ( 51) |011101 [6] 1d [6] 774 '4' ( 52) |1010101 [7] 55 [7] 775 '5' ( 53) |1010110 [7] 56 [7] 776 '6' ( 54) |1010111 [7] 57 [7] 777 '7' ( 55) |1011000 [7] 58 [7] 778 '8' ( 56) |1011001 [7] 59 [7] 779 '9' ( 57) |1011010 [7] 5a [7] 780 ':' ( 58) |011110 [6] 1e [6] 781 ';' ( 59) |11111011|11 [10] 3ef [10] 782 '<' ( 60) |11111111|11111111|10 [18] 3fffe [18] 783 '=' ( 61) |011111 [6] 1f [6] 784 '>' ( 62) |11111111|11111110|0 [17] 1fffc [17] 785 '?' ( 63) |11110110|0 [9] 1ec [9] 786 '@' ( 64) |11111111|11100 [13] 1ffc [13] 787 'A' ( 65) |10111010 [8] ba [8] 788 'B' ( 66) |11110110|1 [9] 1ed [9] 789 'C' ( 67) |10111011 [8] bb [8] 790 'D' ( 68) |10111100 [8] bc [8] 791 'E' ( 69) |11110111|0 [9] 1ee [9] 792 'F' ( 70) |10111101 [8] bd [8] 793 'G' ( 71) |11111100|00 [10] 3f0 [10] 794 'H' ( 72) |11111100|01 [10] 3f1 [10] 795 'I' ( 73) |11110111|1 [9] 1ef [9] 796 'J' ( 74) |11111100|10 [10] 3f2 [10] 797 'K' ( 75) |11111111|010 [11] 7fa [11] 798 'L' ( 76) |11111100|11 [10] 3f3 [10] 799 'M' ( 77) |11111000|0 [9] 1f0 [9] 800 'N' ( 78) |11111101|00 [10] 3f4 [10] 801 'O' ( 79) |11111101|01 [10] 3f5 [10] 802 'P' ( 80) |11111000|1 [9] 1f1 [9] 803 'Q' ( 81) |11111101|10 [10] 3f6 [10] 804 'R' ( 82) |11111001|0 [9] 1f2 [9] 805 'S' ( 83) |11111001|1 [9] 1f3 [9] 806 'T' ( 84) |11111010|0 [9] 1f4 [9] 807 'U' ( 85) |11111101|11 [10] 3f7 [10] 808 'V' ( 86) |11111110|00 [10] 3f8 [10] 809 'W' ( 87) |11111110|01 [10] 3f9 [10] 810 'X' ( 88) |11111110|10 [10] 3fa [10] 811 'Y' ( 89) |11111110|11 [10] 3fb [10] 812 'Z' ( 90) |11111111|00 [10] 3fc [10] 813 '[' ( 91) |11111111|111011 [14] 3ffb [14] 814 '\' ( 92) |11111111|11111111|11111110 [24] fffffe [24] 815 ']' ( 93) |11111111|111100 [14] 3ffc [14] 816 '^' ( 94) |11111111|111101 [14] 3ffd [14] 817 '_' ( 95) |1011011 [7] 5b [7] 818 '`' ( 96) |11111111|11111111|110 [19] 7fffe [19] 819 'a' ( 97) |00100 [5] 4 [5] 820 'b' ( 98) |1011100 [7] 5c [7] 821 'c' ( 99) |00101 [5] 5 [5] 822 'd' (100) |100000 [6] 20 [6] 823 'e' (101) |0000 [4] 0 [4] 824 'f' (102) |100001 [6] 21 [6] 825 'g' (103) |100010 [6] 22 [6] 826 'h' (104) |100011 [6] 23 [6] 827 'i' (105) |00110 [5] 6 [5] 828 'j' (106) |10111110 [8] be [8] 829 'k' (107) |10111111 [8] bf [8] 830 'l' (108) |100100 [6] 24 [6] 831 'm' (109) |100101 [6] 25 [6] 832 'n' (110) |100110 [6] 26 [6] 833 'o' (111) |00111 [5] 7 [5] 834 'p' (112) |01000 [5] 8 [5] 835 'q' (113) |11111010|1 [9] 1f5 [9] 836 'r' (114) |01001 [5] 9 [5] 837 's' (115) |01010 [5] a [5] 838 't' (116) |01011 [5] b [5] 839 'u' (117) |100111 [6] 27 [6] 840 'v' (118) |11000000 [8] c0 [8] 841 'w' (119) |101000 [6] 28 [6] 842 'x' (120) |11000001 [8] c1 [8] 843 'y' (121) |11000010 [8] c2 [8] 844 'z' (122) |11111011|0 [9] 1f6 [9] 845 '{' (123) |11111111|11111110|1 [17] 1fffd [17] 846 '|' (124) |11111111|1100 [12] ffc [12] 847 '}' (125) |11111111|11111111|0 [17] 1fffe [17] 848 '~' (126) |11111111|1101 [12] ffd [12] 849 (127) |101001 [6] 29 [6] 850 (0xC2) |11000011 [8] c3 [8] 851 (0xC3) |11000100 [8] c4 [8] 852 (0xC4) |11000101 [8] c5 [8] 853 (0xC5) |11000110 [8] c6 [8] 854 (0xC6) |11000111 [8] c7 [8] 855 (0xC7) |11001000 [8] c8 [8] 856 (0xC8) |11001001 [8] c9 [8] 857 (0xC9) |11001010 [8] ca [8] 858 (0xCA) |11001011 [8] cb [8] 859 (0xCB) |11001100 [8] cc [8] 860 (0xCC) |11001101 [8] cd [8] 861 (0xCD) |11001110 [8] ce [8] 862 (0xCE) |11001111 [8] cf [8] 863 (0xCF) |11010000 [8] d0 [8] 864 (0xD0) |11010001 [8] d1 [8] 865 (0xD1) |11010010 [8] d2 [8] 866 (0xD2) |11010011 [8] d3 [8] 867 (0xD3) |11010100 [8] d4 [8] 868 (0xD4) |11010101 [8] d5 [8] 869 (0xD5) |11010110 [8] d6 [8] 870 (0xD6) |11010111 [8] d7 [8] 871 (0xD7) |11011000 [8] d8 [8] 872 (0xD8) |11011001 [8] d9 [8] 873 (0xD9) |11011010 [8] da [8] 874 (0xDA) |11011011 [8] db [8] 875 (0xDB) |11011100 [8] dc [8] 876 (0xDC) |11011101 [8] dd [8] 877 (0xDD) |11011110 [8] de [8] 878 (0xDE) |11011111 [8] df [8] 879 (0xDF) |11100000 [8] e0 [8] 880 (0xE0) |11100001 [8] e1 [8] 881 (0xE1) |11100010 [8] e2 [8] 882 (0xE2) |11100011 [8] e3 [8] 883 (0xE3) |11100100 [8] e4 [8] 884 (0xE4) |11100101 [8] e5 [8] 885 (0xE5) |11100110 [8] e6 [8] 886 (0xE6) |11100111 [8] e7 [8] 887 (0xE7) |11101000 [8] e8 [8] 888 (0xE8) |11101001 [8] e9 [8] 889 (0xE9) |11101010 [8] ea [8] 890 (0xEA) |11101011 [8] eb [8] 891 (0xEB) |11101100 [8] ec [8] 892 (0xEC) |11101101 [8] ed [8] 893 (0xED) |11101110 [8] ee [8] 894 (0xEE) |11101111 [8] ef [8] 895 (0xEF) |11110000 [8] f0 [8] 896 (0xF0) |11110001 [8] f1 [8] 897 (0xF1) |11110010 [8] f2 [8] 898 (0xF2) |11110011 [8] f3 [8] 899 (0xF3) |11110100 [8] f4 [8] 900 (0xF4) |11110101 [8] f5 [8] 902 Appendix B. Static Storage Cache 904 0x80 "date" = NIL 905 0x81 ":scheme" = "https" 906 0x82 ":scheme" = "http" 907 0x83 ":scheme" = "ftp" 908 0x84 ":method" = "get" 909 0x85 ":method" = "post" 910 0x86 ":method" = "put" 911 0x87 ":method" = "delete" 912 0x88 ":method" = "options" 913 0x89 ":method" = "patch" 914 0x8A ":method" = "connect" 915 0x8B ":path" = "/" 916 0x8C ":host" = NIL 917 0x8D "cookie" = NIL 918 0x8E ":status" = 100 919 0x8F ":status" = 101 920 0x90 ":status" = 102 921 0x91 ":status" = 200 922 0x92 ":status" = 201 923 0x93 ":status" = 202 924 0x94 ":status" = 203 925 0x95 ":status" = 204 926 0x96 ":status" = 205 927 0x97 ":status" = 206 928 0x98 ":status" = 207 929 0x99 ":status" = 208 930 0x9A ":status" = 300 931 0x9B ":status" = 301 932 0x9C ":status" = 302 933 0x9D ":status" = 303 934 0x9E ":status" = 304 935 0x9F ":status" = 305 936 0xA0 ":status" = 307 937 0xA1 ":status" = 308 938 0xA2 ":status" = 400 939 0xA3 ":status" = 401 940 0xA4 ":status" = 402 941 0xA5 ":status" = 403 942 0xA6 ":status" = 404 943 0xA7 ":status" = 405 944 0xA8 ":status" = 406 945 0xA9 ":status" = 407 946 0xAA ":status" = 408 947 0xAB ":status" = 409 948 0xAC ":status" = 410 949 0xAD ":status" = 411 950 0xAE ":status" = 412 951 0xAF ":status" = 413 952 0xB0 ":status" = 414 953 0xB1 ":status" = 415 954 0xB2 ":status" = 416 955 0xB3 ":status" = 417 956 0xB4 ":status" = 500 957 0xB5 ":status" = 501 958 0xB6 ":status" = 502 959 0xB7 ":status" = 503 960 0xB8 ":status" = 504 961 0xB9 ":status" = 505 962 0xBA ":status-text" = "OK" 963 0xBB ":version" = "1.1" 964 0xBC "accept" = NIL 965 0xBD "accept-charset" = NIL 966 0xBE "accept-encoding" = NIL 967 0xBF "accept-language" = NIL 968 0xC0 "accept-ranges" = NIL 969 0xC1 "allow" = NIL 970 0xC2 "authorization" = NIL 971 0xC3 "cache-control" = NIL 972 0xC4 "content-base" = NIL 973 0xC5 "content-encoding" = NIL 974 0xC6 "content-length" = NIL 975 0xC7 "content-location" = NIL 976 0xC8 "content-md5" = NIL 977 0xC9 "content-range" = NIL 978 0xCA "content-type" = NIL 979 0xCB "content-disposition" = NIL 980 0xCC "content-language" = NIL 981 0xCD "etag" = NIL 982 0xCE "expect" = NIL 983 0xCF "expires" = NIL 984 0xD0 "from" = NIL 985 0xD1 "if-match" = NIL 986 0xD2 "if-modified-since" = NIL 987 0xD3 "if-none-match" = NIL 988 0xD4 "if-range" = NIL 989 0xD5 "if-unmodified-since" = NIL 990 0xD6 "last-modified" = NIL 991 0xD7 "location" = NIL 992 0xD8 "max-forwards" = NIL 993 0xD9 "origin" = NIL 994 0xDA "pragma" = NIL 995 0xDB "proxy-authenticate" = NIL 996 0xDC "proxy-authorization" = NIL 997 0xDD "range" = NIL 998 0xDE "referer" = NIL 999 0xDF "retry-after" = NIL 1000 0xE0 "server" = NIL 1001 0xE1 "set-cookie" = NIL 1002 0xE2 "status" = NIL 1003 0xE3 "te" = NIL 1004 0xE4 "trailer" = NIL 1005 0xE5 "transfer-encoding" = NIL 1006 0xE6 "upgrade" = NIL 1007 0xE7 "user-agent" = NIL 1008 0xE8 "vary" = NIL 1009 0xE9 "via" = NIL 1010 0xEA "warning" = NIL 1011 0xEB "www-authenticate" = NIL 1012 0xEC "access-control-allow-origin" = NIL 1013 0xED "get-dictionary" = NIL 1014 0xEE "p3p" = NIL 1015 0xEF "link" = NIL 1016 0xF0 "prefer" = NIL 1017 0xF1 "preference-applied" = NIL 1018 0xF2 "accept-patch" = NIL 1019 0xF3 NIL 1020 0xF4 NIL 1021 0xF5 NIL 1022 0xF6 NIL 1023 0xF7 NIL 1024 0xF8 NIL 1025 0xF9 NIL 1026 0xFA NIL 1027 0xFB NIL 1028 0xFC NIL 1029 0xFD NIL 1030 0xFE NIL 1031 0xFF NIL 1033 Author's Address 1035 James M Snell 1037 Email: jasnell@gmail.com