<?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.4 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ramseyer-grow-peering-api-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.19.0 -->
  <front>
    <title>Peering API</title>
    <seriesInfo name="Internet-Draft" value="draft-ramseyer-grow-peering-api-00"/>
    <author fullname="Jenny Ramseyer">
      <organization>Meta</organization>
      <address>
        <email>ramseyer@meta.com</email>
      </address>
    </author>
    <date year="2024" month="January" day="17"/>
    <keyword>BGP</keyword>
    <keyword>peering</keyword>
    <keyword>configuration</keyword>
    <abstract>
      <?line 37?>

<t>We propose an API standard for BGP Peering, also known as interdomain interconnection through global Internet Routing.
This API offers a standard way to request public (settlement-free) peering, verify the status of a request or BGP session, and list potential connection locations.
The API is backed by PeeringDB OIDC, the industry standard for peering authentication.
We also propose future work to cover private peering, and alternative authentication methods.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://bgp.github.io/draft-ietf-peering-api/draft-peering-api-ramseyer-protocol.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ramseyer-grow-peering-api/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/bgp/draft-ietf-peering-api"/>.</t>
    </note>
  </front>
  <middle>
    <?line 44?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The Peering API is a mechanism that allows networks to automate interdomain interconnection  between two entities through global Internet Routing.
Using the API, networks will be able to automatically request and accept peering interconnections between Autonomous Systems in public or private scenarios in a time faster than it would take to configure sessions manually.
By speeding up the peering turn-up process and removing the need for manual involvement in peering, the API and automation will ensure that networks can get interconnected as fast, reliably, cost-effectively, and efficiently as possible.
As result, this improves end-user performance for all applications using networks interconnection supporting the Peering API.</t>
      <t>Business Justification:</t>
      <t>By using the Peering API, entities requesting and accepting peering can significantly improve the process to turn up interconnections by:</t>
      <ul spacing="normal">
        <li>
          <t>Reducing in person-hours spent configuring peering</t>
        </li>
        <li>
          <t>Reducing configuration mistakes by reducing human interaction</t>
        </li>
        <li>
          <t>And by peering, reducing network latency through expansion of interconnection relationships</t>
        </li>
      </ul>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>All terms used in this document will be defined here:</t>
      <ul spacing="normal">
        <li>
          <t>Initiator: Network that wants to peer</t>
        </li>
        <li>
          <t>Receiver: Network that is receiving communications about peering</t>
        </li>
        <li>
          <t>Configured: peering session that is set up on one side</t>
        </li>
        <li>
          <t>Established: session is already defined as per BGP4 specification (page 71)</t>
        </li>
      </ul>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>As peering connections exchange real internet traffic, this API requires a security component to verify that the requestor is allowed to request peering on behalf of that ASN.
In this initial proposal, this API requires PeeringDB-based authentication as the standard.
After further discussion, the authors decided to offer alternate authentication options to accomodate the security concerns of different parties.
As peers may require varying security standards, this API will support PeeringDB OIDC as the base requirement, with optional security extensions in addition (RPKI or alternate OIDCs, for example)
This document hopes that, through the RFC process, the Working Group can come to a consensus on a base "authentication standard," to ease adoption for peering partners.</t>
      <t>Of particular interest is RPKI.
PeeringDB OIDC allows the API to verify who the requesting party is, while RPKI-signing allows the requesting party to prove that they can configure a request.
The combination of both authorizations provides a strong security guarantee.
This document recognizes that not all partners have the time or engineering resources to support all authorization standards, so the API will offer an extensible security platform to meet varying security requirements.
For RPKI-based authentication, this document refers to RFC9323.</t>
    </section>
    <section anchor="protocol">
      <name>Protocol</name>
      <t>The Peering API follows the RESTful API mode.
After authentication, a client can request to add or remove peering connections, list potential interconnection locations, and query for upcoming maintenance events.</t>
      <section anchor="example-request-flow">
        <name>Example Request Flow</name>
        <t>For a diagram, please see: https://github.com/bgp/autopeer/?tab=readme-ov-file#sequence-diagram
