<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.24 (Ruby 3.3.6) -->
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-moq-transport-10" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.0 -->
  <front>
    <title abbrev="moq-transport">Media over QUIC Transport</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-10"/>
    <author initials="L." surname="Curley" fullname="Luke Curley">
      <organization>Discord</organization>
      <address>
        <email>kixelated@gmail.com</email>
      </address>
    </author>
    <author initials="K." surname="Pugin" fullname="Kirill Pugin">
      <organization>Meta</organization>
      <address>
        <email>ikir@meta.com</email>
      </address>
    </author>
    <author initials="S." surname="Nandakumar" fullname="Suhas Nandakumar">
      <organization>Cisco</organization>
      <address>
        <email>snandaku@cisco.com</email>
      </address>
    </author>
    <author initials="V." surname="Vasiliev" fullname="Victor Vasiliev">
      <organization>Google</organization>
      <address>
        <email>vasilvv@google.com</email>
      </address>
    </author>
    <author initials="I." surname="Swett" fullname="Ian Swett" role="editor">
      <organization>Google</organization>
      <address>
        <email>ianswett@google.com</email>
      </address>
    </author>
    <date/>
    <area>Web and Internet Transport</area>
    <workgroup>Media Over QUIC</workgroup>
    <keyword>media over quic</keyword>
    <abstract>
      <?line 64?>

<t>This document defines the core behavior for Media over QUIC Transport
(MOQT), a media transport protocol designed to operate over QUIC and
WebTransport, which have similar functionality. MOQT allows a producer of
media to publish data and have it consumed via subscription by a
multiplicity of endpoints. It supports intermediate content distribution
networks and is designed for high scale and low latency distribution.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://moq-wg.github.io/moq-transport/draft-ietf-moq-transport.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-moq-transport/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Media Over QUIC Working Group mailing list (<eref target="mailto:moq@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/moq/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/moq/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/moq-wg/moq-transport"/>.</t>
    </note>
  </front>
  <middle>
    <?line 73?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Media Over QUIC Transport (MOQT) is a protocol that is optimized
for the QUIC protocol <xref target="QUIC"/>, either directly or via WebTransport
<xref target="WebTransport"/>, for the dissemination of media. MOQT utilizes a
publish/subscribe workflow in which producers of media publish data in
response to subscription requests from a multiplicity of endpoints. MOQT
supports wide range of use-cases with different resiliency and latency
(live, interactive) needs without compromising the scalability and cost
effectiveness associated with content delivery networks.</t>
      <t>MOQT is a generic protocol designed to work in concert with multiple
MoQ Streaming Formats. These MoQ Streaming Formats define how content is
encoded, packaged, and mapped to MOQT objects, along with policies for
discovery and subscription.</t>
      <ul spacing="normal">
        <li>
          <t><xref target="model"/> describes the data model employed by MOQT.</t>
        </li>
        <li>
          <t><xref target="session"/> covers aspects of setting up a MOQT session.</t>
        </li>
        <li>
          <t><xref target="priorities"/> covers mechanisms for prioritizing subscriptions.</t>
        </li>
        <li>
          <t><xref target="relays-moq"/> covers behavior at the relay entities.</t>
        </li>
        <li>
          <t><xref target="message"/> covers how control messages are encoded on the wire.</t>
        </li>
        <li>
          <t><xref target="data-streams"/> covers how data messages are encoded on the wire.</t>
        </li>
      </ul>
      <section anchor="motivation">
        <name>Motivation</name>
        <t>The development of MOQT is driven by goals in a number of areas -
specifically latency, the robust feature set of QUIC and relay
support.</t>
        <section anchor="latency">
          <name>Latency</name>
          <t>Latency is necessary to correct for variable network throughput. Ideally live
content is consumed at the same bitrate it is produced. End-to-end latency would
be fixed and only subject to encoding and transmission delays. Unfortunately,
networks have variable throughput, primarily due to congestion. Attempting to
deliver content encoded at a higher bitrate than the network can support causes
queuing along the path from producer to consumer. The speed at which a protocol
can detect and respond to congestion determines the overall latency. TCP-based
protocols are simple but are slow to detect congestion and suffer from
head-of-line blocking. Protocols utilizing UDP directly can avoid queuing, but
the application is then responsible for the complexity of fragmentation,
congestion control, retransmissions, receiver feedback, reassembly, and
more. One goal of MOQT is to achieve the best of both these worlds: leverage the
features of QUIC to create a simple yet flexible low latency protocol that can
rapidly detect and respond to congestion.</t>
        </section>
        <section anchor="leveraging-quic">
          <name>Leveraging QUIC</name>
          <t>The parallel nature of QUIC streams can provide improvements in the face
of loss. A goal of MOQT is to design a streaming protocol to leverage
the transmission benefits afforded by parallel QUIC streams as well
exercising options for flexible loss recovery.</t>
        </section>
        <section anchor="convergence">
          <name>Convergence</name>
          <t>Some live media architectures today have separate protocols for ingest and
distribution, for example RTMP and HTTP based HLS or DASH. Switching protocols
necessitates intermediary origins which re-package the
media content. While specialization can have its benefits, there are efficiency
gains to be had in not having to re-package content. A goal of MOQT is to
develop a single protocol which can be used for transmission from contribution
to distribution. A related goal is the ability to support existing encoding and
packaging schemas, both for backwards compatibility and for interoperability
with the established content preparation ecosystem.</t>
        </section>
        <section anchor="relays">
          <name>Relays</name>
          <t>An integral feature of a protocol being successful is its ability to
deliver media at scale. Greatest scale is achieved when third-party
networks, independent of both the publisher and subscriber, can be
leveraged to relay the content. These relays must cache content for
distribution efficiency while simultaneously routing content and
deterministically responding to congestion in a multi-tenant network. A
goal of MOQT is to treat relays as first-class citizens of the protocol
and ensure that objects are structured such that information necessary
for distribution is available to relays while the media content itself
remains opaque and private.</t>
        </section>
      </section>
      <section anchor="terms-and-definitions">
        <name>Terms and Definitions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" 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>
        <?line -18?>

<t>The following terms are used with the first letter capitalized.</t>
        <dl>
          <dt>Client:</dt>
          <dd>
            <t>The party initiating a Transport Session.</t>
          </dd>
          <dt>Server:</dt>
          <dd>
            <t>The party accepting an incoming Transport Session.</t>
          </dd>
          <dt>Endpoint:</dt>
          <dd>
            <t>A Client or Server.</t>
          </dd>
          <dt>Peer:</dt>
          <dd>
            <t>The other endpoint than the one being described</t>
          </dd>
          <dt>Publisher:</dt>
          <dd>
            <t>An endpoint that handles subscriptions by sending requested Objects from the requested track.</t>
          </dd>
          <dt>Subscriber:</dt>
          <dd>
            <t>An endpoint that subscribes to and receives tracks.</t>
          </dd>
          <dt>Original Publisher:</dt>
          <dd>
            <t>The initial publisher of a given track.</t>
          </dd>
          <dt>End Subscriber:</dt>
          <dd>
            <t>A subscriber that initiates a subscription and does not send the data on to other subscribers.</t>
          </dd>
          <dt>Relay:</dt>
          <dd>
            <t>An entity that is both a Publisher and a Subscriber, but not the Original
Publisher or End Subscriber.</t>
          </dd>
          <dt>Upstream:</dt>
          <dd>
            <t>In the direction of the Original Publisher</t>
          </dd>
          <dt>Downstream:</dt>
          <dd>
            <t>In the direction of the End Subscriber(s)</t>
          </dd>
          <dt>Transport Session:</dt>
          <dd>
            <t>A raw QUIC connection or a WebTransport session.</t>
          </dd>
          <dt>Congestion:</dt>
          <dd>
            <t>Packet loss and queuing caused by degraded or overloaded networks.</t>
          </dd>
          <dt>Group:</dt>
          <dd>
            <t>A temporal sequence of objects. A group represents a join point in a
track. See (<xref target="model-group"/>).</t>
          </dd>
          <dt>Object:</dt>
          <dd>
            <t>An object is an addressable unit whose payload is a sequence of
bytes. Objects form the base element in the MOQT data model. See
(<xref target="model-object"/>).</t>
          </dd>
          <dt>Track:</dt>
          <dd>
            <t>A track is a collection of groups. See (<xref target="model-track"/>).</t>
          </dd>
        </dl>
      </section>
      <section anchor="notational-conventions">
        <name>Notational Conventions</name>
        <t>This document uses the conventions detailed in (<xref section="1.3" sectionFormat="comma" target="RFC9000"/>)
when describing the binary encoding.</t>
        <t>As a quick reference, the following list provides a non normative summary
of the parts of RFC9000 field syntax that are used in this specification.</t>
        <dl>
          <dt>x (L):</dt>
          <dd>
            <t>Indicates that x is L bits long</t>
          </dd>
          <dt>x (i):</dt>
          <dd>
            <t>Indicates that x holds an integer value using the variable-length
encoding as described in (<xref section="16" sectionFormat="comma" target="RFC9000"/>)</t>
          </dd>
          <dt>x (..):</dt>
          <dd>
            <t>Indicates that x can be any length including zero bits long.  Values
 in this format always end on a byte boundary.</t>
          </dd>
          <dt>[x (L)]:</dt>
          <dd>
            <t>Indicates that x is optional and has a length of L</t>
          </dd>
          <dt>x (L) ...:</dt>
          <dd>
            <t>Indicates that x is repeated zero or more times and that each instance
has a length of L</t>
          </dd>
        </dl>
        <t>This document extends the RFC9000 syntax and with the additional field types:</t>
        <dl>
          <dt>x (b):</dt>
          <dd>
            <t>Indicates that x consists of a variable length integer encoding as
described in (<xref section="16" sectionFormat="comma" target="RFC9000"/>), followed by that many bytes
of binary data</t>
          </dd>
          <dt>x (tuple):</dt>
          <dd>
            <t>Indicates that x is a tuple, consisting of a variable length integer encoded
as described in (<xref section="16" sectionFormat="comma" target="RFC9000"/>), followed by that many variable
length tuple fields, each of which are encoded as (b) above.</t>
          </dd>
        </dl>
        <t>To reduce unnecessary use of bandwidth, variable length integers <bcp14>SHOULD</bcp14>
be encoded using the least number of bytes possible to represent the
required value.</t>
      </section>
    </section>
    <section anchor="model">
      <name>Object Data Model</name>
      <t>MOQT has a hierarchical data model, comprised of tracks which contain
groups, and groups that contain objects. Inside of a group, the objects
can be organized into subgroups.</t>
      <t>To give an example of how an application might use this data model,
consider an application sending high and low resolution video using a
codec with temporal scalability. Each resolution is sent as a separate
track to allow the subscriber to pick the appropriate resolution given
the display environment and available bandwidth. Each "group of pictures"
in a video is sent as a group because the first frame is needed to
decode later frames. This allows the client to join at the logical points
where they can get the information to start decoding the stream.
The temporal layers are sent as separate sub groups to allow the
priority mechanism to favour the base layer when there is not enough
bandwidth to send both the base and enhancement layers. Each frame of
video on a given layer is sent as a single object.</t>
      <section anchor="model-object">
        <name>Objects</name>
        <t>The basic data element of MOQT is an object.  An object is an
addressable unit whose payload is a sequence of bytes.  All objects
belong to a group, indicating ordering and potential
dependencies. <xref target="model-group"/>  An object is uniquely identified by
its track namespace, track name, group ID, and object ID, and must be an
identical sequence of bytes regardless of how or where it is retrieved.
An Object can become unavailable, but its contents <bcp14>MUST NOT</bcp14> change over
time.</t>
        <t>Objects are comprised of two parts: metadata and a payload.  The metadata is
never encrypted and is always visible to relays (see <xref target="relays-moq"/>). The
payload portion may be encrypted, in which case it is only visible to the
Original Publisher and End Subscribers. The Original Publisher is solely
responsible for the content of the object payload. This includes the
underlying encoding, compression, any end-to-end encryption, or
authentication. A relay <bcp14>MUST NOT</bcp14> combine, split, or otherwise modify object
payloads.</t>
        <t>Objects within a group are ordered numerically by their Object ID.</t>
      </section>
      <section anchor="model-subgroup">
        <name>Subgroups</name>
        <t>A subgroup is a sequence of one or more objects from the same group
(<xref target="model-group"/>) in ascending order by Object ID. Objects in a subgroup
have a dependency and priority relationship consistent with sharing a
stream and are sent on a single stream whenever possible. A Group is delivered
using at least as many streams as there are Subgroups,
typically with a one-to-one mapping between Subgroups and streams.</t>
        <t>When a Track's forwarding preference (see <xref target="object-fields"/>) is
"Datagram", Objects are not sent in Subgroups and the
description in the remainder of this section does not apply.</t>
        <t>Streams offer in-order reliable delivery and the ability to cancel sending
and retransmission of data. Furthermore, many implementations offer the ability
to control the relative priority of streams, which allows control over the
scheduling of sending data on active streams.</t>
        <t>Every object within a Group belongs to exactly one Subgroup.</t>
        <t>Objects from two subgroups cannot be sent on the same stream. Objects from the
same Subgroup <bcp14>MUST NOT</bcp14> be sent on different streams, unless one of the streams
was reset prematurely, or upstream conditions have forced objects from a Subgroup
to be sent out of Object ID order.</t>
        <t>Original publishers assign each Subgroup a Subgroup ID, and do so as they see fit.  The
scope of a Subgroup ID is a Group, so Subgroups from different Groups <bcp14>MAY</bcp14> share a Subgroup
ID without implying any relationship between them. In general, publishers assign
objects to subgroups in order to leverage the features of streams as described
above.</t>
        <t>An example strategy for using stream properties follows. If object B is
dependent on object A, then delivery of B can follow A, i.e. A and B can be
usefully delivered over a single stream. Furthermore, in this example:</t>
        <ul spacing="normal">
          <li>
            <t>If an object is dependent on all previous objects in a Subgroup, it is added to
that Subgroup.</t>
          </li>
          <li>
            <t>If an object is not dependent on all of the objects in a Subgroup, it goes in
a different Subgroup.</t>
          </li>
          <li>
            <t>There are often many ways to compose Subgroups that meet these criteria. Where
possible, choose the composition that results in the fewest Subgroups in a group
to minimize the number of streams used.</t>
          </li>
        </ul>
      </section>
      <section anchor="model-group">
        <name>Groups</name>
        <t>A group is a collection of objects and is a sub-unit of a track (<xref target="model-track"/>).
Groups <bcp14>SHOULD</bcp14> be indendepently useful, so objects within a group <bcp14>SHOULD NOT</bcp14> depend
on objects in other groups. A group provides a join point for subscriptions, so a
subscriber that does not want to receive the entire track can opt to receive only
the latest group(s).  The publisher then selectively transmits objects based on
their group membership.  Groups can contain any number of objects.</t>
        <t>Within a track, the original publisher <bcp14>SHOULD</bcp14> produce Group IDs which increase
with time. Subscribers to tracks which do not follow this requirement <bcp14>SHOULD NOT</bcp14>
use range filters which span multiple groups in FETCH or SUBSCRIBE. SUBSCRIBE and
FETCH delivery use Group Order, so a FETCH cannot deliver Groups out of order
and a subscription could have unexpected delivery order if Group IDs do not increase
with time.</t>
      </section>
      <section anchor="model-track">
        <name>Track</name>
        <t>A track is a sequence of groups (<xref target="model-group"/>). It is the entity
against which a subscriber issues a subscription request.  A subscriber
can request to receive individual tracks starting at a group boundary,
including any new objects pushed by the publisher while the track is
active.</t>
        <section anchor="track-name">
          <name>Track Naming</name>
          <t>In MOQT, every track is identified by a Full Track Name, consisting of a Track
Namespace and a Track Name.</t>
          <t>Track Namespace is an ordered N-tuple of bytes where N can be between 1 and 32.
The structured nature of Track Namespace allows relays and applications to
manipulate prefixes of a namespace. If an endpoint receives a Track Namespace
tuple with an N of 0 or more than 32, it <bcp14>MUST</bcp14> close the session with a Protocol
Violation.</t>
          <t>Track Name is a sequence of bytes that identifies an individual track within the
namespace.</t>
          <t>In this specification, both the Track Namespace tuple fields and the Track Name
are not constrained to a specific encoding. They carry a sequence of bytes and
comparison between two Track Namespace tuple fields or Track Names is done by
exact comparison of the bytes. Specifications that use MoQ Transport may
constrain the information in these fields, for example by restricting them to
UTF-8. Any specification that does needs to specify the canonicalization into
the bytes in the Track Namespace or Track Name such that exact comparison works.</t>
        </section>
        <section anchor="track-scope">
          <name>Scope</name>
          <t>A MOQT scope is a set of servers (as identified by their connection
URIs) for which the tuple of Track Name and Track Namespace are
guaranteed to be unique and identify a specific track. It is up to
the application using MOQT to define how broad or narrow the scope is.
An application that deals with connections between devices
on a local network may limit the scope to a single connection; by
contrast, an application that uses multiple CDNs to serve media may
require the scope to include all of those CDNs.</t>
          <t>Because the tuple of Track Namespace and Track Name are unique within an
MOQT scope, they can be used as a cache key.
MOQT does not provide any in-band content negotiation methods similar to
the ones defined by HTTP (<xref section="10" sectionFormat="comma" target="RFC9110"/>); if, at a given
moment in time, two tracks within the same scope contain different data,
they have to have different names and/or namespaces.</t>
        </section>
      </section>
    </section>
    <section anchor="session">
      <name>Sessions</name>
      <section anchor="session-establishment">
        <name>Session establishment</name>
        <t>This document defines a protocol that can be used interchangeably both
over a QUIC connection directly <xref target="QUIC"/>, and over WebTransport
<xref target="WebTransport"/>.  Both provide streams and datagrams with similar
semantics (see <xref section="4" sectionFormat="comma" target="I-D.ietf-webtrans-overview"/>); thus, the
main difference lies in how the servers are identified and how the
connection is established.  When using QUIC, datagrams <bcp14>MUST</bcp14> be
supported via the [QUIC-DATAGRAM] extension, which is already a
requirement for WebTransport over HTTP/3.</t>
        <t>There is no definition of the protocol over other transports,
such as TCP, and applications using MoQ might need to fallback to
another protocol when QUIC or WebTransport aren't available.</t>
        <section anchor="webtransport">
          <name>WebTransport</name>
          <t>A MOQT server that is accessible via WebTransport can be identified
using an HTTPS URI (<xref section="4.2.2" sectionFormat="comma" target="RFC9110"/>).  A MOQT session can be
established by sending an extended CONNECT request to the host and the
path indicated by the URI, as described in
(<xref section="3" sectionFormat="comma" target="WebTransport"/>).</t>
        </section>
        <section anchor="quic">
          <name>QUIC</name>
          <t>A MOQT server that is accessible via native QUIC can be identified by a
URI with a "moqt" scheme.  The "moqt" URI scheme is defined as follows,
using definitions from <xref target="RFC3986"/>:</t>
          <artwork><![CDATA[
moqt-URI = "moqt" "://" authority path-abempty [ "?" query ]
]]></artwork>
          <t>The <tt>authority</tt> portion <bcp14>MUST NOT</bcp14> contain an empty <tt>host</tt> portion.
The <tt>moqt</tt> URI scheme supports the <tt>/.well-known/</tt> path prefix defined in
<xref target="RFC8615"/>.</t>
          <t>This protocol does not specify any semantics on the <tt>path-abempty</tt> and
<tt>query</tt> portions of the URI.  The contents of those are left up to the
application.</t>
          <t>The client can establish a connection to a MoQ server identified by a
given URI by setting up a QUIC connection to the host and port
identified by the <tt>authority</tt> section of the URI.  The <tt>path-abempty</tt>
and <tt>query</tt> portions of the URI are communicated to the server using the
PATH parameter (<xref target="path"/>) which is sent in the CLIENT_SETUP message at the
start of the session.  The ALPN value <xref target="RFC7301"/> used by the protocol
is <tt>moq-00</tt>.</t>
        </section>
        <section anchor="connection-url">
          <name>Connection URL</name>
          <t>Each track <bcp14>MAY</bcp14> have one or more associated connection URLs specifying
network hosts through which a track may be accessed. The syntax of the
Connection URL and the associated connection setup procedures are
specific to the underlying transport protocol usage <xref target="session"/>.</t>
        </section>
      </section>
      <section anchor="version-negotiation">
        <name>Version and Extension Negotiation</name>
        <t>Endpoints use the exchange of Setup messages to negotiate the MOQT version and
any extensions to use.</t>
        <t>The client indicates the MOQT versions it supports in the CLIENT_SETUP message
(see <xref target="message-setup"/>). It also includes the union of all Setup Parameters
<xref target="setup-params"/> required for a handshake by any of those versions.</t>
        <t>Within any MOQT version, clients request the use of extensions by adding Setup
parameters corresponding to that extension. No extensions are defined in this
document.</t>
        <t>The server replies with a SERVER_SETUP message that indicates the chosen
version, includes all parameters required for a handshake in that version, and
parameters for every extension requested by the client that it supports.</t>
        <t>New versions of MOQT <bcp14>MUST</bcp14> specify which existing extensions can be used with
that version. New extensions <bcp14>MUST</bcp14> specify the existing versions with which they
can be used.</t>
        <t>If a given parameter carries the same information in multiple versions,
but might have different optimal values in those versions, there <bcp14>SHOULD</bcp14> be
separate Setup parameters for that information in each version.</t>
      </section>
      <section anchor="session-init">
        <name>Session initialization</name>
        <t>The first stream opened is a client-initiated bidirectional control stream where
the endpoints exchange Setup messages (<xref target="message-setup"/>).  All messages defined
in this draft except OBJECT and OBJECT_WITH_LENGTH are sent on the control
stream after the Setup message. Control messages <bcp14>MUST NOT</bcp14> be sent on any other
stream, and a peer receiving a control message on a different stream closes the
session as a 'Protocol Violation'. Objects <bcp14>MUST NOT</bcp14> be sent on the control
stream, and a peer receiving an Object on the control stream closes the session
as a 'Protocol Violation'.</t>
        <t>This draft only specifies a single use of bidirectional streams. Objects are
sent on unidirectional streams.  Because there are no other uses of
bidirectional streams, a peer <bcp14>MAY</bcp14> currently close the session as a
'Protocol Violation' if it receives a second bidirectional stream.</t>
        <t>The control stream <bcp14>MUST NOT</bcp14> be closed at the underlying transport layer while the
session is active.  Doing so results in the session being closed as a
'Protocol Violation'.</t>
      </section>
      <section anchor="session-termination">
        <name>Termination</name>
        <t>The Transport Session can be terminated at any point.  When native QUIC
is used, the session is closed using the CONNECTION_CLOSE frame
(<xref section="19.19" sectionFormat="comma" target="QUIC"/>).  When WebTransport is used, the session is
closed using the CLOSE_WEBTRANSPORT_SESSION capsule (<xref section="5" sectionFormat="comma" target="WebTransport"/>).</t>
        <t>The application <bcp14>MAY</bcp14> use any error message and <bcp14>SHOULD</bcp14> use a relevant
