From c23d5fc819944eeb9ddaf535c481e233df39d610 Mon Sep 17 00:00:00 2001 From: Jack Date: Fri, 14 Aug 2026 10:38:38 +0800 Subject: [PATCH] fix(parser): support .msg parsing and make email attachments retrievable (#18198) - Add Go `EmailParser` support for Outlook `.msg` (OLE2/CFB) files via the `gomsg` library, in addition to the existing `.eml` (RFC 5322) support. The `.msg` hard-error is gone; emails with `.msg` attachments are now ingested end-to-end. - Re-chunk email attachments into retrievable text (user-oriented). Each attachment is re-parsed by its file extension through the shared parser registry and folded back into the same document, so attachment content becomes searchable. This mirrors Python's legacy `rag/app/email.py`. Binary attachments (images/audio/video/folders) are skipped by design. - Restore a corrupted `sample.msg` test fixture and add guards so binary fixtures are never mangled again (`.gitattributes` marks `*.msg` binary; `check_files.py` skips NUL-byte files). Also made `check_files.py` ruff-clean. --- .gitattributes | 7 + go.mod | 3 + go.sum | 2 + internal/parser/parser/email_parser.go | 426 ++++++++++++- internal/parser/parser/email_parser_test.go | 628 +++++++++++++++++++- internal/parser/parser/testdata/sample.msg | Bin 0 -> 143360 bytes test/test_check_files.py | 92 +++ tools/hooks/check_files.py | 44 +- 8 files changed, 1157 insertions(+), 45 deletions(-) create mode 100644 internal/parser/parser/testdata/sample.msg create mode 100644 test/test_check_files.py mode change 100644 => 100755 tools/hooks/check_files.py diff --git a/.gitattributes b/.gitattributes index 199ea9a55b..74d8a60212 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,9 @@ *.sh text eol=lf docker/entrypoint.sh text eol=lf executable + +# Binary fixtures must be stored byte-for-byte. Mark them binary so git +# never applies text/CRLF normalization, and so the pre-commit text fixers +# (see tools/hooks/check_files.py) skip them. OLE2 .msg files in particular +# were previously corrupted by the mixed-line-ending / end-of-file fixers. +*.msg binary + diff --git a/go.mod b/go.mod index d460ccd1e3..81a245e863 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.26.4 require ( cloud.google.com/go/storage v1.63.0 + github.com/AkmalOt/gomsg v0.0.0-20260407083308-985c3a1a76b7 github.com/DATA-DOG/go-sqlmock v1.5.2 github.com/LuxorLabs/tenki-sdk-go/sandbox v0.7.0 github.com/alibabacloud-go/agentrun-20250910/v5 v5.8.4 @@ -232,3 +233,5 @@ require ( ) replace github.com/infiniflow/infinity-go-sdk => github.com/infiniflow/infinity/go v0.0.0-20260806040857-d755c5ad25d9 + +replace github.com/AkmalOt/gomsg => github.com/xugangqiang/gomsg v0.0.0-20260407083308-985c3a1a76b7 diff --git a/go.sum b/go.sum index 25e50f4434..10b93787e2 100644 --- a/go.sum +++ b/go.sum @@ -526,6 +526,8 @@ github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/ github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= +github.com/xugangqiang/gomsg v0.0.0-20260407083308-985c3a1a76b7 h1:iX9RUmlLw+Hoe78WV5vlm+JjIZUCzdRn2y6tWNxZTeY= +github.com/xugangqiang/gomsg v0.0.0-20260407083308-985c3a1a76b7/go.mod h1:TCjWm+lo7de/zYHb8rHfVSaKxOP4tZNrnRUzkqV4r28= github.com/xuri/efp v0.0.1 h1:fws5Rv3myXyYni8uwj2qKjVaRP30PdjeYe2Y6FDsCL8= github.com/xuri/efp v0.0.1/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI= github.com/xuri/excelize/v2 v2.11.0 h1:HxaEFl6sRN2+8J5a8HaKq+0M4FsjBGMnWWtjOCPSG88= diff --git a/internal/parser/parser/email_parser.go b/internal/parser/parser/email_parser.go index 3fe86f5cf7..14bede0c39 100644 --- a/internal/parser/parser/email_parser.go +++ b/internal/parser/parser/email_parser.go @@ -22,24 +22,26 @@ import ( "encoding/base64" "fmt" "io" + "log" "mime" "mime/multipart" "mime/quotedprintable" "net/mail" "path/filepath" "strings" + "time" + "github.com/AkmalOt/gomsg" "golang.org/x/text/encoding" "golang.org/x/text/encoding/simplifiedchinese" "golang.org/x/text/transform" + + "ragflow/internal/utility" ) -// EmailParser parses .eml (RFC 5322 email) files into structured -// JSON or plain-text output. Mirrors Python's _email() method in -// rag/flow/parser/parser.py. -// -// .msg (Outlook) files are not supported in the Go path; callers -// receive a clear error. +// EmailParser parses .eml (RFC 5322 email) and .msg (Outlook OLE2) files +// into structured JSON or plain-text output. Mirrors Python's _email() +// method in rag/flow/parser/parser.py, whose .msg branch uses extract_msg. type EmailParser struct { fields []string outputFormat string @@ -75,32 +77,78 @@ func (p *EmailParser) ConfigureFromSetup(setup map[string]any) { } func (p *EmailParser) ParseWithResult(ctx context.Context, filename string, data []byte) ParseResult { - ext := strings.ToLower(filepath.Ext(filename)) - if ext == ".msg" { - return ParseResult{ - Err: fmt.Errorf("email: .msg (Outlook) files are not supported in the Go parser; use .eml format"), - } - } + return p.parseEmail(ctx, filename, data, 0) +} - emailContent := parseEML(bytes.NewReader(data), p.fields) +// parseEmail is ParseWithResult with a re-chunk depth so nested email +// attachments are parsed (and their body made retrievable) without unbounded +// recursion into attachments-of-attachments. +func (p *EmailParser) parseEmail(ctx context.Context, filename string, data []byte, depth int) ParseResult { + ext := strings.ToLower(filepath.Ext(filename)) + + var content map[string]any + if ext == ".msg" { + var ( + msg map[string]any + err error + ) + // gomsg.Decode parses untrusted OLE2/CFB input; guard against a + // panic from a malformed .msg so one bad email can't take down the + // ingestion worker. + func() { + defer func() { + if r := recover(); r != nil { + // Log so a genuine bug (e.g. a nil deref in parseMSG) + // is not silently masked as a "decode panicked" error. + log.Printf("email: .msg decode panicked for %q; skipping: %v", filename, r) + err = fmt.Errorf("email: .msg decode panicked: %v", r) + } + }() + msg, err = parseMSG(data, p.fields) + }() + if err != nil { + return ParseResult{Err: fmt.Errorf("email: .msg: %w", err)} + } + content = msg + } else { + content = parseEML(bytes.NewReader(data), p.fields) + } outputFormat := p.outputFormat if outputFormat == "" { outputFormat = "text" } + // Re-chunk attachments so their content becomes retrievable within the + // same document (user-oriented; mirrors Python legacy rag/app/email.py + // naive_chunk). Each attachment is re-parsed by its file extension via + // the shared parser registry; a single unparseable/skipped attachment + // never breaks the whole email. + extraItems, attachmentText := p.rechunkEmailAttachments(ctx, content, depth) + + // attachments has been consumed by rechunkEmailAttachments (which + // re-parses each attachment by extension to make its content + // retrievable). It is otherwise dead weight: jsonItemsToPages copies + // every key into a schema.Page, but buildPagesFromBytes keeps only + // text+doc_type_kwd, so carrying the full attachment payloads through to + // the chunker would only bloat the intermediate pages before being + // discarded. Drop it from the result content. + delete(content, "attachments") + if outputFormat == "json" { - emailContent["doc_type_kwd"] = "text" + content["doc_type_kwd"] = "text" + items := []map[string]any{content} + items = append(items, extraItems...) return ParseResult{ OutputFormat: "json", File: map[string]any{"name": filename}, - JSON: []map[string]any{emailContent}, + JSON: items, } } // Text output: flatten fields into a single string. var sb strings.Builder - for k, v := range emailContent { + for k, v := range content { switch val := v.(type) { case string: sb.WriteString(k) @@ -119,19 +167,20 @@ func (p *EmailParser) ParseWithResult(ctx context.Context, filename string, data } } sb.WriteString("}\n") - case []map[string]any: - for _, att := range val { - fn, _ := att["filename"].(string) - pl, _ := att["payload"].(string) - sb.WriteString(fn) - sb.WriteString(":") - sb.WriteString(pl) - sb.WriteString("\n") - } case []string: sb.WriteString(strings.Join(val, "\n")) } } + // Attachment text (re-parsed by extension) replaces the old crude + // "filename:payload" flatten, so binary attachments no longer leak + // mojibake into the searchable (indexed) text. The raw attachment + // payloads themselves are dropped after rechunk (see parseEmail), so the + // JSON output path carries only the re-parsed attachment text, never the + // original payload bytes. + if attachmentText != "" { + sb.WriteString(attachmentText) + sb.WriteString("\n") + } return ParseResult{ OutputFormat: "text", File: map[string]any{"name": filename}, @@ -270,6 +319,12 @@ func readMailBody(body io.Reader, contentType string, collectAttachments bool) ( attachments = append(attachments, map[string]any{ "filename": attachmentFilename(part), "payload": decodeMailPayload(raw, partParams["charset"]), + // raw preserves the byte-exact decoded-CTE bytes so the + // re-chunk step re-parses the original attachment instead of + // the charset-decoded string (which can differ when the + // attachment declares a CJK charset). rechunkEmailAttachments + // prefers "raw" and falls back to "payload". + "raw": string(raw), }) continue } @@ -417,3 +472,324 @@ func decodeTransform(payload []byte, decoder *encoding.Decoder) (string, error) } return "", fmt.Errorf("decode produced replacement characters") } + +// parseMSG parses an Outlook .msg (OLE2 compound document) file using the +// gomsg library, mirroring the Python flow parser's _email() .msg branch +// (rag/flow/parser/parser.py), which parses via extract_msg. The output map +// shares the same field shape as parseEML so the downstream json/text +// assembly in ParseWithResult is reused unchanged. +func parseMSG(data []byte, fields []string) (map[string]any, error) { + target := targetFieldsSet(fields) + + msg, err := gomsg.Decode(bytes.NewReader(data)) + if err != nil { + return nil, err + } + + content := map[string]any{} + + if target["from"] { + content["from"] = formatSender(msg) + } + if target["to"] { + content["to"] = formatRecipient(msg.DisplayTo) + } + if target["cc"] { + content["cc"] = formatRecipient(msg.DisplayCC) + } + if target["bcc"] { + content["bcc"] = formatRecipient(msg.DisplayBCC) + } + if target["date"] { + content["date"] = formatMsgDate(msg.Date) + } + if target["subject"] { + content["subject"] = msg.Subject + } + + // Always emit metadata to match the Python flow parser contract, which + // unconditionally builds a {message_id, in_reply_to} metadata dict for + // .msg files regardless of whether "metadata" is in the configured fields. + // Empty values are emitted as nil (JSON null) to match extract_msg's None. + content["metadata"] = map[string]any{ + "message_id": orNil(msg.MessageID), + "in_reply_to": orNil(msg.InReplyTo), + } + + if target["body"] { + // Mirror Python: prefer the plain body, fall back to the HTML body + // when the plain body is empty. The .msg branch emits only "text" + // (never "text_html"), matching the Python _email .msg contract exactly. + text := msg.Body + if strings.TrimSpace(text) == "" && len(msg.BodyHTML) > 0 { + text = string(msg.BodyHTML) + } + content["text"] = text + } + + if target["attachments"] { + // Flatten attachments, recursing into embedded .msg files. gomsg + // parses an embedded Message via Attachment.EmbeddedMessage even + // though it exposes no raw bytes for it; the embedded message body + // is surfaced as a retrievable text attachment (see msgAttachments). + content["attachments"] = msgAttachments(msg) + } + + return content, nil +} + +// msgAttachments flattens a gomsg.Message's attachments into the +// {filename, payload} shape rechunkEmailAttachments consumes. Embedded .msg +// attachments expose no raw bytes via gomsg, but gomsg does parse the embedded +// Message; we surface its body as a retrievable text attachment (named .txt so +// the re-chunk step re-parses it as plain text) and recurse into its own +// attachments, so an embedded email is no longer silently dropped. +func msgAttachments(msg *gomsg.Message) []map[string]any { + out := make([]map[string]any, 0, len(msg.Attachments)) + for _, a := range msg.Attachments { + if a.IsEmbeddedMessage() { + if em := a.EmbeddedMessage(); em != nil { + body := em.Body + if strings.TrimSpace(body) == "" { + body = string(em.BodyHTML) + } + if body != "" { + out = append(out, map[string]any{ + "filename": a.DisplayName() + ".txt", + "payload": body, + }) + } + out = append(out, msgAttachments(em)...) + continue + } + } + out = append(out, map[string]any{ + "filename": a.DisplayName(), + "payload": string(a.Data()), + }) + } + return out +} + +// primarySenderEmail prefers the SMTP address, falling back to the raw email +// address when SMTP is unavailable (e.g. an EX address type). +func primarySenderEmail(msg *gomsg.Message) string { + if msg.SenderSMTP != "" { + return msg.SenderSMTP + } + return msg.SenderEmail +} + +// formatSender renders the .msg sender the way extract_msg's "sender" string +// is displayed: "Display Name " when a distinct display name is present, +// otherwise "" (matching extract_msg's angular-bracket form for an +// address with no display name). +func formatSender(msg *gomsg.Message) string { + email := primarySenderEmail(msg) + if msg.SenderName != "" && msg.SenderName != email { + return msg.SenderName + " <" + email + ">" + } + if email != "" { + return "<" + email + ">" + } + return msg.SenderName +} + +// formatRecipient renders a display recipient string the way extract_msg does: +// a bare single email address is wrapped in angle brackets, while a string +// that already contains an address form (display name, or multiple recipients) +// is returned unchanged. +func formatRecipient(display string) string { + if display == "" { + return "" + } + if strings.Contains(display, "<") { + return display + } + if !strings.ContainsAny(display, ",;") && strings.Contains(display, "@") { + return "<" + display + ">" + } + return display +} + +// orNil maps an empty string to nil so it serializes as JSON null, matching +// extract_msg's None for absent properties. +func orNil(s string) any { + if s == "" { + return nil + } + return s +} + +// formatMsgDate renders an Outlook .msg date the way extract_msg does: +// strftime("%Y-%m-%d %H:%M:%S%z"), which emits the zone without a colon +// (e.g. "2018-03-24 00:06:29+0800"). Go's -0700 layout reproduces that +// (the -07:00 layout would wrongly insert a colon). A zero time (date +// missing from the .msg) maps to nil so it serializes as JSON null, +// matching extract_msg's None, instead of a bogus sentinel such as +// "0001-01-01 00:00:00+0000". +func formatMsgDate(t time.Time) any { + if t.IsZero() { + return nil + } + return t.Format("2006-01-02 15:04:05-0700") +} + +// recoverParse runs fn, converting a panic from an untrusted attachment +// parser (e.g. a corrupt PDF/DOCX hitting a native CGO backend) into a zero +// ParseResult with panicked=true, so the caller can skip that one attachment +// instead of failing the whole email. This mirrors the recover around the +// .msg parseMSG call in parseEmail. +func recoverParse(fn func() ParseResult) (res ParseResult, panicked bool) { + defer func() { + if r := recover(); r != nil { + panicked = true + } + }() + return fn(), false +} + +// rechunkEmailAttachments re-parses each email attachment by its file +// extension and folds the extracted text back into the same document so +// attachment content becomes retrievable. This mirrors the user-oriented +// behaviour of Python's legacy rag/app/email.py, which re-chunks every +// attachment via naive_chunk and merges the resulting chunks into the same +// document. +// +// KNOWN LIMITATION: re-chunk uses the default-config parser returned by +// GetParser(ft) (and, for a nested email, only the top-level p.fields — no +// tenant/setup language, parse_method, or OCR/VLM model). The extracted +// attachment text may therefore differ from ingesting the same file as a +// standalone document through the pipeline's tenant/setup-configured +// parser. This is a deliberate, best-effort approximation for making +// attachment content retrievable (the same simplification Python's +// email.py naive_chunk makes), not a correctness bug; threading the full +// tenant/setup config into re-chunk is intentionally out of scope here. +// +// Attachments whose extension has no text-oriented parser (images, audio, +// video) are skipped: they carry no plain text in this pipeline and would +// require vision/speech models that are out of scope here. A single +// unparseable, empty, unsupported, or panicking attachment is skipped +// without failing the whole email (mirrors email.py's per-attachment +// try/except). +// +// The function returns both forms the caller needs: +// - extraItems: structured JSON items (one per non-empty text segment), +// each carrying only "text" and "doc_type_kwd", for the JSON output path. +// - text: the concatenated attachment text, for the text output path. +// +// Re-chunking stops at one level of nesting: a nested email is parsed (so its +// body becomes retrievable) but its own attachments are not re-chunked, to +// avoid unbounded recursion through attachments-of-attachments. +const maxRechunkPayloadBytes = 32 << 20 // 32 MiB + +func (p *EmailParser) rechunkEmailAttachments(ctx context.Context, content map[string]any, depth int) ([]map[string]any, string) { + if depth > 0 { + return nil, "" + } + // Honor task cancellation so a long attachment list does not keep + // re-parsing after the ingestion task has been stopped/aborted. + if ctx.Err() != nil { + return nil, "" + } + + raw, ok := content["attachments"].([]map[string]any) + if !ok || len(raw) == 0 { + return nil, "" + } + + var extra []map[string]any + var sb strings.Builder + for _, att := range raw { + fn, _ := att["filename"].(string) + payload, _ := att["payload"].(string) + // Prefer the byte-exact raw bytes (when present) so a re-parsed + // attachment is not silently corrupted by a prior charset decode. + if rawPayload, ok := att["raw"].(string); ok && rawPayload != "" { + payload = rawPayload + } + if fn == "" || payload == "" { + // Empty payload (e.g. an embedded .msg with no exposed bytes) or + // a missing filename — nothing to re-parse. + continue + } + if len(payload) > maxRechunkPayloadBytes { + // Too large to re-parse inline; re-chunking re-runs the heavy + // parsers (PDF/OCR/...), which would otherwise dominate or stall + // ingestion on a single huge attachment. The attachment remains + // referenced in metadata. + continue + } + ft := utility.GetFileType(fn) + switch ft { + case utility.FileTypeOTHER, utility.FileTypeVISUAL, + utility.FileTypeAURAL, utility.FileTypeVIDEO, utility.FileTypeFOLDER: + // No plain-text parser in this pipeline; skip rather than call + // a vision/speech model that is out of scope. + continue + } + var res ParseResult + var panicked bool + if ft == utility.FileTypeEMAIL { + // Reuse the top-level field configuration (including "body") so a + // nested .eml/.msg is parsed for its body instead of with a fresh, + // unconfigured parser that would only emit metadata and index + // garbage. We always request JSON output for the nested parse so + // the extracted "text" field is returned clean (the text output + // path would otherwise also flatten metadata into the result). + ep := NewEmailParser() + ep.ConfigureFromSetup(map[string]any{ + "fields": p.fields, + "output_format": "json", + }) + res, panicked = recoverParse(func() ParseResult { + return ep.parseEmail(ctx, fn, []byte(payload), depth+1) + }) + } else { + np, err := GetParser(ft) + if err != nil { + continue + } + res, panicked = recoverParse(func() ParseResult { + return np.ParseWithResult(ctx, fn, []byte(payload)) + }) + } + if panicked { + // An untrusted attachment parser (e.g. a corrupt PDF/DOCX hitting + // a native CGO backend) panicked. Skip just this attachment so one + // bad file can't fail the whole email — mirrors the .msg + // parseMSG recover. + log.Printf("email: attachment %q re-parse panicked; skipping", fn) + } + if panicked || res.Err != nil { + continue + } + + var texts []string + if res.OutputFormat == "json" && len(res.JSON) > 0 { + for _, it := range res.JSON { + if t, ok := it["text"].(string); ok { + if t = strings.TrimSpace(t); t != "" { + texts = append(texts, t) + } + } + } + } else if res.Text != "" { + if t := strings.TrimSpace(res.Text); t != "" { + texts = append(texts, t) + } + } + + for _, t := range texts { + extra = append(extra, map[string]any{ + "text": t, + "doc_type_kwd": "text", + }) + if sb.Len() > 0 { + sb.WriteString("\n") + } + sb.WriteString(t) + } + } + return extra, sb.String() +} diff --git a/internal/parser/parser/email_parser_test.go b/internal/parser/parser/email_parser_test.go index aeeb83095c..dd9436aa8a 100644 --- a/internal/parser/parser/email_parser_test.go +++ b/internal/parser/parser/email_parser_test.go @@ -17,9 +17,15 @@ package parser import ( + "bytes" + "context" "encoding/base64" + "mime/multipart" + "net/textproto" + "os" "strings" "testing" + "time" ) func TestEmailParser_EmlJSON(t *testing.T) { @@ -110,15 +116,122 @@ func TestEmailParser_EmlText(t *testing.T) { } } -func TestEmailParser_MsgNotSupported(t *testing.T) { +// TestEmailParser_MsgSupported parses a real Outlook .msg fixture and verifies +// the Go output aligns with the Python flow parser _email() .msg branch +// (rag/flow/parser/parser.py). Replaces the old "MsgNotSupported" test now that +// .msg is supported via gomsg. +func TestEmailParser_MsgSupported(t *testing.T) { ctx := t.Context() - p := NewEmailParser() - result := p.ParseWithResult(ctx, "test.msg", []byte{}) - if result.Err == nil { - t.Fatal("expected error for .msg file") + data, err := os.ReadFile("testdata/sample.msg") + if err != nil { + t.Fatalf("read fixture: %v", err) } - if !strings.Contains(result.Err.Error(), ".msg") { - t.Errorf("error should mention .msg: %v", result.Err) + + p := NewEmailParser() + p.ConfigureFromSetup(map[string]any{ + "output_format": "json", + "fields": []string{"from", "to", "cc", "bcc", "date", "subject", "body", "attachments", "metadata"}, + }) + + result := p.ParseWithResult(ctx, "sample.msg", data) + if result.Err != nil { + t.Fatalf("unexpected error: %v", result.Err) + } + if len(result.JSON) != 1 { + t.Fatalf("expected 1 JSON item, got %d", len(result.JSON)) + } + item := result.JSON[0] + + if v, ok := item["from"].(string); !ok || v != "" { + t.Errorf("from: got %q", v) + } + if v, ok := item["to"].(string); !ok || v != "" { + t.Errorf("to: got %q", v) + } + if v, ok := item["subject"].(string); !ok || v != "asdf" { + t.Errorf("subject: got %q", v) + } + if v, ok := item["date"].(string); !ok || v != "2018-03-24 00:06:29+0800" { + t.Errorf("date: got %q, want 2018-03-24 00:06:29+0800", v) + } + if v, ok := item["text"].(string); !ok || v != " \r\n\r\n" { + t.Errorf("text: got %q", v) + } + // The .msg branch must NOT emit text_html (matches Python _email .msg branch). + if _, ok := item["text_html"]; ok { + t.Error("text_html must be absent for .msg") + } + meta, ok := item["metadata"].(map[string]any) + if !ok { + t.Fatalf("metadata missing or wrong type: %T", item["metadata"]) + } + if v, ok := meta["message_id"].(string); !ok || v == "" { + t.Errorf("metadata message_id: got %q", v) + } + // Empty in_reply_to mirrors extract_msg's None -> JSON null. + if v, ok := meta["in_reply_to"]; ok && v != nil { + t.Errorf("metadata in_reply_to: got %v, want nil", v) + } + if _, ok := meta["in_reply_to"]; !ok { + t.Error("metadata in_reply_to key must be present") + } + // attachments are extracted by the .msg branch but deliberately dropped + // from the final ParseResult (consumed by rechunkEmailAttachments; + // buildPagesFromBytes keeps only text+doc_type_kwd). Verify the + // high-level result no longer carries the heavy payload... + if _, ok := item["attachments"]; ok { + t.Error("attachments must be dropped from the final ParseResult") + } + // ...and verify the .msg branch still extracts them at the parse level. + msgContent, err := parseMSG(data, []string{"from", "to", "cc", "bcc", "date", "subject", "body", "attachments", "metadata"}) + if err != nil { + t.Fatalf("parseMSG: %v", err) + } + atts, ok := msgContent["attachments"].([]map[string]any) + if !ok { + t.Fatalf("parseMSG attachments missing or wrong type: %T", msgContent["attachments"]) + } + if len(atts) != 1 { + t.Fatalf("expected 1 attachment, got %d", len(atts)) + } + if fn, _ := atts[0]["filename"].(string); fn != "5AAoPFgV-nJ965R7o-98C38840-4454-4750-9AEF-F53DB3E37548.jpg" { + t.Errorf("filename = %q", fn) + } + if pl, _ := atts[0]["payload"].(string); len(pl) != 122784 { + t.Errorf("payload length = %d, want 122784", len(pl)) + } +} + +// TestEmailParser_MsgMetadataAlwaysPresent verifies the .msg branch emits +// metadata unconditionally (matching the Python contract) even when "metadata" +// is omitted from the configured fields. +func TestEmailParser_MsgMetadataAlwaysPresent(t *testing.T) { + ctx := t.Context() + data, err := os.ReadFile("testdata/sample.msg") + if err != nil { + t.Fatalf("read fixture: %v", err) + } + + p := NewEmailParser() + p.ConfigureFromSetup(map[string]any{ + "output_format": "json", + "fields": []string{"from", "subject"}, // "metadata" intentionally absent + }) + + result := p.ParseWithResult(ctx, "sample.msg", data) + if result.Err != nil { + t.Fatalf("unexpected error: %v", result.Err) + } + item := result.JSON[0] + + if _, ok := item["metadata"].(map[string]any); !ok { + t.Fatalf("metadata must always be present for .msg, got %T", item["metadata"]) + } + // Basic fields not in fields are dropped. + for _, dropped := range []string{"to", "date", "body", "attachments"} { + if _, ok := item[dropped]; ok { + t.Errorf("%s should be dropped when not in fields", dropped) + } } } @@ -163,9 +276,16 @@ func TestEmailParser_Base64Attachment(t *testing.T) { } item := result.JSON[0] - atts, ok := item["attachments"].([]map[string]any) + // attachments are dropped from the final ParseResult (consumed by + // rechunk, then deleted); verify the high-level result is clean... + if _, ok := item["attachments"]; ok { + t.Error("attachments must be dropped from the final ParseResult") + } + // ...and verify the .eml branch still decodes the base64 attachment. + eml := parseEML(bytes.NewReader([]byte(raw)), []string{"from", "body", "attachments"}) + atts, ok := eml["attachments"].([]map[string]any) if !ok { - t.Fatalf("attachments missing or wrong type: %T", item["attachments"]) + t.Fatalf("attachments missing or wrong type: %T", eml["attachments"]) } if len(atts) != 1 { t.Fatalf("expected 1 attachment, got %d", len(atts)) @@ -242,8 +362,14 @@ func TestEmailParser_Base64AttachmentInMixedMultipart(t *testing.T) { t.Errorf("text_html: got %q, want to contain 'HTML body'", v) } - // Verify attachment is decoded from base64 - atts, ok := item["attachments"].([]map[string]any) + // attachments are dropped from the final ParseResult; verify the + // high-level result is clean... + if _, ok := item["attachments"]; ok { + t.Error("attachments must be dropped from the final ParseResult") + } + // ...and verify the .eml branch still decodes the base64 attachment. + eml := parseEML(bytes.NewReader([]byte(raw)), []string{"from", "body", "attachments"}) + atts, ok := eml["attachments"].([]map[string]any) if !ok || len(atts) != 1 { t.Fatalf("expected 1 attachment, got %d", len(atts)) } @@ -404,6 +530,219 @@ func TestEmailParser_TextHTMLAlwaysPresent(t *testing.T) { // empty list because attachment extraction was coupled to the body branch // (the "else if needAttachments" fallback set an empty slice instead of // walking the message). +// TestEmailParser_AttachmentSearchableJSON verifies the user-oriented +// behaviour: an email attachment is re-parsed by its file extension and its +// content becomes a retrievable chunk in the SAME document (mirrors Python +// legacy rag/app/email.py naive_chunk). The attachment text must appear as a +// separate JSON item, while the email body stays on the main item. +func TestEmailParser_AttachmentSearchableJSON(t *testing.T) { + ctx := t.Context() + attachmentContent := "QUOTE: the quick brown fox jumps over the lazy dog." + encoded := base64.StdEncoding.EncodeToString([]byte(attachmentContent)) + boundary := "attachboundary" + raw := strings.Join([]string{ + "From: sender@test.com", + "To: receiver@test.com", + "Subject: Attachment Test", + "Content-Type: multipart/mixed; boundary=" + boundary, + "", + "--" + boundary, + "Content-Type: text/plain; charset=utf-8", + "", + "Email body text.", + "--" + boundary, + "Content-Type: text/plain; charset=utf-8", + "Content-Disposition: attachment; filename=\"note.txt\"", + "Content-Transfer-Encoding: base64", + "", + encoded, + "--" + boundary + "--", + }, "\r\n") + + p := NewEmailParser() + p.ConfigureFromSetup(map[string]any{ + "output_format": "json", + "fields": []string{"from", "body", "attachments"}, + }) + + result := p.ParseWithResult(ctx, "test.eml", []byte(raw)) + if result.Err != nil { + t.Fatalf("unexpected error: %v", result.Err) + } + + // Body must remain on the main item. + if v, ok := result.JSON[0]["text"].(string); !ok || !strings.Contains(v, "Email body text") { + t.Errorf("body missing on main item: %v", result.JSON[0]["text"]) + } + + // Attachment text must appear as a separate retrievable JSON item. + found := false + for _, it := range result.JSON { + if txt, ok := it["text"].(string); ok && strings.Contains(txt, "quick brown fox") { + found = true + } + } + if !found { + t.Errorf("attachment text not found in JSON output:\n%#v", result.JSON) + } +} + +// TestEmailParser_AttachmentSearchableText is the text-output equivalent: +// the re-parsed attachment text must be present in result.Text. +func TestEmailParser_AttachmentSearchableText(t *testing.T) { + ctx := t.Context() + attachmentContent := "QUOTE: the quick brown fox jumps over the lazy dog." + encoded := base64.StdEncoding.EncodeToString([]byte(attachmentContent)) + boundary := "attachboundary" + raw := strings.Join([]string{ + "From: sender@test.com", + "To: receiver@test.com", + "Subject: Attachment Test", + "Content-Type: multipart/mixed; boundary=" + boundary, + "", + "--" + boundary, + "Content-Type: text/plain; charset=utf-8", + "", + "Email body text.", + "--" + boundary, + "Content-Type: text/plain; charset=utf-8", + "Content-Disposition: attachment; filename=\"note.txt\"", + "Content-Transfer-Encoding: base64", + "", + encoded, + "--" + boundary + "--", + }, "\r\n") + + p := NewEmailParser() + p.ConfigureFromSetup(map[string]any{ + "output_format": "text", + "fields": []string{"from", "body", "attachments"}, + }) + + result := p.ParseWithResult(ctx, "test.eml", []byte(raw)) + if result.Err != nil { + t.Fatalf("unexpected error: %v", result.Err) + } + if !strings.Contains(result.Text, "quick brown fox") { + t.Errorf("attachment text missing from text output: %q", result.Text) + } + if !strings.Contains(result.Text, "Email body text") { + t.Errorf("email body missing from text output: %q", result.Text) + } +} + +// TestEmailParser_AttachmentEmptyPayloadSkipped verifies error isolation: +// an attachment with an empty payload (the legacy .msg nested-attachment +// case, where gomsg exposes no raw bytes) is skipped without breaking the +// email, and a valid sibling attachment is still re-chunked. +func TestEmailParser_AttachmentEmptyPayloadSkipped(t *testing.T) { + ctx := t.Context() + validContent := "VALID attachment payload" + validEncoded := base64.StdEncoding.EncodeToString([]byte(validContent)) + boundary := "mixedbound" + raw := strings.Join([]string{ + "From: sender@test.com", + "To: receiver@test.com", + "Subject: Empty Payload", + "Content-Type: multipart/mixed; boundary=" + boundary, + "", + "--" + boundary, + "Content-Type: text/plain; charset=utf-8", + "", + "Hello body.", + "--" + boundary, + "Content-Type: application/octet-stream; name=\"empty.bin\"", + "Content-Disposition: attachment; filename=\"empty.bin\"", + "Content-Transfer-Encoding: base64", + "", + "", + "--" + boundary, + "Content-Type: text/plain; charset=utf-8", + "Content-Disposition: attachment; filename=\"valid.txt\"", + "Content-Transfer-Encoding: base64", + "", + validEncoded, + "--" + boundary + "--", + }, "\r\n") + + p := NewEmailParser() + p.ConfigureFromSetup(map[string]any{ + "output_format": "json", + "fields": []string{"from", "body", "attachments"}, + }) + + result := p.ParseWithResult(ctx, "test.eml", []byte(raw)) + if result.Err != nil { + t.Fatalf("email must not fail on empty-payload attachment: %v", result.Err) + } + + found := false + for _, it := range result.JSON { + if txt, ok := it["text"].(string); ok && strings.Contains(txt, "VALID attachment payload") { + found = true + } + } + if !found { + t.Errorf("valid attachment text not found despite empty-payload sibling: %#v", result.JSON) + } +} + +// TestEmailParser_AttachmentUnknownExtSkipped verifies that an attachment +// with an unrecognized extension is skipped (no parser available) while a +// valid sibling attachment is still re-chunked. Mirrors the legacy email.py +// behaviour, which only re-chunks known file types. +func TestEmailParser_AttachmentUnknownExtSkipped(t *testing.T) { + ctx := t.Context() + validContent := "KNOWN attachment payload" + validEncoded := base64.StdEncoding.EncodeToString([]byte(validContent)) + boundary := "mixedbound" + raw := strings.Join([]string{ + "From: sender@test.com", + "To: receiver@test.com", + "Subject: Unknown Ext", + "Content-Type: multipart/mixed; boundary=" + boundary, + "", + "--" + boundary, + "Content-Type: text/plain; charset=utf-8", + "", + "Hello body.", + "--" + boundary, + "Content-Type: application/octet-stream; name=\"data.xyz\"", + "Content-Disposition: attachment; filename=\"data.xyz\"", + "Content-Transfer-Encoding: base64", + "", + base64.StdEncoding.EncodeToString([]byte("opaque bytes")), + "--" + boundary, + "Content-Type: text/plain; charset=utf-8", + "Content-Disposition: attachment; filename=\"known.txt\"", + "Content-Transfer-Encoding: base64", + "", + validEncoded, + "--" + boundary + "--", + }, "\r\n") + + p := NewEmailParser() + p.ConfigureFromSetup(map[string]any{ + "output_format": "json", + "fields": []string{"from", "body", "attachments"}, + }) + + result := p.ParseWithResult(ctx, "test.eml", []byte(raw)) + if result.Err != nil { + t.Fatalf("email must not fail on unknown-extension attachment: %v", result.Err) + } + + found := false + for _, it := range result.JSON { + if txt, ok := it["text"].(string); ok && strings.Contains(txt, "KNOWN attachment payload") { + found = true + } + } + if !found { + t.Errorf("known attachment text not found despite unknown-ext sibling: %#v", result.JSON) + } +} + func TestEmailParser_AttachmentsWithoutBody(t *testing.T) { ctx := t.Context() attachmentContent := "SECRET attachment payload" @@ -449,10 +788,16 @@ func TestEmailParser_AttachmentsWithoutBody(t *testing.T) { t.Error("text_html should be absent when body not in fields") } - // attachments must be extracted even without body. - atts, ok := item["attachments"].([]map[string]any) + // attachments are dropped from the final ParseResult (consumed by + // rechunk, then deleted); verify the high-level result is clean... + if _, ok := item["attachments"]; ok { + t.Error("attachments must be dropped from the final ParseResult") + } + // ...and verify the .eml branch still extracts them even without body. + eml := parseEML(bytes.NewReader([]byte(raw)), []string{"from", "attachments"}) + atts, ok := eml["attachments"].([]map[string]any) if !ok { - t.Fatalf("attachments missing or wrong type: %T", item["attachments"]) + t.Fatalf("attachments missing or wrong type: %T", eml["attachments"]) } if len(atts) != 1 { t.Fatalf("expected 1 attachment without body, got %d (bug: attachments silently dropped)", len(atts)) @@ -464,3 +809,258 @@ func TestEmailParser_AttachmentsWithoutBody(t *testing.T) { t.Errorf("payload = %q, want %q", pl, attachmentContent) } } + +// TestEmailParser_NestedEMLAttachmentRechunk locks the regression where a +// nested .eml attachment was re-chunked with an UNCONFIGURED EmailParser +// (fields == nil), so parseEML emitted only metadata and the text path indexed +// "metadata:{...}" garbage. The nested email must instead be parsed with the +// top-level field configuration (including "body") so its body becomes the +// indexed text. The outer email's own metadata flattening is expected; the +// nested email must NOT contribute a second "metadata:{" segment. +func TestEmailParser_NestedEMLAttachmentRechunk(t *testing.T) { + ctx := t.Context() + + innerRaw := strings.Join([]string{ + "From: inner@x.com", + "To: outer@y.com", + "Subject: inner", + "Content-Type: text/plain; charset=utf-8", + "", + "INNER BODY SECRET", + }, "\r\n") + + boundary := "outerbound" + raw := strings.Join([]string{ + "From: outer@y.com", + "To: someone@z.com", + "Subject: outer", + "MIME-Version: 1.0", + "Content-Type: multipart/mixed; boundary=" + boundary, + "", + "--" + boundary, + "Content-Type: text/plain; charset=utf-8", + "", + "OUTER BODY VISIBLE", + "--" + boundary, + "Content-Type: message/rfc822", + "Content-Disposition: attachment; filename=\"inner.eml\"", + "", + innerRaw, + "--" + boundary + "--", + }, "\r\n") + + for _, format := range []string{"json", "text"} { + p := NewEmailParser() + p.ConfigureFromSetup(map[string]any{ + "output_format": format, + "fields": []string{"from", "to", "subject", "body", "attachments", "metadata"}, + }) + + result := p.ParseWithResult(ctx, "outer.eml", []byte(raw)) + if result.Err != nil { + t.Fatalf("[%s] unexpected error: %v", format, result.Err) + } + + // Collect all indexed text for this output mode (JSON populates + // result.JSON; text populates result.Text). + var indexed strings.Builder + if format == "json" { + for _, it := range result.JSON { + if txt, ok := it["text"].(string); ok { + indexed.WriteString(txt) + indexed.WriteString("\n") + } + } + } else { + indexed.WriteString(result.Text) + } + + // The nested email body must be retrievable. + if !strings.Contains(indexed.String(), "INNER BODY SECRET") { + t.Errorf("[%s] nested body not indexed: %q", format, indexed.String()) + } + if !strings.Contains(indexed.String(), "OUTER BODY VISIBLE") { + t.Errorf("[%s] outer body missing: %q", format, indexed.String()) + } + + if format == "json" { + // The nested email must be a distinct, clean item, carrying no + // metadata key (the old bug leaked a "metadata:{...}" string as + // its text). + found := false + for _, it := range result.JSON { + if txt, ok := it["text"].(string); ok && strings.Contains(txt, "INNER BODY SECRET") { + found = true + if _, hasMeta := it["metadata"]; hasMeta { + t.Errorf("[json] nested item must not carry metadata key: %#v", it) + } + } + } + if !found { + t.Errorf("[json] nested body not found as separate item: %#v", result.JSON) + } + } else { + // Text mode: the outer email's own metadata is flattened once; + // the nested email must NOT add a second "metadata:{" segment. + if c := strings.Count(result.Text, "metadata:{"); c != 1 { + t.Errorf("[text] expected exactly 1 metadata:{ segment (outer only), got %d in: %q", + c, result.Text) + } + } + } +} + +// TestEmailParser_RechunkAttachmentTextPath exercises rechunkEmailAttachments +// directly with the {filename, payload} attachment shape that both .eml and +// .msg parsing feed into it. It verifies text attachments are indexed while +// binary (VISUAL) attachments are skipped, and that binary payloads never leak +// into the indexed text. +func TestEmailParser_RechunkAttachmentTextPath(t *testing.T) { + ctx := t.Context() + content := map[string]any{ + "attachments": []map[string]any{ + {"filename": "note.txt", "payload": "hello from attachment"}, + {"filename": "pic.jpg", "payload": ""}, + }, + } + + p := NewEmailParser() + extra, text := p.rechunkEmailAttachments(ctx, content, 0) + + if len(extra) != 1 { + t.Fatalf("expected 1 indexed attachment, got %d: %#v", len(extra), extra) + } + if v, _ := extra[0]["text"].(string); v != "hello from attachment" { + t.Errorf("text = %q, want hello from attachment", v) + } + if !strings.Contains(text, "hello from attachment") { + t.Errorf("indexed text missing attachment: %q", text) + } + if strings.Contains(text, "") { + t.Errorf("binary payload leaked into indexed text: %q", text) + } +} + +// TestFormatMsgDate verifies the .msg date rendering: a zero time (date +// missing from the .msg) maps to nil (JSON null, matching extract_msg's +// None) instead of a bogus sentinel like "0001-01-01 00:00:00+0000". +func TestFormatMsgDate(t *testing.T) { + if got := formatMsgDate(time.Time{}); got != nil { + t.Errorf("zero date should map to nil, got %#v", got) + } + got := formatMsgDate(time.Date(2018, 3, 24, 0, 6, 29, 0, time.FixedZone("CST", 8*3600))) + if got != "2018-03-24 00:06:29+0800" { + t.Errorf("formatted date = %q, want 2018-03-24 00:06:29+0800", got) + } +} + +// TestRechunkEmailAttachments_ContextCancelled verifies that an already +// cancelled context short-circuits re-chunking instead of re-parsing +// attachments (mirrors the cancellation check CodeRabbit flagged). +func TestRechunkEmailAttachments_ContextCancelled(t *testing.T) { + ctx, cancel := context.WithCancel(t.Context()) + cancel() // task already aborted + content := map[string]any{ + "attachments": []map[string]any{ + {"filename": "note.txt", "payload": "must not be re-chunked"}, + }, + } + extra, text := NewEmailParser().rechunkEmailAttachments(ctx, content, 0) + if len(extra) != 0 || text != "" { + t.Errorf("cancelled context should short-circuit re-chunk: extra=%#v text=%q", extra, text) + } +} + +// TestRecoverParse_IsolatesPanic verifies that a panic from an untrusted +// attachment parser is converted into a zero ParseResult with panicked=true +// and does NOT propagate out of recoverParse (so a single bad attachment can +// be skipped instead of failing the whole email). +func TestRecoverParse_IsolatesPanic(t *testing.T) { + res, panicked := recoverParse(func() ParseResult { + panic("boom") + }) + if !panicked { + t.Error("expected panicked=true") + } + if res.Err != nil || res.JSON != nil || res.Text != "" { + t.Errorf("panic should yield a zero ParseResult, got %#v", res) + } +} + +// TestRecoverParse_PassesThrough verifies a normal parser result is returned +// unchanged with panicked=false. +func TestRecoverParse_PassesThrough(t *testing.T) { + want := ParseResult{OutputFormat: "text", Text: "hello"} + res, panicked := recoverParse(func() ParseResult { + return want + }) + if panicked { + t.Error("expected panicked=false for a normal result") + } + if res.Text != "hello" { + t.Errorf("result not passed through: %#v", res) + } +} + +// TestEmailParser_RechunkPrefersRaw verifies that rechunkEmailAttachments +// re-parses the byte-exact "raw" bytes when present, rather than the +// charset-decoded "payload". The fallback (no "raw") still uses "payload". +func TestEmailParser_RechunkPrefersRaw(t *testing.T) { + ctx := t.Context() + p := NewEmailParser() + + withRaw, textRaw := p.rechunkEmailAttachments(ctx, map[string]any{ + "attachments": []map[string]any{ + {"filename": "note.txt", "payload": "WORLD", "raw": "HELLO"}, + }, + }, 0) + if len(withRaw) != 1 || withRaw[0]["text"] != "HELLO" { + t.Fatalf("raw not preferred: extra=%#v text=%q", withRaw, textRaw) + } + if strings.Contains(textRaw, "WORLD") { + t.Errorf("re-chunk used payload instead of raw: %q", textRaw) + } + + fallback, textFallback := p.rechunkEmailAttachments(ctx, map[string]any{ + "attachments": []map[string]any{ + {"filename": "note.txt", "payload": "WORLD"}, + }, + }, 0) + if len(fallback) != 1 || fallback[0]["text"] != "WORLD" { + t.Fatalf("payload fallback broken: extra=%#v text=%q", fallback, textFallback) + } +} + +// TestReadMailBody_AttachmentPreservesRaw verifies that .eml attachment +// collection stores the byte-exact decoded-CTE bytes under "raw" alongside the +// charset-decoded "payload". Declaring charset=gbk makes decodeMailPayload +// decode GBK bytes to a UTF-8 string, so the two differ — re-chunk relies on +// "raw" to avoid silently corrupting the attachment. +func TestReadMailBody_AttachmentPreservesRaw(t *testing.T) { + // GBK-encoded "中文" (中=0xD6D0, 文=0xCEC4). + gbk := []byte{0xD6, 0xD0, 0xCE, 0xC4} + + var buf bytes.Buffer + mw := multipart.NewWriter(&buf) + bp, _ := mw.CreatePart(textproto.MIMEHeader{"Content-Type": {"text/plain"}}) + bp.Write([]byte("body")) + ap, _ := mw.CreatePart(textproto.MIMEHeader{ + "Content-Type": {"application/octet-stream; charset=gbk"}, + "Content-Disposition": {`attachment; filename="x.bin"`}, + "Content-Transfer-Encoding": {"base64"}, + }) + ap.Write([]byte(base64.StdEncoding.EncodeToString(gbk))) + mw.Close() + + _, _, attachments := readMailBody(strings.NewReader(buf.String()), "multipart/mixed; boundary="+mw.Boundary(), true) + if len(attachments) != 1 { + t.Fatalf("expected 1 attachment, got %d: %#v", len(attachments), attachments) + } + att := attachments[0] + if raw, _ := att["raw"].(string); raw != string(gbk) { + t.Errorf("raw = %q, want byte-exact %q", raw, string(gbk)) + } + if payload, _ := att["payload"].(string); payload != "中文" { + t.Errorf("payload = %q, want 中文 (charset-decoded)", payload) + } +} diff --git a/internal/parser/parser/testdata/sample.msg b/internal/parser/parser/testdata/sample.msg new file mode 100644 index 0000000000000000000000000000000000000000..00e8d0ce280f773750a632146fbf7d9036a1623e GIT binary patch literal 143360 zcmeF32Ut_d+W1cz31KOLfCvZ)H34bT1tbYAASHAK3kWDk6)CcageHiB0fPla0|aRn zL=cUu0Y?p>Ar_S@%s?(_Tye>rE)%$av)&O0;j%$#G_ zRl-2o5rskM4{ia3f<8}(LLy&WM}c$1v|kE>kl-BV^Tfo&^kr3Wq6Pq${=fS#sDV!) zk7)3`WWj@lpEU-61&9K006gFafEYj=AOVmDNCJQgKm>p+Kn6er$OGg6vjDRJ3IIjG z9Dou)8K43n0muM3AeRV$^8up)u4w|a02BZfpbgLg%mwHI^Z@z*1Arl59>54-3@`zh z0?YvB01Lo;fF-~RU=3IRumR8jbN~Zj3$O#&0~`R304Bf*;0#y@Z~?di+yL$X7Qh4G z3Gf1V1AG9!06)MYz+!+uAONrguoSQiupAHw2m-7C1Oq|^90#%=Qx3*nFpx`UysmsejO+HbMX)`!taxzoolqrmdlf?8Vve&a!{Psv*j zWWs;*0EUytFYo#CTpL3EE+5Xvmto&JC;b-qZTUtsk`LE7+-_$o9|7W$0I-Am?wJ6$ z|LJ&eA259mxBuz$nI8Yx2dIKH)Bx&$|Bdz!=L2s4-^&jT#GwNi09(M{ZU3-5xcz@m zE*w7H{^9c#;GST>Uv2->a^Utqeg5Tfy8VB74Q~Hm`f(%?a0P-|CVwG^jVM@~{^g&# z{PkaU_SCqMK6ykyHz$u%X@~+F;(JaWLG7c5!#$8LAQ|*+q2If8GW<(LkD%%$t7@K0Ar%`T0Gga}D*xO-p+1M4>q*nqHA76V3uFo*_n88>Mq#(`WX0EJicl`O=_y0cfz%}{T-QOL5{_gnwt^UvCA6ox_ z*9oWf?_2UsC+*+w_djrY@S5XH^&f64GqJx+!D`|^(f`4Dok{zjvOd3Gez-qX`3vQT z*Xd?bezO_&KXAQIJCO8u9X#iU>i~A&dj4iJtbaH?1pu4}IL+@lcwKsCU$xW>9_+)j$qx=8|-g*fc*{@2&I7i3NNr6^=f57co3oz62n}fL1^&bw_IP}2oQV`ey2?aY$y5JZD zG!I^jO#*ri@5RJ}zfhooaEv&xN1`_wt_O530OZjC)RNw0T^UUtVI710u#PPS`**Nj zlm76x0?gYMOV%CR8!DsUDAv_2A?!>hrtwkH8U+?L>-sp(ek1!{x@u7`l%HDG_w za54=z4<Bk+QEU(;Po8X5C2Z(*#NW$J>WO^(>$&O`G^B@{wMAD zkL9KOVOPrYbKy1B=CIT8e0oen2M+W+mQ-(KmY70H~?wkKodxlwL$_Z22GZDy3Rs7~JEqKt8>Hd&Y2T@RR$W_I=*q?*Hk%UXwd`t3mw*gBpNS znYN4Ja@zqPtika0@0ZySlyADs^MG!Xz~1xJEPP5&TtP}}!Cw&2u~1MSP9XiMd{3Qna25pGL=gCcudD!9Ou%(`?Jacj%GcMorp5+WAjx%7Cw##j z|JosiWl!x|!ezAuwFvK`Oz)+5|F)L`$BF{A6bZs$U4x%=JlI8#0={*V`IyoXQINA3 z5HA|!433iwv`H0|a_Y|-=&Kuuy$;+9k9BYw(|e`UM_8xf`mzHxU<+!%cCvpk2EXQ@ z_Tf^)t2(Na8o3Ch3u_(R^5HVUxpW1-U~nD->Np0}4!k$*4ssL^;=p^=5tHSGTkh2J z@CNM$UKfOWE%<4`Ifruyr$qK#bt|J&NSAy1Q4tDv2 zK+FUnI~>GZ1mAn zJ=y7g=Fh@ra*gyi^af7<6WC0014`%O?~uT}@}>?2G%zkWc9r2glZ<&N+pzekNJEt2 z+ZEvOK+*4#T&s{kHuB+h5;be}e6fX*ZKHTYyN@`w!oiZx7^u zfBs7X>8S$XJb=S@-Fy&Zdj9im`EXD5efiU6pQ(IHAb;Ba`nr6$>@!<`C4=-d05g?8 zv-NjaK0N0C@0Wk(@@KaGst(Go`4`G>1>))fVE3*1hsUsgqWsoC?)UT$Zgtat-&ud2 ze0N3%q&d^)zW~IY9;d!m{wewY%>2g&$Vb4N(7=65K5Ws?r2Z)&9c{o&%MZV&w*&yY zugRa%{F&{)!g8nGRI1izx_k#QsX@1Z7fe6$6Pw3lt z0}@sS$(G85SZLofI3H|-w2y=b3PJFjCjxyCIVWoTg}?fFAsFvJoQ-GvA-G9?U%RT`6|GL*EJNHicg5>gf2 zb&)DAHhMmKJS-Gy*|}CXN_+qnxHbmC_SePmqErSXx>QxNV{Vcp$+O9{mEr@T>L%pZ z%aT;Ls_oNYW9mc5ucIbbWO@eMHwS17m#&k~TYve3Mee zNSfQCmt>@esb2-@dwc48+S}>|Ni-N6s4kEWR!%ZfQ-a8Hn?vI>*p(t4oWkiscE0t?Jyh(3%N1l1SXb`D6o{$844+iyUYu78t!M zL3u!(WADb)_3^UV7&M)q;{T=U6zl#wTLx#R9zo4b7e| z+q!(4X`l~#zE3*Yz>xJmk{lOn{mkvD`-F$&q8uC4cmQn~ZAF{SM#mMlVb5b7$UzCp zEi2Pj<*w-Z5HC;{%_RLQ$vDs)gzTEV%3V}*8 zjWJsnAi^PuteO`aUqrH4y1;5krEmeh!YW2%oWS;BCm|5gwJ)Tl>S&VV%kQAQp(0vQ918xeJ0m z?3z$MYO3$C)nNB^$D}^z1qpV(Q2kK1_xf20Oi5`}0uUpAdK z<1!>#F?y`jBVC{``#a9+_fZzMbN+W{?K8>O$?1V$CXxRn&flHCd~N)J_rB~W?a%*x z`+pHA2fSwoyKl>fN8#_whsQG5o}20Tw;05Q*Gpmdb@}kx_djF*!EZ)QkH6oRKco2% zSoN6t4q~R|4*>CDdkJ<4M~_EhPX9_v7hC@-v~ZUp$eGhr$jp9;f0h7YME}=>?JT>E zna5LyRBN4>Ur+1r>hH9TJasgM5Mcf0&)?|!^E`YlHoOP(pYNIdXBvN3{`c18;8op! zay{;A`Zu-nGgZ3p%s>9}{s(M(e^39Xcb?!Jd{4dsNY4l`Q~h5G;!f-Tx6A*}%zu{w z`3(Tr!SZ7#S3BW1-r@DsaBzh8EyzRsYPWs{XDim~vj6~Q>`r-XM z6qHF;0e8Uh;qeE)ABmv)W{5QV}uu))n)A>~aPwGqg zDnOgQ3`Zi?O#0#XEl`kyrV3cM{xVzz=-I#DpY(_Db$dD8!{{Hy$1d{CPbaC#87X0rZK5O&f}n3Oj8o{JP5{sUl2zUZVM zUQa+l^FjGcCjD?5n+g{*faAm3gM!pF#UQy!|Fk}!pu0A3_&zuA0~`u^HtEOyW|yfz z;$d+3ba_-DiAg`)f5GXi09E<-aKxm4IvfQdC;ij%fWA)p8-Ksw8iMbi)?YD5WwN~g zivNBxKhyG&h+jhC_^|y1KTjm${-htaXF%S`Vvypb{{QR#Ig|dW`kn{@(f-ZB{SUl* zGPMKw=e^Eyu)_53;~d=jrriABzQ2Rl)Zl&XKXcRH-A#Z0_hp=~^}hyS^}_+AI1~F1 z?)RqMmuY|PJQf7}_IM}z-#`EU50*c(_m53Ldhnh)oQJQ;{POx5;DOr5*q9 zdS%uSq1!E`|VITK~UY{+X@+!uwh9p3Y3mp9tc@<00%|`G42`n=boI zlbK@H# z3O_v_eHk{B^KkG6$JBcW`je@L{vrMEr2*?7{B}${_=WqjziI(k0n2(?{}y~j*z~wR zef%=o*V^CI`2WxBKm7pV|KB zbp6j%ehQE;4}cv!_-6nz0a<`-z(zn00PZ6;0rCKw0b2n1fC9i)00&SAC<1H)Z~?`D z?SLJCodB>T43z+O1NHz)0eb=a06ah$pd3&E-~%cF`vFyeYCsL37ElK`05}LZ1UL++ z2OI&wbLpc1*rsj*90N21jss2r1b~x(p8%%-rvYaGEr3=)8{jP9XTUkYdB6ogJD>y5 z3AhNj1h@>i0=Nq30(1j<0M`K50lk15fSZ6@fIdJ!;5Oh6KnS=CxCa;j3<7=u+y^`W z3;`Yj9sz~{BY?+%Ujd_lCx9`)Q@}Xj8Q?kK1>hy%72q}C4d5-{9pF9S1K=az6W}vo z(ojW!c`*P9KmpJI3_t{c1>gXp06ahp@B=^`AOVmBNC5}{X@Csi%l}sZKL7vjzn}(g zP22{ry@{YPA{exY2u1{p6~W=9@OV*CJW)dO2dP;^dHGpHIXQ(n8Y&8kYD#i)q`4$D zO)aW6b+(GGfiA^BgF>aii6F38EFOoK!Q*8p3UUgRzw9PjAOa2pp;}M~RR~Eypa_VG zpW!bXkSGM~fZ9$v1QJ4l{9JhXC zOPrTpsKzKeGA?W6+1f3qz9Mc=!`RjFrF z2V^3Uus{%IKmgf5PC5h%g~CjR5l}!FdY%j&2*VJK)EI?jt=+QfM+V0y`k@~{%R&-R z1n@r&y{)4?62#iyqb6!27G6%#=^vn>R=Y`dUb?W@_g6@qGb{5+hp+g?3#%8OtzP=s zss9PLyK=X=7An+>={CnUe#-!&IW(AQ-Ai6PdkA_kR*B?_QBQuX=-z3fc(@#@sb1sc zsdJ?R@y>X228${sACu6=Rut00YHF_`J5P0+q=_;}QO9XCYyu9OtrJ3{vsVqLi(cok z@ZuDAfo2hDi?9%*H_Xn@ycgZx&oUD_^p57OA|~4*?nG`M_KK4JRY?=m3h87caL?B{ zXDRw?{n*GnA}IdkiA$lFzORO~J*>2mHW}LqquT_CL!2}5W{rqO!mWXbXkwj)Zkl&~ zNgqU4AKSCoxpnLSmWzUP;%_6Ibg|~Q`Z;n-#f!G3_Ly@cCxFfLI=fQB*|n6jP!jL& zT331vVkhnkd2%}>Us020Zb=QN3#FfioG%a_r#~$VrI55kwna;csr?$;(Eh~Xn$<0z zTVC$;6g2<&uFfizkgc?I#cI6gldeX!RL*-!va^046h`heVG`(2nD67|frJOKY@Bh} zQGtYPTP#(l+1oj{ffpt^s&OU+d1It5USv3PJqf26otYS?{#1Y--H9!I+UNb?ie`~A z3$5mJ+*#tW`4cAe(V%tU7sNN)H)v(3nj$Wo4O-?jrYLshztgpv`YJ5xoH<@d|Gr=aLo1h?WqKmJ{ZJ?eyojbb0pB`Tb7D zY-Df#kY>T%y5!L^!JzM4^b^ZNAz`mkNe`%s&A8NcUJ(PlxksJbub$A}|Fqtv&7obK zRM3&5Si3Xad|<5b;3~zcpt@7Va$aT|+#WLq7%OX|7Trt~MWL>=-xFjGP(*2NcNQ&t zr)kRIFHUP9SqP~^jtb5@4O~PI_T+f(DHI?tVl&EyNP`AUd1YP5JNlPAk;8+~4V?|n zvl>hUIfH2A)e8?Rl1*hKyyJovcu0IKnzId=X_Dr>|NNVUiQd>Baacv4*xiC<9UEJr zme(EFSnmLClyxD*_Kovm!nF3rQi_$F!yk0Grq7{8xXC6SD5~`>Dh$7eCez8}+uTRQGpwMhTYT zvp!ITMzq|wG?Xu~;vGrta4`kn*lB@4yrwUt&3QwUw)Z^1y{g^d%qzI_qyg`b6FJ3M zJ*#g)i6Sp=2zNU~S7(!G#@^TIiJv>?w0VuPbx%^1JruqYpdLX#|A~Vt zN>@mEI+jlg;~|82M-Dd<8D7pr<~*!B8lHjWN;R(yRl6L$b+s2$ExvVb>GfLI=1`n^ z4}$jE`AM^{_%X%=WG7wjbZF2_w-#@nLcPsxuLxP9$2mka>oX9)u96_MqpA zbR(-}6(W9YY-{dQq?An)jlRQHu5;TpGGg|zG#cSt$imP!Y>_^4r zZ|8`2vKI>t6)P3vGR>{Gp_(Lo{2I1P&5EV!jurE7jIa@iRbv@Mksh*FhuYC z5gRWqTic>baT6zz`WVmNX(U-{U-{G}H%sDnwUWDby-c=oSj*j!oKBAh)6|2cIG>nQ z)#ZJx`(emOnSH*GmQzkp2l3*|MnoHz$gV0F*(sflE4_frFG3@a+eJ-4-Y-)$)Z$xE zg1{K=AyN|U1oU%{XOzfp%5x7$7Aev?D08NbhaN3#Ki+d-ERli=BM3JB8mjnwrxc}s zh3C;?rHCxVpm&V#NGnyz{uvVyP$merr`}(YfofGEiAPp&Z}EsSDP?y@=KGQ4K2)Z4 z#`C3FK05FDhY*&<(F@v1bsGBEko!WNq+}PYE-l*Q=ve-ZVbW;v?dV)Jf!|_9Eu;tI z^(arXx_XzYm)+>DjxaPN+qN;srbDHi<~p`ZBg=w%VvKF%?Y!l z6s}$lniUkGO5NDGyiKuapK~B`H`jmeejLjO1X&hvOYB=WyiSI5ySZijqkz+TL_qOLESQSTBcPDW+^XHM5xXvFgT`?tm_u?4krPP$S!(bT_e1zIAar&5{@l zMK~!io3MhQF#D>6MbvcKB2k2*O*iP1c3N^V`IK!92Z$|Q-WdMfk@Js_jqOo*-K0+O z_?%(t-YqrP!#j{birf;Mwe)H?lVr@c9NVfU@am)`IXi~@{2FhZ!b|66?0w8R;V_We{vs%P+shem-WUR!&Hi@C- zUdgecfU*>gK9j{}hbw-PmN|nHITNCb-2MTLk{Ode9@Svh;1w*8mJ6qaLrE2F8@ECC zgJ`BSS>1WAMfM2SPsikC{}o_K5~B$k4>~VQ>-95 zwDyQIc5{>D2|MIYW3pYHk`{4ub`QC!0pZYI-{)$Z**QOnsS#V@@KG}=$z|PJ`u3+; zgF3iDlMHt3?K`R>*I5#`(5+0oXQ7>BNV=JQXWKn)u>e6Ax^}qGMCtsN{wxY*%sJSn zfhIC&KuvnDYT+WUi4B45@HiwvsmJbF7G_J?E4%!jyCa!(Toh_SV5rb9P?VrJ@lp#eUer>!bl`$6K=<&e5#P0;xX~BoY=Kq zZW9o0TuQz4AjD9AE{&w)j(;Q}Zt=W)c*!)-8#R|6w~O{3;Qt^Kxo%KD!oC^_Il2cH z@6YdF@m`Kij2P0%7QcQYqBvmRdY;B+9x%WPREuPyXpZwQYiLFF+=~~*hM><}#($Dh zkL4=3$V-(`9ku-$pvEVHSq@!Tp{|gp;ybL&;)i_>L$Xc!7^XBd@@befzA-(Z_GN)H z&u_zO3lq;duW5);9&4|u9kC^EESI$Gg9cfqo)6yj6ccsV7CX!(WH!Hbb|!tO)DS_B zZ+{}K>x{!BY+G7%yZ}oTj@OxW(2+{}`w$KIbfN`oe3LPEuNO&`W9Nx!hwQ~XTZVLm zDOsZTg&sdw{>9^2RcoD+$8vwk*m65$5bt*5VtH~N z2YYHcG^~I`k}-w}e_Rd-P-iGb;dz2ao~`G~CT{9BNYp2Dw1Ahfc-4FA0qykD$f)HwvBk&x=(YmZ z0OaNKnr6LhxQ9Mkwgwe~66dJ*dp-~x$if^nPNF=%7oU$FE3;IWTm9Pkh2T)9DLbfx z)mT!gAe;Y=rW0_gI1nOi#7~rEgAMKm3^ULz-PhYP##0c=r2aG!qH$leBw* zxj3YS!+~lME**iOkR0RkKg89oZ5Bd9Z8gy2F;20iKjLC>bR6cKPCifmgzr)TzL|*A zOCa5Erb_<8`at@biwr2|ogOmKJSbLQk{y}e2bJfs3t!rKJj_rhZL;IiP`e#YdyKI& zIAfI`vXHzLi8P9nnh-3{ob#x!J<_Q)g#TQFAd;PtMM5sR?tXkq^*y&%LIYAFiGGfe z;a&^p z={{}C;<*h+g(0zV1!o&1MvKp1+f=!`=fZ-w!ZojENju-$r(q{AF*daJm+Hn=xW%7y%}5_(C_Wgp-rFVyn(sdH6XTlNiO7u z6|iL4+HydY|+LVNXuYt^$ypM~r&W}D2k&ZvwuyQL`e2z zKF(hfAI@*lRLryDq3jEM4#?FaH=bK8n?Y4G+#1Rv`c}<9r@iMoCJHKls1=cBr>v8e zv14AYkals)4DsKYkTg6F22WYGajWHZ8*k}3=I}v#Ao-cjNIlI@^iP# zTy=t&mVML;!?aZr4GHXL$Qph ztF*Mnp-VPE3)zNLbLbWy+s(pmkVdjWyk=nq z4!bE?2tCg(Fe1@rY20kk?1WNya<6Hn$K3gg7Iel+$25re=)OZ7PQQJ*9M z;*P_0o=uVMRqdr3<%X8E9rL+br+7(j^0U@5E!-Z@;fUQELOm544(d}mubp*@mBKW_ zkA#XYa&I{Bd^1P&d`A{d=5`jMpW7fqwmxWkCPa|OzDGfZla2E$lX~X?yNFhz#B-JK z1oQc05x2PcrUY$ZScKX|>QaR&Lgph8d`cE*JG_PrPw(8(QIdQsWL)>7C@noyZNj z-WySYu2one{rvEa4n4_Gk$ZNC2Pz#>l(=m95c9Z$D;LJUKe5Cy^i+$)g1j@@_sfHC)g0FjdD%2_uh@Jj=>Ehc$ zQg?kL;VfHmeEV3p^8%@rr;gFad2te?((bY{ob)aYQck>}@MBkxev>BjNlHmmxmEXG zuZLvs!qdc2Zix%(gy=fAq7ejElqOH z`TkHO!_RY7+%_&+k$hsT%rg%co#7{yPEm=i7PZtMmNhM?cG}dZSxe~#(?$B7{w&^u zQ@w#&boQR z-}>Z%*@tgx7M@LXmoK@(W5wnAYswQ_x@qEtV@2l-MvE7)#X)wFJ5mPC;`Nj? zlSKU~nswTKgi{Ab4=g;wf7LJxHK3zrayxMQF^BxfqQUHvJpJj{Bc^sD-*uKe9JuD&e;FgpFqhTU# zrV+&v{+3m9BXR;cdAFQUef}4Usr{*!a>+M93R>xDgzKhp~}n8npxJ2hwft^3#Yde>fP#m2X#E7VH} z3za$g-1{81v#s;-rc+(evJT9A$x!2>u(&2uqZ-q^LBx)Wq#p}WgJIWJi!_obHh7)J z%od;RiZl_ng_}AmD?6t_*{d!qM?s*D+$#cP@sr8QB+cVetqY-h>yuyv~Yc;bpC7R^6=~%gzIuCjZuh*J?stF zYxIO-G$Wyak>*`sCZr|OjPm9bE!JLboT)gLPIY2*xX4FVj&YusQPh%bvk*dQR(OzP z?e3H`Vx&JL9kC+2*s>y^!mflP^3MKj$f;gw8T*AoMv`-~%j|aPO_u0_hSVC8HpIQB z9h0Id?#q+y%xt2*qCqS$>DM4bd@``5jz6gE=OE68RD@g|-6y^dA2heA$7vHzcVwY&4A03Z9!tlmJ6i}9nv{Al+}5QXw8k#W z9?Jr6W1S()LdVqCwDoloA8T(hZAAIbXw}rNHI&S7rf0_3Ra_Buv9zOz;kmdaQ9pk; zv@xPqd(KS@Uqe{}0)4Z;*_-vLaFl(AQZ!H%BZ|>cC>q$fpSFI#s4wS9!}Z?L;+p0m z4SIB|>6>vb@t0i2Kyz_$5`KT=2AQ0=qOu%C%@_gA%U@3IaegmXA#y*k<<>m9N=+#r zV=a{=wI6-v>CqPU&a=AVR3YQ4AahXr27cx7rk2L;H=-%3_}vng>*m<+-@VPY@8Th$ zdH|DjSjj9P_UOHW0Z~nx(Cv#3S?l`6`wI`QI@i9HET~BMsB(*CO`Z8L1yi zv|(K+67>(u$*a76fx~QZ#2sZU-D&!?;Yhx?S?9`nVr!<5Q5LDOreSkq{a97Wl@WOl zD`e&(Cy#5WmO=8aoAng2pA&?%^V{rK&U1Ee2<)TvA^67PCrOVQ;~0FyM?0uP_o%4Z z^5)Et@Q+serOcweaEhautL7=ULXUh7GNiyZP;UP*mwDLTcX*GAkB$wD`RHG$XcpbJ zfN!GXqON@rXGOwUrR;BHtAw=jeR!N=T~kg9WzkM3wdnS?jb)5u3u*dMZ2^5I>#KLw zktNI5Hh0sPWERt4n8rg$Z|o52gbQZ^(vZ|P8=8l!2;32uKjsaZd`7m)u&QfWT?3TQ zsrZBuYi1D{dpA8MzirbODr1q8nk4^_F zNo6&zD++m8(b>exPV;R6qjj{K4cJFnJTNmTJwMzX=}t*vtuG57K4$WqJ61+U?%mk) ziF-3RUW)(HQllJCZ(w&hYzupyqexob+)d>qQAezE1X+9U@THAQ+f_<7`if^}fAT0F z4PL#hvqC5BXB+QKRcoKxYu$-nC8>cabE}FYpWf8TEtl0Qj?-FU=3+sw2pOr>*pHyh zxppChU#;$$7@MuB++m!#y!^+{HTt5X7!zKW!#RY&B+OfCPb_yd(Zv+E#3-PtN^Omk zBRqs^&`ILwNKYa02@wP@M!c(J#EaXEtC;Jlc)byI8i@ustVN%PY@BOCi_4*l{$wnc?feZ*sQ?p{3U zY2zLm$SECR`jid4&pYaL zYTNEuA(HCEzHZ^Ngjr6s-sacF`03`d*7aUnj+x%K$(88*No3D%soniMs*B`8?B4PR zTe2Tw-8$OVcc-stGHm&*am*q*Ig}fEdHt68N>2i#mR&q^ZSMVgY|Ik9H20C`7Kip} zR4ukd9^2}KIjK>cvn4@(`P&3dDaE5|XMFZ4r_D?6yBLvbn@}89)qeDGvhCOywrB8N zcB+SK^OWrLcN8^zDvX$b80iJg&i2}3CdeHHKK?bg$ID_*C(@+fTh`R}MwheV{KZUE5=^?@ z_~f9U9Ews`ZYw;V~BIlAQ1?&Asm+;gp#ZuI}m*(*r7hHcq8}tbPi@nkp7LKN` zvF?qY)u8^wDJ;rl0+JPd%}i!R?%f=LI`-Di!e`Zc?O7~`jW=icbz&wUZQhduT(N!& zvbAS_kGG=s`WtEaXKMHTm}{0i`+Y@CqW@BXqpa;w(!JOD-V;z5P5)+E(OT&zim1W{ zKdV>fmeOhJlHNJ>Ykay+3e21%#CDF=&0z%>r}bAfu6pHOmXxsU!yt7HIZmb5^@;q) zPTSs)3FzYLRI!tXPtZOd(tpkE{ZR3oIr{GE(=>FvPWzK2?bS=vb{T$pUS}b_ciGe4 z1=+%3{RbL)(DPaQ=KYj+Bh6c|H7?Ejz1DMU$(?uSF7K6oz430@ve!S|-}Hu(Bc6c`nn1p>?=R~fnHiN)M-_{&+g5kU5{1I zAkNet6xv_dhZEZ63|Tp;>@@GZ(w+#Z^%b`$0S)@p z{9GKME*Z9#8Ef4Z`!u0A`)EV!?S#aE&3MlEwIJ-(BMTjy2A&3J#|2Bfqc$xl-sA2V zU(hbGtNbmlCxUMq(Qw&VJgMfStXG4WyI}cG(sR)-*LdypfAUVud#$-3y{=Asljynz zGasznzK}3sy+ct<$T5lgTN5@~WjqYi3hwNAr?9B2b$@nL+x+|k`iF?KF3)|_lo=$s zAb)kAu5$l@eo~%r)$AX}93O8jRe5{+ebtTp!}aSJH6D*Hd^Ww;iw!w%L)?OTT+kS` zc8{Bo)7yDzt>FbD$M?J+H_9ts`8i>KckTK1#fv7O#_{ayEuWAz!r&j0l0Oz+pC2I8 zR@@iozT|>PrZU6p7x|5sFQnb{Or<1ddR$v}G5d4Zv4Wju@3bp^nQh6qcd4RM(vHC} z>q~z2%j}ky=jME@1g$7;>knI^M)%R1dE%p<0`kHu6HrX(ZsEQUKGF$WE=aHMe-G_x zD?UuuG4tUdhLWouJvjZ!<;iE?nECF{j(=WVH9P9DZGTUAOS$shG1QA?UIC{%F=J{; z#0dz5xOAKCQm`@cxO5?$)G6Fia&)XbRV>EwQ)Pio+Di|ipS<{<`|tG4s~!|^qK4C& z29&V-I;g)Iq#srGgSfg2ILDq$K#>MQyR><=X@1rfvtBLP&A2uq(|0Y&ciT~gy3aTE z9bHtf5tka2c<^3-vRsnlM|F#L*f%2~n0cuVH}_o1oPhEk9O~HfLapv`E$w-}+|@_U z$th<*Ytf2xPPYp?rrQt}cS!!|zK>e_I`rhV^b{r_`Ogu(4_$%~M;d4C+t9&!epXE5 z4%oEpUKy*aPOytwcw>djh~ftt>hr9f9TU(`3nw5$cj?*;5;dNuU9_jX9Gmsh-inmW zdR`uqZZAn8hGF(Qm*YCT<8WkSu+F7goo?HiM^eqBB;jz``-aPNp3`Kd#_~joUJYm- za>r-|*Ol65*TF&Qt*1tywVVViYnB-JLR2+}jt?4sQfmeEF`<+` zBgeG(5+-T%07A3GMWRDb;Y_UyZ_uv9)-3DhSWbiLhZ-Y^MAq|M2TrwG)|05L{MUXz z_rIqu*%;Qp%`?!9pQtpJJ@TNSlT!Y89b3kTOIW2{ET@WOkLI#&;Qd|L%vOUTJEZeG zh(ZvGlwP+aB|CD83U#hYNLi6hDp1w#8=vtWZ$0TQ*6`!Q1?=#Fy%#TYxF0KTct07o zXW8F|qZ6Y-IdwE>#tRFN=f8zXXZ{NAloSd|W4q>17 z=!L5n5JiXQyZ>B#f0@z*v`%GEWUr0>%SCrWf^#?U#s+Hpf4LT=u9AIZS2=C=F8N&* zZwjuclo&^rY#Q@E`boCw_}drvgjGFbmv%&aeEWH!)$yaWv?!SpNs(hVCC0L7Zv;W$ zZ@iikn@i8G>C_6*iDrb9UbkB#2)J9wGtS5*wv^o-bhhbYWy$Ikaoc-D{mBcsR7`pI z=Zq{(zRu9RE}t65_qf-r=WM$rRS$EhMLspoqzs@qsoo66)|Uhi+D?h#y4mQha*E9- zZs}A+ThVrj77I(R*}kC482K*=Lppa|ic<5wN@%`);v;uM@XL|>gZV#s+0PyNdAItu z=j`EM+!g1MBMBbYb;s@$3om6}6|dUanX^i zx$4m=#SflipFEg=cGgKOv(2epb+gygwMsLuSW)Qa4Xj-!VpUd$(k{dhjc7+gyru1@ zJ% zJrLU0jH8P!JTA*2y~B8iDSkY#o9lH~KADO;L20H|g|#Ab+9lR0c;(vUk->v2bw%hhDlTM3;K>fA2>cVJhL;DOEzy_;yK*Ru6e{*}F^ zBP$Q~2ROdnES95~85+E&YXGNFl{tP2u~+Giq$!PjO|$5{X-iZj`^Br(vAMDh+%#U% zKy|X0fXfQBaFNb0#CZ&ZH4^fJ(Ot+C64ILc)(04WYK0wEwrM|r3e^<>iL9E9xqlVCd+F+)w7iRYR<|DR z&mVnX;A5pLweo>o*Lmg>l|jqQcci}V%9Bsmy@2K!DoDQlWxo4Jn@ZBTWaQjav%vH3 zKYWQ~s4*tkG7_EoZn1ff%DZ3R^F(r#|l_Jj`Ot%nIo@h^ao+0M6yq64=zS@k|&7`4Uee%o< zk;{F+uhY5KHaGhz$*^F}YveWjb^qO&HcyRcZ;}r`tf;>j;oU9vjuC%>j@5PDNO=3` zUf;pS^|#12N4K21`}F=xx{)Kgfg^uGrDOGnZNak&EoVd*Wm##`o<82z0d{9DnPe2w7@X}G8;7zt%5=tmVpd%zHgt0tq zf*qbxj--_5sxu1d2q}AKm&^nrxS2^FvX{hb+IvV>g|KCusm|!0P4~yPgPr9IZ6(#Q zxkK84(osL`N+#~3_6v`FOf zvHW90{^xIM*oUK|b9ozBYN4}FI5~v-IhbM80#0Gp+H3fbe_b=SCsHbmx49@x(O)fI zd$>yXEpx9mvP_7%^^9OJL>V%$Eb~YTtd!O7Q|wz9hT^u`OI7Fjy>g~xcGde^kuG;T zIV@zpXvh)J_!>!~XNu-DyBb$y;oQB`89p~26PZFgx%8^kn*sYTq2}%E4m`@jt_gmx zQ@p%a@2c&k_2#>FRtlay?0M5@EE834_F#i5d+3D3@V@imw4#CLpfJn)LcBB;PZk>3 zaxdd>>)z2ju8M|>EE{3d^0_!{Oy_E*DRtBB_+q{d9)l!fRXvMGcftx}jd|??rr~PK zdr9F65vND`)VCxwjj4e5C>4aHYjPWwq-CmlyiE2@i+Gg2{Kp+H;?A9DFY!1<$#nllF#qFC~5d{hzm3epY2Ja=6nYhZjBmYPLd}DVUuBsT=3qd;XD~VP$pr9JnK$8mj?H081WakGcjku7X%Ag7^ zN@&+Y$)~Wf#Y7MEoUX=BQXbD`doP+!lwww@F)biM9PTw8nacyC3FvJaAh3T?3U=Z) zRSascsrPc1Q8lA!D%M1xbsSnrb9&P?cUDI4S<@z3QpT6daO*rj=Z$ms>2@}qQTEOS z)8o;3UaBcTK~}vN$E`@{(fT zop?_kDkQSIv1(sA`U4kRNU@kjI;kv`mBJ&0G0KPEx^N?REet~_e6C@5D{{3-wDR(W z%-&7NKxsooNK^9`tB!$}B2}uIlZK6CE$lOQLHf5IsCpaVO9~K`cpy_EKO;re&|^e%lZP z{tC?}vtdnJ`lcKl@A{=X{QkMouU5ApY5mc))N_Sx#lNUt^GTxbMmypom@A|AL?$w2 z%ft;cQ`n{Doj@@TdibC9IJhlyjQ!T(aIp@@;iHa%R76%bf? z)8s0tikyQ^s>jx880E8=Ns9cE=b>Vb!&M1)#?OYdjFqQ5mk*fYRqwU&lxkw6RPVAt zE*UjO|@8EG?fd)Hy9%;A2_JIY{cWq=PbJRS{$56ky0Xcc)Y=ZzY^? zUDk@%MKc0*8jRDx8&J1j(4KW#7ZK4m2))M?b{+*&%?M0leI(mUNzsUp8Wud3U?JLH zGrG@Yp=n9>v@AB>g3wSvqZpTGZK#E^dUz#UUrLch%idL*g||uIbVQvs4?iyI)!Z#z zwAV|z4Cj_-O3UgM6o=``M0cWlKY4B{A`v`9bvSAvPC_vkWI9obU@xhy$xI(4n$f6D zgt2mIoMs#jmyrh^Inf2oOfu|=v|18^tB)>5?`sbi_#R=<=gU;2}W z+m$FapUhBQ-j0%MDawrc*lMM^+wt369Gg1>P2~y~ndANGtF*h!L><8Uywrnha$+p& z6bdUgcr`}vZ_J4i?Vn4!+kUTI6vYW%5JH(`K6(e+XS9zK9X(AmeiOK?+HwV$}Egs z_03Lbu?OmHVN3&(QgWu&^O%cVGi%i2BWIMIx5)E4U9;04Pd3pJaLdVPmYIhvhD<`{ zR%cYI^^x&E<3*QxQfs@&^Qd^=_Ps1CGQ^luI0|fS0 zmu1B(1ZFh&XLk%O-kZ1oGwGmGP3^gm6_>TFxm#F`{GtaXxkCXTYInYCiYvJ(gXa&b zVXDNb#)W}*w8DI{*E)j)QV@9@U@kidi(52~9i4O3{Qm(0LH)i_OWj{E+Q3xN{(@T<6prlL zE+m>!yA%%PF{4MyxGF$Q4R=DJ&$0v~dnkB7rR&MItQ3t#(6vNvtc+}wghkZ^7Ln*Rses*B(McS~XwgZk(*~nKPTEXBH8C3~ z1tQ>5R*KQK>L}!-(qx3BdD@Y4tpp~P?L`#fQd5*`WKg}60C_|qN+bjXYx<=C*+c{% zD4moWs7TbA2V^@bNBRgLwuo9bl=6i38&NKxJE5(<=qr)b3Zn2nP!jL3DMZ}YDcw?K zCxC;V?YB)m+BQK^Zue5%!6+`vtb6|e1PN54N6Hh~Wq_2pB>@^g&`i4xkAL8lltU8+ zZSI2EFJ&)nm7Y;Olo24dtCcBe5pA$j$|-D_=%BALq9fYTu+O>%*09h!1VdZgC$PpE zPYP%&Ziamm2-$lCY&rEubSZRQ15XOKV*z`kVTc6?T1;9{^1?Pu$}IvQJ1FRzdu$Q3 zvexO9-dD;;M&Nc9p2DXnn@g{RG@j{^T!(aN1Oyx*^+iFlUT1a?X=}bn*v}})LniacHM|4}g z9>}C+XzxnS0#yOM&<3d_n~GN|PUSdC$N(jvEc=A+NIg!Z*<|wSA=wqw@(~oHlv1mW z`1Rzrg_Q{1E;;?3Qf^AlyD**>#@&;Eb_hqf3eY%Hw?-KFR^SUrSsk%kWE91XAImeE&Z)gdUmBa}2!4HVaQt307aG*g!#9Fn(EkVmz2 zcV82+fQLq(qJ8yEBrF)fR*-^zt3n*tp=%7zqBp}@;MYK@h zscMll%McG)YE(U5e))7Y*NJ;emal59|l8 zPt-DTj(<;Q-Lz^Y&N_pIf(3m?D0E@)v!mup~Y+;{5$3bANy+(`wt=8{{R$huP#5^^Kr&^BqA}LTMfR8=^5S! z$>{xKC#U#=Vbk&%1LejZQIKS~Y}T}cKoiOAx}FRBE9zb=&zJ6VwVf&_nBScCZKw;T zw(Z@%mX~ijRmw@a`4e%Rdnxx*^k1Z;{{Z33Cayle0dU|PVn6+5l7Idk`nYfGy1!3x z_APsV$fvY^Y(KZ>hhx_$2Dn4knXEs zgaivkrr@OqbZm-P5|(=_PbhMp%~p~MTK=hAcuGQKtnz_YX+XEx396i;cQ5pzo&ls|;cp&LLky>IJkPh7`Q*@d%WA6U|$!P=OWyJhv=(cxJT3{_3 zD;g{$9?I5&6xQ&}6t9nkTXT31=8crJhXZRs@{RWFl#-IgyCO&G zqe3n~FY`bi$~iy~1d@@--SDe%5 zuG*C%s;eoS%BnzqC3ES`zUWSrGCpQHkxX>wPOH3nncZYCX+gXrQ4NbiE>RPG}uxQB9U{0M(Z?_U4g=J z&z@RZ=YV%rx?g2Rt3uE8RcVFfSYG4FNofgE(?!VcKPXxLiWY(kW(6Bc5o=40G!lLg zHak**bg;S?Q_UbjhcUk8v_FdUI3H*IN@oweOAHO~zM_@NLwLk#eM<-I-vxv_Gcs9E z_*w%(^xZ$goeKzuGX^)fcazop)Luw$hvQ;oWIQ$qWRb_ST1xEWct5XX7WsWMBAvl- zq5N0fv73*M-7rHOW7(|%Y;Hgv$}b>%e+TTdu4Djael|V!bL@}MFGJJ5#>sg5_f>9_ z$ci(6sVnG>%LBT;Jk#!%dQUTf_Cew3h&eN5Pw}iYe+B9KciH!aF+dIJaY^3zYsB!!hahk<^lS!^-^g$JF6J&bPlOLE4;_`pnA$(daAV5%D^oKz z8>6)kPXzHd@U#!0TI0(0UQ#^mwku3|q@!W#*_-mNZeve%<)O)Qwzan&Q|^tX;`B_( zwRFpN>NKB`l^0}_bXzrKqO-r(W6nVcN^bVia`nN`#s77UEeso2Rd5pVL zFYyj5O6+}{^xy1{2z1;-r&pKeI)!fUSL?dqeWj6+;cUaKv_Tn|5NO*-HU3N4V`PmC z7yF?S`Pj<~*G{35l9%6gf%zaFRc^`^u}`um6M28iO=Ndm$umIi68-cM%3ECHb=x@Z zR5G-#47o(`RbPE`4&?r+_8*Ena?4w+&Yiv2H~T<1Q7b%|EO7i=rP{QZ>DD<6KE-0n z`?f<%XNEZ%c@Jnm&2nX&wCv@X+0=PQWoSB=hP*kOe|qShHe2rOW?$<|&278NC z9h*E?{6YT!CH2?k>~~q8lzr3fL*QLY?03XC!N(e0ETA|IkhGuFSMgqJFTh?V#V5_^ z*(46})5re+DJ%5UnMd7clPK?MyVBG0W?mjv8_ROBriIs4BMX0;p?;3FvYm8J;j1w+TI{ZY1(Dy`I{^ray5 zd{OHwQ+ZTl>`KxCiq{Bct3s>|mC?4vsjiGp(0!G$gt6_Q#-I6#GfCrR7K!iZp(g6*DvaQM7Xe!_7ZTt336pkXdO3wGf zoRqG++p=+nPdcJ<2V}Ln>3RAJ{;3cV?1)O7ZNwk4D&0St7;U)9zfBd5uS<^~;|Uvg zT4K6Xv{6^ZMMbWhCYD$MbEO)jT?qv=tVDPBK+7GifwspEEoFAkT?iYt>m04A3VTh( zqAyf-R(G<&qr$d3`@4?z5(;g1u#Kk1eFt=%&8<$L3ZRQSC$@P)H4>aOglH$Uv~=yI z^C%G?sDi1Ohq=xj&8>nzE2k4)xliy5o^}+L$SeA#*y>nr#OWP1&m&yzbeeB)E`|P! zso+kL7gNRS`EreN^z1LaM8YgM>uX6P*aK^aH1cIgUptGP!kbGQ1Eu<>)5fNdqnu7K zYrl2L@WWY?6NhI6C7~umNH$L2sy5Oy?3+(}LqVj$t^pfq6_%?bNo6})Xi^Rsxv6!f zEjMZ7kDEfuY@!%Zc&(9Z=u%`Mv=vev_C&almXK7Rl7p3JWB}a>(W7tbi3qoZ9zYwW zEM&@HE&*hcGTp}uY@59$Slv{vE?MP;MW#q>SlLioM=G}GxYcAR0arr{=5;ZomGtim zeV2^5BFpNTj4-?hHav57K3tv3LDIfj#<}hRpptt9-s!#)>peh&4jb6R`|^56@n3T3 zo*C&K9e`osL>xbT&D8JItEr#|6`IHI zxLN&5^qDb|30&EM9}7F3r=b!N#cY|gERJ<0^Azm#-r3cSoSy5O=KP}Beo_vooP~2| zKI@R#epQW}j_C(svmWa9PgGYGv-_27c?c(VJd;ZJ@(SRyBj%Oyr7LV zwXZ(Rn&7MB%lSrw(L*=N*A(&-JW=GF1${G&nYpvtAHJn`9iCTEe{CpqWc1ok7S zk96(oKP$&KIQy#yQ2zjl1*f3#E^D39oh)RBV@V!B`Z3|h_yW5P>YkepuvdzHTV{qx zo^7vbX$QC=Vdy-dq0f6m55^Nm@7kf5~-5Y0y1e z(qm6(?xYB-Ug;b^i9r4Lvin?_gCf>Sc$Wmz?|PKfJ1bXzoy2dSlf= zp5j^i?M)_ds=DlWK=#{H}4x1oEnU zo$Ue8lPBd;a(-7i^LAC4tCd00c0u=5yC?o7%`>WkJLYcbT{7!IK-^c`qEYGcGfm8yfcqYH$=! z3rU{Dj~S+$YY85ry3S=Wa@;7DTWKK>*)=Iio|Zy4D@Y261q1H2Ml1?RrZ8F+>=jC| z(Q4*}6}~Xd=iy(+9IDy@Dd^wImaxNg!1f3YxlYmDC8LpNJEG&h$~T@6XJBb?4|N0F zs^7bfaGAo=R{Nj`p>~$SXK}DffKn_fo_*DhRk$Y^)kl;x*m3NOhp|)l2;3&eKTZR< zNaW;fk;|dNh>lRS%@mb6Ji2{9c-*uQv-I=(Gwiie$1iVFihmfael69}bF!?B)v*2{ z?4r6cizaDwW|k}TQ5)Lm_90-D0P+GAV@xOZK>RFkr#zpPx*>5@@UaGvXVU32HF`|-;*58 zd@;)zY4Y0PM(hz_{)*gwn#`FrG=nGjf12;Vr1fsEg@crFJe+9YY%G*QK$A|}kT*Nk z{T7U$26g_6J3jLR;hF6^3mgeIwQPP=+?m?b;3#o%{7;30j$X#~HaiAulDBx<^41%& zr^UFPBM?OkIs~|xu#Yb#%*lCUp4U+{>#H8zFGb-`2hEMwA?bc6$INuQKMjz|TIi)T zLz+R;y>DyUc(?5Ds`ZZ$_^R|j&3{KO+B1%Vo%jB%)7~az6C3A<(;D%DWL@H zA0U7E1-f36*26wirMHW?%WA%Dd*2;&Dc{wb9$!gr6!`Im86n3I`Lt`yb6d9k$Xv(- zIZ&Kj?IIQ(PjebP$}~SQvR#^E$+yp>hFDt1OBrikH8hdwD|P64mL^pgF}Ci*7W5A29MpdC%5 z_Er;{Qj{lcxl%rPLUee>+ogRIMO#}cp5A@a*s)0){GngfCjjqiSF)|SGoDGMGa_rA zH4EJlxmH9i?fRsdkCwJZ$eX2r0K0x2@h*Qslz9&GF^RXp$uwSU#4OB;dkP1`u$eNh45%6n-*rzjVq&-ro)~kK#p?yJ&BJH? z*L{78n&#x<*O>Lvu6|1ax?LG5!odU{>lDK6EikiAJnhm-%1thwLqS~3h7rdI(G$#5 z&83;{Ay!{prJ`>WCv5AP=KP{1`9V5@Z=IEl$OF3Nwr#geCLM|i*KR_wxgl}9{kcpf zuy-g9-`<66Q@1bNt{9qt-7{xBiV5FtS@%}AFWjyRa!PSIR33n3{Hq(4^1SPEh)&$1 zJO2O`A?UvLE0jiJ^W!V!AHDC&1JJiNyQ~;Fh8(QOtkILqADG|xg1O@)`>Gu&8H|*7 zZh}9E{{S=-(mSXhbolw6Y|LpqmFN8b0F|Q>O)Zvl_*mKp^GykiYb=*l z9>R|6Q#y-}b>_0B4l&p#)(@ns*^y4zq#lrG*c+%b?~=F;$-d~Bw&gJI{qTFC_q*;F z1Y~@v=ht)xbY%Rg_k-@ZKYOA0ko({KNDk|=eo`Ej#rxmNS7naQKz4rfzbYJ__P9qV z9_Y6$4X)4~cVrT)GoN+LIbyj=a)l#7(K8Y`Rk}k*b4bPZ`S;=<EeAowXOzQvl&YN}wUFfBbcZdy&>LMXa;kKj?6Nx{r*xis zX#um%JlY~%_gwc+y#)mJfa}L7)B^K)E%+e80{kyXi@%xWB8D?0C3qM z_2jSPOS9fCNBBsSuSp9Uho2Ck3g>o|8r=gSP8K#_Jrty*?kT2a4S^BeG4(whqcG zd{>dCJ1d_vt@al}f9_2#bFR@Blx)U6f);5&4>Yvn{{VJ=izJp_Z3U*5w_H1NvyfbO z94#2{kW%7>`r%O2@~F7;%APBYD^84KH^jngZ=d?>!k4qhnW;@ZcvrZ6SO#h(8H@&ACUJe*29S2mppLH^CWps^23}ghgE_6 z7f&l1S#z+S!qEgp?s)D^Q)~4rR!ly78Z{P{xHu8;S4KP(%)8e%~u_7fVJS+LZ_KEm$qRUh8*%9P*SxHzMjjuDq3^c=VV7*ED~%=>PkJ<42EADCYs1iARqFUKwGk*&L}3IFxnzR z?y;AUp?N_!`JX?*5h3?n{{S`IC?4;0hMf~J_eHXmfIOa42@iA!MYHc66c`qQ(c*&s3ZK@$LD4s?8UO zI;>qWojtj;eaVK~5jGlrJCDh8Oohag%2cGS?Qn1;x`^O=s3i6(oEhegxdJJKLGhM6 zSL1Dszkpfo$$rmHi)B9OiM`6^>VLYL-R@NfK+JEI1jpTAE_ZbUo!ZbFpCKs>hL$q- z+M1q62n_~P?vu?u%FIi~;3O__Of`AOu|v-y_gIN`=d!H4go)4@2i-%GNab_2x|G&a z4Z?CerSpj!EJfs{^9b8?2E!ruRhOT2KzXG#6a$$LDLm49qn^*tEd=DuGrr z*dPfie4ydFBV+=Pl?L6^ara8+Y?^5#+^Pr!s~%NH;Z#K_0?>7qyVwLkAlWJ#(&6x% z4o|Idj|oT0Zs=0khJjA#5Q;|~E}B0P@50vpR!*1r9)4EG5y4pH?dfp+VJo_}F}S5y zC0!6U7Io2#Y7MxG=1AIc0d%gL@UTl>VJWn+qYPLpEX>mK3fGJ&roEPYmuh+VK(oQ1 zvjH8(=_M^M1-{EpF%6AZ<+a*}enJysh7v6%t18gjx>T0#hITAzBZPfUmL{}-^56mX zC>@YGUo3uMrdS00A)a%?^>0wdZZ}Ej7=3RtKO_L`xtL6EkAetrH&#EI`kzP1$!nh$ za~fi6z=n3ePdp}uU4oV~xZ+yO&(4`ttebU$`8YxE9J zaJy$dIugtR#BS#H_?0FwCs0NX@NGU1jv`wGzKSm18HwcGat*5u>r45YZNG~F!uHMH@`2AxrY80yb)TKT}IZdO5Jq5 zE^h+SoVU!!lqXfDI;%%ByrHt5Q`H?_e|!1 z6=A1Nt3kw+5Dl#>YSDWOK>11&gu7Cy?)FZ@VN~?dk)tVyv>_WElax8KR9i^IJ#G4^ zPUy4ox9Wsr?Wmo%Rk<e?+NEgmJc6|LhZ!;a_e~G7q z^a~CcV_Fa#k<;t4pK$uF(-=8S8a8t>_-Hr#jU0@U~Oq_r0{{WO(fCJlnUhAwH zmOuam)qJ3BZYNJ~mypO|fz0ytNa;w_)`C9`_qrQzSMsa-gdgBvVdx)a7@1u&8z-vd z6N3GS*z;AzD|;qbXU71qlB z<;UT2c`D;s5Z~m8_CZgTXCtAHv`tzXHnpD|e$Br{csnesSZ6B%Dz@%IwY5rGLr3&i zkCjwmS_fpBL)rd{SN;;96obyi3RE_7wm-zHZ{yuq5Cnu2JE$6fNj6o3e5aU#;4M~m z6cbHW^n`4S?)X8+u~dqRM$+cL;i)RStFh>^dcC73Wl_(`^{yajqLS0z#UqxC%iTa} zL9!Hopn{H{OZ*R7oU?S1>3CXY+wxfF?dfp+A~bHVX3B`cu(YsQQ0m0;Z3$T(27y;= zW80~OEJoYuJ&?NDjw&nn3meAeY{oXg7EGrA^GFM$AMWI;oc6X>79M$5Vs8=oRJt(N znl^%`ci}tkvz_jhgckx8C-|YBNW*54lA2m;YqYK9EA==~=du}P>G}sVsK(BX(pl4R zm`rSI<8m=KYYZIxbg?IyAj0EAd7F&c)q1RbNYS+eKfdY27uWb zLD20Wo<`qArY@x1jJ+uhJ;e5X@J1M?6z?kHDIVFzL;y~8zwmp}7uk|dpO4#$- z4qkxx-d$k+K^Cz5Gka|DuTjF6FQJ%x_~ckIVB5v4hr`9!uZTUnG*aIOLbr zJJ|mKHS_+z)~3kJ>BekG!y3ZUbnW$8hHP(@jD?MWv8U7t{i22bIjuUqN)sdU=ljzd z(-Dxg$w9;s=={d?zHj!<{F$GCC5??>Z=^KcY(MC}gDWty{5hG_4pY3?oY=gA-%))6 z(|5S7za{fOwP%LqV?DVZXwmp;sMoT*CaiD4t6w(mwqlUm`B@xn+SQHUy6AcwaZXFF zLWD7gxD(kK#XkEIpgvrHH*l!xxf@R*Ug-Y-W;Ygti+s(|oyD{QWmOiMBGPvV(d8Fz zEeWwFcB&rAuq_=n6l+bUN73n2xKh&H!l}a0nh=jlFW93H*+-4g<;aJGtpq#aJCJ87 zrYy1s%Ch6SXCKj2N*e78wm_Ydl4&KB%G7z@(m19m992d+Qj#jWs?Q0HBt6xz$fX9k z%y4rF4jd4H_CS=h#=Rd(@l=?RmgPid+h+qu^IN~$D2cziOZtW7M^Tx$!UnPs(fi(5 z)y?vN&YS)Z{h=LVcJ-siFdzQ_c9ec$7Wl^={{ZgN?eZ6p`{bwmANxXRv#LYp(A$vE zj)mFl{{Y)8Va_z8^9jG(EOAwfH_(v0S?Ur|tsk30KiUtWr${6I5wbcbynAN&(;v1Z z$MXrl+iY=P?vs9@c(}TQ{Ff3~AFFRlU+p=z-K2lY66ia;)nH4%yT9nXKlZH0 za_>;%WoYVh({#zbZ?NSqgS*=|#+SwfpZmY)oOsXw0N^D50NwupMdBmsv(tfbv%`QJ zD+g1`+xDmQ33NWsY&>A|Rnw*4{xA9~2a8@!e`m{o^MBEJ==z33&eAvqyBjYh&le-j zaqyMIZRy+MnF#*?@ab#o{{Thp4~M$c{USV%yJJN8o+4~coNEs)4$|OijXA&jhU?}` zpC?#zrF*FE3FUqF?Q5ywVfcHZKc%SQ_6$qY<^_p^t2Q1SH*lw)4XBVy3=#Ko}U!mL5`LTV<<25>|>$( z%>s!u0q(x9;vW!nyuOFh`kU}#%EifVp5ZG-wl%HR(e*EDLYZA&2Kd{8{hdT|p@)4*uSj$Zw^jA6FE$V%Q z0DsB<09Eu4wj5j|iQ%^4dZd#QOs6;i28m^Kj1)NhPW-8Sx?EB@YR==Qe;w^M*C&hm zrEDM{`akNcJ}~ONj6eGqGDvjaD#EHRsJ_E&Gd=7_f(7xP+*H7e|!o4 zYNOYBsO7yn{e-LMESb$bq2`cmC-~Fd^gr$XseE98^7H2?NONpW`pc_b%(Xz4P$?p}Z`z9iO4Mxe$$)no&<#8plJaWSpF%A)V6``@~Y| zVv5CQ(Ruc+{xAL6pG6inz;gcp?(bZ#doHG5_YPdavQe}ON0kC$%B45LJq`LRnAWKQGc2mYaidy2eos+7@%Ep3gWR@vjog{z`5M;k(;UyNDB9E~~ z&~wpBS;;j*pUpM^**t^F!JaOYPd2Or?DR_m$J z$NQgDcldFfc2yX2eJjd@iN?ya%F&uAfk0Xl9bS%hdfeuVwS%Pa^0&xFlkTw3+tlFt zLbqbHM%A7z{;NzuOQ!{+jn)il+l6DAXq8s?vKeIx?VM32>i9wT zsROVUrn0ZD`Vefgq~Yz zpzP-99hRP&*EO=3rSxs+Jg$1@tr;U%UdC==65MA&4b&QT-FIEBn9pH*W&~4S0k-~Y z%sKKm#Q5SZ4q%9x1HHaJS7s^XVUh7WL^Vg%>I!t0Zl^X;%D{7^jqPZ*2cO08S8FRO ze3wP{sF@sXVG-zP8(;BWZ#|4}P{nYO!NsP9&?2DHAnA~aMxq#;=DLPbfc+^au{TK&~d3C1*z zN=jl9o>j5Pj!IJ!k;&U5^}Co$Zh2~&oYG(Z{aBSPfWIoD47Fg36Qh> z6wTvw4U0vT;kzp_8LYc*0#V9Gvqalkpid*0nZ9-RIU9d0n@)rTYImf z_4H zkiyuQ2Fz#x4~>yH?Pr%fo+I+UZ`s#S#{>P!P~){|JFi(Eg}V2MdQV5`*?1mQT{1Ha zQW(ogX#<<~4QTwA=sh7CPw=Dj-|6!Xk@kO;4@di+Moo&Qwa&27@U!@@!ChCVXEUgY z!?L1?M%Tq{AOJ?)?AiTS)=;GX01Td!`SRZ1mb$Njx{P@NlfgEvA+6L2palRv02Hv~ zcpEfEPu-pRFV-cDJb+TV7C2F3NcmIvThEuT)9~+J=o4XT*BhH&;dvaG^b>3Lm)d87 z@Vd`L%F196WkD039MQ9=6G#15*Qlb4I_QRK^jOXPgFW=GJi%lI>7j4zS@a7$ofs(2{{XwL zV(RrGKJGrNl#^J1Y@kpg(PdKOqZ#xCV|hs%eJaMbw^`Phm~O0%sTsPtqJox?TH7hX zp-MAi9qf(jb-R+2K^tz8Q|zrgDrE-H3)|&DP#be-pcIuYH4kE|cXSmOaH~6RoLWbV zO*9GHbyL-~vaP{XNeu2EFRom#j!iihf|Ir+Yo=MM_ED*!1S z$Xc^4s0tKQ4T@DU(&;B>EzekbU+=AtGck?<_K^Y@(k{crG&QV zP}y74yqP@F8;f4j1BU@GSdKX0#f{QX^4qQ9+!_k(4LW3Gkrr3scleh*bJj=Gyho2x zIy#BO0aX3>3#(1i_lIl<1(jC0fusGX#%tj(1|y)==r_IlF5X;W&2VR;TNQrY)S=AJ zYhToHMuG_j&1}0-utHwfG&$~w@2idZT%7pc&ZCA6Ikas1uH-PtbvqpDZ<0&>JPYoS zaHkQr84IJg5&i|`{B!_rIS!{C%Reqxu6LXpF=%OKgLLZId0!s1>BbLds9)_p$F-}& z+g?9!95@SXTn&~c>{i&0!j|s*872c!+jRJ$n(Xu0B2Fi!4=#Z&*!V{74 z!O~Nax=1^xJf`Hxqy=1?0X!|RYo}!rL@~M@n-5$wLWK(Cc?5KXvD$;gTyK+@VdD67eO|3^D2u*tg2MC~TyQe*@igH0NB83G&{6%f)k%NOPkNCM*kETMWLRGOE zE34BVre=}Yu0&?a>h!|Vkig@yDQR*0i|jWn=KYxTXO@QO5=FOtFL1T**N6KaZWLc< zogzM;D`bpBT;LAvdx>+JeuS0l@uZROkV_tb2-CgZ%Sl{$Pc^AU6jYQ^MGz516toAD z`%TY}r}!JIODkUHx)T*N(YKu-{VcDJ;PyZ_D9=v`0)LnbrF#(V=pWbf_HO+ z!J+vAe!y+&d4nP07Vp`GNc#XM=7F8gcTw#K|*&3Bv6#8kPvc= zTe&D*ewWd6GjcqU8HnlCasmMzl-s75P1YqXb~=YZo2Tg#$j3bPYQS*h91vD_DC?Nj zQT`ykJ=9DCdJE1s9#*}!)#zM(AT082gl6g|_8@ze&I_TRUQ>Rno_-Q*1r~lVm+MKH zyMU!ij++k1*(fw@m<5|iW^%7)?X^=v($S;Di7UG!E6aLjRTH=a z_@#E~Cw88lJ$J9>s(W*MkEL@4%C~YAikB@Am%288qJkk6G1KWkh3jL*@UnD`^@YAc zzQJLix2eJOikq=oVLL4C04w1l_u)gU2B3D~W5{NqYgpVYbGuE1qiVMifmN1t$)~cj z4gUcC)mBq(Qd1*i8V6*q{8X&QVbV&e_p4HAq;qVQUYaTQyF`(s?YbFcQg%u}dz#W{ z6IP(z7J;pW{{VzI6ZBHgFHg1g%v^?atXIOh(-m@-gu8G3SN}T;SNTTwTVI>nC+*OTm;&llN(w`ZX(o*k22txh;9<+mRoOVr)%o zwZZ#9<5~smKwhQzxPzn3k<=!8as;7`V?}NLEB3vYCLWw5@%}UsW;K$GVqAMjFS+<$ zs!ola4m`3z$g?pbaC^sdzXH^z*Nx9$9Zw9z=V<`bN$2HvqmC@5hPOsMk-&8lPwfry z@K%2jK-YEL7RbXML1{d1r|0us*S1NS41HcXqhxRqjU!qHuUCI?klV((28PZ1cQL{; zS|}e?@P0m5l>0@7Mnj0^yc~BPJL;ip+v>rA`9miavXcp8NhAii@a?;W@0j`REzplhD-h>(x-sb+E{CJW#Wv43?ytv?072zdkZwW` z31bHKR4P`fHttpK6gC^GquNDl-Rn%5UQO;4V7-&Ob7d$rP?|4hl+lVz*R;3Pl#$s0 zU%DFdb3c`KTKaG=S#zIF5R=KoNJZzb(y5S*l zPDi>!N}?zNk;ckou2hOwBsJL=6riUVWK;N(l9>J^s^c17>M7ks;t|T1eltqPaH>3~ z8D@a;fZghMQJ;*fW?{-UhYv-_2Rl-ivYn79Cqo3k$kGp_o)viw(BbY@&X*m+(m6J> z^)2LS{Fd2aCL3cjw=F1Zh^ktmn6!d6Si#viG_Z8Xs_336>fI&IJv*pnVwX2dj54{F zK4`CZ;Xk$?6!bYs{?K-GZfja&%qBnp_BUg{b@CQTL0c5$IY_cs>Q0US0K_|`%40g8 zM~Sexz!$?Qwu{`+8|{9}=&*gScs5Wks`+I0d@uK|!}Izt!;Q!wiYsI}ZY~E=DR!_< z9CCi(f7)+^BYbUlTgP#cqCuwI8VI^14UKj?_FVk0wm%3(3*Q!WlD(}ZtPs3vJ%y3A zug1qL`;@0B`=xm+S@AJ`mS_I}5G{`uCP~sf+@T-sALnRkf54-+=DbgfzS?|2)!YUK zLFtf>+{ZLY`FAVhrzr4Bq4@>elB2b)arpdm&YpwB9w_SFZcTktsO4pmdVJ|itLP64 z&P@AA`4vum_Ct9j@e#(-AC)a3{75l8q;aN|2}<+nKSbhk^unrowDPKV3t02=0rI1e z_DpzGfCAL+pyQPfC?(je^JZf|#Ngl5uUqz;(eXMrQ^kt{FDf^~sld3nlcy6X6W+OiqO&0LeR!a9x!FAHf41VopQs_27!rl`f#uR}ho04sM> z;fnxO6%3j`#uBH1{?()93XZEs2)QUWm?>!%N5ZpGt-NlU=}TB`k>Mqd$bte(HKcQ` zHP}dh5&*R_P>40zFb8Cg*)y+{r<4FHvUg5OQ_5(debOhf-7Rlvq>fp-fvhJFau$=y z$JB`!)!M?meYw6z(y{m1BagDOtyV=VWkEN>P*Wsv)9C!a-E^J~>z&azk>Pcm-Ih7~ zdcPiT2*v>gTMd&+J*nUn<&&!z(!sXWvE=^%dAi%~vP=Voo>erZ#{7FGoB%ALh&^V} z%H8y&F2o~3&pSP4k;ZnHS7awP>r_=$D&Js`t-2`-h3tko6`OWeW4+Pk!2KR(mxH7H zTkw<{TY5B8wj^S_q-q~x5KbNh4nE1z!x?kKf`bMJ3%*Fn;wzN8~@p0kC%aUH0Jo)E|;qVzWi2aD$ z@}jx(!>!Y!4t?P=_W9ADsbS<~J`4cx>__S^V_k9G6Mew{044JuwMiUc>8+Xymr1FB z{7s>?{4cNd3=XJeoJl+YHxjf7>oB_>uIsdGXDR<_9-P-L9cvsl(g9 zgY5ZpMYvembQ}0W$ktsNTG}?HyVk;ZV3YgJ$8=cjBZXw_r`X+A)|V4uT53i?o9eBc zfHzde-`Wnz-0xA;fUZXe0062&g(Ft|f>I8o&{Ca(!Wu1D&q@fc+m&0Ku79ag;Dltd z2W)+lxbCZjY*U}aoO0*v4=G%IC)pB}{{V!h&M0z63sw=bMAW6hR^@x!-BRZJaH$lX zm2Nw$NL9EhWswhbg*ga!Z!`B?N^ra_O$*%b!UHr zn;*J>oE2TD9JyU_b6l7^epNb@1xlCdI>ONl&b5RadeH&(DXlpDw`~3ZR;tyqh1(P;#oVAutRHm?z0d@dyPgy!3qTtQBtC~%vLx=3Q&GFIsGHgd3#zU z)A4$L(Re=(GgnyY!?B&8%r9m3y4#DTy1Tr8^si&%V=uza{{Wf)0JFyVIe+)ObNpA$ z9r%hJlsl*wj`hRc5EP^R1p*Cz6HD`9Z@bz*iux2n@^TNesdx^OHFZp1{{Wib<`>Yh z!F00McN<*X-s7|5dagfQb>z3X#p62fH0;q)_8JLtQl+gCn*-oM5F0FE=gsxh=xq*(b&9p39VTw2!bX=RvK=C-n^ z+Q*Uj&$3EPU`Z%sMn|bzgnK8*APPb0lNpxeCfMn%?P$dS*%YXi+N3F_sCOkJhqBOP zwOiT(rdbj@E2Ype9huj%+8!i#=3`}e z{nnB!?eLo(Pfyr=V-GhU7pBi7v1Ob;Trr5JImd1+gWT7$>v$$_+2zjnYBSDU z)@*#eg|Jt$@?BS}bxb~)fsKV(5lZkevRc6<7WN|eTRI0=#K!6xKIAe@-rfIKuk<-9-s-Uua(n2Ml%}V%ZDkaFUJQA^tj!W1E1!! zMO&R;AC;~F`<$7&A(7a*jfL9Zz<%Pt&2#*D*7|-i8al%WtkLnnmBz0_-pz=NZor^Es0L z01wFcUnu)uY+AZ=nBpI#+b?bg>*`rE^ycLC7rUp+JOdDiNZ7@~;(abR+l|-GKG@`F z#_3q@gtkE4dh4|ftwuiHr^frfX%Qd=rLC~2Xs{NT>}e+!Bk!DsW~enk`-=OI*8d;;j*SVDIr!>q$F~2hDwjZM<;Sp6)>emMHNI+ zxmVn)9m1?~Q;hNh%AM3apnnp!V%|z&%2uKfM;s`iQNA^$I zR(}%F#ZgBo-9z}5GakwgLW(z(2YnD=){MU-`)&Br(;#X&1 z@Ltyt`U$>VO6TVG?fCxyTH^I%d9rWCENvFx2PCaMNZw?>RZcr~WJEpO0>#wzvqS#m z^6j*>aYxGZ8N#q6`UU5~qKG4x)qlPKdn{f3*1n|eSv+=GmXSy~S7ZMGdKDnuuCFg49xk)RRaJKD6ZSl|Yh*kR$9Z;SMXd7zdfZ%HBBa-=Talse^W1C^3t zZ6tEGvv3JnXSUzUmVt!Rt93IkSQpA{Hv;OlW?Ut~t{sw8o)lwHuzRfU9<8~xs~v|` z_Eky%kkS*BDRmlI+-R$vxwTB2rx@gn-St~7{XOlAso}`@OwDAiag1`|V`24Jahqjt z!fdYUcx{2rY^GL*mv9Y^QEM!xhu{1`6QaV#dvjS9Go+`)>B}UH(9(7_?YJwW(mKXm zeNFF~zGI>-A@AMKBX7n2Yl+wKq-Rf$DYJR-vOveh2x)A)4jSXA{)+yb%*=kJrHu0= zE*e?oZa3Ic#pdNF?bpJeKdAkp^%=|C10lm>oYzPibn7%nzt83FyZw7NGE65&=0)ZT zr=M4**Ut0A!|g{H%H2649U=h1>feIj(RyyEBofFn?-E}e<1Nx~f&hngb!P%xkt7-+L?car(`p;~6c{$JyrR29C_L$lw9->P%c069? zcu%%WnR3TUdz>8*j5K;^*aMa9db6X7IsDnOM6QCETJX^0V`nzE3&Z`d#}Ic*d~z^I zVg=Dg@>(_<(cr4X+o$9G=` zd_B@z)$%f<^F%@nX>u;E^fv4BT=sP0{;F_>LtOs=Rk(3LS|f*(c#8!?PoD~n^MGoqcHL{Hxg&dwA?;G_< zJ-69zZ%ygGJLwsnc6a0S*q--GBU)TXp}=ebJks|cZ@wq+mt5$bIu8p=B-6)|UnAWc z+BE4S_kiv~`3!pzX!RfaqfJ+-X^%Eo<8Yp<47f4NImvy;B=Vw%l@v76AQbGQP;R${ zLH^o^)zESN1$!JlvB&1TmxO`-(|ffN+heonxp}?2zCYE#&N{N>KPX@Vb72Gg zL;0o2-g!UfD&CiW+7M~ySXnwAyQmuJ(z^E8FE@LyMb%Ao*)QBu^LJ@Oj$Us0E>!6y zTbKU;cyg$0w2BZF_`}z-pc1rVejLuwk9LJZKcqi;77W{ zgx}g))0Pglj>#^1NL~mczcrI3rtfubH}~LnC0UadpW=aMh6fW#Ilk*di_L?mgHwbB>DO-#oZgw;BV=} z96TrV+=%irq%CAE$zd*OBXV5bzdBt$pVB90YvYTlVu_gMy2QjZ-vkmnEPY;HnJ-Sn zf;>5}%iPfEnEe74R>U-~Ptv+yOEXB%KP0uJ5i{7*Tszqt8u~1>@$=7557lFIe`EMu>Gclobtn-+Y1KQ1u#W#cu?bIflK0mP0w{{RK&y3b33Kea4KF=q|K zIN!FApI8<++O2wAzMYL6vwviDD2WbjM<^h?_w^0Gf_g>IdU?MP!#tg5rp*47U6Y~B zZnz%7pjGi(jhAnzmq(gUQ^PZlD!o%sXB&q!{{S_w#T_#*?|1>7N)IHsoleLtEi^W& z?iWw)okt%r{{Y$2GbU3F5Wv=YJ6Lh6`AXtnl51}pp7RGvo=i+uO@io)4G%lYH~6_O zZ*BNq8|{<(Ln9NWWc4O%1;vbDb@S>*)P$y-G|6GE#A5jt2o8)I7-VaMv`E zci7VT$J*W#qv`!BXtLWTGu%Ohww%|{vUl88$w{i~_`Z1~=CHQvmZln1FjWPtH}+@U zX&*z3)N^wr4tmVShdd4fe1UIuBN+jr#_FRip`ePS+#>VpD#)LEDqcNhS}bS1&?Oi1 zvH*_gW0U9~VGd#O^II!g_|7c09l;xas_%Her}Ug|snqiDu;Y$$*OKw{JbN!0_Epue zx<88K$m%&P$BEeQjjw*gQ6h!*;dZ=J*7|dy&T}(hd3ziiq2Sr1@%H)Ok$;_hYC=q; z{H^$A!sngc`L2c_^sTFZiro(d7iHRbz!Da%?hId!gRF7sBTq8Ie|)?grqBHM}QNuw1rvWSi$KD6hq3@(?I*|RzLvRwVIFg z6U04y(sLd77cEV_VVR%e2lH4n$dRrs-Ex>N&Z2#nMg~?L{G&cTvuVSVwbO?0#(t=y zFsa}5K}2c;WJbzf=yDKfHd--FxcwCh>|e%yifc|UZJa17&>twMcB89OQ_3X#r6mME znwEe+njgsk$PP(BlnFpX_>~!F_G9X=OVyYai95hh~T7gnT z{3|iVy;ij1HpwbzYmK{Zt?Ds@)5EWV7LJvS%$Z!*-3H#u-m!qlv0hkQ0BzA-JYN?q z@VUyzK533!UR?5`DtB0Ea+IPtQ1GDP2OYl&Sj@>j(4XcPt%GP94`95ngxl)OH^g=P zSE;(kzI`i`m+bH0`aImm<$pD0Xz30ksKG$~C7Ij3*Tt*4enWAy87rDx(Z~xoL)G9!t4}$(o%Kj8Efkxr7@vr$D|M>~ zStzQW+S(I?vJGlsSGiK&Cn$}S`XZ9yd!uLiC|x1}C{W(Xf?6nq0VNAX$#?va1dx#O ziQJ-@D|Z6WB^Q(r38sapN>gfH$Vps1T&`bI+F-h;epfH4l5!}mF>-vbs8xkaxgls9 zDqcNFz*H*A4n!u0N26~&9w~P_Zn&Kfe20A(aO|+p+t&EMNT`eKuE%H`EUuEz!n+nv zRV?eLA8v~{3qE52qq5Tx1X{(NCZnWqrP2C6BSkAR+G(enS@553uKxflZc~F}`s{|7 z`ens!$*Ztd>tCfjO*dDQ z0}{1ZgBuH` zOOu(4n>7 z=Qcvn;RCe*2`7sLiyQ8}*$*nV1kr!FO86pZB)!L1sDbI`#d|Ka*u6Y;C>f870M3byF}cwiYj`w3 z+mzx6q>g!I!fa2Cgb*9MsC$k_vM(Dc&0ja_Jue$Gr&m$x1U$y~Lg+zh4hFP2rojaL z3i;>TL>(k!^zXSb@aHwWc@1}p-tw%{Mi{_K&KS(WkXW^i1ZNKEQ)7AJH@1Gf85c2Elt!UXP9n+7)X+F9~ zH!d1^A!iYhW|q8}Y4m^~x0?#%485{4!5+!nbtiBZg;5IG)h}SHRT$QZ4K-1&j>)ph zGUUUtvam?qsdgMhoP?(dk7+g8IbKIE!OJ|YmB0ezrP9S<3|EXMGkqe{28Id%1y?Pv zhvQ|%Kaj_;OysffiAeG(-BX$W0Ctl90K%?urB+9(2?w}Ui=UIz&8bB*nWfZKuZXpc zH_riYx0h#^OQ*Dm7<+ECwBIU>EwLMCj>_9v*Q4?NqRAZQ*#FfQ6ibAcBD_h3Oli6C$ zf(U!7B5k$X8w#+0Rj&w08cP}oI}o+vo>}t!RGR=&?_oCjFejTe`mRxXD@lll4(qv% z9-fB*AHAsm0P__7PmE$dKbrGdL;d0EvBJ~T8&m#EF`xqFj;j#^!i4S=D$F}8@qZEe zDmhv)fet@KoomJRYH8S_g@06m+l8HVfhq;omPoOpg{Kx731B3;`A9P%ApZck!(UVW zsM{-^oaZ-44!%-a>izQ^jqo9_`JMi#J1ZE2{^Y^*aZGoPRoaWD>Kq}5zF;wci}3qta?Bejw*^Gb}A|@2g==q27<9Jh9hb< z6i0i*Q2DuXG#w{G*Wwy%QbuTz5vuoDIwRi*neh@GKw8(-$?}V&Ai2>M?tDM^Kl1aw zNBpk}f+#N@yD>xEF#IJc*HwKx32irv-m6I$F@>7X54 zt|l}RWXL0lrOx(U&k~!)hP}$k;fCK(cf$%$qXF>OQIb+iBWp?IyZ#)Z{s(&t{++Dv`C}e7Kt-VFw@wx*agU(uCNhEe9cJ z54vzt0BtZqiea)|$bx{EWlqQw@PR=ACiX|Z>I3eE;V?&?&;%&sx=?Kh5>jvZrvuxR z9r4*w0B+%Ox}Nzv9?Pf-SyF`Cn5i-}sY*?yG+#R5B8oDkFqabb2TK>+)Tx zisJNd`_23=(}mi@H>dG`<7RfnG(_ta%8~>i1jrORarWxQeIR#PGCePH*9hBwRT2X z481Gf(IS&HZY@cMmRhD%Vl-CnoH5_ka9N)ukzu-K3FMFQF`9;=K0va$aXgogW!UKR z!;RK(CdkD5>@mv6KOXDM0E=(u!Wi>?Zl9`Ohtq}+O>aZ$v&{26eq4^p*X8>3Q34ctJ6CKhpOB?a3*lV!97rf|?$7I=T zgD=c&fY!a&pw{4DZWZBVuaf4*_4EG#_mx9e`)v`57~12C;XJN8y}E{g(e4f3)p}~# zct{x-`%!6|ImU17=NRI>A^x#@cd7^f0NA~p@;QtqJuV~nPx4(@XC^zYT=DZH68Cw< zzFVtJ>)Nl|-7E%gDaRqL58Qy$dn_%;%9E%zBGVg0MfE^}Zh$BF?5>5g!2`*i*)9Ok zpf~!gza*osoP3OI$8;$lgNp;QJ>(bnkon z)gP+n%FTFspXr;QBOSgf)31eNTWmM7q6Y$Ng|7W7A8n7P4?GbmRY3AC*6i4|0!L-e zZpB<-pSFucRqmv5mjqoKlS-L4DGNs-83Agn5>+wCz1EmX(yD7LD~F}2kt8>3JfU7_ zgYKw)+e+F0;R*-*=X}D^626){oSQn5@M1unmZA)a6(T*h*SdUAGI7*>U6P*O#eMCtQ3d-BR;D->#dz!Xp$!X0KyUJ0w+pL z;Fb;m9F#iQ{{VPr{GnCS=klg-CbbQ|sBz`?bTi_{bZ#&-waq)ONi}P!lPl$>Fj+l^ zb;_BKWQDRcwZo88EUQCb{^2qFmKOdMxq`ZMp2Vze00HcX=;QPYHfQcFPFZsQ02@_8 z<@&QZ1}1k10qIpap7FSOlr^_De1~An-2g>V2-T2znWO3W*3~7z}>$fFN zwn$}Z*3!}i6)@wxM-BNEvahI2B5X!dbPh+l_C7v+cw~9p`0tV994OKQa-MqgU#IZd zucAT9^Kx}!hlD?MGG5A89-G5<-j^XA=L7gIj#Q8Gr(@$F4jp`~J{}+TTL-+v{{R5G zolMpvhq~j>?Ou-;);LSK;Sf%Aq<#?1{{U6Ps$Ks82?OWk5&jYU)K;#CiXEmX8`zRn zUJ)9zWk2x$0Gd83KAcc_-}6>@Ex)zMKSYDt;>6ZtIM(E=3mP%_38MqEUrc<#AU^M;vqV4%XzlZ_KhgLq_IL_-XYqdGs>=p6wJ=RIC-D+EGaOlX@ z)5w#{ipO=$>EM@I(U{}u2{yygp_14_%P6O-fenx`z13M89l1f}=m7NEs$xh2)t~rc z>g`o7<8;{2fK$TlbVHRFTKKh={{VM$ zrDziB)8(5UtL11f>-B-ya!%It@yYFs)&3wU~L{IjH+?;$W#)}F5bTU~wbqdl(_jStaX7zY-ywAM! z-zALzFfreUeaYI&o5^*dek|O-;qPISI~T6sQtGkq5iMwK?e1DQ`lE@TjL4k+kDAwO zE)MgYK)y*A?!Iu|snRgIlO)I)8CdRSmbkpMgV=5SxLRfE9XfbUoO!WJNw&56ffcbf zrsSFNru@A}R>*<93o9QxFV2X^=7~3XYxN3er;DZY&$q1XXY{NHF|f7jb6j$WBTYB( zv>q?N(Rvqk9C&;=B(Ov#$0JFGNqnLtKfSfs1G@450B$)QLn|MrK4|{$gXs~(T-R&# z?CTqp<#qf{DLJuxs~y_~t+z`Y14`K*;Zy2y^ylTtP9w2g_kK02I>fsygc2=WVV}0_ zSB)c5(I6GF=D_0DdbnD|n;&%2%{@}i2^=ftHa?1wsf}F`2Je*a;H=bI>$Q7*VEd*- z53NFhu}X*XtdLPv6KITc29*dwyzGhFl~Ko$O?F8C0K#jO&PopA`znrn{W;lqa#x%; z+Q{}@9joKzY;I?IMcv_2v1kcEk$)D@k5kWPZ*#i^(lm6hN8@9x zcHrmBd1)Tn)m+yr({$sjq~Z(WCWYpuKa1$S7fJsB@a%v20_OSu09fDQd#(>&X>Pr$ z*PpLS^*w!qP}O0i?!4|>SlQj>f*IHq$HzC0-8tXorB3`Pw}6q{Qe|fm+=ZhQ`pU|8 zD^4flKSdS47q+p&jNW+v0OkpRQZfGVAJt`Db*HR<-bH_eD!Ngwp%dv$OA z&Lnqo%s5wX{hZPN020m-9ejR{vE}~&c+aBKYc5g!qkf8@=K832;V3jB?ht1SNaRlF z_T2%=MN%62T?~Rxw#%sqBn6YCV+UhPEt?05?7BFOx3=$cqn35i@!h&2XJbat(^`)E zE>~WZmo!n>Zo0V;mxgWzli#}I_4z}mcwiMvzlQ$+(~eGGy>K3vx@RQrxw7`x5j-K; z8bI>1tB+gZ+HXw9vCNJ(w{=tg?YFwk(3%HL!}q5j;;-t)pabP`=k~8hkLw(ASAW8K zS~4AeuFKDxUXQ|2w6a$dzMv1$O=!2pNA|D_{nA$71hUyXz1+F}D%&Oz{{RZ>_$|6{ zBybjWq#nygm|CR6_5dDMXXVQ1L2L$v5x(V2oSA&KlMQ#EP#Px{8$s?u@V+|#0P)K9 zjiGxStht)TlMv@>E5dlbN6FVEbc0FK(L?Bk@%wR!-4RJf=#S!?ssTh54(WhGz#ByY z$|wNjd+vgV@gUN-wKq_FrFSSK=aPrTs0QIfcBv^yjfzrJwEzjBxot1AkRhd9XvH+qAR5$dW`^B!=7An^dq@UZ@!tTZe zEHipP8|ban6>)DR@T`-RAlcRwI`Q_})kakw7MT4));Z6pg)Np~Z1tvg>KAJ^C2|${ z4-9C&N=c2jyazbIh&M*3GH9NZ+?Mx3#!V zVe+MWT;Ks3Xa{#D{ue!Ym4szI{{UzWn=dHiWE^(}HIMSdjySs=PH^3qTIz0g&D zFH-6-bqM6>`0Wx8#L^l_+keC=sXk=6zGRNfj8mJa0>R(D%azs~Cd$Qh(>EE+0kqcs zKbrplH0~vmyhS&dT^`3#Z3L6A+oZ@QcZVjOlQpwAn7prd`%r5`FhtUS zy@r73!zeMjc=qLXUp6y321IXzTl?g_rQ{CH4!?he=f2U)B5pJg#}j}JbLV8HO+>V9 zxEm_P)A6VMNb#&AYg*#np<-=Stq~DhEnem~!!BC^arab~4Ll~yeIJ!nGHP!-s%4k8 zWt-Z)yN%Kx#F{c~G*uFf&$^^EtumeWRabRPX$ALJ#3&_ZpUqfmwoEILwhGMgM{X9U z6+_18jB`~OYci` z1@!kZ+=H^s)d_ZK`UO$JlH6wj1a0nZSgXbt6Af?*blsdEP&ARr-9c7DZE0P)t>swm z0rh-?m#WjqNFOu&n*HKlS1M^+nCV`C@ zVDwhhytJf-yfxHmdY+YMr(@aQKwKZ{H^g@QFLlcC8)^_wHoV?>Yuv{V#Z*_R@faRc zZ{2yEh=G8}(rg|U96#~3^4|WMb5q9C+L^&8GW*4ANq@syDPdzaOWNBe`M!Z{oU%()Ov{AW=r{$?du&?ykqS6B5)zVRW6rGj@;6H()k`N zhr#Ar`j3IW&au2n;O?#0GP9+}b`g_IYyzF4F#YfAOXJ;f(6b@z@Saadi zEjQxJaBp;|soitd(d{}zNW;S&yt03aezE=2eyVicv9SQ{2vzlxbg+F_CHC~N@f@|) z==gbaMCap5*w{@FZ*|ER-Fklw+c17hiBVSP^+>0NX0s|l_vzS!doNw!nEwFm@K1M= zysuwB_JJPF3)y%rntF6QekT+BQV&-4if+oen$q@)?yZz=)l|3Uw0xl{Ga6qW!mqJjbuX%8vS!b8Fd8)`dl$O}=)q`apD*2z;3WDpyz(vw9ox=7^70o`%) zzwZvE*Azpnw!@{>@-I$yH4 zFxhXiOji20?yk*l!`LBn(J+tg3QX4$@;fVW8KtG(>po+FcRQeEd=fruy0D#<5uL)h z-IX)iYACR{%^7R7J5Z;4Zj_opIC-(^X)Uo}cT$Y+hu8X}%vexH_DL*{d~R&Auni)& z*mf%LF{8+k7kQqb3z=jQ?g?3X!zOP{#EH?Ic;hSulC{lqMQkYUKQ*@<=UW=cH8ePG z;rPA{a=EL{u0)_S#}J4lsC*@ zjOb?K&ij2o(Rx@~4p1T>`E_k={s|RxI_qFA#5qxyusCRN1cCXj(Z{M;1TJuBj>!an zn!m&!e1c49n-p_I`2l=o^jrEXC&$G5#JcA(X^81-qCTUw4ZqC=wrJqWn-@Kgn;r<_ z$8?U4S@ajzu-p~ne0pOsVu&Sphz9A21d$9&<2sU1$g^!@$R`J#>Q5Nb_Aa56J^vzY__v@1*_S|CqFow z`l=#z8w+k*0SgHlPU@mEzE-it+@=PK5fP_kdF4`eN0H5{Zum_v;sIA)$YnqpSFzUG zDxD_#s{p2eQzUuzNvqvQo7qwJGt90? z-bwaW9uf{5t%;gFHl3o}2Xd5f6}YX{kjwW~gx*p!&gyN^EPs^7f-G{JM(s^Hm4iTO zx=J3=xL(FSo>jZ5XN)zkB$Kxb*x;Wpq+`7BA|J_l38c0-0mxp`IR60bNQGJQhToF% z{{Yl)r=jqFZa0Z&;IYGdcFWJkf81nmxn7gRjjSj}< z^%UL=bxhAgB|A>a$REUIpxQ7-RbNt(POoR!5@eU+^<2?bv^r?n9$Xq&ilrn8|uZ> zXObNG3jt_zXt*9nveV*@hc8b1gb{TtEU9v#Za^3_d5wrTA4|yn;oN-|9;D!NWYjnm zxLHq;viXp>w1Ha{-@z=y8sX;q(a*-pf+xq2;B=qflXLWMKf!U=S{cELR^&-V%qLUZ zs?YkaNLhTJHC$eW1InGz0^Q2vuFPKRr?#VkzRB}qB^c}i;NaPdz*OhYhoeWn`iM`JM0L3b9cU>d93CARHu}daEW`j6k4_lCL5coo9=E_1}W*%A-ld!71}+i`nSXp1}~v;7p! zD0M@QQ*M+5L9{FZ_e3CeL>-U?DLc|6r95(gHi0~#K2Rrg!V;zKrQZl_gpFS4_TdXn z+ip`JcL7)3JB{$Ga%6_JE>%Cp zgyrd6dyup^Q7V|3=?SJJQW9am9H|Rr`|dc2q0$$(NG7b_%C?#|tY{NvW3$Z=>UbV$ z;hXdMDQBOj*}CpNc#j?3PDZ+R%FtLQ5_yKWzU!@vjhqLYBVdOd%VQi78EG8bZrgvV z#nq#Z2s(5FA-R)BAoAoehM%e3dLEaDj{N30<(WF0oY!cG>KA)@jc&PKb-H;hkvqQ9 zaGe$~0$5%&>)DOF*q(j9SEPeO^2=Qp-GiT`xPk*uxe4<6H&Dy_O~oz$0KCPF`CeE@ z8k#ph1cPhRONE^AAc;X)`grQt&3L{CBzL0vKH}{hXJv9rpG+FE94L z223+!dHK<0lUkm~7g^FfmGrF4ex&T4trQqL{n6rCG_|4az1?S#^xb^t?P?4kGXQk< zc3rgLL+7`8YSSranNhh-Bx!T-qZR$UV zWr`MR_*E01vqb7UcUPVkc8^f*wbir*No0`vlCaXYMiB3XSsPjz)3w&278N1Xtp>-{ zG}Uh8s-O5(hw&tL;iTg%l`~>daor$3qq>hOoOuJ!vPPd+P?V2xX%w5EKTWP8jRnJ- z)0F=Js_a1G=2={P#-F^oTyWOxbF(P&+po=7d#bTN3pf4MbI|SJ`l)vTR_%hZ$sMpw zbcb-OJgZ4n5{6j=zEU1jl&FmA0H9LT3etou(=95Ag@T-CoKx8^YWYq$O3~|9!DVc% z$04#=?2v30v5sNGhbB##DLQ{GmYhF$%bUhEW2Og$45w-d9`MF$01!};L#{9m#d=+y ze^Wi~tEyj1>Cpqz@pTXUHva%6^C_GIPrCZP3o8p8AN;oe043&ssNbu*;eOs{#tjUD zFKb>g&!BymvhmZj#TEA}#A+@&KqWtq{{S2=Z@RfTN)F*$DGqgM4WU~qLRrP}-NOOO z(}}f@&1YJ12dMi}#=7`@wW--aipsm-1PUr1Qw6jfqmV*s5|zo4+9GK}!;$^-mj3IX zKJvL~i<_U&9#B1zf8#*%t;t1oI(#LVqEo}p%al1D>(k20!^VY;+zKnF%1adMvDApb&UmEXHV^!?!CRkvwep zy{R0O(F>8IfxWAGH>^V_JirouGY=Cknlq=K1 z3`t53$-8zy?t%ml$}S?1JRvDc0emTFcT5c^HVB0XK@~(CmeU|R1<0HMGuL06Tx_53 z-ab{w2h8;s1zen~K~+k3RI+fHDj@-<1lCJW%I~$njhCOo{{Xx)*Lo$6ZvOy_=DxxWq_;6)1tU339Z#KJ6pm{TCl50M>Nv_RpNRia|#*GrvQeZ zp~fNYKH*cCdj!}E##^XMpNws2OynsJ-d@ZHoSbhu(x znd51q=2+AL99XrJmC)#tOCMRlel|ODr)=yoz~N#?Y828vj|oy&mAHG z4@`WmCFQQLE4A*uhlVh*rOA<)_*W2q*=`5%S8_SqdR$KtOOrEtY@K5TxUmWK7$bI{ zGjCHb^w@?n+@7vRVn)W>_!px60Q-{=9EG&4qraW=CQ2oI`t@!x6I61lUl4|>pFXF6B!G#>GjtQFCTl*J9 zs18Ms)nb1`c*~kuI+lkBu1NHqneDL$^Iqmi!-*lpI<`K`&wtso^<1ALTXTTXBkj!( zBZiZ~`XiHzt=m36Y_+G&I=4)m9-}-xR~@jk8b>q+lH$O3Z#xt3Yv$i=GvygNai17t zVRT@FR^zNywA=wE)H?}g9mC9XeohRXz@-j>k!_Fpsme1|2uxKd`y-!O{u zn(GY}V!oU%dF}0dJom{TClA!?TOfbz);%o^1RE;oPU_zNG&38mwQC~<3R<$CpjlW% zmQ5;7SIWWowpX-}sg8=YAv;MNs&E8*AmNTtEVXp@&IUYXl~hZyTzf zu6F9Tk4mV=KTP2Ak?FgXuK7*Hkqs#u+Svhcu$1hSH&eL)`;|;{^yp2I5ND)s^jy4# zHSaFfSMat$jS-Tj$!>rx&S<*-0IH)dCbhAcnISG4*riT872@qE0P1afEi!jhVl;=H zh@h^22z7A%Rh|`YDV}y!I?%cWR^;bouG}Wdk;o(6DLbK^6jFkX?y3-~r543#7KDS) zRU;-r!Yvk3jgv>p7%gOOk?f8!ZgBt)mFm1_irg$dlZM_SgY`GR@mV|(fO7h~W^f)< z15x_+UGE>@bhn?X$1?+EaBtzgm2%B_J|w$Zu&6luEQ0NA$8MIk=n}bWvy0nR z3qyql=qPtYJfVB2P;v&qlq>qB4=Nz26gfi zmo@kXCxFr=)Y|W1c5r)ha?t2sw96K~Ar$Y)aXJi5Zdqvk(7g+p>f^HF`JeK-zCZkL zE1GK|{{U4*o3*zlHW}Y!-Kuo6Rb75-*5bdyI5{WsswDL^g1pW_E|8aRy7f~vtYeMr z0`oawYc<%cdGF}>=ay5-(bJo&I~)P~KH_|_wfG371Xm!5@48z*(Lz$s^ic&4Hlf%Y7EJmK`><7h7p8gf=>)HXJsR^5=4fc-$1& z&#_8oRRov%RfIttZ*+!hbdXWQ*t_bNHP-4vGW4P?-mI5mDOHd7%Duollr#M+AQBf> z!uWYPz9i|G*i*M3DoNvHQn=|1ad4x51#HR|y{W3i4hG)*n!Pm82U*SAmFIV9l*bZ)M-p4j#K$1HoMn@DqkMLhC&4(W& z`!IAaqH-m3*cxTj(ni`{zaN_SUKZ*-Ol9SV#K&bubWHgOYiFUb6geLr>j`z2hmFmJ zxOKn$HajyPBkgOaxXI-ag(+)DH!H29O?(SC@V(wIP>NRm(XWNz(PV;%{Wf15>s@Cx zziHhnNO7G6=Nd@k0j1&2uuEOW#0Bh!iL%UsKBd!}6JG5uCczBvx9Yku<+#TWH^;YH z{+_R^bqsthE-q`bc#VMiooD%fqUQeqY>B0w8E{NRq_xj;g@4UsxAFK~zY^y3jDC#h z@uZ7flw)wWX*c{A0QJ7PuOe1P*_-9qXoyfBU-Kz)a@%w`em?Qtil*yFAMddA&W`yq zp^8%cs}@E6FnKk~`48K7ko@cyN0jWTT^_eeTc?q@{a4YV>YgFac55PzJYgOjl;IyO zz4s@T^N+S}qluW#mT_?%1DP0O-(a=W(NsPE0O+!hSK?#WmOg0Ev_-HbVPv-P?6${7 zJ(WG|YbJRmqkWcGH*s4sTdlR-XAzd{Q$}9IY*oWxstvVhJSrtmy+sQu*NsI~2nnW@ z$(zEBEj*^|h)T=1RlVCF=TTKX#+64tbT5>SQn`5|pb5CHQ-l&^M7q-%SC91G!UU;&^~O-(Y>jVfhukkR^D2XtOnOQ+z+lO~;B zuVu1Mh}OGsX+^7kgXI`t9xs?U~AlIDS4>z@~jdO72%!TFTu zuXKqx>R5;W08mq9RMLr~guLE|eRo*pgB`&B&M*C;Ym+ynJ;aWoi~j(3N8bh~w-XBkpA_qPYSxaQ_( zaIR2ebvzGqOGuI#Ttv+*C-bR2*-fjg;6c0mEj%iErn`=SaCR_7>3>VQXN2^xBK`2ltaucGAi(f;x~F4c0f$=&h2 z5yqI48+Riw;Zqz}Djk@#uu-z9k>JTkgwKATs;SK`ZlpC^hz_EADVS)0cukE#pD8l; zaQY;z_zY(YpsUI{pY%zFNRie%rpY0;ns23WoyaQZ5(dj8B>98oYba(?OLAZnI&lQiz(d^P7+JsKu~oeRHzry)eRM9)dn83>^EQ{0{YfwK2n&y{moMF_R_dJQ-$ld6Bm>M2_mQh*s zpVPPEez0>g7)%2n3s^3MIFeoe05yM-ljTnYVc6YTGU*~A;whbNY2~i}07b#;`MD12 zFurDqCL>D#sK6c0)DykHM&|}Otke6?9;5UHC3TLJxdvC{GJNkgKf9U*?r>@1>}=nu z_g+Wsl5CTogBD4Nq9{We*qQ@Kq3YY4_g!pU%wZQ(0tdb34@rF5T6Y&sqp19C!t$O! zo+;+U4H~Cw2BIv`p+QzY+wjljE6KyVg{{##hr-DbqqyB@99q@sVM#QBrDyYXy11n> z>{Tl9>s6{Oua<^7jVJBOszJr5-e@4UFL4KDU4l`N5=vS$nr#~09a|vQl^?L(5jLrJ zDO@&8?oyLsRAHL9#R8T804dq{e>ATOoVhFQvRdw)$sC(Hal+?IC+&&7!CS#xshoWB zepO>O!)@xN6$qz}n^vhgHA&Hxe@%&^@~+qUcI5fe90W0-d>S!RrG*s~u* zmaJw+yc=77>o$U3-PJJS$X%$`j_O)4M=RL!Eb^@ryUZUeM3~LZyb0xfWX9Qgabri~WgA~8m}r&lJc2^gjh>$r$?{zSyxA-bcs5nz=~Ed z-5p7}-Hx5&KAn!hC+Vg~cQy*?#p6Df&%@JR&-p`EG2m=~Byh@w%x>4c+E@4^IiZ2F zKnVf%F6YQ64ktZXey`xBmc0{{U6RcY?Z)o29-}fF7b9 z!piRobtcAKVQpU2;ksYM{JlebW70<_Ab;pqH^to{$9be5Ru$vq@W)eOXgIDeJ%I+5 zXT!ZmTbeOmbn-w(u`e%g{?v45^Oi@|j{g8eAL1^M?S^Ad)u;Uzf_FvFY#e~H^LdzH)Tjb?^S&9&@X>{nYO5!n%9knkH3 z)IsjN-f2I0kX`OpakW*d${>POZXYS5Y1BTdlO6twFREe>{{S#Au=J2`{{Tw)00%+% zz8^tt^?X7902p6Yz@Av8rbgE^jmcQ#=yXQUf7MKJv(L)J+~6gVuVaDdWp*}9PYwa# z8{nx9UyAnd&T02>AN;|5v3*0v&kgXj^hc^jkK(>y6ON8AO9#Smt8Ln}1f4K>Lu7j; za%)E^Wke7J6&!#xg`eoAL-bH?fIjL3B?^Od3E2>PAP)sXR0rJxH`xS-gq89U{ZzCN zcS`D_oEu8wDKc}Kqqb41J!t09PbwYwQ?ejzfYH;O zX{!n~weo`;05|N54eqmcVpomTdd`y2w7gq3Ssv0pEel&8}8?O*!&e1O`tO#solXfyJ+JY0^hyWLL7+48ihK z;f<$J9-BLR-L8H%GpF%CmyTq7W(`6n#AJMi_Mkss$zOoxmrB;WIpNgc9kBSN2y~eQ z(#~Xxa~3OoGfLOC#?~87BJbf_0fQ$VXFR+}0THpWkIK#aTF;4*jf2$j@^bOnlGZrs zf$?i(j;b1ki>qBOnCHgK;~z|Grf`vk&xOQBJC^%bzhsMVF(i@^me{0@IP@J%t0lWx z-Eh2Rk1hsmQDnejlt$Z)+YzwrugcDDH&V?HYxNk+ZSB3UHJ>b#&L1m_jQ|Nff~;lR zvyTmVROjlH5Vu6zjI6N7xFu>1(#t$89eAo3zVkkPF#YWCdXsRYznM5h7Q*_W?t~pSn|ss?O(y3q=If0z&VU*yOAV zCeU%*(ub0in+lw{70aRF>~`gKHpch_<4cKQzQf^jj|;8g44=C7wn_g01DpD#eKNJ( z{{Uw(a*LeCh+n~ACvVkpdWVA^BQM0r)jp~*NZmi7Uc)rb*D_bIi3@q|=Jx#;PX``s z*go+S8uH)5U9+8D%PF2%`e&4xdwg``&5JwW$&Jy-HZ5>o-@}rJ^vLyg6ul2y@a%nG z72-kVbq2J)I~@EkCDEEO;_@ZPh62-04?BbORdVc^H0)0^Lr6T8f>}Ja3Of|J6Gmq8 z+mRcI?l@R-q#@;j?RfWU6tvB$_D1T#E4Bby#THJ0T3QdvXtH!j9YrAYc+wFN4%==Q z%{t>euB(#4#M$PRN!?Geb&dYebgJ_WIx^?s^0eh0J|FYN{FW%?6d`w9PYG&rn)ev z2!uX}g)N|{Pr@D4JRv}NRk+$`eN|-cn>>qqrh*?nV8B4W7kj&C!?vi1xu{snWU72v*+ zANcaW{bwxo7q_FEHzB?%#KUX<0A(&Yd&kWm^jIhbh{{$45m zNBvhD72o~X>(AfSIRo_{>XgPF-CT~blO7*O$UdoZ2y4DAY{%*|9}#6>f%`ERm`~62 zR}VeDj|;*^#ITY70JUwxasL2pI;*a*TF+yh}T>I_5-f{_Y+B z0D{Be*6N!ik+6*a05!9%Q*-)+fz;=?js1en;lcYnvN<3R;;VneW9{0P8_e=0)j~Ft zUiKH0$~QayrF)qfSj1NiUJ_m8aX#uWyJ?YJ2&){YkNd%1=*xPWtJw&Dy>Hc7N2Kt` zzO{@#Z}=~)bmrK3uFK_q6c^Uu-;4fB>fJaK8;Z*&;}lJEo=6*%vEs0`?f?ra=trT) zEiUZJ}fH%*;f!( zHj;F}qx}UB!eS^Tv;7p*9gsAbkx2+UpeJPrP;jN7fQmw?9_WCCg&*i5fg6;?UHxh8nb9@YdDtR#{zVZIIJ#aFM2hu3vOJmvv@QrB*5ZqI|+Mo8<_%!!%E~tprAe@N_J1h2e9gBs{p5p8K8`%$&Z_;CyEf1$6g24dloq^5iCk z>o!zpJTS>bQ#HON!h9GG`}x8?MwdU-Z2GqNvFx9s$B_I99B~XW`K| z>%*>e=<;%*$A(^*Lo#159$aCSNO1SHjf|#SXX(*R zk(r3xZj~F{@Iz&E4)nDC@jo1|Lxq9WNX}%r&t@%aRg!t7WE~c1axq<# z)iE)#9Qu`_M~4CJ_-k;wT{ow6SaUPn?3}sTtobmIFI5eW-@!a$FC+8ciAR&xa~dQP zHL?&K2P3lKJh|kNy)Q-MaUc6d)VzqyOcOYHX8k9)-FfI_({@(4y-aV2Y-x#bYrFSa zrrJH1J~B+Az1Kml1BU4SChE~ zyd;6uAVF=ZR_;PBN!rj#3gpv0} z$+@znaiUO-&TI8C#i!gLN|Cg^)CH1;b<#a+smx+~^5l1tG_vbuw;RO0Z_aO(mP46! z=@nn1z}TXSAY~!9?x}RHaj03hx!5VvH1$|sGS0=4Nji*e%DVLe8e2<`;(VsMX!CKH z=0%jmbziA0$M>{W3(z?OZ6N{VWN=U!({4IFJk>@|ln9Axdb59>cwp)2jEGaSO z5<5}T-nc4^j0`Nt88TuHl=AB!uW8cqpO+l%Yz$#*t8uX&%f|I71bts7Al)=>y_3e& zW#z}o=s1^gK1Tj_x$<;EKMaKaOVBz%O01hDYcs6wG3KP`(+|R0P=g0A8c_B$hYkoU z)3UCXhO`m`nh35{eo9>Mv7b|WS9*D7XoSn=ZZhR7T@ z_*LI!_}&I1Pg+~LokJV$xkZEU@;-{VoqH8@W8tFD^iu^}Re)@zyhJ-9#j3 zwlvt;D&LPKmVx(6f1-q`YqWBgNOGbE#?smTik5$(fhmrTkLNLa62CE0=4* zpdS)p{1ShGTvsmlf(7`G8@)Bh_!R#DOr6|s`=^WK_jzys08-DA+VKAXhNAxf6yW}+ z{;1-+{{XxGC3yYm$o@a|S7o>M9utoC)WiIgn`Cd*OcK{{U6R$0T?osXP36 z8~&knu}%2DtUUhaJ%0eWtagt9$*}#VPX7R?{{TfZ{{Vw^Gllg}49ET!H2(kqpQoGg z4_}x35zzfV=$j}H_N$?=?i&sN00aJuHUq0G#L^A}NZa#I^cV@#;3)q9|D^X^`~o|M|-@LzrzFl(r=j>tJWuv+39k&#&^R?@KS$x;Jx2acAQyH{3Uov zHjt>nu1hAbPtjKh{i}YdS>-veW18Sj>qK%!{C`8*cHu~Q540zL+1Nmy zUQh7<0IKk#aJ{eEF|2F`@w<=mUMfBlb#Z!I9|c^{s%pA1!cLh4@T)4RB+uG&~e>p=Kv7ypfsm+2)YgA0IrjMi<^o+Zq?JOS>);AM{uvjI})fO)v%2` zD6Y9vAd*!_`@fZZ-lp-o%1wtJ-{$c9!5KxBcG;+mFhl|b!X_mHaBip>YuS3JPe<+%n2Z#Q7`QS*!J5@x{XjB zhTl~gdUA7TWZMT*=$IWpu5{`0I;8K4YzMjUMAo$KMKs;e-0#hgmFRxY@H$UR@N2r3 z10Hi_o$-vRfqgi-wgl-F#>(#!4ugx=dS0w1WM@7JBYS`+L$x;fun*$;TKC-#r8E7M zW&^Qe$BIDehmh8}#P9REFyrlO&*kOT65ri;E~kytIzzffTz`4Z&W>vGT_6HdM((DM z`Yob(vikQ^C!+|m12hR;5e74)Q|`9CV)!F(;tNBap_j7f#V(f( z)~P{sKPsBa&m)PmY2kLJ@5;{N04cGKgj? zAjgs2BZny6pm$XfRVv=BAlgzDFv(kXMaT3|*h)>N=cP1L<2mh;*y=v%Yx<;FVcQ+h z&a?p--a=ge0CH8$cyXRI-5PjX=cbrmo*(OB+^$6vb?eMyxfo5v}4TB*EY#LkvSL=!VLOml0Wec zmw;w`?rdy%Cb>zOl_MA#topYqe;Iy9(ICv}jc8$HLNmBycHiAukC}+c$cN0mpMy0qcECsmkFn)fsCje^Ypxd7tI-_&|eUKg%-sf7L@ zY%DAlBTvfc--def=nPZY!C4k7&cK9Okia{uTa>}R>RQUCOjotr*VQN8-gu>{*-^f% zpeK(101!!AV|FZnS!$`!$Uk*;9g`7l0NY~qv)Mr z8r3|6w{&bWW;0KRIt*a`DM9^7T{)y{JY^)0G}y5m;#C>AlRF!rzy+9#Oa3WxJXw_Z zy5?JAG$f2h>-ObVK51VL4phcjq;;JxaUgzc(Rf|I?q6Al@?Kws>ijV8_c+IMDJbOn zpBLHK>ic0zeiw(6c?$NuZQ5|8`Pq1zV3J>4sHLzuW74-a3SeCNMvbM(40X4eJaX^CGvFBy9?T`5+ zaIA01NO&I}d5x0^l03SaNWZG{4A`$x_Jn`maR;1oSHTxmDHT_ZqAPs+1hjdgzLeKP2P$@++GE=gO z6KDlIged<2K{43@x@3cND$`XU2nZ)Rrh<+D?ttYNaI|x)Dp~%DCzU>k4H#zUYU(@P za&Zk!y58sSvWn>9x{JV81MISi2v@}ILc)zYajO8nRUVeed#klmNm*aHw3=Tk*~?vd}q94`I3)i?J=W{6aztK>HsLO0=&hN)?BD>Fe4S_#=!k+L};BE_aZ z!B+9M$Y+&1%XErgsD8%!i}C)>I!=aT#U{BKL(u0(sN4D7+^@@Q7QV~&UE-V`o#B}x z%*f7*FCFi8JEC|k8(y6x@NGtOafc+_eUHZ-PtTvFvJ3~ZF$1L&yp7`|0adx;==-mv z_;Pt?=y-EvwXKot1lRCCqWtgni{md4;y0j6BVfmeBMiBkBOkP5wAeOJvv(A}f#7cw zOP}^&+^mfF!E0R;o@hCw8V#?dD&xN2fir8tdCZJ2A!JfBX9LyN9`xAWRDE=thenuQ2DB&2LMo*0STw>Nyj_(#YQOTGPl2ku<~> z^@Q|RwK>U2-(@W?WN2({LTkMs3a&>dqP1?IcCf2<#L}x$8k3B2sOMQqc~iMYm9U_p zk+JSnSh|7qjnk2bCS7LMPn-S)k@6SvcU8CWr;WOwO7*7>T$d$wLa~xK8&}HK#P*Fh ze(J%CsDjc1N-AQ^V%Ml^}nFB)z4sPUos_;oG2A7q@(@-sycJ0cd0_Tb`BsThab}OWRx6u~F3C~wfyJk?=~*PbWm$?VA~JXm z1gm3&6S-Hz3tK3!;*P>$UE$Q>swTcuj-ifPNq*~&<_>Hm09NZKOQig$jKR!!uIr&5 zWG-*x7xi9Y?HZ^iY+!JfgVOo%pWhad<|_P6E6$Kd7K4MX^*i-W6Rn&hk{7fQxL#15 z$Xyv-AQhDX+4za#ixtssWVHxE_QZ-}!7d$Nv_T-_y|lE>lT|+7BgXl?TxW9n>7A&WSXo zqgIq`f;VlFltHx)=t&8rK~Rm7gI?*8fcGj=jXvsH0673rP$viyyWu$JbfpC61rOp- zDC#RmF;u;jJfIK40_Z3`YH6~vL(Q!$HAwlJ%@gI_}hs1qLAH!K44mnslengFx?JNb>4bXQWT^du+ zo&5g4nT}Z}P=%QhJQlV$@W&nq`X!0Z#mdXT>QFhA8GVn&(%=Zc)GsU5dd6o{gAyE< zFtZt&Bht_fdz0LukC`BfLS&KB$+O%|>Ij%B7bV~afOz1nkOsNlvq4z@09C3Bbd_>6 z+SWKWPf6KnKBbZ|y_I-<4pF1*&mpHPF`Y!Dbv@~tG^e4nyz1F20B;2&okNrw?a`sN z`nE$?vaA$s18WsB6=m$Jc-qQvts;kH1F1r7Q!7!a>{3=VfGiQ+L^GmxSh|q~i~(#s zteLIU8Un0b-2VVp1NcH_IE}^H=wS4`jJH%R2fpM05@cd|5}3=F=MHomAF8(ix z(D3&-xNsD-jm9%HPIDd|BCi4o*(+saV#eO3UL>!I%tR0ckgvp@!#R$T_R@ReM8 zev6UhW?2o_BXl_YFG}cNiyxg9TV;{E5Z~QjK7vQLtw!kNFJr%l!r##Hr~BSWFEt~J zx8r4wQKYHj&ZKjC!SuG6z~A**aGc;nLqg_0LpEHp4qW0^$O!~lDd^>PBM+naX&pq3 z>u-fbQW7@0Ob2p}D{yx_xSxdV3<9(ZRT-j>m$vg0R}tGJDLN4gM=|w?nvmheHOCaUxeBYX&+Q8OrBMmq~1eX(nwn4 zj``VFBZJ-;-UlfSF*+ec&>srFEFXon><%=P#3-J@PR5xGAUB=+B`}umwZc5lR{(IV zdkqTREvjO`*vaP7x-;%p=Ql{!UyW8TmyRMru-S@vCN;~tO&Zj7ch&DT|)om9RLmPJ4K8BD+otD2SQf&Y}hq9v6ocO_v?ZPaHr%xNL&yUjX z>VpXMGnn#P6c2c>8;g0=M>gC;lK8&;TEE0P#!0cn!CU zG53G@FMA-Yc8_(9T8W@(#sl01Mnn#Z5#<^qg}Pz;Hjj{(EAX^@gpKn*7)d0ZZcj9V z;MR}exbd#Hj9;t7S!4V(KY(0@l--mXPk|_A6H^gs$YRQ{u}582KAbc($9^tj<9m6YE-< zd#tc>v;*v>w!*B{dn@2H)s>cAOH6zzt?{c}yGqYNrCdnUy2~T)gtXIbTETAIq$N=i zCzWH4$k5t`kK24L2XIwQ1674+J0?tgI+fu1RZeZZl>L)sXgMi$Hi|At@Pt}UQ?yb* zH&1&YlJ{1JSXs%W?K>dOeyc`2t&S;L<^o&*2iao|-7qN7m2Rb5j~&p|mFKcFds@?K zJnWIDWY0Dcq1jn9u8sPD_*5QIjP8N8k11M4q|O^E#>g96Xj)r8(L@zPYXMO1lTszr zEdyk5qq0{fCeW?Win;R{OHBby4WaNkRi04oK@`zY^0H={4c?Zn%Lh>0HkD%L=fA~B zk$~BBL&`>U9IyBy=U#``J+v=rCS61Da7+8L^|4 z(li?k2Ge9Yo@osPdzEB9aBh~7`KFQwJ*_epgWQ0nqzp}(;qU&6{CMM@Ld`%BDYvp# z;sQToEuP@2VvGIgHSR5FKZ>|hR~=ZKa57C(HOPt_LV3QX##=5u$mY0SoH zSlLMpz0F-NhBrzd_=J$Q#g7zzmNlgDxKY|PoOyoLL}F|pMB?U-^;VRfM|GvRy{?mp z8qLYFmeS?m(p<}9&7V&LwGYr)jxVQLKo+IciGBKa#zLY=QnnGzV|(_gfI9}5wU z&0w)c)~I8A?sUhC+SQH@4)wH9;*zv!j5Xldw6m8Mh5>q(*E>^nmXJPG7?C<@Oo#A} z6zpj6#iB3@VA~`GrbzY`!l!mLxGCDSsnOoblNi-r+pSSq-2VU+u}7`WapKXjq8+y( z7yx{BJCxHfx!MJ*n$t}Mv;eJ=+3A*Xq&Rya1$%ExM8G?3C*3?kHW7Z_$?UYrD5)Fn z6mvZ`u5?Y3cQ_gYWM+uz8eA*oIZDM4w2sNJ4=j6)iqJ7mo!w<+j~V`Jn`dLX zWRf+Y1AWoaW79=hmx%8v)Og(-Xxv&W+R!x4=7zqOe1;Kbtz9&7i3e`hjEp)3ptR?K zs8=i0UpE6w6>DE!x>@jm6h@~=CKv+v`ok29zNed@Gz_=e98VndzrxzF?fFm0(wZ(vy0B_)xKHahCOG@ z0k%(BDh=ej@zW{z|)^f#Qy-qR@wJr!0nuA2az12HE34J zvZzg@q~vYN75!2ZOMdBY$~%Fw38e|#?1ywzK~zx-w4kO!MedsGl@J`D8umfol7Rx4 za|bDlkGcR5gO#~X>0aOioJbs5;UVQMBS-oO2aImCfk1n#@qRU>$7HKq68G6%5dR!nwO0kT?GW$=5ZaZ)XtvV@~YwQ-wy0Xm_F_JvqaWNAH#exiwS zRSVXc$VJH4x>ugaTCM!5MWWNXHh-e4Y4=P@3uxrPq$Lo6vswO%V0cI@nr}Uk+;jRM zZ3*2eb*Ohkf`PLGx?*i5scDUgDWmsQ5=l65K2l4)uV+wp&#K2cS347?679?)w#qVOF)*`S4Aeb=zhc5QTKw^5YxJ| z9o}r7pxYbTnz>5taZ2qYgKFnaWescM8f$vl9EZ3(*cLsNahJKLZO;m7<6lUPlFIE& zK3jL?dq#O}#B?5)$1^t`+b)bBPc^dj;PmRRCR+2A;j(5v`Ikza_ zx6C2&fkvnWXu*hZ)wzPri@$YaS~vrBJ>3(IMmA$LpM)!00pzW%gbn#f=**nhvWfj4XFcGp2d5c0Q|P z+s?{%tYWDRjglC(Q*Y8YD&H*Cs~ZsmjmleAnB?@(?(Kyu7}5s{Xb;HLcy7U5{Vm+^ z5wg=XAii@zQ&xtwl1XZq@RAIG)}wS*f(sZ;rLm?tUef1NNCRbLa5g~R5<6EKPWzIs zgJ>S-b_wh=M-@5NHnlPU(diTxh}r`{C$e0Yw2B746+~8Cc-&YBG!x}SL?X{{v_QgJ zw+d#kx+aGI0EjA;7BjXd7SVN&qDDaWihh>)?#+m>g*17^F*1&FeRY8wlb3;au>j>HPWy=%? z2X$wX$HoY*EozbxR9dToF{X*&(wj$DD<%qi9Kqg-?c=tcC44OMLJO!3xLUF9(TjR!9kIt)S{wU8E<}h3$I{D&Fo;)oEOj_8=!& zPkSms^{Xui*)Mc%`=q_oI3|suG?CZc7bSNHO`s9GN}xe(>L{WHz#SwIcSlw3c|f9; zhQO2*wG$gl-ikj&E4pAQ2eeQWr<6y^2F+?(7NQShcBP=99~%9#FzfRjdM6>^+p$zXE$O*c!O)B1!4cCtpeMt@b)!p3Ns z@uX(!v2K zIplCgrB%JovMhfz8OvQ;5KqdwCODC@$^-R!8}(QD?v1~M-vLoHzCzziMZD|+V9zb4 z$S-##SB?$2@1pbH*)brU$~H7H#tE{c*yfKx7xIk`&)?ZkCP$s0NZII&f$nfFX!)db zWDqb$!RvRoWqglzBs!kp>f_~Pf+x!%o->?h82F|*!<;F{-6Xfd*CX6T)s>l+ z=iAz7qhJ{h#Er_yIP+!^Fxe)L!str#97jt{or0sMzzmO&-?r*)4Kc#lV-0Aa6>f+Z zP;gouS464^r&zl8Q?*2MXo1ZkDbpDzZox1Fn<}YEbfLPo9grwNjspN3rk)Z*cA|SL zL#dVx5R4Ofuhi}uodkFxgGVD}Mp$!V0`F0!&~AbpZFBNZnJZeudUq&=NY))By2jL$ zxPTZA#L-#-1*BO5wn-y2nDmfI1gePwD#)#tX*|<4o(j~#c1YYRb!wiz6-2FUt_}PJ z8RiZVH%av!_Es?ML?p|3GDBMcO{WuA(b79C`R??$k~?y=O(FAQrd=9LLDnw2q6?cn4(+ubEZ&_Z2cO!)Xx-^3Qr26d z2JC`G+Ng&%Q?&(`K4=8%j%v(?&5!nc5<7$kJ8wJ*8o}L8!a(x zldA(tXl}8++pUt-Zn8R%c@Q0twE#k^x@>5rD5+lvO%BO;Oi*%UQ?gUaW5Q9&X-?>p zp->nN~f{{BWNOkWIl=%Ed{ez>ZN~F zfJFzfv~4Pg8!%A|_EOL`al(ewW47H9x(3R3STk!|ev5n74AE~NMOgcD^LGtJ!I%Wme1Fg5OOxkYbnALfjB?w(IFPr=CfR!OV_q*(YtNFe*G8d+8ap}+vNpQ4(Z zTz*JV4wpPu%Ug6u6}j9FRdGhb4USe0pz$-?j{~;4aZIf{UfkTFM3|#HdlT-qIl-(9 zZon#GjkwT;GKF_XTS)mR3cSK>G=*$N&tj?4EQ;r{c}JBP(rA>6Z25D!&ZdG%I$E|w zJh+;{unQ&>UTm7(`@1!3k)^3o2<~~buXf?1bbG46cyT7Eq^+A*q?Z~2WyEPNE+?K; z$$4=Rx4z`7U||gOrkhPL(!;1xSK&qkCck@oStoOx_D9aGma*osl-(!cAu88I$}|Z+ z%LHr&X&wfa6JJHBO8)>TxVDvWmw+fVcQ%|BhCptnhE)N%_evuTl#3^Ak++v>ZF|ya z-gbL|-B47>=%2)I-B!qhq%LXTa<#_xl5b(|k|5JF!$=?}5|Bpc6Gbjq5ziYPzQnDJ zXbqrNOr{f@%N8`1aWs6kJbn-W3m$VSCKl{9Z~86Fj>Ek+0;4^kLfReG#8!M@?I%jr zEr{%m>>DXC{W@qJ!nZNRz~Q8il*BAA)aHkKI4YPs>;MulvHR^~_?9mwTZ zl-XRvL{QyW^7q8j-V0Jh384EYx{QFt_ZKwSs#oHV*EhC!gumQqvhk0tzhn{9IIpDH+Bsy{2^Y=fLY_%g?n6Xl67Kv z520mw-<75Ng_=#dK&t)FvJ0u?og4x6;l^Tb1QZcm@P$1#s3d{CYH13|z zsYSkTwI9 zZ30xikVZ76p=ww4NIi-pbfbh)2}mhrL>|RN6imj{yC@!11t4odOZP{z4FZT-hz9)8 zN(zVuQ)Ljd{S*a_8!2b{Dm3~~?t%v$mK?L|3v-rCmO0XF3004`KP=p4X(^i<
0 ztMRd9d%-OszU#3A85=`%3QsKLVUHE0>9D=H`d&zHG`bCIMFt&|VQC$e(Ka%7ztwVO zcXsT<9ZeX;rK5ZNlR2_BfFh429Rv4H$$+jbl?|jcO)UTsYUfDE+FtqqDjr_$^sDmE znXSg_i%CnYAKu2 zn)23?;YB4Kr$YyFmmGP|cB4!l-PLVtrG3`G(OU+VHh>KQ0dwT02DfEcB{V<~Q#duO z-;#ra8;1$JmdG{>J4GIBr+nfF41|ri9_hhpb6?~|<+S?THu(8j@uBi!4s~ifs_RDC7cYC6YlH z-Bj;4Ro1~*l;;)zcGa>IYd4(NNaxn>TEjq$I`{Te>XjLim3 zB+vu+r7dN1`llgn8uzj{xB_m}aGK=&TjQe~3nizkt?xSAL(ewLGZZi3aB6Ta;K0Dx9(C+Uuhwgql+ z*9jNem1rnob7PE$Y7Q2zc-0=;6`m6BCLyGd8U>EaL2jW=*%acucI(FkY~bPuNZ89} z1=N13>~{L(9B;BOX%<{;gV|@1>72EVl2ZM>HV0*rUogPkB!B_Gm9r_w$$4)ym94x` zNZ(DQjNd-VAMX$U0GOgbx^k1B+duwgr#Y;RtPIoY0Ir8MVO!wcj02T{ba6ivL)?T_ zV*1xfuS0*~TZ2np;8!CSGV%!6v@LMuz9}3fX>)6y>lH5_jI4cW=01&_;m?*u{Z{z2 z${gs;u3w1BZ$i#Js1M?WW9{>1t7E@)RApSv(C)!=KN7j8_^j>aUUvZ}Mk^d?t26gj z$bBJJ^bkT6t?twuD47iuyCw>LX##iI z6YiyMpsL+63bhDCA>U*N941H;4T9OkCzTS9ltKa8qmTg;!b?V{?5k>UX#okQ(ycR+ zJ7R!#l^jxz$&GG=+EdC0bW)Q^rqu4DRRRlZ6tP<+Q1F4Uq*PG{w6tvh07V5mqzsLv zv;7qTL7QY0P$X!gfkf1bD4<9pJgG`jVH8owAPM0>6y-pW6%a%v3T5 z9qlx5yHGr?gn0HhD0w=h4T$l}l=f*cP{!FHU4?0BAZ%9FGB}#vF41`4?2WHXHMO0T zXbx$0(|?+>Nj%X*@O*bwZbssO-~BM|K-$k`*F zWs^&N_dg0wb+`r}`YT|FM&EPpm}p@QU<0z0UhiNO2k5MdgKE^O9x(8l0$}`B>2H zxg}g5p`chv_(0^7$`UoNb4O$mn(jzDtKx9cu@w!gBcR5(64jJKN36WN>Zysr(!7z*)PQ!qvboOHUHMhIwI5)e?T=kF z027E>MT4;HnE+!YEYl_FX*+gWBZxK~Mvd`F83b%?hK>38Oe;kbO-)h~Mjt8mX*>}| z$U!Az$dWd`yyv(OK>=nNGPLPwwsr(35397-MEN|h;j7pzj12qa#PBJgEKJIkvTLT_ z(GNO7E2L?sJC%6E*z3mjHt6lyE=KSgH$*OLGH2i&zKYW{-dSlj55m@BiyCobxUJQv zQq$%GsiSIKaXhhuTqQa3(Ev97iiD2OO()3GdlDA2#>>t_)hCRRp`=>U&bUDJ!@t2v zT6LLio8W}gKS<+s$sJ}lJ+3jmwa;~@`%4;Hr;vU^jG@HIlA?8{mD+Gz;n|k6O_IXb z2DzlJHb!n>VP}>LIN0*D#(73@!EA1tQW{0>cUI*(+Z$X4wu&Srj9kaD7EP)NB-z}q zhc!dW>R>dxD;y5)3zUBn?DU&pzDMb;pL-3=JJg5o*tp_P;AwYoH6*jabEf7>e z3NkHavCh;19glRXbFva zqRX}=Wy$GS`*$0T*Byel?#&yy;57!5X2k))_ff5p?ze&f;1$VQ!}($2fg(TRRg8^{ z7CS23@^Z!Llpt)KPbq+8$gg!8Ha7@117F{OGmX}knZSZWO*=v&EhMUb|DrH)7a;&!&S8@v31vn{|e#F_vkh!)3tYCNQE4jsi4!l9yx zByNy7#oGfxKDQBNl}I3z_U@I!fNG9$CdfpeC~I)^foLT&Nk>CR854zpyN+B(E73?3;2x%YyJ=J5Qylz{o=oL$%{{U?A?TFafT3A5b73t&X&O4UZ zvS)N>yRjqTX){ImmE>fJt`t>H#suuWQRt3+?0-aqp-4N9cuMA9?JLThCu$lRP4)^5 zIe+qG{{Y%oz3849eq56{jZwtSZ$8WDo*cve#EF?XLO3yGA--#(X=|^JRZlN7<#PTE z`f2&;*v@a_X%+C4Mh9j3&m*Sbp!D}{Sm1sN?HHQo*l-_Itc;RrKFPcra3sT;JKR^Esr>Z3X9I&TWG6PX7QCS6c_EG0k*y3mu#} zA5|>w8fq3By5sn@_0bwX#UTFxHQX!?j5(whp5b}V890uc0PJM{03-}&myl|E*;LcI zuqU@(D`VkY3Z^}V>ekXtq3jT=KSg3fK8QL~@{{+%ay`{&kc8Ac)g*Vqa#Ek-nkgKJ zM`Z~XDKbPiwBYO#o>Bl*2%c2zfCrRYxKTmQ$RRtW9H#7t>VV>2=!60`x2^*zXkWr9 z7=nY1@}dPXvV_)uqJoG9N@+q+9|$W(&~hOMAtB0xWI|@b=b8ZSg4qJGjJ2v9cE&DW z(Mcs}8d%WKmdugBD#`qo#^}%hZp#}D?6gGSSy#H6HfKb_e+WcF9|eQzs(Yx=OeLYZ z4{%+N5gZVsaiJq};D?$DI=~1$p}~mm*+}|?zj0>g%@y=aWZIDP5PO9Cm$RBs`;3*f zAI)2>5btY2?N8ih0>f|fNbE_PcVSxujvP3r61;Dypxnno@OK3%VH}0m^V~VzD3Pw^ zp#Dj1PF9ob0M|e$zkvtYb($zCFdjGB{;2F)VQWj4xM87ZU^y!G zK*-s0k5S+%<&e1VunBE6&Ug(0qJnH}k1HXM0?SVe6Xom@HN-mabgV~rsAp0210`Qz zJ1fspiKGJKzjfrBBd+YL**5^Jt_#OIUcVApOlCku9_44q$n!rA&HihP3(4HbPp~`% zpg6ctcnUS9@vY9jD`i-Fi-SR-YNm-s+L+<)3XE&P;1E5EG^V!^rmtW>RaCRymbUMJ zJ<>VSRp_seba32S;`v!l>`|iIPApD_-s5r+`YQo(c_n9dQ6<5wbq@aN8JDWR-{psTIB@s)Pf58f zYlQNN2qrPJMRW4EGt$yeD=2A<3LrHZr#0yx2rZfN>NHASVYjuFlseuC?2e*dX*~_K zL<_g2tjGmY%Nz7Wqn%K_;>qki$`59HjI)4S>1O``Qmrf`UY<5dj}Z~H7kay&aeK}qRpn80V(w21R8JRg6dG-3WR0IPNo&&4 zO$Z|wxs0K(RMVeiTD%86!%+0A4GW-v#_u<6EfxAF{h$}JywIZKv01X^4lRkFy|MZr zQ$WKbe9}J>Sz>pY?|dy!aEdm@4Nz4QLEg^X`ygn7GSfz_Tczz4O1J?I4kX?0Wn3Oy z^Jm}$D<5y5_#Y-dqlhr4ds~#j`#oGddtbWs5MYKoL*deXi{;%J?Gm)^G;Va7C+NPR z;qMYhFl-%OGFep2mTu<%0L(l805w>>t~>t#PGyYSaOse}l<3-jB%{Ol?hf+FV~=CF zUe6b!GH8Uj(z0kB!P_WHDGZ?FsK z4d|i5+A8~lMKAU!YqlqEaG8I*<9zwO4b|#)pQr^aohw6#ZjrY;C=T)$F|Y zR}jG0IymHaxTH4Y=Epmz^3!zJN2HM5CxRAtV6=YVBjI&r%V>z5g?{N-BF%#!Y1O6I z-43p;eIq|BqvOsnBWs_LOmK4phLPKK@A^JBSDFan>(~wQn&4w=A;*?6@@(qw?7YWJ zn-lvWooZd4KJ>FurlG&b}YTAJ~vOxd-{H za&fNxAfKY!;pTzRv3ngmkIh{+nt)Q>1yvVgs|I0akFs3FI!!u5UNG$tyIyD}_}or$0pyHT)KXNa8d-~s3g`H zBYV;U?_^uKzUiosNJi=V?yEf7X{oXfK}z{e05%8(55hf=KoRbNv_Z6j8bFlvDIudkN$x4sW{T zHP1W}oIXLpG?tEXI>EyBD1+>|9(&u}GjiMq33XTHb+rN#)eWt4TbM^7S~Csq66&wW z=*DPlQ(ohBfMo;OL69t2OGCQZTy>i~cUhiwx|&pbyvaQ_RPz0TZ10s}v{Qy3VyH&dHP3YzjbB$a5C)g974oWNn< z>Yg?o8`4A}=dyr{x)y_);loqL!r*p52ETg%DyD9?TXrhvx62$AQ%#-0OscOb;Mj7F zY^~TW0B^CRPTU(*l_$+S*`y*8mjLTlxRJR9GfA!p{E!5~OLjaV6i&VAF?EUsGXW=L z4K0K@=7(-lYmw6IKW06>(P$&OcAY!`RGJB-Y4ot{iO7`Qu%H~`?STW}t31Nd!9Z3e zapZB?AH0EfH$=|T2FLV8k}=Nw0{(~_XUfYSUX!)#lNwgBpfumrZVbnB?eT(Bn6bEQ zKqMg}kOm6eAY@G7;x4TLjmKjwTzyM_(%0smmEz8&(R11` zrSmZ=-3)_M5BZPCuW{16bhO;F~sw>jE0sQ`kj)~Ifp+5{#aT60I&Z5hdOSD99Beab?>lT z9R7uh^780h!g;3by~{&pjK32mDVRIP;PLzl&pc8$`@qv^)31l-W&5w0$c|42>A_OoJJ{KP<83TwUkAl69RHi+i&Aq`~ zoToBEXan1XnPl>lHNe+DMUmDC<#%%9jFY9i`>tL@WEu&%b7FLapHWTsB94%gzq_tS*o@k~kll${2M3&`B%k{vTv`812B+KJeBFBp)SHkC#5Lnq)@! zrF3s@m$cCbvgS=z;#W_{4-t5-NM9+9k~BZl+xn%44;`{PM@>y_+_xP(QZmd6(YXLuVD3AD#8C>1wI4(eCBfT(vHa)9Fh05n1y-szgsJ1w4SAT}td1)$xI zh0__-HJ8f9hKn|8hq~lU(Ai!ZK>&~sx-BkgHDlOSQg46#A}Er-gpQzI17zq&_ATur2TAX*b{kcW>;gB?`4#XJ`^i2#|tksD-HHEd-XXVFk5YrEGeIg>a3nWxJnbt4wjE zvI2tL$11?qxa^2yST$bicD)2}0xk9x-fJUfmI3W*jZc$=3~tlD$PzDMZ5!ncL_3|9 zeZWdw;mJmiYus$wtO9pchnrT31yv?MF8H*~^q*MeG;)D-H%jMkWbTjZ!aEgYF#_$ELKr~YsJS0j7@>50*;h*c03OOKK*twrklT{k=~EirWzOB?{)*ACvY~5R>LE`s8b0VXZXxmpo)f)~e0oFG zkj4XS(Q)LfKozh{Wu1bkJaBTrVY2YA5ju8-QM-Qk<*hwI^YWjp&0U^ECw=tqITM#)$!!U)- zb$#K4`(EjUQs1Pt-$ITgB1aiW-0UyeYiukA^nvtCXQoEQJ?|a;70ix6!)*Qt`D6zc zyn*ml50*ek)=NP5Kr=&$y*sNdU0afkda z{SXuxAHS^+Fpdhj&4>$epp~p=AlOXw0!NnCpsJ8+9-^+$3FJ~Oh!My@WD$d`Iq?5X|y;4j1}zzFS83 zQ?UuVF#iBi&mXkg-Q`7-i#M4IOj3V|rkt6+EAc)PZXT(U8Qrh-kN#_4KLaV3_gw6# zdw?Y+zoFS=&hbxL!H}|P;>c+~zTSUIRgOFKT%YP3c~9q${_m#8_Lx+-jmGbX4ERbc3cAf<; zc3dwfX6^2mQJ2lnAFX|jzBcgW&D%Yq`$+?<`7T~(h&l_Msy?ZWzUG66`7e@~Utfi1 zd=9<}eIpzGrOW;wO`oiEceLp0c*o%CALO}nb*`DOY_^))W}oz41j0vRfQ{F%Po^w# z{{T?szth`4uXNTp+^%=grBd$`^zcnZIrgAG)p-F7jyo`ww-=&kG_+rH*>iAkzuCVI&4(pB zs^-(4#%@D@b-(BNu3TL^FQWC1o0l`2WNss4r=?yShi$(8_cCi3NJ2i3t-Jg+RIdVdh%ee(g- zE$#I*uL4094#Y2`^toL>PK(de=LXZj;@67n_}_Qx5(bK6je?tA9!?TrR*ZHxxj}>i6|y*K3U+04B5i3TT75CGw$L1X z$_%QqsV=j8re|~9d#Wypv?Z7{ti|QWbkl0XARGl&r#S9*LEL<(D!1hkod*Wq*Y!cv z0IkYqHN@-?0?KL804`DENcm3YklPzybeaiNn+bMMz0(HL8f@&1mV=b+j?U@XAG&QD z?YcH|5d<}~2I)gfxi|Gr=F(WfzG*GAivybzC<}4!l(xmW$&C(DIA75t(X})YpxT7p z5|OR05g?I3AZQGYY2wvSexrSmb4WXc&29Vy(_sL<6S0Q&3q(;h;>N*U<@Rk-U5;UE zF<=RF?zI@Nlvxg^>=gE2MnKzj0I!Q3gm1smY;GAl4U@H_A7e$yT#jI(EG_p0Ukg)l zSsA%pPp}=(E_|c`Wc(|`e5Y!6s!Fe-n^mSq!>Uf;b_v;t-b=6DSu?{;o>Dg{jszb{ zTN)Qb2t1V<;Kx&3OMRAUU#$8#_gZk`1JqR3xG#*m_ky-2xz34NDE7JDU$q0iM@dm{2&em#>%$`Z4`!ge=Nr3T;ux@R~--A>>n4Dusws-iB`TtPR& zOEaBEVc09&@&IV(=zv)yaM^&`&#mMiNh--CBhubVsisX@0rZ|zMW%(N&eT=!F4?UI zbj*sIwILXLTzt+w&|3{6IPK!kVeYf;UP8*u({G^h+ zvwy0o(rR$76Hf4SgTYJ$7rThEM#TFoT1ZJ5u74$LWF5#rNZLzWc2+sMn#fv7H*PCK zJiR)I4GM^u^Xu3WZ6jXDj-b%(AQaQfrkc@Ynov5dlgBEyH&m8)?`arJ{V~-WD*z8J zJcX`c=f7cUm&YLjhLqD+K<%2-xlqi|@B=IkNm-iNS-86Q31uasiQJ<@YuE|ZFc)U& zX<-jw?eLN&JT@ZRXr>{`~i6WJ^1k+%ur#&u}`(ca467emdJ zpv4$?_$biZ1PumF{{Tg$z!BI5WLOyyld3)bp%-FKT1S@g^a&o^zN+0(M#j~XY1rD0 zqu3?O$C=rYw8rq(x7k`);3~f)^ft{bE^}$GtZo<^kJD~Pf#@FmX-B}zg zjl7Tok&X5W%LRluZQTQG^AaXwTfs_P>#O{e$uweS3ZT$QDRk;~pmtRT%Os8h$P|#v zz@cc$ED)A9wWDF`_f->Vn&a(uyuXN_t17*hsSUEcmt8lQ<)$9k^8H+s%DyHw-~u~^ zO>VVgx7NY(7WKy-gB8)^LLy1HQEJ%<*n7{TOC zn$1x+@HGDM{{Tdu9nPM1Ox%b>V;5%vIVEN4Jwf?d0?jmRDQ9b=kB@V2WrZ-B0MWl~ zmz3+~4w;uyyfKm=O|Iube0a}}C%hL)dTjUZxqoRG!QC~vLLW8II{u$1#%+#wt<%os z<-^lK$ds2fngPA-d48+bWXi~K#dNSjN8t`T{H(;!n*CE3mJiS>=3{*^ux>dkryOQ3 zZ1T12KF<2bm6H4{rNxN_(`3xPUfN(CDOQ>5nM^Bi$hglrL@gL7^aUh&F)bG5A0-l$20J zi|&J9aRC8ll|-5s*&TkG8!LIEtb?&p(;n$6hdZMb218*5+`5(s0(+F*X z4y4QkHix7ovy#yA7}0V&b)C%`_FA0*dHhyBRgl2e{{VP42-);v^37NZLe}nIs>j0J zlJ<=uwSK{6mF4?v2g0G%V_eYMXe6G){LpM{jOuk4dn(-E(M`+`)U4%x?P&3NfZfSqn&}G;08S1Z=cX5#;O?wzO1x z-*pT1ldRD8M%o6=q-|0Y$~Fy@!GLZ2Rhy70Ga@GFaF*9GXMAAqWmiPI+vKg<1#YR8 zoSw+pTy&|rM}l*H%RYwsvK>%8?Dhm*o6eg@hG{q z$BmcD0Yec6fmgeow@%p0>ctO*9hcRVFqcr>X^I1}rF$c5PRhr~#sH0-k}}OJm}m|C z)_C|~i;7|gdwJxl@<51eY@~KXmA=-nfH|a%7(*IMwpmO3`2iq?4llV@ z6X(gK3j>n07BP(DWQx+Zn$bgKu8=SiYWgmMUXxhBshnYR91)!+;$}fyCgb*U>kC|*5}O8 z{vFEb%GYT+LEpWs*pa-rJ*M@#htUDv=~^Mj4wL)W4X?0XH!bmhv=f|+nHu2hZ98wG z>-eLqH>7znM9}%%-S788@qJQuWXjp~TigZG>Eh$M-E;GD&r$C1GoxhSxy8&L<$ByM zuNRin9DoC{3*`ML)W@Re^URflCqCG;5nkjxg()`++eJiQKG?^k?DH_<{_=AlA zR}ZTAvArWbn5?XZF|{daqSt&L>&D<^W_1Z7#Gf)oz|HGdveDJLL@>Z|G3PEkxvw|; zebr7WFO*(;XNSCp#pK~TC#J+QoZX9Evzhe^&0zTJsA6@~ot2G`lGC&C<&0?~+u?ZJ ze5tXEj1oD8+}Cy7!s`D3e1zlX!4&d==zE0|@JLtq|=7I(G!k=YrE6@ahpu@CwVM8v^ee&GN040{{W}*{HK6=i?y@uNo5jWtIxd;!u-zEujo11)eYZER{{XeV7N4ec>Dv}m zkpdk%NwPQCgR#Er;++$$b&O9Je_~|kKc{B-o>SapEf?)$-EGG)&OE+L&Bb+_k(J<& z65$tp=c4DZ4(10D`qeK1;vRw2;L35I2PQxH;vs(O=-pCmOlC!uAeD?@^_exe{Yu|2 zSjCoO1DMGvy3V0uz7%)H7FlxT`hPl~(=u8?bPpf;R*Y;(Jk}D!&$9j3;-0s-L<2#7-|9bQ-V4bZed*KY&jzH_v&j}=30BLXJ zLU%c>wCR^_wt0Mg>^iQN{)y7_I+X5@76-idHL&`X`ZvQq0PvO^B6)EB{vO?N{o&Wa z_7oPM5p=u^+(8@>GZVXfmWI&!1()R8S;v2Gk#vrO2T6k-XGSvfW}C`3X|ZfcBi~@X zH0S-;Mg{8Ty8xT1h*<+&hBU#3T*msZ%yHP2=R8lJFG%Takhp!~YK@H@$>kA#nc{qy zy)s!PiL9F;?vca(9vk`9EPyeHN%^KqX9K!XUN)9u);GMahwJC)sh^QubhDJ1Fah0SwKaoKZm z@MM@0*vP(ISJ1p^h8`P{3}8xq4tV4R=5gWjnAlq99^{oBwBH^+-r4Z_V}oP!r6)%W z94}+xSp-nK9nIXGK=xc1eNJmVwzb~HXkck+qCJ#cw!4IkUNz~5Ck@iZ%}xe`fAe-cI@8$>7yHGH5aB~HpWWI#fkz};JSQ_3Tg!qFT=3kl5uU#dGe zCJeeNyQ^Ec0lOy92EZZZIB-S%QQ2Kl%^(Zi0OpFjzhw(1zoKYtx}DFuTRj>_=m3F0 zs@*J-b|I?vMQ*Z5KPZ+4izwOYj7CGfJCv?rF7*&AvefHw^oms&&Z;{E_M3`=+bO)N z+>jQH0ya6-x4Oz69PP~nK9ydAVYGGtYU<%UhB_Ex0N=7{rNvm0o7g!v-*$*+XjUaFC zR&5Ljjii31QcsvYJJL^7oF7fASxjjS0ADCQk<8QpQ$c6~({72}f>Rq9S?aUGvxodB z&%&Cl@Q@q7qN-=QPuawIRF2}uvL-mow1BIT#jG?B&loM1D7VJ3pQe)Y@xlU#BqZ+m(ERJ)Y z>ICWiTI_ zZum)&GmQ2(Xf}Y~7}C#IDN9;TzyPrvvK~RQJEs|9wg%D-FM*Fcjg!X{V;-LCpC(z; zq?**MYlMcF{{T&JP!FFbm~^oE-a}RRZD5)PH*nGx5AQmV?$!^`t&vFBGUIvRI9g%k z{Cr9A44}A?rL}#wUUPb0i^pyb>+-lAv^RgrdFoz{A6W8vFY>MZH#_dlb6nC|Pd>@A zvfTGLMt^2UaIv|rj5ga>z5A{0U@!{;^wKm^)@(^z3(MVi+Lu?R^%!Ilvm%<%ENbq! zj~Y!LRbymo9_s03WAfyYtpSC^hL2_G@Ui-2*sYo)7@Rj?U0bg;kB0e%t_QhReckx( zY?d6>oxnxVjZk$=tU_YOa~w4j_-$><%IcYTFBuq@5ErO0jXx&-=;?3z&W97-JI{<)puVsauuIsN1uN>AaIbB*TX^d}Uh5Ck< z2T=NjZWoAg&L!CgcBPOV%d~X!yk`Lss9z1F?`TX2> z+w`Y}de$xujJahkfvnUVJ*jw)w0vCe6!@BMtI~0r{4&-xlSj6?ABgwA^j-rS#d%S5 z&$$rN-8yym1KE0yvwsyg8zNjR*}#fG3mo&aNbIW~E}mm9f0aH(ot}dS#eO&Fc#*}E zh3Dcx*0=VIHd;O03i=;{d|8{+@i24xtTE$xvpP2Ef8zkr74cv$7gg~t7A`aM43SR2 z+bnB^k@Q{zt9Yri&!-Kh2*bSCTG!BHomN2XO%KsdTyrDCmhs;nWAx{U*@e}5bj>;+ zD;cSeVFAF7H(i`QrpMvqxsm|Vz$;bO%ivur$2~is^vrfokm)A7aA6K{aopbPUyuAt zjQ;=#%IHg5_ss?^Bm>RZqOtrI-3+;LxcU7)$2IL=`RyU$IqDha@qkgQJ=WNrYg;jhs|azZjw+bgo+nk*MehTo0j=9AH0OQ&ZT!*#+MVRO&&&* zD0Q7C#{2&On(g>nCQXWDb3eO(HQjHijN6m7&n;DOKyW%(c1Q+ik4tEJNBXXRhx)kb z-D)}Id2A=r;qZHv(D4B|Ss3{E-?Wjyjk_*KQ0P+QwheD<-12n>?i!4X0t@$?yHa(!E>JAeS%DP2M0PgQ@@%H*4$4J;~7jYk&Jsy z5K8EEj2L>aPke6y+J&{lvG-nUCkv(KHPYn1Ha~+SUtg-89O{P`ss8|GoR2;ev~Sga zlHVMEZcMWB^LbbvLuG`>(Dob9?oY^Et`6LV^j{ZrNb({%jBUul>I0G&&t_(c2yX4| zYe-vafyB1lb}II5-E*LjgQoT?Y=0_jbn#`jh|cQ4vZtzsTh zo<_*o{)(THMwjr2->|5 zgIp*Q?_iiP$ZYypI}S?H#()55(h}@6&*hSRRrCmmM#aPhabp1_yKs_DH{mUfDX<+) z_1eypGPsU%_$|Vps9Rs zW2o*z?#R}#=xI8;`z&&>G|=StPq|zi=*h8S{;NYLB#%zR**}n4H{6wc7)F66ud*(1 zrWUF*mmS&%(Py07y(Eyj(cv-3NrwZIMaX z@4%>0DCEe)`#9Ptej*16HE4`9Y*efrHiqeF z-`!KEP`4eE2HCe1=C=eUN?PzX2V`F(LEC}dMn)ZGwoG6He#iulUoyjcEio_Z1w)spVZi3tOa#dyT(hi;lEaC1F5=kStKy7X}q!YiopL201 zNfZ%}D^xo$f07mPX)g-1eCL45y zwkZPOH_+*8cN6+8c!93TX0fp;)##Ij{GiwpU!({mN@v+xARrCgmpbQ?bZ(IReN0~rZ7e>fKmvH-A*2p z&8Tubw>V83n&H}&GG$9FbsS_5a29Q3cX4Bn4<6h#JnduIV9b@WNDCT6d#gHrYceAc z&I2TF+xJ?sA&r1Ft^Cwh_+Jh_`_j7_LdRIxt7OG?lHfM^Pm6~4H(4H)EhEtMXBX4j zPMWJ;L#zQGQ^;#-gU<`tU;)9pdC=e* z1$Q3hRpBU|iylV14sqc2UH(dcy{_{O*i^X7BjSWP z@6)qeWP$VxrPc9zd<}eX6CAp(fv_!E;S3=sR|a6>STzdZ{%X5wZI4~uErY{3(?RDJ zi1?u6MQFyy%@EDfdYrO>Gj+n}ypdzsdJLINvzCXJx7$$xRQw70liTGrhG>0JIqskj zb%o`wiNzwX2XyQlevmTqVe>LW$pr6IXnhx9-CG^)44x1pX}_UYzAQeO7m((SQWE#+ z+*#zWAD;bruVWm1v1AW$vCA&i=)L~`;C(JXK7kCI3O z>a6P>J-JZiWMtxWQ;dcR=0A8)(!e?naoq;Qp;i(LO zkr-w)b|Twz?&5w^_@h279+N9P!ZPI^hK@k@ReaWdqr`R0pS|^LnP>oBK(Ar2UCy5E zJ{&NZpAaAxxE<1-#9-)IS7f6RK`okf6Lm|62-2VVx>s+sm zF~VK!Fz}8OG_u`0{{R!K_ywe5oJI_+kPUtoJKx~8} zn;@St#+rC5n%^%&iwS1hU7qP&G!kXib~}9+uIafSdd39Mby51S579&9kk@^a0G$LLe~0oTKi8<%8#h@_Du`zuN(X?op^($`8`5t;h-;2 z7yOr7?Ee6%#v(mE{+V3+VfXk=_Jxih$bxHdc@<-7QD&=2lf(^=$Xj53unq6sVRN-O zlC8#mm;4=(V@^D^T{iEyR#xh$_6pV;Dl5_ByD&~S2?r^_z7)5KNKqGjD?1=}2`Hc& zRsfTevTz6+p;0~%swnqCz@%X8SIXcT^41PY-3B{iYe3xp0EqIOH@GxCk~(JsC|O+h zD$hdZG;UQ-aCxSV6mc&ko;gXZf?F83AB46vI()Y7IZDk^5*xL5RQ6>plr4fKzCRkW#d=+m|;Fge42!mTJ-FwJu|(Ie5J9CMEC3y ze`kPoJ@&Se);60%=(5SJ$9Iqs*l7f9Xs`vLL%NL)Xs0_@<-&GHuYLkM4HN=)YIej4 zI)#O68UUa+35ftu2Gs2IjcZyq+LBCOTl+Eq?o!O+SVs>2OBC4$N0$}3=VDWyQDZJs z^t^_hPAaHaTK!Jku7n*i?iS69b&mg)vYfNGYvOa$}gA(2Ep_$AyN;kLnr~uz0rLJhPP&p!6P_xS$cRW zAG^0oH>BZ&^SD8UgH#cFwKkYNUnqfFBw%xH{rNyx8=wZ0Ni;e1OOBA3Tg~wiATzE_RgvXeXj04lwA{zxia z4{e-{+A-53QDj&h>?ZOmEbx>yjcBEhuvWp`H zr;+G+E&%F)+FmQmUQ;QnV!*^UO-pJiImm4cdvT10HyUYTHpLKIRB$tNY zxKbEhCYKhv_v7VrF_s>G&@LRsomE% ztYxzwr%!io8b{Qv(mAYY+vRg}aF0{OnUUC$gIj(`?5~g7GxX(S>c_{&)#`?J2D!e= zh1BueiZM=o*v12WQDCBRcjTSwM^Sy5*&;1>f7kFxHvyn;Dwe|zZ~%EO$e2x zuWf=B1_1$NZyuJE25gamso$D*lbGPbOHiLQ=46=iIyqWx zuW6zYVy1R@d)PWgE4nURPmXx{gmJn@m$#ZW2k4)|9aXs94ry{RB`tvH^IF@mds?Ta z9Gsj;p`l?MUc#RW5|i&!$W8|Uf_=FZ%m69 zD>g`8))qc8-83lsthXH#j@X?v;&_V&9K3lN!12DJxUNB4dKZPTGyFjuPh)=V2=j6! zKj3EMetdpw%{RlN!W~`?q}ksmOw?O5D3cgF2Yl~K>O&(F8^ai{fDu1bXvuwzF7g5N z3P0i^{{SUA{j~hnW7hk5{{RwYJ2NU=nb;clKU-Qjk7^Ac0BpWh;~u9u$^OrTx;ViF z=lpm6OW)^9Jk8fA(hH8=fL>FpU_fL!1)gS1t|g@K(cAP2vG&I);jhDRMq*Xr1-@$S7IV_N43+%+~Pmyz^YA2e*9CNS=3GzE*qy;feE(()#2 zZdt!%%l>N}+g(=~jw|XD_^z2u$ zqzPEpZ^#5J(BiieS!WIO#tV~=Qyb2omE*iUERFFN z457rxavNv4w{QMxo~e}l?x8+Rgp(tQ7I+=z*c-Y-aC+BN^HmiGD zJztXhUPnji9w+D@vS@oGZ>C1<;G-kPzdvJP$v@x~wToHEEOBYrgGF|Fj5%H&>XKmP zjX{TJj_vG1$<-qDwswz9o8QVB;+T>biadp~I5Kwazak&fK0=U;>@IBxue`4mDV?-s?iz(dOZ8nFxn?YGb3MxI}yK?TpDx{Y~NM!&ydErxwmcruJvCet@@{M0(ZH!<( zr}Nl*Ao(w5s$C1rC#Q=$l+$Vh&3EpjUiY}MgX%)EARKfv@Qz7Z z2xBACz$hS@*wQxkMyquCdEfI#_dy%|5wKQ}*ANE&Eo;wn zT%hM_aU9?9Rkg&8APvtb$lVmynD{>W>^@SlwB3as=rB4{rN4){K_G}o z`~AWERgy~B*`>RubpfHhmN(IH+hhdRKB~qzQ6`cyFiH<$;jR{fUeoS&`YVMVEoY6S zGy-_;w8X-9>=HGQH%Zl2dn&RX;i#TFtp`XId(y`>7ij(7Ps#z}x9lrZfCu1vEtJ^B z3JRQNwk8=IH|(jJdo&OdSL-FE2c0q9?3OSXuR1+8e6#@=_we;J=I&4Y>d$I+B+>Gp)Y&+ zcK~)&*vH}?A(QAsYsl3x( z&_D=a5YqH6M9G`cWAiP_+ z`71Q?!4maegB76q3OnQenA z%sPkwo>qKW{_YEg_p<59i5zWd&6q?VxMg~Z$Ca6Z17i^4nTR_VI+l_m*u>f6kT{K; zNdzx9*09{inHVje>(EKnG`ib`jN3O_Eha}*>JMl!VZr480L2hCw!-Pp$u}M{H##{3 zfaBdeovFpuSM0qr`t+;?vvlk|N1KENW+zZ)YmT0WjW(V`8b|V4_H*>FIgd2WB1p{^ z_xD|FcS)7J!K^jH^jO&VvqoC}j>xZ;>MKqpJvMf@{{Uw_x=xUFdnmbWz8Ki@8Bqf5 zEj)KkjS*uGmk>hsAKASX<-%XQW1hvWE()l6KTVO(ZYNfNlfaVNqir-Sal zC|Mp0Cujmddv{*5{g2Lbbz{koGkLa17Xz($XT&WvCJe8ErkY~`!}u!4+B5XvP?|Uc zM(%dub&PF_AjsG~isri)FBO1E1hKq7hctq^I5W0eWZ<#GgV|kU7Bf^N5$b8|v^|Z= zhyn4dfyPh`ElACWvv#x zk>y?$k0e;tzZ<8`J|vkDfLj@&JCv}DM`Jd;&%8I0TNTsk-9eacI)U<}8?X+3itT43 z+H|>H7fHro4J~T`2Dw^sGbhEDR8j!Pa^A&x-ihKFv0;l7Ck|PoCZa7H(cn>Do(xH3 zh)E-KH?VOQKC6?Gd3wBDow3t?KU-sDV=@d;?ccK94lJ{^(!|5=(l%ZvI}%y)wQ8|^ z+V$NtBP$ycAso8dRlmZ9n|l8M4R~Tc0LMT$zqav*)?Vj8_W79(CiF0Fcl?6M;{KxZ z;tbiOYhi_rWKglZHZijrK7;wMN6<{zei=DazVbSpnj>!-VT^*}KCaR}mb@2=@>!GD z*^ULaHi>0Dudr3EO*yUYmehEYsyCd(l{k+Dkii>x>>o=q*V!}iBMO>QxDIXujweYV&y zSK!Yn`1+)X7Kc-;ekJ0icBhl>SJC`A1Yg+LViE~=;y)?#T|)TNzJ6O+*0ZU7?alO! zn$g%VDdQZ7^16(3$*9E(T~T%h_FlgzvIymtM*$2hE+^=`g!q&7sA4T^Sj*Ql{!a8i zRfa#?tDE|Z&x@mj!|kXYB{4=XK{g?}~G}ls-VHAwP+%JG<&vr0X3o`$jxG z3?SAEvh%}Q2PJs!yV9lU8Gc0WW86ldTf)~3Ie9xtrzp`JZobv_TZbP&@P1cW%4e=d znQOTNW{=GO05$SXg@FF2)-iCS{8KzO>w(<W#+e?CAJ|W`VA|G!25*{{T!Q z>o{NU-5xA}C`%B3(#5aJy>0=I)-$1LC9%%--E%~*)E{PV`{#jrV}+8){Ih@Xl0V6O zlg7RZ^E_SDrI#^`ib({ap}T-W%N*u6%UQ>lCyZY*$8#fad%$q!j|Fz|dbi!!CW?P0 zu79rFmw(aPW(xaP`M7;QbfWKFoU77I2>r5+ea)L;SPG{L=WV*kgHV{7p1hsrx;d*q$T9 z$!wZNy$=JsO1tJcrSk24vUEaZi!FkM(KNnr&oP)zf^SrRx<@T5^iPhuYdWVzmJmHf zq_q66&GX}AMKqB=Q(o6mY4=&m-ZGtuTJU9}SbOlY$k#E%JP=WZ+FS~DG{Y@jyU_~? zz}uBpIVLcFn!L2>*=1g~9$->55u^PD0-Dwc0`^C`jT`cq4boHq4WLCU00A!tVQ3Dd z7~z24;Yay!?&I_doUHK=rXUjT}U|pptjr zbQtpY`k7<-Eo{;N7pc`?dn0-PK{a#&ni@^)gM)zvO`1xYbrRdA`=zm@5QAEZe=UGh zS`#sqLhilO(F1C<&q|pS8|tC-LB~<{3RIhoAp09t$uE=u4K8^c1OwP;vOojfDGreB zvj_22#LY)uKs0!08wF#f0FVL*lEWLQI2s+TA!}#`Gy(9O+lI<%_D05ur}almzja#H z8{IK2W17$2cftae#{FD^Q#?7p3hoLIX?sE7d!X6FOXvk`Z4rX!JA~!TiaR?G=9R2- z$b6!QW}t~9T{BH=-bc!eYuin62i*HBoaI!60D@RcLx0s$=|KvoIQKL?l@D>fih2v* zAT6a^i?oo_%1S1-*;v6u1i`VR4R0HsRnmbJWQ~iqrF1auebsra1)|M3CeJ2#m>zB0 z4|H6@`|^b}a!`UJEA+IG!O2(48}zk}ATS-%K_g)l(fC5Rjnrr@ZF_b`iD+@!`y_fn z941wh zJgVEhTCyV94Y?OaWF)g-6C#He7JzQmjsuVtO^?gu*(riSYZw(bNpY|e4DNQR3mLo4!{KO;8%sx+LyLPQ!-z)HC3@YxdweT0UO*&vL6;&^ zpw~PFk{WaD?@1jglkpERh6_JcvmR{@ae1M@ z3ToB$2`geaSfi7#tsaII&=5jpJj11h(;&K8M)6dl-UgI!PqJs_$4RF zYiu6jYsYEG78vF;wXEGwAIf0z02R%0RYX@hc-s7pZkLbU17)R|Vm&Pk^o7jHmAJ8) zB_jJbxmcs>@wxv1v|(WQ-D`}j^0GTUNSDSn{=vJdv`^j{Mvge#Tuox7h4eX)^hH@Jk)3uiXILxm;Yr!p`f?>X}(U zHL#XlK1R1-7gsMA8dr%j@+Xm<vef(rkapX&m`YS5$a^ zp-Ky}^0ToW{uyJ|-_)jC5@~4Bv}H!;0_fU7 zBjJ6Msdax1#P^=F;aoSd#De@+0PoOME+Oe3XT47Roc^KHByiX~2Q{bW$N8;gW7khJ zh1Vm=@eEI7Ww5p~#s?bQ_g=Omkm!R$iElJY&;J0~Y*~k2hx|p;vb(jfabv%QtFrtl z8O_WR>8S>3|eUqb1JdTElUhItTSRVF%Lrrg3otb}$NFV=gZzCRnvz zhZf(_dwl6xfef#Hmc6lh4ene?+xP|M-HjW%Y%b7#@gw&qy{&P&bLWr#T+Cc~a;0og zFum^B0KK0|>bU(or$vtVC`>@3p8jcy>9 zdz(>nnO!Rka^v$HZn4%+Sn8fcFLQcqbmG&tqC20=uTacSD;zcxOs!6>iC#Mw4hXSh z#eA+Avs8|aqk+f-_V-@x%>95ZJCk>RJ(W(7qqwVxZdSw>Rl`zj&Lw?2i`JeXmAb&!RPYsrwip=lW~{qx1&2A z434=hMe-JyaU1UAv3L1?tKQ-CexC$0{qza)=3}1uTr4+l>VaKK`f#f=<>J8^%V ztlm25u#XZ#35~MN9n;4&SGMpkO~dIKGvdPYEb@BhkpAfXc{*7P!2}$s@Xry*xd6d0ejpJ1Z(lrp>u!adylVOPMEwdX^!4 zn6k1{8L^_l*?mv$auxvM*4KNb=Q`YZ{WwV^aZfm+>xdEu)oqV1PcM^$3FbYANy!~c zp<_!RB1c98!-nC&QT{9BpJ-hju=NK#HjIM9tGe_*XI>=9&66h&FoN&L8RKtd)A6L!$O0Setci#6_eLf( z3neq1?ZOPsf2T`AtV!5%khqgUTNG8hhWwxuUoK2#(g3UW2tCHgXtIM?T6Gs&`=4)w z5m?Vwx6yZD?3}v!Na6t($w?!_b{mvP1@9e|4u1Tg=X<1TsS9A@Nl3`RKPt)u*i6=H zAOM&ajket=k0H{53oLxC@IYEOcwZJ1A+6 z#ABBr$i#7m(jsc8V=QPFK{pTOJrXumGRd^dM+2MX4maedq>lt_IY`xlT>7OP{{U4d zZGpz>wm{-+ps2>}GHUEMO84p(=X1dJPUaBZPS_+mLrLYwVek`0P{{PVRk*nAOMWB{ zWP!x?;3UUjZ8`hD+u0cg;v{WTl0n=in`5292mUl!BQg&?!+1TP&hSAKA42M5;2K z=VXSl#>YO&!yDubWDe5S^Jvg?p89RDgMP~+o*n5W9X?D{4Y;aU7#;gV>gv}|l1%Gn*|GJ)Mvbvm8dG+K<0SRiZ_#vmgU;cB+KZT1LBAY^)PbICwxf)ZFw z`n{EMYzzMYcIbSnMoDQ6XCznTwc)eQaC5&4PS@_0IDC0pz#4XO+^c-}tb*!9#2+zp zfZJfGlMsudNjwEBBeE)M6ae8zObNTcbxZLjvwf9JfzAfDq|;p(JfkHOztw7)`XkcP z1+H5obWW`{M|DP2t}_#3~&H}x4PqDFqa2bpt{(@Q;W-K zz*2PL*`sulG>|kmb(Sc+$4@JE)O3UNS|y*$iRQQ;sY@G7P_>7ev-L_7M@WV_a$O-AmCh}$G}86=(!?7nq&Nj$A^bsV@O^5UKCZ?Gz^ z8%`YkUY=}uWBg4u?i9vsh5Oj9>w%5dv!QXhOn~wv+$~M<9O1yb9w&R%g+Gn7`7`$R zF;4LTif4w#TSVVw;yS)NF!P+qW^9b)Ii~9SDmsT%$dj9|qNhB;1Gc(O=xoe$&lJ5!e^%uRQIQ*}diA!7zPA&Y`Z=+}G1(VF;``b}d zmMi1VZ%<_be64d?DQrW1BwEPKINK-e@){gXfGAN_Yl>+6vgZr#3ab|hn)i^B)3?!Q zd^$W+jCt`om)>Q?k2)YJ%su{Bro+MM8l%dO35;<3QM+-!Vh+n3a{2%y6Yi?WovjzE z)$EqaVIGSg6Q!J&IxHxoGICq7ALzN=YbUC7W_jH^A>oDKHO-yJ^=VwjXFY|kCwf$M z9=(qwUQTW!XJFrVZ)wV$@RB`ON%2RCB905#}Y)o|Pg-k8R@!o1q!^Hpm(i=i7M4$jGi&wNtM zbQg+oXxLiej5#v8?30NY%7&VKfIF_+W`+0;5lO6HA$dIT`C-j5Nan==w;R~m;VgZ% zw^->%ilJxrfJ+9TdM?MH|Q$~_0^ubI!*t)YGHkwwK9~nJL#J%~|DpJaWmg z*v6g4)qAfQigLPW#>3FS`A(+}OGnD|7}*iw<;RlaaWq@2**xax+`2d(02?g7V8@X@B$;ay5Iw#}E(kE}ESiAOLQ}ACyZU;n$2Cx@R zO`tg){{U4p!%I6ymHRg8l65It)1<|b(zVZ$M}~&AjJvm9_hz;W-{98oBmQMuqroMj=b&O{;vnwFu#O?uW4LQT$y6fn;JzcLkQ?f>jjMZJ;D9_uo;Ndc! zT~7w}NRL~Mjt!gGx^x{&RG2Ig@XQxhWuQD(UM+#zzu<0FEtNZiwCO)KN4xR8+?rv)?f2p^X;>z zONZ2$>@3FPPnrp6b8g()y7{6PmS={X{)vppG6q(4+_FgOv+?kYig4$)YB*W_M<+Wa z#oj;j|+?8h+p_m2$4Bi z`*JWH(i@W>-J-{eW)5RuAE^O#b0K809f50t@f~->G4y_*{A|9IG3Oi8oA`%f2;?tY z;Xb7YUg_R!0Jle_%p$avda=)PpQpxrPl`H!UYibfma+c0-`IuZ^W&EuPbu$nqvfER zUuFAU=mu_=_xJ(xaknIQZ*}r!vDtV4NkzkUJJ|a!oINwQYH%_{7_uMUy@KlChI?8#Z@}dln)hXb6eO75Eaj4;K4)S|_5MdEAnr+9D zc_`5s3iVEPN!q(AX2^Ig3~40tp>?{=qhJwSq64v{{v<%$(s;mdCB#x@G&tSqY7DWr zRo5!P6GuCg3)s_9@!cz=H_pfl2^YFTH9C@q7af(1HQRIrjEF`p+@y1fd24?ce_*4W z_tuj`-7RSwAdgLBZtVM%gz7%YTumyZkZ|5nqS@X@i8(QPAPBsHSRTUirvnjazcD`1F6SIWackql<4$VBdFpd?sjXTi5`E?PDBU7-K&O;3DT$Z@EXFQ$!=kcU4&7Dnhavh%kASjLgLDIslq1!J3i&}Mf& z=!b@jtu;Zwur<=i9_!J3d#kcuEv*}G zx^WaEW|q0K^TILHEwS&DXrq!eimrk=Sm#m zY+>~Llz`)57PnKs6SpY0_HS|6G$!-plT&sL_xM!GNs+AW$tVUA+qG7}Y*Iu6i=Oev z2*~RiYh)yQbOy8YOshU=B-?wHY%Tqkl6V%7H&gGhQN*>xH8idB0CmtHZNgSZ9F0C` z+m%#c-8k}AiqJG&-smPU#<~8Ti8L2#C|bx`&cS2Cj6Opx3L6Ej)3v^vvO5k`+PJZe z5xMTNOO5VTjdMu^j(AyLk_$97rq6Vt`lBJlisR~$?RHCVV04#ogK^l$0c5K1o2~ks zNz=mC>h%_nP!v9>48_EfNbakCBW51Qn^zYNR_Xz1Xb${4rVEV|F)`>{tK)L4nnuPN zUT8RgHtvH>Uv*(EG5Ua}@4sY?k14~>jvwCqMNB!}k<{bGtJE!7o?`>rJwdjsgF0FA zCvz!{dACUJ%M94YNnH2It9{RP(~Q%fET~PLk(lSUCWf$!AbT!btP%)aGXDT3#BAQS zSY(PrZgWV!d#hq&JzDi$ZC>l8 zgVQ8ykKQ5#5w(?g>Ca|vogtAqx2fBOHz?9^WZ*reyo48}%)yR9<(UZsf&#&l(ljtS zDK!rEDIMUvHaSdbbE%+{?79(P$YD1b)_7J$iyVL4$Xzg^4+6V|zb`eo^R_oM4YzPN zx_c>y_T=PaXe2-vvD(Se1N z1A&qTmb;x*vZtuxxMlicEn%((%S0VoS6H0gaX~ZslV^?5%NE^;DA?4~nUxkiWO-7T zdxAGhBmtm4Gi^K@RlYO18>-1QSF&jI+l$m@gJRPc0SY2W#fvMhGzE_uUDtjro z%F`Z89_^h#=xJ<#gWM-<_hr`NSC4{l(M%sba`C$S`5BJJnSrsq5p}rPXv2;fvl-`lqJlTb z>iz@ur18f|%RRdu48?HAeDctUk)$7v>(Jw5O_Q4Vn!+P%c6Yg44-d&CZI2Pb+Swkr zw2Gom!Fs-hrd*Rnq_l5cmU;VYho)GflN-*=$zk%LW28RjxK+i079UT7Hn15SOs>7{ z=YRSo`%3FSaKLT^73O3MasL1dLH__cU0$D^gPGFCT(U9IM;LRB?$cY^c;jR)(&eX| z#pt;a=4E8{7BtI{-7Eur1KaAn#zsC?3!l^TNh}070C{iKeKri(GT;)ymjmHGtwq2V zkCEAUF1efiz2hh`u|SoLs5M4*lY70pZ~POIqms>ddY`gy3Ji|0?x&Ez+*pp77#*l; zJ^uhN^IxR#V`M!uE%6W~jt?pkb?SD*^)x><=Dy9mGR#;o;PSx7iKLtT=XI2DncIQ_uKd#@J=;QeI;oi7@XU)f#J!1Ng+ebqkN5fKP z!x%Z3KeuD3lcati0QVosd=LGin;QZQs2MD+mF6~v^Qd;E`v!bLG)1ofilPs7@IMvw zH+Xx*kB6t>!5%Sj$ce?bySc05@>yl68F6QA)Oq|~yW$+2HVj^uiwvLt024W~K7eic zubK6K7kHhsz7TE#H9PFZi#oK^xyAUUZ2r+(!%KKWPy}&lAh!NdwE8 z3xp!HpJ#mcSMhAiD=Z%;c*%C@{hmjQ)pD{O)gCglqXF=V++0l^`8)j=(z+S)vYz(G z6mkCW14{VEP3g_Th-YQx7-Y~Tf;L$)`l^Ws)5mq_ospN+W;t=d*f8`{1lcbUwZp!m zM*jd+zb6-+u;b;_)qQuYVnd&YD;&UCBS>GEdd3XC9P7C_GXh}_wv*kbg1<(1PpUJk zczy@@t$gini2(lq5aoRL?VrQWpAs&q0}q)Grb_<+55MHHo;)_&=Q6RT7cl8`a*G6i zHRmLZ#Uq&RL8a2h*4%wuvg_!Rs$-EGCI;KxUNrXU^lXEXi=o@PJ-(r7a08X+I$l}C z%4_*)*pG$jT~2L-VD1!UH1z&ACwz3Rs>p8XAlY3B_gU9&Cm~eeR*Krft?k&I)UBwC z7D7_d`5+v0_rA)EjE^nBj2h%UhXHd)=CyQ^M+28&m*x<&1141*Na zml5&okC5FvlHxtewa+Er3N+Z+0YkPPkeQ6CE(-kto4fHPaoqs}fZUCONSf(gt8mZe zo+z(*c=lEokHX%_B0Sc^fRV|iBjVK$B#Pk>Y_54FRCXx4V5=^x_gAFaI=zC0rQ}}C zOu=rhRe)(5{)wk)6m&LPU~?jE-MJ%6e3A~%w2hBjtFjYvYi2+;blPJM+a;k6!=bzP zR%$Iim0KHP+*OV`STyp5Lok-Oe~C0gffu82ooHfukYjtw~Ay*t^ zaz8ZpTWpYL%W(h(pHFpM5t*G^=^T^`43g+$t>=^2E$tD(8(7}kl+bp88$(;L3oc35 zDbu|rlO(v12Hxth;3N(wWl|NZh|tSBDxT{*gv@(isqZ>iJ=I@$Xa&{jH>EJJNF#5_ zRkg>=1ydic%Z(LuV%x^(CWw!$gURlTq_^&ViZQ-h1Ee04zsk)c_BX$_*lVB9=WvZVH2&<7Y) zCR3pP5>@!HmrUs!URWAJRN67(3}|TBCu3Ww!~iS0K*C*Q`bT9XcmUSG>=Iivt_EV@ zHtZB1-I8}IFlur5OA8${>v}?J{6nJLZoQR~&KaqrcL8>u2GJ4L!*Z#X5vA^7w>y*u z2T19NXe6uga-EMUCdeCUQVdBfX>DHiR+uncX4fGCyL+JHW;2Yj>NV=zCF&0Hu;0$7 zdPRGcp^ei(Ecq8cY;k_%V_S#MWeP4dE^JZ41sVfnz9_dxhtnV-rTe)2d#(6UYs(LD zrnl8gi<0>>I=s_>e5U$CkFfSy;p59Ji3dlD3}?jWYXt6TB$!yZ?hkMPZ~-dZnIwKY zgeITb)q07Ar!Jo*cK|JR&#ZB#K5lE991js)0tE%wWN?@RT+r^+R#|cjoN1sAz$$#l zSUQb`TQ0CVpH0VnMbQlpYi@^iS3$rLhUC5B#Dh&8mVqbUgQIvY+j166DV>X&F=2aL z)4A3-KMP5GB1tmau|1bx=#w`m_AP7MXWT7DL!f#Y`YN6S>r+4;%PQ$(#~*k!2E&!s z81P2gEeCDwB(Sxt4#sb7>1Ku*CpPEM9_USS{6PFd_~L>#`OYHT(^Ruf)1z)U^${od zif+8@YinREbj>@KE3u)Pd@-&Uwe_(-&22nKJ)5pnxHA9?PO)8z#On^O7i5Ry$V1MO zISZfET-W4WV`}7gPaCvli>rx+=3_L-V|XIL2X$fT(Hiv|_!}&E-7_#i*;sTn-#wGJ z8$Wi5x&Hu(GLyrdp3@df;|>L**>36Bkjsi6BW>1qT`W$OjQB_1nD0Be*ZfhF0kC6} zhb`AFcIjM>V9My>WFew9mW_|f=I3IzHi;rWliS&7l4lC@MweZDE27f-^E8%@#VKgG z#|)AaN9vFVAJto% zSPKgp-T38sCUrKsfwH%8&$9NPXQnq`3;;g6=pK6{)sO5uNy zpaRw5Xg=YN42I-*FL%_NT>k(WxsJrfeD-39>(D#6{{W!=YkmeucTR^UL7>aHZ^vbZ zt#o>MFSKnFby%EBjD|hOYO_kO4|P^x_-`?iwkI@7+F|@pv$*{N>EX)Gq2k=9=CU@& z6eb}Qqj%oaK6kLZr&+}?^}L)$FlrJI85z}I0d(W*%a1+WyfgKTm~wiIv*NJD6ZZ__ zz4%{B`vvgJx{p_rs5!cuAMDvAy&s`Q z907PP0mJv5d!N?-06>;`O?YcC%M7P@_R&V}nTj6?2gzl-^xb(blhW{H@wP`$lzrlP zdXa}7CvZzfsUP%e_dP^I6nJOeGqJj^6p>@Z0~pxp&(=Q`o3EuWoOtiWIX)}Qjq=1Gf)HCAK;2p7{GFEEUk>(` z`f_K_B-F1L*7}BDQO$l&P@YVg-^=7Sev6kAXNx77818dl6NB33^3n~1`mVH?#Da8} z5G?J$Uc;k!csCnIOUj2fY}|7mMGr(k(V*_+R{sE^?&Y%#bjONZ^4s(mL(cxx=$Khx z(V7;#f$m1@$Ni|_`TagDi2nc_FW=-Hmpkl-#F<$+bM#)QUS*Cwa2GO(YfT&dMK6EV zablkmSfp*W;DWqt@$&RAy=(GM+E<9Cz?GdVr{oyqG2TG~aeM%Ni{~+Uc+y8JWNVK! zMbTYPw0@sANb!$U#F|&i=1giwn=S`&ztDxu=shbdtmO!Cs{86SL3VLtF~?D#E>|nM zx-P3ETKu@9H^F;BqwicF&2I3|R>j57d%C_L%g2?au4rI7Pc{b%zO&)Hu9cDHm&cIW zvm`r){2yiA@V|$fCzX{CRAVIn00UYJn0{?uTGBE0`bUN0=ueyP-5(w(OWWnU%V}@$ z?7Mwm4lLX`V3ncFdq^PrFN}Dbs`WmR)J8Agp5~T^YhVo|eoN~<7V44po`(eS$*uZy zzuY_Ja%F{{T@yL!@SNVA2TAb`S4PeSvB+*253%EQ$m%h-24`brS%upNdlmH$wmyRF zj+#1_J8FDg+(#vy{{ThuH+2)2h#5HsLA9Q5-8jC^Ow97-b3w2U#drE9P@fdS?VlLi zEr&SrkRSxi@#P?1nsEQ_H20IzzzrR!HMO z3IOs^pas^eE&&HPG+$*wbBMFDG@Y5|&%#~5B(6IXX-(-Qa1}@?Uqh9aS3U0yV4?1{ zNOgg>>eypzM(W}%Ojyer3;6Dgr&Eil0GG}^`0Rs2rFO$~(Q-3gWM2x`xuMk^f!wMj zZsDvpLEMFJm#_sQFPJM!cvQ_T8Unsni8Mw?0aV6%v%eummcusiogfZaw);7M~s_!4AY1 za!SpSAalM)DW4&2-o)@0DIHhtRY;3W^Ja#@7@SG2%9fJn06AKi$5w`K?o%z7%Q6~v z(SvpFoWR0$Z9xZ-7;785iQJ``?Ep2V$>jrQ(HxR#X$|>XB5Y6rPPY-s3k(`+oDKVh zA2qW`2Ui#Hfwj3V^B&#yRpW-fb0GfhyE6Oxl|+sPJv40h_)htCP|^cHpaKTlCY_*F zjnzg{<4td;-C_=-YR1g%iK{5k+ffYzm0R8E-64|PXlyt>=ty-iglJl?@w;vn%q$E$ zD#-LuG&?GrU}?JwleLYvIa^_@BYQp7Q8uaFmD<7DzNJW613-)dKWQPM^!Hlhta!^9 zZ2b0Fu?c*}SAYN%(0!A>X8D?kDH}iq%`OE}*9Xcjs32w3#|Dbjgi-2nt`9(%p$yHPq@z&enh}WWs4abfj+~{vDRglcN;T-QJP;s);d1#zxz5 zA)q1^9H|+B)152G1^ZcEW^Bpwfo>B>W!ADNeoLj|{GBsmVlld{)>;BchnB{Iz}Ao5 z3!+U%9k)%3isvvHcPl?wjlc&qk}rT2x&2ZsI5oMhJ%9_2-w?kg!Z@|mHS(z{svR4gax^5y4e2&I|gGA;T=SX}Am$c{oyu$_$s>v~iT z!@|}n@<`Bi*YHL01{=8+JPa%uwK6+3M7Y{q?6S{LaL{;DHy{?BO`}^7xX*Ev9Y>DK zJ-T|wRnEoAgn7gX4{^%RCrM=BjBJ7k8v+LFnj9{zb^1h%0^aIyJ70A7q}(NN-PE&j zALPjEEHql+yO{37&V_}KXp>K<4TxN?6hkN91kR639w;~)2A38#yH&88_*+RV+m|b= zr>dVGXhC~jO&==&$dQiJ)8BQwr(_AB@^b~yp`=pS_^}xTjg5eZ4c1q~TxQ&EtjJy( zTJTL-4L3`ZeStI=em1}taA{zeyZpC!)ZJ1&iNF}3U0$FAK40yHeeniqTR)+Af^)8b< z=1E|F&KBlfEp3VP2m$MBT=&A@+l|#i!i;kAd0_F__z#{p7T9p?d#m4!S&qRZT7AlA z#hrtY1h=G{vB6zdv6*bqDGh1&TWya=n=q1nBEd8l(Z0@LE$MSQzwv3u=myKmo>K@&QL zIq7*2!RJUZsl>L6IyopE8X<2x&FyFGasqGSuzYI_)%51Jx+0>@^&ZbOGkq-aXL;WE+#Zu znHxh{@;(0m&2zj{)8E(r&?U!U(G+2!@*X2#7Uvaw5@nb2Ve+%e>fdhng<$I5BrfVb zPEAh9A9oG|PnQ5by(6)4q57|Bhk=9P%p9YG4v|{67Uv!s(e7{gr0`^n%kcXp#*MK+ zTjW6aY1T~pJT8@&(y@BaMi>s4tmQGVwasuXWNsGg`Kn%r8>HcQFT>@|aq|O5nESF^ zdk@We?wQlzgBjU)+sTm|K%K;w$Sd(W`=9h)6YVoDY&rUHjIq%$Na-5z2tJ)7^W4(% z^3L*P^|-0z2XNlzTKZN4S$t)RhJ?l?8t!3sIJ`pvS#E!W0B_?74eFA-t& zNP!XL$K^lUQ+NJH_%D>=ON$d>ip(+x9dqhDds6*X_S50^_0I^-VS~-hfQQ0IE#91e zOJA5}@K;rCS&jZ!Xcy)eZT_lo<&t@=Ck}j{Nwt_>DxabZtV{_a%EpkNT#O_0uk~Jd z8?`<>{V$dGY<`nx5kN zFD1*}{gZXMF*@ULT=V4Q>;XG!0eFs|TG@jp*{S(moqk5l8$DByn zBrF=sMS81!yDu~LkIerrJ(KIT*&sf-TNa&wO*$mP&Ao>hWpZD>vr@NKssmX zjlcoRk7Op~AieJ_i+6kW3g)-S05^BLcR2D>$D#pc+jiLlD>rv?nRY8~%ZRdmRGM(w z6}jxIIW0bx3wOdsGxy}ZNRVvC$hRHRJd^Z5pI0iAJ-VB~PerwZeTuLSDOVl3mWc1# z&^CdilC#MAbp>Wbgf@cAL84Vgd1SGdBY^Im&H=tueg6Oxz5W8C4Q?inr@GyU!K+am zaDssxdLGbsC1{n+WOjMrCk3%F@*U5){!1iJGs~&N(%;~u;ryU?a5hu5p}Y;1?F}rk zRoNO1+>n;lBP|WflEod3L~^gu<{Kl@o`CjCYA%yhoHt-LB{dxYs^pom4^iCkk?g^N zm&K|w*ypoVfY6cofLn?&mq{3wVnYw$XTQp+6LK~r1+5NshaNrx&_iNjB=NegNh*gQ z=2kiNT?^xMCQ6q^R)o(i#!G*2VLS{9j68(bFp2rjb2c(kig3~0e$7Y6ZPjISZ z!x&Gt!Bz&nPj_S)gTr@lvU{V62z-Rl{K~D2bdCUSu5qAR&ArG#TKDL9BDA;Ly2~V@ z+W7z$YKL-{aww9N5wx$fr)b;n@_^d}1Ir+SY~7w!b3z(u6>M@m;~6D2eTN_=akhi- zq}e2iz>~{T7CV~dYSa;N8f@?t6BKT6cN>J@ld(MVnnyGpxj~20bshUARPAk|)={!8 zE~*G*@QnL#HbLxhr~Rk~wAX&> z%+T#kv#{I?<*u}fD zw+1OW?UpFYQwCIb!%G1-w znVR2Wy1@hd#u){TWS#l0%cs*@p_9x`!KlaDZ>N&$y;YF)`5f58-5Am@x4O-n)r15G zG`dF%0b7p%lc;28<(8P;bkHoD{{W)OX}Jd@LtGilwBDB2vhK!5CR>g-QJW@N0m-qe z)En#vPX#a0|_+K+%ALz8#$A* zMz=t3_k?g)kB}JTA*Xhoh+E+|7-g4Rx4+8(FtMx@M=OJoi7NqkVJsYxx|kj!Xot(r zjJrstxxAmM(+7!QE)kd<*odOyZB4?uG3Lg(q8B*WY5K0#HX!@EU#xuEvhd^=4n$`6 z15&y97`PZlS!8R2#WW4c^;8_+VU8am?hL&96N%8W(Dtc zZe4Bm2snp5+V>~A+GDAw4te&wdK_%bSua6rN#GrpsS6(VXm~B)ki2`gCYNucf%kn) z)q1Gk3UkNy+lP~PPTS;uEMn6NW{UNZ%^TVya2l(7;ZuhMP~}Ta ztyDt8dUc-$SY(80Zs2YR-BX(Y16*I2Tb|aJ2LZnca$M0FHCrgyj%05!%32B8JlW5P zSc_ThMwKiY-fL%bXgViO!dl=Q2Eg#D45rw#davH(YhK4h=Jq?Jx`YPHQ&5YhFc=dBaYf z{yQ&W_I&3-*L=4F>x_@{S>@@bKHl8L<;n$j{TB{cvgGjYe0@Q&edW0tVtJTRE5TT}Pt1xbG`PqufE#O_?7s2S zu#PSh2G&4rdnKLK7~wj~?f8BMHdZ^!4h^GU0b=R7}aK_NS`zzeQKply)ouZlnTu&9}j-Al5=4*>&E%Mkw zq8xSy{Qm$YcwutMhFNND@?RO{yD!9f@;SxrWUh_2cx!gqbNnOIPf_tU38wQ?BQCnGD13$S-?Xl(-l>&^76{Z{H)s}1uC$+_UqDk%wWVpwTl4E3L#+qf{VeV+Jq`JNum$Cfs| z*)16GvblSYr}XFYUo&@u^SadW{yOKXq!OR8f3L5U#rsxf zi*RVr{{Vq|AJ_S=8(q8^UOM@XQ2U;4nA+gNHV3-!{eQzfL#TCQG#Hrp(3ak&ztVT) z{I8&O3EPzHfsnw*F#27=3oaH**$ceDNIMOa!;<0VJGuC==E8P-_5KR#f<0^zJYQ#3 ztUXhw^=^?1V#;KVh5L;z)ZgK<`h%x)AS`Gu9F2&gxw7?X+Y{TA8KeVkb9o<{-ye~c zy00%ki;VQ*{hau$VCRfH;>KghDXs&DcD40fmo`RhL2H-iuBDZYla~2$pcwn?*75%U zMfFd!{=7P$O&HTiUy}oUM2<&gre1ux@$p_i#@!{oKd8Kx>c*RKeTwk2VLCY^4Wiyh z(S6^=y(yhjrb``u)C*zuE8BW0XUApxi6wTDfV#x1M-Iwj` zyv(wBk1jiJbej%$V`RrPe~G5T(#^$ibABx4eFfoWl(}kxR%JrT*B&% zvN7Yb8gcbM*;IvXG&s&!rM4OG zT&*#+t%$Y2hK>N)E-Yc7y6@R%$e+|&)5mo5j>mIb$@J0TRXpMD@}m68&gVVn;a>v- zKE2b>+SnM_+H~@xoaYU{R4iFa=aaAr8mSy!>g<{bG>a+P(MM%qGy(?A_&}hM@|KEj z$z+qWM(URr7V0N&Wb}-(TE>@~cH1D>{Lx%6e-$HRrC}BWJ70A1M)Bz+6Y!c=<3`qi z4(Hig`5PXhIaT@1jk;O}qsde~-eLArR|S&EBj}QEfVVI)k!U1Q+|uXj95jAv!7u|z z8=mDVakJ0;*ys+{taZ7dn!jaBA#Defs4KVGN|Aw7#0~5=vMa8r{_dd&{Y@gG$D^&R}R9BM@tU2s|x# z(Z!*~-1{VF#AcXJ?!DVuS-iH#r?@+w=;S}hj16A5Z}eE$3s@fZlY2COh@b_v=R<5X zZu9Z%pB^U5JEYT5gLJ2sM1ETcHf`p+tqeC2jhqf?0u|B;-RU2*2-qzr*+#TApd@(# z#1G9%j3Z&UR_iqKhWbLW@21h&Wvxe$oQbrJcI5k~Cr*>f4`}_{r3Fv~Z`o2-M(scn zna64ebbPYF0q5B(01bQIXfzPNB>1D*d$l|Q4SP776 z3IuC&2#h}W3j@o%z(~E;oXJZ-U_Vt(wwQne)puzc*no6`_~fAS=}2n_B_MI<-98Ji zCBI%!8|B0YpheE<~|ZDF^$HC?^cIeLU716tjneC@ijGpYOTs+5Uxy&%+L zzAW?pNC+BQ03DZ84T4Ud_}%;D+UJ4pgQv)bXd=di@`(=mN8$NZjPi`{hc~TaWaDM9 z;ly1QiU19Q;byZZ%4{r&!TBfGO*cV(BOVD_{{Z)iSsQD<xBS5~ zGrB?l0Q`>L+JarL^j;q<9v16SJ|ZA?l0Y=zbgxtWpOYIJ9TUwB&2qhaC+Thu13!P4 z1YyU;m}-ltxAP2AT0InMjs zGXORNYgwGuhSQ^AH@^y3x6C@E@N~>MFqqv_$l7zgzN^b0#J<%(M#9aQzayr{F(dH- zzwlhVuL|^sk{#2hfS&9w+x(XJ^I$Db_KMuLegCc>P28E?oFoIR60O!7P9CG=*D*s?3O8 z94r=32BPD4*WLVAutCm}PttYK+lcoIa|_9vhI*%b*-M{MK1v{X01M zrSX%}w=K_c*BuZRe3^^tnm``u2B);PIRS5aDIs`}NE;y~rj7P18;x~M3$-w5XaKk- z#$`I3HtvKG`o9&G&TP38=44|sLcvCy1&^YvaZY*6V+`!ZkE%%<_K#J94-2md0x%|n7rNTV6wAxl;I=&!(h2Wtx8aC`JVA>naT}3d_6S}+ z42FVCZyRiPTe^RVW5nv1(a6F-Xy02;%F5$fOr(8(s7}b6HCd3bhBR(TuFK}SrN%Sl zLP*1$2xWL0ivjFUVrZ{r;@+q_M@##|TGwQ~`XbfZ!36$LmEw%~@$uYo;W0qxv}|9XZS`MB@B}#cT^1Z53v(LZHfA_cX(ZLIv~lC$bfb}$ z#x%9ZDqiEvJCZ+IACjZPkh&&iXJ%7!vkPZ?PTpH8n%~F*y7K;5b$R;!TX)H!Wqf1B z8D~4K;4a;Ids#jo`j| z+e>>7sb2FRr($Eo$e@Ba<7>5sv~7Os`T6CYV?Hh`F6+YdS7c`R!VaO;*w|We8(K_V5AMuAy%z`G(c#eteaiK-t{kH@3T|S56 z3|_gFKipdRF|mb7kXxmN$Fpy8yqa8)4+@)S#nIkQD1*ed_%QNEX__;axkJAi5o9<7tPYigP9})C+ z<;6^t63Jq_(C=^LQ^y;W+neO;k3C0_`#{AQc?=`)y!vTzIxkVj*63f85R~x3;eVp{ zo+atgbxbF*zzIM)BqMf}@(iyIx-2Q>$#Wl`$L_{73K!4MWnD!1JIAZjbzcxgiuodh z2hPo`@o6D`2V9MZsAI9u0;mDKC_F2u@pgH}T3Ha8aP0O=jq zRK6KyHD05^`OO|?B&VNKFZhMp$Y^2O>3A$zosE$kjQmVCz1VYeFyoz^I9kV(AKTjh z08i%ahfD4-Nh?Qilv$$XUzbNyxmGjO+oj2-ds@e76yEB&o*3IdlCDXFWDZ<*03~!! zCg1pv=o65wDGrgqyJ75{J)zX_PqKmTZLkeb_x4n|&TIWcera1fR+;oSLoei&pHY%e zP11IcHQ<)e9hQSbZ~_5Y83Nrv1VO#e3a87a!6f`B9$wJUC?QKEkQ)GgiJ|}mj1-O4 zmsKEba{#a&>K)R{D|Kza*eYTz4YKPeg;df8x6`>xNVzX#g&VJ_?6W#e$OCWYgj%I= z)nUHNOQC1E_@vUNIb7lZ1p6&-d5$1^rG_xZ6I-iU9UA46H>t7D$U;fBG&`Ay0$p>J8j7*OFNrXdlh7GmyQ&7srw3Vvegg`A-}!J_y{;K zL`f%ol=7r6a0Yf zt64#`I31Q8nSW_T2Wm?4eu-l?fb|*yTIT6!Cam^N1#u*NBM#5i?4ue>s1)zon$UtU zHtSMKbJ{<2Zfm(pUFEdu8=e!!-GHeAoENJzmHb*t3v z%0?PQt}Z8Z953*S2^q36YIErDq#gDn7vK0R@g;^BNafDh{T4|zw7H|zr`vRV;OIxA z)(xkl9Eml}PT8c7$Sa*C?HCH(l$fLJO!l0WOEA*2T&hWsEw{;p~71=-T-b2EWX|(d zbPnXNQr?Rkl1VJ3z@3`W{L;6jW5JH|BgxV)Q8cfzI@g`^V1hTWH&G*n&9@RuL8aY= z*tr=VTyAJRy*9lAdTuoMtZUfY1Cg?GJtpzm@FrJY>DwvnO7z`F!*S62qs{l#-Ei=F zW=2k5lN?0pbv*VTn$l-0D~4MpD~qLQHbFIOy8fRmP?-aRnm4vO=r2fh- zxEE_w_|eS3&pH{}Hq!7nTvuh_&j5V*aIxmV(CQ=Q3`iklIwNe4aXNu)hfoRisO=Za z;jC7<$NMlapZu{y^cyZNXM(zZMoEx5SRHmpA$pkJ{76IbdW_(aWshd6LnE$d;^VdN ziyJx;H+xuG@6e;juM5^Z9hD>nxJEhN-P^vC{8tM*!(Cml7vK+4-%!4{jn?`s z(Y5(l`51XVz!KB`ORE%Ena$OQp98xP^F=+_iu~V{%`$Bhq80dDsH6P_`cE^$?9GUb z%os8wcGduKBjAnKp6Xv`T^3dl$fv}R_XN;CLaJso_?|hONCXaeasL1bT}kJbSfGr# zn%XS7HjT&03*FE5YWO01x^_UCWB5G7pttl`ay$>#a9DCNu}kHQY7S%C`!%?vT%|uT z;acg-oY;((4%AM|r-js|#c>%B>v=V9+wx11()z9jyqv5&s9sI#bVLpR040tnq{tNV z;`bgs%3D7*eld1NYl|>i`Af_EvHlu1DRppqcinn^yt#a-wU;&{`={!#^qjYJ-1wc8 z-Aw!?#BRmZ>R99N(8)Bq@a3am`=f0z!+zd%_|s37AjfQjTZjSNlUHBOQo{FI zQ-NzCYlt1*N2~aS^v|&Vi6>D9s&x-B+FW9Umzpd93a?;nFN$N%NMjl`N~Iwl`Wf0yXJuZKEo@Ui2CvfCsAQ)0m+0BiDIFQvy6nb5Z- z!LaJLlkB~=6Y?d*8Jb%TJZ>f?v>Pnkeq64fkvhpE9t(2auS`OLPRV36(_F7VE33Cm zd0!cH+)S>I)iQG9iPDUB7D(Z|ZD=HK^}p45{{RDY+4^^Yp$?3Ra$f9>C$KfA^#C8u zb-vRg%Adn5z{7BC+4(W!pP@JUZNI`jS1k1G417IW-vmryconFC2l+03T(4bMSH;5R z$u#-5h-Z>qnL!lh`e^p|UTjQ$^%EOb=YUW1U9Ph@epHhR{h=oQS1YDs8M7Q*(rb2~ zlDO;YXNdHjN%(K*nKFj5IH8T+r+`4)mHG3*ej`2~@endde&dnonV{?sXMSJFeOv8E zt>g4h49U|2fzHfjX#W5UFLHlMU!S!x(zHMD-v0na-|_hW0EeI3=KgOi%a_CS#FBZC zg41nqut#3k8^vAUm5c03YlIJD3GHL|0|cyVX+*<*Z9 zd1tMmr+rHt=B|^5PaBIqCsk+dTEQXx=ImEPAE%fcJz>lq{>$c=$2%J(&cqL`Mu%hY zy?zIZOcAy|ua7K7zr1T~BH{fsnLR{sMABTwS9%MLH(kPH?}}Vt*EG><_E|CfXVXiZ zCi5d8kO*yq^1SznI_@7?V+1(QW#}+nOpjK-yUEQE}^t? z4*i@sUVo+*2n;gDHxz7gzLDa*QJ2%CU;wy!hvdFwUgn*R(!6izY0c_b-*(6?0O&in z=(|1?&aHToyJrh$*V$+4CAnCekJ>YER~9F_DH`?~b4`M^*5bIiFAj4k_2m2Rs**$L zWM7E)_EpI!F3`jEDOkb*(oLT0k=5C%EOD!n=l4G8ya`;zY})&Dlt{ zN!<3?tt71N{iE&X&$`eFd9sBICBsPV@|XuOxA7CYu2=1(a(gAo$)Qaadn(~;+-=;Y zr6U?lgHqBPK^C#0ws}n$)P55OYYRoWrm0aYNp;w-V6{Eg%^}{S!mYT^j2Fl@`9f-g z9){k?wk>S8fCnIZq>#Pt-M)dqSH(?_Q_rgSLJHahm$dK4$}!78*xg^T^%}A^wUo2g zO`z8?&XL0Z00``^l0bb7?aB632RWn5WfFHJD`G5jNNcU5lkSq@$O(*FN{@Mcjt~xO znoD*8NWDklLgMJhqPr$%r-d2?CiJzX&mbhPNJf!v*aezgmbsKSC08~`lhV;m9{tr8 z-DbZEax=<}kIig`F$8*?;i&R|$ybjPS^G&GEbu*$k?nhfT75q1*`@1w+n(siXa<3> z2ukL#hBLP(-79RJ$V`i|1SN4gNC$Ns;i`uvKi%D@RiKLuHuiz}l-UF|+E__wD2Y6_ z>2Kmq1X_-_-5_aOT5jn+u+T{xm9NWv7Z47i`YiIFO#%6!D1M&De)g(-#eirQ;%EhP z>8vgzVaZwIj6S7zC-9G8hz`JX+w8dRO0qTz+-_BZBIW`{$-@N`Xgvd5);E9Pm5(Iy zH59e0@S8!5a}K19Yn`Qp6S~JM99?IEu5-l@c|Fu?gWd&gNtHA(ogj-sY6swOt#j$2 ztqP4=<)SOH2>8H;mmX8;;m$Q^SZUcVM1|l6&^#ao>wWec1*aZ5{iC=Xe5~=biUV@A z30weeaDcMhTuJA>DrIml-CSJO!~r{w3PnMmDWYjI zG`x4Z_CObt0~%;*c(qydz}FV;^;T)~a+=0oi>_79d6y}yAAy30lO%!OmXOB&T>k(c*Z__L-f`I|ZkFD_`y}cZ{{VjK9&T3H;pand@mKjL zbnwXH%y*AQ#0~=2dW_`rwNiC5%%KyYd))pUHUUX7<1c)(z3y#p*E?^~T@Dtb=SnDn zVE0%gl$l=9voE?vkw=df@xs=g)E0(J=Dnm=kaq!Rut9U28rJP)NbH|UvGKa8DK{K| z`ED``hT2Znxp>ph(sO5*Iz2eEJ7UelO1-%-V!Ta|@W*elUURQ?w{;2Q@_}S=8*jCSWJIi?huHF!j2sM%iIqdIijB{hc$%-)}Un9sG8f>S|@h3@S@?+%r zjG3Rj8(^g{r+G1tQwC{s>5Tl!^WHZ-PHbqVbE6nhI9zNd@7$}rJK{`S(Cki`jXp+0 z0dN!=2>Ozt=^iBOayu8OJ{(L(`nCbzLAL6r@xEB+druDcLz$U99w)%xMxVm%=qjb? z{Wm3#^D$W09rdtL3jTrNyiSC4{p%u0i1qJHKl)c=FA1}PdU0!>KNDQ)rJh-N@mDzf zd5;m-ydwNuHs*B647ltT_PFjB2cqTTLDX9(QhrQqVD!EMEvMgp%i8q`GmaKc2E2F} z@5KEtCcjEvYom0olJ2<-Jy)t@h+OI|7Sipu+=>gYi#_Az#mk1W@cIreUxzxZEOT=) zeW4snHk%|+AL^=iOX)3(M@y0TQ-DYeaneuF>{RE=xu|&X-T8TJe+jz* zqwalIE;$>)CfoWcnVaHnn~fu!+-{+a1?$teA4Ru6BdGMlG`&nmG%aW?bS$SIdlt5I z-lK(`iXV-a6XGLs2;1O}%Q=;4aFOS*yl2y73}$yv5x9zcjUE30n%jxhdLDGojvTkb z>(bVptp0qiXNxfWKL$JGmHz;B${?0#vL1e%FPu9dd5#Sh2L*NEgvxEpowDin!P6yt zZfr9}J6v>@xbyJ28D15@WbMex=+L#pa^^ON{{SlSeJ4ArMT95B$CcReld0@!{vR}rpcVy<}v{waj@>?ex}FinQn90jXX27cMe>hrO+{h z%$-Z5u%7ZYoBm`cE`_`H_|MrNM3*P+2c}0mbVkin5Py3}+xXJ`Io4%%2ZnOq$F;6& z983L)6hA%J&H8Uo!RQ@x11qMoU317Ga~^LdTh)YEm2DXU!>=$3H^w)jM!<`=uw0yGQ$Nn(myRX3uazlo6s;JW1|3AbZj4lw`)Hp z@AF(tycsYvUyUtmVWV6XY)#X5!Ctl;Sn62vbL7i*P%W*(`iDWuIlVF&jAAAh>1!_d z*?iTE^Jb1V3v-BQ1Lb{N8YW}o#}s2r7|_rbKQhk|zs2=xy!jl+!z27}*dsA>Vrair zQC7(lA0uAjyLeph5cN3vKSs*Wk%j(K2@M02*nX?Z%66{U;>*_J%JIHGNNY8}8x~3A zC-)vpLw`Ca^;mpR#t7t<=7nJt<0NsOBu;-m_o{z!tmftaw2{Ik!HZtel!k1eMrw)&aE?-b^YanTm@9evgVg_|a zOvbb{Ieb6uQ^r}nN2%uEK`)onqmZyMpT9?vd)l538_9peyXO4Q#g3=#;rwyeay&)W z=g!Hdlj&ne4QSvmCgEjm$t03(U~{R|7pvAt`QFznx3l{onecd;c2P0Q0ckyf1QGsg z>78NCERn4wxceR#%s$TM`>$2|v%!xdN43JoBe-8r>Y8E>admegdEDP;XBVf&A)Mg# ze4K28beEkj?7ECCc=ECu*RkIH!sB(!hCjsF4s(BJs;KtcvgsFs8K;0YMQt8etznEV zp(IWG9JlCIJvf1z1-LiXH#~B>UMCScXys$BR|kz%<*5KqHB98}6Os(?D*S#gLEz)c*kFkUP_{vV$WTuZsY3eb%qS&?tQn6xds_ z-?zC^Cb{qRjmnzS7ne_E<9KxA|=#v>njO z$~ug3pGoAb&2O@DBIMBRC-63_pOt1bZLs-xKZJjpTu2PAvMr6|`>j*8yHmYgf}~bS z2W`*F4Gn94RCR-9)owOH38iVEtC7JdKIV~bfo1NmZ+k&(-`&%Swrq_|6g0H^s%eIa zkyj*_C%<5g1<6M>X3T`%A}7C*mpuRR(qw5rbqgXBO#{{J9a_`SOkOJR>P^~;`ZS|WK{y^ zY(5py#i~YuvI%517+!YYWLWaqHPAl?gt9n?>2CwKx{^~O8~V>=4VFh=(MGz}O}bV` zq;s+jpq&wOyS56~N#!tyI^IVrtVq1am$>>`Hcs4sI6d+j2Z~79;C7(-cn#QJa;(HU zVUkx7sQO#=M?*$Fk?*=M#2#=0^lXA%iqi;akd61}fSakx3mVq{00fyBrP6{NZ2tfR z%))U57kw>eri^E`#h_KvndXcTww&jkZXfW2{;Ff*wT?ck<9}sFJN)dqrvkzBH2e?x zqekclSh81V4b8&nvgJqysScLf<6=ekoQ6c+Txcu&W0GxomU*i5hHfozECkj^*XWixUy~e|L&W$+|zY-q%a} z7A!~HqczMse$Bntt-$FJVMyr@uOZ{q^WAPfWMd26Vi)20Bd1GM;ESFdyN`Uc0IE%pR=f8E!ZCb4KeP2S{&*y4E&+^5KFS z_Zqfd*Zyj;&up{8$E@%lhuhGxC!R?IrJkzAX=wid_OAX!lCi<;c`d83cv2${emIj3 zc;<-hY;}c$sNqcv4}5a8I1j=*u6*~mf5ygWnVnhE0^j^W!-7to)-tg}+{$*NME6`c zn(*LU(hthg`9lj@MQ?wahjydb^v=5^rk)yj1Q4n5&xY{2zejddFvpLR1ZGfJ$}Rw2 zlDK^%Te3XZjcFjAxn8bkx2Z;Pvh|4G-6Y21)p%vrxjs)ExV|sZ`rc1U>agatHdjZn zW2^@Xt?7L)2kj%KX5vK5+-WiLUi~^+HMf2Zubz0%!|(9-QEYC0xFs5+eI74^@)qw3 z_;x;}j@+io$(juq!Q3B}=w~swc6iujl*>=4b(|R6hS}pTcK-mnxxx8wjJ2(l=^D7; zEnO%}fr28^*1{ZUJ9W7AAR=|NHT()I&U&19_F&ENMg;yI#W_xrX+SJ{+RFp#yj!s` zV05v=helEy*As1UbdfGWtf<6IC8b}6T2olta~H8AC9*4j=Vfu)w)zo z>BkmaX*~Bj!E33cX&aTGtAo$n~u595t_U$QtNmlv!S{=!DNnsT)2Eo+GyN6BAI$LZMb z>qk1Z%N#9hT<$?}B%h7Fy~^`nW*D(zcy>0;ieZ)RXnW88AqCE9{DYdk9(Pv8>5^s1 zGuS6AZ8N)w9DfzxHPdq ze+BLwEqvFk^-iCkCtc0Ub6tasS&JL$!?b$b2fe<(Md!(GTXn~k@Rm$4_?Mz|HfhIv z5W6EKz|opw(nAl>JCB9$a`JIu%NVmt!8EoQ(sw-n0HXL`MClzv#C>jj{CVFLk;&$L z;GM&X+kbV(@xM~)7``TZ&V174Vu2ebx-FH0sicwZ6>o7Sy_X{;%y=XlA#`zY z&MBzo=jXh+Zn*NubsO5(N2GLP)LD@?n%H51nx6M?7GEdNo;KJPYjx1^b^|(FaodjP zHL|zX!s|DY% z(F|K~D}VA@yi<}J8}&QXP15uEFYZVjOZ#nSVcf3@l|NH{LF zy^_fo2Ug1LYZQ2tGtQ0e062};7;d|HURGA}H0!O1D- z!boNNtoIYmjlQafO5i9JNjJLQMmu_U1~byjKPh7xjRx+6M*iyOIjwGy_=@Ax(iTV< z;vAREHeBz>DocNQ_fL+;INP^K;xxI&$ghQbXVL)x6!bd_D6j`?O%xhA_S)y!WHJ{% zhUHxM1`RFavZ^+Qk1|c0b$;kgq^ftU`c=X}=9_5Kww9G!ziMoN*7gX~7%c941SO*$ zLN2?jBztuSI*(uy#&kwczp|=5ay)?2N&X2a9DK7WCW2Too{z< z@Q-Cv9p*^#;cRaM+^tx#I(ONiFOrG@tRcFHrjF^GEo{@e(Ds*HVB1=<$jvVrd;b6g zDnmv**KTZuW1md`3Iq74$j+@?Gz3ju@{>qbI)V2gBmsGiD2`%~$vS4T`G2C3T} zhUj-FJ@(>CRzFkjy&*Pst)R%jABgT%ZVe#sx`pNCS12uY9!er_OlOC--5@DZMG!sA4{vYMs1Z7*pu3hq{m4E2}L zci{zPhagigZAYJlZcD_@^o#i&f?y}fd@UM)aXb<1wP9olS*wCM3!5f8o-7}VC2YpW zF~D1N=Xdr{aQRcRJZT=n1D&t~l2YNue(ct_(g3B8DTZ9AVTOo}wpQp&v5I>vabX7R zcsm#V(4Qga(-U^~vb_HQRO=&EpxMj}B z%*_oN+F2NoU7x4*%G(ITlXm!7nbmR`EKPE({g zk1nr*&B?FYe&Db=j4}du*zw}^POWysmEn+-STEE^Djpn_F5yz>5OxAWi%78 z`mH@e4EW(;#$yP72KS{C8otq7n0Fje#VcTSfvmRIgz?KdjvrO~wsht3kQ~C@n&IzD z+p-8cNryMDW;P<{(^^f7rSp#$b+`4Ntt;CjpNkuahfv%$*H_2F@5__qXFW%6?B~Q7 z{Ubg2`Hpj8oPZ?P>0$RHjs4fwe5msw6G1B^h5S9F5Lf3g+vRO$W=k>t?%at)AnFn7 zI&a>V+5CB*lyQ8k$Km&vbbMThgJYVqo6Qh^A{QcVlKAGSfw6m1`5#T{*}XqKnOK<* zWbHSq?*6{(*f;GXs+Wh)1|+SjBS{zhRyll3zwLEl{-HnakEHY{#1R<8O>*V)dbEoHZ9)pt}Od;{= z8wU?d$I)Yps20aNW?+^{4xuM-R)^=ZUY+F0>u?)5@;-~MVIu= z9MTP!#YgxR=z4crgQ>vGta9xayB;Wo@prWOV3IdqOz@6;d0h?&yy(pF4K84yYv{Ro z_@tYUN8s~Zv+G|$#(q#043}CertqnYj=;a z?h|K69GQ5TIzycm>Y-+r4SJP_!!DbqPdLcJn@hLXr|^aAHSEu5ZBOi+8kpeuy)3l{5VX#xPDLlJ0DJLzHSeg8yKQB0kx!?HP}(I ze=Nxb@27Imyqq2$>e1o>i`6W0FMD2#rZXtxHa?=^_lAwg;mEp$joY`;`t}oYFtT8k z(?n$f&tpl^xa4vd*>p|jrw3eOFE#FrjlCL(Z}6e{E+39Mdn4(Q zPhrye$5Y7N*MG{ECSgqME}fr|>6TomLz*^d0QMb%?Rdr~X89OVZt~#myAAB0(RzGW zR#%hBKT7-_KJCz5G_f`&)0||z+yb-1-4VZamDx@H@=LF9JAS{(bR+5QZ%b|*PH<=- zQ5#WppW$n*5G}DlFl^OXXXfb`YYQUoC$jNOCiL2pBqbu zsm8q}#d}RuH(mqnjz%}b&{_SVo6}y^zxgP}%&wJuO}zJy{C_(#@;ZM+k&cDT@|`<( zcCGJ8{OZ*mH=;Kx98Q^+8=ZlK!z|7Qgt-r*N6wMA)p*YjL?eDrSjmh(6Q=?wSg#hwo9Gh&+~7EOZ)L&0)!8Pa$!aD-;oPn6y%k|m zixXY=w<^q#0Of3{8Qe<_=ai$lDn{Kx&gjZHR|bubC+#eamR_RJ*#n#V%S0Mj$2r7) zYYtq(SNeYlRU;hh*Z3bZ{FelT>(bnV|CLr=QS>Ldi z!^yFljh+?aCK0~hnxTh&Re{^?wPf@m!n-7O1AWS-HvN(txyh@ zd6M3rZ*^lD`G9-&1BRel`JN)yZ89Tt>1JBi?JCP=i5@qBBmj`^Wr~HZm>m za1M70raZgS*He9vnnSZk0R~y+bN0Q0&qTZ?Eq3U&yVvHKdnqK~{Gf6gf}DFmLZkqG;0RpUEq|Be^M{mRkGM-hx&*NoC)c(Or?C#}iw*?x}C% z6gKXNM_?=j_UwQg*yO7uB1d{fH;O=wEhKW7Bk$gni+{z!Jh$ZcN_e5N0of6FaU2DE z*h5;@iVYjza*{aCjc(nI7Du`ckjmrDl8{{s8zItv2>vA`@iWY8OX`OTKaAbScQ=DEWm<`)47 zA)b)u>>4|h@~p}0@MHD-rA$rhf-$6q zH`zOEsF_VZWs~5JvdP0+1a4^{Y7Z2-IlTv|V7Ptf5>|qCA+`$o%$;4YccIo5a&=^Yh%4dj^(S`btw9GQ)zBo3_iqcLh>5mVL?i%B|(q$@o>8qe;;dp*YCyOu7)XFgd$yoZ2igNmdeEpNQ+L9?PjON`FztFir_+qTk>xWkCdpPBZ*|{)f-}6J_@s&F{5MO_cv~H~o+1%-2KjGg=q}sTIA2lD z>aD`TGQ1OA$7HkRv(e$jFSmg{5$gN@0J@+3!~IpC?0;JjYZ$tK-h%<=Z)P4TPv^;h?eTE3IyX?p1W$)EK6G-l;COR4s6*y3HXscF zA=71gPxhN9Gb%V`V_9R7?zGR7_qH}UL2(CS4Syv60Nhdj-xq}H-5W2ZxP9fKoxy3a zxsJV6MSUuK2IR}-%_D;=jaC&;>RlonxO!LiY;#KbV3+~V&8o+rXuls%1*Ot70d_tU z;yWV}M&!U=!qc>TZ^N2*Uoq;P4+=Tl%q*hjwCUF) zG>cVqxAm@-ljdVMxtmzMO(W>Ak6YW!`F|rGO-UbP!od5UIA%6ck~WV?cJ{p|LdO$EU6G); ze(BwOhrwNMCmunKETChZfq!G|YwCSAR~AO_@vF9yvgG5q(Z!s~J%m`ybXr4N(0c&8 zSo1nQmD8Ze;x|Z3fuI2NkN&W{u0L6a3mx+3TVr9e;5#kQ^?se!ACB&ymmWk>J*CZK zu8AVGdvLFZ8@;EODLg&zj<7HTl6x&8*U!Gy zjG4ov^o&ONnNvGe4{itfuX`@3AEm3neWLYDPKl3^J}mJ+tIWZU!(h4=QM&d!tavwa zR#Hgd_>-daq0w2=vHFt?m_N42h7)dlhJifx{tMPj_p%6B_m{bh0KDv7Lz2E@;BKDZ zCnKrl7Z;Znw$CHEUq#88vSTp3>1mAb`7FLpd&{f4;_>QsaG>?&%Qz#rATDQ1yq>Ss z8L8XE=Id#qJ6J2D)1ong(Xe^3e#?*Ixa8=56Y5<<5??DfNG^MS<`zGS$BJ($8}nUZ zYx9R#d;aw;l1`!tTujCn?`yA}kl7sfJd#PfT$!KgAbv~Rx5L46%UstGZGCI(ccM=Q zJpEDh(EkA0wXSC5dxQOOzID*LZbw?``1p9tE_99n*J0e1`V%Zc(Rx%kSffKCU}y`A zpFbLP@W+<%UQ4w*dL7rvdiFt*O0jps_I@hrqxOv?-#UW%hFp_LGoDG@?78^y-#CqPiw2?&-!_S*USJnI()glHjm8va;F< z1L~=9J=2h{B}cfq#)<(8*;|g!GFG>;uS~C(q3BHVF~i9GOE+D}AZQ2iE`xt(2p++C ztm%x|4kYcsSz|YLyW%QqtA*9+7$Q<7lXi{=y5u*7>AF)N_XfC^1AoC@S4qZhs`A{{ z6Jpebx}8pU)ijR)X$VFr>O3xIp|+4q{X|r4)A*K%A>p7dvexlOW55hf=CHXIDb%qWC)>{=&-NUj}GqJ7~=buRVO|WTm z%?j8nTN_z!aogEY$dab%{51~jy8ebfvE`=Iou=#u42%cOlY zaG*{30}f?y0m~BBd`hR4eB7(1*QrQ zvMeg1jJ<*1yTWs}!qGw8;O7!H0W6O6?ovs!3GS3eB>|eL$8+!!&_~VZF|Chi+I#X! z-Gz?VRFaLqn#9%s?JLPI+Q&SarVawnc1xaUcKA-`*L{+>Ge{<_ z3p1J;!dg9KP$g9(o+G>8y&&li1n+x&5Er>618EiM2XTAuv_{`SFFRUByfwb6(xi{D z(ZKdV*cNJW-iK>c%pIzm$8~S+7yk3M9|0h7V57-GZAKS<1G7i*PTJ-C0D!j=mGT15 zFHIY=ebALr`di+)-8(>Q3!TZ>By06ZEKt4^WJ+XspaVw1FfnWkujqqGd*~m{BPz%S z$xcRwU+*9kzMZ)Ilfnb#rvpQfvxjfLD^@O$98H&V!;ef3*GTB&2F{ENPCa&7>lm>Flh9{{VW(493#ys7uwy0>=kS6f@Pf9>t6K2QJpX*s8-Pt~06 zetyqjjMkgoUq|Sff>Q4^BlTnF4=#@%>=?%^Z9I&F7#lcSW)i^7(VJl0oHeDGo zAjfA=n(!%icVmu@NzQN*mGwd}j5|*_A0f$1^O*Ti&A!9h-vGk?Y;KrLaQ&fCL9|rq6KT!(}8(6_>Cq)>SgJWN0LEIB81F zF+lB!RzbsgW})j0C`g;IL#67b%A+Ik@(DquMpH-Qh*I3wR=fSpLniqdv+m(J@El9@ zv4?Sp&ZglEYFaY!vzQm0DxE!~z|JMqyVhB7L`Yz^Hqrf{P+7cff{~o8c{@>Py5@PR zaNKQI1#eV!Zl%jng^QU3NKBE&!(j)5$6AB{6k16&9eiMhDpCU8FbDAXuEgpkJn3Vv zmp|g%q<$WH+IZC&YtyWcok@4x5bu9glR5`j1l%<{wXO!+FLv-o?=*<{TzjIS*c^4G zNhO38vdeZZQS96e;{>HY9^D`c;TrABA@#7AEy7y&85KD0L31clH?Xfr=Cr&^kb)-X zkAV%F?B)44Rkgzp3k?EeK)unqD73K&~*JwZ7Q!6%17^fJX`rjih^rz%YgCX zEFb%Sq8lGb8yU5^M7@tXNDgpY&m&3x?mQMdb7vIKO2s{tCD#wGKpo6^S^8U^iv@Ic z%0O`d)cD0IFC29?e4D%|jF~qQD8(8#xSNSKvsh{rcwh&)@dj;{zXw49n1dXlv_TUG z)dL5DF@2o*60h~cyK>pL!p|x-o>*=P4JH#YwO7Dxl%cuXR~eg5Kg=;7Vwxs2QmsK} zC#}(?YzFJ~7A}bVZw3+G8j5yO8p&)yv(RcZV)<(X{5(GL^;LZ-6G zsySsuzcR7c)lyYAcmz*H{I^299MKx&8cD|PCDScSy}~XRwsOA5ACOWj&W0qP5eKEd z7gG>__VvenM3zGq;e8ra*YHhL%FM3a%I9>_{in^O1MKP%emT7|Y@b3e z$tI@U+7wg=pisy7z3J^ysPSFYhEJJXI018_te$5A-uZY^@>k=OTn{Q?_mmtT<*Ux(7UYbU#SmwX-uAv8q# z!x2i@sCQ%lc4I1Xm!q4}VL5Xu@p4Z-Je)drrIsi+w5OMKD>a-zGte^4 zclpSTkUi_+!#bVFX;b$b=!|q@+pbZTLi6xI6ttY@(aip{zAN4kxFTa@f%!E+yU+nj z2VF(&pl|r|)cqWO<1viz#`c( zu4ucl5W3tw7FZ_SXQIy2bcX>5oZROJI28^|ah7dv$5V!+`E5G=x{!Pp92tfupUi9* z5H!Xs%iwwC26$9g`r%gw%-S)pQHX{SWJ%XmIMWv~+iCN$Eh(Fs4Ig~hxg3&(Y;~*W zY_1#ld`Zk!cxxWoec=tO_gj}Z&$Ps>BjKVvwJ<6Vy-OYppGcD=)v zjHHGX<{oMF!)8wS?xwKW+gs|rx1JCANpk`Wd|j@XZ~D>#62|O*M{1$G&7L-8I`C+h*lE@7@JIk@x(tKUpm!uyf+ z>Ft`Fj%;77RDmD6Iij(q9x2TqiZjW{!{$oNx!uq@%8R3DB-luoUBy4i@`#t?`v<*i zGvRr<6DbZE{yDj!AvN-4I(BPb1}?9M;*HexykYQZJB?qh(L|(X&SDtE;%)H)2{iBZ z6iTjG@S~&~-3+HOAQFP`FaxGgxYI98rWOpwJhM7 zHNLI)#KD_5mntxpWM9RsI;wO#Jfs zeVOVA8at~lKrXu-h zi;dKiQp&kpiJs1hYF1(S{6qe19n|F%LrVloGnM4v7w(cJ2|xy=Oba(I)`_#^-eV-U zsWT?+V*=5X6*Y?>U_ky*H43r`*Bt`|iYV;@yE7JL?3f-u0 zdF5SD;;Pp`;ZU+c&7P@Z!-Avxso-zM02(3?^^jz7D`I^yAm8epTWfk{@YKp@M$Fky z)XySNMhHQKNdp4|%t74^N7&U7p)-(pnSf;^Q&>8y>sPWWUg99p6(^o4|;AnjO_NE(mBQ-(F zGPJ6_vRZr{v|&U@)++1dp~yQQf)~JQ$1erdAyJzi{|gXR!MqrY%iZ*P=Q~E;0Yz;i zcvB8Y z0`cw?&+VfO5PRP|0FHGdx=4z>v_&H?yY7^fCtp`*SvwWne~T45#*#q9z1g-N;ngz2 z%=PQ}8)Ky1Z+QQZcf?2LdjhvrL}hdq!1m}lOWBE}Qe06f`GNG?_IsSNAViS+UjWaE zjgsIT0io9(3YYpS>tA)iVJ6PmaV97ik|&PW>O#~$(^9$V%mcxUFTHGJXF8hsg(A?g zdoGLp`O-wzQS>_3Ru$}*!Q^eTD+Gx4HTkDMJgbImGJ?sdf~4^Cmq)#;7|@g}oy$o5 zmv`D1#adMa#uL4$y*KWYmm8pw(L&gc@dI2Skfzijc%e;Rd+T&y_RNM;)XTqdYArnXfW~x?#}7j zi4OVlVMu#tmvP21QxjGPx3#~O>&kAVrW32}CEnuh8HYMoio9p{r4gc|4z2jZi?odG zCQ-}xb!wWqa|Mm#0HDE=KO!Gq=_5ffvCRPkGOtn z1ofqM%m{C!f1W7!Z5_(;Jv8#g$!ALl$uoUF9Fz=jhGZk;Ff+)$&YFev~0crhYlCdzE zopO68`htX-g-o!j+!%XfxDKeEeh?JF$|5N=|G9!urv{8rAT}~X(+De{1JB!p&o77& zeQ3MN<4R^*@Hh3A@KNsF5$YY?TV2?f_ytxrtSL6Xn(k?~T?r{)PuOHI_3Uth!4^j1 z#d~xVp_D82N?xDOZjI?*Mk9fuw|WfK#q=Ce{q*~NXp4Aec`Fi?^yw``v> zwdVT`I1f5KzIWnPrlof&=6x>~69&A3TLq@5Y!c?J}J? zWcy;CU|hX^qE4Q&`=W{Er000b=E>up?~@X*L4)88`AyOJUY9!_%n;Vu{dL<1={*w# z&aXC}A|4$FL54ZtpSo6R{VRWO zoChc5&$#C{CVl&K?=Ag32=lxvVb+41N)@ZO)4U;JE|7+#A3xyRjZ(K&>%Cv%t)ZUy z>&=9!W_B9h0f3^px3oqmzK#9rkCT3dNr1HAwuHqT<9?8UxDYoxn^Twzk00qHQ|>N~ zIJ)tCE5F0Z7VKeaeKlt-SgFX5t+T60ncn{4QEAlqx!ID{`u7Uw$ch7)S1wJZMbq;J zDjS;|1;n8GR(1Zn;eD8XJ<&^G({Yi`(=%fYVo%?$-NYl^=p9$IQa%4{(*a&8Gj@+d zLHeNq0dp^DqOC~l9;QNxG4s$@cYU)_RK$GoglPTf;??Qe-mm@P*+v|Q8AJ;NJ5jxw z!i9pi*VoM*XYZA}m z4(>oKUa5HsGk4}dGqYes|J>fGh=neUC6s#{ecM;LQ(f4v zdg%wB$Se{&xw+SiecZJ8MpNV@fBoDn!wtES3wDSlEN6Bp97|t7f|3w~Gvylm?T-yN zh5YOlqzvelh}Z@yiMzF%;6m~$B}s@y3L0RAMM;-PD`dn)nN|9%?mM-nO`A!EAb^i^na|Q_hRtT~Lr;fC^PRboGwu z^|oiBo#BZbuZ+ZP<(O2v4_q&K5FHJYG^ApS=k^oJv1)NCNZ|?Up!2ImOYw9iT@yrk zf81uh@rPAJuoOw_jsbR}X9)1CK>}wV-g+$!x(<~9&OU(xC-cmg0sv$%=$-HD51H96 zO0iAdQw(h5d&D>|!ahR1TDZY{QGy@vI@46`J@cB5Bqts4wgP&XCW=|8e=i#^NY3IK zfV{tPIg%l;md!1`c<%<3mqkU#Qng?}&>_bsOX8-+2X03Z`QTocUYAxC5TV!aR@^2h zGBVSe{-6)?ia(CW$q{4MT43fB5JHV%xo?FlREH3Nr@g$mOu0VB2IK~rT6R-_P8d#y zV`eBTQkahLbCz`a>nz|ue5(*g@Lv^Io%DYHp6baXJ6V<2y!iwcM?)5>d683~!m#>syjH~O-QwFgI4kMwARVPc> zs;?~b=h18_thiiwvtUpm?d_p$?Cd+`PKDuusg`XfJMznhH_pN^ldN5#mqWmPOy~0b z=_c}aGggD_mwD)N_Q|ESL_8ducJ!SmOP*Avl;MvZ-c*z0YXnx!s&U_&G4zF(6poC? zUZ|+?8BKZpSSocrS4Aq!K+X*)XY%5Y94Vqo0&Lq4#}C1iOt#1@U)$vcmkKL%FqK82^S0!;3bM)|?2zD{k~Sl6`{Gs(&L$ndnuOfE?vA+=#$9+nlrW=qQeJaBA^J z&aW)vUhnnTc`ec{`1^hP68>Sx1Lo@Am$77yI&}f-e*EjV0a62NKj?*B)aQIIp;$-v z&X62qY97=#dxYqsAxvDT^2PW!meMRl{nm(cH5VI6U*TOk5aC6RXv-CskRrbc4XCl& zG2uz}=^D^Z`fM3T*(CV^44j93^Elg*z;J5ASTYsMByfnv^6Q`tT!pG+^-{sc7f}WP zsIS4w#Gq4=C&JuuA(?9W@MeWFuSX>~a&kT5i-zuXd;)UW>5*}g;*w+J(t?rfJd}eu z9Q}?}6JFqnWOtPu6QdID*gFzlM*~yZp1LR8b0P8k^&@av3T0ITh>%#D2O9HLbs{iU ziPb^WQT0kccr^uH$>B|+!oEkgc+Xtc?=+eI7hrUwjf-aLmHbq>wjZ~H6dTE`)omIH zozsw20O@Ef?X%Z>ME8tFrB||Fs+PX14L9UJqq@N!0C;6Eufwq|`*+(4&2dtcr55dv z%dS|7b*75F%kM<~0w`~P;24wd!Rb*(@wQQ!TjdFDivS&&89Sk0&8Gbk6I!PhK~ z3mq|hKYh!j&okpGD!SRvL80K8A(l0Km;Ddwv7i0|AWD+Twmv}Wi?QvSBLm2030#HV zHKQG&Pumz@Zdlw)+;#FYhz@`;iQd;MB}mB4522lzW+I9#-=|i0`CPr&afDp?K2!`R zB7T-IdmU_nUekb!@5zNxhO-z-S2_Z5{8wrIe!mpqB3Uv*Zg{P{vS?L-9_U1f7H7!F zj8)7~dWhQ0F{LS2*?t5q6z*X{8;==ST`e3fP)I-+TtH`iTkY}73fv^W3mG*uv_63TI?Ue0Pmtwd9h1B==`f>K;Q7et z>MNvCcV#BXiYJ*g&E9@+^xKqS1Z8#S$FB-MWSJ8QneyKGt*~hV&yi=KF9Cu(%@Ke~}9PKbzVw0#&W(MVlq)z`@S5L1vk8|WOvepYb zqdyFEF3J{dyX>}HBfA|mKQtI+e)h~)E^@=Cd#jT-!T&3MqC>S_(Fn3lSUDDtWQvq) z8mlJ8_p&P5I?zcRc#3TG7-{tUy*V$TVKjOQF>{{l_8KLshZraYKqY4hUTjS**G))% z2DG>~pXH_UfR2fhK`lHb zLDR!&E2!-l9=kWi`_!e-3Wr@Y?X&<)hLCb&EGsP+ir0cPM;*Ig>Fr#ZnvTc{B@u&t zUd+)&a{=IK82SoC`|&eTk1-;}<@>of@VIn?pgnG^8OW_iRZUa8n5?nCTgC8o$e1n4 z&~%%DREorYmhd7x6~V&*B(Ah&Z1R39vN~^1lLvKYL9QG~6`_33IERfhEl)X1yeM}4 zz(22*hzv@#`d;lu)7{-$p^wix2-RceOdCFtY1U-58w5|zPKUKD@vu;@vVC^CEvORx z)E&PDeanf&42>izwBXeL-gH(E5ko_Cha1O3l!|RxBDGl99H;0Ws<=>N z4v$^Dz~fOl%PLN{m17KyxV$I{fSwYd6=SIeM>PWd$H(+q3*>p4w{dWHTYG5M!vj@I z(V$zEQ^c1m3MCbw*MimTpW{-bGGvY*PmbRVCAHG;7c-ukxwv>Dm_#mD%b46NZ}$s= z)K@Du$>?rRmBX&WN*qHW{CSBLjDsHy)pxC&U%q_33j`}nlZjkhF2PM`&4<0jC)d{Y z@QOoHBCu|9z7D$CE!5uJJ~#C&Cd5I$m94jZ%fK~Fj7x*#o(5%_z}?50Ro@Jd`B>W0 z1?ML?=iKr;*PjN4N{?v~BFKdv_x`%PX~uv6hDeNQK=wXpT#TcJ2$weWZ>Iat4sJLZsKYV30dE!8@W$eG)A&W?t90!Lp;+qRvEY;?hoKnd?n@G>Gtq@gU=zL~2Q9nJEjM7B0fs_Jb3|+v$gJReOnV|Mmk+34;3} zyN)gG{l3BNErtWv5&`2tHMuy~7!;_|tWx+FfU}&AWrD|Vw^b#cmLJ2p8TQ^;+tyiD zH&Z_ZZ?FiNu60d!Nc;*(kk~QtHef4Tds!~P46^s$#!rZg&N#K&k$G0d2+#O34?{~D zte0~y|oF`7GhF1bkI7m7EqF$bL)q#jeN#AY1#2 z+jsU;sOf4+U5Pp&-7#mD{oK#^jajZ)AyvK)hfGbXs1vrPV=RQkGVUp(QxI2QVOaKjUad?_$5Y}{%}O>2wYepRhdlUD33DO=+to-(|(1%gn8T2u(z zqZWO6n2udnH`Lk?w`F`DR%Ytf+6G~?l|l!bxhlXVDk>8()rgH?yr%Z|oGmEkE3{E} zmdyH@!ss0OHkmZ<IQcR$1P z8Cu9vku9Keyv71i)%Qu!>&FYmuKQudB2oUOCGd)s_q$`{U6a2)(LtiEz+n(NkZ7wQ zDZkBI|NYV@JV=gI_B$zJ?&>scR?{9=^h$!pr;r-0sws~Xb8prD7}u)l>zrlAezQlG zm`madAQpYvLy7nU8uq#7TD6^Av{YGg?OX`jhNW#f;nVnh29FDrGvwB1Mwp?fqaV(? zav)0s8qWr@XHqVn;>!SnJ$nW}M6To)?xlVbHA#3~6h&jAy!|_OSa}%pssJX}9NLEW&+W)sXr>$IXvK`Ka=Yi$bb+ToCRL&+mbCFO z!aQ2Yb@kVf2NH%Y&~o|L%j+I(hLR1N{?UE~*kjLdK_b`I@dzMU;=Y@Q(UtuCH^798 z3miM^u?m=S)Pa)HoBp7()nW2`>w_Yc(GERLly;NtE;sST{Gh3%bh&}7$47nV)JnS; zbhK^UZfjajAA&9t*+S~P`FI_J69KVoqhp9am&Htb4(DFQP}EHhB7hBpE*y+LA5F6* z`>i+U0jIZul%l1*UL9KMf#k=oz6*M)%w_4hvADg{%>qgGT%RN|Z}>4!Mg6_j*1-7C z@8S`iGHY>G(a_X8G`EY#W9AJmt#8Yj;I<6Tg^J6eCC)5T4)>wk%v=ktE2)#1MRab^p%WXh}Mc>{pi9Db+~WAt1z zWOWEA+D~`vQRMD+ok+$did?fX!Zf}gOKf>=Sg@3mh7h5EHs zoXCxlIo8f?GA^L!<`zu7 z@lKr7xK6AgaM?unP__#Ve2p}Dh)}xdU?@f^LQFWKVE@QkK^s4t`O?aA^*uZ}GxK$eB?I!cJZL3Z8myj9-p8r8 zTyei3cPu!1$Bx{|D(kIx!(dunk4YKpV4qs}rx7niP0XwBpk)GA7BK7cSa-A~Sq7=1 zx{KFF`Hcl+Ra`qM;!2yJ=ByK*cXTp{xE7y{J+06k{QdQioH*@mSV=)4F?O>7vlZTV z?|p(#*=u(N+&DT5E>?nCkKO}qSp&d{U#V@}u@6$dx>vivS$;ibApf|8Te%$d0^|L} zizQ|oMh4Pg68V{wVR0;anUyw^NgaA4IWO(3M{QbT48JsIWs6_w@v+V=a`a%RA*1Q0 zpVq-wia+h;OBP}j^~G@gq{9*eV?BYi35Aiy z``mQp=i;Ly4BA)i==$^$MwdmmJHs{RCUWnYha#B)%{KimVHa} zcr%-(h0IeR7)&~)tS{GoTh!>W{rgv!=aH3Kcy!K%9F3wwRFhDc%5*6-TSRHQiA$4U z-DAlD^m};0uOK}n%AKsmAi1%S{lnhL^iS!m97vmmFUTKfgf{8Pg>#4>l@ZPFFGCKp zP5$kbzSo9XJ1AQG{Ux4IPsC~SlvUl_PTK{(7Cf4XbVpq2+C&;(=7+yeCgu4LuH+OU zj1>GN$yvW8j~i^GzGo2+2L8GazcffQkbXWMEIb4kgfQ)VijtCuNsneE^JOg zGJptINaSvaFI0M@Kyv;HG&P&oduX{?E8Q=d&f9w`2qDiRhb7b*_;(o<98iv1HoVIw z%WKv$kZ{AmvrH<}aXks&G9b#Z-w()t8nI<5*Qw7n8zq*uQ z>x&)31l~ltcr9fsMSVacZD~PR@+*kByl)<$+AQ%?okZdm!E9JPZ(6KNTeCk<@C|R~ zv;VaO_IWfEVCB>goxw0q_BM054H_0svu@{5!rx<;nk-cku#%4v88`gnuykKY9$n OlRp>*|2zDf5%?dSHY}b1 literal 0 HcmV?d00001 diff --git a/test/test_check_files.py b/test/test_check_files.py new file mode 100644 index 0000000000..ca5acaa712 --- /dev/null +++ b/test/test_check_files.py @@ -0,0 +1,92 @@ +# Copyright 2026 The InfiniFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for tools/hooks/check_files.py. + +These lock the strict UTF-8 decode behaviour introduced when the hook stopped +using errors="ignore": a file whose bytes are not valid UTF-8 (and which does +not contain a NUL byte, so the binary guard misses it) must be skipped rather +than silently rewritten with dropped bytes when running in --fix mode. +""" + +import sys +from pathlib import Path + +# pytest's pythonpath includes "." but be defensive about import location. +_ROOT = Path(__file__).resolve().parents[1] +if str(_ROOT) not in sys.path: + sys.path.insert(0, str(_ROOT)) + +from tools.hooks.check_files import ( + check_merge_conflicts, + check_trailing_whitespace, +) + + +def test_trailing_whitespace_fix_skips_invalid_utf8_without_corruption(tmp_path): + # Invalid UTF-8 (no NUL byte) carrying trailing whitespace. + f = tmp_path / "blob.bin" + original = b"data \xff\xfe trailing \n" + f.write_bytes(original) + + rc = check_trailing_whitespace([f], fix=True) + + # Skipped (no error reported) and, crucially, the bytes are untouched: + # the old errors="ignore" path would have dropped the invalid bytes and + # rewritten the file, corrupting it. + assert rc == 0 + assert f.read_bytes() == original + + +def test_trailing_whitespace_fix_strips_valid_utf8(tmp_path): + f = tmp_path / "ok.txt" + f.write_bytes(b"hello \n") + + rc = check_trailing_whitespace([f], fix=True) + + assert rc == 0 + assert f.read_bytes() == b"hello\n" + + +def test_trailing_whitespace_fix_is_noop_on_clean_file(tmp_path): + f = tmp_path / "ok.txt" + f.write_bytes(b"clean\n") + + check_trailing_whitespace([f], fix=True) + + assert f.read_bytes() == b"clean\n" + + +def test_merge_conflicts_skips_binary_file_with_markers(tmp_path): + # A binary file whose bytes happen to contain ASCII conflict markers. + f = tmp_path / "blob.bin" + f.write_bytes(b"\x00<<<<<<< HEAD\n>>>>>>> branch\n") + + rc = check_merge_conflicts([f]) + + # Skipped (binary guard), so no false-positive conflict report. + assert rc == 0 + + +def test_merge_conflicts_detects_real_conflict(tmp_path): + f = tmp_path / "conflicted.txt" + f.write_text( + "<<<<<<< HEAD\nlocal\n=======\nincoming\n>>>>>>> branch\n", + encoding="utf-8", + ) + + rc = check_merge_conflicts([f]) + + # Real conflict markers are still detected. + assert rc == 1 diff --git a/tools/hooks/check_files.py b/tools/hooks/check_files.py old mode 100644 new mode 100755 index ac85253c35..7427c00483 --- a/tools/hooks/check_files.py +++ b/tools/hooks/check_files.py @@ -12,7 +12,6 @@ from pathlib import Path import yaml - MERGE_PATTERNS = ("<<<<<<< ", "=======\n", ">>>>>>> ") # Printable ASCII (0x20-0x7E) plus newline — matches the regex used by the @@ -24,6 +23,15 @@ def _read_bytes(path: Path) -> bytes: return path.read_bytes() +# Binary fixtures (OLE2/.msg, PDF, images, …) contain NUL bytes. The +# text-fixing hooks below must never rewrite them: line-ending or +# trailing-newline normalization corrupts binary files byte-for-byte +# (e.g. a .msg fixture was previously mangled by the mixed-line-ending +# and end-of-file fixers). Skip any file that contains a NUL byte. +def _is_binary(data: bytes) -> bool: + return b"\x00" in data + + def _git_paths(*args: str) -> list[Path]: proc = subprocess.run( ["git", *args, "-z"], @@ -52,7 +60,7 @@ def check_json(paths: list[Path], fix: bool = False) -> int: continue try: json.loads(path.read_text(encoding="utf-8")) - except Exception as exc: + except (json.JSONDecodeError, OSError, UnicodeDecodeError) as exc: errors.append(f"invalid json: {path}: {exc}") return _report(errors) @@ -64,7 +72,7 @@ def check_yaml(paths: list[Path], fix: bool = False) -> int: continue try: yaml.safe_load(path.read_text(encoding="utf-8")) - except Exception as exc: + except (yaml.YAMLError, OSError, UnicodeDecodeError) as exc: errors.append(f"invalid yaml: {path}: {exc}") return _report(errors) @@ -75,6 +83,8 @@ def check_eof(paths: list[Path], fix: bool = False) -> int: if not path.is_file(): continue data = _read_bytes(path) + if _is_binary(data): + continue if data and not data.endswith(b"\n"): if fix: with path.open("ab") as f: @@ -94,8 +104,17 @@ def check_trailing_whitespace(paths: list[Path], fix: bool = False) -> int: if not path.is_file(): continue try: - text = path.read_text(encoding="utf-8", errors="ignore") - except Exception: + data = _read_bytes(path) + except OSError: + continue + if _is_binary(data): + continue + try: + text = data.decode("utf-8") + except UnicodeDecodeError: + # Not valid UTF-8 (and not NUL-binary): skip rather than silently + # dropping bytes with errors="ignore", which would corrupt the + # file when run with fix=True. continue if not text: continue @@ -120,6 +139,8 @@ def check_mixed_line_endings(paths: list[Path], fix: bool = False) -> int: if not path.is_file(): continue data = _read_bytes(path) + if _is_binary(data): + continue has_crlf = b"\r\n" in data has_lf = b"\n" in data.replace(b"\r\n", b"") if has_crlf and has_lf: @@ -136,7 +157,18 @@ def check_merge_conflicts(paths: list[Path], fix: bool = False) -> int: for path in paths: if not path.is_file(): continue - text = path.read_text(encoding="utf-8", errors="ignore") + try: + data = _read_bytes(path) + except OSError: + continue + if _is_binary(data): + continue + try: + text = data.decode("utf-8") + except UnicodeDecodeError: + # Not valid UTF-8: skip rather than risking a false positive from + # bytes mangled by errors="ignore". + continue if all(pattern in text for pattern in MERGE_PATTERNS): errors.append(f"merge conflict markers: {path}") return _report(errors)