From 24bf359d02a9a7403b3fc5fb6801db13f3611566 Mon Sep 17 00:00:00 2001 From: ddux Date: Sun, 14 Jun 2026 22:22:08 -0500 Subject: [PATCH 1/2] I waited too long to commit this --- .github/workflows/benchmark-processor.yml | 42 +- .../clientcontrollers/client.controller.go | 77 +-- .../clientcontrollers/dart_hash_test.go | 38 ++ .../otelcontrollers/otel.controller.go | 2 +- backend/app/controllers/routes.go | 26 +- backend/app/controllers/symbols.controller.go | 110 ++++ backend/app/services/dart_symbolicator.go | 142 ++++ .../app/services/dart_symbolicator_test.go | 247 +++++++ backend/app/services/jwt.service.go | 4 +- backend/app/services/sourcemap_cache_test.go | 343 +--------- .../app/services/sourcemap_debugid_test.go | 32 +- backend/app/services/sourcemap_disk_cache.go | 77 --- .../app/services/sourcemap_disk_cache_test.go | 163 +++-- backend/app/services/sourcemap_resolver.go | 342 ++-------- backend/app/services/sourcemap_tw.go | 4 +- backend/app/services/symbolicator_cache.go | 47 ++ backend/app/services/turnstile.service.go | 2 +- backend/app/symbolicator/dart/bench_test.go | 51 ++ .../app.debug.elf | Bin 0 -> 239472 bytes .../expected.txt | 7 + .../dartaot-macos-arm64-dart2.19.6/trace.txt | 12 + .../app.debug.elf | Bin 0 -> 230048 bytes .../expected.txt | 7 + .../dartaot-macos-arm64-dart3.0.0/trace.txt | 12 + .../app.debug.elf | Bin 0 -> 212544 bytes .../expected.txt | 9 + .../dartaot-macos-arm64-dart3.10.1/trace.txt | 14 + .../app.darwin-arm64.symbols | Bin 0 -> 1275712 bytes .../expected.txt | 17 + .../flutter-macos-arm64-dart3.10.1/trace.txt | 24 + .../app/symbolicator/dart/fixtures_test.go | 73 +++ backend/app/symbolicator/dart/flat.go | 606 ++++++++++++++++++ backend/app/symbolicator/dart/flat_test.go | 59 ++ backend/app/symbolicator/dart/normalize.go | 28 + backend/app/symbolicator/dart/stack_frame.go | 70 ++ .../app/symbolicator/otelprocessor/cache.go | 167 +---- .../app/symbolicator/otelprocessor/config.go | 2 + .../symbolicator/otelprocessor/dart_test.go | 97 +++ .../app/symbolicator/otelprocessor/factory.go | 4 +- .../otelprocessor/processor_test.go | 2 +- .../app/symbolicator/otelprocessor/store.go | 16 + .../symbolicator/otelprocessor/symbolicate.go | 112 +++- .../{ => sourcemap}/jsstack/canonicalize.go | 0 .../jsstack/canonicalize_test.go | 0 .../{ => sourcemap}/jsstack/frames.go | 0 .../{ => sourcemap}/oxc_parity_test.go | 19 +- .../{ => sourcemap}/parity_test.go | 14 +- .../{ => sourcemap}/resolver_bench_test.go | 17 +- .../{ => sourcemap}/scopes/bench_test.go | 0 .../{ => sourcemap}/scopes/goja.go | 0 .../scopes/oxc-shim/Cargo.lock | 0 .../scopes/oxc-shim/Cargo.toml | 0 .../scopes/oxc-shim/include/oxc_shim.h | 0 .../scopes/oxc-shim/src/lib.rs | 0 .../{ => sourcemap}/scopes/oxc.go | 0 .../{ => sourcemap}/scopes/registry.go | 0 .../{ => sourcemap}/scopes/scopes.go | 0 backend/app/symbolicator/sourcemap/tw.go | 180 ++++++ .../tw_build.go} | 72 +-- backend/app/symbolicator/sourcemap/tw_test.go | 117 ++++ backend/app/symbolicator/tw.go | 161 ----- backend/app/symbolicator/tw_test.go | 155 ----- backend/app/symbolicator/twcache/disk.go | 238 +++++++ backend/app/symbolicator/twcache/mem.go | 119 ++++ backend/app/symbolicator/twcache/twcache.go | 415 ++++++------ .../app/symbolicator/twcache/twcache_test.go | 160 +++++ backend/cmd/options.go | 29 +- backend/cmd/run.go | 7 +- backend/cmd/seed.go | 4 + backend/tools/cachebench/corpus.go | 12 +- backend/tools/cachebench/run.go | 2 +- backend/traceway.go | 6 +- benchmarks/processor/README.md | 33 +- benchmarks/processor/corpusgen/main.go | 78 ++- benchmarks/processor/drain/src/main.rs | 55 +- benchmarks/processor/loadgen/main.go | 93 ++- benchmarks/processor/run-hetzner.sh | 27 +- benchmarks/processor/run-local.sh | 41 +- benchmarks/processor/seeds/dart/app.debug.elf | Bin 0 -> 212544 bytes benchmarks/processor/seeds/dart/trace.txt | 14 + examples/devtesting-embedded/main.go | 42 +- scripts/build-oxc-shim.sh | 2 +- testing/flutter-symbolication/run-local.sh | 112 ++++ 83 files changed, 3587 insertions(+), 1724 deletions(-) create mode 100644 backend/app/controllers/clientcontrollers/dart_hash_test.go create mode 100644 backend/app/controllers/symbols.controller.go create mode 100644 backend/app/services/dart_symbolicator.go create mode 100644 backend/app/services/dart_symbolicator_test.go delete mode 100644 backend/app/services/sourcemap_disk_cache.go create mode 100644 backend/app/services/symbolicator_cache.go create mode 100644 backend/app/symbolicator/dart/bench_test.go create mode 100644 backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart2.19.6/app.debug.elf create mode 100644 backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart2.19.6/expected.txt create mode 100644 backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart2.19.6/trace.txt create mode 100644 backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart3.0.0/app.debug.elf create mode 100644 backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart3.0.0/expected.txt create mode 100644 backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart3.0.0/trace.txt create mode 100644 backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart3.10.1/app.debug.elf create mode 100644 backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart3.10.1/expected.txt create mode 100644 backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart3.10.1/trace.txt create mode 100644 backend/app/symbolicator/dart/fixtures/flutter-macos-arm64-dart3.10.1/app.darwin-arm64.symbols create mode 100644 backend/app/symbolicator/dart/fixtures/flutter-macos-arm64-dart3.10.1/expected.txt create mode 100644 backend/app/symbolicator/dart/fixtures/flutter-macos-arm64-dart3.10.1/trace.txt create mode 100644 backend/app/symbolicator/dart/fixtures_test.go create mode 100644 backend/app/symbolicator/dart/flat.go create mode 100644 backend/app/symbolicator/dart/flat_test.go create mode 100644 backend/app/symbolicator/dart/normalize.go create mode 100644 backend/app/symbolicator/dart/stack_frame.go create mode 100644 backend/app/symbolicator/otelprocessor/dart_test.go rename backend/app/symbolicator/{ => sourcemap}/jsstack/canonicalize.go (100%) rename backend/app/symbolicator/{ => sourcemap}/jsstack/canonicalize_test.go (100%) rename backend/app/symbolicator/{ => sourcemap}/jsstack/frames.go (100%) rename backend/app/symbolicator/{ => sourcemap}/oxc_parity_test.go (70%) rename backend/app/symbolicator/{ => sourcemap}/parity_test.go (94%) rename backend/app/symbolicator/{ => sourcemap}/resolver_bench_test.go (71%) rename backend/app/symbolicator/{ => sourcemap}/scopes/bench_test.go (100%) rename backend/app/symbolicator/{ => sourcemap}/scopes/goja.go (100%) rename backend/app/symbolicator/{ => sourcemap}/scopes/oxc-shim/Cargo.lock (100%) rename backend/app/symbolicator/{ => sourcemap}/scopes/oxc-shim/Cargo.toml (100%) rename backend/app/symbolicator/{ => sourcemap}/scopes/oxc-shim/include/oxc_shim.h (100%) rename backend/app/symbolicator/{ => sourcemap}/scopes/oxc-shim/src/lib.rs (100%) rename backend/app/symbolicator/{ => sourcemap}/scopes/oxc.go (100%) rename backend/app/symbolicator/{ => sourcemap}/scopes/registry.go (100%) rename backend/app/symbolicator/{ => sourcemap}/scopes/scopes.go (100%) create mode 100644 backend/app/symbolicator/sourcemap/tw.go rename backend/app/symbolicator/{symbolicator.go => sourcemap/tw_build.go} (50%) create mode 100644 backend/app/symbolicator/sourcemap/tw_test.go delete mode 100644 backend/app/symbolicator/tw.go delete mode 100644 backend/app/symbolicator/tw_test.go create mode 100644 backend/app/symbolicator/twcache/disk.go create mode 100644 backend/app/symbolicator/twcache/mem.go create mode 100644 backend/app/symbolicator/twcache/twcache_test.go create mode 100644 benchmarks/processor/seeds/dart/app.debug.elf create mode 100644 benchmarks/processor/seeds/dart/trace.txt create mode 100755 testing/flutter-symbolication/run-local.sh diff --git a/.github/workflows/benchmark-processor.yml b/.github/workflows/benchmark-processor.yml index b8bd2945..641554b2 100644 --- a/.github/workflows/benchmark-processor.yml +++ b/.github/workflows/benchmark-processor.yml @@ -3,6 +3,15 @@ name: benchmark-processor on: workflow_dispatch: inputs: + language: + description: 'Symbolication language: js (5 impls incl. Honeycomb), dart (traceway-dart-mem/disk), or both' + required: true + default: 'js' + type: choice + options: + - js + - dart + - both scenarios: description: 'Scenarios to run' required: true @@ -84,6 +93,7 @@ jobs: ./bin/builder --config manifest-traceway.yaml --skip-compilation cd build-traceway && CGO_ENABLED=1 go build -tags oxc -o otelcol-bench-traceway . - name: Build honeycomb collector + if: inputs.language != 'dart' working-directory: benchmarks/processor run: | GOBIN=$PWD/bin go install go.opentelemetry.io/collector/cmd/builder@v0.143.0 @@ -97,6 +107,7 @@ jobs: cd loadgen && go mod tidy && go build -o loadgen . && cd .. cd corpusgen && go build -o corpusgen . - name: Build node-app bundle + if: inputs.language != 'dart' working-directory: testing/symbolication/node-app run: npm install && npm run build - name: Assemble artifacts @@ -104,25 +115,44 @@ jobs: run: | mkdir -p artifacts cp build-traceway/otelcol-bench-traceway artifacts/ - cp build-honeycomb/otelcol-bench-honeycomb artifacts/ - cp "$(find ~/go/pkg/mod/github.com/honeycombio -name 'libsymbolic_cabi.so' -path '*linux_x86_64*' | head -1)" artifacts/ cp drain/target/release/drain artifacts/ cp loadgen/loadgen corpusgen/corpusgen artifacts/ - cp config-traceway.yaml config-honeycomb.yaml rss-sampler.sh artifacts/ - cp ../../testing/symbolication/node-app/dist/app.mjs ../../testing/symbolication/node-app/dist/app.mjs.map artifacts/ + cp config-traceway.yaml rss-sampler.sh artifacts/ + cp -r seeds artifacts/ + if [ -f build-honeycomb/otelcol-bench-honeycomb ]; then + cp build-honeycomb/otelcol-bench-honeycomb artifacts/ + cp "$(find ~/go/pkg/mod/github.com/honeycombio -name 'libsymbolic_cabi.so' -path '*linux_x86_64*' | head -1)" artifacts/ + cp config-honeycomb.yaml artifacts/ + cp ../../testing/symbolication/node-app/dist/app.mjs ../../testing/symbolication/node-app/dist/app.mjs.map artifacts/ + fi - uses: actions/upload-artifact@v4 with: name: bench-artifacts path: benchmarks/processor/artifacts/ + setup: + runs-on: ubuntu-latest + outputs: + impls: ${{ steps.m.outputs.impls }} + steps: + - id: m + run: | + case "${{ inputs.language }}" in + js) impls='["honeycomb","traceway-oxc-mem","traceway-oxc-disk","traceway-goja-mem","traceway-goja-disk"]' ;; + dart) impls='["traceway-dart-mem","traceway-dart-disk"]' ;; + both) impls='["honeycomb","traceway-oxc-mem","traceway-oxc-disk","traceway-goja-mem","traceway-goja-disk","traceway-dart-mem","traceway-dart-disk"]' ;; + *) echo "unknown language ${{ inputs.language }}" >&2; exit 1 ;; + esac + echo "impls=$impls" >> "$GITHUB_OUTPUT" + bench: - needs: build + needs: [build, setup] runs-on: ubuntu-latest strategy: fail-fast: false max-parallel: 1 matrix: - impl: [honeycomb, traceway-oxc-mem, traceway-oxc-disk, traceway-goja-mem, traceway-goja-disk] + impl: ${{ fromJson(needs.setup.outputs.impls) }} steps: - uses: actions/checkout@v4 - uses: actions/download-artifact@v4 diff --git a/backend/app/controllers/clientcontrollers/client.controller.go b/backend/app/controllers/clientcontrollers/client.controller.go index 47b18a53..a18620f9 100644 --- a/backend/app/controllers/clientcontrollers/client.controller.go +++ b/backend/app/controllers/clientcontrollers/client.controller.go @@ -27,9 +27,6 @@ import ( type clientController struct{} -// isEmptyRaw reports whether a json.RawMessage carries no meaningful payload — -// nil, blank, `null`, `[]`, or `{}` all count as empty. Used to drop session -// recordings that would otherwise just be wasted S3 writes. func isEmptyRaw(r json.RawMessage) bool { if len(r) == 0 { return true @@ -98,10 +95,6 @@ func (e clientController) Report(c *gin.Context) { var recordingsWork []recordings.Job - // Map frontend sessionRecordingId → backend-generated exception UUID. - // Used only for the legacy exception-bound recording path; the always-on - // session linkage uses the SDK-supplied sessionId UUID directly (it IS - // the session row id by design, so no in-request map is needed). recordingIdToExceptionId := map[string]uuid.UUID{} convertSpan := traceway.StartSpan(c, "report.convert_frames") @@ -109,9 +102,7 @@ func (e clientController) Report(c *gin.Context) { for _, cs := range cf.Sessions { s := cs.ToSession(request.AppVersion, request.ServerName) s.ProjectId = projectId - // The SDK can't see the public-facing IP; we stamp it server-side - // into the attributes blob so the dashboard surfaces it alongside - // browser/url/viewport collected by the SDK. + if clientIP := c.ClientIP(); clientIP != "" { if s.Attributes == nil { s.Attributes = map[string]string{} @@ -142,13 +133,16 @@ func (e clientController) Report(c *gin.Context) { spansToInsert = append(spansToInsert, span) } } - resolveJs := project != nil && isJsFramework(project.Framework) && project.SourceMapToken != nil + resolveJs := project != nil && project.SourceMapToken != nil && jsFrameworks[project.Framework] + resolveDart := project != nil && project.SourceMapToken != nil && project.Framework == "flutter" resolveSpan := traceway.StartSpan(c, "report.resolve_stack_traces") for _, cst := range cf.StackTraces { resolvedStackTrace := cst.StackTrace if resolveJs { resolvedStackTrace = services.ResolveStackTrace(c, projectId, cst.StackTrace, cst.DebugIds) + } else if resolveDart { + resolvedStackTrace = services.ResolveDartStackTrace(c, projectId, cst.StackTrace) } est := cst.ToExceptionStackTrace(ComputeExceptionHash(resolvedStackTrace, cst.IsMessage), request.AppVersion, request.ServerName) est.StackTrace = resolvedStackTrace @@ -157,10 +151,7 @@ func (e clientController) Report(c *gin.Context) { if cst.SessionRecordingId != nil { recordingIdToExceptionId[*cst.SessionRecordingId] = est.Id } - // The SDK-provided session UID is the session row id by design, so - // parse it directly. The parent `sessions` row may have been - // upserted in an earlier request — we don't require it in this - // batch. + if cst.SessionId != nil { if parsed, err := uuid.Parse(*cst.SessionId); err == nil { est.SessionId = &parsed @@ -177,10 +168,7 @@ func (e clientController) Report(c *gin.Context) { } for _, sr := range cf.SessionRecordings { - // A recording can be exception-bound (legacy path), session-bound - // (always-on path), or both. Exception linkage requires the - // exception to be in this batch; session linkage doesn't, since - // the SDK-provided sessionId is the session row id by design. + var exceptionId uuid.UUID if sr.ExceptionId != "" { if id, ok := recordingIdToExceptionId[sr.ExceptionId]; ok { @@ -323,27 +311,24 @@ func (e clientController) Report(c *gin.Context) { } var ( - errorMessageRe = regexp.MustCompile(`(?m)^(\*?[\w.]+):\s*.+`) - causedByRe = regexp.MustCompile(`(?m)^(Caused by:\s*[\w.$]+):\s*.+`) - jsFuncLineRe = regexp.MustCompile(`(?m)^( {0,4})(.+)\(\)(\n {4}.+:\d+:\d+)$`) - urlOriginRe = regexp.MustCompile(`[a-zA-Z][a-zA-Z0-9+.\-]*://[^/\s]*`) - absolutePathRe = regexp.MustCompile(`/[^\s:]+/([^/\s:]+:\d+)`) - // Engines disagree on column conventions for the same throw, so columns - // only disambiguate when everything sits on line 1 (minified bundles with - // no matching source map). For any other line the column is dropped from - // the hash so resolved frames group across engines. + errorMessageRe = regexp.MustCompile(`(?m)^(\*?[\w.]+):\s*.+`) + causedByRe = regexp.MustCompile(`(?m)^(Caused by:\s*[\w.$]+):\s*.+`) + jsFuncLineRe = regexp.MustCompile(`(?m)^( {0,4})(.+)\(\)(\n {4}.+:\d+:\d+)$`) + urlOriginRe = regexp.MustCompile(`[a-zA-Z][a-zA-Z0-9+.\-]*://[^/\s]*`) + absolutePathRe = regexp.MustCompile(`/[^\s:]+/([^/\s:]+:\d+)`) + laterLineColRe = regexp.MustCompile(`(?m)^(\s*.+:(?:[2-9]|[1-9]\d+)):\d+$`) - versionRe = regexp.MustCompile(`@v[\d.]+`) - hexRe = regexp.MustCompile(`0x[0-9a-fA-F]+`) - uuidRe = regexp.MustCompile(`[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}`) - largeNumberRe = regexp.MustCompile(`(^|[^:\d])(\d{5,})($|[^\d])`) - emailRe = regexp.MustCompile(`[\w.\-]+@[\w.\-]+\.\w+`) - ipRe = regexp.MustCompile(`\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d+)?`) - goroutineRe = regexp.MustCompile(`goroutine \d+`) - javaLineNumRe = regexp.MustCompile(`\((\w[\w.$]*\.(?:java|kt|scala)):\d+\)`) - javaEllipsisRe = regexp.MustCompile(`\.\.\. \d+ more`) - spacesRe = regexp.MustCompile(`[ \t]+`) - newlinesRe = regexp.MustCompile(`\n+`) + versionRe = regexp.MustCompile(`@v[\d.]+`) + hexRe = regexp.MustCompile(`0x[0-9a-fA-F]+`) + uuidRe = regexp.MustCompile(`[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}`) + largeNumberRe = regexp.MustCompile(`(^|[^:\d])(\d{5,})($|[^\d])`) + emailRe = regexp.MustCompile(`[\w.\-]+@[\w.\-]+\.\w+`) + ipRe = regexp.MustCompile(`\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d+)?`) + goroutineRe = regexp.MustCompile(`goroutine \d+`) + javaLineNumRe = regexp.MustCompile(`\((\w[\w.$]*\.(?:java|kt|scala)):\d+\)`) + javaEllipsisRe = regexp.MustCompile(`\.\.\. \d+ more`) + spacesRe = regexp.MustCompile(`[ \t]+`) + newlinesRe = regexp.MustCompile(`\n+`) ) func ComputeExceptionHash(stackTrace string, isMessage bool) string { @@ -353,10 +338,7 @@ func ComputeExceptionHash(stackTrace string, isMessage bool) string { normalized = causedByRe.ReplaceAllString(normalized, "$1") normalized = errorMessageRe.ReplaceAllString(normalized, "$1") normalized = jsFuncLineRe.ReplaceAllString(normalized, "${1}${3}") - // Bundle URLs (https://host/assets/app.js, file:///srv/app.mjs, - // webpack://app/./src/x.js) must group with the same frames reported - // as bare filenames by the JS SDK, so the origin goes first and the - // remaining /path is reduced by absolutePathRe like any other path. + normalized = urlOriginRe.ReplaceAllString(normalized, "") normalized = absolutePathRe.ReplaceAllString(normalized, "$1") normalized = laterLineColRe.ReplaceAllString(normalized, "$1") @@ -390,15 +372,6 @@ var jsFrameworks = map[string]bool{ "react-native": true, } -func isJsFramework(framework string) bool { - return jsFrameworks[framework] -} - -// Browser-only frameworks. Spans arriving for these projects are page-load -// noise (web vitals, fetch spans), never server endpoints, so OTel trace -// ingest only extracts exceptions for them. Fullstack frameworks (nextjs, -// remix) and JS backends (nestjs, express, hono, cloudflare) are excluded -// because they emit legitimate SERVER spans. var frontendJsFrameworks = map[string]bool{ "react": true, "svelte": true, diff --git a/backend/app/controllers/clientcontrollers/dart_hash_test.go b/backend/app/controllers/clientcontrollers/dart_hash_test.go new file mode 100644 index 00000000..75e75adb --- /dev/null +++ b/backend/app/controllers/clientcontrollers/dart_hash_test.go @@ -0,0 +1,38 @@ +package clientcontrollers + +import "testing" + +func TestDartSymbolicatedHashIsMachineIndependent(t *testing.T) { + alice := "PaymentDeclinedException: card declined for $30.59\n" + + "#0 chargeCard (/Users/alice/app/lib/main.dart:20:3)\n" + + "#1 applyTax (/Users/alice/app/lib/main.dart:30:10)\n" + + "#2 checkout (/Users/alice/app/lib/main.dart:35:10)" + + bob := "PaymentDeclinedException: card declined for $42.00\n" + + "#0 chargeCard (/home/bob/ci/workspace/lib/main.dart:20:3)\n" + + "#1 applyTax (/home/bob/ci/workspace/lib/main.dart:30:10)\n" + + "#2 checkout (/home/bob/ci/workspace/lib/main.dart:35:10)" + + if ComputeExceptionHash(alice, false) != ComputeExceptionHash(bob, false) { + t.Errorf("same crash on different machines should hash the same") + } + + other := "PaymentDeclinedException: card declined for $30.59\n" + + "#0 refund (/Users/alice/app/lib/main.dart:88:3)" + if ComputeExceptionHash(alice, false) == ComputeExceptionHash(other, false) { + t.Errorf("different stacks should not share a hash") + } +} + +func TestDartOffsetFrameHashStable(t *testing.T) { + + report1 := "PaymentDeclinedException: card declined for $30.59\n" + + "#0 _kDartIsolateSnapshotInstructions+141e6b\n" + + "#1 _kDartIsolateSnapshotInstructions+141d9b" + report2 := "PaymentDeclinedException: card declined for $99.10\n" + + "#0 _kDartIsolateSnapshotInstructions+141e6b\n" + + "#1 _kDartIsolateSnapshotInstructions+141d9b" + if ComputeExceptionHash(report1, false) != ComputeExceptionHash(report2, false) { + t.Errorf("same crash (same offsets, different message values) should hash the same") + } +} diff --git a/backend/app/controllers/otelcontrollers/otel.controller.go b/backend/app/controllers/otelcontrollers/otel.controller.go index 58de7bbf..ad10f05e 100644 --- a/backend/app/controllers/otelcontrollers/otel.controller.go +++ b/backend/app/controllers/otelcontrollers/otel.controller.go @@ -15,7 +15,7 @@ import ( "github.com/tracewayapp/traceway/backend/app/repositories" "github.com/tracewayapp/traceway/backend/app/services" "github.com/tracewayapp/traceway/backend/app/storage" - "github.com/tracewayapp/traceway/backend/app/symbolicator/jsstack" + "github.com/tracewayapp/traceway/backend/app/symbolicator/sourcemap/jsstack" traceway "go.tracewayapp.com" ) diff --git a/backend/app/controllers/routes.go b/backend/app/controllers/routes.go index a4dc51a0..43277914 100644 --- a/backend/app/controllers/routes.go +++ b/backend/app/controllers/routes.go @@ -32,7 +32,6 @@ func RegisterControllers(router *gin.RouterGroup) { router.OPTIONS("/report", middleware.CORSReport) router.POST("/report", middleware.CORSReport, middleware.UseClientAuth, middleware.UseGzip, clientcontrollers.ClientController.Report) - // OTLP/HTTP ingestion otelGroup := router.Group("/otel") otelGroup.OPTIONS("/v1/traces", middleware.CORSReport) otelGroup.OPTIONS("/v1/metrics", middleware.CORSReport) @@ -41,7 +40,6 @@ func RegisterControllers(router *gin.RouterGroup) { otelGroup.POST("/v1/metrics", middleware.CORSReport, middleware.UseClientAuth, otelcontrollers.OtelController.ExportMetrics) otelGroup.POST("/v1/logs", middleware.CORSReport, middleware.UseClientAuth, otelcontrollers.OtelController.ExportLogs) - // Project management router.GET("/projects", middleware.UseAppAuth, ProjectController.ListProjects) router.POST("/projects", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.RequireWriteAccess, ProjectController.CreateProject) router.PUT("/projects", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.RequireWriteAccess, ProjectController.UpdateProject) @@ -49,23 +47,19 @@ func RegisterControllers(router *gin.RouterGroup) { router.GET("/health/deep", middleware.UseAppAuth, HealthDeepController.Get) - // Dashboard endpoints (projectId in query param) router.POST("/stats", middleware.UseAppAuth, middleware.RequireProjectAccess, MetricRecordController.FindHomepageStats) router.GET("/dashboard", middleware.UseAppAuth, middleware.RequireProjectAccess, DashboardController.GetDashboard) router.GET("/dashboard/overview", middleware.UseAppAuth, middleware.RequireProjectAccess, DashboardController.GetDashboardOverview) - // Metrics endpoints (projectId in query param) router.GET("/metrics/application", middleware.UseAppAuth, middleware.RequireProjectAccess, MetricsController.GetApplicationMetrics) router.GET("/metrics/stats", middleware.UseAppAuth, middleware.RequireProjectAccess, MetricsController.GetStatsMetrics) router.GET("/metrics/server", middleware.UseAppAuth, middleware.RequireProjectAccess, MetricsController.GetServerMetrics) - // New metrics query API router.POST("/metrics/query", middleware.UseAppAuth, middleware.RequireProjectAccess, MetricQueryController.Query) router.GET("/metrics/discover", middleware.UseAppAuth, middleware.RequireProjectAccess, MetricQueryController.Discover) router.GET("/metrics/discover/tags", middleware.UseAppAuth, middleware.RequireProjectAccess, MetricQueryController.DiscoverTags) router.PUT("/metrics/registry", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.RequireWriteAccess, MetricQueryController.UpdateRegistry) - // Widget groups router.GET("/widget-groups", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.Transactional, WidgetGroupController.List) router.POST("/widget-groups", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.RequireWriteAccess, middleware.Transactional, WidgetGroupController.Create) router.POST("/widget-groups/populate-defaults", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.RequireWriteAccess, middleware.Transactional, WidgetGroupController.PopulateDefaults) @@ -74,14 +68,12 @@ func RegisterControllers(router *gin.RouterGroup) { router.PUT("/widget-groups/:id", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.RequireWriteAccess, middleware.Transactional, WidgetGroupController.Update) router.DELETE("/widget-groups/:id", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.RequireWriteAccess, middleware.Transactional, WidgetGroupController.Delete) - // Widgets (within widget groups) router.POST("/widget-groups/:id/widgets", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.RequireWriteAccess, middleware.Transactional, WidgetController.Add) router.PUT("/widget-groups/:id/widgets/:wid", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.RequireWriteAccess, middleware.Transactional, WidgetController.Update) router.PUT("/widget-groups/:id/widgets/:wid/move", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.RequireWriteAccess, middleware.Transactional, WidgetController.Move) router.PUT("/widget-groups/:id/widgets/:wid/star", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.RequireWriteAccess, middleware.Transactional, WidgetController.ToggleStar) router.DELETE("/widget-groups/:id/widgets/:wid", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.RequireWriteAccess, middleware.Transactional, WidgetController.Delete) - // Endpoints (projectId in body) router.POST("/endpoints", middleware.UseAppAuth, middleware.RequireProjectAccess, EndpointController.FindAllEndpoints) router.POST("/endpoints/grouped", middleware.UseAppAuth, middleware.RequireProjectAccess, EndpointController.FindGroupedByEndpoint) router.POST("/endpoints/endpoint", middleware.UseAppAuth, middleware.RequireProjectAccess, EndpointController.FindByEndpoint) @@ -90,41 +82,33 @@ func RegisterControllers(router *gin.RouterGroup) { router.POST("/endpoints/slow", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.RequireWriteAccess, EndpointController.SetSlowEndpoint) router.POST("/endpoints/:endpointId", middleware.UseAppAuth, middleware.RequireProjectAccess, EndpointDetailController.GetEndpointDetail) - // Tasks (projectId in body) router.POST("/tasks", middleware.UseAppAuth, middleware.RequireProjectAccess, TaskController.FindAllTasks) router.POST("/tasks/grouped", middleware.UseAppAuth, middleware.RequireProjectAccess, TaskController.FindGroupedByTaskName) router.POST("/tasks/task", middleware.UseAppAuth, middleware.RequireProjectAccess, TaskController.FindByTaskName) router.POST("/tasks/:taskId", middleware.UseAppAuth, middleware.RequireProjectAccess, TaskDetailController.GetTaskDetail) - // Sessions (projectId in body / query) router.POST("/sessions", middleware.UseAppAuth, middleware.RequireProjectAccess, SessionController.FindAllSessions) router.POST("/sessions/:sessionId", middleware.UseAppAuth, middleware.RequireProjectAccess, SessionDetailController.GetSessionDetail) router.GET("/sessions/:sessionId/recording", middleware.UseAppAuth, middleware.RequireProjectAccess, SessionDetailController.GetSessionRecording) - // AI Traces (projectId in body) router.POST("/ai-traces/grouped", middleware.UseAppAuth, middleware.RequireProjectAccess, AiTraceController.FindGroupedByTraceName) router.POST("/ai-traces/trace", middleware.UseAppAuth, middleware.RequireProjectAccess, AiTraceController.FindByTraceName) router.POST("/ai-traces/:traceId", middleware.UseAppAuth, middleware.RequireProjectAccess, AiTraceController.GetAiTraceDetail) - // Distributed traces router.POST("/distributed-traces/:distributedTraceId", middleware.UseAppAuth, DistributedTraceController.GetDistributedTrace) - // Logs (projectId in body) router.POST("/logs", middleware.UseAppAuth, middleware.RequireProjectAccess, LogController.List) - // Exceptions (projectId in body) router.POST("/exception-stack-traces", middleware.UseAppAuth, middleware.RequireProjectAccess, ExceptionStackTraceController.FindGrouppedExceptionStackTraces) router.POST("/exception-stack-traces/archive", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.RequireWriteAccess, ExceptionStackTraceController.ArchiveExceptions) router.POST("/exception-stack-traces/unarchive", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.RequireWriteAccess, ExceptionStackTraceController.UnarchiveExceptions) router.POST("/exception-stack-traces/by-id/:exceptionId", middleware.UseAppAuth, middleware.RequireProjectAccess, ExceptionStackTraceController.FindById) router.POST("/exception-stack-traces/:hash", middleware.UseAppAuth, middleware.RequireProjectAccess, ExceptionStackTraceController.FindByHash) - // Auth router.POST("/login", middleware.Transactional, AuthController.Login) router.POST("/register", middleware.Transactional, AuthController.Register) router.GET("/me/login-bundle", middleware.UseAppAuth, middleware.Transactional, AuthController.LoginBundle) - // OAuth (Google, GitHub via markbates/goth) router.GET("/auth/providers", OAuthController.ListProviders) router.GET("/auth/start/:provider", middleware.Transactional, OAuthController.Begin) router.GET("/auth/callback/:provider", middleware.Transactional, OAuthController.Callback) @@ -134,42 +118,35 @@ func RegisterControllers(router *gin.RouterGroup) { router.GET("/has-organizations", middleware.Transactional, AuthController.HasOrganizations) } - // Password reset router.POST("/forgot-password", middleware.Transactional, PasswordResetController.ForgotPassword) router.GET("/password-reset/:token", PasswordResetController.ValidateToken) router.POST("/password-reset/:token", middleware.Transactional, PasswordResetController.ResetPassword) - // Organization settings (admin/owner access) router.GET("/organizations/:organizationId/settings", middleware.UseAppAuth, middleware.RequireAdminAccess, OrganizationController.GetSettings) router.PUT("/organizations/:organizationId/settings", middleware.UseAppAuth, middleware.RequireAdminAccess, middleware.Transactional, OrganizationController.UpdateSettings) router.GET("/organizations/:organizationId/members", middleware.UseAppAuth, middleware.RequireAdminAccess, OrganizationController.GetMembers) - // Member management (admin/owner) - TRANSACTIONAL router.PUT("/organizations/:organizationId/members/:userId", middleware.UseAppAuth, middleware.RequireAdminAccess, middleware.Transactional, MemberController.UpdateRole) router.DELETE("/organizations/:organizationId/members/:userId", middleware.UseAppAuth, middleware.RequireAdminAccess, middleware.Transactional, MemberController.RemoveMember) - // Invitations management (admin/owner) - TRANSACTIONAL router.POST("/organizations/:organizationId/invitations", middleware.UseAppAuth, middleware.RequireAdminAccess, middleware.Transactional, InvitationController.InviteUser) router.GET("/organizations/:organizationId/invitations", middleware.UseAppAuth, middleware.RequireAdminAccess, InvitationController.ListInvitations) router.DELETE("/organizations/:organizationId/invitations/:id", middleware.UseAppAuth, middleware.RequireAdminAccess, middleware.Transactional, InvitationController.RevokeInvitation) - // Public invitation endpoints - TRANSACTIONAL router.GET("/invitations/:token", InvitationController.GetInvitationInfo) router.POST("/invitations/:token/accept", middleware.Transactional, InvitationController.AcceptInvitation) router.POST("/invitations/:token/accept-existing", middleware.UseAppAuth, middleware.Transactional, InvitationController.AcceptExistingUser) - // Source map management router.POST("/projects/source-map-token", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.RequireWriteAccess, ProjectController.GenerateSourceMapToken) router.POST("/sourcemaps/upload", middleware.UseSourceMapAuth, SourceMapController.Upload) + router.POST("/symbols/upload", middleware.UseSourceMapAuth, SymbolsController.Upload) - // Notification channels router.GET("/notification-channels", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.Transactional, NotificationChannelController.List) router.POST("/notification-channels", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.RequireWriteAccess, middleware.Transactional, NotificationChannelController.Create) router.PUT("/notification-channels/:id", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.RequireWriteAccess, middleware.Transactional, NotificationChannelController.Update) router.DELETE("/notification-channels/:id", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.RequireWriteAccess, middleware.Transactional, NotificationChannelController.Delete) router.POST("/notification-channels/:id/test", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.RequireWriteAccess, NotificationChannelController.Test) - // Notification rules router.GET("/notification-rules", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.Transactional, NotificationRuleController.List) router.POST("/notification-rules", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.RequireWriteAccess, middleware.Transactional, NotificationRuleController.Create) router.PUT("/notification-rules/:id", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.RequireWriteAccess, middleware.Transactional, NotificationRuleController.Update) @@ -177,7 +154,6 @@ func RegisterControllers(router *gin.RouterGroup) { router.POST("/notification-rules/:id/toggle", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.RequireWriteAccess, middleware.Transactional, NotificationRuleController.Toggle) router.POST("/notification-rules/:id/snooze", middleware.UseAppAuth, middleware.RequireProjectAccess, middleware.RequireWriteAccess, middleware.Transactional, NotificationRuleController.Snooze) - // Notification history router.POST("/notification-history", middleware.UseAppAuth, middleware.RequireProjectAccess, NotificationHistoryController.List) for _, register := range ExtensionRoutes { diff --git a/backend/app/controllers/symbols.controller.go b/backend/app/controllers/symbols.controller.go new file mode 100644 index 00000000..81995a07 --- /dev/null +++ b/backend/app/controllers/symbols.controller.go @@ -0,0 +1,110 @@ +package controllers + +import ( + "fmt" + "io" + "net/http" + "path/filepath" + "strings" + + "github.com/tracewayapp/traceway/backend/app/middleware" + "github.com/tracewayapp/traceway/backend/app/services" + "github.com/tracewayapp/traceway/backend/app/storage" + "github.com/tracewayapp/traceway/backend/app/symbolicator/dart" + + "github.com/gin-gonic/gin" + traceway "go.tracewayapp.com" +) + +type symbolsController struct{} + +func (s symbolsController) Upload(c *gin.Context) { + projectId, err := middleware.GetProjectId(c) + if err != nil { + c.AbortWithError(http.StatusInternalServerError, traceway.NewStackTraceErrorf("UseSourceMapAuth middleware must be applied: %w", err)) + return + } + + if err := c.Request.ParseMultipartForm(200 << 20); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "Failed to parse multipart form"}) + return + } + + files := c.Request.MultipartForm.File["files"] + if len(files) == 0 { + c.JSON(http.StatusBadRequest, gin.H{"error": "No files uploaded"}) + return + } + + uploaded := 0 + for _, fileHeader := range files { + if filepath.Ext(fileHeader.Filename) != ".symbols" { + continue + } + if fileHeader.Size > 200<<20 { + c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("File %s exceeds 200MB limit", fileHeader.Filename)}) + return + } + + f, err := fileHeader.Open() + if err != nil { + c.AbortWithError(http.StatusInternalServerError, traceway.NewStackTraceErrorf("failed to open uploaded file %s: %w", fileHeader.Filename, err)) + return + } + data, err := io.ReadAll(f) + f.Close() + if err != nil { + c.AbortWithError(http.StatusInternalServerError, traceway.NewStackTraceErrorf("failed to read uploaded file %s: %w", fileHeader.Filename, err)) + return + } + + arch := c.PostForm("arch") + if arch == "" { + arch = archFromSymbolsFilename(fileHeader.Filename) + } + if arch == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("cannot determine arch for %s; pass an 'arch' field", fileHeader.Filename)}) + return + } + + buildID, err := dart.ReadBuildID(data) + if err != nil { + c.JSON(http.StatusUnprocessableEntity, gin.H{"error": fmt.Sprintf("%s is not a valid Dart symbols file: %v", fileHeader.Filename, err)}) + return + } + + debugId := services.NormalizeDartDebugId(c.PostForm("debug_id")) + if note := services.NormalizeDartDebugId(buildID); note != "" { + if debugId != "" && debugId != note { + c.JSON(http.StatusUnprocessableEntity, gin.H{"error": fmt.Sprintf("debug_id %s does not match the build-id note %s in %s", debugId, note, fileHeader.Filename)}) + return + } + debugId = note + } + if debugId == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("no debug_id for %s; the file has no build-id note, so pass a 'debug_id' field (the Mach-O UUID)", fileHeader.Filename)}) + return + } + + key := services.DartSymbolsKey(projectId, debugId, arch) + if err := storage.Store.Write(c, key, data); err != nil { + c.AbortWithError(http.StatusInternalServerError, traceway.NewStackTraceErrorf("failed to write symbols to storage: %w", err)) + return + } + services.InvalidateDartSymbols(key) + + uploaded++ + } + + c.JSON(http.StatusOK, gin.H{"uploaded": uploaded}) +} + +func archFromSymbolsFilename(name string) string { + base := strings.TrimSuffix(filepath.Base(name), ".symbols") + if i := strings.LastIndex(base, "-"); i != -1 { + return base[i+1:] + } + return "" +} + +var SymbolsController = symbolsController{} diff --git a/backend/app/services/dart_symbolicator.go b/backend/app/services/dart_symbolicator.go new file mode 100644 index 00000000..e43e6c27 --- /dev/null +++ b/backend/app/services/dart_symbolicator.go @@ -0,0 +1,142 @@ +package services + +import ( + "context" + "errors" + "fmt" + "strings" + + "github.com/tracewayapp/traceway/backend/app/storage" + "github.com/tracewayapp/traceway/backend/app/symbolicator/dart" + "github.com/tracewayapp/traceway/backend/app/symbolicator/twcache" + + "github.com/google/uuid" + traceway "go.tracewayapp.com" +) + +const maxDartFrames = 50 + +func DartSymbolsKey(projectId uuid.UUID, debugId, arch string) string { + return fmt.Sprintf("dartsymbols/%s/%s-%s.symbols", projectId, NormalizeDartDebugId(debugId), NormalizeDartArch(arch)) +} + +func NormalizeDartDebugId(debugId string) string { return dart.NormalizeDebugID(debugId) } +func NormalizeDartArch(arch string) string { return dart.NormalizeArch(arch) } + +func ResolveDartStackTrace(ctx context.Context, projectId uuid.UUID, rawTrace string) string { + if !dart.IsNonSymbolic(rawTrace) { + return rawTrace + } + trace := dart.ParseTrace(rawTrace) + if len(trace.Frames) == 0 { + return rawTrace + } + + data, done := loadDartData(ctx, projectId, trace) + defer done() + + var b strings.Builder + if preamble := dartErrorPreamble(rawTrace); preamble != "" { + b.WriteString(preamble) + b.WriteByte('\n') + } + + n := 0 + for _, f := range trace.Frames { + if n >= maxDartFrames { + break + } + var resolved []dart.SymFrame + if data != nil { + resolved = dart.LookupFlat(data, f) + } + if len(resolved) == 0 { + + fmt.Fprintf(&b, "#%d %s+%x\n", n, dart.InstructionSymbol(f.Section), f.Offset) + n++ + continue + } + for _, sf := range resolved { + if n >= maxDartFrames { + break + } + fmt.Fprintf(&b, "#%d %s (%s)\n", n, sf.Function, sf.Location()) + n++ + } + } + + out := strings.TrimRight(b.String(), "\n") + if out == "" { + return rawTrace + } + return out +} + +func dartErrorPreamble(raw string) string { + lines := strings.Split(raw, "\n") + cut := len(lines) + for i, ln := range lines { + if strings.HasPrefix(strings.TrimSpace(ln), "***") { + cut = i + break + } + } + return strings.TrimRight(strings.Join(lines[:cut], "\n"), "\n") +} + +func loadDartData(ctx context.Context, projectId uuid.UUID, trace dart.StackTrace) ([]byte, func()) { + + if trace.BuildID == "" || trace.Arch == "" { + return nil, noop + } + cacheKey := dartFlatKey(DartSymbolsKey(projectId, trace.BuildID, trace.Arch)) + if sharedCache.IsNegative(cacheKey) { + return nil, noop + } + data, done, err := sharedCache.Get(ctx, cacheKey, loadDartBlob(cacheKey)) + if err != nil { + return nil, noop + } + return data, done +} + +func dartFlatKey(symbolsKey string) string { + return strings.TrimSuffix(symbolsKey, ".symbols") + ".tw" +} + +func InvalidateDartSymbols(keys ...string) { + for _, k := range keys { + cacheKey := dartFlatKey(k) + sharedCache.Invalidate(cacheKey) + _ = storage.Store.Delete(context.Background(), cacheKey) + } +} + +func loadDartBlob(cacheKey string) twcache.LoadFunc { + symbolsKey := strings.TrimSuffix(cacheKey, ".tw") + ".symbols" + return func(ctx context.Context) ([]byte, error) { + base := context.WithoutCancel(ctx) + + if twBytes, err := readWithTimeout(base, cacheKey); err == nil { + if dart.ValidFlat(twBytes) { + return twBytes, nil + } + + } else if !errors.Is(err, storage.ErrNotFound) { + traceway.CaptureException(fmt.Errorf("failed to read dart flat artifact, rebuilding (key=%s): %w", cacheKey, err)) + } + + elf, err := readWithTimeout(base, symbolsKey) + if err != nil { + return nil, err + } + blob, buildErr := dart.BuildFlat(elf) + if buildErr != nil { + return nil, fmt.Errorf("failed to build dart flat artifact (key=%s): %w", symbolsKey, buildErr) + } + if werr := storage.Store.Write(base, cacheKey, blob); werr != nil { + traceway.CaptureException(fmt.Errorf("failed to persist dart flat artifact (key=%s): %w", cacheKey, werr)) + } + return blob, nil + } +} diff --git a/backend/app/services/dart_symbolicator_test.go b/backend/app/services/dart_symbolicator_test.go new file mode 100644 index 00000000..f35d2ef7 --- /dev/null +++ b/backend/app/services/dart_symbolicator_test.go @@ -0,0 +1,247 @@ +package services + +import ( + "context" + "os" + "path/filepath" + "regexp" + "strings" + "sync" + "testing" + + "github.com/tracewayapp/traceway/backend/app/storage" + + "github.com/google/uuid" +) + +const dartFixtureDir = "../symbolicator/dart/fixtures/flutter-macos-arm64-dart3.10.1" + +const fixtureBuildID = "fe664295997135e7b67b648ba66ca9eb" + +type dartMemStore struct { + mu sync.Mutex + data map[string][]byte +} + +func newDartMemStore() *dartMemStore { return &dartMemStore{data: map[string][]byte{}} } + +func (s *dartMemStore) Write(_ context.Context, key string, data []byte) error { + s.mu.Lock() + defer s.mu.Unlock() + s.data[key] = data + return nil +} + +func (s *dartMemStore) Read(_ context.Context, key string) ([]byte, error) { + s.mu.Lock() + defer s.mu.Unlock() + d, ok := s.data[key] + if !ok { + return nil, storage.ErrNotFound + } + return d, nil +} + +func (s *dartMemStore) Delete(_ context.Context, key string) error { + s.mu.Lock() + defer s.mu.Unlock() + delete(s.data, key) + return nil +} + +func readDartFixture(t *testing.T, name string) []byte { + t.Helper() + b, err := os.ReadFile(filepath.Join(dartFixtureDir, name)) + if err != nil { + t.Fatal(err) + } + return b +} + +var frameLineRe = regexp.MustCompile(`^#\d+\s+(.*)$`) + +func resolvedFrameLines(out string) []string { + var lines []string + for _, ln := range strings.Split(out, "\n") { + if m := frameLineRe.FindStringSubmatch(ln); m != nil { + lines = append(lines, strings.TrimSpace(m[1])) + } + } + return lines +} + +func expectedLines(b []byte) []string { + var out []string + for _, ln := range strings.Split(string(b), "\n") { + if strings.TrimSpace(ln) != "" { + out = append(out, strings.TrimSpace(ln)) + } + } + return out +} + +func TestResolveDartStackTraceArchFallback(t *testing.T) { + useMemCache(t) + prev := storage.Store + defer func() { storage.Store = prev }() + store := newDartMemStore() + storage.Store = store + + projectId := uuid.New() + symbols := readDartFixture(t, "app.darwin-arm64.symbols") + + store.data[DartSymbolsKey(projectId, fixtureBuildID, "arm64")] = symbols + + raw := string(readDartFixture(t, "trace.txt")) + out := ResolveDartStackTrace(context.Background(), projectId, raw) + + got := resolvedFrameLines(out) + want := expectedLines(readDartFixture(t, "expected.txt")) + if len(got) != len(want) { + t.Fatalf("frame count: got %d want %d\nout:\n%s", len(got), len(want), out) + } + for i := range want { + if got[i] != want[i] { + t.Errorf("frame %d: got %q want %q", i, got[i], want[i]) + } + } + if !strings.Contains(out, "chargeCard (") || !strings.Contains(out, "main.dart:20:3") { + t.Errorf("missing chargeCard frame in:\n%s", out) + } +} + +func TestResolveDartStackTraceNoSymbolsStable(t *testing.T) { + useMemCache(t) + prev := storage.Store + defer func() { storage.Store = prev }() + storage.Store = newDartMemStore() + + raw := string(readDartFixture(t, "trace.txt")) + + rawShifted := shiftAbsAddresses(raw) + if rawShifted == raw { + t.Fatal("test setup: abs addresses were not shifted") + } + + pid := uuid.New() + out1 := ResolveDartStackTrace(context.Background(), pid, raw) + out2 := ResolveDartStackTrace(context.Background(), uuid.New(), rawShifted) + + if out1 != out2 { + t.Errorf("same crash, different abs -> different output:\n--- out1 ---\n%s\n--- out2 ---\n%s", out1, out2) + } + if strings.Contains(out1, "build_id:") || strings.Contains(out1, "abs ") { + t.Errorf("volatile header/abs leaked into normalized output:\n%s", out1) + } + if !strings.Contains(out1, "_kDartIsolateSnapshotInstructions+") { + t.Errorf("expected stable offset frames in:\n%s", out1) + } +} + +func shiftAbsAddresses(raw string) string { + re := regexp.MustCompile(`abs [0-9a-fA-F]+`) + return re.ReplaceAllString(raw, "abs 00000007abcdef00") +} + +func TestDartSymbolsColdLoadsFromFlatArtifact(t *testing.T) { + useMemCache(t) + prev := storage.Store + defer func() { storage.Store = prev }() + store := newDartMemStore() + storage.Store = store + + projectId := uuid.New() + archKey := DartSymbolsKey(projectId, fixtureBuildID, "arm64") + symbols := readDartFixture(t, "app.darwin-arm64.symbols") + store.data[archKey] = symbols + raw := string(readDartFixture(t, "trace.txt")) + + if out := ResolveDartStackTrace(context.Background(), projectId, raw); !strings.Contains(out, "chargeCard (") { + t.Fatalf("first resolve did not symbolicate:\n%s", out) + } + twKey := dartFlatKey(archKey) + store.mu.Lock() + flat, hasFlat := store.data[twKey] + store.mu.Unlock() + if !hasFlat { + t.Fatalf("expected a flat artifact at %s", twKey) + } + t.Logf("flat artifact %d bytes vs symbols %d bytes", len(flat), len(symbols)) + + sharedCache = newSymbolicatorCache() + store.mu.Lock() + delete(store.data, archKey) + store.mu.Unlock() + + out := ResolveDartStackTrace(context.Background(), projectId, raw) + if !strings.Contains(out, "chargeCard (") || !strings.Contains(out, "main.dart:20:3") { + t.Errorf("cold load from .tw failed:\n%s", out) + } +} + +func TestDartSymbolsLocalDiskTier(t *testing.T) { + prev := storage.Store + defer func() { storage.Store = prev }() + store := newDartMemStore() + storage.Store = store + + dir := t.TempDir() + useDiskCache(t, dir, 64<<20) + + projectId := uuid.New() + archKey := DartSymbolsKey(projectId, fixtureBuildID, "arm64") + store.data[archKey] = readDartFixture(t, "app.darwin-arm64.symbols") + raw := string(readDartFixture(t, "trace.txt")) + + if out := ResolveDartStackTrace(context.Background(), projectId, raw); !strings.Contains(out, "chargeCard (") { + t.Fatalf("first resolve failed:\n%s", out) + } + + useDiskCache(t, dir, 64<<20) + + store.mu.Lock() + delete(store.data, archKey) + delete(store.data, dartFlatKey(archKey)) + store.mu.Unlock() + + out := ResolveDartStackTrace(context.Background(), projectId, raw) + if !strings.Contains(out, "chargeCard (") || !strings.Contains(out, "main.dart:20:3") { + t.Errorf("local disk tier did not serve the artifact:\n%s", out) + } +} + +func TestDartSymbolsKeyMatchesAcrossForms(t *testing.T) { + pid := uuid.New() + machoUUID := "FE664295-9971-35E7-B67B-648BA66CA9EB" + headerID := "fe664295997135e7b67b648ba66ca9eb" + if DartSymbolsKey(pid, machoUUID, "arm64") != DartSymbolsKey(pid, headerID, "arm64") { + t.Fatal("Mach-O UUID and trace-header id must produce the same key") + } + if DartSymbolsKey(pid, headerID, "x86_64") != DartSymbolsKey(pid, headerID, "x64") { + t.Error("arch synonyms should collapse to the same key") + } +} + +func TestResolveDartStackTraceInvalidationParity(t *testing.T) { + useMemCache(t) + prev := storage.Store + defer func() { storage.Store = prev }() + store := newDartMemStore() + storage.Store = store + + projectId := uuid.New() + raw := string(readDartFixture(t, "trace.txt")) + + if out := ResolveDartStackTrace(context.Background(), projectId, raw); strings.Contains(out, "chargeCard (") { + t.Fatal("did not expect symbolication before upload") + } + + archKey := DartSymbolsKey(projectId, fixtureBuildID, "arm64") + store.data[archKey] = readDartFixture(t, "app.darwin-arm64.symbols") + InvalidateDartSymbols(archKey) + + out := ResolveDartStackTrace(context.Background(), projectId, raw) + if !strings.Contains(out, "chargeCard (") { + t.Errorf("symbols not picked up after invalidation:\n%s", out) + } +} diff --git a/backend/app/services/jwt.service.go b/backend/app/services/jwt.service.go index a394499b..a17bd954 100644 --- a/backend/app/services/jwt.service.go +++ b/backend/app/services/jwt.service.go @@ -1,9 +1,9 @@ package services import ( - "github.com/tracewayapp/traceway/backend/app/config" "errors" "fmt" + "github.com/tracewayapp/traceway/backend/app/config" "time" "github.com/golang-jwt/jwt/v5" @@ -34,7 +34,7 @@ func GenerateToken(userId int, email string) (string, error) { UserId: userId, Email: email, RegisteredClaims: jwt.RegisteredClaims{ - ExpiresAt: jwt.NewNumericDate(time.Now().Add(7 * 24 * time.Hour)), // 7 days + ExpiresAt: jwt.NewNumericDate(time.Now().Add(7 * 24 * time.Hour)), IssuedAt: jwt.NewNumericDate(time.Now()), NotBefore: jwt.NewNumericDate(time.Now()), }, diff --git a/backend/app/services/sourcemap_cache_test.go b/backend/app/services/sourcemap_cache_test.go index 680fbd3f..d7b4a962 100644 --- a/backend/app/services/sourcemap_cache_test.go +++ b/backend/app/services/sourcemap_cache_test.go @@ -1,7 +1,6 @@ package services import ( - "container/list" "context" "errors" "fmt" @@ -11,36 +10,10 @@ import ( "time" "github.com/tracewayapp/traceway/backend/app/storage" - "github.com/tracewayapp/traceway/backend/app/symbolicator" "github.com/google/uuid" ) -func newTestSourceMapCache(maxEntries int, maxBytes int64) *sourceMapCache { - return &sourceMapCache{ - items: make(map[string]*list.Element), - order: list.New(), - loading: make(map[string]*resolverLoad), - negative: make(map[string]*negativeEntry), - maxEntries: maxEntries, - maxBytes: maxBytes, - } -} - -func storageResolverBuild(key string) resolverBuild { - return func(ctx context.Context) (*symbolicator.Resolver, int64, error) { - data, err := storage.Store.Read(ctx, key) - if err != nil { - return nil, 0, err - } - r, err := symbolicator.NewResolver(data, nil) - if err != nil { - return nil, 0, err - } - return r, int64(len(data)), nil - } -} - type countingStorage struct { mu sync.Mutex reads map[string]int @@ -73,222 +46,8 @@ func (c *countingStorage) Read(_ context.Context, key string) ([]byte, error) { return d, nil } -func TestSourceMapCacheSingleflight(t *testing.T) { - prev := storage.Store - defer func() { storage.Store = prev }() - cs := &countingStorage{reads: map[string]int{}, data: map[string][]byte{ - "singleflight-test.js.map": []byte(`{"version":3,"sources":["a.js"],"names":[],"mappings":"AAAA"}`), - }} - storage.Store = cs - c := newTestSourceMapCache(10, 1<<20) - - const n = 16 - results := make([]*symbolicator.Resolver, n) - var wg sync.WaitGroup - start := make(chan struct{}) - for i := range n { - wg.Go(func() { - <-start - r, err := c.getOrBuild(context.Background(), "singleflight-test.js.map", storageResolverBuild("singleflight-test.js.map")) - if err != nil { - t.Error(err) - return - } - results[i] = r - }) - } - close(start) - wg.Wait() - - if got := cs.reads["singleflight-test.js.map"]; got != 1 { - t.Errorf("expected 1 storage read for concurrent lookups, got %d", got) - } - for i := 1; i < n; i++ { - if results[i] != results[0] { - t.Fatal("expected all callers to share a single resolver instance") - } - } - - if _, err := c.getOrBuild(context.Background(), "singleflight-test.js.map", storageResolverBuild("singleflight-test.js.map")); err != nil { - t.Fatal(err) - } - if got := cs.reads["singleflight-test.js.map"]; got != 1 { - t.Errorf("expected cached lookup to not hit storage, got %d reads", got) - } -} - -func TestSourceMapCacheDistinctKeysConcurrent(t *testing.T) { - prev := storage.Store - defer func() { storage.Store = prev }() - cs := &countingStorage{reads: map[string]int{}, data: map[string][]byte{}} - const keys = 8 - for i := range keys { - cs.data[fmt.Sprintf("distinct-%d.js.map", i)] = []byte(`{"version":3,"sources":["a.js"],"names":[],"mappings":"AAAA"}`) - } - storage.Store = cs - c := newTestSourceMapCache(keys, 1<<20) - - var wg sync.WaitGroup - start := make(chan struct{}) - results := make([]*symbolicator.Resolver, keys*4) - for i := range keys * 4 { - wg.Go(func() { - <-start - key := fmt.Sprintf("distinct-%d.js.map", i%keys) - r, err := c.getOrBuild(context.Background(), key, storageResolverBuild(key)) - if err != nil { - t.Error(err) - return - } - results[i] = r - }) - } - close(start) - wg.Wait() - - for i := range keys { - key := fmt.Sprintf("distinct-%d.js.map", i) - if got := cs.reads[key]; got != 1 { - t.Errorf("key %s: expected 1 storage read, got %d", key, got) - } - } - for i := range keys * 4 { - if results[i] != results[i%keys] { - t.Fatal("callers of the same key should share one instance") - } - } -} - -type flakyStorage struct { - mu sync.Mutex - reads int - failures int - data []byte -} - -func (f *flakyStorage) Write(_ context.Context, _ string, _ []byte) error { return nil } - -func (f *flakyStorage) Delete(_ context.Context, _ string) error { return nil } - -func (f *flakyStorage) Read(_ context.Context, _ string) ([]byte, error) { - f.mu.Lock() - defer f.mu.Unlock() - f.reads++ - if f.reads <= f.failures { - return nil, errors.New("storage down") - } - return f.data, nil -} - -func TestSourceMapCacheFailedLoadRetries(t *testing.T) { - prev := storage.Store - defer func() { storage.Store = prev }() - fs := &flakyStorage{failures: 1, data: []byte(`{"version":3,"sources":["a.js"],"names":[],"mappings":"AAAA"}`)} - storage.Store = fs - c := newTestSourceMapCache(10, 1<<20) - - if _, err := c.getOrBuild(context.Background(), "flaky.js.map", storageResolverBuild("flaky.js.map")); err == nil { - t.Fatal("expected first load to fail") - } - c.mu.Lock() - if c.failures != 1 { - t.Errorf("expected 1 recorded failure, got %d", c.failures) - } - c.mu.Unlock() - r, err := c.getOrBuild(context.Background(), "flaky.js.map", storageResolverBuild("flaky.js.map")) - if err != nil || r == nil { - t.Fatalf("expected retry to succeed, got %v", err) - } - if fs.reads != 2 { - t.Errorf("expected 2 storage reads (fail then retry), got %d", fs.reads) - } - if _, err := c.getOrBuild(context.Background(), "flaky.js.map", storageResolverBuild("flaky.js.map")); err != nil { - t.Fatal(err) - } - if fs.reads != 2 { - t.Errorf("expected cached lookup after retry, got %d reads", fs.reads) - } -} - -type blockingPanicStorage struct { - release chan struct{} -} - -func (b *blockingPanicStorage) Write(_ context.Context, _ string, _ []byte) error { return nil } - -func (b *blockingPanicStorage) Delete(_ context.Context, _ string) error { return nil } - -func (b *blockingPanicStorage) Read(_ context.Context, _ string) ([]byte, error) { - <-b.release - panic("storage exploded") -} - -func TestSourceMapCachePanicRecovery(t *testing.T) { - prev := storage.Store - defer func() { storage.Store = prev }() - release := make(chan struct{}) - storage.Store = &blockingPanicStorage{release: release} - c := newTestSourceMapCache(10, 1<<20) - - type result struct { - resolver *symbolicator.Resolver - err error - } - leader := make(chan result, 1) - go func() { - r, err := c.getOrBuild(context.Background(), "boom.js.map", storageResolverBuild("boom.js.map")) - leader <- result{r, err} - }() - - deadline := time.Now().Add(2 * time.Second) - for { - c.mu.Lock() - _, loading := c.loading["boom.js.map"] - c.mu.Unlock() - if loading { - break - } - if time.Now().After(deadline) { - t.Fatal("load never started") - } - time.Sleep(time.Millisecond) - } - - waiters := make(chan result, 2) - for range 2 { - go func() { - r, err := c.getOrBuild(context.Background(), "boom.js.map", storageResolverBuild("boom.js.map")) - waiters <- result{r, err} - }() - } - - close(release) - - r := <-leader - if r.err == nil || r.resolver != nil { - t.Fatalf("expected leader to receive panic error, got resolver=%v err=%v", r.resolver, r.err) - } - for range 2 { - r := <-waiters - if r.err == nil || r.resolver != nil { - t.Fatalf("expected waiter to receive an error, got resolver=%v err=%v", r.resolver, r.err) - } - } - - c.mu.Lock() - defer c.mu.Unlock() - if len(c.loading) != 0 { - t.Error("loading entry leaked after panic") - } - if c.order.Len() != 0 { - t.Error("nothing should be cached after a failed load") - } - if c.failures == 0 { - t.Error("expected at least one recorded failure") - } -} - func TestResolveStackTraceFailedMapAttemptedOncePerTrace(t *testing.T) { + useMemCache(t) prev := storage.Store defer func() { storage.Store = prev }() cs := &countingStorage{reads: map[string]int{}, data: map[string][]byte{}} @@ -307,52 +66,26 @@ func TestResolveStackTraceFailedMapAttemptedOncePerTrace(t *testing.T) { } } -func TestSourceMapNegativeBackoffEscalates(t *testing.T) { - c := newTestSourceMapCache(10, 1<<20) - - c.mu.Lock() - c.markNegativeLocked("k", sourceMapNegativeBaseTTL) - first := time.Until(c.negative["k"].expiresAt) - c.mu.Unlock() - if first > sourceMapNegativeBaseTTL || first < sourceMapNegativeBaseTTL-time.Second { - t.Errorf("first failure should use the base TTL, got %v", first) - } - - c.mu.Lock() - c.markNegativeLocked("k", sourceMapNegativeBaseTTL) - second := time.Until(c.negative["k"].expiresAt) - for range 20 { - c.markNegativeLocked("k", sourceMapNegativeBaseTTL) - } - capped := time.Until(c.negative["k"].expiresAt) - c.mu.Unlock() - - if second < first { - t.Errorf("TTL should escalate on repeat failures: first %v, second %v", first, second) - } - if capped > sourceMapNegativeMaxTTL || capped < sourceMapNegativeMaxTTL-time.Second { - t.Errorf("TTL should cap at %v, got %v", sourceMapNegativeMaxTTL, capped) - } +type flakyStorage struct { + mu sync.Mutex + reads int } -func TestSourceMapNegativeMapPrunesAtCap(t *testing.T) { - c := newTestSourceMapCache(10, 1<<20) - c.mu.Lock() - for i := range sourceMapNegativeMaxKeys { - c.markNegativeLocked(fmt.Sprintf("k-%d", i), sourceMapNegativeBaseTTL) - } - c.markNegativeLocked("one-more", sourceMapNegativeBaseTTL) - size := len(c.negative) - c.mu.Unlock() - if size > sourceMapNegativeMaxKeys { - t.Errorf("negative map should stay at or below %d keys, got %d", sourceMapNegativeMaxKeys, size) - } +func (f *flakyStorage) Write(_ context.Context, _ string, _ []byte) error { return nil } +func (f *flakyStorage) Delete(_ context.Context, _ string) error { return nil } + +func (f *flakyStorage) Read(_ context.Context, _ string) ([]byte, error) { + f.mu.Lock() + defer f.mu.Unlock() + f.reads++ + return nil, errors.New("storage down") } func TestResolveStackTraceTransientFailureNegativeCached(t *testing.T) { + useMemCache(t) prev := storage.Store defer func() { storage.Store = prev }() - fs := &flakyStorage{failures: 1 << 30} + fs := &flakyStorage{} storage.Store = fs projectId := uuid.New() @@ -368,7 +101,7 @@ func TestResolveStackTraceTransientFailureNegativeCached(t *testing.T) { } func TestInvalidateSourceMapClearsNegative(t *testing.T) { - InitSourceMapCache(100, 64<<20) + useMemCache(t) prev := storage.Store defer func() { storage.Store = prev }() cs := &countingStorage{reads: map[string]int{}, data: map[string][]byte{}} @@ -392,7 +125,7 @@ func TestInvalidateSourceMapClearsNegative(t *testing.T) { } func TestInvalidateSourceMapEvictsStaleResolver(t *testing.T) { - InitSourceMapCache(100, 64<<20) + useMemCache(t) prev := storage.Store defer func() { storage.Store = prev }() cs := &countingStorage{reads: map[string]int{}, data: map[string][]byte{}} @@ -414,7 +147,7 @@ func TestInvalidateSourceMapEvictsStaleResolver(t *testing.T) { GenerateTWArtifacts(context.Background(), projectId, []string{"stable.js.map"}) if got := ResolveStackTrace(context.Background(), projectId, trace, nil); !strings.Contains(got, "b.js:1:1") { - t.Errorf("upload must evict both the cached resolver and the stale tw artifact, got %q", got) + t.Errorf("upload must evict both the cached artifact and the stale tw, got %q", got) } } @@ -431,7 +164,7 @@ func (b *bundleFailStorage) Write(_ context.Context, key string, data []byte) er } func (b *bundleFailStorage) Read(_ context.Context, key string) ([]byte, error) { - if b.failBundle && !strings.HasSuffix(key, ".map") { + if b.failBundle && !strings.HasSuffix(key, ".map") && !strings.HasSuffix(key, ".tw") { return nil, errors.New("storage down") } d, ok := b.data[key] @@ -442,7 +175,7 @@ func (b *bundleFailStorage) Read(_ context.Context, key string) ([]byte, error) } func TestTransientBundleReadFailureFailsBuild(t *testing.T) { - InitSourceMapCache(100, 64<<20) + useMemCache(t) prev := storage.Store defer func() { storage.Store = prev }() projectId := uuid.New() @@ -456,7 +189,7 @@ func TestTransientBundleReadFailureFailsBuild(t *testing.T) { trace := "Error: boom\n fn()\n app.js:1:1" if got := ResolveStackTrace(context.Background(), projectId, trace, nil); got != trace { - t.Errorf("a transient bundle read failure must not cache a names-less resolver, got %q", got) + t.Errorf("a transient bundle read failure must not cache a names-less artifact, got %q", got) } bs.failBundle = false @@ -466,39 +199,3 @@ func TestTransientBundleReadFailureFailsBuild(t *testing.T) { t.Errorf("expected full resolution once the bundle read recovers, got %q", got) } } - -func TestSourceMapCacheByteCapEviction(t *testing.T) { - prev := storage.Store - defer func() { storage.Store = prev }() - cs := &countingStorage{reads: map[string]int{}, data: map[string][]byte{}} - storage.Store = cs - - c := newTestSourceMapCache(10, 2000) - - content := make([]byte, 700) - for i := range content { - content[i] = 'x' - } - for i := range 3 { - key := fmt.Sprintf("evict-%d.js.map", i) - cs.data[key] = fmt.Appendf(nil, `{"version":3,"sources":["a.js"],"sourcesContent":[%q],"names":[],"mappings":"AAAA"}`, content) - if _, err := c.getOrBuild(context.Background(), key, storageResolverBuild(key)); err != nil { - t.Fatal(err) - } - } - - c.mu.Lock() - defer c.mu.Unlock() - if c.curBytes > c.maxBytes { - t.Errorf("curBytes %d exceeds maxBytes %d", c.curBytes, c.maxBytes) - } - if c.evictions == 0 { - t.Error("expected at least one eviction") - } - if _, ok := c.items["evict-2.js.map"]; !ok { - t.Error("most recent entry should still be cached") - } - if _, ok := c.items["evict-0.js.map"]; ok { - t.Error("oldest entry should have been evicted") - } -} diff --git a/backend/app/services/sourcemap_debugid_test.go b/backend/app/services/sourcemap_debugid_test.go index 47d09d54..cca4fd33 100644 --- a/backend/app/services/sourcemap_debugid_test.go +++ b/backend/app/services/sourcemap_debugid_test.go @@ -39,7 +39,7 @@ func TestExtractDebugIdFromBundle(t *testing.T) { } func TestResolveStackTracePrefersDebugId(t *testing.T) { - InitSourceMapCache(100, 64<<20) + useMemCache(t) prev := storage.Store defer func() { storage.Store = prev }() cs := &countingStorage{reads: map[string]int{}, data: map[string][]byte{}} @@ -67,7 +67,7 @@ func TestResolveStackTracePrefersDebugId(t *testing.T) { } func TestResolveStackTraceFallsBackToFilenameWhenDebugIdMissing(t *testing.T) { - InitSourceMapCache(100, 64<<20) + useMemCache(t) prev := storage.Store defer func() { storage.Store = prev }() cs := &countingStorage{reads: map[string]int{}, data: map[string][]byte{}} @@ -88,21 +88,29 @@ func TestResolveStackTraceFallsBackToFilenameWhenDebugIdMissing(t *testing.T) { } func TestInvalidateSourceMapKeepsDebugIdDir(t *testing.T) { - InitSourceMapCache(100, 64<<20) + useMemCache(t) + prev := storage.Store + defer func() { storage.Store = prev }() + storage.Store = &countingStorage{reads: map[string]int{}, data: map[string][]byte{}} + projectId := uuid.New() debugId := "85314830-023f-4cf1-a267-535f4e37bb17" - - smCache.mu.Lock() - key := SourceMapStorageKey(projectId, DebugIdMapName(debugId)) - smCache.negative[key] = &negativeEntry{} - smCache.mu.Unlock() + mapKey := SourceMapStorageKey(projectId, DebugIdMapName(debugId)) + bundleKey := SourceMapStorageKey(projectId, DebugIdBundleName(debugId)) + twKey := twKeyFor(mapKey) + + _, done, err := sharedCache.Get(context.Background(), twKey, loadSourceMapBlob(mapKey, bundleKey)) + done() + if err == nil { + t.Fatal("expected the missing map to fail to load") + } + if !sharedCache.IsNegative(twKey) { + t.Fatal("expected a negative entry after the failed load") + } InvalidateSourceMap(projectId, DebugIdBundleName(debugId)) - smCache.mu.Lock() - _, stillThere := smCache.negative[key] - smCache.mu.Unlock() - if stillThere { + if sharedCache.IsNegative(twKey) { t.Error("expected debug id map key to be invalidated") } } diff --git a/backend/app/services/sourcemap_disk_cache.go b/backend/app/services/sourcemap_disk_cache.go deleted file mode 100644 index 33dd5c6b..00000000 --- a/backend/app/services/sourcemap_disk_cache.go +++ /dev/null @@ -1,77 +0,0 @@ -package services - -import ( - "context" - "fmt" - "strings" - - "github.com/tracewayapp/traceway/backend/app/symbolicator" - "github.com/tracewayapp/traceway/backend/app/symbolicator/twcache" - - traceway "go.tracewayapp.com" -) - -type sourceMapDiskCache struct { - mem *sourceMapCache - disk *twcache.Cache -} - -func EnableSourceMapDiskCache(dir string, maxBytes int64) error { - disk, err := twcache.New(dir, maxBytes, func(err error) { - traceway.CaptureException(err) - }) - if err != nil { - return fmt.Errorf("source map disk cache: %w", err) - } - activeSMCache = &sourceMapDiskCache{mem: smCache, disk: disk} - return nil -} - -func twKeyFor(mapKey string) string { - return strings.TrimSuffix(mapKey, ".map") + ".tw" -} - -func (d *sourceMapDiskCache) getOrBuild(ctx context.Context, key string, build resolverBuild) (*symbolicator.Resolver, error) { - return d.mem.getOrBuild(ctx, key, func(ctx context.Context) (*symbolicator.Resolver, int64, error) { - return d.load(ctx, key, build) - }) -} - -func (d *sourceMapDiskCache) load(ctx context.Context, mapKey string, build resolverBuild) (*symbolicator.Resolver, int64, error) { - name := twKeyFor(mapKey) - if r, err := d.disk.Open(name); err == nil { - return r, r.ApproxSize(), nil - } - - resolver, size, err := build(ctx) - if err != nil { - return nil, 0, err - } - if r, werr := d.disk.Write(name, resolver.MarshalTW()); werr == nil { - return r, r.ApproxSize(), nil - } else { - traceway.CaptureException(fmt.Errorf("failed to write tw cache file (key=%s): %w", mapKey, werr)) - } - return resolver, size, nil -} - -func (d *sourceMapDiskCache) isNegative(key string) bool { - return d.mem.isNegative(key) -} - -func (d *sourceMapDiskCache) invalidate(key string) { - d.mem.invalidate(key) - d.disk.Remove(twKeyFor(key)) -} - -func (d *sourceMapDiskCache) stats() SourceMapCacheStats { - s := d.mem.stats() - ds := d.disk.Stats() - s.DiskEnabled = true - s.DiskEntries = ds.Entries - s.DiskBytes = ds.Bytes - s.DiskMaxBytes = ds.MaxBytes - s.DiskHits = ds.Hits - s.DiskEvictions = ds.Evictions - return s -} diff --git a/backend/app/services/sourcemap_disk_cache_test.go b/backend/app/services/sourcemap_disk_cache_test.go index 20ed749c..380e8397 100644 --- a/backend/app/services/sourcemap_disk_cache_test.go +++ b/backend/app/services/sourcemap_disk_cache_test.go @@ -9,31 +9,42 @@ import ( "testing" "github.com/tracewayapp/traceway/backend/app/storage" - "github.com/tracewayapp/traceway/backend/app/symbolicator" + "github.com/tracewayapp/traceway/backend/app/symbolicator/sourcemap" "github.com/tracewayapp/traceway/backend/app/symbolicator/twcache" "github.com/google/uuid" ) -func newTestDiskCache(t *testing.T, maxBytes int64) *sourceMapDiskCache { +func useMemCache(t *testing.T) { t.Helper() - return newTestDiskCacheAt(t, t.TempDir(), maxBytes) + prev := sharedCache + sharedCache = newSymbolicatorCache() + t.Cleanup(func() { sharedCache = prev }) } -func newTestDiskCacheAt(t *testing.T, dir string, maxBytes int64) *sourceMapDiskCache { +func useDiskCache(t *testing.T, dir string, maxBytes int64) *twcache.Cache { t.Helper() - disk, err := twcache.New(dir, maxBytes, nil) - if err != nil { - t.Fatalf("twcache.New: %v", err) + prev := sharedCache + if err := EnableSymbolicatorDiskCache(dir, maxBytes); err != nil { + t.Fatalf("EnableSymbolicatorDiskCache: %v", err) } - return &sourceMapDiskCache{ - mem: newTestSourceMapCache(100, 64<<20), - disk: disk, + t.Cleanup(func() { sharedCache = prev }) + return sharedCache +} + +func resolveSMFrame(t *testing.T, ctx context.Context, mapKey, bundleKey string) (sourcemap.StackTraceFrame, bool, error) { + t.Helper() + data, done, err := sharedCache.Get(ctx, twKeyFor(mapKey), loadSourceMapBlob(mapKey, bundleKey)) + if err != nil { + return sourcemap.StackTraceFrame{}, false, err } + defer done() + frame, ok := sourcemap.LookupTW(data, 0, 10) + return frame, ok, nil } -func twPathFor(d *sourceMapDiskCache, mapKey string) string { - return filepath.Join(d.disk.Dir(), filepath.FromSlash(twKeyFor(mapKey))) +func twPathFor(disk *twcache.Cache, mapKey string) string { + return filepath.Join(disk.Dir(), filepath.FromSlash(twKeyFor(mapKey))) } func swapStorage(t *testing.T) *countingStorage { @@ -47,9 +58,8 @@ func swapStorage(t *testing.T) *countingStorage { return cs } -func assertSimpleLookup(t *testing.T, r *symbolicator.Resolver) { +func assertSimpleLookup(t *testing.T, frame sourcemap.StackTraceFrame, ok bool) { t.Helper() - frame, ok := r.Lookup(0, 10) if !ok { t.Fatal("expected lookup to resolve") } @@ -60,7 +70,7 @@ func assertSimpleLookup(t *testing.T, r *symbolicator.Resolver) { func TestDiskCacheBuildsThenServesFromLocalFile(t *testing.T) { cs := swapStorage(t) - d := newTestDiskCache(t, 64<<20) + disk := useDiskCache(t, t.TempDir(), 64<<20) projectId := uuid.New() prefix := fmt.Sprintf("sourcemaps/%s/", projectId) @@ -70,28 +80,27 @@ func TestDiskCacheBuildsThenServesFromLocalFile(t *testing.T) { mapKey := prefix + "minified.js.map" bundleKey := prefix + "minified.js" - r, err := d.getOrBuild(context.Background(), mapKey, buildResolver(mapKey, bundleKey)) + frame, ok, err := resolveSMFrame(t, context.Background(), mapKey, bundleKey) if err != nil { - t.Fatalf("getOrBuild: %v", err) + t.Fatalf("resolve: %v", err) } - assertSimpleLookup(t, r) + assertSimpleLookup(t, frame, ok) - if _, err := os.Stat(twPathFor(d, mapKey)); err != nil { + if _, err := os.Stat(twPathFor(disk, mapKey)); err != nil { t.Fatalf("expected tw file on disk: %v", err) } if smBuilds.Load() != 1 { t.Fatalf("builds: got %d, want 1", smBuilds.Load()) } - restarted := newTestDiskCacheAt(t, d.disk.Dir(), 64<<20) - + restarted := useDiskCache(t, disk.Dir(), 64<<20) mapReads := cs.reads[mapKey] - r2, err := restarted.getOrBuild(context.Background(), mapKey, buildResolver(mapKey, bundleKey)) + frame2, ok2, err := resolveSMFrame(t, context.Background(), mapKey, bundleKey) if err != nil { - t.Fatalf("getOrBuild after restart: %v", err) + t.Fatalf("resolve after restart: %v", err) } - assertSimpleLookup(t, r2) - if hits := restarted.disk.Stats().Hits; hits != 1 { + assertSimpleLookup(t, frame2, ok2) + if hits := restarted.Stats().Hits; hits != 1 { t.Fatalf("disk hits: got %d, want 1", hits) } if cs.reads[mapKey] != mapReads { @@ -101,7 +110,7 @@ func TestDiskCacheBuildsThenServesFromLocalFile(t *testing.T) { func TestDiskCachePullsTWFromStorage(t *testing.T) { cs := swapStorage(t) - d := newTestDiskCache(t, 64<<20) + disk := useDiskCache(t, t.TempDir(), 64<<20) projectId := uuid.New() prefix := fmt.Sprintf("sourcemaps/%s/", projectId) @@ -116,17 +125,17 @@ func TestDiskCachePullsTWFromStorage(t *testing.T) { if err != nil { t.Fatal(err) } - resolver, err := symbolicator.NewResolver(mapBytes, bundleBytes) + tw, err := sourcemap.BuildTW(mapBytes, bundleBytes) if err != nil { t.Fatal(err) } - cs.data[prefix+"minified.js.tw"] = resolver.MarshalTW() + cs.data[prefix+"minified.js.tw"] = tw - r, err := d.getOrBuild(context.Background(), mapKey, buildResolver(mapKey, bundleKey)) + frame, ok, err := resolveSMFrame(t, context.Background(), mapKey, bundleKey) if err != nil { - t.Fatalf("getOrBuild: %v", err) + t.Fatalf("resolve: %v", err) } - assertSimpleLookup(t, r) + assertSimpleLookup(t, frame, ok) if smStoreHits.Load() != 1 { t.Fatalf("storeHits: got %d, want 1", smStoreHits.Load()) @@ -134,21 +143,21 @@ func TestDiskCachePullsTWFromStorage(t *testing.T) { if cs.reads[mapKey] != 0 || cs.reads[bundleKey] != 0 { t.Fatal("tw artifact in storage should make map and bundle reads unnecessary") } - if !fileExists(twPathFor(d, mapKey)) { + if !fileExists(twPathFor(disk, mapKey)) { t.Fatal("tw pulled from storage should be cached on local disk") } } func TestDiskCacheCorruptLocalFileFallsBack(t *testing.T) { cs := swapStorage(t) - d := newTestDiskCache(t, 64<<20) + disk := useDiskCache(t, t.TempDir(), 64<<20) projectId := uuid.New() prefix := fmt.Sprintf("sourcemaps/%s/", projectId) seedFixture(t, cs, prefix+"minified.js.map", "testdata/sourcemapcache/simple/minified.js.map") mapKey := prefix + "minified.js.map" - twPath := twPathFor(d, mapKey) + twPath := twPathFor(disk, mapKey) if err := os.MkdirAll(filepath.Dir(twPath), 0o755); err != nil { t.Fatal(err) } @@ -156,13 +165,14 @@ func TestDiskCacheCorruptLocalFileFallsBack(t *testing.T) { t.Fatal(err) } - r, err := d.getOrBuild(context.Background(), mapKey, buildResolver(mapKey, prefix+"minified.js")) + frame, ok, err := resolveSMFrame(t, context.Background(), mapKey, prefix+"minified.js") if err != nil { - t.Fatalf("getOrBuild: %v", err) + t.Fatalf("resolve: %v", err) } - if _, ok := r.Lookup(0, 10); !ok { + if !ok { t.Fatal("expected lookup to resolve after rebuilding from source map") } + _ = frame if smBuilds.Load() != 1 { t.Fatalf("builds: got %d, want 1", smBuilds.Load()) } @@ -170,8 +180,8 @@ func TestDiskCacheCorruptLocalFileFallsBack(t *testing.T) { if err != nil { t.Fatalf("expected regenerated tw file: %v", err) } - if _, err := symbolicator.OpenTW(data); err != nil { - t.Fatalf("regenerated tw file should be valid: %v", err) + if !sourcemap.ValidTW(data) { + t.Fatal("regenerated tw file should be valid") } } @@ -182,13 +192,13 @@ func TestDiskCacheCapacityEviction(t *testing.T) { if err != nil { t.Fatal(err) } - resolver, err := symbolicator.NewResolver(mapBytes, nil) + tw, err := sourcemap.BuildTW(mapBytes, nil) if err != nil { t.Fatal(err) } - twSize := int64(len(resolver.MarshalTW())) + twSize := int64(len(tw)) - d := newTestDiskCache(t, twSize+twSize/2) + disk := useDiskCache(t, t.TempDir(), twSize+twSize/2) projectId := uuid.New() prefix := fmt.Sprintf("sourcemaps/%s/", projectId) @@ -198,20 +208,20 @@ func TestDiskCacheCapacityEviction(t *testing.T) { firstKey := prefix + "first.js.map" secondKey := prefix + "second.js.map" - if _, err := d.getOrBuild(context.Background(), firstKey, buildResolver(firstKey, prefix+"first.js")); err != nil { - t.Fatalf("getOrBuild first: %v", err) + if _, _, err := resolveSMFrame(t, context.Background(), firstKey, prefix+"first.js"); err != nil { + t.Fatalf("resolve first: %v", err) } - if _, err := d.getOrBuild(context.Background(), secondKey, buildResolver(secondKey, prefix+"second.js")); err != nil { - t.Fatalf("getOrBuild second: %v", err) + if _, _, err := resolveSMFrame(t, context.Background(), secondKey, prefix+"second.js"); err != nil { + t.Fatalf("resolve second: %v", err) } - if fileExists(twPathFor(d, firstKey)) { + if fileExists(twPathFor(disk, firstKey)) { t.Fatal("oldest tw file should be evicted when over capacity") } - if !fileExists(twPathFor(d, secondKey)) { + if !fileExists(twPathFor(disk, secondKey)) { t.Fatal("newest tw file should survive eviction") } - stats := d.disk.Stats() + stats := disk.Stats() if stats.Evictions != 1 { t.Fatalf("disk evictions: got %d, want 1", stats.Evictions) } @@ -222,33 +232,33 @@ func TestDiskCacheCapacityEviction(t *testing.T) { func TestDiskCacheInvalidateRemovesFile(t *testing.T) { cs := swapStorage(t) - d := newTestDiskCache(t, 64<<20) + disk := useDiskCache(t, t.TempDir(), 64<<20) projectId := uuid.New() prefix := fmt.Sprintf("sourcemaps/%s/", projectId) seedFixture(t, cs, prefix+"minified.js.map", "testdata/sourcemapcache/simple/minified.js.map") mapKey := prefix + "minified.js.map" - if _, err := d.getOrBuild(context.Background(), mapKey, buildResolver(mapKey, prefix+"minified.js")); err != nil { - t.Fatalf("getOrBuild: %v", err) + if _, _, err := resolveSMFrame(t, context.Background(), mapKey, prefix+"minified.js"); err != nil { + t.Fatalf("resolve: %v", err) } - twPath := twPathFor(d, mapKey) + twPath := twPathFor(disk, mapKey) if !fileExists(twPath) { t.Fatal("expected tw file before invalidate") } - d.invalidate(mapKey) + InvalidateSourceMap(projectId, "minified.js.map") if fileExists(twPath) { t.Fatal("invalidate should remove the local tw file") } - if stats := d.disk.Stats(); stats.Entries != 0 || stats.Bytes != 0 { + if stats := disk.Stats(); stats.Entries != 0 || stats.Bytes != 0 { t.Fatalf("expected empty disk index, got %d entries / %d bytes", stats.Entries, stats.Bytes) } } func TestDiskCacheResolveStackTraceEndToEnd(t *testing.T) { cs := swapStorage(t) - swapActiveCache(t, newTestDiskCache(t, 64<<20)) + useDiskCache(t, t.TempDir(), 64<<20) projectId := uuid.New() prefix := fmt.Sprintf("sourcemaps/%s/", projectId) @@ -266,16 +276,9 @@ func TestDiskCacheResolveStackTraceEndToEnd(t *testing.T) { } } -func swapActiveCache(t *testing.T, c resolverCache) { - t.Helper() - prev := activeSMCache - activeSMCache = c - t.Cleanup(func() { activeSMCache = prev }) -} - func TestGenerateTWArtifacts(t *testing.T) { cs := swapStorage(t) - swapActiveCache(t, newTestDiskCache(t, 64<<20)) + useDiskCache(t, t.TempDir(), 64<<20) projectId := uuid.New() prefix := fmt.Sprintf("sourcemaps/%s/", projectId) @@ -288,16 +291,13 @@ func TestGenerateTWArtifacts(t *testing.T) { if !ok { t.Fatal("expected tw artifact in storage after generation") } - r, err := symbolicator.OpenTW(twBytes) - if err != nil { - t.Fatalf("OpenTW: %v", err) - } - assertSimpleLookup(t, r) + frame, lok := sourcemap.LookupTW(twBytes, 0, 10) + assertSimpleLookup(t, frame, lok) } func TestGenerateTWArtifactsDeletesStaleOnFailure(t *testing.T) { cs := swapStorage(t) - swapActiveCache(t, newTestDiskCache(t, 64<<20)) + useDiskCache(t, t.TempDir(), 64<<20) projectId := uuid.New() prefix := fmt.Sprintf("sourcemaps/%s/", projectId) @@ -325,7 +325,7 @@ func (s *twErrStorage) Read(ctx context.Context, key string) ([]byte, error) { func TestDiskCacheTransientTwErrorFallsBackToBuild(t *testing.T) { cs := swapStorage(t) storage.Store = &twErrStorage{countingStorage: cs} - d := newTestDiskCache(t, 64<<20) + useDiskCache(t, t.TempDir(), 64<<20) projectId := uuid.New() prefix := fmt.Sprintf("sourcemaps/%s/", projectId) @@ -333,11 +333,11 @@ func TestDiskCacheTransientTwErrorFallsBackToBuild(t *testing.T) { seedFixture(t, cs, prefix+"minified.js", "testdata/sourcemapcache/simple/minified.js") mapKey := prefix + "minified.js.map" - r, err := d.getOrBuild(context.Background(), mapKey, buildResolver(mapKey, prefix+"minified.js")) + frame, ok, err := resolveSMFrame(t, context.Background(), mapKey, prefix+"minified.js") if err != nil { - t.Fatalf("getOrBuild should fall back to building from the map, got: %v", err) + t.Fatalf("resolve should fall back to building from the map, got: %v", err) } - assertSimpleLookup(t, r) + assertSimpleLookup(t, frame, ok) if smBuilds.Load() != 1 { t.Fatalf("builds: got %d, want 1", smBuilds.Load()) } @@ -348,7 +348,7 @@ func TestDiskCacheTransientTwErrorFallsBackToBuild(t *testing.T) { func TestDiskCacheRefreshesCorruptStoreTw(t *testing.T) { cs := swapStorage(t) - d := newTestDiskCache(t, 64<<20) + useDiskCache(t, t.TempDir(), 64<<20) projectId := uuid.New() prefix := fmt.Sprintf("sourcemaps/%s/", projectId) @@ -356,17 +356,16 @@ func TestDiskCacheRefreshesCorruptStoreTw(t *testing.T) { cs.data[prefix+"minified.js.tw"] = []byte("corrupt artifact") mapKey := prefix + "minified.js.map" - r, err := d.getOrBuild(context.Background(), mapKey, buildResolver(mapKey, prefix+"minified.js")) + _, ok, err := resolveSMFrame(t, context.Background(), mapKey, prefix+"minified.js") if err != nil { - t.Fatalf("getOrBuild: %v", err) + t.Fatalf("resolve: %v", err) } - if _, ok := r.Lookup(0, 10); !ok { + if !ok { t.Fatal("expected lookup to resolve after rebuild") } - refreshed := cs.data[prefix+"minified.js.tw"] - if _, err := symbolicator.OpenTW(refreshed); err != nil { - t.Fatalf("corrupt storage tw should be replaced with a valid artifact: %v", err) + if !sourcemap.ValidTW(cs.data[prefix+"minified.js.tw"]) { + t.Fatal("corrupt storage tw should be replaced with a valid artifact") } } @@ -386,7 +385,7 @@ func TestDiskCacheScanSkipsUnreadableEntries(t *testing.T) { } t.Cleanup(func() { _ = os.Chmod(locked, 0o755) }) - if _, err := twcache.New(dir, 64<<20, nil); err != nil { + if _, err := twcache.NewDisk(dir, 64<<20, nil); err != nil { t.Fatalf("scan must tolerate unreadable entries, got: %v", err) } } diff --git a/backend/app/services/sourcemap_resolver.go b/backend/app/services/sourcemap_resolver.go index 580468e1..2815e4ea 100644 --- a/backend/app/services/sourcemap_resolver.go +++ b/backend/app/services/sourcemap_resolver.go @@ -1,7 +1,6 @@ package services import ( - "container/list" "context" "errors" "fmt" @@ -9,199 +8,21 @@ import ( "regexp" "strconv" "strings" - "sync" "sync/atomic" "time" "github.com/tracewayapp/traceway/backend/app/storage" - "github.com/tracewayapp/traceway/backend/app/symbolicator" + "github.com/tracewayapp/traceway/backend/app/symbolicator/sourcemap" + "github.com/tracewayapp/traceway/backend/app/symbolicator/twcache" "github.com/google/uuid" traceway "go.tracewayapp.com" ) const sourceMapLoadTimeout = 5 * time.Second -const sourceMapFailReportInterval = time.Minute -const sourceMapNegativeBaseTTL = time.Minute -const sourceMapTransientNegativeBaseTTL = 15 * time.Second -const sourceMapNegativeMaxTTL = 15 * time.Minute -const sourceMapNegativeMaxKeys = 10000 - -type resolverBuild func(context.Context) (*symbolicator.Resolver, int64, error) - -type resolverCache interface { - getOrBuild(ctx context.Context, key string, build resolverBuild) (*symbolicator.Resolver, error) - isNegative(key string) bool - invalidate(key string) - stats() SourceMapCacheStats -} - -type sourceMapCache struct { - mu sync.Mutex - items map[string]*list.Element - order *list.List - loading map[string]*resolverLoad - negative map[string]*negativeEntry - maxEntries int - maxBytes int64 - curBytes int64 - hits uint64 - misses uint64 - evictions uint64 - failures uint64 - notFound uint64 - negativeHits uint64 - lastParseMs float64 - failuresSinceReport uint64 - lastFailAt time.Time -} - -type negativeEntry struct { - expiresAt time.Time - failures uint32 -} - -type sourceMapCacheEntry struct { - key string - resolver *symbolicator.Resolver - size int64 -} - -type resolverLoad struct { - done chan struct{} - resolver *symbolicator.Resolver - err error -} - -var smCache = &sourceMapCache{ - items: make(map[string]*list.Element), - order: list.New(), - loading: make(map[string]*resolverLoad), - negative: make(map[string]*negativeEntry), - maxEntries: 200, - maxBytes: 500 << 20, -} - -var activeSMCache resolverCache = smCache func InitSourceMapCache(maxEntries int, maxBytes int64) { - smCache.mu.Lock() - defer smCache.mu.Unlock() - smCache.maxEntries = maxEntries - smCache.maxBytes = maxBytes - smCache.evictLocked() -} - -func (c *sourceMapCache) getOrBuild(ctx context.Context, key string, build resolverBuild) (resolver *symbolicator.Resolver, err error) { - c.mu.Lock() - if el, ok := c.items[key]; ok { - c.hits++ - c.order.MoveToFront(el) - cached := el.Value.(*sourceMapCacheEntry).resolver - c.mu.Unlock() - return cached, nil - } - if l, ok := c.loading[key]; ok { - c.mu.Unlock() - <-l.done - if l.err == nil { - c.mu.Lock() - c.hits++ - c.mu.Unlock() - } - return l.resolver, l.err - } - c.misses++ - l := &resolverLoad{done: make(chan struct{})} - c.loading[key] = l - c.mu.Unlock() - - var size int64 - var buildMs float64 - defer func() { - if r := recover(); r != nil { - l.resolver = nil - l.err = fmt.Errorf("source map resolver build panicked (key=%s): %v", key, r) - c.reportLoadFailure(l.err) - resolver, err = nil, l.err - } - c.mu.Lock() - delete(c.loading, key) - if l.err == nil && l.resolver != nil { - c.lastParseMs = buildMs - c.insertLocked(key, l.resolver, size) - delete(c.negative, key) - } else if l.err != nil { - if errors.Is(l.err, storage.ErrNotFound) { - c.notFound++ - c.markNegativeLocked(key, sourceMapNegativeBaseTTL) - } else { - c.failures++ - c.markNegativeLocked(key, sourceMapTransientNegativeBaseTTL) - } - } - c.mu.Unlock() - close(l.done) - }() - - start := time.Now() - l.resolver, size, l.err = build(ctx) - buildMs = float64(time.Since(start).Microseconds()) / 1000.0 - if l.err != nil && !errors.Is(l.err, storage.ErrNotFound) { - c.reportLoadFailure(fmt.Errorf("failed to build source map resolver (key=%s): %w", key, l.err)) - } - return l.resolver, l.err -} - -func (c *sourceMapCache) isNegative(key string) bool { - c.mu.Lock() - defer c.mu.Unlock() - e, ok := c.negative[key] - if !ok || time.Now().After(e.expiresAt) { - return false - } - c.negativeHits++ - return true -} - -func (c *sourceMapCache) markNegativeLocked(key string, base time.Duration) { - e := c.negative[key] - if e == nil { - if len(c.negative) >= sourceMapNegativeMaxKeys { - c.pruneNegativeLocked() - } - e = &negativeEntry{} - c.negative[key] = e - } - ttl := min(base<= sourceMapFailReportInterval { - report = c.failuresSinceReport - c.failuresSinceReport = 0 - c.lastFailAt = time.Now() - } - c.mu.Unlock() - if report > 0 { - traceway.CaptureException(fmt.Errorf("source map resolver builds failed %d time(s) since last report: %w", report, err)) - } -} - -func (c *sourceMapCache) insertLocked(key string, resolver *symbolicator.Resolver, size int64) { - el := c.order.PushFront(&sourceMapCacheEntry{key: key, resolver: resolver, size: size}) - c.items[key] = el - c.curBytes += size - c.evictLocked() -} - -func (c *sourceMapCache) evictLocked() { - for c.order.Len() > c.maxEntries || c.curBytes > c.maxBytes { - back := c.order.Back() - if back == nil { - break - } - evicted := c.order.Remove(back).(*sourceMapCacheEntry) - delete(c.items, evicted.key) - c.curBytes -= evicted.size - c.evictions++ - } + sharedCache.Invalidate(twKeyFor(SourceMapStorageKey(projectId, name))) } type SourceMapCacheStats struct { @@ -279,32 +65,41 @@ type SourceMapCacheStats struct { } func SourceMapStats() SourceMapCacheStats { - return activeSMCache.stats() -} - -func (c *sourceMapCache) stats() SourceMapCacheStats { - c.mu.Lock() - defer c.mu.Unlock() - return SourceMapCacheStats{ - Entries: c.order.Len(), - Bytes: c.curBytes, - MaxEntries: c.maxEntries, - MaxBytes: c.maxBytes, - Hits: c.hits, - Misses: c.misses, - Evictions: c.evictions, - Failures: c.failures, - NotFound: c.notFound, - NegativeHits: c.negativeHits, - NegativeEntries: len(c.negative), - LastParseMs: c.lastParseMs, + s := sharedCache.Stats() + out := SourceMapCacheStats{ + Entries: s.Entries, + Bytes: s.Bytes, + MaxEntries: s.MaxEntries, + MaxBytes: s.MaxBytes, + Hits: s.Hits, + Misses: s.Misses, + Evictions: s.Evictions, + Failures: s.Failures, + NotFound: s.NotFound, + NegativeHits: s.NegativeHits, + NegativeEntries: s.NegativeEntries, + LastParseMs: s.LastParseMs, StoreHits: smStoreHits.Load(), Builds: smBuilds.Load(), } + if s.Mode == "disk" { + out.DiskEnabled = true + out.DiskEntries = s.Entries + out.DiskBytes = s.Bytes + out.DiskMaxBytes = s.MaxBytes + out.DiskHits = s.Hits + out.DiskEvictions = s.Evictions + } + return out } var stackFrameRe = regexp.MustCompile(`^(\s{4})(.+):(\d+):(\d+)$`) +type borrow struct { + data []byte + done func() +} + func ResolveStackTrace(ctx context.Context, projectId uuid.UUID, stackTrace string, debugIds map[string]string) string { prefix := SourceMapStorageKey(projectId, "") @@ -313,7 +108,14 @@ func ResolveStackTrace(ctx context.Context, projectId uuid.UUID, stackTrace stri framesResolved := 0 maxFrames := 50 - localResolvers := make(map[string]*symbolicator.Resolver) + local := map[string]borrow{} + defer func() { + for _, br := range local { + if br.done != nil { + br.done() + } + } + }() for _, line := range lines { if framesResolved >= maxFrames { @@ -338,13 +140,13 @@ func ResolveStackTrace(ctx context.Context, projectId uuid.UUID, stackTrace stri } base := filepath.Base(clean) - resolver := frameResolver(ctx, prefix, fileName, base, debugIds, localResolvers) - if resolver == nil { + data := frameData(ctx, prefix, fileName, base, debugIds, local) + if data == nil { resolved = append(resolved, line) continue } - frame, ok := resolver.Lookup(uint32(lineNum-1), uint32(colNum-1)) + frame, ok := sourcemap.LookupTW(data, uint32(lineNum-1), uint32(colNum-1)) if !ok { resolved = append(resolved, line) continue @@ -371,59 +173,58 @@ func ResolveStackTrace(ctx context.Context, projectId uuid.UUID, stackTrace stri return strings.Join(resolved, "\n") } -func frameResolver(ctx context.Context, prefix, fileName, base string, debugIds map[string]string, local map[string]*symbolicator.Resolver) *symbolicator.Resolver { +func frameData(ctx context.Context, prefix, fileName, base string, debugIds map[string]string, local map[string]borrow) []byte { id := NormalizeDebugId(debugIds[fileName]) if id == "" { id = NormalizeDebugId(debugIds[base]) } if id != "" { mapKey := prefix + DebugIdMapName(id) - if !activeSMCache.isNegative(mapKey) { + twKey := twKeyFor(mapKey) + if !sharedCache.IsNegative(twKey) { bundleKey := prefix + DebugIdBundleName(id) - if r, err := getResolver(ctx, mapKey, buildResolver(mapKey, bundleKey), local); err == nil && r != nil { - return r + if data := getBlob(ctx, twKey, loadSourceMapBlob(mapKey, bundleKey), local); data != nil { + return data } } } mapKey := prefix + base + ".map" - if activeSMCache.isNegative(mapKey) { + twKey := twKeyFor(mapKey) + if sharedCache.IsNegative(twKey) { return nil } - r, err := getResolver(ctx, mapKey, buildResolver(mapKey, prefix+base), local) - if err != nil { - return nil - } - return r + return getBlob(ctx, twKey, loadSourceMapBlob(mapKey, prefix+base), local) } -func getResolver(ctx context.Context, cacheKey string, build resolverBuild, local map[string]*symbolicator.Resolver) (*symbolicator.Resolver, error) { - if r, ok := local[cacheKey]; ok { - return r, nil +func getBlob(ctx context.Context, twKey string, load twcache.LoadFunc, local map[string]borrow) []byte { + if br, ok := local[twKey]; ok { + return br.data } - r, err := activeSMCache.getOrBuild(ctx, cacheKey, build) + data, done, err := sharedCache.Get(ctx, twKey, load) if err != nil { - local[cacheKey] = nil - return nil, err + local[twKey] = borrow{} + return nil } - local[cacheKey] = r - return r, nil + local[twKey] = borrow{data: data, done: done} + return data } var smStoreHits, smBuilds atomic.Uint64 -func buildResolver(mapKey, bundleKey string) resolverBuild { - return func(ctx context.Context) (*symbolicator.Resolver, int64, error) { +func loadSourceMapBlob(mapKey, bundleKey string) twcache.LoadFunc { + return func(ctx context.Context) ([]byte, error) { base := context.WithoutCancel(ctx) + twKey := twKeyFor(mapKey) refreshStoreTw := true - twKey := twKeyFor(mapKey) twBytes, err := readWithTimeout(base, twKey) if err == nil { - if r, twErr := symbolicator.OpenTW(twBytes); twErr == nil { + if sourcemap.ValidTW(twBytes) { smStoreHits.Add(1) - return r, r.ApproxSize(), nil + return twBytes, nil } + } else if !errors.Is(err, storage.ErrNotFound) { refreshStoreTw = false traceway.CaptureException(fmt.Errorf("failed to read tw artifact, rebuilding from source map (key=%s): %w", twKey, err)) @@ -431,27 +232,26 @@ func buildResolver(mapKey, bundleKey string) resolverBuild { mapBytes, err := readWithTimeout(base, mapKey) if err != nil { - return nil, 0, err + return nil, err } - var bundleBytes []byte if b, readErr := readWithTimeout(base, bundleKey); readErr == nil { bundleBytes = b } else if !errors.Is(readErr, storage.ErrNotFound) { - return nil, 0, fmt.Errorf("failed to read bundle (key=%s): %w", bundleKey, readErr) + return nil, fmt.Errorf("failed to read bundle (key=%s): %w", bundleKey, readErr) } - resolver, err := symbolicator.NewResolver(mapBytes, bundleBytes) + blob, err := sourcemap.BuildTW(mapBytes, bundleBytes) if err != nil { - return nil, 0, err + return nil, err } smBuilds.Add(1) if refreshStoreTw { - if werr := storage.Store.Write(base, twKey, resolver.MarshalTW()); werr != nil { + if werr := storage.Store.Write(base, twKey, blob); werr != nil { traceway.CaptureException(fmt.Errorf("failed to refresh tw artifact in storage (key=%s): %w", twKey, werr)) } } - return resolver, resolver.ApproxSize(), nil + return blob, nil } } diff --git a/backend/app/services/sourcemap_tw.go b/backend/app/services/sourcemap_tw.go index df2e0495..2b597d87 100644 --- a/backend/app/services/sourcemap_tw.go +++ b/backend/app/services/sourcemap_tw.go @@ -30,8 +30,10 @@ func GenerateTWArtifacts(ctx context.Context, projectId uuid.UUID, fileNames []s } InvalidateSourceMap(projectId, base) - if _, err := activeSMCache.getOrBuild(ctx, mapKey, buildResolver(mapKey, bundleKey)); err != nil && !errors.Is(err, storage.ErrNotFound) { + _, done, err := sharedCache.Get(ctx, twKey, loadSourceMapBlob(mapKey, bundleKey)) + if err != nil && !errors.Is(err, storage.ErrNotFound) { traceway.CaptureException(fmt.Errorf("tw generation: failed to warm resolver (key=%s): %w", mapKey, err)) } + done() } } diff --git a/backend/app/services/symbolicator_cache.go b/backend/app/services/symbolicator_cache.go new file mode 100644 index 00000000..6eaf1f0f --- /dev/null +++ b/backend/app/services/symbolicator_cache.go @@ -0,0 +1,47 @@ +package services + +import ( + "errors" + "fmt" + "strings" + + "github.com/tracewayapp/traceway/backend/app/storage" + "github.com/tracewayapp/traceway/backend/app/symbolicator/dart" + "github.com/tracewayapp/traceway/backend/app/symbolicator/sourcemap" + "github.com/tracewayapp/traceway/backend/app/symbolicator/twcache" + + traceway "go.tracewayapp.com" +) + +func validArtifact(b []byte) bool { + return sourcemap.ValidTW(b) || dart.ValidFlat(b) +} + +var sharedCache = newSymbolicatorCache() + +func isStorageNotFound(err error) bool { return errors.Is(err, storage.ErrNotFound) } + +func newSymbolicatorCache() *twcache.Cache { + c := twcache.NewMem(200, 500<<20) + c.NotFound = isStorageNotFound + c.Validate = validArtifact + c.SetWarn(func(err error) { traceway.CaptureException(err) }) + return c +} + +func EnableSymbolicatorDiskCache(dir string, maxBytes int64) error { + c, err := twcache.NewDisk(dir, maxBytes, func(err error) { traceway.CaptureException(err) }) + if err != nil { + return fmt.Errorf("symbolicator disk cache: %w", err) + } + c.NotFound = isStorageNotFound + c.Validate = validArtifact + sharedCache = c + return nil +} + +func twKeyFor(mapKey string) string { + return strings.TrimSuffix(mapKey, ".map") + ".tw" +} + +func noop() {} diff --git a/backend/app/services/turnstile.service.go b/backend/app/services/turnstile.service.go index 61b524db..af1511ea 100644 --- a/backend/app/services/turnstile.service.go +++ b/backend/app/services/turnstile.service.go @@ -1,9 +1,9 @@ package services import ( - "github.com/tracewayapp/traceway/backend/app/config" "encoding/json" "errors" + "github.com/tracewayapp/traceway/backend/app/config" "net/http" "net/url" "time" diff --git a/backend/app/symbolicator/dart/bench_test.go b/backend/app/symbolicator/dart/bench_test.go new file mode 100644 index 00000000..9ea36fca --- /dev/null +++ b/backend/app/symbolicator/dart/bench_test.go @@ -0,0 +1,51 @@ +package dart + +import ( + "os" + "path/filepath" + "testing" +) + +const benchDir = "fixtures/flutter-macos-arm64-dart3.10.1" + +func BenchmarkBuildFlat(b *testing.B) { + elfBytes, err := readFileBytes(filepath.Join(benchDir, "app.darwin-arm64.symbols")) + if err != nil { + b.Fatal(err) + } + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + if _, err := BuildFlat(elfBytes); err != nil { + b.Fatal(err) + } + } +} + +func BenchmarkLookupFlatTrace(b *testing.B) { + elfBytes, err := readFileBytes(filepath.Join(benchDir, "app.darwin-arm64.symbols")) + if err != nil { + b.Fatal(err) + } + flat, err := BuildFlat(elfBytes) + if err != nil { + b.Fatal(err) + } + traceText, err := readFileBytes(filepath.Join(benchDir, "trace.txt")) + if err != nil { + b.Fatal(err) + } + frames := ParseTrace(string(traceText)).Frames + + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + for _, f := range frames { + _ = LookupFlat(flat, f) + } + } +} + +func readFileBytes(path string) ([]byte, error) { + return os.ReadFile(path) +} diff --git a/backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart2.19.6/app.debug.elf b/backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart2.19.6/app.debug.elf new file mode 100644 index 0000000000000000000000000000000000000000..23a9357fbeee01febaa53c70fa267fd477f3a8d6 GIT binary patch literal 239472 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

^2-wfdF?hSIxC)QgwHb;h~l+g7@C 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 URE<6&I@7*!KEg-W*Zu#00aYmaod5s; literal 0 HcmV?d00001 diff --git a/backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart2.19.6/expected.txt b/backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart2.19.6/expected.txt new file mode 100644 index 00000000..12964f25 --- /dev/null +++ b/backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart2.19.6/expected.txt @@ -0,0 +1,7 @@ +level3 (file:///private/tmp/dartsdks/work-2.19.6/crash.dart:3:3) +level2 (file:///private/tmp/dartsdks/work-2.19.6/crash.dart:6:18) +level1 (file:///private/tmp/dartsdks/work-2.19.6/crash.dart:7:18) +main (file:///private/tmp/dartsdks/work-2.19.6/crash.dart:8:16) +main (file:///private/tmp/dartsdks/work-2.19.6/crash.dart) +_delayEntrypointInvocation. (dart:isolate-patch/isolate_patch.dart:297:19) +_RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:192:26) diff --git a/backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart2.19.6/trace.txt b/backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart2.19.6/trace.txt new file mode 100644 index 00000000..82077057 --- /dev/null +++ b/backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart2.19.6/trace.txt @@ -0,0 +1,12 @@ +Unhandled exception: +Bad state: boom from level3 +*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** +pid: 25805, tid: 8806539456, name Dart_Initialize +os: macos arch: arm64 comp: no sim: no +build_id: '8228d9e1d6fa5932606d8ed329fefc6c' +isolate_dso_base: 100ab0000, vm_dso_base: 100ab0000 +isolate_instructions: 100aed780, vm_instructions: 100ae8000 + #00 abs 0000000100b2cb3f virt 000000000007cb3f _kDartIsolateSnapshotInstructions+0x3f3bf + #01 abs 0000000100b2cb0b virt 000000000007cb0b _kDartIsolateSnapshotInstructions+0x3f38b + #02 abs 0000000100b2d0cb virt 000000000007d0cb _kDartIsolateSnapshotInstructions+0x3f94b + #03 abs 0000000100af301b virt 000000000004301b _kDartIsolateSnapshotInstructions+0x589b diff --git a/backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart3.0.0/app.debug.elf b/backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart3.0.0/app.debug.elf new file mode 100644 index 0000000000000000000000000000000000000000..5b288e10ef46ee4e2d77b66c62429467dd27fe51 GIT binary patch literal 230048 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�Lc{wRK$oeNcH0Y~uATx+&x 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

+n_6oM7%@Rp}Z7am+fr)}nQ(=l1#D*F++4;QC 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 YH@D|}S41n{5glN5!_7sa?e+Tq4@kA~ZU6uP literal 0 HcmV?d00001 diff --git a/backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart3.0.0/expected.txt b/backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart3.0.0/expected.txt new file mode 100644 index 00000000..5f42ebb8 --- /dev/null +++ b/backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart3.0.0/expected.txt @@ -0,0 +1,7 @@ +level3 (file:///private/tmp/dartsdks/work-3.0.0/crash.dart:3:3) +level2 (file:///private/tmp/dartsdks/work-3.0.0/crash.dart:6:18) +level1 (file:///private/tmp/dartsdks/work-3.0.0/crash.dart:7:18) +main (file:///private/tmp/dartsdks/work-3.0.0/crash.dart:8:16) +main (file:///private/tmp/dartsdks/work-3.0.0/crash.dart) +_delayEntrypointInvocation. (dart:isolate-patch/isolate_patch.dart:296:19) +_RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:189:12) diff --git a/backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart3.0.0/trace.txt b/backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart3.0.0/trace.txt new file mode 100644 index 00000000..5c5a8d37 --- /dev/null +++ b/backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart3.0.0/trace.txt @@ -0,0 +1,12 @@ +Unhandled exception: +Bad state: boom from level3 +*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** +pid: 25794, tid: 8806539456, name Dart_Initialize +os: macos arch: arm64 comp: no sim: no +build_id: '606747fb012550a2c0545e36c9a36d41' +isolate_dso_base: 104c5c000, vm_dso_base: 104c5c000 +isolate_instructions: 104c95ac0, vm_instructions: 104c90000 + #00 abs 0000000104cd20cb virt 00000000000760cb _kDartIsolateSnapshotInstructions+0x3c60b + #01 abs 0000000104cd2097 virt 0000000000076097 _kDartIsolateSnapshotInstructions+0x3c5d7 + #02 abs 0000000104cd2693 virt 0000000000076693 _kDartIsolateSnapshotInstructions+0x3cbd3 + #03 abs 0000000104c9ae9f virt 000000000003ee9f _kDartIsolateSnapshotInstructions+0x53df diff --git a/backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart3.10.1/app.debug.elf b/backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart3.10.1/app.debug.elf new file mode 100644 index 0000000000000000000000000000000000000000..0600b7158d90f324d4b05c27c0e11ba08434e1c1 GIT binary patch literal 212544 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 literal 0 HcmV?d00001 diff --git a/backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart3.10.1/expected.txt b/backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart3.10.1/expected.txt new file mode 100644 index 00000000..7bdfbb25 --- /dev/null +++ b/backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart3.10.1/expected.txt @@ -0,0 +1,9 @@ +level3 (file:///private/tmp/dartfix/crash.dart:3:3) +level2 (file:///private/tmp/dartfix/crash.dart:7:3) +level1 (file:///private/tmp/dartfix/crash.dart:11:3) +main (file:///private/tmp/dartfix/crash.dart:15:3) +main (file:///private/tmp/dartfix/crash.dart:14:1) +_Closure.call (dart:core-patch/function.dart) +_delayEntrypointInvocation. (dart:isolate-patch/isolate_patch.dart:314:19) +_Closure.call (dart:core-patch/function.dart) +_RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:193:12) diff --git a/backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart3.10.1/trace.txt b/backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart3.10.1/trace.txt new file mode 100644 index 00000000..74c994dc --- /dev/null +++ b/backend/app/symbolicator/dart/fixtures/dartaot-macos-arm64-dart3.10.1/trace.txt @@ -0,0 +1,14 @@ +Unhandled exception: +Bad state: boom from level3 +*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** +pid: 49838, tid: 8806539456, name Dart_Initialize +os: macos arch: arm64 comp: no sim: no +build_id: '20fb76bfc9d292a85d82b8712754455e' +isolate_dso_base: 104914000, vm_dso_base: 104914000 +isolate_instructions: 1049527c0, vm_instructions: 104948000 + #00 abs 00000001049832cb virt 000000000006f2cb _kDartIsolateSnapshotInstructions+0x30b0b + #01 abs 0000000104983293 virt 000000000006f293 _kDartIsolateSnapshotInstructions+0x30ad3 + #02 abs 000000010498ebd7 virt 000000000007abd7 _kDartIsolateSnapshotInstructions+0x3c417 + #03 abs 00000001049836c3 virt 000000000006f6c3 _kDartIsolateSnapshotInstructions+0x30f03 + #04 abs 000000010498eeb3 virt 000000000007aeb3 _kDartIsolateSnapshotInstructions+0x3c6f3 + #05 abs 0000000104961b07 virt 000000000004db07 _kDartIsolateSnapshotInstructions+0xf347 diff --git a/backend/app/symbolicator/dart/fixtures/flutter-macos-arm64-dart3.10.1/app.darwin-arm64.symbols b/backend/app/symbolicator/dart/fixtures/flutter-macos-arm64-dart3.10.1/app.darwin-arm64.symbols new file mode 100644 index 0000000000000000000000000000000000000000..06aaa060767e676692deb488aff44e682efebbf9 GIT binary patch literal 1275712 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 z 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%0DV-jN`LcLBoL2_UkIKlnYxcEbMe~&8#$}3 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 _9SCeB= zQ2+8y)I{qWJgU|I<-JNst+e)+_X&>t^6nR8p>7uZ-{gaWg3UtOCKR0Dn4j`L!%X7L zspm{`+;L#a`ZmtH-IriSiz<=#Ve4*^qly~sj(E7mAMtBQ?dMnn+d`T#J(`>~YLGjkoTQR*o zDil;o>t|gM_j+Ln>^i5@jO=@0%0`QKtj5qp4q1F8FlFgWoQ|_V9Z@mT7T)N;>p@#d zg3@R;7>g*I*4^7h>A_x#G}ce(GK0MZn6k;@)xea6>p3btcVpKDDpA_2_1l#EMcyi; zlg^&A;k=JZB$+Pq5>`k~(SCc8Pjqjqn)Fa>&x3ILGaT z$(}o3kr6oV7GTOzi>F_Y?Z3#}S55Rmz?5AUpAJk}{F;fr5STK$$KVQJ$^whqfGOK8 z?ggeycvFga-+{)y9;gm!3wx*IVK6h7;Xp}92A#GY@sP>1Z8&p#gP#@i;N?cvYugcv zVj-M{2xsmuyZJNKTLzQe7rYS+#}1=c(grw;n|6?4L^|PNj7YSpche3sj11|4jv2|BFyJdvXo?+Z+s`Id=30+_PK;!}Vrdo4a2 zn6mn9Q=|%*GWs2Z9{{Gz5{y#_>wzgd`b@Om@KBCg{0X8d8{ak2QOmKp6Pf&;!TSSK z#`X*L=7X-2pe@o~eGnGO)!Q)Uu91)1T`*b0+i1FY1DLYV;;(@zW8Y`b`dfjtU4rK> z(r+d6rrdztUO|J_^1oaY;ju{FCKl6kC|gRGN?Z6rEH-KWN2Xa&8?7y|m_+@NiFCNG z9*=Gq-Sk1wP2rYU{0y$QUUX{3ncKQMPA2HB7o8sIiCeF8QIFBAhb%ow{w6$jAm}4o z+QJ`W_lBjXD@Ud>U)sW-WBoaC1xj)b41LHsp@&D>BN=mV!7G9N;YB(e-fgJWC^b5y zMV8;sv+!7d^dt7OQD=zil6LOL>3+sf@J!?u$#C416_{F) zskfHtf^ujzPr;J~{QZ?mLAA72P1#=e`GSyYC!bFU2!drpMM$mn6o za9n)>J!KKGf7F*ODoxtc%*FE)963mH|BgObr13wdk7{7bl>ZvM3YfBq*zY=5RDrao z)lQP@-X}Qh`VACgk(O^vA721dj(=-#%uV=Ih#VL-_%L9~r0)zq1DLYh;(q{Bri_{B zmB5sRKN|cBFlF3N2LAv|nLIAon{hLC?j&eH+Qlj@0c)Rr_EX%?L13P=i&gqwu=KN^ zh>EOr5G?)drxHQ+*4hb{eo7Bfi?LF%raNvr#=%jIn9&u27Kkd5w&EN7F6%G6!U*TI zd%5r?IOgDfF)FftutuZNo0nHUvChcO?=lLm1VKTInDfpQIm~zD8ZeYr2h1sqDylY%c zoD--PY3DzrY*$8wpMZfWyDY8;rtG!&DPYP0i{A&P%+zm*(0~4SQK1*8QfU`_8nr(xeLzPv zY_0g%(xB9SvC$X@V^pQXPo ziDGE|8Z{GH`k1|0P&=)~xDVa&uWleplBr$rUQ}Xmbwi{hS2sBB512`uISrgijvI3e z7Ntl}-$w5LxrYK%Hd;Ivn6la8zXMYyO_L)2DwjSrP^Ho?ST^ZERMyw#)C%gORfA7% zU?oZo)>`0Oj@yEM$TDKskG?`QX?mclr7h{2h95Zf6{3+2uMpK&K{2|XSuan+wVwJa zs7S|L1+@-CVArX5ji=17AAl)S{fAh>@M3SpE~EstOMA&Xll3`;{a`r~7%S~1?@jj4 zbDRQ?MRIoFWa>|Fmqd<8%TMsXk-^BpSTm}-fhkM;*H7!=x-S7!_FDWSFlE+Grbv7} z4y8m^Nvr(vpCsyHX)jqf8DqrFBgkN6y?!&L|L6Vzm@t2RpERrY1aNJi1OxeIbu;KtyrtWG+^d2zfxW(JwhVN^U)&6^> z^yu6pfhkk;E2jNFcM&jU?`{Uy15+05Zt(NKlp_{@0!&#jQ=e$-SSw!q6$imEq zM;4uEM)nRcW%6DenZ8!5M}p#o7T$-Agnx@~q+_;bzn~b4bh4P^Cf$LqMdr^A_mL9o-$oqim_D*mj74hZgp0+9%9pnAvfYAOkp{0V(^JXdN+y-zG`b!@q+te7 ziUF|W%%t!DqD7@iTYR4@QxoZ!V)vsMi?kgi#qg9fV9K~ugMS33EVFoz2K=TiveV)e zV9Mr0IMBzVEgh5K;umonCDz_QBZHCozYAxOZk9U5D}#({k-^BGtujcfg%;PSgLNN| zA%l@kX=c)12d2zBie3K?bmWLYrKSh%g4O;zth6;CDB(!4Uh*xyTq^_((pnxRYj32( zwPBY#ad;@vionEHgSCXw~b zz`MnPDHC$ch<3OKC)Pz~=d!-O`MdbEK#fUzN$X^Nz@WD&L>2RbkW22LEZdYwhuf4H zg_wI1?VT=JPfk7>1+_)gPOEkDX<`wj%HS}JOb0V26$9shYyKbu$8#)zDf{ybUIt8= zd6r;*zk{^oOc~V*S9h)VAczLHw)B1nQHIpI#AXq(o4~>gBrpWBGD*WO;RayJK8_48 z_Xeh{{SybQFMuaaK0BZbmrmaW1J+iipbA>m)Afg1@59#R2hsh~F1&eq1}wcaM+K!w zHz+@EBQFXeMpa{g?)k zh4T&8l_;AmJ^;~_S?6<#=YvLzij%hR1HJO&sa)_FS;GuGg$I~&*y0gj%8|dae%b?; zrV1^5DA7Or{3m#fOer$sUjj^7Z1H2jluZ_Y08F{r;^+tQ4JR`BZ>IL4z?AhC7Xwpz z7ntZ9fhlt>ei4|mN-(xZzX4M=UTBIO*NpEWkwX?Q0;Y_=M56smvPip%13K^PJ@&>p z^wnB13j$Ol?YtlMm;*~+cQqg={UXWwZ4VrV=qH}U3rUjJUUxOYku#}&!JNMbg&L%t zcWr{4nynC0Ev+p$!3h^+p?(&;J^@=WJ;HV&T@wmUa9B{M4U_~U9FlfkZ32G8(+@|F zbWW2rw+VBdb31-vkdD(yWmvUj8B|Dn#?81!FPQ5@jkIo>lBPc&9lDqlDKf?MJw-=~ zI!)R$>ZTm4Glr1C$a?Xx=IpZytDnfWQW=%w76DTZ2}X1iFs1ho6Fmq_nJyU7dq0F< zhD7FFW}+_urYy1eE?~+Ui~E5oz5g>s;vYtrA~P*M4w$mSV!bJ#?6SBR(UhAlt_P-! z|EKBlMPSN$i@yY>9Q&7vp4x)#xyaNj3{D58?6G)0FlF1nO>_+~Wm<*7ZNQYh7HyTZEiXLyWEzRGm_FJQ`nO2OVr&_)UBm$q6p znp8x1^39Afw`{;7h z9>sDH*t(eI^d+NN*959r+OrS zWAHXuL{-&6h;MnXgq&RCT%-?WaK|}J*6(INIHYaGA(Y6?*Gu<~n+8l-yQ~XK=NMUH&EkPx0Z!Q6*tQCxY?*XPvzSZ>G0ZdtA@rS^a z8TAtFZ)-@0B)D3&P07|1_8U?dS}G|RPU;i*VNT>`R&w0=z?5;fnZe%xOj#uu*YbvF zq0o5^`^M{y+NU!t8gpC_-RkYriXphX1wPCqxiJq=ktd&@}g!x=m zupQ!89~q&CT2ejgu}{hk>NS+S-_M{k8sp~57AZ$Ua4Nd%MblgGr?M`@QbRynWNPp zS$5cwjv2PTvAa&XZjg4RdP(8ZN_~q=q$PKDd)H!&3~w}PUFsmc=yXj^PM4W1|27>_ zq*BgpLpieIM>!*O9a2x|N_FR?y@RnuS{$2BE0k~+3#CO`=4SO?41)2El8^87Pk|{5 zALH2c^Sw!9g|1Y~{rA)VgbcE@kQbxB!V}stI)P)YEO%^(){0xF+WdEuPLIRRjIf4~ zm#F9UxkzN0)W@Zq<6aF+Id1X2z?3;pnCNGLDXT4hADD93;va!23!gMa_Inl+CbHk+ z-vd(?wVCL@08{o_{BK~&?58B!fBHbCDAJXx1<$PZSJFt!EYaIgjqz=)hTn{VDaS1S z9+)!zY4)vG+emt=I{XMd^JlEa*O^3CFatkX0#nvKVV31?5PWV1&@)@oy_o$_a(nc+DkWj zJL`;{pT`MjiOgaKu6zfkOnXTRIc^RxW#U@ae;c$wf-0r0QxE7{XT2}sktIk*o&WuH z+6&g{Gg)U(!Km;`1#FtwLB6D68~1nQP}W*}8!%-bhlQI{fGO*{%tU+$Oj)qb;O~Gb z>xupE{z$r9eIBLL+G9QrbJ!kNT~~c!72&whRL6UNs$@08E+p zn!)D+Q_$A8DTkW4S^}s-ZPzl z225GAxY!}vNykU2L@yJF(-m#brcW*rynWWfBGHH&R2TWOL@j_tA zIM+nq08H6o@fu*tG|xm20aGSUHaMmW+dz?37AFH!4(S~)|If_?rW}}V@Y%qWLoo&y z>u8aK+ZntZm@;>JgI5Dn=3D$FFlCL!QR{G;N@Sx?-edD^7626=QY`DmF;lsIGOf zf3GV>TDIZ@CtPt*DwXNGpYYeHs$IO{LRXBmY{dyqxMGJ?%GsF}uXFK}o~{^a*@_dK zaK$>QloZE`HF$icUoq0M6(>01iX~EM+*Dl7WgThRiW8i0#jIU|vGqyYsBUoQ1Y?Y} zY{dyqxMIStLB$qn8&xgWo=D49oZy5jj!LB}{mKY`S>MDlMq0Mw1SedvM=BM>v*OKM z){&O2IKc^5Y?4Z8yRqU*H!+xxk(RAE!3kHakV-MTv*N8>){&O2IKc^5%#%ukrsC~f zA0sVWae@=Bn6gJOwhn0<)g3M_!PK9bNXu57;DjrB2|>j=X&Y4o*PckrR-E93D-KAd zl9`;3cX7!?TDIZ@CtR^jDrL=L#YT5_Fx8QktvJC6SFDjr345~QJua?K(DO0UvK1#d z;fh64Y1CA_k84k)Wh+i_!WA01ig9}d6`Q1ORLxu;BQ0BT zf)lPdER`x|b3U$e@q#8jA0sVWae@=B*d>+n=CI;JE>0}!ijkJBIKc^5Y>-MRNv!xV zw>^=TtvJC6S1glC(R;JvBV5*zmaRC!30KUON`t22qnzqU%T}D=ge#`(6O64>+D7#l zr#jNI6(>01iqZQ96&s{&RIMCiq-85kaKaS_rBZn^=i}qt_C#8?;shsLu~RDL?Z=8w z@N*q$*@_dKaK#3xl)67FKE=;Wq-85kaKaVKrBciRtoRJKW|5YyIKc^5%#%t(rsA_) zA0sVWae@=Bn3@udtxMWQ^&IyAA}w2Sf)lP7bD&HuTlE6xW29v(PH@5%hon-)L7a~- za;hUOTXBLDuGl4&@(*UkHLMtE*@_dKaK%Qcl$OehFY!|tY1xVsoN&bosT6w%D|T^= zk(RAE!3kH)mrBE?;yR8o(y|pNIN^$EzYE6JEp4NE*~P6;dK(^T*@_dKaK+d|gNjYk zHmddfo{6+<#R*Qh;;>YzOyhj)<{BPp*@_dKaK&z^RB#w8zQ(Otq-85kaKaUvq*D6f ztk}b&xJb)ZoZv`B$6bN>&qLX29@08)3ovEvQ9)0R|LZYnmjpkc>eL(@54hb(VQ9nA z;goSH5G(XS)u9q~${Z#m9R;RrK1M3x`I0Z=T(Zc-V-4O1m@?xygO3BIj6R;j z(GOa0k)Yx_hP0kjR{D$-v$Az?4;| zh6|C_NboA9pGM>9Q4#eSOTRzEw}=v?)+*({f<$K#6&owKRizz6VAlg2g5$mpOj-GR zGvM!lDf7-Wc;j!n|jtFg`v^sn-2aBOj$(i zPcmt?&{gV?y>y`lWH2)Qucpwmz?9iV2EPwX8FzufKLJygUn2fl0c;|4BAK3 z9iILPAOl{OurlM_>7V~{3t_U%$Ym_&uWA1XRE^L_)Hklb;#44oq1k1Uf@j14Qx^O) zTq)-N0yQS>Bg%hwqT_ZTg`s`rrqTvr%8V-v9tWl@`**kl(h3QFM48o(sLNQ1Tr-Jc zq}C(Kzh6&JJ5j!|c2ChuaNk#O7FAfxRpB9!cAJbhT%0xaXMTM}5IHXGBkE%}PCT;o zD}$Iv)S#=c1<^NSk_{N|>tG4|9>ZYw{Z-*%WXquXu4cK%{9)*cB1@~J_qg%MiWbpp zHy&A+@m3p;Y~UK^tuY>1#$tMFwdc4OV)z_(+LFKwHWsAuLLX7b?x{1DAcK+Rb&}z@ z4**k+-OobnLAxcW=MMJ$k%wP_zuTtun3s%BJe|k*-aDDMnRyefP#)v^?q=Q==1sID z&tE1I-*yl4KJljNDRy4Pk47>{sSgHbFpo&nA7ILXT%(C9jrBWPMBT0vp?{SKHi`WZ8(nAfo77MW}D{=k$q?I!vJV9L>F z4ZZ-FGIh1VRlt-b7T*g@nfjcGeo;q@Y_qr@m@=h9qCKa_(h&)6RM+izsGb8m!(?dj z^QMD?fGK-lF!&T;%ET89{tGZ=i^bKzl-X-J9KHWDC_&|G0{Wo3Ud_V7(jHm-OZ09G z_O%{HIhN^XIXtf!n6j?RjOhbl%5jUMUdI(GB1c~~(FXuimUJ6@A~0p2#fyO{H(R_G zn6ly(Q)C#JveV-I-oWoFB9mV=(H8(yrdfO+FlB?quL4tgubCo~-^9!m*vdDa>BV^|kx6eDJO`Mv%HmUiDHGo`(U$>J7FqlxFlCR$ z-vU#X^qL}jy@iD)vd`kb0#l~FWujLAQ#M%qCNO2j+a~%KV9F+ok9!-Jn~2PM$3$NM zOxa@b9l(^OeI|Mkn6lsEUEjg_EwW*Qi7o)9^xif2I$+9fi(dt%OnuKp{{&1qV)3zk zSi~ap`%Uzvz?7pFw*ylaY&6jy15=J$oVWoWK#@i7o9I)3DZLL2z6O}G#Nr2lDWeBW z^xMFcr55k>E@rIA*i9z-2w=)`i%Wqi<3BXfcL7rtSiBjSve@F;?_v8XGVvo*WF9bO zyTvyEQ|50r(N6+XHds6iOzCYg(R=q}R*CGeI2)KU>0=XpH8ACX#ZLlLCVpa~e+H&3 zviQV}SZE^qEM5jox!K}(fGO(-O>O6WT#O?!`cs3C2d3<_cp)%l{%0ooabU`Bi@yb? zto+cF08E08H6u@jJkjMPHie_yNolkqKWJdJhb=A#rtJL26lnvdEdQUu?*mijd~0yrhdA07 z>5UqEDllcX#Ww*{)>!-jFy*+#NgrVgAu{?qQ~P3I%1(>#0H*A=coQ&X<@csY%w{Zk zk?}tmd^#{?wZ%69Q)Z5t=of$~TP^+-m@@ZA6P>yRyN4p{EdD=W%8s8*bO$hH+0OsRwGSJ_eyYepi{}GVHh3ob z24KoG{kjeR&wUe^a@gV@fhlYB&6z>;exG9X6xnO>#lV!s`u+s{=RFSkmIUn`70{D! zo-`evyA~cJ6Q`Q`-vCplO*8n=&oD@lqZa1?Q`Sv4(U${Lb`g6wg=nkLyVS9V>(M+8 zkC9%CDWq?9q0A%pFQX*Q6}nsn_p7+CqY^_Cx06bq`?;kxCgqbUd!fF*mNH%l3ERabt!sKScIe{5xREf*sBH&jO~bj^k)5 zL9=%XRDrb1RqNDD%u_wZy~1L54q}$8r>E}h_>(;vVaa5BccNsDgnQD_a@FqNp{Lh{ zLSY=la@96c-bQIrX}GdOyEk5#Y44x5~p{QGzGJwXW)nI!FUwI=!) zOquq`l8yILbdsz|DZ)~Xx6Z%sM-QJYE#&PZd1UFvd)d#^{gGuDZ@qsHl3sJkGL6@5 z?rX{tmTkQEqf@0nvK-@m6up~F9~tM?a`maMiPtbr+A;`-fGj?_q$cEN2^ zPeqn~%w3iscC+Bosk8Ltbzul(jT{2*cmSrX-jgHKo3Q~2N)h_^J6-+d@9zF3KCHr; znSloY0aFfGd^Rv;Orq4st^2@~?Zo~|8%eW-mft#QGA2#GmNi#UF|B%SIqqF3#v*Zh znLeHerYyAh17ONJi+=^C?6r9JudopkIU+6YOgIXdGH*`MCGa`Gl-)^YBo)AvV;0{F zOj*3QiCzm#*>CaJz?9Ydn&|C^u{cE5B@6aXUy{ZPo%f%e@nwpu{gJ`Q;{8mabAc(- z_BXg3m@@7F*1su4TP3(+or^Dzr{FXSp|e;O?~I-u_dS>_(#>LcZpGJ_KO(DBOxGs> zQzjf}a0xJF`#~Jh9iX)m)Fo|E&*W1vqHQ>59kU0<DCPg}u)Ptl->9=0m zqQ1$~^#pzok7H^+#0+`Y|KP(RGWBo{IRiB7&_I<*d)}kFY=?nqD>f~#vZOt)V;8;o zFVIS?{W3qG;Q3!508KBC{=C0Zf^A97pqTh~^&~(CGF_xESLyYs1V%lTyV=a@;S0Df=?beA#aVU+N+=Pv8uA-NPZ#@qy}*wrKSfTv2#BmM@)l zaiYgP+@X7H;WnIC@lHJb=bnRpSigb&IPO1zDMxbHeG};DiGeE13fcwtPfNz^>V*|^ zQh+k0UGVU zRClUa8>i`YzoHY{SwX447i-hB6JZ^XETRf)VYkXV8&784v<7XG&c3stb-XVZ3(5hlxG$dq=$rfGVF`YDP;g|ynHB?iw! zjCA-EMZMd?=t^bidNFupixlc&!DZ91nZj?on7>@V zx=ssbCO()UnkMwTyW@7y8IQqZWK*tWIBqvE<)Fo10aMoef%SL(A5J%&5vXBlOO|ez zjxBx2*(}b*ckQM(3I0=O)1^k1v?VLHJ0aLsL^|fFvlpNwyWX4^bQ=7kIrzswWeC0K zetj2>KfhW9_0XzThv});`;?~0nNkc-_AUlwFK2m`>eY1C|&%!(|r_%%dRwp#oJFy*ktd;Ea8AhQ2L4sz!2EiDu}uX>K>(_6gOOdu;SACo zq0G1%8H{XRz>K{Q$BYnFC+%6AC+(>FxD^?UtiOmEdQ_wdLfOYF$YA6!Gw@nOV9KPw z2ZgXh8asvsDY8&nbbA6YWuL_hfGImlWHh*V6PPmQVuPOrri{IWV}CzH+aH_>+>nlj;Eg8eD2 zm!K|buli`3Kc#Dt!N?9~IPM5AWx*Au{)}TrjKWUDVr?b1WcKGm5Kfhm@?sNj!3^>u2zD2 zr7iqrXYA_h2f?-oX_wZ%V{U>Y4}!&!+%K4`Qooh`;E)ZNGPBZ*Y7wxJiwwR8*b!M` zaW61sqs88@_<)Mcyv7tc5SVha#b*Lj7A-c>mB5t47T*U<*;^&i-n${1DztEmO4Lj1 zzwj6tx5U)n^*0>QiLAHyIAF?zYfbd|z?3BxUjt0pW^o5FWy4ZaWHT^jbhW{;j&dl= zElvlfOt{WO{|%V3+2Xr^DTgiI2uvA&y(to-ltYqh zKYZw^3sj2G7t|YSf4!priWG)c+`<%ng1KHoH=C3@l|J{SA5~H&k<55OH7ft)V$Mr+|Pdy<5$A&j6;(vUmY7WpurXUJ6W^b{mKKNQkydaAEUK{-NP}@EF-+GQ7#k zsTI{G?NT)!6Q?jgvS2ba_IA^E6)`MPa zmL@7)+C^%7@^N|v`4}k-&A-Fz+(UI1POFaMB`vP>t@I2{gjr#8tRP(Cfkrf+n1aEcq9^0n1(Z9;t z&#RJn4t|X?c@wQ5568}^%7i*jHD0y>OgU=t%&FJ{P(Em8-9f;P$Sh(n4>Vp>vb3G* zm&uq;$Gre1LyJv{p2m|zEs%DN8l19=PH996L))3+xV^xXMa^bRUjtKiSiH+Lc!fw#l?)oKGYT1-xU@sBkxpC94OB^ zjI{VX!S7I#;c+JIg#!-@o<0|8{iWYM49mwKB*QtM^i2jnnwB#A4 z+zXm2Dnr_}xKYoahuUOl3sW4o8<;ZnS*e8Q`RY<4t1M30PC1m_7Uuy|wsdef_kg}4 zL5o%gbgf!HX*L$Oo=?X=7qD}sU8~-hq}K(v9f>Sc_`Dg@7GTQiPWGZJCA|=+bZJ+s zQ}ib(4sW_{6Eyf@5VBgGegsZ*hnx|KcuLjbz9MhIHmz6PqxEOvW|)kRm5M=L&>LBA z$U7kDj#hTalI|v2q3#%8vQ?hrwPGk_4Ixjj{l3XDaLV;KjY$|Q^UIf8UgBiTl2Pik zZCOau>zua(zRILp${MrI9SlraVDUM?lx-F-0j5k^%QdtOv{!<1U*c-GbdtV+=N))t zEg|nz<;Yx>C>|l$mewn>gbUIFASD=!mU5iJH%tJ4FUn5sof$<)6WnUxG z;=YDHjaez-aqEK8Yt<_ERFvE=8ApV|Dni~L;pvZLyRbgvJ?!Sdn}@;2%AixEU8^2; zXJQvl_eWM{Jik9&nt?=4ZLgVX{gA_MQKZY&eK<$rU!6D63Z8W6xJ@X>gqZa*6R|%4 zOqpTv7r>N7ubJpwcEoOi$eK3|&IG3Hv$z_VaNWNSlw+CXcg&aufhqfm{V6XMRVnT1w@i-Lg{JO|Lk3~#eWuVsz?88Y49*6o zjDD9>q2G;EBtbRO{`E5d%TT`?iGc+sL7z2B5|t{geT~rsN6s3#h3K6{65eC)df%V4 zN{T(LURF4`@XC?VE-YFyw0DZ0^m>>qGh)iE2CWuVZ&KEK*oa`Qg~`y|eluG>2c}GZ z-{4(wz(?6c>@N+{GNH@VBkE5WuimGt7uFc^@Ke8j;BTZQ`*e<*j-J@V2zzo|eZqn= z^8+)ke<7MO=L^oq`$0PgL~RP%PWAk3EJv>go+GT@c+btoYrVgORX)M0+-+aXFYh;) zjL-a#HP_DG8J_O1Rhah?y*K>+wC8LNSgN$0>T~0@2pclqce8Oo?hht+OORJ8ZKwL* zY z`+3MCj2mQL!yJ9Zj6VHAmKpN!k@WtBys=M%_=?Y%_tYF*2cnPnvIXTyyGE_Up)B(5 zL|*deL44W}^VaE~fqbt{SkG3T|6MTAdTkc=>w+%|#t)giE`J*II8$ZqNtd=$>2U^M z31r#ETRjJpjpy_tk*i(tNHEagyR1(_$4$z;2cLj)`YSi@%OJ8`+D`Sr!N$6Nd?1~Mtu(q$6_sYR1Io^pOt7n+j;|JlQmnv8Tk`-gD zYY)cmw0{phS#HSF3so<0vZ|1GlAg;CpeXyXL-G65_vL#sx^y$j4-U$Znq(y*FCR67 z9;^Nn41Q4BPW8sYd%@FRE%7qvv!v}*%?ImMQ_q(oVO%<$%FLIEmL4bm+)t3mgxGI_ zj)AAoz*mOICX3U6DP#X9(cYz?_e;=Q(ymkKx&!xmT}UExnSrY_fGNiKh^6=ko*bATz!M@^B#fhn`UOg z0~*~Hy{FE23LYb?#!T1!z?7Lkv5>wNZLK{+5Vfse*vZ(P}s2he{QKRBC>vx!Pfy(R^xI}|Ic3^(?yj@ z+o{I(JQ}v!jueLWF$I^B0#lCo4>w1!_dV#4DAHwWjq*=T#o^Q@VM`P{PX#TQ9H?q( zJJs8}>yK?Vykz}Acl`BA+o?X-T^~_g0FP`u69xHT|Y#+z<>>D2W^W>~xhn6k{` zy|7fKZK zkUfziFl84rruo2>%@*GeOxbVo24G5WS5xF0V9Kf)9L^{X&D$j?PUym6{IuooAw)X4 zYp3jnar!Gvr9`vV!ms!;oJhy4FENQ&rjjiyNFlAD_8StNhDdTrD_&Q+9=$YZ^ zNK6P+g|utbV^MgHx8Bu>v^XL9_{NhWET+?N39CN7iL}h|&1wvS@#7o>z5{?MyJvB1 z`h0q`DAM)nwjJesdZcA$*KerC_>?`(44Aza)&`Mf7M}!6*=_OVz((rh9RJU)19n7K zTigmvnKy?Mpl=$>5|tzEdi8^OITcy1@y7Jaz8tq7^&n1Q??JphpGl(=+C@0h{MK26(VhVPIfhm&?Fhl)Z zM~mz@kR9xrgl)0Vw3L8$s{iVbf`5!(EUd?Pqrvew^2jozTBrJPj=$S@5lnWm`5<;x zt5ZagcB8+ z5STLIaKWDbzR5Z)P>s^AS8v7QiTQdv9cghptrs7|M@?E!EH>|YC7)=?O0GA(and;l zv0l9zi(f$X_C3-vn_m5*D8?6Z@OZ`_rin842u_nesn;Sw($$_I6tK4)kG__L16rk zCT~M5_62m_L@UU{BQr4!cAvvx;DJ`al(`vZTD}FQj6TNT+56%fRb;!xe*>oMJ=R1o z1E%zj3ozE_=Yc7Ek2lf()zKoePcV3PG7f@8R!WN^X982^pJbx{2~6poZ1D5Il!X?% z`(aHHnR<$e&IYDT$u{^(V9FA~7|Aohl+mY}=x=~2i!7eKKTed09JDwCn6mNrrpTXx zDXZrS_Rmizi>i=zz4|;@m8+1#(DWQrsTG(q<}_CNW(ICTm!L*z*Q>jta5Rc5;gQ17 zQl{V2c}HS zW9L_7V&WvIUfPxFZT+^26(OriEc;GPCegu3Qvc7*Mn9}y$9^2Q445+OOm?sLK{G^U zO1oZFZRf8~E0Ds_MyB9Y957|&S*)brcG@LDaY8#)jlPFcPh+ID5^F~=iF6!EvXdC; za1#BuohD0o=2m@SsjS2BIIM9of&U9kS$DP>HKxB-6lsqt@Yk(<4#FH0Z=4y9`zK(^ zo_s0fxK{yF4*tpDyMZa||IBXnY_AnnC+&Jw6U_E!k;2eXreLohn6m#IR?@RQSyYL% zILA9FE|~3+mYwZ%@+Ha6_DE-|*!mzNXgepHFek98wrMWK#5N2ubTr%0FUtMoKD99t!I}&kQLC zm@=i%;ERAM%PhVYn6hy`N2<@`CyA<%cD<_KX?NZ4qex+B#$TDT4z%w4K=nwwaD(zM zOZosFBg-TMUtquKzC~sfnUT&p1koZ}iw#Z(rtDl`@E?FF#{{ExIWT4EMJD<#V9F7T z*8x+;|J_7?2~3%0@lLqV z7WomFviuTLd*?$DO}WtEvw!hp4pT#9F34+6PyQ1jl~W0&7Bf{@sb6p(wi;785JsZfUqCUu5y69KktH z;vOqeq>I$olV|Dm_DrM@_A&+6_yJQU{=>|yM}aBxE@KD!D&*HCXrr`CRoC|V?3um_ zne0d7t=}H!Y5c2@ca$neO1o5bZ;!K^xTxVUoCgt@TxLdaGB9P{{~5eOM~h7Ur@?D< zw8*4#gMS02Y_#}{!|@pwS@tgzeI+nu=@kY)1x#7-Z^52ALODN5&`hD2rtR>u$$BMocR3nA(+MlOP73)MnWA!}T~HZhq$7iovDb$)MkI2K86SCm zAAdpyBP+JbC=gX7?ShwrjJy7Udw?0a%uL?ZDCAJqguCt)IwZSE-JgDQokAGRe_-6LA%Q5(3xhYT? zLYJz0V)ReN?(r}gI=~diy%d--sh*V@K(klMaHM@p-7*QkjQfYoqry^e31Z$-PfgO- zA?q_kWU;r>L-&D2lxwW}Cmp2+_XPT5?}@i@6uMfKjHyf7msF{Lg0BY|jI3n_p1uZ5 zId1WHz?7x82lcUQGW}R=??iS=i_z=_OzAanG^c|OOHkDvoVK_8i@f!Z{A8^m5BrM# zPrhU$#(Q&;{}bM2D9SE|?_^i{x`aIGI9+ITUvOPQgC2&kl)ELvai0UG9Jlx#V9LBk z6FmY<*=%v_aagNGM&Dzi4+f@ewm4Tui|o7CME?VrGT}ah8-OVbngshROtSF2BVBU9^Xu2HcN}) zoCHkS&q~;V0Hz#X74BeA6shUpX`~P)JY?P8WQ1w#d< zY;R#D{bBY*WlI}g(qvV}lO=sQ%CSt(BP^$vbeAYnGq6^q5ITEW{@j}DnCCf9OjQ1#%W0{6lmeb>{6GdvqdpS}FdnE|ty&srz;Bl#h z(ame5YMY)}1@ncku75Y`p)uqE|9GFHRSD0})_+3(R6VeFG;1c_Pr zY>3Ql;|TN|YY@6w+VC7BOOOonSPm zbbu)bo(^}=CyLZ`ka!YivY1)VNQ&bg2Ta*a>>qG8iXz>h{)?B;Vf9*$6vCM2*!erS zXu5iJpqi!KpjNy1@y=f)1HuN4_n^C%cx0o-Yr#7rgFH`qh?aJPYBL@gN1^*WR1fhz z43RMBc@9ypHL;>HrQM)z4es!oeKK}i1&)~%eLkp6)Tp%Pe9%&)Ff{W8>BVvH0j8{c zG2D5Xs0wK}s5jkInNBihY*23n1N#Q$2s=7WFWa4h;{cIqYYaXbn6gAL)}sZ$l>IjP zI$+9#mpD|tqQ;3LU4px>as4~)6F>@K5mOv@2$(W`ZMag3s5EJps9Sf<$3(|vW2C~E zu|(aot32CxqV@DndI#BY=OU2_16y^~CyMl4wG6+8BjpOD5GHq-nROR1Wwpg?fGG>s zndonTDLXCR^;GO!QNGM6&juZfpzo>|acJj%8X~PF>gF92{i!QKq9bMUSq@jZ0aI2J zd%BlM`mP$ABE3XfwwE>}vP{x?Gl`pkDMu}y`g@!Y7Ma>@qE7`j@)d&@0y`ozEM5gn z*+J}YY1%}QE>Zte{%P@Eq!3oV##yVc$Sf08A?-4CbMm2BskBGNjAiP!WdH2a7|Id0 zvz+73nTzjZk+D5yGEM@fEV6hZFy$z*zf6ZjjYxaF`meVK#-u+^WX!l;jd=d00Cgxw z82tt(QU8*j_j;h}rL9)4PRFHZI0JwbhL$kJaX$d2Y!r-7{4Yc}3%JH)`#7r%`OOOk5Us(A-}lFwz?5n4$Os&_ z4w$mc;&x!lxD6(H3ovEHyPS;QLevv_y;|j+grVxKeTlHLkcU;l(|Kg97UcP9w8~A| zw^QP!B$-VcowBR{$xS*9^Gz~_-ZLXV4w$lTqrqnaQ)a!-30nCG&Xh^esI=Fs^;0nK zam_bU7~01aY#M+m6Fx8a$6E1y>$LTDZPRv{-^-{}a%SYE-|+!oMvrRalPkzMFz`2cFLB5mxYD=KV5dy5uzo>oVTr zC`9=+W2E;)X*a5>s2NhTPFRESg0blS$T<3q%I^=aScFN~@=bWs`lU>X(2eSjsL9e* zlQ3q8hr>yfBOGEmTr2TMY==cgf6HFQZL|SrRw&U)HQLy)Nj>2)XfGJxoz7&`;c~r*ixYfXvg@W-_{|GSUkd1yD zm@@IZpa`O;E!x=ce?0eNe1zv}=xKF|F?mzgFj{iCElBDfa z@6FIVNP3vr!YYin(F}7ym?sk!3^SMnvLxfJn{lAtfP9aM;GAgxCFmFriarw?Z3#^g zihCH74#o^V5ni6KTH`&Jw71OsMq$myTbZO+YrSB|T8#HV68C;ug|!*)xg^{d>9{56 zkV6|5Gbp!N)R46At0!XoOTSj?@e54&jZ>vZ;E9Tn_I*_oqxVd;M;2?m8)EcUOM7H- z#=Av#6|8Q;*wg#!witap>Ar|z5aviwkTO%$X{Oxr82{_?7o;$>QcQfJ4mt}vx+43f zMF-~rQ`S2AN)r9&HUU#MTl_gNWrBa*i68wNFlDv>L{4CTbDSqZHPUvf8&fmk9dtI1 z&Tw&#{@W~Vr@AE-x1*jDvdWFM<{w8446lnK)e zz6zMK)#8VNDTj%@VbI4#ZIpJMI{7e6f;;t3SjmN@OgHrp2BvI}G5BI&%A)NBd*|bO z2+w-c3lcA&3ffM!4*Q#)zSS_&IFZ-lb zZLI{oY4-2>W_*^6uT#A|3y-nV+u#^M)(Y_6jhL1gDn?Bfrhbvp)XSlV~hDm+=u@%{;qEJHHH z!<~FEStdP><<^I2$<6_NSB*sB0-Eo)VSRw74B|HXea^A9nDv3WUg>kv*jU3Q?by1e zPK>k$)E6=Oc+k^hNtKbMNgIp>D_$8gIqa5QIsBENO%j^BOF%cO$0zIkH|;eG%an|b z>WRr%628|ctl4;>JYnof^004*qJ$MQWEi-H3YfAa-r)CvDU)|I_(x#MN{bT;u)P(z z+2S*SDI0e;MV13oX6zx@Uoxbg&`#Aq^9)RM7c$6_w)SulB21RqY|2eP7l&k`x~2U< zo#+4ZehfTDb|i2B3qe~&wM!d1Q5b1;s>f#~>b1tLLn6zR%`}twEHGvEEQ7ZIQ&w0! z^DkHqBD422(Z>Q)wk2|?dMCb0f)a&pR6pS2vEYEBMHn;0bKJk89AV6yaJlro0+l*D zXg8`3yze6@=SXCEMNgG;6CtA0wL=4w) zbt22um~whoEt0;gf*dyoDGbfsk0Yq)#6>YuAVsKIidP|pq19qyxjYC==^VgHdZS62 zwtqlF8}LXgv;m)Jg*V`=Rkd|Zy#bH3w%UM?N&NU$d6;*-7(RzRY=*Dr=w?wv(uP*6 ziB>RM{nd)`tY%iLF%%`NNa38)>rbhua%taH4@}a(SRFDSdx^rB@veGs5`Mf{xJ_&I zB>7EZVpiKE{cVOReh8T?*2-Zx?nYqB#sfJzeG6)$s7z_stBuhK7@c0hs)f}W@3m;` z{PAxdU*CcB&p04SqO|*i0Tk&xG^YPsx31iaAiT?=NtxEUP(|R~E7@2<% zCrS@IR}^WtTBHuuDMd&j>|_d_t_DmwdT_YXh$zxUYPI)AUFm+L5EdN56n#Z`OKPCT zrCp@%(Kn3ylbOqsS+9vg}&cl^k=!!7!a5L!dfGM+&;0W~YZj}UeNxKP8ztBgo+9QjWj7{p^ zD1Ay>nRKXlWXV$PL)90&XXY{_vWo$Bg?(vY%Cuw5z&d~_ODrA)rtGqK#|v-=fXK{a zO_9@qDLXAL0jA8z3EjYH*M8R z@d0Vqt1Au)ZrY;LEsni=DAG9=YcT%2yUk5G>TThl=9CsNo<&a=(NuC0xtUi@v(wn&P>_8<8-J+U3f2H{dDGY5fDSG1*Nw=s) zL5f$5qfQAOV2a}=15@Vy-V8Mdn6kj)%YiBDEM5srnU>2b(8Gxnl_2e{cRUf zBCQYIoyAHPltSxzj}}oXt-C!OsN>D)7y`RaIKxcGyTFvi7CQ^D84{VFXQJbQDTggS z4w$m=EKXiAXpSh-kJW5{`82{K^Uh|5zTpUM{OswkEn`PL)7oYsu9Fmm);W`_3e2P&b*4(DJ|w|E-+=mpTphfi6Z?( z-R>Tt7sO(u5O!^q(jkiU6ZO?3|4XM0DTJlxgnKCwMS7QN4ZaTEMG9d?K{zE{6zM1G z%UJ*7c=zwv(27}iZaAe(RE4yksPA{w=fd=Ct`b&lyq}C$D~#1XQNL=>aSudSgb9BM zcNH&+^mX-+>!+NF6vC#hQW`~(zOHILKcxaGgr$YyUJ6AOOZ&Q7I+Y(gvJ&I1FdiAJ zy^b54{PQ%e=!&q8UE!u!J)I(x=Z8m-ASy}P4XR}lZjAGEAu?uYPjA!RX(iY=OG5Kj zIP9w(k@Zod#CCNIRYsR zjl0lva2hb>xWz@ll!F(s1O3g_S{$gD1wp$+eLG!mp0w8~EI~4ss9&b@=c;aDthPk` zFx~&X?^bk0nErP&u&012iv{B=bu%z!2ctc`JV>jBzODX;mCs)w6@qBl1v0@g3uO8w zIO8aJ!_uPvBY`Q?O3Y|41g5Mf_WRBgRVeLgOD5s9rFvzU;P64sRVcZ|zOl2q!kri5E`Tt6$C-X_xZZ#^*rbH{qDE_oIW3~ALn(>z3-d*zVCa_y=ND> z%|doDvPx@vb{9DYb)i18Dr@^-7pz_*VTq=f<#o@-NdIaZcU^|uPAGw7?bdcVD4?c)smJ|kg?ru91`%+yK$ZX5SS2JVrOxI~lIDdVGmzm5AQ1D|b)OEhWR4h!*N zRsR7Sw`f=VR3dSSrhB%RW$W;!c?2?G_C`n_?avSDsY5S)@*HSWU9ks0@k3vE-fgE&wU-&X%71#A{D>DTMF?Fpue6yK15@VIGLvkM zPp&fRD{UA1*X|mg$32P=y5=snnbrbRjt~cOD}AY|I&I(cAM=lvnnn;p*Nm%8CLCI} zy%3K#s;tr0%u`hyUF<)-)2}2`9zy8a#1Jo50!%sKa4j%p z{Ku2A?eN7CA%qL+HB%UpzSO8%Z8!Lz&yssBUPDB?vMy_@-BzyaOh`6mBi6QbTO7h> z|0&V5#77ATy9~Ax?YvCe4OnAEue~OkCT7Z4yRc09m)p3TXYu99yc^18?!Vrn-`k`rcAreZlt~bj9U#=4ikq9-jmK(y21b3 zOkEH%-o%#}{T#{YUJ?nzI{8&wF$F7U;${gikg#fXZ?s{JGjmN?yeS$+_bwZDTfmgkzQL$+Z9DwyaO-$DVeuwzgD;V+O5KNS*!9z~W|Pz%Z~Ar1^b=*bl-_c+ z?|f||y~Uf@n}pGwrFZz(Psa*BvQ^_vcB}4s5iTBTHNKY9 z2K@SmY}DV`7T+KfAzF;M6WF-;XFJP0n9%Yl( z_75M2^UyZ;CX;J{wj2DrX%}%P$)^>yc;4J)%8U9JXK-onR zTX-cwZVzReb~WNKEO(Srjyf!N@>0&e)6@j-T+~Ea{|}2V2Bz$~%Z{KEm~x~=aqx!Z zP*tYwsJ|T7e1ZqDIg8><`4i^1;@BsMW0tzRnN8mFTBC||)USyllNU?<3(m^bnDtMF z$f10;D$-5TDwuj+TsD91Nk$tr=E=H_G=Cd&vAy4jF^oAlsO%CvaSNA93&1Wt4$T@ z!j@S0L0E|hvY}2^D({L*e$=RJZ5O^j{UB^#`3Wpf(a@GA`Q?nL@G%pOD7pPjPR1$~ z_0qIyIz}Fv=09${+q7M{IW$QbM8#U%!f&R_6{jQbz|}BC70!ekbmj4qc*~B%zFfKv zi?34e9!8mQ$&qP55hr5d*X9kot1(Gr*-vniBqCWADenLA!|U;*2qEm+BBWCl>3S?z zf)5UMnoF>IsIld#XfO4u8nu1FuSwxmFmcvtnFI4%_FptHCx+t)<(uE zUhuC^3GWA-gAxgoyR<~Smjalw-Qj9r%A8f!`zBz@8iyYTrW|m1BQRzDzoN6UtEwZl zeZjvv1-k}T_r4TIMTPa<(U2vouGRJh|FIPLo*MfJLg+g9Of=+0Rcp0JKFbifG)|sV^|@5u0g zS>~`LqHI)*BmK!pLYe$;_9`Faujr)o1^iFphqR_bK9@9y}k15V~frv2$@2Fy#PoAa5@sou_on z|6CTn3J+3!$`~<*TQ}rFckHi7N0|1q=>>Cm7cgbLVtB6srp$VkBcA}xdc~+>ZO6h3 zg@Kql`;94it!dSC;1!s2Mde$XBx*oW*19dC#5Arb& zP9fcy(N1CPQ}jnV{F+vQN4RS6iC3BSy2Vl*Wihe2{H$u8wvoaZKvT3ZGA3hTvAt0M zVJmyWw^Lv%2W?%a1A8iq-r!tb2D(CNkGAjm1~6sLFpHPh z?A)nN4{1A$Me)L0^LDusCo<|<_pZ%!A~5BY!@mNitk`J1F94<-adW$p;ek%!qy z)0BSXKN<_KOgw}Tx;EGlS%HnTQt6ogP%u}fe;q>T+VmcKkwJHh$KQp^?9^Hykhose-?e?u|L^nzWIs4VLKFrcF+_H`+%cnyw0+P2J5DeV z5}qljYpD&98K0)=H`dI> zJKhwT?Rb-&?bt<_BK9zQGp9&SvPmE_B(tIFlFDT*1HCnvg9+1?*yhCaJUDUa_)rn9tEcCc6ht1 zaUYG!vd`5!$d1q=rKj(|r)+@&nCMvk1p_Vy?NP@`Z5R39#CXG5sd_SE5$-I+?S6QY z27!bNzGAwUBD76I7x^m!IgZP6kJ*#PGgsS1eoJtM+M1NLTH8IrIciJO9%gI1$iFu@ z4K~?L=P8?SZH)om-WS@)O04bHfR}s7O0BKg+Q`bRttB{GbCQ)?+dTn}9ASTCoDr!r zyzTdGOblU*24WUxU4!#gm4goN2TYmzwN5TJAuwg5!#ePt-c3vMg6uk+JWLtyPHi{(*UJsMK|X9`F5?X``HXqN z$*_`Eew)x=yyu4sXhqX`C9_s{>V~+OF|e*yB~DvN~&97Q^XtI1Vyq zTZ4T!yr$DGg=xTKc*DPJ1-S`%Td~5qWiFd1#l~~&(9^5r?WULUQ5}Oyh73C8SYannxFy-u-c6)ySOj+mf zF3a%!MrHRb&Vl@RGMQ>rp3-su_;72^K?FV1wqt}ms@lA*QDfS!@z?v|3C)EFp=$#} zyjUwRWss(syx0&hWxiruX-lieHFlL<&U-E}W$N}eNd+)v4sp00;^`Xy^`!7F%-az{ z*HR5ZziWXhn|I)N@lAPTk3<3~kr=oB3IeH`&i}39>OuUk0GatZNKV;%1H@-S-lYSISzf?SYxwsg11F+8&x&pf<8LYkO?wA!;LQx3(u{9;P<34r}|D+=%MM z#xOJvsXTnWvdp5~Y(Ao{WlHV3?F$?5ZAW2oR&+L6ln!Y7iN8^P!U@0akPTbg2wqN) z3jT?7OjFHtI1>Vv54;W#c~4&PSC_Y5R%)igaMUYN=;|wx9U@QkWN$?`TZZ z!*pKkMD#*AsTd#5tAHuH_SMdD2mz)n-j6lO!6;W%p|*?trK#b;Xxa@Jw8B1y;8hvG zl!e*0gT=sA~Ny0X5B>A4V$}QktgpJ^!BMu!0{Vgs!zY43SH(q!l(~MKYcP z4Br=%yua}*()K;SDH+#ULR*(IPqV$}-;s>(pyAw=DO+G|E0PbAiTD-DVE0{W#MZwO zm@@MKtq#kE0#jBvJO)gee;~&q8=zmE0;L=LRq{+5Ud`2rlO~0oHYEH58%Hn>Jc7N*_y^S~HP_Ike(f|)!06$IjcdEqUp|d9KsI4*4byN7X1H0&CavxIX}A&* z+Q_D?tnl!=J*$MwV=CD{M}(RBQYDwEZ+^nzD3jyA?lG zn*PW#tgUGpKB{3Yvz2ism-;O-FL--6rkODPC{DAKIC`W`rM64`PJ5MXT-k)RJrV4$ zU6D;%+miuHB%89frviKk!V<|mtzs#bY2#)k3#@Hbun*$o+$ULCsrCN-+)enwKxJXR#dCluhaEl(m@@qs<1K$P zfhh}*(c#a|-$+%|4!0$lftqRhG8b`V+}N!Jv+N8m~51#)xZi z*9;a`!XI$c zPcm^i+Fs)?NtN#l@(W#qvL|@>Qj3+u`3mtpMrvy&6{0M%@ zj>R|gK;GThuBhLdj*~x`a;1%E%9;w~M-(Z8sJn<|%+)gDEi7YAfMwf$ZoF%>?eI@# zUz3XRPiDeXcGSLdbplGX?eNi;DTAoWnlKxf)@7JK&fDlblhF&Lge9u(*S5ny7bW2F zR7B7->lBUfVy^;IP7sH;?v$x&)waXGa+*H<7H{IwPac{ZQ+FndgvFaQ%!_@ABIrNo zm$tTjZ^2gxm8A}!08BY_D#tEQCXqI&bI`Dh{JED0sEXCGLfhabEQyb4IUC8Cq`H{N zWM{uf)n(dt_|M|WhHz((H*sgb0m+!8kI8UzC@^LFX?A$;0aMOB-Qw7-IB!+i{wr3r z9j**CDJ@re?CUW+{CH@@GNK;S?wol9mKDl%G1l_Ntnd$n7yCZ?Vg8mg*w21P;p)_U zqx!Tx_Qr4_+U<}oLmdmWJ@)oMcJM=BBC3y?!s=+5ua;@gu(||`sV?{v^3j|5rmdd2 zBff%Qkqs2if(JAu@R`7r!I^eCF9D{ka<~1T7UE-Aoe zPdb$tI&Zx^kh(l#8B-6puo+`$kwtLuFOavo6ltCo=6fA4FbNM<36|Be93=*R1d3x( zRV>bn{SlaQ#Nh{kDT{t>N4OT4vcci)Z^JJIDyJMi6PPmh9Ghf0FlALKr%C>*l&M;v zZHIrY{E@;NN)STVlHV{S{Qjh_sY+M*o!jxGp;#FsR{2kC7pD6H=?EvzWjc9FQLl#7 zE5+L__JBP+*pu~H+avNapzu%VfUx7K+}M-|6>_4D$==1 z?G>9JA%w04Weky}lk-%OMy}Yzo49nc7rPkg7*O_GrjrVqHQj)=3$L@+b&J)pMB9Zo z#Bh)dzrGNa()2g;2F!m-*~&707wxA<>7=%Hq^}@^uH!aDR`VTIMH(4tqUjbNn*n>! zcSy&8rt_i|%vDvT?Rx+IB-w+)6?>I2V!i)>U9mU8}kv&O%DGA-hrfqO)SHUJu3rJ*|k8c!_AJsl*0~h2BvJhAUc);Rh8QI`WIs; zcyy;3r!dM27Dgi`mFE1>&~<(#Klr)on6K?R|00f$h`HAJf06Hnv3&GHR;gk5F8do` z$`N*t&yAdItIVmeqrMv6lr0Y54oo@wLhJo7FlD2|{|2T^|C9B88<;Zp&lZ0LOj%ZG zar&M3z^Tl<@pELTj0YKZ-wrg`|y^-0=I=`7km05IgZ= zi-0Mc|H8hd2huX7ryq(Qyx0nu=vZ83$M7I9Wvj!-e}bQgRL=RU_3nW;WxK<-euN(@ zRZbEIk49*}($kL#@11=EdFYsaiA_HVOj+!(ylI58$>Hz+1D^_&oem!XY~`gkw^ZY) zEOhvn@TRPE_|L$U9S+NjO(-*}ZSI@kO8XNa}g2#i#5UOX}?qK--~qsQ!cpN4q^i^WyKX1e<@w4%&FO85K7aP zmagvjc8lCSx(zzZfO~$ zg=KBkAZ5iHTv_L!fA(9v$j;VcV9LxZqq9Ytth8)tOlOOhDNR$#vbJiFvf>S{tbd?? z_S?+l=H8OmPJ~iv~>AQEsK_1T3FUr4N_LT!IiZU{j=W=_K%mn-Hnfv%K5c+ z5)TBX9C7$`V9N5v*837*%8aX{V=hD_4b!@cs)55WB)gWVwH@LCgi2m7c1^dU@ zG_aM|M9U%_Rp-*xyYO?PWQZ1)#gHuwQdYddl{JR`J?*!O{bRj}f8ujPT*tEZkI+)3 zk}CMc)(p2Npd->mX%9Ds|5kb$Y zC9GJEqNJrtOE>uXNvEZl79kOA>QD|uvx~Sd8XJs9@%I`kjnmR?HCRLrp&pH#g>4M zsZ+Yr%kMlIubB(?oH$GAYv02Imog5!Z_7+N`wn_8oNEX=$W|{q0%N~>fT@+qL9Ne!hO-&PGW zzIcNh-!)!T}tTxvU_EioiCNNw@C#1Q_AU4t<8+r|F9*ge3M12?m*e}M+7 zy0rZx@&w~^dMrp&p8ecue)^>?Gvm7XtsXFl-%F-m2eDJDQ?^nWUpOOMHAv@MGf3yL(~*wJYuE|? zegIRhaCikUWsk!T15*w;{1Px_!yO#JN3-$dL6cEMx0!awyM6hkPD~Yw+G+ZyHC5ei zygRks@j)?pv5n}5`CHkK7yBPDWp=Z6@5Od#$B*JF^ZubY?0Q&f=ADM_e!g5*lA=~9 zX{Y6nwDc)S)l9oDgayx8q7x?1Xo+@`dzVr3v_0`Hd5p;PqNtyyx5FolVkaUQlhiYr z7dsc&%DdUe7rWvD2c48I^J@+YZ??D!A)dlX8`1)rt!ja`oBfpmLV^L<$hsr8Y}h1j zOxZ-lhMP3xxz$9|zwyOWbJCwxNPpR0@D)-fnl{AH9cFc}hcGtnsN^1wSjs5;r%_GX zZuV=#Mg67xHf6~gvDsf7F6u9FMaqh;P2$4x6HQva{4PlU`8IBGfY;B;s-W>E^SfX; zk@RNmrjl^bi6##EM;J5%MzlN3#UFqvCt5id^`LW9wP<_k6XtzskHbdK(v=#42R?u) zQ}1P>k%YZ3I9li^gvZ&2^uLh=^e?LbocXJG@Q>N0Bn^W<_suz135%es7 zz$V(}5qv#Y+5e!$S-_M*yTzvgQ_geva$w4Fhg*RuvmP=@aK-vnV9GAV*zd4Qwy7fB z?DzWmQ+2$FKUI$-8Qn`CwuNrjfjvTH?IRXv15=K5C=QB1yVYqz+hzWJyJYx5)mBWu zekVDG84X%sqkESoTjt-t3!aRWn=)w1wWd3ElDku1L>QS1YuO36cwjS4!ph1o%Pl`9Lym-6F~7(~(={T!;7W#7VEpCT&s4kAW%2h=ZyK?Ny4G7)}qr zOa2W;x-R&a-8id&t$fat8Rc$I;tRVPt5-)u zN>q`q@kdR_j}Stb-xCeVRYkhkAJ`_G>B|s8SgB5!>3(3!L1yw|dq0I6E>#B4MLT#y z=`^K_{kP5Y2TKt`*Z$`jBDb3MsOr;pvH#jmKgT4?tdKEcvH!Yx1m#|&BlKR-ba>JSy~s-KIqFoQ?FRqxnYvPYyeYa;`;@u|noPpP-E92gm7$&kP%g+9sZJO;gx_6gb=pB6y0#7^OUag z@7qo{T)Zi|;ab(5$s|lST)fF{fwxfv{pa+t2$|+IRkOA2_MhDSKx~5WR%vBf*0y?g ze5S$^ce3n=?G)W~WI5LMLKt`Oqn<~`D!ToD@2=Ym1FB2bi*5 zF+SO615h5PeL*#8B?42(2uAhUHDb7os9AS5J8r@PP@ll62O#Y4nG1+nL5B?WivOb z)2OyD_#Mf|V^fNatm;)0@q+(o@~OHj4<^fBW|_}q^-R-t%zxe8Sfq^E#_;O#ePn(n(G_7iyTVubr*Sf;vPoO)8pXhr zW6t|(V9M0jS?@~F+3StU*LKXmXB)X)?bwg;EU&UbYir#`?uI#~7{_pBlh%e}QEne{ zvWI5dlZ<|aD$;fS!thuh zx^XMN#&v0n={y{mvf&NZCUsHVGH=)>DFCLdark$@ly&b|?>b=09*4VtDO2CI-fsX?rjIBNJ_T*wXjGcg z#TbbkEMz;;vz!sQ+3-1RK9%hb&j+R~e9v}!Auwg7!wtZcT@F71Oj-H9O)@OrDmxth z4w!Pn;a#7{#TS*CAJ`rh&WgZTB)i<+YbMu0B77XEi~0y(`0aPIB6>p zXw!_^&esBaDzhB^4486(!`r`rue&PSKhz|_{t?=t)^7jp+43k^0c;uS*`_Uy8(~Sy zU}KgMX7geX15@UWv6D3snyPf+hryn*LyW*i&rTbW(u*s&s%o@d@89U-%x3?sn!>8Q z*l%HEmJw#dnLaS(+>h)8J^)Oaz1iZIfGGzZejk`}%Hf?}#Boh!_Qy8K;lPwd4i^Jc zHadI>FlFsH=S|Koy47h?+cE!(nc?lnw;_bCxu4j6p9H3?c6bn&GW%2OJpoKv;qa`N zaOFZ}-e)XF-pSXdbVS?D{#v{+Dtx10ylIKqRq!<&*_fsDb7uPyXs71x)i&kJZSl6> z3$|u?dOx|A6I=}&y^A$h%H+2A(X|<8@d=h2!p9rD*u4m2*P~yugf*ZOnk3^3LtP08 zmNzoO5;h}>-dPDz36{3qZQ=AD(h6MR2^JQ<-M{fSO5M}GX5n){%O{Ph(l(_z^?P1$ z+SV+~%-k)2joyLgO1U#t=PtqWRH|HZ!G{N7?0Ur%OL!2pMU(V0nJppFV&?8;MA3U7 zAu7RgrI|Y^oZj_Xfh#=0!ooj77z^(HmW8MFVe|dZsBCRhUQEG$cf{5#ukRafzIm|G zyF+uOyp*DImtYx@cZ6f^DiOx63w`-12>*hcL5siB&8Mv^A;B`bOISiDqN>!pHX$m( zGC127PVaoJz!jcgVc~C}GZwr;7P1Np{}!}YlMFK1(izzA)K*!gAry-P8wTw61DQbK~|i=D#~4nq{ZD-)s;EVXX#=)FKIaD^vWSa>ly zW5K=hj@z*Ci$NzfNph;8DUaak%HWo*S)MR+cO@L@-KDuwIs)DA5-d})wi-UO?MTV4 ztI}A)I?$4BjjGYsm5^XrW#(=iQS`1)h)S?**e#rKDV*L5v;tRnf`x@|`wHex-FtUn z;d4MIl_qa*s44u^tyvaF=1#r4G?y!Zd8~yclp`g(u9BZ0nLG7fpcS~nna5gKcn>;b!Na?-@b^I{HA(W$(YgCGE@UKF)@Iqw zNACg6;@zbKZw|%_p zX$7wE1PcoD{LlxWW@GEIef`{x+(6(_Som zf6)1vMwM%8<}MjO+a*{w?H!iz3q;X7YflqxN{|CeyXLW$SJG#hv*rYg78gjud0JG1 zwk~0U#U@O!XhJ+ufQ%ew_ud@t(g+=6KR4|VUPEtz&3f*~i047)XBkzcZDfMtEpOtk zOdN+s5Jm6Wgs23|V`j_BEYQ1dAJeCsg(1yjEp`?XEYWH0*w-YQ(AFhPu-JqN7CWs; z>+oGmC#UBJoTMz!8l?@|no0Wc)-3-tdr=8&^e)PdAMT*$v6dy=ixMmxt|Y9|qB^y8 z!%eW*gb5Zq+>4Qs!we4Ka94nq{LrXsZQXDaEH|5d;!#A=yDlLr!BTJb2^kZ;>-UeJ zq+!itEp|)^mgppP=9om2+PX$?Zq{6`gaivqSc1;jb<;5{;XcrUqm3%l)@(j0A;I$6 z4q*u|Ad21<2~i1_tK8htyFn{(g(p~8_(pWbg42)F!oAoRz?7K<9M3+7<8PX(RBcZm zPQpq|UToXfa9vv2lVt_GuF?katS=R}+s>2aNIXstr zG~+)-CmJ=NG{s!aipj-0dd~fEG@{}pqwv7L}`k->JyV|MfB|Z zSu|o&J-d}Mq8feBbNuJgh>{|sMwF(Qt0OVF7(~zFdC`cPlZ`4=%7|w4LC?NlMk7Yl zvs-D3`6e8bFaGqLds;N2dKjll1(C z$)vI=P2H(9#r~B{urQg_z$E!)OeXtq@wrCLQJP{xV$u;kJAN09=u^*DrHshL=;>Me zdyT+yOfo4ddmSzXwz87>^KpbK`GZjz7nt^>m&2R<#6&dpM>VarrsjnPY21douBcak!6{~ zS!`bNu4Ni;(%A@K(wwXAOcn`?H`z)23yPqBwZ`KP zt^0u~vzJ9{BOSK2y^^F`D&7>WElrbTX}jLHVeuv#_8S~S)SWe~_xrgNTB6A=g_dZt zOQCJVz?iI(1H;R5-ozDPl^qUe0aIqx+YMR-Oj+Xa0$|E<;_yQ{s)}@-e_8k$U5W^@ zifcK|a_lHqMY`F4lQ+V}o9xHyZe*i>+I6^bwN;KgJO`Mv zp}~5e3`|*mJqK`Jgr+GyeI!Y4w26I!XI-|$;%3g;TN^X^vf4AO^z?5SS zKMqW};uh<@0hluFR*Sy_rtES!>m3{hRaQ4y?;inEHr{4&IWXn8!`A>)j^A#*9}%o_ z;0}vr#b(N6`63eji@gPJ${~lp1g6Zt(|YgpE{^IdYaKoem~xmn{EIoLinPPOX}aD( z8*j27>9dfH{w4pgeP0et+2!yZz?8iXuLh>fy2~cn2uxY;aMDJ6WmGxg@SebwB`r3| zvA~o)4xa@~nRB=Gz66-E(c!-XQ%*VjC@^K&KW&n=z?6Ls{}-4t_a5sV8^OI=D%%|1 z1(p<6e~sqJ;zr@BS`C%GU6|Ypy$xN(FoESr72%- z6ZWwJ5%iq6FB(Bwuapr_AcCI5ZP5tQTBRw?$zdNuh@j`>{m}^02BnPn4iWUsdN3M6 z+Vy~;DSw|9_OZu%*yGf*sy!M(nx>Qy$035A*$+h{M$~hh5xq%aA6@w4Nze3$HNuOP zAQ5Gk!xsWm);+@f^2~Lrsv>Ql^_Tmyl<5*gkj;u$^xLrtEWgoAF>~Q#DV9Ftf2Z1T` z|7CN3EV)&dIlRLt4l^qIh=X;%$AZzSTD2|xG$VYj=p;nYGkDtOuLP#dbGQYVveMz_ zfGOJ@9s#Btb9mY&9IsSnciS%a2Bs`?_*h`dW`~P`Df=D12$(YW8Jl}KFlEtmiUWDg z+2FHAjjlHBtk+}VGDXdZpl9pzjF5+8+cbVk+gY2#7aNO-s7wQ9eJmy~_B4_)Ny!VE z3@;S}rtEl;eQW})Ri{C1qYw2K_8QLyZJ+hcL%kA5)^Ba@p=;lJ4P z6xRKlWytYlNa>uH42_o2tgOe{Oc@eK7HGEUv&CeE5nEWsekg<853mfpa15BTv5(cA zf03i>S+z#{@M7J-lx>RfJ@aE= z$`R-N{ST2uW$w#1$qB%eH4c{pQw})19GEiu6`SMOcTVCve--1I9}rYZVQG~E-L<}jtpd=nG92_bZ? zvmwucmZ++*ArIt)e+@UmNY^oj;2POD{$i<|J!Cq^gd7Y^IZrXB?*d@T5{H)nQw|Xa zvc}YaD$-^CTLZvj(IZnXG+z?Adevv{vhu`{V`ec$5afhjXaEiMJ7tlMPqVqnV2|61Gv zOj$E#@oHeol=`12wLWd{`$!qu`jmN^?Q1`@;rtRw z*+ntC!e3Be%65m-KF4Xf%Bq+a=EZV>DQ5>3p9V}>?(jlj$_a2f1d zY;Tz8*u((5{T7(ApEx)xLc5e^Y?eEH@Tv~j=$Vsd>%1M9vXeOI0WDTlp>4+04E(C{ z{?;r*;X5Vqmvj=pf2sR8lX0_OA%dP$ zdobea2(6!OXvT(V@{sSNFcG!TG!(wAR!l_gG`(p}L|rt!WlcnrG`($2M7g_b8N=2@ zR6)}_p-GA->Y?cayi?8;Pc%%^rfJx5!f_F$e_#6=vwaa|(e$x35#`eKsWlN5)AYGD z5mnGMX-z~mG<{=DMD;XHSrgF;n*L`^L<2N^YfVIHy6rQ*3r#YIM8z~+B`-n?CyHnR zO^ao33Qa^+G+k|WG|9*vY(b{(XkJWqa>^Em-;rHOW!j$Bd*;_DOJ#w!IN{zGm~t{p zy@R=+>3bPfsO`*A`CA#3!PKFsV{hX!^FyqU7Su&7xwPC8V9z(UA!S9{&CD@8W9|j_ zAdG0m7A7pI0UN6-Ka|zUb)l?%jVjSL{W~8Ic?NQ*uU0fp)1oBYgCvLhkvNMv+=uJB z(K&lRlQ(@)lH52YUG*rMqNzSf)|`>9alJ;9$L2>>EtD%Bmwwh!-3`2iL}OjmkO9v`76tyfiJZ*z7#qpfPQax&s?8_yu-C zTKd(JJSA^V^n&8mSQA%Srgn4GomdeDf5!Gl3G6yIPfNflJuqeCkrr12Q`Q}2@jrkm z`|}lt6P&H8M%!=vgTi(0oeGWGO zQ)V4+liUYP+3E1>z?9{4)jRkCH0K1P8njLS1=a?`-Ni7`ahL&KY`6c(&AKLH?n$=S z6M!k_Is6-7%29`x0aMQXkxkMfNmMpF+yhLR`(x`p0ZchS9LS5NDpWOTd&>1GI5UwK zKgC;4>$8JAf%m9Nq{_ z+34{9fGNv=VUuKhhpnWt$>D>6DGTOV?^A&(D~N*&BD6$lH}*uCm#bl;=jeP*6ka+{ zJH@C{ZBHDSu@^p@a(YJ8NYiUGWFaj%+nW1J6V;^ciSNw7VJkEd4bb%N3_R);CY*n& ziK^H3#L*esY1E{mykg^W;@FHm)ikcC@-#IqN|sX_sgS6LrrKn=!Bi^DJl%LtXnW!< z$#S%oD59EQX~H|h1;WHcG(po{;euXal%n}MeJ8ev$&1~MspXW;Kf`1Mej1pv)8Qdt z$|;9G0jA73(HjE=< zHWL?yC7K@CW8d(@a4I@vfcJka;|kEZ=NeV6?K1!Kyi6@)RN1(-ZO+3E5Pqj8o3OTz z^Ri^;cmzq=MIpQLVryl{DvN&03S|BD3Z)&|ZuY+j?+KI(ab(G5CPHko?7Y~rl~q{V zS7DswtWwrxZC}Tva)~3$&?+|j-^hdVfyCu1%eOYEC7j$uQ)DT7`WHmvbSe8pleu7M zE^Mm*TpK522ro1;l{0Ca)Ja%q<79kcor$JMo%H7xFk=t^A%vqa)++~rtEU~ZeYsV^SE2c!DmFBvXq|u<*woLvo9lpo`vPn2+~nT ztW3wAjO7OrLC?A8GeWKb=c^)J<}W!+u7kzC7sDq*jg2Tsq8B)_sL zMtHFgfhmhGu=%$Sa1>No>ToeIW!E3A_aA^MGZtEWH85qR!%e`H{SH42Oc_+zB~pvum~#F_*85vv z%5H~unx5oYd9iwjr!FJvG^XuUNxexp1@K~d2=UZ4nIT^6bYRL7hc5=E9Cf$>m~yCCl~1TYi@-lj+6oKrZH}XD%=HIIxv9w&&M@ zJ(Ud(e+^7I=I~z0*eO+JEwV|D1E#EUxEz?Wyw-YG15=hQw)hrc%H(S-eh8SdZHdLb zz?2;hzX?p4v($P|0aKPbylV=kU1fvAhX7M{JNz?X$_a>iD=N8PM|4W(-&!5mozuL&7}t=uQ^~ck4BY&O`(~8*Z|Rvg_~*m&%NrExr`ql;gKCzpP%Dy~3zmZBv%d($(t{EV_DK z_!!?UCaR{%v?;Clix{+^m*iUwDbcpD*2k6q(3GRj3@WS>lNYQ;*o4}WwYZeVS@NAp z`bt;SK~vb51kqBe7VS$+L=0kIl5kMnIT2y;*fyIHM^VVmgu@@Gl+#>3tQ2BCahH3lvUesPgY;s!iHJe$ONyVPi8v8qLhMP8A&#u`5mS#B$ZCUg?>DMkTQ^AwmS(rwAiXOSq7p2+ z+MrZ7{-Eh=>S5EG;l7F5n%WH+(^iK&0Ta=Jhm4DwBq~SqRBNkyl0*@)tLP-H&)I=2jB;itmZsEJyc@cr;QPPo@9D%QG9UlP=z7EdkOmzanc#J(h9mAZ2x z!i3n9E=L^M)H9}5v-V>BQ%1FG>n16|5?OnZ-dzb%2^L*@QL4-Rm+7lOD=@>o2el2W zWzN&aLxYgM~MC>X$NkiH_CxVmo2I9yDdQECCkaZqYR~wa~ zZOVt!u_wuiV}eE3d6eN6JZGZHUNCJ+t?Ws`EPOiDQt-U7=y1i9rp^pv;d{b1sJ1aC z9G}i((xjplTDR#-f@qnm7VS$+L=0kIQhb-Xb0Wfo*pq&WII@C%Q@$6-N|gOC8a1J< zo1_FwWF<;^doSrE*{Myi=t`8~e%@!iYhTf*aB43?ZCPs!snk}7TMrY_#Fi$B>Uh~i z1)5LyB#9zoSJ6qz)Cu53aFXsq99h=uCbbvHs+aTD8dajLnIu_qGQpy&UdnLmUNuqe zubI|t-Iviz?tme6+Ujt{RHDudV&Nacmc8DDh zmlU6>6Tpe!B&BbQt);fww@f`|UCzuwqvmSsCMm%ZS(lUE^Ae&GEV?eIROkK2^wsyK zY0cCghuYfIGH=LObhu&))VWpL=y2!hP&gzG_jJUORlH|XdV#Fw+3>beP1>e31~|IN zYMu!eUCmPp?|a8YO>Q)8%KdUTRm(nwAI4J)S}J|V&S*IRyktA>aC%Fd>dE&mxY@`^eOTx4mI1%HKDtURyUw z36{uuqx4>p5S3uj^+u(-j7_Gm{4vv-;rnk1_1L*w0{ zt(l2HqKMd4bdrX(drkx=X=lWdjeTZPw2kaZ^@?(|Zqt_p(K4tW+LxG!7{tD$_<5R$6TwM37I9>gDW)DTkhN$_ zV@B0#>n16|5?PCu-VF&+2^L+8R;o*zZu-jA3e0eShuXT-k~+h9=y0oHB5K^yBvB>F z#=A{h-IFAWh+Rb|X;8c8L~xRBKpfdfnn{h18zw23X;hlFW|Cyl*#wKOdn>~&m}R0C zY-d_C+$Yh?m|6<9H5MJNm@?FvK`i_=*hbYh#f0v!Te8;Ms;%iuf@mpLi}ocZA_lQ9 zDZWqLIT4(sDa4UghR-6($4yq|9opUu#@j)M8y=Hnk`gSDm3ir%nh=#>(Up0ny83j} zNBb_?S9nay+8);+cQT|-TOIC^FcGEgY+TeNQG<%IHJ|QD5=F$WqLWmt6Tpe!B%O>n zveG?FZ+O$mTHMaMt5NmZnmtKY0Zy>!D!?+_uH8)3X!ue&9+NIcFXgk1rAu2Klb9OS znL#Z42H48JZ^EjyjU1C|6=iANW>1nJTKd&P`w|logV>i8U#N*V5uBta5l1$@uc^li z!j*tCjjGnxP15{$OJpTrde~EIlBy6#w%{;Rz8A>)!2<^xHL0zeqy$T3{a|_r2bpLWm0;2J zgQdFKgN=7WXEo{367+O%fteu`e|jx=OYTOE^_ zdXCyMh=r%`h>wRR>SRK=pmm$RB#4%DwP;^rB4QBxlHwcGofE-HIstKH*(aD< zafcPAqUji;y0vwalwgUha7^#Mgs23Iu5c{XWfz#fI*&K4sV@8$o1sNzY0JWYkHT4S z+D}-xtZmzCwAC3GQ-L}&h%~EIk_He*R)4ao2WM~txF__d zM&)bkCMm%ZS%aD0g$Yp!7F~l`s;e(Dea+SiB3rjwQQa0MFE)k3S#afPEL_%LUhxZ~ zTC_EVd*~*?qH8cq3H_&-sL4}J8JdkleYQ!BYgP{dQx-e?Zz(`!hr^qJDbs&#lg!u&2VIqw4*vj{a=_tJ zfGKm&u}KyJQ#Lw$Juu~j!;b({7MI#2eZZ6*4u1$tnf@E=z5ULpTV9&?*d@TN{7z_rW|m12{2{u zZ*7uxV9G{^*8)>cIJ_B{viNs4$?Oc&t+K=6qkt*X&$HfV0aI2wd=)U|fWr?0Q|6Z2 zBx`{w8y)@>m~z75-F8LYDvQszNsa=h>~Q!TV9NC0Tkkqx%1VbH1g0Etcs(#>?jLND zncqX*DjOX>2$*uh;ZuPrix=1=mjF|CIQ$P_%Jd7Y_p`v1l@7lTOgZ52tldzz%G^KN zBu4^MHah%UV9E)HYk?_?7uqB%fhjv2UIR>-USYi_fhj8;-gP$WRypACiNKV(7uqDh z1Ey?r_Q-5NsZDY`FlC3s<-nBb)z-Tnn6lF0M}a8^9Nqv-nR}T{GHp-Pt+LVK z9AL@`htC0~EWX?(sRO3$aQGfz%JeI&cP}tyrNf(mDF+;$xfkkInOkF%WCK%nID8y1 zWpb_cJ_VREb+N_&2TWOUwZ&Dyl&ucm2u#^_jrD#2m~zVDmw+iNZn56)NN$y-w_5D) zjf+_-`);#%M_|gX+bupAm@>E7;?saBhwilaVqnUwdn{fKOqp}P;^6)WZBys-T6}p( z>Uo%m#=c2R4NIHy0nB`{^jLpI4`V9GJYNOCtYo1cRv;@Pjk!3uxrA^|pxqTKd0;UXJRvg?Fq5bMyF8mYpwU0z@EzdbrvrIrmT9^;=6$< zha7$ym@;R;dannjY;gDsV9E)Hcg)6L1eJ~JZIVNPDJLENB`{^$8`k?WV9H8|?*OK3 z*kHX^15-{o`~fg!*MF>c$`5d?R5?0i@jk$mWp7!00x)I!+ZLY#OgZq5#Wlc`^&2g2 z2Bs{1&*GG3 zu`_`wbGA_&KB1c_Yggc3v9^`3&60cNWf4N6j2XtI@;|e_?}cj+PN_33x&~n&t4xv= zGHPg6u32PqjuKkTB9mcIpPIa6?dlx{jmB9t=&>j8gt$64GwA(U^7!*BF!d|SOwoMr z&)NqjdA_emQ7uiIX5kM4mb%0gacZhlO&IWXz?8kS6bE-l=!807Q14?=2`~02Z1n6* zvx)kFDa*FEcr!3%QKrQ+a`20c%9_0_-V2y=#oiX508Ck*W%2pIl;is-4&MnhtWNWl zo^=N9un6BVL{e`pd&45DPLOoba;7|@E-xP%Q8Gr0WbUm1i^V7GEBKmN>HPAJBHI zFQXJ2S-G_}`7&#gldK_P%TwE=vMFmbbxItWrz7i2GPQ_}jHB*LYVwg2FK&X7u;Ktt z$&q*9ekM&btnDKIr5UGs!9Is4nsyxa@k@jkNZ7pnO_CCA7x`;v%r{~2CWgr;sWHcd z^=iAwe`7|e6!;hlWMNY*5bI;efK}!nsC9d>!wz?8iX|5dzI z79MN8SBkgFUWZ>1ZaWU%qIC2FlB?o zHv&_Z6j|?Afhh+ZPRqjys>%gFx87O6l*uPsd=fC_e20GvOqnjrGs(Z80klq?y0yLC zZ}#_xG1dhmUE3Jq#m0dtgL$^!%p>uaKxMVVKLe)hcKBjo%FZ)vl4fAad1qSuIxuCU z!%0WsFR03#v#j@Vz?3Zxp9f5tUt+ymfGH=5gLM&FrF31=y|H{un%Kx1tnI$ou`+3s zFfvW%*|wK`j>a)cWs$=_1*U9v_ySv2kZSDFlG7zi@yY>tRfD6a7>bSu&Uo^dyRi@@^)VE)2*0Z!%2<&i!Fqa zS+Xv$o!kmcS@uVZ9|NXrbogyx%94fFdz)kNfmYeza27D-c!l*o0+_PrPZs|Sn6mcI zii2O{XXXiY%2)b&QrR3C(w`AQ&w)xt$Z66$>UpHn*OM-g(?+=~p6Cf{y4pWXvb7=` zvlL!r%UTOeS?};Sz?8iX?{*yiOsUMg*d}Q>8B3X~ta7*j-jw|gp9@Tx{1=;~2AHzc z;k$q-+Z}!ym@>VJljHT_oq*~zsO=j``{2PiFSZU5^lW8>7aIkpto^I4W?BIzU*)L7 z2LV$~I6N1avh5O9BkQuXs3M*8YkgVwI`&6|5awRW5Lt^nTh$zGm-*Kpgd5$%b;`*Y zvCO|+Z1_@%bcF3TUAPdCs(NiV`)>u00D9WV9(x?(_kH7gGX ztEx@gW&W#&{V<$+2~k*ZnVsbS0#gnU2M^)ULt3SDng4BuED{&n;dt!E3g=&LGaU>} zS#||$ItjE|o!YfM@za=mR?dZq$kPCr!sQDuhmA=VFqs#-9hkDk;eKGsc84dV1C?D4 z?|1@EP*tYa*!uH;DHk|=4lrep!?nPavlrPUEB_x`=O575y#MiYI%iwk8jVco(%e`h z6XMPla&_Gha)r%ywSFSFhd&RPq8nG@z2q6Q?4&*}5?d_JFZpot|`uYo3ZTm3aOG3jb;vcr*h#1t&E`VY{=UaS8P znwYjoo76%RYpi}6nmB0n05mbZLYqv^#8bLpyVVCn6VtEJ>@!WaVA*2P!7aH&h<409 zH~2FzMg?8{5?0&|TPRd6W3^kEYVLvNHeM%=71i#dR2mz9!i+nSj7@^@sL(YO%Yq|ZZsDU@y+Ur#8qhQN7F8Nd{{27L1RPn%z4wiA5h3C z`l>mVIeS~dwIS7tt#;Sx+1t9s^+v?Z!5dRY$8KR=u#dJ5@$7AL{*3nv(kyl;$m)O?3-XdQ@32)h{noi^AH$a)-u*r z%r+-TG*=&?tJT=z**FPH@BkTC7v^WnSnbx$Hrr>movuY=H_gW3++f=~#5w=teD}`g zw$o+b#Ms@l&9<9;mUnaL3T3QzS8E+z`Eu5E1a-Zrqf5JmvDatMbNnBFBNV;aGY|2; zxym-v)3xl4*?&N+bbFj-Ph4w6>~O@)F6$5%EjN^E_s!YneiM(wT*=~6HMTbR6Pa7z zd~q2X`zY~`s53VSx-5;En?!I!-#QfD(1T#Eii&*6ES9muUA9kf%Cmdpa9VqjDfj4_?m-Q)iQ0b;wm_&t#&x)o#sQec?5BEh zjS(^PQBbfC#j%^I3!bTdMpMd~Ms84cD&ArU<;wW7JF*Q<3+s5hAC1=)BAZy^c*jE% zWA4>$xfGgMXY~qbVz1R-Llgb`w8?@#&gI3=LP0VQ0?6uIu zQmaRyiDT5kz8n#vUFR;33T}_{kHujO38p-t6BI%d6CPB3Jv6by>Q|wOIn9zC%$p@d zyUwi)=be>}7d8^?U~~54VswL!VUi4LwFe}NimOvw#w~}numqgW#h;3;?gy?CTe%Y%*nHB z#kFf}ZFsK2A2AiDD14k#m383Ph%#}Dj8*Q{{#>*(&!vOnk{{(VuJ-pu%)AGqo3F7& zzPV?c7+rzJDtxoVy^q5qg1FjwwOGLU( zjkUz!)Wp77XRo;ah?rTY={X>7NMk`y$6J9yZf<=WH@gouXoe7GJ?O=)7ZAtARjmlW% z_QseiF_~EIsxVd~W0l(%V?J{=N7U$?XTuy!6|;}jWr{1;SbtEr?+JKy@?4moFJqPa zY0QbJD@2U0E+S@LsGC0%U5~~-iZQQ9O^j|tV{gUaUgUVUqbWCckelszW-emZ^Wl1s z{TVc|W3}jDf_h0xeSsT$-E?y|otum^xrwWfh#esdE0ZowGFG`k9j-2rgGXtRy`8#( z1EGnPFRCttCZ@g2g_*z59xsJ-yNp$C>vVI6coG$KuW0Ov>E`kN2)xFnn%5y68hr#Iv_x&8u9rd6SUvN=Rig{`*lk z5p$bRxg=J~7=|1#8_n3H{B@nWiR>iG7moAN?e*`5{SzGFH0%ld+fmN>n7h6K2krvC{o$vbi7B zBUUM{USpq{nB%n~$SDdx;8dd*;WeF1Tr6Xi`>OYQ$4~gzZ-vkbGnvQyHc20RH*8kr zzVB^|nE6&o_IshLkdZM{M^~q@kApgMd!-wUh~X8fzp@O^lj3sU=X@K3v$ubM4WlcH zh?zT?nUAhXW1s6fWBbEiSu$3+Va(Lg|LTipxMtLo7np?*EB2FaVAO912R^**Za7hYVfC^ zdqrb6nrjUOPbNQ$+fTYxxphIzYzy5gja}!@HQO?VWpH}`6J6aQxmcaxe5(tfiN#i5 z4NdH|`f+Gt?x);D^S&uth<2S@8@}fL9wn5OEOER!Cu1K9#;j*2^JP4>gQ2Z<-<}ii z1mDIRWr2kFZM+;b%NAFuW$(<{#_`L3GqiR;^FAba==NoDE~47)n-jcyyBC#|ow`Ev zXx}bGTkZasiWkYa1OrMa<2LB7-vmu8u{!1y8~_)rqxMrHY^B&5_j+@UDO|b_L8kVz z#PQCBCMFE&yf;DNaR%rPV{w z#CEG^<>64e;E2^((8Q$Ab;>2s#5}9ppoukBk3bVUte$%sUR(%{T74EYG5HIf@&;&P z;jro!XyVY9s$YgCCTa%Z7Oa6xOXGQCb?{e&!0}m z4i>DT_K%IQC1NYx$6`)#(WwMMrY`?VS9?1&vD@m$poys?n*A~~vC-;Jpoyc@{$UGo zj7q3m#?5#R$D^6!O*#X+T4dqZ+)M9Xf~$s#%@KR%xwCP4U%Zx_FM@&e(I~tiL$7)0 z#U6E=b+P%-#N=;O*FqC>M^!%yO)URb^)NKC`8(A+=i?BYVC?s*_k$*uTm5%vVwctC zaxuhFtFJ>gv3pE=KL$-q|3URT(8MCq`0>U#G_n3i&7QjeujB-KtUeE#*#47dFM%dT zkE?EjCXP`DkFLW)qcT>z*Z)5FbAN;qrl$U^ot!gqdm{d#dN#BpSnus@{>b>}r9%@_ zk5!#xnh2I0ulhV_V(p2lE1-!LxvKAgCgz-~x(%8*dYbCDpozu#s)wP8ooA|^d={Q3 z1VDY(8Qhs)w$5bigQ)}6Pg%XsCo%BvE(1B8=#3T=c!%^P3$~h^;^)y zmLk<(m~6q)3sn0HabQp|;h(C12TiQE`XFdx(uI=kn{Q5ZNK&_qce`z#c`)=&LJ3pj zi&=6VzM4;)D~JXaPVf8)G#Q2MJ zvtKez1atnSdH|X@Wc9Dm#M%SpouA^TtQugZI0z4lH_FFv{nwYs*n`A>1E0(A}ADY;)RCOgZG5b2z&CtZ!TGekt6Dw~} zy&0OAbffC+|At2Z!CI>ifF=%GeHt_|cbPW13YwT%r@952823Nb??Dr@Z&Lj;G%@{V z)$!-z$yl(->I`UN>~hUMADUQcbsaRZ*XpOCiK(|pli+6#u|f$lu5r7fPYr+OFfk-Q zb8x(VbYqtScEbzHzvFf!*k|=Y(8Pte>IR$xP3*GzYG`8mZJK=_G_k?zSD}fq^_u+^ zG;yKT@r9UDFy(g5J{X$VWOY6?G4>A4{tq;<-0C}^iQQJe08LE1Q=4prCU#ow{{v5& zf}^V?+b`?DCj??gWW3W|J~JK^>c0`noMS#B4Zfei>^QBu zCFp35Bc+Hd(Acdrr=ZTn=o&S4o5ter3RjRR;X%^G`DV{{1*uqzt*RHWwHAa{EIO|^17+s^rx-~`@ z-^#i*8l$Vx*y|djbDm(`8ycf4(O8eh=!P`*rpD;v9%hb%Y2G;y&9uy z)7UzV(WSJp?rn|HHE8S|jnT!eWL=-e=qfe#uEyxbHTIsy=!&0a&-XP(H>k0GjnU;j z!@3VNM%S&e4>d-Y(ayS$G)C8|u>pcx*?6xb!lv)#^}q!ce-C`jILZ`BPNC)5a9(DUs$ER7)}VC2~BLWx(J$>@RDX<2TiQ7dIdDG z>}Ab<37VMjis}K=M6mf))xSU!2dv)dJbWiXu(VsV_l718Se;|C1-sU0b}2Nm;C0mv z(8RPiRKEmG?67(mnpoJQ*|F#2Fsfj}o2utS6DzGg6PnoamS$fKO|0t`?LQJ>JJ*JG zO;o=hd_AleL8f-G#POySVN(Uu-e#wb8*#-zv90Sut6!nq1tm;Pe1|3G8%Cwlpj}2S z*%u{DEoX`2WkD0$t^NlzF}_bGaJ*V*Vz#hDAnwa*U zHi^Cfn=06A^*m@|%KMsq3N*2fI`~Y2HdpMO?rrh%nZ(3U_?bjd#q6SpssqDMGA4%j zNygP!0;f*-Kv&jiRwg+AL)EWB6B9mBy$PCFVfD;^;%+NAX!YUH#Pm}F_U$!DrxgC@poP(1=o%pFo4dm)ZF2##94A2f0KM$JAMnmA;2DKs(XbItxA zG%;gX^%Ky<4r<^0Mvk^d>?*h1!?#{=OaLWJP5x3ljX*1IQoT(vZr*}fR__T-%(40q zXkra@aO{z`RP5A-ZSjG)an4@ z;X#gx5jn_VzCFg|e3=FPPC`HPrHB$ytu_>VCt{m_;i*Gh#kj8dFlb`Z&s_6)SK$je zk~At~*-ul0*BS+=U}lz7;KQ}W(8O}9o1lpe?2n&(LKE|T(bY`47{`#Qz@CU#qW4K#5)_|;CZz}umTdA|1UgeEplQvDG$ zF=n#r5oltG)eT?cRwr08MYDfJHZeC^b?m=!zZC46s(KG-V$yWg>CnW!7}eR(#NipL z&xIzAZ=?E3Xkz?K(ZMHSw3XY2*8gnQ9=IQw56P(77}_u^1tIg%TED1qhK6SCE>-!l zVWT1${oz^oVx{Amj-0xHOTce~p@}V4*J8oM!tHcB9)Kq1Y_IxxXkvPt>UGe>I;%H9 z6Ekz7_JT)aad6e~jzx@aAVC`~fF?Hn zPIU=1F>hDZOQDIqR^J6pY}ie+PnzyH#KJ_?9mpnT%vSv#G%@b?qJ8u6-IyfB>>k>+ zQ7fYHZ7lQg-PR#~eD@RDu}%6OI!oN8_@fApQ2YDB)(dsZ_@jG+yQ|rAry|JI#yz#u zMbN~)IjSq5i8aZpZ-FMZS^bdjI>ef}n%!)&1%;dvDbnpoz<^_DXTn5uBeQ z+5U~g`0l(|Uu@Z1QQJHI6NrpXh%9mow+|k_;?ayvYS;{?lY%BT%+nQ}2uB2ynwWZk>bIeZ&3{n+9W=3LzUsKk@S;kvAw%_hW4LJw<{zPYZ)6iQ zj#PaVG%+nx^;yuwd&Ex4X3J}dO7yD zU|pW-BxqvU>8cNhCN`X*`gGGour6Qq<)(>X`2yAT(8R1WRX+<&Ogl^UhtR~VvsF*I z0@;FT=cwKTnmBIt(a^;50?j@bnwa-D)&GSiW}d6M9-0{Ych!$V6VnP+uZ1S&{X_Mb z=`GlMp6Xr7@Hi;galYz9p^05Zsuw^L2QN^41vIhiLe+PfY{B+o)z3f^qyMG)U1(yD z)!#!CM=#dwS^vRXKEa_9)dxcpGcQq{3r$>psp^ZMi8ZCFYoLj_m#MxVnwW99>KCDj z(O0Pc44PQ@AJsoW6Vs|h`?3GUTcH1j)GOni?(?yD1LvDtZDmCmYnSm(cT=o+`C#^0 z>*6prB;%d#&#`zC@XfjgmxQtS%5c2Xy=Err9M4S1>0_=9gV1xKi3_V$XF(IQYgC^H zO)OrjdNDMy?K;)<(8S^ERX+wzOkJk>C1_&oO`?5sNRYNtlFxc%n)$7O2~pMCkojQP zyx7dF3wu<`c-G2k=Bwl%Vj4%m~=*xV$ALyKNn{s6;-%gH*yEeK+L{Hbs99W{8rVcKocu&Q(X#8?5kIO6ErdY z4%JUW6N~Ot{WdhQr$O~7G;#1Q)w9ZR(-Q2tTlGQE#IAc(p8-wGxli?F(8S&qqJtxx z*-are$haoz&ER6u=IAF~+yh~biDBpCH=Ah3Hn|V#EN?&)^O{wE0!=J>NcGRq#M*~d z?|K!!7$cb2qWS=6;;7XpK@*D~)$DVjiNjXcKoiR!)9go}iGx=6KojF1*X$pm6X~InS`}`6zQ&G(G7CH1>k_q$_S`-RdZF9wAdl z=g8{I-A?UESF5oXqs+kquMeBe%}wqMn?ipFO>BHo_4bSKI$W^kCDn&O6DwX-eH=7# z#OfkwV$*AyT?tK$?N;3gP3*V&?O*U~T*2Non!Os?#HQC(_nY2=Id7=`37S}G^&u5_ zL>BC^x)hpN|E4tY%|cRoLaLPUiVMthoQcrHO8yo9489G$46WFr;w@dz!_dU0wW_=bvrb1i3|DIfI)0 z6*Mt=z3S*Cc(Ep!Z}ra5#QM)PI|Z6pu|f5r(8Tf~)yF~;V>hb46q?v!^~2D_mMiYALl4KlpZ};$u1CKo@VQR{-PVgl(vB~PFO56(sGd5{T98iabIyc zYa(pBB=@>sPQu5KzEg!)_u|HWBNiiF*iGsj??4n%ws0!PI~$r?+-40F6 z`dYJxp@{=l|NdGWNfIpF%&jxORa+=TJLdi?_;uScsG#fFqM}WRw%Yx5U;Mh=@&1Mq z%EE89m_&%S+O3!ulvJ2mB-pMc=4^tk6Ku8n@VsDQccX-<@uQr@oM4RB5nJu9Fei?2 zyq8hJ)J|IhTOrh_C4D$wS#Y|ttwUkA;Cy9mlHZ|q&(GTrw+XXyI?jZ%35KUl`vMbE zCVs1bvU$~baV1!6_1VzG*zYv^R%l}R7&qVi_O?utYGfRBM<(Ojp#BS}=oDA_eONK- zj!m9vcFmUvvQ6y|I!jCq9hlVwrhmVgC7(Ps8u~e+rZ0 z#>274UFVt;9ZbhN6}rTT7=F_0--vE>`5Jr2JxuE83L|2fh?%di()DWWBNsY|(Utwo zwG3#CF8&wBKGqmrsm4BW@fOIx3+tq7`IU9SrhkYK)$o=fvsa3oa3A%`*yC=8*$rM9?6MTktFm*K$8aYf0^2QiP{vJB#dz}mI167f*ea54exB;*qH0WH zNnY4%Q`DvSbl+5M9oY-}KCCJX-kRWC12S%kx*F%N3d*()*|J(mZ_=^~mTesh%l?iv z_Du=bHX`GusJmPob2f|IIy61QEb?-c4NVWr#%0_Tb*-B$u>{$5X)nUNYa-wj=GDc z>}#H_+fl;Qe3m%g254frXnX+qD>Sjq>K(7gu@u36tB-^x#%&ia2Th8hiD_0ZgC-VP z{S-8@T{PDHJ~S~dj+=UAiQ`0XA5x->*SJ^5ns3P8j99X`42>-cVvi%1C9XhYl^QD& zSE;e}>6Pv9*8Jd{312-r*Wv@`Gj2&+8 ztl(s3=b?nDoh-qf0h-vnBRf3?n>#C{b{W^Z6*KS&lRtzQU4c}rcdrRzJKuoiimTU{ zt!os=nWWC~jz%G6OuQ_^@veX-c3Is7O>EqWi#D%)ZWp>&#`W&CQ}8t8cpFi|)cl=w zf=M^xrYl%$^&Dtom(|BW6JvMLCYM4JldN6|O{}5zt8w5{uq7?2;m5l{?~_*Hxyjez!2zA!C)hbdrhn#NrHRiD4{P z#wxdA(q9n^zVjh2dUlvo<=#EXyxlfm6`?DMh~cNBLEWIZB-t|7nRB$IiA&emu>Ys< zZ^F=g2}PWvZDJ_$Z^CqT2y_-WIBd2ww`WcC~`Wcvm>W-yuI!J0pA_!k@Xtk?Xbu_UUzPi1aN!~Ir=&~Q*ybRXhF|k{iW}6}wNZFg z?Re&Vdz_+>Q#sxT$DP!9J^Zsl&?$!Hhk)UUN4~6-t+}%6*o1Glu3%sM6le zCWa#SG1J-6l!bS*!>|g@-nzvq8iiVP6+dn_CA?uV)V%d7CWazc!E|=Ct0=%KID6cl zvM(HO2{dtF4tJ5cSJUQ8GEOl!jrVH0N{u}_ZGYU8%%8MT+?d8zP1_Cc^G%E{US`5s zvrNqKI|o=2yyC<^D1i$25aj zx41ElEtzIw=FVO$vvUbj}?Q_~)P5iEGo?`l-K@KQUdu#y&DJ$NLb==dvs2arx%GEN%Kep{;Tsn|cVA7`&Mi*RHX) z;Lm8zphuS`-KyMYrUozLcex2~_C>ZIz^TkrN8P?5HOPoFT23}M+;iG-Ik40)Rwg4( z);BpWJfY>p(2?!Fd9N2d8x8FjmW|3-; z3+u7_RzedK4^*9WGu|i*rX8fZ0Gc@V2h|Tj6U*m|_P4=-gG8Zp8LQmartB5|_;h0E z$ZLG_?MKJ^5#87&M@aD--0z74$vlm8?-*g0Kd2W6~spWx1!7}A|{BD%3l zFS|Kj3pBAPQ|JB;nwbA*)j9R}qYI`TrFsQ4G3GC-{oC=9Sg_V=^JqvMw)!k&6N`_L zCc#O_60<_elCjDiipKrX@$NwhQ#+4kiMgW7MbhA18S$tYZBB)59%YV@%o}8^au)}W z7Up^Q33015_Cxg1;iD}>DS+`WSnf)%1dGf$KSINoY#M{tnZ&%%AI zM5sc>V;=B#HB%3uf|+%H)kfpc#Dynu15KlTCW$@fu1P_oo$kapAjJ83+UO8y;sAB9 zqB@}l8IP%-j91qj`tTdW0SalNi)YQ zfF{l_QC$vAjQ+RiV87BXl;j=noD|#$?m-1Jo3!FN*leL(8AqaiHlMaT-rEQ=wfM5g zN%AiVsZhqRqF#5g75>%uOoGmrim#&H#5GaGQWPn;2r5d2h<} zJT2=n=l#d$=~z4$-7G=q?eE5s55efmxlM;f*lvlAL@f=k3bX)0rsiu&6>O4Fri@=l z<>IB6p3(KE0Ea6%%Ku}O+EmN;GtG;z7rCqWa3 zsr^0AaMkvUy~cfICJwaVniwcyYR1)ElPRH16?={Q?9AYt$@M5#o+qg-%hikWJ!s5Nx>?HB41L_v7>!S@flV@ySzeoee8YMGlJ#UsNNTv z*lG1y(8Q$0ntdfSvBK)xp^1Z5uYx9KF3~3MK@%IT9)%`mRZ6!1LyPNV2+>x%pPLIU zIo<*H<3=FCx+<1j6k)q1TJ1hI-+ard5iz;a6?S>t((Op<4d-cd#pvRzz-Ph{Q-lGXyCD>IH zxr_3vL+X^V+I>KG5nYZ{gt1^ZFq9~v$X(Pfu5-&Wvx~M4MeHKxbAgf5Nh^lzF50?C zchT9{Xcml01MH&zLKB;=3_-Hom}LYp0rs|reHiHvLAFWd}s>+2c8 z3l)*k*GoHmOMh_zPVfys$u)c*6Zy+ZvmR=d^vnolmw=OZKHSb-~`g_kYtM(B|u-~fW-o7tG%6j8OG6Wq3<%nN~l9Y+{MkA3_tGZ{~K)Sb^v0n?foOTkSR;gyY7CAe11X0U4{^u>;K^ z(K8V9CEb<tkE6lU=pj2ev720aIUZ1h(`nHG#&sYpK zNhtCeD^n)OmN9G@Y|_@Dh-WP3bAeK4Ryi?bpRp!JBA(QLz(%uI;yv7G^XSzgD;tw> zle;E(I5)9)$z(+s3s%2%D12nY4^JM#OLHkqEoCSYC6hjMcn;aaPz8ht9IgMd6DSH8-Oi>IixCdoH!>uB?q2Qlyu3X3LQf>Ht z@a1!J<+>JeqY*J2NN~IlFda9i;Xc_c$NL_dIC#J6goknC6RdAiodHdZUZMItXkw1l zbx0}{p6Va-b|$GZeUrZ#L* zLYpFX6RvO(l$d@@9bk#$H9`|J+jQf)po#NWs{RO?82z;BpP-2~z{Q9SPnrnjp; z1ezGTN_9RovBc_9Xkr(&pNhAlO+qa)cDS8$g0HXMiV~()JS!6fha+ec#df&&Cj>vk zdITj*?O=)Hy$VfCeIc?_Tt`SHGR|F>fbWL}lTZya)Tbe;^ykCsx$gy`W|UG@F!W(U z@b%q~u>?+?x>}atc+O+cf+bd`Kojd<y@`XU3_}ygySQloaWr~4q;VM+EStQo zx&7~k7&GU;qKz`3iHWbOz6hFFWc6ZbV*YEI{SY*9)ao8+qW`*Pe+Erl{)TF=6>la4 zQ+rhJ2~F&x_BRyZ8@@u7G9LT=&gPm#e?kFOgAE0@*|QL1lkzupj-}AVW~-Z_iG5bT z15J#3OPhQPO)RlG{t4W?1Pj(`_I}XBpO&s|^_3xg-Y6M$9RDB#YG3F!HWzfW$0o4ye6a7zA_dyfuK2<%n4Let`a!|CN z9AR_Cmi;;z@7l~wlKH6;S>*mQ1&84M6HrCRDibsN&G9ZplrxmA*9Ejd6Z=0?{U$VV z`3A1bd>l%fCw7s$Y6{NY;D3z@xVX-F*lvFbnvINvO=6^( zDGRpnF$6h7>}FlSThPShZ@7S;V7n!0NXA9(vT$GR(T-1^CAITg?Q|G4F>j2W%&#mG zz6+^C#$Ec%PYrO%3{)_)o)wOFH8gR+>Ia~SX+P++UC_izt2aOs`>pm@;XWgn`lB|P z4Na`DIs=;6XZ2ao#FU@3$raGVa;tBKCiYt00!>UF*Cww(6SJ)T0-9K6^{>#xl%KVU zIU+$EvpV5fyy_Or`9-r2g(fywy#SinWc3Zu#Drh9Njo$#*Xp03i8WU5{Tv>E1q&SW zp)39cU;gM9J1S$ndvWj?<jEz=(k!d2>W%bR_#PX?{-40ExoTmB{XvOKO zqgLa9rC^rTdqWd@sQr^8Y^B)EZp|cf%ee+Iy810+j`t*jY*QbjlfMZ~9G;=t>BN(P zVDmPr_k$)@1gDt{cJYbO#38G%fhN|QbD9MIy!)XQXR2Nc?Fcql{S!2?!|FLN;-#A4 zu+@KsCMIsDy|08O=34y_G%;a&$@brkunm&D*={NzniQ^mgJ)=UXLwf+GmOdVticFN0mxh~kd zBRiRg{zRdC8NZ5JdB0ocaa6j~;&8Btuk&6d;rwen(}i zNcbHU$2$@8uz&3DBIoIpCZjSYFLBKaQ}bmQs@{aKAh{BY4!#RBF~Tpkn5urs_GKDd zH8CPp_&FU`$5oZ->Q;Z^s?8HS_0Dba(IDQrpn{ocyK#Hogzei^_M6xx-npkA@E6~J7t3QP%_FFyk6};jSj8EdeGpFpM9hK;@cSOxL zoAi5BFmt(9n0=ZqR4!xUJ5jOWJ}sOO;Xd^aMKd;8xQFhDh0w%StFMD5rtGQNk3tj6 ztbPxg*hU?kjgYoZ?6J2-1vjKGQNhg7IouiM@{yTB`7&8_eE*Uqw zD<=hCkUt4Qre^G?otBtRg3$-CQyc7ZvAO$)c5~E54-a(y$B5BYXzU9UbG+%@I6Nn9 z^4ZSuGN6fZX*&6((8L0(Z-OSq9;n&RK@;n(-T+N(JxH^6ScB~q^#7px1ZZOIeAU-N z6B7?s-3d)xX!Xy~#B!^5dmS&51lz36f+jBiqxQZSnwWfu>ieLHZC1Zwnh3_FYxX!a zvDWHc-oWMv_F8>BG%@8+ZE__vvCHcFpo#H^X?7&*;H{96|qZZL%LU zvBc_Ap^0Ty{~MavX7w%j1{-nA>KbGd8#8puhoOlHN2p#4P3*GzD`;ZIpEP^co4C6O zj$3^gG_mPO%|08N=x3^~h9(wM`|j6x11Xd#<0*54kJIi!0TW~YtbJaCCiYwXB{Z?( zD9w&}3omH}{lBQ*3!2z!_0iD8v@Fd&7n;~c?N`AT3YE*aee2|4?e`RJNc@i|SPc*)z9$|CDZg%esCcg|Zx{57hj`tvfY*P_@1s@ykc<(_In?z&F zy>++^3l3Pl4>Zv~UYB|XG%>^KYoUn+R?kJN3A{*npl3SW}gjBY_zIo1{+1GlO8S)s4s|7M-TqJ0hDn|8&($p@}tCk3tjU&d}^)XkxR~ zA3zgJ^ELaV7`)jN?6$fCnwYylv(uo7!&cu9O>8?;vuDr1!=GTxS*mNGiFH={(8QF5 zn*DER;+WN6Kohgi*6hQ#!TuKPv-)*p6HCs~?3MUi60`nK^{r?^thd_P7LRIzDFvGS zUt|-zt^ORE*z`BeJ`GKX<5sVNCf1y**@rUGe>HmeVwi9fMm*7=(KG_r|9Rwp5w*iod}H$oHRE>JxNO>DIK z5@=%PKQ;RkXky}ps!!YwuVMvDtbPKT=of4DLD0lTs~ez+ z|GzYQGnx>WU#xl<*~I!1)eoUJam4EAckxz9u>0SdeIv4og_o%Q9kPiTm#RK24$nw} zbyk-`6BA1{I|-WDZgl}PvF-XBvE>#k6JveCpc)&GLVkq+}5>@2ss7Md9UAI&yj z$s*=j{SdN=V^*(%CT9Ovn|ugO9I<*6G%@i?&7SriHeN8(>OG)|WmacE6T7VbCp5A5 zYU%A?V{Cay{W8uS*a_ce3qomEg`sR2=ML|bh`r?9g)%l7VKaOM7n+!|NZ0=qG%Fv^4$A&G~Y2Xp~h>%#9#gadcdq-crG@doA~R#tM3FJQ}rDrB5n zyHoJvis<)oXj@!HwKnR*4^4@URwp2vIB503(8QXh+9VH}IA(P*G_m|T&8~zdc3S-q zG;!>DZqnr$juS7GCu8Djd?V1mJ|dDSk@V;B%YFZW--sNBzoYr*y=E3A>4i7wqBcVl zTda=n$7^@N^cyvMJ~Xk>>c2u0U$$VO_ae$B z*=*)`YoLh*Rr*k<)9(8S8++^iDVaY@R%DYV;n zM&Unxl_?Mvce8|Eikjv4@$>N(dO{>~dvho!C@PWeWioEBMH3@ok>lNosko+bUEAxh zjY1tVPJL~jIq}JFMea+%_cpN0cl{8XBnZ$!S{#~fhAkEsx3lbGAs ztN^xEn)I+)uW7dQw<15Mn76|CH6ns+5?{||Ya?u&*n0Q$?HvCzM4Dw%Um`Q^^UVVh zj({V`Cb4(2nR#PPTc*u!4^CLP>i`~K=fJlcVfce0LSwgwq0H2&_-#1?y;74S zff+S!Lime|I5CWvZdqn^{&lEhqk5Sub3bXwK(Pe=e5v$H6TyJ?b9}S-F$u@W=0+@@ zp=b%2#fPh)VUbw{{(1MKA@^G{_aDx015M1Z`Xgv!E43f{F;Xq__rbh zayuwMkWCsJ_@`S2n=Mo*Xq?~6U|9{Y7wFF8^eq+axWrv zV*Gn0@>las#WqA}nzo3n@g1l5zA$%8#xqXBhj~Fwx~wNd#xqPe$6JebTxxSuSPWh8 zqw5eG9}w+VM%ZYv({J@n*!v!hnAyw zV!`98zkw#UwyK`~8Sc7*Nl&Vt15IqT`c#uGIBxZY(8SKCw8>IvVn&&4=B#p{=Mt1Psg`$JzNL{%vT5utif>=lL_&wRv5 zH_UnP?T^oK`w`6S(%p9iG_ls|5@=$N)y>evg|BLp)zFHssUCoK1naE+9-25{^_(wo zP+qX3TbmpOO>9`Bx&WG3{<`Skduk~{MKa#%{v3W!?K+e&wT&fsp$ttddP67p5SrLw z^^U_>j^O+r&Hf`avBv6)poxiZa+L?*N4&Hhl050xX@7A1Q`3GU^6rc|xLG+~6`HZh zLTQEv^jo2cS#Rlz9)u>=u2ua4G_g~(>-WOmAoP%olSX4)Gwo-HG1Ko28)4eXU*hf} zSS};7_k>nl$1To^usxEz*qyz->!0--kt4qKJjcJ}w<14z=6h6_=LSR_>EEOCoVPb( zLOC)XvBo_B8{##if|;3b>kjFHCRT{X<_$m-op&^Q%uFlTOzoS^D-tS`aj`p7Hg94i z+`R2JZC!K3&z^Ze$72758v^?eNk^nCPdeJiqwrB*))O>DOM4QS$k)kDz4;rF@crhbJt$wIv{&V6aS;5U4GAjZsv zAF^VPgK+uB{*d})%-q?0CCz-1uKt5C(j{Z&uE7)Z!Dz)6wbBZ^As3oh@-b)F6aVS` zD5P;2=dMpOKZ-X~P_++)DG1?LT0y8+RJ8P(yD=%)60?=;-@|zv?_y|T&L=WG4uU`v z2dRDYm_=J5cGBC^IJq%4OwR)Qo{G|nZtWJU^<_~J` zbE9#46l}FRc`+{AA(*vZvkyTNV$x@-&xI!DiN;^-dT8SO4U+AfU;NQFN%DfON#;}y z<`;idJzIwEL$6^`Dbg#f!Y8qavH!?M&SQQfNIT4mC-paiRPjS$!GbVke%iNORJ8P3 z@XRC}CiczG2dR1)3aW7WQ!If~XMD~jm}a!eVi&w0{>7wGK03madH&c};YM~9`xVPiY!#wQY#CaU=uh7I%t5@Ue zH^kg8b+LuWCYDqCPd@HACktI9<5^vacqnkZCR8x9nH7%r95k_LllJd{CiYsr0h*Zd zm1d7a6N{|gbu*d>W{qg}pP-4QU#ngSO&qiO3TR^HX3f3H=6w#wBo4h zA!tW1$LgqW@W>)qVfAciVyD#^(8TO-rMI8E8XsW@rOG(>4fEY&$NM`fm^uC(E6lOL zddX~*@r|u7W4VMY6lF@F%RuS0-?@-LaCWSw7zni~Qicq$UbH~C9ah`(;W>&BQKWBs{ zMvv>J-2_c6wE9ugM6lE9E@)!xFWSVseJ`w$F{_`4CdNNsq&9Ovr` z{sqlw)5K1yVY96wZ1y0Uu}SU>-Hzn%@nj^}VD*vE#1eBN)!?6Z8Z^=0R&_ZvG0W;_ zpoz6s4?q)pt=?%2&rgDN=Ca1-U$C{bNn$76%B|fh!mT|B&Ddms%^YuA+_{K#Gb87q zO%*%oF3z!4gma|h+8b=r%Vu~j0!@tFPWO>{A|Mu8ePS-oxGLCW^~Q}j9R_iGZSr|K z_K9FSb+C_UbHq+s#`SL%;re^fj7`ep!a4A0ejIiku~IZ1GR}i0rtc8B>uCEVc~TRn z-YUYW_s6?1HtE@-8EvuHNzb#{RuMMa7R}fsc9!m|Wmqt=-0Ib4^8}N2)a>t|i3L_4 z_5+Sh3wBz4H8e3XUYk4uO{};2Lug{t&fIn8$%3|5lB?Zi`{U;0Px=vWX~e}zMYVg! z{^pR~JjBw)Rcb7(GqL63IFs~ryb}nZoyO*Mbawvf%cf;08 zNtf7a_t{i@er7_6qHJiT`G_zK_Dhi6BI*XW3Was}C~XA}Nl3I{S1!Yx+AaQfA@$1` zd1^ODGIL~P%+%$HTR0(RP6k{K1FP{`XXc#Tdlqknwax@o$?82Vv*JF zLK91qH2Vi=V%nane?N{R)q>?#9|KM7nxon0Llg7os$K?79JG2BG%+qkvV*tEw3&N_ zcEN~06SqL~R+*}J%aD2FOXcq^Ro|FXEd?jXp-R~@WZqy?EoUg4%e?WW8fPeIh%<9z z;aqUWKDwFa!&qXk)kDZ8cFf~unmcZr5N)+vzW+4b)x4=c<3_~PeRYC8p&h{seT%oSb3mmzYjJ=C|AZ~pFa=}d-&WJ zF=mdk0zatw1+St7i~hhyd&8C;6jGgxgHh$?cb$0kiy%{*Sc3EQLlX<hG8<&PF={BdzLSY{igTpm#;8wC%<)#4b|QP(4mTEP zV*MeJv()`Dq$U~HM^(7NZ%Ted2~!&nWr;b12W_7;I=10JoWazbz++;BC-5*;%&tfe zd!Z^NteO~M)y}`-K~`oil@V3JZaV}quBzfNS)JpZ3{7ma`a)=8#o?NLqsbN=wYn3U znD{4d`K?7b1Mm?c^~ktBsupKl$8P@?B}~mZQYSd)2;9sC`>Zxcj)*Cln!R>goH|yp z-0EF%VlQH^)#=d0ajQ>*CT9IvdoOCi6%+-#t-b=;#JHn0`$1@8zSVC+6O*$fJ2-)1 zy(G2B*z3OSnFC?wIb=Xw%3s0?6EiPRenGc|;)XT$j<-*ET!W!<39WSJ9gJNaT$D3G zCQp*F*L}ys7wybRbSH**s`_9$=5z6;F8CJOZm#E0cIlR#9AWcxs?Fw@q~p~f$kfWC zxid`3xTMC3T^IFXR8aB^f=taih9&DGtS@$5)UQ#&?R>i^&tYobu`DqM*lD|^WYis; zWDWp$hoOY2b;q;h?-AC?4(+JBVlqAo_U}QAE@8_UPBV!h+mxIj?eH-)KKmjLQU?d5 z8iZP8>~$ZA3cl!&h7zWx=Wt>B;qs^JC3UvgQFp`SKbQ~0E=CDcqfgYyZ-*u>r1rm^ z>^f70{w(9D`_|+GO{YKOuE^A8mN=d{QcG<8t4`30yCSjTB-L3vyAClYSM~c?4srBk z)jvWL8&6TaqwhJyyi--5je97uK2P-@kxd-6dJ$GaOgl}p^N~#~rVf6&O`9$D*qfpf z&8_7ER4}uK6^>U4O{_UX`#)&3U~azZvXk)|U$DmN*G;xy$pXz@4^50eOZCst#N`V` z`{rG2t|TRjeZegZZs|Ks@*HL^KbsZiUGkV@ri*2T`FTDwJ6VB?$)l0tIc#K-Y5OJl z*y^a=&2BSadT=DOlNFAaWf}=~TYV}taop-Fp^3x)r#oT=G%=|l)Ob@p08MNajg`!r z>^a0Cn|%~CasGMSq)Q@f$=^czntT5wJf8T=5TlF!dt}Ui7@>Aax1o0@nKL!`re~?- z4{BXg@X3woNmup{_B64eXKG=nY$)uBZ#$rn%WmWH@taO)Vu#hAK@-c*4|`(Q{0dF1 zv^seT9)<<$F3@aq1|?$NKUJTAY+{qu7eW(ztTt!cC+1wJP3}N8vC``I%}NAIi#2;n zH1?=qx7C@@#Kem<`zmN+uGJ4f6Pv9544OD#^`28bhuHWp?R^3?am4DYp^51iYxWD! z#7e89reP}ud#$cJ8?Q+Pqf4Yo@K{AVD$%u3OQ#0EHU1MiF*SuHj`ufcVujV$LKAze z?tmsHU!sfu44RmDnd&Liv3CWNt)2%>OttzHXkxw9CD6nst8a%Urd+O5u7V~OQ~TyI ziZ)y9+NhhcV}gA)F(eOE_?{KIu}jJoI!ROv+6m6LdUt4Ih1JJE6Pv6qf>tck-nGz< zV2ssILKEYx{t}wlVfC~bxK9h_{zrSyg(l|wSM^_@i33)f#~-49m1GAGJ(*XAR9ha7 zuesqvk7pjvnA*q^$1BDJ#Ad6_366+^Rxd#|am4ETp@~gbb2;WUBWyAiPy%ud-o7VV@>3EScIE;O;= z2A%v0XkzLz)h|LT{*P-iyCSVFq)ZvVa9?+~#hOfvt~4T+Xx8)t+BwoD? zf;qRS&VVLn)pPP-18xl|_O@_**8Mj4ZH(Eosp5Jk#LO|R4C%sdrY<<9^-oMiS;nax z&m1c!c3N$Y@)DbF*Y)0vCdA?f)hnTiHCDd`O)S1kvnOwdY{3qzQ=o~lcWd@>(8L_8 z7ef;}tZp<-1mo_}ChMVz6;@B*9*^yUjaL5=n%HUeKcR_ZRxg1j#y9GeuR;^^t=_y+16Q27fM3unM&l;jiWaz3X=IUXlii*=*R5Jw)9q&slfv%EE zz;)_&!0R``QLE2~CN6wX7VLN{powi(ACF5)5lfpRH?K&jM8-SZ72&lfS1fTIrlvd; zS&}3~`>Fd$toZ?{w-J+5mOT<#k}Z@g34NXk3 z`ax)7n$_ltbHqOC;JP%lbz;No(u5aT6U7314Vlgf5xs_tXRbZN{Org0=QGz{n=eGm z8qZuqhO%Xgl6oQ9O>TJk7_aFGTvbJa<6D#rO|aj%|H4nw@O*|zm>K`L{wZ3v!55kZ zv#nl(y+|Cj`d3_0o;c9TjWhSh9-%%NuXQ(1-d^sjbp0CpX0rK?t*N79w`<+e$-!r? zpJN4-$xlX36)O}kgjji)>kR(_l9anL!`!-&f zVVC~(bbRAm3Yuhuo)(YiR>2ml_l736S$!NdvBT;zXkwSucR>?-tbPWX*k^SwG;zS{ z5oqF&)!XcZyS8BFQ+f;83z|4=btW`1uT8VhgeEpyy#$)r@HGFL=3^k*AxU25E-^o( z_szSK5pk(2!wM5S0Rw}3?we~TWQZ%%Se1JaVu`4utBZ)4zlhm~dC!MEOJrP%zX(nb zYIfqp5O?B<_`t1Q(wkoh%a^*frp$a6$55Swj%`W9yCw4p9wWU{%+KN)5MwqQqDuc_ zzU+lK8J7mXRL5T|erJ4qAhM`ac9rAp4NXjZQT0M-Vx85unI?kKFKPC3(8MgOzk?<& zxB7@(aI{#k(dz#|69+}(XzQcU#I~1ZN`Gy;<17>^lJP3H*UL0F&h;o^YUwMw%Gd-P z%@Z89`j61Wg|BM%LTF;I)s@i1tk*QV1)A7x_1n-Kois7)a+JhV#Zsd{g(6bjWr?KtK5UVKamZ zWxNXSMT3WhyG)75PL?>{FtlQ?F7*$);oYfVI<@~^R+Qrk&6V*g_ZK(W{Am}XgsDR; zalF;g#I|)@YFwh{94vH$jO*M}%%hRnA5<$fbWCu@;~bQ+N%z~j+Qrbs)^}8|f+oiF zsoo4tEUE3%J-CU$?Vx(J#$`km-t6H_;bR4Ze|KJ&i`Lm4tg z>@$Bf4CTofvCpX57_$3}D*M~8I%1zuH8EuOS)8mlN5+VKM%BWQ?6Z5Yx!lZgZm#3K zYj%#H|9!Xy?6c@SaDx)8vwA;hV)BoY9qhBhv5;D1JpQrW&G|RX-#+JuFjOPs@lWq= zUYwf{)d)lFy9cNLFT_0T-^O|HTUKad?YJ(s3!0etv+A#*i5v(!w-Rk?*SWPH-S*AI?t{(usumfKGI%)v*Xf^Am+A2hKfntR8*Rvwq6c(H5T z)%e9Xw)cN1VQTR-mYA2&v^`q#&{Xp%XD*S{Gd0W{m2r)`a_SxuqjRL2i5+I9T8XJR zMNSN->W6Kd9@2=6$3A&b@TYT}9lLo3@#e?UIEGWL)FkHl6M0Dk5S*yD_w5n+~>fytuh|G8T;9p0nIn zgExoUg_J4d8u$KbJK(otX3@ps>NNJ?wBQ4v!_baxy4cR~7C;mG<75^b9)%_@-$C`W z(8Qiuk!$jWl4M-tE}qUc(dBEbYI?Ay4QR(UgFEUhNqgZ{zhG;;>TGCY{Z6VYp^3xP z{>lj3FZO-+HrE_}_P#)nshPWIr|tH}aRR{#s}F=G_9sZTKX?UhAwnH89{3N`>lV3>WL)jSyAm79q#`T?(cbmmQp-9b1PN6VSv4s~18OJ4NGRbQv^p-0GL1 ziA^b7sQDB&d#{iRWbAccm~<5GlRu#%eeW>lOGU5ydhoTGqHCM2E#s(r>m+kD(0q|F>)p z4h>_;hy6ci=L4VDc)$PiJkM$S^qL`@J=O{ys=X`8hvLADh^ zXc5yAmJtLQK}S&*1Vu_v1VLnp!I~eJX?PC_9N`%O@Um;%X z3Si0hBbDhDJW<+4C5opeeY|kfJZw7BG;3wl>?^%kJF>|??H9_HgR2LQ9%boZ0fLWo?;^A%Fv zhD|#Y)Uh3m)cX6fuuih%U)l&`JIJKF66utt;#j7`#S>u3_5z3B1eR<&-eI!_NoM}a zVYAXnHiUQxNhAkOpto;^R&*nsJ0oqelQ0G5T^M5h3ATOkk&^#l%H7Ru&V2Kb_7J^m z*blY`u>)W;k2HuiINQ^)$*^6yGb$nLcDAQtdz$fDdmk>$5>7f%#cxQUb%mC$jGPrb zOS&s?@EBX>s3qu{0|v3zH{FM>rju!+rf zw#OpDf!cBes{2XvRYt~1c&?wW>s-j@$WEs6TM#1G%rh8*SL6aqt`YW4Cebp|m63;{ zDJIhpLgd=AK%JXuX`pIkyE3vN8qEKn?t_gWVcuB^F};ZPyO2xlRk8ySBG=}#UA<=l zOO`Ek_!3~r;YALw0hTOWtbQYS#`;@29YFee^zAVRn+K*pLx^1aD_o}JpJT>TX8uN* zc1NbYsrF_2di0Ai2Sohi{)6et$PMGM*EILAMn+v3xiR?IGAb|+#;c1Ob%oz}paRLk zC9bebft_6Ha4WD!nHl2Gfh8+LoR*2>Ys%&j&jXfBuhc}}lt72+9Qn&nj5%g(^2}0% z7ke34vO2_H154I~_^10~N-5Wc_#j{>m$@lD5!jk>ycmlb4={<|N5QT?)--acFM3!G(zMYBkVqd|it~0A# zWjpVOSwq==USegXq!nyGh?cXmkrq{U*j1jlhTaX#g(y^JZiC2DOUp0UY`3+&4I)cB zV|5$kG~|=F@*&DjPXP*7!CB|K>8S#iti9j|(?h2UwjV?vHm~;{#QOqE zc8B-`V9B!Iy4*{FCA%)tAl8Cr{m!b{Y_E!39WlqL=2lJr@9DYRwpT?~o1H*l%e~OD zS!}Pu9V^*pvxhRaS7ASeeV7+(M2G6W=wc@KV(Wk<8$ZYfF(0lI`2kc$=O#D`%hw|O6kGQmu<<~E%6pWv*8{(#Rv>S;1ofmlCKk2kJ>Dw~aZQ09jC0AR`d5T6b#*&5;tfhDW|=!*O^uw==fRHQk*8<10jrT#xA z;@md4;F?ENB-1}9W}8K;6Ume$_X!>G*Z#wiuoYfK8t9n_ZEQA(7<9TQm^nmtm!J%5Svv)ZhSiQj_{W6g2%-tI}_?ZM-YEp0Na` zKB57cI)b;x8I#bEOs|efLIuVYXL@xL|J#@?%*d>UO>9^tc(Lb!CH>o38GiT#EZKFZ z3SNp;VkMpG*~TBk4`)5!q|d&?I(D&*ua99r>cuh+!9I^k*8Ew?%+!kxHCq}V@NqTA zi_JrXJbUg|gt^Et#Q3RqS!!P(Z+@{?MAG0aDX7aV>>@3)1h1AiFC?(s=JV9AsacOHqKZd1+<@p^bmw%?;^Fhkf!r$M&yOUC1r*uMa`Xoad65Wj3Z zuEBe;0VGqBntPSZ%xpvL{-7VT9Az`dY_{sB z3;ig6-b3ui!_y8p`k*XY=kRX8l9L{FI1gAdqm|fyq&nhg9i3|JM ze@D_LmXu(_^&u~|7?Y++TB}LJ=RMJvWa?vXAnM>P*%sopz>>|6JMTAuCA*(+_zPgk z-Vjee3}>K}10kLZEIAb7)xeTvZOrZ8a15S|r^;np@aP`qf^O_-M96d2lZg?c4T^Yn z4>R6FNG8-R(}q2Qi&pSnt+`gkNb0{PNp zqHCoK+3g6N!cpb1-5mYI51#8f0!F!3JfmLBQG#d_L%xaL8rcOym52AdbdmKs+ij6x zzcd@^l%}mi=}ZO9Oy0$IbM(TP*>oD4*wklj#OCP5&L)=bY%82Chpfig>SAU$Z*s08 zTjOlkI$IlAx3gUz3u6lr3+n zU{h80>sB?AeiQvUr+%cxRkZ}kl%%K2^>Hn*WYt^h!>mf8(@3${n{RFftC?7qv)$%w zxnzaTX1~=HdlX%%i(wiu@oxf4R=@2E8w8dd4sp_v@TOe;j`L0jmQ3z;_!wZxst{ia zESdDK^S%jKvRT-lf~{gERW93aqTAwkZDxBp(lY+7-OL$Ru)Qpyca@9UZaXu(|NI1A zAW1gB7Wm}tBc9}}zqzU&L{*aAA#MkjEc?6jeg{}`Qjf#ts86yX#O5GPvgkeM{Uwq} zmV|h_qhg+9d5F!I+ax#sgGqv~w&hYav*lOYVuv7+JmViIV*2ZN#RENCdo4ZkNG$EX zu?&;=^bagv?2ZX|c8jRer80LWMN3HaotIysb9v@`yx#_v93CR}jq|#%tV;gcwwt3@_*m2fTOHYevt46;6&l#Y z(wJ>?^csIR*vzsgmY-n5MS~!&o~*^$!v4h8Ih)NH)Je8J!Dene$HwJh(?QtzZ#Tue z154&^cKAqO$!Xs>d?v7DXNWH|NhntiJMTMzB}=|__&H$7wh(UumdyIjc~3YRM{<IvGGWUDueI&5t+7QnLmQ43jFdpVF_FG`dsu14*ESVWi34Gzb9$2zE#2)}lt`G5; zV{n#7nG$nJb_JHK4skxPWZZY&=K@QnhxmG6$qwP*Xl*%FGuzG4gM)9}twV%7XN_V0 zU=!|BrLj%D(7cZl7mX1i&t^s7?FPV-+cy5FxsZknT&8b& z_AA1ReF`i&6yh!Oabia~ZKBPDQ=0>TC38Yt0xVe?;wyk9YeW1Xuw*+i3fu%NnLddV z;qP=T%BIs)(l??vnRnYAb1+^wI?9A;#b4|w#3{=ZyAdc17pN;^b6b8gUj|WeV9|oI} zq;IKY=CrVvo=K!_k%wmlFU30#A#%-E2p$6kmRug<$ABeg{lraMH?U-9h`#}rEZWL> zZ+9Gy8z}ojJQG-QIK(-?PHydz%mVf(D?>aRSh8>%jllWO;iczvYGXV8`zg5D`}F&f z(UzO1nA<`A1;{l(?=Y{fNbB*tx5>%Bu3)hj!s?`r3Jpz{O39-2%ESa>en})OCE!nbNVzHuabRK{E z6x^^kLpaL9VvSASY0NeL4pXdu+BiHXN3>j~JEsJPzO^X9bv-Sy1kqtd+>(S7Ez`{? z3rjHbUf$)~+g#&sOX9pAWnt8xQ9%Q}I~CQO6g=S74x7iSN_KGL_6e|L=g%D8;&`kC zlv8(fI0IO+BE%)Yl5HX0rVvj%QYNLiB$vTkvTY|~|H8?5K$%WmY?JPqu#Jap)-8yT zXO|+p*k)XXmz+ACiM&{=DUz~mXXQ5|Dq2eG_|=*Zqbv#YLEfE;x?b~Pl!a06q5_{i zXR{sOVCTayY^uuNC9yiu{)63cd)0h!dz3{V++KxbN;05i*f9Z1R_^NN=JUXk z!y*0ISi*jX%_W_oiy1Vl(0G6x|aVfB5>K@K}Ik03)h_3^d zjPL2Z*8oeFgm^u$WOIoB4lLOp;z3}^%ygG~i$Wa2QdWg{IQ$;J@B4J=tYlS%wd*bEQRDU~$owcv~C zu`dxJ&&mu%m@P{iJv$U}$M|#)Tb79@V(Fr1(%!Dn-GC+2_i^|TV9A=FC*~JzqI1#; zyX7iEgghHEU7`wL$)OPc30N|3U+4WKuw?oE>h@#MCOS3lXKB1MINCCI0`urNi*5Y* zIJTw1O+uj}nKs6gXeuRAH}SX3-9Y@b;v^j9)0T9gN-*~iJ4m~f?CtSeAz1+edWrh7 zSY7XU+~)9N7sI9`vy}|LdpHCix1($c@y+m-tUZ`rd$C7>ojlaxjldpd;St3Cemzk~ zm(!Z`#JC+i|DW*BCXr?GN_<`t({KYWVD`~Atf*(l?E{nf#9CdBP2bHn>Gg3xgK1Yh zf}MMqHI=hX`ujL@Il;VwS*S5IVT1!y(&08Lmu=FUmROYb_ zrVFFI&B-{bBO71~ya%vk&r!BR&;I~N;;Fe-4Y5snFmCQjneK(skF+i@O@YZo3FR>2fh9{rY#z*zYzwh@EJHFW&m}Q8|0PR8d=_#` z)`WODuw?DgE=e7*Wc(P18-OKSLfir@nf6QPy$)D1Bg7kkCA&lX7O-SdzDx1}u;lDx z9sUwna$|^tA5T)o3!HbP2z67IhIj_BWLJof2bRp5Ws~51_*`Jg7GliHn}H?Ej(1&d z0G4bZMv||9B{zn6+f#69kuv@(*X5zWlI0;T1(wV{!F9P3ShA5AT|NpdIUM4@0ZUFg zkxBfO|G;54ohl10t*DF4^f0CVuW<}S&s;^|XP>~5)gk^huw)N0s<{MMa`+_M0q~u` zlIu@qHF$Fkuw>P#^!C33EiJODi*3c*<~5#v(y5qtM8l_8mx_0y6C=L)SkVwI>9SlJ z1euQ_2~{SVf)6~&l1oeYVWd$O`(Y&CeBW2z$~WfeiFjTIAM1jxhMCr>uR2$TkgMI8 zf-+>;II4_MmV`3ot$Zv49|XWaW&YX@P$%1pe?-UQXQ^c{3C-r9S9};9XUDLQ&PlQ~ zMkipp%oqx}AY%%OmnDrs;TVpxBor@iBlA5np>GpRwgg%3p(Xq#*(i%EVKYil*Oe*(FL|Gh z<3q~kxrvp%N4ghj#T8M!*)6C{=$ZtRtxT39X$dPEWpS02q6BqaHBTj&uf1(zmR(M_ zwBp~vL+s}Ja6$+F&~zZ|y9mli1G`gQL^&)C7q60$H7K{=)*qQb>QJWEUG|{onbl^0Y zcAnvRzae_XnX<=Y^@U~i2+M9A!Rz_((a1SC72~v&X_~y)&cKrEgo9g9qN_-MUORS2 z53}iTM98yokp}0w>A0vz&n`tg;Rg{#h;W{Z8R5m20DF{$OO)ua47?VQw2SR`(O*x& zl$-Odz6$G@{2SYT7d?AhnuKPBrh{O5(Z_pxi7G=APF?XObd;d3SE>Z;UV$Ztg@Zv^ zL)FE0FnW7*E0d`WA#$x)YHI^F%Z%i@5O={_awxxX5>Pf~ku6vY#A}pSl0} zKUfYyVfHUpf$mh+@^eyzR{}eEF0pTJKK_YLFS5NfIx`tju@*#l^qi##9P$H8HiWnX zSkkX@-F^csnHSyVJORJRF{j`oE&kukJJ^xTgegh>@084hh^CSIZOj4s{UhH#V$&}^n16#+_vD=`WeUZZ%z>@1jyZ~4- z<6`H1E3jmXu)jWm){$OtQEVdK697vUi7Z>JjA8qa;hQ)Qr`t4^*SJ1%fF(Oad>*i5 z)+NsSa$w1d5Z?eSS$L`Qz8hGwGsMrE+>~9HIq$y%OJ>(P94p1iIpr#0|4TgJv~mQU zvv!N^?P@d1(iPj+!(VJ4BvX>s%h^Y;rHWInV>{=uc!u3j$x=j1xS<+p(S|DaGP+Uv zk}KS#oHjq^Nj9xe@2@_FAC%E4gLKZEt+A(h2mT_BvS2bWA$e!u5-w5cN~ZE+w*yP2 zT}AAF4mw1qNmp7r=Z+Xw(ct~`c|^4`UFu`YZeCAcF~Z_rPoH!qu23<5&DH8BAGC?I zi|w2bqPwG?vti1m<8rohJo6X32qxudsbeneGl3=J*Esw;0WDDnni$w}9_ z-1h)W&I)lquw+k&e|i?Wr0l<*N&FcJG>vpcq<5Q{cBxZ9XnHV-A5%!8w@g~>aQzoK z)kA8%EB9Pr$)p=pz}^qy$~2v-*w#i~NWwjQ^ERE4rmG`I@8@Ar{pt~1ilBS93wtq% zA9xvQx<0bs{wB=yHca+2ZRC_zP|@r2fg8irCghZr?HowmC=O*S$AcTN&Hh$m3h?1)F)< zPBU5l&DN(j^5m9r=IkX)Zj^2PmU*xxm*XxZnSYCH&uzJjO*z^$JHuml8|hwptHNNh zQ_w-=-6qq!!4zD%GhW+A*5z!sZ;712Yk$OsoULigV`vjg<}lVq*1I^dEN6Sy*~E&R zt$WL(nNzIF*@Dr;OSdsBnqRYSw-bSF%g?XJ`w%JXgo8b|=t|Ps$ZeDN;}I{BOmpn6 z+i(0mcK9QbnXp4Kin0Arfa{@|1^8cA;zw_HT2;-qHuB}99qq7>G|g!mi$%r@3LK)l z$7Cjq>;Fg-3&c%G6e0iQKdXpiA4g7R$#mK7Ng9Wqj4g+3xwEZvwv}WZ&bHpzuo?U{ zzVOU0X0gTk^BYtknQ^x&SPhzdmsNFak2`pb9fYhAhFNuEw?hwJtQ}Fx(XCuwYyjBF zd(_4Fg&|F9vGnQ4UFL;KUTilQJ-SvX#EZ=XcJf|k@?tj{Z_2t5zXU9qa-Z|w3@lkD z?C-t^hm2IS*dF(Ibdss205*B9UBg6vC1?jdlSr?RY`3?GXo5|i>3>ng2cVOvrn0?0 za*w%;ilhI<*z6JZD+E7<1D4FYpP8_029})qfWr>~OXdsvZzRx6((5CaMDYb#e9oc* zTYthHh2RzEz><|~T?ZzWWHT|AqBG$wnf0Laz6DrvV~Ae^mMnY7dB=Z)VW#W}aXPSM z%EQk41YpVaAzlD1S@;OO{i{IJsq)xf9oc7$hXHsTHhB&!!i#xJa506l`BB&H{=kyM zAwI)+Qw}_?ZjT&~=lA|eTSs&o+SZfJ zVoz5`UJK&tQN=p4HfLKOJrr@qCf4q3&jfD+jIDuDWp}hCmM@z3gr$?Wz@Yir*y@Q) zqW|QdOr)iaq&?B%#hyYZN?!XUJHcx!fF@a>1F+;!h@S(N z%zD~+_XA62uO|*hy^>BnY-?ionVSV(Y)U1z4|J_yYYuIIB~zYp9hf`2lAR$w1>TZ5 z&pPjOfF(PG{i{G5sMfO0zC1S0RI>&)c~(E?5_JGe4hj1oCeU`$Z1ZO0;L4f&WjO@- z@fZ6ZQOZ&MLP`LEXD&k*lxsqq2P~P|;k?U%C5wn7{xzVxP#wnhqUh^!Y{k9ULomv< zLz(>KEWBHVs@;Wr8V|P5uOURPDKEOtKLVDl6%I0q){tHl{Wxxp<756gSQZHjUvin! zfh9{`A@&PFZ>Q5EY%hvl5;d!Vv8~={J^#%1qUfsVPfai7Fe*)p(&0iduw>P%>gDiV z@S9pX^|O5<@?10(y_oZdGI}cFiAZ~t$3-JeJb%FAgP!ESMm>44XMrWlUsD0sS9;#R z=ro4(iO5UQDJbCc2G0}Q+u1sz2bszI2I-V$olEz7q+3bV=t3@vO)w$J=VAj!*vA%Y z*`dIa@i$eNxfGxEx>aRtuf{iZwnkybwvw#X***5qOI z2E+V_ROon_{$y|eJdBLWpZ>o3G3R@E?^#vOc2i_ye0MGhE6FxG+w1XNJ&f(UNaxc0 zBL&F(#m1bEO&H}$;ou5&Ayp~cO_2rLn23E4;XHd&Ocwmber*y_=6sM6K;R33C2K=` zH?U+IF_yhIfhDUyWfH%-4WEGe(5ig4tD~O>PYgyb!171d=xkq%+Y{q)?qJkgM>g#v z8^1dG)wr3knG5QvWVy~ZG;TZCOir;nXB!T3nz*%OUC#FXxa|?QGk)G9HoH&#EjK^n z3HqxdTjgw*#B*s|M>gnempNPNKW(mDwyUF;#iucDh%ElG`uk&if7s0JJF(dbHe3}t zZrjk5LsNVhZ(n9gxi`76+uS6GbvRp7U^BBQ;}cs#Hrv(F+v7(gr+E=kCE3~p+i|dM z{rjjV*5_<@#%I809(NVX>(}Hp$CF_*v#6P@+u0rrRs&<}Bb&NOaeoc!G`1A75@&ln zo{yYn){2!U*p6g>Vr!kPE&emw)|2%++q3a~X&WL-<^sJs`dl#kc0w&;SqZk_bSwu( ztpU}a*@>`oHI-@>+ttzUB3s(IDpNL1!CdtZDZ!#n;w;Zcck;|%Y=P;B){23Y00LhN zEZHC82Z1FkH#=`LtdeaZehXN#dQ01(=YMPH6svmJu8#KOyVk*)F4IP5dd;i}sA-pK zl*%+YKVdpAb`Y>+$<_{^4J=ttj7>}fuw?5r)nq0>w42VGBCn0#5A*OvM3io0J^i2B zc2ne?@iSmE)6zwjoGjZ#6Yx-;StVqO)3iEjrzKb?stH?N+{F{H2nOqfSg*6yOqc?j z+1XFs*7j4xc2lHw0#<2%2z83JI@{_Ad)h^NwCT}UA%-=`IY|Gk?KBO4n2-vaS$BKL zQnr`v=Ah1>{TAyIS%$OShPYr=8fjV`?TWkp%IM$X;u}+q1#|k88KFh%Yh|_Lwp;sWcH4n zXuPlxSaMp5!(RYPmV|iw-(eM^tY?c#js%u$*vTbX0W4X*GqFFIk6+bIx2lruTai`K zo$P`)(lqPou~?Qp-#jo-$|Oo=!uZ6%NRxYFpdCfXe|f5_?Gs?h^}9H{!|!oaNZAwO zMZl8jyE^Yxz>-ZNegs%Db2sPR2P|1mjKND@jshv;Y0f(vSTZ|{*slaVnog&%y)1U* z5fRMzCfMXTtO(3uV9AmLl*lZ)X;fKk{ihpSTgk>>y0k&1(vKNwi}aOsE%iQUG)7aKgV(s`wSs+otm9E zxy$If$%VW#Wfv2YaS^UK(zQ$>xU38;xje)Tz>@2TQR)U@$=-w2uX*)|Xdj*D+#AR1 zV$3%YMp_cSi6G}nrb18&)&g_>R!6ikGzC-s6)I5A(++WCxXZ;@l_?8Dd?K)9J2A%M zDqzX%Lpd4vA`-BqpQEWWJA>tPYGZp|TO`K}>KBNRXVzhgFyoQV_#C!#9@2P>v?Pp& zoIAoGjYlt0Dtig?p@N^);0hU8gDSw)Xkf|C!&O-DWeYlWu)R3;Ok^(%y0HzBO=85w zu?>-fVKYOJNmk=*&qU0zp0SCwJKKf`jvu|)Jd~mCQ;%>1T?Z^#9pb+LORgctLiaha zWQTc6mH7*{u;Z!bvb{bs9e3-@(ZWbe;s*8^dcWwRcKVs!nU1u$?Q8laxNt>x?ACTpVST19kD$M6No`iYVm zQ2gF>oH%;1_mE6UDwPahNW2VvP-f(_4==VCuw*GQ#&ABcWOL|!DX?VOu`bD7z>287;Nh%N4!VK7BJh> zk*}k8VCi2|BHnv6jd7;yf@_=RXj5z_XRD9yh7$kcP$&{prVOV1S0W6tx zlI;U{>=iiDp{!$zB)bDkt`Bhuuw-(P3N?#F*~wNlvpw$L=B2*4kcJ3(_MWDQEwJIO zVSF9if|iN+QHt3lkF*?di9Zgxf(Jv^(Yxdno2%gdiRQY|^T&9eP>oCvOvDd?&C6Fu zS=IzEMYT_w&^!OvO!%@(C{!WSMkO3&VZx0`5pNZ}TNL%~L`+k#Z)hdTJC%J|lX>7p zs3SDxaJqyBWcr)R7-eA@w`0)dT|b+By+6^MZJT*DNR-L>QSi@+nXE9Is8Xh|c%fA? zy*zO@MhUHz>3(Cvby3uznLa$%*5Ubw{1eAxbF5m=wzzTnBqTG-MGw({Ot-)kEEgj! zS}yLx`T6o9M9E^$8>VNxlmqkPG;=Y-n1rfjdTm+?O?^a# z^BMJa5S5=C@r1f%dUqPe-+vAj#Lu+eHLRexXByuA`86!9BP?TUrkJ`h0xPjIrF(w4 z3O6%*)mc^zur0oC2XnD{r(-cqMDep(-Tgak1(P|XoJLe8(}O!~3DW^L<0qa>KaFki zlRMxio@QG#(y~=g#B7W3=1Wwks)~N2>dpZjWDAr+X-YP$ z%O$Fl>64U+Ff|}bXh5bfT~zWSo3NB^@#jI*6)0mPQORPKanVj@a?MDT5p~LR@lF~f zp^6Gd)$X(nqRfgJ=TuH*TU@tO+z!%6i&o4laX=^UEJb~vV)pB?KchsATlNy$8SwMK zl53Vaye`pIBA*9F`I4iYdhkAIGCS8tunpqqI!uk&au(O zZwFCkel`+iolDclJ8Guo5Vgqk$&O}yFtb`HuZmFvJ8lP)*-@=0>XGT|9ruLEtPes% zp(&HwU=mq^^&z-SFfzuTF4;vVjRTs=ws?3)u3sZ9iHnZBixlC4?Tb<{LZ(khi&n7DcJl5_o0O17jWpVOW6XZoPT0f zAj*^J`jlV5WD=GV4a#&wiq4UQ{Awn=A!R0`gt9^t&cB1cgxY1gIpst~^%C{|mI?1p z*##zZ6HO@fcg~aqlbP?0zqhD`ZSjT_oS+25+D6nTQ+-N0O+s-FU-9Y`><_)zlNeeJ zX`LHdvuE3#>NG`cFqm8bTrWdnH~&GyR=5VOD?wFzh$oCM^kn%{ZyhK<)3s3 z`@w<*EIFxG-J27dW;*q-ExvJkY?OlIucS+@V>w%x3SjyxatZaz^vCTFv|}SnlPnL7 z!2yovoBgi5_aoPoXY;o z-5`7qEIAnBX;))kNSSek^F9PvGG912=n%~zEq-_!E^K+RQbfqJN)cY{N?^%$VgL4G z&(SqXw00WqY`t z#-TKo5iOVLuQO)AbR`Z78i_h&x^qT`nbd8r!N`&2UZZKc^HqEj^(w16*cM#6r#W(( zy9P%9L@ifya;@oNn1qt*oM|qi%-Nz)mQ0uJ`BQtgILgAaD)ZeBc{eNSial`=!3=~f z<+6m|{t&8{$$tAI7>O>jX`I@EOZMD{)0Ih-Et8!tQ-+YnsKAtg@jC+JCsxU@h+htR zB-LCc`)&_&xgfS0HhB)w2K*4PWX38xc)%UNl6}_^2M>@`t+pzYwBUvr=D5+!Y@v3U zR?i6b9Gj6$NtV|unK@`lyWXmmYzv;A5u6jv_ycZg(6gaY5vC8(%o_#KSYqf$T@e zN4@2@TE}*_1<%bihg`1~M7_M*tf`r8!OJtv5^JIci1M4POTp_i%}QxZ%|!m~GJ&_p{{kjS-dT!zA5orvJWg|knq_);W~Ld5 zPY|XN7{1Ha0X*SaTw|c@x}P}MALiU`RXN*&SN6s$0L=a{pQMOwxIY|a;r=lA>6Q|; zD&ZS@<5`zr0Taq^;Q;+(Z=CN1We5$*v}y1CZ5f>;J#51=Mp+WeSbwkWBk4Z&b=^MZ zSUWhyC2ExE#(jQb#_j+Nk_IQf)`kI>0!uc9_)1{Oln0&n!@!b-!ohfEP-U|%czvI2 zdwem{ax5n#_6d?HN!BB-kEB)D+fbH1>hMfp$%YWm29~UN%z0M)|9c5X;a zB-%&kf?M|r65Wmnc~0t3#Lqk&%f4XMO11@0?q$x+%zkVQQNK+0?G+ptbs?FOtbI|* zf&(zBBDMu@?6t3%j|+rj&t?~4j;BSd6tQ-1 zybZ)`KZ;07*@i3bD2qFuu0TJ^zxH)iX0FrsFiZSpOAGGa6GLf_Gl|knZ#d_DXEqECw|4%4;q-AnTEFM9W z+2SOBYq7s?@wWrzRnduT*DU+ElYg$Fr{6mvDycSv`Q&2oE?wbXSEcp#vB9^;& zJ&p+|D?)rMuw*kaZa*ynmR$cfllbSIg8TAsT21UYzv;vFh_L8B-AC-bAid+21sSkrECjc$iR9Ml+jGIMy8+)FV=#>RdCNcEZmE| z11y>RuEWtAFesEM9}ow#tD3ZdZNW|HX1UHqK*iszW9Hv&TkvGMIY2SXS~tuhI{qNvKbzC(>~kfLEKM z4vluJMjf*bSaQvWwmdtmTT`9Lw&43caRltezC?sPyFXHdS=&14IgPa7lRdC44d$#+ zp-lfWA8GVrd)beHrl52?ZAyS-??nQMW+k#j3#5;S;5S=#C zVn3tl#r}n4O48?&?cNac{zCPZlHD^ATXdY>!Y0quemBJz081usBK8|VJL%NR_JaQC zWXzu4FR;0$qXI7YBx)jK>kuZ^;*!0ZKr2YM_$Em90Zc-5GJPF2S9@aKpKvdptol<| za5}JLM~F`VmaO~Cd7lR?Su>!?TLC&mC!e%>^%!g;@pcy2LvHd)fFDGJmrYndfQ_qdJ=HocGPE;>@G%BQ5R;nE@nIlI09TAG+NKek0Of~2Au_c@x`9v#2)6dP|&PE05xsx^&b~Ui% z;BaDLqQgq`q6!;nNhnOtwM;eVMORoOQBP zbDmLQBP|Jq$$20Q(ul>GJ&$dW4Jl%9E+yeA3p7<)Q?2o$TQW2J`2?@Jnot=sC!C*8AgvU2p{= z`;|nkGCeuYY;es~3YD^e zpeqdU92BRb*3gFGssonH7_XY&ItO3Gj9ZmVI_FyaeB8g!3>k?m*@MwZW_HD%LNX;O zr4#z-2bNr~K5(DlHXMCZ4wzrrn7`nzmgpd@bH3JcKhlygTykE{R0t~Jm^2V|ho)f8 z=dZ1Y zh+hPjoHW@bc?(#wnixqYHDO_+tP648COm3F+0GWTpcq&(V+)P-ISF)_&WC*yGbgA& z`4lhPCz{59!@iA~`5fC3T`Nh2lHo2cuw>p8^|3Gu*{Cwu9^MuW?)#pE2zfRt0$-sA zmMq(niM-hDz>*aq-e9_=Y+;Kjejiw}KlJ_vSaLALyWWmXGiCfIZtRZ&maHMh09*_# zxh}-l0ZZm?FPkKk%^~gqmh2Ak7r>J7tzGWe9Vn18JH*=nOO}K<4Op@! z#0LROHi!6FV9D+f7Xv%FjjLn{ut%91;u>Jd;Sk>dESd3Bm*gQ}$?_1t0W3K+*?A8E zOXh`m+MQUcC@Vv3wrP_2+cHV8J)1_A$(Gx**da(H&l*K|u|inQp!M*&_FGz>=#{S&SE}0$#q0m6LXJ_*#Q0<7pP7l3ReMQkI7JK48hd5I+Vy zdk-7jy(e?~6L1S8nW~7bf5%uH6$GYgqK+S!@B}`RDM{I0uF#~rF!Yp#GaOC_E}?7+ z@yWoFgCVX2maLlTlH3R^>1SAsLAVcCvW6G~ydJn`Z|hb4bC=}bz>SnCnGSDtH!cfN zc87Q$V9Anwo%gB0lD#3m2w1XwKj+;5oU^}`nOP3s4=lMh#Loh^QRW`tyx#}zKG4dt zY=^%AUQ3yCu*DI7EUuL%QKhrRB~P)(; z69<>^e5$Ez4>-zPvN%5nkI0f#%94k73S6CFD4`*Ixv@fI!BeNfU+g>dKkXRXZwp&Y zMC!dbq!Iq5tM({^DNFMmE&;BkOgh%#D}W^nL)-#fN!b_T7l0*83tW;uV9BY!BKFV1 z4f_T<@ZFQ;q-|`+tj6~a{gbgIjk54_9(l+m@4S<3t}sfLsj@s9ydUCh z1PQsIz=Yweg;7;aJ;fFMN8nt_qEl6LSvEfQL;7d7hdeee9ka-o-X&V_Ya4LL`f>P2 zV7i>>6`7tHhfC{T>;?3r{Mp6o$9w@NYqnMOY!BHK!9k91zJMb%oM;M0RF*ZggkQiJ zWw9fQhiFlF#c8&$HnxX+5!r^H2@*=1V_l5Ner-pVE(V342^wW#U--H?CRdXgFVW=2 z{(?t9IPt@5$E=(b9Lj71n>>4e5Ya-_#dgfCHXhP5oskA)lG1o~fxfOU`+uAE=)j#$lBYmYm*u6I{X{pZpxBMi?Q9h5Lj}Ju>Wlzwz*UdZ1K>XS!w@(06AtZ zb9rtBuA$sm#a@H!IHGN|&U$JBHgx871S2iHj`QKGQBTgDi9z;xKB2~QY%j?7Yb+Dy z3R^4DpiJ!(4zgX1v?O%poon+TI_--i_T{vFE#^s_61fp zv&9_F0j{gI*#E8bJ{7o;(*K>qRlt*eZ)NRrhi?I1b)l70FS0Fi{}s51GUF2G{Q+>s zWmc|b3-7OhCDUq|#2@!yNRvp9#nk)B|H*LWm?YTnDry*&qeZ#A*e`&)C}&^p>MR15 z>;T82*+uZ zS#=KQ0OwM!zlPX1i_8G2PkQ!Wf;Zisgn)9QYMI*1Z?kb<8a5?qyw>$`Kd|J+)edh0 z?xxJR&f%#KV{9m^LVO^wL14-CAx>V0 zsie%g!6nHCmaGkN39zJpqw}r-&itd5lm6uJlfb={nKwE76>xf^l>=-s-qRkzMIXw> zTb=hQz%7(jO%AUFuA!WEhr{i_LzEkv9UcOfY`)9k-5T>KjiQ^ zz>=%hIeZ83I?A#~9exwIl5(JxICyxV|F2e+lU6@GX)-o2=D7l)+8>y(twOS4C3(X2 zv3n~vkCbcL96k*=`AI7~o^tpG;4aG2^$x!VTuoW~9I^l2C7z?Lv@UJHuTVUH`eLl` zL^;pc0GP~f>NDi3A!?E7rpOL3m6YR^h|gN@T((PZkKp$+zyA-Gg`1Pdn62(@XX92r zy_*zuM+E03L51b4S9RM8@l&wJu!Ep2x!rb(MQj`3RLaT_?+Gk96yhAS`yuzOFdLv-T($^gR61bVN`gMo*e;mt; z=ZTF-VxY_?fD%%$>XqJC$Zk2gD* z+kc%SEbjJSGx|wq{=B!<&&(<2u|2Cg*w#fpj|4v-*?^GlcdW7LU54N(_$RQxrOf-A zGMTybE$L*^t0R|=!Cb;c%~lD4tk5cw=vrp+67#A^O-Ba97CDFyr4 zOlHYty8+(-&;n6I*63`@VG9zsi2Bd1XT_I^5%DjqN@n{|DNbQm>cQ7#)bXcZ8ZkSCb7VWB7@p$j5KkWgG%IH*qWXIJ*N;*4W>M*jST)2paR-wXwYEaGH%8nJW~9mWvV{KeM zTdW!{0w;~LxRNc_$iD+i4u$w%z*TYU-9O&8NV3&a$UV`@p((_{8d*5Ws#3OzQ_)1$ z=4@^%Mw;AI9EhIQY-Mv+Z_S?YYGB~ZZLMrzi>dfMaOX6OD|T?+w*pHx?L=%>>z`RQ z$Tqvtylgr+#TTmF(YnBde*{rJbJVf5QC{pp^rQSWsp`jUrr(=x)hRnOS+LNWXLVMS zJSofFKDIettQ)zMqkb3W!e;=0nGfFDD60-gOw_)wRb6Zom#O6atSysm!kRJCA!Se%safK5~h?xZHjcZ!1n_W9By$wT>y#(BTl$Dvkux-TuB!Q-pn&iRE zn@ZpeeUtFS47!LvgL5$&)AN*Tmjs$Z>T*pYa0cZ%98tS2uw(JUY&fS0AEkkFj+P zvW@s-o(*XqsjI7#z!{WlI--=L;zg!>T=}}I75$*=Y}y}Cm~8XI$W-b1ll$- zR||nNDAyH;QjW}g)pbh(O(S)6O(k%Kx~RD%iD%>yr5p_|*UJgCZe*@%0%uUJ4-u7A zVC!jOi!LTShxL%M{8!fO`Fq@l-@cG$9cSr^$dh}SCm79svYf2i*`D1CxBUF*0Dc-o zw$|C!?=>AaE%uK@aevX~Dm-2}JA+Xq2TGYuu2 zqB6Fc22+cerg}xh)DlekXw$trnsXt1-2%g%|NUoYjC!n zn7ImJ20}~~+FF8v7-?D&(Ll6f(iE`%WH%76154%>IXtBuS4t_{L%b`ntX)q5UYL09_*}#& z)8IsV6!|x#Q=0U}u9xqCC0A7t2ZuDJbgE+eT;$0qyze*Cl<@qvyyMJeqVQOhJ&Gq= zo?r`ZtZn-|u00YCvc;8Aua}%EUj|h7XVB4h4=>G{PV0=KU<94T42eH^Ieh`fhE_4_#7Iz{8Zwe`mdM8hI+Pr2l(|D}W`Ni0y8( zkgAMrXQbbJmJ(n0Mo7+bo1va9@FT$W7g}6(v2E=tSV1NFcH~X1f}>4Z1wTf*jSQ^3 zgz4}=*o&A9%IwP=J`FgJGWBwYuLsVcoVLQ@SAo+ghgUkh#Y@-{U1??CRSq8wELnOD zad2@a?P{yC*(P2-67%bR>w%eafGL zY(=n%^^dSUfox(PvoQ|8I)_nR%x*~RYSkaD>Sj9-z0Y+eHax;+x)MubHpbyOX&B20 zi~hu}@X@)Kak+r9CBzxP>nPK2a^5Eb58Z6#+D3;L0I#~m%6Jp8e+_8*tyV2(`+4N! zF}vcptKelk^l_WD4Y2(@QiB68tVpd0RGMt2!wUQX@YFkOOg>v+eA;dbA$|wApEB#u&f9+l8#T(RyBtmfmaM*; z*#GI?o;QoCl~yiTSgr^4X60WO9(d2@&#) z-|O-}2P`=x92D9?)x&no*EUffBIKF$pt_z>grUFBs%dL%Tk))KZaz(T6>q^I%K8gU zZ)1V?O^_@-3cASoY@HH*;^ROs$S5=@Q-5GG2ZCw$+wNP~ zR($T`cS}Kqbq`om!&+AOK8g?W$&x2aSfP*$vK8Xy6{gvL*khu;L29C(~K*fg)DQ#;$lO|w|tV>Tjj)11RBv)CqH*{>sOaW=PU9%*u$=H%C~ zHKl*$lZh3kKVel4+r%sTVpH2xVR&U)7d6m*&k_g)gO!M zd!My6q-|jJI0y%>r5t#H*k1#h`@B_+Y!?qsI2?=5muGlhJ5dS)7JnW5EZ#)*67|Ux zMBxHHY*jBZ@VL-UQr9*%RW7*Krh2 zS=Q;290M#l5aLo`$*R|#_wRt~C{x~W_-aXeOV)?@EMUo$w_TD;fF;vH{5-HfJ{22B>|oepb7OYWk~PHG zA5MA`r>d0eLcBk)WPgZH2OgrVG~e+H{$jTPORgtI?ze#@y@}5IBVftW5bxTBof2i; zBuAGkLQoFxJR7J zP=dN{Rtfl_D6nMa6j$&q#+$M>#18;VwuN{jaC?#s&fd}``3P9DD#Tm7g*A_Ip(ssbvk>MrR9Z@nXM&QDv|Csmi}KH|lv*xolTN9^cv=hnuUuC1e%O_T<*s zt$VRQAze4&>}00HS66_`DBHGGFXlDaeWX6=MX}9MTnO-Dg9zy(tlr*b+Tm@?O3IFD z%4BNVi|R18S4SG{U9))zk!#`4T&635C5KX!$=vp^|_I{Fi zC7F4&S*&hHo2@qTeiEMi2%abrYj(EYBy;i0RG!A(v)I-~hLX(MWS%IgB3tEbU%(bT zQ8LoR{b_JrNA5i?EGQFC7h|gXcCz*5PIrUxF|cHHss>}bcW?%~vsL|Uua4Xw#g$t# zPFX~`Z0FpekHC$zBwUS>^Tsf!1oPWJ4t=SQR90|x6**f_hgm5`nu0pa zGITNGG&Om$T|t?>d=Vva7OHzWETe z=+px&T^;QlYaUoJ-|H32Ot8&l8M$Ot&i2+=yvQfm0IniyakdY~?q`1-Gt!js;~06j z{UFNjLc|&lRF!>Wv6u9VPQ;NI*`Tw19Na20OI+1K*1wkR>gZ5#hso?h+R1vI?F-m~ zMP#H&i-_q??wK6M)lu7>8Go@tXEPIS%Pc3;@H5Vfy@q+ybcn5U&7ro%cIaE+R?3DP z;$XR-MODJ~p-8K}HoVv0aM9~9>zaOeVn`3^0Nd-Lty8cE@nR(=gsy$L3Nc3@$wyd~ z%J#bG%Tw?SbnvAYkDim*UKf3H$`*Fsk2LYqN5L1u<(}ihx~7S(PCc_9hE7dMA13Xm!Mq{m2$9TfbOH3^SvGf}Hc_)?PDw#C+= z2K8NE;HKtF;3mrCUpc&g4^9CoyH9ZVeBk6lD=SYT_AmS>;^=Hz3oaf%-Sf?N66G(; zoBJB4)7N@K3ScQ`ye?#64bKNK_%yM|!$^q$P1vDDO5!*}lx0A=D$2E#6c(M5G~_ z6-41juoynEno~J^_@LW+xI#j?ayD_W_T^Glv7OUx-u9y5}ZV&`7#o5npL&Mp_aokn=32n)B5-RZvaT z9-4xo`3x0QoNjv_V2i>gypPLcl$G;X7!JmPCHq7CD`3g~QtOSQ;`s(s4$gPD3RrUZ z42M?$OV*s}a09U9q%w<9;61>StBBF%mh4&Vyt9BM%PJhs1(qBL@ho7;s^2*8*}%P&1Cpor8CbcUshQ;f62^>x%1ARd*=KQlrK1a z=F%neW`b2NTLQ!Ub4%%l9w%BeD)~kit@RYXDnW_ zu())=(u%p2^UCHgadDMp3zn1?S0MX&Gff{emzJJA({wU->3NIh%{+hcqWR93eJ`EA zaPFeY1@ppw{=Z3z7c9b5E}C0D^PGjnOUvdinO_QM=c5GE?88$_*^%>>}_7z+(nD#mlvPD?2I$8ggWz& z?{#VAk_C&-{IL_BxBvu2S0K9b$41XvTwXqZUgd(ti)Q|2+5BbUlKB5E*DY@gu-uu! z`9Dmdolif$Ml)-x=FP7#b^ebdnz&Aw($B;^`SBeuI%hss*kzSx{P&5Rx7a$LwRG{K z|L#3%t}*<_mNqKBbn!B?p#C3L`Cy^Z(ERtxgB5MjvW5TMGqJ|R*}&!7t{^|Q;-K5o zWlOLw|Ig!l`hrC>moA=n_WU2cS}a&Rb7^Jig2n%RB8_K|`oFs-j>k+>Q^k_S^X4!8 z(Tn4#_%jy#_&FYKjc11c{6ExOx?l;m7mJsi_hV<=sHzvuT{s^*$$39|VZ{)eDgE!o z!V&wdg+FHb2o|ShOBVe1q(7)X*v2pU(L1G4u}iT1sru17W=xM8?*CqBqIdCvg%#yL zDkNBjmY%n?a{j_%90o0@40m(?|6Rc1nTxSuT(Y3_f8MK_#oo@N|MT(_9Ijy}TUtJU z$&XEfu~|BQ9**{kf9%SNh+t@b^gu3HT#SRs#mkmp!CtWFj32S-_`%WN0B7N33=wq`#z+#ax>vCNz{{P(i0cjbbGKmJ_6rv8yDug$*{=NhHU zupd~sVBV7d$J^P!cU@I~e81oQec6Bw#*>1AqF@d~!CXc~iA6<$G>wW1V}lJg8En9S z0pmf%A|FvPNl{VJP%%+4Nzq7AF*PxtP*Kq|(NHnTP*MNy&$-|G-GKOu@msxKIllMd z+;h)8Pxst&@2{q=Z1R7@3A+Q?TaxTXQJe2x&S1CBRg-IAti3i2ro{Kb4K=U+zn|z5*Hi}o>Es;T~$|AG5N^8 zM;(3iQAe9sRz4kLSvA^PGc(~M+IDv$iaQC~Q!uhB_Sf+jU1k1dWrkNF>r z1TK@R>Ko^}hdF(QfXAeY3FWZdgt2|R+WWLg{8yl{4&{5X6rTZhP)?KNGiMq0n3^dQ zh)`(zTQ-@1(#{*qeJ6Pn__i%iNWMqk%5>UiX*;>DrgqwA5A=8j4}JGu4wG;}b=Bm$ zPoGXu6}yIJvP#Y(5`zGFiS9+Tr+7eCSdDfk+8iCb~K5o5QA$}&sm)@5zo=% zMvj@pR_fE&psAT{x({!}beHAdcT}fUm5;3;2%CM0O+uqM^t%R0_Z{y>70KSbe)`B! zHI4phHla5c+{u+yV{kIEjCT?#udJ#YSx4AB;kj(mWb_nN*?3qH3C-dF!8wrsgh4e& z>ryQl;#mmQuo2kxG=>!vpeweCCK zO+4U6f8$g2?`PN^G!n*ZtdW%!)wNB;XWyq#HlYgM(H^00T17=RwMr0`$rJDtD{JaT z`hwPcVHDFAXTHA zgF!}DSJgHL+)*`?h&qg%R90R!C7W_TdJ0lb)TgG;B>a@dZP31xI0_2psAPG^H#`S2D)PQ3R(*og%b4GMwlzr805`IQgGkF#)L?*(A4O z-x7!RsxcgYX-_dyarBA_ zSzU!Dx>jP2AK^#L>L86vo%}0{($-`OHKU|iP#HU&IP5z^g+;F>p?69xAyXX%HOcqg z_Yo46QCC^fBv7Aiz?Ng1McOB5+qv^dsf%X9Ua_=n(r2ff$ z>T1Y%CqihS%{yl0=(;}qzj+5y_Qzxr<3c7#BirtQIrfc?emGXTa$k=__J&(T!O>;o zk3P0}X{ccoEMh+{zp0#^dDCq1W+9};RF(*T$tWySKH}*TXl0L z%O0uP!Fn*8DH09Q5Me+0T7jTCN>c zSB*+`|fghQL&#yF}hr)eLi9KUGcr7x4W!BQaxH4eBLl*xBDb zB%o_+EV*RlWR7PsPf7>gNhR$2A|yj`&uc>2r-{&Kpnd{4%)x@HjoNJAQBT4H<7=i& zu8dB6LkdB&@V*6vn*rzX6{IkYZk;p(Y-m%nH`f@NY!jGk77=MYk@Av(Y0h#~COBz* zMsX#Uki%r1@v>U_NG1|;X{)D<<&^OV*5?P?cR*JYhI)P?cA4hifX@TnWMd13n34 z#<|5F+b-bK$=t+N>~>uzi>w>-@JMWsPUW+yr4mK^pXR;qQwUTotIg(7Xn@)TXIVPS zn`q+lWDotUZyFL#&n{t-)r`&N=*mev_OUm7td|IyUVh(q+9kM*tC&8jri`aT_{UM7 zdY9=lD5Hdkbu~5Bby>~wNkCUrS4{QiS-Ylv?mLA78|x}=6{d;kMx2nBO$kq?GD`1v zOv<{K5N5%PDti-`{0!?GAW!B3XtnMWHp7{57=xQh<8_e#zZlDpvC|VH*<+^iDMV-* zy+U?F+4iUc$zoFNbm$w-G!vDRy@~lZfJUM)vwbd@OsJBZQ=_MR`XSS2;Ne6I@`6$M zG@@J5f~F3efkZo{lzzHznB{ZlM0@#kV!RasKNChbnxB2=g+!N)sjfjQb0FfiPQ2$I ziHE7;BGXHihADqD~(_s%EdRgYVYe zKLfGXFX`A~HBCF*Bcj%FT18o7D&!uUdQtIrS9ZRm@hM%(D|jf3og89Wwio%hJc`z* zY}8)7TodQs^@;x`E4v5%vgZ@1#_ijYyiD-r_;CUq>ERC45L%wD*maY~!}c)3XRrrN z@_*zGhqw9m9dKf3l!~aZ%4lNZpFN@e$nuKuHGMF$#=YY?a7b|6<7yi(O_fWj9Sm>annFZnGM}+r5xx z0$oo!pRS!`acL99v1`yR+lj`>Ktz+9!wXK}+kHP{q%4vt*(CVQsJ|i8EP>v}?cv@Y ztnAss1-Zf+gcPj*|1lmJKTgjo5W#AD;I!&fc`b{hPc7r+psZg14g?5CgrmxKjex{j zpH%d0hA5M9q5o z4^u(SZ7b`_MsYl{D?jhMyOL0A^0X@4vgV@_*Mm9SY2GPR>xyGDPN8C~9<0#QBt8eB z**v4k6=joH48?ewb2>Iivo48l%+@sD6gUVP%fZlOHUOL4OHE-T=%Ji&Dvr(q`pLeI_eKwIPCMYdNr5TA3xvMJSEG)&?$+4gnANR7*! zMMpXS&+MN(wM5TyZ%nhz6X1nEN^q%T5kkz5$J3liv$7%_OX~7dBc_$!mD#x z&*e!HF6y%Suuqr=mzYT1LP1Qb%IX16fbaii`;E^4y-|3Z^P(ER&PqH zN8!l;Y-IRJiE=LUjONu5J6_v)tUYRorfDZllgN}Fv&+lBdj-SNaP)JL;nqFJm6MdH zyq5`SN~+@j$!hP_piL21w$0uS7P1QaOt!4IWYFefv8t?!O0xRqNbrtic3&q;yoc%< z{RpOxD6&YPM(C3#?)8fu$$E{N&f_z?rHb#7SM-Z)`uS5!GuO|X*r};x*slZ< zc;uIY_LjGHO4!}IA1^a&?SGUpq4XZnV@{k(P2Q_t9Ba%Q?9&WSDmA*yN@s44Cn*w# zApFA;r<-G>CRu6vQDCkkO&~@za&LcXY-D9!U2UI=@uMorb&88;$sQpost1xm*MVb9Pc0#Cq2Okg*>*bFG*vVyajKn(m$D8e^*Rlw{35B?eR>AYk%_Ifk z{E7u{pR#2N5GTvGg?IZQ&5)_%!&?3 z_fNTxX_)Sra(`+O^2TTLDix6G^;;5d}o}SH`~zL5Q^NB>8NYEdn!7R|F~IEN`G9` z6)+{^1DF&TgGDOZKRqqw(&^%qYp`DGK+EC@q2=#p8Tk67U{yLgINet>NHOV5#$A;c z9W0!a7IUK9^dJo#r3?Lf4oJBu>YMJE0^em*4B(2IFv7NURFJL%i>Ot)cgjr%ZgDEp z!kzC&URoO(Zc0bTL0@Q9sBv$b9esmww}g5~3EvzVeUZZ66GNxm=qu@^O!XefB(y)u zp?~jGCf8jwCu&R6@=2j-D(Wm+ji(_9cZxcs`=#7CzJ}=Qa~d_zy_SJ=B_dsAM8k%Zn>!Pbba*5a<T3nfF>8|cX6)m1Wh5m;6rJ1NOJunp= zlwJjS_}hHbzsV!Nk^&{hN?^}zJ@h~5if2VbrgfnrZvkm z)5x$osoq-4uq^zAZKHh2QUjChoO16_44AI70!5trecE_?NK(|&-B=ho4IPTyy7AF| zjAD!Ht~#6{k>O{DYhD)~VM?ZOc0la@A2KqWa>o%gr8wI0bnX>EvcM?1RN-eeKq5I9?szc+w6sLo=Zuvi+FHyORni{7@-$-N>OwHB?U;UuF# z&vRST(E%W`?2Isl9SzY@5|6nKkekK6Gr&x2@_6Lghw)FP#_tGISPeB5PO# z(Xj>m$-1^c@~ZV`KOx}Ki-46YBz}gzfbGVB3(ejY1z`8>InkE@T5@J1(5_O>znnw; zK$LV&)K1)Vn!X{_C;A53sru&c+?4;G8-Je~e>X5b)u*c%F*!Yj0`Dg^&`G1G(D-0J z4dFp|6}Y7-KAGZrX-O(tLJcNiNaU%(A`~KM=A9eR6n7(c6HIrMB*iV^X5deyRw|?= z1BjU0katb~<(#MxFx$@yU@jMaz}X}<2P$dzd^&1FlZFMMi4z&pu-YK8IV5OjHf7NH zp~3X1CmqfX-%R6IOoO5gp(t?Gk_$qgrA@2?YBA&HevMp(mW-urrg$3PC%S8E9 zFSsxUz#yMYwn29MI>5YUcGQbD#TSQyKWK6bnEt~#a5;-AKFm+KJN=?C>dlNom)?s) z7il%f;M_%i3iU~iI?;4>QgB_9DRkBpKFUPjqD9x=1RUGA4LO)qw0y?hI49~YKGL+% z0ria2SL4i^>1Po-xo5mA6<-oix~R!GMyd;17{TW!Ez*IvzOA+2FpXLFPPyyzqF(9J zlzU3wEZYrvQIXWnllq1=Z_10hOK#@CGN4%C{y80P83ZqYf!HzQR^~-N#MDM#6uev} z0P!>d1a^!~05OZi-cJiAjOyHlUTJQ-ETI3UpHJ`0Lje{c_5^NjVcN7IR7D3tz7@&W zVPMNBurUdAA8B|DJ=vHKmV6|6=K|ibq z4%7HmE`Az9n?gUc&?$5=>-R6!^7o=#c(P8#`}^8m?%7nm&*fgy$oQk zX41~xG0m2+^0#3osi-9*EehZCg7a!@)wYI0D6p+X)Q)!DmxX>ZOtqrYdENVF-Z*--WTmerc|$$jl9)SxSU# zpb>J^)}1vYIufiFC)HQYVW{$ydrnFg5=n$;+1_0i*$NI>o&aK*m!Pm_MaAI8;1F0U zDU)(*H8|Aj;BL<|`LDY%?v?52o~Sp(7ltARfMD1N@K_ZJL2W6RP_#J|8E}Z;+%O|< zzuyH+<~g`Vx-*T%Do$ZLJ9_;IM!8WZfRx`9+NPqm-Vf=NK28L<8+y@Tb(01fbzAc7 zwXAf7gkr#o7*I4oKHgW-pHI2#ybR9^Rqjz~(ppcABGK*^uaAe{9I$vXgFa)Gu9RQN z>^I6IhUZT8I==XpxFHDQbsWmTYeErJ>{De!0WXCqL;pYUcTg{AVC9DZV6im)ngZ9|D2*bH^Bm3<)JjUB0aNRA`3yn_cGbTFC>7Wwl?*oIAo&UX(&VA~3?moNLH6 zg|^!N2_O0P`{VhT5~-szn}@VuI}jh8<*%pgxiUI-J$X7hkU8`80n!#c*pGCtn)% z3>C`>o1dn+_LS#~a=>Ygcp^<3)qv@*iMJ1V67yAY;Y%u{@(O)ZenHyyG4=NaB;S(J z0LrCQsNt*n&d4r&=zYZ{NmK2QcHAF#%jJDI#@gyqZnz)oXb_4Fw4NCB7$ty z+Nmj$gWK_bWDK<>X>cM4LBBpo*D+Es7d1p*146%t189N_hl_RhgAypSmxD9=xbU-t-ozt7B?WMz|OeMF8Vr?jlRw9fgQ~vRT$Q< zyXZTx6J-~xjM|KQ!$m(qW+?l$$_A+HpDy}>FFRLdB`W*CMc+g+X!nbx-6t}S$eWA{ z6?0VqE*W=vhPZ}d_0deqa1d~xGw4kk=SC;WVBt(li?ss6LI@{M$$dZ|MT_-X%jl<) zs-D1L0|o1pL3lW+MbuwkspwmpX=jBNa%fC51yeJ{cM~{E>Q%-BYuaR3PJuq12|_hnhQByqB{0*xaY$PSK&Xr3v#r!2Nr6 z)EDh0tfA+O7taW-xD4K&H@jp)VZV#XTWXbd(BVA{y|C(8_f( zC2PvfMRLsHt=p+z@(+mCJQVQB8 z2@oY;H>~x)_{SxYci`L-LED8$Z1RWxAx{<=5Gy6&zt~o zCelUG9D~t~n zVRm=UfQPmMYCrVc5bc(V#9;e_X`Oh9n2{+T+eo9;ySNpa1=F2Lhf)bmByC^du9ssC z;k&p+8DN9OOl|XAE6MSK88qvwX1@{d!B33&xwu}nnxp_EWyO+2(i;>BJ%t>mO}oV z?7wE}->vkY8vW<1zOsd{d`>$~D7+k90Ui7A2y|>Cs@*S?wWmGMEt5J#=)mE&JoHMw zELf39eW@C4Yiu+~Z61u<#qMCtpCi_;QZa%+IX|NMS+f-a{ML)T7Edo_+w#GE{Pii zhes-DO6|rOT zniER@-tTnlTZfhr@K_dwuhuic{^m5z%MaCxoJh~bvD*v901yyku9#wNL1>q&iDJM_ zQ41Ketg$xp+JrVO{7|x?vXlkx+8MSCYubhuav@4_jfE~~?}#AvZl& zG&xPhAhXz+&g|YUfYC7rG?K#6-dlc%{=OuAK>KGoXae~q?c?^4cctp_kS zUswmpDa*yP;t!!$YqBwi?@UTT5Ob+ox@$U`C3(18j0t0JsrGCqZa^Zo!8F44pn&UT zqG7q{X`wMSgQ5;`<4-#a=WGv+;fsID6d=sqv~6x__D3cXuI*wvabfoWI0Ehvu@Y$N zyn-%^rI?tb+;j{}p}W^(v;2_IXZw24ybbIT`lp15Sed?sZaZ!f)e9S|!GlSuftfQ7d9}u!dxrkM zm41e9&$fnFabS$EJv>-TPR#nGt)`9L>*oIMec1ko1t{uJA`>vkmSt&D@fchy9iXl( z#Ior&{I;Y%Ee1XGQy%+wpxph3L_9fl%Zm$ z{21Fa2JhD=RGl^3jtXm&f|FS{ofLiz1;Vh&K_Nb^!u4zWhMuoze*u1ry$=dT$yp&R z;T#768fw_laRl=grM5yy#e=a`zDueb7*cUk(knWfohkly05RLVR6LKAw!??GXUEzY z^+|&RI8!Cu#t=kUZ3w?l%pB^Lh)zSk6F~i0V=$B7`>nqWL@^B(ga(-&?sJF9r%A-NRCD2LFc9%w5x|B~w1!t@6t_@4I2t=g_jkt3g9wC+}bgr$#D-=QGm8 zz1-ClGw_1Jq0`1fNW{{n!~nAD{P~K7H8Mj&n-qKefhpoaFlK=}Ya%j(-tXnMw*fsE zH?4t8k18w+6QeeyPWzt_AjmK+h*Fs&+{%gcpzr!N-ow$38sckXi4^6t)j;+X&!8|Z zWKb;n!$woQIM~?TJ&u8jkzn zzsVr!7^pV0NY|6s4x7 z7zhL~K~(+=^EgkHEaSVK4W2tk->~Gn9nErV{AqxqW5VImo6taN3vanl!?s2{GDQWz z2WqBmR5%jgG&$1pruvNtFj8tFKBtKeURi7H8~C~w$P$vI>3vn;At(9X{a7(z)q0S9 zjb9%=Ie?V(tz>RppjEM;c1mwy&(O`?Rt343*tdZLe-ye^(ppU1+e=!UI}6%_g4`cw zFq<#KE0U7!Mkw?5bi|CgEF2YZ z{D|{QwWC5KvA-ihP3L5rLlcH0PSPR0i3yhiR7V!u1P=7B-p{Yh^ZL$cCWP(ioL>>( zYok;zl;7!OCTUSp^NISLjiEbZKZ^+ff25XtGP|{DK1vAnXpFfKP zKaaeo4t^=$SI-RJ9nCmyn;fR46Cvs6Zti#0%)De*0cNyVfP1+o3yDvm5xcoRRKucF zc~OR=-2yvP~F@GLJvyCQ%T^vJ36uiBZ!_U(Uc`yjfVF6 ztVo~YAftfb;9*$Y;D?_2%H{y%N9u|2CV|wmXU1d)gQsS&rUO*Dax#3qk;P%-nxicS zwI3J2jn#xq=OC%8apx2f=btR?2a{;UkiSquC|qmD+ExhL?q%VB?2h2=-u*uoe#$`1 z=^vBXiqY5NHjv^SZMBP}x<3c;kXO@bAGd~HO#F<=MksfMwow3oNmE3(bZ~d(S;}g| z>49)9-F@E8S{#bpRtK#Hcy}F9(&nNLKPlc^^m6yKHv2GlUf}r_ES4m8f1|2(fFPA# zfPM~2e8o2AK_3fu7q+(K#kya_Fqi>6@MdGJnKW$}nDo{h+rmB(8e5QV9#UP8h62M= z)r~PeX^qswLrPqxo04N7)#)+NYx1Lx=&udG3}`2gYM%!dp> zdt3#*i7m(9kLtTG5zDyOgZif3C7L3C|E_QN>h5^T_vkx=9_?TTXZ@LB{8o6%kojJz z63kQ(z(I+I*ww`UC%tf9q8C1q;6V)up800G2zKqB;U+>FaF9o`2R{R0x-1d)m-Zy= zZ%U&M@lwsg#%{+?SZ3I96bl1^6w_sW?$`YJyBIab`ZO#E^wH`=_gAT>d{a{XR7bRt z&Kpy>rKUOZMfZC64KOocLV(M>z!Gv3&LP2Sv=+A`~Rpr z|6bc*PV}M+lV9x;>&bn zRXiL;oLHe3g)qeZccEol47ntx7W!t}M9ehE#ObV-j=JYW(5RbvnOY2PR zw}+-Ej~)uUT&O5L<8tYxhdAXAEdYWoWByaA85Eyc)sp+96ZxWDzUgUaTFi!gM!}@T zO2Lrz|I9#k9%Mcq?@ptZ#^0=Gp}RtHH1PYA^2@3DlQyKVk2Wn#WRr>u@wiB9L~hnz z6L@#&OfP=9tUfV!6T^*gs;sLN-p%TmhqX|ApTAe=8(DcR{=OfL0Kf&y0ze%T*amcn z-&WG+u~}wcdS4gX{6gnDtc@KkFJ+X6XRzKZDrbWVfNcj6BP1|(nzFLrcPh}1a;Jhu zqBL2GvqX$ypNs)-zo7FRh;e;Y4~n*+MNBv#L8rSQ+ZW29#B!7{sBvxxZ+ z1<*&is{}^pmA!SA))y3(-x{#h9tV**QaKbo8$&gY7E98@67?wW{D;u(g&bBHzwt0;7>*IXXh$_Pn;V*C zj&)m7#vYqO5o%cM;jSkF)yNz~6tpb8?+EaKW|4|njLI~o* zV!*XY(c$hydb9G!xGyjm%XGMfrI3t?HcbCJ8;7ygKZcW0Tl~Y_0KfMAEVB==C96Z* zV<83w9--)`{d-Bt3Q#r&!c-K~jr}qV?+V?HTaP%Er}QxJ{v)Nwn7LS>8zl@k%x^ z9o^G8wqqXf$9OENOMEH`%zU&#UK;AKTn9=BBcizE`Fvac0T(*VCwxx)&k{TKCZIY6 zM#pd{-hsMn2k+C?;V7^$U*WVx>UG#XVScCZ^-B2S{vDZ0(n)9E8yXB_klsS~Zb=Z9 z@0+GXIA}+j{v;F_Wlaj3#Gq^R4Jv<1vFT*Xpi4%a<^M|6uocG@Izs^1Y6&Y0C%>QN z`Les%N9z~e7mu6yDpMA5*M}0=J|(-}KOBSfzCYkNSBdCFY|u44i%w2+ThUvwcas*T z{x!E{ww)wBk#y6dGKpXNxN+eF0o+m0y1zX9_@bP_mZJ}*{oS>=)Zn!#H1~mb?x{%m zeBE6%)BKaZ>jE?_JEXC&jpB*_cgg8+AIyx9ZC|B%DJzpJ!y`2Rx~iiF%3S5yYav@EKvqxBVM|6Q#$ZC_x=08 zPHMO>A&$|BLjP1|0ESJ%QvF0@&m!wQ*%jQryFR640MTx-M9<8Z3 zUgvdQ;l=>x4)h0o7bXRA&RIk8HvHwob(!Pc6R~xFK6KnJt5d5%OeWP0@~Ayhe-7FS zs2yJjt+^hBQ%GykW2MfAGdQ>E)EkFcT@+d!&TVVeAyki&n+JscF9rxVD_(+jJ{plX zkviV3HUIopRY2^=oE^y`j?(Izl8!BqG6<-PkZ}4p+?D=FvTjoh8KwPq-D^ckzu}&n ziAG=^A{|svClLLP@$sOS0xr^k15=I+3Y{@84dpNjYq!|XeN!k^foNGvKE!ZP_Ry5y#1BX*Dkj+m3x$2J4h158r-ec0O73mAYE6$t}-u; z&cfWM$~+W190;gwuLV%gtAf?N*;jOaJybmED>Axs-#?V@M0Kv1n2T6uN@`tbl%C;q%Uq$qMH8J#BL_k673T(2>Vv7NG{Mf z%XCB9IJR2j-*~@ej{1oj-~jdgR{9v17jKq|~&{JAS#Ahf?_C zwH&+|h<&`f)%)_4;il)}>EKTDkvuUA z9mufgGrXQ@i*7LCXk&(7lWv9o9T!1Tu>?9xhd@@?Qv{CO;+D*r^4$&I8krD?CXq$m z{L962K<$)4L}_fqJ&aJ*x>WXoudE+;C3JAIc*!L z$)h6!O)^(^K_-locq9kQz+NI<)0N<*rTqf3DDg)g^p;VPO{;Ww?`qxgIQB4EE?OH7 z8ME${EdmHpjXBN1KVWdY0bRdYzI$~~E!ma+D(ALP&8*MNHBYTHHvr6K901DQJD9vj zLihk&lvKag8jpc!p*dK3ECM5SoZIS??sD=16a_e;nA|*bO*wVY?a9qa133eR_o3j; zt%mb)Y-!NFWq_c)5Df5j_itQpYKDXwkY12yNG}ORPIpWDwu-ybXDiBtqIF48tW_(KE(HuGBFi`$So!v04#1B2Gec_)U~~%)w45g zZ8{gm)rc)?tHnne%8WGgLLE+(rH@_juPJX%%C-9(qS4#=KbD3a?@W4ni8t@g@KT0Q zzIMQD9EI7i_5m}kp7G6on&Y=^bFe7X;#PG{v0v|Gj@`OY44igG;G7OI7=juk0RXsP zQt}-(HcH>C3?;-2%(@rg=;JgUCWr_o%xrwZgqa7@+n{5PI?Clm_{18)o-F?n>ircyc z()WOqApJzG^d?yXFf#8|N#bC->Y&iR*n5e&evc?4vVb+v>S9ckJ;eCq7_3lO z%@iTJ2SR*T7hxzF5=ty=gXj;`9Wp95?po2yZSpUG^*bbtFKaeDWrt4;*Mqe-^Tq{I z2>UH}w*uBE<6iDJq7pd$G7qlW)FS2H*VYx0|5YAMz%uN6&&*>=G&H;Wwi=alI-~pJ z=*I%9VF-jaV&zya2k4dB7rw?cFk1;X=@=O8bS zKPR)+{LvdxwNO!jV8(wduMyr+))k+BZDD4kyl+_aBiv2nV6g#Ok_VI`$l!mSVS(FC zp%GfRpAW|IXS;u|rs3!?0r{GgU)IVvcU@904lO1Tr_?xfz!yUMGY@7LSScy6%v17v zgtl(k@kgm!%=7~~X-B&35YrB;jtS@%xb3AzYJa37FVoI^5Z_+z#)Au)}1sk_pg{U^195W((oQ*I)>Zgc@C2uzSLzu&BWP z;7r$>Gz^^j*db^{Xgn0;p>dp>{)B3o%j!eC%F_iS7~qe-IP*Qn;fbuqj(&kM_GHl@ zl4Jl%y(#KV870k-Jsz2E-P>$Gy5mV&j8GCl?AMMibW(>L#sDGO_q6H%A{quNFk#^c zgSCV0`)WRROYZgAOoY#iHG8JniP@uuEKJgcF^D}`G}A71Ko(tNX5I@W;Qalasv-Sf z0mF1x9T%p%LE!-S*tWrdrmZqRfv`j)^0_GW`K3=Rb%9GoCu3H*OxwVRXLj8xKl+UQZq!(^s&bea!Y-i`Nv=cS|LSpu8`3Ukq7 z%wNgrwUQJ|dsdu}{@gf|Tn%EVA*sw@JxL|H&KnwVIa7H72+w;uc84F&(KqYY7ubBh zFpISY_^Y~(jmX_8tHXg!DPgoT&FLpW^_W~XYgVz5b z%nN-hR|lKBLj#oxxb{@Ey?>Veb|74#JWCsa(i07o55Zw`oO{CGUwCC$0I7#E7^C=y zq2S(KZ)I?yK{plVCoPB?XsV}*clvQ|5s@D}Tr*puXr~0!6juWA5@#K~^zT zkaWUF1TOh;81#=!Ok*Sk>zZHz;u-fI=aaP9khG9;#j$YiEPwdYad-fBhX*zwDY&8u zFl2wQ+xj_6sm%N&bb0qj%moHn&jC3*np z%vxib9Z4IV!C}jpe7rxfJO1L*5^s4Kag;^rHjfT)wctZoaQ}$pkn&J|e>b$rFh3TI za7%j=lQl`bv>W2_e7!$yyeSu>0a50bK%B~yyY~n*2ypNEA>U|{$BJkNxHa)@led)% zJuogW!qkc{I>K;AU`%RpYa)AU#66>S%=Nmy5Dx>^f|xnz$Vmn&FWXs!Sqac|Zig7nuW^-!Mf_CAr+$kTzpO5Bq*=_4lLMj>;eIIs zIKT5#7*ZE%-dD;hq*0IrGPW~p=({#)p|ofgOviVu!7#_9_2P5UlmJ4D4U!~RQ@m)` z;sfkdF=uMr8gyIv`Zz0@x04e;P2aD!!DRJxu1$Jhy2(j|vEK544*v zs*h`E+>1rkGP}dg%nl1x_#iR^bCYjQ$!$0;SZfQy%WJ1a=D2N2n&?XO5V^(die=9W zrMt)`5_@D+w2*MF^wgWWL^22Z_W- zSI2SJr2blYdL;z5q&}eA_4!E^rHSpn?r@_$f9R}qF|yzQZaZTw$! zfgYjwk-H_0*Uzp%7$74j*u3Y?4luaUuh}`=x-AG~OXd%T+`rF}r?y6&i}+QZA$X6Jy04 zv+&)G(p;gn0HXQ7#YyYZq;Y|JO&57-e3ByJ{m^*49;iUuAN>H@7pBa$Qj!j2$wc4q z)EOY^=mIon-- zChhl+zVF*V_#fJndnO&(`>aOzMI<~KeBMvm4Zh+}>q6r&+V)TYc0EJy8+Y$bb-eRi zcy{31t~MLgmAQC+*H(B=sO@05$F;1JPZ&Epska=|hoLklycThO54&jF?h9ne5y6be z`G!iN=jXM9@68kjoEJtAUr9nyK|Lh^?Iqy#$U$H6E)*5uBENB>W7h?tBYM@Yz)Ls6 zm{)sEy&$Q7R`tET?lc~Il4C3&g#Zh`Wk=jYv`Io5My zD7PGk{$e+dXtfpYePQTf$NVSiIac|(bxHXb;cBchQ&eU;^N}+GWj>IqgL8+w=Y9Uo z_Rs}my{+CqZMQIBED`fZ9Ys>Vh3-aK=m9BrgA$_3W#FHbFAWKKj_*Lp@7E-w%et&@@G!AH}3E+y43my*9)5Ro>n^z6St z@zS^j)V^O=*!wqiXC7+Fga`pB7Rgh55L9;ujLH_m`J%Y)B=@E~60GrwZbzPwzuS9n z-4}<^SLN~09h1$EPC(;wzSEb@k$fs3uFGS_BY2Hb-=NNmL*Ef!(cLL z#rjG!tg1(iF-}I2Q?w_6omO_)G0!~^(Wg>_L`&o#D z7AugEwnrI)`aaQpq85r`nVu_fSH_U@+^Nd=gd`Tju$WQ0`zS9G_=zN8UQ- zuV;E*B*{A@eKy~^Zqtx*J(#5qLQ?4s95obRijWUvl%oCUS?4>dg*tBMuR50dJ8SiD zX?h_;JtQi@lQ+n7giE&Q>0XvH66yBhKjvM~l=r4hZ`>cRENM*2qw+t^LH%FkAMt%l zT)#fH^ef`;?XfkPAAf%+0ieA-%u4^$6=LLDo*18aAI3nx(1{bpAH?5;91l?aJMs4) z#Wy`kyNti_>x>~ee762i#oyP*-!Chp2!^~o{(e*NV809FZ#GgoMq9ZyEU{Kzr!P8= zQikmBMMn^#p$$ZShYiH{F)EM0VZF8fLivXK1E|#+11?g9a7dYn>i$4nkFXEaIcHaI zGTC7L)GeHC3GqvkHue_J&p7qcHvg5RxRba`0drJMp5usEw}vu5b5GA;Q`b>KQ=;_( zw4TACz_KTFNR1U6fn4iRtq~6fOwC zIq7St^-aFx!-{;OsVFC2KGN9^Hl1TY{p1I5)@V~mT?;;u6PPm&DW@zK7u9f#mRNvb zWIg>dO!Ke}uM8=?9+~UQG^^F_FfqE67zV*!MNxhLDi7K#es6!et7w2s_XXle;PX7& zNen=5$fPt246wx(9pc4uDXoP*UsZV@wUK|vzrUvc9Ib-bfanDq5Zw*wamW%nZkfl--1kc_&S9dMCBH`_t?2X*OK*tuDWm755ChKFR;07I^V!~ zNB6V9ezC5E4kuYhX+C`GpdYi*+C4kV@*V0P3v6ajS$(I)U{54>J%b+*8+3)nxN_|wZ6W!yv(Qy;BfiYW-0CwGO{;uP-g`cxw(aV%v)C~~*wn&Y5d zoAT5)gbFO~U8J^CH0Ioq^h?Ms}ZR8-|}2vyprqF$!Km!w_b5mQ^zq*gX+e)27C z)Gw7e*}df*s0~RC(M3HV#}F7!y+u*^Oc+92I>@Ua;e3X=N+uRbK1k_=%I~RtHcS)z z^6d0-X(+PQq?5EeH(_SOBdogjEs5!_?@s@I&xMhy83G3BXj|M>q1YF45~la%yKW4P zB|b2;>{Gc8h_$qtk?s+Hhig;Pj-M#%ttI>Ok@_L$AZ`7vptpH|}<&;yjJQOi>X9>0PIlq(2 zl)I-T)p>6RWEI_H{-y3Qzr`v}YF_T>d0AmQ$gPYv^qpvnE-!NrOf>FV7usXp`pIO?Vfg1ZDAPJ@o`1~4t%8{$Vy{R!^kQ$UmzQ6zy`UBj&o+Aa)j z?UwJ_4AFHZhAqa~y*%>2YV<)24TFQ_HK*xiWR%VeLY4bFn@0K2nDQB_lcd-;lTTWOL zXtlWkO{?Zd_B8dSp_CK92jUaIG0BPF0>Xqe>Yle#*R5JPLH;%V2h|&PuEt8|pp{v> zzu{p~U*572>nlax;i`P`6dWIvPpNxVZ<%^eMsBEypYG?vZ}v!&q6>VrfeA$!cN>ou z2yCkWcC74{DUPOg$9~qxO=Iid2py#9g*Yn}ijxcs_{9iN<_ zpF%OJbPRyTy8Ap;^7jiQPyljx_=56F+Z+B%Ly_?$3#(s}A~SihC-ml|`i=eZaQmf* zI^y=&?Fzk(g7TY*vcV*JW#cZbGWT%f{$X4R@1Rtsk~<%^P9>e2*1*JNZqt6z0I+LF zYIpHuV8m`H9)+QLYgDtA$}WpFI-62{3TYHfV?pW-1d>s-L+IB%K#|90 zoYg_U{4vh)IIc--(m)T$*QGMm?)Ux|V3!^ecSZVGxjC42rs>$h?)TP~%^>*a8^w59?nTwK=&OPFS%y_r93tNccDYu&VxjNt71t2iP zJ^Ie$?34>@bXgU;5OX;~AbJLvDeNwDu68$i$GYcXjliGn4Dbe3UaQkSw8nU6Wu+>6 z_Y}-8oMw067;>$=8(4%p$F>mT8E4_=0<;P4ZeDYssOa!8w8(AZv%aJ8>ae87#78ds zXBVFuclQLF;{2j`9D?7_SY80!Q7d-WQEjHiEz98j4iw}6dlr%b>P?2D{!HmX7^O@> z7)dN;AITcCR`C@@{kAJmOWlR7jD-gt5#~F|U0Lfhi}ZL*vD(;E|MY!P32!5`!Ye1* zhN1K4L$6WF9{f5~stZNvtYt?i3L{sy1H%j%wC$I9mqqH2}CvIsjO7E0=uED&bMM=3h8`FN6O|NU;&|JTd(x33Y zn5#M|wKRcK1@ z-*h!BpZG#RM+?UyYdqtq56kUROVKd_{1;>`Err`QIHm4mTuh)YNm}%kpvndydzHGy ztwFmNhY=Dt|3veIhJ*@48gsJ0grgF!u$Y|~oAsFNHv167n$S4FuX6KSm`}bVsZnAu zMre)}$E<~J%hih{22xuUScg!!$zip-u%#_^-($lJ?J-PYnJ0#@)7+1}NG}L&5Z@Oh z(!(XbS9y_k^L3>addKlbJ4S=0CA~er6a%OEUs^_bq<2*)BCyfR4mPi35Lf}&ZwU5s z41Try#Y8*DaSK#gugcT9Fu{JR+tNd$? z?QUsl8`#X(1DShkmE?Fal1wmI$+^M*8t)!uM8=sP8oNuonb$_cc53+IC@?}}{-zr} z5Z~AI4d!okwc90`0r4R2g3(ma;q|V}kMkv)pUf7WE>#_!K0MH_Ow@%=Sj%h1&=OTM z-o2<_(?LGFq4h>68uaHeXgxG4p7MJIrcsu1qAITK>0a~q)=2O>x1V=f&(f8T~^0#!0+uDJ~kZ%PV9wsLL z2+abq=7rKsox7o>x!fB<5p+IW2T+4aI8a6oO^ze>r28cr6N=~=P)-9t_9}n3 zGG|aAWCc}Q;enR!Chfd-oDf&g_JwJ1D{R6edZN_HxW&~PikCUW=*vn13>j$}Xopm) zKgUW@q|9_!iY450y7q7E8pgYS`BhnXQs`Z2OTx)nJG-6va}X*b0Us}bL00}CZbm87 zt9E}IX92XrVWGP;8sb_fcUW0F4M|Na{Jh~}zP9oJ6>T&GF7i*ruliwtpbhV~j7aeB z3;>4xB(4D2i@b}x@u#7vTD+jU{`Ef#-Ffg>^F3ekVN%-Y05m!UCi$GtFoRgIfNl+k zsO;KtFdr9>1hewFtnK$I(J>3IlS9W4uiIVg-Z0SjTssJlq@(c`guTeyu0ZD z=vgY*k5vE@*ypsMaZh%R(vY$K>OV5{nBu-}gxwKJ2)aSFIE1WU{?l$o?Tp^!`tlB;~LfAxR!*w8$K*s=C4*+9crY6ped6HTXiox3a7RAK+B&|C{q zE2r3g;Y^M=V<}41SBD?1^kugL?dD)gWX>QFMQUS-_5Qe-uWsrw+U5X(_#IRE{>9ae z<8(E-iHqSQ_TpcLNQSDet94 zY2jn65pE#Hk^Na4bK#U04*`A#*seNSuvcDE-k&7SH_P0N%@e~oiJRf^n@U0#c$7>E z=!s51mz#I6TtV`_6mOpw8sMkk0hymt<6h5&90*C7ySN@Tf(1PaOhfG!y_(L1ibPGV zIulywFMto59L7s~w_2=?fjQBgHw`_ixXQ!wFgx28u>%GJcg|vJWo~0l7z*i%5m}w5 zf%G#~fOvJP5f3l>N&;mvsVBPYr?J}w(*pfyp8XgNzXxbZm^E&xe#8UoXxTp6JYg}D z>@%fV5rAAh!@{-wrUty_n-xi-uJ*sOJ8#z-1Q=}&>DDJTw<&*GQi&@Kx@O+Q4sh8u z%#pUG(*k_?Yb>j7Y#JYEYwZQr3#XpIl;gRjNsofCx$L8D!rvMU<>LAPQep|`y@{ry zV|7w~k#69K|2d*ykl6S8vG=a}n04J48fT`tm+LLZsBn4=m!X#ECz{bJulnQzw?y~R zVOhmWl@k|-_k=kJoM@2Ia8I_gllI$D`d8oT)e~5))QW7$MB;cql{15YJ z?&|{kgDkHU=+&uZGaEr%R%JZ^@%DZJL|cK-!<7vG6Ckm|zmRvx-}5{qEcQD-cPwvK zfHh5LQ+n}ZQz(MJ5l8dNOWo_OjKD)?$L)=B;COZXV~j=p>QeL2ij?^g0~G*H(i z4bG7wVg>A85VJa0hwMNSqwwii7-ZY$j)Lf#0^6B3%n1YQ@yBA{08zWs=k0Gvs#mnb z%CS7_R#?< z#K<`<;H2mZjP3cGJi2ht>1ZE#<{1 zVpw;2KzO=4Z3GM2Q@DKGBeLIkiy2xDZysL592;g+=mJ?kZJ5jqcVVd+lGXFVKttWS z?p`KBk-L_WL8kDGF!xt_u=hke*-v3fqd=k=Zq-Qh^EqLB0$oLi6-ft&6&t~swsaCJ z__{WLthi1qQC~ydyo2q;w&53H1PK^|RnItIk`}tX)F$_E(tsbKGtWa*#*`0rcXqWF zoqriX>^^;1WG5=4L2u&MwZL?HlU^1E(H2E+ESXS4iUbFb|Fh@=5+ThdF=;L&>bjK5Le^QJ3x-d9O};Xa#5PpXvOF%xj-QHBo~^& zkaJ>and$Bv$pxkgTqGALB4sGR6EobEF-Hz{FC1($Ul;nBaD2*G-oC6nHz2+{djEl; zmU)I+dR}9%ftu7yF+*(^Lk-g-M9OX=&NfeRHqa+##^I4B9_NyYRhdl8Yd`V4rmI41 zQii(o{TW&1`C*)lq983KRrl)MetO#dBfj6R@&~taAUgUKeiY5){4zR}TzWwOu=B#r zbRUe4zDa|w7sd?`S?1y84f5$%NjUerdX6d1y3oqCO+QSMC_miPCcTYxC`|^3Qd!rs zm|UDyfV=SGWK>I@GKbXuV-Hbb8c3~f7gR)T$~~q2z~Lf*cEhVK3H={b1(84YZS(fG zxmj+g2ep3j@jN7g{IclT^5gp%0lcY zoIa;v6!RcNVsAXV2+v+^ZLxrSx{ehpIX^REu=#g5QpGfy5< zJ|rpEc4j@8jG>-2I>ZnfxHNP#gnUrUj>VCdMSiK*Cv7AyOj_#749po*E#f@rngFB) zN);0!udk;zS^Z_dzY+BVk!?vMr9Wf<lzE{n!)eXdeM7+QWIajiyGnJWo)}s(lBT zXom)Os~7V@zYT-hEw~u-w`U6Guek*!Ns-4w0BWe)Sa0E>fy?4PSYCYr5v+V4d?5Vr8-|~F+hpzw$h!5zSS+Dtu?W8gj-HPv7Hp_q;0+a=E8HNa< z)yDu3)Y5M45JN~Vt;#@hqC4$GM2Zbs58#>WOe79>Q}GmPFVm~kN{p4q&cGjP3iKQ7 zUKIpl78Bh?C$a?8+3Vf(8tfMH{DTzfD+*gt(!r4pT0jXvV2O!J4l{XQC?p}MC^GPO zG3xBa?&K$WMcz>4FX!~bh1GBOqU9{_tEWJ{7{Lsf;sW=l2EemJq>#(F#hNldgr~yQ z6rSL|$#$8tmd=jZ>zW+1Q-L=XS7e%00P2E_Hv$R}X#44CtP4#kOeU-J1116wDc71m z+Vr}!mF&b{631*O_bYuH)Js~~w90RdXG&j`)?oKZFN*~%3gzy#!E`}HmKH-~gnpyG zi(uJeKinJo*7_e~Mx^1ku5Exwc%5>A0#bptPxh%J?)MzR1ZX}8c_i#lbE;y0BBEpt-7Qx_O zv6v4~?WPhkg%EQEOx#TpJ8NK4+*=JU^}4}5Ag$P+B!XBpC%V7nS`2aR9|O*o*(deR z0+*s6&9Ph)s4Ets|2z~kxGveLyf6M7m(eKSoRljcZJ0I~_Ct5GAz``vi7rBLsD9~N zik)#DnnD#zG}PUuGDN=At&VNTw)kgx7V3&B6SQ9v9P0i-F=N%<6L5P=hhE5&W8L|a z;%Op?tn@%gezs=JdcVhW`zrQ%d@Kh59XC3RSE-jlVDvd|F&zNkb!`CuRT?8%y2HtG ziUR>V!Yswoq|rD=L2owdZaYuj z(qL`UK#QWA9b5!g&&r3wAVb}))1q%vl=pC46#andv+l=f=D+lh!;J`)Fds+t3h}NA zMX)TSd_@;uVN-O9&ScQI$W-!>Nz9X0|0MceB13dM>Hp{BjFOcYQQa zEOxNCAFMUh0XctWnt&OV`)c;MN{aFfTpxNJVy~=iOTM)_10D;txltd!&koXZ6y;@>(i{**nxiym z4ig`aRirUYm{6h$81f}1L!I+WJLbAyrys&Gwenm4W6rCe2%|~|1Ai51zhJX1DStfL zMT=NaDb4vEr2DO`J-wdO%Xo;x&RRq<640PN(IU5drM~2;Fzit@*iDOgBVP1$AeKba zoy1Vc89dGpK zVE1nc2-vlh!)XRR)-YDPQqsXuECBvE759`COq11(Rc?cUr~7ZGqZ)gv{`nU8u>G_- zuv(~#SHmKE4<{csVcqpZJtM>)%6mpVaVapiEGyzCTs9Q?8R^;>YG{cLu=)E*Axa7k zY3Uv&eVth@d_K%_u-AzFctcgTpJYV$ciDc(a^V*}us8J$l$ZP2_2A7f1d?C=9V!N~ z1?xx8TJ}-;#%yfr=Q}RZH`F1X+|E`j=cUk9t{a3I>~5@w1Z0er>OO~_q{N_Uxs}{* zT)0DwVT|2)+|O92(07bme^Ef}*aemTsp)V-gqoR*AzR}cM3`_!^{8SWMi zwhZ^@QcoCMXXoH>xgayb1;>IzosfL;XAmEaWsc__mW2fLU6$pZI4aE@L=p1$9$~k+ z9m|4`Fv(p#5w!DO4QQW=63(C<7;t;5=tNLJJ3?r^V}KI2pW8hM;lv0}ayL&z@u3dx zmGLi9pI4MU#W;Fck9kaTkCGd%f1Q?cziKdZGWYLctWx*ej%Ee6ha#wRv>eb3{v~8? z#hEPN3HI1FssUYvo*(KqC=3f9mbw+Q*i=FkvlWPqDwtNO(q&CkX)gn$3*|U~2Eor3 z_9WSg&4C}}E#NfS5v`mV1mIO|)L5&<+VYw}Xb?2IZR7Iv@8^6IR?3`6oH;zElOT+Z z{-VN&{A;KVvdl++I&5G4-mkang4eh}Tio7cVud!W$oe+|erJjchbuCvNQQ^DBUV(W z%14GmpXi(ERk-_jsFLny|08tQuX*CCA0ec5SRmjGOzv~6%_6`C8cy5rrr3Nv1!b?h&2_FIz* z-7w?pT9_lfaa({P2OAXsHOfLdJ^vNTwP5gcy?(Vt1gsA=C`{UG2M1fX5Ld|m9jLqI z$cDWOs6%s>Pi?4<*!T?5m)$)(Sh`z1P%n0q(t79_6ngNWuX>a-c8TIwcGD%kfjZDa z61}$v1fPnxmOOi2LZ@gb_*guTk>VgueDI>n?G)-Xl&y8F%E4j|LIu4^KG2}D|9mMH z2jiTca!)e=6EA%~jChR6X6XmvTkp=IV*9gsh0X){LIejpdnB(Pp1)K}A>N07Bu^l3 zsPW=B*!``I5s>%FKB`4xVSlRiL(<5m9yC{NR~|{wNH)CKUl;c@CA+yZfk41 zG*Gl7MhPyuWhyj8`dT_Jsn|PE4eqTv%9xurY{T@&GGVpy6mD&>EydOV1Htd@_W_L5 z0y}`x^~cphQMb|{%G{3v5pKz2Ee9p`e4Wl_ne+-h7DCVU@mcLc0xR@e@p0%UZ;Bc5 za)ajjhL38v1=vI}$X0!`T)eRGExL97By>9j7aH__LT_-_6p)=t1*R22Ta&c&LPW~I zCqCJIYpB61d1@>uD+Q~}-Ow4z056sf?J4+*)5g>8S-cUz=A{bb+aaV(DKk*XLxbH} zIwgik*MG^+^{GLAU6hQtCFwGcojU?S*~94=jMD|DK`sETa*r}FMH@pAioT~r>QIqL z{E2oN?06c|e%xZG-5Zvv%AGSzMEi{%0@;N3L1@kNm0w zEbJeLx*JB)+xVH$w^lQn!TxJ5#2b)uzti|I^M9rLu4g}A#5MbvZUR` zq0+7N=?|H_K-(*{O+g-C@;7ZkpF^_&Pq)>sR@^=uVT{JPo~BFHSmU5ZndD80^7LaF#TPA9NDFlwsZ z6}9j&#OTLTcpH>ZheWaT8%ZxEG#CoZVR%B$tEM4%rdeyC7ZBJgN(FI)6%k_ ztfQtVN{g_ftf(o1qO_wZilVeAD=Uhk=KFY_d++O=){oEk^Z9=M`1X&!^SVFIJ@?#m z&pr3tbI;w;h*;V`z>4!oQ(^2^&m(RY`gv46AmZCC(@Bk**+XlCb~^}*JA=&xtI-$i zb}}}T--8^?Gub`tZ6@pTBi!e8m7{E1qlw?{G!Kkq&~}Fj_6@&zf*>DlXY2BcSOSE4 z?)*=1@3uk5%0aOiO&+v!37Oq>X1LiCdRi=iY;P3fnAB~D#HAuJBWonqG=jw9Xh>}D z67%^&jydbi8XOwoP?GMAkVok_we%E(7O?*{s66oH4rLn3@6#1GN&*Upx2ec+72Ck zv<7TQ@XMiYeLgG7z2ZDd?^#wLsV~Al9SZCifSOAob2*$DPhDr(#7>tk{QrAU)6< zeTGALCC}{b3X#UZYZMs(MGj>|&8t=nf<#viESP5LgfM!&k8%q6RP4X3h~i{Yavv&? z1JM-0j+{J96S{7sr+VPB6lW$CDv{QaaR6_zr*uIMs+mG34VwuiImFx(8V3B^!c+FI zQlA*m;7dqZ5sSo;HqT*J%R>akaRCYR#i(Vrd=i?{qhb z5O%sHpILZU0dR=&GMoGSRO{M1!ftYp>ghD9NfoR0uO~CQs?E@h#7&s_nB#8o73;p0 zsd$awtug*=&Bi+3#}G3wPfD1dsBR$7D~lb~7Bnyki;%7DS>Bis?&>I_G(+)oKa!(F z4gbhG5`PEXx|ak1LOW|Tl$5m+LOW{lr5#su3U_EASj>AJZ#9w*TX9}`&Lr3kjolaMejyj5JM7=Q@(mw{K>;chQG#i@q0$o$=Mbv_HV%rC0sA z1{&&zyPAgD>-&+&nu3+;jSc|ytefplp4R@H@0)h#yCmfv*EfCNuqyzWb~BIUo1yOO zmT@LR>+2#w+IXVBSs@{NN=lvdF%C%Fx^3&U?iVpW#9cGc7WmaMiMdm(?*EyF0bj9y zEcyrc!7xS@LEG%kJ{BzCyX*UU8it!yD@7`h(`II6Qt>#)yRv%7sQrKdi=MYg5*(nO z$>3ird2)b8L&8&jxn1(ZA$M(x%^u^Txo7;opC6t1y$xi;4SWidJidk$W?mN|l(eUbsW0s#34t)k<$#TeDP!ty)fXYQr zV-{Z{HG)L~RO(sW!=8{m`#>TGK)E_9a-PESY>@--wlph-r#a%ESK(zw-Z>dF<8sks&!iH%-&@R!*GJjEclkBgMYl}Zv zRD3{1lbZ3XOz%v{^o5gHSMBcYcpxx}QX>rm1)OnHx!Xd;?jvKxFoBL$fHkd@6-UJ! znOmmEuk=KBo_`c-RZK#qfoZ+b5O$@<3J6xJn=*9fU=6aSKg4ZNY-g>x>0bxn++M)C ztq7@YNm7HmQHBoS{J?|m+TJRyj3wN4$C)Zz{+o!R6mwXROI(WSGIQJXLlCA2!b9B? z#Gt1@uQ9Rt21VR8z4cIcgSYpV#!SPSo;|8{1Ol!cVU^osKHa%eJ{zd{xc+xQ&8d84dX6l)6+TN3{ zz>n}?2v?_Zr6D%O4C=6P0WMZqnC_#A=uy1K`6q3e=`0>xcnnakF_r^eao?=u`+vfH zmwWDW4|vvI*plg-fUi%!|4ZOIt1A-W#@aTv+{`hp>8O+`&P*%S}67vyWHB_bkAX@ z_Jqdt?Co9|V@vt0B>NjsL5^rTRdB5&@j?Z$=L@WHH8$jU z7_!E+YoD$NGE9ncZ=SLMt9nxaL2Fltj`B^~izuYtsvy!mC#1ch?J1M{2zLcO3G`srX|V^o-%O!A7UllhYsqg4)Q>>Yc(ux2 zaF|Fb1g-3N;X0bB6?EVQsmUI%Gke?V{DP?w_GkTU%CAZi2m>iHN;9KNgbkF^S2it{ z7e~^7Uy<8la{6rEr#jhO($>W^3>ff@Hk2$O=ioYBAT%B zBs2+5C-+q}lzHyr@%pWDYrO%h^W4~nbk-(T?+^%nBbaJ!Yu2f}O{D)alDQhjhktLn zT`(g61>C*zRDtWry-Tdhpvg8W&wJbl6nC%kFA)U^whB(~WrJYs9`Mk5ogedcH=kur zk<5V1QwUn{=pB)zgGmZ~S1l3K+IE_EO#o63OM4#+)iL{m2nh>@`Q_ue7K~~AMMJIE zEW!P?GRo5t@NSD9XyIEi1o)ID2E%F7NurL!fPcQq!b{iST1Su47smb%b`L4CC#D#1 z^+UZtQ~<(SofX=U_%&%uQi%>c>!TZ#{WT&iF$BpbgCIe0&%|C$J2PT7hH7+;{g~~P zu*G3u_P!J-z9`fuu|^REb|-OqOyqFW!b=_MHWrdzJ}c9h_QWm8w_sKy54=oum+o%M z|C*SeJ{K`Gh8hJI$A076RH!Pi`YI}MhQBg3EtX-PGu9e%h`>DmK3zj#pU35~2_~@D zCnYsQTSap%pMteX?92kE)fy45xYr0BZ7xcPXeO=)5-=~pyE38?mQKuF z4EUd=BEty|;VCh!_fz4|zI3fpV+VU>d*AEH2tD!6wL8-Q5|+xV$Fl3TCJQyif~~R- zn~GddmMSd`=G0Myh{8T*Zb^9vW;!K{6a*8m@}nCsj2jIQu53pMY#NY3Urg$*svrx36YY#Evs<4r@3RUk*^Z8TbbbE0ih(-(4g4YfAlL*zX>XG7hP0`@Zy z2J#d+Gk^}EYwhU*#iN!cuOlTsvuNJGY2DvM#sDr@ML;`Ae(LpEu>?C`(~LEa#p3pC zdtJiuFq2-@ zx5O&q&|*WrlY4#iwlm4nDPWn`+)yMzbP9r!5*v~d64tdC)P+_7yv;&Se#74*aEbnU ziHcmZMbUK=Y~!>lDWRzige+ALf%l%}ED|HW-64CtYE`#i||4eB#ADK zhN!^LbU(=Lu~-^`z)^#YJTq^PRf9kXFQuesAv2i86xomz$r2M-B=oRyo^0b%zbL|x zGEpif3t`K3i)BHQYi~obmJ`ld{($L=If`N}kszkESHB+`tVEYcU;(p}6@+IUBV z?^(iKb&_$=yd*sYFHmD2=PgK0j8oX~Ob`*t%(S40( zs!3m>V^0aZX?F$~60Y15mav!?(@Z6UNpp1bUOB@T_bAQl#o9Q*CXD`pn$fZe3C?VF zmXYCPk4iI=N(>D0NM!4ZXF0^#ho}4D1j15SbyOgI zY05pX)r<)ORJ>3u%yAR#g71m$Z)tCayeHzD=N?voQwHNi_YckV2ES9QPGNXI&HL2n zbjQ;0UU-VRGN!rHq~Hbf<%M}i5QLSiI#jum%$%|LWeF35DOCgUeH7TET`HMULw*rVq}KC zOEGY;zUo_HRdMEJ8z9TQyHiU%$q(t=b7k+8U6uo8rF7UKOtN%}5IX$b8wTWWdlrei z)Y^j2NDcJ<@(c+rz9h#P5aZsZ+2vjdjx>F^&>~;b{H#oIXe{2$O{M3ic*{c)qakLy zd$dUcWf`K_-_yroqep71?Pq zjZMg|n(qVsG|(5*U?3xDKjF(5e;~tPiQ&tp!9WC;C2sxIvm`ML>?veLvddA7$`8Hj zzP?ZF0#92XWZ{1L*?|;SSaVHT{y81WwI`eUDmP!hX2ZB zT_h6r!0?Ss)+LS|bdP?$mdU!*ArFUIto@+O zaX2Ch;MY9BHJMshI&NPoOB+4fdMT4NcN^qi$Yfo;%}^3CJ`$?Sv6%Jf*Q!j`bq)nw zS@J8Rt!FY>Jn-zPVH)xw?&(YxkIQbw8@7$`{kmZr44=%@x={cTyk6zT@h_8glK?6! z4CUjQEDX3?)mo9sx>=N0tw8z5GFb!~`k7?~8a|rIx>eLrt-!s@GFi84P?Qx0<>5@$ z9qN~|0%K!nj^st*^vDMmeIS!{cSJt4bzdfnt=vI90b;q20Po$Vt$Q+A_rZB)q4Pw(PFQdO3#b(gP@n_SLhKl(b zk4z%RJ7WpeBBaY80TRz)G}gw31=M_2buv^I?X>A@Q!LSX>~F^RLIXf#LzXA=B$-bO z5Q{;U%nQ=ISPmal)2xS!{pm!yE9KU+i2}&%??)`PIkAsxma9_Ra5q@tyvg z%-hp`9KrC6yxFwHNzfq2hHiC|9p0^!p}zrd9Zw;*lv`{-nevkeg~)@%MI@a$RE@Dg?~I9hP)<&MbnJa~pK&+*yRb(B;(V!c>i=N)b7ht`B}@8>fu)Ps zf%H~?D-aB9Iaht?VxP~>zL(6M3Dt6rj)(@TrEehO5|6HeXk(Ix)1+C}Xd8x>Fo3CK z@_}tM{~@*xNl>%kNdSo_M;{X*r=;nnG@GPK^P><9H7T`pCSkxRTkyMBRyI78RQdU; z0Li;bu$?p_SR+L(A#yB9Wi!Iw*s;-2Y3bY34*eozex?xBq z9(^7z?U~szL?de_K8ut|cj`fr1y3OjZT9k_Vzvr>pzk!E3A)mB)7$&Vqh_Eg!$o|>f@~&7}*kaXXJ$|p3ZEQM|ECsxW_L4Z2 zvW-dcLhyXkx~Y9VQ!R}mOaq$KAgYr^WR$MKUwnWjS49ErA#O;=~nN9sS z1z$lvfUo@>0QID@epE%F8z`WSBGTwvAylF60b#)i`P8&|Bal{oS4~eHabmK_!~MOF zmQZ>*lFJ+$7^W!7eP}E9ib$mEY`Ija(T}3eP--v9oo=lo{NnPomqo;RR}&e?H(|Ny zWlq-1Z;ce)js+L8X*)WHnZdBcW&8G6L_}vEQ5(l%`3Bb{S-NviZ9U_m+F(4#Z#btf zinXOvmkGB~BBB&x`!UB=$qhOR}oufSIJTQo&7eU@zQtq){Mxdsyx6pzGtK&wL>r{oMS6M~RlsjmESUb0yE5gS?3ZNfS`fua`1WFH zQe-eO#IH=t*^-o!JHr|T&X0Wnvj<~sf1?JtPxZ2k8O=*$4)3bd^vdL$=hZd%Ym$UX zs5IcHeHgUTaU0XR9p9RO27@Q>p7w_`5bauTk8ib5{7B5#QAAntCAe_FBs?A>Kp%~K zc2eXj&v5Bw5yGikp`lIU0IyeyHG>JborOGVazjfYm(6ngld-u z;8bVlGcao>mOMW!(_)qz1$FBX>)=e4jY<0Dg1ZhdI^2gK4IqpE05#$3ot^|5(H zggD;wN%EcaEFeM8e3i1tW0eWki`mKd|7DxyPecGG8-RJq_m==DO_26TRz4X4BuMU` z6!A#T&lJ&ce?4oI=WsMS6JWejEv~fdc?b$LRq=4k%Fh9|Tfi2l&jVhSDe_f-Ir7#< z-2JDQ0iONT=Kyaz66vRtB3}jgG;J&Z%sL~Cmu70kd8UilJ%_mTng1FvD=SAg2AH== z1$bkoRs_7?Hh}9^C4iY}PC7gFH|m`JQ;zKf4XMZ$)qn zlx>Uw_kstvrAOH>5igC;Wx&bT3oq|)c0wEUL5V=QCvkxFBTc36!?gGAYx8 zOM42;%w+YPlCwGj_4A}9`R)Or=iJOR=>g=w5CNQzrUaU8Ny3*v$ncbx*~4Cp5D3c; zfcoTnya8-Vz7bkI76F-NG7@)uT$1RmchD?+DZ({_6A~9gR7T>SLQ{*9B42`Qrner~ zx-}7|mu<6??>56V{c_CzYFvXL23JqT#Yw$6ewitHPH~uU}DWyNF zlUkE)JtFt$Orlt&8n=GUU7(zk9%;v)c|? zV1;DJx|4eMX_LZ`-K||rTqOOQ7j>^i;J&e?$@f<`7N&AS^C_=KIGp>c_ZyRh)(oT3 zd&T5}*e7E)h{7Px$U9?wgm8+jQ!A7298LliqnD*xY8Zg+DN%6%(B)zLZ(6|9DwHcHL=kxqt0rJRkioUSg=IW2EcNs&uI_tYLL z6k&F$(3Mp1&&6y=zE9JpMHiqVk?B3YHI23;-+mh9ydUd-b*q8>Y1Q|mJE_-d z*e^}Kd%%GWww*>92Jw<_$_KIix5G3d!2Y(=XxN9bkZ-Ir`Tpw0!U_T!9_fnB5zd=_ z8ZAf?dW<484;u0*T(*eQh?xcXYCeh(m?wPCOuqH(0GrM@jhO$MMptN%(Jr3yT(kJ& zSpB37LxNuJR?}!4#}jcH5qXeiT0e>Pt`|V25mys3R65CU$=wnQ(5ZqnUhbkq47j#=#Fo|j`dUAbBbY5d}SSK2>|t$hjU zzO@bMhW8rekJTk&K%*h~=5~so2?Rt^Z_84#Db;SL1wLLbl7u}!}C5O?S`b{m#iCs^H9_Lx-q?XY{{=1E0S*q!`F)6&67d; ze=he{HI(b&IXtS>UQqLz>yyr4|JOEB-z&! z3XJR}F+0}8@$5V1O_$D%70;EaME*RytNDHE)W#f=hnj(3qa!acx~VA(jbw7DFgLdS zXc9}!Y`h4^n|P_ni#<~umKq%4 zmFVevQKEie#N>y1A1OW7ebk@*Cnuo0Ll_mDejS1={ve2b%j90nrrNcxH8DkkE%DgO-JaamwuIrvwfeKY<+~5c9bLu$;6%-#J z9yiGMhTnU0?8W5;1p#9#tvf*|D3m_$Xkfq^!VSh%R2dKp@$UxPRUnkBT`}6?t(vWK zsO|6xfb4pRsoL6x>~@C~Xj8pcpW0X*E@C7YDY3`Z4^Ye8U*cJ=uYs(J;3nJS&Ic!c z`hviV^KH?n85+k-Rf<#TYIkE3M_deSU-z7>Wu%RDpZ4-T3)SvAj%0BK|OUZXiZRJ;E)F{nk-(u#GiMc%nXAsbxYCgt$JFv%s z9U_wGe_oLsp7nh(w_R;i@N&v$DFmq;aBFt#F*fT*dMCn|W)F$dCt{}_ZSLz^Vh*zy zRv6@2OtH^f)k3*QF~ZF!pn-*Xl3R0$s=rKBNVo<0$Y-AW%R~ymoAJe>~y)DGEBdB@5oYHqlP=oy|{B^q!V%ca%}PLib*Du zK>o!Ll{!h6c)%gH&0XssG0iQEDB*^dFVTpfxSjsYN?t_l`G~2Gr@@%WxJVN)UX;|A zEwWfMXFJVB-Sz(?tb)B}O3C-)EK&c#n+gKX>5xi^B214?Q@#`&tim#Ey zzB)~pw3|7_-`={)h%*U7h{)+upTKg1zsT)A8v@oeXHR43L^~&?i$0nTrTfO7X&y0} zH}Fgl=~I&Q)p~FlBm@)EwUN0g$qc1Sz7wF}u(UQCYh$a3cbV?sFhO%e5p{T zzL4r5!ElkFMmgsBAMR7h83KNKUBeBgHxD%@g1YZUOeItRkd8F0)8FObrA}~OA`p8{ zDE)qK<}71?;$ve`#>ntFfDSORj&qN&3PYONKa8!Ze!0v&7Ai7@Yac@|T@j%6tkzsK zSO0D*U1~)Ml3zL#Li;TvwZi@~_q$G&HaOT3h0t#5;8LYxIeft=C$j}&mZ(%9Zjs_&jaOwwS9=NWfy4_fD=j_CpY)6i=1;6 zB9-P|>W6N`_h8f@dT;{OU`$;|V-BUrfsO=IH?PJF9rN5=UA6*&=lv^_qg1Tj^z+|BLgIJL1l3=(8HM>lRN{r09U<<|1B3B$PLr*Rlp4+cJWEZjrA z?M=aXH6aK1#VNuZt~trh%-6+q_o?20W90teu2Go9E|{O#hN5b-+en}gQBya_=#o7l zSm|b+Y@&nw7sEp|p9luj{y3M`p>q!UHy!zplIiyGZdxk)SKvAQ=MhiG)e4w;0PtbU zER09=rXQLp3zL|dAz-_u_~s13@w&xnF?jKd=h&7A|$|B1e3}`ATZiosqK?>u#`XDK!@@7QHQ@P>>2PuwwLaTHEq(u#ZB(D zMiT=YV-Aq+RYb@L(qi3zCF!?i^js8UD*yVk}okNtl)-9Ewerg!M_nSocAW ze_pjNRAMwCv!on6H_6C=u*-i zvt+^2du15qEKa5TJ2~vO*cC#nD3!j0qlpf)B$YMB&P?^kw2_SYRthtfOpf$wPu3$( zGwEOSP=mzJG^&AE*>5A9=~`*FMLd!!?W4t3pfqFNABZT>LA53>T0z9C7!b1)OA^-Ctu1I<=?)v*!( zuPV)gN^nNqOUw)fiNzsOw!wa$3 zeLMR=l2*nf#)$%2k?Ztdn2E@=26xjKgS)sn!qv#4|NH|F+T+amIQI`Bi?OA;LziXM zYH(){g>A|_^-)DS+`pSF#A^Nt5mXkf)~i7nO?tOAcrjrkz->-aO3xNUA#L|c^ph=O z2aBF=xfTod53NI8ehy@GD^oI>ys0BlSEsK2l+ zPL4{iZ;gP>Tqv$VdUH?v6uUOpm1IjUL28~d>}$Kt%}GvQ7{6N9UvUtBXXxSsX}D&y z{%-kWY$=T*hnP|yA>~_~6N1R1Q!?4MjTD{`r^8)9NOcO7pBf8n%Qq0A!7YK>lvo>NKN*7d1_)jg1K&g4Ks@uD$|{U=#x(EsWmnI1kq!jN`U?U}n=r(tr# zU;HJxKJ04!gjiR?nEvx_jDk$ePtv!73F4nkFvP1T#)`hge!k%~siTB$))fmh&SDG)|56 zWrnZUYRiBK15h68-Wq3%)P`6J%D$+GiItuj+Q@adMT4!-ifIuPey)ODa7IiJSOjy} zv~J3_`8Vr}vuOfBCs8u|%vfJovqtbn47w?WXvthwG5ds$@4+5#O=`mqjX$Vak+`oTo4KGPbg(2y1XYFM53(gJo zDg5DB#EB7X`pyUgc-gPU?!qi%jILOgd18-;cz$!cW>qviF@ah5=U6q&hQRK3rrdi(YLVK~ofL_@5%~bVH$G4u69#Ykmnd3h^aPrjLyJ+S z|6nW8rlf>F8KPTu%qhE2kvebj4k!C?Z(Q)`r3H5(HXwhPyY4Ts0dSvs|a;yBBRQhiG(0xGZnhRppZ2ZoeC6i1dW^-SH5y?XFN0~n? zOV@7(yUS%5WiKTYxPUwEsW!~Wx7Y3kg<2zNl&Pq?wE0k5Q}E|s8Zo`S zKdO`2z01_*x3um0v3jkL8Ra}JrU5Hp+gO)!hX973Z<{4$)nySxh-fH_;31l6b_1{3 zPQMy2&lD=w4zgCRuqp2et?)GrpUz9@V>ZNKlo^HdBx1ov7I#s1V-8t`mNiRR>~Tot zW&7xxK6y_mz!WrTLdUc-b`+MJ8?P~7CCuZl3pA=up9G)(3U zMERVE^s@>`M;pZ6)ePMZF~qp%&`~+KWgF#Oj?%I*IMNCE573w#S4cbvWJ$cihqp_2 zr`+XxntZIgDz>2eNKpSE+mQIm5-d5~-qQ=@pn7l0J?Ec5te6`+R-oz6?PT>08AOp6 zdwHJh<4;s7-Cg4uOXzoy+Y~|;Q0i69j5cl)g=11}+-d3>A;|AVX}cXIMBkWbq?kD` zBKocb0`3F0_#NzS@R8XzCHb<`GiKtN3X5hUiQz_2ezYQ@_0ognNN#(GM5|0XrDi_m zxB`mzx;8YEKG1fdBvpD(sxNKHweBoT{0A;RwbrQPFR zlw?WD*Cso{nao#z!@035_D=2%yc9wIc)|6th)v+7g10((W z7Z$jw?Yh_ppiC>F7EL~^L4NHLYI;XMCv!gE<*P<^#(Fsti@NW?hpfA^k6+HCt6{qC(B7qiJ zxd{w%Z+RD@lKGJgvf4~xoHSYLQ*N2~0?7xU$1y1YyzGWp6jtH8Df#}JSgSha2pVE{ zp0$jC>cK$Dm4uQ*fg^g4bk%|zBNS(3`Pq`ZbNXgYnNj&fL<}gN8CU_rqpT%Bmu0Xi`P&42W5du_h(<73I zH#w}(^`%N?wa8!wbkObRW$g%lJdMIJ+_{spi)eVwZ4pI@|I(E9j(Z9oJ4bUi)M(Pm zH_YZa|MpNCmy5-a)twsKnxwxpiN}bb7qPs*mUTN&hH9{N#!Am`RaaYKAAeDkE)zRN2R0(;o9!HAnPO2Y z#?;v(oR%W$2EEV=t>kG_Oc#&EPDhUi;Pk=B|Hx#){KXM{jRUz-PztnXS%X|| zskckuuqwq=WDku^>)`BwDMPhF#=q1O8%TpQR!?GCs9-XPr1Nze$&{3BlfTk_zGVJ# zcMCpq8u))#sA7bTj9*?ZcXr3lEY8Y4hIwZPJf`I$U}kV@aM=b;d-O@?lXkv*^k$ut0|gy^<{(6X9cxe5H-^re1c$ zSag3+1V-~vi?`plB{WLBdyeUfI@|Xm=wx$NE>jbVyeXzUpqLh8fVbMBfKOxcHj~$R?v6nspQ!yLDBEhM<45%7cj zWcj?V!>F_>)^Pe92S`lAtf=;?1ZzzoygjhdZr^&Pdn)td#{14QG&hrWtJ8tom&Q zuoLnpOWO`<0iu&OP>e*Ej0r7(QgFdq{}ijV&$&u(X9v^)Q$Xjwh%kPTGxo6MyB(6z zgWS5KX{E_pxiqwLQD0PCklU>HDVi9eQ&5(QRrvAWQy6_xU3z1C#tob_h2%w==ZH*f z{u^XY--T58KW)BbUT;Ph(0eh^6ZF#eqE^?_dBiy7ZC_MlsYDizP(BzA_tHgawh+nd zv^Z7UwQ!MP4gDm}wB{`Hxk%H6^+k~+SlR}=tHw|!sKoqbv)hm59V0ypJtz7@%-g>P zzDzO=e454GCkx33dK;O=3*7pa^R;`$yIc$JE54ciZN|0wjX17Z=w-Fyum_HyMR<)u z_k5i<=%8PYd+7)$TW5(^eci7Gi`nAC{s<}plJI9eAsGhKUz9KD&v3#6#Mr3;O}dol zmdMAPVKiTR`bxkFd(MYuUMoT2gUNqEwJKD5|LRMu!?Lqg9fT%z?kr(wse}33!c0p0 zYtj(WZk}85b8dS;f1OqNuH3R`_OCRq8uSGaUr&6&;e*|b!|5&xl)~Bz@Qo#&zbQ^6*|bTSYTB3~<2Srs8?+|5&RFCmhyXpV01oBz--+eF z18X5D%|T4cLB3Gb)@oiXlFlVMfL^0h{V~Y$Z%CwSAB;cMkplK^0Opq<`f!9bQWMkN zhGED)CZIo8a#N49!~HEuz8Z$CdF}xpSEB5_h+fEfFs1ls!n`TTx>x(jLP?R}ySJu~ zH}EGV|{K1+$Azi(SmTsN6e7U)kOpw$nC%i zj(8>-62LLGI6TU39O6pGzC|CKHRRR1jZ%T3th)fE! z)t^LY5+G_{n>kHJBcPt1qdS7a*nT|T7SQ%Bu}(JA4aVQyyzn)c>VYI4So!JUD#5%_ zQO?aL)D+5Q^CY2XV5OBEdV0S?na99s(Pt69M1!`)b{wyLJp#>MfD(m^F}rE|)oMe$ zzpdA+Q-l3wEpTe`jKx44NGXQB8?ipp)}mQiu~;prGKJqinkn3(hLBa1J9`8TFzwE2 zFv7d{N7|usr;GJ$fX`7b9ENr^q0SH=R6aA#pC)|RF3{Ss`HGzIKs2q%heOb1x* zu^nj_88sR0k#*@n_X;nG!X20=U=eD}-JSx4TEb1ga?DbSYoHs2{ANAb2oa^BGg-_T z*`iu8cF*gL-4cUx`cOuTKY4HVcYv<2#LdG%aI|6+@2eKB{jK#Epij!+lD0ChZ*P{^ z`F$e7p1;!%vG7t}eMzziFJ(Ja2~)UDW+up}Z9K?`t@zU6x|rEv@fk(!**O8QAU>pc zYckuYFbm{h$D4>+^dSM_l@i)prq8B0#Tz@b^H3NkJ<8Fl)_t6WGfWP~u_c$7~Idj@{DR zg+_cjRlhmI9hL~8GnS4w5mTLs}P)jG< zGUIJlSuB+d@u?)Cf)olL1=J!*BAUY6Gx$uq3GNviry6%A@9%)X#{RLf^>Sa8!gfVJ zGY-xk5PLAry>p74q^yWZ2DJ+J?`*@cG(QxjpO8!Q%ukl<5O6dyE#|w+ck=s9d29EhJg`90fr5aaMvGe_{>Uj#D*>Evk@9De3Cm; zv|KkR)_tYXP??e>7%EV6jV3s#c&yz+#Rj@^aP0kHcik@-TIqd~l9B;Wd0Vc#TlQf1 z@r4~tR#q0o#uNmxT4J||@nWU}{z5;St*nUD-wc8!Lt+&L;)M9}x;s!ydyy#7Xe(M* zEX4NHu-Hix_GUlb)7wV~Z;Cx^;P;j2%H#HAe3yh>gQec^drP>^sHYrEMn9t$pb$Q z^I&$?51;v7=)pj6=Df^?Kab9sC9pt!gn1=db z{aww(LPE%Wo0FV986Y}o0$DFcLWH*`Kn3U>s6e|<>!vq!=tpaHvH(&w<)gzFAga=u zKWVkBD}vTAKbm0tXuHV|LG<}ygM?6?;MQp;z+X(^@cK;7h}fs;185!P*K5e^-+A+zw8I*)>*ypt&He|n;?YoWAlAg_lCRA0Jt zL_1Ako9UgYfXY!hTPTL~mKGY(e z_A#GjEN2n4V>TJQi)J~4J+28=Jc2sO%@5Iwlt?}TSB{am_l&0c8C)pynA}KBDQf%OF6nGRBN^yHe zrvi0F5vEEZVnE{WD%E7thLw3Vr3!Y9rG#pQ0eGmN$=_KqOVjGMw(J~=FN|sKZfz4O z-yOEM5P9m3Xh6QV_vn4QV)pw-qNcHh0>XSfbBulj8Y{<>3N1)QNwuROhj|w2N_;d* zY35R?y)UGS3UvtB9QWtR=tbH{DlnsJv$5M(1NyeKXU6CsGOIzi2ZbCwOI!D73P8ns z!?yNb`P$DZj=i3dg?Si6cVWC>q+zrQ8b1U~iB*4cc($xNm0yn)bW#GzX?*Q5mNhNO z!f_-kmEvwwcGh85d8Qs#0o>b-cKWw5meeS%%L9-XS+m;g$&sQxVjGGr3m~0>90MERPN^-ZKIfUuZKdX;UZN^@0YKTjLE{f^_jtwzRL=D^^*QV=xN7 z851<2s?-w(BF#wKT(zTOy_{%CjDf;$B77}LAsk6sAgo}mr$^B`l}%wCW0y$By;#zZ2o=Otsi6*sv+X{O^gT{4^&eB>w5z zOB{64?1Cg+9D}@}kx#a>tme@Hs3znqE%XyZ1=&{(V2wD(IDNFxd*mdWQNzC*aR@DJ z;7ElQs*`ly2*59D{z2O%ZDe**)JB=T4W410-?cVw3C>2>cKne2&29XLxXQ&QBv(mh25^e zT%l=5(Utnp&GN!Gw3A{|=ODL|hva z9nFcxBBgBn{Aiw2RjLq$wM4G?K}1$sIfMQ(D3CtohcW#>I`v>Djuf#`l`O>JznN7i zVBaYsHDV*scM-Z`AX+#z(={CW)Q7%cOtq-Hx@?F_wvX`8C1`$xrkJ zF_2oUeks2%GY*7X#MSEG$##1){i9exJ6Id}on(;dFvXcd7R@Iq)C1~dK@ILq--oTz z%W>)9DQbvNdT<0Pdv2@kc}Om)ipl<|<>usDq_rtxxA4-KTo@|J+_F^qpNL&THc>z4 z$FaU5zXu*h)*uY7m}r){#-xOf3u@z$kUN(v$pBcFWXtCV%1f6)9e{jionjZ#=KLf! zp%bWjF@WyvBeSMTX2CKhv#PDmt6pZQXa#^qpL$X zHO(1}S^klD>b52ZeUncGJn^dZ1e(28Y`~~J@52w}{xmkE;;^5tcTl+>UrbRb!YjJc z6k1|IwRHX@nkeyD0ZYaTL`=3fm# z{(vgOU1K%a7R#8bO-G*c6Jvf%7rA(NNt0-GOhavAjs(-3cK+VRMcfJ7v{3_puWwLe z%3-nJDURTo9rDX#28+PC)^Ebim~gI%1^>DOLs+Si+)JWD76Z0lcA6taBo~Scg062B z>DXnibP|>+Xt+kPS}-UKa&wgE*PZ#gu*#p%bK`Nw?!`ZkZAmvrROQ$x*a3_?SN;V| z(F>*MbtNV5h3vvV4Sbefu+V7G*8c9CNv5up93G+CL$b_-%v-nEmu6022M1$hNt4mS z#NXQ?9_Rz)x@?lY3sG1bVTci#VWJc2BDkNIYr4hE9wqerfZcLMZx&?hh2aIW=&Z$$ z3f^uO76%}&XXD0+5PIT|CMPO?5u20GBE6HWhXwkv{7@H)UIR6t!<<-a0N1SfG zWU6I)N%>`MRE59j@Fh}n_>6fSkhl>rjB$dR0FrqlH-c;tbfdgrD^*}rFp83nzLJrFzEwsT$eLrqK}6??RSn&yq#zFrYh`5!+3m@x(+?rjaH}DF zo#>ch2ni7shme3Y(r;i`>PdLfR)1TORvi^F$z{=E{oG4&rdn-163L$GXS`NkAB$<> zGCCJZwn?u+JfozXak3#i?ANj2?K&!l{62bRcTATZm4|xl9Z~FO;zh#xYR}sIn^0BY zBqo7xFTBu4FnQ3s?XQoeY{r0zh2-ORX%-x66Uppe* z8}-)Yo0p8G6lzu>P&?daA1$c7F;=*5KeATCqO*J$rUgwQN95he>J0eq<6>zj$M@#s zJ8bGP)u@kRc4*n#PWVL28(VA;TaFL)$@jGUcz~%B8)Jq$y~VVLVZV z?&G7NH{`f#hV-|ABCClIPm?VLWy=2-115z6P<(E%lx z6rUPPycF8mTcfF$ofr`Ws)GsHAeV8Y1OO)8264@5nQne=Mnx?HG*qGFO#JjGs{uHW~`E+ZCOAmBkhbl4)!Q-b| zc$N*5Vw3V`Y4F3vlE&q%NBY_d(9#i0s8c1#;tpGv7AEPE={3@n4v{Y0<}M&w9XORt zjulr6Cs<3Aq(dTeRa6MmkFx+xwr5`Rr-TaWCm=fy^Z}$frdh2>5)lq08{9&;j8a>Y zQW`f#X$w|Y(rZtPD7?efDE8ajVf?d1oK=2bX%v>3G0=tK?3NuZs zpQx@)?g}3{Y;lhQ{skyVNdF{xY2XZ0I^F{UQtQ+VBy&%YFoMyzs=H(MeiX=^77NIF z)TlAH_^e^fLC(fpfI;8{_Y88AYRi*q0$3@MiWIfV#)OIXO zlVmLwrGD`&7jhd*?Iv{fnGsw>PMu6JMAF;yWGT_mGpyzN&m;|<4VAZNhsX-A(H`gS z_?aCabp0tdC0?tRB|{e9%FdW9%O9-6E8q6oz*K2*!1=XF#Fg6?yG&0i!1ymI&LPDb zZDZbeR)mHJ$97rMS^f4WpV`%9`T1wZ{3FQ*33*S$7|re`I0batlLDe|V~V&r*SFiv zzFz0Vs`3_NK*Z{-ky(5}Gtm#aTdW@?(IktZITpRIF|kE&XNi|_E<^z8H9bNUDC3OG z<#QvsZ~!(h9f&0sB<1Z*J53Z?;W`g_!_JMc6l)Ig^dx5xr`oA_UCbhbv2Sp<4>SL| zu9(idd>V-JA_T|orNQ)=zY~T`L_k!&`x}cj*5IDW^~TPUtSu;v81)T znxQTMY3#aR4x8iADk}Sg(>W1#Axw_C1mNvLGx6tot2YV0qS=ZNHt&mN7tzW&0Vp0~ z|K?S2s8cj6;;wB>sUUK}%tDS)h}(T~Zh=sRUQ^Pb%L~Ptz5y>&Konja39Oqvv;-9T z!PZ$~W=70~qPb#Ei4ACy<8HORZ_GBGujP^eO5J|Si}da!jZl3#W`uRzINmY5Hm29C z@tIksz*MX~=Fv^%U(*VMd7G>s5F^L^6XQ7Oq-V$e{%1Vq8?;K(kOq$BYbnQw zLAxIo@ad9_`l8i?C-aqcr8#%i{`ovJwd38?yYfObB)66-v=+S+`NI zXydB!W(94zIzo{kWDb2I8`tY`Csu$+$tSk6WU3|w| zch+=*4U~f`G3^dMLr77hU+qo8Sp^{eE9V-`F}J#0eI=(B9xwV_srFn$@^bt zu0``>yZ&KU_LmRe0q zKY1@~VtUuw(pt zW7T?byy+*aZwrkfWUIVVg5Y@ymB&l*%G)C{TFcCjiUlL=caWSby;G}dteef_GWXu$O(q0(^jFhVP^414g+&RQ>p0e{=^ z$ONFVc4JE8P(?;zVSu^bjz7R_vrah6QvQmD?-B3b@1li-+_#mBqCuV0+RaTh_s-Z) zEuPbz72^>dNfBj1W~fIbA+ws( z(ev^A1M=|uB4ocO7l4QQX4jC_m}KdB9h&gBx==kVvVnG7EQvt9Avn?LkpO7@w49Cg zYRu^SBWxKSibbSR5&$y3Fu=0UGm-%Kp2v!cN89SQI;p6I9@IhV)4rBfyd;4s7@{vo zQ1f5jH>ESlzerA3=nhgsV8K3oK~!zP`4QVPYDZEXir>Xpf^YW&5w=twPqAY>yV1by z{%Mz955_`)VBr5qZ_`5SVwUi|b%M>Q&X`8$!v@aYlSngIrtP5(X|F=_MGr;DR}SJ# ziF~~^fv->!xdc?RIPd{+jt!`>DXH5RC>W!WAJURjv^U0Pq9l*IOF@BZku1Z{%n_C^jcERbRT;dUu< z%Cgvus79X;GhJ;_lI(T0G&=EJ#2W;9{_rfc#9F3grRy4+3j>+)Fu$M3d!V8H7 z(y(Y`7x0B4J8><+O>I(TK=7 z1Hgp*;0+~~X-+czV^4FEZ(Z{cE&8z|WE^z=tx@Nop!G=bM!J1~MWn^D22jln6Ok0i z0y#_^b}S&@P6o}ff2`$4^&Qf5m^AOX@*XHN+&_^;q{4GMa)%{AwK!-T2vl0Pmw?4e zu=QYf*~xZB%_nf^`7H`q3|qaN!AwD9-NWJgD(@6K<%viN0jy0Sm6^^$jkaV)1i9yl zlL=wUo{U8`g%P38aB}rWf0C1AWo6BSLZTGotNubLITZm$4ZwUF3KF$-15>yIS4wU8 z3Z9DKC5D?+-uBBnL@BYevV)LVhLHr!`(lVH>*^Y3S54cWjsR+T30cwdTPa=Zj{H7b0{G?c?<}e5%Bm9+OKJhaQ_ac6N1HdKOsq`v#c9_%w)B1A6 zV=PpG7_@LX`T$v@Ux`^)O~&R}lOl3Ar|Vk2mc}d<-?*L0uH3b;IMfm7swCk??cJH2 z4BTpU1nC`SayJHYe~V{%Qd+K1LA%lU-rFbnd6TlMxH^Sl^QQA)*#5y2dzce|_25o4 z1es`P`f(;Jya#QLonT%&5T1gp&-#_6?A3_yOL{D=NMZ@@mpp^}F#ynqS+R`t-7CH2 zctK2apYDv7gkYH}+OY`PjaiudJaHH>P9I4=j3cWNkZXVpBkbv4f_U;+lb9P`i&zAS z$;$K{TfHh@k2zXxOT9z^OjvDYF-I^cz7I2r9*0HuS?@Ir^7-o{faQ9?07P`COdS-b z&_(@7v@k(6-RT2Sh;>@KFsZ8x1@(U7!d}0(+~zkTWU(m2xx!y=S)8P=RrnM-E2m)F zNZdwzZOJpy0_g#k`%{&_Ch(elfsU0(`h|IOZhkXBM{;lu)R!w2@Jk6;js922L000; zI09pcs$H)83BZ;v5Qi~%I$6Xt#(cU%Y%~2hIo};XbsJ&_MD;Sgw4tZF<|N4?QK7tg zA&`nd_fk{xwj@Qg`a-u)(F3Vk_Ev=WpGlZ<%49Kti+>^_Ow}7_^f1T0+X2I}IDs_p z2z*yy)j^xL!ST@U%YG;r@VQhR4+EpZF!7rD$PnsC1~|lb5k&YKh?i-BFIM7OC02Rb zNNtAz8hV=11p^wL(!rfRQi*aS+u)py5&37-F#3fqSkiD2AyH+`pkc51y5}ZYO>+X9 z|4yjJg%Ad6Pu+bXjsv0_nCoMvP`gy_Ev%jl8LbnDP&`}dIzuQgO8kd=pUTq?l#U(f zZku4DCg;6~nl6o2Cx%I0AV`~-X^RD@^O$GD1u@CpD>~I0A=V-7L92LEgy(lv4av7I zt-%SL-I;OiZ@lZH(bsavyim}C^+{QFP<$7@A7L$4B`R|>JqZkfgkml$d>KVMlcGTb z?)FZ5WUWlHUKqhtgybpxXJlYnFFD5cT@pa|>h3*yM1M7Pi$6|Q8&<jG+N?Qv-z9FDo?K-nUS1Yvxa~Txc2uh`}x#^b9Yg3IY|II&pn~y z$N`GqJ_H`8kt5uFdho2?61#`6uo>WoGJx+KLUl?GcIW?|VQP>f#B`BKm%k_tw7==} zf$ppq!c6_Ei|jC(Rb2>f{Xlll+fpuxy4`ZP90$;)+<8kl7Bc#vLTaF2S|qYbf`o1V+q zA}~_y$ZS09NuX@B@nQ`qK7+k`)!K4-!Jq<^?W) zQ+7tL0)OGzJ>{oqSCSwJ22W_90PS@g_sZaGIdczBg=)x=XLZ$Zv;n|U zT=s!9-RUC64-K(3VnI44==i!dg%2b6>dH@L3R%}6viwwHa&L7fIKnv}((5G!dJycr zOj&E{9YDb$jH@EL1LJ$@(kMyg$!vI-6FP-Q)W`zCaxaJ#YQ&1@sZ9Wi+Ke&E_v=41 z4W&9KVyPv|UwN@he$v9rRoz^`vV^0QZvaafD72UhoPwG%+AqSu9axGY>mFT|>@ak` z33(R8G6ZelbXc79K#D*~-_+{-+w7w#vLO~B(NE~>eD_PX+p7Cw0J?8)W2&!=o)(u( zUnNoK>xOZ5nzJakXKkkZEj&)*B?2lGkTle9>8UILouQ?cx_ZB&LGodCBVBWZplIu$cf2Sx%t>F+9E{MFYs6{(|B)J~UvHoEg84EL8FPCuA$ARrjFK zqzYdmV+!Z7xCs~g!GKM&z{FQsFdo?snJD>$-Zg>&S+Vb)WE2}+5CG8v$X0?lI+!p< zQGhJ_p__5$GFlvUAerULM60pP{pn%7=W64Bb4Cf8=#MxFMx4u^d;a#Z4PC~gDp-m; zt*T0~Mbka>_Mx%dU%JXv}g_JY}Ngym?rxEmaBC9imJ3 zD`(~PVKs|)h$ZZPrZV9x$nuo;RG$*_P49)C?F_=fHZ*VWSQ%}sNlN4}ODLfjZCrAm z2xYJq4Ai2>AU$=o4bq$)Lwm%j&`ku5@%_VT70#nn*U`p3up<#HA%_7FiN#ZV%KlEI_YP+NqgOMfuC4XwB*480Qe3P3Jze{AMjU67Y~n( zO2vZFf;miD2_sFAD`~~8BVwsEmyXJ$gqA2&ZoVIlLdm=k(tt|A4&z^Vs@geJMed?F zekW@rrc(pj9&@N{DxnECHH?fS=CK;C8W|gAov;^I^eUOxXwOW+S;ji1fa}6N%txzY z44x$rcZ~rWNS>qE7qAxrjxblDgtrY4U+x~JK$7CP3%-7i8GZDffURsiUqewy~F`jBN3y>i0t62eU4wx z9^2lW`Bx^jvIJC^(2*Ahni^WNYXm7Zl*JW*@BEUs+LH{z7%EKo!X!a1bG3dsDmJdz z1Fk4Zw(vkW#F%T=ZV~o>Yrjf;xR4fGcaQbOoRCe-$x!rTM35K#HAp(SU^u>rL-$3_ zKxEktkxwx1kBt$Uivv{X%3euyogS0i7tvK_Bj_p_S@ZQ+m&vx?JK}XFX(0aJmYcfh zFY5OCM(nG`rzIh4OHZ=CKEdq%8&Tg%gL_ z{m}(U@-Wl_S~(7CAtCizq?r(y<$!%!9*O)3yqo=Tk5V5~Dl{c^v1Tyrwv?AV+iZU} zXV2Im2#Dd-uGfuOE9`KB!uO4*)0>l`lHHZo;^mnC)FNfB@W=gidqsen59kr6VIxBO z0YG<>rTYfO5}y72)--t<8@_y;xf;k6b#6d>+F>^CP2Y^r1CyG^)mqIj_^L~HPe)4{ z%Nvbl{z?UEgGA;B?{T?8TRc_<9Zq4{fIgktKCwx_7WRNQOV{rmTTxGay=y1XgLz4Y z=lRt=z6VPdsLy_uT_~vF6i>WXB2-BNNXxeZbk+>2OqWXw2$8$3XB3!c34JYd;Q9g^ ze{S{)#6A&0O)My>r>%12_h-7J)c$fm&3qSc@UE%}GC;a9$CliNvIwb=N@a?5XHgAW z*tLO_Ip+W$zaE>pbzo9tRKrovMjlYycLAr`eFG%ue%eH&8>~*|e-xquNeiW^fXE_^ zcy!v!H+?6z?M)8zlJ6|ka9Cj{y2BjkpmPvPf&`R~1fFO2`SMTlt#orIABb~CM~J#u z3kh=Q4Fr_7)#Pv6`3YF*k$(}5$j5-_{%))(1AlFp3=$@gmFENj-uS&(M7lX^Kb9k{ z{ks2vY*Tn&n$qjzpnisr*k17cP$zwedqw&nS(j_TS)gBnIK3#HpGt$r3K>_rfhv}3 zGH$%7pMNW{Jis7>c8J{tGOJ^vl?N&Tj+9=uUqn)HD4uJ{&08hI(Tu{!?Y7`7NwTyW z8Un+!j!C7L`_Ttx#r_fIt{yie$(H^m2)mQ4mvl5yYph{+NU#=3;#`@}{tmYK2S!_s z-V5wqMTEKD?X0{a(kEOIs}CA@ZqNHgz&WGM+rd8Rz(24S&0GF)z$F+%-0HvKd0^fT zBDU9v(2REg4HJI;?vlF)L^K+q5Irc@vxc@q>1GcqIYBn`TGq#uy0!x&%4-lTZS1w^ zDcKL}?&eXNta|S?{c_5k?G4Vwl@Xx}9XGm}0)ySp7;KoBLf>LbLO>qUv|mPtRG=DV zh}H$z&vk+g4?fQQQO2U>pa@J}UdU_3?qDUbXnr9=H&&xj6y2N@{a7Nk0ff?=t>k-o zlFRg>(1IUDc#5q+!ulj(UK+;Mky*+tIEW(ZJS$Kucy>0=$4Nw!1=q7=E@o7pQEoNv zd7AV{V5DmR+xg?zjtOrQ=|wy8wO-N7KFC65I>##7F{+cRBnp_cC%Sd*fPzkG9CW-MGfR2=d7>_f zn$PGfM5bxCAu6khR8g2EHah#!O*U&tTnTpINY4ZP-OVOD{AaP(7KcXdGfxh2-541d zx~7{tx`K1Km45j9%&^=27<(x#$-;geV*fmv4@G1TCQ zWO$}Z+;2!SWTIe3@?et%57iO~;@hK6K%_%p2pHi+x7HscHyjb*iEJw-aWVq$pQw;D zd+P?LjA7ub2ofexVf-vMS_SfV;_oR;586)uG9snMK>IS!yG=>@%sw2P)d`d=uKeiA zECO3LP6YOF@qjKVlC!6V)bWrEYzE>vdjJlZr4gY^^Yu-JP|qoqca>d+*M^&AxZuyRGfL@7}iEjm?_f zZE49Gq^2J#3Z)Q22qAlxx3|yx_U(^e^E~G| z*SXGhu5+F1oO7M)jA~U@-bsJQ;(|=s$nVQj7SRI6H`$_p>Y-k>J-`qtG!;{4K?UB5 zVBHRLu=k~+wg4kM@jftNW(FoN|0>xJ7Gi>+aV63X(>fqJ>^ED4aTF4qBuJjeK)R#7 z9jgo(nCg;K)N(@Gfq1H?nJqWeN;azxy4WnKlIji$Tyv~-N7dm@Fb7l?E>lJwa|cyk zA&nBDUu?3i-B}s5Zh}Fd!c~1MS2!_z+=LiZ8Rjz-;8AN{y9hVZ_Jo)|_7(T@taKZ4 zh0zc^l8wzCR$!JcGBaNExHUs%BoaVp4uu8QndTKn2yTXlsJcv40p=Grx@tcOGxnN3&;|rX%NWW2r{@gx@<0G%B!J*!rFv*HlZhEbYbi)R46K zX9sx1&^=v!45=?_8j3vot2_?i88~m6C}~PV97b!JsTD zbpf^q;O7n|Z@%Z*J&v{6mxblvnZl8_cB>ieNIQg2)rpA6&%)TF;x2~R2ERX!YHeBu zdy43(JKEWJ*{<;yV-{)C{RBVhL8^n#Ct#;YXG zRHN){tuR7wvrx2!%kaGWk8lkRFRzF$aU#_Lh;?1f0*=B19YSn^obX zUvH8*Nq&a?tts5B?*aPy;Z8t16p*Y1seX7Ft>~~p3w5e+7nLRlzeG1RmSAZeV8>6D zqdcP>V^v{Wg=Zc43DI=9Xdr^LV#01_MfMouMHE~OhHoHLgSzVU-Pl7mY16F;I~A_fw{4Wi-gB2md8K zHxIhzENgC#R?!oXI0oyKyvFfPB3Oa9d(oU-rrCa}XNPk;)5!=u6NxB#=PxuGZk^eg zX`)|_w_=a{B-F^T1(;yagLVZ zNjD9LQu4+}a>56lA-N_FSZGNnq3n+O?!m>1l7UP^#|q9O;o0Dc-aV)DI-we(-95$+ z4Vc?#Z0$A4LDU;{akq-1Q?v9p6k?C5bXYhKO33PRruRf4%6qCX(PUIH*@@FhA>_ZyvW)aO zo?e(sniyPXB%HH7DzJuKZ83ZV{MKBrnFO#IL#el?whyYoFnx++*3mY~p|c`|no0on zTurmphH_pzyN=f9tOSoWNL{q!CUF}n0X&J|Y=3nV5$Aakry8)~C=wy13=PcCl(u6IE`*Z>5(Vbdqe{OofhvTJ<`T?AX$^8pyh5AOt;IN6dq*cd*bE(okL%)VW!pbZMB?3 zELzPPjGMgetqc7f@~gdgM`l1^(KjWSeqo7%<}uOiKc?552r9I((aG(q>2ra>Ch${1u0nt*FK zq75IW%u4t*FMS#}NjG^~Sfp_A7%^%e>;>Zrt%w=RK%cRl`QXgD#wmP8d#-fUH9JC6 z1b<)PsNwOM8t!(jgX47GRa36qnndIsonQ*1_d$I#M5)b;Suj!j44i_Yw{V>oKc27N z*_RHC8ndswtu1Ezcgr2|=S2@eFaebad_eVw+`d0MZ~>`|D}Ae8k? z*=q%a*m;jK(?Z*Q`&tVNH+u_orx|5*0h_qLU~%>xgSuFVsfhS>--aJe4$U0E0MZ#2 ztlK%f-Jb~!T>#z-_al)eCikU#^AxMU#VcvzYjpO-6v6kr?E4u}+8Yu6I!Y1VH`20?wI9KhU}FvLAEVnBKLY!5FN34v{1NC9Wc!%FlW8`A z?i^0xTts#05MY2d0K0=2h_Tue8Z7hVcG*7FN_$)(Ci^MvCZ%a3|B&#hCOQ&vkZnTY zv3vpY37tElRCp9*xNr3LQpUS7aLTb5v^I)jXTyv?Iifx_I^(aHm)fb8eI%Vm^<+Ol zvuRQl%MJaD?S~DQNPB|xg}5=VQVY_S--DSH&d*AX){#BKP@#k{`E2_HhHH8GVaEImKGUm*}p22h}L|-nDWdz3uD_eRP&C*Jp%M*$53NSvJZO za#;(61RUn@B%RLk1oOH)#~3-=+e)YWj#r^hlfMX-M0@s%2KP^TMk39 zkQg7djtjP$N!KoR{u~mPHreu;68)o5Li1!&f#yOTe8z&)3eoBI;ZzV3ISI7W7wx+> zc)Ggn($W~$($i?&x5aQheE(l2Evs9kg_w`#;G9F`p_X3e_*K$U_DD+)WD_V-%u|cs zA$w4kEj`^cS9k-baO_I5W@lMVasJT6MBlN`C7$c70Z~I}?@0#Ro0*zwSmKplFT1K< z_eP>WtL z&er&(AW)A+lWdunWL!v)yFBLnw)3>)s8e9D(2%p@neRl02{ROLPw`GxDmoQ)UfG_N z+cFY{lc7yzty%iUgWQ2)$PZ8?WT8~Hi_CdiB?q8A_0Yf|?FBG}n47F04*R>?hlLFq zwDj4qaJrVu{MANUJX9`lmdB|MEvkIdIcx}-mRP%-Q)>R9gR(ryE(1#Ltc*P!3PY1D zDCS%CEM%9!w^SVx3Xc1m%w1*9GRLn{4LR%za1s$XEUzomMBxit(Q$0o?#Zis?W2I@X1oEeQ}ncP3JfX zJ-iFpSn?ry3y!p1_sZwI80S;s?#|&gSq}rXZ%t!?JYSnHsE17w5-P-nNv^aN&!>{m z-$%UGgP`b>PW-L^w9@IKp927%=fJ>yTY@KkP6Y>!I#kq&q}`CaRW=1u zKu|sVzKxfv^!;%9CUX03`i@Rz7SJ7hU0!f}d&P-nlm)W`HBz&Zi#73VWt@Z2gr3rW zWzyhjOM78<+OXEa!bEYUzo9?_%UU1wVyX%6K`xrwnG6*W+t{|Dc>=6fy*dgisX>oK zQ>c2SlecPDxL&IT1i9074+YM>x+@bb>&E?+cu`7Ry(=3gB=c)@yhvrnR<&>bW`MG@HxW#J7$GD1jXUi}`Bj75ftx)G@zZdWy?zv|U$-k?K{ zvj8{ct3CNb*~T#OHMt~q(ky@^NQB`Su9Q$d%VBBEvJvo-Aw``x>H5X@zdKG=sixRQ91m|b^Xti!zK(@BIrR1qc z+OWwuh~KQ5UwA8(^Jc=|)XZNR+{VbJfex3k$>zPEX6)&bxim?E%G?F}QZJ=G;}Neq zhz^T*-+{btZ#%_WSwzd0$L7uRZ*eZH;baJ?84e|^)8v&3BuAWYon+U?H+eQg&^;`s z3JS@68`Cjf2=Dh!OI2Oe1+4isMd3rB(HrLvRdANf4(tWi{i~5i>aSks{Mjiih==ln zJPECOpyW^Ghq9?4?ZceeF%T6+E$sKMS8H!XApd080&{0QM5bwRX$B&xtk&Yx9xs)r zD_?1c;N`UH<1|ghZIIEKN7^RYlJ~q8v4B>US@MAOncQx!XtW^4V9 zYWpyG44$r_l#HVd`bNi{r4R#yF@L>XrGSrX`fHMy;qA+3f|S3iIJsB7u8Rh#m7cX zr!z(s{De!lg42Kjf(kwq1DH^}0_FfI!nGw`T{lZh;k1k zH{Aah+jXDmS!`@5{5-tdjdc*KMLYF80Xl0HRa8^U?0iB4tUMB!K;WHjt5!)ie?Qg6*&|oD5Emfr`t~gI`k`rcbjxh;wD4Y@ zK?zsn0SDtkbDpkif=lUpqoSwQp#k*`dsx()T_ggSqTs}hN!Gy5^YXe^FmOAk=%R#$ zIEAI^KpujHdc>KR-K3>gI;8k@NxD7R(MzMsd&3(v7E-;AnLBE;2^j#_D-VhTO|Lvy z+-O*-Go>0CQM^gjK0lY?L)mjByHFti$Hw?hahdhQ1@YKtL1(Wuu-m{`&Q^PnE{QUOKhQ4vu<8V#h13*n#4b3ZIgJDS#9d z*pL&)px_jin!psgII4)cw|~bqpn4vyG&H;x!xPWvKu7kLBwQW9E}4Ps#%XY?DnPd3HN z06RJHlQr}ZI$p@Kp*SfG#pcf#iVQlv-7cIQcl%J}9k9(9SExbGsxPZ!!W9FBgLt54JjQg~`HFww*i_*A7 z86&i?I@w3UBW;EW_@oY~VW3+({f#i5YSeKxv);i{{T(rz_?a(QNLk#G?Q7&|UMw4y zbcAHS3shbwr!h5L7{{H6zM=tUJTZwu@v|M7Dy@2ZGNu;pAknLZsc5)jd;>d6oGlmL z{j^Scg!Ue96Yu=JoMF>hQnq@#rSPuSPJ{M#0B;xENG4pg^$_oO&1SO8meaN5p}jB5 zgCDM3qHiYO7qzhlKS!E(SHDVU^YGFdYH7;8Pc-M2IsOfYQAbpb%_D`as&MMHH|K6j zRV~#^pzs8!GX%vX0MvSR5=Fqx35vTTw*QD-OI$;(38wDjO@l+{;Wa?oB2S}NzsL7R z|HfkjHEG*eQpxnu$2t{-r>A$arT_eWy-CV%Fgdj-6o4d)LOn4hzMR-^KZnjnD`Jsm z1|0IJdPxSNjR^W)(;W?ZGxl(Jv#V`;)mJ$t?U@aXE0Q=&Zavn-J78Gqlw+ks>Qw7l z`E&M-&@hZa)!QbKzF%>sylU6>L`hSY2G}3spdz;$7$7U{7P0#ipWEvB)glb%5i>5>=g0_T3k{?ZKgu@+cd z-wZaMy{a)hpJHBMAo{q3odzT@hht8G0U|{F;ti(`A6M<{TSo>7^RtAri(_7i`H;%Z z6<~UN-3w_wfHi{K$TeJsA!~?di3-jbOaqa9vvfAxvS|PD;4a)xPg11!{*G-!Cx$fK ziV`La*Cd}VFz~vad{axl;n0dcFgPv|U>U${3GS}VIe-@zjNx+NIQ@8ABX#PT$_a9M z`$!nsw!(q1^?F#Qm)MkEe3ZWc0}Zj1i5w;B#&j2za*v*5JGK zERCj}rYVErNA_4<1`^LP@~ma$)Mf&PI@UUleKL%{^u)Amabyi0s(bph{j2(KXZ|BW z?@n<%UKumNB11oB#w}m&1c1+=70!=lyrew{BzH!s>uFPv1_ItQQE>rZMUXhNG@&7woL=4z^$D=<)--X@tPi>C(I`LBR>ETX)cm!lfrE zleDX*%l@=yd}nhdn)W?MqK8ZwSz3G|3R>z=rulfgZdl*jp~Ry;YTypaRkXcdZUR5ua*_v6uzZ?dd;Bk?}Hp_0Zz>t5B~eZ3stf2l!NgNodg* z%;8=Sq|q^3{H@J^I1b;JB*0~#SU@(RgKaO@|G;U|Y}HU~?M&CPTcy=}0xR_>Q`<$p zgJ4Cp3D;x@qxIB?;?6YU^#MwT@kF3)fEwcNktj&)jeoo&w2sPKssqG}`CRok6A zLQb8Lvr5iT_2ym0Be4pc(&L~+hp2ruDeUnK+oZ6i)@V1GA4E-TPYJ=U znxyq?MzscalcdXBZj{5OpWV6Bom7NDQ!V=DljK_lb9QD(#an%f*}>mBx3uUq;XOey z?#}AOz~EPU5s8?K4Rw+^kc|6r5ntZHPXgOQ+2`mIHfJMW(J+&cGU(&^tPSTh$N`jW z!lMcG-p^O-O)KauMa`Ky-kU+j-bZ=7?pdSr*&dQOc1Oh&Gi(2pNzzAg4-W}6H|&$L>_EYulD%22VFwBdjFl=ZM5ZqGaJ9C*gQGn7)ST)Pzfrwckp&IlZL!G186 zlrfja;7n70?u^hARuFrc2>cDbQNk=VL~XrLgwhQygmQn_ZUAVcTSlcY&QM8yA1tv4 zBG&YE%skX0eO&pUDS;j#7(of@RdkIhMQ~}D^aaXln6_z5ybC%v?L)z4FNioI0Cr$} z+YV+#_xwe|Nhx{`+BJbd;<+#G$X#&H!Rw8lLGKW92RxLFM(xg;ooFaySe>tDRxC-t5d=y+c>e zrW`cS`K2Q|Q?3V8`#WkJptJa$%qd*k+!bob9x#+z2%Dhj#NqT&)CL~B$7R@3%R&(e zC4EDGb10hmD@PrdFNNFa7}g%tx-84m5`xl&u!7-6PT|*Hh^G|I8H!-cK$sbp7933F zx^_1-1Jy1s%+?6`mKIApNUePkmC#~`D)gmH!*3k@GF|OwXnsF@a1#2arj6(YwB$VA z0G1qdHeWy)2q{Es-*8jBm%+N;LNX7x(}(gy9lyjCnsl}1dypoLK}>%6qz}ztWQGCL zK~7m(3?g@IpiBI}W!A~63^GoXyfLWAJADrGN)iHv@c5by!OM|WAf^;S?4&9*5ZQnq zV)oUhEcb}gp8;L-TgPX1dI9x;l>S(ET-2p7i7AkGvg~Mv@zXpaO48dha|?D(M{w_I zHEm$Rq!LdJjWY)m|4rJ?fW;ayNC=s0Qq1NBgsa}w_Fo1Zo>2iSm~kFtips(pM^~P$ zg*Tqr4diqc$S3Kg4fL1WNMK6gjg|WUF2z+IJB9CYClHz*$)>- zp@=sXw6ojr`yyP|$V`VbPB6&g5AcS(7&K=NH*02{7ZiW+v8mLKC!q+e z$Kf8qbN7Ro>3=LD=06Qey>tNL&@-9>v|_FN`n91}JE#bn%O*xTxle1k3F(CK{fRU> z!F%nX?xM6jUsHyeTqi4MU^K*;OCams=-Mg#ygw&DqVgkC1vV(r^fE@6)Q?wu7&%-_ zcK~!c6}Cg6R?2YFR4&EJhxX*K&iHRXX|v-|W_0eAngGGH80jprF|%@TQDe?eYiP3H zl&4|V4>}W%F_fqNxd{FO!8h26`RhZ`RcQ4pDu;$0^@A$4Ex`?%sLPdX0k z%q(lJOul|ON---dtJ|?&>LIB^vJMKj$N6MxmW6}u*L0?7J}^6nPl>)q(el4|QMFRn zW92Le6J}#vl3#P2=PObOQqWmeuWEe}GT@aA7liH*@>IN`(TgjpX_XzD z+bKDO*eUsYm?=`+HI{YPa8y4$I)v*sJJ3U*hH>I~3+jWy{Ji1raYDk49$GUG%ia}>rTQDBfvY7|Olu1BR;tx*JC zlDk>Ip$@K@4rVDvCMr7Kv9&_-Ntjt#(E><*ov3T}ZI9yv<3X3}=%UPzCO7{A5hg5Ezi zoUG2KhYt>y?riIYk`a#Q{S)ANf5`>isC_7SCB{I~$nf^ptkz8#v})}y)Mxy*w2WE@ zk90ip-d@Y<;&45BYy^$+EF%ch+X>QEn~^gz+@CyKMmwx3Kq?1@ak%wS!BEcu@n1_Z zwjj^&(V7h3ZJh3?c_WE=Bra|8LbhdGE24M>M@02I*()+6S`ImuLPK~|ooaYC6zuH3 z#~25fdk$5fsm=5**x%YruNLC@(Ls7f25E=~x8My=>oSpHp#}9j@Q{DXg|<_ z6GNMKsRb}M1GrJ=b9K0~2uD4$QUvHf&M`b8^A>>Xb?J}kXF@Q-S7iVqoSsd5JzS^M zV#J_R9D~sdkDL!-gB=W;2dDj~T_7X>mUzHjajF;1WbpanvCFd@Ls}$*;f!4!%TqC0 zP04u2A_|!Rg$x~kxPttN!l4;}A=8=n@50_D(c#&wqb}OXM&Hm0#n|Aeu%T-X56q{+ zwl)LUqP;Vd=gr7)X1TF{=xL5DaxH9N#SV@|S-Qq7QhIn;HpH-ZIo(SbcAAlK^Oilm z;S0OjbUZqPEecsCcDl~O$bGe}3I*@{$GI^~&v$(DrjOQrFLtCYzsu)i{w}#Biatu3J8AmVuvf-wd zTYK1Aw0d$ecEfV@&kW1pEN2TWANFu8pLRDaD>K;C>pXm*!B{=TvG2sR!L%crw>nq2 zi%nJ{#L2>%nt>>0N0L5f!^6XK9gU9W48Z6ZTGX0Xv^Ph;jAyAj%nq{Wo#hqsAcm?6 zi{+*Q116){sjkP_4zO?!0N7p|8Xi5|jGM+ROO&7wq{<-{0g05X$pDNJ36C=tEbk@7 z%(JUUS>qR+<5h_%n1x*ekaWdy0OwEdL$gPu4#yg#s1cMaz|0NA)r_bn-1!!{L89W7TO(^4bDly4fs zW#>D>GHhoQ@$ukgOo;D{zCVQ*4ldmjyyK=hoaR`R8TOSOYaAXP??5$8sT#D(p8|n| ztd?WKgy_j%eW8~Y*)UtZL95;)G?9>dwpdUCHkfZj*J(L5PLm4^W%aONZ;NnRdy%7) zfH7dWFxbyJcADpq&V1BhCd>*?#CDOZJq_(2tN%aW#Q*@mnRuoe@NTEW-Z4>EV!*f4g%j7EhRBG1hCg94A@ zN?3YbUR*ETEz6&sLc3v-ow~`*5nA#2Gqd`jaGsnmA)%80$XL@vg%nnWKpqs%SNFje zU6V&d^(+vLCU~dD?S;{ohuSM)mN%WH?PAXV5AveWBELwc)7Pom>_;wc=Qi(X94t&^`uZCSNM6D(Z_V@fUBKC z{B|ouns{BFToMyq!{sd?kBL!(v!?rSn1+EPb69$r%y7C{yw5Bx#K&!4Z2gM>}YU`J6a`^_lIYUab57bYkL&9>D`O zZ+z?A2xW0_m@5pdbhT+lqgQKj!w}>iu6)+}U+sN^XK8z-&@d#r8hdP*ouNWA2k~9Ar$6#7AsV< zzH3dU`ex}Inf!}5hd!~B5WaOYg=Wphpoji-4yr-JvxMr%%9|XmYJ>^H!jc>kjC7~F zc$B}L@YcZ2&tUV?$#PU+20_r@=w`SE-t4%f1>~@olb~u>0S%yS3wS9-z>fmkAx;GE z(XrsTTT)5RIo~{%!k8JIb%9)4n1%J2cAA4&H&EHet`=;rZ?>Lr4*M&My^PPly zS)g(OPpCXgp=kaPjTwnK#NkvwnYe`jt#zRAx8zNML$-z1NPWo~QgSx<9w#1`?!C|> z0F}pC2~{DTgL*C4>{0SpClkTBN;}SU8#PX)kHOU2vr!;&a2n#@2tFEE6e1&shHsk( z@gmRF+b$0@F`Z&U9vYVEG6-T#A`-G!+_JN<6zWyVcMliHiZx)OSm~iN(s1nAMV!_M zC5zIS;n_q@3tCUqkJ=H6`fkR(-h4Hji9zz(XhY+2wXj#q-amy_$Hn8+g>4iXWQFdO z6HHN|Q;=|ilu=XDeO_oz+K_lcSIwDrlj4>UfpE9HH2Aj|S419ve~lZ0y%#x-E27(1 zW0vqj$GF$K<>QLW9Y*7QLCf=0w{IWgh}`cuuTuamdg_I)*dQ=-1lz8RzIO4jp_Ih> z9BUfaSZ^z=AWfCm4Wfsa+&kO{p`}Y7aEx*A%a@GDua#BuV9G)dzLBD8l6#KK>pCg3 z7f%GKR#fs18)3Iz%N9F2JBP-+UrNuZ@NSaJ(-NLl9jT;E(ZK`lZRyffD)LR@t zk=5xTr)50n>;)V3)t+XZ0xyIcfuhvOsW;|guteOmGGO7ZGN@_EccF6_gZDADtaTt= zLYts_9t~>e8^@U@R@{}FcDJMOIS+d?wN(w@)w+I~V0M*U&f}J;2IeE(=?=u?R(&%< zmvpD!(Qfi_V0b|2>+uCTKeGz<7FU7mN4jLlPxJYGVN57$iHB$&7YfFE2L{@Hnx}AYtxf-d_~H?Fg8Jn2`N&H|qE)ozJWQ zSjFSs1P&Yc?&IHtj)re)7x;&Tg}mc{?z79}`~Z zTuxMxhzEn++dn2eG@PisFqm+!61iDRod98oV!=L0I@wDeEo(ENHHu@6&p>H@F{Xv= zS$g$y&2;p(GC|qtZ;n!03NS@w_<Ex@&UI~S6$NDa^)b2$ zpJC5vtTmJBC&IqWv72)sgM3yxKzlac?66VL-%3B+a(0$lQvQ^e{#YuAF{9By8`^<- zP?i~8yx$g7Fc0q|PS#CYYccg0&OK;>m}WM@h!3mkdbYD_2G1KCK9u^i|I z<^TY31GH0*ze~T;N$i=Rkz`(Xdd6uyOIBp9WoX4<6vR%xIq8mUn>UHqKG@@lK*`Au2EVy=WpurVI~ zR$`3r{d@wJT;u+(;V>vmJ2spu&#i9UIu2&m&daj6=C^RT`M9si(l7|7ZEvctVujOi z8XjcetoH<6U?D1PPtt~ZTDVC|H1x=0S}~*1#^BiGB!Ka$sG>q{yL0 z{LvF@+|2B+3DS}_iVCy@)Ad|Vg2CBqrB@=Y1I|a|spse{{XQMNF%YB`k?1=m8A#_H z+u0t|gqOTL+h{rnUz8;zgk9~5Sf`gA4);r$Ogabek_+Wnto%Hp_;QHLZ96iiAex{H z|D}mr9)XbmR3oS45ci?ZWuPA!xRSFhsw-cW@M?0$&1G-W26>ukQi@H8-Z68s^a)yw zBh1X}Co?Bdrv6pO!>mpWWE~VXdYa>DXZ)U@CFjJ5t2A7pi3xoPAr)0_wYT*S8S!)d zQ?8s$uM&*rERBhM!Z5?z<25H?E`#_aldQg3n$&p{$9ISb*|^m965q7sr5()Mw{B;M zS7ZfHE%zR4p^-|~IN}Al@X0R5qe@Tnwk>2fgs{O``VTN%(X*E^m#QXKn%~sqm?O>w z$-%8ITTBQ(SmG)<4x-FGnOQb()UGst0`m%PbXwn9qeuC|T&(owCI@-;e)a9c# zk<+Bpll!Mv=HH*INnUAc(zH!p>m8cNXwu!ONpt@6IeO_K#lp&(wBR3YBBx3Br6zf0 z{{6X{%CJh!zb{WE^ulC12g9Tscb0^Y5)TY1=9t+GX=fpYIww ziD%0H=VG^6i*{-gIW4+U`y+IcSLWYeM2os^Ug;I7MGtSSMgL3!TDNHBu5BWxMSo8% z^2+>st1a5LN@wl9d8KdaMG6%7n891=qisXprF)ymY0M>SSE_@_ecDbeHT%Xr zSPFJwhd}WOU-~mGEMwaUM|vj81$(zi6(-8_i4{g=dCT|1<&awy$%V{Y1jes%h}A)> zS$iBtz&|59*#{;2ZBD?8JI9W0&6d^wQ??}hi@wq(ej0e$;Mmtz9}V>HajhHp;s3IM zg|BZ;01kjA$&dYcE0R3_pG*m@$L92Jw27SlekrxiEA#KIO7h%os&wK3n^*eEPO(L& zAN{{>QRTPWL{5t?mgIKAN>7#f_ZQHj@?M))dTpxYzW;rTW*^ula$59sYLQpw-~XEy zv4KZG5G|Xh|Et%ldsqWm3&?q zL0x!|w*ndJIMB}39t+#WKhg=f>grMJ#Z(tI!dNXbz}<~Ky_Fzo;FB@-p$^d)dpwTX zURy$%8R@5Dog`Tyo{>+~L}?qnFx`Y5`^uF%M} zbaav4A4Xslg`ux5saq&!TSh=iTT2(7qcICII=-%~`|Mh3V=d@I)iOBNLIby@mg}RZ zdEJk_8VkYyg*9egTC^0*gJ{rye0D9Lr!ig&jgh0plAn4tmuQvpg*E1-v|Ncjv+ie~ zUCZZbjMqZoXgL-3>+99b(Kbn&jcK!*x~&Vq<2tlvp%VS%m;B=YZ7t)w+m>$Ke|t68 z4@ix9YHx-_jiz$5IA$pwwPZty;gb!eUaf{w{WcAyWqZXoeh}Sr7yZ&}pQrg$tTaQy zYB&EYGbB(6tp{?LAms!B<8V{g9+yV(5~iuG4X}qa!NT8%x3`v$`;FJV&Rc$V>z2Ry zMYjB`)bi%o^1@+W`#-$pW?{6n+$@YQrsZQ(%RfHGTE6ITubbBnzCZ!~MEV~F=d70A z4gXJTVZQlvq-}uC{exFDUYq?>5u%SYOJRPRL8Z5J(7gqG@cJnD0Wuuo6;>T}NYW=O zGRHuazrK55t?GL&cuwRH68FCLirlHY>@=<`UuAd#2$WxRF92!e0&fHjGxr;rwP><(FC!@MxhiV%&M=qywWV@@VAQzg5vTnn0f>JTrEfsX^ zXYR)E1kDYCnCS%ve@3}SOW3z%SSyS^tt*HvIyZm~oT1vu#{)XEU;#KAaq_hA>_LotWB%3$}5;%Dye1Z_5W;t9-uyNj?pIS{Q*S2;Ege zi-~YhxH7)`QqtJMZQV=9oAp*b9|s9K-?PS5AO;)}vip8ecvAjoSOj+OQzwQXZATY@ zbLVi)Nd2D7Jy#hq$2(@7;UHApAJSHJ-zvwgNbz&%$C2PW&W_Y>rPG1vb)rLv6xjckHpn<9 zEDNXLwF1NhhbY|3$(6#vBN}CjYp;h8l=y^fE!e?zXvunEagJhrhB{)xi7E^QFVxvN zHRo=+K?cb3421X-_HOpdGz2cwHxioGpGhPZW0C_v$w4PMatjUua=ClJD9-C<(2syL zXCN1+aCIsxp6ankNgv)n`cxfsL8^ljma+1uDNp`1*q-vI>0lms&BMG}F$?;pV|q|m z^>9z8ta*HVq8%)dbF*oybwOLJx;Xf2j+e%&n;fTn>QFYK6RLDpU#2l;FSO_A1mp_N zoDn%QEi1MeXE^PH%ksFY9O0OC*p6INnwz?6NdGKrvreP*2kp)7T9tuF+|hI#A&M@} zkmFB!2HQ3cQ~|_VdtOwkg|Vm* zGxlTMD8B@1d|viGHFDv1488$0t;^_ylY!Ms?&Ri4F26Cl7!Hh%$Ad#1Oi^%)#THEG zmPSXUlbt$6|FuE2TYf)tEUGpKkh%=OPLJrj8_LXmmtphQmOx$$C4hCYN4sfc_tN;Y zB6KOIl8bmf4$AwC@%k*19>hPOXn2TUlm$lqQh6iM+`|F_B`2=MSs89}s=d-j0C2AP zx9HGXHP*3SBStcOCDRNcMgR|wm=_4AnG2!|(aa3`a!Ga-&Q~esQF4EmlL=BFe)6LT zEY!xa&}C7udXDqjINY^JMyicwa`O4WFgv>%?H~j^Vuqk!ck(vU)Ibm=#?z@f@1huI zof~5mjnSt#=BU8rw;-P-s$aknX*csoSeyajB`q#%>NKH|t0Z6cY99`bN<4QUb@01( zkLbZPHGRLe2mM7y#oKbo4<+RU2RXyStw+Q<5tDUs=`ioqL|7C!dC!1U(Y3&_h1~TX z@6Fgu?v4rj+Zp%b3_y%QY}BI+Ub^cPDJ=dxMq#*g_T6`aBNI@q$@jRZ7UyJHo7K}I z-@Q+3i}0i?>@iWPiun$uG4>1*k#t0_>KIPL!uO*%xDPWROR(f9R)2az4$#~<4K!s* zfIY4#_zgvv2y9ZWo_AEV*Fv*W4QITI*)srZ)fwJkDMX|*5wcb{xO7XpF$0j40C00W z{GFSnpW2BIVxXkn?X2F__=?(LV`FsJp6K-m4O1QG>(McOK$bIB=1MJR?23fLSP*0! zR#zm?9gax<8Uw_y%Sv4#>x1fFkl#*4A|o5$xC)y@cQ7{4o*|Q*kh?oGJy7tzzkq;( z_jJaL>k_M_or_2YzRQ^ozk0g}f1wVDfq#v6=8E7iA{qEO8T{n32(O?mf+v(0gExWDq2eGvaH1lh+Ko{X-F_;9!dd{WpSZ-a@<2^Kxqgv5ox}&ua5dj zx1qSpEj6_660c2A)w%GZrYpcM?+7Y{JE5{TMc|sLH$OF_#EPP|gt7l}bedjvX+mck zre!ny>$l;_J~Am91d=WT7*0mEnGehSPw{y}peafG}jN*7NX`o9Q-> zcL>jRv31De3{)LO#j}oyBku}F@oHx}yDoa~z|!eau}%Dp{N^nG%#N+fua7()Fw^n3 zoxdo{=N3+J{SQaQSAC_IZ##c#mVaX@j$3t6n!^)O4Q|?MZo^fMn`ajlPY=#Wn4&&h z(q=B>Ealf+?WOVZ`--&SNOMe^?db~OaT|+BI%;i})*-x7W}9ZZp+JY-qG<&Y0X7Bu zSUxM^Ma2O-2U9KHW@rO;-8C(+6WbNzB~a^TcvoE83bqLEmaxs&wZPsQit$?L+*b6i zoZSkx2=A7#8?SGH-9N>@vr8ewHr$Nd${UM8*S2sWfriCIvxBum=QtcJoFVZatjXc; zBQ!!IlNs@^mRLA|s+$rpL-?!gp|EFEAD5=(GBhlj*;87^(!w8wuUMJ#o4t%CyCD&- z+U}O%lPBY6zC*D7ctQ78n4W$cKHLv*Y{P|&wO@!Bdlef?<+l`>aEl{dvp=e=cbsBv zS{pske8Q^dCJ3l%irEE5rTn_eSTJvIKud~%w2h>Bx(I4=Cxe=HYg?$+%byBV38>d? zEkH%69BN(%LshuF1*(Orhjl^#ssuE%2&f2^LtP(3QV*Hef@)q1?N4cg9$X2k?;R~r z8@GgdJ{Va;?@Umbm$h1ZFpMKF=zCsI=>f}^I}F)2SdCR0%v48j*BDgoT`l$XaU>}& zBHjB&d%L?j!=VtG9(phqoJf!+7}&2bT5y4OdO$q^tCJTZB&+i?GMPboW(&*p28KJDET`~SuRKlF z9Re>%%jLOOmUE3gOLe1)8g3`CEm>Y97K1v#82bn?)Z?Ly}F+cac3oaFV$ z=5{OxLC%YvdS-PB2MoG$K_*@GB^ek$fn$_;TxAfGd1=`1!0bcc!7LL$UQe*C%NzAg z`qSzA+VuTq+z04$e+xQLBcwO!IvndNV3wZ5CKA%F!pNJJwq&Hc zb2S1!H=4Gj*{zD&NO4aqO=J-xS*!5TkPxr8hljM5Lck$Zp4f9A+Jb@w(t?qKdv$wn zs}#%>x#-32;W^#jYehjDxA*9~bj^MwZ_?|&$b?6nfTUu>q-4|{s#7P8yk!}Pg@oUj z3sqKh>Jl%S%%alL-hi*lk}ub4vp1Heu9{J`z$$aW!YMuKW$9xI&Cb51da#A>QP>1I zqOZzwMhjh)?X8>D&1!oQk1GLF^O$2(6$}D`*?o=l(Vnh%z3*+bYb?vMG|Ka~nGWu& z9^b6|_$q5kW0rpAuXshOo_T0rDv&?Gm_w}Qxl2e{%}|D$NKN7bx;m7u#c5-acNwav1qJ zU&4h1%JqKIi8(C1)WPmQOvsX;@0=J;VVS2T{SuyUvda^NWvMv3PeY=PW>)SHUj3OV z{3Tg-sdiY>40@SHBO=aIESfudJ>{h5v>a=5ewpDgWDm#?U7Y3@JjHpE8&nlfJ1X(5 z${K&xm!mnKW#!OojDvU^h(ivGYrJHzMcr7QK}n%#v`CG`Tj1gKayzP;@QkzU&@lIK zh8O1-aH{#MC`U>>eVp+<-1=);iCVa)(yY|M%bm3I2Se%f?DN{c7}uA0LTMk#u;@q6 zjfv)R?`OU6yuIK60<5h-MvV5a0aMJ1iugsI?v(STrJlq@ATbTFp&dESfu5)B7CUW$WiLYCg14GrLrBN`*5^CG#KQI&ODk?^or z%%r|2?_}x0Oxc+OJd1gxqb^*ib7;b^Ii4(M;nm)tRydU8_ws`Yr_o@Xf8m?a)GW1? zs4`zYm=+*m+DT&qr+2Pu9j-%H%vAA;zdKF;3Np~ZQ=y?5is255i~h(=$L`Bv;hJM@ zLZ9`5vqRgVz2bH#m2?Ofr0uE~9pL$H;OLM25pQ$WuJnxOq$T=6)vs)wIOHYIcvGI; zWSoohHRR2B*)!&TDWY0}ix3$bU-66y`@|9(5jQgWzM5sodI8l&P7}zOwc0aY-aVqa zwxDS8Ufet)fx~-0%7dc z?0~c6+Xu$yc5V%L1L*)x+~9zx?gmW_Yz;sH8QnH|#`-8C>IWjw2h46|GLh(p^-|L;;jbKLVj1> zW+;gUIs@%)nn-%TEd5N)4-CZh>`qJHXxe~Vyh8}soD3`{M>4&kEl%n`wG;XdwVO^u zgIA+u#Nb2|k8TA|7FL@4b({2?vt$Jk9K->&Xy_&0Qs;D5qLJjc3oJ=$aC6W>5>>vV z@7~x6`i4}FPwcwB6i;L|aqo2xeq1|8Audv{#ma%zQ#lMJf5qncZ>6p{Kjzo8->m!_ zDgQ!(BvF3i=J~Ise4eit+g5F!zbfX(2KFv<>^#|IPZ;rvlQr=D0`njZ7Pn%9cr01l zh0C%csX;FkBdqS=2wyBHg|219;g-8MIa37o(T&K1hT?W5orONEYMkvvG5 zI?BTjZO5}=2S+Fz808h=NiLB>{`4&83^lF?C%Wyd+m>b-8d{8Htu^4H7Q_5>H6p6J zI9>u@+KK%W@?v2GN%SeSgM~?&=U`TOm^{L+wXVxjb86POc*4+Y$Apr#)#(a|Gep#W zpxCtR!Tq%IVIZMMsr$Q%#yK#D>F#UNU#B`<6T-ISeE$=VtCS7 zF(CBJCiM~eS8rz+zzhK7H(($i4|k9^*A@Y?!aoV#K8=%PCaVTf&O!Y=iqd4!eT z>|f!Pk5zT>ir1@c5wn|T==2aYimHHT3p%QX4LY(y5Z+c8Y{C&4rCQDc zqXSs7((7uM4()5TKQ-nO7%c?~;ab;mx7 zEt{LBk~7P!j+!1Vb

MrIHb5U=Q{@ONP7=R%E6pQzJB_B9nL%1Dd<+neZ`M6rP@> zT2Io;_umys7ils9-)kCxNW%sCW+1N25fP#~`pk%#Yq;X7DtLKxPxYtmHfUvinZjfY zv9mb6ajo}r_LNe%SuvJLKMs}G2Td%zWWU9|Z2ig`1AR~)wzJ7_V`WR{nbCc=;L8X( zo-6%@=;WmtRhz>uwQ;eVh}LXvKVJhSt8hYc+c-u`NM6BC;O*~9OLSC#N{cfnRnj+8 zCG59!54{=Ja9Yx5h3*tyYT+p}jq{JB=BRtT4xk|^p#7{I6R`!vDi1iXeM=KsN4-hW zReV%6{kKw$G?^VdmIoe(s}_E_t+NGKp{j|`Vs&1wgD{%7lM;E%qQoxH+@+JzegdUO z?pG@0-<#)+8+vXO$%r`a8J7HjU>S_|oLPZRw3eFhj854_>!Si;6jW%eqvfpJQ;Nby zrK8B}ro5GOHi5}46UY1mMAj&5EHcY2(>5f*{<1vE_`O8H@Q)X-EXHEFbk+q415fFE ziMlD;hY3Cw+DuN3L}Y&fe3%RzVj%0f zHhIt>e;o2QD33<*Qu2N(Y%42!E}6_TgEcA^Fqcabrvw6c(L{@^v`)oI#1He|Ktm$c zn)?BX#9izaA?eG26p)6{*&r@Q!yxqLI}%j82ZaMece8Eg zdM?7)PYqFUCR$2YmBJl_u6>wF>_73bADEHg16B2Ojl)5?((kCB>^?drc)MU<5TBK-Pwi&j44D zlY(9o(uMq?-*IL3uL6-~qW&Cx#!q+KeXHr^Am3KYVr#-bL{+WLm0uUEX4wkm_RyE! z#iptwOes$Nt~0J3Evm^8UH~S*4C|z|x+o5jTB-9>1}89@Kj!i|QVWF>4)oFi2Q^B6 zMNHAlXb4SL6=BC*%u_!jxtdQa#Xt72zb!s==Vpn$ZYws`8R{b$^@x{3Ytoayp=Nqw zSF%x02NH-~d)7;Pd%eln(L78w-0~r}`d>XaPaq7&_&%aa?rk(%Nqus>MgkrC2(?)U z$5IXS$w#TTG!D-z^#Ied@3&x5oHI)ArA>(xXjN(gQjJ0h08(KIFQ>71uGA5&>}a|O zd?mGxk5?7HD-vujn}=yhZvQOzxdOsYSLw`&k#}v(Uy|ix)k~Gf(lYHSUHL=DJw^`H zv{(_+V2Y4fqn?N_q|VC#i3A*DqVpz&1Y{WH_-Tg_G;p<0xivX$`Ry&Cn5}QR^qCS` zH6Wtb0gt93z_?We6@%)W3RT;XD}2{NHj=Y4%jv;V(8#mts{(n^GPLiHyyRijL;hD7 zK@6?9OH}wJ5ysTaH5u6c@Tg~O9z-8vxpn{UNT9MPyReBfCFlpij0}V;3Zx$nhElr*=9L7;tcEDlJ6%aWZ-mGn0&|o)OlT(K~&``kdrk zl3Xi>YA<}y&%L-@LJCh({6rg#)3XdalvW(xxT{***E?(hdvV%UVtI2=`1nZk*Bj!w zXxGl-yfgvkOBdaGlcvI?=iQ3-N;^nTBXoovqGE>OIAltdP5Ca=kNtY zz|0#)IWQa)9?|n_R_+~@W2JSFTv~0Z$SY^EGNk?bsMM>1fU*BhVGehIB*NEM#1APT z1HpyC{9**M%s|dBg;%TSxU|uBLp)#%>-82=7afaq)YNfuO1?lht>~TCWTw+QpU9kD z)8B=Vm5W}X2Zq_NyS8yPjrRYQ=S!g?om%A5(63l0128WGxLstx%nfmOc#~(K_9-_h zKAKtmYsaT;Q?Xvs8b=euemn6}QUv+=QVUKlIKB)n>eX0c2dQegq4P7?+|UO8#&PE) zxiWLe%Yzgd&54LKYyCa$NEQY-{G`1w;rhi16|m+*Z4edyVLK@q)c%+^NyRcD{K5pd zIm^XMMZC+84+=ZU0iuM-65XhpW3;b@K;0 zHF6yUhs;;-PvIE^HD^OFDymTp?2j>wj<(4X+_v6+{s@q<4q`WMW&_fIVMjyH=taX2 zXj}>v^s3~DRE4(BpZyQ3w%*e?3M`I^-Hl<_PqjriWXZ+vus6zbVGo)CUB3XFuM|Ri zPntL&+a{;#CpX)Re{~Q90&k(T8B0G8*Z-G|mp;Gub|>DcpCJF>u&Ar)o~cCu_BMxP z5_YynO!>(P_~+sFBds}wKRCAGKw)SN594CYw?SD>4%@XVZE0vHkXh;A@ZqjD_s(}H zRLpgQU?dWAaCl5zhH~vdm8_;Zhik}!q2vDO3_UpfLr*6(sLu@s7Chf0a(IxFBvr;N zQ6u(sgt0b`Z6hF^Lm*)mZ~VdCtz_Mw9Q|S8kwc=4>O2BAN~y#?zCIpEOm)~WW-lhT z1xSb-x*Qu9SV$|;VU5QX1_kN;%* zx3fLR_@N!Pi?GuqT7#X`lk;Iy3Cf`+Du-$_NKawD1FF%X!uBX>hVTzXg{DS~t1)>N z>4MsnLG9aO;NcH+VfVO){AaJKDqMPm5j@b7kk>M87f1!tuBZZ;Z}{8heK@{G!QQbl zZ5k^?IJ4Es!6Q7&8Z_Y3Dl&zPm24_-+6tu?SP#F46juy(qX8`P~Xvx^o{V_%pO zd9AIIOj{;}X({ndxk`qe)_x}i=w7aMD%)vCj2&_U%jGMquTT<1NELTzt_SxOv~)9V4c zc0hZmNZN0ZSi&7Yb?Dq-j(7I1EWueB|5S90!rH@}>=Fq5qu{0W!xNZD!lB+`^uG&N z1z+Z)sJ%2&GO#t$-Yt~ zdSaF_S-YdXq7B4O$|-rh+APkMjP|k%a>TMslHT8*c2xe9ET0}zuv3#IB=eYXUF7}R z4C0FDI$bz5kMpQuuRPhYcS5jIVb&G1^fHam56u9+O`pS*pXxGi=`Xbq^FtUt6~&Od zT1_1^&JjMZ%_lI*TF_-IlM}%D0M&4cL*ZZgBd>P?DCu-V_6MNK#yb>-sLmX$X{$Ju z9-p8(gb6I{0G)eU0%eE~km1RAJS5Bvc1Tuzy5muwBS|Ni>Ko|EB+}%CY;;98!YQpX z0+-u#)V9D=jS4#XH+o%Dd;ZOyV~8*~pb6Y}An zxY0D*i?CMN5u2b!9NtBT#?-#dQ1>1$Y7PIsq40 za1+8GWOZjdwR*g4Hh|CKrbfoZb3Ee?m0%<%^o*V_g;S-IJMowgNS9IQR>6S%u2REV zf36o!SPLhHwN0h%z&qtUZxA=7wzCmlalS)$K)f2@4Z1u(9cEbUNxIU*L7vr_?KTvJ zqC>+o%@MQMu&9!{(3v#4wmz&-X@>eZX;nrBJ}cMk%L0aOtq)K3C$k^1T$QPHd53Ui z%nZ-}p2asCeI3QqCwsu8$gzii%N&6*Vfz%karRZQPhjkd*y2JbY4D;r>5AXNAEad` z`W&`syo9$z7gAFHS=ZvB>6EziU3YO?oPj)JOjQeGJV<9NM)hsQs5RTds0Vg6MujH} z+Q_I6uP8LUPM3^dGmKvgi($f>$G|lp;Kx91DDNe{8LNH;3*b~@!MfP`a8BpQ65~c8 z;|87FDhL4lOhE$R2J2DH1Ou+zj2jQ>hJxh8Vr+uKV{G2J-4=4fZq;UTa*Im0mXr7Q z0mkHH{IAGtEhq2B%rNhWA~~6)t@bDSwpb8RWzmgPb^HHV;N>jA|_>Yqy0_ll0I%Bk<)UCzBL?cr!UUtr#ZU^XF}olLuq# z!+gDH!Kg8AY@?h!)86D{-YuJPV}`b~BqtWQ6glz0rLPd=_cQg$=_=h?PVU{u^~qgZ z%E{d^Gn{*Pk(@lZPbMc%|GG#{t`YDSalWv>zN#e|uJKN$6a$<}@ zPMk5DM|d?xwU(1D^+_9ydTN)bPu3+lxxEcJd7>C5oORT;$;l|fgE1jWef0-)Lh*|l|BBgU_6_~aVChe@XGIsCy<(5ikjp*7&rIR=_2K?txIGa5PZn9-kCPTtwu(0D6)Bqxs*%gNXlIk~WZkv@5K zzirYdY#480#C#5YGALgmclHvUTJ5QA1=F<1i7^H_amLs;MvQ-dUOBll$-rGnPR9R! zOMP-%F-(~Hr~fm3vav&3+>o4Dd~@W)N+2wnC=#IIV)q(>JAU_0vBWEF>}cwo2wuiBk!^%UUHSR{t+nKV{GflfgGO#!;>M zx3>5o5wYhT5D|agp$!q)a(|^&L*x0+mvDa z^!t;4PSxk!?DG+QHXiA@lT^#H?6W^#HAi{onaZ4+eg1;4=Im>pRWsOOo2{DcbD351 zXV3k+KBpe-pOb~SIs2SssE+a6DaxIjeICnK`4G>1$`EItr|5H8_Ias3YmRl`v#bHx z=h=q%FP?jjKFg2uPX!cd%)SN+QKRP_%~x~w)t9e+$9vves&j7kIaOF2Pw?Dx^|>tj zJWrofPxRagD%+fWo~F;nlRWnfYt1nKyjP!7v(LM&Z1%Z8pXE&s{GgQ`;h*PQz1in9 zeKu#GYX#hIqyrD-Yi{;+t05lcnHQ*NWA=HWK9^;mCx%OdxkA^BP6f=}2BYa^_v{N- z#lW0%Gl+tY_H~23QchdUIPwSYAy+hfXLPNEzrU&X1az&8zk9~Ncax{&aQtYb83>o6 zozM$M*sZj(ajAAp4}3S|r>2Ri9yNl?&WT|acLt%m(GDivu5flfygH(^5^S?P3#VF$O;?(Dc$$l)s%`doFDk`Rql&%- zIY6_KeQ7RS*V)_@H)UX@ut8=@KpPH`3(xNQkt00jlYH8+p5)4B9J9z_x;0{nc9~R= z_LUM7h z1-|4*$SkpEel6{iZD5}%)!ueie_LWgx^Jtmgw($4j1^9L!A5>ZZ+>72cOBydT!=do$a^%XHgm8y;v*lm#<00wRzwh8WNYPHJE#fT6w=AkwtAD%?M zXy=N{yw-NM;A_Xts6jc{Ua6mU$TdHC{g=a*^q2dm z1n#PnEEK`OISHhY4}UFK1gmMDBzHoJEzQ0QQe(P{g9yumydFnuV#X-IZp9a+BnyoxDN2-R<s-1lAMS{uZH9Q74G&r&Rof-@BR@l-u8^*~GJ{>7=T4>^XR8(_RP-Gpk|gPh zyq-7_-zIuKjQ&!bMAE3MietbkIg!#-qS91ybDF7V=EDp$4OklP^XBKF3ZDOw0*tCu z;A2S@qw-3oLgK=StVLcRm&T;7qti1skSj&|!>X~zYRu7Z5>6Po@7YQ4cyYLKx%m z$~|oCsjt6KD*#Eb=d0G*Twye8UV;Wfa@`WIRSwwV1K}nu*uouov>v9Pu9<;IkqAv< zdgw7FC(zC^IXZ692FjGscgT*^fWu{9+BI% zv5r)1f*{XtE(qGxl=$|VTEOgkeV(T;zN3zOJmCbaHtXmc@?mxC=$W2R3t|IzM6*FV zBUkN8BBg1PM2$ESqqu~(R9Vkl;l_L*tdiJO@`SfQ{D@*>!9>I*%FC#={;;_>i4B*+ z)sWN&7WtDF%*ltdqXE$SZ~qgdUE`SheJi9NB(~fnw#eIl=#!2!jey9%!p-?Wlr7oO zD>8@%Q1x;(Q@ACssAj9!cGA51G*;x4CAX`gB_~-kw*$4vq7Tp3mTj-4!)Y6tHL$ zAr~fYCKl;ha*}zo<Pdo^6Y+JMwbO7hR2> z4|DdDuD2TqvL1~T#bPnG*-uiBnKmFXsiGuPdX<3^g*$yzOnI(V^--P+cjd!3V%K;! zT*0DgqAj&90CqtTSuV`ahxL)z`Ohb8khEJS^+sB;)N8^aQR2=}NIhmD0ucAR^SZJq zEwE-q3%2c(qO)KVGMcU9?LDF#QxsprTJ`_My3*2%h`RYOCt9WrFSKCWDPb!n3Slqe zWpLq3Q;i89v2+C@f|-{s>^sf>Yd&0Cu)dn};>yt7S%|{N}&{1a@ zKTU3rX~oEglfd4a4^v_*C%)2xjz|R1(qhDG?lJPxfKhxS0BoX`eQ00iN}lYgWP&JW z81`H1F}y)7VGJ+KhpEx<8ThJK-FlKVv8F5T%j-(3hE1o{4k>LeGRt5f(x!rNIQ8K) zi3tT4#EGn2WP2PkBsG`y1#79Pll(Y&%q+EP!0ZnuT1L{;1% z;wNoR?4`D8Ktg!ZJWq;ZjKv3GQRH;RyH2uW)Ad!umbOIfA-*IiA{uO|-)xzHvRK9O zNbK!C>WDe-%S&TOlJNyeK<;0>=uC;nWUxJ#F4c#l#Ge`l7|1&|7ut zh#nRp;?GPgwYjh-8#l8MZ&5a%->rbYQbO!D!OASvbv*5IfLJzLy}nE@mcpUF`r1iH zi97H$R9|1#jHnQ9{AiLVv00mtQ^3R4q5VEkut~n5uv_v?<0^txh)`&)N@#^g8o56; zBu6y#nW~{C7r5mHiaUnOsP2w*z=qkKqm*cu2uN-}?<7mCyKY)GhMQXFjy(~gdMV@6 zG65VKE;@-WKwUJ3)$Irt!om2jI1#ZhAy9CKDCnZxi#xLQ1YRB056*=-=@Qr9J99P; zTdvSIBjsg%qbe?m--SPi+5aDF=O5tpl>PtS@7H^3s+k%!X^;#C!;UqW{g`Ez!B{QB zj@@=YvkcnZmJnJ(Kc*Ul*pOs}5JF1`VbBu7AcPP?k>4T2hOF=7dG0;0nQ628`Fy|M z{^&igd(S=h+;h)8_ug~QJ-53_T15|UXC4d~rVEz^*_LQhX_Tt5xktM}ia)DIKrrUc zkolsyAQsIX4<~a^VzA%_G#PD$j?))rebmc}6=*;G!%uPe*^-|S=c=!Cn?@ysOSmP$ zkD-J>*;?dv&E$%EPm{2r8>Q8-tmLSe8saOTTZ$!Gc-qgv@UwaNDGNUq!cWS)Qjiv_ zNqWl)M99+cWlynbw`h6x5~QYI``V5lLcP#4r8@Y{*b0Gr<0Qywfdowj+}I`|L8$9{<}?Vr&V9t-fTDD z6vax@nk>{6^OYT8P2bu}{H0gkA&{4Mkb1g1ytEF-!jj>*!scs5%B8P#0K%c;VaW?8 znTc|8nWNBJhf&-&;Q{N7H4e1HL2C7AF{ViEo(Tqcjid=>Ah#68@L>t-I&+hq9jBJQ z$qS4p%8M5dbA67Mt==Y9LcD$KhuyP#X~A;{IrZCm^*I77!qCt3F3=vFqN+h4;St~` zPO|qSW~87x7hw=(^7a%>rxU8Nn?Wp3A@arOQyFjwih@Wk0CQJ98FTua!{;cJW^NG{ zFx}vSP3P%8d1F|1P%l_t=t>3fK@gCd+rdeFQupvv0W0_wQ&aV~;tzFnL@Nx{Uad{1d6Shj(cJ3CwIWd&B#;4!CgSm5lnl3hH1&kp&|WEDbVXUY%Q)oIf(0YgR| z$#y{fC#_JO$vvA*nvB5}RgSFMkG7DEY1#t3ndQb% zy1PT2m|W7s$eEcYy+;KjtnoE_I2dmV66lJO^V6i~vI=%D{53TZ3@&b|l~Ls4hbY@| z_JmBEL*!OryYFcc5(oXvk+%VNiV@M4rV)9h4RmG=5SS&X4QirLBC10=#)W7`ba;L8@t}5=);dmhf_Bo_ zm-&}LAiLsV;pne&wt$gxXK|)*^H8&VZ!gKyNcIA^7IG*~-bb?AT7*!s&6`l1N(Iz(;8gpNP7X=lrr7ueSWmW08q0o8u@VWA+<9z36Y7a zLAh?fSbNAooG%=mw+k7SKX1>dvYxmnG;gwJP^p$g$v3(-2<}N;JtT`o6&??-=#dF< z6=pZ)4FYN7{@zxF#6qQ86!dYdQ=qhu5wy4y2>uHlK|&ygxU*C}Q zcn-G(+OJr|e2#}Q6K{*L9C>qs#mX-^@ZV6@-D;hZf@IO~)bd!YWqyeLxZ#HX*`5n; zs{dj1QusHHv$4A*1(U2JIAa;YbdKaFj!V7{u-+VgP&>+A()$7`*N^#nFiRY6Mw|SD z9ZvI0MMl-_Vi6x3Jx8mg(>KmLm}x_~Eypsi(>?|GqSiQ(0Q3CDw)HRmWyDB6G%Dz| zF}FfvVKkMnbU`1r4!2{yISvgX8)0F&ntMK*yfw~tM!5#3P)lGNE@lT3y`Xv_n>?Cl zoz$EHDvP#OTVR+4X>#0UFkOkFXb9BBLss|}C%rgq7XCo-=|!33H#V?af7f2WMYPc> zl%{A~!;k1if1aOBE+1`tYdF;5#cMbUh1}Yej+mBa#o#y*ho-f5R50h-fU4p!N2M58 zbfQ8Sp?bl{%1;<)b%3x}dQ*(Xqd*+S!M%X3X^Pmy-0#OyC(fDsg$1X*=&NNi3W)lr zgu}MAULtu-XW6BPJA(1ar`y`Hq27~BmqhuZDYFnaO3d`^90K>w?<`c|I!_DQLrh{< zvLtI^Oej-%gg5$KJtS3&E0iV!L~WHO1HNMj#1+kXhXTJUh0n6~gh>lE@M?HXgE4>6-zly_C<g*le~uTbx8O*IQ&>*VgcbP5E1Va@(fGD4#SZBD*XI1 z{8*wQx|1hqwx3qg-P0lWUvJ9bOz>k@%wsMs$XKm1=P&MecNDbeb3V z5x^r;tc?mAZ#W`GV@f8lDC-=K)kGG>4zgw{Y6zl#j!m&znbaNQQh0ejvQnw>zLzEo zZRyY+g&1NGckLAU%4igg4>nlV1GZ!#MqQ#E0IR<)LMp2|ci|b%JnwDl`DBn``On|d65vLqg9*?rwbF{@Lw@>u8+Bzd> ziezDuS4(A6Jkv%1SY&`yS8yoLPnK??Px8>{{OrtXXs|?k>yT%jF~`#`T5>Q=Xw(j5 z#g67quzG~ILUa-22X-j_qP-Qwg!6JXS$>f1RTiEUA=&u8sxW9s$)i#}^g2+O!t*py z+KTVj)B+*hERgNQlf4SP(`B~IdlU=mFa;>Ln6MP*ggDPMlUdi<8IDhG+%@k2n!aSD z*9))C{-w#*pi>-WyKGJFZn8Bw&5~@3C}A4pMRQ@6lEG}KRel09Yfa7IxzW>Wz6-A+$-7Sk@4^Z z#%sx#uWqn0%6{hv6W`)dj-OXIY|R#z5CTM=s?5kWJB9j{8AT_K_EHIG5mL!K)`Ybf zbjI6bL2FV7b3Z|DCQ7Ifb6w~GaSS_5WXMN0Lp12tr~25`HfN0E&WLWo@pIz@miep$ zApEbtv4vdKScm(oP&R5MXNwt7e$YRlykHaCfy_-o1vykUqHSRYqu=N$Rt55mc4^wTa1EKEPA%I$l==?=U~ zz$4SoFZH=7{rpUyWoJ0>-STp4PCri7RKyMsj_OhC@97!f@uluRT>_8UA@>)T$ z35R&Ez>08LCy52dcFfPC%p=e6VzDs1hcGl4KfAJs z$;X8;->fyW&h_F^=H+ILPM`n(C#t%Kc3Tsps^34r%*;#w@-Ma8^F4A+fg^d?(BQ5f zcPVFcry%MOe!s#mLHXj+ymA^|biU)rF$O6$=ScG5;|-<3ys;ZCX+!B;`v<;jGAy+~ zcFX1=#59kmN4K1wVYW)c#Z!}5ftdVjxOjT!IR)pXw_jCllbNwTQ}9JFU!ZE(CD*Iy z_nWh3;TJRbRu=9tKY3}WS%^Vy@4+zsui1inth#|h@L4m6*xndup^jgrBrcOr8V4@* z65z`Ra^?c)#S>@+y24sPlSOco=G^~jE9B5XBM8@8CNky3q=oq>Xk~LvHpEmQ#Do7A zh#~%FMQjH5S$h6jmlkbNK7GCPR~4R~bo`X9oHRV2 zw|7LV;#-F7$C&*(qP1#)e`ZU@62EuEd;%B=t)`tzhuDiAvoCk)6bqRN)a?-5KA)|u zw4qRSg#&J3kJHd0baZ?O_b^z&GU$lp(MEFw9WcXzfzVtgwaxr;c=8ucQyCQV96*t6 zUu|ah%og_WWPxJbGcA&cUvY1Zk~k+UV7(|9))%k$wgpq`m0m|&1iZ+Z$4Qp;ewu}e zRYF;-zEHqd>%NUO^;j!4l?5GmV;)k^xfV#?3Kq;cS2=!OmD@zpEDHbuv(k%e^<6|;({fZeLx3>ZsOh?1aG zCLolhT1(n#MV7V6aBbvAWO5I&>-`KXpoU|>jYzW!S$ZS z5sO~GppOvFPJJ}ZVRGm4tXz>TQFAxMatKI6CfVAI-LuogIyIPciZ@RTc8wdo7VYK` zYOw|uUc$RCG;L+4Y+9fpgld{MGVd2;*Ut9RDn@6(D&FwY9%)pXB}+Hmt>feYQADL> zf{5}2j$C-eq}#${F>BL;ag^K@HgOey^SYjsDU0sYOvR+2Fu#nc5FXxcL=O*%{6u#N zy?%p~G+jC~aQ-0nW>lmYG=GrHszrM<%Fi?_25{3vO2R!sM-!qkueBV9I~h z-A-1(kGYKDhBdI_-?qHGAoqj~1v0 z30T+D5TR{^jbQAib9Tl`0_;*Ys&H&Z>v|+;zMy1R%k6Tn=gKLUw(g$YLgDWzuYK-N zHeB)pK|Q?O)ApCky#PdTv+i(n9^>BJ7*@SZk#K3g-VJI-J*ePFHY`2Kf;^sX&{@>t z`@Kdz^H;8(J2Ld#)2GlSus4C>a@Yb_YY!XGaJEg|GlZR`JUQq$vzs&;(6R!6ko7`^ zH0~A!dqEFmy@pyj5;h;BUz_r$Rp#VD@A9BGr6|CZP$(w4XuJ`-`L5W_Zx=uz4B_EZ zF|=qwdjocmW}5)!bNGENa_ah?2DdVWi+vv%KirHRgC24$6Ie1;swa0Sh3CKpFfZgxVOT=gmdk9#*9W3g~h2}Z6j|>;y8G3OH?*2nm z(j8NKqJ0qB-zKY0p;ZeWaeA^^wKE19MUz}-O}Nd;fpMs4`jpli*D4KJxAEQ(2$n2# z1ceAQ4bsUiKfSPg4^l7NgPUOuHtA7^)tkGpE{pcrT0c7nQQ);8>+R)oazHIn&6Xgj z*E*Exk>$hF+fhpx$`Ab!n&@gRmqX^%jckRjV$1#*UgCV*Yy2=6P#1Xu;z4uw!y-y? zT69V>^;GM>T$>ls1J5I52HP9qN}knf6AQ$C$%kEFAS|Yk=@+@{^91M``6M7~Z30sI!MKZ`^2{;-T~|>TVw6F4P>wyl!4SFA0os zbCbT&y(_bH7R{d#^WTvIAzjZWiISx%&xn~F^Iw%WE#+^B<=;>~<(W$jKTfG;u{|O< zDE0|rBc(vU*IQq=JmYQ9P-#}Xt?|@y45bFM2?H68?XuVbu^10j#yR31)bXu(FMLDI zw^|F=vg3;RE%FS&A<6C?;1q3zxT;tX9FFa2tD~rkqI#+ZjIu;Pq26!jM@1lD?(_H!@KGOvbis;^DJi?4k|2|4a5bBoA#(w)6$rdIOPcSq4GU zjWU&TNQ&*8V9qF|OP!R(I^}N=uXhr!GjtU*Zhmr^L@Ca%I>sl2Q1V*Bz=f3PXGa%H zp&;(qouqbA+xO{(c<6$hwd$3IOnBn-H!Og_mM>wE->ukpx$xGo70^>RhL#&!n@Vzi z5N+S&X;syz0Y1!-@cO9fLY8r+3-2omvU4@oW*QXqFQ#hSUf*~!-)O$8Bk*b-3(@xh z#*|^Nd*2o&?`p*pv=uK7_qRA;dRP~2%xXSr*XQH%q zb|m^Qy$WQHE)z7>&q$5tsi{buSYsU>7cjp(QJv#;rk)g5;

VL}{7#1r$+WOa1t?AXBau@&^gpfW*-ap&XcD^H0hy!Uji#9e5AO0##K55p! z-6c(J-#MT?#gD;nJ3V2Sgq;Dm4l*XC86_xTQSr@I9700ZTY9D&dAs^lh7^)0aVZbm za8f@TiCn^+yNb=JtKc2y#tzcu+QbxL{W}gIm^(R>ED!V3!W6Dt`sXnEjd8dwC!BD; zHmEoA#}Ec`0D#Ei_ndm}LRO>XnXl=I$;<%cj`UoF^^9;SdYLEL{uHV&&gAV4=z#Yf zk-DW6I|}alq&KXe{$&?~pSXVdB>_+C`sv`W1<$JW)458b^wJO3tCt7El|Fd=bQX_$ zl0IqubjH~}q|aYJoqKIstF2Dc)xETfYY1v@*@x@Z`(l^i)3kp2Wf|L`PhLMA_@9Gk z!TRab13hcjOV4#pmK^Vxww(Um zGVFDJthQ)9i5`7Zfe%7*zeoOx9!%{=|`fJWgnM23sbZ z$!T()mYv+>lT>R>RTb89^%)+TosTawz|%i<9C!9ILw1+dF~OGNN$V!294pgQGs^6d z5HM68SF=1l_c_)dO|NM3nq+#|Rj=_}du$96b9*N5Y28UPj!3?j=>)yd#+C%71h!$H zIWdoD3Bw}fAuS%5&T=Tx!FunnR>RcZT$B?YgSdd*4x?1_3Im4M=A^o&eeQ^~mVmWd z!m*N*{W95{9z7fX)i~SY&H2i4iPhDn z{IGLNNQ(a9Sx;z(g)ir5)#%%F=N)>kUU-W{UA{9puoVktJ6c?>^ z#98UoxK&y@&W>b#k?w%LiSa60FN)5j z!!s6#WAMlaj%HDi@~i^&x~C}Tn~7IpBp5(9r8P^vymMh$+Rx(M+FLRl(7p{ z?QlQ**MF$M3cep}nM4R9O+_113-6XtOW^{|L6wx#ZeDdAn1-?8I0;`9~MF29Q}6+{~N!LQ={?`N_vn9tytD zOE8o_KKcG6^8zXv;pH#T-BE~MEn80!r-FP_!N?Tg)1Ef%E=UtD()2@(AIIrvJ{BcP zl>FII_QIG14NvG|+;A*Yy_m|&u~g~1fsW}FYPuM659Jz8@^Vkg#RYM^s|e~r@RYux zex6)jAnkLm3RB?yw7{#1fGv@|zHfkdO$o(pk%|qnb)=(S!}45={7bO`vY0-9xUE&! zI!JC=HW>!c5LOb=F11{}0pZu^jEnWA&La4<3yt*G9!UxP3tcM4@)-nI=sFek$5=xN z`-RB&_rV42t*1Iguj=H3M&2OGz{>Y-R6@)7utYGw63IOo_HvN3*InstVhb1ipFq4e#$wkF z;}9rTLEL~haTWt+@))n;d|9Ny!%orgth7@WK-Q!n_V_MsS{p$KkZ@bZM6+?Mqp@ps zz+4~6Atb|fG!#7ZQQAcT#St4LvRKGbwzn)G0(cSz( z*NltM7?fE0U6D;LI@PMG9PenJR_QvNG-6=_@jVl&nvud>5I1R2y#XDUasT>PR=Bce zx(n+lM%#M8If1;cKGoIu8*_;CAmmI53=iH=GVb2TWiw6!VN3Z$r!^WVFT~$9jKiU6 z*0r+Qi3zXkaEM-Bm`$E;Hr5X~%gdt$&9pZ=vYrqlc-u>Jw4^X+s+W;uE=d|50+wuL zEL)a>ye*a?2s0wf2&bapiJ+-F+pFScPuP3g)gIclFt%$Zn?cO|08c!}fitE-w!|b{ zAa2dMJP|r;ki6E5Uosl4-GP)7O6s+3vQ1f#1cHl zu*^(Bu*sVUV8}BT6Oi!!pwEkDIGQ<<*m7>iM~NlMB6l$*jzdzIdAbvs0K?A|q~y^bx@F;h;T>u5vus z#jFhkAhNoMf%$T?-G*yPVWfO9)m-EHa8a6bjapZcN#2O9y9SpkR0yprz1nNAQnBJ$rk4ByU-yxrTObv4BZtvj`>I)Eyxge_@*f^V1W*C&iONTl#sZt7mJ)xQjiVG zIa4_ZpRWA%X8gR*pt#@!h(d}k+$c1Ou(qF(1W{`qaiSDW%nYQ9qwcybwx6iG=Y}vz zRgXF_S3nFQ_acl(#PSV8X?6-SH-cdEFpyd1k0wS8c+An*p(&FGhpGlMHJcn~yqcJT zpf-bM=e$-h$sJ0-+A=a(+tXYenjd#`le7}1nQMAtxdn7{7QP7Dr&MlaZ<__~*i9E=? znKd?0Rol~!58XIWwA?AaL+hf*_vIR;3eh_B83)CS$41~?EXUM5`ySA)WLB_T0E9AC z&w3e58WtDmd65G8TVj{J#brm5fL)Nn5}s|K@IIn?z&k&Z@;1Ro1Kwea9q(6y9m!Hh zu;BeN!oI=Yj4bdDc+O$ZQ{8pI#Jaf(InX+8QVOC=4S2K2GunFQf*`~SV6+Xm=05MZ zIM*MToyLlBwlBV34vUiHp)fa2TM|L#0{b`oVkzF1rsXGB%2}ClM()bdSi9vn9!|A% zHfI8cE>)?jmmE`mGDmK;byn&{xz*B|j)hnTOtdh8+LV^Q9LqszS-e3|j4xl*EF6;Q z+!MeS2XtY=)$YQebmpg7AM2VX(m%CZ7;8<*CqX1jmO4+Yj~OV|$B4i8F?+=jV`EVY z8l`qA{2ODvRP>5t8B9Hlx*vsV7H8O&$tF4^1&C!=W|QZ`g@hSt)~d)k4zg^pf2?l? z`#VS(i%2o^Rj=n3b=(lBjs143zJc|FnTppUq}`A%0by;1*w?LL&YI@Agt(@hLNz}Z zE4?jN+QM=&Ob!*Vd!_eC1Xt44ZBYg%%I8LeRlngd<|?u#hXZ0%SvRW?l%2tPDztdO zTMmrdyse+Vj=g#;-U3>LPfQ`s6GSyyEkX=WHnIv=rVthv8MQPqjvbSf;-n z>tUcHLN7}OG(2t$LXf6)CuqyyT2d*x;1&V8Bs&)mgmi@`=OZqiP*?c9ft!5~7w$wKO;gFX2qm zT_}zY_equ#RGG}lo@siAx#t$nYlQbx#~X%vaxV8#Nw4XYj_!O<>rmy4^c>bV2!d21 z+3#nQ1FaJldv@}wu1_KAQHM-YU}c53safq+>c}1;(wQQXp4*L!p*n4>_}l^HG7bjS zFa{Q##kJob)Ln6Yn{d+3;n*j;-@9$kc^j8q!8LKDJ{t) z_*JVZ9dgYs_4~a4B6&bI7V21pOP&PtA$MAuYx3Tg{hnNL7I`wV+slr^vK#~>sI~&u z5Gcqb{p^0mx}+U{MIZ^9w@79XwE;|xIj32rbOI*%klE%Pty_a&W#^qC$J!|HECZR9R0irPl}{Cce5r1KUqDbgYgh%q6e%Htn*sz)9T9>1X;|iN`7=t}5)5 znL}HUsS8hx>3P`@OsJRFs#`=-CcM+KyXd`8S_OFd-62OuhXaKHjAAC*9H$Hrrt#Gv zzY)bHD%r@ZGv6h2uTCh2c1q1XiU--T#`?KwMnB1w20RnW@yS>DM*Ofoj!jC9L1+&r ziPsR1dxlok4Sk(>1qm31y$bga(x(-7DjT$VayyqL$gJz-s6$<*gSDQ0Rsh1OWf@H4I7H}{VbpieW$nwVeuaDHp zD4b5=peAIvdpUg$lEIre66?;KP>4!N1G*eSboAIxWOTm%XspEvw94{9*4L1=Zq^Bz zSO>b*K{l2TXwQt?C-a{nbIHIBWafG$-<@QLXKwK?*|38tTum5O+9@*!AIMbyFh)46 z;F_txYPW0$qjeH_=8yxE*3rzf>_&imqH8!r5d&aY222C=vrYI>sMhwx?ZelO`ZKhnjK0Yv`{iv) zGitVR%&WDM8G>C|+6zQco(CrLKm+9J6!Py{l>_-m7Bc~rnA{(iJQ?^mYuiqY(d8jJ zMs)MT4LZq!BHhryV|BS(BE57wry{{sx7Me{-04{KgJ89mw_~l5bnYi~QFC!#^UWAT zG#9byqeHe*LZW2|veyjz)6|#qCs~oB88dZ)bEuru*N( zuFNFdw*YkEPMtuzhnh8983i0j-4r^zwXzeKZrnkj?!L6+(RL!`-VW7Tre#zH7mErdpmC^o9 zi$lr?7$|Xw4&y{C=7l9kkx zz<+URYYF-rY={K>)8AUELQ8wX)=DVtkRWJU*bbpPzQ}BQLOTwHODD5Ep+iXqs_F^* zga{}sVPHmbw26RoopC#@k~1^iv?my#O%&4W3{2r+)m;kT0EKzKhifQC4&tzan-JEv z^Vml6PXrd`#TI@i*l@OHDDax?PO5p`*niKhX`nj$T+{dA7ux!0YC2q zwsELa-7+e}x;RJ?7iGE`^pO2KK`XSlHFOj0cT-W=%DmdB(0IH>__C1Xnole-@_#c; z$3gV?DRW2z*)n{UhM(<1xft4c(~zhKu_(o~VNVT5xzGg%#;46A@=v9M`EPSiKxmX{ zsU`v>*rVDp1ho~}UJybAggp}^DK=W;el3#K-O`eZj@j#6`qNQ=ak)WJwZM4lNWmH zsL(=Q4B~7+=m!116S^cEcEnma>3wmBQ0pH$fkomu)&0kBEq`6-{36DR%a5iD>wOcR zVSxaiX5t`H-P$rVVusRP)CSef40fl_V2yw3RCQ+xIV$FXB{ih(s7_#_5G8G=!^$o? zx>L3;&O@M7JXNYk>37bFPY$gewjQuOT+tbr6XQ|?Zak(Fa1>v;3V=DrqS45N2XXmw z3kT?-&zBtAscdJ_;h=bOn8X(x*9oi}!N-}5_GJjO_(c0?g;8RM#{V2;G_?(1uYfIL zx+4nE6sh3&_@@TE^7u}`UFk1alc1Ra)|Ex;y|5J5-%+9>8jhG7LY*geLeniwB_fT% z!YOkfgPK306O^uBOHew9uU67@28Yh4T8aFVI+ci`$AR++mc6)hc4U7pP#-p9IgXxr z=2Bv?=HyPua%d8&*ZvzKIeosctAV{gvNM=~1|ZWggeQ5$gs8I4>9z+vI=CZ=!keahqHFwy!c0!os^AU0hq^2yF670YR%tqJFu5k`SHI%cBXSg^_3{&HfzjP{O_n{@L3{89-!g8X1awnKLX5`~WHF0}2i>v=( z2{7XP^`PTxM|DBaOsYDL3?X1-;0iIqn$dc}hRR3nH8Qz4Fk{t)ouIU~p|N_va+riO zuHiP5Q9|2Vnx4l9<14HlvCp5TQy-u38Ul14wbpAmW>#hhM!Oba5a-*SVYo95ePZ;KegL0mtbAUyQim zT6s--eoclc&NQ2>igW_@tDgic*S14ZiCS%fwWWGptwtd5-T0-g1>3HRz(}O6J``|8 zC+ym@4Uw6F{njR7zZD+~+AauInFLOudXN^*IJK~BxM2gxOfWFoX!w*KUE5>+QK58pJ&7mzoj#nBWhCYCw1kNTO&Z22;&}G_bC|U+7dPJqj4Io zPfPK23Tmx%Zl{t7fs5!7QGjAwoWY}DH}J1csG3=8pL$Qp6G(`F-FhfpOR znl8C7V~<|6+~F{?05)WDE3?V6KzYfX>(y_^{;Iz&Bj=8=80j*v6O@dtHd+QqZgh@D zN6%-bg`TAjigJt3W)+L6l9vhx&asy{!Z=racROYzQWY~-v|ytT8E^G{y z`@Jfi(VgDLNebhqc=UIN#G8YA)#{h>h3(iG6?s0)Y%$St}=V$T>k77BHqH|x<@ zgm3eIiU%Cp2%%vQO5>M2=GEcUaaAz26fN?yn)5*V`{bjrU0#;vxS=0+p|N(_x8!Lr zBo<*QPEQdL=7W>@+l8QT&p4D?KA8crglZ4BoXLP_e>!!X@mxd>H(;UWDC>GQtD(DK3QitN@Ri2HwD#Ii(NMcn@sE0|sP@H97}zLi z+z{wtV_6~OrBR(p&W-LXTKVv)c@#mFEs38V%!~F#8__!23fm02ZhPyN+)^h&5wZ|X zZA&>seGxOc|;;ZQm|0+_L74`PwHyyL+)5&mKxS%~{xo7ZPJ@@R<+&AW1k$EdT zM@8l$JNqOrghz=+y%n>FV}kj*N=Fu2DxwE)NU5a0^0ysgUolLXz;H4ur|o5)Y3b-g zyi$6aS4zW5FIJ|JEUi{Vcnw($^FRw=lPK5*PS(KqH=k>u1a z4c+ogLfBNG7C2P$un?h0%|p3>c}}5qn9z91ky1p9t&2AO9Acd>0WP&;SuGT+!$gZD zp$~3OOg!d(6s^RN#= z+%H93G{|gC4M;33k+P({`F4e`_7ksddwJAvo!!nx(e*(|wRmps<7{%X-FjCHS-hcW z5D%r>s3hz139JW5W&Cj^LWgI?pGLga|0BgOJ5FIYuP~Z()9l_HzBPsSkC1^i=uOVU zfM{9m2((77Vuh=b$M0Rt6rx`O%|c*_tm^96L7#a`V#hMp)pzWj)@JnXiY@{zPl39r zRs~|APbEgInNe{sDUvkE@9S$~FzjqGXMiBLcf*58H*sjK5ZHxisrE@Ps~i z=D&^G3)2#6F;cvd>EY5Z9g&ncx(@apWBebH=43QgnE2_QC)8|dNAWcJR~*|OHj&f;vsvD0s;0zFTC@;*V1e?wQ0K-Wo_DVt5W^`c(IY-}3VoE;F{qHr^uwlSP&u-q?> zp(jf+B%ZHCB!wbh((!6B4?A%ZMcx_8TLf)nwjApvT9gV4NSu7EOia@SD7NqoKLJOFu5lebkp_b^GTEJKe;pdx|ZOd_=Lyn~I9baC>u+v`90`{II zp(qmnEReLl-Ay*Zf(#6QREu!+`%oIeGdnI9`>gb(0;9GM;`imT*jb&6T^lQTBZA>0 zW$}|Gu+U}~T&R@$LdI%iJ?Sjb?fbD<3>ST??UDFRuxz?vNkQxecKYE);x?vR7Z%2J zIKimsZS!WAUJhJu1FYV^bH7P;u*Jq?Pr*skE&`NO9=X6j(N=%R(sWo&#a)WLg5AaV zAUC-&x{fACk=)(*nTNg96o-@wz&%@z^0U*l)9s>U!UUjfSiE(1U&YcZ)&n%KCC~I# z!A4HGv#pGEEkN$u1R9iXBPqU#}8t;(gj*~E9v2_N=vxOuwFb+x1JBf`g z;!NVVY2xCOn4?1C-Abg;A<2{Ni4Q7HJ&A=1ePq#uuZTX^pgFyW0fL%RoMkYHPq7>Jan&^%D`K|?y9#~I?ATu9?nvOEPb3lU{63DKR426Uk09>sTse`L>=8IbmZV%cbBbQ+jZ zzbd3BfA@f!<>HsU4$}`a35j~Grb@nP7KK}fZzN{J+ER9=LHgQK45or}RY7RcKSl?e zi5#*(Dm2JdZwsM{JFIyv{2*?V!1Zvi(oLX%d)k-{;6^ENNW2B)seNb4TvaWH;3ruB zNtXX5VC~;!?Hw+O(<@N{Qh}!#|9paDh1ib3W{Ipy#bXp=*TR9f2iqQ#aL1}xJ(s2> zYqhEgeffHLxwL+(*dK7u`|_t6@>Ft1c)oRJ3gUhFVYjf}^b7&7CHAXG?v9FvN9-$T zE-`AYpIEXf+USo&vV0dvG@p`Qw4c9!YU(Ig=CUsdZ^$GshKGfRrRiZzB=7dH5iv7O zk0YWF9SOFlf_LE3G+Rn+keKw+hUEM1Am2%i`5@PB<3y;k29>%(rBIxajiH}E*9FAD z$q!Gph4nly$&#x&%zHFi=P>---E706cw5JAvCSb0&fUirU5lX0W%Ph`|ImTiNKJ6& zpvZkqrFOMh0(=%?Ru1X#@^DHpND`!gEbNG#OJ2fRB|3vzxh$VUW8{ycK}i*B+r=9`LUQE*kW8OPRDbinkq zyc$@w6ee7{vqujtj`rY8h@;&Uda%3I0~@F$9QtVR=^gipKlYv&&#C`RI-+}cgRd7F z4JGhf8Q64&F0yf_)}3HF0p^Wk&yM8Wt|3brFV302CobUBg6IEhRDk+I!4+6x9@52w7;td2V%vot+E(`U;AZOIt{JeEn%HdQ%r zCU1~LaxmfTf=DVNd6D9Zq5*#{vJa#Q#(mpqQ7g6ydE1x%#Bqoyd62#+J^}D{Hyg-R z|K$J@;TE<$*9QOs5^QJ2rPAsMApznpV39gU^D6zi`MrK564qoPj=MsOH?h!FE=R@sJ6kh*8F|$FuHEAf4nd6a&ZeAdyt;Puv z$0^u9G*bdiE%eB~LNZ9bs|O3Hwwc;y{_H;$+egLr?@(-UxK%i6PcON)+kX_AlD!;Q zRywF_l+eg^5hm@dhW(dFtW#aTSYK#PHj!ACqHvM0S6k8lE)s2f$4Vp;7yTQNDBq`@ znjaDgdv2k#NVJ6w){?aJGn%pJ^$m2r1`x_DcKz(wS1;vbEuq(S#UQMVW7qeyt{+|( z>G}^{e?vs~eCYb7{o0$e;jWK-?cDWMKmSj~w8ml}w-=ifp3N-S-|5^&eYpdYhIR`x z@gq#U$kh}Fv01V_jLD$wKOlAi5UU)*jagNu&d-tq7w}Rk!!_%gO+y<8&Z5}{|c!|o@@{Kw=WBNB) zBIz20i;mtoX%HPdNu^8@%kzmspHJVg{uz^8Hip@z<0@0AKFiX=J+G@ zLZD_rdZ2HzGz9u6KgiqqGHO?bvx%X#(?dA<1)fhu3MbDBVK+^T;Md93P?;P|Kan8! z5E3eoXlQGP(1gf5Ou{KphE954ZD5gffWkn@#M|W%Z@A8O8)dS(zZV44^aGN||4a)g zEVH=%*!D-t8#S!Cgl4g?)jiCWj)zXE6K@K&T2c&nOr+A9(|+a6?VdcUJu#E>0m*|W zp$i#?T0MgERMPo+FIZED{Mu>zN{nsPHn?wgHN978k*vD%MI{P3pD0p3)q$fYl3pGy z3$2naR;Y-q6G^#Q|Bk$UCvq|xnv zQFs{oz1*x>%hNJXtIXo87Xn}Hq26TJJ<{0J7s&@Y$B8a1Aw*}-Yi9F*oVv|0>t8^eG*zKG{9l z;uxoSDabh6N~eg-KYBs=Kq&0wO9G(ZUgvrO08@rKfO@euZcfyDv}BWnz}ou(Rr03@ zg*;XV+ClN2EG>M_>BW>f2O{#rDCAU~b&FQ~*5Z2t7}yr}LS~ker_k5xN)qg$paZCn zF8Ex@h{@-L)+KO@x0JS|{@KSkm7AfEkjJsvR@zb^b(B$SjzyYb>MkfAd6#@E`Qpqj zS489*d3WYEPku~4QAZ4Z-9Ks58ibV6c@XPwI|2v_#YEJSFq_t&Z|R zbC$jlqKP`%B7I$u=$vdTt50xhFDb(KRhRBtK2?mx);ucHSt9hlq6DzK+1s|7jVF0Q zZBWU-P7jsNhqIsZ7N4rQNC~LcAW_s+Ju()7Sr42u=%Gr z`q#Q3pwM-LUcCfu6du_s5x$HXD02xp@yzK{eCWbq@az-`B4=;Bo5OU8KVeW3%=cLRdS znEDQ}`Kc)dAS}Oa9Y0h(XmSn_3HPouz_t`dhkax%$>=4`pOLlJvzSB>+qIG!+JIAm zOm%dTUVjUURAq}aeNLW$6vG0r5Muveuq+NUdUg?+F%E@x9>;1i-l| z;1*!4(R91JTA?9;#HayCUvMcJJU$|2Bf%8fO$W9ZCa>&e9Gl{~kYKSiWLg2m{E>Nb zF<6ymtG)EwLp{tCT{^)j?TUf8Q4P@Hl-dy%B<7l}xvYXK!(FV*@D?w#{A5`c&&nh- z`kRe@(CMC|8JG!tCk;7Kf{479Np3pY493$POg8a%yINGL+B3YUgn>q9ZFi~`ev`B9 z(c~23Ng27Z7mP`!CiEFoMZ4Juc%p^KWvJpz$H+F%j@i<-)p|<@1qTxP1oQG|r`VXD zKGDm`p=y-a|4R|1wHnQ!g3Ei_flkX=4j5&KkRQQCVxi|ygev|v&d&GC&W`YDs@y3i zc251e*^X#dc1|TwRw=M`=XAs%>-gV)Vzb#S&w$uII&75W(92(swc(J=M#oZq(4<&C zcVhDLFF8?V<`9+_D=AeOR1+hXw^}ub^aA164Yo9xcCJ@!*1zbMabj|5xcau(vyq$4 z%&kn=DOhv3olcjPIk9ajM+t_J7Z2smq#^$vt>=qJEGJi;)jmgyz5CiK-MN86(= z)2BF7c411AS@J<4V<0MGgU_8H8Y7P$9rp;&GnKFkqTU$>KBmKiHB-uWY|cfFPEG(- zp*LXljBv8%TMkf1MT$e!O6v12-0!`fzulRc}&;=k<}0~q&Lwx zOEl8?q+l=2>hU}GO9-2PvDZvEJo8QuDo?F>Yb)bt@iYgCR+_hp^7f$UNKa?}LExwj zpC|q7qRIwiEs<~Q_@w0sWP|~sZQ@X4(|21ky${LcUdAh?9;IH!vQPURb{l<@kM+P5 zyI7lFq2jV#X$*7Ihj_*a@e~ez^&6j1rh+?9ql-`~LU#fx7sgZWrd{&>Tb#etsZVS$ zF!3yo@3jGR^DZDCs+T|X@IrD$i2So`x|jLqR;q=)#dpb|XY3x2s1dwsmVz_QlJk4rLd~GbJ8g<&fL%qF;0MlNH(GG4@ry$EmCbw*1 zyS=9Covux60-t$NC1e@X`^s0-G`0As)$acm}22VJ_=C zbGA{C4y<{*+vJ`jpB51rRSo=;aY83{W+Pahp}PE=92wpn^*{lG8l<+P^0p_xAJrQ8H`nA{x6PdDUTmkPHDgwO<`@C+u4Grg?L2b1Ef46`35DCpNMwS9wmT z(xN9rB5p|bRB$(#4!Q!nY>90YCqEq*t2_&ByYBs!xGBuZE4f+wnyvGnOX?%S&sTWs&a6nTAK%1eUwU8_BG{=rEje$kYCrpNtx$>5|zW zRQHuxiJ4x)GzJ6sw4|-kJPMY34g(wMk&Ht!-g8{(TN2V?aGhU0h&-LezexG1n7e4b!1+UBFIau1JmE zEI597dr+pL$@e=R&FTtOevbecuM0GmYvz0Qhh@lFv-%Nss8Rf6G43O!JoqScUD4ko zEEOSovEe@pF&RCNnIKOsEf-UM2^ut6Ve;XjX7g!tD7oKE(u~^}@Sv==Pd+(5i0uPT zQc%N5Yae6nf;7Dclxlrjm^}3-`cTf~%cV4t)0yg2244THhZnN-Js40thi7R0PprF80$GyGep7f<@dK|aBn;_$L@$(Un?H}lNxG4xY@%!YAQ8uVYI*cvh(Bn3p>QJ6F zuUR1v4OHsUGi+GQqURlJ6Gz=kPNi_dqvqtg5Ib@8E1nZ$C!RTh5r$-QHPwcg zB)N8c-a!z$;MG`wX$b?VXkX(=^kkkaLKe(+9=3ESAl8^-uFZSH>k$QY>fd$DlH^Q# z+Yz40e@#MJB(M zA9$^O*pJj|$FaFw3hjL!#C%~|`A7f*}*RP)ag=^Bb%r|zPdEwkZabMiLN zYEp36Dlf=IG^!1p=tyzwgIm~r0blxYJN)L@q(ZavLmRa@qNzIPpw|K=YU4VbIw|{p zT9&6cs?9T7ucBEa_Yidt#zx*28~I#lB-FlMXtl5U})zNh+_4bi5GhxFx0Ig5VcB=(GO?9crN}U4wleLW(~3vYe1r+XRu; zzK3dG75nVG*k@nG`GU(ytFpGwD*wV!$U4y^N$n?DH&3DjOFIKpXCp&3K8tO3{T+SM zz&iw*FJNxebhYqHM@4kiFi)=C|O7XGX}lWWT)G0;WhS}&`W z5&b7+MO*PD3?V*eqyS+dqJw~ZQ#{Ml94P|!1m<8r!SbrUcC;Pym|wI!oV3AAtViT6 z+h86ArRplb*$~!HaIpOZ)FX)W|S?5D!y}KFw<)W*UZdH?o-r2STLb1o!JZbE z#JL#~S5-LKbFk2@$ssx@a5C+U4dwwhOcrcFqJvO@kwqNEhIZLJ+&Dp{Mt3cnke^~> z$HE+l))eAKZ5|MNd#wsG-&GNQ&5p|Nd*NHi@74^+^b8sTN!m?zPB8YidUq8r-F@%*VL(T3W%e%)0{M0 zRv5-H1n|`KPsqyUVo5SsN?^o#C$PD}Gq4M?1um4{MLrM=V9t^00R=o+H`|yOMw>wf zbd|VS>Ywjq5X3dT?9^;nnxhpW3PWcyHTsc3v#6_+QKrOh;S5rXNFcL$M@miIIMzTH zrl5VK!?aSPO9(@4LXjq4Wuq$7nc$q!DYRms2D08vky&K_b`#~tfb>$c{ z3bk~1Tw2&`p{|*`F{8JaakQ1hPU_(x3_h*-)r|whA}vg4Dx6fuO%b~v0r7C2WsOw;- z{SAH+r6fQn_I6M`vHRcUM~c)Vncyd}qle^{aVFq1iX2B)M5`y% zekRY1-3RWnk>|(rHdylzTYoB8;8}q4Ik=BQ5{P?u)f8{aBr6%z8tFC3j8JkwUkCk2 zd}mmF$r53LJ2p0DG)p7~w0E*5SDu4ve})@8aC;{){`m}E3Y8F6 zR_wJ6q_RQk8FRgqs-o944EWi@t|1onbJ)%4Ow1J)EGf$(6R8_VfznW*NY)j0z1qvH z^)jjwx2gj5t(02{IyG={)W(ih>Io6&Nc_R@fYnORVqU@6r=wuyas|!|k=>KKHnLil z^mi08%rG$X@jNbIH+%vElwmBd08;hJTb258+w9t`<`qWBD*4jnGP&~P(i7~$Wc{WQ z7o2L892Q6wbx+Nj(3AnE< z4E=wv`k$d|{SW2s{eMLAT;ROykQnc@2d&y7Qj=Sbe=qTeg@kMZ&u9@PABXVJ$?&Zm zkQ2H>(U8)vdwOrP_Tx4qg?1-5x> z;|q`Y(ZlFyDwi;$qj?}$lj@r7oN|rtCUts$b*GdMt*p1^O(}Pvx3!U^eOGh1FK#Mi z=Lq2}6f+bUmdvpT5@o{*Ect>6N>tRmgX0hZ%==8h$cGL{R;O8t**(!#cRi)O6@-qa zDgHh~$M(69wg7ETsks%7FiW@0OypDD&GuE#Mr+>PGCDCV2`^#$zz5^^L*YB9%G#YA z&AoXHLCEKQDZBl^>k;K)VZVboB287R0cru*GfXT@1m>JIoYpgG*&bMYW5I@IzKrDt zWX`K}{Mu2&;AoWTXY*F=&M{YAdj*$(Oa~~EzEG@fmNxtoDC<Y z&OAPvcJ)fcL4Z|BlgZ09q(DY-l|zXAjP{Si+fYN(bj_Hi1?=(+wG-|{Q%liLyd;h% zW{pZ=a}lEDKXZ{|b_+@(Kt5cLg&O`y;4))|p39c#m@ zH3g8ZkhZ@f?FP+rG;EOWxVXD^g1I?N-`(-emkk^$+vMX#4~Zd2Nbn9R-y?$2ghnMA z*;>dU!{NE$RtFKaJUj)l#Wjxn{%)LhQ@P^tl#35Vp*st-CMyMWN(!p6YV9hOAXcSkUm(Dbim+a|y z;&AShoYicTW4-5KtCryg;Ax(etWlr>dS6R!GID!4meX^Vk^6$_7D*?s+4HdK5pGAy zsx?g-q1z*xP}X`<^05?PISv|Og+s%Btl2$3nZ>XNa#pR^C5q85+n6nPz}_8`bz%N^ z18?h;4)}ejbkNl9Pw(4 zfhN+J-MqgO+At7lU)#2ej($yu!W$SnIsEKBG9lOuGJhNej~@TVS& znH5P;jZCwJ$y%0|0L@K-7M+&&yDED+IAUUOgnH37IWzd6SsiR<`HZc_iRdK2k1+?tpQ2oS%oLJs= zQ4E3EX@V1&COi-zatFsEYDGj->uJes;y8n5Xqu2|rJJy(;0*YIj?RbB)*}6J^u;b8G z8B|V&!q@Se<@O3v+*=cyjv1@*)(vBL+HbtbEouN1+hXxakq>eAY5t(6v}&@c%f>HD zVRglCy{H_9vQESH2hflQ3`bNj|_8({jO}!zTQu z5iqLBOLVMfc4*I{H1nQV&!gK~slkVPsrzF+uk^Q!RcXeJ!$Nz`+|dR~>k(d}V?9@# zXqg2^dgh8)&qdpY;gx258ta+a-!dwOc!}k)o_8xOV{Mwzv7QS;J@vo$Qhym5*t2XK zE44Jun008#cyD9N82JY;ahZ-SWcq!g!puQ~{^&U!D?0r|%bbyB-W4mlaU09180w{7 zi51WS^kS%J!Ei6qv7+ZfMa9Q^<}0zH zC$={7W~CYTG=-)Yv?R^EQx(Zw=Bcd=;j)vw*jEGt{&?&0L|HwC%b$)U@anFZOY)>3hywQOLti^^DVX?@R)| zBGgoSn&)(^X=d#l`Z4cWE;Q-cnFNRTO;xZbc==S2MW)z+Vfj+3 zO|I^v!(An^#Lj0v2To@I{Orn3oWifkzSYE~m*8Kz`V4Ql&E!SNoME;?s5sMEzkPCB zF^HIamuNDfhi~hT?GY3@A_wER>|9(oijw)q+4_M6Nv+s%V=)y$lgxAc zm$S3II|%+*s9CZ zH))b*Yca0)nZ!ZX;;N9Hbh$i0?XDX867#;=h!(&vJXp=_@@W^dP1OFyk%(8U5vTUG zEy^rUr!>n%Q3ziz2>X|no{7^T70F&prYb69QL1%K4QspY*ly9W8B7{r5RJf&h6-vC z5v+8vvc7ki4adpnI~_U)f$@T%^j?;`wnMI>8N=oQ4w576RmR%Va)IMeVb*G;$ys6F zzc9^tIE#^*n)gh20&a6r#1Vt_Q%&+vcVrI9r`YJQ)Z}eav%@?pPjDI$cf-3Tw}#c{ z+6%qL9JgoK*V=;*IjVruiZ2cReB>LpC;&{2`WrOy$;FFg!=%HjXyrDHrePO3Hq`@{ z>TLTlH%%^L1wB}s(0q|nN|BnWUPLz|;7K8_w-vg%0!Y~X&T2S=ewey# zLga2M*9)0pi;8|cH|WPn7dz$+=|@T1+hWcTZR0V7>Q-j!C9w#eziidCVJ4H;@AMvC z(kgJ2$9{=fpXr{y$y+*0X;P1CzL9Gjv~SNMokOl_k3dO@o3+D)Q&vJljAeLBg?VXD zn(lOBZMBWT+^iVE)*F)6rMbjPvD}r)g}}B$%tA8aGN-w3xc*H4cTYYDwu{-GnXLFR zuK${;CQ7tm+qcHGk!H%8ez}uyr3Mj|zawH2s_Gue=;UC-)3iVS=YjF!U_Uhb6vCf74r z7q-uJH#*mDR9IA$=PTMd55NE|M|6~rj#T(uqGWKg%eJ^}N(S}wN~RO=7ur?oDLkJ? ztQ#4x=gfBG_X?~DgNdT1j0#7`ka1Y@GU4n6`8S7D=b;$3Po^^F$tk_bbM8>L*Lt_- z*6>1KlkMZDIS9%E65@QLV4jp;>X}-U;C!hQMqO5uaYH!PNbzD9G!vK|$Li))fmRQ8 zBYk9;iR54o7q&$+QN>9%v*hMDY28_|&_Nqzk5tpF+#gJ>O-@0wtW7Xl+4~=oH+WWT zGj-i9jzvD2$p0wn-!7B<9^xmad4JQ`WJcgsGJ9S`Y=R!~uFI{CU<_Y1=~vLjBhzmU zKV*k3A@`esY)f;5tlXA)FN`%CZ^3PjQb!qsSUrT5U{Jbz2j63aX&YohoSlKA9XN~T z#)1g)x1;TdtIm@U(jgjf@UJVv0*e*mPZ!W-oEfGc*+ML;5VN;kyFlQ+4jM(%k50^L z?r_rNdq*jSPSDn&HE6HoO@;w*Gw*abVV{T>9NzG8M3Oyko@WzSU8YG|(jZ~iJ2{Lu z5_;1#Ov;Fh_*11!xj~fO9ZO<3r_Xm&_>pa;Nc$wKg2>Ku2?D93BBKN5(oaWTccRDPr z+@9I}wSq*s%6(EToyX9Ij@;iPT!Nj~ydt%JGHe#YP+bbraH_JlRZpwz*s@g z2hO)V;OI&bl%ZNj(TMNlTB+I!9`x)-RLx+ch5<5U{JF6dZo(zOE&}f+qSCCT4G|y7(%l z0>%Z&txGN$ZxzhsHJ-zi_mMmdVJ(?B0@))d z-)l(MT8K`IhA7)M{Q_cwzEZsEF-I&VfZR&+(kz_r6iFJ0mK0)++;F-{u5=NcJ4GS>Ndfe+&V_+1O{SA7_T9syrKh=R8)(D`) zX-ovywRz!A1S_1kj{l~l+1gE`vJX#qaZ`7k7Nimqhw`%^7Cu4mYI+x>xL0XrmVj5F5`)0dUKpVarZ+`02(p=ll@0t9M;;u?iCUWGRd1qVIv1z!!Aro7+@;t0hi08hA(lL20s=H&;!g(VIv zw~)a)S>udq1);Jz|A(~m5Ab@*{(tYe@2U6HOoqasm>3j;SvyN>TRY3x9oxuQgLak1%5J;c zt}rxZN(h4xqO6b=vO)+gVJJjpLu?WTA%u_>!uRn!_jO(~;q%$u&$mB%&+Gm;_uO;O zJ@?#m&pp?xW=e&Mxv%Gi|V%;|1g!E8@pG|;zjCy+kg=BX%d+vw^?nf8;_x^*bGNSgq* z0a4BZoWc!3F)m%oq%8f=DlnyUF}K0K#~pRcDG74d2-kfeHyKW3O}=)WoZrv%|DdapB{#! zHcQ|^C>C-$9prZ+g~Y_2pK)xQG`V6kRghCCw6AE|UI<=$LkT{+?9q|CTrUu&#u{ zeDY|u2gjtpGn_n=x22Fcm2JT&1x3`gQNJF_V>SluAK3H+_3p&lYVSH_Gm6%$gZy=G zJH{v(?-2c%w5oT!BLi5-P1%#{dOq2~CC2*YA9y{jP$hB=kt7(ICeJXz9g`H0FXNDc z^o41<+?E-`E@9=L%pwfSA$!W0*ub(5dsZ#q%(jpr2Lo(tc9FGoe}*%a0Qn~N0$xM(7hy5lnlHxtB#>XX!C~RIByA<+ zoy-4mDPhs=4x?fAqS7f;vL7)?$>&aGZD*>}FNsB8^qV}DeqKJ9jvCxT!uLYOcXoy6 z=;(9t5v65b7T&c-P!#zM>U9Zs9K8wkpDcqOQ0Aa;Q5@NcUpV#qg-6QFjWxH?`y?iV z;U9`cN2KWwlrc=~(6j?(mM)0-3)B4PyK(x`D3@Wo9i=ssfg2ibk1lV;UwH$vG)8%k zu@Op)NOR2Oh`g7{k?M%0{BTEHlh&t&K9(-Zgw@2X!{ZG1PJm4Q+QAEd*72d?v6IZJ zY*Cscvpky%R3y;U4g((1#vaKkfd=VVgWipLcF)ZAx`xy#dP`|Qi^L@nI72PDJ1Z@t zTmWyAcU*>8)K+dwA(0CBjpPcv5zQ)wOOfaRs;?m$Eyo97U`vWJ*Qjq*cKd+m2tr}_6L`3aBxE3)vkLa%>UcOqyH7CLsZA@03E zVOFD^!PFNe1s#Ewc>8pQr&Cde4(5sxN4DGAXr4syTpLHcvAehSv{;6pihNP*-?B76_M1p&bEAe_yp`9q@Vp2XbN|zz7RJ!MfS-^SnjmRt(x+5& z$=FR}!xuReE!*1RX&=eF)y*CZ@l7^t!#m_Au89SCdx?i+Pt+~j7j`i)3)6zaq{1E! zyzN(}z?YV^w_rEuBCd##2WSfvrh5UwTlqaRz=R`M8jCYwACQs*!O-yOVQ@J;>7qGF z!7uipAtdm+Ly!!}-l2h`LK6!wpB7Un^mc`93}+XJa>c^L;-nw16i_@r#yUbfkuU9Ku7U(XHAeslv&u+d<*6kM=SxV7ceQ zN1L-+W9hUhVRy(R0-3Up{~^w&r9EuSTK9AuM3TNbF?!@E+sbs>%X2gw^y+p|NnL-d zvmFvH^8%0*kuo$8p+Fb2N-7-3E_qWp<5FmDhRNss(P0TbE0nAIo|j8>mTNJllRiC7 z?~>O_{eoDZ7-%L*R_6tdqs54wzV8@n7g(>^W7o#UX<$0zazU$-2OOCVl+J0Hvap~n z4-CsIt(&<@2lDVQXaIIx^aF^e`7=)mfSRuvj!;>sZzgqKIIFXn)mwg$)XjnvaaVN@ zXuYQ~Uq{3%4OEz<>!;YDVPH#gyUl!af?=v{V7w z3PYn%=n{W&yeiS*yn-`XYGsE+GYn7Q3`eoA84EC+Ek^~2H68_#9~q>n*ktzH(gPfq ztVL;M)AA2oYiPgjK<}wcq|{-h?GbK>f_jB#hDWtbmRCEJC-gZX{k%2a0bA|~%q>tC zNwb+i47;5vy)n&H8=QNp^_qje(R!uD8|MT@qJN3!LTA0{UAwX5ONz)dF#`lxr{{5PcMZ-mu;iL>;NqT z8A1pmRrDqjL!56?61KOuGqpwnT>#_N zszQ9d#1o1CH)>J3@lfw}^4c=XJ5+0xvI{oxeHL-cgIQBcR;T69FwYo&!WCzkzU-UX zpMi%%gsEPSdZPY7;VK$8DOmf5Mo}?4ckVn1Ck4 zXL{Yl!`q9LNE%Y9wFmz3B-AZ3xk=-_fpWw%f9d=^3AOArs2R5Qi8 z8z=s78n)?5`n3Ltb|716hc7*$GPcCX5D{Dwa^{ikrTU4sdb=D-%NEDjZ*AN9!AE%^ zt$Sc@=RE41q@+-<)@m?wTT?Bk4^B!G8hu7XGzxo?A<dS|`#^)U(0M-I z)`D4#@+>=+J>Ez-$*Vc&|LixFQVR%H84y) z%vfTQ=RoOlt$~G!o*`y}KqIYVjYGYDS6a||r)Xvz6v_1fCn2qmCBwW7TX`u|x$rO9 zNeive1!Gu@S@ojjG129C0nW}P2(l#z(;B`7;cP(w7R_uFgzE1AVBNuURhF4)$2th% zZw#m8g=w;$Y=-`eu?R)mSEt{24RcPYV#A{o7-UQ0oM5U3pILKC2$w_)+{U!p1&Z7P zN3m?1wlyhv93sQnGSxE9W=s%ua_w>69;PL}%Z9gqZ>h36P{JD0!L=gj-Hy3lF8d+# z8Sh8Z)_5AiaFlfl14$p%-h-yIw_#*fNN&Rd8PXL3GBdK^yO5!S1`}l>hED-WaP)lv z0;IZcKqCL&Lpnzy9qcu-BT_7R#g*iws@YY zJAHf8l3V`h1X_J888ZoOvRLQ)Q~u=X7Qc#t`%5x#Z0F=vvgyFVj&F>o+TcGs9@<)i zOjZT89?nX0>>kF7F180;=BW(Kw%Uiuj8zzAUa`5E+&;!8ZQTiuPcp}#?_H5uTGFhu z5@tc!HfCV}>?M(JGm9KpmPW;*X_P~juOkDg1|U$}wJ!PYTwTdu+r_Nsr6+oQO$w$9 zps$DljO){^O+n*)DT<`INkw2z%GqI8Tbd=eg*lO(9vPkgGpfxz$w_R>46W^F;MRFM z(l=!mNXg+NwFaE*SbkS-%XjA@$l^=d%ROKHzEROF>E{$~J;W!>bBzgb^Bl^W%T~Fk znfeI-WH_3ItUU3d&HuzrvRN)MUECjed0CqE-^3-Ed}@0K|8H?g;HdRDk%L^t7>A{i zG2Cl4&s#g0V3@T@Hn@ZsUmUW_B7EmMB>HVxuCUKp4Lv{GDw{LnVyE#oGWa0bf~nWodNdrr1m;h+8lE~ z#Ox#Y;`K|-)=i3mp9OPa@tYe=xu_rK6k>xR$)t-!s2fja*$;5Yq_lSS%k{BIIH{mR0 zW97zY?^m%AOP;2xZTSW=743UG>sp6BUeZIL>Vaa(uW1G57Fc$k<03T`dG-JYZc&~M zPO}zu$CNfePjl7^F}u%nI{R|a)LwO=h~8SvZ23^kSNk^Ff0-8BJalJ zAH>*KT$a>l$3siHgNTKpOcO8{u9S}}6N%z$PGh41Flj0L*gI}fvagB`-kmOYME)De z-g<@C`oBh;deGEO`JUHZ>9BNvVz6jmDDF+p*fv-HFOVo4U_>_>Lq}a=Vd`!|<1A1= ziIJ(rI>srOyM7kQ*HsL@AHv(P-#J=+@9$P&6(o=k-|B=z7Z z6Kjg?hh2)t#w~E!d>Q$Xx5-;Gs(At7C$)bY8hAU?!c}5A&*WTzTZxf08JeJcV&FC}WCeKpLbn%~tQXG;KFKS@3Cx!{UkVO~f zriHacXgs^Je}Vh;$-Gy@X#3hiywa^bkFVbW5+MLmd%#hZ8FTYgBiHBwbDyaP2G8Zlsyge_oc&^*G^gPfhxX%`^P^1m8a4)}nWb`G znrptoV!eptr*ZL7(MhM}|3+;6Iy>zcYqn{&!~8}q76)}rMIVAPAXa{>lQ$(%N-!pn z9#AUN+<SzZ+Cp!dq39fQ)|+kU#j=}iDJ!$ zSp6KYlhP%j7O5J$8@!KIt1#Sqi5CX@P}jDe~4L%=5)+{e{ZsxCHJAl9coAGC3khGjcC*fbFHVb z;_CG=ThM!H$zUDy~nY?OlyU1tgZ1RpxM(& zVnU{c*=DGG5f;P3%b820!m5Ev>hDYPgjkWESU^8%*>Is$w zeDy>{jS<5K&r3l=GsZDNLdz-82Fme9X1v*6E(`wep32~`3XaADTCob0R>+NP_AM4C zPusadAvlCgWE9PPD)ivpfnmNv5>#0o9&PI`0V?Um&&Np@28K6O1_ckew;aNBFIEX4 zu8Sq)UTa=KU+A0mBUI4rbbkjj-*pJbn83Biix}R4;n7Oqjx@M)YFXD{6^$fR>4KD{ z_jxMcXv-sHqQ&I7BK_lHt^nAe47#Ob85g68Rjps9? zAso}bLUh?t4T_&=1|M5SmP0Yq2mviSD5FaF3(bPjdb`;kAOi^76&ooD`@T3TCRDqS ztt5np2$LW3G1cQ4nq&#pD>GS2Esj*@Y!NR?xipgfp$N{1l6{q^245*W087e8Dgz4b z#G}lUwP0iO%($c=+_xpj06s4s(3PnCToJpKj#J^yTF41dd8)t-uM4OZa;mD~gsS+z zSgZ=&Y0}^l3z#*Keoa~6{mN>U(cKDg5E7$-4dlK22{7`)A$(B9Ev$IQiU^l6%ane1_Jneh|i(^n=s%u_Uv;oMA_9a_XF! zW+CbMUY&m5q5ba=Gtj*lgDI#Q@95fF6#;*5_(7;K{5lQE+Cyyfs0EmLk2@waC6Fpr z(oU;o3Q#Y27Nbg?(m5fYHsj4IZ~y5mxqn=d;hccR&mi!aTVhCPdcvU-YT3NelbI=@ z0H5%Bo9^v_$J(?c*WXHzE^(%bl$7H^7lLc3T*H$N@fB`%shp{4NjahnUmwdYPs^>2 z<>-LPgrsF&GAl6Kf6ZbCsEz^;(Hch>Y4v(um>S_NNsFN*e@9QSC~;*~OGwoc2l(IY zJ32k(wf?XB4!Dc3qT-^-%N*A3rrRz_zqJ*BQ(%w3#+xw%p7x>yS+s3O+;G9eiQQH5 zR9nKA_3|7V4RvRooUbFOs%MhA$Wt_e?eQJfMHY=xi)V#px^_?<*{4EuwS&=56srLt z*`l=ua^vcvS*)`+m^7NVTAp?Ar2^kmzGlR=0s6u;r;l>BRL-7uGTdo-QYX7IFDw|3 zC`4L-@dN4{VPT)c>pEgMz)J?~Y zSD7)!oI&S3=Y-T-K1klpb)0%SHRzXgV0w9hyjGYW|H=#N@=Sr5`%lOBQ+xYFr(lIE zJZ)|!%xpGQWq6uKUGAA2MY;K&Mk{8?;e9!c{u)ou0`p?F*`)P+!Lduq@<6=GR(X1s zwq6{ae>iC)Jk8-g9j*IQJUyEYlX}<&r8P~WsV`5EP9XTKj5wF9$HyLU6)U}I`M=aj zI(D~vN%<_0FoswX#xNIpI1Tp@qNK>*t8kT9?932M!uv+=wv3d%VO)}xZBLtN)=Rxg z3oKsfQUS%SHa04hRM*auFL9<86nq{CS1im*+PndsL?xK9Kxq?U)h(2z)^Wye6i{kV zG9!BodDW{*FOvs|K+p|!4iH+QWuX$rpw|Ts({&pa9+8%n8#iTz^h`3<5J>!%hDg0f zLOs&s<9NYy`J3LRMA(1~kNy5-do$oyzLn&F!|>>&giJR5Mrar7ol9+Evuhl}r9!O1 z0zM4VFVDwy*QqV*eU%VqneVQZ7I6;+$5{lVDKae$krM=Y^kSR}eyH~v0Z_mzpS0Q4 z9@Zrcaiz{;3Jtqn@BL@kt@UyMGo-qL3zyS?wvXMH7)nzU%n7Sjczjn|8`u43Z7un5 z6G}idPV?I-(fAEYaK!dMQUZSa_mp_7laV6(sW+<=Xvmh)(yXG9y&U%qp?WuKs_*CjwyAk(k)){{4NL&=3BaAj zui%2gCU7Tj{I_sRzw{!4%Otff=#K6tT@cTIcNgfy6UW&UZT;FoNv@#3pOFbTI!H`r zJMEC%n~`4pe~l-?S#=|DwP8>#S|&Uoi3Wz!UOv5 zr5T!Rpyd?B)8ds38A9hz+&M;)wzq?15OJC7T;_-aZA{ zZf&g@FV_;bIToiv7aE{|24^_zf+?L(Xw6MdyQ{lG2PVv_cuk7AF1Y^ zZ_586beUD;ZLkn&<7dPhhX#h0JX#(Nx`JBTy#w_o2m=lYtfaQ=@Oy)uJTCEKP}V|+ z?=6Ci4mW9xQ1w9WMXh8*q-0mc@n@(W?_{qVH5NN6TGkp=#%jNMN?IGoP}_LD9j`>R zZtgX1>tDP-ZOcv{ga7NP8(QGgkB}v6E>Iwj6 z*0*}6OKkuyG}M=E<{Z01uws||Rc5Y`@J=d{(^IVxHhk@`=f@kT&nowE>SBtm z`UIshSd@bQ+C99l(tQxWJbP=w%cpj>+J$?0?cF4oR7f)`Uk{CD*K^>Xh$1f*E{t@U zpC$x5(OI8Y;BPlE}NBICq30CKN(xewwKBj!XGsrk%!HTVG9mtRC&cy2(42ie3wO{*4O4Rr zzgVIkm#JFvI^M<_ul5f9MiQ#Iuu;okq}!L8mas=RctOr_IXzxu7b1Vr0ndr!abF*) zTwbNrWn9A3R%;rkTkh4pQ{#7V!D^&I>P0r!NZj%`+5GfJ8Y)AC%h3U z!1K7CBqJkA9jUwyRun~1xs_k0lK|LZf#{DcpTs5T_;C8V!yOH-7jI#Mq-C{#a(V`j zCj|?S@Pbb(X3cVhfEwu=HB!o7rLo|XfzV}>vZK7bn3hqrC(de8cr(-dSA|q7+(Dpm zbI7>{)3c=1>zxo@Komma9~{ zW7lrtJ#b-hq-}3T{K-r6fOxMcnk+oJ7G756e3Epf3T9aZTKjyWg66mb@$P>=tZxQ$d?GhE@T05u86CDFl zDQe{R$Edv%J&XS9adAp_I@wFl+QN9W(i5<4fc6R^iczf5Q^RdrnCH+&PoNmxT70q{ z`1fygXqtDZeaD5j#@gkciD{0c4nuuNxWCZ+c;|Tz+5qEV?mfqaXHGU(rzQMvXH{FrTrnAouIv!5GNnfr^H1mYB)gl38n+>y9T0 zw&cN39q$FZWQ;f-2)yRe4v(z{=izFjvdPm1hP7J*2Hl3-DI?h6V3Yf)zIjbmN5(7~ zn;aRdQDmx$FHx(o4l&ZLRRUz0w3v~^`yJzb*R3MvA4Np~rt9T#U)O(ZQUbL`{uy-c zI$;Cm1%YTWwzB=Z)_JnoTK`9sRn&YKHIGiVoaWGPjz+vC9TQZdxYms3G_UnnXx@MV(Hg-j|D zBa?rSh`y`jlZkmo86%h-J+ot^;Rm%3f_f4J)v85Ry^hAus{+}?;+NsTV7OJBFTn*2 zDn1cIe^U_?CLmRqO2l!MiHvntOT1nZw`Fmb)Mb+Gn_s@mr5At@0 zme%EF;r2bVtgJZGX`p$HE^cv`GZ=}{vvh8b0|oybre;yIvktJq( z&Ndl3h&X|}@$sqpAzlQsnY~lm15~;J?=ePyR+_D&%8?o@b8XP(s#ah2-lh}-`$`hG z&=-#~%1|Pa13e}(J~(6pa!QML_;=wR7BG@Jo#!-qM)!QG)6d=QxV9zzHr+428i9sK zI9Juqo$mk-3O6^CP?IL)!ZQUXep@^#d^MgDZRw}b8)DMtzR`AAS$~1k%mV5uA9lr% za%DU>o#*+I6>a0q@ugytV*p{ve4rVQYy`nTr%!^J+PpCkf= z#|dTQA97&_aIebG;opP9z_}yf5JiQW69U+bW+$}>SqEA##qsWYaRU1r<9&A=@5VIy z|8Km*=XvIS)^MpeCvsRfzD*9p7Tl2y;<=K`+Usl{>sa^!@tjf8-hmO%*;kUdg}%gd z{HXW9i$QtnrnH0GLDEQ`D^}CojR@(jFMBX1^|kws0y4D%Q#Z3&Mj8S)ng@gIoXZpF z*xylU4v+{C&+xM-*o5zNg_qb#k|mFIh)nSV+@Y%u^*B4>ETW!IO^UK)%HYV%jU3w>+b#kdnQ1)0ru5*xKdX9e6WM2L+L{u4j zksRYW&t$U3D;J#MNmp4jEkPqZq3c3O{Ck@yy?Z7*GEDAlu@@??Z0{8E1Yh%yK#;n% zp5d0JS55#K_T$;GxSM%b&reHqK}%u7!0{oYA{8CE^RVpGBekV_lL##8z*SC@Z1{`R zFW5Obzo`+_M+)$2qhfxH>`*DKU$929Jr*q1-?a*T*!LQTQxM+R&320|o)kVko)UBY zlfYT)PcSQM?pmjWVj6u8yu~b<**6ds8Gj%G-Y1r1{i0^z_ z;u%RS>!VIsh zm|5fK!0ub5m~*oumJ4%r8Gr%c84rbIgx)!AXk~g93#&(BLxVt{Y0FlNtC9|)AhIkjaOKxJab%!3cCneY z=vF609%>D%fo;s+~U2QwN{51AzbuvAH z3f4f|E-loUg3|(xabNta;&(gz$#;DNJ}hPM!EICc`!MYF5}S6CM(97AKh{9`w;JG# zqz64;cy|Jwx-d%I)-n%&57v1Ux&r4t`f*j^WnElQ!jMV_?p%5WioIG@{%H%TH7H;lm&55hB(59YRlZB}GNA&B6N(DAsaH1Evt{#g8~qn^-IV`Ke6dzM>fB+)~DczhX-t z<|4}^Q}0H}$s7hHmK?}dG2c6&3-Iu=**~;iP)4Vdbe;#1b(MW?T2!5b#&UoMhvc^5 zq|VW{^?(DE7b}F+$M5(C3YdfXL(`uc=LH&^-xlsBdi;CvpKrKlfqP;Xaa)U z304avlRX5^(j8I1119o#S0v!<^lQW`?kmyh5O?!bxK--OG0)o^Ld`!XiVi1 z2ZHBq@!D+hLT~>IjIw&X7jZ~w_Pbk1gh}J)Cm~%ySl`VS&&H0`W@?eIVB%|Uh0?-q zRk{cR1Yw9_@h368W3=w``s_>#p$q0!I*N zd;5f1k7_Zhw$%HTifTaWBBioKP?i_ZEVUp^Rm5Ks$$xMZR(_h@S|M;sZM`G)bsg+l zcXv%dKBdZ$7I!N%f?TZBl1w-GM823@AL$CSl1^sF_BjwN@XSb1uK5ACt8+tsP| z%*)y{@%#Kn=Ed!q>o>_{d=x84?Q_FAUu&v5$yUOGs+h>hus7h;s9zLf79N6Ujp&7H z5wR}c;x8BMEabpGqet%>$wD=#+B?aLic#90Y zH*C|{4XMrGm~ zJxP^f>c47tw&YnaP1covwjQtXG)AMn$7jiiK##waq2wDq#+6b{FInzA{vI73qDBt= z_dOaCd$huO1c!nMnxwhxmxV8JK?Cyae>!AYp`gJyMjVnTkRb#UVGtZoY56Hf5!DJs zvP4(}_}4Mkv$hr9Ti9cTf*}sJ_GT%_Bjh2KV??w6OXx>}%}=6Oyx=Hkm`9*;CRUYa znc1MYag+Svc=06p1T#{8^U99($-gSeXHRVPH^~RSop{iT_hbHq7rlO-gp+uwHn}tt zrOsmBSf`zmRbEc(C}W?Ik2*1KponP8E?V27rnH#kR!t`S8rtzwV(09|FC{=2!iB{w z&ul!X`@jio-b}2BzT`b22FqFAU4POP%%Mq$6=peraE^S#%QM-_IUR~kuS@eJjR!<` zXlQ-3>@=!e_p*1P6d6BU3l?;U&nm6@t~>#MGHy^uyyA7$ugRv?;w>RtO<`M-#Wto| zOp`uJ6kd(ioar4(z?RzO_tlT70f~Gs3TLwj0dC~0-qO`s*sulF=yfemm8LS<1NR4o z_GcN1)L>DdilStGCu)y+{Z5BNgb#luf?f8ygY5+;GQ`7ysRJlh5PR+-x>OMs%zTro zr9^;D?hWtU-rBM~!U2O!zCh+43HP3aan;)nn(e{1nm@5m0b#BDmNfq(U1Co2H7^LC zp(4xDBIjrDQYhCV3^xi6g7vAm2-m*j?MQ$yF)ebw2Ag4wORx4|3hFn%Ls7F3nwsfIrYr3%~TF;A$S$@kAX(?+j+C5 zH5o)Frt!6F+wruGUoek#-L9Zdc96*Mv(g_ZAno8&sbkkgWLsi2*;SmZg$N~eTT?V4 zAv=oRqN7#`)IJ@JyShLKOCt@-JB@V&qQ3$1p8%9+0{}}U^_l@rdv>_?ln6lD-!m2h zp#uSqiv)NCZwV++{Bb)4`bAz>$O8IdLQrcnGC|iB0EQ2;mPou4bUMAJLshfV$!`eR zkg(KNHsu=DJN!$vurjJ)og$c1P7I|MVKw`fGl)^DTxyjWy%UENoz6ibeZgb;Vo~hy zMJ=7keJk%XO)>CZrO1WiLRN`7S;5WCC4;B^@Ju*_JQyO$(}6m;>5GLUCzHKgR!MMu zj0am4A&?Y{!#WGi3sOuZj-Ab5})s)oItsa8=NSK#%)KqAh=P= z1z1fC9iGss1QO0;G%+>!%X zz(YZhZGtpvNN7OUP8b;kZ)2zxY|o@qdeD_0yP2sO4G+bD7J5!{CkmHm6G-U&deXe! zs5BRYWLiZUCC00c^cQ)S zdaKl z;;oNJmDb_}F07&bx+JY_(_toT0Mj_=pq&YuJHFDMMT$&A}&3-g#}FK=+>O zYTYZ|#%tr@#MT%s^`;WK!tA_jaBOmB(zUyzJ!bZ{UgKaY;71S%vO?x`2y%ut3LtuI zu@MB8eEAeR+vwEG>&ZJvUO?tsehS4{FB9uri)I)^`7)k|H1zIR2RBgajEuL@zg>rC zrq%17JG9r?LV{954r23SnCMZSO)6@c^t{$hk}z&Qg3KemxYQwSg|;<|o(`cBl#!TH z$FXw@S@Yd|PS+&(xUH)tLg8ERG88^LIuu@P=s>XB6N2575bUx@u)w`IRU5IBS9{q9 z=1J|QX#VS=k;HS8fgu_Qdc@9N{;C)vd4wm>p{L{XVl(zk%4B;h&UwDJx5Y8|d3lt& zCBECT0bymjEv|gS_j2g>cZC*1%t~iu<#j4EA?Vfy-IwwWHjNctUMepNn}W;QNKl3= zR@#yjf6vS42x}wsoFu_PqhIG3X9~_o%cWrX-d=DZ1)JLGuP|{GTc42r;)L`^hNY)Q zkDu>*MX?-$8?X&=(S?0vzNI$PS_228J{^zGr&qSu>c~I@pwR0h8$26a%48WgIr#&x zbLrT4l=Y6*40UR%4m`v>ew6jJ#3VE1_9!OhDX5E1=~31{c@cqjM(*n%Z`QdA!YVn7 zL2%~6JjKs|t8Y*qzjjn5f0g9i>vMUv!7JTpOIy!tRgOm9rjIH=Ro@`-dd@mEWWS^_ z>l93JHOPU)Y)=nU0_sr_La)=J1N8g zU9WFi<(VQIIqt&g^G%XztmVhvV{GB z`n{b&gn6HjZ*?^xGS$`yicx-<>O8F3uv%xlMPPa!Q|qHua=K0jY7rKS?MEeP z`j{=!hav@D4`Eg+?Fj{>7^Nw6XPWj@ns&7qz{)*^8Xc$Fqn$+!-rv<(W&MHPT|LV* zDm`vkkaTuV&V=^5w3ywd1a&Mqg>se$h3De?m7rkp$2}7VrA;y~7B`S7DLXh5mZ}9< zUPsPtKXb|*#8=tR{fl$RC{Krb5+t+OX^A|Y%V97zTGMPTKYc|qB^TFt=VG$fdbB0k zSth1gz8KdV(OHap+G5;tu-DaMJks=pw)mz*?iZe=y0QXn$7WsAW%edHsGBqxHRpG)P|9cX>=SMa)=j*YD2h|tCmz;wn;k1u~FeG z^mTG_gS^K0{LXw2Prq?$k+QcUO~{i|i>{gWgs9RO?oDPB7?_bAvNscSDgH1Z-eUTyv1vcxaECEfcMU)k&lW1rNYh2! zYI`u7EwWVkjcL|-lHLPE;7inx0f}aaghO+*XgKDvS7r`-7L!T9_>8YA79QbkCtH%Z z1+Pw%Rhr&%_$8E@({xb_IniWmbz7RO0}fOh4p*t9G8|UyAO0GQD>feKjcM2#ql-4> zPNE#T|ERDm>TL^;@^ade)(gTcY27RVqlAg-a_Ib`UI3sv*1PX(a^te7!%NEWY@NON zk{=#b8N}ST%S<^Hp@Z1wSjdb6Tp_o2V7efwOEgdx26~xtk>}HtOZ)lUeG@+#Jea1v z&2waTMBMEko{ty%n~wHgyePh{!zWI1u0gs093pzN%NZrBuY`Zo5HJ3uN-#opyu{6Z z^Mc6_|16@Lbl2Vllck8=&-cZ@tMmvM?i#?lR7lWLVsl@0Oac?UuPbEIjEE8)#0jzU zeQ~`#RAxjwYc$PLSBL368yp!$Eu}4~U_aNQVXreBZM@&;g@AsCppV=XI$dao{_&{{ z2@LZGpwBwiq3fgx#I1h5BJusBnR!7+&XY<5TKVC@4lku?AcQx+Txyq}7)75KeDC z+DQTyrqU!E{5vNPPP68l&MQwgXAzM)?OC1{Fc(SLW8v6*WD2r_kZX2OfwRswC_2%N zPMZvhoL~ZQ)d+_#O9~7mb0WEkybw6pOiLx;;^lB1qSx3N`m*19Wgeskmv#P~JtvQ# z1~OEY{=tjnL?uBe)~aKZGhYWO6q=Y8`f#)S&XS24vEx`uF)6QZvh}C>j}A$TD0_a| zxFtq5Z%(r$572D8^JIIrG_=WQuMjOwMwhJB_yN6SwUAAm0@wpoK%oB0^ExV18YTqP zA8>scH|QkudcuS&b0deQ8E#X=Dx6*F(T?n{VR8mnG^)rH3})XC15l{4s9WMXq#p1G zaQ%xDfF7}!shxUKh3a4Cu>@#=DE^c8FrZw3r5Wn*SCNpBcQMUw9X2yF(FiX~V+&<~ zflyj*D6&hqZLDqO=5;8;MKTLKqeBKDTR1lz4zp+)7fV(!!YeXn!JP5u1QSrGi{c4H zzrr3f)*MATo#2?t8M8dYORq=3T(WyeeSrj&<%OPIz=sp9;qnjLRg9#V(bXv2;>$8A zi>6ybIq8<<>&Za)Bef|n*wm&B)Q?YtL7_(hhaLRrRo+HXs(&U7r4Ko-4#ho8_>3Ui zQtV1YqMg;Bg<@^G%Wus&f1c+vGLZ1=yl`%m{u?|a^s!}$c2T8v z6C+WG+o*~k$i&2l*xX}}f|&HX45?cw61Jb4NV|(YVb1|dg{LGau`>08ju4(3SvC{{ z!ov#X5KF%-cIYWaKGr7ae6JTC7au{9ENsI--L07glqa%;8ZOmgjA>zDBa*R>!})Kp zxu)$2r#d+#VoYKGt4v_q;Uy&~(3irzJS2E|l0jqR{5U3T>}DROokq7q*h*Y%vP26# zMCVm;>0ov3Wi%xuXh7!5ldT)m)67Q|OqO#ayZoeKqY&F-0A!om8%bWV+)PiIZe~`H z8qWna(3B(s(PHDF>7ECqK3ariTdtO3BTG9MS$ULBai@rnl0*)#ALDKPwTM-uzu1To z%x97?Z|u&X9_@h5r9IJJ7dV<((uHvc4%dx7im!eT9_xVGczRMrX7r*41EgqsUrbLB_AZ3J9Sq8YK#M2Bq$iX*3YiL6*fDx%Z|Z+ zvI?VRA22`?9235Zs_h~#!j4@ozFORm3C}1rG;?Q>7J0gOuP*K(b55cF3~m!!0|ZK& zLrA)vlO0Ces`cZNHgN{#2Cb=3hlcA}C&{cG@0m$!pnGU|oTm>oV(3k#%Aq#t8d&}? zjnHY9Ox;eWduOI*aPVq~LkWW(YFAz;F)=OC!aT*z^6HlezZ&&X5x=0o*V04jwDw4|y%-IvKO~Ku=rz-Zx2IuEQJ!Au zM~UTL0t$k<2xTJBCfqo?uh{==2ck*J;Bq`q%~5IcmUh_0?Qf>Z>FC-BQk#k@&VVQ0 z>}*~cC$kcq;{dhmug}=26pG)GiZ>vcyF4u*BNv_k0EL;fG6Ij81p|e9rAfg^^kqlu z%8GLnu<+yLxEC7G;w?QzsC!AgIZQRx8XI0~WF8x5f1Q`FD``{G!Z&BQ4Nxt`|B^9C zxr#)-BHmN^YGM6F`D5g&rE8t@&-1og#FoQN^^n=K;e5wydL}%m!&K-b7YC&DG2u2j z6^zJ)XVe{ti(N^E+L;$PG&3;OWWv7?xMU2U}FxzI1@p`FH0KZJem>KB15SX#4Oa3;e?;o@g@Pp=zg0 zaYDT)ZHavK4w6dYXiGDLS+jax?uG4Wye6aIYYOEQZ^eTP4?Gz%lIH-)MlA&=H=Q7^ z@akkT0U=mx^r9)e!uz$a^#4*`mS$1-Tck~$XNIe_xngfNG~Co|hO)LaOAioeJ!{#5 zd#_Mz{3^MIRK)cj5zqqnpBlYlrh2=E(Ae5G5|fZo+SNY9>54E;^)K>BN*C zf=u8|lEK!k+B8Q?Cplxo^U)aB;yG&b{UW<3Fw4{62W|M<((leFNU(`;s)GkJwoRG% z7jIU^b!)Ej%=p^Jg!Egw9%mmrFd>^}-mfJ5z(aZ=-J$EyX%n>IgkV3+}H)v5}<4M2W)cd-+X$(|c7%y8Zhg>BVC z-}tP19HVo!3c>>)7qX((s9k$gaT1DkB;O4AKgF^8hoZWT64PCODg)J=$xb(OtZpQC zn&o)Vdh2G?fzD*Nj-uT-6BaAA%2MxcPyJ_14LbFrgLmsPXUWYD?9lMhiME2&c@kV@ z4vFZVqT7B^5l}EKYRd(QpM&Dp0Q<_;g=+82)o~+_!XSZ%R&rs5W7{l_#_ndmy`VW(z+!r0!YY9vn#@P^YM>a6lQ*##Me7_AWP3*aWk z)S_%aYHl~nhZZcZ=eR~Ryww|GLP~SjKF0i3`apcP!gJHi#%EoSFI6gnGz79|0AFl z(=jVOf?~ZOM|D(SAX@J@20HI!D%g1Fe2$!CKf7D}Ix-H@9t;KIQ7bxxjE=K&=Ojqc z=a+R25YbLMPsO!^MBXu0x61GEa#Q7-verKXk&CtMvV9y4%L|$OnmfI(Q>4O^uU$gl zxbQI`r&6ZpU0&vM+i!gpNl=?6Pm%81wc=CoGS1k|JoWW~8+J2iL@G z(cBXv!K={;p#JZUHYD75R_{>JWLsGw$$jw)t$VhA61 zGIzoL3%sc!S+=FMNO-f1PzE)Jh6Hembd&)Lld>LkWmKB5P$n$I%<1Uq@J%TQG355r z35(&wnw$uanCg zxI&6gA+L&&!NAf&oP*jHL)Lv{_1hdv{SZgjL4|p1`oMf63k@+fQ#)>4s_3Gv08rWdYozCfiZZNwXA% zOjLzT*~0>&d}qy>qQGmQTd6ztFc~S-U7~GqsdQ>csX#7d_cx=;$Y+z50CDH((1c!4 z0nB7tk}PM#J&=w9V;C z05e^L@2&C8hKEl!do|2P>w4Xk=|zQG5uE^;($CJCjN zpTyi=Z>^jukwBd!KG-BLrQxjyFwzAYy%JyA>9o2X2ewnf!D62NM1Lm-PF+<#rv$ZM z!G#1!8#UdkH@y0W?QjRORgURLU(fjyJ#6vp?B#hf;~z{~tEbV_-jZf49;O85BwMAG zs_=XAE@FHMHE5+%u?1r-H{3^oWP?T-S+NjY_Z%o}ojVA6pM%9%-D3*HYQ7j`jeHsb?_ zayqYVDojfcOCPn))3um`?9B-_JT_k_nKCXu_lggLR-LtJ@w0Wx$H07{@)cMl^pvywt9l0pc7E5ri@@yIR7e>VBPy(5ri36Q&#$bc_R3f-eh zb(r~+?|I4hqU4(h9F}i^H^6j$^8ItO-6M;CD$4^~yuBcGcexH*fI;3YXOE{ck1|rE(=0W{gi?k6V$r-J%Azs5xnXqfA@=jw?k7BkbkQEz-bY3 z7qHK&Cybgl4B#cG)&B)lO!UH0UdgmA#{;A2-nv2Zi`Y49_6NeXB(@-*29W8iM%#P7 z=};*+Fhe+4WmGiE5?)zRYxb@ZbX_ir)TR^>?P;YZHrsKq+gs^K-voCq%iF;ZQm$0c z6Z&c^Kwqv=uE}(hvusijGyjmBEk;o|jq^Bo?SME4rOa~FZg@fa5y)t3v2;VUIeQkw zE{P%vJ`5bF!Yqo5hNL0oVzon`-VQ7ZJrgeti)K%VOLLYjF&lZnTd}X!EpGX}JkAvM z=FR(b(!X>NMd@7pf?w{8ny6lJJ5X~ax%W$(@*v4thj3Vv|3}pp?T~gv+o3Z*(ITP6 z55{a%$84j#YaAJSo-&zG@-b(`AX##qS@$(q_gLGPqQ?NeVao)%NXUZ+n&;EfG|Fwr zA_}U7c&$jH>46N+!(0xnwfggOqmJRLIDRc)9hre7SIjTIwX84`l6{)3eYtQ>vn}80 zkg-bA42QBm0Te3-R|9%W8))OmG+8CdCv1e`_Mq=iRb(|P@pES3rM_c&*NCx!o;)G5m{dcma*+dGfd>mwb{ zlvMTdt{C{?jd$gL!N6YM6-PA&E~kCET%+dq>OfgzPG*djSBh{KUOVbsZ!ZGC#g7M^CatYPsAOehe`CF4)tc50Sn-gvJYqguPQ5h>2MUArhmpB@Y+{qzx-Kavh zhSa?w7FK&FIxwLu$p<(q#~=~b99p3O_CD?QO;*xym1d8$dRjcp&OjILoK(hi`g_~l zw0VkA2}<)uRMN-tT^y4uwZoum!UVN4s~g`^gl48CaP7A<2x`BoGK&EiH*%jtHjsl-0E&Ra*)w)Ql}{&~8v)0NHJdL-RJ=IevM z1P~w~M3pfCXlAF}9J5#(r4F#WNvmbmC5s~{Gj`}nk$@SWM!BS@n|5HuSz|a)S~#Oj z2j<6fivj(ewoC$3A;o4T9NY^gimmp<8@&({)V#1@v#cKMGUl0-N5pkXHT=-&15xm| zm-9_innsgfLo?E*rD<0X@VT2QzRNs~KEg+DadJq>;{6=Cr@Mn(9o`?ESl}q|Pi~27 zWX|mluUDiq>o(!BHm$X%ncm8N{7HBX)AH#2)(&jCpbXg|<;TP;!#2MY!~!n1H}nZmvv{3fJHMFA~Z z4%ze4q#ofJ@gYL!nDB(6kIU5GLvMpz)#v~$)#?4lVVI* zJ{JCB&C_&&bsp9NUn)HB#)?3#Y?aq43a`*(Mvy*PM`6Ze!qe>?y+<8I2T3~0YdY3Z zzi>515hDb$|4+SRl4Nj%L^o65b+rvphC0sL>0U6)Sybz3=!LM0Ji$zddO+q+mL>9t z4)|lyROhgkcb)nNWiC^k`NnL>=Vgjmk( zi1g6;NrW1Qk)KL(HK)ZsiqYrhqzPF>E^L9DgS6zMQc+J;jJ38c zZ9)Lo$*j6wZ`T=>ad#5smQ=S7#=NoL9t^JgIoF{Bb{q@>6WCzfD1y)>I~eWsGw;n( z5rcJ#D|Pz`|1?7?9>V8zu-+9F1mhps^V95*e<0uM{hQfXCmm1E>S0>voo(~0pl@7n z*jek4lu_uV9T$tL&eQpMBN=!-%Qm9MyO_u;M(a>Lq*W!EA+d#E8x|(-V0uK^!QKOD z+N`~o4yAv_0w(OJJS<$)o845c#DfKMDgXtP;y&VsNff8i#$SA+QReWlu%Q&orFT8r^6W*99!pUOn)fR`g`&#YQ4cj zbtt_%Ny9w}X-NY*gCcd7r-pkv(?dLD5?%}QHS0$l;{A_G_l)*$ai=CVy;OV|3a?2s zKM!apW#Yo?^>`=)pL#wl7bk$}*uZNeJw@z815vsvslRcMH>L-8!DK8@INInOxfG8E zJ!3<`+C#nI2U_&Yq+=mlv^p{N>?kNR+si=SD-?u=NdW|GZa>t?L@s=(#7av%yBYb8 zjOxt#ikz6PtK^Jz+jvx2#8ECxj#29bU`jJv8l9-@ z#K%GI39jaAypC{U{h6<}^sB3F8j6qfj$2Q%>Z2w%{fGr7djUFYZuWY3mGiqp!`w#0 zd|_I^PP~!;HM__8w_fXNtxEHTK~Etl4-Gh5QyMy6D0Jaxx!9Bpc0_N{Q{4=dZboLS z!^TF$6LM)#I7e?VqAqSGa%=3FL4fPN{`l5m6fZrp`QXx8L zg>XshQ0S6lW1%C%;wI*>&G)+I z>m>dSS2wT-=!){NuzClmT_Us|ZU9wAU|3kX15;~MV#tv824$oU+8VxjTqsIK`FQOI z)NG{W@IjZa9u6E9v0-85cBs*{Y+fYxSt)yj_cWO>qnNJ)@_PH&O|FZWFZgRJNY&^l zr{VT9%VFX19rKUS)>y#k{l;UH-qWHjCUt7@*T4gp6Ya_MiNA5Suh2~E9R3kcM_N5S zOf9wpaYUB|V|-mMp;W(I@h<4zyZW}CJkTq@ltu?1=Oph60V_d97d((Ki+eHPCXDu$ zXekKSM$rRGmvbA>oTZ=Zg`}!g<`v3Bjmw35PKMz|ieCyLE2UqS-U-8Z&YR7a<(17q zY_5&dbyAFVbalVhI9RNh6K)8krGcM2g$UGH-Yb5~2Fd3wN+$b7CG&klQtXP})}J*a z+WRw5Mjtt`!)AGAHVH3r9;taSQx_xX-708XMgz_mqT?y*7+P}c814rvAN{maIAU4b+$L2~ zxaL?J1%RyGo~|g$g^tl1GlWvI9!?t;dx&?dW(3mC+%<=VPkP787S{}m1J}|A8q@P% z*mh{}iS6C%A!SaRY6e7iGpn^knY+xbv2OMd2r}TLq(-(j>}FT0=A7&)1!3h@#^~UA z0avgno@-1p>5}bjxeta1dO2DBJqseu`z_=wkK`OFT3x#hYoC$R;`0`TCBLCZ-yrCh zB@{A(CWRhN3JnX7^hUWhlKwnzcqR;s6y25b@&PUi_o$@J#O1x=7zhg2-7*~7G%Ndy zW+WTKI4r!ny^Skmfq$yQ?1t~6bGy)04Y3%K?M}sAg1Of15RcTmnZSjQ-GUGGTJkJL6KeWKL1xP2!$=dnl}PhAsiuWw6h-1JQyC2t7mI#abxK)kdqT|ovFg_ktvSYL;QtGB0Lh^Nl{UQ=8XLBDMZhJ~lP*sEr>o_$vA(oEK;ON4E$mAdT7ltoWr@?5?ew>9PJuNWCB_o?J2Cf}9~UK|@Clo+lUQ64 z?@4}`z+CD>kI;4$cvT3m3e~%;Z^UbY^j73&51n6IK+r*9=}t^8aO`K}U44n8XqGl} z-y0TQ{Jq)Q8q-XBrRk7xQw%Y%!P9AK(w^oHUopjpEQ0`|3v|oOU>}Jz^g0)26wt?6 znX<2eO;u)o?C5#0n9}!gB zGAt-(U>HK_Ee71~u-K8iq$U<`i#|M67$W9-gf|nXkU^oP9IaX=0_~pQ(Mwc@zY-p; z)p%X93q6DaIzpt#Bo(n4f1P$FaI0oKa0i9wc7ekvxu5mR5GB+6sWK|4VBp~Xqj1$> zG+U!)%zMIme!U{z8kpD1nG69KgnO00)Inc8<)23G#4;l4BM-5KZ?ufO{ty)0@>b#`0~(P@s%ra41K4gxzLX zrq5^}mOJ`srOetXKKdR_#;!6J%oT!B3DRk7R2Z28Xn~niK0%1}$BvBBWl)&k59-ut zkN_pR(UZLJl=5w4=k+72L1_;t4T=p4PbzJQ((X~(5Y8CnYDfwiQxTn$>7U0PjluY| z(Y)Yfv`$vUp4yTnQ!uM0e;_Ou*TsInx);@0U+t0d#j+3zJXm~n2G!9`(3a)4ouX#H`3(ng42CE7rbo3J zGCQ!>7OPBC#Ei*2mn_)Am7&oM7`}RNA(gLRS%}-*TnDIovLoV+J@|AVTl;3Fxia|F zN!c9$yO-YWLs<}RA5Mcv@A+z2y!`*vf5JA4{_8t_sw-O~`m_c^1mUzPUfFO*F zo}EUNQm~Ku#U4r3?5wc>sQ^D8KuZnyd(j=*>Hl}fJflo)Qtf0ObsTyL3JK;D(_a(s zk8C>_@y_AQUt9I*_j&c?FbX2<;{CBI-^7j(7S02t2TsrsWTF+K{V?dV>j6F z*;#KgDW4dV--qrmY)#-nr~V?B%rs`zt`{wLmdG3y@XOKxcH_g|cyDG%xj3Rv-n@_r z$I>w-%mu@3J#1Ux#pJY7sbXd+(&2@shIYa`0j_Cbd%0qD@pO>hRqYWYTi4I$r3FM) ztBRRRRVyC#su$`OzyQ^?)A)QAlPWPW&Fa=D9FfKTifpns?1qKg5yAkde#`;9DaKh% z>q2ieS}${TD{ExtA}`aXBj{?Ku+*wIx>UzTDXwB6g_J@nIuV&a@E0`aQzEN5a;1!r-ZX>_T9PE;i-Jnt233sBAY028D-qqbVpZ zBp9z}5^Z7G9=4e%T;fd!P_9?8ABc?yX&Kol#g3}yD`*e=BdaJ(d7|;$+@(oPj*O9t zMZ6OP5ABf1HAET~#64I(`RkByL%r$3{hvzexIASI?kG;5;sT!<)EH*5bz>rC0A_hD z=vkpfj3|FQsV}bYy&|7TXnP%x8HwJv9|gZl#6I1Z1TuKzCNVskZp#BV)~|QuOH+fH zS8a-)fvp`VoFIb)!=wQuPsF6XHL@@RZu)5q&tS0*+>{6wv+~7S(Bg?Btp+r>uO9%* zHDtFP&7#*JU_Hbj-%w<$Y%I$dL<$#$g(-lC`mv@OV%tmVbb*afY)YhGz0*uTz;b#Z zkyTy#n0#iH2#i&~h81DwGL6BY@Y$}$2xOc+nDL}P&&k)SUGJsRAoJXW=5wEOzWAgs z6Bx~H(_;`FD3(0$Wn_-7)UcV6n!QHT1YX-8SLdwu<+*^smq)i;HBnHB;umVMh^6?Y|sfaDP zuPB=ft2U_v&K>uPgTl>y?ZkwFf7KML71USyfm2oVS^*d7%n*8Z6W0@<;wwos;XE{Y znD&142cojY+{=6s7Or$MNy&kMB!F`4BuhiWRh7sBDpzEOV!?6cY`~jp4`AkXl1JxWO?Jjx6&V>nkF`iiHWJrRjLc33AtMo?l?ko zP-+1>F< zZEpXI)^29MCS>0^+(schR&HAcTDL`dGrGbU{Y|<2e!jc8)|bBF!*Gs5f`P*qyF)%2 zu~$xH8enMh%+NPKEt_F5U;T$cpu7W1dk01Jl!Sp$$Brxh~axE50CP9y@55dI>RXTu-#q+CJ%5K zM0;_Vtp;<_g5ynvSmWQs3*vR;eSuZBHi3oyOBZxXmecZEs6jM=9+>3DLu6mBvqr}4 ztc=1>iUomWn+eGDlJ1s6r-HcRV9l0t5T4aBYnH7Kt(CmzW6?dFDY6cZGz2tno!LhB zw6MC9`JXkv@0gWJri+#!MR*$BbX($?Of?H!HXdMPcjXJ7%wZP+lOw6a*KWu~NZK5p zj_1~sKXCf(_y3AJAMmV;E8pkMynz6T1e0n|#3;D31uIs%(lynHxaKNlL!~TRBjOcn zs!)PN4G<6k7gScGVvGN=jfxlix9S!vR@$PXqN1V&OD$MbTtU&IRf~E*-!pT52^4ql zeRh57^T;pnoS8FcX3m^BbLPw$jsY6zE-5pVmgKgNw4LyltYuKPKn^ajEeGVhoxM*$wBsSb%RT|m|JArBTEW4jZ* z0${JaC7D@4v`=Fd968zJjv!Mi?OuGh%asi{xe8!`QQYZMjAhb{=_7ld`~ zKYn0@($aIZM&#l>wD|RDL2RWb5JiyTIES>D*LD=MHD+; zyL{Oi;F^cC1OGLhSgPrZ?O>$juumKr1|!^mNSc`?C8sR-ZcN}EA@>9N@veSAuO~mC zyQ3dacq(cci~ih>`KgF`ZI;v#^OknZx9p0UXUA>){yky-Rm8kwr*{_$CIt8Uw7sS^ zdvIYQhNqLxm7$IgM&m1Lj)Y!0S2`$#Wee>M@M|p1d*1SCgWs{GF zjnR?igGp@1zX*Z4un9hgzy+T>!JM$lJzTD;x*Wzds|#Co{Sl!xCalo1R9SE^&hiBX zy4NY6$vXed?8B#`R5}IK*`Vx@<_m)xS_XA>ygu1C=P0DLVO}W@x2R-eT&<~zCv2@C z)7iA51%)(42CM;vsVM7nwPb-FyFo^?#vcaZY$}*4C+X*R^wRg* z-qmY9fO?P*XHw6B7VYW23yV%8N55{KBUkiotr8Px43*V|N4gc|$gsRa23^ChEb#&t z**UI4;l0%aV50-_$A#yZUnI4bdS2dBk{M!Eme3-uSg6$;IW;8QZ~e5FXP*M^&$`jYlqR}2rc1Y(&b#JoQc6T&lK6r2k*-2lNrRyNtgylXG%i_ne z`q<0h`ZZF5)SgUKG+mfE-J3eqdZe+3vP$+=HnhRb_8j(H(GR$!)!ot|dWf)-wA<27(U&srO9 zlSQ~Lmp?K5Xu9oR@)WlX7n^U{-pphK52P7*X#k0Q1nTzp#;C8s%}|m&Crd6wIU{Jq z!_nm2p#o5RolTMB*Fj9ej|lD>ULvX%h}QOUB99Kgm}Gl}We0ebnjy6^Pf4S$=-n|H zww!L~lnuKiBeOdb2U(P_$N;j=GfZbNf)qQ5_79dpm+mN*TA55+QY$Hpz&8o6vvmfw zFuWM8rFB(aJ$`Qmh2wJJk8;l}!Q+kJYDt!XAPovjLk~(6^*zW7n%5!)cgBKr!WE^) z1!E8PEFU(48-@Ft?l#}IW`J!1EMw9MBBNctBq)svW*(ACLoC4@73yo|p^oq|*+d%H z#*0ZIR=>$m(a$ryC;-GxF`tuhS^5Ji2(hbUK~`R+P_+K5Ui2q&gN4{vB{Z40ZSr1V zwvS~2Kz8p`G8}V%CwBc9EX<^&06Y~5HWU+=G)>5ou^PTF2^*q>-_YONR2vS9<9wJ` ztIh5rdIA^r8t57OH3v*B(*C8*e-r&-QzyG^yu*{izi1_c+kYOnd(DS?S)P%$etJk_ zhmy~V46gjZUEnA)y2r8ch?JV&4^O!hNm+EH=R42v>(P%=BfDylLnZ@h%0UzXrG;ff z2HB*#A?p3E1{nJdFLH%;11#aSp|`m>Z_Xg{%^E3WKP|M$QFD}+`JIq)-kR?jJ}a>f z8Z_8pvqS^<4v=SxJiJ$AAbZ~ckXD%uf1e8EdnAoMk8u=w#|P1Hpze>!u`|z2qrzxJu)DHI@HQkh zbC?bx0@K$iz4llyeYXTOr%Jq1e*^L!Sjlk?GpF{Iz{5hdAtWaVaRjN*`yHCX&+XDeM<)ap+-_ukTRDEssJl908XcPX0w1KwQFv z>1Nznc7h}B6Nq0fS=a9$Jn8STsf%0IdWzil&D-IdKqOz*p6Jz00)U7m8kgkXf?7}4 z{uP$iE}W@{d$O`2`^*WYN~;a3n4K!MM=SD(@~_Y4h$#J(B@ni5GkXo&bBd_H_Y?t zAt5NsLEy16V^ab5t)x*52|UGZ4+DJLGuN9@qbd9S8*wzP*7=yHa-*bj60{ z;UcPmHXXRq@s|YJ%>6J1&q?jRfuM3s&55|8KENHwzioQ6$R-TJVs9;kZP>jEezIMo3S#$R*JQK##Xr?O-O9W$@ z5u~Gs9rm#0wrdSM3#{PI*fBY>B}i0^4nO)-N4h}l)}p4_6D_a_f>pz@`x7n4gmo8S zCLe~HsUomqQFutNy3j`|(vO=iyS+wpOn5^RuTH|FyC$BUx9U`n^<38B@QIcix`Wuk zwgW3tjB=?7)u%gwvr4c|(x1f?gRBoFEcyPK{gLL+C3v}$zj&UmT#aFO|nzRI&2Hv(a9Pdxn>S0-{Q%CKw)sN{4J*{3+WHk*t z({bo64F>R4jSX8LrdV&8)+{Q=S^$LQup>LoTY5$2Q<^A;Rr>02m7*h9#SXAzQJx&K zA-*FG@nk4xDJrt~BhX%Pw%5C@TYDdZ@N(S@;JY>UVg8%p&L&%8#{Ixc#9J`SvftX5 zQlf`-%FuICHlD&MvcQQY=X%P4;g(=a&O%ROHtCAW+U)m}k|Qi3CzHBrycZm%OJ>?Y zZkX&u%+p#!M*}bk#iRi~wkg3$WT2*6p?f_sT#^d?ITm93)YBHaIp;fC%$7Q#i7q8PiAfJI~QjG1g{XkAk(CFmk)|f*m zk<n~QAd z2hR0Uuc;LL0>Jo%lLQIt2Rs9d^H4;f{1sUDDy($Bd0rYV#!BCi>im9qf0|`kmu0c% zc&UI`%T@vN7yR{?I*RS;D&VaNuHR(Xm}TJdshBo@wp?rlYP-zKa<$9&`Ft#J*e|m5 zcDB70 zJXQ~jLEO1S&+MkfgqIn_VFUma?>?o9%5qfjhhC&G@aKk`bVmeU#G-D7MvZ-OE=FWU zxl;75l~*|#UBaTAiG~f=I`MCn71few;Ez0Ex;Z#CXTLv@;6dnJytgfrJ2Jp@bLXu7 zu@{`BxY=a6f7}Ywz8eey_(^HGeu3( zmX)3~S;1ZVv67*9Q*Ru>TAL*?;ljz`MxEV~%M1f@X(6>RyrwD0?r*XJ zg7lVFLQpmfO*kRU>KXZVa%gKnOvB-?2qs1iuU1Ca*U91O26C0j0?qlpj)Fnmi(m)J zN)xZs6t{i~C%n&Q>#_y27k~|se$(2%t31PXk~S=3KeU2P zS^CFG8qH18s3GwFpq9UZPkK?EF4oAjM=YOxrNbrv1w?8?*vTV|YT;aw4f(dSZqQXQ z)8*w>0O=*x0+fz?E`Pnb5Q)0APk9yhO9knh3(siDX3wF}cd}FCmqEYi1zN-g$GpwDX87~0ZrPMOT}Zc(aHO2yXa68$zM7r*Gg&JI@*u96HbFL?vsP2&T= z#;3^OB`-VN!r?N0KT2@@20?3<;Z^~dLYIf|`v_}T=k;;t_JO}aabUFty!dF@80qdQpD>bIf`%QAr8z`;pL@}%a&#(>RuN218 z?8^C|?3CZ|Tc?Xa3GkzA5N*G6oU*txzFG^ov^^rsogVcK@*=xzP}6eI!a-D3F8?I) zs#@$3o$;?a;u92g!j9&)%AU^#hg_qWhFDL~1Z?%kP0h~SF>?+V!Qbn^NyU+oDAW|I z)b?Jy+0IA6woMTiSpZkW5f7#+&_Tndb|Sd%Zq8^<#Ep}B@AR?8{pdu48Aji z-<05gNETN82EoiX9KoE#U=za5$X^v(y`{VwLNreC#{73YyS8G(G|layqY;vlrZ+0@ zj9nB*IodFegoODi(iqdya#3C3izu$*S)M+Ope$acebOKxgKq+H_xUhYGgGwAWl;*3}L z5WAw;2L%w-raU}7gAMusS%mEDtz!U&@mgMaoKjJj+3oei)*`VqI2V4M#{`1esizjs zN0bO5&&qf=Qi(M}e2e1pL9D$@T^(kN%u051i4ft1(zb(~QdzN4RpjH|kjtMC-qXng zj*QUIs(`%BG97#%(pxpl$zxl5dOIHoNY5)Hi0KWL7{L+qm{e`0m?}Q8H_8-T zJFnwR-FCx%u@Ju?P*e_b6f&7`q-qBP7cpwgC$z=YL^mK?bC&JPpF023BIXS3eiZqz z?PzbSZG+(A$>PmJ=w}%31T1{R$+dlm=Q^D+tJO8DEhToUwCW!cgmHazGUGZd8&}Jt zlMKta;>7}k6ElkJ0+w_216W%ITd8{|NTtUQWBSyytxES$ z_^szhnMY5IWFGa3rTe3>puEU3&1aKT9llGVsWEJt#00C7e%(#dD6nHjplH`>9}7fQ ziou6p-M~OjZRGjYiAICxHU%@_=X%vWURbDhM0h|1Fcl&H>He|iXH_#|^AXwe*pq!U z2@Hd<$(J&Nd*P6&R?wRJ4~zM(p2!}CeAhHt^T&V3yC%LN%aKU;NVo(fhFnAbcDZG) zJjF8?s-yCvR9>w8a`|_1;U}ltcKHF%g!Oc+k$T_$kUCIq8fH3IYijq@C(OS8hdxnN zZwA(gS}kMNEw`u5E|8bCz(H1*Xow|Vl^Is)u-gYfDINWw<|-nW%(KUlRB1H6S!r&; zC=FZAG_7LMC~xa2pwKSmlN@GS9o(+`CkM%Fi*|Z6#yPS2(9sUi@Byd{_ux_sWK{;y zvdi#b60tjOw`y;|o~%?M+!bJxGIti?=0^{4fUhG5I*;+{Oy{xg=^W8a*+_5Qwr7N2 z(s4Hpst9jJQ{Le3IT`k}g-Nsd@om*r8Hg>d&4lB_tazqXRqv%flTCo}olQt~)u}Mu zeL3AxGGa1a1f}PX*L@>kHFbs6NxMH!lUP#Y-jeLA1%gG99CliBeE2l^h|G?p zhgV}Sm5p%{I^0mL)ZstjRNNA8{h z#LnF?)hv|x70kG3P2HFkx~zY^-c@V@kuHSCbr=YzDxM|MPjR5BSf(+so&i>b#S_Tb zcxz_BM6aL6DZd^^=%q>M!BCkTb72DVZzzEZE=Dsim`)m1%W=nK_;yfKvXpJL%(4jm zC*&AbjE>7jn7&)l=+(q{Y--HMu`xR`5El$>(#h40F&ty#tBya<3*(+>k{XtKyUGGh zZ_Hr2@l>zY_td<9a$38fuGtg&57?8Sre)VzWICPN!C)3s;j(&~LWe%xhsybWqS$RT zZ3_p^P&eRwr%t^<)$*Ny{Ic+9y&1X}W*IQ~n7kUI2!V1`T6%$(y?=(Cj&08phDXkO zvoQ3ttc@3X*3m#<*I+wp9;PNBQYuFTr$mM6G zygNRP#=xx^1d6mB8#vXo)l52#vNyuj%sx3a%oixShx7UP}M9rklcym1Dwk(g%inKK;zXoCMTNyvpQc11gX zk!L7Ja3TFigj;oGis?lyzb#;_;n;NSc^ab!;5{B)nQkj(&CFC}j)V(2KiFs~8S2DvVFD)r$R^0A{6!UBJF25G}FF7Jj1H9G~LLyPdZb>u zRd;&khq{7jwEVN^TFG)a;z<+)GBy7n&-7U-8VKDtOY#lfTNn31h zf(o*ayUTIim$iYONjRU6IE(N0Oz)>QT%k5V^alzi!}my#GuS7_HZ+EpFNkcI70j`1 zl&ABl1RSZ(@l0K*H2q=xl8ve~JTwDhQ5YM;lQNdkmop;FPO`KRC0&>mqcL8Mn*%yb z?)@d*@3?4JOt_bm?Q-2IrN`B^OzL8YEXL9*gBxESaxb0 zzAH)_HEJr8Pk}(G?q=0L6pgi*M;Q3c<7=tNY(2)2i2=yW@BNj_eZH-3aVaw zk)FOV`o}-#HLsBr;a~{m=It14yLgSmu9ZZFY4;CpY|QDR)(m84cUs{nx0od#VDs}{ zj_pk<$3d$=1ur=0?FiB-o8CH^mjUdpLVAox7Y_$e_M(@t*B2q;QXB@NOh6>im!HNlSh(Jc z%}&%2Xzy@S7^_}MAh__Vkyd-YOW$;8q?Xj(+K9$UX)mV*wJ;QAHD>E=1EQ5AIxAy$zWXp4_ItVWc zy1GS%aao3^q!F>h!eQE8@71e{6=@x+XQhX)dESL0HQ7~Y)Lg=QceNXpe;Xu2D&mul8I=oSJITu;jL(;1_5NY26md*+a#-J#AsN8z_494io z@*B;J;XUoKDc1$>WrTe9@Gsy8^Ol}IJh*OLQ)ELnZ-1|?6P4BJU>-~|^P!TD2;0(` z4F#^$p$%P<4sGPI2}5Dpu#j0or@m`NVvs~_t9v=-SM#8@p*#xiM5AR}WooEVo##F! zwxbFy5DKXQ|IWkeS7PiivbU2wG(0uY3{i|SFRzt=gmH5>-5W6_$&X_LTtMmd-JuSx z?*=)#GV4An!!3y&ouZ%9s%s}j12#F|+zb9NO-_rq1KBJ@<{2v|`sYsn6UYGwaZ8s60_ zEQ~-h;Lx#S!Y}<57A#fV?2>j5XQ9TI2OfNF4+6nh9Ty3e`%1AY8KaM_kTj7YnpJ3v zQ%hebE64HTP!WS6NMVrT{J6*tM)i8l5DR16bcpBYEd(>pKAW?!Ll)j9J{-riS|gJ< z{iN$b(5ROV@~t6UtY{028tAk-hA5He8+@u*;2Ns zpXag*OG9-wn=UMcN9CJbAwvuIpmgCpy&i6lJ{?T`a5xX_*;0drRChs<_GZsZmC4D5 z29z2bL${r6NJ*!GL(smfpmXI{oq}a*3$yssLX*U;{T-n2GkNxm+$0wK1zo+S*A)$h zDw#KYkoJtYwp&0nxnMH8=cHiE944D~HX(8eVP9>*9FQtdyHc=}hQqwl4aM+6KjE_A zJ8BV9xfl`{VLRfP!CDPw-M->3Z)y}GNeb$MuQ?vB(VM7ar-{{G@@~N4UM~;LEsXP} z(bK{Uc`Ps{G+?N75`KgUeGMGs{G+(_a7}}aczo^46ohk%!ve(#8JyE=cq1W(Zofxr z06elTPi!M*FVkRgnw>{DbwA591)6ktLjgUFOz&yOjcf)HH+*#JH}vaH@I2xlb8#qv ziK!*KFCt{o6yytkQHJL{I(o=StF{TgWSU)4tUA(hk@q#d)Hp~CvX9*2K(tV30L69cRlETX9LB$6AHfYzf!9IF=F&OH%=*Wkq ziFe;j#$p#W?_^m*AeuMl6_NzuYqvd^$L-6=sPN%*3TqXif-5^|Kcvw>IFC&_y9H;#`vUW&h5zA6M?8)sE=mHFG)0t%}S3@?#wpQ5p`^GOK6IDXoJA zKE-qoy)c5O{|*szQZk+DCWESGGwHm^rh6R_H{dwO_+WPmvv8Pfd0Iwl5H9Z?=d7d- zXrDh1yfmKjOG>Gdo==FSE;CS)Llk?4;zB;ekw2pw>5v zkcG0!0wxjCppW7z8Bw@JJl}}0qJhQXcM3QhDS1gpvn+OdiR~0;2{yHmkwe4dDL?f7 zN)&+JSZ@quB3oFB{ykD!eS%ZU#U>jgy%!MdA!rct>82lG?_x-WZ;BUrto?Oa8=E8yvhK2M043+s}8#$Q^orT{EOcs4Q1Z zyd>&}NqZn-l(k~DSe6N7%1dLdw}60LHIfKAv#Zrdb3Mir6aN`RN80RG2C8xXi(mIp{0eA9J35eLk+$TQWqvygE46y@$fa zNh-{UqO$X>nYwA^$xcP})!n&LQ{1l>p(y8`9}tX=pv$j$B3# z^KK^Bech=a6k68cpi$w)$;=>n57<2=C=y7df0H)IS8pgOQ>XAVQlMl~13S0}kKAWSz zS?j4@;d)(EWqOz;SD}C4uJX{T$UpT;MeL1HoOEl&-LjX^ia2W_{DFGsgpSkqX)U^h z5TXq*g8UQ>=`tZ@Dv4P^x*{R9ht@%A?s*$ebHY&N(z!M`5@(MIHO7v$V?5W)Vsw0Z z$hID3aenEz7!^{EkWhN90z0v;B?3tsqpNdHAnhwxguEnQ1`B+Zj0yCnUFD$DKIm*A zBj=AzwMLDhG~6Q8P~H(WWp_dS;jXCXB-B@?o~%%?9I330|J$3iKx-$nq1w{7XX!&p zW(DCLS>E1u@vJ9$dFc%FkG9qn=UM?IH#9nQe1!Ih&}jzU zoBo~?LolI&T+U3F|IL4fQ$Fy2VZy_m2K&#y6H~f>iv5rD9mTgB z|9koDkCf1y@(Hc}_wtn~eGFeZD=XIQ<eP))W+cQTg3FUAa}hlM3m-6|sCljs5zIe|AqEM-G+M7}$R^<3M})u_@W> z_4b#g^qzc`=H5r`~=eWRDNSkELh*TD|Gkr z=aa24X5HoAn)_n8dmoL^u0V$$&|bguPe0PVZ#p8_-WW&ZxQ>Z?$oqGDNK=s`CdKj> e9=a>VyVo`33(7BExR=lrtbN5f)qeg3t^XH5Ri=pm literal 0 HcmV?d00001 diff --git a/backend/app/symbolicator/dart/fixtures/flutter-macos-arm64-dart3.10.1/expected.txt b/backend/app/symbolicator/dart/fixtures/flutter-macos-arm64-dart3.10.1/expected.txt new file mode 100644 index 00000000..4a1b158d --- /dev/null +++ b/backend/app/symbolicator/dart/fixtures/flutter-macos-arm64-dart3.10.1/expected.txt @@ -0,0 +1,17 @@ +chargeCard (/Users/dusanstanojevic/Documents/flutter-demo/app/lib/main.dart:20:3) +applyTax (/Users/dusanstanojevic/Documents/flutter-demo/app/lib/main.dart:30:10) +checkout (/Users/dusanstanojevic/Documents/flutter-demo/app/lib/main.dart:35:10) +main. (/Users/dusanstanojevic/Documents/flutter-demo/app/lib/main.dart:47:7) +_rootRun (third_party/dart/sdk/lib/async/zone.dart:1525:13) +_rootRun (third_party/dart/sdk/lib/async/zone.dart:1516:1) +_CustomZone.run (third_party/dart/sdk/lib/async/zone.dart:1422:19) +_runZoned (third_party/dart/sdk/lib/async/zone.dart:2034:6) +runZonedGuarded (third_party/dart/sdk/lib/async/zone.dart:2020:12) +main (/Users/dusanstanojevic/Documents/flutter-demo/app/lib/main.dart:42:3) +main (/Users/dusanstanojevic/Documents/flutter-demo/app/lib/main.dart:38:1) +_Closure.call (third_party/dart/sdk/lib/_internal/vm/lib/function.dart) +_runMain. (lib/ui/hooks.dart:345:23) +_Closure.call (third_party/dart/sdk/lib/_internal/vm/lib/function.dart) +_delayEntrypointInvocation. (third_party/dart/sdk/lib/_internal/vm/lib/isolate_patch.dart:314:19) +_Closure.call (third_party/dart/sdk/lib/_internal/vm/lib/function.dart) +_RawReceivePort._handleMessage (third_party/dart/sdk/lib/_internal/vm/lib/isolate_patch.dart:193:12) diff --git a/backend/app/symbolicator/dart/fixtures/flutter-macos-arm64-dart3.10.1/trace.txt b/backend/app/symbolicator/dart/fixtures/flutter-macos-arm64-dart3.10.1/trace.txt new file mode 100644 index 00000000..ac4a5087 --- /dev/null +++ b/backend/app/symbolicator/dart/fixtures/flutter-macos-arm64-dart3.10.1/trace.txt @@ -0,0 +1,24 @@ +PaymentDeclinedException: card declined for $30.59 +*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** +pid: 58347, tid: 8806539456, name io.flutter.platform +os: macos arch: arm64 comp: no sim: no +build_id: 'fe664295997135e7b67b648ba66ca9eb' +isolate_dso_base: 1130a0000, vm_dso_base: 1130a0000 +isolate_instructions: 1130aac00, vm_instructions: 1130a0440 + #00 abs 00000001131eca6b _kDartIsolateSnapshotInstructions+0x141e6b + #01 abs 00000001131ec99b _kDartIsolateSnapshotInstructions+0x141d9b + #02 abs 00000001131ec963 _kDartIsolateSnapshotInstructions+0x141d63 + #03 abs 00000001131ebb23 _kDartIsolateSnapshotInstructions+0x140f23 + #04 abs 000000011320abdf _kDartIsolateSnapshotInstructions+0x15ffdf + #05 abs 00000001130c524b _kDartIsolateSnapshotInstructions+0x1a64b + #06 abs 00000001131c50c3 _kDartIsolateSnapshotInstructions+0x11a4c3 + #07 abs 00000001131eaf6f _kDartIsolateSnapshotInstructions+0x14036f + #08 abs 0000000113225087 _kDartIsolateSnapshotInstructions+0x17a487 + #09 abs 00000001131eaeab _kDartIsolateSnapshotInstructions+0x1402ab + #10 abs 0000000113205137 _kDartIsolateSnapshotInstructions+0x15a537 + #11 abs 000000011322be8b _kDartIsolateSnapshotInstructions+0x18128b + #12 abs 00000001130ab25b _kDartIsolateSnapshotInstructions+0x65b + #13 abs 000000011322be8b _kDartIsolateSnapshotInstructions+0x18128b + #14 abs 0000000113205563 _kDartIsolateSnapshotInstructions+0x15a963 + #15 abs 000000011322bbe7 _kDartIsolateSnapshotInstructions+0x180fe7 + #16 abs 00000001130c256b _kDartIsolateSnapshotInstructions+0x1796b diff --git a/backend/app/symbolicator/dart/fixtures_test.go b/backend/app/symbolicator/dart/fixtures_test.go new file mode 100644 index 00000000..d6a257f4 --- /dev/null +++ b/backend/app/symbolicator/dart/fixtures_test.go @@ -0,0 +1,73 @@ +package dart + +import ( + "os" + "path/filepath" + "strings" + "testing" +) + +func TestTraceShapeVaries(t *testing.T) { + for _, dir := range fixtureDirs(t) { + name := filepath.Base(dir) + raw := readFile(t, filepath.Join(dir, "trace.txt")) + trace := ParseTrace(raw) + if !IsNonSymbolic(raw) { + t.Errorf("%s: not detected as non-symbolic", name) + } + elfBuildID, err := ReadBuildID(readBytes(t, findSymbols(t, dir))) + if err != nil { + t.Fatal(err) + } + t.Logf("%-36s frames=%2d header_virt=%-5v header_build_id=%-6v elf_build_id=%q", + name, len(trace.Frames), strings.Contains(raw, " virt "), + trace.BuildID != "", elfBuildID) + } +} + +func fixtureDirs(t *testing.T) []string { + t.Helper() + all, _ := filepath.Glob("fixtures/*") + var dirs []string + for _, d := range all { + if info, err := os.Stat(d); err == nil && info.IsDir() { + dirs = append(dirs, d) + } + } + if len(dirs) == 0 { + t.Fatal("no fixtures under fixtures/") + } + return dirs +} + +func findSymbols(t *testing.T, dir string) string { + t.Helper() + for _, pat := range []string{"*.symbols", "*.elf"} { + if m, _ := filepath.Glob(filepath.Join(dir, pat)); len(m) > 0 { + return m[0] + } + } + t.Fatalf("no .symbols or .elf file in %s", dir) + return "" +} + +func readFile(t *testing.T, path string) string { return string(readBytes(t, path)) } + +func readBytes(t *testing.T, path string) []byte { + t.Helper() + b, err := os.ReadFile(path) + if err != nil { + t.Fatal(err) + } + return b +} + +func nonEmptyLines(s string) []string { + var out []string + for _, line := range strings.Split(s, "\n") { + if strings.TrimSpace(line) != "" { + out = append(out, strings.TrimSpace(line)) + } + } + return out +} diff --git a/backend/app/symbolicator/dart/flat.go b/backend/app/symbolicator/dart/flat.go new file mode 100644 index 00000000..46747357 --- /dev/null +++ b/backend/app/symbolicator/dart/flat.go @@ -0,0 +1,606 @@ +package dart + +import ( + "bytes" + "debug/dwarf" + "debug/elf" + "encoding/binary" + "errors" + "fmt" + "sort" +) + +const maxInlineFrames = 64 + +type SymFrame struct { + Function string + File string + Line int + Col int +} + +func (s SymFrame) Location() string { + if s.Line <= 0 { + return s.File + } + if s.Col <= 0 { + return fmt.Sprintf("%s:%d", s.File, s.Line) + } + return fmt.Sprintf("%s:%d:%d", s.File, s.Line, s.Col) +} + +func dwarfFromELF(elfBytes []byte) (*dwarf.Data, map[string]uint64, string, error) { + f, err := elf.NewFile(bytes.NewReader(elfBytes)) + if err != nil { + return nil, nil, "", fmt.Errorf("not an ELF file: %w", err) + } + data, err := f.DWARF() + if err != nil { + return nil, nil, "", fmt.Errorf("reading DWARF: %w", err) + } + syms, err := f.Symbols() + if err != nil { + return nil, nil, "", fmt.Errorf("reading symbols: %w", err) + } + base := map[string]uint64{} + for _, s := range syms { + switch s.Name { + case isolateInstructionsSymbol: + base["isolate"] = s.Value + case vmInstructionsSymbol: + base["vm"] = s.Value + } + } + return data, base, readBuildID(f), nil +} + +func ReadBuildID(elfBytes []byte) (string, error) { + _, _, buildID, err := dwarfFromELF(elfBytes) + return buildID, err +} + +const ( + isolateInstructionsSymbol = "_kDartIsolateSnapshotInstructions" + vmInstructionsSymbol = "_kDartVmSnapshotInstructions" +) + +func InstructionSymbol(section string) string { + if section == "vm" { + return vmInstructionsSymbol + } + return isolateInstructionsSymbol +} + +type flatBuilder struct { + isolateBase uint64 + vmBase uint64 + buildID string + + entries []flatEntry + frames []flatFrame + files []string + fns []string +} + +type flatEntry struct { + pc, hi uint64 + frameStart uint32 + frameCount uint32 +} + +type flatFrame struct { + fileIdx int32 + line int32 + col int32 + fnIdx int32 +} + +const ( + flatEntrySize = 24 + flatFrameSize = 16 + dwHeaderSize = 48 +) + +func BuildFlat(elfBytes []byte) ([]byte, error) { + data, base, buildID, err := dwarfFromELF(elfBytes) + if err != nil { + return nil, err + } + return flatten(data, base, buildID).marshal(), nil +} + +type funcRange struct { + low, high uint64 + off dwarf.Offset +} + +type lineRow struct { + addr, end uint64 + file string + line, col int +} + +func flatten(data *dwarf.Data, base map[string]uint64, buildID string) *flatBuilder { + f := &flatBuilder{ + isolateBase: base["isolate"], + vmBase: base["vm"], + buildID: buildID, + } + files := newInterner() + fns := newInterner() + + rdr := data.Reader() + for { + cu, err := rdr.Next() + if err != nil || cu == nil { + break + } + if cu.Tag != dwarf.TagCompileUnit { + rdr.SkipChildren() + continue + } + + lr, lrErr := data.LineReader(cu) + + topFuncs, bounds := collectFuncsAndBounds(data, rdr) + if lrErr != nil || lr == nil || len(topFuncs) == 0 { + continue + } + sort.Slice(topFuncs, func(i, j int) bool { return topFuncs[i].low < topFuncs[j].low }) + lineFiles := lr.Files() + + var raw []dwarf.LineEntry + for { + var le dwarf.LineEntry + if err := lr.Next(&le); err != nil { + break + } + raw = append(raw, le) + } + var rows []lineRow + for i := 0; i+1 < len(raw); i++ { + le := raw[i] + if le.EndSequence { + continue + } + end := raw[i+1].Address + if end <= le.Address { + continue + } + file := "" + if le.File != nil { + file = le.File.Name + } + rows = append(rows, lineRow{addr: le.Address, end: end, file: file, line: le.Line, col: le.Column}) + bounds = append(bounds, le.Address, end) + } + sort.Slice(rows, func(i, j int) bool { return rows[i].addr < rows[j].addr }) + bounds = sortUnique(bounds) + + var lastFrames []SymFrame + for bi := 0; bi+1 < len(bounds); bi++ { + a, b := bounds[bi], bounds[bi+1] + fn := findFunc(topFuncs, a) + if fn == nil { + lastFrames = nil + continue + } + var chain []*dwarf.Entry + cr := data.Reader() + cr.Seek(fn.off) + descend(data, cr, a, &chain) + if len(chain) == 0 { + lastFrames = nil + continue + } + lf, ll, lc := rowAt(rows, a) + sfs := framesFromChain(data, chain, lineFiles, lf, ll, lc) + + if lastFrames != nil && len(f.entries) > 0 && f.entries[len(f.entries)-1].hi == a && sameFrames(sfs, lastFrames) { + f.entries[len(f.entries)-1].hi = b + continue + } + start := uint32(len(f.frames)) + for _, sf := range sfs { + f.frames = append(f.frames, flatFrame{ + fileIdx: files.intern(sf.File), + line: int32(sf.Line), + col: int32(sf.Col), + fnIdx: fns.intern(sf.Function), + }) + } + f.entries = append(f.entries, flatEntry{pc: a, hi: b, frameStart: start, frameCount: uint32(len(sfs))}) + lastFrames = sfs + } + } + + f.files = files.list + f.fns = fns.list + sort.Slice(f.entries, func(i, j int) bool { return f.entries[i].pc < f.entries[j].pc }) + return f +} + +func collectFuncsAndBounds(d *dwarf.Data, rdr *dwarf.Reader) ([]funcRange, []uint64) { + var funcs []funcRange + var bounds []uint64 + depth := 0 + for { + e, err := rdr.Next() + if err != nil || e == nil { + return funcs, bounds + } + if e.Tag == 0 { + depth-- + if depth < 0 { + return funcs, bounds + } + continue + } + if e.Tag == dwarf.TagSubprogram || e.Tag == dwarf.TagInlinedSubroutine { + if rs, rerr := d.Ranges(e); rerr == nil { + for _, rg := range rs { + if rg[1] > rg[0] { + bounds = append(bounds, rg[0], rg[1]) + if e.Tag == dwarf.TagSubprogram && depth == 0 { + funcs = append(funcs, funcRange{low: rg[0], high: rg[1], off: e.Offset}) + } + } + } + } + } + if e.Children { + depth++ + } + } +} + +func findFunc(funcs []funcRange, addr uint64) *funcRange { + i := sort.Search(len(funcs), func(i int) bool { return funcs[i].low > addr }) - 1 + if i >= 0 && addr >= funcs[i].low && addr < funcs[i].high { + return &funcs[i] + } + return nil +} + +func rowAt(rows []lineRow, addr uint64) (string, int, int) { + i := sort.Search(len(rows), func(i int) bool { return rows[i].addr > addr }) - 1 + if i >= 0 && addr >= rows[i].addr && addr < rows[i].end { + return rows[i].file, rows[i].line, rows[i].col + } + return "", 0, 0 +} + +func sortUnique(xs []uint64) []uint64 { + if len(xs) < 2 { + return xs + } + sort.Slice(xs, func(i, j int) bool { return xs[i] < xs[j] }) + out := xs[:1] + for _, x := range xs[1:] { + if x != out[len(out)-1] { + out = append(out, x) + } + } + return out +} + +func sameFrames(a, b []SymFrame) bool { + if len(a) != len(b) { + return false + } + for i := range a { + if a[i] != b[i] { + return false + } + } + return true +} + +func framesFromChain(d *dwarf.Data, chain []*dwarf.Entry, files []*dwarf.LineFile, leafFile string, leafLine, leafCol int) []SymFrame { + if len(chain) > maxInlineFrames { + chain = chain[len(chain)-maxInlineFrames:] + } + out := make([]SymFrame, len(chain)) + for i := len(chain) - 1; i >= 0; i-- { + pos := len(chain) - 1 - i + sf := SymFrame{Function: nameOf(d, chain[i])} + if i == len(chain)-1 { + sf.File, sf.Line, sf.Col = leafFile, leafLine, leafCol + } else { + inner := chain[i+1] + if v, ok := inner.Val(dwarf.AttrCallFile).(int64); ok && int(v) < len(files) && files[v] != nil { + sf.File = files[v].Name + } + if v, ok := inner.Val(dwarf.AttrCallLine).(int64); ok { + sf.Line = int(v) + } + if v, ok := inner.Val(dwarf.AttrCallColumn).(int64); ok { + sf.Col = int(v) + } + } + out[pos] = sf + } + return out +} + +func descend(d *dwarf.Data, r *dwarf.Reader, pc uint64, chain *[]*dwarf.Entry) { + for { + e, err := r.Next() + if err != nil || e == nil || e.Tag == 0 { + return + } + scope := e.Tag == dwarf.TagSubprogram || e.Tag == dwarf.TagInlinedSubroutine + block := e.Tag == dwarf.TagLexDwarfBlock + if (scope || block) && rangesContain(d, e, pc) { + if scope { + *chain = append(*chain, e) + } + if e.Children { + descend(d, r, pc, chain) + } + return + } + if e.Children { + r.SkipChildren() + } + } +} + +func rangesContain(d *dwarf.Data, e *dwarf.Entry, pc uint64) bool { + rs, err := d.Ranges(e) + if err != nil { + return false + } + for _, r := range rs { + if pc >= r[0] && pc < r[1] { + return true + } + } + return false +} + +func nameOf(d *dwarf.Data, e *dwarf.Entry) string { + if n, ok := e.Val(dwarf.AttrName).(string); ok && n != "" { + return n + } + for _, attr := range []dwarf.Attr{dwarf.AttrAbstractOrigin, dwarf.AttrSpecification} { + if off, ok := e.Val(attr).(dwarf.Offset); ok { + r := d.Reader() + r.Seek(off) + if ref, err := r.Next(); err == nil && ref != nil { + if n := nameOf(d, ref); n != "" { + return n + } + } + } + } + return "" +} + +func readBuildID(f *elf.File) string { + sec := f.Section(".note.gnu.build-id") + if sec == nil { + return "" + } + data, err := sec.Data() + if err != nil || len(data) < 12 { + return "" + } + nameSize := f.ByteOrder.Uint32(data[0:4]) + descSize := f.ByteOrder.Uint32(data[4:8]) + off := 12 + ((nameSize + 3) &^ 3) + if int(off+descSize) > len(data) { + return "" + } + return fmt.Sprintf("%x", data[off:off+descSize]) +} + +type interner struct { + list []string + idx map[string]int32 +} + +func newInterner() *interner { return &interner{idx: make(map[string]int32)} } + +func (in *interner) intern(s string) int32 { + if i, ok := in.idx[s]; ok { + return i + } + i := int32(len(in.list)) + in.list = append(in.list, s) + in.idx[s] = i + return i +} + +var dwMagic = [4]byte{'T', 'W', 'D', 'F'} + +const dwVersion = 1 + +var ErrInvalidFlat = errors.New("dart: invalid flat data") + +func (f *flatBuilder) marshal() []byte { + le := binary.LittleEndian + fileOffsets, fileBlob := encodeStringTable(f.files) + fnOffsets, fnBlob := encodeStringTable(f.fns) + + size := dwHeaderSize + + len(f.entries)*flatEntrySize + + len(f.frames)*flatFrameSize + + len(fileOffsets)*4 + len(fileBlob) + + len(fnOffsets)*4 + len(fnBlob) + + len(f.buildID) + + out := make([]byte, 0, size) + out = append(out, dwMagic[:]...) + out = le.AppendUint32(out, dwVersion) + out = le.AppendUint64(out, f.isolateBase) + out = le.AppendUint64(out, f.vmBase) + out = le.AppendUint32(out, uint32(len(f.entries))) + out = le.AppendUint32(out, uint32(len(f.frames))) + out = le.AppendUint32(out, uint32(len(f.files))) + out = le.AppendUint32(out, uint32(len(f.fns))) + out = le.AppendUint32(out, uint32(len(f.buildID))) + out = le.AppendUint32(out, 0) + for _, e := range f.entries { + out = le.AppendUint64(out, e.pc) + out = le.AppendUint64(out, e.hi) + out = le.AppendUint32(out, e.frameStart) + out = le.AppendUint32(out, e.frameCount) + } + for _, fr := range f.frames { + out = le.AppendUint32(out, uint32(fr.fileIdx)) + out = le.AppendUint32(out, uint32(fr.line)) + out = le.AppendUint32(out, uint32(fr.col)) + out = le.AppendUint32(out, uint32(fr.fnIdx)) + } + for _, off := range fileOffsets { + out = le.AppendUint32(out, off) + } + out = append(out, fileBlob...) + for _, off := range fnOffsets { + out = le.AppendUint32(out, off) + } + out = append(out, fnBlob...) + out = append(out, f.buildID...) + return out +} + +func encodeStringTable(strs []string) ([]uint32, []byte) { + offsets := make([]uint32, len(strs)+1) + var blob []byte + for i, s := range strs { + offsets[i] = uint32(len(blob)) + blob = append(blob, s...) + } + offsets[len(strs)] = uint32(len(blob)) + return offsets, blob +} + +type flatLayout struct { + isolateBase, vmBase uint64 + entryCount int + framesOff int + frameCount int + fileTableOff int + filesCount int + fnTableOff int + fnsCount int +} + +func readFlatLayout(data []byte) (flatLayout, bool) { + var l flatLayout + if len(data) < dwHeaderSize { + return l, false + } + le := binary.LittleEndian + if data[0] != dwMagic[0] || data[1] != dwMagic[1] || data[2] != dwMagic[2] || data[3] != dwMagic[3] { + return l, false + } + if le.Uint32(data[4:]) != dwVersion { + return l, false + } + l.isolateBase = le.Uint64(data[8:]) + l.vmBase = le.Uint64(data[16:]) + entryCount := int64(le.Uint32(data[24:])) + frameCount := int64(le.Uint32(data[28:])) + l.filesCount = int(le.Uint32(data[32:])) + l.fnsCount = int(le.Uint32(data[36:])) + n := int64(len(data)) + + entriesOff := int64(dwHeaderSize) + framesOff := entriesOff + entryCount*flatEntrySize + fileTableOff := framesOff + frameCount*flatFrameSize + if entryCount < 0 || frameCount < 0 || l.filesCount < 0 || l.fnsCount < 0 || + framesOff < entriesOff || fileTableOff < framesOff { + return l, false + } + fileBlobOff := fileTableOff + int64(l.filesCount+1)*4 + if fileBlobOff > n { + return l, false + } + fileBlobLen := int64(le.Uint32(data[fileTableOff+int64(l.filesCount)*4:])) + fnTableOff := fileBlobOff + fileBlobLen + fnBlobOff := fnTableOff + int64(l.fnsCount+1)*4 + if fnTableOff < fileBlobOff || fnBlobOff > n { + return l, false + } + fnBlobLen := int64(le.Uint32(data[fnTableOff+int64(l.fnsCount)*4:])) + if fnBlobOff+fnBlobLen > n { + return l, false + } + + l.entryCount = int(entryCount) + l.frameCount = int(frameCount) + l.framesOff = int(framesOff) + l.fileTableOff = int(fileTableOff) + l.fnTableOff = int(fnTableOff) + return l, true +} + +func ValidFlat(data []byte) bool { + _, ok := readFlatLayout(data) + return ok +} + +func LookupFlat(data []byte, frame StackFrame) []SymFrame { + l, ok := readFlatLayout(data) + if !ok { + return nil + } + base := l.isolateBase + if frame.Section == "vm" { + base = l.vmBase + } + if base == 0 { + return nil + } + pc := base + frame.Offset + + le := binary.LittleEndian + entryAt := func(i int) (pcLo, hi uint64, frameStart, frameCount uint32) { + rec := data[dwHeaderSize+i*flatEntrySize:] + return le.Uint64(rec), le.Uint64(rec[8:]), le.Uint32(rec[16:]), le.Uint32(rec[20:]) + } + + i := sort.Search(l.entryCount, func(i int) bool { + pcLo, _, _, _ := entryAt(i) + return pcLo > pc + }) - 1 + if i < 0 { + return nil + } + ePc, eHi, frameStart, frameCount := entryAt(i) + if pc < ePc || pc >= eHi { + return nil + } + + if uint64(frameStart)+uint64(frameCount) > uint64(l.frameCount) { + return nil + } + out := make([]SymFrame, 0, frameCount) + for k := uint32(0); k < frameCount; k++ { + rec := data[l.framesOff+int(frameStart+k)*flatFrameSize:] + fileIdx := int32(le.Uint32(rec)) + line := int32(le.Uint32(rec[4:])) + col := int32(le.Uint32(rec[8:])) + fnIdx := int32(le.Uint32(rec[12:])) + file, _ := stringAt(data, l.fileTableOff, l.filesCount, fileIdx) + fn, _ := stringAt(data, l.fnTableOff, l.fnsCount, fnIdx) + out = append(out, SymFrame{Function: fn, File: file, Line: int(line), Col: int(col)}) + } + return out +} + +func stringAt(data []byte, tableOff, count int, idx int32) (string, bool) { + if idx < 0 || int(idx) >= count { + return "", false + } + le := binary.LittleEndian + blobStart := tableOff + (count+1)*4 + o0 := int(le.Uint32(data[tableOff+int(idx)*4:])) + o1 := int(le.Uint32(data[tableOff+(int(idx)+1)*4:])) + if o0 > o1 || blobStart+o1 > len(data) { + return "", false + } + return string(data[blobStart+o0 : blobStart+o1]), true +} diff --git a/backend/app/symbolicator/dart/flat_test.go b/backend/app/symbolicator/dart/flat_test.go new file mode 100644 index 00000000..0d6eea0d --- /dev/null +++ b/backend/app/symbolicator/dart/flat_test.go @@ -0,0 +1,59 @@ +package dart + +import ( + "path/filepath" + "testing" +) + +func TestFlatMatchesGolden(t *testing.T) { + for _, dir := range fixtureDirs(t) { + t.Run(filepath.Base(dir), func(t *testing.T) { + elf := readBytes(t, findSymbols(t, dir)) + + flat, err := BuildFlat(elf) + if err != nil { + t.Fatal(err) + } + if !ValidFlat(flat) { + t.Fatal("BuildFlat produced bytes ValidFlat rejects") + } + + trace := ParseTrace(readFile(t, filepath.Join(dir, "trace.txt"))) + if len(trace.Frames) == 0 { + t.Fatal("parsed 0 frames from trace.txt") + } + var lines []string + for _, fr := range trace.Frames { + got := LookupFlat(flat, fr) + if len(got) == 0 { + t.Errorf("frame did not resolve: %s", fr.Raw) + continue + } + for _, sf := range got { + lines = append(lines, sf.Function+" ("+sf.Location()+")") + } + } + + golden := nonEmptyLines(readFile(t, filepath.Join(dir, "expected.txt"))) + if len(lines) != len(golden) { + t.Fatalf("flat produced %d frames, golden has %d", len(lines), len(golden)) + } + for i := range golden { + if lines[i] != golden[i] { + t.Errorf("flat frame %d: got %q want %q", i, lines[i], golden[i]) + } + } + }) + } +} + +func TestValidFlatRejectsBadData(t *testing.T) { + for _, b := range [][]byte{nil, []byte("no"), []byte("TWDFxxxx"), make([]byte, 64)} { + if ValidFlat(b) { + t.Errorf("expected ValidFlat=false for %d-length input", len(b)) + } + if got := LookupFlat(b, StackFrame{Section: "isolate", Offset: 1}); got != nil { + t.Errorf("expected nil lookup for %d-length bad data, got %v", len(b), got) + } + } +} diff --git a/backend/app/symbolicator/dart/normalize.go b/backend/app/symbolicator/dart/normalize.go new file mode 100644 index 00000000..f83c88be --- /dev/null +++ b/backend/app/symbolicator/dart/normalize.go @@ -0,0 +1,28 @@ +package dart + +import "strings" + +func NormalizeDebugID(debugID string) string { + var b strings.Builder + for _, r := range strings.ToLower(strings.TrimSpace(debugID)) { + if (r >= '0' && r <= '9') || (r >= 'a' && r <= 'f') { + b.WriteRune(r) + } + } + return b.String() +} + +func NormalizeArch(arch string) string { + switch strings.ToLower(strings.TrimSpace(arch)) { + case "x86_64", "x64", "amd64": + return "x64" + case "aarch64", "arm64": + return "arm64" + case "armv7", "arm": + return "arm" + case "ia32", "x86", "i386": + return "ia32" + default: + return strings.ToLower(strings.TrimSpace(arch)) + } +} diff --git a/backend/app/symbolicator/dart/stack_frame.go b/backend/app/symbolicator/dart/stack_frame.go new file mode 100644 index 00000000..2a46097e --- /dev/null +++ b/backend/app/symbolicator/dart/stack_frame.go @@ -0,0 +1,70 @@ +package dart + +import ( + "regexp" + "strconv" + "strings" +) + +type StackFrame struct { + Index int + Section string + Offset uint64 + Raw string +} + +type StackTrace struct { + BuildID string + OS string + Arch string + Frames []StackFrame +} + +var ( + buildIDRe = regexp.MustCompile(`build_id:\s*'([0-9a-fA-F]+)'`) + osArchRe = regexp.MustCompile(`os:\s*(\S+)\s+arch:\s*(\S+)`) + + frameRe = regexp.MustCompile( + `^\s*#(\d+)\s+abs\s+[0-9a-fA-F]+(?:\s+virt\s+[0-9a-fA-F]+)?\s+(_kDart(?:Isolate|Vm)SnapshotInstructions)\+0x([0-9a-fA-F]+)`, + ) +) + +func ParseTrace(text string) StackTrace { + var t StackTrace + for _, line := range strings.Split(text, "\n") { + if t.BuildID == "" { + if m := buildIDRe.FindStringSubmatch(line); m != nil { + t.BuildID = strings.ToLower(m[1]) + } + } + if t.OS == "" { + if m := osArchRe.FindStringSubmatch(line); m != nil { + t.OS, t.Arch = m[1], m[2] + } + } + if m := frameRe.FindStringSubmatch(line); m != nil { + idx, _ := strconv.Atoi(m[1]) + off, _ := strconv.ParseUint(m[3], 16, 64) + section := "isolate" + if strings.Contains(m[2], "Vm") { + section = "vm" + } + t.Frames = append(t.Frames, StackFrame{ + Index: idx, + Section: section, + Offset: off, + Raw: strings.TrimSpace(line), + }) + } + } + return t +} + +func IsNonSymbolic(text string) bool { + for _, line := range strings.Split(text, "\n") { + if frameRe.MatchString(line) { + return true + } + } + return false +} diff --git a/backend/app/symbolicator/otelprocessor/cache.go b/backend/app/symbolicator/otelprocessor/cache.go index 342e9a66..100278c5 100644 --- a/backend/app/symbolicator/otelprocessor/cache.go +++ b/backend/app/symbolicator/otelprocessor/cache.go @@ -1,155 +1,40 @@ package otelprocessor import ( - "container/list" - "context" "crypto/sha256" "encoding/hex" + "errors" "fmt" "os" - "sync" - "time" - "github.com/tracewayapp/traceway/backend/app/symbolicator" + "github.com/tracewayapp/traceway/backend/app/symbolicator/dart" + "github.com/tracewayapp/traceway/backend/app/symbolicator/sourcemap" "github.com/tracewayapp/traceway/backend/app/symbolicator/twcache" ) -const negativeCacheTTL = time.Minute -const negativeCacheMaxKeys = 10000 - -type buildFunc func(ctx context.Context) (*symbolicator.Resolver, error) - -type resolverCache struct { - mu sync.Mutex - entries map[string]*list.Element - order *list.List - maxEntries int - loading map[string]*resolverLoad - negative map[string]negativeEntry - disk *twcache.Cache -} - -type cacheEntry struct { - key string - resolver *symbolicator.Resolver -} - -type resolverLoad struct { - done chan struct{} - resolver *symbolicator.Resolver - err error -} - -type negativeEntry struct { - expiresAt time.Time - err error -} - -func newResolverCache(cfg *Config) (*resolverCache, error) { - c := &resolverCache{ - entries: make(map[string]*list.Element), - order: list.New(), - maxEntries: cfg.SourceMapCacheSize, - loading: make(map[string]*resolverLoad), - negative: make(map[string]negativeEntry), - } - if cfg.CacheDir != "" { - disk, err := newDiskCache(cfg.CacheDir, int64(cfg.CacheMaxMB)<<20, cfg.CacheMaxDiskPct) - if err != nil { - return nil, err - } - c.disk = disk - } - return c, nil +func validArtifact(b []byte) bool { + return sourcemap.ValidTW(b) || dart.ValidFlat(b) } -func (c *resolverCache) get(ctx context.Context, key string, build buildFunc) (*symbolicator.Resolver, error) { - c.mu.Lock() - if el, ok := c.entries[key]; ok { - c.order.MoveToFront(el) - r := el.Value.(*cacheEntry).resolver - c.mu.Unlock() - return r, nil - } - if n, ok := c.negative[key]; ok { - if time.Now().Before(n.expiresAt) { - c.mu.Unlock() - return nil, n.err - } - delete(c.negative, key) - } - if l, ok := c.loading[key]; ok { - c.mu.Unlock() - <-l.done - return l.resolver, l.err - } - l := &resolverLoad{done: make(chan struct{})} - c.loading[key] = l - c.mu.Unlock() - - l.resolver, l.err = c.load(ctx, key, build) - - c.mu.Lock() - delete(c.loading, key) - if l.err == nil && l.resolver != nil { - el := c.order.PushFront(&cacheEntry{key: key, resolver: l.resolver}) - c.entries[key] = el - for c.order.Len() > c.maxEntries { - back := c.order.Back() - evicted := c.order.Remove(back).(*cacheEntry) - delete(c.entries, evicted.key) - } - } else if l.err != nil { - if len(c.negative) >= negativeCacheMaxKeys { - now := time.Now() - for k, n := range c.negative { - if now.After(n.expiresAt) { - delete(c.negative, k) - } - } - } - if len(c.negative) < negativeCacheMaxKeys { - c.negative[key] = negativeEntry{expiresAt: time.Now().Add(negativeCacheTTL), err: l.err} - } - } - c.mu.Unlock() - close(l.done) - return l.resolver, l.err -} +func isObjectNotFound(err error) bool { return errors.Is(err, errObjectNotFound) } -func (c *resolverCache) load(ctx context.Context, key string, build buildFunc) (*symbolicator.Resolver, error) { - if c.disk == nil { - return build(ctx) - } - name := diskNameFor(key) - if r, err := c.disk.Open(name); err == nil { - return r, nil +func newCache(cfg *Config) (*twcache.Cache, error) { + if cfg.CacheDir == "" { + c := twcache.NewMem(cfg.SourceMapCacheSize, 1<<62) + c.Validate = validArtifact + c.NotFound = isObjectNotFound + return c, nil } - r, err := build(ctx) - if err != nil { - return nil, err - } - if cached, werr := c.disk.Write(name, r.MarshalTW()); werr == nil { - return cached, nil - } - return r, nil -} - -func diskNameFor(key string) string { - sum := sha256.Sum256([]byte(key)) - return hex.EncodeToString(sum[:]) + ".tw" -} - -func newDiskCache(dir string, maxBytes int64, maxPct int) (*twcache.Cache, error) { - if err := os.MkdirAll(dir, 0o755); err != nil { + if err := os.MkdirAll(cfg.CacheDir, 0o755); err != nil { return nil, fmt.Errorf("failed to create cache_dir: %w", err) } - if maxPct > 0 { - total, err := twcache.DiskCapacityBytes(dir) + maxBytes := int64(cfg.CacheMaxMB) << 20 + if cfg.CacheMaxDiskPct > 0 { + total, err := twcache.DiskCapacityBytes(cfg.CacheDir) if err != nil { return nil, fmt.Errorf("cache_max_disk_pct requires disk capacity detection: %w", err) } - pctBytes := total / 100 * int64(maxPct) + pctBytes := total / 100 * int64(cfg.CacheMaxDiskPct) if maxBytes <= 0 || pctBytes < maxBytes { maxBytes = pctBytes } @@ -157,9 +42,21 @@ func newDiskCache(dir string, maxBytes int64, maxPct int) (*twcache.Cache, error if maxBytes <= 0 { return nil, fmt.Errorf("the source map cache requires a positive byte cap (cache_max_mb or cache_max_disk_pct)") } - cache, err := twcache.New(dir, maxBytes, nil) + c, err := twcache.NewDisk(cfg.CacheDir, maxBytes, nil) if err != nil { - return nil, fmt.Errorf("failed to initialize cache_dir: %w", err) + return nil, err } - return cache, nil + c.Validate = validArtifact + c.NotFound = isObjectNotFound + return c, nil +} + +func cacheKey(url, buildUUID string) string { + sum := sha256.Sum256([]byte(url + "|" + buildUUID)) + return hex.EncodeToString(sum[:]) + ".tw" +} + +func dartCacheKey(symbolsKey string) string { + sum := sha256.Sum256([]byte(symbolsKey)) + return hex.EncodeToString(sum[:]) + ".tw" } diff --git a/backend/app/symbolicator/otelprocessor/config.go b/backend/app/symbolicator/otelprocessor/config.go index b586083a..b70082c7 100644 --- a/backend/app/symbolicator/otelprocessor/config.go +++ b/backend/app/symbolicator/otelprocessor/config.go @@ -56,6 +56,8 @@ type Config struct { CacheMaxMB int `mapstructure:"cache_max_mb"` CacheMaxDiskPct int `mapstructure:"cache_max_disk_pct"` + DartDefaultArch string `mapstructure:"dart_default_arch"` + LanguageAttributeKey string `mapstructure:"language_attribute_key"` AllowedLanguages []string `mapstructure:"allowed_languages"` diff --git a/backend/app/symbolicator/otelprocessor/dart_test.go b/backend/app/symbolicator/otelprocessor/dart_test.go new file mode 100644 index 00000000..c85c8296 --- /dev/null +++ b/backend/app/symbolicator/otelprocessor/dart_test.go @@ -0,0 +1,97 @@ +package otelprocessor + +import ( + "context" + "os" + "path/filepath" + "strings" + "testing" + + "github.com/tracewayapp/traceway/backend/app/symbolicator/dart" + "go.opentelemetry.io/collector/pdata/pcommon" +) + +const dartSeedDir = "../../../../benchmarks/processor/seeds/dart" + +func TestSymbolicateDartTrace(t *testing.T) { + elf, err := os.ReadFile(filepath.Join(dartSeedDir, "app.debug.elf")) + if err != nil { + t.Skipf("dart seed not available (%v)", err) + } + rawBytes, err := os.ReadFile(filepath.Join(dartSeedDir, "trace.txt")) + if err != nil { + t.Skipf("dart seed trace not available (%v)", err) + } + raw := string(rawBytes) + + tr := dart.ParseTrace(raw) + if tr.BuildID == "" || tr.Arch == "" { + t.Fatalf("seed trace missing build_id/arch: %+v", tr) + } + store := t.TempDir() + symbolsName := dart.NormalizeDebugID(tr.BuildID) + "-" + dart.NormalizeArch(tr.Arch) + ".symbols" + if err := os.WriteFile(filepath.Join(store, symbolsName), elf, 0o644); err != nil { + t.Fatal(err) + } + + p := newTestProcessor(t, func(c *Config) { + c.SourceMapStoreKey = fileStoreKey + c.LocalSourceMaps = LocalSourceMapsConfig{Path: store} + }) + + attrs := pcommon.NewMap() + attrs.PutStr(p.cfg.ExceptionTypeAttributeKey, "Bad state") + attrs.PutStr(p.cfg.ExceptionMessageAttributeKey, "boom from level3") + attrs.PutStr(p.cfg.StackTraceAttributeKey, raw) + + p.processRecord(context.Background(), attrs, pcommon.NewMap()) + + got := strAttr(attrs, p.cfg.StackTraceAttributeKey) + if strings.Contains(got, "_kDartIsolateSnapshotInstructions") { + t.Errorf("expected all frames resolved, output still has the instruction symbol:\n%s", got) + } + if !strings.Contains(got, "crash.dart") { + t.Errorf("expected resolved dart frames (crash.dart), got:\n%s", got) + } + if !strings.Contains(got, "level3 (file:///private/tmp/dartfix/crash.dart:3:3)") { + t.Errorf("expected golden frame 0 'level3 (...crash.dart:3:3)', got:\n%s", got) + } + if v, ok := attrs.Get(p.cfg.SymbolicatorFailureAttributeKey); !ok || v.Bool() { + t.Errorf("expected symbolicator.failed=false, got %v", v) + } + + attrs2 := pcommon.NewMap() + attrs2.PutStr(p.cfg.StackTraceAttributeKey, raw) + p.processRecord(context.Background(), attrs2, pcommon.NewMap()) + if got2 := strAttr(attrs2, p.cfg.StackTraceAttributeKey); strings.Contains(got2, "_kDartIsolateSnapshotInstructions") { + t.Errorf("warm-cache resolve regressed:\n%s", got2) + } +} + +func TestSymbolicateDartTraceMissingSymbols(t *testing.T) { + rawBytes, err := os.ReadFile(filepath.Join(dartSeedDir, "trace.txt")) + if err != nil { + t.Skipf("dart seed trace not available (%v)", err) + } + raw := string(rawBytes) + + p := newTestProcessor(t, func(c *Config) { + c.SourceMapStoreKey = fileStoreKey + c.LocalSourceMaps = LocalSourceMapsConfig{Path: t.TempDir()} + }) + + attrs := pcommon.NewMap() + attrs.PutStr(p.cfg.StackTraceAttributeKey, raw) + p.processRecord(context.Background(), attrs, pcommon.NewMap()) + + got := strAttr(attrs, p.cfg.StackTraceAttributeKey) + if !strings.Contains(got, "_kDartIsolateSnapshotInstructions+") { + t.Errorf("expected stable unresolved offset frames, got:\n%s", got) + } + if strings.Contains(got, "build_id:") || strings.Contains(got, "abs ") { + t.Errorf("volatile header leaked into output:\n%s", got) + } + if v, ok := attrs.Get(p.cfg.SymbolicatorFailureAttributeKey); !ok || !v.Bool() { + t.Errorf("expected symbolicator.failed=true for missing symbols") + } +} diff --git a/backend/app/symbolicator/otelprocessor/factory.go b/backend/app/symbolicator/otelprocessor/factory.go index 100ec040..6be13b8e 100644 --- a/backend/app/symbolicator/otelprocessor/factory.go +++ b/backend/app/symbolicator/otelprocessor/factory.go @@ -9,7 +9,7 @@ import ( "go.opentelemetry.io/collector/processor" "go.opentelemetry.io/collector/processor/processorhelper" - "github.com/tracewayapp/traceway/backend/app/symbolicator/scopes" + "github.com/tracewayapp/traceway/backend/app/symbolicator/sourcemap/scopes" ) const processorVersion = "0.1.0" @@ -72,7 +72,7 @@ func newSymbolicator(cfg *Config, set processor.Settings) (*symbolicatorProcesso if err != nil { return nil, err } - cache, err := newResolverCache(cfg) + cache, err := newCache(cfg) if err != nil { return nil, err } diff --git a/backend/app/symbolicator/otelprocessor/processor_test.go b/backend/app/symbolicator/otelprocessor/processor_test.go index 135fc5fa..0301fd38 100644 --- a/backend/app/symbolicator/otelprocessor/processor_test.go +++ b/backend/app/symbolicator/otelprocessor/processor_test.go @@ -53,7 +53,7 @@ func newTestProcessor(t *testing.T, mutate func(*Config)) *symbolicatorProcessor if err != nil { t.Fatal(err) } - cache, err := newResolverCache(cfg) + cache, err := newCache(cfg) if err != nil { t.Fatal(err) } diff --git a/backend/app/symbolicator/otelprocessor/store.go b/backend/app/symbolicator/otelprocessor/store.go index e5de7937..b9710045 100644 --- a/backend/app/symbolicator/otelprocessor/store.go +++ b/backend/app/symbolicator/otelprocessor/store.go @@ -17,6 +17,8 @@ import ( awsconfig "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/aws-sdk-go-v2/service/s3/types" + + "github.com/tracewayapp/traceway/backend/app/symbolicator/dart" ) const ( @@ -104,6 +106,20 @@ func (a *artifactStore) getSourceAndMap(ctx context.Context, frameURL, buildUUID return source, sourceMap, nil } +func (a *artifactStore) dartSymbolsKey(buildID, arch string) string { + base := dart.NormalizeDebugID(buildID) + "-" + dart.NormalizeArch(arch) + ".symbols" + return a.key("", base) +} + +func (a *artifactStore) getDartSymbols(ctx context.Context, buildID, arch string) ([]byte, error) { + key := a.dartSymbolsKey(buildID, arch) + data, err := a.store.fetch(ctx, key) + if err != nil { + return nil, fmt.Errorf("failed to find dart symbols %q: %w", key, err) + } + return data, nil +} + func (a *artifactStore) key(buildUUID, base string) string { parts := make([]string, 0, 3) if a.prefix != "" { diff --git a/backend/app/symbolicator/otelprocessor/symbolicate.go b/backend/app/symbolicator/otelprocessor/symbolicate.go index 63a2b301..39bb7298 100644 --- a/backend/app/symbolicator/otelprocessor/symbolicate.go +++ b/backend/app/symbolicator/otelprocessor/symbolicate.go @@ -7,8 +7,10 @@ import ( "math" "strings" - "github.com/tracewayapp/traceway/backend/app/symbolicator" - "github.com/tracewayapp/traceway/backend/app/symbolicator/jsstack" + "github.com/tracewayapp/traceway/backend/app/symbolicator/dart" + "github.com/tracewayapp/traceway/backend/app/symbolicator/sourcemap" + "github.com/tracewayapp/traceway/backend/app/symbolicator/sourcemap/jsstack" + "github.com/tracewayapp/traceway/backend/app/symbolicator/twcache" "go.opentelemetry.io/collector/pdata/pcommon" "go.uber.org/zap" ) @@ -16,15 +18,17 @@ import ( const ( parsingMethodStructured = "structured_stacktrace_attributes" parsingMethodParsed = "processor_parsed" + maxDartFrames = 50 ) var errMismatchedLength = errors.New("mismatched stacktrace attribute lengths") var errUnparseableStackTrace = errors.New("unable to parse stack trace") +var errMissingDartBuild = errors.New("dart trace missing build_id or arch") type symbolicatorProcessor struct { cfg *Config store *artifactStore - cache *resolverCache + cache *twcache.Cache logger *zap.Logger } @@ -54,6 +58,11 @@ func (p *symbolicatorProcessor) processRecord(ctx context.Context, attrs, resour } originalStack := stackVal.Str() + if dart.IsNonSymbolic(originalStack) { + p.symbolicateDartTrace(ctx, attrs, originalStack) + return + } + buildUUID := "" if v, ok := resource.Get(p.cfg.BuildUUIDAttributeKey); ok { buildUUID = v.Str() @@ -131,10 +140,100 @@ func (p *symbolicatorProcessor) processRecord(ctx context.Context, attrs, resour } attrs.PutStr(p.cfg.SymbolicatorErrorAttributeKey, err.Error()) } + p.putProcessorMeta(attrs) +} + +func (p *symbolicatorProcessor) putProcessorMeta(attrs pcommon.Map) { attrs.PutStr("traceway.processor_type", componentType.String()) attrs.PutStr("traceway.processor_version", processorVersion) } +func (p *symbolicatorProcessor) symbolicateDartTrace(ctx context.Context, attrs pcommon.Map, rawStack string) { + attrs.PutStr(p.cfg.SymbolicatorParsingMethodAttributeKey, parsingMethodParsed) + if p.cfg.PreserveStackTrace { + attrs.PutStr(p.cfg.OriginalStackTraceAttributeKey, rawStack) + } + + trace := dart.ParseTrace(rawStack) + arch := trace.Arch + if arch == "" { + arch = p.cfg.DartDefaultArch + } + + fail := func(err error) { + attrs.PutStr(p.cfg.StackTraceAttributeKey, p.renderDartTrace(attrs, trace, nil)) + attrs.PutBool(p.cfg.SymbolicatorFailureAttributeKey, true) + attrs.PutStr(p.cfg.SymbolicatorErrorAttributeKey, err.Error()) + p.putProcessorMeta(attrs) + } + + if len(trace.Frames) == 0 { + fail(errUnparseableStackTrace) + return + } + if trace.BuildID == "" || arch == "" { + fail(errMissingDartBuild) + return + } + + key := dartCacheKey(p.store.dartSymbolsKey(trace.BuildID, arch)) + if p.cache.IsNegative(key) { + fail(fmt.Errorf("failed to find dart symbols for build %s/%s", trace.BuildID, arch)) + return + } + + data, done, err := p.cache.Get(ctx, key, func(ctx context.Context) ([]byte, error) { + fetchCtx, cancel := context.WithTimeout(ctx, p.cfg.Timeout) + defer cancel() + elf, err := p.store.getDartSymbols(fetchCtx, trace.BuildID, arch) + if err != nil { + return nil, err + } + return dart.BuildFlat(elf) + }) + if err != nil { + fail(err) + return + } + defer done() + + attrs.PutStr(p.cfg.StackTraceAttributeKey, p.renderDartTrace(attrs, trace, data)) + attrs.PutBool(p.cfg.SymbolicatorFailureAttributeKey, false) + p.putProcessorMeta(attrs) +} + +func (p *symbolicatorProcessor) renderDartTrace(attrs pcommon.Map, trace dart.StackTrace, data []byte) string { + var b strings.Builder + excType := strAttr(attrs, p.cfg.ExceptionTypeAttributeKey) + excMessage := strAttr(attrs, p.cfg.ExceptionMessageAttributeKey) + if excType != "" && excMessage != "" { + fmt.Fprintf(&b, "%s: %s\n", excType, excMessage) + } + n := 0 + for _, f := range trace.Frames { + if n >= maxDartFrames { + break + } + var resolved []dart.SymFrame + if data != nil { + resolved = dart.LookupFlat(data, f) + } + if len(resolved) == 0 { + fmt.Fprintf(&b, "#%d %s+%x\n", n, dart.InstructionSymbol(f.Section), f.Offset) + n++ + continue + } + for _, sf := range resolved { + if n >= maxDartFrames { + break + } + fmt.Fprintf(&b, "#%d %s (%s)\n", n, sf.Function, sf.Location()) + n++ + } + } + return strings.TrimRight(b.String(), "\n") +} + func (p *symbolicatorProcessor) languageAllowed(attrs, resource pcommon.Map) bool { if len(p.cfg.AllowedLanguages) == 0 { return true @@ -205,20 +304,21 @@ func (p *symbolicatorProcessor) symbolicateFrame(ctx context.Context, f stackFra return frameResult{err: fmt.Errorf("line/column out of range: %d:%d", f.line, f.col)} } - resolver, err := p.cache.get(ctx, f.url+"|"+buildUUID, func(ctx context.Context) (*symbolicator.Resolver, error) { + data, done, err := p.cache.Get(ctx, cacheKey(f.url, buildUUID), func(ctx context.Context) ([]byte, error) { fetchCtx, cancel := context.WithTimeout(ctx, p.cfg.Timeout) defer cancel() source, sourceMap, err := p.store.getSourceAndMap(fetchCtx, f.url, buildUUID) if err != nil { return nil, err } - return symbolicator.NewResolver(sourceMap, source) + return sourcemap.BuildTW(sourceMap, source) }) if err != nil { return frameResult{err: err} } + defer done() - frame, ok := resolver.Lookup(uint32(f.line-1), uint32(f.col-1)) + frame, ok := sourcemap.LookupTW(data, uint32(f.line-1), uint32(f.col-1)) if !ok { return frameResult{err: fmt.Errorf("no mapping at %d:%d", f.line, f.col)} } diff --git a/backend/app/symbolicator/jsstack/canonicalize.go b/backend/app/symbolicator/sourcemap/jsstack/canonicalize.go similarity index 100% rename from backend/app/symbolicator/jsstack/canonicalize.go rename to backend/app/symbolicator/sourcemap/jsstack/canonicalize.go diff --git a/backend/app/symbolicator/jsstack/canonicalize_test.go b/backend/app/symbolicator/sourcemap/jsstack/canonicalize_test.go similarity index 100% rename from backend/app/symbolicator/jsstack/canonicalize_test.go rename to backend/app/symbolicator/sourcemap/jsstack/canonicalize_test.go diff --git a/backend/app/symbolicator/jsstack/frames.go b/backend/app/symbolicator/sourcemap/jsstack/frames.go similarity index 100% rename from backend/app/symbolicator/jsstack/frames.go rename to backend/app/symbolicator/sourcemap/jsstack/frames.go diff --git a/backend/app/symbolicator/oxc_parity_test.go b/backend/app/symbolicator/sourcemap/oxc_parity_test.go similarity index 70% rename from backend/app/symbolicator/oxc_parity_test.go rename to backend/app/symbolicator/sourcemap/oxc_parity_test.go index da35e4d0..6029dc6f 100644 --- a/backend/app/symbolicator/oxc_parity_test.go +++ b/backend/app/symbolicator/sourcemap/oxc_parity_test.go @@ -1,12 +1,11 @@ //go:build oxc && cgo -package symbolicator +package sourcemap import ( "testing" - "github.com/tracewayapp/traceway/backend/app/symbolicator/scopes" - "github.com/tracewayapp/traceway/backend/app/symbolicator/sourcemap" + "github.com/tracewayapp/traceway/backend/app/symbolicator/sourcemap/scopes" ) func TestOxcGojaLookupEquivalence(t *testing.T) { @@ -24,28 +23,28 @@ func TestOxcGojaLookupEquivalence(t *testing.T) { if err := scopes.SetParser("goja"); err != nil { t.Fatal(err) } - gojaResolver, err := NewResolver(mapBytes, bundle) + gojaTW, err := BuildTW(mapBytes, bundle) if err != nil { - t.Fatalf("NewResolver(goja): %v", err) + t.Fatalf("BuildTW(goja): %v", err) } if err := scopes.SetParser("oxc"); err != nil { t.Fatal(err) } - oxcResolver, err := NewResolver(mapBytes, bundle) + oxcTW, err := BuildTW(mapBytes, bundle) if err != nil { - t.Fatalf("NewResolver(oxc): %v", err) + t.Fatalf("BuildTW(oxc): %v", err) } - parsed, err := sourcemap.Parse(mapBytes) + parsed, err := Parse(mapBytes) if err != nil { t.Fatalf("parsing source map: %v", err) } mismatches := 0 for _, token := range parsed.Tokens { - gFrame, gOk := gojaResolver.Lookup(token.GenLine, token.GenCol) - oFrame, oOk := oxcResolver.Lookup(token.GenLine, token.GenCol) + gFrame, gOk := LookupTW(gojaTW, token.GenLine, token.GenCol) + oFrame, oOk := LookupTW(oxcTW, token.GenLine, token.GenCol) if gOk != oOk || gFrame != oFrame { mismatches++ if mismatches <= 10 { diff --git a/backend/app/symbolicator/parity_test.go b/backend/app/symbolicator/sourcemap/parity_test.go similarity index 94% rename from backend/app/symbolicator/parity_test.go rename to backend/app/symbolicator/sourcemap/parity_test.go index 10e1af9a..4130dfda 100644 --- a/backend/app/symbolicator/parity_test.go +++ b/backend/app/symbolicator/sourcemap/parity_test.go @@ -1,22 +1,22 @@ -package symbolicator +package sourcemap import ( "os" "path/filepath" "testing" - "github.com/tracewayapp/traceway/backend/app/symbolicator/scopes" + "github.com/tracewayapp/traceway/backend/app/symbolicator/sourcemap/scopes" ) func fixture(t testing.TB, parts ...string) string { t.Helper() - root, err := filepath.Abs(filepath.Join("..", "..", "..", "..", "symbolic")) + root, err := filepath.Abs(filepath.Join("..", "..", "..", "..", "..", "symbolic")) if err == nil { if _, statErr := os.Stat(root); statErr == nil { return filepath.Join(append([]string{root, "symbolic-testutils", "fixtures"}, parts...)...) } } - return filepath.Join(append([]string{"..", "services", "testdata"}, parts...)...) + return filepath.Join(append([]string{"..", "..", "services", "testdata"}, parts...)...) } func mustRead(t testing.TB, path string) []byte { @@ -140,13 +140,13 @@ func runParityCases(t *testing.T) { mapBytes := mustRead(t, fixture(t, tc.mapPath...)) bundle := readIfSet(t, tc.minifiedPath) - r, err := NewResolver(mapBytes, bundle) + tw, err := BuildTW(mapBytes, bundle) if err != nil { - t.Fatalf("NewResolver: %v", err) + t.Fatalf("BuildTW: %v", err) } for _, exp := range tc.expectations { - frame, ok := r.Lookup(exp.line, exp.col) + frame, ok := LookupTW(tw, exp.line, exp.col) if exp.wantNone { if ok { diff --git a/backend/app/symbolicator/resolver_bench_test.go b/backend/app/symbolicator/sourcemap/resolver_bench_test.go similarity index 71% rename from backend/app/symbolicator/resolver_bench_test.go rename to backend/app/symbolicator/sourcemap/resolver_bench_test.go index aa4b2b6d..690d9de0 100644 --- a/backend/app/symbolicator/resolver_bench_test.go +++ b/backend/app/symbolicator/sourcemap/resolver_bench_test.go @@ -1,12 +1,12 @@ -package symbolicator +package sourcemap import ( "testing" - "github.com/tracewayapp/traceway/backend/app/symbolicator/scopes" + "github.com/tracewayapp/traceway/backend/app/symbolicator/sourcemap/scopes" ) -func BenchmarkNewResolver(b *testing.B) { +func BenchmarkBuildTW(b *testing.B) { mapBytes := mustRead(b, fixture(b, "sourcemapcache", "preact.module.js.map")) bundle := mustRead(b, fixture(b, "sourcemapcache", "preact.module.js")) @@ -21,7 +21,7 @@ func BenchmarkNewResolver(b *testing.B) { b.ReportAllocs() b.ResetTimer() for b.Loop() { - if _, err := NewResolver(mapBytes, bundle); err != nil { + if _, err := BuildTW(mapBytes, bundle); err != nil { b.Fatal(err) } } @@ -29,21 +29,20 @@ func BenchmarkNewResolver(b *testing.B) { } } -func BenchmarkOpenTW(b *testing.B) { +func BenchmarkLookupTW(b *testing.B) { mapBytes := mustRead(b, fixture(b, "sourcemapcache", "preact.module.js.map")) bundle := mustRead(b, fixture(b, "sourcemapcache", "preact.module.js")) - resolver, err := NewResolver(mapBytes, bundle) + tw, err := BuildTW(mapBytes, bundle) if err != nil { b.Fatal(err) } - tw := resolver.MarshalTW() b.SetBytes(int64(len(tw))) b.ReportAllocs() b.ResetTimer() for b.Loop() { - if _, err := OpenTW(tw); err != nil { - b.Fatal(err) + if _, ok := LookupTW(tw, 0, 132); !ok { + b.Fatal("expected a mapping") } } } diff --git a/backend/app/symbolicator/scopes/bench_test.go b/backend/app/symbolicator/sourcemap/scopes/bench_test.go similarity index 100% rename from backend/app/symbolicator/scopes/bench_test.go rename to backend/app/symbolicator/sourcemap/scopes/bench_test.go diff --git a/backend/app/symbolicator/scopes/goja.go b/backend/app/symbolicator/sourcemap/scopes/goja.go similarity index 100% rename from backend/app/symbolicator/scopes/goja.go rename to backend/app/symbolicator/sourcemap/scopes/goja.go diff --git a/backend/app/symbolicator/scopes/oxc-shim/Cargo.lock b/backend/app/symbolicator/sourcemap/scopes/oxc-shim/Cargo.lock similarity index 100% rename from backend/app/symbolicator/scopes/oxc-shim/Cargo.lock rename to backend/app/symbolicator/sourcemap/scopes/oxc-shim/Cargo.lock diff --git a/backend/app/symbolicator/scopes/oxc-shim/Cargo.toml b/backend/app/symbolicator/sourcemap/scopes/oxc-shim/Cargo.toml similarity index 100% rename from backend/app/symbolicator/scopes/oxc-shim/Cargo.toml rename to backend/app/symbolicator/sourcemap/scopes/oxc-shim/Cargo.toml diff --git a/backend/app/symbolicator/scopes/oxc-shim/include/oxc_shim.h b/backend/app/symbolicator/sourcemap/scopes/oxc-shim/include/oxc_shim.h similarity index 100% rename from backend/app/symbolicator/scopes/oxc-shim/include/oxc_shim.h rename to backend/app/symbolicator/sourcemap/scopes/oxc-shim/include/oxc_shim.h diff --git a/backend/app/symbolicator/scopes/oxc-shim/src/lib.rs b/backend/app/symbolicator/sourcemap/scopes/oxc-shim/src/lib.rs similarity index 100% rename from backend/app/symbolicator/scopes/oxc-shim/src/lib.rs rename to backend/app/symbolicator/sourcemap/scopes/oxc-shim/src/lib.rs diff --git a/backend/app/symbolicator/scopes/oxc.go b/backend/app/symbolicator/sourcemap/scopes/oxc.go similarity index 100% rename from backend/app/symbolicator/scopes/oxc.go rename to backend/app/symbolicator/sourcemap/scopes/oxc.go diff --git a/backend/app/symbolicator/scopes/registry.go b/backend/app/symbolicator/sourcemap/scopes/registry.go similarity index 100% rename from backend/app/symbolicator/scopes/registry.go rename to backend/app/symbolicator/sourcemap/scopes/registry.go diff --git a/backend/app/symbolicator/scopes/scopes.go b/backend/app/symbolicator/sourcemap/scopes/scopes.go similarity index 100% rename from backend/app/symbolicator/scopes/scopes.go rename to backend/app/symbolicator/sourcemap/scopes/scopes.go diff --git a/backend/app/symbolicator/sourcemap/tw.go b/backend/app/symbolicator/sourcemap/tw.go new file mode 100644 index 00000000..0261664e --- /dev/null +++ b/backend/app/symbolicator/sourcemap/tw.go @@ -0,0 +1,180 @@ +package sourcemap + +import ( + "encoding/binary" + "sort" +) + +const twVersion = 1 +const twHeaderSize = 24 +const twTokenSize = 24 + +var twMagic = [4]byte{'T', 'W', 'S', 'M'} + +func (b *builder) marshal() []byte { + fileOffsets, fileBlob := encodeStringTable(b.files) + fnOffsets, fnBlob := encodeStringTable(b.fns) + + size := twHeaderSize + + len(b.tokens)*twTokenSize + + len(fileOffsets)*4 + len(fileBlob) + + len(fnOffsets)*4 + len(fnBlob) + + out := make([]byte, 0, size) + out = append(out, twMagic[:]...) + out = binary.LittleEndian.AppendUint32(out, twVersion) + out = binary.LittleEndian.AppendUint32(out, uint32(len(b.tokens))) + out = binary.LittleEndian.AppendUint32(out, uint32(len(b.files))) + out = binary.LittleEndian.AppendUint32(out, uint32(len(b.fns))) + out = binary.LittleEndian.AppendUint32(out, 0) + + for i := range b.tokens { + t := &b.tokens[i] + out = binary.LittleEndian.AppendUint32(out, t.genLine) + out = binary.LittleEndian.AppendUint32(out, t.genCol) + out = binary.LittleEndian.AppendUint32(out, t.srcLine) + out = binary.LittleEndian.AppendUint32(out, t.srcCol) + out = binary.LittleEndian.AppendUint32(out, uint32(t.fileIdx)) + out = binary.LittleEndian.AppendUint32(out, uint32(t.fnIdx)) + } + + for _, off := range fileOffsets { + out = binary.LittleEndian.AppendUint32(out, off) + } + out = append(out, fileBlob...) + for _, off := range fnOffsets { + out = binary.LittleEndian.AppendUint32(out, off) + } + out = append(out, fnBlob...) + return out +} + +func encodeStringTable(strs []string) ([]uint32, []byte) { + offsets := make([]uint32, len(strs)+1) + var blob []byte + for i, s := range strs { + offsets[i] = uint32(len(blob)) + blob = append(blob, s...) + } + offsets[len(strs)] = uint32(len(blob)) + return offsets, blob +} + +type twLayout struct { + tokenCount int + fileTableOff int + filesCount int + fnTableOff int + fnsCount int +} + +func readTWLayout(data []byte) (twLayout, bool) { + var l twLayout + if len(data) < twHeaderSize { + return l, false + } + if [4]byte(data[:4]) != twMagic { + return l, false + } + le := binary.LittleEndian + if le.Uint32(data[4:]) != twVersion { + return l, false + } + tokenCount := int64(le.Uint32(data[8:])) + l.filesCount = int(le.Uint32(data[12:])) + l.fnsCount = int(le.Uint32(data[16:])) + n := int64(len(data)) + + fileTableOff := int64(twHeaderSize) + tokenCount*twTokenSize + if tokenCount < 0 || l.filesCount < 0 || l.fnsCount < 0 || fileTableOff < int64(twHeaderSize) { + return l, false + } + fileBlobOff := fileTableOff + int64(l.filesCount+1)*4 + if fileBlobOff > n { + return l, false + } + fileBlobLen := int64(le.Uint32(data[fileTableOff+int64(l.filesCount)*4:])) + fnTableOff := fileBlobOff + fileBlobLen + fnBlobOff := fnTableOff + int64(l.fnsCount+1)*4 + if fnTableOff < fileBlobOff || fnBlobOff > n { + return l, false + } + fnBlobLen := int64(le.Uint32(data[fnTableOff+int64(l.fnsCount)*4:])) + if fnBlobOff+fnBlobLen > n { + return l, false + } + + l.tokenCount = int(tokenCount) + l.fileTableOff = int(fileTableOff) + l.fnTableOff = int(fnTableOff) + return l, true +} + +func ValidTW(data []byte) bool { + _, ok := readTWLayout(data) + return ok +} + +func LookupTW(data []byte, genLine, genCol uint32) (StackTraceFrame, bool) { + l, ok := readTWLayout(data) + if !ok { + return StackTraceFrame{}, false + } + le := binary.LittleEndian + tokAt := func(i int) (gl, gc uint32) { + rec := data[twHeaderSize+i*twTokenSize:] + return le.Uint32(rec), le.Uint32(rec[4:]) + } + + idx := sort.Search(l.tokenCount, func(i int) bool { + gl, gc := tokAt(i) + return gl > genLine || (gl == genLine && gc > genCol) + }) + if idx == 0 { + return StackTraceFrame{}, false + } + idx-- + for idx > 0 { + gl, gc := tokAt(idx) + pl, pc := tokAt(idx - 1) + if pl != gl || pc != gc { + break + } + idx-- + } + + rec := data[twHeaderSize+idx*twTokenSize:] + tGenLine := le.Uint32(rec) + srcLine := le.Uint32(rec[8:]) + srcCol := le.Uint32(rec[12:]) + fileIdx := int32(le.Uint32(rec[16:])) + fnIdx := int32(le.Uint32(rec[20:])) + if tGenLine < genLine || fileIdx < 0 { + return StackTraceFrame{}, false + } + file, fok := stringAt(data, l.fileTableOff, l.filesCount, fileIdx) + if !fok { + return StackTraceFrame{}, false + } + frame := StackTraceFrame{File: file, Line: srcLine, Col: srcCol} + if fnIdx >= 0 { + if fn, ok := stringAt(data, l.fnTableOff, l.fnsCount, fnIdx); ok { + frame.Fn = fn + } + } + return frame, true +} + +func stringAt(data []byte, tableOff, count int, idx int32) (string, bool) { + if idx < 0 || int(idx) >= count { + return "", false + } + le := binary.LittleEndian + blobStart := tableOff + (count+1)*4 + o0 := int(le.Uint32(data[tableOff+int(idx)*4:])) + o1 := int(le.Uint32(data[tableOff+(int(idx)+1)*4:])) + if o0 > o1 || blobStart+o1 > len(data) { + return "", false + } + return string(data[blobStart+o0 : blobStart+o1]), true +} diff --git a/backend/app/symbolicator/symbolicator.go b/backend/app/symbolicator/sourcemap/tw_build.go similarity index 50% rename from backend/app/symbolicator/symbolicator.go rename to backend/app/symbolicator/sourcemap/tw_build.go index bcf4fe33..da76be6b 100644 --- a/backend/app/symbolicator/symbolicator.go +++ b/backend/app/symbolicator/sourcemap/tw_build.go @@ -1,11 +1,7 @@ -package symbolicator +package sourcemap import ( - "runtime" - "sort" - - "github.com/tracewayapp/traceway/backend/app/symbolicator/scopes" - "github.com/tracewayapp/traceway/backend/app/symbolicator/sourcemap" + "github.com/tracewayapp/traceway/backend/app/symbolicator/sourcemap/scopes" ) type StackTraceFrame struct { @@ -22,14 +18,22 @@ type resolvedToken struct { fnIdx int32 } -type Resolver struct { +type builder struct { tokens []resolvedToken files []string fns []string } -func NewResolver(sourceMap, bundle []byte) (*Resolver, error) { - m, err := sourcemap.Parse(sourceMap) +func BuildTW(sourceMap, bundle []byte) ([]byte, error) { + b, err := newBuilder(sourceMap, bundle) + if err != nil { + return nil, err + } + return b.marshal(), nil +} + +func newBuilder(sourceMap, bundle []byte) (*builder, error) { + m, err := Parse(sourceMap) if err != nil { return nil, err } @@ -52,8 +56,6 @@ func NewResolver(sourceMap, bundle []byte) (*Resolver, error) { for i := range m.Tokens { t := m.Tokens[i] - // Tokens are sorted by generated position, so the floor transition - // pointer only moves forward across the whole map (linear merge). for ti+1 < len(transitions) { next := &transitions[ti+1] if t.GenLine < next.Line || (t.GenLine == next.Line && t.GenCol < next.Col) { @@ -64,17 +66,16 @@ func NewResolver(sourceMap, bundle []byte) (*Resolver, error) { } rt := resolvedToken{genLine: t.GenLine, genCol: t.GenCol, fileIdx: -1, fnIdx: -1} - if t.SrcID != sourcemap.NoID && int(t.SrcID) < len(m.Sources) { + if t.SrcID != NoID && int(t.SrcID) < len(m.Sources) { rt.fileIdx = files.intern(m.Sources[t.SrcID]) rt.srcLine = t.SrcLine + 1 rt.srcCol = t.SrcCol + 1 if ti >= 0 && transitions[ti].Named { - // Resolve the enclosing function's name once per transition, - // not once per token. + if !curResolved { curFnIdx = -1 tr := transitions[ti] - if nt := m.FloorToken(tr.NameLine, tr.NameCol); nt != nil && nt.NameID != sourcemap.NoID { + if nt := m.FloorToken(tr.NameLine, tr.NameCol); nt != nil && nt.NameID != NoID { curFnIdx = fns.intern(m.Names[nt.NameID]) } curResolved = true @@ -85,46 +86,7 @@ func NewResolver(sourceMap, bundle []byte) (*Resolver, error) { tokens[i] = rt } - return &Resolver{tokens: tokens, files: files.list, fns: fns.list}, nil -} - -func (r *Resolver) Lookup(genLine, genCol uint32) (StackTraceFrame, bool) { - defer runtime.KeepAlive(r) - toks := r.tokens - idx := sort.Search(len(toks), func(i int) bool { - return toks[i].genLine > genLine || (toks[i].genLine == genLine && toks[i].genCol > genCol) - }) - if idx == 0 { - return StackTraceFrame{}, false - } - idx-- - for idx > 0 && toks[idx-1].genLine == toks[idx].genLine && toks[idx-1].genCol == toks[idx].genCol { - idx-- - } - - t := toks[idx] - if t.genLine < genLine || t.fileIdx < 0 { - return StackTraceFrame{}, false - } - frame := StackTraceFrame{File: r.files[t.fileIdx], Line: t.srcLine, Col: t.srcCol} - if t.fnIdx >= 0 { - frame.Fn = r.fns[t.fnIdx] - } - return frame, true -} - -// ApproxSize estimates the resolver's retained heap footprint, for cache -// accounting. The flat token table dominates; the bundle and source map are -// not retained. -func (r *Resolver) ApproxSize() int64 { - n := int64(len(r.tokens)) * 24 - for _, s := range r.files { - n += int64(len(s)) + 16 - } - for _, s := range r.fns { - n += int64(len(s)) + 16 - } - return n + return &builder{tokens: tokens, files: files.list, fns: fns.list}, nil } type interner struct { diff --git a/backend/app/symbolicator/sourcemap/tw_test.go b/backend/app/symbolicator/sourcemap/tw_test.go new file mode 100644 index 00000000..d80cc59e --- /dev/null +++ b/backend/app/symbolicator/sourcemap/tw_test.go @@ -0,0 +1,117 @@ +package sourcemap + +import ( + "encoding/binary" + "testing" +) + +const minimalMap = `{"version":3,"sources":["a.js"],"names":["foo"],"mappings":"AAAAA"}` + +func TestLookupTWRoundTrip(t *testing.T) { + tw, err := BuildTW([]byte(minimalMap), nil) + if err != nil { + t.Fatalf("BuildTW: %v", err) + } + if !ValidTW(tw) { + t.Fatal("BuildTW produced bytes ValidTW rejects") + } + frame, ok := LookupTW(tw, 0, 0) + if !ok { + t.Fatal("expected a mapping at (0,0)") + } + if frame.File != "a.js" || frame.Line != 1 || frame.Col != 1 { + t.Errorf("got %+v, want a.js:1:1", frame) + } +} + +func TestLookupTWEmpty(t *testing.T) { + tw, err := BuildTW([]byte(`{"version":3,"sources":[],"names":[],"mappings":""}`), nil) + if err != nil { + t.Fatalf("BuildTW: %v", err) + } + if !ValidTW(tw) { + t.Fatal("empty map should still be a valid artifact") + } + if _, ok := LookupTW(tw, 0, 0); ok { + t.Error("empty resolver should not resolve anything") + } +} + +func TestValidTWRejectsInvalid(t *testing.T) { + cases := map[string][]byte{ + "empty": nil, + "short": []byte("TWSM"), + "bad_magic": append([]byte("XXXX"), make([]byte, 20)...), + "bad_version": append([]byte("TWSM\xff\x00\x00\x00"), make([]byte, 16)...), + "token_overrun": append([]byte("TWSM\x01\x00\x00\x00\xff\xff\xff\x00"), make([]byte, 12)...), + } + for name, data := range cases { + if ValidTW(data) { + t.Errorf("%s: ValidTW should be false", name) + } + if _, ok := LookupTW(data, 0, 0); ok { + t.Errorf("%s: LookupTW should not resolve invalid data", name) + } + } +} + +func buildTW(tokens [][6]uint32, files, fns []string) []byte { + le := binary.LittleEndian + out := append([]byte{}, twMagic[:]...) + out = le.AppendUint32(out, twVersion) + out = le.AppendUint32(out, uint32(len(tokens))) + out = le.AppendUint32(out, uint32(len(files))) + out = le.AppendUint32(out, uint32(len(fns))) + out = le.AppendUint32(out, 0) + for _, tok := range tokens { + for _, v := range tok { + out = le.AppendUint32(out, v) + } + } + out = appendStringTableBytes(out, files) + out = appendStringTableBytes(out, fns) + return out +} + +func appendStringTableBytes(out []byte, ss []string) []byte { + offsets, blob := encodeStringTable(ss) + for _, o := range offsets { + out = binary.LittleEndian.AppendUint32(out, o) + } + return append(out, blob...) +} + +func TestLookupTWOutOfRangeIndexSafe(t *testing.T) { + const noID = uint32(0xFFFFFFFF) + cases := map[string][6]uint32{ + "fileIdx_too_big": {0, 0, 1, 1, 5, 0}, + "fnIdx_too_big": {0, 0, 1, 1, 0, 7}, + } + for name, tok := range cases { + t.Run(name, func(t *testing.T) { + data := buildTW([][6]uint32{tok}, []string{"a.js"}, []string{"fn"}) + frame, ok := LookupTW(data, 0, 0) + if name == "fileIdx_too_big" && ok { + t.Errorf("out-of-range fileIdx should not resolve, got %+v", frame) + } + + if name == "fnIdx_too_big" { + if !ok || frame.File != "a.js" { + t.Errorf("expected file to resolve, got %+v ok=%v", frame, ok) + } + if frame.Fn != "" { + t.Errorf("out-of-range fnIdx should drop the name, got %q", frame.Fn) + } + } + _ = noID + }) + } +} + +func TestLookupTWNegativeIndex(t *testing.T) { + const noID = uint32(0xFFFFFFFF) + data := buildTW([][6]uint32{{0, 0, 1, 1, noID, noID}}, []string{"a.js"}, []string{"fn"}) + if _, ok := LookupTW(data, 0, 0); ok { + t.Fatal("token with fileIdx=-1 should not resolve") + } +} diff --git a/backend/app/symbolicator/tw.go b/backend/app/symbolicator/tw.go deleted file mode 100644 index 4ccf372b..00000000 --- a/backend/app/symbolicator/tw.go +++ /dev/null @@ -1,161 +0,0 @@ -package symbolicator - -import ( - "encoding/binary" - "errors" - "runtime" - "unsafe" -) - -const twVersion = 1 -const twHeaderSize = 24 -const twTokenSize = 24 - -var twMagic = [4]byte{'T', 'W', 'S', 'M'} - -var ErrInvalidTW = errors.New("symbolicator: invalid tw data") - -var hostLittleEndian = func() bool { - var x uint16 = 1 - return *(*byte)(unsafe.Pointer(&x)) == 1 -}() - -func (r *Resolver) MarshalTW() []byte { - defer runtime.KeepAlive(r) - fileOffsets, fileBlob := encodeStringTable(r.files) - fnOffsets, fnBlob := encodeStringTable(r.fns) - - size := twHeaderSize + - len(r.tokens)*twTokenSize + - len(fileOffsets)*4 + len(fileBlob) + - len(fnOffsets)*4 + len(fnBlob) - - out := make([]byte, 0, size) - out = append(out, twMagic[:]...) - out = binary.LittleEndian.AppendUint32(out, twVersion) - out = binary.LittleEndian.AppendUint32(out, uint32(len(r.tokens))) - out = binary.LittleEndian.AppendUint32(out, uint32(len(r.files))) - out = binary.LittleEndian.AppendUint32(out, uint32(len(r.fns))) - out = binary.LittleEndian.AppendUint32(out, 0) - - for i := range r.tokens { - t := &r.tokens[i] - out = binary.LittleEndian.AppendUint32(out, t.genLine) - out = binary.LittleEndian.AppendUint32(out, t.genCol) - out = binary.LittleEndian.AppendUint32(out, t.srcLine) - out = binary.LittleEndian.AppendUint32(out, t.srcCol) - out = binary.LittleEndian.AppendUint32(out, uint32(t.fileIdx)) - out = binary.LittleEndian.AppendUint32(out, uint32(t.fnIdx)) - } - - for _, off := range fileOffsets { - out = binary.LittleEndian.AppendUint32(out, off) - } - out = append(out, fileBlob...) - for _, off := range fnOffsets { - out = binary.LittleEndian.AppendUint32(out, off) - } - out = append(out, fnBlob...) - return out -} - -func encodeStringTable(strs []string) ([]uint32, []byte) { - offsets := make([]uint32, len(strs)+1) - var blob []byte - for i, s := range strs { - offsets[i] = uint32(len(blob)) - blob = append(blob, s...) - } - offsets[len(strs)] = uint32(len(blob)) - return offsets, blob -} - -func OpenTW(data []byte) (*Resolver, error) { - if len(data) < twHeaderSize || [4]byte(data[:4]) != twMagic { - return nil, ErrInvalidTW - } - if binary.LittleEndian.Uint32(data[4:]) != twVersion { - return nil, ErrInvalidTW - } - tokenCount := int(binary.LittleEndian.Uint32(data[8:])) - filesCount := int(binary.LittleEndian.Uint32(data[12:])) - fnsCount := int(binary.LittleEndian.Uint32(data[16:])) - - pos := uint64(twHeaderSize) - tokensOff := pos - pos += uint64(tokenCount) * twTokenSize - if pos > uint64(len(data)) { - return nil, ErrInvalidTW - } - - files, pos, err := decodeStringTable(data, pos, filesCount) - if err != nil { - return nil, err - } - fns, pos, err := decodeStringTable(data, pos, fnsCount) - if err != nil { - return nil, err - } - if pos != uint64(len(data)) { - return nil, ErrInvalidTW - } - - r := &Resolver{files: files, fns: fns} - if tokenCount > 0 { - tokenBytes := data[tokensOff : tokensOff+uint64(tokenCount)*twTokenSize] - if hostLittleEndian && - unsafe.Sizeof(resolvedToken{}) == twTokenSize && - uintptr(unsafe.Pointer(&tokenBytes[0]))%unsafe.Alignof(resolvedToken{}) == 0 { - r.tokens = unsafe.Slice((*resolvedToken)(unsafe.Pointer(&tokenBytes[0])), tokenCount) - } else { - r.tokens = decodeTokens(tokenBytes, tokenCount) - } - } - for i := range r.tokens { - t := &r.tokens[i] - if int(t.fileIdx) >= len(files) || int(t.fnIdx) >= len(fns) { - return nil, ErrInvalidTW - } - } - return r, nil -} - -func decodeTokens(b []byte, count int) []resolvedToken { - tokens := make([]resolvedToken, count) - for i := range tokens { - rec := b[i*twTokenSize:] - tokens[i] = resolvedToken{ - genLine: binary.LittleEndian.Uint32(rec), - genCol: binary.LittleEndian.Uint32(rec[4:]), - srcLine: binary.LittleEndian.Uint32(rec[8:]), - srcCol: binary.LittleEndian.Uint32(rec[12:]), - fileIdx: int32(binary.LittleEndian.Uint32(rec[16:])), - fnIdx: int32(binary.LittleEndian.Uint32(rec[20:])), - } - } - return tokens -} - -func decodeStringTable(data []byte, pos uint64, count int) ([]string, uint64, error) { - offsetsEnd := pos + uint64(count+1)*4 - if count < 0 || offsetsEnd > uint64(len(data)) { - return nil, 0, ErrInvalidTW - } - offsets := make([]uint32, count+1) - for i := range offsets { - offsets[i] = binary.LittleEndian.Uint32(data[pos+uint64(i)*4:]) - if i > 0 && offsets[i-1] > offsets[i] { - return nil, 0, ErrInvalidTW - } - } - blobStart := offsetsEnd - blobEnd := blobStart + uint64(offsets[count]) - if blobEnd > uint64(len(data)) { - return nil, 0, ErrInvalidTW - } - strs := make([]string, count) - for i := range count { - strs[i] = string(data[blobStart+uint64(offsets[i]) : blobStart+uint64(offsets[i+1])]) - } - return strs, blobEnd, nil -} diff --git a/backend/app/symbolicator/tw_test.go b/backend/app/symbolicator/tw_test.go deleted file mode 100644 index cec85c61..00000000 --- a/backend/app/symbolicator/tw_test.go +++ /dev/null @@ -1,155 +0,0 @@ -package symbolicator - -import ( - "encoding/binary" - "testing" - - "github.com/tracewayapp/traceway/backend/app/symbolicator/sourcemap" -) - -func TestTWRoundTrip(t *testing.T) { - for _, tc := range parityCases { - t.Run(tc.name, func(t *testing.T) { - mapBytes := mustRead(t, fixture(t, tc.mapPath...)) - bundle := readIfSet(t, tc.minifiedPath) - - original, err := NewResolver(mapBytes, bundle) - if err != nil { - t.Fatalf("NewResolver: %v", err) - } - - reopened, err := OpenTW(original.MarshalTW()) - if err != nil { - t.Fatalf("OpenTW: %v", err) - } - - parsed, err := sourcemap.Parse(mapBytes) - if err != nil { - t.Fatalf("parsing source map: %v", err) - } - - mismatches := 0 - for _, token := range parsed.Tokens { - oFrame, oOk := original.Lookup(token.GenLine, token.GenCol) - rFrame, rOk := reopened.Lookup(token.GenLine, token.GenCol) - if oOk != rOk || oFrame != rFrame { - mismatches++ - if mismatches <= 10 { - t.Errorf("lookup(%d,%d): original=(%+v,%v) reopened=(%+v,%v)", token.GenLine, token.GenCol, oFrame, oOk, rFrame, rOk) - } - } - } - if mismatches > 10 { - t.Errorf("%d total mismatches", mismatches) - } - - for _, exp := range tc.expectations { - frame, ok := reopened.Lookup(exp.line, exp.col) - if exp.wantNone { - if ok { - t.Errorf("lookup(%d,%d): got %+v, want no mapping", exp.line, exp.col, frame) - } - continue - } - if !ok { - t.Errorf("lookup(%d,%d): got no mapping, want a result", exp.line, exp.col) - continue - } - if exp.file != "" && frame.File != exp.file { - t.Errorf("lookup(%d,%d) file: got %q, want %q", exp.line, exp.col, frame.File, exp.file) - } - if frame.Line != exp.srcLine+1 || frame.Col != exp.srcCol+1 { - t.Errorf("lookup(%d,%d) pos: got %d:%d, want %d:%d", exp.line, exp.col, frame.Line, frame.Col, exp.srcLine+1, exp.srcCol+1) - } - if frame.Fn != exp.fn { - t.Errorf("lookup(%d,%d) fn: got %q, want %q", exp.line, exp.col, frame.Fn, exp.fn) - } - } - }) - } -} - -func TestOpenTWRejectsInvalid(t *testing.T) { - cases := map[string][]byte{ - "empty": nil, - "short": []byte("TWSM"), - "bad_magic": append([]byte("XXXX"), make([]byte, 20)...), - "bad_version": append([]byte("TWSM\xff\x00\x00\x00"), make([]byte, 16)...), - "truncated": func() []byte { r := &Resolver{}; return r.MarshalTW()[:twHeaderSize-1] }(), - "token_overrun": append([]byte("TWSM\x01\x00\x00\x00\xff\xff\xff\x00"), make([]byte, 12)...), - } - for name, data := range cases { - if _, err := OpenTW(data); err == nil { - t.Errorf("%s: expected error, got nil", name) - } - } -} - -func buildTW(t *testing.T, tokens [][6]uint32, fileOffsets []uint32, fileBlob []byte, fnOffsets []uint32, fnBlob []byte) []byte { - t.Helper() - out := []byte("TWSM") - out = binary.LittleEndian.AppendUint32(out, 1) - out = binary.LittleEndian.AppendUint32(out, uint32(len(tokens))) - out = binary.LittleEndian.AppendUint32(out, uint32(len(fileOffsets)-1)) - out = binary.LittleEndian.AppendUint32(out, uint32(len(fnOffsets)-1)) - out = binary.LittleEndian.AppendUint32(out, 0) - for _, tok := range tokens { - for _, v := range tok { - out = binary.LittleEndian.AppendUint32(out, v) - } - } - for _, off := range fileOffsets { - out = binary.LittleEndian.AppendUint32(out, off) - } - out = append(out, fileBlob...) - for _, off := range fnOffsets { - out = binary.LittleEndian.AppendUint32(out, off) - } - out = append(out, fnBlob...) - return out -} - -func TestOpenTWRejectsCorruptStringOffsets(t *testing.T) { - data := buildTW(t, nil, []uint32{0, 1000, 5}, []byte("abcde"), []uint32{0}, nil) - if _, err := OpenTW(data); err == nil { - t.Fatal("expected error for non-monotonic string offsets, got nil") - } -} - -func TestOpenTWRejectsOutOfRangeTokenIndexes(t *testing.T) { - cases := map[string][6]uint32{ - "fileIdx_too_big": {0, 0, 1, 1, 5, 0xFFFFFFFF}, - "fnIdx_too_big": {0, 0, 1, 1, 0, 7}, - } - for name, tok := range cases { - t.Run(name, func(t *testing.T) { - data := buildTW(t, [][6]uint32{tok}, []uint32{0, 4}, []byte("a.js"), []uint32{0, 2}, []byte("fn")) - if _, err := OpenTW(data); err == nil { - t.Fatal("expected error for out-of-range token index, got nil") - } - }) - } -} - -func TestOpenTWAcceptsNegativeTokenIndexes(t *testing.T) { - noID := uint32(0xFFFFFFFF) - data := buildTW(t, [][6]uint32{{0, 0, 1, 1, noID, noID}}, []uint32{0, 4}, []byte("a.js"), []uint32{0, 2}, []byte("fn")) - r, err := OpenTW(data) - if err != nil { - t.Fatalf("OpenTW: %v", err) - } - if _, ok := r.Lookup(0, 0); ok { - t.Fatal("token with fileIdx=-1 should not resolve") - } -} - -func TestMarshalTWEmpty(t *testing.T) { - r := &Resolver{} - reopened, err := OpenTW(r.MarshalTW()) - if err != nil { - t.Fatalf("OpenTW: %v", err) - } - if _, ok := reopened.Lookup(0, 0); ok { - t.Error("empty resolver should not resolve anything") - } -} diff --git a/backend/app/symbolicator/twcache/disk.go b/backend/app/symbolicator/twcache/disk.go new file mode 100644 index 00000000..e3fed459 --- /dev/null +++ b/backend/app/symbolicator/twcache/disk.go @@ -0,0 +1,238 @@ +package twcache + +import ( + "container/list" + "errors" + "fmt" + "io/fs" + "os" + "path/filepath" + "sort" + "strings" + "sync" + "time" +) + +const mtimeRefreshInterval = 10 * time.Minute + +type twcachedisk struct { + dirPath string + warn func(error) + + mu sync.Mutex + files map[string]*list.Element + order *list.List + maxBytes int64 + curBytes int64 + evictions uint64 +} + +type diskEntry struct { + name string + size int64 + touchedAt time.Time +} + +func newDiskStore(dir string, maxBytes int64, warn func(error)) (*twcachedisk, error) { + if maxBytes <= 0 { + return nil, errors.New("twcache: maxBytes must be positive") + } + if err := os.MkdirAll(dir, 0o755); err != nil { + return nil, fmt.Errorf("failed to create tw cache dir: %w", err) + } + s := &twcachedisk{ + dirPath: dir, + warn: warn, + files: make(map[string]*list.Element), + order: list.New(), + maxBytes: maxBytes, + } + if err := s.scan(); err != nil { + return nil, fmt.Errorf("failed to scan tw cache dir: %w", err) + } + return s, nil +} + +func (s *twcachedisk) dir() string { return s.dirPath } + +func (s *twcachedisk) path(name string) (string, error) { + rel := filepath.FromSlash(name) + if !filepath.IsLocal(rel) { + return "", ErrInvalidName + } + return filepath.Join(s.dirPath, rel), nil +} + +func (s *twcachedisk) scan() error { + type scanned struct { + name string + size int64 + mtime time.Time + } + var found []scanned + err := filepath.WalkDir(s.dirPath, func(path string, dirEntry fs.DirEntry, err error) error { + if err != nil { + if s.warn != nil { + s.warn(fmt.Errorf("skipping unreadable tw cache entry (path=%s): %w", path, err)) + } + return nil + } + if dirEntry.IsDir() || !strings.HasSuffix(path, ".tw") { + return nil + } + info, err := dirEntry.Info() + if err != nil { + return nil + } + rel, err := filepath.Rel(s.dirPath, path) + if err != nil { + return nil + } + found = append(found, scanned{name: filepath.ToSlash(rel), size: info.Size(), mtime: info.ModTime()}) + return nil + }) + if err != nil { + return err + } + sort.Slice(found, func(i, j int) bool { return found[i].mtime.Before(found[j].mtime) }) + s.mu.Lock() + defer s.mu.Unlock() + for _, f := range found { + el := s.order.PushFront(&diskEntry{name: f.name, size: f.size}) + s.files[f.name] = el + s.curBytes += f.size + } + s.evictLocked() + return nil +} + +func (s *twcachedisk) get(name string) ([]byte, func(), bool) { + path, err := s.path(name) + if err != nil { + return nil, noop, false + } + data, unmap, err := mmapFile(path) + if err != nil { + return nil, noop, false + } + s.noteUse(name, int64(len(data))) + return data, unmap, true +} + +func (s *twcachedisk) contains(name string) bool { + s.mu.Lock() + defer s.mu.Unlock() + _, ok := s.files[name] + return ok +} + +func (s *twcachedisk) put(name string, data []byte) error { + if err := s.persist(name, data); err != nil { + return err + } + s.noteUse(name, int64(len(data))) + return nil +} + +func (s *twcachedisk) persist(name string, data []byte) error { + path, err := s.path(name) + if err != nil { + return err + } + if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil { + return err + } + tmp, err := os.CreateTemp(filepath.Dir(path), ".tw-*") + if err != nil { + return err + } + if _, err := tmp.Write(data); err != nil { + tmp.Close() + os.Remove(tmp.Name()) + return err + } + if err := tmp.Close(); err != nil { + os.Remove(tmp.Name()) + return err + } + if err := os.Rename(tmp.Name(), path); err != nil { + os.Remove(tmp.Name()) + return err + } + return nil +} + +func (s *twcachedisk) noteUse(name string, size int64) { + now := time.Now() + updateMtime := false + s.mu.Lock() + if el, ok := s.files[name]; ok { + e := el.Value.(*diskEntry) + s.curBytes += size - e.size + e.size = size + s.order.MoveToFront(el) + if now.Sub(e.touchedAt) > mtimeRefreshInterval { + e.touchedAt = now + updateMtime = true + } + } else { + s.files[name] = s.order.PushFront(&diskEntry{name: name, size: size, touchedAt: now}) + s.curBytes += size + } + s.evictLocked() + s.mu.Unlock() + if updateMtime { + if path, err := s.path(name); err == nil { + _ = os.Chtimes(path, now, now) + } + } +} + +func (s *twcachedisk) remove(name string) { + s.mu.Lock() + defer s.mu.Unlock() + if el, ok := s.files[name]; ok { + s.dropLocked(el) + } else if path, err := s.path(name); err == nil { + os.Remove(path) + } +} + +func (s *twcachedisk) setLimits(_ int, maxBytes int64) { + s.mu.Lock() + defer s.mu.Unlock() + if maxBytes > 0 { + s.maxBytes = maxBytes + } + s.evictLocked() +} + +func (s *twcachedisk) dropLocked(el *list.Element) { + e := s.order.Remove(el).(*diskEntry) + delete(s.files, e.name) + s.curBytes -= e.size + os.Remove(filepath.Join(s.dirPath, filepath.FromSlash(e.name))) +} + +func (s *twcachedisk) evictLocked() { + for s.curBytes > s.maxBytes { + back := s.order.Back() + if back == nil { + break + } + s.dropLocked(back) + s.evictions++ + } +} + +func (s *twcachedisk) stats() storeStats { + s.mu.Lock() + defer s.mu.Unlock() + return storeStats{ + Mode: "disk", + Entries: s.order.Len(), + Bytes: s.curBytes, + MaxBytes: s.maxBytes, + Evictions: s.evictions, + } +} diff --git a/backend/app/symbolicator/twcache/mem.go b/backend/app/symbolicator/twcache/mem.go new file mode 100644 index 00000000..0ad7443c --- /dev/null +++ b/backend/app/symbolicator/twcache/mem.go @@ -0,0 +1,119 @@ +package twcache + +import ( + "container/list" + "sync" +) + +type twcachemem struct { + mu sync.Mutex + items map[string]*list.Element + order *list.List + maxEntries int + maxBytes int64 + curBytes int64 + evictions uint64 +} + +type memEntry struct { + name string + data []byte + size int64 +} + +func newMemStore(maxEntries int, maxBytes int64) *twcachemem { + return &twcachemem{ + items: make(map[string]*list.Element), + order: list.New(), + maxEntries: maxEntries, + maxBytes: maxBytes, + } +} + +func (s *twcachemem) get(name string) ([]byte, func(), bool) { + s.mu.Lock() + defer s.mu.Unlock() + el, ok := s.items[name] + if !ok { + return nil, noop, false + } + s.order.MoveToFront(el) + return el.Value.(*memEntry).data, noop, true +} + +func (s *twcachemem) contains(name string) bool { + s.mu.Lock() + defer s.mu.Unlock() + _, ok := s.items[name] + return ok +} + +func (s *twcachemem) put(name string, data []byte) error { + s.mu.Lock() + defer s.mu.Unlock() + size := int64(len(data)) + if el, ok := s.items[name]; ok { + e := el.Value.(*memEntry) + s.curBytes += size - e.size + e.data = data + e.size = size + s.order.MoveToFront(el) + } else { + s.items[name] = s.order.PushFront(&memEntry{name: name, data: data, size: size}) + s.curBytes += size + } + s.evictLocked() + return nil +} + +func (s *twcachemem) remove(name string) { + s.mu.Lock() + defer s.mu.Unlock() + if el, ok := s.items[name]; ok { + s.dropLocked(el) + } +} + +func (s *twcachemem) setLimits(maxEntries int, maxBytes int64) { + s.mu.Lock() + defer s.mu.Unlock() + if maxEntries > 0 { + s.maxEntries = maxEntries + } + if maxBytes > 0 { + s.maxBytes = maxBytes + } + s.evictLocked() +} + +func (s *twcachemem) dropLocked(el *list.Element) { + e := s.order.Remove(el).(*memEntry) + delete(s.items, e.name) + s.curBytes -= e.size +} + +func (s *twcachemem) evictLocked() { + for s.order.Len() > s.maxEntries || s.curBytes > s.maxBytes { + back := s.order.Back() + if back == nil { + break + } + s.dropLocked(back) + s.evictions++ + } +} + +func (s *twcachemem) stats() storeStats { + s.mu.Lock() + defer s.mu.Unlock() + return storeStats{ + Mode: "memory", + Entries: s.order.Len(), + Bytes: s.curBytes, + MaxBytes: s.maxBytes, + MaxEntries: s.maxEntries, + Evictions: s.evictions, + } +} + +func (s *twcachemem) dir() string { return "" } diff --git a/backend/app/symbolicator/twcache/twcache.go b/backend/app/symbolicator/twcache/twcache.go index 7bb7b1ef..0b395996 100644 --- a/backend/app/symbolicator/twcache/twcache.go +++ b/backend/app/symbolicator/twcache/twcache.go @@ -1,249 +1,294 @@ package twcache import ( - "container/list" + "context" "errors" "fmt" - "io/fs" - "os" - "path/filepath" - "runtime" - "sort" - "strings" "sync" + "sync/atomic" "time" - - "github.com/tracewayapp/traceway/backend/app/symbolicator" ) -const mtimeRefreshInterval = 10 * time.Minute +const ( + negativeBaseTTL = time.Minute + transientNegativeTTL = 15 * time.Second + negativeMaxTTL = 15 * time.Minute + negativeMaxKeys = 10000 + failReportInterval = time.Minute +) var ErrInvalidName = errors.New("twcache: cache name escapes the cache directory") -type Cache struct { - dir string - warn func(error) +type LoadFunc func(ctx context.Context) ([]byte, error) - mu sync.Mutex - files map[string]*list.Element - order *list.List - maxBytes int64 - curBytes int64 - hits uint64 - evictions uint64 -} +type store interface { + get(name string) (data []byte, done func(), ok bool) -type entry struct { - name string - size int64 - touchedAt time.Time + contains(name string) bool + put(name string, data []byte) error + remove(name string) + setLimits(maxEntries int, maxBytes int64) + stats() storeStats + dir() string } -type Stats struct { - Entries int - Bytes int64 - MaxBytes int64 - Hits uint64 - Evictions uint64 +type storeStats struct { + Mode string + Entries int + Bytes int64 + MaxBytes int64 + MaxEntries int + Evictions uint64 } -func New(dir string, maxBytes int64, warn func(error)) (*Cache, error) { - if maxBytes <= 0 { - return nil, errors.New("twcache: maxBytes must be positive") - } - if err := os.MkdirAll(dir, 0o755); err != nil { - return nil, fmt.Errorf("failed to create tw cache dir: %w", err) - } - c := &Cache{ - dir: dir, - warn: warn, - files: make(map[string]*list.Element), - order: list.New(), - maxBytes: maxBytes, - } - if err := c.scan(); err != nil { - return nil, fmt.Errorf("failed to scan tw cache dir: %w", err) - } - return c, nil +func noop() {} + +type Cache struct { + name string + store store + warn func(error) + + NotFound func(error) bool + + Validate func([]byte) bool + + mu sync.Mutex + loading map[string]*cacheLoad + negative map[string]*negEntry + negativeHits uint64 + lastParseMs float64 + failuresSinceReport uint64 + lastFailAt time.Time + + hits atomic.Uint64 + misses atomic.Uint64 + failures atomic.Uint64 + notFound atomic.Uint64 } -func (c *Cache) Dir() string { - return c.dir +type negEntry struct { + expiresAt time.Time + failures uint32 } -func (c *Cache) path(name string) (string, error) { - rel := filepath.FromSlash(name) - if !filepath.IsLocal(rel) { - return "", ErrInvalidName - } - return filepath.Join(c.dir, rel), nil +type cacheLoad struct { + done chan struct{} + err error } -func (c *Cache) scan() error { - type scanned struct { - name string - size int64 - mtime time.Time - } - var found []scanned - err := filepath.WalkDir(c.dir, func(path string, dirEntry fs.DirEntry, err error) error { - if err != nil { - if c.warn != nil { - c.warn(fmt.Errorf("skipping unreadable tw cache entry (path=%s): %w", path, err)) - } - return nil - } - if dirEntry.IsDir() || !strings.HasSuffix(path, ".tw") { - return nil - } - info, err := dirEntry.Info() - if err != nil { - return nil - } - rel, err := filepath.Rel(c.dir, path) - if err != nil { - return nil - } - found = append(found, scanned{name: filepath.ToSlash(rel), size: info.Size(), mtime: info.ModTime()}) - return nil - }) - if err != nil { - return err - } - sort.Slice(found, func(i, j int) bool { return found[i].mtime.Before(found[j].mtime) }) - c.mu.Lock() - defer c.mu.Unlock() - for _, f := range found { - el := c.order.PushFront(&entry{name: f.name, size: f.size}) - c.files[f.name] = el - c.curBytes += f.size +func newCache(s store, warn func(error)) *Cache { + return &Cache{ + name: "symbolication artifact", + store: s, + warn: warn, + loading: make(map[string]*cacheLoad), + negative: make(map[string]*negEntry), } - c.evictLocked() - return nil } -// Open mmaps the named .tw file and returns a resolver backed by it. The -// mapping is released by a runtime cleanup once the resolver is collected. -// Corrupt files are removed so the caller's rebuild can replace them. -func (c *Cache) Open(name string) (*symbolicator.Resolver, error) { - return c.open(name, true) +func NewMem(maxEntries int, maxBytes int64) *Cache { + return newCache(newMemStore(maxEntries, maxBytes), nil) } -func (c *Cache) open(name string, countHit bool) (*symbolicator.Resolver, error) { - path, err := c.path(name) - if err != nil { - return nil, err - } - data, unmap, err := mmapFile(path) - if err != nil { - return nil, err - } - resolver, err := symbolicator.OpenTW(data) +func NewDisk(dir string, maxBytes int64, warn func(error)) (*Cache, error) { + s, err := newDiskStore(dir, maxBytes, warn) if err != nil { - unmap() - c.Remove(name) return nil, err } - runtime.AddCleanup(resolver, func(u func()) { u() }, unmap) - c.noteUse(name, int64(len(data)), countHit) - return resolver, nil + return newCache(s, warn), nil } -// Write atomically persists data as the named .tw file and returns a -// resolver mmapped from it. Write does not count as a cache hit. -func (c *Cache) Write(name string, data []byte) (*symbolicator.Resolver, error) { - path, err := c.path(name) - if err != nil { - return nil, err - } - if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil { - return nil, err - } - tmp, err := os.CreateTemp(filepath.Dir(path), ".tw-*") - if err != nil { - return nil, err - } - if _, err := tmp.Write(data); err != nil { - tmp.Close() - os.Remove(tmp.Name()) - return nil, err +func (c *Cache) SetWarn(warn func(error)) { c.warn = warn } + +func (c *Cache) SetLimits(maxEntries int, maxBytes int64) { + c.store.setLimits(maxEntries, maxBytes) +} + +func (c *Cache) Dir() string { return c.store.dir() } + +func (c *Cache) Get(ctx context.Context, key string, load LoadFunc) (data []byte, done func(), err error) { + if data, done, ok := c.store.get(key); ok { + if c.Validate == nil || c.Validate(data) { + c.hits.Add(1) + return data, done, nil + } + + done() + c.store.remove(key) } - if err := tmp.Close(); err != nil { - os.Remove(tmp.Name()) - return nil, err + if err := c.ensureBuilt(ctx, key, load); err != nil { + return nil, noop, err } - if err := os.Rename(tmp.Name(), path); err != nil { - os.Remove(tmp.Name()) - return nil, err + if data, done, ok := c.store.get(key); ok { + return data, done, nil } - return c.open(name, false) + return nil, noop, fmt.Errorf("%s: %q evicted before use", c.name, key) } -func (c *Cache) noteUse(name string, size int64, countHit bool) { - now := time.Now() - updateMtime := false +func (c *Cache) ensureBuilt(ctx context.Context, key string, load LoadFunc) error { c.mu.Lock() - if countHit { - c.hits++ - } - if el, ok := c.files[name]; ok { - e := el.Value.(*entry) - c.curBytes += size - e.size - e.size = size - c.order.MoveToFront(el) - if now.Sub(e.touchedAt) > mtimeRefreshInterval { - e.touchedAt = now - updateMtime = true + if l, ok := c.loading[key]; ok { + c.mu.Unlock() + <-l.done + if l.err == nil { + c.hits.Add(1) } - } else { - c.files[name] = c.order.PushFront(&entry{name: name, size: size, touchedAt: now}) - c.curBytes += size + return l.err + } + + if c.store.contains(key) { + c.mu.Unlock() + c.hits.Add(1) + return nil } - c.evictLocked() + c.misses.Add(1) + l := &cacheLoad{done: make(chan struct{})} + c.loading[key] = l c.mu.Unlock() - if updateMtime { - if path, err := c.path(name); err == nil { - _ = os.Chtimes(path, now, now) + + var ms float64 + func() { + defer func() { + if r := recover(); r != nil { + l.err = fmt.Errorf("%s load panicked (key=%s): %v", c.name, key, r) + } + }() + start := time.Now() + blob, lerr := load(ctx) + ms = float64(time.Since(start).Microseconds()) / 1000.0 + if lerr != nil { + l.err = lerr + return } + l.err = c.store.put(key, blob) + }() + + c.mu.Lock() + delete(c.loading, key) + if l.err == nil { + c.lastParseMs = ms + delete(c.negative, key) + } else { + c.markNegativeLocked(key, l.err) } + c.mu.Unlock() + + close(l.done) + if l.err != nil && !c.isNotFound(l.err) { + c.reportFailure(l.err) + } + return l.err +} + +func (c *Cache) isNotFound(err error) bool { + return c.NotFound == nil || c.NotFound(err) } -func (c *Cache) Remove(name string) { +func (c *Cache) IsNegative(key string) bool { c.mu.Lock() defer c.mu.Unlock() - if el, ok := c.files[name]; ok { - c.dropLocked(el) - } else if path, err := c.path(name); err == nil { - os.Remove(path) + e, ok := c.negative[key] + if !ok || time.Now().After(e.expiresAt) { + return false } + c.negativeHits++ + return true } -func (c *Cache) dropLocked(el *list.Element) { - e := c.order.Remove(el).(*entry) - delete(c.files, e.name) - c.curBytes -= e.size - os.Remove(filepath.Join(c.dir, filepath.FromSlash(e.name))) +func (c *Cache) Invalidate(key string) { + c.mu.Lock() + delete(c.negative, key) + c.mu.Unlock() + c.store.remove(key) } -func (c *Cache) evictLocked() { - for c.curBytes > c.maxBytes { - back := c.order.Back() - if back == nil { +func (c *Cache) markNegativeLocked(key string, loadErr error) { + base := transientNegativeTTL + if c.isNotFound(loadErr) { + base = negativeBaseTTL + c.notFound.Add(1) + } else { + c.failures.Add(1) + } + e := c.negative[key] + if e == nil { + if len(c.negative) >= negativeMaxKeys { + c.pruneNegativeLocked() + } + e = &negEntry{} + c.negative[key] = e + } + ttl := min(base<= failReportInterval { + report = c.failuresSinceReport + c.failuresSinceReport = 0 + c.lastFailAt = time.Now() + } + c.mu.Unlock() + if report > 0 && c.warn != nil { + c.warn(fmt.Errorf("%s loads failed %d time(s) since last report: %w", c.name, report, err)) + } +} + +type Stats struct { + Mode string + Entries int + Bytes int64 + MaxBytes int64 + MaxEntries int + Hits uint64 + Misses uint64 + Evictions uint64 + Failures uint64 + NotFound uint64 + NegativeHits uint64 + NegativeEntries int + LastParseMs float64 +} + func (c *Cache) Stats() Stats { + ss := c.store.stats() c.mu.Lock() - defer c.mu.Unlock() + negEntries := len(c.negative) + negHits := c.negativeHits + lastMs := c.lastParseMs + c.mu.Unlock() return Stats{ - Entries: c.order.Len(), - Bytes: c.curBytes, - MaxBytes: c.maxBytes, - Hits: c.hits, - Evictions: c.evictions, + Mode: ss.Mode, + Entries: ss.Entries, + Bytes: ss.Bytes, + MaxBytes: ss.MaxBytes, + MaxEntries: ss.MaxEntries, + Evictions: ss.Evictions, + Hits: c.hits.Load(), + Misses: c.misses.Load(), + Failures: c.failures.Load(), + NotFound: c.notFound.Load(), + NegativeHits: negHits, + NegativeEntries: negEntries, + LastParseMs: lastMs, } } diff --git a/backend/app/symbolicator/twcache/twcache_test.go b/backend/app/symbolicator/twcache/twcache_test.go new file mode 100644 index 00000000..9f90f61e --- /dev/null +++ b/backend/app/symbolicator/twcache/twcache_test.go @@ -0,0 +1,160 @@ +package twcache + +import ( + "context" + "errors" + "sync" + "sync/atomic" + "testing" +) + +func blobLoad(data []byte, calls *atomic.Int64) LoadFunc { + return func(ctx context.Context) ([]byte, error) { + if calls != nil { + calls.Add(1) + } + return data, nil + } +} + +func caches(t *testing.T) map[string]*Cache { + t.Helper() + disk, err := NewDisk(t.TempDir(), 64<<20, nil) + if err != nil { + t.Fatal(err) + } + return map[string]*Cache{ + "mem": NewMem(100, 64<<20), + "disk": disk, + } +} + +func TestGetBuildsThenHits(t *testing.T) { + ctx := context.Background() + for mode, c := range caches(t) { + t.Run(mode, func(t *testing.T) { + var calls atomic.Int64 + data, done, err := c.Get(ctx, "k.tw", blobLoad([]byte("hello"), &calls)) + if err != nil { + t.Fatalf("Get: %v", err) + } + if string(data) != "hello" { + t.Errorf("got %q, want hello", data) + } + done() + + data2, done2, err := c.Get(ctx, "k.tw", blobLoad([]byte("DIFFERENT"), &calls)) + if err != nil { + t.Fatalf("Get (warm): %v", err) + } + if string(data2) != "hello" { + t.Errorf("warm get: got %q, want the cached hello", data2) + } + done2() + if calls.Load() != 1 { + t.Errorf("expected load called once, got %d", calls.Load()) + } + }) + } +} + +func TestDiskPersistsAcrossRestart(t *testing.T) { + ctx := context.Background() + dir := t.TempDir() + c, err := NewDisk(dir, 64<<20, nil) + if err != nil { + t.Fatal(err) + } + data, done, err := c.Get(ctx, "k.tw", blobLoad([]byte("persisted"), nil)) + if err != nil { + t.Fatal(err) + } + if string(data) != "persisted" { + t.Fatalf("got %q", data) + } + done() + + c2, err := NewDisk(dir, 64<<20, nil) + if err != nil { + t.Fatal(err) + } + failLoad := func(ctx context.Context) ([]byte, error) { return nil, errors.New("should not build") } + data2, done2, err := c2.Get(ctx, "k.tw", failLoad) + if err != nil { + t.Fatalf("restart get: %v", err) + } + if string(data2) != "persisted" { + t.Errorf("restart got %q, want persisted", data2) + } + done2() +} + +func TestSingleflight(t *testing.T) { + ctx := context.Background() + for mode, c := range caches(t) { + t.Run(mode, func(t *testing.T) { + var calls atomic.Int64 + release := make(chan struct{}) + load := func(ctx context.Context) ([]byte, error) { + calls.Add(1) + <-release + return []byte("v"), nil + } + const n = 16 + var wg sync.WaitGroup + start := make(chan struct{}) + for range n { + wg.Add(1) + go func() { + defer wg.Done() + <-start + _, done, err := c.Get(ctx, "k.tw", load) + if err == nil { + done() + } + }() + } + close(start) + close(release) + wg.Wait() + if calls.Load() != 1 { + t.Errorf("expected 1 build for concurrent gets, got %d", calls.Load()) + } + }) + } +} + +func TestNegativeAndInvalidate(t *testing.T) { + ctx := context.Background() + for mode, c := range caches(t) { + t.Run(mode, func(t *testing.T) { + boom := errors.New("boom") + if _, _, err := c.Get(ctx, "k.tw", func(ctx context.Context) ([]byte, error) { return nil, boom }); err == nil { + t.Fatal("expected error") + } + if !c.IsNegative("k.tw") { + t.Error("expected negative entry after a failed load") + } + + var calls atomic.Int64 + _, done, err := c.Get(ctx, "k.tw", blobLoad([]byte("v"), &calls)) + if err != nil { + t.Fatal(err) + } + done() + if c.IsNegative("k.tw") { + t.Error("successful load should clear the negative entry") + } + + c.Invalidate("k.tw") + _, done2, err := c.Get(ctx, "k.tw", blobLoad([]byte("v"), &calls)) + if err != nil { + t.Fatal(err) + } + done2() + if calls.Load() != 2 { + t.Errorf("invalidate should force a rebuild: got %d builds, want 2", calls.Load()) + } + }) + } +} diff --git a/backend/cmd/options.go b/backend/cmd/options.go index db872cbe..5f0a763e 100644 --- a/backend/cmd/options.go +++ b/backend/cmd/options.go @@ -1,12 +1,12 @@ package cmd type options struct { - sqlitePath string - port int - serverURL string - disableLogging bool - defaultUser *defaultUserOpts - defaultProjects []defaultProjectOpts + sqlitePath string + port int + serverURL string + disableLogging bool + defaultUser *defaultUserOpts + defaultProjects []defaultProjectOpts monitoringTracewayURL string } @@ -16,9 +16,10 @@ type defaultUserOpts struct { } type defaultProjectOpts struct { - name string - framework string - token string + name string + framework string + token string + sourceMapToken string } type Option func(*options) @@ -61,6 +62,16 @@ func WithDefaultProject(name, framework, token string) Option { } } +func WithDefaultProjectSourceMapToken(name, token string) Option { + return func(o *options) { + for i := range o.defaultProjects { + if o.defaultProjects[i].name == name { + o.defaultProjects[i].sourceMapToken = token + } + } + } +} + func WithMonitoringURL(url string) Option { return func(o *options) { o.monitoringTracewayURL = url diff --git a/backend/cmd/run.go b/backend/cmd/run.go index df462670..09db49cc 100644 --- a/backend/cmd/run.go +++ b/backend/cmd/run.go @@ -25,7 +25,7 @@ import ( "github.com/tracewayapp/traceway/backend/app/services" "github.com/tracewayapp/traceway/backend/app/sourcemapbackfill" "github.com/tracewayapp/traceway/backend/app/storage" - "github.com/tracewayapp/traceway/backend/app/symbolicator/scopes" + "github.com/tracewayapp/traceway/backend/app/symbolicator/sourcemap/scopes" "github.com/tracewayapp/traceway/backend/static" "github.com/coreos/go-systemd/v22/daemon" @@ -123,7 +123,7 @@ func Run(opts ...Option) { dir = "./twcache" } maxBytes := int64(parsePositiveInt(cfg.SourceMapDiskCacheMaxMB, 2048)) * 1024 * 1024 - if err := services.EnableSourceMapDiskCache(dir, maxBytes); err != nil { + if err := services.EnableSymbolicatorDiskCache(dir, maxBytes); err != nil { panic(fmt.Errorf("source map disk cache init failed: %w", err)) } default: @@ -238,9 +238,6 @@ func Run(opts ...Option) { } } -// applyEnvOverrides lets the dev-options path pick up OAuth/OIDC and -// symbolicator env vars so embedded examples (e.g. devtesting-embedded) can be -// configured without exposing every knob as a WithXxx option. func applyEnvOverrides(cfg *config.Cfg) { for _, m := range []struct { envVar string diff --git a/backend/cmd/seed.go b/backend/cmd/seed.go index 606154c6..903aa792 100644 --- a/backend/cmd/seed.go +++ b/backend/cmd/seed.go @@ -58,6 +58,10 @@ func seed(opts *options) error { OrganizationId: &org.Id, CreatedAt: time.Now().UTC(), } + if p.sourceMapToken != "" { + token := p.sourceMapToken + project.SourceMapToken = &token + } if err := lit.InsertExistingUuid(tx, project); err != nil { return struct{}{}, err } diff --git a/backend/tools/cachebench/corpus.go b/backend/tools/cachebench/corpus.go index d304543a..17200143 100644 --- a/backend/tools/cachebench/corpus.go +++ b/backend/tools/cachebench/corpus.go @@ -12,7 +12,6 @@ import ( "github.com/tracewayapp/traceway/backend/app/services" "github.com/tracewayapp/traceway/backend/app/storage" - "github.com/tracewayapp/traceway/backend/app/symbolicator" "github.com/tracewayapp/traceway/backend/app/symbolicator/sourcemap" "github.com/google/uuid" @@ -96,14 +95,13 @@ func buildCanonical(tokens int) (bundle, mapJSON []byte) { func generateCorpus(ctx context.Context, corpusDir string, projectId uuid.UUID, entries, tokens, workers int) error { bundle, mapJSON := buildCanonical(tokens) - resolver, err := symbolicator.NewResolver(mapJSON, bundle) + tw, err := sourcemap.BuildTW(mapJSON, bundle) if err != nil { - return fmt.Errorf("building canonical resolver: %w", err) + return fmt.Errorf("building canonical artifact: %w", err) } - tw := resolver.MarshalTW() - if frame, ok := resolver.Lookup(0, 10); !ok || !strings.HasPrefix(frame.File, "src/module-") { - return fmt.Errorf("canonical resolver sanity check failed: %+v ok=%v", frame, ok) + if frame, ok := sourcemap.LookupTW(tw, 0, 10); !ok || !strings.HasPrefix(frame.File, "src/module-") { + return fmt.Errorf("canonical artifact sanity check failed: %+v ok=%v", frame, ok) } var idx atomic.Int64 @@ -140,7 +138,7 @@ func generateCorpus(ctx context.Context, corpusDir string, projectId uuid.UUID, BundleBytes: len(bundle), MapBytes: len(mapJSON), TwBytes: len(tw), - ResolverBytes: resolver.ApproxSize(), + ResolverBytes: int64(len(tw)), } data, err := json.MarshalIndent(manifest, "", " ") if err != nil { diff --git a/backend/tools/cachebench/run.go b/backend/tools/cachebench/run.go index 2369ffa3..a09ae60d 100644 --- a/backend/tools/cachebench/run.go +++ b/backend/tools/cachebench/run.go @@ -115,7 +115,7 @@ func runBench(cfg runConfig) error { if err := os.RemoveAll(cfg.diskDir); err != nil { return err } - if err := services.EnableSourceMapDiskCache(cfg.diskDir, int64(cfg.diskMB)<<20); err != nil { + if err := services.EnableSymbolicatorDiskCache(cfg.diskDir, int64(cfg.diskMB)<<20); err != nil { return err } default: diff --git a/backend/traceway.go b/backend/traceway.go index b5f1ba4c..981f5048 100644 --- a/backend/traceway.go +++ b/backend/traceway.go @@ -1,7 +1,3 @@ -// Package tracewaybackend provides an embeddable Traceway backend that can be -// run inside your own Go application. Uses SQLite for all storage — no external -// databases required. -// package tracewaybackend import "github.com/tracewayapp/traceway/backend/cmd" @@ -17,4 +13,6 @@ var ( WithDefaultProject = cmd.WithDefaultProject WithMonitoringURL = cmd.WithMonitoringURL DisableLogging = cmd.DisableLogging + + WithDefaultProjectSourceMapToken = cmd.WithDefaultProjectSourceMapToken ) diff --git a/benchmarks/processor/README.md b/benchmarks/processor/README.md index 65491251..0ca8d786 100644 --- a/benchmarks/processor/README.md +++ b/benchmarks/processor/README.md @@ -34,9 +34,26 @@ stacktraces/sec; the drain's symbolicated percentage is the correctness check. | `traceway-oxc-disk` | otelcol-bench-traceway | oxc | mmap'd `.tw` disk tier | | `traceway-goja-mem` | otelcol-bench-traceway | goja | in-memory resolvers only | | `traceway-goja-disk` | otelcol-bench-traceway | goja | mmap'd `.tw` disk tier | - -One traceway binary (built with `-tags oxc`) serves all four variants; parser -and cache mode are runtime config (`parser`, `cache_dir`). +| `traceway-dart-mem` | otelcol-bench-traceway | DWARF flatten | in-memory `.tw` only | +| `traceway-dart-disk` | otelcol-bench-traceway | DWARF flatten | mmap'd `.tw` disk tier | + +One traceway binary (built with `-tags oxc`) serves all variants; language +(JS source maps vs. Dart symbols), parser, and cache mode are runtime config. +The processor auto-routes a non-symbolic Dart AOT trace to its Dart path; on a +cache miss it flattens the build's `.symbols` DWARF to a `.tw` (the analog of the +JS map compile). There is no Honeycomb Dart comparison — Honeycomb's processor is +JS-only. + +## Language + +`benchmark-processor` takes a `language` input: `js` (the 5 JS impls incl. +Honeycomb), `dart` (the two `traceway-dart-*` impls), or `both`. Locally, just +list the impls in `IMPLS`. The Dart corpus replicates a committed seed +(`seeds/dart/app.debug.elf`, a real pure-Dart AOT `.symbols` ELF + its trace) +under N synthetic build-ids — hardlinked, so N builds cost ~one inode — so the +churn/oom scenarios exercise the cache the same way the JS corpus does. The +drain's symbolicated check uses Dart markers (`crash.dart` resolved vs. +`_kDart…SnapshotInstructions` unresolved) selected automatically per impl. ## Scenarios @@ -72,7 +89,8 @@ timeline, not a single number. ``` ./run-local.sh -IMPLS="traceway-oxc traceway-goja honeycomb" SCENARIOS=churn CONNECTIONS=4,16,64 ./run-local.sh +IMPLS="traceway-oxc-mem traceway-goja-mem honeycomb" SCENARIOS=churn CONNECTIONS=4,16,64 ./run-local.sh +IMPLS="traceway-dart-mem traceway-dart-disk" SCENARIOS="hot churn" ./run-local.sh # Dart ``` Needs go, cargo, node, jq. Builds both collectors (the Traceway one with @@ -98,9 +116,10 @@ but the collector. ## GitHub Action `benchmark-processor` (workflow_dispatch) builds all artifacts on the runner, -then runs the two implementations as parallel matrix entries, each on its own -Hetzner server pair. Needs the `HCLOUD_TOKEN` secret. Results are uploaded as -`results-traceway-oxc` and `results-honeycomb` artifacts. +then runs the impls as parallel matrix entries, each on its own Hetzner server +pair. Needs the `HCLOUD_TOKEN` secret. The `language` input selects the matrix: +`js` (the 5 JS impls), `dart` (`traceway-dart-mem`/`-disk`), or `both`. Results +are uploaded as `results-` artifacts. ## Knobs diff --git a/benchmarks/processor/corpusgen/main.go b/benchmarks/processor/corpusgen/main.go index bef38264..8e928745 100644 --- a/benchmarks/processor/corpusgen/main.go +++ b/benchmarks/processor/corpusgen/main.go @@ -6,11 +6,23 @@ import ( "fmt" "os" "path/filepath" + "regexp" "strings" ) type corpus struct { - Urls []string `json:"urls"` + Language string `json:"language"` + Urls []string `json:"urls"` +} + +type dartBuild struct { + BuildID string `json:"buildId"` + Trace string `json:"trace"` +} + +type dartCorpus struct { + Language string `json:"language"` + Builds []dartBuild `json:"builds"` } const vlqChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" @@ -150,8 +162,11 @@ func padMap(mapBytes []byte, kb, mappingsKB, seed int) []byte { } func main() { + language := flag.String("language", "js", "corpus language: js or dart") bundle := flag.String("bundle", "../../testing/symbolication/node-app/dist/app.mjs", "") mapFile := flag.String("map", "../../testing/symbolication/node-app/dist/app.mjs.map", "") + symbols := flag.String("symbols", "seeds/dart/app.debug.elf", "dart: seed .symbols/.elf") + traceFile := flag.String("trace", "seeds/dart/trace.txt", "dart: seed non-symbolic trace") entries := flag.Int("entries", 1, "") padKB := flag.Int("pad-kb", 256, "") mapPadKB := flag.Int("map-pad-kb", 0, "") @@ -159,6 +174,14 @@ func main() { out := flag.String("out", "./corpus", "") flag.Parse() + if err := os.MkdirAll(*out, 0o755); err != nil { + panic(err) + } + if *language == "dart" { + generateDart(*out, *symbols, *traceFile, *entries) + return + } + bundleBytes, err := os.ReadFile(*bundle) if err != nil { panic(err) @@ -169,10 +192,7 @@ func main() { } firstLine := strings.SplitN(string(bundleBytes), "\n", 2)[0] - if err := os.MkdirAll(*out, 0o755); err != nil { - panic(err) - } - c := corpus{} + c := corpus{Language: "js"} for n := 0; n < *entries; n++ { var pad strings.Builder chunk := "function __benchPad%d_%d(a,b){var c=a*b+%d;for(var i=0;i<3;i++){c+=i*a-b}return c}\n" @@ -201,3 +221,51 @@ func main() { } fmt.Printf("wrote %d entries (%d KB padding each) to %s\n", *entries, *padKB, *out) } + +var archRe = regexp.MustCompile(`os:\s*\S+\s+arch:\s*(\S+)`) +var buildIDLineRe = regexp.MustCompile(`build_id:\s*'[0-9a-fA-F]+'`) + +func generateDart(out, symbolsPath, tracePath string, entries int) { + elf, err := os.ReadFile(symbolsPath) + if err != nil { + panic(fmt.Errorf("reading dart seed symbols %q: %w", symbolsPath, err)) + } + template, err := os.ReadFile(tracePath) + if err != nil { + panic(fmt.Errorf("reading dart seed trace %q: %w", tracePath, err)) + } + absSeed, err := filepath.Abs(symbolsPath) + if err != nil { + panic(err) + } + arch := "arm64" + if m := archRe.FindStringSubmatch(string(template)); m != nil { + arch = m[1] + } + + c := dartCorpus{Language: "dart"} + for n := 0; n < entries; n++ { + buildID := fmt.Sprintf("%032x", n) + dest := filepath.Join(out, buildID+"-"+arch+".symbols") + _ = os.Remove(dest) + if err := os.Link(absSeed, dest); err != nil { + + if werr := os.WriteFile(dest, elf, 0o644); werr != nil { + panic(werr) + } + } + c.Builds = append(c.Builds, dartBuild{BuildID: buildID, Trace: substituteBuildID(string(template), buildID)}) + } + data, _ := json.MarshalIndent(c, "", " ") + if err := os.WriteFile(filepath.Join(out, "corpus.json"), data, 0o644); err != nil { + panic(err) + } + fmt.Printf("wrote %d dart builds (arch %s, seed %s) to %s\n", entries, arch, symbolsPath, out) +} + +func substituteBuildID(trace, buildID string) string { + if buildIDLineRe.MatchString(trace) { + return buildIDLineRe.ReplaceAllString(trace, "build_id: '"+buildID+"'") + } + return "build_id: '" + buildID + "'\n" + trace +} diff --git a/benchmarks/processor/drain/src/main.rs b/benchmarks/processor/drain/src/main.rs index 8bc34721..dc315971 100644 --- a/benchmarks/processor/drain/src/main.rs +++ b/benchmarks/processor/drain/src/main.rs @@ -8,8 +8,8 @@ use std::io::Read; use std::sync::atomic::{AtomicU64, Ordering}; use std::sync::Arc; -const OK_MARKER: &[u8] = b"../src/inventory.js"; -const FAIL_MARKER: &[u8] = b".mjs:1:"; +const DEFAULT_OK_MARKER: &str = "../src/inventory.js"; +const DEFAULT_FAIL_MARKER: &str = ".mjs:1:"; #[derive(Default)] struct Counters { @@ -19,11 +19,17 @@ struct Counters { bytes: AtomicU64, } +struct App { + counters: Counters, + ok: Vec, + fail: Vec, +} + fn contains(haystack: &[u8], needle: &[u8]) -> bool { haystack.windows(needle.len()).any(|w| w == needle) } -async fn ingest(State(c): State>, headers: HeaderMap, body: Bytes) -> &'static str { +async fn ingest(State(c): State>, headers: HeaderMap, body: Bytes) -> &'static str { let decoded: Vec; let data: &[u8] = if headers .get("content-encoding") @@ -33,7 +39,7 @@ async fn ingest(State(c): State>, headers: HeaderMap, body: Bytes) let mut d = GzDecoder::new(body.as_ref()); let mut out = Vec::with_capacity(body.len() * 4); if d.read_to_end(&mut out).is_err() { - c.unsymbolicated.fetch_add(1, Ordering::Relaxed); + c.counters.unsymbolicated.fetch_add(1, Ordering::Relaxed); return ""; } decoded = out; @@ -41,43 +47,50 @@ async fn ingest(State(c): State>, headers: HeaderMap, body: Bytes) } else { body.as_ref() }; - c.requests.fetch_add(1, Ordering::Relaxed); - c.bytes.fetch_add(data.len() as u64, Ordering::Relaxed); - if contains(data, OK_MARKER) && !contains(data, FAIL_MARKER) { - c.symbolicated.fetch_add(1, Ordering::Relaxed); + c.counters.requests.fetch_add(1, Ordering::Relaxed); + c.counters.bytes.fetch_add(data.len() as u64, Ordering::Relaxed); + if contains(data, &c.ok) && !contains(data, &c.fail) { + c.counters.symbolicated.fetch_add(1, Ordering::Relaxed); } else { - c.unsymbolicated.fetch_add(1, Ordering::Relaxed); + c.counters.unsymbolicated.fetch_add(1, Ordering::Relaxed); } "" } -async fn stats(State(c): State>) -> String { +async fn stats(State(c): State>) -> String { serde_json::json!({ - "requests": c.requests.load(Ordering::Relaxed), - "symbolicated": c.symbolicated.load(Ordering::Relaxed), - "unsymbolicated": c.unsymbolicated.load(Ordering::Relaxed), - "bytes": c.bytes.load(Ordering::Relaxed), + "requests": c.counters.requests.load(Ordering::Relaxed), + "symbolicated": c.counters.symbolicated.load(Ordering::Relaxed), + "unsymbolicated": c.counters.unsymbolicated.load(Ordering::Relaxed), + "bytes": c.counters.bytes.load(Ordering::Relaxed), }) .to_string() } -async fn reset(State(c): State>) -> &'static str { - c.requests.store(0, Ordering::Relaxed); - c.symbolicated.store(0, Ordering::Relaxed); - c.unsymbolicated.store(0, Ordering::Relaxed); - c.bytes.store(0, Ordering::Relaxed); +async fn reset(State(c): State>) -> &'static str { + c.counters.requests.store(0, Ordering::Relaxed); + c.counters.symbolicated.store(0, Ordering::Relaxed); + c.counters.unsymbolicated.store(0, Ordering::Relaxed); + c.counters.bytes.store(0, Ordering::Relaxed); "reset" } #[tokio::main] async fn main() { - let counters = Arc::new(Counters::default()); + let ok = std::env::var("OK_MARKER").unwrap_or_else(|_| DEFAULT_OK_MARKER.to_string()); + let fail = std::env::var("FAIL_MARKER").unwrap_or_else(|_| DEFAULT_FAIL_MARKER.to_string()); + println!("drain markers: ok={:?} fail={:?}", ok, fail); + let state = Arc::new(App { + counters: Counters::default(), + ok: ok.into_bytes(), + fail: fail.into_bytes(), + }); let app = Router::new() .route("/v1/traces", post(ingest)) .route("/v1/logs", post(ingest)) .route("/stats", get(stats)) .route("/reset", post(reset)) - .with_state(counters); + .with_state(state); let addr = std::env::var("DRAIN_ADDR").unwrap_or_else(|_| "0.0.0.0:9319".to_string()); let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); println!("drain listening on {}", addr); diff --git a/benchmarks/processor/loadgen/main.go b/benchmarks/processor/loadgen/main.go index 99fb45d2..b2f666de 100644 --- a/benchmarks/processor/loadgen/main.go +++ b/benchmarks/processor/loadgen/main.go @@ -21,17 +21,32 @@ import ( "go.opentelemetry.io/collector/pdata/ptrace/ptraceotlp" ) -func buildBody(url string, spans int) []byte { - td := ptrace.NewTraces() - rs := td.ResourceSpans().AppendEmpty() - rs.Resource().Attributes().PutStr("service.name", "processor-bench") - rs.Resource().Attributes().PutStr("telemetry.sdk.language", "nodejs") - ss := rs.ScopeSpans().AppendEmpty() +func orDefault(s, def string) string { + if s == "" { + return def + } + return s +} + +func buildBodyJS(url string, spans int) []byte { stack := fmt.Sprintf(`RangeError: cannot reserve 3 units for order ord_1042, only 2 in stock at file:///bench/%s:1:435 at p (file:///bench/%s:1:554) at file:///bench/%s:1:1180 at file:///bench/%s:1:1717`, url, url, url, url) + return buildBody("nodejs", "RangeError", "bench", stack, spans) +} + +func buildBodyDart(trace string, spans int) []byte { + return buildBody("dart", "DartError", "bench", trace, spans) +} + +func buildBody(lang, excType, excMsg, stack string, spans int) []byte { + td := ptrace.NewTraces() + rs := td.ResourceSpans().AppendEmpty() + rs.Resource().Attributes().PutStr("service.name", "processor-bench") + rs.Resource().Attributes().PutStr("telemetry.sdk.language", lang) + ss := rs.ScopeSpans().AppendEmpty() for i := 0; i < spans; i++ { sp := ss.Spans().AppendEmpty() sp.SetName("POST /orders/fulfill") @@ -44,8 +59,8 @@ func buildBody(url string, spans int) []byte { sp.SetSpanID(sid) ev := sp.Events().AppendEmpty() ev.SetName("exception") - ev.Attributes().PutStr("exception.type", "RangeError") - ev.Attributes().PutStr("exception.message", "bench") + ev.Attributes().PutStr("exception.type", excType) + ev.Attributes().PutStr("exception.message", excMsg) ev.Attributes().PutStr("exception.stacktrace", stack) } req := ptraceotlp.NewExportRequestFromTraces(td) @@ -57,16 +72,16 @@ func buildBody(url string, spans int) []byte { } type stepResult struct { - Connections int `json:"connections"` - DurationSec float64 `json:"duration_sec"` - Sent int64 `json:"sent"` - Ok int64 `json:"ok"` - Rejected int64 `json:"rejected"` - Errors int64 `json:"errors"` - OkReqPerSec float64 `json:"ok_req_per_sec"` + Connections int `json:"connections"` + DurationSec float64 `json:"duration_sec"` + Sent int64 `json:"sent"` + Ok int64 `json:"ok"` + Rejected int64 `json:"rejected"` + Errors int64 `json:"errors"` + OkReqPerSec float64 `json:"ok_req_per_sec"` StacksPerSec float64 `json:"stacks_per_sec"` - P50Ms float64 `json:"p50_ms"` - P99Ms float64 `json:"p99_ms"` + P50Ms float64 `json:"p50_ms"` + P99Ms float64 `json:"p99_ms"` } func main() { @@ -83,16 +98,32 @@ func main() { panic(err) } var c struct { - Urls []string `json:"urls"` + Language string `json:"language"` + Urls []string `json:"urls"` + Builds []struct { + BuildID string `json:"buildId"` + Trace string `json:"trace"` + } `json:"builds"` } if err := json.Unmarshal(raw, &c); err != nil { panic(err) } - bodies := make([][]byte, len(c.Urls)) - for i, u := range c.Urls { - bodies[i] = buildBody(u, *spansPerReq) + var bodies [][]byte + if c.Language == "dart" { + bodies = make([][]byte, len(c.Builds)) + for i, b := range c.Builds { + bodies[i] = buildBodyDart(b.Trace, *spansPerReq) + } + } else { + bodies = make([][]byte, len(c.Urls)) + for i, u := range c.Urls { + bodies[i] = buildBodyJS(u, *spansPerReq) + } + } + if len(bodies) == 0 { + panic("corpus has no entries") } - fmt.Printf("prepared %d bodies, %d spans each, %d bytes first\n", len(bodies), *spansPerReq, len(bodies[0])) + fmt.Printf("prepared %d %s bodies, %d spans each, %d bytes first\n", len(bodies), orDefault(c.Language, "js"), *spansPerReq, len(bodies[0])) var results []stepResult for _, s := range strings.Split(*connSteps, ",") { @@ -150,16 +181,16 @@ func main() { return lats[int(float64(len(lats)-1)*p)] } r := stepResult{ - Connections: conns, - DurationSec: stepDur.Seconds(), - Sent: sent, - Ok: ok, - Rejected: rejected, - Errors: errs, - OkReqPerSec: float64(ok) / stepDur.Seconds(), + Connections: conns, + DurationSec: stepDur.Seconds(), + Sent: sent, + Ok: ok, + Rejected: rejected, + Errors: errs, + OkReqPerSec: float64(ok) / stepDur.Seconds(), StacksPerSec: float64(ok*int64(*spansPerReq)) / stepDur.Seconds(), - P50Ms: pct(0.50), - P99Ms: pct(0.99), + P50Ms: pct(0.50), + P99Ms: pct(0.99), } results = append(results, r) line, _ := json.Marshal(r) diff --git a/benchmarks/processor/run-hetzner.sh b/benchmarks/processor/run-hetzner.sh index e0cf8af0..9f44a25a 100755 --- a/benchmarks/processor/run-hetzner.sh +++ b/benchmarks/processor/run-hetzner.sh @@ -27,14 +27,22 @@ command -v hcloud >/dev/null || { echo "hcloud CLI required" >&2; exit 1; } [ -d artifacts ] || { echo "artifacts/ missing, build first (see workflow or run-local.sh build_all)" >&2; exit 1; } case "$IMPL" in - honeycomb) COL_BIN=otelcol-bench-honeycomb; COL_CFG=config-honeycomb.yaml; PARSER=goja; DISK= ;; - traceway-oxc-mem) COL_BIN=otelcol-bench-traceway; COL_CFG=config-traceway.yaml; PARSER=oxc; DISK= ;; - traceway-oxc-disk) COL_BIN=otelcol-bench-traceway; COL_CFG=config-traceway.yaml; PARSER=oxc; DISK=1 ;; - traceway-goja-mem) COL_BIN=otelcol-bench-traceway; COL_CFG=config-traceway.yaml; PARSER=goja; DISK= ;; - traceway-goja-disk) COL_BIN=otelcol-bench-traceway; COL_CFG=config-traceway.yaml; PARSER=goja; DISK=1 ;; + honeycomb) COL_BIN=otelcol-bench-honeycomb; COL_CFG=config-honeycomb.yaml; PARSER=goja; DISK=; LANG=js ;; + traceway-oxc-mem) COL_BIN=otelcol-bench-traceway; COL_CFG=config-traceway.yaml; PARSER=oxc; DISK=; LANG=js ;; + traceway-oxc-disk) COL_BIN=otelcol-bench-traceway; COL_CFG=config-traceway.yaml; PARSER=oxc; DISK=1; LANG=js ;; + traceway-goja-mem) COL_BIN=otelcol-bench-traceway; COL_CFG=config-traceway.yaml; PARSER=goja; DISK=; LANG=js ;; + traceway-goja-disk) COL_BIN=otelcol-bench-traceway; COL_CFG=config-traceway.yaml; PARSER=goja; DISK=1; LANG=js ;; + traceway-dart-mem) COL_BIN=otelcol-bench-traceway; COL_CFG=config-traceway.yaml; PARSER=goja; DISK=; LANG=dart ;; + traceway-dart-disk) COL_BIN=otelcol-bench-traceway; COL_CFG=config-traceway.yaml; PARSER=goja; DISK=1; LANG=dart ;; *) echo "unknown impl $IMPL" >&2; exit 1 ;; esac +if [ "$LANG" = dart ]; then + OK_MARKER=crash.dart; FAIL_MARKER=_kDartIsolateSnapshotInstructions +else + OK_MARKER=../src/inventory.js; FAIL_MARKER=.mjs:1: +fi + scenario_params() { case "$1" in hot) echo "1 $PAD_KB 0:0 128 $CONNECTIONS $STEP_DURATION $SUT_TYPE" ;; @@ -75,7 +83,7 @@ provision() { hcloud ssh-key create --name "bench-key-$RUN_ID" --public-key-from-file "$KEY_FILE.pub" > /dev/null LDG_IP=$(provision "bench-ldg-$RUN_ID" "$LDG_TYPE") -$SSH "root@$LDG_IP" "nohup env DRAIN_ADDR=0.0.0.0:9319 /opt/bench/drain > /opt/bench/drain.log 2>&1 & sleep 1; curl -sf http://127.0.0.1:9319/stats" +$SSH "root@$LDG_IP" "nohup env DRAIN_ADDR=0.0.0.0:9319 OK_MARKER='$OK_MARKER' FAIL_MARKER='$FAIL_MARKER' /opt/bench/drain > /opt/bench/drain.log 2>&1 & sleep 1; curl -sf http://127.0.0.1:9319/stats" PREV_SUT_TYPE="" SUT_IP="" @@ -90,8 +98,13 @@ for scenario in $SCENARIOS; do outdir="$RESULTS/$tag" mkdir -p "$outdir" + if [ "$LANG" = dart ]; then + corpusgen_cmd="./corpusgen --language dart --symbols seeds/dart/app.debug.elf --trace seeds/dart/trace.txt --entries $entries --out corpus-$scenario" + else + corpusgen_cmd="./corpusgen --bundle app.mjs --map app.mjs.map --entries $entries --pad-kb $pad --map-pad-kb ${mappad%%:*} --mappings-pad-kb ${mappad##*:} --out corpus-$scenario" + fi for ip in "$SUT_IP" "$LDG_IP"; do - $SSH "root@$ip" "cd /opt/bench && [ -f corpus-$scenario/corpus.json ] || ./corpusgen --bundle app.mjs --map app.mjs.map --entries $entries --pad-kb $pad --map-pad-kb ${mappad%%:*} --mappings-pad-kb ${mappad##*:} --out corpus-$scenario" + $SSH "root@$ip" "cd /opt/bench && [ -f corpus-$scenario/corpus.json ] || $corpusgen_cmd" done CACHE_DIR_REMOTE="" diff --git a/benchmarks/processor/run-local.sh b/benchmarks/processor/run-local.sh index f9e57723..d4b42183 100755 --- a/benchmarks/processor/run-local.sh +++ b/benchmarks/processor/run-local.sh @@ -40,7 +40,7 @@ build_all() { (cd loadgen && go mod tidy >/dev/null 2>&1; go build -o loadgen .) (cd corpusgen && go build -o corpusgen .) - if [ ! -f ../../testing/symbolication/node-app/dist/app.mjs ]; then + if echo "$IMPLS" | grep -qE 'honeycomb|oxc|goja' && [ ! -f ../../testing/symbolication/node-app/dist/app.mjs ]; then (cd ../../testing/symbolication/node-app && npm install && npm run build) fi } @@ -54,32 +54,47 @@ scenario_params() { } gen_corpus() { - local scenario="$1" entries="$2" pad="$3" mappad="$4" - local dir="./corpus-$scenario" + local lang="$1" scenario="$2" entries="$3" pad="$4" mappad="$5" + local dir="./corpus-$lang-$scenario" if [ ! -f "$dir/corpus.json" ]; then - ./corpusgen/corpusgen --entries "$entries" --pad-kb "$pad" --map-pad-kb "${mappad%%:*}" --mappings-pad-kb "${mappad##*:}" --out "$dir" >&2 + if [ "$lang" = dart ]; then + ./corpusgen/corpusgen --language dart --entries "$entries" --out "$dir" >&2 + else + ./corpusgen/corpusgen --entries "$entries" --pad-kb "$pad" --map-pad-kb "${mappad%%:*}" --mappings-pad-kb "${mappad##*:}" --out "$dir" >&2 + fi fi echo "$dir" } impl_env() { case "$1" in - honeycomb) echo "BIN=./build-honeycomb/otelcol-bench-honeycomb CFG=config-honeycomb.yaml PARSER= DISK=" ;; - traceway-oxc-mem) echo "BIN=./build-traceway/otelcol-bench-traceway CFG=config-traceway.yaml PARSER=oxc DISK=" ;; - traceway-oxc-disk) echo "BIN=./build-traceway/otelcol-bench-traceway CFG=config-traceway.yaml PARSER=oxc DISK=1" ;; - traceway-goja-mem) echo "BIN=./build-traceway/otelcol-bench-traceway CFG=config-traceway.yaml PARSER=goja DISK=" ;; - traceway-goja-disk) echo "BIN=./build-traceway/otelcol-bench-traceway CFG=config-traceway.yaml PARSER=goja DISK=1" ;; + honeycomb) echo "BIN=./build-honeycomb/otelcol-bench-honeycomb CFG=config-honeycomb.yaml PARSER= DISK= LANG=js" ;; + traceway-oxc-mem) echo "BIN=./build-traceway/otelcol-bench-traceway CFG=config-traceway.yaml PARSER=oxc DISK= LANG=js" ;; + traceway-oxc-disk) echo "BIN=./build-traceway/otelcol-bench-traceway CFG=config-traceway.yaml PARSER=oxc DISK=1 LANG=js" ;; + traceway-goja-mem) echo "BIN=./build-traceway/otelcol-bench-traceway CFG=config-traceway.yaml PARSER=goja DISK= LANG=js" ;; + traceway-goja-disk) echo "BIN=./build-traceway/otelcol-bench-traceway CFG=config-traceway.yaml PARSER=goja DISK=1 LANG=js" ;; + traceway-dart-mem) echo "BIN=./build-traceway/otelcol-bench-traceway CFG=config-traceway.yaml PARSER= DISK= LANG=dart" ;; + traceway-dart-disk) echo "BIN=./build-traceway/otelcol-bench-traceway CFG=config-traceway.yaml PARSER= DISK=1 LANG=dart" ;; *) echo "unknown impl $1" >&2; return 1 ;; esac } +drain_markers() { + case "$1" in + dart) echo "OK_MARKER=crash.dart FAIL_MARKER=_kDartIsolateSnapshotInstructions" ;; + *) echo "OK_MARKER=../src/inventory.js FAIL_MARKER=.mjs:1:" ;; + esac +} + run_one() { local impl="$1" scenario="$2" read -r entries pad mappad cachesize conns dur <<< "$(scenario_params "$scenario")" - local store - store=$(gen_corpus "$scenario" "$entries" "$pad" "$mappad") - local BIN CFG PARSER DISK + local BIN CFG PARSER DISK LANG eval "$(impl_env "$impl")" + local store + store=$(gen_corpus "$LANG" "$scenario" "$entries" "$pad" "$mappad") + local OK_MARKER FAIL_MARKER + eval "$(drain_markers "$LANG")" local tag="$impl-$scenario" local outdir="$RESULTS/$tag" mkdir -p "$outdir" @@ -91,7 +106,7 @@ run_one() { sleep 1 done - DRAIN_ADDR=127.0.0.1:9319 ./drain/target/release/drain & + DRAIN_ADDR=127.0.0.1:9319 OK_MARKER="$OK_MARKER" FAIL_MARKER="$FAIL_MARKER" ./drain/target/release/drain & local drain_pid=$! sleep 1 curl -sf -X POST http://127.0.0.1:9319/reset > /dev/null diff --git a/benchmarks/processor/seeds/dart/app.debug.elf b/benchmarks/processor/seeds/dart/app.debug.elf new file mode 100644 index 0000000000000000000000000000000000000000..0600b7158d90f324d4b05c27c0e11ba08434e1c1 GIT binary patch literal 212544 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 literal 0 HcmV?d00001 diff --git a/benchmarks/processor/seeds/dart/trace.txt b/benchmarks/processor/seeds/dart/trace.txt new file mode 100644 index 00000000..74c994dc --- /dev/null +++ b/benchmarks/processor/seeds/dart/trace.txt @@ -0,0 +1,14 @@ +Unhandled exception: +Bad state: boom from level3 +*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** +pid: 49838, tid: 8806539456, name Dart_Initialize +os: macos arch: arm64 comp: no sim: no +build_id: '20fb76bfc9d292a85d82b8712754455e' +isolate_dso_base: 104914000, vm_dso_base: 104914000 +isolate_instructions: 1049527c0, vm_instructions: 104948000 + #00 abs 00000001049832cb virt 000000000006f2cb _kDartIsolateSnapshotInstructions+0x30b0b + #01 abs 0000000104983293 virt 000000000006f293 _kDartIsolateSnapshotInstructions+0x30ad3 + #02 abs 000000010498ebd7 virt 000000000007abd7 _kDartIsolateSnapshotInstructions+0x3c417 + #03 abs 00000001049836c3 virt 000000000006f6c3 _kDartIsolateSnapshotInstructions+0x30f03 + #04 abs 000000010498eeb3 virt 000000000007aeb3 _kDartIsolateSnapshotInstructions+0x3c6f3 + #05 abs 0000000104961b07 virt 000000000004db07 _kDartIsolateSnapshotInstructions+0xf347 diff --git a/examples/devtesting-embedded/main.go b/examples/devtesting-embedded/main.go index 29e1ac7f..84998479 100644 --- a/examples/devtesting-embedded/main.go +++ b/examples/devtesting-embedded/main.go @@ -38,10 +38,12 @@ var cdnHTML []byte var staticFS embed.FS const ( - appPort = 8080 - backendToken = "backend-dev-token" - frontendToken = "frontend-dev-token" - monitoringToken = "monitoring-dev-token" + appPort = 8080 + backendToken = "backend-dev-token" + frontendToken = "frontend-dev-token" + monitoringToken = "monitoring-dev-token" + flutterToken = "flutter-dev-token" + flutterUploadToken = "flutter-upload-token" backendServiceName = "backend-service" workerServiceName = "worker-service" @@ -49,8 +51,6 @@ const ( otlpHost = "localhost:8082" ) -// otelService bundles a TracerProvider + LoggerProvider for a single logical service -// so we can run two services in-process to exercise the distributed-logs flow. type otelService struct { name string tp *sdktrace.TracerProvider @@ -113,8 +113,6 @@ func initOtelService(ctx context.Context, serviceName, token string, extraResour }, nil } -// log emits an OTel log record. The SDK auto-attaches trace_id / span_id from ctx -// so logs emitted inside a span get chip-linked on the trace detail page. func (s *otelService) log(ctx context.Context, sev otellog.Severity, sevText, body string, attrs ...otellog.KeyValue) { rec := otellog.Record{} now := time.Now() @@ -137,11 +135,11 @@ func main() { tracewaybackend.WithDefaultProject("Backend API", "opentelemetry", backendToken), tracewaybackend.WithDefaultProject("jQuery Frontend", "jquery", frontendToken), tracewaybackend.WithDefaultProject("Traceway Monitoring", "gin", monitoringToken), + tracewaybackend.WithDefaultProject("Flutter App", "flutter", flutterToken), + tracewaybackend.WithDefaultProjectSourceMapToken("Flutter App", flutterUploadToken), tracewaybackend.WithMonitoringURL(monitoringToken+"@http://localhost:8082/api/report"), ) - // Give the backend a moment to start listening and register project tokens - // before we start sending OTel data at it. time.Sleep(2 * time.Second) ctx := context.Background() @@ -152,9 +150,6 @@ func main() { } defer backendSvc.shutdown(ctx) - // Second OTel provider with a different service.name. Reports to the same - // Backend API project so both sides of the "distributed trace" are visible - // in one project. Used by /api/test-distributed-logs. workerSvc, err := initOtelService(ctx, workerServiceName, backendToken) if err != nil { panic(err) @@ -189,8 +184,6 @@ func main() { c.Next() }) - // otelgin creates a SERVER span per request and puts it in c.Request.Context(), - // which is what the OTel logger reads to attach trace_id + span_id to each log. router.Use(otelgin.Middleware(backendServiceName, otelgin.WithTracerProvider(backendSvc.tp))) router.GET("/", func(c *gin.Context) { @@ -204,7 +197,6 @@ func main() { staticSub, _ := fs.Sub(staticFS, "static") router.StaticFS("/static", http.FS(staticSub)) - // Emits an error log + records an exception on the root span. router.GET("/api/test-error", func(c *gin.Context) { ctx := c.Request.Context() backendSvc.log(ctx, otellog.SeverityInfo, "INFO", "received test-error request") @@ -217,7 +209,6 @@ func main() { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) }) - // Emits a DEBUG + INFO log on a successful request. router.GET("/api/test-success", func(c *gin.Context) { ctx := c.Request.Context() backendSvc.log(ctx, otellog.SeverityDebug, "DEBUG", "test-success entered") @@ -226,8 +217,6 @@ func main() { c.JSON(http.StatusOK, gin.H{"message": "success"}) }) - // Emits one log at each severity level — useful for inspecting the /logs page - // and confirming the SeverityBadge renders every variant. router.GET("/api/test-log-levels", func(c *gin.Context) { ctx := c.Request.Context() backendSvc.log(ctx, otellog.SeverityTrace1, "TRACE", "trace-level log for visual testing") @@ -239,11 +228,6 @@ func main() { c.JSON(http.StatusOK, gin.H{"emitted": 6}) }) - // Nested child spans + logs from each level. On the endpoint detail page: - // - root-span logs chip as the endpoint name - // - child-span logs chip as that child span's name (db.query / cache.lookup / auth.verify) - // Also populates parent_span_id on each non-root span, and attributes on each - // child span so the span tree + attribute popover can be exercised. router.GET("/api/test-spans-with-logs", func(c *gin.Context) { ctx := c.Request.Context() backendSvc.log(ctx, otellog.SeverityInfo, "INFO", "handler: entering /test-spans-with-logs") @@ -280,10 +264,6 @@ func main() { c.JSON(http.StatusOK, gin.H{"status": "ok"}) }) - // Distributed logs: emits logs from two different services (backend-service - // and worker-service) with a shared traceway.distributed_trace_id so the - // "Load logs from other traces" button on the trace detail page has - // something to pull in. router.GET("/api/test-distributed-logs", func(c *gin.Context) { ctx := c.Request.Context() dtid := uuid.New().String() @@ -294,9 +274,6 @@ func main() { backendSvc.log(ctx, otellog.SeverityInfo, "INFO", "backend: received request, about to call worker", otellog.String("distributed_trace_id", dtid)) - // Fresh root context (no parent) so the worker registers as a separate - // trace in Traceway. WithSpanKind(Consumer) makes the converter treat - // this as a task rather than another endpoint. workerCtx, workerSpan := workerSvc.tr.Start(context.Background(), "worker.process-job", trace.WithSpanKind(trace.SpanKindConsumer)) workerSpan.SetAttributes(attribute.String("traceway.distributed_trace_id", dtid)) @@ -347,15 +324,12 @@ func main() { writeSSEStream(c, 30*time.Second, time.Second) }) - // Short SSE for quicker iteration. router.GET("/api/test-sse-short", func(c *gin.Context) { span := trace.SpanFromContext(c.Request.Context()) span.SetAttributes(attribute.Bool("traceway.is_stream", true)) writeSSEStream(c, 5*time.Second, 500*time.Millisecond) }) - // Long-poll style — no SSE Content-Type, just a long-held connection that - // returns JSON at the end. Flagged via the same span attribute. router.GET("/api/test-long-poll", func(c *gin.Context) { span := trace.SpanFromContext(c.Request.Context()) span.SetAttributes(attribute.Bool("traceway.is_stream", true)) diff --git a/scripts/build-oxc-shim.sh b/scripts/build-oxc-shim.sh index 5e177448..95dea7e4 100755 --- a/scripts/build-oxc-shim.sh +++ b/scripts/build-oxc-shim.sh @@ -9,7 +9,7 @@ if ! command -v cargo &> /dev/null; then exit 1 fi -cd "$ROOT_DIR/backend/app/symbolicator/scopes/oxc-shim" +cd "$ROOT_DIR/backend/app/symbolicator/sourcemap/scopes/oxc-shim" cargo build --release echo "Built liboxc_shim.a" diff --git a/testing/flutter-symbolication/run-local.sh b/testing/flutter-symbolication/run-local.sh new file mode 100755 index 00000000..c1ed188e --- /dev/null +++ b/testing/flutter-symbolication/run-local.sh @@ -0,0 +1,112 @@ +#!/usr/bin/env bash + +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +FIXTURE="$ROOT/backend/app/symbolicator/dart/fixtures/flutter-macos-arm64-dart3.10.1" +SYMBOLS="$FIXTURE/app.darwin-arm64.symbols" +TRACE="$FIXTURE/trace.txt" + +INGEST_TOKEN="flutter-dev-token" +UPLOAD_TOKEN="flutter-upload-token" +BASE="http://localhost:8082" + +for f in "$SYMBOLS" "$TRACE"; do + [ -f "$f" ] || { echo "missing fixture: $f"; exit 1; } +done + +WORK="$(mktemp -d)" +mkdir -p "$WORK/storage" +echo "work dir: $WORK" + +echo "==> building devtesting-embedded" +(cd "$ROOT/examples/devtesting-embedded" && go build -o "$WORK/devtesting-embedded" .) + +echo "==> starting backend (port 8082)" +( cd "$WORK" && "$WORK/devtesting-embedded" ) > "$WORK/server.log" 2>&1 & +SERVER_PID=$! +cleanup() { kill "$SERVER_PID" 2>/dev/null || true; } +trap cleanup EXIT + +ready= +for _ in $(seq 1 60); do + if curl -fsS "$BASE/api/has-organizations" >/dev/null 2>&1; then ready=1; break; fi + sleep 1 +done +[ -n "$ready" ] || { echo "FAIL: backend did not come up"; tail -40 "$WORK/server.log"; exit 1; } +echo " backend is up" + +DEBUG_ID="fe664295997135e7b67b648ba66ca9eb" +echo "==> uploading symbols (arch=arm64 debug_id=$DEBUG_ID)" +UP="$(curl -fsS -X POST "$BASE/api/symbols/upload" \ + -H "Authorization: Bearer $UPLOAD_TOKEN" \ + -F "files=@$SYMBOLS" -F "arch=arm64" -F "debug_id=$DEBUG_ID")" +echo " response: $UP" +echo "$UP" | grep -q '"uploaded":1' || { echo "FAIL: symbols upload"; exit 1; } + +post_report() { + python3 - "$1" "$BASE/api/report" "$INGEST_TOKEN" <<'PY' +import sys, json, gzip, urllib.request +trace = open(sys.argv[1]).read() +url, token = sys.argv[2], sys.argv[3] +body = { + "collectionFrames": [{ + "stackTraces": [{ + "stackTrace": trace, + "recordedAt": "2026-06-13T00:00:00Z", + "isMessage": False, + "attributes": {}, + }], + "metrics": [], "traces": [], "sessions": [], + }], + "appVersion": "1.0.0", "serverName": "", +} +data = gzip.compress(json.dumps(body).encode()) +req = urllib.request.Request(url, data=data, method="POST", headers={ + "Content-Type": "application/json", + "Content-Encoding": "gzip", + "Authorization": "Bearer " + token, +}) +with urllib.request.urlopen(req) as r: + print(" report HTTP", r.status) +PY +} + +echo "==> posting report #1 (raw non-symbolic trace)" +post_report "$TRACE" + +echo "==> posting report #2 (same crash, different load address)" +sed -E 's/abs [0-9a-fA-F]+/abs 0000000700000000/' "$TRACE" > "$WORK/trace2.txt" +post_report "$WORK/trace2.txt" + +TELDB="$WORK/storage/traceway_telemetry.db" +echo "==> reading back from $TELDB" + +got= +for _ in $(seq 1 25); do + if [ -f "$TELDB" ]; then + got="$(sqlite3 "$TELDB" "SELECT stack_trace FROM exception_stack_traces WHERE stack_trace LIKE '%chargeCard%' LIMIT 1;" 2>/dev/null || true)" + [ -n "$got" ] && break + fi + sleep 1 +done + +if [ -z "$got" ]; then + echo "FAIL: no symbolicated exception stored" + echo "--- tables ---"; sqlite3 "$TELDB" ".tables" 2>/dev/null || true + echo "--- server log (tail) ---"; tail -40 "$WORK/server.log" + exit 1 +fi + +echo "--- stored symbolicated stack trace ---" +echo "$got" | head -6 +echo "$got" | grep -q "main.dart:20:3" || { echo "FAIL: chargeCard not resolved to main.dart:20:3"; exit 1; } + +counts="$(sqlite3 "$TELDB" "SELECT COUNT(*), COUNT(DISTINCT exception_hash) FROM exception_stack_traces WHERE stack_trace LIKE '%chargeCard%';")" +total="${counts%%|*}" +distinct="${counts##*|}" +echo "==> grouping: $total row(s), $distinct distinct hash(es)" +[ "$distinct" = "1" ] || { echo "FAIL: expected 1 distinct exception hash, got $distinct"; exit 1; } + +echo +echo "PASS: Flutter symbolication works end-to-end (upload -> report -> symbolicated + grouped)" From 04b81b180face0d2d9682223ec171c65db423734 Mon Sep 17 00:00:00 2001 From: ddux Date: Sun, 14 Jun 2026 23:07:02 -0500 Subject: [PATCH 2/2] fix: security --- backend/app/controllers/symbols.controller.go | 4 ++ .../app/services/dart_arch_security_test.go | 36 +++++++++++++++ backend/app/storage/local.go | 26 +++++++++-- backend/app/storage/local_test.go | 42 +++++++++++++++++ backend/app/symbolicator/dart/normalize.go | 27 +++++++++-- .../app/symbolicator/dart/normalize_test.go | 46 +++++++++++++++++++ .../otelprocessor/negative_cache_test.go | 35 ++++++++++++++ .../symbolicator/otelprocessor/symbolicate.go | 6 ++- 8 files changed, 215 insertions(+), 7 deletions(-) create mode 100644 backend/app/services/dart_arch_security_test.go create mode 100644 backend/app/storage/local_test.go create mode 100644 backend/app/symbolicator/dart/normalize_test.go create mode 100644 backend/app/symbolicator/otelprocessor/negative_cache_test.go diff --git a/backend/app/controllers/symbols.controller.go b/backend/app/controllers/symbols.controller.go index 81995a07..75115d05 100644 --- a/backend/app/controllers/symbols.controller.go +++ b/backend/app/controllers/symbols.controller.go @@ -66,6 +66,10 @@ func (s symbolsController) Upload(c *gin.Context) { c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("cannot determine arch for %s; pass an 'arch' field", fileHeader.Filename)}) return } + if !dart.IsValidArch(arch) { + c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("invalid arch %q for %s; expected an architecture token like arm64, x64, arm, or ia32", arch, fileHeader.Filename)}) + return + } buildID, err := dart.ReadBuildID(data) if err != nil { diff --git a/backend/app/services/dart_arch_security_test.go b/backend/app/services/dart_arch_security_test.go new file mode 100644 index 00000000..22635ddc --- /dev/null +++ b/backend/app/services/dart_arch_security_test.go @@ -0,0 +1,36 @@ +package services + +import ( + "path/filepath" + "strings" + "testing" + + "github.com/google/uuid" +) + +func TestDartSymbolsKeyConfinesArch(t *testing.T) { + pid := uuid.New() + prefix := "dartsymbols/" + pid.String() + "/" + hostile := []string{ + "../../../../../../tmp/pwned", + "../../" + uuid.New().String() + "/aaaa-arm64", + "arm64/../../../etc/cron.d/x", + "..", + "a/b", + `back\slash`, + } + for _, arch := range hostile { + key := DartSymbolsKey(pid, fixtureBuildID, arch) + seg, ok := strings.CutPrefix(key, prefix) + if !ok { + t.Errorf("arch %q escaped the project prefix: key=%q", arch, key) + continue + } + if strings.ContainsAny(seg, `/\`) || strings.Contains(seg, "..") { + t.Errorf("arch %q produced traversal chars in key segment %q (full key %q)", arch, seg, key) + } + if cleaned := filepath.ToSlash(filepath.Clean(key)); cleaned != key { + t.Errorf("arch %q produced a non-clean key %q (clean=%q)", arch, key, cleaned) + } + } +} diff --git a/backend/app/storage/local.go b/backend/app/storage/local.go index 574502f9..1d22bea4 100644 --- a/backend/app/storage/local.go +++ b/backend/app/storage/local.go @@ -2,6 +2,7 @@ package storage import ( "context" + "errors" "fmt" "os" "path/filepath" @@ -11,6 +12,8 @@ type localStorage struct { basePath string } +var ErrInvalidKey = errors.New("storage: key escapes base path") + func NewLocalStorage(basePath string) (*localStorage, error) { abs, err := filepath.Abs(basePath) if err != nil { @@ -22,8 +25,19 @@ func NewLocalStorage(basePath string) (*localStorage, error) { return &localStorage{basePath: abs}, nil } +func (l *localStorage) resolve(key string) (string, error) { + rel := filepath.FromSlash(key) + if !filepath.IsLocal(rel) { + return "", fmt.Errorf("%w: %q", ErrInvalidKey, key) + } + return filepath.Join(l.basePath, rel), nil +} + func (l *localStorage) Write(_ context.Context, key string, data []byte) error { - fullPath := filepath.Join(l.basePath, key) + fullPath, err := l.resolve(key) + if err != nil { + return err + } dir := filepath.Dir(fullPath) if err := os.MkdirAll(dir, 0755); err != nil { return fmt.Errorf("failed to create directory %s: %w", dir, err) @@ -35,7 +49,10 @@ func (l *localStorage) Write(_ context.Context, key string, data []byte) error { } func (l *localStorage) Delete(_ context.Context, key string) error { - fullPath := filepath.Join(l.basePath, key) + fullPath, err := l.resolve(key) + if err != nil { + return err + } if err := os.Remove(fullPath); err != nil && !os.IsNotExist(err) { return fmt.Errorf("failed to delete file %s: %w", fullPath, err) } @@ -43,7 +60,10 @@ func (l *localStorage) Delete(_ context.Context, key string) error { } func (l *localStorage) Read(_ context.Context, key string) ([]byte, error) { - fullPath := filepath.Join(l.basePath, key) + fullPath, err := l.resolve(key) + if err != nil { + return nil, err + } data, err := os.ReadFile(fullPath) if err != nil { if os.IsNotExist(err) { diff --git a/backend/app/storage/local_test.go b/backend/app/storage/local_test.go new file mode 100644 index 00000000..e5e2d65e --- /dev/null +++ b/backend/app/storage/local_test.go @@ -0,0 +1,42 @@ +package storage + +import ( + "context" + "os" + "path/filepath" + "testing" +) + +func TestLocalStorageRejectsTraversalKeys(t *testing.T) { + base := t.TempDir() + s, err := NewLocalStorage(base) + if err != nil { + t.Fatal(err) + } + ctx := context.Background() + + for _, key := range []string{"../escape.txt", "../../etc/x", "a/../../escape", "/abs/path", ""} { + if err := s.Write(ctx, key, []byte("x")); err == nil { + t.Errorf("Write(%q) succeeded, want rejection", key) + } + if _, err := s.Read(ctx, key); err == nil { + t.Errorf("Read(%q) succeeded, want rejection", key) + } + if err := s.Delete(ctx, key); err == nil { + t.Errorf("Delete(%q) succeeded, want rejection", key) + } + } + + escaped := filepath.Join(filepath.Dir(base), "escape.txt") + if _, err := os.Stat(escaped); err == nil { + t.Errorf("traversal write escaped to %s", escaped) + } + + if err := s.Write(ctx, "ok/nested/file.txt", []byte("data")); err != nil { + t.Fatalf("legit nested key rejected: %v", err) + } + got, err := s.Read(ctx, "ok/nested/file.txt") + if err != nil || string(got) != "data" { + t.Fatalf("legit read failed: got %q err %v", got, err) + } +} diff --git a/backend/app/symbolicator/dart/normalize.go b/backend/app/symbolicator/dart/normalize.go index f83c88be..d75e9622 100644 --- a/backend/app/symbolicator/dart/normalize.go +++ b/backend/app/symbolicator/dart/normalize.go @@ -13,7 +13,8 @@ func NormalizeDebugID(debugID string) string { } func NormalizeArch(arch string) string { - switch strings.ToLower(strings.TrimSpace(arch)) { + a := strings.ToLower(strings.TrimSpace(arch)) + switch a { case "x86_64", "x64", "amd64": return "x64" case "aarch64", "arm64": @@ -22,7 +23,27 @@ func NormalizeArch(arch string) string { return "arm" case "ia32", "x86", "i386": return "ia32" - default: - return strings.ToLower(strings.TrimSpace(arch)) } + var b strings.Builder + for _, r := range a { + if (r >= 'a' && r <= 'z') || (r >= '0' && r <= '9') || r == '_' { + b.WriteRune(r) + } + } + return b.String() +} + +func IsValidArch(arch string) bool { + a := strings.TrimSpace(arch) + if a == "" { + return false + } + for _, r := range a { + switch { + case r >= 'a' && r <= 'z', r >= 'A' && r <= 'Z', r >= '0' && r <= '9', r == '_': + default: + return false + } + } + return true } diff --git a/backend/app/symbolicator/dart/normalize_test.go b/backend/app/symbolicator/dart/normalize_test.go new file mode 100644 index 00000000..bdd35691 --- /dev/null +++ b/backend/app/symbolicator/dart/normalize_test.go @@ -0,0 +1,46 @@ +package dart + +import ( + "strings" + "testing" +) + +func TestNormalizeArchSanitizesUnsafeInput(t *testing.T) { + cases := map[string]string{ + "arm64": "arm64", + "aarch64": "arm64", + "x86_64": "x64", + "amd64": "x64", + "armv7": "arm", + "i386": "ia32", + " ARM64 ": "arm64", + "riscv64": "riscv64", + "../../../../tmp/x": "tmpx", + "arm64/../../etc": "arm64etc", + `a/b\c`: "abc", + "../../arm64": "arm64", + "..": "", + } + for in, want := range cases { + got := NormalizeArch(in) + if got != want { + t.Errorf("NormalizeArch(%q) = %q, want %q", in, got, want) + } + if strings.ContainsAny(got, `/\.`) { + t.Errorf("NormalizeArch(%q) = %q still contains a path separator", in, got) + } + } +} + +func TestIsValidArch(t *testing.T) { + for _, a := range []string{"arm64", "x64", "x86_64", "ia32", "arm", "riscv64"} { + if !IsValidArch(a) { + t.Errorf("IsValidArch(%q) = false, want true", a) + } + } + for _, a := range []string{"", " ", "../../etc", "arm64/x", "arm-64", "a.b", "arm64\x00", "x64;rm"} { + if IsValidArch(a) { + t.Errorf("IsValidArch(%q) = true, want false", a) + } + } +} diff --git a/backend/app/symbolicator/otelprocessor/negative_cache_test.go b/backend/app/symbolicator/otelprocessor/negative_cache_test.go new file mode 100644 index 00000000..d73667f3 --- /dev/null +++ b/backend/app/symbolicator/otelprocessor/negative_cache_test.go @@ -0,0 +1,35 @@ +package otelprocessor + +import ( + "context" + "testing" + + "go.opentelemetry.io/collector/pdata/pcommon" +) + +func TestJSNegativeCacheShortCircuit(t *testing.T) { + p := newTestProcessor(t, func(cfg *Config) { + cfg.LocalSourceMaps.Path = t.TempDir() + }) + + resolveOnce := func() { + attrs := pcommon.NewMap() + putStructuredFrame(attrs) + p.processRecord(context.Background(), attrs, pcommon.NewMap()) + } + + resolveOnce() + first := p.cache.Stats() + if first.Misses == 0 { + t.Fatalf("expected the first resolve to miss the cache and fetch the bundle: %+v", first) + } + + resolveOnce() + second := p.cache.Stats() + if second.Misses != first.Misses { + t.Errorf("missing bundle re-fetched on the second resolve (misses %d -> %d): negative-cache short-circuit not applied", first.Misses, second.Misses) + } + if second.NegativeHits == 0 { + t.Errorf("expected a negative-cache hit on the second resolve: %+v", second) + } +} diff --git a/backend/app/symbolicator/otelprocessor/symbolicate.go b/backend/app/symbolicator/otelprocessor/symbolicate.go index 39bb7298..1f3513de 100644 --- a/backend/app/symbolicator/otelprocessor/symbolicate.go +++ b/backend/app/symbolicator/otelprocessor/symbolicate.go @@ -304,7 +304,11 @@ func (p *symbolicatorProcessor) symbolicateFrame(ctx context.Context, f stackFra return frameResult{err: fmt.Errorf("line/column out of range: %d:%d", f.line, f.col)} } - data, done, err := p.cache.Get(ctx, cacheKey(f.url, buildUUID), func(ctx context.Context) ([]byte, error) { + key := cacheKey(f.url, buildUUID) + if p.cache.IsNegative(key) { + return frameResult{err: fmt.Errorf("no source map for %s", f.url)} + } + data, done, err := p.cache.Get(ctx, key, func(ctx context.Context) ([]byte, error) { fetchCtx, cancel := context.WithTimeout(ctx, p.cfg.Timeout) defer cancel() source, sourceMap, err := p.store.getSourceAndMap(fetchCtx, f.url, buildUUID)