code, as defined below:</t>
        <table>
          <thead>
            <tr>
              <th align="right">Code</th>
              <th align="left">Reason</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x0</td>
              <td align="left">No Error</td>
            </tr>
            <tr>
              <td align="right">0x1</td>
              <td align="left">Internal Error</td>
            </tr>
            <tr>
              <td align="right">0x2</td>
              <td align="left">Unauthorized</td>
            </tr>
            <tr>
              <td align="right">0x3</td>
              <td align="left">Protocol Violation</td>
            </tr>
            <tr>
              <td align="right">0x4</td>
              <td align="left">Duplicate Track Alias</td>
            </tr>
            <tr>
              <td align="right">0x5</td>
              <td align="left">Parameter Length Mismatch</td>
            </tr>
            <tr>
              <td align="right">0x6</td>
              <td align="left">Too Many Subscribes</td>
            </tr>
            <tr>
              <td align="right">0x10</td>
              <td align="left">GOAWAY Timeout</td>
            </tr>
            <tr>
              <td align="right">0x11</td>
              <td align="left">Control Message Timeout</td>
            </tr>
            <tr>
              <td align="right">0x12</td>
              <td align="left">Data Stream Timeout</td>
            </tr>
          </tbody>
        </table>
        <ul spacing="normal">
          <li>
            <t>No Error: The session is being terminated without an error.</t>
          </li>
          <li>
            <t>Internal Error: An implementation specific error occurred.</t>
          </li>
          <li>
            <t>Unauthorized: The endpoint breached an agreement, which <bcp14>MAY</bcp14> have been
 pre-negotiated by the application.</t>
          </li>
          <li>
            <t>Protocol Violation: The remote endpoint performed an action that was
disallowed by the specification.</t>
          </li>
          <li>
            <t>Duplicate Track Alias: The endpoint attempted to use a Track Alias
that was already in use.</t>
          </li>
          <li>
            <t>Too Many Subscribes: The session was closed because the subscriber used
a Subscribe ID equal or larger than the current Maximum Subscribe ID.</t>
          </li>
          <li>
            <t>GOAWAY Timeout: The session was closed because the peer took too long to
close the session in response to a GOAWAY (<xref target="message-goaway"/>) message.
See session migration (<xref target="session-migration"/>).</t>
          </li>
          <li>
            <t>Control Message Timeout: The session was closed because the peer took too
long to respond to a control message.</t>
          </li>
          <li>
            <t>Data Stream Timeout: The session was closed because the peer took too
long to send data expected on an open Data Stream <xref target="data-streams"/>.  This
includes fields of a stream header or an object header within a data
stream. If an endpoint times out waiting for a new object header on an
open subgroup stream, it <bcp14>MAY</bcp14> send a STOP_SENDING on that stream, terminate
the subscription, or close the session with an error.</t>
          </li>
        </ul>
      </section>
      <section anchor="session-migration">
        <name>Migration</name>
        <t>MOQT requires a long-lived and stateful session. However, a service
provider needs the ability to shutdown/restart a server without waiting for all
sessions to drain naturally, as that can take days for long-form media.
MOQT enables proactively draining sessions via the GOAWAY message (<xref target="message-goaway"/>).</t>
        <t>The server sends a GOAWAY message, signaling the client to establish a new
session and migrate any active subscriptions. The GOAWAY message optionally
contains a new URI for the new session, otherwise the current URI is
reused. The server <bcp14>SHOULD</bcp14> terminate the session with 'GOAWAY Timeout' after a
sufficient timeout if there are still open subscriptions or fetches on a
connection.</t>
        <t>When the server is a subscriber, it <bcp14>SHOULD</bcp14> send a GOAWAY message to downstream
subscribers prior to any UNSUBSCRIBE messages to upstream publishers.</t>
        <t>After the client receives a GOAWAY, it's <bcp14>RECOMMENDED</bcp14> that the client waits until
there are no more active subscriptions before closing the session with NO_ERROR.
Ideally this is transparent to the application using MOQT, which involves
establishing a new session in the background and migrating active subscriptions
and announcements. The client can choose to delay closing the session if it
expects more OBJECTs to be delivered. The server closes the session with a
'GOAWAY Timeout' if the client doesn't close the session quickly enough.</t>
      </section>
    </section>
    <section anchor="retrieving-tracks-with-subscribe-and-fetch">
      <name>Retrieving Tracks with Subscribe and Fetch</name>
      <t>The central interaction with a publisher is to send SUBSCRIBE and/or FETCH for
a particular track. The subscriber expects to receive a SUBSCRIBE_OK/FETCH_OK
and objects from the track.</t>
      <t>A publisher <bcp14>MUST</bcp14> send exactly one SUBSCRIBE_OK or SUBSCRIBE_ERROR in response to
a SUBSCRIBE. It <bcp14>MUST</bcp14> send exactly one FETCH_OK or FETCH_ERROR in response to a
FETCH. The subscriber <bcp14>SHOULD</bcp14> close the session with a protocol error if it
receives more than one.</t>
      <t>A subscriber keeps SUBSCRIBE state until it sends UNSUBSCRIBE, or after receipt
of a SUBSCRIBE_DONE or SUBSCRIBE_ERROR. Note that SUBSCRIBE_DONE does not
usually indicate that state can immediately be destroyed, see
<xref target="message-subscribe-done"/>.</t>
      <t>A subscriber keeps FETCH state until it sends FETCH_CANCEL, receives
FETCH_ERROR, or receives a FIN or RESET_STREAM for the FETCH data stream. If the
data stream is already open, it <bcp14>MAY</bcp14> send STOP_SENDING for the data stream along
with FETCH_CANCEL, but <bcp14>MUST</bcp14> send FETCH_CANCEL.</t>
      <t>The Publisher can destroy subscription or fetch state as soon as it has received
UNSUBSCRIBE or FETCH_CANCEL, respectively. It <bcp14>MUST</bcp14> reset any open streams
associated with the SUBSCRIBE or FETCH. It can also destroy state after closing
the FETCH data stream.</t>
      <t>The publisher can immediately delete SUBSCRIBE state after sending
SUBSCRIBE_DONE, but <bcp14>MUST NOT</bcp14> send it until it has closed all related streams. It
can destroy all FETCH state after closing the data stream.</t>
      <t>A SUBSCRIBE_ERROR or FETCH_ERROR indicates no objects will be delivered, and
both endpoints can immediately destroy relevant state. Objects <bcp14>MUST NOT</bcp14> be sent
for requests that end with an error.</t>
    </section>
    <section anchor="track-discovery">
      <name>Namespace Discovery and Routing Subscriptions</name>
      <t>Discovery of MoQT servers is always done out-of-band. Namespace discovery can be
done in the context of an established MoQT session.</t>
      <t>Given sufficient out of band information, it is valid for a subscriber
to send a SUBSCRIBE or FETCH message to a publisher (including a relay) without
any previous MoQT messages besides SETUP. However, SUBSCRIBE_ANNOUNCES and
ANNOUNCE messages provide an in-band means of discovery of subscribers and
publishers for a namespace.</t>
      <t>The syntax of these messages is described in <xref target="message"/>.</t>
      <section anchor="subscribing-to-announcements">
        <name>Subscribing to Announcements</name>
        <t>If the subscriber is aware of a namespace of interest, it can send
SUBSCRIBE_ANNOUNCES to publishers/relays it has established a session with. The
recipient of this message will send any relevant ANNOUNCE or UNANNOUNCE messages
for that namespace, or subset of that namespace.</t>
        <t>A publisher <bcp14>MUST</bcp14> send exactly one SUBSCRIBE_ANNOUNCES_OK or
SUBSCRIBE_ANNOUNCES_ERROR in response to a SUBSCRIBE_ANNOUNCES. The subscriber
<bcp14>SHOULD</bcp14> close the session with a protocol error if it detects receiving more than
one.</t>
        <t>The receiver of a SUBSCRIBE_ANNOUNCES_OK or SUBSCRIBE_ANNOUNCES_ERROR ought to
forward the result to the application, so that it can make decisions about
further publishers to contact.</t>
        <t>An UNSUBSCRIBE_ANNOUNCES withdraws a previous SUBSCRIBE_ANNOUNCES. It does
not prohibit the receiver (publisher) from sending further ANNOUNCE messages.</t>
      </section>
      <section anchor="announcements">
        <name>Announcements</name>
        <t>A publisher <bcp14>MAY</bcp14> send ANNOUNCE messages to any subscriber. An ANNOUNCE indicates
to the subscriber where to route a SUBSCRIBE or FETCH for that namespace. A
subscriber <bcp14>MAY</bcp14> send SUBSCRIBE or FETCH for a namespace without having received
an ANNOUNCE for it.</t>
        <t>If a publisher is authoritative for a given namespace, or is a relay that has
received an authorized ANNOUNCE for that namespace from an upstream publisher,
it <bcp14>MUST</bcp14> send an ANNOUNCE to any subscriber that has subscribed to ANNOUNCE for
that namespace, or a subset of that namespace. A publisher <bcp14>MAY</bcp14> send the ANNOUNCE
to any other subscriber.</t>
        <t>An endpoint <bcp14>SHOULD NOT</bcp14>, however, send an ANNOUNCE advertising a namespace that
exactly matches a namespace for which the peer sent an earlier ANNOUNCE
(i.e. an ANNOUNCE ought not to be echoed back to its sender).</t>
        <t>The receiver of an ANNOUNCE_OK or ANNOUNCE_ERROR <bcp14>SHOULD</bcp14> report this to the
application to inform the search for additional subscribers for a namespace,
or abandoning the attempt to publish under this namespace. This might be
especially useful in upload or chat applications. A subscriber <bcp14>MUST</bcp14> send exactly
one ANNOUNCE_OK or ANNOUNCE_ERROR in response to an ANNOUNCE. The publisher
<bcp14>SHOULD</bcp14> close the session with a protocol error if it receives more than one.</t>
        <t>An UNANNOUNCE message withdraws a previous ANNOUNCE, although it is not a
protocol error for the subscriber to send a SUBSCRIBE or FETCH message after
receiving an UNANNOUNCE.</t>
        <t>A subscriber can send ANNOUNCE_CANCEL to revoke acceptance of an ANNOUNCE, for
example due to expiration of authorization credentials. The message enables the
publisher to ANNOUNCE again with refreshed authorization, or discard associated
state. After receiving an ANNOUNCE_CANCEL, the publisher does not send UNANNOUNCE.</t>
        <t>While ANNOUNCE does provide hints on where to route a SUBSCRIBE or FETCH, it is
not a full-fledged routing protocol and does not protect against loops and other
phenomena. In particular, ANNOUNCE <bcp14>SHOULD NOT</bcp14> be used to find paths through
richly connected networks of relays.</t>
        <t>A subscriber <bcp14>MAY</bcp14> send a SUBSCRIBE or FETCH for a track to any publisher. If it
has accepted an ANNOUNCE with a namespace that exactly matches the namespace for
that track, it <bcp14>SHOULD</bcp14> only request it from the senders of those ANNOUNCE
messages.</t>
      </section>
    </section>
    <section anchor="priorities">
      <name>Priorities</name>
      <t>MoQ priorities allow a subscriber and original publisher to influence
the transmission order of Objects within a session in the presence of
congestion.</t>
      <section anchor="definitions">
        <name>Definitions</name>
        <t>MoQT maintains priorities between different <em>schedulable objects</em>.
A schedulable object in MoQT is either:</t>
        <ol spacing="normal" type="1"><li>
            <t>An object that belongs to a subgroup where that object would be the next
object to be sent in that subgroup.</t>
          </li>
          <li>
            <t>An object that belongs to a track with delivery preference Datagram.</t>
          </li>
        </ol>
        <t>Since a single subgroup or datagram has a single publisher priority, it can be
useful to conceptualize this process as scheduling subgroups or datagrams
instead of individual objects on them.</t>
        <t>A <em>priority number</em> is an unsigned integer with a value between 0 and 255.
A lower priority number indicates higher priority; the highest priority is 0.</t>
        <t><em>Subscriber Priority</em> is a priority number associated with an individual
subscription.  It is specified in the SUBSCRIBE message, and can be updated via
SUBSCRIBE_UPDATE message.  The subscriber priority of an individual schedulable
object is the subscriber priority of the subscription that caused that object
to be sent. When subscriber priority is changed, a best effort <bcp14>SHOULD</bcp14> be made
to apply the change to all objects that have not been sent, but it is
implementation dependent what happens to objects that have already been
received and possibly scheduled.</t>
        <t><em>Publisher Priority</em> is a priority number associated with an individual
schedulable object.  It is specified in the header of the respective subgroup or
datagram, and is the same for all objects in a single subgroup.</t>
        <t><em>Group Order</em> is a property of an invidual subscription.  It can be either
'Ascending' (groups with lower group ID are sent first), or 'Descending'
(groups with higher group ID are sent first).  The publisher communicates its
group order in the SUBSCRIBE_OK message; the subscriber can override it in its
SUBSCRIBE message.  The group order of an existing subscription cannot be
changed.</t>
      </section>
      <section anchor="scheduling-algorithm">
        <name>Scheduling Algorithm</name>
        <t>When an MoQT publisher has multiple schedulable objects it can choose between,
the objects <bcp14>SHOULD</bcp14> be selected as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>If two objects have a different subscriber priority associated with them,
the one with <strong>the highest subscriber priority</strong> is sent first.</t>
          </li>
          <li>
            <t>If two objects have the same subscriber priority, but a different publisher
priority, the one with <strong>the highest publisher priority</strong> is sent first.</t>
          </li>
          <li>
            <t>If two objects have the same subscriber and publisher priority, but belong
to two different groups of the same track,
<strong>the group order</strong> of the associated subscription is used to
decide the one that is sent first.</t>
          </li>
          <li>
            <t>If two objects belong to the same group of the same track,
the one with <strong>the lowest Subgroup ID</strong> (for tracks
with delivery preference Subgroup), or <strong>the lowest Object ID</strong> (for tracks
with delivery preference Datagram) is sent first.</t>
          </li>
        </ol>
        <t>This algorithm does not provide a well-defined ordering for objects that belong
to different subscriptions, but have the same subscriber and publisher
priority.  The ordering in those cases is implementation-defined, though the
expectation is that all subscriptions will be able to send some data.</t>
        <t>Given the critical nature of control messages and their relatively
small size, the control stream <bcp14>SHOULD</bcp14> be prioritized higher than all
subscribed Objects.</t>
      </section>
      <section anchor="considerations-for-setting-priorities">
        <name>Considerations for Setting Priorities</name>
        <t>Relays <bcp14>SHOULD</bcp14> respect the subscriber and original publisher's priorities.
Relays <bcp14>SHOULD NOT</bcp14> directly use Subscriber Priority or Group Order
from incoming subscriptions for upstream subscriptions. Relays use of
Subscriber Priority for upstream subscriptions can be based on
factors specific to it, such as the popularity of the
content or policy, or relays can specify the same value for all
upstream subscriptions.</t>
        <t>MoQ Sessions can span multiple namespaces, and priorities might not
be coordinated across namespaces.  The subscriber's priority is
considered first, so there is a mechanism for a subscriber to fix
incompatibilities between different namespaces prioritization schemes.
Additionally, it is anticipated that when multiple namespaces
are present within a session, the namespaces could be coordinating,
possibly part of the same application.  In cases when pooling among
namespaces is expected to cause issues, multiple MoQ sessions, either
within a single connection or on multiple connections can be used.</t>
        <t>Implementations that have a default priority <bcp14>SHOULD</bcp14> set it to a value in
the middle of the range (eg: 128) to allow non-default priorities to be
set either higher or lower.</t>
      </section>
    </section>
    <section anchor="relays-moq">
      <name>Relays</name>
      <t>Relays are leveraged to enable distribution scale in the MoQ
architecture. Relays can be used to form an overlay delivery network,
similar in functionality to Content Delivery Networks
(CDNs). Additionally, relays serve as policy enforcement points by
validating subscribe and publish requests at the edge of a network.</t>
      <t>Relays are endpoints, which means they terminate Transport Sessions in order to
have visibility of MoQ Object metadata.</t>
      <t>Relays <bcp14>MAY</bcp14> cache Objects, but are not required to.</t>
      <section anchor="subscriber-interactions">
        <name>Subscriber Interactions</name>
        <t>Subscribers subscribe to tracks by sending a SUBSCRIBE
(<xref target="message-subscribe-req"/>) control message for each track of
interest. Relays <bcp14>MUST</bcp14> ensure subscribers are authorized to access the
content associated with the track. The authorization
information can be part of subscription request itself or part of the
encompassing session. The specifics of how a relay authorizes a user are outside
the scope of this specification.</t>
        <t>The relay will have to send an upstream SUBSCRIBE and/or FETCH if it does not
have all the objects in the FETCH, or is not currently subscribed to the full
requested range. In this case, it <bcp14>SHOULD</bcp14> withhold sending its own SUBSCRIBE_OK
until receiving one from upstream. It <bcp14>MUST</bcp14> withhold FETCH_OK until receiving
one from upstream.</t>
        <t>For successful subscriptions, the publisher maintains a list of
subscribers for each track. Each new OBJECT belonging to the
track within the subscription range is forwarded to each active
subscriber, dependent on the congestion response.</t>
        <t>A caching relay saves Objects to its cache identified by the Object's
Full Track Name, Group ID and Object ID. Relays <bcp14>MUST</bcp14> be able to
process objects for the same Full Track Name from multiple
publishers and forward objects to active matching subscriptions.
If multiple objects are received with the same Full Track Name,
Group ID and Object ID, Relays <bcp14>MAY</bcp14> ignore subsequently received Objects
or <bcp14>MAY</bcp14> use them to update the cache. Implementations that update the
cache need to protect against cache poisoning.</t>
        <t>A relay <bcp14>MUST NOT</bcp14> reorder or drop objects received on a multi-object stream when
forwarding to subscribers, unless it has application specific information.</t>
        <t>Relays <bcp14>MAY</bcp14> aggregate authorized subscriptions for a given track when
multiple subscribers request the same track. Subscription aggregation
allows relays to make only a single upstream subscription for the
track. The published content received from the upstream subscription
request is cached and shared among the pending subscribers.</t>
        <section anchor="graceful-subscriber-relay-switchover">
          <name>Graceful Subscriber Relay Switchover</name>
          <t>This section describes behavior a subscriber <bcp14>MAY</bcp14> implement
to allow for a better user experience when a relay sends a GOAWAY.</t>
          <t>When a subscriber receives the GOAWAY message, it starts the process
of connecting to a new relay and sending the SUBSCRIBE requests for
all active subscriptions to the new relay. The new relay will send a
response to the subscribes and if they are successful, the subscriptions
to the old relay can be stopped with an UNSUBSCRIBE.</t>
        </section>
      </section>
      <section anchor="publisher-interactions">
        <name>Publisher Interactions</name>
        <t>Publishing through the relay starts with publisher sending ANNOUNCE
control message with a <tt>Track Namespace</tt> (<xref target="model-track"/>).
The ANNOUNCE enables the relay to know which publisher to forward a
SUBSCRIBE to.</t>
        <t>Relays <bcp14>MUST</bcp14> verify that publishers are authorized to publish
the content associated with the set of
tracks whose Track Namespace matches the announced namespace. Where the
authorization and identification of the publisher occurs depends on the way the
relay is managed and is application specific.</t>
        <t>A Relay can receive announcements from multiple publishers for the same
Track Namespace and it <bcp14>SHOULD</bcp14> respond with the same response to each of the
publishers, as though it was responding to an ANNOUNCE
from a single publisher for a given track namespace.</t>
        <t>When a publisher wants to stop
new subscriptions for an announced namespace it sends an UNANNOUNCE.
A subscriber indicates it will no longer route subscriptions for a
namespace it previously responded ANNOUNCE_OK to by sending an
ANNOUNCE_CANCEL.</t>
        <t>A relay manages sessions from multiple publishers and subscribers,
connecting them based on the track namespace. This <bcp14>MUST</bcp14> use an exact
match on track namespace unless otherwise negotiated by the application.
For example, a SUBSCRIBE namespace=foobar message will be forwarded to
the session that sent ANNOUNCE namespace=foobar.</t>
        <t>When a relay receives an incoming SUBSCRIBE request that triggers an
upstream subscription, it <bcp14>SHOULD</bcp14> send a SUBSCRIBE request to each
publisher that has announced the subscription's namespace, unless it
already has an active subscription for the Objects requested by the
incoming SUBSCRIBE request from all available publishers.</t>
        <t>When a relay receives an incoming ANNOUNCE for a given namespace, for
each active upstream subscription that matches that namespace, it <bcp14>SHOULD</bcp14> send a
SUBSCRIBE to the publisher that sent the ANNOUNCE.</t>
        <t>OBJECT message headers carry a short hop-by-hop <tt>Track Alias</tt> that maps to
the Full Track Name (see <xref target="message-subscribe-ok"/>). Relays use the
<tt>Track Alias</tt> of an incoming OBJECT message to identify its track and find
the active subscribers for that track. Relays <bcp14>MUST</bcp14> forward OBJECT messages to
matching subscribers in accordance to each subscription's priority, group order,
and delivery timeout.</t>
        <section anchor="graceful-publisher-network-switchover">
          <name>Graceful Publisher Network Switchover</name>
          <t>This section describes behavior that a publisher <bcp14>MAY</bcp14>
choose to implement to allow for a better users experience when
switching between networks, such as WiFi to Cellular or vice versa.</t>
          <t>If the original publisher detects it is likely to need to switch networks,
for example because the WiFi signal is getting weaker, and it does not
have QUIC connection migration available, it establishes a new session
over the new interface and sends an ANNOUCE. The relay will forward
matching subscribes and the publisher publishes objects on both sessions.
Once the subscriptions have migrated over to session on the new network,
the publisher can stop publishing objects on the old network. The relay
will drop duplicate objects received on both subscriptions.
Ideally, the subscriptions downstream from the relay do no observe this
change, and keep receiving the objects on the same subscription.</t>
        </section>
        <section anchor="graceful-publisher-relay-switchover">
          <name>Graceful Publisher Relay Switchover</name>
          <t>This section describes behavior that a publisher <bcp14>MAY</bcp14> choose to implement
to allow for a better user experience when a relay sends them a GOAWAY.</t>
          <t>When a publisher receives a GOAWAY, it starts the process of
connecting to a new relay and sends announces, but it does not immediately
stop publishing objects to the old relay. The new relay will send
subscribes and the publisher can start sending new objects to the new relay
instead of the old relay. Once objects are going to the new relay,
the announcement and subscription to the old relay can be stopped.</t>
        </section>
      </section>
      <section anchor="relay-object-handling">
        <name>Relay Object Handling</name>
        <t>MOQT encodes the delivery information for a stream via OBJECT headers
(<xref target="message-object"/>).  A relay <bcp14>MUST NOT</bcp14> modify Object properties when
forwarding.</t>
        <t>A relay <bcp14>MUST</bcp14> treat the object payload as opaque.  A relay <bcp14>MUST NOT</bcp14>
