<?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-rfc2629 version 1.4.19 -->
<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-quic-ack-frequency-00" category="std" consensus="true" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.9.1 -->
  <front>
    <title>QUIC Acknowledgement Frequency</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-quic-ack-frequency-00"/>
    <author initials="J." surname="Iyengar" fullname="Jana Iyengar">
      <organization>Fastly</organization>
      <address>
        <email>jri.ietf@gmail.com</email>
      </address>
    </author>
    <author initials="I." surname="Swett" fullname="Ian Swett">
      <organization>Google</organization>
      <address>
        <email>ian.swett@google.com</email>
      </address>
    </author>
    <date/>
    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    <abstract>
      <t>This document describes a QUIC extension for an endpoint to control its peer's
delaying of acknowledgements.</t>
    </abstract>
    <note>
      <name>Note to Readers</name>
      <t>Discussion of this draft takes place on the QUIC working group mailing list
(quic@ietf.org), which is archived at
<eref target="https://mailarchive.ietf.org/arch/search/?email_list=quic">https://mailarchive.ietf.org/arch/search/?email_list=quic</eref>. Source
code and issues list for this draft can be found at
<eref target="https://github.com/quicwg/ack-frequency">https://github.com/quicwg/ack-frequency</eref>.</t>
      <t>Working Group information can be found at <eref target="https://github.com/quicwg">https://github.com/quicwg</eref>;</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="default">
      <name>Introduction</name>
      <t>This document describes a QUIC extension for an endpoint to control its peer's
delaying of acknowledgements.</t>
      <section anchor="terms-and-definitions" numbered="true" toc="default">
        <name>Terms and Definitions</name>
        <t>The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in BCP 14 <xref target="RFC2119" format="default"/> <xref target="RFC8174" format="default"/>
when, and only when, they appear in all capitals, as shown here.</t>
        <t>In the rest of this document, "sender" refers to a QUIC data sender (and
acknowledgement receiver). Similarly, "receiver" refers to a QUIC data receiver
(and acknowledgement sender).</t>
        <t>An "acknowledgement packet" refers to a QUIC packet that contains only an ACK
frame.</t>
        <t>This document uses terms, definitions, and notational conventions described in
Section 1.2 and Section 1.3 of <xref target="QUIC-TRANSPORT" format="default"/>.</t>
      </section>
    </section>
    <section anchor="motivation" numbered="true" toc="default">
      <name>Motivation</name>
      <t>A receiver acknowledges received packets, but it can delay sending these
acknowledgements. The delaying of acknowledgements can impact connection
throughput, loss detection and congestion controller performance at a data
sender, and CPU utilization at both a data sender and a data receiver.</t>
      <t>Reducing the frequency of acknowledgement packets can improve connection and
endpoint performance in the following ways:</t>
      <ul spacing="normal">
        <li>Sending UDP packets can be noticeably CPU intensive on some
platforms. Reducing the number of packets that only contain acknowledgements
can therefore reduce the amount of CPU consumed at a data receiver. Experience
shows that this cost reduction can be significant for high bandwidth
connections.</li>
        <li>Similarly, receiving and processing UDP packets can also be CPU intensive, and
reducing acknowledgement frequency reduces this cost at a data sender.</li>
        <li>Severely asymmetric link technologies, such as DOCSIS, LTE, and satellite
links, connection throughput in the data direction becomes constrained when
the reverse bandwidth is filled by acknowledgment packets. When traversing
such links, reducing the number of acknowledgments allows connection
throughput to scale much further.</li>
      </ul>
      <t>As discussed in <xref target="implementation" format="default"/> however, there are undesirable consequences
to congestion control and loss recovery if a receiver uniltaerally reduces the
acknowledgment frequency. A sender's constraints on the acknowledgement
frequency need to be taken into account to maximize congestion controller and
loss recovery performance.</t>
      <t><xref target="QUIC-TRANSPORT" format="default"/> currently specifies a simple delayed acknowledgement
