<?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.30 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-johansson-ccwg-rfc8298bis-screamv2-07" category="exp" submissionType="IETF" obsoletes="8298" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="SCReAMv2">Self-Clocked Rate Adaptation for Multimedia</title>
    <seriesInfo name="Internet-Draft" value="draft-johansson-ccwg-rfc8298bis-screamv2-07"/>
    <author initials="I." surname="Johansson" fullname="Ingemar Johansson">
      <organization>Ericsson</organization>
      <address>
        <email>ingemar.s.johansson@ericsson.com</email>
      </address>
    </author>
    <author initials="M." surname="Westerlund" fullname="Magnus Westerlund">
      <organization>Ericsson</organization>
      <address>
        <email>magnus.westerlund@ericsson.com</email>
      </address>
    </author>
    <author initials="M." surname="Kühlewind" fullname="Mirja Kühlewind">
      <organization>Ericsson</organization>
      <address>
        <email>mirja.kuehlewind@ericsson.com</email>
      </address>
    </author>
    <date year="2026" month="March" day="02"/>
    <area>WIT</area>
    <workgroup>CCWG</workgroup>
    <abstract>
      <?line 123?>

<t>This memo describes Self-Clocked Rate Adaptation for Multimedia version 2
(SCReAMv2), an update to SCReAM congestion control for media streams such as RTP
<xref target="RFC3550"/>. SCReAMv2 includes several algorithm simplifications and adds
support for L4S. The algorithm supports handling of multiple media streams,
typical use cases are streaming for remote control, AR and 3D VR goggles.
This specification obsoletes RFC 8298.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-johansson-ccwg-rfc8298bis-screamv2/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Congestion Control Working Group (ccwg) Working Group mailing list (<eref target="mailto:ccwg@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/ccwg/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/ccwg/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/gloinul/draft-johansson-ccwg-scream-bis"/>.</t>
    </note>
  </front>
  <middle>
    <?line 132?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This memo describes Self-Clocked Rate Adaptation for Multimedia version 2
(SCReAMv2). This specification replaces the previous experimental version <xref target="RFC8298"/> of
SCReAM with SCReAMv2. There are many and fairly significant changes to the
original SCReAM algorithm as desribed in <xref target="sec_changes"/>.</t>
      <t>Both SCReAM and SCReAMv2 estimates the forward queue delay in the same way as Low
Extra Delay Background Transport (LEDBAT) <xref target="RFC6817"/>.
However, while SCReAM is based on the self-clocking principle of TCP,
SCReAMv2 is not entirely self-clocked as it augments self-clocking with pacing
and a minimum send rate.</t>
      <t>Further, SCReAMv2 can take advantage of Explicit
Congestion Notification (ECN) <xref target="RFC3168"/> and Low Latency Low Loss and Scalable
throughput (L4S) <xref target="RFC9330"/> in cases where ECN or L4S is supported by the
network and the hosts. However, ECN or L4S is not required for the basic
congestion control functionality in SCReAMv2.</t>
      <section anchor="sec_changes">
        <name>Updates Compared to SCReAM (version 1)</name>
        <t>The algorithm in this memo differs considerably compared to the previous version of
SCReAM in <xref target="RFC8298"/>. The main differences are:</t>
        <ul spacing="normal">
          <li>
            <t>L4S support added. The L4S algoritm has many similarities with the DCTCP and
Prague congestion control but has a few extra modifications to make it work
well with periodic sources such as video.</t>
          </li>
          <li>
            <t>The delay based congestion control is changed to implement a pseudo-L4S
approach, this simplifies the delay based congestion control.</t>
          </li>
          <li>
            <t>The fast increase mode is removed. The reference window additive increase is
replaced with an adaptive multiplicative increase to enhance convergence
speed.</t>
          </li>
          <li>
            <t>The algorithm is more rate based than self-clocked:  </t>
            <ul spacing="normal">
              <li>
                <t>The calculated congestion window is mainly used to calculate proper media bitrates. Bytes in flight is
however allowed to exceed the reference window. Therefore, the term
reference window is used instead of congestion window, as the reference
 window does not set an absolute limit on the bytes in flight.      </t>
                <ul spacing="normal">
                  <li>
                    <t>The self-clocking now acts more like an emergency break
as bytes in flight can exceed the reference window only to a certain
degree. The rationale is to be able to transmit large video frames and avoid
that they are unnecessarily queued up on the sender side, but still prevent a
large network queue.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>The media bitrate calculation is dramatically changed and simplified. In practice
it is manifested with a relatively simple relation between the reference window and RTT.</t>
          </li>
          <li>
            <t>Additional compensation is added to make SCReAMv2 handle cases such as large
changing frame sizes.</t>
          </li>
        </ul>
      </section>
      <section anchor="requirements-media">
        <name>Requirements on the Media and Feedback Protocol</name>
        <t>SCReAM was originally designed to with with RTP + RTCP where <xref target="RFC8888"/> was
used as recommended feedback. RTP offers unique packet indication with the
sequence number and <xref target="RFC8888"/> offers timestamps of received packets and the
status of the ECN bits.</t>
        <t>SCReAM is however not limited to RTP as long as some requirements are fulfilled :</t>
        <ul spacing="normal">
          <li>
            <t>Media data is split in data units that when encapsulated in IP packets fit in
the network MTU.</t>
          </li>
          <li>
            <t>Each data unit can be uniquely identified.</t>
          </li>
          <li>
            <t>Data units can be queued up in a packet queue before transmission.</t>
          </li>
          <li>
            <t>Feedback can indicate reception time for each data units, or a group of data
units.</t>
          </li>
          <li>
            <t>Feedback can indicate packets that are ECN-CE marked. Unique ECN bits
indication for each packet is not necessary. An ECN-CE counter similar to
what is defined in <xref target="RFC9000"/> is sufficient.</t>
          </li>
        </ul>
      </section>
      <section anchor="ledbat-tfwc">
        <name>Comparison with LEDBAT and TFWC in TCP</name>
        <t>The core SCReAM algorithm, which is still similar in SCReAMv2, has similarities
to the concepts of self-clocking used in TCP-friendly window-based congestion
control <xref target="TFWC"/> and follows the packet conservation principle. The packet
conservation principle is described as a key factor behind the protection of
networks from congestion <xref target="Packet-conservation"/>.</t>
        <t>The reference window decrease is determined in a way similar to
LEDBAT <xref target="RFC6817"/>. However, the window increase is not based on
delay estimates but uses both a linear increase and multiplicative increase function depending
on the time since the last congestion event and introduces use of inflection points in the
reference window increase calculation to achieve reduced delay jitter.
Further, unlike LEDBAT which is a scavenger congestion control mostly designed
for low priority background traffic, SCReAM adjusts the qdelay target to
compete with other loss-based congestion-controlled flows.</t>
        <t>SCReAMv2 adds a new reference window validation technique, as the reference window is used as a basis for the
target bitrate calculation. For that reason, various actions are taken to avoid
that the reference window grows too much beyond the bytes in flight. Additional
contraints are applied when in congested state and when the maximum target bitrate is reached.</t>
        <t>The SCReAM/SCReAMv2 congestion control method uses techniques similar to LEDBAT
<xref target="RFC6817"/> to measure the qdelay. As is the case with LEDBAT, it is not
necessary to use synchronized clocks in the sender and receiver in order to
compute the qdelay. However, it is necessary that they use the same clock
frequency, or that the clock frequency at the receiver can be inferred reliably
by the sender. Failure to meet this requirement leads to malfunction in the
SCReAM/SCReAMv2 congestion control algorithm due to incorrect estimation of the
network queue delay. Use of <xref target="RFC8888"/> as feedback ensures that the same time
base is used in sender and receiver.</t>
      </section>
    </section>
    <section anchor="requirements">
      <name>Requirements Language</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/>
when, and only when, they appear in all capitals, as shown here.</t>
    </section>
    <section anchor="scream-overview">
      <name>Overview of SCReAMv2 Algorithm</name>
      <t>SCReAMv2 consists of three main parts: network congestion control, sender
transmission control, and media rate control. All of these parts reside at the
sender side while the receiver is assumpted to provide acknowledgements of received
data units and indication of ECN-CE marking, either as an accumulated bytes counter,
or per individual data unit.</t>
      <t>The sender implements media rate control and an data unit queue for each media
type or source, where data units containing encoded media frames are temporarily
stored for transmission. Figure 1 shows the details when a single media source
(or stream) is used. Scheduling and prioritization of mulitiple streams is not
covered in this document. However, if multiple flows are sent, each data unit queue can be
served based on some defined priority or simply in a round-robin fashion. Alternatively,
a similar approach as coupled congestion control <xref target="RFC6365"/> can be applied.</t>
      <figure anchor="fig-sender-view">
        <name>Sender Functional View</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="528" width="472" viewBox="0 0 472 528" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
              <path d="M 8,160 L 8,224" fill="none" stroke="black"/>
              <path d="M 8,320 L 8,384" fill="none" stroke="black"/>
              <path d="M 8,480 L 8,512" fill="none" stroke="black"/>
              <path d="M 64,72 L 64,96" fill="none" stroke="black"/>
              <path d="M 64,120 L 64,160" fill="none" stroke="black"/>
              <path d="M 64,232 L 64,256" fill="none" stroke="black"/>
              <path d="M 64,304 L 64,320" fill="none" stroke="black"/>
              <path d="M 64,392 L 64,416" fill="none" stroke="black"/>
              <path d="M 64,464 L 64,480" fill="none" stroke="black"/>
              <path d="M 112,160 L 112,224" fill="none" stroke="black"/>
              <path d="M 112,320 L 112,384" fill="none" stroke="black"/>
              <path d="M 240,192 L 240,224" fill="none" stroke="black"/>
              <path d="M 240,248 L 240,336" fill="none" stroke="black"/>
              <path d="M 336,320 L 336,384" fill="none" stroke="black"/>
              <path d="M 344,144 L 344,240" fill="none" stroke="black"/>
              <path d="M 384,64 L 384,80" fill="none" stroke="black"/>
              <path d="M 384,128 L 384,136" fill="none" stroke="black"/>
              <path d="M 392,240 L 392,256" fill="none" stroke="black"/>
              <path d="M 392,288 L 392,312" fill="none" stroke="black"/>
              <path d="M 392,384 L 392,416" fill="none" stroke="black"/>
              <path d="M 392,448 L 392,472" fill="none" stroke="black"/>
              <path d="M 440,144 L 440,240" fill="none" stroke="black"/>
              <path d="M 456,320 L 456,384" fill="none" stroke="black"/>
              <path d="M 464,32 L 464,64" fill="none" stroke="black"/>
              <path d="M 464,480 L 464,512" fill="none" stroke="black"/>
              <path d="M 8,32 L 464,32" fill="none" stroke="black"/>
              <path d="M 8,64 L 464,64" fill="none" stroke="black"/>
              <path d="M 344,144 L 440,144" fill="none" stroke="black"/>
              <path d="M 8,160 L 112,160" fill="none" stroke="black"/>
              <path d="M 112,192 L 240,192" fill="none" stroke="black"/>
              <path d="M 8,224 L 112,224" fill="none" stroke="black"/>
              <path d="M 344,240 L 440,240" fill="none" stroke="black"/>
              <path d="M 8,320 L 112,320" fill="none" stroke="black"/>
              <path d="M 336,320 L 456,320" fill="none" stroke="black"/>
              <path d="M 240,336 L 328,336" fill="none" stroke="black"/>
              <path d="M 120,368 L 328,368" fill="none" stroke="black"/>
              <path d="M 8,384 L 112,384" fill="none" stroke="black"/>
              <path d="M 336,384 L 456,384" fill="none" stroke="black"/>
              <path d="M 8,480 L 464,480" fill="none" stroke="black"/>
              <path d="M 8,512 L 464,512" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="400,472 388,466.4 388,477.6" fill="black" transform="rotate(90,392,472)"/>
              <polygon class="arrowhead" points="400,312 388,306.4 388,317.6" fill="black" transform="rotate(90,392,312)"/>
              <polygon class="arrowhead" points="392,136 380,130.4 380,141.6" fill="black" transform="rotate(90,384,136)"/>
              <polygon class="arrowhead" points="336,368 324,362.4 324,373.6" fill="black" transform="rotate(0,328,368)"/>
              <polygon class="arrowhead" points="336,336 324,330.4 324,341.6" fill="black" transform="rotate(0,328,336)"/>
              <polygon class="arrowhead" points="72,392 60,386.4 60,397.6" fill="black" transform="rotate(270,64,392)"/>
              <polygon class="arrowhead" points="72,232 60,226.4 60,237.6" fill="black" transform="rotate(270,64,232)"/>
              <polygon class="arrowhead" points="72,72 60,66.4 60,77.6" fill="black" transform="rotate(270,64,72)"/>
              <g class="text">
                <text x="216" y="52">Media</text>
                <text x="272" y="52">encoder</text>
                <text x="372" y="100">Data</text>
                <text x="412" y="100">unit</text>
                <text x="68" y="116">target_bitrate</text>
                <text x="384" y="116">|</text>
                <text x="64" y="180">Media</text>
                <text x="388" y="180">Data</text>
                <text x="60" y="196">Rate</text>
                <text x="392" y="196">Units</text>
                <text x="64" y="212">Control</text>
                <text x="392" y="212">Queue</text>
                <text x="244" y="244">target_bitrate</text>
                <text x="64" y="276">ref_wnd</text>
                <text x="380" y="276">Data</text>
                <text x="420" y="276">unit</text>
                <text x="64" y="292">RTT</text>
                <text x="56" y="340">Network</text>
                <text x="396" y="340">Sender</text>
                <text x="60" y="356">Congestion</text>
                <text x="184" y="356">ref_wnd</text>
                <text x="396" y="356">Transmission</text>
                <text x="56" y="372">Control</text>
                <text x="392" y="372">Control</text>
                <text x="176" y="388">Bytes</text>
                <text x="212" y="388">in</text>
                <text x="252" y="388">flight</text>
                <text x="44" y="436">Congestion</text>
                <text x="124" y="436">Feedback</text>
                <text x="380" y="436">Data</text>
                <text x="420" y="436">unit</text>
                <text x="40" y="452">Bytes</text>
                <text x="76" y="452">in</text>
                <text x="116" y="452">flight</text>
                <text x="216" y="500">UDP</text>
                <text x="260" y="500">socket</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+--------------------------------------------------------+
|                       Media encoder                    |
+----------------------------------------------+---------+
       ^                                       |
       |                                    Data unit
 target_bitrate                                |
       |                                       V
       |                                  +-----------+
+------+-----+                            |           |
|    Media   |                            |   Data    |
|    Rate    +---------------+            |   Units   |
|   Control  |               |            |   Queue   |
+------------+               |            |           |
       ^               target_bitrate     +-----+-----+
       |                     |                  |
    ref_wnd                  |               Data unit
      RTT                    |                  |
       |                     |                  v
+------+-----+               |           +--------------+
|  Network   |               +---------->|    Sender    |
| Congestion |     ref_wnd               | Transmission |
|  Control   |-------------------------->|   Control    |
+------------+     Bytes in flight       +------+-------+
       ^                                        |
       |                                        |
Congestion Feedback                          Data unit
  Bytes in flight                               |
       |                                        v
+------+-------------------------------------------------+
|                        UDP socket                      |
+--------------------------------------------------------+
]]></artwork>
        </artset>
      </figure>
      <t>Media frames are encoded and forwarded to the data unit queue in
<xref target="fig-sender-view"/>. The data units are sent by the sender transmission controller
from the data unit queue.</t>
      <t>The sender transmission controller (in case of multiple flows a transmission
scheduler) sends the data units to the UDP socket. The sender transmission
controller limits the sending rate so
that the number of bytes in flight is less than the reference window albeit with
a slack to avoid that packets are unnecessarily delayed in the Data Units Queue.
The slack avoids unnecessary delays in the Data Units Queue when the link is uncongested. The bytes in flight however become more restrained in congested situations, to avoid large variations in queue delay and bitrate.
A pacing rate is calculated based on the target bitrate provided by the
media rate controller.</t>
      <t>Feedback about the received bytes as well as metadata to estimate the congestion
level or queuing delay are provided to the network congestion controller.
The network congestion controller calculates the reference window and provides it
together with the bytes in flight to the sender transmission control.</t>
      <t>The reference window and the estimated RTT is further provided to the media rate
control to compute the appropriate target bitrate. The target bitrate is
updated whenever the reference window is updated. Additional parameters are also
communicated to make the rate control more stable when the congestion window is
very small or when L4S is not active.</t>
      <section anchor="network-cc">
        <name>Network Congestion Control</name>
        <t>The network congestion control sets reference window (ref_wnd)
which puts an upper limit on how many bytes can be in
flight, i.e., transmitted but not yet acknowledged. The reference window is
however not an absolute limit as slack is given to efficiently transmit
temporary larger media objects, such as video frames. This means that the
algorithm prefers to build up a queue in the network rather than on the sender
side. Additional congestion that this causes will reflect back and cause a
reduction of the reference window.</t>
        <t>The reference window is reduced if congestion is detected. Similar to
LEDBAT, the reference window is reduced either by a fixed fraction in
case of packet loss or Classic ECN marking, or if the estimated queue
delay exceeds a given threshold, depending on how much the delay
exceeds the threshold.  SCReAMv2 reduces the reference window in
proportion to the fraction of marked packets if L4S is used (scalable
congestion control).</t>
        <t>In each RTT ref_wnd will be reduced at most once if congestion is detected based on the following conditions:</t>
        <t>a) on loss: ref_wnd *=  LOSS_BETA</t>
        <t>b) classic ECN CE: ref_wnd *=  ECN_BETA</t>
        <t>b) on L4S ECN CE or increased delay: ref_wnd *=  1-l4sAlpha/2</t>
        <t>Independent of the congestion detection, ref_wnd is increased by a fix increment for each RTT.</t>
        <t>The reference window increases multiplicatively after a number of congestion free RTTs, this enables a faster convergence to a higher link speed. The increase factor is also adjusted relative to a previous max value.</t>
      </section>
      <section anchor="sender-tc">
        <name>Sender Transmission Control</name>
        <t>The sender transmission control limits sending rate based on the
relation of the estimated link throughput (bytes in flight) and the reference window.</t>
        <artwork><![CDATA[
send_wnd = ref_wnd * ref_wnd_overhead - bytes_in_flight
]]></artwork>
        <t>The respective sending rate is achieved by applying packet pacing: Even
