<?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.19 (Ruby 3.0.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-dejong-decentralized-cycle-detection-00" category="std" consensus="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.2 -->
  <front>
    <title>Decentralized Cycle Detection</title>
    <seriesInfo name="Internet-Draft" value="draft-dejong-decentralized-cycle-detection-00"/>
    <author initials="M. B." surname="de Jong" fullname="Michiel de Jong">
      <organization>Ponder Source</organization>
      <address>
        <email>michiel@pondersource.com</email>
        <uri>https://pondersource.com</uri>
      </address>
    </author>
    <date year="2024" month="October" day="16"/>
    <area>Security</area>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 19?>

<t>Decentralized Cycle Detection is node-to-node messaging protocol for finding
cycles in networks.
It differs from some other cycle finding algorithms in that it does not require
a central coordinator or a bird's-eye view of the network.</t>
    </abstract>
  </front>
  <middle>
    <?line 25?>

<section anchor="terms">
      <name>Terms</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED",  "MAY", and
"OPTIONAL" in this document are to be interpreted as described in
RFC 2119.</t>
      <t>We define the following concepts:</t>
      <ul spacing="normal">
        <li>
          <t><strong>Node</strong> - a system that is capable of receiving and sending Messages</t>
        </li>
        <li>
          <t><strong>Message</strong> - a chunk of data sent from a Sending Node to a Receiving Node</t>
        </li>
        <li>
          <t><strong>Sending Node</strong> - a Node that sends a particular Message</t>
        </li>
        <li>
          <t><strong>Receiving Node</strong> - a Node that receives a particular Message</t>
        </li>
        <li>
          <t><strong>Link</strong> - a channel for bilateral communication between two Nodes</t>
        </li>
        <li>
          <t><strong>Neighbour</strong> - (of a Node), another Node such that a Link exists between the two Nodes.</t>
        </li>
        <li>
          <t><strong>Network</strong> - the combination of a set of Nodes with a set of Links between them.</t>
        </li>
        <li>
          <t><strong>Path</strong> - a sequence of Nodes such that a Link exists between each Node and the next one.</t>
        </li>
        <li>
          <t><strong>Cycle</strong> - a Path such that a Link also exists between its last and its first Node.</t>
        </li>
        <li>
          <t><strong>Probe</strong> - a number of Node-to-Node Messages, in an attempt to detect one cycle.</t>
        </li>
        <li>
          <t><strong>Probe Message</strong> - one of the Messages of a Probe.</t>
        </li>
        <li>
          <t><strong>Nack Message</strong> - a Message sent in response to a Probe Message, indicating a lack of outgoing Links further ahead.</t>
        </li>
        <li>
          <t><strong>Probe ID</strong> - hard-to-guess number included in a Probe Message.</t>
        </li>
        <li>
          <t><strong>Trace</strong> - a number of Node-to-Node Messages, in an attempt to confirm the existence of a cycle, suggested by a Probe.</t>
        </li>
        <li>
          <t><strong>Trace Message</strong> - one of the Messages of a Trace.</t>
        </li>
        <li>
          <t><strong>Trace ID</strong> - a second hard-to-guess number, included in each Trace Message of a particular Trace.</t>
        </li>
        <li>
          <t><strong>Apex Node</strong> - the Node at which a Probe loops back onto itself.</t>
        </li>
        <li>
          <t><strong>Incarnation</strong> - a round of Probe reuse.</t>
        </li>
      </ul>
    </section>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>There are several situation in which Nodes in a Network could cooperate to find Cycles. Decentralized Cycle Detection is node-to-node messaging protocol that can help them do that.</t>
    </section>
    <section anchor="initiating-a-probe">
      <name>Initiating a Probe</name>
      <t>At any time, any Node in the Network which has at least one Neighbour MAY autonomously decide to start a new Probe. It does so by generating a Probe ID, and sending that to one of its Neighbours in a Probe Message.</t>
    </section>
    <section anchor="forwarding-a-probe">
      <name>Forwarding a Probe</name>
      <t>At any time after Node B receives a Probe Message from Node A, containing some Probe ID, if Node B had not previously received any Probe Message containing that same Probe ID, and Node B has at least one other Neighbour, Node B SHOULD forward the Probe, by sending an identical Probe Message (containing the same Probe ID as the Probe Message received from Node A) to a different one of its Neigbours, Node C.</t>
      <t>If Node B does not have any Neighbours other than Node A, then it SHOULD send back a Nack Message containing the Probe ID from Node A's Probe Message.</t>
      <t>If Node B receives a Nack Message (with matching Probe ID) from Node C in response to a Probe Message, then Node B SHOULD send the Probe to one of its remaining Neighbours, with which the Probe ID in the Nack Message was neither exchanged in a receiving role nor in a sending role yet. If no such Neighbours are left, Node B SHOULD send a Nack Message to the Node from which the Probe was originally received.</t>
      <t>If a Nack Message is received by the Node that initiated the Probe, it SHOULD likewise send it to a remaining Neighbours to which the Probe ID in the Nack Message was never sent yet, and if no such Neighbours remain, stop.</t>
      <t>At all times, each Node SHOULD keep a record of Neighbours from which a given Probe was received, to whom it was forwarded, and whether or not that forwarding was responded to with a corresponding Nack Message.</t>
      <t>If Node B has seen a Probe Message with the same Probe ID before, then Node B is an Apex Node for this Probe. It can now initiate a different mechanism to confirm the existence of a Cycle and, for instance, initiate its removal if that is desired.</t>
    </section>
    <section anchor="mitigating-unexpected-behaviour">
      <name>Mitigating Unexpected Behaviour</name>
      <t>In the previous sections, the actions each Node SHOULD take describe a depth-first search with backtracking. If all Nodes collaborate, and a Cycle is reachable from the Node that initiates the Probe, then more and more Nodes will receive the Probe, until the Cycle will eventually be found.</t>
      <t>But Links and Nodes MAY behave differently, leading to Messages not being sent intact, or being sent in a different direction or at a different time.</t>
      <t>If a Message is malformed, it SHOULD be discarded.</t>
      <t>If a Probe Message is repeated or sent back to the Neighbour it came from, these extra Messages SHOULD be discarded.
If a Nack Message is received in any situation other than in response to a Probe Message with matching Probe ID, it SHOULD be discarded.</t>
      <t>If the Probe ID in a Probe Message is changed, then this SHOULD be interpreted as the Probe being stopped prematurely, and a new Probe being initiated at the Node that first sends a Probe Message with the changed Probe ID.</t>
      <t>If two Probes have the same Probe ID, this may cause a Node which receives both those Probes to act as if it is the Apex Node for one of them. The Trace algorithm (see next section) is designed to be robust against this possibility.</t>
      <t>If a Node sends back a Nack Message in response to a Probe Message, yet a Probe Message for the same Probe ID is also sent to another Neighbour, this will result in forking the Probe into strands that travel through the Network in parallel.
Likewise, a Node MAY forward a Probe to more than one other Neighbour at the same time, which would essentially correspond to a breadth-first search instead of a depth-first search.
This is a second possibility that the Trace algorithm needs to be robust against.</t>
    </section>
    <section anchor="traces">
      <name>Traces</name>
      <t>A Trace attempts to confirm the existence of a Cycle as suggested by a Probe. It is initiated by an Apex Node, and is sent to only one of the Neighbours from which the Apex Node has previously received Probe Messages with the Probe ID, using a pseudorandomly generated Trace ID. The Apex Node MAY initiate several such Traces at once, up to one for each Neighbours from which the Apex Node has previously received Probe Messages for the Probe in question.</t>
      <t>In the previous section, we identified two possibilities which the Trace algorithm needs to be robust against: Probe IDs may be repeated between Probes, and Probes may fork into parallel 
strands of search activity through the Network. Trace Messages achieve this as follows.</t>
      <t>Since the Trace ID is generated by the Apex Node, if that Trace ID arrives back at the Apex Node in any way, other than from the Neighbour it was sent to, then the Apex Node can be sure that a Cycle of Links exists in the Network.</t>
      <t>When receiving a Trace Message, a Node SHOULD forward it to all its other Neighbours with which it has previously exchanged a Probe Message for the Probe ID that is included in the Trace Message, except for Neighbours from which a (valid) Nack Message was received for this Probe. The Probe ID and Trace ID SHOULD be copied unchanged from the incoming to these outgoing Trace Messages.</t>
      <t>When a Trace arrives back at the Apex Node via a different Neighbour than the Neighbour to which it was sent, the Apex Node has proof of the existence of a Cycle in the Network.</t>
      <t>The Apex Node can now send a different message type (out of scope for this specification) in response to the incoming Trace Message, referencing its Trace ID.</t>
      <t>Each Node on the Cycle can relay this message back to where the Trace Message came from, until it reaches the Apex Node again.</t>
    </section>
    <section anchor="serialisation">
      <name>Serialisation</name>
      <t>This protocol specification does not prescribe any particular serialisation of Probe, Nack and Trace Messages. They may be serialised onto each bilateral Link in any way the Sending and Receiving Node see fit to agree on.</t>
      <t>For instance, it could be serialised into an ASCII string which itself contains as a space-delimited series of strings, the first one being for instance 'probe' for a Probe Message, 'nack' for Nack Message or 'trace' for Trace Message, and the second one being for instance an alphanumerical ASCII representation the Probe ID. In the case of a Trace Message, these could be followed by an alphanumerical ASCII representations of the Trace ID.</t>
      <t>Other options include JSON, XML, etcetera, and these serialisations MAY be sent directly as TCP messages over IP, or be wrapped into other messaging protocols such as for instance HTTP POST over HTTP/2. When forwarding a Probe, Nack or Trace Message, a Node would have to take care of the appropriate translations.</t>
    </section>
    <section anchor="example">
      <name>Example</name>
      <t>Consider the following graph:</t>
      <t><tt>
A - B - E - F
    |   |
    C - D
</tt>
The following messages might be sent (here using the arbitrary space-delimited serialisation described in the previous section).</t>
      <t>Probe:</t>
      <ul spacing="normal">
        <li>
          <t>A -&gt; B -&gt; C -&gt; D -&gt; E -&gt; F "probe rei6Ac8i"</t>
        </li>
        <li>
          <t>F -&gt; E  "nack rei6Ac8i"</t>
        </li>
        <li>
          <t>E -&gt; B  "probe rei6Ac8i"</t>
        </li>
      </ul>
      <t>Trace to A:</t>
      <ul spacing="normal">
        <li>
          <t>B -&gt; A  "trace rei6Ac8i aeBoi8xu"</t>
        </li>
      </ul>
      <t>Trace to E:</t>
      <ul spacing="normal">
        <li>
          <t>B -&gt; E -&gt; F "trace rei6Ac8i Yoof1ae"</t>
        </li>
        <li>
          <t>E -&gt; D -&gt; C -&gt; B  "trace rei6Ac8i Yoof1ae"</t>
        </li>
      </ul>
      <t>Trace to C:</t>
      <ul spacing="normal">
        <li>
          <t>B -&gt; C -&gt; D -&gt; E -&gt; F "trace rei6Ac8i IC5eiph"</t>
        </li>
        <li>
          <t>E -&gt; B  "trace rei6Ac8i IC5eiph"</t>
        </li>
      </ul>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>Malicious or malfunctioning Nodes can stop the algorithm from successfully finding Cycles (see also the 'Mitigating Unexpected Behaviour' section above), but as far as we know they cannot cause any false-positive cycle detection.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This internet draft does not introduce any identifiers for consideration by IANA.</t>
    </section>
    <section anchor="appendix-a-optimisations">
      <name>Appendix A: Optimisations</name>
      <t>This appendix specifies a number of optional optimisations.</t>
      <section anchor="incarnations">
        <name>Incarnations</name>
        <t>As an optimisation of this algorithm, an additional natural number can be added to each Probe Message as its Incarnation. When a Probe is first initiated, this Incarnation number SHOULD be set to zero. After a Cycle is detected and removed, the remnants of a Probe MAY be reused in a next Incarnation. If the Cycles is removed by removing only one Link, then the Node just before that Link can be used as the starting point for a new Incarnation of the Probe, by sending a new Probe Message to a remaining Neighbour, containing an incremented Incarnation.</t>
        <t>The mechanism for detecting whether a Node is an Apex Node then needs to be augmented with a check -</t>
      </section>
      <section anchor="trace-legs">
        <name>Trace Legs</name>
        <t>Another optimisation to make Traces more efficient, which is especially relevant when Nack Messages are not used, is to make the Traces for a particular Probe cooperate, but assigning them all the same Trace ID, but a different Leg ID. Traces then only need to be forwarded to the Neighbour from which the Probe was received, unless two Legs of one Trace are received, in which case the second Trace Leg SHOULD be forwarded to the Neighbour from which the first Trace Leg of that Trace was received.</t>
      </section>
      <section anchor="handraising-protocol">
        <name>Handraising Protocol</name>
        <t>In Networks where Probes are allowed to fork, two Nodes can get into the situation where they send each other an identical Probe Message at the same time, making it impossible for each of them to conclude that the other Node forwarded the Probe to them from elsewhere, rather than just echoing it back directly. To avoid this, Nodes can agree on a Handraising Protocol to govern the Link between them. When Node A wants to send a Probe Message to Node B, but minimise the chance that Node B sents is an identical Probe Message at the same time, Node A first sends a 'raise hand' Message, and waits for Node B to respond with an 'OK to send' Message before sending the actual Probe Message. In the meantime, when Node B sends its 'OK to send' Message, it will temporarily pause its own Probe Message sending. The same mechanism would then be used in the opposite direction when Node B has a Probe Message to send to Node A.</t>
      </section>
    </section>
  </middle>
  <back>








  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA61aW3PcNrJ+569A+TzI3ppRnFTt1q4eUkeW5Ip2LcsbKXXO
PjkYEjODFUkwBKnxpPbH79fdAAjOjC/nUhVHEgk0+vr1BVwul8Vgh9pcqLNr
U5p26HVtfzeVutqXtVHXZjDlYF17VlSubHWDhVWv18OyMv907QY/sk3Lkjbh
Wdi0fP26KPVgNq7fXyg/VEVhu/5CDf3ohx9ev/7L6x8K3Rt9oR5MOfZ22BdP
Zr9zfXWhbtvB9K0Zltd0XFH4QbfVR127FizsjS8KPQ5b118USi2Vbf2Fujt/
c64qo/4KxvBUKeH3zpZba+rZG9dvdGt/18Tlhfrg2sr06sGNfWn4vWm0rS9U
I1v/s+MFnt+fl67hNWD4Qm2HofMX3313tKJYLpdKrzx0U4L9LypXWa9aV5nl
4Jb0UzXGe72x7UZ1vRtc6Wq1dr1a27bCw4LV7CG0goKgrid/XtwOqrLrNXhQ
6941yrvGKDdsIRcvj5uVrmEOO2wbJjBs9aAs9jpDPAyqN7+NtjeFVoFhVToY
xLZ6AAf4T6uV7aszvzR7o56t2Sm3BhkTeTlnyRtbVbUpiv9Qj6ZvfPGIBbCt
IuN69eLul4fHFwv5qd7f8+8/3/z9l9ufb67p94efLt+9S78UYcXDT/e/vLue
fpt2Xt3f3d28v+bNoHr5D/yEvxQv7j883t6/v3z3QoSFouHHYwPRFDxPDU6t
DF7B17oe5qiUxgrjy96u8Idti5/fXqkfvv/+L+dF8V8Gr6BGw+KuXV27HWm0
dG1pusFfFMUf1MeP72HBjx/hlFr5vR9ME5TsVak7vYIpoLAe/mCf2R5tpbwR
29yx3eHcRCf8EUiV27F9op2VHjRtGMTOGrEjm+lcEkirnxNxesbE8kWBoqwn
1uh4jyed7gdbjrXuIye8d07uaLeIYr5A4J1tn5IYum2NuPPK1gAHcbGmGVtb
cjzCIsPOGJhr5/gYUcd7YzfbFQKMKb2EJoSJV2RpcXTmyY/lVhjTig5W5pP1
g5+ownaJ8nkgzZ7LhOk12FmRwxMzfI43A/3CW9QOwTM9oyNmxBuh+UEP2+gF
CCkDF5lIfI1Ho/GepSHvkOD6hONaI8QZPwJ1OuiYoK69O6Rq8Xut/cBE6Y+1
7fEXnRN47t0qkm3HZgWVBpYJmZif6KELiieN/wY4eDeQ3wnsE5OCOBlNlfsy
LQiQEamJlnlpsIgun9Q8AMJf4vo4vDceoOuDy8+OIeYq9iaKL8hccuS4cdg4
eiQ2W489e43eGl3lzN5e85Fb3Vck92YE1agP25b1WDE0HJ4qJB6B9/97HQJK
YJSGlcPWi36jRacLWHqDrYRUq/1cZ3zyt2mal+a7gsjkq2ChOin7YiY8u+js
SCGdQUB2ymVnPk3oQQyJdw9qt0WOTaqsnevgsGywFvqAl5p6LTRu21L3EpWB
2d6N4BXHyubejB7nIeegeOhdNXJypdQDpCe09+aZ4cbbYZTohiDCgMQlGzWg
AWwx1hVlvw6bBvYzyqGSvP25+j+ndI7XEg6wNXXH0IHkxE+DEHaw0YdZwqK4
pODdq8E2ZsG/sRqtoFpkXCTaIpOBfm0o4skTEoAq5EeF6sm1rnGjr/cI3dJK
8kCZ1ROItMjr4lvqNlQHABS43Ma0pI6MKzjPYpbFWC7QCu5HSJPO9icDB9K+
df1O91UubSasQg0YAf5NnnFmhCQj8qLLBcXSoG1LFLkYmpi160hpqyuuepD8
n63oIhCv+Ow5+Yyi5E09I0s6SHQPlB8SVFTDIi4MhcxapGczMsEF6ToqFC4C
87SIKzjvnKWXM57MnCUqZhLFtCUJmGnrlaCoVJAEsAe2Y9MFpq9gr9ukwVQ4
bvWzEZecbC1SQ1dtsgqeUCaKgpOIEu8IvAz01YFcSaSM6TN/5EcTX5mPzOi+
5PTd6AGVPWhHuq8ywldfTS8sxNyCLMjE6dz9e+onWJZJOQspJCRYZyLGcM7Z
3sGUrbGsT/OJqqhNTEJTKdk7QFDrenkevYef7s2ASF7jrdQKmZEIGWuzHg59
kiU60N7gJvBmhR2yT3yivQDQ6ToLJjHNATHrJ1+EtyfCUi4L+plZTEx+U9sn
s7PeCJd2EDOd0jO9+R8pGTlCigzoTILantSbHIaMPLjuXKC5rhmtYNupggsM
PxnTibHQAXFJMFHKNKnVBvpoM21GFS1EEKyEtPQiYAa9ISZ3W8PeAfNTOLIS
1xOoCinPfWrFpKSMBTvhMastU8csnAjQPBWRh5DLZI6RZ2Vw9kGkwN4AglQK
cA/ALdmUaCgbtm6XrD/DpMaQ31vffKVSklQMnSz4CNvS7KDkqjBQDTHpnoGn
dp36M5QAaH0rzkd3WLqRPPcLiu8OaR16e2MAc0gUfXEr/hMTBxVOlPc9i6y0
/HHsBoN+MqnBJOnQOG6XUoh7o3ssZ40SJNLo4AkMcOCSb0mRgtKh1itHNYlY
PkrM8YQDucdknzodUj4PKTZQ43ppNfiX2ObgxOB8+YYReajmB3Iqr0PQtKip
KORXZFjUZdDim3EItXZMjZ5rj5XhZJEsW+8XlCqleHBTrUp+vDKcwKXoH6DX
BXn47OnMSSpYUCowmlUMs3cUmxGJMhBqdA0/aSiQJoBZEX++5ACLe+aez+ru
DGOUC5DBmSyCZKq3LDl2IzZhjXvyWZh3EvXkqV+GTG4e9lkxm2XbLycwdToH
fln8Q/Q8oY6QloJTcWhP5A6GLBO5YEugaIdXHcHqMPaGnEK8O9WiYemUGqjO
nLl4DCSZZ3wGqWL2jNIE+XZOnngpZY4wbSESNXoPa6LTiEMQAe5Ub6wcH+O8
ieTIAGiMIbSlcoA0RcTnQDj1as25ommZ9FZpWqdeAn5lDBCg5lWErE0riE4t
kFuN1OBvNKGeMNw57+3K1nbYpzTMgxLW0qna62vlDxLjcenNYH6YBgjyaRLB
wUGk2qNCmHkMYOPHmgMaxJ7mlZ9tuTnpNfEsDUYPKxEQoQvcbGcNECigDQUa
mfq8eBcqhUWUmxAo1tt6KtcY+jh4TtTr0dNYOum+xOw7bhKhAyrPGf+mhCq6
WwGTq0OMJ+vgseSr4xxwjqYVWiHtxY48s2KQ/4SPtMZU/qQrcE7j5R6lStwo
gwf/bfnUn549UNomXlNQ0rsszYcSyicfcC20lI0mThdC8wih8uNUjzbzQT+F
+BSzo5eWsvNmrBz5j2vq1MaCRByASNRNR5KbpIIhTQ7GOPXg/s5xWTF2sdyn
IJCU//8nUwysGAfqtxE2QPxTMJ8uQuCcJnSMa0vYAGib/MeSohI/3+5CF0mr
AoI8cQn5L44YBfHE5AH9aOlaohJUY1yqIgYzvCAEBRVNz+LfRzF9Pp81Qft0
M8MwTVHiwzjeQykPljx3kk1gaDJ4aDUyB40lYFqv+16wnMFxODBcSLw7jQyV
5dyp4soT/04nz095MSdGFe+Kpta9iQNcibc0Ww5T3PmQh64jiFh2jzDXUIK7
gwlDaJUAt1QEH8Ccz3tSOxy66NR4fg79E/DHkjofGU4mSTyCIsCPt3+uH3qJ
It1Wr447tWmOcdBHPOaMkCcmu07VSOk6ioyxjRIl64Fj14RKVEq1NDeeu2A0
QVT8l53m2epZLTo5CTvP3G9Sy5o50OIkfDiaa68/j9pHXvN45H3Ub4VeP++1
QsO/74x6CQ1wnEJrWdvm0RQBYOTW5tVh1TDT5YHZe8PHlFzNwQ0TBhfFTeqY
XJt1GcQoakK9D0VYYC/W2zue8R45WF52S99iB+mRzGENxiDHWfLB9Mjk1rNY
hWTiNLOdyTwNvxAksaUDMmQzcJ8TS6PqhXjz5JvJp8h59xFe42ZqMAg8ObVM
t2Z80TOBEQv0kEaG1cE1ILXvqI8l/De9IQVD3rfzDnkIY+/56QzdlNQfrm5v
qQzjiULwUJrQx3EdQzFqlg5CLStT28YS5BIpuXuQvaFLlpKHEqcU9nm3rs46
0tQZPzyqQM9a6E/ezXABf59R2xz2HSJiGNGFkuozB9ONTN0hKMcGbNPIVcRG
soOVERxiyxzuUATJg1J7k12xzCaG3ky6lWyViqVvOM/HMM9i5V4GPp28D1Cr
/vpw/36h/vvuHeB1KA35ShLdm7lHxn5cUpT0zgB6GPHx6kOMMhxNM7HbD6H1
Vrtec6/GbiEp5Ph6I9xyyqBq0u5Pj48f1If7h0chSn9+98O5YiRdH90BhEA5
YcrQe7FCpV9zMlwpaZ4ZdAU2e9f1XMJRueFrkZrj/OaTbjr6RuEKT2xl+oNr
/Q2k3F4Uxa+//oqKeane4N8N/r3lrz/+Rf/4tys8u+ZVj7P9SXsNYH1ISn7J
UCVlKfPYryx46/cno2bCjvyrhJNV3ytIxUrj7xDA8Y/E8o/E34/qmv53Q/97
q1504brM/umy/LN9gdVv5bV6QXE1e3MjdI43FWIRqP2SD+SzLrGQ4y8tVNq8
cfbPn8Z8x820I/J0sOsfSGzfa5M4uE6SvDk+Ii2eTriaTjiW/2D77dUfje22
M2k/t4Tzg3yrpKLfiE8VxR2MVbJF4K80VEJ1Qa8iAnvOYjToEMOnmls+2BlL
dBV+PVITGT/WkbtG6f25kaaNZ1+ZTZ5Fj1B6hSB7tVCrkccPayQk/EBz8ERJ
f6BUA5YogYWJBjLJGueYJdoFHPIcrvJV+qRLbiYv318eSi8Na/hoS74Rm9Kj
DfexckLqTHrBhjKnRIhI9PmgS8AMFPEJLqbuAXNNhK2QlnV8H9IyX/dMt+6C
jABUl+8lynS7mm6TqSPm0XS+TCCE5xfBTAtG6qqygWhLYyr6KeeFQh4LZBrD
yXpeJdMECNVOdnQAvpjfbPwmI3XTYT6SbYnnTbUsfYmCA383vTtXl3xRmo2E
xXR8n1nJ0DtM6OiPVrdD/vVFTAd8lR7ul3jmNOM5TAODc1ofyZLt+FfyzNTm
U5mStT6M2/+kvlLuCKRV4FomqJCPDiNCvo/mtIIKfAjFAA0Ec424bDo5vzjN
ZofZFdbJi6LZhTGPUEusgqeCmVx6KaGnuwhiKYQHF0VyCxPy0+GVB2shb7H1
uAlnxPuYrQECLxU7qcDZO7MhFw2js5mT0tyKkl4YSfAMy6xRn1ruGEKJhh6S
AyRcydXmGWYnVttZ9SRXgRSvZIEFzykD/VR4+GCCrMQV9abvJCLa0Fwy5LhG
bsbi/CxWMGFl1nVAUpnEyFGsLfYjUlnQWLr2Op6zf/ZGcrpDG9uavmihiQip
lVGiTVOQ3mRL07chXNRldWOyShaD386VBPhEw82GDzm3AlQ/IW57bX2Y1HNt
xZOf0NP50PyEcQvJoENxSV+sYMVi+t6NQ2xjBindWKZ0fZB6KIkfATDxuS98
gHA8GIXDSF+nbCNTpzqbjIUZdxg5SsWa5pnZZ3yZQvNLdd7LGjVIU8wy2kk9
TWEYWRCcLvDAHWIsbOFZiP5nZyuG1UWmlNgSwR9PaZzO3lDFKiDGcDX76E+A
XD5MgBVbmaqGvvoIgeRGVAIADTIFtEl3E2XQSLg2parRByT5disETuYXImck
Fo0O2ups3hbtNH8Q6NI3NmAyjrEFmVp1dv+3KFPaHUF8+vaHLz/HQw5Th9QY
6CYM0KerYWGQWDh1CPelfEVA82qHYtnW1GVTycJTrF17oI/AjsyCWCsTYEvP
wNgSk02oqF3HZY/JLhFzJvmjnmNbypcfwaaX8vkzeV3xb74oiGNdLwAA

-->

</rfc>
