<?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.5 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-wang-ppm-dap-taskprov-06" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.19.1 -->
  <front>
    <title>In-band Task Provisioning for DAP</title>
    <seriesInfo name="Internet-Draft" value="draft-wang-ppm-dap-taskprov-06"/>
    <author fullname="Shan Wang">
      <organization>Apple Inc.</organization>
      <address>
        <email>shan_wang@apple.com</email>
      </address>
    </author>
    <author fullname="Christopher Patton">
      <organization>Cloudflare</organization>
      <address>
        <email>chrispatton+ietf@gmail.com</email>
      </address>
    </author>
    <date year="2024" month="February" day="02"/>
    <area>Security</area>
    <workgroup>Privacy Preserving Measurement</workgroup>
    <keyword>next generation</keyword>
    <keyword>unicorn</keyword>
    <keyword>sparkling distributed ledger</keyword>
    <abstract>
      <?line 46?>

<t>An extension for the Distributed Aggregation Protocol (DAP) is specified that
allows the task configuration to be provisioned in-band.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://wangshan.github.io/draft-wang-ppm-dap-taskprov/draft-wang-ppm-dap-taskprov.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-wang-ppm-dap-taskprov/"/>.
      </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/wangshan/draft-wang-ppm-dap-taskprov"/>.</t>
    </note>
  </front>
  <middle>
    <?line 52?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The DAP protocol <xref target="DAP"/> enables secure aggregation
of a set of reports submitted by Clients. This process is centered around a
"task" that determines, among other things, the cryptographic scheme to use for
the secure computation (a Verifiable Distributed Aggregation Function
<xref target="VDAF"/>), how reports are partitioned into
batches, and privacy parameters such as the minimum size of each batch. Before a
task can be executed, it is necessary to first provision the Clients,
Aggregators, and Collector with the task's configuration.</t>
      <t>The core DAP specification does not define a mechanism for provisioning tasks.
This document describes a mechanism designed to fill this gap. Its key feature
is that task configuration is performed completely in-band, via HTTP request
headers.</t>
      <t>This method presumes the existence of a logical "task author" (written as
"Author" hereafter) who is capable of pushing configurations to Clients. All
parameters required by downstream entities (the Aggregators and Collector) are
encoded in an extension field of the Client's report. There is no need for
out-of-band task orchestration between Leader and Helpers, therefore making
adoption of DAP easier.</t>
      <t>The extension is designed with the same security and privacy considerations of
the core DAP protocol. The Author is not regarded as a trusted third party: It
is incumbent on all protocol participants to verify the task configuration
disseminated by the Author and opt-out if the parameters are deemed insufficient
for privacy. In particular, adopters of this extension should presume the
Author is under the adversary's control. In fact, we expect in a real-world
deployment that the Author may be implemented by one of the Aggregators or
Collector.</t>
      <t>Finally, the DAP protocol requires configuring the entities with a variety of
assets that are not task-specific, but are important for establishing
Client-Aggregator, Collector-Aggregator, and Aggregator-Aggregator
relationships. These include:</t>
      <ul spacing="normal">
        <li>
          <t>The Collector's HPKE <xref target="RFC9180"/> configuration used by the Aggregators to
encrypt aggregate shares.</t>
        </li>
        <li>
          <t>Any assets required for authenticating HTTP requests.</t>
        </li>
      </ul>
      <t>This document does not specify a mechanism for provisioning these assets; as in
the core DAP protocol; these are presumed to be configured out-of-band.</t>
      <t>Note that we consider the VDAF verification key <xref target="VDAF"/>, used by the
Aggregators to aggregate reports, to be a task-specific asset. This document
specifies how to derive this key for a given task from a pre-shared secret,
which in turn is presumed to be configured out-of-band.</t>
    </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?>

<t>This document uses the same conventions for error handling as <xref target="DAP"/>. In
addition, this document extends the core specification by adding the following
error types:</t>
      <table>
        <thead>
          <tr>
            <th align="left">Type</th>
            <th align="left">Description</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">invalidTask</td>
            <td align="left">An Aggregator has opted out of the indicated task as described in <xref target="provisioning-a-task"/></td>
          </tr>
        </tbody>
      </table>
      <t>The terms used follow those described in <xref target="DAP"/>. The following new terms are
used:</t>
      <dl>
        <dt>Task configuration:</dt>
        <dd>
          <t>The non-secret parameters of a task.</t>
        </dd>
        <dt>Task author:</dt>
        <dd>
          <t>The entity that defines a task's configuration.</t>
        </dd>
      </dl>
    </section>
    <section anchor="definition">
      <name>The Taskprov Extension</name>
      <t>The process of provisioning a task begins when the Author disseminates the task
configuration to the Collector and each of the Clients. When a Client issues an
upload request to the Leader (as described in <xref section="4.3" sectionFormat="of" target="DAP"/>), it
includes in an HTTP header the task configuration it used to generate the
report. We refer to this process as "task advertisement". Before consuming the
report, the Leader parses the configuration and decides whether to opt-in; if
not, the task's execution halts.</t>
      <t>Otherwise, if the Leader does opt-in, it advertises the task to the Helpers
during the aggregation protocol (<xref section="4.4" sectionFormat="of" target="DAP"/>). In particular, it
includes the task configuration in an HTTP header of each aggregation job
request for that task. Before proceeding, the Helper must first parse the
configuration and decide whether to opt-in; if not, the task's execution halts.</t>
      <t>To advertise a task to its peer, a Taskprov participant includes a header
"dap-taskprov" with a request incident to the task execution. The value is the
<tt>TaskConfig</tt> structure defined below, expanded into 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>
      <artwork><![CDATA[
struct {
    /* Info specific for a task. */
    opaque task_info<1..2^8-1>;

    /* Leader API endpoint as defined in I-D.draft-ietf-ppm-dap-09. */
    Url leader_aggregator_endpoint;

    /* Helper API endpoint as defined in I-D.draft-ietf-ppm-dap-09. */
    Url helper_aggregator_endpoint;

    /* This determines the query type for batch selection and the
    properties that all batches for this task must have. */
    opaque query_config<1..2^16-1>;

    /* Time up to which Clients are allowed to upload to this task.
    Defined in I-D.draft-ietf-ppm-dap-09. */
    Time task_expiration;

    /* Determines the VDAF type and its config parameters. */
    opaque vdaf_config<1..2^16-1>;
} TaskConfig;
]]></artwork>
      <t>The purpose of <tt>TaskConfig</tt> is to define all parameters that are necessary for