mechanism that a receiver can use: send an acknowledgement for every other
packet, and for every packet when reordering is observed. This simple mechanism
does not allow a sender to signal its constraints. This extension provides a
mechanism to solve this problem.</t>
    </section>
    <section anchor="negotiating-extension-use" numbered="true" toc="default">
      <name>Negotiating Extension Use</name>
      <t>Endpoints advertise their support of the extension described in this document by
sending the following transport parameter (Section 7.2 of <xref target="QUIC-TRANSPORT" format="default"/>):</t>
      <dl>
        <dt>
min_ack_delay (0xff02de1a):  </dt>
        <dd>
          <t>A variable-length integer representing the minimum amount of time in
microseconds by which the endpoint can delay an acknowledgement. Values of
2^24 or greater are invalid, and receipt of these values MUST be treated as
a connection error of type TRANSPORT_PARAMETER_ERROR.</t>
        </dd>
      </dl>
      <t>An endpoint's min_ack_delay MUST NOT be greater than its max_ack_delay.
Endpoints that support this extension MUST treat receipt of a min_ack_delay that
is greater than the received max_ack_delay as a connection error of type
TRANSPORT_PARAMETER_ERROR. Note that while the endpoint's max_ack_delay
transport parameter is in milliseconds (Section 18.2 of <xref target="QUIC-TRANSPORT" format="default"/>),
min_ack_delay is specified in microseconds.</t>
      <t>The min_ack_delay transport parameter is a unilateral indication of support for
receiving ACK_FREQUENCY frames.  If an endpoint sends the transport parameter,
the peer is allowed to send ACK_FREQUENCY frames independent of whether it also
sends the min_ack_delay transport parameter or not.</t>
      <t>This Transport Parameter is encoded as per Section 18 of <xref target="QUIC-TRANSPORT" format="default"/>.</t>
    </section>
    <section anchor="ackfrequency-frame" numbered="true" toc="default">
      <name>ACK_FREQUENCY Frame</name>
      <t>Delaying acknowledgements as much as possible reduces both work done by the
endpoints and network load. An endpoint's loss detection and congestion control
mechanisms however need to be tolerant of this delay at the peer. An endpoint
signals the frequency it wants to receive ACK frames to its peer using an
ACK_FREQUENCY frame, shown below:</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            0xaf (i)                         ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Sequence Number (i)                    ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                  ACK-eliciting threshold (i)                ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Update Max Ack Delay (i)                 ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Ignore Order (8)|
+-+-+-+-+-+-+-+-+-+
]]></artwork>
      <t>Following the common frame format described in Section 12.4 of
<xref target="QUIC-TRANSPORT" format="default"/>, ACK_FREQUENCY frames have a type of 0xaf, and contain the
following fields:</t>
      <dl>
        <dt>
Sequence Number:  </dt>
        <dd>
          <t>A variable-length integer representing the sequence number assigned to the
ACK_FREQUENCY frame by the sender to allow receivers to ignore obsolete
frames, see <xref target="multiple-frames" format="default"/>.</t>
        </dd>
        <dt>
ACK-eliciting threshold:  </dt>
        <dd>
          <t>A variable-length integer representing the maximum number of ack-eliciting
packets after which the receiver sends an acknowledgement. A value of 1 will
result in an acknowledgement being sent for every ack-eliciting packet
received. A value of 0 is invalid. Receipt of an invalid value MUST be
treated as a connection error of type FRAME_ENCODING_ERROR.</t>
        </dd>
        <dt>
Update Max Ack Delay:  </dt>
        <dd>
          <t>A variable-length integer representing an update to the peer's <tt>max_ack_delay</tt>
transport parameter (Section 18.2 of <xref target="QUIC-TRANSPORT" format="default"/>). The value of this
field is in microseconds. Any value smaller than the <tt>min_ack_delay</tt>
advertised by this endpoint is invalid. Receipt of an invalid value MUST be
treated as a connection error of type PROTOCOL_VIOLATION.</t>
        </dd>
        <dt>
