<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.2.11 -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc docmapping="yes"?>

<rfc ipr="trust200902" docName="draft-ietf-quic-qpack-08" category="std">

  <front>
    <title abbrev="QPACK">QPACK: Header Compression for HTTP/3</title>

    <author initials="C." surname="Krasic" fullname="Charles 'Buck' Krasic">
      <organization>Netflix</organization>
      <address>
        <email>ckrasic@netflix.com</email>
      </address>
    </author>
    <author initials="M." surname="Bishop" fullname="Mike Bishop">
      <organization>Akamai Technologies</organization>
      <address>
        <email>mbishop@evequefou.be</email>
      </address>
    </author>
    <author initials="A." surname="Frindell" fullname="Alan Frindell" role="editor">
      <organization>Facebook</organization>
      <address>
        <email>afrind@fb.com</email>
      </address>
    </author>

    <date year="2019" month="April" day="23"/>

    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    

    <abstract>


<t>This specification defines QPACK, a compression format for efficiently
representing HTTP header fields, to be used in HTTP/3. This is a variation of
HPACK header compression that seeks to reduce head-of-line blocking.</t>



    </abstract>


    <note title="Note to Readers">


<t>Discussion of this draft takes place on the QUIC working group mailing list
(quic@ietf.org), which is archived at
<eref target="https://mailarchive.ietf.org/arch/search/?email_list=quic">https://mailarchive.ietf.org/arch/search/?email_list=quic</eref>.</t>

<t>Working Group information can be found at <eref target="https://github.com/quicwg">https://github.com/quicwg</eref>; source
code and issues list for this draft can be found at
<eref target="https://github.com/quicwg/base-drafts/labels/-qpack">https://github.com/quicwg/base-drafts/labels/-qpack</eref>.</t>


    </note>


  </front>

  <middle>


<section anchor="introduction" title="Introduction">

<t>The QUIC transport protocol was designed from the outset to support HTTP
semantics, and its design subsumes many of the features of HTTP/2.  HTTP/2 uses
HPACK (<xref target="RFC7541"/>) for header compression, but QUIC’s stream multiplexing
comes into some conflict with HPACK.  A key goal of the design of QUIC is to
improve stream multiplexing relative to HTTP/2 by reducing head-of-line
blocking.  If HPACK were used for HTTP/3, it would induce head-of-line
blocking due to built-in assumptions of a total ordering across frames on all
streams.</t>

<t>QUIC is described in <xref target="QUIC-TRANSPORT"/>.  The HTTP/3 mapping is described in
<xref target="HTTP3"/>. For a full description of HTTP/2, see <xref target="RFC7540"/>. The
description of HPACK is <xref target="RFC7541"/>.</t>

<t>QPACK reuses core concepts from HPACK, but is redesigned to allow correctness in
the presence of out-of-order delivery, with flexibility for implementations to
balance between resilience against head-of-line blocking and optimal compression
ratio.  The design goals are to closely approach the compression ratio of HPACK
with substantially less head-of-line blocking under the same loss conditions.</t>

<section anchor="conventions-and-definitions" title="Conventions and Definitions">

<t>The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”,
“SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this
document are to be interpreted as described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/>
when, and only when, they appear in all capitals, as shown here.</t>

<t>Definitions of terms that are used in this document:</t>

<t><list style="hanging">
  <t hangText='Header field:'>
  A name-value pair sent as part of an HTTP message.</t>
  <t hangText='Header list:'>
  An ordered collection of header fields associated with an HTTP message.  A
header list can contain multiple header fields with the same name.  It can
also contain duplicate header fields.</t>
  <t hangText='Header block:'>
  The compressed representation of a header list.</t>
  <t hangText='Encoder:'>
  An implementation which transforms a header list into a header block.</t>
  <t hangText='Decoder:'>
  An implementation which transforms a header block into a header list.</t>
  <t hangText='Absolute Index:'>
  A unique index for each entry in the dynamic table.</t>
  <t hangText='Base:'>
  A reference point for relative indicies.  Dynamic references are made relative
to a Base in header blocks.</t>
  <t hangText='Insert Count:'>
  The total number of entries inserted in the dynamic table.</t>
</list></t>

<t>QPACK is a name, not an acronym.</t>

</section>
<section anchor="notational-conventions" title="Notational Conventions">

<t>Diagrams use the format described in Section 3.1 of <xref target="RFC2360"/>, with the
following additional conventions:</t>

<t><list style="hanging">
  <t hangText='x (A)'>
  Indicates that x is A bits long</t>
  <t hangText='x (A+)'>
  Indicates that x uses the prefixed integer encoding defined in Section 5.1 of
<xref target="RFC7541"></xref>, beginning with an A-bit prefix.</t>
  <t hangText='x …'>
  Indicates that x is variable-length and extends to the end of the region.</t>
</list></t>

</section>
</section>
<section anchor="compression-process-overview" title="Compression Process Overview">

<t>Like HPACK, QPACK uses two tables for associating header fields to indices.  The
static table (see <xref target="table-static"/>) is predefined and contains common header
fields (some of them with an empty value).  The dynamic table (see
<xref target="table-dynamic"/>) is built up over the course of the connection and can be used
by the encoder to index header fields in the encoded header lists.</t>

<t>QPACK instructions appear in three different types of streams:</t>

<t><list style="symbols">
  <t>The encoder uses a unidirectional stream to modify the state of the dynamic
table without emitting header fields associated with any particular request.</t>
  <t>HEADERS and PUSH_PROMISE frames on request and push streams reference the
table state without modifying it.</t>
  <t>The decoder sends feedback to the encoder on a unidirectional stream.  This
feedback enables the encoder to manage dynamic table state.</t>
</list></t>

<section anchor="encoder" title="Encoder">

<t>An encoder compresses a header list by emitting either an indexed or a literal
representation for each header field in the list.  References to the static
table and literal representations do not require any dynamic state and never
risk head-of-line blocking.  References to the dynamic table risk head-of-line
blocking if the encoder has not received an acknowledgement indicating the entry
is available at the decoder.</t>

<t>An encoder MAY insert any entry in the dynamic table it chooses; it is not
limited to header fields it is compressing.</t>

<t>QPACK preserves the ordering of header fields within each header list.  An
encoder MUST emit header field representations in the order they appear in the
input header list.</t>

<t>QPACK is designed to contain the more complex state tracking to the encoder,
while the decoder is relatively simple.</t>

<section anchor="reference-tracking" title="Reference Tracking">

<t>An encoder MUST ensure that a header block which references a dynamic table
entry is not received by the decoder after the referenced entry has been
evicted.  Hence the encoder needs to track information about each compressed
header block that references the dynamic table until that header block is
acknowledged by the decoder.</t>

</section>
<section anchor="blocked-insertion" title="Blocked Dynamic Table Insertions">

<t>A dynamic table entry is considered blocking and cannot be evicted until its
insertion has been acknowledged and there are no outstanding unacknowledged
references to the entry.  In particular, a dynamic table entry that has never
been referenced can still be blocking.</t>

<t><list style="hanging">
  <t hangText='Note:'>
  A blocking entry is unrelated to a blocked stream, which is a stream that a
decoder cannot decode as a result of references to entries that are not yet
available.  Any encoder that uses the dynamic table has to keep track of
blocked entries, whereas blocked streams are optional.</t>
</list></t>

<t>An encoder MUST NOT insert an entry into the dynamic table (or duplicate an
existing entry) if doing so would evict a blocking entry.  In this case, the
encoder can send literal representations of header fields.</t>

<t>To ensure that the encoder is not prevented from adding new entries, the encoder
can avoid referencing entries that are close to eviction.  Rather than
reference such an entry, the encoder can emit a Duplicate instruction (see
<xref target="duplicate"/>), and reference the duplicate instead.</t>

<t>Determining which entries are too close to eviction to reference is an encoder
preference.  One heuristic is to target a fixed amount of available space in the
dynamic table: either unused space or space that can be reclaimed by evicting
non-blocking entries.  To achieve this, the encoder can maintain a draining
index, which is the smallest absolute index in the dynamic table that it will
emit a reference for.  As new entries are inserted, the encoder increases the
draining index to maintain the section of the table that it will not reference.
If the encoder does not create new references to entries with an absolute index
lower than the draining index, the number of unacknowledged references to those
entries will eventually become zero, allowing them to be evicted.</t>

<figure title="Draining Dynamic Table Entries" anchor="fig-draining-index"><artwork type="drawing"><![CDATA[
   +----------+---------------------------------+--------+
   | Draining |          Referenceable          | Unused |
   | Entries  |             Entries             | Space  |
   +----------+---------------------------------+--------+
   ^          ^                                 ^
   |          |                                 |
 Dropping    Draining Index               Insertion Point
  Point
]]></artwork></figure>

</section>
<section anchor="overview-hol-avoidance" title="Avoiding Head-of-Line Blocking">

<t>Because QUIC does not guarantee order between data on different streams, a
header block might reference an entry in the dynamic table that has not yet been
received.</t>

<t>Each header block contains a Required Insert Count, the lowest possible value
for the Insert Count with which the header block can be decoded. For a header
block with references to the dynamic table, the Required Insert Count is one
larger than the largest Absolute Index of all referenced dynamic table
entries. For a header block with no references to the dynamic table, the
Required Insert Count is zero.</t>

<t>If the decoder encounters a header block with a Required Insert Count value
larger than defined above, it MAY treat this as a stream error of type
HTTP_QPACK_DECOMPRESSION_FAILED.  If the decoder encounters a header block with
a Required Insert Count value smaller than defined above, it MUST treat this as
a stream error of type HTTP_QPACK_DECOMPRESSION_FAILED as prescribed in
<xref target="invalid-references"/>.</t>

<t>When the Required Insert Count is zero, the frame contains no references to the
dynamic table and can always be processed immediately.</t>

<t>If the Required Insert Count is greater than the number of dynamic table entries
received, the stream is considered “blocked.”  While blocked, header field data
SHOULD remain in the blocked stream’s flow control window.  A stream becomes
unblocked when the Insert Count becomes greater than or equal to the Required
Insert Count for all header blocks the decoder has started reading from the
stream.</t>

<t>The SETTINGS_QPACK_BLOCKED_STREAMS setting (see <xref target="configuration"/>) specifies an
upper bound on the number of streams which can be blocked. An encoder MUST limit
the number of streams which could become blocked to the value of
SETTINGS_QPACK_BLOCKED_STREAMS at all times. Note that the decoder might not
actually become blocked on every stream which risks becoming blocked.  If the
decoder encounters more blocked streams than it promised to support, it MUST
treat this as a stream error of type HTTP_QPACK_DECOMPRESSION_FAILED.</t>

<t>An encoder can decide whether to risk having a stream become blocked. If
permitted by the value of SETTINGS_QPACK_BLOCKED_STREAMS, compression efficiency
can often be improved by referencing dynamic table entries that are still in
transit, but if there is loss or reordering the stream can become blocked at the
decoder.  An encoder avoids the risk of blocking by only referencing dynamic
table entries which have been acknowledged, but this could mean using
literals. Since literals make the header block larger, this can result in the
encoder becoming blocked on congestion or flow control limits.</t>

</section>
<section anchor="known-received-count" title="Known Received Count">

<t>In order to identify which dynamic table entries can be safely used without a
stream becoming blocked, the encoder tracks the number of entries received by
the decoder.  The Known Received Count tracks the total number of acknowledged
insertions.</t>

<t>When blocking references are permitted, the encoder uses header block
acknowledgement to maintain the Known Received Count, as described in
<xref target="header-acknowledgement"/>.</t>

<t>To acknowledge dynamic table entries which are not referenced by header blocks,
for example because the encoder or the decoder have chosen not to risk blocked
streams, the decoder sends an Insert Count Increment instruction (see
<xref target="insert-count-increment"/>).</t>

