this repo has no description
3
fork

Configure Feed

Select the types of activity you want to include in your feed.

basic service setup

+438
+45
Makefile
··· 1 + 2 + SHELL = /bin/bash 3 + .SHELLFLAGS = -o pipefail -c 4 + 5 + .PHONY: help 6 + help: ## Print info about all commands 7 + @echo "Commands:" 8 + @echo 9 + @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[01;32m%-20s\033[0m %s\n", $$1, $$2}' 10 + 11 + .PHONY: build 12 + build: ## Build all executables 13 + go build ./cmd/atbin 14 + 15 + .PHONY: all 16 + all: build 17 + 18 + .PHONY: test 19 + test: ## Run tests 20 + go test ./... 21 + 22 + .PHONY: coverage-html 23 + coverage-html: ## Generate test coverage report and open in browser 24 + go test ./... -coverpkg=./... -coverprofile=test-coverage.out 25 + go tool cover -html=test-coverage.out 26 + 27 + .PHONY: lint 28 + lint: ## Verify code style and run static checks 29 + go vet ./... 30 + test -z $(gofmt -l ./...) 31 + 32 + .PHONY: fmt 33 + fmt: ## Run syntax re-formatting (modify in place) 34 + go fmt ./... 35 + 36 + .PHONY: check 37 + check: ## Compile everything, checking syntax (does not output binaries) 38 + go build ./... 39 + 40 + .env: 41 + if [ ! -f ".env" ]; then cp example.dev.env .env; fi 42 + 43 + .PHONY: run-dev-atbin 44 + run-dev-atbin: .env ## Runs 'atbin' daemon for local dev 45 + GOLOG_LOG_LEVEL=info go run ./cmd/atbin serve
+19
cmd/atbin/handlers.go
··· 1 + package main 2 + 3 + import ( 4 + "github.com/labstack/echo/v4" 5 + ) 6 + 7 + type GenericStatus struct { 8 + Daemon string `json:"daemon"` 9 + Status string `json:"status"` 10 + Message string `json:"msg,omitempty"` 11 + } 12 + 13 + func (s *Server) HandleHealthCheck(c echo.Context) error { 14 + return c.JSON(200, GenericStatus{Status: "ok", Daemon: "bluepages"}) 15 + } 16 + 17 + func (srv *Server) WebHome(c echo.Context) error { 18 + return c.String(200, `atbin.dev`) 19 + }
+92
cmd/atbin/main.go
··· 1 + package main 2 + 3 + import ( 4 + "fmt" 5 + "io" 6 + "log/slog" 7 + "os" 8 + "strings" 9 + 10 + "github.com/carlmjohnson/versioninfo" 11 + "github.com/urfave/cli/v2" 12 + 13 + _ "github.com/joho/godotenv/autoload" 14 + ) 15 + 16 + func main() { 17 + if err := run(os.Args); err != nil { 18 + slog.Error("exiting", "err", err) 19 + os.Exit(-1) 20 + } 21 + } 22 + 23 + func run(args []string) error { 24 + 25 + app := cli.App{ 26 + Name: "atbin", 27 + Usage: "atbin server daemon", 28 + Version: versioninfo.Short(), 29 + Flags: []cli.Flag{ 30 + &cli.StringFlag{ 31 + Name: "log-level", 32 + Usage: "log verbosity level (eg: warn, info, debug)", 33 + EnvVars: []string{"ATBIN_LOG_LEVEL", "GO_LOG_LEVEL", "LOG_LEVEL"}, 34 + }, 35 + }, 36 + Commands: []*cli.Command{ 37 + &cli.Command{ 38 + Name: "serve", 39 + Usage: "run the atbin daemon", 40 + Action: runServeCmd, 41 + Flags: []cli.Flag{ 42 + &cli.StringFlag{ 43 + Name: "bind", 44 + Usage: "specify the local IP/port to bind to", 45 + Required: false, 46 + Value: ":7700", 47 + EnvVars: []string{"ATBIN_BIND"}, 48 + }, 49 + }, 50 + }, 51 + }, 52 + } 53 + 54 + return app.Run(args) 55 + } 56 + 57 + func configLogger(cctx *cli.Context, writer io.Writer) *slog.Logger { 58 + var level slog.Level 59 + switch strings.ToLower(cctx.String("log-level")) { 60 + case "error": 61 + level = slog.LevelError 62 + case "warn": 63 + level = slog.LevelWarn 64 + case "info": 65 + level = slog.LevelInfo 66 + case "debug": 67 + level = slog.LevelDebug 68 + default: 69 + level = slog.LevelInfo 70 + } 71 + logger := slog.New(slog.NewJSONHandler(writer, &slog.HandlerOptions{ 72 + Level: level, 73 + })) 74 + slog.SetDefault(logger) 75 + return logger 76 + } 77 + 78 + func runServeCmd(cctx *cli.Context) error { 79 + logger := configLogger(cctx, os.Stdout) 80 + 81 + srv, err := NewServer( 82 + Config{ 83 + Logger: logger, 84 + Bind: cctx.String("bind"), 85 + }, 86 + ) 87 + if err != nil { 88 + return fmt.Errorf("failed to construct server: %v", err) 89 + } 90 + 91 + return srv.Run() 92 + }
+143
cmd/atbin/server.go
··· 1 + package main 2 + 3 + import ( 4 + "context" 5 + "errors" 6 + "fmt" 7 + "log/slog" 8 + "net/http" 9 + "os" 10 + "os/signal" 11 + "syscall" 12 + "time" 13 + 14 + "github.com/labstack/echo/v4" 15 + "github.com/labstack/echo/v4/middleware" 16 + slogecho "github.com/samber/slog-echo" 17 + ) 18 + 19 + type Server struct { 20 + echo *echo.Echo 21 + httpd *http.Server 22 + logger *slog.Logger 23 + } 24 + 25 + type Config struct { 26 + Logger *slog.Logger 27 + Bind string 28 + } 29 + 30 + func NewServer(config Config) (*Server, error) { 31 + logger := config.Logger 32 + if logger == nil { 33 + logger = slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ 34 + Level: slog.LevelInfo, 35 + })) 36 + } 37 + 38 + e := echo.New() 39 + 40 + // httpd 41 + var ( 42 + httpTimeout = 1 * time.Minute 43 + httpMaxHeaderBytes = 1 * (1024 * 1024) 44 + ) 45 + 46 + srv := &Server{ 47 + echo: e, 48 + logger: logger, 49 + } 50 + 51 + srv.httpd = &http.Server{ 52 + Handler: srv, 53 + Addr: config.Bind, 54 + WriteTimeout: httpTimeout, 55 + ReadTimeout: httpTimeout, 56 + MaxHeaderBytes: httpMaxHeaderBytes, 57 + } 58 + 59 + e.HideBanner = true 60 + e.Use(slogecho.New(logger)) 61 + e.Use(middleware.Recover()) 62 + e.Use(middleware.BodyLimit("4M")) 63 + e.HTTPErrorHandler = srv.errorHandler 64 + e.Use(middleware.SecureWithConfig(middleware.SecureConfig{ 65 + ContentTypeNosniff: "nosniff", 66 + XFrameOptions: "SAMEORIGIN", 67 + HSTSMaxAge: 31536000, // 365 days 68 + // TODO: 69 + // ContentSecurityPolicy 70 + // XSSProtection 71 + })) 72 + 73 + e.GET("/", srv.WebHome) 74 + e.GET("/_health", srv.HandleHealthCheck) 75 + 76 + // XXX 77 + return srv, nil 78 + } 79 + 80 + func (srv *Server) ServeHTTP(rw http.ResponseWriter, req *http.Request) { 81 + srv.echo.ServeHTTP(rw, req) 82 + } 83 + 84 + func (srv *Server) Run() error { 85 + srv.logger.Info("starting server", "bind", srv.httpd.Addr) 86 + go func() { 87 + if err := srv.httpd.ListenAndServe(); err != nil { 88 + if !errors.Is(err, http.ErrServerClosed) { 89 + srv.logger.Error("HTTP server shutting down unexpectedly", "err", err) 90 + } 91 + } 92 + }() 93 + 94 + // Wait for a signal to exit. 95 + srv.logger.Info("registering OS exit signal handler") 96 + quit := make(chan struct{}) 97 + exitSignals := make(chan os.Signal, 1) 98 + signal.Notify(exitSignals, syscall.SIGINT, syscall.SIGTERM) 99 + go func() { 100 + sig := <-exitSignals 101 + srv.logger.Info("received OS exit signal", "signal", sig) 102 + 103 + // Shut down the HTTP server 104 + if err := srv.Shutdown(); err != nil { 105 + srv.logger.Error("HTTP server shutdown error", "err", err) 106 + } 107 + 108 + // Trigger the return that causes an exit. 109 + close(quit) 110 + }() 111 + <-quit 112 + srv.logger.Info("graceful shutdown complete") 113 + return nil 114 + } 115 + 116 + func (srv *Server) Shutdown() error { 117 + srv.logger.Info("shutting down") 118 + 119 + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) 120 + defer cancel() 121 + 122 + return srv.httpd.Shutdown(ctx) 123 + } 124 + 125 + type GenericError struct { 126 + Error string `json:"error"` 127 + Message string `json:"message"` 128 + } 129 + 130 + func (srv *Server) errorHandler(err error, c echo.Context) { 131 + code := http.StatusInternalServerError 132 + var errorMessage string 133 + if he, ok := err.(*echo.HTTPError); ok { 134 + code = he.Code 135 + errorMessage = fmt.Sprintf("%s", he.Message) 136 + } 137 + if code >= 500 { 138 + srv.logger.Warn("atbin-http-internal-error", "err", err) 139 + } 140 + if !c.Response().Committed { 141 + c.JSON(code, GenericError{Error: "InternalError", Message: errorMessage}) 142 + } 143 + }
example.dev.env

