diff --git a/.codeclimate.yml b/.codeclimate.yml index f39e7cad7..c1cdb7632 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -23,4 +23,3 @@ exclude_paths: - "*_test.go" - "**_test.go" - "middleware_test.go" - - packrd/**.go diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..aad738c7e --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +version: 2 +updates: + - package-ecosystem: "gomod" + directory: "/" + schedule: + interval: "daily" + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" diff --git a/Makefile b/Makefile deleted file mode 100644 index 388f671ec..000000000 --- a/Makefile +++ /dev/null @@ -1,50 +0,0 @@ -TAGS ?= "sqlite" -GO_BIN ?= go - -install: deps - make tidy - $(GO_BIN) install -tags ${TAGS} -v ./buffalo - make tidy - -tidy: - $(GO_BIN) mod tidy - -deps: - $(GO_BIN) get github.com/gobuffalo/release - make tidy - -build: - $(GO_BIN) build -v . - make tidy - -test: - packr2 - $(GO_BIN) test -tags ${TAGS} -cover ./... - packr2 - make tidy - -ci-deps: - $(GO_BIN) get github.com/gobuffalo/buffalo-pop - $(GO_BIN) get -tags ${TAGS} -t -v ./... - make tidy - -ci-test: - docker build . --no-cache --build-arg TRAVIS_BRANCH=$$(git symbolic-ref --short HEAD) - -lint: - golangci-lint --vendor ./... --deadline=1m --skip=internal - -update: - $(GO_BIN) get -u -tags ${TAGS} - make tidy - make test - make install - make tidy - -release-test: - make tidy - -release: - make tidy - release -y -f ./runtime/version.go --skip-packr - make tidy diff --git a/SHOULDERS.md b/SHOULDERS.md index afac02772..e195d327a 100644 --- a/SHOULDERS.md +++ b/SHOULDERS.md @@ -146,12 +146,6 @@ Thank you to the following **GIANTS**: * [github.com/gobuffalo/nulls](https://godoc.org/github.com/gobuffalo/nulls) -* [github.com/gobuffalo/packd](https://godoc.org/github.com/gobuffalo/packd) - -* [github.com/gobuffalo/packr](https://godoc.org/github.com/gobuffalo/packr) - -* [github.com/gobuffalo/packr/v2](https://godoc.org/github.com/gobuffalo/packr/v2) - * [github.com/gobuffalo/plush](https://godoc.org/github.com/gobuffalo/plush) * [github.com/gobuffalo/plushgen](https://godoc.org/github.com/gobuffalo/plushgen) diff --git a/app.go b/app.go index a255bd216..aec94b3a6 100644 --- a/app.go +++ b/app.go @@ -64,7 +64,6 @@ func New(opts Options) *App { c := a.newContext(RouteInfo{}, res, req) err := fmt.Errorf(errorf, req.Method, req.URL.Path) _ = a.ErrorHandlers.Get(code)(code, err, c) - } } diff --git a/default_context.go b/default_context.go index 1e3e0354d..e648948a0 100644 --- a/default_context.go +++ b/default_context.go @@ -4,6 +4,7 @@ import ( "bytes" "context" "encoding/json" + "errors" "fmt" "io" "net/http" @@ -15,7 +16,6 @@ import ( "time" "github.com/gobuffalo/buffalo/binding" - "github.com/gobuffalo/buffalo/internal/takeon/github.com/markbates/errx" "github.com/gobuffalo/buffalo/render" ) @@ -129,7 +129,8 @@ func (d *DefaultContext) Render(status int, rr render.Renderer) error { err := rr.Render(bb, data) if err != nil { - if er, ok := errx.Unwrap(err).(render.ErrRedirect); ok { + var er render.ErrRedirect + if errors.As(err, &er) { return d.Redirect(er.Status, er.URL) } return HTTPError{Status: http.StatusInternalServerError, Cause: err} diff --git a/errors.go b/errors.go index 7d0db0872..ff291ab67 100644 --- a/errors.go +++ b/errors.go @@ -4,6 +4,7 @@ import ( "database/sql" "encoding/json" "encoding/xml" + "errors" "fmt" "net/http" "runtime/debug" @@ -12,7 +13,6 @@ import ( "github.com/gobuffalo/buffalo/internal/defaults" "github.com/gobuffalo/buffalo/internal/httpx" - "github.com/gobuffalo/buffalo/internal/takeon/github.com/markbates/errx" "github.com/gobuffalo/events" "github.com/gobuffalo/plush/v4" ) @@ -23,6 +23,10 @@ type HTTPError struct { Cause error `json:"error"` } +func (h HTTPError) Unwrap() error { + return h.Cause +} + func (h HTTPError) Error() string { return h.Cause.Error() } @@ -105,13 +109,13 @@ func (a *App) defaultErrorMiddleware(next Handler) Handler { return nil } status := http.StatusInternalServerError - // unpack root cause and check for HTTPError - cause := errx.Unwrap(err) - switch cause { - case sql.ErrNoRows: + // unpack root err and check for HTTPError + switch { + case errors.Is(err, sql.ErrNoRows): status = http.StatusNotFound default: - if h, ok := cause.(HTTPError); ok { + var h HTTPError + if errors.As(err, &h) { status = h.Status } } @@ -183,13 +187,16 @@ func defaultErrorHandler(status int, origErr error, c Context) error { } trace := origErr.Error() + if cause := errors.Unwrap(origErr); cause != nil { + origErr = cause + } switch strings.ToLower(requestCT) { case "application/json", "text/json", "json": c.Response().Header().Set("content-type", "application/json") err := json.NewEncoder(c.Response()).Encode(errorResponseDefault(defaultErrorResponse, &ErrorResponse{ - Error: errx.Unwrap(origErr).Error(), + Error: origErr.Error(), Trace: trace, Code: status, })) @@ -199,7 +206,7 @@ func defaultErrorHandler(status int, origErr error, c Context) error { case "application/xml", "text/xml", "xml": c.Response().Header().Set("content-type", "text/xml") err := xml.NewEncoder(c.Response()).Encode(errorResponseDefault(defaultErrorResponse, &ErrorResponse{ - Error: errx.Unwrap(origErr).Error(), + Error: origErr.Error(), Trace: trace, Code: status, })) diff --git a/go.mod b/go.mod index 17adaf1da..b551efccf 100644 --- a/go.mod +++ b/go.mod @@ -10,16 +10,14 @@ require ( github.com/gobuffalo/events v1.4.2 github.com/gobuffalo/flect v0.2.4 github.com/gobuffalo/github_flavored_markdown v1.1.1 - github.com/gobuffalo/helpers v0.6.3 + github.com/gobuffalo/helpers v0.6.4 github.com/gobuffalo/httptest v1.5.1 github.com/gobuffalo/logger v1.0.6 github.com/gobuffalo/meta v0.3.1 github.com/gobuffalo/nulls v0.4.1 - github.com/gobuffalo/packd v1.0.1 - github.com/gobuffalo/packr/v2 v2.8.1 - github.com/gobuffalo/plush/v4 v4.1.8 - github.com/gobuffalo/pop/v5 v5.3.4 - github.com/gobuffalo/tags/v3 v3.1.1 + github.com/gobuffalo/plush/v4 v4.1.9 + github.com/gobuffalo/pop/v6 v6.0.0 + github.com/gobuffalo/tags/v3 v3.1.2 github.com/gorilla/handlers v1.5.1 github.com/gorilla/mux v1.8.0 github.com/gorilla/sessions v1.2.1 @@ -30,6 +28,7 @@ require ( github.com/markbates/safe v1.0.1 github.com/markbates/sigtx v1.0.0 github.com/monoculum/formam v3.5.5+incompatible + github.com/psanford/memfs v0.0.0-20210214183328-a001468d78ef github.com/sirupsen/logrus v1.8.1 github.com/spf13/cobra v1.2.1 github.com/stretchr/testify v1.7.0 diff --git a/go.sum b/go.sum index 2e471bb26..10645f213 100644 --- a/go.sum +++ b/go.sum @@ -41,80 +41,38 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw= github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Masterminds/semver/v3 v3.0.3/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -123,16 +81,12 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= @@ -140,82 +94,57 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gobuffalo/attrs v0.1.0/go.mod h1:fmNpaWyHM0tRm8gCZWKx8yY9fvaNLo2PyzBNSrBZ5Hw= -github.com/gobuffalo/envy v1.8.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= +github.com/gobuffalo/attrs v1.0.1/go.mod h1:qGdnq2RukKtBl4ASJit0OFckc5XGSyTFk98SvRpMFrQ= github.com/gobuffalo/envy v1.10.1 h1:ppDLoXv2feQ5nus4IcgtyMdHQkKng2lhJCIm33cblM0= github.com/gobuffalo/envy v1.10.1/go.mod h1:AWx4++KnNOW3JOeEvhSaq+mvgAvnMYOY1XSIin4Mago= github.com/gobuffalo/events v1.4.2 h1:9X4nBKGXOU/N/3AFRO0SxYvpL88lws8M7f5FODbWCm4= github.com/gobuffalo/events v1.4.2/go.mod h1:GI0w4OrQDQP/tIIC9FPl04qWs4dTx52DLCCcwVg7Ltc= github.com/gobuffalo/fizz v1.10.0 h1:I8vad0PnmR+CLjSnZ5L5jlhBm4S88UIGOoZZL3/3e24= github.com/gobuffalo/fizz v1.10.0/go.mod h1:J2XGPO0AfJ1zKw7+2BA+6FEGAkyEsdCOLvN93WCT2WI= -github.com/gobuffalo/flect v0.1.5/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= -github.com/gobuffalo/flect v0.2.1/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc= -github.com/gobuffalo/flect v0.2.3/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc= github.com/gobuffalo/flect v0.2.4 h1:BSYA8+T60cdyq+vynaSUjqSVI9mDEg9ZfQUXKmfjo4I= github.com/gobuffalo/flect v0.2.4/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= -github.com/gobuffalo/genny/v2 v2.0.5/go.mod h1:kRkJuAw9mdI37AiEYjV4Dl+TgkBDYf8HZVjLkqe5eBg= +github.com/gobuffalo/genny/v2 v2.0.8/go.mod h1:R45scCyQfff2HysNJHNanjrpvPw4Qu+rM1MOMDBB5oU= github.com/gobuffalo/github_flavored_markdown v1.1.0/go.mod h1:TSpTKWcRTI0+v7W3x8dkSKMLJSUpuVitlptCkpeY8ic= github.com/gobuffalo/github_flavored_markdown v1.1.1 h1:kUf8ginyBOTRXcKSTPsPAqlA25vQ80+xAspLIYaxmTU= github.com/gobuffalo/github_flavored_markdown v1.1.1/go.mod h1:yU32Pen+eorS58oxh/bNZx76zUOCJwmvyV5FBrvzOKQ= github.com/gobuffalo/helpers v0.6.0/go.mod h1:pncVrer7x/KRvnL5aJABLAuT/RhKRR9klL6dkUOhyv8= -github.com/gobuffalo/helpers v0.6.1/go.mod h1:wInbDi0vTJKZBviURTLRMFLE4+nF2uRuuL2fnlYo7w4= -github.com/gobuffalo/helpers v0.6.2/go.mod h1:wInbDi0vTJKZBviURTLRMFLE4+nF2uRuuL2fnlYo7w4= -github.com/gobuffalo/helpers v0.6.3 h1:cptQU8ivs/IU+CCDHYxUxf9fa8R+BvDb+/wvYONVnww= -github.com/gobuffalo/helpers v0.6.3/go.mod h1:mg8qmDCAaJxLQXoge0xHyNsdVqyTPaaLCDWcHTaVhlM= +github.com/gobuffalo/helpers v0.6.4 h1:N9is8xgaotJzGIge1GoLYiWRpKZPqnS9RSty72OhIn8= +github.com/gobuffalo/helpers v0.6.4/go.mod h1:m2aOKsTl3KB0RUwwpxf3tykaaitujQ3irivqrlNAcJ0= github.com/gobuffalo/here v0.4.0/go.mod h1:bTNk/uKZgycuB358iR0D32dI9kHBClBGpXjW2HVHkNo= github.com/gobuffalo/httptest v1.5.1 h1:WwCZrMYVDqkjTlxo7OasFOMvdaG4ysriidJoqcedv2M= github.com/gobuffalo/httptest v1.5.1/go.mod h1:uEeEFF2BRyTMNAATqFQAKYvpHrWWPNoJbIB3YPuANNM= -github.com/gobuffalo/logger v1.0.3/go.mod h1:SoeejUwldiS7ZsyCBphOGURmWdwUFXs0J7TCjEhjKxM= github.com/gobuffalo/logger v1.0.6 h1:nnZNpxYo0zx+Aj9RfMPBm+x9zAU2OayFh/xrAWi34HU= github.com/gobuffalo/logger v1.0.6/go.mod h1:J31TBEHR1QLV2683OXTAItYIg8pv2JMHnF/quuAbMjs= github.com/gobuffalo/meta v0.3.1 h1:wrg94uDwu3bM3HMdmz2wlT8A9iAJvMKbHmYs8Rxi63I= github.com/gobuffalo/meta v0.3.1/go.mod h1:garIq5Vcqs5dj8nv3YG8hRbqAdQhIOt0DAXmaLtO7OU= -github.com/gobuffalo/nulls v0.2.0/go.mod h1:w4q8RoSCEt87Q0K0sRIZWYeIxkxog5mh3eN3C/n+dUc= github.com/gobuffalo/nulls v0.4.1 h1:k7QVCJfMplv9VRQQLb4N1d8tXUdGvcdMNfp4BfMnG2M= github.com/gobuffalo/nulls v0.4.1/go.mod h1:pp8e1hWTRJZFpMl4fj/CVbSMlaxjeGKkFq4RuBZi3w8= -github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= -github.com/gobuffalo/packd v1.0.0/go.mod h1:6VTc4htmJRFB7u1m/4LeMTWjFoYrUiBkU9Fdec9hrhI= -github.com/gobuffalo/packd v1.0.1 h1:U2wXfRr4E9DH8IdsDLlRFwTZTK7hLfq9qT/QHXGVe/0= github.com/gobuffalo/packd v1.0.1/go.mod h1:PP2POP3p3RXGz7Jh6eYEf93S7vA2za6xM7QT85L4+VY= -github.com/gobuffalo/packr/v2 v2.8.0/go.mod h1:PDk2k3vGevNE3SwVyVRgQCCXETC9SaONCNSXT1Q8M1g= -github.com/gobuffalo/packr/v2 v2.8.1 h1:tkQpju6i3EtMXJ9uoF5GT6kB+LMTimDWD8Xvbz6zDVA= -github.com/gobuffalo/packr/v2 v2.8.1/go.mod h1:c/PLlOuTU+p3SybaJATW3H6lX/iK7xEz5OeMf+NnJpg= github.com/gobuffalo/plush/v4 v4.0.0/go.mod h1:ErFS3UxKqEb8fpFJT7lYErfN/Nw6vHGiDMTjxpk5bQ0= -github.com/gobuffalo/plush/v4 v4.1.8 h1:0vJpTLPTc23iuyDEYftMgF6NYS24R8WryCAXl6kJZ/0= -github.com/gobuffalo/plush/v4 v4.1.8/go.mod h1:504Kpokbl1fT93Y6BtRoVmT+H+kWoqJsAaEDEe0HeNo= -github.com/gobuffalo/pop/v5 v5.3.4 h1:VWH74icA8khG8SyWDAq6Ch00jcPiC4n436JMFh0lLm0= -github.com/gobuffalo/pop/v5 v5.3.4/go.mod h1:UiVurv2aTKC7MuR27PnMrQjAazoLr8SoC/LuTKTS/tQ= +github.com/gobuffalo/plush/v4 v4.1.9 h1:u9rQBuYCeHC0ppKxsZljk5vb1oT8PQa5EMNTAN2337s= +github.com/gobuffalo/plush/v4 v4.1.9/go.mod h1:9OOII9uAM5pZnhWu1OkQnboXJjaWMQ7kcTl3zNcxvTM= +github.com/gobuffalo/pop/v6 v6.0.0 h1:LvHl9wrMoY0zF+SWjUJoDG1oRpYKfMxLzuBT7SCctZU= +github.com/gobuffalo/pop/v6 v6.0.0/go.mod h1:5rd3OnViLhjteR8+0i/mT9Q4CzkTzCoR7tm/9mmAic4= github.com/gobuffalo/tags/v3 v3.0.2/go.mod h1:ZQeN6TCTiwAFnS0dNcbDtSgZDwNKSpqajvVtt6mlYpA= -github.com/gobuffalo/tags/v3 v3.1.0/go.mod h1:ZQeN6TCTiwAFnS0dNcbDtSgZDwNKSpqajvVtt6mlYpA= -github.com/gobuffalo/tags/v3 v3.1.1 h1:zXFBGckcXlJo83CF+czXD93VWrPeDMtETBvHAzXHW78= -github.com/gobuffalo/tags/v3 v3.1.1/go.mod h1:WdZd2T0qN77hOWnjpaZXTfDtAYm0CXoJr8n7rrekPZw= +github.com/gobuffalo/tags/v3 v3.1.2 h1:68sHcwFFDstXyfbk5ovbGcQFDsupgVLs+lw1XZinHJw= +github.com/gobuffalo/tags/v3 v3.1.2/go.mod h1:o3ldUfKv50jxWAC8eZHXMm8dnKW3YvyZUMr0xqUcZTI= github.com/gobuffalo/validate/v3 v3.0.0/go.mod h1:HFpjq+AIiA2RHoQnQVTFKF/ZpUPXwyw82LgyDPxQ9r0= -github.com/gobuffalo/validate/v3 v3.1.0/go.mod h1:HFpjq+AIiA2RHoQnQVTFKF/ZpUPXwyw82LgyDPxQ9r0= -github.com/gobuffalo/validate/v3 v3.3.0 h1:j++FFx9gtjTmIQeI9xlaIDZ0nV4x8YQZz4RJAlZNUxg= -github.com/gobuffalo/validate/v3 v3.3.0/go.mod h1:HFpjq+AIiA2RHoQnQVTFKF/ZpUPXwyw82LgyDPxQ9r0= +github.com/gobuffalo/validate/v3 v3.3.1 h1:5YLQL22YARUsYS5ZGsPU6TrD0Utiu53N1JJ5qi+foYk= +github.com/gobuffalo/validate/v3 v3.3.1/go.mod h1:Ehu8ieNJQuUM4peDDr/0VapzdGA7RgTc3wbe51vHfS0= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.1.0+incompatible h1:sIa2eCvUTwgjbqXrPLfNwUf9S3i3mpH1O1atV+iL/Wk= github.com/gofrs/uuid v4.1.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -244,7 +173,6 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -257,6 +185,7 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -274,36 +203,23 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -314,7 +230,6 @@ github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerX github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -323,13 +238,10 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= @@ -338,15 +250,18 @@ github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgO github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= -github.com/jackc/pgconn v1.4.0/go.mod h1:Y2O3ZDF0q4mMacyWV3AstPJpeHXWGEetiFttmq5lahk= -github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= -github.com/jackc/pgconn v1.5.1-0.20200601181101-fa742c524853/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= -github.com/jackc/pgconn v1.8.1 h1:ySBX7Q87vOMqKU2bbmKbUvtYhauDFclYbNDYIE1/h6s= -github.com/jackc/pgconn v1.8.1/go.mod h1:JV6m6b6jhjdmzchES0drzCcYcAHS1OPD5xu3OZ/lE2g= +github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= +github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= +github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.10.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.10.1 h1:DzdIHIjG1AxGwoEEqS+mGsURyjt4enSmqzACXvVzOT8= +github.com/jackc/pgconn v1.10.1/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= -github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2 h1:JVX6jT/XfzNqIjye4717ITLaNwV9mWbJx0dLCpcRzdA= github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= +github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= @@ -355,63 +270,43 @@ github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.0.6 h1:b1105ZGEMFe7aCvrT1Cca3VoVb4ZFMaFJLJcg/3zD+8= github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgproto3/v2 v2.1.1 h1:7PQ/4gLoqnl87ZxL7xjO0DR5gYuviDCZxQJsUlFW1eI= +github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= -github.com/jackc/pgtype v1.2.0/go.mod h1:5m2OfMh1wTK7x+Fk952IDmI4nw3nPrvtQdM0ZT4WpC0= -github.com/jackc/pgtype v1.3.1-0.20200510190516-8cd94a14c75a/go.mod h1:vaogEUkALtxZMCH411K+tKzNpwzCKU+AnPzBKZ+I+Po= -github.com/jackc/pgtype v1.3.1-0.20200606141011-f6355165a91c/go.mod h1:cvk9Bgu/VzJ9/lxTO5R5sf80p0DiucVtN7ZxvaC4GmQ= -github.com/jackc/pgtype v1.7.0 h1:6f4kVsW01QftE38ufBYxKciO6gyioXSC0ABIRLcZrGs= -github.com/jackc/pgtype v1.7.0/go.mod h1:ZnHF+rMePVqDKaOfJVI4Q8IVvAQMryDlDkZnKOI75BE= +github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= +github.com/jackc/pgtype v1.8.1 h1:9k0IXtdJXHJbyAWQgbWr1lU+MEhPXZz6RIXxfR5oxXs= +github.com/jackc/pgtype v1.8.1/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= -github.com/jackc/pgx/v4 v4.5.0/go.mod h1:EpAKPLdnTorwmPUUsqrPxy5fphV18j9q3wrfRXgo+kA= -github.com/jackc/pgx/v4 v4.6.1-0.20200510190926-94ba730bb1e9/go.mod h1:t3/cdRQl6fOLDxqtlyhe9UWgfIi9R8+8v8GKV5TRA/o= -github.com/jackc/pgx/v4 v4.6.1-0.20200606145419-4e5062306904/go.mod h1:ZDaNWkt9sW1JMiNn0kdYBaLelIhw7Pg4qd+Vk6tw7Hg= -github.com/jackc/pgx/v4 v4.11.0 h1:J86tSWd3Y7nKjwT/43xZBvpi04keQWx8gNC2YkdJhZI= -github.com/jackc/pgx/v4 v4.11.0/go.mod h1:i62xJgdrtVDsnL3U8ekyrQXEwGNTRoG7/8r+CIdYfcc= +github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= +github.com/jackc/pgx/v4 v4.13.0 h1:JCjhT5vmhMAf/YwBHLvrBn4OGdIQBiFG6ym8Zmdx570= +github.com/jackc/pgx/v4 v4.13.0/go.mod h1:9P4X524sErlaxj0XSGZk7s+LD0eOyu1ZDUrrpznYDF0= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= -github.com/jmoiron/sqlx v1.3.3/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= github.com/jmoiron/sqlx v1.3.4 h1:wv+0IJZfL5z0uZoUjlpKgHkgaFSYD+r9CfrXjEXsO7w= github.com/jmoiron/sqlx v1.3.4/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/karrick/godirwalk v1.15.3/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= -github.com/karrick/godirwalk v1.15.8/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw= github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -422,18 +317,12 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.1 h1:6VXZrLU0jHBYyAqrSPa+MgPfnSvTPuMgK+k0o5kVFWo= -github.com/lib/pq v1.10.1/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk= +github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/luna-duclos/instrumentedsql v1.1.3 h1:t7mvC0z1jUt5A0UQ6I/0H31ryymuQRnJcWCiqV3lSAA= github.com/luna-duclos/instrumentedsql v1.1.3/go.mod h1:9J1njvFds+zN7y85EDhN9XNQLANWwZt2ULeIC8yMNYs= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/markbates/errx v1.1.0 h1:QDFeR+UP95dO12JgW+tgi2UVfo0V8YBHiUIOaeBPiEI= -github.com/markbates/errx v1.1.0/go.mod h1:PLa46Oex9KNbVDZhKel8v1OT7hD5JZ2eI7AHhA0wswc= github.com/markbates/grift v1.5.0 h1:CZyK0k+8BdhQMgbwzuKMysC12y4tf9H004jAs/FutX4= github.com/markbates/grift v1.5.0/go.mod h1:1ssFm5gSGmzTkhi3Wfh/nqlU74J73TlAjoDMttQbpfY= github.com/markbates/oncer v1.0.0 h1:E83IaVAHygyndzPimgUYJjbshhDTALZyXxvk9FOlQRY= @@ -446,28 +335,18 @@ github.com/markbates/sigtx v1.0.0 h1:y/xtkBvNPRjD4KeEplf4w9rJVSc23/xl+jXYGowTwy0 github.com/markbates/sigtx v1.0.0/go.mod h1:QF1Hv6Ic6Ca6W+T+DL0Y/ypborFKyvUY9HmuCD4VeTc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.9 h1:10HX2Td0ocZpYEjhilsuo6WWtUqttj2Kb0KtD86/KYA= github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= -github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/microcosm-cc/bluemonday v1.0.16 h1:kHmAq2t7WPWLjiGvzKa5o3HzSfahUKiOq7fAPUiMNIc= github.com/microcosm-cc/bluemonday v1.0.16/go.mod h1:Z0r70sCuXHig8YpBzCc5eGHAap2K7e/u082ZUpDRRqM= @@ -483,80 +362,25 @@ github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:F github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/monoculum/formam v3.5.5+incompatible h1:iPl5csfEN96G2N2mGu8V/ZB62XLf9ySTpC8KRH6qXec= github.com/monoculum/formam v3.5.5+incompatible/go.mod h1:RKgILGEJq24YyJ2ban8EO0RUVSJlF1pGsEvoLEACr/Q= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/psanford/memfs v0.0.0-20210214183328-a001468d78ef h1:NKxTG6GVGbfMXc2mIk+KphcH6hagbVXhcFkbTgYleTI= +github.com/psanford/memfs v0.0.0-20210214183328-a001468d78ef/go.mod h1:tcaRap0jS3eifrEEllL6ZMd9dg8IlDpi2S1oARrQ+NI= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= @@ -564,50 +388,33 @@ github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OK github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc h1:jUIKcSPO9MoMJBbEoyE/RJoE8vz7Mb8AjvifMMwSyvY= -github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d h1:yKm7XZV6j9Ev6lojP2XaIshpT4ymkqhMeSghO5Ps00E= github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e h1:qpG93cPwA5f7s/ZPBJnGOYQNK/vKsaDaseuKT5Asee8= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -619,27 +426,16 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -661,21 +457,18 @@ go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191122220453-ac88ee75c92c/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -713,19 +506,15 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -755,6 +544,7 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -784,11 +574,7 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -801,12 +587,10 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -837,8 +621,10 @@ golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e h1:WUoyKPm6nCo1BnNUvPGnFG3T5DUVem42yDJZZ4CNxMA= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -851,12 +637,9 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -887,7 +670,6 @@ golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -896,7 +678,6 @@ golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200308013534-11ec41452d41/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -915,13 +696,13 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -945,7 +726,6 @@ google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBz google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= @@ -957,7 +737,6 @@ google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= @@ -994,15 +773,10 @@ google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -1031,24 +805,15 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1058,7 +823,6 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1069,5 +833,3 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/internal/takeon/github.com/gobuffalo/syncx/LICENSE b/internal/takeon/github.com/gobuffalo/syncx/LICENSE deleted file mode 100644 index a538bcbf2..000000000 --- a/internal/takeon/github.com/gobuffalo/syncx/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Mark Bates - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/internal/takeon/github.com/gobuffalo/syncx/README.md b/internal/takeon/github.com/gobuffalo/syncx/README.md deleted file mode 100644 index 0f0d02b20..000000000 --- a/internal/takeon/github.com/gobuffalo/syncx/README.md +++ /dev/null @@ -1,18 +0,0 @@ -
- - - -# github.com/gobuffalo/syncx - -This package provides a set of types and tools for working in current environments. - -See [https://godoc.org/github.com/gobuffalo/syncx](https://godoc.org/github.com/gobuffalo/syncx) for more details. - -# Installation - -```bash -$ go get github.com/gobuffalo/syncx -``` diff --git a/internal/takeon/github.com/gobuffalo/syncx/byte_map.go b/internal/takeon/github.com/gobuffalo/syncx/byte_map.go deleted file mode 100644 index 39b7dae16..000000000 --- a/internal/takeon/github.com/gobuffalo/syncx/byte_map.go +++ /dev/null @@ -1,73 +0,0 @@ -//go:generate mapgen -name "Byte" -zero "[]byte(``)" -go-type "[]byte" -pkg "" -a "[]byte(`A`)" -b "[]byte(`B`)" -c "[]byte(`C`)" -bb "[]byte(`BB`)" -destination "syncx" -// Code generated by github.com/gobuffalo/mapgen. DO NOT EDIT. - -package syncx - -import ( - "sort" - "sync" -) - -// ByteMap wraps sync.Map and uses the following types: -// key: string -// value: []byte -type ByteMap struct { - data sync.Map -} - -// Delete the key from the map -func (m *ByteMap) Delete(key string) { - m.data.Delete(key) -} - -// Load the key from the map. -// Returns []byte or bool. -// A false return indicates either the key was not found -// or the value is not of type []byte -func (m *ByteMap) Load(key string) ([]byte, bool) { - i, ok := m.data.Load(key) - if !ok { - return []byte(``), false - } - s, ok := i.([]byte) - return s, ok -} - -// LoadOrStore will return an existing key or -// store the value if not already in the map -func (m *ByteMap) LoadOrStore(key string, value []byte) ([]byte, bool) { - i, _ := m.data.LoadOrStore(key, value) - s, ok := i.([]byte) - return s, ok -} - -// Range over the []byte values in the map -func (m *ByteMap) Range(f func(key string, value []byte) bool) { - m.data.Range(func(k, v interface{}) bool { - key, ok := k.(string) - if !ok { - return false - } - value, ok := v.([]byte) - if !ok { - return false - } - return f(key, value) - }) -} - -// Store a []byte in the map -func (m *ByteMap) Store(key string, value []byte) { - m.data.Store(key, value) -} - -// Keys returns a list of keys in the map -func (m *ByteMap) Keys() []string { - var keys []string - m.Range(func(key string, value []byte) bool { - keys = append(keys, key) - return true - }) - sort.Strings(keys) - return keys -} diff --git a/internal/takeon/github.com/gobuffalo/syncx/int_map.go b/internal/takeon/github.com/gobuffalo/syncx/int_map.go deleted file mode 100644 index f6eba4dce..000000000 --- a/internal/takeon/github.com/gobuffalo/syncx/int_map.go +++ /dev/null @@ -1,73 +0,0 @@ -//go:generate mapgen -name "Int" -zero "0" -go-type "int" -pkg "" -a "0" -b "1" -c "2" -bb "-1" -destination "syncx" -// Code generated by github.com/gobuffalo/mapgen. DO NOT EDIT. - -package syncx - -import ( - "sort" - "sync" -) - -// IntMap wraps sync.Map and uses the following types: -// key: string -// value: int -type IntMap struct { - data sync.Map -} - -// Delete the key from the map -func (m *IntMap) Delete(key string) { - m.data.Delete(key) -} - -// Load the key from the map. -// Returns int or bool. -// A false return indicates either the key was not found -// or the value is not of type int -func (m *IntMap) Load(key string) (int, bool) { - i, ok := m.data.Load(key) - if !ok { - return 0, false - } - s, ok := i.(int) - return s, ok -} - -// LoadOrStore will return an existing key or -// store the value if not already in the map -func (m *IntMap) LoadOrStore(key string, value int) (int, bool) { - i, _ := m.data.LoadOrStore(key, value) - s, ok := i.(int) - return s, ok -} - -// Range over the int values in the map -func (m *IntMap) Range(f func(key string, value int) bool) { - m.data.Range(func(k, v interface{}) bool { - key, ok := k.(string) - if !ok { - return false - } - value, ok := v.(int) - if !ok { - return false - } - return f(key, value) - }) -} - -// Store a int in the map -func (m *IntMap) Store(key string, value int) { - m.data.Store(key, value) -} - -// Keys returns a list of keys in the map -func (m *IntMap) Keys() []string { - var keys []string - m.Range(func(key string, value int) bool { - keys = append(keys, key) - return true - }) - sort.Strings(keys) - return keys -} diff --git a/internal/takeon/github.com/gobuffalo/syncx/interface_map.go b/internal/takeon/github.com/gobuffalo/syncx/interface_map.go deleted file mode 100644 index 93376135d..000000000 --- a/internal/takeon/github.com/gobuffalo/syncx/interface_map.go +++ /dev/null @@ -1,73 +0,0 @@ -//go:generate mapgen -name "" -zero "nil" -go-type "interface{}" -pkg "" -a "0" -b "1" -c "2" -bb "-1" -destination "syncx" -// Code generated by github.com/gobuffalo/mapgen. DO NOT EDIT. - -package syncx - -import ( - "sort" - "sync" -) - -// Map wraps sync.Map and uses the following types: -// key: string -// value: interface{} -type Map struct { - data sync.Map -} - -// Delete the key from the map -func (m *Map) Delete(key string) { - m.data.Delete(key) -} - -// Load the key from the map. -// Returns interface{} or bool. -// A false return indicates either the key was not found -// or the value is not of type interface{} -func (m *Map) Load(key string) (interface{}, bool) { - i, ok := m.data.Load(key) - if !ok { - return nil, false - } - s, ok := i.(interface{}) - return s, ok -} - -// LoadOrStore will return an existing key or -// store the value if not already in the map -func (m *Map) LoadOrStore(key string, value interface{}) (interface{}, bool) { - i, _ := m.data.LoadOrStore(key, value) - s, ok := i.(interface{}) - return s, ok -} - -// Range over the interface{} values in the map -func (m *Map) Range(f func(key string, value interface{}) bool) { - m.data.Range(func(k, v interface{}) bool { - key, ok := k.(string) - if !ok { - return false - } - value, ok := v.(interface{}) - if !ok { - return false - } - return f(key, value) - }) -} - -// Store a interface{} in the map -func (m *Map) Store(key string, value interface{}) { - m.data.Store(key, value) -} - -// Keys returns a list of keys in the map -func (m *Map) Keys() []string { - var keys []string - m.Range(func(key string, value interface{}) bool { - keys = append(keys, key) - return true - }) - sort.Strings(keys) - return keys -} diff --git a/internal/takeon/github.com/gobuffalo/syncx/string_map.go b/internal/takeon/github.com/gobuffalo/syncx/string_map.go deleted file mode 100644 index 2bb37cf4b..000000000 --- a/internal/takeon/github.com/gobuffalo/syncx/string_map.go +++ /dev/null @@ -1,73 +0,0 @@ -//go:generate mapgen -name "String" -zero "``" -go-type "string" -pkg "" -a "`A`" -b "`B`" -c "`C`" -bb "`BB`" -destination "syncx" -// Code generated by github.com/gobuffalo/mapgen. DO NOT EDIT. - -package syncx - -import ( - "sort" - "sync" -) - -// StringMap wraps sync.Map and uses the following types: -// key: string -// value: string -type StringMap struct { - data sync.Map -} - -// Delete the key from the map -func (m *StringMap) Delete(key string) { - m.data.Delete(key) -} - -// Load the key from the map. -// Returns string or bool. -// A false return indicates either the key was not found -// or the value is not of type string -func (m *StringMap) Load(key string) (string, bool) { - i, ok := m.data.Load(key) - if !ok { - return ``, false - } - s, ok := i.(string) - return s, ok -} - -// LoadOrStore will return an existing key or -// store the value if not already in the map -func (m *StringMap) LoadOrStore(key string, value string) (string, bool) { - i, _ := m.data.LoadOrStore(key, value) - s, ok := i.(string) - return s, ok -} - -// Range over the string values in the map -func (m *StringMap) Range(f func(key string, value string) bool) { - m.data.Range(func(k, v interface{}) bool { - key, ok := k.(string) - if !ok { - return false - } - value, ok := v.(string) - if !ok { - return false - } - return f(key, value) - }) -} - -// Store a string in the map -func (m *StringMap) Store(key string, value string) { - m.data.Store(key, value) -} - -// Keys returns a list of keys in the map -func (m *StringMap) Keys() []string { - var keys []string - m.Range(func(key string, value string) bool { - keys = append(keys, key) - return true - }) - sort.Strings(keys) - return keys -} diff --git a/internal/takeon/github.com/gobuffalo/syncx/version.go b/internal/takeon/github.com/gobuffalo/syncx/version.go deleted file mode 100644 index 97ee3e4ca..000000000 --- a/internal/takeon/github.com/gobuffalo/syncx/version.go +++ /dev/null @@ -1,4 +0,0 @@ -package syncx - -// Version of syncx -const Version = "v0.0.1" diff --git a/internal/takeon/github.com/markbates/errx/LICENSE b/internal/takeon/github.com/markbates/errx/LICENSE deleted file mode 100644 index 649efd437..000000000 --- a/internal/takeon/github.com/markbates/errx/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2019 Mark Bates - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/internal/takeon/github.com/markbates/errx/errx.go b/internal/takeon/github.com/markbates/errx/errx.go deleted file mode 100644 index 515d9f506..000000000 --- a/internal/takeon/github.com/markbates/errx/errx.go +++ /dev/null @@ -1,49 +0,0 @@ -package errx - -import "fmt" - -// go2 errors -type Wrapper interface { - Unwrap() error -} - -// pkg/errors -type Causer interface { - Cause() error -} - -func Unwrap(err error) error { - switch e := err.(type) { - case Wrapper: - return e.Unwrap() - case Causer: - return e.Cause() - } - return err -} - -var Cause = Unwrap - -func Wrap(err error, msg string) error { - return wrapped{ - err: err, - msg: msg, - } -} - -type wrapped struct { - err error - msg string -} - -func (w wrapped) Error() string { - return fmt.Sprintf("%s: %s", w.msg, w.err) -} - -func (w wrapped) Unwrap() error { - return w.err -} - -func (w wrapped) Cause() error { - return w.err -} diff --git a/internal/takeon/github.com/markbates/errx/version.go b/internal/takeon/github.com/markbates/errx/version.go deleted file mode 100644 index 6b5c99b8e..000000000 --- a/internal/takeon/github.com/markbates/errx/version.go +++ /dev/null @@ -1,4 +0,0 @@ -package errx - -// Version of errx -const Version = "v1.1.0" diff --git a/mail/README.md b/mail/README.md index e60ffbd83..e2779b095 100644 --- a/mail/README.md +++ b/mail/README.md @@ -5,7 +5,7 @@ This package is intended to allow easy Email sending with Buffalo, it allows you ## Generator ```bash -$ buffalo generate mailer welcome_email +buffalo generate mailer welcome_email ``` ## Example Usage @@ -15,16 +15,15 @@ $ buffalo generate mailer welcome_email package x import ( - "log" - "net/http" - - "github.com/gobuffalo/buffalo/render" - "github.com/gobuffalo/envy" - "github.com/gobuffalo/packr/v2" - "github.com/gobuffalo/plush" - "github.com/gobuffalo/buffalo/mail" - "errors" - "gitlab.com/wawandco/app/models" + "log" + "net/http" + + "github.com/gobuffalo/buffalo/render" + "github.com/gobuffalo/envy" + "github.com/gobuffalo/plush" + "github.com/gobuffalo/buffalo/mail" + "errors" + "gitlab.com/wawandco/app/models" ) var smtp mail.Sender @@ -32,52 +31,52 @@ var r *render.Engine func init() { - //Pulling config from the env. - port := envy.Get("SMTP_PORT", "1025") - host := envy.Get("SMTP_HOST", "localhost") - user := envy.Get("SMTP_USER", "") - password := envy.Get("SMTP_PASSWORD", "") + //Pulling config from the env. + port := envy.Get("SMTP_PORT", "1025") + host := envy.Get("SMTP_HOST", "localhost") + user := envy.Get("SMTP_USER", "") + password := envy.Get("SMTP_PASSWORD", "") - var err error - smtp, err = mail.NewSMTPSender(host, port, user, password) + var err error + smtp, err = mail.NewSMTPSender(host, port, user, password) - if err != nil { - log.Fatal(err) - } + if err != nil { + log.Fatal(err) + } - //The rendering engine, this is usually generated inside actions/render.go in your buffalo app. - r = render.New(render.Options{ - TemplatesBox: packr.New("app:mail", "../templates"), - }) + //The rendering engine, this is usually generated inside actions/render.go in your buffalo app. + r = render.New(render.Options{ + TemplatesFS: mailTemplates, + }) } //SendContactMessage Sends contact message to contact@myapp.com func SendContactMessage(c *models.Contact) error { - //Creates a new message - m := mail.NewMessage() - m.From = "sender@myapp.com" - m.Subject = "New Contact" - m.To = []string{"contact@myapp.com"} + //Creates a new message + m := mail.NewMessage() + m.From = "sender@myapp.com" + m.Subject = "New Contact" + m.To = []string{"contact@myapp.com"} - // Data that will be used inside the templates when rendering. - data := map[string]interface{}{ - "contact": c, - } + // Data that will be used inside the templates when rendering. + data := map[string]interface{}{ + "contact": c, + } - // You can add multiple bodies to the message you're creating to have content-types alternatives. - err := m.AddBodies(data, r.HTML("mail/contact.html"), r.Plain("mail/contact.txt")) + // You can add multiple bodies to the message you're creating to have content-types alternatives. + err := m.AddBodies(data, r.HTML("mail/contact.html"), r.Plain("mail/contact.txt")) - if err != nil { - return err - } + if err != nil { + return err + } - err = smtp.Send(m) - if err != nil { - return err - } + err = smtp.Send(m) + if err != nil { + return err + } - return nil + return nil } ``` @@ -109,13 +108,13 @@ func init() { port := envy.Get("SMTP_PORT", "465") // or 587 with TLS - host := envy.Get("SMTP_HOST", "smtp.gmail.com") - user := envy.Get("SMTP_USER", "your@email.com") - password := envy.Get("SMTP_PASSWORD", "yourp4ssw0rd") + host := envy.Get("SMTP_HOST", "smtp.gmail.com") + user := envy.Get("SMTP_USER", "your@email.com") + password := envy.Get("SMTP_PASSWORD", "yourp4ssw0rd") - var err error - sender, err := mail.NewSMTPSender(host, port, user, password) - sender.Dialer.SSL = true + var err error + sender, err := mail.NewSMTPSender(host, port, user, password) + sender.Dialer.SSL = true //or if TLS sender.Dialer.TLSConfig = &tls.Config{...} diff --git a/options.go b/options.go index 9959d68fa..3b180bdc4 100644 --- a/options.go +++ b/options.go @@ -11,8 +11,8 @@ import ( "github.com/gobuffalo/buffalo/worker" "github.com/gobuffalo/envy" "github.com/gobuffalo/logger" - "github.com/gobuffalo/pop/v5" - "github.com/gobuffalo/pop/v5/logging" + "github.com/gobuffalo/pop/v6" + "github.com/gobuffalo/pop/v6/logging" "github.com/gorilla/sessions" "github.com/markbates/oncer" ) diff --git a/plugins/packrd/packed-packr.go b/plugins/packrd/packed-packr.go deleted file mode 100644 index 5ce7bbc83..000000000 --- a/plugins/packrd/packed-packr.go +++ /dev/null @@ -1,126 +0,0 @@ -// +build !skippackr -// Code generated by github.com/gobuffalo/packr/v2. DO NOT EDIT. - -// You can use the "packr2 clean" command to clean up this, -// and any other packr generated files. -package packrd - -import ( - "github.com/gobuffalo/packr/v2" - "github.com/gobuffalo/packr/v2/file/resolver" -) - -var _ = func() error { - const gk = "463fbc670deceec4e41bd16a9da461f2" - g := packr.New(gk, "") - hgr, err := resolver.NewHexGzip(map[string]string{ - "0652906dbbddf180108ddfa0b73f1047": "1f8b08000000000000ffac524d6fdb3a103c93bf621f810454a047e1e1dd8c3a409336bda581833687a2075aa268c2d2aeb0249b0686ff7b215b091cc3c9a9275bfb313b9c99c1d66beb1dd47d2365e807e2045a0a551326f73b292985fa7036071a5234775df601efd61ece2e2bef109faa97defd8a38dddadec1d9a59242f9905679696aea2b4fcbdcb6b6a3fdcefbddca9377783433ac7de59889e351230eed7fff57352dd92a5948f9cb3278878e6d725f87140823cc2126ce75828d141727f99a69548a869f16196149d4c9ed468aa93183f3771737db526ea5acaa97e3d77d03ec0676d1618a9056eea50535f5bdc5e615d9717e0ee7bb9798ebfdc0468a6fd1cd00409d96b99462f73d03f58c13c102ba4778736191f1f30cda8cb5aefb062e5e5d2cc1b28ff0e3674c1cd017b0137d144e30cce6b073c83cb8b4c8888ef594127365ebb567cad8e8a2905288d01edb602669472cc1f08cf569577d1b4b88ed88e7cb91ca48e1b40fb7ee511f1f9c7e8b3d9d71fd9f3960e8260a2e65c6fd03a3790869759f6cbdd68e797f5508de95b52f0e18ccc15322eaa2f942377dd26c1644e92fdd98e6d92c32ea428a7daa46af206048ba18610f12636e3aeba32ecc1551f7ddf29d3e3fad7a09aae1a77f39a31affaa125adb455782e28c87e12486c790569413d4ec6c0ae8a10d9d8b400c9c11c7c294dfa80a09a7fd18b97d6c9a2955fa807221b7f24f000000ffff1136ba3e74040000", - "0e36ab770b1ec79ef2649ec1552c94dc": "1f8b08000000000000ffdc5a5f73db48727ff7a7e8b06a2b52154cfb3677496e2fb92aad25df32f1522e898ee3c721d020261ecce06606a29054be7baa7bfe6040525ea7f2967bb85a53404f4ffff9f5afbb01bff5bf9b41d41dc20759a376f8ea1b4ffe1b5a278d861fd76f2bf817a1476127f8f1eddbdfbff852e7fdf0d39b37c7e3712df898b5b187372a1ce5debca21777770fbf3ec2cdf616dedd6f6f37bbcdfdf611dedf3fc0a7c7bb0a1eee3e3edcdf7e7a473f57fcd4ede671f7b0f9f913fdc2027eb7865b6ca5965e1aedd6afa236ab78a315b84e28053d0a0dbe43f0687b074237501bdd84b7a03516468715581cac69c69a7eaea2287ab691ce5bb91fe977100e1a3a121bd84ff0887510f23bf09d35e3a1833f8269c177d24163eab147ed4ff532f64cb1da0c939587ce83396ab4602ca0f6d24f2046df192bff93cf8b722ebde13be1413a3858a1bdd4077e28daa150000f42c11d8b3e5362d47441d61e41d42c2569a11b104a4531c677181594e8c2d1b5d1de1a5581b098fea158e98a6e43bf8eba410bb5e97ba3a3a4f8201ca5ef829c70e01ade1bcb7a0ca31d8c43375b353b3cf96815a5acf82a0eaee47578d51cd156d0488bb52725a40eff5d8137508bd1213d17a5843fb1052cf4428b0392f3e85c37d65d54ac8263877cfdfd14b4172cbbb4cc515234190b57525e07f7b84e0e24a995ad9f60405b93e8ab3fbcfde19a8f3316a3e193a0d13b2f74433e709db0e89244790d7bd4d8ca5a0ab5945ee839bbfc8b195770652cff975d5d975e179a6df2249b91645928e3230ac067b4b574a4c880b697ce71c0739c852460b79c85daa3196d8d2b4aaffe34d2068b2d5a8b4df86bcb16ff4a47f4a691adac05675572b0d4b51ad914fbd183361e94ec259dee0d38d3fa238597e303a1360d5639f7585014131ea852feb7f2305afe3bb45261011ff7fbffc0da9fab2ef4147eb3e846c5f9d15ad3438f7527b4ac454a106f8576f4a44801c5bfa8f8cf160404f3b0b86a79c128e3e49ab5e90749096558b978cd036ab4821e595cb844afdae8a780de8ee484dcedb19102fc3494d7fe6cecd73350381afb9535661ca2489b5340ea748d9c00c174f15abd6810c493904aec55caff02972a42530ac05ac45012191712ba69e3658d19de82a5b0a1b30956bca7dac2164ada46115742033e8b7e50482f0ed63cc9f8223d79330ca81bf90c7b54e6783d5be116ad7c125e3e219041dcea3402e88ccb3688b78f92820d92e27be1c8799a53b1a13328faade90356d151ec2eca856327ebae00036ca43796d2dde293645752146be3639e002ab13736fdcbd8e4e6329ba230aa72e8507bb6be806367142705182b0f520b75c1e7e7789c70aa5da47f05a7e68bd6a3688ebe63f1b16a58ec85ccf98983b01c296417be468f16d5044aeaaf6cb8bdd41c275af4789d9c2eb547db8a9a8b4455d4c86cd433a5c83a68dad9ebef08ca638dbfe8f1d31cc8295b9c970d18132ed5d2ac07095bf88463b8894c244932c136fc96b12f2a5f1549e109f58d164a25d876e3be973e8247e21d1c5dac39ab1753810f621c3fa315c9cb5ceebe592d4aa242a8ccc753bcefb113aa05d3be4c5ebeafdac32adf691565857a9f61d9b4800a6b6f8d9675455ed80bc57174b4f49e66f231ea687da02c288d8eb3a1c84edecdc9c2f677d5374b51c6aef20ca30b9da01752d1cb4a3aefaab264652ae426e7b17725844be746a41252738d8c4f04f753e50b6c2573add2e85501238b2828ac4d766ba4ab47c7559e4fec192f238dfccc883797267c4e4658de35c5636db41b643d9ad1a9097a61bf12f4d9991d25ca854e1e3463bfd4ec2336ecc54824b05a6d8d070165aeae57e7297cc2aff3b55306fe26e5290d48f8d89f1c0a9d70b047d460b14646f2fdb438674e42877f1d517b45c7d6c60e26946b22bc45fa0520fa710d7f215a45c7becbd74fcc0a1ec7505c63ac5e6c668a342b511945dd4161202008d94f81c5312ff8624610c4f006f4a35029fc8ec6aae628896b68a35fb3e79d7ce27fbeae3b610fd4389949283fbd6e2d6205d25a7c323501f959358ffd1f1d98ba2dac880e0e14c7674837c3f930ee95acd544813a283155f32f03da506a1dff128945d9b795343f633193e5b3132f9473c696e0a0bf2b1cf45110e8fe3ff0ce153ed738784a30e75332b2822e3444d73084bb16deebc557aca0134fc82c2f29c47db4695be279061c2a55c5ff97fd60ac0f8ec93810897264850c33e9666482e0a374aa180645eda6d16a0a5626ec8aaad54ac8dec5678bcbeda720a4b46ec64d8d353a27ace4ec6cadd487d4d1a04cb5af4cfc2b770d42198db122d6a6df4b9d593dbf76fa42ba50e87063b5f52692bca572f18823b922d5ba356c5af27fee859c979e623a3bc5cb4350411c04fd99412e36ee5773c1cadcda1ae75eb3c1e81ab519893f857f4b0d029438ba517abaaac2432802c267e5674e70828adf0238ae094171175bed594e3d3b674ad74afee899a9fa0e03155b4662a24ca9198d99921a8d39c762c94bac2a54074a51f25e8a15e112616b84cfc197ad2b1df7894d8082dfafe101cbc9d09a8feec53423db290ad5669089db2cf0e81b2c8f5d42b4111b39f65588236234d2772657e465db1c4af80b4856cdad101b640ead1e3178b9354a9963a8ef09bb7e7a95fbaaeb70d3d1793890bea45ee8372cd6729048a05552dfdc1dd2ffce2e2ab83e9c76127fe2329acedc176786c1cd4ca5a98fa2fe3d0c752c859035bdd41427a17b74c5f1047139a44926b5ee0736060639cb93ebe2648b5e485d25de5cb4f0dc1de8e9ec72c5c1f9c039202acab0b93a5631ba2b82c5068937550599e010f573bac5bb8511c4057d4e2175c9dc027a2619ac5c6398d00e68e99a64ce9071d6cf850b22833fbde8d268cd358156f67f6cfcc8d5abedfd6ef3ee6e051e9f3ddb9bd22e9e4194bb38a7ccae02022e64ca9965d95f85a8d47a0ab0281aee31e7a0c38b66255012526369fe086a8c0ce1227c85ea7bec5a88b96ce18b76e560131e140a47ed5439a58fafccd93a286a827f4a6a8aa4e36cebd9428ba872dfd4e14f25982f82acccebe5000a643be30c95ccc35c01cfe51b5b9d5b5924ae574cb9626f70c14aed49a6308178421b9ce53b699bd774c929fb461bdb53c34cc402855dc3ae0b5d18e1d7b9990b7f337908ad741ef2095534afc45096eac4dc62c49a16b3f95c3644d3d07f5bea77ca882ca424d5a385be2713aa607d279b45e8703f25341d8aba19fb445b1711938025f47fc99da798c6064e430ca12e27134fab608f8107d8f134fe82615eda5b5c34d1dc55306de5617d20002783afc2152424dea354d9586824b1d605cbbdc0e0e7d1de8595511053ec8a4c7b419b6a4e9b969bc5e98556a49ccee5546279747431cd9b1538db562daa7066ddb5e90395a6385a8c6572a772d2092c1cf2076e76e22620f4aa330b746bf8a4153ac74ec3e741c95a52fbcb128b05499e6f4ca72cb218661563ac17475733d3a7134f073981eaedcbe9f3ffa6358b348bd52c02268808d4b549dbc7f0fed6787a296f6fb8beec4d68ca286d0fdcde511961d5dc38a075d8605804511a142e890705761106a41ee796e8603104fe1433843b327cc6ba807806de6c108b0761c35ee9b4f788bb80bf5fc32e111047b058f0e8c63072fa40b98b8d10193e2ed4027d496b0cd1a32b188da386d03ec91a21fed35888311c1e4e419b34aee6a9536c532dfe7594717b4405dd19cd259d5d3a3a6f7a6127d6466a68d0d556eea32b72d3210ff27c3e9bb229f92d56830b252058ea1fd6702b1db74e68e9a9cfc2925da69c0459d5fd141a58eebca9c59a6180bdc8cdcb3c05ab6687c5dc77b3aa57a42b8aba3b6d51cba7a5774be75e83e18ddfeae611368f2bf8f9e671f3988cfb79b3fbe5fed30e3edf3c3cdc6c779bbb47b87f28d7f2f7efe166fb05fe75b3bdad0065d8003f0f962e996f2219579a624c3a6710cf4945c2a9098ec154dc10d97388352dec36bb0f77156cefb7af37dbf70f9bed5fee7ebddbee2af8f5eee1dd2f37dbddcdcf9b0f9bdd170ea1f79bddf6ee317c3e7013657cbc79d86dde7dfa70f3001f3f3d7cbc7fbc0bd5366c0b152aead5dc60b493bc75e0cd4ce80a97e12286c19ac14aa2e77ce116469e9572fccd885bcc4bc3b4d1b9b1e75e25c1b5748cecced432b7c901d4e39e95a7b1e5a2f5bc990db1f78f6bf8904d4a2f7d90622f152fcf375479019f2876498f20431b503cecf41d1a3b15a396b4c9f2c6fa7264a0f1a0e401758dd755de76578b516e9efcfc66bc5f05a2e0a04125f74ce858b98335cee5bd453ad283a8bde3edf8e5fc08e8b9281fc6c23eb94c493e384e04d8b5a21787e50c9fde4e9f04cc1f07b8016b390fd9a4ae6543c436ac1288c08499ae142a094d085d77824c8416840d3b73aae2b956bb51f9d34697ad39668c19c32f52476716b85a4e0caebeb9134f5ad1b59509017b30a6394a55ce0ebf82f36618c4012be6042329de0aa9461baa9150eda86772c345f0c29720b5e97b0aded21ee16074d715c72111f4d3415c949187e9a27992bc246de3e71bcec96884f47143141f32e08f6bb8a9a926901512f2d2c93773a12e92e27347d47d99aea7cbc26faedb120bad3b63c21494279d8b653bcf5c41408b8c271508d650e81ac3258630068de83771dc61afa5cff998b7b72ae90e66afe2148a79cb1b821d62be61d5221d17a9d85f49b758f7e01a7e3147ea84422b990dc6f62c04cff7e32f5ab42ab6219973c7b5080f71e3cf04a4338cb2becc74e62dca8ce8f3a4a808833813a69e49b6019f29e143beb36dda6c9b065bd44d78a333aab9303a17b667244ae43a5b714ee7d1da795b1627c7c239b4943e71885a9dcf8df753241bf38526b2c06cd34ce68f453416b431eb1202f86e7b4b75f5d26770fcf79b8f1fefb6b79b7fff895cc8d382615053fc7ca1fc748ffec6aa1cf32e090076dff942153fa3584e1312ad3652a11d14a175e8e6aab9936f25aac601ea5a1917407f6f45fd15bd83d57ffdf76a6e5294a853b59b523031aac6aeafe8a4d770756bf4dfe6ef058a1c4dc2ffe61ab85be736d57566540d51fcac47ec0e8ab25dec662957dca4bd78ce8b506eea83026bf88c20943360313c1de7a409c5f9d91037ce31630d6d17d3cc2115e3b45adde3fcc90a6f4893268e5e5c0d56f2e09a307845b562b9f98c1fbf909a289cccfbf868b9b477cde39979c8216cddc9a78494f332f19f7ef867308377eb2f282cfcf0e7f9871bdedfc30f7fe637629c3445dbb48ca0aafc2614aee881fcd9e5f59f48446a49080b42058b13f4c4e4a58e9d28a3630eaacc728ac6dfec7960261653bb14cbc2a788ffadaf4e3f6cdedd6d1fef5effb87ecbaf7c0f497f897ec4cfce5e9583ca85bd927ad22d1e788984ff1f1978e2de6cb647c4850a29ce99d9b4b20625f461140784837942ab4f3fee8b039399b2bbf37bad5fbdfa9f000000ffff083522ff612c0000", - "11ccb6bedd3e318a1604672830b46c94": "1f8b08000000000000ff6c544d8fe23618befb573cda73cadeabaa9207cc6035d8c8314be7189297c16d62a7b6d315fdf595033b1f556fc67e9f4f5eb05797e0122e9108adef317bf2dd3c9e29528f142ef97b1b0991066a13f5703e07e42b619acf83ebd087b1757ec518f7b7e0e98d2a077461ba551843ef2eb7ea3e9fae15e64415ba304e6ea00a8986a14288ac772947779e3321174f3fa42b90cb578a701e29ccb12374a1275c421c1122da84f6075dcfceceb7f1569557b4fe86698e5378088e143bd70e05e483ffe9fda65a829f6f05c1466a7d5a31263dfe98a34bbdebb20b3e215fdb8c485d78f5ee1f5ad245f77acd18daefa95a3a69e77c0d7171b59c120b97cf69d053efba36d3e2aec8b6c3f081cbf94c9152391446f686fbdfd671228ced9f8fc61ed42ef8257e193f93a78bcb771b6fe8b6788eaff7effb41dc538e6e249f112e0873c4955c4c6582a5b9eb28a510d322582c16dc7f2473c0b93022fc4d31a3ed0a138b3438ffd7ecd275e1761e13c589f2ecf2ad2895f453a4541e8b9bcb9ce7b26ea58c74f7e6d27b0bb3ef297eae7ec598dd09347a6b4fdc08c80607a3bfc98dd8e00b6f209b2f154ed2eef4d1e2c48de1cabe406fc1d50b7e936a5331f1fbc188a6813690fb432dc5a68254ebfab891ea194f470ba52d6ab997566c60358ae0834a8a067acbf6c2ac775c59fe246b695f2a6ca5558573ab0d380edc58b93ed6dce0703407dd0870b581d24aaaad91ea59ec85b22b26159486f8269445b3e375bd48f1a3dd69d3e049a096fca9167756f58275cde5bec286eff973316298b63b6196b18791d34e2c5752812bf0b5955a95f86badace16b5bc16a634bf6057a928da81837b229d9b746ef2b94e6f476a947159c127796d22a3e95afcdf2f9d888772f1bc16ba99e9b02fe38bc626c1b22c610cb4e959ff3b24815a6e5af06912e14cb0afc72cd79faf9ebd7d90fae239f6815e2ebafecdf000000ffffcbc5d361ba040000", - "1614cda23f5488b474a44a2db5ecebac": "1f8b08000000000000ff945b5f93dbb6b57fd7a7c0eccc9dae6668c6bb6ba76dfae4266eae67ec4ca66e9ae923441e4ac88200038092d94f7fe79c038020456d7cf3106b25e200387f7fe70f3fd9ff2aada5f8793c68d5888faa01e3a11267705e59231eebd7bbdd432d7e804e191594351eff7ea8c5ddf7d604a70e63b0ee6eb713f85f0fd27801b23909655a7556ed28b5b04e68384a2dc0041526114e3288c6810ce02bd12432e045b0229c8069d1037804db5548c25e8c17dfdb333868c567db858b7450e3611e978711ffe6b32f0f154e201adb1f944954e9abbc0e6f865fda7002e7c5bdea8434d35e8c1e5a7198846462e53ed2b47c9741baa09a514b57fefe27bfa04e477d2a8f7a75c6f5edf03cf2067522f786c82d172d497eb6a36bf09a2d887f58d7238b2f27d59ce8f62452a917b73a492f6408b239413b4bc3d8a01a5c20de7f39a9830ae25d4524de7f81660cf2a0237ddb093f36a7ab8d2b6417d3fa645bd5a946669edf58a00cab52233deedce8b155e62806eb580f89188a0b6c47ec785b8bbb0fa6b1fd2083c213fdaac2497c86c69a56ba2969b7bf2b3814b9256b16e5d7722531a405df3875805628c39484c82cfa7b54e82bc1fe4d5817373e141b5fc9ff22bde8650b429ea5d2c4e4d1b4e0e8e900ae47f6e56d93cd3ed40f6830209d56e092a667d33e8c014f2fa4f6f62572f29a73c4e56f6b71b792fa52e7a49944177501295fac7b66bbc2ab9a2b4913d53fd7e2eea3744770e257eb9e571499063b0e3262d8b0960b4a9bf7e96500a7a426258aa6eb61904e06109dd2800cc27f7dc55495279e6cfa97bfe0d198016b9fa2bc686d33f660023dfad7fc28f266f9f4499e517d91234e1d4f0195e3e8a4095552935e7e51fdd80bf812c0043158ef518d2b7139015e2baa2a2b4b503d240e278d257278353f1e3cfc3e82097aaa4820e8aca4d6710553a26378f4c06798d8cdd1954a693fbcaec5ddc262af851d4fd159aded4599e377b351912e20bfd5b5dc99f30efca883179db3bd9046c8b6a5382382adb22eb6a081bec4a7281cf4c591d20130948009e4535e36393c9681cb1f1c0de949152fb9a91a0f18087f9624aeefb554bdbf63a75df88eb86bc1af811734b8e0deefabc2b9a10edb3108ad7a15e87295e8219c6c9b983138db80f7154b74209d1e3d13f3aceff316b32ea270d1cf462aa56fa3bb5eeca85b71406e744e9923b4ec293acbee21aad6d2974462a437a8becfca1c2b317afac783d6f4c1761d2049a2e5252a74b405f46d95503dbaf4440cf773d2f88e5d1728326815fc3a56afbe9c033f4b0651c19503bb5b0a2312c7c3fff8d32fe24730e0a4be0243ff9ec150951ffe08de2793fc8a950ff3ca77c80fbb5a13095dad7cc23d096c4c42a3574b6edeb330ac07a1635ce38b23c658ebf3eade6cad2b0f3d38e8c0a18aa39c58980b338bf41174fcc78e77e2de3afae4eef66b1d5fc13fb90480f0055ca3504b920b4a6148f9251f6a3c7db958a1c7e6edd968804d6a012d5125ac466348e4e2579a9c1cf153a54d1bdbf7d6a4273888fcc78ebcf330bac17a88bccee4da8c862b711757dec5cbdfcb3df174b0177095689583867c32b2043f93bb6fe4e8a317a6a7f927f265c87b238f804125a323be5f8e046872b4af24dac974f0a78b42f5b14edc1ff6089ac1f9931a90506f1d7004ee54172631806b708ffbb7afff67bf080cc28ec10769c825f9937440f67600039d6a30d22c081727ac77bbdd639dc4277e44afe1c9557d6f4d9b1288474c20f8b7a839ef11e82d001738384cec763c0a8441806e5f5d143a0d6727a9c3f4aa7390fc90b1e6157c69f4e8d5391b45118b58deca04d01a9a80ba39383b800b53d2c3fb02a64417cafea8855ebae77d0e48d78e75e9522d260e95703038db8e0d546850058e9b431b59d8848ae2072da70ac5d211fe6d958f99113bfb2c5e015f066d55400798e92cbc63955c9bc5702046c3768cea2fbdf215abf922ac57b31e09213da51d1ccb0a58f63742f1398c324717f12febc38a1d78fd8a998281214605743579d31c1a6019185697cfd1610e0ddb4c7839443c62def8beebd0ecce207e9001e2c5fe759a5d2a2b20c17b84c3213a73e69f033fa071071b11c2bc79641134b6070179978e7079c91d3279c33e00c1e922292590ea7c606ab33ef8158bd38d9ed0f21270f048978c4c7c6eecf047b723e497af28a4e3b358a3b375a4a749ec29fd2af0a2f8c966f826755a850e3ced77515a13c8e8078dda48a02fbb9d7cc1e8077919faa00d4057c48c19b012999f6c40f1640756c80d7da23cd83354c2d864e1f1741812d20d3713fec29574312237186029e8c8ab74d1416fcfe98e2fc3d18ec203e3ae9e102cc5073cc777e25eedd1ff71bd81e076f451cab564a5d39ffcd29b94b9f57a630e0d4aedb72a22b74da9c8ad7c12c03d7c696008a5b358995b2616cd6e5f5cbbd9761f197ea20cae64aed852e4c18369a0cc56af00629df57d5610d15ae0448fe12c72336a69a49c5dbd473fe5ce98e3f39fbb844eb53d5a62edc2e691ab333f7a39a19a1b40a88ef81343beed073d112773e92295111cfc3e2a17655fb89aa7facd9e2cfb4d2d3ee79c2e17327649e117e74057eb4b438c41546222cde9161e9f74aa3959dc3fd8b58bd92e48b0c464915fe6aac30221257edf7b807c9987d7f5e31e39785d74d82a36887b15c53b80eb55c89e67b97266d513b3ea6d2dfe0983030f861de12d88e1d253be2cc1ccbf1f402b38839fcd626913a490e4e0d451219f53c9f2deef39f6901ff06387a0097915752d719b95301704a8fe799de8bc909e3fd6dfd6e21f5239f18b872d7d8f650dc43ca6851637a0ccb2d47cc45614740bb72e8741ab86e04d638789eb15ad6d82a3d28bed4487bb5238a74f2dc898ec3976134c07d5fa2c35f2988efbe77a8103e99928402f9e30497aaa1ff17f4f1cf59fea37c4e6262f4a29cb46085b90436f8f60f409b5c10fd67875509a1208fcf2a1163f2ca24d976a00982ec593bdd37a159336c2d046f5a04ce8a599b6aa9ea470c879ae830b06495c99a5af7355bc12fde8037a9345d82d2c6019837135ad5086523c078d1ad452cbf9c049a7dbb974bb69f41817f13b937470b5f7c2e4596e277bc1e726d14823ec214865842455ba716039a1a2a60257807e6058a531e3255b453134d15af295feb472df85249856ac2f3e21d85b0b7c55c48c42ff409eb1f4845b225f97bdc3094c810f223c5bad23b150d9f500ebbaee961a9570bc2c34173eef81f9fd82d017799db83af8cb92daaccc8bc394c93990de1a22c7e92f2d0faa073d611e6b30072678d49c308d40d835e7a10c4112bec5f0da2d0d2e1646f37556f947529d425874e2f52537c24691cd17bacba5d30c08435cd92a4c56d083d3fa0af3c6b322871a4d2a934a6b53dd6c7d948c400a2d67978c9092d4bd24f755aabebce422423c614eb056fc454a17b9995819fd112a55c1d5c58ab45362650124a2ca2ed943c93b6a7d8180a2580bd4b3f20b7366b8e5936a3453aa4416c7529e34778168e3c2181a169d82d854285d9b35c0b565071b6da32a76fcb2e3bcf69328d8afe940551b5889510ec7e3502652fa5ac1d77b33a50d3567035eef4f45676fe78090d52c43ea35737b3955b1f5a09cb00317bfbad1514eb08d1b575cdf385e2ec01682271b2c4fbd60d3bddf935abfc16c13b1b35f29308a8053af854511640d92b306aea6c6fd4c244354eee7c83d039ff8449512c6fc77ab3cd5ddc1d16d2ed2211899e6528a2eb3f14e682509844cfbd45b809694f1964d97cefb3a938bf9463632bc3e5f78e37e8be67aec304503245c8876d84ee2d9d88b119de4fa9832b26946271b45d5e52704d7ef181b260b7b37e719ff42b1aefdc9c95a8f0906177ca20dd9140ea4e8806cbd2ab8e7c7a1e80828d3426f5498b824103928ec41ab6342537661bacbe8b7a98cb5f85f7b81331e2807118b2641f50e6bd8a9212b0e7092bae373a36ecdb51dfc7e230f2c2018d5fc106d1fbcd563c098d86890b1e592a121a9fbf5f5e79b57b7ae8e3e87f84afe6be6bcd4d6c00c0d6231551e1d902822e16e12c88265161b4b1b497fd39eca34a3e36daeeb7babccf2ff2949f606784ebaca1cd66385bf7085394bdd323bbaee2d8b137e80060178acd631a5df46a77cab9a58417b538b0f261f0bb36a0a583f8cc4b5cf418691b1fa3fe138ea39b9fcd0a19495a78a25376d898fd1959771afe8976e027824b72e2e7adb4767a66f82f496cfe8f98cc4f0dfc63616eb5d8b8a4e303a9d9b106bd6d4efa86db18ecfe548c0c245bfdcaf269046ed87045a93e329851363692aa1c1242495496bf119d58b975298c909d0a065c300988a7301be84d4c1254569238b57699bbfc9b49c512d3392f7d1aff22dd3ed9ca5a98e6802b32ecc3c25aefb5ba79feb0018d02148a563af4d2ee22f8a4b9918f7fcb3d21a4f7200412032c4990daa6e0a15eaddee6d4d9e37a21efcfba1a632ef56d9762948aac786b818841c83ed65500d810e45d08e0da5934adf5065c42ca429854fe5a5a9fe4d8b9434c90f90ea85af3a204f05dc98818ae916797c655024d0922213fef4113c5562341a3c6bdc6882d2570e2c05450c6c0ac5838f768ab157668fe7a0c0d5b42a2b39b758ac395a658e31367093456db442909114b0302c7753747bb116685e25563590fd3959ff559e3538c535836f5f8b564e5ec80e037f2ee610e30fb27916caa47ad34cbc169fac039be25fbad4cbec16196816ec5edc9e2fbe796fbaae025f5c78eeda2d6ebd7d6146cce863a979ad9c0f3c02936e9c4ed6803a439b0aabb65b6f10bddb5ac7e6d988e2d473045d6bf2ccffa735ff1d1f6288596d162e9e87acf5b14e45069edb0920b40a29a2cba344e6965d6d0cddde830b54508a283485d4b96bc0332054868e10b685464b278375134683233d25b9dc56259d184d00f72acd8fe0851b67bd8fdfecd19dc2912797aefa1cb1ae9fc2b28306ada76876a31b89472c675faa9b3e20e92a317d5a8c2e151bfb9c5fdf2851c70a09d37aac1faed24b7f92a5eb23c13c61f8679f7f8ebe38cc8e7549d98bb73c66f7b67e4c2d25a408e864f26048c2e084bc38cf2dc59382145e086fe9c083d6e0fc3e9602c9940f00f12267a955aba7b24d45e614f56e416fc399269d8d5eb8b81a73c38feeacce50fe52ef76df520121022ee4c9af116f11f4d9ca8273fabf7106f61777124df92e3aca8479ec1866301781f5b3326dee66c397c181f7d056a983c8251b0ac6d64d44296770d5e63455dc005dd1edc14b85ae10c8a7d84eb480c0c457a207d79ca4a1724e253a1562f82efc659c1811e4f2ccaba8fcca1ca9398951198d1a4396f2cf089c23caf87d94843a510de204404a56b74e4817f5c5b4cae7130d706d4daa913c20de02e51b67c422c224a6a11add53596a99ccecd1f38c3de4525d92cbdcdae23619f27b470e78908ac166635d1c6aa9b92bd12ed4284bbab1c60715a8af2d8d40019ba018eca7c6e2559f79f4c49bed0b2b8f50e6649dfa6fd9ae5e28624c9e0b159d8f57ef767f2e5be9b8d3c7944990daff42cb8c158d72cdd8736521418cf8138f2d8513a066e6c99d605d28ca0c48ccc051ab239806f6551eeb995b293cd1c326ba124f1a0dc3ecf77222c32ea704ae18237dd14c8b5eeb00942531b6443d2832c034b134cf2e511ac583b58d6ac104fc4cc236b1238819472b7b7984d425454a98efcb26d000ce8bf6999676d46af504bc3b85d6a7ad4fd9c8d1da16b16bc5353c1fec30c8235414a047dc0571d6e8b8262075379a86c9c7c67d8c29bb3435456360e09ac5e1e90054adc37890610df5dca33c160e9a8bef088aba3802e663d7692ea647e2d122f442c572b24ac89fe893490e08b9a94e9c7253644e0b329cf09003384ff517657e1bdd1413711ab874b6cf39491c1528b46d95e1144d3f2d2f39e1f1191bcda7adc567844365faec456be35cb9e69e8288c3586998a3b86af4d351816eea4f2c522a5f905a26f9a297c4ad059fd021ee767f410b4eb08a8cf61d55c532d27280691b021bbb740db17b7f70763c9e02978454ea568c8ebbc154472f1980161e8766d0d59a1661622f559c2146460e0e2f3d48cda96c64c461f4caa4048544551c92d5e0008b3ab5969798d4cab05b953166aba279ce2467c583de9d564d7865bb5751c29c26792aa69ea23b5a0f03f11106c7a04866452a0a25079aef2d71632c812ee165bddbfdb5169f946f406b69c08e5c2e5cf4ac176df908b92114180aefd18033699ade8f87dfa02146f432a0f1c77742106613e64cf7bc4281ca8b13e89613ec1d95d0018db8010ef16c38797916868364e986556e362376e8c5dc472a0216846b56457959d56418f445f8e4b378a9df2dcd7194c7f84e509efdcc27a220ea4674eb31812045749c96646742fa06fc5613a5f3bc6ac9959c82ac5e38da3dbcae13e4f7ab5970faf1a1163fc1253f92a682d34b66ffb0a36973ddb2e8e20b1fe0225d9b4b2fb2009173bf33927b785d3fd1fc16d57ce781cd0d823480b178e382c72de759c7613c68e54ff436c072b27a511192cd294fbaa421b6a3c2a810e7c428ee2a731c95473bca0f9bb13f10a078783d0f1ce2065b8cdae867be90e3ac6a8890f6dc8932f14c42e535f384419a5ad1d39c346f6d56cce56fcded98696b182872751e18d0737513e351143771e5a98eb311d05e31e44327a67948224f9ed104d76224611616a7b0b8ea42d33531dbc98d4d9274d9a5251bf7b9a9325d3742116b2631e741dad5dcd3ec52f8c80e8c8cb039278194e1f536d52a22088f4e3a6702b46e39e592d5398d9871fd08b28748313e9f2e2de4ceb54f8396f339f7ccfc376577d81c6fbc08a3fc4b5dcd7880d4db4cc58db9f353a8f32dfa49de5fd13bbdd5cd2f2412a92d5e7bbbf1d25ef1b2de5a92b1709b8415dffeab77bbfc0aa478757da1b49abb93499129c25d3dab7c0a5e8beedcd2aa6fbea21bc75dc563fd9a435d316003e2d3cf1fe9fdc13c565388a12daa609dc240470293d975f01c08fad7ac5fa71086efbef9a6e7d3d4d61dbff9f4f3c76f1eebd7dfd4bb5dee80a069e61e08a154af5cca2e86319472a059912277a6a3ece6c644d1025aafd2367620ef49efa901f5f1c3f7ef7ffafc3ebfd425770e349cd10b70f662ddb48f28ad2cb9e7579fb47a8688b4ad7d9e9d83dce5ea5d6eb3b66d3961c95dd230375b6d57f48ff3cb1285eefc5dbcfaca9755bf569316d4e2c3b768563c52d42953340eff40db48cf76bbff0b0000ffff52ca028a323e0000", - "1bb7ffbc87c10d18914f6951d39775b5": "1f8b08000000000000ff74904f6beb3010c4effb2906411ef623cfe6d15b680225f45a424b7b293d28b2ac8858925949b9847cf762c74dff909e04dad9dfcc6c2fd55e1a0de51a22ebfac009050180685d124480b89d2d11fa14ab4d978df59bbdc16c555f7e9f7681d383741ab39518f4c6a65dde562ab8da846d6e5bd9857a7afff52323d6d3fb7321f6edff9b5a852d4b4125515de3a039dae0d7ae01eb9e75d43e45a49dfe984005e7a46fe820f9ab7a893f23a85a9fe747029ea35e0ce52699981330165840a8ccac7dba60438beb2587a5c7ecef1768b35785720dfe7e739a43b289787d8b89ad37253473601cc7c3b62e551bb63e75be10bf185c37ae5ecec9ca91c33a65f6f0b623e034a713d11007d6db5494a3d955cada35d55dd34c518bcf839574a2f7000000ffffc4af3d5010020000", - "22ff05a4b44a03ae13723f6a9efc10e2": "1f8b08000000000000ff94535d8b9c30147d36bfe222bb30d246711fa5b67469bb14da6ea11faf2563ae9930317193280cc3fcf712b5451d0bdd9761bcf79c73cf3d49bebf7df8066f4a88dd93921e63f2f0f8ebfee39750128610a99d674a15246a5975b47724bad98d8804a61e50cf84839b7390ba00ede1d56d09a6f52ebdefa4e25f993fc0ed6b1235ec88e0253f11127e0b226b7c825d10ccf3fcf3e3bb1f9fde272f8d4ee6431ac3470e2a8724c2ea60c01d65db4a2d4098595f735913c2b175c55c40a00721fda1dba795693261f65d5d3365328b0a59d0fc0fecb07cd6df65d72904ce2a010f6996a6e962e37d886233c6a113625b123c3abf890f0da095e9d1ae065f4fad24dd0ce41f86037e9abb9eb7245856e11f8e923a108469d0b3f0117cd11e353776c400a51c195752639937406938c072406aa61686bb96338fd77ebba58339e76f4463099d9ffe4ef773a13f1dfab3b7dcd0281626a622d0d370fd650dbbe109fc44eba4d11fa4c204ce60d17756434c6b885fc01a0197d543f91d0000ffffcdb4d8109e030000", - "2669267df0f493b450bfe1ef118aeef9": "1f8b08000000000000ff5490e16ae3301084ffe7298642e10e4cee05ee0eb6f63a5e70a49c2437f4a7db28b5a08d8cadb4e4ed0f3957dafb2569b5dfccec9671bc4ce17948f8f6f41d3f6f7f218e695e3ff87ec2edefe2b342e734c45c5bad767e7a0df31ce20929e23cfb024f71bc14788d8770bc14e84f871f71c221cc690a8fe7e4918630638ec7f4de4f1ec738a13f5d309ea731ce1eef210d88d372c673c2d17b8419839ffce305cf537f4afe50609ce25b38f803d2d027a4c1a37f8c6f7e31bfce708a293cf9ec7f751c3f937e7c8d631e2d9cd0bfbc6432f879bd5ab9866175edf6641862b133fa5e2aae704316626f40aa426ea2ce35daa0125bb6245b0b6a5becc918524ed8622fae81e10d990a4ec33562bf08abb2ed2a519b8592edae15aebed2bac6964dd990727427adb887c5b816a7d8da35444169f03d2b07db64912f99ee18add05dcba8b501a907d81d97426d814a0c97ae80a88f9b3628b5b2fca763e5845a54b4a54d8e70453f9efb869cd57ccf06866dd7ba9cbe367a8b56db257067b940458e32ba33ba16670bec1b760d9b9c9814a874a255ee2eb572867202c59b5636ac4acea05eba9d364e7467ff0105c888cd8eba7399d68b60a995e2abe2b2eebc83ce2e323b36b5365b5a54ebffd7bf5efd0d0000ffff99dd0362ed020000", - "288df37e7ab95dfbcb9550200ab31180": "1f8b08000000000000ff9492518be3361485dffd2b0e0b0bbbc54cdfbb6d41b16f628163b9923cd93c7a6c652288ad202b334c4bff7b9132c364dba5a54fbe58baf79ef3e914eefce2ede331e0d3f0193f7ffc05ee1c96bbbde93d3efe9abfff61977074f15fc64e27a49605de2cc63f99f12ecba419ed12bc7db804eb66f4f388cb6260672ceee20793fe3cd8b9f72f38383f2d399e6d38c2f9f47597904d6eb4073bf471408ede1b9c8d9f6c0866c4d9bb273b9a11e1d80784a3c1c19d4eeed9ce8f18dc3cdad8b4a4a6c9849fb2ec077cab68813bbc4919dc68305d96006f426fe734af7f704ff1e88dc7ec821d4c8e70b44b069cec12e288db65f3f83725a35d86536f27e3efbea7c0ceb704de149cbd1b2f83f9371119928cff2b02afd646375c263387443643ecf9d179b870341e531f8cb7fd6979679c1e2635dec84f8e1a6353533c9cfbc94431b1fec3f9c77eb6bfa70d7f6276ef5712781b22c3c1cdd771ce2f98fa173c98189211c1c1cca3f38b8979387b37b960700513168cc6db2733e2e0ddf486627187f01c9ffb353d58ce6688f1c1d9db182a1f83335f23b42c5703bae20a4aacf58e49025768a5b8e7259558eda12b4221dabde49b4aa3127549528135250ad168c9579d1652e10353e0ea43160f58b3077d6d25290521c1b76dcda9c48e49c91acd49e5e04d5177256f3639569d4623346abee59a4a6891c7a5d93fdb20d6d8922c2ad668b6e235d7fb2464cd751377ad850443cba4e645573389b693ad500426292bb92a6ac6b754de81376804e89e1a0d55b1bafeaecba8fd1b8f2b42cdd9aaa62c6d6af628b9a442473bef55c14b6a34ab73a8960a1e0bfa4adbb666729fbfce54f45b478de6acce4ab6651b52f8f41f485a298a4ed2366a166ba86ea534d79d266c842823e84c91bce705a92fa8854ab43a45394aa6595adc4ab1e65a7d89f5aa533c41e38d2629bb5673d17c462576744f322b58a7a84c744593acea8a84dcc7a19141829f635791ae4846a089148b089496bcd037d73221a185d4371ed1d0a6e61b6a0a8a6a449cb2e38a3e8349aee2057e5dbb637b882e598e6fd429ca527993d83cbd24f81aacbce751f6ebe55628c55f7392901515aeb8efb2bf020000ffffbb5d62f6e2050000", - "37e6217420675913821fc175e7dd25cb": "1f8b08000000000000ff4c8fcd6a14411485d7759fe2d810e906ad21b88b8e9b210b3722a80f505d7d7bbab0fea87bdb6408f3eed21367c8a26a730ee7fb6e75fe8f3b327c9a8842aaa5297a32dd9cb423d315e9884c770cbaaca3f525eda4cef79f76be8ccd753410ed7668a5e8214d685c1b0b6715e8c2189d307c49c9e5094f0b677817234f780aba9455e1f209b28eff2b427f5dbb6dedf1fec2b087d7f485cc6fe10700ddb8ceb38be5e397bb3d4a55b13f97d2f4bb4b8cbbafdd073a5fa41e9fd9afca70d3247031c22f214e571f81968be4c6bb496e4f580573744781abb595da82538e27bb8dfe5a8220c8f590f184e442b6dbd70f16df1425c71332f32b6171b57246c99edf020f69b234afd95f2dfb012f64c20c6e0d0ffb5be9167fbe24eff6c8216e553327b53f5ac81a73cfad0d644c11fbf81cb4bf1fc89ce94cff020000ffffea1157a3db010000", - "38ff45a61f79481d5d34d8d9f9676c34": "1f8b08000000000000ffc4bddb931bb7b13ffe8ebf02b52fd65651b46527ce499c4a15b54b59acb3dadd2c5776f408ce80248e660006c02cc5fcf5bfea0b2ec38be45f5ebea93a75ace50c2e8d465f3fdd23cffcefd7fb8f72f6eeddfce941fe3abf9f3fcdeee4e3c7b7778b1b79b7b899df2fe7e2dc5b52cadfb40fc659f9d344bef9abbc772fba5f692f7ffce187bf08216fdceee0cd661be5ab9b6bfca37ce7b5964bb78e7be5b57ce706dbaa689c9dc8856da6f2efdb18777ffbfefb75584f9ddf7cff0f21e72fda1f9cd5d204b9d3be3731ea5646271bb73b48655bd99a10bd590d51cb17ed572a9a1e7e343a08e9d6326e4d909d69b40d5ab6ae197a6de344ae86289badb21b6337d24418deba2855d7b9bd6ea7e2d296f17f8f5eab7ed56978ea79ab8980ebb5f64efeaaadf6aa938fc3aa338dbce3894d904aaebdd6135c78a7d7312f6aedbc088926b02317b7dacbcfc6b60176b077fe7398c8b0d38d599b4675dd41b63a988d254a681b06af45e3dc4e7b24a7dc9bb89571ab65e3fa7eb0261ea4b1f40715340c6a75847165d0fe457b99e69fa62df1e202ac4ef62e447966893baf9a082ba2354af835ad4c4427a3faaca5daab833cb8c1e3fe5bd7c39ac3368d8487a0716d38c854cab707d9381bbd0a7122e0c5f344a5f98c8ddab64489cda0bcb251ebe3f9c4c97caaeb805d807d91c84aeebcdb78d5bf7e1d9dec61e14055600daf7b656cc0e1ca41015d601013831c82f60149f7fb565bb9d77058ea338c0b2f65d24de02778d9ebb5f61e582fbab4cc0930a0d879d3e8a9940fdfd876cd0065b571ab22ec5d6cd50bd1b4a2797551e87e9cac4fbe620af90db165dcea5e9a350c29f7266caf27790ae975a3cd0bbc3cf806866cb5745e36caca8d8e78a7f045b15716fe59bd0acf54e79ea7771e4829774637b43a18c44aabf702d7c9471426789279b8cfd6edf3b8ad8331038c6cec864ee556bfe80e6e47a0976092aff1d5cebba89b485c84222c08ba527b2743d4bbf037f9eacdb55421681ff14693a07376b4215ae7ab1fafa503e920608d288f9258d86f4db3951bf3a2036ea0d31bd5919c0b285959d04daac313cab6dfe3a56ccdfa309a0f373b934137ceb6ca1fe44a5bbd361148d9eab5b62db01c702d72ec77993b0c1146987ee7418a6b1b83ec550bd74baa2e6a6f15c9d77c61605e3e8f099c74dcea83483cb137ad0e3baf550b334de44a37aed752bd28d3a95547b78764485b9d8d13c636ceef9c57112ec107650ff50327fc0affb7d5ca470d5741d95668dbb8c1ab8d6ee58a88e37518ba081baf24e454caf76eaf5fb49f1c49c672c387a05b38d1b1a80c133a421a56f6ea20d7ca747452b0c7951be25424b570411f902a031a7fc623a1d334ba4d34c6cd743ae2c291d634806a1a1d025c0c7826896f604e3744091b925e775a05d26b41d4d733ba6aa8e9ff2fed95e5cd480d452748fb20fb2029c3d06c919648285d36562f84f821148610bcb4acafa6522e40f4fe7b305e07fc8d0e0f1807c4f591028b4e00eb9a3689944a28adc70b4914f683b54c5d9f6823f062d02b2af2e053a493d76b07579a0f62203d7a7a7213e9ac50fc5877e01333c0f534dc842ffce9a9321168f1e26b8ba79b6ea5eb5aed93b29e483815d0095bfd8d1305eec2b9c3966e0a3d3e917b1546ba45358deb77f09c0ca6379df272e3541790262648138492ad81b7b58d6525684c6552f32ed29a1eefc800e37f6f5510c4b4708941dc5f7e914566ba3f5ed38c708e836d35a8ac62ef6516df79dd18d009daf781cc00675b135198812c02216beca692b3e90e12e51bb2abd60eecc3cbd6e1f3fce9c352ceee6fe5cdc3fdede279f170bf84877f98ca5bbd369666c4f7af9e2b45704516017240dafa4f69f3dfbc9f345e36b7afa4ea8293bd563614ddf4ba339fb5ecd49e75a0daedf0021f599b22599b708d559041f70668353470f37a153ee7e56bf948f2bf5e3d48ec3c278a7abca57c202d1d124a5091562fe55c35dbf408d9ca6deb75407608f2eae086aba99457fc820e5778325770a83b03baea0ae5f00ad4556b5e4c3ba82e8035e1fc4659f31f55c8feece41569ce2ba9686d44a8e452acbdebe155d5aa1dfa03f08f9df2311d07bc23402dcab50a5b142428a548c3244ba0e8f00953386e15291a96f9203cacd05f5443160449994a5de1e24c48975af1c22b2970c56b125af9ce801e805760f1f45f572b453aec0a27ae9f6253e1aa712fdaeb16ff76c5a4d08617ace560f39c7cd8d5f038ba609b877fce44de79b7531b15f5299d5b6413b4cfc8533191f507eb3151536fef86ae251b174ca4d678ddc4ee00eb48868ee90eb233c9b010c6aee134d08c6186036e370d3e51cea853fb89d45f1abd8b527fd1cd10d91984ab2f40ee0d510313b1ad459a7ae7cd8b221b1aceec91f7098c606cd30dad0e599c88913879859b75455dd7b2e57a928d816c25b14e222541c624685830331a37d8e8d188c7c30247ecc544f8830a72afbb2e9f44e3ec8b3e6677b8a770e7818376d5165036680bd3f3d002981fc64d9e86f3d9f6273f022c35cdae187a84c903556867cab8f56ed86c859299a6acbde9c4a575327a65c35ab372279b977d725abfb19ba4f4f23c2f9a26c03fac55a3417cef3a7508f26ab6836d790347758766f5bd8ba6d1e12ad91afa4b0406c11da3a3c187a768460b920569bef3ae37565be0ba1783aa5cacb58ad9e3025f20cfac2c705b9ebbb09bc5f9b34f20a2ee3ab202984a2ab22d821b977be5c19b3da0824a9247be628665dea837c12f187611d91e6a93d396046c40614954c53170dc2298935aa1956edd1eb592d17b3e981c5529027cb10657b13a879dd7019d08253b135076e226c1be53a869bc743b14cb45d728d16b3b4cc817278a4b13c10325118323f55ac740f337de44ed9335f4662a9764f5ddb8b6a8feabca14bc22af7d248ec83a00775cb7f0733f92f318fda06b595f56bc0c2682527a58fd9f46090ec397bb659d7dcd765c1a548d04ef322a105dad5c24a295d72b42d27d24816cf037b75e9bc6a84e8434420ba60599710aaea6db58f31fb0b8f9812057ae3d4ca43b7576f2442119f644053803b8f6cd00161ffb793d90a1537633a88d063357b3d718d0e1eb0ee432a9ded94dedb6c1b651b2b278494394335a1e029cf39d59790542ed8ab4234be56246f01dcdea8375abc8ba159f025692fbadeb3473fe2b750dc4e3b7db4404eb7cafba74e862a79acf6a4342fe83fa3fe7e58deb77cee67821999e2c958a49a0223d2eaac7f18eafaec9e20fd259b2b548b026df212f98c3752a8a9379e1ea3b69fa5d47ea4cc953c6c103a3c5292bf2b3ac93c28942495e07ea92e227011da652cec4d5d12aae986de0ca391bf5973849ac2a7b7c146c351b8dea50c2e34be2d567edadee40c4dbd6ed65c03326d204279dbd4e34482e257b787002f4b07865800d0ed7a091698324b8c75ce1079022c8b430bde9b4274e24a7b01d9a125fa4e7ac74e5dad26ddb791dcb7b30265cf0cca137ce7b1d768e4228246846e2c48cc744a66222759d38f649add6296689267dd440e31055d731f3ac699d65af28a6af7161e80d57936134ccd51121da2a313cd2b3f1661731c482a155d7c9b875e00866bb61141289b2759a183dddb934ec77411c5f57242a6da47bbd1bfc0e468ece9111ce3f802b5ce23f5e6b91c279897753cca5323a8d054b1a88499efa78c9702b4579797c2d69b55329df01837e51702d26f2dc398aacfa2b4322bb6b726d3ab4aa826b40a3b7745df934e9478e9532d92938a98f2f1705bd5bd925b251fae260554fe114d119fb19e4f6b0caa4495641f6062ea60138563211499dae0eb01fd38315d2aaa85270857d59f47a8915d69ddbcb958e7bad2d1159d46ba802fecac730226fba20e7e88a5c3ee2a16cf6a730ac0fa251e041a56b20d5105daf226f90bcb1d3b947d3099aeeeb6b195fd563b99723a041f5d5ce7e9ccab72a98463e668784dcc859d77160586e30e5d09e31a09029d3cfc9888b9ab4cd49d0f831055381dc98d9f05ebf38725a922d477c15810d4515c280c77b1d535026cdafbf80d763c06e55ebb5f17da090f6603bd31b18631c6a4eb2e5d4eb63e7d40d7137443a95143e034fa9f890e8b0f2bf31005b2d07b520858a79240a85590c54a26a0195d7381ba28943645bbc0c7ebc3fd57cb66edfe97643f1732ff84cdc5aae95a16c428e34c3fd78511de9e75048ba3a8c7d423ce04f6e4033193c9e0912863d01726a47cb0a2515d13acce290719dfdd93ada149cecc03e527c16290b886bdc9ba053be49180b4c83d9a0b41a36da8f26e7184ec83c161cb00cc961e1d672ab5e38d0d9930b37b665f597a61b8279010b0e8638b801257a0aa862120764de5a35a623c90bcf95002a88650e1c559c9ab23daedf7507a4854837201c3b117029b3a3876117905bde907dc61a82282cd82944d1954f0e7903f5ce76c871f5d1228f0e4df056653f045077703235259ca5035ae9adead613bedff8278a411867058712612913bcc8b837dcfacebbad59616843f7746592834f3132cac0091c316f43b765e36e888103da06c3fa745e5bb32315747003f2ea4da61b073bec8159be31be197af003c0c21fa5d08147c062e7a0a91ef1280a18b9d29ddb4fa55ca2b9c851d671a2fc17198812f2cd0f02580b531383b5bad121287fc005fe34053912e149bb911f29f7444ef9135dd877409e998de6f50d2ef905cc4967e51d5fc77b373a3c50a55d2757a0a775afdbacf6c1625aaf35c506a26eb6d6756e03ca44f45a61a6a2d0a80a0a756a2fd743b7365d877cb3eacc866f073f0fce50a7c59b374905fdbe787ca80447f45ac58354addb45ca1bfdf883bcd50d4122defcf5af3fc39d1229888e81d8c42289557588de10919a1119dc1a9de4b4872ad74c170ca5c258564e2869ab8010b0594e2dba3d264be052ad4c2b4ea619d14ca6f9e4386442399efa55f00189f02450f517ed1b830cc322f98c7a4426064d0d866c74e2f88a922aa4a05f683a657adc0966fc23ab2c5464b2201f9c1f47ec6b370bfd42b2c9dd5a6a0bd2159d48b501811b6b13176d93095d7794aac61397191dbe6362f2ce32354f0e4d9ca7269ede9fa6d5bdfd2d01576e28a0566b203edd236c4bda18ebe7efc2c8a421e592d3b186527340bc5eb766e8cf8b691b76a619dc103a44d6882a8cd51d24a78b80b3b582f32700ce57835dbf88cf5aefe0c45443c174fa3b89986c088e8d26307fec4158675f27f3e425a76e5af6df55d3389f4c7116417f29490d62a5f62b0b60faa955d0b6a1549e3de498db2fb88c0d5e9eae1325d370210626152af58cbba9a3e1f920095701d320ca03f8ca3afe6f504685acf5a1802121d2458071104b20c3b0db39107abe040a19b740992a3077d79aace23fd7ccf621d9766c19338aeb2cd7d591fe134395ad8de3c058f6b90d5b8aa39738f692826235d72611a1453611d2d1fee91cc7729a4b739a66cdc08fa2c8fe46893a758dc62b45fd40d937cafb4315643ccb94486e26150e6338aeb3312f1424f2bad32fca46f0ae34270557ffd55c0840c3f7731ef49c3b4137a3d6d4741fe859a6150ef397642ab35788b123de4d605844f9011ca24468384018e1eac2c5b9e28d36d7c42bb0c764c3a28ab0d1f8ec095791b82af307efa74d51ced0590dcf498205181b9ddcb910744859605572644703ec4dd751dc7cedbc261130a9efe391aacfd28278a32552aa8e24cc24490f5c75ad3ed83163c8177aa3133eb28df26da703722cc6cbb77075bc961452d4edb1e34200004b941efb60352d93b75a0cbabd3a502cb28ad01073da17d5196044d2ced5a08cdf424858d03be5499eb3726853984bcaf65a2e2a75b955e12ba99630217945d633253f70948b89975f80361c5f1a29afe399784339328d57843cab34d3e5594867e310b88b1c8340c7076d71b4f5390e4f01c36c2b8c6d28e21fa27ca21c67e15abdd3b6d536a684f9380c45d823e3a5a534111a4e23ecd4c8d041f93e1ea171fd0aa3fa29439ac23a646ef452c90ef4498ece4fc0610467d74a255f5c37f40c5009d179b54175334a472653a04a315b71a5361b60e8a8afd229d524c2cdc73002552595cf2b1729844aa6192a5982b7383f369cdcc9f8df319652acf4c1214938fa55f2faecf4922333957261d1653b777c98a5b732efa8c4341b351042308ce4506d3d94dc67b115d240c83b3fd73af5ded9d7ac4edf39df5fd0a5e340c9998071d680248c44d18041fe0989ffe78b8ab04ae8f5aad91aab5f7bad5a947967236247931d9b34c44f5617c5ba57874aa5dee4f98e82e96818e87ee55a8ae062426f7b086803936d4032eb55894f574f9ce1d1eb09e390943519d887439c0ff5992f64ad28d90e9ee26769741a9034d810a2eb093d803c8b31da84fe43f94320d5a2daff9fee599150f3e0bf5bb2022712a53e597b5182e900f7c56b2d0f5a790add568f90e6ace24fc998dc91b64266f74c99cac8a4c0120535f2567ad7ea0ef5e5869dcca4c5597527dc5e4529ce642278960e211bd35f8bdb9286af0f277300af88eda88bc1c7c9797ea08d20c1ff383f4c5286142d77d6e2bd233400478dbc56c159069c50023ccd09be549dd3607ba644bfb2598c5cf5eac7eb0a1fc8eec1d7b81f4cee137ca402cb935d9062c1313f57d275ec5dd647c7888eeac04ef9115658c330cf2db0b6e112b4189dd490824a1428764da3025a66e48e4aeb6ce3fa5efbc6c0dfd01ec351525cb942a5b7e7974f3a345f9eec47d24ee8895532107f5e15bbe8c2c55fb13786d799ce88c94f99198cd3239776aad1f2d5c6ab68f08a1107d1795c936949142c51ea312af4f281b34745990b7548709bf2479a1c390047590f9ea283c40da4a8b29dc48e81ac7cde3fc477471e704526048850e21957c21e461a722c4ac309ef4e2eb2125d3c42fed1f5ce405466fb571419227980f20ec85ea239876b1c83c0be24ec427d040ce4aa22df95fe25871c5c24435e57d36955458783b4fa4bcc0645b5cba070d47d421eaf0da50c2f52772ae5d3c8cdd81778b2dcba809098cbaf4ff86ec06a5370b32e1e3af642c7407d15b2ca2879eb009c4cd9e630f22603df1a7df1d60c1817dc69ed5f47f71afe3fc1bf32e42f5118c781951b4bf1024a046a049510edce64c2c7b94118823974140bf45aae3449db352a0c3e26ce56676476be351cbe615fbb12136d2ebb000f01b58bf375f0b15a20f8092e8c53c3863330b0e11c2f397fc5e0728c92ef8749b9b8ab9cc86ec7d994135158c1903e8253f7483af40a97526968c40e86a12727031f498e4e463a89a8ec06d1ed3bed033ad2e099691f0f3560c6f728c7b35e4d0f4fe45af5a63b4c8403461e82debaae4dc9ab503460ca1ce794372ae78e462b6523188bb660cccb76af319a8f4e826c3558b9c6f2bd23d064b61e0cc3fe469b9d88d60dabb81e3a2a68285907af83eb5e88ce6bf542350968792814a8ef8e105422cd93d51362b52a8815b83d13793522d408572de26187b6a223149db30546a4a26c3a458221adfd282c91f2c6033a15288bc7934bda045e1085e582057073f4a8504d1cd22ae988f4979d6ec8784476de5126203aaaffe1622158d814d82e999167c97eb4f27458d5181830802b1815a28e44b10b40a9b70358d3442aebeceb3c012d77b03834da02f017e935c315310381d604f0180635296ca619c058153ee15e1009bf20dc0e39c80b9454f8df091e545fb10a21d8ebb8756d98006f34ba1d3cac4d0d71eb3c23d6e5677d20f292e03365ec247091c40c1cc22002e1854e0b46c299e846c2e38d160812489ca947c26abc70d9a2d3a3e5f54388220cebb5417d3f52339c6c8cc60e200c068b72940ddf51b10b092d91a4a4b168c3aa8090cd178db80a976252b42f82e6606a73a5d1cd1fe7838073565a5bac6ec3f35bac4749347b222aeb506c12faecf1c17494d6ab51396bae632437b0a66ec10655d67ed30ce0a905919398a40e559aaaba898c1859d7d15118b2f0a6189da60919595de9b86cda31be6aa7e360e221dba5823c6884aabc3a1bde1caf30a072544dd4defc8701c75a9c5561b4ef717c3b111543892b5dfbbd828bf82eddb1a9946f87982af24a443b477a30a623cc5a5a566c70d6d65102b8b203a5d711ab7c292904c6dea1be5b473cc9956564798f288ec0bd0c37ab83a902f98e0724ddf1f4f0e13ac396eaf5577ed4a5ad9f22f494381a22ddb27ab8e4d283ed8870f4943d42861e76ad8a9ab0119cfbc13b5bae4da683afb6924b2d99af26cc4ae2843c999bcdb7060545911d2025924fc0e67eab312cb2df6a7b92840241a5bb750652a474660bb24c13180ab555a92aacacb53491f3f2c5b80ec8419b1b3a82ec81c08eae715d2a1dab5175aaf12e847a2086687ce52e9054b878cec91ac6805c9df73c7b79a832095fce3191548b2852ff03dd52a937e747e41166f83260581c03e7d877c5d993e7681da114c1145421ec61c1ce8336439e18ec4e359f31f1eeb56a19fcc09e1652eb2f53392b7999679d02aa57d55f4b82235ca1355f416f80c7192f7d12de4c6567c0b38cc7a18a0aaa0544bca1d554f4e375527b25e53615e717c155759c81e25c53824d504e2ca53bd08c142b4d98112a728bdbe4b31fe49e8a696ab07a1dc81a61314452a99470a258df49cd53a7f6e484abb36b1714f94e28f51a439bf3b614fe835ff806a2295ff24922097497ca9b696c4a579da1426aabb0019384ca17c4093cc40dc91c4cdb3ebf838b80180a569d83c6c03614d7f853298af0ba770c97393f4dca67abc8254a20e630e0630f896c02d312af2e7009132f45cd0a6e97f3456ecfcb501d3a71da835a62ff639f367884f49e5e9764038658c485e5839c60a138e1dc31c745d0631ae7a4c6b83b4c1fa6fe0e18ef3d8bfb28b3316e2bc23162254a82bea5de21eec5941adf9ac1a9e88641700737c06ece2c309f225609b0e15c945159d316aba4116c874797c6befeaaa018c394f0a792fcb86540127a93097ee13ce5bcb04cc6242322c7a4129c39056a8e410e41bef9330ad3373f1fafe117b0315312e229979ba2dbe25fb2fa2a253c55f899526e19f642a95122975431a71d4276070afed0a7d8e249b61507e18c6bcac912e9293d0796872267dbc4b2fae61aae7fc6bcf52664df6ba4839d371b63b3735b7896975f2a6ee9f773ce0efa77792f2b2d7be53fa33ce5213285f658b617aae8610ec3d04254ee1553b6d25ecbbb74d85cc347810d549570f0298681ed76544fff41e97de78f4e22fbe869c165227d2d6f75d31131a32340f911aaceab56c3f608c7c8ee07a6117ae63578825631298f9373c99620d2279479d735a719dbeade8e60756527888ba8b7a1384194897f18633c403a87d176e5ab54657b748c8cbcb9a65b486d8130fa20550843cf6a1b975359ed47c6e83ad1da1eeae758731264e8ecb8b9d8d8f458d3c2e81a5272670990ab0348ca1d81d88ed126a8b31b67836951ae5d71685e6428289a37b077be89bd56c9552ec8db12604fca750c006c11bbc44e4fd2ee86a0f6e4f5281610e760499582be887953e42c268353c9331b29029bf52c1d80c6aa33b04d4eda74e5f5893ca0ac0644cbe25c27082a6d1961a26bd3afd2ffe7144b61caf1ceaba47c5d4f5b35151b67e611e67666d5e0b721863d0cfe053b2881a4bab4fe3a4681cb2533f764d15ff10d70bf024d74b40e32082f03d8ea62a60942465424b5c8418513c61df790a00bc1afa3ebc8ec646c8b22c36ec449b2636428671b7f7602c8aaee8f3bbe5193645031649d13c3a5e4b6023c259b2bf72801d91793015e9c805f04c5008045ebbc066f97e3087b45d8f6ff99a283622cc5236adc07d6a3e58a91d2b2e9e8e4b8a01bd700ca3074079139e91406087e3118a831ea7e17abba1172f2f36c8267a3e6762fceb09f8978b9719555e40de8bae355dd4f25ddf81abd80a224564d5f4e4ba1344558041cc1c6abdd7624b6de50e8e37d050a43e35dabc0fdd9d0fd3e6b2246b684bdc85df428ef5a85aa8f0d408931228c2f90037c2db2114a09658e0c6340cd46d39db523475555b6156b63c7441c17f6945a60e05a456d0426055bc5830b1e7cad4c87d71b2ed09a7396f46c21c7ea404d202a1b06e3ca62e70d150cfffc836cd1aa59473e09acc7c82cfac179ed90eaa322a43f44445111b1dad3c996d21bb813a343b517f1edbd709b2d4376c2daf8106534bdcece48516e2c6bdcfa32c7a47a5ab24faf8b1f278e975b8a0e9a81138c65d44cdf9f6afa0a467c34daecb2e34c8ba2e05e910ff0ebc91d1b07727258afdc4aa058be646e9dea10d09a42bf2c9322c137f204b851d8cde96d9e26bd921fc6b1302297e76e197a11eba3ae38605295bdc97f0faa43bfd4e50e2156efc7bd24132a41642d3b422f83350334fbeb14a37f3b2c5d024f838d514e1fbea78ab6a37289849dac9323aaa1761947b566ceb70457490b755e6095df089154aa1f67b6315da708ca9dbba59c420e319a8f26336721544a71e97f0fa9d2e01b0970512d8bd7d399cf1a857ce68e143650994a5501379817982d1db51eaa01c820a9e9468ee1c7e7340861ce8fca3035576293e7480d77aabbcfc29cabf5ce1cc2b8a9daea50f5d8a1d24322f24981e98401016857b0c22a3438b9f7d46e88e1be6029cf92e6e347d898be757b1ba2d7aa974f19f8822f6173aa2c792ed45a8db32a23ed9ae454a80cdc53ff323b13132ec49d646b8122ce7c2ad4e805e70c03a522d0fe1a11767c17c20e1c0c6c5ae37c297ba2ba4c83545b1dc6154e950d59f7189b5979a56d44e7a9e47faec8e2af334239e744f350a92635bcaa5b72910956f2b8705d3af4c034a16e9dd5e91944a891e1713a46affd8638a7eef785f2edd275a5ae3784634ea82d2b4f77c730774a1221a95514f55e410857475c8b0f429a74a17a60bf5511ae6891e7a9de80722d946c3f7c17e4ceeb16ab28290c83494e1da2dcaa961c84a16b0546e28ab9b5f3fac5b801cb13c8e29ac85d37c0bab84af1b8aee262a2aede4266d70b6b0273461cff8ea0fe78d412964bfeb2aad7ebb5f3319c98cdec6f83e439e342859479e332c39cfb3c2ac907958f75ef970ce9516b08760a453d7fb9b15a4fa47707d571a6cc55103aaade2a6b395ec7a5de4a877ac7d6448caf752672eda918818531b1f49aca20e9fc11918affc6a44fa7f66130f11aee90de24275e54863a3f5c04765bb22013d24a131908353329c8466c50ad3aba8a40199fa35e75533898a7009fb8aae4cd9ba97cc4d94369396729eae8fc5502de1c998c70a77244176b02ceb8f1474aba6a4c37ea16937e3681cad848f108be6f4328bd094b21448228f032bf0ba355e7f67bb98664f464698653939db35420df467f166ecf682696935d1dc2ce034f0a68a9f35ab507a91a36729c17a048c9d44f7f9d244d31742da505ab134783bb57d682b99b4bc2c529647a7dcc1c182ea41a694e8b1d1365225643aed6499969daeac52561e2091b801d194ae9ee9f2be93d3337dd6851075e7143a599cb840fd27557a5e15b0156a4f0aae0230aa9f21d8bd2b0dd11108d4276011fc980d751a800530d47da734ee59d65d59511a630ae91db0f4c808fbb766fda22755e53cf9c91cb5d89fe31135ee041302e04b5b4405c169c255f7442bbe32da72b5edabe50578aaf9824343b6ffc126350202b557f769ddb9310c1c6de495d61f4e96abc491212f690c223426dbce6e814a5df4da4f81bd797c9565bc7ee0b75a245041236d340ef1613a7af72db399b463eb185b1bd7d7987e67bd15651212776961f38ee4f4fd4bd27afa7d48011cff98ac1e747411302379075911b64724377c2aa5fd8edc9be126bd4c5ec38ee3994d391f9fad9e2696055604736b83d592a55a95d04a7d606436a12318611630a40e496e6d8cadbad4b5d74fbcd92a48c6d57a2f457ce931c953c64258d28837127660a31889813aa438835f43515885dd86b74187374224f5e80aade53637b275bbdf3609f818f8280142651d5951ddb7b8e19829c6413ea284cee5cf6eaa73cc3a49648e20f48a453180142085ae614bc145ded36658fa894024ca5bcfadf6366498d0b7364863329b9390f777705c590420047ac25b90b4a05591627e16d6e7a4af6578ab9d0c2a870f05c6da518bf49da273bac35d4c3b42032d7d44796d69793a282072835771c77014b96d8a133fa45171006dfba89dc0d3e0c8a0059643637ce5a3d6a930acab51b83ea9c177cd024dbaa6e00b5838cbedbcebb6648bed68b3eb0273c39719db17c1df387e7e4109a05353a5807765ecf35d0c9065a6e2d94d0be796d4961889cd080bda66e7fb5a774e24ddb335c82df4fa0e583461885b0899539e4d37575f5ca780a32fc30108e99eadcda800dd6d931614c9057ad098d37a8529c3f6065ecb9167994a7a3667f8ddb55e82142864f72c79770ecbe906d1d4a53afd26f812c83e2e81cc193b2f55220486338ea652f643a76ba8e9503918a233968bc163718145361cf9c04ac00959c0b149c6b5a8105c920d252ee8871b2f4b10c5a60819ca01adca9438f382757120a3cc3a82b05b7a649f1556e127820603e8b95a31e7df57cc763936d36492dcdb3a82e81579224294e77723b52e07582654935fb1c0b7cec4e7a2a15c6957823919641b40cde7945f839a3f9a31decafbb903a345f93f2585dcb9d3754e248104fdb9e9b3a5f51c6b907363d529976483211b3b3672e302752606d1a63042df57460062d624de4c2d2314df62a7bcf931275fff17fe407e59b2d7e4c2ae18bb6b9b56c15f6cb951ad84cce0f39c7c7ee7405d54107d9f4bbce606f46762dcbe749d6394c33ea2bcec094832826f24a8f919339ec5e673ad346b9b1d59b1fa7f2dec9e5e0bdc647dd5a3e6037b7eff06b59adeb93fd76d4ef8f42142df72993af927f88edec06ec0c43e98cca7e2c8bbd4e28361bbd6a4d9361f9698a7329b743ea6fa7bf34a06e61de1c1bbafceeb4989fcad68266ace283e3f606a9b42c987ee8a2b29a5a121152efa433d72824905aa4a44a311fa9eb4af51aab9793b87c1dfee1059a2815363f390e15259908a4c5005ec989a7ea3accb9a3addb75ba0185cb7e1c9a40b904335b3cd59d8d0e044c5fa97c7104c5e42a15feb216c50233d9560eed3f37fadec5884ad905c744c3dac325267466c2a88d8bc7ea6e466f7e9aca27ddbba8e53ddbdb8bd2f7fd17f93123e6befa059cff1e1dc8b42f10489109831c7252b942c087aa873bf9bbf9334822b71ea9be47e0718b5da9a63d6d5e8fb8439c926712b982147db7aa1dfe35d695e08ff435b62ac373e26488e250d5a3b3a197a2e0a32fc69c2d8efd762178f1a7d0f4cb0dc5730b00e50f22374ce31a5895db7ee45a75fefa1437b939bb1812c8752fe1cbd5fe9ca5ad4bf9f3475144f551940bdfb64920a4ea5b52edc80a2784488a40e4d8c37fcf92d9f1396ee5633fb3e65c19ab4ff268c96a1a7d218571d467bf0273e9f34c54ef484e84288d634a33e2ba3bc8d11746b878eb3c461eb1227515c9a8450a22c9728de789152012f0bbec35977e60a386dce006ed75ac4dae1157e956fd01129064fa1348a617034af1b7d197ca8e0271b0df4b5fa2240c35b7baf33c1a7f71adfa301147f8fec8c7b348b09b9e1485e93576d46cb6a3e1041261a5f347968c956167bcc9e5e30c932d5f9902eac26209b50a2fb43ad297c8047f3f07a7d879b7ea74cf369c6db4b7556233f19909dc8a17ad55e08ec10434add21376e857f82d2c821a8a5ccdc0a0e3e47e64cc3abd302e213c4f327144b22b96029d8ae52a5c9115c5a6582cb70e5743087e1453556cf1c2179f38d093807c69a1222fd4a77e80a315c8d117b3e2311789c245a780ccec2b12b90ed5c7b168fae4627c93a10a7ab1d9ba94244b6361f8332f539c5b66c5ecc9b2ac177a729c3befbe1ce8d38aba316dfa68e17a8883d7e2f89380dfbe0f3012978f4c7253992f87ef0287f4c6e0c3716abf10ad061e5599a26474116570f4f4468a3cd5c6cc1d1e6f32faf35e80b81b8edcd5985deca0c5187151579f542836eb466f54e6ea91d1aeec41300cdf9dc159a17dca1f194c96006e8b61e0c4e65289118b9220fcf33417281063fdce250a24fedecf9fe672b194f70ff2f7d9d3d3ecfef9937cf7f0043fc8c7a7875f9f661f26f2f901ff3dffd7f3fcfe593ece9f3e2c9e9fe7b7f2ed27317b7cbc5bdcccdedecde5ddecf7a994f37fddcc1f9fe5efefe7f7f20186ff7db19ccbe5f30c5e58dccbdf9f16cf8bfb5f71c09b87c74f4f8b5fdf3f8bf70f77b7f327fc5cdaf70f4ff4a27c9c3d3d2fe64b58c76f8bdb79bd2679355bcac5f24afebe787efff0f1392f5e3cbc93b3fb4ff27f17f7b713395fe040f37f3d3ecd97cbf9ad7c78928b0f8f778bf9ed442eee6fee3ede2eee7f9dc8b71f9fe5fdc3b3bc5b7c58c03a9f1f260266e367d3e8b0988777f2c3fce9e6fdecfe79f67671b778fe84df787bb778be9f2f9748bb19adfce6e3ddec493c7e7c7a7c58cea7924878ffbc789acba7c5f27fe56c9908fbcf8fb33cd0e3fce9ddc3d387d9fdcd1ce6aaf62c164bdcaefcf4f011f4c6fb878f77b723a200a1e6f276fe6e7ef3bcf86d3e8127e56cb9fcf861cef45e3ecb877762767727efe737f3e572f6f4492ee74fbf2d6e900e4ff3c7d9e209a874f3f0f404a33cdc131bfd3ca512879c76bb4bd879121cf7c041f3df803f3ededf01259ee6fffcb878422e91632e81f167bf3ecd91d0154f88df177777787a99312431c6045fb9ff5431c627f9fbfb07f9e1e176f10e8e8519e7e6e1feb7f9a7a5a8a9325b562c3b7bfb0084793b97770b5ccff3035209ceed76f661f6eb7c597106cc29f83bd813b97c9cdf2ce03f16f7378bdbf9fdf3ec8e4875bf9cfff3231cedec2e0d22674f8b258c00cc49e7283e2ee7c880f789719e1f24fcad5eecab32f72953cabb872570a0b89d3dcf24aef87926dfcee1e9a7f9fdedfc09efd8ece6e6e3d3ec19278337e64bb9fcb87c9e2deee93460bf78c5174fb7225d32e4db77b3c5ddc7a763c683991f1ee7382432607512f4c4f27a22e0f0e5e29d5c7ebc79cfc7264757f9937c3f5bcab7f3f9bd9cddfeb6c0ebc8f33c2c970ba6c9c33b8123301d89fbfe3225c772e775e1c0e549a954adc3da91d0cb7559f0603762e45204925bcd10de9b03142bcdd650e71ad5710915f5b766943d4b612ada23a0ba007351efc93b1ad00d44a7876c661e49ed53c95288b2e91cd523ef4005e2973a825056aa5570dd1035b5ef2663040c71f362ba6aed672277237738c19947156aa5bc654c8852744f79f81310244ce7751cfc7173e133ff9bdfd3395ff81c66f9df7bfabad80c4944a0c2e754e0f00954debddea705842a8fc95f97e2af85eeea4f6750db73fc7418e7e9781f1bacb60d51ec1c6701877054e13ce1fc5c88d449cb49d56c31af93c1c89c9d35518c3f454c56914e9faba7af9a549fdcaebe3d9eb39ca12e7c7866a4e244aa181587a48b319b0af8b23b9090a90bf4a6825ac3d660c5f9ed3e7f503672cd0f42d9aa620ffa6a5088a5697e7710687f714cbdeaad396e8d8d23e110618bd124b4c4530f42748dae9af245d28efcdf16ec498781118a72a51e4eeb21771886ddacc14465e6fa3b9013df4f9d06abfd7f17b0a88d875e79a3d7d2b45ae516599ca699fe837b63252bebd5cdb5fcfb412bff0f29ff8e43b85444fa0f9a176319bb021e1a1df7dff2f7c647876ca21c7d9d9babd7cee7b5ff88b1ac4265cd63fde7d72dfa49f26d4ee20705d443b570afc6b5cfd7a7eecef43c1dca76f387d4b66e575a88254f76087a3d74d422197cd564b581224996db2ff597ab69ac14892f328b6a008f0d30e72fda5fb2d85f4b4dee218cf0075cf59456234f3a7532fbe486119767b4fd18edf9cdf1b9e561d526af50963c46ebe24406ade5dfb731eefef6fdf7fbfd7ebab1c3d4f9cdf70989f4fd3fa642ccba808ec6a8eb8eb3e9738d989aa12fd8e3e7183add44efac69e833366aa7bdec95e92a6c48d5ebb251e5239bb454fa2cf65782a2227fd1f350a8450dda09cc523599639d4b9a29b7cba10fc0134e347dcde07cdcddd7eca8e45eaf528285ae8089a17cd89083e3a96fb49257e9e36d189ea34a3eadda90d740b9cd666b5eb4c8d9b73603d6e9634bf4b18043a8e2efdc4a951beee1b7bdb2b388fa1c0d97743d563a46465d95bae3f4c9ad5f90097249c44fc979cd89ddd3867b9f8ec80e84445ae97ed7b983f6295c5d7d0b237dd751fb6b44f6817fd94d047d740f739fc16c2cf5814b82b3d8585705cc919bfbaf65f5e59777195931e651e0fbd1c745c942823fb0579baf137e2a3c682dbe7521febf000000ffffd2dda38dd8860000", - "49a20c4e431767a29116905e29fec0d9": "1f8b08000000000000ffc4bd5b8f1b39922ffece4f4114b0b00b48abc7dd73d999deff0072596eebbfe5aada52b97b8d83031c2a9392b8ce24b524b364ed62befb415c784949e519eccb9997699732790906237e714d79e17fbfdc7d96bf2cee168ff35bf9f0f9ddedf246de2e6f1677ab85b8f4b894f257ed837156fed4c81fff2cffffd16af9e3ef7ef72721e48ddb1fbdd9eea27c7d738d7f941fbcd672e536f1a0bc961fdc683b158db38d5cda7626ff6517e3fe2f3ffcb0099b99f3db1ffe2ae4e259fba3b35a9a20f7da0f2646ddc9e864ebf647a96c273b13a237eb316af9acfd5a4533c08f460721dd46c69d09b237adb641cbceb5e3a06d6ce47a8cb2dd29bb35762b4d84e1ad8b52f5bd3be86e265eda2efeefc16b35ac7b0d4f3ded34514d5bed552f1fc6756f5a79cb339a2095dc78ad1b5c71af3731af66e3bc088918b0151777dacbafc67601967e70fe6b98a549f8ad00afc9c185282fbcbbf7aa8da6553dbd2ce1d74e07b3b5ba13d1c9a8be6aa90eea288f6ef4b8b0ce0d40cfb04b232159b48c3bcd2b90f2dd51b6ce46af426c44fcbb3b36366adbd1396d47e5958d5a9fce28ce66547d0f4708ec84fb5772efddd6abe1cd9be8e4004b0fa3d7705c5e0fcad880c3151a0265601013831c83f6b0f4df74835b7999f5c6809b15dfd95326b9db48d8459af167588bdaef7ba383547d70b02f658f7c1a403ee975af550062002702e9d7475ca11ae3cee11abfb851b6cae248f01b8c82d4e2fd874646e790137edb692b0f5a86bd565f61394081bc9e067e82fd79bdd1de036f479768de00878bbd37ad9e49793ffa17763be51a39217ddca908072976ea9958a462a1ea26d2053c5b9f7ccdc7edb7c4fe71a707693630a43c98b0bb6ef214d2eb569b677879f42d0cd969e93c126aab235e5a7c511c94857f56afc233151be7e99dc7d3de1bddd2ea60102bad3e085c67a137ac330ff7d5ba431eb7733026f28cb15bbe9f0e5e8dba8dc4e528f6029e86d544c3bdd7cfda46e20c605c37c84edb239c116c82c6a417619d2a7ce59ff0768edec395f2b81f7a6a8672c1eb8d83838707e15044ab7d54c64aafc3ded960d6a637110e83c97cf1946a2a3530bdd90007cac17566032cf997f3f1a2c3bfc1a66b46802b827b44ca7c705eea6f6ad8f7baf9ee0ac2d8eeca8d6fe461a76114b1f52a1aa408de6eb9d1bcd9610c51ee5508d259580b1246b7666fb48d8176a4062d785de18cb13abe7938d0098bc79d3ee2a56bd2d3a2623da256e6ca999473db9545859d3b48e46c6614ed8720032ef1289099e24e9bc42648a7f7fa59f76e0fac810b60a14482f6e1f6127bc983893b190f4e86a8f7e12fe2f5db6ba942d03ea2ae21dd0bc4991c2e70f6eb1fafa5db6cb427fe02c1c4975f6ccd73e2bb5e6f554f5a37a08e67b5dbd427a86cf7034a4766947cea306b9777f50ae76591f72a6d07e52f6ef3e156b6bd56be3f4afd6ddf837017e924bc26f52c0fca832e39222be0aa27d2654613af5ddc91f8c749459e34a8afba4ce7f57f8ec66ba637aedfe8ae28a0b59683f25f75275510244cba864e919665503eaf7b3dc051f43d0288b5962a326d3aa9bd7756bb31f447d40cb41260771007c68d21cf87745bb9018966da0b5218a405ed4baab6d5016fa0b12182ca735efad18af36d9c5c6e78c174c85b4323551f776edceef09141d971a3da387aed054bbae050ca804e0f72033a13e093ea414dd9d60d7b15cdbad7cc8a3b2d95010920d2f9da6d3a894a4f5c90cc24cb643886a807154d2bf62a46ed6d110d6bb812ae6d470f008326f35a11315d37b691a091b19d7936dda87a2090180368c59d69770821414204dd1f41be1094308154fb6881aafba8d6bd9e8ad6832675570e0308c2144e0406964231ef76666d4846301ad3ccaf2e6891963a9372c93bcb4ca4bc092084d6212a1b0d5399b144e710f1e06ae0f74e7aad3a602ba9bf01dca255edbd7b36e9b2e294e94d186a33c2e966e61065ed8d54017555d256246e4e043b812abce1c6c2fa1aa901a027b10dc48c3baf55d440a7d659dc4a8f9827b3e01e7e06b9b78a2aea00f272ecbb82bfd303ac61a2376d4ca204d80f450972c3a6603f07a219e1cc9bfde8f7b071e0cf316a1f08ee23d3b8c012be73a89e0174e0d57c76a62396dcebd6a85e76c0a49e1e4e0b22a8871422549f37dec216046a1113a5de6c80fb9f81d1f6deedbdd151f9e38c9102210138af228e5400ed43d248a4f95a6559a88c81a6ad50409ada3afb06d6922d056672d63b88b89ced4c447900ac0842dcd86d25c78161405692fc681119cb8d83d378d9167a5a3c7e5ac9f9dd7b79737ff77ef9b4bcbf5bc1c3bf9bc9f77a632ccd88ef5f3d553ae68ae0299e6fba453fe57bf4220aa781b2557945807bd0ca86a2efdef4e6ab96bd3ab05c27481ddd896d25d0b26958b40419f4608048631b4199a9f035af5bcb072274bd6cc0f8794e851210b03edb689d1cf9944c1069f5522e54bb4b8f9065d8755e87802a465e1ddd783593f28a5fd0e10a8fe4aa809a2b3980f9a02732ce79e9fc5659f35faad0fbc9c92b52c95752d1da8850c97246fc0980aa537bbc76f08fbdf2319d03bc238c053e57610747440a13447a4117051c344ce1b85396d5090258b0e3acd0df544ba88425bdd761ec513fe0e20cf07adf032578e19512bbe23509c00726d9558806f1bfaed6685fc1833071fd1412632eaf5af7acbdeef06f574c0a6d78c15a8e36cfc9875d0d8fa30bc651fc732632dc6eb555519fd3b94336412b81f4236a05151bfc971ba3a8a977401988028430b2d72d084ee765d0c09aca9bfe287b83dc06b693b11b380d8d2291180ee5538b4f9433ead5a191fa1be836a9bfe9768cecf3803b2f92909419c4c1af00c4cdb322840e67f6c0fb044630b6edc74e872c47c4448ebcc6cd3a9fb6296ba172dd24c650cfcaf4b85402ef628fb79d00aab13200166add68a34713010f0bf4e933991f2ac883eefb7c12adb3cffa94dde19ec29d679490b780b2415b989e8716c0fc6cd6e02900a2620b94ac9499949f1033d8a851b13b4be7aa502f82e2032c2554563cd2ea088ba11307041bbdb2017037ba37084cb3eb89d66fec9678d696799e354d807fd8a85683dcdef7ea18e4d57c4ffa058eea16f1fa9d03c811ae04db44880e88f3c8dce5c35334a33549a3eebd1b8cd5a8ae0143ac7b2d365ac56c14817d91672677459ebbb09bc5f9b39d21a2ee7b32c7984adf07f52c495f33c3326fd49be0170c4364443c9dee92eb2009d880c292a88a63e0b8453027b5422b4593cdc967a30f7c30d9795804f87283ceaf720e7baf030103d91b720fe1265b370c0a358d976e8f62b9e81a25066dc7868c5da2b834510f09d5e24883d668c48260f4266a6f9c45c6783b932b323d6fc0f44c3affaab247afd854aec511c1828df6200537ce0f13398ffe2dba96f565250b238252ba5fff8746090ec397bb05d883661669503511bc2b80aaca77729988565eaf0849f79104b2c1dfdc6663008711d885113ac014ba0328a9e06abaad35ffa53b991e0872edba63239d6f12295b4528314f1408dea1a42722e1b56fc75e656fdb0064e895dd8e6aab1be92c2d4f1830f33a807408c6d4e0ecb6b27071db285959bca421ca19add0bc91b766ed1508b52bd28e2c950b8ce03b9ad507eb5691752b3e05ac240f3bd76be6fcd7ea9abcaff8769788609d1f549f0e5dec55fb556d49c87f52ffe1bcbc71c3ded9ec16cfc61248a5020954a4c745f538def1f5b50cda3f8320b584b548b032442f0b6623514571362f5c7d27cdb0ef499d2979ce387860b43865457e96755238532892140ae992e242043acca49c8bab93555c31dbc0957336ea6fb149ac2a077c14b01a1a6628e1f125f1faabf656f720e26de70e6cc212698293ce5e67139c38af95c02e0a95303d2c5e1b6083e3356864da2009ee2957f811a408322d4c6f7aed9359c0666571dad37356ba726de9b6edbd8ee53d1833f96c90436f9c273f5f07cb2341331127663a26321513a9efc58963ac3228c9368bba491e0b669e0dadb3ec15c5f4352e0c46ab27439fac4baea6b2556278a467ebcd1e0d4781f10ad7b3c95770c34cca8fee00566b03eab0739a183dddb934ecab204eaf2b12f5d4c88cce1108e71ffa63c588189e484ee5c4bb9eadb90a741a0b481a88892efb9325c3ad14e5e5e9b5a4d5ce4e3cad97ce5164d55f01896ca7c98de9115505d78246efe8baf269d28fecb167b2938b5c9f5e2e8a2475b24f64a328ddd1aac100c63f8aded8af20b7c775264d4205d91a489705095a7bc1d86dd788a44ed747d88f190085742ae2e518469b8c583477891536bd3bc8b58e07add91520ea35545134e5639890375d904b7425177fcd4319f62757ae0fe850f33a5d03a9c6e8d0d1851b246bec7ceec97482a6fbfe5aa657f554ee917f464511d450edecc7997ca78269e5433648c88c9cf77d72366f318ad75d0050c894e9e704e2a2266d73e6887e480e7ef407030af45e3f3b325a129623be8ac086a2f25dc0e3838ec92599e6d7dfc0ea31805bd56663fc10c84d3edade0c06c698fab0936c39b7fad8387563dc8f914ec58fd6a2b214b50d89062bff7b7d9c9203b5a0a103a4911ab935cf1a246d40b9842a0f9d63268e91b17819fc747faafd6adda1d7dd56d3ce440a136de446198a6901d2440682fbf1ac7ad2cfa190747d9cda8478c018ff5047b4781a240c5b0264d44e965545503a87b14402d7d99eaddd4cc1c91ef091e2b348316f5ce3c1049d42b8c258601a8c49a6d530683f99dce5d819f35870c032248785dbc89d7aa64ba70732e1a658567f6bfb3190530e8638ba11253a5388428920f336aa4d31ae0df9d56d11cbec38aa3835c51cddb0ef8f480b916e40383522e05266430fdd2e20b7bc217cc61a82282cd82844d1954f0e79839c9863c83e967a9127872678ab149a4297fe8412ced201adf54ef59b86ef37fe897c10c659c13e44584a831719f746aed1cae13dd09549063ef9c828be47f1ecbc0ddd958dbb31a69084019bbba7f3da993da9a0a31b91576f32ddd8d991e3ecadf1ed38801d00087f9229023c02881dde10449cc2a32860e45af7ee309372857051db80207e920ff2b30c4409f9f677e8e40d801d466b75ab4350fe880bfc69067224c53d3e53dc838cf247bab01f803c731bcd9b1b5cf233c04967e52d5fc73b37393c50a57d2fd7a0a7f5a0bbacf601312517b38cbadd59d7bb2d281331688561cc42a3ca29d4ab83dc8cfdc6f43df2cdba375bbe1dfc3c1843bd166fdf2615f4dbf2e1be121cd16b158f52756e1fd1e7267ffc9d7caf5b3dacb5976ffffce73fc29d12c10c064c2a74c4261649acca2e7df4244ec8c0b19eb48750321ee882a15498ca4a8a051f14100236cb314b77d068516c9c5f9b4e9c4d33a1994cf3c9a9cb0411c6e455b00189f02450f537ed5b830cc322f9827a4426ce9172274eaf28a9420e8cb7bd3203ee04936822ab2c5464c97040543375d5d76616da8584c9dd466a0bd2158d48b505811b6b888bd8a4a1eb4e31554f5c667478c5c4e49d656a9e1d9ab84c4d3cbddfcfaa7bfb6bcacfba21875aad81f8744f52b8d2c6583fbf0a134843ca4524379d8968c101f106dd9971b82ca66dd89b76a4a02cc6878b1bab3f92d11876c0d95ac1f9539ed9779d5d3f8baf5aefe1c4544bce74fa3b89980c04a7a009e08f3d0aebec9b044f9e73cca663fb5db5adf3098ab308fa53096a102b75df5900d34fad83b6ad26d971cc3eb79f71195bbc3c7d2faaf489cb3e30a950a9e7686fed0dcf0749d93d300de61a015f59c7ff0dcaa890b53e140012225d041887f213c2b8df3b107abe380a4bf240c909c125fca166b64f09db3132feb50eb49f705dede93f03aa8c364e1d63d9e6368c14272fb1ef2539c56aae4d22428b0c11d2d1fefe12c772984b739866c359254591fd852274ea1ac12b79fd40d9b7ca5368969d8c17993267f918dde13086fd3a9c08a23081ed59d908d695e668e0fa7f341746dbf1fd9c1477c99ca09b516b6aba0ff42cd30a87f95382ca6c15a2ef8877133823a8fc00065122341c208c70f5c2c5b9e28db6d725472861585411361a9f2de1ca135745fee0fdb4298a193aabe139c08a64863bb97721e89032095489919d0c801926312525900868eafb78a2eab3b420dee88894aa2709d324e981abaed5071b669c4589d668c347b655beeb75408ee514a723b9e0d1a588095513c305040be0287c7f6a83d5b44cd66a9538a98e1cb32f1e1a624efbac7a038cc8b91365504e2ec34c8da0f7ca933c4fc95ec9cd2565772d9795badca9f09d504b68485e117aa6e0078ef262e0e567a00dfb9726caeb7426de50f64c735a02e24e9ee9e5594867e310b88bec8340c307b138a5ef901f9e1c86192b4c3114f10f513e518ea3709dde6bdb691b53c07cea8642d31750bba5301102a749ded104e8a07c9f8ed0ba618d5efd14214d6e1d821b8354b2077d92bdf30d188c60ec5aa9e4b3ebc781b49a0cd179b545753309472628508598adb852db2d3074d457e9946a12e1e663a8a2d445e5f3ca4572a1123443254b5959ce4f81933b1bff15a7278bb53e3a24097bbf4a5c9f8d5e326466522e2d9a6c978e0fa3f456e61d159f66ab288db0ba9220876af450629f052ba4819077fe58ebd43b67dfb03afde0fcf0822e9d3a4a2e388cb3062461248a060cf2f748fc3fbca808ab80dea0da9db1fa8dd7aa439977d1237632d929a4217eb2ba28d6833a562af526cf77e24c4760a087b5ebc8838b01bddd312006e6342f1ce475f14f574f5ce0d1eb06f1deb057d624bf124989cbae3ef38dd08a92dde8c97f9646a70149838d21ba81b2079067d1475bd201a3f694905754fbffd33d2b126a1eec774b28b09128f509ed4509d021629e999647ad3cb96eab47487356fea70426f7a4ad3ca55813652a90498e25726ae4ad0caed33deacb2d1b99498bb3ea66a451538a239998904b8790c1f4f7fcb6a4e1ebc3c91cc02b621cf5a2f3b1b9cc0fb41124f83fce0f4d8a902272672d3e38ca0660af91d72a38cb092714004f73822d55c73418cf14ef5786c5c855af7fbcaed25ad93cf81ef703e45629c3822290c81dd6b10952101cf373255da7d6657d749cd1511dd8393f7286e4337bad2e2eb0c670aa8fda5b85f0c284e4542247b16b5b15109991392aadb3ad1b06ed5b43199660a3c228c9af5ca7b05f5e3ee9d07c79b21d493ba127d60920fe715d70d10b177fcdd6185e673a23263f4566d04f8f5cdaab56cbd7a739fb741ed7042d8982c54b5d9dfa770f9c2d2a8a5ca8634ab7297fa4c991037094cde8c93b48dc408a2ae324360c262503ff08df9d58c0159928a51703cfb812b630d29053511ace78b7799195e8e251e61f5d6f0334441715b1fd6bf20c913c407907642fde9ce3358e81c283855da88f8013b92acf77a57fc9200713c990d58589fac53b1ca4d5df620614d52e83c25129d51a009da190e18bd49d49f93831331019f126772e505dc78baf377c3760b5c9b949204ddb52db51acd02a508b6a23ab8c12b70ec0c9146d0e136b32f0add12fde9a11fd827badfd9be8dec0ff53fa574ef94b14c67160e5c692bf8002811a934a88761722e1d3d8200cc11c3af1057a2dd79aa4ed0615061f1347ab538e44b935ecbe615bbb12131d9b126421a07671be763e560b043bc1856968d8700406369cfd2597af185c8e49f0fdd8948bbbce81ec6e1a4d391385551ad26730ea1e48875ee1522a0d8db983611cc8c8c04792a193339d4454768ba50e7bed031ad26099691f8f75c28c1f508e67bd9a1e6ee4460da63f36c201238f41ef5cdfa5e055281a30458e73c81b9573df716943ebfcde910f58a0fb40c9eea0d19b8f4682ec34a05c63f9de51d264460f86d3fe269b6d44e7c675dc8c3de64b851275f03ab8fe99e8bc51cf0ed3161179a86daab6a933a8527543514f98ab55a55881d9d3c8ab09a12679d5221ef788151d65d1395bd28854946daf42a84a3e9a13b7448a1b8fb9b6e16472499bc00ba2b0bca224dc9c3c2a541bc7b44a3a22fd6daf5b028fc8ce7b8a044427b1cc84b3f261613360bb04232f92fd64e5e9b0aa31d06150958388820b40a97723a069229575f64d9e80963b5a1c1ab100fc457acde98a18814034013c864e4d729b694e604c144a7bc14cf825e5ed9081bc444985ff9dd283ea2b5665080e3aee5c171ae08d5677a387b551211467accbaffa48e425c167cad849e07655a9133a11285f485f28db3af76ea47cbcc90241020975f63ed5848697119d9e2c6f18431461dc6c0ceafb899ae1606334760461305a94a30c7c8b4319ae380a2d91a4a4b1886155d0a95484c400b98a685f949a83a1cdb546337f1a0f02ce596b6de5a0384974b99904d1ec99a8ac5db149e8b3c507d35158afcecad970352d998135754b6e5085f6a9724b05918398a40e559aaaba899c31b2a9bda3a5e80731c0e4344dc899d5958ecbd08ef3abf63a8e261e332e15644163aacaeb8beecde90a032a47d546edcd7f71c2b116175518ed7beadf4e444557e25ad776af205b5fbe74c76652be1b3980547bb4b3a7077d3ac26ca465c506676d1d05802b1c28bd8e580c464121007bc7fa6e9df024175d13f29e501c13f772ba59ed4c15c8773c20e98ec7fb4fd7396da95e7f6547bdb4f5f30c3d254e8648b7ac1e2e99f4801d311d3d458f90a1c77da7a2a6dc088efde09d2dd726d3c1575be153ca7cd5302b8933f2646e367f6f505014d9005222d9040cf73b8d6e91c34edbb32014082add6f7222450a677620cb342543a1b642715f42c7247dd244cecb67e37a2cc4c3cd8d3da5ec610da76b5d9f6ac6eaac3ad57a17423d10a7687ce72e905478f19c131a46875c1df7bc7879a832095fce3e11c2b2fd51a4361fbaa386031c1f912739c32f270c8bd3c439b65d71f664395a976b05f72a84032cd879d066c813a3ddabf62b06debd561d273fb0a585d4fad34cce4b5ce6492787ea55f5d712e0085788e6abd41be071ce973e736fa6b233e059cec7a18a0a2a02c47c43aba9e8c7eba4f64ac86d262e2f82abea3802c5b1a694364131b114ee401829d69a7246a8c8ad941b1fe5818a69ea64f5da9135c9c5c8b5e01470225fdf59cd53af0e6484ab8b6b17e4f94e59ea750e6d8edb72b9a78fe90622942ff12491043a9837d5d814aeba4085d4a9640b9084ca17c4597a881b131c4cdbbebc83171362c85975293506b6a1b86f0095a208af07c7e93297a749f16c15b94409c41c3a7cec31914d6058e2f50b5cc2c44b5eb392b7cbf12277e065a81e8d38ee5941f6c7216df024d37b765d820de862112f2c1fe4040bc58663c7ec17418b691a939ae6dd61f830b57a407fefc5bc8f321be76d453846ac4449a96fa9214faac73e8d3b5053999404777423ece6c202f32962950003e7a28cca9ac0a2d4d85d806e4b1afbfabb82629aa6843f95e0c77b4e48426b32a55f384f312f2c93310944649f544a674e8e9ad3248720dffe0185e9db3f9eaee167c0982908f198cb4dd16cf1cf597d95129ecafd4c21b79cf642a1512257eec880b32773a0e41ffae45b3c8bb6e2201c714d3159223d85e700792832b64d2cab6fafe1fae79cb7c1846c7b4d74b0f3666b6c366e0bcff2f24bc5ed0b3d2a527384bc97d2b4827d7515850e58b6172aef6176c3d042546ebf54b6d25dcbdb74d85cc3478e0d549570f0c987018bb16aa0ffa0f03ef6baa84f22dbe869c165227d2ddfebb62762464709e52759755e751ab647798c6c7e601861605e832768154d799c8c4b4682489f50e6ddd49c666ca7073b49ab2b3ba91a98a42363cf6c22fe719ae301d2394cb62b5fa72adb9363e4cc9b6bba85d46b0bbd0fd8176060b58dcba950fb0918dd245adb63fd1c6b4e4a19ba386e2e363603d6b470760d29b98b04c8d50124e54e92d84eb34d5067b70e3b8f805cbb62d7bcc8a9a0086f60ef7c1307ad92a95c326f8b833d29d769026087b94b6cf424ed6e28d59eac1ec502e2525a52a5a05fcc7953642c26c0a9e4858d1481cd7a960e4063d5196093b36e74797d220f28ab011159502200587f2547994a5b2639d135f4abf4ff25c5529872baf32a285fd7d356bdf3a691794c73bbb06ab0db30873d8cfe19fb7881a47a69fdb58f02974b30f76cd1dfb10d70bf82da42013ac849783981ad2e666a30654445528bec543863dc690f09ba10fc3a9a8ecc4ec6762832ec569c053b26403963fcf9594256757fdce98d6a12a0e294750e0c9792db2ae12961ae3e47847d7a4d85ca08f859900f0058b48e6bf076d98f705094dbfecf3334508c257f449df781f568b962a4f4823a39392ee8c63580320cfd51644e3a4f03c4a65a005da31ef6b1aa1b21233fcf2672e729b891cfceb09d89f972d32aabc81bd0932e5aa934a0baf175f6028a124c07cf0d184f4ba1347958041cc1d6abfd6e22b6de92ebe363951486e05dabc02d0fd1fcbe08112323612f72cf488abb56aeea530028d14784fe053280af4506a1145066cf303ad46c34fd451c39a9aab29dd850c39f42c469614fa90506ae55d446a029b9553cb8e0c137ca607b26bc401b8e59d2b3851cd83368d0358641bfb2d87b4305c37ffc9dec10d56c229f04d6636416fde4bc7648f54911d23f44445111b1dad3d996d21bb813a343b517f1f7f7d2d0891bc2091be34394d10cbaf4f3cbca8d658ddbbccc31a99e96f0e975b1e3c4e9724bd1413b7280b18c9ae9fb534d5fc1191fad36fb6c38d3a2c8b957e403fc7a76c7a68e9cecd62bb71228962f99dba43a04445368976552a4f48d3c016e1476737e9b6749afe487712cf4c8e5b93b4ebd88f551571cd054656ff23f47d5a35dea728710ab0fd306ad292b41642d3bc95e06340334fbf30cbd7f7b2c5d024b83c128870f3f5245db49b944ca9dac8323d4bbecacd6ccf98ed255d2429d1758e537c9482ad58f73db9abe5794ca9dbba59ca71ca2371f21334721540a71e9ff1c53a5c1df09808b6a59bc9ede7cd528e4337724b781ca54aa0ab8015e60b474d27aa84e4006494d37729a7e7c498350cef94919a6e64a6cb21ca9e14e75f753474baad6bb7008d34e72eb63d563874a0f89c86705a60d270420ae608555687076efa9dd10a7fb02529e27cdc78f30987eef0e3644afd5201f73e20bbe84cda9b2e479a1d66a1a559968d724a7420570cfedcb6c4c345c88db64b4401e673e156af482738691421188bf26849dde05ee4eda232c2a654f549769906aebe3b4c2a9c290758fb1b99557da46349e4afce78a107f1d11ca31279a874a35a9e155dd928b20d8a4ad1fe87d1582a6ac5b67757a0633d408789c8f3168bf25cea9fb7da17c7be9ba0aee411cc63e894965e5f9ee38cd9d8244919a5c8a7aaf2084ab23aec507659af4a17ae0b05311ae6891e7a9de80622d146c3fbec28e8c1d5651921b06839c3a44b9531d190863df09f4c48d55e73b6e9e99115723f7fd08ebe22ac5d3ba8a170375f51632bbbeb0268033e2f4774cea8f278d89b9e42fab7abdd9381fc3196c667b1b24cf05132aa4c81b9719e6d8e749493ea87cac7b7f09484f5a43b05128eaf9cb8dd5ba91de1d55cf913257a5d051f55659cbe93a5eeaad74ac776c4d44ff5a6f22d79e8a49b2300696de5019249d3f66a4e2bf31e8d3ab43184dbc863ba4b7c988171550e7878bc0ee4a14a421add4c84059334dc96cc476ecaae7fec7036637b1d7ab6e0a07f394c427ae2a79fb76261f525bcbd472ce92d7d1f9ab9478730219e14e658f2ed6045c30e34f9474d5986ed22de6a174e0c43236523c82efdb184a6fc252089152147899afc264d5b9fd5eae21993c599ae1d464e72815c8b7c99f853b703613cbc9be7661e7819b92b4d4537f53d532c8715e802225a89ffeda244d31f61d8505ab1347c03d286b01eee69270719e32bd39650e7417528d3487c54e89d288f598ab7552649ab6fae29230f0840dc04e8052bafb974a7a2fcc4d375ad48e57dc5069e6d2f041bafeaa347c2b8915c9bdca7d4641ef64398d778c88462ebb808fe484d789ab00430d27da7341e59d65d5150853e8d7c8ed071ae0e3be3b98ae489d37d43367627257a27fca842ff020800b412d2d302f0bce922f3a65bbe32da72b5edabe50578aef40129a9d37fe126390232b557ff6bd3b9010c166b1495da1f7e96aba491212f698dc23426dbd66ef1485df4d24ff1bd797c94e5bc7e64b43a69463dca3d1bac5c0e9ebdc76cea691cfb03077294eefd07ccfda2a2ae4c48f358cecf7a727eade93d7d4d6f60acff92a37729f9e20263710bac80d32b9e73ae5aabfb0dbb37d25d6a88bd971dc4b594e27f0f5abc5d3c0aac09e30b83d5b2a55a9bd989c5a0386d424629a468c2100917ba5639b60b72975d1dddf2d49cab9ed4aa49c866a92939287aca431cb009ec47412535c0c22e680ea18629dfa9a0ac45ed86b74e87374224f5e1255bda726de4e767aef019f818d8209294ca2b5b67a63b26ff58421720bf7ca0b933b97bdfe29cfd0d41249fc0312e93c8d20f7c74eada7455f9b4dd9222aa5003329affef5945952e3c2ec99e1484a6ecec3dd5d41312417c0096b49ee8252a52c8b33f736373d25fc957c2eb4302a1cbc545b29a66f92f6c9066b9dea613a10991bea239b1a4d735054f000a5e68efd2e8064891d7aa39f7549c2e05bd7c8fde8c3a828218b6073ebacd59336a9a05cfb69529df3820f9a645bd50da03690d176db7bd78ec9d67ad647b6849b33d319cbd7317e78490e212ca8b3837560e3f552039d0cd0726ba194ed9bd7961486c8010dd86beaf6575b4a67d6b4bdc025f8e10d5abe09272e6c626576f9f47d5dbd329d82801f3ac231529d5b1b30609d9f12c60479d599d07a832ac5f92356c65e6a9147713a6af6d7ba7d953d4499e14deef8124ecd17c2d6a134f52afd1608191443e7243d29a3979282344d477dd90a994d8dae53e540a4624f0e82d7620683622aec998380554225c70205c79ad680203989b4943ba29f2c7d80831658524e500deed571c03c2757020a3cc3a42b05b7a649fe556e1278a4c47c162b273dfaeaf94ec7266cd6a496e6595417c72b4992e4a73bbb1dc9f1da605952cd3ea7021fbb939e4b856925de44a4e5245a4ede794df973065bfb76d9bd44adfee1cfd7a43cd6d772ef0d9538528aa7ed2e4d9daf68fe7e04418f54a61d924cc4e8ec850bcc8114589b461f41473d1d98418b58136ef221814c9383cad67353bcee3ffeb3fca47cbbc36fa6a5fca25d6e2d5bb9fd72a5063693f3638ef1b1395da5eaa0816c06fa7e41eec696b043a737d94d33e92bce8929475120f25a4f3327b3dbbd8e74a68d7263abb73fcee49d93abfc1923b791f7d8cded157e99ab7343c26f27fdfec845d1719f32f93ad987d8ce6ec4ce3014cea8f06359ec75ca62b3d1abceb4392d3f4d7129e4764cfdedf4b716d42dcc9b7d432fbf3b2bf0933edb9004cd54c507c7ed0d52695930c3d84795be1343997a679db9262e81d42225558af9485d57aad758bd9cf9e56bf70f2fd044a9b0f9c9a9ab28c944202d3af04a4c3c55d7d1b7ab00ebf6bd6e41e1b21d871028976066c453ddd9e840c00c95ca1727a9985ca5c29fab235f60261b7ee68747ca1fba9850299be01868d878b8c4949d9972d4a6c5637537a3b73fcde4e7507dd8e697bbcf720e16a4fbdee729fe47898019509eb648b15f5922ad8dd567f189a48d265f9ee0fcd48b9fd5f8eef2259793114613a52f47e9f55a375f38f98003d7c65c4e41c6507c9da43fe94081893ab984ee4cc88a94579b72adcfe1fe3fb0bb46e4c0db4f980fd46a4f697b5533ff6c7565138b9208aad5325d387f9caaab885f7e3f938ffad980a8fa75f2eda513f7c8d377be454899addc80ccf368fc812dab0f9384b1f8fdaf30d23d3303dd5b33686c70d8eea6e3c0fe049878dcaecf5819f6c69b5ccdcb598bd9eb85c60dac929208e1854e47657afc860e7dce04a7c81f35224c0ce4aee24c893d4de0cea8081e809b461350d3a527ec38acb5cf995f222797730e6842833985985e9856749dd04a9cd0ea8addbabd8ae5ea5ce5ef3a620ffc724b711994498dbebbcac7f3c22777d8e04e0955698522afd0a7be6c9315244e288ed209df88c237e7897119b3139d00ed4e299aa0decb2c54d2c7da9d4b518a3408fa9ff2fac4a5f5557c9d547bbdc2b303dc7bf7ed485f58d4ad01330365027db24a9c7ecfec3bac0f4370e27e93db797c3bbe0aec4c99a67d4d83aa854c75ca47e5a34fea8e4882a3a73792cd5fab915b3cd004b7f22680aa5bf699d4d992d8bb88b373459df75fe50f593779a3020a277049d9237f712e159e4c820f880c488a677302b795be1a8a8c2d9598302509bb3fcc726a38b1d26f9c1c4e22eee3e27121972b79772f7f9b3f3eceef9ebec80ff78ff0837c78bcffe571fea9914ff7f8efc5bf3f2dee9ee4c3e2f1d3f2e969f15ebefb22e60f0fb7cb9bf9bbdb85bc9dff369372f1ef378b8727f9dbc7c59dbc87e17f5bae1672f53487179677f2b7c7e5d3f2ee171cf0e6fee1cbe3f2978f4fe2e3fdedfbc5237ea1ea87fb477a513ecc1f9f968b15ace3d7e5fb45bd2679355fc9e5ea4afeb67cfa78fff9292f5edc7f90f3bb2ff25f9777ef1bb958e2408b7f7f785cac568bf7f2fe512e3f3ddc2e17ef1bb9bcbbb9fdfc7e79f74b23df7d7e9277f74ff276f96909eb7cba6f04ccc6cfa6d16131f71fe4a7c5e3cdc7f9ddd3fcddf276f9f4053fabf561f974b758ad9076735af9cde7dbf9a378f8fcf870bf5acc2491f0ee69f9b8908fcbd5bfcaf92a11f6df3ecff3400f8bc70ff78f9fe677370b98abdab358ae70bbf2cbfd6750111fef3fdfbe9f100508b590ef171f16374fcb5f170d3c29e7abd5e74f0ba6f7ea49de7f10f3db5b79b7b859ac56f3c72f72b578fc75798374785c3ccc978f40a59bfbc74718e5fe8ed8e88f334a2ecf018fdb94b54c12e30e3868f12bf0c7e7bb5ba0c4e3e2df3e2f1f914be4944b60fcf92f8f0b2474c513e2b7e5ed2d9e5e660c498cd1e02b775f2ac6f8227ffb782f3fddbf5f7e806361c6b9b9bffb75f165256aaacc5715cbcedfdd0361de2de4ed12d7f3748f5482737b3fff34ff65b1aa3803e614fc91ed46ae1e16374bf88fe5ddcdf2fde2ee697e4ba4ba5b2dfeed331cedfc360d22e78fcb158c00cc49e7283eaf16c8807789719eee25fcad5eeceb32f73953cadbfb1570a0783f7f9a4b5cf1d35cbe5bc0d38f8bbbf78b47bc63f39b9bcf8ff3279c0cde58ace4eaf3ea69bebca3d380fde2155f3ebe17e99221df7e982f6f3f3f9e321ecc7cffb0c0219101ab93a02756d78d80c397cb0f72f5f9e6231f9b9c5ce52ff2e37c25df2d167772fefed7255e479ee77eb55a324dee3f081c81e948dcf7a7197d5b64ef75e1c0d559914aadbcba89d0cb1531f0603f61e4927e9f9b7c50a66df9a21f019fdeb5aae7e215ea2cccf9cd2c85a95c8a52840540427d2007e8e863ead4400095475287542c12a26c7b4795a07b5081f88d842094956a1d5c3f464d8d93097e004637cfa6afd67ec1675261b092483aa90d2a850553429472678a809ea59f49fc68711cfd695bd70bff5bdcd139bff005c2f2bf8ff45da7399288d2b99e526af917507977fa901610aa08127fd7076d8143f92a714a67e04f4e738484f7b1c53ac710c5de71fc650c27b5a50d474642a41e464eaa76871ef59c06ca713113c5f4d3d9048774fa1e3e7d4f62fa21def465d51c5f0a75caf913e7883552c5a8d81958e06b2a9dcac83fe5042ed10f1dd406b6062bce6f0fe9e110b9da029388aa347bfa5e4b987c115320fe626f66d5d570da941847c221f8f3a088bd53f737347faedaf22dc89e2ce40e80a443a38efc0ba97bce66ccbd5df153b6804d99b9fe1bc889efa71e6fd5fe5f052c27e2a1d7dee88d341d7d76f6c0c52300b6677fe3ae440965bdbeb996ff7dd4caff4dcaffc6215c2adffb1bcdfbc4df6b4d691b93e3fe4bfedef8e4904d9c7e7099eb862e4714bf8b925598d8175cf0f3bdefe4b31973e65a287914547ef47a5a6e7a7d6ed9cc2e13a0ec337fbb6ae7f6a56b135ae384ec37634f5d69c11e4d700d3448826c3fe7ba5afdcc5196e4fc2cc28acaae4e9197f32f022f5980d74a932508237ccf0e4f210c329353d7a82f6e9cf075ce6c9e66d6bd3c30f795ab7a91155a9239685d6c64d05afecb2ec6fd5f7ef8e17038ccb6769c39bffd21a57bfcf0d79910f33ea04d31696de26cfa261efabfe9d3e3d8f3bed76df4ce9a96be15a2f6dacb4199be5694fbda0ee52cebbe76b63449caa58fad28a0878f82ef287ec6153785d5c026928ca1fc94e9b71107d7692e59fd5f7beffe43b7f17f9fdec47ff9a7ff0fd831ccbe68e5e53ffd5596bfccc944faa7bf9ef324b56946facedfadee6f3f3f2d6ebfd456cdcf78be7cb4321ef75afe1ffcfafbe1d5ac0c777ab78b1a41b9ae7b98879c9493ab8e23d0cdce05d2d9abf0733d5dfbaa5ec84c8827b83bc7bd8b3b8da1c3f245c2b43e5c437e9b79317db9beae7a9e36877dc1f729e5fd0641490e7217f999a616031ec75a171bf767d6f4bf7c5e964ec8fc49075cd0887e0779a5d67095d7eedb55cea1e42563dee956b3c8d1c3be7747edb1589a86495f44485ff7d3fe1af3bbc0d6ed1b419f5ec30858305b4bddc012eb14bc775542fab9c5fb4656dffff890e3ebd34b445f79ae3e3149680dfec016762c9ff9c70b2bfeee85252fe277a44e76ff50d65bdd388cbeed9fcf87ba8855dfa84e3f84aa6ea292d14a8671eddd180d2a4d6ece868577d402186b3ce1be22314854639611ada437f62bd5749719396c14d925c9dfcfe1c1936f8beed121e5251c38d5a0738d4c392c40905b1d82f62f79fa8c0d51abee42e4e6dd18a9faa6917b6c4d8fe934178f62bf33bd0b6ebf3bfe70d81ddf5817dff4db7d3fdbc5a1ffeb4cfcdf000000ffff0681696757890000", - "4d28e1deaaf258f4346bd9491c376098": "1f8b08000000000000ff24c8b10ac2301000d0b9f71547a1a04bf203eae6262e7e411a2f6968930b978b0ee2bf8b747af0aaf3ab8b84a7e98c5cb599c7c2a2779709a70b40ca9545718c49973e1bcfd9469e7b086e634b2f2ada4680d08bc75b6a4ae540b8b7b9fe392289b0e007066bf1c9f866596110d22e054bdae00bbf000000ffffa4aa3fec83000000", - "67f2f65efc608bfd2ec3bb8485e627b4": "1f8b08000000000000ff72ce2fa82cca4ccf2851b051b555c82f2829d68b4c4d2c5250b5430838969664e48384b800010000ffff4388419c2e000000", - "793124cfbcf9ae17892b017c666be8f1": "1f8b08000000000000ff3cccb14e042110c6f19a798a0985010bb637b1b43d2d2eb617c4d95da20b38ccc618c2bb9bdd906be73fdfaff8f0e517c2d6d025bf917b1b87de01e256320b1a505aa84a4c8b06507a89b2ee1f2ee46daac22461e5e9ecf3dfc4f4b347260d1660de53c02b55b9bd168939d5dbbbff8e9f5ec8083e0ed15d2d36508c4fcf38c6ee42bf462c80ca45ea111e06d03a28e2f3f748eeee5950ec2ef98539b321660b1dfe030000ffff4d5ec109db000000", - "87f5b37ce1e0e735c36a5ff25df5e896": "1f8b08000000000000ff9c7d5b731b39b2e63b7e45ae5e5a8a28b3db7dcef46e8f9f6899b2b947163524d51ebf2d5805921817010e8012cd9d98ffbe9199000a45526a9f7544c78c25142e89bc7c79411acefe7c7c7882fbc9623199c3c7c9c3643ebe87c7a7f7f7d35bb89fde4e1e161371fe0dfdf94339afad815f476f2bb8532bd7497784b7bffffebb10706bf747a737db00d7b737f8c3b715fd0aee9c52b0b0eb70904ec19ded4c2383b6a682a9a94702fef216ee9c34df5a6d60119c52a1823bbd0e5bb86bad7515bcb73ee0f0cf63805f7e7dfbf697376fffe397b7004f8bb180c9b372476b14680f7be5763a04d540b050dbfd11a469a0d13e38bdea828267e55632e81dfe522b2fc0ae216cb58756d7ca78058dadbb9d32a1825517a0de4ab3d166033ae0f4c606906d6b0faa190971bdc40fb587b055b0d6ce0770aa55d2ab06d72142d1f40aee95f7cac1c7c7fb11c01427f1b8bfce042f40f20cbeab6be5bd75e923ba25bd7248e2c76ed5ea1aee7997559effd70ab6cad44ad017e9a7a6dbad94c35b1add8897ee92fe3c3a2577ab56e1a8e556253278585b073beb03f8746ff85fa3bcde18266f90df14c8833cc2d1764eac9d528ddde16ffc96c69b86e9a7408711c0fb23d4d604277da8f2f93e2aa39c6ce3f9c47d5a1e27d02628d3f0629b4e3a698252b418bcb2186d24effacd9b6061873bf59d534ce77420ed691e3aaa6c5bd0c143e795f323a646cf15d5e012075beeaf44eef7ad569ef664774af8bdaab56cdb63a49a44b6cc8bef65fd4d6e947ff3261cf7baa6712d5db6c61f320b88972487ce6bc35639905dd85ae7e1b0b5d0a85a370a77d0f948f5afb613b534f10710ac65ce3e2045361be5035234b26fd86af30d6ae9d4bac30dc995c5a15b852b89819c584734b1aed10619f432559274ac5408ca091f9c0c6a73cc3bc4831c612f5dd075d74a07b54452ae4886aca16fd5f77d2b0d1ddbc34ab5f640f7f365ab0c9d62afe4371499c1bd57f82ba499536be51c8a70b0996dec1a97af04caf3dee95a8d0066dd4b57ebcf58bf6428190412702b9f99bd0ad62cf40eab9bb36dc275645c878c4b34d51ebc72cfba56a0d7743707edb737ef6829fabb53b5d2cf3849e76a9cbaa1ebc05bdea8205055c50fa509a043f1298e8932391005dc055ec85eab9ab649b31830eac01bde3bbb7172e7dfd1d03c1f8be9daba9d6a86ab345684adf28a786a1345cae23c41d581a5988c85a7ab32aaa0ac5348b79a6f9c665d5bb7d28dc804458647022b43da0778299e8f58d382f4dff857166fcaa126713c4ef0b811693c7fba9c93c6b7329014d5ca05a90d8ed85be3f54ab73a68d68e74eb91d0172f3a903a65f56d5d1abab38d5e1f5136912277d681fa2e77fb56553f3a59950412364e06ed8575acc260ad54c58b743ec046478e74aad67bad4cf0a4e6e8474c29a2ed41c1463e2b3c0feb0bfe7cc8e3f8d5b162f591f8afe7b9c84cc88e02d9118d1c1fa64585c28a8af8f4a0c3767898bcdfbdb3cfbac109901c41815dfd035965ad5bd6aac3b354e06dbf35da8953b45cd8aa9d385d08e43a2887a7425dc0329067cd634c832bd8dd5eb7da6c0469d0b169fa4dfaad3dd00291e582723bcf3b5147f866f8b73af1366b2a7589ed991412c2c1bef141ed61a7c2d6367f85ebb7377827754653680832b9708bd7bfd208bb5e2b17d9bfb45587adaeb774fd9eef406d642b081a798207111b5525ab49d3fc4c269fd8b320caa9e42a596fa11044125fd234497c7540207284ba55d2b1864406508ca0e0201d9af223aca30d210593560318b7de92309437a3bda0ad69d5c0ea480616219f6a3d2bafbdf46c32aa5396f75bdbb50d5d8d607ecf3c433a3bc23a36667aa38d6c138e1ab058fead608bfb9307a7f65d607b7cd06d4bf3ac14c8f55ad58137ba7776d5aa5d14b51ddde74a096d82b34d57f320920fe6953b5ca13d56255008748ebdc5a32284f281a8bd754a86c4c1eabbf6018120ea6eb4a9a5d61e110fa21939375e34e56e8f9fd4d2181b84a2edeb67d51eb36aa435081ba1329283d9e9042bd4932859526475fa9ce124ac9ddd818c6781ad6d1be558ff3ab5b6d15c6be33581101904c3021a9d1107ada19aa8ec4e1076621492d2156a119a0d27c8aa0041cd0906004269c456da0ce488aee3332260c4a93daed0a66ebb068f8a4cd863b60a39a9b6cfcaf1a5a2d4f6e8e80cea267031ba843409f913da143f803693952a6066b12b691aa13dfcb3d34141a351672051e8467e00c131ef745e0de11fde415a372f8624b48eecac8dae181900425f5beb931ae3a1c182b1e6cd005ef4c84e66f6a255cd37d5248d7966073d0a214368eba0f3a8ba253b064d3f1a0f5bdbdd4a33964c8c130e96964025d91e194e3223f3605cd7ba6f15486894d3cf92183b7e9c3546afbe96054d5fb83d0889ef23953c3a7fdb4c2b6bda6354804299a0dd70e36bfc00ffab9d0eca69996065637771034357459c2c9f16dde10e5af9bd9f08af35ef6268b5c5a94df8a2a0663c51f0050ebae2d5af5ef20956aa96ec8e88c62a4f9b258e891626e99a9f7c0fa6b7d25ce45671c6adc9bb8e70c2c7730c6177a39e556bf7a8cf7075814acd806c9ea50972a300c598f4a20a488a733e4dd8b1d13e7fe585740971496fc93be9224dfecc4f22775b9a632f2123804ff6a09e951b789f89d0f978fdf2287e512693f309b57675b7438b512b7f0e39ad01879bb6752d519bfa8a791376f248a60cd24411a00b656adb39191d88036e21a06df27ad5f271c9400c75c3b1b7a41ab5736d77482d68d49bb5ac11a107691ae99a11410d596fb522f0aa7d754efcace363282679932583028c99bdd74efdb34385879e25bba364f470c684aa80d89030acdc29f8875d81f474b6f6883337fd1ecaeb99b2c110ecb36688d3ea105a721f36488115faf53b1d58090ed14ef24945664c147d2256c13bafc61de84ea72649abf4a8f38758af23e05038d91954997c309189ab8c5c21e096b04180a15c8a26d935ec95ddb7aa9fb345bf1556b63922ec1888d8e884d3ceb7940cdd6d0e726923ce2f3bed07a583af74b80b62c3ad6d693281322d89d6fee883da557493aa6df17f51e73d4ba7a5e923503fdf6bd37d87fc9de0ef88ace3366c6db7d9fef92de0bd931a8b3aac37118250d34f4993552800c46eca0c9c2bd2782c3bc9f0b1bc78515a3fda4924d736060e939264cf1ca9a19cc2d1b24522b9ce30f04df39281040919509f062b4be0bfc5ab50b5cebe0e052cac6934fbcb0404ecfea8cda6f02762882a62f63ada2d8bf23a027894e81c109e0d88d02253e0da09a0d414333a284402e20a0df030281459f88ab6238147d0293b1f65390d615d2d2848e1280429b5f16cd8c8a223a44c68a8c416a8c5f987b84d476a47ac922d2e6fa410a88c7f5c67469762af3f147b5f4ee69f17307ef800b7b3870fd3e574f6b080bbd91c6e678f5fa70f1f2bf8305d2ce7d3f74ff82b1af879f6617a37bd1de30f70dd5f460c2c13878e374ea91d6ac2023aa24c65dd53042b489b249d101dca4c39898e8eae15ec5b5967b05b38ac8cefc13a518628f5ff550d69a12378798c41f568677a47b4812e456a22c3d93543cfd705f09a43eab26d550357a138f9d5cd484c24c12bfa3b09ab6c1aa7c865941eae8eb6bb628987abcc593b25e9b0b56d5b5527c898a9b5ee4c0c1945d7b991418abd537b829dde525cdf02318c795606dd510af21658166f224a475278e29ac94dce097a182495282c831569b91b3220d6ed407d577517485366b9bd8a827c5571d8b4e260687ff188392fdd3e0a93e05da08e59a1145ebca1a414c8dc9e4ba9b81fd2526962875287a12b678e25b2a6596805d173542b0f7f4dfa90227af288809cc646be4cf6b59c59ecad4b17a74395369093407856bc87524de5fbcc91c086e2d6b88fb57507e91a44e78688c8fcdd4ab3e9e4066ddef527e59436146caaf214b805ed05bb8ef1f26d171818c45f9bccf27055eee78a5338578b3eda7b155d603a3e9336b09e5e2be7d843de256d4e83d6d68918fa1a9e35584e13dcd18459fbe5185c1963a695440a2196bf4919949d6d3ab4d53a646d51c1beed3c5db2f4ded69a08aa4d506e2d6bd4c06b6d74f46b5a95c6d30ab5d37bcec9c47c9e09ceb6c0f1393a804049d0c607d9b603afae7454c6688f396e6b23034af3b2d11a508822dcc60631f0ec7be5f28e234904ddbae075a30865f8daee55f4c5641d5087b9ce7080e4c40e973c1b63512982a21a8ef7d92eec3b76d90509edc0394e3b4b5e237986d670d488c2453a50840f7a0115d18ca685afb569d45e9906ed432461c4f283fda15f1eac6d89a10e8e51ad0e3723f2da1371594a5d87b78b937ad40729ec9627431444f7977f33003ed98e97e3e93edf8e384a8d28e2cf53bc2767f8c98b8bcc2dfd20b782da2266a776aad1ddae4a1e57d3e77c90b87b5d77b6f32d6f43eef7ceee1d32797b843d9a28bfc5d353d434ee5614a30aab198d6a3c4ddd4abd63449802a6efe09b527b543db20e590ef9b3e8d79006602c55987e02868cafe4cac728219e4df4539f1051f26653763ccfd45ab3c9b8479448315f0925b3381b9143bcfbedd1eb5ab651185831a6c41caf55112f1ce32c32c6caed3e4a359e2b478e13ca66bda9bec79416a921b156ec14fddab3498c6ad38c7c2e77993b923d8a764344bb11b61d21dd1d6ff71c8ede97e1f9c494a2a02789ed50f546437b01efc0221eeead902bfbac4e788f336f0877764a5141423c85570532ff2b834f79434a28637db619e840ebe055bb8e5efe090a88c87575d3e7833866c3a50ee48fa51951334be7e85676daa006893c497350708ef45cca0ed26535c554c9716950209833e3a8b88ffae23ed8eb2bcd1cc3ad88f31a6422637902664ab4d91cb1720c4591032ed0bfe4f9b885e606a614f996b56e753826839dc99038a8c05819b13118c16908a2e11208dfe27e7d47809c6c8b34974061af117912a45cdc4755da34e96902b7a112969414396c95197c4393680fda3cdb6f6864028e380e327f1236d636b09628eb6abdb68e720d85d75af1343149ff4c9ec570f7e4e7a241a31346c059d0a4a74835d81ff8a091a9c9278f316cd82b8712e8c95ca867e5e802d1b2d23682877de72849e2d48efc14c42bda6cd65d1beff07a109128ae87ec5a1193410b4152fbcf8e6a08ac0d1ea1304b545e28993a8ed1b6470a34bc214443f9845393ca9ff7041a664016ddca47b9ffb501a7fed96997f43aeaea938fdf64b629b98cf98b1053422af9d7e4bf9258aba85765fbd794687bedde740c973039680a24c970e678699748870836a5dae9543b4e46d3e4d1300d15143232cb37a59285462aeab5a6d3452a454995217ec240eddca54fba99ec4b2d0d1e9f03b472d5524d12c23677726338d8a32f873a091740711161ab765eb5cfca47a1293505f329722229920a1acb1563fd39ad57226fff90a4aeb013945a96fe64e911c07b2ec4a10fc4f0038e5ae669a54f929168181d78ed5fc380558cbf146038a9569a23065d93c53bf1cdfbdcb34d09060af6718028ba49d1fff6a0be079531494a71d0325534061d6950424df8034509653a96531b74c194a7fb3f6c2d1c100d08aaa8586e3b5f15c57ab8532a230b59ad27194331478c55548d106af684ed72963e58261982dda04c2feb2bc213efc0493c5c552e453eaa50df95e3b8592ab8289d984bc42ef34be8fd72dce139f1df25c43112626a40366cf42bd829a7406e3648a5346d7253e91c94a3be3091380b2f5e27eff815c073837f97f06cdb6ec7a967f0c1527ac0bae1f91846f7ba65e592f753ec8efd7e76feec5e5db4c5ffd1e33abb279a46011b5af032e7f262a121f98e4a36674097ccf7463f2b5300e19eea94a6a01227ed8b1216d906e5e0c7917905de8abe86a518f3eaee2f95818af224c3554600d7845d8c3a70f483c3f08818f204c944fdc0b2141492fbbd926e001e50b7723afdc8874a93a7ad15f56ca31b800fac1e196e98634a61c4925113ebc72215e9ea67e8bad0d1d2280f3bd9702161715d490568e7146d02cd06baacb42d1ee17f98cc838069db0a8f863a2695d88920e76918c28a1b8b5628aeda179646bf46537463ddb5bd3148651ac4764991737cb551ac704b879c18f52463c0566780e5fff3759ff954ee25e4c89913c3b437820186ccc94bf9f58602df5cad95aa11fb8024394ee2652fc7c35bdaceaf40cece255fa78e252a4217d51cd98dafade3023daacad8c97aab8d7ae3946c182ef45e7eac8d12c996bd1e767e6983a8f244546775e783dd49a753a610cd5d5f616c82728527335d9fe9fc926c899b57477678c9dba4a2f0c4102216d214a51e14848f5298bf4298f52c5b0232830948c607a1bb04930844d064e065d07ead63fca5c06c68d64eb147495df40220e7cc4a27ab0fa3edf68a62f4c586d224c3e842491aa2de5f46301eb27a4e49187b529c5138f149b3659cb3ea4848ca825e36f1a71670758495a272418a38a2f573836c1c45897cca3a5c4e43ddf769a805c5ee04979368947edbc6871059684f23e143c3c3e53c7df9c85ab6adcf91c7d7ed66ae2648051eafeff78c1ca2a67c30b9988574279d73a93c26ab94a2e423df59bc9ed310cc4d15215574692f6d520c737be576b8e03c92e785a0ed4824d5f51b85275444ec24bca7024a4eeb697a259628bd4a3ffac94e52614d9b2ae0b64aa29a59eb568944b952c90fc078a91b52248de337b13a43bcce2d27f2380c7832c78d441fb78d8f595c47bf54fdfb0594130a5c9990dc45cebc9033554a84edc2f0185cf89cbfd03e859de4b0644a84ad537e6bdb0672193c4747d27eb8569f32d1f4a4829decd5115a7948ca9583e3a6ac1ce66ba0d8b8e976ca5114127dab9d0acaa1932683143eb8ae0e1d95431d519c389a1b1fe4c40884df518e43d6cefae207dab4da28d167e7aed14fc09f9153419e8a36d02ab309db9bec370e02ecbc61411b464c60ca14c0a9c7c3f7c5082795ad95d2470a0641dfa4e7da61960c0148c15b94713911c7a42eb9b2957d7bd43627b6ff37ce4ecd704b07ed55757addafa8852a457b4f6dca8b7cff4aa8f4b791189b6329a8c323e73041ebedc583542251d6bae43b726227f277a39daa437b3cb713ccd2c484bf8d601c3564adf6656543061331a49b23ddfc148c4a0a927df9efaae6583dd7746844c56956f405455b9d83c048a404d6128d396ebeb5ba3e0b45f777c14585c38a8f931424c336424c54dd670ffc2e89cbee11a82ba1cc461bc52886d4b15a751b7a82771e42eff30ef9bdc3690c9a49d5675f06d1e2780051a4df08c3a1690efd439792d029c243db1e581871e272e57dc520dae58c0abf94485b124dc7f08db8984271daef5b79f46779a2d2ed8c79653acb593e29d13d9f6067d9ef1ed64649f63ee92d21737a72cfa9302932f10b47e092fdbc9fc682354ae4a4043f01ea1312e384e7fbbbf813544f5fbe86eccf8ed99769a778714a04d0c38f83722a5f76de452cbd78d13da0292e7b053794423b577f03acc49a84663915e1ea0209ce0edc2b059ae34c31d08d96da3396320c407af1a621cdc20f798ab71f25bb93bd4a4f6b0a3d9343b6344b71ca93828cd30c098523029bb946391fac6d625aa32c853b6c6dff4c67abfa943605ca52d1808f2924be459a6660b850911b85669c7d34444d2b2e1e4c0f7dd469fc9b37d35717e60314cba677b5ab1b78a25248df693efdb0ec1c760a0fa1fd6e505b9d33a8c586a988264fd37f87c6da44ed7cfdf6866f5d06709d81a0772a66964af596df33b5c83a47c44d9e62a01978a0fa8da17a974a2539b02fcf4a24f2743dc4a1b8431820effc3429b2779fc04196d92b972ce7cb8587b9fc44af739e8b78215678102188c7c9518cd57967b3691f3353b1c6e40d699b4041a02c6445142c146a4846171cc7f5c9c7971496cc6161f2bc2b7896ad8e0f5458445b253dbfd551705412a164b0fdd33c72ba59c1e249a2b31013a7e5cb942239f49bac1286e032a098dc3496ca6393289928353e70e5ae4bf96bd2dda59733c8705e4c004465f667c1099ce5c50005a7f05f0d4cf0b14e0e9f8972295411b7ae6ee00fe55879953a84029551066265473330c4caab685ad222d6f571277a1f96be270122dad1d4b20fe851ed9419884211371956635d7266fb2ab9d29853599c0c92dfe6064e8ce6aa68a354c3530ba75825277d5b46de906254df959d7f32f5a9a83f83d44a0cf82fba5ea5fda3fa7fd4a6c5fec8aee7326563dd8e9fbb179f5d6b93aaeea211b20e561c7145badcf412b993ffa0acc76e6f0d29faeba89f5d05df9433aa8d6e18a28b9bec399d147c8335b174f18416ae33be82ce901f15a34771a9ec934631d7ca8be1d7ec6072b9ea56eef72a2b0eed070132ee70d0e83aa42264c24862f0c6d8ae63ac9bcb8054406af44fa368e6983b4c441572a0824e4f9d834bc50638e9228d4fc1796383409bb6b24cf1be62bc772336d1b93497a23cc3d423d1e47ff671658e1d665bc1b9fc7c1e7a657e9e48cad8dbeb46bd591ddf70099d4126d566d3964f25e2de88615246912353c56248b417c23e670e8f4f24e37aeefe91edb98f93f3b12feac7742a718a9f12a3963b2ec9a3635922bacf22373089450f67b1f0c626507db07f02ac739d7a9b1151d80ed51fab52723d08cd5cac69eaccb0e2bdcfd524fa93e2cf274a4f1a7f30ca9e60d0d041ee2b903ebeecd75d3c653cd95ad6a1879529c6a6c3691afc620917f59c2008cb6886def6040b6b1d25268b23ca6041a052d767dad259fe572f29cca3fb63152177059e124ecca404b4f178d52087aa068cc59a1bb5b9fa8ee8ceb7c79e591291873e9a390a1982daed43cf6ffd53f03fddc96990a6709a9fad8efc4ab04f76c1eef28b4cbc678d4880dbc4c4b4fac52d662395b206e8039011cec69b136e95b07df7083272281ae773f63e406acfa1731982177967645312a424a59036c0a544a88fe8ed3079665a9a083c7ee72b4d9527d9e0074be0661f4e93bddad4aa4716a88f630a6268a38d65cb4aafdb374ea231c4af866fa8a2bbf6f2cd5847a18ad3c4647ebb2893bc397afeb5d52b1d72483577a388352ce7e719562fad8e1cfa21811884d14f6a9caf6389e58ba6e0862309da34e88fc5863fbcbe8ca5aba7a9fac682b79c1b498d7cfe3b8f9578c779fbe2848827d517b175c7db5f4640cf4ac807e3dae1d732aa7f72e450762d3811a1c8fd9e82e6c5837aced7e717c8f81bee7d72dadda1106518367948b91ddf71d42064f372817e2318a830bde39e04063d43472f868630c70c4fe57f825c13135564d406c4e3aa812d3d9e1889a154c5de2b9c490665d6d6d5292bc7d2182d7d916f8c2f964f52606fdf8e60ba8e20b8b686d3f8757ab36a3b17e01f5db32128c76f1a8a3a1aee4720b459a3f3a3d2a075bc5d3689f1e9ef356e9d9e77b03e88bd0cb4f79df2379528989212c5444a620be4a4eb148a5e1de3aee8595905323fe24a8fab508bdff4d950867e296092963811998a63db2cda427daf11155217a8e461bdfc6ddfda2522ca124fa5374f9c404650b7ebda208de20a79aee85eb57a134ba07b8d2dca5af59e9a7be5029bfde2b3984239bb4484a789375f904449e5d2a76f53f53af7a61049c00ed43584924edcc8c0d9a36cc3915fa716a27efe70127521d700a178a00d4baf0a62b948ce24a08636f96f61eb285377b41d1f911411a5ae6297356486b6c9e425209f23d5a5d9a3612bd48dc2a9b5431b960bd7e8925fd9fe4888e985047a513aa73d6c55db80361cefb00e3ac372a9b8fe94ee559aa3285b7b154fd159dfad64db6b74554e5fb67ea3ea2eaede2c47f525a2173fa092142e283a79023f1d5407a65ade0be581da50a03336914a621f8f156391aef0e4940bc758e8479585a913552c2be4e0107af1f1f105210d1ef96eb8787ad9ebf174c50ed3bb0736a9f48a6ae3e28c21bd2def9b1c94771cbde354092a34b23e6a92d8a7862b9efaee02080e6ac2f29f8915f8cd35e1969d6c94d828a39ced38cb9656c90d950ee8c5392ad12adf4c169e8048dc4eaa2bee4e73a09999c240d1c3a52c4f8e65bff1a5f6bb88e9bb7d7ee342cf4d7f6eac61fac7ae787a0d54ef057e4b2c83d890acfda0515bde6bda5faf8ce226f9c5717e4c1ad5603486ac88295546e5a843a929b994cade70a3b84a9bba251d624dc04ab55a3d73cb85953ab7566c587db858e9f1f6d751ca2a9d3e6efb991aa49c3fecf2c5a333d046a4fe0dd4a392a212318ab33a42c1fcab639f98a20f63c89575740f4ecede06a356a480c1f08dd705084f39d2a611148f4026d00136ca6e9cdc6f29993f3862f1a2527d4f192056c4f92895482990c1a783f6a1fc988e1f6e50c2ac27046b8ece0b5e4035dc0a82a539b68228f6af4d6dddde3a2e33a19050dea2f4a0d722c59063262ab653b870adff31a26a97179b42521426be3973ea59d31b18be73a30e2286bcfd6953d2173a921016406c8b62a5776a2428c464d401f24ce45fad141a7a8d3a5e1bf07bed74ee4b95320fa9a39658751c45e387fe406d8b82d4d4a9203ecaa62572e32caecbae95a37c2f21ee3ed01f6b3e25dda4369b4e7bf29c868d50fb246b86bb31bcec8b46527d9b8ba12d258d599480b2c11557a8185a6a901167b8aa60d00932bf5d8b9d0f922794a1758902a378a5270d3933e25235db60a974cd29f3fc32539c9dbd78ddc1b5ba2033e81992a2af51a8b73621fd34845fe0fcf02e887fff7394b0632a722d8483a0fbd97b3c4a34f51d7cfa3625fcd06020c0a798da5cc8fb785591bca9a1b1480d2311cbf75e76c489d92464e359eabcd8fde0e51ec783e57098b830ec1db532b53b8592e6d938e4e8bccf3551dca754a045f3b9eddc4ac1a6a3c04fdc4b3858d858ca66ac5902ddf3a0fd8c0f3274dcf5a86d8b000187a6bbd36e49318ab9777667b33fefb7d251a32d2ade8836257fb261a5d21e2ff6c0e8ff3ccce0cb783e1f3f2cbf128bfc6504ef27b7e3a7c504969f26703f7d3f1fcfbfc27491ba637c80bbf96402b33bb8fd349e7f9c54386e3ec1110f3391e6a25e19c504152c67f4f7c9df979387253c4ee69fa7cbe5e403bcff0ae3c7c7fbe9edf8fdfd04eec75f4662f2f7dbc9e312be7c9a3cc00c67ff325d4c60b11ce3f8e9037c994f97d3878f34dfedecf1eb7cfaf1d3123ecdee3f4ce6d4b4e3e7d95cd087f0389e2fa793053cce677f4c3f0ccf74355ec07471055fa6cb4fb3a765a6039e6dfcf055fcd7f4e1430593294d34f9fbe37cb2c0e3cfe630fdfc783f9d7ca860fa707bfff481fa81bc7f5ac2c36c09f7d3cf53dce772469411716c9a1d3733bb83cf93f9eda7f1c372fc7e7a3f5d7ea5062277d3e5c364c16d46c6bcf3dba7fbf15c3c3ecd1f678bc90898820fcbe97c02f3e9e2bf60bc4874fddbd3384ff43899dfcde69fc70fb7744fb88be21ef1b8f075f63402587c9a3ddd7f1810050935810f93bbc9ed72fac7a4c291305e2c9e3e4f04d37bb12402dddfc3c3e476b258e0578bc9fc8fe92dd1613e791c4fe740ad52e6739c65f6c0dae7b7115edec30c267f200b3c3ddce369e793bf3d4de7971801e7187f9c4f8898307d10e9debf4cefeff186ce2ebfa24f1ebe427ff95fe1cba7197c1e7fe5fe2c5f05b307cc27b981cb902bc68b8239c7ef674883f7f86bdad67286041178451fc69fc71f278b820968e9d853a682c5e3e4768aff67fa703bfd3079588eef613617b7b387c5e46f4f788be3fb34098ce7d305ce807cc857062882c86b0f89479633886299aff3ba5ffb9cffe07eb62066fb305e8e8176bc1cc3fbc9f4e1a3984f1e3e4ce6244ee3dbdba7f978498be11793052c9e16cbf1f4812f05198084793aff90e509e92ceec6d3fba779e2b14cc1e50c668f139a9278adbf90c5ec6ef9653c9fdc54c40330bd138ba7db4ff1f670d2f2e23e8d17f07e327980f1873fa62479bccee36cb198469accee006710918e2f29bbc9037f7da1abcfe08b4ff68086624c0e2c07699704168285afa8971fd4219a46ad7c2c7aa5282df7b3e3373e3068165b34828e69dd6862b9bd970f62d0bd2de1360283d49693ea6476ca34a979ae0e27f681bc3195daf07327de616bd9f49c9b0388dc1f1abc256f8231379a9293a8ca599b19b8b6aee24756467287d2eaa58cd29f34dcbb496d6df3dbb1b44805320419f3c73d70cb8fb9061d83b9dfa0f6c2cb357a630823f2d7bb34d887987da23ac49807a75a5f0ae3fb0045cf5541dd828e317d5db75daa9019f66aa0a9688ed8e0968b1542ae3851e22ac3942b2a478e9eebde929b46cf1e38af955aa3c6d49a46bcd1992672f3bf1ac59d58b435ffa69f0cffa1877f1d9574ff867fe11446eed4bff9b3d8d534fb97039679971f8c0d3885a1f5cff165786e95fdc21d176d524f9ff77159558c28fa014e7d15adbd8b389c2678eeffb18b1e96c600aa75703dec5171738ed247972951e643a3cfb7b57b95fb232650c72fc3b82c0bdda6041450a125b0f02e97ddc75a7f8a25d3b3f0dc2d233e913fb5f9d6bd68f2a137f90b953bf531555f771a29bb400d36d1a9f3910228f4259b5eaec5f9d1fb2c5f09f5947d077a8d1c7c0170e79ba6794efffd91eafff7df1fa1d99e166321c6ad27ef35f6c28f612a035bd6e75410c9ddbf910155abeae0acd1756c5dbda7c6e4ba1d0951508a0ac3372a3299daed5b7b540eaed32bcafc4e3efa443be56ef05229cdead1656b39b46da8713bbde20009bd5628dacc5ce5fad9b2062f154ea29afb14bb5b4af014357f171fbbe23728f55c85f0d51e6d73342a5116f5cbea9817e206f4fd064811292a7a8a6500494cfecf9db3ab9fe0ba6fcb401b3cc4e6bcdf8c5df99b5c7db73ac2ffc63dc05c9ac6ee04c027597f538ed8ef5f5c89d639b27ccb23dc5a6bfe5dc15b18ef9d6ee1edefbfff82b6807f51c1a3535ea7ae0d7fe85a09b1dccaf053ee9ecf84a048c0ff10ff2f0000ffff539fe0b35d670000", - "89ae21d51779b8540143aebf69368c43": "1f8b08000000000000ff9491cd6aeb301085f77a8a41b959daba50e822d8eea281d24d13fab3f758562451d923a471fafa05a76d429b14ba12127ce77c9aa92260f076aca536239b249bca0f1672d2b574cc31af94b29eddd4959a0665a99b763b0ca4bece409d1a30b3492a90a532efad8437dfb3abe5d5f57fd9542a3642fc2c1215824b667752443de9929255d5b2068a9ccb6d98ac1fb7af1696cd59b7df919bccc8533e4861e05aded19ab404d5540acf2a241329b1c6d4cf3f3e5cff22f42da0c3de9a0bfca7123cce0cdc62ea8f6ef3dc16701615e279b3deac606db24e3eb2a75188c502eec7cc18021e1edab6ed303bf10f2c81350cc504c5fe4262dbb673c44b466b4ed98f551fb12747891f7030b06ca0289c0971a6df030000ffff6adc5c3b4d020000", - "920fdc8a8285bc442cfb791bcafe45b6": "1f8b08000000000000ff8c51cb4ec33010bcef572c3ed955e5481c41bd8004b78204e2ee868d6bd5b12d67034151fe1dd9e5a11e785c6766673ce364da83b184f38c3a989ef4fd07b02c00ae4f31334a4014d6f17edce936f68d8dbbb1eb8c8f8da510dec48f74f2e3b0b7147e5198f6909b97f33f3c0428806e0c2d6ee955c6c403aeee12bb18068572559fa16f2950361cf31a29e79815ce8068f162834741b9550088ae2b8a42142bfd64bc7b364c525d56fc6c83c1f97a8d9889c71cd05653405c4e0dacbe8a93ac35aabf2843eee2b4357dd950ac5168dd7cad7be37c811ba63e79c33408f5bf50c496a71258f72851d731304d2cd591d30fc452943e625d6b15dceac76cc2d0c5dc53969fdf7102b63ca922fd8e0ccec302f01e0000ffff7aa1c8be1a020000", - "958ad94ad4ec3f13898043ec59181ee4": "1f8b08000000000000ff5c515f6fab36147ff7a7f8a9d2955a0975efd336c9052758033b32cecdf248c0299e0846d859956f3f1d92deeeee09717c7e7f8f1d1c6a6951f9ce4dd1e1b996f685b13cccb7c5bf0f09cfdd0b7efbf63bc29ce2ebd1b50bbefdf135e0d734041a31b673cbc5c7e8c3041f31b8c59d6e785fda29b93ec379710ee18c6e689777972105b4d30db35b6298104ea9f5939fded1a20bf38d8533d2e0236238a78f767168a71e6d8ca1f36d723dfad05d2f6e4a6d22bdb31f5dc4731a1c9e9a07e2e96515e95d3b323f81de3e9ff0e1d310ae098b8b69f11d7164f053375e7bf2f0f93cfa8b7f28107ced23b214708d2e5b7d66b884de9fe9ebd658f3f534fa3864e83d519faec96588345cebcd28c72f614174e3c8ba307b17b166fd72b7ee90f5990a4d8f8a224d3e8670f939898fec7c5d261f07b762fa801856c5bf5d976842ebe7308ee183a27561ea3d258abf3246b76f4fe11fb766b99f7b0ac977f7bad703cc5f577d3cc5a11d479cdca330d7c34f68ff136721f998da29f976c41c9655efff315f19b3a540a337f6c08d806cb033fabb2c448127de40364f190ed2967a6f71e0c670658fd01b7075c49f521519c45f3b239a06da3059ef2a298a0c52e5d5be906a8bb7bd85d21695aca51505ac06093ea8a46888ac16262fb9b2fc4d56d21e33b6915611e7461b70ecb8b132df57dc60b7373bdd087055406925d5c648b515b550f61552416988ef42593425af2a92627c6f4b6dc81f72bd3b1ab92d2d4a5d15c2347813a8247fabc45d4a1d91575cd6190a5ef3ad5851da96c2305abbbbc3a11434223daec0732bb5a218b956d6f0dc66b0dad81fd0836c44066e6443856c8cae334675ea0dad48453825ee2c54357eba8836ebffbe113f0851085e49b56d084c113f975fd9bf010000ffffd5d6f12549040000", - "9878d11093909d531176b7e6da001598": "1f8b08000000000000ff9c7cfd6f1bb9d1ffeffc2b06018ad8c04677b97edb6fefd2a7806caf63b58ee44a7252ff566a9792d8ec925b926b4528fabf3f9819725f6439d7a7071468a2e5909cd7cfbc3070e6bf8ff347f898cff3e5f41e1e1eafee67d7703fbbcee7ab5c9cfb1c003e2be7b535f053067f6e8d82f73ffffc5e08b8b6cdd1e9dd3ec0c5f525bcfff90f3f67f413dc3aa56065b7e1209d825bdb9a52066d4d0633534c32f8e33e84e6971f7ed8faedc4badd0f7f12f03b5c25cdd74a1b5805a754c8e0566fc31e6e2b6b5d0657d607a4f0690a3ffef4fefd8fefdefff6c7f7f0b89a0ac89f953b5aa3407b6894ab7508aa8460a1b0cd11a429a1d43e38bd69838267e53632e81a7fd4ca0bb05b087beda1d285325e41698bb6562664b06903147b6976daec4007246f6c005955f6a0ca89788d5df4df8353b2de540abf5aef5522ef616b1dd4d607f08941f8bf5279bd337cec20bf2a90077984a36d9dd83aa54a5be32f7e4fdf9b92cfa5408709c0d5110a6b82933e6410f68a25ac8c72b282877653e942dcc7db690fda04654ade6ad74a274d508ab682ef6d85bf8974e677ef82851acfe95ba768d3ee3adad3b774515955a08387d62be727c809edc5f868908e269ba6d2cae3e6c41f128c1a2b93e895e9ad1f70d0d06da439820d7be5a07176e7640d87bd45ca6dd85be7a1b075ad03042b5acf329d005cac6cade2b2d7147774b9c23e2ba74ad81c4562f6bdf25e3978e562daf8a06439b90478b22d14d2d05d8fc06721cec703fb0c82b5a45a5ff6cac041816f94fc8acc20a6a68364f8131ec8a9ad720e6f136c925f867a2a1aa70b350158b4af9dccbf50bda1486540a5107bf9cc021e28c7c09ed88c5e9c0f2ea2eab81d6982201bf3ca3deb4281de22693868bfbfccbaadc0a942e96724d2ba0249970aac2386ed54001d445a280dfe71b014bf898a3a5246eb50f7a0d1aae053221103461df8bc89ef1f588712b9afc61e3abaa5459a1e296bb3f3249db5c5a54115812d87fca027a91835e0a553c8a90295c833f9ad751b5d0a69c865213395214b8f9b30253c386ab4ffca3f59948a43bb757441fe6a22d6bc66b48b93c6573210f142b920b5c12f1a6bbcdee84a071ddd1052668e8ab3121d7232c31345f6d7b6d45b545f62c5ad75a0bec9baa95496be384bceb7c51e6462790687bd42ab133b2783a61b93cb80ad5219efd3fa003b1df5cfa942375a99e0c9adf45c20bea21901eaea84ad8cd69ea873d8ab231958d6a9da40bdc21efd5ba7791380a929fb73f8bd3de037755206e56a744144951526ec95762289066d589dd31238e8b08770b0e0836afc2f70f1fe92621507d331d7a529c5c54f9760b75be5a29a0ca2d561af8b3df1c8d38f95dac98aa3a0a7981dc3603694b034e50f1485488cc3fde8d4d3cadb8c64a1244a8cbce75b9fae8254d1586ceb58e1c91a93c2478513c4709522738b8aeb8334a5ef44c1ded45838488741e8485bd2ed46b1660230dbbe083174784d6e18bcad15eea22acfb1a091deab12102f1c9488dec20f3528d8243219e09094831428c579dcd13abdd346561978cb57c218d338bba9544da1d4d9b22df818144350ba5545049cda56287a94c2809688e1e82d38d5b481020cabcb2dfe5c1d33da64e89ef04861ef940c0a1d75610df2325447be7d8c8d0dfe1c30cc7e51e45bc9833c5b5dd2fe257a47c73776aa53070c8c768b66874cef02275e429b523febb2c54381dd9023e14d3a38938136a0b65bbc672dbf521cdaf7641a671ba75590ee38894e533de37a1433290f71bc96256219282a25e309a539c60bb1f96d3a0855b26a46d57a1bd1067a79eb88efdd7792c0da2441b006e5df592ec5276b4acd5e1369a2a168b3cb7af715755db0b6150c06b61611e02bf8effbe87a9d2f3fad603abf81ebc5fc66b69e2de62bb85d2ce17af1f0349b7fcce066b65a2f67578ff8137df8697133bb9d5d4ff12f70cb1f2784a2cec1a6a89bc479eb22a63958f735ba094489521b2f24f209037153c9a8bca821bd0fdadb0a238d97c7887d6b794411f44ea4146d178c98a109489fc71a1396c19b073edf9b0c36aab2874c1080e98e4f316270073c3d394190f086aeb2916cdab473a2266a258d07a5e9ca835f9006d22d95d3cf32a0cb272a7cf8fec2953cfcc206aee92c5ea219f2b7916d51b74794a1b18e7482904526e201ba24036f80ce7ea83f3ef9df2e5097e848f0fe24315149b36be50e597671a79cd2466e837259b7003724205f542d0279dcc2b6a8f8b50ef167239264e0cd70f737084373f4ebd14cc8dfc9b2748a7ca6f4f0e668db371321a645d0cf8c166ce42ba2acd78c647449429688427bb4ccda11d5e103fb5b82686df09aecdf832f6c935445a2ebdc0ad79a17ac8f1e3ac11e556611be11b5a60db075b61e2e1103e06e0d62ef2d6d88b2a580403e55070a8ff042d144daf9429b523588c30c65287bf98c87db2865d88b6d8e70e6c49713f185d10e744ae65ac4de48cbe32e290875972cade2b0f07ec288461eff938c3601b748e6ad1f821a14ef10692386d6862ca456a56eeb0c8def59537a983200644da38bd6b6bee2dd65c38e5d06551da14143f77bbc04018678c8e157a2b7b4e879e2258a4aea5a393c7482011fe0ab520d9a046a40847a8297f914be100c61aa3cf2849c05e2e5e5c62b53280a6ce6d89316f80d21ca3e571ca08231eb40f25592638bfb085959b38b20aeff7a224427254e7b08c94650a3a0d91fbd2e6415f59a8d39e56ebc13a3bd63a4222368b44df43078e70e2b0dc01846e06f294b4f089a34e7a75e7322d8238a7c2b775e6192c78c9e4db06783b06f2948d67cdc575d7116032bebe91075926b1f3bc2e8e0e14c2859c5cbbd1772639fd519bd0459790bb552ac247c0baf0641fd170ed1f2b2cf080ad97a4e273a00b9d51587cf423a478cadb541f38e2a47343cfa55b2e9947012bfd9e73085e4814a4cbda2e2f157112a6c5e9c83741319d0911df0cbba645931cfd586c81cf6b6a25f098db9d08575fa3bcfa10eef75e202a3608906ad230c6eb798118de095f42860da452217923e6388226bd4aeeca8a002bd860452e8e7eb179709c777ac4f81de585713c8744a965ca7a154419ba09cc430a4aa63bcbc32e860070922b31275947ef4413a0ca9c90ba345a0ead1f20141428cdac403f900d695da4887de82b244689c4627ef50284d8516c90290c6d8d614aa4625e1204c4631f27870d6e3492210ffe2f544e802016ee555961058a71fd10af81cdd82cbbe7a419536b2f801c6678d4fdc26711185538389615455558a5f480e28f3b5f0acd5e1c42712951ee15de4df0a45eeea170cb0a3901dbcaab6a9fe9864b0690391c0584721bdd304663e970ccc88e5193bb191074ab7798910fed96ac7f518a678426c7229ba1a0a7d5a738181ea73319874ea4a5bf6d64189a9d00805f456cb4da5c0ab588421fe606a494b180bbd6a991985a5421a3443a7a4b7466e2aaaea22327204107bd8811f7bd548876a861bf808f76aafaa67ccc9021ac2d00459b00878c84233282dd7b2fb7b5aaf44777cb2a4137f44b50fe94fb69e005cb5a15b204e74cecb7ac015e9d9f350bec91e863313ed4731459cc614f2ab43bc196316d34809625c959c901873806bc17d6984733ec600090b7b50df82ea708440d1bab84dc2982d050b2e8d98921351be96533be9ca4a7992ff616fe180519a0b65eb7d8bd972189617a8141f3a7f19f944b10871d1a0164838d507312c23051b933ba7435006f8b05c1438daf603388997cb865b517623d437e538154e4534ae1399e06c7596d983fcc93a51d8aa5245974df9b3486022c4cc6066a1b9f753a3a393bb1d7229918d290fdf03b9728e9038855ae41fe92fbf03442ef1cf129e6dd5d6188f85041fac933b155d7a7f3f86bebd13dab8e4fe06a763af493a8d49cad920f7dbef23f5d32b9c9e1e33488ea509fdfc748921ca6efea18ad0d5c3d53755b481fc0d02b233e157ac92c5bda733fc0404a25ec350a5056b54b2292e6f68b3ebe1d3b4286cdd205ad1a107bef87795a250e7b8be4c71b096c55e1bf50e63391e92f1539f8364d1e693d50e6a0adf01821c6ac6d7210147e115ad0fb6964e57470c5a5c24ea0b861873188c7d00ebb20e90bdbc99ecec89107706cfb2d24c4e06a894f4816a717cafa3928e9a367d5641f8881cc2318b783c022863a1b65c8c36dcdb235c149b5d2941c0e0a75c82da9171437dcd280833ef89c229c70721fa5438233910eee3f8fb9fc9e075fef34dfe0b1914af699736c802f614839495e0690ccc24200efd273da957ae8c10858a67b20aca19f66711c5c4b62e5707b6544a340844d153caea65b523551130e8e1faee7c43a8f5ebc64bf7edf0a9ecb40eb3f2a2b08eab3bb06a37293a6c98fb11b98c9a65dbdea970418ccf422d421647dd454efc686b9d8855db7162162c37476f2967181e9a0b729de9f3ee8276e72d536fe6c5b9aa0a37693155d27dd2924153b59e1213e9bd2d74aa8729b795a8f86aab8de6ba2ba659f17bf6c34e37dc5cc6802d52fcc2c3e9582623d8637c90552587c0a1bfd104e0ce1e308a6784ed846f14495c252c9bbdb8cfd05ca8dd87512396e38434476a1476959e0ed30e975d60d6ced5c248d93ad8500222504e97bd25d4f21f8400eac61a42a7177c433cf157e58caa189a7874e397f186c236ca71ceea8f3ea89a6b4ce878c7f7c744c967d01ac22d74e66e2b1151bb8c164a75e631f784986d5fa08501758458030bd0be2b9391a26bb313b22868eb38b041e858c6b634690355a923aa4dab00e1fab3acf09427045e685f82db0446891814b6259cefc5395839f292ea99c0b46d77fb816fd7b17bce35ceba515535183a191039a9160d984190e1fff590019588cb405cacc9c053099de1eb10b48ca084604545e555df1aa7bca7f42946fae4cd074805606a8e204350751304419c038141fbeaf6afef8eeef3d9ea5881a5b6916c310a8418cb30886894e3a8057ae658a233c3c45f44d0d41fea7c2b57ac8819a9e34ed2c5009100daa022d8b5e2d2108376fd204e7730b21c92126637e88ad3019caaa5a602dbb6add8b1545a9a8245f73b165dcaee86b9266a64134e5230af4d415ce0e3a0e6c4c90bf2b5ddf511139386575ec10e137c2eda8ebbbab1a067dd69ca3528f760c277d2f9e0291c4c78654aca1cf5ebf67aa30317ea2b79e81af9314f7c791fa6e3d4d63a95c1e6c83d32aa568cf0f549e9fe2296175f2db15f7269479b12a351d41ade5fc692ee48c681f0abb75c3c4d0347ff971e1f9fb83bbe3861e2498613a71e7e3fe12e4ad0b58af8e47b48ff576e3c9a6f3831a0a8fc9821276b4c1e4da49e72fc858746d888c795c441af3f9dcbb7ec8a8215c3898631cfd23445744fba6e6cac5b6e5b47ddaad1ec494cc1fa92fa5be872cde85ba30320bd5625eca9c13511634b8ac32a0c924021142c504ebd05c686d2c01bd33d4e12b2ff3f81d996e33a5553d43fdbae2f8031c005f8475beea892c71865909c72fb5968b3c580a3d247db28cfd43d90de1ab8e0c673ade3e8616c5d6bef5be52f3331d042c2c2c4475204d49d8b380a8397e25359571220d9399536ee3df5650ad3263859ea2244a0df6d7162231937dbd896315cb49e75b68b8cafafe5e98b380a85cb87157d1bc1b89741fbed11bcaedb2a48a3b855c4ed8b4da5771156f65e5f0c9b3683b93de50217df07cb62e47f214444de49315fb1bd3801f072484926e9768334b6ad18c7f10829387b945538bea3e98281710f6042da6573148c7a2d4de4d8aebd161b2ca576aa08d5918bf6dd9fc2de11a838da96af489e87f28a38fc89ca50951d7b3736ec113b731d6a18e7e8b30d3a43e1d4d661d0eaaa4124e4ef1c9f21dca0e5f3a21ea53dec5585409a7361eba0356c948a401e875e2281c658b49574506857b4b527afcd1e6e23abde85ab21f9c14caae09a64eaa6a48f064d899319d6384b695885c4705b8f771b55dc9ad691073b5372d3a66c637ca63fb1d50f06517c3f54d13884d7e1188b6754ad4b337bb154c775031d8eb11724a896cd5f7e186fbe9731a1c1db0d4e987a7c71a8062fbd7391629ac8ecf3eb918819f3675d795568547df4241ce21b1ece48dadf50411e1906f089e4a86c530da673c44e19e56ccb1df3b44d97891f74a9c05107d26ecf1c499522693bb9ae9892d06062f4e7d670bddb93e3a4a9966290b2c92078d18758436d9baed94bf3543f94d6b0004a55d03cc11668ea0afc9e7406c12085f751ada03b6b3a5fef8ce22179f8a49b96886e30464276c47bab0913ae4fac66a8a6341d8707c55daa639c753ac41c71a32aad9ed90036ea65b4e2a8eac3d9b2e31f26a9b3765aa5f821cebf9e382ced07b313a08d4863a2941639f45931374555e9957f73ecdb5ac32c9d5d748f465e0c12a153a4c4cb8fcef1320b20872ecb92ab0ea8033ac04ee1e7cd9edae7a32b0e265ed4b7d88813ec87bbab643ca429c378e9e8b10017730c6180da9a9de819c19ea3f5710355624434dc992a2407d7812bd6a6b0aeb14e06e5c99f0f8e283d2a652a2fc6dee3c6962f460c48aa3f4f680ce6d59974e4541abd70ea5953eb96456ed4019ef9d1861751f6af0ca7330440108bd6a46b0cf82bbcdb9006d90eeaa5d7b546dfae0df8463b1a604f45268f761b57f0e3093c61a9696e411b285590ba220fcfd346b445374bc94d8e42391a86246c1d89a1a8761ab3704922d466d76a4f2952fac2b4f546b97e5234a5c654cbd952ae7ef2ed8b3c823de5609a2e06da37e8bb2b1978ac0b29bcc9fa248e22761ad0e84be783f2e9184fa709b1d41f4c87b22e8d0c8cb64a02ee67f4501dc419757871f7be9dc14c389e63c1498becd80db0d804f3d3124c4dcf9fe6dce30c9e5bfa7192b0639a461d5807418517c3273408c7ee77388fea63f76e64c127989a358d1ac468626a1c1e449ca647f4de27d211197641a0eb460edddcaf70fe64bbd7ecf5033de6b0b54223f382c2415762f4ddec737cb081318cf84e258c8d825d4be59c789670b0b0b3b222eb26db73cf49ed181504195a1eecadaa410d80fe2a3df5193da0614ab6b65dcaeef79287934c094ec530d22dd9b13fa98ebff2106abe802fd3e5723a5f3f9152bc9fc0557e3d7d5ce5b0becbe161b9f8b89c7e82d92acdc9dec0ed32cf61710bd777d3e5c73cc3ef96397e31a475bb580e0964b05ed09ff3bfadf3f91a1ef2e5a7d97a9ddfc0d5134c1f1eee67d7d3abfb1ceea75f2600f9dfaef387357cb9cbe76281e4bfcc5639acd6535c309bc397e56c3d9b7f2482d78b87a7e5ece3dd1aee16f737f992e6777f582c8116c2c374b99ee52bf1b05c7c9edd8c2ff566ba82d9ea0d7c99adef168febeef078b9e9fc09fe329bdf6490cf8850feb78765be5ae53762b184d9a787fb597e93c16c7e7dff7843a3c1578f6b982fd6703ffb34c373ae17c49af46da23ecb57b0b8159ff2e5f5dd74be9e5ecdee67eb279a25be9dade7f98a278ea77cf2ebc7fbe9121e1e970f8b553e0166e17c3d5be6b09cadfe02d395888cfdebe3b423f4902f6f17cb4fd3f93509ea4490785d785a3c6228b95b3cdedfe007227d808ccae126bfcdafd7b3cf79865fc274b57afc94477eafd6c4a0fb7b98e7d7f96a355d3ec12a5f7e9e5d231fc4327f98ce964053d3cb255259ccd9e1fc3441e1cd17907f461d789cdfe36d97f95f1f67cb739a8034a61f973931732077f165767f4f123a157e464be64f03e13fc197bb057c9a3ef1a8f653540fb1ccbb59eeb1564c5703ed9c5e2d90075739dccfe858eb053104457433fd34fd98af32d129016d1dc7cb33583de4d733fc3fb3f9f5ec269fafa7f7cc95f92affeb234a717a9f88c074395be1d5500fa3c8d00651d7e64947d60b38b5cb8b7eef13fd43bdb85fac50d9e066ba9e029d783d85ab1cbf5ee6f39b7c49e634bdbe7e5c4ed7b419aec857b07a5cada7b3390945e07dc99a67cb9b644fc467b89dceee1f972f746cbd80c5434e2449d73a8124255b5d66a40330bb85d5e3f55d941e8cacf609eea62bb8caf3394c6f3ecfd0f3f03ee261b15acd224f169142e4e36bde2e9ff3ea3303fee315773c4c35a5ac952bb16b020ac1c2137ae6b93aa470e871690ca1a57a56956d4026d8d44f5b0e9ec4c559be185577f464c407d158cfe5b4d677818a53c09899636a719047ae5def31156174c4d3f014ac7410e3a0c1c1b27be35348332e820e1e8f763de554664c8fe852e93604193b533d86ea467eedb0a78a408752262fb778353c71b7ba4e1fd31420b5a2f097d88ad9ea4a75cf4bf9d10a4f1616d63cab636c6d1555eb239eeb479269d20749110dbfa7820b21c034144060ff4d871bde40a54d2c6f41632955a2891d9af7a38bb6dc9ca0079108005a931e15ffab54dcdcd4d6fc9bfe66fcd6fa8fbff91f449d7ef28439e46ffe04fddf4c09edc06ffec49428231dbc221a49f043f7c471243706befd0b319e9c0ce7c73ccfbd36ee27b2fd083276537aaf63a4fe0105bf384f9bdcf76d30a272319e8ebe7c099d27e71930ecc1c60c6c6f9b98c8d3fc01e3add6ab6d5b653c27d2862e84a3ab4961fc43f7f222f608a9b05bd1a8601ae5b45b22711a8dadfb4f82f14a91aa88ee61d12b391c898a9ef2628ae5e3d59f6c3bd2d47e82623420f23df955980bd3dc2df72f7b5e7ec054d6d853b0fd2b4fff89d67fffd67f22c4b4f2960a04c3f9106bd28c2a8d15f0734bc4caaa524570d6e822be0b6c94835aea8a8b9ea3518dd1646a967c5e7a50229195ae1be6adf457f69082261f75608fe3f935c568c6b5b6a58aa3541f8daded3303fba4e2bfff393bb1ee231ab59135b729387b395d5dd85ac587a4d3abd5e2fe719ddf3f0df1f107d28aa810108e8d82bfd313d6c3db496f18a71ea18f27e4e05585fb205f4f1c0451886fa8bad251cac63e0cb72bde0e0f32e19995fdb1c11c8f3a5cfdb4773a1f9da15b1d35383dbf1dbd2a19a590afbe3b5b6ca9a912fb20fd7ed434f60a335eb1c1f8452d7c4ad1a8b83078f474f668f10d13d7e8c9036c94a86debd5bba2d2c557aa69d4cab4a083aafdbb7787bd0c9447fb56734fb77bf81f5f8fc4cbd254de4e4517a7eaa6b247e5e0223d7fefe690e3ea5ab94be007dd4e78ccde2bee72189e64f77a67400ea2d3e0e9cd9bfe854ac2147a2b8c2a94f7fc6cf32e4ea84bf0d440f9c0e353b406d594df593cd9a32d8f46a57fe403e3dce6d86dc48341fd01c842107544271c3717007f1fe8f95bb888c382f2abf2fcaed7431c51d19572feb2aba76d8ef0673c0ddcc9e2ab72e404ffc53324ad235b5a1fe1da5af3ef0cdec3b471baa27fb4048108ff90c183535ea7b75d9f75a1624df715ffd8955862cfa82f6fa0fe0ce54b850d31780edbfdcb035d83cd0d5d9104df6e9c6d0382884a6f9c74c7ae3e23d26038bdcc44c7cfd18a1a8f7c924a1b1aeb1aee38a8a9fb6e204544e2a97ec44ee190e643d3dbeed266905ecebcfc172fc4f97ff1e26559f37f030000ffff5a89e6dc90460000", - "989a41b885f6a3ce4ccf49322f5ed129": "1f8b08000000000000ffa4585d6fe4b6927de7af28f82536a0b433bb418049160b044e0658207b11247391e76aaaba55638ad414a9eee9fbeb2faa48a9e5d8634c6e9eec9644b2becea9537c78f806deecbe817f463e91640ccefd5eb0d048b1403ac0afb34c299373ef078280e7ac0fc7940b7c988573cfbe708a19ca20693e0e692e5006827392d003ce258d58d8630817f0291e481c7df261ce7c227848d345f83814c0d8c36f14b0500fbfe9930cb73d1d38520f7b0ae97c07f394a26ded85b024d1352ecffb4c1f67b3f51c496ef31ddc12fac176c4103ac00837f6eee64e4dc70849f8c811831af908e9e0702e43923cf0a4cbee756fe8b1e01e33d5ed3a40b8f923c9e3cdddceb90792821ceb9119ce9c07280926921123c5122e2014387e9cedcd90328154af4a0204dd080e49d41d37d500ab6d3ec522bc9f0bc763fdd2a771d4e8ea4b759b4fd4819f43990583f9983d532c7c60efd49d0cb7370f75d1cd1d94016b3aa6791fd883c76896e13e5c6cf5998ba5ec40287a8866409c0fc8a31dcaf1201c8fb51af63387def2d0c1987a3e5c3ae0e8934c49b0106844ca406271cd1d08cd999c1e23d473aeae1160868310a90519a69433ef832dc678d1a88c701eb0e44427b2245ba4305e9648653b35ccbd46697120f0c805b5142d66249e31c0b26207ef07d218d7848d78716bac4923ad316a61b34c4a1a93be1908b8270c563966768b3e99659abfc32ce6f424a99f0d0c5f94ad25485a05098ec8d1094d73f321091c7507125823a7cf5bd1b0d41ae208134a59c067f6ced96c73743824299645cb4ade39f7ae2eaf5f689dd77c2d613213c754f86456e4ee498d687ae8d344bedae834247dcffa3f06adddcc3dc96abf4fe34431dbefae1621494e1130e7e419adc8957d747f40670eddea77373f1e0e2ca322b65b92439f8a96a015f440ba7fd6dc64c3b36655fd5cf9c4bdc0275cd9438fe9e094c21c0b0a870b5020df90394de16236b553f563dbabe2275c6053c7cb0730c79e0458f7201973573d7a8ce91ca83f1ab207ce6af340e25e25bd8d914b81c148183556fa9b63a1d8530f818e1834c7e48da6d568e3c72bd7ec9c7bb37b956377f0633d6ac49e004fc801158bd521dd72c40becc94d920a795db8571adfee286dc72410898fc33e29612c74a764b4f9da3d3dffe6ee75fb1acea983bdd69f10c4d4a04ebd2ba996d5218590ce1c8fdf3b07c03b7b58b72c09842a30a903ec712add26859d96a4328e3d9c025e3a638f39b2c7429d839a04c198d5ae46dd3fd839bc833129ae9bab42da136a888a9568eb32b5bb68676aa06b875ab76a7bf1ae9518974acc93f009fd65d97caa1d67ed0b154a5f65e0118f0687c08f14296707d0d3c4962ce5d48dc5a7ddba5dcda75595524f2e30c70372436d3150eb72a1234abf695b1a933cef3f68d935905ca9373742c2a3e034c0b7b778d7d5f66d06bc787e03b7a0af44d173ce34726cbcd1d8acf6122d74edcbc051537375edc4bb6bc35e4a2fcf2a0372c3040a673dafd6f64f2c7afe89e0ed77f76fef7f7ed0ad95cd017e9e254d84117e45098cd6f9d482fa013ca4397ab686f0e60dfc3f8a1fe0cddbb7df4153271598b0ba58dbc1625ca3d46a84126af51303f038056bb395409597291d34dcd766a70bd4a0bee22dcfde53ce4940955b3bc9bcee17f7ee7e30d8598878d7e83ef3c801a503fa38f30983a9274dbd08e529c57e03e097649d03505f7a75592993bdb146c0b37533ed5b97eae72b1ee6c5c59d73ffb5833f50e5e70eded79aaacd2f9785f7555a71a90454d940998063954c78d2a66afe77eea9451d2ccd44c997f617482792122e1d1ce6a07f36aaad0316a153f28b3e7273f41a8fea41b8c059cdd424ee31f66b87ccb3886645b24a4ecdc272e857f9f5a664416afd907a68c24b9f7a9cb5236b936dc8380f64e98be9ecb4b958979d63fdf7f65a25f48973857686338560826b36cdf2d2feaeee7fd73d693eb77c67f411823635e1928429d7fc9f5929f996f96ed12330e2271ee7d1f573130093a413f7950d3f57235ba39b818547729673ade77c67c73453e205bc05daaab52d18a9e779dcca4488f3b8373de07c9a7881dc2d9feed64f16cd7d159aaf6b4a77d594da46b4822a9b24695ab196f82aa4aa8ea945ad5d6e2dc2111f293b0bb3bd5c23b8a74807b65e6ef3cb48cd8bad7ec70201e5d8c4a741c5f5548497696d5377aa12732bcfc613b9157d9311957eb154cea8f6b83c68ce155d7bda327dc545ad44a1ec3967fbdf63f414c222f314a70b7727711aec4a3ac68b1a2f259d62c5500b4f37ef39cb3c558af9383315a0f8215d16af5629d65aeb128d6cf0a771aa98da5fb6fed3a749286778699add39f7df3bf8b56ef30b7b8a99e01d86b047ffb883df873487ca5e26af1713ae19d35742a872764feec3dc1f174d66d13d6160a3688e55a269a769a4ff277a2a03c5cdee2dfe7b02b59ee4444ba2178c3da7c4828f9a4a8edaa5bd4f732cee4b0301ff175715ff5c6caf5671869ca0f9f967463d0ac62aa0ebe46d1e53bfea7d9074c1502e5febfcd4b9a83957497520d13874a04fb225430786f5d17a51b0e5657acecb105a06d5824f0ad34c2f32f0cb12d3fd4dd28385f4dcdf203d784e7aee3f223df81ce9b9bf4a7af079d273af905e8393b2defb815674ad75dd138dd4c31517985d0358af1adb4642cc35804f51bd1dcb3e8752b71cf80ca6f01760fa4c451845ea31ac4aa6ae54adfe74b10a705819d4b5efb00d8b4223b29140f3b799dab5d1ae1ee27153bd0d620eed77fef3fc7be6c6d55ab96be91be96e67ce7632c7e3974f9f496ab163ce2475f87f2654dc4b42a54ebfaa243733429dba3902b1750373b26a37b940495fcc57ce7dbb835f3613879af0136733a85e7200e00efe9194637a1ab1fa32a1515a53b50385a785a5b3a569bb7ed576d4d759a7493b7dd378c64ac6badad9c2bdf09d7527ced0273fabdd66cb7ed3fcd3e1a01af13ae1e7afb95dbaa82c8058c755ca57919c04ce284ab04c3adbd90de6051e59239fa22789cb145563dca2d799dc66b53a172c7349727962f6d3c9e205f45f8fb572e5a2b4ac7c30602cb8e7c0aaf20f5cdad46978ab10f173c0f556a972f9f622b15e7a0d04b8cf143d2d178fc671eaa395484f1a562532ef67417f5997b508e9cfcd0e24620a6791c9490c83a0e2c2abe8af8dc5c8fd9521a35d47bed4ac2d9f7e93cfbed55d863a3865ae61b158f840b8bd0a59eee15a5bd490199a47bcb48ba70d56a091970ebdcb28f8ba42854a84cbbdc097e27c07efeafde575506a21fbac6369bf5c4558e321d5968a629fa2a625776b20ab97eb35e37a51f27166a16bef6a93fd6a9286b9df84d972910bc6be0d4c7ebd5b6b8cf8d06e5bd73b5cce468ba883384a69b1dd60d3361ad030d7cf95c8d33ef0113fc361acaed82d9bbc60f0bb24302621adf3246313c05320e5b94ce4fe672865fafefe7eb9176e17fbbb24c7fb2a67fba41c7dff2f9274ff66f7cdfdffba7f070000ffff7f9eedca9b190000", - "a61b972dce26544398f591b4e2f715f3": "1f8b08000000000000ff548fc16ae3301086cfd653081d16693172f6bab0a7253d95b484400fa514c51d2ba296e48c4634c1f8dd8b1453da8b0edf7c9aff9fc9f4efc6029f67ae83f1a01f57b02c8c393f45242e59230812b96005638db08e4ef9a8fbe83b1b8f7918cc183b0b215ccb5b4cf1d34a8440fd09bbba65b87608e7ec1004538c0d39f4fc00895e77f02189ff5ea3f441f19935c8fffee3abafaba1186b6ccb01eba8a05f0f13b918d2bc28d6a0dec52d62440988c5c51c8ab8562b3bf6390440a9ea4c3f393a495bcdafaf85ef7390aa6248b5446190f24849deec7b081221e9ffd17b13de52cb37ea3bbf7323a496ff29f670bb6385cf9b97226ecfd98c52c0c5f869044d17122d1ff4ce7828d10bfb0c0000fffffb4a36cd9f010000", - "a78ec1efc51b3e38b6dadd6a4eb2258e": "1f8b08000000000000ffec91c16ed4301086ef798a91e9a17b88370e5024df40454ba5422a01ea1139c924eb36f644f678b7cbd32377bb880aad8a38f5d05be2f9e7f36f7d1b13ac69278cba0058351f2ebe68007172ba6aaede7ffbb458b6d60b78052b82d67a132c46980dafefc339a17338ee22a3933d0e264d7c4de1d6faf1dc06ec98c26eb11c29ef3c70b6146ee36c3a3c801cf569c22bc36bfde7cd3174cbd1f23ab5b223b73c396d939d7a1970a66833577ae37091a979179880d7f84013113aeab1286ea88dba28e1865a0dd7d6f7b48d05c04c34e517036cdc8533236a109b5857ea5db9b5beaed49928002207c338eef6496738d8bbfd37c048a0a4aa0ebff9e0c70643b4e435883c128f920a4ec92f8ec7957c2b7e0f578d52ea7373fefdf2a30641fe6fd430fc276b181ec3ea277ad5ffdaaa7eaad571d2be53649ce37ebd0446374f865183f99902968c91a3dcb9a938c874a66bbe1e51793f2b5525d5eb178fcfdce3a5f5e9ee88c7d426cfa95467b27af322f2998afc150000ffff5890c13743060000", - "a95877cfc2957859690620af727512eb": "1f8b08000000000000fff248cdc9c957482bcacf55a8ae56d0cb4bcc4dd50bc92cc949cdac4a55a8ade502040000ffff8a41cdb420000000", - "aca00e322e929c273fc368300d882a35": "1f8b08000000000000ff6c8d416ac3301045d79e530c02830cad7d812610ba6d43a027902559119134421aa58bd2bb9786d4b890d58779ffcfcb4a5f94b3a8a301f031536194d009e7f9dce651539c1ccd6d5954a0e99ecf3934e7539db6a9a3a9023af1d2ef9032d7f17483a78bc37e2f6000b8aa8287abf241cdc1e20eff56e3d17eae7739002c2d69f4c9b31cf00bba958d0763a428442c9e70f57c9ca9f051458bfdfe359a613b78f3956d920fbb77f8afff4e2db1fc35dc3e7dc34f000000ffff6041fe3b1f010000", - "ad3cd1c511f6e620beff7f7e5adbd878": "1f8b08000000000000ff6c8fcf6af33010c4ef7a8a2110fc7d87989e455268dab497b6b9e4dca0d81b4754968cb5ae0c46ef5e367fa094820eb33b332b7e87c1ba3a6ab550401342d40a0016a84d9facbf0ecefa61bcea647d1d525400f9af5bfaf165bbdfbc3fac5f374fab3b05b4c67a8d692a43c7b17c33d63f5b47392b559da8fa8c432b4d6f5ada33b59d334c1ac5cd8b258f5c2815bde9e229f01fd9d934c9cb19e5ce3438cb59ce0b4f23cfe417e31b72a1916a0c3d6b985829e0681d537fa5a4b172434d9741308a8f3a5451173f164c9175a196f315ec11ff0e3da5ff9830bf5722a5da583e0d87cb91903cf5028e0bf9baa7b4951d723e0704e397bf339db8cb39b29cfd0e0000ffffceb536f291010000", - "b6547a26d702f0e315541fcbf39aee8b": "1f8b08000000000000ffc45a4d73e33693bee35774cd257615a3dd37fb55959c1499b6592b537e2539131f21b2692143020a004aa37fbfd50df04bd24c52ef65e732924c361afdf1f4d30da445ad0e0ee1b5ddd5aa80a52a503b841fe108ff98fdbb10dbe714e68bc5eae5759ebf67f913bcae574febf90b641bfaf85bf6903ec05bfe90ae811edda6eb970dac1e61fb9c6d205d2cb3d74d0aaf6fbf2eb38558668b34dfa470f769feb44ed39734df7eba9fc13c7f87b74d9ac03a7d5daf1ede16db6c95c36a0d0fd966bbce7e7d0bdf1f7981b8bc58acf2cd36dbbe6dd30dacd345f69aa5f9f6870de99abe6ee7f922edb5e8179b09f18f193ca48f599e91cc8d109f16467bab76ad57467f8206a5763f0b21ef4169f07b84423a0453f167a59557b286fe1d6393c91f0a5322485d42698ab641ed25891500502a175ec1125a5da205bf570ee61f16911e4ce835b1bb5a1665b107d7ee1cfed9a2f6e3a57f26b9a0eea1d84bfd810ebce1575fadf9b0b20912e909750fb22c15a972f9d02f829e38edd122b8b6d8f7b2a42effcdd86fbe07c6aa0fa5a547a8ac6978cfd2e2e54e7767f07be9e120ad57455b4b3bdec00ce630363ffcd04b753f90a8207afc0aa80a94879374a41a96976aedce611ba357d804de615d016d489f8d46908557fa038cbe7afc07073bdccbba9a4d7473501ad0c6b3345dd42d39fa5bc639ed55b1ff19eec8f064583c484ba66a4cd9d6e8c05424c699ca9fe8ef638b290d85d17fb4ba608b9c94df4f4477b183ca82397168d53165e52496e04ec5e5b5f150a25547e9d511e164ec17d74574143b1b2782b1310fc8587040eb8c26d3a1f6ca47870e2abb4b3911414a78951eb57741181cf81b14b5548d8b3acb5d8de4b2a98bd97a1c4d1a0b744e5a559f41e9ca2afdd10515424b0962c1c99a134579370d265993a3591e6a519866a7349657162595e3c76edbf4d70bdf4f3d248bc2d852ea023b71ca893e9549e21a0b7550a8fdc894a4ce696fc06281ea3835dc6d4c1021d22852653d811d3713e2a7193cade7f996706e9d3d3d6f370240dec3a6ddfd8185ef82d2a36da2bfa780c3d032363ca1c0ee0c1f566aef185ca0df0748d046ff885f8bba75ea8809c5515d9e548909587396b53fff58594428cce16cd5c7def781e94d1066f1604dd91698c0c1524ee0adb84ce0c0a5a83e93d90fb53c0fbf043907b495b14d32720b47bce3a7c292172ea4fd5f667a12a4a98a9c934409c5fe4aa7845cee4c6b0b1c00de041bf3775266260076ffefb68f49d65981832a08bbcc4ad2b0915f30a13c4ac0615d2760aa8a82d0c4afaa3918ebc376fd1eed49390cd2bc95da550188fedacebd89afed18c45d1913b664af8bddb83d25813c1cea7367df90d532ae1c75bb5489f41fa79aaa12903ef847353762454507840a13e166b221de6207ff1d964e6414b275e8f8c1206cacaa37b023e58f6887052e3d4446b8f46810150c41b0de1b83909a7d345ec74528edead5a592b3202e37b097b6e45274400b0e4175088d25472607123d5edc8fc2927f755eead285aa206bbf37edc7fe3abc435cb3065170b4b13757c8edc0a1a738f07b5e5ce904b401e95c6b09731d57b583354715fd23754486f192acd1d8efa541c756eb4a09ff351ad8d860bf8809da635d63e15b59d34a07b4fe0c8c6a9cce83b943519c412aaf590773a158f0e88d5ac99daab9869a91192b63bbb2b8b3643e1ff734d62816df9d2497508cc63d34ac7cf5171a47217d16cf60ee4012d38821ec0de057b48572546cc82ef1554a9ece63c18b1893b68f8b8866c386229691c31aca015323587407a39d1a0ce0b0686d8ce8c19edfdd87462cb1ecf064068fc44abecae65063f8b14300654be69ce74b0c510e2cfed92a1ba8a3ac6b731a69eecda8a60c70d2336ae54942fffc0feec6be64c1f243fc4df276879519d3bdced43d130128efaf2289cb26ba00da1cd32165be6873aab1fc40d26a2f096baa4a15a45787385d218ee653fa2ad7066cf626b837e26a7c3548ea11b8cf4bee52c6256d26c47fcc609dfef32d5b73afb511623ed94623cf50ec8d6142302edd136cd657c5205631d2dc9cf42db6db430199e7671158902211cda156e806ce17ea31c5741ffa37caf32fb1325137e6ddf58aa1f1e2d60bab0a0ba20a81adc434363af6108c1517cc8d7f38494bc6561d0c862418ab95007e25bf077515ef8442bf678483883ebf83d7271b53be0e848518c4183492b1dcbf27ac414beda1ef508c0454ca6b5292404c8efbbc436b0fc6e12f11502f6cc55ca6c4bf63aa0135abb16aa56ce407bab1454a65b1f0f44bf7c91db050b2e6875449fd783db08eb8c1d85953fbdecb0cf5dd416d9ca7f0aa947761278a76e2bc0c8d0fd53cea912800dda8e2968a9914f7afd3d8eabae4f08f09d7a84f1ee74be85f82eba6152140db2fc34ed471aad3986455c64e33cc813c4a5573efc50a0e1ce5a284c610d194857d1aa083bd39510a9b9d970c29dc128145e98c26b183b0466a8d1642ffe8f75cdd404283a56a1b285ae74d13dabb96ea1ae9da77c5f835cc2266427cdea3bedc44238941f63bb9a096a4f208099ad679a25c172fdd6aba46c92f1907aff1a1171789556c2ab90a0e6f4c707d6a58c760486eb5d8982377a9b2f6c8e389116e6be315f19dc268327557796935a52f9ad8abb2c14a72d0abeadc4d4064e060dd9c8558cf75eb9c0855898eb0cbce891c59bd93cfa176baf16caaaf8bdc5df44bfb3d8ae982d74454fce70c16ab979774bdc8e6cbc9e04f888569087a3843bbb24146a45ea38b1632a82c0a3c7828d072604e4a73570604fd1a3b34d425c59d7509ec5aa718c728b5345ad7770db5fa8233f8bc5735863018a88420b2a2e314aa9205ad2363412b069ddb6180d813898b8e024e7b139bfd8bb9007b60242c74d03e2007819edb9bb62ea134e0ccd85f222251477a0b8ba4dbc1f80876135c8dc032993050ff6199b250405ccee1fe156503b08ab19cbb4f23ef8e4750f73d8da4b4e3882ab1229705502ab1d1aa3a0b3ca23d5fab0f779fb2f80cd5b7a964f921957601bb6be31cba4444ec8f55d87907778561261a2ad6a7253f486fdbc092193c43c54fa09627d7aa409845d0a6c60f2a3745a89f636a3f61a89d3264c891ca132bc57617bf86199a64b48c7da32c98e1836994735da98e3d78675931751d018ac6d18491141f68e9d0d27ec3b1e2d2b1a15735bb5a7dc4ceb323882e2e13a6a7d38635d84e180bc1b660b19681158707646803181d6bfce0e1db8df6408c79cd0c32aa36651864fcd9ca5a553cdd816fc40303e5cf42de93bce6e06b46e6085c703b3a697b27abc20c395a9b77d38ff14367f11d09de30ac5b532731e6683394a21d5b15df5c3be007a7830b1481acc5d6c39258baafd91642e387f12ab824f8e89b4690e7c8de14b54cec717d1eed0ca4ef39387e3dd0ca3321261dd814211a2e61e3d9c35fc0841860e235c6d7efa4f4052f528c399a57bb659f196495886ceab6e5e9ed467e41d74d127992db653297a80aad132352dcd9d69b4137f2027533d742d825a3b789f35d64e4c591c3451bc9dc6f066f033f8979947c2f304e5c09f6f28823b4ec341aa14c182b4cf8c8687f7f7353911c52d35d98d6faaeaf76239e7a11ef0719486c0fb58e69a36b6bffdd7d3193a197836af1f59910ff35837c059fe7ebf53cdfbe0b91febe485fb730df40fafbeb3add6c96efb049b7f0b85a6f9f21cb2f8e0393f181e2e43c7395c33c179fe61bc8369fe0d7f926db24f039db3eafdeb6dd7a59ba81d51a16abfc211c26c2ea918f32ff37cb1f1248b3ed73baee1481d55a642fafcb2c7d802c5f2cdf1eb2fc6910b9cc5eb2ed9ca4242ce27b4b6cb3ed324d44beca7fccf2c775963fc5cd10797a9ee7dbf9afd932dbbed39b8fd936a7d51f576b98c3eb7cbdcd166fcbf91a5edfd6afab4d1ae656621880a830aea9cf4344d6a18728919a67a5bba1853c10fc5a253d327132151087fa107cfcf98d1147c0aa3817a2e6ce2af78502c19942710076e548c4711453a738bfb845d761dc00ee5ae6cc50ab46f5d18c222ed217765311e4b03e68ad21fe174605c3890ed52955709340953d894107de50b922ce40524ae965d2c9e2224c397018daeb56c76623a4b509f32d6bdb4337b20ea0cff82cc47fcf88f92e96f3ec255d93af975974e6bf10db798cc0fe701c728a82fc5d2c567960d7abf50636cff3e5129ee7bfa51c79fd8a2166f27778c8d6e9629b40960f9f16d9439a6fe7cb446c5e5362ec09a4bfa72fafcbf9fa3d8921bb49fff996e65ba6f3f397f953ba81bb3ef46f44be58ae365b4ac1c76cbbb94fe079f539fd2d5dc362feb6491f609ec7b47ca7ac5daddf27f649e0f373cadbcdf2b0bf39694a5dc4623b7e6cb586ed6abd1dab92a74fcbec29e51b036b589194cfd926bd17f375b6a107b23c26e53b90caf122c2db26fd8b3b0abcd8732ad2dfa9add9a41d4084c3ba7078973ec073ba4ef9024502e96f690ed923cc1f7ecb68d39dbcd56693c540583dc2e66df1dcd97426c4ffcce029cdd3f57c2944564d0712379a5745e4ec286b55523cb61aa9bf2f706888c534f879ea393a72e0290e27350b8971dd4b89915e85ccc3462aceda4828bf7920c6c545f9bd693d54ade5f211a873e4b982d9093a6e0bbc89339a61a341c31d02b72ccd70358030ab699b489efb33e57377027629289886f4195966c6a61de1a4765e793efeee27cc3e92df497b11e7f677a3935c5158e3dc8f8155190b85690914c277e646b199b80fb43760e8c56146e8e7c55d18a4d12393839f0bfece98166a72df311bdb1ffbdcf70c3a9c584d26dc617f77ee3e09cce9ea8188cedde14040e94de4fd3fddedeea36f42fd2072297b054bfaca1247f6530e2a55633913625ed7b7d6ba59092e570957452aa96aea1e0543fc39c2bbee87348df4688971c4d0b4df1d0dc7cb3de804f7d46d776d8656a12f179330a251ca946112db20c8caa3851d16a6e150088ea80239d4460f6588582c57c8bfbbfb7edfc9a89c0fbd7381d2853b13d3fa7cddeb49a20014c54e8ca63d074bd9c8a030836773a2b63b992837eefe6e6928ba3ee5f23889127c5079dc038ed50adea59649e9164538adb74775a4dc4c8f68f97e85624edf281fcb3f8fe3263be6c30d9e735f8310f107a545df3dcaa351d4731644849c475d84a67002a6fdb80e036a502765747d861d8ac694a1d58ae3baca505b48bb0b439ad0930de2361e4fd29644bed0765744c22cd01bc1b720dc1e349ee0883634fb2364b118a7d0f7370237cca2f9bcdb08fa7f06b901be22c3b8e0f7525f6caed3662fa78a006feb7c79ed85f7d25d277c34ad2efb741edf91bb92cf2f8a1b2ff24ccf39f51114bb7584688fd8cd348740ebf4260f020129a7627f0b6b72643bb265970883822755d76287f0a18edc70521029fdd12ab7277b77efe9b6d975beecc275708b989c6ddf875dd527797654adc6378bdcf4f2c854adc1d031bbe2d97eb80c17ef14953cfde82e2624116fe48d5d8a490cc7c8c232b91a0a601d55ba7d622746f17775907f3f5c571bab3083f42b4f6aa5eb0eb9eab3e0030cce94583b1cfc7427ef39a7b88ac89d396232818a78914a9bd149770f2fd18cb74f94e321fe78b7b7af609df6180efa3b4513c22b3e372b64b0323a6f0e07acfb4b04f1889dfb9beee4956cde0507d58e5e5e0f8337619d0a444403aa87db2b2ef7618e68f5300e24eed045f286c7d1a6821c4ff06eec976eaa2d6e1b65fcee9be6166a138e954c05f306ad2a24c346985cb281c710c009033b9e4bcbc9fcf3f6e61a13cec935e3d019a5152162c30dd838388f12a4356455cedab0fe49b2f729eca29d39e3ff6889dc714d575a84c9986b6b2e2a03cb9889ff0b0000ffff1d99f9c4fa2c0000", - "cb9f04739ceb356f960fa53f13efd3f3": "1f8b08000000000000ff3c8d31ae833010447b9f624af8053eca4f957e036bb0426c6bbd5b20cb778f8210ede8bd3785e637ad8cd63025faf0f4b886de9df31eff45634e15210b564e2ca431ad68eda47b777a14bea9aa62b3a239c07bd0b2e0c826a86a21606361d7dd997dd21e1752866ea4c8974ec2b06af4dad9054b33865cb4e2efca8fb7368c60912ce793b09a24a4b8ffeadf000000ffffb2b3ff10d1000000", - "d935586ff49465c8710f2ec7f82d0567": "1f8b08000000000000ff2a484cce4e4c4f55b051b555c82f2829d60bcec82f2af14bcc4d5550b5e3e24acecf2b2e51084b2d2acecccf53b055502a33d033d03350e202040000ffff53ac591538000000", - "de502941dc9614468d4b6e3568718d20": "1f8b08000000000000ffbc59518f1bb7117edf5f31b897f880adecc4698a064581ebe5ec5e71498d5cd2a28f1439ab658f4b6e49ae64f5d717332457dc95e4380850bfb43991c3e13733df7cc385f37fef7ff8199e1e9e9f1f7e84f70f3f3cfc78f7041f7efecbd3e33d3c3dde3ffcf0fcd05cd844fffe813e6867e16d0b5ffd11fe365984afdebcf943d3c0bd1b8f5eeffa08afee6ff98ff0ce23c2b3ebe2417884776eb24a44ed6c0b8f566ee04f7d8ce3b7af5f77a1db38bf7bfde7061ef6e88fce22e80023fa41c7880aa203e9c62308ab40e910bdde4e11618f7e2ba21ee8478da101d741ec7500a325da80a09c9c06b4b185ed1441f6c2eeb4dd818e64deba08c2187740b5699a06e027dabacff763539870c210d0c37bb4e885810fd3d668094ff90c6da5f3a3f3226268684b443f0476553aab34dd3790b962f96d6d7b69b4c9465b08d3381a24df51c1f6c8eb854ad68449d084c0a68d0ebc088d3b6ce81e6f3670775afa1d76da262ff8d7bb005340053d7ad4b6851b462c1f7c031e3bf48110bfe86fc2a2b98c45cbb7a6a5377cb70f4fbf64ef8a2176f4e6a71ee1496fbdf0c7da8e00e9f6e851c1c1f917d8d17fd882d2e92a6de3628f1e622f2c080b77e368b4e4f403e741c0bd1bb69a36fe93cc88008a905a207967e1a6da77436923ec311d1c7b1161102fc880d2a584056d23fa4e4884d1bbbd56a89a1cbd7c93948a875ecbbe2421fb79d001612b2832ced61b364d8aa0dd8180306da51181f34940fabfb3db8b73c8b8421c508180c1296c5c0753603397dc5c6d4fd7879b0548e9fee9f6a3776a92699fe44564da7930dabea4539a1af2838efde200aa378451f8a8e564845f575e5ed7f0c68417fd7919b583083008c574214c702085319873f049db17544d66ac9b4daa71849befb5d5833070efbcc7305295da1d3cbbc94bbc81ee42760c286c20abcda53dbce5ccb916f0a334934a601c21a4b59262411b46e7676e38bf1965574b0c12b4e264d716747026f3a7f0d82cb2a5c23a95216756c92402a250f70987e55dea68dd3bf58b48b8edbf5146be0f1df8daf9fa8a33260bc7b4ad1151228a867c9da2363a1e29a9765e0c012c22e524d9f098528d369dc3d47937b0378b63a8c44ee0d3aee7638838e4a4d278197446e6cb0d3c7c9438320ed1c133ca784edb1f9e78f1bfdc0483a00ab07b3caea969b20a3d846420c05b8ecbd77397ca44c519eea6085b246fb7d425a9aac2a70efe6a03f77c266df9de29dde9538413d13f767024f7e8c7e4da785c1517670a458556fab43483185a104d27640a4ccdbedd646561518a20fd758ba963e944084bba6d9829a7809c37301b7d551334112b08bfe37e0da30894db871e39834f8ee800daeedd0baadb967eb1e98ecb109cee3964649a4c2edf1230206e736816fde24485ec6fb2fb822060e79c824e101161d7391f213ab283364c1e73a9ea546bb827ff57fd46394c54cf2031d1d2fe3592ed129f10b531e046646d91aa7a44df393f04da7ee845c43d7a2651bab18e01c6c98f2e20781c84b681eb55db5d3799169ce7eb6f4fd79f93aa4d046d497a65ecaec80dd7918d1a3910e9aa5b83940b8c1e0581b3f0ed06fe9e88823885745f564b9cb822a2d7c2a4322e9debaf28c8bb77da6098c9aa661b4220f7db1a65ca824a8dc1505b6f04f4c96ea74d8a196bcc0cddb233adca3a4cb2cf0e34ec40868f859eeb52f1c8de69b9cea21674b25df9a59ad9b12c008c1e7496b9761ad06b49980b2f068ce8439bca2c443fc938796c8c38ba29268d29a4c4101cad22021e84313008e95da09434dae29c666943c461342c565f45e4d4ebf080dcb7918a0b0cda5dec6f5bae00e560eb625f20ea1c09666d777321bdd77b161183b694f8d6452d3125130ad92faab18e210720d7412559589a52ab8b594ba655f312fa23a539292eea810033e5aef4dfa6e4fa9d946e18a9dfac7d602f978491cb211f7e1a25c8569926d8f2d79b65ef0897fbc1b25b5dcf9b942d4d142fc4786e87448d2dd10d75813d9a23858292c523cd3f322ed83abbdfac3545814d3a1b05fb91696a257ead024f5412b0419a91103dd527f55f85db69c7631397c1aa47e8d464587b299742eebae6b7e7cab91a4ab483ffd76c59a9cddf902f206fe1dd053dc53e2b1d46238e814da7193a8113404d1409ee361f514eb58c42f660bd65165e3308834b06628f018be1965aee018de1d69b1a3c5a89a0b4a794cbba69a2c997493da33756e2e9dae5573757b7f09d83aab3ac3283febdb9cd7a86177c4aa057bd6b2e243abc583a9b453fad72297d04779462204c3a722feb9c4f56eab2e578a59789b646a8ecf698a62104d6ae340dad6570c9a3224eaac9a7583957ed14843c73d55b571347aaee626510d692001d51a6d595aafc661d444a1b592465b17029009b39685fdec2cf545927c8422fa8b84c4ebd01652fac0e035b2f936119054f112b7df7ee64e9b45507ce1d06fe154937129222829f2c443dcc662e2a5c10c6a350345a6020d2c9231145ed0baab7619c22fa39f63c26a4a8bfdadec2a1526004ff88de1cafc5af18597950a4c63c73ff8e19266aba663516f3b0ba7c654b50e32d7c48a2021e6d88c2a421101e2da56d35f2386b8e85910f6e32eaf4b4c0ec46aaf03f93f6496a64a192685d9f6c2dc79639519afc6ac86291f0e1d31235007e8c042e5ff5cc5eaa4d8b24541810073add83ed245ec3cb05514e5e9266fdf8500a2e3f3fa492cbf4453b3faff02ecdc9f0ea910b92e0e4179e34137eaddea4cabf160c18a6104998a54652fad627498d80b84a540900859b32d32dbcf93229353eb4c474ed1e59a83dcc2ae0d710040f2c35475c26875b4ad9df57e2681eb91702693442e2cc1379e4d198f955782cef4cf52347534a2ad01db7f97f99c083b63b73325814548a789a33f36fcda5c34858558067699d7f58498666d161ea1141e497b08a012f28bea64c0ab9527f51622f25c9d911175449100356f0919de5a3620b939d0d2503f6b8c4a90a4a9b5a3f5d14d5b5fe7ba6a43ea1f62ede2375d67994252ba7e7c64b2fa36da68fd18854fe871e3d8fa09d4ebd9f012ce8d18aead665885ce0c5ce7fb3811f71af43f5a0f2d99f03e679f5daa78f94fdb427f4a4b9f998fc7c66f1502829349ffd01223d81e9210ddf7ac00d3c53365a3c94678f901ad91621e8411be1a968c2a8bd8e85c14b7fcc3b524319c4b151baeb9037288c421b7e0452ca6308ecf0e8ddd620e5017383449fdf9f1e48d21786d501767a8f54aa4a079297930e3d85a4acb0d3b045cf145797ba085c241e25ea3da9fd38d355a95f90e869bac926aa86fcd918de9032b747a0c1787e89be69f86103f9dd8be41e39d28b7da2d7ccbfae3b552c2c3eff34d5e71fd45c5aec0f65798a7fdd817c7ad058b9d09c56e6f7f96b7955808325704d0ddce9198a11a4f97489feaff8d2333fbbf5ce9106b4c7eb9fceae1881f478f5d937cc8f9ae797fc74768cde7d3c821494c0522b6c0e7dea0ddd14278f73c57dfe27bfd00b6338398e6d0e289df14548979110a288fcf18e832a258e51d06c95437c2a8a862609c1fc28a6d83bafff9b58823a2ddd2cba82309f5376e619af99bfd6fc2f0000ffff1b70e417e31d0000", - "df2571aaa5053efc9adf6f1c937897f0": "1f8b08000000000000ff3cce416aec301084e17d1d45302d1eef0ab9c11cc0c8ea8edc63496dd4b227d9e4ec6142c8ae161fd41fa85a01bddd97fbb42160cb98edc0b117042ad210e85046b64b462af23788d34c584fad1cc30bad1fa7cb40a0662cffaeff20bf3a8e61ef5a0594adbb555936f569e313e4c9fd9653de2406d048bb2c33f9ee5ff869a29a77b8d511418fedf92bf1d89ef4baf373adda24a01bcbd28ccf2a1ec1ea33a2489791a670045dd2d946c4aa3d0614edb7553b485952c477000000ffff64521561fe000000", - "e2a24d2b173d9a2c5c7d11e6a6f6630d": "1f8b08000000000000ff8c59db6e233d72bee753140658ac0df4383bfffe392d92001a4b9e694423792579bcbea4baab25c614a9906c6994a70faac83e49ed6c7c65f5a158c7afbeaa86e1df668f307141f9a00a98ab028d47f8ede14f42f41e7ab4c78b53bb7d80bbe21efeed0fff0ef618fcc31b4a077ff88feec2a40e7b4b97d2dbb313ba8b3508cac311dd41858025040b853d5e409a124ae58353db3a209cd06d655007baa9d0a7f36d0561af3ce8a45a698bfa802664b0ad03147b6976caec40053ac3d800526b7bc6f241886787f2b0d528c4a62f017d905badfc1e3d843d424077f0509b121d9cf7aad883849d3aa181ca2182b755384b87e25916ef7287709017d862d4b2cce0604b55f17f9d2d6546c6fd8375e0b077f54190b795096858ddb0978155e8fcfbdd6ad2e320950952190fde1e10640a9028ac09ce6ab02774fc668927d4f6481e89ae92011a45cf7ba5117c505ac33be291fc14f69d21f22495965b8d203dd8231af0b67605726006b63f08f1666b900e41eab3bc5c45f320df494727cd0e49130fe7bdd5fa02b60e5e95d80451b441540e8ba02f7056613fee015bb56148fa3e00e4151b1023769b191cffa8190bad6aada1f618dd72b1351c9d3d5aba60052bcd32b03921e367fcded6ba0472b52c3e880f79c823be0b09a5aa2a74e4ffa80879b9e78b0721a65829a382b2c6c7baf8742def131c509a988eca94eaa4ca5aea3b7f0fd681753b69d4ff481270e7ef598291072c41197ea368a5191b548150d9981c688272ad750fede12626a46dcf95e60247e9c2257a6a2f3d9b9fd2160a4b317460c31e1d0b39c8804e494dd11f3850199045615d294d811f87f78fb1bc8fce1658d60e7da3dc9bad3fb1773f5d6c3dd40f9db786320bce1c20addeb1c1928cdfee4a2d2375b9322f7dfd9a53d2cfbedb0bab3516e4634a8a4a69f4fd82862d0b1243348cc66411c9d0a9930cea84beadc49ed08407b66211614f59c8a73cc06498e70c3085355e79ae6954e47656721da429a52b59c64f745e59c3a64af89160a8b9dc983a6d6d68ac3d3a7b5225a769c4e16111b0e7e47b045596218b02bd570414c1522c08d151fbe8e52609a5c758b4853d1c296036a64a3f7d3312c059e4fbd840a1eebd3678e5c60eebe009b19f1915f62abcd84bb78b25d0bea2cc2e795df9be999d277c7d3c5a1752e5f49e6283bbbce72221200a505a8c0d8714e9d57e855d3637f16a82f2091c5664fcb06c4055d4c0a8ec48e016d1c42a6b5b8b757c97eeb457c11a7d21f73320e3afa35685225075f8df35fa80314d62e2de246da3e275def46ba2abea563fd680bb6e6a722cc5d7c53e5df57046876cc7984a37eaf0fb4395964eed9491baa1239d4acadf7215e9bb4063c9909382ddd54b63dc0dde2b032a78286ac7087e6a1e73202342a9d0f4fbd6eddb0b93a667741a9e6c6d4aced3a60eaa3ad4ae059a3537d44f9457879e63539f255ccd5a4613c5c45b9d6b0b6b2ab5ab5dbc1b71a9c1f71b603f1c95c6f2e6b822dd80ed25603cd46eff0b8b9034d82a235dc250329daa903187e538f4b50e9cdace92580ab42a08fc9d349e9e89caa582e7ab5a869ebfa31b58dc8310e2995ab4674f93292f3e528e988a457cf35585bdad43af88ad11e2eecb3d404345061c24b6f9919093e4c2a10cf190daa3b8cef9e8516e32b5637e704ea73ba4d38b885d112ee8b8bd0c82c026518e2eff58851128ee991c0f5b75bcb0efa72be585b8fb2d194c5938fd902c8f383a5d12e335d083386ad9e602072c557d18b55ca416b4a32cf49422ec2fb8c2e42b0f311c973561800c28a4d68d96b629f06be6e23944d27b5b2849812d952fb4540774fe0160c25e777cd5610c0a43cfb537c859dcc62e1c1f650a5d9708523425d2f750af8ceefedcf3b63c1ef5855db3ad7750a95fe833a02e21b74aab7069002fb6ffd8230ebd142635ca3ecbe6f219c5e23886b585d632f43351f748e079e230d4311dfbf73659b2e43c768938a7977c1d2b3d759c6b6ca5dc9c5e65e26d795c3104e953a20971f7fb787e729cae05752fc2dd20a5c4c7294536318db4aecd4d096371bc29ebfb917c2c344aa72f2de8c2de9e09e4238bf7a28dd1ad77631629b38ba3272596560715f1a783718a1f258db1e6b36f845428a92df80cf01716350da0f42392d45a3749348a30328046e9032c17b3261295a5295799dd5f22f6dfc97b8863d81800f57230a5c175068a76d41eb33ccec663e99381b7ed183b4a8e39319a02e4ac18d6486a9b63cc36f5b5bbed3d001a5fbb44f394f141eaaec38ce75ac3cfd2a081278a361d557b748d0cea6a34a5d7c6a4e9f8c6fc07c8231b9365a912891df3f1a1f644dd2465318d674957df0d882ca54d307ee60397379617f710f7190deba6e9c761813c650ce9fb8d42c1a6512d65c56d6ff83b8912893a0be10c484aa97b18cd05eaffe9097a44b683393b2236ebc847d20d3ea47288fad21be2d2d446e5d05f9e8ceb5bfb266c5e1e6202764c3cae09f8f488e529f9d96bedeea551865f4ebe8dd49659ab72d85bd4fc1f3e1cce64dc122aee1e67ebde7d1c0f09b028fe2a644c29a93f4407c40c6bbdcf552143eb421a2a22e77176afb60c3adb3e3b4adceba979aedb82ddc07b8b9d4fb65da38c500f7b5b53be45e0ce1742dcfde3780b1860f487e734224527728c47340842545663402e6057171144ac611c0f56ec7010a88fea0b604dbc61202415b03849ad4a48010fead08da87dcad66ea3fc50978cde94e622f8cdb882bb24c25a48e72e0c397588c4a52f9152a2b00712c72af0364ab056c91f60f07c637889074e360705d20c5ed58e3beb40599157cdfe8b05451b87a21a0103624ad1e164542e5c444993a6ac023a9696f49567d940735c60f5a4d29dd69eb047d3e7cd957515aa10078ee463ee1dbe6d39dd7e8fe8d93f8d67daedf6830a68c811fe7f69c6e995d692ebb4b9f93dfe74e88f914889db041ba3fc93ddcee14e86d463e6cabc37609588941077ffdc279ce9051c90adbb91fd4fc7e5dd08eb8974895f3a462191575f8d291ddd6c0e268923143e062b2d56e470d5d1cca2a25bd25e51383f9cd522340ed7252c2412680a8035bc434ecca0afdc40d20393e6d15db018e07d9de6cb6b201c78740cee84f40df09423ea5046fecbfdf838aa9579ef04d2e9d7b18b602a629cb847f0760c0fdbc4effbf31968727e7cae2d157b8ecbbf60c5b656ba04a69b9fa526a610677abadd0cfdcd7683bd450e6a3918b3cd066107fb910fd3667c4eec254ffb60bb27c35f3c5acbb4fde7ef20ae92055e6dc3a876f280070f1b6edd0e6161033c76d3cfb37421ee1aaf4326c4ddbfdec32b77dcbbbf43d813f38ebbfcc2a963f0f7d1150774c449f057c088accca16a7ffbbd20d64696b65a078ffa445cbe90b547d10f62b0d4f047d6b400b9e9514bee0a9131c8b84613bdb1ef285db899c654f0a8ab34fda5d5db70ea1bff60427efe86069dd4f04c818b392feebefce91e60622e647136a0ebd9f09bdd781d8dac5794879d3da133cd02706491f7005f2f91cf65718cbe24e02c7b6bdcdbaf35b228f0188686c194c3223afd2fd94012deac377b40d793287abde7cb977b6ef9e3d346bb1b1df0bc2edea21d1388f36d2ffc5d8fead42670978624672d573078426ae41abd6f88682908207a93d0b82edcc414faeef34b7a3f7e9bb395b8eeab5f7ebb07d80c3fa6a5aadd3969621f60413cd9a5751bb5ede0241110f79e098feea40a62b5ee3d8b3768c661cf6bbbb34daa8c6ca2efbefcf95a8104477160a0591a7f15baf6ea8419d5872ecfaac44c107bfe6cabcfa93b1d65e8bec461f36d3283bd3c45ba9dc5a4b63492d16d8f5a93ea5a67a00efc0da0dde69c1589e01d270e16aed78480f95e3a9ad7558d19cce53f58c0a7c184435da0f7d2297d11ca544e995db7286ffb6a6270c4ae54a0146e6d0d2af623d1211ecd86ce7aff99d5616e676bc25bfe7d0f72274950efc39fd41a7744065a1ed7184bf8138ff40d74b3bcf62be225a9d22a1fbfcf13dbfb60671f6cfad22ab5e60eae0cd11ecb2d56949102c9c4913b0309472aa2749c32bfdf33d748fb41caae57feee1a2e7f119bef33789e3cfee7e4db0cf2353caf963ff3e96c0a5fdf806e3d2e9fdf56f9b7ef1bf8be9c4f672b982ca6f0b85c6c56f9d797cd72b5864f93b5c8d77fe41baff9e6fbf2650393c51bccfef6bc9aadd7b05c41fee3799ecfa6f03a59ad268b4d3e5b3fb0f0745d74d761f9043f66abc7ef93c566f2359fe79bb70c9ef2cd82243d2d573081e7c96a933fbecc272b787e593d2fd7b30c962bb1582e3ee78ba755bef836fb315b6c60b29ac1345f3fce27f98fd914364b3e72f6b70ddd7c9ead7ee49b4db4f36df9b282f9f2713217f3c9eb03bc2ce674dc6af6d7977c151f994f5e33582c6fddb15cf5bd01aff97c2ebece609e4fbece6751e3c51b4cf3d5ec719341bee8fe7bcca7b3c56632cf928cf5ecaf2fb3c5269fccc574f263f26db686c92a5fe78b6f902f58caebe40dc8bbcb2736e5653d6bfe4d01cc60f673b680fc494ca63ff3f56cdade5faed77974275d5abf3c7e8778c883f8df000000ffff2fe92a4de6220000", - "e50dc3a6916a03ffab97ebfe2607353c": "1f8b08000000000000ff8c90cd6aeb301085f7798a734d16c942ce85eeb44a4321ed260dd4d065519d4111fe19a119bb35f4e14b8221a6b850ed0edff9c4cc885214bb000cd44965b1e782b9defe5f00406863a7577c793d2509dc5a2c579edfc6b49eb83b27e7eddd8ca92e79d262886411da3ab434022953886af13566a0a94e21c14464cbd5fe79f7745867bfb0e37df1b8dec4cacf171a3e75351d9d9e273fc899a3c208e8537dcdef37b3c7bf95e778a9cfdaa720b176c3c1356491bd9076117bc62ba74aa22b29bbdee1e73e9ee1496114a647bec9f3fc06944461922b69423e3855a1f50f2151a99c06fb87610a12956cf11d0000ffff918e55a0cb010000", - "e77af356b711dd222651f373f9039345": "1f8b08000000000000ff2a484cce4e4c4f55c84dcccce3e2cacc2dc82f2a5150b251b555c82f2829d60bc8294dcfcc0bc84e5750b5d34fce4d51e2e24a2bcd4b062bd7d054a8e6e24cce4dd173ad484d2e2d49d5d0e4aae502040000ffff0bec043151000000", - "e8f0b5c005cfe5f1f920445b2c355f33": "1f8b08000000000000ff9492d16edb361486eff9143f0a146806c1bb5fb701b4746c1d401635928aeb4bc5626a02b61848748abefd403641dcadd8d02b1114cf39dfff916578fa3afbcfa7880fc73bfcfefe0f84a7b8ac0e6e98f1fecfe26d475ee329a43d21cf67e49205b35bdcfcecc69510da8d7e89b37fb8461f260cd388ebe2e0272ce13a1f5dde79f0d3307fc563982f4b812f3e9e10e6fc0dd7282e61f48ffe38a4060586d9e1c9cd171fa31bf13487673fba11f13444c493c363389fc3173f7dc6314ca34f454b2ebab8f89b10bfe07ba205e1f115e5184687cb7589985d1cfc94fb0d0fe139fd7af53185e88fae403cf9450067bfc4d4e276d834fe8364f4cbf13cf88b9b573f22f0d3ad815782a7398cd7a3fb2f08818cf1b31078893686e3f5e2a698cd0aa49a5fc38c104f6ec665886ef6c37979739c2f2617dee0af84b0351b18b5b17ba9096cd06975cf1555581f606b42a9ba83e66d6d51aba6226d20db0aa56aade6756f953678270dd8bc13e9876c0fa04f9d2663a03478d7354c15f6526bd95a265380dbb2e92b6eb705d6bd45ab2c1adeb1a50a561569a8f87719d4063bd2652d5b2bd7dcb03d64900ddb36cdda280d894e6acb65df488daed79d3204a949546cca46f28eaa15b845ab40f7d45a985a36cd0f5326f6ef32ae090dcb7543224f6a0fa8585369539cb755c915b55636054c4725a7057da25dd7487d285e7a1afaaba7d6b26c442577724b061ffe4749a755d96bda2566b581e9d7c6b2ed2d61ab5495440b43fa9e4b321fd128936df5860a54d2ca3cb8d36ac3d67c4ceb756f384be3d692d67d6759b577a8d59eee498b52f686aa6c57b539aaad49e9436a9a1c64f905f635d99a74129a4dc9a4c058cda5bd3926948655dade64444bdb86b7d496946854eab2674377909a4d3ac0dfc6eee501aacf91d31df586445edebcd822df24780359dd73c27e39dc2963f8e59d6465658d6fba57e2ef000000ffff9e077c2221050000", - "ec188e67853d7839d2d751b9f778dc84": "1f8b08000000000000ff7c8f414bfb401047cf994ff123d03fc99f9a20de8a15a478f5a078120fdbdd4db2b4bb136627f650fadd25d58bd07a1c78f3decc68eccef41e363aa2104716454545d9071da66d6339b679ec6eef5acb5b3125d5446d8bfbc51a3c6a6e5e07167d36d163f1b0890ee247f1d927cdd0c1633b759dd9f3cd451e966334c9d1a791ebc635fe9dd3cde69b3e52f196fd0a40f9a7bd5c52719e572895799fd1b1e0c0b20ba9c721e870b939efbd4ce969856e4ab6b2d1e1ffaf039630d267bc7f649590fa1a5e8405472a0af13a49420a7b2a4e4b3a11cd0e8414b4aa67429875135df3e8dc8fadbaf6784d27fa0a0000ffffb89c31799d010000", - }) - if err != nil { - panic(err) - } - g.DefaultResolver = hgr - - func() { - b := packr.New("./generate/templates", "./generate/templates") - b.SetResolver("cmd/generate.go.plush", packr.Pointer{ForwardBox: gk, ForwardPath: "0652906dbbddf180108ddfa0b73f1047"}) - }() - - func() { - b := packr.New("buffalo:genny:plugin", "../plugin/templates") - b.SetResolver("-short-/listen.go.plush", packr.Pointer{ForwardBox: gk, ForwardPath: "4d28e1deaaf258f4346bd9491c376098"}) - b.SetResolver("-short-/version.go.plush", packr.Pointer{ForwardBox: gk, ForwardPath: "d935586ff49465c8710f2ec7f82d0567"}) - b.SetResolver("README.md.plush", packr.Pointer{ForwardBox: gk, ForwardPath: "89ae21d51779b8540143aebf69368c43"}) - b.SetResolver("cmd/-short-.go.plush", packr.Pointer{ForwardBox: gk, ForwardPath: "ec188e67853d7839d2d751b9f778dc84"}) - b.SetResolver("cmd/available.go.plush", packr.Pointer{ForwardBox: gk, ForwardPath: "aca00e322e929c273fc368300d882a35"}) - b.SetResolver("cmd/root.go.plush", packr.Pointer{ForwardBox: gk, ForwardPath: "37e6217420675913821fc175e7dd25cb"}) - b.SetResolver("cmd/version.go.plush", packr.Pointer{ForwardBox: gk, ForwardPath: "1bb7ffbc87c10d18914f6951d39775b5"}) - b.SetResolver("main.go.plush", packr.Pointer{ForwardBox: gk, ForwardPath: "e77af356b711dd222651f373f9039345"}) - }() - - func() { - b := packr.New("github.com/gobuffalo/genny/genny/new", "../new/templates") - b.SetResolver("-name-/-name-.go.tmpl", packr.Pointer{ForwardBox: gk, ForwardPath: "920fdc8a8285bc442cfb791bcafe45b6"}) - b.SetResolver("-name-/-name-_test.go.tmpl", packr.Pointer{ForwardBox: gk, ForwardPath: "a61b972dce26544398f591b4e2f715f3"}) - b.SetResolver("-name-/options.go.tmpl", packr.Pointer{ForwardBox: gk, ForwardPath: "cb9f04739ceb356f960fa53f13efd3f3"}) - b.SetResolver("-name-/options_test.go.tmpl", packr.Pointer{ForwardBox: gk, ForwardPath: "793124cfbcf9ae17892b017c666be8f1"}) - b.SetResolver("-name-/templates/example.txt.tmpl", packr.Pointer{ForwardBox: gk, ForwardPath: "a95877cfc2957859690620af727512eb"}) - }() - - func() { - b := packr.New("github.com/gobuffalo/licenser/genny/licenser/templates", "../licenser/templates") - b.SetResolver("agpl", packr.Pointer{ForwardBox: gk, ForwardPath: "38ff45a61f79481d5d34d8d9f9676c34"}) - b.SetResolver("apache", packr.Pointer{ForwardBox: gk, ForwardPath: "0e36ab770b1ec79ef2649ec1552c94dc"}) - b.SetResolver("artistic", packr.Pointer{ForwardBox: gk, ForwardPath: "e2a24d2b173d9a2c5c7d11e6a6f6630d"}) - b.SetResolver("bsd", packr.Pointer{ForwardBox: gk, ForwardPath: "e8f0b5c005cfe5f1f920445b2c355f33"}) - b.SetResolver("bsd-3-clause", packr.Pointer{ForwardBox: gk, ForwardPath: "288df37e7ab95dfbcb9550200ab31180"}) - b.SetResolver("cc0", packr.Pointer{ForwardBox: gk, ForwardPath: "989a41b885f6a3ce4ccf49322f5ed129"}) - b.SetResolver("eclipse", packr.Pointer{ForwardBox: gk, ForwardPath: "b6547a26d702f0e315541fcbf39aee8b"}) - b.SetResolver("gpl-v2", packr.Pointer{ForwardBox: gk, ForwardPath: "9878d11093909d531176b7e6da001598"}) - b.SetResolver("gpl-v3", packr.Pointer{ForwardBox: gk, ForwardPath: "49a20c4e431767a29116905e29fec0d9"}) - b.SetResolver("isc", packr.Pointer{ForwardBox: gk, ForwardPath: "2669267df0f493b450bfe1ef118aeef9"}) - b.SetResolver("lgpl-v2.1", packr.Pointer{ForwardBox: gk, ForwardPath: "87f5b37ce1e0e735c36a5ff25df5e896"}) - b.SetResolver("lgpl-v3", packr.Pointer{ForwardBox: gk, ForwardPath: "de502941dc9614468d4b6e3568718d20"}) - b.SetResolver("mit", packr.Pointer{ForwardBox: gk, ForwardPath: "958ad94ad4ec3f13898043ec59181ee4"}) - b.SetResolver("mozilla", packr.Pointer{ForwardBox: gk, ForwardPath: "1614cda23f5488b474a44a2db5ecebac"}) - b.SetResolver("no-license", packr.Pointer{ForwardBox: gk, ForwardPath: "67f2f65efc608bfd2ec3bb8485e627b4"}) - b.SetResolver("unlicense", packr.Pointer{ForwardBox: gk, ForwardPath: "11ccb6bedd3e318a1604672830b46c94"}) - }() - - func() { - b := packr.New("github.com/gobuffalo/release/genny/azure/templates", "../azure/templates") - b.SetResolver("azure-pipelines.yml.plush", packr.Pointer{ForwardBox: gk, ForwardPath: "a78ec1efc51b3e38b6dadd6a4eb2258e"}) - b.SetResolver("azure-tests.yml.plush", packr.Pointer{ForwardBox: gk, ForwardPath: "e50dc3a6916a03ffab97ebfe2607353c"}) - }() - - func() { - b := packr.New("github.com/gobuffalo/release/genny/makefile/templates", "../makefile/templates") - b.SetResolver("Makefile.plush", packr.Pointer{ForwardBox: gk, ForwardPath: "22ff05a4b44a03ae13723f6a9efc10e2"}) - }() - - func() { - b := packr.New("release:genny/git", "../git/templates") - b.SetResolver("-dot-gitignore.plush", packr.Pointer{ForwardBox: gk, ForwardPath: "df2571aaa5053efc9adf6f1c937897f0"}) - }() - - func() { - b := packr.New("release:genny:goreleaser", "../goreleaser/templates") - b.SetResolver("-dot-goreleaser.yml.plush.tmpl", packr.Pointer{ForwardBox: gk, ForwardPath: "ad3cd1c511f6e620beff7f7e5adbd878"}) - }() - - return nil -}() diff --git a/plugins/plugdeps/plugdeps_test.go b/plugins/plugdeps/plugdeps_test.go index e4f777c03..f037c9267 100644 --- a/plugins/plugdeps/plugdeps_test.go +++ b/plugins/plugdeps/plugdeps_test.go @@ -1,11 +1,11 @@ package plugdeps import ( + "errors" "os" "path/filepath" "testing" - "github.com/gobuffalo/buffalo/internal/takeon/github.com/markbates/errx" "github.com/gobuffalo/meta" "github.com/stretchr/testify/require" ) @@ -37,7 +37,7 @@ func Test_List_Off(t *testing.T) { app := meta.App{} plugs, err := List(app) r.Error(err) - r.Equal(errx.Unwrap(err), ErrMissingConfig) + r.True(errors.Is(err, ErrMissingConfig)) r.Len(plugs.List(), 0) } diff --git a/plugins/plugins.go b/plugins/plugins.go index 724475d4c..f69401534 100644 --- a/plugins/plugins.go +++ b/plugins/plugins.go @@ -4,13 +4,13 @@ import ( "bytes" "context" "encoding/json" + "errors" "os" "os/exec" "path/filepath" "strings" "time" - "github.com/gobuffalo/buffalo/internal/takeon/github.com/markbates/errx" "github.com/gobuffalo/buffalo/plugins/plugdeps" "github.com/gobuffalo/envy" "github.com/gobuffalo/meta" @@ -206,7 +206,7 @@ func listPlugDeps(app meta.App) (List, error) { } bin, err := LookPath(bin) if err != nil { - if errx.Unwrap(err) != ErrPlugMissing { + if !errors.Is(err, ErrPlugMissing) { return list, err } continue diff --git a/render/auto.go b/render/auto.go index 0532d6788..51f1c2e59 100644 --- a/render/auto.go +++ b/render/auto.go @@ -2,6 +2,7 @@ package render import ( "context" + "errors" "fmt" "io" "net/http" @@ -110,7 +111,8 @@ func (ir htmlAutoRenderer) Render(w io.Writer, data Data) error { switch data["method"] { case "PUT", "POST", "DELETE": if err := ir.redirect(pname, w, data); err != nil { - if er, ok := err.(ErrRedirect); ok && er.Status >= http.StatusMultipleChoices && er.Status < http.StatusBadRequest { + var er ErrRedirect + if errors.As(err, &er) && er.Status >= http.StatusMultipleChoices && er.Status < http.StatusBadRequest { return err } diff --git a/render/auto_test.go b/render/auto_test.go index d1c2b6d50..651c8f609 100644 --- a/render/auto_test.go +++ b/render/auto_test.go @@ -8,7 +8,7 @@ import ( "github.com/gobuffalo/buffalo" "github.com/gobuffalo/buffalo/render" "github.com/gobuffalo/httptest" - "github.com/gobuffalo/packd" + "github.com/psanford/memfs" "github.com/stretchr/testify/require" ) @@ -71,13 +71,12 @@ func Test_Auto_XML(t *testing.T) { func Test_Auto_HTML_List(t *testing.T) { r := require.New(t) - box := packd.NewMemoryBox() - err := box.AddString("cars/index.html", "INDEX: <%= len(cars) %>") - r.NoError(err) + rootFS := memfs.New() + r.NoError(rootFS.MkdirAll("cars", 0755)) + r.NoError(rootFS.WriteFile("cars/index.html", []byte("INDEX: <%= len(cars) %>"), 0644)) - re := render.New(render.Options{ - TemplatesBox: box, - }) + re := render.NewEngine() + re.TemplatesFS = rootFS app := buffalo.New(buffalo.Options{}) app.GET("/cars", func(c buffalo.Context) error { @@ -102,12 +101,12 @@ func Test_Auto_HTML_List_Plural(t *testing.T) { type People []Person - box := packd.NewMemoryBox() - err := box.AddString("people/index.html", "INDEX: <%= len(people) %>") - r.NoError(err) + rootFS := memfs.New() + r.NoError(rootFS.MkdirAll("people", 0755)) + r.NoError(rootFS.WriteFile("people/index.html", []byte("INDEX: <%= len(people) %>"), 0644)) re := render.New(render.Options{ - TemplatesBox: box, + TemplatesFS: rootFS, }) app := buffalo.New(buffalo.Options{}) @@ -127,12 +126,12 @@ func Test_Auto_HTML_List_Plural(t *testing.T) { func Test_Auto_HTML_Show(t *testing.T) { r := require.New(t) - box := packd.NewMemoryBox() - err := box.AddString("cars/show.html", "Show: <%= car.Name %>") - r.NoError(err) + rootFS := memfs.New() + r.NoError(rootFS.MkdirAll("cars", 0755)) + r.NoError(rootFS.WriteFile("cars/show.html", []byte("Show: <%= car.Name %>"), 0644)) re := render.New(render.Options{ - TemplatesBox: box, + TemplatesFS: rootFS, }) app := buffalo.New(buffalo.Options{}) @@ -143,18 +142,17 @@ func Test_Auto_HTML_Show(t *testing.T) { w := httptest.New(app) res := w.HTML("/cars/1").Get() r.Contains(res.Body.String(), "Show: Honda") - r.NoError(err) } func Test_Auto_HTML_New(t *testing.T) { r := require.New(t) - box := packd.NewMemoryBox() - err := box.AddString("cars/new.html", "New: <%= car.Name %>") - r.NoError(err) + rootFS := memfs.New() + r.NoError(rootFS.MkdirAll("cars", 0755)) + r.NoError(rootFS.WriteFile("cars/new.html", []byte("New: <%= car.Name %>"), 0644)) re := render.New(render.Options{ - TemplatesBox: box, + TemplatesFS: rootFS, }) app := buffalo.New(buffalo.Options{}) @@ -170,12 +168,12 @@ func Test_Auto_HTML_New(t *testing.T) { func Test_Auto_HTML_Create(t *testing.T) { r := require.New(t) - box := packd.NewMemoryBox() - err := box.AddString("cars/new.html", "New: <%= car.Name %>") - r.NoError(err) + rootFS := memfs.New() + r.NoError(rootFS.MkdirAll("cars", 0755)) + r.NoError(rootFS.WriteFile("cars/new.html", []byte("New: <%= car.Name %>"), 0644)) re := render.New(render.Options{ - TemplatesBox: box, + TemplatesFS: rootFS, }) app := buffalo.New(buffalo.Options{}) @@ -208,12 +206,12 @@ func Test_Auto_HTML_Create_Redirect(t *testing.T) { func Test_Auto_HTML_Create_Redirect_Error(t *testing.T) { r := require.New(t) - box := packd.NewMemoryBox() - err := box.AddString("cars/new.html", "Create: <%= car.Name %>") - r.NoError(err) + rootFS := memfs.New() + r.NoError(rootFS.MkdirAll("cars", 0755)) + r.NoError(rootFS.WriteFile("cars/new.html", []byte("Create: <%= car.Name %>"), 0644)) re := render.New(render.Options{ - TemplatesBox: box, + TemplatesFS: rootFS, }) app := buffalo.New(buffalo.Options{}) @@ -269,12 +267,12 @@ func Test_Auto_HTML_Destroy_Nested_Redirect(t *testing.T) { func Test_Auto_HTML_Edit(t *testing.T) { r := require.New(t) - box := packd.NewMemoryBox() - err := box.AddString("cars/edit.html", "Edit: <%= car.Name %>") - r.NoError(err) + rootFS := memfs.New() + r.NoError(rootFS.MkdirAll("cars", 0755)) + r.NoError(rootFS.WriteFile("cars/edit.html", []byte("Edit: <%= car.Name %>"), 0644)) re := render.New(render.Options{ - TemplatesBox: box, + TemplatesFS: rootFS, }) app := buffalo.New(buffalo.Options{}) @@ -290,12 +288,12 @@ func Test_Auto_HTML_Edit(t *testing.T) { func Test_Auto_HTML_Update(t *testing.T) { r := require.New(t) - box := packd.NewMemoryBox() - err := box.AddString("cars/edit.html", "Update: <%= car.Name %>") - r.NoError(err) + rootFS := memfs.New() + r.NoError(rootFS.MkdirAll("cars", 0755)) + r.NoError(rootFS.WriteFile("cars/edit.html", []byte("Update: <%= car.Name %>"), 0644)) re := render.New(render.Options{ - TemplatesBox: box, + TemplatesFS: rootFS, }) app := buffalo.New(buffalo.Options{}) @@ -330,12 +328,12 @@ func Test_Auto_HTML_Update_Redirect(t *testing.T) { func Test_Auto_HTML_Update_Redirect_Error(t *testing.T) { r := require.New(t) - box := packd.NewMemoryBox() - err := box.AddString("cars/edit.html", "Update: <%= car.Name %>") - r.NoError(err) + rootFS := memfs.New() + r.NoError(rootFS.MkdirAll("cars", 0755)) + r.NoError(rootFS.WriteFile("cars/edit.html", []byte("Update: <%= car.Name %>"), 0644)) re := render.New(render.Options{ - TemplatesBox: box, + TemplatesFS: rootFS, }) app := buffalo.New(buffalo.Options{}) @@ -380,12 +378,12 @@ func Test_Auto_HTML_List_Plural_MultiWord(t *testing.T) { type RoomProviders []RoomProvider - box := packd.NewMemoryBox() - err := box.AddString("room_providers/index.html", "INDEX: <%= len(roomProviders) %>") - r.NoError(err) + rootFS := memfs.New() + r.NoError(rootFS.MkdirAll("room_providers", 0755)) + r.NoError(rootFS.WriteFile("room_providers/index.html", []byte("INDEX: <%= len(roomProviders) %>"), 0644)) re := render.New(render.Options{ - TemplatesBox: box, + TemplatesFS: rootFS, }) app := buffalo.New(buffalo.Options{}) @@ -411,12 +409,12 @@ func Test_Auto_HTML_List_Plural_MultiWord_Dashed(t *testing.T) { type RoomProviders []RoomProvider - box := packd.NewMemoryBox() - err := box.AddString("room_providers/index.html", "INDEX: <%= len(roomProviders) %>") - r.NoError(err) + rootFS := memfs.New() + r.NoError(rootFS.MkdirAll("room_providers", 0755)) + r.NoError(rootFS.WriteFile("room_providers/index.html", []byte("INDEX: <%= len(roomProviders) %>"), 0644)) re := render.New(render.Options{ - TemplatesBox: box, + TemplatesFS: rootFS, }) app := buffalo.New(buffalo.Options{}) @@ -441,12 +439,12 @@ func Test_Auto_HTML_Show_MultiWord_Dashed(t *testing.T) { Name string } - box := packd.NewMemoryBox() - err := box.AddString("room_providers/show.html", "SHOW: <%= roomProvider.Name %>") - r.NoError(err) + rootFS := memfs.New() + r.NoError(rootFS.MkdirAll("room_providers", 0755)) + r.NoError(rootFS.WriteFile("room_providers/show.html", []byte("SHOW: <%= roomProvider.Name %>"), 0644)) re := render.New(render.Options{ - TemplatesBox: box, + TemplatesFS: rootFS, }) app := buffalo.New(buffalo.Options{}) diff --git a/render/html_test.go b/render/html_test.go index c9f659da8..c31ce75bd 100644 --- a/render/html_test.go +++ b/render/html_test.go @@ -5,6 +5,7 @@ import ( "strings" "testing" + "github.com/psanford/memfs" "github.com/stretchr/testify/require" ) @@ -15,10 +16,11 @@ const htmlTemplate = "my-template.html" func Test_HTML_WithoutLayout(t *testing.T) { r := require.New(t) - e := NewEngine() + rootFS := memfs.New() + r.NoError(rootFS.WriteFile(htmlTemplate, []byte("<%= name %>"), 0644)) - box := e.TemplatesBox - r.NoError(box.AddString(htmlTemplate, "<%= name %>")) + e := NewEngine() + e.TemplatesFS = rootFS h := e.HTML(htmlTemplate) r.Equal("text/html; charset=utf-8", h.ContentType()) @@ -31,13 +33,14 @@ func Test_HTML_WithoutLayout(t *testing.T) { func Test_HTML_WithLayout(t *testing.T) { r := require.New(t) + rootFS := memfs.New() + r.NoError(rootFS.WriteFile(htmlTemplate, []byte("<%= name %>"), 0644)) + r.NoError(rootFS.WriteFile(htmlLayout, []byte("<%= yield %>"), 0644)) + e := NewEngine() + e.TemplatesFS = rootFS e.HTMLLayout = htmlLayout - box := e.TemplatesBox - r.NoError(box.AddString(htmlTemplate, "<%= name %>")) - r.NoError(box.AddString(htmlLayout, "<%= yield %>")) - h := e.HTML(htmlTemplate) r.Equal("text/html; charset=utf-8", h.ContentType()) bb := &bytes.Buffer{} @@ -49,14 +52,15 @@ func Test_HTML_WithLayout(t *testing.T) { func Test_HTML_WithLayout_Override(t *testing.T) { r := require.New(t) + rootFS := memfs.New() + r.NoError(rootFS.WriteFile(htmlTemplate, []byte("<%= name %>"), 0644)) + r.NoError(rootFS.WriteFile(htmlLayout, []byte("<%= yield %>"), 0644)) + r.NoError(rootFS.WriteFile(htmlAltLayout, []byte("<%= yield %>"), 0644)) + e := NewEngine() + e.TemplatesFS = rootFS e.HTMLLayout = htmlLayout - box := e.TemplatesBox - r.NoError(box.AddString(htmlTemplate, "<%= name %>")) - r.NoError(box.AddString(htmlLayout, "<%= yield %>")) - r.NoError(box.AddString(htmlAltLayout, "<%= yield %>")) - h := e.HTML(htmlTemplate, htmlAltLayout) r.Equal("text/html; charset=utf-8", h.ContentType()) bb := &bytes.Buffer{} diff --git a/render/js_test.go b/render/js_test.go index 335e0d84b..466132c7c 100644 --- a/render/js_test.go +++ b/render/js_test.go @@ -5,6 +5,7 @@ import ( "strings" "testing" + "github.com/psanford/memfs" "github.com/stretchr/testify/require" ) @@ -15,10 +16,11 @@ const jsTemplate = "my-template.js" func Test_JavaScript_WithoutLayout(t *testing.T) { r := require.New(t) - e := NewEngine() + rootFS := memfs.New() + r.NoError(rootFS.WriteFile(jsTemplate, []byte("alert(<%= name %>)"), 0644)) - box := e.TemplatesBox - r.NoError(box.AddString(jsTemplate, "alert(<%= name %>)")) + e := NewEngine() + e.TemplatesFS = rootFS h := e.JavaScript(jsTemplate) r.Equal("application/javascript", h.ContentType()) @@ -31,13 +33,14 @@ func Test_JavaScript_WithoutLayout(t *testing.T) { func Test_JavaScript_WithLayout(t *testing.T) { r := require.New(t) + rootFS := memfs.New() + r.NoError(rootFS.WriteFile(jsTemplate, []byte("alert(<%= name %>)"), 0644)) + r.NoError(rootFS.WriteFile(jsLayout, []byte("$(<%= yield %>)"), 0644)) + e := NewEngine() + e.TemplatesFS = rootFS e.JavaScriptLayout = jsLayout - box := e.TemplatesBox - r.NoError(box.AddString(jsTemplate, "alert(<%= name %>)")) - r.NoError(box.AddString(jsLayout, "$(<%= yield %>)")) - h := e.JavaScript(jsTemplate) r.Equal("application/javascript", h.ContentType()) bb := &bytes.Buffer{} @@ -49,14 +52,15 @@ func Test_JavaScript_WithLayout(t *testing.T) { func Test_JavaScript_WithLayout_Override(t *testing.T) { r := require.New(t) + rootFS := memfs.New() + r.NoError(rootFS.WriteFile(jsTemplate, []byte("alert(<%= name %>)"), 0644)) + r.NoError(rootFS.WriteFile(jsLayout, []byte("$(<%= yield %>)"), 0644)) + r.NoError(rootFS.WriteFile(jsAltLayout, []byte("_(<%= yield %>)"), 0644)) + e := NewEngine() + e.TemplatesFS = rootFS e.JavaScriptLayout = jsLayout - box := e.TemplatesBox - r.NoError(box.AddString(jsTemplate, "alert(<%= name %>)")) - r.NoError(box.AddString(jsLayout, "$(<%= yield %>)")) - r.NoError(box.AddString(jsAltLayout, "_(<%= yield %>)")) - h := e.JavaScript(jsTemplate, jsAltLayout) r.Equal("application/javascript", h.ContentType()) bb := &bytes.Buffer{} @@ -71,12 +75,12 @@ func Test_JavaScript_Partial_Without_Extension(t *testing.T) { r := require.New(t) - e := NewEngine() - - box := e.TemplatesBox - r.NoError(box.AddString(jsTemplate, tmpl)) - r.NoError(box.AddString("_part.js", part)) + rootFS := memfs.New() + r.NoError(rootFS.WriteFile(jsTemplate, []byte(tmpl), 0644)) + r.NoError(rootFS.WriteFile("_part.js", []byte(part), 0644)) + e := NewEngine() + e.TemplatesFS = rootFS h := e.JavaScript(jsTemplate) r.Equal("application/javascript", h.ContentType()) bb := &bytes.Buffer{} @@ -91,11 +95,12 @@ func Test_JavaScript_Partial(t *testing.T) { r := require.New(t) - e := NewEngine() + rootFS := memfs.New() + r.NoError(rootFS.WriteFile(jsTemplate, []byte(tmpl), 0644)) + r.NoError(rootFS.WriteFile("_part.js", []byte(part), 0644)) - box := e.TemplatesBox - r.NoError(box.AddString(jsTemplate, tmpl)) - r.NoError(box.AddString("_part.js", part)) + e := NewEngine() + e.TemplatesFS = rootFS h := e.JavaScript(jsTemplate) r.Equal("application/javascript", h.ContentType()) @@ -113,11 +118,12 @@ func Test_JavaScript_HTML_Partial(t *testing.T) { r := require.New(t) - e := NewEngine() + rootFS := memfs.New() + r.NoError(rootFS.WriteFile(jsTemplate, []byte(tmpl), 0644)) + r.NoError(rootFS.WriteFile("_part.html", []byte(part), 0644)) - box := e.TemplatesBox - r.NoError(box.AddString(jsTemplate, tmpl)) - r.NoError(box.AddString("_part.html", part)) + e := NewEngine() + e.TemplatesFS = rootFS h := e.JavaScript(jsTemplate) r.Equal("application/javascript", h.ContentType()) diff --git a/render/markdown_test.go b/render/markdown_test.go index e0afe9020..6cda51d73 100644 --- a/render/markdown_test.go +++ b/render/markdown_test.go @@ -5,6 +5,7 @@ import ( "strings" "testing" + "github.com/psanford/memfs" "github.com/stretchr/testify/require" ) @@ -13,10 +14,11 @@ const mdTemplate = "my-template.md" func Test_MD_WithoutLayout(t *testing.T) { r := require.New(t) - e := NewEngine() + rootFS := memfs.New() + r.NoError(rootFS.WriteFile(mdTemplate, []byte("<%= name %>"), 0644)) - box := e.TemplatesBox - r.NoError(box.AddString(mdTemplate, "<%= name %>")) + e := NewEngine() + e.TemplatesFS = rootFS h := e.HTML(mdTemplate) r.Equal("text/html; charset=utf-8", h.ContentType()) @@ -29,13 +31,14 @@ func Test_MD_WithoutLayout(t *testing.T) { func Test_MD_WithLayout(t *testing.T) { r := require.New(t) + rootFS := memfs.New() + r.NoError(rootFS.WriteFile(mdTemplate, []byte("<%= name %>"), 0644)) + r.NoError(rootFS.WriteFile(htmlLayout, []byte("<%= yield %>"), 0644)) + e := NewEngine() + e.TemplatesFS = rootFS e.HTMLLayout = htmlLayout - box := e.TemplatesBox - r.NoError(box.AddString(mdTemplate, "<%= name %>")) - r.NoError(box.AddString(htmlLayout, "<%= yield %>")) - h := e.HTML(mdTemplate) r.Equal("text/html; charset=utf-8", h.ContentType()) bb := &bytes.Buffer{} diff --git a/render/options.go b/render/options.go index f22a50bad..33ec71d7b 100644 --- a/render/options.go +++ b/render/options.go @@ -1,8 +1,9 @@ package render import ( + "io/fs" + "github.com/gobuffalo/helpers/hctx" - "github.com/gobuffalo/packd" ) // Helpers to be included in all templates @@ -16,11 +17,11 @@ type Options struct { // JavaScriptLayout is the default layout to be used with all JavaScript renders. JavaScriptLayout string - // TemplatesBox is the location of the templates directory on disk. - TemplatesBox packd.Box + // TemplateFS is the fs.FS that holds the templates + TemplatesFS fs.FS - // AssetsBox is the location of the public assets the app will serve. - AssetsBox packd.Box + // AssetsFS is the fs.FS that holds the of the public assets the app will serve. + AssetsFS fs.FS // Helpers to be rendered with the templates Helpers Helpers diff --git a/render/partials_test.go b/render/partials_test.go index d158ac9b2..6ea10969b 100644 --- a/render/partials_test.go +++ b/render/partials_test.go @@ -5,7 +5,7 @@ import ( "strings" "testing" - "github.com/gobuffalo/packd" + "github.com/psanford/memfs" "github.com/stretchr/testify/require" ) @@ -15,12 +15,12 @@ func Test_Template_Partial(t *testing.T) { const part = `<%= partial("foo.html") %>` const tmpl = "Foo > <%= name %>" - box := packd.NewMemoryBox() - r.NoError(box.AddString(htmlTemplate, tmpl)) - r.NoError(box.AddString("_foo.html", part)) + rootFS := memfs.New() + r.NoError(rootFS.WriteFile(htmlTemplate, []byte(tmpl), 0644)) + r.NoError(rootFS.WriteFile("_foo.html", []byte(part), 0644)) e := NewEngine() - e.TemplatesBox = box + e.TemplatesFS = rootFS bb := &bytes.Buffer{} @@ -32,12 +32,12 @@ func Test_Template_Partial(t *testing.T) { func Test_Template_PartialCustomFeeder(t *testing.T) { r := require.New(t) - box := packd.NewMemoryBox() - r.NoError(box.AddString("base.plush.html", `<%= partial("foo.plush.html") %>`)) - r.NoError(box.AddString("_foo.plush.html", "other")) + rootFS := memfs.New() + r.NoError(rootFS.WriteFile("base.plush.html", []byte(`<%= partial("foo.plush.html") %>`), 0644)) + r.NoError(rootFS.WriteFile("_foo.plush.html", []byte("other"), 0644)) e := NewEngine() - e.TemplatesBox = box + e.TemplatesFS = rootFS t.Run("Custom Feeder", func(t *testing.T) { e.Helpers["partialFeeder"] = func(path string) (string, error) { @@ -68,12 +68,12 @@ func Test_Template_Partial_WithoutExtension(t *testing.T) { const part = `<%= partial("foo") %>` const tmpl = "Foo > <%= name %>" - box := packd.NewMemoryBox() - r.NoError(box.AddString(htmlTemplate, tmpl)) - r.NoError(box.AddString("_foo.html", part)) + rootFS := memfs.New() + r.NoError(rootFS.WriteFile(htmlTemplate, []byte(tmpl), 0644)) + r.NoError(rootFS.WriteFile("_foo.html", []byte(part), 0644)) e := NewEngine() - e.TemplatesBox = box + e.TemplatesFS = rootFS bb := &bytes.Buffer{} @@ -87,14 +87,14 @@ func Test_Template_Partial_Form(t *testing.T) { const newHTML = `<%= form_for(user, {}) { return partial("form.html") } %>` const formHTML = `<%= f.InputTag("Name") %>` - const result = `` + const result = `` - box := packd.NewMemoryBox() - r.NoError(box.AddString("new.html", newHTML)) - r.NoError(box.AddString("_form.html", formHTML)) + rootFS := memfs.New() + r.NoError(rootFS.WriteFile("new.html", []byte(newHTML), 0644)) + r.NoError(rootFS.WriteFile("_form.html", []byte(formHTML), 0644)) e := NewEngine() - e.TemplatesBox = box + e.TemplatesFS = rootFS u := Widget{Name: "Mark"} @@ -111,12 +111,12 @@ func Test_Template_Partial_With_For(t *testing.T) { const rowHTML = `Hi <%= user.Name %>, ` const result = `Hi Mark, Hi Yonghwan,` - box := packd.NewMemoryBox() - r.NoError(box.AddString("for.html", forHTML)) - r.NoError(box.AddString("_row.html", rowHTML)) + rootFS := memfs.New() + r.NoError(rootFS.WriteFile("for.html", []byte(forHTML), 0644)) + r.NoError(rootFS.WriteFile("_row.html", []byte(rowHTML), 0644)) e := NewEngine() - e.TemplatesBox = box + e.TemplatesFS = rootFS bb := &bytes.Buffer{} @@ -139,12 +139,12 @@ func Test_Template_Partial_With_For_And_Local(t *testing.T) { const rowHTML = `<%= say %> <%= user.Name %>, ` const result = `Hi Mark, Hi Yonghwan,` - box := packd.NewMemoryBox() - r.NoError(box.AddString("for.html", forHTML)) - r.NoError(box.AddString("_row.html", rowHTML)) + rootFS := memfs.New() + r.NoError(rootFS.WriteFile("for.html", []byte(forHTML), 0644)) + r.NoError(rootFS.WriteFile("_row.html", []byte(rowHTML), 0644)) e := NewEngine() - e.TemplatesBox = box + e.TemplatesFS = rootFS bb := &bytes.Buffer{} @@ -167,12 +167,12 @@ func Test_Template_Partial_Recursive_With_Global_And_Local_Context(t *testing.T) const fooHTML = `<%= other %>|<%= name %>` const result = `Other|Mark` - box := packd.NewMemoryBox() - r.NoError(box.AddString("index.html", indexHTML)) - r.NoError(box.AddString("_foo.html", fooHTML)) + rootFS := memfs.New() + r.NoError(rootFS.WriteFile("index.html", []byte(indexHTML), 0644)) + r.NoError(rootFS.WriteFile("_foo.html", []byte(fooHTML), 0644)) e := NewEngine() - e.TemplatesBox = box + e.TemplatesFS = rootFS bb := &bytes.Buffer{} @@ -189,13 +189,13 @@ func Test_Template_Partial_With_Layout(t *testing.T) { const fooHTML = "Foo > <%= name %>" const result = `Layout > Foo > Mark` - box := packd.NewMemoryBox() - r.NoError(box.AddString("index.html", indexHTML)) - r.NoError(box.AddString("_layout.html", layoutHTML)) - r.NoError(box.AddString("_foo.html", fooHTML)) + rootFS := memfs.New() + r.NoError(rootFS.WriteFile("index.html", []byte(indexHTML), 0644)) + r.NoError(rootFS.WriteFile("_layout.html", []byte(layoutHTML), 0644)) + r.NoError(rootFS.WriteFile("_foo.html", []byte(fooHTML), 0644)) e := NewEngine() - e.TemplatesBox = box + e.TemplatesFS = rootFS bb := &bytes.Buffer{} diff --git a/render/plain_test.go b/render/plain_test.go index 825db78f4..1b224e4a8 100644 --- a/render/plain_test.go +++ b/render/plain_test.go @@ -4,18 +4,18 @@ import ( "bytes" "testing" - "github.com/gobuffalo/packd" + "github.com/psanford/memfs" "github.com/stretchr/testify/require" ) func Test_Plain(t *testing.T) { r := require.New(t) - box := packd.NewMemoryBox() - r.NoError(box.AddString("test.txt", "<%= name %>")) + rootFS := memfs.New() + r.NoError(rootFS.WriteFile("test.txt", []byte("<%= name %>"), 0644)) e := NewEngine() - e.TemplatesBox = box + e.TemplatesFS = rootFS re := e.Plain("test.txt") r.Equal("text/plain; charset=utf-8", re.ContentType()) diff --git a/render/render_test.go b/render/render_test.go index c7f8c12b6..9b2d012f1 100644 --- a/render/render_test.go +++ b/render/render_test.go @@ -1,7 +1,7 @@ package render import ( - "github.com/gobuffalo/packd" + "github.com/psanford/memfs" ) type Widget struct { @@ -14,8 +14,8 @@ func (w Widget) ToPath() string { func NewEngine() *Engine { return New(Options{ - TemplatesBox: packd.NewMemoryBox(), - AssetsBox: packd.NewMemoryBox(), + TemplatesFS: memfs.New(), + AssetsFS: memfs.New(), }) } diff --git a/render/template.go b/render/template.go index b67641d39..9e64bbe19 100644 --- a/render/template.go +++ b/render/template.go @@ -4,14 +4,13 @@ import ( "fmt" "html/template" "io" + "io/fs" "os" "path/filepath" "sort" "strings" + "sync" - "github.com/gobuffalo/buffalo/internal/takeon/github.com/gobuffalo/syncx" - "github.com/gobuffalo/buffalo/internal/takeon/github.com/markbates/errx" - "github.com/gobuffalo/packd" "github.com/sirupsen/logrus" ) @@ -19,20 +18,21 @@ type templateRenderer struct { *Engine contentType string names []string - aliases syncx.StringMap + aliases sync.Map } -func (s templateRenderer) ContentType() string { +func (s *templateRenderer) ContentType() string { return s.contentType } -func (s templateRenderer) resolve(name string) ([]byte, error) { - if s.TemplatesBox == nil { - return nil, fmt.Errorf("no templates box is defined") +func (s *templateRenderer) resolve(name string) ([]byte, error) { + if s.TemplatesFS == nil { + return nil, fmt.Errorf("no templates fs defined") } - if s.TemplatesBox.Has(name) { - return s.TemplatesBox.Find(name) + f, err := s.TemplatesFS.Open(name) + if err == nil { + return io.ReadAll(f) } v, ok := s.aliases.Load(name) @@ -40,15 +40,25 @@ func (s templateRenderer) resolve(name string) ([]byte, error) { return nil, fmt.Errorf("could not find template %s", name) } - return s.TemplatesBox.Find(v) + f, err = s.TemplatesFS.Open(v.(string)) + if err != nil { + return nil, err + } + return io.ReadAll(f) } func (s *templateRenderer) Render(w io.Writer, data Data) error { - if s.TemplatesBox != nil { - err := s.TemplatesBox.Walk(func(p string, f packd.File) error { - base := filepath.Base(p) + if s.TemplatesFS != nil { + err := fs.WalkDir(s.TemplatesFS, ".", func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + if d.IsDir() { + return nil + } - dir := filepath.Dir(p) + base := filepath.Base(path) + dir := filepath.Dir(path) var exts []string sep := strings.Split(base, ".") @@ -61,7 +71,7 @@ func (s *templateRenderer) Render(w io.Writer, data Data) error { for _, ext := range exts { pn := filepath.Join(dir, base+"."+ext) - s.aliases.Store(pn, p) + s.aliases.Store(pn, path) } return nil @@ -76,7 +86,7 @@ func (s *templateRenderer) Render(w io.Writer, data Data) error { for _, name := range s.names { body, err = s.exec(name, data) if err != nil { - return errx.Wrap(err, name) + return fmt.Errorf("%s: %w", name, err) } data["yield"] = body } @@ -101,7 +111,7 @@ func fixExtension(name string, ct string) string { // partialFeeder returns template string for the name from `TemplateBox`. // It should be registered as helper named `partialFeeder` so plush can // find it with the name. -func (s templateRenderer) partialFeeder(name string) (string, error) { +func (s *templateRenderer) partialFeeder(name string) (string, error) { ct := strings.ToLower(s.contentType) d, f := filepath.Split(name) @@ -112,7 +122,7 @@ func (s templateRenderer) partialFeeder(name string) (string, error) { return string(b), err } -func (s templateRenderer) exec(name string, data Data) (template.HTML, error) { +func (s *templateRenderer) exec(name string, data Data) (template.HTML, error) { ct := strings.ToLower(s.contentType) data["contentType"] = ct @@ -160,7 +170,7 @@ func (s templateRenderer) exec(name string, data Data) (template.HTML, error) { return template.HTML(body), nil } -func (s templateRenderer) localizedName(name string, data Data) string { +func (s *templateRenderer) localizedName(name string, data Data) string { templateName := name languages, ok := data["languages"].([]string) @@ -191,7 +201,7 @@ func (s templateRenderer) localizedName(name string, data Data) string { return templateName } -func (s templateRenderer) exts(name string) []string { +func (s *templateRenderer) exts(name string) []string { exts := []string{} for { ext := filepath.Ext(name) @@ -208,17 +218,17 @@ func (s templateRenderer) exts(name string) []string { return exts } -func (s templateRenderer) assetPath(file string) (string, error) { +func (s *templateRenderer) assetPath(file string) (string, error) { if len(assetMap.Keys()) == 0 || os.Getenv("GO_ENV") != "production" { - manifest, err := s.AssetsBox.FindString("manifest.json") - + manifest, err := s.AssetsFS.Open("manifest.json") if err != nil { - manifest, err = s.AssetsBox.FindString("assets/manifest.json") + manifest, err = s.AssetsFS.Open("assets/manifest.json") if err != nil { return assetPathFor(file), nil } } + defer manifest.Close() err = loadManifest(manifest) if err != nil { @@ -251,6 +261,5 @@ func (e *Engine) Template(c string, names ...string) Renderer { Engine: e, contentType: c, names: names, - aliases: syncx.StringMap{}, } } diff --git a/render/template_helpers.go b/render/template_helpers.go index b64c1b84d..4cd8d567e 100644 --- a/render/template_helpers.go +++ b/render/template_helpers.go @@ -3,6 +3,7 @@ package render import ( "encoding/json" "html/template" + "io" "path/filepath" ht "github.com/gobuffalo/helpers/tags" @@ -14,7 +15,7 @@ type helperTag struct { fn func(string, tags.Options) template.HTML } -func (s templateRenderer) addAssetsHelpers(helpers Helpers) Helpers { +func (s *templateRenderer) addAssetsHelpers(helpers Helpers) Helpers { helpers["assetPath"] = s.assetPath ah := []helperTag{ @@ -51,11 +52,10 @@ func assetPathFor(file string) string { return filepath.ToSlash(filepath.Join("/assets", filePath)) } -func loadManifest(manifest string) error { +func loadManifest(manifest io.Reader) error { m := map[string]string{} - err := json.Unmarshal([]byte(manifest), &m) - if err != nil { + if err := json.NewDecoder(manifest).Decode(&m); err != nil { return err } for k, v := range m { diff --git a/render/template_test.go b/render/template_test.go index def1d7f92..1c7f66676 100644 --- a/render/template_test.go +++ b/render/template_test.go @@ -5,15 +5,18 @@ import ( "strings" "testing" + "github.com/psanford/memfs" "github.com/stretchr/testify/require" ) func Test_Template(t *testing.T) { r := require.New(t) + rootFS := memfs.New() + r.NoError(rootFS.WriteFile(htmlTemplate, []byte("<%= name %>"), 0644)) + e := NewEngine() - box := e.TemplatesBox - r.NoError(box.AddString(htmlTemplate, `<%= name %>`)) + e.TemplatesFS = rootFS re := e.Template("foo/bar", htmlTemplate) r.Equal("foo/bar", re.ContentType()) @@ -25,12 +28,13 @@ func Test_Template(t *testing.T) { func Test_AssetPath(t *testing.T) { r := require.New(t) - e := NewEngine() - - abox := e.AssetsBox - r.NoError(abox.AddString("manifest.json", `{ + rootFS := memfs.New() + r.NoError(rootFS.WriteFile("manifest.json", []byte(`{ "application.css": "application.aabbc123.css" - }`)) + }`), 0644)) + + e := NewEngine() + e.AssetsFS = rootFS cases := map[string]string{ "something.txt": "/assets/something.txt", @@ -40,8 +44,9 @@ func Test_AssetPath(t *testing.T) { } for original, expected := range cases { - tbox := e.TemplatesBox - r.NoError(tbox.AddString(htmlTemplate, "<%= assetPath(\""+original+"\") %>")) + rootFS := memfs.New() + r.NoError(rootFS.WriteFile(htmlTemplate, []byte("<%= assetPath(\""+original+"\") %>"), 0644)) + e.TemplatesFS = rootFS re := e.Template("text/html; charset=utf-8", htmlTemplate) @@ -62,8 +67,9 @@ func Test_AssetPathNoManifest(t *testing.T) { } for original, expected := range cases { - tbox := e.TemplatesBox - r.NoError(tbox.AddString(htmlTemplate, "<%= assetPath(\""+original+"\") %>")) + rootFS := memfs.New() + r.NoError(rootFS.WriteFile(htmlTemplate, []byte("<%= assetPath(\""+original+"\") %>"), 0644)) + e.TemplatesFS = rootFS re := e.Template("text/html; charset=utf-8", htmlTemplate) @@ -76,10 +82,11 @@ func Test_AssetPathNoManifest(t *testing.T) { func Test_AssetPathNoManifestCorrupt(t *testing.T) { r := require.New(t) - e := NewEngine() + rootFS := memfs.New() + r.NoError(rootFS.WriteFile("manifest.json", []byte("//shdnn Corrupt!"), 0644)) - abox := e.AssetsBox - r.NoError(abox.AddString("manifest.json", "//shdnn Corrupt!")) + e := NewEngine() + e.AssetsFS = rootFS cases := map[string]string{ "something.txt": "manifest.json is not correct", @@ -87,8 +94,9 @@ func Test_AssetPathNoManifestCorrupt(t *testing.T) { } for original, expected := range cases { - tbox := e.TemplatesBox - r.NoError(tbox.AddString(htmlTemplate, "<%= assetPath(\""+original+"\") %>")) + rootFS := memfs.New() + r.NoError(rootFS.WriteFile(htmlTemplate, []byte("<%= assetPath(\""+original+"\") %>"), 0644)) + e.TemplatesFS = rootFS re := e.Template("text/html; charset=utf-8", htmlTemplate) diff --git a/request_test.go b/request_test.go deleted file mode 100644 index 039ae159b..000000000 --- a/request_test.go +++ /dev/null @@ -1,50 +0,0 @@ -package buffalo - -import ( - "io/ioutil" - "net/http" - "testing" - - "github.com/gobuffalo/httptest" - "github.com/stretchr/testify/require" -) - -func Test_Request_MultipleReads(t *testing.T) { - r := require.New(t) - var reads []string - - h := http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { - b, err := ioutil.ReadAll(req.Body) - r.NoError(err) - reads = append(reads, string(b)) - }) - app := New(Options{ - PreHandlers: []http.Handler{h}, - }) - - app.Use(func(next Handler) Handler { - return func(c Context) error { - b, err := ioutil.ReadAll(c.Request().Body) - if err != nil { - return err - } - reads = append(reads, string(b)) - return next(c) - } - }) - app.POST("/", func(c Context) error { - b, err := ioutil.ReadAll(c.Request().Body) - if err != nil { - return err - } - reads = append(reads, string(b)) - return nil - }) - - w := httptest.New(app) - w.JSON("/").Post(map[string]string{"foo": "foo"}) - r.Len(reads, 3) - - foo := `{"foo":"foo"}` - r.Equal([]string{foo, foo, foo}, reads) -} diff --git a/route_info.go b/route_info.go index 3309abbed..7fa122039 100644 --- a/route_info.go +++ b/route_info.go @@ -2,6 +2,7 @@ package buffalo import ( "encoding/json" + "errors" "fmt" "html/template" "net/http" @@ -106,7 +107,8 @@ func (ri RouteInfo) ServeHTTP(res http.ResponseWriter, req *http.Request) { if err != nil { status := http.StatusInternalServerError - if he, ok := err.(HTTPError); ok { + var he HTTPError + if errors.As(err, &he) { status = he.Status } events.EmitError(EvtRouteErr, err, payload) diff --git a/router_test.go b/router_test.go index b41a33893..1e3fa5254 100644 --- a/router_test.go +++ b/router_test.go @@ -4,6 +4,7 @@ import ( "fmt" "io/ioutil" "net/http" + "os" "path" "strings" "testing" @@ -11,9 +12,8 @@ import ( "github.com/gobuffalo/buffalo/render" "github.com/gobuffalo/envy" "github.com/gobuffalo/httptest" - "github.com/gobuffalo/packd" - "github.com/gobuffalo/packr/v2" "github.com/gorilla/mux" + "github.com/psanford/memfs" "github.com/stretchr/testify/require" ) @@ -333,10 +333,10 @@ func Test_Router_Redirect(t *testing.T) { func Test_Router_ServeFiles(t *testing.T) { r := require.New(t) - box := packd.NewMemoryBox() - box.AddString("foo.png", "foo") + rootFS := memfs.New() + rootFS.WriteFile("foo.png", []byte("foo"), 0644) a := New(Options{}) - a.ServeFiles("/assets", box) + a.ServeFiles("/assets", http.FS(rootFS)) w := httptest.New(a) res := w.HTML("/assets/foo.png").Get() @@ -361,10 +361,10 @@ func Test_Router_ServeFiles(t *testing.T) { func Test_Router_InvalidURL(t *testing.T) { r := require.New(t) - box := packd.NewMemoryBox() - box.AddString("foo.png", "foo") + rootFS := memfs.New() + rootFS.WriteFile("foo.png", []byte("foo"), 0644) a := New(Options{}) - a.ServeFiles("/", box) + a.ServeFiles("/", http.FS(rootFS)) w := httptest.New(a) s := "/%25%7dn2zq0%3cscript%3ealert(1)%3c\\/script%3evea7f" @@ -408,9 +408,9 @@ func Test_App_NamedRoutes(t *testing.T) { var resourcesResource Resource = ResourcesResource{} rr := render.New(render.Options{ - HTMLLayout: "application.plush.html", - TemplatesBox: packr.New("../templates", "../templates"), - Helpers: map[string]interface{}{}, + HTMLLayout: "application.plush.html", + TemplatesFS: os.DirFS("../templates"), + Helpers: map[string]interface{}{}, }) sampleHandler := func(c Context) error { @@ -470,9 +470,9 @@ func Test_App_NamedRoutes_MissingParameter(t *testing.T) { a := New(Options{}) rr := render.New(render.Options{ - HTMLLayout: "application.plush.html", - TemplatesBox: packr.New("../templates", "../templates"), - Helpers: map[string]interface{}{}, + HTMLLayout: "application.plush.html", + TemplatesFS: os.DirFS("../templates"), + Helpers: map[string]interface{}{}, }) sampleHandler := func(c Context) error { diff --git a/server.go b/server.go index 03f768780..f29d08b1e 100644 --- a/server.go +++ b/server.go @@ -2,15 +2,14 @@ package buffalo import ( "context" + "errors" "net/http" "os" "strings" "syscall" - "github.com/gobuffalo/buffalo/internal/takeon/github.com/markbates/errx" "github.com/gobuffalo/buffalo/servers" "github.com/gobuffalo/events" - "github.com/gobuffalo/packd" "github.com/markbates/refresh/refresh/web" "github.com/markbates/sigtx" ) @@ -100,7 +99,7 @@ func (a *App) Serve(srvs ...servers.Server) error { // Stop the application and attempt to gracefully shutdown func (a *App) Stop(err error) error { a.cancel() - if err != nil && errx.Unwrap(err) != context.Canceled { + if err != nil && !errors.Is(err, context.Canceled) { a.Logger.Error(err) return err } @@ -108,13 +107,6 @@ func (a *App) Stop(err error) error { } func (a *App) ServeHTTP(w http.ResponseWriter, r *http.Request) { - if r.Body != nil { - // convert the request's body to a packd.File which can be read N times - f, err := packd.NewFile("", r.Body) - if err == nil { - r.Body = f - } - } ws := &Response{ ResponseWriter: w, }