</section>
</section>
<section anchor="decoder" title="Decoder">

<t>As in HPACK, the decoder processes header blocks and emits the corresponding
header lists. It also processes dynamic table modifications from encoder
instructions received on the encoder stream.</t>

<t>The decoder MUST emit header fields in the order their representations appear in
the input header block.</t>

<section anchor="state-synchronization" title="State Synchronization">

<t>The decoder instructions (<xref target="decoder-instructions"/>) signal key events at the
decoder that permit the encoder to track the decoder’s state.  These events are:</t>

<t><list style="symbols">
  <t>Complete processing of a header block</t>
  <t>Abandonment of a stream which might have remaining header blocks</t>
  <t>Receipt of new dynamic table entries</t>
</list></t>

<t>Knowledge that a header block with references to the dynamic table has been
processed permits the encoder to evict entries to which no unacknowledged
references remain (see <xref target="blocked-insertion"/>).  When a stream is reset or
abandoned, the indication that these header blocks will never be processed
serves a similar function (see <xref target="stream-cancellation"/>).</t>

<t>The decoder chooses when to emit Insert Count Increment instructions (see
<xref target="insert-count-increment"/>). Emitting an instruction after adding each new
dynamic table entry will provide the most timely feedback to the encoder, but
could be redundant with other decoder feedback. By delaying an Insert Count
Increment instruction, the decoder might be able to coalesce multiple Insert
Count Increment instructions, or replace them entirely with Header
Acknowledgements (see <xref target="header-acknowledgement"/>). However, delaying too long
may lead to compression inefficiencies if the encoder waits for an entry to be
acknowledged before using it.</t>

</section>
<section anchor="blocked-decoding" title="Blocked Decoding">

<t>To track blocked streams, the Required Insert Count value for each stream can be
used.  Whenever the decoder processes a table update, it can begin decoding any
blocked streams that now have their dependencies satisfied.</t>

</section>
</section>
</section>
<section anchor="header-tables" title="Header Tables">

<t>Unlike in HPACK, entries in the QPACK static and dynamic tables are addressed
separately.  The following sections describe how entries in each table are
addressed.</t>

<section anchor="table-static" title="Static Table">

<t>The static table consists of a predefined static list of header fields, each of
which has a fixed index over time.  Its entries are defined in <xref target="static-table"/>.</t>

<t>All entries in the static table have a name and a value.  However, values can be
empty (that is, have a length of 0).</t>

<t>Note the QPACK static table is indexed from 0, whereas the HPACK static table
is indexed from 1.</t>

<t>When the decoder encounters an invalid static table index in a header block
instruction it MUST treat this as a stream error of type
<spanx style="verb">HTTP_QPACK_DECOMPRESSION_FAILED</spanx>.  If this index is received on the encoder
stream, this MUST be treated as a connection error of type
<spanx style="verb">HTTP_QPACK_ENCODER_STREAM_ERROR</spanx>.</t>

</section>
<section anchor="table-dynamic" title="Dynamic Table">

<t>The dynamic table consists of a list of header fields maintained in first-in,
first-out order. Each HTTP/3 endpoint holds a dynamic table that is initially
empty.  Entries are added by encoder instructions received on the encoder stream
(see <xref target="encoder-instructions"/>).</t>

<t>The dynamic table can contain duplicate entries (i.e., entries with the same
name and same value).  Therefore, duplicate entries MUST NOT be treated as an
error by the decoder.</t>

<section anchor="dynamic-table-size" title="Dynamic Table Size">

<t>The size of the dynamic table is the sum of the size of its entries.</t>

<t>The size of an entry is the sum of its name’s length in bytes (as defined in
<xref target="string-literals"/>), its value’s length in bytes, and 32.</t>

<t>The size of an entry is calculated using the length of its name and value
without Huffman encoding applied.</t>

</section>
<section anchor="eviction" title="Dynamic Table Capacity and Eviction">

<t>The encoder sets the capacity of the dynamic table, which serves as the upper
limit on its size.  The initial capcity of the dynamic table is zero.</t>

<t>Before a new entry is added to the dynamic table, entries are evicted from the
end of the dynamic table until the size of the dynamic table is less than or
equal to (table capacity - size of new entry) or until the table is empty. The
encoder MUST NOT evict a blocking dynamic table entry (see
<xref target="blocked-insertion"/>).</t>

<t>If the size of the new entry is less than or equal to the dynamic table
capacity, then that entry is added to the table.  It is an error if the encoder
attempts to add an entry that is larger than the dynamic table capacity; the
decoder MUST treat this as a connection error of type
<spanx style="verb">HTTP_QPACK_ENCODER_STREAM_ERROR</spanx>.</t>

<t>A new entry can reference an entry in the dynamic table that will be evicted
when adding this new entry into the dynamic table.  Implementations are
cautioned to avoid deleting the referenced name or value if the referenced entry
is evicted from the dynamic table prior to inserting the new entry.</t>

<t>Whenever the dynamic table capacity is reduced by the encoder, entries are
evicted from the end of the dynamic table until the size of the dynamic table is
less than or equal to the new table capacity.  This mechanism can be used to
completely clear entries from the dynamic table by setting a capacity of 0,
which can subsequently be restored.</t>

</section>
<section anchor="maximum-dynamic-table-capacity" title="Maximum Dynamic Table Capacity">

<t>To bound the memory requirements of the decoder, the decoder limits the maximum
value the encoder is permitted to set for the dynamic table capacity.  In
HTTP/3, this limit is determined by the value of
SETTINGS_QPACK_MAX_TABLE_CAPACITY sent by the decoder (see <xref target="configuration"/>).
The encoder MUST not set a dynamic table capacity that exceeds this maximum, but
it can choose to use a lower dynamic table capacity (see
<xref target="set-dynamic-capacity"/>).</t>

<t>For clients using 0-RTT data in HTTP/3, the server’s maximum table capacity is
the remembered value of the setting, or zero if the value was not previously
sent.  When the client’s 0-RTT value of the SETTING is 0, the server MAY set it
to a non-zero value in its SETTINGS frame. If the remembered value is non-zero,
the server MUST send the same non-zero value in its SETTINGS frame.  If it
specifies any other value, or omits SETTINGS_QPACK_MAX_TABLE_CAPACITY from
SETTINGS, the encoder must treat this as a connection error of type
<spanx style="verb">HTTP_QPACK_DECODER_STREAM_ERROR</spanx>.</t>

<t>For HTTP/3 servers and HTTP/3 clients when 0-RTT is not attempted or is
rejected, the maximum table capacity is 0 until the encoder processes a SETTINGS
frame with a non-zero value of SETTINGS_QPACK_MAX_TABLE_CAPACITY.</t>

<t>When the maximum table capacity is 0, the encoder MUST NOT insert entries into
the dynamic table, and MUST NOT send any encoder instructions on the encoder
stream.</t>

</section>
<section anchor="indexing" title="Absolute Indexing">

<t>Each entry possesses both an absolute index which is fixed for the lifetime of
that entry and a relative index which changes based on the context of the
reference. The first entry inserted has an absolute index of “0”; indices
increase by one with each insertion.</t>

</section>
<section anchor="relative-indexing" title="Relative Indexing">

<t>The relative index begins at zero and increases in the opposite direction from
the absolute index.  Determining which entry has a relative index of “0” depends
on the context of the reference.</t>

<t>In encoder instructions, a relative index of “0” always refers to the most
recently inserted value in the dynamic table.  Note that this means the entry
referenced by a given relative index will change while interpreting instructions
on the encoder stream.</t>

<figure title="Example Dynamic Table Indexing - Control Stream"><artwork type="drawing"><![CDATA[
      +-----+---------------+-------+
      | n-1 |      ...      |   d   |  Absolute Index
      + - - +---------------+ - - - +
      |  0  |      ...      | n-d-1 |  Relative Index
      +-----+---------------+-------+
      ^                             |
      |                             V
Insertion Point               Dropping Point

n = count of entries inserted
d = count of entries dropped
]]></artwork></figure>

<t>Unlike encoder instructions, relative indices in header block instructions are
relative to the Base at the beginning of the header block (see
<xref target="header-prefix"/>). This ensures that references are stable even if the dynamic
table is updated while decoding a header block.</t>

<t>The Base is encoded as a value relative to the Required Insert Count. The Base
identifies which dynamic table entries can be referenced using relative
indexing, starting with 0 at the last entry added.</t>

<t>Post-Base references are used for entries inserted after base, starting at 0 for
the first entry added after the Base, see <xref target="post-base"/>.</t>

<figure title="Example Dynamic Table Indexing - Relative Index in Header Block"><artwork type="drawing"><![CDATA[
 Required
  Insert
  Count        Base
    |           |
    V           V
    +-----+-----+-----+-----+-------+
    | n-1 | n-2 | n-3 | ... |   d   |  Absolute Index
    +-----+-----+  -  +-----+   -   +
                |  0  | ... | n-d-3 |  Relative Index
                +-----+-----+-------+

n = count of entries inserted
d = count of entries dropped
]]></artwork></figure>

</section>
<section anchor="post-base" title="Post-Base Indexing">

<t>A header block can reference entries added after the entry identified by the
Base. This allows an encoder to process a header block in a single pass and
include references to entries added while processing this (or other) header
blocks. Newly added entries are referenced using Post-Base instructions. Indices
for Post-Base instructions increase in the same direction as absolute indices,
with the zero value being the first entry inserted after the Base.</t>

<figure title="Example Dynamic Table Indexing - Post-Base Index in Header Block"><artwork type="drawing"><![CDATA[
               Base
                |
                V
    +-----+-----+-----+-----+-----+
    | n-1 | n-2 | n-3 | ... |  d  |  Absolute Index
    +-----+-----+-----+-----+-----+
    |  1  |  0  |                    Post-Base Index
    +-----+-----+

n = count of entries inserted
d = count of entries dropped
]]></artwork></figure>

</section>
<section anchor="invalid-references" title="Invalid References">

<t>If the decoder encounters a reference in a header block instruction to a dynamic
table entry which has already been evicted or which has an absolute index
greater than or equal to the declared Required Insert Count (see
<xref target="header-prefix"/>), it MUST treat this as a stream error of type
<spanx style="verb">HTTP_QPACK_DECOMPRESSION_FAILED</spanx>.</t>

<t>If the decoder encounters a reference in an encoder instruction to a dynamic
table entry which has already been dropped, it MUST treat this as a connection
error of type <spanx style="verb">HTTP_QPACK_ENCODER_STREAM_ERROR</spanx>.</t>

</section>
</section>
</section>
<section anchor="wire-format" title="Wire Format">

<section anchor="primitives" title="Primitives">

<section anchor="prefixed-integers" title="Prefixed Integers">

<t>The prefixed integer from Section 5.1 of <xref target="RFC7541"></xref> is used heavily throughout
this document.  The format from <xref target="RFC7541"></xref> is used unmodified.  QPACK
implementations MUST be able to decode integers up to 62 bits long.</t>

</section>
<section anchor="string-literals" title="String Literals">

<t>The string literal defined by Section 5.2 of <xref target="RFC7541"></xref> is also used throughout.
This string format includes optional Huffman encoding.</t>

<t>HPACK defines string literals to begin on a byte boundary.  They begin with a
single flag (indicating whether the string is Huffman-coded), followed by the
Length encoded as a 7-bit prefix integer, and finally Length bytes of data.
When Huffman encoding is enabled, the Huffman table from Appendix B of <xref target="RFC7541"></xref>
is used without modification.</t>

<t>This document expands the definition of string literals and permits them to
begin other than on a byte boundary.  An “N-bit prefix string literal” begins
with the same Huffman flag, followed by the length encoded as an (N-1)-bit
prefix integer.  The remainder of the string literal is unmodified.</t>

