From 1b85351eee43ce0f56830fa1497da95f1fe9cc8c Mon Sep 17 00:00:00 2001 From: Dushyant Behl <dushyantbehl@users.noreply.github.com> Date: Mon, 3 Jul 2023 13:51:06 +0530 Subject: [PATCH] NETOBSERV-1112: Add TCP RTT calculation to ebpf-agent and userspace. (#117) * Add TCP Handshake based RTT calculator in ebpf by keeping track of handshake SYN and ACK packets. Introduces a new ebpf map for tracking incoming and outgoing packets for RTT. Can be extended to any other way of TCP sequence tracking like TCPSecr/TCPval, or continous TCP latency tracking and other protocols like ICMP etc. Signed-off-by: Dushyant Behl <dushyantbehl@in.ibm.com> * Add updated bpf bindings and protobuf Signed-off-by: Dushyant Behl <dushyantbehl@in.ibm.com> * Add rtt to record.go and record_test.go and fix verifier issue Signed-off-by: Dushyant Behl <dushyantbehl@in.ibm.com> * Add RTT to exported record as a time duration in protobuf Signed-off-by: Dushyant Behl <dushyantbehl@in.ibm.com> * Add flowrtt to flowlogs-dump. Small changes to bpf rtt calculations. Signed-off-by: Dushyant Behl <dushyantbehl@in.ibm.com> * Add documentation on how rtt is calculated. * Add a switch for the RTT calculation feature. This feature will be disabled by default and can be enabled via an environment variable ENABLE_RTT. Signed-off-by: Dushyant Behl <dushyantbehl@users.noreply.github.com> * Reduce the flow_sequences map in size if its not used Signed-off-by: Dushyant Behl <dushyantbehl@users.noreply.github.com> * Small changes and refactoring. Signed-off-by: Dushyant Behl <dushyantbehl@users.noreply.github.com> * Change file structure and add more documentation on RTT patch Signed-off-by: Dushyant Behl <dushyantbehl@users.noreply.github.com> --------- Signed-off-by: Dushyant Behl <dushyantbehl@in.ibm.com> Signed-off-by: Dushyant Behl <dushyantbehl@users.noreply.github.com> --- bpf/configs.h | 1 + bpf/flows.c | 67 +++++++-- bpf/maps_definition.h | 13 ++ bpf/rtt_tracker.h | 87 ++++++++++++ bpf/{flow.h => types.h} | 72 +++++++++- bpf/utils.h | 133 +++++------------- docs/config.md | 2 + docs/rtt_calculations.md | 27 ++++ .../server/flowlogs-dump-collector.go | 6 +- pkg/agent/agent.go | 14 +- pkg/agent/config.go | 4 + pkg/ebpf/bpf_bpfeb.go | 13 +- pkg/ebpf/bpf_bpfeb.o | Bin 67240 -> 72280 bytes pkg/ebpf/bpf_bpfel.go | 13 +- pkg/ebpf/bpf_bpfel.o | Bin 67888 -> 74160 bytes pkg/ebpf/tracer.go | 59 ++++++-- pkg/exporter/proto.go | 3 + pkg/flow/record.go | 12 +- pkg/flow/record_test.go | 3 + pkg/pbflow/flow.pb.go | 99 +++++++------ pkg/pbflow/flow_grpc.pb.go | 12 +- proto/flow.proto | 2 + 22 files changed, 465 insertions(+), 177 deletions(-) create mode 100644 bpf/rtt_tracker.h rename bpf/{flow.h => types.h} (56%) create mode 100644 docs/rtt_calculations.md diff --git a/bpf/configs.h b/bpf/configs.h index 208faea1f..5a9d85384 100644 --- a/bpf/configs.h +++ b/bpf/configs.h @@ -5,5 +5,6 @@ // Constant definitions, to be overridden by the invoker volatile const u32 sampling = 0; volatile const u8 trace_messages = 0; +volatile const u8 enable_rtt = 0; #endif //__CONFIGS_H__ diff --git a/bpf/flows.c b/bpf/flows.c index 5219b808d..e7b857d0c 100644 --- a/bpf/flows.c +++ b/bpf/flows.c @@ -1,5 +1,6 @@ /* - Flows v2. A Flow-metric generator using TC. + Flows v2. + Flow monitor: A Flow-metric generator using TC. This program can be hooked on to TC ingress/egress hook to monitor packets to/from an interface. @@ -13,38 +14,79 @@ until an entry is available. 4) When hash collision is detected, we send the new entry to userpace via ringbuffer. */ +#include <vmlinux.h> +#include <bpf_helpers.h> +#include "configs.h" #include "utils.h" + +/* Defines a tcp drops statistics tracker, + which attaches at kfree_skb hook. Is optional. +*/ #include "tcp_drops.h" + +/* Defines a dns tracker, + which attaches at net_dev_queue hook. Is optional. +*/ #include "dns_tracker.h" +/* Defines an rtt tracker, + which runs inside flow_monitor. Is optional. +*/ +#include "rtt_tracker.h" static inline int flow_monitor(struct __sk_buff *skb, u8 direction) { // If sampling is defined, will only parse 1 out of "sampling" flows if (sampling != 0 && (bpf_get_prandom_u32() % sampling) != 0) { return TC_ACT_OK; } - void *data_end = (void *)(long)skb->data_end; - void *data = (void *)(long)skb->data; + + // Record the current time first. + u64 current_time = bpf_ktime_get_ns(); flow_id id; __builtin_memset(&id, 0, sizeof(id)); - u64 current_time = bpf_ktime_get_ns(); - struct ethhdr *eth = data; - u16 flags = 0; - if (fill_ethhdr(eth, data_end, &id, &flags) == DISCARD) { + + pkt_info pkt; + __builtin_memset(&pkt, 0, sizeof(pkt)); + + pkt.id = &id; + pkt.current_ts = current_time; + + void *data_end = (void *)(long)skb->data_end; + void *data = (void *)(long)skb->data; + struct ethhdr *eth = (struct ethhdr *)data; + + if (fill_ethhdr(eth, data_end, &pkt) == DISCARD) { return TC_ACT_OK; } + + if (enable_rtt) { + // This is currently gated as its not to be enabled by default. + calculate_flow_rtt(&pkt, direction, data_end); + } + + //Set extra fields id.if_index = skb->ifindex; id.direction = direction; // TODO: we need to add spinlock here when we deprecate versions prior to 5.1, or provide // a spinlocked alternative version and use it selectively https://lwn.net/Articles/779120/ - flow_metrics *aggregate_flow = bpf_map_lookup_elem(&aggregated_flows, &id); + flow_metrics *aggregate_flow = (flow_metrics *)bpf_map_lookup_elem(&aggregated_flows, &id); if (aggregate_flow != NULL) { aggregate_flow->packets += 1; aggregate_flow->bytes += skb->len; aggregate_flow->end_mono_time_ts = current_time; - aggregate_flow->flags |= flags; + aggregate_flow->flags |= pkt.flags; + + // Does not matter the gate. Will be zero if not enabled. + if (pkt.rtt > 0) { + /* Since RTT is calculated for few packets we need to check if it is non zero value then only we update + * the flow. If we remove this check a packet which fails to calculate RTT will override the previous valid + * RTT with 0. + */ + aggregate_flow->flow_rtt = pkt.rtt; + } + long ret = bpf_map_update_elem(&aggregated_flows, &id, aggregate_flow, BPF_ANY); if (trace_messages && ret != 0) { // usually error -16 (-EBUSY) is printed here. @@ -61,7 +103,8 @@ static inline int flow_monitor(struct __sk_buff *skb, u8 direction) { .bytes = skb->len, .start_mono_time_ts = current_time, .end_mono_time_ts = current_time, - .flags = flags, + .flags = pkt.flags, + .flow_rtt = pkt.rtt }; // even if we know that the entry is new, another CPU might be concurrently inserting a flow @@ -78,7 +121,7 @@ static inline int flow_monitor(struct __sk_buff *skb, u8 direction) { } new_flow.errno = -ret; - flow_record *record = bpf_ringbuf_reserve(&direct_flows, sizeof(flow_record), 0); + flow_record *record = (flow_record *)bpf_ringbuf_reserve(&direct_flows, sizeof(flow_record), 0); if (!record) { if (trace_messages) { bpf_printk("couldn't reserve space in the ringbuf. Dropping flow"); @@ -92,6 +135,7 @@ static inline int flow_monitor(struct __sk_buff *skb, u8 direction) { } return TC_ACT_OK; } + SEC("tc_ingress") int ingress_flow_parse(struct __sk_buff *skb) { return flow_monitor(skb, INGRESS); @@ -103,3 +147,4 @@ int egress_flow_parse(struct __sk_buff *skb) { } char _license[] SEC("license") = "GPL"; + diff --git a/bpf/maps_definition.h b/bpf/maps_definition.h index 8bd0d0120..4c5bf86e7 100644 --- a/bpf/maps_definition.h +++ b/bpf/maps_definition.h @@ -18,4 +18,17 @@ struct { __uint(map_flags, BPF_F_NO_PREALLOC); } aggregated_flows SEC(".maps"); +// Common hashmap to keep track of all flow sequences. +// LRU hashmap is used because if some syn packet is received but ack is not +// then the hashmap entry will need to be evicted +// Key is flow_seq_id which is standard 4 tuple and a sequence id +// sequence id is specific to the type of transport protocol +// Value is u64 which represents the occurrence timestamp of the packet. +struct { + __uint(type, BPF_MAP_TYPE_LRU_HASH); + __uint(max_entries, 1 << 20); // Will take around 64MB of space. + __type(key, flow_seq_id); + __type(value, u64); +} flow_sequences SEC(".maps"); + #endif //__MAPS_DEFINITION_H__ diff --git a/bpf/rtt_tracker.h b/bpf/rtt_tracker.h new file mode 100644 index 000000000..d4c81b72b --- /dev/null +++ b/bpf/rtt_tracker.h @@ -0,0 +1,87 @@ +/* + A simple RTT tracker implemented to be used at the ebpf layer inside the flow_monitor hookpoint. + This tracker currently tracks RTT for TCP flows by looking at the TCP start sequence and estimates + RTT by perform (timestamp of receiveing ack packet - timestamp of sending syn packet) + */ + +#ifndef __RTT_TRACKER_H__ +#define __RTT_TRACKER_H__ + +#include "utils.h" +#include "maps_definition.h" + +static __always_inline void fill_flow_seq_id(flow_seq_id *seq_id, pkt_info *pkt, u32 seq, u8 reversed) { + flow_id *id = pkt->id; + if (reversed) { + __builtin_memcpy(seq_id->src_ip, id->dst_ip, IP_MAX_LEN); + __builtin_memcpy(seq_id->dst_ip, id->src_ip, IP_MAX_LEN); + seq_id->src_port = id->dst_port; + seq_id->dst_port = id->src_port; + } else { + __builtin_memcpy(seq_id->src_ip, id->src_ip, IP_MAX_LEN); + __builtin_memcpy(seq_id->dst_ip, id->dst_ip, IP_MAX_LEN); + seq_id->src_port = id->src_port; + seq_id->dst_port = id->dst_port; + } + seq_id->seq_id = seq; +} + +static __always_inline void calculate_flow_rtt_tcp(pkt_info *pkt, u8 direction, void *data_end, flow_seq_id *seq_id) { + struct tcphdr *tcp = (struct tcphdr *) pkt->l4_hdr; + if ( !tcp || ((void *)tcp + sizeof(*tcp) > data_end) ) { + return; + } + + switch (direction) { + case EGRESS: { + if (IS_SYN_PACKET(pkt)) { + // Record the outgoing syn sequence number + u32 seq = bpf_ntohl(tcp->seq); + fill_flow_seq_id(seq_id, pkt, seq, 0); + + long ret = bpf_map_update_elem(&flow_sequences, seq_id, &pkt->current_ts, BPF_ANY); + if (trace_messages && ret != 0) { + bpf_printk("err saving flow sequence record %d", ret); + } + } + break; + } + case INGRESS: { + if (IS_ACK_PACKET(pkt)) { + // Stored sequence should be ack_seq - 1 + u32 seq = bpf_ntohl(tcp->ack_seq) - 1; + // check reversed flow + fill_flow_seq_id(seq_id, pkt, seq, 1); + + u64 *prev_ts = (u64 *)bpf_map_lookup_elem(&flow_sequences, seq_id); + if (prev_ts != NULL) { + pkt->rtt = pkt->current_ts - *prev_ts; + // Delete the flow from flow sequence map so if it + // restarts we have a new RTT calculation. + long ret = bpf_map_delete_elem(&flow_sequences, seq_id); + if (trace_messages && ret != 0) { + bpf_printk("error evicting flow sequence: %d", ret); + } + } + } + break; + } + } +} + +static __always_inline void calculate_flow_rtt(pkt_info *pkt, u8 direction, void *data_end) { + flow_seq_id seq_id; + __builtin_memset(&seq_id, 0, sizeof(flow_seq_id)); + + switch (pkt->id->transport_protocol) + { + case IPPROTO_TCP: + calculate_flow_rtt_tcp(pkt, direction, data_end, &seq_id); + break; + default: + break; + } +} + +#endif /* __RTT_TRACKER_H__ */ + diff --git a/bpf/flow.h b/bpf/types.h similarity index 56% rename from bpf/flow.h rename to bpf/types.h index ddb306f8e..0ce903759 100644 --- a/bpf/flow.h +++ b/bpf/types.h @@ -1,10 +1,46 @@ -#ifndef __FLOW_H__ -#define __FLOW_H__ +#ifndef __TYPES_H__ +#define __TYPES_H__ #define TC_ACT_OK 0 #define TC_ACT_SHOT 2 #define IP_MAX_LEN 16 +#define DISCARD 1 +#define SUBMIT 0 + +// Flags according to RFC 9293 & https://www.iana.org/assignments/ipfix/ipfix.xhtml +#define FIN_FLAG 0x01 +#define SYN_FLAG 0x02 +#define RST_FLAG 0x04 +#define PSH_FLAG 0x08 +#define ACK_FLAG 0x10 +#define URG_FLAG 0x20 +#define ECE_FLAG 0x40 +#define CWR_FLAG 0x80 +// Custom flags exported +#define SYN_ACK_FLAG 0x100 +#define FIN_ACK_FLAG 0x200 +#define RST_ACK_FLAG 0x400 + +#define IS_SYN_PACKET(pkt) ((pkt->flags & SYN_FLAG) || (pkt->flags & SYN_ACK_FLAG)) +#define IS_ACK_PACKET(pkt) ((pkt->flags & ACK_FLAG) || (pkt->flags & SYN_ACK_FLAG)) + +#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \ + __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +#define bpf_ntohs(x) __builtin_bswap16(x) +#define bpf_htons(x) __builtin_bswap16(x) +#define bpf_ntohl(x) __builtin_bswap32(x) +#define bpf_htonl(x) __builtin_bswap32(x) +#elif defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \ + __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +#define bpf_ntohs(x) (x) +#define bpf_htons(x) (x) +#define bpf_ntohl(x) (x) +#define bpf_htonl(x) (x) +#else +# error "Endianness detection needs to be set up for your compiler?!" +#endif + typedef __u8 u8; typedef __u16 u16; typedef __u32 u32; @@ -18,6 +54,15 @@ typedef __u64 u64; #define ETH_P_ARP 0x0806 #define IPPROTO_ICMPV6 58 +// according to field 61 in https://www.iana.org/assignments/ipfix/ipfix.xhtml +typedef enum { + INGRESS = 0, + EGRESS = 1, + MAX_DIRECTION = 2, +} direction_t; + +const u8 ip4in6[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff}; + typedef struct flow_metrics_t { u32 packets; u64 bytes; @@ -45,6 +90,7 @@ typedef struct flow_metrics_t { u64 req_mono_time_ts; u64 rsp_mono_time_ts; } __attribute__((packed)) dns_record; + u64 flow_rtt; } __attribute__((packed)) flow_metrics; // Force emitting struct tcp_drops into the ELF. @@ -79,6 +125,16 @@ typedef struct flow_id_t { // Force emitting struct flow_id into the ELF. const struct flow_id_t *unused2 __attribute__((unused)); +// Standard 4 tuple and a sequence identifier. +// No need to emit this struct. It's used only in kernel space +typedef struct flow_seq_id_t { + u16 src_port; + u16 dst_port; + u8 src_ip[IP_MAX_LEN]; + u8 dst_ip[IP_MAX_LEN]; + u32 seq_id; +} __attribute__((packed)) flow_seq_id; + // Flow record is a tuple containing both flow identifier and metrics. It is used to send // a complete flow via ring buffer when only when the accounting hashmap is full. // Contents in this struct must match byte-by-byte with Go's pkc/flow/Record struct @@ -93,4 +149,14 @@ const struct flow_record_t *unused3 __attribute__((unused)); // Force emitting struct dns_record into the ELF. const struct dns_record_t *unused4 __attribute__((unused)); -#endif +// Internal structure: Packet info structure parsed around functions. +typedef struct pkt_info_t { + flow_id *id; + u64 current_ts; // ts recorded when pkt came. + u16 flags; // TCP specific + void *l4_hdr; // Stores the actual l4 header + u64 rtt; // rtt calculated from the flow if possible. else zero +} pkt_info; + +#endif /* __TYPES_H__ */ + diff --git a/bpf/utils.h b/bpf/utils.h index 5338f1b72..8a6a79b7f 100644 --- a/bpf/utils.h +++ b/bpf/utils.h @@ -1,76 +1,19 @@ #ifndef __UTILS_H__ #define __UTILS_H__ -#include <vmlinux.h> -#include <bpf_helpers.h> - -#include "flow.h" +#include "types.h" #include "maps_definition.h" -#include "configs.h" - -#define DISCARD 1 -#define SUBMIT 0 - -// according to field 61 in https://www.iana.org/assignments/ipfix/ipfix.xhtml -typedef enum { - INGRESS = 0, - EGRESS = 1, - MAX_DIRECTION = 2, -} direction_t; - -// L4_info structure contains L4 headers parsed information. -struct l4_info_t { - // TCP/UDP/SCTP source port in host byte order - u16 src_port; - // TCP/UDP/SCTP destination port in host byte order - u16 dst_port; - // ICMPv4/ICMPv6 type value - u8 icmp_type; - // ICMPv4/ICMPv6 code value - u8 icmp_code; - // TCP flags - u16 flags; -}; - -const u8 ip4in6[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff}; - -// Flags according to RFC 9293 & https://www.iana.org/assignments/ipfix/ipfix.xhtml -#define FIN_FLAG 0x01 -#define SYN_FLAG 0x02 -#define RST_FLAG 0x04 -#define PSH_FLAG 0x08 -#define ACK_FLAG 0x10 -#define URG_FLAG 0x20 -#define ECE_FLAG 0x40 -#define CWR_FLAG 0x80 -// Custom flags exported -#define SYN_ACK_FLAG 0x100 -#define FIN_ACK_FLAG 0x200 -#define RST_ACK_FLAG 0x400 - -#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \ - __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ -#define bpf_ntohs(x) __builtin_bswap16(x) -#define bpf_htons(x) __builtin_bswap16(x) -#elif defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \ - __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ -#define bpf_ntohs(x) (x) -#define bpf_htons(x) (x) -#else -# error "Endianness detection needs to be set up for your compiler?!" -#endif - // sets the TCP header flags for connection information static inline void set_flags(struct tcphdr *th, u16 *flags) { - //If both ACK and SYN are set, then it is server -> client communication during 3-way handshake. + //If both ACK and SYN are set, then it is server -> client communication during 3-way handshake. if (th->ack && th->syn) { *flags |= SYN_ACK_FLAG; } else if (th->ack && th->fin ) { // If both ACK and FIN are set, then it is graceful termination from server. *flags |= FIN_ACK_FLAG; } else if (th->ack && th->rst ) { - // If both ACK and RST are set, then it is abrupt connection termination. + // If both ACK and RST are set, then it is abrupt connection termination. *flags |= RST_ACK_FLAG; } else if (th->fin) { *flags |= FIN_FLAG; @@ -93,42 +36,49 @@ static inline void set_flags(struct tcphdr *th, u16 *flags) { // Extract L4 info for the supported protocols static inline void fill_l4info(void *l4_hdr_start, void *data_end, u8 protocol, - struct l4_info_t *l4_info) { - switch (protocol) { + pkt_info *pkt) { + flow_id *id = pkt->id; + id->transport_protocol = protocol; + switch (protocol) { case IPPROTO_TCP: { struct tcphdr *tcp = l4_hdr_start; if ((void *)tcp + sizeof(*tcp) <= data_end) { - l4_info->src_port = bpf_ntohs(tcp->source); - l4_info->dst_port = bpf_ntohs(tcp->dest); - set_flags(tcp, &l4_info->flags); + id->src_port = bpf_ntohs(tcp->source); + id->dst_port = bpf_ntohs(tcp->dest); + set_flags(tcp, &pkt->flags); + pkt->l4_hdr = (void *) tcp; } } break; case IPPROTO_UDP: { struct udphdr *udp = l4_hdr_start; if ((void *)udp + sizeof(*udp) <= data_end) { - l4_info->src_port = bpf_ntohs(udp->source); - l4_info->dst_port = bpf_ntohs(udp->dest); + id->src_port = bpf_ntohs(udp->source); + id->dst_port = bpf_ntohs(udp->dest); + pkt->l4_hdr = (void *) udp; } } break; case IPPROTO_SCTP: { struct sctphdr *sctph = l4_hdr_start; if ((void *)sctph + sizeof(*sctph) <= data_end) { - l4_info->src_port = bpf_ntohs(sctph->source); - l4_info->dst_port = bpf_ntohs(sctph->dest); + id->src_port = bpf_ntohs(sctph->source); + id->dst_port = bpf_ntohs(sctph->dest); + pkt->l4_hdr = (void *) sctph; } } break; case IPPROTO_ICMP: { struct icmphdr *icmph = l4_hdr_start; if ((void *)icmph + sizeof(*icmph) <= data_end) { - l4_info->icmp_type = icmph->type; - l4_info->icmp_code = icmph->code; + id->icmp_type = icmph->type; + id->icmp_code = icmph->code; + pkt->l4_hdr = (void *) icmph; } } break; case IPPROTO_ICMPV6: { struct icmp6hdr *icmp6h = l4_hdr_start; if ((void *)icmp6h + sizeof(*icmp6h) <= data_end) { - l4_info->icmp_type = icmp6h->icmp6_type; - l4_info->icmp_code = icmp6h->icmp6_code; + id->icmp_type = icmp6h->icmp6_type; + id->icmp_code = icmp6h->icmp6_code; + pkt->l4_hdr = (void *) icmp6h; } } break; default: @@ -137,68 +87,59 @@ static inline void fill_l4info(void *l4_hdr_start, void *data_end, u8 protocol, } // sets flow fields from IPv4 header information -static inline int fill_iphdr(struct iphdr *ip, void *data_end, flow_id *id, u16 *flags) { - struct l4_info_t l4_info; +static inline int fill_iphdr(struct iphdr *ip, void *data_end, pkt_info *pkt) { void *l4_hdr_start; l4_hdr_start = (void *)ip + sizeof(*ip); if (l4_hdr_start > data_end) { return DISCARD; } - __builtin_memset(&l4_info, 0, sizeof(l4_info)); + flow_id *id = pkt->id; + /* Save the IP Address to id directly. copy once. */ __builtin_memcpy(id->src_ip, ip4in6, sizeof(ip4in6)); __builtin_memcpy(id->dst_ip, ip4in6, sizeof(ip4in6)); __builtin_memcpy(id->src_ip + sizeof(ip4in6), &ip->saddr, sizeof(ip->saddr)); __builtin_memcpy(id->dst_ip + sizeof(ip4in6), &ip->daddr, sizeof(ip->daddr)); - id->transport_protocol = ip->protocol; - fill_l4info(l4_hdr_start, data_end, ip->protocol, &l4_info); - id->src_port = l4_info.src_port; - id->dst_port = l4_info.dst_port; - id->icmp_type = l4_info.icmp_type; - id->icmp_code = l4_info.icmp_code; - *flags = l4_info.flags; + /* fill l4 header which will be added to id in flow_monitor function.*/ + fill_l4info(l4_hdr_start, data_end, ip->protocol, pkt); return SUBMIT; } // sets flow fields from IPv6 header information -static inline int fill_ip6hdr(struct ipv6hdr *ip, void *data_end, flow_id *id, u16 *flags) { - struct l4_info_t l4_info; +static inline int fill_ip6hdr(struct ipv6hdr *ip, void *data_end, pkt_info *pkt) { void *l4_hdr_start; l4_hdr_start = (void *)ip + sizeof(*ip); if (l4_hdr_start > data_end) { return DISCARD; } - __builtin_memset(&l4_info, 0, sizeof(l4_info)); + flow_id *id = pkt->id; + /* Save the IP Address to id directly. copy once. */ __builtin_memcpy(id->src_ip, ip->saddr.in6_u.u6_addr8, IP_MAX_LEN); __builtin_memcpy(id->dst_ip, ip->daddr.in6_u.u6_addr8, IP_MAX_LEN); - id->transport_protocol = ip->nexthdr; - fill_l4info(l4_hdr_start, data_end, ip->nexthdr, &l4_info); - id->src_port = l4_info.src_port; - id->dst_port = l4_info.dst_port; - id->icmp_type = l4_info.icmp_type; - id->icmp_code = l4_info.icmp_code; - *flags = l4_info.flags; + /* fill l4 header which will be added to id in flow_monitor function.*/ + fill_l4info(l4_hdr_start, data_end, ip->nexthdr, pkt); return SUBMIT; } // sets flow fields from Ethernet header information -static inline int fill_ethhdr(struct ethhdr *eth, void *data_end, flow_id *id, u16 *flags) { +static inline int fill_ethhdr(struct ethhdr *eth, void *data_end, pkt_info *pkt) { if ((void *)eth + sizeof(*eth) > data_end) { return DISCARD; } + flow_id *id = pkt->id; __builtin_memcpy(id->dst_mac, eth->h_dest, ETH_ALEN); __builtin_memcpy(id->src_mac, eth->h_source, ETH_ALEN); id->eth_protocol = bpf_ntohs(eth->h_proto); if (id->eth_protocol == ETH_P_IP) { struct iphdr *ip = (void *)eth + sizeof(*eth); - return fill_iphdr(ip, data_end, id, flags); + return fill_iphdr(ip, data_end, pkt); } else if (id->eth_protocol == ETH_P_IPV6) { struct ipv6hdr *ip6 = (void *)eth + sizeof(*eth); - return fill_ip6hdr(ip6, data_end, id, flags); + return fill_ip6hdr(ip6, data_end, pkt); } else { // TODO : Need to implement other specific ethertypes if needed // For now other parts of flow id remain zero diff --git a/docs/config.md b/docs/config.md index 22827e9c9..d456199ae 100644 --- a/docs/config.md +++ b/docs/config.md @@ -63,6 +63,8 @@ The following environment variables are available to configure the NetObserv eBF * `KAFKA_TLS_USER_KEY_PATH` (default: unset). Path to the user (client) private key for mutual TLS connections. * `PROFILE_PORT` (default: unset). Sets the listening port for [Go's Pprof tool](https://pkg.go.dev/net/http/pprof). If it is not set, profile is disabled. +* `ENABLE_RTT` (default: `false` disabled). If `true` enables RTT calculations for the captured flows in the ebpf agent. + See [docs](./rtt_calculations.md) for more details on this feature. ## Development-only variables diff --git a/docs/rtt_calculations.md b/docs/rtt_calculations.md new file mode 100644 index 000000000..6d96b1236 --- /dev/null +++ b/docs/rtt_calculations.md @@ -0,0 +1,27 @@ +# RTT calculations done by ebpf-agent + +This agent has the capablity to perform Round-Trip-Time calculations for packet flows. Currently the agent will capture and report RTT for tcp handshake only +but can be extended to any other protocol. + +The design of the system is like this, +1. For every SYN packet that gets detected at Egress, the agent will capture standard 4-tuple information and packet sequence id and put it into a `flow_sequences` ebpf map as key and the value of which will be set to timestamp the packet was detected. + +1. Now for every ACK packet that gets detected at Ingress, the agent will check if the 4-tuple information (reversed for incoming flow) and sequence id (sequence id of ACK - 1) is present in the `flow_sequences` hashmap, if so it will calculate the handshake RTT as, +`rtt = ack-timestampack - syn-timestamp(from map)` + +1. This approach is very simple but can be extended to perform continous RTT tracking for a TCP flow or perform RTT tracking for any other protocol like, ICMP etc. + +This rtt in flow logs is reported as, actual RTT for the flow logs which is present and can be calculated (handshake packets), zero for flows where it is not calculated yet (any protocols other than TCP) or is not present (non handshake tcp packets). + +## Concerns + +### Packet Retransmissions: + +In case of packet retransmissions the behavior of tracker is as follows, + +1. If SYN packet is retransmitted only the last SYN packet is taken into account which is correct behavior. + +1. If ACK packet is retransmitted the last ACK will be considered (the ACK which finally got received by receiver), +in that case while the behavior of our program is as expected, because receiver will only see one and the last ACK but +the RTT reported by the receiver will be much higher than the actual number. +For now, this is an erroneous case and can be fixed later by doing either continous or multiple RTT monitoring per flow. \ No newline at end of file diff --git a/examples/flowlogs-dump/server/flowlogs-dump-collector.go b/examples/flowlogs-dump/server/flowlogs-dump-collector.go index d04af1c02..b083a96ee 100644 --- a/examples/flowlogs-dump/server/flowlogs-dump-collector.go +++ b/examples/flowlogs-dump/server/flowlogs-dump-collector.go @@ -72,7 +72,7 @@ func main() { for records := range receivedRecords { for _, record := range records.Entries { if record.EthProtocol == ipv6 { - log.Printf("%s: %v %s IP %s:%d > %s:%d: protocol:%s type: %d code: %d dir:%d bytes:%d packets:%d flags:%d ends: %v dnsId: %d dnsFlags: 0x%04x dnsReq: %v dnsRsp: %v\n", + log.Printf("%s: %v %s IP %s:%d > %s:%d: protocol:%s type: %d code: %d dir:%d bytes:%d packets:%d flags:%d ends: %v dnsId: %d dnsFlags: 0x%04x dnsReq: %v dnsRsp: %v rtt %v\n", ipProto[record.EthProtocol], record.TimeFlowStart.AsTime().Local().Format("15:04:05.000000"), record.Interface, @@ -92,9 +92,10 @@ func main() { record.GetDnsFlags(), record.GetTimeDnsReq(), record.GetTimeDnsRsp(), + record.TimeFlowRtt.AsDuration().Microseconds(), ) } else { - log.Printf("%s: %v %s IP %s:%d > %s:%d: protocol:%s type: %d code: %d dir:%d bytes:%d packets:%d flags:%d ends: %v dnsId: %d dnsFlags: 0x%04x dnsReq: %v dnsRsp: %v\n", + log.Printf("%s: %v %s IP %s:%d > %s:%d: protocol:%s type: %d code: %d dir:%d bytes:%d packets:%d flags:%d ends: %v dnsId: %d dnsFlags: 0x%04x dnsReq: %v dnsRsp: %v rtt %v\n", ipProto[record.EthProtocol], record.TimeFlowStart.AsTime().Local().Format("15:04:05.000000"), record.Interface, @@ -114,6 +115,7 @@ func main() { record.GetDnsFlags(), record.GetTimeDnsReq(), record.GetTimeDnsRsp(), + record.TimeFlowRtt.AsDuration().Microseconds(), ) } } diff --git a/pkg/agent/agent.go b/pkg/agent/agent.go index 2553feef6..18d71990c 100644 --- a/pkg/agent/agent.go +++ b/pkg/agent/agent.go @@ -116,13 +116,23 @@ func FlowsAgent(cfg *Config) (*Flows, error) { } ingress, egress := flowDirections(cfg) - debug := false if cfg.LogLevel == logrus.TraceLevel.String() || cfg.LogLevel == logrus.DebugLevel.String() { debug = true } - fetcher, err := ebpf.NewFlowFetcher(debug, cfg.Sampling, cfg.CacheMaxFlows, ingress, egress, cfg.EnableTCPDrops, cfg.EnableDNSTracking) + ebpfConfig := &ebpf.FlowFetcherConfig{ + EnableIngress: ingress, + EnableEgress: egress, + Debug: debug, + Sampling: cfg.Sampling, + CacheMaxSize: cfg.CacheMaxFlows, + TCPDrops: cfg.EnableTCPDrops, + DNSTracker: cfg.EnableDNSTracking, + EnableRTT: cfg.EnableRTT, + } + + fetcher, err := ebpf.NewFlowFetcher(ebpfConfig) if err != nil { return nil, err } diff --git a/pkg/agent/config.go b/pkg/agent/config.go index 7cc146295..71b0b7ddb 100644 --- a/pkg/agent/config.go +++ b/pkg/agent/config.go @@ -136,6 +136,10 @@ type Config struct { KafkaSASLClientSecretPath string `env:"KAFKA_SASL_CLIENT_SECRET_PATH"` // ProfilePort sets the listening port for Go's Pprof tool. If it is not set, profile is disabled ProfilePort int `env:"PROFILE_PORT"` + // Enable RTT calculations for the flows, default is false (disabled), set to true to enable. + // This feature requires the flows agent to attach at both Ingress and Egress hookpoints. + // If both Ingress and Egress are not enabled then this feature will not be enabled even if set to true via env. + EnableRTT bool `env:"ENABLE_RTT" envDefault:"false"` // EnableGC enables golang garbage collection run at the end of every map eviction, default is true EnableGC bool `env:"ENABLE_GARBAGE_COLLECTION" envDefault:"true"` // EnableTcpDrops enable TCP drops eBPF hook to account for tcp dropped flows diff --git a/pkg/ebpf/bpf_bpfeb.go b/pkg/ebpf/bpf_bpfeb.go index c1037c2d1..3171606c1 100644 --- a/pkg/ebpf/bpf_bpfeb.go +++ b/pkg/ebpf/bpf_bpfeb.go @@ -48,6 +48,7 @@ type BpfFlowMetricsT struct { Errno uint8 TcpDrops BpfTcpDropsT DnsRecord BpfDnsRecordT + FlowRtt uint64 } type BpfFlowRecordT struct { @@ -55,6 +56,14 @@ type BpfFlowRecordT struct { Metrics BpfFlowMetrics } +type BpfFlowSeqId struct { + SrcPort uint16 + DstPort uint16 + SrcIp [16]uint8 + DstIp [16]uint8 + SeqId uint32 +} + type BpfTcpDropsT struct { Packets uint32 Bytes uint64 @@ -116,6 +125,7 @@ type BpfProgramSpecs struct { type BpfMapSpecs struct { AggregatedFlows *ebpf.MapSpec `ebpf:"aggregated_flows"` DirectFlows *ebpf.MapSpec `ebpf:"direct_flows"` + FlowSequences *ebpf.MapSpec `ebpf:"flow_sequences"` } // BpfObjects contains all objects after they have been loaded into the kernel. @@ -139,12 +149,14 @@ func (o *BpfObjects) Close() error { type BpfMaps struct { AggregatedFlows *ebpf.Map `ebpf:"aggregated_flows"` DirectFlows *ebpf.Map `ebpf:"direct_flows"` + FlowSequences *ebpf.Map `ebpf:"flow_sequences"` } func (m *BpfMaps) Close() error { return _BpfClose( m.AggregatedFlows, m.DirectFlows, + m.FlowSequences, ) } @@ -177,6 +189,5 @@ func _BpfClose(closers ...io.Closer) error { } // Do not access this directly. -// //go:embed bpf_bpfeb.o var _BpfBytes []byte diff --git a/pkg/ebpf/bpf_bpfeb.o b/pkg/ebpf/bpf_bpfeb.o index cdaf6f13945bac619aaad7889be15ae739665777..92303ee5b710b77162cc4a4ebdea73096ff99b66 100644 GIT binary patch literal 72280 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 literal 67240 zcmb<-^>JfjVq|~=MuzVU3=BvDa2W;$Mn(-V&jCt`F);3L0<#(R7eZ)>1PBcy6U87b zQ2_={5UUkLFfg#g#M2>sg>oppUjf3fSA@{|P+Fb|!VhI&)&sGsSNzWa(TUR;0zh>2 z^8W=OI<cL>2Sjfd0Fev~*$e;w0I{kU{{H}_UqI;xQ2GXxz5u09K<NV@8tPuw{SqJ^ z0|Pt6Ts~b%W?7KPcBp&zTYz{B4E#nAx=@*c6~roD^#2@)E>vb<0nx>a{+|WWg~|-f zAi8+b|1%)EP?-Vj!{SB%Peb|OI4EB9{}h-H33-O%MgLEN_)vS<u-FST=O{=Wl0C=3 zd<_OR5M8|J|6veas0@kg;zj?DK>09t9*6Q_{s4zdrUnBKNIZMde{lGSDlqsmFtptb zRbbe}z`((<9TNYH+rhEHz`))BQq7>G+sWVtVnN;gzj)FATOfY%qW?Fc^eZU+5=2AI zVJKeq{~Cy2yzKu~D18M=Uxw0`p!7v34UWg+W&h8E_|?n)SAgi^W&gqPT)gc6btwNC zlzs}OpFruyQ2G&+eh8((>7{tt|NBrrI2{!)`~MuoPgI12%YJD5mm7dY890g;|Gx`j zp@|C=FaCcABwoDe|2+_04oOE6#f$#m2JsUW8NewGO&`d-w;*{magcd$K;p%V{=Wm! zNano;@e36p`LB4<|Ic8)A%wr*3&dk!V0U0(`2YWZ1uUKK*Mx}ghsI+oI5jf;+|LdX zFO>RU17Z~~{Qm_+7fSuF1<}O||9=J1nNrYjhvvI-ux}VRiWmNW50$S1(Zvh@e*)1+ z@*hF`%&Px&AUZUGX#<F6Wnkz5(a`jRp1#a<I~l+!4=T@4y$E9ec4$28hn6G!${<r1 z7z<_(81V#gOnXG-BX`^1<;{XvDw^<%8p?&<GO0#fu^FQ)tA%4V4F{<3b|_E+`+I zo(qj2;aj{IlI{wP7&xHv;Ph8$!~hP-;>D2kU1$W&my03kywC_*ek}eEPVa?A(DGyP ze{i}lG=i2Ni~obuf1wey{8;=SoDT|>;Q1Py9|{$r_Ai3u3uw4VU<nsU`LOsuIA0*S z6P#a=+yTxfNbUsZA0&5x^9_<a!TG7skO5qh7B7b6qe3I7I~V^4=P#sq0H<@Lcmk(u zq<Da&YeYPO(?3!?fXfl2cmkI%Nbvy9w}nd3cv|!yoSzF7q49voC*bfPm`}i|kAVT2 zPo}`q;eN1g1_rw27X>D8j%H<GPy?kmSUFt09Fot9m;VRnuj1v9`mlI8BtI4}hm;$| z%m0JJy?FV5aCjCk{|^r5;^qIr;a9x;KR8^AmqWs<csZo}D_;H|oIZ+|L()z0^8euU zP`vy<IGq$P{|}D;;^qIr>7sZ!B)*H6L()O<a!5WbUJfZQi<d*o$K{axR=gZqUo3~# z7t0~}s(3lHJYNpUN5#t_`KNd}B;OP-hvb*y<&b<*yd080ikJTf=ZoUyko-`*98xas zp8yIq28PNmXnR6}0bKJ|YC+l?#f$zQ0;zztE1>0;K=#7_-$3H~wLl~T1G@saJUt)* zDfb|P3=9m=_5`CS149u=uuuS!Z_^>_I0_XY`PyFyB+I~12&oqs(jhcQp#dbn_(RJv zsJMVXw0tWxfTZ7aXt`G?04Znu4WZ@<K*|xgeGZUv#$N;~9{?%G(!s4N2981pNIB;p z0+n}wlq2boHXuh~0t2{R=MS#k85p4A0{*TL^-y~R{DmQWP`H5FmuU4DM=>)b9MHri ziovZU28LoLNVq`jHGyI#NH{>vSAe@;fk6gj6Es{v;RSA|!NSX59VE-ZkO*t9LEW|A z6C%Ff1VY2>Z)OH5kO-Q%Kru6eBo=Xyd%@)!ntFv|W(ILA>NSd)8Ne-MH1!6>%nYI+ z^~Ed<(jdAV65bZYEDYe7LJKEQ_<{Xh%)|ipFRWaLh8IUM6C_^I#3hQEAn}PN4hmmz zyrPL~6f;567n-<2F%u-6p@~}*GeOc@F(V`$LGz12F(V}15y~(7A?cW5JH-F6{KJHv zuL=c0p~S!-D!{l3#1ds-TnVC~>cT;65Qdh^5-@Y2`H_v4fpIZd9+D3klNUnT4~gK| zWMD{M`5#;|B(MD60a8~E<}oNFulx^gmn5(J-vSa(Uicr};>}+Ee+r0?)DM{h;%6`X zKMP9FfYQ@Ibn-$-dn$Y3|0N)P_QL;*p!5PLJr7E+fzn`qW-t7|0?J<orME!oO;8%# ze#&0>e;t&+2TJdP(mSB^HV};-AN#F9q6`e|2H^6n0vetWK?Vklc-arF2SpPYD?y6T z)g$5w68}*7e2`iYhQ^QBelrjcUS6`bL(MH-_8%NxP<;?ZAa_8@#|CJ-29{2mLm43D z6S{hYI~Y?yhCt<^$$^0Z>JC$=04ROLgVbe8LHd)$j0~0_J~TaZ6f-h_OO#3}NWF@d z4?y`3>?1UBP(CvSnS&+{%9r4h2u&Q6&y2CC2jxp}&jU@pK`|2pxa2QpWH1NmgSywE zn2`aTvnr(^^*EY7kbA-XY&3C@dv!tPpoxRrtAj-x<X&wo;vn~eYf3b8K<)+iJc=0^ z^g;TN+zY9Pr6BDFG<_iVg4;W2;vn~`g3Lh^2f0@Ti#W)=;F=XpJ;=RESk!~u3$A&K z85zJe3zB=mDY8-u(oR7$59D4sEarjSi>>?yxffi%qnQJ8FSvd{69>5$Qg4A>$G`xs z2SDxx*IUJm4DulRk=zR|=_;il?IJYuK<<UqQ>f;F+zYO!(A0z63#q42)q~s%u5r=S zgWL;l@t}!=+zT$*iy0yHCz5-?C3U6LfAF{jnm&+w!TmWjagck#{W>&pkbA-78ffAm z_k#O*XyPFEg8O@D;vn~e>&;?DNdFSaz2N>|r4(e`1Wg~vz2Ke#nmEY4;PDqUagck# z<1}dEAoqe>OlaaD_kzcT(8NLR1^4WW86ovIl6yhPgP{`Ik4Mu7axb_>MiU3Q*B+!1 zO&sK2J1pWL_u66+2f5b<i#W)=)*$g>Mg~U^jpSZ%O;srcsejSz2f5b+q#jKi<X(3y z;vn~eTeN8ELGA^&Y|+F)?sdUp4#>UEAn{^G25<`#$-Pb>@k%L3djicokbA)`a5Qm{ zd;LNB(8NLR^}`|#a<4BIagck#<D_WjfZXd1QeVu-5D21?+zakkR!TwIL1_9w?u`Jc zM-vCR7u@zj69>6B42yb@dqc5^gWL=5fuNZKa&It5eK8|LB#1_GZxD!IDfJ)R&O*}% zaxb_=fhG=eFSwpZ69>6B4rCshILN)RSj0i@jlm)ga&I(9yqJ+85kw=oHwwhBl==^D z@1fZPaxZwi8%-SKUhoh)nmEY4X(02^#6j*&#Uc)JFSs3qrXJ+pWRUt|MutofjpW`W z5Wi9i(*8u#2XZfX<Pc39<X&)F4^158-aL?bXyPFE=3)^Cxi<%kILN)(An{^G2Jnmo zl6$j2;+0bW!R=u*dqD05j}xPbgWL<Anm`i=xwi~t9-27Fy`@;hLGCTVA`WtIF-W|a zkpbLZMshEBd>~QkKe&C4W)H}{;PF>9agckfq2__dW1;3r6f-h_$6GU{{)5~9#f%K~ zAaziAQ2P};-nt)LtHRsAuy%CIRFGl@28K*S$T(;?xb?`uA!-2W-$B~lj0~BMP<e3e zz~B(-zyNMX;@8K7uCF1~0n(nrua5;?pF*eu1GwD<aSsC{ntMRzg4<D0c_uV@kbA-H zAgH_mnmk9S1El{Am1jYd2iXq}L8v?jn!G@$10;N)@(O73ETPcx6{x%enmkje19EsX zG-L`w%nJwG%D^Zp02wFA1h=Lb7+~Wr+0b?vEFM!0z~kKlq6Xk`3`SANxDp#H0|TUe z5AHQU`h5%x3?jNl4B+;9Ce)m4aP7swkf{h6x5;*b(4ct)1_lPU{ovL$WIXi$|NlE# z85qFrXHf$Nkjn(2_F6&hZDD0#fV78E?d8!mf{cG)*eeLJFWV79vob)(QBd`B=o&GA z+na?@cNaTB!mm&eGJeF$01gL+{h0c|?Li{!1&`xn(GPB);j*{b5z_yK#RqKu6gKZw zy$mwmSiS5&xSpzB_8(loRxkSxZWmN9`wwo<R4@Av&S}-l{)79U)yw{ab7u9j|KR>o z^|Jrq{7}8@KR8`iFZ&NpDb>sVgWIFk%l?CNcJ;D<ka^N&{~+_E%l?7K!>gD51CPsB zFZ&0cKdWB$4?J#Kz3d;j-Ce!xA9x<Hdf7j4IaR&vAGmz2UiJ?>E>XSgAGkiNUiJ@M z4_7by2Oc@8UiJ?>j#6n39e)D%Rv`1M|NsB%fcC#%K>Ob;iS3YaJ?MA}ldc3Kc;0kB zn!ZZt{DP<fBiMaV^+Np6_=Sy!XD^4$TV+GX#j~N~;n~n}@NDS#cQ$m~I~zLQoedr5 z&W4U}XG6!evzJ5qrP<JN?Cj-`@#}2pxOFykygC~?PMr-MpU#GkOJ_sJqqCPo=8LnJ zL*|9EmqX@%vzJ5qIoZqqgXeLxmqX@jvzJ50ql=gS-w%q&?B$U19W`A3?}vsbBP={o z<^OdgDl&lMC3_KMd;{8F6v$o#8Q0EU4jG?HUJe--gUz>RDl&k_ktz)tz~K#>|K1O- zZ5bHY6Tss}1^dChM|i!$2XhBBei-(Hd+!Vk{Lp+_C<H0TiWfq{p->2t&x;pA=f{O0 z`L}o>Bzy{?<`*x7%#RleLGoAeLP&TP3PJLH@j}S_JJen_JobXa8OdJAd^*Bj$b7jN zWIVKZA#^?+VJ|p5kn9D|r)P>m%IoZfkbWSfyyjpK6=1Lf&7;HeKPv+xr2T}JzB3gW z!1)Y4ypxwh`aRWX@k1aUM9|{lfAK=-Jj+7pJj+7pyw5`TybokPp8R<ha5;iBZ$s(4 z5xAU!%|j(Z!xybx#8JEmGOvUtE>OG(l23~lLgt^K?IDTcg^+otL^0?*JTzTG^99H} z@H`n7^C0tP3nBAqNalg((F(;Fz~cj~3=H6Y5i}h#R4;_|tEv}5`h(TbapY>~ICS+w z$b1xfzQvUu2*kSvJl?^z0|N&vfAWKBX9fm_LPf}UK=C5Tyc*KHD0m%4p&~SYErQIm z6)HmW*CNP#TcIK}|1N^eyA?v)3B`*b^KXTU(EPgyGTv0E2B`;%q4U#)ijeUW*!qY< zMMymji^oDm==?l1{tBV%FJS8@3Kb#q4X|}4g^G~*57>GWr1cQs^jIhewSOUGJ`q}8 zO5h0>aJoeb7sz}$B3!`ppGe^Xo(Dw=7w~*2Qn-NUMUlb<T<;dDLFdaCLFP%3!UZxP zjtCcUdPE8ra5_W^7fAX;gbR2+7b#r8^SVgk0?t=R;R2a2hn9D+athk+{2wa709psZ zR=wgMc>V)RIt9-!pqE=PbCQ=q%P;79o$6)K^bYQ|FfgzeK<g3kEE>EXftO#I(?PW# z14Cvzq@F;V$JnzUst+<h&um+~0x}<74t6aANAU{iy!cAU_&s!fhog8UWPTi)PuYqW zLgtB!mqF^?!YW9;n>h<w?}A&&gy(-l85qFh6Wby7GZwF)*gSB15Sp)9QT_j~1L}T; z;)M`<k{3YAndAkKa0hpC85k6j7eME+7C`Fz;uZfVfkHOZ3hF=bXchwlbUu=!c*+0S zAo)r!NW5n+fs9{3<pr{r{0Gll6)*k|ng3c0nJ+7}f`nV~;{S6&`V*BHAoU%17K4ES zKL5J-|4fiP+I%Nyy%V@SS-c1`p9U?LLF=c$DFHTrSG@55M3DYsX!%;a5Hf#MyzoD` z>0P`KGEY~$@c(3xIxO>P=<{*l_ASzU8v1-3%KRIw+|FM3zYk<SYP|eEfHuEY0G)>d zDFtKnc~98<8oD~fd=_M!CNu$3zOphffX9cR>cL~_AcLXhn<{Lcjg<j19#yEo0Iuoa z^XCGPej9v!fdFLQ06OmunqLRkAh3QWR9pbQe!+kNJf8z!kDvhQNBTqKxljSp&xhOR z09kM05A8of*IP2~2aon5r8^dgJJG}?idi7;D`tea8(RMg6f;7`1)%l_z}5p48Zdz8 zhv4oLfUKKAS}y^f4}$s&v>pQNGT3?ps5pFm1C*}-^FL~Q|LcIIb67oFX$8qQ`@y!r z=V?IWJK%mCnmA~D2RtuU%nX^=gXR;^x&!byOED({cpeU3esMB@=iiFiq5XPr?4sBM zjvuskj6^XLBwo<OLH2|Dm1yFi@hxyTqKSjX!@w<jG;z?n0I-jX86oKb8c(2g0pRdO z4Y&Uo>u6x}_vrZpn$AH<9E_3j1$cf%lmXIifvN+~$$}I@^MfMHTxdDU23x-cE-XOv z%-~XrfuVXiv|qj)+Am)Y?Uyfy_RE(;`{m1_{qp6|e))1}zkE5gU%njLFJBJrmoJC* z%a=p@<;$V{^5xKe`EqE#d^xmVz8u;wUk>e;FNgNamqYvI%c1@9<<Nfla%jJNIkaEC z9NI5m4(*pOhxE&<mqXHJr6HtUgxa3`*8po5LBkEvPZxvsBNsx(S)uU?S|0^je*o>L zWG{!T?}YU$vzPw|*Yw%TA@x%B^8an1c*$N4sgJUk{|B!$&t48`Cuc8*l&9ItA@xc2 z^8Z~>_27CTdpV?>hpofNUJj|pvX?{Zr|jjBdMSH3v|d^csYkMxL&meSm;Z;Xr&tbM zkFgxO9%K1`NO`~fKV<#I^8es*U|4@Vc{!wCSG^oEZks6v?H`*#`^V662-NWWzXL5i zN$DSh*PS5sQ=38IP>ATKg2N4|f7}R_2hS@OFNB0MQa=@(^r7tqeEnnacrlW_;PGZ8 zd%@$=h0yk5@xuS$acQJ}Ik@G6WG{F;8mWH_9*-9VuU7;2kL^MIW6&Vh|Ns9XnS%k8 znHhCK{y}SRHsI<PB}2zis?p+!KzzX4nb2?n^^?KvBBb^Oc)d>X!v70F?kR?*&*J6( zd!c;rI-%m_|GS}laC$9X{=XB-2akspFaO^T<%7p#ikJWIhw>rqsO6CMQZY2$7B7di zzlx#hw|F_Ey;Qs$GVfKq{6DxoR18h`#moQC2bqVbpA0VQ(8_C2KN-B93D$ms=4((t z8QgBd(@$OsvJZ=S;C5B<LP$PCG7r2C3r{~8++V9+2<bOgFNBPXRYS*9sux1?9kJ<w zK)jREPX@Q|kotq*ct`3dgX15mKL}0-Nc}-@dO+$Ag3|?3e-NBLkow8sbb{0$1h0!i z>L-Ka5ve~2jz6USAUNKT`pMw*jMN_lx0{jrgW&Xt)E@+=OKACzub&J~w@BdvZto+7 z3%Fl^6fWTY1X8$w*UKS=3%Eak6fWTM9;u%UPVY$J0xrjq!Udcjk-`O>4w1qIlKv3= zWN^Ml3KwwxMhX}3_%>3wfb$ou+=KOxMFki@?HxAs@+(w;0TfSy&~gPd4g?<G!;*fn z_Mi8IYfX6ncn7pU%>nE0LgR-6T&OcJu%O!ywO6os;s4d3d<ySBgA_6_FhKJqXx|2S zJteH4y&t@a2t|H5NPqDPNWECR5>k(5ibKYQK<)Vd|Nnjmx#$1?zyEa=8Nl@>D+8n* z4|NAaGV%Etdw8IZJEPaD@Nzs8oLd+eGTX3@7nH&3W7v2BY+np|c;E^LsDD7?1>kVS z2$wX-IB+?5c87s2975Y{2L&Pn14B5tcKrWev;pis({OO^`~N?50t0CMhbd~j|7*w; zXMlu<IchtDAKJo2O;7(bK=Hu9z`z4b7nxoE!6BCpwwJ-+IFv^7H~(@0@HotWXu4)B zUI=NoC8k6A@0qh8?IE=GJI1<EsJ)Ev{Y4OevxXKhfP03}@Uw%ulOb0F(w~Kjn?dJC z8Iu=7%KK#KIAr!p$arM(BFO%QOe=`LvKK@6$<TcsnO2bbwd}=^@$Ga-_$wTT(#gvp z?Ko)sC?qd~jDI9Af~@CDUIZB@N?run=a9YV{~wSSlA-e_$%`QKOUa8M^FqncamwTc zka{b50i@o7?RSKZUnnF)_X8$F_v4|B5A4_v9e?46_J?8f_0V)FknIS`Z`lrzc?sya zjzKnfmXLt~Hcv|^e$e|>uyhG3tU&&R#S18ZfZAg?<QZ|vgUmp}|No~J73CKxlq44@ zq!i^BC?pr9CYEI8r7Ps6mMf&?<d-X`rf@N!DJm^Ufha;#fJ;0vB?V+8Ty=7OX--O> zdWk|&YH?~&S*k*DL1J>MLS~*qNk*zdQD$CxQfZo=f=f|;K><u7gL?pY;S`eNNnyU8 z4_<BuEnSUm7#Kj<8N4PDyg-iuJZ{biR>i=;!pHy_w*W8dgIEMo2AW$2t@~t!sbheu z14)AB-$6>z^+45v5(r2cXdW0;io=9K^Y5TO0Vt(tffr9Qfad_f@*oWi43IH&baO%b zIY9P7)qv*B&B2q)4B#<(dlm+8SqEC52U-IMHJSmm{tGl71#$-{*NHGNfXBK)>zqJr z(0C@Ow+&if3hE1hk}`-5nx_W!J@^<H7(wEob`XdSY9E10NkIk%Mo^moRF8w$p!#_& z0|Nty4Vse%B~>v721d|0-T|mPL3;s@K-nPooC15A0bKTi_&1?)pxKc-P&Q~?!9%Dz z5Cs-S3LB8$K=A|~cfcYJGWR`L69af{>t`q%ls0~X3}j#cMHM9ep<ye<z`)1`RVU5B zz$nZD+H}hR+FQ%0!~k6b!N9->8ifX}b5USmU<8dLf!GNQ42+=C1H@jyz`zJvPX~&N z2Mi31QIPOq_`txx2#O2P+Tb4y42+;U0c6Gm1_s7bsJ*fb42+dfwj2WkV?ETZARz|^ z2F6J&pl%rhXx#-)H-XxOAiF_s0@aV8uqt3+U<9>&Kr^`&3=E8?SRnovVPIec?U@9r z2PHL_y9F2+7(sImApd~e2%6sju|e(!1so_XgT|^rX&gM~#=yV`Dx*Q`c^x283tsyI zs_9^9{{RC66DYnoAzR>?1fZ6JM$N$9gvNsk0|S#H3j?@}RbXIX0<B2}kAE>RFoD*; zg2uc+c7WEFg4hiV3{0SP8=yD`*#TOs2wE@xfPsMt<X%mved$m?gTfNzZjgGIpF!zO zfPsMtv|bFvmSA9D0`=uVP6Cg?f*7ED$iTqV%ErI|TA{<jz`z78vY9~bH%0~qCeS=I z69WSiXugS=fq@Csmu6vLU<Rc-Rt5%UP>X?$fq@y+&R}O?U<R$r<6vN52IVhK1_owO ze&S+aVBX2V0GeZC2F(ZZFfcIxWdP@Q7LdF77#LVU`xp2b7+65-GX)qJSU~Ie1Q{4u zK>Z>i1_qY(4B#}v0@@!h!oa`+n!f@K&w<v{h%qp*g2GLlfq@m2W+fOHSV8LzB^el4 zLE{8c3=FIwcStiZu!830Wf&M(LHn|085meW{*hx~U<0{Bo`Hc4<R1kF1~$-qiy{L9 z8)#jf5(5Jps0FCZz`zDtzo5dvzy?ZVstgQlpnZI53=Hg`@K9%9U<d8b&|qL-2bEWv z3=Hg`@YiBsU<dV|v>6!K*D)}F#$4G!^ZmLE4D6tJK0O8oc91*t85lS~ab>{3zyTVc zHDqAm0IkzCVqo9^jmsM|FmQmzYfKmzI6&o<DFXw?ZUzPhGX@3@P`H{iFmQnOOIt87 zaDvjaB?AK|C~sOZFmQs(Q)>nWPS8BE4FdxwXuYE?0|O_hUuMU^zzGUpdj<wh(0Kz6 z3=Ev0`8`Jl2F}0WgbX^(0aA8=D;!9=0gt_d$}BLK7n&#;7`Q-5OPPUzi=77|rp3U( zo!`O$UXuf!CuD%G8v|=(0Pl?fuM1*eV6cX0;Rco8jtmTpp!x-*%!z@4=>P)*H>d|= z#K6Gpz`(!_%8L>V49pD-4BVh`Ef9MF0|PfG&G0iYFoV>C(ldyCfq{V=)RzRYA22X* zgUS&%1_tI23=G_$Fce~hutEDZLF|tV4BVhN5@KRt{=~q*4LTnHB>shgfg7}@0mS~w zz`zZfcLlM(F)(n0$`la$I|BnZC|w9KFffDaACUXqA;l99D6fVyFt9#gVBi7O<Kd8E zfd^EkMKCb1IWRErfXXxwyMcj$2UKrMFfgzkU|`?@jde#dFtCC2g39bzNR<mNKtb^U zN`oM~KxqfmTnD8^@cthL1|HD*cn}{X4r&d8_xFGlgEBLuF69B$x8V5#1_mBbx&yIc z;SZ`8K;aFp<REDnY%eITIT#ptK=~FrTFC=SW8ii<$b66jNIdc+L(>u{3_$)YM6w&S zo)xNx2Q=0JDi1(vK;sY~HnQEu3=BMTK!p_p18BVk*xjIf3-TMt-5@sD-4MGOOc@w> zma#w*7Raq2e}dP)A>0Sq@5Blz=s{{WGB7ZJ@(jpK&>S7qD2M_E1_to@ZY1@fas?E| zAoZZNW?=gn7<g`hJj=kqV9UV3^9aheV_@KU24&kbFz~#Ag$pAC1E@|!syiVKJdisX z7~uI06c?b02~aZuTIMr=$~}<XpmYa~XI@Y}1`Shi>I3;ffPsM*RK`HXc|qj^XfFcT zy&we)3=H5s3())wwHmU&3S=Qv0Mxbtr8zJc8V*qZGl1G+pyC~rM#1|6K#E$x<rISr z0|PI}Zt#8y1_oY`-9iv^c|m&*gc!kI<^`o85SxX8ffrQg2{D0_8!xDh0TO3tVBiIn ztspiB0|PH;ycophWMJS0m60Ge7Xt$?DE)xg+zbr7ps^MZn}>mc7c|ZTV)HUE@PgtO z#O7mQ;02v?0%G$sFz|xv8jw3dVFoI<K;j@a=*$WbTabZ)4^;ny+$O}pzz531AaM}} z20l>z4q}TkFz|uW8i*~%z`zGedmy$r0|Ot}k4)fpEFWn7JxE-Nfq@US_8Y{OW?<k0 z)uSM`3<ConsGSO8%Q7(Vf$C=vTaJN&Z!ZG_1Bflpz`zGCvmpHdK2V(i5?5qk-~+8M z0kM@B82CVIK|pL}1_nOR`8^=E3IhW_sLlYfRT&t-GmfBkE;y|*Fo5@?I505qgUTb& z>WBme27XX^1WGau3=I6Bc|?%-0tN=~>Pb+y=Kuo(KPXLr%mJ?hWnciE|HANqfq@^C z#{3{zk{{G|5NBXu1h-2V7(ind@Nz!@(#GTmg%v*oc%2(RsEq+)gX{&xHHbX{+Gg@$ zU|<Bf0Tk~b@eK?N{Gc&B5F6wkP+Wu9VD~`NEeit!KWIH9c+Uzbtuin$fcLd9F!00L z`5?c6+KC|lg4Bb~-2wTFfq{V^R3CuY0t^iNusjapgYqa$J*Yl~me2g4GZmn02IM{k zvU*V46Kp2~g8-;_fU?1v0AwZ;1A_o4AA`afR1AXJ^PoHlcK&Ey1Fi2KvUv^E_M}E$ z1ND6f<+V^q-3(4PVFQ%cKy3%G1E6&}p8N$*{~$HE@)VWwk$?fTjt1vdP^N?QK?Llf z;!z9?0$$K|1q%a%0H|LK-mk^LAP^5#1K!t#qy{uz0W}KNmSA*cU=ZkPVPJ@5U|{B8 zU=RSc$>YHR!XN;e-)LrFU~ynz5CD~9ObiSx4GatdpmB*t1_qV|3=9IGGQWj^f#m=L zg8-;pi)LV81+hVA3xTT52Mi1Xp!J56AZ<;7FANL}Aoc+U20>7nKMiv7mLRAt!NkD8 z;lRKk2<pQ&GB9u?Ffa&$+I12P3>*y%41%EY9K>G0z#s_fuY%Nr%mLN&)1lkvK~A5+ zz`zMI2NWK=7#KJ~dO>^1njynNf}nm?Gy?+{NDZiM$Hc(E1+oh?uLWX*)Pv@3A{iLC zKz4!V3yc^TxM2N+-QeydgCM9ppTxkx4KfE*ckhJ^9|?lm>r4y`JPHg9f}l3KI0FL@ zNDZjIYh+;HNnl_Q0!7h21_qu61_mL}7}8<}2A%^93__qi)u8$rRIP&6yMWjV3=Be` za4=$E;B#PL5CXNAKx~j+Q2O1^z`zI63-a$l1_pkR8qgj%CI$w6kQ&fFF9`+){sjyS zLZIR7LktZ3AoZYrp*RBr{{sdFAyEIMj}g?QWe@_5L4nwe3=Be`J|~FH#K0f~I?oNn zW@caz0?lpqu`md*Ffa&#;<t~1L4bpSK?u}7@nc{R5MW>s0`;>&Yy}1eVNiPz#5Q1H z5C-*kjTjgN92gjcL1PPf3=9Gd3=G1ce!(0D27v<%48ovx920mbj6oPwM}ycPb3lG< zWMB{k=>@gNK<oqt24T>g{$U0NL6AA1{#YLagWv)N24T=R8;HGvfk7BFf9A))Ah>~n zK^QcC)5gFc2(k;*eg>KUfPq06bSBj?2JqG&VbJ+n$06Y@3|fP_kAXo5WIm{!Ys0`G z1kwxYJNto$2N*;^`>gvI7=#5F7(_t*sAvWTVFd;T5l}l9#CBj{5CM(zfYc-~Fo=Nq zM}3S8!Wj$<BA_}S#Li@35CQFD>|<jP&SGE?0ky|YGB5}?FffRK#uC*S7=#ZnFo=Nq zDQXPhEnXs^dBjr;3?d-&L4G{Lz#sxr1B%D94B+EgL_qB{5F4Zh)P4Z5L1u!+r9f<u zdXOK_Lx$!=eljpHTx4Jnb6{W)1r05oWnd6%U|<jht@6Ljz#w*jfk711#=Zg>5)=iU zF|mz-K^&wWls>OAFo=WHfc%vWWk<F!fXA^w?MhHS1+}d~Gzf$Cbb|DO*r4`k0t166 zD9?h*1(3a<@l{Zop1{B$3hIZ0#uH~SFo=TUT9}c6VGaX>C}>_7#GcE*APQ=4gV^&J z7(_wi9-wj$G!6qYACzuDZUeQu@*s7PD5xCEXJB9i*##=ciWnFeL25v0pooEi3FI$O z+qE1r7638^v=0*0dk_VMRW)Q>04!buVT*yrmjxhW0b-ys4a5eS4N}y=z`*=~fk6z^ zUyKCzkQl^3edB5d1{PRbv<b$BwiP)T7{oyJGk8BP$Pfkw2GCd&XgC#C=7Y))SX&XK z9^_Y0dIG5dr6mwsfq_A+2~+?vKq3#R&JqL7<%8=S1_m)uc!J^pY!%3-U<Lzty*sG? z1qxGSy`b;~jTJ$aF@WkDkiBb>?LySEVxT+-Z9|HI#y&vpR#1FHHXcAS70i4A1_m+E z`I6v0vkVMkpz;UCeg!pCfPn$r9|!NZWnd5kl|`VjJaD=KJC=a~tOv>ltAnr^of#O! zenZ^}N^77n1hsuR7#PGs`5H841@;$Iy*&eiI3Kib6<}Zx2epwweL}Dr(BLGfVa&iF z4vG&@xPyWkG)@RAi$QDy1_sEyGDrhb*n-;8ps)pp1Clr>oIv7WCnAZ1;u9p!!oVPI z1(sxB0L?WZxnBSj58$&4Kz2dh2J#oE9|Y<TgWLluW1(XX;-Gc|D35`ZL&sbg!TOQx z1qB1hUa%Ty`UHgoDDQ&9n1MkYw0{~@E`!XkLyIF&Sq4fQpg01JlOo3vSP#eo1_lPO zI;fjLegw5opi<(X^adJN2AL09>jq^rAkS5R(htblAibcmHmDkL(4Hw68#JB@Wy9M= zHVh2nuyGPloe2t0kU0tr4C0_R40z2S1B3W428b2~a95fEyr$5Bfk6V)m;!}OI|G9R zES<o@3s(Mt+y+WxEDQ`1p!5UEd!XSkS!lWfiG#{mP`d;qZVZjzZUzPkXM`G%HIOqW zK`caANr1*QK=ma^7=%G%lOP&|LE#9ZLH+`TCuk@D)Q$qL4Ps!B0PW!fu|ZZM&ndyw zgWLuxzd>VOps^p2IuKicfk7f4#9?4yn8?5&(Fl!q2?hoU&^jGxxPiwUL1RUru$qP# zivv3e)Gh(}7c|Zc3YP{Xy`VS;g&WAt;5@>>zyRuRgWLdWAA-hQ!G=KXg_Q}Q@kEds zkQ+g4ki9Dis{xnHpm+nhe=7q612jCr<G&y`C@?U9{Q@<U2jq1S8`Q3Z<sHyC6U@yV z3=9&Wb|k2M3GyQ-9YWcVgv7wW2x|L4^)k$6V34@L!T{P^%nV9npff%}`3j^LG=2}t zYaqXX`XeCr0ccpwfz)dfpfUMKNWCTjYPU2(#wa8}>2@)sjsrEvK>h+HZ}1pPBLf4- zE=kb%5{T`<z#s{#%Rp?<*b8WUU^!&$TM|@Wt$@^VlA!UKH4F@_4GavDpf=B1NZVc# zRPL>VwBaQ|YrNM(+UJs>GH?TQEFI*CJ_ZKv4h9BE(7Y6g4VudX^&>&-84L`Ppz$ye zdjSK3Bq$#J7#O%WFfd4lGB7Y~VqoAtz`!608XMgTX@^UK>Y{8&zLW%&XWJMUBtUMf z14R-80|Thd3rf$RJP3*xP+kMg_c1UqNVY@O%x7SboC-}RP$33z8f0LQ1nCFmO>lh; zEdyB?7$iac1!y_}Cq?i&ED#H74oD5CyaMGfkX@jD1ZeFR*nChdfYdTDFo5JiX^)wK zL2@s2zD<LHK@!wf0mU^)FKC<)REC561sV$iwf_!4=S)Fy4K@mtP#G8)Kz%sSL^sI4 zU~vWp2GCd}EUhhOV352Ibt4A@gCr<Tf$|^79?<*(h^@fDAo&(LPj11$Ao-htfdMog z$iToL1u_@JZeU=L0?mzq#=}73pt%MRTY!N<3e>g$u@x8?q(F0-AhrQCK0#w+4h#%Z zpni`K0|R3K1A`Q(i~zAC7#O5L?IRF7fq_8^+W!N!*Q7vo*J?<*mI?s}A_D_>%`>zt z1lbF!CqWqG9#9<xUem?EAO&hug8G9X@m#202?ho!P<;jBg4_e@LxAdWkQz|jgV-Q( z(7Zf|4e~Fj{Q_biU|^5}or4RSdj_co%@u;!4h#&^p!@`4H!v_rgYpN6eSm>M+5#H4 zpt)gC8U&dGno9+ZtAW@cy`b?y5F4Zy)aL`SL3(4L@g>2)APs7NfWnJ`fk7HHhXqPM zAoVrS^3{WZK^i0mYS)3(fXW?E84EH8lx~b5C6M$QkjEJq7&bC6NN)s1D#$U=`Fm(u zVf18RklxM$=?H`74M24$C>?|R4AKHh2Ox6~LfS!~F;!_$S_P%a1O^6aP#E<=$|Y&g zSOJLL!N4F5ni~bNConKbgT}o<>=_IU(xAQmAiWD17^I>7Xi)oH`X2)W14#S<1A`1J z)SnWl=~4!i{y=dLiYI6qg5+VOytWy-hJlTNK}HZ7rm(sLG~U6$z#s#PGf<lqxvc_T z%LdI~pm}EW`~}vFWDjVKC@4>ZwLr@Z4h9Ap(0Dee-T>JH>g$8gK4D;x0j)^^g(qlU z2-F4z%}0UMxI^QJiGe}J7o>oJfq?@uha(dN4F>@R1{qLW4piTO^nm&epgiorz#s!^ z6N1>FIvf_KjtmSkusi@#QxCO6f`LJ%70L$hB}cS9z-<gr{~2U{4^$0keiLRUXl@_M zhOGAkHKrLD7(we0pyG_~3=A@$wHTma0=XHKCP95vkeQ%-3~HN!+ygo%5>)OZyBXYO z1qUVrBlz4d2%7<v*3jbuNi74oAI1ww@K7zVIXB3B6I2j<W;HK(UI-$Nn45#_Yhqx4 zh(pvfg6b%kzbqISWOhNr1XMPI>KbUdD+h}sJ_ZIk&>9O+e};j9K@Q|M5Zi!(K@L<l zf!h5bG32>#(AYaD4Y4sWC`7kF2DL;O7!*M9D+H2YU{C<{+dym<1_lLC9|%-Wb1*O{ zfYK1iOwgJXP@V;`6&M&4Ky#oVwgCf!0%#uwNIhs>2xu(`i0#3^pa5#SfyN6!VjzEj z&VNr}U{HX?JE;GL)Xo7ZVF0yPKuf+rZ8T6{8Y~FSUmVan1C%#GbquI30kOgLDPc8= zH(MZ+&>GOWA&`GTb|Lv)5wvy$RHkq+Ferk?H$Z+=U|>)LwS_?bGGJg(1eGBmHfXL4 z<UY`t9XOAJ5+q0fG#CdhAHYJ;d<%9b0|Nud4v@VdKZ5s4gY-b%531)t*%MmFfa^;T z8{9r5tVVfa3uF*Xgn>aBGzSNAKLZ1UGH84Q#1>#+PzIIV&~Q@*ts4We9T*stLG=?q z3j^r9d1X-B6~s<qU{D5)>G3l%fcodk`#_UOj0~W?n986!3?!b#z@Q9jmx9>Y3=GPk zem97n!@!^n%2yzEE(3!yC~tt+c?=B7p!5x5=QA)UgVG4dZ3Rearh$P$85B++aZr5< z%_9s?85lIVq3f_f>x4k%0%-mc)U5)w13_&^r1cgI4GavLp!q&fnXmw{CW!%D#zE(e zL1Va}?D&L%LDL4h4&)gFgVtndJ<EYREWz!1kQ+gH0+!xE?Npe1UokM~GqXU>2m-C~ z0L3Gy90koegWCBZwgLkKKd6liVuRccYA1r&3D9{$5W9haffrQ2f!LrqLmN;hmVp7} z5AYl&Nc;gbU4!N)LB$NH9s{vKX$sW-0kJ`IHK4Q$Vka;#fY+|PhSaODc~K?>1_pgl zdqEsBjs;%h0b(aGFzAEEBSCD?d?vKL#{_F%gTxOoFzAEoBM|!m1A{))ouF)>4=U^4 zK>7;$puQuBy?}v1AJq00hm2k6gWBLAwgUr$J}BLT*x>Svfq~&IWIllhRDZ}q<`DEj zd$B-ksX+b(^}9iASU!8tz`zPJ2h@fEi8nAX=!3>Sg&=FJ^g;CoXk8UJEr47I%7@T! z1r>{+`3B^26colFaS#TTTcCW(!N8yoYMX<``oP*j35kJ$5i~Z9q=pByMg!C)K~@7A z1BKN&ObiVAptiwF1_u3I&@>2|dj-jZj6{-$tuHkY26eI+7#P6!ULevk%p9w`P;)?I zCb0Af>I1^qpmAE5`Jm-Yp!UjlXkXw51B0~^)O^r*B}~sB1_qm2X#N9LRiN<}usIA2 z4AAwe;7I{c*n-v=fZ_r)t_)&pK+OiJ2j>x9aCaFLBsL(uYS8qh22J;Z3=B4)GV(VA zgUuYMTmCXI*q(sqOCH?$(iT)-gUU4p1_s-!khy!%dKKGyAV)*u*lr@!9FP#GKMBeg z3=9l*pmr{Z%>mI1KL0_0fx&Jb0|O%{E<k<)#VsfuurM&#Eo5L|geD(5Q2z*IFUXvA z3=E7QH6Zq81_nlOdII?tT8@L7MX)**qz2T61C=G<aSDVQJ5YKDiG$RD%2N;<tOjZ+ z$ViZTL3Xh)FgSq9Z4jG-fx$rnS{E@eFgSqr>44OM#6jz>K;^Cg1A~JV0|O(d{{{0G zsNVrH$DM(J5fnBcy@3o2jG#Fg5IY*-7l#xE21ZB|jlm(Cfq@aU1{I{Hl!1W}8fB2i z5Xg}X3=E*K0l5v7caZZI$WI_~CI$uvQ2GLeGsq2~F)olC$nQwu<1nQKJiQ8PBH4l3 z;^L6NbpWM1aYnG511MjD*lY|84xqdRVzV<aIDqCh#3jIM1Rah;+XO5~^*YEdkeQ&h zKA^Ay^*uoAX1Ey`96)tFXx#}f1A_yoj|*b+F)%oQ@+yeU&%odS$}b={gX0JiIE<h) z4;!ZzV_<O12MaJTg34%cSU}Z*@(E0xAOnMA1ymi#EF^WHHQ&hL$_Q)Y@h~trwnO!R z<_W=ikkSdL{04<H3j>2=A5<M^?g^|86zB{LjG(*#SrE?vI&;8rI#eAfEg`D|tx1Nd zlV)IWoDWq88rMNq2P#)!>UbF#9G64Yf%@~v>OlQhs5(Yv1_sCV&^*upT_+7qPmZAY z1FaXoz`)>m6lxY|z69AUP&)u>7HFNh<5{RWP+I}44ietrb!tfI5PT09D11~I7#y!c z^?=3~z{wX8j&OB~3=EEMpz1(lRk+kiFfcfYK-Gcw^@0>)F;9$v!ATRU4%)v%iDy{+ znKCdqIY8Bc>RSc|2B&a-aJmPX%m|uy12H%l7#KlyIgAa?<DkAD0|O(d4+#?o&8tG$ zPBHwDeh!omqQGT3IDQ~&`<#;a!TARy#|Uo6L)yEHpz;MQ$iTn|+S34HgQ_9WI0Yze zt1>V!g4$!Cc`QW+21Zah1X?d80bS1z8mkmzU|<A|QGx1nkUz6P13e&v7#J8qbufs@ z!oc8E1S+&Z90mrb1|;?*1Y2e?g6%XLiM;@cy$Xqa2*DQTLa?3ABG@u92sTqAf-U8U zU<(E!*iJW)*bk7{?~&Nw5Nv1g<`l5MGV@9p;^Q5If*d2`gFT~M<3l0?T;t;zN-7Id z8FCXV;#2cViZWA+8B#KfQj<&KK^uUI89-!wW(tgsFJVY6$%ro~$}h=J&d-6W&CJhZ zC@xBl&rM8bNGUD>(;$9k0hpUv0G2JtFDe1^!Hklk#Jpk<3t?Dha&AF9*g0TUa(+rG zLuOihW?o8a1w*N!8AE(Lh%C)3&P>lsO;IS$0GU{70TQ=hfD0#QBo;B08XJLxjg1iE zpa1}SCpWdEC^H%AHz+5*grOiYIXktam?5dMB(<2KxFoTtBtADkFF(E{GdDH9q?jQ! zF9lT~EhjO(7_{FiFQ1_#xgb8JD8HbXAtkRkz9=<0zbJ*F)XW6r3NsUgD{}Jl(iK1i zLPvZFLr!8zYB4CxK?XuO#U+U)sW2Ik(ecTNrNya8=Es*XWTr3_r52((tEjjDRUkXH zlA$ayrxX;=1@RD9C#I(trKTsAq^3Y)x}+#EIW<1DEH$qrz9_LgK0B=_H8s9CJBcAR zuY{pEJ1H?GrHCOXKRK}k6yNY9P?VZjoS(-KAD@y~lE?rxC9kBYlA)j|H8r=OBtAL6 zG_QoAATtGI3OJDBp_+odo#OrcL*iY6`~w19UE(8MLl{6}Abxz1t7EXgA6Py(z}4B) z&C}Hdi)?(bzq2<MeF5Gf@ge^H@xi{1K0X-wLYxEQor6PtF(e?S#k+a>gt!J_$cDP$ z(B|hF0?`8Y3x+=b5D(WN5C33H?|I@d&@&+3)6c^N(+Qpd@j(F)yD+Q?_49Og3=WC+ z^o#c~iuVom2?6sl)J3=j`NjwM`*=D>V#s+0#QXUN1o?;fV@N^6CdfI=Db&pkLmI3p z-q#f~P(h*X>tgEXAL8a8>W3MNQ29_l*N6aD=MXIM3{~Og=;;$0<ceW6)MZYN&fY%$ z?ikV_-EKaP?!j1PqFjUg!#(|6{KK(I`}?@WyEuk8VwVha4Z^3_&EMBG$Q{$cAQuI> zIhz|B8OH}WhGTb_r(c+(kEcs~uxntbtDiFtQ(S|wq<)b3aP5(PSl#aI;~$LOOgG2i z5dQ#I?Ak!#;pps*)ksi=!zb_P>>VHK7wqa6f+tAb{Nn>dT|-^t1A;>RushJ-%^!P4 z^9+dh4-N725AqKUam5T(rvSHjXZIlg(13VX_aN6`OckC1VP-C#!H!NoSW=;%tEan1 zymOGNV~8s#DPn{HL;*+&r*5#<+(NOGNf6C0u8!C;2rl;qx_AaVV-E}GfY5kcIU>R( z0K@Si&hegp*h3}M&%@Er#mChp9-PTBw1Nt4?8T|KQ@neye|)ejX08Nj3U&4mh>Ul0 z4E4b*8eLq&;<1&0An_nqM;FYp3lyyJL7sk?cKP{ZE0;W6g5pDhLj9aEJQU&>fU6Dw zNrgn<D1kkleQ_1&(9DcI0Kvt*ql-(BYfzAX5Vm9)@9Bp#S;Oi&Cr?bD`#MH2fSW{# zMd`&1h*}+7Qy1iC=9TCdXD8_+B=q$4z$mF8O&{K>(aT`S%qvlVtI{YgDJo4aQ2?8Q zt<|8Q1+q_5p_)NKK|vutKB+V_rzA5kJ~uVDIJHDWtvEYLN5Mcxp*XWDH9t+GI6FyG z)0)A+$`GtRsUQv1E=)=VwG>jIs$ohYHWz2dCzYn9Y3e9|EYh`uwot%^n1BsQ%`44S zD9%noZgMC<S{@3vP+btNHCTOSnt}#|uVAMT?Ck{3Ral!LFmFKvp*TM|TS2QhTfr7& zonCRaH3QUj49Q6h@p);<B@8*Kc?_TyQap%}o0tryGg6AcbYW>~X=;3KB6tTqLwtO4 zPJUi$N_>7=T5)O#1BAzrm!FYR#E=H&F%+bxW~ZhwWTYmh#HSU34wgvEP0dZr$;nS< zC@286KP!`SQW+AHOESw+<5Me2QuB&4^Ye-sN)j`3KrLCYR<Mg0N{UKTL1D{KTAW%` z%z&i0C@Bxr2+zqZE@8;Yi3fA?QY%V8O}jFNlvFT|FHSB>EJ@BlZR0W&B|+53#}_5V z7bF&e+Lg)qIr&8(nWD_}j1mwdCpE2v0c3tW$SVvvU?$j};%tV@g7}nFkndn2QBquz zm|FmDM&^Q<@p;7z*^u@*Lov9q4I)9!YeXBnq&U9_)XYuHOU}qIVu&x!jxS10$po{K z;)_z#Qi@9$Qc@vtnO_7B7*IIG#}{Omfcqmb>tTF`%=EncqSW}5G={vicyJZ~xwW`7 zH#aqfAwNGqK0iCLk|D<=J|nR>gQ2(_LYHTzWyXU#87c8)i8+}m3<v>+y!`mIWKb6) zIkBL)GzZegPR&bBEQkjslH}sjTm}#U)d_K1Sx#bJd;#cOhP)D(8<E8zI+F8q3vyCR zQsaxuAp$w6WvMxko>*!g=&*<Q<ovv}%%WTdaCavqH7BzywWt!@?_nrOjxWy6EQn9e zNh~hTOsfP5B$mWy=A{><78f(*rDPT-gCiQ!aVsb*24&oW)S{9~hRnRY)FKcU+*t$% zB|}kaF4!OWX=yq6i75<FIzFvDB|bN?C>t)2V~h|3$5(1{Noop1T2X#3!uB+X<5D4x zNl8sEsw@DhD$dC-k54bkhj=(IALQWF5{BaB-1yA=_)^fR6(Em5x|Rh+nfXPTC6(ZG zm6@5w0FE_iK<1a^Gk}>T$(an`{1u;EP|8r8nhbU=#EXc|EGQMH7D0WUms(PuUz80_ z+HgTo-iNBf(1xY~Nhv7I7~<p0;pqU}KZSS?T1>>pC#4#iG2|r{WP*C^#i@BIsYPJN zf?WzqCPihbDe<5ZpeR2-7wSlOM-JkZ%mT0gtN;V|>f%cnic-_S-8f_>B*%cHiWw41 z@^dqj<4YL8s#1$UCApOWyjTU5jkXGYp*}vE44~4IAs&<slk;<PK|=@G@kJH!pj-&b znqXFZW*Q`J5F*L>`PrGNAa~{DCuf6bP@lLM#3)KG%gHZK1ocwm!Ka_Zg9}u!RBCc6 zs04%yBqb(i=j5k@<kIqs$`gxH;=!>B5`YI$ZfY)wpOX_`TAZ2;V!}f;JH9BnEU7dN zB$$?&Q<7Q)Vin})WF~_W5Xc+x$%)AsV3+3Srsg7yFV0JWYAgqdgPjEG6UT$Oa95NR z7ef2!#o6)YMVTe32=9Q3eNavZ*$I&<fMj8i0BGn1%7y3X;_Uc>#N^Dp^mx#4LMb@7 zit|!HMP@!o4~PNr0U{GX@*zTJ5ojEuI6EFRNCY(uCIl*+LB<s2mzJc)gUT)tFTFS) zlG%&1<3VhYMsNjFoDB&LNby#j9bZxb&TCM0DVfEINja(DFv(6W%8LglmE!F9y!`m& zjMQY1dXV{WZczn@3#zt2X#(syr~`{LGSk560bDGB`~n-Yg4zXkQ))U`PfliDdTJ3U zC_u)6(tkYoXq|j;$RsD`<bYC5Jjf1^g480gcxq8md~rU+mc-=jc#s-s$^sdVCR7R@ z{)jKBC`yHSxu7UDEwv~<skFE<z92s*2V^#!6Q5L?k`5}evf~R<Q;Xo1CuQcP#1~|M z6D3#zGOhwqlw1S}yrSeXkZ-^-46Y|ZMwb*rMt+L3<BKy&OH%U7^B}^Y;i2N}_^M<m zBN^mTm~%nq#HXYtrsQPirN-xingif?1B(}>f=BScc@7+sB^6-t(!A1Qh)X~*2=N6d zmcXS6$kO7}<Wgvn8=stBQ~;OAP0dXPXHHOZO^r{^NX$zIXC-jksVFru1)R$uX&-zN z5y&{O1L7gB0r8<x0m`Z%F1WT$EJ=;8$jvMP4`~%=$HQuTkb<Jr(qf2Ll9NDuQ1i36 zB)=#TVs}w;DMMZ{xT4R7<abak7=f!jaB&t7FUgYQ(-Lztb3l$v24^{t<CEjT7BCcN zLs_6u1M@Nq%FOcfpvv=7OF+$$WbklXa(q&LX<kZvN@`hrCaAPY23MqDU3uUTO^z=! zi%$WM%7F|nGXr@yz8Ee5FEEqiQ}XjllJg5H<C9X;GeNPQ9A8oaDOKRDPLLTzSOrtl zU`~RYlbQ$0q{;Ch%L)=fZ7Bp3WDvqxMagAQH-YLWV<WH!pgABJG@c7$gT`C4ljA|b z0yPcJ1e*rpfi>opf(qv3cu@F5gCD97<PwNT2BHmFP*9Xw#!!%7T%4JdlNt{S;1UK< z=w;@afgQ{MVw5tJLU<N1hM^gZWo!hk+RRMiLFGv@yl7622icRF2Tl;l@g?Q)DWGBj z(inm|HYcYT#Z9Gf0g$&c^OEy(K}9pTK><n|$z}27(2y-D2S;aK1;o}OSV5T_U!Iwl zl3xyLkb#@RV5^JsQsTi%^Fd?S;KBmrTu?@4$S==JO<^c6WGF7k%maylWS~rjB9H(B zXuKCD3+8}D6N{2F;$gz^B@BfyHfS&zG!hKzfj}!9C^sI)El<oWfhI6eV<*0Z0Zjy~ z0i4%L)6&2#B!)sz*9h8i0tYTb5vZPoSBxMpWXG2mf`+FVD$<H_L8T_B+N~%6MJ+>8 zC8!ONRGFDl0cw<h5^X_#F$1VXDq=`a&C5(-fHW#VlL{#e#i==|$tC$k3^{2f49TTM zAgVkuC!3)lKc^64SbR}xW?pe>Q3<#sm7fQ(HLr*PmdRno7}zyssmV}nnR%%diOD5U zPb8Nz6qSQQG`@rZ9HwwyA%q198;}Zy<h+t%2C(AP6o&Zt9B?rR@dCs&&@4?QLuy4q zW>IP}Lt1HGGI%&1>;P~(uZ$rV;!L>zpqUYrLl{!PSqV(W=Oz|sGl1t{AS6TpR4Zjx z<fP`sr+~V7X%KcX1E^ZeXMnZKK&3gv8j!K6#l;}MnJ^@pfpQc>d_1W7PR)rg%}g;i ziZ6kv%*jkk1w}@Da#}hAsOF3ZO|``5Waeg;Fl2yQVn}?jJY-4+Sp|v+SWRL|N<1_; z;)_$0^Yc=QA%<a-0P83%2K9)+0f?#tn*=yu5iTz+VgQ*7@&>584Cy0*)j*nn@t_n0 zo=U3(^%fXFH7CUPP<e2xk0B#JCk2u{AWV>XMc`=8FD+q6%FoYXh<5^!V53WN3qXB# zP-hUD@QP9kGgBBKwQ)vbQ7S`z0Vo+H=720s%t<e1NKDL0&o5?3g;2>53TzsvW-rKO zfH!ME`4gOwK)DgrYk=fN(9lm2td;<E)r<1;K{JTO#zqXF4mLwUVtQ&kxB&=af%<Kr z!3uCYFE6zORBxrFCYF>IrGnB%dRjqz2}5>iW=ebs1B3)M4M3HDekrv2Pfjn&FD+nz z^fW<<FEbyMmGe?dkSbpTD+4RY@DApfQf3PBkWyv}XhaD#`c!J60M17WwxAIwa6(Sb z&jIlu13#sPW(tsi1&Qf^n@J!RL>AN-C@9KDj75Rw<=_KXr52hx3L2#r3R;?K#o4-c zNF5tJP$3Vt7(6It1ai8u1*A`uq6aF3Kr@?=K_l?^ReWY<nl%G>@J&xoKdB&1zqBMX zr&uootOv^=T53rKvX4_sGC*E7umW3UY7Eha?tZW)P&DPIX@GR-D8L5uQcE&2Qi>F` zG(p30x^|$1p`fi$oSmd=hv<qzZ7>E+1cL^oGQce<hK%^){L-T2R0inmFoOZK`-kf6 z<bq0#%oJTaP+uiCF<D0;wIo9iVuX%@Ylug@qmQefCM4jo>jX_KBk6?LilW!R$_V0f zkVVMT)e5!>puos0$<HVTd0h|cR;YcT@jpy0wqR!k#Crz7M*ToZ3TzN^s>m#WCyC4g zP?CW3jukQsa0Mx9XCE4@pfq9%bw0=*EQ!1TIm$B&KpH_R!5Bq3EUZBx26A3zfk|eb z8Im(WT*BHxQH57K*ozFA895APsYResMurklwVPi89@_+!5a2FrNl6X^xEBZN{Fmk$ znt@8vqGARED@!YQVgdOAk0(IM5i(#5@r<U9f?8&Q9=Oqq<S~c<$ZHV8A%n^wv$3Zs zh!=4f4z50t4F?NA3^#`)G?2+!NaadqfgX$pP0An@ptMI^k|{GIKGA@>5TJYrUfPh8 zl*3SvSP2?g0|!26uofhlkzW9<MGdUXK%ou72)E-2aUBI%`09b%%6hQ2vW|jhK)kPG zL_8$JLd-QJ!dysTgUtnpBz|*20SCrt;S2Q{BzQqN7Z%_Oina=#0pMAd_z-7sriB%V z&}4uf4<*TnyjzltoOw%<apqq1u{%(D0J{?<EWuM9VDk}E9Uv<-twGB_KrsU;zrf?q z48^I144`2H5M7j7Y{-z3pO(gu2I{d@<}nl%moO9*XMj{Nloq8kq$Z~_B$pR4K>7n9 zq4<K5B1oiyTXiVKT}g6*9>gwaX{P{g1Y)QGb&Fvtic_IWQZ&@SegIdDFiB8J35rTk zgHpj3Vj3hi6hKm-LI)}Zb_|jfBIw|8W~%^WLe(iKC}gJSL6#zA=I4Pd$Sgw06{VIa z*n$p1hRp5c<mYFX7Q`p!rNozljyp~TuW13*VxaONMF&#->nMOdpaY!)f_Vg-aiGh9 z6tv*$V!%c~gC{q!ARcN*YEEjdh8kQIboGpmLS_ogJWyhU%R@|2gpPeeXTwU(Ocat! zi@;MNpq3xh7RW?KdTL30Ua<z$G_*i~&d)*u0>$BZspSy6Y@wEb5~Cid5eFV7)q^yg zixq4Y40RxBL_tA84;&y0w$Ok<h$HkNFGd12RltoO1_LWIY>GkccaRm}CPPkY9>gX{ zWPx%WC>)^?gex4?K#e#xm~V6xKr{A^evz=?NK?=N&$q<qrWO|`rl%GwsHrJ{EKsyn zFhH)LLDm%%W#*M+Ybb$-hd`-C0TdPr;ITc>QPoJtX2;|yfzm|@)E-daDWFE8t{oy! zV1cP^t6&I;3j!J-0i$gTX-ws$<`Ja}8ulPZL)LyN*h14TDcVuum=ulRrYkJYku-u@ z|KKo(G^dD&R8X9vh9-K%g2NA#bBK#wuyQ<63{GUAC<f&b1=SR!=&fadSb<pS1{xLu zbyrGKa|=L04qeLz8byiEOUzA$Y5*yNMm$6WGI^etTA~k<0+|5m+#xsML5l%F_GPCQ zL8s6`JjhTK)G%1<8zO<*S*SDWxcV$Q3OT8u;?e*TVa4T{CCM2I8nEIOo<%ULsnQgb zmSt%QqG<^UX+#$YtQ6XX0I5TCAxcvUu=XDiWj?4^ky-?*E=yBDwJW3?!K{o*QwsD@ zDkErZ0&)wa1rJhzTBQ}GmXsFdf!pQ?B{`{iNVyu6#y}yY3txEvSxx|PjHZH}0%(n& zuVaL7usbNQ46IBcE`*v5sz*W9vVs=OfKp>4sQDnXK?Qbk33w<|!PZv6#V<HMz&|KN zp{52@p&@ETgcQgYaC%ly0J|KyiI|dC3~za+<P{_JD?kYg5|l)Rw}Lh(U4TLzW);Y> z8i>G5$t#A`2AT?LU{?nQ#e<g2X@YzKDp?iuwG>kFiWLe=Q;RAUwDcjNqM)DvnyHJ= zFNy~jtEurIhk<gP2Baj1_yE*}1l0$iFo0L;(E1n}cpyFT)T@R;-a{>NKpp|lKq6I; zAXO=uMIb52dNAb309~s9u2YdKPe`@`2O?$`LR4Fb<{nH8IqVT8<0_nCy7WN730X}H zi5_TM0g}8^@``osz(zm=5$rB(dNWfnH6ofUAZ>76kh;nilwOcL3ztS;1+8F<(w4!d z1w2=cvLqR&CQyPTvO>YxNPy*3@Pg))ykhY3Ax&#gw-d5vhyl8K0Y1xIk_;M7FD}kZ z0k4RO2TgAjrRL_Bq{e3!n1F_=6LY{UxS$za&<wPs0i+UCK0!snOz@0VZfZ#)LwROV zD!4lanhY%lO*(=ZnN_I_kQFVE+0u-12oJK@K0CD%G^LgVcPu!A6eJcEr$Ux4K-N4U zS2iFO#d^u$oCysCkPs;3GfVP|Anjpj6H?O}Voh#-9!QQsuLQKN2UO)}CM#s-foA&@ zKr6mb4S<xD;4v=H;w#Xirz9PPQVRumriNu8P|hk&%q;-Tt%AB_2B3x-xV!;1a0`kO z^HTD2<4cW=G&B`d6<{hg!Ae197+4uXnwVwznJEfd;J{4H1EpdOh=`^Js2!pSZfe40 z!3)SB<uybRNJ7C@0f!byS_QcjrXaN>12GDq1sWYwuu}jT0!k7fXMu7GO1_5;vVgim zuwf}(I~*fgSapKx1Z16%Dh*{s3uG&(Q-yCZ3uGy{mWLJvpw&kyMW8vzB2Zrm=EKYa zBoAg5Kox_+07V0lz6QA+@7NH?<yd_U3NO-hg8R}rCh?hhY5B-QU{E1g`HIyxh&vHJ zM;<-WwL>31f{NfZ5#oMaCV~ex;5Bz<fvz1`1ZE;AE)gvvaI8TFq(LfSTuACn%go7% z&oKdcS_3(Tbl}MnG?Jog2h*japau&NhyftG!24-HD<KqY6`-<ua4|Gxplvtk%0OZW zWuU+Wm2gO^U_uB*pzuLc1QUWN(gN38NM?Zf5IInC1bZAZA`Kd=MfNYGWdT;N397n5 zOQ0QtT=3>kkP9K{4H~<Ihn=vdB#<Xy=78grusNU@z!}>p<5*xn6A{@^O&D>Fk=wv| z20q{p9+*b7Okg9_(7A9>;xw=_gf7~`oS=YC{Xt_0V{j%FJP`?zg;W}lZC2zDsi?sl zD4_I!)|f*ZQUUoKRfVn{w11_5+Dk`Q1!?YJ?V6)21*bTL8t8Bd#H-jWCc23Ps=-L> zNrRI<s=Kgtr9lA(=}!_GCjq%1)aXJTE5Xx$25A6clsJa94i%6`pFpbgAi;|m_<#%v zfuzXvJkDkx$V`yGv5f}7<WR!|R$zc+VHh(kP%lJ78cBd@0nxAk&`T{U%F9=<RnRR; zEkUFZkP>i!L7MUkT2LA?f&yBOnpBz=4_$w#p$2J9f%_ha{vVQlO&tXTXw3~W8H7PT zSA>{~&08R8!kz~igd70m-2JA6<}iqxbnU=Bkjxa+Fo8+J`hB+Wo)M}#kfUIsR9u>r zn^~d((FzF&$ogM!c!8FhLt4lXLHvzjXs6Gbp(KL=KH3e|0uHbYUAx5OY*5R!BtzG( zxH1nGw6zMUImM|8SQMpY<|z<XRa9I8R%KuXnGZ%YFD(<7O?cga!``Ce5|E66l_l6` zXm%A8XFy~PA=4vh(xpY|P-)1lB${+;aw=3BGTV$Mom^f7l7_Z9KpS06!0Xw;JwgVk zFauJx$H0km#0oSekfxvkYsi9bLDYtg!DxXdRTOM&;f*4Yt)SEl!%(Yq?Lh4SXuAZI zs3865lH>wiJ4m}5E%n0nf$Dwi`j7{ypw_{Yk_LF*1lA(M?5l$k5X?ix$t4BIy$>*7 z6Wvo_(Uc;FvXaDf$aE@bNqBsGPO32^f}l=-wexWJ7;Fq#eunBq^EI+ZKrKsTkAV3Y z9s!G{6fuC>mJFqN45`T(`3#^9$>oWa44_G4254~zTB%i7nwpoK3ffBzSy`G}QVLGX z7@h^03hqrS*eZb78M=0$b}wpa0*_RXig=I%5UN2uglc4Ofrd5_2@W*ui5@pF*MMla z9as}wX$pA>4y+F?=)t8BED?cxWQHF2W*JyRA2i9#0M-BwF(?xh05E1YC~ZMhfI7jY zc?_j_;HA3Yef3}#XsIMb%z~jb9vq3K@p&oni790z3}9AKBG|YxGl*<vN@`w7W?Cj_ zLqu|JL75p`b$(fDQBh_}Dnl`7HGL*%9|w3{c@aD%7{N@+ONlQ^WPr$mcEF@DWaQ_j z#wVtO_NwQXWTX}`<R<1Nrl+Pb6oHoEK^C47mt@Q`bnPI1CL!e@G=aj;ngKST0huX) z&sH%&I-U&iIho0+dBv#=kd@K~P}&em8$rfqAXQv^2?MlxgvuI2X%nd7uz4xH`1ttv zwA>QV)H1$#QMfvAivl_TgjZ0{5aJ*-wR%PjdP&8_40^eV1;q?{Mfspa!T|FcsCWh2 z03OK#@j!<M<ix`kR)a)9Yrq)5tJXo~D`ahBCTKPVG%X5VF`AN^SdtN6lwZyOS_=wY zA_h{Cl3JFT3|d{C1lryPS%wW>W(_K(!CcTPX~=rm@<PZOyyDd4_~a7s8Rf4bcg(`h zFag~Gkix(q6~n+Fb%23^4Rm%O2Ll5a=$sMo87~YB4B89~nxHcvVf^O|4EmsZ17ZA6 z3=9S!^I%7@d|_aa1fA3Mi-AEJbav-I1_mq8naD8ppmP8PpmspdY3I^nVBm6MU<4nB z1Cj&rs~8wnKt~e&U|;~tuVP@-v4EVX1mc5F_W&J}3R4e~XNBA=1(N4_&%kH`x;xVV zqMuuyfzbnWcc%lCAIQLH0J<kN0Kyk2V_+}=$rnKQGUpf=TtLSTLe<OsU|{g!U|?YK zfXK^AFfas&FfcGhK=^R=2@t-l83RKMNPh){50`I%@MXIg7*asz?{y&Y1sNDXXTiy? zVqlQn$H1Jx#=yX|gMk6e|H{Ce;tjbA0nWE)U|>3dB=5q&z;pv*9^AeMNb;b&I|U$o zxl#t^91y<)%3sgGTma&~fb!onFlR_Y?o0&PCkNt-Gl1_n1o7qN8JJ5rA!p8k`R)wN z3w#(DSPUTg<w1N01_l-jB)%);ZX2-rbqvgNxEL5%5|HFU`ZJLDAbF_!<nJ;tF9Gpq zK;#u<7?@Xp_$wfMxcm<YA12T00p%}ZU|z$;z`zRA|DS<*1BegxuVMrP^A<_SojEY~ z9pGYMV1uR~SbAfF`bV*ff%%9Z<PJxWdNALKfq@NbADHjXz`zDgA8`Fp|AOT~=1+jQ zPf3J<`2-gO13T0|N;wS7XSf&`IAHu849piK85lTrK;l>FCIdr<5Ca3p0VF;r0|N&% z{$ciUK;vJTje+@#Hv<C))W2Z9Jp%*B2Z;S(z6<0|ACP~PQy7>(urV-jDnQJKna8Pt zq#h*i0Oh}AVE)0!z`zOhzX~q{^B)i&&HtQG|EuUTurPr17eMr@_%N`5?nC8-#<xm3 z0}G2V0|O`2|0+!kEIhId44fMv?onCAz_3P)fq@em9xBHe7&d_JK!t_}m=C(!^a4aZ z-2FEo_Nj_8u*9e`FmOWsubRrhlE4Ky+7(oOz|7|Ym4{jk3}Evt85p>r<qen*DjU$k zhYK1$F!Moo9)ZFWZa%d9Q0-t~I3dBnz?A`UpXz1?hBHD83|!FiNA)}d!v$Fe2Cf-U z`L_%V4}>B2BZ1tf#>>EP2c&)ln*0kWAEy5Ugs-N`!0-ZePb;)MRfU=dI&KbZUJwJr z6Ga9FZm56Z^3d`T<{oZne8T0S<riEYY9Gvhp!4~`=9e=t{NQF_;DP2RwL=UHe>fQ! zc%b0{=1V~CY67c&!N3SQ#*GJ>9@MoMSW<Kt7<i!Zryk9~lA*=Gz$*cXPnbL}wETd} zL(@Mj{y}Geg5m=#Z^XdB3yps;UyFeObRrm7ej)=)i5UX}A2dCyUtnM<Fl1ohgQi~% zP6n175FgDxeyDq3_VFt~+^6Bhz)~T~z`zeRPh&O%OAQ|b13%0>5MP#ofghS5G>$Q_ zG=StMK;jQ>9yC2@axySRFhc8Q=p84T*$fPttqhEyBRv^77#Ki&t||t`4p2S%0m@&+ zz}N$-M;Rb|n7N>H3c>0@^3Zw|#0S+=H$Z2LX+YG2`JnsK9Uy#AJ#zt6&j~>Inr9do zPJrq~XgI*@F=)LY3#-SV<tUgBs>h(^2$&D5#{wYc!Q2O`XF>4-mIu{~&~yQ>#~2{t zEC;K{py3Lxw?Oq6G@ihGP(20>XIMQ3y1N==KDgfUVPIh105K2DcVJ*(hStMizANPZ z1+aQ(JqEg42+Rl7dm#PLau%!}R8Mh0&4blr(C~rPQ!LPO1743+K-9zKq4m51tR92u zht*?H|H0}p(47!q_pD=J2GwJ%8&JcO73v>wJ>&<uLk^@K%y(j7V1?QT=DRa6u--t^ z56xF#c~CtDZCAkSF{ppw^%#r~tH%r==4pOrVEDlbxqA*|zZN$Giw+wD0|zvIVDZlZ z4G%2~1{MPk$lVrT^&q|t0|N&%J%HsM85lUA^*mfZv>pM=gUpAPBcOW4MV5g9R!?fp zVqmf0L)4R?ddUG)4?)wH)*c2H6HvVdjZaWLWdo9j=5x4usDI(|(DbkMfPuw>mw|!P z0^)ydP?J^@Qg4Ft8<-E0ho)b6Jq$XB8F~i=$WO3(5?pV4Gca&M+Yw+s=x%SQ|G|7v zy}klsA4o3<gX&RG_<`j?^)NKPm0|Vx1xWgX*W(Y+^h47(ydH<PyFmU2)#IRg5@bHe z|DbxD3+jJRc!TP3E@=LTtB2-)xO!+gscpl+A|S}Xz!d;-5120osW-vlmB7I0APT8B z;e15~2CfMZ_iE2$VDt!r)SF;=5Z{e~feRWQV0mu_1}<p+0P~X}cMrnVgY=(3GLMsi zfeV@+bT}CpefSs{xS{1AC~QHPTLPk9Cy0SD!H|K0TLFph!oa`{P5)r~f*2UMq3J<q zE(1f13IhYEo(0(tsz(zf7#O${p!(l1FywGDFmP8u__}-y3^RBc7`UPS)zxNTXpv@M z;GO}M_hMkE;9_9lUI68{GBET=GB9vM{jUp?hx%W483V%<H3kOm9Z>ZkKFB=>pnRBm zXn5#8Vqln{%)r2X0V)sTgW3_$@X?cCVCVq3=LJL_%$J1R7X$Ji%zn^)jUc|BIRit3 z3Zz{C=4UZ5)Tlw)1z<i*J_BkVOdb{<Q2&GOc?78k#RUlSz}yFuhq-S)1H&57J<`zn zQ13Yd;{;Y{9~W|*D}(+G1_u2%42&(H^HT*F5PVi>-xqW?F6jL18w?BvY77jZD|A5T zeS-8E<S;PAa6-=fg!4gXa2i0&0n3BVd$mB~gYGE=ox2S(52PO?AAlqeI<K?<i4QU# zbT&6g{Z<Bs4A6P26QJ^-^a47w6?9Jc4F(2KeO&=+4}i`Vzrnx&N?$dgb7`UZ*-(su z=?m!GQD}Y!^FjS$XnkYo&cMt7Y9Bz$8^cBhW)=`1+Kw{Z%fQS5YA?X_gZN^Q<4{56 z0jRze;ACI`oskaW8@^>=a*$_WV1kyHMp6t+E+Bbm`Cw$rz!U;%UqH(PqjCnO2oN7y zKEmY}K*|TBjSNfyAbDtc50{75cQE~+>%u_x8$D%U0`=3GBOv;X%^8>yK-btn^&59G zFr_FV+5=#|3<JD9V7!HaDMOcmff-tU!t7&)mY-mGka^JXF#gKGR02AC9a^7&`N9kg zEYSMIM23N>0wfQuPr-bUJT&}GoEeyMWDxysFkcAK&o;?mU@8E~L(5YzA0!X;pGhwR zQ;is;-wjHSCMy{jIzavS28jPb@v%gnfq?~DpMv6J1xOxRpMb)53o8Qy3p6}Uo-;7* zU}a!nh5FZ2pMhx)D+2=?j9<>cbU=xLfel*Unu7Q;3=C}0_Jip{2Bssr3=C}0^aC@W z4H{lxc~%Anc4+zlg%_w_#15@bz<gl_26kwA0fpBUSq27nnEz!Mn67~2q3H({UMFN2 z7}%lp379X$z`zb|KY_yQ3`ic@{s8kq^3d=Ah2IS^1_pL${(^-ctlw_>kb&6()DMT| zFEechhAE(<vR^>*qnS4Y!wgWr{Rfl}k{4uP;FN&yL1h&PgZkZ|_%X|5U|697X)l2J zJ0ay2=)PSr|26}|21Q8y58|6MGB9kBXJ7!;w;;Y5RGtf3KEUOn?l;$AVAumvzXM`F zSY91c|AF*_`5^fVQ27uBh8<dv`Uflz)eov~z<j9vpne^Q5Aq8L^FYfl^Iisq10oCz zJQYy$o-r^S;bmapfw>37mtkPwftFVm0t^gyK=Pn6_yz-mg(m~U8$|{N9%%SlWHT^) zk!E1vfrc+k9@MV`*>BOsz$hZZz`zF$UyFMTj1s&I41AzF8bIcKV_-B8WMJTfmcJG- zKD7L`lwe>q0m)}T+-n)kz~~^yz`zGBf5Chi1_nN;e=N%w7+sVZ82F&>x4go@=mFBd z0;>N#1EY^9<o;lg`z&Gn6A*bTQ3l2Uko*TIKbL_qL5hJv80ufEE(XRFc?JeaXna_0 zVqnbRWnhqm`XAIUtYCzU!Gg*+YaIqg9*{gVKY{t23=C4x@(0WpWMGhjmN#HN=sqrJ zc?0H)Ffd3#+qYmoNIx_`T6;mlR|=XR!F<sDU(oyr=7Y?G=07lBo`FFMn*YFjX$A%< zX!!)@gY-kock2QMMg@@l(EJJJgXE$46U+yh4=umIe31Fj{0ioS%!k%jU_MAcw7#&O z#lWZoG9OyrgZUtNX#Wq+KL9Bot+y~Rnt;?p%X=^%q#jz{!THeg&H5YzqYX$sw0;Hi zLF%F99gGjE;=%Ftf`QRRgn>aCS|3=0_yP<J(y;h}@uBfy!^Xhq15yu-4=^939vUBT zKD0cvQDtBZ0jY<^2bd314~-8v9~%BPE)0w@AobAj2lGMdq2UkbL&M)DnSn6{q#hdH zU_MAawEh5<1t2U94PQ`tEntMq6@dJ2vx0%Kg^7Vd8d_i2>}6n_APKpf3@i`g^D=<% zCj;|8GcZn3WMGhnrf(Y%U!H*hG?xI9x7B7~oT13TAOj6gFdrlj4Nu!d2F5vR3=A^R z^bY3pGBC)%!Vl^m8EE*}_AxM?k!E0!frby54^j^eAKRx4j2A%mLBj{k2iXVhzuL(& zFkS)4L&FQq2gyUj%PyRO@de0yX!->6LFPl#r`;t6#y6S_3^LI01M?La7-XRJu{{F= z;|GvDG=19ZF)(hBWMGhih9{U0G7p+Q?Nb;Sw}9LOO`l*s$UV^XX+MX7aR*2q8opq@ zJOhI)G(7DuF)*>nGBAMVLqOpT=JPQy$U@VnBP#<FhZX~atOg|ifcYRfX!tr>F);Cf z<e}vSC~bhSEHu4paxyTfFhb{$klN!`KN%QjAhpNAd{Da<G(HQOzXIKj@PmPYL4|>V z3v{OlXs!q}PX*$G?wtVfLHB;@Ffa&!?;mDhU<BR48ppsO1G?`KbRQDvt|1);23Zgd z;)CY1KzyivCeXb%It&bQz91JfFff7ayUxHM2fFi%0dglb12P|E&vk@*Kx0ZEd6@f{ zLH84Z)I-e&jR`U6Ffho2?wbN#4`9H+0OG^!1I=wP++<)-0NruN0GZnW^FjCZf%qWv zZZa?^f;%J(44}CSkbanXY@j>0klfD(nj^f&z@P-ZvjlviJ~Dp-0|Nty54}$a)XqoY zgYLq*$H2e^bw6lK1!SKR=x!#^l?fpCAlV0M!!SHXgcoS;0K|ud2WV^>q+bm*{|LJ8 z3928)2hU4_?o<HHH$Fv#D<deLLGc8OH)y!YLfyp#x_1o89Zb-8fyEnW&J7eVa6ZUh z<ah&_hs+0s2U5H-gTetR-auoCAb-H(jRlmxkmC*1{{r!0@s`2B0E$Ogyn)8*K>A_v z#)_8iSV8Fy6fe+tV*~jciO&wY`vk-Xxs!o`fgN<O84{lZbSDOKyn)hz4g&)`-azId zg%>zpLGujId<E)$GQ2>FM^N~H_|WhMja7l%4>J!mRt4h2!h;hO9?0ncbobC>M0|3A z^66s+25nHhF+k=-K>A_kae?j#MRFf#>;)tbODEv@X&nXz&|PK>uNW8%K=-tPvMeY) zgZR%u9OxZKpm>DlUq(<oAoD@tf)wwJAajuUpmYdQ5A`>wj|qxLSpEd{F~NLjJcH8- zQvL*&2S|JtkiS6j1dUf#P`X0qgUTZi9~!Tqxk}{x2<n4@_^|v4>T@CU!SVQtfx!%X z*9!v!7s$L<h<F6Gu|eSl%Lm|j{l^IPpf)2Yzrxa~6et}b%R}Q077tP&cOuJ!($!-I z2J2~%@RtJl_b~$lTs<hAKSq>aQlPtoko1GvOd$JV`lUhn{xJiC4YZz+29<9hK1dvN z|0>je8_+#>AU@Q78_*rbAU-JmkkTQj4FNJARvv-x@cfSm9~n@3_>V}ZGAkGu7#We| zcR=`X{UG;)@&z<~$$;!b%159&laURfU)F$u0mO&thlCO~k{L3<f+58WzaI=)iV<`l z6X=c}&{c$>vH&W{1iEJkD$W8blc3^^pu3r%;^49dCJwq+3o6b5$_r3&h9gXH_khz3 zsIEN$S<3*rZwjOgG_MDuL6`}2mkrb$9#9;C1VK2I5i(E+VuR{*5Ut9<zyvDKpz8TS zc^D)P!V*a8L1u!)K=&Gf?k57>$pzvgVWw&Z$b>(ru0{?AP<;+n&kBlTs2(OzK7@*c zuAPDkGcbX|3M$S4D*K=kjG(({q2ipNwgpTaR9{2Ixsd$J1S*GM;_y4`85o#Acl<!b zc|c`7)Ep+z`W>h^=pJvVFvvIXyM+*93=9l+5%B^O2gMH)=)N{+o?$@tFX&!Us5q#9 z3DW~E_n_h|pt=((!34VZ6DrOQ%F9r3M$ny?P;t<D52!E$!z+Y)z-xs->0|-}0~07M zLDh4B>H??+X3#xbP;t=s3se|#vmR6&G|meXXK+AD51>1eKoX#_$%UZC9Eiifzy~Vh zAxs9Q_eknN_b7qHL1UL7zd+6B1LaweILL?tNa{g%ErG;MK?E~oApwYqgqcA1Kts&| zmz7XCCeWS1P;qJGbO^fd5h@NYJE7_sLHDY{#F5p5%5kVTsDA}j&cFm(X9X1p^=shb zp!x(Rj+BoWL3bQN#X<crn0m%DAWuVhp!PY0#lXM_x_cU`9@cgS$uWW2oltR5e*q*0 z!pxvacBnY0Uj-5aVMb8ehKkEV>w1tl`2H?XTOY!KlZ^R7808y3$WN7m3=FV4wLoPB zNC&8HIwy!IPoU)o187}Zmk_)h04W7wUeLW?dZ2+i5Dy81>XL6r=D?&t=H(#S3lj(3 z`|Ai=r~wmz(xAJ??;x22>broXKzDrw3o?MNl>~9&7<9!n8)zU2E&^eI)}&oW5(kx0 zAQ_N&7m_$E96;hAcY@*oqz+VefoPDp9g=#GKcV6v3N)X=0J<v{6kZIFbwLcEJ366! z(D)t-A5@Nj;t(be%0r;M0p)|n=aAKd#^V@})boMrZY1@f@ihj}U8qp~e4uznRu5`J zBB|#D<!g{y=rwhmpgW$C+zVQ#gKR%&oeBycRE{H=53ZMx%m=OOKvoZ0*MaPQ&^itV zB=w+mM&Pstbq{F14_QBGT?;ZFw0;9wJv!eIlwUz%1WI=d3=D>I7#J8pcdf(tpzs0R z1rFnb?uvH?bt1vB$zTX-TY>J+g~@}$2Nb?A{u2fUuzO&9P#+Ey|Il@wMxb;C3Lh9B zbXOwiK5!Txlzu?|hw(w}Z)845FEStG7Gyr?&TC{oC_X{$HmG|*?R#*+595Q}4yu%4 ze9--opm{bJA5_MI(gTbSsymVSIiSi15k3r{MKqv0{b1@r;SDOAV0=(|M&`rnESNkf ze39ir^%ycA)D}eMgX$F|KFDdv{$m8?Uu1bu_#*Q`=@pp|N*l<0P<SHqLG2D?KByi? z=7ZYC$b2;aGotw)-X?(hpApUfjA;I6MDsr*n*TvoBl{oR<^u^r%?HgNqR6B9p9#(X zOlbaRLi0a(3;@}DH2*W9`5&}S7sY<G_y>;-A)ANhe<n2lGokq(oNbWwGo!^nGg|yJ zqxqj1&Hv13{%1z>KQmhVGo$&R8O{Ho^-{?G2aj<eyB96~LGz&~>e2kqjOKrEG$WbE zg64k~H2;Iv9V461g64k~H2;I!p~&W=`JV;N|14<!2lvg9^`pf<3!48~(Bhv3&HpTD z{s%V)kj!UA^FJ$^|5?%EpB2sjtZ4pcMT>t{H2;Ivk0FOAE1LgV(egiNeHn^+H2;I< zhf(Cw{LhN!e{i=3$^UF<{%1q;KX~i|Sv{Kn+0gvYhUR}ZH2;Ig(2&hT^FJG!|Jl&u zpAF6b;ISBF^U(Ycn*T-)AMn^Kl6vqM9x@-z|DgGB6#Z!a2hDe*$fNn69nJsjXz3r^ z-$J$@&HwCZ{%1$?KRc*>fmA=UgT_>m`JlEx5}yOqzCh-K+NsEVP<tMk4{A>!^Fd=z z$b3-$8<`JkPayL_?NwwxsQ-=32lca%`Jna{G9NT{hRg@GN0Iqx{s*nY2e<LT1swwe z2b%vm(fkiuAAqbLv<@GIkLG{ySUQsZ;PD4!KAQhI(fkh{vqe^q=6}$-d=&f9{0|<} zMb?kze@?Xc=S1^AXx%-s`CMr64{pCBnGae|h@u`X{<+ZNAGGcsMLnATxzOStv<@Fd zJzD&O$4-&mgBJgw^@1q+(frSa=6}#Sd}Q_DF>NICxzW-;xIcj`kLG{SdO{TQ(BdDo zo)ASI&HteF9Vqf>{s*lWM3G1HKQ~(ZbEEm68_oaV{uq*fc+ldX2hIOHXz3rc{sh@Q zJZSOHgXVwGdK47(X#VFxOaDA*{^vnU|2$~^2lwxg{e$Lz@VFk5JZSs@**&0r4k&yy z|MQ~xpBF9udC~k2+9!cx9$Nb6Me{!|n*Vvx{LhQ#e_k~I^P<H+XdecO{b=#ehgSZ9 z*6$#z=R@;9X#Ea~JevRc(EJY`_d^PA@c05UAI<-KX#NL}KOn0|^FJS&|M}4T&xaQO zd}#jXNAo{uUkS4R_(APGr2Z{GsJ=($gZvBXL_+Hqeo%Tx=7ZuJnGf<WG9Tn$WIiaq zk@+D1BJ)B1MdpM2i_8c47nu+8FA`q><X>byD8D1~LGg{u2c>spJ}ADC`Dp$ZK=Z!< zn*RmR{4ap!e*rZA3!wR50L}jbX#N*K^S=O^{{_+fFNo%UK{WphqWNDC&HsXE{ue~^ zzaX0b1=0L3h~|GmH2({t`Ckyt|AJ`#7ew>FAe#S$(EKli=6@kH{|lk{UkJ_rLTLUM zLi4{6n*W8+{4a#&e<3vg3!(X62+jXOX#N*M^S=<9|Ao=~FO24YVKn~>qxoML&Hut^ z{uf5`zc8Brh0**kjOKq~H2({u`Ck~#|H5eg7e@2HFq;2G(EKlg=6?}1|BImcUj)tn zB53{>LG!-|n*T-6{4av$e-SkQi=g>m1kL{<X#N*L^S=n1|3%UKFN)@WQ8fRHqWNDG z&Htik{uf2_zbKmjMbZ2(ispY&H2;gD`Ck;x|DtIA7e({GD4PGp(EKlk=6^9X|BIpd zUkuIvVrc#sL-W5Fn*YVn{4a*)e=#)wi=p{n49)*yX#N*N^S>CH|HaY#FOKGaaWwyn zqxoMP&Hv(P{uf8{zc`xz#nJpPj^=-HH2;gE`ClB(|Ke!=7f18IIGX<@(EKlf=6?w^ z|4X3xUjohl5@`OHK=Z!@n*Sxx{4as#e+e}IOQ88*0?q#tX#ST#^S=a||0U7<FNx-V zNi_dUqWNDE&Hs{U{+C4aza*OfCDHsZiROPvH2+JY`Ck&v|B`6_2d^JMYM)7>`Ckgn z|59lF2hW!y>6b$DzZ9DPLF>uE^JmcZuN0d9rO^B@h30=LH2+JX`5$y%3Io#okQ8Wq z7n%PCI#&*}A2ff4G=3%xn$Je&gBBYh^Fi}v$b8WJ7BU|+zlF>P&2J&|LGxM2e9(Lr zGQS7aebS)$LuC0iX!3i|_^`DAQ2$AT&W=IWkLG`AH2=$>`CkUj|1xO)mqGKt44VIC z(EKlh=6@M9|I48HUk1(pGHCvnLG!;1Xblxo|4#-qUy98C0$Q+&m`{`ig%gszENH$I znXiJT-UN*gnjb}04_aG+%m>Y9BJ)9OK9Kn>Xy#2p<Ac^1BdZ6^7bEkJps7dmzbu;n zWzqaEhvt7dH2=$?`Cksr|8i*lmqYWv9Gd^-(EKll=6^Xf|I4BIUk=Uxa%ldSL-W5J zn*ZfM=^d%Ok_V-CWIiapBlAJ&9hnbG@5p>mdPnAi(mOIAl-`l~p!AN+2c>spJ}A8- z^FiqynGZ_u$b3+KN9Kd_J2D@X-;w!f{#QWrzXF>770~>zfaZS%H2*80`CkFe{|adS zS3vW>0-FC7(EP7}=6?k=|0|&RUjfbk3TXaUMDxEQn*SBi{I7`Se?>I^E28;d5zYUK zX#Q73^S>gR{}ti>w{>uIak6)Fw&UhiR#j)vD@x7L10RzQW;unp>4DD7FG(&S|Fkv8 znXE7);D@jw9{|e$KkgTL*%b8HH_#zy&?An)PAf@{hu&)d<3dkBMLMGmelR7}4A|+w zD95{@oW}`2$WAXOrz{tIX>xI9I>ZLh1q-+?!GSsj`Ak-bbC5;g$KZhi6dV)~<BGGB z^t027Qd7Z~b?X(E6qO_<G3XUn=7MSHL31EYdQKs33_eayhVhml$~fK-Oq<19K)7Ja z5XLhH2^z$MDYJM(Fl_*$Gr?CQf@IC&%|MhXgff6oX7Pq#QDZ1=2&E06v|+p{NRt7C zGL1I`a}A-i0f;UIA6#hyQf3+trVJsJS-c^bYYL?eK{Q0QF-WypJeV?sP{#2_u;c%X zK(eOsV9FRyfw^Y!hG5zlN*jP^@L7DAC-_0EG6WfB9B&Aw4M8+k<*)+^4M57x;tj#H zF^Gn&rJ|H%tb{Dt#b(Yw@I*KR12bqp6S4wOSqtNX77M`mQ1vh=2GF=LXs;)zeGC@_ zZN@?3fb@blaWF8z)Wc+Nf!gID4rqQCbS?m>jR)ex#6jyDL37C<GeF{K_RE6W)u46e zp!PFJ9)@B1LCdZ{Wf?B}LH!Jn9?<+d$bL{e0>p>u2iXr=8;-+%UC=l=sObVz57G<5 zNPI?6I|qmTw_)K1G6!To%zrTbpmhnLxo{lzTY>s1Ap1b`^&lFCVfsOQP+5%2eo#LJ zqy}UU$bOhU7!49%4+=z(BE))jD38Gk)DHx4@Y%l_w4f8D2s8d~L*oy;{u5+Bbp0ZD zJt9a8DEvE-?1!ZfkQ@U8gB8sEyPyIv3Kowbt)R9XEd0O=pJ0j@7_5z;Y$Wwy5tw=q zXD3p6M%NDue^CD!q!xx@;RoV_)~CbF!=)c)4oE!+Bk5<H3i1R<5EEO2)>SYtFq9>t z$szfNaU!1Z2lYc?#)HBi6yG4DVD^Lfpta60_k-k+@J3KOm4Sgl5!9YR5{K=>01JUO z+TlolccAtwg7P@Xej%_9#Qp-1{r~g-`+&m@v}gn>52gNs`uQL>Y`rmv4Z=w7Wo(4@ aEkWXF_%bNpgOW8U9f9<~_I1GgF987UZa`ZA diff --git a/pkg/ebpf/bpf_bpfel.go b/pkg/ebpf/bpf_bpfel.go index 4aa8bfd8c..32e900b5b 100644 --- a/pkg/ebpf/bpf_bpfel.go +++ b/pkg/ebpf/bpf_bpfel.go @@ -48,6 +48,7 @@ type BpfFlowMetricsT struct { Errno uint8 TcpDrops BpfTcpDropsT DnsRecord BpfDnsRecordT + FlowRtt uint64 } type BpfFlowRecordT struct { @@ -55,6 +56,14 @@ type BpfFlowRecordT struct { Metrics BpfFlowMetrics } +type BpfFlowSeqId struct { + SrcPort uint16 + DstPort uint16 + SrcIp [16]uint8 + DstIp [16]uint8 + SeqId uint32 +} + type BpfTcpDropsT struct { Packets uint32 Bytes uint64 @@ -116,6 +125,7 @@ type BpfProgramSpecs struct { type BpfMapSpecs struct { AggregatedFlows *ebpf.MapSpec `ebpf:"aggregated_flows"` DirectFlows *ebpf.MapSpec `ebpf:"direct_flows"` + FlowSequences *ebpf.MapSpec `ebpf:"flow_sequences"` } // BpfObjects contains all objects after they have been loaded into the kernel. @@ -139,12 +149,14 @@ func (o *BpfObjects) Close() error { type BpfMaps struct { AggregatedFlows *ebpf.Map `ebpf:"aggregated_flows"` DirectFlows *ebpf.Map `ebpf:"direct_flows"` + FlowSequences *ebpf.Map `ebpf:"flow_sequences"` } func (m *BpfMaps) Close() error { return _BpfClose( m.AggregatedFlows, m.DirectFlows, + m.FlowSequences, ) } @@ -177,6 +189,5 @@ func _BpfClose(closers ...io.Closer) error { } // Do not access this directly. -// //go:embed bpf_bpfel.o var _BpfBytes []byte diff --git a/pkg/ebpf/bpf_bpfel.o b/pkg/ebpf/bpf_bpfel.o index df2199eef85efc66c71fe22bac3642b760bfa572..4e3eb08e6013c0cb8dee3457fb206dfb289988a3 100644 GIT binary patch literal 74160 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%0Aexqtl#J*Cft5nL5FmAkE<|Zc0oMKl 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 literal 67888 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 U2otuB2&B&(8rL8h=x`7N0D<kP;s5{u diff --git a/pkg/ebpf/tracer.go b/pkg/ebpf/tracer.go index 29eba8bf1..c59cab711 100644 --- a/pkg/ebpf/tracer.go +++ b/pkg/ebpf/tracer.go @@ -22,10 +22,13 @@ import ( const ( qdiscType = "clsact" + // ebpf map names as defined in flows.c + aggregatedFlowsMap = "aggregated_flows" + flowSequencesMap = "flow_sequences" // constants defined in flows.c as "volatile const" constSampling = "sampling" constTraceMessages = "trace_messages" - aggregatedFlowsMap = "aggregated_flows" + constEnableRtt = "enable_rtt" ) var log = logrus.WithField("component", "ebpf.FlowFetcher") @@ -47,11 +50,18 @@ type FlowFetcher struct { dnsTrackerTracePoint link.Link } -func NewFlowFetcher( - traceMessages bool, - sampling, cacheMaxSize int, - ingress, egress, tcpDrops, dnsTracker bool, -) (*FlowFetcher, error) { +type FlowFetcherConfig struct { + EnableIngress bool + EnableEgress bool + Debug bool + Sampling int + CacheMaxSize int + TCPDrops bool + DNSTracker bool + EnableRTT bool +} + +func NewFlowFetcher(cfg *FlowFetcherConfig) (*FlowFetcher, error) { if err := rlimit.RemoveMemlock(); err != nil { log.WithError(err). Warn("can't remove mem lock. The agent could not be able to start eBPF programs") @@ -63,16 +73,34 @@ func NewFlowFetcher( return nil, fmt.Errorf("loading BPF data: %w", err) } - // Resize aggregated flows map according to user-provided configuration - spec.Maps[aggregatedFlowsMap].MaxEntries = uint32(cacheMaxSize) + // Resize maps according to user-provided configuration + spec.Maps[aggregatedFlowsMap].MaxEntries = uint32(cfg.CacheMaxSize) + spec.Maps[flowSequencesMap].MaxEntries = uint32(cfg.CacheMaxSize) traceMsgs := 0 - if traceMessages { + if cfg.Debug { traceMsgs = 1 } + + enableRtt := 0 + if cfg.EnableRTT { + if !(cfg.EnableEgress && cfg.EnableIngress) { + log.Warnf("ENABLE_RTT is set to true. But both Ingress AND Egress are not enabled. Disabling ENABLE_RTT") + enableRtt = 0 + } else { + enableRtt = 1 + } + } + + if enableRtt == 0 { + // Cannot set the size of map to be 0 so set it to 1. + spec.Maps[flowSequencesMap].MaxEntries = uint32(1) + } + if err := spec.RewriteConstants(map[string]interface{}{ - constSampling: uint32(sampling), + constSampling: uint32(cfg.Sampling), constTraceMessages: uint8(traceMsgs), + constEnableRtt: uint8(enableRtt), }); err != nil { return nil, fmt.Errorf("rewriting BPF constants definition: %w", err) } @@ -86,6 +114,7 @@ func NewFlowFetcher( } return nil, fmt.Errorf("loading and assigning BPF objects: %w", err) } + /* * since we load the program only when the we start we need to release * memory used by cached kernel BTF see https://github.com/cilium/ebpf/issues/1063 @@ -94,7 +123,7 @@ func NewFlowFetcher( btf.FlushKernelSpec() var tcpDropsLink link.Link - if tcpDrops { + if cfg.TCPDrops { tcpDropsLink, err = link.Tracepoint("skb", "kfree_skb", objects.KfreeSkb, nil) if err != nil { return nil, fmt.Errorf("failed to attach the BPF program to kfree_skb tracepoint: %w", err) @@ -102,7 +131,7 @@ func NewFlowFetcher( } var dnsTrackerLink link.Link - if dnsTracker { + if cfg.DNSTracker { dnsTrackerLink, err = link.Tracepoint("net", "net_dev_queue", objects.TraceNetPackets, nil) if err != nil { return nil, fmt.Errorf("failed to attach the BPF program to trace_net_packets: %w", err) @@ -120,9 +149,9 @@ func NewFlowFetcher( egressFilters: map[ifaces.Interface]*netlink.BpfFilter{}, ingressFilters: map[ifaces.Interface]*netlink.BpfFilter{}, qdiscs: map[ifaces.Interface]*netlink.GenericQdisc{}, - cacheMaxSize: cacheMaxSize, - enableIngress: ingress, - enableEgress: egress, + cacheMaxSize: cfg.CacheMaxSize, + enableIngress: cfg.EnableIngress, + enableEgress: cfg.EnableEgress, tcpDropsTracePoint: tcpDropsLink, dnsTrackerTracePoint: dnsTrackerLink, }, nil diff --git a/pkg/exporter/proto.go b/pkg/exporter/proto.go index df460b1ba..1fa61db04 100644 --- a/pkg/exporter/proto.go +++ b/pkg/exporter/proto.go @@ -6,6 +6,7 @@ import ( "github.com/netobserv/netobserv-ebpf-agent/pkg/flow" "github.com/netobserv/netobserv-ebpf-agent/pkg/pbflow" + "google.golang.org/protobuf/types/known/durationpb" "google.golang.org/protobuf/types/known/timestamppb" ) @@ -77,6 +78,7 @@ func v4FlowToPB(fr *flow.Record) *pbflow.Record { TcpDropLatestDropCause: fr.Metrics.TcpDrops.LatestDropCause, DnsId: uint32(fr.Metrics.DnsRecord.Id), DnsFlags: uint32(fr.Metrics.DnsRecord.Flags), + TimeFlowRtt: durationpb.New(fr.TimeFlowRtt), } if fr.Metrics.DnsRecord.ReqMonoTimeTs != 0 { pbflowRecord.TimeDnsReq = ×tamppb.Timestamp{ @@ -133,6 +135,7 @@ func v6FlowToPB(fr *flow.Record) *pbflow.Record { TcpDropLatestDropCause: fr.Metrics.TcpDrops.LatestDropCause, DnsId: uint32(fr.Metrics.DnsRecord.Id), DnsFlags: uint32(fr.Metrics.DnsRecord.Flags), + TimeFlowRtt: durationpb.New(fr.TimeFlowRtt), } if fr.Metrics.DnsRecord.ReqMonoTimeTs != 0 { pbflowRecord.TimeDnsReq = ×tamppb.Timestamp{ diff --git a/pkg/flow/record.go b/pkg/flow/record.go index d8313b1cd..ef9ea23f9 100644 --- a/pkg/flow/record.go +++ b/pkg/flow/record.go @@ -52,6 +52,8 @@ type Record struct { // AgentIP provides information about the source of the flow (the Agent that traced it) AgentIP net.IP + // Calculated RTT which is set when record is created by calling NewRecord + TimeFlowRtt time.Duration } func NewRecord( @@ -62,7 +64,7 @@ func NewRecord( ) *Record { startDelta := time.Duration(monotonicCurrentTime - metrics.StartMonoTimeTs) endDelta := time.Duration(monotonicCurrentTime - metrics.EndMonoTimeTs) - var reqDNS, rspDNS time.Duration + var record = Record{ RawRecord: RawRecord{ Id: key, @@ -71,12 +73,16 @@ func NewRecord( TimeFlowStart: currentTime.Add(-startDelta), TimeFlowEnd: currentTime.Add(-endDelta), } + if metrics.FlowRtt != 0 { + rttDelta := time.Duration(metrics.FlowRtt) + record.TimeFlowRtt = rttDelta + } if metrics.DnsRecord.ReqMonoTimeTs != 0 { - reqDNS = time.Duration(monotonicCurrentTime - metrics.DnsRecord.ReqMonoTimeTs) + reqDNS := time.Duration(monotonicCurrentTime - metrics.DnsRecord.ReqMonoTimeTs) record.TimeDNSRequest = currentTime.Add(-reqDNS) } if metrics.DnsRecord.RspMonoTimeTs != 0 { - rspDNS = time.Duration(monotonicCurrentTime - metrics.DnsRecord.RspMonoTimeTs) + rspDNS := time.Duration(monotonicCurrentTime - metrics.DnsRecord.RspMonoTimeTs) record.TimeDNSResponse = currentTime.Add(-rspDNS) } return &record diff --git a/pkg/flow/record_test.go b/pkg/flow/record_test.go index fc6b0abed..772f4c715 100644 --- a/pkg/flow/record_test.go +++ b/pkg/flow/record_test.go @@ -43,6 +43,8 @@ func TestRecordBinaryEncoding(t *testing.T) { 0x80, 00, // flags 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, // req ts 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, // rsp ts + // u64 flow_rtt + 0xad, 0xde, 0xef, 0xbe, 0xef, 0xbe, 0xad, 0xde, })) require.NoError(t, err) @@ -81,6 +83,7 @@ func TestRecordBinaryEncoding(t *testing.T) { ReqMonoTimeTs: 0x1817161514131211, RspMonoTimeTs: 0x2827262524232221, }, + FlowRtt: 0xdeadbeefbeefdead, }, }, *fr) // assert that IP addresses are interpreted as IPv4 addresses diff --git a/pkg/pbflow/flow.pb.go b/pkg/pbflow/flow.pb.go index 60076f902..c14ac8d33 100644 --- a/pkg/pbflow/flow.pb.go +++ b/pkg/pbflow/flow.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.25.0-devel -// protoc v3.14.0 +// protoc-gen-go v1.30.0 +// protoc v3.19.4 // source: proto/flow.proto package pbflow @@ -9,6 +9,7 @@ package pbflow import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" @@ -190,6 +191,7 @@ type Record struct { DnsFlags uint32 `protobuf:"varint,22,opt,name=dns_flags,json=dnsFlags,proto3" json:"dns_flags,omitempty"` TimeDnsReq *timestamppb.Timestamp `protobuf:"bytes,23,opt,name=time_dns_req,json=timeDnsReq,proto3" json:"time_dns_req,omitempty"` TimeDnsRsp *timestamppb.Timestamp `protobuf:"bytes,24,opt,name=time_dns_rsp,json=timeDnsRsp,proto3" json:"time_dns_rsp,omitempty"` + TimeFlowRtt *durationpb.Duration `protobuf:"bytes,25,opt,name=time_flow_rtt,json=timeFlowRtt,proto3" json:"time_flow_rtt,omitempty"` } func (x *Record) Reset() { @@ -392,6 +394,13 @@ func (x *Record) GetTimeDnsRsp() *timestamppb.Timestamp { return nil } +func (x *Record) GetTimeFlowRtt() *durationpb.Duration { + if x != nil { + return x.TimeFlowRtt + } + return nil +} + type DataLink struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -653,12 +662,14 @@ var file_proto_flow_proto_rawDesc = []byte{ 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x10, 0x0a, 0x0e, 0x43, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x10, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x33, 0x0a, 0x07, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x28, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x22, 0xf0, 0x07, 0x0a, 0x06, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x21, 0x0a, + 0x65, 0x73, 0x22, 0xaf, 0x08, 0x0a, 0x06, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x2f, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, @@ -721,34 +732,38 @@ var file_proto_flow_proto_rawDesc = []byte{ 0x64, 0x6e, 0x73, 0x5f, 0x72, 0x73, 0x70, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x44, - 0x6e, 0x73, 0x52, 0x73, 0x70, 0x22, 0x3c, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x4c, 0x69, 0x6e, - 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x72, 0x63, 0x5f, 0x6d, 0x61, 0x63, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x06, 0x73, 0x72, 0x63, 0x4d, 0x61, 0x63, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x73, - 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x64, 0x73, 0x74, - 0x4d, 0x61, 0x63, 0x22, 0x57, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x25, - 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0a, 0x2e, 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x49, 0x50, 0x52, 0x07, 0x73, 0x72, - 0x63, 0x41, 0x64, 0x64, 0x72, 0x12, 0x25, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, - 0x2e, 0x49, 0x50, 0x52, 0x07, 0x64, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x22, 0x3d, 0x0a, 0x02, - 0x49, 0x50, 0x12, 0x14, 0x0a, 0x04, 0x69, 0x70, 0x76, 0x34, 0x18, 0x01, 0x20, 0x01, 0x28, 0x07, - 0x48, 0x00, 0x52, 0x04, 0x69, 0x70, 0x76, 0x34, 0x12, 0x14, 0x0a, 0x04, 0x69, 0x70, 0x76, 0x36, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x04, 0x69, 0x70, 0x76, 0x36, 0x42, 0x0b, - 0x0a, 0x09, 0x69, 0x70, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x22, 0x5d, 0x0a, 0x09, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, - 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x73, 0x72, 0x63, 0x50, - 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x64, 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2a, 0x24, 0x0a, 0x09, 0x44, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x45, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x01, - 0x32, 0x3e, 0x0a, 0x09, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x31, 0x0a, - 0x04, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x52, - 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x1a, 0x16, 0x2e, 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x42, 0x0a, 0x5a, 0x08, 0x2e, 0x2f, 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x73, 0x52, 0x73, 0x70, 0x12, 0x3d, 0x0a, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x6c, + 0x6f, 0x77, 0x5f, 0x72, 0x74, 0x74, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, + 0x77, 0x52, 0x74, 0x74, 0x22, 0x3c, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x4c, 0x69, 0x6e, 0x6b, + 0x12, 0x17, 0x0a, 0x07, 0x73, 0x72, 0x63, 0x5f, 0x6d, 0x61, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x06, 0x73, 0x72, 0x63, 0x4d, 0x61, 0x63, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x73, 0x74, + 0x5f, 0x6d, 0x61, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x64, 0x73, 0x74, 0x4d, + 0x61, 0x63, 0x22, 0x57, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x25, 0x0a, + 0x08, 0x73, 0x72, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0a, 0x2e, 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x49, 0x50, 0x52, 0x07, 0x73, 0x72, 0x63, + 0x41, 0x64, 0x64, 0x72, 0x12, 0x25, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x2e, + 0x49, 0x50, 0x52, 0x07, 0x64, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x22, 0x3d, 0x0a, 0x02, 0x49, + 0x50, 0x12, 0x14, 0x0a, 0x04, 0x69, 0x70, 0x76, 0x34, 0x18, 0x01, 0x20, 0x01, 0x28, 0x07, 0x48, + 0x00, 0x52, 0x04, 0x69, 0x70, 0x76, 0x34, 0x12, 0x14, 0x0a, 0x04, 0x69, 0x70, 0x76, 0x36, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x04, 0x69, 0x70, 0x76, 0x36, 0x42, 0x0b, 0x0a, + 0x09, 0x69, 0x70, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x22, 0x5d, 0x0a, 0x09, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x70, + 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x73, 0x72, 0x63, 0x50, 0x6f, + 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x64, 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2a, 0x24, 0x0a, 0x09, 0x44, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x47, 0x52, 0x45, 0x53, + 0x53, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x45, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x01, 0x32, + 0x3e, 0x0a, 0x09, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x31, 0x0a, 0x04, + 0x53, 0x65, 0x6e, 0x64, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x52, 0x65, + 0x63, 0x6f, 0x72, 0x64, 0x73, 0x1a, 0x16, 0x2e, 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, + 0x0a, 0x5a, 0x08, 0x2e, 0x2f, 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -775,6 +790,7 @@ var file_proto_flow_proto_goTypes = []interface{}{ (*IP)(nil), // 6: pbflow.IP (*Transport)(nil), // 7: pbflow.Transport (*timestamppb.Timestamp)(nil), // 8: google.protobuf.Timestamp + (*durationpb.Duration)(nil), // 9: google.protobuf.Duration } var file_proto_flow_proto_depIdxs = []int32{ 3, // 0: pbflow.Records.entries:type_name -> pbflow.Record @@ -787,15 +803,16 @@ var file_proto_flow_proto_depIdxs = []int32{ 6, // 7: pbflow.Record.agent_ip:type_name -> pbflow.IP 8, // 8: pbflow.Record.time_dns_req:type_name -> google.protobuf.Timestamp 8, // 9: pbflow.Record.time_dns_rsp:type_name -> google.protobuf.Timestamp - 6, // 10: pbflow.Network.src_addr:type_name -> pbflow.IP - 6, // 11: pbflow.Network.dst_addr:type_name -> pbflow.IP - 2, // 12: pbflow.Collector.Send:input_type -> pbflow.Records - 1, // 13: pbflow.Collector.Send:output_type -> pbflow.CollectorReply - 13, // [13:14] is the sub-list for method output_type - 12, // [12:13] is the sub-list for method input_type - 12, // [12:12] is the sub-list for extension type_name - 12, // [12:12] is the sub-list for extension extendee - 0, // [0:12] is the sub-list for field type_name + 9, // 10: pbflow.Record.time_flow_rtt:type_name -> google.protobuf.Duration + 6, // 11: pbflow.Network.src_addr:type_name -> pbflow.IP + 6, // 12: pbflow.Network.dst_addr:type_name -> pbflow.IP + 2, // 13: pbflow.Collector.Send:input_type -> pbflow.Records + 1, // 14: pbflow.Collector.Send:output_type -> pbflow.CollectorReply + 14, // [14:15] is the sub-list for method output_type + 13, // [13:14] is the sub-list for method input_type + 13, // [13:13] is the sub-list for extension type_name + 13, // [13:13] is the sub-list for extension extendee + 0, // [0:13] is the sub-list for field type_name } func init() { file_proto_flow_proto_init() } diff --git a/pkg/pbflow/flow_grpc.pb.go b/pkg/pbflow/flow_grpc.pb.go index 6b2e9616c..fccb88095 100644 --- a/pkg/pbflow/flow_grpc.pb.go +++ b/pkg/pbflow/flow_grpc.pb.go @@ -1,4 +1,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v3.19.4 +// source: proto/flow.proto package pbflow @@ -14,6 +18,10 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 +const ( + Collector_Send_FullMethodName = "/pbflow.Collector/Send" +) + // CollectorClient is the client API for Collector service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. @@ -31,7 +39,7 @@ func NewCollectorClient(cc grpc.ClientConnInterface) CollectorClient { func (c *collectorClient) Send(ctx context.Context, in *Records, opts ...grpc.CallOption) (*CollectorReply, error) { out := new(CollectorReply) - err := c.cc.Invoke(ctx, "/pbflow.Collector/Send", in, out, opts...) + err := c.cc.Invoke(ctx, Collector_Send_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -76,7 +84,7 @@ func _Collector_Send_Handler(srv interface{}, ctx context.Context, dec func(inte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/pbflow.Collector/Send", + FullMethod: Collector_Send_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(CollectorServer).Send(ctx, req.(*Records)) diff --git a/proto/flow.proto b/proto/flow.proto index fb854059f..1b15f0f69 100644 --- a/proto/flow.proto +++ b/proto/flow.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package pbflow; import 'google/protobuf/timestamp.proto'; +import 'google/protobuf/duration.proto'; option go_package = "./pbflow"; @@ -52,6 +53,7 @@ message Record { uint32 dns_flags = 22; google.protobuf.Timestamp time_dns_req = 23; google.protobuf.Timestamp time_dns_rsp = 24; + google.protobuf.Duration time_flow_rtt = 25; } message DataLink { -- GitLab