### AUTH
First, the client makes an authenticated request to the server.
In this example, the client will use PeeringDB OAuth.
Authentication provides the server with client's email (for potential manual discussion), along with client's entitlements, to confirm client is permitted to request on behalf of the proposed ASN.
### REQUEST
1. ADD SESSION (CLIENT REQUEST)
  * Client provides:
    * Dictionary (multiple):
        1. Local ASN (server)
        2. Local IP
        3. Peer ASN (client)
        4. Peer IP
        5. Peer Type
        6. MD5 (optional)
        7. IXP ID
        8. Status
        9: UUID
        10. Sent prefixes (0 if not Established) (optional)
        11. Received prefixes (0 if not Established) (optional)
        12. Accepted Prefixes (optional)
  * Server actions:
    * Server confirms requested clientASN in list of authorized ASN.
    * Optional: checks traffic levels, prefix limit counters, other desired internal checks.
2.  ADD SESSION (SERVER RESPONSE)
  * APPROVAL CASE
    * Server returns dictionary of acceptable peering sessions.  Note: this dictionary may also contain additional sessions on which to peer.  See "Public Peering Session Negotiation" for details.
  * REJECTION CASE
    * Server returns dictionary of acceptable and rejected sessions.
  * Optional information:
    * The server may also include the following details:
      1. Prefix limit counters (optional value)
      2. TimeWindow: Time window indicating when sessions will be configured after being notified (may be 0 if sessions are already configured on receiver side)
      3. isInboundFiltered: optional bool that indicates whether prefixes will be filtered inbound.  If this is set to true, the time window should be set for how long the prefixes will be filtered.
      4. isOutboundFiltered: optional bool that indicates whether prefixes will be filtered outbound.  If this is set to true, the time window should be set for how long the prefixes will be filtered.  If the outbound limit is longer than the inbound limit time, the time window should be set to the max of inbound versus outbound.
### CLIENT CONFIGURATION
The client then configures the chosen peering sessions.
If the server added additional approved peering sessions, the client may choose whether or not to configure those sessions.
For every session that the server rejected, the client removes that session from the list to be configured.
### SERVER CONFIGURATION
The server configures all sessions that are in its list of approved peering sessions from its reply to the client.
### MONITORING
Both client and server wait for sessions to establish.
At any point, client may send a "GET STATUS" request to the server, to request the status of the original request (by UUID) or of a session (by session UUID).
The client will send a dictionary along with the request, as follows:
* Dictionary:
        1. Local ASN (server)
        2. Local IP
        3. Peer ASN (client)
        4. Peer IP
        5. Peer Type
        6. MD5 (optional)
        7. IXP ID
        8. Status
        9: UUID
        10. Sent prefixes (0 if not Established) (optional)
        11. Received prefixes (0 if not Established) (optional)
        12. Accepted Prefixes (optional)
The server then responds with the same dictionary, with the information that it understands (status, etc).
### COMPLETION
If both sides report that the session is established, then peering is complete.
If one side does not configure sessions within the server's acceptable configuration window (TimeWindow), then the server is entitled to remove the configured sessions and report "Unestablished" to the client.</t>
      </section>
    </section>
    <section anchor="api-endpoints-and-specifications">
      <name>API Endpoints and Specifications</name>
      <t>Each peer needs an API endpoint that will implement the API protocol.
This API should be publicly listed in peeringDB and also as a potential expansion of RFC 9092 which provides endpoint integration to whois.
Each API endpoint should be fuzz-tested and protected against abuse.  Attackers should not be able to access internal systems using the API.
Every single request should come in with a unique guid called RequestID that maps to a peering request for later reference.  This guid format should be standardized across all requests.  This guid should be provided by the receiver once it receives the request and must be embedded in all communication.  If there is no RequestID present then that should be interpreted as a new request and the process starts again.
An email address is needed for communication if the API fails or is not implemented properly (can be obtained through peeringdb).</t>
      <t>For a programmatic specification of the API, please see the public Github here: https://github.com/bgp/autopeer/blob/main/api/openapi.yaml</t>
      <t>This initial draft fully specifies the Public Peering endpoints.  Private Peering and Maintenance are under discussion, and the authors invite collaboration and discussion from interested parties.
## DATA TYPES
As defined in https://github.com/bgp/autopeer/blob/main/api/openapi.yaml.
Please see specification for OpenAPI format.
<tt>
Peering Location
 Contains string field listing the desired peering location in format `pdb:ix:$IX_ID`, and an enum specifying peering type (public or private).
</tt>
        <tt>
Session Status
 Status of BGP Session, both as connection status and approval status (Established, Pending, Approved, Rejected, Down, etc)
</tt>
        <tt>
Session Array
 Array of potential BGP sessions, with request UUID.
 Request UUID is optional for client, and required for server.
 Client may provide initial UUID for client-side tracking, but the server UUID will be the final definitive ID.  Request ID will not change across the request.
</tt>
        <tt>