<t>A string literal without a prefix length noted is an 8-bit prefix string literal
and follows the definitions in <xref target="RFC7541"></xref> without modification.</t>

</section>
</section>
<section anchor="instructions" title="Instructions">

<t>There are three separate QPACK instruction spaces. Encoder instructions
(<xref target="encoder-instructions"/>) carry table updates, decoder instructions
(<xref target="decoder-instructions"/>) carry acknowledgments of table modifications and
header processing, and header block instructions (<xref target="header-block-instructions"/>)
convey an encoded representation of a header list by referring to the QPACK
table state.</t>

<t>Encoder and decoder instructions appear on the unidirectional stream types
described in this section. Header block instructions are contained in HEADERS
and PUSH_PROMISE frames, which are conveyed on request or push streams as
described in <xref target="HTTP3"/>.</t>

<section anchor="enc-dec-stream-def" title="Encoder and Decoder Streams">

<t>QPACK defines two unidirectional stream types:</t>

<t><list style="symbols">
  <t>An encoder stream is a unidirectional stream of type <spanx style="verb">0x02</spanx>.
It carries an unframed sequence of encoder instructions from encoder
to decoder.</t>
  <t>A decoder stream is a unidirectional stream of type <spanx style="verb">0x03</spanx>.
It carries an unframed sequence of decoder instructions from decoder
to encoder.</t>
</list></t>

<!-- s/exactly/no more than/  ? -->
<t>HTTP/3 endpoints contain a QPACK encoder and decoder. Each endpoint MUST
initiate a single encoder stream and decoder stream. Receipt of a second
instance of either stream type be MUST treated as a connection error of type
HTTP_WRONG_STREAM_COUNT. These streams MUST NOT be closed. Closure of either
unidirectional stream type MUST be treated as a connection error of type
HTTP_CLOSED_CRITICAL_STREAM.</t>

</section>
</section>
<section anchor="encoder-instructions" title="Encoder Instructions">

<t>Table updates can add a table entry, possibly using existing entries to avoid
transmitting redundant information.  The name can be transmitted as a reference
to an existing entry in the static or the dynamic table or as a string literal.
For entries which already exist in the dynamic table, the full entry can also be
used by reference, creating a duplicate entry.</t>

<t>This section specifies the following encoder instructions.</t>

<section anchor="insert-with-name-reference" title="Insert With Name Reference">

<t>An addition to the header table where the header field name matches the header
field name of an entry stored in the static table or the dynamic table starts
with the ‘1’ one-bit pattern.  The <spanx style="verb">S</spanx> bit indicates whether the reference is to
the static (S=1) or dynamic (S=0) table. The 6-bit prefix integer (see Section
5.1 of <xref target="RFC7541"></xref>) that follows is used to locate the table entry for the header
name.  When S=1, the number represents the static table index; when S=0, the
number is the relative index of the entry in the dynamic table.</t>

<t>The header name reference is followed by the header field value represented as a
string literal (see Section 5.2 of <xref target="RFC7541"></xref>).</t>

<figure title="Insert Header Field -- Indexed Name"><artwork type="drawing"><![CDATA[
     0   1   2   3   4   5   6   7
   +---+---+---+---+---+---+---+---+
   | 1 | S |    Name Index (6+)    |
   +---+---+-----------------------+
   | H |     Value Length (7+)     |
   +---+---------------------------+
   |  Value String (Length bytes)  |
   +-------------------------------+
]]></artwork></figure>

</section>
<section anchor="insert-without-name-reference" title="Insert Without Name Reference">

<t>An addition to the header table where both the header field name and the header
field value are represented as string literals (see <xref target="primitives"/>) starts with
the ‘01’ two-bit pattern.</t>

<t>The name is represented as a 6-bit prefix string literal, while the value is
represented as an 8-bit prefix string literal.</t>

<figure title="Insert Header Field -- New Name"><artwork type="drawing"><![CDATA[
     0   1   2   3   4   5   6   7
   +---+---+---+---+---+---+---+---+
   | 0 | 1 | H | Name Length (5+)  |
   +---+---+---+-------------------+
   |  Name String (Length bytes)   |
   +---+---------------------------+
   | H |     Value Length (7+)     |
   +---+---------------------------+
   |  Value String (Length bytes)  |
   +-------------------------------+
]]></artwork></figure>

</section>
<section anchor="duplicate" title="Duplicate">

<t>Duplication of an existing entry in the dynamic table starts with the ‘000’
three-bit pattern.  The relative index of the existing entry is represented as
an integer with a 5-bit prefix.</t>

<figure title="Duplicate" anchor="fig-index-with-duplication"><artwork type="drawing"><![CDATA[
     0   1   2   3   4   5   6   7
   +---+---+---+---+---+---+---+---+
   | 0 | 0 | 0 |    Index (5+)     |
   +---+---+---+-------------------+
]]></artwork></figure>

<t>The existing entry is re-inserted into the dynamic table without resending
either the name or the value. This is useful to mitigate the eviction of older
entries which are frequently referenced, both to avoid the need to resend the
header and to avoid the entry in the table blocking the ability to insert new
headers.</t>

</section>
<section anchor="set-dynamic-capacity" title="Set Dynamic Table Capacity">

<t>An encoder informs the decoder of a change to the dynamic table capacity using
an instruction which begins with the ‘001’ three-bit pattern.  The new dynamic
table capacity is represented as an integer with a 5-bit prefix (see Section 5.1
of <xref target="RFC7541"></xref>).</t>

<figure title="Set Dynamic Table Capacity" anchor="fig-set-capacity"><artwork type="drawing"><![CDATA[
  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 0 | 0 | 1 |   Capacity (5+)   |
+---+---+---+-------------------+
]]></artwork></figure>

<t>The new capacity MUST be lower than or equal to the limit described in
<xref target="maximum-dynamic-table-capacity"/>.  In HTTP/3, this limit is the value of the
SETTINGS_QPACK_MAX_TABLE_CAPACITY parameter (see <xref target="configuration"/>) received
from the decoder.  The decoder MUST treat a new dynamic table capacity value
that exceeds this limit as a connection error of type
<spanx style="verb">HTTP_QPACK_ENCODER_STREAM_ERROR</spanx>.</t>

<t>Reducing the dynamic table capacity can cause entries to be evicted (see
<xref target="eviction"/>).  This MUST NOT cause the eviction of blocking entries (see
<xref target="blocked-insertion"/>).  Changing the capacity of the dynamic table is not
acknowledged as this instruction does not insert an entry.</t>

</section>
</section>
<section anchor="decoder-instructions" title="Decoder Instructions">

<t>Decoder instructions provide information used to ensure consistency of the
dynamic table. They are sent from the decoder to the encoder on a decoder
stream; that is, the server informs the client about the processing of the
client’s header blocks and table updates, and the client informs the server
about the processing of the server’s header blocks and table updates.</t>

<t>This section specifies the following decoder instructions.</t>

<section anchor="insert-count-increment" title="Insert Count Increment">

<t>The Insert Count Increment instruction begins with the ‘00’ two-bit pattern.
The instruction specifies the total number of dynamic table inserts and
duplications since the last Insert Count Increment or Header Acknowledgement
that increased the Known Received Count for the dynamic table (see
<xref target="known-received-count"/>).  The Increment field is encoded as a 6-bit prefix
integer. The encoder uses this value to determine which table entries might
cause a stream to become blocked, as described in <xref target="state-synchronization"/>.</t>

<figure title="Insert Count Increment" anchor="fig-size-sync"><artwork type="drawing"><![CDATA[
  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 0 | 0 |     Increment (6+)    |
+---+---+-----------------------+
]]></artwork></figure>

<t>An encoder that receives an Increment field equal to zero or one that increases
the Known Received Count beyond what the encoder has sent MUST treat this as a
connection error of type <spanx style="verb">HTTP_QPACK_DECODER_STREAM_ERROR</spanx>.</t>

</section>
<section anchor="header-acknowledgement" title="Header Acknowledgement">

<t>After processing a header block whose declared Required Insert Count is not
zero, the decoder emits a Header Acknowledgement instruction on the decoder
stream.  The instruction begins with the ‘1’ one-bit pattern and includes the
header block’s associated stream ID, encoded as a 7-bit prefix integer.  It is
used by the peer’s encoder to know when it is safe to evict an entry, and
possibly update the Known Received Count.</t>

<figure title="Header Acknowledgement" anchor="fig-header-ack"><artwork type="drawing"><![CDATA[
  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 1 |      Stream ID (7+)       |
+---+---------------------------+
]]></artwork></figure>

<t>The same Stream ID can be identified multiple times, as multiple header blocks
can be sent on a single stream in the case of intermediate responses, trailers,
and pushed requests.  Since HEADERS and PUSH_PROMISE frames on each stream are
received and processed in order, this gives the encoder precise feedback on
which header blocks within a stream have been fully processed.</t>

<t>If an encoder receives a Header Acknowledgement instruction referring to a
stream on which every header block with a non-zero Required Insert Count has
already been acknowledged, that MUST be treated as a connection error of type
<spanx style="verb">HTTP_QPACK_DECODER_STREAM_ERROR</spanx>.</t>

<t>When blocking references are permitted, the encoder uses acknowledgement of
header blocks to update the Known Received Count.  If a header block was
potentially blocking, the acknowledgement implies that the decoder has received
all dynamic table state necessary to process the header block.  If the Required
Insert Count of an acknowledged header block was greater than the encoder’s
current Known Received Count, the block’s Required Insert Count becomes the new
Known Received Count.</t>

</section>
<section anchor="stream-cancellation" title="Stream Cancellation">

<t>The instruction begins with the ‘01’ two-bit pattern. The instruction includes
the stream ID of the affected stream - a request or push stream - encoded as a
6-bit prefix integer.</t>

<figure title="Stream Cancellation" anchor="fig-stream-cancel"><artwork type="drawing"><![CDATA[
  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 0 | 1 |     Stream ID (6+)    |
+---+---+-----------------------+
]]></artwork></figure>

<t>A stream that is reset might have multiple outstanding header blocks with
dynamic table references.  When an endpoint receives a stream reset before the
end of a stream, it generates a Stream Cancellation instruction on the decoder
stream.  Similarly, when an endpoint abandons reading of a stream it needs to
signal this using the Stream Cancellation instruction.  This signals to the
encoder that all references to the dynamic table on that stream are no longer
outstanding.  A decoder with a maximum dynamic table capacity equal to zero (see
<xref target="maximum-dynamic-table-capacity"/>) MAY omit sending Stream Cancellations,
because the encoder cannot have any dynamic table references.</t>

<t>An encoder cannot infer from this instruction that any updates to the dynamic
table have been received.</t>

</section>
</section>
<section anchor="header-block-instructions" title="Header Block Instructions">

<t>HTTP/3 endpoints convert header lists to headers blocks and exchange them inside
HEADERS and PUSH_PROMISE frames. A decoder interprets header block instructions
in order to construct a header list. These instructions reference the static
table, or dynamic table in a particular state without modifying it.</t>

<t>This section specifies the following header block instructions.</t>

<section anchor="header-prefix" title="Header Block Prefix">

<t>Each header block is prefixed with two integers.  The Required Insert Count is
encoded as an integer with an 8-bit prefix after the encoding described in
<xref target="ric"/>).  The Base is encoded as sign-and-modulus integer, using a single sign
bit and a value with a 7-bit prefix (see <xref target="base"/>).</t>

<t>These two values are followed by instructions for compressed headers.  The
entire block is expected to be framed by the using protocol.</t>

