From 1899e981ab7fa84399d2943676e7c6c4e8417b6e Mon Sep 17 00:00:00 2001 From: Thomas Moreira Date: Sat, 1 Apr 2023 19:48:32 +0200 Subject: [PATCH 1/4] chore: relocate source code of cli to this repo --- cli/configflag/bind.go | 139 +++++++++++++++++++++++++++++++++++ cli/configflag/bind_test.go | 83 +++++++++++++++++++++ cli/configflag/configflag.go | 28 +++++++ cli/errorutil/errorutil.go | 24 ++++++ cli/output/conditional.go | 38 ++++++++++ cli/render/ansi/style.go | 70 ++++++++++++++++++ cli/render/progress.go | 88 ++++++++++++++++++++++ cli/render/report.go | 55 ++++++++++++++ cli/render/report_test.go | 78 ++++++++++++++++++++ cli/render/testsuite.go | 63 ++++++++++++++++ cli/signals/signals.go | 17 +++++ cli/testutil/http.go | 15 ++++ cmd/benchttp/main.go | 58 +++++++++++++++ cmd/benchttp/run.go | 129 ++++++++++++++++++++++++++++++++ cmd/benchttp/version.go | 21 ++++++ 15 files changed, 906 insertions(+) create mode 100644 cli/configflag/bind.go create mode 100644 cli/configflag/bind_test.go create mode 100644 cli/configflag/configflag.go create mode 100644 cli/errorutil/errorutil.go create mode 100644 cli/output/conditional.go create mode 100644 cli/render/ansi/style.go create mode 100644 cli/render/progress.go create mode 100644 cli/render/report.go create mode 100644 cli/render/report_test.go create mode 100644 cli/render/testsuite.go create mode 100644 cli/signals/signals.go create mode 100644 cli/testutil/http.go create mode 100644 cmd/benchttp/main.go create mode 100644 cmd/benchttp/run.go create mode 100644 cmd/benchttp/version.go diff --git a/cli/configflag/bind.go b/cli/configflag/bind.go new file mode 100644 index 0000000..2cfb717 --- /dev/null +++ b/cli/configflag/bind.go @@ -0,0 +1,139 @@ +package configflag + +import ( + "bytes" + "errors" + "flag" + "fmt" + "io" + "net/http" + "net/url" + "strconv" + "strings" + "time" + + "github.com/benchttp/engine/configio" +) + +// Bind reads arguments provided to flagset as config fields +// and binds their value to the appropriate fields of dst. +// The provided *flag.Flagset must not have been parsed yet, otherwise +// bindings its values would fail. +func Bind(flagset *flag.FlagSet, dst *configio.Builder) { + for field, bind := range bindings { + flagset.Func(field, flagsUsage[field], bind(dst)) + } +} + +type setter = func(string) error + +var bindings = map[string]func(*configio.Builder) setter{ + flagMethod: func(b *configio.Builder) setter { + return func(in string) error { + b.SetRequestMethod(in) + return nil + } + }, + flagURL: func(b *configio.Builder) setter { + return func(in string) error { + u, err := url.ParseRequestURI(in) + if err != nil { + return err + } + b.SetRequestURL(u) + return nil + } + }, + flagHeader: func(b *configio.Builder) setter { + return func(in string) error { + keyval := strings.SplitN(in, ":", 2) + if len(keyval) != 2 { + return errors.New(`-header: expect format ":"`) + } + key, val := keyval[0], keyval[1] + b.SetRequestHeaderFunc(func(h http.Header) http.Header { + if h == nil { + h = http.Header{} + } + h[key] = append(h[key], val) + return h + }) + return nil + } + }, + flagBody: func(b *configio.Builder) setter { + return func(in string) error { + errFormat := fmt.Errorf(`expect format ":", got %q`, in) + if in == "" { + return errFormat + } + split := strings.SplitN(in, ":", 2) + if len(split) != 2 { + return errFormat + } + btype, bcontent := split[0], split[1] + if bcontent == "" { + return errFormat + } + switch btype { + case "raw": + b.SetRequestBody(io.NopCloser(bytes.NewBufferString(bcontent))) + // case "file": + // // TODO + default: + return fmt.Errorf(`unsupported type: %s (only "raw" accepted)`, btype) + } + return nil + } + }, + flagRequests: func(b *configio.Builder) setter { + return func(in string) error { + n, err := strconv.Atoi(in) + if err != nil { + return err + } + b.SetRequests(n) + return nil + } + }, + flagConcurrency: func(b *configio.Builder) setter { + return func(in string) error { + n, err := strconv.Atoi(in) + if err != nil { + return err + } + b.SetConcurrency(n) + return nil + } + }, + flagInterval: func(b *configio.Builder) setter { + return func(in string) error { + d, err := time.ParseDuration(in) + if err != nil { + return err + } + b.SetInterval(d) + return nil + } + }, + flagRequestTimeout: func(b *configio.Builder) setter { + return func(in string) error { + d, err := time.ParseDuration(in) + if err != nil { + return err + } + b.SetRequestTimeout(d) + return nil + } + }, + flagGlobalTimeout: func(b *configio.Builder) setter { + return func(in string) error { + d, err := time.ParseDuration(in) + if err != nil { + return err + } + b.SetGlobalTimeout(d) + return nil + } + }, +} diff --git a/cli/configflag/bind_test.go b/cli/configflag/bind_test.go new file mode 100644 index 0000000..b33c82a --- /dev/null +++ b/cli/configflag/bind_test.go @@ -0,0 +1,83 @@ +package configflag_test + +import ( + "bytes" + "flag" + "io" + "net/http" + "net/url" + "testing" + "time" + + "github.com/benchttp/engine/benchttp" + "github.com/benchttp/engine/benchttptest" + "github.com/benchttp/engine/configio" + + "github.com/benchttp/engine/cli/configflag" +) + +func TestBind(t *testing.T) { + t.Run("default to zero runner", func(t *testing.T) { + flagset := flag.NewFlagSet("", flag.ExitOnError) + args := []string{} // no args + + b := configio.Builder{} + configflag.Bind(flagset, &b) + if err := flagset.Parse(args); err != nil { + t.Fatal(err) // critical error, stop the test + } + + benchttptest.AssertEqualRunners(t, benchttp.Runner{}, b.Runner()) + }) + + t.Run("set config with flags values", func(t *testing.T) { + flagset := flag.NewFlagSet("", flag.ExitOnError) + args := []string{ + "-method", "POST", + "-url", "https://example.com?a=b", + "-header", "API_KEY:abc", + "-header", "Accept:text/html", + "-header", "Accept:application/json", + "-body", "raw:hello", + "-requests", "1", + "-concurrency", "2", + "-interval", "3s", + "-requestTimeout", "4s", + "-globalTimeout", "5s", + } + + b := configio.Builder{} + configflag.Bind(flagset, &b) + if err := flagset.Parse(args); err != nil { + t.Fatal(err) // critical error, stop the test + } + + benchttptest.AssertEqualRunners(t, + benchttp.Runner{ + Request: &http.Request{ + Method: "POST", + URL: mustParseURL("https://example.com?a=b"), + Header: http.Header{ + "API_KEY": []string{"abc"}, + "Accept": []string{"text/html", "application/json"}, + }, + Body: io.NopCloser(bytes.NewBufferString("hello")), + }, + Requests: 1, + Concurrency: 2, + Interval: 3 * time.Second, + RequestTimeout: 4 * time.Second, + GlobalTimeout: 5 * time.Second, + }, + b.Runner(), + ) + }) +} + +func mustParseURL(v string) *url.URL { + u, err := url.ParseRequestURI(v) + if err != nil { + panic("mustParseURL: " + err.Error()) + } + return u +} diff --git a/cli/configflag/configflag.go b/cli/configflag/configflag.go new file mode 100644 index 0000000..e841413 --- /dev/null +++ b/cli/configflag/configflag.go @@ -0,0 +1,28 @@ +package configflag + +const ( + flagMethod = "method" + flagURL = "url" + flagHeader = "header" + flagBody = "body" + flagRequests = "requests" + flagConcurrency = "concurrency" + flagInterval = "interval" + flagRequestTimeout = "requestTimeout" + flagGlobalTimeout = "globalTimeout" + flagTests = "tests" +) + +// flagsUsage is a record of all available config flags and their usage. +var flagsUsage = map[string]string{ + flagMethod: "HTTP request method", + flagURL: "HTTP request url", + flagHeader: "HTTP request header", + flagBody: "HTTP request body", + flagRequests: "Number of requests to run, use duration as exit condition if omitted", + flagConcurrency: "Number of connections to run concurrently", + flagInterval: "Minimum duration between two non concurrent requests", + flagRequestTimeout: "Timeout for each HTTP request", + flagGlobalTimeout: "Max duration of test", + flagTests: "Test suite", +} diff --git a/cli/errorutil/errorutil.go b/cli/errorutil/errorutil.go new file mode 100644 index 0000000..d733a93 --- /dev/null +++ b/cli/errorutil/errorutil.go @@ -0,0 +1,24 @@ +package errorutil + +import ( + "fmt" + "strings" +) + +// WithDetails returns an error wrapping err, appended with a string +// representation of details separated by ": ". +// +// Example +// +// var ErrNotFound = errors.New("not found") +// err := WithDetails(ErrNotFound, "abc.jpg", "deleted yesterday") +// +// errors.Is(err, ErrNotFound) == true +// err.Error() == "not found: abc.jpg: deleted yesterday" +func WithDetails(base error, details ...interface{}) error { + detailsStr := make([]string, len(details)) + for i := range details { + detailsStr[i] = fmt.Sprint(details[i]) + } + return fmt.Errorf("%w: %s", base, strings.Join(detailsStr, ": ")) +} diff --git a/cli/output/conditional.go b/cli/output/conditional.go new file mode 100644 index 0000000..ffe0f28 --- /dev/null +++ b/cli/output/conditional.go @@ -0,0 +1,38 @@ +package output + +import ( + "io" +) + +// ConditionalWriter is an io.Writer that wraps an input writer +// and exposes methods to condition its action. +type ConditionalWriter struct { + Writer io.Writer + ok bool +} + +// Write writes b only if ConditionalWriter.Mute is false, +// otherwise it is no-op. +func (w ConditionalWriter) Write(b []byte) (int, error) { + if !w.ok { + return 0, nil + } + return w.Writer.Write(b) +} + +// If sets the write condition to v. +func (w ConditionalWriter) If(v bool) ConditionalWriter { + return ConditionalWriter{ + Writer: w.Writer, + ok: v, + } +} + +// ElseIf either keeps the previous write condition if it is true, +// else it sets it to v. +func (w ConditionalWriter) ElseIf(v bool) ConditionalWriter { + return ConditionalWriter{ + Writer: w.Writer, + ok: w.ok || v, + } +} diff --git a/cli/render/ansi/style.go b/cli/render/ansi/style.go new file mode 100644 index 0000000..a7c9227 --- /dev/null +++ b/cli/render/ansi/style.go @@ -0,0 +1,70 @@ +package ansi + +import ( + "fmt" + "strings" +) + +type StyleFunc func(in string) string + +type style string + +const ( + reset style = "\033[0m" + + bold style = "\033[1m" + + grey style = "\033[1;30m" + red style = "\033[1;31m" + green style = "\033[1;32m" + yellow style = "\033[1;33m" + cyan style = "\033[1;36m" + + erase style = "\033[1A" +) + +func withStyle(in string, s style) string { + return fmt.Sprintf("%s%s%s", s, in, reset) +} + +// Bold returns the bold version of the input string. +func Bold(in string) string { + return withStyle(in, bold) +} + +// Green returns the green version of the input string. +func Green(in string) string { + return withStyle(in, green) +} + +// Yellow returns the yellow version of the input string. +func Yellow(in string) string { + return withStyle(in, yellow) +} + +// Cyan returns the cyan version of the input string. +func Cyan(in string) string { + return withStyle(in, cyan) +} + +// Red returns the red version of the input string. +func Red(in string) string { + return withStyle(in, red) +} + +// Grey returns the grey version of the input string. +func Grey(in string) string { + return withStyle(in, grey) +} + +// Erase returns a string that erases the previous line n times. +func Erase(n int) string { + if n < 1 { + return "" + } + var b strings.Builder + for i := 0; i < n; i++ { + b.Write([]byte(erase)) + } + return b.String() +} diff --git a/cli/render/progress.go b/cli/render/progress.go new file mode 100644 index 0000000..3e97a1f --- /dev/null +++ b/cli/render/progress.go @@ -0,0 +1,88 @@ +package render + +import ( + "fmt" + "io" + "strconv" + "strings" + + "github.com/benchttp/engine/benchttp" + + "github.com/benchttp/engine/cli/render/ansi" +) + +// Progress renders a fancy representation of a runner.RecordingProgress +// and writes the result to w. +func Progress(w io.Writer, p benchttp.RecordingProgress) (int, error) { + return fmt.Fprint(w, progressString(p)) +} + +// progressString returns a string representation of a runner.RecordingProgress +// for a fancy display in a CLI: +// +// RUNNING ◼︎◼︎◼︎◼︎◼︎◼︎◼︎◼︎◼︎◼︎ 50% | 50/100 requests | 27s timeout +func progressString(p benchttp.RecordingProgress) string { + var ( + countdown = p.Timeout - p.Elapsed + reqmax = strconv.Itoa(p.MaxCount) + pctdone = p.Percent() + timeline = renderTimeline(pctdone) + ) + + if reqmax == "-1" { + reqmax = "∞" + } + if countdown < 0 { + countdown = 0 + } + + return fmt.Sprintf( + "%s%s %s %d%% | %d/%s requests | %.0fs timeout \n", + ansi.Erase(1), // replace previous line + renderStatus(p.Status()), timeline, pctdone, // progress + p.DoneCount, reqmax, // requests + countdown.Seconds(), // timeout + ) +} + +var ( + tlBlock = "◼︎" + tlBlockGrey = ansi.Grey(tlBlock) + tlBlockGreen = ansi.Green(tlBlock) + tlLen = 10 +) + +// renderTimeline returns a colored representation of the progress as a string: +// +// ◼︎◼︎◼︎◼︎◼︎◼︎◼︎◼︎◼︎◼︎ +func renderTimeline(pctdone int) string { + tl := strings.Repeat(tlBlockGrey, tlLen) + for i := 0; i < tlLen; i++ { + if pctdone >= (tlLen * i) { + tl = strings.Replace(tl, tlBlockGrey, tlBlockGreen, 1) + } + } + return tl +} + +// renderStatus returns a string representing the status, +// depending on whether the run is done or not and the value +// of its context error. +func renderStatus(status benchttp.RecordingStatus) string { + styled := statusStyle(status) + return styled(string(status)) +} + +func statusStyle(status benchttp.RecordingStatus) ansi.StyleFunc { + switch status { + case benchttp.StatusRunning: + return ansi.Yellow + case benchttp.StatusDone: + return ansi.Green + case benchttp.StatusCanceled: + return ansi.Red + case benchttp.StatusTimeout: + return ansi.Cyan + } + return ansi.Grey // should not occur +} diff --git a/cli/render/report.go b/cli/render/report.go new file mode 100644 index 0000000..34fa48e --- /dev/null +++ b/cli/render/report.go @@ -0,0 +1,55 @@ +package render + +import ( + "fmt" + "io" + "strconv" + "strings" + "time" + + "github.com/benchttp/engine/benchttp" + + "github.com/benchttp/engine/cli/render/ansi" +) + +func ReportSummary(w io.Writer, rep *benchttp.Report) (int, error) { + return w.Write([]byte(ReportSummaryString(rep))) +} + +// String returns a default summary of the Report as a string. +func ReportSummaryString(rep *benchttp.Report) string { + var b strings.Builder + + line := func(name string, value interface{}) string { + const template = "%-18s %v\n" + return fmt.Sprintf(template, name, value) + } + + msString := func(d time.Duration) string { + return fmt.Sprintf("%dms", d.Milliseconds()) + } + + formatRequests := func(n, max int) string { + maxString := strconv.Itoa(max) + if maxString == "-1" { + maxString = "∞" + } + return fmt.Sprintf("%d/%s", n, maxString) + } + + m := rep.Metrics + r := rep.Metadata.Runner + + b.WriteString(ansi.Bold("→ Summary")) + b.WriteString("\n") + b.WriteString(line("Endpoint", r.Request.URL)) + b.WriteString(line("Requests", formatRequests(len(m.Records), r.Requests))) + b.WriteString(line("Errors", len(m.RequestFailures))) + b.WriteString(line("Min response time", msString(m.ResponseTimes.Min))) + b.WriteString(line("Max response time", msString(m.ResponseTimes.Max))) + b.WriteString(line("Mean response time", msString(m.ResponseTimes.Mean))) + b.WriteString(line("Total duration", msString(rep.Metadata.TotalDuration))) + b.WriteString("\n") + + return b.String() +} diff --git a/cli/render/report_test.go b/cli/render/report_test.go new file mode 100644 index 0000000..72ba406 --- /dev/null +++ b/cli/render/report_test.go @@ -0,0 +1,78 @@ +package render_test + +import ( + "net/http" + "testing" + "time" + + "github.com/benchttp/engine/benchttp" + + "github.com/benchttp/engine/cli/render" + "github.com/benchttp/engine/cli/render/ansi" +) + +func TestReport_String(t *testing.T) { + t.Run("returns metrics summary", func(t *testing.T) { + metrics, duration := metricsStub() + runner := runnerStub() + + rep := &benchttp.Report{ + Metrics: metrics, + Metadata: benchttp.Metadata{ + Runner: runner, + TotalDuration: duration, + }, + } + checkSummary(t, render.ReportSummaryString(rep)) + }) +} + +// helpers + +func metricsStub() (agg benchttp.MetricsAggregate, total time.Duration) { + return benchttp.MetricsAggregate{ + RequestFailures: make([]struct { + Reason string + }, 1), + Records: make([]struct{ ResponseTime time.Duration }, 3), + ResponseTimes: benchttp.MetricsTimeStats{ + Min: 4 * time.Second, + Max: 6 * time.Second, + Mean: 5 * time.Second, + }, + }, 15 * time.Second +} + +func runnerStub() benchttp.Runner { + runner := benchttp.Runner{} + runner.Request = mustMakeRequest("https://a.b.com") + runner.Requests = -1 + return runner +} + +func checkSummary(t *testing.T, summary string) { + t.Helper() + + expSummary := ansi.Bold("→ Summary") + ` +Endpoint https://a.b.com +Requests 3/∞ +Errors 1 +Min response time 4000ms +Max response time 6000ms +Mean response time 5000ms +Total duration 15000ms + +` + + if summary != expSummary { + t.Errorf("\nexp summary:\n%q\ngot summary:\n%q", expSummary, summary) + } +} + +func mustMakeRequest(uri string) *http.Request { + req, err := http.NewRequest("GET", uri, nil) + if err != nil { + panic(err) + } + return req +} diff --git a/cli/render/testsuite.go b/cli/render/testsuite.go new file mode 100644 index 0000000..63714fd --- /dev/null +++ b/cli/render/testsuite.go @@ -0,0 +1,63 @@ +package render + +import ( + "io" + "strings" + + "github.com/benchttp/engine/benchttp" + + "github.com/benchttp/engine/cli/render/ansi" +) + +func TestSuite(w io.Writer, suite benchttp.TestSuiteResults) (int, error) { + return w.Write([]byte(TestSuiteString(suite))) +} + +// String returns a default summary of the Report as a string. +func TestSuiteString(suite benchttp.TestSuiteResults) string { + if len(suite.Results) == 0 { + return "" + } + + var b strings.Builder + + b.WriteString(ansi.Bold("→ Test suite")) + b.WriteString("\n") + + writeResultString(&b, suite.Pass) + b.WriteString("\n") + + for _, tr := range suite.Results { + writeIndent(&b, 1) + writeResultString(&b, tr.Pass) + b.WriteString(" ") + b.WriteString(tr.Input.Name) + + if !tr.Pass { + b.WriteString("\n ") + writeIndent(&b, 3) + b.WriteString(ansi.Bold("→ ")) + b.WriteString(tr.Summary) + } + + b.WriteString("\n") + } + + return b.String() +} + +func writeResultString(w io.StringWriter, pass bool) { + if pass { + w.WriteString(ansi.Green("PASS")) + } else { + w.WriteString(ansi.Red("FAIL")) + } +} + +func writeIndent(w io.StringWriter, count int) { + if count <= 0 { + return + } + const baseIndent = " " + w.WriteString(strings.Repeat(baseIndent, count)) +} diff --git a/cli/signals/signals.go b/cli/signals/signals.go new file mode 100644 index 0000000..3425d45 --- /dev/null +++ b/cli/signals/signals.go @@ -0,0 +1,17 @@ +package signals + +import ( + "os" + "os/signal" + "syscall" +) + +// ListenOSInterrupt listens for OS interrupt signals and calls callback +// on receive. It should be called in a separate goroutine from the main +// program as it blocks the execution until a signal is received. +func ListenOSInterrupt(callback func()) { + sigC := make(chan os.Signal, 1) + signal.Notify(sigC, os.Interrupt, syscall.SIGTERM, syscall.SIGINT) + <-sigC + callback() +} diff --git a/cli/testutil/http.go b/cli/testutil/http.go new file mode 100644 index 0000000..34b660b --- /dev/null +++ b/cli/testutil/http.go @@ -0,0 +1,15 @@ +package testutil + +import ( + "bytes" + "net/http" +) + +func MustMakeRequest(method, uri string, header http.Header, body []byte) *http.Request { + req, err := http.NewRequest(method, uri, bytes.NewReader(body)) + if err != nil { + panic("testutil.MustMakeRequest: " + err.Error()) + } + req.Header = header + return req +} diff --git a/cmd/benchttp/main.go b/cmd/benchttp/main.go new file mode 100644 index 0000000..82e27c7 --- /dev/null +++ b/cmd/benchttp/main.go @@ -0,0 +1,58 @@ +package main + +import ( + "errors" + "flag" + "fmt" + "os" +) + +// errUsage reports an incorrect usage of the benchttp command. +var errUsage = errors.New("usage") + +func main() { + if err := run(); err != nil { + fmt.Println(err) + if errors.Is(err, errUsage) { + flag.Usage() + } + os.Exit(1) + } +} + +func run() error { + commandName, options, err := shiftArgs(os.Args[1:]) + if err != nil { + return err + } + + cmd, err := commandOf(commandName) + if err != nil { + return err + } + + return cmd.execute(options) +} + +func shiftArgs(args []string) (commandName string, nextArgs []string, err error) { + if len(args) < 1 { + return "", []string{}, fmt.Errorf("%w: no command specified", errUsage) + } + return args[0], args[1:], nil +} + +// command is the interface that all benchttp subcommands must implement. +type command interface { + execute(args []string) error +} + +func commandOf(name string) (command, error) { + switch name { + case "run": + return &cmdRun{flagset: flag.NewFlagSet("run", flag.ExitOnError)}, nil + case "version": + return &cmdVersion{}, nil + default: + return nil, fmt.Errorf("%w: unknown command: %s", errUsage, name) + } +} diff --git a/cmd/benchttp/run.go b/cmd/benchttp/run.go new file mode 100644 index 0000000..ce84726 --- /dev/null +++ b/cmd/benchttp/run.go @@ -0,0 +1,129 @@ +package main + +import ( + "context" + "errors" + "flag" + "fmt" + "io" + "os" + + "github.com/benchttp/engine/benchttp" + "github.com/benchttp/engine/configio" + + "github.com/benchttp/engine/cli/configflag" + "github.com/benchttp/engine/cli/output" + "github.com/benchttp/engine/cli/render" + "github.com/benchttp/engine/cli/signals" +) + +// cmdRun handles subcommand "benchttp run [options]". +type cmdRun struct { + flagset *flag.FlagSet + + configFile string // parsed value for flag -configFile + silent bool // parsed value for flag -silent + + builder configio.Builder +} + +// execute runs the benchttp runner: it parses CLI flags, loads config +// from config file and parsed flags, then runs the benchmark and outputs +// it according to the config. +func (cmd *cmdRun) execute(args []string) error { + if err := cmd.parseArgs(args); err != nil { + return err + } + + config, err := buildConfig(cmd.builder, cmd.configFile) + if err != nil { + return err + } + + report, err := runBenchmark(config, cmd.silent) + if err != nil { + return err + } + + return renderReport(os.Stdout, report, cmd.silent) +} + +func (cmd *cmdRun) parseArgs(args []string) error { + cmd.flagset.StringVar(&cmd.configFile, "configFile", configio.FindFile(), "Config file path") + cmd.flagset.BoolVar(&cmd.silent, "silent", false, "Silent mode") + configflag.Bind(cmd.flagset, &cmd.builder) + return cmd.flagset.Parse(args) +} + +func buildConfig( + b configio.Builder, + filePath string, +) (benchttp.Runner, error) { + // use default runner as a base + runner := benchttp.DefaultRunner() + + // override with config file values + err := configio.UnmarshalFile(filePath, &runner) + if err != nil && !errors.Is(err, configio.ErrFileNotFound) { + // config file is not mandatory: discard ErrFileNotFound. + // other errors are critical + return runner, err + } + + // override with CLI flags values + b.Mutate(&runner) + + return runner, nil +} + +func runBenchmark(runner benchttp.Runner, silent bool) (*benchttp.Report, error) { + // Prepare graceful shutdown in case of os.Interrupt (Ctrl+C) + ctx, cancel := context.WithCancel(context.Background()) + go signals.ListenOSInterrupt(cancel) + + // Stream progress to stdout + runner.OnProgress = onRecordingProgress(silent) + + // Run the benchmark + report, err := runner.Run(ctx) + if err != nil { + return report, err + } + + return report, nil +} + +func onRecordingProgress(silent bool) func(benchttp.RecordingProgress) { + if silent { + return func(benchttp.RecordingProgress) {} + } + + // hack: write a blank line as render.Progress always + // erases the previous line + fmt.Println() + + return func(progress benchttp.RecordingProgress) { + render.Progress(os.Stdout, progress) //nolint: errcheck + } +} + +func renderReport(w io.Writer, report *benchttp.Report, silent bool) error { + writeIfNotSilent := output.ConditionalWriter{Writer: w}.If(!silent) + + if _, err := render.ReportSummary(writeIfNotSilent, report); err != nil { + return err + } + + if _, err := render.TestSuite( + writeIfNotSilent.ElseIf(!report.Tests.Pass), + report.Tests, + ); err != nil { + return err + } + + if !report.Tests.Pass { + return errors.New("test suite failed") + } + + return nil +} diff --git a/cmd/benchttp/version.go b/cmd/benchttp/version.go new file mode 100644 index 0000000..94d3527 --- /dev/null +++ b/cmd/benchttp/version.go @@ -0,0 +1,21 @@ +package main + +import "fmt" + +// benchttpVersion is the current version of benchttp +// as output by `benchttp version`. It is assumed to be set +// by `go build -ldflags "-X main.benchttpVersion="`, +// allowing us to set the value dynamically at build time +// using latest git tag. +// +// Its default value "development" is only used when the app +// is ran locally without a build (e.g. `go run ./cmd/benchttp`). +var benchttpVersion = "development" + +// cmdVersion handles subcommand "benchttp version". +type cmdVersion struct{} + +func (cmdVersion) execute([]string) error { + fmt.Println("benchttp", benchttpVersion) + return nil +} From 66c3a8502a7002febd5b754a7a41134b95428b73 Mon Sep 17 00:00:00 2001 From: Thomas Moreira Date: Sat, 1 Apr 2023 20:29:22 +0200 Subject: [PATCH 2/4] chore: relocate build script --- .gitignore | 3 +++ script/build | 35 +++++++++++++++++++++++++++++++++++ script/build-healthcheck | 17 +++++++++++++++++ 3 files changed, 55 insertions(+) create mode 100755 script/build create mode 100755 script/build-healthcheck diff --git a/.gitignore b/.gitignore index a960199..2a925db 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# Binary files +/bin + # IDE files /.vscode /.idea diff --git a/script/build b/script/build new file mode 100755 index 0000000..09dac45 --- /dev/null +++ b/script/build @@ -0,0 +1,35 @@ +#!/bin/bash + +platforms="darwin/amd64 darwin/arm64 linux/386 linux/amd64 windows/386 windows/amd64" + +version=$(git describe --tags --abbrev=0) +ldflags="-X main.benchttpVersion=$version" +tags="prod" + +cmddir="./cmd/benchttp" +bindir="./bin" + +# clear bin directory +rm -rf ./bin/* + +i=0 +for platform in ${platforms}; do + ((i++)) + + split=(${platform//// }) # split platform by sep "/" + goos="${split[0]}" + goarch="${split[1]}" + output="benchttp_${goos}_${goarch}" # e.g. benchttp_darwin_amd64 + + # add .exe to windows binaries + [[ "$goos" == "windows" ]] && output="$output.exe" + + output="$bindir/$output" + + # build binary + GOOS="$goos" GOARCH="$goarch" go build -tags "$tags" -ldflags "$ldflags" -o "$output" "$cmddir" + + echo "[$i/6] $output" +done + +echo -e "\033[1;32m✔︎\033[0m Build complete!" diff --git a/script/build-healthcheck b/script/build-healthcheck new file mode 100755 index 0000000..4f9b2e9 --- /dev/null +++ b/script/build-healthcheck @@ -0,0 +1,17 @@ +#!/bin/bash + +goos=$(go env GOOS) +goarch=$(go env GOARCH) +benchttp="./bin/benchttp_${goos}_${goarch}" + +expVersion="benchttp $(git describe --tags --abbrev=0)" +gotVersion=$(eval $benchttp version) + +if [[ "$gotVersion" != "$expVersion" ]]; then + echo -e "\033[1;31m✘\033[0m Error running ./bin/benchttp version" + echo " exp $expVersion" + echo " got $gotVersion" + exit 1 +fi + +echo -e "\033[1;32m✔︎\033[0m Build integrity OK!" From 81adb193ca0fa9ccbfbcc633177ca8d743845216 Mon Sep 17 00:00:00 2001 From: Thomas Moreira Date: Sat, 1 Apr 2023 20:31:16 +0200 Subject: [PATCH 3/4] chore: add config file example --- examples/config/test-suite.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 examples/config/test-suite.yml diff --git a/examples/config/test-suite.yml b/examples/config/test-suite.yml new file mode 100644 index 0000000..58bb3cd --- /dev/null +++ b/examples/config/test-suite.yml @@ -0,0 +1,20 @@ +request: + url: https://example.com + +runner: + requests: 10 + concurrency: 2 + +tests: + - name: minimum response time + field: ResponseTimes.Min + predicate: GT + target: 80ms + - name: maximum response time + field: ResponseTimes.Max + predicate: LTE + target: 120ms + - name: 100% availability + field: RequestFailureCount + predicate: EQ + target: 0 From 7a41638b722fdb51ca9cfac30ba2c40528d8f2e2 Mon Sep 17 00:00:00 2001 From: Thomas Moreira Date: Sun, 2 Apr 2023 16:24:28 +0200 Subject: [PATCH 4/4] wip: main doc --- README.md | 173 +++++++++++++++++++++++++++++---------------- doc/demo.gif | Bin 0 -> 71724 bytes doc/test-suite.png | Bin 0 -> 50875 bytes 3 files changed, 113 insertions(+), 60 deletions(-) create mode 100644 doc/demo.gif create mode 100644 doc/test-suite.png diff --git a/README.md b/README.md index 308c24f..0fa9364 100644 --- a/README.md +++ b/README.md @@ -16,93 +16,146 @@ ## About -Benchttp engine is a Go library providing a way to perform benchmarks and tests -on HTTP endpoints. +Benchttp is a command line tool for end-to-end performance testing of HTTP endpoints. + +![Benchttp demo](doc/demo.gif) + +You can define performance targets for an endpoint in a declarative way and run them from the command line. + +The test suite will exits with a status code 0 if successful or 1 if any test failed. This makes Benchttp very interoperable with a CI. +You can making sure your changes do not introduce any perfomance regressions. + +![Benchttp test suite](doc/test-suite.png) ## Installation -### Prerequisites +### Manual download + +Download the latest release from the [releases page](https://github.com/benchttp/engine/releases) that matches your operating system and architecture (format is `benchttp__`). + +Rename the binary to `benchttp` and move it to a directory in your `PATH`. + +```bash +mv benchttp__ benchttp + +export PATH=$PATH:/path/to/benchttp -Go1.17 environment or higher is required. +benchttp version +``` -Install. +## Command line usage -```txt -go get github.com/benchttp/engine +```bash +# Command syntax +benchttp run [options] ``` -## Usage +If no options are provided, benchttp will use a default configuration with minimal options. +Only the URL is always required. -### Basic usage +```bash +benchttp run -url https://example.com +``` -```go -package main +### Configuration -import ( - "context" - "fmt" +You can override the default configuration and fine tune the Benchttp runner by either providing a configuration file (YAML or JSON) with the `-configFile` flag, or by passing individual flags to the `run` command. - "github.com/benchttp/engine/benchttp" -) +Mixing configuration file and flags is possible, the flags will override the configuration file. -func main() { - report, _ := benchttp. - DefaultRunner(). // Default runner with safe configuration - WithNewRequest("GET", "http://localhost:3000", nil). // Attach request - Run(context.Background()) // Run benchmark, retrieve report +### Specification - fmt.Println(report.Metrics.ResponseTimes.Mean) -} -``` +Every option can be set either via command line flags or a configuration file, expect for command line only options (see below). Option names always match between the two. -### Usage with JSON config via `configio` +#### HTTP request options -```go -package main +| CLI flag | File option | Description | Usage example | +| --------- | --------------------- | ------------------------- | ----------------------------------------- | +| `-url` | `request.url` | Target URL (**Required**) | `-url http://localhost:8080/users?page=3` | +| `-method` | `request.method` | HTTP Method | `-method POST` | +| - | `request.queryParams` | Added query params to URL | - | +| `-header` | `request.header` | Request headers | `-header 'key0:val0' -header 'key1:val1'` | +| `-body` | `request.body` | Raw request body | `-body 'raw:{"id":"abc"}'` | -import ( - "context" - "fmt" +#### Runner options - "github.com/benchttp/engine/benchttp" - "github.com/benchttp/engine/configio" -) +| CLI flag | File option | Description | Usage example | +| ----------------- | ----------------------- | -------------------------------------------------------------------- | -------------------- | +| `-requests` | `runner.requests` | Number of requests to run (-1 means infinite, stop on globalTimeout) | `-requests 100` | +| `-concurrency` | `runner.concurrency` | Maximum concurrent requests | `-concurrency 10` | +| `-interval` | `runner.interval` | Minimum duration between two non-concurrent requests | `-interval 200ms` | +| `-requestTimeout` | `runner.requestTimeout` | Timeout for every single request | `-requestTimeout 5s` | +| `-globalTimeout` | `runner.globalTimeout` | Timeout for the whole benchmark | `-globalTimeout 30s` | -func main() { - // JSON configuration obtained via e.g. a file or HTTP call - jsonConfig := []byte(` -{ - "request": { - "url": "http://localhost:3000" - } -}`) +Note: the expected format for durations is ``, with `unit` being any of `ns`, `µs`, `ms`, `s`, `m`, `h`. - // Instantiate a base Runner (here the default with a safe configuration) - runner := benchttp.DefaultRunner() +#### Test suite options - // Parse the json configuration into the Runner - _ = configio.UnmarshalJSONRunner(jsonConfig, &runner) +Test suite options are only available via configuration file. +They must be declared in a configuration file. There is currently no way to set these via cli options. - // Run benchmark, retrieve report - report, _ := runner.Run(context.Background()) +Refer to [our Wiki](https://github.com/benchttp/engine/wiki/IO-Structures#yaml) for how to configure test suite. +You can define a test for every available [fields](https://github.com/benchttp/engine/wiki/Fields). - fmt.Println(report.Metrics.ResponseTimes.Mean) -} -``` +#### Command line only options + +| CLI flag | Description | Usage example | +| ------------- | ---------------------------- | ---------------------------------- | +| `-silent` | Remove convenience prints | `-silent` / `-silent=false` | +| `-configFile` | Path to benchttp config file | `-configFile=path/to/benchttp.yml` | + +## Use in CI + +Benchttp can aslo be used in CI. A GitHub action is available [here](https://github.com/benchttp/action). + +## How does the configuration work? -📄 Please refer to [our Wiki](https://github.com/benchttp/engine/wiki/IO-Structures) for exhaustive `Runner` and `Report` structures (and more!) +The runner uses a default configuration that can be overridden by a configuration file and/or flags. To determine the final configuration of a benchmark and which options take predecence over the others, the runner follows this flow: + +1. It starts with a [default configuration](./examples/config/default.yml) +2. Then it tries to find a configuration file and overrides the defaults with the values set in it + + - If flag `-configFile` is set, it resolves its value as a path + - Else, it tries to find a config file in the working directory, by priority order: + `.benchttp.yml` > `.benchttp.yaml` > `.benchttp.json` + + The configuration file is _optional_: if none is found, this step is ignored. + If a configuration file has an option `extends`, it resolves all files recursively until the root is reached and overrides the values from parent to child. + +3. Then it overrides the current config values with any value set via command line flags +4. Finally, it performs a validation on the resulting config (not before!). + This allows composed configurations for better granularity. ## Development -### Prerequisites +Requires Go version 1.17 or higher. + +Build for all platforms: + +```bash +./script/build +``` + +```bash +./script/build +``` + +Test: + +```bash +./script/test +``` -1. Go 1.17 or higher is required -1. Golangci-lint for linting files +Lint: -### Main commands +Requires [golangci-lint](https://golangci-lint.run/). -| Command | Description | -| --------------- | ------------------------------------------------- | -| `./script/lint` | Runs lint on the codebase | -| `./script/test` | Runs tests suites from all packages | -| `./script/doc` | Serves Go doc for this module at `localhost:9995` | +```bash +./script/lint +``` + +Serve Go doc: + +```bash +./script/doc +``` diff --git a/doc/demo.gif b/doc/demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..5bc231373a55a62fe488e7ce6b8ae37e970570b5 GIT binary patch literal 71724 zcmbrFWmFsA+V+D7El?zAafbqh7AY+S3PDPt6n7~OrBGao6Fj&>aQEO^++BjZYmws3 z%m2vpob{~pp7lyTBs242&&r-_u4~`FxkpA;T1eQC46O_0H{h=i6954I+Yb{H0Q|Qd zCNKaD23S8HwFWR*1Hje*Yij`18UTO-n4kbK6krVnK%oFQ6aat&nBV{~8~}v_;BWu} z4geqkOb7rN0e~X_2n68%arYhoz6T)g0r&Thr%`1Br~;T&nV3|;OsW8|Dic^03|0kL zt1?-uf~{4ptyQ6q+fY?7RMi@)3Wch|p{h)9RWMxD8mmqCGBB*r{09wQZEdoP}tf56vXb~J* z1b`QT;YHT)A}G8F4liOt6j>vR;D{mwqKN6f2z*~;eP49{_zg$G;YcO~5{y7vBal!8 z5`jQ6-6O&G$oqTbU(@&h_n}APD!%`$BKc0~JwFdG8p`8n^f&0}Bmg9U>#vdjx=a8p zq&GSuB%k?&})p9O@k$8SWn+ou~t#&(8YIAp#fYmlhY+mNz%n zH&<7-l#h8Y-$}NWn9E)em4BA5Q<(*3As?0}=J`6gQF4Wo~R|dl6 zXAc^iZcg`y2c1urUDVfWn%3*e*E%3iI2DInDmQwd&*UQ%T&uPQ5}#X*47pbCjKJQ8 z5`1uj?@dHy7M2AT7aru76!xb}yI)!_)EMuymQvN7EVsMju6($^vfJqPV|`n8KQ){t zksxXN~oLU~)+jKc&*%#Fi^mNk;tSwK)ptS5MOs3?*%rX5TYEW&+AYzbo5P#;Bl z)-Mj9`OUWMH56TQ<2BXhw&L~d*-aBod@Z&Uf)`(m0N!5Eq2dyZ2aV#WPGOs2bFsZc zOMQinIVyVpKwglFg6fh1`$Obbko7<+Qji(WgTtN`!6L$*9V>Ucn-_1dwU@s{-LVPC zq2%>O!L%DggDRq`nrNVvw0BcfJB|CJC=SVWLM3V0Nn=w@*bW1`2&}9t`)G@;tA=z&Fj<>)2|LZ-F3lsAwShItQP)k@t>+SEsa$^XWQoxfp-^DAQ6orhT;iK`I0Vs4J$`~MBh;lI!#DzDPtWqBCn%8UY z%VnQLAM^UGmnA>!Y=F7i!+x;A=LG=$$(Z#|G%`C_1u(}*WCZ&Q#N8K1C03hrNoi+0N04l|y%xwCalIb$YD8$w9Uma|gc^2h*vVY7fFJYc zUUgkGy`2!I%P65Ji!mfX#g~EI|^lmH}EwK^=V?V))c<$PrGN<(K0{R zG{;;>yH+vi3w{#VpZZat8`_V_NQ4UzC=gC_N2)9-B#E zh3KG&#^P{Xc!tB2*v5b}4gtT;B97_nVir+m#}f#HEMgR3Xz_(;G-r`j_jPl-Rff9! zTD1uT)uRO~g;C*UQcm_s3pD-;v(wq2+JfLc`waz*Jq@GL?31BB9*-1-8xpu8df(xk zMFuuA(xWu=NfE<>p&nUGjI#Z*T2;}B%}kZ;*WHTtXULdzJZ3f-_JL2W<`Fhw#vFTn z1FDV0aTTAxaA^wj1>rIAIBSBXZa*coptCSK%=PJ$sU${Fvph#h>NmBVNE-9V z6Udewws;v4ix9|tS=~Qu<5r!r>XF9PD=Tk5UzNK1I$y-9U(uoVMcT-_JicJr(Jw6L z>F02>H-4@|UNbQn$j>a|m)Jv=lvBxAAJ`YN;(gWrJr5ozrp8F z;`AR6rK~9cixqu}8Td?{^f~7v^PWt$+;pK9X^}cIj$^=9ZZgjPvRGKPP{VkBx^f+! z_l22LV|*Yw6X&wjHk?yuheN&Lnj#JS5;ZJbjSkbA3W!*V(Qxui zwVPmxWk88BMbk`gm1RaC*XM#oNxB0IcM#6c%A5_in*Zyvt z8Rl`Sqe@#8LtVy^rl-Slqi3ueOH_r3I3n>TXNFxE&8nt4>?s zvJh6eo%qlr5c6tyTVVq}3j6I)Aj56R{`7V#P*Jc*o!j_*)BJd7#APwPn3ZM*d?fz2 zK>jz~Jw2<&$)Jk(ae~G&uTC zQfAvQuj&G54s{Y17Ip}(s^W%^9h;h#-o@26XMQ+wU04X2tre_0AO31{aJPcXQd>VM zX6t~Px`_4ay8UUyu~_Tf+G${Y7o%RiyLR(3sI9(dZTiIXu4w~+tnU*W*$8}ozX_CS z=ujCsi)&ikHFOTBUHMZznZ zZN=w8Q~7_shcDjm3-vb6RKJPMaBtZ$K;F(qd0k}2JRF*SbRYjA=~$?~bY#a`zZggB z+&G#xqCF})dpY9#HdO4;8`-pqw(=BNli+z2C?mQ~{^R=d{KGGfuXjsHdRKjIo@dI= zCM&Pnu0|YM2mGFht-b%~HpS8UEB~YCy87rfwLI-vZ14R6xBd;H^UZl(Tknq8=-txY z@>KQ{uf3q>_p8ONmnAZuXOZO|n>&BbM$5&HEuOpYs=U3OzUn=xTe&-S$jI+{^5a+c zM=y`($osyJKh9@I@4ZHsf6qp~z2AB3dE3_Z=X$o~>I&)k=kCYS7PD?eZl7bTwvx` zY(6g#{v;ZHPj-Dj?fS<|_-WMpX(a{_@%u|$2k3zUd9(awUHna40!gLP_bX2yb$CI7~-n|;X4ofSOEF98>l7}6nYK$ zS`ZWq35wSUR{j-~41}bxxdmMZTS6c(bBM(b#J&##ML@noLQ2?zPlJLJK%o`D(6qkb zT8+>Yp^z+4NFyS&8DU-s3M+L9DFcV~n1}SaSX8rx4%LTgLPG06;bTDmR&dBnedw%4 z_&`EfluKB#M%ZFO$Px${VXzf8>=Ln!_%X>Aepnx|l^=e39XiJri2&Jm03%j*!#5Hm zH-*9;z~DVd1S$nIbtmG;1&X;Bd;y9)M?f$8pv1o;Z`mS9TqB=aL=h)NZHYtC=Ax*B z9kGL<3>49Cv7%TSplo|k)_!VGe2*+}RW4I||WHn>Rg=6IQVsA2IgoWci$y&bMi_vh6D+f9=qL5n>BYc9^vB0(xC!Nmd}tQqf>6mL2g>wS~pyGQtS zFCOBW_(w1yOct3CE-UAL6X(XB6y=&w_cAe2Gm$blK6x%7DJd)@DKU#8IrB0x!ZkUs zK`Tx;DSj@w9GS~} zahoB?fy^Eh%wlNF7IFK)dYjFLlOrdXDK($<{x<8AW9Cb(bfKc04~?0A{n?-9vsJW6 z-?`;Vgygz^%i)>N)w#{xxy%t5$l=q9_^N2a9dC~K$YTFSXNY6-k4K*8wa;9HaFi7D756ljEZvs& z-y-v?u}Vj^%F;wicjZbOlS_Zjm(3QHx)qhIa+I$n7oKyJ@yM3lT9#QSm;EU!8|y1O z*)K!Yt{8AAxk#?K-Y>lzDBbESzoV?AyDcZdt$1r$fsR{F(Nsw_T>)&WxUwv#9jsVo zsbs;eJl3q_u&UI9RHEHg@laLQT~sm@R|w)(F;Z2rI9I(6trDxR5+AJk$zDw@59cke z9EVoRSydAZ!UYzJ#HecCEX2Rlu93Kl09(PeQff};;X(&+rn?#=_i7y08dK4lHnSQ_ z_ZqQ=n)ib>U#aSJtKh~5H6~VdE_d)q|5^|CTIz;c@4;HXomv^rI{$?@SE^d)Vq{%N zO1%h`g4aS_v{i(Uc7v}~Xb^5)KvP3fQ=q|JefVHKOtkU)-Nz{R#u)dY_@>5$rf+G3 z4as+nt-JNP@=Y1qOKp2uxkaL21{Y95tu9KLHAX?io^-a1KTIn&fSi|aBs*m8Q;S}oc- zgxk7q)mBf{$`s#vAKJRu+X`50)nRGtm2Y2i_uWisztnEMac?u(Z+oEn*+kw>!qq-% z+Wt$sozkNnfAQxiPCa$0TYCqW?tC+x_T+Kfzn*DL`IEOvgncb0nH#iP?*PS(lL z+^%Kar5on=@vzINSzlSFMBxzfhhFUD!`CwM)*_7oNEb7fc=zI`1Fh6BH^PcIht`Om$~mO6e?GW-YlXtsiE;F3spHO@04>Fv6d47)Hvtwji93$UGhp zo-K?%_y}!ogozqL&l6!Ej!1o=3453erzwgOn};sFkF}Z0PishNnRhImD{bkA(JW+^ zlIDJxucdikC^pxqJ4doTADD({Uz#f){#2#ASZza6leSo=>(bn^P;j(Z)H~nCy*SCe zlvL{3o3_;Rz%{V6G&o#1MzcIDw)_P$w|%rQ`(bHsxNv@Hc|rHv3eC#0m`KBi<;#b~ zbnT^1o24C^MU4Grz@KF)<`wieE6>AMfL<#&UKM{@RtU;g2wRs|=~q$o*6@v1LCdqa zwkzvtt9D&0yGtwk-0Pz@i6zS_cEo-zRYdp5{On+91X_0Guw7Fzn8>}O5FT$e9p7gth4dLYfCMCYo>QohjvWy z&sM*}meHS$Hjzz6uT8UvO`OFoYp)@LKiiS7w^bCk9Tf4k%C^mIx81z#ZI*YO@pim< zy6uYx@`CL z3inge5Bf$9V(K?X{v5oaKb%-D?zTPXu|29U+Z!r7Z2AMq7<+^dZ;saA6iw?LY}*bD zmK`j%9?$=&U-@&qC31X5o4=)ZGRqS?mwwW}e7r|1dHUz1R^$ZrN9C36$;`;w!}1aK z=<)3c4FGxSFLFve3d8(yjPY?Bzx?>V?35ZAvP$r4SM(P{c^awy8F`zNqcJLO+b_Jf z6N)ElsAs?UPxct~&+{pOf5Ax%l1DDdMT*vmf&zHtm8hsvDF07~Q2<YVC+=?(XUBt7Aq%@2Tw{8=sh*svDl}Ru)9Sq9a$9BNjI{w{i!4 zdymtk4;gB{L5~y3Mp_ zbg^sjFi<1uk|+ieS%xw>wFwzazHv@hE3pYk7#p(Cze?6-Qp*N)uak!HV`oWe#4vN9 zCqoHBs^rZW$t<>I<16Y1aEm8Z_h$+N3^_xZ!(m9vf;6gW zrC7%Wynb!g(PFMT?MV(A4CA!%cP5&Z8m|y@ncdpY1H@7b4*04=h*{;D$mudU50V=@ zQg=C4Y9Pn9+^MFg?bUvA;%Y*{YkV^~7^E*9cGE(J+;e0;v=MmZDx4!P9Ck9|6wC6HmFs-Gx~0~ z0iPj*Z?RH(&g{UyPLX4NwHMFilk(OFNo+laS#o~`=S=#^mWfQ^XAD98LBJBfQ7-%3 zpB*8^wohVgi9N&C zXVr`1O@*>ZZ;-+=K5Yl14PWrNx;-TS7 zs?QjHNRzJ@EN4zI=OlR7&im%{716*#w5qmqAbKH;jMW&hg3yBR0eSQR1cSR}y~GUZ zRRLob`)Rbp4GgJi#G>FTkC1iq>KdtDEBbz|5Nl_Pi#m3r^eO-cS61WRM&^PXRvvSM zG>&A3AKX&icORquGq-;;?m!Vr>ez6kR1vAT>K;@oha%RZI~l3vN^};fMe>#0xYLCw zOUukX2`kZ2D#R(>UN>T%_}QhK`f zxYWMp&fjocI;2hu9GS*{xccPaXPvIbZZsszky@HvtIPC5%wfghvd(7BfkryP44mGg zIK}MPQQH&dx+$b@!MQ~|8!*-fnihG^zsjZtMfDy}&!@spq;~K?bYBcJZwxjdBls;< zwrQIwvfgLDb~QD@^H}s^`0h5+oKG~U`kWVz+-(5;5(A^;|vxLoWgR^sMa>=^F}nfL}so~w5Qa?BZT2|qD( zfq9q|Pv2xfRb6#*xM`*%L*=TnhBTCYSuObl#1uNo!p`0cr58kwpJmcr5HW7#8ij@$qmy@O=-F47&XB6 zt(#NV4`TLFL3<_!KA6b@YI83D>IMC8^nsl?H=lg|+z;?YF@fzEwjCHm^{}4xD@if! z$;+-A3csZP)nkqS&hYBV|BS% zWVt$H3iR(=G-xjZI~0AGUBkW*YyBkE%c@2PeJ16PrLg*aO)3!A*j=DXMa+2D`>KOK ztLTy|?)4JlV-5?0tgj001E3fJhYx3_mL@5`9e}ig81OO~(Je{$x;H%ErI_maTO8~$ zgDyy`#>9`zgZ-Zi3~bpcpy59#)HO6%J9+q}EsB{^V!GNXSG}?#b%Jv8x?$oZ1cJG$ zu6s3y$ebfwk4hvbqhQOFGmV(j`T*17`6&XU8b&-GW%-MMWz?OznhF+1y{9OasfIGu zzqXI?Cd2kLcPLSt2S59nKf}ZV02W1ykltY=-Yawx-Z{EYB$l)x=m$|k>+}&iT%jRb zNr|uRh*tfzsgeS084L(nCY)vm#-D$wBJ3D02s!S`BCt?R6?l27qofrNmA!~Ap)Y6o zk~JCEc-rsKWmoL)k@lj;sEbEU3Q}tR88@`<%^@}!xhC;bwkF>0`ynW`&0Y(6zUI%H zTt0pakBu~^EObh~KB3A$0J|EP2CncN5r`m`A{2g0h>A6Hp_QI4bc^%Z|JY%UdM=DX zttaF?siP!kBV6q^yx&v9QI-p5fL5X+%PG51SuFn<+KoC}4_{Da3h=@9OdaY2FQXB| z*E)I5AKFl!Um09Man7yGyC9guio~}xRGvk|kMQL63LSm?`l%&M6}>pkQ`S~q1ZuBV z+%hjOU+BXvH&v=sQ3~4Cx3X!QkA=iFau|>`hAvc`+2ISP#d4|Ox9Fwkf4QNVRP1e9 zrCPp9DfYzin%rBl7z=W{pfP*+QlB3HG_R(jur0ueUa1G-;z1N>5fj7ia>vhbYrR$9 z{(7EASHAN*@90$VrYR$|l-KR8m8L&qYAlCmJvDR0$B<{5ExuFNN^8RTtyve+TtTcE z%4O$HO(KH7BKn918R@6;-cf5T_*BP>HGG;o%t{ZWt>)yci>R(wX!v7DB)Vj4xK=uC z_C#<&drjfpYwpHWm8NAG8wF%t+pYf6OE#;TCJ2H9HQMlFfPS?tPR-QAvoCVQt!EJ{ z=~>}9W&S0cM?`z(PqI!>u0_eUgO+i(?h>`eO&qjSvDI9QuFwBFuUC$=9W4*wN9**IC76~7`U1ln{ z?+8CRzNxN?jIVbfh`5hHkxk8YgGAf;^>G#UvZH{%gl>siphuJq)hpmY_J^-P88$x~ z%K(1QXd!O6lm9G^WuKh{=EvedJ#zJ+-WMQC6PnOoI|oy7KO%{a{MYJNw8@UZ4?W7w zogSeY&f=_rB;CQ8wRjf0TGsW>0fa$;1|f^v!Kq_Gp_f6~^+9QUY!T)VOev4$b1z4b z`Tn-Hg3IA!d6w0dY)N zx`BAD5^7KZz7#XkRE@+xcQvf%5|4M)@d71WhbbJh-W&o5R;^W4E|8Ij8vl~AES#0N zL_{vv)AWIZGQ|Pd%)*3;`jLJCSfsM8`4${i;R*cE@xCyHponBr+)acQ4FupbX$#Wy z<70?|5k|Y^L>xlGDI3C&WRauWf%LIB=ys9Y`H>h7(2D5y#5K?#rXMd7O+yLQd*5NN z(b3ng5}_wiJkO%27;{my5bUpst%JsPkNG9}fF>$fWOb5@BzHgF3(rHg(?Ng;%<)gQOH7MExc-wy~=B*H^gqgwWV)@}Obi4#*ZuV^on z;lrAjiN$1M));l(s#oj|4#bs=YA-PrmS~Vg8LmkkEsT%v`|Q1Nat>eOgMnqDFm9eK zuF{L(LRo@fw2#F%$=Tk?a7`^Q#(<=~#WmPr2rnauW zAuOx0rM0d7XGdq(U)5Frz+i228lc8>XmScRHjS8@UkDi)Ui1g9K2}$a%iDYV2Zu+; zC#R{bep#vkY`<=919vMP?f_^wo8N6>6oR%UgFuIho>`zp1P z*=Qs~Jg~+;$x7&;reZ_w$7I#7r8({xs<*)*{J5AEc5LWA01;LUd~azCdV#>ec^yl6 z_R0K0yNK@yHd8+NfAx z8mueVPqFxeL)-lPRIAYcDW~30edR_kG{G%gp`mJPF!6=e@=!zd&L~VWl=ed-d~dQq zrC4vcvF2d5!gw(KLsRY1LcPPm@^Dk#$x6E)?lZ;a`d=G;F`W7%%?;-}W7+Zjz>e=^J6ObAQSZdTaK{oQP+G{;^}teWLsZlY2mi_Ge1^Wm>vx*)EzKBffg zvwpVxlCuG>y2Gg@VAsoiwfKG3=4#1h zr}S#sU?~&0}JB0 z-OWj`z1=IwFT33@sXM+ssOaUnJA}{L-W}ENl-(USUmf3_v|~NLKkXv_djG4Bwfz2U z=+(*n`IyY}hl?rouMd|9v+{@Ei_RwxSF1tK|2SN4CVc&KvzuT3=k~Dft{@8iSF zi`lQphwGhkc#Fbsyy3jT?sb?OTmf?>Yu z`$^z->PLr{36ueM5GSAdvngcasP}b{HJ%3WhGpVet>bkKmDBnBt&i;y6+ODylSd!= zj7s$AW>Npf&9ur9e|NKj^1r#+F8nVyTRE+NbhCw%>t?UflRKohH^ApFIwZ#o2@P{L z4F9KV{?otyL5Kd0e>FBW{}2Bf8Xg%P^Nbvynx3(E_uu5|Up?CNf8){2|Mcib0QN5) zE&gvjTK<1{G}mAMYIOfEk7oU+M?a48uV?)~Nroqnsqh(<;BhX!{?lBpR)FXpli}ab zrO$tpwttre|9LKxSX&>nAmg7C_jq~#-lq8K?+}j-<)0AmKMxH-XD%xHmza6HOz8l0 zLHU+{#7wr|z~g0#L}!y19GjW_D`pm#mV4V))*oYLduMmAu4Mn{I1F%dcHUQdvAuS6 zyE}CE2MIvaie{Ckr|3FD4PNjAn@Y;V_%p7mR0vW0KDb;f0g=N>7)<f>XK||zQUTKf>rR8yRIo;^<`>mJO+~APh`9-Gfp}FxgYEV;uWki>8cfCv0`Ps)m zhQ9~4CX310(wy!tPd7$IziK|l%yyRhOypzC*jyO?Uhzifc#-B6L;4sqE$F*ck1+!p zbOwg7JjP7cy1`@2T+6!G&TX$jn6#=4A7iEu9B^Ow7&9oTz>P2_+Ja|}0^5n1VIsdl z^Z~b;yBkovGw^2AA0Lecd}|*1J*L3lui2Sh|J48SZshTa7~jeNQpn2c+CLTYkA=vuv-69~-&fZ+w|Dmse<=iq8vGB1==4?mLm}Y5 z79xKsq^~mj?+THv%K5uO`m1sW6L|kpNOj(D%A-QKqyg_o9~)VJFUrErAKMP093KWq z3di%60*Kgt#T0!kR>`(pO15JERHTP(M;8Pu$vy1tj>&Gu|J-mM-E8(YgMeRX zt9h#0A?)E*#qSe}BrJ@Ntw!JTw-qWvo zE9<<2c>`ELN?v%!~fza3znSj*&V0XG5#YknXn@TfPY8YnA>si)e|k2wz!;f4CC zFDrnf2Qm^&Fko&hOiHG)7XCU=(%4H3b8gsQc!q8>YVN+^nQ^p&BAQVI<4gA37jkE> zw&Dhwch}=JoHP~UsNLANpDP^;Z6`H*2X7}g5Nc*dS@+0>Cfmti z?8_!$aqOG3Lf&v#Fxx5$?d3+JqyEFvQ2|^ikHNEm`gdniM*Yva zi(taIZWu~Yni=uXmThE^{1|3-I<{nh!8&O{|G zAb9cA8wQTy&>i@jGiCQkpak#J7Y9~2O>hWO&C2Qv2BZnAZH>#m$H+Olwcuu}8%3^8 zz@6eX=Hk&2_C=Ll)6tZ?>1UTruV$m4TcD~)`gn5~ONA3D4~y=8Q$r76F(VaEaxg*7 zc;#G{3PiyLIh&6isRO#;r<<(p1S;6-iS0#a!AX zC%0gYTr}RdotP`9$At0)|Jeq6m|+7LAgVK~|6|r>yqyk6H=Y6UI~>#ZMhA|skTv1c zv10q67_efy5TLfFhtS)x{D92M_GP#*umLjtr&d`UgE7G%X)Z)P1AUig{d=iS&v)3? z-KxI6c_RE0I&uDZ`I&T*X(1e;GkrzuLC5X!IUG4^`~&gHZ;~jAEGlpYqMG>a=gr&c z2Kz{-=;^x%_jFnPT~-=i(K^0{$yi{b(jn3b1zoghFrzFv0k{&MDCZ9yOIOaJ~7 zijwsQe#1iVHX_`YF`G+h_QPj7m<2oLoe0nzT|orJxyj;##jJ*YDJ=@Vf_FhBFTJ=< zS5*~|Y6#W;=Q$m%gpO=^9G!OxRDhFsgPf=Vl2c6dl%am5E=hT7<2yMIpS>myP?ALO zLIHsH<1&?E+arHSVl=O^oeL-5v8?Z#Je@OmU)$96);7DB=a$Jkk}}08HFscpwa&+d zbhk=n0)(rO{LO7UfXP|pbX=udBB8g^y9ru)qDOJo)MN@l{*I_#zCSlSYUlnk$54r8 zKHd5X2;WYUU%JCC!++*~zV+o8QAiP{$#DtK(@^ky!RTC zMfFMn{n`n5A6=3u34DWuF47qy;B{+hVAE4sG*dP+>_AQ5;Dt#j17udBEpt`)87KPF z_g#qsba|nlxctc&fAZ42rVYxEl>swMi@ z2hkTs1$|+jAgemAE+bco{mvGni8-Xm}DU)h!r^~ zVvpkJk!EnDp!vcP4I~PvV6aF&&mO@#lkmpYIPjc1Q|~WO`Dy860AvEp)>CV61KHz6 zuKCej0Biu?;X%b&S1v%cp#Rlr+zXgZ7d9R=fbgOnULa=k1O(`4vm2?o4(qVh(?*+b zb$V4X%&l*#y|BDZR@aJOW{qXIfH;n?@1SA(Dy+W945(|UsbOTiW|R3~m}g8CO(oBc z@?K6U;WK5lElD|moR^@3a;1jn+m4nlRd5{GYF#a$O zMsYIu9tBjAYid(CM)=LZJ+mYPMLHCTU*}(Ud5qJHoZ`~vFROBa=7qlqnS|QO@&=JxZQo=#4-bfiqXpyF$ubbBM4!yE8I!Ex>c38Cd z&rt!(bVUJ)Ss=K)ZpJ?6f*}=&VWc#OgPFlN@+=hN;1lkhRSZuT8ALKkt-P*BCiNHn zlo_|2XS-+IgQDxEnL$S~F3Qn63CwsF|2_sN3J$R^7QX=vmSqaMOaTfI-$fH$>Zb@L z%(;QkpcE6(UOw~f6(biD;CXfo+RhjFmG&kI}k*KqBr}+cP{?4AVjOgFm*J}(9W`{ zN?YKdIMs2-6i(}|3ui=@p#I8-lSO;UlRDu(Gdc=pdzwW++Qa!|JsGe*ltE~~=5Q_x z@Y;W}GcLgX$y6mdP-#0wg#olB}5`e-aO*W@N&%*Nn4JygSgHIn&n`XW~SG8o$me!b`nr`!| z`1!*rTw889+vd$5bZ20cUC$(d9%UZAA&h!? z=0~zU1}5Tt1B=l}yrH)Plc=v@!Mdejp3%=hPaXzYy9D6H3wJNaw}&spF$7FFH0(T8 zZDUor7x_>gh&7SYNKFzfzn5V4lsH<+G2czKccO{FY*nqIIIX zmitPFp$Dm70r~hXrPaBV?J#_VAe4ceZKzH%W7qU~RJ?J$HZ=6HbX&KIB6OF&$a4!}>VX*nUF9e-a`KF!;#+@`^y$YzeNbeD5v~hxrw(|B@CrBP zT~aeJHFMO-Q=@qarH}bBr{?^m+L=besGP}rtm_rwjTI1t-6Hs=D-(3hW@W*PgS6*Y zkillIe^1WFMNuEyekuVtLozqdn4ohmY49`sy#`}dsJgT0EH6G3os23 zAfd48N5ZeUNG}7J75C_N#S5ZY@Bv`ZiQiXJ@m4%1kb28_8uRYPH^Sf>Wx_YAIxV`3 zZ(McuFLu5enA=-Y1e)*Z=z{~S3*)uTwRNwxqrE|-EJ6w2Wx9Mg6?}P#3%P#p0*eDl zi|xJPtVkwDFePexLfl${YLz8dAg3DEE44~6caSu@q^d`ZV}!AEKLh8tSl)0I?I{(5 zqaCrLLTP;^Xe6O*ytpp6Kgi_b$8--zxu#83zw_^07xkZ>**6$7=NL^LAz87Q-$;Ue zS0%eNE&6VpxmaX-0)dI-bTXBK11JC-V(wBi7N&OfE*F`gEYQ}R>u8sqinN<{JKEHR zz_x3c-znW2M0$qVySH}k_rc*qv+hKf?%k}OHox5m$URQsA4gbW*vYWlDHz7B63Qiv zSW79Yf|^AzmkI)ofR}7LZwB{r}b%d z3JLs7#OOOl_p--=@F|Oc0~ww%X2F_+ivvj>2?qB(({3+wi6qD6EPFv_Ambw)K}Aav z06yc-)%I17QhHnq0dj~j$DEic&m6luL@*`AJ`I3$wXpH3G5S!v}vA+yfcLP4g&_ntN=04<7;Io)5PBpqHw*oszA|)gqxSuN5o6~}qlnQJS8<@ep)01jBLCPIKyQ}NhoNh) znIJf8Zo)cLU?F~WfjKM{XL4K@h_aub%9A_3NaVRX`vUrfP=d}-o>hqb@FjJeFac31G@FD4 zOjHJ+q0nijr>?o_zd(_9V0ktM7_kJRLD9(CQApcSL>H<>txU}^sd)jQc0>3E7D!qf zUa0~{euqm@DRcC|mE7T0PVf(*a9imbodsr0Ex59_l1j0ofmO|DP>rgUH*+rIAe8r4 zZ<4-SVk9gx{5!_b#A|p^c{qufkf7yvE4dB1vi3asEXL@&FFTZpWdIafe#XDy zrz`k^L8u19_~+|YEgiQ^|Un8HXJCHm?k^ zDvdFwAQ}e+v#^d2s=A%rkEkD}iC`bmIu2F5uyI8(CW-e@uHEjvOY)$3$$vbPAK45;eK;W23o(RY*A7?)F zwpcT0yWqroJJ}WtMZeqUyf8>vfd!*CVA}>{!2#NXi^IsWQ2{Xjy~Nkw<;3aT{&q&E>13e&7D%|`$u&5*7lwJM51iY ztml=KA=$IGkGoCgDEeXQ5KrbQXb-vmp5U^RpTgENmr2rfeQOlG^=bNP!DvIZXy)iC zcT}!%kmsEZ#Lyl6)ELu5mihCu&>$%yJ!?}syEp)s6nVOLKzjku2SWGw;=^MTr!>C* z6b1v5@wcJ)`VDs)Uyi&{H!~_=l5q$f?uCwswLIBW2 zHhG}ShN1)@z(`RwDv-gY?N^Dt`#sIItl4a&_$O@6P*6&_v$00^x8RJw`7o*`7rGe4 z)Pn)086>Iw^5t+Otlc+?3z1e!p8~13Wg3}le&JfdKvU=whEH=zry_Y&MJL%w$FQdU zL=imZJeaS!T%uK*^hIkcJiEN_sPu)d{a0y+%@}0Z2IQgC%6Qw<+KZB&AjimxUIJzW zARt5kA$dxM_tgi$3Xkrh8@z&m&pSLaa{=Qw`$i#^^cAK-Sv7|{Mv2da7LYwt3|SgQ z)Oz>iH6h_&S^NTXhy+a5Xw(_5s($qrnoKvn0()3MmwYDt$*Gob?N#W zSvl*MM3jSg(HI_Z@+AVpYDt4(;oN>k_w5&A5&&Wg2wr6SXSDX}U%f~hnswt5fI&{S zi9PhSJU+vkVBxWNv}p>TN+0l-z?pTRG^rFoiy=qqt*V@W8+$~UiN)Z%p`EustfcV! zNYeS1D*e_AVa(Qf?1GMLDk)hc7Pgvb)pWKtLyPENX5uoCyB}2oHYWIS`JTP_?m%eB z>ql{6%*94lWbmd--c}1SShdjQG^23(-FH%q13p6h zun1WDpwQ4|s|7uu$rjNE7hhBEz3-<|6 zs~9KoBo*vU3v_#jpTnkbiz<840+POH%yll*qs^+koR+dQk!7i3{EWp`8f@B3C^IJT zswWsC^CCer*)o(Ih>mUN&)EtSpXBf9`=qf#wruHi#i40BHt>^C0MF*opP?dsb^3uN z{TcJ{GgX-ag&Wj0+PKt!1LLO(+uCJX)qcV8^piO;xlw>d04&&=cJhUQg^ubqa*f;z z{UlLC52MTG2mU<1TT7{O+99{l$+_DT@em=|DVps}M^S*o7{58Gr0JZC*;A34M0(wh6y} zumK!`?ecXCN^(F=9#!eS{=s-s5YTKw^wVkG$OYXFLSUM4)F#?bu|moGmAdM{JiB8m zTF*-pBTt*j%yeY~6j-htV;z!yPbMvB2J~Tf?}gFvy1^`jX*)ml-kNXd+d!=IuCrA0 z1D~oQ$vRIW0!q;v+)sk@$wnS&a57q4JDsP83c78nLetjxUwg}5M3rY4$?a5$-YrvE zEC?MB%u{|Tk#4ES;`?3NjLy`Hsovh=0dI-N`)4pF{X96L7q+kw7)4t05~H)XP@Vq{q^cwstbI`d7vPC ztCo}W*@#IsSVwN&koQKpPt=pgh4QN;3rWQ~@7IyZEw!h|>)xCRU_ z3tIx?rBKOXAs3%5f}YA__r(k@X|lLKy7m)OuMDj~T^eJ$KUGqEdb3e<+Lk1pAgvsB z@ZmJr3ZX<-H1pY2r3VW>?>2arWoQ)ZDEPw3Pi{cjaEj=TrMhHK=XL(Rtt#s$&U9lI z`Ny{e*<*kFoI9$6#_PrOd9o&QFN&isilO=zlAadQx>K*m1`OPsSj^7QM z(Ie5NNg;Y1wZ->e1|^mjMsRar!`}JbAF+SOsHNj=?OeCS`Z~u0Hvg}kU zraa6ND=iYKO(-2Aa_-ltcy)Whyy}yKgodN9kz=K^h3BCE&(z!C4)*yu)=gt1uhgYL z%NO@*QIEGnfpVHb1~F)72lljfcgb>j2`8hU{+vpk@ZkVaX^5X1{(4)J`!NyDJqRsl zMg~elS)W}`b@e-ICSe`c_ekf9Y61UVaJAco90fzHBN@ML1qS-FpR_wl;#_VajaI2q zO<)_SB_h4(fYe=(7MkRS+ozt$;=|{l8H49RvW~k zjDq|q6VTxhdVp29^z|}RwkGTh>^PUMKp~01;HEF4x0L}J!4FfyZwx43`x#04mugit00?al?sEWh8B0l?)o|C$#9fyX9A<$onz>n7}Xfs0$76} z`wMYPfigE%)xPXPNOnU|9d~F&Nm7~_tHxMwuih!!=GqR-lJ&dfzDt6L{$?1>pq*~2 z1@ME^1mD5k4U8+xqMpC6CJ~vPi8fu$-f_gPHK|`UZuI?mjjMU?!%!PzVaE_MNq@1K zHm+(~=SLYiCE z>f0Q5HPeSL>h{U-yew1rDWPrY7a&+sco&;r6TrjYQXEag&P`intWxAG#*IwBRgYzL zIwcG{vB_2`zOxUnD7lU=k&-46iN!ma<|=&I_Kxc>i)mVbua=exPeQyMneu?VjN5pR zn4~}@bTc=WZA@5xQskjJ`!6$+cVfc#Qjzyo5!bsR=7CV9ePm(^Ta`VNxkWj;o1A^j zYxu71HEj|M;QDj@s;uy$Aw)qMAi>e1xz|F8gaznsg7ok*0iy1U#zAIfPnzKn(I~g)^$s6(1H|dsMR-f1jqRViJ;( zM$&N$8kYB{DUKAM2W{1+XlJVH%&Y6}uIu%nB>4Jh!Kd!q-=WJtx4!@Y3@q~}b@1={ zyc~2)elDo6=r6hKs?RGcdDQSXE(H$&bzaH8f8j$Qoj?1$rus;($rpdhWqS}-1P=8?#7x+>9}5+$VpW7UU4bnVz?A2X0m0Cs|DL1YRyay0F?nQTU#m9QrPHTq-^^oGwMh_dFi>^n9XB3RsRS6_$UQR zq?dR2Z2qP6`>6!_D=ww^0+^wPmpodl>Q^6~k)4ZubA>-X?7k=6z7#i)kfP8N^mm$y zFzhw`d3W(}>7B!i=j)a4KCG`k0JAG(9QwSQx~2X24b6`)f5#sY8#}>jZzP6){e?fO zmu-Y*vzYxC{`i%5e^Z0n;UyWaHN_MuOy_-JZjYB=u|;!qQ_GEUi}%U90zPe~VEwdoG9?HJ$PR%g z0WE$~%Es0s!eOS=%8tnTS;Y7q2NLWq#?`M~m5IEPYLq7qppH+hEP^~X-Y^H-IDRzq(y{gd3(XP zTHViH10W#UO3AfiIpD|b&YeM;snQ^F(Tc`dpJ8lQu^GR+^ET&cFSMmmub9>bNc^Ly6`Z zPFL^4XWZ8sN0?9GpIM;i`w<*0+mG#Iq4WO8xf8#B0MWGF06D$*OxuD+vNBbdD2?(l zuaRsE38`fbp%BnzO9ihAhU?!2 zFSPeWwy`ENX1o!^-v(0=+HC%U%_nXUjqJad2jowN^F&s;`S2=`IrLM?({4pVDvNEp zbL>JL?g*$oOPUx~lu`E;ZwpfVq{dzXc1T695zFIJet$m{OX=cx)uFuf5D;ce592WY zfxTY%!;xUO%%1)k!K~=T8QpcoR3bZrIKbIHyYx9&%(2%!sN&*{0K`Xu%BMfF2D}A* z!;`u35)qQRGCIl!Cjk_Eav+Pns_KyNgbx(dOAe+*(p8jEUHY)n?U+Kdk|uL5Vfrr1 z*JQj@WqX7}L@~1n&LlfN<)dl6>pMosrt?aHBrO1-2O+2)bM3tJMp%u1v8gIJYlm(y zwtb&~nQ>0U&`y`>OP%T(TqF%h?;x8zsQNKHBWsuhWc?9N+fW8*v`3>;qVPs0XwG

}5Lp`CCX2D$7v`8&#T;$g37a$Lg@neAMa4<)lSQkNaSzKub{h zTdCTTD%B^-$64ag3=jV9;MP=v;>df6HwY6Z!ljh)Pntr&PD)`bPPUYbXu1Fd!VAe`jeZCrPV%DX0{g?&M&8C_coMGzvoCwt5b=SylnjYh!)QOsxdp(u)gU;{Zuq#+I)7y*G=n`NOQbeJ(X{dya;wV% zn`jx%v?Cc8zmOR}0u{EVRB?4v5jxpW(Xf0dLZ(cRiZ(t@D0=O}T}=H%oHI7(9@DU< zvG4qNWz>zEm+}>|#7grT0X4MWbBWhOMEfs{+d0Iot;ZB_nuh z`t|owhFp3cf`O%*`)_%OE$0m1iX=ZBFYd5Y%&%9Zc=VGh+~M2mifTY0wZLYKx}I-N zTtJ+vA-Nj!uXimYhF{7j%GW#1po#cdVXAZ|9OjNeyle9~4Pv&!ix7h=rbcx%??)h1 z5#0g-{pkw(;fG0eqsvU-=JJwU9fRDsUrHui<2nQ^&Z*X_)1D=192FIP^e@c{B&Z)O zu3@0C8M0{Q>b9DG#9Plk7PD|L-DZE-nP&t=laTsza#|5I(%N#-H@Pc^$SO3zT3gz+ z=cyq<0**DI+E7Be$OQuqVDL33(WuX+I(8oGH{mBh>(YO|7{y8Pb?Fwg^?Q{zM)rA- zGBWS;NZyD-+RHAR0y6YDBk0_$14!V6@5jr`MAA|V953XmdTP6F80Gc8<+J=YY4-e7 z8d19|^d3BEL*egO(rhjwJUQJ25X)Ph-jnS4Hsh1zZw1?hNwjjo{^2M5!3FPtME(Lt z|IHxwzx)Jr@t^khKMi94<|q7p5c?-MS_l}w!U9{lp8sKgXP5rzCtQJ}{}IpnUt@vy ztV#bp7WiL-Sdk<$?Y2L`(ZAza+L^Upk6zZ9wR)_3_@b8||19|yZ#Yf{a(5yvWaXr< zw+u4AWF863mQ>912>jT$F8gs9@hloZ3=>EmksQLkI<=nej7C15Vqu=2>THn(OAEO5 zm9BzZNgud_5GuZ!kRe2{mX+ zwn-pkw$_Q~;>edpU-NjgG61BUi|qM&EDsl8AoyW)*J?JaAAic#pS3sq>QS=a*RU@? zw!{5l&9)&AsV2L?Doif>gc~B@Dtp8OGMAx&JLWzJD@tk#p3;yHS2I0E%N+Y<2E4?r z!D!3PCu(@|Dzn4~Lnq7I4}je&002Q#$tJ@xQp_LckZ`aFQzI9jhxbRj_xC5{NWhwQa-ol6cMC?* zuq_;&A^c6qK@&rN8g@3DDDH%C^Ih6(lN7ozfnvxZ+ZxLo7l6~ZmXuR;u?SdQ>f=zSGI2`_TB5kl{~;2TEY#z9JJiFBqS!2nYrF};tE zSIb1BU2G-rs@%tjEp2Wgc%EzGGZ#U2g2+`vo}*4oGoW4^QlRsfpI}+t=V^ra2ZmSz z00Z6th5ln9nw#sA_m3+Ff5mwoSHnL%oc|u@e|R|m-xd!4Yy8z6tq{k;O9A*3f0ZK& zS0o`IsA?CW@^_Y}$p(3;C;>+3fwm!ie(DQ6`bCnLx#DdBmO20ofgtiz+v;=;sOpI> zpKt}L0DFTBRM)^0fpMSjJUW;buxOXNR0-YHHl=@=<36p5^yx6)=rt%>s_$t8m4QKI z(@j1@*qza2N-}f?LB*7yI~EFirHgi%DIi%B`&6!x%7)VYp=s?j^43$wJV%R0E!@sU z#k`_Hu(Q@JfQ34hVlJ}tWLqBI`~1rjS8_3lf+(+~?Yrk22cet}O5x%$i>SWx-^W+O z2ys)3rA9&d+o7QM&C48xdEi5~FSq!YgSZ-I`9Vh*22q>O*`p7E6kN7)6^X<}A*hU) znY%|MO>D-~`qJZ3qO4V<(y`t zym}*Y3mBW1f_-~2Z7p8wij1BdzMEZe@0&}NjC|6H66M3+yjV)si~ex4)f_s8a8t4z zU4uB$!~LSS@I6NgdLMltajtjX0TeWh%ajNn)W}B)aNhEutu{RL;1NoFv{|?D&xCB# zRSMPz{*{9NU5}I-$Mr9v`A3hGRM7mVB39Gd^*<^Wf2835)h_H`LX+rqC3%$cJwUg} z{XYml$6X3ZP}vx%}`%6Ed|9izbdddnd@$s zqZ>UxeKS+SSM-`Mz7|mp(v|*^Rz*ZgVEP!!6zZk(vfhkJ;8mHpVYsV0Aq>zIWTD;e zb=g6U(ho`nve2Kt8TYh*ObFB`5fsTvBZPviat$OB%&6kKqapB%Efv*dl)Qi=eX|2# z-B|#-4D)fGaC9qOXo6dRKOcUPLZWvSh)+ID%frcF7&G%jVa10~P2Hp5Pb)ZS&b(xM#|MGIcc*p(r7S@|Crid`r^R>LoGR}D(VJ5@ zIVC0ir=9~>tXyYc{aF3T449g>l%OMmvDe31alrY9h7n)u{+~tLANt^I!^l-dE({t_li19|-`% zQ=*(%&u8BiE7UCKi%Qf~qyhSsZq=0Xb1|`@?*6_CNO~WPdu3*0NsWPeCGT5Nj8EP? z9i4jHM){^)RN|wWKNPX)`mXWn-+vFyE3IVsDrMLi~U#@U4Z!eo{FhU zLmMr}Xuh_5|MyVrdy_X2Kq42jPWw`f{m?@i!BRE5*cE=uQi%sFU61A1BguYVJ@_$@ z=kf{+=3D$8W^f6!oZFrPToJ+!26ayagjM(0SweBMGxww-flvL2;5vAZUB|&#$`&1F zHsB14LOh=B+IQ$?FD!>Kz&ReVJJsg@)rQXbEF|yxI}`Tqu{*Yo6Q&%L)IaYA=hf*{ z3vGu!MmreO8;Jp`kegx0E8KXX`O%);on!kB9h)ex5s>GIeh7qY42h=*_z|_wE^M09 z%!(9%q-~4(uXb$5u{An|yUN#_I^O&E%i(n}5b=r3-}L^RW5Ur}DQkRb;>FaBaIDwB zvdH~|w~py>YLX;KuJfFdn}XMYGp-LK1@Seeh{WcYG~QBjkumF6B4p_#sm`wu?4S`c zqT*qfxL5TzdvQKMb6@K3Udq*k=nt7{2lW5)F#jdUUP)1avj0(#{nv-N$$k1C6QaM& zrGHa^R#kkt@=}ht{?!k-GM8ct@#8Pp|HVt8>r1;bmwvkX{zmh8%<1?JIL>C_Sf1=vu9@zA4c5nZ=bLTW_9%hE+H}`ZBv{d+l-=1)Kfi zB}AWK2O0Ea$c@!_Xh7&Ko@1OL>`pC9lS0&NqZ%KkX7Ji9WqT~lU;ZUyWeQ_ou6z5> z@APwP3*PMQ0=GR|9H!!w*!>IPK@O{>fr8(-o*XU=Mix=$xoKXROV|V+4Iw}$;@u1l z6+3}EEr@>kF)1Xyv$2$apv7@)N4qwgbmvt5N+gxCrmcm$495Z!y^e1ZvbV4C<`AzR9%K5 z07{Uduj1H=EJww2>3&g5AXdkZGmwgMTe^Z2YaIFIVIUkrjoa_-B|?j-g%hbKO1+zA zK<@y6$>V2Ls1)2LDk1!2o0DODpzv@;_kIn{JKYyFhzG7!Bqm6&;{YlJf|9#Y55JT6 z5b}O*Fnnjg0zrU~=3Z%T95LGS`v{_+FlEYglRRfiGCVINrKWzLH${efhc~{2B9;^y z%JqaW4+C|7#A$q^j5jS4N3x4*rY>`D#Hr?S5nIFoyt3>~c%To)zkI8%8$L7Z^CI8^-D5JCefJ@EzOGt8#?JDz7o?z~vP*kb3@jg(9VEAK_OQ!mUdIYJ+LnR^z$yiH`yxrP`JSfN( z5L5QZbX;9Gkl$hK6wCoFsXN{}Zc#4pl~Y*XeuDN~LhbmnKE>xzNeadFLZ6%2Io!H@ z`g{PIo%Dt8Vk@e-^?VY~PDXY8SQ3>J-#8KP-co`(>X>ow;Z}gm4{#328up?Fq~?K- z-w8eIg(yhhY2_!t*&`NT7(INt`>fc3>ctcLX)D988Fpy=x5DYrNkFPef5cT1p?vm( zzqiab?+yji^slMszdr}Py<(%ul)}$BiS$ZI5xN!{}}Ckf~0uh?SIwZIP2rMuLQ~eroY{xymR<^ zLJU4xbR|gsEzKx=|4Wc8zZyih|Iz23h>)j8w$DV3o*b#Ip=o#pN9}it+9A z0Ux^;K%$@hKpe{I+h!(Rs3A7soBSR;ZX~?Rn(6whTZjy=Jwq-Wi`!K<9j;F4y^WPkuLKxZoF@-XS@_RF^|ric9w2U-!SxUsQ6{ zUL6Qtd0T@FDCf zvx{I!yN_Led6oU8_YJ2LE^;y#`}twxRf%xx=5G)(6Zu*Dthh62eMCRM`9@% z9=xUk0!&NzO}+Q7wf;!?Fjnk&{E{Zm9a2`s#L+xMs1hzQ%uVBEEnj1WlcGaY`kWF< zy@nFu7Yno}!%p%7CdH-7w780Dw&d2MmLn5(1arpu$e}G!K?J>$_G+?zFCC+W`@kFb zHJ8TlCUNpaox@>Ye^r;I>zA2Tq?+S5Rj#6NqSF3tEN;*mIGkC2d!%2zDwo!V) zj~$TM_c`M`XlngRX55SY39Afm1>8=`;_#kh$sgx06y1cNH~wkD^M`2q8T9neODq4j zjs7dtlK$q#+Qvv7Ej~?rmj|vV>1h&mrJX!I#<@-Y~-Q;xU}+z0)Hhq3mkp? zROo(k-hcKv+4ka}1?OwN{oRazA*D;xihqfwZL|)52+kTIFBFbRdH)og?`i4&EyFui z`2Hn0{{t!gtB@o_YW^jfW=n7|{+Z#gCYe{O#^uL$Q!hC+17}yXow;~*nV&RR7I9y` z$-CD4vHo>W$l2lgy-A@Kl?Ud8Pp;*B9MFM0q&#)*Ftrf|0_HD4Xq0Sg)0RPt_RG z^#5q+w;TSHVIwR_T#D(TDFQ_SB$_0)y_XE%U)A{WIYu)wwgiE|fmpKFkQb#bgxEMu zw;6y8ZWc@|A216hfRbVQgIXC&0PzArK9NB1baYuf)ik;vAdH^{gT=~Hb}r*|TQmXI zT$~KM-nVQx0GYk9*h*;&YD{HzFBNq*hhtpe1l`YWo?8m>lFxhfSYeugD5dC}H$_UpU9@*MJ27oQ;IAz^}$j*L!`!5eAb8p{~8Xrf@VmDL)d3 zB~u*gd7^EJ zVc-H#x8^sEF9}+0A&6BBTL83=-F+*DT<(w40p`)7Ks+@{$A81gLl(7%eOLx5ySKV75$UP4ax7hWfhR&gYeQRz12 z{`V3GVmdjQerRxcepHt{45Rou_`1&wKnx!HHd8%l^DCvf;%}!C9?r3&w~Uqwn!7zC zf#2TUJl$jBa2~vt=vhUIxm}SYB>CZvfbM$=<;SFod=HP0t})NWdO+F`c@O&pKHYAt z_{LF3I=esfbAaL?28}uFy=Mw~QNIj^wuI(&vb7AazR;omd3lnm_?qN)1CyajQGCiB zt&@1GhmeP%9vi(#Th;gI(fbyU-8kR3W^@E`z;y|l!U*J4J10K_2+{o@5X~4M03*aM zXXitQ$(B8I=497QA=*7$22jA7pzuwch$ujd%!C~mg;tGqD2*kXZ&R-S=uRD4)3IzU&`T)ri$I44U+4n{zVi4;HS_tMCNYM zaSoO!Ep9r>SiM@pjH=Dh^_=T;X_l=WvWEltiCkEgd)*0d@t0d}-guORFS z(P`;kxi2^u?CQRG2^t(n3>;jw_n$ep0TUKdi=U_rzZ=I+MLkThrm~`cg=t~HhsqgBqhS5>F-m0lbG#7ur5CYg!plINzTi|HkmH zDt}RSTx*6k;fxcB>Vd?dQ%!YP9o2UDekONlyTR3b40Ms`+ZjT+dw(J&;5%Ek9g(V1 zZ)(|@j)@;i4MJ+LS7}U5*fcM$!)~!?bash}Z1AIx{_SO-7XB*J@Rr5X^?th>H)Shk z9IBF&)qzHnVlNrc^jxf{_u{9z6sRD&>$TrbNac6TW-e$14Tg#I0}E;FI2d0C(04ry>GjBQ5Y6>I&YmxNXKQre#tbttHj$ zChj@}dD~yVk#Uosc!zKK={eWh2bK~m`qzw;kkZ%6Z~#OBV@L%u!R>!}-zA^Z7*N{- z0@?-l%(pkDkj+H~a0+^HkXA%U(;Mt(*ky4z0>>^?`k9le2u>3-q@_o(%pUlskNDnB zn0zmUChAgSbu$=lkF)Q-&F(8RX1i2A{V|T+&A6^ju7xGEQ`^N2_brEfqT(Pc02iAM znT9Xk=TVol@y$^%$)o+a;yQizXiqlDAy@Vy(wyz#;w{`KA6meOqte?8uk1K}p)=`C zmHVg4kEiu{Wyq>u>A!F*p2;1c@EWB%yKtxFP`naBkw{Uxif8fjF&KWxEJc}T+{(?8 zKCy`uMspPX53`&OE6u^rc0^*L!0kQBa4#mUQjqjO$-PgJ1C=#u3jJ$ksp0_I*9{=b z@pG`<`7>ui4H(fyM4b9M*pQ<(UjWr!OU&cJUHe^gM^6I+wePZsJocv{WHob*HJo*NgmDXC3uU$W=yCbAlli^lO~qQXY?IqV2rO0`OR=!JbiVmSGCc`{Wv7Zra30 z8we+Gk*Pp_%(zctZGplCHp!5 z#!2I>)>D@|z@s}!+Q=3AhT(cJpX|63*Dy#8W4VX8(J2{f>VW6RZk?JCKtBz1CJA95 z0K;*6kJc!Ce1OO2b3GqH@ZO6NkLLWRhxHVVUBhpzLoyh$7RZ>xPsG&40O4^I?Bsdp z5nm0;?8Y%Vj@r!PGnd>7j%@3t1TR20@K4tY#web3te@PF*9#h#w{@MxGG9N{@{>M| zG>eVT-dClk2kE)=o84OY^z?m6?VfAB4JFmf=?}x|;g*rDhr=^lN*-O6qx@5i60db- zMqyMp6;zRQzA7)X?JSsH9JDq6DkS&!%Y2g`f&#cN2($S&RD(FjEH(<3V>m6^gHId| zS=9I1W=>twbtUe>IN9l9=c1n9ri95?Ff`p#m+^7?>I$SRxnWv{QdgF`-V`o2>wfA) z58c!Q4x!WsQPov?x`q+JNKPuv2*z>FWgMh+kDNu(lVaDxP}Jb=XWrU(jy=@uHN;^N zi(xkNYKj@EF8Y^dXm~*Mpna4wiEyx*$Ue4{gF*yu`XR{A7R!q*6XZbQZgNESIPfQ@ znAZA*1}HQ4V41rKzzc@*B-q>8G||!><~WRnB(dN}DxO~kpfRA?eIqV`TOf~9LMA0O zgA@XW)9|={)A3Y=U}YZtR&Z(yVMx|>7b?ND79Imax%+sC6iyN64Czg0Cg(zr`-n%_>{Ty)N_BP z``nBZrhW#aLdPc}9$bEkZxdTZYzfZ%=*3)hqZ4qS9;|5q)|XY<0`6MTJa{YVsG3fe zRAx1YRV9eA_)M=(FX8K;fFgqzk4kyX} zjRKl$l{@ZXAdiMG9!uiV=8D;sM4s!o?7#^Mj-0stAkVCH&-Ne##S9jPmj(jd#?sE0 znknA>-WCPku6ATm-lw47<6CkvY;Y{W-q+*XDRe+2ts;GMBo0 zzvZ}IP#x;8D&9;*Xd0eRTkbcle!Hy6@p?3*OQzrvjcRWYVccgv6md4`M6`F={gPJG zSJj9@BCS-zdo`w>!Yf=4umuByk#n^Q)wP04VzE*Bu?iO3o1}W2Z?i~6xv7NCS)dy>`qqlpSIJU!HODfuBpgEV zv@#7^E-8S~DJ01ga=wp%f*qjR*DP*-Xid`=u`R_Ln<6yij5O`9QHnsFJtxz@Zlx>n zin+iAUtn_AnjI6~+JBk51|Q2P>-2H4bIm({;2D=v2M-r^;1E@eP*Btd>l4bH0(c0N zgib+m(clYA1!+8#w9;gqsybmtP9PJ(%4 zD^)_1M|y#Wi!s!AFDDQr*9?^HBQX}(<#$Twdb!H~5_LP=!k@RJ^2q_0Ifla19Bz6~v0BbIu4tvI=xMp! z8%gvt5&y0TU3SN$BtsC>OSA28S!9RTm^A0dvOs_%u&Es|ZcHGfU!v9zWI=Ft;$i(O z@!)!H94;7lKIFBdRL(FJzAc zpBRkxU`p=H4d_m`66g$=tEz}XA|>j%TohG$&Q++5+k7~KLdq(is1r)QX4V=BaPV== zWYd(|#K|!DWZykNU7NK=&(;d0xtX2<8lFgJWo1{maDJrC$yv}#TtLC^3sq+k3i$~M zoeqRf3@}c|3(eP&apjaa=D>5Kt}bASEwo%7Ix8%4>yBRvh}{yPo%U_#jh1~ct}7wd z$uo3(nDbRJ`Caa<>AhSt!ePb*HDGNV1n2#(Yw$XK!Q=vOTkIW|MTp7k8h|N;jU*u6 zR9s{zB@#9o&RA3pyiOYo(P|oW4dODdS52^h*fzms?n6Xb#H3b@Vw@Z`xuZR{{l?VO zt}){`pTHeG`0yZZc^Xyfx?B~h2=Yaa&msU=6EM8B?Lw5Z6Ab}wwvxpKI`Cj7se<>Y zJpRPmfpxDZ>t0(ErGT5JCmX${W-cZ>tfpG5C{Z448<4TZWfl~XdM{^(fwV@tA^VS$ z93>ab%5wR&3CPnY!wb9)wWhlJ(#~a3Ue|apU2U^mbryA{RVt}GQy^Uq{4QzDx5PiE z^M>l2_xg2Xgu zu1UWj5t=~0I3ZqW9=3>wz4{IC@)TTp-U9XNebv$biZ0?+u{BvPD~abTYS*_7WKUPe zeAX&V*P>Gv1_jBrQWo(8OC#jaPYZ0Qc!tX6*Bd2V)?^xeg6r>EUk**t(bnfiZ!#6J zuB|jcTjbyDt*1Y`zy9v&o1+;jEOlL*^_z4>=5xVUo(>xd>u*-{)^-}KUe&$%&bkTe zgRQR*fgfx_gkT5ctBfs3lHZ%K-{c=ZSfqpl-gJrhLU9+YTP$z3io)3+Dr=7PKqx7tzqefH>DV~!#SAH87osze+?PpqFt z5CMBL4WYnhG;1AKp9p(b7Y|{NmVI1)`?gj`vqtMqQP*9rhBkOZ#ridyJKwJ(m{pX@s}7yzZJ?N4>{Vam-? z2hIF+#t+Pnn?(eVN^OC(%zi(jNfWC~VMKhAx4-V-)LaD2hmR>9(xM6x)V6o%!6PS; zRl@fxp?447qEE_=J~Hf{C^3$)$RFZ-j_`Iltigp;-#-amr?oxR8KAzC70&a8yF)_b z{rBI!>ElLHZ6D=d$nueyF-LxSdjry@AlUosRF{$#=^zr*&3AJsv`)%5t?1r2wo?+B zQ`Pd%TW23Eiz7>!$JTXU*(D%S%kJqt`yxMgT}*f<8e@BDa=b|WPUNl$bD-|Cp^wS| zW7jWxM+`E)B07TWKak2_>bMEq(-idb+PIK!7Q;NpcL^2@J@DhYE|zlxwKZg9@zD2k z-)El$3x*;dqGwE)r0%5R@6rZ2pIkhn_z%QxiKR;LwD)~gO0IrJ^U2MGckn*1Pr+8x zCG*dQ@57W-q!gPzC}lX}BL-BTe#3GC$8LA^(108%=;NEG{Z7 z%;bu%%&&=aud6ey{eSKT@Bo5=p}~=XXXDY3dUu1%iGQsAUlMQ?zb<;Sw%Uaj5P+b! z|8^Vu{lM$tvyqekc#=}(>Nd8T4Xv<;c!uvzWfEH$735F$bQ_?1%^1%$X{uu~;3I>t z;>-v6^xf~OAWBe^e|XHI9l#pluW5joG2%$5Gq<#$`!I%@&Px5Ruc=qj&Up3XqWZkm z!EHvfW+!svr%cH#WN-ut6`EMefQ0_e4uzkkX=;~-Ua_*WXS;wnE#}i9E3V^XY1iFV zwO@l?nT(CeWffg=@1f2E888760k;z)3jy@?&>l^3(uEegdQ@1==;fmX>s*p{f*u2J zlOD#pzRc9mm0TI-Q8Kh*dVbHNQd++|5Ji;k)tAsXPzAoEcTEuY49;MY7C)-XsuL_G zYV&z_upCu8EwGR&Zt20R(DzMTbk+TwTT^$(dU-?0rJ~dZMbaI^VACpph6ryX0hNT; z!a`zQ&U2NRV=|33Ao%GJX;fIgc?UxrDYu{PgH&C(z32*;TW(xsv)TBa`p#fIBPXQ( zbK6{eb<%Cyi?5`lb!|9ETD)Q{X}UW>b(U_dU2fcsB)2Z>bevCDY(|EDZWiDP?|4pd zbY)jb?(IEa>LLqXaliLkugUwn1J}Tzpku)M5NbQxca9M1axv6*Kda;~K$kkid@jlTW>fF4mMmN)%4-l)i5l5OS@>ui?p*i#}6JgMFDYagyYx<>a_)|o}xTq~W3_or~ zsIBS$qE=v??>h6iZoF)sd_bnfSGmI2D1;zt5uG+8;cW9&mMt?n>V)vMF6r|_K0cPa0QfpCR9gB_9h6^$J(Mlfhls ze473wdk#n0kBN~HeEf<5>iT$755L&v%Sl(Nxg6FX5Lx`}<tjF)2d7Rt0??1$UiYM{-beD!4sd*zE~ho}paeMsD@e8~arjr+Qv|65 zAIS#w2^`gEffcO%Bkpn0DVEgbIo#~2wcM{%66xQoiXO`FXy1_=hFhAIaDK0W8FXRA&#ZHXD+fXxE0wsTi*on{3tyb0|P)4RkZ}Ap63sJuTtV!O%s2xU4)k5(6#Cw z)EC=vd}jFVv6)%2YYWat{Jkz%}qL((JS#?oNhxfHhnakH3S}pS;vCNhVgg!Uiu}4Ku2)K}DRmy(!%0!XZV2S5)HijGxgzz1pIZDoCWRewr~jI~* zY(wHa*U|-W?<6%J)wj%5?)IvA7@D<%%;#ZuDiO6c!#(PoUQ{`js)ip-x(%N%-yldB6=37X_nwtG>H~}=ZohEU-xS(+ zXc3*qRdt%dofTdGh#`Z3fiyx)0P3!OCKBmXN28B1h)u-03%FxcNjB!vZ5Ihv32%c% z`2ul1UMx2o2c>5Z)Rz@0^!Nqpb@bY7{0s4JJb=_6*R=w;!f?{U9B--_KRysw6g<)+ zGvE}rQl{+s5Lh1YO)dO*MOS#c0S6(4G_6Ou_e+%tehbNdMO<}DjCj|XNx)@8Wm?M3 zA#hb&5EvO@?ACuXR|wybUe}mGsCY=L`;edGl^L3bDnOnp;212GH@cGlK;nHODRR`n z&#$l=Ul(NG?C8-gk(7_)PrID(P^@7pBXDhtrC64I+8gopv7fbSZ~$}E(xatt=aIwA zcwPM$^&d-ho)FliT-{M?GEedjvdG`?!hh>;u$8cJ9mpGb$8U9*{CT~l_-Xy@m)ZaU z{E|S~dL)4PghV#``=e{TJnq1YFN#lmlk>wQNp)Bm`o0G`OL6^Jr(N=&tX!IsI>~qW z>>NB^vnk}?Oq#*3;ZypNhMWv72f4{VxE#jfmRA;NST{&%Ln!E#S$oe`zm>|VCP_Hq zK<;Xc%*yxDWOm<$=c+xq$!-m1PC}-N<<4cZgeek7vEE(CekaHy0ziNBc3)K=b%4r!tk|_ z(P)SASz_{QlaL&?&Py~#`Yrx`rpx7!R75=~*8FB@qoDnFifF+bL1wK7(f)23Pu zPF)s@t5F0j((sn8yfUv6+MYv=J>iRPiLZNseX!s;ws1}= zf&qhkCqbZiX;eS!yg-1!Y}&fE=npSA!0{*#X(?`FEYUa_VMj#zrj;jJgVRsr;YBn| zBc@ahMF%yBV6_sMT{bbXPNOe9O>h%rta|DUc-Hx|?a1n@Q4~ zVX>NN^DXlSjMh#jiw$_U+c4Ql3$_pN7TFby0x){72GpA+d9A{$fZ4{mS)sM;=g45U zRf^H(>?q7N&=_mDSrSn-OU{W6UNHx=XX_V}6F&%!4Gmw!2#@!cnL)MCeNhpX zQz5>{Lc@3ehqAX|Ys25#HG?O(I}~?!FYfN{?p`SF!QG{}Lvb$+ZbgejDeh3*+LGbF z_xtX1=FFUP&3uQfWaU}U@4hn}N^>EjYSi2+w|rbZydiJ5kYCS{=UJL)aL$}^g#ad$ zuTh#)e7Tyf{LPkvPZm}g8oHu#UbHv%T>A0l!>IW-Hnca{!m*^=Sa@i|9!(MG40^=9 zcf3-1LS!#_r(W(^%QRGPEtC)*7DomFO{EE0`i}C@ zR0b%}R#EU#R)K&-CCl?d+yM>&&I*`_-6?ex}$>z*sE?C+=;K8Z?hIK@t_ z8&+#XkQm9L_851hXtikEH&K;QziBOB9M&h2%TQHxyb#n*w%49+bFIRub>pe!mekI^ z7L}8!iWREkSkB&+rsWkc;<$2;R5bcH>fz!eQdPl*rW?IWr1sUJ{!?6r@2Po@4>f$p$v;UJY1)WRBA~Mjuah$dhwb!*&yEx#`4m*I6#};bi z_%ULPyBP;X+;)_&J+*#iv6*5cW4cG*R0BB^(IGC%_D3X;woWpGPk~9;A!faaTgc?L zl8oOm=s?!-WnXa`K`Tenf37Nlc1A zushZ-RXUdmO_G2pEab0Vajg-z?#)McUG%Ench$oojVOv8O8POvb(TUoX)REt%mEcL zY|oFYQFmBjL9sx}92{Z7%;VI)7~j0nfE<47ns1aA_DcziB+TYry?Rb%uEYsGt8rf# zxNzVL-2|LAIL-Hz@~$1h8)yBigqgxxeF+{hxE&Q25;z3%eV{I~r#k!vFND66FFVLR z_?1neppWbkF~>#{n8reKii z9Azmzjrk1?C^En)GQ?v%#1}XuP%tFaHzcw-Bqm~w{bwizb6C=NShfJ2A#hl+Z&-PA z_`5r9N;WR<*>JK&wszo1A_vis@bK%CzDS>LT5<33Su1%Y5l9~VhM7FjFRy}_8}AIq2&_=D6s zt|wfDMe^eB?TEf2pFF@E`D9wCSpg(mLj&V_&c?7)3`SWz@s@b-`w?V3?>oEj8|uMS z)#b9i+3I`>MvBAbq(kDRb!w5aNK;ypr7Tp^->xJXG`;P{3i1Us>#LB9{T!>mD34?w zcb4LV6F&ffHtn&ca-=QlF{oJ|MrvCOr{A;aEJ~0uu4*>Tn^U~eyk&wOXt?*3vlfsW zaARf^osARR-$ffW7iZd{G0x%Je(np*q}C1m^KCe(J_zQbiqHt^@xihyzvCl7sFitr z&bPkwTTR#p*oB``&L{!zC>rqPo${;44M-b?;U8HX%sbLf6zK^V04L@M1m0WloiK`B zXDbVT>nZLDzAzayI-vDpXK!FZId#rAnhLX2gzyB+;`Qw60dp?DHMA44F2 z2`y_bvcl^*Q!)!$vr-@ zDc3kGdxa+(Oe5pj8Y5OsVZG1n&<*nlm)?Fj0iVW47K&5`xFVER(X@piQYpc>jZeQp zvbmmIZmC5pp0h6|s?V*;oEJ-1lsw9N2Gb^~>E9+QviN+5_zqb+eA4;PEwsewd0_}< z#jLjQ7xppwfHZ^T*Nh@pQaUqXe1{E!E^sI*BII?gP>SeirSjWSQti?%ZIQf)k|O7I z{v>RZd5V(Xs+I%D(|l7)lfV{{m0uasf_eLs^Gj6n?(vd%v~JtgxP{GhwNr)f@9eMBxFk*8qSCEd6iUYPSdep%Lqy5P#ce%q6|xo9`K^$j_$0@2Wfj4#m;-(OZXr&5 z_AGUBuF1fo^OYT5gugDiqh&535SB`=4LYCxpqfb+4QXegI@3%*d$u8>yj!?u=T%1r zm8YjHdU{_HwF2QGEV_y6Rfy7OzV{h%jD_(M`Js*0}-L%?TJ5pNjb=%jWrYsH4 zua1h)tcB6fCi3lUKsTUOCRWvdCAN`z4tmiM4zZDM688uOUJZ`O#JF%4v!n=%!U&ec z>rhz@Y=0g@qHrXKMo-_$ zYIv2yKZb9kQP@O__U*B@R)_r08Aa1sIcCdi|4)aIM99x@JWm-61X$d%1s4BtMa%@* zU1(n66hCSz8*DsgMeMG-LK$nMYHk?JyiOi*EmyPo4t52jHZMh7`3FuFSv@n&QcHza ztZx#+N<}Qq?7R4cEL_N;z*JlriJ$uS!}qHD=wMM7V%+X1gvHhdE(ugACYRE7mnuHw z4xP{mqYZs3cmKQMpI_fBQ{>8BZeRh4JZfFs{Wzljv6S4>p?W`cwQrUP z()$InB{B;ov{mga+qZjjv?-~44Q}~XCV2|NjjLcX?$L0}RbSNeZTp4DNU#1;*%_AOb5_tpW z@0gykO37JB{P`$?HDl@CC@MRxD^{HeW%+8JoLbomcLGm_kuVl9MDnGp(eGjr(Z@(R z9h$JQ^vDK_EhBc9{@Z3KEEbt4H6UNHu05#Cwf0`zcCSo=2Rp+$eO&_AIu(`zP%5T$ zQ~lpEL$(D{%4rx5G}*0O2XG#20#QzWIApCd$7C`WE#Kn5WQOz-zFXY;iJpj#$t5BG zkr{?IyCY|${Qr>|R%*tbH3pwd{#$1Fp??>ABnkzi|I22$F^gU3y?6d*Gep5mM5lFP zwftM5k(A9)AX8)T_6;`IZQ%N5GX(#TqY-wHZ*^+k!-|ApYgi0rXVZy3xKI|T+k*oO z1?X6Nf%L|6{Df3X@-fIb*4R#cIZ>rqe@l0Bh~&7=-6%1{eBFm>vI~-}fKeA+aF&vKq^tT%l}mVm5ps#Q(L}nEbSX09J|~;W26Uv|xJ3@?>GMW14{IQ4Fkc!h=yX}{hL&@ zEEh}UN0LEG7+Xfmq02X(Mj};yS!xK()=|hac+g8bt%W0JAf(V@KFX0!DDlUb!=IGz z{H`#<5&&_{B!yXHCJ%(bunS3y{O|USn0>cvDS8+IBg3K8p|7}d04m1F8|g8w!0{tw zk-asF!0MDDZw7F9XrY6wR%=mHB@_obKQ3HNIO6?HS;(*)4d(|^b3k7`xyN-8l{9Sn z>!xKwLoB5^4>k68?a`p#FoILlQdtV(iWn1^GF&%#c|+QLTo&xmJ*1@#o60Ej zo+#6(bZf9k@2u=E8Iacnt})Y5Nf}loWF?&kQ1i=Y=KvNOY*clQYu|$Y##2eBQG|U5Uf04KnjL`>a(_@V(tDbASjT?>pxlJ;^!N&5e zpA%3FBjTcArOFqKhyf*KaMOz0?0=|I{$-LD*^wbp?U_YA3(RIPMG|Zc4bONH*h}v7 zpI~Q*5P~q$^CK+g&s_|~Q9!BZg6bD@gMUy_Wu?x<*X|KzM5X6Z(CSFO&;w*uD~xgk z35OqB$-vp2t8X69O98Qb$ZW&$D)yg0Msn zEfG_(n6__=D^)dlt~@3<##>81V1`z@fok-1Dso&PkufhuH0NAIq|iT7slDKFDuV6^ zt1J!iHm~iKVLeTqL1wPNiUc#(n^{>1s;O7|8PzkTx-;gYWdBJi-F~fpFRZL!8|f#~ z3)s=F8=W%X5*;dy!)kKUeOoqFvhHukL^Zm5bGTir_aeJ%-txoCesMBV5gnLX=uY!BHamid*=4aUv)V zX3~R@G-7W7x;V(On2;w=O2$MowZ^2{?Lyk7FUNZsA}&?$v?LtU_Rkb-vT0gb83AOC zjJFd6tB1CDF*G{N3*GV4o|ak6aLD5}g7F5c``9!;^}U%HTj;xp4?k2(v;X#NF5<*9 zN$LRAZ*w28M?!no0*()zT6PlXHTEED5L}**CevkR)WeT=Z##u>n-JC6krMuF+q3)W zL((;=i)o|Z)*cT=;m1|c-gOOH!e(<4s!uKD8W|p^x^u)sxrnqkQcH<0VM3E=8MYq8 zD8vtRbWz0*9JpTn!E?<&4$~xCKd%tMax)5AQ#eEjEpqe`zVg{lJk>_Yu+@4c*xsG` z;&7P^Hl>O2&&S3cPfo!M@KY zzjV)hP;Gz)4{Yy8zzEI8T#`BaBp>{M{p<@&X{*YtGZm!oSp@B}Au$DwMU`~d)Mq6w znTV1Yn!Pn{(K#}LB~Bi&*jFoOe1kYxsD*2?=AfmUzeRrtBNi~^iy*$oIep-Z7s&d# zq3UOPd?}*$NtlvkiZ&N!Ei(rfjZe=1Y0xNmOeR9_H{C!7bJ)QpqNe;-c`Qb+3omxa zP@I8ga$7Ky%ALC4$7T7ilPc$^(yfnwPQRjYbjjGzk>!IHJsZ0`qozF!tp19+vxW|Q zk>ZP1!aUdYjN`%&sS9)xyMKW@g@7vTI3_!4s_F7Q>KDO+*VHHg z+`CEywLITTp0G33Bfk;6{Hs-gabc$))ggy;E1sh*B)5QrnSr6;t{CNxyvl7^Hfpdu z_ip!I43r~BH7X=G7Q~t@Rs<3I)5?jqDoDQ1nqDdXoFe}cK}1^}24l|?H9}l!Yg|AZ zah)wr_1&Hq$U)*I{%mfwU#1%4u9yV#E^v&9bn!j?Dh9Q*Js?UlU7C-n)nB1qf=6G9 z!rn_T1DSwR`4>QL89}~{N0m&Q`)eD9T!u8Tn8;e+eh=Ql*juT7$FJ#@-KQ&hg*M6( zUbW)RJi=GILmSuzkqy0*4fRuEv6UtoR#=@ECA0^&rTE4Y(tEAinT&hJXcNZ`%lGa> zIchvUBuhJ!c`AO<#>i|#Nu`f-Ke(z$b z%%X@8O6dlcbOqr6;+%8?c?@_A6DZ-WJY5?_ zmq3#`+-|V6s^#GEmNFYDmc`;lfbWKlOfnD&;Dnjr(}ECkODXb7hXPhGGvYB#e&}S3 z(VG1Um0Ua!_FM&e?q;-?yM!Z{evOVut?@kc;TyN7%-u8ZeA|<7g5@NIaMP2Ds8Q!R z(86mh6U;@xyoxdhDsanLZZ&2j_6mZO1MLjGR%Y@&S^!$fFapB6F{lAdR#lOOOMeyO_4>k9>tnk0(bKKAC1g z5LLZ9y(8}BAD9zK31C1_l}NskI`$cAl-q-c6EY-(vSjT-)p$gF$p$)

s{MI0^mcv$PBwIH|i@`@bn7oY03h!M4 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 literal 0 HcmV?d00001 diff --git a/doc/test-suite.png b/doc/test-suite.png new file mode 100644 index 0000000000000000000000000000000000000000..1c05793c909627dec7d00589c4a666df07058fba GIT binary patch literal 50875 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 JzL>tx{{wk+7wiB4 literal 0 HcmV?d00001