From 951f806008dec2c3161222348a0ea4c6eabe194f Mon Sep 17 00:00:00 2001 From: SumitAgarwal123 <50443968+SumitAgarwal123@users.noreply.github.com> Date: Tue, 23 Jul 2019 04:00:23 +0530 Subject: [PATCH] BFD Enhancement (#383) * BFD Enhancment HLD * mend --- bfd/BFD_Enhancement_HLD.md | 453 +++++++++++++++++++++++++++++++ bfd/images/BFD_Block_Diagram.png | Bin 0 -> 27717 bytes bfd/images/BFD_Block_Diagram.xml | 2 + 3 files changed, 455 insertions(+) create mode 100644 bfd/BFD_Enhancement_HLD.md create mode 100644 bfd/images/BFD_Block_Diagram.png create mode 100644 bfd/images/BFD_Block_Diagram.xml diff --git a/bfd/BFD_Enhancement_HLD.md b/bfd/BFD_Enhancement_HLD.md new file mode 100644 index 0000000000..8c580dd019 --- /dev/null +++ b/bfd/BFD_Enhancement_HLD.md @@ -0,0 +1,453 @@ +# Feature Name +Bidirectional Forwarding Detection +# High Level Design Document +#### Rev 0.2 + +# Table of Contents + * [List of Tables](#list-of-tables) + * [Revision](#revision) + * [About This Manual](#about-this-manual) + * [Scope](#scope) + * [Definition/Abbreviation](#definitionabbreviation) + +# List of Tables +[Table 1: Abbreviations](#table-1-abbreviations) + +# Revision +| Rev | Date | Author | Change Description | +|:---:|:-----------:|:------------------:|-----------------------------------| +| 0.1 | 05/15/2019 | Sumit Agarwal | Initial version | +| 1.0 | 18/06/2019 | Sumit Agarwal | Updated community review comments | + +# About this Manual +This document provides general information about the BFD feature implementation in SONiC. +# Scope +This document describes the high level design of BFD, with software implementation.In this implementation, the BFD state machines and session termination happens on the Host CPU, specifically in FRR. + +# Definition/Abbreviation +### Table 1: Abbreviations +| **Term** | **Meaning** | +|--------------------------|-------------------------------------| +| BFD | Bidirectional Forwarding Detection | +| BGP | Border Gateway Protocol | +| GR | Graceful Restart | + +# 1 Requirement Overview +## 1.1 Functional Requirements + 1. Support monitoring of forwarding path failure for BGP neighbor. + 2. Support BFD single hop sessions. + 3. Support BFD multi hop sessions. + 4. Support Asynchronous mode of operation. + 5. Support Echo mode of operation. + 6. Support IPv4 address family. + 7. Support IPv6 address family. + 8. Support LAG interface. + 9. Support ECMP paths for multi hop session. + 10. Support FRR container warm reboot. + 11. Support 64 BFD sessions. + 12. Support minimum timeout interval of 300 milliseconds. +## 1.2 Configuration and Management Requirements +BFD will support CLI in FRR vtysh shell. +## 1.3 Scalability Requirements +Support 64 BFD session with timer of 100 * 3 milliseconds, i.e. detection time of 300 milliseconds. +## 1.4 Warm Boot Requirements +BFD should support planned/unplanned restart of BGP container. + +# 2 Functionality +## 2.1 Target Deployment Use Cases +BFD supports creation of single hop and multi hop session to monitor forwarding path failure. +Single hop session are created for iBGP. +Multihop session are created usually for protocols like eBGP where the neighbors are multiple hop apart. +## 2.2 Functional Description +This document provides functional design and specifications of BFD protocol as defined in RFC 5880, 5881, 5882 and 5883. + +Bidirectional Forwarding Detection, (BFD) is a protocol defined by the BFD working group at IETF. The protocol defines a method of rapid detection of the failure of a forwarding path by checking that the next hop router is alive. The protocol will be able to detect the forwarding path failure in milliseconds depending on the actual configuration. Currently a Routing Protocol takes a few seconds (from 3 seconds to 180 seconds or even more) to detect that the neighbouring router, the next hop router, is not operational causing packet loss due to incorrect routing information. BFD is designed to provide a rapid forwarding path failure detection service to a Routing Protocol in a few milliseconds. + +# 3 Design + + + +![BFD](images/BFD_Block_Diagram.png "Figure 1: BFD in SONiC Architecture") + +__Figure 1: BFD in SONiC Architecture__ + + +BFD is part of the FRR BGP container in SONiC system. BFD daemon communicates with linux kernel using UDP socket to send and receive BFD packets. BFD relies on Linux kernel for routing of BFD packet to its destination. +BFD communicates to applications like BGP through Zebra, BGP sends BFD session create/delete events through Zebra and in case of session timeout BFD informs BGP through Zebra. +## 3.1 Overview +### 3.1.1 Packet Tx +In current FRR BFD implementation, for packet Tx BFD packet is constructed every time a packet has to be sent, this is an overhead considering BFD needs to send packet every few milliseconds. A better approach is to store the BFD packet in memory for each session and keep replaying the packet as per the BFD transmission interval. + +**Stored packets are updated in below circumstances:** + + 1. **Local configuration change:** +When BFD timer configuration is changed the packet stored in memory will be flushed and new packet will be constructed until new timer negotiation is complete. + + 2. **Received Rx packet with poll bit set:** +When a Rx packet is received with poll bit set, BFD will flush the stored Tx packet and a fresh packet will be sent until the negotiation is complete. + +### 3.1.3 LAG support: +When deploying BFD over LAG interface it is expected that BFD session do not flap when a LAG member port flaps. BFD packets are send over a member port in the LAG based on the hashing in the kernel. When the port on which BFD packets are being sent goes down, BFD packets should seamlessly switchover to next available member port in LAG decided by hasing in the kernel. +One BFD session will be created per LAG irrespective of number of member port in the LAG. RFC 7130 does specifies creation of BFD session for each member port of LAG, but this will not be implemented. + +Supporting LAG is challenging in BFD due to time it may take for member port down event to reach control plane, in SONiC when a port is DOWN, the down event has to traverse up to ORCH agent and then back to the kernel, this may take considerable time. + +In current SONiC implementation BFD relies on kernel network stack to switch the BFD packet to next available active port when a member port goes DOWN in LAG. BFD timers in this case is directly proportional to the time it takes for kernel to get the port down event. Faster the kernel learns port down the more aggressive BFD timers can be. In this case it is suggested to configure BFD timer values to have a timeout value of atleast 600 msec. + +### 3.1.4 ECMP Support: +For BFD multihop session there could be multiple nexthop to reach the destination, it is expected that BFD session do not flap when an active nexthop goes down, BFD session should seamlessly switchover to next available nexthop without bringing down the BFD session. + +Supporting ECMP is challenging in BFD due to time it may take for control plane to know that the active nexthop went down. In SONiC this information has to traverse all the way down to kernel after traversing all the DBs this may take considerable time. + +In current SONiC implementation BFD relies on kernel network stack to switch the BFD packet to next available nexthop when a active nexthop goes down. BFD timers in this case is directly proportional to the time it takes for kernel to get the nexthop down event. Faster the kernel learns active nexthop is down the more aggressive BFD timers can be. In this case it is suggested to configure BFD timer values to have a timeout of atleast 600 msec. + +## 3.2 CLI +### 3.2.1 Data Models +NA +### 3.2.2 Configuration Commands + +Config commands as in FRR BGP container is described at below link. +[Config commands](http://docs.frrouting.org/en/latest/bfd.html) +### 3.2.3 Show Commands + +Show commands as in FRR BGP container is described at below link. +[Show commands](http://docs.frrouting.org/en/latest/bfd.html) +**show bfd peer [{multihop|local-address |interface IFNAME ifname|vrf NAME vrfname}]** + +This command is enhanced to add detect-multiplier, enhanced show output is as below: +``` +sonic# show bfd peer + BFD Peers: + peer 10.0.0.103 interface Ethernet204 + ID: 2 + Remote ID: 5 + Status: up + Uptime: 30 second(s) + Diagnostics: ok + Remote diagnostics: ok + Local timers: + Detect-multiplier: 3 + Receive interval: 300ms + Transmission interval: 300ms + Echo transmission interval: disabled + Remote timers: + Detect-multiplier: 3 + Receive interval: 200ms + Transmission interval: 200ms + Echo transmission interval: 0ms +``` + +A new show command is added as below: + +**show bfd peers brief** +Show all the BFD peer in brief, sample output as below: +This command is available in FRR vtysh shell. + +``` +Session count: 1 +SessionId LocalAddr NeighAddr State +========= ========= ========= ===== +1 192.168.0.1 192.168.0.2 UP +``` +### 3.2.4 Debug Commands +Debug commands as in FRR BGP container is described at below link. +[Debug commands](http://docs.frrouting.org/en/latest/bfd.html) + +In current FRR implementation of BFD, debug are reported only in error cases. To debug issues it is necessary to have a few debug in positive code flow to trace the code flow. A few debugs is added in the positive code path and a new command is added to enable/disable debugs in positive code flow. These debugs will be reported only when enabled through this new command. Error debugs will continue to be reported always as in the current FRR BFD implementation. + +This new command will be available in FRR vtysh shell. +Command syntax as below : +**[no] debug bfd** + +### 3.2.5 REST API Support +NA + +# 4 Flow Diagrams +NA + +# 5 Serviceability and Debug +**Configuring BFD** +In order to monitor a forwarding path BFD need triggers from the application to create BFD session with the remote peer. Below are the steps to enable BFD in BGP. + +``` + sonic# + sonic# conf t + sonic(config)# router bgp + sonic(config-router)# neighbor 1.1.1.1 remote-as 7 + sonic(config-router)# neighbor 1.1.1.1 bfd +``` + +Different timer values can be configured to achieve the desired failure detection time. Below configurations can be used to configure BFD timers. + +``` + sonic(config)# bfd + sonic(config-bfd)# peer 1.1.1.1 + sonic(config-bfd-peer)# detect-multiplier 3 + sonic(config-bfd-peer)# receive-interval 200 + sonic(config-bfd-peer)# transmit-interval 200 +``` +**Show Output** +Below output shows BFD session in UP state established for BGP protocol. + +``` + sonic# show bfd peer + BFD Peers: + peer 10.0.0.103 interface Ethernet204 + ID: 2 + Remote ID: 5 + Status: up + Uptime: 30 second(s) + Diagnostics: ok + Remote diagnostics: ok + Local timers: + Receive interval: 300ms + Transmission interval: 300ms + Echo transmission interval: disabled + Remote timers: + Receive interval: 200ms + Transmission interval: 200ms + Echo transmission interval: 0ms +``` +**BFD Counters** +Below output shows BFD counter for particular BFD session +``` +sonic# show bfd peer 192.168.0.1 counters + peer 192.168.0.1 + Control packet input: 126 packets + Control packet output: 247 packets + Echo packet input: 2409 packets + Echo packet output: 2410 packets + Session up events: 1 + Session down events: 0 + Zebra notifications: 4 +``` +# 6 Warm Boot Support +Planned/unplanned warm-boot of a BGP container can be achieved by running BGP in GR mode. + +When BGP container is rebooted, remote BGP neighbour enters GR helper mode when BFD indicate timeout and GR helper mode is enabled. If the flag in BFD control packet indicate that the BFD in remote neighbour is not control plane independent, BFD session down event can be a trigger to BGP to enter helper mode. In GR helper mode remote BGP neighbor should not delete the routes learnt through BGP neighbour and keep the forwarding plane intact until GR timeout. +After warm-boot is completed BGP will re-establish all the sessions and trigger BFD to establish corresponding BFD sessions. + +# 7 BFD packet trapping to CPU + + +BFD packets are classified based on packet pattern defined in RFC 5880. Trapping of Single-Hop and Multi-hop BFD packets for IPv4 and IPv6 address family is supported. + + + +BFD related control plane QoS can be configured by user via 00-copp.config.json file. User can specify which CPU queue a protocol (e.g. BFD) is trapped to and policing parameters to rate limit the protocol packet. Below is an example of the BFD protocol trapping COPP (Control Plane Policing) configuration in 00-copp.config.json file: + +``` +{ +"COPP_TABLE:trap.group.bfd": { +"trap_ids": "bfd,bfdv6", +"trap_action":"trap", +"trap_priority":"5", +"queue": "5", +"meter_type":"packets", +"mode":"sr_tcm", +"cir":"60000", +"cbs":"60000", +"red_action":"drop" +}, +"OP": "SET" +} +``` + +# 7 Scalability + - No of sessions: 64 + - Transmit-interval: 100 milliseconds + - Receive-interval: 100 milliseconds + - Detect-multiplier: 3 + +Goal is to support 64 BFD session with timer of 100 * 3 milliseconds, i.e. minimum detection time of 300 milliseconds. +These timer values are subject to revision based on the BFD sessiom stability observed during multi-dimensional scale test. + +# 8 Enable/Disable BFD daemon +BFD daemon can be enabled and disabled at compile time as well as in the switch. + +**Enable/Disable at Compile time** + +To enable BFD add the below text in corresponding files as below: + +**../dockers/docker-fpm-frr/supervisord.conf** +``` +[program:bfdd] +command=/usr/lib/frr/bfdd -A 127.0.0.1 +priority=4 +stopsignal=KILL +autostart=false +autorestart=false +startsecs=0 +stdout_logfile=syslog +stderr_logfile=syslog +``` + +**../dockers/docker-fpm-frr/start.sh** +``` +supervisorctl start bfdd +``` + +**Enable/Disable in the switch** +BFD daemon can be enabled/disabled in the same way as done during compile time. The file path on the switch are as below. After modifying these files BGP container should be restarted. + +./etc/supervisor/conf.d/supervisord.conf +./usr/bin/start.sh + +# 9 Unit Test +Unit test cases for this specification are as listed below: + +|**Test-Case ID**|**Test Title**|**Test Scenario**| +|----------------|--------------|-----------------| +| | BFD for BGP IPv4 single-hop | +1| | Verify BFD session establishment.| +2| | Verify BFD packet transmission as per configured interval| +3| | Verify BFD state notification to BGP +4| | Verify BFD session establishment trigger from BGP +5| | Verify change of BFD transmission configuration at run time. +6| | Verify deletion of BFD session by BGP config +7| | Verify timeout of BGP session. +8| | Verify timeout notification to BGP. +9| | Verify deletion of BFD session after timeout. | + ||BFD for BGP IPv4 single-hop over LAG | +10| | Verify BFD session establishment. +11||Verify session flap on LAG down +12||Verify session flap on LAG member down. +13||Verify session flap on LAG member UP. + ||BFD for BGP IPv4 multi-hop | +14| | Verify BFD session establishment. +15| |Verify BFD packet transmission as per configured interval +16| |Verify BFD state notification to BGP +17| |Verify BFD session establishment trigger from BGP +18| |Verify change of BFD transmission configuration at run time. +19| |Verify deletion of BFD session by BGP config. +20| |Verify timeout of BGP session. +21| |Verify timeout notification to BGP. +22||Verify deletion of BFD session after timeout.Verify BFD session establishment. + ||BFD for BGP IPv4 Multi-hop over LAG| +23| |Verify BFD session establishment. +24| |Verify session flap on LAG down +25| |Verify session flap on LAG member down. +26| |Verify session flap on LAG member UP. + ||BFD for BGP IPv4 Multi-hop with ECMP| +27| | Verify BFD session establishment for BGP neighbour having ECMP paths. +28| |Verify BFD session switch to next available ECMP path on active path DOWN +29| |Verify BFD session timeout on all ECMP path DOWN. +30| |Verify BFD session timeout when an intermediate path is DOWN. + ||BFD for BGP IPv6 multi-hop| +31| |Verify BFD session establishment with link-local address. +32| |Verify BFD session establishment with global address. +33| |Verify BFD packet transmission as per configured interval +34| |Verify BFD state notification to BGP +35| |Verify BFD session establishment trigger from BGP +36| |Verify change of BFD transmission configuration at run time. +37| |Verify deletion of BFD session by BGP config. +38| |Verify timeout of BGP session. +39| |Verify timeout notification to BGP. +40| |Verify deletion of BFD session after timeout. + ||BFD for BGP IPv6 Multi-hop over LAG| +41| |Verify BFD session establishment. +42| |Verify session flap on LAG down +43| |Verify session flap on LAG member down. +44| |Verify session flap on LAG member UP. + ||BFD for BGP IPv6 Multi-hop with ECMP| +45| |Verify BFD session establishment for BGP neighbour having ECMP paths. +46| |Verify BFD session switch to next available ECMP path on active path DOWN +47| |Verify BFD session timeout on all ECMP path DOWN. +48| |Verify BFD session timeout when a intermediate path is DOWN. + ||BFD CLI| +49| |Verify CLI to cofigure BFD for BGP +50| |Verify CLI to configure transmit interval +51| |Verify CLI to configure receive interval +52| |Verify CLI to configure detection multiplier +53| |Verify CLI to configure echo multiplier +54| |Verify CLI to enable echo mode +55| |Verify CLI to disable echo mode +56| |Verify CLI to shutdown BFD peer. +57| |Verify CLI to configure static IPv4 single hop peer. +58| |Verify CLI to configure static IPv4 multi hop peer. +59| |Verify CLI to configure static IPv4 single hop peer with local address +60| |Verify CLI to configure static IPv4 single hop peer with interface. +61| |Verify CLI to configure static IPv4 single hop peer. +62| |Verify CLI to configure static IPv4 multi hop peer. +63| |Verify CLI to configure static IPv4 single hop peer with local address +64| |Verify CLI to configure static IPv4 single hop peer with interface. +65| |Verify CLI to configure static IPv6 single hop peer. +66| |Verify CLI to configure static IPv6 multi hop peer. +67| |Verify CLI to configure static IPv6 single hop peer with local address +68| |Verify CLI to configure static IPv6 single hop peer with interface. +69| |Verify CLI to configure static IPv6 single hop peer. +70| |Verify CLI to configure static IPv6 multi hop peer. +71| |Verify CLI to configure static IPv6 single hop peer with local address +72| |Verify CLI to configure static IPv6 single hop peer with interface. +73| |Verify CLI to configure static IPv4 single hop peer. +74| |Verify CLI to un-configure static IPv4 multi hop peer. +75| |Verify CLI to un-configure static IPv4 single hop peer with local address +76| |Verify CLI to un-configure static IPv4 single hop peer with interface. +77| |Verify CLI to un-configure static IPv4 single hop peer. +78| |Verify CLI to un-configure static IPv4 multi hop peer. +79| |Verify CLI to un-configure static IPv4 single hop peer with local address +80| |Verify CLI to un-configure static IPv4 single hop peer with interface. +81| |Verify CLI to un-configure static IPv6 single hop peer. +82| |Verify CLI to un-configure static IPv6 multi hop peer. +83| |Verify CLI to un-configure static IPv6 single hop peer with local address +84| |Verify CLI to un-configure static IPv6 single hop peer with interface. +85| |Verify CLI to un-configure static IPv6 single hop peer. +86| |Verify CLI to un-configure static IPv6 multi hop peer. +87| |Verify CLI to un-configure static IPv6 single hop peer with local address +88| |Verify CLI to un-configure static IPv6 single hop peer with interface. +89| |Verify CLI to display IPv4 Peer. +90| |Verify CLI to display IPv4 peer with local address +91| |Verify CLI to display IPv4 peer with interface. +92| |Verify CLI to display IPv6 Peer. +93| |Verify CLI to display IPv6 peer with local address +94| |Verify CLI to display IPv6 peer with interface. +95| |Verify CLI to display IPv4 multihop Peer. +96| |Verify CLI to display IPv6 multihop Peer. +97| |Verify config save and reload of BFD configuration. +98| |Verify unsaved config loss after relaod. + ||BFD static peer| +99| |Verify BFD static IPv4 single hop peer establishment. +100| |Verify BFD static IPv4 multi hop peer stablishment. +101| |Verify BFD static IPv4 single hop peer stablishment with local address +102| |Verify BFD static IPv4 single hop peer with interface. +103| |Verify BFD static IPv6 single hop peer establishment. +104| |Verify BFD static IPv6 multi hop peer stablishment. +105| |Verify BFD static IPv6 single hop peer stablishment with local address +106| |Verify BFD static IPv6 single hop peer with interface. + ||BFD echo mode| +107| |Verify BFD session with echo mode. +108| |Verify BFD echo mode packet transmission as per configured interval +109| |Verify echo mode timeout of BGP session. +110| |Verify echo mode timeout notification to BGP. +111| |Verify echo mode deletion of BFD session after timeout. + ||BFD scale| +112| |Verify 64 BFD IPv4 single hop ession with 100 * 3 msec timer +113| |Verify 64 BFD IPv4 mulit hop ession with 200 * 3 msec timer +114| |Verify 64 BFD IPv6 multi hop ession with 200 * 3 msec timer +115| |Verify 64 BFD IPv6 single hop ession with 100 * 3 msec timer +116| |Verify LAG member down with 64 BFD IPv4 single hop session with 100 * 3 msec timer +117| |Verify LAG member down with 64 BFD IPv4 mulit hop ession with 200 * 3 msec timer +118| |Verify LAG member down with 64 BFD IPv6 multi hop ession with 200 * 3 msec timer +119| |Verify LAG member down with 64 BFD IPv6 single hop ession with 100 * 3 msec timer +120| |Verify active ECMP path down with 64 IPv4 multi hop session. +121| |Verify active ECMP path down with 64 IPv6 multi hop session. +122| |Verify echo mode with 64 IPv4 single hop session. +123| |Verify echo mode with 64 IPv6 single hop session. +124| |Verify 64 IPv4 single-hop static BFD session. +125| |Verify 64 IPv4 multi-hop static BFD session. +126| |Verify 64 IPv6 single-hop static BFD session. +127| |Verify 64 IPv6 multi-hop static BFD session. + ||BFD LOG| +128| |Verify log generation on BFD session UP. +129| |Verify log generation on B sFDession DOWN. +130| |Verify log generation on BFD session DOWN with DOWN reason ADMIN_DOWN. +131| |Verify log generation on BFD session DOWN with DOWN reason "detection timeout" +132| |Verify log generation on BFD session DOWN with DOWN reason "neighbour signalled session down" + ||BFD INTEROPERABILITY| +133| |Verify BFD IPv4 single-hop session establishment with third party device. +134| |Verify BFD IPv6 single-hop session establishment with third party device. +135| |Verify BFD IPv4 multi-hop session establishment with third party device. +136| |Verify BFD IPv6 multi-hop session establishment with third party device. +137| |Verify run time timer config change for BFD sessions with third party device. + + diff --git a/bfd/images/BFD_Block_Diagram.png b/bfd/images/BFD_Block_Diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..2ff9406c8bbc65b289ef7eea3c707118409588f8 GIT binary patch literal 27717 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 literal 0 HcmV?d00001 diff --git a/bfd/images/BFD_Block_Diagram.xml b/bfd/images/BFD_Block_Diagram.xml new file mode 100644 index 0000000000..80ca5b71a1 --- /dev/null +++ b/bfd/images/BFD_Block_Diagram.xml @@ -0,0 +1,2 @@ + +3Vldc9soFP01foxHAn35sXGa7LTpNttkpu2+7GCBLSZIeBCOpf31CxGyhZDjeCt3u3mKOFxfiXMP917IBM7z6kagdfaJY8ImwMPVBF5NAPB9D6o/GqkbJIpnDbASFBujPXBP/yYG9Ay6oZiUlqHknEm6tsGUFwVJpYUhIfjWNltyZr91jVbEAe5TxFz0K8Uya9AExHv8N0JXWftmPzLry1FrbFZSZgjzbQeC7ydwLjiXzVNezQnT5LW8NL+7PjC7+zBBCvmaH3z8EH+4fbgkj1X4x0Nef56BOb4wXp4Q25gFfyGYlhclEU9EmA+XdcuGWsNaP6Y1owVWBvBym1FJ7tco1fhWiUBhmcyZGvnqccE3yhDfLnYASh9XQqOfN1J5IQZfUsbmnHHx/Ca4TFKSpgovpeCPpDOzSMIg9NSMS0C7GiIkqTqQIeSG8JxIUSsTMxu1MjPqBIkZb/ex9j2DZd04hwZERl+rne99CNSDicIJEQFORJwoiIZTQ9yRAGBUZjvbESgDsU2ZD1zKgnCIMnAuyqBD2S0tNpWCfidyy8XjM31Kdz/GZE+hOCQJDoYUmoAFjKLz0B0MKDSIBuiOzsV2eIpAvZNpXS5JNLzxcTxbeCNtfDDrqRi6tM4GWA3OxWrksHp5ffUWiB3Q608lNnaI/ZMsBHKoVa5UT0F+UVoDkPT0mriFCgzwmpyL18ThdbnOy7pI8f+M2tBJBfF/TG3blLyUYkmB3+n2VjdjDJUlbXhCQrpwh2FFk6i/6fwxhVHcAt+7s1eVSS/NqO6O7oigao268WvAisrGmw8iM9bOLryp58cG2DvUg7oz6Ls7GM2Sb0RKjrcAav0rIo+nWYKtrt/VRif2Q71MiwnCkKRP9llhSA/mDXecqpUdLO67drR10azb/Krb2/ccQWA7CvvVvyHGcfQsz92yf0CxbjZwFNts4vYQBWxdtgeLvFrpc+R0yfg2zZSap6gouFQk8+IvbYgYXRXKkJGl1N0tFerUpyZ1PiGlHCclwKSXEsKhY8FhWYx/KHBb3JcywoJx1ez28kELKrtrynbEa5POuBOTg0Sesnv8aJytAg/1FadulQAecXTmrQJe0T+/7VCG4UihdCr3K0OpaER1x2ytDcoXPrh/5E2smxb10HgcVyezn9EEJLFvNQFTT+nzXzQCBwV2tCKDX6oiRxGwQu00ea/VZtTTpnPAOXOage490pdKeXqoHBWpoih71djqtwuuL+ms5txAbTFOVdSfLwN1iaUpYu/MRE4xZocaf/swO0LZBnFocQ5h6JTtYEA757uYcsv25c3d2w0A9O0A+IHbN40UADXcX503m2b/Dwj4/h8= \ No newline at end of file