configuring an Aggregator. It includes all the fields to be associated with a
task. In addition to the Aggregator endpoints, maximum batch query count, and
task expiration, the structure includes an opaque <tt>task_info</tt> field that is
specific to a deployment. For example, this can be a string describing the
purpose of this task.</t>
      <t>The opaque <tt>query_config</tt> field defines the DAP query configuration used to
guide batch selection. Its content is structured as follows:</t>
      <artwork><![CDATA[
struct {
    Duration time_precision;
    uint16 max_batch_query_count;
    uint32 min_batch_size;
    QueryType query_type;
    select (QueryConfig.query_type) {
        case time_interval: Empty;
        case fixed_size:    uint32 max_batch_size;
    };
} QueryConfig;
]]></artwork>
      <t>The length prefix of the <tt>query_config</tt> ensures that the <tt>QueryConfig</tt> structure
can be decoded even if an unrecognized variant is encountered (i.e., an
unimplemented query type).</t>
      <t>The maximum batch size for <tt>fixed_size</tt> query is optional. If <tt>query_type</tt> is
<tt>fixed_size</tt> and <tt>max_batch_size</tt> is 0, Aggregator should provision the task
without maximum batch size limit. Which means during batch validation
(<xref section="4.6.5.2.2" sectionFormat="of" target="DAP"/>), Aggregator does not check
<tt>len(X) &lt;= max_batch_size</tt>, where <tt>X</tt> is the set of reports successfully
aggregated into the batch.</t>
      <t>The <tt>vdaf_config</tt> defines the configuration of the VDAF in use for this task.
Its content is as follows (codepoints are as defined in <xref target="VDAF"/>):</t>
      <artwork><![CDATA[
enum {
    prio3_count(0x00000000),
    prio3_sum(0x00000001),
    prio3_sum_vec(0x00000002),
    prio3_histogram(0x00000003),
    poplar1(0x00001000),
    (2^32-1)
} VdafType;

struct {
    opaque dp_config<1..2^16-1>;  /* Encoded differential privacy parameters */
    VdafType vdaf_type;
    select (VdafConfig.vdaf_type) {
        case prio3_count:
            Empty;
        case prio3_sum:
            uint8;  /* bit length of the summand */
        case prio3_sum_vec:
            uint32; /* length of the vector */
            uint8;  /* bit length of each summand */
            uint32; /* size of each proof chunk */
        case prio3_histogram:
            uint32; /* number of buckets */
            uint32; /* size of each proof chunk */
        case poplar1:
            uint16; /* bit length of input string */
    };
} VdafConfig;
]]></artwork>
      <t>The length prefix of the <tt>vdaf_config</tt> ensures that the <tt>VdafConfig</tt> structure
can be decoded even if an unrecognized variant is encountered (i.e., an
unimplemented VDAF).</t>
      <t>Apart from the VDAF-specific parameters, this structure includes a mechanism for
differential privacy (DP). The opaque <tt>dp_config</tt> contains the following structure:</t>
      <artwork><![CDATA[
enum {
    reserved(0), /* Reserved for testing purposes */
    none(1),
    (255)
} DpMechanism;

struct {
    DpMechanism dp_mechanism;
    select (DpConfig.dp_mechanism) {
        case none: Empty;
    };
} DpConfig;
]]></artwork>
      <ul empty="true">
        <li>
          <t>OPEN ISSUE: Should spell out definition of <tt>DpConfig</tt> for various differential
privacy mechanisms and parameters. See draft
<eref target="https://github.com/wangshan/draft-wang-ppm-differential-privacy">draft</eref> for discussion.</t>
        </li>
      </ul>
      <t>The length prefix of the <tt>dp_config</tt> ensures that the <tt>DpConfig</tt> structure can
be decoded even if an unrecognized variant is encountered (i.e., an
unimplemented DP mechanism).</t>
      <t>The definition of <tt>Time</tt>, <tt>Duration</tt>, <tt>Url</tt>, and <tt>QueryType</tt> follow those in
<xref target="DAP"/>.</t>
      <section anchor="construct-task-id">
        <name>Deriving the Task ID</name>
        <t>When using the Taskprov extension, the task ID is computed as follows:</t>
        <artwork><![CDATA[
task_id = SHA-256(task_config)
]]></artwork>
        <t>where <tt>task_config</tt> is the <tt>TaskConfig</tt> structure disseminated by the Author.
Function SHA-256() is as defined in <xref target="SHS"/>.</t>
      </section>
      <section anchor="vdaf-verify-key">
        <name>Deriving the VDAF Verification Key</name>
        <t>When a Leader and Helper implement the <tt>taskprov</tt> extension in the context of a
particular DAP deployment, they <bcp14>SHOULD</bcp14> compute the shared VDAF verification key
<xref target="VDAF"/> as described in this section.</t>
        <t>The Aggregators are presumed to have securely exchanged a pre-shared secret
out-of-band. The length of this secret <bcp14>MUST</bcp14> be 32 bytes. Let us denote this
secret by <tt>verify_key_init</tt>.</t>
        <t>Let <tt>VERIFY_KEY_SIZE</tt> denote the length of the verification key for the VDAF
indicated by the task configuration. (See <xref section="5" sectionFormat="comma" target="VDAF"/>.)</t>
        <t>The VDAF verification key used for the task is computed as follows:</t>
        <artwork><![CDATA[
verify_key = HKDF-Expand(
    HKDF-Extract(
        taskprov_salt,   # salt
        verify_key_init, # IKM
    ),
    task_id,             # info
    VERIFY_KEY_SIZE,     # L
)
]]></artwork>
        <t>where <tt>taskprov_salt</tt> is defined to be the SHA-256 hash of the octet string
"dap-taskprov" and <tt>task_id</tt> is as defined in <xref target="construct-task-id"/>. Functions
HKDF-Extract() and HKDF-Expand() are as defined in <xref target="RFC5869"/>. Both functions
are instantiated with SHA-256.</t>
      </section>
      <section anchor="provisioning-a-task">
        <name>Configuring a Task</name>
        <t>Prior to participating in a task, each protocol participant must determine if