<figure title="Frame Payload" anchor="fig-base-index"><artwork type="drawing"><![CDATA[
  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
|   Required Insert Count (8+)  |
+---+---------------------------+
| S |      Delta Base (7+)      |
+---+---------------------------+
|      Compressed Headers     ...
+-------------------------------+
]]></artwork></figure>

<section anchor="ric" title="Required Insert Count">

<t>Required Insert Count identifies the state of the dynamic table needed to
process the header block.  Blocking decoders use the Required Insert Count to
determine when it is safe to process the rest of the block.</t>

<t>The encoder transforms the Required Insert Count as follows before encoding:</t>

<figure><artwork><![CDATA[
   if ReqInsertCount == 0:
      EncInsertCount = 0
   else:
      EncInsertCount = (ReqInsertCount mod (2 * MaxEntries)) + 1
]]></artwork></figure>

<t>Here <spanx style="verb">MaxEntries</spanx> is the maximum number of entries that the dynamic table can
have.  The smallest entry has empty name and value strings and has the size of
32.  Hence <spanx style="verb">MaxEntries</spanx> is calculated as</t>

<figure><artwork><![CDATA[
   MaxEntries = floor( MaxTableCapacity / 32 )
]]></artwork></figure>

<t><spanx style="verb">MaxTableCapacity</spanx> is the maximum capacity of the dynamic table as specified by
the decoder (see <xref target="maximum-dynamic-table-capacity"/>).</t>

<t>This encoding limits the length of the prefix on long-lived connections.</t>

<t>The decoder can reconstruct the Required Insert Count using an algorithm such as
the following.  If the decoder encounters a value of EncodedInsertCount that
could not have been produced by a conformant encoder, it MUST treat this as a
stream error of type <spanx style="verb">HTTP_QPACK_DECOMPRESSION_FAILED</spanx>.</t>

<t>TotalNumberOfInserts is the total number of inserts into the decoder’s dynamic
table.</t>

<figure><artwork><![CDATA[
   FullRange = 2 * MaxEntries
   if EncodedInsertCount == 0:
      ReqInsertCount = 0
   else:
      if EncodedInsertCount > FullRange:
         Error
      MaxValue = TotalNumberOfInserts + MaxEntries

      # MaxWrapped is the largest possible value of
      # ReqInsertCount that is 0 mod 2*MaxEntries
      MaxWrapped = floor(MaxValue / FullRange) * FullRange
      ReqInsertCount = MaxWrapped + EncodedInsertCount - 1

      # If ReqInsertCount exceeds MaxValue, the Encoder's value
      # must have wrapped one fewer time
      if ReqInsertCount > MaxValue:
         if ReqInsertCount < FullRange:
            Error
         ReqInsertCount -= FullRange
]]></artwork></figure>

<t>For example, if the dynamic table is 100 bytes, then the Required Insert Count
will be encoded modulo 6.  If a decoder has received 10 inserts, then an encoded
value of 3 indicates that the Required Insert Count is 9 for the header block.</t>

</section>
<section anchor="base" title="Base">

<t>The <spanx style="verb">Base</spanx> is used to resolve references in the dynamic table as described in
<xref target="relative-indexing"/>.</t>

<t>To save space, the Base is encoded relative to the Insert Count using a one-bit
sign and the <spanx style="verb">Delta Base</spanx> value.  A sign bit of 0 indicates that the Base is
greater than or equal to the value of the Insert Count; the value of Delta Base
is added to the Insert Count to determine the value of the Base.  A sign bit of
1 indicates that the Base is less than the Insert Count.  That is:</t>

<figure><artwork><![CDATA[
   if S == 0:
      Base = ReqInsertCount + DeltaBase
   else:
      Base = ReqInsertCount - DeltaBase - 1
]]></artwork></figure>

<t>A single-pass encoder determines the Base before encoding a header block.  If
the encoder inserted entries in the dynamic table while encoding the header
block, Required Insert Count will be greater than the Base, so the encoded
difference is negative and the sign bit is set to 1.  If the header block did
not reference the most recent entry in the table and did not insert any new
entries, the Base will be greater than the Required Insert Count, so the delta
will be positive and the sign bit is set to 0.</t>

<t>An encoder that produces table updates before encoding a header block might set
Required Insert Count and the Base to the same value.  In such case, both the
sign bit and the Delta Base will be set to zero.</t>

<t>A header block that does not reference the dynamic table can use any value for
the Base; setting Delta Base to zero is the most efficient encoding.</t>

<t>For example, with an Required Insert Count of 9, a decoder receives a S bit of 1
and a Delta Base of 2.  This sets the Base to 6 and enables post-base indexing
for three entries.  In this example, a regular index of 1 refers to the 5th
entry that was added to the table; a post-base index of 1 refers to the 8th
entry.</t>

</section>
</section>
<section anchor="indexed-header-field" title="Indexed Header Field">

<t>An indexed header field representation identifies an entry in either the static
table or the dynamic table and causes that header field to be added to the
decoded header list, as described in Section 3.2 of <xref target="RFC7541"></xref>.</t>

<figure title="Indexed Header Field"><artwork type="drawing"><![CDATA[
  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 1 | S |      Index (6+)       |
+---+---+-----------------------+
]]></artwork></figure>

<t>If the entry is in the static table, or in the dynamic table with an absolute
index less than the Base, this representation starts with the ‘1’ 1-bit pattern,
followed by the <spanx style="verb">S</spanx> bit indicating whether the reference is into the static
(S=1) or dynamic (S=0) table. Finally, the relative index of the matching header
field is represented as an integer with a 6-bit prefix (see Section 5.1 of
<xref target="RFC7541"></xref>).</t>

</section>
<section anchor="indexed-header-field-with-post-base-index" title="Indexed Header Field With Post-Base Index">

<t>If the entry is in the dynamic table with an absolute index greater than or
equal to the Base, the representation starts with the ‘0001’ 4-bit pattern,
followed by the post-base index (see <xref target="post-base"/>) of the matching header
field, represented as an integer with a 4-bit prefix (see Section 5.1 of
<xref target="RFC7541"></xref>).</t>

<figure title="Indexed Header Field with Post-Base Index"><artwork type="drawing"><![CDATA[
  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 1 |  Index (4+)   |
+---+---+---+---+---------------+
]]></artwork></figure>

</section>
<section anchor="literal-header-field-with-name-reference" title="Literal Header Field With Name Reference">

<t>A literal header field with a name reference represents a header where the
header field name matches the header field name of an entry stored in the static
table or the dynamic table.</t>

<t>If the entry is in the static table, or in the dynamic table with an absolute
index less than the Base, this representation starts with the ‘01’ two-bit
pattern.  If the entry is in the dynamic table with an absolute index greater
than or equal to the Base, the representation starts with the ‘0000’ four-bit
pattern.</t>

<t>Only the header field name stored in the static or dynamic table is used. Any
header field value MUST be ignored.</t>

<t>The following bit, ‘N’, indicates whether an intermediary is permitted to add
this header to the dynamic header table on subsequent hops. When the ‘N’ bit is
set, the encoded header MUST always be encoded with a literal representation. In
particular, when a peer sends a header field that it received represented as a
literal header field with the ‘N’ bit set, it MUST use a literal representation
to forward this header field.  This bit is intended for protecting header field
values that are not to be put at risk by compressing them (see Section 7.1 of
<xref target="RFC7541"></xref> for more details).</t>

<figure title="Literal Header Field With Name Reference"><artwork type="drawing"><![CDATA[
     0   1   2   3   4   5   6   7
   +---+---+---+---+---+---+---+---+
   | 0 | 1 | N | S |Name Index (4+)|
   +---+---+---+---+---------------+
   | H |     Value Length (7+)     |
   +---+---------------------------+
   |  Value String (Length bytes)  |
   +-------------------------------+
]]></artwork></figure>

<t>For entries in the static table or in the dynamic table with an absolute index
less than the Base, the header field name is represented using the relative
index of that entry, which is represented as an integer with a 4-bit prefix (see
Section 5.1 of <xref target="RFC7541"></xref>). The <spanx style="verb">S</spanx> bit indicates whether the reference is to the
static (S=1) or dynamic (S=0) table.</t>

</section>
<section anchor="literal-header-field-with-post-base-name-reference" title="Literal Header Field With Post-Base Name Reference">

<t>For entries in the dynamic table with an absolute index greater than or equal to
the Base, the header field name is represented using the post-base index of that
entry (see <xref target="post-base"/>) encoded as an integer with a 3-bit prefix.</t>

<figure title="Literal Header Field With Post-Base Name Reference"><artwork type="drawing"><![CDATA[
     0   1   2   3   4   5   6   7
   +---+---+---+---+---+---+---+---+
   | 0 | 0 | 0 | 0 | N |NameIdx(3+)|
   +---+---+---+---+---+-----------+
   | H |     Value Length (7+)     |
   +---+---------------------------+
   |  Value String (Length bytes)  |
   +-------------------------------+
]]></artwork></figure>

</section>
<section anchor="literal-header-field-without-name-reference" title="Literal Header Field Without Name Reference">

<t>An addition to the header table where both the header field name and the header
field value are represented as string literals (see <xref target="primitives"/>) starts with
the ‘001’ three-bit pattern.</t>

<t>The fourth bit, ‘N’, indicates whether an intermediary is permitted to add this
header to the dynamic header table on subsequent hops. When the ‘N’ bit is set,
the encoded header MUST always be encoded with a literal representation. In
particular, when a peer sends a header field that it received represented as a
literal header field with the ‘N’ bit set, it MUST use a literal representation
to forward this header field.  This bit is intended for protecting header field
values that are not to be put at risk by compressing them (see Section 7.1 of
<xref target="RFC7541"></xref> for more details).</t>

<t>The name is represented as a 4-bit prefix string literal, while the value is
represented as an 8-bit prefix string literal.</t>

<figure title="Literal Header Field Without Name Reference"><artwork type="drawing"><![CDATA[
     0   1   2   3   4   5   6   7
   +---+---+---+---+---+---+---+---+
   | 0 | 0 | 1 | N | H |NameLen(3+)|
   +---+---+---+---+---+-----------+
   |  Name String (Length bytes)   |
   +---+---------------------------+
   | H |     Value Length (7+)     |
   +---+---------------------------+
   |  Value String (Length bytes)  |
   +-------------------------------+
]]></artwork></figure>

</section>
</section>
</section>
<section anchor="configuration" title="Configuration">

<t>QPACK defines two settings which are included in the HTTP/3 SETTINGS frame.</t>

<t><list style="hanging">
  <t hangText='SETTINGS_QPACK_MAX_TABLE_CAPACITY (0x1):'>
  An integer with a maximum value of 2^30 - 1.  The default value is zero
bytes.  See <xref target="table-dynamic"/> for usage.  This is the equivalent of the
SETTINGS_HEADER_TABLE_SIZE from HTTP/2.</t>
  <t hangText='SETTINGS_QPACK_BLOCKED_STREAMS (0x7):'>
  An integer with a maximum value of 2^16 - 1.  The default value is zero.
See <xref target="overview-hol-avoidance"/>.</t>
</list></t>

</section>
<section anchor="error-handling" title="Error Handling">

<t>The following error codes are defined for HTTP/3 to indicate failures of
QPACK which prevent the stream or connection from continuing:</t>

<t><list style="hanging">
  <t hangText='HTTP_QPACK_DECOMPRESSION_FAILED (0x200):'>
  The decoder failed to interpret a header block instruction and is not
able to continue decoding that header block.</t>
  <t hangText='HTTP_QPACK_ENCODER_STREAM_ERROR (0x201):'>
  The decoder failed to interpret an encoder instruction received on the
encoder stream.</t>
  <t hangText='HTTP_QPACK_DECODER_STREAM_ERROR (0x202):'>
  The encoder failed to interpret a decoder instruction received on the