This is a binary file and will not be displayed.

+46
go.mod
··· 1 + module github.com/bluesky-social/atbin 2 + 3 + go 1.24.0 4 + 5 + require ( 6 + github.com/bluesky-social/indigo v0.0.0-20250324192039-40f397713b63 7 + github.com/carlmjohnson/versioninfo v0.22.5 8 + github.com/joho/godotenv v1.5.1 9 + github.com/labstack/echo/v4 v4.13.3 10 + github.com/prometheus/client_golang v1.21.1 11 + github.com/redis/go-redis/v9 v9.7.3 12 + github.com/samber/slog-echo v1.16.1 13 + github.com/urfave/cli/v2 v2.27.6 14 + golang.org/x/time v0.11.0 15 + ) 16 + 17 + require ( 18 + github.com/beorn7/perks v1.0.1 // indirect 19 + github.com/cespare/xxhash/v2 v2.3.0 // indirect 20 + github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect 21 + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect 22 + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect 23 + github.com/klauspost/compress v1.17.11 // indirect 24 + github.com/labstack/gommon v0.4.2 // indirect 25 + github.com/mattn/go-colorable v0.1.13 // indirect 26 + github.com/mattn/go-isatty v0.0.20 // indirect 27 + github.com/mr-tron/base58 v1.2.0 // indirect 28 + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect 29 + github.com/prometheus/client_model v0.6.1 // indirect 30 + github.com/prometheus/common v0.62.0 // indirect 31 + github.com/prometheus/procfs v0.15.1 // indirect 32 + github.com/russross/blackfriday/v2 v2.1.0 // indirect 33 + github.com/samber/lo v1.49.1 // indirect 34 + github.com/valyala/bytebufferpool v1.0.0 // indirect 35 + github.com/valyala/fasttemplate v1.2.2 // indirect 36 + github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect 37 + gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b // indirect 38 + gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 // indirect 39 + go.opentelemetry.io/otel v1.29.0 // indirect 40 + go.opentelemetry.io/otel/trace v1.29.0 // indirect 41 + golang.org/x/crypto v0.31.0 // indirect 42 + golang.org/x/net v0.33.0 // indirect 43 + golang.org/x/sys v0.28.0 // indirect 44 + golang.org/x/text v0.21.0 // indirect 45 + google.golang.org/protobuf v1.36.1 // indirect 46 + )
+93
go.sum
··· 1 + github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= 2 + github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= 3 + github.com/bluesky-social/indigo v0.0.0-20250324192039-40f397713b63 h1:0ohcaD0jwrEgMrPb87f3kL5n1OaIGuBqXdlE7iO3s6M= 4 + github.com/bluesky-social/indigo v0.0.0-20250324192039-40f397713b63/go.mod h1:NVBwZvbBSa93kfyweAmKwOLYawdVHdwZ9s+GZtBBVLA= 5 + github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= 6 + github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= 7 + github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= 8 + github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= 9 + github.com/carlmjohnson/versioninfo v0.22.5 h1:O00sjOLUAFxYQjlN/bzYTuZiS0y6fWDQjMRvwtKgwwc= 10 + github.com/carlmjohnson/versioninfo v0.22.5/go.mod h1:QT9mph3wcVfISUKd0i9sZfVrPviHuSF+cUtLjm2WSf8= 11 + github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= 12 + github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 13 + github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc= 14 + github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= 15 + github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 16 + github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 17 + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= 18 + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= 19 + github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= 20 + github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 21 + github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= 22 + github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= 23 + github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= 24 + github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= 25 + github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= 26 + github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= 27 + github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= 28 + github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= 29 + github.com/labstack/echo/v4 v4.13.3 h1:pwhpCPrTl5qry5HRdM5FwdXnhXSLSY+WE+YQSeCaafY= 30 + github.com/labstack/echo/v4 v4.13.3/go.mod h1:o90YNEeQWjDozo584l7AwhJMHN0bOC4tAfg+Xox9q5g= 31 + github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= 32 + github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU= 33 + github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= 34 + github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= 35 + github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 36 + github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= 37 + github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 38 + github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= 39 + github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= 40 + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= 41 + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= 42 + github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 43 + github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 44 + github.com/prometheus/client_golang v1.21.1 h1:DOvXXTqVzvkIewV/CDPFdejpMCGeMcbGCQ8YOmu+Ibk= 45 + github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= 46 + github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= 47 + github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= 48 + github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= 49 + github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= 50 + github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= 51 + github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= 52 + github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM= 53 + github.com/redis/go-redis/v9 v9.7.3/go.mod h1:bGUrSggJ9X9GUmZpZNEOQKaANxSGgOEBRltRTZHSvrA= 54 + github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= 55 + github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 56 + github.com/samber/lo v1.49.1 h1:4BIFyVfuQSEpluc7Fua+j1NolZHiEHEpaSEKdsH0tew= 57 + github.com/samber/lo v1.49.1/go.mod h1:dO6KHFzUKXgP8LDhU0oI8d2hekjXnGOu0DB8Jecxd6o= 58 + github.com/samber/slog-echo v1.16.1 h1:5Q5IUROkFqKcu/qJM/13AP1d3gd1RS+Q/4EvKQU1fuo= 59 + github.com/samber/slog-echo v1.16.1/go.mod h1:f+B3WR06saRXcaGRZ/I/UPCECDPqTUqadRIf7TmyRhI= 60 + github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= 61 + github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 62 + github.com/urfave/cli/v2 v2.27.6 h1:VdRdS98FNhKZ8/Az8B7MTyGQmpIr36O1EHybx/LaZ4g= 63 + github.com/urfave/cli/v2 v2.27.6/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ= 64 + github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= 65 + github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= 66 + github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= 67 + github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= 68 + github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4= 69 + github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= 70 + gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b h1:CzigHMRySiX3drau9C6Q5CAbNIApmLdat5jPMqChvDA= 71 + gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b/go.mod h1:/y/V339mxv2sZmYYR64O07VuCpdNZqCTwO8ZcouTMI8= 72 + gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 h1:qwDnMxjkyLmAFgcfgTnfJrmYKWhHnci3GjDqcZp1M3Q= 73 + gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02/go.mod h1:JTnUj0mpYiAsuZLmKjTx/ex3AtMowcCgnE7YNyCEP0I= 74 + go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= 75 + go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= 76 + go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= 77 + go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= 78 + golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= 79 + golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= 80 + golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= 81 + golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= 82 + golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 83 + golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 84 + golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= 85 + golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 86 + golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= 87 + golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= 88 + golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= 89 + golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= 90 + google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk= 91 + google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= 92 + gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 93 + gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=