the <tt>TaskConfig</tt> disseminated by the Author can be configured. The participant
is said to "opt in" to the task if the derived task ID (see
<xref target="construct-task-id"/>) corresponds to an already configured task or the task ID
is unrecognized and therefore corresponds to a new task.</t>
        <t>A protocol participant <bcp14>MAY</bcp14> "opt out" of a task if:</t>
        <ol spacing="normal" type="1"><li>
            <t>The derived task ID corresponds to an already configured task, but the task
configuration disseminated by the Author does not match the existing
configuration.</t>
          </li>
          <li>
            <t>The VDAF, DP, or query configuration is deemed insufficient for privacy.</t>
          </li>
          <li>
            <t>A secure connection to one or both of the Aggregator endpoints could not be
established.</t>
          </li>
          <li>
            <t>The task lifetime is too long.</t>
          </li>
        </ol>
        <t>A protocol participant <bcp14>MUST</bcp14> opt out if the task has expired or if it does not
support an indicated task parameter (e.g., VDAF, DP mechanism, or query type).</t>
        <t>The behavior of each protocol participant is determined by whether or not they
opt in to a task.</t>
      </section>
      <section anchor="hpke-config-no-task-id">
        <name>Supporting HPKE Configurations Independent of Tasks</name>
        <t>In DAP, Clients need to know the HPKE configuration of each Aggregator before
sending reports. (See HPKE Configuration Request in <xref target="DAP"/>.) However, in a DAP
deployment that supports the Taskprov extension, if a Client requests the
Aggregator's HPKE configuration with the task ID computed as described in
<xref target="construct-task-id"/>, the task ID may not be configured in the Aggregator yet,
because the Aggregator is still waiting for the task to be advertised by a
Client.</t>
        <t>To mitigate this issue, if an Aggregator wants to support the Taskprov
extension, it <bcp14>SHOULD</bcp14> choose which HPKE configuration to advertise to Clients
independent of the task ID. It <bcp14>MAY</bcp14> continue to support per-task HPKE
configurations for other tasks that are configured out-of-band.</t>
        <t>In addition, if a Client intends to advertise a task via the Taskprov extension,
it <bcp14>SHOULD NOT</bcp14> specify the <tt>task_id</tt> parameter when requesting the HPKE
configuration from an Aggregator.</t>
      </section>
    </section>
    <section anchor="client-behavior">
      <name>Client Behavior</name>
      <t>Upon receiving a <tt>TaskConfig</tt> from the Author, the Client decides whether to
opt in to the task as described in <xref target="provisioning-a-task"/>. If the Client opts
out, it <bcp14>MUST</bcp14> not attempt to upload reports for the task.</t>
      <ul empty="true">
        <li>
          <t>OPEN ISSUE: In case of opt-out, would it be useful to specify how to report
this to the Author?</t>
        </li>
      </ul>
      <t>Once the client opts into a task, it may begin uploading reports for the task.
Each upload request for that task <bcp14>MUST</bcp14> advertise the task configuration. The
extension codepoint <tt>taskprov</tt> <bcp14>MUST</bcp14> be offered in the <tt>extensions</tt> field of
both Leader and Helper's <tt>PlaintextInputShare</tt>. In addition, each report's task
ID <bcp14>MUST</bcp14> be computed as described in <xref target="construct-task-id"/>.</t>
      <t>The <tt>taskprov</tt> extension type is defined as follows:</t>
      <artwork><![CDATA[
enum {
    taskprov(0xff00),
    (65535)
} ExtensionType;
]]></artwork>
      <t>The extension data in report share for <tt>taskprov</tt> <bcp14>MUST</bcp14> be zero length. The task
config is transported by the "dap-taskprov" header.</t>
    </section>
    <section anchor="leader-behavior">
      <name>Leader Behavior</name>
      <section anchor="upload-protocol">
        <name>Upload Protocol</name>
        <t>Upon receiving a task advertisement from a Client, if the Leader does not
support the extension, it will ignore the HTTP header. In particular, if the
task ID is not recognized, then it <bcp14>MUST</bcp14> abort the upload request with
"unrecognizedTask".</t>
        <t>Otherwise, if the Leader does support the extension, it first attempts to parse
the "dap-taskprov" HTTP header payload. If parsing fails, it <bcp14>MUST</bcp14> abort with
"invalidMessage".</t>
        <t>Next, it checks that the task ID indicated by the upload request matches the
task ID derived from the extension payload as specified in
<xref target="construct-task-id"/>. If the task ID does not match, then the Leader <bcp14>MUST</bcp14> abort
with "unrecognizedTask".</t>
        <t>The Leader then decides whether to opt in to the task as described in
<xref target="provisioning-a-task"/>. If it opts out, it <bcp14>MUST</bcp14> abort the upload request with
"invalidTask".</t>
        <ul empty="true">
          <li>
            <t>OPEN ISSUE: In case of opt-out, would it be useful to specify how to report
this to the Author?</t>
          </li>
        </ul>
        <t>Finally, once the Leader has opted in to the task, it completes the upload
request as usual.</t>
        <t>During the upload flow, if the Leader's report share does not present a
<tt>taskprov</tt> extension type, Leader <bcp14>MUST</bcp14> abort the upload request with
"invalidMessage".</t>
      </section>
      <section anchor="aggregate-protocol">
        <name>Aggregate Protocol</name>
        <t>When the Leader opts in to a task, it <bcp14>SHOULD</bcp14> derive the VDAF verification key
for that task as described in <xref target="vdaf-verify-key"/>. The Leader <bcp14>MUST</bcp14> advertise
the task to the Helper in every request incident to the task as described in
<xref target="definition"/>.</t>
      </section>
      <section anchor="collect-protocol">
        <name>Collect Protocol</name>
        <t>The Collector might issue a collect request for a task provisioned by the
Taskprov extension prior to opting in to the task. In this case, the Leader
would need to abort the collect request with "unrecognizedTask". When it does
so, it is up to the Collector to retry its request.</t>
        <ul empty="true">
          <li>
            <t>OPEN ISSUE: This semantics is awkward, as there's no way for the Leader to