combine, split, or otherwise modify object payloads.  A relay <bcp14>SHOULD</bcp14>
prioritize sending Objects based on <xref target="priorities"/>.</t>
        <t>A publisher <bcp14>SHOULD</bcp14> begin sending incomplete objects when available to
avoid incurring additional latency.</t>
        <t>A relay that reads from one stream and writes to another in order can
introduce head-of-line blocking.  Packet loss will cause stream data to
be buffered in the library, awaiting in-order delivery, which could
increase latency over additional hops.  To mitigate this, a relay <bcp14>MAY</bcp14>
read and write stream data out of order subject to flow control
limits.  See section 2.2 in <xref target="QUIC"/>.</t>
      </section>
    </section>
    <section anchor="message">
      <name>Control Messages</name>
      <t>MOQT uses a single bidirectional stream to exchange control messages, as
defined in <xref target="session-init"/>.  Every single message on the control stream is
formatted as follows:</t>
      <figure anchor="moq-transport-message-format">
        <name>MOQT Message</name>
        <artwork><![CDATA[
MOQT Control Message {
  Message Type (i),
  Message Length (i),
  Message Payload (..),
}
]]></artwork>
      </figure>
      <table>
        <thead>
          <tr>
            <th align="right">ID</th>
            <th align="left">Messages</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="right">0x40</td>
            <td align="left">CLIENT_SETUP (<xref target="message-setup"/>)</td>
          </tr>
          <tr>
            <td align="right">0x41</td>
            <td align="left">SERVER_SETUP (<xref target="message-setup"/>)</td>
          </tr>
          <tr>
            <td align="right">0x10</td>
            <td align="left">GOAWAY (<xref target="message-goaway"/>)</td>
          </tr>
          <tr>
            <td align="right">0x15</td>
            <td align="left">MAX_SUBSCRIBE_ID (<xref target="message-max-subscribe-id"/>)</td>
          </tr>
          <tr>
            <td align="right">0x1A</td>
            <td align="left">SUBSCRIBES_BLOCKED (<xref target="message-subscribes-blocked"/>)</td>
          </tr>
          <tr>
            <td align="right">0x3</td>
            <td align="left">SUBSCRIBE (<xref target="message-subscribe-req"/>)</td>
          </tr>
          <tr>
            <td align="right">0x4</td>
            <td align="left">SUBSCRIBE_OK (<xref target="message-subscribe-ok"/>)</td>
          </tr>
          <tr>
            <td align="right">0x5</td>
            <td align="left">SUBSCRIBE_ERROR (<xref target="message-subscribe-error"/>)</td>
          </tr>
          <tr>
            <td align="right">0xA</td>
            <td align="left">UNSUBSCRIBE (<xref target="message-unsubscribe"/>)</td>
          </tr>
          <tr>
            <td align="right">0x2</td>
            <td align="left">SUBSCRIBE_UPDATE (<xref target="message-subscribe-update"/>)</td>
          </tr>
          <tr>
            <td align="right">0xB</td>
            <td align="left">SUBSCRIBE_DONE (<xref target="message-subscribe-done"/>)</td>
          </tr>
          <tr>
            <td align="right">0x16</td>
            <td align="left">FETCH (<xref target="message-fetch"/>)</td>
          </tr>
          <tr>
            <td align="right">0x18</td>
            <td align="left">FETCH_OK (<xref target="message-fetch-ok"/>)</td>
          </tr>
          <tr>
            <td align="right">0x19</td>
            <td align="left">FETCH_ERROR (<xref target="message-fetch-error"/>)</td>
          </tr>
          <tr>
            <td align="right">0x17</td>
            <td align="left">FETCH_CANCEL (<xref target="message-fetch-cancel"/>)</td>
          </tr>
          <tr>
            <td align="right">0xD</td>
            <td align="left">TRACK_STATUS_REQUEST (<xref target="message-track-status-req"/>)</td>
          </tr>
          <tr>
            <td align="right">0xE</td>
            <td align="left">TRACK_STATUS (<xref target="message-track-status"/>)</td>
          </tr>
          <tr>
            <td align="right">0x6</td>
            <td align="left">ANNOUNCE  (<xref target="message-announce"/>)</td>
          </tr>
          <tr>
            <td align="right">0x7</td>
            <td align="left">ANNOUNCE_OK (<xref target="message-announce-ok"/>)</td>
          </tr>
          <tr>
            <td align="right">0x8</td>
            <td align="left">ANNOUNCE_ERROR (<xref target="message-announce-error"/>)</td>
          </tr>
          <tr>
            <td align="right">0x9</td>
            <td align="left">UNANNOUNCE  (<xref target="message-unannounce"/>)</td>
          </tr>
          <tr>
            <td align="right">0xC</td>
            <td align="left">ANNOUNCE_CANCEL (<xref target="message-announce-cancel"/>)</td>
          </tr>
          <tr>
            <td align="right">0x11</td>
            <td align="left">SUBSCRIBE_ANNOUNCES (<xref target="message-subscribe-ns"/>)</td>
          </tr>
          <tr>
            <td align="right">0x12</td>
            <td align="left">SUBSCRIBE_ANNOUNCES_OK (<xref target="message-sub-ann-ok"/>)</td>
          </tr>
          <tr>
            <td align="right">0x13</td>
            <td align="left">SUBSCRIBE_ANNOUNCES_ERROR (<xref target="message-sub-ann-error"/></td>
          </tr>
          <tr>
            <td align="right">0x14</td>
            <td align="left">UNSUBSCRIBE_ANNOUNCES (<xref target="message-unsub-ann"/>)</td>
          </tr>
        </tbody>
      </table>
      <t>An endpoint that receives an unknown message type <bcp14>MUST</bcp14> close the session.
Control messages have a length to make parsing easier, but no control
messages are intended to be ignored. If the length does not match the
length of the message content, the receiver <bcp14>MUST</bcp14> close the session.</t>
      <section anchor="params">
        <name>Parameters</name>
        <t>Some messages include a Parameters field that encode optional message
elements. They contain a type, length, and value.</t>
        <t>Senders <bcp14>MUST NOT</bcp14> repeat the same parameter type in a message. Receivers
<bcp14>SHOULD</bcp14> check that there are no duplicate parameters and close the session
as a 'Protocol Violation' if found.</t>
        <t>Receivers ignore unrecognized parameters.</t>
        <t>The format of Parameters is as follows:</t>
        <figure anchor="moq-param">
          <name>MOQT Parameter</name>
          <artwork><![CDATA[
Parameter {
  Parameter Type (i),
  Parameter Length (i),
  Parameter Value (..),
}
]]></artwork>
        </figure>
        <t>Parameter Type is an integer that indicates the semantic meaning of the
parameter. Setup message parameters use a namespace that is constant across all
MoQ Transport versions. All other messages use a version-specific namespace. For
example, the integer '1' can refer to different parameters for Setup messages
and for all other message types.</t>
        <t>SETUP message parameter types are defined in <xref target="setup-params"/>. Version-
specific parameter types are defined in <xref target="version-specific-params"/>.</t>
        <t>The Parameter Length field of the String Parameter encodes the length
of the Parameter Value field in bytes.</t>
        <t>Each parameter description will indicate the data type in the Parameter Value
field. If a receiver understands a parameter type, and the parameter length
implied by that type does not match the Parameter Length field, the receiver
<bcp14>MUST</bcp14> terminate the session with error code 'Parameter Length Mismatch'.</t>
        <section anchor="version-specific-params">
          <name>Version Specific Parameters</name>
          <t>Each version-specific parameter definition indicates the message types in which
it can appear. If it appears in some other type of message, it <bcp14>MUST</bcp14> be ignored.
Note that since Setup parameters use a separate namespace, it is impossible for
these parameters to appear in Setup messages.</t>
          <section anchor="authorization-info">
            <name>AUTHORIZATION INFO</name>
            <t>AUTHORIZATION INFO parameter (Parameter Type 0x02) identifies a track's
authorization information in a SUBSCRIBE, SUBSCRIBE_ANNOUNCES, ANNOUNCE
or FETCH message. This parameter is populated for cases where the authorization
is required at the track level. The value is an ASCII string.</t>
          </section>
          <section anchor="delivery-timeout">
            <name>DELIVERY TIMEOUT Parameter</name>
            <t>The DELIVERY TIMEOUT parameter (Parameter Type 0x03) <bcp14>MAY</bcp14> appear in a
SUBSCRIBE, SUBSCRIBE_OK, or a SUBSCRIBE_UDPATE message.  It is the duration in
milliseconds the relay <bcp14>SHOULD</bcp14> continue to attempt forwarding Objects after
they have been received.  The start time for the timeout is based on when the
beginning of the Object is received, and does not depend upon the forwarding
preference. There is no explicit signal that an Object was not sent because
the delivery timeout was exceeded.</t>
            <t>If both the subscriber and publisher specify the parameter, they use the min of the
two values for the subscription.  The publisher <bcp14>SHOULD</bcp14> always specify the value
received from an upstream subscription when there is one, and nothing otherwise.
If an earlier Object arrives later than subsequent Objects, relays can consider
the receipt time as that of the next later Object, with the assumption that the
Object's data was reordered.</t>
            <t>If neither the subscriber or publisher specify DELIVERY TIMEOUT, all Objects
in the track matching the subscription filter are delivered as indicated by
their Group Order and Priority.  If a subscriber exceeds the publisher's
resource limits by failing to consume objects at a sufficient rate, the
publisher <bcp14>MAY</bcp14> terminate the subscription with error 'Too Far Behind'.</t>
            <t>If an object in a subgroup exceeds the delivery timeout, the publisher <bcp14>MUST</bcp14>
reset the underlying transport stream (see <xref target="closing-subgroup-streams"/>).</t>
            <t>When sent by a subscriber, this parameter is intended to be specific to a
subscription, so it <bcp14>SHOULD NOT</bcp14> be forwarded upstream by a relay that intends
to serve multiple subscriptions for the same track.</t>
            <t>Publishers <bcp14>SHOULD</bcp14> consider whether the entire Object is likely to be delivered
before sending any data for that Object, taking into account priorities,
congestion control, and any other relevant information.</t>
          </section>
          <section anchor="max-cache-duration">
            <name>MAX CACHE DURATION Parameter</name>
            <t>MAX_CACHE_DURATION (Parameter Type 0x04): An integer expressing a number of
milliseconds. If present, the relay <bcp14>MUST NOT</bcp14> start forwarding any individual
Object received through this subscription after the specified number of
milliseconds has elapsed since the beginning of the Object was received.  This
means Objects earlier in a multi-object stream will expire earlier than Objects
later in the stream. Once Objects have expired, their state becomes unknown, and
a relay that handles a subscription that includes those Objects re-requests them.</t>
          </section>
        </section>
      </section>
      <section anchor="message-setup">
        <name>CLIENT_SETUP and SERVER_SETUP</name>
        <t>The <tt>CLIENT_SETUP</tt> and <tt>SERVER_SETUP</tt> messages are the first messages exchanged
by the client and the server; they allow the endpoints to establish the mutually
supported version and agree on the initial configuration before any objects are
exchanged. It is a sequence of key-value pairs called Setup parameters; the
semantics and format of which can vary based on whether the client or server is
sending.  To ensure future extensibility of MOQT, endpoints <bcp14>MUST</bcp14> ignore unknown
setup parameters. TODO: describe GREASE for those.</t>
        <t>The wire format of the Setup messages are as follows:</t>
        <figure anchor="moq-transport-setup-format">
          <name>MOQT Setup Messages</name>
          <artwork><![CDATA[
CLIENT_SETUP Message {
  Type (i) = 0x40,
  Length (i),
  Number of Supported Versions (i),
  Supported Version (i) ...,
  Number of Parameters (i) ...,
  Setup Parameters (..) ...,
}

SERVER_SETUP Message {
  Type (i) = 0x41,
  Length (i),
  Selected Version (i),
  Number of Parameters (i) ...,
  Setup Parameters (..) ...,
}
]]></artwork>
        </figure>
        <t>The available versions and Setup parameters are detailed in the next sections.</t>
        <section anchor="setup-versions">
          <name>Versions</name>
          <t>MoQ Transport versions are a 32-bit unsigned integer, encoded as a varint.
This version of the specification is identified by the number 0x00000001.
Versions with the most significant 16 bits of the version number cleared are
reserved for use in future IETF consensus documents.</t>
          <t>The client offers the list of the protocol versions it supports; the
server <bcp14>MUST</bcp14> reply with one of the versions offered by the client. If the
server does not support any of the versions offered by the client, or
the client receives a server version that it did not offer, the
corresponding peer <bcp14>MUST</bcp14> close the session.</t>
          <t>[[RFC editor: please remove the remainder of this section before
publication.]]</t>
          <t>The version number for the final version of this specification (0x00000001), is
reserved for the version of the protocol that is published as an RFC.
Version numbers used to identify IETF drafts are created by adding the draft
number to 0xff000000. For example, draft-ietf-moq-transport-13 would be
identified as 0xff00000D.</t>
        </section>
        <section anchor="setup-params">
          <name>Setup Parameters</name>
          <section anchor="path">
            <name>PATH</name>
            <t>The PATH parameter (Parameter Type 0x01) allows the client to specify the path
of the MoQ URI when using native QUIC (<xref target="QUIC"/>).  It <bcp14>MUST NOT</bcp14> be used by
the server, or when WebTransport is used.  If the peer receives a PATH
parameter from the server, or when WebTransport is used, it <bcp14>MUST</bcp14> close
the connection. It follows the URI formatting rules <xref target="RFC3986"/>.</t>
            <t>When connecting to a server using a URI with the "moqt" scheme, the
client <bcp14>MUST</bcp14> set the PATH parameter to the <tt>path-abempty</tt> portion of the
URI; if <tt>query</tt> is present, the client <bcp14>MUST</bcp14> concatenate <tt>?</tt>, followed by
the <tt>query</tt> portion of the URI to the parameter.</t>
          </section>
          <section anchor="max-subscribe-id">
            <name>MAX_SUBSCRIBE_ID</name>
            <t>The MAX_SUBSCRIBE_ID parameter (Parameter Type 0x02) communicates an initial
value for the Maximum Subscribe ID to the receiving subscriber. The default
value is 0, so if not specified, the peer <bcp14>MUST NOT</bcp14> create subscriptions.</t>
          </section>
        </section>
      </section>
      <section anchor="message-goaway">
        <name>GOAWAY</name>
        <t>An endpoint sends a <tt>GOAWAY</tt> message to inform the peer it intends to close
the session soon.  Servers can use GOAWAY to initiate session migration
(<xref target="session-migration"/>) with an optional URI.</t>
        <t>The GOAWAY message does not impact subscription state. A subscriber
<bcp14>SHOULD</bcp14> individually UNSUBSCRIBE for each existing subscription, while a
publisher <bcp14>MAY</bcp14> reject new requests while in the draining state.</t>
        <t>Upon receiving a GOAWAY, an endpoint <bcp14>SHOULD NOT</bcp14> initiate new requests to
the peer including SUBSCRIBE, FETCH, ANNOUNCE and SUBSCRIBE_ANNOUNCE.</t>
        <t>The endpoint <bcp14>MUST</bcp14> terminate the session with a Protocol Violation
(<xref target="session-termination"/>) if it receives multiple GOAWAY messages.</t>
        <figure anchor="moq-transport-goaway-format">
          <name>MOQT GOAWAY Message</name>
          <artwork><![CDATA[
GOAWAY Message {
  Type (i) = 0x10,
  Length (i),
  New Session URI Length (i),
  New Session URI (..),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>New Session URI: When received by a client, indicates where the client can
connect to continue this session.  The client <bcp14>MUST</bcp14> use this URI for the new
session if provided. If the URI is zero bytes long, the client can reuse the
current URI is reused instead. The new session URI <bcp14>SHOULD</bcp14> use the same scheme
as the current URL to ensure compatibility.  </t>
            <t>
If a server receives a GOAWAY with a non-zero New Session URI Length it <bcp14>MUST</bcp14>
terminate the session with a Protocol Violation.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-max-subscribe-id">
        <name>MAX_SUBSCRIBE_ID</name>
        <t>A publisher sends a MAX_SUBSCRIBE_ID message to increase the number of
subscriptions a subscriber can create within a session.</t>
        <t>The Maximum Subscribe Id <bcp14>MUST</bcp14> only increase within a session, and
receipt of a MAX_SUBSCRIBE_ID message with an equal or smaller Subscribe ID
value is a 'Protocol Violation'.</t>
        <figure anchor="moq-transport-max-subscribe-id">
          <name>MOQT MAX_SUBSCRIBE_ID Message</name>
          <artwork><![CDATA[
MAX_SUBSCRIBE_ID
{
  Type (i) = 0x15,
  Length (i),
  Subscribe ID (i),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: The new Maximum Subscribe ID for the session. If a Subscribe ID
<xref target="message-subscribe-req"/> equal or larger than this is received by the publisher
that sent the MAX_SUBSCRIBE_ID, the publisher <bcp14>MUST</bcp14> close the session with an
error of 'Too Many Subscribes'.</t>
          </li>
        </ul>
        <t>MAX_SUBSCRIBE_ID is similar to MAX_STREAMS in (<xref section="4.6" sectionFormat="comma" target="RFC9000"/>),
and similar considerations apply when deciding how often to send MAX_SUBSCRIBE_ID.
For example, implementations might choose to increase MAX_SUBSCRIBE_ID as
subscriptions close to keep the number of subscriptions available to subscribers
roughly consistent.</t>
      </section>
      <section anchor="message-subscribes-blocked">
        <name>SUBSCRIBES_BLOCKED</name>
        <t>The SUBSCRIBES_BLOCKED message is sent when a subscriber would like to begin
a new subscription, but cannot because the Subscribe ID would exceed the
Maximum Subscribe ID value sent by the peer.  The subscriber <bcp14>SHOULD</bcp14> send only
one SUBSCRIBES_BLOCKED for a given Maximum Subscribe ID.</t>
        <t>A publisher <bcp14>MAY</bcp14> send a MAX_SUBSCRIBE_ID upon receipt of SUBSCRIBES_BLOCKED,
but it <bcp14>MUST NOT</bcp14> rely on SUBSCRIBES_BLOCKED to trigger sending a
MAX_SUBSCRIBE_ID, because sending SUBSCRIBES_BLOCKED is not required.</t>
        <figure anchor="moq-transport-subscribes-blocked">
          <name>MOQT SUBSCRIBES_BLOCKED Message</name>
          <artwork><![CDATA[
SUBSCRIBES_BLOCKED
{
  Type (i) = 0x1A,
  Length (i),
  Maximum Subscribe ID (i),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Maximum Subscribe ID: The Maximum Subscribe ID for the session on which the subscriber
is blocked. More on Subscribe ID in <xref target="message-subscribe-req"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-subscribe-req">
        <name>SUBSCRIBE</name>
        <t>A subscription causes the publisher to send newly published objects for a track.
A subscriber <bcp14>MUST NOT</bcp14> make multiple active subscriptions for a track within a
single session and publishers <bcp14>SHOULD</bcp14> treat this as a protocol violation.</t>
        <t><strong>Filter Types</strong></t>
        <t>The subscriber specifies a filter on the subscription to allow
the publisher to identify which objects need to be delivered.</t>
        <t>There are 3 types of filters:</t>
        <t>Latest Object (0x2): Specifies an open-ended subscription beginning from
the current object of the current group.  If no content has been delivered yet,
the subscription starts with the first published or received group.</t>
        <t>AbsoluteStart (0x3):  Specifies an open-ended subscription beginning
from the object identified in the StartGroup and StartObject fields. If the
StartGroup is prior to the current group, the subscription starts at the
beginning of the current object like the 'Latest Object' filter.</t>
        <t>AbsoluteRange (0x4):  Specifies a closed subscription starting at StartObject
in StartGroup and ending at the largest object in EndGroup.  The start and
end of the range are inclusive.  EndGroup <bcp14>MUST</bcp14> specify the same or a later
group than StartGroup. If the StartGroup is prior to the current group, the
subscription starts at the beginning of the current object like the 'Latest
Object' filter.</t>
        <t>A filter type other than the above <bcp14>MUST</bcp14> be treated as error.</t>
        <t>If a subscriber wants to subscribe to Objects both before and after
the Latest Object, it can send a SUBSCRIBE for the Latest Object
followed by a FETCH. Depending upon the application, one might want to send
both messages at the same time or wait for the first to return before sending
the second.</t>
        <t>The format of SUBSCRIBE is as follows:</t>
        <figure anchor="moq-transport-subscribe-format">
          <name>MOQT SUBSCRIBE Message</name>
          <artwork><![CDATA[
SUBSCRIBE Message {
  Type (i) = 0x3,
  Length (i),
  Subscribe ID (i),
  Track Alias (i),
  Track Namespace (tuple),
  Track Name Length (i),
  Track Name (..),
  Subscriber Priority (8),
  Group Order (8),
  Filter Type (i),
  [StartGroup (i),
   StartObject (i)],
  [EndGroup (i)],
  Number of Parameters (i),
  Subscribe Parameters (..) ...
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: The subscriber specified identifier used to manage a
subscription. <tt>Subscribe ID</tt> is a variable length integer that <bcp14>MUST</bcp14> be
unique and monotonically increasing within a session and <bcp14>MUST</bcp14> be less
than the session's Maximum Subscribe ID.</t>
          </li>
          <li>
            <t>Track Alias: A session specific identifier for the track.
Messages that reference a track, such as OBJECT (<xref target="message-object"/>),
reference this Track Alias instead of the Track Name and Track Namespace to
reduce overhead. If the Track Alias is already being used for a different
track, the publisher <bcp14>MUST</bcp14> close the session with a Duplicate Track Alias
error (<xref target="session-termination"/>).</t>
          </li>
          <li>
            <t>Track Namespace: Identifies the namespace of the track as defined in
(<xref target="track-name"/>).</t>
          </li>
          <li>
            <t>Track Name: Identifies the track name as defined in (<xref target="track-name"/>).</t>
          </li>
          <li>
            <t>Subscriber Priority: Specifies the priority of a subscription relative to
other subscriptions in the same session. Lower numbers get higher priority.
See <xref target="priorities"/>.</t>
          </li>
          <li>
            <t>Group Order: Allows the subscriber to request Objects be delivered in
Ascending (0x1) or Descending (0x2) order by group. See <xref target="priorities"/>.
A value of 0x0 indicates the original publisher's Group Order <bcp14>SHOULD</bcp14> be
used. Values larger than 0x2 are a protocol error.</t>
          </li>
          <li>
            <t>Filter Type: Identifies the type of filter, which also indicates whether
the StartGroup/StartObject and EndGroup/EndObject fields will be present.</t>
          </li>
          <li>
            <t>StartGroup: The start Group ID. Only present for "AbsoluteStart" and
"AbsoluteRange" filter types.</t>
          </li>
          <li>
            <t>StartObject: The start Object ID. Only present for "AbsoluteStart" and
"AbsoluteRange" filter types.</t>
          </li>
          <li>
            <t>EndGroup: The end Group ID, inclusive. Only present for the "AbsoluteRange"
filter type.</t>
          </li>
          <li>
            <t>Subscribe Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
        <t>On successful subscription, the publisher <bcp14>MUST</bcp14> reply with a SUBSCRIBE_OK,
allowing the subscriber to determine the start group/object when not explicitly
specified and the publisher <bcp14>SHOULD</bcp14> start delivering objects.</t>
        <t>If a publisher cannot satisfy the requested start or end or if the end has
already been published it <bcp14>SHOULD</bcp14> send a SUBSCRIBE_ERROR with code 'Invalid Range'.
A publisher <bcp14>MUST NOT</bcp14> send objects from outside the requested start and end.</t>
      </section>
      <section anchor="message-subscribe-ok">
        <name>SUBSCRIBE_OK</name>
        <t>A publisher sends a SUBSCRIBE_OK control message for successful
subscriptions.</t>
        <figure anchor="moq-transport-subscribe-ok">
          <name>MOQT SUBSCRIBE_OK Message</name>
          <artwork><![CDATA[
SUBSCRIBE_OK
{
  Type (i) = 0x4,
  Length (i),
  Subscribe ID (i),
  Expires (i),
  Group Order (8),
  ContentExists (8),
  [Largest Group ID (i)],
  [Largest Object ID (i)],
  Number of Parameters (i),
  Subscribe Parameters (..) ...
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: Subscription Identifier as defined in <xref target="message-subscribe-req"/>.</t>
          </li>
          <li>
            <t>Expires: Time in milliseconds after which the subscription is no
longer valid. A value of 0 indicates that the subscription does not expire
or expires at an unknown time.  Expires is advisory and a subscription can
end prior to the expiry time or last longer.</t>
          </li>
          <li>
            <t>Group Order: Indicates the subscription will be delivered in
Ascending (0x1) or Descending (0x2) order by group. See <xref target="priorities"/>.
Values of 0x0 and those larger than 0x2 are a protocol error.</t>
          </li>
          <li>
            <t>ContentExists: 1 if an object has been published on this track, 0 if not.
If 0, then the Largest Group ID and Largest Object ID fields will not be
present. Any other value is a protocol error and <bcp14>MUST</bcp14> terminate the
session with a Protocol Violation (<xref target="session-termination"/>).</t>
          </li>
          <li>
            <t>Largest Group ID: The largest Group ID available for this track. This field
is only present if ContentExists has a value of 1.</t>
          </li>
          <li>
            <t>Largest Object ID: The largest Object ID available within the largest Group ID
for this track. This field is only present if ContentExists has a value of 1.</t>
          </li>
          <li>
            <t>Subscribe Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-subscribe-error">
        <name>SUBSCRIBE_ERROR</name>
        <t>A publisher sends a SUBSCRIBE_ERROR control message in response to a
failed SUBSCRIBE.</t>
        <figure anchor="moq-transport-subscribe-error">
          <name>MOQT SUBSCRIBE_ERROR Message</name>
          <artwork><![CDATA[
SUBSCRIBE_ERROR
{
  Type (i) = 0x5,
  Length (i),
  Subscribe ID (i),
  Error Code (i),
  Reason Phrase Length (i),
  Reason Phrase (..),
  Track Alias (i),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: Subscription Identifier as defined in <xref target="message-subscribe-req"/>.</t>
          </li>
          <li>
            <t>Error Code: Identifies an integer error code for subscription failure.</t>
          </li>
          <li>
            <t>Reason Phrase: Provides the reason for subscription error.</t>
          </li>
          <li>
            <t>Track Alias: When Error Code is 'Retry Track Alias', the subscriber <bcp14>SHOULD</bcp14> re-issue the
SUBSCRIBE with this Track Alias instead. If this Track Alias is already in use,
the subscriber <bcp14>MUST</bcp14> close the connection with a Duplicate Track Alias error
(<xref target="session-termination"/>).</t>
          </li>
        </ul>
        <t>The application <bcp14>SHOULD</bcp14> use a relevant error code in SUBSCRIBE_ERROR,
as defined below:</t>
        <table>
          <thead>
            <tr>
              <th align="right">Code</th>
              <th align="left">Reason</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x0</td>
              <td align="left">Internal Error</td>
            </tr>
            <tr>
              <td align="right">0x1</td>
              <td align="left">Unauthorized</td>
            </tr>
            <tr>
              <td align="right">0x2</td>
              <td align="left">Timeout</td>
            </tr>
            <tr>
              <td align="right">0x3</td>
              <td align="left">Not Supported</td>
            </tr>
            <tr>
              <td align="right">0x4</td>
              <td align="left">Track Does Not Exist</td>
            </tr>
            <tr>
              <td align="right">0x5</td>
              <td align="left">Invalid Range</td>
            </tr>
            <tr>
              <td align="right">0x6</td>
              <td align="left">Retry Track Alias</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="message-subscribe-update">
        <name>SUBSCRIBE_UPDATE</name>
        <t>A subscriber issues a SUBSCRIBE_UPDATE to a publisher to request a change to
an existing subscription. Subscriptions can only become more narrow, not wider,
because an attempt to widen a subscription could fail. If Objects before the
start or after the end of the current subscription are needed, a fetch might
be able to retrieve objects before the start. The start Object <bcp14>MUST NOT</bcp14>
decrease and when it increases, there is no guarantee that a publisher will
not have already sent Objects before the new start Object.  The end Group
<bcp14>MUST NOT</bcp14> increase and when it decreases, there is no guarantee that a publisher
will not have already sent Objects after the new end Object. A publisher <bcp14>SHOULD</bcp14>
close the Session as a 'Protocol Violation' if the SUBSCRIBE_UPDATE violates
either rule or if the subscriber specifies a Subscribe ID that has not existed
within the Session.</t>
        <t>There is no control message in response to a SUBSCRIBE_UPDATE, because it is
expected that it will always succeed and the worst outcome is that it is not
processed promptly and some extra objects from the existing subscription are
delivered.</t>
        <t>Unlike a new subscription, SUBSCRIBE_UPDATE can not cause an Object to be
delivered multiple times.  Like SUBSCRIBE, EndGroup <bcp14>MUST</bcp14> specify the
same or a later object than StartGroup and StartObject.</t>
        <t>The format of SUBSCRIBE_UPDATE is as follows:</t>
        <figure anchor="moq-transport-subscribe-update-format">
          <name>MOQT SUBSCRIBE_UPDATE Message</name>
          <artwork><![CDATA[
SUBSCRIBE_UPDATE Message {
  Type (i) = 0x2,
  Length (i),
  Subscribe ID (i),
  StartGroup (i),
  StartObject (i),
  EndGroup (i),
  Subscriber Priority (8),
  Number of Parameters (i),
  Subscribe Parameters (..) ...
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: The subscription identifier that is unique within the session.
This <bcp14>MUST</bcp14> match an existing Subscribe ID.</t>
          </li>
          <li>
            <t>StartGroup: The start Group ID.</t>
          </li>
          <li>
            <t>StartObject: The start Object ID.</t>
          </li>
          <li>
            <t>EndGroup: The end Group ID, plus 1. A value of 0 means the subscription is
open-ended.</t>
          </li>
          <li>
            <t>Subscriber Priority: Specifies the priority of a subscription relative to
other subscriptions in the same session. Lower numbers get higher priority.
See <xref target="priorities"/>.</t>
          </li>
          <li>
            <t>Subscribe Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-unsubscribe">
        <name>UNSUBSCRIBE</name>
        <t>A subscriber issues a <tt>UNSUBSCRIBE</tt> message to a publisher indicating it is no
longer interested in receiving media for the specified track and requesting that
the publisher stop sending Objects as soon as possible.</t>
        <t>The format of <tt>UNSUBSCRIBE</tt> is as follows:</t>
        <figure anchor="moq-transport-unsubscribe-format">
          <name>MOQT UNSUBSCRIBE Message</name>
          <artwork><![CDATA[
UNSUBSCRIBE Message {
  Type (i) = 0xA,
  Length (i),
  Subscribe ID (i)
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: Subscription Identifier as defined in <xref target="message-subscribe-req"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-subscribe-done">
        <name>SUBSCRIBE_DONE</name>
        <t>A publisher sends a <tt>SUBSCRIBE_DONE</tt> message to indicate it is done publishing
Objects for that subscription.  The Status Code indicates why the subscription
ended, and whether it was an error. Because SUBSCRIBE_DONE is sent on the
control stream, it is likely to arrive at the receiver before late-arriving
objects, and often even late-opening streams. However, the receiver uses it
as an indication that it should receive any late-opening streams in a relatively
short time.</t>
        <t>Note that some objects in the subscribed track might never be delivered,
because a stream was reset, or never opened in the first place, due to the
delivery timeout.</t>
        <t>A sender <bcp14>MUST NOT</bcp14> send SUBSCRIBE_DONE until it has closed all streams it will
ever open, and has no further datagrams to send, for a subscription. After
sending SUBSCRIBE_DONE, the sender can immediately destroy subscription state,
although stream state can persist until delivery completes. The sender might
persist subscription state to enforce the delivery timeout by resetting streams
on which it has already sent FIN, only deleting it when all such streams have
received ACK of the FIN.</t>
        <t>A sender <bcp14>MUST NOT</bcp14> destroy subscription state until it sends SUBSCRIBE_DONE,
though it can choose to stop sending objects (and thus send SUBSCRIBE_DONE) for
any reason.</t>
        <t>A subscriber that receives SUBSCRIBE_DONE <bcp14>SHOULD</bcp14> set a timer of at least its
delivery timeout in case some objects are still inbound due to prioritization
or packet loss. The subscriber <bcp14>MAY</bcp14> dispense with a timer if it sent UNSUBSCRIBE
or is otherwise no longer interested in objects from the track. Once the timer
has expired, the receiver destroys subscription state once all open streams for
the subscription have closed. A subscriber <bcp14>MAY</bcp14> discard subscription state
earlier, at the cost of potentially not delivering some late objects to the
application. The subscriber <bcp14>SHOULD</bcp14> send STOP_SENDING on all streams related to
the subscription when it deletes subscription state.</t>
        <t>The format of <tt>SUBSCRIBE_DONE</tt> is as follows:</t>
        <figure anchor="moq-transport-subscribe-fin-format">
          <name>MOQT SUBSCRIBE_DONE Message</name>
          <artwork><![CDATA[
SUBSCRIBE_DONE Message {
  Type (i) = 0xB,
  Length (i),
  Subscribe ID (i),
  Status Code (i),
  Stream Count (i),
  Reason Phrase Length (i),
  Reason Phrase (..),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: Subscription identifier as defined in <xref target="message-subscribe-req"/>.</t>
          </li>
          <li>
            <t>Status Code: An integer status code indicating why the subscription ended.</t>
          </li>
          <li>
            <t>Stream Count: An integer indicating the number of data streams the publisher
opened for this subscription.  This helps the subscriber know if it has received
all of the data published in this subscription by comparing the number of
streams received.  The subscriber can immediately remove all subscription state
once the same number of streams have been processed.  If the track had
Forwarding Preference = Datagram, the publisher <bcp14>MUST</bcp14> set Stream Count to 0.  If
the publisher is unable to set Stream Count to the exact number of streams
opened for the subscription, it <bcp14>MUST</bcp14> set Stream Count to 2^62 - 1. Subscribers
<bcp14>SHOULD</bcp14> use a timeout or other mechanism to remove subscription state in case
the publisher set an incorrect value, reset a stream before the SUBGROUP_HEADER,
or set the maximum value.  If a subscriber receives more streams for a
subscription than specified in Stream Count, it <bcp14>MAY</bcp14> close the session with a
Protocol Violation.</t>
          </li>
          <li>
            <t>Reason Phrase: Provides the reason for subscription error.</t>
          </li>
        </ul>
        <t>The application <bcp14>SHOULD</bcp14> use a relevant status code in
SUBSCRIBE_DONE, as defined below:</t>
        <table>
          <thead>
            <tr>
              <th align="right">Code</th>
              <th align="left">Reason</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x0</td>
              <td align="left">Internal Error</td>
            </tr>
            <tr>
              <td align="right">0x1</td>
              <td align="left">Unauthorized</td>
            </tr>
            <tr>
              <td align="right">0x2</td>
              <td align="left">Track Ended</td>
            </tr>
            <tr>
              <td align="right">0x3</td>
              <td align="left">Subscription Ended</td>
            </tr>
            <tr>
              <td align="right">0x4</td>
              <td align="left">Going Away</td>
            </tr>
            <tr>
              <td align="right">0x5</td>
              <td align="left">Expired</td>
            </tr>
            <tr>
              <td align="right">0x6</td>
              <td align="left">Too Far Behind</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="message-fetch">
        <name>FETCH</name>
        <t>A subscriber issues a FETCH to a publisher to request a range of already published
objects within a track. The publisher responding to a FETCH is responsible for retrieving
all available Objects. If there are gaps between Objects, the publisher omits them from the
fetch response. All omitted objects have status Object Does Not Exist.</t>
        <t><strong>Fetch Types</strong></t>
        <t>There are two types of Fetch messages:</t>
        <t>Standalone Fetch (0x1) : A Fetch of Objects performed independently of any Subscribe.</t>
        <t>Joining Fetch (0x2) : A Fetch joined together with a Subscribe by specifying
the Subscribe ID of an active subscription. A publisher receiving a
Joining Fetch uses properties of the associated Subscribe to determine the
Track Namespace, Track, StartGroup, StartObject, EndGroup, and EndObject such that
it is contiguous with the associated Subscribe. The Joining Fetch begins the
Preceding Group Offset prior to the associated subscription.</t>
        <t>A Subscriber can use a Joining Fetch to, for example, fill a playback buffer with a
certain number of groups prior to the live edge of a track.</t>
        <t>A Joining Fetch is only permitted when the associated Subscribe has the Filter
Type Latest Object.</t>
        <t>A Fetch Type other than 0x1 or 0x2 <bcp14>MUST</bcp14> be treated as an error.</t>
        <t>A publisher responds to a FETCH request with either a FETCH_OK or a FETCH_ERROR
message.  If it responds with FETCH_OK, the publisher creates a new unidirectional
stream that is used to send the Objects.  A relay <bcp14>MAY</bcp14> start sending objects immediately
in response to a FETCH, even if sending the FETCH_OK takes longer because it requires
going upstream to populate the latest object.</t>
        <t>The Object Forwarding Preference does not apply to fetches.</t>
        <t>Fetch specifies an inclusive range of Objects starting at StartObject
in StartGroup and ending at EndObject in EndGroup. EndGroup and EndObject <bcp14>MUST</bcp14>
specify the same or a later object than StartGroup and StartObject.</t>
        <t>The format of FETCH is as follows:</t>
        <figure anchor="moq-transport-fetch-format">
          <name>MOQT FETCH Message</name>
          <artwork><![CDATA[
FETCH Message {
  Type (i) = 0x16,
  Length (i),
  Subscribe ID (i),
  Subscriber Priority (8),
  Group Order (8),
  Fetch Type (i),
  [Track Namespace (tuple),
   Track Name Length (i),
   Track Name (..),
   StartGroup (i),
   StartObject (i),
   EndGroup (i),
   EndObject (i),]
  [Joining Subscribe ID (i),
   Preceding Group Offset (i),]
  Number of Parameters (i),
  Parameters (..) ...
}
]]></artwork>
        </figure>
        <t>Fields common to all Fetch Types:</t>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: The Subscribe ID identifies a given fetch request. Subscribe ID
is a variable length integer that <bcp14>MUST</bcp14> be unique and monotonically increasing
within a session.</t>
          </li>
          <li>
            <t>Subscriber Priority: Specifies the priority of a fetch request relative to
other subscriptions or fetches in the same session. Lower numbers get higher
priority. See <xref target="priorities"/>.</t>
          </li>
          <li>
            <t>Group Order: Allows the subscriber to request Objects be delivered in
Ascending (0x1) or Descending (0x2) order by group. See <xref target="priorities"/>.
A value of 0x0 indicates the original publisher's Group Order <bcp14>SHOULD</bcp14> be
used. Values larger than 0x2 are a protocol error.</t>
          </li>
          <li>
            <t>Fetch Type: Identifies the type of Fetch, whether joining or standalone.</t>
          </li>
          <li>
            <t>Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
        <t>Fields present only for Standalone Fetch (0x1):</t>
        <ul spacing="normal">
          <li>
            <t>Track Namespace: Identifies the namespace of the track as defined in
(<xref target="track-name"/>).</t>
          </li>
          <li>
            <t>Track Name: Identifies the track name as defined in (<xref target="track-name"/>).</t>
          </li>
          <li>
            <t>StartGroup: The start Group ID.</t>
          </li>
          <li>
            <t>StartObject: The start Object ID.</t>
          </li>
          <li>
            <t>EndGroup: The end Group ID.</t>
          </li>
          <li>
            <t>EndObject: The end Object ID, plus 1. A value of 0 means the entire group is
requested.</t>
          </li>
        </ul>
        <t>Fields present only for Joining Fetch (0x2):</t>
        <ul spacing="normal">
          <li>
            <t>Joining Subscribe ID: The Subscribe ID of the existing subscription to be
joined. If a publisher receives a Joining Fetch with a Subscribe ID that does
not correspond to an existing Subscribe, it <bcp14>MUST</bcp14> respond with a Fetch Error.</t>
          </li>
          <li>
            <t>Preceding Group Offset: The group offset for the Fetch prior and relative
to the Current Group of the corresponding Subscribe. A value of 0 indicates
the Fetch starts at the beginning of the Current Group.</t>
          </li>
        </ul>
        <t>Objects that are not yet published will not be retrieved by a FETCH.
The latest available Object is indicated in the FETCH_OK, and is the last
Object a fetch will return if the EndGroup and EndObject have not yet been
published.</t>
        <t>A publisher <bcp14>MUST</bcp14> send fetched groups in the determined group order, either
ascending or descending. Within each group, objects are sent in Object ID order;
subgroup ID is not used for ordering.</t>
        <t>If StartGroup/StartObject is greater than the latest published Object group,
the publisher <bcp14>MUST</bcp14> return FETCH_ERROR with error code 'No Objects'.</t>
        <section anchor="calculating-the-range-of-a-joining-fetch">
          <name>Calculating the Range of a Joining Fetch</name>
          <t>A publisher that receives a Fetch of type Type 0x2 treats it
as a Fetch with a range dynamically determined by the Preceding Group Offset
and field values derived from the corresponding subscription.</t>
          <t>The Largest Group ID and Largest Object ID values from the corresponding
subscription are used to calculate the end of a Joining Fetch so the Objects
retrieved by the FETCH and SUBSCRIBE are contiguous and non-overlapping.
If no Objects have been published for the track, and the SUBSCRIBE_OK has a
ContentExists value of 0, the publisher responds with a FETCH_ERROR with
error code 'No Objects'.</t>
          <t>The publisher receiving a Joining Fetch computes the range as follows:</t>
          <ul spacing="normal">
            <li>
              <t>Fetch StartGroup: Subscribe Largest Group - Preceding Group Offset</t>
            </li>
            <li>
              <t>Fetch StartObject: 0</t>
            </li>
            <li>
              <t>Fetch EndGroup: Subscribe Largest Group</t>
            </li>
            <li>
              <t>Fetch EndObject: Subscribe Largest Object</t>
            </li>
          </ul>
          <t>A Fetch EndObject of 0 requests the entire group, but Fetch will not
retrieve Objects that have not yet been published, so 1 is subtracted from
the Fetch EndGroup if Fetch EndObject is 0.</t>
        </section>
      </section>
      <section anchor="message-fetch-ok">
        <name>FETCH_OK</name>
        <t>A publisher sends a FETCH_OK control message in response to successful fetches.
A publisher <bcp14>MAY</bcp14> send Objects in response to a FETCH before the FETCH_OK message is sent,
but the FETCH_OK <bcp14>MUST NOT</bcp14> be sent until the latest group and object are known.</t>
        <figure anchor="moq-transport-fetch-ok">
          <name>MOQT FETCH_OK Message</name>
          <artwork><![CDATA[
FETCH_OK
{
  Type (i) = 0x18,
  Length (i),
  Subscribe ID (i),
  Group Order (8),
  End Of Track (8),
  Largest Group ID (i),
  Largest Object ID (i),
  Number of Parameters (i),
  Subscribe Parameters (..) ...
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: Fetch Identifier as defined in <xref target="message-fetch"/>.</t>
          </li>
          <li>
            <t>Group Order: Indicates the fetch will be delivered in
Ascending (0x1) or Descending (0x2) order by group. See <xref target="priorities"/>.
Values of 0x0 and those larger than 0x2 are a protocol error.</t>
          </li>
          <li>
            <t>End Of Track: 1 if all objects have been published on this track, so
the Largest Group ID and Object Id indicate the last Object in the track,
0 if not.</t>
          </li>
          <li>
            <t>Largest Group ID: The largest Group ID available for this track.</t>
          </li>
          <li>
            <t>Largest Object ID: The largest Object ID available within the largest Group ID
for this track.</t>
          </li>
          <li>
            <t>Subscribe Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-fetch-error">
        <name>FETCH_ERROR</name>
        <t>A publisher sends a FETCH_ERROR control message in response to a
failed FETCH.</t>
        <figure anchor="moq-transport-fetch-error">
          <name>MOQT FETCH_ERROR Message</name>
          <artwork><![CDATA[
FETCH_ERROR
{
  Type (i) = 0x19,
  Length (i),
  Subscribe ID (i),
  Error Code (i),
  Reason Phrase Length (i),
  Reason Phrase (..),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: Subscription Identifier as defined in <xref target="message-subscribe-req"/>.</t>
          </li>
          <li>
            <t>Error Code: Identifies an integer error code for fetch failure.</t>
          </li>
          <li>
            <t>Reason Phrase: Provides the reason for fetch error.</t>
          </li>
        </ul>
        <t>The application <bcp14>SHOULD</bcp14> use a relevant error code in FETCH_ERROR,
as defined below:</t>
        <table>
          <thead>
            <tr>
              <th align="right">Code</th>
              <th align="left">Reason</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x0</td>
              <td align="left">Internal Error</td>
            </tr>
            <tr>
              <td align="right">0x1</td>
              <td align="left">Unauthorized</td>
            </tr>
            <tr>
              <td align="right">0x2</td>
              <td align="left">Timeout</td>
            </tr>
            <tr>
              <td align="right">0x3</td>
              <td align="left">Not Supported</td>
            </tr>
            <tr>
              <td align="right">0x4</td>
              <td align="left">Track Does Not Exist</td>
            </tr>
            <tr>
              <td align="right">0x5</td>
              <td align="left">Invalid Range</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="message-fetch-cancel">
        <name>FETCH_CANCEL</name>
        <t>A subscriber issues a <tt>FETCH_CANCEL</tt> message to a publisher indicating it is no
longer interested in receiving Objects for the fetch specified by 'Subscribe ID'.
The publisher <bcp14>SHOULD</bcp14> close the unidirectional stream as soon as possible.</t>
        <t>The format of <tt>FETCH_CANCEL</tt> is as follows:</t>
        <figure anchor="moq-transport-fetch-cancel">
          <name>MOQT FETCH_CANCEL Message</name>
          <artwork><![CDATA[
FETCH_CANCEL Message {
  Type (i) = 0x17,
  Length (i),
  Subscribe ID (i)
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: Subscription Identifier as defined in <xref target="message-fetch"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-track-status-req">
        <name>TRACK_STATUS_REQUEST</name>
        <t>A potential subscriber sends a 'TRACK_STATUS_REQUEST' message on the control
stream to obtain information about the current status of a given track.</t>
        <t>A TRACK_STATUS message <bcp14>MUST</bcp14> be sent in response to each TRACK_STATUS_REQUEST.</t>
        <figure anchor="moq-track-status-request-format">
          <name>MOQT TRACK_STATUS_REQUEST Message</name>
          <artwork><![CDATA[
TRACK_STATUS_REQUEST Message {
  Type (i) = 0xD,
  Length (i),
  Track Namespace (tuple),
  Track Name Length (i),
  Track Name (..),
}
]]></artwork>
        </figure>
      </section>
      <section anchor="message-track-status">
        <name>TRACK_STATUS</name>
        <t>A publisher sends a 'TRACK_STATUS' message on the control stream in response
to a TRACK_STATUS_REQUEST message.</t>
        <figure anchor="moq-track-status-format">
          <name>MOQT TRACK_STATUS Message</name>
          <artwork><![CDATA[
TRACK_STATUS Message {
  Type (i) = 0xE,
  Length (i),
  Track Namespace (tuple),
  Track Name Length(i),
  Track Name (..),
  Status Code (i),
  Last Group ID (i),
  Last Object ID (i),
}
]]></artwork>
        </figure>
        <t>The 'Status Code' field provides additional information about the status of the
track. It <bcp14>MUST</bcp14> hold one of the following values. Any other value is a malformed
message.</t>
        <t>0x00: The track is in progress, and subsequent fields contain the highest group
and object ID for that track.</t>
        <t>0x01: The track does not exist. Subsequent fields <bcp14>MUST</bcp14> be zero, and any other
value is a malformed message.</t>
        <t>0x02: The track has not yet begun. Subsequent fields <bcp14>MUST</bcp14> be zero. Any other
value is a malformed message.</t>
        <t>0x03: The track has finished, so there is no "live edge." Subsequent fields
contain the highest Group and object ID known.</t>
        <t>0x04: The publisher is a relay that cannot obtain the current track status from
upstream. Subsequent fields contain the largest group and object ID known.</t>
        <t>Any other value in the Status Code field is a malformed message.</t>
        <t>When a relay is subscribed to a track, it can simply return the highest group
and object ID it has observed, whether or not that object was cached or
completely delivered. If not subscribed, a relay <bcp14>SHOULD</bcp14> send a
TRACK_STATUS_REQUEST upstream to obtain updated information.</t>
        <t>Alternatively, the relay <bcp14>MAY</bcp14> subscribe to the track to obtain the same
information.</t>
        <t>If a relay cannot or will not do either, it should return its best available
information with status code 0x04.</t>
        <t>The receiver of multiple TRACK_STATUS messages for a track uses the information
from the latest arriving message, as they are delivered in order on a single
stream.</t>
      </section>
      <section anchor="message-announce">
        <name>ANNOUNCE</name>
        <t>The publisher sends the ANNOUNCE control message to advertise where the
receiver can route SUBSCRIBEs for tracks within the announced
Track Namespace. The receiver verifies the publisher is authorized to
publish tracks under this namespace.</t>
        <figure anchor="moq-transport-announce-format">
          <name>MOQT ANNOUNCE Message</name>
          <artwork><![CDATA[
ANNOUNCE Message {
  Type (i) = 0x6,
  Length (i),
  Track Namespace (tuple),
  Number of Parameters (i),
  Parameters (..) ...,
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Track Namespace: Identifies a track's namespace as defined in
(<xref target="track-name"/>)</t>
          </li>
          <li>
            <t>Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-announce-ok">
        <name>ANNOUNCE_OK</name>
        <t>The subscriber sends an ANNOUNCE_OK control message to acknowledge the
successful authorization and acceptance of an ANNOUNCE message.</t>
        <figure anchor="moq-transport-announce-ok">
          <name>MOQT ANNOUNCE_OK Message</name>
          <artwork><![CDATA[
ANNOUNCE_OK Message
{
  Type (i) = 0x7,
  Length (i),
  Track Namespace (tuple),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Track Namespace: Identifies the track namespace in the ANNOUNCE
message for which this response is provided.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-announce-error">
        <name>ANNOUNCE_ERROR</name>
        <t>The subscriber sends an ANNOUNCE_ERROR control message for tracks that
failed authorization.</t>
        <figure anchor="moq-transport-announce-error">
          <name>MOQT ANNOUNCE_ERROR Message</name>
          <artwork><![CDATA[
ANNOUNCE_ERROR Message
{
  Type (i) = 0x8,
  Length (i),
  Track Namespace (tuple),
  Error Code (i),
  Reason Phrase Length (i),
  Reason Phrase (..),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Track Namespace: Identifies the track namespace in the ANNOUNCE
message for which this response is provided.</t>
          </li>
          <li>
            <t>Error Code: Identifies an integer error code for announcement failure.</t>
          </li>
          <li>
            <t>Reason Phrase: Provides the reason for announcement error.</t>
          </li>
        </ul>
        <t>The application <bcp14>SHOULD</bcp14> use a relevant error code in ANNOUNCE_ERROR, as defined
below:</t>
        <table>
          <thead>
            <tr>
              <th align="right">Code</th>
              <th align="left">Reason</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x0</td>
              <td align="left">Internal Error</td>
            </tr>
            <tr>
              <td align="right">0x1</td>
              <td align="left">Unauthorized</td>
            </tr>
            <tr>
              <td align="right">0x2</td>
              <td align="left">Timeout</td>
            </tr>
            <tr>
              <td align="right">0x3</td>
              <td align="left">Not Supported</td>
            </tr>
            <tr>
              <td align="right">0x4</td>
              <td align="left">Uninterested</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="message-unannounce">
        <name>UNANNOUNCE</name>
        <t>The publisher sends the <tt>UNANNOUNCE</tt> control message to indicate
its intent to stop serving new subscriptions for tracks
within the provided Track Namespace.</t>
        <figure anchor="moq-transport-unannounce-format">
          <name>MOQT UNANNOUNCE Message</name>
          <artwork><![CDATA[
UNANNOUNCE Message {
  Type (i) = 0x9,
  Length (i),
  Track Namespace (tuple),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Track Namespace: Identifies a track's namespace as defined in
(<xref target="track-name"/>).</t>
          </li>
        </ul>
      </section>
      <section anchor="message-announce-cancel">
        <name>ANNOUNCE_CANCEL</name>
        <t>The subscriber sends an <tt>ANNOUNCE_CANCEL</tt> control message to
indicate it will stop sending new subscriptions for tracks
within the provided Track Namespace.</t>
        <figure anchor="moq-transport-announce-cancel-format">
          <name>MOQT ANNOUNCE_CANCEL Message</name>
          <artwork><![CDATA[
ANNOUNCE_CANCEL Message {
  Type (i) = 0xC,
  Length (i),
  Track Namespace (tuple),
  Error Code (i),
  Reason Phrase Length (i),
  Reason Phrase Length (..),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Track Namespace: Identifies a track's namespace as defined in
(<xref target="track-name"/>).</t>
          </li>
          <li>
            <t>Error Code: Identifies an integer error code for canceling the announcement.
ANNOUNCE_CANCEL uses the same error codes as ANNOUNCE_ERROR
(<xref target="message-announce-error"/>).</t>
          </li>
          <li>
            <t>Reason Phrase: Provides the reason for announcement cancelation.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-subscribe-ns">
        <name>SUBSCRIBE_ANNOUNCES</name>
        <t>The subscriber sends the SUBSCRIBE_ANNOUNCES control message to a publisher
to request the current set of matching announcements, as well as future updates
to the set.</t>
        <figure anchor="moq-transport-subscribe-ns-format">
          <name>MOQT SUBSCRIBE_ANNOUNCES Message</name>
          <artwork><![CDATA[
SUBSCRIBE_ANNOUNCES Message {
  Type (i) = 0x11,
  Length (i),
  Track Namespace Prefix (tuple),
  Number of Parameters (i),
  Parameters (..) ...,
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Track Namespace Prefix: An ordered N-Tuple of byte fields which are matched
against track namespaces known to the publisher.  For example, if the publisher
is a relay that has received ANNOUNCE messages for namespaces ("example.com",
"meeting=123", "participant=100") and ("example.com", "meeting=123",
"participant=200"), a SUBSCRIBE_ANNOUNCES for ("example.com", "meeting=123")
would match both.  If an endpoint receives a Track Namespace Prefix tuple with
an N of 0 or more than 32, it <bcp14>MUST</bcp14> close the session with a Protocol
Violation.</t>
          </li>
          <li>
            <t>Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
        <t>The publisher will respond with SUBSCRIBE_ANNOUNCES_OK or
SUBSCRIBE_ANNOUNCES_ERROR.  If the SUBSCRIBE_ANNOUNCES is successful,
the publisher will forward any matching ANNOUNCE messages to the subscriber
that it has not yet sent.  If the set of matching ANNOUNCE messages changes, the
publisher sends the corresponding ANNOUNCE or UNANNOUNCE message.</t>
        <t>A subscriber cannot make overlapping namespace subscriptions on a single
session.  Within a session, if a publisher receives a SUBSCRIBE_ANNOUNCES
with a Track Namespace Prefix that is a prefix of an earlier
SUBSCRIBE_ANNOUNCES or vice versa, it <bcp14>MUST</bcp14> respond with
SUBSCRIBE_ANNOUNCES_ERROR, with error code SUBSCRIBE_ANNOUNCES_OVERLAP.</t>
        <t>The publisher <bcp14>MUST</bcp14> ensure the subscriber is authorized to perform this
namespace subscription.</t>
        <t>SUBSCRIBE_ANNOUNCES is not required for a publisher to send ANNOUNCE and
UNANNOUNCE messages to a subscriber.  It is useful in applications or relays
where subscribers are only interested in or authorized to access a subset of
available announcements.</t>
      </section>
      <section anchor="message-sub-ann-ok">
        <name>SUBSCRIBE_ANNOUNCES_OK</name>
        <t>A publisher sends a SUBSCRIBE_ANNOUNCES_OK control message for successful
namespace subscriptions.</t>
        <figure anchor="moq-transport-sub-ann-ok">
          <name>MOQT SUBSCRIBE_ANNOUNCES_OK Message</name>
          <artwork><![CDATA[
SUBSCRIBE_ANNOUNCES_OK
{
  Type (i) = 0x12,
  Length (i),
  Track Namespace Prefix (tuple),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Track Namespace Prefix: As defined in <xref target="message-subscribe-ns"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-sub-ann-error">
        <name>SUBSCRIBE_ANNOUNCES_ERROR</name>
        <t>A publisher sends a SUBSCRIBE_ANNOUNCES_ERROR control message in response to
a failed SUBSCRIBE_ANNOUNCES.</t>
        <figure anchor="moq-transport-sub-ann-error">
          <name>MOQT SUBSCRIBE_ANNOUNCES_ERROR Message</name>
          <artwork><![CDATA[
SUBSCRIBE_ANNOUNCES_ERROR
{
  Type (i) = 0x13,
  Length (i),
  Track Namespace Prefix (tuple),
  Error Code (i),
  Reason Phrase Length (i),
  Reason Phrase (..),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Track Namespace Prefix: As defined in <xref target="message-subscribe-ns"/>.</t>
          </li>
          <li>
            <t>Error Code: Identifies an integer error code for the namespace subscription
failure.</t>
          </li>
          <li>
            <t>Reason Phrase: Provides the reason for the namespace subscription error.</t>
          </li>
        </ul>
        <t>The application <bcp14>SHOULD</bcp14> use a relevant error code in SUBSCRIBE_ANNOUNCES_ERROR,
as defined below:</t>
        <table>
          <thead>
            <tr>
              <th align="right">Code</th>
              <th align="left">Reason</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x0</td>
              <td align="left">Internal Error</td>
            </tr>
            <tr>
              <td align="right">0x1</td>
              <td align="left">Unauthorized</td>
            </tr>
            <tr>
              <td align="right">0x2</td>
              <td align="left">Timeout</td>
            </tr>
            <tr>
              <td align="right">0x3</td>
              <td align="left">Not Supported</td>
            </tr>
            <tr>
              <td align="right">0x4</td>
              <td align="left">Namespace Prefix Unknown</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="message-unsub-ann">
        <name>UNSUBSCRIBE_ANNOUNCES</name>
        <t>A subscriber issues a <tt>UNSUBSCRIBE_ANNOUNCES</tt> message to a publisher
indicating it is no longer interested in ANNOUNCE and UNANNOUNCE messages for
the specified track namespace prefix.</t>
        <t>The format of <tt>UNSUBSCRIBE_ANNOUNCES</tt> is as follows:</t>
        <figure anchor="moq-transport-unsub-ann-format">
          <name>MOQT UNSUBSCRIBE Message</name>
          <artwork><![CDATA[
UNSUBSCRIBE_ANNOUNCES Message {
  Type (i) = 0x14,
  Length (i),
  Track Namespace Prefix (tuple)
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Track Namespace Prefix: As defined in <xref target="message-subscribe-ns"/>.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="data-streams">
      <name>Data Streams</name>
      <t>A publisher sends Objects matching a subscription on Data Streams.</t>
      <t>All unidirectional MOQT streams start with a variable-length integer indicating
the type of the stream in question.</t>
      <table>
        <thead>
          <tr>
            <th align="right">ID</th>
            <th align="left">Type</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="right">0x4</td>
            <td align="left">SUBGROUP_HEADER  (<xref target="subgroup-header"/>)</td>
          </tr>
          <tr>
            <td align="right">0x5</td>
            <td align="left">FETCH_HEADER  (<xref target="fetch-header"/>)</td>
          </tr>
        </tbody>
      </table>
      <t>All MOQT datagrams start with a variable-length integer indicating the type of
the datagram.</t>
      <table>
        <thead>
          <tr>
            <th align="right">ID</th>
            <th align="left">Type</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="right">0x1</td>
            <td align="left">OBJECT_DATAGRAM (<xref target="object-datagram"/>)</td>
          </tr>
          <tr>
            <td align="right">0x2</td>
            <td align="left">OBJECT_DATAGRAM_STATUS (<xref target="object-datagram"/>)</td>
          </tr>
        </tbody>
      </table>
      <t>An endpoint that receives an unknown stream or datagram type <bcp14>MUST</bcp14> close the
session.</t>
      <t>The publisher only sends Objects after receiving a SUBSCRIBE or FETCH.  The
publisher <bcp14>MUST NOT</bcp14> send Objects that are not requested.  If an endpoint receives
an Object it never requested, it <bcp14>SHOULD</bcp14> terminate the session with a protocol
violation. Objects can arrive after a subscription or fetch has been cancelled,
so the session <bcp14>MUST NOT</bcp14> be teriminated in that case.</t>
      <t>Every Track has a single 'Object Forwarding Preference' and the Original
Publisher <bcp14>MUST NOT</bcp14> mix different forwarding preferences within a single track.
If a subscriber receives different forwarding preferences for a track, it
<bcp14>SHOULD</bcp14> close the session with an error of 'Protocol Violation'.</t>
      <section anchor="message-object">
        <name>Object Headers</name>
        <t>An OBJECT message contains a range of contiguous bytes from from the
specified track, as well as associated metadata required to deliver,
cache, and forward it.  Objects are sent by publishers.</t>
        <section anchor="object-fields">
          <name>Canonical Object Fields</name>
          <t>A canonical MoQ Object has the following information:</t>
          <ul spacing="normal">
            <li>
              <t>Track Namespace and Track Name: The track this object belongs to.</t>
            </li>
            <li>
              <t>Group ID: The object is a member of the indicated group ID
<xref target="model-group"/> within the track.</t>
            </li>
            <li>
              <t>Object ID: The order of the object within the group.  The
IDs starts at 0, increasing sequentially for each object within the
group.</t>
            </li>
            <li>
              <t>Publisher Priority: An 8 bit integer indicating the publisher's priority for
the Object <xref target="priorities"/>.</t>
            </li>
            <li>
              <t>Object Forwarding Preference: An enumeration indicating how a publisher sends
an object. The preferences are Subgroup and Datagram.  An Object
<bcp14>MUST</bcp14> be sent according to its <tt>Object Forwarding Preference</tt>, described below.</t>
            </li>
            <li>
              <t>Subgroup ID: The object is a member of the indicated subgroup ID (<xref target="model-subgroup"/>)
within the group. This field is omitted if the Object Forwarding Preference is
Track or Datagram.</t>
            </li>
            <li>
              <t>Object Status: As enumeration used to indicate missing
objects or mark the end of a group or track. See <xref target="object-status"/> below.</t>
            </li>
            <li>
              <t>Object Extension Length: The total length of the Object Extension Headers
block, in bytes.</t>
            </li>
            <li>
              <t>Object Extensions : A sequence of Object Extension Headers. See
<xref target="object-extensions"/> below.</t>
            </li>
            <li>
              <t>Object Payload: An opaque payload intended for an End Subscriber and <bcp14>SHOULD
NOT</bcp14> be processed by a relay. Only present when 'Object Status' is Normal (0x0).</t>
            </li>
          </ul>
          <section anchor="object-status">
            <name>Object Status</name>
            <t>The Object Status informs subscribers what objects will not be received
because they were never produced, are no longer available, or because they
are beyond the end of a group or track.</t>
            <t><tt>Status</tt> can have following values:</t>
            <ul spacing="normal">
              <li>
                <t>0x0 := Normal object. This status is implicit for any non-zero length object.
       Zero-length objects explicitly encode the Normal status.</t>
              </li>
              <li>
                <t>0x1 := Indicates Object does not exist. Indicates that this object
       does not exist at any publisher and it will not be published in
       the future. This <bcp14>SHOULD</bcp14> be cached.</t>
              </li>
              <li>
                <t>0x3 := Indicates end of Group. ObjectId is one greater that the
       largest object produced in the group identified by the
       GroupID. This is sent right after the last object in the
       group. If the ObjectID is 0, it indicates there are no Objects
       in this Group. This <bcp14>SHOULD</bcp14> be cached. A publisher <bcp14>MAY</bcp14> use an end of
       Group object to signal the end of all open Subgroups in a Group.</t>
              </li>
              <li>
                <t>0x4 := Indicates end of Track and Group. GroupID is the largest group produced
       in this track and the ObjectId is one greater than the largest object
       produced in that group. An object with this status that has a Group ID
       less than any other Group ID, or an Object ID less than or equal to the
       largest in the group, is a protocol error, and the receiver <bcp14>MUST</bcp14>
       terminate the session. This <bcp14>SHOULD</bcp14> be cached.</t>
              </li>
              <li>
                <t>0x5 := Indicates end of Track. GroupID is one greater than the largest group
       produced in this track and the ObjectId is zero. An object with this
       status that has a Group ID less than or equal to any other Group ID, or
       an Object ID other than zero, is a protocol error, and the receiver
       <bcp14>MUST</bcp14> terminate the session. This <bcp14>SHOULD</bcp14> be cached.</t>
              </li>
            </ul>
            <t>Any other value <bcp14>SHOULD</bcp14> be treated as a protocol error and terminate the
session with a Protocol Violation (<xref target="session-termination"/>).
Any object with a status code other than zero <bcp14>MUST</bcp14> have an empty payload.</t>
            <t>Though some status information could be inferred from QUIC stream state,
that information is not reliable and cacheable.</t>
          </section>
          <section anchor="object-extensions">
            <name>Object Extension Header</name>
            <t>Object Extension Headers are visible to relays and allow the transmission of
future metadata relevant to MOQT Object distribution. Any Object metadata never
accessed by the transport or relays <bcp14>SHOULD</bcp14> be serialized as part of the Object
payload and not as an extension header.</t>
            <t>Extension Headers are defined in external specifications and registered in an
IANA table <xref target="iana"/>. These specifications define the type and value of the
header, along with any rules concerning processing, modification, caching and
forwarding. A relay which is coded to implement these rules is said to
"support" the extension.</t>
            <t>If unsupported by the relay, Extension Headers <bcp14>MUST NOT</bcp14> be modified, <bcp14>MUST</bcp14> be
cached as part of the Object and <bcp14>MUST</bcp14> be forwarded by relays.</t>
            <t>If supported by the relay and subject to the processing rules specified in the
definition of the extension, Extension Headers <bcp14>MAY</bcp14> be modified, added, removed,
and/or cached by relays.</t>
            <t>Object Extension Headers are serialized as defined below:</t>
            <figure anchor="object-extension-format">
              <name>Object Extension Header Format</name>
              <artwork><![CDATA[
Extension Header {
  Header Type (i),
  [Header Value (i)]
  [Header Length (i),
   Header Value (..)]
}
]]></artwork>
            </figure>
            <ul spacing="normal">
              <li>
                <t>Header type: an unsigned integer, encoded as a varint, identifying the type
of the extension and also the subsequent serialization.</t>
              </li>
              <li>
                <t>Header values: even types are followed by a single varint encoded value. Odd
types are followed by a varint encoded length and then the header value.
Header types are registered in the IANA table 'MOQ Extension Headers'.
See <xref target="iana"/>.</t>
              </li>
            </ul>
          </section>
        </section>
      </section>
      <section anchor="object-datagram">
        <name>Object Datagram</name>
        <t>An <tt>OBJECT_DATAGRAM</tt> carries a single object in a datagram.</t>
        <t>An Object received in an <tt>OBJECT_DATAGRAM</tt> message has an <tt>Object
Forwarding Preference</tt> = <tt>Datagram</tt>. To send an Object with <tt>Object
Forwarding Preference</tt> = <tt>Datagram</tt>, determine the length of the header and
payload and send the Object as datagram. In certain scenarios where the object
size can be larger than maximum datagram size for the session, the Object
will be dropped.</t>
        <figure anchor="object-datagram-format">
          <name>MOQT OBJECT_DATAGRAM</name>
          <artwork><![CDATA[
OBJECT_DATAGRAM {
  Track Alias (i),
  Group ID (i),
  Object ID (i),
  Publisher Priority (8),
  Extension Headers Length (i),
  [Extension headers (...)],
  Object Payload (..),
}
]]></artwork>
        </figure>
        <t>There is no explicit length field.  The entirety of the transport datagram
following Publisher Priority contains the Object Payload.</t>
      </section>
      <section anchor="object-datagram-status">
        <name>Object Datagram Status</name>
        <t>An <tt>OBJECT_DATAGRAM_STATUS</tt> is similar to OBEJCT_DATAGRAM except it
conveys an Object Status and has no payload.</t>
        <figure anchor="object-datagram-status-format">
          <name>MOQT OBJECT_DATAGRAM_STATUS</name>
          <artwork><![CDATA[
OBJECT_DATAGRAM_STATUS {
  Track Alias (i),
  Group ID (i),
  Object ID (i),
  Publisher Priority (8),
  Extension Headers Length (i),
  [Extension headers (...)],
  Object Status (i),
}
]]></artwork>
        </figure>
      </section>
      <section anchor="streams">
        <name>Streams</name>
        <t>When objects are sent on streams, the stream begins with a Subgroup Header
and is followed by one or more sets of serialized object fields.
If a stream ends gracefully in the middle of a serialized Object, the session
<bcp14>SHOULD</bcp14> be terminated with a Protocol Violation.</t>
        <t>A publisher <bcp14>SHOULD NOT</bcp14> open more than one stream at a time with the same Subgroup
Header field values.</t>
        <section anchor="stream-cancellation">
          <name>Stream Cancellation</name>
          <t>Streams aside from the control stream <bcp14>MAY</bcp14> be canceled due to congestion
or other reasons by either the publisher or subscriber. Early termination of a
stream does not affect the MoQ application state, and therefore has no
effect on outstanding subscriptions.</t>
        </section>
        <section anchor="subgroup-header">
          <name>Subgroup Header</name>
          <t>When a stream begins with <tt>SUBGROUP_HEADER</tt>, all Objects on the stream
belong to the track requested in the Subscribe message identified by <tt>Track Alias</tt>
and the subgroup indicated by 'Group ID' and <tt>Subgroup ID</tt>.</t>
          <figure anchor="object-header-format">
            <name>MOQT SUBGROUP_HEADER</name>
            <artwork><![CDATA[
SUBGROUP_HEADER {
  Track Alias (i),
  Group ID (i),
  Subgroup ID (i),
  Publisher Priority (8),
}
]]></artwork>
          </figure>
          <t>All Objects received on a stream opened with <tt>SUBGROUP_HEADER</tt> have an
<tt>Object Forwarding Preference</tt> = <tt>Subgroup</tt>.</t>
          <t>To send an Object with <tt>Object Forwarding Preference</tt> = <tt>Subgroup</tt>, find the open
stream that is associated with the subscription, <tt>Group ID</tt> and <tt>Subgroup ID</tt>,
or open a new one and send the <tt>SUBGROUP_HEADER</tt>. Then serialize the
following fields.</t>
          <t>The Object Status field is only sent if the Object Payload Length is zero.</t>
          <figure anchor="object-subgroup-format">
            <name>MOQT Subgroup Fields</name>
            <artwork><![CDATA[
{
  Object ID (i),
  Extension Headers Length (i),
  [Extension headers (...)],
  Object Payload Length (i),
  [Object Status (i)],
  Object Payload (..),
}
]]></artwork>
          </figure>
          <t>A publisher <bcp14>MUST NOT</bcp14> send an Object on a stream if its Object ID is less than a
previously sent Object ID within a given group in that stream.</t>
        </section>
        <section anchor="closing-subgroup-streams">
          <name>Closing Subgroup Streams</name>
          <t>Subscribers will often need to know if they have received all objects in a
Subgroup, particularly if they serve as a relay or cache. QUIC and Webtransport
streams provide signals that can be used for this purpose. Closing Subgroups
promptly frees system resources and often unlocks flow control credit to open
more streams.</t>
          <t>If a sender has delivered all objects in a Subgroup to the QUIC stream, except
any objects before the beginning of a subscription, it <bcp14>MUST</bcp14> close the
stream with a FIN.</t>
          <t>If a sender closes the stream before delivering all such objects to the QUIC
stream, it <bcp14>MUST</bcp14> use a RESET_STREAM or RESET_STREAM_AT
<xref target="I-D.draft-ietf-quic-reliable-stream-reset"/> frame. This includes an open
Subgroup exceeding its Delivery Timeout, early termination of subscription due to
an UNSUBSCRIBE message, a publisher's decision to end the subscription early, or a
SUBSCRIBE_UPDATE moving the end of the subscription to before the current Group
or the start after the current Group.  When RESET_STREAM_AT is used, the
reliable_size <bcp14>SHOULD</bcp14> include the stream header so the receiver can identify the
corresponding subscription and accurately account for reset data streams when
handling SUBSCRIBE_DONE (see <xref target="message-subscribe-done"/>).  Publishers that reset
data streams without using RESET_STREAM_AT with an appropriate reliable_size can
cause subscribers to hold on to subscription state until a timeout expires.</t>
          <t>A sender might send all objects in a Subgroup and the FIN on a QUIC stream,
and then reset the stream. In this case, the receiving application would receive
the FIN if and only if all objects were received. If the application receives
all data on the stream and the FIN, it can ignore any RESET_STREAM it receives.</t>
          <t>If a sender will not deliver any objects from a Subgroup, it <bcp14>MAY</bcp14> send
a SUBGROUP_HEADER on a new stream, with no objects, and then send RESET_STREAM_AT
with a reliable_size equal to the length of the stream header. This explicitly
tells the receiver there is an unsent Subgroup.</t>
          <t>Since SUBSCRIBEs always end on a group boundary, an ending subscription can
always cleanly close all its subgroups. A sender that terminates a stream
early for any other reason (e.g., to handoff to a different sender) <bcp14>MUST</bcp14>
use RESET_STREAM or RESET_STREAM_AT. Senders <bcp14>SHOULD</bcp14> terminate a stream on
Group boundaries to avoid doing so.</t>
          <t>An MoQT implementation that processes a stream FIN is assured it has received
all objects in a subgroup from the start of the subscription. If a relay, it
can forward stream FINs to its own subscribers once those objects have been
sent. A relay <bcp14>MAY</bcp14> treat receipt of EndOfGroup, GroupDoesNotExist, or
EndOfTrack objects as a signal to close corresponding streams even if the FIN
has not arrived, as further objects on the stream would be a protocol violation.</t>
          <t>Similarly, an EndOfGroup message indicates the maximum Object ID in the
Group, so if all Objects in the Group have been received, a FIN can be sent on
any stream where the entire subgroup has been sent. This might be complex to
implement.</t>
          <t>Processing a RESET_STREAM or RESET_STREAM_AT means that there might be other
objects in the Subgroup beyond the last one received. A relay might immediately
reset the corresponding downstream stream, or it might attempt to recover the
missing Objects in an effort send all the objects in the subgroups and the FIN. It also
might send RESET_STREAM_AT with reliable_size set to the last object it has, so
as to reliably deliver the objects it has while signaling that other objects
might exist.</t>
          <t>A subscriber <bcp14>MAY</bcp14> send a QUIC STOP_SENDING frame for a subgroup stream if the Group
or Subgroup is no longer of interest to it. The publisher <bcp14>SHOULD</bcp14> respond with
RESET_STREAM or RESET_STREAM_AT. If RESET_STREAM_AT is sent, note that the receiver
has indicated no interest in the objects, so setting a reliable_size beyond the
stream header is of questionable utility.</t>
          <t>RESET_STREAM and STOP_SENDING on SUBSCRIBE data streams have no impact on other
Subgroups in the Group or the subscription, although applications might cancel all
Subgroups in a Group at once.</t>
        </section>
        <section anchor="fetch-header">
          <name>Fetch Header</name>
          <t>When a stream begins with <tt>FETCH_HEADER</tt>, all objects on the stream belong to the
track requested in the Fetch message identified by <tt>Subscribe ID</tt>.</t>
          <figure anchor="fetch-header-format">
            <name>MOQT FETCH_HEADER</name>
            <artwork><![CDATA[
FETCH_HEADER {
  Subscribe ID (i),
}
]]></artwork>
          </figure>
          <t>Each object sent on a fetch stream after the FETCH_HEADER has the following format:</t>
          <figure anchor="object-fetch-format">
            <name>MOQT Fetch Object Fields</name>
            <artwork><![CDATA[
{
  Group ID (i),
  Subgroup ID (i),
  Object ID (i),
  Publisher Priority (8),
  Extension Headers Length (i),
  [Extension headers (...)],
  Object Payload Length (i),
  [Object Status (i)],
  Object Payload (..),
}
]]></artwork>
          </figure>
          <t>The Object Status field is only sent if the Object Payload Length is zero.</t>
          <t>The Subgroup ID field of an object with a Forwarding Preference of "Datagram"
(see <xref target="object-fields"/>) is set to the Object ID.</t>
        </section>
      </section>
      <section anchor="examples">
        <name>Examples</name>
        <t>Sending a subgroup on one stream:</t>
        <artwork><![CDATA[
Stream = 2

SUBGROUP_HEADER {
  Track Alias = 2
  Group ID = 0
  Subgroup ID = 0
  Publisher Priority = 0
}
{
  Object ID = 0
  Extension Headers Length = 0
  Object Payload Length = 4
  Payload = "abcd"
}
{
  Object ID = 1
  Extension Headers Length = 0
  Object Payload Length = 4
  Payload = "efgh"
}
]]></artwork>
        <t>Sending a group on one stream, with the first object containing two
Extension Headers.</t>
        <artwork><![CDATA[
Stream = 2

STREAM_HEADER_GROUP {
  Subscribe ID = 2
  Track Alias = 2
  Group ID = 0
  Publisher Priority = 0
}
{
  Object ID = 0
  Extension Headers Length = 33
    { Type = 4
      Value = 2186796243
    },
    { Type = 77
      Length = 21
      Value = "traceID:123456"
    }
  Object Payload Length = 4
  Payload = "abcd"
}
{
  Object ID = 1
  Extension Headers Length = 0
  Object Payload Length = 4
  Payload = "efgh"
}

]]></artwork>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>TODO: Expand this section, including subscriptions.</t>
      <section anchor="resource-exhaustion">
        <name>Resource Exhaustion</name>
        <t>Live content requires significant bandwidth and resources.  Failure to
set limits will quickly cause resource exhaustion.</t>
        <t>MOQT uses stream limits and flow control to impose resource limits at
the network layer.  Endpoints <bcp14>SHOULD</bcp14> set flow control limits based on the
anticipated bitrate.</t>
        <t>Endpoints <bcp14>MAY</bcp14> impose a MAX STREAM count limit which would restrict the
number of concurrent streams which a MOQT Streaming Format could have in
flight.</t>
        <t>The publisher prioritizes and transmits streams out of order.  Streams
might be starved indefinitely during congestion.  The publisher and
subscriber <bcp14>MUST</bcp14> cancel a stream, preferably the lowest priority, after
reaching a resource limit.</t>
      </section>
      <section anchor="timeouts">
        <name>Timeouts</name>
        <t>Implementations are advised to use timeouts to prevent resource
exhaustion attacks by a peer that does not send expected data within
an expected time.  Each implementation is expected to set its own limits.</t>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>TODO: fill out currently missing registries:</t>
      <ul spacing="normal">
        <li>
          <t>MOQT version numbers</t>
        </li>
        <li>
          <t>Setup parameters</t>
        </li>
        <li>
          <t>Subscribe parameters</t>
        </li>
        <li>
          <t>Subscribe Error codes</t>
        </li>
        <li>
          <t>Subscribe Namespace Error codes</t>
        </li>
        <li>
          <t>Announce Error codes</t>
        </li>
        <li>
          <t>Announce Cancel Reason codes</t>
        </li>
        <li>
          <t>Message types</t>
        </li>
        <li>
          <t>MOQ Extension headers - we wish to reserve extension types 0-63 for
standards utilization where space is a premium, 64 - 16383 for
standards utilization where space is less of a concern, and 16384 and
above for first-come-first-served non-standardization usage.</t>
        </li>
      </ul>
      <t>TODO: register the URI scheme and the ALPN and grease the Extension types</t>
    </section>
    <section numbered="false" anchor="contributors">
      <name>Contributors</name>
      <ul spacing="normal">
        <li>
          <t>Alan Frindell</t>
        </li>
        <li>
          <t>Ali Begen</t>
        </li>
        <li>
          <t>Charles Krasic</t>
        </li>
        <li>
          <t>Christian Huitema</t>
        </li>
        <li>
          <t>Cullen Jennings</t>
        </li>
        <li>
          <t>James Hurley</t>
        </li>
        <li>
          <t>Jordi Cenzano</t>
        </li>
        <li>
          <t>Mike English</t>
        </li>
        <li>
          <t>Mo Zanaty</t>
        </li>
        <li>
          <t>Will Law</t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="QUIC">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="WebTransport">
          <front>
            <title>WebTransport over HTTP/3</title>
            <author fullname="Alan Frindell" initials="A." surname="Frindell">
              <organization>Facebook</organization>
            </author>
            <author fullname="Eric Kinnear" initials="E." surname="Kinnear">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
              <organization>Google</organization>
            </author>
            <date day="21" month="October" year="2024"/>
            <abstract>
              <t>   WebTransport [OVERVIEW] is a protocol framework that enables clients
   constrained by the Web security model to communicate with a remote
   server using a secure multiplexed transport.  This document describes
   a WebTransport protocol that is based on HTTP/3 [HTTP3] and provides
   support for unidirectional streams, bidirectional streams and
   datagrams, all multiplexed within the same HTTP/3 connection.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-webtrans-http3-11"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <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">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <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>
        <reference anchor="RFC9110">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="RFC3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <reference anchor="RFC8615">
          <front>
            <title>Well-Known Uniform Resource Identifiers (URIs)</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="May" year="2019"/>
            <abstract>
              <t>This memo defines a path prefix for "well-known locations", "/.well-known/", in selected Uniform Resource Identifier (URI) schemes.</t>
              <t>In doing so, it obsoletes RFC 5785 and updates the URI schemes defined in RFC 7230 to reserve that space. It also updates RFC 7595 to track URI schemes that support well-known URIs in their registry.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8615"/>
          <seriesInfo name="DOI" value="10.17487/RFC8615"/>
        </reference>
        <reference anchor="RFC7301">
          <front>
            <title>Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension</title>
            <author fullname="S. Friedl" initials="S." surname="Friedl"/>
            <author fullname="A. Popov" initials="A." surname="Popov"/>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <author fullname="E. Stephan" initials="E." surname="Stephan"/>
            <date month="July" year="2014"/>
            <abstract>
              <t>This document describes a Transport Layer Security (TLS) extension for application-layer protocol negotiation within the TLS handshake. For instances in which multiple application protocols are supported on the same TCP or UDP port, this extension allows the application layer to negotiate which protocol will be used within the TLS connection.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7301"/>
          <seriesInfo name="DOI" value="10.17487/RFC7301"/>
        </reference>
        <reference anchor="I-D.draft-ietf-quic-reliable-stream-reset">
          <front>
            <title>QUIC Stream Resets with Partial Delivery</title>
            <author fullname="Marten Seemann" initials="M." surname="Seemann">
         </author>
            <author fullname="Kazuho Oku" initials="K." surname="Oku">
              <organization>Fastly</organization>
            </author>
            <date day="28" month="February" year="2024"/>
            <abstract>
              <t>   QUIC defines a RESET_STREAM frame to abort sending on a stream.  When
   a sender resets a stream, it also stops retransmitting STREAM frames
   for this stream in the event of packet loss.  On the receiving side,
   there is no guarantee that any data sent on that stream is delivered.

   This document defines a new QUIC frame, the RESET_STREAM_AT frame,
   that allows resetting a stream, while guaranteeing delivery of stream
   data up to a certain byte offset.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-reliable-stream-reset-06"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC9000">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="I-D.ietf-webtrans-overview">
          <front>
            <title>The WebTransport Protocol Framework</title>
            <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
              <organization>Google</organization>
            </author>
            <date day="25" month="February" year="2025"/>
            <abstract>
              <t>   The WebTransport Protocol Framework enables clients constrained by
   the Web security model to communicate with a remote server using a
   secure multiplexed transport.  It consists of a set of individual
   protocols that are safe to expose to untrusted applications, combined
   with an abstract model that allows them to be used interchangeably.

   This document defines the overall requirements on the protocols used
   in WebTransport, as well as the common features of the protocols,
   support for some of which may be optional.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-webtrans-overview-09"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+y923bc1pUo+r6+Ak0/SPIolnVxHFvZ3mlapGR2JEoRqbh7
Jz4iWIUi0SoCFQBFilG0v+V8y/myM+9rLgBFSrKck31GPLpHRBSwLnPNNe+X
7e3t0JXdsniYbT0r5mWe1RdFk/3x1f6j7KjJq3ZVN91WyE9OmuLiYXZe/3W7
08dhXs+q/Bw+nTf5otsui26xnbyxfe9umOcdvPFud+do732YwR+ndXP1MGu7
eQjlqnmYdc267e7fvfvd3fshb4r8YZZt/VScZHk1z/arrmiqovNradcn52Xb
lnV1dLWCoff3jh6Hy7p5c9rU65Xt47nuYyu8Ka7g9/nDkG1n53GTf12Xs3BR
VOsCfsk2fp1lHc2z9RPMUVan2RN8E5+f5+USnsOW/x33Pq2bU3ycN7MzeHzW
dav24Vdf4Vv4qLwopvraV/jgq5OmvmyLr+D7r/C707I7W5/wgNuXp18loMQX
lgC9tvND04tT/nBa1uknX206lulZd77cCqHtAMav82Vdwfauija053nTvf7r
uoZ5HmZVHVblw+zPXT2bZC181xSLFv51dc7/gOM/z1crAMnPIeTr7qxuEJDb
8P9ZVlYwwtNp9mjdLIsresS48nT9pvBPARp5Vf4t7+BAH2a7ZTuDo6JfCobv
m/JtgTuf//spPpjO6vOQTvOHafZifVpWbpY/lE25XLrH6TTPii73c5Rvyubf
z+HhyOiH0+wA4JS/WQN03BSH67O87f+UTvMId+PnaSt+/d9n+MvIZH+aZn/K
23JZFhduqj+Vs65u0l/SmZ7U9emy8FNd4MsXF/9+Sr+MTLU/zQ4vi65z8+zn
lXt20wwloBO+7KfAn5sayQlcI1hzCFXdnMMQF3TJ8EY9zF4+fvTd3bt34W+4
53azYfrtXboh25fFCSHrNiL6A6AT1SKOEra3t7P8pIU3Zl0IR2dli6i4Pi+q
LpsXi7Iq2qw7KzJApCI7Kc7yixKAByNkGylcuP3s+R+P7kyyXAiE3ZVs1dRw
AeolDN2Wp1Uxz7o6q1dFAyjphoJzDX43k+zyrJydZTB7kbXlOdKAbLGuZgjN
fFl2V9MM58zy5RKoAEwME83XMxivXgRZRJ2t1ifLsj3LgIrmRBFpvLKDzVUt
bHmeXcCLQBLbWVOucOzs5CrLw/l62ZWrZTmDiWDArKjmq7qsunaa7Xfw/grX
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
licNtrnD1F2u2WSdmRXX1ClIzvGg/QB1k9JuNW4eZEWKLcAun115yhbfkurA
CgaANIKgiDtP1uk7GeJN0pj0BdJBrbNLrZdwGq6vxpT2/vQ+ZzIjP+fq8P1q
atRJVPKc5XpR9VpTysdqynIijsTw9oN80AAQXNHxWNmNKj1jPTNu8iwTuKrE
I9E/JSUdn2OeWC9YEdtf0Hr79eHehSzWirtageRd3pm4Z1LBsvf0hVzR29Mp
PH9Pw797mH2B7QesEO62kg1eE0ir3bL4fourivNPW++tLuq1pR6vLye5v0s1
I+MpfcR/Vmny2nKq189/9+3XVGk1qbc/Uiv72vl/wf5hfqrPmtSh/4fOf4/2
f11Rwxvh/8vmp7qrz3b+83X0owJWuJWc52+dFlnOdU2faf4dgr/Offj6h6fP
H/1hL1lBFD22ifQWtIbPM/+DLJl/dFqNTvhV8C+dH010o0sg7f1XmP83vfk5
C3V0CZTPGVfxeebfofl9LR4397qy2X8t+N/v7V8SZEYBwH7Uz4v/P/TmpypT
o7Nzfag7n3n/96haMgd6uGmphtJ11Oezzf+tzd/DfVrCCN5/5vm/i/MPcJ+X
0MP7zzz/b+P8krM8WMAMrV3LX+f+7xL+Hb3cefSH14dHO0evDl+/3Pvjqz1Q
Ftw6pL9pl3frVqnh55l/bzD/pnl/nf1/Q/Ob7dhPrurlr8r/f5vM37sCuoLR
W/B55v82nX9wBWwJg1vweeb/LmP6P3oC6+qaM/g88z9K9z+8ggaA/i38TPf/
Xkr/Y3WcUSZQxWvwmea/v2H+oSSCoHCY+Jnmf7Bp/jFJhJYgmPiZ5v+6J3+M
nwBJIjj75zz/pCyMWCqiY2tdUR/E6H1BHXO8Ufo0DDr5SFz5kpVQjUha5Q3F
nRZ5W6JVHk2GVW3afUygwWSDShpxcn4ux6jNtR6kjmzWRvbWoktJfhHjni5f
AicmYiyWqjGb9kNhKbEP1LsvpFFaCIeYFRSrqWkbZv821S3PpGYf2vCstLP1
ciuWrjjuVexeSVCeyObYZk1h95g4L7UUXCjcSu1vZLWO7bToqGg4S+R8KTtu
rW7LWYGFI6RocaxOHA31rg8W5XX3obS5SRFGDS2wYDBFvMjEGmW4rgD69WlF
0S1xDokTFosDHJ4DaNkObSKxVQcaQuJf3hQyaOcxeP4nymkYM4bQyrIRA4h9
jCaQ3ryluIQ5/X+kkZx2AqVIezKES2CJjjNNe2T5Q+BWDb2SHRhqh23vsayd
pPpghhFG4Me4fevZRx2/2NBoKMzDaqNEi3V08RGPY30avj66wVv3bkl4zoJ9
Si4dNW2ilrYjCxIJy1ncfjmEuogLaUu+FLUHDf/63Qyn2htyO3aavHGIPgTi
aFL8tY9MfM2FzBx2ZAyOL3nrPV/nIK/2sY/HgTWcXHW0d4rDjutlR9JKykYv
l77mr5Q01Qs/Mnyg4bkNQqR7VH0KsYZCG1PYTKKDxZ7LDtBDZfHVeC9w3iEJ
3gCrlPYG9iFsLkXP9ZuIft7a2JjnlvjntBnooZ53Qr03na3AeoD8HvjWeTu9
yQnCIuzJWB4kPR0LNORahkf+orcoqVTadV9xzoSPFNXAc+V2IVaCbqlwyqBF
IV9fa2GYRotwjmwtfaO5gA9WA3Xfc72KgtOZ0mvKoP0i23l19OPzl/v/awd7
gmX7B4+fA0iT6MBtdEsBNEfedJ12e8Ty7tu79+/EqP1Wy8jcanuhh73miy7U
aLTWaqzOFPpVvSTWK64J/6D0zk6adloeHwdB9lNwXItPYb0chIKpaEt2Xkqa
HLv+Dx/t76ONn71nBM3dvaf7f9p7+V/Z0f6zveevHEMBqKrvZVsCRKT/2+Cb
a6H64A4HpduxukChSWLrk6KDzvy0+yKtz7JvZVbm60aPIJwDGSq5G5+PiFXR
AqSZsuJCZlr5zgXeW/tBqrBG0cXWUsmiAjRLlZy6CAyL7rLuE87VdyltJAL5
8xxjVadmGeMNJmkNMA5WzdYrcczEhYaYRE8nywmwFRVnAxEJ3eYcbsJufWvy
iLGgUvCs0xCVkDhxdQv4JjbYLObaGpUCIZIw7H5hBZ9abFgw4SBtjYU5LzU4
N2BdA+mE2quEp8VOfMi/+UWl6rOfjEYJaSqAz95KnN96IAyzuhKmgk5OOhx1
+FJ6iysNKSDEdrCohuC9lOz3mJwS8wZdxrVmLQdjMSvBG20zIwiBRa9kXB5n
EmN/87Zdn7s4PASg5hAxo+U4X/JR6pFVksLaO7W6GTm0/j2ekASkGTalj0+1
qKD+kQEvXXaSg2c1yKnAvPAnZM8IhjLJtyf4v4ilFUgeSNpGzKznj0v6x/yA
et3M0GOMrldk/Yu8XEpUBIJ9fe5CJqgpUKzhjTxpkoZOE23qsf0EdSLvv4Xd
xh4DDfuhAFDMb0mBWKtDVla+2pnfQf+q9VPjkM8GLqePP4x2AxW8loBGKSO/
rdPFzlV3NM6GL/xVr4NNN+A4Pc3W1x7Ik9pblHpfdr0igzEo2O4eTeoiDniG
louhYyRUP83IRXCb/qiNP17EwOpI0Oly4bU2XEe23XgCG4P3fHX8IE1tYsj3
FV8li8vUa9jlbzgOgXNlQX/0OeMTV35PDQbSb9dq3lqB7zRRi9jus53/zB7t
PPpxL9t99ZLlE8940ctIOUvbyucwTmDnP1/TN6/tmxF2+/Ud7j4oShFwh6Zo
tXAul86qFwnLJLlQihOoUJxE5DDbczwT9+iKbQnQjRjH9JiyTW9T7L0cq3CN
L4pLrS/zFfJUFjbxs00c9dL1stDebZw+rvxdaXq5MSMPlRmqdFrYy0TrlSAy
mdZcU8mfpRAtnYMEBx6C1Qsgetz8ARgviNqtmrG4SUOvQnQ1Xxau4ZSj/NaD
jivOxIjybdeTgcoBYvEVHz1A/WW9O98CT8SbzxLdsf/omL469p8dZ4kxjCQT
ahtujzUyBW5Y0h5elTfu4fA7lgw4mpCvrbaoSHqYkdiw7qipTJDO8li9T9Qq
umfYDFPjV6TPOd7ERXmqoqHcdbqRrsm0LXUq8iQqLH9dS13N7E1xtc1S8yov
KRR9uYS5+6oObSWoBcXSacVcJLFKgD0XOdB9LxoayRIIYQq1thsLQpc4ckny
+BdrKu0jbe9dXQNqoBUhSPfVzFqEZ6HtrRpEx+e7zx9aOGj25OXezqHWHq9b
ra1/ibcgbodsCmkPd0oM65vBEtzzoUFqB8u+pygXNHulRrADpQLZoR23aNGt
vjP4hUacTqfpAE7Xdr/z8v1v06n8iHZUf0c2L/zecOGHWtTNrekXr2c8DorN
SiNGQB5Lw5a25FLHOEG1uDE56OvsLLp18HIMyCO5VCLa2tSo0VLHR1yJDiuF
cYcWPkaS7MH97RNqpJMWJJ2IVYobk+NFwV7hHLasN12r3PgaDiS0DLLrhY0A
B+T/7k2DLdhE6vO6ZT2JBoPLd++b7IRKJ/A8Oq0MNlsWnCzcFCSeNReil1Op
nEpv5v7e0WOSSvDCYjz4bM3mdGm4JvccjZFigePyBxrhzAZrAxqqcozpRmQa
8w40BVbzpA1RD5xk3S1PEoHCU1vXKhkoFsHmaZhCfshIqKEHR7tc/LaMrRDU
PhnzkvQsHo5l71nduOREqsm/0fHxlz//5c8vHz/KinnZYV9lEBox6hN7FUv1
NvhnXlZWwNOFvDP5Z1Ffkt9+/pmPpHfOKnguKB0kwb1+AZHsdsSwOxNubOkQ
wyNR/4DVQh4z2jl5DPZnuCorsqqBMcWIkGzegATF1wrjXyWZDMNetaUUvhBk
W/D53beLBa+WDOcx8Y9e3C6LbrGdEpl7D6wsc3C3DJZqY+0KQRiQMCUMZs8k
WffFztGP5LPqzoQy0ZNrjUb37mRSRcBhG+oPib0hWrGR/mCjUdL0ub9kxT06
KKvmtkbj3mEjku9vRZBmHVWQmOxQNNJPxUmkalLLkbVVWkCRpjDgtqLvxNcd
v3nUaG+la6DZ1dqbFBctrJaGlB6sGKJL1UjWKDq+e/dvgEsPvvv2G3ITkBbY
z5qQa7oWjYBgptRxCzCh25KSZ3JXGfLSu4HV097pSWbBMR7Hdn6C9rWr4wz3
Fi9BgHl+h364Y5CzGviZymE7jcPPg6WzMaob5ebj3x9PZOPxlHSQdA7aiyYe
mgMr6ltpSCfrWEkkJ+Pm4M2bTMZJHVzyt5EsGmKRPULQkX7hutqYAuRb6ByR
4YCKlQWz4t5lJXzB5Ft1qElER8Nspg+Dmn6YPMThtVETkOja1AOvhSaO+fXj
JO8xNiShSUvT8ckKYwisDhRsOkhR8tzHDcVi5KCyEBqwpIxl+8Jy38KGJuVW
wMGc2XD8wnB7TXldCtAqn6W1QLXxnc88V5901HCXacteq1Q0WniYEhVA6Mp7
RqamIG2Ts3ZEa+M3ReaK3aNpTSG8WtWVQ46YI5WPNtCJUEzmkMxYPijrLOdM
8FKmKrbl8J2UXrtc3SOnsGU3+cuAHA5c8f4w9VM5zn5DFrUQpWeJGIyysTzd
KKjfG9MwAChSMo5IxfW/Xp+RwDdmTBRPV4ai+Jf9sR9yXXczl5C5TOWr6NaL
Xp/YrRgWKgRdm4qxZ4PFHqme5jscWx0BeqXXuRvb0mt/iYXW2Y0xLdy4O/tb
0dTsDKbqC5PekjJq7E1EPuv1/OafUN6nBLeYTdc6QAv+qrOAMx6JA8F4UvM0
DvuUiyuSXuzLemKWk1qRmcMNUgutywggH+1pA0IIH4bhPhK7mbqOcZpNuQNp
EphS3MEICeWVvCen8sQ6amJHTSzp5I5gXtAvPCpXeoQ1zRlxqGSTTTmsW4pG
LPVuUF3HjUu3TqF/pTYWsFmsP4weHscPI5sbD+SRy9+fJAyv/29G9HTPeOnZ
xnSj3jGNhd0MNppceD/XQ8P6URHAbN56ewmHE6hszMGI0FzmzamaK7UJu6cv
ibshpMUY+lsZc05s7KtVBfaNwOmTe+QZqpK2+haPbAAqpFVSsxQwmn6mtsuH
yAiBQ/wehNjvQM2YwO1kTe7rKUi0d7hogX6qXgAp7cZdLki8pirryOOwamS9
6IrK6jv219KrhlL26sVxGWOXEq1XYbCnvO3dQQFYzUneyW3teT18Oqcv7xDI
iM5NmlqQM1CR5xKkw/QgZ9UdZgfxLR/5Si+nVmK/HJQSY00QXSnsSDktqyAl
BxKJByMnrd9CrIKQYDqPxW4xYhej94FJgPquVHAZtmbxlUeQTIWkq2ncoy9/
MjZhv1tqbHI1OOO1iWNM7oazTYJknbuoSGq4OrYyKg1LhW2iN2pwWSYGT31n
ZCSpLqqxIEImhy+OEMqdIaEcPZZrCeYQ58ZI5sjCE6I5Ni8Tzw8hnGxc10aP
TpjHwAxe1DR7hqZxPA0/kO863KewvQs3ds/oRdcqTZuPUEJvSkmVCsH9WV45
M5Cv45mr43PYO5GS4zFu2YTj0XJ7vhObsuyg/WgEWEkQhzlWNYOeA1xdz8QL
J+J8+eVj9vgjIrVffikNnuNaVSvFESQ4oB6pz6pFJcIARmby4vNU6GgNFu/O
ZQlGwoUfSPQbXE2eF70ST1GWtlYVt+++vX/noYblsb6Ozeu32QOeLDC6GtGQ
E7wcKo5DsTvoU+70Q1KoRJHjU/RjUixRjI64Kjou2dDXRK2EYHSwOSxpIkvX
pkI7J229XHfFIXloYXcPYHcfub1gdiqNY4hWP23jg8Nz9AYph/inQJRCKVuz
MLs3S6k9pFaOBEzDOiq6fwl0GTh6e7BnngTPbyUnfEuO3sHmJVeDv/v26x5s
mEfPR1ZBtLjz+8RomB4UlGazFEUSWNu5WJC9av5EMOLIYsdQYiaW5SvVc34B
aOYtHC5m6suXYnbrd2+g+03OaGm5RGJfXJ0pcB91GGHzYQy97jccRhgehpIC
DjPtzqK0inWN0ZivwaadGLbR/4+ypfZh9mKJlR70hdat5AZGrZnvdx4j+7IE
VZIu8EnFOGUtyevBWSHhbTKaTLPdQsvHWshe0jEcpRKWInHNygECLTG6Un1t
3ZJPGOtgOL9EwwXsmqJbN+bYFpFATG0YNjFIW4ibGstaiL9utKQ8+BBNKstc
3bT0Uax0ebtbA8/q/dQb2lduIwNMNtq75fa39JOPJ5NHjjfpmH9210AeJRQM
nv1M79m10yebXLgpEEZcuDdLSqNe3P5pbFImR5htrIbKlZnmnORUUe/gXgfF
Yz/iMavb6HwlHUTSlZKkEbmZYV2Vf13znTqvQeKs0eq9jCYCqnDW71yKb+vV
xuqJwa69vHGr3SSYf+nR6iHaaNWebCWw46YtIJfFJ6vhIZlk2n8q136xWi1O
qhSNVSeahPgdSUUey3tVmxzm4o77yN/VMBbVzsFCNWdkDdv3X8qgrWuYSFSl
Fceia64WZAcfoaZnu5ZH5aYT3X2jUdYdge3kYbYfQ+RJrbU9CiSkDmLr8lnQ
7svJy/j2cOTBoLHGaTpQNjrQCInwMh47YV0nz36DCm6KhWeUNKsXebr0pdjU
SvOUOi2qs/a06Pq9UafhkAI1e0WfvvRE6yEmQKlHz11qIvRcCNR4mo+uBYBa
B0gUbO7dQY4RGzuymCu1i4BbiWA6tqAdUbgBLHff3u0llYy23fJE18pWBXaM
/olDu701CmtKcBRI2gmdYOGo9RAFJB+F5Qat/pQv0f3lbeTdmTD3SOa/8uQd
b6NS9q/gH4ncaqVtxRnJ6GQDPXSSmzYuwJC/5ZU1c8K7uZWI4Vsk5G0l4ueW
F3/aOAsvxk/juj98nnl07zwJijq6k4kXOgeTkUM4HTy4wdOL55ggzzMIL/rA
1Lbn1aZ+IqP0zkXD5GkqCTch6EWsy+XCKp9I54RSEtzpjnylfanREIYmFc2t
wChE47TDgn9qjKKR5J66uoIqwSYVAsmBC4SnFdE+lgfmYdAuSa3vpOg9/QXK
ZPAddZ16uLkCsuSOE5Q4f22/ot5NGR3rrWlqAbOoX5peTRNULo577IwuVzSi
nsEE0+bHbCb1mw2+j+TLsf5HETtSg2vf6IXtb4bxex8mzO5RBK+JeiNipvTV
2kP/b6sP//xUdEDrcWKipf5it/sfImPWb661wyGIr5E0Dz2T3I+CVsqQrzOd
famQBJqAak2Jfn0X4s3R4AOrnXVOreog9d4JXdFLH7lVwqtUg/IDmNufA7ID
Gfr5YDlBSksKoMo1jaeOMtj8omzrhiuL5n3LXkUafKJO08BXprwt87aTUvVD
nr+fpmCnySbMjX4VVi/MWTg9E7G6LT6cWydI/zC7h4QpZr+YnctZrMQZJfLq
XYlboSyru0TPK9Gze/cGFze8Mp5lS2dnZdvZjmVdOB9iuoeoiSR+3XCjX/cG
Abm/emaAy8GezM3D3FXhIkmgtLlA2WmOEQPAUlJzJqGycgvuJSswUKVLiBCM
a3Bds/orDZvXl33a+j6/mJDwGGZvY2yGa6PcxGn4+z6zKWPjL06FWnCAtG8X
k3IcGmfIdD7IFw3kh3D0EfJnefISVGrAvhdnDboc0xHS39RWMrDC3Mwj+Gpc
yyYYPr82p7DtJ5qAq1/hEvBZEPBJiHA22EQTR0pA8xDvM4a1aGIw/Tb4PhK5
xOJAcTruYAD9b70sOqD07rVbk76Iac1ctqmdqsTGRPOOmPjHDQpiF+j/GA0D
JQXP4XH3pu1ZAFwl+euMALz3kF1L5Y5Su6YP2sljnps7obLqI9AkOHTAXn6X
D61m63Ulg7AwEQH/73qy11Qfu7b4Kpc4ogqj1NkJNVs+3LE6WjetCXgx1Uqq
XHek8YpcN49EVaeOJA37mtpqN49E9aMO6s7lynziSFQJivFkFyUpHJSI/EeP
9BuGuFM5PnVNVJ1xcAE/dqSUe0iJyzH2IRUuQ68vEbVITusU8BgUYJ24MtWM
k2dStxkrdlfjcaNpQz2OkiVmy7mD2Tma/KscEPZyQvLPZUmdPDRAAOt8SHkD
mBl/rAayK4VgILEkKhONS+ROIGFIdc+YqencVer2SXM6G26hSLUMMqrRyC6P
4FrYN3BoZXERU7PjnKxAToc2EKvRPi8k7IZKdSNNpoBjfsh9Rq0awukapAS4
3VKmJGlYBYJjQMBJz1Ymp63L4feroiAXtxxx45kBJZiibFFBfnm65g9eXjC5
dvPy4qHg6grroImaUd8aESIn0CDHaytkdT5GSDGaHf9FG6SqAOYZOJPEBq9/
GuOuTZZYFcNApnlw4uehj0U0ON0kjQ2WGgNlqNBMiK3NJRGJwKuFJNCI4Cw5
lzX614D40kUrW/uII2u04SpWCGtquGBL6TmBbxdvQaxK7SSsEY5ccUok88EL
rypynY6FVA3OAukBNRHW2/7citKfuFFjdAhqo1ic/ilO4eK9N7qXQ8+9rKpd
z7/cjwHY7HTUpV/re9SXNrog73+YAD108/W8fCRlOx/fDd7FX9Myw5zlWidg
Dyw3+ALFZhJlb002E5+d75KsFy42muNSWZ4xDTxxNxjFP8iifZM5erVct6Ay
pmYeawLfNw+FGNnyf54X6FdRiX2OSpRnfNnwTaLMsfs0yfTx/FMMbtxtPLXP
aR96XmhMWaGWOzFUz0zosVeaSEhsqM+7XjQYNerpt1QBUoIJRfi/WkxsQILS
DY3RHw+sjaRnJDyyT3o23nYH97GLPjL/r6NbJ9IuFVQfk3Wpnvq4peQ4/byX
CSbF/xgjcBTXWCnokVl1lVTgJYQ/pHrWomA7z97V4NIHuuwTlbPolkq301x1
+OwHEQN6e9YYZw7SsUa8XMZjMmj4xiWfNDLHChWKfIjccZtewU3WWgAqJ0kZ
480LDDemt5BIcU4X1eeZZj8CzbiQVGhXAbEtuK+kmDzmqmmrJNKekeweW89e
jY7P5U2UmKHbihookok7+PJ9tSuTVFapNKf3kwOXqoJ3Hq3STuew4inccbbg
Dkr8CS4txhBKOOOSigHO19rhOYw0Idwh1Bv4ononuoarsNQG6RLKh/WrDBIs
8wVbCx8Qi6LZYt0Q/mDxn1MkohqbNdFGVgmm7lAM2SAGm1Yi9h9eMkpprtUY
FtoARLsaSTpEF6W07NWaZVQqBkdYIaFvO9mjgUj7QbWiLfGUrGzpJ8OJOGUK
diU1dAaF306u+Ow6h0jB4qm1Bb1XSB7vH0xYOYXBCmUJnD+AR4CxNXoOqM7E
Qm07j/6g2iQMMnrYm0EWz5xpU+8cQuyATFlPlreRsBHF+tss/a/bMey6wy3N
qysxGU57nDOtT93DTPPDooKHQCYpEj7A4gV4m9sB1uMtwWKP6cWkNucdF1k9
wQrGenGs4RinVWJ1t9h6a9oPEsOkhnkJ3LdqreU4L4uzLulIHT/C8cqko7A1
Xk4Z/UDrEY+BdX6kWQKVcnJVkSLZk6Nux866pnAtLMm7wmpmgk1SNTT9gDRm
JgFpKq9ufYZtVYdzBKnzNFFCP6u5MMeqRp9GScFtXJbRfPp0QEvfOlIImW+y
fF22yuHR8xevD/cOdvcPniA78jSLCLfrr5w4B82yQCRgLI15IAX1Off1ihgh
70ZZ6IcPVsOMndsjIm+PqIbaJzo3PiCisqyuV6j89m4UtcpPc2O43Sdl2Lhp
h9rGTY4ek3Iyp9I4wCXDuSG6JLWMatkpNiWydBB2bN69gSgGz86K5WoQjoZe
cqEUZ67MWqC7yaScpnWxKNVwCuQylLHbDFYdIvqn5VbjGvpsVQrAMLMZXOva
Os+iuuYS7xxLEme1WnZiVQ+Wfc7yOeYGasW7FzES9PtsV2SG0ZAkpPoJwmMV
Fhq9p9uQcm55fyNfsRkJKxYMdpAeZtEzHZXd5qXc/7++uZ9to5Yd9WWrws8i
nbIkbYUJ8j5ar8v2nC25BPkRgi0srK/CFZ120W6wpSHr9hOWOKIA6SyvcGOf
vHz+6sXrH/d2dvdeTkLdWO2Rc4kU5jYEw7qhsYAABchHptGLgmablouerhJI
MQyxHe6GgNowmv79y5yPH+ZkSylJ6Iui/3KybRrpfnRo7VE61C9zsiXcIhnw
Y51sT6ip785lfvULHH/kZOMQpv7OPsXJlpa6/YSR0OzAxc6jtYHbqG2yQfHb
1/nQOFsKRWnRRYzjqA4e0w8sdsXTIld2jObhKSlXnnwLWpde3VWo3SOLiXEz
YtDQ4H3JPDzNV601pLd60CkdrKlecYcdsVVcDuwsU8eG9MOA9zqXFEq8Si69
mFJTfyznZNJIPiVTloYVty0tkt/SvCMgDYfYcyFfotWGf+MQM8y14L/r6CUE
BRPFKyKWXKYcJKQl21J90j+s5z9qLmRjY973Y/53TeSpq0/ZhKPhuyaMgaQg
XgnNbkoETZpwLPc1dYO5wjm9BZGxxTWWFiEmb9t6VpL8HefrhwuHXj7EhEnK
xBnIJ94SHt0tEw1Fl1MkJZlsnqU2TunK03W9djmgY0tipE53RAl6hF3AmGDf
hOISdbhYIPNMwhXdsAn88GoepkIXc590tq5mI4nVTViQbw2NO1cnCB1u76ys
cgZgxnZCUYqhKMVeRiIqWFkxlwtu5Z93enNbBBoeCV0ULe4+fn5nUkKGUw0C
aTRJXh/NEa+Pz01E7lM3xDpGkhPzyLl3hjSm9RRGSRgXE2dXah7bPNbxL44h
cw0PpCySjEkD6Hd9CsNVXlrxJq4r30M6aA9pdQtJihhppDiMEbbYIh1LISRd
7M1eGAXxMHDMSjUpsoCC0qDf0hnohrv8jVQTIsui+W2lgkEbuM+9FRRHi4f0
xZCQxS7m2orkJLdqXGa3WGAuE4J9vPHEKUWCz771OdOWFxFZjlLBT8kPjnc+
SQs2X2RKF6j40DVJv5/qlTVmN7AA8C+bi2l984Ga/8dlasYrp4ma12SMbk4Z
HcsZHfEFjzmDB95gdwr45GdclJKfsR1nG4itfnydC/ljHMfc+HTEuJGcHNo0
HnOMNNYktBoLDtR44mNe5GRzSQ8crpyiggqRsWnyevjg/NHsA/JHw0iNqk9w
7SbrvdG3iwGwTA4+zs0bzM07GnD/r2S/NNnPsHBjrh+9MjHf3n/L1avJfiaC
Ko31uZzmcl00nJ0kC2oQNyoXP/w/JR/2V4/V0J/9CDEc7UOCOaRfx6lUpwiW
T3bNqYyoFXQkYyR6hK7JeYxHZnEUFasmUoStr0oQPUzXMFBdNOANBQ6KNYzF
rokaj4XYRIOdvinD8hx7doPGuQ3vlAFZM/9RsyAPwGI2B1swIQwicz+SeM4n
8rH4QHx5bqd2jGdfhTjRDUVDktkw11P9JxQJSf0+O6yN4wzJLtfHQkiTAhwk
44g42NfSubmNdiESyh6FZwSINBPDfC3tYqLMg6aWehsS7rhBYCMNXdeOVmUr
/DrvVxdjqyx2iiB+M1dNSCvAqqY51/NEyjsRlSHkRvNr7sOozSJ+YqZJNWml
okviQqRUncolAtG4v0OL6KnmJ0kRMSs4QK9wozi4DRuSq+GjU9I6XDUXOY14
iPIuL6xnHRa0Jyj7tvODlosHVt9Feyw+ypczVAlUu3hp1qH0kqZH0GssHM0c
xIOkrPN91vMsIiO97awTzK+A5Ir84s5NitaNX1XuNEqZVNIFDWFs/cuGt6+n
nR99eLKcdlkbHTc1hSOKqD44E6AWPvS7T/Xa2quMIbmYdsfSMsJcsj5aOLj9
WrWN1TCWoJQRonHhrKSZTi+jMCnyETuDJimtFKwQ0rS0SLj6SnOqWucDJAyb
kbBvW4x1mlNwoddrrWKWVHzyKpiKRp5tR46Snvf2JsxKBlG2fNceR1a+YWT/
pn4+fFWUXbOYRCJITMF3I0o4PFeIfBwJK0ZVW05AwggG1DQeP9U+v5exYxFR
oJOb43iQ0ehyMVgj1k+fRst0mpzOOtbGxHT74obIdFe9wEwMowUmddPjBhTv
D7Ope/U6udpk8obva0BUnwNmHFk+NQZWa3PDgjy81dQZA0az5+99+2F2gBFl
fw83vBAJV56NZcv750mu/K8TkK1nPpb/GGG6OWKAEewDojLZ8zGiE6bJ4E7y
+KfNAvdHqUng6La4hmr38sDbWoqxjTAyPfR52laaEuqjDS2ygBCTyj9DKvav
n0z9q8V+e77VJ2rXpUH77z40BVpEb0cuNqQ+3/vuH5X7fP0N35jk7Hf/z5bg
zMTgEzKb+cOPiypIU3cdWP6Vtrt5pH+l7d48UqRNj3YOHu09HRCnWV7NiuXm
zBT/8edMTUlTE5T3xoggYKO3PBW4Ne0J/NqN1iKEUo+bBjZ9ULZKusmNPhqF
4WZXzW9/QcKKP48RKpnO/TnIZJSKAEmOXu48+sPrw6Odo1eHr1/u/fHVHoiy
EVnYyslxEFZy28J0k0xU4Wy3xka8ZRgk1VqF54XoaaxPyFvtmvZigVqRtC0D
mgMySDlmF0l0WPt5bTr1gagtxjNWstuMrVZ47ChoNuLA7hAFPksp1gHaJOeB
et+Yh+q6tW+9H5z8hhPfILwkR7zpaPUiOqAHIh+jS1PX+xDymyG+98sgfk3t
22Es9dN8VGUa6kvXHNcNx+SPB+nULbeMW2K+Wqnsgb0HheCN35h4UzA6RcKy
tAXfWb2c+z6WTPOQPLP9akNhp/N8yaFIIR4XtmVkKZqdJWT8xXWeYv9rthUh
laBOv1b/EXEkF9mdnHqqIgenIlu3AQSaXHPsUeinc9XGSnWRplMpBcDeQ71W
4WFsb1myt/t+Mk2nZxPJ6bq6aT4Hxw+Y60F/LqDd0QDTuTT9LYvamW4NlxDG
oPukb4AA6Kr9AduXP+zF7NFCXZ9sKZ0oVNrTZF6v4BuZhTSAZAw8fm2qtQ2M
I25tA0S00vh2Ra1G1jhkf+L2KryXGB1/wpZXK0ysVcmxGc2V2sZvwk+Jza9P
uBdp9KFiNl7dMei0uiXmy+Uz7ikQNKeMc7mkMgH3MOjcEie28qTK5Dhv8oE7
clCc8T73RAKBuiSBnnMVk97zaCbzQXjRCxrHVE99SAcl5x0Po8jSRE/SvBZ3
yiRJq2Q/DznfvSvJD80mYh9/jfgqwpylNAElswoMY5JA2qDDuoS4eWJDBnVs
SaapDjGRvmhXYiWIZiIxAdUUQEEtP0SwYRnLWvxFLosAWoPE975vz2Yei6uw
r/r2AcTa+QUGUWJembarCwYK6g4HfMAZ6EXexr233m6iy5j34ys52tGGxCSs
GPOREImoz3W1euB0pjVlGJIdxvzzwuJtdxvZ+0j40zXs/SNjfjabLhQkY+y6
v2iWxq8LTRCEu+UAcENMwueMs3C4l1rdbZNkeD9KQ2NEzKuSb8eQcIZEeknB
ox11sjAbvGKFSCVIsuC3VYdKjgQSGyxT0c/PKVAeGrhG1K2NqHHjOY/boUfW
cfNppzEjvBC5aTqeik50IbUGawyFL7hliLSETE+wb2W0Haih8cZzHLc3OtJA
cdFibkzOsH86ie1ueEAjLotr7u6vZ4dMQXTtOY9YI/+xR/0Jtkrd3jkJWB9v
sky+/yWWyxSKPh0q/Mt4mYz0T2u8fFU5k92nmhxfHYzIOuvqA6Sd4/jp8Riz
Ub9UKMl522ljei4x0JCc1q/m5aUeX/tML13/gk+1RM3NwsmIh+WjOVCEy3ih
mn+EtNFjMQNjsa3Q7MWbmMxxb5CxUwy+bg2pBkmJiM90fv3dbDzER/8wLqW/
fRizYlhfJ4COWoU/O2Z8AkfipWtsmOcv08G5mBJGYd9xIDLDpxwluD5BPbFH
VvopHI8X65pID9uvH45WbaraTRchDYuKo4yJz741cIxGT8zdBfkpqE4chTi5
1bfEZS8LTAGDi7LusDc3q/utBprC94Ny2XFNm90Z926+GJjlU779VTQwD+fr
S0sM9jJ6EWStVMmBFHVA+IPtI1w4rhZ7rFuRe+520xQMc6y2cJpjhei+rNdm
0sSgTlXiaZalrY0X6e+hb1fzpR0GOhETQDfp7S0ZeTqrz7cmYeu8oDJA39+7
/2Brkm2tMEtqVq5AQvv+3t27W3dI9+p9laVfheSr+/jVJKn0GaGMq7l2sDuB
2w1zZUNstyfFAqi8xqoGquGjQDcgFeEUhwHChwcc5AZTn3NoFjx7cD9Gb29s
vqW1AkJaK+BzKdepJCNxyy6QfASAnHU4dhmZzMVqGGPQL1sX5taP6KX5F5yF
RxZuIxpDpFLqYMQraLkzb+HmDg+6oD4pGo7KpZY5ATuMiXhpjK0NAAfrZJ1o
DdjpFSLBdVEfXhe86rhZL7fIm+I0oUgDti3Lie7nhoyDkRMIglib0FaSPDF+
ix6woUOKHY2SYNj7RQkjIJ7l4wkJm7FlMgjXHkW5P+29fLrzYoCwNFFRtWst
B+2jAFKznuagk/oaxkEO42/AWd8jW4yww97Mdv7YXGuIDpLWG9eIiKkZtWhw
wlONOmvLXXuByILcSAbS+CXfckpu6VXVanq7zumuybSE/iEGnyWseKP0MGjE
hNLLh7RhSka4oSHThjuwmfOPh5mO1Pu9ielfw8Flo9e3uEhW9GEs/MbQr2qk
VUnv4owcyYe1LOmPc33kXsizfvOSOMI1p7Mpqm+kJ+zNUtmvZ1tLQCfnHG46
55utbB9/1J+gpnRJxmBS7PQTzGibR/tFRrXNhP9fwYEbR/qnta8NLukr6YP2
cfa161VUKn6Mt/KDSk7HITZF+IWRCL/xmpSegY/Ic66CZK8adbw4LDVdW1Pa
r/iG6tIfpOiOdCa8nqReX3aa6OHHFJ3+xbQvfEFl8aSKWguogDUBt6UC2yhD
0wjMaFVISRb8nx+SwgWW/ShL2pbWeeMkZhGOtSTBdq8kQcQkQgPNPedYJY0U
46LkJE3qZbjuUlz3H169/V26qXzoH/2f3ctrSeFNa6Drj4XL0vJ63PhJEkG3
sTN1gbasjWv4RXCgqGJYA0eUugVw7OnG2T/fGgiHCGli5eePRBtfsoBQSEf6
/xWy3KM1cHf017s7RztPXu48w6PiKKJt3fTYaX0uZLk/tgaNp7lhKZ8HWZy5
qJc5HPuHCtWoYzFxxo7UKBRiQZNU/yUNMKWI3OfHZ5RGsg3TcP4N1UgNPT3a
iqWPJtfHIgsbjWEhNpYptfa7fTZxXYaTJpp9i5fmjYULs3jZijAqSMvr0z77
ZF8zWKyjKJvHl1h4vq2T6Xy+IwxV8ook2Z+CBVsUoPeo1PaRxTOqRSa7dV3V
qFuWX/xcaqOEF0NonwNPnpcL+qZTwxcOtLKBXFlCmVeiSDdWL71xQBdDhocS
BskI6YGI/I98bqz/E6upAosfiQi3Tpjja/aergNfRpPSJIqy9dUZXZo3mrQl
Cd2KHvbkrsR74Eq4nRddTmWFzWRDpfgo1m0SKH6Ro2jV1liikdBukJY9OIlV
IpvWKgdUXHrIioax0f3dF0JQ2AhPQsvM3n1W/1Hf16JyMVzZhe+NVYmhhfr6
LjG+liIxJDITVajqFG1MLlNUMxBrS2LOATjq4uDYQS1yodUcAkhqoF8tt+nB
+/c+1C4mIvZSHCV2kMfUWNH4nSSVEtXZ321dtY+7E1fBKZM4Wy6eTmUCMb1h
MF44lTIgX2bxVsXqToBq32Yn1OdtlP/6KkVW+0lFe9nYSEGm6+47TVpU6/Oi
Yd3YTXlWXybmQqLXwbofS6FRd0ERAQ+1vAaevhaNxgp7SmJDkhWSz2Z1o8VJ
Mbrg+LrVHk+oBAjHD5Purcmlpx+NNr4OyG1FHX2IoYBDNOg1BZZajOJlurYW
X9lKjCemMEfJyc6GI6pJ9fCHoRUqzHN/Dqqka79Cfpm8eZMWrtAyKloPllOi
5ZpLbsl7Bz5Zw97brqiIfrJOJhe27oAOiFxYJ1uNHwj5BAXuZFkTda6YDI6O
31JdVL4yM1docDggrR1GtdUXNsbYDl7kV8s6n7OvcZVj3bUVP+KglbnawKki
oa+wRnU7uIWgcNbY/o4q75A9G5s8uEbQVITzVnKCtxAxDpAqLjE//S6HeEQ+
I5HzRnQt0+coglXeYeraJsbzyxjR3vbqBEl9ei0sSZHSlwW1qURxBrYzX88o
pL3xvS3Mpk49bPzXAV88Ka5qkQc2oVcIx7ziY5JyKBe+n9JC7AFNVg+/V+hE
GlK2Gl+O6SvnaKYrOzmnKyqYgtkchoJS6NFk3v8FP24nP1LjDRoFDgtQDI1u
uAOZmSeb8pLu4ZJiQQI5gn5ii69YQJWejH3FdaTfIIvA5UfqSaWXuuTUfPOA
OBAxWYooEOhYETrJYJClP0iXLucjdTZ5I/vSvbzwFYsoyiFOp3kgQjMVUTJP
+mJ5RK13E7+nCfd3Za3acqqhNkqxdycVM1CyXKUjCHXd98SFizPd5SZVvl6E
lHiONXPiONqB4Ymj1gPYZf3CJNJYksHX25aVHa1BiD1F04u/CdqmRdmPNKJ6
YjwerQ9jZ3RkneBkqQLDWJrLp+boiQw3GjvKOcCNHXma8dPH3PTI804PZKfy
EgxPKTfVoifyWPUhYhQ67mhWS/ZyDQ+Z/sbEvfg2ik1/XSOQ63EU9Sg5UWev
L9YRqyNZ8gRVlo13a0yBu/6a/WbzESYHdy3IOX1pA8SvPUnNZBscRRxt85ls
AO74scQBk/NxtaE5i++D4B4HI3HvI+HezzuLr/ha1L1F8Br8RGFDTErUAq9r
AE+LcEDPkzSoHlgktZO6GAMxOV+BZC6yBxk/uOUZtlFqPXvPXYvqE0qIgq1o
abQ/vtp/lLRJm0ioiPvUXPzLUjzjcwZjzjn3Xvjoi1dRDHFiVdgkixHZvSi5
XwCFzKGHn9NLkNurnlW1JKSiUWMRJDLO6bXibIMByCCpDBdYJsg4a6loD5CX
H+xLEmMCRwXEqmvmAogxBw5Z2qIBjYw8WliJgLp8eyYTVDrkymydVji3rbNt
Fo0po9BwXgL8hhxxGqwkoRBcgfIUO0BLtlpehf2dg52so/N6967MqxwUNRS2
26L/Oc8Qja84nNV1QwznFcL9Q3lODR9X1LOa0j1nsCq2o5A4C/+cZKDq2BQT
whYOb5yHaHiZWkl0aYjHaM/aCAagUQxnR2vmyZA55CUlom217LTbYnapsOM0
RfTVqEtPTpEmmoygnDd18apRghUFMkg+5+jREqRU05Rt8YSMJbyW8ZVo2rSy
fol6FvjJdpM2Oh31dMSMYbbmLdKNj24NRI9kV/mc+nxyq6H5BHNdv6KYXtqk
X/i1NzTF+b6fGt1nQzIAxFr+mZQml2dUPQsf/uwe9uqRp69Op/Bu9NX1iUzP
SbeJOj2mt9hVJ486KqRMZmiUx4q5WkomIucLY0B/BjU0YrH1yjswYLn98xEi
1sbIPEmbVmBK/KKtQ7QaLvjPnUYQ9qz2qMooZk9ei61Pmjg9n6M8t+nT3jei
3QiPlcRot5JpPMA4Ykp18BNHdm4B8R0i0C0ciK0FQpW8jVTtFpFtmA+CrKTH
PZ8F6oNNw/HvAouoAOTegWS2oRiMS4RyZEi1wZ4xqRZr0XjXsuPs++xYV30M
FFbC3aJ4Q/TyI8aYpH1RemYRORIkpJ6x9NpN0LU0u9g+cH9pFYKF7eDc6zam
Fauo3sJ9Ju36JC1ap53BzAdDL1qDNI2zdBzP6uw19WpFshbe0r7H65254ndA
rrBA8n4JjkG1wqFR04ohDohVSkH+vNdjuhSrDnTEzSPmnUFkVA8bx2IAehuU
Kh9W0kHtBXqgZOOThnxc0pOL7Kcih04YorljBADmLXAo8MIkw5Hr1bcR2b5i
WZjhzRAHIQVmtOV5CViCrOv5D3v/4Q+2eIuJwOg8gWVdFCS/9exOrl9wFGBH
kMSK1/xT4opsplcVZhyiH4Awslkp3iPBGVLdYlB1urbOrRMfYSH9imL5dFbv
eY9BKnN7PkA1YiTwvi06qifj2LsQU/bbqF+NpyLHKuxwhuG5FGtLCzkv5/Ol
lIt2AzHIJp5mBKdxqUY136xG9Up+y8couJGBJKYO4Ja0Rpg2Co6dnygVSQET
hKP50tHiy9Kuhewi5foRQYNw8rbEOMNYAzopiCRiF3tXC+stPENraKt9hVm3
4xhD9Odp+6I06D+2NKSQ6L28wS47UYkkOGuNrdiMZ7EgsRKGQueaD0tkHU/Z
fMPFcPkqhoI/w1HXHTWG6JfKNuD0EEtLsIxg4XEvLOZ4QkYt9SdKSSn+MLCf
Li1LYk5yqwxj5UssKjexHB47SnEc1GhgrpjoncFKdEpC2Cd97Lw8xzGANwnr
+UBadOhdP9dTowHtYIqzITPKLwZpxY6Dpok2tTsNaWk6fhpqTgjX+8RQQtEd
IWCuF3M+ZBBsbiZHgwvs99FyDut4dZNmrMcK8ePh0VFrUyIL3LMLSUIiJg3g
QLpxFSkWqVuR5yoBHPGhRF+dxJt0PW+dihTCYNTextj1boxtfU5BpvflgHV9
hPBjwWxjiKnQZ5f/1vuRBg0WQxOxxuMpdUJuHTQAUs7MG1ZNcVHW61ahHF+0
KBCuGKj3nJHJ1en5Inu0rFvpvsFvGZs99C6wkjowA4wBe9geob2ayedFd8bu
mq/SjKsIOvgk47y79ZLItn5NlaRYh2RTgGrgU7bGIaL+VJyYDGhdnCUrWtwE
rUbikMRu7SXI1LtaN6saG1/299sCFOvzFTqtFk2BJoYrIK3nmNRQrxvyr5Pt
Gbe+rtDPCgiOhjdlcTPQ9UqyWNCt9d2AtUIUHjEc+RmZBrSEUh9I8QSE2DtD
5EREyJCbdbT1dduTBih5jywMkgaVsmgfgv2D3kLpzTaVomgu15ye+2HPovfP
rTroqnVqjvl/uXe4dwQy3cs9kInhYPzfr3eOwrt3/7a/vTudN/mi2y6LbrH9
13U521Yrq0T4blM75/fv4bhAcFEHGLbRm3OwHB2DARMBx00M8Crt8gauNFx+
QqlqAwEiiRJjYQUjMHxMcyyQlQSIzItZ2UqXnyIyWpcdgfOxP8Zlwrx6ATIv
DFpfqNFEPB6D76l7kB38zDe6CaqBUpBp9AImL2FKINL1HvC1UyOnMirIX5Nm
K4KlwNijhejeYsJJqnGpEYjG29xqRAslrRvuto6RKWsORpO+3UmfeXT+ByB+
c8q3TztSZ7dbMqIMA8fnwO3QueAEDqEVNEVIp4BbgYkUayITfTBpkBtIkKDL
N8iPsxRasPnA/nwfQwDHJhUouXXDoKU5t0+ILdELarDcclIoX8tz8u4yv9hI
PFS6g1vNvMSTkWDGLIZtPEqyiRClxEDGiTtPuuxOXr6UMnZ01kGnwqRSxNiK
ybpfH8VDKG8wh7MfMkaEwmd0GIkQ7PdkRQuB4uMlQIKY0JUyBpj2qFqsy8dE
IPPElDSXCEbryo7fhnwQyV6rHKWUjvCiqnW8STQb0nn1SZ3290kwx7the0au
5L4JzYvhFgGuzrJN72Cnhha22+L9181h3mqJMUCuVl6+vEQvDlGdysJNTuAu
zvPmaiK++sHtRWSXT2fLIsfTZzaDJ4kEVyUkrK+qB8HREKrgtibvBKbFGoPi
9cHsdjE9nU7oGgFk68WCs3Zi9CqPfYc9z3j7buA2GORUkaA4iDKOekIVnng4
lJKUe1GXoMNS49i2ZksqaJVH0UXDaE371IimuE2+LyTQr8lOnFZECIO7bYqa
qddM4UfYg/STE9cOGpzyysJW4/Stxv1RULkjU+i6yrhNhy7B2mwEzo73TXvJ
L8wrX9F6sAPOQnpQ0/9gZfiDmpsjkbub3pCoPDXhsK2aIz1qQaAeyxDirL1+
hRoETd7nKO/5hOuCNIQ59ZhCLeTrJGk5cuEsKodsxlsyzsf9uIRX30dFbcFO
RmfHlAABWKOQw+fxSPFDHjT2MNHjn7BEplKsmLZI8NMdmJ1a+h4ZflgYO58U
UQlmGmh8oeqrb6kkkeIp7PdFdLHdKKFZU0WOZkIXs47OBX/rdI/GlFxAG4ck
VZ4jKEbxYL7lc+RSKTrMAW/NRc8EGFYLF4mHyLsOYwHYXz6rhRwGCeP0J4Fk
bbGoG8dWowMg9mi1UCPHiai0NLqvguPLo+JCSuVpR7WDhaVAwPFRy5q8FU8/
fmW1ctOFMc24PCuXqv2w4IiRih77ZXEcUddLkLQGUSIkHB49f/H6cO9gd//g
CUvXEvxvCBb1UkNhFDrtnJNkSSAHmi/J5Gbaq7cshDep/HAj1Qb6NiK6UpMq
pASFYWcMikFIRRtXVcdlyfka027RiNNx0+3esUUUDqnwW5KFWLP4yM+3BlEO
e/WGdDsU7uphXLuE51TOldZkyFFyMUDSBUuC3iIZUcE/0fvyZccBMEmVCMYH
ab0A+J4OqUFMiEbVTEJZpPmUha8kGXTXWjp98p2YOcepcmLmDBvMnLyMDSZO
3x9CDZVJ7t+70Y5A0aTjd7WxAbazMoY9l2ygHght6amCq+lgyVKGSR0838No
AfsA4+n/R37Az2g+29xsnICYpMxsjYZrf7qp8cjzJyy7TyNx+Zo0/mw8twDe
3FLn4VYQ1TNN6nl/h0mT0Xs7MXZB7nFRKTS1iWztSG3t3TaCGOKB+T67H240
wuNLDo2+z+72sIifjOAM/vC+Z4bllzeiEf88DvLvs6+pGho//D7byk9m862R
Ge59thmKxenZlqCbg+0IYCfRlr4om8iNxX1MPPWyHgaiTUcOhPkRH8drOpsh
zeFTufGcPtepPHhAEaHvOMKI4YT/ccQQTH3v229++90397/m995P0td/+1t5
3wa8f683whbS6mJ/9+G9+w++/s03WzzOPyMyMDaEL0Dvm60JpI+AHwIXaYQz
vvuilV+Q1Dzfff4QVrBiiY/u8UzsqWQHG3cEZi/FbAyfnuVr9m2Gp5iBOuM2
sZpk2JLYRhGBmDsI01yWcwk3Mtszltbj2iwotiMlWYJ6olkoaB19gxo3WZv0
I5D1dGZYEpFTqjopLEkGoHRGb8bmCMPaD6SvdmTlqQq4Cc0bEFqvqBbVnuTz
trFNQ5cOKd+f5K12ZixAj+Gye+RtLDu0+mGgp42FMqmsI4c//jMT2YmtgjSi
xEaqHQpDWNm1Gyorx4gxmNY/SU2HVOeQA2D54lLjXOY+HAxMYldZhcUSpaRB
/rTm+P1NvAISd9u1Ngla7mB6ym+cZuZLMTUJFXcOtJLAxf+3sqvpSRgIond+
xUavNtFAiDHxgAQjiMaYGBNvDSzQWChpKYj+eee9mW0thIO37rJ0Czu7nY/3
ZlgMo6RHvY6GGwamwWJp/VXc6c43Fa46yZQTSJOBxkW2Y3FsO0AuVBkRkyog
Tw8Wmpk1zoNjXF5Kw4Y3Q5EW8XSbGDuOjCUbzIRpOYzzTXXXVi2HMMiYa50w
u7UPPqAqPE8rxH+tPevsUhPWCFaLwGDrx2wQPOhdB64WdYfZMCrxlXtDpRC7
U6F4R7ueoLuw42cMdMkqmvik+8D+M2gfnEAkVlGOLFmiU8krwIr0G7BHqgSL
jdJlJ7oHdR7YRn9N6m2O6FkitlPdCtEICY/CxyElDMGK+gPcsd4XuR2wISho
kdFLjNBcjdlUpONl1G2TAksaBFxj00KtHit/YBnoNEW8pQdcJqVIabcjU1x1
29f/ugGjnoxtGbpaHay4T4e7w6EO1NbKWeJNHk2ypY/0UivVkNQWZgvzlJZ5
UVc/oDe5gd5eh66YLETKKrO/N355ZgOUE6O/D5r/DeQMFcGJq89koX9uVDj8
9PZsFqcF0+BE8vYX0b7PcRCIEYZ24u783K/kur+Ic6CdH/O4SCbsyOW5RFDd
QylnxjJGX5mmYniNPAN/hfSMIC4yQr67RxMUX9f3q+94lUn7KfmUp13Ncaag
mbkPkfwNhr5D6sfxrvULpEzqN4uuAQA=

-->

</rfc>