Ignore Order:  </dt>
        <dd>
          <t>An 8-bit field representing a boolean truth value. This field MUST have the
value 0x00 (representing <tt>false</tt>) or 0x01 (representing <tt>true</tt>). This field
can be set to <tt>true</tt> by an endpoint that does not wish to receive an immediate
acknowledgement when the peer observes reordering (<xref target="reordering" format="default"/>). Receipt
of any other value MUST be treated as a connection error of type
FRAME_ENCODING_ERROR.</t>
        </dd>
      </dl>
      <t>ACK_FREQUENCY frames are ack-eliciting. However, their loss does not require
retransmission if an ACK_FREQUENCY frame with a larger Sequence Number value
has been sent.</t>
      <t>An endpoint MAY send ACK_FREQUENCY frames multiple times during a connection and
with different values.</t>
      <t>An endpoint will have committed a <tt>max_ack_delay</tt> value to the peer, which
specifies the maximum amount of time by which the endpoint will delay sending
acknowledgments. When the endpoint receives an ACK_FREQUENCY frame, it MUST
update this maximum time to the value proposed by the peer in the Update Max Ack
Delay field.</t>
    </section>
    <section anchor="multiple-frames" numbered="true" toc="default">
      <name>Multiple ACK_FREQUENCY Frames</name>
      <t>An endpoint can send multiple ACK_FREQUENCY frames, and each one of them can
have different values in all fields. An endpoint MUST use a sequence number of 0
for the first ACK_FREQUENCY frame it constructs and sends, and a strictly
increasing value thereafter.</t>
      <t>An endpoint MUST allow reordered ACK_FREQUENCY frames to be received and
processed, see Section 13.3 of <xref target="QUIC-TRANSPORT" format="default"/>.</t>
      <t>On the first received ACK_FREQUENCY frame in a connection, an endpoint MUST
immediately record all values from the frame. The sequence number of the frame
is recorded as the largest seen sequence number. The new ACK-eliciting Threshold
and Update Max Ack Delay values MUST be immediately used for delaying
acknowledgements; see <xref target="sending" format="default"/>.</t>
      <t>On a subsequently received ACK_FREQUENCY frame, the endpoint MUST check if this
frame is more recent than any previous ones, as follows:</t>
      <ul spacing="normal">
        <li>If the frame's sequence number is not greater than the largest one seen so
far, the endpoint MUST ignore this frame.</li>
        <li>If the frame's sequence number is greater than the largest one seen so far,
the endpoint MUST immediately replace old recorded state with values received
in this frame. The endpoint MUST start using the new values immediately for
delaying acknowledgements; see <xref target="sending" format="default"/>. The endpoint MUST also replace the
recorded sequence number.</li>
      </ul>
    </section>
    <section anchor="sending" numbered="true" toc="default">
      <name>Sending Acknowledgments</name>
      <t>Prior to receiving an ACK_FREQUENCY frame, endpoints send acknowledgements as
specified in Section 13.2.1 of <xref target="QUIC-TRANSPORT" format="default"/>.</t>
      <t>On receiving an ACK_FREQUENCY frame and updating its recorded <tt>max_ack_delay</tt>
and <tt>ACK-eliciting threshold</tt> values (<xref target="multiple-frames" format="default"/>), the endpoint MUST send an
acknowledgement when one of the following conditions are met:</t>
      <ul spacing="normal">
        <li>Since the last acknowledgement was sent, the number of received ack-eliciting
packets is greater than or equal to the recorded <tt>ACK-eliciting threshold</tt>.</li>
        <li>Since the last acknowledgement was sent, <tt>max_ack_delay</tt> amount of time has
passed.</li>
      </ul>
      <t><xref target="reordering" format="default"/>, <xref target="congestion" format="default"/>, and <xref target="batch" format="default"/> describe exceptions to this
strategy.</t>
      <t>An endpoint is expected to bundle acknowledgements when possible. Every time an