decoder stream.</t>
</list></t>

<t>Upon encountering an error, an implementation MAY elect to treat it as a
connection error even if this document prescribes that it MUST be treated as a
stream error.</t>

</section>
<section anchor="security-considerations" title="Security Considerations">

<t>TBD.</t>

</section>
<section anchor="iana-considerations" title="IANA Considerations">

<section anchor="settings-registration" title="Settings Registration">

<t>This document specifies two settings. The entries in the following table are
registered in the “HTTP/3 Settings” registry established in <xref target="HTTP3"/>.</t>

<texttable>
      <ttcol align='left'>Setting Name</ttcol>
      <ttcol align='center'>Code</ttcol>
      <ttcol align='left'>Specification</ttcol>
      <c>QPACK_MAX_TABLE_CAPACITY</c>
      <c>0x1</c>
      <c><xref target="configuration"/></c>
      <c>QPACK_BLOCKED_STREAMS</c>
      <c>0x7</c>
      <c><xref target="configuration"/></c>
</texttable>

</section>
<section anchor="stream-type-registration" title="Stream Type Registration">

<t>This document specifies two stream types. The entries in the following table are
registered in the “HTTP/3 Stream Type” registry established in <xref target="HTTP3"/>.</t>

<texttable>
      <ttcol align='left'>Stream Type</ttcol>
      <ttcol align='center'>Code</ttcol>
      <ttcol align='left'>Specification</ttcol>
      <ttcol align='left'>Sender</ttcol>
      <c>QPACK Encoder Stream</c>
      <c>0x02</c>
      <c><xref target="enc-dec-stream-def"/></c>
      <c>Both</c>
      <c>QPACK Decoder Stream</c>
      <c>0x03</c>
      <c><xref target="enc-dec-stream-def"/></c>
      <c>Both</c>
</texttable>

</section>
<section anchor="error-code-registration" title="Error Code Registration">

<t>This document specifies three error codes. The entries in the following table
are registered in the “HTTP/3 Error Code” registry established in <xref target="HTTP3"/>.</t>

<texttable>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Code</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Specification</ttcol>
      <c>HTTP_QPACK_DECOMPRESSION_FAILED</c>
      <c>0x200</c>
      <c>Decompression of a header block failed</c>
      <c><xref target="error-handling"/></c>
      <c>HTTP_QPACK_ENCODER_STREAM_ERROR</c>
      <c>0x201</c>
      <c>Error on the encoder stream</c>
      <c><xref target="error-handling"/></c>
      <c>HTTP_QPACK_DECODER_STREAM_ERROR</c>
      <c>0x202</c>
      <c>Error on the decoder stream</c>
      <c><xref target="error-handling"/></c>
</texttable>

</section>
</section>


  </middle>

  <back>

    <references title='Normative References'>

<reference anchor="HTTP3" >
  <front>
    <title>Hypertext Transfer Protocol Version 3 (HTTP/3)</title>
    <author initials="M." surname="Bishop" fullname="Mike Bishop" role="editor">
      <organization>Akamai Technologies</organization>
    </author>
    <date year="2019" month="April" day="23"/>
  </front>
  <seriesInfo name="Internet-Draft" value="draft-ietf-quic-http-20"/>
</reference>
<reference anchor="QUIC-TRANSPORT" >
  <front>
    <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
    <author initials="J." surname="Iyengar" fullname="Jana Iyengar" role="editor">
      <organization>Fastly</organization>
    </author>
    <author initials="M." surname="Thomson" fullname="Martin Thomson" role="editor">
      <organization>Mozilla</organization>
    </author>
    <date year="2019" month="April" day="23"/>
  </front>
  <seriesInfo name="Internet-Draft" value="draft-ietf-quic-transport-18"/>
</reference>




<reference  anchor="RFC7541" target='https://www.rfc-editor.org/info/rfc7541'>
<front>
<title>HPACK: Header Compression for HTTP/2</title>
<author initials='R.' surname='Peon' fullname='R. Peon'><organization /></author>
<author initials='H.' surname='Ruellan' fullname='H. Ruellan'><organization /></author>
<date year='2015' month='May' />
<abstract><t>This specification defines HPACK, a compression format for efficiently representing HTTP header fields, to be used in HTTP/2.</t></abstract>
</front>
<seriesInfo name='RFC' value='7541'/>
<seriesInfo name='DOI' value='10.17487/RFC7541'/>
</reference>



<reference  anchor="RFC2119" target='https://www.rfc-editor.org/info/rfc2119'>
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author initials='S.' surname='Bradner' fullname='S. Bradner'><organization /></author>
<date year='1997' month='March' />
<abstract><t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t></abstract>
</front>
<seriesInfo name='BCP' value='14'/>
<seriesInfo name='RFC' value='2119'/>
<seriesInfo name='DOI' value='10.17487/RFC2119'/>
</reference>



<reference  anchor="RFC8174" target='https://www.rfc-editor.org/info/rfc8174'>
<front>
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
<author initials='B.' surname='Leiba' fullname='B. Leiba'><organization /></author>
<date year='2017' month='May' />
<abstract><t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t></abstract>
</front>
<seriesInfo name='BCP' value='14'/>
<seriesInfo name='RFC' value='8174'/>
<seriesInfo name='DOI' value='10.17487/RFC8174'/>
</reference>




    </references>

    <references title='Informative References'>





<reference  anchor="RFC7540" target='https://www.rfc-editor.org/info/rfc7540'>
<front>
<title>Hypertext Transfer Protocol Version 2 (HTTP/2)</title>
<author initials='M.' surname='Belshe' fullname='M. Belshe'><organization /></author>
<author initials='R.' surname='Peon' fullname='R. Peon'><organization /></author>
<author initials='M.' surname='Thomson' fullname='M. Thomson' role='editor'><organization /></author>
<date year='2015' month='May' />
<abstract><t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2).  HTTP/2 enables a more efficient use of network resources and a reduced perception of latency by introducing header field compression and allowing multiple concurrent exchanges on the same connection.  It also introduces unsolicited push of representations from servers to clients.</t><t>This specification is an alternative to, but does not obsolete, the HTTP/1.1 message syntax.  HTTP's existing semantics remain unchanged.</t></abstract>
</front>
<seriesInfo name='RFC' value='7540'/>
<seriesInfo name='DOI' value='10.17487/RFC7540'/>
</reference>



<reference  anchor="RFC2360" target='https://www.rfc-editor.org/info/rfc2360'>
<front>
<title>Guide for Internet Standards Writers</title>
<author initials='G.' surname='Scott' fullname='G. Scott'><organization /></author>
<date year='1998' month='June' />
<abstract><t>This document is a guide for Internet standard writers.  It defines those characteristics that make standards coherent, unambiguous, and easy to interpret.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t></abstract>
</front>
<seriesInfo name='BCP' value='22'/>
<seriesInfo name='RFC' value='2360'/>
<seriesInfo name='DOI' value='10.17487/RFC2360'/>
</reference>




    </references>


<section anchor="static-table" title="Static Table">

