From 8629e167cd668cd1d41bf6a37acf9d94502e5c2b Mon Sep 17 00:00:00 2001 From: bnewbold Date: Tue, 14 Mar 2023 13:00:44 -0700 Subject: [PATCH] bskyweb: proof-of-concept golang daemon to serve SPA (#275) * gitignore: /dist/ * bskyweb: initial work-in-progress * bskyweb: import icons from bluesky-website * bskyweb: switch to pongo2 templates; iterate on views * bskyweb: example.env (and docs) * bskyweb: go fmt * bskyweb: remove plan file * bskyweb: README: tweak formatting * prettier: ignore /dist/, bskyweb templates --------- Co-authored-by: Paul Frazee --- .gitignore | 6 +- .prettierignore | 5 +- bskyweb/.gitignore | 3 + bskyweb/README.md | 39 ++++ bskyweb/cmd/bskyweb/main.go | 68 ++++++ bskyweb/cmd/bskyweb/server.go | 190 ++++++++++++++++ bskyweb/example.env | 4 + bskyweb/go.mod | 72 +++++++ bskyweb/go.sum | 287 +++++++++++++++++++++++++ bskyweb/static/apple-touch-icon.png | Bin 0 -> 14742 bytes bskyweb/static/favicon-16x16.png | Bin 0 -> 316 bytes bskyweb/static/favicon-32x32.png | Bin 0 -> 769 bytes bskyweb/static/favicon.ico | Bin 0 -> 15406 bytes bskyweb/static/favicon.png | Bin 0 -> 6405 bytes bskyweb/static/robots.txt | 1 + bskyweb/static/social-card-default.png | Bin 0 -> 23527 bytes bskyweb/templates/base.html | 51 +++++ bskyweb/templates/error.html | 15 ++ bskyweb/templates/home.html | 7 + bskyweb/templates/post.html | 25 +++ bskyweb/templates/profile.html | 25 +++ 21 files changed, 796 insertions(+), 2 deletions(-) create mode 100644 bskyweb/.gitignore create mode 100644 bskyweb/README.md create mode 100644 bskyweb/cmd/bskyweb/main.go create mode 100644 bskyweb/cmd/bskyweb/server.go create mode 100644 bskyweb/example.env create mode 100644 bskyweb/go.mod create mode 100644 bskyweb/go.sum create mode 100644 bskyweb/static/apple-touch-icon.png create mode 100644 bskyweb/static/favicon-16x16.png create mode 100644 bskyweb/static/favicon-32x32.png create mode 100644 bskyweb/static/favicon.ico create mode 100644 bskyweb/static/favicon.png create mode 100644 bskyweb/static/robots.txt create mode 100644 bskyweb/static/social-card-default.png create mode 100644 bskyweb/templates/base.html create mode 100644 bskyweb/templates/error.html create mode 100644 bskyweb/templates/home.html create mode 100644 bskyweb/templates/post.html create mode 100644 bskyweb/templates/profile.html diff --git a/.gitignore b/.gitignore index 1be65ccb..9d329398 100644 --- a/.gitignore +++ b/.gitignore @@ -65,6 +65,10 @@ coverage/ junit.xml artifacts +# Web bundle outputs +/dist/ + +# Expo .expo/ dist/ *.jks @@ -76,4 +80,4 @@ dist/ web-build/ # Temporary files created by Metro to check the health of the file watcher -.metro-health-check* \ No newline at end of file +.metro-health-check* diff --git a/.prettierignore b/.prettierignore index 2ec214a3..bd66c8d8 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,4 +2,7 @@ ios android src/third-party src/app.json -public \ No newline at end of file +public +/bskyweb/templates +/dist/ +/.watchmanconfig diff --git a/bskyweb/.gitignore b/bskyweb/.gitignore new file mode 100644 index 00000000..7994736d --- /dev/null +++ b/bskyweb/.gitignore @@ -0,0 +1,3 @@ +/static/bundle.web.js +/bskyweb +.env diff --git a/bskyweb/README.md b/bskyweb/README.md new file mode 100644 index 00000000..86bc1686 --- /dev/null +++ b/bskyweb/README.md @@ -0,0 +1,39 @@ +## Build / Develop + +### SPA Bundle (monolithic static javascript file) + +To build the SPA bundle (`bundle.web.js`), first get a Javascript development +environment set up. Either follow the top-level README, or something quick +like: + + # install nodejs 18 (specifically) + nvm install 18 + nvm use 18 + npm install --global yarn + + # setup tools and deps (in top level of this repo) + yarn install --frozen-lockfile + + # run yarn web dev server, if you wanted + yarn web + +Then build and copy over the big 'ol `bundle.web.js` file: + + # in the top level of this repo + yarn webpack build --config ./web/webpack.config.js -d inline-source-map --color + cp dist/bundle.web.js bskyweb/static/ + +### Golang Daemon + +Install golang. We are generally using v1.19+. + +In this directory (`bskyweb/`): + + # re-build and run daemon + go run ./cmd/bskyweb serve + + # build and output a binary + go build -o bskyweb ./cmd/bskyweb/ + +The easiest way to configure the daemon is to copy `example.env` to `.env` and +fill in auth values there. diff --git a/bskyweb/cmd/bskyweb/main.go b/bskyweb/cmd/bskyweb/main.go new file mode 100644 index 00000000..4b691b68 --- /dev/null +++ b/bskyweb/cmd/bskyweb/main.go @@ -0,0 +1,68 @@ +package main + +import ( + "os" + + logging "github.com/ipfs/go-log" + "github.com/joho/godotenv" + "github.com/urfave/cli/v2" +) + +var log = logging.Logger("bskyweb") + +func init() { + logging.SetAllLoggers(logging.LevelDebug) + //logging.SetAllLoggers(logging.LevelWarn) +} + +func main() { + + // only try dotenv if it exists + if _, err := os.Stat(".env"); err == nil { + err := godotenv.Load() + if err != nil { + log.Fatal("Error loading .env file") + } + } + + run(os.Args) +} + +func run(args []string) { + + app := cli.App{ + Name: "bskyweb", + Usage: "web server for bsky.app web app (SPA)", + } + + app.Flags = []cli.Flag{ + &cli.StringFlag{ + Name: "pds-host", + Usage: "method, hostname, and port of PDS instance", + Value: "http://localhost:4849", + EnvVars: []string{"ATP_PDS_HOST"}, + }, + &cli.StringFlag{ + Name: "handle", + Usage: "for PDS login", + Required: true, + EnvVars: []string{"ATP_AUTH_HANDLE"}, + }, + &cli.StringFlag{ + Name: "password", + Usage: "for PDS login", + Required: true, + EnvVars: []string{"ATP_AUTH_PASSWORD"}, + }, + // TODO: local IP/port to bind on + } + + app.Commands = []*cli.Command{ + &cli.Command{ + Name: "serve", + Usage: "run the server", + Action: serve, + }, + } + app.RunAndExitOnError() +} diff --git a/bskyweb/cmd/bskyweb/server.go b/bskyweb/cmd/bskyweb/server.go new file mode 100644 index 00000000..6a8a8888 --- /dev/null +++ b/bskyweb/cmd/bskyweb/server.go @@ -0,0 +1,190 @@ +package main + +import ( + "context" + "errors" + "fmt" + "io" + "net/http" + + comatproto "github.com/bluesky-social/indigo/api/atproto" + appbsky "github.com/bluesky-social/indigo/api/bsky" + cliutil "github.com/bluesky-social/indigo/cmd/gosky/util" + "github.com/bluesky-social/indigo/xrpc" + + "github.com/flosch/pongo2/v6" + "github.com/labstack/echo/v4" + "github.com/labstack/echo/v4/middleware" + "github.com/urfave/cli/v2" +) + +// TODO: embed templates in executable + +type Renderer struct { + Debug bool +} + +func (r Renderer) Render(w io.Writer, name string, data interface{}, c echo.Context) error { + + var ctx pongo2.Context + + if data != nil { + var ok bool + ctx, ok = data.(pongo2.Context) + + if !ok { + return errors.New("no pongo2.Context data was passed...") + } + } + + var t *pongo2.Template + var err error + + if r.Debug { + t, err = pongo2.FromFile(name) + } else { + t, err = pongo2.FromCache(name) + } + + if err != nil { + return err + } + + return t.ExecuteWriter(ctx, w) +} + +type Server struct { + xrpcc *xrpc.Client +} + +func serve(cctx *cli.Context) error { + + // create a new session + // TODO: does this work with no auth at all? + xrpcc := &xrpc.Client{ + Client: cliutil.NewHttpClient(), + Host: cctx.String("pds-host"), + Auth: &xrpc.AuthInfo{ + Handle: cctx.String("handle"), + }, + } + + auth, err := comatproto.SessionCreate(context.TODO(), xrpcc, &comatproto.SessionCreate_Input{ + Identifier: &xrpcc.Auth.Handle, + Password: cctx.String("password"), + }) + if err != nil { + return err + } + xrpcc.Auth.AccessJwt = auth.AccessJwt + xrpcc.Auth.RefreshJwt = auth.RefreshJwt + xrpcc.Auth.Did = auth.Did + xrpcc.Auth.Handle = auth.Handle + + server := Server{xrpcc} + + e := echo.New() + e.HideBanner = true + e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{ + Format: "method=${method} path=${uri} status=${status} latency=${latency_human}\n", + })) + e.Renderer = Renderer{Debug: true} + e.HTTPErrorHandler = customHTTPErrorHandler + + // configure routes + e.File("/robots.txt", "static/robots.txt") + e.Static("/static", "static") + + e.GET("/", server.WebHome) + + // generic routes + e.GET("/contacts", server.WebGeneric) + e.GET("/search", server.WebGeneric) + e.GET("/notifications", server.WebGeneric) + e.GET("/settings", server.WebGeneric) + e.GET("/settings", server.WebGeneric) + + // profile endpoints; only first populates info + e.GET("/profile/:handle", server.WebProfile) + e.GET("/profile/:handle/follows", server.WebGeneric) + e.GET("/profile/:handle/following", server.WebGeneric) + + // post endpoints; only first populates info + e.GET("/profile/:handle/post/:rkey", server.WebPost) + e.GET("/profile/:handle/post/:rkey/upvoted-by", server.WebGeneric) + e.GET("/profile/:handle/post/:rkey/downvoted-by", server.WebGeneric) + e.GET("/profile/:handle/post/:rkey/reposted-by", server.WebGeneric) + + bind := "localhost:8100" + log.Infof("starting server bind=%s", bind) + return e.Start(bind) +} + +func customHTTPErrorHandler(err error, c echo.Context) { + code := http.StatusInternalServerError + if he, ok := err.(*echo.HTTPError); ok { + code = he.Code + } + c.Logger().Error(err) + data := pongo2.Context{ + "statusCode": code, + } + c.Render(code, "templates/error.html", data) +} + +// handler for endpoint that have no specific server-side handling +func (srv *Server) WebGeneric(c echo.Context) error { + data := pongo2.Context{} + return c.Render(http.StatusOK, "templates/base.html", data) +} + +func (srv *Server) WebHome(c echo.Context) error { + data := pongo2.Context{} + return c.Render(http.StatusOK, "templates/home.html", data) +} + +func (srv *Server) WebPost(c echo.Context) error { + data := pongo2.Context{} + handle := c.Param("handle") + rkey := c.Param("rkey") + // sanity check argument + if len(handle) > 4 && len(handle) < 128 && len(rkey) > 0 { + ctx := context.TODO() + // requires two fetches: first fetch profile (!) + pv, err := appbsky.ActorGetProfile(ctx, srv.xrpcc, handle) + if err != nil { + log.Warnf("failed to fetch handle: %s\t%v", handle, err) + } else { + did := pv.Did + data["did"] = did + + // then fetch the post thread (with extra context) + uri := fmt.Sprintf("at://%s/app.bsky.feed.post/%s", did, rkey) + tpv, err := appbsky.FeedGetPostThread(ctx, srv.xrpcc, 1, uri) + if err != nil { + log.Warnf("failed to fetch post: %s\t%v", uri, err) + } else { + data["postView"] = tpv.Thread.FeedGetPostThread_ThreadViewPost.Post + } + } + + } + return c.Render(http.StatusOK, "templates/post.html", data) +} + +func (srv *Server) WebProfile(c echo.Context) error { + data := pongo2.Context{} + handle := c.Param("handle") + // sanity check argument + if len(handle) > 4 && len(handle) < 128 { + ctx := context.TODO() + pv, err := appbsky.ActorGetProfile(ctx, srv.xrpcc, handle) + if err != nil { + log.Warnf("failed to fetch handle: %s\t%v", handle, err) + } else { + data["profileView"] = pv + } + } + + return c.Render(http.StatusOK, "templates/profile.html", data) +} diff --git a/bskyweb/example.env b/bskyweb/example.env new file mode 100644 index 00000000..4bcc65e8 --- /dev/null +++ b/bskyweb/example.env @@ -0,0 +1,4 @@ +GOLOG_LOG_LEVEL=info +ATP_PDS_HOST=https://bsky.social +ATP_AUTH_HANDLE=TODO +ATP_AUTH_PASSWORD=TODO diff --git a/bskyweb/go.mod b/bskyweb/go.mod new file mode 100644 index 00000000..dc7af572 --- /dev/null +++ b/bskyweb/go.mod @@ -0,0 +1,72 @@ +module github.com/bluesky-social/social-app/bskyweb + +go 1.19 + +require ( + github.com/bluesky-social/indigo v0.0.0-20230307000525-294e33e70185 + github.com/ipfs/go-log v1.0.5 + github.com/joho/godotenv v1.5.1 + github.com/labstack/echo/v4 v4.10.2 + github.com/urfave/cli/v2 v2.25.0 +) + +require ( + github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect + github.com/flosch/pongo2/v6 v6.0.0 // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/goccy/go-json v0.10.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt v3.2.2+incompatible // indirect + github.com/ipfs/go-cid v0.3.2 // indirect + github.com/ipfs/go-log/v2 v2.5.1 // indirect + github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgx/v5 v5.2.0 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/labstack/gommon v0.4.0 // indirect + github.com/lestrrat-go/blackmagic v1.0.1 // indirect + github.com/lestrrat-go/httpcc v1.0.1 // indirect + github.com/lestrrat-go/httprc v1.0.4 // indirect + github.com/lestrrat-go/iter v1.0.2 // indirect + github.com/lestrrat-go/jwx/v2 v2.0.8 // indirect + github.com/lestrrat-go/option v1.0.1 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-sqlite3 v1.14.16 // indirect + github.com/minio/sha256-simd v1.0.0 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mr-tron/base58 v1.2.0 // indirect + github.com/multiformats/go-base32 v0.1.0 // indirect + github.com/multiformats/go-base36 v0.2.0 // indirect + github.com/multiformats/go-multibase v0.1.1 // indirect + github.com/multiformats/go-multihash v0.2.1 // indirect + github.com/multiformats/go-varint v0.0.7 // indirect + github.com/opentracing/opentracing-go v1.2.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/spaolacci/murmur3 v1.1.0 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasttemplate v1.2.2 // indirect + github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa // indirect + github.com/whyrusleeping/go-did v0.0.0-20230301193428-2146016fc220 // indirect + github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect + go.opentelemetry.io/otel v1.11.2 // indirect + go.opentelemetry.io/otel/trace v1.11.2 // indirect + go.uber.org/atomic v1.10.0 // indirect + go.uber.org/multierr v1.9.0 // indirect + go.uber.org/zap v1.24.0 // indirect + golang.org/x/crypto v0.6.0 // indirect + golang.org/x/net v0.7.0 // indirect + golang.org/x/sys v0.5.0 // indirect + golang.org/x/text v0.7.0 // indirect + golang.org/x/time v0.3.0 // indirect + golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect + gorm.io/driver/postgres v1.4.6 // indirect + gorm.io/driver/sqlite v1.4.4 // indirect + gorm.io/gorm v1.24.3 // indirect + lukechampine.com/blake3 v1.1.7 // indirect +) diff --git a/bskyweb/go.sum b/bskyweb/go.sum new file mode 100644 index 00000000..df9d87dc --- /dev/null +++ b/bskyweb/go.sum @@ -0,0 +1,287 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bluesky-social/indigo v0.0.0-20230306194356-5958f14d5152 h1:7fHM+tQHJN5lsMU8FvV4bNuWpD0Dd+pAUSuoLYdcYIQ= +github.com/bluesky-social/indigo v0.0.0-20230306194356-5958f14d5152/go.mod h1:xy2hI4NMC6fgUefSJcCst6E0yo9Xbfd97aF27lgHyHE= +github.com/bluesky-social/indigo v0.0.0-20230307000525-294e33e70185 h1:WnaOpRFWE8Tmw0IeXEEthsqBZtNG6/niokmWANv/aEU= +github.com/bluesky-social/indigo v0.0.0-20230307000525-294e33e70185/go.mod h1:xy2hI4NMC6fgUefSJcCst6E0yo9Xbfd97aF27lgHyHE= +github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +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/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/flosch/pongo2/v6 v6.0.0 h1:lsGru8IAzHgIAw6H2m4PCyleO58I40ow6apih0WprMU= +github.com/flosch/pongo2/v6 v6.0.0/go.mod h1:CuDpFm47R0uGGE7z13/tTlt1Y6zdxvr2RLT5LJhsHEU= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA= +github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= +github.com/ipfs/go-cid v0.3.2 h1:OGgOd+JCFM+y1DjWPmVH+2/4POtpDzwcr7VgnB7mZXc= +github.com/ipfs/go-cid v0.3.2/go.mod h1:gQ8pKqT/sUxGY+tIwy1RPpAojYu7jAyCp5Tz1svoupw= +github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= +github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= +github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= +github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= +github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= +github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= +github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= +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/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.2.0 h1:NdPpngX0Y6z6XDFKqmFQaE+bCtkqzvQIOt1wvBlAqs8= +github.com/jackc/pgx/v5 v5.2.0/go.mod h1:Ptn7zmohNsWEsdxRawMzk3gaKma2obW+NWTnKa0S4nk= +github.com/jackc/puddle/v2 v2.1.2/go.mod h1:2lpufsF5mRHO6SuZkm0fNYxM6SWHfvyFj62KwNzgels= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +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/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/labstack/echo/v4 v4.10.2 h1:n1jAhnq/elIFTHr1EYpiYtyKgx4RW9ccVgkqByZaN2M= +github.com/labstack/echo/v4 v4.10.2/go.mod h1:OEyqf2//K1DFdE57vw2DRgWY0M7s65IVQO2FzvI4J5k= +github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= +github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= +github.com/lestrrat-go/backoff/v2 v2.0.8 h1:oNb5E5isby2kiro9AgdHLv5N5tint1AnDVVf2E2un5A= +github.com/lestrrat-go/blackmagic v1.0.1 h1:lS5Zts+5HIC/8og6cGHb0uCcNCa3OUt1ygh3Qz2Fe80= +github.com/lestrrat-go/blackmagic v1.0.1/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= +github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= +github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= +github.com/lestrrat-go/httprc v1.0.4 h1:bAZymwoZQb+Oq8MEbyipag7iSq6YIga8Wj6GOiJGdI8= +github.com/lestrrat-go/httprc v1.0.4/go.mod h1:mwwz3JMTPBjHUkkDv/IGJ39aALInZLrhBp0X7KGUZlo= +github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI= +github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= +github.com/lestrrat-go/jwx v1.2.25 h1:tAx93jN2SdPvFn08fHNAhqFJazn5mBBOB8Zli0g0otA= +github.com/lestrrat-go/jwx/v2 v2.0.8 h1:jCFT8oc0hEDVjgUgsBy1F9cbjsjAVZSXNi7JaU9HR/Q= +github.com/lestrrat-go/jwx/v2 v2.0.8/go.mod h1:zLxnyv9rTlEvOUHbc48FAfIL8iYu2hHvIRaTFGc8mT0= +github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= +github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= +github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= +github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= +github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= +github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= +github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= +github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= +github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= +github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= +github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= +github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= +github.com/multiformats/go-multibase v0.1.1 h1:3ASCDsuLX8+j4kx58qnJ4YFq/JWTJpCyDW27ztsVTOI= +github.com/multiformats/go-multibase v0.1.1/go.mod h1:ZEjHE+IsUrgp5mhlEAYjMtZwK1k4haNkcaPg9aoe1a8= +github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= +github.com/multiformats/go-multihash v0.2.1 h1:aem8ZT0VA2nCHHk7bPJ1BjUbHNciqZC/d16Vve9l108= +github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= +github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= +github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +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/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/urfave/cli/v2 v2.25.0 h1:ykdZKuQey2zq0yin/l7JOm9Mh+pg72ngYMeB0ABn6q8= +github.com/urfave/cli/v2 v2.25.0/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa h1:EyA027ZAkuaCLoxVX4r1TZMPy1d31fM6hbfQ4OU4I5o= +github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/go-did v0.0.0-20230301193428-2146016fc220 h1:EO/9z3yDvx1van1/0esdcqhalZZQGRj3I1BPTWr5k3A= +github.com/whyrusleeping/go-did v0.0.0-20230301193428-2146016fc220/go.mod h1:qPtRyexGM5XMHFIfjH+EiA/A/1n2JakWEdMPC53pJAE= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/yuin/goldmark v1.1.27/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.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opentelemetry.io/otel v1.11.2 h1:YBZcQlsVekzFsFbjygXMOXSs6pialIZxcjfO/mBDmR0= +go.opentelemetry.io/otel v1.11.2/go.mod h1:7p4EUV+AqgdlNV9gL97IgUZiVR3yrFXYo53f9BM3tRI= +go.opentelemetry.io/otel/trace v1.11.2 h1:Xf7hWSF2Glv0DE3MH7fBHvtpSBsjcBUe5MYAmZM/+y0= +go.opentelemetry.io/otel/trace v1.11.2/go.mod h1:4N+yC7QEz7TTsG9BSRLNAa63eg5E06ObSbKPmxQ/pKA= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= +go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= +go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= +go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= +golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +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-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +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/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +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= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/postgres v1.4.6 h1:1FPESNXqIKG5JmraaH2bfCVlMQ7paLoCreFxDtqzwdc= +gorm.io/driver/postgres v1.4.6/go.mod h1:UJChCNLFKeBqQRE+HrkFUbKbq9idPXmTOk2u4Wok8S4= +gorm.io/driver/sqlite v1.4.4 h1:gIufGoR0dQzjkyqDyYSCvsYR6fba1Gw5YKDqKeChxFc= +gorm.io/driver/sqlite v1.4.4/go.mod h1:0Aq3iPO+v9ZKbcdiz8gLWRw5VOPcBOPUQJFLq5e2ecI= +gorm.io/gorm v1.24.0/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= +gorm.io/gorm v1.24.2/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= +gorm.io/gorm v1.24.3 h1:WL2ifUmzR/SLp85CSURAfybcHnGZ+yLSGSxgYXlFBHg= +gorm.io/gorm v1.24.3/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= +lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= diff --git a/bskyweb/static/apple-touch-icon.png b/bskyweb/static/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5ebb6787c999108d56d1b2f2aa4a5f2275ac5e37 GIT binary patch literal 14742 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 O0000 zk(N&3+#cbc|G}DEi?B-~EnqFk714wzyTjurVc}0$_=QPe<%C<%))Y&0S$g_QxbK2L z+U+etTT^EBo?(CBLS))$l?${PvSSYcvDx^xH+S%FQRHQYpaG$>FamMU7&Z#l6T z0|BGQtbm1q=3*%52~QebP=mL2Z@8JTBNWgUTXjLZq*(ogWX&&h2<$2ZWEHFh zrxd(SdWIyyvyuxG*CrwAQN=ZcJwt&=Sb)Ro3A(7HccIOt|AkV7ea~4CoiRP5fEgB9 z&8yJP3D1M{K>=x%R3JPV3R|{kNWnTKb!SyF2rnw7IN{Rb|CTq3AK_(V9jIl*?E79@ z!YhHmoOxj4??%&CVkC?puZ=>KK1Eu1j z@639jW(=JTL9v*8?~EX9L8R0>8lmEOm`AdHCbG|*PG>2ecue~Tk7Ng8DAg+DEF7RK zj&U{X$KVY^>3bf_iN|u!%H;ejvB_3S;p-BPE7=f-MIOsP42y{ui%HFbjokBM0`Ow; ziB~f>tY$D)vyBK8Oo;l`3}H13=OZttomftTJ6camwv6>ZZbN76@?$o7f!(m2rW25W z@B3LFRt(qtA8nv8l>)izaq?#^1L&bqAo)jsE*`>=Zu8$QATfd+Rj_)25>amO1VqOskxiTL2ka7wyRC#Z6a?5VGeWig>++d9=R6^Lchf0jgPt2 zS@b>&p5$HA<%>uTq|SXCI^|4*(RM%eC~v~oSN!+0<`!=X zGdOvlS%Lf%!u!*-f4FBnaCneErz^V7TiTfbun{sbdoV9VC>~WPnIRmd7`c+^xx`bMHK+wNJKlXe8_uA9wzdy@8 zdKp~w-LHFJz|Z?4KJ$yXcHYa0l9DZ-?)%DiHM+=d%{EOP0k^kEULJ9epW(ZZPOM`rB;!J?3@g z7g~?ZXT(23;*v!DKf>2DEc=T~pL9O2 zwn&bCJ?BQh*++7I+g`u!`y0ev$fvlkP3N<+VtsSOCo+f6;u6-Au4i=FdMU51D`t4)J#Pd3x`Z{m;xok9JDdF&Z9((6?JOdB$3_5Ij6QygOc~P~5RtJ4Yd4S$)c>h?#`^Nx%CF0YTE{vS$ z_qgS&pOvhutb|)fb>}>0WIY#=@{Nye~5LGr?IB-A@B>XnLw|Wv0gGu4fL(5%jqWY z-;hr*!|{AJt>iZnR-cdlga12NcX%9Y5FbOngzRD6<$!e{hig7t_-<_%gnmgWPM_jJ z=gDWtwIQrERS?dwhuN+JKgC>6-_+QjF2>CQ=W4Y%uS*iKLKyM(ox z2Qm8xxQ3g+_I(A-$(c2`>xvWQkJyLfIR!pv#9qcNT+0>wu0D*ppMrc@ajna9m!)&P zYgx6LI-C_V{}yu9AVe4Xy8Ip!S3bAp^V)5C%xmmsjqfJ#6Rfp; z0o<==6aRcOtL(1}`}844Vsl{T1IRV3)$QRLsxe305;8yft>!pZ;>Emq?WQ(o#`phb zgVWbK&tZ1SS?Cnm^C0J+mghY}Pp*;HpF3+PHVeMnlGo;swKaS6x7n;)sx5yPvSwGj z6zj_Aij``0`QE{7UGnynxN_Tg@(aZ;Avuy5FZtzL6wg@SMQX8*OP^Yi@Ag}$M{!@& zW4upJtTD}2k5X-|e+$KtO)U8oS4!$vnsz?qr^NS>K6$9^Z%2UQFV6tET%F z(OFM>ijJ)5w&sXF`Ad9pW2|dl=)9q2eV}j$&^6{^@I& z!R=}K*Uj(h@4czN3L&-$YqiDhwx6^25zaY{7dg@P{H~buq>~?WUV%^Yvgz`*A-PdX z+*xWe-}$Ovsw|C2GWYoP9S?4x*JPKhrcYfF!a7-z-I*Kr+B=jYRd zIEV28e7v5c|F0zG&uVwgqFVYaWE)~8p2-;+ zkmlp;rTOI-M!x(V*v!k`2bgIO_I2Q=5Pt3xv+FcU{ayNH`T;mk;yT|0{tJ0LpHwY0 lf5)5?b&ZGK6@+tN1HKP@DnFYZ(sxEPe}mtA0*ibC{{v@~$EN@Q literal 0 HcmV?d00001 diff --git a/bskyweb/static/favicon.png b/bskyweb/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..61cf7c943b6ac083ab0752f283391e37b39c1221 GIT binary patch literal 6405 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 LX2?n%hsgf}ycPxo literal 0 HcmV?d00001 diff --git a/bskyweb/static/robots.txt b/bskyweb/static/robots.txt new file mode 100644 index 00000000..d3475984 --- /dev/null +++ b/bskyweb/static/robots.txt @@ -0,0 +1 @@ +# hello friends! diff --git a/bskyweb/static/social-card-default.png b/bskyweb/static/social-card-default.png new file mode 100644 index 0000000000000000000000000000000000000000..3bb93c799c9859bcd1afac7b0310d48e51d7efc8 GIT binary patch literal 23527 zcmdqJWk8i%*EYI9L^>s;q&uV=q>=8BZjkN{NokP|DM3U^KsqI*ySuxj`^>fXe%|-_ zp6~sBo%7?IvlLd`YtDPdm}6XHjB60Cq#%WgM1TZ=Kv3UEi>p8&Pe>sUm|O%{@X5z> z&Q9=@W~TMVTwWeR4_+fc;9;;JPrxe}@DBn*0D1b?YY0RGhVZ{$>%-9g^BvF)3@ZfM z84ma{53_>6{qubv@C4zC zTL)+>h=2zlcxh|qVnpg;Yh&lk=OIY`*EjgUYv{);2XTuWYwRLtJVjFgM{ z74s`{AtX{#QUNDZb3PSu$$y%IcY@@WE-nsyEG+Ks?#%A&%=S(eEUdh|yezNSSlHN@ zz&DtjJ?&hKJecg9DgN%{U;T)iIh#0HIk;Ha+mS;1H8Qq$brB>dhu-MF9)FM1%){!x z?_}rv&$Pey@LK%V`bxG<>g}quetc3gMoJQ zzkK)K`hhM9pO%W5v%QTgbR&hh*EYY91N;3+_G%>dnH(&Y3&xJD<;jUyF(&Q3WsRY|BRkkbam>UTBzN zx-2bvm?uvv+KY%#6QLXRM#Lcf`I>eI@s0G6;8>rtpZ~V?(W2hCg#)#%(2@VZud)UK z_NU^qDI(0Q%n0CLiJPt>Tg5_EnDJiu!GZj}?9&ys+6Zzn4 zq`mliy95vjNxN}*LSmxrOoiFrWCXNUPvW%FhsJ`#{gjrwG_0<)rIn3+JV6dDE zXhWwH6BA)*#IsG_m*79ROUqq=95tbk&(-ckk;OpT#?DT73>n0Q8!Y>9Q_8?5G9Gi| z=^%fN-2z*xobZ`Rf=a3!m)rid@WV-Ldl>o_Ph-Us$N~Z^F2n^7K8TEh!lXNfI1K%z z-Me>Ke|E&_P!SNcDolI+Z1kBJ8|SH5(TpQPj^i1nSA=G?5m#g9+tCk5?j`E`j>g8 zS=YIImuYXN$nKU7cXoLFAMPfKG|^wMi8Ch)kNCqt0&u`oTbn&HhlYk8_bZ2Di1{_t z)u|e3euq=~DN|sXw-8|P>mTmFp`{9b)n%>ou8(cdH1qD~i8A$C2$~B_PHAS z7O(T~l3y^vx_oyy568b(8}G1aY+IFBeVN{G$F;p1dAR=7hNaGNI@^jue7N96{`ky{ z=X|ZB^<;4>pX+y(!sl9qkN^j;{Dvk`<@@{l?u(vVV3=M_`d6Yc*iSnYq~D$-89Y+< zB7QDuO^;5TDXeLJFwt8fULh6}{UDS7w$@?g$nUb@;r`Zy0U2V048~{EWnBIo7xxg1 z4~U9{ghX3+MI@zD)`wrp*czeeSw$|V6dLG87R0DH5>`vNx({FL80U<+kaW8obxlpz zdlMP(n04_3kJIM*zeg1Hf4qMmCWv z(J*N7^Bwytzcu(7dl5S?A)enG4n38G`;=Dk6I>&LpAVEwx44vo*6xd@GtS=$}VmQb-o-H+g|`Zf9pVUhQoI8J+_QBml=F zQ&CaTf3Kv5S+AZ_;4P*oPdTN_c7I3y;{i@mtEw@cm=#hD|6b- zdo$({cPdIq^>loD2EKUWxpO^V;3RZ~)%;75CxHO~-4F8we!0sMf&mL8&=1z6I48$w zs#I^T+SdE(IERx0pC?(!cg?)AY#%k9Xi2F=ox0nwpwRfRm4b2Rx39PV57 zp^wvtxKj8-+(Pw_%U3k{HHy3ZX~Er$g=&1}{V7xW-nQV>F*7qS9JC-q>d}Fk^bn|= z@wvY_XKB77r=rTw$@vwLnXUFBjfcW~mapa8ib{wx-UW~ucFWm!e@eG97IgiN8lgHc zN@aI#jooTA?}*ww#{>Zq8v?}nvDdgO zcw3Jj&g@6!xrgK3hg+$~f~uPw^{pjeUtb`}kMqt$*SEJO#$cw%U}#qc0z*@ilO+6Z zHsEBuc=1Ams0J&1;pXgs+uZ80yl)=%MtSzUyCm2|U`Zv>z{682;Ko_yg^ zR%~KP0a1?BT_>c2rEJK<>A8Z zZc$nD{l#2Ym*mPzWURV)|NiY1tGz(1uhKY!ZcG)<_*DmH?n4`3?Q|U4^Hh;_CFssC zF7$sG{sPu~ZEbDCsZK8vF5nOy2Dvo{nA^U-8X!sjj}M775ts zc68zSCU1A0^x=-z2ss(QX^emW$oEH(Nn!lNqhb7t@EqrIDF4W_;bi2=BKglq83adH zS3Lk%%KY#5fVwee0P6}8 z*|cqJ_F4R|`<^1>W}6@^BLMyE#oMIs4`i98IJ!i7UD&m*Zt50%4F16p zuR!5J<5A76JTqX<=@}-nZ7BkUCG>Q4|JL>7Z2Drf9-De)T(Fmj~@=Fn*&lY zM06}HHMumjShteYodX_pv_=*4orIbM!tf@u)uFxpk=iuEB@A*kDbcV~jzoC)_&gSa z8CzNYLVSD##9{%9NHECRc%Z+!y6cW`?3X^rA_@vI$K4qb9RL*ogNY`mf3*I>a*Evh znY^m{#ms;wp4+>$@4;FA1ql~GTeXLxBI7b1pPh;K!*2UR=b9c96LY#XWItDZ0AS_2 zs$uQ*V3m+a_oX;wcsZZ0h9ko`aq}SpZ=A@U;j3+t#m=&b(dLO7ZiGiA^+GiYsTiM& z84D=Z-Jd7iTz=9j40ia8zOJtB2q0a6(7@3>R!@kyGwGsa@~<2Uh|7>RZu#TIx@hyA zrP)_zK8NMj!-WQ9WaN-o zGrTvZ`bH;Ut{22rN*kM7DHQlN(sL?0K5I%3oqEx+hw0H??~7>jjf{-?l35HIJseF< z^TY$AkcZcR`8e|+CMJej`Li*_%8H68$((``x_lY;mTfxgFVrPY=cr$ZVqj+Ahteld zH=ZWDS$uvF9aEvWBNi)En+0I{d~d2uw{8>w|56FqfF@{{Y z!m_9gZ)&`bQrr5~Oxd*rwesLdfzHemdsgm*`96V%n$f7S&=}mV;6u9JjX#cST}?N; zMF8r%Iytp5WIzO;!{WYiqotGoS13>5y<%N(ulp2XCn$(@#Ku=UM#!b)AP`Y)=KA{$(a6hTAjyoPY+uaP5HL%FM%4;f3s6l8l3B$m`z&Kuw zWD&aEuLMp6{sv^Y61vIwQRPWVNvZ`32lI98Oic1+cz&U2s-92J2Hpxv!omU+jTaIeV?gHnt!n@T zA9ob}W!}6Q**n*;)eS-U99MhQ(%AMayu(AVgy95NRn~Ly;E6wTo#VJMR$43~nNytr z9oeEmGT6x?z~$+?q#T*i6!e%FNSQ~$+aXAko zqfKW7j`dXO`Q@clH%9gxP}AEn_$ELYt*op7&L7E_P3|}Ul|1j5F+ao3;iz%9KLxP) z$Td6-c5Bzj@{L=0LiE z-}S~!r3E1YL2#@ghAa-5*jFh<-$7xo1ht*OOv6~iQCFzmceb_bP(eqJ z1#(!TQ)72`bpjlvzkJpOgrQSTPEKflKnLk-YSQ?SZHOPfj|l{|v zmX{5ItkgdN`%!Aal@7eoyX2O;jhpj5jcDjpeWjR)1dcRGem&uhGTg@bTi>5vE&XBk zF&jnp?f!^C9^V5zQ+@yYbKp|0)>{TJhk?N*MoF4zXiN@%=D$3cn;IS_z4J`?tq#06 z&s(g@>7k#{*z9plXhmT7&^g&;vL%yOOnQc5aSExAyqq_GqczRrX3YFaeuR zuc=*%SvsZi*FZ~_US#m0*n(D^>&lV=%k7CdTpTtQJIZhEbnTyzE;>L4iBV6-*ib`o~pP# zHxT}2ZI89c>f+``!fM>%JS3Q$k+HuXJS7XmhYnQC799h_?Q#%$Gtg$$)m$q;3F{jn zzF}BIQb-~HWH=wUwmR@N?QW0T{V|8@G4!~EQS^goP70^>B%ysHCNXhz31h$@5EVmr zfgw#bH6nm0!Rn!t2>j3rM%&*M$GU9&{jipFL0H*8!5wAD$dB>Ws+76j@7wa~;nz{Q z%4NbYborQ=nE$AKad9|(cDNth0HfZH?wuDXW<6|wi5(pqLxm4IrcwCr6iw7Z&UGzu z8SsGr3-TCMlLAzJ9o<~zkj-QjC&CfFO#bNa-@lWA`0o^Cxw&=q6+qlTF?WO?(}@f=sd!mV_;~EpZ==O4aCT6f&+r z_#>J`aJHuh5l;gas+a=~P6Qs0SK7hRBN6hc{rOYvN_`+hdVh?C)vXIz$uo=G( zP53=)Q+*xZ*1O5Vp&}<{ohVWMP@?YZ>udQeAz$Da1i_<QHh-@2}@u8yZs zY`$Fd*4EZ;%VOybS3C4m#?As@=u^CAHjtA=sj0;Te@BbSLV4oz4Gldrd?KQ|UWT$_ zVBO~C2sK~8PD7#Jz_*EA5Vf*dYQ6`M>s{5dtOBh%k9P=q79poqqJ4|_U+5rbYL)5h z=AXvEaXkRm-lY|#E?>WMs`J?%&MDF?%M|u+2Iv&XF&A`q2|YbM0U|VrCE^_&88MpZ zO7uV5HtJj4#^zL^>~v(fssqP1pYd{Xu}1bN<7Wy=8y>Kd%3ma#PPzyI;CLR{c~OMX zDgtcK9V3Vy<>jq|_2YNjr=_LE5K7XcO!5ltl8iAJvF|rd^nMv-2q7G;;TEj-B|mD5 zxe2S0_liCafq{XMO=kAJ*(m^#G*dR4udo78B~LRoGU9l3yds~@wb0_fWQftI^SZEi zz`b?d;tRFV+AK{VwowhlCiVo^)!Ef?wgz3nZ&q2eH)VL6B~BUyaWqTbR=FL#wYRqi zYAO>2EZ_vb3E$^K;GJjr{OKuFEpXxc+!~UgQaH-_%1@;&!{98OKm@a-br653Mr}iw z=c49Qx|GX7bQB)nx(4u$2)S$kW&?Za=IScZ5Bmcbbm{2xcYNNIdFb^n7DA@9d(zDrOSnGF1%D>CY)`m39qhOkBZ z!v30f2|)z~TeDTx23|Y)t*x)4oFEtoFv!aVtX*$)bcR0j*VxWg1K)T1yp1JbO)c}m zH*6?2?J7#s12#rSWXf1zNkd21!%Wd=m)o|gv&}vVH?q^w(Gj%J{b?E3(jsgZ1%LGh zj7=Cof~cq{pyXNT=;+>6y}hDn5AXODRDkNc>n?;TCV@pqwv8xS)0!@SP(|e)>!amy zO&G6#+{z`o?&Rs?b7${=JNJU!9K>^gtr|v#N)2h{jINeeEr^urHMk`vCnLZ7MVdt4 z*p3Y^r#wVY|b&5FNg$v7l%ZDq7O^)H_=B_+k+;ZL&jX1}AmyHr2y zl?7PF$37dbf`S4l%s<;1tE#G+JcHX1K~y#VDzqi+P%O6*kx6>SV;)qUv+iftd+~`d z?3`G>4X?hwK8ApEw{9yl9Ym^R@+%BNAcDvs$Uz1|ngj#{(15em*w?f)f)!-C4c*%_ z;>K<6dr6ig`V8pW(ELb=R!>c~JMb)eSRpQwUE!3q z*mz!qi^hkRv_rhNW`n6LXS*7r!9oNog)XfDFfCV|EWkkzbVvCWM`rjw2n6au%Cf=j z;O1tpY;SL`!%V$iU`+PXsK3dI(B+9ktffOG>c;;`V(ETPko?SN3F_JWqx#P#Ly@Gyum9RQb<3~w} z{MC}D4DZlzZ3opO4jYFyx!6xw(qN25n|B^A!uRRi42K0;{h}3e*Sj7Oxf%;RLQ1uyt=e6hC6WnZLW0i1MR<*M_9o(hO$+4|z;3ZCV)_FsZ|H z<9cq9g8Fs^IsVh9YP$sjY;2R3SxEhp5opA4f)g@5^;JF{T%f;u)u6URz-hJdTiySF z-|2nZ1mO0uLE3iVQREM zYcf!c&qnv{4Tm+RiPF9_`u*{Rv?c^rSz#TA@0HzVQD#m#Y>jtGeKb;bSeqf%_C1{4 z7~7(XBh@{{coeD>W5oJ&=^BkzLp_2$+$c}~23@82(iC0q8_ z?(YKUWfy7eHd>pA*RM`WiDTnc^|R#@Ie2;3i;2brTM+KTuX?vKwL@z7o}%>y%zC6cq=R{?1GpxCDt0a zc!UT$=`OC~X*eG|y~A?V9Tmr0hZ#79_-llyM|^;+O7OQMK$V-TgjDPwN(r9WL?+KW6)L9H)kewMA%j)r^Y zr`Q;Dj-H^B@16CYUH=0?%lr&K94j(W^vpMFuY~L6b(+p8^!q!@5Mpox1g+uQ`@4X1 z;yATK;v@`CM>7!ANVF5$#t)=0jH*&w-^^Un@Hv&1@|}r4hkJYqi^~HG2NuEam7#Ks z^M!FempL24;~0;^a}0hVt7{#hdn^g#!h!E_+ioe!bIL9Uue;v2R8KtDJ~a~w?+E!V z7=ANi@{IeR#dOeBqjXHYASiH|&|NZN9KgV@^jK6$^(-%EWH4TD`xZXr5r&TY2BR`N z*+|mX+f3u#VO%YMlfK@pie=5c3QL}}_>HjU#KWaj)yh{Mr9eLVRRtXf|r$*hi& zQQTZ-@VUNoRE^A(*hFsXZI4oE_G=HhB#B2-Xb03I_g!}9xqHuYV9n|k0tuj+^C-A`)gER5zeRZ z)#Ch!Qk>)R0&sk4U$8u-l2fT&Hn-gVg>P?F#6%}^%XN7-c~P%ootyaKTcA}|Pu`Fz z`DNRQI3y6*ML`8hRKoScmXYJ*dOp`8p(8fzN!%5tuW60e^7*On9kJKUoA+O`OH#(o zG-yH6*}tVnmJ;{#)>M_Bz3=>n*BFD9%730NcUOR+j<9n48TMFE00r{+x=@blC65Fy ztEl&_VRr~ie-(Oa=h@gEKKr{lSv!)#Ub*PBGdYk=(Yrm{5U=gU@Paev+9s4aG$-;Y z+aG+hNPhSGIh8T5V`P4g><4dwoD5=Xxb61F+V_%eL?`220(sc4*kzRD zom9^tu>kKL^N^S4Ddz3%KdODG6*>DC7XU4F!EM#ochf3|Sgf+}MA=+b+YLDQ?Me5n z9>*LmC^_B$v~GR1@pRZXadnPvH6UxIInDlc`leNm+*RTy>=hXl97Q>O3a}iS$l9(L zv>J6IjI=-Ts`}^}wY3*{lzD3?p*1?6QfTdSOA~G;y_vI_Ht;Brw&pD*D-G+LiLF(jr>?7NBmbRn-cFFfXWVPYbI%Z_~0#kRu z`r-KH4#$CyX9zJX9Uv@r(UCIqt!SVnwfX2^H-p3a(CVvrF)2xq)$~{gCsu<7L=gh? z@*AZ%HCB%#4i1rYM>%ijtU`Lt<(lM9OWMZzvg%iY#%HQ=Ysubls34!T|I3(bQn)cb zz2ab`#012C7#6Xg_k7b~1d1UuTzu7Zhycb5=+Xch3Enu1AE)bhI6>wvy3@r?<;hdk zNZQ>VvO4l3O=3rh^E?6`zx*Ym-cqX9Pd8{e(57vs^J+##b9nihDw#A zm-ksr`a^c05~!r_K!n3ctY>uMp@P_L3AVNLBYBIh&@^G(`My)>QM0aUZ#$DQ;A z{54lw)azt7^$pz@Jifjytg;zRL3CksF{ID!xvJDQ&9d$*NYAZ<>N_J6GZJ_%^F^G) zkMPM=rb}K!q@eD;YC^>P{pWapy4cUTb>&jYj`O4XG^Q-?Sts>1)0($Rq;|SNKLdg3O-#JAuqcso=k%@VZecMxf%hV z76DNizCgj+m894S)B7(({gS@&i|4a}I>3&h>fD6dKZ+{^E2AB2^_vcB2-JFb56z)= zx|h@zq$-hXC>_O7`tT}0rRaDvjR?A2a3J@59Qm|Gaek?2Ww*~NP%j&7`|1@GI{2ts zX)GxtKa=z5Vi0(by`miQXvSq}{ik#zb4lN8D^Gcj%yjnPvO{Jy^YxQY;aeEwpXMqh zAyQ$Awh-@Jwe{661WhVJ4iTGOBm*0^n@R7;_VCv@2PU)&gc#(7g&byYwhOJFmkM1l z<9Y>G&#rn)2|K}CW`EGZTaS1Dv46$Y6oW7*)|A5DSs4}!y+MbekA zG(OkMXL%MYkML9$>8oI)YSGHI+Y{C;*3zCV_p z-dj1Nvd;F!@B;21(8Qu`?$?GkU4SLpv&%VQVWY8U+Zxnv$3y)8te^mRk^P_)A zDyrz@i8)A&Y;=9PeSZS1Pt&TfA;;mgBM0zq1=egf3*}v(*2uv}<1lp6@A4eUIKl_hT~YCZ~V`iW_5!ZyHY08q%4w+*ZAy~ZzIcI zmiE>Q7>@3ySPj)(gtz`;lrm&}k=9%BlIXGaY8EE`SK87u9y-V9ykC(Yh8#rWe#7t) z3T4C8LkgUn2`-Bnof0lCL~L(FoK5OJ#*mT8EsdNlchKOZ;*oc=9C4e6S6Yzrg*M@s z6jyyGeOxWg{dsTe8e6=F$ak6lF!o`{lKfOu5hGg`IJ+*Gaavdy2L!KP^P1|1~5Tb7Sy1qGb)?{C$E^OLnQGqSmp)l@`gs3g| zT!^O!Z8!v|gnHaWxK1yD+f<>wjLq4p&|IDVZ#X|=PFzEFEV!5t_0vE z7$jdQ#ng(A4pVhFBVaO=J3bvIhE5%wh{oweIa-J5fLjy@Sh8o==vy&3q6VWzi7{Q* z$LVg6dvatqKzi}1*yR-DeHP9rqiS5nlkxO~Kl++Gd)tO{j>w27z>M3IBc>><*Xkf< z69WFww!$}Qu%s8`kE$rCU+U^rvpi#_+!3JaR_vsSA>Dt3#_O@wYA@)SV*GD)a3XBl zvhC>V94WW%CPP;n%)cC8!qLUmsV<##_|rQgiGiJJfOhNlO^qy;fMJhc&i%-=`?@8a z-Z@y$?6;hk{Plt}C$AOemn;H~BjNccUmPBq_$%?xQDaHw1+VO^ZV)5YFF7JjJ2=xq zh2`hh92MFB;;0SFD~Idyx@2;={5V`>9f07wF zRc`#YH1KM1R4Xmj|DJywC%_7BzabiJ{06W0h$tGMAH_m#s zMOQ|TW$v2sD4y>3aSCw{|1Bev`cwCd$GY{dl^n%;W=1P!zR-m*{e=v7zuO?}tZ#%2 z#UFs7Dda~@lZCawN(E7t*WA$X`+;M|bWPdZrJzn86UDm?Qk+BrY1WL+LZP-+pr=McuOK&AJ*cW;LAL*z?y;y zZr|d1jUMm}C)*+$s}7hiMgiq4@A9=fYLjbUa+}k3o8hE+0o{0KPD)2}5Qg&z?aDQo zzQ(sN^!M0W96|3p`po`rwm5}YMxuiv6P|_q&{4ejwGjL^9gtQpv|dLAlHQJx(PJZE zY-Z=44McAMV^f6kV#s=K_mpM7c(9Hjy|MY|x5VJ0NJ9I{_8_pCAU*}M8iRs0@?*MY z@;|Y#3k-LKKVKL|0#T zi%wM&BcbTWWpgD^7w=6ozSo*kU3XzL`*1hDAfK;2c@DQB^mE8`)Ph_YK8FTj7<;Ae z>2};VEoxN7gitgMl(ZSYU0;(PVskFU)JHq6-6H4G$;~B%I!7MIotKU6Sg(42kuXw= z+5Rd4T0qk*|E;6qsXGO}0Q|@goDL==0AU32K%if-D|~$fn-XTE{+5Q5`vPC~2zdt| zOBBGhvx}ZCDRgp4=BSJxZ48Vg#9}%t17B}eqwbLTfmR%?=0=#&y~~uA(S0@=u+za1 zE}e0pO#zt(5wF+iQiZ<67--M#h1i&}cDZwaF#5xro)VLCb_0S} zj*0V~mDsxn3n0NUQ_%8Tuts7`#d@F%hYU%WpyK0|Jb;IRH5d>tKrjr@e~%5aE*Tb& z8eE2fH@$AYcJwUAhPd{2MNG}jr!{6T3Z7Ayp%d}^MbzU{oivKtdArAOm^CDHDq;JJ zX)&UFpD4~7tBjI>Cz3~s^exQaiRot>;uU@rl0Eg*%S=9Gr zA-gvGq|#uI-H?(mv<<{e)CVV?bqkgD%5d&ZfXJH})VWKOnm7I+Z3i%1b|o~A%$(pP zqbbqmqAi}gx#>4BQPvM4zT}1pPfS8%Hi0K!m?L7NggPxjB zAAC^!%2w94E9bKJFf%&iN8{3VC;cUGjfK$mzOgVgR@5y2$xP}MShN{XANc-y)&l8- zSSsP6_WO(M8ffma>YFqpBGEPh#up;CvV&=ZGtWY~XQqt(?huX4P`^#vjIr{DW}Hry6mySqqs8yRyTc^fP;M!jx3 za1@@{AsBN*gI$)hjR*_%(r{s4sQ`nZBIPQI(%9lm2Zjg^K&&@d9&k-{u65fO9FDn6+LWHtGDe`0i_wh{}4{+<{vs^P@REbWq zE~;p{6kJDY-kV55*(U;)5z?c#G{`AuX@9)8Dir51s3;z@ z`1Yy8Yv9MBeNai2A>mZOj^|Jti7f?WwkN41QkSeZ$>_Lc6h_Bcx^rM{LMBd!b>bncoUhoBKFfg z=AHck_k`f{QC7-eeAk1zt!j-e-M^_{vU>M7Dy5faE%+w3oam=42h8>LEmhUi^_khK z_~%(N01nrodj$eg^wRi}Soqi$!ZQQPNW4#W$s<8Yf0SG#4UGlsm`!~qc) zN`-L~48#->0jMU0EJ1n0N6LjNm|2Vm>3Ks6$^|~=#lN3>lw`gsU~cyN!FMa8HM)Pr zO9)cD`+DDPS-aBuoDYG^0^9=-N|)2hO281MrDBfbFl9X<5~Wl?;|E+{Xs91@hus^V z(WKU%{G0p}M{*)Ap7u*<()AaNiTR zC-vT0&-ttR+$)_Wa2maF&Xbu^_;%TY&rt%Hi0c{m6^ARfl_E4A#8fJpyZkX%id2J` z;6SySfMeRarW`Ie%l!t6Pb=u_om$Qp zYr@OvQaL+Sx|a*LWm_@H-QPTnJX#eoRN27=jeiCX>-);^e(bRl$ZG_kOfW)$DG}4% zysr^3|8%pf;HytxW{3MHjckp{mQ!M?x<%jbvcGj_?+JWNeBnHwtIBf|czJ8}!NmPB z12uDfkjV_xR3UezA`!D3W?Ur@dra8tXNe^5vAODf`y6-6waG?Mqy`5ZB3VX)N5|N) z#RnY@w-U&*1u$3vSK>Pg^OzxBJ60~~um*;-!Td4$818dFJkc5}At<#IK_snl`~ zeY+wXgon`*F1{Osi2^ZX0H@ZFA2=<0YXTco+UvAHaDCk(@|$81cpTb2WTnKe!BNsp z^<=f%?0b(GkHf4ls?Tm3wKGS^K%)Cw=v-U=7wRIT40yU8K5Cj+#x2=fm;hUF zasx_~6$m~pH?OmVc0Ao3XS&%(?$5)kh&l0*e~AA2CnF$*6`(7`sB}^+S^xDd&&Wc+ zHrNbr(G;k)9Iw(DfkvLXF|atoYP+%GM7Kfp<1Ziqtt7OG{5@Z2q}xMx*!8a}r%3L(K^t4-EtVHH{LVtw1|JXPUE4yatiNvFzkk%vB)Rq~ z)OU&1wD?PTF73fwV4neZ;>K~?VHR~ThG_U`)@&DjDt6EJ)kM4(A-Nq+1z2I|!|B}acI$Bb;^v&O+dlnOA+#7D^ z7R3>%Q#KGXj0mQk9sl80+_U&jTG+Id+BP}on81D*L8qJGr6AAa$?kG6U52!7l4BRN zkmAab;i=HGL_cdQs4n13oz#5NQnMA*$R+g)e2_y+CS)Hg7V2$dz}bxzKMf|abf zN@*RDa(*Fy7@{S2?DPhAg%%EEJA=H$iAJ=~TU;SIU(bd^Xbd$Giatz4xl3uKO!dbt zC=t`d5`KNqfDB(lTgWPv8wgKb+tb1iO@i>~0)Nlmtj+1ONcC}R9>k0{y3a7;`nmk6 zApwcdZ}%w`>Q34R1AozYxId=SpFL?2o1=Fn%)xl|xq?_SR+e&b<-kBF1fmEJi1YRM ziNBwp^o(X}9V}qarr$=X^LBi1umc`GR>7-X?$oPj3MYdzIDkTd_`T+S{ZEYYIU@Tw zp3v0%bi4IacN7q2;eH>?NG;UFV?ydf+H4G|uwG*}iO z0{z-ONRbM%?MJ(zcK9dQR9k!$9Zg^JDfUsEcm#|lWSDp*2oX}xB!ke|$psn42EBrE zxoLc$LqS0;NWA<%_*UddimntH9ulAcsQ67;>FGL}$>1(A!2RuMalp|2sv3 zZmlb~Pl*UfplkA^oINKOOf9<)gnS?Y#7aIb0b=dYlI;H%*E=q^;+s(WYT^O8Y63JX zo>yJ$LG?vI`vvF&77Y>M-Y(ehY;It{e4W-wJY;YpOz z)Px(3f1xA2#-!pJQH4XQ_dWSH;XkgTQ!TkEqA@ zsuph&u~s8$pNz#)z8(r=2kF>>3|>|GM5HSbbE~2wo>RxM&8oEV5+CoT1%@ZvGx#Ii zA1m(nf9Vvj{%Ccf!UfC@eVe0RNIi&`pZS4OIRZ9QgnYH%=6QZ^p9AzzfDW%q?I`kW4wmcq0)tI?~Q znwr`|A0;D}&wqy2q!9L<&1^9Z;E>a>4EA6Xw==iuoXya6Rouot7C6}h74-qBx&_6b>TLx*o*o|knS!?^HH#6kv0FTMUg%9kW+?HvIhQ6;RW&t7fXuws z6-`A&rEyoa#WUE`XSGkig}BFq_tJY3;V~jLy2RVRsJY^^z{MlWlx5m6SKLbH&|t@h zobUv{zVAbr&bMoi{+>iJYsSXLevh|HLus6{`6`I>3IKl{%kuKT$rKh9?EyZLWHdn) zU~&R_9H?JCX$+wIATU%j<(_dp{n1^5)2&LtJok5J*zz6>5vobYv^0U;$A~pKJ((1V zWxjGPB23J3mz_~i-uUe4Q=>H`qGxVDT30NqW&!aER2;2>a?pc=HmN8Tg%!pZ zk=$7FR7E_Z?^MIJw+FTpRA^`l$izbLy8Z9E0lCJMEmaRBZZpAQ5TSb>K_#0M1&T@l z84wh5^$iT*jI&ZkO;uZ|)Vy$FVTi{CFb&re4pc!kVN%S#Q}KUI zyXou}F|o10Azl74Ob#d2ed?pFJ<}CU2xSD%&b}MCc8{Zc)#W<5_a`M>?fXxQXf!0I zHfEENxEt%@D~2L{th@v-Z|^d_h6}uws}RtWLPZetXaSlFs1E={B|!1iuXicT&zHDz z{zbR2ULLRhB`YojHHR%xFVckrK})Z-n5<+bZ zv!y@nFEDSESjcN`98hwYu(~6VxI>9+5YFN8f)#{Y3(v_M*EdS+4lfOTMHYsMNG497 zC@Cokc-l_qyAz-`7+{b`6eiJt?%}<2K%oKz&FL0@f8QpYWGt1scn;H#W78Hm<*MJ> zX8dsYV1FX;2WiXimX-I$=Y9F0b=EfZ6b`OftK4{_HxY1pJrpsPmjLl*nRVUi8q^LL zo0x#gm^v_jaKx-R2*_HZUp38wVP4USv3gXWj%!l--50_w2@W%zz~?ek<=<+zyBf11 z=$)XlGu)`%*z)#DH1u% z-2Ya^H!1Ou>P8Y&t|E~6-ki+<{x+!TINIHfuzY$PFK*v_ZLT>58D3D9QKz5y0O~Gd zNd``Re0`fFDUMOyx~%8Uo?3xSzuI?YQ>L;$$=!OtSiqM;*Khd_FhzW&2@~E`K-w>C&#`Newb=` za8*&k%Ebv#2SB9wcmZ)~eSLkUJ?sc@NpCL>05>?$7x?I@dJ|iam135nR&6& zVo1}#7trmfeaI4jQ@v;Xj@g$Ww&ggee^K6>!}h2P|QrKE6)83t==h|H91Qsde$1)imba`q*gedvV4p_p0IB z6Y5-MBXtYudv#+=%tdS$Cno|yuQOl)zAAhM9M0CEFk(i?9H2KVr!3gK`me+SH^`~Kqzacs?bq)<-nHsIr4xE-~M-t zF>Uktm45^)>SO=3%C4ty<7l9X!_?!c?=MpUuYl| zZdEl4mf-IG$Y0oXH(?pXew2E9KAXjvWYDzG?(w4#i|rdCwxvt!pwaRFPJ4+E3$jQ+ zWq~4>maEmspl9eB^oedIn5{4?D4;jG#9mN%Momq9xYXhgP931Y0}6IQGHch~tm~yB z0a96^WSLU5KHUXcfpKH|Q{ez^Y+uwuzJc!w*e2=6u7J_V#dVRWshoOq+Dv$<{ zRsMk&B3kZq{fE`0i%7`F1DF`Vz87HG)RX3O~9%}kVaFM{aLl@@_5m|$OK$k>` z&f6p};#K6pXCS-`@HfPtFYPoT)e!qC8`y*(Lr zB)8fool1SAizE=skD2Nai99X`BIT5ouy1VpG*}ysIX9uct_~EbZ-Z(ibae1{BL+)3 zVId%gLNj8?0YK9{D7OS6Iy*ZXEbNsrDvv3w#|wnY=7&iqBV4h+5$nebSQXb$&P6Ew z^zcx~@9qjzVMM(YUhL`V@p}r}Dx58WF#HBkSV28ocQm0pC<=04^5y2|*D>r`ttv@N zzjf8#Qg6rOm-kcNe<6;*7a9|K|9El8LHnKI;K@~8&1JNCTtIEMI3@XS<_{4Bx?PZ5 zWmYy)tk)_V;sy-VX>2e5ydkb){Gv{$3a`Y`^ +G75`Z?fF`gw33?S^N+seJHB;W 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 + + + + + + {%- block head_title -%}Bluesky{%- endblock -%} + + + {% block head_bundle -%}{%- endblock %} + + + + {% block head_page_meta -%} + + + + + + + + + {%- endblock %} + + + + + {% block head_metadata %}{% endblock %} + + +{%- block body_all %} +
+
+{% endblock -%} + + diff --git a/bskyweb/templates/error.html b/bskyweb/templates/error.html new file mode 100644 index 00000000..e40d8c4a --- /dev/null +++ b/bskyweb/templates/error.html @@ -0,0 +1,15 @@ +{% extends "base.html" %} + +{% block head_title %}Error {{ statusCode }} - Bluesky{% endblock %} + +{# don't include the bundle on error pages #} +{% block head_bundle %}{% endblock %} + +{% block body_all %} + {% if statusCode == 404 %} +

404: Not Found

+ {% else %} +

{{ statusCode }}: Server Error

+

Sorry about that! Our Status Page might have more context. + {% endif %} +{% endblock %} diff --git a/bskyweb/templates/home.html b/bskyweb/templates/home.html new file mode 100644 index 00000000..631f281c --- /dev/null +++ b/bskyweb/templates/home.html @@ -0,0 +1,7 @@ +{% extends "base.html" %} + +{% block head_title %}Bluesky{% endblock %} + +{% block noscript_extra %} +

This is the home page. +{% endblock %} diff --git a/bskyweb/templates/post.html b/bskyweb/templates/post.html new file mode 100644 index 00000000..a24f64ab --- /dev/null +++ b/bskyweb/templates/post.html @@ -0,0 +1,25 @@ +{% extends "base.html" %} + +{% block head_page_meta -%} + +{%- if postView -%} + + + {%- if postView.Author.DisplayName -%} + + + {%- else -%} + + + {%- endif -%} + {%- if postView.Record.Text -%} + + + {%- endif -%} +{%- endif -%} +{%- endblock %} + +{% block noscript_extra -%} +

{{ postView.Author.DisplayName }} / {{ postView.Author.Handle }} +

{{ postView.Record.Text }} +{%- endblock %} diff --git a/bskyweb/templates/profile.html b/bskyweb/templates/profile.html new file mode 100644 index 00000000..260f211a --- /dev/null +++ b/bskyweb/templates/profile.html @@ -0,0 +1,25 @@ +{% extends "base.html" %} + +{% block head_page_meta -%} + +{%- if profileView -%} + + + {%- if profileView.DisplayName -%} + + + {%- else -%} + + + {%- endif -%} + + {%- if profileView.Avatar -%} + + {%- endif -%} +{%- endif -%} +{%- endblock %} + +{% block noscript_extra -%} +

{{ profileView.DisplayName }} / {{ profileView.Handle }} +

{{ profileView.Description }} +{%- endblock %}