acknowledgement is sent, bundled or otherwise, all counters and timers related
to delaying of acknowledgments are reset.</t>
      <section anchor="reordering" numbered="true" toc="default">
        <name>Response to Reordering</name>
        <t>As specified in Section 13.2.1 of <xref target="QUIC-TRANSPORT" format="default"/>, endpoints are expected to
send an acknowledgement immediately on receiving a reordered ack-eliciting
packet. This extension modifies this behavior.</t>
        <t>If the endpoint has not yet received an ACK_FREQUENCY frame, or if the most
recent frame received from the peer has an <tt>Ignore Order</tt> value of <tt>false</tt>
(0x00), the endpoint MUST immediately acknowledge any subsequent packets that
are received out of order.</t>
        <t>If the most recent ACK_FREQUENCY frame received from the peer has an <tt>Ignore
Order</tt> value of <tt>true</tt> (0x01), the endpoint does not make this exception. That
is, the endpoint MUST NOT send an immediate acknowledgement in response to
packets received out of order, and instead continues to use the peer's
<tt>ACK-eliciting threshold</tt> and <tt>max_ack_delay</tt> thresholds for sending
acknowledgements.</t>
      </section>
      <section anchor="congestion" numbered="true" toc="default">
        <name>Expediting Congestion Signals</name>
        <t>As specified in Section 13.2.1 of <xref target="QUIC-TRANSPORT" format="default"/>, an endpoint SHOULD
immediately acknowledge packets marked with the ECN Congestion Experienced (CE)
codepoint in the IP header. Doing so reduces the peer's response time to
congestion events.</t>
      </section>
      <section anchor="batch" numbered="true" toc="default">
        <name>Batch Processing of Packets</name>
        <t>For performance reasons, an endpoint can receive incoming packets from the
underlying platform in a batch of multiple packets. This batch can contain
enough packets to cause multiple acknowledgements to be sent.</t>
        <t>To avoid sending multiple acknowledgements in rapid succession, an endpoint MAY
process all packets in a batch before determining whether a threshold has been
met and an acknowledgement is to be sent in response.</t>
      </section>
    </section>
    <section anchor="computation-of-probe-timeout-period" numbered="true" toc="default">
      <name>Computation of Probe Timeout Period</name>
      <t>On sending an update to the peer's <tt>max_ack_delay</tt>, an endpoint can use this new
value in later computations of its Probe Timeout (PTO) period; see Section 5.2.1
of <xref target="QUIC-RECOVERY" format="default"/>. The endpoint MUST however wait until the ACK_FREQUENCY
frame that carries this new value is acknowledged by the peer.</t>
      <t>Until the frame is acknowledged, the endpoint MUST use the greater of the
current <tt>max_ack_delay</tt> and the value that is in flight when computing the PTO
period. Doing so avoids spurious PTOs that can be caused by an update that
increases the peer's <tt>max_ack_delay</tt>.</t>
      <t>While it is expected that endpoints will have only one ACK_FREQUENCY frame in
flight at any given time, this extension does not prohibit having more than one
in flight. Generally, when using <tt>max_ack_delay</tt> for PTO computations, endpoints
MUST use the maximum of the current value and all those in flight.</t>
    </section>
    <section anchor="implementation" numbered="true" toc="default">
      <name>Implementation Considerations</name>
      <t>There are tradeoffs inherent in a sender sending an ACK_FREQUENCY frame to the
receiver.  As such it is recommended that implementers experiment with different
strategies and find those which best suit their applications and congestion
controllers.  There are, however, noteworthy considerations when devising
strategies for sending ACK_FREQUENCY frames.</t>
      <section anchor="loss" numbered="true" toc="default">
        <name>Loss Detection</name>
        <t>A sender relies on receipt of acknowledgements to determine the amount of data
in flight and to detect losses, e.g. when packets experience reordering, see
<xref target="QUIC-RECOVERY" format="default"/>.  Consequently, how often a receiver sends acknowledgments
determines how long it takes for losses to be detected at the sender.</t>
      </section>
      <section anchor="new-connections" numbered="true" toc="default">
        <name>New Connections</name>
        <t>Many congestion control algorithms have a startup mechanism during the beginning