if the send window allows for the transmission of a number of packets,
these packets are not transmitted immediately; rather, they are
transmitted in intervals given by the packet size and the estimated
link throughput. Packets are generally paced at a higher rate than the
target bitrate, this makes it possible to transmit occasionally larger
video frames in a timely manner. Further, this mitigates issues with
ACK compression that can cause increased jitter and/or packet loss in
the media traffic.</t>
      </section>
      <section anchor="media-rate-control">
        <name>Media Rate Control</name>
        <t>The media rate control calculates the media rate based on the reference window and RTT.</t>
        <artwork><![CDATA[
target_bitrate = 8 * ref_wnd / s_rtt
]]></artwork>
        <t>The media rate needs to ramp up quickly enough to get a fair share of
the system resources when link throughput increases. Further, the
reaction to reduced throughput must be prompt in order to avoid
getting too much data queued in the data unit queue(s) in the sender.</t>
        <t>For the case that multiple
streams are enabled, the media rate among the streams is distributed according
to relative priorities.</t>
        <t>In cases where the sender's frame queues increase rapidly, such as in the case
of a Radio Access Type (RAT) handover, the SCReAMv2 sender MAY implement
additional actions, such as discarding of encoded media frames or frame skipping
in order to ensure that the data unit queues are drained quickly. Frame skipping
results in the frame rate being temporarily reduced. Which method to use is a
design choice and is outside the scope of this algorithm description.</t>
      </section>
    </section>
    <section anchor="scream-detailed-description">
      <name>Detailed Description of SCReAMv2 Sender Algorithm</name>
      <t>This section describes the sender-side algorithm in more detail. It is split
between the network congestion control, sender transmission control, and media
rate control.</t>
      <section anchor="sender-side-state">
        <name>Sender Side State</name>
        <t>The sender needs to maintain sending state and state about the received
feedback, as explained in the following subsections.</t>
        <section anchor="status-update-when-sending-data">
          <name>Status Update When Sending Data</name>
          <t>SCReAMv2 is a window-based and byte-oriented congestion control
protocol, where the number of bytes transmitted is inferred from the
size of the transmitted data units. Thus, a list of transmitted data
units and their respective transmission times (wall-clock time) MUST
be kept for further calculation. Further the following variables are
needed:</t>
          <ul spacing="normal">
            <li>
              <t>data_unit_size (0): Size [byte] of the last transmitted data unit.</t>
            </li>
            <li>
              <t>bytes_in_flight: The number of bytes in flight is computed as the sum of the
sizes of the data units ranging from the data unit most recently transmitted,
down to but not including the acknowledged data unit with the highest sequence
number.</t>
            </li>
          </ul>
          <t>bytes_in_flight can be also seen as the difference between the highest transmitted
byte sequence number and the highest acknowledged byte sequence number. As an
example: If a data unit with sequence number SN is transmitted and the last
acknowledgement indicates SN-5 as the highest received sequence number, then
bytes_in_flight is computed as the sum of the size of data units with sequence
number SN-4, SN-3, SN-2, SN-1, and SN. It does not matter if, for instance, the
data unit with sequence number SN-3 was lost -- the size of data unit with
sequence number SN-3 will still be considered in the computation of
bytes_in_flight.</t>
          <ul spacing="normal">
            <li>
              <t>ref_wnd_ratio (0.0): Ratio between MSS and ref_wnd capped to not
exceed 1.0 (min(1.0, MSS / ref_wnd)).</t>
            </li>
            <li>
              <t>max_bytes_in_flight (0): The maximum number of bytes in flight in the current
round trip [byte].</t>
            </li>
            <li>
              <t>max_bytes_in_flight_prev (0): The maximum number of bytes in flight in
previous round trip [byte].</t>
            </li>
          </ul>
          <t>As bytes_in_flight can spike when congestion occurs, using the minimum of
max_bytes_in_flight and max_bytes_in_flight_prev
makes it more likely that an uncongested bytes_in_flight is used.</t>
        </section>
        <section anchor="status-update-on-receiving-feedback">
          <name>Status Update on Receiving Feedback</name>
          <t>The feedback from the receiver is assumed to consist of the following elements:</t>
          <ul spacing="normal">
            <li>
              <t>The receiver wall-clock timestamp corresponding to the reception
time of the data unit with the highest sequence number.</t>
            </li>
            <li>
              <t>data_units_acked: A list of received data units' sequence numbers.</t>
            </li>
            <li>
              <t>data_units_acked_ce: An indication if data units are ECN-CE marked.
The ECN status can be either per data unit or an accumulated count of
ECN-CE marked data units.</t>
            </li>
            <li>
              <t>bytes_newly_acked (0): Number of bytes newly ACKed, reset to 0 when congestion
window is updated [byte].</t>
            </li>
            <li>
              <t>bytes_newly_acked_ce (0): Number of bytes newly ACKed and CE marked, reset to
0 when reference window is updated [byte].</t>
            </li>
          </ul>
          <t>bytes_newly_acked is incremented with a value
corresponding to how much the highest sequence number has increased
since the last feedback. As an example: If the previous
acknowledgement indicated the highest sequence number N and the new
acknowledgement indicated N+3, then bytes_newly_acked is incremented
by a value equal to the sum of the sizes of data units with sequence
number N+1, N+2, and N+3. Data units that are lost are also included,
which means that even though, e.g., data unit N+2 was lost, its size
is still included in the update of bytes_newly_acked. The
bytes_newly_acked_ce is, similar to bytes_newly_acked, a counter of
bytes newly acked with the extra condition that they are ECN-CE
marked. The bytes_newly_acked and bytes_newly_acked_ce are reset to
zero after a ref_wnd update.</t>
        </section>
      </section>
      <section anchor="network-cc-2">
        <name>Network Congestion Control</name>
        <t>This section explains the network congestion control, which calculates the
reference window. The reference window gives an upper limit to the number of bytes in flight.</t>
        <section anchor="reaction-delay-loss-ce">
          <name>Congestion Detection: Delay, Data Unit Loss and ECN-CE</name>
          <t>Congestion is detected based on three different indicators:</t>
          <ul spacing="normal">
            <li>
              <t>Lost data units detected,</t>
            </li>
            <li>
              <t>ECN-CE marked data units detected either for classic ECN or L4S,</t>
            </li>
            <li>
              <t>Estimated queue delay exceeds a threshold.</t>
            </li>
          </ul>
          <t>A congestion event occurs if any of the above indicators are true AND it is at
least min(VIRTUAL_RTT,s_rtt) since the last congestion event. This ensures that
the reference window is reduced at most once per smoothed RTT.</t>
          <section anchor="reaction-loss">
            <name>Detecting Lost Data Units</name>
            <t>The reference window back-off due to loss events is deliberately a bit less than
is the case with TCP Reno, for example. TCP is generally used to transmit whole
files; the file is then like a source with an infinite bitrate until the whole
file has been transmitted. SCReAMv2, on the other hand, has a source which rate
is limited to a value close to the available transmit rate and often below that
value; the effect is that SCReAMv2 has less opportunity to grab free capacity
than a TCP-based file transfer. To compensate for this, it is RECOMMENDED to let
SCReAMv2 reduce the reference window less than what is the case with TCP when
loss events occur.</t>
            <t>Lost data unit detection is based on the received sequence number list. A
reordering window SHOULD be applied to prevent data unit reordering from triggering
loss events. The reordering window is specified as a time unit, similar to the
ideas behind Recent ACKnowledgement (RACK) <xref target="RFC8985"/>. The computation of the
reordering window is made possible by means of a lost flag in the list of
transmitted data units. This flag is set if the received sequence number list
indicates that the given data unit is missing. If later feedback indicates that
a previously lost marked data unit was indeed received, then the reordering window
is updated to reflect the reordering delay. The reordering window is given by
the difference in time between the event that the data unit was marked as lost and
the event that it was indicated as successfully received. Loss is detected if a
given data unit is not acknowledged within a time window (indicated by the
reordering window) after an data unit with a higher sequence number was
acknowledged.</t>
          </section>
          <section anchor="reaction-ecn-ce">
            <name>Receiving ECN-CE with classic ECN</name>
            <t>In classic ECN mode the ref_wnd is scaled by a fixed value (BETA_ECN).</t>
            <t>The reference window back-off due to an ECN event MAY be smaller than if a loss
event occurs. This is in line with the idea outlined in <xref target="RFC8511"/> to enable
ECN marking thresholds lower than the corresponding data unit drop thresholds.</t>
          </section>
          <section anchor="reaction-l4s-ce">
            <name>Receiving ECN-CE for L4S</name>
            <t>The ref_wnd is scaled down in proportion to the fraction of marked
data units per RTT. The scale down proportion is given by l4s_alpha,
which is an Exponentially Weighted Moving Average (EWMA) filtered
version of the fraction of marked data units per RTT. This is inline
with how DCTCP works <xref target="RFC8257"/>. Additional methods are applied to
make the reference window reduction reasonably stable, especially when
the reference window is only a few MSS. In addition, because SCReAMv2
can quite often be source limited, additional steps are taken to
restore the reference window to a proper value after a long period
without congestion.</t>
            <t>l4s_alpha is calculated based in number of data units delivered (and marked)