distinguish between Collectors who support the extension and those that don't.</t>
          </li>
        </ul>
        <t>The Leader <bcp14>MUST</bcp14> advertise the task in every aggregate share request issued to
the Helper as described in <xref target="definition"/>.</t>
      </section>
    </section>
    <section anchor="helper-behavior">
      <name>Helper Behavior</name>
      <t>Upon receiving a task advertisement from the Leader, If the Helper does not
support the Taskprov extension, it will ignore the "dap-taskprov" HTTP header
and process the aggregate request as usual. In particular, if the Helper does
not recognize the task ID, it <bcp14>MUST</bcp14> abort the aggregate request with error
"unrecognizedTask". Otherwise, if the Helper supports the extension, it
proceeds as follows.</t>
      <t>First, the Helper attempts to parse payload of the "dap-taskprov" HTTP header.
If this step fails, the Helper <bcp14>MUST</bcp14> abort with "invalidMessage".</t>
      <t>Next, the Helper checks that the task ID indicated in the upload request matches
the task ID derived from the <tt>TaskConfig</tt> as defined in <xref target="construct-task-id"/>.
If not, the Helper <bcp14>MUST</bcp14> abort with "unrecognizedTask".</t>
      <t>Next, the Helper decides whether to opt in to the task as described in
<xref target="provisioning-a-task"/>. If it opts out, it <bcp14>MUST</bcp14> abort the aggregation job
request with "invalidTask".</t>
      <ul empty="true">
        <li>
          <t>OPEN ISSUE: In case of opt-out, would it be useful to specify how to report
this to the Author?</t>
        </li>
      </ul>
      <t>Finally, the Helper completes the request as usual, deriving the VDAF
verification key for the task as described in <xref target="vdaf-verify-key"/>. For any
report share that does not include the <tt>taskprov</tt> extension with an empty
payload, the Helper <bcp14>MUST</bcp14> mark the report as invalid with error
"invalid_message" and reject it.</t>
    </section>
    <section anchor="collector-behavior">
      <name>Collector Behavior</name>
      <t>Upon receiving a <tt>TaskConfig</tt> from the Author, the Collector first decides
whether to opt in to the task as described in <xref target="provisioning-a-task"/>. If the
Collector opts out, it <bcp14>MUST</bcp14> not attempt to upload reports for the task.</t>
      <t>Otherwise, once opted in, the Collector <bcp14>MAY</bcp14> begin to issue collect requests for
the task. The task ID for each request <bcp14>MUST</bcp14> be derived from the <tt>TaskConfig</tt> as
described in <xref target="provisioning-a-task"/>. The Collector <bcp14>MUST</bcp14> advertise the task as
described in <xref target="definition"/>.</t>
      <t>If the Leader responds to a collect request with an "unrecognizedTask" error,
the Collector <bcp14>MAY</bcp14> retry its collect request after waiting for a duration.
header.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This document has the same security and privacy considerations as the core DAP
specification. In particular, for privacy we consider the Author to be under
control of the adversary. It is therefore incumbent on protocol participants to
verify the privacy parameters of a task before opting in.</t>
      <t>In addition, the Taskprov extension is designed to maintain robustness even when
the Author misbehaves, or is merely misconfigured. In particular, if the Clients
and Aggregators have an inconsistent view of the the task configuration, then
aggregation of reports will fail. This is guaranteed by the binding of the task
ID (derived from the task configuration) to report shares provided by HPKE
encryption. Furthermore, the presence of <tt>taskprov</tt> extension type in the report
share means Aggregators that do not recognize the Taskprov extension will abort
with <tt>invalidMessage</tt>, as described in (<xref section="4.4.3" sectionFormat="of" target="DAP"/>). This
prevents a malicious Author from provisioning a modified task to each party
with other means, which can lead to compromised privacy guarantee in aggregate
result.</t>
      <ul empty="true">
        <li>
          <t>OPEN ISSUE: What if the Collector and Aggregators don't agree on the task
configuration? Decryption should fail.</t>
        </li>
      </ul>
      <t>A malicious coalition of Clients might attempt to pollute an Aggregator's
long-term storage by uploading reports for many (thousands or perhaps millions)
of distinct tasks. While this does not directly impact tasks used by honest
Clients, it does present a Denial-of-Service risk for the Aggregators
themselves.</t>
      <ul empty="true">
        <li>
          <t>TODO: Suggest mitigations for this. Perhaps the Aggregators need to keep track
of how many tasks in total they are opted in to?</t>
        </li>
      </ul>
    </section>
    <section anchor="operational-considerations">
      <name>Operational Considerations</name>
      <t>The taskprov extension is designed so that the Aggregators do not need to store
individual task configurations long-term. Because the task configuration is
advertised in each request in the upload, aggregation, and colletion protocols,
the process of opting-in and deriving the task ID and VDAF verify key can be
re-run on the fly for each request. This is useful if a large number of
concurrent tasks are expected.</t>
      <t>Once an Aggregator has opted-in to a task, the expectation is that the task is
supported until it expires. In particular, Aggregators that operate in this
manner <bcp14>MUST NOT</bcp14> opt out once they have opted in.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <ul empty="true">
        <li>
          <t>NOTE(cjpatton) Eventually we'll have IANA considerations (at the very least
we'll need to allocate a codepoint) but we can leave this blank for now.</t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="SHS">
        <front>
          <title>Secure Hash Standard</title>
          <author>
            <organization/>
          </author>
          <date year="2015" month="August" day="04"/>
        </front>
        <seriesInfo name="FIPS PUB 180-4" value=""/>
      </reference>
      <reference anchor="DAP">
        <front>
          <title>Distributed Aggregation Protocol for Privacy Preserving Measurement</title>
          <author fullname="Tim Geoghegan" initials="T." surname="Geoghegan">
            <organization>ISRG</organization>
          </author>
          <author fullname="Christopher Patton" initials="C." surname="Patton">
            <organization>Cloudflare</organization>
          </author>
          <author fullname="Brandon Pitman" initials="B." surname="Pitman">
            <organization>ISRG</organization>
          </author>
          <author fullname="Eric Rescorla" initials="E." surname="Rescorla">
            <organization>Mozilla</organization>
          </author>
          <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
            <organization>Cloudflare</organization>
          </author>
          <date day="18" month="December" year="2023"/>
          <abstract>
            <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>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-ppm-dap-09"/>
      </reference>
      <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="20" month="November" 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-08"/>
      </reference>
      <reference anchor="RFC9180">
        <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="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="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="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>
    </references>
    <?line 550?>