phases of a connection.  It is typical that in this period the congestion
controller will quickly increase the amount of data in the network until it is
signalled to stop.  While the mechanism used to achieve this increase varies,
acknowledgments by the peer are generally critical during this phase to drive
the congestion controller's machinery.  A sender can send ACK_FREQUENCY frames
while its congestion controller is in this state, ensuring that the receiver
will send acknowledgments at a rate which is optimal for the the sender's
congestion controller.</t>
      </section>
      <section anchor="window" numbered="true" toc="default">
        <name>Window-based Congestion Controllers</name>
        <t>Congestion controllers that are purely window-based and strictly adherent to
packet conservation, such as the one defined in <xref target="QUIC-RECOVERY" format="default"/>, rely on
receipt of acknowledgments to move the congestion window forward and send
additional data into the network.  Such controllers will suffer degraded
performance if acknowledgments are delayed excessively.  Similarly, if these
controllers rely on the timing of peer acknowledgments (an "ACK clock"),
delaying acknowledgments will cause undesirable bursts of data into the network.</t>
      </section>
    </section>
    <section anchor="security-considerations" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>TBD.</t>
    </section>
    <section anchor="iana" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>TBD.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>Normative References</name>
      <reference anchor="QUIC-TRANSPORT">
        <front>
          <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
          <author initials="J." surname="Iyengar" fullname="Jana Iyengar" role="editor">
            <organization>Fastly</organization>
          </author>
          <author initials="M." surname="Thomson" fullname="Martin Thomson" role="editor">
            <organization>Mozilla</organization>
          </author>
          <date year="2021" month="May"/>
        </front>
        <seriesInfo name="RFC" value="9000"/>
        <seriesInfo name="DOI" value="10.17487/RFC9000"/>
      </reference>
      <reference anchor="QUIC-RECOVERY">
        <front>
          <title>QUIC Loss Detection and Congestion Control</title>
          <author initials="J." surname="Iyengar" fullname="Jana Iyengar" role="editor">
            <organization>Fastly</organization>
          </author>
          <author initials="I." surname="Swett" fullname="Ian Swett" role="editor">
            <organization>Google</organization>
          </author>
          <date year="2021" month="May"/>
        </front>
        <seriesInfo name="RFC" value="9002"/>
        <seriesInfo name="DOI" value="10.17487/RFC9002"/>
      </reference>
      <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner">
            <organization/>
          </author>
          <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" target="https://www.rfc-editor.org/info/rfc8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba">
            <organization/>
          </author>
          <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>
    </references>
    <section anchor="change-log" numbered="true" toc="default">
      <name>Change Log</name>
      <ul empty="true" spacing="normal">
        <li>
          <strong>RFC Editor's Note:</strong> Please remove this section prior to publication of a
final version of this document.</li>
      </ul>
    </section>
    <section numbered="false" anchor="acknowledgments" toc="default">
      <name>Acknowledgments</name>
      <t>The following people directly contributed key ideas that shaped this draft:
Bob Briscoe, Kazuho Oku, Marten Seemann.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIALHH7GAAA81b/3fbNpL/HX8FzvmhdtdSbDe9pu5tr47ttN6Nv5zttC/v
3p0DkZCEM0moBGlF9bp/+84XgAQpKpvcXe9d9m0tiSQwGMx85jOD4Wg0EpWp
Mn0ot/7t7dmxPEruC7vMdDrTuS4q+brUv9a6SFZbIrVJoXK4My3VtBoZXU1H
v9YmGankfjQN94329kSqKrjt8eTo9vRJJPBlZsvVoXRVKhJbOF242h3Kqqy1
MIuSPrnqYG/v270DoUqtDuVtqQq3sGUllra8n5W2XhxKFFAIV6kivVOZLWCO
lXZiYQ7lv1c22ZUOHij11MGnVc4fQOhcLRammP2HEKqu5rY8FFKO4P9SmgLE
+MtYnq10MVMl/cZL/IsqVOdnW84O5WvlqmxF33WuTHYo/6s0Y1TEDzP8Pk5s
3h38bCxvlrqqoqHPVBH9RuP+aO0s0/G4RhVjhzf9MKNrNLIobJmryjzoQwE3
ozpGt9dHFzdXl9e3h/R4vJeH8ki+PbkavVJOp/K8ziqzyPQH+AwKlDc6qUvd
KnqLnuedO9g72B/tfU2/OF0a7UwxtTyDlNevYehv92Cf+fvJ5dmh3N8b73/z
4uU3z+Fqc63VN/4b+b/Dev+I7of0j/9Ki2vVqalsOTzH+Vjezm3ubNGb41yV
lSnWLtIs5/Y3k2VqeJqg9+vT48ufT6/fratdvrHOyRNd6aQytiBlH9tiph19
hY8VjPj56j74iLoP/n+ou2Pt7Qxdi2+Gj6x+Xc1iNBpJNXFVqZJKiNu5cejL
NYFSql1Smol2UtFuSP2hAlBB9U5tCRqXukgX1sCtlZUJa1yaysmF1uUXTqQ6
UyvABGmnUnURz4157sJW+u4C/1PZu2utUl06IU6MS2pHM8GjFUmFaCgrdQ/i
LDKVaAkXq7lmyRC+cCKCMInOjd8y4yqxjeD5A6LHGPSxsyuXc5PMJQypymQO
Xg6OWol/mVfVwh0+f47P+gvj8NBz/OG50/TnXwk77nDsP+PQ38Nu2LpMNIBu
qskOjXM1iIm3kKaiBSSgtYmGX+uiO+/MVPN6ggD0HEddwqQx3n8P+vrFL/JH
WiQaL+EU6KE3qtw86vffsd5zk6ZgFeKZPMNtS2vyov9rC3j2TN7qMnektRM9
NYVBMRzKoeW9XsG+pk5unb+9ud3a5b/y4pI+X5+CRNenJ/j55qejN2+aD+GO
m58u376B68J/ap88vjw/P7044YfhV9n76fzoHfxBobYur27PLi+O3myBwmkj
RaMdiKG4bFA8KECXixLACNTvGrWl+Myr4yu5/0I+Pv4TgMjB/v63T0/+y0vA
lqcnsZzrgiezRbaS/BUseyUhooLN4SAqy2CTF6ZSGURbmMLN7bKQc11qUOMZ
e0IJ2Nf6i5cSVgNMANxqC65PwbtQZL+bgItK8lW5DQKI3hbBE4kGRyh3wMZN
jo6RrWDA8POmIcN1gYP2991PuANyHxVyq391AT/oamBkvgCLA/tGS1OAhawx
MMOj47+KaQkwOO6bcO3Aeis0MmAprYWxwgF9yIFUhkM+wP14rbN/4sYHmP3x
QYjo/vtXqOzHxy5BeHpCu4boBgRCsU8dNQqJdeHCr6lfGsg0qSvwHnJn8hzS
FboPbK/T/e1xGHa1/JiP0VAmhwlIaQXLLqo5QMhsvqjBPDKMo2knjiZtHPU+
nYHsC10S4hSAvbAHivZa8G6yOo+v3sq6Auz9jWEJ7prYau5vDZZGNtE1FFDZ
tQYM8kuVDewNrCloKyyttA86WhsOLxpUimU27CVTWI1d4kxLtXJA8Uawpaxl
oHGd0cGzwUJMotUEzAxXh44O+PdA0cfZHOMqRKMKJ4Ht6CyiqPMJLBdWEMYk
2yWT9Qa8tl8wHE5coWPDmOjTMKKm8VQO8E4OjpIgwwcLT9utaLUpTz8skODA
qmFAhAo/NyFDYl3F48axw5lZYaYGvnHMmpvZXE5AmUuTVnOUq1Exxe4YEHhi
XDfuLexIoiF4DygU0IvwsqNKsh2YoAzK6294aw2sDReto109WxeLpkELGpEB
EpRcV6VJIBgX94ADybywmZ0B+YPspQYeAFh6cnl8c3azK9/cnrIdO+CLWWYq
1B4+B/dGBtY6TzApmj81pb9hoiHeakdbBMTKFLBLiOowGsM0SOd0q1zkIlPg
wnDbZBWtPrb2sfwFRoAUTuHDoCXcWJTfy1cOW153MIdxBI0hggIZrwfQ1iUq
0zLHoad1iYaIQA0IwZSMY9rjIzheRrtDng4hDYwM17XLtkuxEcgIcOwSnIcc
1PEuQirJXKEHMaR5AiPQI/h0uZIGFtBiZ12YrFK6hDXElhDDYtdcxpCZsVV8
EW1G5QJz7NmZaO2s0LBODu3IOAs0VghESUIeCB9z9QHM/ze9ASrRoLtLiYAI
9LkeNCSkiSUIAUtzC52AJxLpcqRnhni9FkpFDvasCuNydu9IWehtEPoOSQEY
IdecCnxck2gWd0ywnbH9t9d80EXrhbGBjAGsgJGBwdoJ5FAQvDAGwVcvaCMQ
sCRYAKAnm5xs0B9NDKBGMU2MdsUP1DJMRHaTohridcLjNnvQDAFwCxhXThH3
Qs8Aq8EcQb7TZpC3EDbFqQ8HMFQKy6qMI0Q1JbjQArNyZk06mrxD4TqECnxU
RGE5iidVSPJBbchFKqRVgS58A/RhkC7sQAjKTXEHmr7joL+992E63TtI9b7C
i1hgeFClQT8aZZBAImIAeM5g+FID63TIW7w0MJLJ6zwKFpXJMfaBo+cmKa0D
iyyAU09WPhGidYd42TKPdZMZy59VhnmNncJgB/958AISTMi4tMKFosOb4kFl
JmUjIlNcBNWCxh/4aeLw6Fj0IPJlGE3FAKvL0hJ6VauFlo2q7q6Oro/OT29P
r+9Or68vr5lABtHBxbtaDLkCzhWEBC8pyO7Af9tbx5GBkB8Fq6i6Bkkjktjx
4lRvXhxBwHOdORn3Pd3rTI4BaPPqxebVS8yaWV7YyEx3NvKL3hLFkG2CkGDc
EMUhUfVW0Zjr/suN9rrbM1f0fg9ZKQ/YmtmYM7mehoZlUYTwqDMEB3CwhFkk
SBE2BIBJtGQDSP/da0wDTy+O30mi/4Ai8mzaSUzRVylODM27K/ACJqskAXoy
Iz/B5tAEKJleIJaxewE0In4ibUd2I9rp/vGiYZ8BIUPK0tQI5VWsFghINuW8
EoJIm368/Ej20RX8NY4mxEnIE9aSBBg691xoAVHLYMAOAZYIPJZXAAALjbCB
IVe3iIpplK7ojswqiAddp/yk9KIFeBeIRCcGWwiqqoiSW/acSobd68wqOMC4
XioBO7RU5OM2+CIqKuwr/BoKFxA5mcyKAQvY9bn3RIOxADz//vvvQu7J9X/7
A78dDPz2FT6+D5e+ki/k1/Kf5Tfypfz2c34Tfxr9D/8n/jYgWPNv74Oaym2z
s/GG8Xj8x8lw43mjvGBau0GQP0wGsIGRzkxifJCFgDu3WTokxx+oh7cLrGLL
c/UBD4/kCTOFAVX8b8lwNiswAb0sqTr0cudvQ6OS9YvXLQWaIyXOcywQorNI
rlF26VQDYQfjF0gm1kFsdxh655D8QJggWgBQgGa5GxCF0mmEppaPQUDKUszw
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

-->

</rfc>