the following way:</t>
            <artwork><![CDATA[
data_units_delivered_this_rtt += data_units_acked
data_units_marked_this_rtt += data_units_acked_ce
# l4s_alpha is updated at least every 10ms
if (now - last_update_l4s_alpha_time >= min(0.01,s_rtt)
  # l4s_alpha is calculated from data_units marked istf bytes marked
  fraction_marked_t = data_units_marked_this_rtt/
                      data_units_delivered_this_rtt

  # Apply a fast attack slow decay EWMA
  if (fraction_marked_t >= l4s_alpha)
     l4s_alpha = L4S_AVG_G_UP*fraction_marked_t + (1.0-L4S_AVG_G_UP)*l4S_alpha
  else
     l4s_alpha = (1.0-L4S_AVG_G_DOWN)*l4S_alpha

  last_update_l4s_alpha_time = now
  data_units_delivered_this_rtt = 0
  data_units_marked_this_rtt = 0
  last_fraction_marked = fraction_marked_t
end
]]></artwork>
            <t>This makes calculation of L4S alpha more accurate at very low bitrates,
given that the tail data unit in e.g a video frame is often smaller than MSS.</t>
            <t>The following variables are used:</t>
            <ul spacing="normal">
              <li>
                <t>l4s_alpha (0.0): Average fraction of marked data units per RTT.</t>
              </li>
              <li>
                <t>last_update_l4s_alpha_time (0): Last time l4s_alpha was updated [s].</t>
              </li>
              <li>
                <t>data_units_delivered_this_rtt (0): Counter for delivered data units.</t>
              </li>
              <li>
                <t>data_units_marked_this_rtt (0): Counter delivered and ECN-CE marked data units.</t>
              </li>
              <li>
                <t>last_fraction_marked (0.0): fraction marked data units in last update</t>
              </li>
            </ul>
            <t>The following constants are used</t>
            <ul spacing="normal">
              <li>
                <t>L4S_AVG_G_UP (1/8): Exponentially Weighted Moving Average (EWMA) factor for l4s_alpha increase</t>
              </li>
              <li>
                <t>L4S_AVG_G_DOWN (1/128): Exponentially Weighted Moving Average (EWMA) factor for l4s_alpha decrease</t>
              </li>
            </ul>
            <t>The calculation of l4s_alpha is done with an fast attack slow decay EWMA filter.
This can give a more stable performance when L4S bottlenecks have high marking thresholds.</t>
          </section>
          <section anchor="reaction-delay">
            <name>Detecting Increased Queue Delay</name>
            <t>SCReAMv2 implements a delay-based congestion control approach where it mimics
L4S congestion marking when the averaged queue delay exceeds a target
threshold. This threshold is set to qdelay_target/2 and the congestion backoff
factor (l4s_alpha_v) increases linearly from 0 to 100% as qdelay_avg goes from
qdelay_target/2 to qdelay_target. The averaged qdelay (qdelay_avg) is used to
avoid that the SCReAMv2 congestion control over-reacts to scheduling jitter,
sudden delay spikes due to e.g. handover or link layer
retransmissions.</t>
            <t>qdelay_avg is updated with a slow attack, fast decay EWMA filter as described below.</t>
            <artwork><![CDATA[
if (now - last_update_qdelay_avg_time >= min(virtual_rtt,s_rtt)
  # Calculate qdelay_avg
  if (qdelay < qdelay_avg)
    qdelay_avg = qdelay
  else
    qdelay_avg = QDELAY_AVG_G*qdelay + (1.0-QDELAY_AVG_G)*qdelay_avg
  end

  # Optional code to calculate the variation on queue delay, which is an
  # Indication of congestion or near congestion.
  if (REDUCE_JITTER == true)
     calculate_qdelay_norm()
  end
  last_update_qdelay_avg_time = now
end
]]></artwork>
            <t>The following variables are used:</t>
            <ul spacing="normal">
              <li>
                <t>qdelay (0): When the sender receives feedback, the qdelay is calculated as outlined in
<xref target="RFC6817"/>. A qdelay sample is obtained for each received acknowledgement.
It is typically sufficient with one update per received acknowledgement.</t>
              </li>
              <li>
                <t>last_update_qdelay_avg_time (0): Last time qdelay_avg was updated [s].</t>
              </li>
              <li>
                <t>s_rtt (0.0): Smoothed RTT [s], computed with a similar method to that
described in <xref target="RFC6298"/>.</t>
              </li>
            </ul>
            <t>The following constants are used:</t>
            <ul spacing="normal">
              <li>
                <t>QDELAY_AVG_G (1/4): Exponentially Weighted Moving Average (EWMA) factor for qdelay_avg</t>
              </li>
              <li>
                <t>REDUCE_JITTER (false): (optional) config knob to enable jitter filtering</t>
              </li>
            </ul>
            <t>The SCReAM algorithm can be further improved for a greater rate stability by taking variations in qdelay into consideration. The goal is to react less to delay variations, caused by e.g. link layer related scheduling and retransmissions, but still be reactive to actual queue delay, caused by congestion. The code below provides a example implementation but more advanced statistical analysis can be considered.</t>
            <t>The variable qdelay_dev_norm indicates how much the queue delay varies,
normalized to QDELAY_DEV_NORM. A small margin QDELAY_DEV_NORM/4 is implemented to reduce sensitivity to link layer scheduling jitter and retransmissions. In addition, a limit is implemented to avoid that qdelay_dev_norm winds up to very large values in cases of severe congestion. This limit is a factor larger than QDELAY_DEV_NORM_TH.
It increases when ref_wnd/MSS is small and therefore the relative increase of ref_wnd is large. This reduces delay and rate variations particularly for small ref_wnd values. The threshold is limited to a maximum value of 0.1 which is applied when the standard deviation of the delay jitter exceeds the threshold.</t>
            <artwork><![CDATA[
function calculate_qdelay_norm()
  # Calculate qdelay_dev_norm and cap in range [0.0, QDELAY_DEV_NORM_TH*1.5]
  tmp = max(0, min(QDELAY_DEV_NORM_TH*1.5, (qdelay-QDELAY_DEV_NORM/4)/QDELAY_DEV_NORM))
  qdelay_dev_norm = (1.0-QDELAY_DEV_AVG_G) * qdelay_dev_norm +
     QDELAY_DEV_AVG_G * tmp
end
]]></artwork>
            <t>The following variables are used:¶</t>
            <ul spacing="normal">
              <li>
                <t>qdelay_dev_norm (0): indicates how much the queue delay varies, normalized to QDELAY_DEV_NORM.</t>
              </li>
            </ul>
            <t>The following constants are used:</t>
            <ul spacing="normal">
              <li>
                <t>QDELAY_DEV_AVG_G (1/64): Exponentially Weighted Moving Average (EWMA) factor for qdelay_dev_norm</t>
              </li>
              <li>
                <t>QDELAY_DEV_NORM (0.025): The normalization factor for qdelay_dev_norm</t>
              </li>
              <li>
                <t>QDELAY_DEV_NORM_TH (1.0): A threshold for the limitation ref_wnd growth and ref_wnd_overhead.</t>
              </li>
            </ul>
            <section anchor="competing-flows-compensation">
              <name>Competing Flows Compensation</name>
              <t>It is likely that a flow will have to share congested bottlenecks with other
flows that use a more aggressive congestion control algorithm (for example,
large FTP flows using loss-based congestion control). The worst condition occurs
when the bottleneck queues are of tail-drop type with a large buffer
size. SCReAMv2 takes care of such situations by adjusting the qdelay_target when
loss-based flows are detected, as shown in the pseudocode below.</t>
              <artwork><![CDATA[
adjust_qdelay_target(qdelay)
  qdelay_norm_t = qdelay / QDELAY_TARGET_LOW
  update_qdelay_norm_history(qdelay_norm_t)
  # Compute variance
  qdelay_norm_var_t = VARIANCE(qdelay_norm_history(200))
  # Compensation for competing traffic
  # Compute average
  qdelay_norm_avg_t = AVERAGE(qdelay_norm_history(50))
  # Compute upper limit to target delay
  new_target_t = qdelay_norm_avg_t + sqrt(qdelay_norm_var_t)
  new_target_t *= QDELAY_TARGET_LO
  if (loss_event_rate > 0.002)
    # Data unit losses detected
    qdelay_target = 1.5 * new_target_t
  else
    if (qdelay_norm_var_t < 0.2)
      # Reasonably safe to set target qdelay
      qdelay_target = new_target_t
    else
      # Check if target delay can be reduced; this helps prevent
      # the target delay from being locked to high values forever
      if (new_target_t < QDELAY_TARGET_LO)
        # Decrease target delay quickly, as measured queuing
        # delay is lower than target
        qdelay_target = max(qdelay_target * 0.5, new_target_t)
      else
        # Decrease target delay slowly
        qdelay_target *= 0.9
      end
    end
  end

  # Apply limits
  qdelay_target = min(QDELAY_TARGET_HI, qdelay_target)
  qdelay_target = max(QDELAY_TARGET_LO, qdelay_target)
]]></artwork>
              <t>The follwoing variable is used:</t>
              <ul spacing="normal">
                <li>
                  <t>loss_event_rate (0.0): The estimated fraction of RTTs with lost data units
detected.</t>
                </li>
              </ul>
              <t>Two temporary variables are calculated. qdelay_norm_avg_t is the long-term
average queue delay, qdelay_norm_var_t is the long-term variance of the queue
delay. A high qdelay_norm_var_t indicates that the queue delay changes; this can
be an indication that bottleneck bandwidth is reduced or that a competing flow
has just entered. Thus, it indicates that it is not safe to adjust the queue
delay target.</t>
              <t>A low qdelay_norm_var_t indicates that the queue delay is relatively stable. The
reason could be that the queue delay is low, but it could also be that a
competing flow is causing the bottleneck to reach the point that data unit losses
start to occur, in which case the queue delay will stay relatively high for a
longer time.</t>
              <t>The queue delay target is allowed to be increased if either the loss event rate
is above a given threshold or qdelay_norm_var_t is low. Both these conditions
indicate that a competing flow may be present. In all other cases, the queue
delay target is decreased.</t>
              <t>The function that adjusts the qdelay_target is simple and could produce false
positives and false negatives. The case that self-inflicted congestion by the
SCReAMv2 algorithm may be falsely interpreted as the presence of competing
loss-based FTP flows is a false positive. The opposite case -- where the
algorithm fails to detect the presence of a competing FTP flow -- is a false
negative.</t>
              <t>Extensive simulations have shown that the algorithm performs well in LTE and 5G
test cases and that it also performs well in simple bandwidth-limited bottleneck
test cases with competing FTP flows. However, the potential failure of the
algorithm cannot be completely ruled out. A false positive (i.e., when
self-inflicted congestion is mistakenly identified as competing flows) is
especially problematic when it leads to increasing the target queue delay, which
can cause the end-to-end delay to increase dramatically.</t>
              <t>If it is deemed unlikely that competing flows occur over the same bottleneck,
the algorithm described in this section MAY be turned off. One such case is
QoS-enabled bearers in 3GPP-based access such as LTE and 5G. However, when
sending over the Internet, often the network conditions are not known for sure,
so in general it is not possible to make safe assumptions on how a network is
used and whether or not competing flows share the same bottleneck. Therefore,
turning this algorithm off must be considered with caution, as it can lead to
basically zero throughput if competing with loss-based traffic.</t>
            </section>
          </section>
        </section>
        <section anchor="ref-wnd-update">
          <name>Reference Window Update</name>
          <t>The reference window update contains two parts. One that reduces the reference
window when congestion events (listed above) occur, and one part that
continuously increases the reference window.</t>
          <t>The following variables are defined:</t>
          <ul spacing="normal">
            <li>
              <t>ref_wnd (MIN_REF_WND): Reference window [byte].</t>
            </li>
            <li>
              <t>ref_wnd_i (1): Reference window inflection point [byte].</t>
            </li>
            <li>
              <t>qdelay_target (QDELAY_TARGET_LO): qdelay target [s], a variable qdelay target
is introduced to manage cases where a fixed qdelay target would otherwise
starve the data flow under such circumstances (e.g., FTP competes for the
bandwidth over the same bottleneck). The qdelay target is allowed to vary
between QDELAY_TARGET_LO and QDELAY_TARGET_HI.</t>
            </li>
            <li>
              <t>last_congestion_detected_time (0): Last time congestion detected [s].</t>
            </li>
            <li>
              <t>last_reaction_to_congestion_time (0): Last time congestion avoidance occured [s].</t>
            </li>
            <li>
              <t>last_ref_wnd_i_update_time (0): Last time ref_wnd_i was updated [s].</t>
            </li>
          </ul>
          <t>Further the following constants are used (the RECOMMENDED values, within parentheses "()",
for the constants are deduced from experiments):</t>
          <ul spacing="normal">
            <li>
              <t>QDELAY_TARGET_LO (0.06): Target value for the minimum qdelay [s].</t>
            </li>
            <li>
              <t>QDELAY_TARGET_HI (0.4): Target value for the maximum qdelay [s]. This
parameter provides an upper limit to how much the target qdelay
(qdelay_target) can be increased in order to cope with competing loss-based
flows. However, the target qdelay does not have to be initialized to this high
value, as it would increase end-to-end delay and also make the rate control
and congestion control loops sluggish.</t>
            </li>
            <li>
              <t>MIN_REF_WND (3000): Minimum reference window [byte].</t>
            </li>
            <li>
              <t>BYTES_IN_FLIGHT_HEAD_ROOM (1.5): Extra headroom for bytes in flight.</t>
            </li>
            <li>
              <t>BETA_LOSS (0.7): ref_wnd scale factor due to loss event.</t>
            </li>
            <li>
              <t>BETA_ECN (0.8): ref_wnd scale factor due to ECN event.</t>
            </li>
            <li>
              <t>MSS (1000): Maximum segment size = Max data unit size [byte].</t>
            </li>
            <li>
              <t>POST_CONGESTION_DELAY_RTT (100): Determines how many RTTs after a congestion
event the reference window growth should be cautious.</t>
            </li>
            <li>
              <t>MUL_INCREASE_FACTOR (0.02): Determines how much (as a fraction of ref_wnd)
that the ref_wnd can increase per RTT.</t>
            </li>
            <li>
              <t>IS_L4S (false): Congestion control operates in L4S mode.</t>
            </li>
            <li>
              <t>VIRTUAL_RTT (0.025): Virtual RTT [s]. This mimics Prague's RTT fairness such that flows with RTT
below VIRTUAL_RTT should get a roughly equal share over an L4S path.</t>
            </li>
            <li>
              <t>MIN_QUEUE_DELAY_DEV_SCALE (0.1): Min allowed scaling of ref_wnd backoff and increase due to large qdelay_dev_norm.</t>
            </li>
          </ul>
          <section anchor="reference-window-reduction">
            <name>Reference Window Reduction</name>
            <artwork><![CDATA[
# Compute scaling factor for reference window adjustment
# when close to the last known max value before congestion
# ref_wnd_i is updated before this code
# loss_detected and data_units_marked indicates that packets
# are marked or lost since last_reaction_to_congestion_time
scl_t = (ref_wnd-ref_wnd_i) / ref_wnd_i
scl_t *= 8
scl_t = scl_t * scl_t
scl_t = max(0.1, min(1.0, scl_t))

if (loss_detected || data_units_marked)
   last_congestion_detected_time = now
end

# The reference window is updated at least every VIRTUAL_RTT
if (now - last_reaction_to_congestion_time >= min(VIRTUAL_RTT,s_rtt)
  if (loss_detected)
    is_loss_t = true
  else if (data_units_marked)
    is_ce_t = true
  else if (qdelay_avg > qdelay_target/2 && !(is_ce_t || is_loss_t))
    # The calculation of l4s_alpha_v_t is based on qdelay_avg to reduce
    # sensitivity to sudden non-congestion related delay spikes that can
    # occur due to lower protocol retransmissions or cell change
    l4s_alpha_v_t = min(1.0, max(0.0,
            (qdelay_avg - qdelay_target / 2) /
            (qdelay_target / 2)))
    is_virtual_ce_t = true
  end
end

if (is_loss_t || is_ce_t || is_virtual_ce_t)
  if (now - last_ref_wnd_i_update_time > 10*s_rtt)
    # Update ref_wnd_i, no more often than every 10 RTTs
    # Additional median filtering over more congestion epochs
    # may improve accuracy of ref_wnd_i
    last_ref_wnd_i_update_time = now
    ref_wnd_i = ref_wnd
  end
end

# Either loss, ECN mark or increased qdelay is detected
if (is_loss_t)
  # Loss is detected
  ref_wnd = ref_wnd * BETA_LOSS
end
if (is_ce_t)
  # ECN-CE detected
  if (IS_L4S)
    # L4S mode
    backoff_t = l4s_alpha / 2

    # Scale down backoff when RTT is high to avoid overreaction to
    # congestion
    backoff_t /= max(1.0, s_rtt/VIRTUAL_RTT)

    # Jitter is considered large if the qdelay is larger than qdelay_target/4
    # when L4S is enabled
    if (qdelay < qdelay_target * 0.25)
        # Scale down backoff if close to the last known max reference window
        # This is complemented with a scale down of the reference window increase
        backoff_t *= max(0.25, scl_t)

        # Optional additional code for increased rate stability
        # qdelay_dev_norm is zero if REDUCE_JITTER is false
        # Counterbalance the limitation in CWND increase when the queue
        # delay varies. This helps to avoid starvation in the presence of
        # competing TCP Prague flows
        # Code has no effect if REDUCE_JITTER == false
        backoff_t *= max(MIN_QUEUE_DELAY_DEV_SCALE,
          (QDELAY_DEV_NORM_TH - qdelay_dev_norm) / QDELAY_DEV_NORM_TH)
    end

    if (now - last_reaction_to_congestion_time >
        100*max(VIRTUAL_RTT,s_rtt))
      # A long time (>100 RTTs) since last congested because
      # link throughput exceeds max video bitrate.
      # There is a certain risk that ref_wnd has increased way above
      # bytes in flight, so we reduce it here to get it better on
      # track and thus the congestion episode is shortened
      ref_wnd = min(ref_wnd, max_bytes_in_flight_prev)
    end

    ref_wnd = (1.0 - backoff_t) * ref_wnd
  else
    # Classic ECN mode
    ref_wnd = ref_wnd * BETA_ECN
  end
end
if (is_virtual_ce_t)
  backoff_t = l4s_alpha_v_t / 2

  # Scale down backoff when RTT is high to avoid overreaction to
  # congestion
  backoff_t /= max(1.0, s_rtt/VIRTUAL_RTT)

  ref_wnd = (1.0 - backoff_t) * ref_wnd
end
ref_wnd = max(MIN_REF_WND, ref_wnd)

if (is_loss_t || is_ce_t || is_virtual_ce_t)
  last_reaction_to_congestion_time = now
end
]]></artwork>
          </section>
          <section anchor="reference-window-increase">
            <name>Reference Window Increase</name>
            <artwork><![CDATA[
# Delay factor for multiplicative reference window increase
# after congestion

post_congestion_scale_t = max(0.0, min(1.0,
  (now - last_congestion_detected_time) /
  (POST_CONGESTION_DELAY_RTTS * max(VIRTUAL_RTT, s_rtt))))

# Scale factor for ref_wnd update
ref_wnd_scale_factor_t = 1.0 + (MUL_INCREASE_FACTOR  * ref_wnd) / MSS

# Calculate bytes acked that are not CE marked
# For the case that only accumulated number of CE marked packets is
# reported by the feedback, it is necessary to make an approximation
# of bytes_newly_acked_ce based on average data unit size.
bytes_newly_acked_minus_ce_t = bytes_newly_acked-
                               bytes_newly_acked_ce

increment_t = bytes_newly_acked_minus_ce_t*ref_wnd_ratio

# Reduce increment for small RTTs
tmp_t = min(1.0, s_rtt / VIRTUAL_RTT)
increment_t *= tmp_t

# Apply limit to reference window growth when close to last
# known max value before congestion
increment_t *= max(0.25,scl_t)

# Optional additional code for increased rate stability
# qdelay_dev_norm is zero if REDUCE_JITTER is false
# Put a additional restriction on reference window growth if qdelay varies a lot.
# Better to enforce a slow increase in reference window and get
# a more stable bitrate. Restriction is limited by MIN_QUEUE_DELAY_DEV_SCALE to avoid that
# ref_wnd growth becomes zero.
# Code has no effect if REDUCE_JITTER == false
increment_t *= max(MIN_QUEUE_DELAY_DEV_SCALE,
  (QDELAY_DEV_NORM_TH - qdelay_dev_norm) / QDELAY_DEV_NORM_TH)

# Scale up increment with multiplicative increase
# Limit multiplicative increase when congestion occurred
# recently and when reference window is close to the last
# known max value.
float tmp_t = ref_wnd_scale_factor_t
if (tmp_t > 1.0)
  tmp_t = 1.0 + (tmp_t - 1.0) * post_congestion_scale_t * scl_t
end
increment_t *= tmp_t

# Increase ref_wnd only if bytes in flight is large enough
# Quite a lot of slack is allowed here to avoid that bitrate
# locks to low values.
# Increase is inhibited if max target bitrate is reached.
max_allowed_t = MSS + max(max_bytes_in_flight,
  max_bytes_in_flight_prev) * BYTES_IN_FLIGHT_HEAD_ROOM
int ref_wnd_t = ref_wnd + increment_t
if (ref_wnd_t <= max_allowed_t && target_bitrate < TARGET_BITRATE_MAX)
  ref_wnd = ref_wnd_t
end
]]></artwork>
            <t>The ref_wnd_scale_factor_t scales the reference window increase. The
ref_wnd_scale_factor_t is increased with larger ref_wnd to allow for a
multiplicative increase and thus a faster convergence when link capacity
increases.</t>
            <t>The multiplicative increase is restricted directly after a congestion event and
the restriction is gradually relaxed as the time since last congested
increased. The restriction makes the reference window growth to be no faster
than additive increase when congestion continuously occurs.  For L4S operation
this means that the SCReAMv2 algorithm will adhere to the 2 marked data units per
RTT equilibrium at steady state congestion, with the exception of the case
below.</t>
            <t>The reference window increase is restricted to values as small as 0.1MSS/RTT
when the reference window is close to the last known max value (ref_wnd_i). This
increases stability and reduces periodic overshoot.</t>
            <t>It is particularly important that the reference window reflects the transmitted
bitrate especially in L4S mode operation. An inflated ref_wnd takes extra RTTs
to bring down to a correct value upon congestion and thus causes unnecessary
queue buildup. At the same time the reference window must be allowed to be large
enough to avoid that the SCReAMv2 algorithm begins to limit itself, given that
the target bitrate is calculated based on the ref_wnd. Two mechanisms are used
to manage this:</t>
            <ul spacing="normal">
              <li>
                <t>Restore correct value of ref_wnd upon congestion. This is done if is a
prolonged time since the link was congested. A typical example is that
SCReAMv2 has been rate limited, i.e the target bitrate has reached the
TARGET_BITRATE_MAX.</t>
              </li>
              <li>
                <t>Limit ref_wnd when the target_bitrate has reached TARGET_BITRATE_MAX. The
ref_wnd is restricted based on a history of the last max_bytes_in_flight
values. See <xref target="SCReAM-CPP-implementation"/> for details.</t>
              </li>
            </ul>
            <t>The two mechanisms complement one another.</t>
          </section>
        </section>
      </section>
      <section anchor="sender-transmission-control">
        <name>Sender Transmission Control</name>
        <t>The Sender Transmission control calculates of send window at the sender.
Data units are transmitted if allowed by the relation between the number of bytes
in flight and the reference window. This is controlled by the send window:</t>
        <ul spacing="normal">
          <li>
            <t>send_wnd (0): Upper limit to how many bytes can currently be
transmitted. Updated when ref_wnd is updated and when data unit is
transmitted [byte].</t>
          </li>
        </ul>
        <section anchor="send-window">
          <name>Send Window Calculation</name>
          <t>The basic design principle behind data unit transmission in SCReAM was to allow
transmission only if the number of bytes in flight is less than the congestion
window. There are, however, two reasons why this strict rule will not work
optimally:</t>
          <ul spacing="normal">
            <li>
              <t>Bitrate variations: Media sources such as video encoders generally produce
frames whose size always vary to a larger or smaller extent. The data unit queue
absorbs the natural variations in frame sizes. However, the data unit queue should
be as short as possible to prevent the end-to-end delay from increasing. A
strict 'send only when bytes in flight is less than the reference window' rule
can cause the data unit queue to grow simply because the send window is limited. The
consequence is that the reference window will not increase, or will increase
very slowly, because the reference window is only allowed to increase when
there is a sufficient amount of data in flight. The final effect is that the
media bitrate increases very slowly or not at all.</t>
            </li>
            <li>
              <t>Reverse (feedback) path congestion: Especially in transport over
buffer-bloated networks, the one-way delay in the reverse direction can jump
due to congestion. The effect is that the acknowledgements are delayed, and
the self-clocking is temporarily halted, even though the forward path is not
congested. The ref_wnd_overhead allows for some degree of reverse path
congestion as the bytes in flight is allowed to exceed ref_wnd.</t>
            </li>
          </ul>
          <t>In SCReAMv2, the send window is given by the relation between the adjusted
reference window and the amount of bytes in flight according to the pseudocode
below. The multiplication of ref_wnd with ref_wnd_overhead has the effect that bytes in flight is 'around' the ref_wnd
rather than limited by the ref_wnd. The
implementation allows the data unit queue to be small even when the frame sizes vary
and thus increased e2e delay can be avoided.</t>
          <artwork><![CDATA[
send_wnd = ref_wnd * ref_wnd_overhead - bytes_in_flight
]]></artwork>
          <t>The send window is updated whenever an data unit is transmitted or an feedback
messaged is received.</t>
          <t>The ref_wnd_overhead is adjusted dynamically. A large overhead is beneficial when the network link is uncongested as it allows to
transmit large media frames with little transmission delay. A large overhead is also beneficial for cases where network links use virtual queue marking or can temporarly absorb bursts from L4S capable flows.
If, on the other hand the network link is congested, then it is better to restrict how much bytes in flight exceeds the reference window because is not possible to push data faster than the reference window allows. This restriction reduces varaitions in RTT caused by self-congestion and improves performance for the cases where media encoders are slow to react to changes in target rate.</t>
          <t>The following constants are used (the RECOMMENDED values, within parentheses "()",
for the constants are deduced from experiments):</t>
          <ul spacing="normal">
            <li>
              <t>REF_WND_OVERHEAD_MIN (1.5): Indicates a lower limit how much bytes in flight is allowed to
exceed ref_wnd.</t>
            </li>
            <li>
              <t>REF_WND_OVERHEAD_MAX (3.0): Indicates an upper limit how much bytes in flight is allowed to exceed ref_wnd. This is roughly equal to MAX_RELAXED_PACING_FACTOR to allow that media frames can be transmitted quickly when the transmission channel is uncongested.</t>
            </li>
          </ul>
          <t>The ref_wnd_overhead is calculated as:</t>
          <artwork><![CDATA[
ref_wnd_overhead = REF_WND_OVERHEAD_MIN +
  (REF_WND_OVERHEAD_MAX - REF_WND_OVERHEAD_MIN)*max(0.0,(QDELAY_DEV_NORM_TH-qdelay_dev_norm)/QDELAY_DEV_NORM_TH)
]]></artwork>
        </section>
        <section anchor="packet-pacing">
          <name>Packet Pacing</name>
          <t>Packet pacing is used in order to mitigate coalescing, i.e., when packets are
transmitted in bursts, with the risks of increased jitter and potentially
increased packet loss. Packet pacing is also highly recommended to be used with L4S and
also mitigates possible issues with queue overflow due to key-frame generation
in video coders. However, when the link is uncongested, it is beneficial to relax
the packet pacing and allow frames to be transmitted faster, to reduce end to end delay on the application layer.</t>
          <ul spacing="normal">
            <li>
              <t>pace_bitrate (1e6): Data unit pacing rate [bps].</t>
            </li>
            <li>
              <t>t_pace (1e-6): Pacing interval between data units [s].</t>
            </li>
          </ul>
          <t>The following constants are used by the packet pacing:</t>
          <ul spacing="normal">
            <li>
              <t>RATE_PACE_MIN (50000): Minimum pacing rate in [bps].</t>
            </li>
            <li>
              <t>PACKET_PACING_HEADROOM (1.5): Headroom for packet pacing.</t>
            </li>
            <li>
              <t>MAX_RELAXED_PACING_FACTOR (4.0): Max extra packet pacing when the media coder reaches the max bitrate. This should be roughly equal to REF_WND_OVERHEAD_MAX.</t>
            </li>
            <li>
              <t>RELAXED_PACING_LIMIT_LOW (0.8): Nominal bitrate fraction of TARGET_BITRATE_MAX at which the pacing should be increasingly relaxed.</t>
            </li>
          </ul>
          <t>The time interval between consecutive data unit transmissions is
greater than or equal to t_pace, where t_pace is given by the equations below:</t>
          <artwork><![CDATA[
pace_bitrate = max(RATE_PACE_MIN, target_bitrate) *
               PACKET_PACING_HEADROOM

# Calculate and apply relaxed pacing
nominal_rate_t = target_bitrate/TARGET_BITRATE_MAX
pace_rate_scale_t = min(1.0,
  (nominal_rate_t-RELAXED_PACING_LIMIT_LOW)/(1.0 - RELAXED_PACING_LIMIT_LOW))
pace_rate_scale_t = min(1.0,
  max(1.0 / MAX_RELAXED_PACING_FACTOR, 1.0 - pace_rate_scale_t))
pace_bitrate /= pace_rate_scale_t

t_pace = data_unit_size * 8 / pace_bitrate
]]></artwork>
          <t>data_unit_size is the size of the last transmitted data unit. RATE_PACE_MIN is the
minimum pacing rate.</t>
        </section>
      </section>
      <section anchor="media-rate-control-2">
        <name>Media Rate Control</name>
        <t>The media rate control algorithm is executed whenever the reference window is
updated and calculates the target bitrate:</t>
        <ul spacing="normal">
          <li>
            <t>target_bitrate (0): Media target bitrate [bps].</t>
          </li>
          <li>
            <t>rate_adjust_factor (0): Adjustment factor to avoid unnecessary media queue buildup.</t>
          </li>
          <li>
            <t>frame_size_dev (0): Frame size deviation.</t>
          </li>
          <li>
            <t>frame_period (0.02): An estimated frame period.</t>
          </li>
        </ul>
        <t>The following constants are used by the media rate control:</t>
        <ul spacing="normal">
          <li>
            <t>PACKET_OVERHEAD (20) : Estimated packetization overhead [byte].</t>
          </li>
          <li>
            <t>TARGET_BITRATE_MIN: Minimum target bitrate in [bps] (bits per second).</t>
          </li>
          <li>
            <t>TARGET_BITRATE_MAX: Maximum target bitrate in [bps].</t>
          </li>
          <li>
            <t>RATE_ADJUST_GAIN (1/16): Adjustment gain for rate adjustment to compensate for media queue buildup.</t>
          </li>
          <li>
            <t>FRAME_SIZE_DEV_ALPHA (1/64): Time constant to compensate for varying frame sizes.</t>
          </li>
        </ul>
        <t>The target bitrate is essentiatlly based on the reference window ref_wnd and the (smoothed) RTT s_rtt according to</t>
        <artwork><![CDATA[
target_bitrate = 8 * ref_wnd / s_rtt
]]></artwork>
        <t>The role of the media rate control is to strike a reasonable balance between a
low amount of queuing in the data unit queue(s) and a sufficient amount of data to
send in order to keep the data path busy. Because the reference window is
updated based on loss, ECN-CE and delay, so does the target rate also update.</t>
        <t>The code above however needs some modifications to work fine in a number of
scenarios</t>
        <ul spacing="normal">
          <li>
            <t>ref_wnd is very small, just a few MSS or smaller</t>
          </li>
          <li>
            <t>The media queue grows large, which can result in large e2e delay</t>
          </li>
          <li>
            <t>The frame sizes vary much, which can result in larger e2e delay if not compensated for</t>
          </li>
        </ul>
        <t>The rate_adjust_factor helps to reduce the target rate when the delay in the data unit increases beyond frame_period/4, this allows for some modest queue buildup to ensure a good link utilization. The frame_size_dev calculates the positive deviation in frame sizes from the nominal, this helps compensate for larger variations in frame size, systematic errors in media encoder output bitrate and also to some extent sluggish media rate control loops where the media coder rate lags behind the target bitrate.
The complete pseudo code for adjustment of the target bitrate is shown below. The algorithm parts for rate_adjust_factor and frame_size_dev are suggested examples how to compensate for that frames sized deviate from the nominal.</t>
        <artwork><![CDATA[
# Calculate the rate_adjust_factor and the frame_size_dev for each new media frame.
# The input variables are media_qdelay [s] and frame_size [byte].
# The media_qdelay is the elapsed time the oldest media packet has
# been in the media queue.

# The rate adjust factor is updated with an I (integration) controller.
# Cap values in range [0.0 0.5]
error = (media_qdelay - frame_period / 4) / frame_period
rate_adjust_factor += error * RATE_ADJUST_GAIN
rate_adjust_factor = min(0.5, max(0.0, rate_adjust_factor)

# The frame_size_dev estimates the deviation from the nominal frame size for
# the given bitrate and frame period.
# Cap values in range [0.0 0.2]
framesize_nom = target_bitrate * frame_period / 8
deviation = max(0.0, (frame_size - frame_size_nom) / frame_size_nom)
frame_size_dev = min(0.2, (1 - FRAME_SIZE_DEV_ALPHA) * frame_size_dev +
   FRAME_SIZE_DEV_ALPHA * deviation)

tmp_t = 1.0

# Scale down rate slightly when the reference window is very
# small compared to MSS
tmp_t *= 1.0 - min(0.2, max(0.0, ref_wnd_ratio - 0.1))

# Additional compensation for packetization overhead,
# important when MSS is small
tmp_t_ *= MSS / (MSS + PACKET_OVERHEAD)

# An additional downscaling is needed to avoid unnecessary
# sender queue build-up, better to set the target bitrate
# slightly lower than what ref_wnd and s_rtt indicates
tmp_t /= 1.2 + rate_adjust_factor + frame_size_dev

# Calculate target bitrate and limit to min and max allowed
# values
target_bitrate = tmp_t * 8 * ref_wnd / s_rtt
target_bitrate = min(TARGET_BITRATE_MAX,
  max(TARGET_BITRATE_MIN, target_bitrate))
]]></artwork>
      </section>
      <section anchor="clock-drift-issues-and-remedies">
        <name>Clock drift issues and remedies</name>
        <t>SCReAM can suffer from the same issues with clock drift as is the case with LEDBAT <xref target="RFC6817"/>. However, Appendix A.2 in <xref target="RFC6817"/> describes ways to mitigate issues with clock drift. A clockdrift compensation method is also implemented in <xref target="SCReAM-CPP-implementation"/>. The SCReAM implementation resets base delay history when it is determined that clock drift or skip becomes too large. This is achieved by reducing the target bitrate for a few RTTs.</t>
        <t>The variables and constants are:
* delay_min_avg (0): A long term averaged min queue delay [s].</t>
        <ul spacing="normal">
          <li>
            <t>qdelay_min (MAX_VALUE): The min queue delay measured during an RTT [s], initialized to a very high value.</t>
          </li>
          <li>
            <t>QDELAY_MIN_AVG_ALPHA (1/256): Slow EWMA time constant for delay_min_avg.</t>
          </li>
        </ul>
        <t>The steps for the clockdrift compensation is as follows:</t>
        <ul spacing="normal">
          <li>
            <t>Store the min qdelay (qdelay_min) during one RTT.</t>
          </li>
          <li>
            <t>When an RTT has elapsed:</t>
          </li>
        </ul>
        <artwork><![CDATA[
# Update delay_min_avg
qdelay_min_avg = (1 - QDELAY_MIN_AVG_ALPHA) * qdelay_min_avg +
  QDELAY_MIN_AVG_ALPHA * qdelay_min
qdelay_min = MAX_VALUE # set qdelay_min to a very high value
if qdelay_min_avg > qdelay_target / 4
  qdelay_min_avg = 0
  # Implement the following actions
  # 1. Reset queue delay history
  # 2. Scale down target bitrate by 50% for a period of max(5 * s_rtt, 0.2)
end
]]></artwork>
      </section>
    </section>
    <section anchor="scream-receiver">
      <name>Receiver Requirements on Feedback Intensity</name>
      <t>The simple task of the receiver is to feed back acknowledgements with with time
stamp and ECN bits indication for received data units to the sender. Upon reception
of each data unit, the receiver MUST maintain enough information to send the
aforementioned values to the sender via an RTCP transport- layer feedback
message. The frequency of the feedback message depends on the available RTCP
bandwidth. The requirements on the feedback elements and the feedback interval
are described below.</t>
      <t>SCReAMv2 benefits from relatively frequent feedback. It is RECOMMENDED that a
SCReAMv2 implementation follows the guidelines below. Feedback should forcibly be transmitted in any of these cases:</t>
      <ul spacing="normal">
        <li>
          <t>More than N data units received since last feedback has been transmitted. N=16 has been tested with good results.</t>
        </li>
        <li>
          <t>A data unit with marker bit set or other last data unit for media frame is received.</t>
        </li>
        <li>
          <t>A max defined interval between feedback reports. Values such as 40 ms has been tested with good results.</t>
        </li>
      </ul>
      <t>The feedback interval depends on the media bitrate. At low bitrates, it is
sufficient with a feedback every frame; while at high bitrates, a feedback
shorther feedback interval is recommended to keep the self-clocking in SCReAMv2
working well. One indication that feedback is too sparse is that the SCReAMv2
implementation cannot reach high bitrates, even in uncongested links. More
frequent feedback might solve this issue.</t>
      <t>The transmission interval is not critical. So, in the case of multi-stream handling between two hosts, the feedback for two or more synchronization sources (SSRCs) can be bundled to save UDP/IP overhead.</t>
      <t>SCReAMv2 works with AVPF regular mode; immediate or early mode is not required
by SCReAMv2 but can nonetheless be useful for RTCP messages not directly related
to SCReAMv2, such as those specified in <xref target="RFC4585"/>. It is RECOMMENDED to use
reduced-size RTCP <xref target="RFC5506"/>, where regular full compound RTCP transmission is
controlled by trr-int as described in <xref target="RFC4585"/>.</t>
      <t>While the guidelines above are somewhat RTCP specific, similar principles apply
to for instance QUIC.</t>
    </section>
    <section anchor="discussion">
      <name>Discussion</name>
      <t>This section covers a few discussion points.</t>
      <ul spacing="normal">
        <li>
          <t>The target bitrate given by SCReAMv2 is the bitrate including the data unit and
Forward Error Correction (FEC) overhead. The media encoder SHOULD take this
overhead into account when the media bitrate is set. This means that the media
coder bitrate SHOULD be computed as: media_rate = target_bitrate -
data_unit_plus_fec_overhead_bitrate It is not necessary to make a 100% perfect
compensation for the overhead, as the SCReAM algorithm will inherently
compensate for moderate errors. Under-compensating for the overhead has the
effect of increasing jitter, while overcompensating will cause the bottleneck
link to become underutilized.</t>
        </li>
        <li>
          <t>The link utilization with SCReAMv2 can be lower than 100%. There are several
possible reasons to this:  </t>
          <ul spacing="normal">
            <li>
              <t>Large variations in frame sizes: Large variations in frame size makes
SCReAMv2 push down the target_bitrate to give sufficient headroom and avoid
queue buildup in the network. It is in general recommended to operate video
coders in low latency mode and enable GDR (Gradual Decoding Refresh) if
possible to minimize frame size variations.</t>
            </li>
            <li>
              <t>Link layer properties: Media transport in 5G in uplink typically requires to
transmit a scheduling request (SR) to get persmission to transmit
data. Because transmission of video is frame based, there is a high
likelihood that the channel becomes idle between frames (especially with
L4S), in which case a new SR/grant exchange is needed. This potentially
means that uplink transmission slots are unused with a lower link
utilization as a result.</t>
            </li>
          </ul>
        </li>
        <li>
          <t>Packet pacing is recommended, it is however possible to operate SCReAMv2 with
packet pacing disabled. The code in <xref target="SCReAM-CPP-implementation"/> implements
additional mechanisms to achieve a high link utilization when packet pacing is
disabled. Additional packet pacing headroom can be beneficial if unusually large media frames are generated, this can reduce unnecessary queue build-up in the data unit queue.</t>
        </li>
        <li>
          <t>Feedback issues: RTCP feedback packets <xref target="RFC8888"/> can be lost, this means that
the loss detection in SCReAMv2 may trigger even though packets arrive safely
on the receiver side. <xref target="SCReAM-CPP-implementation"/> solves this by using
overlapping RTCP feedback, i.e RTCP feedback is transmitted no more seldom
than every 16th packet, and where each RTCP feedback spans the last 32
received packets. This however creates unnecessary overhead. <xref target="RFC3550"/> RR
(Receiver Reports) can possibly be another solution to achieve better
robustness with less overhead. QUIC <xref target="RFC9000"/> overcomes this issue because
of inherent design.</t>
        </li>
        <li>
          <t>SCReAM has been designed to target two marked packets per RTT in steady state when L4S is enabled.
 However, SCReAM can settle for a lower number of marked packets per RTT in steady state
 due to measures taken in the calculation of the ref_wnd and the target_bitrate
 that are necessary to get a stable bitrate and lower queue delay.
 In those cases SCReAM may get a lower share of the link capacity
 when competing against e.g. a large file transfer with TCP Prague congestion control.</t>
        </li>
        <li>
          <t>SCReAM has over time been evaluated in a number of different experiments, a
few examples are found in <xref target="SCReAM-evaluation-L4S"/>.</t>
        </li>
        <li>
          <t>SCReAM (+L4S) is currently being integrated in chrome for performance evaluation and comparison against GCC, nightly Chrome Canary builds are available at <xref target="SCReAM-Chrome-Canary"/>.</t>
        </li>
        <li>
          <t>The addition of the optional qdelay_dev_norm related restriction on ref_wnd increase can cause the rate increase to go slower when the non-congestion related jitter is high. Non-congestion related jitter can occur for instance in 5G where the amount of scheduling delay jitter depends of factors like TDD (Time Division Duplex) patterns an overall load in a cell. Improved methods to take delay jitter and compensate for that can remedy this. The objective is to avoid the restriction when the delay jitter is not congestion related. Discriminating between non-congestion related delay jitter and congestion related ditto is however not an easy task. One method to to estimate the jitter when link is known to be uncongested. A challenge is that congestion related jitter emerges already as the application bitrate gets near the congestion point and this can make distinction more difficult. The example algorithm in the draft is expected to be modified in a future draft version.</t>
        </li>
      </ul>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document does not require any IANA actions.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The feedback can be vulnerable to attacks similar to those that can affect
TCP. It is therefore RECOMMENDED that the RTCP feedback is at least integrity
protected. Furthermore, as SCReAM/SCReAMv2 is self-clocked, a malicious
middlebox can drop RTCP feedback packets and thus cause the self-clocking to
stall. However, this attack is mitigated by the minimum send rate maintained by
SCReAM/SCReAMv2 when no feedback is received.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC3168" target="https://www.rfc-editor.org/info/rfc3168" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3168.xml">
          <front>
            <title>The Addition of Explicit Congestion Notification (ECN) to IP</title>
            <author fullname="K. Ramakrishnan" initials="K." surname="Ramakrishnan"/>
            <author fullname="S. Floyd" initials="S." surname="Floyd"/>
            <author fullname="D. Black" initials="D." surname="Black"/>
            <date month="September" year="2001"/>
            <abstract>
              <t>This memo specifies the incorporation of ECN (Explicit Congestion Notification) to TCP and IP, including ECN's use of two bits in the IP header. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3168"/>
          <seriesInfo name="DOI" value="10.17487/RFC3168"/>
        </reference>
        <reference anchor="RFC3550" target="https://www.rfc-editor.org/info/rfc3550" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3550.xml">
          <front>
            <title>RTP: A Transport Protocol for Real-Time Applications</title>
            <author fullname="H. Schulzrinne" initials="H." surname="Schulzrinne"/>
            <author fullname="S. Casner" initials="S." surname="Casner"/>
            <author fullname="R. Frederick" initials="R." surname="Frederick"/>
            <author fullname="V. Jacobson" initials="V." surname="Jacobson"/>
            <date month="July" year="2003"/>
            <abstract>
              <t>This memorandum describes RTP, the real-time transport protocol. RTP provides end-to-end network transport functions suitable for applications transmitting real-time data, such as audio, video or simulation data, over multicast or unicast network services. RTP does not address resource reservation and does not guarantee quality-of- service for real-time services. The data transport is augmented by a control protocol (RTCP) to allow monitoring of the data delivery in a manner scalable to large multicast networks, and to provide minimal control and identification functionality. RTP and RTCP are designed to be independent of the underlying transport and network layers. The protocol supports the use of RTP-level translators and mixers. Most of the text in this memorandum is identical to RFC 1889 which it obsoletes. There are no changes in the packet formats on the wire, only changes to the rules and algorithms governing how the protocol is used. The biggest change is an enhancement to the scalable timer algorithm for calculating when to send RTCP packets in order to minimize transmission in excess of the intended rate when many participants join a session simultaneously. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="64"/>
          <seriesInfo name="RFC" value="3550"/>
          <seriesInfo name="DOI" value="10.17487/RFC3550"/>
        </reference>
        <reference anchor="RFC4585" target="https://www.rfc-editor.org/info/rfc4585" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4585.xml">
          <front>
            <title>Extended RTP Profile for Real-time Transport Control Protocol (RTCP)-Based Feedback (RTP/AVPF)</title>
            <author fullname="J. Ott" initials="J." surname="Ott"/>
            <author fullname="S. Wenger" initials="S." surname="Wenger"/>
            <author fullname="N. Sato" initials="N." surname="Sato"/>
            <author fullname="C. Burmeister" initials="C." surname="Burmeister"/>
            <author fullname="J. Rey" initials="J." surname="Rey"/>
            <date month="July" year="2006"/>
            <abstract>
              <t>Real-time media streams that use RTP are, to some degree, resilient against packet losses. Receivers may use the base mechanisms of the Real-time Transport Control Protocol (RTCP) to report packet reception statistics and thus allow a sender to adapt its transmission behavior in the mid-term. This is the sole means for feedback and feedback-based error repair (besides a few codec-specific mechanisms). This document defines an extension to the Audio-visual Profile (AVP) that enables receivers to provide, statistically, more immediate feedback to the senders and thus allows for short-term adaptation and efficient feedback-based repair mechanisms to be implemented. This early feedback profile (AVPF) maintains the AVP bandwidth constraints for RTCP and preserves scalability to large groups. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4585"/>
          <seriesInfo name="DOI" value="10.17487/RFC4585"/>
        </reference>
        <reference anchor="RFC5506" target="https://www.rfc-editor.org/info/rfc5506" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5506.xml">
          <front>
            <title>Support for Reduced-Size Real-Time Transport Control Protocol (RTCP): Opportunities and Consequences</title>
            <author fullname="I. Johansson" initials="I." surname="Johansson"/>
            <author fullname="M. Westerlund" initials="M." surname="Westerlund"/>
            <date month="April" year="2009"/>
            <abstract>
              <t>This memo discusses benefits and issues that arise when allowing Real-time Transport Protocol (RTCP) packets to be transmitted with reduced size. The size can be reduced if the rules on how to create compound packets outlined in RFC 3550 are removed or changed. Based on that analysis, this memo defines certain changes to the rules to allow feedback messages to be sent as Reduced-Size RTCP packets under certain conditions when using the RTP/AVPF (Real-time Transport Protocol / Audio-Visual Profile with Feedback) profile (RFC 4585). This document updates RFC 3550, RFC 3711, and RFC 4585. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5506"/>
          <seriesInfo name="DOI" value="10.17487/RFC5506"/>
        </reference>
        <reference anchor="RFC6298" target="https://www.rfc-editor.org/info/rfc6298" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6298.xml">
          <front>
            <title>Computing TCP's Retransmission Timer</title>
            <author fullname="V. Paxson" initials="V." surname="Paxson"/>
            <author fullname="M. Allman" initials="M." surname="Allman"/>
            <author fullname="J. Chu" initials="J." surname="Chu"/>
            <author fullname="M. Sargent" initials="M." surname="Sargent"/>
            <date month="June" year="2011"/>
            <abstract>
              <t>This document defines the standard algorithm that Transmission Control Protocol (TCP) senders are required to use to compute and manage their retransmission timer. It expands on the discussion in Section 4.2.3.1 of RFC 1122 and upgrades the requirement of supporting the algorithm from a SHOULD to a MUST. This document obsoletes RFC 2988. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6298"/>
          <seriesInfo name="DOI" value="10.17487/RFC6298"/>
        </reference>
        <reference anchor="RFC6817" target="https://www.rfc-editor.org/info/rfc6817" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6817.xml">
          <front>
            <title>Low Extra Delay Background Transport (LEDBAT)</title>
            <author fullname="S. Shalunov" initials="S." surname="Shalunov"/>
            <author fullname="G. Hazel" initials="G." surname="Hazel"/>
            <author fullname="J. Iyengar" initials="J." surname="Iyengar"/>
            <author fullname="M. Kuehlewind" initials="M." surname="Kuehlewind"/>
            <date month="December" year="2012"/>
            <abstract>
              <t>Low Extra Delay Background Transport (LEDBAT) is an experimental delay-based congestion control algorithm that seeks to utilize the available bandwidth on an end-to-end path while limiting the consequent increase in queueing delay on that path. LEDBAT uses changes in one-way delay measurements to limit congestion that the flow itself induces in the network. LEDBAT is designed for use by background bulk-transfer applications to be no more aggressive than standard TCP congestion control (as specified in RFC 5681) and to yield in the presence of competing flows, thus limiting interference with the network performance of competing flows. This document defines an Experimental Protocol for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6817"/>
          <seriesInfo name="DOI" value="10.17487/RFC6817"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
          <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="RFC9330" target="https://www.rfc-editor.org/info/rfc9330" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9330.xml">
          <front>
            <title>Low Latency, Low Loss, and Scalable Throughput (L4S) Internet Service: Architecture</title>
            <author fullname="B. Briscoe" initials="B." role="editor" surname="Briscoe"/>
            <author fullname="K. De Schepper" initials="K." surname="De Schepper"/>
            <author fullname="M. Bagnulo" initials="M." surname="Bagnulo"/>
            <author fullname="G. White" initials="G." surname="White"/>
            <date month="January" year="2023"/>
            <abstract>
              <t>This document describes the L4S architecture, which enables Internet applications to achieve low queuing latency, low congestion loss, and scalable throughput control. L4S is based on the insight that the root cause of queuing delay is in the capacity-seeking congestion controllers of senders, not in the queue itself. With the L4S architecture, all Internet applications could (but do not have to) transition away from congestion control algorithms that cause substantial queuing delay and instead adopt a new class of congestion controls that can seek capacity with very little queuing. These are aided by a modified form of Explicit Congestion Notification (ECN) from the network. With this new architecture, applications can have both low latency and high throughput.</t>
              <t>The architecture primarily concerns incremental deployment. It defines mechanisms that allow the new class of L4S congestion controls to coexist with 'Classic' congestion controls in a shared network. The aim is for L4S latency and throughput to be usually much better (and rarely worse) while typically not impacting Classic performance.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9330"/>
          <seriesInfo name="DOI" value="10.17487/RFC9330"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
          <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="RFC6365" target="https://www.rfc-editor.org/info/rfc6365" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6365.xml">
          <front>
            <title>Terminology Used in Internationalization in the IETF</title>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <author fullname="J. Klensin" initials="J." surname="Klensin"/>
            <date month="September" year="2011"/>
            <abstract>
              <t>This document provides a list of terms used in the IETF when discussing internationalization. The purpose is to help frame discussions of internationalization in the various areas of the IETF and to help introduce the main concepts to IETF participants. This memo documents an Internet Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="166"/>
          <seriesInfo name="RFC" value="6365"/>
          <seriesInfo name="DOI" value="10.17487/RFC6365"/>
        </reference>
        <reference anchor="RFC7478" target="https://www.rfc-editor.org/info/rfc7478" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7478.xml">
          <front>
            <title>Web Real-Time Communication Use Cases and Requirements</title>
            <author fullname="C. Holmberg" initials="C." surname="Holmberg"/>
            <author fullname="S. Hakansson" initials="S." surname="Hakansson"/>
            <author fullname="G. Eriksson" initials="G." surname="Eriksson"/>
            <date month="March" year="2015"/>
            <abstract>
              <t>This document describes web-based real-time communication use cases. Requirements on the browser functionality are derived from the use cases.</t>
              <t>This document was developed in an initial phase of the work with rather minor updates at later stages. It has not really served as a tool in deciding features or scope for the WG's efforts so far. It is being published to record the early conclusions of the WG. It will not be used as a set of rigid guidelines that specifications and implementations will be held to in the future.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7478"/>
          <seriesInfo name="DOI" value="10.17487/RFC7478"/>
        </reference>
        <reference anchor="RFC8298" target="https://www.rfc-editor.org/info/rfc8298" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8298.xml">
          <front>
            <title>Self-Clocked Rate Adaptation for Multimedia</title>
            <author fullname="I. Johansson" initials="I." surname="Johansson"/>
            <author fullname="Z. Sarker" initials="Z." surname="Sarker"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>This memo describes a rate adaptation algorithm for conversational media services such as interactive video. The solution conforms to the packet conservation principle and uses a hybrid loss-and-delay- based congestion control algorithm. The algorithm is evaluated over both simulated Internet bottleneck scenarios as well as in a Long Term Evolution (LTE) system simulator and is shown to achieve both low latency and high video throughput in these scenarios.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8298"/>
          <seriesInfo name="DOI" value="10.17487/RFC8298"/>
        </reference>
        <reference anchor="RFC8511" target="https://www.rfc-editor.org/info/rfc8511" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8511.xml">
          <front>
            <title>TCP Alternative Backoff with ECN (ABE)</title>
            <author fullname="N. Khademi" initials="N." surname="Khademi"/>
            <author fullname="M. Welzl" initials="M." surname="Welzl"/>
            <author fullname="G. Armitage" initials="G." surname="Armitage"/>
            <author fullname="G. Fairhurst" initials="G." surname="Fairhurst"/>
            <date month="December" year="2018"/>
            <abstract>
              <t>Active Queue Management (AQM) mechanisms allow for burst tolerance while enforcing short queues to minimise the time that packets spend enqueued at a bottleneck. This can cause noticeable performance degradation for TCP connections traversing such a bottleneck, especially if there are only a few flows or their bandwidth-delay product (BDP) is large. The reception of a Congestion Experienced (CE) Explicit Congestion Notification (ECN) mark indicates that an AQM mechanism is used at the bottleneck, and the bottleneck network queue is therefore likely to be short. Feedback of this signal allows the TCP sender-side ECN reaction in congestion avoidance to reduce the Congestion Window (cwnd) by a smaller amount than the congestion control algorithm's reaction to inferred packet loss. Therefore, this specification defines an experimental change to the TCP reaction specified in RFC 3168, as permitted by RFC 8311.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8511"/>
          <seriesInfo name="DOI" value="10.17487/RFC8511"/>
        </reference>
        <reference anchor="RFC8699" target="https://www.rfc-editor.org/info/rfc8699" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8699.xml">
          <front>
            <title>Coupled Congestion Control for RTP Media</title>
            <author fullname="S. Islam" initials="S." surname="Islam"/>
            <author fullname="M. Welzl" initials="M." surname="Welzl"/>
            <author fullname="S. Gjessing" initials="S." surname="Gjessing"/>
            <date month="January" year="2020"/>
            <abstract>
              <t>When multiple congestion-controlled Real-time Transport Protocol (RTP) sessions traverse the same network bottleneck, combining their controls can improve the total on-the-wire behavior in terms of delay, loss, and fairness. This document describes such a method for flows that have the same sender, in a way that is as flexible and simple as possible while minimizing the number of changes needed to existing RTP applications. This document also specifies how to apply the method for the Network-Assisted Dynamic Adaptation (NADA) congestion control algorithm and provides suggestions on how to apply it to other congestion control algorithms.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8699"/>
          <seriesInfo name="DOI" value="10.17487/RFC8699"/>
        </reference>
        <reference anchor="RFC8869" target="https://www.rfc-editor.org/info/rfc8869" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8869.xml">
          <front>
            <title>Evaluation Test Cases for Interactive Real-Time Media over Wireless Networks</title>
            <author fullname="Z. Sarker" initials="Z." surname="Sarker"/>
            <author fullname="X. Zhu" initials="X." surname="Zhu"/>
            <author fullname="J. Fu" initials="J." surname="Fu"/>
            <date month="January" year="2021"/>
            <abstract>
              <t>The Real-time Transport Protocol (RTP) is a common transport choice for interactive multimedia communication applications. The performance of these applications typically depends on a well-functioning congestion control algorithm. To ensure a seamless and robust user experience, a well-designed RTP-based congestion control algorithm should work well across all access network types. This document describes test cases for evaluating performances of candidate congestion control algorithms over cellular and Wi-Fi networks.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8869"/>
          <seriesInfo name="DOI" value="10.17487/RFC8869"/>
        </reference>
        <reference anchor="RFC8985" target="https://www.rfc-editor.org/info/rfc8985" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8985.xml">
          <front>
            <title>The RACK-TLP Loss Detection Algorithm for TCP</title>
            <author fullname="Y. Cheng" initials="Y." surname="Cheng"/>
            <author fullname="N. Cardwell" initials="N." surname="Cardwell"/>
            <author fullname="N. Dukkipati" initials="N." surname="Dukkipati"/>
            <author fullname="P. Jha" initials="P." surname="Jha"/>
            <date month="February" year="2021"/>
            <abstract>
              <t>This document presents the RACK-TLP loss detection algorithm for TCP. RACK-TLP uses per-segment transmit timestamps and selective acknowledgments (SACKs) and has two parts. Recent Acknowledgment (RACK) starts fast recovery quickly using time-based inferences derived from acknowledgment (ACK) feedback, and Tail Loss Probe (TLP) leverages RACK and sends a probe packet to trigger ACK feedback to avoid retransmission timeout (RTO) events. Compared to the widely used duplicate acknowledgment (DupAck) threshold approach, RACK-TLP detects losses more efficiently when there are application-limited flights of data, lost retransmissions, or data packet reordering events. It is intended to be an alternative to the DupAck threshold approach.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8985"/>
          <seriesInfo name="DOI" value="10.17487/RFC8985"/>
        </reference>
        <reference anchor="RFC8257" target="https://www.rfc-editor.org/info/rfc8257" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8257.xml">
          <front>
            <title>Data Center TCP (DCTCP): TCP Congestion Control for Data Centers</title>
            <author fullname="S. Bensley" initials="S." surname="Bensley"/>
            <author fullname="D. Thaler" initials="D." surname="Thaler"/>
            <author fullname="P. Balasubramanian" initials="P." surname="Balasubramanian"/>
            <author fullname="L. Eggert" initials="L." surname="Eggert"/>
            <author fullname="G. Judd" initials="G." surname="Judd"/>
            <date month="October" year="2017"/>
            <abstract>
              <t>This Informational RFC describes Data Center TCP (DCTCP): a TCP congestion control scheme for data-center traffic. DCTCP extends the Explicit Congestion Notification (ECN) processing to estimate the fraction of bytes that encounter congestion rather than simply detecting that some congestion has occurred. DCTCP then scales the TCP congestion window based on this estimate. This method achieves high-burst tolerance, low latency, and high throughput with shallow- buffered switches. This memo also discusses deployment issues related to the coexistence of DCTCP and conventional TCP, discusses the lack of a negotiating mechanism between sender and receiver, and presents some possible mitigations. This memo documents DCTCP as currently implemented by several major operating systems. DCTCP, as described in this specification, is applicable to deployments in controlled environments like data centers, but it must not be deployed over the public Internet without additional measures.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8257"/>
          <seriesInfo name="DOI" value="10.17487/RFC8257"/>
        </reference>
        <reference anchor="RFC8888" target="https://www.rfc-editor.org/info/rfc8888" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8888.xml">
          <front>
            <title>RTP Control Protocol (RTCP) Feedback for Congestion Control</title>
            <author fullname="Z. Sarker" initials="Z." surname="Sarker"/>
            <author fullname="C. Perkins" initials="C." surname="Perkins"/>
            <author fullname="V. Singh" initials="V." surname="Singh"/>
            <author fullname="M. Ramalho" initials="M." surname="Ramalho"/>
            <date month="January" year="2021"/>
            <abstract>
              <t>An effective RTP congestion control algorithm requires more fine-grained feedback on packet loss, timing, and Explicit Congestion Notification (ECN) marks than is provided by the standard RTP Control Protocol (RTCP) Sender Report (SR) and Receiver Report (RR) packets. This document describes an RTCP feedback message intended to enable congestion control for interactive real-time traffic using RTP. The feedback message is designed for use with a sender-based congestion control algorithm, in which the receiver of an RTP flow sends back to the sender RTCP feedback packets containing the information the sender needs to perform congestion control.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8888"/>
          <seriesInfo name="DOI" value="10.17487/RFC8888"/>
        </reference>
        <reference anchor="RFC9000" target="https://www.rfc-editor.org/info/rfc9000" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9000.xml">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="RFC9332" target="https://www.rfc-editor.org/info/rfc9332" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9332.xml">
          <front>
            <title>Dual-Queue Coupled Active Queue Management (AQM) for Low Latency, Low Loss, and Scalable Throughput (L4S)</title>
            <author fullname="K. De Schepper" initials="K." surname="De Schepper"/>
            <author fullname="B. Briscoe" initials="B." role="editor" surname="Briscoe"/>
            <author fullname="G. White" initials="G." surname="White"/>
            <date month="January" year="2023"/>
            <abstract>
              <t>This specification defines a framework for coupling the Active Queue Management (AQM) algorithms in two queues intended for flows with different responses to congestion. This provides a way for the Internet to transition from the scaling problems of standard TCP-Reno-friendly ('Classic') congestion controls to the family of 'Scalable' congestion controls. These are designed for consistently very low queuing latency, very low congestion loss, and scaling of per-flow throughput by using Explicit Congestion Notification (ECN) in a modified way. Until the Coupled Dual Queue (DualQ), these Scalable L4S congestion controls could only be deployed where a clean-slate environment could be arranged, such as in private data centres.</t>
              <t>This specification first explains how a Coupled DualQ works. It then gives the normative requirements that are necessary for it to work well. All this is independent of which two AQMs are used, but pseudocode examples of specific AQMs are given in appendices.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9332"/>
          <seriesInfo name="DOI" value="10.17487/RFC9332"/>
        </reference>
        <reference anchor="Packet-conservation">
          <front>
            <title>Congestion Avoidance and Control</title>
            <author initials="V." surname="Jacobson" fullname="Van Jacobson">
              <organization/>
            </author>
            <date year="1988" month="August"/>
          </front>
          <seriesInfo name="DOI" value="10.1145/52325.52356"/>
          <refcontent>ACM SIGCOMM Computer Communication Review</refcontent>
        </reference>
        <reference anchor="LEDBAT-delay-impact" target="http://home.ifi.uio.no/michawe/research/publications/ledbat-impact-letters.pdf">
          <front>
            <title>Assessing LEDBAT's Delay Impact</title>
            <author initials="D." surname="Ros" fullname="David Ros">
              <organization/>
            </author>
            <author initials="M." surname="Welzl" fullname="Michael Welzl">
              <organization/>
            </author>
            <date year="2013" month="May"/>
          </front>
          <seriesInfo name="DOI" value="10.1109/LCOMM.2013.040213.130137"/>
          <refcontent>IEEE Communications Letters, Vol. 17, No. 5,</refcontent>
        </reference>
        <reference anchor="QoS-3GPP" target="http://www.3gpp.org/ftp/specs/archive/23_series/23.203/">
          <front>
            <title>Policy and charging control architecture</title>
            <author>
              <organization/>
            </author>
            <date year="2017" month="July"/>
          </front>
          <refcontent>3GPP TS 23.203</refcontent>
        </reference>
        <reference anchor="SCReAM-CPP-implementation" target="https://github.com/EricssonResearch/scream">
          <front>
            <title>SCReAM - Mobile optimised congestion control algorithm</title>
            <author initials="" surname="Ericsson Research">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="SCReAM-evaluation-L4S" target="https://github.com/EricssonResearch/scream/blob/master/L4S-Results.pdf?raw=true">
          <front>
            <title>SCReAM - evaluations with L4S</title>
            <author initials="" surname="Ericsson Research">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="SCReAM-Chrome-Canary" target="https://www.google.com/chrome/canary/">
          <front>
            <title>SCReAM - Chrome Canary nightly builds</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="TFWC" target="http://www-dept.cs.ucl.ac.uk/staff/M.Handley/papers/tfwc-conext.pdf">
          <front>
            <title>Fairer TCP-Friendly Congestion Control Protocol for Multimedia Streaming Applications</title>
            <author initials="S." surname="Choi" fullname="Soo-Hyun Choi">
              <organization/>
            </author>
            <author initials="M." surname="Handley" fullname="Mark Handley">
              <organization/>
            </author>
            <date year="2007" month="December"/>
          </front>
          <seriesInfo name="DOI" value="10.1145/1364654.1364717"/>
        </reference>
      </references>
    </references>
    <?line 1376?>

<section anchor="acknowledgements">
      <name>Acknowledgments</name>
      <t>Zaheduzzaman Sarker was a co-author of RFC 8298 the previous version
of scream which this document was based on. We would like to thank the
following people for their comments, questions, and support during the
work that led to this memo: Per Kjellander, Björn Terelius.</t>
    </section>
    <section anchor="changes-in-the-draft-versions">
      <name>Changes in the draft versions</name>
      <section anchor="changes-in-draft-version-02">
        <name>Changes in draft version -02</name>
        <t>Algorithm changes in draft version -02 were:</t>
        <ul spacing="normal">
          <li>
            <t>Slow down reference window growth when close to the last known maximum value is disabled
and when L4S is active. This makes SCReAM adhere more closely to two marked packets
per RTT at steady state.</t>
          </li>
          <li>
            <t>Reference window decrease and increase reduced by up to 50% when ref_wnd/mss
is small. This reduces rate oscillations.</t>
          </li>
          <li>
            <t>Target bitrate down adjustment when ref_wnd/mss is small is modified to
avoid that the data unit queue grows excessively in certain low
bitrate cases.</t>
          </li>
          <li>
            <t>Timing set to multiples of RTTs instead of seconds.</t>
          </li>
        </ul>
      </section>
      <section anchor="changes-in-draft-version-03">
        <name>Changes in Draft version -03</name>
        <t>Draft version -03 is a major editorial pass including removal of some
outdated or background information and reorganisation of several sections:</t>
        <ul spacing="normal">
          <li>
            <t>Much shorter abstract and introduction focusing on what's new in SCReAMv2.</t>
          </li>
          <li>
            <t>Removal of Section 1.1. on "Wireless (LTE and 5G) Access Properties" and
Section 1.2. on "Why is it a self-clocked algorithm?"</t>
          </li>
          <li>
            <t>New Section on "Updates compared to SCReAM (version 1)" in introduction
based on old Section on "Algorithm Changes".</t>
          </li>
          <li>
            <t>Section <xref target="ledbat-tfwc"/> updated and shortened.</t>
          </li>
          <li>
            <t>Overview Section <xref target="scream-overview"/> revised; now also including the overview
figure and the basic algorithms.</t>
          </li>
          <li>
            <t>Old section on "Constants and variables" removed; instead all variables are now listed
in the respective sections that explain the code.</t>
          </li>
          <li>
            <t>New Section on "Sender Side State" explaining some basic variables.</t>
          </li>
          <li>
            <t>Pseudo code and the corresponding explanations in Section <xref target="network-cc-2"/> on
"Network Congestion Control" moved into the respective subsections in
section <xref target="reaction-delay-loss-ce"/> on "Congestion Detection".</t>
          </li>
          <li>
            <t>Separate section on "Sender Transmission Control" introduced.</t>
          </li>
          <li>
            <t>Section "Lost Data Unit Detection" merged into Section <xref target="reaction-loss"/>.</t>
          </li>
          <li>
            <t>Section "Stream Prioritization" removed.</t>
          </li>
          <li>
            <t>Section on "Competing Flows Compensation" moved into Section <xref target="reaction-delay-loss-ce"/>
on "Congestion Detection".</t>
          </li>
        </ul>
      </section>
      <section anchor="changes-in-draft-version-04">
        <name>Changes in Draft version -04</name>
        <ul spacing="normal">
          <li>
            <t>Restructuring of code.</t>
          </li>
          <li>
            <t>Reduction of target rate when bytes_in_flight is higher than ref_wnd is done also when l4s_active, replaced with requirement that queue_delay is large.</t>
          </li>
          <li>
            <t>Additional constraint for increase of ref_wnd added.</t>
          </li>
          <li>
            <t>Discussion on when it is beneficial to reduce REF_WND_OVERHEAD added.</t>
          </li>
        </ul>
      </section>
      <section anchor="changes-in-draft-version-05">
        <name>Changes in Draft version -05</name>
        <t>Draft version -05 contains some clarifications based on a review by Per Kjellander
 and Björn Terelius plus some code modifications and text.</t>
        <ul spacing="normal">
          <li>
            <t>l4s_active state removed as delay based congestion control is always active.</t>
          </li>
          <li>
            <t>ref_wnd reduction when long time since congested limited to only limit ref_wnd to last max_bytes_in_flight_prev.</t>
          </li>
          <li>
            <t>Calculation of l4s_alpha is modified to use a fast attack slow decay EWMA filter.</t>
          </li>
          <li>
            <t>Congestion backoff downscaling also for virtual L4S marking when ref_wnd is very small.</t>
          </li>
          <li>
            <t>Congestion backoff is reduced if RTT is higher than VIRTUAL_RTT.</t>
          </li>
          <li>
            <t>ref_wnd increase is reduced if L4S is likely non-active and queue delay increases.</t>
          </li>
        </ul>
      </section>
      <section anchor="changes-in-draft-version-06">
        <name>Changes in Draft version -06</name>
        <ul spacing="normal">
          <li>
            <t>Correction of typos.</t>
          </li>
          <li>
            <t>Correction of send_wnd calculation.</t>
          </li>
          <li>
            <t>Additional variable qdelay_dev_norm that indicated how much the queue delay varies.</t>
          </li>
          <li>
            <t>Additional ref_wnd_overhead varable to limit how much bytes in flight can exceed the reference window in congested situations.</t>
          </li>
          <li>
            <t>REF_WND_OVERHEAD replaced by REF_WND_OVERHEAD_MIN and REF_WND_OVERHEAD_MAX.</t>
          </li>
          <li>
            <t>Reference window increase is restricted additionally when queue delay varies a lot.</t>
          </li>
          <li>
            <t>rel_framesize_high calculation is removed.</t>
          </li>
          <li>
            <t>Reduction of target bitrate when bytes in flight is high is removed because it is not helpful when media coders are sluggish.</t>
          </li>
          <li>
            <t>Calculation of l4s_alpha_v_t simplified, l4s_alpha_lim_t removed.</t>
          </li>
          <li>
            <t>Bug in condition for calculation of l4s_alpha_v_t fixed.</t>
          </li>
          <li>
            <t>bytes_in_flight_ratio removed.</t>
          </li>
          <li>
            <t>Moved Changes per draft version to this appendix.</t>
          </li>
        </ul>
      </section>
      <section anchor="changes-in-draft-version-07">
        <name>Changes in Draft version -07</name>
        <ul spacing="normal">
          <li>
            <t>Additional restriction of ref_wnd increase and ref_wnd_overhead when ref_wnd/MSS is very low.</t>
          </li>
          <li>
            <t>Additional compensation for increased media queue delay and frame size variation when calculating target bitrate.</t>
          </li>
          <li>
            <t>Changes in text on feedback.</t>
          </li>
          <li>
            <t>Section on handling of systematic error in media encoder output bitrate removed as this is adressed in section Media Rate Control.</t>
          </li>
          <li>
            <t>Added section Clock drift issues and remedies.</t>
          </li>
          <li>
            <t>Removed '*= max(0.5,1.0-ref_wnd_ratio)' as this function is replaced by qdelay_dev_norm related restriction on reference window growth.</t>
          </li>
          <li>
            <t>Removed extra selective restriction on ref_wnd growth when L4S is not enabled as this function is replaced by qdelay_dev_norm related restriction on reference window growth.</t>
          </li>
          <li>
            <t>Additional wording on the improvement of the optional qdelay_dev_norm related restriction based on extimation of the non-congestion related delay jitter.</t>
          </li>
        </ul>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA8V923bbWJbYO77ixF6ZEl0kdfGlXOp2JSpJdqnHst2SXNWT
WR0tkAQllEmABYCS1e6az8pTnpIfy76esw8Ayvb0JNGDLZHAue77dTQaJbNy
WqTLbN/NqnTejH4tr9OirstiNJ3eXo2q+fT53vfPJ3k9qqdVli5v9kY73yVN
3izglfNsMR8dLsrph2zmztImcwezdNWkTV4Wbl5W7nS9aPJlNsvTJJ1MquwG
3jk8yw5Ob/aSclKXi6zJ6n2HUyTTtNl32cdVkq+qfddU67rZ29n5fmcvub3a
d4eHv7xKUljBvvvl5CKp15NlXtcwT3O3gpWcHF+8TJKbrFhn+4lzV1W5XsFL
ZXGV1bQa+LWpyoX7paw+5MWVe4VPuC3c5ABeWKb5Yt/hX/81z5r5uKyucJi8
uV5P9t3VosyL9WK794j4XEZwREmSrpvrssIVjBL4B3/yAjZ4MnZ/0rfkcz70
E1jgMq0638L8++64yqfms4wXmfMr43rsF/JfM3lyPC2XNLmZ252O3S9wClm1
WBezaPbT9KpY191v75l9Sa+Mb/0rn537n//3/7xeZLd5e+68+jXtfnnf1PjG
+MM6kzfimZO8AIhbAuzdEAi4s5eHe7u73+vvzx4/e6q/f/fku+f6O8Ke//3p
7q7//dn3/t3n8If//fvnT8O7T78Lzzz343y/s7Pjf3/8eG+fgOFdCnjSjKZl
UWfVDSHJvuxQ8MnA68FNmc/SYpq5tJgp9MrTAcrkZxR+lYP/GQAunSKKFfY7
Pvqf06L9bZXNYV1NVgAOHhyeuvOTV4dvT09h4uVqDTeNvyzXRT5l3D7LbvLs
Vt6F3eRZjcdvlnT09mTf7e6Md3efPN1+uvd47+kY/n36TJ6YAbGAmdZXgOVu
9/vnz+mEXh8f/XhwMZpli/RulC9X6bTZ37Bnu2Xa8dHYnZW1+ZT3epTe5LPo
m86bhB+Lvy06757m0+s0W0Tf2oM6OT4+jg+mdq+zBo6rHrqfy8XY7X43dG/K
sXs6/LKz2vl++zWe+3hvZ/fxeOfJzh78t/sY/vguOrjT9M7hIzH4HNR1BjQR
qBsf5De1O8KjdCd0lPpwWl1lsPrrplntb29fl8tsnM/z8Tovx0W5vcRN32bb
VVZnaTW93l6tJwvd3vYim03SRu5mtODNjlezOd3fn8vz0eNX7961wPrBuxJG
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
kaEs6QBZZBveAEKU6uKtCkkrxSEknBHfdJZvknlGKMpGJji7d+43npPCHu8Z
4823j5k/9tx9fCIJ2UnpPBxMli68ly/mmvWXsM033wKPfPPtHjNKWMTYJn75
HCpidupF08ocIGHdiu7mvS0ZG/LRajB02fhqPDT4APN41okB6TWtM/F5Sjqu
cg2pLKLQZ8+ELK9d4EHAzVEtDgH7nWdQVNfULWWwAth83J4kcRa6N7a7OIuV
ETjRvDLvW4+uTjWVzipTdrMzyvwtq0pvrFaWzbv/Ku/haK+tm4pKVn9WueSb
jI1fnfSdDT4/NGd2vI3qFN/Er0UNNDs6Uv/APhfXGIbwhlAeQsgmxsmzEUTq
tVHezTSD/R9+1pWChn+Vyz0OllXN2ZivEdYN3ugIQ86i3EC2w0TCClCytE4X
ri8hg8T+MNf2hwWXFggt3SQsFk2QWaErV1AelHPK89LNcKBzBaMfvDmS7I+0
SRYZEj0U+X4+Obt4f/D68uziYkj2yMHnsr/EuWqTH5LPuRMjRxdCR70sMVNK
jaUPEQjk5rF0HD5rolrsReMV/77BCYQUfFTO55rwQVZiWjRbALNFDmBIhnpH
yeEhwifpZOlgtuVZVpSsHghDGNPH6LT2RnetX+BN5rdwZ1kyz2HsP7A0lUvW
PFtiMWlfAsV9sYa8mINciSYysRUDZcoX9HYYjljYhJTHoKONTTanWKU5Bw2N
ikOppqGzEXpTdAZGN4WEZeUkIM5xYQiCpZs0X3COv26tUlNQCWQKRR5MoCMI
oPd5uxng1LThDcPFm6R1iagqqZIIIgzlO11V6YT9cKCfpFP4NCGPRUo5poyx
tH1axhyV24syZMpn4s5Bis8AbrJXCAqyJmm5hPuN9yHcS9N3uxCBMk1i4YrQ
EEA4JhjBzdmp7bNJMSZZFuQPoLdkj+UiPbQwydcJEfGc6sF0IMxpXmR5v8qv
ruhvu2Il3+1JQs0nTR4kWR1HjlgpsgRQVgkUKb32jMwuKA9GUs3WGXwi9Xqw
YKlGI8aqrXCYnsUs01kWfFIg7rCAQYZ0kkTmi/RKhQTRA5LN1jkMWqIXairG
kc8/fxlJsHB4izg77cKZk3+LCl6OUVZErlkFtSseIAluX3Sm4R7aHIQkI3gr
y3yi2Ewkwqbv1hIjTZMrgyNMWs9KOtvGe1dPZNKyVeWSmW9tVgx0PR6CWyoA
VEnhKZYVi1nSeidsUUTelApYoEdkvl6QR4B3PWZub5k3srqk5wI4yspYxBBb
vV/SB0eFOSV8sHMWAxW/irZu6h2qbTjBChZRQJQws6CRi6xAw1hRwDK1bFqw
2IJeJxtFU848rdJQCYw7MXES8CvT7i0M3rjEMlubYiTa7DGlIgZyO+hlAgJD
YWwa8JQLrtWJFTkEm0gfoazzICsjXUDnzCIqeoAljTlDlh12iQkQClIOwsyt
zsw2MKvmGdJalSvz2sYTl/J/kfDwRMTDi94zJUMxZvt9QVyQzaJDiQYFGQ5K
xrF4KDOOwTIHq7hMMVpGVaec5Objj7BXLL9BYsUvGcrHsKjTkjZ1gOUPr+Ca
j385PRggQ2zQYJiE0l4bFur6F6o3iFeV0AWiFs1lurg2gtQHe0qlCkycGzvp
4hRtUF9CFGUb7kJ4G+eWU60yjqwE9ZCYDm2ZeOsmUZLSQbku2On5OZXnUVfo
EMOWKWrAF3ZHg8xv65z0RpZUVAYSqWfojCO1brJVnOCOTsymrDZsSCJ4qEoV
I5+qbVTyheuQ0aGiqywI0ACq/u57w54B9oKqFKkVi5xTALfYwIgXO0hiU91t
erfPcQfGxuXfvEQJCQV89+2LjhHMvsGD3/s4qK7JQxdtRZlQSmnbNdkAqju3
u7OsMRBnCytXjUihuORHL/3rl0Slf3hB+sjOeGdXFJHEudYk5rxIwAnrUlgH
rq06pqCp8yjhd+aiHbX2q4WZ2z/3nmlCa8UKuXcSOQYH0aAEUC+4TAhodoi4
WEkKTqO7JNi+3+qAlxC2/gLp2OXBz68uX12+f/eo+/a3Dm33I/vU4NEC/qL3
0dK/qLPuqK2Xjt7+8sa+RiW2Nl7YC6xGlnzmYOCpnfiZNnjxAzRPa1/wVWen
SQYihUTM+NglW0WknEtZQtwhmdnR8sp6S+MIJvFGtKrcMNGoU5Fn0DFvpYsC
7VeoH4WYJ6JGRFUiZolUSazu/X5X0hTJjh7uQNw2Sty/jHrTEJsvhmy2r8lj
i3+GyVDw8qbX+q9tc3jP7dFQh2ImQ34aCFHLVn3PDUeDhAGMHaff/N0LE3Jg
/qC6p4RCCW6ed9q+EXR0NKlWGMEbkQKXHnEAK7afwxRfx4456JNqygSKJdbm
eAbEMpxjd+8/ZhatQSS1oGJciMjnrCyCxeEeIiXChZQsRlaKSOLSKCUCgJF6
XRBb1JSHSdk0i6zIsFzJdXrDBvEeUa9r8jnx8X6cwsSFddsGPlupwdQRSFnD
6VTcCVUFNAWdg0DQAwdiwLROcNHmeV2pz/dI+QI2mugowC8xwed0ZP5v1TZB
YOBSLJf8xvaedwiY2VE+B/E8kWveCnh9MzABzlzoCaCFeOAODr67s/OfUZOS
SdKbK3eFfm58ImnP3F6M1Mf2O+VNboWxfA0DFIxMdlsUrNZz6hjSNqILpMii
OtQ/4JjOYVKvZzPU5mhG8sDWqpyg28AHxqHdlEIYMWmuAuHMRswgNJmNG2FE
VDcCbwb1IcN9B9bjMiVk15IYzn7hJcwXSS83edWs0wWSPSvEHPrSpuE9kQTk
tP9ovmH2b3b0Qv6wfDz6+s9Hx68P/oXpyyMZUUQC+9XgUTQ9slJa3tuVz2CZ
ZXEpVrxin9SHFiyDB6bCXFrQQCdRJRHrRscAs7SKRGHe/9nx0fvD48s/nVxc
HJ+5Fy/IWC0CkF+GHjfWzd8ayNLdvRfC0omRFr6ALSvkI4P5RSmAxMeJWSJU
/+FYTXkllk3T2urASVTy7UBfqcmeTLLEpOF4OZ/n4K1SLU/hOOGIQSlKj1qU
ryIo5ccK7zBbhVX3DNQSIdrH15IhDLT1CRHK54k1nxvTPj4xDIE9io9iTAzR
nmQdc3GhID42Lk/9eS5OF2iBHVnsk3+AwRpUgZFjMN2ap4CHMPhWKagzwCXN
8ysHxzwJlg4NXmcig4ZYU4PMBIZK/IBG9AFrq7ACNC0Ey19mZFbk5GVgvzlV
GUcrVvrBw3NIu9W69RrXgeXBOToQJ78q04XU8CXaLGbvUqhwGGvIofhkaiJq
HCgwx0yj2TSuadMizLZwL6U9pVOfATNFQhmTkzCdoRNiM55l4m3wqa+p+mRc
3CSH5mTJHyvUo/sJozRAM6RGDinc1l2d+5iNEHslUKbEQSFglt0Q4THG3Cje
wEoG+C4qFdTgY0HF22CvApZHxz9fvnl7dopEgLNFl9SHqP399hOyzOim1LJL
fgugRjVW/xbXibmRDnftu5CW2SQVL213OsPl28eANhAkAfgY61OS+r3gaHgJ
m6fCoSjpty5THU8c0CsIJ6mdpEe1TuPy4icme17+0bASNN5tY7QaCll0niJT
VVKG9lqLMdvSlxQs5A1/NLEsS7MFQ8I6IZxBLizQlSOVJ+kLiyLRtDoeH4Gk
MVsRMPK0aQwbG45gOTvjXcNJbc1D4j9A52bYkwIuII/ytWx1TNefC8kijK+d
t5mh9sgo/sI5U5Xq/WIEbub+dQfjBLv39Gh3/PSvGOO1XAH/hX1uwWMoFvU/
OlTpZ9RBgMF266MBLrK9sBeRiIOPspjjHnUelToq7UfhSVjsV4gJ/+t/BEEh
jE7c8svJg7ufPHwdswt7AYb37D+A4+muWnPg0ojF7z2VYEzdhdRM/pqBAALo
7tD0YVBF8/IIX7TxDOMWFhQlxdVHs/o8QlEmuYRyRtrkS0rzO7TF1D89nOrX
I6pBMrK11tH1wiU/bFAmFSvhWF3SZlGJoVwrE6lpNN5QADaZS4XjlGr0quqc
Xl1RuttNb/OLIA5smYiDYcL09eXFO6mdwrGovSVmQwIy3dBtWXEAh4Qusf8m
8bQlLN7m9yB5SfPFiP0smKUkchsvZLJG/yDlRJg+TY1Y4vh9SkgKdULIWUV5
sBpFGymgwamu3n5fwM6H3YQyj+Lx5WYcQTAQWsfTXEbjC5kxJATBkuzAIitt
K4BeHJy9Or64fP32F3g4lo3pHeATAOV3W9E4QkClyAVRDc4TsE/BxzTjzwdn
JwdvDo+3+obd29kZhNE87FIUkQduyXSMJhXtvTUnifMw58HPx2cHr/qnfGpn
xKHa4Vt8RaqAFtmtnKo5Pzvbt67+rWq2OlsftF9+9KJz6KITIiRcksfxkjjw
D8Aid3b2WCt8GEITCQey4CC2irEs+4UDRgNU3s5s1eiggttb+iNMKNPhhGfG
a5XOmQygUYen8Lp53+ytea0hHo/8GlEPQxHMIatgKrFTf6DQFnedLVa1xnz4
Adhibd4lkxCn2UkTKAyPRSOcyGcoGQGsyAhk3LCX8sfOnegx0MlrufNoTskD
HHIxHSqBPNNCOeZlrylbNy/bz/Sh9umhCBF/9ghuBgQHu2ZdoDnZzWtFU9Di
bsOEAJE74+91OGkHzP97Wwn7eDi3PulZcZB25AR/OhnGTw36XoONtg++81ok
odyWVkJRAx17F1roI3o5vhlS/K2nAcsfMI1fxFGPpJJLFRGY+rZ0oRpLLBwF
68e4hyZIJBU6R0fUb0fIVaz+dfGw/Z6nrSoCm0IiqFURoPcM0w3jsVKZ9NsS
RAPswyy7NMoIoPcMt5yAHHKbz5prG+SoNbJTQ6uRkyUY+IZcCdu0kaIpyYJ5
Z2khnkUJDfOz9mYFqCkwFEWUr94zLTt0riGTPkdTs4seY6MXaAjd+PoCmx+h
qo1dROhhigrXN9IkPgQntXBUADCHKYYIFpepcwAPMWvReWzIUhFPIjlmiJKA
BixL8XK7RkmxSu/sTglCyKqSIFQhHcqXWs7Ovi2oSRnFvq/UxNYlANopQb4M
oxpg5+MrORa3U9fGBQk5BnUUYhw1Kmyo5ESo7+ID0foBDMjHHWflZzUF6J5w
jWyOAyV1fLgBgji+SrakmoeqizxZp/XBZXhVWh6RhkgwsOKeEI4MZMmqJGOF
tIGiz4B0X9FliJ4cMvypzQj2kMinrVxeCdcKvRK8oCwbp5GpOHFUd1wSN+pM
KIY/NStrBrlaDBK4SF04rxHjVeu8kcWORiGV2NSUmlNNaDKjNRqCZye3l6Zz
4lhh1kSPBu7h+GODlh4sf5IvxZ8nLjWWgj1amqpW7JGTynaAHK8vjungn75K
GsxKkf6lxcwTG0LZzntyq57IjdR+EZDWDsiRbZ3N1a3+JquyYaWUjmpdKRFP
IjMotTzhIFHsjIoBgWsMzSqx6slB63rcFlcqI/1hM/xwjCaF9kQtjrggtcUk
LEVRJyYkCeAZKCM1C5M2FKYtgdACJWkqD3Y8JEkoa0LRkMVs1JQjLEsjqFgG
85RtTYZVKObCE2ZZhql63PpEFdTW4pkuktuNTUcYrBDujErZdAokTLJQV1zz
RSQWsFlX6JYo5/Oxe1tkrNVNpeMg9lmX+hvwLMgAFRn/sFW65udznQstThGg
0QCG3JxU+dKFnyAeF1kzlDiLVtqKUEVfiwddG6wkoew5TCg5SSP0DU+1BW4o
Wo2YrNTPpxGlzljqZ8u1Pxm3GiGCWnJRu/bhs2Wg59xty8EEz5QBJipWgVGZ
WlzFZAMzaqVrMddS7igCE4IgOmOpHykBKiUP2QIvhtx52U5pnq2Vg+qNhrf9
wuFtkleKzvf56BaglRXhTVkX4m+SkvuAGSAnUisDhhppKtNTiS2RAdpJtxJZ
v4Ux2Hj2yEcHyvS5NQQ3S2C/EU6cF2uOqg5m4r7Ivc8E6Ejd+32TXu22Tk/e
XJ4dv7z85c0RJli3d28yKNUwlbut3b5H2w2S7Lsxa+0oAzBc3HeIHGtp21kR
FCqK7ZQOTVLkskCJ29a00fjheORbYuQkO9zmpFKh3HWThXBvYl1r7ktBJCGv
puslp8/DtXHCH7IB6YwUGhA5IzlvIlNiu/rtHjkMdo06nIaltw+LYKSthQWX
Z4C0S9Vuep2enaJ1xuNJA2lsymVT2kE/Mxa5VliJQYjuDipApK7ZvuECpHXd
sf0VQLpGZLeFT9hcGTYRDDV8HlsJFySK1u7B1uDBMFH7bDzYTPQfsj2EluD1
wJqpw+WgOvoM9VG+WXaD6MiaXS+3ryfTvkwc5MnGMcTBYsYgBw8WBtBqsMaN
2ElYjMz3bSNPbI8YhOKpXi0w5ZSoMlFLPApkGENTe+SkaMZQrkIN0DRZjnKU
+g/YPgSKDQxIJ6GcgjHZixYduYN6raAE2FsAF9vIFr3RVIuyXGH91vXVVV5f
0wUZIum2Hu/sILieyl12GIYhez/+y8Xx+SW8/PL1yauf4GqPD44uz96+PUX3
wFNyZmD2LZr5qxLAC++4m0IK42DuA9a6RMj4bhDKU3I0vjgnOmmB4V1MSYBX
n3/mVZ8vwbvG+XZltwJ1dUbt1rkayAv82CiydSitQwO8e3t+cXn49s2r43Ns
q3TJYI6BEzjsYJ8C5KipYB2q9pK5RgPOo/x+zbPZ0JANM7+vVa9nqWLNoZan
71/DJRyeHR+cH1++PDi8eHvGvp6eJSBmbHGPbmND8pWHQ5tfU3akCFBog1hP
zi8xAM+HUxz2xJCtKGGT7hufxYwYetckrga31M8cf6WhJ1oHmGL9pO34NzV9
i4XzCi+e0pJZjJOmtRfEX5DR2Ynk+Lj2HslaWJOP0u+lCN8Npw/hUldpE5Dj
z++P3x9fBi/Y+eHB62Nc+C5jimdvCHVSwE3PT+ICpVmTKgoCy+STaXncQkpM
S7I700wMdpYEo7/Oarx4PY3H0RJARegeisxm00Up6JZFcV/TVDvCGih9aJiX
CdXT1rFkgoM7xvwCtGN6zoub7wQZt81cUqUTXsbLkGeozyMWZaC85s9x7qSe
Lsi1ocW0R369g1AX5zKX5x69cM/9K/IR/+8/JUf4eJdd4VRih74ZDJLEezv8
Nv/+9+4uycJ9v+gSwt1g771S+uYcDQPg7WjH+yQcCXnsJpBbL46uko30eX1J
n+KpYJyfeGLo8f5d4yvTrPcFE5P2Qye69p/+yf2nLX0XztTPPFAv0n3B0pc3
bJHzebtmLh+LI+O0InIkorXgdp9KzTRcKgp01YqnMhAr755F3bKQwn24W2E8
CNJTNNaw6TqJ8jpo8S8CsDH47QyjvBZ7eqOW8rHt9gDSex83Twz8/WjQa+ue
ABYJHvGuwsXzXZhrsW8r6EQQ2CcO/+B2dx55aMPTE53VP45BFux0VxNCWvic
JGKh8mKU2DbLMTJeg/WYmi9jAuayVTm91rfRACnRepJoMr0zpBvIhFPc7d+J
ZtE4QxZ90WR7jA/dMVub8SCHvsZ6XJs7hKN6n2h0/OzpbSfWJqEBkq3X7GUq
WoCMo9f0UHM3zCD4CLN0vRXl2PSnsDECkpCXALCUyNPnIXNSWR6xGek5QbZ7
H5uGd2Oq1coQkThkp9xmOszkl/K8DOEa6Ar+xMFUxIO8EYZZrCSMhxO2MWsx
+Xkio9lOEGIqazmdQ9y38W+CJGP8mD2Hgradezhvm/SbwTTtk82rcW0lk7e6
oQtBSGjREcP5PlI+t/dU+VtiJvYh5qntlzDLpPSewm8c4Wre78Ri1mzxgqOI
Q3MxzT+NPcGSejRJF6kvbBICjED0OkStxQtWPjqGvSVhHBvDJZIle+U9TJKh
xA/b8gCYkYI2iNm2LJey+Bkte8YVP4rSl9Ro7/bFi9ZuOxeyUfa0/KAnQC9w
BT3zQYiSMc8NvJPcg/aXyg9+AaDqPMK1dkWJEINxwKm1bAz5Ad4gGj4wQp0N
yuJ0YP9yu/q1BkuSnEqJfb41UcAUShRCNWeaVVQQt8rrD2rNZBoZlRSjhu9k
q/SDtDRVQIzS3WpkB2ro7EfiYt45Gn+J/AjxogCPSnuFNNfrup0wlK3yGqEk
p9ioCvicUBhL0FEQkL+GG0sTtq4xvI0UEwv1K1wNQgVzG0fzMG7+oSR/I1uB
pwxzE97SFgV6GQaJN8I0/mGW0WIYX8MuvuyIcHfmKgQhxVIyDFrz10pJn8Wu
Vv5Lvzp44hMUWRvkpDujA8a9NO5hCA/FIGGOE72/kcZCDMZoRDtBI0LDmiEb
m9QcFku3NlpNzh0VEY0IiRNKguqWwkus5Zo6a3pXslZ+7pLDyHYwparPUBKu
G0nkKchLiQ2nloZjHIylpfTQoucTX+HxbsF7rndgqkaGwgAhY9b3pqlJr8Zi
E768iclU6nR9F5MfFlnCzMiP0gwdBukrs4eV6rwqpKE7sVFr3FOFDy537bW3
ztejSMHo+elbBuCJlkDsH9VM+igqkMvN1pnuRo1lOISfFIJmuYpVJ85r2nYR
7tsVAJOll3B0ExkmpXh6LXCx4YQKKz/8ArNJa1Yva6mo9e8Vsf49otVD926N
BjAzEfUKzKeaJbhp8zDmb1aMoooZzRhG/JFZH2VOwYKnmeZterks7xkWGSP6
ux62kpN9R7kzsy6TiAEYstkoF6W/BHuV7oFbJPIhjZOvlNN6rvFeCe0fksw8
vVuvDNCTuN8i7IaOvyYA3vB9f33kikiYr74uvvL+0q8dxaUL/WOMnkcTsqBj
P00mjsmP/IDUecCJJ5ZY858j+haI9CZ+pPY6kkQ2ILdySg8MRJ7z/q6hpC9y
pxZ49c9UhoYAnULjte2dGnxVBjQpVwK+ZAPFxAI2CGl+kV0OuXmv80ku9bHw
EDsdFDm8DuO7UPyTeemg0IHxLUFhj2CI8LdRXnT3+G4S9G3rrZkbhKnM+dIF
hqf+SNhgVvdP/9Tuhf1HJw7AH08uzg4uji9PD/4y6DNexHVCsg0QxBrvxu5w
fMIaFNk7QB6J/xRkwUYBXRFeK25IQg43YZWX73u7joUGPr4+YmjfI62DNgxM
d88UEK2POeBoYzqidWqKasG2KiabV1U6W6dcnW2RfgzRdSRq9qlgfoW+Q2QY
kIu23OelYjcn0FM+DSkHSdzmPmIUBYJorTISrdAIw54k5KVNtzmk6wkupADS
dKb4iU/t9VdlSVDdyH5bA0udVPl6iRZ2WHg6u5OeKWGRQ1tYWMqi+y55SIE1
maXfiN9/sRQSQeH9qU+FrDGvEPB7G836t6GA4BeQ5I444tE0H4grPYTZhHxk
zs3iOB8ugQXqIOpcoJsik5cMqyiJMsdwcgwliLyG7fJhFDYjEGdbZQhdMPF6
xksYLnzM9d3nLEd73CQw5OrOLP4B1HG5ROkXknIJuqkGGKxXZQRvHm2lyafp
0JxwFCB1F12vYAFNCHUhpOndqUaAxSHHRFOS0PlrUwWOALmT7IoCsUpNtW0w
OHLoQq2jxEQaGEaxqQ+znBlc/i2oDhm6HfJ6aWrohAAjRC4K/DiTCmrxGRq3
Zus4Q1E6qlMD3AGZJAZtVCXFas8suWErHtDEWwri9M2tD7Q4QsgOl+KbLq5E
S3V0ad++Ilw+zlzPueDTwkEliKnLhsjPy6KTb/apONfiYna4noGI3wSeFiN6
0MKc5G9FHXp6uLXGhAAlPM8y9+kTH8Lo8N27UZw3//vvUuEJk/+UsTTxfQe7
McXgpQWFiX22c6VUPeh5oKffHiWOm5aNgjnSGs7UpefS1qZ109wjjmjAvsNl
1FwrrkWeBNltY1NLYzeXNt1+CrNUgnrf+ZIitt73RBbFjZelJ8oC49hRgrWF
nd+bxtcWILwfV6HMVkONBwnBJg/litT2c2h8n9xYdMTbkDBPCi110n1tBXRx
mlNQONf8DTNGvavgLKW2BaKlSj9J9IxKzj130ZKjfTnm2OyZmDL0FdXQH2r/
+iEBLKewYJTjncQ1E/5QJDlzdTS/YHxvgvU7kF/e0eX9KCgaUv73pZWkNlOM
u01zh73KVgOXBIjEacO922vkrtzXc3Gb3tUUvcjsRaRFtUJQGn8jJdY7zfcw
HmtSl9VEyvinzRrDm+PaH9LbDxs/tMLKWqNJKAtFuUhubUVtuW2QtJaY7o1a
p3C/EAKPlaudnvQ3hBZ007e+m8V9t9tGuW/oshLn4tD59iaoejgAM2Us3Pky
oC3ENJq/kld072kl39yIgR2W7MFFJR7qaH0rjSrUG8Yd4Cm3cBitYnMl08Di
I3mW4qe868GU90mX0jWGDyGEvxGszHO0wrQqrzOz4vaPnsl7wc2sWUPa0Ti5
WIyZe6PgBqKfWhEHFM9k0HDfHUdyFyE5SnMk8yFgUaL4aILKPNovOaReUpGA
fYzQYaK1auS0eFJWVLhiReF+XS9XmInI990uDdPdc7vYkUapYp2UGQWQ8yFz
xhF1MEKpD0cwnSmv0wUJBaaXiYTUVrdYjoNOgxMLGJ5UArEKp291bBoP1+US
V3OFBe9JGuI943hhIBIvGdF7cMcAj7TwUgGNKkiHhgA9iBB1He5lkNqxutP4
wzPIAIvtxfnGqqpPhDR90WxcW1+N4gdZO+oc37WchVw2G0m65/JNSg2/vrEy
a8INmZnUGPtfLNZiTfu4ipDc2Aaqo5WyGTy8qGfILwepexUh2AmyPZ94Kt0C
UZ7PtFjLP9w6u3XfayNEZDft4uZ53O+Pe1UpyidLVGauMpFCpS57bFLxK0Kw
1Fbns7siXUoOE3puySBmn5zAWpCwAc3yZ6cpNyTV48JNPzSOZ9YrKX2Zfxk6
6nDLdpgc0wli4cSnCXfXI6mrflFUcMFkSti1Uaa1E4ecQITWjaTXCk9HkM4T
ywZaWGESJfFMqjmZrshQzQHgycm8p3lH76n4M5GuAHyHE289V2UhxOq28cRW
CuqWiBfe1ZMxtVrX0s5ZbFQbmbdclC+rFEw/ah4A3EhzL7Sg9STU/mKqHGvZ
EmJVR1VH58ZnphfFkODlMiT85EXwxc6Qg3C+NzEd1vTY9f/Zsjv/jzImxDt8
+fbn4zOyqZ6evNFw+BMf75pKjCArFxtvO+IWievyi775Dv7ith5T0QAzX5wn
8WUTtqfzilQcOw0PwpyXZ8evD/5yfHT57uDw5M0rda96Gyr3AbeoLgTUUjBt
lB6070jdvMYO9YsWebmHpEVVHaW6eue5F/1XhjWntnoPd9T7wuCR+sV7vD6j
ts+nXSGLPD7q63fvyDGM/yEof3rIjuLRiv4GDU++5799eVebuwLnmV+x7RKt
5PgcWUgk3da7nrGhcKSFF0LsjKUTI2dIsQ9c0NSo84nBi2DYVtc2RTuOXWe5
RLAxuoM7hpTLJdoH1GK29vZ4qgUOQgCnuciWjJIDcLFWnsGkHG+VEtxE3vyQ
3Y2YrbOSJ95Y0QCZzrQSWoNxKoazoafWntFI+/mPZI9bRbvk7BxyHjC0897s
WTMhHpr6gBk7HYKWJlyFysqJtEX1AgnzYabM26W2djNMywrVdWQd9OW/TlaS
itVc4lv49AgfFwijzHughl6QNAZyTuL6LHEVmSw6BKaHaBoDmnDMhPDpTpxe
ZJcJ9xJWCq/88/GFUhPEMptY9JNNKYom5ZyNjfRo68lY8n3EeBxfmwcAplQE
IGLvqzU9LfinuU2fT8rpkMU+8iFEO1rb65PTEypbpUlMb8olqYR6uzZXp2t1
RM2PS2nIFVC3dr+soOUHF5AaCNEk27l9Uq+na3LX9JuKKGZFC5uSJIElz3wj
SwIy37OdQa6tvODTUl4MNQuhzhFMs4c9AqBhyx47cI/akSj9gBNH9RB2UsSH
usT41JKCD55K73A8fDTddvfwecn0vAmRiiKj7JCjTVc/2JZItI0PDD43lcS8
YRjTJvgfOp6kM5KOrme//aL7TJLIXZoOHNx5/pF7DrPaAZiZtR6TikDaattb
vvt707dIB7+cLLuEgy3YbOo7w8WHvpqExiN8aCTWX+mvqRhucyaNDwZjvj8i
Dljda4NJKLEW3bj7ZssZQQSx5VAgSzOvveW5CLSQLkFq42l5eaq+6HO6NCjO
O5iMN0t2Gvu0cFjiTHQzKJjwkC+9DhxKlpqH2TPoswsPirgo1TIT3+FXsIzu
Pewb+q+k023t7Qzcvmm7yYRbC1h6cc7kZ7aR9eRN4Dtt75mwHrc10V4dQALL
YjboHengLyFldMNIY8/8Do7+9P784vLVwQl3jngW39wVRidTMCNRpvBF02mT
uOkiX54dnB5fnp/8t2MuKPr63U8HvqDohWSw1+yo7QyKlg5uOhiMz8IdOh5G
ACgS9hq0GrZ9jB2/L5k/VBXe0qahA9IYOTjPGpyYAbSw4wUQllDNYZtfM6Eh
5cJTkh585jrZqMBS107fvwr9I5xOoCwPC0rdGsuYFMBT02bLhrRVD5iF3GPi
hQ2RLcdK5R+ybBXGIxvkZF3fjd2P9xudPYXxR+7TiDCJJ1V5kULUKefc0B4G
K5SgfTfii2spys1FrsT94gqyLJCFc1nO8rmInHSIZMbA+hqOWvN5109ST7Mi
BZSvbdmNXA3UaGUbcvk03/3LeEy0Lb0FbHQJSBhWaGmMxod6vWi4PwxFaKkh
TsdoW+9Iwb1nhMrY8vJ5KApDmEHVbAXGusTXJ46YfqT2tL0UGdnHbV8iNeNP
sruymEXEdfvJ0El9mdjqjGERdROjP6sLWDgHS5WVQJpJcwHZTUv7jsPhBFLf
4lK+IlOoUh17o6QjKVq0WJqRJfJBtAiKnO4m1xYA6R0oPlyVKauqkksPRbYf
LBiFqR5KBnytA0RnPAv2tPkqBn3Iz3UOfLGvWKKnyIH0yndB7fLqsWAJV7IS
S3gIyTV0WuhPl1pyrS9jODfVvrDCjqf6LfBKPUT4CyNTGOyVDaoSHMEp/V2K
zvnwrHbWVGeC7zXrXOPYZ5JHPUM2rKnpApJvelEAbhvrzlgSmfMCrzGu00OP
XYb6Hq39eg7+MJCGy5C4R7rDIl3VGlFCZtcFoQYvQDS66xTD6ilQJLc6HeHP
2GdaB6arMlTebkFTuBPsP9pkV2xAGIRIgopiiNOVKaAfqqxjtdO/JgTimGgS
7WQUC1Tb7gnGAdvPkp5b+PYFY4zrihZ9j2tTvqchj7jnbgd6Fq27VclO3Cie
NLSByOA2UU0ubCvKnkHgWD6899j2/pow/OJaYJqOIuYetc/veRJWaHJUtgxg
jewOYdRw4v6TpHUGeoJ7MNIuDNAnaQ1cR5SmgvW9UtmjcJBw7ibkOcR7UwAb
B/qTUdbaQ/s80shp4WX2aCEpSCu2pWEyC8/w6IXofX43AR5sngU8gTUtCCIO
bCJCq5x1v+w9hLdCSCCt2TZ44LVc4mLw4223xQHMLUmfJy9sfgKeiNa4oFSY
bGYbXdjIvYfa8sewydF6NTROFqr+3CHY+KYet6lxfGszBhGKWXD1lSvkgLfx
gPdgM31I24KO2BTRYhs4hY84WubsQEGjk5jl4V3Gma6kLFfdKzF3HkZA6Go1
akXoak4dw4s3V7tD9MG7WZXPG7XIcjApEjxYqJT+JBmspqiCQEJq7sgYzLhT
M1haK8EPXdxfHx/9eHDhoq5M3nx7sFphMcKP7gDuwjchoqd8vcTaURiPtZFv
mB+djfQnryZCAml+pLZs23+F5r0nTo9FATmTltsa840brlwhsqMGCt4Gd+FM
S/pIGKk9MpQVP+Qrn+bSlGXUJQUXPL3OsxvWv0l+bVXA9DZH6l6EMjvG17ba
69RaXSoo9fvYR5K8HLA2Kk3BNgpJ/cUC0L5LHQK2rderlcJ+8wMAcTj4y+XP
B6/fH0v16/Y7vlj5bF2xxT30rGrV2EpZGwmV1G1ZMszgwRYcXmvee4oa+jkq
hNRjrokUaOmjGbYpJ8NdiL3HcAPc5BTkzWYRDrQ9942Kl6H701Y4iIHuD0M2
tfQS9TeTDWN0hQhE+yrOST2NaJ3Jb/HtvGCO1ncKpgeLPo0crffA7JNmCkxP
0QukOiuNvdy+O0l8epmf9IdObZMnofx62McO5QKf+ODWJrI8seW8pmd2Kacs
LvOqKEYP7I0tE25hBCDM053/LIghgge1ev24hV0KiNIOuflASN110tocC2dh
kkElUU0ADC8lUoMqpmIdGmyZWaNquBxJwEYlxkop6tuk9YdQ30GGZSsHhn1Q
FnM3gIoIG7vzqERSA9qDNnB1E+666oulc1qtNJ4zfiCJCJJIXoAwIleSA5HA
mkgN8C8M4zWegpgKB5VTkVHJrsKgfowGkIRuDn1BE2+K6ZO4dPgi08ZM8QIc
yFCMAIfvQuzaSLpptUNgVAfmmEEfda2POXkM4AH5R+3dbjdpviBzEU6T+OKX
GiUW32Y0Yuabm6repN+otyXhUIJ200of5c5uRo06MUXQZRuNH3LsODXDhjZI
Ffduu1W95BAfdbXOAQ+oQpyoqh4uxYeEGZ35hCI045BtpEF6mrWEchBRO2Wa
Bhf0xsKQhyuTdOQPxof1R1HUb17sPjNfsf5LsEzWDrbpcBm8A2Nh4TRJzPap
EMKJ/gBgc3gOzRueDZZV3yDahEvhuCh/SXXZrrfMb4AzuOux+5kBVqONn+y4
Zf1Fe7joA5Q2VEYRoZSbErXEZiEhabeWTA1sEuGlvf4BzWMLaq5NhDiMEp5P
KLj42qBVWBoflfXfexNnKzwzxDUmaEokX2u2WHCR4XavhjARSzA1qDR1HOrr
R2tBthQh55YErT1RtB+sxMamUUzYmAA26WAWsGQMiqnLxY0UtyNRUc3jcex8
OBIyJVY51QEHflIO1QAxlRZ2FEA5qhuk9BQsRpqNj+K8xVwDisGIKAfJFvBd
KVWt6rtiel2VhaphGuW+dX5+dlj74qaTNYzPl1NjFdL3R++2T94503/LUwmK
8GV4Ofj53Us4xas1tfosZwAq+ZJADxghGX0wPm4p9Uv4yIkezhJgk4GKrbnk
dQGUHDZDYeMc4jFfc6AeUXAhwDyQT3SUumuYnhSCYhWrGo7Mxxhmqgav4v6T
p8+fopDdQxNLnDeRhh8jMgnQ7PTe06c7z37/XZ3WunNYJau/GJlquI2/9jpp
ZZVU1QgTaKOOxK21JckvhHUt6isdJ/BmQXYnxZMmlD1Oh771qk/o4I6Dd3hC
XCeAyzi7P78/OSQT11FeT9e81E8PZ/4PkipMyfgpJfqJuB8e40LXTF17HELe
nx/YjAQ9h3D1xXqm+kWguBzE/VJisY/JonXIiWY469bL48NBAFDjIVDz8PlP
b9+/PqIkQMJLGC3EfRXUoHRK3phWPIc1znLr7G4uKT1JsdwzZh70hswozQ3W
ElIm1klVwGMlG2tkBAf4arGuL+fZ1Aee+edOfIn7nhof3BwcAyfhcGhVLVMM
mT/VAKNR550WtZLygLCN6Up2IHEtltRnNhOLPAh4KGaZLnvoIWxNp4HdGJjI
od0hSMz0CRceg29Fw9Gagt/LtKdwUvOpFD2Wy5WzU0OY8oUGaRlXB1Ou0NOc
6Z8x5uBZmsQjbnGaYq1kH1Km2UdSmXkfiwWN3GtpkrohWWf/Mw9w0jQFqvjV
cUAuNwPpZBliZgy1Dwlc3BdRJl8I2r1ovNgblEfB2EoETTuFFreW+rwcDkfj
SegtOslAqkD6iwIz0XmcWBojvzo6c1uvOK8ce3WVhORn2Ry75AxczuXSoo4N
6HcnC3E4lXBcYznm0BB3VeHamjzzSVwhQwUW9/QVMfIVw4lvqC08qNaSgj7S
PLUddonNgwi4dX420PpdMJkn6nj38iKNgkhsfLRROtxcQgmxvArtjFy0Q5sG
JMW9HXenzK9R5vPURmNa1WCTzxbBKy0+nC2TIo0gToNhncZ2E6WU3DDnZ9tX
FZoqso8cLB1spkLxbMwmjmUooB6p3WS9KDVuowjBmSGEufhAo1hMpArTLNhy
NF87BNQAogZWqhvago0CaBBReP9x1B5wLKrPaNpNf84KFzQixMvUlhH1+bLE
R8hYJrfYQ3FCMG3YHNJ9vyJjRo+f8witclqIK83ndNJctKEnSQKvQuJZGdby
Wjzc5I62sT+xGXxDPAMHkQShG82h+yx8eOlTI4ZJkHkOP3CGnsLWjawiQJJk
aVG1di4DFqWY3uxR9dWmyq/IFW/ytEJsckU0MJ1nBKc+0kRsCljhc/yZWybR
vea1gaBCHcxEWFiA6ERUy26T08jjnbeybLQyLSg4s3JJ2wzFaZ81uv6hJvjC
o6SMxIOCSlPUIQLu8R5ljYt6LCegZSoFL6YUbxkVKjBCEt3LY5BiYddnZxS8
HuxOpJiyRiDYRcq8ZIDjKa3VCqMQz/4SXFU5WdcNVVvn5Bz8LcyLoiZP/v3O
Dk4ufF5PnaDJ1HQkEYHlEMlPJugTicVryfyVtEhgsZOy2ePKaVKOntpe2Yod
PbVbqTik9xRYl0RGyUZs1WOSFhKbv2w+HFoCzsUqXZNsWgTFLypV3YR8BW8g
iiUAHDGUm7NiIVevjytlsdeIlm4Mm7Tjk0I0Jc6zkX0j6vFA/JaUv5+H2Hdf
rAbGkEotWvU0xYg1rD8+vhr7vsLzXBO20L9DgGKqo3bbULQvnfvJoKWdrj9D
o1+qRiZzIbN8PmfgMZk3Q6o0gbqLj4zA/cxJabOcQIaFdYwAOkgV86vY+hZZ
KqWNmKx+DY+/qnQ1qHMvGV5sPlMYWlwj6IfNsRmjnterw8OhK8TFeMijHKYF
3ivRZ150MDrC7QfiRo+P+HFZN0WUzLQ5NN9dqWXk2nXhtIZ5t9QbB2xpFnOc
sR0lHRP0lZSRhVfsM//6i6X/6osxI+ccuzf3PobTcgn1SI9lSS/E8IQYOyPO
sRVfBvLGsrmEc3BTcHdxdOS2KBTyKL/JSaw5Alkn+0iZ0diwjJKkSlIIMHgo
FdCbkpXqhFPYZuL4Y/0AFbRocr34diwO82Zg4VzRQPoSTn5FpniTiQFfC8PE
5ZZaoWThVDlerX2eY9L4AS3ygpUsFSXvLWkfLb/7DHxbWgGNks0BR9P6jjwS
bMQTl2hDQVoaO0JLl+FDJSwYi4sUScKPSeZCn+s1xgaK3Cqd8jbBDRxqhXaj
dFERORb91ybMeGsFEvAiS31Knw7J3byYDosgRbo3yHBwhFL1Cjk+0h6sfSRZ
+1qixkSNy1VVKbnCiURpiaeJBlUqTZuvGwzb44fR/MKR1g/dycGbAwxhpwrm
ok5+epgD6qvZZlZO1+Tp8v2FRPEhezy9L14vGvA8A8RC71Jn0Fq+GU2jb35v
maJFzrtZL1DmFNEcsCbF8nZqlCKNudQCqPhKSkaBBPiAaqKNttLrOivw4Dpy
l+91wSQY+RF2VeCexk56ZeHdkOWDaeW2tUYFKzQVD4CLBbjAxjnJMp+BqjUp
P9JSQRJfbRB44zpRPbZtjPRtsPKCLdlBi29kGxppEGLeJQqdXF4Eneobo2eS
9k4IdYoyOhvjoxiNuIAxRc547x87oD49bPsD4Xb/W4rU829/S4F3uXN2k9yS
zjYtR+ka7pGYLQh17vne9885SLTKbvDkFFYTosJkwtbkIwuaOJyGK4/dL5n0
syJiTKCSUlXvLAme2lVWrhY+MzjHOnpL4e+ksCNoslhdr1dkCRDXOA5DAcoE
SWLsFn1kWe67d7C9f/4VCHmKdqSh+/HX//0/qsJdADAu8jUjyaHJK75uoWXN
cS7hiehbN9rZS5KD0Af1nuccsE5MA3GPOMCAY72+qNis1xV8fTcCIS7MhScv
KidKbL62kMjA6VT74eKZUOk0NRFyhTxuk4FTLUjK7MraOKyKv60CeWPaT6dh
onYmjjsfab9t1MYofBld6rZG0vaypsk0bMwnonPyOWFLWU/zxSLYjh5pLzkl
9nSuJka3PYEfndBT6TJbjVoV2tr1Izg+HVOj65o9sigUSpX5BTds0GVMpcoj
LhB58hUHn5VaQoMLZlFLMJR50KZKBbQw86Qet6HuqAVNj5Ok8xGbnJbpr+ij
Ac4NMEmWh7o21niQRUr0VeFcIFYm5brheFfszwbXfVWJ5Bz88xzRVVZXaBvx
iowYUNWPIM5f9NBwRfsKKyhgFfxGgIB7WorxesoNxUuOsvumJuuVsRBIKRu/
1nMxIuyOd8f41oNfgOWROroV2tMOgAJS59p33oL4QBwO4f09ef+aQorZPmg4
RWDp/+UBruENWtUyLzQ/4PCaOgq2VC1C72J38AD3YrdMNeolgQNbidshA/mQ
C3/Auok88unTAil/M2rmt1NQsm3KmW8eQG+8hQXc5GbBnz5JSEkp38DrSMph
IX/AMvMSwRa5avRR1KryK8ouEDWVC4v582Hf0FvYTG02cxjiwopZiBl7wICH
8yq0IwbG0eG4Im4diz1p1OSDBlCSlRXSGD9BwFqkqmNrb7n2bUnlunOQb9w5
0qsH+h4hZLnUXfmFsMnSRPzr7qkaYr0queMxjVIEg384cTHAj6bT0R6aRPDq
H7yRYiCmT54kKj5wdCzsumpveD3xe85xnNrPoh0ERiTFj6g35TSj+egOdJYj
Nb8pTGEjzSaLruye+n8PXOhFGwHlg9fYmI1Szt8jfQzzOBLLZUPn3QXjUlX7
1sHO2R3+rsoRtMTA6kEmepb351uWUyjLoXGMRefZM33rvNi2uPHE7ifCT7Ra
ZgVILpF68wCMvmcfaejtHKFWGSDVltVfZdKpqKomYSqrUdhQgwAEI7gBDKeZ
r77kw5IYR4hrXcaNjziuxQZ4F0imc4lv9MzalHZKZzO5BeNTVgW1vzICGaPb
OfB+oPuP9WmXtz0NTaoJaaewFZOkZqprInkDIgAiRiz5JYTILenPoWdWRkRc
j1PfCPOzj+zFCKcudkYBTvb24wHzInq6rlKkMEUeiyxm0+UqDyR8ub5XDsdJ
2WgVroCFnpHC9ysw9ao3FRKlst805+GGrnktQYjKJHGxIFVkqBQPCHWwTYqL
5U5rPGjYsDZysTH7BLeUayp1l6jKr1RdatfHDImDm4b20iBVDTXNYhRvTMeH
6JzjAsx+BBGSyT13R5YSuWS8fBspagt33w++z3jpPqQBkf9uVdbj7ue+ZJgx
Erfxs9UoPJj1CMM1GWEWNz+2K5e+V61hO7VwsLKTqPefKRSESrOUB+rPSykM
2NZ5s/bCerdkUaBggLG9xXjwIjYX0/jCOtvByacZNd0T0pYWBDSLy5CERO4/
a8ansQNr6qPzqgVsKqJJY4ZxQvkuHxCC+ZUYKEUjmARGrY1lejhvwmvquETh
w4TaQ/MNXPFlE+3ix/WV3JyYlbmU2j0jUw96erdNcTihyI5+SrtUrEFlMtaP
VWlPJY3js1j2XQeejXF73kV7VmJaMB+phpKvRDSIA3If3ZsIFSoe2RTm0KC7
L9pB9Ho9VaT1rcxTvE5jjgD2g3zNx/u2RCEfQIjEpJVa+9nMWsPBGk0QmVWY
509mShURu8U19GiyIPp/JhEoqHPwzje+Dc7T4e54ZxSloQ2+8euZr4tpwLdA
Jr7cv9FnWomWwnWAQP8TiXuDi8QaZYRjIIqKe/H/xYININ5K2QTxiUuFPZuO
/FWeIC87wVlINykd5wscB+Pk/wDZhs9rBwoBAA==

-->

</rfc>