<texttable>
      <ttcol align='left'>Index</ttcol>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Value</ttcol>
      <c>0</c>
      <c>:authority</c>
      <c>&#160;</c>
      <c>1</c>
      <c>:path</c>
      <c>/</c>
      <c>2</c>
      <c>age</c>
      <c>0</c>
      <c>3</c>
      <c>content-disposition</c>
      <c>&#160;</c>
      <c>4</c>
      <c>content-length</c>
      <c>0</c>
      <c>5</c>
      <c>cookie</c>
      <c>&#160;</c>
      <c>6</c>
      <c>date</c>
      <c>&#160;</c>
      <c>7</c>
      <c>etag</c>
      <c>&#160;</c>
      <c>8</c>
      <c>if-modified-since</c>
      <c>&#160;</c>
      <c>9</c>
      <c>if-none-match</c>
      <c>&#160;</c>
      <c>10</c>
      <c>last-modified</c>
      <c>&#160;</c>
      <c>11</c>
      <c>link</c>
      <c>&#160;</c>
      <c>12</c>
      <c>location</c>
      <c>&#160;</c>
      <c>13</c>
      <c>referer</c>
      <c>&#160;</c>
      <c>14</c>
      <c>set-cookie</c>
      <c>&#160;</c>
      <c>15</c>
      <c>:method</c>
      <c>CONNECT</c>
      <c>16</c>
      <c>:method</c>
      <c>DELETE</c>
      <c>17</c>
      <c>:method</c>
      <c>GET</c>
      <c>18</c>
      <c>:method</c>
      <c>HEAD</c>
      <c>19</c>
      <c>:method</c>
      <c>OPTIONS</c>
      <c>20</c>
      <c>:method</c>
      <c>POST</c>
      <c>21</c>
      <c>:method</c>
      <c>PUT</c>
      <c>22</c>
      <c>:scheme</c>
      <c>http</c>
      <c>23</c>
      <c>:scheme</c>
      <c>https</c>
      <c>24</c>
      <c>:status</c>
      <c>103</c>
      <c>25</c>
      <c>:status</c>
      <c>200</c>
      <c>26</c>
      <c>:status</c>
      <c>304</c>
      <c>27</c>
      <c>:status</c>
      <c>404</c>
      <c>28</c>
      <c>:status</c>
      <c>503</c>
      <c>29</c>
      <c>accept</c>
      <c>*/*</c>
      <c>30</c>
      <c>accept</c>
      <c>application/dns-message</c>
      <c>31</c>
      <c>accept-encoding</c>
      <c>gzip, deflate, br</c>
      <c>32</c>
      <c>accept-ranges</c>
      <c>bytes</c>
      <c>33</c>
      <c>access-control-allow-headers</c>
      <c>cache-control</c>
      <c>34</c>
      <c>access-control-allow-headers</c>
      <c>content-type</c>
      <c>35</c>
      <c>access-control-allow-origin</c>
      <c>*</c>
      <c>36</c>
      <c>cache-control</c>
      <c>max-age=0</c>
      <c>37</c>
      <c>cache-control</c>
      <c>max-age=2592000</c>
      <c>38</c>
      <c>cache-control</c>
      <c>max-age=604800</c>
      <c>39</c>
      <c>cache-control</c>
      <c>no-cache</c>
      <c>40</c>
      <c>cache-control</c>
      <c>no-store</c>
      <c>41</c>
      <c>cache-control</c>
      <c>public, max-age=31536000</c>
      <c>42</c>
      <c>content-encoding</c>
      <c>br</c>
      <c>43</c>
      <c>content-encoding</c>
      <c>gzip</c>
      <c>44</c>
      <c>content-type</c>
      <c>application/dns-message</c>
      <c>45</c>
      <c>content-type</c>
      <c>application/javascript</c>
      <c>46</c>
      <c>content-type</c>
      <c>application/json</c>
      <c>47</c>
      <c>content-type</c>
      <c>application/x-www-form-urlencoded</c>
      <c>48</c>
      <c>content-type</c>
      <c>image/gif</c>
      <c>49</c>
      <c>content-type</c>
      <c>image/jpeg</c>
      <c>50</c>
      <c>content-type</c>
      <c>image/png</c>
      <c>51</c>
      <c>content-type</c>
      <c>text/css</c>
      <c>52</c>
      <c>content-type</c>
      <c>text/html; charset=utf-8</c>
      <c>53</c>
      <c>content-type</c>
      <c>text/plain</c>
      <c>54</c>
      <c>content-type</c>
      <c>text/plain;charset=utf-8</c>
      <c>55</c>
      <c>range</c>
      <c>bytes=0-</c>
      <c>56</c>
      <c>strict-transport-security</c>
      <c>max-age=31536000</c>
      <c>57</c>
      <c>strict-transport-security</c>
      <c>max-age=31536000; includesubdomains</c>
      <c>58</c>
      <c>strict-transport-security</c>
      <c>max-age=31536000; includesubdomains; preload</c>
      <c>59</c>
      <c>vary</c>
      <c>accept-encoding</c>
      <c>60</c>
      <c>vary</c>
      <c>origin</c>
      <c>61</c>
      <c>x-content-type-options</c>
      <c>nosniff</c>
      <c>62</c>
      <c>x-xss-protection</c>
      <c>1; mode=block</c>
      <c>63</c>
      <c>:status</c>
      <c>100</c>
      <c>64</c>
      <c>:status</c>
      <c>204</c>
      <c>65</c>
      <c>:status</c>
      <c>206</c>
      <c>66</c>
      <c>:status</c>
      <c>302</c>
      <c>67</c>
      <c>:status</c>
      <c>400</c>
      <c>68</c>
      <c>:status</c>
      <c>403</c>
      <c>69</c>
      <c>:status</c>
      <c>421</c>
      <c>70</c>
      <c>:status</c>
      <c>425</c>
      <c>71</c>
      <c>:status</c>
      <c>500</c>
      <c>72</c>
      <c>accept-language</c>
      <c>&#160;</c>
      <c>73</c>
      <c>access-control-allow-credentials</c>
      <c>FALSE</c>
      <c>74</c>
      <c>access-control-allow-credentials</c>
      <c>TRUE</c>
      <c>75</c>
      <c>access-control-allow-headers</c>
      <c>*</c>
      <c>76</c>
      <c>access-control-allow-methods</c>
      <c>get</c>
      <c>77</c>
      <c>access-control-allow-methods</c>
      <c>get, post, options</c>
      <c>78</c>
      <c>access-control-allow-methods</c>
      <c>options</c>
      <c>79</c>
      <c>access-control-expose-headers</c>
      <c>content-length</c>
      <c>80</c>
      <c>access-control-request-headers</c>
      <c>content-type</c>
      <c>81</c>
      <c>access-control-request-method</c>
      <c>get</c>
      <c>82</c>
      <c>access-control-request-method</c>
      <c>post</c>
      <c>83</c>
      <c>alt-svc</c>
      <c>clear</c>
      <c>84</c>
      <c>authorization</c>
      <c>&#160;</c>
      <c>85</c>
      <c>content-security-policy</c>
      <c>script-src 'none'; object-src 'none'; base-uri 'none'</c>
      <c>86</c>
      <c>early-data</c>
      <c>1</c>
      <c>87</c>
      <c>expect-ct</c>
      <c>&#160;</c>
      <c>88</c>
      <c>forwarded</c>
      <c>&#160;</c>
      <c>89</c>
      <c>if-range</c>
      <c>&#160;</c>
      <c>90</c>
      <c>origin</c>
      <c>&#160;</c>
      <c>91</c>
      <c>purpose</c>
      <c>prefetch</c>
      <c>92</c>
      <c>server</c>
      <c>&#160;</c>
      <c>93</c>
      <c>timing-allow-origin</c>
      <c>*</c>
      <c>94</c>
      <c>upgrade-insecure-requests</c>
      <c>1</c>
      <c>95</c>
      <c>user-agent</c>
      <c>&#160;</c>
      <c>96</c>
      <c>x-forwarded-for</c>
      <c>&#160;</c>
      <c>97</c>
      <c>x-frame-options</c>
      <c>deny</c>
      <c>98</c>
      <c>x-frame-options</c>
      <c>sameorigin</c>
</texttable>

</section>
<section anchor="sample-one-pass-encoding-algorithm" title="Sample One Pass Encoding Algorithm">

<t>Pseudo-code for single pass encoding, excluding handling of duplicates,
non-blocking mode, and reference tracking.</t>

<figure><artwork><![CDATA[
baseIndex = dynamicTable.baseIndex
largestReference = 0
for header in headers:
  staticIdx = staticTable.getIndex(header)
  if staticIdx:
    encodeIndexReference(streamBuffer, staticIdx)
    continue

  dynamicIdx = dynamicTable.getIndex(header)
  if !dynamicIdx:
    # No matching entry.  Either insert+index or encode literal
    nameIdx = getNameIndex(header)
    if shouldIndex(header) and dynamicTable.canIndex(header):
      encodeLiteralWithIncrementalIndex(controlBuffer, nameIdx,
                                        header)
      dynamicTable.add(header)
      dynamicIdx = dynamicTable.baseIndex

  if !dynamicIdx:
    # Couldn't index it, literal
    if nameIdx <= staticTable.size:
      encodeLiteral(streamBuffer, nameIndex, header)
    else:
      # encode literal, possibly with nameIdx above baseIndex
      encodeDynamicLiteral(streamBuffer, nameIndex, baseIndex,
                           header)
      largestReference = max(largestReference,
                             dynamicTable.toAbsolute(nameIdx))
  else:
    # Dynamic index reference
    assert(dynamicIdx)
    largestReference = max(largestReference, dynamicIdx)
    # Encode dynamicIdx, possibly with dynamicIdx above baseIndex
    encodeDynamicIndexReference(streamBuffer, dynamicIdx,
                                baseIndex)

# encode the prefix
encodeInteger(prefixBuffer, 0x00, largestReference, 8)
if baseIndex >= largestReference:
  encodeInteger(prefixBuffer, 0, baseIndex - largestReference, 7)
else:
  encodeInteger(prefixBuffer, 0x80,
                largestReference  - baseIndex, 7)

return controlBuffer, prefixBuffer + streamBuffer
]]></artwork></figure>

</section>
<section anchor="change-log" title="Change Log">

<t><list style='empty'>
  <t><spanx style="strong">RFC Editor’s Note:</spanx> Please remove this section prior to publication of a
final version of this document.</t>
</list></t>

<section anchor="since-draft-ietf-quic-qpack-06" title="Since draft-ietf-quic-qpack-06">

<t><list style="symbols">
  <t>Clarify initial dynamic table capacity maximums (#2276, #2330, #2330)</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-qpack-05" title="Since draft-ietf-quic-qpack-05">

<t><list style="symbols">
  <t>Introduced the terms dynamic table capacity and maximum dynamic table
capacity.</t>
  <t>Renamed SETTINGS_HEADER_TABLE_SIZE to SETTINGS_QPACK_MAX_TABLE_CAPACITY.</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-qpack-04" title="Since draft-ietf-quic-qpack-04">

<t><list style="symbols">
  <t>Changed calculation of Delta Base Index to avoid an illegal value (#2002,
#2005)</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-qpack-03" title="Since draft-ietf-quic-qpack-03">

<t><list style="symbols">
  <t>Change HTTP settings defaults (#2038)</t>
  <t>Substantial editorial reorganization</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-qpack-02" title="Since draft-ietf-quic-qpack-02">

<t><list style="symbols">
  <t>Largest Reference encoded modulo MaxEntries (#1763)</t>
  <t>New Static Table (#1355)</t>
  <t>Table Size Update with Insert Count=0 is a connection error (#1762)</t>
  <t>Stream Cancellations are optional when SETTINGS_HEADER_TABLE_SIZE=0 (#1761)</t>
  <t>Implementations must handle 62 bit integers (#1760)</t>
  <t>Different error types for each QPACK stream, other changes to error
handling (#1726)</t>
  <t>Preserve header field order (#1725)</t>
  <t>Initial table size is the maximum permitted when table is first usable (#1642)</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-qpack-01" title="Since draft-ietf-quic-qpack-01">

<t><list style="symbols">
  <t>Only header blocks that reference the dynamic table are acknowledged (#1603,
#1605)</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-qpack-00" title="Since draft-ietf-quic-qpack-00">

<t><list style="symbols">
  <t>Renumbered instructions for consistency (#1471, #1472)</t>
  <t>Decoder is allowed to validate largest reference (#1404, #1469)</t>
  <t>Header block acknowledgments also acknowledge the associated largest reference
(#1370, #1400)</t>
  <t>Added an acknowledgment for unread streams (#1371, #1400)</t>
  <t>Removed framing from encoder stream (#1361,#1467)</t>
  <t>Control streams use typed unidirectional streams rather than fixed stream IDs
(#910,#1359)</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-qcram-00" title="Since draft-ietf-quic-qcram-00">

<t><list style="symbols">
  <t>Separate instruction sets for table updates and header blocks (#1235, #1142,
#1141)</t>
  <t>Reworked indexing scheme (#1176, #1145, #1136, #1130, #1125, #1314)</t>
  <t>Added mechanisms that support one-pass encoding (#1138, #1320)</t>
  <t>Added a setting to control the number of blocked decoders (#238, #1140, #1143)</t>
  <t>Moved table updates and acknowledgments to dedicated streams (#1121, #1122,
#1238)</t>
</list></t>

</section>
</section>
<section numbered="false" anchor="acknowledgments" title="Acknowledgments">

<t>This draft draws heavily on the text of <xref target="RFC7541"/>.  The indirect input of
those authors is gratefully acknowledged, as well as ideas from:</t>

<t><list style="symbols">
  <t>Ryan Hamilton</t>
  <t>Patrick McManus</t>
  <t>Kazuho Oku</t>
  <t>Biren Roy</t>
  <t>Ian Swett</t>
  <t>Dmitri Tikhonov</t>
</list></t>

<t>Buck’s contribution was supported by Google during his employment there.</t>

<t>A substantial portion of Mike’s contribution was supported by Microsoft during
his employment there.</t>

</section>


  </back>

<!-- ##markdown-source:
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
V9WMlgWIu35J1BdXCvaQAWyHgJVQMn6B4r9pXyFl7dhybgFWsBt96Nb2VLnL
Xa3PrELQv+pvgdQPpL1lzrZICq8RLoYBhyO5NW2rP9xL9A+CSrRiXg/Oq6p7
uNa0tleeVitN0bTkG5mWTBKm9cc/hGFQPIivokE5nj9IMy5uQwb9IAj+FITh
j6aW7lXY/KlIeEfcJGvJFLMpYlT9xqku2JpFjcvaPrnnQnuuORn3EdJ4RqYo
tvaRreCWHA4ZoG5TaYNLE+9IE/z5+N3bv6gGePDuw9vTDak1UNp2M7moJwko
WAfwLzZ1sdMw3cR5zXRAmtXB63cnhy8+HhwfnR4d7L+W+Xld5Dwuz4eoyVaB
+7tMmeuAMcvEzZzpabn9XGxur3uO1BZQegUX5mlefJWb7nStEjFK+RbinbMv
6dqtRUAB0NSHZxNJJPuzNbBOXSfZYHFk5waFAGslT2I2EIzWuIHUVc8k2XYu
xdJFppnYbhUjPE29R9gH6qf9zVVx0jYnVQy19NKa25jIhlqnZL/9jFrOW8Sh
NVOp+FNbmaqsEVkkPRpJ0Dsfc+U0bQVszuBCJuK2z5TEGCcVj7MtWvONW7eC
3J2OXnZv8x5GvVjDwdBqrjTxy8kvaFlo1QhXbVjF2uvsIyFKgb528myT0sYU
MnzQX9eoDw6926JXcyKE2CKmbnyts0dcNS3Vh0ssK6AdrZLTGC8afRTsSUdk
Usxhel7vGKs1FE0cklX/lKPQsApu2iDvSTpmM0jmePram+6eVptOG+ohs64W
e9Sh7nmZsRxRU1NqXVQ2zLp1v4uN5/jqB+RGCrbgv234bwf+ewj/7cJ/j7Rt
zML/uN0LerhO2A9Fx4J9PGu799et/8x9q+1HRnol3qy/0sLF3Fp7xAP5I3X9
yEgyhBjHa67ltt5sitMxktdYRp1dwgVEn3tJGwXi+kjy6BEDjj/Lcgy0Bm7G
NCgA3845pL+ezzWYathh61FO3SCUZKSp9Z9QjSCxDG7WQSyjDzwDNDyPZzBR
0xQoW84nUP/E+1B7QdVGUpNkTH2AhUbYP4Gg+0LUSI60Z0qJD++vtxB0GyEp
GdLrHVR4LYL+Fz4ab+NL/1hUDeu+3K360xmjn6s516V9tAm5qizgXr/fv2fI
nm4RdB0MvAanTtSGKl9YdEmu0EO/A/g/gyb1P7Q7mMc+bNv/bppsdsoiLIS4
pHDoYF87Zunm3NHM+xY8hU7X+daqWXWGED6pKk/Mg1KZiIhvqZDSC5lA6IPm
R2X5wJ/OVfDbloN4G8kY+V6zkH6U2zTVKmrVE1aq+cicWsuKBc+NBL6wWeKt
7qMeCUrWrOa8cyYP33xiE5Cp9pRHUxXyJC67Sh6+3G3Nu/T6irAu73erIRNM
cmJa0W/z0Li3Ra1ilnEmWUzuGUK233GGnCJr05Y8XefmC05OXXvZNCtpL4tP
1fIjVZ0lTuixuyAn6mtjjFUOE25glZ/LR6h7x/VMITbtW2qPOs0Q64Elzk6u
9aCQ1ENLP1yBVmXvcvPU9iznShZLut3y3FH0Uk4wUa2zt5EWiZkq4dxrBtJS
DhG1VO9bxHBZUTPpmVdx+yKKY72kasEBooRq6rnhGN9OY2SJ6dlqpW/rmqdv
/RROyw6HjdXbjy6slwnwFsz0XOe6sPZJe5z7XZkFdS4bsN0Ka119/QYedb9G
q7vY3uLie7y01t7toq1mnbThlaJI7FmkpFjLIqS4EKVHYeyjTlqttwaok429
Pk8DW2BbVgnZLl/lXGRp8F1e1PtX4KRsanmzV0nNz64KugzqwmHQZgGcKoV+
CZxVfRttnkjft1FrIcAMaoU+MC3yo8VqwMH8kIY7z3r7nxoh0yQ4uOBoKli1
p62MKV2sY7KYfs5IrLU4YJai6Si8W62NitqrSOSg4pBpqDyPW1bo8Y+dach1
D7U0PNdeMjbkdepQsnT5TqSIk73YUpuifTa95DvqGmGY21T9ybNaC65GNyOp
dI/Dwu83UyW8/X6SmNVaxVTlPljuO2iRxMlvvIaaaVIjizu+eiV5mLSJ0gHJ
3zgrhykDCSVMqiXVmvNtOgnoLJ5nKWZj1XqNU7vBOG1PljBdQi1YpeoCT3YH
2Zt9So1ymE7jCgYsHFqSxSLipWqBabNMKMwcdUD3uEDmtRvQigWtw13AY5rO
TE2/5+QER5mnJd3z7sKRM3H0orc8DUArRa3Lmfh1TLzZSdzDNbL3kBUrbLNW
NQOq+rgjD6vc+sTDO/nO73fubCr7iWKi8ie4525FJwCdu6pPjB68dgJQ3bcQ
94jAl6CEkzJpe9xQm0niV/VL8aQNlLa2I27vpEpqWE9KIyK+KorqBqS/asA9
xQpq559HyRjstZ7RC44o0kyRVewKz/0AV7gnye0cwznk9v6bodvkVTr4iU5+
nuilMlXREsjIIq5aEmWpdjOptXKiq2Ysr6+aHmL0ZF6B5IwwJ9erYnirnFYv
pG57BlpDknt5tjUrtrVV7ZzkAp0sbhqZ36uRmOzNe3d0McgbNxKs9w7MRsbf
D6y4XHKyqZyvznUBDdOsjPXuUZ0bT6FxcdIEmylIAYHLflGmWAsMu7S23HsF
1hZSRMT9lTTp2HE0c/mA7fDc3k6X/XSefVFfULM3saDyHpzaWU6tz9t7LeKz
yrrbyUYbAbMv59J0sFDNlENaPXCalpmGTtrUZFv83w3ZpDJHImPKz0SPj0Yj
KlrUb0KKs7Zla8BXrjAybbGz31cTU6ngCIXbaWJupzjrFGnuBKli3kU6tred
0wPQ8n73IqEmI6x1fKvOtW2gl1ZZEA7/E/AMVjqMlVVDDn2AUlvP4zTOKVIa
tVHWSirOCbfXG897rDa405J2foVtQe02R0xKezmVka6OJD+q7ixLpqSOCX7Z
dif3NGGvKX5HR0TtLlhJOuxxiOmpsE5nk6jJt3InkQhaLtvhbfGVbTG0lvm5
1qmEG0ugA3E2t2ECxHtb91S5rok7bzlX5zWoqN7smR0nI00qbnhXGJ3p3OZ6
+Lg0TsswubjKXtZgKhWecuVrCYRtaUCfkT26zVGrq+0Kr6/qlbqNMRs0obbv
Zolqs+Fso629LLrz+kzitChG/w59U7ukV5J6ak2m3FuK3AsQe262gToHMKWz
utNy4b2TK7lKOhfkW1W8JZxxHny562fzt920wReociI6y5jLzCZ5i9HTZWoZ
P1nW96rXYqZuFdJA77r1PMY5XakqIFuqA5EzhEAFIaBvNp4VVUr0TMxFVbDh
QYOgnTZ3esQfNVz9X75wAZ00AsMTeJlpKzwK3TgZEX7KXObcyKlahl5ey90s
KyTHV1MWueyhlbQ8sdx4AaDxlNkgqwWUv6tADbqKPx5zIHm5iWUzK7AwfFzK
PdGVnbbaGPRzUOHulTAD/MGLi68Z7yXBjtvo36/zklopvI/m4ywaarD3bgcK
vtzNqTVeB7FXJaZ6/Dsa56AY5JY3CzRYe3mPsK7qDut28DCa615rGPQuqDwu
bKW9W3DrNEzX68q7AUaFzXYStUOP7R5RJ4Z3kxG+zK/xW8+eBf09KU87TAfe
V0Efv4jHeGl5xxNrteHgoAdrW8EP2MZHugGurwf3g02agXmFySi/VN/9orEj
lePNfvCVXVJv92dQ2AnzsRekVY0OuBmm31NO8kBYdl1IGzfpqGS2t+wNnvUp
Os3rwLhSbFYPASZG4yzL1/AzCtHZaOCDYHsrWOfl/1L/trH+xZEYZKkibOr9
8ZUzLlVuVHpZnu70RKra8XEwgVguSDjUxcIxWUOVqaxdB52LKlHpsPK5m1KF
+WMW5nmWA5efyC2FbPtYCbrkZiAbb+SM2aFLh0g10mXZqmOkFsGxs325yPCn
SBIWwWiDro6SM3VTLPagthXPnWJQ4i0R9rvRkcQgkvaAhYYoqjQI2yndU/Q2
LBG+nI3Hx6SCPQv8gycHvgU77qGv84PmoW8f48cKsj6IDAKxI3/CTDhN6FnQ
ioL77lzlHer/9XOO5RJDxZFeueVfGsaXkfI7tTWo6dcndrT1g48SnpnC0INr
J/ugWtc6oNP+0YUuZ6z7bXgKgffZiR41+K8GohU+OywO1bkhMWt9n5oqETFf
CkyMHoxiCvQnk7jasRqYHy0AZ7Oaj/2xdVNr+9rEQvjMwRNxupfVJRO9Wu+J
Kqq82e9r+9By4RVZxnYYFN2S9Mks2FX/V5vPCobX4yTjV4U/xvKObSdd2Yqa
zkDFk1qasJXWpKWQXvXlrtT7I2/8BT/6xc0+BlGfjT97xfatGWnNK0I06yy0
3ZbkdpAC6YFKu5h46op4vTdHGy/WKAh5AmzI+ZdKX/zF9p7eJ22dMr2xt18b
/mQGi4ubvW5q7pye+l9XczD1Fpw1hcuJZzYAcMMEf/Jmc8HknY6hdVCkcxCL
8TSrE4+v0jDP6iflPi9HuwS4bLb9hbB6gVgJna59sZtC6uGgWqJdfVGto6YJ
1vu64PExrvvC5uHV+pLXsvEo/9YOWp0H7v/Q6zhAeoobvlxpkOJmXgyN3mnJ
Se5pfM5ErLRp95Escdr+zUph8AzmYTI03rU4rHLhZQ3cgKotL49KlpKhn9Ay
Jwdx7F7cTGjuXFnHVZiFCnfYWsvcqMHXkiX2N5rRZlFpCj+hY8nWi0cUhu0w
n3QStD45b1V/bM4FI62NL9LWDHNjJ60DODanrlQWI52Pa41RaE02l6h203Sj
5TclJ6Tz6r4Fo5N+aruROjNQV6Cq3UgDepFE6VaeewJM3SPtmAIO86TnCCHH
GXyibHLTsGfDmQp8umVdqNqFWie5y961lC9UsG1kAuX9cmUq1vtqD/DqanM7
bwwRnJM3y2Yqb9basD0sL4zTkBhDLc0ux0/RNebPoW2sxzrWhq1d4IIGN5ub
6FdvDPDKEWrFuI797vYgdvJ+XY9ee/ES340pmS+Rf8OSuHXc1UqD5aHrWWzm
t2im6XatTub3DbNbH45fGhPcIKhSJbQ0twd9LkdeRVLr3RTkQG2XDbWbublF
V02aMsMnYq3teiMTf/NesOkGzvACM7/eqVZ3Vu/o4NVKWbtKaGdx6dlLbtrQ
k3Hasv6p8K7y9hqbnbU0hXl3UQozaideCnPneeJawnqznq49XLxXsrSa2mY8
tU23Ll66c31KAN9ZvHl1trLWaJO2vhDVveWI3rkWon/nDDUbH5VjvNORK14/
ytc4wrzuGkXYwhlp8tJCQ43SMlse6LFNzcXw6xCdmkiraNiCVeMN0FGwGlyj
YHUBz9/4v4x/ObF/U5VAfIfjaVqtqmsdz/490JhmuTc3Y96l45ZCUtqX1uLh
ZiiNzV28VHjubz1raZqDA5qidH4/9QJnZ3g17L2393otpcRyvDnvinHnNWsH
cc7NlbQK0o84e7WRmduNPrjIpqBE2UbMAF90bwPamZu+Y9UDWkd17bZ+KwdE
D4+/D9jZzlRhRg3aUyagXptZU1PI1Cwrv0ajmLf7mLoLoVWoc1M6ubdOEav2
Qb28jPJh4KKSxlWNVcwS3IsUF436KEbDkLNWsU96xUhkzt4DLNeIosmDjXRK
uVB0Xl3wxkblxOfWj2rcmmBSVwuwfKNkXPwzCpWVf79llcwtVgZW3lpD12Tl
wb9KNeaqwgKli9uboaO7wDW4nGlnuG1MqaZsVfkrfpdYViO0nXiv6j5+fQXC
dLV8W9+4ficEtppX6ISwTH5XEr8uyVu25iaKoJU05sZb0mJFUqgmtlf81JW/
RQkLwfb/uQLaPjMBRPXR8Gpte8Hhv+8dtP8Gh7+L0pYrmf+6LQzai1lVdZnl
iPTb6S0kbM3301tI4pv/r7f8S+gtSEadzTB2/hs0w3AVp1fMN4FXXZdv/r/V
DOMabJRZL2ZoOUXUbV32xCnudjqQzHNr10lCaO3mIIxiL6/qXutfba5jSGsv
2G+Ia81ysZG5rb9v9zGsZQu6R9FsXFZXH6GvnkiRsInZzsSr/btRv9GBmhXR
eaynXNz76K6Hsbi4gvQsHMsugvNUZQUnR//zkFNvaflbbet9/vrdwU+HL6QE
5AQX++g6i93cXbbYDZ4hrRIvFv6cxJfhRTYOqYcEph9T1Bd2miLywSuQfWPu
NU+JKeGFfPCtblRz3gpyev9q4lF1qxJ1nWDBFYyAMdHFEsC5mIiYXvC2rDgt
Rb3nwp3cLaAhFGIjwSSdce7ZkhQZxOJWvw943POq+nEGLBttkvCi/txUtsel
hIFzzznNw7nYwg0DaPB+SWk/T3BztQm297+uXXcLM2zcKbOk0ognsWUnoe+3
Y6mlSrtlDrWOjMZ8mGZplWMlSVpEOD1SYLx+05QlH4/jAQlFzpaSNgrNitPq
DhK38TBKKYqrFFZbaKvP8lKvmPpBts5yzJM7yCjnnPkddsN9/oI6fB/tv91v
fMndU5j9HcfnCYxrS3jceTkZ3Q7H1HJqz46qDphEnKhOD4eOHU/ZHWWpMtSd
gJ8BRTCmW1oSKhKsdVb9ulhofG380vYQpv9KHJQkRv3nK2BpGNMvJ7xs6d/j
PQSjLJoKvLyH/+4FC56jUToFB88FpAf/0mgH4s2lnR3bFQFbXmWUJSuq/dK+
IlMVhZ1iQuA1yMrpb/s9SKuaxIrU9T3Wbx9CMnPQcEMyA1Kl3tzfid7c2bEQ
0+aqMleXZPpbQjIt7Yq/8UPP0QZ1KLDW69gfbvs6w33XraAussR2CecrkiQn
E1Rawio0adi+7qLJahLfgyS9dS7CRRdqml+Yr+1MsZV0v8J2o7iaNui25ZUO
Il+217/PGpdpYEyxoITRGq01W+uIzjqXKBxC277O+c2ucZlKpRDRImQqab1r
r47V1SC26k8KcasOsda7e3WI/+x9NAb/xQJ+0oDYY0zlBHhyOAixAj1/FXv1
Zj924Sss6hrrbl/xV/JA4JT3ohlYvaTxda3qNj9fKclGQE0jYsvdDwcPbglq
S8YBi3XJw4KAm4PalnHoPs+0DIdJwXmGdRZ2ewTu1EBJNUnLw7de1UMLKvuU
LMLh7Ve1K+NQH4aFD98a1CMZJy6j898Z1GMZJxmFetlJyF2wvjuoJxWoFLPM
KfOj9eFbg9rs8zjYxcuu63cCJXYKyIRPix++PagtAZW1qMzfGdQ2j8MhynzB
w7cHtcPjUMPLRcf4O4B6yOPsTWIQIq0EoaAO3r19e3hwenNQuyuDenH4+vD0
8EaQGNSjlUH95fBmK7KgHq8MCn2qtwL1ZGVQ796fgg570v3IElBb/ZVBvX93
cmMMEqjN1UF9uN1ebQm32CsGF/EiVfBrcFGW01uB2r4WqOI2oHYUFKi9swUj
oRDYviEgAaXcYjkotJhuBUq5xXJQ2/2d24FSbrEc1M5tQSm3WA7q4W33SrhF
NBjE0/p94j6ov/3w4G8/3ALUdn9lUNHU9hZ9MEyLcIItspap+i6oTRdUaCt4
WkCd/5ZM8Sq2ERan94KzBSK7HdSWByrHCs7WHfsqVxbe7IdAbVegiiIc8I3r
IV1fHGprGX5kEAFD0SduAmpndVBirJStXssVQD1cAAoMVrwbUUDdmPwUlHCL
pdj5irHHECju2U3YE4F6dG1QWw+fADu8HkAC9fjaoHb7O4+vy3kJ1JOVQaVZ
SE9dD0gFaqd/HVCUVn1jUJsrg5rOzoAx9Switzcfbu+uuGkESriFHppOzvT1
epyoDdT2yqCQB94K1I4PqpMV3J6z7zy8Eah/RJ8j9jxfY1XKLa4Jqljm224B
pdzieqCuwsvLyxD7b4SzfKxZaEtAKbdYDiqZwM48OE9G11mOC0q5xaqg/jGN
F7ttOkE9VG6xKqhpmzawGijlFstBlfFV+WBQ3EjmE6gat1gG6qKcjJ/iNSR5
EZfPZuUofLwyqBq3WAZqOo6Sa5G5A2p1blGBenqzVQm3IK1s4cOsnD3rh9dc
UAVKuAWmBg5gUdhwaprlZVhoooUFdRPh4YF6dGNQT22T1NnZMMOLnLuJk0A9
/p6gnmK+CvYlawUl3OIzJvcuRMFytX4JAnf7K4NyFdDr/hAo4RZXoUvuIV/Z
7uIe1ZgiTUY3YbYCaktBXYEerSm5LcIILPyn2AAmfsYByRuAsn6LFZwJt7Pw
d1f3W2zd0uzevY7fYvd2oK7jt9i6Hajr+C1uuVer+y12bum32FUv5wqg2Hd4
Y1CP1Mu5CqiHtwOlXs5VHD+326tHvt9iDBJy1qqIf4eo3CK/xSCPh9xovYBH
Xu6/PrmhR59BLfJb+KBOjz/cFBKDWuS38F0kt/VbPNpdAIod4grqPF7RwukC
9eg6oOhibPj/pjhbBdTjlUFde/w6KMfL6YCKr2D6sbtZK8Tel4B67Hg5HVDS
ad6BdXvP2WPHy9kCqoqU3J4sHjvcYgkopIhbgVJuMQYt8/NgwcPBYBxHN/WS
ECjlFpwa81tncPg7pAvU/BaqP4fTDMx5RwsFXZv8FGGRD4K/3cOA/9/uPQ2y
s3+ANlf7kLr/wjD2IwYl3CLGnvbhMCqjrnkFNxeMsirhFtzoORx0bvx3QKBw
C6lP6/ZzfAdQwi2SUbjYcPwOqR3CLZaaGd8BlHCL6SxHrrcIFFa5xR05JiuB
Em4hF/stAnWbHwIl3KJMJmAJtkQNKlC3lcJPhFvMpuc5MHG6DxIOcaxc0Iqn
25+rJ8ItZgXe43SOecYdD98CkIASbnEV2pOFv/0uoB5ZUFgP12IEW1Cgpy22
zJeBerwyKGzJd1Mr/yvlkVKvuOBdim3Xi4Iz5NEtsa/NmY15X8SzYRaig5bq
xaRrf9V9km4Xiq/QYUJVtFqVhlcw6v3PRc/g/U32piQ04fl2S6fHXx7Rl9Le
GCUE57U+00poynfdsF8YaQ5s6yCpgTHOUZKWAS+itGCdHrdZOBrigPw7jwcK
Bg23xs+uG2roaZ/mFp3soabnLLg1zhp+PsNelb3qjXV6Q8vPsJRQ5s+wvcW0
A/9D9QKDvxu8zaoeWNxnLwgOuR0ed6i8L00VcpmrlvjS+yl3KgDoAJDaFtSA
8povsGm29xW3wnRnPIhS7wltYcpQpWoV61Tt5YfRmF8Q1UvxJXPqmTbybPtx
Zxv4k4qGw7XWr1tQXtFPJ7IPEA/pvVIaVWBpv4tNeEkR+keflrCdfCtCarSS
6hb0vFW5LWHv1vaxF9gr/6jIVGcQnWXY39wuygUuF0cvnYN9e+Fm+AhuOXyT
6Gqt/vGS7fV2psz2pQfJmqxuHaFVWLlrr8LmjbHMg74FjgTnYK3aTp7qqhMN
6i/elYoh54v6JjhU1rYP3i4sZB4OiKXnwcJYRx4uVEINVvgGWOVVVJG8xh8q
nP5Vv99roKQXPF43QNUVz/3xWeOhPVOxwdahHToKwhYYj9aNbuXiKT7uN5HQ
2MUgdMgWxzZ5XM7yNKixGXfw4H7gop0bKt/l+7Dj4HV2bsyPwQ8/HL88CA6H
SZlhE/a3WRnv/fBD8H6M97MCyU1wn0v3EqBpnmTUtYNj7JFeyx3BaCNsIxmA
LqklNV4V7AbXEFLy9TCPRmWYxOUo/HWWDMJfpyAPw/6uMWFwAMtPRtgDNUEn
UNeVV1J2XgRrd7e2Hu32grtb29t9+Wd9OayHCOsI0cf3JFAT2BivHukAiNKh
9Rou2D99aAPGPI5TukBnQfk9oG9ph4EV0LVD6KINHdqrOwT1TgNeplLsvYK1
9VTgPB7H57hVVCADCOz3t5AM8ZeHK+BuuwJM9UhVswUp9qdd6W/DSQuDk9kZ
3mxGexkTpSXU0iTLzyO9M3k5yC0E+VpuSKhORq1RvnNTydrdzUe72ziBt/Gl
V0WEX20/fIhf8d8neDHKB76Bklid2/b4WR/L7VvuziQAW7TCllvTqPcA67Ow
Wmoi000QAING28TRjrzq80LvQgBNM8bgEffb4kuw+K0+vvVCuoiXMjsqtyUl
lm5X5TJOvZIvI12KbzSj1lyxXHtgFVoceGsXB36PHVbAQPS71/A9ZfQUIfJI
DqvcmYkIrd34UnUBImTYDoqjJC+wPb/uzO7O1goUuInkQA0ca1eJ8rXU3b20
cVu8GzgRZH+bqB9+WYX6+4ZPOV3zQcWdjZu30gIrRdPBHIffebQJbAn+IWLR
UlokKmkRW9KlXgnRn14CUq0BR+jv0Ai7T3CEV26ZYrWWCTclHReZu0BCgXOV
c2N8WDieh0d9gtAnYtqnXtHeXaV8szf2H0nxkkUhpYLf3XTePSahMaRmKkhJ
1CejVu2IL+1u9nBFj/CdA0nm0kHpxqk5XvsxS5NhkvO5i6oH8ki6zMEc+YI4
e5FoQQt6stnv4Sl/snA/BzBH2c+TeBrhFZVeKwlqV04dyL2O83Spkkd2sKCt
7YeIhc0d5qTwyyaj4zLLPxGVcEfzQJLI4ZVNElvwJL+5zX+RENvc3KIPtzd3
qg2ZxHhkk2IidF7MphjlpzstPBuVBt9+TANsuTtqW8VLzxBEOhJIdTGP3HZf
3f4FjJxHgg3mf4ipvqFNbuKlTo90WwX3WvGIZnNrk5cp6NpCYQH6yb7/vvmy
p+fs2Z0REHfM12GjXoG7SX2cqAPW5wSYgZS6YkIKLubLlz9IM6pv3+wt6UxP
8As2t8rwWgj0s7FzmTrqnCMd8E3Q/sXKURFcAoPHf5NhjPeQAW3vGfNDcDwH
QnwFBD8uUZiBBhVhKsan4M3gTZTOCvzop+i32UUWvPs0w7+ewyzS4Dib4x9H
8PbJJWwN/vEC2GSeBKfJp4sszT4b83xGl/rSfiVnM6JM7F8v2889pv+SZeiq
GM6onQl1xwc5ks0n0sQmj+kGgsIRxviyaAtvkk/xUhBvkkGeFRkinaCYdij/
G7kMpZWO+QAA

-->

</rfc>