<section numbered="false" anchor="contributors">
      <name>Contributors</name>
      <ul empty="true">
        <li>
          <t>CP: Unless the order is meaningful, consider alphabetizing these names.</t>
        </li>
      </ul>
      <t>Junye Chen
Apple Inc.
junyec@apple.com</t>
      <t>Suman Ganta
Apple Inc.
sganta2@apple.com</t>
      <t>Gianni Parsa
Apple Inc.
gianni_parsa@apple.com</t>
      <t>Michael Scaria
Apple Inc.
mscaria@apple.com</t>
      <t>Kunal Talwar
Apple Inc.
ktalwar@apple.com</t>
      <t>Christopher A. Wood
Cloudflare
caw@heapingbits.net</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA8Vc6Xrb1pn+f67iDP3DVIakLW/jyokT2ZJqTbyolpw006cV
D4FDEhEIoFhEM456Lb2WXtl8y9lAgLL7NNPxj4QCcLZvfb8FGI/Hok7qVB/I
wWk2nqkslhequpJnZX6dVEmeJdlCzvNSHh2eDUSkar3Iy82BTLJ5LkScR5la
weC4VPN6vFbZYlwUq3GsinEN0xQwy/j+E1E1s1VS4XT1poDHT48vTqS8I1Va
5bByksW60PCfrB6MYCOHL+B/sObg9P3FyUBkzWqmywMRw+oHIsqzSmdVUx3I
umy0uD6QD4UqtYKJznXUlEm9GYh1Xl4tyrwp4OpZmVyraANn0pUur/FEb7Sq
mlKvcEVxpTfweHwg5Fhm+mMtFzrTpaphu3ipyZIoL+lnVajyKsUJ4qSqy2TW
1DqWqY4XuhTXOmtgf1J+6bpSMjUGP8Jm8e7vcSBeX6kkhetAyu8SXc8nebnA
y6qMlnB5WddFdXDvHj6Fl5JrPbGP3cML92Zlvq70PRh/D8ctknrZzGAkMqha
quzeLfzCASlQuqqDpezACU81SfLbprjt3mRZr9KBEKqpl3mJNIf1pJw3acqi
dA7LyB9hKF2HI6ks+YWYcSAPiyLV8jSLJnRTGzrhzi5xte8UPjCJ8hWs0Jn5
5bIEruXFUpfyTNU1srezxMs0b+I50FW3lohwbEGD/hNp/d0Cb5iVsrxcwfBr
4D4MOn91fkBjpdUsEkstX6lqKc9r0DFVxgN+hGRaPri//3h8/+n4/iO+CuKS
6Ap17ECenJ6dy7MPL+T+0/vjR0LgVb+cGI/HUs1AGFVUC3GYSRBgUA84C6lt
vdTyKJDVw8Wi1As6K+p4nUd5Koeg3HsyqUC+dZTME3iuXqpaqDQFOaI5kH0S
VG+eLBpWDVnncqZlYQ0FDErYgkzMtlZJHKdaiDvAsbrM4yYilRIXuKfDMxzK
63/69B/w9zen46MJSw5S2EnO/d/d3EidqVmqYYdMSuWPIfK5VHC9lvCj1EVe
1vAYGpwaDzzbAEsT0LdqIi+WcEZYNdJVhceN4LIu4SEFigeWT4kBnnNAp5ex
hpurJNPVSKpVDvqZ1yg69RJ0Fa4hWaJyU9T5olTFMolkFS1BtZEwTaWR/AKf
MVsGUSmamkk3VPIHYPE8wUPt5M9JkzHFgD4/HB2ehAQqgUDRvFyMr2M1B9G5
udkbyWW+dhQAAZZgrUAELW/qXMxUDVvE88BpC2Oe4ClQDzgrki1aSsUch5Mn
q2Ylq+QXjaTVCu7RBBP5QsPhgAuCxQIUFiRBf4SDwhlGMqmRuplGOqtygwSZ
J2VVe2GhFQxfRsIeOi/N1l7maaoj+Fuuwd44AbxbtUVwwrIU4V5QoIz4Rky+
OAd5yXJk5By4CEKy0hFYiqRakWoUoYvD6auJIAkBr9aghYaBVQSMgWnCsXA1
WSBJ6VhpigJRyYUqJvIUCA/eRM61qoHnIqlYlHq0ByVRl6jKMBPKRgosSDdW
h0byOlHy1cXFGXD0rw1YY7HUKgYm0aFhNLBsmSMXdQW7ZZ7pjyBKOouIYUqm
+QKIkUqSaskWdyCH6xJVIwNGi8GhuQiCrUGwdLkn18uclEMVJJ0wU9FUKPPt
E1R4fqdah2kqAkHCPSclq1+crzMQcK1WoMUoj7DZIe42YHub63sovQLOkcck
uXA3NGuJTmPclpehu5WRe9RxOAmJXw4SCMNRDfOmHudzhjdEi7xEPagNL2a6
XmsgyGuiMO3llU6BPazlJUv7SqGTFirOCxoFO0ChA4+e6NKIot8lypEVFCfE
FdCH7QGAlJYSIqpJYm1Jm8/JdDjJtqaSzieZaXzIWiINSySUQjkFTFTVZMCT
MiYLAGjttEZRTLIIkRQINuwPbLs3wGQooqRQwEtk6zUap80Owy8A+1QazIMy
9rX2W8IjAXnGQHCZMIcCqUCbFGu9IqZWzRxUFbknWBuJEKBDmdlOA04YzAGS
GwcTw+EUnsTVMm9SpwG4mPCUAXuu2f2pGI6DdojNB3iilFaZg8ccyTUyDexG
TXIGxFTpGNBgGgvApGm+QUPwj7+zFvtzrtQGTV6CaotPMCHA0Fq5DGUbBNCJ
NsjJCVAuTTfsQFp+0GiNt3JkmVCsrN6QJCl5rQAfgASBmCjgRW3MDNIXJQJ5
NrbGcCTBs9At2C2oCPCYzB+IP+h3QpotWI3Gftcjr42tq8hg/3dwS5Q6ZeFd
JgX5WgC9KHJpEyNQ+Yok100KvHh19v0xuv73Jy9/B9gGnHzbQoIP9eIVkBP8
GOCyjFyvAwKgVks4I1rHr+RhBsrFdHGGCI+MFhBJiQ4CKBtaV2dWvfG37oMJ
ufmM/6Dj8qLPUBOTrF+Dn9lH0T+z5MYGStnjw4XAYMHG3ua1Zg6vtbMURBeE
Bayt1uuh+zF44eZmFBJRtIkYkM5ghpHZh2oLEJ/KoCdLHmGhYkWoAwbClgCS
so6SD0SCQ+gBYREbkXmZr+AKHHpMvIrREpa6Hok1gKcl6h84TfaMX0iYOyBQ
2TWyFI0myuYR+nrCPBVbZNwKRneVHLz5cH6B8SX+X759R7/fH//hw+n74yP8
ff7q8PVr90OYJ85fvfvw+sj/8iNfvnvz5vjtEQ+Gq7J1SQzeHP40YI0ZvDu7
OH339vD1gE7ZkjMUBD5mgmgUjl6TLRcWfZAHfPHy7B9/339k9OXB/j6CYv7j
6f5/PYI/1iDavFqeAY7gP4HtGwFBkVYl2Tcw+uDXkxoC7xFKKZjQdUbOHxXn
T0iZPx/Ir2dRsf/oubmAB25dtDRrXSSada90BjMRey71LOOo2bq+Ren2fg9/
av1t6R5c/PrbFNHgeP/pt8/FttKDulTeU0eBcJHJLEv4L5iAmHIAQD+OXG5u
0KEAMohJ8kZbHCaPFfO8ZA/aOBW0E0caUz/PMehCm8yrYYqgAvv5q7yAX9L8
+xUEHaWDkchv++9X8evBOPjX/uu3/QdrgVxeqzSJKe30K9juwNgDrSvEE6z4
1rcmWYy00wbLqUq2VOXTp9AyjxWlHkBBfmWDgEFdxXaRaQ1z5pXensPy9SLk
CSDKtZkAESpOAqy56ECkA3FAA7M8G7ORC2EQYXPc1MSMtbkQHkTOfmNjUAxd
KvN8T/xzh4ZcmOSKPHbg6NOd2JnCGz65jXwR0Ye+iycHC7QAVEaGI4Q6Adrz
qQDRSQXUoXcnM0QBYwumAyz4EWdX5m8w9VWDp8tEA1hLxdYb2wkNIB92WXyu
KTSWjyYPcQ3m1h6GnsJgjsoEDuTlOXbalclIapYHWNWk/hhN2pjiR3SRcxyf
s2pbSsK+TGyFGLNOKs7suQAZfXWzMqptphuFJwOpsBanvSUkYAxWAs8BHOHE
Q07YOsmeAbYWAE1GYWTM4TeOXaqU8Mw7HLWGTY0sFjerErThqShYd7sPcj2G
AyYOErEHo0HuxUPXYciSRwFLOoA+5NAufnQYZ/MP4do/5zNh5YVTXSbSduQn
Nmk0raPgMHLV4AhOSCD9iTm7yN9Pffl56l/knq5WxWCOpMbAXyOU9mobxF/S
EUeZw4tBKz1rYwB7dHg+wcy55Rgt5LbDBgwMbENBMZ50isu+pONOJcTATYS5
CmNqACxqsHUjDIqACCZxRLv+8P71uFJzkKYmK8Bjwb0XqtLiySMEkJjjzkx6
S4WZxFBdK/mYSPtw8oBEBNDLoyePnoKdFeJvf/ub4N3IT5QFvfcViM48d97S
IErm8Ff3OHdbKKACXbvExOjX+5PJg788He8/fybsJEboD89OwbTGRZ4g6Krc
eWF/OxOPbp0PZSpTmudSOe90aafzaxkJ+5fXWtI8t6/FyMUlKYn5QAzMtyFS
QGpRug5gdmpUk/IfS85sgzAVKJ3aBo+ADU1+0KgTygsKE+nLUl3rbbLTapes
OUz5/Sct0l8kgKKaAkWTMb7xAwR6KbvMVtdYf2te2TfiHEf/DOFoNRIFEN6E
Ndnv5ahNKYqciFBIFJRvPkfgqLePi6nWvtPeSK9Rz0iO2d02ZYHAAgS9pXJJ
xeESJyXTNIQGPox3yVPMX4X5ABUCJEw5BhaDkpGaM2SVjeaqKo8SgktsOQRr
EJhlC1it6QiAlxU3CBNW6iMlglmYWMKivMlqijaEsTeW4GwVvVnxm8ssHadO
XacmmUfHTirhVB3DU+kTMBN5gnv6qDDfYuC1yTorXIsqcgwQrLMNqB/IFDHG
biMUX7sTC7hsbsYet5OYqHOxaNA/bOkYJ4Exz8QAx5OCEnQMJRHQd+zdkUNT
IMeXYFAjQmjP6GYDvNh/gry4pAUv7eYbNAn2iYcPMG1vnsDEPd/6Az5L4QOP
QrHnO7xtOaQnWEAn/pk9szP8Fyl0lLgzClPBoxzI41VRb561H5knH3VMax+E
u3L79ru6Qc0JFg5UJ9XZAkQVaADTWQy5xS+sAZfWeNH9YK7AsQkjKODOKZ2s
MSEBHhyuNhkQOV9ksKWYcmqKWYaZ58aUhobJRE9GBFGzMN3nLe2eEau2nlDZ
BO3o1FNkakYlhL6AtwozkXN7MpwMzYNoDUHzNG3Tj2zI/VGory4XGhZYCKmj
0mPw1LO9NFklCG/JNK+0Av9scB4/RHEZ53xb+O7J5PHkgXHhFngHe3GZM/Al
0ZWYAjeHf9yTX3+zJQbTEYIrsBHTP04NOOnW8SK0g1jD3QiXsDKgBJ/nghQz
YBoY6GlLk9v6a+SJPECS2VpdaCa2VNjrrRyiELFlZCfWcu4u8bZnFFxnQPFP
xt8m+UNW2OH9j/fNv71RcBNiBX9rf/vW5bWO/O0HrdtLLGwvwI34Bx7aB/IC
cPe+ubHv1xw++MvDB+P9PdDCH4BwF2QU2ibJWMq46HF75FSPTY0mTuYQH2Hk
qtK+wqJxpHYddqVdM4T3jRVyT3SMUEDIA3cH//WZI0e99qNolp7yEWYQABl7
YwQDnl6h1plNd+dCTnTne/jgGc7Xnuua4+FgqluXpyCnZ/2tNVo1WdB5+Bkt
m+xqx5addOzcNLfY4JSzJrrCxPlvsThLXnfR/SfPukdPsgKslHHmZipyEV4o
PushWgag6yD8TP/3/gHtAHqGQ4ztOPdtjY7PrHsNMaCmDze1yw6iV9WGR2d7
HOpZcON0dkqWTGFqp5Vf9Gt1bRU3LOl4CLYCOfXe/M12EqJOHG8QlhOVLM/0
cN8Zl8eP0bIcFW/s7reNS3ALLczKPxeahKPCGITwkY5NwLVbeIQkx441cvNc
vjs7fitPz88/HGOfEXlM4AWgZnSQPl9GkN0OntKhkft5U7UMHUxo6e92xlWI
MIY415rb4+DxP9GPPw9tW5Xppory1b2drVnBgmOz3B5tKU6qqKGmusltOhEI
Qlcj/CG95IE+iN9eH47OPJEsYtqiOMZvgAmmFgjjbwiGp1zVmDoUO20nbhNq
kOF0rRB37kCkB2Sy2SpKsJ4eyU93MBlHh6RcyjiJb4SgdGRThQ9TQsYVmX2S
ByfBsIPaePrAPEc1sfxGnr86HD94/GRIV5j4eyyCBu8ENxzy2ZWW2Vlsnwjb
IOQW3DNopQVJzl+d91KG8M8PYe3we6wd3qGOIu4AGF/pjaWS6rZH+Po3n8Dm
qKZhH0RmEViNrZWY+xY+HUgxlo/zuGAlTUHIkJp9MlcMe+udwsGuTi2AjaqJ
zFjoWl0nW0VYTHKYfq10A4dAeV0gr7tVy7CnhC1v6Ph5Vcz7UwUN1AmCoNkG
TOcEyIjpZthnxmVdjHv5WWDvlAl/Cce6RN2Ywq5xwPSH4/enJz9dfn/80+X5
6f8cT/143YEcW+Vg2weINBK+eDLb1eAxkUM0WoaqI2mB/2MQoz0mYn/d2RRV
gjz7rQrjjwo68+r7o5PxMSUdh2TBzQVqbBw6a29F7LJSKYgLNhHjL3d/i3wj
uH/6/Ru6bTyTUdNRCErgKWpoxp9bhB6Z+69FV4XdRqbc7sNKx2kXJIFRS6xi
Oe7kUa0tzNnO7JKZM/ub9qly14TdTFybYCVaJNtjRQ3Iutcfsbw/efn46ZPf
4VQvchCjuZuPmkZgRYXexyWQzKnYorwMM1NsbD/d6au/CXEGHpTS6C7bTTCC
2m7wkZFDlJ2mJE5Bulwnlj86JvOWriSD8HwbAStssAC2R1UqIeYNIDaHXQ1a
CXVTQOEmh9g5hGGltejlyx6WesG0FHnGqTiF5fcSTOgm7Gcw3WihlxHUvRR4
WpO1LW1NqT0t1yQ5u3XYT703hz/xqcBmDXz5EQ4FmrjPxNg+2RfvnvuLXLoB
EVkr2r6FLy5RsKJ0g+tgTLj5e7vWaXbKRunojF4R6MvPkS52usxk2GVGkx36
1twsMzYOqzzYxVXKWe5Nal9iFHOggB9x+zPKqLuGKh37zRI502SuMXXGqd9c
pnm2uIVb6DEMt6zc0TRYDKdEK5bDS7yV+DYlUTUF5kyQU1sFcodG5VBPFgDO
LAU9IgtoGaa0Zho8ImptEO51NxyWIYjFtmQGA6kdDZtQWKlYYo20gvk4501T
Nxa2g70MGVnJU/9iCG4B1b0C+7IsrvSYeT7O8gDOnWYIKEauzEANoLDkVUZo
UfMinWwQHS3g8Yw0DbxyRm0ZJhll3GJ3nxAe2VKcbxzYk6/yNWBnrHiihYOr
QUchQ3DDsmon9kTYbWvltlFtq5XLNtK1D9Vqm2Z19l44REj9xquNerHZkcU8
1H0D7AKybbCXa6Yj1XBNNbxHsS02S69VUtt3isJi80z7cikJkTJNiVxKXcGo
hTJ4ifsGRiYqCVZZ2wZWqwwhYUVI2NqBzGWOQQSXp3ooWYdlXN/xLJK2aAb0
opoMmlzEvEnW6HBDgJqJzLRUu+jMZTfzjgFJuqsG7WyAC4o4bWnBJL013dtV
aOws3yFxwhMG26xs66ND9wRMvD2hXhEjmDas6B7MdP616lbUu8dbfWGMjBAf
wN3AdJHmIEW1HbzLobD3GAWNJT2tEoHBcbz5wk4hyskHk8NMFcJ9EhuyzqgN
qq71qqiD8qVNWoeiPdlOOwDHKGMBMmMapUdyTZ4kIQ0D3Zk3KYmMIb7pr+TZ
YTbOU+cBKb4V4h02/VOg5ffMWXILrpLadC0vMOdNOw6M29amj9EibvXktHos
mA6BZuyIJMCLeL2TLnkexoo2Qsop0eEMy9QNq6au51+QV+4EomAEp2epSijG
PMVE4jnGatNWldPgSz7wXU71CzBvdv1dJnIH7jY1h76Yl8rKQUTQiXyCVJsd
P7z/cT73ufknjx8/pASa6+ji/LxLgPrVYlUr3CYfjCNlrjx1afyLLnMTLnp8
YrSV0Empsgqn8VhtK0bhnhR8xeuO5YNXYPDoH1ho7LtlPUrdbZiyrcGsb73d
SiHCqcPjk2Cv0bMkiwzxMdkg3zrU7T+iyUWQ0uGXKCzcJruSOVVXM7vkljqg
ixWDEKijsRp8tu9q9ym4JcnYlcpESpUWPVwIe6MKtcGNkdXCAeRdVYIdvu1D
8I5Nu+UbbC9YaNzvW9gGPUv1uiA96Gi0nTPYIsXKtI2EdLXxhLPaXmDNhrfb
hPqhiDPGbuJW0GC4FRDZH5hKn7KXRRf+eRrf32r3Gf8hbvMfibHBLb/xGWEK
OmEH/y7H4d5Gya0HMXTxrbdtKrCkmBfWquAwrhlPYXtto1I4wpFvGzQnnlN3
WUsv3NtbxnY5DpumMoCCO83sqMv2z9I3EH0wWIfuNQhvs37ckinjTWXbnRqg
5F582JEWE23H2fUu2wlX03XcOpg1lyLEzLXvaYSJMNjY3N4W2BXgoEn4xmZ0
qIk3oAZuxrf2rpLF0nTuAjEi83QIEoyJD98MNm+gdBEnVSitvpl0ULBjst6m
3afSYeusYNm3EZ7n/PaOdhkBbkU2EbSocvvaKrer1a0zkxbV2LlhXimCiTsK
esFZ3xVmyyJ6v1itr9aqjEfmldpS36XXEtfK52StEcphsphTH01SLd0riW4P
Fb2X2es8TIIor8xLQnGe3a3bRm4XWnNis/UelRcj5DN1OwXC1hXhbTGyT96C
7XfBAE+VkTX9ZrJeINAbNncRwW7/Kfg1TG7oxkfD96K2DFo/lgj3J1pgInRc
fV6guxRJK7350YctZBdamLVbqYQWKYTpgg7bWOgtRAAbrbboDvBwjtrEt7tp
OBGntupR68Kij2DuLRQid6KQYMzn0YiJFPrRiAjHdNBIK7L8kjQ7ntA1fe86
VR/U6Jzr3441djXNtzjx/wM6Qna3IMW26o2YhWHtUuwsdH25nz2hd1U2ooU/
jBE1IMQ0YuyucHJXLRhS7D4QRme6crJS5ZU5GudpK/vmU0vpzbXLldEMMu6l
/pneUK7NO4/WL/1rqRM3DQceRi7FPyWXn8uh+Defe0T0n0qjBKaPoKrFptuH
wcwbJznwvQWCKVuQoHKf5mCIcREYCnrNj9MELIA2cv6cBRFfRpU2ltrllrvT
bTnY01Zc2a4H9QIgkM+udWKZG4kuAT3a2Z6NPhLRyuIqbBo1NRqXHbgj7beY
MFcefNpg+43LpQpeuPySTyOo4EVKTKq3XqbseOig6NN5edpUoTj5TN8LEOb7
ANbjuU8HcJ99FZThWh9T2PUhBRF8SKGnK9JX4rji4DHwdmq3H+m0PjIBx1hh
BkxhKiifNVWdIaKh9h3M04rgyKukotIOfgqGk/MrTS0PcCOskvbDHZsCb38L
oOLuCSo/EZkrap+9TvTaJch7k4QcwovQSwUdwATkEFCYF9DxUysNkDCrtc9H
zBKu1ASJeMzsDTtK2119z3sr8wkBDlxinp2y2eZjAyRfJ02JQrACdo0MXzFI
5U+u3JINzALbL9jPcMd166189jyyCyJ7mE+UCRId0zammo46trr9kl7rzUmm
LmBFlJeaug5hroh63ozQEBG3Xhxd5bH5XpQJSblKiF8d4U1xOYNOOjJFFqzG
47tU+Dg6fZiWaj5WQRx7qXBmEbLANp20G3X9SK+OzLecwLZoUkgEk5Uwa9gc
/7wtDN/KI21ZbVvqSfawWOsJEuXw0wqqrTVyXBy4swJ2g+1LrcLH3Upg9XeM
5VIAy3kJnEI560/IQyy5wW/lwKIK7TsaM10uVYHLpSnawz38/hVHjlFtPmOE
Hf2pKZX5ryAlIFE1fmFoVSj7qPs+xBLC9KoW9pNMrrLsUjBAmQxbEPP5+Bw/
ZgcCXyb4VQfjpQNqo6VZVTq9ps9xPJcX747eHcjzZrEgeM6VPFfwwl1O5Jk5
1tZUvoKrIa7AxhbkGZwYYSZRh49B3r5W9PrThkpmQerqW3RH7wrjQeChrkfS
Lg+/w7pWuQ9E2oJFxLXbRI5q6rECC9LgfjoGp5JOAPBFVV8t7T6K74IERVEM
1kNo0gp/RiHM545Jct2t13Qr9vXBi+DsccaJfeU1wNgWEuENn9jaENLmjhrQ
yXHZZFaj5ummg5+81TahAhUpwZuA2Lumc3S74PhLSlcRP5GD/Fkeaqag6pbq
/zLAuJ2X4/gXR7pmkHYEie12HCwDSZusTlIUdu6rqDour2Od84LfDzfNhQKE
MLMQH0umtnHDplM37BatOBI0Oj18e9gRwuc4/HgY/cxfGdyTx2iJG4yTALnc
BVtPE9HYLUg0NOejTA6Y1goDLx7j8mMQ92PQTPjQFOH2qHNnra1Ftl9vmaUq
Y8XO8vWEv+U3Q83j763wt+pQzz8dMAt1/M1grtJKD27wHC/PDuSHLLX5lLxE
wEUYQ6HbACkYeSCm0mKpZiCmv/jP6ODnGtF0/HeTbcCqIzoIvvz4M16N/Kce
hThvgAvy9+A0VPhgtcArD8Inf58AuxJ5pgDVhY8u6Polpj1U+PwbcFhKp/I8
wm7ncMSqokvhw983aFwuVLpWZfjoVU2XwkfDT1Eegr3O81gEX56M1Po7gNIF
kGQGIHyS6Vr8LyXXi2erVQAA

-->

</rfc>
