<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.1 (Ruby 3.0.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-lyu-rtgwg-coordinated-cm-00" category="std" consensus="true" submissionType="IETF" xml:lang="en" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.1 -->
  <front>
    <title abbrev="CCM">Coordinated Congestion Management</title>
    <seriesInfo name="Internet-Draft" value="draft-lyu-rtgwg-coordinated-cm-00"/>
    <author initials="Y." surname="Lyu" fullname="Yunping(Lily) Lyu">
      <organization>Huawei</organization>
      <address>
        <email>lvyunping@huawei.com</email>
      </address>
    </author>
    <author initials="Y." surname="Zhang" fullname="Yuhan Zhang">
      <organization>Huawei</organization>
      <address>
        <email>zhangyuhan6@huawei.com</email>
      </address>
    </author>
    <author initials="M." surname="Liu" fullname="Mengzhu Liu">
      <organization>Huawei</organization>
      <address>
        <email>liumengzhu@huawei.com</email>
      </address>
    </author>
    <date year="2023" month="October" day="20"/>
    <area>Routing</area>
    <workgroup>RTGWG</workgroup>
    <keyword>adaptive routing</keyword>
    <keyword>congestion control</keyword>
    <abstract>
      <?line 68?>

<t>AI fabric is sensitive to bandwidth. Congestion management, including congestion control and load balancing, is a main method to fully utilize network resource. However, current congestion management mechanism are not coordinated, which leads to throughput decreasing.  This document provides a scheme for coordinating different congestion management mechanisms. It describes the design principle, behaviors of network switches and hosts in the scheme, and gives an example to show end-to-end procedure.</t>
    </abstract>
  </front>
  <middle>
    <?line 72?>

<section anchor="intro">
      <name>Introduction</name>
      <t>ML/AI has been progressing rapidly over the last decade. ML/AI model compute, which is measured in FLOPs, are constantly increasing. It is imperative to employ distributed parallel training to train such large models in AI cluster.</t>
      <t>The communication in AI cluster is bandwidth sensitive. Analyzing data parallelism and model parallelism which are the 2 acceleration methods in AI training, it shows an on-off type of burst traffic pattern with huge traffic amount in each iteration.</t>
      <t>Therefore, it is important that AI fabric should provide high effective bandwidth, so to shorten communication time and improve computation efficiency. Effective bandwidth indicates fully utilization of link bandwidth to achieve high throughput. Congestion management is the key technology, including congestion control mechanisms and load balancing mechanisms.</t>
      <t>This document discusses the uncoordinated mechanisms in current congestion management.
That leads to throughput issues which are particularly harmful in AI fabric. A scheme for coordinating different congestion management mechanisms is provided in this document, which can be effectively and widely deployed in AI fabric.</t>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <ul spacing="normal">
        <li>
          <t>ML: Machine Learning</t>
        </li>
        <li>
          <t>AI: Artificial Intelligence</t>
        </li>
        <li>
          <t>FLOPs: Floating-Point Operations</t>
        </li>
        <li>
          <t>ECN: Explicit Congestion Notification</t>
        </li>
        <li>
          <t>AR: Adaptive Routing</t>
        </li>
        <li>
          <t>DCQCN: Data center QCN <xref target="DCQCN"/></t>
        </li>
        <li>
          <t>CNP: Congestion Notification Packet</t>
        </li>
        <li>
          <t>PLB: Protective Load Balancing <xref target="PLB"/></t>
        </li>
        <li>
          <t>CC: Congestion Control</t>
        </li>
        <li>
          <t>ECMP: Equal-cost multi-path routing</t>
        </li>
        <li>
          <t>Incast congestion: the congesiton is caused by mutiple sources sending traffic to the same destination simultaneously.</t>
        </li>
        <li>
          <t>Incast flow: the flow causing incast congestion</t>
        </li>
        <li>
          <t>Incast traffic: packets in incast flows</t>
        </li>
        <li>
          <t>CC congestion: the congestion is casued by incast or by high-speed port sending traffic to low-speed port</t>
        </li>
        <li>
          <t>CC flow: the flow causing CC congestion</t>
        </li>
        <li>
          <t>CC traffic: packets in CC flows</t>
        </li>
      </ul>
    </section>
    <section anchor="requirements-language">
      <name>Requirements Language</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="background">
      <name>Existing congestion management</name>
      <t>Congestion is usually caused by in-cast traffic and/or imbalanced network load. Incast traffic is the traffic from multiple source hosts, but towards to the same destination host. Commonly used solutions include congestion control algorithms that control sending rates and load balancing algorithms that adjust paths for traffic.</t>
      <ul spacing="normal">
        <li>
          <t>The congestion control algorithm, such as DCQCN <xref target="DCQCN"/>, Timely <xref target="Timely"/>, identifies network congestion by network status, like queue length of switch port, end-to-end delay RTT, etc., then adjust the sending rate at the sender to alleviate congestion. How to quickly flatten down the rate curve to avoid packet loss and how to recover the rate for less throughput reduction are essential to congestion control mechanism in AI fabric.</t>
        </li>
        <li>
          <t>Adaptive routing is a way for load balancing. According to network status, network switch dynamically change traffic path of a flow in order to fully utilize network resource. Network status could be indicated by local link status, downstream link status etc. How to locate the proper new traffic path without back-and-forth path switching is critical in AI fabric, because each path switching may increase the systeme complexity, like re-ordering.</t>
        </li>
      </ul>
      <t>Currently, congestion control mechanism and adaptive routing work independently, without coordination. That results in negative impact on system performance. For example, when congestion caused by imbalanced load on network occurs on a switch, both DCQCN and adaptive routing are activated. ECN in data packets is marked causing the CNP to be sent back to sender. Thus, sender slows down the sending rate of the congested flow. Meanwhile, the switch changes the path for congested flow, traversing the new incoming packets to a light-loaded path. The result is that the congested flow is forwarded on the light-loaded path at a low rate. Then, DCQCN needs some  time to recover the sending rate at the new path. It reduces effective bandwidth and seriously impact computation efficiency in AI training. Another example, if the congestion is caused by in-cast traffic, congestion control should be enough. Additional adaptive routing adjustments not only fail to mitigate congestion, but may also introduce more out-of-order issue.</t>
      <t>It is shown that current congestion management cannot efficiently handle congestion issue in AI fabric. Uncoordinated behaviors reduce effective network bandwidth which is essential for AI workload.</t>
    </section>
    <section anchor="principle">
      <name>Design principle of coordinated congestion management</name>
      <t>Coordinated congestion management is designed to coordinate congestion control and adaptive routing. Design principle is shown as below.</t>
      <ul spacing="normal">
        <li>
          <t>Avoid unnecessary sending rate reduction  <br/>
AI fabric is bandwidth sensitive. High throughput is extremely important. Multipath is needed to make full use of network bandwidth. Slowing down the sending rate while there are still available paths for traffic will be a waste of network resource, thereby increasing communication time in AI cluster and reducing AI training performance.</t>
        </li>
        <li>
          <t>Fully use multipath while reducing invalid path switching <br/>
While searching for light-loaded paths for load balancing, new paths should be located quickly and accurately. The new path should not be restricted to local paths but extends the search to available paths upstream. Invalid path switching should be avoided. Invalid path switching includes  switching in-cast traffic as no matter how to switch the traffic path, it will final get congested on the last hop.</t>
        </li>
        <li>
          <t>Reuse current CC algorithm and AR algorithm  <br/>
There are already a variety of CC algorithm and AR algorithms. Those can still be used in the congestion management coordination scheme. The scheme enables CC and AR be triggered coordinately, adjusting sending rate or switching path depending on different reasons of congestion.</t>
        </li>
        <li>
          <t>Applicable to various topologies <br/>
Most AI fabrics use CLOS or FATTREE topologies, but there are also new studies considering the use of direct topologies, such as torus, dragonfly, dragonfly+. Some of existing solutions for CC and AR coordination, e.g PLB <xref target="PLB"/>, relies on ECMP which can only be used in topologies with equal cost paths like CLOS. For those topologies without equal cost paths, like dragonfly+, such solutions do not work. The coordination scheme should be applicable to different topologies.</t>
        </li>
      </ul>
    </section>
    <section anchor="scheme">
      <name>Coordinated congestion management scheme</name>
      <t>The key to the coordinated congestion management is to identify CC traffic and non-CC traffic, thereby they are treated differently in network when congestion occurs. CC flow recognized by network is notified to the source host and the subsequent packets of the CC flow are tagged by the source host. This indicates  the network switch to perform CC mechanism on the flow instead of  AR. For non-CC traffic, the network switch first performs AR. Only when AR mechansim cannot find light-loaded path for switching, the traffic turns to be CC traffic and CC will be run to alleviate congestion.</t>
      <t>Coordinated congestion management requires interaction between network switches and source hosts, and adds a new tag to data packets for the coordination. The following sections explain the detail of the scheme.</t>
      <section anchor="coordination-tag">
        <name>Coordination tag</name>
        <t>Coordination tag is inserted into data packets. The tag contains CC indicator and AR indicator.</t>
        <ul spacing="normal">
          <li>
            <t>CC indicator: indicates if the packet belongs to a flow which needs congestion control, such as incast flow .</t>
          </li>
          <li>
            <t>AR indicator: indicates the location of upstream AR point where adaptive routing can be performed. The AR point can be a network switch or a source host. AR indicator can be an ID, an IP address or other information which guides how to send a message to the AR point.</t>
          </li>
        </ul>
        <t>The tag can use in-band telemetry scheme to carry in data packet. A new method CSIG <xref target="I-D.draft-ravi-ippm-csig"/> may provide another possibility.</t>
      </section>
      <section anchor="notification-message">
        <name>Notification message</name>
        <t>There are 3 types of notification.</t>
        <ul spacing="normal">
          <li>
            <t>Type 1:  congestion control required <br/>
Example: Type 1 message  is sent from incast congetion switch to incast flow source host, notifying the source host to tag (set CC indicator) the packets in the incast flow.</t>
          </li>
          <li>
            <t>Type 2: congestion control released   <br/>
Example: When incast congestion is eliminated, the switch sends type 2 message to corresponding hosts, notfifying the source hosts to untag CC indicator in the subsequent packets of the corresponding flow.</t>
          </li>
          <li>
            <t>Type 3: upstream AR required    <br/>
Example: If the switch determins to perform AR upstream,  type 3 message is sent to the upstream AR point. The upstream AR point can be one-hop neighbour of the switch or a point multi-hop away.</t>
          </li>
        </ul>
        <t>The notification message includes source IP, destination IP, notification type and flow key. Source IP is the ip address of the switch which sends the notification. Destination IP is the ip address of the destination which will handle the notification message. Notification type is one of the above 3 types. Flow key is the information of the flow to be handled, such as 5-tuple information.</t>
      </section>
      <section anchor="behavior-of-network-switches">
        <name>Behavior of network switches</name>
        <section anchor="identify-congestion-type">
          <name>Identify congestion type</name>
          <t>When congestion is detected, network switch judge whether it is CC congestion or non-CC congestion. CC congestion includes incast congestion and congestion caused by high-speed port sending traffic to low-speed port.</t>
          <t>If congestion occurs at the switch egress port, and the switch is the last-hop switch to destination host, it is determined that the congestion is incast congestion. The flows causing incast congestion are identified as incast flow.</t>
          <t>There may have other methods to identify congestion type. This document does not make limitation on that.</t>
        </section>
        <section anchor="notify-cc-congestion">
          <name>Notify CC congestion</name>
          <t>When CC congestion is determined by the network switch, it generates type 1 notification messages for each identified CC flow, and sends the notification messages to source hosts of the flows. When CC congestion is eliminated, the switch sends type 2 notification messages to the source hosts.</t>
        </section>
        <section anchor="notify-upstream-point-to-perform-ar">
          <name>Notify upstream point to perform AR</name>
          <t>When it is determined to perform AR, but network switch cannot do it locally and AR indicator in the data packet shows availability to do AR upstream, a type 3 notification message is sent to upstream point according to AR indicator.</t>
        </section>
        <section anchor="perform-congestion-control">
          <name>Perform congestion control</name>
          <t>Network switch performs congestion control in below cases.</t>
          <ul spacing="normal">
            <li>
              <t>It is identified as CC congestion.</t>
            </li>
            <li>
              <t>It is identified as non-CC congestion, but adaptive routing cannot be used because there is no available new path for traffic switching either locally or upstream.</t>
            </li>
          </ul>
          <t>This document does not limit which CC mechanism is performed.</t>
        </section>
        <section anchor="perform-adaptive-routing">
          <name>Perform adaptive routing</name>
          <t>Network switch performs adaptive routing in below cases.</t>
          <ul spacing="normal">
            <li>
              <t>The flow is non-CC traffic. CC indicator in data packet is used to determine if it is CC traffic or non-CC traffic.</t>
            </li>
            <li>
              <t>Type 3 notification message is received. According to flow information in the notification, new path is selected for the subsequent packets of the flow.</t>
            </li>
          </ul>
          <t>In order to enable upstream AR, it is required to update AR indicator in data packets hop by hop. When a data packet arrives at the network switches,</t>
          <ul spacing="normal">
            <li>
              <t>if there are several local light-loaded paths available for AR on the switch, the switch updates AR indicator in the data packet to itself, such as its own ID. Then the switch selects the appropriate local path to send the data packet. This document does not define algorithm of local path selection.  It depends on routing strategy on the network switch.</t>
            </li>
            <li>
              <t>If there is only one local light-loaded path available for AR, network switch can only select that path for traffic.  AR indicator in the data packet will not be updated.</t>
            </li>
            <li>
              <t>If there is no local light-loaded path, network switch gets upstream AR availability by reading AR indicator in the data packet. If AR indicator indicates upstream point can perform AR, network switch generates type 3 notification message and sends it directly to the corresponding upstream point.  Otherwise, network switch triggers congestion control mechanism, such as set ECN in data packet.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="behavior-of-source-hosts">
        <name>Behavior of source hosts</name>
        <t>When receiving type 1 notification message, source host sets CC indicator of the subsequent packets for the corresponding flow.</t>
        <t>When receiving type 2 notificiation message, source host unset CC indicator of the subsequent packets for the corresponding flow.</t>
        <t>When receiving type 3 notification message, source host performs AR on the subsequent packets for the corresponding flow.</t>
        <t>When receiving congestion control signals and the CC indicator is set, source host performs CC on the flow.</t>
      </section>
    </section>
    <section anchor="example">
      <name>An example of end-to-end procedure</name>
      <t>Network topology is shown in  <xref target="ref-to-fig"/>.    This is a 4 layer fattree topology. There are n computing racks and m switching racks.  Computing racks have source hosts,  layer 1 switches and layer 2 switches. Swithcing racks contain layer 3 and layer 4 switches.</t>
      <figure anchor="ref-to-fig">
        <name>Network Topology</name>
        <artwork><![CDATA[
      Switching Rack 1    Switching Rack m
      +---------------+   +---------------+
      |L4-1-1...L4-1-e|   |L4-m-1...L4-m-e|
      |  | \    / |   |   |  | \    / |   |
      |  |  \  /  |   |   |  |  \  /  |   |
      |  |   \/   |   |   |  |   \/   |   |
      |  |   /\   |   |...|  |   /\   |   |
      |  |  /  \  |   |   |  |  /  \  |   |
      |  | /    \ |   |   |  | /    \ |   |
      |L3-1-1...L3-1-d|   |L3-m-1...L3-m-d|
      +--+-----------\    +-/----------+--+
         |            \    /           |
         |             \  /            |
         |  ......      \/     ......  |
         |              /\             |
         |             /  \            |
         |            /    \           |
      +--+-----------/      \----------+---+
      |L2-1-1...L1-1-c|    |L2-n-1...L2-n-c|
      |  | \    / |   |    |  | \    / |   |
      |  |  \  /  |   |    |  |  \  /  |   |
      |  |   \/   |   |    |  |   \/   |   |
      |  |   /\   |   |... |  |   /\   |   |
      |  |  /  \  |   |    |  |  /  \  |   |
      |  | /    \ |   |    |  | /    \ |   |
      |L1-1-1...L1-1-b|    |L1-n-1...L1-n-b|
      |  +        +   |    |  +        +   |
      | H-1-1... H-1-a|    | H-n-1... H-n-a|
      +---------------+    +---------------+
      Computing Rack 1     Computing Rack n

]]></artwork>
      </figure>
      <ul spacing="normal">
        <li>
          <t>Host H-1-1 in computing rack 1sends out a data packet P1 belonging to flow F1 to H-n-1 in computing rack n. The value of CC indicator in the packet tag is not set indicating this packet is in a non-incast flow. The AR indicator in the packet tag does not point to any available AR point.</t>
        </li>
        <li>
          <t>P1 arrives at switch L1-1-1 in computing rack 1. L1-1-1 has multiple light-loaded paths for AR. Path from L1-1-1 to L2-1-1 is selected for P1. AR indicator in P1 tag is updated to L1-1-1.</t>
        </li>
        <li>
          <t>P1 arrives at switch L2-1-1. L2-1-1 also has multiple light-loaded paths for AR. Path from L2-1-1 to L3-1-1 is selected for P1. AR indicator in P1 tag is updated to L2-1-1.</t>
        </li>
        <li>
          <t>P1 arrives at switch L3-1-1. L3-1-1 only has one light-loaded paths. The only path from L3-1-1 to L4-1-1 is selected for P1. AR indicator in P1 tag keeps to be L2-1-1.</t>
        </li>
        <li>
          <t>P1 arrives at switch L4-1-1. L4-1-1 is congested and no local path available for performing AR. By reading AR indicator in P1, L4-1-1 sends an type 3 notification to L2-1.</t>
        </li>
        <li>
          <t>After receiving AR notification,  L2-1-1 switches path from L2-1-1-&gt;L3-1-1 to L2-1-1-&gt;L3-m-1 for the new incoming packets of flow F1.</t>
        </li>
        <li>
          <t>After a while, L1-n-1 is congested due to incast. The flow F1 is identified as incast flow. L1-n-1 sends type 1 notification to H-1-1.</t>
        </li>
        <li>
          <t>By receiving the type 1notification, H-1-1 sets CC indicator of the subsequent packets of F1  indicating the packets are in a incast flow. Thus those packets will not be performed AR.  Sending rate of F1 will also be reduced according to congestion control algorithm.</t>
        </li>
      </ul>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TBD.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>TBD.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.draft-ravi-ippm-csig">
          <front>
            <title>Congestion Signaling (CSIG)</title>
            <author fullname="Abhiram Ravi" initials="A." surname="Ravi">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Nandita Dukkipati" initials="N." surname="Dukkipati">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Naoshad Mehta" initials="N." surname="Mehta">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Jai Kumar" initials="J." surname="Kumar">
              <organization>Broadcom Inc.</organization>
            </author>
            <date day="31" month="August" year="2023"/>
            <abstract>
              <t>   This document presents Congestion Signaling (CSIG), an in-band
   network telemetry protocol that allows end-hosts to obtain visibility
   into fine-grained network signals for congestion control, traffic
   management, and network debuggability in the network.  CSIG provides
   a simple, low-overhead, and extensible packet header mechanism to
   obtain fixed-length summaries from bottleneck devices along a packet
   path.  This summarized information is collected over L2 CSIG-tags in
   a compare-and-replace manner across network devices along the path.
   Receivers can reflect this information back to senders via L4+ CSIG
   reflection headers.

   CSIG builds upon the successful aspects of prior work such as switch
   in-band network telemetry (INT) that incorporates multibit signals in
   live data packets.  At the same time, CSIG's end-to-end mechanism for
   carrying the signals via fixed size header is simple, practical and
   deployable akin to Explicit Congestion Notification (ECN).

   In addition to a detailed description of the end-to-end protocol,
   this document also motivates the use cases for CSIG and the rationale
   for design choices made in CSIG.  It describes a set of signals of
   interest to applications (minimum available bandwidth, maximum link
   utilization, and maximum hop delay), methods to compute these signals
   in network devices, and how these signals can be leveraged in
   applications.  Additionally, it describes how attributes about the
   bottleneck's location can be carried and made useful to applications.
   It also provides the framework to incorporate future signals.
   Finally, this document addresses incremental deployment, backward
   compatibility and nuances of CSIG's applicability in a range of
   scenarios.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ravi-ippm-csig-00"/>
        </reference>
        <reference anchor="DCQCN" target="https://conferences.sigcomm.org/sigcomm/2015/pdf/papers/p523.pdf">
          <front>
            <title>Congestion Control for Large-Scale RDMA Deployments</title>
            <author>
              <organization/>
            </author>
            <date year="2015" month="August"/>
          </front>
        </reference>
        <reference anchor="Timely" target="https://conferences.sigcomm.org/sigcomm/2015/pdf/papers/p537.pdf">
          <front>
            <title>TIMELY: RTT-based Congestion Control for the Datacenter</title>
            <author>
              <organization/>
            </author>
            <date year="2015" month="August"/>
          </front>
        </reference>
        <reference anchor="PLB" target="https://dl.acm.org/doi/pdf/10.1145/3544216.3544226">
          <front>
            <title>PLB: Congestion Signals are Simple and Effective for Network Load Balancing</title>
            <author>
              <organization/>
            </author>
            <date year="2022" month="August"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 293?>



  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA7Vc63LbRpb+z6fotf/MOCRkyk4mYc1mVpbkWFWSrbGVSmU3
W1tNoEkixoXBRTJjO88yz7JPtt85pxvoBkHZ3p1VZcpgoy+nz+U7l27MbDab
1I0ukv/SWVmYhWqq1kxi3Zh1We0Wqm6SSd0u87Su07K42W3R5eL85vkk3Vbc
uW6OHz/+7vHxJNPFeqFMMZk0aZOh22lZVklaYKoEz8Xa1A2mUFe60GuTm6KZ
6OWyMrfoeXo1Scq40DmGJZVeNbNs186qZn23nsX9NLM4nz1+PEnwvFDHj4+f
zOaPZ8ePJ+WyLjPTmHoxabf0Fg8PVdftePaY/lOzGbeptFarNMtAVloo3TZl
rps01lm2U8udepdnx9UqVulKFWWj1ukt7UlXRi/U67Jt0mI9uSurt+uqbLdo
uvnhpx8mk7d3i4lSM6UTvW0wRFW2KzXG/e7x2FRlhgnbZlNWGDRDl7SoF+rn
SF3uWvwSPvzcFltM8KfLNNv92b4pq7Uu0t81TbVQL1p9Z1I0m1yn2UJltzsZ
828bfhPFZY63D0ELycMkaVNW3FA3lTENrYGejU65MU4bCPylLn4VutFSJsTB
+WP82YYW5KPX6QYSCWn/943mYY56/Oza7qf7d+q1owHfBJR3s1+BM2nPmStT
rH/ftLbtEzxJ21y6+1NPirIiod8aktrD189Pv/3u228Wk0larLo3StG7i9lZ
lJpmNau3FfgyW66ShWtvUl249rq6/WaWmG1W7ki3obZFnSamErowggaIblf6
Np2l220+i+t0Te/OTv9++pIelLLG88CzmFPRGQXS1KWu1mb2Btpq1OuzqxN1
1i1ZP+AJnNrPv549/lampDGQ9qZptvXi6AikrUxlitjUEQgAQ/IIXDyyz0c0
9mibrI62emuq+mj79fGTCL8Vc+QmzU22C4m9ubg6v/yZjOFmttR1aPA++c3G
qDNoXAx6TfX/R/CTvxDBmOz68llIKjX41L1J14XOagUDx3O+BV+Bhup8tTIx
GzKR/dI0ZPLqstSJeqYBdTFkLuRbQ1b8A1TZJx99xneVZJGOZSNJmTL988fR
fP7066MnXz99ejz/JuJ/j78hxk8mM+CXXsJ0ddxMJicXaqWXVRoTnNUGysbU
NqVagv67NGk2kb/PvIPdKYwqzlpg6noEmXj3Ge1z6fY5pSU0ZgBc5ga7TWiZ
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
ycuTA6/p/w6BPmKY8N//AJUzsD7PSAAA

-->

</rfc>