BGP Session
* local_asn (ASN of requestor)
* local_ip (IP of requestor, v4 or v6)
* peer_asn (server ASN)
* peer_ip (server-side IP)
* peer_type (public or private)
* md5 (optional string)
* location (Peering Location, as defined above)
* status (Session Status, as defined above)
* UUID (of individual session.  Server must provide UUID.  Client may provide initial UUID for client-side tracking, but the server UUID will be the final definitive ID)
</tt>
        <tt>
Error
 API Errors, for field validation errors in requests, and request-level errors.
</tt>
The above is sourced largely from the linked OpenAPI specification.</t>
      <section anchor="endpoints">
        <name>Endpoints:</name>
        <t>(As defined in https://github.com/bgp/autopeer/blob/main/api/openapi.yaml)
On each call, there should be rate limits, allowed senders, and other optional restrictions.</t>
        <section anchor="public-peering-over-an-internet-exchange-ix">
          <name>Public Peering over an Internet Exchange (IX):</name>
          <ul spacing="normal">
            <li>
              <t>ADD/AUGMENT IX PEER</t>
            </li>
            <li>
              <t>Establish new BGP sessions between peers, at the desired exchange.</t>
            </li>
            <li>
              <t>Below is based on OpenAPI specification: https://github.com/bgp/autopeer/blob/main/api/openapi.yaml</t>
            </li>
          </ul>
          <t><tt>
POST: /add_sessions
 Request body: Session Array
Responses:
 200 OK:
  Contents: Session Array (all sessions in request accepted for configuration).
 300:
  Contents: Modified Session Array, with rejected or additional sessions.
 400:
  Error
</tt></t>
          <ul spacing="normal">
            <li>
              <t>REMOVE IX PEER
              </t>
              <ul spacing="normal">
                <li>
                  <t>Given a list of SessionArrays, remove the sessions in that list.</t>
                </li>
                <li>
                  <t>This API serves as a notification to the server, as the client may remove the sessions before sending the request to the server.</t>
                </li>
                <li>
                  <t>Server replies back with request ID and deletion status (complete, in-progress).
### UTILITY API CALLS
Endpoints which provide useful information for potential interconnections.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>LIST POTENTIAL PEERING LOCATIONS
              </t>
              <ul spacing="normal">
                <li>
                  <t>List potential peering locations, both public and private.</t>
                </li>
                <li>
                  <t>Below is based on OpenAPI specification: https://github.com/bgp/autopeer/blob/main/api/openapi.yaml
```
GET: /list_locations
 Request parameters:</t>
                </li>
                <li>
                  <t>asn (Server ASN, with which to list potential connections)</t>
                </li>
                <li>
                  <t>location_type (Optional: Peering Location)
 Response:
200: OK
 Contents: List of Peering Locations.
400:
 Error
```</t>
                </li>
              </ul>
            </li>
            <li>
              <t>QUERY for request status
              </t>
              <ul spacing="normal">
                <li>
                  <t>Given a request ID, query for the status of that request.</t>
                </li>
                <li>
                  <t>Given an ASN without request ID, query for status of all connections between client and server.</t>
                </li>
                <li>
                  <t>Below is based on OpenAPI specification: https://github.com/bgp/autopeer/blob/main/api/openapi.yaml
```
GET: /get_status
 Request parameters:</t>
                </li>
                <li>
                  <t>asn (requesting client's asn)</t>
                </li>
                <li>
                  <t>request_id (optional, UUID of request)
 Response:
200: OK
 Contents: Session Array of sessions in request_id, if provided.  Else, all existing and in-progress sessions between client ASN and server.
400:
 Error (example: request_id is invalid)
```</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="private-peering">
          <name>Private Peering</name>
          <ul spacing="normal">
            <li>
              <t>ADD/AUGMENT PNI</t>
            </li>
            <li>
              <t>Parameters:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Peer ASN</t>
                </li>
                <li>
                  <t>Facility</t>
                </li>
                <li>
                  <t>email address (contact)</t>
                </li>
                <li>
                  <t>Action type: add/augment</t>
                </li>
                <li>
                  <t>LAG struct:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>IPv4</t>
                    </li>
                    <li>
                      <t>IPv6</t>
                    </li>
                    <li>
                      <t>Circuit ID</t>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>Who provides LOA?  (and where to provide it).</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Response:
              </t>
              <ul spacing="normal">
                <li>
                  <t>200:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>LAG struct, with server data populated</t>
                    </li>
                    <li>
                      <t>LOA or way to recieve it</t>
                    </li>
                    <li>
                      <t>Request ID</t>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>300:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>Proposed Modification: LAG struct, LOA, email address for further discussion</t>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>40x: rejections</t>
                </li>
              </ul>
            </li>
            <li>
              <t>REMOVE PNI
              </t>
              <ul spacing="normal">
                <li>
                  <t>As ADD/AUGMENT in parameters.  Responses will include a request ID and status.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="public-peering-session-negotiation">
      <name>Public Peering Session Negotiation</name>
      <t>As part of public peering configuration, this draft must consider how the client and server should handshake at which sessions to configure peering.
At first, a client will request sessions A, B, and C.
The server may choose to accept all sessions A, B, and C.
At this point, configuration proceeds as normal.
However, the server may choose to rejest session B.
At that point, the server will reply back with A and C marked as "Accepted," and B as "Rejected."
The server will then configure A and C, and wait for the client to configure A and C.
If the client configured B as well, it will not come up.</t>
      <t>This draft encourages peers to set up garbage collection for unconfigured or down peering sessions, to remove stale configs and maintain good router hygiene.</t>
      <t>Related to rejection, if the server would like to configure additional sessions with the client, the server may reply back with additional peering sessions D and E.
The server will configure D and E on their side, and D and E will become part of the sessions requested in the UUID.
The client may choose whether or not to accept those additional sessions.
If they do, the client should configure D and E as well.
If they do not, the client will not configure D and E, and the server should garbage-collect those pending sessions.</t>
      <t>As part of the IETF discussion, the authors would like to discuss how to coordinate which side unfilters first.
Perhaps this information could be conveyed over a preferences vector.</t>
    </section>
    <section anchor="private-peering-1">
      <name>Private Peering</name>
      <t>Through future discussion with the IETF, the specification for private peering will be solidified.
Of interest for discussion includes Letter of Authorization (LOA) negotiation, and how to coordinate unfiltering and configuration checks.</t>
    </section>
    <section anchor="maintenance">
      <name>Maintenance</name>
      <t>This draft does not want to invent a new ticketing system.
However, there is an opportunity in this API to provide maintenance notifications to peering partners.
If there is interest, this draft would extend to propose a maintenance endpoint, where the server could broadcast upcoming and current maintenance windows.
A maintenance message would follow a format like:
<tt>
Title: string
Start Date: date maintenance start(s/ed): UTC
End Date: date maintenance ends: UTC
Area: string or enum
Details: freeform string
</tt></t>
      <t>The "Area" field could be a freeform string, or could be a parseable ENUM, like (BGP, PublicPeering, PrivatePeering, Configuration, Caching, DNS, etc).</t>
      <t>Past maintenances will not be advertised.
# Possible Extensions
The authors acknowledge that route-server configuration may also be of interest for this proposed API, and look forward to future discussions in this area.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <?line 335?>

<section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This project is joint work between Meta, AWS, Cloudflare, FullCtl, and Google.
Many thanks to my collaborators: Carlos Aguado (AWS), Ben Blaustein (Meta), Matt Griswold (FullCtl), Ben Ryall (Meta), Arturo Servin (Google), and Tom Strickx (Cloudflare).</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+1b7XPbxpn/jr9iR76Zozwk7cRueuFMp6UlWmUqS6xIxemn
BASWJGoQy8MCkpmb+9/v9zzP7mJByU0n18l9uc6kpoDdZ5/318VoNEqaoin1
RJ0ttK6Laqumi/lZkqWN3pr6OFFFtTFJkpusSvdYltfpphnV6d7qo65H29o8
jg6yc5QeitHr14lt1/vC2sJUzfGALfPZ6r1SL1RaWoNziirXB43/q5qzoTrT
edGYukhL+mM+fYd/TI1fd6v3Z0nV7te6niQ50JkkmamsrmxrJ6qpW508TNSb
BHBrnU7U3eoKvx9N/Qk4tYeJurq7/Zh80kc8yieJGql3Vwv6x2FLPwFwU2zb
Om2AbPKgqxanvFDKQfhIEJUQ8RGAiTtX9Ioe79OipCV/0p/T/aHU48zs6Xla
Z7uJ2jXNwU5evYpevgI4gC6aXbsGG9bbwythZqGbTczDMywrQbBtsMwDwvKx
7B0X5gsb3eNYHEFQh9o0JjPleNfsy7MkSdtmZ2riC05TatOWpQj47DtdVUd1
5zae8WtTb9Oq+Jn5NFEfdJPyYy1MOPOn/GmPN0QrDqhMvcf6B3B00a7LIlNX
jL56xD8K6ByM1Tlpm7IHnRWbImPwKq1ylRfploB2jHS0Ex+Jc0DfEJ2vkoQU
NByVJKPRSKVr29Rp1iTJR+2PAlw5rMEBaZ0r7CKVUE7vh6yf6lNlHoGDhd43
us4NKKzkN5Sl0hmj2OygBdud2pZmnZZqTq8r3ag70zYANU5Wu8LyaWaz0bVV
aXfsY3pUjVG1/s8WElYH4c3A6gZmuIdRjDa11udeTYfqAf9usGenCUjTWgAF
QA/AUWE1W9yQ2VcWBNk0gAbDUhHmpREuW8JRM4rAdJ1mnyCL9dEz4/Kdup1f
Xgz5VBhsC34e+6xz+ClSJDpH4I6J48xIz/ZN27S1ZsMkujMDevCyeICGd0QS
1mlJbGRBnkBV0KudyYE0i3df5HmpE1gbOF+bvGXaEqYo8mJEWYqt2Q66a/eg
JW1wSGkerYK0CCNLKJEu7QmbfyRytcYOrSH7R6MIs6bQ9pcV4d4SMo2wetgd
+1iUJUBCU0sd4QB6y/IYZMtcyTJ9aAK7T/CyAa8pIFRmb6Afy6Nt9J5U2KuX
6VhuM12ldWH4daqaYg8ZpdhQE4NAeANZtWWumvSTFomJk9Rexyx8X9USouPk
3ZGsFz4cqLUHJtRjCrFXIzyDImTYyMTUem8ePEcq7GNVEnDA58GUD2wDjLrX
Dcc94YbjEyTCLKRwAMxYtIG5GcjY6qbHKxwFoyZCh8CiLMD44xC02WakYaMZ
aR09oUPwoMgKoAFRYBPU2BaQ0ziZWuy1bdkQUtCuYg/iHqAHCGej1pJi65q9
UZVpJg1cUunhUDpFtqplhQionqqZbQ8HUzeeRZE2Q/eTd7SbePkdDDJ4THg9
iKG1z2wadqrqdIpNNqgV/eXlRVyzxbZiuEy7I0+k6qQIhSDBkrCfquIRqLxU
dxoWKbpK/LCmGu1MCy8ITYFovT5FZ8ebejEZpm5JDwk2KHBLdu0+dRaaium/
VNOK/VdQmrDYsZojapUdg8nqz4e0InUmd3oqBmiIyGtXHCwYD1dzYaoHYiYR
Sgy81JuiKvjvJJlCzICwJ/lC04pK9ANZU8vq7M09p01YsNO1Zl7NCUSKBGii
bhyirMuPkAAzmwhi9mQaGnq6rCC50hvh3H7fVkHT0jWcUMThC2/H+STI3Fl0
AIYoRJIlplSw9yLX2DiDCOBF7I52+h3kW0skXvkxEEWmojkavT0J6YNDutXq
91+dCyuXOoP4myOhRGeIrInPU9upY6RY+jP5cIDAgaUIi7wsYjxZqjNGchGk
5AVMlAKuPwRsOYAaSAHsDMEU9JJaO6uApTJBiA0gJA7PDhsQsda7tNyQtvDu
6fJmnMydoFkTgJoEvbR8DqUQWkfrlJTkJMSl1od4jrFwNhvyyZu2xuMaGZHN
WhfiaZ3kb1Ax8DkXnDnXCFH0SQw1B2EmRZsMTDGUVMuZHavgt+qKM4y8IHDE
tkNakwcZe+mQ/z96utRDWh9FlRwQT4GNmMD673zbSY7hCSemeKBkM0NJFAVr
sDbA159hyBKHKILleSE6drf4y1yZmAEEHliQH3Z5+LlkZsEud0giLctzGBwD
IXP3/sJ7PGF3L/1nVwkOSuRWoSwhLUmFkLMT5numDM9oj6YlaS609bIp4nUF
FsPb326E81lbprUoPWkk0CdKx8kpGyWx8cGy0/XHnYlV3Z8C9w7aHncFEhAC
OGLfT9GhA/RkS8N53YMOBnR0vPApQshLJb8Ek9ZF5fRvo9YGEhXNdcWEZXjQ
YMmRaxNr0rZNa/hBrccnYoPPM0D2Zyc7VRlO7AL31C51YYvTG5J/tYWPEh6D
jQhHmWZT8ErJgTrGLNZjawJfWZOdpVVeFymJC1gfEDooByDoew039cRCIi2H
oN8DPRbAc25heBJIas31BEBDRb998/WbMXvUhavunqTAG9NJ8262XKHO4+ew
fu1dzOmJ0Oiy4EidVsERkqbnObGSczj9nJ8enhYep2E1VB+SZwEyqgpS//YA
TSFolHtjN+dP+kEYlLx4oWZiv4iDgs57UMWcS32tOATj2a6s1r9cNv4RIe0P
FL72emQeRhtYwQtLsHHwyEHEuS/U9H715+R9UdtGHIFjzZ6TEvAnYp7OY26J
Y61hhF2YcF6oB4kVCllD7BaRy+8gnb4LCYbSQRYXKYD+3Uo5rgbsT4IMXHLd
xY9zqnTJzk42V9wIYqUchrwfauzwLDi674um6UfIk8ioo9KeIiTx8G7213vo
XvLVWE0vL9VytlzOb2/U4OJ6PrtZ+dfniVLIUuQ0T+yE+wwv1WXBGgRLUoM9
EvCCnLm8pP8B8jV0q6QzqZYm5pyHt1/7t/NFePZmzAyXDUJit+Gtexmt/517
tDoedHj4zVh9uPydGvgg1UH4/VjNf1io+WV48h9jteTyPTz5dqLu76MVX73G
EiEeGdVnSHrwWhUb9m5RDnb+3HlfgQMuR8x/1X7waMolAfYvwv544Usgx0on
OXcQjXvq1CUUGoAjbCUOI1Cza6DOhXOyXkEEyK07aKKync6oLpfcTpXwAiUU
UmgCFGggzmrJs+CxkeRIW/jT3GWG1PFgIOMEVPVVbjm7+352R65wcXuznAld
08Xi7vb76bW6mC5nfapqTdUOHHCnf0QDc4pr95NM2uLAG9jexPntbhvlTNwY
AaOaNMpcOLdxhTWVtbsi2/nMH9CWGtmE66B5z750SfiN3hoqH/D7jP1orgG6
tGMm62723exiRWT/CrqkWv+7VM6BuCSWlQqdN6pBBfyq802B4KLKyjaXeCzx
iGhwqHobhv4unhNxp4OIo2WrvcpCsivE9o9FlZvHCf+GQ6M/qF/FPpNcHBxo
x11fhYV0BdGWI+Bac6VoqKbGwwGhjnVsPWF3SumNK3kiCFwtSnHGBZNHEA6m
sPMKRViVvy8oJ6XyKRCzNqZ0ZZegC3MDtqzOwX49whu3H2sZHtRivnGVhxRt
FHDq1kWWJmKG3XEzZ615GenIDk/Z/4uz/sJR4yS4wsLets2/lg7jAP4WhLgj
dDjUaRgOpN2+7yWdzngBnf5LeLhAv08/SxtB9kMXuBzwVHIUdNHu4vbm/fzq
/m5KlilJsoQ8CvadYkmYz3aIpNVTJ5M4kpypwZWQLncOJT1wmp4/2XmSxBzp
BOrSepGBrRQuem2/hpCIzqa0C16ZGsJx+yDCxzuO3mmSN7qM3e/c1GbPizg8
4NieeQrjnM9+yjgbRR7hGWXxwWCl31uTWFXR2C4CfYk5gg0trfWhPHrhCv6C
y4fbm/nq9m5+c5W8MyF9Ym/pU7K0EPXs8EDB58MvsjpajSrBFFTjRpKAoCFD
dXY1W6nlarq6X549n08O4/SrPxZgNa8L1DpQAr9ksD5yonFO0uXZgec+vfG/
ecU4Vkgp2gWrKE5EyWNUIw65vSrVxiSJE7b/z9J+uywtsgp2J7CJg6ly24nL
pnBlnTSH3ZsomjuH3ig4L7gyKoRxjKjZUOkmO3cu7fbD4nrG9jh31b3lEgX2
Q0V15BdC11B3NA4FyTDasNyrK3Wj2cH5FiSqX4Ak/jwziiD0iyqyDpQyURrT
7yY7Fz7oModzh0PkvIpQC7k6Z+974FHU77ICzpOY2rP7KiLu7NR9UJ1Opfes
ytn4Ze8ybpTaZJYi+SOG8HTE+qGldntcc5gMsyBO7V3g4EVhxNuNH7tgJYMg
ODXygtKiPoSCU6ZvSNVSasN0tWOvR049sW9ff/u1y1BDORpwo+x76zgN2h93
pkC0YIp6NHRIbdqffx41UiwQDkSBm9VskSLTBGyN0piS+KahGSUNEWQ3qUM8
P8t4OhEKAOtGYG08fwMyErbwrAyey0Pkhl5RiUGkUP0Cr9W2LfAKcQVIuebD
/FLEsE8P0k0NGuwhkvuneUMt/RpqKoAGlgrDE0OLUwnXa+KyKM1qYyWWOYC2
tzsSqsiAJx/ii10iSn1csl/3oNfNY07vW8v80/u15uSBCpKy7M8QQupEMZQs
MOIAvJcNWYuE9IAWSwEL3NAthS4/9k6PB0ogvSZbIIEjOlaui4FkpmaJWrYE
NynsoUde0+v+hmoJJW18Uo1gHexozUHXUP0BNbSAn1lTAUbm7Vq+Tn75Gn7N
dZWwiXpAPJM9mWaYcGzccxKiejcdeMrzi62odWnWr6jv9YqucOBZhX/Hx3Rf
JmLIfrjAtzv4psbRY+Qke1IeeksjtVm4sa9/R+z/EDXZKD9iL9+bMHgh+SlD
UT0UDTnAskzXpo4vavhNLnlybWpiux8bIFBcTldTtfrbYrakIYIfGEHnfj1z
xsmi431fQKQpt1gqDVAytXHy008/+Y45pxk8NqQBFKkCaSG/AUdLuT7h3YZv
LXgT9y1MQt6Z8U+HfD0pPk/+bf7Dj/PLn9xlBihy1e4dZsd40EoXitTgyWT+
XJCk/3x971ORZUjw6KrH0l/1kHa6je93uFSQMeA0l3yhPBvM4si7gJLwoHTq
suEhjNtn7ZfmsZI4/wSlaV2nx0T+IYS6YBHdQrEurfA2TwkUCsq76E8y1FBE
smlzmBy6gMoN8tzl0dJE9a1BypWd4wumwRA7KCNOG+gK0Cemcd32yhNe7etE
7kpwvpy7iS6iPdBVAV2/mDMQmUM6Fx151U54kYiQB5O+lD+mFsk2JbHgWBg5
nofXxUEN5ovey6F6eEvK8fANLSPVESCOBMAKz2m3PBa654vw6kuqhvf7PEqJ
nf57jGSgdmounOKHYe8aSkPrvXb1dfb5tcz4ARfKeQEBtl3viztd0jei0OQF
zJqjflvRd0o/q2tTJ5K10U83TBQvAdMqcmGV5pfkEnzA7vQYf424ielWiaJQ
os5s4b4Hj6Pgd9J6q+Hco6K4ontZ3pf1vJybi3hXP0kG/yrPep7cgiRK2yjv
GboEoAvvNcUTbpEQmW5mTnUid2SJbunKBuWigFBLySHjnBenEYsvhcFlhgtU
Mz/xH8x/OKd6cnp5+Wp6f/WBWijzH9RiNruLryZwihF7oHAviifWQKvpuXN/
o2AMIO90SV1Dq2QAB3k+y/D/XSTn+HO7XE3UK6Q2P3o0O6e4Nvlxovpu9o7L
N8tjkK9fv1a3f6FimoIWTWlOVqtBr/vRKaOrh0IKFVVEiDnqzevXfagfTC59
0B744NJdT9jUz3WwAe+twBPbIbLp+srsw+33syA46hRfwdhoXO67Mu4wPssO
47IrJokzTdoireiu0CHzti7bNN3dqNPOibtsELVdnjtorcEpzTrt84AvTPZ6
LfVDSQkZXabshz+4HM6VNErbKEgPfLU7BGUjTjiBgCut71fz6/nqb0zcxfT6
epl0dWOvAKPZIU114/K9PwE8vadFOn89X67U4nYFc5pPr1kq85srdX17we21
JRN23Z/mnqZA1mUgLrxIAcfxRfjyW9gV6dfVjKyKlOLHgFpnV0hD072mUcKE
seIougxR1Kl1mLp88eqslVmRP8GF1m5udRotzwkFMV86GOY7gf1SK6eztGun
+6d7edDi7KhvSH+9n939jeUbqlffrupMqtO7YTRjP+0Upk2Xu0S7K262EVPo
+tjzoKJ7yGWPR8HrPumL/l+oxFY3P3r2/EN1iO65hHk4XojE3csfUXmHfGko
iUSXsP0z0u57a7N5zlfjlCHVtb6yR+4zK63mOIugVXQXOCOX8TToOfaTJPsi
6CmVGrgLCZOYSK44ObmRREjidb+MPAnIi5t5Ak4terylB653K3+9T7OiLJqj
/NUv8wc8Fc2kuwvg7p49f3qBNRD8lqp5eXs9vaKEtc0a11t+iZz34W30+xv/
+6Kos7ZoXIv3pfq4M13n6vp2+keFsAkOPXKO05guvWwoNr7sSRV/fu3410fD
ORGXYyIppCbaoaUWUB5W304pZobr/1mhKftr/Puu2pCT3kQnLfyVCgnN3khi
BAB+eMJTTlWfXB8U6G9ff564WM7uMoRoFiVJwPYkTO3CIF2ujVxm4pqRbsSb
nsY8Mb8x31H6xRk2XzBMa3aJLqhEt4y6rMVfiuJ+CJcLmbtIyjPBKMBHcxmX
v+6ol72jq+3USGWvHw9qug6zO5kHNhu5/5P2JiPBAfvtEMA7yX8vxnEnPhqz
uU7loelPqno7p42Q5ydEvQ42d824MUx9LsT7cpz8GQm4jIW+dCYJusNUvXOH
pI0/pHeliGmj+VeXyUwFOYCtP0lT78zPIYZn/O4dP/QthPFZzAAG2R9veohC
dZiZRaLrCWPqmePmnv6CWteQ5/MfNdUrRRPV69TUbQ9j10oTldFVhoor3Wp/
n5XuAcrN521ar+muMnW6XEuF76dV8cQf5kQfCT0zWw3jAuh9mD5IO4ZvttG9
j60xqAwRXEldj1sQgnwJqT57Cy+tTPS86I155buMsjj9LuO5myRhrOP7KifK
cSrhCMaTsaiY8mz8RKYdCm6J4tmRLuQqhAjXv3JVN0vEW3kv6+4uDrmBjrSN
Vrt/bmDtDEum1c+WJqI8R0ivN5gO/f9TYpxGxRvpsKfX9/qzKbe966L2PZBT
sZFTMYfwwdUaHbaxNyQo/Bnll66B91XDrRJvSJpi6rzgK9HO43HdUMkVCSvu
jS4U1zseaUjTuSsnMl/5Z/QNxJFMgOt1HmHKeMOqB9BiavH0J8nCyrXZ3adg
Uc84aCkR53T0SSv35GOx0L6xBjkKV6pjuiwdbkjzRajuDBebEO51QzYHdk57
F30HiJ3nqurikEjuKfM8x3wK1nfN/s4ZGBA12GO/E+aY9HUHwS74kxI3IGmK
7JPm9E6GV33HLiOYlK7x07Cxregisf/OxF349rlLfIk2LobDByX9m+bxjMcz
sRdiRbn4rnPuzpEvKvvXdV19OvTJVHxDgxWoNmmepbbprvsyF9u6FuPuYMmg
lj456D3ewzjIOwtCctsAWLg+PGn/RLpr8kmzNDWTJU2Y1CV9Qqz4m4cYJI+f
BvaVzs8nKLovqMz+0lpQaGXRlD85dkMDvl7e7pNLd6NN0QecfAPcIcBZNLmx
M9p35vqHwarS0w38BXT0GqKymieds5v7D0Mx88G7q8XQJVXhE1ZneeHvi37a
dJFmO35+ebP0c/xkQRKJyLSdT6PTcwiwKSxfxlEL9ymcmoWPMKSV6dwQwkll
Hkudb90nAhznRicXddynXf5+IE3kTsxXEqDoG2H3Xasxn+j9I32ECkV84lBs
MAn6KJxtcT69mT750OjkKxBOpmRlGtqU/KkpBUge3AfC+IK0AACCFKnJbv7O
k23+MMvXYPSV9FBNP4LTF6Vp800JnIbqfVuWF00pBF0Zs6UPCz/QlSC6hiZf
pO6P0agNfJ1AcnVpYOjbNkUQGgDqOXJGnPKuTJEAa5A9oAPx9EPaNOqqLuyj
gQIN3Hlu+d2REk+/dApHUhtuYBEAweZcUFuZvVpS2/bTZzXoCCCN+a+JfJev
8z+cbSBCffbfSfI/bG4HoUtAAAA=

-->

</rfc>
