<?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.1 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ppm-dap-08" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.2 -->
  <front>
    <title abbrev="DAP-PPM">Distributed Aggregation Protocol for Privacy Preserving Measurement</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ppm-dap-08"/>
    <author initials="T." surname="Geoghegan" fullname="Tim Geoghegan">
      <organization>ISRG</organization>
      <address>
        <email>timgeog+ietf@gmail.com</email>
      </address>
    </author>
    <author initials="C." surname="Patton" fullname="Christopher Patton">
      <organization>Cloudflare</organization>
      <address>
        <email>chrispatton+ietf@gmail.com</email>
      </address>
    </author>
    <author initials="E." surname="Rescorla" fullname="Eric Rescorla">
      <organization>Mozilla</organization>
      <address>
        <email>ekr@rtfm.com</email>
      </address>
    </author>
    <author initials="C. A." surname="Wood" fullname="Christopher A. Wood">
      <organization>Cloudflare</organization>
      <address>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <date year="2023" month="October" day="23"/>
    <abstract>
      <?line 89?>

<t>There are many situations in which it is desirable to take measurements of data
which people consider sensitive. In these cases, the entity taking the
measurement is usually not interested in people's individual responses but
rather in aggregated data. Conventional methods require collecting individual
responses and then aggregating them, thus representing a threat to user privacy
and rendering many such measurements difficult and impractical. This document
describes a multi-party distributed aggregation protocol (DAP) for privacy
preserving measurement (PPM) which can be used to collect aggregate data without
revealing any individual user's data.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://ietf-wg-ppm.github.io/draft-ietf-ppm-dap/draft-ietf-ppm-dap.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-ppm-dap/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Privacy Preserving Measurement Working Group mailing list (<eref target="mailto:ppm@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/ppm/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/ppm/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-ppm/draft-ietf-ppm-dap"/>.</t>
    </note>
  </front>
  <middle>
    <?line 101?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document describes the Distributed Aggregation Protocol (DAP) for privacy
preserving measurement. The protocol is executed by a large set of clients and a
small set of servers. The servers' goal is to compute some aggregate statistic
over the clients' inputs without learning the inputs themselves. This is made
possible by distributing the computation among the servers in such a way that,
as long as at least one of them executes the protocol honestly, no input is ever
seen in the clear by any server.</t>
      <section anchor="change-log">
        <name>Change Log</name>
        <t>(*) Indicates a change that breaks wire compatibility with the previous draft.</t>
        <t>08:</t>
        <ul spacing="normal">
          <li>
            <t>Clarify requirements for initializing aggregation jobs.</t>
          </li>
          <li>
            <t>Add more considerations for Sybil attacks.</t>
          </li>
          <li>
            <t>Expand guidance around choosing the VDAF verification key.</t>
          </li>
          <li>
            <t>Add an error type registry for the aggregation sub-protocol.</t>
          </li>
        </ul>
        <t>07:</t>
        <ul spacing="normal">
          <li>
            <t>Bump version tag from "dap-06" to "dap-07". This is a bug-fix revision: the
editors overlooked some changes we intended to pick up in the previous
version. (*)</t>
          </li>
        </ul>
        <t>06:</t>
        <ul spacing="normal">
          <li>
            <t>Bump draft-irtf-cfrg-vdaf-06 to 07 <xref target="VDAF"/>. (*)</t>
          </li>
          <li>
            <t>Overhaul security considerations (#488).</t>
          </li>
          <li>
            <t>Adopt revised ping-pong interface in draft-irtf-cfrg-vdaf-07 (#494).</t>
          </li>
          <li>
            <t>Add aggregation parameter to <tt>AggregateShareAad</tt> (#498). (*)</t>
          </li>
          <li>
            <t>Bump version tag from "dap-05" to "dap-06". (*)</t>
          </li>
        </ul>
        <t>05:</t>
        <ul spacing="normal">
          <li>
            <t>Bump draft-irtf-cfrg-vdaf-05 to 06 <xref target="VDAF"/>. (*)</t>
          </li>
          <li>
            <t>Specialize the protocol for two-party VDAFs (i.e., one Leader and One
Helper). Accordingly, update the aggregation sub-protocol to use the new
"ping-pong" interface for two-party VDAFs introduced in
draft-irtf-cfrg-vdaf-06. (*)</t>
          </li>
          <li>
            <t>Allow the following actions to be safely retried: aggregation job creation,
collection job creation, and requesting the Helper's aggregate share.</t>
          </li>
          <li>
            <t>Merge error types that are related.</t>
          </li>
          <li>
            <t>Drop recommendation to generate IDs using a cryptographically secure
pseudorandom number generator wherever pseudorandomness is not required.</t>
          </li>
          <li>
            <t>Require HPKE config identifiers to be unique.</t>
          </li>
          <li>
            <t>Bump version tag from "dap-04" to "dap-05". (*)</t>
          </li>
        </ul>
        <t>04:</t>
        <ul spacing="normal">
          <li>
            <t>Introduce resource oriented HTTP API. (#278, #398, #400) (*)</t>
          </li>
          <li>
            <t>Clarify security requirements for choosing VDAF verify key. (#407, #411)</t>
          </li>
          <li>
            <t>Require Clients to provide nonce and random input when sharding inputs. (#394,
#425) (*)</t>
          </li>
          <li>
            <t>Add interval of time spanned by constituent reports to Collection message.
(#397, #403) (*)</t>
          </li>
          <li>
            <t>Update share validation requirements based on latest security analysis. (#408,
#410)</t>
          </li>
          <li>
            <t>Bump draft-irtf-cfrg-vdaf-03 to 05 <xref target="VDAF"/>. (#429) (*)</t>
          </li>
          <li>
            <t>Bump version tag from "dap-03" to "dap-04". (#424) (*)</t>
          </li>
        </ul>
        <t>03:</t>
        <ul spacing="normal">
          <li>
            <t>Enrich the "fixed_size" query type to allow the Collector to request a
recently aggregated batch without knowing the batch ID in advance. ID
discovery was previously done out-of-band. (*)</t>
          </li>
          <li>
            <t>Allow Aggregators to advertise multiple HPKE configurations. (*)</t>
          </li>
          <li>
            <t>Clarify requirements for enforcing anti-replay. Namely, while it is sufficient
to detect repeated report IDs, it is also enough to detect repeated IDs and
timestamps.</t>
          </li>
          <li>
            <t>Remove the extensions from the Report and add extensions to the plaintext
payload of each ReportShare. (*)</t>
          </li>
          <li>
            <t>Clarify that extensions are mandatory to implement: If an Aggregator does not
recognize a ReportShare's extension, it must reject it.</t>
          </li>
          <li>
            <t>Clarify that Aggregators must reject any ReportShare with repeated extension
types.</t>
          </li>
          <li>
            <t>Specify explicitly how to serialize the Additional Authenticated Data (AAD)
string for HPKE encryption. This clarifies an ambiguity in the previous
version. (*)</t>
          </li>
          <li>
            <t>Change the length tag for the aggregation parameter to 32 bits. (*)</t>
          </li>
          <li>
            <t>Use the same prefix ("application") for all media types. (*)</t>
          </li>
          <li>
            <t>Make input share validation more explicit, including adding a new
ReportShareError variant, "report_too_early", for handling reports too far in
the future. (*)</t>
          </li>
          <li>
            <t>Improve alignment of problem details usage with <xref target="RFC7807"/>. Replace
"reportTooLate" problem document type with "repjortRejected" and clarify
handling of rejected reports in the upload sub-protocol. (*)</t>
          </li>
          <li>
            <t>Bump version tag from "dap-02" to "dap-03". (*)</t>
          </li>
        </ul>
        <t>02:</t>
        <ul spacing="normal">
          <li>
            <t>Define a new task configuration parameter, called the "query type", that
allows tasks to partition reports into batches in different ways. In the
current draft, the Collector specifies a "query", which the Aggregators use to
guide selection of the batch. Two query types are defined: the "time_interval"
type captures the semantics of draft 01; and the "fixed_size" type allows the
Leader to partition the reports arbitrarily, subject to the constraint that
each batch is roughly the same size. (*)</t>
          </li>
          <li>
            <t>Define a new task configuration parameter, called the task "expiration", that
defines the lifetime of a given task.</t>
          </li>
          <li>
            <t>Specify requirements for HTTP request authentication rather than a concrete
scheme. (Draft 01 required the use of the <tt>DAP-Auth-Token</tt> header; this is now
optional.)</t>
          </li>
          <li>
            <t>Make "task_id" an optional parameter of the "/hpke_config" endpoint.</t>
          </li>
          <li>
            <t>Add report count to CollectResp message. (*)</t>
          </li>
          <li>
            <t>Increase message payload sizes to accommodate VDAFs with input and aggregate
shares larger than 2^16-1 bytes. (*)</t>
          </li>
          <li>
            <t>Bump draft-irtf-cfrg-vdaf-01 to 03 <xref target="VDAF"/>. (*)</t>
          </li>
          <li>
            <t>Bump version tag from "dap-01" to "dap-02". (*)</t>
          </li>
          <li>
            <t>Rename the report nonce to the "report ID" and move it to the top of the
structure. (*)</t>
          </li>
          <li>
            <t>Clarify when it is safe for an Aggregator to evict various data artifacts from
long-term storage.</t>
          </li>
        </ul>
      </section>
      <section anchor="conventions-and-definitions">
        <name>Conventions 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?>

<dl>
          <dt>Aggregate result:</dt>
          <dd>
            <t>The output of the aggregation function computed over a batch of measurements
and an aggregation parameter. As defined in <xref target="VDAF"/>.</t>
          </dd>
          <dt>Aggregate share:</dt>
          <dd>
            <t>A share of the aggregate result emitted by an Aggregator. Aggregate shares are
reassembled by the Collector into the aggregate result, which is the final
output of the aggregation function. As defined in <xref target="VDAF"/>.</t>
          </dd>
          <dt>Aggregation function:</dt>
          <dd>
            <t>The function computed over the Clients' measurements. As defined in <xref target="VDAF"/>.</t>
          </dd>
          <dt>Aggregation parameter:</dt>
          <dd>
            <t>Parameter used to prepare a set of measurements for aggregation (e.g., the
candidate prefixes for Poplar1 from <xref section="8" sectionFormat="of" target="VDAF"/>). As defined in
<xref target="VDAF"/>.</t>
          </dd>
          <dt>Aggregator:</dt>
          <dd>
            <t>An endpoint that receives input shares from Clients and validates and
aggregates them with the help of the other Aggregators.</t>
          </dd>
          <dt>Batch:</dt>
          <dd>
            <t>A set of reports (i.e., measurements) that are aggregated into an aggregate
result.</t>
          </dd>
          <dt>Batch duration:</dt>
          <dd>
            <t>The time difference between the oldest and newest report in a batch.</t>
          </dd>
          <dt>Batch interval:</dt>
          <dd>
            <t>A parameter of a query issued by the Collector that specifies the time range
of the reports in the batch.</t>
          </dd>
          <dt>Client:</dt>
          <dd>
            <t>A party that uploads a report.</t>
          </dd>
          <dt>Collector:</dt>
          <dd>
            <t>The endpoint that selects the aggregation parameter and receives the
aggregate result.</t>
          </dd>
          <dt>Helper:</dt>
          <dd>
            <t>The Aggregator that executes the aggregation and collection sub-protocols as
instructed by the Leader.</t>
          </dd>
          <dt>Input share:</dt>
          <dd>
            <t>An Aggregator's share of a measurement. The input shares are output by the
VDAF sharding algorithm. As defined in <xref target="VDAF"/>.</t>
          </dd>
          <dt>Output share:</dt>
          <dd>
            <t>An Aggregator's share of the refined measurement resulting from successful
execution of the VDAF preparation phase. Many output shares are combined into
an aggregate share during the VDAF aggregation phase. As defined in <xref target="VDAF"/>.</t>
          </dd>
          <dt>Leader:</dt>
          <dd>
            <t>The Aggregator that coordinates aggregation and collection with the Helper.</t>
          </dd>
          <dt>Measurement:</dt>
          <dd>
            <t>A plaintext input emitted by a Client (e.g., a count, summand, or string),
before any encryption or secret sharing is applied. Depending on the VDAF in
use, multiple values may be grouped into a single measurement. As defined in
<xref target="VDAF"/>.</t>
          </dd>
          <dt>Minimum batch size:</dt>
          <dd>
            <t>The minimum number of reports in a batch.</t>
          </dd>
          <dt>Public share:</dt>
          <dd>
            <t>The output of the VDAF sharding algorithm broadcast to each of the
Aggregators. As defined in <xref target="VDAF"/>.</t>
          </dd>
          <dt>Report:</dt>
          <dd>
            <t>A cryptographically protected measurement uploaded to the Leader by a Client.
Comprised of a set of report shares.</t>
          </dd>
          <dt>Report Share:</dt>
          <dd>
            <t>An encrypted input share comprising a piece of a report.</t>
          </dd>
        </dl>
        <t>This document uses the presentation language of <xref target="RFC8446"/> to define messages
in the DAP protocol. Encoding and decoding of these messages as byte strings
also follows <xref target="RFC8446"/>.</t>
      </section>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <t>The protocol is executed by a large set of Clients and a pair of servers
referred to as "Aggregators". Each Client's input to the protocol is its
measurement (or set of measurements, e.g., counts of some user behavior). Given
the input set of measurements <tt>x_1, ..., x_n</tt> held by <tt>n</tt> Clients, and an
aggregation parameter <tt>p</tt> shared by the Aggregators, the goal of DAP is to
compute <tt>y = F(p, x_1, ..., x_n)</tt> for some function <tt>F</tt> while revealing nothing
else about the measurements. We call <tt>F</tt> the "aggregation function."</t>
      <t>This protocol is extensible and allows for the addition of new cryptographic
schemes that implement the VDAF interface specified in
<xref target="VDAF"/>. Candidates include:</t>
      <ul spacing="normal">
        <li>
          <t>Prio3 (<xref section="7" sectionFormat="of" target="VDAF"/>), which allows for aggregate statistics such as
sum, mean, histograms, etc.</t>
        </li>
        <li>
          <t>Poplar1 (<xref section="8" sectionFormat="of" target="VDAF"/>), which allows for finding the most popular
strings uploaded by a set of Clients (e.g., the URL of their home page) as
well as counting the number of Clients that hold a given string. This VDAF is
the basis of the Poplar protocol of <xref target="BBCGGI21"/>, which is designed to solve
the heavy hitters problem in a privacy preserving manner.</t>
        </li>
      </ul>
      <t>VDAFs rely on secret sharing to protect the privacy of the measurements. Rather
than sending its input in the clear, each Client shards its measurement into a
pair of "input shares" and sends an input share to each of the Aggregators. This
provides two important properties:</t>
      <ul spacing="normal">
        <li>
          <t>Given only one of the input shares, it is impossible to deduce the plaintext
measurement from which it was generated.</t>
        </li>
        <li>
          <t>It allows the Aggregators to compute the aggregation function by first
aggregating up their input shares locally into "aggregate shares", then
combining the aggregate shares into the aggregate result.</t>
        </li>
      </ul>
      <section anchor="system-architecture">
        <name>System Architecture</name>
        <t>The overall system architecture is shown in <xref target="dap-topology"/>.</t>
        <figure anchor="dap-topology">
          <name>System Architecture</name>
          <artwork><![CDATA[
+--------+
|        |
| Client +----+
|        |    |
+--------+    |
              |
+--------+    |     +------------+         +-----------+
|        |    +----->            |         |           |
| Client +---------->   Leader   <---------> Collector |
|        |    +----->            |         |           |
+--------+    |     +-----^------+         +-----------+
              |           |
+--------+    |           |
|        |    |           |
| Client +----+     +-----V------+
|        |          |            |
+--------+          |   Helper   |
                    |            |
                    +------------+
]]></artwork>
        </figure>
        <t>The main participants in the protocol are as follows:</t>
        <dl>
          <dt>Collector:</dt>
          <dd>
            <t>The entity which wants to obtain the aggregate of the measurements generated
by the Clients. Any given measurement task will have a single Collector.</t>
          </dd>
          <dt>Client(s):</dt>
          <dd>
            <t>The endpoints which directly take the measurement(s) and report them to the
DAP protocol. In order to provide reasonable levels of privacy, there must be
a large number of Clients.</t>
          </dd>
          <dt>Aggregator:</dt>
          <dd>
            <t>An endpoint which receives report shares. Each Aggregator works with its
co-Aggregator to compute the aggregate result. Any given measurement task
will have two Aggregators: a Leader and a Helper.</t>
          </dd>
          <dt>Leader:</dt>
          <dd>
            <t>The Aggregator responsible for coordinating the protocol. It receives the
reports, splits them into report shares, distributes the report shares to the
Helper, and orchestrates the process of computing the aggregate result as
requested by the Collector.</t>
          </dd>
          <dt>Helper:</dt>
          <dd>
            <t>The Aggregator assisting the Leader with the computation. The protocol is
designed so that the Helper is relatively lightweight, with most of the
operational burdern born by the Leader.</t>
          </dd>
        </dl>
        <t>The basic unit of DAP is the "task" which represents a single measurement
process (though potentially aggregating multiple batches of measurements). The
definition of a task includes the following parameters:</t>
        <ul spacing="normal">
          <li>
            <t>The type of each measurement.</t>
          </li>
          <li>
            <t>The aggregation function to compute (e.g., sum, mean, etc.).</t>
          </li>
          <li>
            <t>The set of Aggregators and necessary cryptographic keying material to use.</t>
          </li>
          <li>
            <t>The VDAF to execute, which to some extent is dictated by the previous choices.</t>
          </li>
          <li>
            <t>The minimum "batch size" of reports which can be aggregated.</t>
          </li>
          <li>
            <t>The rate at which measurements can be taken, i.e., the "minimum batch
duration".</t>
          </li>
        </ul>
        <t>These parameters are distributed to the Clients, Aggregators, and Collector
before the task begins. This document does not specify a distribution
mechanism, but it is important that all protocol participants agree on the
task's configuration. Each task is identified by a unique 32-byte ID which is
used to refer to it in protocol messages.</t>
        <t>During the lifetime of a task, each Client records its own measurement
value(s), packages them up into a report, and sends them to the Leader. Each
share is separately encrypted for each Aggregator so that even though they pass
through the Leader, the Leader is unable to see or modify them. Depending on
the task, the Client may only send one report or may send many reports over
time.</t>
        <t>The Leader distributes the shares to the Helper and orchestrates the process of
verifying them (see <xref target="validating-inputs"/>) and assembling them into a final
aggregate result for the Collector. Depending on the VDAF, it may be possible to
incrementally process each report as it comes in, or may be necessary to wait
until the entire batch of reports is received.</t>
      </section>
      <section anchor="validating-inputs">
        <name>Validating Inputs</name>
        <t>An essential task of any data collection pipeline is ensuring that the data
being aggregated is "valid". In DAP, input validation is complicated by the fact
that none of the entities other than the Client ever sees that Client's
plaintext measurement.</t>
        <t>In order to address this problem, the Aggregators engage in a secure,
multi-party computation specified by the chosen VDAF <xref target="VDAF"/> in order to
prepare a report for aggregation. At the beginning of this computation, each
Aggregator is in possession of an input share uploaded by the Client. At the end
of the computation, each Aggregator is in possession of either an "output share"
that is ready to be aggregated or an indication that a valid output share could
not be computed.</t>
        <t>To facilitate this computation, the input shares generated by the Client
include information used by the Aggregators during aggregation in order to
validate their corresponding output shares. For example, Prio3 includes a
zero-knowledge proof of the input's validity (see <xref section="7.1" sectionFormat="of" target="VDAF"/>).
which the Aggregators can jointly verify and reject the report if it cannot be
verified. However, they do not learn anything about the individual report other
than that it is valid.</t>
        <t>The specific properties attested to in the proof vary depending on the
measurement being taken. For instance, to measure the time the user took
performing a given task the proof might demonstrate that the value reported was
within a certain range (e.g., 0-60 seconds). By contrast, to report which of a
set of <tt>N</tt> options the user select, the report might contain <tt>N</tt> integers and
the proof would demonstrate that <tt>N-1</tt> were <tt>0</tt> and the other was <tt>1</tt>.</t>
        <t>It is important to recognize that "validity" is distinct from "correctness". For
instance, the user might have spent 30s on a task but the Client might report
60s. This is a problem with any measurement system and DAP does not attempt to
address it; it merely ensures that the data is within acceptable limits, so the
Client could not report 10^6s or -20s.</t>
      </section>
    </section>
    <section anchor="message-transport">
      <name>Message Transport</name>
      <t>Communications between DAP participants are carried over HTTPS <xref target="RFC9110"/>.
HTTPS provides server authentication and confidentiality. Use of HTTPS is
<bcp14>REQUIRED</bcp14>.</t>
      <section anchor="request-authentication">
        <name>HTTPS Request Authentication</name>
        <t>DAP is made up of several sub-protocols in which different subsets of the
protocol's participants interact with each other.</t>
        <t>In those cases where a channel between two participants is tunneled through
another protocol participant, DAP mandates the use of public-key encryption
using <xref target="HPKE"/> to ensure that only the intended recipient can see a
message in the clear.</t>
        <t>In other cases, DAP requires HTTPS client authentication as well as server
authentication. Any authentication scheme that is composable with HTTP is
allowed. For example:</t>
        <ul spacing="normal">
          <li>
            <t><xref target="OAuth2"/> credentials are presented in an Authorization HTTP header,
which can be added to any DAP protocol message.</t>
          </li>
          <li>
            <t>TLS client certificates can be used to authenticate the underlying transport.</t>
          </li>
          <li>
            <t>The <tt>DAP-Auth-Token</tt> HTTP header described in
<xref target="I-D.draft-dcook-ppm-dap-interop-test-design-04"/>.</t>
          </li>
        </ul>
        <t>This flexibility allows organizations deploying DAP to use existing well-known
HTTP authentication mechanisms that they already support. Discovering what
authentication mechanisms are supported by a DAP participant is outside of this
document's scope.</t>
      </section>
      <section anchor="errors">
        <name>Errors</name>
        <t>Errors can be reported in DAP both at the HTTP layer and within challenge
objects as defined in <xref target="iana-considerations"/>. DAP servers can return responses
with an HTTP error response code (4XX or 5XX). For example, if the Client
submits a request using a method not allowed in this document, then the server
<bcp14>MAY</bcp14> return HTTP status code 405 Method Not Allowed.</t>
        <t>When the server responds with an error status, it <bcp14>SHOULD</bcp14> provide additional
information using a problem detail object <xref target="RFC9457"/>. To facilitate automatic
response to errors, this document defines the following standard tokens for use
in the "type" field (within the DAP URN namespace
"urn:ietf:params:ppm:dap:error:"):</t>
        <table>
          <thead>
            <tr>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">invalidMessage</td>
              <td align="left">A message received by a protocol participant could not be parsed or otherwise was invalid.</td>
            </tr>
            <tr>
              <td align="left">unrecognizedTask</td>
              <td align="left">An endpoint received a message with an unknown task ID.</td>
            </tr>
            <tr>
              <td align="left">unrecognizedAggregationJob</td>
              <td align="left">An endpoint received a message with an unknown aggregation job ID.</td>
            </tr>
            <tr>
              <td align="left">outdatedConfig</td>
              <td align="left">The message was generated using an outdated configuration.</td>
            </tr>
            <tr>
              <td align="left">reportRejected</td>
              <td align="left">Report could not be processed for an unspecified reason.</td>
            </tr>
            <tr>
              <td align="left">reportTooEarly</td>
              <td align="left">Report could not be processed because its timestamp is too far in the future.</td>
            </tr>
            <tr>
              <td align="left">batchInvalid</td>
              <td align="left">The batch boundary check for Collector's query failed.</td>
            </tr>
            <tr>
              <td align="left">invalidBatchSize</td>
              <td align="left">There are an invalid number of reports in the batch.</td>
            </tr>
            <tr>
              <td align="left">batchQueriedTooManyTimes</td>
              <td align="left">The maximum number of batch queries has been exceeded for one or more reports included in the batch.</td>
            </tr>
            <tr>
              <td align="left">batchMismatch</td>
              <td align="left">Aggregators disagree on the report shares that were aggregated in a batch.</td>
            </tr>
            <tr>
              <td align="left">unauthorizedRequest</td>
              <td align="left">Authentication of an HTTP request failed (see <xref target="request-authentication"/>).</td>
            </tr>
            <tr>
              <td align="left">missingTaskID</td>
              <td align="left">HPKE configuration was requested without specifying a task ID.</td>
            </tr>
            <tr>
              <td align="left">stepMismatch</td>
              <td align="left">The Aggregators disagree on the current step of the DAP aggregation protocol.</td>
            </tr>
            <tr>
              <td align="left">batchOverlap</td>
              <td align="left">A request's query includes reports that were previously collected in a different batch.</td>
            </tr>
          </tbody>
        </table>
        <t>This list is not exhaustive. The server <bcp14>MAY</bcp14> return errors set to a URI other
than those defined above. Servers <bcp14>MUST NOT</bcp14> use the DAP URN namespace for errors
not listed in the appropriate IANA registry (see <xref target="urn-space"/>). The "detail"
member of the Problem Details document includes additional diagnostic
information.</t>
        <t>When the task ID is known (see <xref target="task-configuration"/>), the problem document
<bcp14>SHOULD</bcp14> include an additional "taskid" member containing the ID encoded in Base
64 using the URL and filename safe alphabet with no padding defined in
Sections <xref target="RFC4648" section="5" sectionFormat="bare"/> and <xref target="RFC4648" section="3.2" sectionFormat="bare"/> of <xref target="RFC4648"/>.</t>
        <t>In the remainder of this document, the tokens in the table above are used to
refer to error types, rather than the full URNs. For example, an "error of type
'invalidMessage'" refers to an error document with "type" value
"urn:ietf:params:ppm:dap:error:invalidMessage".</t>
        <t>This document uses the verbs "abort" and "alert with [some error message]" to
describe how protocol participants react to various error conditions. This
implies HTTP status code 400 Bad Request unless explicitly specified otherwise.</t>
      </section>
    </section>
    <section anchor="protocol-definition">
      <name>Protocol Definition</name>
      <t>DAP has three major interactions which need to be defined:</t>
      <ul spacing="normal">
        <li>
          <t>Uploading reports from the Client to the Aggregators, specified in
<xref target="upload-flow"/></t>
        </li>
        <li>
          <t>Computing the results for a given measurement task, specified in
<xref target="aggregate-flow"/></t>
        </li>
        <li>
          <t>Collecting aggregated results, specified in <xref target="collect-flow"/></t>
        </li>
      </ul>
      <t>Each of these interactions is defined in terms of "resources". In this section
we define these resources and the messages used to act on them.</t>
      <t>The following are some basic type definitions used in other messages:</t>
      <artwork><![CDATA[
/* ASCII encoded URL. e.g., "https://example.com" */
opaque Url<1..2^16-1>;

uint64 Duration; /* Number of seconds elapsed between two instants */

uint64 Time; /* seconds elapsed since start of UNIX epoch */

/* An interval of time of length duration, where start is included and (start +
duration) is excluded. */
struct {
  Time start;
  Duration duration;
} Interval;

/* An ID used to uniquely identify a report in the context of a DAP task. */
opaque ReportID[16];

/* The various roles in the DAP protocol. */
enum {
  collector(0),
  client(1),
  leader(2),
  helper(3),
  (255)
} Role;

/* Identifier for a server's HPKE configuration */
uint8 HpkeConfigId;

/* An HPKE ciphertext. */
struct {
  HpkeConfigId config_id;    /* config ID */
  opaque enc<1..2^16-1>;     /* encapsulated HPKE key */
  opaque payload<1..2^32-1>; /* ciphertext */
} HpkeCiphertext;

/* Represent a zero-length byte string. */
struct {} Empty;
]]></artwork>
      <t>DAP uses the 16-byte <tt>ReportID</tt> as the nonce parameter for the VDAF
<tt>shard</tt> and <tt>prep_init</tt> methods (see <xref section="5" sectionFormat="comma" target="VDAF"/>). Thus for a VDAF to
be compatible with DAP, it <bcp14>MUST</bcp14> specify a <tt>NONCE_SIZE</tt> of 16 bytes.</t>
      <section anchor="query">
        <name>Queries</name>
        <t>Aggregated results are computed based on sets of reports, called "batches". The
Collector influences which reports are used in a batch via a "query." The
Aggregators use this query to carry out the aggregation flow and produce
aggregate shares encrypted to the Collector.</t>
        <t>This document defines the following query types:</t>
        <artwork><![CDATA[
enum {
  reserved(0), /* Reserved for testing purposes */
  time_interval(1),
  fixed_size(2),
  (255)
} QueryType;
]]></artwork>
        <t>The time_interval query type is described in <xref target="time-interval-query"/>; the
fixed_size query type is described in <xref target="fixed-size-query"/>. Future
specifications may introduce new query types as needed (see <xref target="query-type-reg"/>).
A query includes parameters used by the Aggregators to select a batch of reports
specific to the given query type. A query is defined as follows:</t>
        <artwork><![CDATA[
opaque BatchID[32];

enum {
  by_batch_id(0),
  current_batch(1),
} FixedSizeQueryType;

struct {
  FixedSizeQueryType query_type;
  select (FixedSizeQuery.query_type) {
    by_batch_id: BatchID batch_id;
    current_batch: Empty;
  }
} FixedSizeQuery;

struct {
  QueryType query_type;
  select (Query.query_type) {
    case time_interval: Interval batch_interval;
    case fixed_size: FixedSizeQuery fixed_size_query;
  }
} Query;
]]></artwork>
        <t>The query is issued in-band as part of the collect sub-protocol
(<xref target="collect-flow"/>). Its content is determined by the "query type", which in
turn is encoded by the "query configuration" configured out-of-band. All query
types have the following configuration parameters in common:</t>
        <ul spacing="normal">
          <li>
            <t><tt>min_batch_size</tt> - The smallest number of reports the batch is allowed to
include. In a sense, this parameter controls the degree of privacy that will
be obtained: the larger the minimum batch size, the higher degree of privacy.
However, this ultimately depends on the application and the nature of the
measurements and aggregation function.</t>
          </li>
          <li>
            <t><tt>time_precision</tt> - Clients use this value to truncate their report timestamps;
see <xref target="upload-flow"/>. Additional semantics may apply, depending on the query
type. (See <xref target="batch-validation"/> for details.)</t>
          </li>
        </ul>
        <t>The parameters pertaining to specific query types are described in the relevant
subsection below.</t>
        <section anchor="time-interval-query">
          <name>Time-interval Queries</name>
          <t>The first query type, <tt>time_interval</tt>, is designed to support applications in
which reports are collected over a long period of time. The Collector specifies
a "batch interval" that determines the time range for reports included in the
batch. For each report in the batch, the time at which that report was generated
(see <xref target="upload-flow"/>) <bcp14>MUST</bcp14> fall within the batch interval specified by the
Collector.</t>
          <t>Typically the Collector issues queries for which the batch intervals are
continuous, monotonically increasing, and have the same duration. For example,
the sequence of batch intervals <tt>(1659544000, 1000)</tt>, <tt>(1659545000, 1000)</tt>,
<tt>(1659546000, 1000)</tt>, <tt>(1659547000, 1000)</tt> satisfies these conditions. (The
first element of the pair denotes the start of the batch interval and the second
denotes the duration.) Of course, there are cases in which Collector may need to
issue queries out-of-order. For example, a previous batch might need to be
queried again with a different aggregation parameter (e.g, for Poplar1). In
addition, the Collector may need to vary the duration to adjust to changing
report upload rates.</t>
        </section>
        <section anchor="fixed-size-query">
          <name>Fixed-size Queries</name>
          <t>The <tt>fixed_size</tt> query type is used to support applications in which the
Collector needs the ability to strictly control the sample size. This is
particularly important for controlling the amount of noise added to reports by
Clients (or added to aggregate shares by Aggregators) in order to achieve
differential privacy.</t>
          <t>For this query type, the Aggregators group reports into arbitrary batches such
that each batch has roughly the same number of reports. These batches are
identified by opaque "batch IDs", allocated in an arbitrary fashion by the
Leader.</t>
          <t>To get the aggregate of a batch, the Collector issues a query specifying the
batch ID of interest (see <xref target="query"/>). The Collector may not know which batch ID
it is interested in; in this case, it can also issue a query of type
<tt>current_batch</tt>, which allows the Leader to select a recent batch to aggregate.
The Leader <bcp14>SHOULD</bcp14> select a batch which has not yet began collection.</t>
          <t>In addition to the minimum batch size common to all query types, the
configuration includes a parameter <tt>max_batch_size</tt> that determines maximum
number of reports per batch.</t>
          <t>Implementation note: The goal for the Aggregators is to aggregate precisely
<tt>min_batch_size</tt> reports per batch. Doing so, however, may be challenging for
Leader deployments in which multiple, independent nodes running the aggregate
sub-protocol (see <xref target="aggregate-flow"/>) need to be coordinated. The maximum batch
size is intended to allow room for error. Typically the difference between the
minimum and maximum batch size will be a small fraction of the target batch size
for each batch.</t>
          <t>[OPEN ISSUE: It may be feasible to require a fixed batch size, i.e.,
<tt>min_batch_size == max_batch_size</tt>. We should know better once we've had some
implementation/deployment experience.]</t>
        </section>
      </section>
      <section anchor="task-configuration">
        <name>Task Configuration</name>
        <t>Prior to the start of execution of the protocol, each participant must agree on
the configuration for each task. A task is uniquely identified by its task ID:</t>
        <artwork><![CDATA[
opaque TaskID[32];
]]></artwork>
        <t>The task ID value <bcp14>MUST</bcp14> be a globally unique sequence of bytes. Each task has
the following parameters associated with it:</t>
        <ul spacing="normal">
          <li>
            <t><tt>leader_aggregator_endpoint</tt>: A URL relative to which the Leader's API
endpoints can be found.</t>
          </li>
          <li>
            <t><tt>helper_aggregator_endpoint</tt>: A URL relative to which the Helper's API
endpoints can be found.</t>
          </li>
          <li>
            <t>The query configuration for this task (see <xref target="query"/>). This determines the
query type for batch selection and the properties that all batches for this
task must have.</t>
          </li>
          <li>
            <t><tt>max_batch_query_count</tt>: The maximum number of times a batch of reports may be
queried by the Collector.</t>
          </li>
          <li>
            <t><tt>task_expiration</tt>: The time up to which Clients are expected to upload to this
task. The task is considered completed after this time. Aggregators <bcp14>MAY</bcp14> reject
reports that have timestamps later than <tt>task_expiration</tt>.</t>
          </li>
          <li>
            <t>A unique identifier for the VDAF in use for the task, e.g., one of the VDAFs
defined in <xref section="10" sectionFormat="of" target="VDAF"/>.</t>
          </li>
        </ul>
        <t>In addition, in order to facilitate the aggregation and collect protocols, each
of the Aggregators is configured with following parameters:</t>
        <ul spacing="normal">
          <li>
            <t><tt>collector_hpke_config</tt>: The <xref target="HPKE"/> configuration of the Collector
(described in <xref target="hpke-config"/>); see <xref target="compliance"/> for information about the
HPKE configuration algorithms.</t>
          </li>
          <li>
            <t><tt>vdaf_verify_key</tt>: The VDAF verification key shared by the Aggregators. This
key is used in the aggregation sub-protocol (<xref target="aggregate-flow"/>). The security
requirements are described in <xref target="verification-key"/>.</t>
          </li>
        </ul>
        <t>Finally, the Collector is configured with the HPKE secret key corresponding to
<tt>collector_hpke_config</tt>.</t>
        <t>A task's parameters are immutable for the lifetime of that task. The only way to
change parameters or to rotate secret values like collector HPKE configuration
or the VDAF verification key is to configure a new task.</t>
      </section>
      <section anchor="resource-uris">
        <name>Resource URIs</name>
        <t>DAP is defined in terms of "resources", such as reports (<xref target="upload-flow"/>),
aggregation jobs (<xref target="aggregate-flow"/>), and collection jobs (<xref target="collect-flow"/>).
Each resource has an associated URI. Resource URIs are specified by a sequence
of string literals and variables. Variables are expanded into strings according
to the following rules:</t>
        <ul spacing="normal">
          <li>
            <t>Variables <tt>{leader}</tt> and <tt>{helper}</tt> are replaced with the base URL of the
Leader and Helper respectively (the base URL is defined in
<xref target="task-configuration"/>).</t>
          </li>
          <li>
            <t>Variables <tt>{task-id}</tt>, <tt>{aggregation-job-id}</tt>, and <tt>{collection-job-id}</tt> are
replaced with the task ID (<xref target="task-configuration"/>), aggregation job ID
(<xref target="agg-init"/>), and collection job ID (<xref target="collect-init"/>) respectively. The
value <bcp14>MUST</bcp14> be encoded in its URL-safe, unpadded Base 64 representation as
specified in Sections <xref target="RFC4648" section="5" sectionFormat="bare"/> and <xref target="RFC4648" section="3.2" sectionFormat="bare"/> of <xref target="RFC4648"/>.</t>
          </li>
        </ul>
        <t>For example, resource URI <tt>{leader}/tasks/{task-id}/reports</tt> might be expanded
into
<tt>https://example.com/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/reports</tt></t>
      </section>
      <section anchor="upload-flow">
        <name>Uploading Reports</name>
        <t>Clients periodically upload reports to the Leader. Each report contains two
"report shares", one for the Leader and another for the Helper. The Helper's
report share is transmitted by the Leader during the aggregation sub-protocol
(see <xref target="aggregate-flow"/>).</t>
        <section anchor="hpke-config">
          <name>HPKE Configuration Request</name>
          <t>Before the Client can upload its report to the Leader, it must know the HPKE
configuration of each Aggregator. See <xref target="compliance"/> for information on HPKE
algorithm choices.</t>
          <t>Clients retrieve the HPKE configuration from each Aggregator by sending an HTTP
GET request to <tt>{aggregator}/hpke_config</tt>. Clients <bcp14>MAY</bcp14> specify a query parameter
<tt>task_id</tt> whose value is the task ID whose HPKE configuration they want. If the
Aggregator does not recognize the task ID, then it <bcp14>MUST</bcp14> abort with error
<tt>unrecognizedTask</tt>.</t>
          <t>An Aggregator is free to use different HPKE configurations for each task with
which it is configured. If the task ID is missing from  the Client's request,
the Aggregator <bcp14>MAY</bcp14> abort with an error of type <tt>missingTaskID</tt>, in which case
the Client <bcp14>SHOULD</bcp14> retry the request with a well-formed task ID included.</t>
          <t>An Aggregator responds to well-formed requests with HTTP status code 200 OK and
an <tt>HpkeConfigList</tt> value, with media type "application/dap-hpke-config-list".
The <tt>HpkeConfigList</tt> structure contains one or more <tt>HpkeConfig</tt> structures in
decreasing order of preference. This allows an Aggregator to support multiple
HPKE configurations simultaneously.</t>
          <t>[TODO: Allow Aggregators to return HTTP status code 403 Forbidden in deployments
that use authentication to avoid leaking information about which tasks exist.]</t>
          <artwork><![CDATA[
HpkeConfig HpkeConfigList<1..2^16-1>;

struct {
  HpkeConfigId id;
  HpkeKemId kem_id;
  HpkeKdfId kdf_id;
  HpkeAeadId aead_id;
  HpkePublicKey public_key;
} HpkeConfig;

opaque HpkePublicKey<1..2^16-1>;
uint16 HpkeAeadId; /* Defined in [HPKE] */
uint16 HpkeKemId;  /* Defined in [HPKE] */
uint16 HpkeKdfId;  /* Defined in [HPKE] */
]]></artwork>
          <t>[OPEN ISSUE: Decide whether to expand the width of the id.]</t>
          <t>Aggregators <bcp14>MUST</bcp14> allocate distinct id values for each <tt>HpkeConfig</tt> in an
<tt>HpkeConfigList</tt>.</t>
          <t>The Client <bcp14>MUST</bcp14> abort if any of the following happen for any HPKE config
request:</t>
          <ul spacing="normal">
            <li>
              <t>the GET request failed or did not return a valid HPKE config list;</t>
            </li>
            <li>
              <t>the HPKE config list is empty; or</t>
            </li>
            <li>
              <t>no HPKE config advertised by the Aggregator specifies a supported a KEM, KDF,
or AEAD algorithm triple.</t>
            </li>
          </ul>
          <t>Aggregators <bcp14>SHOULD</bcp14> use HTTP caching to permit client-side caching of this
resource <xref target="RFC5861"/>. Aggregators <bcp14>SHOULD</bcp14> favor long cache lifetimes to avoid
frequent cache revalidation, e.g., on the order of days. Aggregators can control
this cached lifetime with the Cache-Control header, as follows:</t>
          <artwork><![CDATA[
  Cache-Control: max-age=86400
]]></artwork>
          <t>Clients <bcp14>SHOULD</bcp14> follow the usual HTTP caching <xref target="RFC9111"/> semantics for HPKE
configurations.</t>
          <t>Note: Long cache lifetimes may result in Clients using stale HPKE
configurations; Aggregators <bcp14>SHOULD</bcp14> continue to accept reports with old keys for
at least twice the cache lifetime in order to avoid rejecting reports.</t>
        </section>
        <section anchor="upload-request">
          <name>Upload Request</name>
          <t>Clients upload reports by using an HTTP PUT to
<tt>{leader}/tasks/{task-id}/reports</tt>. The payload is a <tt>Report</tt>, with media type
"application/dap-report", structured as follows:</t>
          <artwork><![CDATA[
struct {
  ReportID report_id;
  Time time;
} ReportMetadata;

struct {
  ReportMetadata report_metadata;
  opaque public_share<0..2^32-1>;
  HpkeCiphertext leader_encrypted_input_share;
  HpkeCiphertext helper_encrypted_input_share;
} Report;
]]></artwork>
          <ul spacing="normal">
            <li>
              <t><tt>report_metadata</tt> is public metadata describing the report.  </t>
              <ul spacing="normal">
                <li>
                  <t><tt>report_id</tt> is used by the Aggregators to ensure the report appears in at
most one batch (see <xref target="input-share-validation"/>). The Client <bcp14>MUST</bcp14> generate
this by generating 16 random bytes using a cryptographically secure random
number generator.</t>
                </li>
                <li>
                  <t><tt>time</tt> is the time at which the report was generated. The Client <bcp14>SHOULD</bcp14>
round this value down to the nearest multiple of the task's
<tt>time_precision</tt> in order to ensure that that the timestamp cannot be used
to link a report back to the Client that generated it.</t>
                </li>
              </ul>
            </li>
            <li>
              <t><tt>public_share</tt> is the public share output by the VDAF sharding algorithm. Note
that the public share might be empty, depending on the VDAF.</t>
            </li>
            <li>
              <t><tt>leader_encrypted_input_share</tt> is the Leader's encrypted input share.</t>
            </li>
            <li>
              <t><tt>helper_encrypted_input_share</tt> is the Helper's encrypted input share.</t>
            </li>
          </ul>
          <t>Aggregators <bcp14>MAY</bcp14> require clients to authenticate when uploading reports (see
<xref target="client-auth"/>). If it is used, Client authentication <bcp14>MUST</bcp14> use a scheme that
meets the requirements in <xref target="request-authentication"/>.</t>
          <t>To generate a report, the Client begins by sharding its measurement into input
shares and the public share using the VDAF's sharding algorithm (<xref section="5.1" sectionFormat="of" target="VDAF"/>), using the report ID as the nonce:</t>
          <artwork><![CDATA[
(public_share, input_shares) = Vdaf.shard(
    measurement, /* plaintext measurement */
    report_id,   /* nonce */
    rand,        /* randomness for sharding algorithm */
)
]]></artwork>
          <t>The last input comprises the randomness consumed by the sharding algorithm. The
sharding randomness is a random byte string of length specified by the VDAF. The
Client <bcp14>MUST</bcp14> generate this using a cryptographically secure random number
generator.</t>
          <t>The Client then wraps each input share in the following structure:</t>
          <artwork><![CDATA[
struct {
  Extension extensions<0..2^16-1>;
  opaque payload<0..2^32-1>;
} PlaintextInputShare;
]]></artwork>
          <t>Field <tt>extensions</tt> is set to the list of extensions intended to be consumed by
the given Aggregator. (See <xref target="upload-extensions"/>.) Field <tt>payload</tt> is set to the
Aggregator's input share output by the VDAF sharding algorithm.</t>
          <t>Next, the Client encrypts each PlaintextInputShare <tt>plaintext_input_share</tt> as
follows:</t>
          <artwork><![CDATA[
enc, payload = SealBase(pk,
  "dap-07 input share" || 0x01 || server_role,
  input_share_aad, plaintext_input_share)
]]></artwork>
          <t>where <tt>pk</tt> is the Aggregator's public key; <tt>server_role</tt> is the Role of the
intended recipient (<tt>0x02</tt> for the Leader and <tt>0x03</tt> for the Helper),
<tt>plaintext_input_share</tt> is the Aggregator's PlaintextInputShare, and
<tt>input_share_aad</tt> is an encoded message of type InputShareAad defined below,
constructed from the same values as the corresponding fields in the report. The
<tt>SealBase()</tt> function is as specified in <xref section="6.1" sectionFormat="comma" target="HPKE"/> for the
ciphersuite indicated by the HPKE configuration.</t>
          <artwork><![CDATA[
struct {
  TaskID task_id;
  ReportMetadata report_metadata;
  opaque public_share<0..2^32-1>;
} InputShareAad;
]]></artwork>
          <t>The Leader responds to well-formed requests with HTTP status code 201
Created. Malformed requests are handled as described in <xref target="errors"/>.
Clients <bcp14>SHOULD NOT</bcp14> upload the same measurement value in more than one report if
the Leader responds with HTTP status code 201 Created.</t>
          <t>If the Leader does not recognize the task ID, then it <bcp14>MUST</bcp14> abort with error
<tt>unrecognizedTask</tt>.</t>
          <t>The Leader responds to requests whose Leader encrypted input share uses an
out-of-date or unknown <tt>HpkeConfig.id</tt> value, indicated by
<tt>HpkeCiphertext.config_id</tt>, with error of type 'outdatedConfig'. When the Client
receives an 'outdatedConfig' error, it <bcp14>SHOULD</bcp14> invalidate any cached
HpkeConfigList and retry with a freshly generated Report. If this retried upload
does not succeed, the Client <bcp14>SHOULD</bcp14> abort and discontinue retrying.</t>
          <t>If a report's ID matches that of a previously uploaded report, the Leader <bcp14>MUST</bcp14>
ignore it. In addition, it <bcp14>MAY</bcp14> alert the Client with error <tt>reportRejected</tt>. See
the implementation note in <xref target="input-share-validation"/>.</t>
          <t>The Leader <bcp14>MUST</bcp14> ignore any report pertaining to a batch that has already been
collected (see <xref target="input-share-validation"/> for details). Otherwise, comparing
the aggregate result to the previous aggregate result may result in a privacy
violation. Note that this is also enforced by the Helper during the aggregation
sub-protocol. The Leader <bcp14>MAY</bcp14> also abort the upload protocol and alert the
Client with error <tt>reportRejected</tt>.</t>
          <t>The Leader <bcp14>MAY</bcp14> ignore any report whose timestamp is past the task's
<tt>task_expiration</tt>. When it does so, it <bcp14>SHOULD</bcp14> also abort the upload protocol and
alert the Client with error <tt>reportRejected</tt>. Client <bcp14>MAY</bcp14> choose to opt out of
the task if its own clock has passed <tt>task_expiration</tt>.</t>
          <t>The Leader may need to buffer reports while waiting to aggregate them (e.g.,
while waiting for an aggregation parameter from the Collector; see
<xref target="collect-flow"/>). The Leader <bcp14>SHOULD NOT</bcp14> accept reports whose timestamps are too
far in the future. Implementors <bcp14>MAY</bcp14> provide for some small leeway, usually no
more than a few minutes, to account for clock skew. If the Leader rejects a
report for this reason, it <bcp14>SHOULD</bcp14> abort the upload protocol and alert the Client
with error <tt>reportTooEarly</tt>. In this situation, the Client <bcp14>MAY</bcp14> re-upload the
report later on.</t>
          <t>If the Leader's input share contains an unrecognized extension, or if two
extensions have the same ExtensionType, then the Leader <bcp14>MAY</bcp14> abort the upload
request with error "invalidMessage". Note that this behavior is not mandatory
because it requires the Leader to decrypt its input share.</t>
        </section>
        <section anchor="upload-extensions">
          <name>Upload Extensions</name>
          <t>Each PlaintextInputShare carries a list of extensions that Clients use to convey
additional information to the Aggregator. Some extensions might be intended for
both Aggregators; others may only be intended for a specific Aggregator. (For
example, a DAP deployment might use some out-of-band mechanism for an Aggregator
to verify that reports come from authenticated Clients. It will likely be useful
to bind the extension to the input share via HPKE encryption.)</t>
          <t>Each extension is a tag-length encoded value of the following form:</t>
          <artwork><![CDATA[
struct {
  ExtensionType extension_type;
  opaque extension_data<0..2^16-1>;
} Extension;

enum {
  TBD(0),
  (65535)
} ExtensionType;
]]></artwork>
          <t>Field "extension_type" indicates the type of extension, and "extension_data"
contains information specific to the extension.</t>
          <t>Extensions are mandatory-to-implement: If an Aggregator receives a report
containing an extension it does not recognize, then it <bcp14>MUST</bcp14> reject the report.
(See <xref target="input-share-validation"/> for details.)</t>
        </section>
      </section>
      <section anchor="aggregate-flow">
        <name>Verifying and Aggregating Reports</name>
        <t>Once a set of Clients have uploaded their reports to the Leader, the Leader can
begin the process of validating and aggregating them with the Helper. To enable
the system to handle large batches of reports, this process can be parallelized
across many "aggregation jobs" in which small subsets of the reports are
processed independently. Each aggregation job is associated with exactly one DAP
task, but a task can have many aggregation jobs.</t>
        <t>The primary objective of an aggregation job is to run the VDAF preparation
process described in <xref section="5.2" sectionFormat="comma" target="VDAF"/> for each report in the job.
Preparation has two purposes:</t>
        <ol spacing="normal" type="1"><li>
            <t>To "refine" the input shares into "output shares" that have the desired
aggregatable form. For some VDAFs, like Prio3, the mapping from input to
output shares is some fixed, linear operation, but in general the mapping is
controlled dynamically by the Collector and can be non-linear. In
Poplar1, for example, the refinement process involves a sequence of
"candidate prefixes" and the output consists of a sequence of zeros and ones,
each indicating whether the corresponding candidate is a prefix of the
measurement from which the input shares were generated.</t>
          </li>
          <li>
            <t>To verify that the output shares, when combined, correspond to a valid,
refined measurement, where validity is determined by the VDAF itself. For
example, the Prio3Sum variant of Prio3 (<xref section="7.4.2" sectionFormat="of" target="VDAF"/>) requires
that the output shares sum up to an integer in a specific range; for Poplar1,
the output shares are required to sum up to a vector that is non-zero in at
most one position.</t>
          </li>
        </ol>
        <t>In general, refinement and verification are not distinct computations, since for
some VDAFs, verification may only be achieved implicitly as a result of the
refinement process. We instead think of these as properties of the output shares
themselves: if preparation succeeds, then the resulting output shares are
guaranteed to combine into a valid, refined measurement.</t>
        <t>VDAF preparation is mapped onto an aggregation job as illustrated in
<xref target="agg-flow"/>. The protocol is comprised of a sequence of HTTP requests from the
Leader to the Helper, the first of which includes the aggregation parameter, the
Helper's report share for each report in the job, and for each report the
initialization step for preparation. The Helper's response, along with each
subsequent request and response, carries the remaining messages exchanged during
preparation.</t>
        <figure anchor="agg-flow">
          <name>Overview of the DAP aggregation sub-protocol.</name>
          <sourcecode type="ladder"><![CDATA[
  report, agg_param
   |
   v
+--------+                                         +--------+
| Leader |                                         | Helper |
+--------+                                         +--------+
   | AggregationJobInitReq:                              |
   |   agg_param, prep_init                              |
   |---------------------------------------------------->|
   |                                 AggregationJobResp: |
   |                               prep_resp(continue)   |
   |<----------------------------------------------------|
   | AggregationJobContinueReq:                          |
   |   prep_continue                                     |
   |---------------------------------------------------->|
   |                                 AggregationJobResp: |
   |                               prep_resp(continue)   |
   |<----------------------------------------------------|
   |                                                     |
  ...                                                   ...
   |                                                     |
   | AggregationJobContinueReq:                          |
   |   prep_continue                                     |
   |---------------------------------------------------->|
   |                                 AggregationJobResp: |
   |                      prep_resp(continue|finished)   |
   |<----------------------------------------------------|
   |                                                     |
   v                                                     v
  leader_out_share                         helper_out_share
]]></sourcecode>
        </figure>
        <t>The number of steps, and the type of the responses, depends on the VDAF. The
message structures and processing rules are specified in the following
subsections.</t>
        <t>In general, reports cannot be aggregated until the Collector specifies an
aggregation parameter. However, in some situations it is possible to begin
aggregation as soon as reports arrive. For example, Prio3 has just one valid
aggregation parameter (the empty string). And there are use cases for Poplar1
in which aggregation can begin immediately (i.e., those for which the candidate
prefixes/strings are fixed in advance).</t>
        <t>An aggregation job can be thought of as having three phases:</t>
        <ul spacing="normal">
          <li>
            <t>Initialization: Begin the aggregation flow by disseminating report shares and
initializing the VDAF prep state for each report.</t>
          </li>
          <li>
            <t>Continuation: Continue the aggregation flow by exchanging prep shares and
messages until preparation completes or an error occurs.</t>
          </li>
          <li>
            <t>Completion: Finish the aggregate flow, yielding an output share corresponding
to each report share in the aggregation job.</t>
          </li>
        </ul>
        <t>These phases are described in the following subsections.</t>
        <section anchor="agg-init">
          <name>Aggregate Initialization</name>
          <t>The Leader begins an aggregation job by choosing a set of candidate reports that
pertain to the same DAP task and a job ID which <bcp14>MUST</bcp14> be unique within the scope
of the task. The job ID is a 16-byte value, structured as follows:</t>
          <artwork><![CDATA[
opaque AggregationJobID[16];
]]></artwork>
          <t>The Leader can run this process for many sets of candidate reports in parallel
as needed. After choosing a set of candidates, the Leader begins aggregation by
splitting each report into report shares, one for each Aggregator. The Leader
and Helper then run the aggregate initialization flow to accomplish two tasks:</t>
          <ol spacing="normal" type="1"><li>
              <t>Recover and determine which input report shares are valid.</t>
            </li>
            <li>
              <t>For each valid report share, initialize the VDAF preparation process (see
<xref section="5.2" sectionFormat="of" target="VDAF"/>).</t>
            </li>
          </ol>
          <t>The Leader and Helper initialization behavior is detailed below.</t>
          <section anchor="leader-init">
            <name>Leader Initialization</name>
            <t>The Leader begins the aggregate initialization phase with the set of candidate
reports as follows:</t>
            <ol spacing="normal" type="1"><li>
                <t>Generate a fresh AggregationJobID.</t>
              </li>
              <li>
                <t>Decrypt the input share for each report share as described in
<xref target="input-share-decryption"/>.</t>
              </li>
              <li>
                <t>Check that the resulting input share is valid as described in
<xref target="input-share-validation"/>.</t>
              </li>
            </ol>
            <t>If any step invalidates the report, the Leader rejects the report and removes
it from the set of candidate reports.</t>
            <t>Next, for each report the Leader executes the following procedure:</t>
            <artwork><![CDATA[
(state, outbound) = Vdaf.ping_pong_leader_init(
    vdaf_verify_key,
    agg_param,
    report_id,
    public_share,
    plaintext_input_share.payload)
]]></artwork>
            <t>where:</t>
            <ul spacing="normal">
              <li>
                <t><tt>vdaf_verify_key</tt> is the VDAF verification key for the task</t>
              </li>
              <li>
                <t><tt>agg_param</tt> is the VDAF aggregation parameter provided by the Collector (see
<xref target="collect-flow"/>)</t>
              </li>
              <li>
                <t><tt>report_id</tt> is the report ID, used as the nonce for VDAF sharding</t>
              </li>
              <li>
                <t><tt>public_share</tt> is the report's public share</t>
              </li>
              <li>
                <t><tt>plaintext_input_share</tt> is the Leader's <tt>PlaintextInputShare</tt></t>
              </li>
            </ul>
            <t>The methods are defined in <xref section="5.8" sectionFormat="of" target="VDAF"/>. This process determines
the initial per-report <tt>state</tt>, as well as the initial <tt>outbound</tt> message to
send to the Helper. If <tt>state</tt> is of type <tt>Rejected</tt>, then the report is
rejected and removed from the set of candidate reports, and no message is sent
to the Helper.</t>
            <t>If <tt>state</tt> is of type <tt>Continued</tt>, then  the Leader constructs a <tt>PrepareInit</tt>
message structured as follows:</t>
            <artwork><![CDATA[
struct {
  ReportMetadata report_metadata;
  opaque public_share<0..2^32-1>;
  HpkeCiphertext encrypted_input_share;
} ReportShare;

struct {
  ReportShare report_share;
  opaque payload<0..2^32-1>;
} PrepareInit;
]]></artwork>
            <t>Each of these messages is constructed as follows:</t>
            <ul spacing="normal">
              <li>
                <t><tt>report_share.report_metadata</tt> is the report's metadata.</t>
              </li>
              <li>
                <t><tt>report_share.public_share</tt> is the report's public share.</t>
              </li>
              <li>
                <t><tt>report_share.encrypted_input_share</tt> is the intended recipient's (i.e.
Helper's) encrypted input share.</t>
              </li>
              <li>
                <t><tt>payload</tt> is set to the <tt>outbound</tt> message computed by the previous step.</t>
              </li>
            </ul>
            <t>It is not possible for <tt>state</tt> to be of type <tt>Finished</tt> during Leader
initialization.</t>
            <t>Once all the report shares have been initialized, the Leader creates an
<tt>AggregationJobInitReq</tt> message structured as follows:</t>
            <artwork><![CDATA[
struct {
  QueryType query_type;
  select (PartialBatchSelector.query_type) {
    case time_interval: Empty;
    case fixed_size: BatchID batch_id;
  };
} PartialBatchSelector;

struct {
  opaque agg_param<0..2^32-1>;
  PartialBatchSelector part_batch_selector;
  PrepareInit prepare_inits<1..2^32-1>;
} AggregationJobInitReq;
]]></artwork>
            <t>[[OPEN ISSUE: Consider sending report shares separately (in parallel) to the
aggregate instructions. Right now, aggregation parameters and the corresponding
report shares are sent at the same time, but this may not be strictly
necessary.]]</t>
            <t>This message consists of:</t>
            <ul spacing="normal">
              <li>
                <t><tt>agg_param</tt>: The VDAF aggregation parameter.</t>
              </li>
              <li>
                <t><tt>part_batch_selector</tt>: The "partial batch selector" used by the Aggregators to
determine how to aggregate each report:  </t>
                <ul spacing="normal">
                  <li>
                    <t>For <tt>fixed_size</tt> tasks, the Leader specifies a "batch ID" that determines
the batch to which each report for this aggregation job belongs.      </t>
                    <t>
[OPEN ISSUE: For fixed_size tasks, the Leader is in complete control over
which batch a report is included in. For time_interval tasks, the Client
has some control, since the timestamp determines which batch window it
falls in. Is this desirable from a privacy perspective? If not, it might
be simpler to drop the timestamp altogether and have the agg init request
specify the batch window instead.]</t>
                  </li>
                </ul>
                <t>
The indicated query type <bcp14>MUST</bcp14> match the task's query type. Otherwise, the
Helper <bcp14>MUST</bcp14> abort with error <tt>invalidMessage</tt>.  </t>
                <t>
This field is called the "partial" batch selector because, depending on the
query type, it may not determine a batch. In particular, if the query type is
<tt>time_interval</tt>, the batch is not determined until the Collector's query is
issued (see <xref target="query"/>).</t>
              </li>
              <li>
                <t><tt>prepare_inits</tt>: the sequence of <tt>PrepareInit</tt> messages constructed in the
previous step.</t>
              </li>
            </ul>
            <t>Finally, the Leader sends a PUT request to
<tt>{helper}/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}</tt>. The payload
is set to <tt>AggregationJobInitReq</tt> and the media type is set to
"application/dap-aggregation-job-init-req".</t>
            <t>The Leader <bcp14>MUST</bcp14> authenticate its requests to the Helper using a scheme that
meets the requirements in <xref target="request-authentication"/>.</t>
            <t>The Helper's response will be an <tt>AggregationJobResp</tt> message (see
<xref target="aggregation-helper-init"/>. The response's <tt>prepare_resps</tt> must include exactly
the same report IDs in the same order as the Leader's <tt>AggregationJobInitReq</tt>.
Otherwise, the Leader <bcp14>MUST</bcp14> abort the aggregation job.</t>
            <t>[[OPEN ISSUE: consider relaxing this ordering constraint. See issue#217.]]</t>
            <t>Otherwise, the Leader proceeds as follows with each report:</t>
            <ol spacing="normal" type="1"><li>
                <t>If the inbound prep response has type "continue", then the Leader computes  </t>
                <artwork><![CDATA[
(state, outbound) = Vdaf.ping_pong_leader_continued(agg_param,
                                                    prev_state,
                                                    inbound)
]]></artwork>
                <t>
where:  </t>
                <ul spacing="normal">
                  <li>
                    <t><tt>agg_param</tt> is the VDAF aggregation parameter provided by the Collector (see
<xref target="collect-flow"/>)</t>
                  </li>
                  <li>
                    <t><tt>prev_state</tt> is the state computed earlier by calling
<tt>Vdaf.ping_pong_leader_init</tt> or <tt>Vdaf.ping_pong_leader_continued</tt></t>
                  </li>
                  <li>
                    <t><tt>inbound</tt> is the message payload in the <tt>PrepareResp</tt></t>
                  </li>
                </ul>
                <t>
If <tt>outbound != None</tt>, then the Leader stores <tt>state</tt> and <tt>outbound</tt> and
proceeds to <xref target="aggregation-leader-continuation"/>. If <tt>outbound == None</tt>, then
the preparation process is complete: either <tt>state == Rejected()</tt>, in which
case the Leader rejects the report and removes it from the candidate set; or
<tt>state == Finished(out_share)</tt>, in which case preparation is complete and the
Leader stores the output share for use in the collection sub-protocol
<xref target="collect-flow"/>.</t>
              </li>
              <li>
                <t>Else if the type is "rejected", then the Leader rejects the report and
removes it from the candidate set. The Leader <bcp14>MUST NOT</bcp14> include the report in
a subsequent aggregation job, unless the error is <tt>report_too_early</tt>, in
which case the Leader <bcp14>MAY</bcp14> include the report in a subsequent aggregation job.</t>
              </li>
              <li>
                <t>Else the type is invalid, in which case the Leader <bcp14>MUST</bcp14> abort the
aggregation job.</t>
              </li>
            </ol>
            <t>(Note: Since VDAF preparation completes in a constant number of rounds, it will
never be the case that some reports are completed and others are not.)</t>
          </section>
          <section anchor="aggregation-helper-init">
            <name>Helper Initialization</name>
            <t>The Helper begins an aggregation job when it receives an <tt>AggregationJobInitReq</tt>
message from the Leader. For each <tt>PrepareInit</tt> conveyed by this message, the
Helper attempts to initialize VDAF preparation (see <xref section="5.1" sectionFormat="of" target="VDAF"/>)
just as the Leader does. If successful, it includes the result in its response
that the Leader will use to continue preparing the report.</t>
            <t>To begin this process, the Helper checks if it recognizes the task ID. If not,
then it <bcp14>MUST</bcp14> abort with error <tt>unrecognizedTask</tt>.</t>
            <t>Next, the Helper checks that the report IDs in
<tt>AggregationJobInitReq.prepare_inits</tt> are all distinct. If two preparation
initialization messages have the same report ID, then the Helper <bcp14>MUST</bcp14> abort with
error <tt>invalidMessage</tt>.</t>
            <t>The Helper is now ready to process each report share into an outbound prepare
step to return to the server. The responses will be structured as follows:</t>
            <artwork><![CDATA[
enum {
  continue(0),
  finished(1)
  reject(2),
  (255)
} PrepareRespState;

enum {
  batch_collected(0),
  report_replayed(1),
  report_dropped(2),
  hpke_unknown_config_id(3),
  hpke_decrypt_error(4),
  vdaf_prep_error(5),
  batch_saturated(6),
  task_expired(7),
  invalid_message(8),
  report_too_early(9),
  (255)
} PrepareError;

struct {
  ReportID report_id;
  PrepareRespState prepare_resp_state;
  select (PrepareResp.prepare_resp_state) {
    case continue: opaque payload<0..2^32-1>;
    case finished: Empty;
    case reject:   PrepareError prepare_error;
  };
} PrepareResp;
]]></artwork>
            <t>First the Helper preprocesses each report as follows:</t>
            <ol spacing="normal" type="1"><li>
                <t>Decrypt the input share for each report share as described in
<xref target="input-share-decryption"/>.</t>
              </li>
              <li>
                <t>Check that the resulting input share is valid as described in
<xref target="input-share-validation"/>.</t>
              </li>
            </ol>
            <t>For any report that was rejected, the Helper sets the outbound preparation
response to</t>
            <artwork><![CDATA[
struct {
  ReportID report_id;
  PrepareRespState prepare_resp_state = reject;
  PrepareError prepare_error;
} PrepareResp;
]]></artwork>
            <t>where <tt>report_id</tt> is the report ID and <tt>prepare_error</tt> is the indicated error.
For all other reports it initializes the VDAF prep state as follows (let
<tt>inbound</tt> denote the payload of the prep step sent by the Leader):</t>
            <artwork><![CDATA[
(state, outbound) = Vdaf.ping_pong_helper_init(vdaf_verify_key,
                                               agg_param,
                                               report_id,
                                               public_share,
                                               plaintext_input_share.payload)
]]></artwork>
            <t>where:</t>
            <ul spacing="normal">
              <li>
                <t><tt>vdaf_verify_key</tt> is the VDAF verification key for the task</t>
              </li>
              <li>
                <t><tt>agg_param</tt> is the VDAF aggregation parameter sent in the
<tt>AggregationJobInitReq</tt></t>
              </li>
              <li>
                <t><tt>report_id</tt> is the report ID</t>
              </li>
              <li>
                <t><tt>public_share</tt> is the report's public share</t>
              </li>
              <li>
                <t><tt>plaintext_input_share</tt> is the Helper's <tt>PlaintextInputShare</tt></t>
              </li>
            </ul>
            <t>This procedure determines the initial per-report <tt>state</tt>, as well as the
initial <tt>outbound</tt> message to send in response to the Leader. If <tt>state</tt> is of
type <tt>Rejected</tt>, then the Helper responds with</t>
            <artwork><![CDATA[
struct {
  ReportID report_id;
  PrepareRespState prepare_resp_state = reject;
  PrepareError prepare_error = vdaf_prep_error;
} PrepareResp;
]]></artwork>
            <t>Otherwise the Helper responds with</t>
            <artwork><![CDATA[
struct {
  ReportID report_id;
  PrepareRespState prepare_resp_state = continue;
  opaque payload<0..2^32-1> = outbound;
} PrepareResp;
]]></artwork>
            <t>Finally, the Helper creates an <tt>AggregationJobResp</tt> to send to the Leader. This
message is structured as follows:</t>
            <artwork><![CDATA[
struct {
  PrepareResp prepare_resps<1..2^32-1>;
} AggregationJobResp;
]]></artwork>
            <t>where <tt>prepare_resps</tt> are the outbound prep steps computed in the previous step.
The order <bcp14>MUST</bcp14> match <tt>AggregationJobInitReq.prepare_inits</tt>.</t>
            <t>The Helper responds to the Leader with HTTP status code 201 Created and a body
consisting of the <tt>AggregationJobResp</tt>, with media type
"application/dap-aggregation-job-resp".</t>
            <t>Changing an aggregation job's parameters is illegal, so further requests to
<tt>PUT /tasks/{tasks}/aggregation_jobs/{aggregation-job-id}</tt> for the same
<tt>aggregation-job-id</tt> but with a different <tt>AggregationJobInitReq</tt> in the body
<bcp14>MUST</bcp14> fail with an HTTP client error status code.</t>
            <t>Additionally, it is not possible to rewind or reset the state of an aggregation
job. Once an aggregation job has been continued at least once (see
<xref target="agg-continue-flow"/>), further requests to initialize that aggregation job <bcp14>MUST</bcp14>
fail with an HTTP client error status code.</t>
            <t>Finally, if <tt>state == Continued(prep_state)</tt>, then the Helper stores <tt>state</tt> to
prepare for the next continuation step (<xref target="aggregation-helper-continuation"/>).
Otherwise, if <tt>state == Finished(out_share)</tt>, then the Helper stores <tt>out_share</tt>
for use in the collection sub-protocol (<xref target="collect-flow"/>).</t>
          </section>
          <section anchor="input-share-decryption">
            <name>Input Share Decryption</name>
            <t>Each report share has a corresponding task ID, report metadata (report ID and,
timestamp), public share, and the Aggregator's encrypted input share. Let
<tt>task_id</tt>, <tt>report_metadata</tt>, <tt>public_share</tt>, and <tt>encrypted_input_share</tt>
denote these values, respectively. Given these values, an Aggregator decrypts
the input share as follows. First, it constructs an <tt>InputShareAad</tt> message
from <tt>task_id</tt>, <tt>report_metadata</tt>, and <tt>public_share</tt>. Let this be denoted by
<tt>input_share_aad</tt>. Then, the Aggregator looks up the HPKE config and
corresponding secret key indicated by <tt>encrypted_input_share.config_id</tt> and
attempts decryption of the payload with the following procedure:</t>
            <artwork><![CDATA[
plaintext_input_share = OpenBase(encrypted_input_share.enc, sk,
  "dap-07 input share" || 0x01 || server_role,
  input_share_aad, encrypted_input_share.payload)
]]></artwork>
            <t>where <tt>sk</tt> is the HPKE secret key, and <tt>server_role</tt> is the role of the
Aggregator (<tt>0x02</tt> for the Leader and <tt>0x03</tt> for the Helper). The <tt>OpenBase()</tt>
function is as specified in <xref section="6.1" sectionFormat="comma" target="HPKE"/> for the ciphersuite indicated
by the HPKE configuration. If decryption fails, the Aggregator marks the report
share as invalid with the error <tt>hpke_decrypt_error</tt>. Otherwise, the Aggregator
outputs the resulting PlaintextInputShare <tt>plaintext_input_share</tt>.</t>
          </section>
          <section anchor="input-share-validation">
            <name>Input Share Validation</name>
            <t>Validating an input share will either succeed or fail. In the case of failure,
the input share is marked as invalid with a corresponding PrepareError.</t>
            <t>Before beginning the preparation step, Aggregators are required to perform the
following checks:</t>
            <ol spacing="normal" type="1"><li>
                <t>Check that the input share can be decoded as specified by the VDAF. If not,
the input share <bcp14>MUST</bcp14> be marked as invalid with the error <tt>invalid_message</tt>.</t>
              </li>
              <li>
                <t>Check if the report is too far into the future. Implementors can provide for
some small leeway, usually no more than a few minutes, to account for clock
skew. If a report is rejected for this reason, the Aggregator <bcp14>SHOULD</bcp14> mark the
input share as invalid with the error <tt>report_too_early</tt>.</t>
              </li>
              <li>
                <t>Check if the report's timestamp has passed the task's <tt>task_expiration</tt> time.
If so, the Aggregator <bcp14>MAY</bcp14> mark the input share as invalid with the error
<tt>task_expired</tt>.</t>
              </li>
              <li>
                <t>Check if the PlaintextInputShare contains unrecognized extensions. If so, the
Aggregator <bcp14>MUST</bcp14> mark the input share as invalid with error <tt>invalid_message</tt>.</t>
              </li>
              <li>
                <t>Check if the ExtensionType of any two extensions in PlaintextInputShare are
the same. If so, the Aggregator <bcp14>MUST</bcp14> mark the input share as invalid with
error <tt>invalid_message</tt>.</t>
              </li>
              <li>
                <t>Check if the report may still be aggregated with the current aggregation
parameter. This can be done by looking up all aggregation parameters
previously used for this report and calling  </t>
                <artwork><![CDATA[
Vdaf.is_valid(current_agg_param, previous_agg_params)
]]></artwork>
                <t>
If this returns false, the input share <bcp14>MUST</bcp14> be marked as invalid with the
error <tt>report_replayed</tt>.  </t>
                <ul spacing="normal">
                  <li>
                    <t>Implementation note: To detect replay attacks, each Aggregator is required
to keep track of the set of reports it has processed for a given task.
Because honest Clients choose the report ID at random, it is sufficient to
store the set of IDs of processed reports. However, implementations may
find it helpful to track additional information, like the timestamp, so
that the storage used for anti-replay can be sharded efficiently.</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>If the report pertains to a batch that was previously collected, then make
sure the report was already included in all previous collections for the
batch. If not, the input share <bcp14>MUST</bcp14> be marked as invalid with error
<tt>batch_collected</tt>. This prevents Collectors from learning anything about
small numbers of reports that are uploaded between two collections of a
batch.  </t>
                <ul spacing="normal">
                  <li>
                    <t>Implementation note: The Leader considers a batch to be collected once it
has completed a collection job for a CollectionReq message from the
Collector; the Helper considers a batch to be collected once it has
responded to an <tt>AggregateShareReq</tt> message from the Leader. A batch is
determined by query (<xref target="query"/>) conveyed in these messages. Queries must
satisfy the criteria covered in <xref target="batch-validation"/>. These criteria are
meant to restrict queries in a way make it easy to determine wither a
report pertains to a batch that was collected.      </t>
                    <t>
[TODO: If a section to clarify report and batch states is added this can be
removed. See Issue #384]</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>Depending on the query type for the task, additional checks may be
applicable:  </t>
                <ul spacing="normal">
                  <li>
                    <t>For <tt>fixed_size</tt> tasks, the Aggregators need to ensure that each batch is
roughly the same size. If the number of reports aggregated for the current
batch exceeds the maximum batch size (per the task configuration), the
Aggregator <bcp14>MAY</bcp14> mark the input share as invalid with the error
<tt>batch_saturated</tt>. Note that this behavior is not strictly enforced here
but during the collect sub-protocol. (See <xref target="batch-validation"/>.) If both
checks succeed, the input share is not marked as invalid.</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>Finally, if an Aggregator cannot determine if an input share is valid, it
<bcp14>MUST</bcp14> mark the input share as invalid with error <tt>report_dropped</tt>. For
example, if the Aggregator has evicted the state required to perform the
check from long-term storage. (See <xref target="reducing-storage-requirements"/> for
details.)</t>
              </li>
            </ol>
            <t>If all of the above checks succeed, the input share is not marked as invalid.</t>
          </section>
        </section>
        <section anchor="agg-continue-flow">
          <name>Aggregate Continuation</name>
          <t>In the continuation phase, the Leader drives the VDAF preparation of each report
in the candidate report set until the underlying VDAF moves into a terminal
state, yielding an output share for both Aggregators or a rejection.</t>
          <t>Whether this phase is reached depends on the VDAF: for 1-round VDAFs, like
Prio3, processing has already completed. Continuation is required for VDAFs
that require more than one round.</t>
          <section anchor="aggregation-leader-continuation">
            <name>Leader Continuation</name>
            <t>The Leader begins each step of aggregation continuation with a prep state object
<tt>state</tt> and an outbound message <tt>outbound</tt> for each report in the candidate set.</t>
            <t>The Leader advances its aggregation job to the next step (step 1 if this is the
first continuation after initialization). Then it instructs the Helper to
advance the aggregation job to the step the Leader has just reached. For each
report the Leader constructs a preparation continuation message:</t>
            <artwork><![CDATA[
struct {
  ReportID report_id;
  opaque payload<0..2^32-1>;
} PrepareContinue;
]]></artwork>
            <t>where <tt>report_id</tt> is the report ID associated with <tt>state</tt> and <tt>outbound</tt>, and
<tt>payload</tt> is set to the <tt>outbound</tt> message.</t>
            <t>Next, the Leader sends a POST request to the aggregation job URI used during
initialization (see <xref target="leader-init"/>) with media type
"application/dap-aggregation-job-continue-req" and body structured as:</t>
            <artwork><![CDATA[
struct {
  uint16 step;
  PrepareContinue prepare_continues<1..2^32-1>;
} AggregationJobContinueReq;
]]></artwork>
            <t>The <tt>step</tt> field is the step of DAP aggregation that the Leader just reached and
wants the Helper to advance to. The <tt>prepare_continues</tt> field is the sequence of
preparation continuation messages constructed in the previous step. The
<tt>PrepareContinue</tt>s <bcp14>MUST</bcp14> be in the same order as the previous aggregate request.</t>
            <t>The Leader <bcp14>MUST</bcp14> authenticate its requests to the Helper using a scheme that
meets the requirements in <xref target="request-authentication"/>.</t>
            <t>The Helper's response will be an <tt>AggregationJobResp</tt> message (see
<xref target="aggregation-helper-init"/>). The response's <tt>prepare_resps</tt> must include
exactly the same report IDs in the same order as the Leader's
<tt>AggregationJobContinueReq</tt>. Otherwise, the Leader <bcp14>MUST</bcp14> abort the aggregation
job.</t>
            <t>[[OPEN ISSUE: consider relaxing this ordering constraint. See issue#217.]]</t>
            <t>Otherwise, the Leader proceeds as follows with each report:</t>
            <ol spacing="normal" type="1"><li>
                <t>If the inbound prep response type is "continue" and the state is
<tt>Continued(prep_state)</tt>, then the Leader computes  </t>
                <artwork><![CDATA[
(state, outbound) = Vdaf.ping_pong_leader_continued(agg_param,
                                                    state,
                                                    inbound)
]]></artwork>
                <t>
where <tt>inbound</tt> is the message payload. If <tt>outbound != None</tt>, then the
Leader stores <tt>state</tt> and <tt>outbound</tt> and proceeds to another continuation
step. If <tt>outbound == None</tt>, then the preparation process is complete: either
<tt>state == Rejected()</tt>, in which case the Leader rejects the report and
removes it from the candidate set; or <tt>state == Finished(out_share)</tt>, in
which case preparation is complete and the Leader stores the output share for
use in the collection sub-protocol <xref target="collect-flow"/>.</t>
              </li>
              <li>
                <t>Else if the type is "finished" and <tt>state == Finished(out_share)</tt>, then
preparation is complete and the Leader stores the output share for use in
the collection flow (<xref target="collect-flow"/>).</t>
              </li>
              <li>
                <t>Else if the type is "reject", then the Leader rejects the report and removes
it from the candidate set.</t>
              </li>
              <li>
                <t>Else the type is invalid, in which case the Leader <bcp14>MUST</bcp14> abort the
aggregation job.</t>
              </li>
            </ol>
          </section>
          <section anchor="aggregation-helper-continuation">
            <name>Helper Continuation</name>
            <t>The Helper begins each step of continuation with a sequence of <tt>state</tt> objects,
which will be <tt>Continued(prep_state)</tt>, one for each report in the candidate set.</t>
            <t>The Helper awaits an HTTP POST request to the aggregation job URI from the
Leader, the body of which is an <tt>AggregationJobContinueReq</tt> as specified in
<xref target="aggregation-leader-continuation"/>.</t>
            <t>Next, it checks that it recognizes the task ID. If not, then it <bcp14>MUST</bcp14> abort with
error <tt>unrecognizedTask</tt>.</t>
            <t>Next, it checks if it recognizes the indicated aggregation job ID. If not, it
<bcp14>MUST</bcp14> abort with error <tt>unrecognizedAggregationJob</tt>.</t>
            <t>Next, the Helper checks that:</t>
            <ol spacing="normal" type="1"><li>
                <t>the report IDs are all distinct</t>
              </li>
              <li>
                <t>each report ID corresponds to one of the <tt>state</tt> objects</t>
              </li>
              <li>
                <t><tt>AggregationJobContinueReq.step</tt> is not equal to <tt>0</tt></t>
              </li>
            </ol>
            <t>If any of these checks fail, then the Helper <bcp14>MUST</bcp14> abort with error
<tt>invalidMessage</tt>. Additionally, if any prep step appears out of order relative
to the previous request, then the Helper <bcp14>MAY</bcp14> abort with error <tt>invalidMessage</tt>.
(Note that a report may be missing, in which case the Helper should assume the
Leader rejected it.)</t>
            <t>[OPEN ISSUE: Issue 438: It may be useful for the Leader to explicitly signal
rejection.]</t>
            <t>Next, the Helper checks if the continuation step indicated by the request is
correct. (For the first <tt>AggregationJobContinueReq</tt> the value should be <tt>1</tt>;
for the second the value should be <tt>2</tt>; and so on.) If the Leader is one step
behind (e.g., the Leader has resent the previous HTTP request), then the Helper
<bcp14>MAY</bcp14> attempt to recover by re-sending the previous <tt>AggregationJobResp</tt>. In this
case it <bcp14>SHOULD</bcp14> verify that the contents of the <tt>AggregationJobContinueReq</tt> are
identical to the previous message (see <xref target="aggregation-step-skew-recovery"/>).
Otherwise, if the step is incorrect, the Helper <bcp14>MUST</bcp14> abort with error
<tt>stepMismatch</tt>.</t>
            <t>The Helper is now ready to continue preparation for each report. Let <tt>inbound</tt>
denote the payload of the prep step. The Helper computes the following:</t>
            <artwork><![CDATA[
(state, outbound) = Vdaf.ping_pong_helper_continued(agg_param,
                                                    state,
                                                    inbound)
]]></artwork>
            <t>If <tt>state == Rejected()</tt>, then the Helper's response is</t>
            <artwork><![CDATA[
struct {
  ReportID report_id;
  PrepareRespState prepare_resp_state = reject;
  PrepareError prepare_error = vdaf_prep_error;
} PrepareResp;
]]></artwork>
            <t>Otherwise, if <tt>outbound != None</tt>, then the Helper's response is</t>
            <artwork><![CDATA[
struct {
  ReportID report_id;
  PrepareRespState prepare_resp_state = continue;
  opaque payload<0..2^32-1> = outbound;
} PrepareResp;
]]></artwork>
            <t>Otherwise, if <tt>outbound == None</tt>, then the Helper's resposne is</t>
            <artwork><![CDATA[
struct {
  ReportID report_id;
  PrepareRespState prepare_resp_state = finished;
} PrepareResp;
]]></artwork>
            <t>Next, the Helper constructs an <tt>AggregationJobResp</tt> message
(<xref target="aggregation-helper-init"/>) with each prep step. The order of the prep steps
<bcp14>MUST</bcp14> match the Leader's request. It responds to the Leader with HTTP status 200
OK, media type <tt>application/dap-aggregation-job-resp</tt>, and a body consisting of
the <tt>AggregationJobResp</tt>.</t>
            <t>Finally, if <tt>state == Continued(prep_state)</tt>, then the Helper stores <tt>state</tt> to
prepare for the next continuation step (<xref target="aggregation-helper-continuation"/>).
Otherwise, if <tt>state == Finished(out_share)</tt>, then the Helper stores <tt>out_share</tt>
for use in the collection sub-protocol (<xref target="collect-flow"/>).</t>
          </section>
          <section anchor="aggregation-step-skew-recovery">
            <name>Recovering from Aggregation Step Skew</name>
            <t><tt>AggregationJobContinueReq</tt> messages contain a <tt>step</tt> field, allowing
Aggregators to ensure that their peer is on an expected step of the DAP
aggregation protocol. In particular, the intent is to allow recovery from a
scenario where the Helper successfully advances from step <tt>n</tt> to <tt>n+1</tt>, but its
<tt>AggregationJobResp</tt> response to the Leader gets dropped due to something like a
transient network failure. The Leader could then resend the request to have the
Helper advance to step <tt>n+1</tt> and the Helper should be able to retransmit the
<tt>AggregationJobContinueReq</tt> that was previously dropped. To make that kind of
recovery possible, Aggregator implementations <bcp14>SHOULD</bcp14> checkpoint the most recent
step's prep state and messages to durable storage such that the Leader can
re-construct continuation requests and the Helper can re-construct continuation
responses as needed.</t>
            <t>When implementing an aggregation step skew recovery strategy, the Helper <bcp14>SHOULD</bcp14>
ensure that the Leader's <tt>AggregationJobContinueReq</tt> message did not change when
it was re-sent (i.e., the two messages must be identical). This prevents the
Leader from re-winding an aggregation job and re-running an aggregation step
with different parameters.</t>
            <t>[[OPEN ISSUE: Allowing the Leader to "rewind" aggregation job state of the
Helper may allow an attack on privacy. For instance, if the VDAF verification
key changes, the prep shares in the Helper's response would change even if the
consistency check is made. Security analysis is required. See #401.]]</t>
            <t>One way the Helper could address this would be to store a digest of the Leader's
request, indexed by aggregation job ID and step, and refuse to service a request
for a given aggregation step unless it matches the previously seen request (if
any).</t>
          </section>
        </section>
      </section>
      <section anchor="collect-flow">
        <name>Collecting Results</name>
        <t>In this phase, the Collector requests aggregate shares from each Aggregator and
then locally combines them to yield a single aggregate result. In particular,
the Collector issues a query to the Leader (<xref target="query"/>), which the Aggregators
use to select a batch of reports to aggregate. Each Aggregator emits an
aggregate share encrypted to the Collector so that it can decrypt and combine
them to yield the aggregate result. This entire process is composed of two
interactions:</t>
        <ol spacing="normal" type="1"><li>
            <t>Collect request and response between the Collector and Leader, specified in
<xref target="collect-init"/></t>
          </li>
          <li>
            <t>Aggregate share request and response between the Leader and the Helper,
specified in <xref target="collect-aggregate"/></t>
          </li>
        </ol>
        <t>Once complete, the Collector computes the final aggregate result as specified in
<xref target="collect-finalization"/>.</t>
        <t>This overall process is referred to as a "collection job".</t>
        <section anchor="collect-init">
          <name>Collection Job Initialization</name>
          <t>First, the Collector chooses a collection job ID:</t>
          <artwork><![CDATA[
opaque CollectionJobID[16];
]]></artwork>
          <t>This ID value <bcp14>MUST</bcp14> be unique within the scope of the corresponding DAP task.</t>
          <t>To initiate the collection job, the collector issues a PUT request to
<tt>{leader}/tasks/{task-id}/collection_jobs/{collection-job-id}</tt>. The body of the
request has media type "application/dap-collect-req", and it is structured as
follows:</t>
          <artwork><![CDATA[
struct {
  Query query;
  opaque agg_param<0..2^32-1>; /* VDAF aggregation parameter */
} CollectionReq;
]]></artwork>
          <t>The named parameters are:</t>
          <ul spacing="normal">
            <li>
              <t><tt>query</tt>, the Collector's query. The indicated query type <bcp14>MUST</bcp14> match the task's
query type. Otherwise, the Leader <bcp14>MUST</bcp14> abort with error "invalidMessage".</t>
            </li>
            <li>
              <t><tt>agg_param</tt>, an aggregation parameter for the VDAF being executed. This is the
same value as in <tt>AggregationJobInitReq</tt> (see <xref target="leader-init"/>).</t>
            </li>
          </ul>
          <t>Collectors <bcp14>MUST</bcp14> authenticate their requests to Leaders using a scheme that meets
the requirements in <xref target="request-authentication"/>.</t>
          <t>Depending on the VDAF scheme and how the Leader is configured, the Leader and
Helper may already have prepared a sufficient number of reports satisfying the
query and be ready to return the aggregate shares right away. However, this is
not always the case. In fact, for some VDAFs, it is not be possible to begin
running aggregation jobs (<xref target="aggregate-flow"/>) until the Collector initiates a
collection job. This is because, in general, the aggregation parameter is not
known until this point. In certain situations it is possible to predict the
aggregation parameter in advance. For example, for Prio3 the only valid
aggregation parameter is the empty string. For these reasons, the collection
job is handled asynchronously.</t>
          <t>Upon receipt of a <tt>CollectionReq</tt>, the Leader begins by checking that it
recognizes the task ID in the request path. If not, it <bcp14>MUST</bcp14> abort with error
<tt>unrecognizedTask</tt>.</t>
          <t>The Leader <bcp14>MAY</bcp14> further validate the request according to the requirements in
<xref target="batch-validation"/> and abort with the indicated error, though some conditions
such as the number of valid reports may not be verifiable while handling the
CollectionReq message, and the batch will have to be re-validated later on
regardless.</t>
          <t>If the Leader finds the CollectionReq to be valid, it immediately responds with
HTTP status 201.</t>
          <t>The Leader then begins working with the Helper to aggregate the reports
satisfying the query (or continues this process, depending on the VDAF) as
described in <xref target="aggregate-flow"/>.</t>
          <t>Changing a collection job's parameters is illegal, so further requests to
<tt>PUT /tasks/{tasks}/collection_jobs/{collection-job-id}</tt> for the same
<tt>collection-job-id</tt> but with a different <tt>CollectionReq</tt> in the body <bcp14>MUST</bcp14> fail
with an HTTP client error status code.</t>
          <t>After receiving the response to its <tt>CollectionReq</tt>, the Collector makes an HTTP
<tt>POST</tt> request to the collection job URI to check on the status of the collect
job and eventually obtain the result. If the collection job is not finished
yet, the Leader responds with HTTP status 202 Accepted. The response <bcp14>MAY</bcp14> include
a Retry-After header field to suggest a polling interval to the Collector.</t>
          <t>Asynchronously from any request from the Collector, the Leader attempts to run
the collection job. It first checks whether it can construct a batch for the
collection job by applying the requirements in <xref target="batch-validation"/>. If so, then
the Leader obtains the Helper's aggregate share following the aggregate-share
request flow described in <xref target="collect-aggregate"/>. If not, it either aborts the
collection job or tries again later, depending on which requirement in
<xref target="batch-validation"/> was not met. If the Leader has a pending aggregation job
that overlaps with the batch for the collection job, the Leader <bcp14>MUST</bcp14> first
complete the aggregation job before proceeding and requesting an aggregate share
from the Helper. After the collection job has been created, the Leader <bcp14>MUST NOT</bcp14>
schedule new aggregation jobs that overlap with the batch for the collection
job. This avoids a race condition between aggregation and collection jobs that
can yield trivial batch mismatch errors.</t>
          <t>Once both aggregate shares are successfully obtained, the Leader responds to
subsequent HTTP POST requests to the collection job with HTTP status code 200 OK
and a body consisting of a <tt>Collection</tt>:</t>
          <artwork><![CDATA[
struct {
  PartialBatchSelector part_batch_selector;
  uint64 report_count;
  Interval interval;
  HpkeCiphertext leader_encrypted_agg_share;
  HpkeCiphertext helper_encrypted_agg_share;
} Collection;
]]></artwork>
          <t>The body's media type is "application/dap-collection". The <tt>Collection</tt>
structure includes the following:</t>
          <ul spacing="normal">
            <li>
              <t><tt>part_batch_selector</tt>: Information used to bind the aggregate result to the
query. For fixed_size tasks, this includes the batch ID assigned to the batch
by the Leader. The indicated query type <bcp14>MUST</bcp14> match the task's query type.  </t>
              <t>
[OPEN ISSUE: What should the Collector do if the query type doesn't match?]</t>
            </li>
            <li>
              <t><tt>report_count</tt>: The number of reports included in the batch.</t>
            </li>
            <li>
              <t><tt>interval</tt>: The smallest interval of time that contains the timestamps of all
reports included in the batch, such that the interval's start and duration are
both multiples of the task's <tt>time_precision</tt> parameter. Note that in the case
of a <tt>time_interval</tt> type query (see <xref target="query"/>), this interval can be smaller
than the one in the corresponding <tt>CollectionReq.query</tt>.</t>
            </li>
            <li>
              <t><tt>leader_encrypted_agg_share</tt>: The Leader's aggregate share, encrypted to the
Collector.</t>
            </li>
            <li>
              <t><tt>helper_encrypted_agg_share</tt>: The Helper's aggregate share, encrypted to the
Collector.</t>
            </li>
          </ul>
          <t>If obtaining aggregate shares fails, then the Leader responds to subsequent HTTP
POST requests to the collection job with an HTTP error status and a problem
document as described in <xref target="errors"/>.</t>
          <t>The Leader <bcp14>MAY</bcp14> respond with HTTP status 204 No Content to requests to a
collection job if the results have been deleted.</t>
          <t>The Collector can send an HTTP DELETE request to the collection job, which
indicates to the Leader that it can abandon the collection job and discard all
state related to it.</t>
          <section anchor="a-note-on-idempotence">
            <name>A Note on Idempotence</name>
            <t>The reason a POST is used to poll the state of a collection job instead of a
GET is because of the fixed-size query mode (see <xref target="fixed-size-query"/>).
Collectors may make a query against the current batch, and it is the Leader's
responsibility to keep track of what batch is current for some task. Polling a
collection job is the only point at which it is safe for the Leader to change
its set of current batches, since it constitutes acknowledgement on the
Collector's part that it received the response to some previous PUT request to
the collection jobs resource.</t>
            <t>This means that polling a collection job can have the side effect of changing
the set of current batches in the Leader, and thus using a GET is inappropriate.</t>
          </section>
        </section>
        <section anchor="collect-aggregate">
          <name>Obtaining Aggregate Shares</name>
          <t>The Leader must obtain the Helper's encrypted aggregate share before it can
complete a collection job. To do this, the Leader first computes a checksum
over the reports included in the batch. The checksum is computed by taking the
SHA256 <xref target="SHS"/> hash of each report ID from the
Client reports included in the aggregation, then combining the hash values with
a bitwise-XOR operation.</t>
          <t>Then the Leader sends a POST request to
<tt>{helper}/tasks/{task-id}/aggregate_shares</tt> with the following message:</t>
          <artwork><![CDATA[
struct {
  QueryType query_type;
  select (BatchSelector.query_type) {
    case time_interval: Interval batch_interval;
    case fixed_size: BatchID batch_id;
  };
} BatchSelector;

struct {
  BatchSelector batch_selector;
  opaque agg_param<0..2^32-1>;
  uint64 report_count;
  opaque checksum[32];
} AggregateShareReq;
]]></artwork>
          <t>The media type of the request is "application/dap-aggregate-share-req". The
message contains the following parameters:</t>
          <ul spacing="normal">
            <li>
              <t><tt>batch_selector</tt>: The "batch selector", which encodes parameters used to
determine the batch being aggregated. The value depends on the query type for
the task:  </t>
              <ul spacing="normal">
                <li>
                  <t>For time_interval tasks, the request specifies the batch interval.</t>
                </li>
                <li>
                  <t>For fixed_size tasks, the request specifies the batch ID.</t>
                </li>
              </ul>
              <t>
The indicated query type <bcp14>MUST</bcp14> match the task's query type. Otherwise, the
Helper <bcp14>MUST</bcp14> abort with "invalidMessage".</t>
            </li>
            <li>
              <t><tt>agg_param</tt>: The opaque aggregation parameter for the VDAF being executed.
This value <bcp14>MUST</bcp14> match the AggregationJobInitReq message for each aggregation
job used to compute the aggregate shares (see <xref target="leader-init"/>) and the
aggregation parameter indicated by the Collector in the CollectionReq message
(see <xref target="collect-init"/>).</t>
            </li>
            <li>
              <t><tt>report_count</tt>: The number number of reports included in the batch.</t>
            </li>
            <li>
              <t><tt>checksum</tt>: The batch checksum.</t>
            </li>
          </ul>
          <t>Leaders <bcp14>MUST</bcp14> authenticate their requests to Helpers using a scheme that meets
the requirements in <xref target="request-authentication"/>.</t>
          <t>To handle the Leader's request, the Helper first ensures that it recognizes the
task ID in the request path. If not, it <bcp14>MUST</bcp14> abort with error
<tt>unrecognizedTask</tt>. The Helper then verifies that the request meets the
requirements for batch parameters following the procedure in
<xref target="batch-validation"/>.</t>
          <t>Next, it computes a checksum based on the reports that satisfy the query, and
checks that the <tt>report_count</tt> and <tt>checksum</tt> included in the request match its
computed values. If not, then it <bcp14>MUST</bcp14> abort with an error of type
"batchMismatch".</t>
          <t>Next, it computes the aggregate share <tt>agg_share</tt> corresponding to the set of
output shares, denoted <tt>out_shares</tt>, for the batch interval, as follows:</t>
          <artwork><![CDATA[
agg_share = Vdaf.aggregate(agg_param, out_shares)
]]></artwork>
          <t>Implementation note: For most VDAFs, it is possible to aggregate output shares
as they arrive rather than wait until the batch is collected. To do so however,
it is necessary to enforce the batch parameters as described in
<xref target="batch-validation"/> so that the Aggregator knows which aggregate share to
update.</t>
          <t>The Helper then encrypts <tt>agg_share</tt> under the Collector's HPKE public key as
described in <xref target="aggregate-share-encrypt"/>, yielding <tt>encrypted_agg_share</tt>.
Encryption prevents the Leader from learning the actual result, as it only has
its own aggregate share and cannot compute the Helper's.</t>
          <t>The Helper responds to the Leader with HTTP status code 200 OK and a body
consisting of an <tt>AggregateShare</tt>, with media type
"application/dap-aggregate-share":</t>
          <artwork><![CDATA[
struct {
  HpkeCiphertext encrypted_aggregate_share;
} AggregateShare;
]]></artwork>
          <t><tt>encrypted_aggregate_share.config_id</tt> is set to the Collector's HPKE config ID.
<tt>encrypted_aggregate_share.enc</tt> is set to the encapsulated HPKE context <tt>enc</tt>
computed above and <tt>encrypted_aggregate_share.ciphertext</tt> is the ciphertext
<tt>encrypted_agg_share</tt> computed above.</t>
          <t>The Helper's handling of this request <bcp14>MUST</bcp14> be idempotent. That is, if multiple
identical, valid <tt>AggregateShareReq</tt>s are received, they should all yield the
same response while only consuming one unit of the task's
<tt>max_batch_query_count</tt> (see <xref target="batch-validation"/>).</t>
          <t>After receiving the Helper's response, the Leader uses the HpkeCiphertext to
finalize a collection job (see <xref target="collect-finalization"/>).</t>
          <t>Once an AggregateShareReq has been issued for the batch determined by a given
query, it is an error for the Leader to issue any more aggregation jobs for
additional reports that satisfy the query. These reports will be rejected by the
Helper as described in <xref target="input-share-validation"/>.</t>
          <t>Before completing the collection job, the Leader also computes its own aggregate
share <tt>agg_share</tt> by aggregating all of the prepared output shares that fall
within the batch interval. Finally, it encrypts its aggregate share under the
Collector's HPKE public key as described in <xref target="aggregate-share-encrypt"/>.</t>
        </section>
        <section anchor="collect-finalization">
          <name>Collection Job Finalization</name>
          <t>Once the Collector has received a collection job from the Leader, it can decrypt
the aggregate shares and produce an aggregate result. The Collector decrypts
each aggregate share as described in <xref target="aggregate-share-encrypt"/>. Once the
Collector successfully decrypts all aggregate shares, it unshards the aggregate
shares into an aggregate result using the VDAF's <tt>unshard</tt> algorithm. In
particular, let <tt>leader_agg_share</tt> denote the Leader's aggregate share,
<tt>helper_agg_share</tt> denote the Helper's aggregate share, let <tt>report_count</tt>
denote the report count sent by the Leader, and let <tt>agg_param</tt> be the opaque
aggregation parameter. The final aggregate result is computed as follows:</t>
          <artwork><![CDATA[
agg_result = Vdaf.unshard(agg_param,
                          [leader_agg_share, helper_agg_share],
                          report_count)
]]></artwork>
        </section>
        <section anchor="aggregate-share-encrypt">
          <name>Aggregate Share Encryption</name>
          <t>Encrypting an aggregate share <tt>agg_share</tt> for a given <tt>AggregateShareReq</tt> is
done as follows:</t>
          <artwork><![CDATA[
enc, payload = SealBase(pk, "dap-07 aggregate share" || server_role || 0x00,
  agg_share_aad, agg_share)
]]></artwork>
          <t>where <tt>pk</tt> is the HPKE public key encoded by the Collector's HPKE key,
<tt>server_role</tt> is the role of the encrypting server (<tt>0x02</tt> for the Leader and
<tt>0x03</tt> for a Helper), and <tt>agg_share_aad</tt> is a value of type
<tt>AggregateShareAad</tt>. The <tt>SealBase()</tt> function is as specified in
<xref section="6.1" sectionFormat="comma" target="HPKE"/> for the ciphersuite indicated by the HPKE configuration.</t>
          <artwork><![CDATA[
struct {
  TaskID task_id;
  opaque agg_param<0..2^32-1>;
  BatchSelector batch_selector;
} AggregateShareAad;
]]></artwork>
          <ul spacing="normal">
            <li>
              <t><tt>task_id</tt> is the ID of the task the aggregate share was computed in.</t>
            </li>
            <li>
              <t><tt>agg_param</tt> is the aggregation parameter used to compute the aggregate share.</t>
            </li>
            <li>
              <t><tt>batch_selector</tt> is the is the batch selector from the <tt>AggregateShareReq</tt>
(for the Helper) or the batch selector computed from the Collector's query
(for the Leader).</t>
            </li>
          </ul>
          <t>The Collector decrypts these aggregate shares using the opposite process.
Specifically, given an encrypted input share, denoted <tt>enc_share</tt>, for a given
batch selector, decryption works as follows:</t>
          <artwork><![CDATA[
agg_share = OpenBase(enc_share.enc, sk, "dap-07 aggregate share" ||
  server_role || 0x00, agg_share_aad, enc_share.payload)
]]></artwork>
          <t>where <tt>sk</tt> is the HPKE secret key, <tt>server_role</tt> is the role of the server that
sent the aggregate share (<tt>0x02</tt> for the Leader and <tt>0x03</tt> for the Helper), and
<tt>agg_share_aad</tt> is an <tt>AggregateShareAad</tt> message constructed from the task ID
and the aggregation parameter in the collect request, and a batch selector. The
value of the batch selector used in <tt>agg_share_aad</tt> is computed by the Collector
from its query and the response to its query as follows:</t>
          <ul spacing="normal">
            <li>
              <t>For time_interval tasks, the batch selector is the batch interval specified in
the query.</t>
            </li>
            <li>
              <t>For fixed_size tasks, the batch selector is the batch ID assigned sent in the
response.</t>
            </li>
          </ul>
          <t>The <tt>OpenBase()</tt> function is as specified in <xref section="6.1" sectionFormat="comma" target="HPKE"/> for the
ciphersuite indicated by the HPKE configuration.</t>
        </section>
        <section anchor="batch-validation">
          <name>Batch Validation</name>
          <t>Before a Leader runs a collection job or a Helper responds to an
AggregateShareReq, it must first check that the job or request does not violate
the parameters associated with the DAP task. It does so as described here. Where
we say that an Aggregator <bcp14>MUST</bcp14> abort with some error, then:</t>
          <ul spacing="normal">
            <li>
              <t>Leaders should respond to subsequent HTTP POST requests to the collection job
with the indicated error.</t>
            </li>
            <li>
              <t>Helpers should respond to the AggregateShareReq with the indicated error.</t>
            </li>
          </ul>
          <t>First the Aggregator checks that the batch respects any "boundaries" determined
by the query type. These are described in the subsections below. If the boundary
check fails, then the Aggregator <bcp14>MUST</bcp14> abort with an error of type
"batchInvalid".</t>
          <t>Next, the Aggregator checks that batch contains a valid number of reports, as
determined by the query type. If the size check fails, then Helpers <bcp14>MUST</bcp14> abort
with an error of type "invalidBatchSize". Leaders <bcp14>SHOULD</bcp14> wait for more reports
to be validated and try the collection job again later.</t>
          <t>Next, the Aggregator checks that the batch has not been queried too many times.
This is determined by the maximum number of times a batch can be queried,
<tt>max_batch_query_count</tt>. If the batch has been queried with more than
<tt>max_batch_query_count</tt> distinct aggregation parameters, the Aggregator <bcp14>MUST</bcp14>
abort with error of type "batchQueriedTooManyTimes".</t>
          <t>Finally, the Aggregator checks that the batch does not contain a report that was
included in any previous batch. If this batch overlap check fails, then the
Aggregator <bcp14>MUST</bcp14> abort with error of type "batchOverlap". For time_interval
tasks, it is sufficient (but not necessary) to check that the batch interval
does not overlap with the batch interval of any previous query. If this batch
interval check fails, then the Aggregator <bcp14>MAY</bcp14> abort with error of type
"batchOverlap".</t>
          <t>[[OPEN ISSUE: #195 tracks how we might relax this constraint to allow for more
collect query flexibility. As of now, this is quite rigid and doesn't give the
Collector much room for mistakes.]]</t>
          <section anchor="time-interval-batch-validation">
            <name>Time-interval Queries</name>
            <section anchor="boundary-check">
              <name>Boundary Check</name>
              <t>The batch boundaries are determined by the <tt>time_precision</tt> field of the query
configuration. For the <tt>batch_interval</tt> included with the query, the Aggregator
checks that:</t>
              <ul spacing="normal">
                <li>
                  <t><tt>batch_interval.duration &gt;= time_precision</tt> (this field determines,
effectively, the minimum batch duration)</t>
                </li>
                <li>
                  <t>both <tt>batch_interval.start</tt> and <tt>batch_interval.duration</tt> are divisible by
<tt>time_precision</tt></t>
                </li>
              </ul>
              <t>These measures ensure that Aggregators can efficiently "pre-aggregate" output
shares recovered during the aggregation sub-protocol.</t>
            </section>
            <section anchor="size-check">
              <name>Size Check</name>
              <t>The query configuration specifies the minimum batch size, <tt>min_batch_size</tt>. The
Aggregator checks that <tt>len(X) &gt;= min_batch_size</tt>, where <tt>X</tt> is the set of
reports successfully aggregated into the batch.</t>
            </section>
          </section>
          <section anchor="fixed-size-batch-validation">
            <name>Fixed-size Queries</name>
            <section anchor="boundary-check-1">
              <name>Boundary Check</name>
              <t>For fixed_size tasks, the batch boundaries are defined by opaque batch IDs. Thus
the Aggregator needs to check that the query is associated with a known batch
ID:</t>
              <ul spacing="normal">
                <li>
                  <t>For a CollectionReq containing a query of type <tt>by_batch_id</tt>, the Leader
checks that the provided batch ID corresponds to a batch ID it returned in a
previous collection for the task.</t>
                </li>
                <li>
                  <t>For an AggregateShareReq, the Helper checks that the batch ID provided by the
Leader corresponds to a batch ID used in a previous <tt>AggregationJobInitReq</tt>
for the task.</t>
                </li>
              </ul>
            </section>
            <section anchor="size-check-1">
              <name>Size Check</name>
              <t>The query configuration specifies the minimum batch size, <tt>min_batch_size</tt>, and
maximum batch size, <tt>max_batch_size</tt>. The Aggregator checks that <tt>len(X) &gt;=
min_batch_size</tt> and <tt>len(X) &lt;= max_batch_size</tt>, where <tt>X</tt> is the set of reports
successfully aggregated into the batch.</t>
            </section>
          </section>
        </section>
      </section>
    </section>
    <section anchor="operational-capabilities">
      <name>Operational Considerations</name>
      <t>The DAP protocol has inherent constraints derived from the tradeoff between
privacy guarantees and computational complexity. These tradeoffs influence how
applications may choose to utilize services implementing the specification.</t>
      <section anchor="entity-capabilities">
        <name>Protocol participant capabilities</name>
        <t>The design in this document has different assumptions and requirements for
different protocol participants, including Clients, Aggregators, and Collectors.
This section describes these capabilities in more detail.</t>
        <section anchor="client-capabilities">
          <name>Client capabilities</name>
          <t>Clients have limited capabilities and requirements. Their only inputs to the
protocol are (1) the parameters configured out of band and (2) a measurement.
Clients are not expected to store any state across any upload flows, nor are
they required to implement any sort of report upload retry mechanism. By design,
the protocol in this document is robust against individual Client upload
failures since the protocol output is an aggregate over all inputs.</t>
        </section>
        <section anchor="aggregator-capabilities">
          <name>Aggregator capabilities</name>
          <t>Leaders and Helpers have different operational requirements. The design in this
document assumes an operationally competent Leader, i.e., one that has no
storage or computation limitations or constraints, but only a modestly
provisioned Helper, i.e., one that has computation, bandwidth, and storage
constraints. By design, Leaders must be at least as capable as Helpers, where
Helpers are generally required to:</t>
          <ul spacing="normal">
            <li>
              <t>Support the aggregate sub-protocol, which includes validating and aggregating
reports; and</t>
            </li>
            <li>
              <t>Publish and manage an HPKE configuration that can be used for the upload
protocol.</t>
            </li>
          </ul>
          <t>In addition, for each DAP task, the Helper is required to:</t>
          <ul spacing="normal">
            <li>
              <t>Implement some form of batch-to-report index, as well as inter- and
intra-batch replay mitigation storage, which includes some way of tracking
batch report size. Some of this state may be used for replay attack
mitigation. The replay mitigation strategy is described in
<xref target="input-share-validation"/>.</t>
            </li>
          </ul>
          <t>Beyond the minimal capabilities required of Helpers, Leaders are generally
required to:</t>
          <ul spacing="normal">
            <li>
              <t>Support the upload protocol and store reports; and</t>
            </li>
            <li>
              <t>Track batch report size during each collect flow and request encrypted output
shares from Helpers.</t>
            </li>
          </ul>
          <t>In addition, for each DAP task, the Leader is required to:</t>
          <ul spacing="normal">
            <li>
              <t>Implement and store state for the form of inter- and intra-batch replay
mitigation in <xref target="input-share-validation"/>.</t>
            </li>
          </ul>
        </section>
        <section anchor="collector-capabilities">
          <name>Collector capabilities</name>
          <t>Collectors statefully interact with Aggregators to produce an aggregate output.
Their input to the protocol is the task parameters, configured out of band,
which include the corresponding batch window and size. For each collect
invocation, Collectors are required to keep state from the start of the protocol
to the end as needed to produce the final aggregate output.</t>
          <t>Collectors must also maintain state for the lifetime of each task, which
includes key material associated with the HPKE key configuration.</t>
        </section>
      </section>
      <section anchor="data-resolution-limitations">
        <name>Data resolution limitations</name>
        <t>Privacy comes at the cost of computational complexity. While affine-aggregatable
encodings (AFEs) can compute many useful statistics, they require more bandwidth
and CPU cycles to account for finite-field arithmetic during input-validation.
The increased work from verifying inputs decreases the throughput of the system
or the inputs processed per unit time. Throughput is related to the verification
circuit's complexity and the available compute-time to each Aggregator.</t>
        <t>Applications that utilize proofs with a large number of multiplication gates or
a high frequency of inputs may need to limit inputs into the system to meet
bandwidth or compute constraints. Some methods of overcoming these limitations
include choosing a better representation for the data or introducing sampling
into the data collection methodology.</t>
        <t>[[TODO: Discuss explicit key performance indicators, here or elsewhere.]]</t>
      </section>
      <section anchor="aggregation-utility-and-soft-batch-deadlines">
        <name>Aggregation utility and soft batch deadlines</name>
        <t>A soft real-time system should produce a response within a deadline to be
useful. This constraint may be relevant when the value of an aggregate decreases
over time. A missed deadline can reduce an aggregate's utility but not
necessarily cause failure in the system.</t>
        <t>An example of a soft real-time constraint is the expectation that input data can
be verified and aggregated in a period equal to data collection, given some
computational budget. Meeting these deadlines will require efficient
implementations of the input-validation protocol. Applications might batch
requests or utilize more efficient serialization to improve throughput.</t>
        <t>Some applications may be constrained by the time that it takes to reach a
privacy threshold defined by a minimum number of reports. One possible solution
is to increase the reporting period so more samples can be collected, balanced
against the urgency of responding to a soft deadline.</t>
      </section>
      <section anchor="protocol-specific-optimizations">
        <name>Protocol-specific optimizations</name>
        <t>Not all DAP tasks have the same operational requirements, so the protocol is
designed to allow implementations to reduce operational costs in certain cases.</t>
        <section anchor="reducing-storage-requirements">
          <name>Reducing storage requirements</name>
          <t>In general, the Aggregators are required to keep state for tasks and all valid
reports for as long as collect requests can be made for them. In particular,
Aggregators must store a batch as long as the batch has not been queried more
than <tt>max_batch_query_count</tt> times. However, it is not always necessary to store
the reports themselves. For schemes like Prio3 <xref target="VDAF"/> in which reports are
verified only once, each Aggregator only needs to store its aggregate share for
each possible batch interval, along with the number of times the aggregate share
was used in a batch. This is due to the requirement that the batch interval
respect the boundaries defined by the DAP parameters. (See
<xref target="batch-validation"/>.)</t>
          <t>However, Aggregators are also required to implement several per-report checks
that require retaining a number of data artifacts. For example, to detect replay
attacks, it is necessary for each Aggregator to retain the set of report IDs of
reports that have been aggregated for the task so far. Depending on the task
lifetime and report upload rate, this can result in high storage costs. To
alleviate this burden, DAP allows Aggregators to drop this state as needed, so
long as reports are dropped properly as described in <xref target="input-share-validation"/>.
Aggregators <bcp14>SHOULD</bcp14> take steps to mitigate the risk of dropping reports (e.g., by
evicting the oldest data first).</t>
          <t>Furthermore, the Aggregators must store data related to a task as long as the
current time has not passed this task's <tt>task_expiration</tt>. Aggregator <bcp14>MAY</bcp14> delete
the task and all data pertaining to this task after <tt>task_expiration</tt>.
Implementors <bcp14>SHOULD</bcp14> provide for some leeway so the Collector can collect the
batch after some delay.</t>
        </section>
      </section>
    </section>
    <section anchor="compliance">
      <name>Compliance Requirements</name>
      <t>In the absence of an application or deployment-specific profile specifying
otherwise, a compliant DAP application <bcp14>MUST</bcp14> implement the following HPKE cipher
suite:</t>
      <ul spacing="normal">
        <li>
          <t>KEM: DHKEM(X25519, HKDF-SHA256) (see <xref section="7.1" sectionFormat="comma" target="HPKE"/>)</t>
        </li>
        <li>
          <t>KDF: HKDF-SHA256 (see <xref section="7.2" sectionFormat="comma" target="HPKE"/>)</t>
        </li>
        <li>
          <t>AEAD: AES-128-GCM (see <xref section="7.3" sectionFormat="comma" target="HPKE"/>)</t>
        </li>
      </ul>
    </section>
    <section anchor="sec-considerations">
      <name>Security Considerations</name>
      <t>DAP assumes an active attacker that controls the network and has the ability to
statically corrupt any number of Clients, Aggregators, and Collectors. That is,
the attacker can learn the secret state of any party prior to the start of its
attack. For example, it may coerce a Client into providing malicious input
shares for aggregation or coerce an Aggregator into diverting from the protocol
specified (e.g., by divulging its input shares to the attacker).</t>
      <t>In the presence of this adversary, DAP aims to achieve the privacy and
robustness security goals described in <xref target="VDAF"/>'s Security Considerations
section. Even if DAP achieves those goals, there are still some threats it does
not defend against:</t>
      <ol spacing="normal" type="1"><li>
          <t>Even benign collect requests may leak information beyond what one might
expect intuitively. For example, the Poplar1 VDAF <xref target="VDAF"/> can be used to
compute the set of heavy hitters among a set of arbitrary bit strings
uploaded by Clients. This requires multiple evaluations of the VDAF, the
results of which reveal information to the Aggregators and Collector beyond
what follows from the heavy hitters themselves. Or the result of the Prio3Sum
VDAF could leak information about outlier values. Note that this leakage can
be mitigated using differential privacy (<xref target="dp"/>).</t>
        </li>
        <li>
          <t>On its own, DAP does not defend against Sybil attacks. See <xref target="sybil"/> for
discussion and potential mitigations.</t>
        </li>
      </ol>
      <section anchor="threat-model">
        <name>Threat model</name>
        <t>In this section, we enumerate the actors participating in a Distributed
Aggregation Protocol deployment, enumerate their assets (secrets that are
either inherently valuable or which confer some capability that enables further
attack on the system), the capabilities that a malicious or compromised actor
has, and potential mitigations for attacks enabled by those capabilities.</t>
        <t>This model assumes that all participants have previously agreed upon and
exchanged all shared parameters over some unspecified secure channel.</t>
        <section anchor="clientuser">
          <name>Client/user</name>
          <section anchor="assets">
            <name>Assets</name>
            <ol spacing="normal" type="1"><li>
                <t>Unsharded measurements. Clients are the only actor that can ever see the
original measurements.</t>
              </li>
              <li>
                <t>Unencrypted input shares.</t>
              </li>
            </ol>
          </section>
          <section anchor="capabilities-and-mitigations">
            <name>Capabilities and mitigations</name>
            <ol spacing="normal" type="1"><li>
                <t>Individual users can reveal their own measurement and compromise their own
privacy.</t>
              </li>
              <li>
                <t>Clients may affect the quality of aggregate results by reporting false
measurements.
                </t>
                <ul spacing="normal">
                  <li>
                    <t>Prio can only prove that a submitted measurement is valid, not that it is
true. False measurements can be mitigated orthogonally to the Prio
protocol (e.g., by requiring that batches include a minimum number of
contributions) and so these attacks are considered to be outside of the
threat model.</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>Clients may upload reports to a task multiple times. The VDAF will prove that
each report is valid, but the results of a VDAF like Prio3Sum can be skewed
if a Client submits many valid reports. Attackers may also attempt ballot
stuffing attacks, trying to produce aggregations over batches containing
nothing but synthetic reports with a known value and a single, legitimate
report whose privacy is then compromised.
                </t>
                <ul spacing="normal">
                  <li>
                    <t>This attack can be mitigated if DAP deployments require Clients to
authenticate when uploading (see <xref target="client-auth"/>), which would allow
enforcing policy like a maximum number of uploads per day.</t>
                  </li>
                  <li>
                    <t>Applying differential privacy to either measurements before sharding them
into reports or to aggregate shares (<xref target="dp"/>) can protect isolated
legitimate measurements.</t>
                  </li>
                </ul>
              </li>
            </ol>
          </section>
        </section>
        <section anchor="aggregator">
          <name>Aggregator</name>
          <section anchor="assets-1">
            <name>Assets</name>
            <ol spacing="normal" type="1"><li>
                <t>Unencrypted input shares.</t>
              </li>
              <li>
                <t>Input share decryption keys.</t>
              </li>
              <li>
                <t>Client identifying information.</t>
              </li>
              <li>
                <t>Aggregate shares.</t>
              </li>
              <li>
                <t>Aggregator identity.</t>
              </li>
            </ol>
          </section>
          <section anchor="capabilities-and-mitigations-1">
            <name>Capabilities and mitigations</name>
            <ol spacing="normal" type="1"><li>
                <t>Aggregators may defeat the robustness of the system by emitting incorrect
aggregate shares.
                </t>
                <ul spacing="normal">
                  <li>
                    <t>There is no way for aggregators to detect a fraudulent aggregate shares
except by applying heuristics to aggregate results that are outside of
DAP's scope. For instance it may be apparent from the aggregate result
that one or more aggregators have emitted an incorrect aggregate share.</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>If Clients reveal identifying information to Aggregators (such as a trusted
identity during Client authentication), Aggregators can learn which Clients
are contributing reports.
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>Aggregators may reveal that a particular Client contributed reports.</t>
                  </li>
                  <li>
                    <t>Aggregators may attack robustness by selectively omitting reports from
certain Clients.
                    </t>
                    <ul spacing="normal">
                      <li>
                        <t>For example, omitting submissions from a particular geographic
region to falsely suggest that a particular localization is not
being used.
       * Exposing metadata to Aggregators can be mitigated by deploying an
anonymizing proxy (see <xref target="anon-proxy"/>).</t>
                      </li>
                    </ul>
                  </li>
                </ol>
              </li>
              <li>
                <t>Individual Aggregators may compromise availability of the system by refusing
to emit aggregate shares.
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The DAP and VDAF threat model already assumes that robustness only holds
if both aggregators are honest, so a loss of availability is no worse.</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>Violate robustness. Any Aggregator can collude with a malicious Client to
craft a proof that will fool honest Aggregators into accepting invalid
measurements.
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The VDAF threat model already assumes that robustness only holds if both
aggregators are honest.</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>Aggregators (and the Collector) can count the total number of input shares,
which could compromise user privacy (and differential privacy <xref target="dp"/>) if the
presence or absence of a share for a given user is sensitive.
                </t>
                <ul spacing="normal">
                  <li>
                    <t>Clients can ensure that aggregate counts are non-sensitive by generating
reports independently of user behavior (see <xref target="network-attacker"/>.</t>
                  </li>
                  <li>
                    <t>Clients, especially in deployments that cannot schedule report uploads at a
fixed time (e.g., an application that does not run persistently) can also
apply local differential privacy to measurements before constructing
reports.</t>
                  </li>
                </ul>
              </li>
            </ol>
            <t>[[TODO: link to the Shan et al. I-D on differential privacy in DAP once it is
published.]]</t>
          </section>
        </section>
        <section anchor="leader">
          <name>Leader</name>
          <t>The Leader is also an Aggregator, and so all the assets, capabilities and
mitigations available to Aggregators also apply to the Leader.</t>
          <section anchor="capabilities-and-mitigations-2">
            <name>Capabilities and mitigations</name>
            <ol spacing="normal" type="1"><li>
                <t>Shrinking the anonymity set. The Leader instructs the Helper to construct
aggregate shares and so could request aggregations over dangerously few
reports.
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>This capability is particularly strong in the case of fixed-size queries
(<xref target="fixed-size-query"/>), because in that setting, the Leader is responsible
for assigning reports to batches and so can craft batches to target
certain contributions.
* This is mitigated by choosing a sufficient minimum batch size for the task.
* If aggregate shares emitted by Aggregators satisfy differential privacy
  <xref target="dp"/>, then genuine records are protected regardless of the size of the
  anonymity set.</t>
                  </li>
                </ol>
              </li>
              <li>
                <t>Relaying messages between Helper and Collector in the collect sub-protocol.
These messages are not authenticated, meaning the leader can:
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>Send collect parameters to the Helper that do not reflect the parameters
chosen by the Collector
                    </t>
                    <ul spacing="normal">
                      <li>
                        <t>This is mitigated by including the <tt>BatchSelector</tt> and aggregation
parameter in the AAD used to encrypt aggregate shares.</t>
                      </li>
                    </ul>
                  </li>
                  <li>
                    <t>Discard the aggregate share computed by the Helper and then fabricate
aggregate shares that combine into an arbitrary aggregate result
* These are attacks on robustness, which we already assume to hold only if
  both Aggregators are honest, putting these malicious-Leader attacks out of
  scope.</t>
                  </li>
                </ol>
              </li>
            </ol>
            <t>[[OPEN ISSUE: Should we have authentication in either direction between the
Helper and the Collector? #155]]</t>
          </section>
        </section>
        <section anchor="aggregator-collusion">
          <name>Aggregator collusion</name>
          <t>If all Aggregators collude (e.g. by promiscuously sharing unencrypted input
shares), then none of the properties of the system hold. Accordingly, such
scenarios are outside of the threat model.</t>
        </section>
        <section anchor="network-attacker">
          <name>Attacker on the network</name>
          <t>We assume the existence of attackers on the network links between participants.
Most passive network attacks are mitigated by DAP's requirement of HTTPS for all
traffic and mutual authentication for key protocol interactions (see
<xref target="message-transport"/>). Nonetheless, there remain information leaks that
deployments should be aware of.</t>
          <section anchor="capabilities">
            <name>Capabilities</name>
            <ol spacing="normal" type="1"><li>
                <t>Attackers may observe messages exchanged between participants at the IP
layer.
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>The attacker can observe source and destination IP addresses, potentially
revealing the existence of Clients and Aggregators.</t>
                  </li>
                  <li>
                    <t>The time of upload of reports by Clients could reveal information about
user activity. For example, if a user opts into a new feature, and the
Client immediately reports this to Aggregators, then just by observing
network traffic, the attacker can infer what the user did.</t>
                  </li>
                  <li>
                    <t>Observation of message size could allow the attacker to learn how many
reports are being uploaded by a Client. For example, if the attacker
observes an encrypted message of some size, they can infer the size of the
plaintext, plus or minus the cipher block size. From this they may be able
to infer which VDAF is in use and perhaps which task the Client is
uploading reports for.
* These attacks can be mitigated by requiring Clients to submit reports at
  regular intervals and independently of whether the event that the task is
  tracking has not occurred, so that the absence of reports cannot be
  distinguished from their presence.</t>
                  </li>
                </ol>
              </li>
              <li>
                <t>Tampering with network traffic. Attackers may drop messages or inject new
messages into communications between participants.
                </t>
                <ul spacing="normal">
                  <li>
                    <t>DAP mitigates this by using standard HTTP semantics to allow requests to be
retried. However attacks that completely deny network access to
participants are outside of DAP's scope.</t>
                  </li>
                </ul>
              </li>
            </ol>
            <t>[[OPEN ISSUE: The threat model for Prio --- as it's described in the original
paper and <xref target="BBCGGI19"/> --- considers <strong>either</strong> a malicious Client (attacking
robustness) <strong>or</strong> a malicious subset of Aggregators (attacking privacy). In
particular, robustness isn't guaranteed if any one of the Aggregators is
malicious; in theory it may be possible for a malicious Client and Aggregator to
collude and break robustness. Is this a contingency we need to address? There
are techniques in <xref target="BBCGGI19"/> that account for this; we need to figure out if
they're practical.]]</t>
          </section>
        </section>
      </section>
      <section anchor="sybil">
        <name>Sybil attacks</name>
        <t>Several attacks on privacy involve malicious clients uploading reports that are
valid under the chosen VDAF but incorrect. For example, a DAP deployment might
be measuring the heights of a human population and configure a VDAF to prove
that measurements are values in the range of 80-250 cm. A malicious Client would not
be able to claim a height of 400 cm, but they could submit multiple bogus
reports inside the acceptable range, which would yield incorrect averages. More
generally, DAP deployments are susceptible to Sybil attacks <xref target="Dou02"/>, especially
when carried out by the Leader.</t>
        <t>In this type of attack, the adversary adds to a batch a number of reports that
skew the aggregate result in its favor. For example, sending known measurements
to the Aggregators can allow a Collector to shrink the effective anonymity set
by subtracting the known measurements from the aggregate result. The result may
reveal additional information about the honest measurements, leading to a
privacy violation; or the result may have some property that is desirable to the
adversary ("stats poisoning").</t>
        <t>Depending on the deployment and threat model, there are different ways to address
Sybil attacks, including, though not limited to:</t>
        <ol spacing="normal" type="1"><li>
            <t>Authenticating clients, as described in <xref target="client-auth"/>;</t>
          </li>
          <li>
            <t>Removing client-specific metadata on individual reports, such as through the
use of anonymizing proxies in the upload flow, as described in <xref target="anon-proxy"/>; or</t>
          </li>
          <li>
            <t>Applying differential privacy protections, as described in <xref target="dp"/>.</t>
          </li>
        </ol>
        <section anchor="client-auth">
          <name>Client authentication</name>
          <t>In settings where it is practical for each Client to have an identity
provisioned (e.g., a user logged into a backend service or a hardware device
programmed with an identity), Client authentication can help Aggregators (or an
authenticating proxy deployed between clients and the Aggregators; see
<xref target="anon-proxy"/>) ensure that all reports come from authentic Clients. Note that
because the Helper never handles messages directly from the Clients, reports
would have to use an extension (<xref target="upload-extensions"/>) to convey authentication
information to the Helper.</t>
          <t>However, in some deployments, it will not be practical to require Clients to
authenticate, so Client authentication is not mandatory in DAP. For example, a
widely distributed application that does not require its users to log in to any
service has no obvious way to authenticate its report uploads.</t>
        </section>
      </section>
      <section anchor="anon-proxy">
        <name>Anonymizing proxies</name>
        <t>Client reports can contain auxiliary information such as source IP, HTTP user
agent or in deployments which use it, Client authentication information, which
could be used by Aggregators to identify participating Clients or permit some
attacks on robustness. This auxiliary information could be removed by having
Clients submit reports to an anonymizing proxy server which would then use
Oblivious HTTP <xref target="I-D.draft-ietf-ohai-ohttp-08"/> to forward reports to the
DAP Leader, without requiring any server participating in DAP to be aware of
whatever Client authentication or attestation scheme is in use.</t>
      </section>
      <section anchor="task-parameters">
        <name>Task parameters</name>
        <t>Selection and distribution of DAP task parameters is out of band from DAP itself
and thus not discussed in this document, but we must nonetheless discuss the
security implications of some task parameter choices. Generally, attacks
involving crafted DAP task parameters can be mitigated by having the the
Aggregators refuse shared parameters that are trivially insecure (e.g., a
minimum batch size of 1 report).</t>
        <section anchor="verification-key">
          <name>Verification key requirements</name>
          <t>The verification key for a task <bcp14>SHOULD</bcp14> be chosen before any reports are
generated so that it is independent of any reports. Moreover, it <bcp14>SHOULD</bcp14> be
fixed for the lifetime of the task and not be rotated. One way to ensure
that the key is independent is to derive the verification key (verify_key)
based on the task ID (task_id) and some previously agreed upon secret
(verify_key_seed) between Aggregators, as follows:</t>
          <artwork><![CDATA[
verify_key = HKDF-Expand(
    HKDF-Extract(
        "verify_key",    # salt
        verify_key_seed, # IKM
    ),
    task_id,             # info
    VERIFY_KEY_SIZE,     # L
)
]]></artwork>
          <t>Here, VERIFY_KEY_SIZE is the length of the verification key, and HKDF-Extract
and HKDF-Expand are as defined in <xref target="RFC5869"/>.</t>
          <t>This requirement comes from current security analysis for existing VDAFs. In
particular, the security proofs for Prio3 require that the verification key is
chosen independently of the generated reports.</t>
        </section>
        <section anchor="batch-parameters">
          <name>Batch parameters</name>
          <t>An important parameter of a DAP deployment is the minimum batch size. If a batch
includes too few reports, then the aggregate result can reveal information
about individual participants. Aggregators must enforce the agreed-upon minimum
batch size during the collect protocol, but implementations may also opt out of
participating in a DAP task if the minimum batch size is too small. This
document does not specify how to choose minimum batch sizes.</t>
        </section>
        <section anchor="vdafs-and-compute-requirements">
          <name>VDAFs and compute requirements</name>
          <t>The choice of VDAF can impact the computation required for a DAP Task. For
instance, the Poplar1 VDAF <xref target="VDAF"/> when configured to compute a set of heavy
hitters requires each measurement to be of the same bit-length which all parties
need to agree on prior to VDAF execution. The computation required for such
tasks can increase superlinearly as multiple rounds of evaluation are needed for
each bit of the measurement value.</t>
          <t>When dealing with variable length measurements (e.g domain names), it is
necessary to pad them to convert into fixed-size measurements. When computing
the heavy hitters from a batch of such measurements, we can early-abort the
Poplar1 execution once we have reached the padding region for a candidate
measurement. For smaller length measurements, this significantly reduces the
cost of communication between Aggregators and the steps required for the
computation. However, malicious Clients can still generate maximum length
measurements forcing the system to always operate at worst-case performance.</t>
          <t>[[TODO: Revisit this paragraph once https://github.com/cfrg/draft-irtf-cfrg-vdaf/issues/273
is resolved.]]</t>
          <t>Therefore, care must be taken that a DAP deployment can comfortably handle
computation of measurements for arbitrarily large sizes, otherwise, it may
result in a DoS possibility for the entire system.</t>
        </section>
      </section>
      <section anchor="dp">
        <name>Differential privacy</name>
        <t>Optionally, DAP deployments can choose to ensure their aggregate results achieve
differential privacy <xref target="Vad16"/>. A simple approach would require the Aggregators to
add two-sided noise (e.g. sampled from a two-sided geometric distribution) to
aggregate shares. Since each Aggregator is adding noise independently, privacy
can be guaranteed even if all but one of the Aggregators is malicious.
Differential privacy is a strong privacy definition, and protects users in
extreme circumstances: even if an adversary has prior knowledge of every
measurement in a batch except for one, that one record is still formally
protected.</t>
      </section>
      <section anchor="robustness-in-the-presence-of-malicious-servers">
        <name>Robustness in the presence of malicious servers</name>
        <t>Most DAP protocols, including Prio and Poplar, are robust against malicious
clients, but are not robust against malicious servers. Any Aggregator can simply
emit bogus aggregate shares and undetectably spoil aggregates. If enough
Aggregators were available, this could be mitigated by running the protocol
multiple times with distinct subsets of Aggregators chosen so that no Aggregator
appears in all subsets and checking all the aggregate results against each
other. If all the protocol runs do not agree, then participants know that at
least one Aggregator is defective, and it may be possible to identify the
defector (i.e., if a majority of runs agree, and a single Aggregator appears in
every run that disagrees). See
<eref target="https://github.com/ietf-wg-ppm/draft-ietf-ppm-dap/issues/22">#22</eref> for
discussion.</t>
      </section>
      <section anchor="infrastructure-diversity">
        <name>Infrastructure diversity</name>
        <t>Prio deployments should ensure that Aggregators do not have common dependencies
that would enable a single vendor to reassemble measurements. For example, if all
participating Aggregators stored unencrypted input shares on the same cloud
object storage service, then that cloud vendor would be able to reassemble all
the input shares and defeat privacy.</t>
      </section>
      <section anchor="operational-requirements">
        <name>System requirements</name>
        <section anchor="data-types">
          <name>Data types</name>
        </section>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="protocol-message-media-types">
        <name>Protocol Message Media Types</name>
        <t>This specification defines the following protocol messages, along with their
corresponding media types types:</t>
        <ul spacing="normal">
          <li>
            <t>HpkeConfigList <xref target="hpke-config"/>: "application/dap-hpke-config-list"</t>
          </li>
          <li>
            <t>Report <xref target="upload-request"/>: "application/dap-report"</t>
          </li>
          <li>
            <t>AggregationJobInitReq <xref target="leader-init"/>: "application/dap-aggregation-job-init-req"</t>
          </li>
          <li>
            <t>AggregationJobResp <xref target="aggregation-helper-init"/>: "application/dap-aggregation-job-resp"</t>
          </li>
          <li>
            <t>AggregationJobContinueReq <xref target="aggregation-leader-continuation"/>: "application/dap-aggregation-job-continue-req"</t>
          </li>
          <li>
            <t>AggregateShareReq <xref target="collect-flow"/>: "application/dap-aggregate-share-req"</t>
          </li>
          <li>
            <t>AggregateShare <xref target="collect-flow"/>: "application/dap-aggregate-share"</t>
          </li>
          <li>
            <t>CollectionReq <xref target="collect-flow"/>: "application/dap-collect-req"</t>
          </li>
          <li>
            <t>Collection <xref target="collect-flow"/>: "application/dap-collection"</t>
          </li>
        </ul>
        <t>The definition for each media type is in the following subsections.</t>
        <t>Protocol message format evolution is supported through the definition of new
formats that are identified by new media types.</t>
        <t>IANA [shall update / has updated] the "Media Types" registry at
https://www.iana.org/assignments/media-types with the registration information
in this section for all media types listed above.</t>
        <t>[OPEN ISSUE: Solicit review of these allocations from domain experts.]</t>
        <section anchor="applicationdap-hpke-config-list-media-type">
          <name>"application/dap-hpke-config-list" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-hpke-config-list</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="task-configuration"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-report-media-type">
          <name>"application/dap-report" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-report</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="upload-request"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-aggregation-job-init-req-media-type">
          <name>"application/dap-aggregation-job-init-req" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-aggregation-job-init-req</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="collect-flow"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-aggregation-job-resp-media-type">
          <name>"application/dap-aggregation-job-resp" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-aggregation-job-resp</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="collect-flow"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-aggregation-job-continue-req-media-type">
          <name>"application/dap-aggregation-job-continue-req" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-aggregation-job-continue-req</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="collect-flow"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-aggregate-share-req-media-type">
          <name>"application/dap-aggregate-share-req" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-aggregate-share-req</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="collect-flow"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-aggregate-share-media-type">
          <name>"application/dap-aggregate-share" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-aggregate-share</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="collect-flow"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-collect-req-media-type">
          <name>"application/dap-collect-req" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-collect-req</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="collect-flow"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-collection-media-type">
          <name>"application/dap-collection" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-collection</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="collect-flow"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="dap-type-registries">
        <name>DAP Type Registries</name>
        <t>This document also requests creation of a new "Distributed Aggregation Protocol
Parameters" page. This page will contain several new registries, described in the
following sections.</t>
        <section anchor="query-type-reg">
          <name>Query Types Registry</name>
          <t>This document requests creation of a new registry for Query Types. This registry
should contain the following columns:</t>
          <t>[TODO: define how we want to structure this registry when the time comes]</t>
        </section>
        <section anchor="upload-extension-registry">
          <name>Upload Extension Registry</name>
          <t>This document requests creation of a new registry for extensions to the Upload
protocol. This registry should contain the following columns:</t>
          <t>[TODO: define how we want to structure this registry when the time comes]</t>
        </section>
        <section anchor="prepare-error-reg">
          <name>Prepare Error Registry</name>
          <t>This document requests creation of a new registry for PrepareError values. This
registry should contain the following columns:</t>
          <dl>
            <dt>Name:</dt>
            <dd>
              <t>The name of the PrepareError value</t>
            </dd>
            <dt>Value:</dt>
            <dd>
              <t>The 1-byte value of the PrepareError value</t>
            </dd>
            <dt>Reference:</dt>
            <dd>
              <t>A reference to where the PrepareError type is defined.</t>
            </dd>
          </dl>
          <t>The initial contents of this registry are as defined in <xref target="aggregation-helper-init"/>,
with this document as the reference.</t>
        </section>
      </section>
      <section anchor="urn-space">
        <name>URN Sub-namespace for DAP (urn:ietf:params:ppm:dap)</name>
        <t>The following value [will be/has been] registered in the "IETF URN Sub-namespace
for Registered Protocol Parameter Identifiers" registry, following the template
in <xref target="RFC3553"/>:</t>
        <artwork><![CDATA[
Registry name:  dap

Specification:  [[THIS DOCUMENT]]

Repository:  http://www.iana.org/assignments/dap

Index value:  No transformation needed.
]]></artwork>
        <t>Initial contents: The types and descriptions in the table in <xref target="errors"/> above,
with the Reference field set to point to this specification.</t>
      </section>
    </section>
    <section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The text in <xref target="message-transport"/> is based extensively on <xref target="RFC8555"/></t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="VDAF">
          <front>
            <title>Verifiable Distributed Aggregation Functions</title>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
              <organization>Cisco</organization>
            </author>
            <author fullname="David Cook" initials="D." surname="Cook">
              <organization>ISRG</organization>
            </author>
            <author fullname="Christopher Patton" initials="C." surname="Patton">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Phillipp Schoppmann" initials="P." surname="Schoppmann">
              <organization>Google</organization>
            </author>
            <date day="31" month="August" year="2023"/>
            <abstract>
              <t>   This document describes Verifiable Distributed Aggregation Functions
   (VDAFs), a family of multi-party protocols for computing aggregate
   statistics over user measurements.  These protocols are designed to
   ensure that, as long as at least one aggregation server executes the
   protocol honestly, individual measurements are never seen by any
   server in the clear.  At the same time, VDAFs allow the servers to
   detect if a malicious or misconfigured client submitted an
   measurement that would result in an invalid aggregate result.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-vdaf-07"/>
        </reference>
        <reference anchor="RFC7807">
          <front>
            <title>Problem Details for HTTP APIs</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="E. Wilde" initials="E." surname="Wilde"/>
            <date month="March" year="2016"/>
            <abstract>
              <t>This document defines a "problem detail" as a way to carry machine- readable details of errors in a HTTP response to avoid the need to define new error response formats for HTTP APIs.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7807"/>
          <seriesInfo name="DOI" value="10.17487/RFC7807"/>
        </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="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </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="HPKE">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="K. Bhargavan" initials="K." surname="Bhargavan"/>
            <author fullname="B. Lipp" initials="B." surname="Lipp"/>
            <author fullname="C. Wood" initials="C." surname="Wood"/>
            <date month="February" year="2022"/>
            <abstract>
              <t>This document describes a scheme for hybrid public key encryption (HPKE). This scheme provides a variant of public key encryption of arbitrary-sized plaintexts for a recipient public key. It also includes three authenticated variants, including one that authenticates possession of a pre-shared key and two optional ones that authenticate possession of a key encapsulation mechanism (KEM) private key. HPKE works for any combination of an asymmetric KEM, key derivation function (KDF), and authenticated encryption with additional data (AEAD) encryption function. Some authenticated variants may not be supported by all KEMs. We provide instantiations of the scheme using widely used and efficient primitives, such as Elliptic Curve Diffie-Hellman (ECDH) key agreement, HMAC-based key derivation function (HKDF), and SHA2.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9180"/>
          <seriesInfo name="DOI" value="10.17487/RFC9180"/>
        </reference>
        <reference anchor="OAuth2">
          <front>
            <title>The OAuth 2.0 Authorization Framework</title>
            <author fullname="D. Hardt" initials="D." role="editor" surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6749"/>
          <seriesInfo name="DOI" value="10.17487/RFC6749"/>
        </reference>
        <reference anchor="RFC9457">
          <front>
            <title>Problem Details for HTTP APIs</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="E. Wilde" initials="E." surname="Wilde"/>
            <author fullname="S. Dalal" initials="S." surname="Dalal"/>
            <date month="July" year="2023"/>
            <abstract>
              <t>This document defines a "problem detail" to carry machine-readable details of errors in HTTP response content to avoid the need to define new error response formats for HTTP APIs.</t>
              <t>This document obsoletes RFC 7807.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9457"/>
          <seriesInfo name="DOI" value="10.17487/RFC9457"/>
        </reference>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC5861">
          <front>
            <title>HTTP Cache-Control Extensions for Stale Content</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document defines two independent HTTP Cache-Control extensions that allow control over the use of stale responses by caches. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5861"/>
          <seriesInfo name="DOI" value="10.17487/RFC5861"/>
        </reference>
        <reference anchor="RFC9111">
          <front>
            <title>HTTP Caching</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 defines HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.</t>
              <t>This document obsoletes RFC 7234.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="98"/>
          <seriesInfo name="RFC" value="9111"/>
          <seriesInfo name="DOI" value="10.17487/RFC9111"/>
        </reference>
        <reference anchor="SHS">
          <front>
            <title>Secure Hash Standard</title>
            <author fullname="Quynh H. Dang" initials="Q." surname="Dang">
              <organization/>
            </author>
            <date month="July" year="2015"/>
          </front>
          <seriesInfo name="DOI" value="10.6028/nist.fips.180-4"/>
          <refcontent>National Institute of Standards and Technology</refcontent>
        </reference>
        <reference anchor="I-D.draft-ietf-ohai-ohttp-08">
          <front>
            <title>Oblivious HTTP</title>
            <author fullname="Martin Thomson" initials="M." surname="Thomson">
              <organization>Mozilla</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="15" month="March" year="2023"/>
            <abstract>
              <t>   This document describes a system for forwarding encrypted HTTP
   messages.  This allows a client to make multiple requests to an
   origin server without that server being able to link those requests
   to the client or to identify the requests as having come from the
   same client, while placing only limited trust in the nodes used to
   forward the messages.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-ohai-ohttp-08"/>
        </reference>
        <reference anchor="RFC3553">
          <front>
            <title>An IETF URN Sub-namespace for Registered Protocol Parameters</title>
            <author fullname="M. Mealling" initials="M." surname="Mealling"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <author fullname="T. Hardie" initials="T." surname="Hardie"/>
            <author fullname="G. Klyne" initials="G." surname="Klyne"/>
            <date month="June" year="2003"/>
            <abstract>
              <t>This document describes a new sub-delegation for the 'ietf' URN namespace for registered protocol items. The 'ietf' URN namespace is defined in RFC 2648 as a root for persistent URIs that refer to IETF- defined resources. 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="73"/>
          <seriesInfo name="RFC" value="3553"/>
          <seriesInfo name="DOI" value="10.17487/RFC3553"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="CGB17" target="https://crypto.stanford.edu/prio/paper.pdf">
          <front>
            <title>Prio: Private, Robust, and Scalable Computation of Aggregate Statistics</title>
            <author initials="H." surname="Corrigan-Gibbs">
              <organization/>
            </author>
            <author initials="D." surname="Boneh">
              <organization/>
            </author>
            <date year="2017" month="March" day="14"/>
          </front>
        </reference>
        <reference anchor="BBCGGI19" target="https://eprint.iacr.org/2019/188">
          <front>
            <title>Zero-Knowledge Proofs on Secret-Shared Data via Fully Linear PCPs</title>
            <author initials="D." surname="Boneh">
              <organization/>
            </author>
            <author initials="E." surname="Boyle">
              <organization/>
            </author>
            <author initials="H." surname="Corrigan-Gibbs">
              <organization/>
            </author>
            <author initials="N." surname="Gilboa">
              <organization/>
            </author>
            <author initials="Y." surname="Ishai">
              <organization/>
            </author>
            <date year="2021" month="January" day="05"/>
          </front>
        </reference>
        <reference anchor="BBCGGI21" target="https://eprint.iacr.org/2021/017">
          <front>
            <title>Lightweight Techniques for Private Heavy Hitters</title>
            <author initials="D." surname="Boneh">
              <organization/>
            </author>
            <author initials="E." surname="Boyle">
              <organization/>
            </author>
            <author initials="H." surname="Corrigan-Gibbs">
              <organization/>
            </author>
            <author initials="N." surname="Gilboa">
              <organization/>
            </author>
            <author initials="Y." surname="Ishai">
              <organization/>
            </author>
            <date year="2021" month="January" day="05"/>
          </front>
        </reference>
        <reference anchor="Dou02" target="https://link.springer.com/chapter/10.1007/3-540-45748-8_24">
          <front>
            <title>The Sybil Attack</title>
            <author initials="J." surname="Douceur">
              <organization/>
            </author>
            <date year="2022" month="October" day="10"/>
          </front>
        </reference>
        <reference anchor="Vad16" target="https://privacytools.seas.harvard.edu/files/privacytools/files/complexityprivacy_1.pdf">
          <front>
            <title>The Complexity of Differential Privacy</title>
            <author initials="S." surname="Vadhan">
              <organization/>
            </author>
            <date year="2016" month="August" day="09"/>
          </front>
        </reference>
        <reference anchor="I-D.draft-dcook-ppm-dap-interop-test-design-04">
          <front>
            <title>DAP Interoperation Test Design</title>
            <author fullname="David Cook" initials="D." surname="Cook">
              <organization>ISRG</organization>
            </author>
            <date day="14" month="June" year="2023"/>
            <abstract>
              <t>   This document defines a common test interface for implementations of
   the Distributed Aggregation Protocol for Privacy Preserving
   Measurement (DAP) and describes how this test interface can be used
   to perform interoperation testing between the implementations.  Tests
   are orchestrated with containers, and new test-only APIs are
   introduced to provision DAP tasks and initiate processing.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-dcook-ppm-dap-interop-test-design-04"/>
        </reference>
        <reference anchor="RFC5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="P. Eronen" initials="P." surname="Eronen"/>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5869"/>
          <seriesInfo name="DOI" value="10.17487/RFC5869"/>
        </reference>
        <reference anchor="RFC8555">
          <front>
            <title>Automatic Certificate Management Environment (ACME)</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="J. Hoffman-Andrews" initials="J." surname="Hoffman-Andrews"/>
            <author fullname="D. McCarney" initials="D." surname="McCarney"/>
            <author fullname="J. Kasten" initials="J." surname="Kasten"/>
            <date month="March" year="2019"/>
            <abstract>
              <t>Public Key Infrastructure using X.509 (PKIX) certificates are used for a number of purposes, the most significant of which is the authentication of domain names. Thus, certification authorities (CAs) in the Web PKI are trusted to verify that an applicant for a certificate legitimately represents the domain name(s) in the certificate. As of this writing, this verification is done through a collection of ad hoc mechanisms. This document describes a protocol that a CA and an applicant can use to automate the process of verification and certificate issuance. The protocol also provides facilities for other certificate management functions, such as certificate revocation.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8555"/>
          <seriesInfo name="DOI" value="10.17487/RFC8555"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+y963obx5U2+r+uogf6YTIBIFIny1ScGVqSbU5sSyPJSWay
PUITaJIdAd1Id4MUImtfy76WfWV7HatWVTdIyvHMnu/5Pj15YglAV9dh1Tqv
d00mE9eV3bI4ykbPyrZrytNNVyyy4/PzpjjPu7KuspdN3dXzepmd1Q38o7zM
51v4b9EWzWVZnWffF3m7aYpVUXUjl5+eNsXlUfbs+OXk5cvv3aKeV/kKhl80
+Vk3KYvubLJeryaLfD05eOzmeVec1832KGu7hXOXRbUpjlyWnTf1Zg1zuul1
WdZt1zj5P9XNO/z2G3wQP1/l5RI+h3f9C750Wjfn+HHezC/g44uuW7dHd+/i
r/Cj8rKY6s/u4gd3T5v6qi3uwvN38bnzsrvYnMKTtIKrc1zE3f6a8KdLWFPb
mZeYR6Y8zrSsBx4e+Gh60a2WI9iYo+y+c/mmu6gb2J8JvIb+lFV7lL2ZZt8U
9fkFHFilX/CmvylX/a9giXlV/p0O9yg7ef3qG/2m4E3rytU5PPRbnMi/nONn
03m9culrn06zl3nX1ck7n140QEj1+qJoku/jFz9d1pvFGex+kbx+jgOs6cmb
pvB8mr0q2nndLPN4Es+bct77Kn7/9/Xfy2X4Ul5evGv+penOVrtWfDzN/lTX
i91LTn5w2zXnV/9yUeRrIOHTsmunVdE558oKrtwKnr2ESwFPPP3mq8PPj+hR
vbRwQeojvpVdMc5e1aebthtnebXIXs/zZX66LLKn9Wq96fgy12f+bhfZa/yw
7cp5O6JBF/DhUXbv4PDzycH9yeEDflPenBeWnOfNdt3V07bLcXqLabHY3F3D
NO6u83XRTNeLMx7NUyv9mfAWfjuF6TRNCbsy+aY8PW3jr59Ns6/qqrjA1X71
1dNvvjk5/CJe8H8UTT35Q1VfLYvFeYHMqT5rM1jZ62LeFN3k9QXs7iJ7lnd5
dlnm2deb5XKbfVdWRQ70+PRlstR7h5MD+N/D4aUWsK6qm5b5vCHOAFvzxd3D
x4+vWaBfQfTpc/x0uyw+aTN+gHtdLk/rPP7436fZSXuRl2GP7h3Ge/RdeX7R
XRX4/9mbYn5RlX/bFG3g33D03xb55Tb7tuy6ovkHt+Te4V2gmP8xW/Ks3hzc
i/fjzQXQ+va0XGbHXZfP3yXrvTc5PID/Da93WVbvpi0u+hyIG7jC3flFvoZd
u3t4MD08OPj87v3JwwcHkwcPP3/wePL47b0H1+zEv05xevNi0+BM/5gvDh/1
Z4rXdVm8L7st3tZn5dlZ0YCwK/OlSt/ktj4CSTo5+GJ4/mt+pKvrZTttQXZO
4YJc5nJvz8pl0Ua/kY/mfhLy5dvDG2726yku6ALkjJtMJll+CtpEPgc2Bmtq
ChC8Bcjkapu1ZbchXtTCc9nVRTm/yMouK9tsUbRlQxyrq2Eh7+CBIOtb3AxY
cu74kXVRwwSzOYxTLoDvtgX8BTklkEKVdRegLwBXbYt2jP/IcANhQ2FU1BLg
E2fGxpdv2k2OnKKq4Z8VnC/IcOAjMEV+02c43UV5WS7gdxl8u4Y3w6UCfck1
eYesH36bK29d0FyRmKtLfHddwVOrAvZt0cLTf9uUDU5+uSzmHc4ojO3C2MjF
YeQwrMx9hWva4Dhr1Isq+jyHz5oi73DzNqAsZXJwDkcBAoJNwp/xGWxgB6PN
XQCZlfPNsqOXlqs1nl0JEmSavbnAs6nnG/ylg0Oag5aIs8tW8Ptyss4b2NmF
0R5zoz2uVXvcA5Vwn3iQTmwdlDp7GHugN+4LYczzKjstcD0LXJdsWNhm2uXs
CpSqGs+huCzyJW0GLNIcF+4HHCAdCZPnqlwsgPe4O0AtXVMvNnOcLRKrWWwW
Fos0dKOCfNsl4p4WYWfgjcX7Yk7jnm5hX5d4iYGiO6T5+bKkE8JzyV27AirV
r3BoYN88nPzjs+y8zmlM2i+U/PBdvSrMprUq910Nj9Da5C2fwa7BE61uabYE
sVkJ2el3SIFtsbwsWiEO+N8qXxRuXbdtiff31NCDPjw3Wki+quVTmTXeHSJK
OMwcrulF3o1d3mZL/B38N6eZtLDqqsCV4xR00/hw/G5ewE/abrkdw1XmGdMG
w1tcW8BdKitZMCoEuN14H2gWQBp37oAylwOrz76rz53b+79+sw8EsijRTkGK
n/OXOL8MDJ38He5Uw4uDpYGIQS6DmyeTKi7LGm4qafYw/sFjUOQmoAfmTXm2
VUbAVxDppqxKZPTl34mIDY39tT5tkXSz48UiW9VN4HzCS/FplnE5yTj+9fP3
a6Sb8025yKs5cuF6A/+eX9R1qwfzx2fHX2ew/PIMl4kve1ds/bvgAhZNA4Oj
oQUTPsdz3dLr8GE7x3ZzOtFjwLV+Tmv9arNa4/At/qTLz7Ozpl5lIzIAH42Q
Svnvn48CNeXAVs8nZ+X7DDewJd0ZeTboy4uyq4FekHCXdf0OrgwRNx8MnEZB
3Bu4HTGMdTl/l23Weuh6HjCQzGia4RnDZB+FyYoZBmbAZH7WnE8uF/kZzBXH
O/g8+/Dhn3DHPn7URyfZCxjsIt/gvZxvGqSA5HD27jx4/Hhf9rRed7wsmCIq
/JN1TQIAZM5ZPsf575jB5zjOFw/2w9lYPps3YIt0eJ3rbOZ1fFKHj/PFjJ6F
OfhJX3cuD825PBr5PXp40x49pD16NLRHr9fFnCi7iK8rEdJVLVIEn4LtKqfF
dEx3/bsiR+mORPyiQgL4tliClQHrOJ6DcbeA/cOrvlmjNnQtRYpcpN9UxRUM
NfK7PzLbPzShUmQEKQTw5A4KCas9Xi7rK3rVWY1/pes8Z2KAeYBIa/OzYokc
ALhksThKL3s2R1kO/xjD61RPSL/KWLSjcu/ZLO8PCDvD7pEGiGi+L1CwhPvc
MidD3awp0G+xoJ89a+o1fABMDTjTgucEsz4vKqToIjt5hvoSKx1sDZ43+foC
1YXlli8BHtW6LTaLuoFJAmFVm9UpHKSMAe+/QrUQxY/9GbBuYgCohQlz5Cm9
EpXp25d/eI6366yEK7NA1eesRPnBm7ohS2d6E3k/MOT9MJD3AyJv1QdwS9p6
08Bf6gaFIxz+t2/evMyOX57AI3fuff54nN25/wX+/4ODg31/9srcPTPocXnP
fgPr3RLTxUt68DkOeHi4b5f9VJQAZGlNDVoN0HBNDB0pgHeYZd0V6ot44gtW
K1Fi47j3v3iApHTnwb2HYarIRIjyL0FlQLFaAittQWRUrIogGwO9eYO6ECib
dcNTeBrocQUHlp/Dlmf0Dpr7wf3whh/5YhIJZvCWUsgp2pPTHHkhfMqus7Bz
OWjN27ZseWMe8wIOD/ZvYEP3iQ09jNgQLPyL/Vsxv/uGOh6M+NEH+ujBfSKS
51WD6ileuBGIqWLxtgXONsqA+kA4kqiEMXLPBWTHauLOcmMzNGLhlsEWwK0x
lsNp3sHYqoG9q5h94DD8zckzMjUWlyjSwdx5hhypbOcoE0H5AHVJ5RyMuyCN
adNN6rPJKRBKyqNUUtR8iWDUogHlsGDlHk0sc+U2ItCmPWLv0XiBzqE56+Jg
JAD1LHMg8B9ASCHDBvUehma7r92g7YEEjv7cGrTuDpV8eKSg/WDKQ64zlify
ZVvDG+rN+cXQA8ifYKk4GhA0aLurdStcZAWbxAbh+w4tRlKd8Ozxs1f8ItK0
4WaYn6BBilJrmeN1eY8TXefbZZ0v8NoUOZwKP0zytr89xGbNeGINL3Dftzh6
ieY27t5RdnKGSlc4FzjCgjgik0t9XqEQze0LP2vD4LRHq02L+/FX3Jaym/am
Yk/d/haVYTMua7J+X/07xO/Om0qSHQYu3q+XcIxIzBdI9jWq1UbkA7MpxRA+
3qBZ25FaLb66vePjZ/swLloNQDRIQkR4RUUShlQ1Ug/ntI6SzGMwJE6BKpFV
3KjhTVSzx58ti+ocdfT8fFCTjZSp+/cy8skGniZaRAu/wReinro3yte4fHp+
xEYgWmorUFhz2Sw/wPfo22B23WOMpNvrVsJZVvPlhlg5UCRLXFZezCk9J3l+
CdsCV22cjfi+vO3q+i3YOMvtaEzTgdUvyDgOnLzOzvKGVRrSVTbdxlLvyQqF
DWzNsjyvyCAGYoePwMRb4aXLyyUqAsD/mVCA3776+unnjw8+R5b7Cq/8HBUB
mdGbuv4ODnwUhlA7mxgmDYE//Sv89hXRY7EY0W3kM9/CUH4RMJNGfuMXJDSw
WdPFjMyRW3H+e4bz3w96wT1i+c/gnKuC9x8ebN/FPDHQzDhDPahYsHQIEmE0
pruHQSjkvC0NwiIdVM1SxKKuBBUa5PYFLWuhXkA0j1t1caFquGnoYxKE40TW
tHQz6arIREZjcazQhTRMgDTjGgNdG1QuwLwXAc/GNs8FbuBVbWQc87EFbczi
iNeLHPet6hQaoIMdWSNptWLzr1AmzNmlhxPPDg6fqLcrFqj0tO4XrVgsgmjb
8DHduryB29oAvaCYARogvib8m/SZBnm4HgWxbharwFsalCjLbbjdOIlAO7+M
BOiHI7jSJf8s0AHvHG/KsjwrSP2CPcmz8/KyqOjJiMX2pCwppF6fCFyVaIm9
kvCuCvV0UBfB2MAdbIGqVrisZ7L3XtXm69OqiyWbYRgXmfXkDZja1Sy7oM1/
Al+WoqcjL6rXzNengbuNcO5vS7q//nvDV+UFo7sX63fFW97GETD7xbrG8IIq
pyL65/Wm6ozm+apo1171DOwKV5ij6sLfeBGNp8jazRxtmppUUrbsiOkwKyax
r1oYbhPy1padcbKN9/7z8NHkEDTjzrLzazTRQ9JE7w8ZxNcxokPDiO6NwjOv
Cgw4GnIXK0DIe+Q1JWabpOyUnvo7sOp431nObuYxu1cNgUwIUc3ASmVZFmkk
MCCIWbhXKHTIv4UiHK8jmNAda1QYCQfTegKnvYK3gYGHZgJ52LxPnL2adK3o
IrcULUBTKLsC477NRt//+PoNXBj6b/bDC/r7q+f/9uPJq+fP8O+vvz3+7jv/
Fye/eP3tix+/exb+Fp58+uL775//8Iwfhk+z6CM3+v7430dsV49evHxz8uKH
4+9GLFesXxjZHlucxOnWeLGAeFrvHafAwVdPX/6//8/hAxGL9w4Pv/j4Uf7x
+PDzB/AP3Gl+W10tt/JPOJ+tA22iyDmkAFoEsM+yA6V3jL7QFrSrKkPrGbbz
N3/BnfnpKPvd6Xx9+OD38gEuOPpQ9yz6kPas/0nvYd7EgY8GXuN3M/o82el4
vsf/Hv1b9918+Lt/XiLjnRw+/uffO+dCBBsuKJgpR+6IXOBg5uBFFt5iFbqz
TcXiTDziC3Igop+RWD88YaMhKKIrcn0OKoXT7LhVqYcnFC63nRqxD5zZsSh5
ybR08lmxwigsu/7tLZtmyWAkbskIyFuQoadLfiiW+aQ5DL1HJX/J8gZmny+R
d9+4Z7dZrv29nsaOPafparTB7vpt3+PPAV/00ksUjRHBZVzjducaJYniXMTL
zGB7xfR8OlZlCk69JOHAWr3GzGtQZJtDZtAfPrwWzegxDi5T3E8mD4MNTb+m
OR9XXtCxNYZOABD4rbUJxCx9aqI/YiUUatz6E+aQTAg7XBRL5fRZTUqAUfVg
Ol8h0Qtp8h6p8iSeV7tl+8FHaHwURGbmgjBdIp3p+NlC1CKlB9JuVJEFoXVa
dFcYkKFZLhekwcAqQbcqWnU3EQMU5VPHVeWSFxCpFLkop2XbboYuB60kaMWd
zqpBwxAvw1mkSoo9oa/ns/Cv7cSWZnMDdWx+Dn+pb9S1x+fN2nV7jdnJjl2h
CibO9D7Da9jXq++w8pndDSY8Zl9DFlVw4Vk7qUUhRtlOpB6EPWStG955EkhU
aDm897M2sLq8H/CMqJt+xryHX4EJEegO9b7LfHleN0DSq+sYwwse4ub58Lny
GDbazJtJLge8b+1mPgft8WyDvJF30FhBNEFmMHJiF6BvTkHlrba6GrM+YHyn
Mmmyrex9kZnBJYnicBE58OC7F8+Hsuv85zXFR5hh7D5+zzWYmmBYk2EpxK5u
LzlCK7GEQykjzVlXR8trhQ6ucYZ2KPl09tF9e1qcoYMD9yt4dug3lL5Fu0KO
a5gzOlSKxRT0wzXcHzL6q7BTxGSB6Y+DpxKYAuY5rfItqmaUQ+pZVYYO92UR
U+V1PPt70ElXm5VoCGhC6Eav5BsJaRj2GXGrl5vTZTkPpNnXUHbQe3baAEOZ
Y7gbFe2cFRS+IpaRX0MZ7B3i0+tHaPC2s+fE3gTmYyxEw5W3h4xefsxOaih2
SZc8kh9C+/792WtzLeW4aa7B8zXn4diztS6LuTAPz0rdh6PT5mOamLFpfdif
EmCYspfAxjdo+MEQomc/ePAI9GzyEZPtLqZh64S3g4GbBSfR82pe81nAHVkU
8g/e/GBXIpMkG1AIu3Xkj+ZIXwtv9i9Ge4eiw5dlcZV9uFPLXz+ynXPLDBCr
A8Am5WVjkj8cMLWiafjYYF4jQyFgOT5H6uEBPlP9Qp3Z5u0lKL1RDg7dyJ76
NM74ltMdJ/cNBd8p3ei0uMgvyxpDs9+g98J1geUPKGKz928Px9l0CqO9f0ue
hSWtfQZ/lwWPRQt3wzJytp4xEXkhZZbOrjBKhcEkOjhlyohxmhEz22ZfZl/v
rfHtZh77M9L4aFVef519PZN4RUgwqkCvgv+6Ygl0kZ9ioAZfGOuzfyrID0QD
kH0+qF6PhLhjaiBPO+bS0B4wZXlXtXjScWnoiopuuGP3joR2fVzBMk4Ndasm
RNxP2MeXJ5Nn0x35B+i+eKo6ciu+aUxN/g1mJtb3s72gHX9utWO1Pcw6BrKR
WkkBQg0ExAepoWAPX2BuNSxuheTXzaf0OlHJ93ao4wMvPCtZhtAx1cBb1/V6
A4P4mEMbOCDdweT2BUsh+/HVd8IU4CpeIK2sgS3s88yvCjhxuIh0R/SFQVT4
SC6ezgXovd7bx7OQKAefVCuO+dO8LVuVGrz2QC7E7DQR+ONHY+dhQuV5xayh
rZeXhQx3Qcm/F5z8673xJLwkcS2ziWsYDka9gD1mDaYtoNoYC2yOTFMcjpkL
jyNzju/FK/JMOnKptSLay07Zk03QGrP4Ex2DRCUxq0hwsYB3yhhHVs9kRxi+
hOJFVvTEsjWWrHgGTiLtLaaD4EUCgZTD6+DjNcZIi5Yon5gd+29Cclqk62rU
EoeQBDkSSJRkkIYV7cJII/UZshjY1RSMBd2Ck864xtNIrnK6na4QIPKzsmk7
Y1vgQWzWQtiRur6sWXWgvR4lWmxLLu2iolQVVHmV7NPf7fZOsGfw9bbtgBKP
sSIHSQk2AqRmS59OcvOpCFCUp5QPyc/ZX5D3kjxlpBqhK7Wr1/WyPt+SXP6/
4Y/77UT+/Nb9LAUZ2c/wV6G336Zf8ffhKf53Fv3pfU+f+s/8572P0xfxd7+P
xh74W3/GE/+gqHBZ9jvzcTCHf/7lb9y9xv+8fo3JZt04aFiifeS65f/WvPWP
w1vbf3nv7eEnbBdl/ZMeHGXoJ/HhM+l9OMruWKLkEoAvRwNXYCTUvsrLioNe
83KdV8FB4UUBOWla1USPBh0RlAfPTOUql5yi+rTLZaxwMQdYd+A/aMptrS8P
rBGw6ViSWR5G0a+rEi4pqIdFsMP8zLxjZa/dT90lrUx0UTbw2+WWqwKSWcFz
4i8hm4NcYcxlsBok0u9P0NTU6KHkUaE3ta6o7GAJ6t2y5SA3iS9ia5iqgSkS
p+SFEdW8J9Cv9fLxKrxDJ7aWWEc31vtV3bzTyBQ5o+f1JA6+DPF2z0mvOQhU
T/xRoFQzMuMI1mayLfPgD9jpZpBKBZJolNemHgfl/2bnu9SfJTbzGLTQZSlZ
5Swfou0Zm8qC1ka+RKL4k+bpSjSlwcB51+QmOxzdOpRPT3vXl1DijScdTiKq
Ay7E67xuOQj3kIgpe+ndKyb/vZf/T7Fg0dXamnXD4JKhyDSmZ8LuwR1Yhuqu
MQ9P6qx3EaB2kkvA9XSD5A6yvm6qnivPW9asYM4xfbKz5tKFxHFHnoDF3G4H
/SlOd3kPM9fOL0DD7rhwyeS3kUapDhvNcEiMw33aILfwcUH2CRArEaNDghg+
udabhayUkb8ZUwc0O8u6feT7QaXIXC5R+I0lgtbHvj4u5oHVuth9jVuQN9vY
KsOYJivTHSVFSTayDkbqPiqk7AXwWRo1m6JkDnKNVDnvckOYvsJgflGXc/S9
/CbyUY2C+2pkPVVReU3w6+vjlOabK+OKRIA8g5wYc80oXkCUsrIOM6Ro8f+P
pkRjbWEOiRNHTD2NqIXe8o9MedxXfwOduBB9asVpcV5WbVKn5JPmxMhFgy6U
pNSVWxVYMlC2cLinaHR4DZ2VfI55AKv0tzQSvDnMrhB3pMNZfNbGuSDC1Zlk
25CqLLYlJypn9+9NyI908swbbU7jWOTXodRAMon8PNQJBbv6LDiP4/QRfG1s
OmHioNpOqBTba0tuU5CiY1jj/B05uIgZU90E+U6ZasbGljJSVhkKrdixbYXK
N3vJkWMF1x9lhibiThleQSkvzDkwBg6zaVswEhv9RF40tuwVK/cqrRls8Uwa
YIcLTnQsVrHz2CnNjA2xkbuYzDdcGdlwImFwqFw+prI5vTxodjjcbaZsnUsq
qCIJpbz8BvHkOBtcC/2yPVzThw+aIFidTzil++NHVnokEux/LwfG0d2ecFMH
UhBnw851ziFlN7qxWV2JGTZIM+pGplnTgcqe5UhiyELJ2BvrHp4WhjHCDK/y
snPoH1nSO/FyNEUIxnt/eqtaw4INxD/6fchOuBjtw53+3oAqBspX20rVLF1C
vBdwhJSoYqIf63JdUG4BOt2qVi+UyF+qNz0tbDEWOsvabEQvHZFGCdJyLMay
yePETFWsoZUcV2HXmB7jaPjKOAtIKceAJAdryS9iCJSqJIAOxGmk3lwXwjKR
dHNWy80XiwbPqBMPI3p6xj13QVGdo9ucPEBcvjF2trjT1u4Fp6GsCSQP7DSL
MB+DwLF0Ei6E5IVKkig8qKy838TKK+9zlz2UNzNDM1o2MdaKCBSWqGpC7OSx
Lr2wpf6FQPpODqH3puyGNxUlnRa8cGRDfyM+XyLdfLGVPCFDPpxNVXJVIWcv
oqxh4omiiOhDXC4cSrHTwqdRINPBxN05Fhty1VO6UakHKtht8T440aYyjzQB
0yEB1Peoa6jSqk32kDU7QbxHIG7YPGDeYmOj0+xrFAPvc/RNj8V17PW63P0d
IR7eeYiHNUI8RH41ELb0NrRkhUF6t/P0MErLcMPprqjE/BVNM2BjUn/DJuRf
1YGp+QdnxM/yig+B2TNFJb+tr/Bicr4WqBukbFC5LDIaig6YwEBUO87SJfhA
mWCIZmhdIlbkps2NxxGLO9kwQcXAW/+w4kvkrIuEmUcxHeZjpLfxCWCUH0tI
xjiY/JLVqlKSDCmw09X1OwfvRwrhOF3ITjUTWBHcxKJYcY5tVwQ2SgqGrBum
fgU2FtotxG7msDD0PVAKhurcB5NHB8iIgHrQGPiKKpFgUIQ2CQYiHy3eeSfK
+OyHmSSbtmH+nG0xtqfKc8Ux8dX4FDLS84J1eBcWdYUXsL+o2Q+Tw1l2ha6B
2cHMZy4z+0Y/7exwhow4VSprU8BBA42Ujkes3KP5OBfH74iu0LzDmrgRnZgz
J6ar46WQQQ/0Ai+5f0BwKGIunQr9qa5Dv+ZdcI8OWltyq3EAMilRVlriUQ8r
pmuCdei1a6TH1RqX5lTUlN0TUh+KhnW/VhK/jUzFFyoFzOfFumP3S7kqySHA
Jr1MmXigFATS4R0e/OejFrno5N5BSxHW7yXf9w0QUUu/+XBH1ORJp599RG/Y
agWa91yqcjUBiXxEkXaPrDdvsDCTc9Ywzfq1hJS/ODw8QA8yf+ZjBByOTXOw
OdcC7IIF6yJw0lOqHwHa4gFA49fcTFZx+ONXktN9HI/34Y64Jibxi2BxYrRj
IT5q7hQhJvd4kuDjQTdCTQH8AC6QBpic/hbYbOJtBNMNFBimEI6dIMWzytGh
GsCQG1zbKeXyVbEMqV5XdTIkEMYGf0K556Tpu7ziezRkeY3psLhyqvB3nDx2
lG0xwdThkFjiuEoVDg5rib6k03t8wAkBTJhMl6T+M5uW2nG4eOWa6Y+CVLAa
p2nlNkAl6hZNWOBGcIaSUN/KaTK6Qo84Wh8sZOpx8Q/Yk5c8xNHdTHUMFPt1
S9eHToUKAkrMSFiCfFpEopY8I7AXL5Co7uFuPPr8AeYkg1Iv9Mm0L14eTivB
nFTCexEUK34FFwJgRk/sSVhIAgnyD+t7DYWi6GH4zm8Jsn8GHijaFO3DrFzE
EYKYLNk40ms9VXdPr1bBzDOzedmU5/PPIcy9mIOA86B0ROT1eoJidsJOucnB
AwoZEas8Q1QcwXmQ4JvF+MKgK6icNEdcvxSdwzPsGcQDJ92mIgaSnq73SgSG
ia9hTbLdrGnFCERCxZ40IJaS7B4Fj1OeU99Dwu6QikBLQbgC1bqdelEwgW4O
ugdzJqoza53j/+ppebFeMic9rVF8iP8Sl7jMt2L3CsuHyS2xAK9wNVXnUD5N
lMhU5lU+iTEUMPcAh1fAEHx7U3SbpgpgPE5EF7+Xy9z1S7gpsMC9B3/+M4qO
h3/+836ihpZnVjEGlojCiEwW5sRa8M4gPiz8+JL16gM4Gso+AL7Y3x//u86W
5oY5D+i0wzk9OHgIEowG/QEGPZab69yf4kFkKYtWJbSskMcik12y8jW0kfuK
Sxcr+JJuFVXyZXwYKuUePKR0j9jSADqrcZC5BykiTkr0MI73ICpuCn5a1F8W
eYP3Gy4pZ2bABdF0rBEVymWgYYPM3xN66SRP68dXPxDgXrvGssIRbOYR4gMe
kVuxPYIbfAQ3+IimczTaB3b3c/YGncDDf37OnhFX4BTEX/3Pz+7no8nuP9d+
+Y//waBoWZF2qdpRvPZjXyWlHhbmDkNS1+hgp+TFbdmMJbF3hcXiqPPK66YU
kN1UXtNdvEFFNHq3CY35t+d+Qkrem4oYJSuyJ8/6A5uqgH+tTz994BRzQ98B
7BD1i8VTxpmIN4686zqgTcnQe1X551OXMI7N7FLLW5OxX/lyN7Pd7GUT5ynN
PrhgOHhpR35T18+x6PeTRj4t5jmKKYrDack8Z8xpiTDfYykQxteRs+6Ezzwl
/YxjSujNO0XAIQqHXBTzd7QG730E8cL5+mfAfwqhHCEjyvV/jYZSMq5gyZEL
hV8+mIfbXfiiVT/bf4OXwa7BFmHC9htcaDjS/H2S1Mvz/xs904KFhQYDMOTi
/bwoFnIc5MRruGg7vJw8GYtds/geBDMNnd5I62spWxtiSGOeqBqQ9RlVZPjc
Y7kouahtxUKtifCuWGFgv1lUTMpHou6VHVYH1r3gu1Zli7SPF/3kWbquPn4E
3ZsQY1WkC4nUCJidvfTws/XwtsnpXbd3WiKNg6gbCcXJEEqdOSZM213m697r
jnXmnnq968oX1vvzMUAc4nTWkwrWlz8zVjCXoCkqBE7x/gLuJaMavgmKgNEm
WPZSMJIc/z++Ook9S2iUqW6Vn9Y40mtRobRQ0MMi9YQsx2tY7SP3VqmgiBQ7
X6NjqikJEuj4h+OADiZUAxOc0DhEKLiAEesaI7Cl9JrhSC9FE3kmmAJeiQhe
wQAesSjz86om+Dqj1Vh9SWgHd5EZvcwHP59ElEipouLuiSAJnKhS6iDF0o0w
BYqKY3GzLEM8SRqMg1cXmEkuZaBgFrpHD0Q8dJI/ivowQm1SQS+V2ebL9UUO
ljKLqQotZYZ8MCUK3tHZZg9piPvTe+TvBJXtwaMHj8lOOVGegQlDC93lVD9V
DazUPaNk41PCe2i8EeZ8GNKgRo2j2nIWDGDHAumkvl10jvODOAd41n0WayWf
jTjQyeXZqtL682dMCFYKyYt4k9oXjz6a7iwcgBtw2mYjWHDTcZLoKF8Wjbzy
Lxx2p8mIsP8Ja7J9gS9BnAzHhkEmM+KAFkfzMOjMLAU9h9JLMTW7FBdBYhAc
ANEsvA9oUy0pzBbwVYIC4FUwcoR5JMpQUs2OIZReCA+Kcu6vXCVKrhyiJLbg
q4Kt7tOA6ICm9Y8UQLGwIR4uRxx0Et+MIvZRZjna2xyHmZyBGfDxIwz7NMrC
4fCkJIbvyF0aGNRLPzuuh1Q1slHGj4eAAYQn6+PuecgHbot4k8rIRMWidvKX
jRQkrB0JKgeFvhlN9Eq3Ugb0v/UeY19R4n0e807k1kqiAAZArhEkT87WofyW
kCMjY5TqjdKhjyjX1d39TXb8+unJiedMwISmUs4RwJ353iLM8Sj7zV1Xr3NM
U/ixWf7ucDpl9IPfP3FuA1sDHO2ZcNEnGYz+g1ecxHGfFSA+WbsM3j/2YMNR
w+g6DCpiNET6IDDMOdUHNOTd//GHkz9nQIRwRvg0rqjqw5fBfwXdRxNQxuKP
5IFKo6HhMezxx791+vN9LsDgn0zxVVwMmX0AontDCGn4xBPMLlSFRp994j4i
gBzN6IlOEcSBHi/nfWAeNSeEbENMVL2KNYd0KY+DPEgIAmIOgzX5k2d/OXz0
E7/iDYVYmNc09bLwPD1OfoQhCtBuaRlzVcH3Dqgsj71xe4f0jyX5zPbu0T8u
KG1h7z79Y+/ew4f7sMRX8BZ+94nH4JPLyyoK6EYDah/MAI/8cfbt+l3BxtXJ
wm8TP1Aiij7uQLrz9hkZ9225eIJKGTwvkICw1fAU5sDRXgGtW8LN5MfwMRDY
hgAP+bXoNrYPCnIIP3z/Hj2Mb/Gzw19/5Dn5z3glrzRJDjaDIplCjaZgLFra
x+z5at1tn9AtJWbtZRTMmp6a6ZnPspy/YdiPUAuliR0Y9nQzqpPgsNQMY+9v
kUXMPPy0aEP/xJkeGjl9KEraRtmw5KS50wBvq15mTnnoWIMMCVazH1788PT5
29cn//F8hgR8+EigUsh9+G9iSX24Q2rzRwOW4Dm0ls0yXoDHBdTohM8ZFXid
kSQQjjhh0KIgnIGyUM2LNqQuCjpQ4fmkoj9gmwAFSJqOaKQeNBKydQE+qik2
RPW+rAbbPEKE1MN9XzOGpEnBEdst5EJpyptJLU3Rp4c8aAZ+SVi7v9Vcs1Ms
8FJnRIr8byYPAQldb5p1jRRG9B7BNcn9D/hLwgP02uMJbtGjJsT6RmLFfgCL
f8j1RwENBdRv+OlEfzphIvj4hEJO4ZXXD0G/m+Dv9HlQOMkp4TRaLm54zDry
sK1UJRfhVrWk7wQDl76c4JcTOC/KHDhOzTuTvrgrR4KS0BiivJfN5GeoJ896
TpjWNPOvDMpGlM6Puy4civwjIAXu30Mp4EngdPuW3gusUVk7m7/8MZ3wx+xr
3EZ0rpgTtby2/z1P7G1HP810kXvxD6fhR/s0TjSfI51zpp88oZ9EEzxSbphl
H3sTjSd509x2TQnDdDHZHnmZrVPzItw/ECj0KJmV+ert33iaPHmZs78q/mwF
nqKsCJETj3gtKg5rAAxyb8O2bi9VVvcxp75ldUFSg5E0V2UVKDMGn5MM08qR
44Dy3VgTjH8dieyR/2exiFFEj5dy2x3fKC4piDjVDnA0Uk8Ih6siYL0ZzFmI
BPdwlk3Y14FI92j+9N173qvGWKAchCGEBbmrpIrn1BOikLhEkJWUSoKRcMpG
KNhV5Es+xHlTLpeEViClMQpv58HAQoZ1SLBms/qiPL+giGMyMBbPm5whTFxd
AhVyhiwn7rTqsjJYkt5UqHIqa/Np/lFStsUui4qLaYOJ2NcY0sbcNdxgrUL1
so1TdJAxNfBoSOPSohqPo8o3rEhNuqmF9wwAf8iFcTHbcS83SagnE9a395oG
pd2chDzKjx9JeAnYJALMIW0YWlpz/pCUoHoW2wcpNHKETc5lcZlzpE/sNThu
WAspK3dI0ffCyuguQ0JMDDUspjQvHsvG649n415NLgdm7XHj5XB9lSU4DwW3
ihojwNrLeqGWD3vYBtAfXa5lAB6Xkancc4wUCof2fIc/24m/8mtN5Y7tF/p2
HMbzRQSCdMSZWzZu4vYG6GmfdcszTME3YcB4Gb1cVBcpU9u14F1EahZz39Y7
9s8Ii1yTBOMXMOIWMoyy2tQYZAWmBRy5KrUalhAHgfg4N94zQQKPXPjAj/WJ
OY7o/o3U0xBnCK+c7R0+evjFwwcPDg4Oxtkh/P8+kI5++tB+6vTTR4O//dx8
ClPqylZhjygeHvxRe29IB0P6LQQuQIQRFVWDjVf7pPbOiKrkOJRVsR3v7GN+
L/azF1iDtWmYM2s4h/OGfG5SOC3kIOKacnRy/uBEHFECaup2DHUxPEXOewsu
LseDINPEDEAODBqf/DDiBGYnji0kGArhyqljOIVfNVPn9Ey7EZyc/dcNg7xQ
+wrEk5ALIhC2VCEgDOlrr/oabtTTh5kVzYJKMksUavVE7OA94SoYawoXITBS
kvmCA4ApSzWZIk+V7rGui2FTJbXQsXcUsRbwyvhsSK4YpGe1fgEbw2yY+Koa
48o+n0iZ0enWeUAGtFJ9vlFqZwFDMIr5vk1VzoBrlSCH3cL21vJi2n1NxnQw
+IiXp5o+oQvFeL2KPLv1dW2IZ8Hp4AZnFn2xPaDZnpJD3LwNJXLIiOIqIjEE
RgoKj1X4qAzN85C5FaZ0lrcXUvWPh+uLAN9gX4fYkJUiIsPJe8xTgdZMyM6L
BnTCwADaRCuysHwgKLklNePcC/XpME6qsmw7ric+2wZZxliysxkRnvmDzk0j
DrPIwJgl0CC4vAAp7I03xuWXmVj6mtqKHwkSJSYfj4/HjOvaFhhsP88rU3bC
QRoP4yL2YF+jFDVZeglYpYYhC2MNOwTLLErOKn8fadep5JfAt+ur2ViupGBW
J4ojw69Cxs71rwSxo+4ne0G4A1WgKdY/Qdl1PYW//8LsWU3ZQvUYAy2sM0sd
kWaPCUq80+IrSrtjbdizMS00xfoc1j/xUKuagrWbqo9T4aKOMUK5aZhh38ZK
AsraYholEnAZJJ2i0LA2JeK2EE1dr0J8dZrF6sowTqJTEiF0X/siJhcq7j6l
KnvqE3Ym4QuV19wd0DzhfEGeHvRfXrx8/kN28vr1j8+PsGpbdv0M1Rwps9P2
dTlbvpEFRPWg6QlnX36ZJWRI4EjtBaWj0M2HVRKII674qvgM9KiLnHs7uTKi
vbvhpDEkhpIQ22D8RD5GSjV6Gt0KUNn7YV/nsOqk0ZvnlZoe4p/SgpQE2aQo
AgXQTAMnvnvzYr+17ME/9sWgaRBA+Dkl33DkOnb1cFoFe3qC301i3Gy4kbJM
B3++rE+JiqTENNI0Gbc6VKYCj3KxzW5LdNu2npe5ZmjA/CggOOPwwNvc3/W3
mnM1Q7g5DG5rtTqV+nndmm/qZy120EF0RQ/yIJmkZ5gqhBXIMw46/IJX+O5H
N70i+GP6h0bShfZnQHRZR4tCGRgNC5+X++Ah9FUtNmU8vrxYxbu+F+1hfDMR
F5oTtB/h8rA7i7ClZkc7EpfIWB9wQMpdlgmbCj5jNcHLCLk9wNXPDHorYgPp
dntUOu5XwdYphrhYdaWb5dfDrFEvgGb2UoYcXm5Czz6jfhu092TNWmHCGS+Y
MxeQI3gT2eTy7glqISSJCb2V4PKO9WKUceRKoycoPNArop9JKTXFSU3JJmFh
eQh/8U5rKOXwwNSgxbJ+HCmiURHfTpBWz4RaKYHsI1bJrqqnju7rTnCEmY/+
vTXo+3LO/VqJ+ILIu0M5fpbtJU56HFT4LVyaJ+Iu4mpYrF4Sn45NSfaFcugk
6wcOPTQm4RvMEI7uLZftvX1XbGXmg30MdyMEShZGRr8qQ/Q8PYhYIxjQBjQ1
i3tWCXqI79LQcz59+GDniAUrRCNfY8X2ctvXt3vnSnwO90gQ2HD+cbUlmMo7
zhhRajLBK0jQGMrVasNJQEr6FlOAqxH8TWa4euzUWTvpiWmGkzZXNRG2zFKw
WZflO+/N0hY/0Vk7exd7p6ltTWVHTCsOjjG+0pZtP746aX1N1A2JG2PFHQww
2Kk3auySXOF2kBTGKbiu/jL13XOmiW8wh7YCGjFB4sL8p/FqOP3DOrxyL9yR
I0jjJGAnWPSliOFNiUfaYm9m+asy7LxaKDiu4h/m2lLRiV4UWEizWQreXRho
9oFVgY8Sav7AYhv/yemw2P7HEC2Gcw12Yujlgk8LPAJSMe4dId3sRU+VPbDe
wXy+aTJH+lG5+Ih+sQ/mFCdwNvI5zz4cm//KA+6nS1Hta29nUmE/txw5JdHM
BMPxO6hFBlV6kV9G28Kx7izR/EzCISqSsGETzCocg7hbs5cE8xCzRw8Cio9W
oaFHP86LukWSYeRvawyhBrK4Sw2O7voTuCvXaybuuNNAh44QsmcDeUgyyOOv
/v3g1d//4/u/v788fvDo7ePt6uLv2/mLr7541/ww+beTb/798vztq/ar7TfF
3L+GOELIX3sll/vDHXu3nfcnsTddbDB1wIWmh0GDFQ3a96ah3E9CiXTagcXD
IqLKoPzUomtJjaN+JVhbxFtVh3V2LOJ8WPMWoLfNkAZFfJfocruMWXEvEieO
LSfNP/xwx0p0574KADxao4tlCbxjZefxzaJNC23pyNxTIeZ62kUCvYDpyjeq
DzVnD7kAoe3hkPzxcqdV8c8P6BiU1pjiPpxuPUCpJMi7b56/8UnysMLAU2qg
+EjWehUZtdeQJcPWgheXbiatkhBkGLO1+V4L/pYyGv5qYNodVggikN8UGwd2
Ue5KKNO2Zed+UClT0zweSoWV2l50SbhZWsRD6kOV4GKcoQEsZY7BgT7QNDI2
iOlFzoObRnqOLsUmckuJAR+Tob3PfCUBR1bM5HDbzaJ8drE4BjHwbMoWZuPg
N0LXojP0LX4+JKGtRA+ZACRwQFWdSI5oAumcJWzW2zNfxoemlHlQxmxNIa/N
Cr53cJC9+APhE6BtE9LhvivbbsZUo3hwvulgZtsS3sX6VnOVJ5jOP2KHZm88
3x8qMDhb7GJ+b35L0ctFoUExMXQoBl6IO0tsaPG+9tpKaVhCPXduiJDaEr/O
q4IqK9Bp9ebFsxdHwx1Nd5dd3seg0WkJwpGQTIwHkX32SNFJZS167y7rcoE5
ku+4wW5qxIgzgnr7UdkvuqbQbRN2LIs3O86t3ZXyyOky+NEfihX8+12xems+
W5zhZ4sz89kxMF74MIf/mE+5LcEfEF+L/oYW1BPNZaSXwSTE8xT9Ppom5nEe
PjKvofzIZ0HR/gse3E+a8ik/pZk/yW71U1zQNT8lR1jkrHwGDBbO9eqiINFK
aHpr9b1clYvOQz2XCzyTyL9ADFCCJwGHo1yo3eJ5V0T4FGRx6d2RxG3hHYa3
loxBJbMIyvUFdvuqpL5va3mnE6ZAmjc+ZKWPlGghny8VIYNoXbGEbLNsvOtP
ZJD0c0oGorQrGAx+U9XRT3xP4AEzOuoxGQrN8+wPz78fZ3949jWmoMHPjp8f
PzMdLkAUo34XH4JwWbx2dFvnGKcTaHF0uHWSpjyhWnX9VmvWvQ7KBcwPHz86
pLSU/gvO4Ao3nEGBgwRDt/X3253RJpNqMyd+H1JSgjeI9sLzuAV15kxRhiTC
6SRkBYMtgmHt7Ymn+MXkqURSBVyhn/uXxT88QuffJD8vvnz86MHBAd8JVTp0
sbVvQr1pEX4o2loPaQJ7ZdJ2tPturJ2hNvUDBX6+G9o79C4Kzhzci5BhJGXf
yyGFr30ydECScFFIy8ZiHbqP044haj5wLZqnywl1CZWxq1Lw1OOZxaFf4t7s
SjRFLaIEs7Ggim/Yy8QagFvga31pO1/++IacLjdaPoL8Kn0pCXZHkrtnPdnt
erKbR0F/hQrcgfxQIz80bVwmLkKAShhwY5Dr80++L7occXli8RN/p4Os/G9D
tjwLEjJUfncQUuZVhIWseYkd+CTot4TnxU8O/FziADt+rrOXqMhvslkyxRnu
ME8u08/UGRdKjwRFBDM9wxCojpfX5vl6/Bhfncs9G7kLUCdA4AzNW2mqjBhh
tIwJLSPKddPguJEcmiYl4xEbgQnJx7gKEJhgGC5ALab4jod36Pf9YWg/+bUM
KGEDGY8Sp2QnkERm3g5Jcrn8ouOuBHb6fJnlNQ0GXmyq4YIq+9lCrIqcMgU8
LnAd1P/PWhmhl8Vor7UF8/FIU6GS3eO30YHqVtbAIqp3oQLnNJ+/i4FoeaxQ
4V8y3MzMErzforXp9xS3Ntvd2AzZKTXlkClHYwQvCcrmgQxKHHZqY3KDF8VP
0MffBlsx8UDX3Tg/kI+y7RqoH7rhiPFcm58k4D7UcXbTqzTE2+LA9Gepj09w
3vOZWIx4mGM9qkRTp8tDGryFTHKrougURtx46cnrtavIXbNkmAoMHK4hFAYh
Jn+BHvNgmxLaJ6c94jQwaE89lAnj8UoLu6RBmGl783B66KLGN+F53w04qhoS
MbFnaVjwS/kf7X72ZfbHRX42pTfv0XUxC6HSkkHsUS4pyYK4GXO9FVcr6ZfU
FU7+wJfMjRDkjlsv9VcLD+6HwPcSZT2TmzQPU1z4MBAGGDerwLqHrh46Uf3n
5lkSyoahqmM91BX2EFDpHnIF0gDnZq53S64s/NhZfvzG8iO4KFfwsKDuWqhT
xegwWDuiJfQ1g+fcX6qutNMUbBhLbrHvepVwVqx/zF7q8RMK72uWx3REXxN0
zywMO2MwaO8OJIODUi30F1FyzGlhT4+cMFwnY12CkiwuftwwEtzV/UxmIBNP
Xm9Yk++H9ikcGzRgeF109YUJyokM7AzMRT+M2Wneulh3g6HGXjv8Mntd5Ev0
2u+t36EZxf3AP7ezHmU//5wdvD84xP9y6eVbLAEdUy2Ef9XbPIc7NzgLuVlc
ITtbv/NMPtoo4VDoKshm5j3+11gRqnGdARC9vRlM8t5syBWO39yfJZ7w/bHb
tWlD0xvYdAquuFmyCfR4XvloiQL5qEswPH+cL3y4ieoCxmi5+LaovgiesjfF
SSBsNg7GEpaVL8kVdZOYxcyfL7ad0w4EJY2TBGQoJh9qNR9ND8ULjvvNVant
puwKhRUOvKnvP5v2uIHgtogf+smvovp/jPfSZC7J2f9iN+ihe9oUrG1+ny/T
p/C+XcDRL9k2SkLvjGWCIj0xkwkGRTJX9FStZBOnfMXeT0ovMUjx5ZnrBla2
cwWZrsA58XRrIOfXd9jv2PKwzRRZkF8MN+mkguS8cpJxTyjPiNsmMFrG/zVF
u0lc0ZYUxUcWirt9AbfavbFr/rMYguuzaebBXQSgz3eTgZNIf82DWUQ8gQUh
9a3aih/GxX47QYBGF7+49c9gwzBLOxgAr+T6ngiiCgeVFkI6LjSdwDbCqJz2
gwh8atRgFGEcxdNB78XScKIIvXHA2uBeriRHjKFKz0x1gw9UFotIKZXTRCpx
5XmFJFt2XBQX8pA6DpAQ6ImZpjmNWQxWNqNYHPf17KcDC3LjDss2JkQiX5lY
aKyQ1HJpApukebUeBxNhuFyoiLrBprb1Y2A8vOgEMGXMVe0NpTvYHGB1Yvk2
qVJJ0vtB7PDyvRMd/HwphT9o36l1JzjLmKheYNRgbpg0Jz8Mh3GjnGS2sHUb
6fxgPKYp8vExDwsdwah7qByxu8URx+cEL+gfE3OMCCduTQ64YLL3U+/4ApfS
mAUTu8PtvHkN7tPIVNVwmP78oq4ZprJed1SzX5/5PiAM784dUebLek4ZsdR3
BM5mIH3Q7o2t7jndYNwzOCmpWSz2uFBS9qTTUVMPciC7+GeC7jdceRQwdzR1
itLq3EBVsJmikW2pGzU+QhabXV27AbA/n/qv1rzCi/pOuZxsviyKq3w7Zjfz
Eos6XBCWwEyLK6xwwO4oY3HsUq0PlQHR3rfviisf+vUiSxBiNRvCJ+gy9GFE
Rre7BSpB+hSk2IkzA+VTdhvTVMEQFrCZoDDo7Dj7lAs87DoSW8OHVAnOMcjs
YBRR5xSEpL2qnbGU4gJDb8W90RKlKmL/Pv4d9sRFkWte/SgFzUrZlrZ2Vlg6
xt+um60LwJEB8trMgNqckkZh+ruqk8g43J+HFfrsHGPVCTDTkGnFMO1osg/Y
laZdipQ6U+7gZbF1BszNhnB7WFYg8nwDLh7Ue+W8mYNRCEI9Nm6vJ4zC1Ibu
QskT6JfSYuXItEWcf1PISGj7oeKB345roZtnSvID6rOykjAs5vNJmwtThkvo
4QXzFuuOW4SejidcCk9pm7wGePXZZokDnpbivvKbo9tnSR3BVcgGCajsWMVN
BxoeJKdLl58rWI7aZ6x29wKmeGDXODUIFMIP7oEhFBTIf4G2TOT1+BjGsKAa
b756JmAae48ePrxPWCjRyyLfxyh+88grwuJJ17Z04aoT+lw8rZHzPMLSZwoh
4h+C+2QuEXmP9ZJOunri9bUj5K95ko+imrTQhb5aIlzmlLoBAyUxSnotVKZO
vDW3UdCQNLDNk2+ChVvjYX6jJL4kkc25F+hk7LXtJo7pleTOgBokWX2R5jwH
a4dcuqIC+u6RodlUjLmg/bdChrZm9KG2h7moXPfNbTTgxWyjSjdR0wfRQxxp
xyZ6s5SvoEIA4n6JssLl86ZuW+5MFnWWx6TjUUhmYukc93iw4AIu4ACbKjnM
M6VLmiaylv3KIGBXVAmMFjHwK8c1E9h6RHBccfp0EDTZdK6iV4H6vMJKVcYh
x9IehqUdmADar5sQA8m4wRRry7plieWfol1N7wnlDWAYwFum7mUYk+ETsXeF
YCcB7zmkox015CIapWxPKoKjxlDtKDMVKxdUFgACk8JRukbNv19xQTvxeCo1
GXPmPPVKYkpd5eu1T4jjVxMEStxribyfxOWxVA9HwWBb6BEq3Q8rsXGX0dBU
HuFrtGEnF9sqX4nbOq0d4mRmptOqrib8JiqQh0GkYJ6r5714Y0rEHSThpkcH
+gh2q29Nhjtq7TDMCF6wYDseU8pgTdLhnTIxeOFUXdQyqUcDEBwbR12AUlvk
5+pF515c1E5Bsod6frzwZumWg68Pqey7Grf3CINwgW0fd6YkK57NYrQJLkXI
uLk6HmOYGlvKxJZoQY34LKOADXt3fc+sQbAgLn7q2mJ5xs2GcHfsQRHtvQaR
SFUFXKXPvbv2bP+tB5IsLgEprxe6LNuxOmyxKqVlOQM6IsYON6NTeUewJE8s
9sKYB0zH4tIDeqXgHPixYY+JULV3ClIpkkQI2PtoPdzyMhRqy90YW1ql8gpb
noIvRsHok8dMRzZEHiUsS1QV7aWORrCqokAULMjTIqivOYtocjgI3fUvDxXW
IspmQZYJBrg9oGne2hpEkQTR9qGQWgEJwOU7QvPDMFb1abXG0ODJ9Bq8kVQ5
38CDcJZ8DEK6ApQg9DpErLDjKUvntkbrNWEBMpGkMgHbDyyXG+7RJUjJWGmh
4EQsX3y/ZR85XPSZhEVBD2C3Llg0QbrzvWDcFGwWJgBbpkHxoDXPtfs+iB6l
+e+WSKwmpt9zvKWk3lLSn4dwzvF3ZgvjyoJMu3cgYASmcvmGToyGxJlvaimy
W1QfUIOLj38laqLHsS3ecznYQpxZzk6CNHZQeRawk76Ok0pl3tLm4BX8Gf/v
0v1WG1n8Nrvtn/CI+1n1uJ9v/fTP6oT7+R98d2ax/EvqTHECB/Sq+NvRDTPg
R7OwH+PMo3fe5tFf0ifk9/6t1/+JF/QKyOEou9WjtAIknz31de/7Cf/ul3U2
GdjhpzL29bvsJ0yT8r732/z533CHf8kffHQ6nf6CJ+Gpf+y1/4cmhkjhZ4QH
by+Kxf+/NJFd/qJHLz0a9dtaw/g7fyypa/6H5JP5cJTdUUUg60CNKr4cYWeP
y7K42tUMJIq3jARSK8AroHyVpvTWnyP6EHciG6eIjiFFSFMOTNGMAAaj+uZr
bZNy3zS5x8AWtj0lVZx7PunRIOGHntsDQIEY4x3UWEy3W5gI+/zVMd5KMp7p
E87ZcNFQmNJQ83+D66GhxiYDzYDR3iZoNNTFSVccnhdXCFN6pKRp7WPTRDqY
xvexEHA5Yzs47xyxw7Lxik6fckVp2ATNuUeQNhl3UonBAr1J6NQYvetLqRsx
ucm4WFxi4eI+l4KluqvYzNgDB327qJCS24p9Slhdt77I2ekwyU4iXe8o+8o7
qXow1GDXgS3SFitEJwpplV5HrxaUJCTj2aRD4iOUs9BTSKcwB2GsMoOnPll/
xyREJSQgChrXvj80QCDCtFq/QoO00jFbMgTm803T8jToe5rE18TloikUNIFx
tkWnbGjMZYMwxrx3lA9sNesoqS45M/ZYtXoywwijJhEvuqsY9/DI58mBsl+T
y76jaKPklw6YPqdbjnFyeqF4P4OzwoKlOAmwe9gjDCJpjwH2Z2oNOhO5FpcL
ZIoB4qS2kM7kabOFIU+Th0TR6yUd5LqaBfHMJ1qztDhIE4eo8+Omih2kZ4Qk
V209VHx/B8rK+0+dx/8GdkG4M9dsYRt5hvUgzCmcbl0LRnpHlyw23kKzanXk
aEF4r8w5rNAZPAQytdXXGUg7MflYunFMFf0FeBWuai5CZF/lq2LOyLGYd6K+
H2+x4qVIuIP6i6b4tMd65boy+9NxmEsx6JD1R0TZ3FmW2dzlyFUUx9fNJiSr
teFIjhtojh7frjs6RO9usS6x+3pdu8l014ODPyUT5+WapW7YvG9C4jglFPXI
nLb4mcRJ0/hZavDzp0lmG2+rDbBI2FVyb2D8p9R+zzvggucmSiGWBvQ3j5/k
9pxwZSO5HkKulXoJeolJGtUPX4uXYQVE2iLsY8iv3MHQfCbugEfEZ7MRmluv
gwIR5CLkRe+RpBujdKBuhT7/HZ3gb0FAnL8VJRQpgvPhEwgickYawz1Jg6d/
Rgn3/MlQhutU8n9tYi7DNqWwR5oKOwyVYwGs8Gk/ufi5Yb1KUjz6CGF6i3uJ
J65XO2UOF1MXqZQqal+CM4zyrHeW1vhsOFspQb++NkfY517MBlIHZswAtCkK
i/ABMK+H08cWzYvL10OQSaHgOC2OOQYmskmxXjYj4pqNbbdv+9OZUt3MJyN3
tUPQidjXSIkxMhi1bFYQA5/2FPllWf5gVaw0Gg33a3Hz5WLrpqr9lCiHvupc
PCW690NzUp3QTyqKrWoaNVU/cpitQFY969tGt6lv/FULFG8oNZRKh/4kOBtF
ZuDLGa+voQgrFyUnbj/mVWNBzNPU82hHbM0is4+hGsjoDuk306Gnb3/9Bh+/
vm6sXxgAY5J9RexQ3dP7O+vK6IXDhR1DFyk0EtpKHF9SOVFOIfX6RpveeEWe
pBTN1SieqL8WT8pM8zRFW4vVhKkmIiyX9iqKWkWxX2ojG7SmRZx5QJnhZIrP
Br3IYXm3vCU39Ul5iZimWIiADXcLAYK8XdsU36tloEnKULOXj0T3A++Lr5Rc
Gy+xkis7NAAhsyrArB80s5dMlNKCpHhrW3vBpAa3Wq7lXyKYiacCXumBgeIT
blnxZc9BsDj2tf7Iqpe8ZDILs1eMUI8W66BIDtWCsd3aV9u591gXLDw8NI7z
k8mkgNunhcdwd1WB4ixvttOffpI2VOES+XA6qyFBkTC4i8NuIy6W7Z+MPDla
80lGiKl1M7qm7JogN9V8uRCrx2+p0QOPtI4ZbZcID5+soujOWQwLD6fe65Hh
K7CLAAvOBpRVP31+as9OLzDU1kp9dZZFRIWTND2w+lMstWsOuUQ85j7adDKe
hU4PTQWj9h1syMUdu8yrJC9WvKm5JI7IqzSCTSqlT/02ULj2/aBmL+BsSh0M
23i0NIGTlneHcl8424XSD337HZAACnX3z6jyAKUydBjeDxkOKZcy2jjDtKnX
ybTyZVefcyJH1JYDzoQYr8Y2ZTzF5gpHqwvgODqixWREsaGmxWD+kpdkJbUK
mgIf9fUyRQecLSKG7WAZTzaL83FnU347Ym1RgiEBiVA+Tmcu0Si5RdrUvV83
7rKos0HZeZYQrpZvJX5SZaF/w5hSki+SJm0u63e6CVspEtYknAz4oEMvbRxN
+mOl6MvMTSwTnx2JGhvC95FCGXQoq0CVugupPhBhsCpvIC9+ThAfAfbNebDL
HtSHufdvMbvt7iDoZAQE4oIms0vmh4axHtrLP9QHCum9EYYBg+Rvo4EynKgQ
n9H7JPchUvZ9AfOvUU0/lIsQwOurdBcw8BXUHkEFsGvksxC0TN5aHRatP6UZ
/AzRJzet7yyuuYvOS0tvsvqaTfqYoSby1LAcPq6pi298vOE+Jb/vVY5VDcXJ
zhDs/D176NHMwqlIgzXMeCkR/A9zbOne3Ll3+DlJ8eEpkOWK7VyCyhjSP4Ls
PPSFGGVFWjX77v1hUUYkAcxppHHUL0AQ/bslkcf4RdntnS068GIv8av8gj94
09/ym3/pELIP+7oWRzKXnTMZGSa/roclG3Ky8IvCavybOFjjDZ4ib5aIbI7B
gZza6/CIs91+rRmGWXZ8749iJjOQzfCv17vpkY2YDpQZ0wWmbUKHgR599k9f
Zj/UVTHrU04LG4HovbJIqhMP9h2HjgIpA6OK+YH4eecmUIV8IXr5l9HLNZlw
yHEt+WKoeB1lRUlqBc8MB1H/y96+QZCkvFkymG7r9Mys0zM4ZIDDEygbnp1/
pVqiez7WvZ+iV6b5c15zFEGCA8Z73SW5gKTJUm2PNqb2OMURruwAnXJS6/Ml
PnwWguQwjZH6owa4xfD+cE7rDVsUV0Uik8WaN2Xx1iNGB51nJs0tYcIImLzE
U8enWB+DeauXo6vrtwWViI1lLLPlltFj4eTQ6699t9k3u2miDqYnvFOu2ITy
MPIeQ7e9Ji2+F6QJwVaaI0kWzPE1XYHw1rSkLlJ3zArzAThwXeiEwF4im8FU
F9gOD5h43V0o4DxohVzugejDrGMMBUMHhbzVIa6JjV5JZYotFt8hsr3v0VOY
gj374FesWnIhmTLwYDDb7E4wwzvMTiAWZeJkve0XVdeA+tjAmKNciEj3oEIc
4miUltu2Z5slnU2Ufhqqk1mxY+HtfBRIxiLNK9THcTifp9eDSXsj2R1R+HVs
FcU5RppaLq0NZUIRnPFULTvXXQdokA0CGgQAlviFJrZlNLgdXrRpbEcQQaLL
TrO3Wf3Bkg9TWpIEBL1xEVdlmpiHZ3HD9p7bae8Z6ib76Srj0neEwhSpNJSr
wMnRXsTJGh2F5QIUrkb/CcYl1pZbr4Vf51z0hXFKLFIdp7lme4f7lN6L/Dxp
IW4UgtcozqLe1eQj8oX9Mqhw3gYx+Lc0tvkUbf81fMgvIfRtQaV46xEm9u6H
LyUs+pY2fu8BfUFhNcqc408f0qfisMKmu2jv7z2iT0NJOHz0+T7D7NDhvRVq
2Hts5+flxd4XQ9vwHF84FE5IMRvTbcusScOqYOTSDT+f9n8ZeXT1CI+uC1b4
X+sJ912/fNqYaGnX5udZ8ErVBRzm50snG0EQELLHB6UuLab1NLz+v3bg/GvB
/PXB65whFVVPihhdq9Z2csOZO3nbrKtviQR6C6oC64ynYn4/eLJDhyqgUteE
hVmzj4Yy0SL1tXGHPN4r4E7cOsGn9XRGshqzy+SwGVN3D1QRF8wXblHLmr+Y
Lr7xGz2O/0f4frbfwv7tEwckKZUSBwZzBj7hzy83g5NMhE/4009a+JSH/8fm
N7QMyCja8i6V8PqUhl87W8F7xHZmK6jChbkrafPu26ceqBoznHpADk/cGsNO
InU4Dfm73WkIpqePx8P6b2dN8LNEwg8zK+8u+++Zusrda9ME4Hd6RrvEpvFY
qzrsI8jDflQ94+RcqRuazfe4XXTZzCla6PUB1r6QSHy0uUArR5KOU++Dl8uX
50dufNRn2VtrAjO3sgJixduipUXG0g2gbpJIe1ovtk6Cpx6nvhg8kltAf6ce
fZwcevOfamp13/qNW7yVVCEJX2Mkr87ONo1IUe/sdzOMcdh4RnvbaIZnxmgA
uVn/JzMKP/farO+KdsjB0hbSIWKrA9/FhRHsBXyTrrg5Ccyx99gueDPKfpIH
mUIY4su4HYv0v+ar2QMdcOg/yTipo+9iQEc4JXR4H2nmEekpyy2EK9QfadrF
DRxDnE+b95xEjOr2SRviuUR5ZryIPklrj1gjmwYD7DvxxQKhyK3xp15h5pR1
trLitDcYpImdsvtRqCSa37CXc9fs/I9m7naOy8G2fOyNIrGbcUrXM28PZB/u
7DAUnHveMzQIsC7ty6gwjvJLj0m/FynEY+cj2UAiVokIVUcR/OlwuhQwrC40
lxr30fHHif4ijfCGc7hcUJW1R1VLjd9MX7pvCKg3/kWMNSObptmSwYAKImaa
kS3Ind1NqiBIswhR1Cstjjx21y+UzQy7WNqeTOCtxA5gpMoUMpY8JIL/ZZay
rOt3LUELXMQdVdBpHZ+7adQZ4bMOb7XBxmToO/UhBorzRorYLD4pfXeS86Du
CfrFi3VREQbt8FwIkbj9VeCHh18wYA0ADwgwxEmnUznKIQjixkAQm3P6ZOhh
9ojN/MbsA0f5xeC82SA4r9sNzov6tTlo5PNtj/ZWefPO2hrOXyLxRgWKEBdj
3/s1S9NSLF4YB4KsExlp6hOwrYdY6R+96yNhpcYn4pz+inUayyPINSnxNwGj
QAGOWySAfRKIACLADzdosqaMhhLgmnes1Ua7lXJra1JMfddDcn5X6haP8DFA
5o2jdLU8wSIB6kJsH6LQcFPZfc3OrMTZFGEGcpkgnCEho0VkGOHQq2s9y3pj
aD3Xjh0w9JJ4NWdTM73SQkgxHBO2sm7YAU1saAg6EhdgoCNxfteiR2afhB5J
wymApM1/8xnwPeTI5FIJiiTujUbREgm1a7N6wcGdu/VZa7LUDNaoOjLQ+k9h
R7kdugTPETg1mTfGGnXSt5sxRZOtK3towoNoi4pJNwxaKQGpWrPcolmyLXaL
ad6eAmPAv5prkDBoE/UWGFxJTo19vc0y3bW3t501DvbJVwfT7sA4lLSnUKTt
T2u+aZokTkyJD6Eu+w23FWPWQH2GtqSZIGPZrMldOpxOzAkUAUa6jW+IT0/Q
9BGTwkMuzrJ9S8vckzm+jVFLaNzwWRulzRj07E2DjUHzpcqgT+NWZteTMNHM
9zE66UNVHyHgFvrP5lT2CA9goDafYyJs2gG2bD0L1wTgGhQRDKg12C9INDGp
pDFO6Yvch0c94id3suB25TzYVwKgeoGIZAGsVFGLY195J01C1KhtN2dn5Zwb
g9Say9ppb16ZEoZBqQOnTkXmaGv6oy2iDHFN3EUjueRGXGebJblCaNnD+KmC
UkfcTNkcuht86rSmpcMk0c3kqQ77zk3kKISaqSgMuYuukTp9hry0JsIMb3uI
4Ve0/57AfVhRTMhV/o7IJ23idWWAxk3qNN0k72gKJmXruzBkmU+ZlazlT6Tn
wJqTQOjMF53BcSF1+FwxwadagtQRtM5tR339qBUpLY+EK2dxWHxJcS00Bhvz
tOiu0JGBDNQuEPlqWN311+oiqvLC3MU2nIo0d1HcdvKOlDbf3KSKpG3R+f48
9R++Kv6WpRkbMpKByLZe0dvOB2ciI4kyyMqbdacWJESiYpxe2sixz3+W0WLI
PU533gvpzSGhpFQbWhMMplTDg/UJmLqqFx02vpWk9XkD5kVT4q7BhVa7hN4f
BxzxhFrzexGDGcEXEhvBRVNVCM2w1IQg0M3oyuAGgfq0ZWhnX0fOSnnu9+3m
q+n3PRREcBPfEwZk46PHhJRlTsiIRiZJontHbm40yRaM7epFoZ8H1TtycuwJ
Jsdmd+4/fvCTxI2Tbmomp93GlsaW10mqCQpufov4aU+Xxa0KTqx1oODxtncd
SZ+EbhrEBVluQ4IJjurZoEnQ0qSroEh4I5RltJZP0PjFe0mevECO9L5cbVa6
seh63BP0AQFwtTbq/tjctn9YEQ0MzydbzG5EINfCpdBJAR0Huj54sWmlIJQW
w/poC6mBO7KPW4t43jKcnHnU0iOxKBkUPeHqLK2s7zX2hQk+T7hF/IuhtIKx
8MlPVqLjNJlZH9hTFFIzLWTEIOaIJQav+C4zVvdHBFFdnU9wOSrh/T7Do5s5
nMhEvpjYggF2lzjmkQoDjXwAg/08QRBol8U/chQx6oqFsBHMldg5T5BKTD3m
lwQBEaXTLxrKK/ThZusQQJDv4Bd26o5Oiq1JTwslMRuQN2BCIvHSgJL5yrCZ
TCn50kniwU5sG7z4KSQ9weiIOcyFqn/yYLeoXRC8BZvH1KV4AMHqiAY+nHA3
TwNM7ASY2KBY2Y4tXrBP4503yrVHA5Dm69oyMum3hC9OUD76Z3ltHvgQ7gcd
E8UsUNmxkFB2bPESmcQShqp2Nk3d5t+pbmAC7TvwPeNs5hgHhcGjWkrhTGNB
voHq+05iLvT/h3yvueMMeZsovSpaTU64N3FKI/s+K86pUc+7UaLAypDp8KUc
ng2nG4YVeDQvoayQUqvVq+bHETpAnKFsJi87e9uWx7epw3/qA/K3zl1KYNCH
qxWkEd2tq9ajDNe0CO3Fa1uFNngIP746YbtKAFiTpFXJNLZIOKB7fnL82XNL
rCpjpaxebOOkgf7pbICPHT4iAjGZEk/jlOPCl5tcn0Ng8B0NSNQMB5+FSklP
kHCzU6C/NA/aEimd2lVepRcg8xeglkBBb9bp2w2E+U0EPVSomOQ3cOvAZOtm
rbcudxatDTayIlL636EqcP+TygKdtjTwW/kpZYFpzrmh1H7U5cbSQPe/WGmg
r/XxlYE+as1Sky2bABKzK//gf1wV4X9RAeGN5XTTm8rm+tVcuyvnorK5vOJk
WsuLyG1EnOaaerle9OuaYrm4eG2wXu6WxXK3KgZ7ktXNLYrlkuKtG+rlblEs
hwPeIu3kE4rlNNt+JEHvmzNjxKv/D65ElqEBErMSAhocTJy5vuDv1uV+erwU
fdtZ7vdfWSdn69GuMS2GspmGqtIi02LInIjAC+TWsl3RUotAQqNgGbiTZUag
kjdbFlqchq0HW59AdlvlMmmJIFgPqP2FHghD2adWCqZZFO429buqGGNikCn5
urnKjGmvX2XmbqwyC68aLGcL2TzpRtm3l527RXlbvFk3FbqxHI7skbZXxIY/
sSQBNktIcSD+j4Sjiakx7eGzuw9wylq2+FuAZnKKDc0OZh4L0uOYyawxI+PG
ijhtZJxWxGVJTie/ItRoYHeQHF0c1N9TtDJUjTA1TVHrvAIsRD4wG98x8Vo4
lr3gnfSZBuwSzlYleT+GeJAmLF7UmyWaR9jj3tyjkKhQUl1spO6x8/rB/cdH
2JJP3sWt+NLEJvQov/c9Y9ryHP1Fwevz0266EtbdT+TsNRVXLgGaHBEU1kvu
fS3zYF/DdZcff8Wd/WQzkLcdzp44n0YMt0KkVe9392ZPSFC0SL3srDWrRx24
YovPnRYXGL7kbqupQwLTfqsupgvb+mW/Rx2OqIOT8ThQwpC6pxibmCgaWDTg
kMXie4s6oozQvjTtAIXnQIbTcOZ4zE6bwpULNqiWvc7F1kZKkBJwoyaYNzOR
5WwHcnK9Dc1wUnzi41tcY3zo+7KlFPwbylqTumOmvhR8nHI2vbbsblG9ZRvf
eEuCyVQTsD65mOtXMyn+AXvCGxNkSZyc7VKwExq2ljVQ4P/4WhxOCb8OMOS/
fF2/TqHOrhUNWFXxitrqV1+RmhXDM+1LhzgJ+xonjBvO+I+cjHSdk+vJ4jq9
uq1LgNU86pK6rVAW3rZK597BgXvxh7EF0JrdpshGkse5nkfBELmexw1wZWbx
/6fk4lNLLgSf3je0NLuavcaVvQYZlZhgA7LLXed6i5ys1Achj9zF2A1NuqvE
oJNRiL6jFrLrQpUNbpG7ZtVNDT3cBOyEGuXe+dhzgqnHlkRHJanslcFpqH6x
FYRE186LKm/KWpxG9kA8BAh2CdR4ET1GE5pVVPU3q357OJOGn13PSck3ebjq
MztHj65EkbPFhgtFa8TOxhOjpK/cdU0OtwOXURXdVd280yzsaZwYhJoc0RTp
YItIo6TOuIym4TFUvMNdVwPL8N6MWKtGR7Gv8KL5rEq29a/XR/v5YrJY6s1J
iS/0o3dUNHbm/NloTdk4yhlM8ulEwSM1e12XonZSs0lEpqk6Quj4rI1q1kP8
kGhisWG4TE2dgzO/6AUwsG0x6KKeY8ccwrvwk72jhhq7nvKwAuQWlqYZFDqu
wjoHChC5dB4vrd8r7s54Hler8t645IbtRNgbus9g7y7IDuXWg4T6gz0EGEdh
Qnq+7+JTUH6b31ly+mPURJXn/TTZzlhodKNgRCwdHK65FBfWpNlU1Y5NcSSa
Qg1kSMntOfmPtUQgNu9GXLw46r3cFzCa24O2IvMTnAtluWbEjAhulUOxJYE9
zYOy36u4d1i7xNsrmUy2lU+5SxW7okspx4L7KS/Qutiimm8lf4TqMhYFRivm
mwa71OYgQbctx7A1S4CDGXceHBxyHANzz/JtrK2Qdb1YNAziBQ9fKWsgDoL5
BFiDel602kY1BG68ZwA7Yb9ng7fv2mH7k8o9+LzPBDwJy5JK6kKuALM277d3
PQRpjABYuQG4NdvQei8Kf22BhM9cXm1ZZPpUSOqJjgU62BM9Eq6SwqKpHYLx
62EGAzfw4UA5TiLzNA8ave/EtJc193+Wjq40Z+poTsko6NCEOS2LKMqI80vF
nounQwEqjHFLGl4kfkya5Nj03zJS2vkToFwvTTe0Ca8GKFpam5vlFSt2hbpk
N0xtpUzJ9E2rvQMSWahUV3HWPG+Oi/fGelTDthC7Qe7TFGkUpZYOtcCyHIHr
5pyTK8VCktg21Kg1ZPNepD261W0b+V8zi+LHCju+4jjZjRtfZarrwqUkEzcp
mtN3+f2AFzJyvgYsUoKNrXfUr3ubOeBW9lcCH5AkCAk3o/p2iT3zlnbf4TaD
ZSo5v4QIHqcijySZLOQiZ/+KXCGFros2UwCOekuiNP+2n+588izujBVe1m+M
BXMGlsR+shsadim/iwvdtAMYo7txvoi4VeJpje1n9s72wJHZgd8HRw7jCZpA
+CCBRtaAQkddrnlo9NsZ+62XpKJbjjkpzJqlTsJmpbjrGyUw/zHGfj7UhSC7
+5vr4GV+cxdM6yhZ3WSoVPCjRQTsrwA49OpZQiQKjT39RAByl10DQT4QEDMe
71Hs8QaKj/B1xqlaExau5intzWlBDdG4CdNCGJ0kpGWcPsFUS4maO8EgBjOW
EPoiVEH0U1bYSrNJK7zidihjJaOMFad2yK0zVnop5NzNiAcm4HlsUBA5pzWR
Oun6gdI1UtjYL0qmkJj+JFpDwU8/71sKAkRfdHz4lJlVBDerQgBGkkjkfkMt
KHJQqExtkGQROtSv8yV810pYsS1Iop/lc2nCZfvaB9ANeHm/M6hXj2PVqrX+
C4+SMdizVLkU3B4XM6lAZx4AvzTdUe3KY9rlCTtCD/TvpMamlEUDa51L+8Rr
e5/CcS2wfKIzzT6SF/mOoEnzU+pQSg1QcZZ1BVrWdc1PJVnEtj+VDg8Ud+My
13acMHJMJ8JHQSlfLIkjbqv5RVNXpHICVf+4JltxXpRr7kaKcWfDymZD/RBP
RY9n6iOlyA1HZdVaUKa+zrsLGyvdFUsYCtIatwIGZxRNRfvPRe/BiuGGQzR1
NnDV3VAxAPv+wly6iAXTzKg17Ob8wnfL4EBl68hC14Zn/rbaDopRLxY2t8jG
Bw13WfAB6W0erHwKcCDatQJUGXaf1HzrdTEw2WWONEMG/XneLNDy4AZe5jCx
3K+1N03ex8P5UoSoP24MkRW7XA/jMyL7QQgG/UO4OL+tJsPSM6bOx7dhOyP2
pvVTtc9dKsTa85C0adsL4k37qAFErVr7HCeCVUpUoF8FVOk2WlACqdT7xS5E
pfiqWiSlzCMpuVsjKVGOOKMnByTg4CFEm2mQOQRGjb4zn2MCu/Hi9ZtZmmWS
KL+YZIIRQfILyNnJvLz+Sg849biQq4ZxA+pT7nB7YezOs6G3iHzSYIjbFmmP
SkPXSSjhXnY8nxdr0WrMnhjcb5eDYd412wlv4oXeMDIEwVDdnJMHIgfhQRXW
WWjJkxiaeBARkxaPMMGG8kb6PCn/UKxeGBhqkL2uvx0US5EqAc4GuJLiELFu
g3dQbWstfE32FT0moJdvA72kGtVQXWIov+fZycT5NBN8xNRED1AakVrD4CLe
eKDUteTmDxihkSgSsBESAO3QYnELqEgyP0eqIx6bcB52V5hd2Clr0F9J5UtF
IFqTsQCUIqMmahMXzKApu8zXbeCo0TENmnLWCqDDdz5bMNWTuIUVQaBIAin7
NxdKg4m7Uw7HecrUNpZ8HQYuZEBSYxy9/hR/ePHGoXa92CwxAnbV1x/tTty8
ES6oi/llXVKJRZPPjRT3vg37Jnbw2LlLe228J+LpaYBh+sZmK0mBYB7baotA
KtDqaeFI0VFAh+9Ash8m7OlMQ4FeIl+7g8fuQjE8yF78we0KeMaq4GwADPIT
OvNhLcijBxq/JjQX/PhEuaCyw4EmnZLaHQCl0Db1TTeTH0vSxuCPrZFuLHRc
+Wdt0mtpl7cB/jmSShCzN877HGJEfpt1srM33klAVOBSHtS/ymrYgaiNBTN1
E+zqJRd6wbXmVnAdU3leBQ8nfYEQ6Bbz+FPdD9b5gKnuUWDjT9Qp4kIjgUZd
WNQDLcaw10H1mXjJ//knZ4B5iW6knWDfJLYADn5l3EfM9yrjZwkngVLalP5Q
1SjVQeCBb2iBCm3B2AjLpcd73/HGcRKt03d8hq6pXBKfF1JdLTX5xBxWCLwF
/NgrPh4jCNutrbGNKqLczCwiTMhN9BnALQ7I1zfu08bbK6p03G3NU4xsh6Jy
0D5hrjvVZLKdauL+1q8Ya4bcUnTGu7/7Bs8sikRf2I97DnmXRZoSDL77xsvg
uzSJGwcHoczc2ErhEDfxWG3VDladJaza3ZpVq7IeaenMp0Ecg9G4cot6viH9
IsGgh0NlueOrrIzJLJMbUnIfAClRxkqhwBBhmqnTJQAbcSgq9LldFFz4y282
rm9YEUX/dWXPnn/3/M3z600DCf44ZUNp1o8Nx+SniJXTy0dRk2FRtnMwg+n6
aon7MpeTLzvNSznm+wQPnixAha4xZFnwWti/olWZZetZNSr03mhhXKqe8cGN
JRlb5Zvnb4y7Sq86sfAJsXC+oCuU0HJLw5eT0B7ROERXCteh8TTST6XDgqJK
CW8KfvLuIgqFkk1TnpZLjMb2UI+ucK99i0cd0zsCKaCQvRTbpk8vbfBxcUoE
pmBw8QD77POzYiC1mWPJDg1PbV5uV4PRae5TquihZUcxI5h0VV8ti8U56+DS
CdN62VEWZ6aiADsGaXJKMHlpcT6zNgl89GmNguH1ppkXU99XN69EUVXLr0ce
SL+hqQwC5hVg4M95veKa4I6Fg3ug7Fgjfewl2gTft1BcWYFO09TrBl05EtZ6
4flbiP29Zv4WYlrBXooYCiVTGAPc89nAVlPbTUwKvrPB+kh3hNJwFjXJpEgP
1sJ2CQ3mYr1uVo5ys40DaYcyQAJBH9K4q28anr9TB9zrb4/vPXyEaJ+vv339
5bMXJ9PDg+mjg3uP7/5w8vrN9OuTl6+nh48PJg/AkANL5iJBf0A9yxfOMMrX
zokZW0OkCYeT1cKl4Rlfl51uoKuXHcZ2Jn9+8SqrYc8ZS5QOJ+6rN1xIfot2
pgVL0HY2BDa7sxz/pt7jv6TpuLcQpLO4sRM+pQ35Nf3HY/ulb7rc0J98h2Uj
Tymt/eX+vZ9sUbvHlDKGiLFAahWwWnnRN0gSzwc3fKVycdPLO6ixBivYezTZ
Khlu1p006dZEDLjbNZoUxi0qgtDZXt3B4uCwYEAp4ivIkcAEcySGZHKZ14Ej
sKWdDa11s0J/7zAL/f3UjjTcgvu6YU6eTf+bekP3g7JDzdgDaX5idNZJi2mT
RxCmPRiZDdBnWqURw1SiIFOVSJhqYsCK3jwMSREaVe6KoiVFSTY4OBDD0Bz1
TN8XZ7tIe+ndZuUnWZd6yWUIphX9EH6iwejbBK6ZHn7VwPWbWsJ/kcoX1cUp
GbKA5fTMXQWX7lcP7dmqHZKAHB3TGdiXeLQJF23BmXJuy5hiT3HopbPDIxuV
gfZVDBif8rN00QZY0YLz0WVnFJi0U2FMblzl7UmnR19+xczAutZ5XYW1gRsL
XilXnSxIFCcE9EKr1hqt0eCKBy4tMx7pX5Q0OdDugqiZOltaTjE5xtkPtQPt
bOz5UsyZx/2+M/6lWpvlp2VKsbIwtpZHDWFVIr+nFOwoZcFG8sOao1U4jumC
TdUg+FcGyhaDaMHmYkW1yVcI5pFHOxRFtq0xOYRSLJwkSxTo8s0591Fg7cwg
Nl8o6TE3GEzQ5ETLvmHFaAW1IrnTMwWJvVkv2BRI759o8G108IRVFvNe4CIE
ai9dKzBt+LqAKysqMvjHjwbRbDbkvpm655WHxrcZ2t4ciOBQiXDnGBgUxwSR
VNmx2Yk4n2hHYrpHuhWMfEz4fFZ0qUHzDzUKQhf77h5BfZjRT2kPJDs66mvi
iVc82l2r4PdVUtFHZzsfsQ0rYnSrHllIiwzUmq4ZD75JR4KP8jUcIQl8HYpW
guPMAidkoMCkkUlvwn4jPORK+MgNkl4WvyHFK/LJGrXHtmZm7WGZ1H1EGb8o
RVtKt1cXbyjfHUuOyADarLYUYN/EmNmQFpQvlyHN2AlmkebhU0IJUT1S22bF
sUnKE+1i37KbrfL3EpJge0yEk2hNfVazvyNRoFcOEBnum1YkS0KYwIQkVbfv
BUg1tzind1/jagZm029diC5S0uoikTkxNq8k7DuR3MyfvejsO6VoSIrHE1ph
LyqJtosBkb1eU1CMXv2Vgn94eABWd311VM/Ze023UelhIW6WBCB1KDKcL9s6
KAI9bun6yoAtmEB1NUB4+jzGSJryLpyhG9ZkKyc2mkFR7YIosoCIyri9SHLX
i6R003aKpOFs768N5dm6C0uQQo2xacLQA+Jb7KNcxyDS46S0wA2aT4LptNjE
DcpsgUEUYdMWTJHJVgQc2VvvTKbrC3sdR671VVEbgsIrg6QqEcx7omM6X1fE
uNu9kCebQmrKYkBMBgIdenleN0BIK8zYdLbMconYARJ4MgRrQAR2Bp2cxpSG
n9sdT6J3Rkq+BS0Q1yB3Mum3mWXHLQ0RzHyqY/KG/nBmKB/5jhIJ6+IcVLDl
d6Jhy8beDurgL+n2jrN043667nm7U6K7x7i93LzDKIGhIjilT+d1xcHElIhp
2SqtIZD3ElRYFJcDndDnY4898WX2usDkh7bYW78b+35ZyYtHSa8saaF1MGZP
h+2Y5f8Zd8daJ92xDGNjZ1zfJaI8kNoO39Q9Szksty7Dn17TRMuZJlq5ttCS
Ll3RcuhNufiX1PxMNvtY261lM7+V+zD27vZb7pe038p2t9/q6c3ojzh5lkl3
uVt4f693HqfKNaxY9OvfhBZ2eibwXqObDdrhV3nUD3U63Al52IN2C+fcdMAd
7PtzWz+ofhtE2MA9Qt9b0mwti9QwP4pfUj+xUd2ndjBpy90LMnsB1JFK1ROd
QY7Ua7D8y85X4E3da6ayOesdUsFZDfdaNI4N+N63UzRsxcULHNseb5gK3V7v
7LBd+pLOfNfxGYq09DlNymfCoJ/cje9GXiIMhPLjPOJSSsWf3KNPQJUHGEyP
gdtWkRG6rict8V66PMmw6lVtGGU5+ErFko+Ol6MugdX1CZzuHhY99ZcQBSAt
OXMuJWq9obanu+hnZMu3lp5uCJQkkyuHAiVpvWgwWHT44ejJdWPb5LO4Jbuu
Sa607cZ4nTi4oRuj+3RxgPoHsfS4fWHPDPbGVe7zfkB16qv4RkxGjqO8cj2G
SSoyBdVNZnZw68lw6mnALDnKH74sa/STkLUQuQ1juHL82pd+Yvo3DdDWsQ2A
LGCa/Ynaa1xhNYIglMW9LFI/M2VJ+PKYogISnPgKPHFYaOpRPy3qNhmsQCO7
KnKm8C4NmvTfZR2iwT2weyyu3E39qKknn+lZ2uG25AsYEcJTjunhI+Ng0N6f
NgbIFj9ywsj4Iv6JWyOdmE4LuM4+NVyG3zppwJFkn11zOjuiACccYAxBgGvW
LBEtjSfn4rPqBcnG7P613pV08bIc4hv9pehBhjW4wTX4+CjrXzDYaOopTgBY
yDt/Rn7/JhQWmeKmXNu3d812gOZslv9tNikQxkWu1ZCwJG6stKC2mStqWYgJ
pVOndYv97dL+PGF76REvdyQ5UwYe7/LhBdLxk4omxG5mbbix0xOo8KI7OgsO
NlF0vSJjf270Bm5wtXhT19/DjrzB1Y0sjNatdtlzwIDv5BtMMMKPi1q6MYQo
Z3KF3m3ccIjhI6SSYPCGuWtu2NASX/Bgo2lfFjuRl722fntY5IUr8tGh/VAa
lazeD+a3YUchhE1xjvZA/I/RHriQAXwjmxlCT41ZjN+DFOrmzuEXDzm3sKWq
6SuEUsVyZMK35/kETPsAkqW3WfMLhbOcLYv3krk4zY4pfbqqr3w1M/wKNYCm
PC/5vmuGOerqiUdrhanbTQ2aF70LaB8r2gh+hjJEkVYnfpO0UduHO539fDKg
L9yhx78SLs4NQqX+gPNkvPgQyZByhV4WOBeX1SZ/3iXNpRWjdRbnTplYs6cV
cX7HZ2wj2DZXyHtqfRb777/M0unt0e7zJP1qWvR7cHYjdZHnN8I3piGZDrqP
b6TE+PS1lEYvAfQdM5rxLpaXJQd4T9GCTLeQ9p867+Wc8GBxqcI2cJ8505ky
G8EYIQo3Eh+3OjIFAss3ZemZGVFvMiUNFGKWLJi0oxNNcpLibUOJChYafKgl
JtiOjm2THbx0tiyqvT/v4+klj421V8GfvZknIX6PPxCh0Pn0rsx3hdb8GFrc
1yG9OdwZk9Z86wtzk+XRu0ZneofEkaOmSIs7s+FsGrM9lfZKSJgun0bZ16vz
jCEEmH0SkgvbR2n/SpFSnNXDw6nEmJ1u32rGYlRv77Ke7JOe2otgUyUg33n4
hlJ3EAFCJKALTYAjmH/T/9Cbd0NhtV3w5LGNF2a4FfPOYwHumqjax/lOMGXF
B4HRkun+V94edjz0+yXiL722FO7ZLp0l3DOXvIB5mHz9uy+zZNSd1zDUyd/6
GqJXiTcCBNdTaSgjuBYf7tThy8k8X+ckTWGrJOUbLUeP63lBCC4XXIIexDSq
sg1FuoKvpYGDr8/OtLDSCRBddr4BBRJ4tgS02Amik+OA5XuS5sygdRx879mS
GyiA3uBMYgRXQWgn5TrbdCVFlQWkrY3hC2kn1eXnbf/spS6RI0nlGruk2u2A
ncIRuu3QJoE1V55XbMqhYq8VOrhfoWafoODXPGUtqLV5bM6ABQ5MB/VGkt64
DGkgbeEoW/ZRheoQsTS0x6qanOoljVYHUyeDgBszajCU89ftD53T1tVUt7As
VyUSXTRWujY6y7LhvATypqqt7/w6yTt4uJ8lvowAo6OQ/6fcfG+R7d3bB64h
AhzfM/VTw8GoX4HCtQZAwGqruJvzpm7ZgOfOyFQ4DntYIQtsyKuy9XiE5HJT
MuJRUP/111HHQDDSLUwKizfKdjXNvtoKcTAOnl9vj1QwlaQ+RR+QlvCghwLY
KWY1yUHwS5ygrbZSARONKzF39pCaxLZLCvIvZfuTPplUpmXPWO1p3Gc1zOm8
A4UattE/7ORC2JI17IZAkzMDMMrguqAKNB8SJyDPuhKljC1rp7CoPnbADJ7o
ULhB3VjWxDi4RHo5lVa1oMY5klSoCRa6wMEXmleMifKuykUnpVQyE2feZY/b
+yQUeTSneuaWyvZot5cUZ5TtFX7vdLeRhAXLaBmRIXnYXm/Wvp+i8bEb5VKz
9n0lsGpYUsxvcjdCVSs1XIDhX2Kgsb1gbNq8wv3G6r2e25Q3SpwSvsc7Tkoo
NcuMsntS+Q7L45BLrp7JSMOw/UJlyT63k32O1JiW2AGqj1098d1wFsV7Sv+7
KjAZQSpbJ9JVCv7R5BN14lEbeiCc0oN10pH29o7eiPijqLah7cq75oeh7q7U
rPk1/lJTw5jRhCYevD3yWoZohVHC+xVjpD8txtNln5FJCM1uygLaancNUnmo
utfwab/FMGFPhv7qWwJ01xGgsL7AyuVyFClZvaGSwt6uqa1E5KDm/Rkj2XrU
CROPE5Mri2BMZf63JLOA07abzMIy+ByVtJXyAl0NUFV0rjema5nEox4rNsWe
NA/W9xQklC0Ra7ASMtlAkhDvGqoEKIo5pun7h6hQMgBe1s83LIW1a5VcE/Gj
2hRxRauqFnKYfEm0K6yH9ymry3ouXNasV4FIVQBTXaochuqZXFfvM894Ic4n
ky4CmLXdmW4gbUY3KCqvJXmMuXErZPCECRcRw7I8Kwg9QKsAmca0eln4B2Zs
rNCZjFAhQ+EZzdkYiEplz/Iup+LS5SYVdQ7bMZNWDYIKpao2lGHE49269Z8o
TzQ/QxPZezNQIjlKLIGza7O946+ft/uCCcSJA+TElm5EuA/oH563kp4aNXL2
spKCrU9f/pjNt/Ml13EjQNtGSogRlQnxuBhSmPK5YD/nyhL4zoTbQuSLBIc1
2biBBD6PtMBNdfwzLcXd8UdC0hcNYretN55W2m3bFSsn5ygPSVIAwnZi3gQm
zeLpImP2zxPT8BXk+HAEoD0vm/mm7D5rzYb7CG5+CaobSX7Z0glDT9QpDDOm
2loLhwStGjYwy/qsVSfEMm/OLSaGJBrLo9k5lc9jYmp2UZ5fwG5xH7ot8zBa
NqHTFbwgIi/9wtuSvFv4PZbhOH+8QQ8rskgRIkGIfQPqBXllUQGFH4oF1hYR
GSsHIRuO3SRgNnKm8ZobOIU+QTidBd4JKgDr6EZTBhOCK3IjZJk0/cp4O3g6
9bI+35Jf+s2LZy+OsmdlO9+AJaDNtOgewvETNAtVmHOkkAwsssmRfS3bghQ2
8Q9HfSzonOTU2/pMg2gLEDpL9ITC2fLnQKBLpgDZX4liegZuMrs5Zzb3ozBW
n+PbKOBGxnEuWgdQanGJpuyV+vF9skIkHfxtkXJqIvpj6nJGHeLlndxBoCdc
gNh1zRLHcBrHKFG3J7gDsVp8vJNWjHReKTAmIygkO2PWpDiYZNUZBZSFGZ92
XjmPsSgxvsg3QuhaTVkvQjO7hEw0BwiVPhez0NPN4hwxu74vfFJ1W4Rz5RRu
5YPea+zSNhH1WeA5hrmZxiHR3ef4CHsZfawcU0uEHRDD9W9Dt4fBp2a7takv
LQ+EXaf72XOinJr9DvGHAI+D/JBw/ggmhPKKvWMHhi+AfsnnfxYy7NXZ1osY
Y1qxwYxV+ea4NYry+IwTX/AJqmDms0OBTJoZ0U2rJoivvkJjbYmXFyFVAyDG
BjilcL64kE2oTk8ydglN1F0EJitshews3OIfCCp36XXL1mA5UM/oHSbymIu2
IsXLsdkocOQU8krJhvac7p4dGIU9uW8UtBYr49XAf1UocxSz2U6DVOUIL9fq
kdcpX8iFab10vWAHGL1WAwSUDtdmyxo5ufc3hzwPOS1sA6EcfdXrGmDnQmqY
dnRgZmrGvyH6TlFDKtrbFefmsHyAQg6gxgKEHJXs0TxcIEtujNAWy0scBHVb
LtxtuV0O4/x++PBPmMH+8WNWBqRAfhp9TZ5fkZ+iphYdaWMG+soHKXg3hioj
0JHIzbf0avXKLWnnvPKZJhskTgVC98P00+Cq94gaksew8W2ELPzhrrC1JM/Y
3Ba0Rg3X0Iwl0zIl23tNfd8Hinf3nfNHl1Iw6e7DTry2oJ4AyFLUecCee4ZZ
VDbeFCF2E3aKZAZSK8Jitwm8M8oUmDWRPBmDbOsHuGxPTt48NefM4N0KrRI5
/an5q4nEiZ9KIZiMoLOREkKszZtp1oMxx2+dN2HY2o68mTl3ZyhbkfxcWFCx
Jqk8hTgQ1rs6hAy7lJ4CmFewaRYFyFM8ypzbzCeWKjZfsr4Sb6whi3R6wc1N
8b2pEM6m+P/au9bmtq0k+x2/git/iOQipdhZzzhKNimNLSeqjB8rOcnOplIZ
kAQlxCTBAkjRWpX/+95zuvs+ANDjJK7abJXyIbZJ4uI++/bj9Ol63pfis9vQ
jt+uUCFcZ1KFjsqt2Ox665QNCZD4Ssya9UMLjY5vMjfaiY8quKuP8DxsDeL4
gFN+JlTBEEJdGRvJtalYed6uyGXpUjGXGf8P18uk3SqnksZp9LxxQJg7RanU
mPhhG78hdF2Z3yMmydmPlVwlPstbG3YGI3TybuMh8TqaWQ0GBqaoeVHAh9a0
y6uIhSl3BAapAp7v4oOur/kNA1lPYFKV1MrP4+AJMrPsG6uHgwphjRXchrYa
lJ0BIeNuj9/g8XC/uy7PYBjLB7Ams2rtWTvygb1kLVs6apC4oCBbxE9kHATi
OCUiNSMklZ6m706fO+PjW/fH/n89fPTowefDwbffPX02EgKiA8uBbMFc/wqY
6wEef/rsOH5g5+8fyu9PTk+eHrv/X4wePHw8+ubJ850PfIYH3GT7Ak2dkGFT
TFhFLHzoJp1TEtz7OXEe6uY0yjZEwutqrlzpWjyOBRT0Hs89CxnJ2korQVTX
m5XEXYIM/qAQmM/BlZw66w32HNPHVcgS6B5o3ACWctIdkKlSRHLiawIlgzTV
kvylGF6TqqhpvmnchhapnAeyKOUwNBHqpqgy8AjVpsiMpGktDSUYXLY2dZMr
KrF3hXnvVwBKe0mF32/mZDov102c0uBhtzY3B4f+AIntPQke7Xzq3oqbS4V6
uVCPzlVZXFskSswBuHwloLVEwZ3GNtNl5e7ktshW5chJrh2bLtMg5uHgVKuL
8f3yXmwdxH7ZNKVsLSDbZg2DTGjqrkA2TFIAYMBY5sJpHPQQioUgtZbY/LhY
InrVUVyxtm7XvEEs2hO3jsXLTpo8BI9oriH3TexULJc788Q8tfUEN12vKqch
1A+EqidoiXFMhQRLSfKOKgVXRX594+7itcC+F5XQxsiXeT0unR3nlAz3p1aN
QK0YvdtF0dIjpKqcqjyNz1UfFPAWpFYrOmgMRp4GkjSBotReF+T0DfPTgmJX
GlYM8l8mEM1xDjWZIezrdJixsv3SiN+ol2gHqXBfbBZokLMqleI665aP6cve
rN0c1J5YJbCqcsPjKeo4OUtnsfC7qAhTTSryEVH4dm3z79/eTlfMVH8AM9cS
quXUeNhmuv8GFzdO+OkxbKQA3u1tgw8lsQEdmIqzqlR2aiEawJtDtEFsP3gs
CxAHVe72DBXiGvNxbOEdd7K6Nm0nF4+3xxusxZfqNtTTErtnjFSVLHZzechE
uEqHaaMl7MAGtD37ImJVZYVFoZTrhiaREigb+kbdnpDdBG+4KQE+KqJ5CcUS
v22sFkMWSh4G79KB1kSJg17SgUgGqwfT7bYSp43zkLn7aLh7hkVUy0JpR9Ru
qVq4Ck8GiWXw16P0YZ6iO3wRICsKmLupxjZbyWJnxVshxRRFjcI7KS9Fzx3n
arMMVwAFb0E2yWWRAjuOnHipjf+U60QR+L1kAsN0DuAKtyFjdAX1XcbUeYR9
HLhgH4rCBEQF6C3cFElT8pbeDLvGcINP2oiSaP7ZzbMAj8A4zESh/JG9B3Be
9F6PN5KlDj9CR61OJuvt6UBZoUn4OAUImHP7Qbi2kq1ZFyd4qWbuHuLw01EP
hIAOAoqdFVJU9c1xVzab8QJyLpn6QdlYSRZIDXPElY0lWK/rDaJqeGnyRu9o
8SLL9e+qulTIhQpmdMdaCgWcveIgl4Iv9xOYR8Vl3+Pgs8ao7EFuYMkO1Buu
PlM7PHktHkfc9GL4jBmJIxeqVoWzUUYCrbNMHn4TakCKyeKvMnXyvNYrTHy1
YfJ5YUc0nmHO4dEOt4xQgUsTwb/jrhtPnP2m2Ba8zcpZ0ABlYRuJoCWlgZxl
poqXbjh4LLSOB7yY84p9a9ZIFsAFb76EdX2jBpoPFwThrNLAVisgUNGW20Us
54yRNTdLNziE3AIPSYRt1bpty1DvE1wHl25DIZ6Z+VR+J7Ah+uz+E0/9Mhas
fvtLGQaR1p0NqopduFG8VuKXe+13a8KnxwCHbAOMzRhk+BCp8aKaolsj0qm2
1pYQcdHFXLmb4UZrXfdk5Mg7GkYIp7BLdVwnVgylVyNAiE9uvOSEKi0uBa76
ERbWJer5tipVq2KSUSqqosGZxOmlxtkwL3BqDYUFawmkFgis7yrYJaQpgP0H
cZbzm+Kmic6nVly22KzXvw57yo42yYcwdaaCufzgSyHxruQ3VLGMRzAYI0kI
GEIOVWFV4SGCYcIz157taAvDwqCPmLCg2HIzz5Y4AHOnxuYb1DFZrjvt+b33
FjWGkoI6V4WzghhdT5fdhJCpUZGstNbc+UG9AZQBTas+m3U6ZuAnFxpvU7Lb
rwhSV80ay6aLx0mNpdAbK1+G2evSCzxgupGdYTMT+rcGhhwv5L5VWMtx1TW6
s21vGFZAt1vKgnkw7GRziNkvgkD7w8WWm0hvrODt00Xv2Vte1+DVHWIXHjZr
rRXTf92YCsRok45vNJmapuOgsi3qoyxu6TzFigV/zKCLuFfup0anb4dXEk0J
tbWSMVwW1WWdr9wsJTQurs+6QNRxULpa61t1p4EFpC0OqUUX47aEmHYT3w2n
b1cCAHAqbU5XZGsrdC4MuDZ4WQiw0V8Ny2p5syj/hwK9rt76shf4YsRPzDyL
9Mj2okTKoiI3StMAU/nByuB6u0LSA0LxPukh3gsnv6hHxJqNLwma2Aqx7CKl
YTWfevHh7sykwpDFPq7csQVxAfQJtxgi95JxqARzD8gJ/UESyqPXuY3qFJYE
Jyx+Eeh+qikEU0o3vjos6ny2lrIVnC8kZkLnmlVIJGDfkgkXEiiWWxN5IEHF
wQ4t2ityv3P2bNr8jumdvcP2pbJvUB7vvzCI1Eb9vutq7bZS0Bfie3MoXg6x
baGDRDsMRkxwIEjpih5Fwi780ivHwUtXJy7vEA/0nEd8B90ATuWGYOF03vdy
mSZclAkX9jDHZ8j65cg3gN0vMWSFEg/iGjlC8y3mPVSnhoVE3bUBr6qeSHUD
j8z/iEBN3KnhgPHCMhfcY6Ibmt0Ju8gXDEtiWATF5dIvZo9J7ETtm1ZYgM15
90y9WULJA2cnRyALDf1cmuNlLVJup87Xp+x5bpL2hEWgpHm5fGMG2gVi1wUc
Bk5YjZ7CxdH7Ojc3ECuVXvXOPlwJjtsJWM1iteSyuJgDtHHaHLGTeWjmWq4l
TsSPM+wkemSxWyTA21piW17A+Uq4Uz9Yr7u4cne81Wgw6Y5quIXy3tlgdGrj
SoJCfaRf9Ol1NtaJUkhoHdmONTWF96XWyozFNotXTm51QWEFT1XZRBfinMV7
K3GriV9KqsC0KsCUXjPc7y0AM/QVZErdsm4WsJm62Gat7DI3I1qQGQCaxJoE
rG41FG0mINEov+0LLBuAhnaFe7RJbOTrwTVcQHJLR9i+KO+9m4rXSvJjg2ez
7pqZ2jm+SXaa0Wz2nRDpughQzWx3omsDYBsSd0FPmEvZw7WkDaFVqaDrr3z0
MPZLpFsRW/Uc0cqoWEbjawsak2fi/W7RDaUJwoOBpsH5tiy1KbZ9p0MWm7HT
Mdecy3x5rNvyogiVDGOPoZ5Fz/9M6Seyr5hZPDZ6wNYetv6yS1tk+mbv+ofU
NTz0z4Q97Z9pSkrl1bguLdPJyVPPZ6a2ab+m5Yb9VEs/9QBaOuRL0dpwY8zy
cc3JzVL1wO8/jWeiXksRCCx90KXPnrof8b+YAwwluL164v0TRUuRwWgJrZMU
OrX1qPW1ES+m9bnRRRhFr6ONQqVYeT8R0dKe2IxtxoYLwaRuCzH3UvsKy6J+
jWlZawjZ9vs6Yq9ta01fD+49ePTIrqVYwYRyCauEVdhw/ST6v6qevL+xdqI9
TTYilbE2NCrafguNsR7osV/SovVJA8A7lEXbL4AJP0QBYCknDsoCGKJZMymW
7jVV0zLARWolXkoZnAWdNTZhce/bex3VJ8t+LPySE+pK5UMVOu8nbDUEZSFI
mTimcJg9rxpBiEBX8xH3yPuaHFLxHcQgLqQGvX796kKujvk8c9sb0ltu6Q05
11tbAr8khjrkOkqyCm9SaH3Z7a0KtJFrbtngGoI5Nnjh1sW1NedZkDiu6wfu
mdg9gKCcVmKNlUEFT8O9seXKzPrUC3ETJS7XakzyuiBkQ6Slb1ItzeLsFY6N
E/bQY+z+b2EMrGkpDSYUJKyhKyM5e4VcpRopB27APtY016tKXQwmNJPd4KMx
rsnohMQ9scQUdY5HFU1C6NcrPZ24LeOj2g8q7kR0MH0kxTzA1OAPqpWlDOSs
2gvX26YO1eu1MfMLJrXlDdAm6N8E0cET+yuzKG2tvObst7Ruy2ECZeASlIwh
bg2MyJ5Oy6lN1Es2qIiLmScQFJaq4CdO20WeBN1IoLCBT9+vV0CqqXsjirZb
NKA7gXHj2pTunCblorTuVTOJ9AklwRr5N2GsvYrKYDUHiJ5UVqu5xD2d9rWJ
WfEHY2fNvLEsLXENlloEwzyHQZkkSlvmFpcWjXEWm8McS/C0qK9YqZo/8Nym
tgFMnwhe+whBfJjcmCqw+tw/IUAVIgQabwnrsTZD65KuKcOiNpq+17JTrSQ6
D911gmXlIKznlgvqoXjVhAi96TApyxEZ5dYhtVnHOpfCtHW5obHmnbJl7W17
apav3YYpOFJ6Xlpbvy3ViK30Io2aJojlcTLFqaLf8MA6RWaxWfpcgP67hAsC
E9PmXw/s+EaxEPAzT6FxSTUMJ7mX3oXNQxRT/dnYkTJfomCKgnj9YpuGxUqB
ZBkH/MuuMJJf+GBQKp/Tazl2iLeVm9etK5uXFwO0o9FIioh80kIrMfStYe1s
lZt2c3v7t789+eabswefv3vHhy2s2Qzu3xcV6f79Pm/ZvowXIi1oggfuoar9
ACkCeSWnHil73uycgw4leuQBK4X/ylg4GHJDUDLSiBKvXJP5Dnyhw6/Ah+Nj
CR5mLo6mzvjSCworZkocvhnXwOXEDscz3VU5bUs3LKZsbAufoaY35tcShskI
RygmV8sSe0vwZNFSiB8rSjlE41/E7UlqKzVhp1lD2H1CKxD33SSfW4ZXAs8B
CJLInCy7UBx5pNEHj8x1Nb+OtO/BREVUV+R5YIxEh0PJHbW2pJYb+mhBltY1
krcipwpEG1vQz1eVLPC5xrGvNgsEDqsVKq4Yqsin+1qgW9GLRaa1yCKfFmZf
S1Ra9SpoTmj98aejh48+HUwWzCRrbwuJwSImoLcK3TTujkIgQvqIRv79U7Tg
o/A3eierfPfR/XF1uWmy4Hjk2RdYExzKbJ8dS0PAUkclClthKS+BE3iOJA+f
/z7sRKUJL9w09FZr51sb5PZptfn0ITwNwX+ZMUo9QUEpzaVOa68HoJbVgpTm
VK0x9CWOQEKklPdUrRMm5jfFtje+h9UCIGGWX4PGONlJjWYJCAQgXm5LrG6H
ZES655FbA3cwfXZyiRrvW+ovAUWqW8k1j5puz+5LdwcpjTCBA3LiKFM1NqrB
0kX88QxI+CF+y5B+E8sH81ltwrHrnv7CGMzD68Qg1kLBNCIVmyY8DWVt2xpK
WFi8/T0AjVGCrGwqeG32ALntJGdEJ1n053BLxRjXwMjCVKUgH7NkP0bcQXga
iYDUWIzAh/QHsIwiW871ZWI++G6aRQKt+EI8X4vqOjwVcPU+mkeHgQ+3eepY
i+9qhqIprVokux3LK4OsiZh7+roYB/uwfhzge2Ea6vuDEtTXIDyHKTdSy/a9
vRdPC4+zOmcbJfTS8nN2u4QUIB88Uz/L0ke4E7Yai1yIITOvLi+N8wvCwKl/
8OAK85VwUANashWMBj5EY5d1DuPLkwTbiw6GO4bFOtXFfJUqHuSKy/J0x0i0
VTZvZEBPInO1JUG+GIhLIAnNpmGoeSimNCH7C+PV9uIAY/bo3cxc5JFvb0nt
UuphNkH/Fb8VXPq+BIFteqNak8tCkjsrtW6cuFwjCOZmZ//2VjbiyH/WYAgS
d7hGHaJkOrMeeLT08TBKZSuXlv3ibx0mGDCIKsZDtI3WPs0tBkrFXmLaJP3L
q9mOC2jva2p3DCW1FYxs6zYKFPEACH5f+Ey7g1tGAJqwmiuJfsBbepPZPhXz
yZm8QgAISA1+EcO7yrXlgVlgT2DOJz3C4fZetJWydhVuidYqb/DmbTkvc444
LImJI3XanL0aikFDuKzbM3CL1e1QpKgVjMqsdx2j6CXGETIxnxWd2q1gBixs
hci0gNm2xq4fK/CrCitS1utV1rBU/1j9+2sIb+kC4rPOGrF3tGxp9XR3ABZa
ACJWr+i5cQPLXo7npawtJ/L29t/ORk8Pp4gwjcpiPRtVV3np/rder0afPobW
XkEwbmFLRu/FvQBFzCjCIL9wpQcXAJnZpCMdJDvTtKvYP5jBK0Sp0L9egvIu
GiUb0IK83sehQPuULQcGgRFOSBC/8QEytUbbBDtoMWa3oyDC79ymL+YzrVex
0aQByQAwWzSikBMlGYTK8JUtgyvVnuH8+UQcZKt5g9/8SWnPYHuAQfFw8E3Q
hHWPZWLc8LrHOroO9Q2tz2Mj+0vd5UWSlUkgTdEDbveANzeZ14YFUGy7XYlZ
TzTRDeyBbqEDvbl/iOha6Kiu01TCmM5l5L5Xjsfr9mNi73LAmvI49taahvqx
HeM8b0VKFFPvHxJ1IPJAWf6ZhwfDEqksL92/KBMwQx8PkXdTYd/oReHUmpxV
acG5oPJVbtjMu6kwplZfSsUy1kqX3Z2EfSHe+cX9/SBL6iRbreh9rXZkCPDF
ziQHyRHJoiZ/cZqBe9CUiDTRr11HJzw2+A/JjDx9u3Lv3KeLSD+grbHv44t7
4aG9IT64N2jygH4ctLoydN+fffecXx9IgTMd3XAQ/3ePMpbf/3B6fvbsH798
d/qPXy7O/vt0qN//PdPaO98W8JC3fmVUJ/NieQmSnVnv5ItjPR5YFn2wYkzV
Sv1Jbj2V2K/Pnz159Pgvn0uF8CjxayGoxYVxqlm2sRcZubOobppS8l8YjcA5
Zl3ljstpLXmV8qAyFplz7TOvHPjN19lYZZPpWeq4Z/H7cJICeCaUcInF8ckS
os79BHm7QbTR/dHymJS7+IEJXs09Ub7SeqGuw6zYBjtmbSQ7HWs7yk2Jbt9M
LNLIJEocrt1c8bhctJycEU+O9jiLBF9EQO4j/54bkn6kFr2ITz6oVmsLC/dl
g5mQ17BFj8wtZWqahRPTonwEAlCvHmqONSMoJN0mfW+3NVtY7rKIMrjNZfJa
XGWl+Nkl8S/n0ucTo0ULfKGeEkKEOAb1muVxnMabGWD6vRma4skJxHhRfbU8
SdDMLHPRp1fS3IsTfDTtRaPPoI4Zl+uRHn6t4W3ZYshdNUcodoD6G8Xlwj4W
b92xC3ySO4fNYLbwuEjsSBl3mg2YFZy8yJVfwXvZarB1UFkIiaGCSBGGPU89
Mg7VhuNx0lHo1vNHzN1UI5s0Qq/zuqS3RAed+H9wv7uNwzjw0s0OwvgCcEuI
WVY5Nc6Ft7tqzbyO8FVpRtuPlqNCxHe27iSbKi5ai4TMxDJIvUZbYcXiZI2k
KgaUGts1fjEEl2coCpInFVPF10zVE3xp4XMSWU1ZpyaLGY6FXgbnCrZ/d6qU
rIMAL0hTSkwhDVICiUANGOI9fferN9SFGyPZONKQ31URc07byys7S9KwTWL7
lBrpf5a6+jQJJ4JhMHhE35bQHpFJF5jl9YgAuoiqLQJQnhfwmGgWL6Q+0eyy
CDAzmuOjo0u38zbjQzeUo8msvjxSe6R29gj+Pbqe5rMj1nxujh7+9bNMIHXw
6AugkvGHGZk9JoRSKNMvOEXUGu5cMUqnOMN9NGZxergj4umUKHQ6Jx5YBDo1
IfyjbBwOIn6K0nyg5t91L68uND4jeERTF2Hj1BEHG2gme8HG96Yr1DdeGU9z
1xHOAXnude+1Ye5vJ21FE/azXt/bTz/k0wd/+RnRgoaXE5wLdZV7czIoDUXL
TEbV7cF6W40alh9YVgBUC0ZIKMKmdpTDjy4Lp+k4a2KSmGgHbK0NKBtckGm7
TdVDRgSeXXljoqkMPexQbaAo5lYoiQGkutBT7wi+hRN1mPWuEANlCiu1z6jt
KQGuFo1es1qZuGHKZVY4dRGmLMkqF3LbNcehW8so1gDnjFwwcM27qZToDg78
TZakqXpqKMtompG2iveoZhEJzpIQ9LUkA9QLBkY86FJ243kUsOxyUUQhUdr6
7vonzimuVZCw5TOii6kQsTwUdrOUbt03mnmnN5bGAJe7fm1d6M2U4D6+yZgP
whBVP/YYwT6MnhKhWVVlxEvbUPcslnCMJ6bylhEAQ1wbTZO5c1KIxGbp0aGe
JSTNjJVr2Ff8klBz0441q0ZuxusyRuqgJIO7BblgTFDXJqiygVjLysT3KciN
n1icMWHdEaVbH/BgMlZbVJQqFSBVuxMEAHaqCuB1Jqzr2H3p0UVuIINSckp6
Itqx/w2XnjyB1AXhiif0aZH/WtWaFSSlIKVXcdJs/OYwTRnPEPMMxHVaNny2
OSD7Q/bTvYcPf97vua3oMttejlarxVHkRHP/HE3zlb+yHh5oVQnjjJCzdbac
1bmg4TdSKQlJDusbsglXgx5I3a7iSLoM1GigUbDIhAjACRRVSfrRJoTw3ibE
SZqpkZ0ht2CBb1PtrIMym89bBkkC/AaN1rSL/LRzZsQQ0K4n82ozzaox8TBG
Y6bOaG/FAXyC31lXtx5dqFsj6jiBkVdF+kYB+zH/1LMLCJCAek3L6xSXYYm/
knpIwgKNoHADaqazkxcnbYacpIrJc8WJPQfEbvBanpNqIHHtE3UMiNkbCKv8
YbMgSZszsKyzlOmbUD7pn/yfFFffrt4UT2gi/d0JFmc8XbkPRmI0vXt3PNiL
ogdHqG4cfT+au0f2XCPn4vX3MRbFEPU+L5Y4nuqtIeQaEXD8CPdjbwsRCH30
azXmD/HKbpvnbvSIMUYPXDGI8+GNYwK7DT8h7GVTSIfjZ7TzgovZKK3dB7xH
HyjaAwllUW9v1UkwQiz1vY0WSq3X29bvaAiNpPWyPqAN+4F2Ijz/Gx52/9yz
8j2mMIVwbNjR6vBPj0hUrvUQgjM9MKLXuMvs2ljbWe6RNRNo9fk4d/xuFC8s
tpk8G7m89Q4q5TIHsjY6bsCMQBr85CbT3ZWbFYzGwRHVNvnH9Ge+aC+SBXs0
NhvUqnEXpN0w2+32sMyX+WHljCFJE6IIOuLrRnK6PW2ottCJbGVlyjVkyPFE
RuBwI3o4rq5ptSUJB5XwcMNJ7MYqenFDIVtZvILavLoEwLMFB6DmEvxroRL1
xK0/VhheBSexjuNwZpZdbMbr5Nu+1rLs3Gzj4HXkr18cnQTTqfOl00ey7FTZ
9gcpmx5/wVSPvcfO7ttDIGpvXC6dOr5H9ABDfsiDzzxfWk8Lkl8JD88oqSvw
jsAE1xXeOWoa9jzPAbyyHML05uAP1p0LpZe2vlE+0DDtofln7u5dRDQRZVHv
7MpJL6yH3385nX+VDdwf66+e55fOphM81H5zcPzlkfvwy+n0K9eG+/vUfvcU
1PJSAdrp8ohA5wtl4fMIrJ0PPwNNpI/2v+81z/MJnFDN1YDUktxQbtGLnc8c
YSjZK7dRNIKIBIi5oXrUubWGU5MFFIT+qjMhWHtgeZxq9MngxHIM7EzK+i+n
ZDFz8oqPPHn5/PnLF9jPMIc1XQN09v4Xsgps9YNe8oRZFMb6OC/kqbPTi292
HFW9v//QAZU2/vTHsq3N3B3JuyP5ZzySOxXiP3RId7X6pz+2qXJ5d2jvDu3/
h0NLQ/OjHli0eHdY7w7r3WH96Ic18dZ81EMbt3x3eO8O793h/WiHN/aKfpQz
GzV4d1TvjurdUf3YR/WjHtO7I3p3RO+O6B8+onFY7w8dz6ihu6N5dzTvjubH
Oprunx/lZPIHdwfz7mDeHczfcjAlUwXzcS7wi9IDu3yKja95KsV2QRtRCrpE
aNn2ooJOSd1yQ7Fkr/yJ23On77LQDGL8VdLPLX/aaqgumQVlHRp2CJOyCDgT
UDOQM/8JUlsBpdiQADsn1y0RJ+4Kv3zXHuJ7RueBLVjpqHVf40y+zhTaaCNJ
0T1uEjYLHiNNJxCcHJOVtkiglKSdAKJcx22HYutawdydEQWnfC+EFaeeO8DG
/HtHGBgHjElAXpGFYuLJuAf/N+N+VReoODE4rWvX6WihV/LFqMAXf2it9RXy
BivnxuSz3zr2F7yvhBxsmYek2u4bsuwH/GE/fjAa36yVD+l9D50XBPJP+OAJ
kp7ln5hbYQnpPGlANM3kPBTgGpFjuZxH4QOYtZakLwF0J2RxmCm6KxEnjcK9
tJMCYv3+/MXA3e8jXgCrfCL0X5BO+5t6eQw88jEv7uZ4tVocu5v/wK22+2rE
X2tOdZh9mbOfKF3GxRHQa6hp/LOOhNWhdMn2zk5fP+t2ALg53Vn8tcfkeWk2
OPP3ZYSAG0a94N4tFitUQcikMuX5syefPXr02bt3x5Jl7PcutZoBdBqnSyTX
/GDw00+vvz27GDx9+eT756cvXiNZCDDWpgS7hvseiLv3Ae7Y6Jm7a97KxLhH
XlQDcqUG6gZJujuUNOKz1k5QajvKVWUddRJ5JRdUaRnawC5zmDx+zbt3gsjz
+wDXjO3NGbmykNmIXLuqFFHQVWdYqPdkYskiUXomyCfldT3sr9jckj+uIk2q
nljC8uNHjx45HQzEemC5yf4XSdw4ztEIAgA=

-->

</rfc>
